diff --git a/.depend b/.depend index e32fed24b2d..6d604ae8c21 100644 --- a/.depend +++ b/.depend @@ -29,6 +29,7 @@ utils/ccomp.cmx : \ utils/ccomp.cmi utils/ccomp.cmi : utils/clflags.cmo : \ + utils/zero_alloc_annotations.cmi \ utils/profile.cmi \ utils/numbers.cmi \ utils/misc.cmi \ @@ -36,6 +37,7 @@ utils/clflags.cmo : \ utils/arg_helper.cmi \ utils/clflags.cmi utils/clflags.cmx : \ + utils/zero_alloc_annotations.cmx \ utils/profile.cmx \ utils/numbers.cmx \ utils/misc.cmx \ @@ -43,8 +45,26 @@ utils/clflags.cmx : \ utils/arg_helper.cmx \ utils/clflags.cmi utils/clflags.cmi : \ + utils/zero_alloc_annotations.cmi \ utils/profile.cmi \ utils/misc.cmi +utils/compilation_unit.cmo : \ + utils/misc.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + utils/identifiable.cmi \ + typing/ident.cmi \ + utils/clflags.cmi \ + utils/compilation_unit.cmi +utils/compilation_unit.cmx : \ + utils/misc.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + utils/identifiable.cmx \ + typing/ident.cmx \ + utils/clflags.cmx \ + utils/compilation_unit.cmi +utils/compilation_unit.cmi : \ + utils/identifiable.cmi \ + typing/ident.cmi utils/config.common.cmo : utils/config.common.cmx : utils/config.fixed.cmo : @@ -74,6 +94,13 @@ utils/consistbl.cmx : \ utils/consistbl.cmi utils/consistbl.cmi : \ utils/misc.cmi +utils/debug.cmo : \ + utils/clflags.cmi \ + utils/debug.cmi +utils/debug.cmx : \ + utils/clflags.cmx \ + utils/debug.cmi +utils/debug.cmi : utils/diffing.cmo : \ utils/misc.cmi \ utils/diffing.cmi @@ -104,25 +131,62 @@ utils/identifiable.cmx : \ utils/misc.cmx \ utils/identifiable.cmi utils/identifiable.cmi : +utils/import_info.cmo : \ + utils/misc.cmi \ + utils/compilation_unit.cmi \ + utils/import_info.cmi +utils/import_info.cmx : \ + utils/misc.cmx \ + utils/compilation_unit.cmx \ + utils/import_info.cmi +utils/import_info.cmi : \ + utils/compilation_unit.cmi utils/int_replace_polymorphic_compare.cmo : \ utils/int_replace_polymorphic_compare.cmi utils/int_replace_polymorphic_compare.cmx : \ utils/int_replace_polymorphic_compare.cmi utils/int_replace_polymorphic_compare.cmi : +utils/language_extension.cmo : \ + utils/misc.cmi \ + utils/language_extension_kernel.cmi \ + utils/language_extension.cmi +utils/language_extension.cmx : \ + utils/misc.cmx \ + utils/language_extension_kernel.cmx \ + utils/language_extension.cmi +utils/language_extension.cmi : \ + utils/language_extension_kernel.cmi +utils/language_extension_kernel.cmo : \ + utils/language_extension_kernel.cmi +utils/language_extension_kernel.cmx : \ + utils/language_extension_kernel.cmi +utils/language_extension_kernel.cmi : utils/lazy_backtrack.cmo : \ utils/lazy_backtrack.cmi utils/lazy_backtrack.cmx : \ utils/lazy_backtrack.cmi utils/lazy_backtrack.cmi : +utils/linkage_name.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ + utils/identifiable.cmi \ + utils/linkage_name.cmi +utils/linkage_name.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ + utils/identifiable.cmx \ + utils/linkage_name.cmi +utils/linkage_name.cmi : \ + utils/identifiable.cmi utils/load_path.cmo : \ utils/misc.cmi \ utils/local_store.cmi \ utils/config.cmi \ + utils/clflags.cmi \ utils/load_path.cmi utils/load_path.cmx : \ utils/misc.cmx \ utils/local_store.cmx \ utils/config.cmx \ + utils/clflags.cmx \ utils/load_path.cmi utils/load_path.cmi : utils/local_store.cmo : \ @@ -157,25 +221,60 @@ utils/profile.cmx : \ utils/misc.cmx \ utils/profile.cmi utils/profile.cmi : +utils/runtimetags.cmo : \ + utils/runtimetags.cmi +utils/runtimetags.cmx : \ + utils/runtimetags.cmi +utils/runtimetags.cmi : utils/strongly_connected_components.cmo : \ utils/numbers.cmi \ utils/misc.cmi \ - utils/identifiable.cmi \ utils/strongly_connected_components.cmi utils/strongly_connected_components.cmx : \ utils/numbers.cmx \ utils/misc.cmx \ - utils/identifiable.cmx \ utils/strongly_connected_components.cmi -utils/strongly_connected_components.cmi : \ - utils/identifiable.cmi +utils/strongly_connected_components.cmi : +utils/symbol.cmo : \ + utils/misc.cmi \ + utils/linkage_name.cmi \ + utils/identifiable.cmi \ + typing/ident.cmi \ + utils/config.cmi \ + utils/compilation_unit.cmi \ + utils/symbol.cmi +utils/symbol.cmx : \ + utils/misc.cmx \ + utils/linkage_name.cmx \ + utils/identifiable.cmx \ + typing/ident.cmx \ + utils/config.cmx \ + utils/compilation_unit.cmx \ + utils/symbol.cmi +utils/symbol.cmi : \ + utils/linkage_name.cmi \ + utils/identifiable.cmi \ + typing/ident.cmi \ + utils/compilation_unit.cmi +utils/target_system.cmo : \ + utils/misc.cmi \ + utils/config.cmi \ + utils/target_system.cmi +utils/target_system.cmx : \ + utils/misc.cmx \ + utils/config.cmx \ + utils/target_system.cmi +utils/target_system.cmi : utils/targetint.cmo : \ + utils/numbers.cmi \ utils/misc.cmi \ utils/targetint.cmi utils/targetint.cmx : \ + utils/numbers.cmx \ utils/misc.cmx \ utils/targetint.cmi -utils/targetint.cmi : +utils/targetint.cmi : \ + utils/numbers.cmi utils/terminfo.cmo : \ utils/terminfo.cmi utils/terminfo.cmx : \ @@ -188,6 +287,18 @@ utils/warnings.cmx : \ utils/misc.cmx \ utils/warnings.cmi utils/warnings.cmi : +utils/zero_alloc_annotations.cmo : \ + utils/zero_alloc_annotations.cmi +utils/zero_alloc_annotations.cmx : \ + utils/zero_alloc_annotations.cmi +utils/zero_alloc_annotations.cmi : +utils/zero_alloc_utils.cmo : \ + utils/clflags.cmi \ + utils/zero_alloc_utils.cmi +utils/zero_alloc_utils.cmx : \ + utils/clflags.cmx \ + utils/zero_alloc_utils.cmi +utils/zero_alloc_utils.cmi : parsing/ast_helper.cmo : \ parsing/syntaxerr.cmi \ parsing/parsetree.cmi \ @@ -216,6 +327,7 @@ parsing/ast_invariants.cmo : \ parsing/syntaxerr.cmi \ parsing/parsetree.cmi \ parsing/longident.cmi \ + parsing/jane_syntax.cmi \ parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ parsing/ast_iterator.cmi \ @@ -224,6 +336,7 @@ parsing/ast_invariants.cmx : \ parsing/syntaxerr.cmx \ parsing/parsetree.cmi \ parsing/longident.cmx \ + parsing/jane_syntax.cmx \ parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ parsing/ast_iterator.cmx \ @@ -233,20 +346,26 @@ parsing/ast_invariants.cmi : \ parsing/ast_iterator.cmo : \ parsing/parsetree.cmi \ parsing/location.cmi \ + parsing/jane_syntax.cmi \ parsing/ast_iterator.cmi parsing/ast_iterator.cmx : \ parsing/parsetree.cmi \ parsing/location.cmx \ + parsing/jane_syntax.cmx \ parsing/ast_iterator.cmi parsing/ast_iterator.cmi : \ parsing/parsetree.cmi \ - parsing/location.cmi + parsing/location.cmi \ + parsing/jane_syntax.cmi parsing/ast_mapper.cmo : \ parsing/parsetree.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ + parsing/docstrings.cmi \ utils/config.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ @@ -258,6 +377,9 @@ parsing/ast_mapper.cmx : \ parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ + parsing/docstrings.cmx \ utils/config.cmx \ utils/clflags.cmx \ parsing/asttypes.cmi \ @@ -265,17 +387,20 @@ parsing/ast_mapper.cmx : \ parsing/ast_mapper.cmi parsing/ast_mapper.cmi : \ parsing/parsetree.cmi \ - parsing/location.cmi + parsing/location.cmi \ + parsing/jane_syntax.cmi parsing/asttypes.cmi : \ parsing/location.cmi parsing/attr_helper.cmo : \ parsing/parsetree.cmi \ parsing/location.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ parsing/attr_helper.cmi parsing/attr_helper.cmx : \ parsing/parsetree.cmi \ parsing/location.cmx \ + parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ parsing/attr_helper.cmi parsing/attr_helper.cmi : \ @@ -283,22 +408,35 @@ parsing/attr_helper.cmi : \ parsing/location.cmi \ parsing/asttypes.cmi parsing/builtin_attributes.cmo : \ + utils/zero_alloc_utils.cmi \ + utils/zero_alloc_annotations.cmi \ utils/warnings.cmi \ parsing/parsetree.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/config.cmi \ + utils/clflags.cmi \ parsing/asttypes.cmi \ + parsing/ast_iterator.cmi \ + parsing/ast_helper.cmi \ parsing/builtin_attributes.cmi parsing/builtin_attributes.cmx : \ + utils/zero_alloc_utils.cmx \ + utils/zero_alloc_annotations.cmx \ utils/warnings.cmx \ parsing/parsetree.cmi \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + utils/config.cmx \ + utils/clflags.cmx \ parsing/asttypes.cmi \ + parsing/ast_iterator.cmx \ + parsing/ast_helper.cmx \ parsing/builtin_attributes.cmi parsing/builtin_attributes.cmi : \ + utils/zero_alloc_utils.cmi \ parsing/parsetree.cmi \ utils/misc.cmi \ parsing/location.cmi @@ -312,6 +450,7 @@ parsing/depend.cmo : \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + parsing/jane_syntax.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ @@ -321,6 +460,7 @@ parsing/depend.cmx : \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + parsing/jane_syntax.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ @@ -342,6 +482,59 @@ parsing/docstrings.cmx : \ parsing/docstrings.cmi : \ parsing/parsetree.cmi \ parsing/location.cmi +parsing/jane_asttypes.cmo : \ + parsing/jane_asttypes.cmi +parsing/jane_asttypes.cmx : \ + parsing/jane_asttypes.cmi +parsing/jane_asttypes.cmi : +parsing/jane_syntax.cmo : \ + parsing/printast.cmi \ + parsing/parsetree.cmi \ + utils/misc.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + utils/language_extension_kernel.cmi \ + utils/language_extension.cmi \ + parsing/jane_syntax_parsing.cmi \ + parsing/asttypes.cmi \ + parsing/ast_helper.cmi \ + parsing/jane_syntax.cmi +parsing/jane_syntax.cmx : \ + parsing/printast.cmx \ + parsing/parsetree.cmi \ + utils/misc.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + utils/language_extension_kernel.cmx \ + utils/language_extension.cmx \ + parsing/jane_syntax_parsing.cmx \ + parsing/asttypes.cmi \ + parsing/ast_helper.cmx \ + parsing/jane_syntax.cmi +parsing/jane_syntax.cmi : \ + parsing/parsetree.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + parsing/docstrings.cmi \ + parsing/asttypes.cmi +parsing/jane_syntax_parsing.cmo : \ + parsing/parsetree.cmi \ + parsing/location.cmi \ + utils/language_extension_kernel.cmi \ + utils/language_extension.cmi \ + parsing/ast_helper.cmi \ + parsing/jane_syntax_parsing.cmi +parsing/jane_syntax_parsing.cmx : \ + parsing/parsetree.cmi \ + parsing/location.cmx \ + utils/language_extension_kernel.cmx \ + utils/language_extension.cmx \ + parsing/ast_helper.cmx \ + parsing/jane_syntax_parsing.cmi +parsing/jane_syntax_parsing.cmi : \ + parsing/parsetree.cmi \ + parsing/location.cmi \ + utils/language_extension.cmi parsing/lexer.cmo : \ utils/warnings.cmi \ parsing/parser.cmi \ @@ -404,22 +597,32 @@ parsing/parse.cmi : \ parsing/parser.cmo : \ parsing/syntaxerr.cmi \ parsing/parsetree.cmi \ + utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + parsing/jane_syntax_parsing.cmi \ + parsing/jane_syntax.cmi \ parsing/docstrings.cmi \ utils/clflags.cmi \ parsing/camlinternalMenhirLib.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ parsing/ast_helper.cmi \ parsing/parser.cmi parsing/parser.cmx : \ parsing/syntaxerr.cmx \ parsing/parsetree.cmi \ + utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + utils/language_extension.cmx \ + parsing/jane_syntax_parsing.cmx \ + parsing/jane_syntax.cmx \ parsing/docstrings.cmx \ utils/clflags.cmx \ parsing/camlinternalMenhirLib.cmx \ + parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ parsing/ast_helper.cmx \ parsing/parser.cmi @@ -435,21 +638,29 @@ parsing/parsetree.cmi : \ parsing/asttypes.cmi parsing/pprintast.cmo : \ parsing/parsetree.cmi \ + utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + parsing/jane_syntax.cmi \ parsing/asttypes.cmi \ + parsing/ast_helper.cmi \ parsing/pprintast.cmi parsing/pprintast.cmx : \ parsing/parsetree.cmi \ + utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + utils/language_extension.cmx \ + parsing/jane_syntax.cmx \ parsing/asttypes.cmi \ + parsing/ast_helper.cmx \ parsing/pprintast.cmi parsing/pprintast.cmi : \ parsing/parsetree.cmi \ - parsing/longident.cmi + parsing/longident.cmi \ + parsing/jane_syntax.cmi parsing/printast.cmo : \ - parsing/pprintast.cmi \ parsing/parsetree.cmi \ parsing/longident.cmi \ parsing/location.cmi \ @@ -457,7 +668,6 @@ parsing/printast.cmo : \ parsing/asttypes.cmi \ parsing/printast.cmi parsing/printast.cmx : \ - parsing/pprintast.cmx \ parsing/parsetree.cmi \ parsing/longident.cmx \ parsing/location.cmx \ @@ -479,6 +689,7 @@ typing/annot.cmi : \ typing/btype.cmo : \ typing/types.cmi \ typing/path.cmi \ + parsing/parsetree.cmi \ utils/local_store.cmi \ typing/ident.cmi \ parsing/asttypes.cmi \ @@ -486,6 +697,7 @@ typing/btype.cmo : \ typing/btype.cmx : \ typing/types.cmx \ typing/path.cmx \ + parsing/parsetree.cmi \ utils/local_store.cmx \ typing/ident.cmx \ parsing/asttypes.cmi \ @@ -493,11 +705,13 @@ typing/btype.cmx : \ typing/btype.cmi : \ typing/types.cmi \ typing/path.cmi \ + parsing/parsetree.cmi \ + typing/jkind.cmi \ parsing/asttypes.cmi typing/cmt2annot.cmo : \ - typing/types.cmi \ typing/typedtree.cmi \ typing/tast_iterator.cmi \ + typing/subst.cmi \ typing/stypes.cmi \ typing/path.cmi \ typing/oprint.cmi \ @@ -510,9 +724,9 @@ typing/cmt2annot.cmo : \ typing/annot.cmi \ typing/cmt2annot.cmi typing/cmt2annot.cmx : \ - typing/types.cmx \ typing/typedtree.cmx \ typing/tast_iterator.cmx \ + typing/subst.cmx \ typing/stypes.cmx \ typing/path.cmx \ typing/oprint.cmx \ @@ -528,14 +742,17 @@ typing/cmt2annot.cmi : \ file_formats/cmt_format.cmi typing/ctype.cmo : \ typing/types.cmi \ - typing/type_immediacy.cmi \ typing/subst.cmi \ + typing/primitive.cmi \ typing/predef.cmi \ typing/path.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ utils/local_store.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ @@ -545,14 +762,17 @@ typing/ctype.cmo : \ typing/ctype.cmi typing/ctype.cmx : \ typing/types.cmx \ - typing/type_immediacy.cmx \ typing/subst.cmx \ + typing/primitive.cmx \ typing/predef.cmx \ typing/path.cmx \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ utils/local_store.cmx \ + utils/language_extension.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/errortrace.cmx \ typing/env.cmx \ @@ -562,10 +782,12 @@ typing/ctype.cmx : \ typing/ctype.cmi typing/ctype.cmi : \ typing/types.cmi \ - typing/type_immediacy.cmi \ + typing/primitive.cmi \ typing/path.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ @@ -574,7 +796,9 @@ typing/ctype.cmi : \ typing/datarepr.cmo : \ typing/types.cmi \ typing/path.cmi \ + typing/mode.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -582,7 +806,9 @@ typing/datarepr.cmo : \ typing/datarepr.cmx : \ typing/types.cmx \ typing/path.cmx \ + typing/mode.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/btype.cmx \ parsing/asttypes.cmi \ @@ -590,7 +816,8 @@ typing/datarepr.cmx : \ typing/datarepr.cmi : \ typing/types.cmi \ typing/path.cmi \ - typing/ident.cmi + typing/ident.cmi \ + utils/compilation_unit.cmi typing/env.cmo : \ utils/warnings.cmi \ typing/types.cmi \ @@ -599,14 +826,18 @@ typing/env.cmo : \ typing/predef.cmi \ typing/persistent_env.cmi \ typing/path.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ utils/local_store.cmi \ utils/load_path.cmi \ utils/lazy_backtrack.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/datarepr.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ @@ -621,14 +852,18 @@ typing/env.cmx : \ typing/predef.cmx \ typing/persistent_env.cmx \ typing/path.cmx \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ utils/local_store.cmx \ utils/load_path.cmx \ utils/lazy_backtrack.cmx \ + utils/language_extension.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/datarepr.cmx \ + utils/compilation_unit.cmx \ file_formats/cmi_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ @@ -641,11 +876,15 @@ typing/env.cmi : \ typing/subst.cmi \ typing/shape.cmi \ typing/path.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + typing/jkind.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi \ parsing/asttypes.cmi typing/envaux.cmo : \ @@ -673,16 +912,19 @@ typing/envaux.cmi : \ typing/errortrace.cmo : \ typing/types.cmi \ typing/path.cmi \ + typing/jkind.cmi \ parsing/asttypes.cmi \ typing/errortrace.cmi typing/errortrace.cmx : \ typing/types.cmx \ typing/path.cmx \ + typing/jkind.cmx \ parsing/asttypes.cmi \ typing/errortrace.cmi typing/errortrace.cmi : \ typing/types.cmi \ typing/path.cmi \ + typing/jkind.cmi \ parsing/asttypes.cmi typing/ident.cmo : \ utils/misc.cmi \ @@ -719,13 +961,15 @@ typing/includeclass.cmi : \ typing/env.cmi \ typing/ctype.cmi typing/includecore.cmo : \ + utils/zero_alloc_utils.cmi \ typing/types.cmi \ typing/typedtree.cmi \ - typing/type_immediacy.cmi \ typing/printtyp.cmi \ typing/primitive.cmi \ typing/path.cmi \ + typing/mode.cmi \ utils/misc.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ @@ -736,13 +980,15 @@ typing/includecore.cmo : \ parsing/asttypes.cmi \ typing/includecore.cmi typing/includecore.cmx : \ + utils/zero_alloc_utils.cmx \ typing/types.cmx \ typing/typedtree.cmx \ - typing/type_immediacy.cmx \ typing/printtyp.cmx \ typing/primitive.cmx \ typing/path.cmx \ + typing/mode.cmx \ utils/misc.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/errortrace.cmx \ typing/env.cmx \ @@ -755,9 +1001,10 @@ typing/includecore.cmx : \ typing/includecore.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ - typing/type_immediacy.cmi \ typing/path.cmi \ + typing/mode.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ @@ -826,13 +1073,14 @@ typing/includemod_errorprinter.cmo : \ typing/printtyp.cmi \ typing/path.cmi \ typing/oprint.cmi \ + typing/mtype.cmi \ utils/misc.cmi \ parsing/location.cmi \ typing/includemod.cmi \ typing/includecore.cmi \ typing/includeclass.cmi \ typing/ident.cmi \ - typing/env.cmi \ + typing/errortrace.cmi \ utils/diffing.cmi \ utils/clflags.cmi \ typing/includemod_errorprinter.cmi @@ -842,21 +1090,100 @@ typing/includemod_errorprinter.cmx : \ typing/printtyp.cmx \ typing/path.cmx \ typing/oprint.cmx \ + typing/mtype.cmx \ utils/misc.cmx \ parsing/location.cmx \ typing/includemod.cmx \ typing/includecore.cmx \ typing/includeclass.cmx \ typing/ident.cmx \ - typing/env.cmx \ + typing/errortrace.cmx \ utils/diffing.cmx \ utils/clflags.cmx \ typing/includemod_errorprinter.cmi typing/includemod_errorprinter.cmi : \ typing/includemod.cmi +typing/jkind.cmo : \ + parsing/pprintast.cmi \ + typing/types.cmi \ + typing/primitive.cmi \ + typing/path.cmi \ + parsing/parsetree.cmi \ + typing/mode.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + utils/language_extension.cmi \ + typing/jkind_types.cmi \ + parsing/jane_syntax.cmi \ + typing/ident.cmi \ + parsing/builtin_attributes.cmi \ + typing/jkind.cmi +typing/jkind.cmx : \ + parsing/pprintast.cmx \ + typing/types.cmx \ + typing/primitive.cmx \ + typing/path.cmx \ + parsing/parsetree.cmi \ + typing/mode.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + utils/language_extension.cmx \ + typing/jkind_types.cmx \ + parsing/jane_syntax.cmx \ + typing/ident.cmx \ + parsing/builtin_attributes.cmx \ + typing/jkind.cmi +typing/jkind.cmi : \ + typing/types.cmi \ + typing/path.cmi \ + parsing/parsetree.cmi \ + typing/mode.cmi \ + parsing/location.cmi \ + parsing/jane_syntax.cmi \ + typing/jkind_types.cmi \ + parsing/jane_asttypes.cmi \ + typing/ident.cmi +typing/jkind_types.cmo : \ + typing/path.cmi \ + typing/mode.cmi \ + parsing/location.cmi \ + parsing/jane_asttypes.cmi \ + typing/ident.cmi \ + typing/jkind_types.cmi +typing/jkind_types.cmx : \ + typing/path.cmx \ + typing/mode.cmx \ + parsing/location.cmx \ + parsing/jane_asttypes.cmx \ + typing/ident.cmx \ + typing/jkind_types.cmi +typing/jkind_types.cmi : \ + typing/path.cmi \ + typing/mode.cmi \ + parsing/location.cmi \ + parsing/jane_asttypes.cmi \ + typing/ident.cmi +typing/mode.cmo : \ + typing/solver_intf.cmi \ + typing/solver.cmi \ + typing/mode_intf.cmi \ + utils/misc.cmi \ + typing/mode.cmi +typing/mode.cmx : \ + typing/solver_intf.cmi \ + typing/solver.cmx \ + typing/mode_intf.cmi \ + utils/misc.cmx \ + typing/mode.cmi +typing/mode.cmi : \ + typing/mode_intf.cmi +typing/mode_intf.cmi : \ + typing/solver_intf.cmi \ + typing/solver.cmi typing/mtype.cmo : \ typing/types.cmi \ typing/subst.cmi \ + typing/printtyp.cmi \ typing/path.cmi \ parsing/location.cmi \ typing/ident.cmi \ @@ -869,6 +1196,7 @@ typing/mtype.cmo : \ typing/mtype.cmx : \ typing/types.cmx \ typing/subst.cmx \ + typing/printtyp.cmx \ typing/path.cmx \ parsing/location.cmx \ typing/ident.cmx \ @@ -880,23 +1208,26 @@ typing/mtype.cmx : \ typing/mtype.cmi typing/mtype.cmi : \ typing/types.cmi \ + typing/subst.cmi \ typing/path.cmi \ typing/ident.cmi \ typing/env.cmi typing/oprint.cmo : \ parsing/pprintast.cmi \ typing/outcometree.cmi \ + typing/jkind.cmi \ parsing/asttypes.cmi \ typing/oprint.cmi typing/oprint.cmx : \ parsing/pprintast.cmx \ typing/outcometree.cmi \ + typing/jkind.cmx \ parsing/asttypes.cmi \ typing/oprint.cmi typing/oprint.cmi : \ typing/outcometree.cmi typing/outcometree.cmi : \ - typing/type_immediacy.cmi \ + typing/jkind_types.cmi \ parsing/asttypes.cmi typing/parmatch.cmo : \ utils/warnings.cmi \ @@ -908,9 +1239,12 @@ typing/parmatch.cmo : \ typing/predef.cmi \ typing/patterns.cmi \ typing/path.cmi \ + parsing/parsetree.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ @@ -927,9 +1261,12 @@ typing/parmatch.cmx : \ typing/predef.cmx \ typing/patterns.cmx \ typing/path.cmx \ + parsing/parsetree.cmi \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ @@ -939,6 +1276,7 @@ typing/parmatch.cmx : \ typing/parmatch.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ + parsing/parsetree.cmi \ parsing/location.cmi \ typing/env.cmi \ parsing/asttypes.cmi @@ -953,8 +1291,10 @@ typing/path.cmi : \ typing/patterns.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ @@ -963,8 +1303,10 @@ typing/patterns.cmo : \ typing/patterns.cmx : \ typing/types.cmx \ typing/typedtree.cmx \ + typing/mode.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ @@ -973,42 +1315,61 @@ typing/patterns.cmx : \ typing/patterns.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ parsing/asttypes.cmi typing/persistent_env.cmo : \ utils/warnings.cmi \ + typing/subst.cmi \ + typing/shape.cmi \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ utils/lazy_backtrack.cmi \ + utils/import_info.cmi \ + typing/ident.cmi \ utils/consistbl.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi \ utils/clflags.cmi \ typing/persistent_env.cmi typing/persistent_env.cmx : \ utils/warnings.cmx \ + typing/subst.cmx \ + typing/shape.cmx \ utils/misc.cmx \ parsing/location.cmx \ utils/load_path.cmx \ utils/lazy_backtrack.cmx \ + utils/import_info.cmx \ + typing/ident.cmx \ utils/consistbl.cmx \ + utils/compilation_unit.cmx \ file_formats/cmi_format.cmx \ utils/clflags.cmx \ typing/persistent_env.cmi typing/persistent_env.cmi : \ - typing/types.cmi \ + typing/subst.cmi \ + typing/shape.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/load_path.cmi \ utils/lazy_backtrack.cmi \ + utils/import_info.cmi \ + typing/ident.cmi \ utils/consistbl.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi typing/predef.cmo : \ typing/types.cmi \ - typing/type_immediacy.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/ident.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -1016,10 +1377,12 @@ typing/predef.cmo : \ typing/predef.cmi typing/predef.cmx : \ typing/types.cmx \ - typing/type_immediacy.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ + typing/mode.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ typing/ident.cmx \ typing/btype.cmx \ parsing/asttypes.cmi \ @@ -1028,12 +1391,15 @@ typing/predef.cmx : \ typing/predef.cmi : \ typing/types.cmi \ typing/path.cmi \ + typing/jkind.cmi \ typing/ident.cmi typing/primitive.cmo : \ parsing/parsetree.cmi \ typing/outcometree.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + typing/jkind_types.cmi \ parsing/attr_helper.cmi \ typing/primitive.cmi typing/primitive.cmx : \ @@ -1041,31 +1407,34 @@ typing/primitive.cmx : \ typing/outcometree.cmi \ utils/misc.cmx \ parsing/location.cmx \ + utils/language_extension.cmx \ + typing/jkind_types.cmx \ parsing/attr_helper.cmx \ typing/primitive.cmi typing/primitive.cmi : \ parsing/parsetree.cmi \ typing/outcometree.cmi \ - parsing/location.cmi + parsing/location.cmi \ + typing/jkind_types.cmi typing/printpat.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ + utils/misc.cmi \ typing/ident.cmi \ parsing/asttypes.cmi \ typing/printpat.cmi typing/printpat.cmx : \ typing/types.cmx \ typing/typedtree.cmx \ + utils/misc.cmx \ typing/ident.cmx \ parsing/asttypes.cmi \ typing/printpat.cmi typing/printpat.cmi : \ - typing/typedtree.cmi \ - parsing/asttypes.cmi + typing/typedtree.cmi typing/printtyp.cmo : \ utils/warnings.cmi \ typing/types.cmi \ - typing/type_immediacy.cmi \ typing/signature_group.cmi \ typing/shape.cmi \ typing/primitive.cmi \ @@ -1074,13 +1443,16 @@ typing/printtyp.cmo : \ parsing/parsetree.cmi \ typing/outcometree.cmi \ typing/oprint.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -1088,7 +1460,6 @@ typing/printtyp.cmo : \ typing/printtyp.cmx : \ utils/warnings.cmx \ typing/types.cmx \ - typing/type_immediacy.cmx \ typing/signature_group.cmx \ typing/shape.cmx \ typing/primitive.cmx \ @@ -1097,13 +1468,16 @@ typing/printtyp.cmx : \ parsing/parsetree.cmi \ typing/outcometree.cmi \ typing/oprint.cmx \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ typing/btype.cmx \ parsing/asttypes.cmi \ @@ -1113,79 +1487,80 @@ typing/printtyp.cmi : \ typing/shape.cmi \ typing/path.cmi \ typing/outcometree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ - typing/env.cmi \ - parsing/asttypes.cmi + typing/env.cmi typing/printtyped.cmo : \ + utils/zero_alloc_utils.cmi \ typing/types.cmi \ typing/typedtree.cmi \ parsing/printast.cmi \ parsing/pprintast.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ typing/printtyped.cmi typing/printtyped.cmx : \ + utils/zero_alloc_utils.cmx \ typing/types.cmx \ typing/typedtree.cmx \ parsing/printast.cmx \ parsing/pprintast.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ + typing/mode.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ utils/clflags.cmx \ parsing/asttypes.cmi \ typing/printtyped.cmi typing/printtyped.cmi : \ typing/typedtree.cmi -typing/rec_check.cmo : \ - typing/types.cmi \ - typing/typeopt.cmi \ - typing/typedtree.cmi \ - typing/primitive.cmi \ - typing/path.cmi \ - lambda/lambda.cmi \ - typing/ident.cmi \ - parsing/asttypes.cmi \ - typing/rec_check.cmi -typing/rec_check.cmx : \ - typing/types.cmx \ - typing/typeopt.cmx \ - typing/typedtree.cmx \ - typing/primitive.cmx \ - typing/path.cmx \ - lambda/lambda.cmx \ - typing/ident.cmx \ - parsing/asttypes.cmi \ - typing/rec_check.cmi -typing/rec_check.cmi : \ - typing/typedtree.cmi \ - typing/ident.cmi typing/shape.cmo : \ typing/path.cmi \ utils/misc.cmi \ utils/identifiable.cmi \ typing/ident.cmi \ + utils/compilation_unit.cmi \ typing/shape.cmi typing/shape.cmx : \ typing/path.cmx \ utils/misc.cmx \ utils/identifiable.cmx \ typing/ident.cmx \ + utils/compilation_unit.cmx \ typing/shape.cmi typing/shape.cmi : \ typing/path.cmi \ utils/identifiable.cmi \ - typing/ident.cmi + typing/ident.cmi \ + utils/compilation_unit.cmi +typing/shape_reduce.cmo : \ + typing/shape.cmi \ + utils/local_store.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + typing/shape_reduce.cmi +typing/shape_reduce.cmx : \ + typing/shape.cmx \ + utils/local_store.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + typing/shape_reduce.cmi +typing/shape_reduce.cmi : \ + typing/shape.cmi \ + typing/env.cmi typing/signature_group.cmo : \ typing/types.cmi \ typing/ident.cmi \ @@ -1198,6 +1573,18 @@ typing/signature_group.cmx : \ typing/signature_group.cmi typing/signature_group.cmi : \ typing/types.cmi +typing/solver.cmo : \ + typing/solver_intf.cmi \ + utils/misc.cmi \ + typing/solver.cmi +typing/solver.cmx : \ + typing/solver_intf.cmi \ + utils/misc.cmx \ + typing/solver.cmi +typing/solver.cmi : \ + typing/solver_intf.cmi +typing/solver_intf.cmi : \ + utils/misc.cmi typing/stypes.cmo : \ typing/typedtree.cmi \ typing/printtyp.cmi \ @@ -1226,6 +1613,7 @@ typing/subst.cmo : \ parsing/location.cmi \ utils/local_store.cmi \ utils/lazy_backtrack.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ utils/clflags.cmi \ typing/btype.cmi \ @@ -1239,6 +1627,7 @@ typing/subst.cmx : \ parsing/location.cmx \ utils/local_store.cmx \ utils/lazy_backtrack.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ utils/clflags.cmx \ typing/btype.cmx \ @@ -1247,13 +1636,13 @@ typing/subst.cmx : \ typing/subst.cmi : \ typing/types.cmi \ typing/path.cmi \ - parsing/parsetree.cmi \ parsing/location.cmi \ typing/ident.cmi typing/tast_iterator.cmo : \ typing/typedtree.cmi \ parsing/parsetree.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/env.cmi \ parsing/asttypes.cmi \ parsing/ast_iterator.cmi \ @@ -1262,6 +1651,7 @@ typing/tast_iterator.cmx : \ typing/typedtree.cmx \ parsing/parsetree.cmi \ parsing/location.cmx \ + typing/jkind.cmx \ typing/env.cmx \ parsing/asttypes.cmi \ parsing/ast_iterator.cmx \ @@ -1269,12 +1659,14 @@ typing/tast_iterator.cmx : \ typing/tast_iterator.cmi : \ typing/typedtree.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/env.cmi \ parsing/asttypes.cmi typing/tast_mapper.cmo : \ typing/typedtree.cmi \ parsing/parsetree.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/env.cmi \ parsing/asttypes.cmi \ parsing/ast_mapper.cmi \ @@ -1283,6 +1675,7 @@ typing/tast_mapper.cmx : \ typing/typedtree.cmx \ parsing/parsetree.cmi \ parsing/location.cmx \ + typing/jkind.cmx \ typing/env.cmx \ parsing/asttypes.cmi \ parsing/ast_mapper.cmx \ @@ -1290,16 +1683,9 @@ typing/tast_mapper.cmx : \ typing/tast_mapper.cmi : \ typing/typedtree.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/env.cmi \ parsing/asttypes.cmi -typing/type_immediacy.cmo : \ - parsing/builtin_attributes.cmi \ - typing/type_immediacy.cmi -typing/type_immediacy.cmx : \ - parsing/builtin_attributes.cmx \ - typing/type_immediacy.cmi -typing/type_immediacy.cmi : \ - parsing/parsetree.cmi typing/typeclass.cmo : \ utils/warnings.cmi \ typing/typetexp.cmi \ @@ -1314,9 +1700,12 @@ typing/typeclass.cmo : \ typing/path.cmi \ parsing/parsetree.cmi \ typing/oprint.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/includeclass.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ @@ -1343,9 +1732,12 @@ typing/typeclass.cmx : \ typing/path.cmx \ parsing/parsetree.cmi \ typing/oprint.cmx \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ typing/includeclass.cmx \ typing/ident.cmx \ typing/errortrace.cmx \ @@ -1364,21 +1756,25 @@ typing/typeclass.cmi : \ parsing/parsetree.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ parsing/asttypes.cmi typing/typecore.cmo : \ + utils/zero_alloc_utils.cmi \ utils/warnings.cmi \ + typing/value_rec_check.cmi \ typing/untypeast.cmi \ + typing/uniqueness_analysis.cmi \ typing/typetexp.cmi \ typing/types.cmi \ + typing/typemode.cmi \ typing/typedtree.cmi \ typing/typedecl.cmi \ typing/subst.cmi \ typing/shape.cmi \ - typing/rec_check.cmi \ typing/printtyp.cmi \ typing/printpat.cmi \ typing/primitive.cmi \ @@ -1389,9 +1785,14 @@ typing/typecore.cmo : \ parsing/parsetree.cmi \ typing/parmatch.cmi \ typing/mtype.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/local_store.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ @@ -1404,15 +1805,18 @@ typing/typecore.cmo : \ parsing/ast_helper.cmi \ typing/typecore.cmi typing/typecore.cmx : \ + utils/zero_alloc_utils.cmx \ utils/warnings.cmx \ + typing/value_rec_check.cmx \ typing/untypeast.cmx \ + typing/uniqueness_analysis.cmx \ typing/typetexp.cmx \ typing/types.cmx \ + typing/typemode.cmx \ typing/typedtree.cmx \ typing/typedecl.cmx \ typing/subst.cmx \ typing/shape.cmx \ - typing/rec_check.cmx \ typing/printtyp.cmx \ typing/printpat.cmx \ typing/primitive.cmx \ @@ -1423,9 +1827,14 @@ typing/typecore.cmx : \ parsing/parsetree.cmi \ typing/parmatch.cmx \ typing/mtype.cmx \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + utils/local_store.cmx \ + utils/language_extension.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ typing/ident.cmx \ typing/errortrace.cmx \ typing/env.cmx \ @@ -1443,8 +1852,11 @@ typing/typecore.cmi : \ typing/shape.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ @@ -1453,13 +1865,12 @@ typing/typedecl.cmo : \ utils/warnings.cmi \ typing/typetexp.cmi \ typing/types.cmi \ + typing/typemode.cmi \ typing/typedtree.cmi \ typing/typedecl_variance.cmi \ - typing/typedecl_unboxed.cmi \ typing/typedecl_separability.cmi \ - typing/typedecl_immediacy.cmi \ - typing/type_immediacy.cmi \ typing/subst.cmi \ + typing/shape.cmi \ typing/printtyp.cmi \ typing/primitive.cmi \ typing/predef.cmi \ @@ -1467,9 +1878,13 @@ typing/typedecl.cmo : \ typing/path.cmi \ parsing/parsetree.cmi \ typing/oprint.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/includecore.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ @@ -1488,13 +1903,12 @@ typing/typedecl.cmx : \ utils/warnings.cmx \ typing/typetexp.cmx \ typing/types.cmx \ + typing/typemode.cmx \ typing/typedtree.cmx \ typing/typedecl_variance.cmx \ - typing/typedecl_unboxed.cmx \ typing/typedecl_separability.cmx \ - typing/typedecl_immediacy.cmx \ - typing/type_immediacy.cmx \ typing/subst.cmx \ + typing/shape.cmx \ typing/printtyp.cmx \ typing/primitive.cmx \ typing/predef.cmx \ @@ -1502,9 +1916,13 @@ typing/typedecl.cmx : \ typing/path.cmx \ parsing/parsetree.cmi \ typing/oprint.cmx \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + utils/language_extension.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ typing/includecore.cmx \ typing/ident.cmx \ typing/errortrace.cmx \ @@ -1524,39 +1942,20 @@ typing/typedecl.cmi : \ typing/typedtree.cmi \ typing/typedecl_variance.cmi \ typing/typedecl_separability.cmi \ - typing/typedecl_immediacy.cmi \ + typing/shape.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ typing/includecore.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi -typing/typedecl_immediacy.cmo : \ - typing/types.cmi \ - typing/typedecl_unboxed.cmi \ - typing/typedecl_properties.cmi \ - typing/type_immediacy.cmi \ - parsing/location.cmi \ - typing/ctype.cmi \ - typing/typedecl_immediacy.cmi -typing/typedecl_immediacy.cmx : \ - typing/types.cmx \ - typing/typedecl_unboxed.cmx \ - typing/typedecl_properties.cmx \ - typing/type_immediacy.cmx \ - parsing/location.cmx \ - typing/ctype.cmx \ - typing/typedecl_immediacy.cmi -typing/typedecl_immediacy.cmi : \ - typing/types.cmi \ - typing/typedecl_properties.cmi \ - typing/type_immediacy.cmi \ - parsing/location.cmi \ - typing/ident.cmi \ - typing/env.cmi typing/typedecl_properties.cmo : \ typing/types.cmi \ typing/ident.cmi \ @@ -1577,6 +1976,7 @@ typing/typedecl_separability.cmo : \ typing/types.cmi \ typing/typedecl_properties.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/env.cmi \ typing/ctype.cmi \ utils/config.cmi \ @@ -1586,6 +1986,7 @@ typing/typedecl_separability.cmx : \ typing/types.cmx \ typing/typedecl_properties.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ typing/env.cmx \ typing/ctype.cmx \ utils/config.cmx \ @@ -1597,19 +1998,6 @@ typing/typedecl_separability.cmi : \ parsing/location.cmi \ typing/ident.cmi \ typing/env.cmi -typing/typedecl_unboxed.cmo : \ - typing/types.cmi \ - typing/env.cmi \ - typing/ctype.cmi \ - typing/typedecl_unboxed.cmi -typing/typedecl_unboxed.cmx : \ - typing/types.cmx \ - typing/env.cmx \ - typing/ctype.cmx \ - typing/typedecl_unboxed.cmi -typing/typedecl_unboxed.cmi : \ - typing/types.cmi \ - typing/env.cmi typing/typedecl_variance.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ @@ -1644,39 +2032,57 @@ typing/typedecl_variance.cmi : \ typing/env.cmi \ parsing/asttypes.cmi typing/typedtree.cmo : \ + utils/zero_alloc_utils.cmi \ + typing/value_rec_types.cmi \ typing/types.cmi \ typing/shape.cmi \ typing/primitive.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/ident.cmi \ typing/env.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ typing/typedtree.cmi typing/typedtree.cmx : \ + utils/zero_alloc_utils.cmx \ + typing/value_rec_types.cmi \ typing/types.cmx \ typing/shape.cmx \ typing/primitive.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ + typing/mode.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ typing/ident.cmx \ typing/env.cmx \ + parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ typing/typedtree.cmi typing/typedtree.cmi : \ + utils/zero_alloc_utils.cmi \ + typing/value_rec_types.cmi \ typing/types.cmi \ typing/shape.cmi \ typing/primitive.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/ident.cmi \ typing/env.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi typing/typemod.cmo : \ utils/warnings.cmi \ @@ -1688,7 +2094,9 @@ typing/typemod.cmo : \ typing/typeclass.cmi \ typing/subst.cmi \ typing/signature_group.cmi \ + typing/shape_reduce.cmi \ typing/shape.cmi \ + utils/profile.cmi \ typing/printtyp.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ @@ -1698,14 +2106,21 @@ typing/typemod.cmo : \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/includemod_errorprinter.cmi \ typing/includemod.cmi \ + typing/includecore.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ + typing/envaux.cmi \ typing/env.cmi \ typing/ctype.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ file_formats/cmt_format.cmi \ typing/cmt2annot.cmi \ + file_formats/cms_format.cmi \ file_formats/cmi_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ @@ -1723,7 +2138,9 @@ typing/typemod.cmx : \ typing/typeclass.cmx \ typing/subst.cmx \ typing/signature_group.cmx \ + typing/shape_reduce.cmx \ typing/shape.cmx \ + utils/profile.cmx \ typing/printtyp.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ @@ -1733,14 +2150,21 @@ typing/typemod.cmx : \ parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ typing/includemod_errorprinter.cmx \ typing/includemod.cmx \ + typing/includecore.cmx \ + utils/import_info.cmx \ typing/ident.cmx \ + typing/envaux.cmx \ typing/env.cmx \ typing/ctype.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ file_formats/cmt_format.cmx \ typing/cmt2annot.cmx \ + file_formats/cms_format.cmx \ file_formats/cmi_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ @@ -1757,86 +2181,119 @@ typing/typemod.cmi : \ parsing/parsetree.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind.cmi \ typing/includemod.cmi \ typing/ident.cmi \ typing/env.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi +typing/typemode.cmo : \ + typing/mode.cmi \ + parsing/location.cmi \ + parsing/jane_syntax_parsing.cmi \ + parsing/jane_syntax.cmi \ + typing/typemode.cmi +typing/typemode.cmx : \ + typing/mode.cmx \ + parsing/location.cmx \ + parsing/jane_syntax_parsing.cmx \ + parsing/jane_syntax.cmx \ + typing/typemode.cmi +typing/typemode.cmi : \ + typing/mode.cmi \ + parsing/location.cmi \ + parsing/jane_syntax.cmi typing/typeopt.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ - typing/typedecl_unboxed.cmi \ - typing/type_immediacy.cmi \ + typing/printtyp.cmi \ typing/predef.cmi \ typing/path.cmi \ + utils/numbers.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + utils/language_extension.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ utils/config.cmi \ utils/clflags.cmi \ - parsing/asttypes.cmi \ typing/typeopt.cmi typing/typeopt.cmx : \ typing/types.cmx \ typing/typedtree.cmx \ - typing/typedecl_unboxed.cmx \ - typing/type_immediacy.cmx \ + typing/printtyp.cmx \ typing/predef.cmx \ typing/path.cmx \ + utils/numbers.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + utils/language_extension.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ utils/config.cmx \ utils/clflags.cmx \ - parsing/asttypes.cmi \ typing/typeopt.cmi typing/typeopt.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ typing/path.cmi \ + parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/env.cmi typing/types.cmo : \ - typing/type_immediacy.cmi \ typing/shape.cmi \ typing/primitive.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ utils/local_store.cmi \ + typing/jkind_types.cmi \ typing/ident.cmi \ utils/config.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ typing/types.cmi typing/types.cmx : \ - typing/type_immediacy.cmx \ typing/shape.cmx \ typing/primitive.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ utils/local_store.cmx \ + typing/jkind_types.cmx \ typing/ident.cmx \ utils/config.cmx \ + parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ typing/types.cmi typing/types.cmi : \ - typing/type_immediacy.cmi \ typing/shape.cmi \ typing/primitive.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/jkind_types.cmi \ typing/ident.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi typing/typetexp.cmo : \ typing/types.cmi \ + typing/typemode.cmi \ typing/typedtree.cmi \ typing/printtyp.cmi \ typing/predef.cmi \ @@ -1844,9 +2301,13 @@ typing/typetexp.cmo : \ typing/path.cmi \ parsing/parsetree.cmi \ typing/oprint.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ @@ -1857,6 +2318,7 @@ typing/typetexp.cmo : \ typing/typetexp.cmi typing/typetexp.cmx : \ typing/types.cmx \ + typing/typemode.cmx \ typing/typedtree.cmx \ typing/printtyp.cmx \ typing/predef.cmx \ @@ -1864,9 +2326,13 @@ typing/typetexp.cmx : \ typing/path.cmx \ parsing/parsetree.cmi \ typing/oprint.cmx \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + utils/language_extension.cmx \ + typing/jkind.cmx \ + parsing/jane_syntax.cmx \ typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ @@ -1880,31 +2346,70 @@ typing/typetexp.cmi : \ typing/typedtree.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ + typing/jkind.cmi \ + parsing/jane_syntax.cmi \ typing/errortrace.cmi \ - typing/env.cmi + typing/env.cmi \ + parsing/asttypes.cmi +typing/uniqueness_analysis.cmo : \ + typing/types.cmi \ + typing/typedtree.cmi \ + typing/tast_iterator.cmi \ + typing/printtyp.cmi \ + typing/path.cmi \ + typing/mode.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + parsing/asttypes.cmi \ + typing/uniqueness_analysis.cmi +typing/uniqueness_analysis.cmx : \ + typing/types.cmx \ + typing/typedtree.cmx \ + typing/tast_iterator.cmx \ + typing/printtyp.cmx \ + typing/path.cmx \ + typing/mode.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + parsing/asttypes.cmi \ + typing/uniqueness_analysis.cmi +typing/uniqueness_analysis.cmi : \ + typing/typedtree.cmi typing/untypeast.cmo : \ + typing/types.cmi \ typing/typedtree.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + parsing/jane_syntax.cmi \ typing/ident.cmi \ - typing/env.cmi \ + parsing/docstrings.cmi \ parsing/asttypes.cmi \ parsing/ast_helper.cmi \ typing/untypeast.cmi typing/untypeast.cmx : \ + typing/types.cmx \ typing/typedtree.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ + typing/mode.cmx \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + parsing/jane_syntax.cmx \ typing/ident.cmx \ - typing/env.cmx \ + parsing/docstrings.cmx \ parsing/asttypes.cmi \ parsing/ast_helper.cmx \ typing/untypeast.cmi @@ -1914,11 +2419,40 @@ typing/untypeast.cmi : \ parsing/parsetree.cmi \ parsing/longident.cmi \ parsing/location.cmi \ - parsing/asttypes.cmi -bytecomp/bytegen.cmo : \ + parsing/jane_syntax.cmi +typing/value_rec_check.cmo : \ + typing/value_rec_types.cmi \ typing/types.cmi \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + typing/primitive.cmi \ + typing/path.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + parsing/asttypes.cmi \ + typing/value_rec_check.cmi +typing/value_rec_check.cmx : \ + typing/value_rec_types.cmi \ + typing/types.cmx \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + typing/primitive.cmx \ + typing/path.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + parsing/asttypes.cmi \ + typing/value_rec_check.cmi +typing/value_rec_check.cmi : \ + typing/value_rec_types.cmi \ + typing/typedtree.cmi \ + typing/ident.cmi +typing/value_rec_types.cmi : +bytecomp/bytegen.cmo : \ lambda/switch.cmi \ typing/subst.cmi \ + lambda/printlambda.cmi \ typing/primitive.cmi \ utils/misc.cmi \ lambda/matching.cmi \ @@ -1928,13 +2462,14 @@ bytecomp/bytegen.cmo : \ typing/env.cmi \ lambda/debuginfo.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ bytecomp/bytegen.cmi bytecomp/bytegen.cmx : \ - typing/types.cmx \ lambda/switch.cmx \ typing/subst.cmx \ + lambda/printlambda.cmx \ typing/primitive.cmx \ utils/misc.cmx \ lambda/matching.cmx \ @@ -1944,6 +2479,7 @@ bytecomp/bytegen.cmx : \ typing/env.cmx \ lambda/debuginfo.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ parsing/asttypes.cmi \ bytecomp/bytegen.cmi @@ -1978,11 +2514,13 @@ bytecomp/bytelink.cmo : \ parsing/location.cmi \ utils/load_path.cmi \ bytecomp/instruct.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ bytecomp/emitcode.cmi \ bytecomp/dll.cmi \ utils/consistbl.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ file_formats/cmo_format.cmi \ utils/clflags.cmi \ utils/ccomp.cmi \ @@ -1995,11 +2533,13 @@ bytecomp/bytelink.cmx : \ parsing/location.cmx \ utils/load_path.cmx \ bytecomp/instruct.cmx \ + utils/import_info.cmx \ typing/ident.cmx \ bytecomp/emitcode.cmx \ bytecomp/dll.cmx \ utils/consistbl.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ file_formats/cmo_format.cmi \ utils/clflags.cmx \ utils/ccomp.cmx \ @@ -2008,6 +2548,8 @@ bytecomp/bytelink.cmx : \ bytecomp/bytelink.cmi : \ bytecomp/symtable.cmi \ utils/misc.cmi \ + utils/import_info.cmi \ + utils/compilation_unit.cmi \ file_formats/cmo_format.cmi bytecomp/bytepackager.cmo : \ typing/typemod.cmi \ @@ -2020,10 +2562,12 @@ bytecomp/bytepackager.cmo : \ parsing/location.cmi \ utils/load_path.cmi \ bytecomp/instruct.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ typing/env.cmi \ bytecomp/emitcode.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytelink.cmi \ @@ -2040,10 +2584,12 @@ bytecomp/bytepackager.cmx : \ parsing/location.cmx \ utils/load_path.cmx \ bytecomp/instruct.cmx \ + utils/import_info.cmx \ typing/ident.cmx \ typing/env.cmx \ bytecomp/emitcode.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytelink.cmx \ @@ -2051,7 +2597,8 @@ bytecomp/bytepackager.cmx : \ bytecomp/bytepackager.cmi bytecomp/bytepackager.cmi : \ typing/ident.cmi \ - typing/env.cmi + typing/env.cmi \ + utils/compilation_unit.cmi bytecomp/bytesections.cmo : \ utils/config.cmi \ bytecomp/bytesections.cmi @@ -2059,6 +2606,12 @@ bytecomp/bytesections.cmx : \ utils/config.cmx \ bytecomp/bytesections.cmi bytecomp/bytesections.cmi : +bytecomp/debug_event.cmi : \ + typing/types.cmi \ + typing/subst.cmi \ + parsing/location.cmi \ + typing/ident.cmi \ + typing/env.cmi bytecomp/dll.cmo : \ utils/misc.cmi \ utils/config.cmi \ @@ -2079,14 +2632,13 @@ bytecomp/emitcode.cmo : \ parsing/location.cmi \ lambda/lambda.cmi \ bytecomp/instruct.cmi \ - typing/ident.cmi \ typing/env.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytegen.cmi \ typing/btype.cmi \ - parsing/asttypes.cmi \ bytecomp/emitcode.cmi bytecomp/emitcode.cmx : \ lambda/translmod.cmx \ @@ -2097,19 +2649,18 @@ bytecomp/emitcode.cmx : \ parsing/location.cmx \ lambda/lambda.cmx \ bytecomp/instruct.cmx \ - typing/ident.cmx \ typing/env.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytegen.cmx \ typing/btype.cmx \ - parsing/asttypes.cmi \ bytecomp/emitcode.cmi bytecomp/emitcode.cmi : \ utils/misc.cmi \ bytecomp/instruct.cmi \ - typing/ident.cmi \ + utils/compilation_unit.cmi \ file_formats/cmo_format.cmi bytecomp/instruct.cmo : \ typing/types.cmi \ @@ -2118,6 +2669,7 @@ bytecomp/instruct.cmo : \ lambda/lambda.cmi \ typing/ident.cmi \ typing/env.cmi \ + bytecomp/debug_event.cmi \ bytecomp/instruct.cmi bytecomp/instruct.cmx : \ typing/types.cmx \ @@ -2126,6 +2678,7 @@ bytecomp/instruct.cmx : \ lambda/lambda.cmx \ typing/ident.cmx \ typing/env.cmx \ + bytecomp/debug_event.cmi \ bytecomp/instruct.cmi bytecomp/instruct.cmi : \ typing/types.cmi \ @@ -2133,15 +2686,16 @@ bytecomp/instruct.cmi : \ parsing/location.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ - typing/env.cmi + typing/env.cmi \ + bytecomp/debug_event.cmi bytecomp/meta.cmo : \ - bytecomp/instruct.cmi \ + bytecomp/debug_event.cmi \ bytecomp/meta.cmi bytecomp/meta.cmx : \ - bytecomp/instruct.cmx \ + bytecomp/debug_event.cmi \ bytecomp/meta.cmi bytecomp/meta.cmi : \ - bytecomp/instruct.cmi + bytecomp/debug_event.cmi bytecomp/opcodes.cmo : \ bytecomp/opcodes.cmi bytecomp/opcodes.cmx : \ @@ -2170,13 +2724,13 @@ bytecomp/symtable.cmo : \ bytecomp/meta.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ bytecomp/dll.cmi \ utils/config.cmi \ file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytesections.cmi \ - parsing/asttypes.cmi \ bytecomp/symtable.cmi bytecomp/symtable.cmx : \ lambda/runtimedef.cmx \ @@ -2185,17 +2739,18 @@ bytecomp/symtable.cmx : \ bytecomp/meta.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ + utils/import_info.cmx \ typing/ident.cmx \ bytecomp/dll.cmx \ utils/config.cmx \ file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytesections.cmx \ - parsing/asttypes.cmi \ bytecomp/symtable.cmi bytecomp/symtable.cmi : \ utils/misc.cmi \ lambda/lambda.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ file_formats/cmo_format.cmi asmcomp/CSE.cmo : \ @@ -2228,14 +2783,12 @@ asmcomp/CSEgen.cmi : \ asmcomp/mach.cmi \ parsing/asttypes.cmi asmcomp/afl_instrument.cmo : \ - lambda/lambda.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ middle_end/backend_var.cmi \ parsing/asttypes.cmi \ asmcomp/afl_instrument.cmi asmcomp/afl_instrument.cmx : \ - lambda/lambda.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ middle_end/backend_var.cmx \ @@ -2285,12 +2838,12 @@ asmcomp/asmgen.cmo : \ lambda/lambda.cmi \ asmcomp/interval.cmi \ asmcomp/interf.cmi \ - typing/ident.cmi \ asmcomp/emitaux.cmi \ asmcomp/emit.cmi \ asmcomp/deadcode.cmi \ utils/config.cmi \ middle_end/compilenv.cmi \ + utils/compilation_unit.cmi \ asmcomp/comballoc.cmi \ asmcomp/coloring.cmi \ asmcomp/cmmgen.cmi \ @@ -2328,12 +2881,12 @@ asmcomp/asmgen.cmx : \ lambda/lambda.cmx \ asmcomp/interval.cmx \ asmcomp/interf.cmx \ - typing/ident.cmx \ asmcomp/emitaux.cmx \ asmcomp/emit.cmx \ asmcomp/deadcode.cmx \ utils/config.cmx \ middle_end/compilenv.cmx \ + utils/compilation_unit.cmx \ asmcomp/comballoc.cmx \ asmcomp/coloring.cmx \ asmcomp/cmmgen.cmx \ @@ -2348,6 +2901,7 @@ asmcomp/asmgen.cmx : \ asmcomp/asmgen.cmi : \ lambda/lambda.cmi \ asmcomp/emitaux.cmi \ + utils/compilation_unit.cmi \ asmcomp/cmm.cmi \ middle_end/clambda.cmi \ middle_end/backend_intf.cmi @@ -2379,16 +2933,19 @@ asmcomp/asmlibrarian.cmx : \ asmcomp/asmlibrarian.cmi asmcomp/asmlibrarian.cmi : asmcomp/asmlink.cmo : \ + utils/symbol.cmi \ lambda/runtimedef.cmi \ utils/profile.cmi \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + utils/import_info.cmi \ asmcomp/emitaux.cmi \ asmcomp/emit.cmi \ utils/consistbl.cmi \ utils/config.cmi \ middle_end/compilenv.cmi \ + utils/compilation_unit.cmi \ file_formats/cmx_format.cmi \ asmcomp/cmm_helpers.cmi \ asmcomp/cmm.cmi \ @@ -2397,16 +2954,19 @@ asmcomp/asmlink.cmo : \ asmcomp/asmgen.cmi \ asmcomp/asmlink.cmi asmcomp/asmlink.cmx : \ + utils/symbol.cmx \ lambda/runtimedef.cmx \ utils/profile.cmx \ utils/misc.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + utils/import_info.cmx \ asmcomp/emitaux.cmx \ asmcomp/emit.cmx \ utils/consistbl.cmx \ utils/config.cmx \ middle_end/compilenv.cmx \ + utils/compilation_unit.cmx \ file_formats/cmx_format.cmi \ asmcomp/cmm_helpers.cmx \ asmcomp/cmm.cmx \ @@ -2416,24 +2976,27 @@ asmcomp/asmlink.cmx : \ asmcomp/asmlink.cmi asmcomp/asmlink.cmi : \ utils/misc.cmi \ + utils/import_info.cmi \ + utils/compilation_unit.cmi \ file_formats/cmx_format.cmi asmcomp/asmpackager.cmo : \ typing/typemod.cmi \ lambda/translmod.cmi \ + utils/symbol.cmi \ lambda/simplif.cmi \ utils/profile.cmi \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + utils/linkage_name.cmi \ lambda/lambda.cmi \ - typing/ident.cmi \ + utils/import_info.cmi \ middle_end/flambda/flambda_middle_end.cmi \ - middle_end/flambda/export_info_for_pack.cmi \ middle_end/flambda/export_info.cmi \ typing/env.cmi \ utils/config.cmi \ middle_end/compilenv.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ file_formats/cmx_format.cmi \ middle_end/closure/closure_middle_end.cmi \ utils/clflags.cmi \ @@ -2444,20 +3007,21 @@ asmcomp/asmpackager.cmo : \ asmcomp/asmpackager.cmx : \ typing/typemod.cmx \ lambda/translmod.cmx \ + utils/symbol.cmx \ lambda/simplif.cmx \ utils/profile.cmx \ utils/misc.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + utils/linkage_name.cmx \ lambda/lambda.cmx \ - typing/ident.cmx \ + utils/import_info.cmx \ middle_end/flambda/flambda_middle_end.cmx \ - middle_end/flambda/export_info_for_pack.cmx \ middle_end/flambda/export_info.cmx \ typing/env.cmx \ utils/config.cmx \ middle_end/compilenv.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ file_formats/cmx_format.cmi \ middle_end/closure/closure_middle_end.cmx \ utils/clflags.cmx \ @@ -2467,6 +3031,7 @@ asmcomp/asmpackager.cmx : \ asmcomp/asmpackager.cmi asmcomp/asmpackager.cmi : \ typing/env.cmi \ + utils/compilation_unit.cmi \ middle_end/backend_intf.cmi asmcomp/branch_relaxation.cmo : \ utils/misc.cmi \ @@ -2495,6 +3060,7 @@ asmcomp/cmm.cmo : \ utils/misc.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ + file_formats/cmx_format.cmi \ middle_end/backend_var.cmi \ parsing/asttypes.cmi \ asmcomp/cmm.cmi @@ -2503,6 +3069,7 @@ asmcomp/cmm.cmx : \ utils/misc.cmx \ lambda/lambda.cmx \ lambda/debuginfo.cmx \ + file_formats/cmx_format.cmi \ middle_end/backend_var.cmx \ parsing/asttypes.cmi \ asmcomp/cmm.cmi @@ -2510,20 +3077,23 @@ asmcomp/cmm.cmi : \ utils/targetint.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ + file_formats/cmx_format.cmi \ middle_end/backend_var.cmi \ parsing/asttypes.cmi asmcomp/cmm_helpers.cmo : \ utils/targetint.cmi \ + utils/symbol.cmi \ lambda/switch.cmi \ asmcomp/strmatch.cmi \ asmcomp/proc.cmi \ typing/primitive.cmi \ - utils/numbers.cmi \ utils/misc.cmi \ + utils/linkage_name.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ utils/config.cmi \ middle_end/compilenv.cmi \ + utils/compilation_unit.cmi \ file_formats/cmxs_format.cmi \ file_formats/cmx_format.cmi \ asmcomp/cmmgen_state.cmi \ @@ -2537,16 +3107,18 @@ asmcomp/cmm_helpers.cmo : \ asmcomp/cmm_helpers.cmi asmcomp/cmm_helpers.cmx : \ utils/targetint.cmx \ + utils/symbol.cmx \ lambda/switch.cmx \ asmcomp/strmatch.cmx \ asmcomp/proc.cmx \ typing/primitive.cmx \ - utils/numbers.cmx \ utils/misc.cmx \ + utils/linkage_name.cmx \ lambda/lambda.cmx \ lambda/debuginfo.cmx \ utils/config.cmx \ middle_end/compilenv.cmx \ + utils/compilation_unit.cmx \ file_formats/cmxs_format.cmi \ file_formats/cmx_format.cmi \ asmcomp/cmmgen_state.cmx \ @@ -2560,9 +3132,11 @@ asmcomp/cmm_helpers.cmx : \ asmcomp/cmm_helpers.cmi asmcomp/cmm_helpers.cmi : \ utils/targetint.cmi \ + utils/symbol.cmi \ typing/primitive.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ + utils/compilation_unit.cmi \ file_formats/cmx_format.cmi \ asmcomp/cmmgen_state.cmi \ asmcomp/cmm.cmi \ @@ -2580,11 +3154,11 @@ asmcomp/cmm_invariants.cmx : \ asmcomp/cmm_invariants.cmi : \ asmcomp/cmm.cmi asmcomp/cmmgen.cmo : \ - typing/types.cmi \ middle_end/printclambda_primitives.cmi \ typing/primitive.cmi \ utils/misc.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ lambda/debuginfo.cmi \ utils/config.cmi \ middle_end/compilenv.cmi \ @@ -2599,11 +3173,11 @@ asmcomp/cmmgen.cmo : \ asmcomp/afl_instrument.cmi \ asmcomp/cmmgen.cmi asmcomp/cmmgen.cmx : \ - typing/types.cmx \ middle_end/printclambda_primitives.cmx \ typing/primitive.cmx \ utils/misc.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ lambda/debuginfo.cmx \ utils/config.cmx \ middle_end/compilenv.cmx \ @@ -2639,15 +3213,18 @@ asmcomp/cmmgen_state.cmi : \ asmcomp/coloring.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ + utils/misc.cmi \ asmcomp/coloring.cmi asmcomp/coloring.cmx : \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ + utils/misc.cmx \ asmcomp/coloring.cmi asmcomp/coloring.cmi : asmcomp/comballoc.cmo : \ asmcomp/reg.cmi \ asmcomp/mach.cmi \ + lambda/lambda.cmi \ lambda/debuginfo.cmi \ utils/config.cmi \ asmcomp/arch.cmi \ @@ -2655,6 +3232,7 @@ asmcomp/comballoc.cmo : \ asmcomp/comballoc.cmx : \ asmcomp/reg.cmx \ asmcomp/mach.cmx \ + lambda/lambda.cmx \ lambda/debuginfo.cmx \ utils/config.cmx \ asmcomp/arch.cmx \ @@ -2693,6 +3271,7 @@ asmcomp/emit.cmo : \ asmcomp/x86_ast.cmi \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ + asmcomp/printmach.cmi \ utils/numbers.cmi \ utils/misc.cmi \ asmcomp/mach.cmi \ @@ -2701,8 +3280,9 @@ asmcomp/emit.cmo : \ asmcomp/emitenv.cmi \ asmcomp/emitaux.cmi \ utils/domainstate.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ - middle_end/compilenv.cmi \ + asmcomp/cmm_helpers.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ asmcomp/branch_relaxation.cmi \ @@ -2716,6 +3296,7 @@ asmcomp/emit.cmx : \ asmcomp/x86_ast.cmi \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ + asmcomp/printmach.cmx \ utils/numbers.cmx \ utils/misc.cmx \ asmcomp/mach.cmx \ @@ -2724,8 +3305,9 @@ asmcomp/emit.cmx : \ asmcomp/emitenv.cmi \ asmcomp/emitaux.cmx \ utils/domainstate.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ - middle_end/compilenv.cmx \ + asmcomp/cmm_helpers.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ asmcomp/branch_relaxation.cmx \ @@ -2735,6 +3317,7 @@ asmcomp/emit.cmi : \ asmcomp/linear.cmi \ asmcomp/cmm.cmi asmcomp/emitaux.cmo : \ + utils/misc.cmi \ asmcomp/linear.cmi \ asmcomp/emitenv.cmi \ lambda/debuginfo.cmi \ @@ -2744,6 +3327,7 @@ asmcomp/emitaux.cmo : \ asmcomp/arch.cmi \ asmcomp/emitaux.cmi asmcomp/emitaux.cmx : \ + utils/misc.cmx \ asmcomp/linear.cmx \ asmcomp/emitenv.cmi \ lambda/debuginfo.cmx \ @@ -2992,10 +3576,12 @@ asmcomp/proc.cmi : \ asmcomp/reg.cmo : \ asmcomp/cmm.cmi \ middle_end/backend_var.cmi \ + asmcomp/arch.cmi \ asmcomp/reg.cmi asmcomp/reg.cmx : \ asmcomp/cmm.cmx \ middle_end/backend_var.cmx \ + asmcomp/arch.cmx \ asmcomp/reg.cmi asmcomp/reg.cmi : \ asmcomp/cmm.cmi \ @@ -3034,6 +3620,7 @@ asmcomp/reloadgen.cmi : \ asmcomp/schedgen.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ + utils/misc.cmi \ asmcomp/mach.cmi \ asmcomp/linear.cmi \ asmcomp/cmm.cmi \ @@ -3043,6 +3630,7 @@ asmcomp/schedgen.cmo : \ asmcomp/schedgen.cmx : \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ + utils/misc.cmx \ asmcomp/mach.cmx \ asmcomp/linear.cmx \ asmcomp/cmm.cmx \ @@ -3069,6 +3657,7 @@ asmcomp/selectgen.cmo : \ asmcomp/mach.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ + utils/config.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ middle_end/backend_var.cmi \ @@ -3084,6 +3673,7 @@ asmcomp/selectgen.cmx : \ asmcomp/mach.cmx \ lambda/lambda.cmx \ lambda/debuginfo.cmx \ + utils/config.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ middle_end/backend_var.cmx \ @@ -3126,6 +3716,7 @@ asmcomp/selection.cmi : \ asmcomp/spill.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ + utils/misc.cmi \ asmcomp/mach.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ @@ -3133,6 +3724,7 @@ asmcomp/spill.cmo : \ asmcomp/spill.cmx : \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ + utils/misc.cmx \ asmcomp/mach.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ @@ -3220,10 +3812,8 @@ asmcomp/x86_proc.cmx : \ asmcomp/x86_proc.cmi : \ asmcomp/x86_ast.cmi middle_end/backend_intf.cmi : \ - middle_end/symbol.cmi \ - middle_end/flambda/simple_value_approx.cmi \ - typing/ident.cmi \ - middle_end/flambda/base_types/closure_id.cmi + utils/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi middle_end/backend_var.cmo : \ typing/path.cmi \ typing/ident.cmi \ @@ -3268,100 +3858,79 @@ middle_end/clambda.cmi : \ parsing/asttypes.cmi middle_end/clambda_primitives.cmo : \ typing/types.cmi \ - typing/primitive.cmi \ + utils/misc.cmi \ lambda/lambda.cmi \ - parsing/asttypes.cmi \ middle_end/clambda_primitives.cmi middle_end/clambda_primitives.cmx : \ typing/types.cmx \ - typing/primitive.cmx \ + utils/misc.cmx \ lambda/lambda.cmx \ - parsing/asttypes.cmi \ middle_end/clambda_primitives.cmi middle_end/clambda_primitives.cmi : \ typing/types.cmi \ - typing/primitive.cmi \ - lambda/lambda.cmi \ - parsing/asttypes.cmi -middle_end/compilation_unit.cmo : \ - utils/misc.cmi \ - middle_end/linkage_name.cmi \ - utils/int_replace_polymorphic_compare.cmi \ - utils/identifiable.cmi \ - typing/ident.cmi \ - middle_end/compilation_unit.cmi -middle_end/compilation_unit.cmx : \ - utils/misc.cmx \ - middle_end/linkage_name.cmx \ - utils/int_replace_polymorphic_compare.cmx \ - utils/identifiable.cmx \ - typing/ident.cmx \ - middle_end/compilation_unit.cmi -middle_end/compilation_unit.cmi : \ - middle_end/linkage_name.cmi \ - utils/identifiable.cmi \ - typing/ident.cmi + lambda/lambda.cmi middle_end/compilenv.cmo : \ utils/warnings.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ typing/path.cmi \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ - middle_end/linkage_name.cmi \ + utils/linkage_name.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ middle_end/flambda/export_info.cmi \ typing/env.cmi \ utils/config.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ file_formats/cmx_format.cmi \ - middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ middle_end/clambda.cmi \ middle_end/compilenv.cmi middle_end/compilenv.cmx : \ utils/warnings.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/simple_value_approx.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ typing/path.cmx \ utils/misc.cmx \ parsing/location.cmx \ utils/load_path.cmx \ - middle_end/linkage_name.cmx \ + utils/linkage_name.cmx \ + utils/import_info.cmx \ typing/ident.cmx \ middle_end/flambda/export_info.cmx \ typing/env.cmx \ utils/config.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ file_formats/cmx_format.cmi \ - middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ middle_end/clambda.cmx \ middle_end/compilenv.cmi middle_end/compilenv.cmi : \ - middle_end/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ - middle_end/linkage_name.cmi \ - typing/ident.cmi \ + lambda/lambda.cmi \ middle_end/flambda/export_info.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ file_formats/cmx_format.cmi \ - middle_end/flambda/base_types/closure_id.cmi \ middle_end/clambda.cmi middle_end/convert_primitives.cmo : \ lambda/printlambda.cmi \ + typing/primitive.cmi \ utils/misc.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ middle_end/clambda_primitives.cmi \ middle_end/convert_primitives.cmi middle_end/convert_primitives.cmx : \ lambda/printlambda.cmx \ + typing/primitive.cmx \ utils/misc.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ middle_end/clambda_primitives.cmx \ middle_end/convert_primitives.cmi middle_end/convert_primitives.cmi : \ @@ -3381,33 +3950,23 @@ middle_end/internal_variable_names.cmx : \ middle_end/internal_variable_names.cmi middle_end/internal_variable_names.cmi : \ lambda/lambda.cmi -middle_end/linkage_name.cmo : \ - utils/int_replace_polymorphic_compare.cmi \ - utils/identifiable.cmi \ - middle_end/linkage_name.cmi -middle_end/linkage_name.cmx : \ - utils/int_replace_polymorphic_compare.cmx \ - utils/identifiable.cmx \ - middle_end/linkage_name.cmi -middle_end/linkage_name.cmi : \ - utils/identifiable.cmi middle_end/printclambda.cmo : \ lambda/printlambda.cmi \ middle_end/printclambda_primitives.cmi \ + utils/misc.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ middle_end/clambda.cmi \ middle_end/backend_var.cmi \ - parsing/asttypes.cmi \ middle_end/printclambda.cmi middle_end/printclambda.cmx : \ lambda/printlambda.cmx \ middle_end/printclambda_primitives.cmx \ + utils/misc.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ middle_end/clambda.cmx \ middle_end/backend_var.cmx \ - parsing/asttypes.cmi \ middle_end/printclambda.cmi middle_end/printclambda.cmi : \ middle_end/clambda.cmi @@ -3416,53 +3975,46 @@ middle_end/printclambda_primitives.cmo : \ typing/primitive.cmi \ lambda/lambda.cmi \ middle_end/clambda_primitives.cmi \ - parsing/asttypes.cmi \ middle_end/printclambda_primitives.cmi middle_end/printclambda_primitives.cmx : \ lambda/printlambda.cmx \ typing/primitive.cmx \ lambda/lambda.cmx \ middle_end/clambda_primitives.cmx \ - parsing/asttypes.cmi \ middle_end/printclambda_primitives.cmi middle_end/printclambda_primitives.cmi : \ middle_end/clambda_primitives.cmi middle_end/semantics_of_primitives.cmo : \ + lambda/lambda.cmi \ middle_end/clambda_primitives.cmi \ middle_end/semantics_of_primitives.cmi middle_end/semantics_of_primitives.cmx : \ + lambda/lambda.cmx \ middle_end/clambda_primitives.cmx \ middle_end/semantics_of_primitives.cmi middle_end/semantics_of_primitives.cmi : \ middle_end/clambda_primitives.cmi -middle_end/symbol.cmo : \ +middle_end/symbol_utils.cmo : \ middle_end/variable.cmi \ - utils/misc.cmi \ - middle_end/linkage_name.cmi \ - utils/int_replace_polymorphic_compare.cmi \ - utils/identifiable.cmi \ - middle_end/compilation_unit.cmi \ - middle_end/symbol.cmi -middle_end/symbol.cmx : \ + utils/symbol.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/symbol_utils.cmi +middle_end/symbol_utils.cmx : \ middle_end/variable.cmx \ - utils/misc.cmx \ - middle_end/linkage_name.cmx \ - utils/int_replace_polymorphic_compare.cmx \ - utils/identifiable.cmx \ - middle_end/compilation_unit.cmx \ - middle_end/symbol.cmi -middle_end/symbol.cmi : \ + utils/symbol.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/symbol_utils.cmi +middle_end/symbol_utils.cmi : \ middle_end/variable.cmi \ - middle_end/linkage_name.cmi \ - utils/identifiable.cmi \ - middle_end/compilation_unit.cmi + utils/symbol.cmi \ + middle_end/flambda/base_types/closure_id.cmi middle_end/variable.cmo : \ utils/misc.cmi \ middle_end/internal_variable_names.cmi \ utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ typing/ident.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/variable.cmi middle_end/variable.cmx : \ utils/misc.cmx \ @@ -3470,69 +4022,93 @@ middle_end/variable.cmx : \ utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ typing/ident.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/variable.cmi middle_end/variable.cmi : \ middle_end/internal_variable_names.cmi \ utils/identifiable.cmi \ typing/ident.cmi \ - middle_end/compilation_unit.cmi + utils/compilation_unit.cmi lambda/debuginfo.cmo : \ + utils/zero_alloc_utils.cmi \ parsing/location.cmi \ utils/int_replace_polymorphic_compare.cmi \ typing/ident.cmi \ + utils/compilation_unit.cmi \ parsing/asttypes.cmi \ lambda/debuginfo.cmi lambda/debuginfo.cmx : \ + utils/zero_alloc_utils.cmx \ parsing/location.cmx \ utils/int_replace_polymorphic_compare.cmx \ typing/ident.cmx \ + utils/compilation_unit.cmx \ parsing/asttypes.cmi \ lambda/debuginfo.cmi lambda/debuginfo.cmi : \ + utils/zero_alloc_utils.cmi \ parsing/location.cmi \ typing/ident.cmi \ + utils/compilation_unit.cmi \ parsing/asttypes.cmi lambda/lambda.cmo : \ typing/types.cmi \ + typing/typedtree.cmi \ typing/primitive.cmi \ typing/path.cmi \ utils/misc.cmi \ parsing/longident.cmi \ + parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ + utils/config.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ lambda/lambda.cmi lambda/lambda.cmx : \ typing/types.cmx \ + typing/typedtree.cmx \ typing/primitive.cmx \ typing/path.cmx \ utils/misc.cmx \ parsing/longident.cmx \ + parsing/location.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ + utils/config.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ + parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ lambda/lambda.cmi lambda/lambda.cmi : \ typing/types.cmi \ + typing/typedtree.cmi \ + typing/subst.cmi \ typing/primitive.cmi \ typing/path.cmi \ + parsing/location.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ + utils/compilation_unit.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi lambda/matching.cmo : \ typing/types.cmi \ typing/typeopt.cmi \ typing/typedtree.cmi \ lambda/switch.cmi \ + utils/runtimetags.cmi \ typing/printpat.cmi \ lambda/printlambda.cmi \ - typing/primitive.cmi \ typing/predef.cmi \ typing/patterns.cmi \ typing/parmatch.cmi \ @@ -3540,6 +4116,7 @@ lambda/matching.cmo : \ parsing/longident.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ @@ -3552,9 +4129,9 @@ lambda/matching.cmx : \ typing/typeopt.cmx \ typing/typedtree.cmx \ lambda/switch.cmx \ + utils/runtimetags.cmx \ typing/printpat.cmx \ lambda/printlambda.cmx \ - typing/primitive.cmx \ typing/predef.cmx \ typing/patterns.cmx \ typing/parmatch.cmx \ @@ -3562,6 +4139,7 @@ lambda/matching.cmx : \ parsing/longident.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ @@ -3573,27 +4151,30 @@ lambda/matching.cmi : \ typing/typedtree.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ lambda/debuginfo.cmi lambda/printlambda.cmo : \ typing/types.cmi \ - typing/printtyp.cmi \ typing/primitive.cmi \ + utils/misc.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ lambda/debuginfo.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ lambda/printlambda.cmi lambda/printlambda.cmx : \ typing/types.cmx \ - typing/printtyp.cmx \ typing/primitive.cmx \ + utils/misc.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ lambda/debuginfo.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ parsing/asttypes.cmi \ lambda/printlambda.cmi @@ -3609,23 +4190,23 @@ lambda/simplif.cmo : \ utils/warnings.cmi \ lambda/tmc.cmi \ typing/primitive.cmi \ + utils/misc.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ lambda/debuginfo.cmi \ utils/clflags.cmi \ - parsing/asttypes.cmi \ lambda/simplif.cmi lambda/simplif.cmx : \ utils/warnings.cmx \ lambda/tmc.cmx \ typing/primitive.cmx \ + utils/misc.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ lambda/debuginfo.cmx \ utils/clflags.cmx \ - parsing/asttypes.cmi \ lambda/simplif.cmi lambda/simplif.cmi : \ lambda/lambda.cmi \ @@ -3641,37 +4222,114 @@ lambda/tmc.cmo : \ lambda/lambda.cmi \ typing/ident.cmi \ lambda/debuginfo.cmi \ - parsing/asttypes.cmi \ lambda/tmc.cmi lambda/tmc.cmx : \ utils/warnings.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ - lambda/debuginfo.cmx \ + lambda/debuginfo.cmx \ + lambda/tmc.cmi +lambda/tmc.cmi : \ + lambda/lambda.cmi +lambda/transl_array_comprehension.cmo : \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + lambda/transl_comprehension_utils.cmi \ + utils/targetint.cmi \ + lambda/printlambda.cmi \ + typing/predef.cmi \ + utils/misc.cmi \ + lambda/matching.cmi \ + lambda/lambda.cmi \ + typing/jkind.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + lambda/debuginfo.cmi \ + utils/clflags.cmi \ + parsing/asttypes.cmi \ + lambda/transl_array_comprehension.cmi +lambda/transl_array_comprehension.cmx : \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + lambda/transl_comprehension_utils.cmx \ + utils/targetint.cmx \ + lambda/printlambda.cmx \ + typing/predef.cmx \ + utils/misc.cmx \ + lambda/matching.cmx \ + lambda/lambda.cmx \ + typing/jkind.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + lambda/debuginfo.cmx \ + utils/clflags.cmx \ + parsing/asttypes.cmi \ + lambda/transl_array_comprehension.cmi +lambda/transl_array_comprehension.cmi : \ + typing/typedtree.cmi \ + lambda/lambda.cmi \ + typing/jkind.cmi \ + lambda/debuginfo.cmi +lambda/transl_comprehension_utils.cmo : \ + utils/targetint.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + lambda/transl_comprehension_utils.cmi +lambda/transl_comprehension_utils.cmx : \ + utils/targetint.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + lambda/transl_comprehension_utils.cmi +lambda/transl_comprehension_utils.cmi : \ + utils/targetint.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi +lambda/transl_list_comprehension.cmo : \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + lambda/transl_comprehension_utils.cmi \ + lambda/matching.cmi \ + lambda/lambda.cmi \ + typing/jkind.cmi \ + typing/ident.cmi \ + parsing/asttypes.cmi \ + lambda/transl_list_comprehension.cmi +lambda/transl_list_comprehension.cmx : \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + lambda/transl_comprehension_utils.cmx \ + lambda/matching.cmx \ + lambda/lambda.cmx \ + typing/jkind.cmx \ + typing/ident.cmx \ parsing/asttypes.cmi \ - lambda/tmc.cmi -lambda/tmc.cmi : \ - lambda/lambda.cmi + lambda/transl_list_comprehension.cmi +lambda/transl_list_comprehension.cmi : \ + typing/typedtree.cmi \ + lambda/lambda.cmi \ + typing/jkind.cmi \ + lambda/debuginfo.cmi lambda/translattribute.cmo : \ + utils/zero_alloc_utils.cmi \ utils/warnings.cmi \ typing/typedtree.cmi \ parsing/parsetree.cmi \ - utils/misc.cmi \ - parsing/longident.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ utils/config.cmi \ + parsing/builtin_attributes.cmi \ lambda/translattribute.cmi lambda/translattribute.cmx : \ + utils/zero_alloc_utils.cmx \ utils/warnings.cmx \ typing/typedtree.cmx \ parsing/parsetree.cmi \ - utils/misc.cmx \ - parsing/longident.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ utils/config.cmx \ + parsing/builtin_attributes.cmx \ lambda/translattribute.cmi lambda/translattribute.cmi : \ typing/typedtree.cmi \ @@ -3679,6 +4337,7 @@ lambda/translattribute.cmi : \ parsing/location.cmi \ lambda/lambda.cmi lambda/translclass.cmo : \ + typing/value_rec_types.cmi \ typing/types.cmi \ typing/typeopt.cmi \ typing/typedtree.cmi \ @@ -3688,6 +4347,7 @@ lambda/translclass.cmo : \ lambda/matching.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ @@ -3696,6 +4356,7 @@ lambda/translclass.cmo : \ parsing/asttypes.cmi \ lambda/translclass.cmi lambda/translclass.cmx : \ + typing/value_rec_types.cmi \ typing/types.cmx \ typing/typeopt.cmx \ typing/typedtree.cmx \ @@ -3705,6 +4366,7 @@ lambda/translclass.cmx : \ lambda/matching.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ @@ -3713,6 +4375,7 @@ lambda/translclass.cmx : \ parsing/asttypes.cmi \ lambda/translclass.cmi lambda/translclass.cmi : \ + typing/value_rec_types.cmi \ typing/typedtree.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ @@ -3720,69 +4383,90 @@ lambda/translclass.cmi : \ lambda/debuginfo.cmi \ parsing/asttypes.cmi lambda/translcore.cmo : \ + utils/zero_alloc_utils.cmi \ + lambda/value_rec_compiler.cmi \ typing/types.cmi \ typing/typeopt.cmi \ typing/typedtree.cmi \ typing/typecore.cmi \ lambda/translprim.cmi \ lambda/translobj.cmi \ + lambda/translmode.cmi \ lambda/translattribute.cmi \ + lambda/transl_list_comprehension.cmi \ + lambda/transl_array_comprehension.cmi \ + typing/subst.cmi \ typing/printtyp.cmi \ typing/primitive.cmi \ typing/predef.cmi \ + parsing/pprintast.cmi \ typing/path.cmi \ - parsing/parsetree.cmi \ - typing/parmatch.cmi \ + typing/mode.cmi \ utils/misc.cmi \ lambda/matching.cmi \ parsing/longident.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ + typing/ctype.cmi \ utils/config.cmi \ utils/clflags.cmi \ + parsing/builtin_attributes.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ lambda/translcore.cmi lambda/translcore.cmx : \ + utils/zero_alloc_utils.cmx \ + lambda/value_rec_compiler.cmx \ typing/types.cmx \ typing/typeopt.cmx \ typing/typedtree.cmx \ typing/typecore.cmx \ lambda/translprim.cmx \ lambda/translobj.cmx \ + lambda/translmode.cmx \ lambda/translattribute.cmx \ + lambda/transl_list_comprehension.cmx \ + lambda/transl_array_comprehension.cmx \ + typing/subst.cmx \ typing/printtyp.cmx \ typing/primitive.cmx \ typing/predef.cmx \ + parsing/pprintast.cmx \ typing/path.cmx \ - parsing/parsetree.cmi \ - typing/parmatch.cmx \ + typing/mode.cmx \ utils/misc.cmx \ lambda/matching.cmx \ parsing/longident.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ + typing/ctype.cmx \ utils/config.cmx \ utils/clflags.cmx \ + parsing/builtin_attributes.cmx \ typing/btype.cmx \ parsing/asttypes.cmi \ lambda/translcore.cmi lambda/translcore.cmi : \ + typing/types.cmi \ typing/typedtree.cmi \ - typing/path.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ parsing/asttypes.cmi lambda/translmod.cmo : \ + lambda/value_rec_compiler.cmi \ typing/types.cmi \ typing/typedtree.cmi \ lambda/translprim.cmi \ @@ -3790,21 +4474,26 @@ lambda/translmod.cmo : \ lambda/translcore.cmi \ lambda/translclass.cmi \ lambda/translattribute.cmi \ + typing/printtyp.cmi \ typing/primitive.cmi \ typing/predef.cmi \ typing/path.cmi \ typing/mtype.cmi \ utils/misc.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ typing/ctype.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ lambda/translmod.cmi lambda/translmod.cmx : \ + lambda/value_rec_compiler.cmx \ typing/types.cmx \ typing/typedtree.cmx \ lambda/translprim.cmx \ @@ -3812,162 +4501,282 @@ lambda/translmod.cmx : \ lambda/translcore.cmx \ lambda/translclass.cmx \ lambda/translattribute.cmx \ + typing/printtyp.cmx \ typing/primitive.cmx \ typing/predef.cmx \ typing/path.cmx \ typing/mtype.cmx \ utils/misc.cmx \ + parsing/longident.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ typing/ctype.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ parsing/asttypes.cmi \ lambda/translmod.cmi lambda/translmod.cmi : \ + typing/types.cmi \ typing/typedtree.cmi \ typing/primitive.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ - typing/ident.cmi + typing/jkind.cmi \ + typing/ident.cmi \ + utils/compilation_unit.cmi +lambda/translmode.cmo : \ + typing/mode.cmi \ + lambda/lambda.cmi \ + lambda/translmode.cmi +lambda/translmode.cmx : \ + typing/mode.cmx \ + lambda/lambda.cmx \ + lambda/translmode.cmi +lambda/translmode.cmi : \ + typing/mode.cmi \ + lambda/lambda.cmi lambda/translobj.cmo : \ - typing/primitive.cmi \ utils/misc.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ typing/env.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ utils/clflags.cmi \ typing/btype.cmi \ - parsing/asttypes.cmi \ lambda/translobj.cmi lambda/translobj.cmx : \ - typing/primitive.cmx \ utils/misc.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ typing/env.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ utils/clflags.cmx \ typing/btype.cmx \ - parsing/asttypes.cmi \ lambda/translobj.cmi lambda/translobj.cmi : \ lambda/lambda.cmi \ typing/ident.cmi \ - typing/env.cmi + typing/env.cmi \ + utils/compilation_unit.cmi lambda/translprim.cmo : \ typing/types.cmi \ typing/typeopt.cmi \ typing/typedtree.cmi \ + lambda/translmode.cmi \ + lambda/printlambda.cmi \ typing/primitive.cmi \ typing/predef.cmi \ typing/path.cmi \ + typing/mode.cmi \ utils/misc.cmi \ lambda/matching.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ - parsing/asttypes.cmi \ lambda/translprim.cmi lambda/translprim.cmx : \ typing/types.cmx \ typing/typeopt.cmx \ typing/typedtree.cmx \ + lambda/translmode.cmx \ + lambda/printlambda.cmx \ typing/primitive.cmx \ typing/predef.cmx \ typing/path.cmx \ + typing/mode.cmx \ utils/misc.cmx \ lambda/matching.cmx \ parsing/location.cmx \ lambda/lambda.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ - parsing/asttypes.cmi \ lambda/translprim.cmi lambda/translprim.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ typing/primitive.cmi \ typing/path.cmi \ + typing/mode.cmi \ parsing/location.cmi \ lambda/lambda.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ - typing/env.cmi + typing/env.cmi \ + utils/compilation_unit.cmi +lambda/value_rec_compiler.cmo : \ + typing/value_rec_types.cmi \ + utils/misc.cmi \ + utils/lazy_backtrack.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + lambda/debuginfo.cmi \ + lambda/value_rec_compiler.cmi +lambda/value_rec_compiler.cmx : \ + typing/value_rec_types.cmi \ + utils/misc.cmx \ + utils/lazy_backtrack.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + lambda/debuginfo.cmx \ + lambda/value_rec_compiler.cmi +lambda/value_rec_compiler.cmi : \ + typing/value_rec_types.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi file_formats/cmi_format.cmo : \ typing/types.cmi \ + typing/subst.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/import_info.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi file_formats/cmi_format.cmx : \ typing/types.cmx \ + typing/subst.cmx \ utils/misc.cmx \ parsing/location.cmx \ + utils/import_info.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ file_formats/cmi_format.cmi file_formats/cmi_format.cmi : \ typing/types.cmi \ - utils/misc.cmi + typing/subst.cmi \ + utils/misc.cmi \ + utils/import_info.cmi \ + utils/compilation_unit.cmi file_formats/cmo_format.cmi : \ + utils/import_info.cmi \ + typing/ident.cmi \ + utils/compilation_unit.cmi +file_formats/cms_format.cmo : \ + typing/types.cmi \ + typing/shape_reduce.cmi \ + typing/shape.cmi \ + parsing/parsetree.cmi \ utils/misc.cmi \ - typing/ident.cmi + parsing/longident.cmi \ + parsing/location.cmi \ + parsing/lexer.cmi \ + utils/config.cmi \ + utils/compilation_unit.cmi \ + file_formats/cmt_format.cmi \ + utils/clflags.cmi \ + file_formats/cms_format.cmi +file_formats/cms_format.cmx : \ + typing/types.cmx \ + typing/shape_reduce.cmx \ + typing/shape.cmx \ + parsing/parsetree.cmi \ + utils/misc.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + parsing/lexer.cmx \ + utils/config.cmx \ + utils/compilation_unit.cmx \ + file_formats/cmt_format.cmx \ + utils/clflags.cmx \ + file_formats/cms_format.cmi +file_formats/cms_format.cmi : \ + typing/shape_reduce.cmi \ + typing/shape.cmi \ + parsing/parsetree.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + utils/compilation_unit.cmi \ + file_formats/cmt_format.cmi file_formats/cmt_format.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ typing/tast_mapper.cmi \ + typing/tast_iterator.cmi \ + typing/shape_reduce.cmi \ typing/shape.cmi \ + typing/predef.cmi \ + typing/path.cmi \ utils/misc.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ parsing/lexer.cmi \ + utils/import_info.cmi \ + typing/ident.cmi \ typing/env.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi \ utils/clflags.cmi \ + typing/btype.cmi \ file_formats/cmt_format.cmi file_formats/cmt_format.cmx : \ typing/types.cmx \ typing/typedtree.cmx \ typing/tast_mapper.cmx \ + typing/tast_iterator.cmx \ + typing/shape_reduce.cmx \ typing/shape.cmx \ + typing/predef.cmx \ + typing/path.cmx \ utils/misc.cmx \ + parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ parsing/lexer.cmx \ + utils/import_info.cmx \ + typing/ident.cmx \ typing/env.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ file_formats/cmi_format.cmx \ utils/clflags.cmx \ + typing/btype.cmx \ file_formats/cmt_format.cmi file_formats/cmt_format.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ + typing/shape_reduce.cmi \ typing/shape.cmi \ - utils/misc.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ + utils/load_path.cmi \ + utils/import_info.cmi \ typing/env.cmi \ + utils/compilation_unit.cmi \ file_formats/cmi_format.cmi file_formats/cmx_format.cmi : \ - utils/misc.cmi \ + lambda/lambda.cmi \ + utils/import_info.cmi \ middle_end/flambda/export_info.cmi \ + utils/compilation_unit.cmi \ middle_end/clambda.cmi file_formats/cmxs_format.cmi : \ - utils/misc.cmi + utils/import_info.cmi \ + utils/compilation_unit.cmi file_formats/linear_format.cmo : \ utils/misc.cmi \ parsing/location.cmi \ asmcomp/linear.cmi \ utils/config.cmi \ + utils/compilation_unit.cmi \ asmcomp/cmm.cmi \ file_formats/linear_format.cmi file_formats/linear_format.cmx : \ @@ -3975,13 +4784,16 @@ file_formats/linear_format.cmx : \ parsing/location.cmx \ asmcomp/linear.cmx \ utils/config.cmx \ + utils/compilation_unit.cmx \ asmcomp/cmm.cmx \ file_formats/linear_format.cmi file_formats/linear_format.cmi : \ asmcomp/linear.cmi \ + utils/compilation_unit.cmi \ asmcomp/cmm.cmi middle_end/closure/closure.cmo : \ utils/warnings.cmi \ + utils/symbol.cmi \ lambda/switch.cmi \ lambda/simplif.cmi \ middle_end/semantics_of_primitives.cmi \ @@ -3989,21 +4801,24 @@ middle_end/closure/closure.cmo : \ utils/numbers.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/linkage_name.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ middle_end/convert_primitives.cmi \ + utils/config.cmi \ middle_end/compilenv.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ middle_end/clambda_primitives.cmi \ middle_end/clambda.cmi \ middle_end/backend_var.cmi \ middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ middle_end/closure/closure.cmi middle_end/closure/closure.cmx : \ utils/warnings.cmx \ + utils/symbol.cmx \ lambda/switch.cmx \ lambda/simplif.cmx \ middle_end/semantics_of_primitives.cmx \ @@ -4011,39 +4826,47 @@ middle_end/closure/closure.cmx : \ utils/numbers.cmx \ utils/misc.cmx \ parsing/location.cmx \ + utils/linkage_name.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ middle_end/convert_primitives.cmx \ + utils/config.cmx \ middle_end/compilenv.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ middle_end/clambda_primitives.cmx \ middle_end/clambda.cmx \ middle_end/backend_var.cmx \ middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ middle_end/closure/closure.cmi middle_end/closure/closure.cmi : \ lambda/lambda.cmi \ middle_end/clambda.cmi \ middle_end/backend_intf.cmi middle_end/closure/closure_middle_end.cmo : \ + utils/symbol.cmi \ middle_end/printclambda.cmi \ typing/path.cmi \ + utils/linkage_name.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ middle_end/compilenv.cmi \ + utils/compilation_unit.cmi \ middle_end/closure/closure.cmi \ utils/clflags.cmi \ middle_end/clambda.cmi \ middle_end/closure/closure_middle_end.cmi middle_end/closure/closure_middle_end.cmx : \ + utils/symbol.cmx \ middle_end/printclambda.cmx \ typing/path.cmx \ + utils/linkage_name.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ middle_end/compilenv.cmx \ + utils/compilation_unit.cmx \ middle_end/closure/closure.cmx \ utils/clflags.cmx \ middle_end/clambda.cmx \ @@ -4056,33 +4879,30 @@ middle_end/flambda/alias_analysis.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ utils/misc.cmi \ lambda/lambda.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/allocated_const.cmi \ middle_end/flambda/alias_analysis.cmi middle_end/flambda/alias_analysis.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ utils/misc.cmx \ lambda/lambda.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda.cmx \ - parsing/asttypes.cmi \ middle_end/flambda/allocated_const.cmx \ middle_end/flambda/alias_analysis.cmi middle_end/flambda/alias_analysis.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ lambda/lambda.cmi \ middle_end/flambda/flambda.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/allocated_const.cmi middle_end/flambda/allocated_const.cmo : \ utils/int_replace_polymorphic_compare.cmi \ @@ -4094,9 +4914,11 @@ middle_end/flambda/allocated_const.cmi : middle_end/flambda/augment_specialised_args.cmo : \ middle_end/variable.cmi \ middle_end/flambda/projection.cmi \ + lambda/printlambda.cmi \ middle_end/flambda/pass_wrapper.cmi \ middle_end/flambda/parameter.cmi \ utils/misc.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/inlining_cost.cmi \ @@ -4113,9 +4935,11 @@ middle_end/flambda/augment_specialised_args.cmo : \ middle_end/flambda/augment_specialised_args.cmx : \ middle_end/variable.cmx \ middle_end/flambda/projection.cmx \ + lambda/printlambda.cmx \ middle_end/flambda/pass_wrapper.cmx \ middle_end/flambda/parameter.cmx \ utils/misc.cmx \ + lambda/lambda.cmx \ middle_end/internal_variable_names.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/inlining_cost.cmx \ @@ -4132,6 +4956,7 @@ middle_end/flambda/augment_specialised_args.cmx : \ middle_end/flambda/augment_specialised_args.cmi : \ middle_end/variable.cmi \ middle_end/flambda/projection.cmi \ + lambda/lambda.cmi \ middle_end/flambda/inlining_cost.cmi \ middle_end/flambda/inline_and_simplify_aux.cmi \ middle_end/flambda/flambda.cmi @@ -4140,7 +4965,7 @@ middle_end/flambda/build_export_info.cmo : \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/traverse_for_exported_symbols.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ utils/misc.cmi \ @@ -4152,10 +4977,9 @@ middle_end/flambda/build_export_info.cmo : \ middle_end/flambda/export_info.cmi \ middle_end/flambda/base_types/export_id.cmi \ middle_end/compilenv.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ - middle_end/backend_intf.cmi \ middle_end/flambda/allocated_const.cmi \ middle_end/flambda/build_export_info.cmi middle_end/flambda/build_export_info.cmx : \ @@ -4163,7 +4987,7 @@ middle_end/flambda/build_export_info.cmx : \ middle_end/flambda/base_types/var_within_closure.cmx \ middle_end/flambda/traverse_for_exported_symbols.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/simple_value_approx.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ utils/misc.cmx \ @@ -4175,20 +4999,19 @@ middle_end/flambda/build_export_info.cmx : \ middle_end/flambda/export_info.cmx \ middle_end/flambda/base_types/export_id.cmx \ middle_end/compilenv.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ - middle_end/backend_intf.cmi \ middle_end/flambda/allocated_const.cmx \ middle_end/flambda/build_export_info.cmi middle_end/flambda/build_export_info.cmi : \ middle_end/flambda/flambda.cmi \ - middle_end/flambda/export_info.cmi \ - middle_end/backend_intf.cmi + middle_end/flambda/export_info.cmi middle_end/flambda/closure_conversion.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ lambda/simplif.cmi \ typing/predef.cmi \ @@ -4205,7 +5028,8 @@ middle_end/flambda/closure_conversion.cmo : \ middle_end/flambda/flambda.cmi \ lambda/debuginfo.cmi \ middle_end/convert_primitives.cmi \ - middle_end/compilation_unit.cmi \ + utils/config.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/flambda/closure_conversion_aux.cmi \ @@ -4216,7 +5040,8 @@ middle_end/flambda/closure_conversion.cmo : \ middle_end/flambda/closure_conversion.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ lambda/simplif.cmx \ typing/predef.cmx \ @@ -4233,7 +5058,8 @@ middle_end/flambda/closure_conversion.cmx : \ middle_end/flambda/flambda.cmx \ lambda/debuginfo.cmx \ middle_end/convert_primitives.cmx \ - middle_end/compilation_unit.cmx \ + utils/config.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/flambda/closure_conversion_aux.cmx \ @@ -4243,12 +5069,12 @@ middle_end/flambda/closure_conversion.cmx : \ middle_end/flambda/closure_conversion.cmi middle_end/flambda/closure_conversion.cmi : \ lambda/lambda.cmi \ - typing/ident.cmi \ middle_end/flambda/flambda.cmi \ + utils/compilation_unit.cmi \ middle_end/backend_intf.cmi middle_end/flambda/closure_conversion_aux.cmo : \ middle_end/variable.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ utils/numbers.cmi \ middle_end/flambda/base_types/mutable_variable.cmi \ @@ -4259,7 +5085,7 @@ middle_end/flambda/closure_conversion_aux.cmo : \ middle_end/flambda/closure_conversion_aux.cmi middle_end/flambda/closure_conversion_aux.cmx : \ middle_end/variable.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ utils/numbers.cmx \ middle_end/flambda/base_types/mutable_variable.cmx \ @@ -4270,7 +5096,7 @@ middle_end/flambda/closure_conversion_aux.cmx : \ middle_end/flambda/closure_conversion_aux.cmi middle_end/flambda/closure_conversion_aux.cmi : \ middle_end/variable.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/base_types/mutable_variable.cmi \ lambda/lambda.cmi \ @@ -4313,68 +5139,37 @@ middle_end/flambda/export_info.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/base_types/export_id.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/flambda/export_info.cmi middle_end/flambda/export_info.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/simple_value_approx.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ middle_end/flambda/flambda.cmx \ middle_end/flambda/base_types/export_id.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/flambda/export_info.cmi middle_end/flambda/export_info.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/base_types/export_id.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi -middle_end/flambda/export_info_for_pack.cmo : \ - middle_end/variable.cmi \ - middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ - middle_end/flambda/simple_value_approx.cmi \ - middle_end/flambda/base_types/set_of_closures_origin.cmi \ - middle_end/flambda/base_types/set_of_closures_id.cmi \ - middle_end/flambda/flambda_iterators.cmi \ - middle_end/flambda/flambda.cmi \ - middle_end/flambda/export_info.cmi \ - middle_end/flambda/base_types/export_id.cmi \ - middle_end/compilation_unit.cmi \ - middle_end/flambda/base_types/closure_id.cmi \ - middle_end/flambda/export_info_for_pack.cmi -middle_end/flambda/export_info_for_pack.cmx : \ - middle_end/variable.cmx \ - middle_end/flambda/base_types/var_within_closure.cmx \ - middle_end/symbol.cmx \ - middle_end/flambda/simple_value_approx.cmx \ - middle_end/flambda/base_types/set_of_closures_origin.cmx \ - middle_end/flambda/base_types/set_of_closures_id.cmx \ - middle_end/flambda/flambda_iterators.cmx \ - middle_end/flambda/flambda.cmx \ - middle_end/flambda/export_info.cmx \ - middle_end/flambda/base_types/export_id.cmx \ - middle_end/compilation_unit.cmx \ - middle_end/flambda/base_types/closure_id.cmx \ - middle_end/flambda/export_info_for_pack.cmi -middle_end/flambda/export_info_for_pack.cmi : \ - middle_end/flambda/export_info.cmi \ - middle_end/compilation_unit.cmi middle_end/flambda/extract_projections.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ @@ -4410,7 +5205,6 @@ middle_end/flambda/find_recursive_functions.cmo : \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda_utils.cmi \ middle_end/flambda/flambda.cmi \ - middle_end/backend_intf.cmi \ middle_end/flambda/find_recursive_functions.cmi middle_end/flambda/find_recursive_functions.cmx : \ middle_end/variable.cmx \ @@ -4418,16 +5212,14 @@ middle_end/flambda/find_recursive_functions.cmx : \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda_utils.cmx \ middle_end/flambda/flambda.cmx \ - middle_end/backend_intf.cmi \ middle_end/flambda/find_recursive_functions.cmi middle_end/flambda/find_recursive_functions.cmi : \ middle_end/variable.cmi \ - middle_end/flambda/flambda.cmi \ - middle_end/backend_intf.cmi + middle_end/flambda/flambda.cmi middle_end/flambda/flambda.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/base_types/set_of_closures_origin.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ @@ -4442,7 +5234,7 @@ middle_end/flambda/flambda.cmo : \ utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ lambda/debuginfo.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ @@ -4453,7 +5245,7 @@ middle_end/flambda/flambda.cmo : \ middle_end/flambda/flambda.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ middle_end/flambda/base_types/set_of_closures_origin.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ @@ -4468,7 +5260,7 @@ middle_end/flambda/flambda.cmx : \ utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ lambda/debuginfo.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ @@ -4479,7 +5271,7 @@ middle_end/flambda/flambda.cmx : \ middle_end/flambda/flambda.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/base_types/set_of_closures_origin.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ @@ -4499,7 +5291,7 @@ middle_end/flambda/flambda_invariants.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/base_types/set_of_closures_origin.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ @@ -4513,7 +5305,7 @@ middle_end/flambda/flambda_invariants.cmo : \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ lambda/debuginfo.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/clambda_primitives.cmi \ parsing/asttypes.cmi \ @@ -4523,7 +5315,7 @@ middle_end/flambda/flambda_invariants.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ middle_end/flambda/base_types/set_of_closures_origin.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ @@ -4537,7 +5329,7 @@ middle_end/flambda/flambda_invariants.cmx : \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ lambda/debuginfo.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/clambda_primitives.cmx \ parsing/asttypes.cmi \ @@ -4557,13 +5349,14 @@ middle_end/flambda/flambda_iterators.cmx : \ middle_end/flambda/flambda_iterators.cmi middle_end/flambda/flambda_iterators.cmi : \ middle_end/variable.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/flambda.cmi middle_end/flambda/flambda_middle_end.cmo : \ utils/warnings.cmi \ middle_end/variable.cmi \ middle_end/flambda/un_anf.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ middle_end/flambda/share_constants.cmi \ middle_end/flambda/remove_unused_program_constructs.cmi \ middle_end/flambda/remove_unused_closure_vars.cmi \ @@ -4572,7 +5365,7 @@ middle_end/flambda/flambda_middle_end.cmo : \ middle_end/printclambda.cmi \ utils/misc.cmi \ parsing/location.cmi \ - middle_end/linkage_name.cmi \ + utils/linkage_name.cmi \ middle_end/flambda/lift_let_to_initialize_symbol.cmi \ middle_end/flambda/lift_constants.cmi \ middle_end/flambda/lift_code.cmi \ @@ -4592,13 +5385,13 @@ middle_end/flambda/flambda_middle_end.cmo : \ utils/clflags.cmi \ middle_end/clambda.cmi \ middle_end/flambda/build_export_info.cmi \ - middle_end/backend_intf.cmi \ middle_end/flambda/flambda_middle_end.cmi middle_end/flambda/flambda_middle_end.cmx : \ utils/warnings.cmx \ middle_end/variable.cmx \ middle_end/flambda/un_anf.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ middle_end/flambda/share_constants.cmx \ middle_end/flambda/remove_unused_program_constructs.cmx \ middle_end/flambda/remove_unused_closure_vars.cmx \ @@ -4607,7 +5400,7 @@ middle_end/flambda/flambda_middle_end.cmx : \ middle_end/printclambda.cmx \ utils/misc.cmx \ parsing/location.cmx \ - middle_end/linkage_name.cmx \ + utils/linkage_name.cmx \ middle_end/flambda/lift_let_to_initialize_symbol.cmx \ middle_end/flambda/lift_constants.cmx \ middle_end/flambda/lift_code.cmx \ @@ -4627,7 +5420,6 @@ middle_end/flambda/flambda_middle_end.cmx : \ utils/clflags.cmx \ middle_end/clambda.cmx \ middle_end/flambda/build_export_info.cmx \ - middle_end/backend_intf.cmi \ middle_end/flambda/flambda_middle_end.cmi middle_end/flambda/flambda_middle_end.cmi : \ lambda/lambda.cmi \ @@ -4638,16 +5430,18 @@ middle_end/flambda/flambda_to_clambda.cmo : \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/un_anf.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ - typing/primitive.cmi \ + lambda/printlambda.cmi \ + middle_end/printclambda.cmi \ middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ middle_end/flambda/base_types/mutable_variable.cmi \ utils/misc.cmi \ - middle_end/linkage_name.cmi \ + utils/linkage_name.cmi \ lambda/lambda.cmi \ middle_end/flambda/initialize_symbol_to_let_symbol.cmi \ middle_end/flambda/flambda_utils.cmi \ @@ -4655,10 +5449,11 @@ middle_end/flambda/flambda_to_clambda.cmo : \ middle_end/flambda/export_info.cmi \ lambda/debuginfo.cmi \ middle_end/compilenv.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/closure_offsets.cmi \ middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ + middle_end/clambda_primitives.cmi \ middle_end/clambda.cmi \ middle_end/backend_var.cmi \ middle_end/flambda/allocated_const.cmi \ @@ -4668,16 +5463,18 @@ middle_end/flambda/flambda_to_clambda.cmx : \ middle_end/flambda/base_types/var_within_closure.cmx \ middle_end/flambda/un_anf.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ middle_end/flambda/simple_value_approx.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ - typing/primitive.cmx \ + lambda/printlambda.cmx \ + middle_end/printclambda.cmx \ middle_end/flambda/parameter.cmx \ utils/numbers.cmx \ middle_end/flambda/base_types/mutable_variable.cmx \ utils/misc.cmx \ - middle_end/linkage_name.cmx \ + utils/linkage_name.cmx \ lambda/lambda.cmx \ middle_end/flambda/initialize_symbol_to_let_symbol.cmx \ middle_end/flambda/flambda_utils.cmx \ @@ -4685,23 +5482,25 @@ middle_end/flambda/flambda_to_clambda.cmx : \ middle_end/flambda/export_info.cmx \ lambda/debuginfo.cmx \ middle_end/compilenv.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/closure_offsets.cmx \ middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ + middle_end/clambda_primitives.cmx \ middle_end/clambda.cmx \ middle_end/backend_var.cmx \ middle_end/flambda/allocated_const.cmx \ middle_end/flambda/flambda_to_clambda.cmi middle_end/flambda/flambda_to_clambda.cmi : \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/export_info.cmi \ middle_end/clambda.cmi middle_end/flambda/flambda_utils.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ lambda/switch.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ @@ -4716,7 +5515,7 @@ middle_end/flambda/flambda_utils.cmo : \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ lambda/debuginfo.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/clambda_primitives.cmi \ @@ -4726,7 +5525,8 @@ middle_end/flambda/flambda_utils.cmo : \ middle_end/flambda/flambda_utils.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ lambda/switch.cmx \ middle_end/flambda/base_types/static_exception.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ @@ -4741,7 +5541,7 @@ middle_end/flambda/flambda_utils.cmx : \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ lambda/debuginfo.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/clambda_primitives.cmx \ @@ -4752,19 +5552,21 @@ middle_end/flambda/flambda_utils.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ lambda/switch.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ middle_end/flambda/projection.cmi \ middle_end/flambda/parameter.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/base_types/closure_id.cmi middle_end/flambda/freshening.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/projection.cmi \ middle_end/flambda/parameter.cmi \ @@ -4780,7 +5582,8 @@ middle_end/flambda/freshening.cmo : \ middle_end/flambda/freshening.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ middle_end/flambda/projection.cmx \ middle_end/flambda/parameter.cmx \ @@ -4796,7 +5599,6 @@ middle_end/flambda/freshening.cmx : \ middle_end/flambda/freshening.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/base_types/mutable_variable.cmi \ middle_end/flambda/flambda.cmi \ @@ -4804,7 +5606,8 @@ middle_end/flambda/freshening.cmi : \ middle_end/flambda/import_approx.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ utils/misc.cmi \ @@ -4814,13 +5617,14 @@ middle_end/flambda/import_approx.cmo : \ middle_end/flambda/export_info.cmi \ middle_end/flambda/base_types/export_id.cmi \ middle_end/compilenv.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/flambda/import_approx.cmi middle_end/flambda/import_approx.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ middle_end/flambda/simple_value_approx.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ utils/misc.cmx \ @@ -4830,15 +5634,15 @@ middle_end/flambda/import_approx.cmx : \ middle_end/flambda/export_info.cmx \ middle_end/flambda/base_types/export_id.cmx \ middle_end/compilenv.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/flambda/import_approx.cmi middle_end/flambda/import_approx.cmi : \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi middle_end/flambda/inconstant_idents.cmo : \ middle_end/variable.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ @@ -4846,14 +5650,13 @@ middle_end/flambda/inconstant_idents.cmo : \ utils/identifiable.cmi \ middle_end/flambda/flambda_utils.cmi \ middle_end/flambda/flambda.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/inconstant_idents.cmi middle_end/flambda/inconstant_idents.cmx : \ middle_end/variable.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ middle_end/flambda/parameter.cmx \ utils/numbers.cmx \ @@ -4861,16 +5664,15 @@ middle_end/flambda/inconstant_idents.cmx : \ utils/identifiable.cmx \ middle_end/flambda/flambda_utils.cmx \ middle_end/flambda/flambda.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/inconstant_idents.cmi middle_end/flambda/inconstant_idents.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ middle_end/flambda/flambda.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/backend_intf.cmi middle_end/flambda/initialize_symbol_to_let_symbol.cmo : \ middle_end/variable.cmi \ @@ -4894,10 +5696,11 @@ middle_end/flambda/inline_and_simplify.cmo : \ middle_end/flambda/unbox_free_vars_of_closures.cmi \ middle_end/flambda/unbox_closures.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/simplify_primitives.cmi \ middle_end/flambda/simple_value_approx.cmi \ + middle_end/semantics_of_primitives.cmi \ middle_end/flambda/remove_unused_arguments.cmi \ middle_end/flambda/remove_free_vars_equal_to_args.cmi \ middle_end/flambda/projection.cmi \ @@ -4937,10 +5740,11 @@ middle_end/flambda/inline_and_simplify.cmx : \ middle_end/flambda/unbox_free_vars_of_closures.cmx \ middle_end/flambda/unbox_closures.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ middle_end/flambda/simplify_primitives.cmx \ middle_end/flambda/simple_value_approx.cmx \ + middle_end/semantics_of_primitives.cmx \ middle_end/flambda/remove_unused_arguments.cmx \ middle_end/flambda/remove_free_vars_equal_to_args.cmx \ middle_end/flambda/projection.cmx \ @@ -4980,7 +5784,7 @@ middle_end/flambda/inline_and_simplify.cmi : \ middle_end/flambda/inline_and_simplify_aux.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_origin.cmi \ @@ -4995,7 +5799,7 @@ middle_end/flambda/inline_and_simplify_aux.cmo : \ middle_end/flambda/flambda_utils.cmi \ middle_end/flambda/flambda.cmi \ lambda/debuginfo.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ @@ -5004,7 +5808,7 @@ middle_end/flambda/inline_and_simplify_aux.cmo : \ middle_end/flambda/inline_and_simplify_aux.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ middle_end/flambda/simple_value_approx.cmx \ middle_end/flambda/base_types/set_of_closures_origin.cmx \ @@ -5019,7 +5823,7 @@ middle_end/flambda/inline_and_simplify_aux.cmx : \ middle_end/flambda/flambda_utils.cmx \ middle_end/flambda/flambda.cmx \ lambda/debuginfo.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ @@ -5027,7 +5831,7 @@ middle_end/flambda/inline_and_simplify_aux.cmx : \ middle_end/flambda/inline_and_simplify_aux.cmi middle_end/flambda/inline_and_simplify_aux.cmi : \ middle_end/variable.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_origin.cmi \ @@ -5160,7 +5964,7 @@ middle_end/flambda/inlining_transforms.cmo : \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ lambda/debuginfo.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/flambda/inlining_transforms.cmi @@ -5180,7 +5984,7 @@ middle_end/flambda/inlining_transforms.cmx : \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ lambda/debuginfo.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/flambda/inlining_transforms.cmi @@ -5195,7 +5999,8 @@ middle_end/flambda/inlining_transforms.cmi : \ middle_end/flambda/base_types/closure_id.cmi middle_end/flambda/invariant_params.cmo : \ middle_end/variable.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ middle_end/flambda/parameter.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda_utils.cmi \ @@ -5203,11 +6008,11 @@ middle_end/flambda/invariant_params.cmo : \ middle_end/flambda/flambda.cmi \ middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ - middle_end/backend_intf.cmi \ middle_end/flambda/invariant_params.cmi middle_end/flambda/invariant_params.cmx : \ middle_end/variable.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ middle_end/flambda/parameter.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda_utils.cmx \ @@ -5215,31 +6020,27 @@ middle_end/flambda/invariant_params.cmx : \ middle_end/flambda/flambda.cmx \ middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ - middle_end/backend_intf.cmi \ middle_end/flambda/invariant_params.cmi middle_end/flambda/invariant_params.cmi : \ middle_end/variable.cmi \ - middle_end/flambda/flambda.cmi \ - middle_end/backend_intf.cmi + middle_end/flambda/flambda.cmi middle_end/flambda/lift_code.cmo : \ middle_end/variable.cmi \ - utils/strongly_connected_components.cmi \ middle_end/flambda/base_types/mutable_variable.cmi \ lambda/lambda.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/lift_code.cmi middle_end/flambda/lift_code.cmx : \ middle_end/variable.cmx \ - utils/strongly_connected_components.cmx \ middle_end/flambda/base_types/mutable_variable.cmx \ lambda/lambda.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/lift_code.cmi middle_end/flambda/lift_code.cmi : \ middle_end/variable.cmi \ @@ -5249,20 +6050,21 @@ middle_end/flambda/lift_constants.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ utils/strongly_connected_components.cmi \ middle_end/flambda/simple_value_approx.cmi \ utils/misc.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/inconstant_idents.cmi \ middle_end/flambda/flambda_utils.cmi \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/allocated_const.cmi \ middle_end/flambda/alias_analysis.cmi \ middle_end/flambda/lift_constants.cmi @@ -5270,20 +6072,21 @@ middle_end/flambda/lift_constants.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ utils/strongly_connected_components.cmx \ middle_end/flambda/simple_value_approx.cmx \ utils/misc.cmx \ + lambda/lambda.cmx \ middle_end/internal_variable_names.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/inconstant_idents.cmx \ middle_end/flambda/flambda_utils.cmx \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/allocated_const.cmx \ middle_end/flambda/alias_analysis.cmx \ middle_end/flambda/lift_constants.cmi @@ -5293,42 +6096,43 @@ middle_end/flambda/lift_constants.cmi : \ middle_end/flambda/lift_let_to_initialize_symbol.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ - middle_end/internal_variable_names.cmi \ + middle_end/symbol_utils.cmi \ + utils/symbol.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda_utils.cmi \ middle_end/flambda/flambda.cmi \ - lambda/debuginfo.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/lift_let_to_initialize_symbol.cmi middle_end/flambda/lift_let_to_initialize_symbol.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ - middle_end/internal_variable_names.cmx \ + middle_end/symbol_utils.cmx \ + utils/symbol.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda_utils.cmx \ middle_end/flambda/flambda.cmx \ - lambda/debuginfo.cmx \ - parsing/asttypes.cmi \ middle_end/flambda/lift_let_to_initialize_symbol.cmi middle_end/flambda/lift_let_to_initialize_symbol.cmi : \ middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi middle_end/flambda/parameter.cmo : \ middle_end/variable.cmi \ + lambda/printlambda.cmi \ + lambda/lambda.cmi \ utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ middle_end/flambda/parameter.cmi middle_end/flambda/parameter.cmx : \ middle_end/variable.cmx \ + lambda/printlambda.cmx \ + lambda/lambda.cmx \ utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ middle_end/flambda/parameter.cmi middle_end/flambda/parameter.cmi : \ middle_end/variable.cmi \ + lambda/lambda.cmi \ utils/identifiable.cmi \ - middle_end/compilation_unit.cmi + utils/compilation_unit.cmi middle_end/flambda/pass_wrapper.cmo : \ utils/int_replace_polymorphic_compare.cmi \ utils/clflags.cmi \ @@ -5341,6 +6145,7 @@ middle_end/flambda/pass_wrapper.cmi : middle_end/flambda/projection.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ + lambda/lambda.cmi \ utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ middle_end/flambda/base_types/closure_id.cmi \ @@ -5348,6 +6153,7 @@ middle_end/flambda/projection.cmo : \ middle_end/flambda/projection.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ + lambda/lambda.cmx \ utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ middle_end/flambda/base_types/closure_id.cmx \ @@ -5355,6 +6161,7 @@ middle_end/flambda/projection.cmx : \ middle_end/flambda/projection.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ + lambda/lambda.cmi \ utils/identifiable.cmi \ middle_end/flambda/base_types/closure_id.cmi middle_end/flambda/ref_to_variables.cmo : \ @@ -5365,7 +6172,6 @@ middle_end/flambda/ref_to_variables.cmo : \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/ref_to_variables.cmi middle_end/flambda/ref_to_variables.cmx : \ middle_end/variable.cmx \ @@ -5375,7 +6181,6 @@ middle_end/flambda/ref_to_variables.cmx : \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ - parsing/asttypes.cmi \ middle_end/flambda/ref_to_variables.cmi middle_end/flambda/ref_to_variables.cmi : \ middle_end/flambda/flambda.cmi @@ -5401,13 +6206,14 @@ middle_end/flambda/remove_unused_arguments.cmo : \ middle_end/variable.cmi \ middle_end/flambda/projection.cmi \ middle_end/flambda/parameter.cmi \ + lambda/lambda.cmi \ middle_end/flambda/invariant_params.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda_utils.cmi \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/find_recursive_functions.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ @@ -5416,20 +6222,20 @@ middle_end/flambda/remove_unused_arguments.cmx : \ middle_end/variable.cmx \ middle_end/flambda/projection.cmx \ middle_end/flambda/parameter.cmx \ + lambda/lambda.cmx \ middle_end/flambda/invariant_params.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda_utils.cmx \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ middle_end/flambda/find_recursive_functions.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ middle_end/flambda/remove_unused_arguments.cmi middle_end/flambda/remove_unused_arguments.cmi : \ - middle_end/flambda/flambda.cmi \ - middle_end/backend_intf.cmi + middle_end/flambda/flambda.cmi middle_end/flambda/remove_unused_closure_vars.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ @@ -5453,13 +6259,13 @@ middle_end/flambda/remove_unused_closure_vars.cmx : \ middle_end/flambda/remove_unused_closure_vars.cmi : \ middle_end/flambda/flambda.cmi middle_end/flambda/remove_unused_program_constructs.cmo : \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/effect_analysis.cmi \ middle_end/flambda/remove_unused_program_constructs.cmi middle_end/flambda/remove_unused_program_constructs.cmx : \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda.cmx \ middle_end/flambda/effect_analysis.cmx \ @@ -5467,13 +6273,13 @@ middle_end/flambda/remove_unused_program_constructs.cmx : \ middle_end/flambda/remove_unused_program_constructs.cmi : \ middle_end/flambda/flambda.cmi middle_end/flambda/share_constants.cmo : \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda_iterators.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/share_constants.cmi middle_end/flambda/share_constants.cmx : \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda_iterators.cmx \ middle_end/flambda/flambda.cmx \ @@ -5484,9 +6290,10 @@ middle_end/flambda/simple_value_approx.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/set_of_closures_origin.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ + lambda/printlambda.cmi \ middle_end/flambda/parameter.cmi \ utils/misc.cmi \ lambda/lambda.cmi \ @@ -5499,7 +6306,7 @@ middle_end/flambda/simple_value_approx.cmo : \ middle_end/flambda/base_types/export_id.cmi \ middle_end/flambda/effect_analysis.cmi \ lambda/debuginfo.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ @@ -5509,9 +6316,10 @@ middle_end/flambda/simple_value_approx.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/base_types/set_of_closures_origin.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ + lambda/printlambda.cmx \ middle_end/flambda/parameter.cmx \ utils/misc.cmx \ lambda/lambda.cmx \ @@ -5524,7 +6332,7 @@ middle_end/flambda/simple_value_approx.cmx : \ middle_end/flambda/base_types/export_id.cmx \ middle_end/flambda/effect_analysis.cmx \ lambda/debuginfo.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ @@ -5534,7 +6342,7 @@ middle_end/flambda/simple_value_approx.cmi : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/base_types/set_of_closures_origin.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ middle_end/flambda/parameter.cmi \ @@ -5591,7 +6399,7 @@ middle_end/flambda/simplify_common.cmi : \ middle_end/flambda/flambda.cmi middle_end/flambda/simplify_primitives.cmo : \ middle_end/flambda/base_types/tag.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simplify_common.cmi \ middle_end/flambda/simplify_boxed_integer_ops.cmi \ middle_end/flambda/simple_value_approx.cmi \ @@ -5603,11 +6411,10 @@ middle_end/flambda/simplify_primitives.cmo : \ middle_end/flambda/flambda.cmi \ utils/clflags.cmi \ middle_end/clambda_primitives.cmi \ - parsing/asttypes.cmi \ middle_end/flambda/simplify_primitives.cmi middle_end/flambda/simplify_primitives.cmx : \ middle_end/flambda/base_types/tag.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/simplify_common.cmx \ middle_end/flambda/simplify_boxed_integer_ops.cmx \ middle_end/flambda/simple_value_approx.cmx \ @@ -5619,7 +6426,6 @@ middle_end/flambda/simplify_primitives.cmx : \ middle_end/flambda/flambda.cmx \ utils/clflags.cmx \ middle_end/clambda_primitives.cmx \ - parsing/asttypes.cmi \ middle_end/flambda/simplify_primitives.cmi middle_end/flambda/simplify_primitives.cmi : \ middle_end/variable.cmi \ @@ -5631,7 +6437,7 @@ middle_end/flambda/simplify_primitives.cmi : \ middle_end/flambda/traverse_for_exported_symbols.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ utils/misc.cmi \ @@ -5639,13 +6445,13 @@ middle_end/flambda/traverse_for_exported_symbols.cmo : \ middle_end/flambda/flambda.cmi \ middle_end/flambda/export_info.cmi \ middle_end/flambda/base_types/export_id.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi \ middle_end/flambda/traverse_for_exported_symbols.cmi middle_end/flambda/traverse_for_exported_symbols.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/flambda/simple_value_approx.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmx \ utils/misc.cmx \ @@ -5653,12 +6459,12 @@ middle_end/flambda/traverse_for_exported_symbols.cmx : \ middle_end/flambda/flambda.cmx \ middle_end/flambda/export_info.cmx \ middle_end/flambda/base_types/export_id.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/closure_id.cmx \ middle_end/flambda/traverse_for_exported_symbols.cmi middle_end/flambda/traverse_for_exported_symbols.cmi : \ middle_end/flambda/base_types/var_within_closure.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/flambda/simple_value_approx.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi \ middle_end/flambda/flambda.cmi \ @@ -5666,7 +6472,7 @@ middle_end/flambda/traverse_for_exported_symbols.cmi : \ middle_end/flambda/base_types/export_id.cmi \ middle_end/flambda/base_types/closure_id.cmi middle_end/flambda/un_anf.cmo : \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/semantics_of_primitives.cmi \ middle_end/printclambda.cmi \ utils/misc.cmi \ @@ -5679,7 +6485,7 @@ middle_end/flambda/un_anf.cmo : \ parsing/asttypes.cmi \ middle_end/flambda/un_anf.cmi middle_end/flambda/un_anf.cmx : \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ middle_end/semantics_of_primitives.cmx \ middle_end/printclambda.cmx \ utils/misc.cmx \ @@ -5692,7 +6498,7 @@ middle_end/flambda/un_anf.cmx : \ parsing/asttypes.cmi \ middle_end/flambda/un_anf.cmi middle_end/flambda/un_anf.cmi : \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ middle_end/clambda.cmi middle_end/flambda/unbox_closures.cmo : \ middle_end/variable.cmi \ @@ -5762,7 +6568,6 @@ middle_end/flambda/unbox_specialised_args.cmo : \ middle_end/flambda/projection.cmi \ middle_end/flambda/invariant_params.cmi \ utils/int_replace_polymorphic_compare.cmi \ - middle_end/flambda/inline_and_simplify_aux.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/extract_projections.cmi \ utils/clflags.cmi \ @@ -5773,7 +6578,6 @@ middle_end/flambda/unbox_specialised_args.cmx : \ middle_end/flambda/projection.cmx \ middle_end/flambda/invariant_params.cmx \ utils/int_replace_polymorphic_compare.cmx \ - middle_end/flambda/inline_and_simplify_aux.cmx \ middle_end/flambda/flambda.cmx \ middle_end/flambda/extract_projections.cmx \ utils/clflags.cmx \ @@ -5795,7 +6599,7 @@ middle_end/flambda/base_types/closure_element.cmx : \ middle_end/flambda/base_types/closure_element.cmi : \ middle_end/variable.cmi \ utils/identifiable.cmi \ - middle_end/compilation_unit.cmi + utils/compilation_unit.cmi middle_end/flambda/base_types/closure_id.cmo : \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/base_types/closure_element.cmi \ @@ -5816,23 +6620,23 @@ middle_end/flambda/base_types/closure_origin.cmx : \ middle_end/flambda/base_types/closure_origin.cmi middle_end/flambda/base_types/closure_origin.cmi : \ utils/identifiable.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/closure_id.cmi middle_end/flambda/base_types/export_id.cmo : \ utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ middle_end/flambda/base_types/id_types.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/export_id.cmi middle_end/flambda/base_types/export_id.cmx : \ utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ middle_end/flambda/base_types/id_types.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/export_id.cmi middle_end/flambda/base_types/export_id.cmi : \ utils/identifiable.cmi \ - middle_end/compilation_unit.cmi + utils/compilation_unit.cmi middle_end/flambda/base_types/id_types.cmo : \ utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ @@ -5856,22 +6660,22 @@ middle_end/flambda/base_types/mutable_variable.cmi : \ middle_end/internal_variable_names.cmi \ utils/identifiable.cmi \ typing/ident.cmi \ - middle_end/compilation_unit.cmi + utils/compilation_unit.cmi middle_end/flambda/base_types/set_of_closures_id.cmo : \ utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ middle_end/flambda/base_types/id_types.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ middle_end/flambda/base_types/set_of_closures_id.cmi middle_end/flambda/base_types/set_of_closures_id.cmx : \ utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ middle_end/flambda/base_types/id_types.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ middle_end/flambda/base_types/set_of_closures_id.cmi middle_end/flambda/base_types/set_of_closures_id.cmi : \ utils/identifiable.cmi \ - middle_end/compilation_unit.cmi + utils/compilation_unit.cmi middle_end/flambda/base_types/set_of_closures_origin.cmo : \ middle_end/flambda/base_types/set_of_closures_id.cmi \ utils/int_replace_polymorphic_compare.cmi \ @@ -5883,7 +6687,7 @@ middle_end/flambda/base_types/set_of_closures_origin.cmx : \ middle_end/flambda/base_types/set_of_closures_origin.cmi : \ middle_end/flambda/base_types/set_of_closures_id.cmi \ utils/identifiable.cmi \ - middle_end/compilation_unit.cmi + utils/compilation_unit.cmi middle_end/flambda/base_types/static_exception.cmo : \ utils/numbers.cmi \ lambda/lambda.cmi \ @@ -5925,6 +6729,7 @@ driver/compenv.cmo : \ utils/profile.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ utils/config.cmi \ utils/clflags.cmi \ utils/ccomp.cmi \ @@ -5934,6 +6739,7 @@ driver/compenv.cmx : \ utils/profile.cmx \ utils/misc.cmx \ parsing/location.cmx \ + utils/language_extension.cmx \ utils/config.cmx \ utils/clflags.cmx \ utils/ccomp.cmx \ @@ -5951,8 +6757,10 @@ driver/compile.cmo : \ lambda/lambda.cmi \ bytecomp/emitcode.cmi \ driver/compile_common.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ bytecomp/bytegen.cmi \ + parsing/builtin_attributes.cmi \ driver/compile.cmi driver/compile.cmx : \ typing/typedtree.cmx \ @@ -5965,14 +6773,16 @@ driver/compile.cmx : \ lambda/lambda.cmx \ bytecomp/emitcode.cmx \ driver/compile_common.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ bytecomp/bytegen.cmx \ + parsing/builtin_attributes.cmx \ driver/compile.cmi driver/compile.cmi : \ typing/typedtree.cmi \ bytecomp/instruct.cmi \ - typing/ident.cmi \ driver/compile_common.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi driver/compile_common.cmo : \ utils/warnings.cmi \ @@ -5991,7 +6801,9 @@ driver/compile_common.cmo : \ typing/env.cmi \ utils/config.cmi \ driver/compmisc.cmi \ + utils/compilation_unit.cmi \ driver/compenv.cmi \ + file_formats/cmi_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ driver/compile_common.cmi @@ -6012,14 +6824,17 @@ driver/compile_common.cmx : \ typing/env.cmx \ utils/config.cmx \ driver/compmisc.cmx \ + utils/compilation_unit.cmx \ driver/compenv.cmx \ + file_formats/cmi_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ driver/compile_common.cmi driver/compile_common.cmi : \ typing/typedtree.cmi \ parsing/parsetree.cmi \ - typing/env.cmi + typing/env.cmi \ + utils/compilation_unit.cmi driver/compmisc.cmo : \ utils/warnings.cmi \ typing/types.cmi \ @@ -6069,6 +6884,7 @@ driver/main_args.cmo : \ utils/profile.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/language_extension.cmi \ utils/config.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ @@ -6078,6 +6894,7 @@ driver/main_args.cmx : \ utils/profile.cmx \ utils/misc.cmx \ parsing/location.cmx \ + utils/language_extension.cmx \ utils/config.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ @@ -6085,6 +6902,7 @@ driver/main_args.cmx : \ driver/main_args.cmi : driver/maindriver.cmo : \ utils/warnings.cmi \ + utils/symbol.cmi \ utils/profile.cmi \ driver/makedepend.cmi \ driver/main_args.cmi \ @@ -6100,6 +6918,7 @@ driver/maindriver.cmo : \ driver/maindriver.cmi driver/maindriver.cmx : \ utils/warnings.cmx \ + utils/symbol.cmx \ utils/profile.cmx \ driver/makedepend.cmx \ driver/main_args.cmx \ @@ -6122,6 +6941,7 @@ driver/makedepend.cmo : \ utils/misc.cmi \ parsing/location.cmi \ parsing/lexer.cmi \ + utils/language_extension.cmi \ parsing/depend.cmi \ utils/config.cmi \ driver/compenv.cmi \ @@ -6135,6 +6955,7 @@ driver/makedepend.cmx : \ utils/misc.cmx \ parsing/location.cmx \ parsing/lexer.cmx \ + utils/language_extension.cmx \ parsing/depend.cmx \ utils/config.cmx \ driver/compenv.cmx \ @@ -6155,6 +6976,7 @@ driver/optcompile.cmo : \ driver/compile_common.cmi \ middle_end/closure/closure_middle_end.cmi \ utils/clflags.cmi \ + parsing/builtin_attributes.cmi \ asmcomp/asmgen.cmi \ driver/optcompile.cmi driver/optcompile.cmx : \ @@ -6171,6 +6993,7 @@ driver/optcompile.cmx : \ driver/compile_common.cmx \ middle_end/closure/closure_middle_end.cmx \ utils/clflags.cmx \ + parsing/builtin_attributes.cmx \ asmcomp/asmgen.cmx \ driver/optcompile.cmi driver/optcompile.cmi : \ @@ -6203,7 +7026,6 @@ driver/optmaindriver.cmo : \ middle_end/flambda/import_approx.cmi \ utils/config.cmi \ driver/compmisc.cmi \ - middle_end/compilenv.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ middle_end/backend_intf.cmi \ @@ -6223,7 +7045,6 @@ driver/optmaindriver.cmx : \ middle_end/flambda/import_approx.cmx \ utils/config.cmx \ driver/compmisc.cmx \ - middle_end/compilenv.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ middle_end/backend_intf.cmi \ @@ -6265,14 +7086,18 @@ toplevel/expunge.cmo : \ bytecomp/symtable.cmi \ lambda/runtimedef.cmi \ utils/misc.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ + utils/compilation_unit.cmi \ bytecomp/bytesections.cmi \ toplevel/expunge.cmi toplevel/expunge.cmx : \ bytecomp/symtable.cmx \ lambda/runtimedef.cmx \ utils/misc.cmx \ + utils/import_info.cmx \ typing/ident.cmx \ + utils/compilation_unit.cmx \ bytecomp/bytesections.cmx \ toplevel/expunge.cmi toplevel/expunge.cmi : @@ -6287,12 +7112,16 @@ toplevel/genprintval.cmo : \ typing/oprint.cmi \ utils/misc.cmi \ parsing/longident.cmi \ + parsing/location.cmi \ parsing/lexer.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ typing/datarepr.cmi \ typing/ctype.cmi \ + utils/clflags.cmi \ typing/btype.cmi \ + parsing/asttypes.cmi \ toplevel/genprintval.cmi toplevel/genprintval.cmx : \ typing/types.cmx \ @@ -6305,12 +7134,16 @@ toplevel/genprintval.cmx : \ typing/oprint.cmx \ utils/misc.cmx \ parsing/longident.cmx \ + parsing/location.cmx \ parsing/lexer.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ typing/datarepr.cmx \ typing/ctype.cmx \ + utils/clflags.cmx \ typing/btype.cmx \ + parsing/asttypes.cmi \ toplevel/genprintval.cmi toplevel/genprintval.cmi : \ typing/types.cmi \ @@ -6340,6 +7173,7 @@ toplevel/topcommon.cmo : \ bytecomp/dll.cmi \ utils/config.cmi \ driver/compmisc.cmi \ + utils/compilation_unit.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ @@ -6368,6 +7202,7 @@ toplevel/topcommon.cmx : \ bytecomp/dll.cmx \ utils/config.cmx \ driver/compmisc.cmx \ + utils/compilation_unit.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ parsing/asttypes.cmi \ @@ -6383,9 +7218,11 @@ toplevel/topcommon.cmi : \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ toplevel/genprintval.cmi \ - typing/env.cmi + typing/env.cmi \ + utils/compilation_unit.cmi toplevel/topdirs.cmo : \ utils/warnings.cmi \ typing/types.cmi \ @@ -6400,6 +7237,7 @@ toplevel/topdirs.cmo : \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + typing/jkind.cmi \ typing/ident.cmi \ typing/env.cmi \ bytecomp/dll.cmi \ @@ -6425,6 +7263,7 @@ toplevel/topdirs.cmx : \ parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + typing/jkind.cmx \ typing/ident.cmx \ typing/env.cmx \ bytecomp/dll.cmx \ @@ -6488,17 +7327,17 @@ toplevel/topprinters.cmo : \ typing/types.cmi \ typing/predef.cmi \ typing/path.cmi \ + typing/mode.cmi \ typing/ident.cmi \ typing/ctype.cmi \ - parsing/asttypes.cmi \ toplevel/topprinters.cmi toplevel/topprinters.cmx : \ typing/types.cmx \ typing/predef.cmx \ typing/path.cmx \ + typing/mode.cmx \ typing/ident.cmx \ typing/ctype.cmx \ - parsing/asttypes.cmi \ toplevel/topprinters.cmi toplevel/topprinters.cmi : \ typing/types.cmi @@ -6524,6 +7363,7 @@ toplevel/byte/topeval.cmo : \ toplevel/topcommon.cmi \ bytecomp/symtable.cmi \ lambda/simplif.cmi \ + typing/shape_reduce.cmi \ typing/shape.cmi \ typing/printtyped.cmi \ typing/printtyp.cmi \ @@ -6545,6 +7385,7 @@ toplevel/byte/topeval.cmo : \ bytecomp/dll.cmi \ utils/config.cmi \ driver/compmisc.cmi \ + utils/compilation_unit.cmi \ file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytegen.cmi \ @@ -6559,6 +7400,7 @@ toplevel/byte/topeval.cmx : \ toplevel/topcommon.cmx \ bytecomp/symtable.cmx \ lambda/simplif.cmx \ + typing/shape_reduce.cmx \ typing/shape.cmx \ typing/printtyped.cmx \ typing/printtyp.cmx \ @@ -6580,6 +7422,7 @@ toplevel/byte/topeval.cmx : \ bytecomp/dll.cmx \ utils/config.cmx \ driver/compmisc.cmx \ + utils/compilation_unit.cmx \ file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytegen.cmx \ @@ -6633,7 +7476,6 @@ toplevel/byte/trace.cmo : \ bytecomp/meta.cmi \ parsing/longident.cmi \ typing/ctype.cmi \ - parsing/asttypes.cmi \ toplevel/byte/trace.cmi toplevel/byte/trace.cmx : \ typing/types.cmx \ @@ -6646,7 +7488,6 @@ toplevel/byte/trace.cmx : \ bytecomp/meta.cmx \ parsing/longident.cmx \ typing/ctype.cmx \ - parsing/asttypes.cmi \ toplevel/byte/trace.cmi toplevel/byte/trace.cmi : \ typing/types.cmi \ @@ -6662,7 +7503,9 @@ toplevel/native/topeval.cmo : \ lambda/translmod.cmi \ toplevel/native/tophooks.cmi \ toplevel/topcommon.cmi \ + utils/symbol.cmi \ lambda/simplif.cmi \ + typing/shape_reduce.cmi \ typing/shape.cmi \ typing/printtyped.cmi \ typing/printtyp.cmi \ @@ -6670,9 +7513,11 @@ toplevel/native/topeval.cmo : \ typing/predef.cmi \ parsing/parsetree.cmi \ typing/outcometree.cmi \ + typing/mode.cmi \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + utils/linkage_name.cmi \ lambda/lambda.cmi \ typing/includemod.cmi \ typing/ident.cmi \ @@ -6680,6 +7525,7 @@ toplevel/native/topeval.cmo : \ utils/config.cmi \ driver/compmisc.cmi \ middle_end/compilenv.cmi \ + utils/compilation_unit.cmi \ utils/clflags.cmi \ asmcomp/asmlink.cmi \ toplevel/native/topeval.cmi @@ -6692,7 +7538,9 @@ toplevel/native/topeval.cmx : \ lambda/translmod.cmx \ toplevel/native/tophooks.cmx \ toplevel/topcommon.cmx \ + utils/symbol.cmx \ lambda/simplif.cmx \ + typing/shape_reduce.cmx \ typing/shape.cmx \ typing/printtyped.cmx \ typing/printtyp.cmx \ @@ -6700,9 +7548,11 @@ toplevel/native/topeval.cmx : \ typing/predef.cmx \ parsing/parsetree.cmi \ typing/outcometree.cmi \ + typing/mode.cmx \ utils/misc.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + utils/linkage_name.cmx \ lambda/lambda.cmx \ typing/includemod.cmx \ typing/ident.cmx \ @@ -6710,6 +7560,7 @@ toplevel/native/topeval.cmx : \ utils/config.cmx \ driver/compmisc.cmx \ middle_end/compilenv.cmx \ + utils/compilation_unit.cmx \ utils/clflags.cmx \ asmcomp/asmlink.cmx \ toplevel/native/topeval.cmi @@ -6724,7 +7575,6 @@ toplevel/native/tophooks.cmo : \ middle_end/flambda/import_approx.cmi \ middle_end/flambda/flambda_middle_end.cmi \ utils/config.cmi \ - middle_end/compilenv.cmi \ middle_end/closure/closure_middle_end.cmi \ utils/clflags.cmi \ middle_end/backend_intf.cmi \ @@ -6740,7 +7590,6 @@ toplevel/native/tophooks.cmx : \ middle_end/flambda/import_approx.cmx \ middle_end/flambda/flambda_middle_end.cmx \ utils/config.cmx \ - middle_end/compilenv.cmx \ middle_end/closure/closure_middle_end.cmx \ utils/clflags.cmx \ middle_end/backend_intf.cmi \ @@ -6916,6 +7765,18 @@ tools/cvt_emit.cmo : \ tools/cvt_emit.cmx : \ tools/cvt_emit.cmi tools/cvt_emit.cmi : +tools/debug_printers.cmo : \ + typing/printtyp.cmi \ + typing/path.cmi \ + typing/jkind.cmi \ + typing/ident.cmi \ + typing/ctype.cmi +tools/debug_printers.cmx : \ + typing/printtyp.cmx \ + typing/path.cmx \ + typing/jkind.cmx \ + typing/ident.cmx \ + typing/ctype.cmx tools/dumpobj.cmo : \ bytecomp/symtable.cmi \ tools/opnames.cmi \ @@ -6961,6 +7822,7 @@ tools/lintapidiff.cmo : \ parsing/parse.cmi \ utils/misc.cmi \ parsing/location.cmi \ + parsing/jane_syntax.cmi \ typing/ident.cmi \ tools/lintapidiff.cmi tools/lintapidiff.cmx : \ @@ -6971,6 +7833,7 @@ tools/lintapidiff.cmx : \ parsing/parse.cmx \ utils/misc.cmx \ parsing/location.cmx \ + parsing/jane_syntax.cmx \ typing/ident.cmx \ tools/lintapidiff.cmi tools/lintapidiff.cmi : @@ -6980,36 +7843,48 @@ tools/make_opcodes.cmx : \ tools/make_opcodes.cmi tools/make_opcodes.cmi : tools/objinfo.cmo : \ + typing/typedtree.cmi \ bytecomp/symtable.cmi \ - middle_end/symbol.cmi \ + utils/symbol.cmi \ + typing/shape_reduce.cmi \ typing/shape.cmi \ middle_end/printclambda.cmi \ + parsing/pprintast.cmi \ utils/misc.cmi \ - middle_end/linkage_name.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + utils/import_info.cmi \ typing/ident.cmi \ middle_end/flambda/export_info.cmi \ - middle_end/compilation_unit.cmi \ + utils/compilation_unit.cmi \ file_formats/cmxs_format.cmi \ file_formats/cmx_format.cmi \ file_formats/cmt_format.cmi \ + file_formats/cms_format.cmi \ file_formats/cmo_format.cmi \ file_formats/cmi_format.cmi \ bytecomp/bytesections.cmi \ utils/binutils.cmi \ tools/objinfo.cmi tools/objinfo.cmx : \ + typing/typedtree.cmx \ bytecomp/symtable.cmx \ - middle_end/symbol.cmx \ + utils/symbol.cmx \ + typing/shape_reduce.cmx \ typing/shape.cmx \ middle_end/printclambda.cmx \ + parsing/pprintast.cmx \ utils/misc.cmx \ - middle_end/linkage_name.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + utils/import_info.cmx \ typing/ident.cmx \ middle_end/flambda/export_info.cmx \ - middle_end/compilation_unit.cmx \ + utils/compilation_unit.cmx \ file_formats/cmxs_format.cmi \ file_formats/cmx_format.cmi \ file_formats/cmt_format.cmx \ + file_formats/cms_format.cmx \ file_formats/cmo_format.cmi \ file_formats/cmi_format.cmx \ bytecomp/bytesections.cmx \ @@ -7022,8 +7897,10 @@ tools/ocamlcmt.cmo : \ parsing/pprintast.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + utils/import_info.cmi \ typing/envaux.cmi \ driver/compmisc.cmi \ + utils/compilation_unit.cmi \ file_formats/cmt_format.cmi \ typing/cmt2annot.cmi \ utils/clflags.cmi \ @@ -7035,8 +7912,10 @@ tools/ocamlcmt.cmx : \ parsing/pprintast.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + utils/import_info.cmx \ typing/envaux.cmx \ driver/compmisc.cmx \ + utils/compilation_unit.cmx \ file_formats/cmt_format.cmx \ typing/cmt2annot.cmx \ utils/clflags.cmx \ @@ -7101,12 +7980,14 @@ tools/ocamlprof.cmo : \ parsing/parsetree.cmi \ parsing/parse.cmi \ parsing/location.cmi \ + parsing/jane_syntax.cmi \ tools/ocamlprof.cmi tools/ocamlprof.cmx : \ utils/warnings.cmx \ parsing/parsetree.cmi \ parsing/parse.cmx \ parsing/location.cmx \ + parsing/jane_syntax.cmx \ tools/ocamlprof.cmi tools/ocamlprof.cmi : tools/ocamltex.cmo : \ diff --git a/.gitattributes b/.gitattributes index 18b5a6ee4f9..0f0445cc7f9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -193,7 +193,7 @@ tools/ocaml-objcopy-macosx text eol=lf tools/ocamlsize text eol=lf tools/pre-commit-githook text eol=lf tools/markdown-add-pr-links.sh text eol=lf -runtime/caml/sizeclasses.h typo.missing-header typo.white-at-eol +runtime/caml/sizeclasses.h typo.missing-header # Tests which include references spanning multiple lines fail with \r\n # endings, so use \n endings only, even on Windows. diff --git a/.gitignore b/.gitignore index 2bc1b7b4c7c..57120bb4574 100644 --- a/.gitignore +++ b/.gitignore @@ -92,6 +92,12 @@ META /debugger/debugger_parser.output /debugger/ocamldebug +/debugger4/debugger_lexer.ml +/debugger4/debugger_parser.ml +/debugger4/debugger_parser.mli +/debugger4/debugger_parser.output +/debugger4/ocamldebug + /emacs/ocamltags /emacs/*.elc @@ -358,3 +364,6 @@ META /yacc/.gdb_history /otherlibs/dynlink/natdynlinkops + +dune.runtime_selection +/otherlibs/dune diff --git a/Changes b/Changes index d335d91ee63..4a957304d37 100644 --- a/Changes +++ b/Changes @@ -30,6 +30,12 @@ OCaml 5.1.0 (14 September 2023) (David Allsopp, review by Xavier Leroy, Guillaume Munch-Maccagnoni and Gabriel Scherer) +- #12551, #12608, #12782, #12596: Overhaul of recursive value compilation. + Non-function recursive bindings are now forbidden from Lambda onwards, + and compiled using a new Value_rec_compiler module. + (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer, + Stefan Muenzel and Nathanaëlle Courant) + ### Standard library: - #12006, #12064: Add `Marshal.Compression` flag to `Marshal.to_*` functions. @@ -741,6 +747,12 @@ Some of those changes will benefit all OCaml packages. bytecode executable (`ocamlc -custom`). (Antonin Décimo, review by Xavier Leroy) +- #12508 : Add compiler-side support for project-wide occurrences in Merlin, by + generating index tables of all identifier occurrences. This extra data in .cmt + files is only added when the new flag -bin-annot-occurrences is passed. + (Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas + Refis, review by Florian Angeletti, Gabriel Scherer and Thomas Refis) + ### Build system: - #11844: Reduce verbosity of `make` logs by printing program invocations in diff --git a/HACKING.jst.adoc b/HACKING.jst.adoc index 90e3e459fba..ee99b3c2427 100644 --- a/HACKING.jst.adoc +++ b/HACKING.jst.adoc @@ -123,4 +123,4 @@ Then build the compiler — the following command will build the compiler us We can now benchmark our compiler against `typecore.ml`. The following `_bootinstall` is built using the opam switch and has FP enabled. $ cd _build/main - $ perf stat -r 5 ../_bootinstall/bin/ocamlc.opt -strict-sequence -principal -w +a-4-9-40-41-42-44-45-48-66-70 -warn-error A -bin-annot -safe-string -strict-formats -w -67 -g -bin-annot -I .ocamlcommon.objs/byte -I ../install/runtime_stdlib/lib/ocaml_runtime_stdlib/ -intf-suffix .ml -no-alias-deps -o .ocamlcommon.objs/byte/typecore.cmo -c -impl typecore.ml + $ perf stat -r 5 ../_bootinstall/bin/ocamlc.opt -strict-sequence -principal -w +a-4-9-40-41-42-44-45-48-66-70 -warn-error A -bin-annot -safe-string -strict-formats -w -67 -g -bin-annot -I .ocamlcommon.objs/byte -I ../runtime_stdlib_install/lib/ocaml_runtime_stdlib/ -intf-suffix .ml -no-alias-deps -o .ocamlcommon.objs/byte/typecore.cmo -c -impl typecore.ml diff --git a/Makefile b/Makefile index 060981be973..42b54b70888 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ defaultentry: $(DEFAULT_BUILD_TARGET) include stdlib/StdlibModules -CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims runtime/primitives +CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims $(RUNTIME_DIR)/primitives CAMLOPT=$(OCAMLRUN) ./ocamlopt$(EXE) $(STDLIBFLAGS) -I otherlibs/dynlink ARCHES=amd64 arm64 power s390x riscv VPATH = utils parsing typing bytecomp file_formats lambda middle_end \ @@ -84,11 +84,11 @@ utils/config_main.ml: utils/config.generated.ml utils/config.common.ml reconfigure: ac_read_git_config=true ./configure $(CONFIGURE_ARGS) -utils/domainstate.ml: utils/domainstate.ml.c runtime/caml/domain_state.tbl - $(V_GEN)$(CPP) -I runtime/caml $< > $@ +utils/domainstate.ml: utils/domainstate.ml.c $(RUNTIME_DIR)/caml/domain_state.tbl + $(V_GEN)$(CPP) -I $(RUNTIME_DIR)/caml $< > $@ -utils/domainstate.mli: utils/domainstate.mli.c runtime/caml/domain_state.tbl - $(V_GEN)$(CPP) -I runtime/caml $< > $@ +utils/domainstate.mli: utils/domainstate.mli.c $(RUNTIME_DIR)/caml/domain_state.tbl + $(V_GEN)$(CPP) -I $(RUNTIME_DIR)/caml $< > $@ configure: tools/autogen configure.ac aclocal.m4 build-aux/ocaml_version.m4 $< @@ -114,11 +114,7 @@ TOOLS_TO_INSTALL_NAT = ocamldep ocamlobjinfo # Tools to be compiled to bytecode only, then installed TOOLS_TO_INSTALL_BYT = \ - ocamlcmt ocamlprof ocamlcp ocamlmklib ocamlmktop - -ifeq "$(NATIVE_COMPILER)" "true" -TOOLS_TO_INSTALL_BYT += ocamloptp -endif + ocamlcmt ocamlmklib ocamlmktop # Clean should remove tools/ocamloptp etc. unconditionally because # the configuration is not available during clean so we don't @@ -168,7 +164,7 @@ OCAML_NATIVE_PROGRAMS = ocamlnat tools/lintapidiff.opt $(foreach PROGRAM, $(OCAML_NATIVE_PROGRAMS),\ $(eval $(call OCAML_NATIVE_PROGRAM,$(PROGRAM)))) -USE_RUNTIME_PRIMS = -use-prims ../runtime/primitives +USE_RUNTIME_PRIMS = -use-prims ../$(RUNTIME_DIR)/primitives USE_STDLIB = -nostdlib -I ../stdlib FLEXDLL_OBJECTS = \ @@ -180,7 +176,7 @@ FLEXDLL_SOURCE_FILES = \ $(wildcard $(FLEXDLL_SOURCES)/*.c) $(wildcard $(FLEXDLL_SOURCES)/*.h) \ $(wildcard $(FLEXDLL_SOURCES)/*.ml) -boot/ocamlruns$(EXE): runtime/ocamlruns$(EXE) +boot/ocamlruns$(EXE): $(RUNTIME_DIR)/ocamlruns$(EXE) cp $< $@ boot/flexlink.byte$(EXE): $(FLEXDLL_SOURCE_FILES) @@ -195,20 +191,20 @@ boot/flexlink.byte$(EXE): $(FLEXDLL_SOURCE_FILES) # The process depends on whether FlexDLL is also being bootstrapped. # Normal procedure: # - Build the runtime -# - Build the standard library using runtime/ocamlrun +# - Build the standard library using $(RUNTIME_DIR)/ocamlrun # FlexDLL procedure: # - Build ocamlruns # - Build the standard library using boot/ocamlruns # - Build flexlink and FlexDLL support objects # - Build the runtime -# runtime/ocamlrun is then installed to boot/ocamlrun and the stdlib artefacts +# $(RUNTIME_DIR)/ocamlrun is then installed to boot/ocamlrun and the stdlib artefacts # are copied to boot/ .PHONY: coldstart coldstart: $(COLDSTART_DEPS) ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" $(MAKE) runtime-all $(MAKE) -C stdlib \ - OCAMLRUN='$$(ROOTDIR)/runtime/ocamlrun$(EXE)' \ + OCAMLRUN='$$(ROOTDIR)/$(RUNTIME_DIR)/ocamlrun$(EXE)' \ CAMLC='$$(BOOT_OCAMLC) $(USE_RUNTIME_PRIMS)' all else $(MAKE) -C stdlib OCAMLRUN='$$(ROOTDIR)/boot/ocamlruns$(EXE)' \ @@ -217,10 +213,10 @@ else $(MAKE) runtime-all endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" rm -f boot/ocamlrun$(EXE) - cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) + cp $(RUNTIME_DIR)/ocamlrun$(EXE) boot/ocamlrun$(EXE) cd boot; rm -f $(LIBFILES) cd stdlib; cp $(LIBFILES) ../boot - cd boot; $(LN) ../runtime/libcamlrun.$(A) . + cd boot; $(LN) ../$(RUNTIME_DIR)/libcamlrun.$(A) . # Recompile the core system using the bootstrap compiler .PHONY: coreall @@ -277,7 +273,7 @@ promote-cross: promote-common promote: PROMOTE = $(OCAMLRUN) tools/stripdebug -all promote: promote-common rm -f boot/ocamlrun$(EXE) - cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) + cp $(RUNTIME_DIR)/ocamlrun$(EXE) boot/ocamlrun$(EXE) # Compile the native-code compiler .PHONY: opt-core @@ -319,16 +315,16 @@ ifeq "$(FLAT_FLOAT_ARRAY)" "true" coreboot: # Promote the new compiler but keep the old runtime # This compiler runs on boot/ocamlrun and produces bytecode for -# runtime/ocamlrun +# $(RUNTIME_DIR)/ocamlrun $(MAKE) promote-cross -# Rebuild ocamlc and ocamllex (run on runtime/ocamlrun) +# Rebuild ocamlc and ocamllex (run on $(RUNTIME_DIR)/ocamlrun) # utils/config.ml will have the fixed bootstrap configuration $(MAKE) partialclean $(MAKE) IN_COREBOOT_CYCLE=true ocamlc ocamllex ocamltools -# Rebuild the library (using runtime/ocamlrun ./ocamlc) +# Rebuild the library (using $(RUNTIME_DIR)/ocamlrun ./ocamlc) $(MAKE) library-cross # Promote the new compiler and the new runtime - $(MAKE) OCAMLRUN=runtime/ocamlrun$(EXE) promote + $(MAKE) OCAMLRUN=$(RUNTIME_DIR)/ocamlrun$(EXE) promote # Rebuild the core system # utils/config.ml must still have the fixed bootstrap configuration $(MAKE) partialclean @@ -413,7 +409,7 @@ flexlink: @false ifeq "$(wildcard ocamlopt.opt$(EXE))" "" - FLEXLINK_OCAMLOPT=../runtime/ocamlrun$(EXE) ../ocamlopt$(EXE) + FLEXLINK_OCAMLOPT=../$(RUNTIME_DIR)/ocamlrun$(EXE) ../ocamlopt$(EXE) else FLEXLINK_OCAMLOPT=../ocamlopt.opt$(EXE) endif @@ -517,7 +513,7 @@ TOPFLAGS ?= OC_TOPFLAGS = $(STDLIBFLAGS) -I toplevel -noinit $(TOPINCLUDES) $(TOPFLAGS) # Note: Beware that, since this rule begins with a coldstart, both -# boot/ocamlrun and runtime/ocamlrun will be the same when the toplevel +# boot/ocamlrun and $(RUNTIME_DIR)/ocamlrun will be the same when the toplevel # is run. .PHONY: runtop runtop: @@ -548,8 +544,8 @@ beforedepend:: parsing/lexer.ml # The predefined exceptions and primitives -lambda/runtimedef.ml: lambda/generate_runtimedef.sh runtime/caml/fail.h \ - runtime/primitives +lambda/runtimedef.ml: lambda/generate_runtimedef.sh $(RUNTIME_DIR)/caml/fail.h \ + $(RUNTIME_DIR)/primitives $(V_GEN)$^ > $@ partialclean:: @@ -607,9 +603,79 @@ expunge_MODULES = toplevel/expunge partialclean:: rm -f expunge expunge.exe -# The runtime system +# Runtime system source files (v4) + +runtime4_COMMON_C_SOURCES = \ + afl \ + alloc \ + array \ + backtrace \ + bigarray \ + callback \ + clambda_checks \ + codefrag \ + compact \ + compare \ + custom \ + debugger \ + domain \ + dynlink \ + eventlog \ + extern \ + finalise \ + fix_code \ + floats \ + freelist \ + gc_ctrl \ + globroots \ + hash \ + instrtrace \ + intern \ + ints \ + io \ + lexing \ + main \ + major_gc \ + md5 \ + memory \ + memprof \ + meta \ + minor_gc \ + misc \ + obj \ + parsing \ + printexc \ + prng \ + signals \ + simd \ + float32 \ + skiplist \ + startup_aux \ + str \ + sys \ + $(UNIX_OR_WIN32) \ + weak + +runtime4_BYTECODE_ONLY_C_SOURCES = \ + backtrace_byt \ + fail_byt \ + fix_code \ + interp \ + roots_byt \ + signals_byt \ + stacks \ + startup_byt + +runtime4_NATIVE_ONLY_C_SOURCES = \ + backtrace_nat \ + clambda_checks \ + dynlink_nat \ + fail_nat \ + roots_nat \ + startup_nat \ + signals_nat -## Lists of source files +# Runtime system source files (v5) runtime_COMMON_C_SOURCES = \ addrmap \ @@ -625,7 +691,6 @@ runtime_COMMON_C_SOURCES = \ debugger \ domain \ dynlink \ - eventlog \ extern \ fiber \ finalise \ @@ -653,7 +718,11 @@ runtime_COMMON_C_SOURCES = \ printexc \ prng \ roots \ + runtime_events \ + shared_heap \ signals \ + simd \ + float32 \ skiplist \ startup_aux \ str \ @@ -668,9 +737,6 @@ runtime_BYTECODE_ONLY_C_SOURCES = \ fix_code \ interp \ startup_byt -runtime_BYTECODE_C_SOURCES = \ - $(runtime_COMMON_C_SOURCES:%=runtime/%.c) \ - $(runtime_BYTECODE_ONLY_C_SOURCES:%=runtime/%.c) runtime_NATIVE_ONLY_C_SOURCES = \ backtrace_nat \ @@ -680,44 +746,51 @@ runtime_NATIVE_ONLY_C_SOURCES = \ frame_descriptors \ startup_nat \ signals_nat + +# The runtime system + +runtime_BYTECODE_C_SOURCES = \ + $(runtime$(RUNTIME_SUFFIX)_COMMON_C_SOURCES:%=$(RUNTIME_DIR)/%.c) \ + $(runtime$(RUNTIME_SUFFIX)_BYTECODE_ONLY_C_SOURCES:%=$(RUNTIME_DIR)/%.c) + runtime_NATIVE_C_SOURCES = \ - $(runtime_COMMON_C_SOURCES:%=runtime/%.c) \ - $(runtime_NATIVE_ONLY_C_SOURCES:%=runtime/%.c) + $(runtime$(RUNTIME_SUFFIX)_COMMON_C_SOURCES:%=$(RUNTIME_DIR)/%.c) \ + $(runtime$(RUNTIME_SUFFIX)_NATIVE_ONLY_C_SOURCES:%=$(RUNTIME_DIR)/%.c) ## Header files generated by configure -runtime_CONFIGURED_HEADERS = $(addprefix runtime/caml/, m.h s.h version.h) +runtime_CONFIGURED_HEADERS = $(addprefix $(RUNTIME_DIR)/caml/, m.h s.h version.h) ## Header files generated by make -runtime_BUILT_HEADERS = $(addprefix runtime/, \ +runtime_BUILT_HEADERS = $(addprefix $(RUNTIME_DIR)/, \ caml/opnames.h caml/jumptbl.h build_config.h) ## Targets to build and install -runtime_PROGRAMS = runtime/ocamlrun$(EXE) -runtime_BYTECODE_STATIC_LIBRARIES = $(addprefix runtime/, \ +runtime_PROGRAMS = $(RUNTIME_DIR)/ocamlrun$(EXE) +runtime_BYTECODE_STATIC_LIBRARIES = $(addprefix $(RUNTIME_DIR)/, \ ld.conf libcamlrun.$(A)) runtime_BYTECODE_SHARED_LIBRARIES = -runtime_NATIVE_STATIC_LIBRARIES = runtime/libasmrun.$(A) +runtime_NATIVE_STATIC_LIBRARIES = $(RUNTIME_DIR)/libasmrun.$(A) runtime_NATIVE_SHARED_LIBRARIES = ifeq "$(RUNTIMED)" "true" -runtime_PROGRAMS += runtime/ocamlrund$(EXE) -runtime_BYTECODE_STATIC_LIBRARIES += runtime/libcamlrund.$(A) -runtime_NATIVE_STATIC_LIBRARIES += runtime/libasmrund.$(A) +runtime_PROGRAMS += $(RUNTIME_DIR)/ocamlrund$(EXE) +runtime_BYTECODE_STATIC_LIBRARIES += $(RUNTIME_DIR)/libcamlrund.$(A) +runtime_NATIVE_STATIC_LIBRARIES += $(RUNTIME_DIR)/libasmrund.$(A) endif ifeq "$(INSTRUMENTED_RUNTIME)" "true" -runtime_PROGRAMS += runtime/ocamlruni$(EXE) -runtime_BYTECODE_STATIC_LIBRARIES += runtime/libcamlruni.$(A) -runtime_NATIVE_STATIC_LIBRARIES += runtime/libasmruni.$(A) +runtime_PROGRAMS += $(RUNTIME_DIR)/ocamlruni$(EXE) +runtime_BYTECODE_STATIC_LIBRARIES += $(RUNTIME_DIR)/libcamlruni.$(A) +runtime_NATIVE_STATIC_LIBRARIES += $(RUNTIME_DIR)/libasmruni.$(A) endif ifeq "$(UNIX_OR_WIN32)" "unix" ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true" -runtime_BYTECODE_STATIC_LIBRARIES += runtime/libcamlrun_pic.$(A) -runtime_BYTECODE_SHARED_LIBRARIES += runtime/libcamlrun_shared.$(SO) -runtime_NATIVE_STATIC_LIBRARIES += runtime/libasmrun_pic.$(A) -runtime_NATIVE_SHARED_LIBRARIES += runtime/libasmrun_shared.$(SO) +runtime_BYTECODE_STATIC_LIBRARIES += $(RUNTIME_DIR)/libcamlrun_pic.$(A) +runtime_BYTECODE_SHARED_LIBRARIES += $(RUNTIME_DIR)/libcamlrun_shared.$(SO) +runtime_NATIVE_STATIC_LIBRARIES += $(RUNTIME_DIR)/libasmrun_pic.$(A) +runtime_NATIVE_SHARED_LIBRARIES += $(RUNTIME_DIR)/libasmrun_shared.$(SO) endif endif @@ -730,7 +803,7 @@ libcamlrun_non_shared_OBJECTS = \ $(libcamlrun_OBJECTS)) libcamlrund_OBJECTS = $(runtime_BYTECODE_C_SOURCES:.c=.bd.$(O)) \ - runtime/instrtrace.bd.$(O) + $(RUNTIME_DIR)/instrtrace.bd.$(O) libcamlruni_OBJECTS = $(runtime_BYTECODE_C_SOURCES:.c=.bi.$(O)) @@ -750,7 +823,11 @@ libasmrunpic_OBJECTS = $(runtime_NATIVE_C_SOURCES:.c=.npic.$(O)) \ ## General (non target-specific) assembler and compiler flags -runtime_CPPFLAGS = -DCAMLDLLIMPORT= -DIN_CAML_RUNTIME +ifeq "$(RUNTIME_SUFFIX)" "4" + runtime_CPPFLAGS = -DCAMLDLLIMPORT= -DIN_CAML_RUNTIME -Wno-strict-prototypes -Wno-missing-prototypes -Wno-implicit-function-declaration -DCAML_NAME_SPACE +else + runtime_CPPFLAGS = -DCAMLDLLIMPORT= -DIN_CAML_RUNTIME +endif ocamlrund_CPPFLAGS = -DDEBUG ocamlruni_CPPFLAGS = -DCAML_INSTR @@ -772,7 +849,7 @@ endif ## Generated non-object files -runtime/ld.conf: $(ROOTDIR)/Makefile.config +$(RUNTIME_DIR)/ld.conf: $(ROOTDIR)/Makefile.config $(V_GEN)echo "$(STUBLIBDIR)" > $@ && \ echo "$(LIBDIR)" >> $@ @@ -797,13 +874,20 @@ runtime/ld.conf: $(ROOTDIR)/Makefile.config # To speed up builds, we avoid changing "primitives" when files # containing primitives change but the primitives table does not -runtime/primitives: \ - $(shell runtime/gen_primitives.sh > runtime/primitives.new; \ - cmp -s runtime/primitives runtime/primitives.new || \ - echo runtime/primitives.new) +ifeq "$(RUNTIME_SUFFIX)" "4" + GEN_PRIMS_DIR=$(RUNTIME_DIR) + GEN_PRIMS_REL=. +else + GEN_PRIMS_DIR= + GEN_PRIMS_REL=$(RUNTIME_DIR) +endif +$(RUNTIME_DIR)/primitives: \ + $(shell (cd $(ROOTDIR)/$(GEN_PRIMS_DIR) && $(GEN_PRIMS_REL)/gen_primitives.sh) > $(ROOTDIR)/$(RUNTIME_DIR)/primitives.new; \ + cmp -s $(RUNTIME_DIR)/primitives $(RUNTIME_DIR)/primitives.new || \ + echo $(RUNTIME_DIR)/primitives.new) $(V_GEN)cp $^ $@ -runtime/prims.c : runtime/primitives +$(RUNTIME_DIR)/prims.c : $(RUNTIME_DIR)/primitives $(V_GEN)export LC_ALL=C; \ (echo '#include "caml/config.h"'; \ echo 'typedef intnat value;'; \ @@ -819,7 +903,7 @@ runtime/prims.c : runtime/primitives sed -e 's/.*/ "&",/' $<; \ echo ' 0 };') > $@ -runtime/caml/opnames.h : runtime/caml/instruct.h +$(RUNTIME_DIR)/caml/opnames.h : $(RUNTIME_DIR)/caml/instruct.h $(V_GEN)tr -d '\r' < $< | \ sed -e '/\/\*/d' \ -e '/^#/d' \ @@ -827,8 +911,8 @@ runtime/caml/opnames.h : runtime/caml/instruct.h -e 's/{$$/[] = {/' \ -e 's/\([[:upper:]][[:upper:]_0-9]*\)/"\1"/g' > $@ -# runtime/caml/jumptbl.h is required only if you have GCC 2.0 or later -runtime/caml/jumptbl.h : runtime/caml/instruct.h +# $(RUNTIME_DIR)/caml/jumptbl.h is required only if you have GCC 2.0 or later +$(RUNTIME_DIR)/caml/jumptbl.h : $(RUNTIME_DIR)/caml/instruct.h $(V_GEN)tr -d '\r' < $< | \ sed -n -e '/^ /s/ \([A-Z]\)/ \&\&lbl_\1/gp' \ -e '/^}/q' > $@ @@ -839,96 +923,105 @@ SAK_CC ?= $(CC) SAK_CFLAGS ?= $(OC_CFLAGS) $(CFLAGS) $(OC_CPPFLAGS) $(CPPFLAGS) SAK_LINK ?= $(MKEXE_VIA_CC) -$(SAK): runtime/sak.$(O) +$(SAK): $(RUNTIME_DIR)/sak.$(O) $(V_MKEXE)$(call SAK_LINK,$@,$^) -runtime/sak.$(O): runtime/sak.c runtime/caml/misc.h runtime/caml/config.h +$(RUNTIME_DIR)/sak.$(O): $(RUNTIME_DIR)/sak.c $(RUNTIME_DIR)/caml/misc.h $(RUNTIME_DIR)/caml/config.h $(V_CC)$(SAK_CC) -c $(SAK_CFLAGS) $(OUTPUTOBJ)$@ $< C_LITERAL = $(shell $(SAK) encode-C-literal '$(1)') -runtime/build_config.h: $(ROOTDIR)/Makefile.config $(SAK) +$(RUNTIME_DIR)/build_config.h: $(ROOTDIR)/Makefile.config $(SAK) $(V_GEN)echo '/* This file is generated from $(ROOTDIR)/Makefile.config */' > $@ && \ echo '#define OCAML_STDLIB_DIR $(call C_LITERAL,$(LIBDIR))' >> $@ && \ echo '#define HOST "$(HOST)"' >> $@ ## Runtime libraries and programs -runtime/ocamlrun$(EXE): runtime/prims.$(O) runtime/libcamlrun.$(A) +$(RUNTIME_DIR)/ocamlrun$(EXE): $(RUNTIME_DIR)/prims.$(O) $(RUNTIME_DIR)/libcamlrun.$(A) $(V_MKEXE)$(MKEXE) -o $@ $^ $(BYTECCLIBS) -runtime/ocamlruns$(EXE): runtime/prims.$(O) runtime/libcamlrun_non_shared.$(A) +$(RUNTIME_DIR)/ocamlruns$(EXE): $(RUNTIME_DIR)/prims.$(O) $(RUNTIME_DIR)/libcamlrun_non_shared.$(A) $(V_MKEXE)$(call MKEXE_VIA_CC,$@,$^ $(BYTECCLIBS)) -runtime/libcamlrun.$(A): $(libcamlrun_OBJECTS) +$(RUNTIME_DIR)/libcamlrun.$(A): $(libcamlrun_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/libcamlrun_non_shared.$(A): $(libcamlrun_non_shared_OBJECTS) +$(RUNTIME_DIR)/libcamlrun_non_shared.$(A): $(libcamlrun_non_shared_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/ocamlrund$(EXE): runtime/prims.$(O) runtime/libcamlrund.$(A) +$(RUNTIME_DIR)/ocamlrund$(EXE): $(RUNTIME_DIR)/prims.$(O) $(RUNTIME_DIR)/libcamlrund.$(A) $(V_MKEXE)$(MKEXE) $(MKEXEDEBUGFLAG) -o $@ $^ $(BYTECCLIBS) -runtime/libcamlrund.$(A): $(libcamlrund_OBJECTS) +$(RUNTIME_DIR)/libcamlrund.$(A): $(libcamlrund_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/ocamlruni$(EXE): runtime/prims.$(O) runtime/libcamlruni.$(A) +$(RUNTIME_DIR)/ocamlruni$(EXE): $(RUNTIME_DIR)/prims.$(O) $(RUNTIME_DIR)/libcamlruni.$(A) $(V_MKEXE)$(MKEXE) -o $@ $^ $(INSTRUMENTED_RUNTIME_LIBS) $(BYTECCLIBS) -runtime/libcamlruni.$(A): $(libcamlruni_OBJECTS) +$(RUNTIME_DIR)/libcamlruni.$(A): $(libcamlruni_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/libcamlrun_pic.$(A): $(libcamlrunpic_OBJECTS) +$(RUNTIME_DIR)/libcamlrun_pic.$(A): $(libcamlrunpic_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/libcamlrun_shared.$(SO): $(libcamlrunpic_OBJECTS) +$(RUNTIME_DIR)/libcamlrun_shared.$(SO): $(libcamlrunpic_OBJECTS) $(V_MKDLL)$(MKDLL) -o $@ $^ $(BYTECCLIBS) -runtime/libasmrun.$(A): $(libasmrun_OBJECTS) +$(RUNTIME_DIR)/libasmrun.$(A): $(libasmrun_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/libasmrund.$(A): $(libasmrund_OBJECTS) +$(RUNTIME_DIR)/libasmrund.$(A): $(libasmrund_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/libasmruni.$(A): $(libasmruni_OBJECTS) +$(RUNTIME_DIR)/libasmruni.$(A): $(libasmruni_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/libasmrun_pic.$(A): $(libasmrunpic_OBJECTS) +$(RUNTIME_DIR)/libasmrun_pic.$(A): $(libasmrunpic_OBJECTS) $(V_MKLIB)$(call MKLIB,$@, $^) -runtime/libasmrun_shared.$(SO): $(libasmrunpic_OBJECTS) +$(RUNTIME_DIR)/libasmrun_shared.$(SO): $(libasmrunpic_OBJECTS) $(V_MKDLL)$(MKDLL) -o $@ $^ $(NATIVECCLIBS) ## Runtime target-specific preprocessor and compiler flags -runtime/%.$(O): OC_CPPFLAGS += $(runtime_CPPFLAGS) -$(DEPDIR)/runtime/%.$(D): OC_CPPFLAGS += $(runtime_CPPFLAGS) +$(RUNTIME_DIR)/%.$(O): OC_CPPFLAGS += $(runtime_CPPFLAGS) +$(DEPDIR)/$(RUNTIME_DIR)/%.$(D): OC_CPPFLAGS += $(runtime_CPPFLAGS) -runtime/%.bd.$(O): OC_CPPFLAGS += $(ocamlrund_CPPFLAGS) -$(DEPDIR)/runtime/%.bd.$(D): OC_CPPFLAGS += $(ocamlrund_CPPFLAGS) +$(RUNTIME_DIR)/%.bd.$(O): OC_CPPFLAGS += $(ocamlrund_CPPFLAGS) +$(DEPDIR)/$(RUNTIME_DIR)/%.bd.$(D): OC_CPPFLAGS += $(ocamlrund_CPPFLAGS) -runtime/%.bi.$(O): OC_CPPFLAGS += $(ocamlruni_CPPFLAGS) -$(DEPDIR)/runtime/%.bi.$(D): OC_CPPFLAGS += $(ocamlruni_CPPFLAGS) +$(RUNTIME_DIR)/%.bi.$(O): OC_CPPFLAGS += $(ocamlruni_CPPFLAGS) +$(DEPDIR)/$(RUNTIME_DIR)/%.bi.$(D): OC_CPPFLAGS += $(ocamlruni_CPPFLAGS) -runtime/%.bpic.$(O): OC_CFLAGS += $(SHAREDLIB_CFLAGS) +$(RUNTIME_DIR)/%.bpic.$(O): OC_CFLAGS += $(SHAREDLIB_CFLAGS) -runtime/%.n.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) -runtime/%.n.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) -$(DEPDIR)/runtime/%.n.$(D): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) +$(RUNTIME_DIR)/%.n.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) +$(RUNTIME_DIR)/%.n.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) +$(DEPDIR)/$(RUNTIME_DIR)/%.n.$(D): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) -runtime/%.nd.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) -runtime/%.nd.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlrund_CPPFLAGS) -$(DEPDIR)/runtime/%.nd.$(D): \ +$(RUNTIME_DIR)/%.nd.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) +$(RUNTIME_DIR)/%.nd.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlrund_CPPFLAGS) +$(DEPDIR)/$(RUNTIME_DIR)/%.nd.$(D): \ OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlrund_CPPFLAGS) -runtime/%.ni.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) -runtime/%.ni.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlruni_CPPFLAGS) -$(DEPDIR)/runtime/%.ni.$(D): \ +$(RUNTIME_DIR)/%.ni.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) +$(RUNTIME_DIR)/%.ni.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlruni_CPPFLAGS) +$(DEPDIR)/$(RUNTIME_DIR)/%.ni.$(D): \ OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) $(ocamlruni_CPPFLAGS) -runtime/%.npic.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) $(SHAREDLIB_CFLAGS) -runtime/%.npic.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) -$(DEPDIR)/runtime/%.npic.$(D): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) +$(RUNTIME_DIR)/%.npic.$(O): OC_CFLAGS += $(OC_NATIVE_CFLAGS) $(SHAREDLIB_CFLAGS) +$(RUNTIME_DIR)/%.npic.$(O): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) +$(DEPDIR)/$(RUNTIME_DIR)/%.npic.$(D): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) + +# The major GC performs better with this flag on Intel processors +# This is a workaround for an Intel CPU bug: +# https://www.intel.co.uk/content/www/uk/en/support/articles/000055650/processors.html +$(RUNTIME_DIR)/major_gc.%.$(O): OC_CFLAGS += $(INTEL_JCC_BUG_CFLAGS) + +# Partial inlining on (at least) caml_string_compare seems to produce +# worse code. +$(RUNTIME_DIR)/str.%.$(O): OC_CFLAGS += $(NO_PARTIAL_INLINING_CFLAGS) ## Compilation of runtime C files @@ -945,9 +1038,9 @@ ifneq "$(1)" "%" # ones will not be generated. For this reason, we don't use -MG and # instead include $(runtime_BUILT_HEADERS) in the order only dependencies # to ensure that they exist before dependencies are computed. -$(DEPDIR)/$(1).$(D): runtime/%.c | $(DEPDIR)/runtime $(runtime_BUILT_HEADERS) +$(DEPDIR)/$(1).$(D): $(RUNTIME_DIR)/%.c | $(DEPDIR)/$(RUNTIME_DIR) $(runtime_BUILT_HEADERS) $$(V_CCDEPS)$$(DEP_CC) $$(OC_CPPFLAGS) $$(CPPFLAGS) $$< -MT \ - 'runtime/$$*$(subst runtime/%,,$(1)).$(O)' -MF $$@ + '$(RUNTIME_DIR)/$$*$(subst $(RUNTIME_DIR)/%,,$(1)).$(O)' -MF $$@ endif # ifneq "$(1)" "%" $(1).$(O): $(2).c else @@ -968,17 +1061,17 @@ runtime_OBJECT_TYPES += %.n %.nd %.ni %.np %.npic endif $(foreach runtime_OBJECT_TYPE, $(runtime_OBJECT_TYPES), \ - $(eval $(call COMPILE_C_FILE,runtime/$(runtime_OBJECT_TYPE),runtime/%))) + $(eval $(call COMPILE_C_FILE,$(RUNTIME_DIR)/$(runtime_OBJECT_TYPE),$(RUNTIME_DIR)/%))) -runtime/$(UNIX_OR_WIN32)_non_shared.%.$(O): \ +$(RUNTIME_DIR)/$(UNIX_OR_WIN32)_non_shared.%.$(O): \ OC_CPPFLAGS += -DBUILDING_LIBCAMLRUNS -$(eval $(call COMPILE_C_FILE,runtime/$(UNIX_OR_WIN32)_non_shared.%, \ - runtime/$(UNIX_OR_WIN32))) +$(eval $(call COMPILE_C_FILE,$(RUNTIME_DIR)/$(UNIX_OR_WIN32)_non_shared.%, \ + $(RUNTIME_DIR)/$(UNIX_OR_WIN32))) $(foreach runtime_OBJECT_TYPE,$(subst %,,$(runtime_OBJECT_TYPES)), \ $(eval \ - runtime/dynlink$(runtime_OBJECT_TYPE).$(O): $(ROOTDIR)/Makefile.config)) + $(RUNTIME_DIR)/dynlink$(runtime_OBJECT_TYPE).$(O): $(ROOTDIR)/Makefile.config)) ## Compilation of runtime assembly files @@ -987,42 +1080,42 @@ ASPP_ERROR = \ echo "unhappy with the preprocessor. Check your assembler, or";\ echo "try producing $*.o by hand.";\ exit 2; } -runtime/%.o: runtime/%.S +$(RUNTIME_DIR)/%.o: $(RUNTIME_DIR)/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) -o $@ $< || $(ASPP_ERROR) -runtime/%.d.o: runtime/%.S +$(RUNTIME_DIR)/%.d.o: $(RUNTIME_DIR)/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) $(ocamlrund_CPPFLAGS) -o $@ $< || $(ASPP_ERROR) -runtime/%.i.o: runtime/%.S +$(RUNTIME_DIR)/%.i.o: $(RUNTIME_DIR)/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) $(ocamlruni_CPPFLAGS) -o $@ $< || $(ASPP_ERROR) -runtime/%_libasmrunpic.o: runtime/%.S +$(RUNTIME_DIR)/%_libasmrunpic.o: $(RUNTIME_DIR)/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) $(SHAREDLIB_CFLAGS) -o $@ $< -runtime/domain_state64.inc: \ - runtime/gen_domain_state64_inc.awk runtime/caml/domain_state.tbl +$(RUNTIME_DIR)/domain_state64.inc: \ + $(RUNTIME_DIR)/gen_domain_state64_inc.awk $(RUNTIME_DIR)/caml/domain_state.tbl $(V_GEN)$(AWK) -f $^ > $@ -runtime/domain_state32.inc: \ - runtime/gen_domain_state32_inc.awk runtime/caml/domain_state.tbl +$(RUNTIME_DIR)/domain_state32.inc: \ + $(RUNTIME_DIR)/gen_domain_state32_inc.awk $(RUNTIME_DIR)/caml/domain_state.tbl $(V_GEN)$(AWK) -f $^ > $@ -runtime/amd64nt.obj: runtime/amd64nt.asm runtime/domain_state64.inc +$(RUNTIME_DIR)/amd64nt.obj: $(RUNTIME_DIR)/amd64nt.asm $(RUNTIME_DIR)/domain_state64.inc $(V_ASM)$(ASM)$@ $< -runtime/amd64nt.d.obj: runtime/amd64nt.asm runtime/domain_state64.inc +$(RUNTIME_DIR)/amd64nt.d.obj: $(RUNTIME_DIR)/amd64nt.asm $(RUNTIME_DIR)/domain_state64.inc $(V_ASM)$(ASM)$@ $(ocamlrund_CPPFLAGS) $< -runtime/amd64nt.i.obj: runtime/amd64nt.asm runtime/domain_state64.inc +$(RUNTIME_DIR)/amd64nt.i.obj: $(RUNTIME_DIR)/amd64nt.asm $(RUNTIME_DIR)/domain_state64.inc $(V_ASM)$(ASM)$@ $(ocamlruni_CPPFLAGS) $< -runtime/%_libasmrunpic.obj: runtime/%.asm +$(RUNTIME_DIR)/%_libasmrunpic.obj: $(RUNTIME_DIR)/%.asm $(V_ASM)$(ASM)$@ $< ## Runtime dependencies runtime_DEP_FILES := $(addsuffix .b, \ - $(basename $(runtime_BYTECODE_C_SOURCES) runtime/instrtrace)) + $(basename $(runtime_BYTECODE_C_SOURCES) $(RUNTIME_DIR)/instrtrace)) ifeq "$(NATIVE_COMPILER)" "true" runtime_DEP_FILES += $(addsuffix .n, $(basename $(runtime_NATIVE_C_SOURCES))) endif @@ -1049,15 +1142,15 @@ endif .PHONY: makeruntime makeruntime: runtime-all stdlib/libcamlrun.$(A): runtime-all - cd stdlib; $(LN) ../runtime/libcamlrun.$(A) . + cd stdlib; $(LN) ../$(RUNTIME_DIR)/libcamlrun.$(A) . clean:: - rm -f $(addprefix runtime/, *.o *.obj *.a *.lib *.so *.dll ld.conf) - rm -f $(addprefix runtime/, ocamlrun ocamlrund ocamlruni ocamlruns sak) - rm -f $(addprefix runtime/, \ + rm -f $(addprefix $(RUNTIME_DIR)/, *.o *.obj *.a *.lib *.so *.dll ld.conf) + rm -f $(addprefix $(RUNTIME_DIR)/, ocamlrun ocamlrund ocamlruni ocamlruns sak) + rm -f $(addprefix $(RUNTIME_DIR)/, \ ocamlrun.exe ocamlrund.exe ocamlruni.exe ocamlruns.exe sak.exe) - rm -f runtime/primitives runtime/primitives.new runtime/prims.c \ + rm -f $(RUNTIME_DIR)/primitives $(RUNTIME_DIR)/primitives.new $(RUNTIME_DIR)/prims.c \ $(runtime_BUILT_HEADERS) - rm -f runtime/domain_state*.inc + rm -f $(RUNTIME_DIR)/domain_state*.inc rm -rf $(DEPDIR) rm -f stdlib/libcamlrun.a stdlib/libcamlrun.lib @@ -1067,7 +1160,7 @@ runtimeopt: stdlib/libasmrun.$(A) .PHONY: makeruntimeopt makeruntimeopt: runtime-allopt stdlib/libasmrun.$(A): runtime-allopt - cd stdlib; $(LN) ../runtime/libasmrun.$(A) . + cd stdlib; $(LN) ../$(RUNTIME_DIR)/libasmrun.$(A) . clean:: rm -f stdlib/libasmrun.a stdlib/libasmrun.lib @@ -1077,7 +1170,7 @@ clean:: subdirs = \ stdlib $(addprefix otherlibs/, \ $(filter-out runtime_events, $(ALL_OTHERLIBS))) \ - debugger ocamldoc ocamltest + debugger$(RUNTIME_SUFFIX) ocamldoc ocamltest .PHONY: alldepend alldepend: depend @@ -1093,6 +1186,10 @@ library: ocamlc .PHONY: library-cross library-cross: + $(MAKE) -C stdlib OCAMLRUN=../$(RUNTIME_DIR)/ocamlrun$(EXE) all + +.PHONY: library-cross5 +library-cross5: $(MAKE) -C stdlib OCAMLRUN=../runtime/ocamlrun$(EXE) all .PHONY: libraryopt @@ -1267,10 +1364,10 @@ clean:: .PHONY: ocamldebugger ocamldebugger: ocamlc ocamlyacc ocamllex otherlibraries - $(MAKE) -C debugger all + $(MAKE) -C debugger$(RUNTIME_SUFFIX) all partialclean:: - $(MAKE) -C debugger clean + $(MAKE) -C debugger$(RUNTIME_SUFFIX) clean # Check that the native-code compiler is supported .PHONY: checknative @@ -1375,14 +1472,14 @@ tools/ocamldep$(EXE): OC_BYTECODE_LINKFLAGS += -compat-32 ocamlprof_LIBRARIES = ocamlprof_MODULES = \ config build_path_prefix_map misc identifiable numbers arg_helper \ - local_store load_path clflags terminfo warnings location longident \ - docstrings syntaxerr ast_helper camlinternalMenhirLib parser pprintast \ - lexer parse ocamlprof + local_store zero_alloc_annotations clflags load_path terminfo warnings \ + location longident docstrings syntaxerr ast_helper camlinternalMenhirLib \ + parser pprintast lexer parse ocamlprof ocamlcp_ocamloptp_MODULES = \ config build_path_prefix_map misc profile warnings identifiable numbers \ - arg_helper local_store load_path clflags terminfo location ccomp compenv \ - main_args ocamlcp_common + arg_helper local_store zero_alloc_annotations clflags load_path terminfo \ + location ccomp compenv main_args ocamlcp_common zero_alloc_annotations ocamlcp_LIBRARIES = ocamlcp_MODULES = $(ocamlcp_ocamloptp_MODULES) ocamlcp @@ -1399,7 +1496,7 @@ ocamlmklib_MODULES = config build_path_prefix_map misc ocamlmklib ocamlmktop_LIBRARIES = ocamlmktop_MODULES = \ config build_path_prefix_map misc identifiable numbers arg_helper \ - local_store load_path clflags profile ccomp ocamlmktop + local_store zero_alloc_annotations clflags load_path profile ccomp ocamlmktop # Reading cmt files @@ -1416,7 +1513,7 @@ make_opcodes = tools/make_opcodes$(EXE) make_opcodes_LIBRARIES = make_opcodes_MODULES = tools/make_opcodes -tools/opnames.ml: runtime/caml/instruct.h $(make_opcodes) +tools/opnames.ml: $(RUNTIME_DIR)/caml/instruct.h $(make_opcodes) $(V_GEN)$(NEW_OCAMLRUN) $(make_opcodes) -opnames < $< > $@ clean:: @@ -1490,10 +1587,11 @@ check_arch: @rm -f $(ARCH_SPECIFIC) asmcomp/emit.ml asmcomp/*.cm* .PHONY: check_all_arches +# CR mshinwell: have only enabled arm64 and amd64 for now check_all_arches: ifeq ($(ARCH64),true) @STATUS=0; \ - for i in $(ARCHES); do \ + for i in amd64 arm64; do \ $(MAKE) --no-print-directory check_arch ARCH=$$i || STATUS=1; \ done; \ exit $$STATUS @@ -1531,7 +1629,7 @@ toplevel/native/topeval.cmx: otherlibs/dynlink/dynlink.cmxa # The numeric opcodes -bytecomp/opcodes.ml: runtime/caml/instruct.h $(make_opcodes) +bytecomp/opcodes.ml: $(RUNTIME_DIR)/caml/instruct.h $(make_opcodes) $(V_GEN)$(NEW_OCAMLRUN) $(make_opcodes) -opcodes < $< > $@ bytecomp/opcodes.mli: bytecomp/opcodes.ml @@ -1581,7 +1679,7 @@ depend: beforedepend .PHONY: distclean distclean: clean - $(MAKE) -C debugger distclean + $(MAKE) -C debugger$(RUNTIME_SUFFIX) distclean $(MAKE) -C manual distclean $(MAKE) -C ocamldoc distclean $(MAKE) -C ocamltest distclean @@ -1618,7 +1716,7 @@ ifneq "$(runtime_BYTECODE_SHARED_LIBRARIES)" "" $(INSTALL_PROG) $(runtime_BYTECODE_SHARED_LIBRARIES) \ "$(INSTALL_LIBDIR)" endif - $(INSTALL_DATA) runtime/caml/domain_state.tbl runtime/caml/*.h \ + $(INSTALL_DATA) $(RUNTIME_DIR)/caml/domain_state.tbl $(RUNTIME_DIR)/caml/*.h \ "$(INSTALL_INCDIR)" $(INSTALL_PROG) ocaml$(EXE) "$(INSTALL_BINDIR)" ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" @@ -1711,7 +1809,7 @@ ifeq "$(WITH_OCAMLDOC)-$(STDLIB_MANPAGES)" "ocamldoc-true" $(MAKE) -C api_docgen install endif if test -n "$(WITH_DEBUGGER)"; then \ - $(MAKE) -C debugger install; \ + $(MAKE) -C debugger$(RUNTIME_SUFFIX) install; \ fi ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" ifeq "$(TOOLCHAIN)" "msvc" diff --git a/Makefile.build_config.in b/Makefile.build_config.in index 08d2841a3fc..930a74cd631 100644 --- a/Makefile.build_config.in +++ b/Makefile.build_config.in @@ -52,7 +52,7 @@ COMPUTE_DEPS=@compute_deps@ # Build-system flags to use to compile C files OC_CFLAGS=@oc_cflags@ -OC_CPPFLAGS=-I$(ROOTDIR)/runtime @oc_cppflags@ +OC_CPPFLAGS=-I$(ROOTDIR)/$(RUNTIME_DIR) @oc_cppflags@ # The following variable defines flags to be passed to the C preprocessor # when compiling C files to be linked with native code. This includes @@ -148,7 +148,7 @@ OC_NATIVE_LINKFLAGS = -g LN = @ln@ # Platform-dependent assembler files to use to build the runtime -runtime_ASM_OBJECTS = $(addprefix runtime/,@runtime_asm_objects@) +runtime_ASM_OBJECTS = $(addprefix $(RUNTIME_DIR)/,@runtime_asm_objects@) # Platform-dependent module for ocamlyacc ocamlyacc_WSTR_MODULE = @ocamlyacc_wstr_module@ diff --git a/Makefile.common b/Makefile.common index 82478a8aa4e..2855ef4b1a5 100644 --- a/Makefile.common +++ b/Makefile.common @@ -90,14 +90,14 @@ FLEXDLL_SUBMODULE_PRESENT := $(wildcard $(ROOTDIR)/flexdll/Makefile) IN_COREBOOT_CYCLE ?= false # Variables used to represent the OCaml runtime system -# Most of the time, boot/ocamlrun and runtime/ocamlrun are the same. +# Most of the time, boot/ocamlrun and $(RUNTIME_DIR)/ocamlrun are the same. # However, under some circumstances it is important to be able to # distinguish one from the other, hence these two variables. # Boot/ocamlrun is the most frequently used in the build system, so # we use OCAMLRUN to designate it and keep NEW_OCAMLRUN to refer -# to runtime/ocamlrun, because it's less frequently used. +# to $(RUNTIME_DIR)/ocamlrun, because it's less frequently used. OCAMLRUN ?= $(ROOTDIR)/boot/ocamlrun$(EXE) -NEW_OCAMLRUN ?= $(ROOTDIR)/runtime/ocamlrun$(EXE) +NEW_OCAMLRUN ?= $(ROOTDIR)/$(RUNTIME_DIR)/ocamlrun$(EXE) # Standard library flags STDLIBFLAGS ?= -nostdlib -I $(ROOTDIR)/stdlib @@ -140,7 +140,7 @@ endif # ifeq "$(wildcard $(ROOTDIR)/flexlink.opt$(EXE))" "" endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" # List of other libraries -ALL_OTHERLIBS = dynlink str systhreads unix runtime_events +ALL_OTHERLIBS = dynlink str systhreads$(RUNTIME_SUFFIX) unix runtime_events # Flags to pass to the C preprocessor when preprocessing assembly files OC_ASPPFLAGS=$(OC_CPPFLAGS) $(OC_NATIVE_CPPFLAGS) @@ -159,8 +159,8 @@ ifeq "$(COMPUTE_DEPS)" "true" RUNTIME_HEADERS := REQUIRED_HEADERS := else -RUNTIME_HEADERS := $(wildcard $(ROOTDIR)/runtime/caml/*.tbl) \ - $(wildcard $(ROOTDIR)/runtime/caml/*.h) +RUNTIME_HEADERS := $(wildcard $(ROOTDIR)/$(RUNTIME_DIR)/caml/*.tbl) \ + $(wildcard $(ROOTDIR)/$(RUNTIME_DIR)/caml/*.h) REQUIRED_HEADERS := $(RUNTIME_HEADERS) $(wildcard *.h) endif @@ -217,7 +217,7 @@ OCAMLYACCFLAGS ?= --strict -v %.ml %.mli: %.mly $(V_OCAMLYACC)$(OCAMLYACC) $(OCAMLYACCFLAGS) $< -SAK = $(ROOTDIR)/runtime4/sak$(EXE) +SAK = $(ROOTDIR)/$(RUNTIME_DIR)/sak$(EXE) # stdlib/StdlibModules cannot be include'd unless $(SAK) has been built. These # two rules add that dependency. They have to be pattern rules since diff --git a/Makefile.common-jst b/Makefile.common-jst index 0db1ccde86a..e60b98766d3 100644 --- a/Makefile.common-jst +++ b/Makefile.common-jst @@ -42,10 +42,10 @@ define dune_main_context (lang dune 2.8) (context (default (name main) - (profile main) + (profile $(main_build_profile)) (paths (PATH ("$(CURDIR)/_build/_bootinstall/bin" :standard)) - (OCAMLLIB ("$(CURDIR)/_build/install/runtime_stdlib/lib/ocaml_runtime_stdlib"))) + (OCAMLLIB ("$(CURDIR)/_build/runtime_stdlib_install/lib/ocaml_runtime_stdlib"))) (env (_ (flags (:standard -warn-error +A)) (env-vars ("OCAMLPARAM" "$(BUILD_OCAMLPARAM)")))))) @@ -60,24 +60,31 @@ boot_targets = \ $(boot_ocamlopt) \ $(boot_ocamlmklib) \ $(boot_ocamldep) \ - $(boot_ocamlobjinfo) + $(boot_ocamlobjinfo) \ + ocaml/ocamltest/ocamltest.byte boot-compiler: _build/_bootinstall - $(dune) build $(ws_boot) $(coverage_dune_flags) $(boot_targets) + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) build $(ws_boot) $(coverage_dune_flags) $(boot_targets) boot-runtest: boot-compiler - $(dune) runtest $(ws_boot) $(coverage_dune_flags) --force + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) runtest $(ws_boot) $(coverage_dune_flags) --force runtime-stdlib: boot-compiler - $(dune) build $(ws_runstd) --only-package=ocaml_runtime_stdlib @install -# dune does not believe the compiler can make .cmxs unless the following file exists - @touch _build/install/runtime_stdlib/lib/ocaml_runtime_stdlib/dynlink.cmxa + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) build $(ws_runstd) --only-package=ocaml_runtime_stdlib @install + rm -rf _build/runtime_stdlib_install +# Dune 3.11+ clears `_build/install` before building, move the runtime stdlib +# to a separate directory. + $(cpl) -R _build/install/runtime_stdlib _build/runtime_stdlib_install +# Dune does not believe the compiler can make .cmxs unless the following file exists. + @touch _build/runtime_stdlib_install/lib/ocaml_runtime_stdlib/dynlink.cmxa compiler: runtime-stdlib - $(dune) build $(ws_main) --only-package=ocaml @install $(ocamldir)/ocamltest/ocamltest.byte + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) build $(ws_main) --only-package=ocaml @install \ + $(ocamldir)/ocamltest/ocamltest.byte \ + $(ocamldir)/tools/dumpobj.bc runtest: compiler - $(dune) runtest $(ws_main) + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) runtest $(ws_main) # This Makefile supports old versions that don't have $(file), so we're using @@ -85,7 +92,7 @@ runtest: compiler duneconf/boot.ws: export contents = $(dune_boot_context) duneconf/runtime_stdlib.ws: export contents = $(dune_runtime_stdlib_context) duneconf/main.ws: export contents = $(dune_main_context) -duneconf/%.ws: Makefile.common-jst +duneconf/%.ws: echo "$$contents" > $@ # We need to disable ocaml/otherlibs when compiling with coverage, because we @@ -107,7 +114,22 @@ dune_config_targets = \ $(ocamldir)/duneconf/dirs-to-ignore.inc \ $(ocamldir)/duneconf/jst-extra.inc \ dune-project \ - $(ocamldir)/stdlib/ocaml_compiler_internal_params + $(ocamldir)/dune.runtime_selection \ + $(ocamldir)/otherlibs/dune + +$(ocamldir)/otherlibs/dune: + if [ "$(RUNTIME_DIR)" = "runtime4" ]; then \ + echo "(dirs (:standard \ systhreads runtime_events))" > $@; \ + else \ + echo "(dirs (:standard \ systhreads4))" > $@; \ + fi + +$(ocamldir)/dune.runtime_selection: + if [ "$(RUNTIME_DIR)" = "runtime4" ]; then \ + echo "(dirs (:standard \ runtime debugger))" > $@; \ + else \ + echo "(dirs (:standard \ runtime4 debugger4))" > $@; \ + fi _build/_bootinstall: Makefile.config $(dune_config_targets) echo -n '$(NATDYNLINKOPTS)' > $(ocamldir)/otherlibs/dynlink/natdynlinkops @@ -146,9 +168,10 @@ cpl=$(if $(filter linux,$(SYSTEM)),cp -l,cp -L) _install: compiler rm -rf _install mkdir -p _install/{bin,lib/ocaml} - $(cpl) _build/install/{runtime_stdlib,main}/bin/* _install/bin/ + $(cpl) _build/runtime_stdlib_install/bin/* _install/bin/ + $(cpl) _build/install/main/bin/* _install/bin/ ( cd _install/bin; for i in *.opt; do ln -s $$i $${i%.opt}; done ) - $(cpl) -R _build/install/runtime_stdlib/lib/ocaml_runtime_stdlib/* _install/lib/ocaml/ + $(cpl) -R _build/runtime_stdlib_install/lib/ocaml_runtime_stdlib/* _install/lib/ocaml/ rm -f _install/lib/ocaml/{META,dune-package,Makefile.config,dynlink.cmxa} $(cpl) -R _build/install/main/lib/ocaml/* _install/lib/ocaml/ if [ "x$(legacy_layout)" == "xyes" ] ; \ @@ -177,12 +200,6 @@ _install: compiler install: _install mkdir -p '$(prefix)' rsync --chmod=u+rw,go+r -rl _install/ '$(prefix)' - rm -f '$(prefix)/lib/ocaml/ocaml_compiler_internal_params' - # rm `ocaml_compiler_internal_params`, which is used to compile the - # stdlib `Float_u` module with `-extension layouts_alpha`, because we - # don't want user programs that happened to be named - # `ocaml/stdlib/float_u.ml` to get the flag automatically. - # Same as above, but relies on a successfull earlier _install install_for_opam: @@ -212,6 +229,9 @@ install_for_test: _install # replace backend-specific testsuite/tests/unboxed-primitive-args with their new versions rm _runtest/testsuite/tests/unboxed-primitive-args/* cp -a testsuite/tests/unboxed-primitive-args/* _runtest/testsuite/tests/unboxed-primitive-args/ + # add extension library tests that are not supported by the upstream compiler + rm _runtest/testsuite/tests/lib-extensions/* + cp -a testsuite/tests/lib-extensions/* _runtest/testsuite/tests/lib-extensions cp $(ocamldir)/Makefile.* _runtest/ @@ -222,19 +242,28 @@ install_for_test: _install ln -s . boot; \ for exe in ocamlc ocamlopt ocamllex; do \ rm -f $$exe; ln -s $$exe.byte $$exe; \ + touch ocamlc.opt ocamlopt.opt; \ done; \ ln -s _install/lib/ocaml stdlib; \ - mkdir runtime; \ - for f in ocamlrun* stdlib/caml stdlib/stublibs/* runtime/caml/threads.h; do \ - ln -s ../$$f runtime/`basename $$f`; \ + mkdir $(RUNTIME_DIR); \ + for f in ocamlrun* stdlib/caml stdlib/stublibs/* $(RUNTIME_DIR)/caml/threads.h; do \ + ln -s ../$$f $(RUNTIME_DIR)/`basename $$f`; \ done; \ ln -s . lex; ln -s . yacc; \ ln -s _install/lib/ocaml/compiler-libs compilerlibs; \ - mkdir -p otherlibs/{unix,dynlink/native,str,bigarray}; \ - ln -s ../stdlib/threads otherlibs/systhreads; \ + mkdir -p otherlibs/{unix,dynlink/native,str,bigarray,runtime_events}; \ + ln -s ../stdlib/threads otherlibs/systhreads$(RUNTIME_SUFFIX); \ $(cpl) stdlib/unix/{lib,}unix* otherlibs/unix; \ $(cpl) stdlib/dynlink/dynlink* otherlibs/dynlink; \ $(cpl) stdlib/str/{lib,}str* otherlibs/str; \ + for universe in upstream_compatible stable beta alpha ; do \ + mkdir -p otherlibs/{stdlib_,}$${universe}; \ + $(cpl) stdlib/stdlib_$${universe}/* otherlibs/stdlib_$${universe}; \ + $(cpl) stdlib/$${universe}/* otherlibs/$${universe}; \ + done; \ + if [[ x"$(RUNTIME_DIR)" = x"runtime" ]]; then \ + $(cpl) stdlib/runtime_events/{lib,}runtime_events* otherlibs/runtime_events; \ + fi; \ ln -s ../_build/main/$(ocamldir)/toplevel/byte/.ocamltoplevel.objs/byte toplevel; \ ) @@ -257,10 +286,10 @@ install_for_test: _install mkdir -p _runtest/lib/ocaml/stublibs/ cp $(main_prefix)/lib/ocaml/stublibs/*.so _runtest/lib/ocaml/stublibs # ocamldebug - mkdir _runtest/debugger - ln -s ../ocamldebug _runtest/debugger - cp $(main_build)/$(ocamldir)/debugger/.ocamldebug.objs/byte/*.cm* \ - _runtest/debugger + mkdir _runtest/debugger$(RUNTIME_SUFFIX) + ln -s ../ocamldebug _runtest/debugger$(RUNTIME_SUFFIX) + cp $(main_build)/$(ocamldir)/debugger$(RUNTIME_SUFFIX)/.ocamldebug.objs/byte/*.cm* \ + _runtest/debugger$(RUNTIME_SUFFIX) # The ast_invariants test needs VERSION to be present. In fact ideally # we should have all the source files in _runtest too for this test, # but for the moment we accept it being a weaker check. We're not @@ -355,7 +384,7 @@ promote-one-no-rebuild: # This target is like a polling version of upstream "make ocamlopt" .PHONY: hacking hacking: _build/_bootinstall - $(dune) build $(ws_boot) -w $(boot_targets) + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) build $(ws_boot) -w $(boot_targets) # The `hacking-emacs-poller` and `hacking-emacs-builder` targets make it # possible to run the polling build with Emacs's `M-x compile`. You should run @@ -365,7 +394,7 @@ hacking: _build/_bootinstall .PHONY: hacking-emacs-poller hacking-emacs-poller: _build/_bootinstall - $(dune) build $(ws_boot) --passive-watch-mode + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) build $(ws_boot) --passive-watch-mode .PHONY: hacking-emacs-builder hacking-emacs-builder: _build/_bootinstall @@ -374,7 +403,7 @@ hacking-emacs-builder: _build/_bootinstall .PHONY: debug-printers debug-printers: runtime-stdlib # required for $(ws_main) to work - $(dune) build $(ws_main) $(ocamldir)/tools/debug_printers + RUNTIME_DIR=$(RUNTIME_DIR) $(dune) build $(ws_main) $(ocamldir)/tools/debug_printers @echo @echo To load into ocamldebug, use: @echo source \"$$(realpath _build/main/$(ocamldir)/tools/debug_printers)\" diff --git a/Makefile.config.in b/Makefile.config.in index 2d0939937ac..a20d9bb1247 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -218,6 +218,8 @@ WITH_CPP_MANGLING=@cpp_mangling@ WITH_PROFINFO=@profinfo@ PROFINFO_WIDTH=@profinfo_width@ HEADER_RESERVED_BITS=@reserved_header_bits@ +CUSTOM_OPS_STRUCT_SIZE=@custom_ops_struct_size@ +NO_PARTIAL_INLINING_CFLAGS=@no_partial_inlining_cflags@ LIBUNWIND_AVAILABLE=@libunwind_available@ LIBUNWIND_INCLUDE_FLAGS=@libunwind_include_flags@ LIBUNWIND_LINK_FLAGS=@libunwind_link_flags@ @@ -243,6 +245,10 @@ STACK_ALLOCATION=@stack_allocation@ POLL_INSERTION=@poll_insertion@ DUNE=@dune@ +# Selection of OCaml 4.x or 5.x runtime +RUNTIME_SUFFIX=@runtime_suffix@ +RUNTIME_DIR=runtime$(RUNTIME_SUFFIX) + # Deprecated variables ## Variables deprecated since OCaml 5.0 diff --git a/VERSION b/VERSION index 3736ffcb307..03748534100 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -5.1.1+jst-runtime4 +5.1.1+jst # Starting with OCaml 4.14, although the version string that appears above is # still correct and this file can thus still be used to figure it out, diff --git a/asmcomp/CSEgen.ml b/asmcomp/CSEgen.ml index b539086365c..9bb617a8c4b 100644 --- a/asmcomp/CSEgen.ml +++ b/asmcomp/CSEgen.ml @@ -226,7 +226,10 @@ method class_of_operation op = | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Iprobe _ | Iopaque -> assert false (* treated specially *) | Istackoffset _ -> Op_other - | Iload { mutability } -> Op_load mutability + | Iload { mutability; is_atomic } -> + (* #12173: disable CSE for atomic loads. *) + if is_atomic then Op_other + else Op_load mutability | Istore(_,_,asg) -> Op_store asg | Ialloc _ | Ipoll _ -> assert false (* treated specially *) | Iintop(Icheckbound) -> Op_checkbound diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 21f75323a90..15723be9b2c 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -62,7 +62,6 @@ let cfi_endproc () = let cfi_adjust_cfa_offset n = if Config.asm_cfi_supported then D.cfi_adjust_cfa_offset n -(* BACKPORT let cfi_remember_state () = if Config.asm_cfi_supported then D.cfi_remember_state () @@ -71,7 +70,6 @@ let cfi_restore_state () = let cfi_def_cfa_register reg = if Config.asm_cfi_supported then D.cfi_def_cfa_register reg -*) let emit_debug_info dbg = emit_debug_info_gen dbg D.file D.loc @@ -90,13 +88,7 @@ let frame_size env = (* includes return address *) + 8 + (if fp then 8 else 0)) in -(* BACKPORT BEGIN *) - Misc.align -(* BACKPORT END *) - sz -(* BACKPORT BEGIN *) - 16 -(* BACKPORT END *) + if Config.runtime5 then sz else Misc.align sz 16 end else env.stack_offset + 8 @@ -676,25 +668,19 @@ let emit_instr env fallthrough i = end end end - | Lop(Iextcall { func; alloc; stack_ofs - (* BACKPORT BEGIN *) - = _ - (* BACKPORT END *) - }) -> + | Lop(Iextcall { func; alloc; stack_ofs }) -> add_used_symbol func; -(* BEGIN BACKPORT - if stack_ofs > 0 then begin + if Config.runtime5 && stack_ofs > 0 then begin I.mov rsp r13; I.lea (mem64 QWORD stack_ofs RSP) r12; load_symbol_addr func rax; emit_call "caml_c_call_stack_args"; record_frame env i.live (Dbg_other i.dbg); - end else *) if alloc then begin + end else if alloc then begin load_symbol_addr func rax; emit_call "caml_c_call"; record_frame env i.live (Dbg_other i.dbg); -(* BEGIN BACKPORT *) - if system <> S_win64 then begin + if not Config.runtime5 && system <> S_win64 then begin (* In amd64.S, "caml_c_call" tail-calls the C function (in order to produce nicer backtraces), so we need to restore r15 manually after @@ -706,24 +692,21 @@ let emit_instr env fallthrough i = I.mov (domain_field Domainstate.Domain_young_ptr) r15 end -(* END BACKPORT *) end else begin -(* BEGIN BACKPORT - I.mov rsp rbx; - cfi_remember_state (); - cfi_def_cfa_register "rbx"; - (* NB: gdb has asserts on contiguous stacks that mean it - will not unwind through this unless we were to tag this - calling frame with cfi_signal_frame in it's definition. *) - I.mov (domain_field Domainstate.Domain_c_stack) rsp; *) -(* END BACKPORT *) - emit_call func -(* BEGIN BACKPORT - ; - I.mov rbx rsp; - cfi_restore_state (); -*) -(* END BACKPORT *) + if Config.runtime5 then begin + I.mov rsp rbx; + cfi_remember_state (); + cfi_def_cfa_register "rbx"; + (* NB: gdb has asserts on contiguous stacks that mean it + will not unwind through this unless we were to tag this + calling frame with cfi_signal_frame in it's definition. *) + I.mov (domain_field Domainstate.Domain_c_stack) rsp; + end; + emit_call func; + if Config.runtime5 then begin + I.mov rbx rsp; + cfi_restore_state (); + end; end | Lop(Istackoffset n) -> emit_stack_offset env n @@ -947,12 +930,10 @@ let emit_instr env fallthrough i = I.cmp (int 0) (res16 i 0); I.set (cond (Iunsigned Cne)) (res8 i 0); I.movzx (res8 i 0) (res i 0) -(* BACKPORT BEGIN | Lop (Idls_get) -> - I.mov (domain_field Domainstate.Domain_dls_root) (res i 0) -*) - | Lop (Idls_get) -> Misc.fatal_error "Idls_get not implemented" -(* BACKPORT END *) + if Config.runtime5 + then I.mov (domain_field Domainstate.Domain_dls_root) (res i 0) + else Misc.fatal_error "Idls_get not implemented in runtime4." | Lreloadretaddr -> () | Lreturn -> @@ -1046,8 +1027,6 @@ let emit_instr env fallthrough i = let delta = 16 * delta_traps in cfi_adjust_cfa_offset delta; env.stack_offset <- env.stack_offset + delta -(* BACKPORT BEGIN - (exception handling) | Lpushtrap { lbl_handler; } -> let load_label_addr s arg = if !Clflags.pic_code then @@ -1068,41 +1047,6 @@ let emit_instr env fallthrough i = I.add (int 8) rsp; cfi_adjust_cfa_offset (-8); env.stack_offset <- env.stack_offset - 16 - | Lraise k -> - begin match k with - | Lambda.Raise_regular -> - emit_call "caml_raise_exn"; - record_frame env Reg.Set.empty (Dbg_raise i.dbg) - | Lambda.Raise_reraise -> - emit_call "caml_reraise_exn"; - record_frame env Reg.Set.empty (Dbg_raise i.dbg) - | Lambda.Raise_notrace -> - I.mov (domain_field Domainstate.Domain_exn_handler) rsp; - I.pop (domain_field Domainstate.Domain_exn_handler); - I.pop r11; - I.jmp r11 - end -*) - | Lpushtrap { lbl_handler; } -> - let load_label_addr s arg = - if !Clflags.pic_code then - I.lea (mem64_rip NONE (emit_label s)) arg - else - I.mov (sym (emit_label s)) arg - in - load_label_addr lbl_handler r11; - I.push r11; - cfi_adjust_cfa_offset 8; - I.push (domain_field Domainstate.Domain_exception_pointer); - cfi_adjust_cfa_offset 8; - I.mov rsp (domain_field Domainstate.Domain_exception_pointer); - env.stack_offset <- env.stack_offset + 16; - | Lpoptrap -> - I.pop (domain_field Domainstate.Domain_exception_pointer); - cfi_adjust_cfa_offset (-8); - I.add (int 8) rsp; - cfi_adjust_cfa_offset (-8); - env.stack_offset <- env.stack_offset - 16 | Lraise k -> begin match k with | Lambda.Raise_regular -> @@ -1113,12 +1057,11 @@ let emit_instr env fallthrough i = emit_call "caml_raise_exn"; record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_notrace -> - I.mov (domain_field Domainstate.Domain_exception_pointer) rsp; - I.pop (domain_field Domainstate.Domain_exception_pointer); + I.mov (domain_field Domainstate.Domain_exn_handler) rsp; + I.pop (domain_field Domainstate.Domain_exn_handler); I.pop r11; I.jmp r11 end -(* BACKPORT END *) let rec emit_all env fallthrough i = match i.desc with diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index ba15caa0db0..5cdf07f08b3 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -238,11 +238,7 @@ let win64_float_external_arguments = let win64_loc_external_arguments arg = let loc = Array.make (Array.length arg) Reg.dummy in let reg = ref 0 -(* BACKPORT BEGIN - and ofs = ref 0 in -*) - and ofs = ref 32 in -(* BACKPORT END *) + and ofs = ref (if Config.runtime5 then 0 else 32) in for i = 0 to Array.length arg - 1 do match arg.(i) with | Val | Int | Addr as ty -> @@ -293,8 +289,7 @@ let stack_ptr_dwarf_register_number = 7 (* Registers destroyed by operations *) -(* BACKPORT BEGIN -let destroyed_at_c_call = +let destroyed_at_c_call5 = (* C calling conventions preserve rbx, but it is clobbered by the code sequence used for C calls in emit.mlp, so it is marked as destroyed. *) @@ -309,8 +304,8 @@ let destroyed_at_c_call = [0;1;2;3;4;5;6;7;10;11; 100;101;102;103;104;105;106;107; 108;109;110;111;112;113;114;115]) -*) -let destroyed_at_c_call = + +let destroyed_at_c_call4 = if win64 then (* Win64: rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 preserved *) Array.of_list(List.map phys_reg @@ -322,7 +317,9 @@ let destroyed_at_c_call = [0;2;3;4;5;6;7;10;11; 100;101;102;103;104;105;106;107; 108;109;110;111;112;113;114;115]) -(* BACKPORT END *) + +let destroyed_at_c_call = + if Config.runtime5 then destroyed_at_c_call5 else destroyed_at_c_call4 let destroyed_at_alloc_or_poll = if X86_proc.use_plt then diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index 18472c5dfc0..4d64457fb36 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -37,7 +37,8 @@ exception Error of error (* Consistency check between interfaces and implementations *) -module Cmi_consistbl = Consistbl.Make (CU.Name) (CU) +module Cmi_consistbl = + Consistbl.Make (CU.Name) (Import_info.Intf.Nonalias.Kind) let crc_interfaces = Cmi_consistbl.create () let interfaces = ref ([] : CU.Name.t list) @@ -58,12 +59,12 @@ let check_consistency file_name unit crc = Array.iter (fun import -> let name = Import_info.name import in - let crco = Import_info.crc_with_unit import in + let info = Import_info.Intf.info import in interfaces := name :: !interfaces; - match crco with + match info with None -> () - | Some (full_name, crc) -> - Cmi_consistbl.check crc_interfaces name full_name crc file_name) + | Some (kind, crc) -> + Cmi_consistbl.check crc_interfaces name kind crc file_name) unit.ui_imports_cmi with Cmi_consistbl.Inconsistency { unit_name = name; @@ -102,7 +103,7 @@ let check_consistency file_name unit crc = let extract_crc_interfaces () = Cmi_consistbl.extract !interfaces crc_interfaces |> List.map (fun (name, crc_with_unit) -> - Import_info.create name ~crc_with_unit) + Import_info.Intf.create name crc_with_unit) let extract_crc_implementations () = Cmx_consistbl.extract !implementations crc_implementations @@ -127,7 +128,11 @@ let add_ccobjs origin l = end let runtime_lib () = - let libname = "libasmrun" ^ !Clflags.runtime_variant ^ ext_lib in + let variant = + if Config.runtime5 && !Clflags.runtime_variant = "nnp" then "" + else !Clflags.runtime_variant + in + let libname = "libasmrun" ^ variant ^ ext_lib in try if !Clflags.nopervasives || not !Clflags.with_runtime then [] else [ Load_path.find libname ] @@ -240,7 +245,7 @@ let make_globals_map units_list ~crc_interfaces = let crc_interfaces = crc_interfaces |> List.map (fun import -> - Import_info.name import, Import_info.crc_with_unit import) + Import_info.name import, Import_info.crc import) |> CU.Name.Tbl.of_list in let defined = @@ -248,7 +253,6 @@ let make_globals_map units_list ~crc_interfaces = let name = CU.name unit.ui_unit in let intf_crc = CU.Name.Tbl.find crc_interfaces name - |> Option.map (fun (_unit, crc) -> crc) in CU.Name.Tbl.remove crc_interfaces name; let syms = List.map Symbol.for_compilation_unit unit.ui_defines in @@ -256,7 +260,6 @@ let make_globals_map units_list ~crc_interfaces = units_list in CU.Name.Tbl.fold (fun name intf acc -> - let intf = Option.map (fun (_unit, crc) -> crc) intf in (assume_no_prefix name, intf, None, []) :: acc) crc_interfaces defined diff --git a/asmcomp/cmm_helpers.ml b/asmcomp/cmm_helpers.ml index ea618503db4..39e507b16e3 100644 --- a/asmcomp/cmm_helpers.ml +++ b/asmcomp/cmm_helpers.ml @@ -38,7 +38,9 @@ let bind_nonvar name arg fn = | _ -> let id = V.create_local name in Clet(VP.create id, arg, fn (Cvar id)) let caml_black = Nativeint.shift_left (Nativeint.of_int 3) 8 -let caml_local = Nativeint.shift_left (Nativeint.of_int 2) 8 +let caml_local = + Nativeint.shift_left (Nativeint.of_int (if Config.runtime5 then 3 else 2)) 8 +(* cf. runtime/caml/gc.h *) (* cf. runtime/caml/gc.h *) (* Loads *) @@ -707,12 +709,9 @@ let get_header ptr dbg = loads can be marked as [Immutable], since the runtime should ensure that there is no data race on headers. This saves performance with ThreadSanitizer instrumentation by avoiding to instrument header loads. *) - Cop( -(* BACKPORT BEGIN - mk_load_immut Word_int, -*) - mk_load_mut Word_int, -(* BACKPORT END *) + Cop((if Config.runtime5 + then mk_load_immut Word_int + else mk_load_mut Word_int), [Cop(Cadda, [ptr; Cconst_int(-size_int, dbg)], dbg)], dbg) let get_header_masked ptr dbg = @@ -730,12 +729,9 @@ let get_tag ptr dbg = Cop(Cand, [get_header ptr dbg; Cconst_int (255, dbg)], dbg) else (* If byte loads are efficient *) (* Same comment as [get_header] above *) - Cop( -(* BACKPORT BEGIN - mk_load_immut Byte_unsigned, -*) - mk_load_mut Byte_unsigned, -(* BACKPORT END *) + Cop((if Config.runtime5 + then mk_load_immut Byte_unsigned + else mk_load_mut Byte_unsigned), [Cop(Cadda, [ptr; Cconst_int(tag_offset, dbg)], dbg)], dbg) let get_size ptr dbg = @@ -914,8 +910,6 @@ module Extended_machtype = struct let typ_any_int = [| Extended_machtype_component.Any_int |] - let typ_int64 = [| Extended_machtype_component.Any_int |] - let typ_float = [| Extended_machtype_component.Float |] let typ_void = [||] @@ -934,13 +928,16 @@ module Extended_machtype = struct | Ptop -> Misc.fatal_error "No Extended_machtype for layout [Ptop]" | Pbottom -> Misc.fatal_error "No unique Extended_machtype for layout [Pbottom]" - | Punboxed_float -> typ_float + | Punboxed_float Pfloat64 -> typ_float + | Punboxed_float Pfloat32 -> + Misc.fatal_error "float32 is not supported in the upstream compiler build." | Punboxed_int _ -> (* Only 64-bit architectures, so this is always [typ_int] *) typ_any_int | Pvalue Pintval -> typ_tagged_int | Punboxed_vector _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + Misc.fatal_error + "SIMD vectors are not supported in the upstream compiler build." | Pvalue _ -> typ_val | Punboxed_product _ -> failwith "TODO" end @@ -1012,11 +1009,9 @@ let make_alloc_generic ~mode set_fn dbg tag wordsize args = | e1::el -> Csequence(set_fn (Cvar id) (Cconst_int (idx, dbg)) e1 dbg, fill_fields (idx + 2) el) in Clet(VP.create id, -(* BACKPORT BEGIN - Cop(Cextcall("caml_alloc_shr_check_gc", typ_val, [], true), -*) - Cop(Cextcall("caml_alloc", typ_val, [], true), -(* BACKPORT END *) + Cop(Cextcall((if Config.runtime5 + then "caml_alloc_shr_check_gc" + else "caml_alloc"), typ_val, [], true), [Cconst_int (wordsize, dbg); Cconst_int (tag, dbg)], dbg), fill_fields 1 args) end @@ -1576,7 +1571,7 @@ let box_sized size mode dbg exp = (* Simplification of some primitives into C calls *) let default_prim name = - Primitive.simple_on_values ~name ~arity:0(*ignored*) ~alloc:true + Lambda.simple_prim_on_values ~name ~arity:0(*ignored*) ~alloc:true let simplif_primitive p : Clambda_primitives.primitive = match (p : Clambda_primitives.primitive) with @@ -2517,6 +2512,8 @@ let arraylength kind arg dbg = Cop(Cor, [addr_array_length_shifted hdr dbg; Cconst_int (1, dbg)], dbg) | Pfloatarray -> Cop(Cor, [float_array_length_shifted hdr dbg; Cconst_int (1, dbg)], dbg) + | Punboxedfloatarray _ | Punboxedintarray _ -> + Misc.fatal_errorf "Unboxed arrays not supported" let bbswap bi arg dbg = let prim, tyarg = match (bi : Primitive.boxed_integer) with @@ -2554,13 +2551,9 @@ let assignment_kind | Assignment Modify_maybe_stack, Pointer -> assert Config.stack_allocation; Caml_modify_local -(* BACKPORT BEGIN - | Heap_initialization, Pointer - | Root_initialization, Pointer -> Caml_initialize -*) | Heap_initialization, Pointer -> Caml_initialize - | Root_initialization, Pointer -> Simple Initialization -(* BACKPORT END *) + | Root_initialization, Pointer -> + if Config.runtime5 then Caml_initialize else Simple Initialization | (Assignment _), Immediate -> Simple Assignment | Heap_initialization, Immediate | Root_initialization, Immediate -> Simple Initialization @@ -2711,6 +2704,8 @@ let arrayref_unsafe rkind arg1 arg2 dbg = int_array_ref arg1 arg2 dbg | Pfloatarray_ref mode -> float_array_ref mode arg1 arg2 dbg + | Punboxedfloatarray_ref _ | Punboxedintarray_ref _ -> + Misc.fatal_errorf "Unboxed arrays not supported" let arrayref_safe rkind arg1 arg2 dbg = match (rkind : Lambda.array_ref_kind) with @@ -2764,6 +2759,8 @@ let arrayref_safe rkind arg1 arg2 dbg = (get_header_masked arr dbg) dbg; idx], unboxed_float_array_ref arr idx dbg)))) + | Punboxedfloatarray_ref _ | Punboxedintarray_ref _ -> + Misc.fatal_errorf "Unboxed arrays not supported" type ternary_primitive = expression -> expression -> expression -> Debuginfo.t -> expression @@ -2814,6 +2811,8 @@ let arrayset_unsafe skind arg1 arg2 arg3 dbg = int_array_set arg1 arg2 arg3 dbg | Pfloatarray_set -> float_array_set arg1 arg2 arg3 dbg + | Punboxedfloatarray_set _ | Punboxedintarray_set _ -> + Misc.fatal_errorf "Unboxed arrays not supported" ) let arrayset_safe skind arg1 arg2 arg3 dbg = @@ -2877,6 +2876,8 @@ let arrayset_safe skind arg1 arg2 arg3 dbg = (get_header_masked arr dbg) dbg; idx], float_array_set arr idx newval dbg)))) + | Punboxedfloatarray_set _ | Punboxedintarray_set _ -> + Misc.fatal_errorf "Unboxed arrays not supported" ) let bytes_set size unsafe arg1 arg2 arg3 dbg = @@ -3207,12 +3208,17 @@ let emit_preallocated_blocks preallocated_blocks cont = let kind_of_layout (layout : Lambda.layout) = match layout with - | Pvalue Pfloatval -> Boxed_float + | Pvalue (Pboxedfloatval Pfloat64) -> Boxed_float + | Pvalue (Pboxedfloatval Pfloat32) + | Punboxed_float Pfloat32 -> + Misc.fatal_error "float32 is not supported in the upstream compiler build." | Pvalue (Pboxedintval bi) -> Boxed_integer bi | Pvalue (Pgenval | Pintval | Pvariant _ | Parrayval _) - | Ptop | Pbottom | Punboxed_float | Punboxed_int _ | Punboxed_product _ -> Any + | Ptop | Pbottom | Punboxed_float Pfloat64 + | Punboxed_int _ | Punboxed_product _ -> Any | Pvalue (Pboxedvectorval _) | Punboxed_vector _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + Misc.fatal_error + "SIMD vectors are not supported in the upstream compiler build." let make_tuple l = match l with [e] -> e | _ -> Ctuple l diff --git a/asmcomp/cmm_helpers.mli b/asmcomp/cmm_helpers.mli index 1e977a256dc..82f961f6ab1 100644 --- a/asmcomp/cmm_helpers.mli +++ b/asmcomp/cmm_helpers.mli @@ -311,8 +311,6 @@ module Extended_machtype : sig val typ_any_int : t - val typ_int64 : t - val typ_float : t val typ_void : t diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 5be04115dfe..a6faaad11b8 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -20,7 +20,6 @@ open Misc open Asttypes open Primitive -open Types open Lambda open Clambda open Clambda_primitives @@ -116,28 +115,33 @@ let mut_from_env env ptr = else Asttypes.Mutable | _ -> Asttypes.Mutable -(* BACKPORT (* Minimum of two [mutable_flag] values, assuming [Immutable < Mutable]. *) let min_mut x y = match x,y with - | Immutable,_ | _,Immutable -> Immutable - | Mutable,Mutable -> Mutable -*) - -(* BACKPORT BEGIN -let get_field env mut ptr n dbg = - let mut = min_mut mut (mut_from_env env ptr) in -*) -let get_field env layout ptr n dbg = - let mut = mut_from_env env ptr in -(* BACKPORT END *) + | Asttypes.Immutable, _ + | _, Asttypes.Immutable -> Asttypes.Immutable + | Asttypes.Mutable, Asttypes.Mutable -> Asttypes.Mutable + +let mut_from_lambda = function + | Lambda.Immutable -> Asttypes.Immutable + | Lambda.Immutable_unique -> Asttypes.Immutable + | Lambda.Mutable -> Asttypes.Mutable + +let get_field env mut layout ptr n dbg = + let mut = if Config.runtime5 + then min_mut (mut_from_lambda mut) (mut_from_env env ptr) + else mut_from_env env ptr in let memory_chunk = match layout with | Pvalue Pintval | Punboxed_int _ -> Word_int | Pvalue _ -> Word_val - | Punboxed_float -> Double + | Punboxed_float Pfloat64 -> Double + | Punboxed_float Pfloat32 -> + Misc.fatal_error + "float32 is not supported in the upstream compiler build." | Punboxed_vector _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + Misc.fatal_error + "SIMD vectors are not supported in the upstream compiler build." | Punboxed_product _ -> Misc.fatal_error "TODO" | Ptop -> Misc.fatal_errorf "get_field with Ptop: %a" Debuginfo.print_compact dbg @@ -147,72 +151,6 @@ let get_field env layout ptr n dbg = in get_field_gen_given_memory_chunk memory_chunk mut ptr n dbg -type rhs_kind = - | RHS_block of Lambda.alloc_mode * int - | RHS_infix of { blocksize : int; offset : int; blockmode: Lambda.alloc_mode } - | RHS_floatblock of Lambda.alloc_mode * int - | RHS_nonrec - -let rec expr_size env = function - | Uvar id -> - begin try V.find_same id env with Not_found -> RHS_nonrec end - | Uclosure { functions ; not_scanned_slots ; scanned_slots } -> - (* should all have the same mode *) - let fn_mode = (List.hd functions).mode in - List.iter (fun f -> assert (Lambda.eq_mode fn_mode f.mode)) functions; - RHS_block (fn_mode, - fundecls_size functions + List.length not_scanned_slots - + List.length scanned_slots) - | Ulet(_str, _kind, id, exp, body) -> - expr_size (V.add (VP.var id) (expr_size env exp) env) body - | Uletrec(bindings, body) -> - let env = - List.fold_right - (fun (id, exp) env -> V.add (VP.var id) (expr_size env exp) env) - bindings env - in - expr_size env body - | Uprim(Pmakeblock (_, _, _, mode), args, _) -> - RHS_block (mode, List.length args) - | Uprim(Pmakeufloatblock (_, mode), args, _) -> - RHS_floatblock (mode, List.length args) - | Uprim(Pmakearray((Paddrarray | Pintarray), _, mode), args, _) -> - RHS_block (mode, List.length args) - | Uprim(Pmakearray(Pfloatarray, _, mode), args, _) -> - RHS_floatblock (mode, List.length args) - | Uprim(Pmakearray(Pgenarray, _, _mode), _, _) -> - (* Pgenarray is excluded from recursive bindings by the - check in Translcore.check_recursive_lambda *) - RHS_nonrec - | Uprim (Pduprecord ((Record_boxed _ | Record_inlined (_, Variant_boxed _)), - sz), _, _) -> - RHS_block (Lambda.alloc_heap, sz) - | Uprim (Pduprecord ((Record_unboxed - | Record_inlined (_, Variant_unboxed)), - _), _, _) -> - assert false - | Uprim (Pduprecord (Record_inlined (_, Variant_extensible), sz), _, _) -> - RHS_block (Lambda.alloc_heap, sz + 1) - | Uprim (Pduprecord ((Record_float | Record_ufloat), sz), _, _) -> - RHS_floatblock (Lambda.alloc_heap, sz) - | Uprim (Pccall { prim_name; _ }, closure::_, _) - when prim_name = "caml_check_value_is_closure" -> - (* Used for "-clambda-checks". *) - expr_size env closure - | Usequence(_exp, exp') -> - expr_size env exp' - | Uoffset (exp, offset) -> - (match expr_size env exp with - | RHS_block (blockmode, blocksize) -> - RHS_infix { blocksize; offset; blockmode } - | RHS_nonrec -> RHS_nonrec - | _ -> assert false) - | Uregion exp -> - expr_size env exp - | Uexclave exp -> - expr_size env exp - | _ -> RHS_nonrec - (* Translate structured constants to Cmm data items *) let transl_constant dbg = function @@ -354,13 +292,19 @@ let exttype_of_sort (s : Jkind.Sort.const) = match s with | Value -> XInt | Float64 -> XFloat + | Word -> XInt + | Bits32 -> XInt32 + | Bits64 -> XInt64 | Void -> Misc.fatal_error "Cmmgen.exttype_of_sort: void encountered" + | Float32 -> Misc.fatal_error "Cmmgen.exttype_of_sort: float32 encountered" let machtype_of_sort (s : Jkind.Sort.const) = match s with | Value -> typ_val | Float64 -> typ_float + | Word | Bits32 | Bits64 -> typ_int | Void -> Misc.fatal_error "Cmmgen.machtype_of_sort: void encountered" + | Float32 -> Misc.fatal_error "Cmmgen.machtype_of_sort: float32 encountered" let is_unboxed_number_cmm ~strict cmm = let r = ref No_result in @@ -549,8 +493,6 @@ let rec transl env e = Some defining_expr in Cphantom_let (var, defining_expr, transl env body) - | Uletrec(bindings, body) -> - transl_letrec env bindings (transl env body) (* Primitives *) | Uprim(prim, args, dbg) -> @@ -581,7 +523,7 @@ let rec transl env e = transl_make_array dbg env kind alloc_heap args | (Pduparray _, [arg]) -> let prim_obj_dup = - Primitive.simple_on_values ~name:"caml_obj_dup" ~arity:1 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_obj_dup" ~arity:1 ~alloc:true in transl_ccall env prim_obj_dup [arg] dbg | (Pmakearray _, []) -> @@ -637,6 +579,9 @@ let rec transl env e = transl_prim_2 env p arg1 arg2 dbg | (p, [arg1; arg2; arg3]) -> transl_prim_3 env p arg1 arg2 arg3 dbg + (* Mixed blocks *) + | (Pmakemixedblock _ | Psetmixedfield _ | Pmixedfield _), _-> + Misc.fatal_error "Mixed blocks not supported in upstream compiler build" | (Pread_symbol _, _::_::_::_::_) | (Pbigarrayset (_, _, _, _), []) | (Pbigarrayref (_, _, _, _), []) @@ -651,9 +596,11 @@ let rec transl env e = | Patomic_cas | Patomic_fetch_add | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint - | Plsrint | Pasrint | Pintoffloat | Pfloatofint _ - | Pnegfloat _ | Pabsfloat _ | Paddfloat _ | Psubfloat _ - | Pmulfloat _ | Pdivfloat _ | Pstringlength | Pstringrefu + | Plsrint | Pasrint | Pintoffloat _ | Pfloatofint (_, _) + | Pnegfloat (_, _) | Pabsfloat (_, _) + | Paddfloat (_, _) | Psubfloat (_, _) + | Pmulfloat (_, _) | Pdivfloat (_, _) + | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets | Pisint | Pisout | Pbswap16 | Pint_as_pointer _ | Popaque | Pfield _ @@ -661,15 +608,15 @@ let rec transl env e = | Pfloatfield _ | Psetfloatfield (_, _) | Pduprecord (_, _) | Pufloatfield _ | Psetufloatfield (_, _) | Praise _ | Pdivint _ | Pmodint _ | Pintcomp _ | Poffsetint _ - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ - | Poffsetref _ | Pfloatcomp _ | Parraylength _ - | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ + | Poffsetref _ | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) + | Parraylength _ | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ | Pbintofint _ | Pintofbint _ | Pcvtbint _ | Pnegbint _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ - | Pasrbint _ | Pbintcomp (_, _) | Pstring_load _ | Pbytes_load _ - | Pbytes_set _ | Pbigstring_load _ | Pbigstring_set _ - | Punbox_float | Pbox_float _ | Punbox_int _ | Pbox_int _ + | Pasrbint _ | Pbintcomp (_, _) | Punboxed_int_comp (_, _) | Pstring_load _ + | Pbytes_load _ | Pbytes_set _ | Pbigstring_load _ | Pbigstring_set _ + | Punbox_float _ | Pbox_float (_, _) | Punbox_int _ | Pbox_int _ | Pbbswap _ | Pget_header _), _) -> fatal_error "Cmmgen.transl:prim" @@ -868,13 +815,18 @@ and transl_make_array dbg env kind mode args = | Pfloatarray -> make_float_alloc ~mode dbg Obj.double_array_tag (List.map (transl_unbox_float dbg env) args) + | Punboxedfloatarray _ | Punboxedintarray _ -> + Misc.fatal_errorf "Unboxed arrays not supported" and transl_ccall env prim args dbg = let transl_arg native_repr arg = match native_repr with | Same_as_ocaml_repr sort -> (exttype_of_sort sort, transl env arg) - | Unboxed_float -> + | Unboxed_float Pfloat64 -> (XFloat, transl_unbox_float dbg env arg) + | Unboxed_float Pfloat32 -> + Misc.fatal_error + "float32 is not supported in the upstream compiler build." | Unboxed_integer bi -> let xty = match bi with @@ -883,7 +835,8 @@ and transl_ccall env prim args dbg = | Pint64 -> XInt64 in (xty, transl_unbox_int dbg env bi arg) | Unboxed_vector _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + Misc.fatal_error + "SIMD vectors are not supported in the upstream compiler build." | Untagged_int -> (XInt, untag_int (transl env arg) dbg) in @@ -904,11 +857,15 @@ and transl_ccall env prim args dbg = match prim.prim_native_repr_res with | _, Same_as_ocaml_repr sort -> (machtype_of_sort sort, fun x -> x) (* TODO: Allow Alloc_local on suitably typed C stubs *) - | _, Unboxed_float -> (typ_float, box_float dbg alloc_heap) + | _, Unboxed_float Pfloat64 -> (typ_float, box_float dbg alloc_heap) + | _, Unboxed_float Pfloat32 -> + Misc.fatal_error + "float32 is not supported in the upstream compiler build." | _, Unboxed_integer bi -> (typ_int, box_int dbg bi alloc_heap) | _, Untagged_int -> (typ_int, (fun i -> tag_int i dbg)) | _, Unboxed_vector _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + Misc.fatal_error + "SIMD vectors are not supported in the upstream compiler build." in let typ_args, args = transl_args prim.prim_native_repr_args args in wrap_result @@ -921,13 +878,13 @@ and transl_prim_1 env p arg dbg = Popaque -> opaque (transl env arg) dbg (* Heap operations *) - | Pfield (n, layout, _, _) -> - get_field env layout (transl env arg) n dbg + | Pfield (n, layout, _, mut) -> + get_field env mut layout (transl env arg) n dbg | Pfloatfield (n,mode) -> let ptr = transl env arg in box_float dbg mode (floatfield n ptr dbg) | Pufloatfield n -> - get_field env Punboxed_float (transl env arg) n dbg + get_field env Mutable (Punboxed_float Pfloat64) (transl env arg) n dbg | Pint_as_pointer _ -> int_as_pointer (transl env arg) dbg (* Exceptions *) @@ -945,18 +902,25 @@ and transl_prim_1 env p arg dbg = | Pbox_int (bi, m) -> box_int dbg bi m (transl env arg) (* Floating-point operations *) - | Punbox_float -> + | Punbox_float Pfloat64 -> transl_unbox_float dbg env arg - | Pbox_float m -> + | Pbox_float (Pfloat64, m) -> box_float dbg m (transl env arg) - | Pfloatofint m -> + | Pfloatofint (Pfloat64, m) -> box_float dbg m (Cop(Cfloatofint, [untag_int(transl env arg) dbg], dbg)) - | Pintoffloat -> + | Pintoffloat Pfloat64 -> tag_int(Cop(Cintoffloat, [transl_unbox_float dbg env arg], dbg)) dbg - | Pnegfloat m -> + | Pnegfloat (Pfloat64, m) -> box_float dbg m (Cop(Cnegf, [transl_unbox_float dbg env arg], dbg)) - | Pabsfloat m -> + | Pabsfloat (Pfloat64, m) -> box_float dbg m (Cop(Cabsf, [transl_unbox_float dbg env arg], dbg)) + | Punbox_float Pfloat32 + | Pbox_float (Pfloat32, _) + | Pfloatofint (Pfloat32, _) + | Pintoffloat Pfloat32 + | Pnegfloat (Pfloat32, _) + | Pabsfloat (Pfloat32, _) -> + Misc.fatal_error "float32 is not supported in the upstream compiler build." (* String operations *) | Pstringlength | Pbyteslength -> tag_int(string_length (transl env arg) dbg) dbg @@ -991,41 +955,43 @@ and transl_prim_1 env p arg dbg = | Pget_header m -> box_int dbg Pnativeint m (get_header (transl env arg) dbg) | Pperform -> - Misc.fatal_error "Effects-related primitives not yet supported" - (* CR mshinwell: use [Runtimetags] once available let cont = - make_alloc dbg cont_tag [int_const dbg 0] ~mode:Lambda.alloc_heap + make_alloc dbg Runtimetags.cont_tag [int_const dbg 0] + ~mode:Lambda.alloc_heap in - (* CR mshinwell: Rc_normal may be wrong, but this code is unlikely - to be in production by then *) - Cop(Capply (typ_val, Rc_normal), + (* Rc_normal means "allow tailcalls". Preventing them here by using + Rc_nontail improves backtraces of paused fibers. *) + Cop(Capply (typ_val, Rc_nontail), [Cconst_symbol ("caml_perform", dbg); transl env arg; cont], dbg) - *) | Pdls_get -> Cop(Cdls_get, [transl env arg], dbg) | Patomic_load {immediate_or_pointer = Immediate} -> Cop(mk_load_atomic Word_int, [transl env arg], dbg) | Patomic_load {immediate_or_pointer = Pointer} -> Cop(mk_load_atomic Word_val, [transl env arg], dbg) + (* Mixed blocks *) + | Pmakemixedblock _ | Psetmixedfield _ | Pmixedfield _ -> + Misc.fatal_error "Mixed blocks not supported in upstream compiler build" | (Pfield_computed | Psequand | Psequor | Prunstack | Presume | Preperform | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint - | Paddfloat _ | Psubfloat _ | Pmulfloat _ | Pdivfloat _ + | Paddfloat (_, _) | Psubfloat (_, _) + | Pmulfloat (_, _) | Pdivfloat (_, _) | Pstringrefu | Pstringrefs | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets | Pisout | Pread_symbol _ | Pmakeblock (_, _, _, _) | Psetfield (_, _, _) | Psetfield_computed (_, _) | Pmakeufloatblock (_, _) | Psetfloatfield (_, _) | Pduprecord (_, _) | Pccall _ | Pdivint _ | Psetufloatfield (_, _) - | Pmodint _ | Pintcomp _ | Pfloatcomp _ | Pmakearray (_, _, _) - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ + | Pmodint _ | Pintcomp _ | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) + | Pmakearray (_, _, _) | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ | Pduparray (_, _) | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ | Pxorbint _ - | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) + | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) | Punboxed_int_comp (_, _) | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pstring_load _ | Pbytes_load _ | Pbytes_set _ | Pbigstring_load _ | Pbigstring_set _ | Pprobe_is_enabled _) @@ -1098,39 +1064,53 @@ and transl_prim_2 env p arg1 arg2 dbg = let a1 = transl_unbox_int dbg env bi arg1 in let a2 = transl_unbox_int dbg env bi arg2 in mk_compare_ints dbg a1 a2 - | Pcompare_floats -> + | Pcompare_floats Pfloat64 -> let a1 = transl_unbox_float dbg env arg1 in let a2 = transl_unbox_float dbg env arg2 in mk_compare_floats dbg a1 a2 + | Pcompare_floats Pfloat32 -> + Misc.fatal_error + "float32 is not supported in the upstream compiler build." | Pisout -> transl_isout (transl env arg1) (transl env arg2) dbg (* Float operations *) - | Paddfloat m -> + | Paddfloat (Pfloat64, m) -> box_float dbg m (Cop(Caddf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) - | Psubfloat m -> + | Psubfloat (Pfloat64, m) -> box_float dbg m (Cop(Csubf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) - | Pmulfloat m -> + | Pmulfloat (Pfloat64, m) -> box_float dbg m (Cop(Cmulf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) - | Pdivfloat m -> + | Pdivfloat (Pfloat64, m) -> box_float dbg m (Cop(Cdivf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) - | Pfloatcomp cmp -> + | Pfloatcomp (Pfloat64, cmp) -> tag_int(Cop(Ccmpf cmp, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) dbg - + | Punboxed_float_comp (Pfloat64, cmp) -> + tag_int(Cop(Ccmpf cmp, + [transl env arg1; + transl env arg2], + dbg)) dbg + | Paddfloat (Pfloat32, _) + | Psubfloat (Pfloat32, _) + | Pmulfloat (Pfloat32, _) + | Pdivfloat (Pfloat32, _) + | Pfloatcomp (Pfloat32, _) + | Punboxed_float_comp (Pfloat32, _) -> + Misc.fatal_error "float32 is not supported in the upstream compiler build" (* String operations *) | Pstringrefu | Pbytesrefu -> stringref_unsafe (transl env arg1) (transl env arg2) dbg @@ -1199,16 +1179,26 @@ and transl_prim_2 env p arg1 arg2 dbg = tag_int (Cop(Ccmpi cmp, [transl_unbox_int dbg env bi arg1; transl_unbox_int dbg env bi arg2], dbg)) dbg + | Punboxed_int_comp(_, cmp) -> + tag_int (Cop(Ccmpi cmp, + [transl env arg1; + transl env arg2], dbg)) dbg | Patomic_exchange -> Cop (Cextcall ("caml_atomic_exchange", typ_val, [], false), [transl env arg1; transl env arg2], dbg) | Patomic_fetch_add -> Cop (Cextcall ("caml_atomic_fetch_add", typ_int, [], false), [transl env arg1; transl env arg2], dbg) + + (* Mixed blocks *) + | Pmakemixedblock _ | Psetmixedfield _ | Pmixedfield _ -> + Misc.fatal_error "Mixed blocks not supported in upstream compiler build" + | Prunstack | Pperform | Presume | Preperform | Pdls_get | Patomic_cas | Patomic_load _ - | Pnot | Pnegint | Pintoffloat | Pfloatofint _ | Pnegfloat _ - | Pabsfloat _ | Pstringlength | Pbyteslength | Pbytessetu | Pbytessets + | Pnot | Pnegint | Pintoffloat _ | Pfloatofint (_, _) + | Pnegfloat (_, _) | Pabsfloat (_, _) + | Pstringlength | Pbyteslength | Pbytessetu | Pbytessets | Pisint | Pbswap16 | Pint_as_pointer _ | Popaque | Pread_symbol _ | Pmakeblock (_, _, _, _) | Pfield _ | Psetfield_computed (_, _) | Pmakeufloatblock (_, _) | Pfloatfield _ | Pufloatfield _ @@ -1218,7 +1208,8 @@ and transl_prim_2 env p arg1 arg2 dbg = | Pnegbint _ | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pbytes_set _ | Pbigstring_set _ | Pbbswap _ | Pprobe_is_enabled _ - | Punbox_float | Pbox_float _ | Punbox_int _ | Pbox_int _ | Pget_header _ + | Punbox_float _ | Pbox_float (_, _) + | Punbox_int _ | Pbox_int _ | Pget_header _ -> fatal_errorf "Cmmgen.transl_prim_2: %a" Printclambda_primitives.primitive p @@ -1265,60 +1256,62 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = Cop (Cextcall ("caml_atomic_cas", typ_int, [], false), [transl env arg1; transl env arg2; transl env arg3], dbg) + (* Mixed blocks *) + | Pmakemixedblock _ | Psetmixedfield _ | Pmixedfield _ -> + Misc.fatal_error "Mixed blocks not supported in upstream compiler build" + (* Effects *) | Presume -> - Misc.fatal_error "Effects-related primitives not yet supported" - (* - (* CR mshinwell: Rc_normal may be wrong, but this code is unlikely - to be in production by then *) + (* Rc_normal is required here, because there are some usages of effects + with repeated resumes, and these should consume O(1) stack space by + tail-calling caml_resume. *) Cop (Capply (typ_val, Rc_normal), [Cconst_symbol ("caml_resume", dbg); transl env arg1; transl env arg2; transl env arg3], dbg) - *) | Prunstack -> - Misc.fatal_error "Effects-related primitives not yet supported" - (* - (* CR mshinwell: Rc_normal may be wrong, but this code is unlikely - to be in production by then *) - Cop (Capply (typ_val, Rc_normal), + (* Rc_normal is fine here but unlikely to ever be a tail call (usages + of this primitive shouldn't be generated in tail position), so + we use Rc_nontail for clarity. *) + Cop (Capply (typ_val, Rc_nontail), [Cconst_symbol ("caml_runstack", dbg); transl env arg1; transl env arg2; transl env arg3], dbg) - *) | Preperform -> - Misc.fatal_error "Effects-related primitives not yet supported" - (* - (* CR mshinwell: Rc_normal may be wrong, but this code is unlikely - to be in production by then *) + (* Rc_normal is required here, this is used in tail position and should + tail call. *) Cop (Capply (typ_val, Rc_normal), [Cconst_symbol ("caml_reperform", dbg); transl env arg1; transl env arg2; transl env arg3], dbg) - *) | Pperform | Pdls_get | Patomic_exchange | Patomic_fetch_add | Patomic_load _ | Pfield_computed | Psequand | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint - | Pintoffloat | Pfloatofint _ | Pnegfloat _ | Pabsfloat _ | Paddfloat _ | Psubfloat _ - | Pmulfloat _ | Pdivfloat _ | Pstringlength | Pstringrefu | Pstringrefs - | Pbyteslength | Pbytesrefu | Pbytesrefs | Pisint | Pisout - | Pbswap16 | Pint_as_pointer _ | Popaque | Pread_symbol _ + | Pintoffloat _ | Pfloatofint (_, _) | Pnegfloat (_, _) + | Pabsfloat (_, _) | Paddfloat (_, _) | Psubfloat (_, _) + | Pmulfloat (_, _) | Pdivfloat (_, _) | Pstringlength + | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytesrefs | Pisint + | Pisout | Pbswap16 | Pint_as_pointer _ | Popaque | Pread_symbol _ | Pmakeblock (_, _, _, _) | Pfield _ | Psetfield (_, _, _) | Pfloatfield _ | Psetfloatfield (_, _) | Pmakeufloatblock (_, _) | Pufloatfield _ | Psetufloatfield (_, _) | Pduprecord (_, _) | Pccall _ | Praise _ | Pdivint _ | Pmodint _ | Pintcomp _ - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ - | Poffsetint _ | Poffsetref _ | Pfloatcomp _ | Pmakearray (_, _, _) + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ + | Poffsetint _ | Poffsetref _ + | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) + | Pmakearray (_, _, _) | Pduparray (_, _) | Parraylength _ | Parrayrefu _ | Parrayrefs _ | Pbintofint _ | Pintofbint _ | Pcvtbint _ | Pnegbint _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ - | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) + | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ + | Pbintcomp (_, _) | Punboxed_int_comp (_, _) | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pstring_load _ | Pbytes_load _ | Pbigstring_load _ | Pbbswap _ | Pprobe_is_enabled _ - | Punbox_float | Pbox_float _ | Punbox_int _ | Pbox_int _ | Pget_header _ + | Punbox_float _ | Pbox_float (_, _) + | Punbox_int _ | Pbox_int _ | Pget_header _ -> fatal_errorf "Cmmgen.transl_prim_3: %a" Printclambda_primitives.primitive p @@ -1354,13 +1347,17 @@ and transl_let_value env str (kind : Lambda.value_kind) id exp transl_body = We conservatively mark these as Alloc_heap, although with more tracking of allocation mode it may be possible to mark some Alloc_local *) match str, kind with - | Mutable, Pfloatval -> + | Mutable, Pboxedfloatval Pfloat64 -> Boxed (Boxed_float (alloc_heap, dbg), false) + | _, Pboxedfloatval Pfloat32 -> + Misc.fatal_error + "float32 is not supported in the upstream compiler build." | Mutable, Pboxedintval bi -> Boxed (Boxed_integer (bi, alloc_heap, dbg), false) | _, Pboxedvectorval _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." - | _, (Pfloatval | Pboxedintval _) -> + Misc.fatal_error + "SIMD vectors are not supported in the upstream compiler build." + | _, (Pboxedfloatval Pfloat64 | Pboxedintval _) -> (* It would be safe to always unbox in this case, but we do it only if this indeed allows us to get rid of some allocations in the bound expression. *) @@ -1407,8 +1404,12 @@ and transl_let env str (layout : Lambda.layout) id exp transl_body = let _cbody : expression = transl_body env in cexp | Punboxed_vector _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." - | Punboxed_float | Punboxed_int _ -> begin + Misc.fatal_error + "SIMD vectors are not supported in the upstream compiler build." + | Punboxed_float Pfloat32 -> + Misc.fatal_error + "float32 is not supported in the upstream compiler build." + | Punboxed_float Pfloat64 | Punboxed_int _ -> begin let cexp = transl env exp in let cbody = transl_body env in match str with @@ -1572,51 +1573,6 @@ and transl_switch dbg (kind : Cmm.kind_for_unboxing) env arg index cases = match let cases = Array.map (transl env) cases in transl_switch_clambda dbg kind arg index cases -and transl_letrec env bindings cont = - let dbg = Debuginfo.none in - let bsz = - List.map (fun (id, exp) -> (id, exp, expr_size V.empty exp)) - bindings - in - let op_alloc prim args = - Cop(Cextcall(prim, typ_val, [], true), args, dbg) in - let rec init_blocks = function - | [] -> fill_nonrec bsz - | (_, _, - (RHS_block (Alloc_local, _) | - RHS_infix {blockmode=Alloc_local; _} | - RHS_floatblock (Alloc_local, _))) :: _ -> - Misc.fatal_error "Invalid stack allocation found" - | (id, _exp, RHS_block (Alloc_heap, sz)) :: rem -> - Clet(id, op_alloc "caml_alloc_dummy" [int_const dbg sz], - init_blocks rem) - | (id, _exp, RHS_infix { blocksize; offset; blockmode=Alloc_heap }) :: rem -> - Clet(id, op_alloc "caml_alloc_dummy_infix" - [int_const dbg blocksize; int_const dbg offset], - init_blocks rem) - | (id, _exp, RHS_floatblock (Alloc_heap, sz)) :: rem -> - Clet(id, op_alloc "caml_alloc_dummy_float" [int_const dbg sz], - init_blocks rem) - | (id, _exp, RHS_nonrec) :: rem -> - Clet (id, Cconst_int (1, dbg), init_blocks rem) - and fill_nonrec = function - | [] -> fill_blocks bsz - | (_id, _exp, - (RHS_block _ | RHS_infix _ | RHS_floatblock _)) :: rem -> - fill_nonrec rem - | (id, exp, RHS_nonrec) :: rem -> - Clet(id, transl env exp, fill_nonrec rem) - and fill_blocks = function - | [] -> cont - | (id, exp, (RHS_block _ | RHS_infix _ | RHS_floatblock _)) :: rem -> - let op = - Cop(Cextcall("caml_update_dummy", typ_void, [], false), - [Cvar (VP.var id); transl env exp], dbg) in - Csequence(op, fill_blocks rem) - | (_id, _exp, RHS_nonrec) :: rem -> - fill_blocks rem - in init_blocks bsz - (* Translate a function definition *) let transl_function f = diff --git a/boot/menhir/parser.ml b/boot/menhir/parser.ml index fb9a89e5a7e..7f42597528d 100644 --- a/boot/menhir/parser.ml +++ b/boot/menhir/parser.ml @@ -17,7 +17,7 @@ module MenhirBasics = struct | UNIQUE | UNDERSCORE | UIDENT of ( -# 1148 "parsing/parser.mly" +# 1061 "parsing/parser.mly" (string) # 23 "parsing/parser.ml" ) @@ -29,7 +29,7 @@ module MenhirBasics = struct | THEN | STRUCT | STRING of ( -# 1135 "parsing/parser.mly" +# 1048 "parsing/parser.mly" (string * Location.t * string option) # 35 "parsing/parser.ml" ) @@ -42,12 +42,12 @@ module MenhirBasics = struct | RBRACKET | RBRACE | QUOTED_STRING_ITEM of ( -# 1139 "parsing/parser.mly" +# 1052 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 48 "parsing/parser.ml" ) | QUOTED_STRING_EXPR of ( -# 1137 "parsing/parser.mly" +# 1050 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 53 "parsing/parser.ml" ) @@ -55,7 +55,7 @@ module MenhirBasics = struct | QUESTION | PRIVATE | PREFIXOP of ( -# 1120 "parsing/parser.mly" +# 1033 "parsing/parser.mly" (string) # 61 "parsing/parser.ml" ) @@ -65,7 +65,7 @@ module MenhirBasics = struct | PERCENT | OR | OPTLABEL of ( -# 1113 "parsing/parser.mly" +# 1026 "parsing/parser.mly" (string) # 71 "parsing/parser.ml" ) @@ -77,6 +77,7 @@ module MenhirBasics = struct | NEW | MUTABLE | MODULE + | MOD | MINUSGREATER | MINUSDOT | MINUS @@ -85,14 +86,14 @@ module MenhirBasics = struct | LPAREN | LOCAL | LIDENT of ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 91 "parsing/parser.ml" +# 92 "parsing/parser.ml" ) | LETOP of ( -# 1074 "parsing/parser.mly" +# 984 "parsing/parser.mly" (string) -# 96 "parsing/parser.ml" +# 97 "parsing/parser.ml" ) | LET | LESSMINUS @@ -111,60 +112,62 @@ module MenhirBasics = struct | LBRACE | LAZY | LABEL of ( -# 1080 "parsing/parser.mly" +# 992 "parsing/parser.mly" (string) -# 117 "parsing/parser.ml" +# 118 "parsing/parser.ml" ) + | KIND_OF + | KIND_ABBREV | INT of ( -# 1078 "parsing/parser.mly" +# 988 "parsing/parser.mly" (string * char option) -# 122 "parsing/parser.ml" +# 125 "parsing/parser.ml" ) | INITIALIZER | INHERIT | INFIXOP4 of ( -# 1072 "parsing/parser.mly" +# 982 "parsing/parser.mly" (string) -# 129 "parsing/parser.ml" +# 132 "parsing/parser.ml" ) | INFIXOP3 of ( -# 1071 "parsing/parser.mly" +# 981 "parsing/parser.mly" (string) -# 134 "parsing/parser.ml" +# 137 "parsing/parser.ml" ) | INFIXOP2 of ( -# 1070 "parsing/parser.mly" +# 980 "parsing/parser.mly" (string) -# 139 "parsing/parser.ml" +# 142 "parsing/parser.ml" ) | INFIXOP1 of ( -# 1069 "parsing/parser.mly" +# 979 "parsing/parser.mly" (string) -# 144 "parsing/parser.ml" +# 147 "parsing/parser.ml" ) | INFIXOP0 of ( -# 1068 "parsing/parser.mly" +# 976 "parsing/parser.mly" (string) -# 149 "parsing/parser.ml" +# 152 "parsing/parser.ml" ) | INCLUDE | IN | IF | HASH_SUFFIX | HASH_INT of ( -# 1079 "parsing/parser.mly" +# 989 "parsing/parser.mly" (string * char option) -# 158 "parsing/parser.ml" +# 161 "parsing/parser.ml" ) | HASH_FLOAT of ( -# 1056 "parsing/parser.mly" +# 964 "parsing/parser.mly" (string * char option) -# 163 "parsing/parser.ml" +# 166 "parsing/parser.ml" ) | HASHOP of ( -# 1132 "parsing/parser.mly" +# 1045 "parsing/parser.mly" (string) -# 168 "parsing/parser.ml" +# 171 "parsing/parser.ml" ) | HASH | GREATERRBRACKET @@ -176,9 +179,9 @@ module MenhirBasics = struct | FUN | FOR | FLOAT of ( -# 1055 "parsing/parser.mly" +# 963 "parsing/parser.mly" (string * char option) -# 182 "parsing/parser.ml" +# 185 "parsing/parser.ml" ) | FALSE | EXTERNAL @@ -191,24 +194,24 @@ module MenhirBasics = struct | ELSE | DOWNTO | DOTOP of ( -# 1073 "parsing/parser.mly" +# 983 "parsing/parser.mly" (string) -# 197 "parsing/parser.ml" +# 200 "parsing/parser.ml" ) | DOTDOT | DOT | DONE | DOCSTRING of ( -# 1157 "parsing/parser.mly" +# 1070 "parsing/parser.mly" (Docstrings.docstring) -# 205 "parsing/parser.ml" +# 208 "parsing/parser.ml" ) | DO | CONSTRAINT | COMMENT of ( -# 1156 "parsing/parser.mly" +# 1069 "parsing/parser.mly" (string * Location.t) -# 212 "parsing/parser.ml" +# 215 "parsing/parser.ml" ) | COMMA | COLONRBRACKET @@ -218,9 +221,9 @@ module MenhirBasics = struct | COLON | CLASS | CHAR of ( -# 1033 "parsing/parser.mly" +# 941 "parsing/parser.mly" (char) -# 224 "parsing/parser.ml" +# 227 "parsing/parser.ml" ) | BEGIN | BARRBRACKET @@ -228,12 +231,14 @@ module MenhirBasics = struct | BAR | BANG | BACKQUOTE + | ATAT + | AT | ASSERT | AS | ANDOP of ( -# 1075 "parsing/parser.mly" +# 985 "parsing/parser.mly" (string) -# 237 "parsing/parser.ml" +# 242 "parsing/parser.ml" ) | AND | AMPERSAND @@ -250,13 +255,13 @@ let _eRR = open Asttypes -open Jane_asttypes open Longident open Parsetree open Ast_helper open Docstrings open Docstrings.WithMenhir module N_ary = Jane_syntax.N_ary_functions +module Mode = Jane_syntax.Mode_expr let mkloc = Location.mkloc let mknoloc = Location.mknoloc @@ -346,6 +351,9 @@ let ghloc ~loc d = { txt = d; loc = ghost_loc loc } let ghstr ~loc d = Str.mk ~loc:(ghost_loc loc) d let ghsig ~loc d = Sig.mk ~loc:(ghost_loc loc) d +let ghexpvar ~loc name = + ghexp ~loc (Pexp_ident (mkrhs (Lident name) loc)) + let mkinfix arg1 op arg2 = Pexp_apply(op, [Nolabel, arg1; Nolabel, arg2]) @@ -375,125 +383,49 @@ let mk_attr ~loc name payload = Builtin_attributes.(register_attr Parser name); Attr.mk ~loc name payload -let local_ext_loc loc = mkloc "extension.local" loc -let unique_ext_loc loc = mkloc "extension.unique" loc -let once_ext_loc loc = mkloc "extension.once" loc - -let local_attr loc = - mk_attr ~loc (local_ext_loc loc) (PStr []) - -let unique_attr loc = - mk_attr ~loc (unique_ext_loc loc) (PStr []) - -let once_attr loc = - mk_attr ~loc (once_ext_loc loc) (PStr []) - -let local_extension loc = - Exp.mk (Pexp_extension(local_ext_loc loc, PStr [])) - -let unique_extension loc = - Exp.mk (Pexp_extension(unique_ext_loc loc, PStr [])) - -let once_extension loc = - Exp.mk (Pexp_extension(once_ext_loc loc, PStr [])) - -let mkexp_stack ~loc ~kwd_loc exp = - Exp.mk ~loc (Pexp_apply(local_extension kwd_loc, [Nolabel, exp])) - -let mkexp_unique ~loc ~kwd_loc exp = - Exp.mk ~loc (Pexp_apply(unique_extension kwd_loc, [Nolabel, exp])) - -let mkexp_once ~loc ~kwd_loc exp = - Exp.mk ~loc (Pexp_apply(once_extension kwd_loc, [Nolabel, exp])) - -let mkpat_stack pat loc = - {pat with - ppat_attributes = local_attr (make_loc loc) :: pat.ppat_attributes} - -let mkpat_unique pat loc = - {pat with - ppat_attributes = unique_attr (make_loc loc) :: pat.ppat_attributes} - -let mkpat_once pat loc = - {pat with - ppat_attributes = once_attr (make_loc loc) :: pat.ppat_attributes} - -let mktyp_stack typ loc = - {typ with - ptyp_attributes = local_attr (make_loc loc) :: typ.ptyp_attributes} - -let mktyp_unique typ loc = - {typ with - ptyp_attributes = unique_attr (make_loc loc) :: typ.ptyp_attributes} - -let mktyp_once typ loc = - {typ with - ptyp_attributes = once_attr (make_loc loc) :: typ.ptyp_attributes} - -let wrap_exp_stack exp loc = - {exp with - pexp_attributes = local_attr (make_loc loc) :: exp.pexp_attributes} - -let wrap_exp_unique exp loc = - {exp with - pexp_attributes = unique_attr (make_loc loc) :: exp.pexp_attributes} - -let wrap_exp_once exp loc = - {exp with - pexp_attributes = once_attr (make_loc loc) :: exp.pexp_attributes} - -type mode_annotation = N_ary.mode_annotation = - | Local - | Unique - | Once - -(** [loc] is the location to be used for the whole expression including the - extension node. The extension node will always have the location [kwd_loc]. *) -let exp_with_mode ~loc ~kwd_loc flag exp = - match flag with - | Local -> mkexp_stack exp ~loc ~kwd_loc - | Unique -> mkexp_unique exp ~loc ~kwd_loc - | Once -> mkexp_once exp ~loc ~kwd_loc - -let exp_with_modes loc modes exp = - List.fold_left - (fun exp mode -> exp_with_mode mode.txt exp ~loc ~kwd_loc:mode.loc) - exp modes - -let mkexp_with_mode loc (flag, kwd_loc) exp = - let loc = make_loc loc in - exp_with_mode ~loc ~kwd_loc:(make_loc kwd_loc) flag exp - -(** [loc] is a location covering all the modes and the expression, and will be - used as for all the nested expressions. It is imprecise and taken as ghost. *) -let ghexp_with_modes loc modes exp = - let loc = ghost_loc loc in - let modes = List.map (fun (mode, loc) -> mkloc mode (make_loc loc)) modes in - exp_with_modes loc modes exp - -let mkpat_with_mode = function - | Local -> mkpat_stack - | Unique -> mkpat_unique - | Once -> mkpat_once - -let mkpat_with_modes flags pat = - List.fold_left (fun pat (flag, loc) -> mkpat_with_mode flag pat loc) pat flags +let mkexp_with_modes ?(ghost=false) ~loc modes exp = + let loc = + if ghost then ghost_loc loc else make_loc loc + in + Jane_syntax.Modes.expr_of ~loc (Coerce (modes, exp)) -let mktyp_with_mode = function - | Local -> mktyp_stack - | Unique -> mktyp_unique - | Once -> mktyp_once +(* For modes-related attributes, no need to call [register_attr] because they +result from native syntax which is only parsed at proper places that are +guaranteed to be used. *) -let mktyp_with_modes flags typ = - List.fold_left (fun typ (flag, loc) -> mktyp_with_mode flag typ loc) typ flags +let mkpat_with_modes modes pat = + (* Mark ghost to pass ppxlib well-nestedness check. *) + let modes = Mode.ghostify modes in + match Mode.attr_of modes with + | None -> pat + | Some attr -> + let ppat_desc = + match pat.ppat_desc with + | Ppat_constraint(pat, typ) -> + (* Example: let foo (local_ f : string -> string -> string) + We want to the user written type better interpreted under the + context of the mode. *) + let ptyp_attributes = attr :: typ.ptyp_attributes in + Ppat_constraint(pat, {typ with ptyp_attributes}) + | ppat_desc -> ppat_desc + in + {pat with + ppat_desc; + ppat_attributes = attr :: pat.ppat_attributes} -let wrap_exp_with_mode = function - | Local -> wrap_exp_stack - | Unique -> wrap_exp_unique - | Once -> wrap_exp_once +let mktyp_with_modes modes typ = + (* Mark ghost to pass ppxlib well-nestedness check. *) + let modes = Mode.ghostify modes in + match Mode.attr_of modes with + | None -> typ + | Some attr -> + {typ with + ptyp_attributes = attr :: typ.ptyp_attributes} -let wrap_exp_with_modes flags exp = - List.fold_left (fun exp (flag, loc) -> wrap_exp_with_mode flag exp loc) exp flags +let let_binding_mode_attrs modes = + match Mode.attr_of modes with + | None -> [] + | Some attr -> [attr] let exclave_ext_loc loc = mkloc "extension.exclave" loc @@ -520,27 +452,6 @@ let maybe_curry_typ typ loc = else mktyp_curry typ (make_loc loc) | _ -> typ -let global_loc loc = mkloc "extension.global" loc - -let global_attr loc = - mk_attr ~loc:loc (global_loc loc) (PStr []) - -let mkld_global ld loc = - { ld with pld_attributes = global_attr loc :: ld.pld_attributes } - -let mkld_global_maybe gbl ld loc = - match gbl with - | Global -> mkld_global ld loc - | Nothing -> ld - -let mkcty_global cty loc = - { cty with ptyp_attributes = global_attr loc :: cty.ptyp_attributes } - -let mkcty_global_maybe gbl cty loc = - match gbl with - | Global -> mkcty_global cty loc - | Nothing -> cty - (* TODO define an abstraction boundary between locations-as-pairs and locations-as-Location.t; it should be clear when we move from one world to the other *) @@ -583,17 +494,18 @@ let rec mktailpat nilloc = let open Location in function let mkstrexp e attrs = { pstr_desc = Pstr_eval (e, attrs); pstr_loc = e.pexp_loc } -let mkexp_desc_constraint e t = - match t with +let mkexp_type_constraint ?(ghost=false) ~loc e t = + let desc = + match t with | N_ary.Pconstraint t -> Pexp_constraint(e, t) | N_ary.Pcoerce(t1, t2) -> Pexp_coerce(e, t1, t2) + in + if ghost then ghexp ~loc desc + else mkexp ~loc desc -let mkexp_constraint ~loc e t = - mkexp ~loc (mkexp_desc_constraint e t) - -let mkexp_opt_constraint ~loc e = function +let mkexp_opt_type_constraint ~loc e = function | None -> e - | Some constraint_ -> mkexp_constraint ~loc e constraint_ + | Some c -> mkexp_type_constraint ~loc e c let mkpat_opt_constraint ~loc p = function | None -> p @@ -676,6 +588,21 @@ let expecting (loc : Lexing.position * Lexing.position) nonterm = let removed_string_set loc = raise(Syntaxerr.Error(Syntaxerr.Removed_string_set(make_loc loc))) +let ppat_ltuple loc elts closed = + Jane_syntax.Labeled_tuples.pat_of + ~loc:(make_loc loc) + (elts, closed) + +let ptyp_ltuple loc tl = + Jane_syntax.Labeled_tuples.typ_of + ~loc:(make_loc loc) + tl + +let pexp_ltuple loc args = + Jane_syntax.Labeled_tuples.expr_of + ~loc:(make_loc loc) + args + (* Using the function [not_expecting] in a semantic action means that this syntactic form is recognized by the parser but is in fact incorrect. This idiom is used in a few places to produce ad hoc syntax error messages. *) @@ -854,14 +781,19 @@ let pat_of_label lbl = let mk_newtypes ~loc newtypes exp = let mk_one (name, jkind) exp = match jkind with - | None -> mkexp ~loc (Pexp_newtype (name, exp)) + | None -> ghexp ~loc (Pexp_newtype (name, exp)) | Some jkind -> - Jane_syntax.Layouts.expr_of ~loc:(make_loc loc) + Jane_syntax.Layouts.expr_of ~loc:(ghost_loc loc) (Lexp_newtype (name, jkind, exp)) in - List.fold_right mk_one newtypes exp + let exp = List.fold_right mk_one newtypes exp in + (* outermost expression should have non-ghost location *) + { exp with pexp_loc = make_loc loc } -let wrap_type_annotation ~loc newtypes core_type body = +(* The [typloc] argument is used to adjust a location for something we're + parsing a bit differently than upstream. See comment about [Pvc_constraint] + in [let_binding_body_no_punning]. *) +let wrap_type_annotation ~loc ?(typloc=loc) newtypes core_type body = let mk_newtypes = mk_newtypes ~loc in let exp = mkexp ~loc (Pexp_constraint(body,core_type)) in let exp = mk_newtypes newtypes exp in @@ -871,7 +803,7 @@ let wrap_type_annotation ~loc newtypes core_type body = in (exp, Jane_syntax.Layouts.type_of - ~loc:(Location.ghostify (make_loc loc)) ltyp) + ~loc:(Location.ghostify (make_loc typloc)) ltyp) let wrap_exp_attrs ~loc body (ext, attrs) = let ghexp = ghexp ~loc in @@ -1069,9 +1001,10 @@ let mkghost_newtype_function_body newtypes body_constraint body ~loc = match body_constraint with | None -> body | Some { N_ary.type_constraint; mode_annotations } -> - let loc = { body.pexp_loc with loc_ghost = true } in - let body = Exp.mk (mkexp_desc_constraint body type_constraint) ~loc in - exp_with_modes loc mode_annotations body + let {Location.loc_start; loc_end} = body.pexp_loc in + let loc = loc_start, loc_end in + let body = mkexp_type_constraint ~ghost:true ~loc body type_constraint in + mkexp_with_modes ~ghost:true ~loc mode_annotations body in mk_newtypes ~loc newtypes wrapped_body @@ -1144,16 +1077,6 @@ let mk_directive ~loc name arg = pdir_loc = make_loc loc; } -let check_jkind ~loc id : const_jkind = - match id with - | "any" -> Any - | "value" -> Value - | "void" -> Void - | "immediate64" -> Immediate64 - | "immediate" -> Immediate - | "float64" -> Float64 - | _ -> expecting_loc loc "layout" - (* Unboxed literals *) (* CR layouts v2.5: The [unboxed_*] functions will both be improved and lose @@ -1169,7 +1092,7 @@ module Constant : sig type loc := Lexing.position * Lexing.position val value : Parsetree.constant -> t - val unboxed : loc:loc -> Jane_syntax.Layouts.constant -> t + val unboxed : Jane_syntax.Layouts.constant -> t val to_expression : loc:loc -> t -> expression val to_pattern : loc:loc -> t -> pattern end = struct @@ -1179,13 +1102,7 @@ end = struct let value x = Value x - let assert_unboxed_literals ~loc = - Language_extension.( - Jane_syntax_parsing.assert_extension_enabled ~loc Layouts Beta) - - let unboxed ~loc x = - assert_unboxed_literals ~loc:(make_loc loc); - Unboxed x + let unboxed x = Unboxed x let to_expression ~loc : t -> expression = function | Value const_value -> @@ -1212,27 +1129,23 @@ let with_sign sign num = let unboxed_int sloc int_loc sign (n, m) = match m with | Some m -> - Constant.unboxed ~loc:int_loc (Integer (with_sign sign n, m)) + Constant.unboxed (Integer (with_sign sign n, m)) | None -> if Language_extension.is_enabled unboxed_literals_extension then - expecting int_loc "unboxed integer literal with type-specifying suffix" + raise + Syntaxerr.(Error(Missing_unboxed_literal_suffix (make_loc int_loc))) else not_expecting sloc "line number directive" -let unboxed_float sloc sign (f, m) = - Constant.unboxed ~loc:sloc (Float (with_sign sign f, m)) - -(* Unboxed float type *) +let unboxed_float sign (f, m) = + Constant.unboxed (Float (with_sign sign f, m)) -let assert_unboxed_float_type ~loc = - Language_extension.( - Jane_syntax_parsing.assert_extension_enabled ~loc Layouts Beta) +(* Invariant: [lident] must end with an [Lident] that ends with a ["#"]. *) +let unboxed_type sloc lident tys = + let loc = make_loc sloc in + Ptyp_constr (mkloc lident loc, tys) -let unboxed_float_type sloc tys = - assert_unboxed_float_type ~loc:(make_loc sloc); - Ptyp_constr (mkloc (Lident "float#") (make_loc sloc), tys) - -# 1236 "parsing/parser.ml" +# 1149 "parsing/parser.ml" module Tables = struct @@ -1242,182 +1155,192 @@ module Tables = struct fun _tok -> match _tok with | AMPERAMPER -> - 133 + 138 | AMPERSAND -> - 132 + 137 | AND -> - 131 + 136 | ANDOP _ -> - 130 + 135 | AS -> - 129 + 134 | ASSERT -> - 128 + 133 + | AT -> + 132 + | ATAT -> + 131 | BACKQUOTE -> - 127 + 130 | BANG -> - 126 + 129 | BAR -> - 125 + 128 | BARBAR -> - 124 + 127 | BARRBRACKET -> - 123 + 126 | BEGIN -> - 122 + 125 | CHAR _ -> - 121 + 124 | CLASS -> - 120 + 123 | COLON -> - 119 + 122 | COLONCOLON -> - 118 + 121 | COLONEQUAL -> - 117 + 120 | COLONGREATER -> - 116 + 119 | COLONRBRACKET -> - 115 + 118 | COMMA -> - 114 + 117 | COMMENT _ -> - 113 + 116 | CONSTRAINT -> - 112 + 115 | DO -> - 111 + 114 | DOCSTRING _ -> - 110 + 113 | DONE -> - 109 + 112 | DOT -> - 108 + 111 | DOTDOT -> - 107 + 110 | DOTOP _ -> - 106 + 109 | DOWNTO -> - 105 + 108 | ELSE -> - 104 + 107 | END -> - 103 + 106 | EOF -> - 102 + 105 | EOL -> - 101 + 104 | EQUAL -> - 100 + 103 | EXCEPTION -> - 99 + 102 | EXCLAVE -> - 98 + 101 | EXTERNAL -> - 97 + 100 | FALSE -> - 96 + 99 | FLOAT _ -> - 95 + 98 | FOR -> - 94 + 97 | FUN -> - 93 + 96 | FUNCTION -> - 92 + 95 | FUNCTOR -> - 91 + 94 | GLOBAL -> - 90 + 93 | GREATER -> - 89 + 92 | GREATERRBRACE -> - 88 + 91 | GREATERRBRACKET -> - 87 + 90 | HASH -> - 86 + 89 | HASHOP _ -> - 85 + 88 | HASH_FLOAT _ -> - 84 + 87 | HASH_INT _ -> - 83 + 86 | HASH_SUFFIX -> - 82 + 85 | IF -> - 81 + 84 | IN -> - 80 + 83 | INCLUDE -> - 79 + 82 | INFIXOP0 _ -> - 78 + 81 | INFIXOP1 _ -> - 77 + 80 | INFIXOP2 _ -> - 76 + 79 | INFIXOP3 _ -> - 75 + 78 | INFIXOP4 _ -> - 74 + 77 | INHERIT -> - 73 + 76 | INITIALIZER -> - 72 + 75 | INT _ -> - 71 + 74 + | KIND_ABBREV -> + 73 + | KIND_OF -> + 72 | LABEL _ -> - 70 + 71 | LAZY -> - 69 + 70 | LBRACE -> - 68 + 69 | LBRACELESS -> - 67 + 68 | LBRACKET -> - 66 + 67 | LBRACKETAT -> - 65 + 66 | LBRACKETATAT -> - 64 + 65 | LBRACKETATATAT -> - 63 + 64 | LBRACKETBAR -> - 62 + 63 | LBRACKETCOLON -> - 61 + 62 | LBRACKETGREATER -> - 60 + 61 | LBRACKETLESS -> - 59 + 60 | LBRACKETPERCENT -> - 58 + 59 | LBRACKETPERCENTPERCENT -> - 57 + 58 | LESS -> - 56 + 57 | LESSMINUS -> - 55 + 56 | LET -> - 54 + 55 | LETOP _ -> - 53 + 54 | LIDENT _ -> - 52 + 53 | LOCAL -> - 51 + 52 | LPAREN -> - 50 + 51 | MATCH -> - 49 + 50 | METHOD -> - 48 + 49 | MINUS -> - 47 + 48 | MINUSDOT -> - 46 + 47 | MINUSGREATER -> + 46 + | MOD -> 45 | MODULE -> 44 @@ -1526,6 +1449,10 @@ module Tables = struct Obj.repr () | ASSERT -> Obj.repr () + | AT -> + Obj.repr () + | ATAT -> + Obj.repr () | BACKQUOTE -> Obj.repr () | BANG -> @@ -1640,6 +1567,10 @@ module Tables = struct Obj.repr () | INT _v -> Obj.repr _v + | KIND_ABBREV -> + Obj.repr () + | KIND_OF -> + Obj.repr () | LABEL _v -> Obj.repr _v | LAZY -> @@ -1692,6 +1623,8 @@ module Tables = struct Obj.repr () | MINUSGREATER -> Obj.repr () + | MOD -> + Obj.repr () | MODULE -> Obj.repr () | MUTABLE -> @@ -1782,22 +1715,22 @@ module Tables = struct Obj.repr () and default_reduction = - (16, "\000\000\000\000\000\000\003\168\003\167\003\166\003\165\003\164\003v\003\163\003\162\003\161\003\160\003\159\003\158\003\157\003\156\003\155\003\154\003\153\003\152\003\151\003\150\003\149\003\148\003\147\003\146\003\145\003\144\003u\003\143\003\142\003\141\003\140\003\139\003\138\003\137\003\136\003\135\003\134\003\133\003\132\003\131\003\130\003\129\003\128\003\127\003~\003}\003|\003{\003z\003y\003x\003w\000\000\000\000\0003\000\147\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\002\021\002\000\002\018\002\017\002\016\002\022\002\026\000\000\004\025\002\020\002\019\002\001\002\024\002\015\002\014\002\r\002\012\002\011\002\t\002\025\002\023\000\000\000\000\000\000\001 \000\000\000\000\002\004\000\000\000\000\000\000\002\006\000\000\000\000\000\000\002\b\002\030\002\027\002\n\002\002\002\028\002\029\000\000\004\023\004\022\004\026\000\000\000\000\000\000\000\000\000\000\001\231\001\233\001\232\000\028\001\154\000\149\000\000\001\026\001\027\000\000\000\000\000\000\0029\0028\000\000\000\000\000\000\000\000\0001\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\197\000\000\000\000\000\000\000\000\000\000\004\017\000\000\004\012\000\000\000\000\004\014\000\000\004\016\000\000\004\r\004\015\000\000\000\000\000\000\000\000\002N\000\000\001j\000\000\000\000\000\000\000\000\002M\002L\000\000\004\007\000\000\002\186\002\185\000\000\000\000\004\004\000\000\000\000\004\003\000\000\000\000\000\000\001%\001&\000\000\000\000\000\000\000~\000\000\000\027\000\000\000\000\000|\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\253\001\166\000\000\000\000\000\000\004$\000\000\000\000\000\000\000\000\000\000\003b\000\000\002\252\002\247\002\248\002\253\000\000\002\250\002\245\002\246\002\251\000\000\000\000\000\000\000\000\000\000\001\192\001\191\000\000\003`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\001#\000\017\000\016\000\000\000\000\000\000\000\000\000\000\001\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\164\000\000\000\000\001\167\001\165\001\173\000K\003 \003\228\003\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\000\000\001/\000\000\002\255\002\254\000\000\000\000\000\000\002\"\000\000\000\000\000,\000\000\000\000\000\000\001\152\000\000\000\000\001\172\000\000\001\171\000\000\001\155\001\170\000\000\001\153\000l\000%\000\000\000\000\001\222\000\000\000\029\000\000\000\000\000\000\003\182\000\000\000\000\004\002\000/\000\000\000\000\000&\000\000\000\030\000\000\000\000\001\011\000\000\000\000\000\000\000'\000\000\000\031\000\000\000\000\000\000\000\000\000\000\002\170\000\000\000\000\000\000\000\000\000\000\002\171\000\000\000\018\000\000\000\000\000\000\000\000\003\183\000\000\000\000\000\000\000\000\003\184\000\000\000\000\000\000\000\000\000\000\000\143\000\000\000\000\000\000\000\019\000\000\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\000\000\020\000\000\000\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\173\000\000\000\000\000\000\000\000\000\000\003\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175\000\000\000\000\000\000\000\000\000\000\003\176\000\000\000\000\000\000\000\000\002\203\002\181\000\000\000)\000\000\002\182\000\000\000\000\002\031\000\000\000\000\000\000\000\000\003\229\000\000\003\230\000\000\000\000\000(\000\000\000\000\000\000\000*\000\000\000+\000\000\000-\000\000\000\000\000.\002\167\002\166\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\000\003g\004\018\004\019\000\000\003f\004%\000}\004#\002\249\003\\\004\027\002\244\003]\002n\003_\000\000\000\000\000\000\000\000\003c\003t\003e\000\000\000\000\000\000\003m\003j\000\000\000\000\000\000\002j\002\\\000\000\000\000\000\000\000\000\002`\000\000\002[\000\000\002m\003s\000\000\000\000\000\000\000\000\001\227\000\000\000\000\002l\003d\000\133\000\000\000\000\000\132\000\000\003n\003^\000\000\002f\000\000\000\000\003q\000\000\003p\003o\000\000\002b\000\000\000\000\002^\002]\002k\002c\000\000\000\131\000\000\003l\003k\000\000\003i\000\000\003\001\003\000\000\000\000\000\002\216\003h\000\000\000\000\000\000\000\000\002$\001\133\001\134\003\004\000\000\003\003\003\002\003\007\000\000\003\006\003\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\001<\001>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\203\000\000\000\000\000\000\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\006\000\000\000\000\000\000\000\000\000\000\001\202\000\000\000\000\000\000\001\163\001\211\001\162\001\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\179\000\000\000\000\002\180\000\000\002\163\002\162\000\000\000\000\001\201\001\200\000\000\001\r\000\000\000\000\001\185\000\000\000\000\001\189\000\000\002=\002<\000\000\000\000\002;\002:\001\188\001\186\000\000\001\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\003&\001\168\000z\003*\003(\000\000\000\000\000\000\0036\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001:\000\000\000\000\0019\002x\001;\000\000\000\000\000\000\000\000\000\000\000\000\001\224\000\000\000\000\000\000\001\003\001\225\000\000\001\002\000\000\001\223\001\235\000\000\000\000\000\000\000\000\000\000\001E\000\000\000\000\001B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001C\000\000\000\000\001@\000\000\000\000\002\168\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\001D\001?\001A\000\000\001\004\002\159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\174\002\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0033\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\178\000\000\000\000\000\000\000\000\000\000\003\255\000\000\000\000\003\254\000\000\000\000\000\000\000\000\0013\0012\000\000\0014\000\000\000\000\000\000\0032\000\000\000\000\000\000\003\020\003\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\028\0035\003'\003U\000\000\000\000\000\226\002\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\252\000\000\000\000\000\000\000\000\000\000\000\000\000\180\000\179\000\000\000\000\000\000\001\t\001\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\171\000\000\000\000\000\000\000\000\000\000\000\000\001M\000\000\000\000\000\000\000\000\001K\000\000\000\000\001I\001H\000\000\0027\000\000\000\000\000\156\003\172\002\158\000\000\000\000\000\000\000\000\001O\000\000\000\000\001N\000\000\002i\000\000\000\000\002u\000\000\000\000\002w\000\000\000\000\002s\002r\002p\002q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001L\000\000\000\000\001J\001P\001F\000\000\000\000\001p\000\022\001R\000\000\000\000\000\000\003\022\003\r\000\000\000\000\003\021\003\012\000\000\000\000\000\000\000\000\003\024\003\015\000\000\000\000\002\209\000\000\000\000\003\028\003\019\000\000\000\000\003\026\003\017\003.\000\000\000\000\000\000\000\000\000\000\003\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\164\000\177\002\210\000\000\003\014\000\000\000\000\003\018\000\000\000\000\003\016\001\001\000\000\000\144\000\145\000\000\000\000\000\000\000\000\000\174\000\173\000\000\000\181\000\000\000\000\001\136\000\000\001\137\001\135\002\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001[\000\000\000\000\001\\\000\000\000\000\000\227\000\000\001^\001]\000\000\000\000\0037\003/\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000p\002\178\002\177\000\000\003I\002\161\002\160\003S\000\000\003T\003R\000\000\000\000\003H\000\000\000\000\000\000\000\000\000\000\000\000\003G\003@\000\000\003A\003?\000\000\000\000\003F\000\000\003K\000\000\000\000\000\000\000\000\000\000\003E\000\000\003L\003J\000\000\000\000\003D\000\000\000\000\0031\0030\000\000\000\000\000\000\002\143\000\000\000\000\000\000\000\000\002\219\002\142\000\000\003;\003:\000\000\000\000\000\000\001\169\000\000\003\030\000\000\003\031\003\029\000\000\0039\0038\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\213\003-\000\000\003,\003+\000\000\000\000\000\000\000\000\000\000\003W\000\000\003C\003B\000\000\000\000\003V\000\000\000\000\000\000\000\000\000\000\003Y\003>\000\000\003=\003<\000\000\000\000\003X\000\161\000\000\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\175\000\000\000\000\000\000\000\000\000\000\000\158\000\000\001\177\000\000\000\000\000\000\000\127\000\000\000\000\000\128\000\000\000\000\000\000\000\000\001\215\001\216\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\139\000\000\001+\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\159\000\129\000\000\000\000\002\141\000\000\000\000\001Q\0025\000\000\0017\000\000\000\000\0016\0018\001Y\000\000\000\000\000\000\000\000\000\000\000\254\000\000\000\000\000\000\000\000\000\000\003[\003Q\000\000\003P\003O\000\000\000\000\003Z\003)\000\000\000\000\000\000\000\000\003!\000\000\003#\000\000\003\"\000\000\003\t\003\b\000\000\003\n\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\002K\002?\000\000\002I\000\000\002E\000\000\002G\000\000\002A\000\000\000\000\002C\000\000\002J\002>\000\000\002H\000\000\002D\000\000\002F\000\000\002@\000\000\000\000\002B\000\000\001\253\000\000\000\000\000\000\001\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001f\003\221\000\000\000\000\003\220\000\000\000\000\000\000\000\000\000\000\002~\000\000\000\000\000\000\001\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\237\000\000\002\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\170\000\000\000\000\002\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\000\000\001\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\001\194\000\000\001\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001h\002\236\000\000\000\000\001\179\000\000\002\234\000\000\000\000\000\000\002\233\000\000\000\000\001\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004(\000\000\000\000\002\187\000\000\000\154\000\000\002\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000O\000\000\000\000\000\000\000\000\001\221\000\000\001\220\000\000\000\000\000\000\000\000\000R\000\000\000\000\000\000\002\139\000\000\002\138\000\000\000\000\000\000\000\000\000S\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000X\000\000\000\000\000\000\000Y\000W\000\000\000\\\000\000\000\000\000\000\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000T\000\000\000[\000Z\000\000\000U\000V\000\000\001y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000h\000\000\000j\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001b\002\240\002\226\000\000\002\232\002\227\002\239\002\238\002\237\002\235\001s\000\000\002\224\000\000\000\000\000\000\000\000\002\242\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\001l\002&\002\228\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\248\001\244\000\000\000\000\000\000\001\020\000\000\000\000\002\146\002\156\000\000\000\000\001n\002\144\002\145\000\000\000\000\000\000\000\000\000\000\001\251\001\247\001\243\000\000\000\000\001\021\000\000\000\000\001\250\001\246\001\242\001\240\002\229\002\225\002\241\001r\002{\002\223\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\213\000\000\000\000\000\000\004\031\000\000\000\000\004!\000\000\000@\000\000\000\000\004+\000\000\004*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\000\004 \000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\000\000\001\149\001\147\000\000\000A\000\000\000\000\004.\000\000\004-\000\000\000\000\000\000\001\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\150\000\000\000\000\001\148\001\146\000\000\000\000\000\000\000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000\000\000a\000\000\000;\001U\000\000\000J\0007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001S\000\000\000`\000_\000\000\000\000\000e\000d\000\000\000\000\002(\000\000\000?\000\000\000\000\000\000\000>\000\000\000\000\000\000\000B\000\000\000c\000f\000\000\000D\000E\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001`\003\224\003\215\000\000\000\000\003\219\003\169\003\214\003\223\003\222\001w\000\000\000\000\003\212\000\000\000\000\000\000\000\000\003\226\000\000\003\216\003\213\003\225\002z\000\000\000\000\003\210\0004\003\209\000\000\000\000\000\152\000\000\001\"\000\000\000\000\001v\001u\000\000\002\131\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\150\000\000\003\218\002\151\002\152\002\147\002\149\002\148\002\150\000\000\000\000\000\000\000\151\000\000\000\000\000\000\002\156\000\000\001\024\000\000\000\000\000\000\000\000\003\217\000\000\001\182\001\181\000\000\000\000\003r\003a\000\000\000L\000\000\000\000\000M\000\000\000\000\003%\003$\000\000\000\000\000\164\000\000\000\255\000\000\000\148\000\000\000\000\000\000\000\000\000\000\000\000\003\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\001\138\000\000\000\000\001\139\000$\000\000\000#\000\000\000\000\000\000\000\000\000\000\000\000\003\177\000\000\000\000\000\000\000\000\000\000\003\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\179\000\000\000\000\000\000\000\000\000\000\003\180\000\000\000\000\000\000\000\000\001\249\001\245\000\000\001\241\004\001\000\000\002\156\000\000\001\023\000\000\000\000\000\000\000\000\002\231\002\155\002\153\002\154\000\000\000\000\000\000\000\000\002\156\000\000\001\022\000\000\000\000\000\000\000\000\002\230\000\000\001\196\001\195\000\000\000\026\000\000\004&\000\000\0005\000\000\000\000\000\000\000\000\000\172\000\171\000\000\001\028\000\001\000\000\000\000\001!\000\002\000\000\000\000\000\000\001\157\001\158\000\003\000\000\000\000\000\000\000\000\001\160\001\161\001\159\000\023\001\156\000\024\000\000\002O\000\000\000\004\000\000\002P\000\000\000\005\000\000\002Q\000\000\000\000\002R\000\006\000\000\000\007\000\000\002S\000\000\000\b\000\000\002T\000\000\000\t\000\000\002U\000\000\000\n\000\000\002V\000\000\000\011\000\000\002W\000\000\000\000\002X\000\012\000\000\000\000\002Y\000\r\000\000\000\000\000\000\000\000\000\000\003\244\003\239\003\240\003\243\003\241\000\000\000\000\000\000\003\237\003\232\003\233\003\236\003\234\000\000\003\248\000\014\000\000\003\247\000\000\001}\000\000\000\000\003\245\000\000\003\246\000\000\000\000\000\000\000\000\001\129\001\130\000\000\000\000\001\128\001\127\000\015\000\000\000\000\000\000\004\021\000\000\004\020") + (16, "\000\000\000\000\000\000\004*\004)\004(\004'\004&\003\248\004%\004$\004#\004\"\004!\004 \004\031\004\030\004\029\004\028\004\027\004\026\004\025\004\024\004\023\004\022\004\021\004\020\004\019\004\018\003\247\004\017\004\016\004\015\004\014\004\r\004\012\004\011\004\n\004\t\004\b\004\007\004\006\004\005\004\004\004\003\004\002\004\001\004\000\003\255\003\254\003\253\003\252\003\251\003\250\003\249\000\000\000\000\0007\000\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\007\002p\002X\002m\002l\002k\002q\002u\000\000\005\b\002i\002o\002n\002Y\002s\002j\002h\002g\002f\002c\002a\002t\002r\000\000\000\000\000\000\001.\000\000\000\000\002\\\000\000\000\000\000\000\002^\000\000\000\000\000\000\002`\002y\002v\002b\002e\002d\002Z\002w\002x\000\000\005\006\005\005\005\t\000\000\000\000\000\000\000\000\000\000\002?\002A\002@\000 \001\234\000\157\000\000\001(\001)\000\000\000\000\000\000\002\151\002\150\000\000\000\000\000\000\0016\000\000\000\000\000\031\000\000\000\000\000\000\000\000\000\000\0004\000\000\000\000\000\000\004\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\025\000\000\000\000\000\000\000\000\000\000\005\000\000\000\004\251\000\000\000\000\004\253\000\000\004\255\000\000\004\252\004\254\000\000\000\000\000\000\000\000\002\172\0014\000\000\001\186\000\000\000\000\000\000\000\000\002\171\002\170\000\000\004\243\000\000\003<\003;\000\000\000\000\004\240\000\000\000\000\004\239\000\000\000\000\000\000\0018\000\000\000\000\000\000\000\134\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\011\001\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\235\000\000\002}\000\000\000\000\0000\000\000\000\000\000\000\001\232\000\000\000\000\002\000\000\000\001\255\000\000\001\235\001\254\000\000\001\233\000p\000)\000\000\000\000\0022\000!\001\246\001\244\000$\000\000\000\000\000\000\000\000\000\026\000\000\002;\000\025\000\000\000\000\000\000\000\000\004B\000\000\000\000\001\025\000\000\000\000\000\000\000\000\000+\000#\000&\000\000\000\000\001\247\001\245\004\238\004\246\000\000\000\000\000\000\000\000\000\000\003,\000\000\000\000\000\000\000\000\000\000\003-\000\000\000\018\0003\000\000\000\000\000\000\000\000\000\000\004C\000\000\000\000\000\000\000\000\000\000\004E\000\000\000\000\000\000\000\000\000\000\000\000\004F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000\"\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004D\000\000\000\000\000\000\000\151\000\000\000\000\000\000\000\019\000\000\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\000\000\020\000\000\000\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004/\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0042\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0043\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0044\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0045\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\000\000\000\004A\000\000\000\000\000\000\000\000\003I\0037\000\000\000-\000\000\0038\000\000\000\000\002z\000\000\000\000\000\000\000\000\004\209\000\000\004\210\000\000\000\000\000,\000\000\000\000\000\000\000.\000\000\000/\000\000\0001\000\000\000\000\0002\003)\003(\000\000\000\000\004\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\016\005\019\000\000\000\000\000\000\000\000\000\000\003\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001q\000\000\003{\003v\003w\003|\000\000\003y\003t\003u\003z\000\000\000\000\000\000\000\000\000\000\002\020\002\019\000\000\003\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\030\000\000\000\000\000\000\000\000\0011\000\017\000\016\000\000\000\000\000\000\000\000\000\000\002\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\248\000\000\000\000\001\251\001\249\002\001\000O\003\160\004\208\004\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\135\001\134\000\000\000\000\000\000\000\131\000\000\001E\000\000\003~\003}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\017\000\000\004\245\003\231\000\000\000\000\005\001\005\002\000\000\003\230\005\020\000\133\005\018\003x\003\220\005\n\003s\003\221\002\198\003\223\000\000\000\000\000\000\000\000\003\227\003\246\003\229\000\000\000\000\000\000\003\237\003\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001j\001i\000\000\001h\003\242\003\228\000\141\000\000\000\000\000\000\002\194\002\192\002\186\002\193\002\185\000\000\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001b\001a\000\000\001`\003\019\000\000\000\000\002\189\000\000\000\000\000\000\000\000\000\000\0027\000\000\000\000\002\196\000\000\000\000\000\140\000\000\003\238\003\222\000\000\001s\000\000\000\000\000\000\000\000\000\000\001f\001e\000\000\001d\003\020\000\000\000\000\003\240\000\000\003\239\003\244\000\000\000\028\000\027\000\000\003\245\000\000\002\191\000\000\000\000\002\188\002\187\000\000\003\243\002\195\003\021\000\000\000\000\000\139\000\000\003\236\003\235\000\000\003\233\000\000\003\128\003\127\000\000\000\000\003V\003\232\000\000\000\000\000\000\000\000\002\127\001\213\001\214\003\131\000\000\003\130\003\129\003\134\000\000\003\133\003\132\000\000\001\133\003\029\002\207\000\000\000\000\002\204\000\000\002\200\002\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001w\001v\000\000\001u\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\131\001\130\000\000\001\129\003\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\127\001~\000\000\001}\003\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\001B\001@\000\000\000\000\001S\000\000\001R\001T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\031\000\000\000\000\000\000\000\000\000\000\000\000\005&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\242\000\000\000\000\000\000\000\000\000\000\002\030\000\000\000\000\000\000\001\243\002'\001\242\002#\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\0036\000\000\003%\003$\000\000\000\000\002\029\002\028\000\000\001\027\000\000\000\000\002\r\000\000\000\000\002\017\000\000\002\155\002\154\000\000\000\000\002\153\002\152\002\016\002\014\000\000\002\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\003\166\001\252\000\130\003\170\003\168\000\000\000\000\000\000\003\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\206\000\000\003\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\209\000\000\000\000\000\000\000\000\000\000\000\000\001\168\000\000\001\166\001\164\000\000\000\000\000\000\001P\000\000\000\000\001O\002\208\001Q\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\000\000\000\000\001\017\0025\000\000\001\016\000\000\0023\002C\000\000\000\000\000\000\000\000\000\000\001]\000\000\001^\000\000\000\000\001X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Y\000\000\001Z\000\000\000\000\001V\000\000\000\000\003*\000\000\000\000\000\000\000\000\000\000\003+\000\000\000\000\000\000\001[\000\000\001\\\001U\001W\000\000\001\018\003!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\002\003\001\000\000\000\000\000\000\003\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\011\003\181\003\167\003\213\000\000\000\000\000\000\000\000\000\186\003.\000\000\000\000\000\000\000\000\000\000\001I\001H\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003P\000\000\000\000\000\000\000\000\000\000\000\000\002\248\002\247\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0030\000\000\000\000\000\000\000\000\000\240\003Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\n\000\000\000\000\000\000\000\000\000\000\000\000\000\188\000\187\000\000\000\000\000\000\001\023\001\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004-\001\157\000\000\002\146\000\000\000\000\000\164\004.\003 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\150\000\000\000\000\001\151\000\000\000\000\000\000\000\000\001\146\000\000\000\000\001\147\000\000\000\000\001\140\000\000\000\000\001\141\001\139\000\000\000\000\001\142\000\000\000\000\000\000\000\000\001\154\000\000\000\000\001\155\000\000\000\000\001\153\000\000\000\000\001\152\000\000\001\136\000\000\000\000\000\000\000\000\000\000\001{\001z\000\000\001y\003\026\000\000\000\000\002\206\000\000\000\000\002\203\002\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\148\000\000\000\000\001\149\000\000\000\000\001\143\000\000\000\000\001\144\001\156\000\000\000\000\001\145\001\137\000\000\000\000\001\192\000\022\001\159\000\000\000\000\000\000\003O\000\000\003\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\148\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003'\003&\000\185\001\015\000\000\000\152\000\153\000\000\000\000\000\000\000\000\000\182\000\181\000\000\003\139\000\000\000\000\003\141\000\000\000\000\003\140\000\000\000\000\000\000\000\000\003\143\000\000\000\000\003\147\000\000\000\000\003\145\003\174\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\000\001\216\000\000\001\217\001\215\003/\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\003\146\000\000\000\000\003\144\000\000\000\000\000\000\000\000\000\000\003\007\003\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\171\000\000\000\000\001\172\000\000\000\000\000\241\000\000\001\174\001\173\000\000\000\000\003\183\003\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000t\0034\0033\000\000\003\201\003#\003\"\003\211\000\000\003\212\003\210\000\000\000\000\003\200\000\000\000\000\000\000\000\000\000\000\000\000\003\199\003\192\000\000\003\193\003\191\000\000\000\000\003\198\000\000\003\203\000\000\000\000\000\000\000\000\000\000\003\197\000\000\003\204\003\202\000\000\000\000\003\196\000\000\000\000\003\177\003\176\000\000\000\000\000\000\002\231\000\000\000\000\000\000\000\000\003Y\002\230\000\000\003\187\003\186\000\000\000\000\000\000\001\253\000\000\003\158\000\000\003\159\003\157\000\000\003\185\003\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003S\003\173\000\000\003\172\003\171\000\000\000\000\000\000\000\000\000\000\003\215\000\000\003\195\003\194\000\000\000\000\003\214\000\000\000\000\000\000\000\000\000\000\003\217\003\190\000\000\003\189\003\188\000\000\000\000\003\216\000\169\000\000\000\000\000\000\000\000\000\168\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\003\000\000\000\000\000\000\000\000\000\000\000\166\000\000\002\005\000\000\000\000\000\000\000\135\000\000\000\000\000\136\000\000\000\000\000\000\000\000\002+\002,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\0029\002\148\000\000\000\000\000\000\001;\000\000\000\000\000\147\000\000\001>\001<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\167\000\137\000\000\000\000\002\229\000\000\000\000\001\158\002\144\000\000\001M\000\000\000\000\001L\001N\001\169\000\000\000\000\000\000\000\000\000\000\001\012\000\000\000\000\000\000\000\000\000\000\003\219\003\209\000\000\003\208\003\207\000\000\000\000\003\218\003\169\000\000\000\000\000\000\000\000\003\161\000\000\003\163\000\000\003\162\000\000\003\136\003\135\000\000\003\137\000\000\003\138\000\000\000\000\000\000\001\014\000\000\000\000\000\000\000\000\002\169\002\157\000\000\002\167\000\000\002\163\000\000\002\165\000\000\002\159\000\000\000\000\002\161\000\000\002\168\002\156\000\000\002\166\000\000\002\162\000\000\002\164\000\000\002\158\000\000\000\000\002\160\000\000\002U\000\000\000\000\000\000\002T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\182\004\200\000\000\000\000\004\199\000\000\000\000\000\000\000\000\000\000\002\214\000\000\000\000\000\000\000\000\000\000\0019\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002E\000\000\002\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004,\000\000\000\000\003\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002W\000\000\000\000\000\000\002V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000\000\000\000\000\000\002\022\000\000\002\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\184\003j\000\000\000\000\002\007\000\000\003h\000\000\000\000\000\000\003g\000\000\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\024\000\000\000\000\003=\000\000\000\162\000\000\003>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000S\000\000\000\000\000\000\000\000\0021\000\000\0020\000\000\000\000\000\000\000\000\000V\000\000\000\000\000\000\002\227\000\000\002\226\000\000\000\000\000\000\000\000\000W\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\\\000\000\000\000\000\000\000]\000[\000\000\000`\000\000\000\000\000\000\000\000\000\000\000U\000\000\000\000\000\000\000\000\000\000\000\000\000X\000\000\000_\000^\000\000\000Y\000Z\000\000\001\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\180\000o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000l\000\000\000n\000m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\178\003n\003`\000\000\003f\003a\003m\003l\003k\003i\001\195\003q\000\000\003^\000\000\000\000\000\000\000\000\003p\000\000\000\000\000\000\000\000\000\000\000\000\003\030\000\000\000\000\001\188\002\129\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002P\002L\000\000\000\000\000\000\001\"\000\000\000\000\002\234\003\030\000\000\000\000\001\190\002\232\002\233\000\000\000\000\000\000\000\000\000\000\002S\002O\002K\000\000\000\000\001#\000\000\000\000\002R\002N\002J\002H\003c\003_\003o\001\194\002\211\003]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002)\000\000\000\000\000\000\005\014\000\000\000\000\005\016\000\000\000D\000\000\000\000\005\027\000\000\005\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\r\000\000\000\000\005\015\000\000\000\000\000\000\002\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\231\000\000\000\000\001\229\001\227\000\000\000E\000\000\000\000\005\030\000\000\005\029\000\000\000\000\000\000\001\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\230\000\000\000\000\001\228\001\226\000\000\000\000\000\000\000G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000f\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\000\000e\000\000\000?\001\162\000\000\000N\000;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\160\000\000\000d\000c\000\000\000\000\000i\000h\000\000\000\000\002\131\000\000\000C\000\000\000\000\000\000\000B\000\000\000\000\000\000\000F\000\000\000g\000j\000\000\000H\000I\000\000\001\203\000\000\000\000\000\000\000\000\000\000\000\000\000L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\176\004\203\004\194\000\000\000\000\004\198\004+\004\193\004\202\004\201\001\199\000\000\004\206\000\000\004\191\000\000\000\000\000\000\000\000\004\205\000\000\004\195\004\192\004\204\002\210\000\000\000\000\004\189\0008\004\188\000\000\000\000\000\160\000\000\0010\000\000\000\000\001\198\001\197\000\000\002\219\001'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\158\000\000\004\197\002\239\002\240\002\235\002\237\002\236\002\238\000\000\000\000\000\000\000\159\000\000\000\000\000\000\003\030\000\000\001&\000\000\000\000\000\000\000\000\004\196\000\000\002\n\002\t\000\000\000\000\003\241\003\225\000\000\001p\003\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\001m\000\000\001l\003\022\000\000\000\000\000P\000\000\000\000\000Q\000\000\000\000\003\165\003\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\012\003\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\172\000\000\001\r\000\000\000\156\000\000\000\000\000\000\000\000\000\000\000\000\001\224\001\218\000\000\000\000\001\219\000(\000\000\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004@\000\000\000\000\000\000\000\000\000\000\002Q\002M\000\000\002I\004\237\000\000\003\030\000\000\001%\000\000\000\000\000\000\000\000\003e\002\243\002\241\002\242\000\000\000\000\000\000\000\000\003\030\000\000\001$\000\000\000\000\000\000\000\000\003d\000\000\002\024\002\023\000\000\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0047\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0048\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0049\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\168\000\000\000\000\000\000\000\000\000\000\0012\000\000\000\000\0005\000\000\000\000\000\000\005\021\000\000\005\022\000\000\0009\000\000\000\000\000\000\000\000\000\180\000\179\000\000\001*\000\001\000\000\000\000\001/\000\002\000\000\000\000\000\000\001\237\001\238\000\003\000\000\000\000\000\000\000\000\001\240\001\241\001\239\000\023\001\236\000\024\000\000\002\173\000\000\000\004\000\000\002\174\000\000\000\005\000\000\002\175\000\000\000\000\002\176\000\006\000\000\000\007\000\000\002\177\000\000\000\b\000\000\002\178\000\000\000\t\000\000\002\179\000\000\000\n\000\000\002\180\000\000\000\011\000\000\002\181\000\000\000\000\002\182\000\012\000\000\000\000\002\183\000\r\000\000\000\000\000\000\000\000\000\000\004\224\004\219\004\220\004\223\004\221\000\000\000\000\000\000\004\217\004\212\004\213\004\216\004\214\000\000\004\228\000\014\000\000\004\227\000\000\001\205\000\000\000\000\004\225\000\000\004\226\000\000\000\000\000\000\000\000\001\209\001\210\000\000\000\000\001\208\001\207\000\015\000\000\000\000\000\000\005\004\000\000\005\003") and error = - (134, "'\240\144b\198\171~g=\001X\015\242\000\000\227\128\142\194\000\139\138\141\248\153\244\001`>\128\000\001\142\007\207\178 A_\141\160\000L\028\001\237\028X\n\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000+\253l\222\179\186\255\153\223\242^\135\252B y\224|\251\"\004\021\248\218\000\004\193\192\030\209\197\128\160\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\236 \b\176\168\223\137\159@\022\003\232\000\000\024\224|\251\"\004\021\248\218\000\004\193\192\030\209\197\128\160\208\159\194E\171\026\173\249\156\244\005`?\192\000\007\142\000\000\000\000\002\000\002\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\002\000\001\000\015\192,\018\000\000\248\017\000 \128\016(\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000(\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\000\000\228 \012\016\128N/\139@\014\128d\000\000\016@\003\144\1280B\0018\190-\000:\001\144\000\000A\000\014B\000\193\b\004\226\248\180\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!0\023t\001\003*\144p0h\144\022\194\"!\020\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\b8\184 \000\002\000\000\000\000\000\000\002\001\016\000\000\016 \001\000\000\b\000\000\000\132\001\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000 \017\004\000\001\n\000\016\000\000\128\000\002\b@\016\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\bL\005\221\000@\202\164\028\012\026$\005\176\138\136E\000 H\b\b\002\n\b\016\000\000\004\000\000\000\000\000\000\129 \000\b( @\000\000\016\000\000\000\000\000\002\004\128\128\000 \160\128\000\000\000@\000\000\000\000\012D\001T\000@\194$\028\000\018 \005\176\128\200\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000A\000\016 \001\005\000\004\000\001D\000\002\000\bD\001\004\000@\128\004\016\000\016\000\005\016\000\b\000\000`\000\004\152\016J\000\016\002\000\000\000\000\000\000\128\001\128\000\018@A(\000@\b\000\000\000\000\000\002\000\006\000\000I\001\004\160\000\000 \000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000I\000\004\160\000\000 \000\000\000\000\000\b\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\018@\001\000\000\000\b\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\002\016\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\255[\255\236\239\191\239\255\252\159\167\2551\n\030y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\132\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\002\016\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\018@\001\000\000\000\b\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\001\000\000\000\b\000@\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000 \000@\000\000\002\000\016\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\bD\001\020\016@\128\004\024\000\016\000\005\176\bX\001\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\004\024\000\016\000\005\176\bH\001\000\228\000\015\002\128\014.\n\000\000\128 \004\000\001\000\132@\017@\005\b\"A\192\001\"\000S\b\129\132\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\144\0008\n\0008\184(\000\002\000\128\016\000\004\000\014\000\016\224( \226\224\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\128D\016\000\004(\000@\000\002\000\000\b!\000@\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\192]\192\004\012\138A\192\193\"@[\000\169\132X\014\000\000\192\b\000\226\224\128\000\b\000\000\000\000\000\0008\000\003\128\160\131\139\130\000\000 \000\000\000\000\000\000`\000\012\000\000\n.\b\000\000\144\000\004\000\000\000\003\128\0008\n\b8\184 \000\002\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\b\004@\000\000@\128\004\000\000 \000\000\002\016\004\000\224\000\014\002\130\014.\b\000\000\128\000\000\000\000\000|\251\"\004\021\248\218\000\004\193\192\030\209\197\128\160\208\159\194E\171\026\173\249\156\244\005`?\192\000\007\142\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\194\000\139\138\141\248\153\244\001`>\128\000\001\142\002;\b\002,*7\226g\208\005\128\250\000\000\0068\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002B\000\136\002\128\160\152\228\000`\006\000\000\001\140\b@\000\004\002\000\n\004\020\012\000\000\000\016\b\000\000!\000\000\016\000\000(\016P0\000\000\000@ \000\000\132\000\000@\000\000\160A\000\192\000\000\001\000\128\000\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\006\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\024\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\006C\016\143\192,\178\152\180\248\249\006`\128\025,\184\000\000@\000\000\000\000\000\016\001\128\016\000\000\000\000 `\000\000\b\000\000\000\016\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\018\002\000\000\130\130\000\000\000\001\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\002\004\128\128\000\000\128\129\000\000\000@\000\000\000\000\000\b\018\002\000\000\002\002\000\000\000\001\000\000\000\000\000)\252$\024\177\170\223\153\223@V\003\252@\0008\224\167\240\144b\198\171~g=\001X\015\241\000\000\227\128\006\000\000I\129\004\160\001\000 \000\000\000\000\000\b\000\024\000\001$\004\018\128\004\000\128\000\000\000\000\000 \000`\000\004\144\016J\000\000\002\000\000\000\000\000\000\128\001\128\000\018@\001(\000\000\b\000\000\000\000\000\002\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\bD\001\020\016@\128$\024\000\018 \005\176\b\024\001!\016\004P\001\002\000\144`\000H\128\022\192 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \t\006\000\004\136\001L\002\002\000G\207\178 A_\141\160\000L\028\001\237\028X\n\r\t\252$Z\177\170\223\153\207@V\003\252\000\000x\224\167\240\145b\198\171~g=\001X\015\243\000\000\227\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129 \000 @\000\000\016\000\000\000\002\000\002\004\128\128\128\000\128\129\000\000\000@\000\000\000\000\000\b\018\002\000\000\002\002\004\000\000\001\000\000\000\000\000\000 H\b\000\000\b\b\000\000\000\004\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\018\002\000\000\002\002\000\000\000\001\000\000\000\000\000\b\236 \b\176\168\223\137\159@\022\003\232\000\000\024\224#\176\128\"\194\163~&=\000X\015\160\000\000c\128\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\b\000\000\002\000\000\128\004\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\016\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\236 \b\184\168\223\137\159@\022\003\232\000\000\024\224#\176\128\"\194\163~&}\000X\015\160\000\000c\128\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\n;\012B?*\183\234c\211\229\196\250\130\000f\186\224$!\b\128(\n\t\142@\006\000`\000\000\024\192#\176\128\"\194\163~&=\000X\015\160\000\016c\128\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\rM\237\222\191\202\250\190\127\191\251\236=\190\219\255\243\200\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\001\144\128 @\001(&-\000:\001\128\000\000A\000\006B\000\129\000\004\160\152\180\000\232\006@\000A\004\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\005\016\000d H\016\000J\t\139@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\136\000\000\000\000\000\000\000\000\000\128\000\016\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\016\000\224\000N\002\128\014.\b\000\000\128\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\004\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000P\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000 \000\000\b\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\004\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\192]\192\004\012\138A\192\193\162@[\000\168\132X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001\220\000@\200$\028\012\018$\005\176\n\136E\128\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\196@\029\192\004\012\130A\192\193\"@[\000\168\132X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\005\220\000@\200$\028\012\018$\005\176\n\136E\128`\000\012\000\000\n.\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012L\005\220\000@\200\164\028\012\018$\005\176\n\136E\128 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\019\001w\000\0162)\007\003\006\137\001l\002\162\017`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\012\000\128\014.\b\000\000\128\000\000\000\000\000\003\128\0008\n\b8\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\000\002\000\000\000\000\128\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012L\005\220\000@\200\164\028\012\026$\005\176\n\136E\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\0008\000\003\128\160\131\139\130\000\000 \000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\002\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\003\017\000w\000\0162\t\007\003\004\137\001l\002\162\017`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\n.\b\000\000\128\000\000\000\000\000\196@\029\192\004\012\130A\192\193\"@[\000\168\132X\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\012D\001\220\000@\200$\028\012\018$\005\176\n\136E\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\0000\000\000(\184 \000\002\000\000\000\000\000\003\017\000w\000\0162\t\007\003\004\137\001l\002\162\017lL\005\220\000@\200\164\028\012\018$\005\176\n\136E\128`\000\012\000\000\n.\b\000\000\128\000\000\000\000\000\196\192]\192\004\012\138A\192\193\"@[\000\168\132X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001\220\000@\200$\028\012\018$\005\176\n\136E\000\000\000\004\000\000\b\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\000\000\000\001\000\000\000\000\000\016\000\000\000\000\000\b\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\128\000\000\000\000\001\000\000\002\000\000\000\000\000\000\000\128\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\0001\016\007p\001\003 \144p0H\144\022\192*!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\012D\001\220\000@\200$\028\012\018$\005\176\n\136E\128\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\003\017\000w\000\0162\t\007\003\004\137\001l\002\162\017`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\n.\b\000\000\128\000\000\000\000\000\196@\029\192\004\012\130A\192\193\"@[\000\168\132X\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\0008\000\003\128\160\131\139\130\000\000 \000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\002\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\196@\029\192\004\012\130A\192\193\"@[\000\168\132X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\003\000\000\002\139\130\000\000 \000\000\000\000\0001\016\007p\001\003 \144p0H\144\022\192*!\022\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\012D\001\220\000@\200$\028\012\018$\005\176\n\136E\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\0000\000\000(\184 \000\002\000\000\000\000\000\003\017\000w\000\0162\t\007\003\004\137\001l\002\162\017`\024\000\003\000\000\002\139\130\000\000 \000\000\000\000\0001\016\007p\001\003 \144p0H\144\022\192*!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\000\004\000\000\004\000\000\000\000@\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\004\000\000\000\000@\128\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000@\000\000\000\004H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\004\000\000\000\000D\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000@\000\000\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\001\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\001\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\128\000\000\000\000@\000\000\000\b\000\000\000\002\000\000\"\000\000\000\000\000\000\000\000\000 \000\000\000\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004\016\000d \b\024\000J\t\154@\014\128`\000\000\016@\001\144\128 @\001(&i\000:\001\128\000\000A\000\006B\000\129\000\004\160\152\164\000\232\006\000\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$e#j\018\001J\t\154\192.\128b\132\014\213P\000\000\128\000@\001\000\000\001\000\000\001\000\000\000@\000\000\000\000\000\000\000\000\000\004\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\025H\218\132\128R\130f\240\011\160\025\160\131\181T\000 \000\000\000\000\b\001\138\000\000\000\000\000\000\000\000\129\144\132 @\001(&-\000:\001\144\000\002A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\024\000J\t\155@\014\128d\000\000\016@\001\144\128 @\001(&m\000:\001\144\000\000A\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\r\128\000\004\000\000@\000\128\000\n\0003\020@\006B\000\129\000\004\160\152\180\000\232\006@\000\001\004\t\000\000\216\000\000@\000\004\000\b\000\000\160\0031D d \b\016\000J\t\139@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\0006\000\000\016\000\001\000\002\000\000(\000\204Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$d#h\016\001J\t\155@.\128f\128\012\213P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\025\b\218\004\000R\130f\208\011\160\025\160\0035T t1\b\252\002\203)\139O\143\144f\b\001\146\203\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\128 @\001(&)\000:\001\128\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\001\000\024\001\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\016\000\000\000\000\000\b\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\025\b\002\004\000\018\130b\208\003\160\025\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\r\128\000\004\000\000@\000\128\000\n\0003\020B\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\025\b\002\004\000\018\130b\208\003\160\025\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\r\128\000\004\000\000@\000\128\000\n\0003\020B\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000@\000\000\000\000\000\"\004@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d H\016\000J\t\139@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\t\000\000\000\000\000@\000\000\000\000\0002\020B\006B\004\129\000\004\160\152\180\000\232\006@\000AD\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\128\000\000\000\000@\000\000\000\000\000\"\004B\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000\b\024\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000 \000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e \n\018\000J\t\154\192.\128b\000\b\209X\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\000\b\000\000\000\b\000`\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\128\000\016\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\016\000\000 \000\000\000\000\000\000\b\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000@\000\000\000\000\004\000\000\000\000\128\000\000\000\000\000\001\000\000\000\000\000\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\000\128\000\000\000\128\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000 \000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\228 \136\025\130N\t\155@\014\128d\000\000\016@\000\129 \000 @\000\000\016\000\000\000\002\000\002\004\128\128\128\000\128\129\000\000\000@\000\000\000\000\000\b\018\002\000\000\002\002\004\000\000\001\000\000\000\000\000\000 H\b\000\000\b\b\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000 \000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\024\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\002\004\128\128\000 \160\128\000\000\000@\000\000\000\000\000\b\018B\000\000\130\130\000\000\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\129 \000\b( \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\000\000\129 \000\b( \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001T\000@\192$\028\000\018 \005\176\000\136\001\0000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\128\000\018@\001(\000\000\b\000\000\000\000\000\002\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000@\000\000\224\000\015\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\012D\001T\000@\192$\028\000\018 \005\176\000\136\005\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\196@\021@\004\012\002A\192\001\"\000[\000\136\128S\017\000U\000\0160\t\007\000\004\136\001l\002\"\000@8\000\003\128\160\003\139\130\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\002\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\003\017\000U\000\0160\t\007\000\004\136\001l\002\"\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\016\000\000\b\018\002\000\000\130\130\000\000\000\001\000\000\000\000\0001\016\005P\001\003\000\144p\000H\128\022\192\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000 \000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\0001\016\005P\001\003\b\144p\000H\128\022\194\003 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129 \000\b( \000\000\000\016\000\000\000\000\003\017\000U\000\0160\t\007\000\004\136\001l\000\"\000@\b\018\002\000\000\130\130\000\000\000\001\000\000\000\000\0001\016\005P\001\003\000\144p\000H\128\022\192\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\b\b\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001T\000@\194$\028\000\018 \005\176\128\136\001\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\017\000U\000\0160\137\007\000\004\136\001l \"\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\016\005P\001\003\000\144p\000H\128\022\192\002 \004\000@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001T\000@\194$\028\000\018 \005\176\128\136\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\017\000U\000\0160\t\007\000\004\136\001l\000\"\000L\000\000@\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\000\000\129 \000\000 \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001T\000@\194$\028\000\026 \005\176\000\152\001\001 I\b\000\000\b\b\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\128\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129 \000\b( \000\000\000\016\000\000\000\000\003\000\000\016\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001T\000@\194$\028\000\026 \005\176\128\152\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000@\000\128\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\002;\b\002,*7\226c\208\005\128\250\000\000\0078\b\236 H\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\b\000\000\000\000\128\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\002\000 \000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000$ \b\128(\n\t\142@\006\000`\000\000\024\192\192\000\b\128\000\000\000\000\000\000&\000\b(\t\000\000\142\194\000\139\138\141\248\153\244\001`>\132\000\001\142\002;\b\002,*7\226g\208\005\128\250\016\000\0068\b\236 \b\176\168\223\137\143@\022\003\232@\000\024\224\000\144\128\" \160(&y\000\024\001\128\000\000c\000\002B\000\136\002\128\160\153\228\000`\006\000\000\001\140\000\t\b\002 \n\002\130c\144\001\128\024\000\000\0060\000$ \b\128(\n\t\142@\006\000`\000\000\024\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rM\237\222\191\202\250\174\127\191\251\236=\190\219\255\247\192 \000\000\000\000\n\001\142\000\000\000\000\000\000\000\000\163\176\196#\242\171~\166=>\\O\168 \006k\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n;\bB,*7\226c\208\005\128\250\000\000\0068(\236!\b\176\168\223\137\143@\022\003\232\000\000\024\224\128\129 \000 @\000\000\016\000\000\000\000\000\002\004\128\128\000\000\128\129\000\000\000@\000\000\000\000\000\b\018\002\000\000\002\002\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000@\000\128\129 \000\b( \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163\176\132\"\194\163~&=\000X\015\160\000\000c\130\142\194\016\139\n\141\248\152\244\001`>\128\000\001\142\b\025\bB\004\000\018\130b\208\003\160\024\000\000\004\016\000\000\000\000\000\000\000\000\016\000\000\000\002\000\b\193\016\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000 \000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\b\236 \b\184\168\223\137\159@\022\003\232\000\000\024\224#\176\128\"\194\163~&}\000X\015\160\000\000c\128\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\004\001\000\000\000\000\000@\000\004\000\000\000\000\000\002 D\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\001\148\128(h\001(&k\000:\001\128\000\000A\000\006R\000\161 \004\160\153\172\000\232\006\000\000\001\004\000\025H\002\132\128\018\130b\176\003\160\024\000\000\004\016\000@\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014B\000\129\b\004\224\152\180\000\232\006@\000\001\004\000\000\000@\000\000\000\000\004\000\000\000\000\128\0020D\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\016\000\000 \000\000\000\000\000\000\b\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000@\000\000\000\000\004\000\000\000\000\128\000\000\000\000\000\001\000\000\000\000\000\016\000\000\000\002\000\000\000\000\001\144\128 @\001(&-\000:\001\144\000\000A\000\000\000\016\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\015C\016\143\200,\242\152\180\248\249\006`\128\025,\176\000\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000(\000\000\000\000\000\000\000\001\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\n\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\004\000\000\000\000\000\0020D \224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\016\000\000 \000\000\000\000\000\000\b\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\128 @\001(&-\000:\001\144\000\000A\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\016\000J\t\138@\014\128`\000\000\016@\131\144\196#\242\011<\166->>A\152 \006K.\000\000\016\000\000\000\000\001\000\000\000\000\000\000\140\017\b8\000\003\128\160\003\139\130\000\000 \000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\002\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\016\000J\t\139@\014\128d\000\000\016@\000\000\004\000\000\000\000\000@\000\000\000\000\000#\004@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\002\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\002\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006R\000\161 \020\160\152\172\000\232\006 \000%\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\001\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\000\b\000\000\000\000@\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\003Q)w\007\208>\011\007\003\254\139\to\022\254p\240\025\b\002\004\000\018\130b\208\003\160\025\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\128\004\160\153\180\000\232\006@\000\001\004\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004\016\000d \b\016\000J\t\139@\014\128d\000\000\016@\000\000\000\000\000\000\000\000@\000\000\000\b\000\"\004@\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000$ \b\136(\n\t\158@\006\000`\000\000\024\192\000\144\128\"\000\160(&y\000\024\001\128\000\000c\000\002B\000\136\002\128\160\152\228\000`\006\000\000\001\140\rD\165\220\031@\248,\028\015\250l%\190\219\249\195\192\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002B\000\136\002\128\160\152\228\000`\006\000\000\001\140\rM\237\222\191\202\250\174\127\191\251\236=\190\219\255\247\192\000\000\000\000\000\b\000\n\000\000\000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\128\000\r\128\000\000\000\000\000\000\000\000\000\0000\020\002\142\194\022\139\n\141\248\152\244\001`>\128\000A\206\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00057\183z\255+\234\185\254\255\239\176\246\251o\255\207\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000 \224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0002\000\000\000\000\001\000\000\000\000 \000\000\000\b8\000\003\128\160\003\139\130\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012\128\000\000\000\000@\000\000\000\b\000\b\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\b\000\000\200\000\000\000\000\004\000\000\000\000\128\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\128\"\000\160(&9\000\024\001\128\000\000c\003S{w\175\242\190\171\159\239\254\251\015o\182\255\253\240\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000(\000(\000\000\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\2457\183z\255+\234\185\254\255\239\176\246\251o\255\207\212J]\193\244\015\130\193\192\255\166\194[\237\191\156<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000B;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00057\183z\255+\234\185\254\255\239\176\246\251o\255\207\212J]\193\244\015\130\193\192\255\166\194[\237\191\156<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\254\183x\253\171\255\185\255\127\254\179\254\241o\255\239|\251\"\004\021\248\218\000\004\193\192\030\209\197\128\160\208\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015\003\144\128 B\0018&m\000:\001\128\000\000A\000\014B\000\129\b\004\224\152\180\000\232\006\000\000\001\004\b]I\022\132\192\146\166~\176\027\160\029\176\002\188U\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\015\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000 \000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000 \000\000\000\000\000\000\b\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\000\000\000\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\b\000#\004@\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\000\000\000\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000 \000\136\017\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\144\128 @\001(&-\000:\001\144\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\002 D d \b\016\000J\t\139@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000 \000\136\017\b\025\b\002\004\000\018\130b\208\003\160\025\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\b\000\"\004B\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\002 D\000d \b\016\000J\t\139@\014\128d\000\000\016@\000\000\000\000\000\000\000\000@\000\000\000\b\000\"\004@\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\025H\002\132\128\018\130b\176\003\160\024\128\000\148\016 \224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\016\000\000 \000\000\000\000\000\000\b\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\000\000\000\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128$\024\000\026 \0050\000\b\001!\016\004P\001\002 \144`0h\128\020\192 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\018\151p}\003\224\176p?\232\176\150\241o\231\015#\176\128\"\194\163~&=\000X\015\160\000\000c\130\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\130\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\128\000\160\000\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\004\216\031\0000\b\004\003\224\004\000\128\003a\128\232\236!h\176\168\223\137\143@\022\003\232\000\004\028\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\b\002 \n\002\130c\144\001\128\024\000\000\006057\183z\255+\234\185\254\255\239\176\246\251o\255\223\000\000\000\000\000\000 \000(\000\000\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\222\221\235\252\175\171\231\251\255\190\195\219\237\191\255<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\003Q)w\007\208>\011\007\003\254\139\to\022\254p\253D\165\220\031@\248,\028\015\250,%\188[\249\195\200\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rM\237\222\191\202\250\190\127\191\251\236=\190\219\255\243\200\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\001\144\128 `\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004P5\018\151p}\003\224\176p?\232\176\150\241o\231\015\212J]\193\244\015\130\193\192\255\162\194[\197\191\156<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\222\221\235\252\175\171\231\251\255\190\195\219\237\191\255<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\003Q)w\007\208>\011\007\003\254\139\to\022\254p\253D\165\220\031@\248,\028\015\250,%\188[\249\195\192 \000\000\000\000\n\000\n\000\000\000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\130\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\rM\237\222\191\202\250\190\127\191\251\236=\190\219\255\243\200\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\001\144\128 `\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004P5\018\151p}\003\224\176p?\232\176\150\241o\231\015\212J]\193\244\015\130\193\192\255\162\194[\197\191\156<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\00057\183z\255+\234\249\254\255\239\176\246\251o\255\207#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068 \000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\212\222\221\235\252\175\171\231\251\255\190\195\219\237\191\255<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\003Q)w\007\208>\011\007\003\254\139\to\022\254p\253D\165\220\031@\248,\028\015\250,%\188[\249\195\192\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000 \000(\000\000\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\00057\183z\255+\234\249\254\255\239\176\246\251o\255\207#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\212\222\221\235\252\175\171\231\251\255\190\195\219\237\191\255<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\003Q)w\007\208>\011\007\003\254\139\to\022\254p\253D\165\220\031@\248,\028\015\250,%\188[\249\195\200\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\128\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\003S{w\175\242\190\175\159\239\254\251\015o\182\255\252\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015\212\222\221\235\252\175\171\231\251\255\190\195\219\237\191\255<\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\003Q)w\007\208>\011\007\003\254\139\to\022\254p\253D\165\220\031@\248,\028\015\250,%\188[\249\195\2457\183z\255+\234\185\254\255\239\176\246\251o\255\223\212\222\221\235\252\175\170\231\251\255\186\195\219\197\191\255<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068 \000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\018\151p}\003\224\176p?\232\176\150\241o\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\b\000c\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212J]\193\244\015\130\193\192\255\162\194[\197\191\156<\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\200\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\001\144\128 `\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004P5\018\151p}\003\224\176p?\232\176\150\241o\231\015\212J]\193\244\015\130\193\192\255\162\194[\197\191\156?Q)w\007\208>\011\007\003\254\139\to\022\254p\242;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000 \000\136\017\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000 \142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\016\000J\t\139@\014\128`\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\t\bB \n\002\130c\144\001\128\024\000\000\0060 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\001\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\t\000\000\128\000\000\000\000\000\000\000\000 \000\003\000@\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\001\144\128 `\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004P\004\000\000@\000\000\000\000\000\000\000\000\128\000\012\005\000\016\000A\001\240\003\000\128@>\000B\b\0006\024\012\006B\000\129\000\004\224\153\180\000\232\006@\000\001\004\001\000\000\016\000\000\000\000\000\000\000\000 \000\001\001\001\000d \b\016\000N\t\155@\014\128d\000\000\016@\001\144\128 @\0018&-\000:\001\144\000\000A\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\004\000\b\000\000\000\002 D\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\001\144\128 `\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004P\004\000\000@\000\000\000\000\000\000\000\000\128\000\012\005\004\016\000A\001\240\003\000\128@>\000B\b\0006\024\028\000\000\000\000\000\000\000\001\000\002\000\000 \000\136\017\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\001\000\000\016\000\000\000\000\000\000\000\000 \000\003\001A\004\000\016@|\000\192 \016\015\128\016\130\000\r\134\007#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\000\b\000\000\000\000\000\000\000\000\000\000\000@ \004\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\025\b\002\006\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&-\000:\001\144\000\000E\000@\000\004\000\000\000\000\000\000\000\000\b\000\000\192PA\000\004\016\031\0000\b\004\003\224\004 \128\003a\129\192\002\016\000|\000\192 \016\015\128\016\002\016\t\130\003#\176\128\"\194\163~&=\000X\015\160\000\000c\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\016\000\001\000\000\000\000\000\000\000\000\002\000\0000\020\016@\001\004\007\192\012\002\001\000\248\001\b \000\216`p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\001 \007\192\012\002\001\000\248\001\b \000\216 1\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000s\128\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\144\000\b\000\000\000\000\000\000\000\000\002\000\000 \020\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\018\000|\000\192 \016\015\128\016\130\000\t\134\003\016\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002;\b\018,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\128 `\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004P$\000\002@\000\000\000\000\000\000\000\000\128\000\b\001\000\016\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\001$\007\192\012\002\001\000\248\001\b \000\152 1\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\128\"\000\160(&9\000\024\001\128\000\000c\001\000\000\000\000\000\000\000\000\000\000\152\000\000\160\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\128\000\000\000\000\000\000\000\000\b\000\t\000\002\000\000\"\000\000\000\000\000\000\000\000\000 \000\000\000\b\000\000\136\000\000\000\000\000\000\000\000\000\000\000\000\000 \000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\152\000\000\160\000\000\000\b\000\000\000\000\002\128c\128\000\000\000\000\000\000\0000\000\002 \000\000\000\000\000\000\t\128\002\n\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Q)w\007\208>\011\007\003\254\155\to\182\254p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\128\000\b\128\000\000\000\000\000\000\000\128\000\000 \004\002\000\001\"\007\192\012\002\001\000\248\003\000 \000\152 8\000\000\128\000\000\000\000\000\000\000\b\000\000\000\000\000 \000\000\000\000\000\002\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\144\000\t\000\000\000\000\000\000\000\000\002\000\000 \004\000@\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\004\144\031\0000\b\004\003\224\004 \128\002`\128\196\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\144\000\b\000\000\000\000\000\000\000\000\002\000\000 \020\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\018\000|\000\192 \016\015\128\016\130\000\t\134\003\016\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 H\b\000\000\b\b\016\000\000\004\000\000\000\000\000\000\129 \000\000 \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\128\001\000\002\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000 \000\000\000@\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\002\000\000@\000\000\129 \000\000 \000\000\000\016\000\000\000\000\002\017\000E\000\016 \137\007\000\006\136\001L\000\002\000H\b\018\002\000\000\130\130\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\004\000\000@\000\000\000\b\000\000\000\000\002\004\128\128\000\000\128\128\000\000\000@\000\000\000\000\bD\001\020\000@\130$\028\000\026 \0050\000\b\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\000 \000 \000`\000\000\000\128\000\000\000\000\002@\000\000\000\000\128\001\128\000\000\002\000\000\000\000\000\t\000\000\000\000\002\000\002\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000@\000\128\000\000\000\001\000\000\006\000\000\192\000\000\162\224\160\000\b\128\000\000\000\000\000\000\000\000\000\001\000\128\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\016\000\000 \000\000\000\000\000\000\b\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\136\000\000\000\000\004\000\000\004\000\000\000\000\004\000\000\002 \000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000@ \001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\016\000\000\016\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\000\128\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\bL\005\020\000@\192\164\028\000\026 \0050\b\bA\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\0000\000\000(\184 \000\002 \000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\bL\005\020\000@\192\164\028\000\026 \0050\b\bA!0\020P\001\003\002\144p\000h\128\020\192 !\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\019\001E\000\016 )\007\000\006\136\001L\002\002\016@\024\000\003\000\000\002\139\130\128\000\"\000\000\000\000\000\000\224\000\014\002\130\014.\b\000\000\128\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\002\001\016\000\000\016 \001\000\000\b\000\000\000\132\001\000\000\000\001\000\000\002\000\000\000\000\000\000\000\128\000\000\000`\000\012\000\000\n.\n\000\000\136\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\bL\001\020\000@\128\164\028\000\026 \0050\b\bA!0\020P\001\003\002\144p\000h\128\020\192 !\004\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\bL\001\020\000@\128\164\028\000\026 \0050\b\bA!0\020P\001\003\002\144p\000h\128\020\192 !\004\000\000\000\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014B\b\129\b\004\224\153\180\000\232\006\000\000\001\004\0009\b\"\004 \019\130b\208\003\160\024\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\144\128 B\0018&-\000:\001\128\000\000A\002\017\000E\000\016 \t\006\000\006\136\001L\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\024\000J\t\155@\014\128d\000\000\017@\001\144\128 @\001(&m\000:\001\144\000\000E\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\rD\165\220\031@\248,\028\015\250,%\188[\249\195\245\018\151p}\003\224\176p?\232\176\150\241o\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\144\000\b\000\000\000\000\000\000\000\000\002\000\0000\004\000@\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\018\000|\000\192 \016\015\128\016\130\000\r\130\003\016\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 H\b\b\000\b\b\016\000\000\004\000\000\000\000\000\000\129 \000\000 @\000\000\016\000\000\000\000\000\002\004\128\128\000\000\128\128\000\000\000@\000\000\000\000\000\000\000@\000\000\002\000\004\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\129 \000\b( \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\b\002\004\000\018\130b\208\003\160\025\000\000\004P5\018\151p}\003\224\176p?\232\176\150\241o\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\128\004\160\153\180\000\232\006@\000\001\020\000\025\b\002\004\000\018\130f\208\003\160\025\000\000\004P\000d \b\016\000J\t\139@\014\128d\000\000\017@\128\000\004\000\000\000\000\000\000\000\000\000\000\000)\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 H\b\000\002\n\b\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 H\b\000\002\n\b\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\016\000\001\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 H\b\000\002\n\b\000\000\000\004\000\000\000\000\000@\000\004\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\004@\031\0000\b\004\003\224\004\000\128\002\240\128\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002\004\128\128\000 \160\128\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002\004\128\128\000 \160\128\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\001\000\000\016\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\128\128\000 \160\128\000\000\000@\000\000\000\000\004\000\000@\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\"A\192\001\"\000S\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\018\002\000\000\002\002\004\000\000\001\000\000\000\000\000\000 H\b\000\000\b\b\000\000\000\004\000\000\000\000\000\132@\017@\004\b\"A\192\001\"\000S\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\000 \002\000\000\000\004\000\000\000\000\000\000\000\000\000 \000\000\b\000\002\000\016\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\bD\001\020\000@\128$\024\000\018 \005\176\000\b\000\000 H\b\000\002\n\b\000\000\000\004\000\000\000\000\000\196@\017@\004\012\002A\192\001\"\000S\000\000\128\002\017\000E\000\016 \t\006\000\004\136\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\001\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\128\000\016\000!\016\004P\001\002\000\144`\000H\128\020\192\000 \004\132@\017@\004\b\002A\000\001\"\000S\000\000\128\016\006\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\002\000\000@\000\132@\017@\004\b\002A\128\001\"\000S\000\000\128\018\017\000E\000\016 \t\004\000\004\136\001L\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\b\000\001\000\002\017\000E\000\016 \t\006\000\004\136\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031>\200\129\005~6\128\0010p\007\180q`(4'\240\145j\198\171~g=\001X\015\240\000\001\227\128\006B\000\129\000\004\160\152\180\000\232\006@\000\001\004\001\000\000\016\000\000\000\000\004\000\000\000\000\000\002 D\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\243\236\136\016W\227h\000\019\007\000{G\022\002\131B\127\t\022\172j\183\230s\208\021\128\255\000\000\0308\000 H\b\b\002\n\b\016\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\160\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\001\000\000\002\000\000\000\000\000\000\000\128\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\132@\017@\004\b\130A\192\193\"\000[\000\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016$P\001\002\000\144`\000H\128\020\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \t\006\000\004\136\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002 \144p0H\128\022\192 \000\000\144\000\000 \000 \000`\000\000\000\128\000\000\000\000\002@\000\000\000\000\128\001\128\000\000\002\000\000\000\000\000\t\000\000\000\000\002\000\002\000\000\000\b\000\000\000\000!\016\004P\001B\000\144p\000H\128\022\192\000`\000\000\144\000\000\000\000 \000 \000\000\000\128\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\b\000\bD\001\020\000@\128$\028\000\018 \0050\128\b@\000 \000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002\017\000E\000\016 \t\007\000\004\136\001L\000\002\000\bD\001\020\000@\128$\024\000\018 \0050\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\002A\192\001\"\000S\000\000\128\002\017\000E\000\016 \t\006\000\004\136\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\240\004^\003\130\014>H\000@\128\020\000\000 \000\132@\017@\004\b\000A\000\001\000\000S\000\000\128\000\002\000\000\000\128\000\000\001\000\000\000\000\000\000\000\b\000\b\000\000\002\000\000\000\004\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \129\006\000\004\000\001L \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \129\006\000\004\000\001L \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000p\000\128\b\000\000\000\016\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000@\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \001\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000\016`\000@\000\022\192\001 \000\000\129 \000\b( \000\000\000\016\000\000\000\000\003\017\000E\000\0160\001\007\000\004\000\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\001\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000 \000\020\000\b\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b A\128\001\000\000S\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\129 \000\b( \000\000\000\016\000\000\000\000\003\017\000E\000\0160\001\007\000\004\000\001L\000\002\000HD\001\020\000@\128\004\016\000\016\000\0050\000\b\001\000`\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\b\018\002\000\000\130\130\000\000\000\001\000\000\000\000\0001\016\004P\001\003\000\016p\000@\000\020\192\000 \004\132@\017@\004\b\000A\000\001\000\000S\000\000\128\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\002\000\000@\000\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\004\024\000\016\000\0050\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129 \000\b( \000\000\000\016\000\000\000\000\003\017\000E\000\0160\001\007\000\004\000\001L\000\002\000\bD\001\020\000@\128\004\024\000\016\000\0050\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\b\000\001\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\b\000\b\000\024\000\000\000 \000\000\000\000\000\144\000\000\000\000 \000`\000\000\000\128\000\000\000\000\002@\000\000\000\000\128\000\128\000\000\002\000\000\000\000\bD\001\020\000P\128\004\028\000\016\000\0050\000\024\000\002\016\000\000\b\000\002\000\024\000\000\000\000\000\000\000\000\b\000\000\000 \000\b\000`\000\000\000\000\000\000\000\000 \000\000\000\000\000 \001\128\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\004\000\000I\000\004\000\000\000 \000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000I\000\004\000\000\000 \000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\002\000\000\128\002\000(\128\128\000\000\000\000\000\000\000\b@\000\004\000\000\n\004\020\004\000\000\000\016\b\000\000!\000\000\016\000\000(\016@\016\000\000\000@ \000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\016\000\000 \016@\016\000\000\000@ \000\000\b\000\000\000\000\016\b\000@\000\000\000\000\000\000\000\000 \000\000\000\000@ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\002\016\000\001\000\000\002\001\007\001\000\000\000\004\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\002\000\016\000\000\000\000\000\000\000\000\b\000\000\004\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\132\000\000@\000\000\128A\128@\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\002\000\b\000\162\006\000\000\000\000\000\000\000\000\000 \000\b\000 \002\136\b\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\002\000\000\128\002\000(\128\128\000\000\000\000\000\000\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\016\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\005P\001\002 \144p\016H\128\022\192 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000 \000\b\000 \002\136\b\000\000\000\000\000\000\000\000\132@\021@\004\b\130A\192A\"\000[\000\128\128\018\016\000\001\000\000\002\001\007\001\000\000\000\004\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\014.\024\000\000\128\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000 \000\000\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\000!\000\000\016\000\000 \016p0\000\000\000@ \000\000\132\000\000@\000\000\128A\128@\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\001\000\000\002\001\006\001\000\000\000\004\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000@\000\000\128A\000@\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128$\028\000\018 \0050\000\b\001!\016\004P\001\002\000\144@\000H\128\020\192\000 \004\b\000\000\000\000\000\b\000`\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\002\000\000\128\002\000(\128\128\000\000\000\000\000\000\000\bD\001\020\000@\128$\028\000\018 \0050\000\b\001!\016\004P\001\002\000\144@\000H\128\020\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\006\000\000\000\000\000\000\000\000\002\000\000\000\000\000\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000`\000\014\002 \n\174\b\000\000\128\000\000\000\000\000\132\192U@\004\012\bA\192\001\"\000[\000\001\128\016\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000`\000\014\002 \n\174\b\000\000\128\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\005\000\000\000\004\000\000\000\000\001\000\000\000\000\000\000\128\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000`\000\014\002 \n\174\b\000\000\128\000\000\000\000\000\001\128\0000\000\000(\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\024\000\003\128\136\002\171\130\000\000 \000\000\000\000\000!0\021P\001\003\002\016p\000H\128\022\192\000 \004\132\192U@\004\012\bA\192\001\002\000[\000\000\128\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001T\000@\128\004\028\000\016\000\005\176\000\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \001\006\000\004\000\001L\000\002\000HD\001\020\000@\128\004\016\000\016\000\0050\000\b\001\002\000\000\000\000\000\002\000\024\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\128\0008\b\128*\184 \000\002\000\000\000\000\000\002\017\000E\000\016 \001\006\000\004\000\001L\000\002\000HD\001\020\000@\128\004\016\000\016\000\0050\000\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\004\016\000\016\000\0050\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\004\024\000\016\000\0050\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129 \b( @\000\000\016\000\000\000\000\000\002\004\128\128\000 \160\129\000\000\000@\000\000\000\000\000\b\018\002\000\000\130\130\000\000\000\001\000\000\000\000\0001\016\004P\001\003\000\016p\000@\000\020\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \001\004\000\004\000\001L\000\002\000@\016\000\001$\000\018\128\004\000\128\000\000\000\000\000 \000@\000\004\144\000J\000\000\002\000\000\000\000\000\000\128\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \t\006\000\004\136\001l\002\006\000HD\001\020\000@\128$\024\000\018 \005\176\b\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\002A\128\001\"\000S\000\128\128\018\017\000E\000\016 \t\004\000\004\136\001L\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \001\004\000\004\000\001L\000\002\000@\016\000\001$\000\018\128\004\000\128\000\000\000\000\000 \000@\000\004\144\000J\000\000\002\000\000\000\000\000\000\128\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\228\000\015\002\128\014.\n\000\000\128 \004\000\001\000\003\128\0018\n\0008\184 \000\002\000\000\000\000\005\000\000\000\000\000\000@ \000\000\000\000\128\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\019@E\000\016 \137\006\128\004\136\003L\002\002\000HD\001\020\000P\128$\028\000\018 \0050\b\024A!\016\004P\001\002\000\144p\000H\128\020\192 !\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \t\006\000\004\136\001L\002\002\016@\t\000\000\000\000\002\000\002\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \001\006\000\004\000\001L\002\002\000HD\001\020\000@\128\004\016\000\016\000\0050\000\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128$\028\000\018 \005\176\b\b\001\000$\000\001\000\000\b\000\n\000\000\000 \004\000\001\000\000\144\000\000\000\000 \000(\000\000\000\128\016\000\004\000\000\000\000\000\000@ \000\000\000\000\128\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000P\128$\028\000\018 \0050\b\024A!\016\004P\001\002\000\144p\000H\128\020\192 !\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \000\000\000\000\128\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\001\000\000\000\000\000\000\000\000\000\132\000\000\002\000\000\128\006\000\000\000\000\000\000\000\000\002\000\000\000\000\000\002\000\024\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000e \n\018\000J\t\138\192\014\128b\000\000P@\131\144\196#\242\011<\166->>A\152 \006K,\002\000\000\128\002\000\168\128\128\000\000\016\000\000\000\000\b@\000\004\000\000\n\004\020\012\000\000\000\016\b\000\000!\000\000\016\000\000(\016@0\000\000\000@ \000\000\132\000\000@\000\000\128A\000\192\000\000\001\000\128\000\000 \000\000\000\000@ \001\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\004\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\144\000\b\236 \b\176\168\223\137\143@\022\003\232\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000@\000\000\128A\128\192\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\b@\000\004\000\000\b\004\028\012\000\000\000\016\b\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\t\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\128\004\000\000\000\000\000\000\000 \000\000\000\001\000\000\002\000\016\000\000\000\000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000e \n\018\000J\t\138\192\014\128b\000\000P@\003\192\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\b\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\016\000\000 \016`0\000\000\000@ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000e \n\018\000J\t\138\192\014\128b\000\000P@\003\192\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\b\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\236 \b\176\168\223\137\159@\022\003\232\000\000\024\224#\176\128\"\194\163~&=\000X\015\160\000\000c\130\016\000\001\000\000\002\001\006\003\000\000\000\004\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\b\000 \n\136\024\000\000\001\000\000\000\000\128\000\128\000 \000\128* `\000\000\004\000\000\000\000\000\002\000\000\128\002\000\168\128\128\000\000\016\000\000\000\000\000\b\000\002\000\b\002\162\002\000\000\000@\000\000\000\000\000\228 \136\025\128N\t\155@\014\128`\000\000\016@|\251\"\004\021\248\218\000\004\193\192\030\209\197\128\160\208\014B\b\129\b\004\224\153\180\000\232\006\000\000\001\004\0009\b\"\004 \019\130b\208\003\160\024\000\000\004\016\000\228 \b\016\128N\t\139@\014\128`\000\000\016@\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004\000\000\000\000\000\000\000 \000 \000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\b\000\002\000\b\002\162\002\000\000\000@\000\000\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000 \000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e \n\018\000J\t\154\192\014\128`\000\000\016@\001\148\128(H\001(&+\000:\001\128\000\000A\000\006R\000\161 \020\160\152\172\000\232\006\000\000\001\004\000\b\000\002\000\b\002\162\002\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\004\000\128\000 \000\128* \000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bMIV\160\202\138\166\127\188\019\160\0290\b\0305!5%Z\131**\153\254\240N\128t\192 x\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000U\000\016\"\t\007\003\004\136\001L\002\006\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\021@\004\b\130A\192\193\"\000S\000\129\128P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\005P\001\002 \144p0H\128\020\192 `\020\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\b\000\002\000\b\002\162\002\000\000\000@\000\000\000\000!\016\005P\001\002 \144p0H\128\020\192 `\020\003\144\130 B\0018&-\000:\001\128\000\000A\000\014B\000\129\b\004\224\152\180\000\232\006\000\000\001\004\000\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000@\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\014\002 \n\174\b\000\000\128\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\016\000\000 \016p0\000\000\000@ \000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\004\000\000\b\004\024\012\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000 \000\128* \000\000\004\000\000\000\000\002\016\000\001\000\000\002\001\007\003\000\000\000\004\002\000\001\b@\000\004\000\000\b\004\024\012\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\0008\184`\000\002\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\b@\000\004\000\000\b\004\024\012\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\016\000\000 \016`0\000\000\000@ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\004\000\000\b\004\016\012\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\002A\192\001\"\000S\000\000\128\016\006\000\000\224\"\000\170\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000 \000\b\000 \n\136\b\000\000\001\000\000\000\000\000\132@\017@\004\b\002A\192\001\"\000S\000\000\128\016\006R\000\161 \004\160\152\172\000\232\006 \000\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000\144`\000H\128\020\192\000 \004\132@\017@\004\b\002A\000\001\"\000S\000\000\128\016 \000\000\000\000\000 \001\128\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\006R\000\161 \004\160\152\172\000\232\006 \000\005\004\bD\001\020\000@\128$\024\000\018 \0050\000\b\001!\016\004P\001\002\000\144@\000H\128\020\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000\144@\000@\000\020\192\000 \000\003\144\130 b\0018&m\000:\001\128\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000\144@\000H\128\020\192\000 \004\132@\017@\004\b\002A\128\001\"\000S\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\018\002\002\000\002\002\004\000\000\001\000\000\000\000\000\000 H\b\000\000\b\b\016\000\000\004\000\000\000\000\000\000\129 \000\000 \000\000\000\016\000\000\000\000\002\017\000E\000\016 \137\007\000\004\136\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000\144@\000H\128\020\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\002A\128\001\000\000S\000\000\128\002\017\000E\000\016 \t\004\000\004\000\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \t\004\000\006\136\001L\000\002\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128$\024\000\016\000\0050\000\b\000!\016\004P\001\002\000\144@\000@\000\020\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000@\000\002\000\002\000\000\000\b\000\000\000@\000$\000\000\000\000\b\000\b\000\000\000 \000\000\001\000\000\144\000\000\000\000 \000 \000\000\000\128\000\000\000\002\017\000E\000\020 \t\007\000\004\136\001l\000\006\016\000\t\000\000\000\000\002\000\002\000\000\000\b\000\000\000\000!\016\004P\001\002\000\144p\000H\128\020\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \t\006\000\004\136\001L\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\020 \t\007\000\004\136\001l\000\006\016\000\t\000\000\000\000\002\000\002\000\000\000\b\000\000\000\000!\016\004P\001\002\000\144p\000H\128\020\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\bD\001\020\016@\128$\024\000\018 \005\176\b\024\001!\016\004P\001\002\000\144`\000H\128\022\192 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \t\006\000\004\136\001L\002\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\004\000\000 \000 \000\000\000\128\000\000\004\000\002@\000\000\000\000\128\000\128\000\000\002\000\000\000\016\bD\001\020\000@\128$\024\000\018 \0050\000\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\016\005P\001\003\b\144p\000H\128\022\192\002 \004\192\000\004\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\016\000\000\000\000\000\b\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000@\000\000\128A\000\192\000\000\001\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\006B\000\129\000\004\160\152\180\000\232\006@\000\001\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\018\151p}\003\224\176p?\232\176\150\241o\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\002\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\196@\029\192\004\012\130A\192\193\"@[\000\168\132X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\003\000\000\002\139\130\000\000 \000\000\000\000\0001\016\007p\001\003 \144p0H\144\022\192*!\022\000\128\b\000\000\000\b\000\000\000\"@\000\000\001\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\004\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\128\0000\000\000(\184`\000\002@\000\016\000\000\000\006\000\000\192\000\000\162\224\128\000\t\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\b\000\000\000\b\000\000\000\002@\000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\t\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\002\000\000\000\000\000\000\000\128\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\0008\000\003\128\160\003\139\130\000\000 \000\000\000\000\0001\016\007p\001\003 \144p0H\144\022\192*!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\012D\001\220\000@\200$\028\012\018$\005\176\n\136E\128\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\003\017\000w\000\0162\t\007\003\004\137\001l\002\162\017`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\n.\b\000\000\128\000\000\000\000\000\196@\029\192\004\012\130A\192\193\"@[\000\168\132X\006\000\000\192\000\000\162\224\128\000\b\000\000\000\000\000\0008\000\003\128\160\131\139\130\000\000 \000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\002\000\000\000\003\128\0008\n\0008\184 \000\002\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\014.\b\000\000\128\000\000\000\000\000\196@\029\192\004\012\130A\192\193\"@[\000\168\132X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\003\000\000\002\139\130\000\000 \000\000\000\000\0001\016\007p\001\003 \144p0H\144\022\192*!\022\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\012D\001\220\000@\200$\028\012\018$\005\176\n\136E\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\0000\000\000(\184 \000\002\000\000\000\000\000\003\017\000w\000\0162\t\007\003\004\137\001l\002\162\017`\000\000\000\000\001\000\128\000\000\000\002\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128$\028\000\018 \0050\b\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014@\000\240(\000\226\224\160\000\b\002\000@\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000\016`\000@\000\020\192 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000@\000\002\000\002\000\000\000\b\000\000\000@\000$\000\000\000\000\b\000\b\000\000\000 \000\000\001\000\132@\017@\004\b\000A\128\001\000\000S\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\bD\001\020\016@\128\004\024\000\016\000\005\176\bX\001!\016\004P\001\002\000\016`\000@\000\022\192! \004\003\144\000<\n\0008\184(\000\002\000\128\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\004\024\000\016\000\0050\b\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\016\000\000\128\000\128\000\000\002\000\000\000\016\000\t\000\000\000\000\002\000\002\000\000\000\b\000\000\000@!\016\004P\001\002\000\016`\000@\000\020\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128$\024\000\018 \0050\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002;\b\002,*7\226c\208\005\128\250\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000#\176\128\"\194\163~&=\000X\015\160\000\000c\130\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\004\016\001\002\000\016@\000@\000\020\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\n\000\b\000\000\000 \000\000\000\000\128\000D\003\240\011\004\128\000>\004@\b \006\n,\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000 \000\000\000\b\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000 \000\016\000\252\002\193 \000\015\129\016\002\b\001\130\139\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\128\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000\226\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\194\000\139\n\141\248\152\244\001`>\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\128\128\000\000\128\128\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\016\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\128\128\000 \160\128\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\016\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\000\004\160\152\180\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\004\000\000\000\000 \002 D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\b\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\t\252$\024\177\170\223\153\207@^\131\252\128\0008\224\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\019BA\000\016 \169\004\004\004\136\003H\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\004\016\001\002\000\144@\000H\128\020\130\000 \000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\019BA\000\016 \169\004\004\004\136\003H\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\004\016\001\002\000\144@\000H\128\020\130\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004@\016@\004\b\002A\000\001\000\000P\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\252$\024\177\170\223\153\207@^\131\252\128\0008\224'\240\144b\198\171~g=\001z\015\242\000\000\227\128\017\000A\000\016 \t\004\000\004\136\001H\000\002\000\000D\001\004\000@\128$\016\000\018 \005 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000A\000\016 \t\006\000\004\136\001H\000\002\000\000D\001\004\000@\128$\016\000\018 \005 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\001\004\000@\128$\024\000\018 \005 \000\b\000\001\016\004\016\001\002\000\144@\000H\128\020\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") + (139, "'\244\144b\198\169\1913\159`+\001\254@\000\028d\004v\144\004\\T7\226g\228\001`>\128\000\001\140\129\243\236\136\016W\225\180\000\b`\224\015h\226\192P\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\127\173\155\214wO\249\157\251\201z\031\241\b\129\231 |\251\"\004\021\248m\000\002\0248\003\2188\176\020\006\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\218@\017aP\223\137\159\144\005\128\250\000\000\0062\007\207\178 A_\134\208\000!\131\128=\163\139\001@hO\233\"\213\141S~g>\192V\003\252\000\000x\200\000\000\000\000\b\000\005\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\160\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\016\000\b\000~\001\176H\000\000\248\017\000 \128\016+,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002\128\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\229 \012\016\128'\023\197\200\001\208\012\128\000\002\b\000\028\164\001\130\016\004\226\248\185\000:\001\144\000\000A\000\003\148\1280B\000\156_\023 \007@2\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\019\001w@\016)T\131\129`\209 -\132DBj\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\000\001\192P@\226\224\128\000\002\000\000\000\000\000\000\000\128D\000\000\002\004\000 \000\000@\000\000\004 \n\0000\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\130\007\023\004\000\000\016\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\128D\016\000\002\020\000 \000\000@\000\001\004 \n\0000\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\001T\000@\192\018\012\004\002D\000\182\001I\000\b\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\00010\023p\001\003\145H8\022\t\018\002\216\005l&\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\0000\002\000\028\\\016\000\000@\000\000\000\000\000\000p\000\007\001A\003\139\130\000\000\b\000\000\000\000\000\000\002\004\128\128\128 P@\128\000\000\b\000\000\000\000\000\000@\144\016\000\004\n\b\016\000\000\001\000\000\000\000\000\000\b\018\002\000\000\129A\000\000\000\000 \000\000\000\000\001\136\128*\128\b\020\"A\192\128H\128\022\194\003 \001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\016@\004\b\000 \160@ \000\n \000\016\000\016\136\002\b\000\129\000\004\016\b\004\000\001D\000\002\000\000\006\000\000I\129\002P\000\128\004\000\000\000\000\000\001\000\000\192\000\t J\000\016\000\128\000\000\000\000\000 \000\024\000\001$\004\t@\000\000\016\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\018@\000\148\000\000\001\000\000\000\000\000\000@\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\t \000@\000\000\000\128\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\132\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\192\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000+\253o\255\179\190\127\223\255\222O\211\255\152\133\0159 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\132\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\192\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\018@\000\128\000\000\001\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\016\000\000\000@\002\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\004\000\b\000\000\000 \001\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\002\017\000E\004\016 \000\131\001\000\128\000-\128B\192\002\000\192\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\128\"\128\b\016\000A\128\128@\000\022\192! \001\000\228\000\015\002\128\007\023\005\000\000\016\004\000\128\000 \004\"\000\138\000(@\137\007\002\001\"\000S\b\129\132\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000r\000\007\001@\003\139\130\128\000\b\002\000@\000\016\000\014\000\016\224( qp@\000\001\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\003\000\000\001E\193\000\000\004\128\000 \000\000\000\007\000\000p\020\0168\184 \000\000\128\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\004\002 \000\000\016 \001\000\000\002\000\000\000!\000P|\251\"\004\021\248m\000\002\0248\003\2188\176\020\006\132\254\146-X\2137\230s\236\005`?\192\000\007\140\128\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Gi\000E\197C~&~@\022\003\232\000\000\024\200\b\237 \b\176\168o\196\207\200\002\192}\000\000\003\025\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000A\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\001\000\003\128\0018\n\000\028\\\016\000\000@\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\128\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000P\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000@\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\128\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\136\003\184\000\129\200$\028\011\004\137\001l\002\178\019X\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200Mh\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\016\007p\001\003\145H8\022\t\018\002\216\005d$\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\012\000\128\007\023\004\000\000\016\000\000\000\000\000\000\028\000\001\192P@\226\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\000\016\000\000\000\001\000\000\000\000\000\000b`.\224\002\007\"\144p,\026$\005\176\n\200M`\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\001\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\003\128\0008\n\b\028\\\016\000\000@\000\000\000\000\000\000\000\000\002\000\000\002\000\000\000\000\000\000\000 \000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\012\000\000\000\000\000 \000\004\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\002\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\024\000\000\n.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\172\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\0001\016\007p\001\003\144H8\022\t\018\002\216\005d&\182\"\000\238\000 r\t\007\002\193\"@[\000\172\132\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\002\139\130\000\000\b\000\000\000\000\000\003\017\000w\000\0169\004\131\129`\145 -\128VBkb \014\224\002\007 \144p,\018$\005\176\n\200I`8\000\003\128\160\001\197\193\000\000\004\000\000\000\000\000\001\136\128;\128\b\028\130A\192\176H\144\022\192+!5\177\016\007p\001\003\144H8\022\t\018\002\216\005d$\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\0000\000\000\020\\\016\000\000@\000\000\000\000\000\024\136\003\184\000\129\200$\028\011\004\137\001l\002\178\019[\017\000w\000\0169\004\131\129`\145 -\128VBKb`.\224\002\007\"\144p,\018$\005\176\n\200M`\024\000\003\000\000\001E\193\000\000\004\000\000\000\000\000\001\137\128\187\128\b\028\138A\192\176H\144\022\192+a5\128`\000\012\000\000\005\023\004\000\000\016\000\000\000\000\000\006&\002\238\000 r)\007\002\193\"@[\000\172\132\214\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012D\005\220\000@\228\018\014\005\130D\128\182\001Y\t\172\003\000\000`\000\000(\184 \000\000\128\000\000\000\000\00010\023p\001\003\145H8\022\t\018\002\216\005l&\176\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196\192]\192\004\014E \224X$H\011`\021\144\154\216\152\011\184\000\129\200\164\028\011\004\137\001l\002\178\019[\019\001w\000\0169\020\131\129`\145 -\128VBkb \014\224\002\007 \144p,\018$\005\176\n\200I`\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\0001\016\007p\001\003\144H8\022\t\018\002\216\005d&\182\"\000\238\000 r\t\007\002\193\"@[\000\172\132\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\002\139\130\000\000\b\000\000\000\000\000\003\017\000w\000\0169\004\131\129`\145 -\128VBkb \014\224\002\007 \144p,\018$\005\176\n\200I`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\136\128;\128\b\028\130A\192\176H\144\022\192+!%\000\000\000\004\000\000\004\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\192\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\128\000\000\000\000\004\000\000\128\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\128\000\000\000\000\000@\000\000@\000\000\000\000\000\000\004\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\016\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000Qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000Qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\016\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000Qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000Qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\003\000\000`\000\000(\184 \000\000\128\000\000\000\000\000\000\224\000\014\002\130\007\023\004\000\000\016\000\000\000\000\000\000\000\000\000\128\000\000\128\000\000\000\000\000\000\b\000\000\000\003\128\0008\n\000\028\\\016\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000 \001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000 \001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\006\000\000\192\000\000Qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\005\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\000\000 \000\000\b\000\000\000\000\128\000p\000\007\001@\003\139\130\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000\000\128\000\000\000\b\004\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\000@\000\000\000\000\b\000\000\002\000\000\000\000 \144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000 \000\000\b\000\000\000\000\130@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\128\000\000 \000\000\000\002\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\004\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0002\000\000\000\000\000\128\000\000\000\004\000\000\000@A\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\025\000\000\000\000\000@\000\000\000\002\000\002\000 \000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\004\000\000d\000\000\000\000\001\000\000\000\000\b\000\000\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002B\000\136\002\128PLp\128\012\000\192\000\0001\128B\000\000 \016\000(\016P\012\000\000\000\016\b\000\000\b@\000\004\000\000\005\002\n\001\128\000\000\002\001\000\000\001\b\000\000\128\000\000\160A\0000\000\000\000@ \000\000\000e \b\016\000%\004\197\200\001\208\012\128\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000e \b\016\000%\004\197\200\001\208\012\128\128\002\b\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\192\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\128\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\148\196#\240\r\150S\023'\199\2003\004\000\201yp\000\000\128\000\000\000\000\000\004\000`\004\000\000\000\000\002\006\000\000\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\192\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\001\002\130\000\000\000\000@\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\b\018\002\000\000\001\001\002\000\000\000 \000\000\000\000\000\001\002@@\000\000 \000\000\000\004\000\000\000\000\000)\253$\024\177\170o\204\239\216\n\192\127\136\000\007\025\005?\164\131\0225M\249\156\251\001X\015\241\000\000\227 \001\128\000\018`@\148\000 \001\000\000\000\000\000\000@\0000\000\002H\b\018\128\004\000 \000\000\000\000\000\b\000\006\000\000I\001\002P\000\000\004\000\000\000\000\000\001\000\000\192\000\t \000J\000\000\000\128\000\000\000\000\000 \000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\001\b\128\"\130\b\016\002A\128\128H\128\022\192 `\001!\016\004P\001\002\000H0\016\t\016\002\216\004\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\001 \192@$@\n`\016\016\000\143\159d@\130\191\r\160\000C\007\000{G\022\002\128\208\159\210E\171\026\166\252\206}\128\172\007\248\000\000\241\144S\250H\177cT\223\153\207\176\021\128\2550\000\0142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\001\001\000\000\128\129\000\000\000\016\000\000\000\002\000\000\129 \000\016\016 \000\000\002\000\000\000\000\000\000\016$\004\000\000\002\002\004\000\000\000@\000\000\000\000\000\002\004\128\128\000\000@@\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\002@@\000\000 \000\000\000\004\000\000\000\000\000\b\237 \b\176\168o\196\207\200\002\192}\000\000\003\025\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c #\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\016\000\000\004\000\000\128\004\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\016\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237 \b\184\168o\196\207\200\002\192}\000\000\003\025\001\029\164\001\022\021\r\248\153\249\000X\015\160\000\000c #\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\020v\152\132~U\183\234c\228\249q>\160\128\025\175\174\002B\016\136\002\128PLp\128\012\000\192\000\0001\128\017\218@\017aP\223\137\143\144\005\128\250\000\001\0062\002;H\002,*\027\2411\242\000\176\031@\000\000\198A\169\189\187\215\249_\171\231\250\255\239\176\246\251o\255\243\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\002\000\004\160\152\185\000:\001\128\000\000A\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000e \b\016\000%\004\197\200\001\208\012\000\128\002\b\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e \b\016\000%\004\197\200\001\208\012\128\000\130\b\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000Q\000\001\148\129 @\000\148\019\023 \007@2\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000D\000\000\000\000\000\000\000\000\000\b\000\001\000\000\003\128\0008\n\000\028\\\016\000\000@\000\000\000\000\000\016\000\001\016\000\000\000\000\004\000\000\000\000 \000\000\000\002\000\000\"\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\202@\016 \000J\t\139\144\003\160\025\000\000\004\016\000\025\b\002\006\000\tA3B\000t\003\000\000\000\130\000\003!\000@\128\001(&h@\014\128`\000\000\016@\000d \b\016\000%\004\197\b\001\208\012\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\128\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\202F\212$\001J\t\154\144\011\160\024\161\003\181U\000\000\b\000\004\000\b\000\000\002\000\000\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000@\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002FR6\161 \nPL\220\128]\000\205\004\029\170\168\000@\000\000\000\000\b\001\138\000\000\000\000\000\000\000\000\b\025HB\004\000\tA1r\000t\003 \000\004\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\132\001\002\000\004\160\152\161\000:\001\128\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\0002\144\004\b\000\018\130b\228\000\232\006@@\001\004\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000\018\130b\132\000\232\006\000\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e \b\024\000%\004\205\200\001\208\012\128\000\002\b\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000A\000\001\148\128 @\000\148\019\023 \007@2\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$e#h\016\000\165\004\205\200\005\208\012\208\001\154\170\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\r\128\000\002\000\000 \000\016\000\001@\006b\138\0002\144\004\b\000\018\130b\228\000\232\006@@\001\004\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000\018\130b\132\000\232\006\000\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\216\000\000 \000\002\000\001\000\000\020\000f(\161\003)\000@\128\001(&.@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000l\000\000\016\000\001\000\000\128\000\n\0003\020P\145\148\141\160@\002\148\0197 \023@3@\006j\170\016:\152\132~\001\178\202b\228\248\249\006`\128\025/,\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000b \n\160\002\006\002\144` \018 \005\176\nH\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\016\000%\004\197\b\001\208\012\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000 \003\000 \000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\002\000\000\000\000\000\016\000\000\000\000\000\0020E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 e \b\016\000%\004\197\200\001\208\012\128\128\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\132\001\002\000\004\160\152\161\000:\001\128\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\0006\000\000\b\000\000\128\000@\000\005\000\025\138(A\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\003)\000@\128\001(&.@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000l\000\000\016\000\001\000\000\128\000\n\0003\020P\128\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000l\000\000\016\000\001\000\000\128\000\n\0003\020P\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\128\000\000\000\000\000\017\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\002@\128\001(&.@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\000\000\000\000\000\128\000\000\000\000\000\025\n\b@\202@\144 \000J\t\139\144\003\160\025\000\001\005\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002 \000\000\000\000\b\000\000\000\000\000\001\016 \132\000\000D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\128\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\016\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\001(&(@\014\128`\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000 \000\136\016B\006R\000\129\000\002PL\\\128\029\000\200\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\016\000D\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\b\000\"\004\016\001\148\128 @\000\148\019\023 \007@0\002\000\b \000\000\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\0008\000\003\128\160\001\197\193\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\128 @\000\148\019\020 \007@0\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\128\002 A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\003)\000@\128\001(&.@\014\128`\004\000\016@\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000p\000\007\001@\003\139\130\000\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\001(&(@\014\128`\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\001\000\004@\130\0002\016\004\b\000\018\130b\132\000\232\006\000\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\202@\016 \000J\t\139\144\003\160\024\001\000\004\016\000\000\000\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200@\016 \000J\t\138\016\003\160\024\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000@\001\016 \128\012\164\001B@\004\160\153\169\000\186\001\136\000#E\024\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000@\000\000\000@\001\128\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\004\000\000\128 \001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\016\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000@\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\000\b\000\000\000\b\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\016\000\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200\000\229 \136\025\130'\004\205\200\001\208\012\128\000\002\b\000\004\t\001\001\000\000\128\129\000\000\000\016\000\000\000\002\000\000\129 \000\016\016 \000\000\002\000\000\000\000\000\000\016$\004\000\000\002\002\004\000\000\000@\000\000\000\000\000\002\004\128\128\000\000@@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\003\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\129 \000\b\020\016\000\000\000\002\000\000\000\000\000\000\016$\132\000\001\002\130\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000@\144\016\000\004\n\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\001\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\004\t\001\000\000@\160\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\136\002\168\000\129@$\028\b\004\136\001l\000\"\000\016\003\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\192\000\t \000J\000\000\000\128\000\000\000\000\000 \000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\000\000\000\224\000\015\002\128\007\023\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\0008\n\000\028\\\016\000\000@\000\000\000\000\000\024\136\002\168\000\129@$\028\b\004\136\001l\000\"\000P\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000b \n\160\002\005\000\144p \018 \005\176\b\136\001LD\001T\000@\160\018\014\004\002D\000\182\001\017\000\b\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000@\000\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\196@\021@\004\n\001 \224@$@\011`\017\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\b\000\000\001\002@@\000\016( \000\000\000\004\000\000\000\000\0001\016\005P\001\002\128H8\016\t\016\002\216\000D\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\001\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\003\017\000U\000\016(D\131\129\000\145\000-\132\006@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\001\000\000@\160\128\000\000\000\016\000\000\000\000\000\196@\021@\004\n\001 \224@$@\011`\001\016\000\128\016$\004\000\001\002\130\000\000\000\000@\000\000\000\000\003\017\000U\000\016(\004\131\129\000\145\000-\128\004@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\128\128@\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\136\128*\128\b\020\"A\192\128H\128\022\194\002 \001\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196@\021@\004\n\017 \224@$@\011a\001\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\017\000U\000\016(\004\131\129\000\145\000-\128\004@\002\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\136\128*\128\b\020\"A\192\128H\128\022\194\002 \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196@\021@\004\n\001 \224@$@\011`\001\016\000\152\000\000\128\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\004\t\001\000\000\000\128\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\136\002\168\000\129B$\028\b\006\136\001l\000&\000\016\018\004\144\128\000\000@@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\001\000\002\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\001\000\000@\160\128\000\000\000\016\000\000\000\000\000\192\000\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\136\128*\128\b\020\"A\192\128h\128\022\194\002`\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\001\000\000\128\000\000\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\004v\144\004XT7\226c\228\001`>\128\000\001\204\128\142\210\004\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\002\000\000\000\000\b\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\001\000\016\000\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200\000$ \b\128(\005\004\199\b\000\192\012\000\000\003\024\006\000\000D\000\000\000\000\000\000\000&\000\b(\t\000\000#\180\128\"\226\161\191\019? \011\001\244 \000\012d\004v\144\004XT7\226g\228\001`>\132\000\001\140\128\142\210\000\139\n\134\252L|\128,\007\208\128\0001\144\000H@\017\016P\n\t\158\016\001\128\024\000\000\0060\000\t\b\002 \n\001A3\194\0000\003\000\000\000\198\000\001!\000D\001@(&8@\006\000`\000\000\024\192\000$ \b\128(\005\004\199\b\000\192\012\000\000\003\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\169\189\187\215\249_\170\231\250\255\239\176\246\251o\255\247\192 \000\000\000\000\005\000\199\000\000\000\000\000\000\000\000\005\029\166!\031\149m\250\152\249>\\O\168 \006k\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020v\144\132XT7\226c\228\001`>\128\000\001\140\130\142\210\016\139\n\134\252L|\128,\007\208\000\0001\144@@\144\016\016\000\b\b\016\000\000\001\000\000\000\000\000\000\b\018\002\000\000\001\001\002\000\000\000 \000\000\000\000\000\001\002@@\000\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\004\000\b\000\000\000\000\000\000\b\000\004\004\t\001\000\000@\160\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\218B\017aP\223\137\143\144\005\128\250\000\000\0062\n;HB,*\027\2411\242\000\176\031@\000\000\198A\003)\b@\128\001(&.@\014\128`\000\000\016@\000\000\000\000\000\000\000\000\b\000\000\000\000@\001\024 \128\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\001\000\000\000\000\004v\144\004XT7\226c\228\001`>\128\000\001\140\128\002B\000\136\002\128PLp\128\012\000\192\000\0001\128\000\000\000\000\000\000\000\000\000\000\002`\000\002\130\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$ \b\128(\005\004\199\b\000\192\012\000\000\003\024\006\166\246\239_\229~\171\159\235\255\190\195\219\237\191\255\223\000\000\000\000\000\000\016\000\020\000\000\000\000\000\000\000\000\004v\144\004XT7\226c\228\001`>\128\000\001\140\128\142\210\000\139\138\134\252L\252\128,\007\208\000\0001\144\017\218@\017aP\223\137\159\144\005\128\250\000\000\0062\002;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\001\148\128 @\000\148\019\023 \007@2\000\000\b \002\000\000\000\000\000@\000\004\000\000\000\000\000\000\136\016@\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0204\000J\t\154\144\003\160\024\000\000\004\016\000\025H\002\132\128\tA3R\000t\003\000\000\000\130\000\003)\000P\144\001(&*@\014\128`\000\000\016@\000@\000\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\148\128 B\000\156\019\023 \007@2\000\000\b \000\000\000\128\000\000\000\000\004\000\000\000\000 \000\140\017@\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\128\000\000\0008\000\003\128\160\001\197\193\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006R\000\129\000\002PL\\\128\029\000\200\000\000 \128\000\000\002\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\234b\017\249\006\207)\139\147\227\228\025\130\000d\188\176\000\000\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\012\000\000\000\000\000 \000\004\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000P\000\000\000\000\000\000\000\000\128\000\000\192\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\128\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\002\000\000\000\000\000\000F\b\161\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\000\004\000\000\004\000\000\000\000\000\000\000@\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025H\002\004\000\tA1r\000t\003 \000\000\130\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\132\001\002\000\004\160\152\161\000:\001\128\000\000A\000\131\148\196#\242\r\158S\023'\199\2003\004\000\201yp\000\000\128\000\000\000\000\004\000\000\000\000\000\000\140\017B\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\128\000\000\0008\000\003\128\160\001\197\193\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\004\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\017\130\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\006\000\000\000\000\000\016\000\002\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000 \000\000\000\000\000\000\002\000\000\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\005(&*@\014\128b\000\002P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000 \000\0000\000\006\000\000\002\139\130\000\000\b\000\000\000\000\000\000\002\000\000\000\000\b\016\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\228v\144\004XT7\226c\228\001`>\128\000\001\140\128\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\128\"\000\160\020\019\028 \003\0000\000\000\012`\026\137K\184>\129\248,\028\011\254\155\to\182\254s<\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001@\001@\000\000\000\000\000\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200\000e \b\024\000%\004\205\200\001\208\012\128\000\002\b\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000A\000\001\148\128 @\000\148\019\023 \007@2\000\000\b \000\000\000\000\000\000\000\000\004\000\000\000\000 \000\136\016@\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\t\b\002\"\n\001A3\194\0000\003\000\000\000\198\000\001!\000D\001@(&x@\006\000`\000\000\024\192\000$ \b\128(\005\004\199\b\000\192\012\000\000\003\024\006\162R\238\015\160~\011\007\002\255\166\194[\237\191\156\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003S{w\175\242\191U\207\245\255\223a\237\246\223\255\231\128\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H@\017\000P\n\t\142\016\001\128\024\000\000\0060\rM\237\222\191\202\253W?\215\255}\135\183\219\127\255\190\001!\000D\001@(&8@\006\000`\000\000\024\19257\183z\255+\245\\\255_\253\246\030\223m\255\254\248\000\000\000\000\000\000\128\000\160\000\000\000\000\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\b\000\000\216\000\000\000\000\000\000\000\000\000\000\000`(\001Gi\011E\133C~&>@\022\003\232\000\004\028\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\132\001\016\005\000\160\152\225\000\024\001\128\000\000c\000\212J]\193\244\015\193`\224_\244\216K}\183\243\153\2242\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\158\003)\000@\128\001(&.@\014\128d\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\166\246\239_\229~\171\159\235\255\190\195\219\237\191\255\207\212J]\193\244\015\193`\224_\244\216K}\183\243\153\224\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\016\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000jon\245\254W\234\185\254\191\251\236=\190\219\255\252\253D\165\220\031@\252\022\014\005\255M\132\183\219\1279\158Gi\000E\133C~&>@\022\003\232\000\000\024\200\000e \b\024\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\019\023 \007@2\000\000\b\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\255n\241\251W\255\185\255\191\255\172\255\188[\255\254\247\207\178 A_\134\208\000!\131\128=\163\139\001@hGi\000E\133C~&>@\022\003\232\000\000\024\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\159\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@5\018\151p}\003\240X8\023\253\022\018\222-\252\230~\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\159\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@5\018\151p}\003\240X8\023\253\022\018\222-\252\230~\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\159\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@5\018\151p}\003\240X8\023\253\022\018\222-\252\230~\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\159\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@5\018\151p}\003\240X8\023\253\022\018\222-\252\230~\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\159\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@5\018\151p}\003\240X8\023\253\022\018\222-\252\230~\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\159\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\001@(&8@\006\000`\000\000\024\1925\018\151p}\003\240X8\023\2536\018\223m\252\230x\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\014R\000\129\b\002pL\220\128\029\000\192\000\000 \128\001\202@\016!\000N\t\139\144\003\160\024\000\000\004\016\b\025LB?\000\217e1r||\1310@\012\151\151\000\000\b\000\000\000\000\000@\000\000\000\000\000\b\193\020\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\164\001B@\004\160\152\169\000:\001\136\000\000A\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\023RE\1610\"T\207\213\128\221\000\237\128\021\226\170A\224\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\b\000\000\000\128#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000 \000\000\000\000\000\000\002\000\000\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\b\000\000\000\128#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\004v\144\004XT7\226c\228\001`>\128\000\001\140\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\b\000#\004P\003\128\0008\n\000\028\\\016\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000 \000\000\002\000\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\004\000\017\002\b\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\003)\000@\128\001(&.@\014\128`\004\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\016\000%\004\197\b\001\208\012\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000 \000\136\016B\006R\000\129\000\002PL\\\128\029\000\200\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\016\000D\b!\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\000\018\130b\164\000\232\006 \000%\005\002\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\128\000\000\0008\000\003\128\160\001\197\193\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\002\000\000\000 \b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\004v\144\004XT7\226c\228\001`>\128\000\001\140\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\002;H\002,*\027\2411\242\000\176\031@\000\000\198@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000H0\016\r\016\002\152\000\004\000$\"\000\138\000 B\t\006\002\193\162\000S\000\128\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000j%.\224\250\007\224\176p/\250,%\188[\249\204\248\000\004\216\031\000X\004\002\000|\000\128\016\000l1\135Gi\011E\133C~&>@\022\003\232\000\004\028\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\155\219\189\127\149\250\190\127\175\254\251\015o\182\255\255<\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@5\018\151p}\003\240X8\023\253\022\018\222-\252\230~\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\016\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000jon\245\254W\234\249\254\191\251\236=\190\219\255\252\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144@\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\169\189\187\215\249_\171\231\250\255\239\176\246\251o\255\243\200\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\240\b\000\000\000\000\001@\001@\000\000\000\000\000\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\222\221\235\252\175\213\243\253\127\247\216{}\183\255\249\228v\144\004XT7\226c\228\001`>\128\000\001\140\128\006R\000\129\128\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA1r\000t\003 \000\000\138\001\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\245\018\151p}\003\240X8\023\253\022\018\222-\252\230y\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003S{w\175\242\191W\207\245\255\223a\237\246\223\255\231\145\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\025H\002\006\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\197\200\001\208\012\128\000\002(\006\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207\212J]\193\244\015\193`\224_\244XKx\183\243\153\228v\144\004XT7\226c\228\001`>\128\000\001\140\130\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rM\237\222\191\202\253_?\215\255}\135\183\219\127\255\158Gi\000E\133C~&>@\022\003\232\000\000\024\200\000e \b\024\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\019\023 \007@2\000\000\b\160\026\137K\184>\129\248,\028\011\254\139\to\022\254s?Q)w\007\208?\005\131\129\127\209a-\226\223\206g\128\000\000\000\000\000\000\000\000\000\000\000\000\002\128\000\000\000\000\000\000\000\000\001\000\001@\000\000\000\000\000\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\222\221\235\252\175\213\243\253\127\247\216{}\183\255\249\228v\144\004XT7\226c\228\001`>\128\000\001\140\128\006R\000\129\128\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA1r\000t\003 \000\000\138\001\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\245\018\151p}\003\240X8\023\253\022\018\222-\252\230y\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003S{w\175\242\191W\207\245\255\223a\237\246\223\255\231\145\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\025H\002\006\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\197\200\001\208\012\128\000\002(\006\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207\212J]\193\244\015\193`\224_\244XKx\183\243\153\228v\144\004XT7\226c\228\001`>\128\000\001\140\130\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rM\237\222\191\202\253_?\215\255}\135\183\219\127\255\158Gi\000E\133C~&>@\022\003\232\000\000\024\200\000e \b\024\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\019\023 \007@2\000\000\b\160\026\137K\184>\129\248,\028\011\254\139\to\022\254s?Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234on\245\254W\234\249\254\191\251\236=\190\219\255\252\242;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s?S{w\175\242\191U\207\245\255\223a\237\246\223\255\239\234on\245\254W\234\185\254\191\251\172=\188[\255\252\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200 \000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\004\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000@\000P\000\000\000\000\000\000\000\000\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\004\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004v\144\004XT7\226c\228\001`>\128\000\001\140\130\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002;H\002,*\027\2411\242\000\176\031@\000\000\198@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237 \b\176\168o\196\199\200\002\192}\000@\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\228v\144\004XT7\226c\228\001`>\128\000\001\140\128\006R\000\129\128\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA1r\000t\003 \000\000\138\001\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\245\018\151p}\003\240X8\023\253\022\018\222-\252\230~\162R\238\015\160~\011\007\002\255\162\194[\197\191\156\207#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\rD\165\220\031@\252\022\014\005\255E\132\183\139\1279\159\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\224\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\016\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\001@(&8@\006\000`\000\000\024\1925\018\151p}\003\240X8\023\2536\018\223m\252\230x\012\164\001\003\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130b\228\000\232\006@\000\001\020\003Q)w\007\208?\005\131\129\127\209a-\226\223\206g\234%.\224\250\007\224\176p/\250,%\188[\249\204\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\002\000\b\129\004\b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\004v\144\004XT7\226c\228\001`>\128\000\001\140\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202@\016 \000J\t\139\144\003\160\024\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 $!\b\128(\005\004\199\b\000\192\012\000\000\003\024\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\210\000\139\n\134\252L|\128,\007\208\000\b1\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@$\000\002\000\000\000\000\000\000\000\000\000\016\000\001\128 \001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \001\148\128 `\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\\\128\029\000\200\000\000\"\128\b\000\000\128\000\000\000\000\000\000\000\000 \000\003\001@\001\000\004\016\031\000X\004\002\000|\000\132\016\000l1\134\007)\000@\132\0018&n@\014\128d\000\000\016@\004\000\000@\000\000\000\000\000\000\000\000\016\000\000\128\128 \028\164\001\002\016\004\224\153\185\000:\001\144\000\000A\000\003\148\128 B\000\156\019\023 \007@2\000\000\b \0002\144\004\b\000\018\130b\228\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\000\128\000@\000\000\000\017\002\b\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\025H\002\006\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\197\200\001\208\012\128\000\002(\000\128\000\b\000\000\000\000\000\000\000\000\002\000\0000\020\004\016\000A\001\240\005\128@ \007\192\bA\000\006\195\024\2242\144\004\b\000\018\130b\228\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\000\128\000@\000\000\000\017\002\b\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\025H\002\006\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\197\200\001\208\012\128\000\002(\000\128\000\b\000\000\000\000\000\000\000\000\002\000\0000\020\004\016\000A\001\240\005\128@ \007\192\bA\000\006\195\024\2242\144\004\b\000\018\130b\228\000\232\006@\000\001\004\000\000\000\000\000\000\000\000\000\128\000@\000\000\000\017\002\b\017\218@\017aP\223\137\143\144\005\128\250\000\000\0062\000\025H\002\006\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\197\200\001\208\012\128\000\002(\000\128\000\b\000\000\000\000\000\000\000\000\002\000\0000\020\004\016\000A\001\240\005\128@ \007\192\bA\000\006\195\024\224\000\000\000\000\000\000\000\004\000\002\000\000 \000\136\016@\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\202@\0160\000J\t\155\144\003\160\025\000\000\004P\000\025H\002\004\000\tA3r\000t\003 \000\000\138\000\003)\000@\128\001(&.@\014\128d\000\000\017@\004\000\000@\000\000\000\000\000\000\000\000\016\000\001\128\160 \128\002\b\015\128,\002\001\000>\000B\b\0006\024\199#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\000\000\128\000\000\000\000\000\000\000\000\000\000\000\128@\b\000Gi\000E\133C~&>@\022\003\232\000\000\024\200\000e \b\024\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\019\023 \007@2\000\000\b\160\002\000\000 \000\000\000\000\000\000\000\000\b\000\000\192P\016@\001\004\007\192\022\001\000\128\031\000!\004\000\027\012c\128\004 \000\248\002\192 \016\003\224\004\000\132\002`\1402;H\002,*\027\2411\242\000\176\031@\000\000\198@\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\016\000\001\000\000\000\000\000\000\000\000\000@\000\006\002\128\130\000\b >\000\176\b\004\000\248\001\b \000\216c\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\144\003\224\011\000\128@\015\128\016\130\000\r\1300\196\000\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\014d\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\t\000\000\128\000\000\000\000\000\000\000\000\004\000\000@(\000 \000\000\000\000\000\000\000\000\000\000\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000$\000\248\002\192 \016\003\224\004 \128\002a\1401\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237 H\176\168o\196\199\200\002\192}\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\148\128 `\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\\\128\029\000\200\000\000\"\128H\000\004\128\000\000\000\000\000\000\000\000 \000\002\000@\001\000\000\016\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\t >\000\176\b\004\000\248\001\b \000\152#\012@\000\004\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\128\"\000\160\020\019\028 \003\0000\000\000\012`\b\000\000\000\000\000\000\000\000\000\000\152\000\000\160\000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\136\000\000\000\000\000\000\000\000\000\016\000\018\000\001\000\000\017\000\000\000\000\000\000\000\000\000\002\000\000\000\000 \000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\t\128\000\n\000\000\000\000 \000\000\000\000\005\000\199\000\000\000\000\000\000\000\000\006\000\000D\000\000\000\000\000\000\000&\000\b(\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\137K\184>\129\248,\028\011\254\155\to\182\254s<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\b\000\000\136\000\000\000\000\000\000\000\001\000\000\000@\b\001\000\000\145\003\224\011\000\128@\015\1280\002\000\t\1300\224\000\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000\004\000\000\000\000\000\000 \000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\144\000\t\000\000\000\000\000\000\000\000\000@\000\004\000\128\002\000\000 \000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\018@|\001`\016\b\001\240\002\016@\0010F\024\128\000\b\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\004\012\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\220\128\029\000\200\000\000\"\128\000\202@\016 \000J\t\139\144\003\160\025\000\000\004P\t\000\000\128\000\000\000\000\000\000\000\000\004\000\000@(\000 \000\000\000\000\000\000\000\000\000\000\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000$\000\248\002\192 \016\003\224\004 \128\002a\1401\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\001\000\000\000\128\129\000\000\000\016\000\000\000\000\000\000\129 \000\000\016\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\002\000\004\000\002\000\000\000\000\000\000\000\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\002\000\000\000\002\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\b\000\001\000\000\000\129 \000\000\016\016\000\000\000\002\000\000\000\000\000\016\136\002(\000\129\002$\028\b\006\136\001L\000\002\000\018\002\004\128\128\000 P@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\002\000\000\000\000\016\000\000\000\000\001\002@@\000\000 \000\000\000\004\000\000\000\000\000!\016\004P\001\002\004H8\016\r\016\002\152\000\004\000 \000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\004\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\002\000\001\000\003\000\000\000\001\000\000\000\000\000\001 \000\000\000\000 \000`\000\000\000 \000\000\000\000\000$\000\000\000\000\004\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\002\000\001\000\000\000\000\002\000\000\003\000\000`\000\000(\184(\000\000\136\000\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\016\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\002 \000\000\000\000\b\000\000\002\000\000\000\000\004\128\000\000D\000\000\000\000\001\000\000\000\000\000\000\000\000\128\128\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\001g\000\016(\020\131\129\000\209\000)\128@B\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128 \001\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\004\000\000\001\000\000\000\000\002@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\000@\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\132\192Q@\004\n\005 \224@4@\n`\016\016\144\144\136\n(\000\129@$\028\b\006\136\001L\002\002\016\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\024\000\000\n.\b\000\000\"\000\000\000\000\000\000\024\000\003\000\000\001E\193\000\000\004\000\000\000\000\000\001\t\128\162\128\b\020\nA\192\128h\128\020\192 !!!\016\020P\001\002\128H8\016\r\016\002\152\004\004 $&\002\138\000 P)\007\002\001\162\000S\000\128\132\132\132@Q@\004\n\001 \224@4@\n`\016\016\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\019\001E\000\016 \020\131\129\000\209\000)\128@BBB (\160\002\005\000\144p \026 \0050\b\b@@\024\000\003\000\000\001E\193@\000\004@\000\000\000\000\000\007\000\000p\020\0168\184 \000\000\128\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\004\002 \000\000\016 \001\000\000\002\000\000\000!\000P\001\128\000\000\000\000\004\000\000\128\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\002\019\001w@\016)T\131\129`\209 -\132TBj\000\000\000\b\000\000\b\000\000\000\000\000\000\000\128\000\000\000\024\000\003\000\000\001E\193@\000\004@\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\005\023\004\000\000\016\000\000\000\000\000\004&\000\138\000 @)\007\002\001\162\000S\000\128\132\004\132\192Q@\004\n\005 \224@4@\n`\016\016\144\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\006\000\000\192\000\000Qp@\000\001\000\000\000\000\000\000B`\b\160\002\004\002\144p \026 \0050\b\b@HL\005\020\000@\160R\014\004\003D\000\166\001\001\t\b\000\000\000\000\000\000\000\000@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014R\b\129\b\002pL\220\128\029\000\192\000\000 \128\001\202A\016!\000N\t\139\144\003\160\024\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007)\000@\132\0018&.@\014\128`\000\000\016@!\016\004P\001\002\000H0\016\r\016\002\152\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\148\128 `\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\\\128\029\000\200\000\000\"\128j%.\224\250\007\224\176p/\250,%\188[\249\204\253D\165\220\031@\252\022\014\005\255E\132\183\139\1279\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e \b\024\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\019\023 \007@2\000\000\b\160\018\000\001\000\000\000\000\000\000\000\000\000\b\000\000\192\016\000@\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000H\001\240\005\128@ \007\192\bA\000\006\193\024b\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\b\018\002\002\000\001\001\002\000\000\000 \000\000\000\000\000\001\002@@\000\000 @\000\000\004\000\000\000\000\000\000 H\b\000\000\004\004\000\000\000\000\128\000\000\000\000\000\000\000 \000\000\000\128\001\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\016$\004\000\001\002\130\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\128\001(&.@\014\128d\000\000\017@5\018\151p}\003\240X8\023\253\022\018\222-\252\230x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\148\128 `\000\148\0197 \007@2\000\000\b\160\0002\144\004\b\000\018\130f\228\000\232\006@\000\001\020\000\006R\000\129\000\002PL\\\128\029\000\200\000\000\"\128@\000\002\000\000\000\000\000\000\000\000\000\000\000\002\144@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 H\b\000\002\005\004\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002\004\128\128\000 P@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000 \000\002\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 H\b\000\002\005\004\000\000\000\000\128\000\000\000\000\002\000\000 \000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\b\128>\000\176\b\004\000\248\001\000 \000\188#\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\b\018\002\000\000\129A\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\129 \000\b\020\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\b\000\000\128\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\018\002\000\000\129A\000\000\000\000 \000\000\000\000\000\128\000\b\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\138\000 @\137\007\002\001\"\000S\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\000\002\002\004\000\000\000@\000\000\000\000\000\002\004\128\128\000\000@@\000\000\000\b\000\000\000\000\000B \b\160\002\004\b\144p \018 \0050\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\000@\000\000\000\000\000\000\000\000\000 \000\000\b\000\001\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \001\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\016\136\002(\000\129\000$\024\b\004\136\001l\000\002\000\000\002\004\128\128\000 P@\000\000\000\b\000\000\000\000\000b \b\160\002\005\000\144p \018 \0050\000\b\000\bD\001\020\000@\128\018\012\004\002D\000\166\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\012\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000 \000\004\000\002\017\000E\000\016 \004\131\001\000\145\000)\128\000@\002B \b\160\002\004\000\144@ \018 \0050\000\b\000@\024\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000@\000\b\000\004\"\000\138\000 @\t\006\002\001\"\000S\000\000\128\004\132@\017@\004\b\001 \128@$@\n`\000\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\128\000\016\000\bD\001\020\000@\128\018\012\004\002D\000\166\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031>\200\129\005~\027@\000\134\014\000\246\142,\005\001\161?\164\139V5M\249\156\251\001X\015\240\000\001\227 \001\148\128 @\000\148\019\023 \007@2\000\000\b \002\000\000 \000\000\000\000\004\000\000\000\000\000\000\136\016@\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\207\178 A_\134\208\000!\131\128=\163\139\001@hO\233\"\213\141S~g>\192V\003\252\000\000x\200\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\128\000\000\000\000\004\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\128\128\128 P@\128\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003\128\0008\n\000\028\\\016\000\000@\000\000\000\000\000\000\000\000\002\000\000\002\000\000\000\000\000\000\000 \000\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000B \b\160\002\004 \144p,\018 \005\176\b\b\b\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016$P\001\002\000H0\016\t\016\002\152\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\001 \192@$@\n`\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016!\004\131\129`\145\000-\128@@@\000H\000\000\016\000\b\000\024\000\000\000\b\000\000\000\000\000\t\000\000\000\000\001\000\003\000\000\000\001\000\000\000\000\000\001 \000\000\000\000 \000 \000\000\000 \000\000\000\000!\016\004P\001B\000H8\016\t\016\002\216\000\012\000\000\004\128\000\000\000\000\128\000\128\000\000\000\128\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000@\000\016\136\002(\000\129\000$\028\b\004\136\001L \002\016\000\002\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\bD\001\020\000@\128\018\014\004\002D\000\166\000\001\000\001\b\128\"\128\b\016\002A\128\128H\128\020\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\138\000 @\t\007\002\001\"\000S\000\000\128\000\132@\017@\004\b\001 \192@$@\n`\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\000E\2248 q\242A\000\129\000(\000\000@\000B \b\160\002\004\000\016@ \016\000\0050\000\b\000\000\b\000\000\002\000\000\000\002\000\000\000\000\000\000\000\004\000\001\000\000\000@\000\000\000@\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\016 \192@ \000\na\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\129\002\012\004\002\000\000\166\016\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000p\000\128\b\000\000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000 \001\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \000\131\001\000\128\000-\128\002@\000\000@\144\016\000\004\n\b\000\000\000\001\000\000\000\000\000\012D\001\020\000@\160\002\014\004\002\000\000\166\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\012\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\160\000\016\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B \b\160\002\004\b\016` \016\000\0050\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\t\001\000\000@\160\128\000\000\000\016\000\000\000\000\000\196@\017@\004\n\000 \224@ \000\n`\000\016\000\144\136\002(\000\129\000\004\016\b\004\000\001L\000\002\000\016\006\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\002@@\000\016( \000\000\000\004\000\000\000\000\0001\016\004P\001\002\128\b8\016\b\000\002\152\000\004\000$\"\000\138\000 @\001\004\002\001\000\000S\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\004\000\000\128\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\128\"\128\b\016\000A\128\128@\000\020\194\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\001\000\000@\160\128\000\000\000\016\000\000\000\000\000\196@\017@\004\n\000 \224@ \000\n`\000\016\000\016\136\002(\000\129\000\004\024\b\004\000\001L\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\128\000\016\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\b\000\004\000\012\000\000\000\004\000\000\000\000\000\004\128\000\000\000\000\128\001\128\000\000\000\128\000\000\000\000\000\144\000\000\000\000\016\000\016\000\000\000\016\000\000\000\000\016\136\002(\000\161\000\004\028\b\004\000\001L\000\006\000\000!\000\000\000\128\000\016\000\192\000\000\000\000\000\000\000\000\004\000\000\000\016\000\002\000\024\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000@\003\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\001\000\000\018@\000\128\000\000\001\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001$\000\b\000\000\000\016\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000 \000\128\005\016\016\000\000\000\000\000\000\000\000\016\128\000\b\000\000\n\004\020\001\000\000\000\004\002\000\000\002\016\000\001\000\000\001@\130\000 \000\000\000\128@\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\016\000\000\016\b \002\000\000\000\b\004\000\000\000@\000\000\000\000\128 \001\000\000\000\000\000\000\000\000\000\b\000\000\000\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\132\000\000@\000\000@ \224\b\000\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\016\000\128\000\000\000\000\000\000\000\000\004\000\000\002\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000B\000\000 \000\000 \016`\004\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\001\000\n `\000\000\000\000\000\000\000\000\000 \000\b\000 \001D\004\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000 \000\000\000\000\000\000\000@\000\016\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\b\000\002\000\b\000Q\001\000\000\000\000\000\000\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\001\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000p\000\007\001@\003\139\130\000\000\b\000\000\000\000\000\000\000\000\004\000\000\000\000\000\128\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\005P\001\002\016H8\018\t\016\002\216\004\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\002\000\000\128\002\000\020@@\000\000\000\000\000\000\000\000B \n\160\002\004 \144p$\018 \005\176\b\b\000H@\000\004\000\000\004\002\014\000\128\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\007\023\012\000\000\016\000\000\000\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\001\000\000\000\000\000p\000\007\001@\003\139\130\000\000\b\000\000\000\000\000\002\016\000\001\000\000\001\000\131\128`\000\000\000\128@\000\000B\000\000 \000\000 \016`\004\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000@\000\000@ \192\b\000\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000 \000\000 \016@\004\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\128\"\128\b\016\002A\192\128H\128\020\192\000 \001!\016\004P\001\002\000H \016\t\016\002\152\000\004\000 @\000\000\000\000\000 \001\128\000\000\000\000\000\000\000\000\b\000\000\000\000\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\002\000\b\000Q\001\000\000\000\000\000\000\000\000\001\b\128\"\128\b\016\002A\192\128H\128\020\192\000 \001!\016\004P\001\002\000H \016\t\016\002\152\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\128\006\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000`\000\014\002 \005W\004\000\000\016\000\000\000\000\000\004&\002\170\000 P!\007\002\001\"\000[\000\001\128\004\001\128\0000\000\000\020\\\016\000\000@\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\006\000\000\224\"\000Up@\000\001\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000P\000\000\000\016\000\000\000\000\002\000\000\000\000\000\000@\b\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000`\000\014\002 \005W\004\000\000\016\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\016\002\171\130\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\004\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\bL\005T\000@\160B\014\004\002D\000\182\000\001\000\t\t\128\170\128\b\020\bA\192\128@\128\022\192\000 \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\170\000 @\001\007\002\001\000\000[\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \000\131\001\000\128\000)\128\000@\002B \b\160\002\004\000\016@ \016\000\0050\000\b\000@\128\000\000\000\000\000@\003\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0000\000\007\001\016\002\171\130\000\000\b\000\000\000\000\000\002\017\000E\000\016 \000\131\001\000\128\000)\128\000@\002B \b\160\002\004\000\016@ \016\000\0050\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\138\000 @\001\004\002\001\000\000S\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\000 \192@ \000\n`\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\128\128\128 P@\128\000\000\b\000\000\000\000\000\000@\144\016\000\004\n\b\016\000\000\001\000\000\000\000\000\000\b\018\002\000\000\129A\000\000\000\000 \000\000\000\000\001\136\128\"\128\b\020\000A\192\128@\000\020\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\138\000 @\001\004\002\001\000\000S\000\000\128\004\001\000\000\018@\000\148\000 \001\000\000\000\000\000\000@\000 \000\002H\000\018\128\000\000 \000\000\000\000\000\b\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000B \b\160\002\004\000\144` \018 \005\176\b\024\000HD\001\020\000@\128\018\012\004\002D\000\182\001\001\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000H0\016\t\016\002\152\004\004\000$\"\000\138\000 @\t\004\002\001\"\000S\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B \b\160\002\004\000\016@ \016\000\0050\000\b\000@\016\000\001$\000\t@\002\000\016\000\000\000\000\000\004\000\002\000\000$\128\001(\000\000\002\000\000\000\000\000\000\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000r\000\007\129@\003\139\130\128\000\b\002\000@\000\016\000\014\000\004\224(\000qp@\000\001\000\000\000\000\002\128\000\000\000\000\000\b\002\000\000\000\000\002\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\128\138\000 @\137\006\130\001\"\000\211\000\128\128\004\132@\017@\005\b\001 \224@$@\n`\0160\128\144\136\002(\000\129\000$\028\b\004\136\001L\002\002\016\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B \b\160\002\004\000\144` \018 \0050\b\b@@\t\000\000\000\000\001\000\001\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\138\000 @\001\006\002\001\000\000S\000\128\128\004\132@\017@\004\b\000 \128@ \000\n`\000\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\018\014\004\002D\000\182\001\001\000\b\001 \000\b\000\000 \000(\000\000\000 \004\000\001\000\000$\000\000\000\000\004\000\005\000\000\000\004\000\128\000 \000\000\000\000\000\000\128 \000\000\000\000 \000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000P\128\018\014\004\002D\000\166\001\003\b\t\b\128\"\128\b\016\002A\192\128H\128\020\192 !\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128 \000\000\000\000 \000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\132\000\000\002\000\000@\003\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\b\000`\000\000\000\000\000\000\000\000\002\000\000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\000\018\130b\164\000\232\006 \000\005\004\002\014S\016\143\2006yL\\\159\031 \204\016\003%\229\128@\000\016\000@\n\136\b\000\000\000@\000\000\000\000\b@\000\004\000\000\005\002\n\001\128\000\000\002\001\000\000\001\b\000\000\128\000\000\160A\0000\000\000\000@ \000\000!\000\000\016\000\000\016\b \006\000\000\000\b\004\000\000\000@\000\000\000\000\128 \001\000\000\000\000\000\000\000\002\000\000\000\000\000\000\016\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\018\000\000Gi\000E\133C~&>@\022\003\232\000\000\024\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\001\000\000\001\000\131\000`\000\000\000\128@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\001\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\b@\000\004\000\000\004\002\014\001\128\000\000\002\001\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000H\000\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000@\002\000\000\000\000\000\000\000\004\000\000\000\000\b\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\000\018\130b\164\000\232\006 \000\005\004\000\015\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000@\000\000\000\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\128\000\000\128A\1280\000\000\000@ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000 \000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\224\000\014\002\128\007\023\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\000\018\130b\164\000\232\006 \000\005\004\000\015\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000@\000\000\000\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Gi\000E\133C~&~@\022\003\232\000\000\024\200\b\237 \b\176\168o\196\199\200\002\192}\000\000\003\025\004 \000\002\000\000\002\001\006\000\192\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000\016\002\162\006\000\000\000\016\000\000\000\b\000\002\000\000\128\002\000T@\192\000\000\002\000\000\000\000\000\000@\000\016\000@\n\136\b\000\000\000@\000\000\000\000\000\b\000\002\000\b\001Q\001\000\000\000\b\000\000\000\000\000\007)\004@\204\0018&n@\014\128`\000\000\016@\031>\200\129\005~\027@\000\134\014\000\246\142,\005\001\160\028\164\017\002\016\004\224\153\185\000:\001\128\000\000A\000\003\148\130 B\000\156\019\023 \007@0\000\000\b \000r\144\004\b@\019\130b\228\000\232\006\000\000\001\004\000\000\000\000\000\000\000\000\001\000\000@\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\002\000\000\000\000\000\000\000\004\000\001\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\128\000 \000\128\021\016\016\000\000\000\128\000\000\000\000\000p\000\007\001@\003\139\130\000\000\b\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\001(&j@\014\128`\000\000\016@\000e \n\018\000%\004\197H\001\208\012\000\000\002\b\000\012\164\001B@\020\160\152\169\000:\001\128\000\000A\000\000\128\000 \000\128\021\016\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\016\002\000\000\128\002\000T@@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bMIV\160\202\133S?\215\130t\003\166\001\003\198)\t\169*\212\025P\170g\250\240N\128t\192 x\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\170\000 B\t\007\002\193\"\000S\000\129\128\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000U\000\016!\004\131\129`\145\000)\128@\192\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\128*\128\b\016\130A\192\176H\128\020\192 `\005\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\128\000 \000\128\021\016\016\000\000\000\128\000\000\000\000\016\136\002\168\000\129\b$\028\011\004\136\001L\002\006\000P\014R\b\129\b\002pL\\\128\029\000\192\000\000 \128\001\202@\016!\000N\t\139\144\003\160\024\000\000\004\016\000\000\000\000\000\000\000\000\004\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\b\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\016\002\171\130\000\000\b\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\128\000\000\128A\1920\000\000\000@ \000\004\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000@\000\000@ \192\024\000\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\128\002\000T@@\000\000\002\000\000\000\000\000B\000\000 \000\000 \016p\012\000\000\000\016\b\000\001\b@\000\004\000\000\004\002\012\001\128\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\014\002\128\007\023\012\000\000\016\000\000\000\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\132\000\000@\000\000@ \192\024\000\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\128\000\000\128A\1280\000\000\000@ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000@\000\000@ \128\024\000\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \004\131\129\000\145\000)\128\000@\002\000\192\000\028\004@\n\174\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000@\001\000* \000\000\001\000\000\000\000\000!\016\004P\001\002\000H8\016\t\016\002\152\000\004\000 \012\164\001B@\004\160\152\169\000:\001\136\000\001A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\136\002(\000\129\000$\024\b\004\136\001L\000\002\000\018\017\000E\000\016 \004\130\001\000\145\000)\128\000@\002\004\000\000\000\000\000\002\000\024\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\012\164\001B@\004\160\152\169\000:\001\136\000\001A\000\132@\017@\004\b\001 \192@$@\n`\000\016\000\144\136\002(\000\129\000$\016\b\004\136\001L\000\002\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\128\"\128\b\016\002A\000\128@\000\020\192\000 \000\000\229 \136\024\128'\004\205\200\001\208\012\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\128\"\128\b\016\002A\000\128H\128\020\192\000 \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\"\000\138\000 @\t\006\002\001\"\000S\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\004\000\002\002\004\000\000\000@\000\000\000\000\000\002\004\128\128\000\000@@\128\000\000\b\000\000\000\000\000\000@\144\016\000\000\b\b\000\000\000\001\000\000\000\000\000\bD\001\020\000@\129\018\014\004\002D\000\166\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000H \016\t\016\002\152\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B \b\160\002\004\000\144` \016\000\0050\000\b\000\bD\001\020\000@\128\018\b\004\002\000\000\166\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132@\017@\004\b\001 \128@4@\n`\000\016\000\128\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\128\"\128\b\016\002A\128\128@\000\020\192\000 \000!\016\004P\001\002\000H \016\b\000\002\152\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000 \000 \000\000\000 \000\000\001\000\000$\000\000\000\000\004\000\004\000\000\000\004\000\000\000 \000\004\128\000\000\000\000\128\000\128\000\000\000\128\000\000\000\000\132@\017@\005\b\001 \224@$@\011`\0000\128\000\018\000\000\000\000\002\000\002\000\000\000\002\000\000\000\000\002\017\000E\000\016 \004\131\129\000\145\000)\128\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\018\012\004\002D\000\166\000\001\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000P\128\018\014\004\002D\000\182\000\003\b\000\001 \000\000\000\000 \000 \000\000\000 \000\000\000\000!\016\004P\001\002\000H8\016\t\016\002\152\000\004 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\016\136\002( \129\000$\024\b\004\136\001l\002\006\000\018\017\000E\000\016 \004\131\001\000\145\000-\128@@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\018\012\004\002D\000\166\001\001\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000 \000\000\128\000\128\000\000\000\128\000\000\004\000\000\144\000\000\000\000\016\000\016\000\000\000\016\000\000\000\128\016\136\002(\000\129\000$\024\b\004\136\001L\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\016\005P\001\002\132H8\016\t\016\002\216\000D\000&\000\000 \000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006B\000\129\000\002PLP\128\029\000\192\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\027\000\000\004\000\000@\000 \000\002\128\012\197\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\012\164\001\002\000\004\160\152\185\000:\001\144\016\000A\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\132\001\002\000\004\160\152\161\000:\001\128\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\0006\000\000\b\000\000\128\000@\000\005\000\025\138(\000\000\002\000\000\000\000\000\016\000\000\000\000\000\0020A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000p\020\0008\184 \000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000@\000\000@ \128\024\000\000\000 \016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\b\002 \n\001A1\194\0000\003\000\000\000\198\001\168\148\187\131\232\031\130\193\192\191\233\176\150\251o\2313\192e \b\024\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\153\185\000:\001\144\000\000E\000\001\148\128 @\000\148\019\023 \007@2\000\000\b\160\026\137K\184>\129\248,\028\011\254\139\to\022\254s?Q)w\007\208?\005\131\129\127\209a-\226\223\206g\128\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002;H\002,*\027\2411\242\000\176\031@\000\000\198@\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H@\017\000P\n\t\142\016\001\128\024\000\000\0060\rD\165\220\031@\252\022\014\005\255M\132\183\219\1279\158\003)\000@\192\001(&n@\014\128d\000\000\017@\000e \b\016\000%\004\205\200\001\208\012\128\000\002(\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000E\000\212J]\193\244\015\193`\224_\244XKx\183\243\153\250\137K\184>\129\248,\028\011\254\139\to\022\254s=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\202@\016 \000J\t\139\144\003\160\025\000\000\004P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\168\148\187\131\232\031\130\193\192\191\232\176\150\241o\2313\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000\000\000\000\128\000\000\000\137\000\000\000\004\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000\000\000\004\000\000\000\000\000\016\000\000\004\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\128\000\000\000\000\000\003\000\000`\000\000(\184`\000\000\144\000\004\000\000\000\000`\000\012\000\000\005\023\004\000\000\018\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000\000\000\000\128\000\000\000\t\000\000\000\000\000\000\006\000\000\192\000\000Qp@\000\001 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\000\000\000\000\000\b\000\000\000\003\128\0008\n\000\028\\\016\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000 \001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000@\016\000\000\000\000\016\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\016\004P\001\002\000H8\016\t\016\002\152\004\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000r\000\007\129@\003\139\130\128\000\b\002\000@\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B \b\160\002\004\000\016` \016\000\0050\b\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\001\000\000\004\000\004\000\000\000\004\000\000\000 \000\004\128\000\000\000\000\128\000\128\000\000\000\128\000\000\004\000\132@\017@\004\b\000 \192@ \000\n`\000\016\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000!\016\004PA\002\000\b0\016\b\000\002\216\004,\000$\"\000\138\000 @\001\006\002\001\000\000[\000\132\128\004\003\144\000<\n\000\028\\\020\000\000@\016\002\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000E\000\016 \000\131\001\000\128\000)\128@@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000 \000 \000\000\000 \000\000\001\000\000$\000\000\000\000\004\000\004\000\000\000\004\000\000\000 \004\"\000\138\000 @\001\006\002\001\000\000S\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\004\000\000\000\000\000\000\000@\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\001\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\005\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\005\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\001\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\005\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\192\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\014\000\000\224(\000qp@\000\001\000\000\000\000\000\000b \014\224\002\007 \144p,\018$\005\176\n\200MlD\001\220\000@\228\018\014\005\130D\128\182\001Y\t,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\012\000\000\005\023\004\000\000\016\000\000\000\000\000\006\"\000\238\000 r\t\007\002\193\"@[\000\172\132\214\196@\029\192\004\014A \224X$H\011`\021\144\146\1920\000\006\000\000\002\139\130\000\000\b\000\000\000\000\000\000\014\000\000\224( qp@\000\001\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\128\000\000\0008\000\003\128\160\001\197\193\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\002\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\024\000\000\n.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\024\000\000\n.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\002\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\024\000\000\n.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\028\000\001\192P\000\226\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\024\000\000\n.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128 \016\000\000\000\129\000\000\000\000\016\000\000\000\000\002\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\b\000p\000\007\001@\003\139\130\000\000\b\000\000\000\000\000\003\017\000w\000\0169\004\131\129`\145 -\128VBkb \014\224\002\007 \144p,\018$\005\176\n\200I`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000(\184 \000\000\128\000\000\000\000\0001\016\007p\001\003\144H8\022\t\018\002\216\005d&\182\"\000\238\000 r\t\007\002\193\"@[\000\172\132\150\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000p\000\007\001@\003\139\130\000\000\b\000\000\000\000\000\003\017\000w\000\0169\004\131\129`\145 -\128VBkb \014\224\002\007 \144p,\018$\005\176\n\200I`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000(\184 \000\000\128\000\000\000\000\0001\016\007p\001\003\144H8\022\t\018\002\216\005d&\182\"\000\238\000 r\t\007\002\193\"@[\000\172\132\150\000\128@\000\000\002\004\000\000\000\000@\000\000\000\000\b\0000\000\006\000\000\002\139\130\000\000\b\000\000\000\000\000\003\017\001w\000\0169\004\131\129`\145 -\128VBk\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018X\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\012D\001\220\000@\228\018\014\005\130D\128\182\001Y\t\173\136\128;\128\b\028\130A\192\176H\144\022\192+!%\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\000\162\224\128\000\002\000\000\000\000\000\000\196@\029\192\004\014A \224X$H\011`\021\144\154\216\136\003\184\000\129\200$\028\011\004\137\001l\002\178\018[\017\000U\000\0160\004\131\129\000\145\000-\128R@\002\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\136\128*\128\b\024\002A\192\128H\128\022\192) \001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\016\b\130\000\000B\128\004\000\000\b\000\000 \132\001B\017\000E\000\016 \004\131\001\000\145\000)\128\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bD\001\020\000@\128\018\012\004\002D\000\166\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\180\128\"\194\161\191\019\031 \011\001\244\000\000\012d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\142\210\000\139\n\134\252L|\128,\007\208\000\0001\144@\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\002\b\000\129\000\004\016\b\004\000\001H\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000(\000 \000\000\000 \000\000\000\000 \000\017\000\252\003`\144\000\001\240\"\000A\0000VX\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\128\000\000\000\b\000\000\000\000\001@\000\000\000\000\000\000\000\000\000\001\000\000\128\007\224\027\004\128\000\015\129\016\002\b\001\130\178\192\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000\128\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\192\000\028\005\000\014.\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\164\001\022\021\r\248\152\249\000X\015\160\000\000c \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\144\016\000\000\b\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000@\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\001\000\000@\160\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\004\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\164\001\002\000\004\160\152\185\000:\001\144\000\000A\000\000\000\000\000\000\000\000\000 \000\000\000\000@\004@\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\128\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\004\254\146\012X\2137\230s\236\005\232?\200\000\003\140\128\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\002hH \002\004\n\144@0\018 \r \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\002\b\000\129\000$\016\b\004\136\001H \002\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\002hH \002\004\n\144@0\018 \r \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\002\b\000\129\000$\016\b\004\136\001H \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\004\016\001\002\000H \016\b\000\002\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000O\233 \197\141S~g>\192^\131\252\128\0008\200\t\253$\024\177\170o\204\231\216\011\208\127\144\000\007\025\000\"\000\130\000 @\t\004\002\001\"\000R\000\000\128\000\004@\016@\004\b\001 \128@$@\n@\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \b \002\004\000\144` \018 \005 \000\b\000\000D\001\004\000@\128\018\b\004\002D\000\164\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004@\016@\004\b\001 \192@$@\n@\000\016\000\000\136\002\b\000\129\000$\016\b\004\136\001H\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") and start = 15 and action = - ((32, "\000\000t\014\000\000\127n\000\000{n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\000\000\000{n\000\000\000\000\000\000\000\000\000\000\021\252\000\000{n\000\000t\014\000\000\024\246\000\000\021\156\000\000\002j\000\000\217L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022H\000\000\001\152\000\000\000\157\000\000\000\000\000\000\000\030\000\000\000\170\000\000\000\000\000\000\003\192\000\000\001D\000\000\003p\000\000\000\000\000\000\000F\000\000\003F\000\000\006<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\216\000\001\011\192\000\000\210^\000\000\211\000\000\000\211\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tj\000\000\000\000\000\000\000\000\000\000\177\020\000\000\005\n\000\000\004\240\000\000\000\000\000\000\000\000\000\001\012\132\000\000vR\000\000\tj\000\000\005\202\000\000\000\000\000\000\000\000\000\000\tj\000\000y\148\000\000\tj\000\000\007\000\000\000\174*\000\000~\236\000\000\021\252\000\000\173\254\000\000\214\030\000\000\b6\000\000\000\000\000\000\021\252\000\000\131L\000\000\127n\000\000\021\252\000\000\174:\000\000\000\000\000\000\021\006\000\000\000\000\000\000\174:\000\000\027D\000\000\000\000\000\000\031\206\000\000\000\000\000\000\003P\000\000\000\000\000\000\000\000\000\000\002X\000\000\000,\000\000\001\226\000\000\tj\000\000\000\000\000\000\021\252\000\000\000\000\000\000\tj\000\000\000,\000\000\002T\000\000\tj\000\000\000\000\000\000\000\000\000\000\004\208\000\000\000\000\000\000\031\206\000\000\000\000\000\000\000\000\000\000\003\202\000\000\021\150\000\000\000\000\000\000\tj\000\000\021\150\000\000\000\000\000\000\n\020\000\000\252\228\000\000\tj\000\000\000\000\000\000\000\000\000\001\000P\000\001\000\020\000\000\230\226\000\000\000\000\000\000\tj\000\000\000\000\000\001\004 \000\001\b0\000\000\000\000\000\000\tj\000\000\176D\000\000\tj\000\000\b\234\000\000\000\000\000\000\177\246\000\000\214\200\000\001\b0\000\000{\226\000\001\012\214\000\000\tj\000\000\176D\000\001\b0\000\000{n\000\000t\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127n\000\000\021\252\000\000\000\000\000\000\000\000\000\000\017\204\000\000\127\n\000\000\021\252\000\000\1788\000\000\175\024\000\000\000\000\000\000\000q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000vr\000\000\022@\000\000\022\212\000\000\003\204\000\000\007\250\000\000\000\000\000\000\000\000\000\000\t\152\000\000\000\000\000\000\173\254\000\000\t\172\000\000\t\212\000\000\021\252\000\000\027&\000\000\021\252\000\000t\014\000\000\127n\000\000\021\252\000\000\179\016\000\000\174:\000\000\011 \000\000\252\228\000\001\000P\000\000\000\000\000\001\004\160\000\000{n\000\000t\014\000\000t\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\"\000\000}6\000\000\021\252\000\000\027&\000\000\n6\000\000\000\000\000\000\028x\000\000\021\252\000\000\136$\000\000\000\000\000\000\023\158\000\000\004\020\000\000\011\130\000\000\000\000\000\000\011$\000\000\011\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127n\000\000\021\252\000\000\000\000\000\000r\n\000\000\244N\000\000\131L\000\000\000\000\000\000\001\012\000\000\136\234\000\000\175\024\000\000\231\130\000\000\231\130\000\000\243\156\000\000\000\000\000\000\011\130\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\000\000(\n\000\000\216\210\000\001\b\160\000\000\000\000\000\000\216\210\000\001\b\160\000\000\000\000\000\000\216\210\000\000\216\210\000\000\007b\000\000\000\000\000\000\005.\000\000\005\240\000\000\000\000\000\000\005\232\000\000\000\000\000\000\012*\000\000\000\000\000\000\000\000\000\000\012\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\216\210\000\000\tj\000\000\000\000\000\000\179\000\000\000\000\000\000\000\185p\000\000\216\210\000\000\186Z\000\000\000\000\000\000\184\134\000\000|\218\000\000\000\000\000\000\000\000\000\000\181\196\000\000\007b\000\000\000\000\000\000\179\236\000\000\000\000\000\001\016\004\000\001\b0\000\000\000\000\000\000\005x\000\000\007b\000\000\007b\000\000\000\000\000\000\180\216\000\000\000\000\000\000\216\210\000\000\174p\000\001\b0\000\000\002\196\000\000\tj\000\000\000\000\000\000\012$\000\000\tj\000\000\012x\000\000\tj\000\000\r\158\000\000\000\000\000\000\216\210\000\000\000\000\000\000\012\188\000\000\rx\000\000\216\210\000\000\187D\000\000\000\000\000\000\174p\000\000\188.\000\000\216\210\000\000\189\024\000\000\000\000\000\000\174p\000\000\190\002\000\000\182\176\000\000|\218\000\000\183\156\000\000\000\000\000\000\208J\000\000\000\019\000\000\tj\000\000\000\000\000\000\006\220\000\000\r\138\000\000\tj\000\000\014\146\000\000\000\000\000\000\tj\000\000\r\240\000\000\tj\000\000\015T\000\000\000\000\000\000\005\006\000\000\000\000\000\000\216\210\000\000\007\030\000\000\016\030\000\000\007\226\000\000\004\006\000\000\216\210\000\000\r\128\000\000\0166\000\000\216\210\000\000\190\236\000\000\000\000\000\000\174p\000\000\191\214\000\000\0170\000\000\216\210\000\000\192\192\000\000\000\000\000\000\174p\000\000\193\170\000\000\182\n\000\001\b0\000\000\006\030\000\000\216\210\000\000\r\200\000\000\017\158\000\000\216\210\000\000\194\148\000\000\000\000\000\000\174p\000\000\195~\000\000\018\020\000\000\216\210\000\000\196h\000\000\000\000\000\000\174p\000\000\197R\000\000\174p\000\000\198<\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\216\210\000\000\000\000\000\000\001\020\000\001\r(\000\000\000\000\000\000\216\210\000\000\006P\000\000\216\210\000\000r6\000\000\000\000\000\000vB\000\000\000\000\000\000\011\140\000\000\b\234\000\000\000\000\000\000\017\156\000\000\216\210\000\000\011\162\000\000\000\000\000\000\012 \000\000\000\000\000\000\017\212\000\000\000\000\000\000\000\000\000\000\002t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\027\012\000\000\012\202\000\000\175\024\000\000\127n\000\000\021\252\000\000\175\024\000\000\000\000\000\000\007b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000~v\000\000\"@\000\000\000q\000\000\002\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\028\000\000\031\206\000\000\231\130\000\000\000\000\000\000\000\000\000\000\233\192\000\000\021\252\000\000\175\024\000\000\000\000\000\000\000\000\000\000\221\028\000\000\175\024\000\000\228\230\000\000\244\234\000\000\000\000\000\000\240N\000\000\000\000\000\000\175\024\000\000\000\000\000\000\000\000\000\000\176\024\000\000zd\000\000\000\184\000\000\000\184\000\000\000\000\000\000\018\218\000\000\175\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\026\000\000\019\000\000\000\000\000\000\000q\210\000\000\000\000\000\000\000\000\000\000\245\140\000\000\000\000\000\001\005d\000\000\216\210\000\000\000\000\000\000\b\140\000\000\000\000\000\000\000\000\000\000\246.\000\000\000\000\000\001\rP\000\000\012\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\004\000\000\000\000\000\000\030\216\000\000\000\000\000\000\000\000\000\000\244\234\000\000\000\000\000\000\005H\000\000\000\000\000\000\000\000\000\000s\194\000\000\217\250\000\000\000\000\000\000\000\000\000\000\025\156\000\000\007\142\000\000\029\184\000\000\011\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\154\000\000\000\000\000\000\000\000\000\000\208\244\000\000\0046\000\000\0304\000\000\023\160\000\001\011\192\000\000\tB\000\000\216\210\000\000\016\248\000\000\019\016\000\000\018\222\000\000\019$\000\000\000\000\000\000\019\132\000\000\000\000\000\000\000\000\000\000\006\152\000\000\0304\000\000\018\222\000\000\006\226\000\000\000\000\000\000\209\188\000\000\127\128\000\000}6\000\000\021\252\000\000\027&\000\000\000\182\000\000\004\030\000\000\022\200\000\000\000\000\000\000\018\236\000\000\173\254\000\000\173\254\000\000\019\142\000\000\173\254\000\000\000\182\000\000\004\030\000\000\012J\000\000\173\254\000\000\000\000\000\000\2364\000\000\014D\000\000\174:\000\000\011\130\000\000\006\184\000\001\r\150\000\000\000\000\000\000\216\210\000\000\2322\000\000\216\210\000\000\218\170\000\000\232\188\000\000\216\210\000\000\007\234\000\000\216\210\000\000\233F\000\000\000\000\000\000\011\028\000\000\014\166\000\000\t\196\000\000\173\254\000\000\236\230\000\000\000\000\000\000\nj\000\000\015P\000\000\214 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\173\254\000\000\237D\000\000\173\254\000\000\237\246\000\000\003|\000\000\005\240\000\000\2194\000\000\n8\000\000\005\240\000\000\219\190\000\000\000\000\000\000\238T\000\000\br\000\000\000\000\000\000\220H\000\000\000\000\000\000\000\000\000\000\239\006\000\000\bT\000\000\000\000\000\000\000\000\000\000\004\144\000\000\000\000\000\000\012b\000\000\027&\000\000\000\000\000\000\214\240\000\000w$\000\000\000\000\000\000\023N\000\000\000\000\000\000\000\000\000\000\173\254\000\000\t`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212R\000\000\000\000\000\000\t\204\000\000\000\000\000\000\132\026\000\000\132\242\000\000\001\190\000\000\001\186\000\000\137\176\000\000\024\002\000\000\177\168\000\000\127n\000\000\021\252\000\000t\212\000\000\127n\000\000\021\252\000\000\017\204\000\000\017\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\025\014\000\000s\012\000\000\000\000\000\000\1284\000\000\128\250\000\000~\236\000\000\021\252\000\000\027&\000\000\0060\000\000\181.\000\000\000\000\000\000\005\156\000\000\000\000\000\000\129\192\000\000\130\134\000\000\246\208\000\000\027\188\000\000\216\210\000\000\t\014\000\000\000\000\000\000\127n\000\000\021\252\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000\175\024\000\000r\234\000\000\000\000\000\000\127n\000\000\021\252\000\000yh\000\000\005B\000\000\000\000\000\000\217\250\000\000\026\176\000\001\011\192\000\000\nN\000\000\216\210\000\000\020\028\000\000\021(\000\000\175\024\000\000\006\226\000\000\020\012\000\000\000\000\000\000\006\226\000\000\020 \000\000\000\000\000\000\000\000\000\000\000\000\000\000vr\000\000\nz\000\000\019\242\000\000\019\152\000\000\tj\000\000\020p\000\000\000\000\000\000\020\218\000\000\tj\000\000\020\144\000\000\000\000\000\000\000\000\000\000\020\150\000\000\000\000\000\000\003\208\000\000\000\000\000\000\000\000\000\000q\254\000\001\014@\000\000\0120\000\000\216\210\000\000\015\152\000\000\000\000\000\000\175\024\000\000\020\210\000\000\000\000\000\001\000\240\000\000vr\000\000w(\000\001\014@\000\000\r<\000\000\216\210\000\000\016\164\000\000\000\000\000\000\175\024\000\000\031\148\000\000\000\000\000\000\t>\000\000\tj\000\000\000\000\000\000\020\230\000\000\tj\000\000\020X\000\000\tj\000\000\021P\000\000\000\000\000\000\014H\000\000\216\210\000\000\017\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\252\000\000\000\000\000\000\000\000\000\000\000p\000\000|\218\000\000\026(\000\000\0218\000\000\138v\000\000\233\192\000\000\021\252\000\000\243\156\000\000\0282\000\000\139<\000\000\233\192\000\000\021\252\000\000\243\156\000\000\029>\000\000\175\024\000\000\000\000\000\000\000\000\000\000\233\192\000\000\021\252\000\000\175\024\000\000#\016\000\000\000\000\000\000\000\000\000\000\127n\000\000\021\252\000\000\017\204\000\000\024\002\000\000\021\210\000\000\000\000\000\000\017\204\000\000\003$\000\000\025\158\000\000|r\000\000\233\192\000\000\021\252\000\000\243\156\000\000qJ\000\000|r\000\000\140\002\000\000\233\192\000\000\021\252\000\000\243\156\000\000\000\000\000\000\017\204\000\000\011(\000\000\021\218\000\000\000\019\000\001\n\190\000\000\000\000\000\000\031b\000\001\014b\000\000\000\000\000\000\023F\000\000\216\210\000\000\"\134\000\000\022 \000\000\000\000\000\000\000\000\000\000\022(\000\000\000\000\000\000\017\204\000\000\0040\000\000\022.\000\000\000\000\000\000\030\226\000\000\000\000\000\000\005`\000\000\000\000\000\000\000\000\000\000\030J\000\000\140\200\000\000\233\192\000\000\021\252\000\000\243\156\000\000\031V\000\000\018\216\000\000\025\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000 b\000\000\141\142\000\000\233\192\000\000\021\252\000\000\243\156\000\000!n\000\000\"z\000\000\142T\000\000\233\192\000\000\021\252\000\000\243\156\000\000#\134\000\000$\146\000\000\000\000\000\000\019\228\000\000\026\026\000\000\143\026\000\000\233\192\000\000\021\252\000\000\243\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000{n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\224\000\000\233\192\000\000\021\252\000\000\243\156\000\000%\158\000\000&\170\000\000\144\166\000\000\233\192\000\000\021\252\000\000\243\156\000\000'\182\000\000(\194\000\000\145l\000\000\233\192\000\000\021\252\000\000\243\156\000\000)\206\000\000*\218\000\000\1462\000\000\233\192\000\000\021\252\000\000\243\156\000\000+\230\000\000,\242\000\000\146\248\000\000\233\192\000\000\021\252\000\000\243\156\000\000-\254\000\000/\n\000\000\147\190\000\000\233\192\000\000\021\252\000\000\243\156\000\0000\022\000\0001\"\000\000\148\132\000\000\233\192\000\000\021\252\000\000\243\156\000\0002.\000\0003:\000\000\149J\000\000\233\192\000\000\021\252\000\000\243\156\000\0004F\000\0005R\000\000\150\016\000\000\233\192\000\000\021\252\000\000\243\156\000\0006^\000\0007j\000\000\150\214\000\000\233\192\000\000\021\252\000\000\243\156\000\0008v\000\0009\130\000\000\151\156\000\000\233\192\000\000\021\252\000\000\243\156\000\000:\142\000\000;\154\000\000\152b\000\000\233\192\000\000\021\252\000\000\243\156\000\000<\166\000\000=\178\000\000\153(\000\000\233\192\000\000\021\252\000\000\243\156\000\000>\190\000\000?\202\000\000\153\238\000\000\233\192\000\000\021\252\000\000\243\156\000\000@\214\000\000A\226\000\000\154\180\000\000\233\192\000\000\021\252\000\000\243\156\000\000B\238\000\000C\250\000\000\155z\000\000\233\192\000\000\021\252\000\000\243\156\000\000E\006\000\000F\018\000\000\156@\000\000\233\192\000\000\021\252\000\000\243\156\000\000G\030\000\000H*\000\000\157\006\000\000\233\192\000\000\021\252\000\000\243\156\000\000I6\000\000JB\000\000\157\204\000\000\233\192\000\000\021\252\000\000\243\156\000\000KN\000\000LZ\000\000\158\146\000\000\233\192\000\000\021\252\000\000\243\156\000\000Mf\000\000Nr\000\000\021\252\000\000\217\250\000\000yh\000\000\000\000\000\000\000\000\000\001\011\192\000\000\003\208\000\000\022\002\000\000\216\210\000\000\012\022\000\000\000\000\000\000\000\000\000\000\014~\000\000\216\210\000\000\r\"\000\000\000\000\000\000\000\000\000\000\022\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\000\000\000\000\000\022`\000\000\138v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\236\000\000\216\210\000\000\r&\000\000\000\000\000\000\000\000\000\000#\188\000\000\000\000\000\000\000\000\000\000\247r\000\000\000\000\000\000$\028\000\000\248\020\000\000\000\000\000\000$\200\000\000\248\182\000\000\000\000\000\000%(\000\000\023\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000%\212\000\000\175\024\000\000&4\000\000\002j\000\000\215\148\000\001\011\192\000\000\015\138\000\000\216\210\000\000\014.\000\000\000\000\000\000\000\000\000\000\022|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\249`\000\000\249`\000\000\000\000\000\000\000\000\000\000\000\000\000\000O~\000\000\000\000\000\000\011\168\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\132\000\000\000\000\000\000\000\000\000\000\011d\000\000\027(\000\000|r\000\000\006l\000\000\000\000\000\000\000\000\000\000\216\006\000\000}t\000\000\000\000\000\000|r\000\000\014\204\000\000\000\000\000\000\000\000\000\000|r\000\000\r\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\204\000\000\005<\000\000\027\196\000\000|r\000\000\n\240\000\000\000\000\000\000\006H\000\000\159X\000\000\233\192\000\000\021\252\000\000\243\156\000\000P\138\000\000Q\150\000\000|r\000\000\015\188\000\000\000\000\000\000\007T\000\000\160\030\000\000\233\192\000\000\021\252\000\000\243\156\000\000R\162\000\000S\174\000\000|r\000\000\018\204\000\000\000\000\000\000\b`\000\000\160\228\000\000\233\192\000\000\021\252\000\000\243\156\000\000T\186\000\000U\198\000\000#\172\000\000\000\000\000\000\014&\000\000\tl\000\000\161\170\000\000\233\192\000\000\021\252\000\000\243\156\000\000V\210\000\000W\222\000\000\000\000\000\000\015\216\000\000\nx\000\000\162p\000\000\233\192\000\000\021\252\000\000\243\156\000\000X\234\000\000Y\246\000\000\000\000\000\000\018\246\000\000\011\132\000\000\1636\000\000\233\192\000\000\021\252\000\000\243\156\000\000[\002\000\000\\\014\000\000\012p\000\000\029\006\000\000|r\000\000\014\212\000\000\012\144\000\000\163\252\000\000\233\192\000\000\021\252\000\000\243\156\000\000]\026\000\000^&\000\000|r\000\000\016\200\000\000\r\156\000\000\164\194\000\000\233\192\000\000\021\252\000\000\243\156\000\000_2\000\000`>\000\000|r\000\000\021*\000\000\014\168\000\000\165\136\000\000\233\192\000\000\021\252\000\000\243\156\000\000aJ\000\000bV\000\000\015\180\000\000\166N\000\000\233\192\000\000\021\252\000\000\243\156\000\000cb\000\000dn\000\000\016\192\000\000\020\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\224\000\000\000\000\000\000|r\000\000\017\240\000\000\000\000\000\000|r\000\000\023*\000\000\000\000\000\000\000\000\000\000\000t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\184\000\000\000\000\000\000\002R\000\000\000\000\000\000\000\000\000\000ez\000\000\000\000\000\000\023@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000f\134\000\000\023\132\000\000\167\020\000\000\233\192\000\000\021\252\000\000\243\156\000\000g\146\000\000\167\218\000\000\233\192\000\000\021\252\000\000\243\156\000\000h\158\000\000i\170\000\000j\182\000\000\168\160\000\000\233\192\000\000\021\252\000\000\243\156\000\000k\194\000\000l\206\000\000\000\000\000\000&\224\000\000\000\000\000\000\000\000\000\000\007\212\000\000\000\000\000\000\000\000\000\000\175\024\000\000\000\000\000\000\000\000\000\000\250\b\000\000\016\138\000\000\000\000\000\000\000\000\000\000\133\184\000\000\233\192\000\000\021\252\000\000\243\156\000\000\025\194\000\000\169f\000\000\233\192\000\000\021\252\000\000\243\156\000\000\022\238\000\000\2342\000\000\021\252\000\000!\136\000\000\021\252\000\000\175\024\000\000\175\024\000\000'\236\000\000\170,\000\000\233\192\000\000\021\252\000\000\243\156\000\000\0264\000\000\220\188\000\000\025D\000\000\170\242\000\000\233\192\000\000\021\252\000\000\243\156\000\000\027@\000\000\221<\000\000\171\184\000\000\233\192\000\000\021\252\000\000\243\156\000\000\000t\000\000\172~\000\000\233\192\000\000\021\252\000\000\243\156\000\000\028L\000\000\222\n\000\000\216\006\000\000\173D\000\000\233\192\000\000\021\252\000\000\243\156\000\000\029X\000\000\222\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rl\000\000\000\000\000\000\000\000\000\000\216\006\000\000\r,\000\000\000\000\000\000\134\134\000\000\233\192\000\000\021\252\000\000\243\156\000\000!8\000\000\016\024\000\000\000\000\000\000\000\000\000\000\014f\000\000\000\000\000\000\000\000\000\000\216\006\000\000\017$\000\000\000\000\000\000\135^\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000\025\194\000\000\007\\\000\000\000\000\000\000\018V\000\000\000\000\000\000\000\000\000\000\216\006\000\000\007\240\000\000\000\000\000\000\001\190\000\000\011\152\000\000\000\000\000\000\000\000\000\000\024\002\000\000s\140\000\000\011\130\000\000\000\000\000\000s\210\000\000\r\214\000\000\018\006\000\000\0252\000\000\000\000\000\000\000\000\000\000\023\246\000\000\000\000\000\000\000\000\000\000\002\022\000\000\030J\000\000\182L\000\000\000\000\000\000\027&\000\000\000\000\000\000\015^\000\000\000\000\000\000\000\000\000\000\024\n\000\000\000\000\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000!\232\000\000\221<\000\000\tp\000\000\023\180\000\000\000\000\000\000\000\000\000\000\011\176\000\000\000\000\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000\025\194\000\000\bh\000\000\000\000\000\000\018z\000\000\000\000\000\000\000\000\000\000\216\006\000\000\b\252\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000!8\000\000\019<\000\000\000\000\000\000\000\000\000\000\015r\000\000\000\000\000\000\000\000\000\000\216\006\000\000\023\208\000\000\000\000\000\000\000\000\000\000\021\252\000\000\027&\000\000\015\b\000\000\000\000\000\000\000\000\000\000\022\212\000\000\003\204\000\000\007\250\000\000\004\030\000\000\027&\000\000\253\244\000\000\184&\000\000\000\000\000\000\029J\000\000\027&\000\000\254~\000\000\023\016\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\000\000\000\024\160\000\000\021\252\000\000\025\166\000\000\000\000\000\000\002\162\000\000\023\162\000\000\000\000\000\000\023\232\000\000\026 \000\000|\218\000\000\000=\000\000\000\000\000\000\000\000\000\000\023\208\000\000\023j\000\001\011\192\000\000\016\150\000\000\216\210\000\000\030n\000\000\0078\000\000\018\188\000\000\021\156\000\000\000\000\000\000$\182\000\000\024J\000\000\000\000\000\000\007v\000\000\000\000\000\000\000\000\000\000|\218\000\000\223.\000\000\024\130\000\000\1862\000\000|\218\000\000\223\238\000\000\224\174\000\000\000\000\000\000\234\214\000\000\184\184\000\001\014\192\000\000\tj\000\000y\148\000\000\017l\000\000|\218\000\000\024\132\000\000|\218\000\000\239\144\000\000\225n\000\000\024\168\000\000|\218\000\000\240\026\000\000\226.\000\000\016\246\000\000\024r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\252\000\000\235\004\000\000\000\000\000\000\217\250\000\000\249`\000\000\000\000\000\000\000\000\000\000\024\236\000\000\000\000\000\000\006\226\000\000\024\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000m\218\000\000n\230\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000\025\194\000\000\0148\000\000\000\000\000\000\000\000\000\000\015\132\000\000\000\000\000\000\000\000\000\000\216\006\000\000\016P\000\000\000\000\000\000\000\000\000\000~\236\000\000\021\252\000\000\027&\000\000\028\132\000\000\000\000\000\000\186\176\000\000\000\000\000\000\b\192\000\000\000\000\000\000\004\\\000\000\000\000\000\000\000\000\000\000\024\254\000\000\000\000\000\000\025H\000\000\243\156\000\000o\242\000\000\000\000\000\000\233\192\000\000\021\252\000\000\243\156\000\000\"\166\000\000\000\000\000\000\000\000\000\000\187\154\000\000\000\000\000\000\t\204\000\000\000\000\000\000\188\132\000\000\000\000\000\000\001\000\000\000\000\000\000\000\173\254\000\000\n\216\000\000\000\000\000\000\240\192\000\000\000\000\000\000\000\000\000\000\189n\000\000\000\000\000\000\015\b\000\000\000\000\000\000\190X\000\000\000\000\000\000\nl\000\000\000\000\000\000\173\254\000\000\015\168\000\000\000\000\000\000\249`\000\000\000\000\000\000\021\252\000\000\027&\000\000\249`\000\000\000\000\000\000\023\204\000\000\023\158\000\000\004\020\000\000\tj\000\001\005\206\000\000\173\254\000\001\001H\000\000\249\"\000\000\000\000\000\000\021\252\000\000\024\172\000\000\007\250\000\000\004\030\000\000\249`\000\001\t\"\000\000\003\204\000\000\007\250\000\000\004\030\000\000\249`\000\001\t\"\000\000\000\000\000\000\000\000\000\000\004\030\000\000\249\"\000\000\000\000\000\000{n\000\000t\014\000\000\175\024\000\000\029t\000\000\000\000\000\000\000\000\000\000{n\000\000t\014\000\000\180B\000\000\000\000\000\000\024\246\000\000\021\156\000\000\002j\000\000\024h\000\001\011\192\000\000\018x\000\000\216\210\000\000\250\168\000\000\024\180\000\000\025b\000\001\006X\000\000\000\000\000\000\249\"\000\000\000\000\000\000\2512\000\000\024\160\000\000\021\252\000\000\025\166\000\000\255\b\000\000$\150\000\000\r\134\000\001\001\172\000\000\n8\000\000\024\172\000\000\021\252\000\000\249\"\000\000\000\000\000\000\021\252\000\000\249\"\000\000\000\000\000\000\216\210\000\001\017D\000\000\026\148\000\000\t\254\000\000\001\000\000\000\005\240\000\001\004\160\000\000\000\000\000\000\001\000\000\000\005\240\000\001\004\160\000\000\000\000\000\000\026@\000\000\023\158\000\000\004\020\000\000\tj\000\001\011\232\000\000\173\254\000\001\006\182\000\000\000\000\000\000\021\252\000\000\0258\000\000\023\130\000\000\006\158\000\000\000\000\000\001\004\160\000\000\000\000\000\000\007\250\000\000\024\224\000\000\173\254\000\001\006\182\000\001\015\216\000\000\003\204\000\000\007\250\000\000\024\228\000\000\173\254\000\001\006\182\000\001\015\216\000\000\000\000\000\000\000\000\000\000\005*\000\000\018\128\000\000\000\000\000\000\249\"\000\000\000\000\000\000\173\254\000\001\tX\000\000\249\"\000\000\000\000\000\000\0066\000\000\018\128\000\000\000\000\000\000\024\160\000\000\021\252\000\000\025\166\000\000\252.\000\000\0316\000\000\029\174\000\000\021\150\000\000\000\172\000\000\000\000\000\000\006\244\000\000\031\206\000\000\000\000\000\000\014\228\000\000\000\000\000\000\031\206\000\000\000\000\000\000\025p\000\000\025F\000\000w\220\000\000\021\252\000\000\190\222\000\000\216\210\000\000\018\188\000\000\000\000\000\000\129r\000\000\021\156\000\000\001n\000\000\n\230\000\000\000\000\000\000\rR\000\000\000\000\000\000\025\204\000\000\025h\000\000\216\210\000\000\135^\000\000\000\000\000\000\021\252\000\000\001\230\000\000\018\166\000\000\000\000\000\000\016v\000\000\000\000\000\000\026\000\000\000\025|\000\001\011\192\000\000\128\172\000\000\000\000\000\000\021\252\000\000w\220\000\000\026D\000\000\022\160\000\000\001\000\000\000\000\000\000\000\007\144\000\000w\220\000\000\216\210\000\000\015\028\000\000\007b\000\000\000\000\000\000\216\210\000\000\001\162\000\000\017V\000\000\000\000\000\000\000\000\000\000\241f\000\000\000\000\000\000\000\000\000\000\016\252\000\000w\220\000\000\241\240\000\000\135^\000\000\000\000\000\000\021\252\000\000\216\210\000\000\016\172\000\000\216\210\000\000\132\242\000\000\128\172\000\000\000\000\000\000\019b\000\000\000\000\000\000\000\000\000\000\128\172\000\000\000\000\000\000\000\000\000\000\129r\000\000\000\000\000\000\249`\000\001\t\226\000\000\021\150\000\000\000\172\000\000\006\244\000\000\026*\000\000\025\204\000\000w\220\000\000\249`\000\001\t\226\000\000\000\000\000\000\000\000\000\000\021\150\000\000\000\172\000\000\006\244\000\000\026h\000\000\025\228\000\001\017t\000\000\177\230\000\000|\218\000\000\026\132\000\001\017t\000\000\216\210\000\000\024J\000\000\026\138\000\001\017t\000\000|\218\000\000\026\156\000\001\017t\000\000\242\176\000\000\251\242\000\000\000\000\000\001\007\024\000\000\000\000\000\000\000\000\000\000\249`\000\001\016\014\000\000\021\150\000\000\000\172\000\000\006\244\000\000\026\148\000\000\026R\000\001\017t\000\000\249`\000\001\016\014\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\249\"\000\000\000\000\000\000~\236\000\000\021\252\000\000\173\254\000\001\006\182\000\000\000\000\000\001\n\024\000\000\021\252\000\000}\232\000\000\026\244\000\000\252\228\000\001\000P\000\000\000\000\000\001\004\160\000\001\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\142\000\000\021\252\000\000}\232\000\000\026\246\000\000\016(\000\000\026v\000\001\000\020\000\001\n\190\000\000\000=\000\000\0272\000\000\000\000\000\000\000\000\000\000\243\022\000\000\252.\000\000\021\252\000\000\000\000\000\001\002\016\000\000\025\166\000\000\000\000\000\000\000\000\000\001\004\160\000\001\016\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255f\000\000\028\208\000\000\025\166\000\000\000=\000\000\027B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\252.\000\000\021\252\000\000\000\000\000\000\000=\000\000\027L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r&\000\000\0316\000\000\021\150\000\000\000\172\000\000\006\244\000\000\0278\000\000\226\\\000\000vr\000\000{x\000\000\021\252\000\000\1788\000\000\133\252\000\000\021\156\000\000\018\188\000\000\019$\000\000\000\000\000\000\027:\000\000\bN\000\000\000\000\000\000\000\000\000\000\027\018\000\000\000\000\000\000\000\000\000\000\135^\000\000\000\000\000\000\004\158\000\000\019:\000\000\000\000\000\000\018\026\000\000\000\000\000\000\027v\000\000\026\246\000\000\216\210\000\000\133\184\000\000\027~\000\000\t\220\000\000\000\000\000\000\000\000\000\000\027\"\000\000\000\000\000\000\000\000\000\000\022\132\000\000\017\176\000\000\019L\000\000\000\000\000\000\027\136\000\000\227\028\000\001\015.\000\000\003\208\000\000\027@\000\000\216\210\000\000\019\134\000\000\000\000\000\000\000\000\000\000\027R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\135^\000\000\000\000\000\000\019\178\000\000\0204\000\000\000\000\000\000\018:\000\000\000\000\000\000\027\218\000\000\027b\000\001\011\192\000\000\000\000\000\000\027\238\000\000\227\190\000\001\015x\000\000\003\208\000\000\027\142\000\000\216\210\000\000\019\208\000\000\000\000\000\000\000\000\000\000\027\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\252\000\000\000\000\000\000\135^\000\000\000\000\000\000\022B\000\000\021\252\000\000{x\000\000{x\000\000\213\178\000\000{n\000\000\021\252\000\000\235\004\000\000\217\250\000\000\016D\000\000\000\000\000\000\027\012\000\000\001\000\000\000\000\000\000\000\019b\000\000{x\000\000\216\210\000\000\019\196\000\000\011\130\000\000\000\000\000\000\021\252\000\000\226\\\000\000\226\\\000\000{x\000\000\r\192\000\000{x\000\000\000\000\000\000wt\000\000xn\000\000\000\000\000\000\228\022\000\000\000\000\000\000\000\000\000\000\228\160\000\000\000\000\000\000\000\000\000\000\229*\000\000\000\000\000\000\020\014\000\000{x\000\000\229\180\000\000\235\004\000\000\217\250\000\000\016D\000\000\000\000\000\000\003P\000\000\000\000\000\000\000\000\000\001\017t\000\000\0178\000\000\000\000\000\000\000\000\000\000\173D\000\000\028\002\000\000\000\000\000\000\135^\000\000\000\000\000\000{x\000\000\173D\000\000\135^\000\000\000\000\000\000\021\252\000\000\216\210\000\000\135^\000\000\000\000\000\000\019\142\000\000\000\000\000\000\000\000\000\000\135^\000\000\000\000\000\000\000\000\000\000\133\252\000\000\000\000\000\001\004\176\000\001\017t\000\000\027\164\000\000{x\000\001\005p\000\000\226\\\000\000\000\000\000\000\249`\000\001\011\022\000\000\021\150\000\000\000\172\000\000\006\244\000\000\028\006\000\000\226\\\000\000\249`\000\001\011\022\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\196\000\000\127n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\007Z\000\000\249\"\000\000\000\000\000\000}6\000\000\021\252\000\000\027&\000\000\249`\000\000\000\000\000\001\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\249\"\000\001\016\196\000\000\000\000\000\000\000\000\000\000\000\000\000\001\007Z\000\000\028P\000\000\000\000\000\000\028R\000\000\000\000\000\000\249\"\000\001\016\196\000\000\000\000\000\000\000\000\000\000\028X\000\000\000\000\000\000\000\000\000\000\028V\000\000\030\232\000\000\027\158\000\000\025\166\000\000\252\128\000\000$\150\000\000\021\252\000\000\000\000\000\000\249\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\253J\000\000$\150\000\000\021\252\000\000\000\000\000\000\020\238\000\000\252\228\000\001\000P\000\000\000\000\000\001\004\160\000\000\000\000\000\000\028\\\000\000\030\232\000\000\027\158\000\000\249\"\000\000\000\000\000\000\023\234\000\000\000\000\000\000\000\000\000\000\235\214\000\000\011x\000\000\000\000\000\000\000\000\000\000 \248\000\000\000\000\000\000\216\210\000\000\020\228\000\000\000\000\000\000\133\252\000\000\025\134\000\000\000\000\000\000\000\000\000\000\028\164\000\000\243\156\000\000\000\000\000\000p\254\000\000\000\000\000\000\028\138\000\000\000\000\000\000\019\186\000\000\216\210\000\000\025\002\000\000\028`\000\000\216\210\000\000\199&\000\000\000\000\000\000\174p\000\000\200\016\000\000z\142\000\001\011\192\000\000\021\146\000\000\016\196\000\000\021\252\000\000\174\236\000\000\000\000\000\000\000\000\000\000\029L\000\000\185H\000\000\000\000\000\000\000\000\000\000\028\n\000\000\000\000\000\000\020\144\000\000\216\210\000\000\026F\000\000\028f\000\000\216\210\000\000\200\250\000\000\000\000\000\000\174p\000\000\201\228\000\000\028z\000\000\216\210\000\000\202\206\000\000\000\000\000\000\174p\000\000\203\184\000\000\182\246\000\001\b0\000\000\020\194\000\000\216\210\000\000\027L\000\000\028~\000\000\216\210\000\000\204\162\000\000\000\000\000\000\174p\000\000\205\140\000\000\028\128\000\000\216\210\000\000\206v\000\000\000\000\000\000\174p\000\000\207`\000\000\000=\000\000\028\186\000\000\000\000\000\000\000\000\000\001\002\154\000\000\000\000\000\000\000\000\000\001\000\020\000\000\000\000\000\001\004\160\000\000\000\000\000\000\028\178\000\000\030\232\000\000#\018\000\000\249`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\027x\000\000\252\228\000\001\b\004\000\001\000\020\000\000\000\000\000\001\004\160\000\000\000\000\000\000\028\180\000\000\030\232\000\000#\018\000\000\249`\000\000\000\000\000\000\026\000\000\000\000\000\000\000\000\000\000\000\016\020\000\000\000\000\000\000\249\"\000\000\000\000\000\000\028\200\000\000\000\000\000\000\000\000\000\000\028\030\000\000\000\000\000\000\022V\000\000\000\000\000\000\000\000\000\000\028B\000\000\000\000\000\000\000\000\000\000\131L\000\000\028H\000\000\000\000\000\000\000\000\000\000 \250\000\000\217L\000\000\028\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0198\000\000\025\012\000\000\230.\000\000\028\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028~\000\000\000\000\000\000$\150\000\000\000\000\000\000\028\130\000\000\000\000\000\000\216\210\000\000\000\000\000\000\015\234\000\000\000\000\000\000\000\000\000\000\028\150\000\000\000\000\000\000\000\000\000\000\005\240\000\000\000\000\000\000\020\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\220\000\000\000\000\000\000\027&\000\000\000\000\000\000\005\242\000\000\000\000\000\000\173\254\000\000\000\000\000\000\004\230\000\000\000\000\000\000\014\166\000\000\000\000\000\000\028\170\000\000\000\000\000\000\175\024\000\000\025D\000\000\000\000\000\000\000\000\000\000\025L\000\000\028\172\000\000\000\000\000\000\000\000\000\000\028\180\000\000\027d\000\000t\212\000\000\tj\000\001\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000~\022\000\000\tj\000\001\003\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\n\230\000\000\000\000\000\000\000\000\000\000\029l\000\000\000\000\000\000\181\022\000\000\000\000\000\000\023\020\000\000\029n\000\000\000\000\000\000\029z\000\000\000\000\000\000u\154\000\000u\154\000\000\180*\000\000\180*\000\000\000\000\000\000\000\000\000\000\179>\000\000\180*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\179>\000\000\180*\000\000\028\220\000\000\000\000\000\000\028\224\000\000\000\000"), (16, "\004\025\004\025\000\006\004\025\001.\004\025\003j\003n\003r\004\025\003v\003\022\004\025\023\158\004\025\003\162\003\130\004\025\0062\004\025\004\025\004\025\007U\004\025\004\025\004\025\001\238\003\166\003\170\001n\003\134\004\025\004:\004>\014\162\004\025\001v\004\025\004f\003\174\003\138\006:\004j\005\161\004\025\004\025\004\150\004\154\004\025\004\158\004\170\004\182\004\186\004\194\t\142\001j\004\025\004\025\003b\004y\023\162\004\178\n\250\004\025\004\025\004\025\n\254\011\002\011\014\011\"\019\222\007\154\004\025\004\025\004\025\004\025\004\025\004\025\004\025\004\025\004\025\011\158\004\025\007\166\007\170\b\t\004\025\000\242\004\025\004\025\027\174\b\213\011\170\011\194\r6\007\182\007\186\004\025\rJ\004\025\004\025\b\161\004\025\004\025\004\025\004\025\b\t\r\174\020\022\004\025\r\186\004\025\004\025\007\133\004\025\004\025\004\025\004\025\004\025\004\025\004\025\007\190\011\022\004\025\004\025\004\025\011.\005J\rN\t\222\004\025\004\025\004\025\004\025\016e\016e\005\161\016e\016\153\016e\001z\005\161\016e\016e\bV\016e\016e\016e\016e\025Z\016e\016e\016\153\016e\016e\016e\000\242\016e\016e\016e\016e\005\161\016e\019\226\016e\016e\016e\016e\016e\016e\016e\016e\r\022\nZ\016e\012\246\016e\007\030\016e\016e\016e\016e\016e\r*\016e\001\134\016e\027\250\016e\004\190\016e\016e\016e\000\242\001\186\016e\016e\016e\016e\016e\016e\016e\016e\000\242\016e\016e\016e\016e\016e\016e\016e\016e\016e\016e\016e\001\190\016e\016e\016e\016e\016e\b\177\016e\016e\001j\004y\028\002\005\161\016e\016e\016e\016e\n\221\016e\016e\007a\016e\016e\016e\016e\016e\b\177\016e\016e\025^\016e\016e\028&\016e\016e\016e\016e\016e\016e\016e\016e\016e\016e\016e\016e\016e\016e\016\r\005\161\016e\016e\016e\016e\002\005\002\005\002\005\002\005\028.\002\005\000\242\011\006\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\n\025\002\005\019\246\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\154\002\005\b\177\002\005\022\166\002\005\002\005\002\005\002\005\002\005\002\005\002\005\016\t\002\005\011\n\002\005\n\221\002\005\002\005\002\005\002\178\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\007v\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\016\r\002\005\002\005\003*\001\006\002\162\001\194\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\022Z\011N\002\005\007\254\002\005\002\005\005\194\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\002\005\003\182\002\005\002\005\002\005\002\005\002\005\012\205\012\205\005\202\012\205\019\250\012\205\003\186\003\190\012\205\012\205\016\t\012\205\012\205\012\205\012\205\002\190\012\205\012\205\003\194\012\205\012\205\012\205 \230\012\205\012\205\012\205\012\205\004\226\012\205\016)\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\b\017\005J\012\205\001\150\012\205 \234\012\205\012\205\012\205\012\205\012\205\016)\012\205\004\230\012\205\023\134\012\205\002\142\012\205\012\205\012\205\b\017\005\226\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\002\146\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\001\202\012\205\012\205\012\205\012\205\012\205\000\242\012\205\012\205\002\226\005\161\005\161\001\138\012\205\012\205\012\205\012\205\001j\012\205\012\205\004y\012\205\012\205\012\205\012\205\rn\007\165\r\242\012\205\002\234\012\205\012\205\007\014\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\012\205\005\161\012\205\012\205\012\205\012\205\012\205\004\209\004\209\012\030\004\209\012R\004\209\005\194 \238\004\209\004\209\nf\004\209\004\209\004\209\004\209\000\242\004\209\004\209\nn\004\209\004\209\004\209\025\006\004\209\004\209\004\209\004\209\nr\004\209\005\202\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\005\161\014:\004\209\t\170\004\209\025\n\004\209\004\209\004\209\004\209\004\209\t\222\004\209\000\242\004\209\tF\004\209\tv\004\209\004\209\004\209\031>\007\165\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\n\170\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\007\018\r^\004\209\004\209\rf\r\234\006~\004\209\004\209\016\146\023B\t\222\nZ\004\209\004\209\004\209\004\209\031F\004\209\004\209\002\206\004\209\004\209\004\209\004\209\rn\007M\r\242\004\209\023J\004\209\004\209\000\242\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\004\209\006f\004\209\004\209\004\209\004\209\004\209\004\193\004\193\nZ\004\193\r\174\004\193\b\234\r\186\004\193\004\193\011\210\004\193\004\193\004\193\004\193\t&\004\193\004\193\r\254\004\193\004\193\004\193\000\242\004\193\004\193\004\193\004\193\002\006\004\193\b\238\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\000\242\014\002\004\193\t\170\004\193\005\026\004\193\004\193\004\193\004\193\004\193\t\222\004\193\005\158\004\193\011\214\004\193\012\014\004\193\004\193\004\193%s\002\210\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\011~\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\002\n\r^\004\193\004\193\rf\r\234\006j\004\193\004\193\005\030\027b\002\"\nZ\004\193\004\193\004\193\004\193\001\234\004\193\004\193\0056\004\193\004\193\004\193\004\193\rn\005&\r\242\004\193\027r\004\193\004\193\000\242\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\b\025\004\193\004\193\004\193\004\193\004\193\0125\0125\005\026\0125\t*\0125\005\194\n\190\0125\0125\005\178\0125\0125\0125\0125\b\025\0125\0125\017\226\0125\0125\0125\000\242\0125\0125\0125\0125\005\161\0125\005\202\0125\0125\0125\0125\0125\0125\0125\0125\n\190\017\230\0125\t\170\0125\027\030\0125\0125\0125\0125\0125\001\154\0125\001\234\0125\000\242\0125\0186\0125\0125\0125%c\005*\0125\0125\0125\0125\0125\0125\0125\0125\000\242\0125\0125\0125\0125\0125\0125\0125\0125\0125\0125\0125\006>\0125\0125\0125\0125\0125\006\194\0125\0125\t~\027\134\024\134\005\161\0125\0125\0125\0125\b\205\0125\0125\006N\0125\0125\0125\0125\0125\011r\0125\0125\027r\0125\0125\002:\0125\0125\0125\0125\0125\0125\0125\0125\0125\0125\0125\0125\0125\0125\011\005\005\161\0125\0125\0125\0125\012E\012E\007.\012E\002a\012E\005\161\020\190\012E\012E\005\161\012E\012E\012E\012E\001\234\012E\012E\027\182\012E\012E\012E\t\238\012E\012E\012E\012E\021\246\012E\006\t\012E\012E\012E\012E\012E\012E\012E\012E\000\242\t\246\012E\004\165\012E\t\138\012E\012E\012E\012E\012E\t\n\012E\000\242\012E\006\t\012E\018^\012E\012E\012E\005\018\023\158\012E\012E\012E\012E\012E\012E\012E\012E\007U\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\020\190\012E\012E\012E\012E\012E\011\005\012E\012E\003\218\003\222\011\001\005\162\012E\012E\012E\012E\020\214\012E\012E\022\014\012E\012E\012E\012E\012E\023\162\012E\012E\028f\012E\012E\002R\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\n\158\t\222\012E\012E\012E\012E\012=\012=\000\242\012=\nn\012=\000\242\020\190\012=\012=\020\134\012=\012=\012=\012=\n\162\012=\012=\t\226\012=\012=\012=\b\162\012=\012=\012=\012=\022\202\012=\t6\012=\012=\012=\012=\012=\012=\012=\012=\020\214\nZ\012=\n\018\012=\b\166\012=\012=\012=\012=\012=\t\222\012=\011\001\012=\n\030\012=\018\134\012=\012=\012=\000\242\020\142\012=\012=\012=\012=\012=\012=\012=\012=\024\254\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\020\190\012=\012=\012=\012=\012=\000\242\012=\012=\003>\031\030\007J\nZ\012=\012=\012=\012=\020\214\012=\012=\022\226\012=\012=\012=\012=\012=\r\174\012=\012=\r\186\012=\012=\000\242\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\n\218\t\222\012=\012=\012=\012=\012)\012)\011I\012)\012\174\012)\005\194\001\246\012)\012)\t:\012)\012)\012)\012)\n\222\012)\012)\000\242\012)\012)\012)\022\158\012)\012)\012)\012)\012\182\012)\005\202\012)\012)\012)\012)\012)\012)\012)\012)\020\214\nZ\012)\003\242\012)\003\230\012)\012)\012)\012)\012)\t\222\012)\001\250\012)\011\154\012)\018\174\012)\012)\012)\000\242\011)\012)\012)\012)\012)\012)\012)\012)\012)\025J\012)\012)\012)\012)\012)\012)\012)\012)\012)\012)\012)\002E\012)\012)\012)\012)\012)\tV\012)\012)\011I\003\246\001\234\nZ\012)\012)\012)\012)\n\190\012)\012)\004V\012)\012)\012)\012)\012)\000\n\012)\012)\004\130\012)\012)\000\242\012)\012)\012)\012)\012)\012)\012)\012)\012)\012)\012)\012)\012)\012)\n\246\t\222\012)\012)\012)\012)\0121\0121\002\250\0121\002E\0121\005\194\003\234\0121\0121\n*\0121\0121\0121\0121\025\146\0121\0121\026\162\0121\0121\0121\031f\0121\0121\0121\0121\nR\0121\005\202\0121\0121\0121\0121\0121\0121\0121\0121\r\174\nZ\0121\r\186\0121\005\026\0121\0121\0121\0121\0121\t\222\0121\012\030\0121\0122\0121\018\210\0121\0121\0121\000\242\018.\0121\0121\0121\0121\0121\0121\0121\0121\025f\0121\0121\0121\0121\0121\0121\0121\0121\0121\0121\0121\0182\0121\0121\0121\0121\0121\011\230\0121\0121\003r\n\"\001\234\nZ\0121\0121\0121\0121\027\254\0121\0121\n:\0121\0121\0121\0121\0121\007i\0121\0121\025\150\0121\0121\000\242\0121\0121\0121\0121\0121\0121\0121\0121\0121\0121\0121\0121\0121\0121\"\198\t\222\0121\0121\0121\0121\012-\012-\004\026\012-\r\166\012-\r\214\003r\012-\012-\022\026\012-\012-\012-\012-\"\202\012-\012-\017\186\012-\012-\012-\022\174\012-\012-\012-\012-\011-\012-\b\137\012-\012-\012-\012-\012-\012-\012-\012-\007Z\nZ\012-\017\190\012-\004\130\012-\012-\012-\012-\012-\t\018\012-\004v\012-\b\137\012-\018\246\012-\012-\012-\000\242\004~\012-\012-\012-\012-\012-\012-\012-\012-\000\242\012-\012-\012-\012-\012-\012-\012-\012-\012-\012-\012-\020\190\012-\012-\012-\012-\012-\004\134\012-\012-\017\214\005.\004~\011-\012-\012-\012-\012-\022\030\012-\012-\007b\012-\012-\012-\012-\012-\005\206\012-\012-\022\178\012-\012-\005\194\012-\012-\012-\012-\012-\012-\012-\012-\012-\012-\012-\012-\012-\012-\017\202\011-\012-\012-\012-\012-\0129\0129\005\202\0129\000\242\0129\007\018\005.\0129\0129\t\210\0129\0129\0129\0129\t\170\0129\0129\017\206\0129\0129\0129\n\178\0129\0129\0129\0129\t\170\0129\b\197\0129\0129\0129\0129\0129\0129\0129\0129\020\214\016\186\0129\b\186\0129\005\238\0129\0129\0129\0129\0129\b\197\0129\005:\0129\b\197\0129\019\"\0129\0129\0129\021z\012f\0129\0129\0129\0129\0129\0129\0129\0129\007\018\0129\0129\0129\0129\0129\0129\0129\0129\0129\0129\0129\020\190\0129\0129\0129\0129\0129\000\242\0129\0129\019\018\001\006\004~\001\194\0129\0129\0129\0129\t\237\0129\0129\028\006\0129\0129\0129\0129\0129\005\214\0129\0129\021\142\0129\0129\005\194\0129\0129\0129\0129\0129\0129\0129\0129\0129\0129\0129\0129\0129\0129\018\014\007\138\0129\0129\0129\0129\012I\012I\005\202\012I\000\242\012I\000\242\006\134\012I\012I\003*\012I\012I\012I\012I\007e\012I\012I\018\018\012I\012I\012I\005\222\012I\012I\012I\012I\005\242\012I\b\177\012I\012I\012I\012I\012I\012I\012I\012I\020\214\016\206\012I\017\014\012I\006\202\012I\012I\012I\012I\012I\b\177\012I\000\242\012I\b\177\012I\019F\012I\012I\012I\021\158\012\146\012I\012I\012I\012I\012I\012I\012I\012I\r\254\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\020\190\012I\012I\012I\012I\012I\000\242\012I\012I\018\170\021\146\001\234\t\226\012I\012I\012I\012I \146\012I\012I\021\198\012I\012I\012I\012I\012I\bv\012I\012I\006B\012I\012I\005\194\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\n\030\011\n\012I\012I\012I\012I\012A\012A\005\202\012A\000\242\012A\005\194\002J\012A\012A\006J\012A\012A\012A\012A\016\146\012A\012A\017\254\012A\012A\012A\017\226\012A\012A\012A\012A\006V\012A\005\202\012A\012A\012A\012A\012A\012A\012A\012A\020\214\017~\012A\018\002\012A\019\030\012A\012A\012A\012A\012A\t\222\012A\001\250\012A\027\194\012A\019j\012A\012A\012A\024\186\012\210\012A\012A\012A\012A\012A\012A\012A\012A\025\130\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\028r\012A\012A\012A\012A\012A\016\198\012A\012A\021\202\022r\n>\nZ\012A\012A\012A\012A\n\190\012A\012A\023\006\012A\012A\012A\012A\012A\006^\012A\012A\024\198\012A\012A\000\242\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\023*\t\222\012A\012A\012A\012A\012\181\012\181\001\250\012\181\018V\012\181\005\194\012n\012\181\012\181\027\198\012\181\012\181\012\181\012\181\025\158\012\181\012\181\017\186\012\181\012\181\012\181\018.\012\181\012\181\012\181\012\181\018Z\012\181\005\202\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\028z\nZ\012\181\018\206\012\181\019\186\012\181\012\181\012\181\012\181\012\181\t\222\012\181\000\242\012\181\020\190\012\181\019\134\012\181\012\181\012\181\000\242\022v\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181$v\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\020\190\012\181\012\181\012\181\012\181\012\181\017v\012\181\012\181\023\n\024\202\000\242\nZ\012\181\012\181\012\181\012\181\006\006\012\181\012\181\0282\012\181\012\181\012\181\012\181\012\181\020\162\012\181\012\181\006\138\012\181\012\181\000\242\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\012\181\020\166%#\012\181\012\181\012\181\012\181\004\189\004\189\004*\004\189\017\254\004\189\005\194\012\154\004\189\004\189\020\214\004\189\004\189\004\189\004\189\n\029\004\189\004\189\005\185\004\189\004\189\004\189#B\004\189\004\189\004\189\004\189\019B\004\189\005\202\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\020\214\021\186\004\189\b\145\004\189\002\254\004\189\004\189\004\189\004\189\004\189\004\181\004\189\000\242\004\189\020\190\004\189\000\242\004\189\004\189\004\189\024\214 \246\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\005\185\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189 \250\r^\004\189\004\189\rf\r\234\023\182\004\189\004\189\028\186\0065\000\242\000\242\004\189\004\189\004\189\004\189\n\217\004\189\004\189\006\162\004\189\004\189\004\189\004\189\rn\005\161\r\242\004\189\028\158\004\189\004\189\005\194\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\189\004\181\004\189\004\189\004\189\004\189\004\189\002q\002q\005\202\002q\nn\002q\000\242\012\218\003r\002q\020\214\003\022\002q\r\162\002q\005\161\003\130\002q\018V\002q\002q\002q\006\206\002q\002q\002q\001\238\007j\r\218\011a\003\134\002q\002q\002q\002q\002q\r\226\002q\005\161\021\214\003\138\019\198\004j\031J\002q\002q\002q\002q\002q\022>\004\170\000\242\001\194\011a\002q\n\217\002q\002q\003b\031\214\024\030\004\178\n\250\002q\002q\002q\n\254\011\002\011\014\021\254\018\026\007\154\002q\002q\002q\002q\002q\002q\002q\002q\002q\006\230\r^\007\166\007\170\rf\r\234\022\210\002q\002q\027f\007Q\022\002\007n\002q\007\182\007\186\002q\003r\002q\002q\007R\002q\002q\002q\002q\018\"\n\021\018\158\002q\022\214\002q\002q\005\194\002q\002q\002q\002q\002q\002q\002q\007\190\011\022\002q\002q\002q\011.\005J\018~\007\018\002q\002q\002q\002q\012\157\012\157\005\202\012\157\028*\012\157\023\198\027\234\003r\012\157\004\153\003\022\012\157\012\157\012\157\017\202\003\130\012\157\018\130\012\157\012\157\012\157\bb\012\157\012\157\012\157\001\238\n!\012\157\005\161\003\134\012\157\012\157\012\157\012\157\012\157\012\157\012\157\005\161\018\242\003\138\bz\004j\b\206\012\157\012\157\012\157\012\157\012\157\004\177\004\170\000\242\001\194\020\190\012\157\tJ\012\157\012\157\003b\tj\026^\004\178\n\250\012\157\012\157\012\157\n\254\011\002\011\014\028\206\012\157\007\154\012\157\012\157\012\157\012\157\012\157\012\157\012\157\012\157\012\157\031\018\012\157\007\166\007\170\012\157\012\157\031\134\012\157\012\157\007M!6\031B\000\242\012\157\007\182\007\186\012\157\005\026\012\157\012\157\016\161\012\157\012\157\012\157\012\157\012\157\tr\012\157\012\157\n\017\012\157\012\157\031\202\012\157\012\157\012\157\012\157\012\157\012\157\012\157\007\190\011\022\012\157\012\157\012\157\011.\005J\004\177\t\182\012\157\012\157\012\157\012\157\012\153\012\153\t\194\012\153\031\210\012\153\005\194 v\003r\012\153\020\214\003\022\012\153\012\153\012\153 j\003\130\012\153\000\242\012\153\012\153\012\153$\218\012\153\012\153\012\153\001\238\n\017\012\153\005\202\003\134\012\153\012\153\012\153\012\153\012\153\012\153\012\153\028\210\022\250\003\138\011\254\004j\nn\012\153\012\153\012\153\012\153\012\153\005]\004\170\012\n\001\194\031\166\012\153\000\242\012\153\012\153\003b\012\"!:\004\178\n\250\012\153\012\153\012\153\n\254\011\002\011\014\031\206\012\153\007\154\012\153\012\153\012\153\012\153\012\153\012\153\012\153\012\153\012\153\012&\012\153\007\166\007\170\012\153\012\153#\018\012\153\012\153 \006\012.\016\173\000\242\012\153\007\182\007\186\012\153\028z\012\153\012\153 \202\012\153\012\153\012\153\012\153\012\153\012>\012\153\012\153\012J\012\153\012\153\005\194\012\153\012\153\012\153\012\153\012\153\012\153\012\153\007\190\011\022\012\153\012\153\012\153\011.\005J\005]\nn\012\153\012\153\012\153\012\153\002\213\002\213\005\202\002\213\005\194\002\213\012z\001\234\003r\002\213\007y\003\022\002\213\r\162\002\213\"\222\003\130\002\213\016!\002\213\002\213\002\213\012\186\002\213\002\213\002\213\001\238\005\202\r\218\018\014\003\134\002\213\002\213\002\213\002\213\002\213\r\226\002\213\016!\007y\003\138\007y\004j\012\194\002\213\002\213\002\213\002\213\002\213\005Y\004\170\"\138\001\194\019f\002\213\005\026\002\213\002\213\003b\000\242#n\004\178\n\250\002\213\002\213\002\213\n\254\011\002\011\014\012\202\018\026\007\154\002\213\002\213\002\213\002\213\002\213\002\213\002\213\002\213\002\213\r\002\002\213\007\166\007\170#\178\002\213\005\161\002\213\002\213\005\161\005\161%S\000\242\002\213\007\182\007\186\002\213\nn\002\213\002\213\005\161\002\213\002\213\002\213\002\213\005\161%C\0126\002\213\005\161\002\213\002\213\005*\002\213\002\213\002\213\002\213\002\213\002\213\002\213\007\190\011\022\002\213\002\213\002\213\011.\005J\005Y\005\161\002\213\002\213\002\213\002\213\005\161\005\161\005\161\002r\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\000\242\005\161\000\242\005\161\005\161\000\242\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\rb\005\161\005\161\b=\r\170\005\161\005\161\005\161\r\210\005\161\005\161\005\161\005\161\005\161$\154\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\b=\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\000\242\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\r\222\005\161\005\161\r\238\031\n\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\001f\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\005\161\000\242\005\161\005\161\005\161\001~\003\162\001\142\005\161\001.\003\218\003\222\016\178\005\161\016\218\005\161\002E\002E\003\166\003\170\005\161\005\161\005\161\005\161\t\174\001\185\005\161\005\161\005\161\005\161\003\174\000\197\005\161\000\197\000\242\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\n\000\197\001\185\000\197\000\197\000\242\000\197\000\197\016\242\018~\000\197\000\197$\158\000\197\000\197\000\197\000\197\005\185\000\197 2\000\197\000\197\017\138\015\233\000\197\000\197\000\197\n\202\000\197\000\197\000\197\002E\000\197\019\210\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\015\233\015\233\000\197\000\197\015\233\n\206\000\197\000\197\000\197\031~\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\004*\019\238\000\197\020\n\028Z\000\197\020*\000\197\000\197\000\197\000\197\001\185\000\197\002E\023b\n\190\011M\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\242\004\173\023\138\000\197\000\242\r\022\001\185\020\190\000\226\002E\002E\025\190\000\197\000\n\001\185\006\249\r*\"\182\017J\000\197\000\197\000\197\000\197\022N\002E\000\197\000\197\000\197\000\197\002\185\002\185\002E\002\185\022~\002\185\015\233\000\n\003r\002\185\004\210\003\022\002\185\011\006\002\185\002E\003\130\002\185\022R\002\185\002\185\002\185\r\198\002\185\002\185\002\185\001\238\023\170\022\130\n\210\003\134\002\185\002\185\002\185\002\185\002\185\006\249\002\185\002E\001\006\003\138\001\194\004j\023\174\002\185\002\185\002\185\002\185\002\185\011M\004\170\004\173\011\018\027\026\002\185\006\249\002\185\002\185\003b\n\217\023\214\004\178\n\250\002\185\002\185\002\185\n\254\011\002\011\014\020\214\tN\007\154\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\023\242\r^\007\166\007\170\rf\r\234\002E\002\185\002\185\002E\"\186\003\218\003\222\002\185\007\182\007\186\002\185\023\022\002\185\002\185\000\242\002\185\002\185\002\185\002\185\rn\025\230\r\242\002\185\024&\002\185\002\185\000\n\002\185\002\185\002\185\002\185\002\185\002\185\002\185\007\190\011\022\002\185\002\185\002\185\011.\005J\0246\002E\002\185\002\185\002\185\002\185\002\225\002\225\024J\002\225\024v\002\225\024\130\n>\004\130\002\225\002E\002E\002\225\025\018\002\225#\026\n\217\002\225\011e\002\225\002\225\002\225\000\n\002\225\002\225\002\225\003r\011-\003\218\027\022\025\026\002\225\002\225\002\225\002\225\002\225\026V\002\225\002E\003r\002E\002E\011e\027*\002\225\002\225\002\225\002\225\002\225$\222\011R\001\250\001\194\002E\002\225\026j\002\225\002\225\026n\000\242\"\234\020\170\021\162\002\225\002\225\002\225\021\218\022\018\022\"\b\202\004v\b\201\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\001\006\r^\001\194\023~\rf\r\234\003\022\002\225\002\225\0119\b\201\000\242\020\190\002\225\b\201\0272\002\225\027J\002\225\002\225\027\210\002\225\002\225\002\225\002\225\rn\021\n\r\242\002\225\r\134\002\225\002\225\0119\002\225\002\225\002\225\002\225\002\225\002\225\002\225$j\rr\002\225\002\225\002\225\023\130\021\"\027\214%\143\002\225\002\225\002\225\002\225\002\221\002\221\000\242\002\221\019\190\002\221\019\202\b\138\023\142\002\221\030\134\b.\002\221\028\014\002\221\001\234\001\197\002\221\b\170\002\221\002\221\002\221\b\182\002\221\002\221\002\221\002E\002E\026\242\"\238\028\018\002\221\002\221\002\221\002\221\002\221\001\197\002\221\007\186\028:\028>\002E\023\150#v\002\221\002\221\002\221\002\221\002\221\030\146\020\214\b\138\b\165\000\n\002\221\b.\002\221\002\221\028V\005\018\029\002\029\006\b\170\002\221\002\221\002\221\b\182\030F\0045\002E\r\022\0119\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\r*\r^\0045\002E\rf\r\234\000\242\002\221\002\221$n\029*\029.\005~\002\221\000\n\005U\002\221\029>\002\221\002\221\029N\002\221\002\221\002\221\002\221\rn\001\197\r\242\002\221\029Z\002\221\002\221\029\142\002\221\002\221\002\221\002\221\002\221\002\221\002\221\b\173\024\n\002\221\002\221\002\221\002E\r\022\001\197\005\161\002\221\002\221\002\221\002\221\002\189\002\189\001\197\002\189\r*\002\189\000\242\b\173\003r\002\189\001\197\b\173\002\189\029\146\002\189\003\254\001\221\002\189\004R\002\189\002\189\002\189\016%\002\189\002\189\002\189\001\238\029\246\030&\030.\030>\002\189\002\189\002\189\002\189\002\189\001\221\002\189\030\142\004\130#\186\005U\016%\030\174\002\189\002\189\002\189\002\189\002\189\001\234\004Z\017\218\000\242\026\202\002\189\b\138\002\189\002\189\003b\b.\011\222\030\238\031\026\002\189\002\189\002\189\b\170\017\246\023~\018\006\b\182\003\022\002\189\002\189\002\189\002\189\002\189\002\189\002\189\002\189\002\189\001\006\r^\001\194\000\242\rf\r\234\b\173\002\189\002\189\031*\t\162\031R$:\002\189\031V\031b\002\189\031r\002\189\002\189\031\142\002\189\002\189\002\189\002\189\rn\001\221\r\242\002\189\023\130\002\189\002\189 ^\002\189\002\189\002\189\002\189\002\189\002\189\002\189\031\158\031\178\002\189\002\189\002\189\023\142\r\022\001\221\018&\002\189\002\189\002\189\002\189\002i\002i\001\221\002i\r*\002i\t\165\002~\031\222\002i\001\221\018N\002i\018v\002i\031\226\001\213\002i\031\238\002i\002i\002i\007\186\002i\002i\002i\031\254 \018!\006!^!\134\002i\002i\002i\002i\002i\001\213\002i\"\014\"\022\004^\t\165\".\003r\002i\002i\002i\002i\002i\":\003\254\"B\"\162\004R\002i\t\165\002i\002i\"\246\t\165\011\146\001\238\024\238\002i\002i\002i\t\165#\n#\030#f\t\165#z\002i\002i\002i\002i\002i\002i\002i\002i\002i#\146\002i#\190#\214\004Z\002i\023~\002i\002i\003\022\n\190#\242\003b\002i$\026$V\002i$\134\002i\002i$\146\002i\002i\002i\002i\000\242\001\213\030\130\002i$\167\002i\002i$\183\r\022\002i\002i\002i\002i\002i\002i$\202$\230\002i\002i\r*\t\162\r\022\001\213\023\130\002i\002i\002i\002i\011\029\011\029\001\213\011\029\r*\011\029%\003\t\222%\019\011\029\001\213\023\142\011\029\030\166\011\029\001\234\001\205\011\029%/\011\029\011\029\011\029\019\022\011\029\011\029\011\029\024\242#V%\131%\159\026.\011\029\011\029\011\029\011\029\011\029\001\205\011\029\019:%\170\019^\007\186%\255&\019\011\029\011\029\011\029\011\029\011\029&\027\t\241\nZ\030\178&W\011\029&_\011\029\011\029\000\000\005\018\002E\006\r\000\000\011\029\011\029\011\029\000\000\000\000\t\014\003r\030F\000\242\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\000\000\011\029\000\000\000\000\006\r\011\029\000\000\011\029\011\029\000\n\000\000\000\242\005~\011\029\000\000\0069\011\029\000\000\011\029\011\029\000\000\011\029\011\029\011\029\011\029\023V\001\205\002E\011\029\000\000\011\029\011\029\004v\r\022\011\029\011\029\011\029\011\029\011\029\011\029\002E\002E\011\029\011\029\r*\000\000\r\022\001\205\001\206\011\029\011\029\011\029\011\029\002\217\002\217\001\205\002\217\r*\002\217\000\000\b\138\004\130\002\217\001\205\b.\002\217\000\000\002\217\000\000\000\000\002\217\b\170\002\217\002\217\002\217\b\182\002\217\002\217\002\217\000\000\001\210\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\002\217\n\005\000\000\001\214\tJ\n\005\000\000\002\217\002\217\002\217\002\217\002\217\000\000\011R\000\000\022^\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\020\170\021\162\002\217\002\217\002\217\021\218\022\018\022\"\000\000\000\000\b\214\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\000\000\002\217\n\005\003r\000\000\002\217\n\017\002\217\002\217\n\017\000\000\b\218\000\000\002\217\000\000\000\000\002\217\000\000\002\217\002\217\000\000\002\217\002\217\002\217\002\217\000\000\n\005\031\134\002\217\000\000\002\217\002\217\000\000\014\n\002\217\002\217\002\217\002\217\002\217\002\217\000\000\002E\002\217\002\217\002\217\r\246\027\162\004v\n\017\002\217\002\217\002\217\002\217\011\r\011\r\000\242\011\r\000\000\011\r\015\241\000\000\017\178\011\r\017\194\n\017\011\r\006.\011\r\000\000\000\000\011\r\000\n\011\r\011\r\011\r\000\000\011\r\011\r\011\r\015\241\015\241\000\000\000\000\015\241\011\r\011\r\011\r\011\r\011\r\002E\011\r\000\000\000\000\000\000\n\017\000\000\000\000\011\r\011\r\011\r\011\r\011\r\002E\002E\b\138\012\166\000\000\011\r\b.\011\r\011\r\000\000\000\000\000\000\000\000\b\170\011\r\011\r\011\r\b\182\016\029\004\130\000\000\n\017\000\242\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\000\000\011\r\000\000\000\000\000\000\011\r\016\029\011\r\011\r\002j\000\000\000\000\002n\011\r\000\000\000\242\011\r\000\000\011\r\011\r\000\000\011\r\011\r\011\r\011\r\015\241\002z\000\000\011\r\b\002\011\r\011\r\000\000\r\022\011\r\011\r\011\r\011\r\011\r\011\r\004\198\004\202\011\r\011\r\r*\b\222\000\000\004\214\000\000\011\r\011\r\011\r\011\r\004\021\004\021\002\134\004\021\000\000\004\021\rq\000\000\000\000\004\021\000\000\b\138\004\021\000\000\004\021\b.\012\170\014J\000\000\004\021\014\158\004\021\b\170\004\021\004\021\004\021\b\182\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\004\021\000\000\000\000\000\000\rq\000\000\000\000\004\021\004\021\015B\015Z\004\021\000\000\000\000\000\000\002\138\000\000\004\021\rq\015r\004\021\000\000\rq\017\006\000\000\000\000\004\021\004\021\000\242\rq\000\000\000\000\000\000\rq\000\000\004\021\004\021\014b\014\226\015\138\015\162\015\210\004\021\004\021\000\000\004\021\000\000\002J\000\000\004\021\003\022\004\021\015\234\000\000\000\000\bI\000\000\004\021\000\000\"\210\004\021\000\000\004\021\016\002\000\000\004\021\004\021\004\021\004\021\000\000\0119\000\000\004\021\020\190\004\021\004\021\bI\016b\004\021\004\021\016z\015\186\004\021\004\021\000\000\000\000\004\021\016\026\004\021$\194\r\134\001\250\000\000\004\021\004\021\0162\016J\0039\0039\000\000\0039\000\000\0039\000\242\000\000\023\142\0039\000\000\000\000\0039\000\000\0039\000\000\001\177\0039\000\000\0039\0039\0039\000\000\0039\0039\0039\000\000\000\000\000\000\003\182\000\000\0039\0039\0039\0039\0039\001\177\0039\007\186\000\000\000\000\003\186\003\190\000\000\0039\0039\0039\0039\0039\000\000\000\000\000\000\000\000\003\194\0039\b\138\0039\0039\000\000\b.\"\214\b\185\000\000\0039\0039\0039\b\170\020\214\000\000\000\000\b\182\000\000\0039\0039\0039\0039\0039\0039\0039\0039\0039\b\185\0039\000\000\000\000\b\185\0039\r\022\0039\0039\000\000\000\000\000\000\000\000\0039\000\000\0119\0039\r*\0039\0039\000\000\0039\0039\0039\0039\000\000\001\177\000\000\0039\000\000\0039\0039\000\000\r\022\0039\0039\0039\0039\0039\0039\003\130\000\000\0039\0039\r*\000\000\000\000\001\177\000\000\0039\0039\0039\0039\0035\0035\001\177\0035\007\230\0035\015\237\000\000\000\000\0035\020\222\000\000\0035\000\000\0035\b\185\000\000\0035\007\234\0035\0035\0035\0256\0035\0035\0035\015\237\015\237\000\000\000\000\015\237\0035\0035\0035\0035\0035\000\000\0035\000\000\000\000\000\000\r\022\007\154\025:\0035\0035\0035\0035\0035\000\000\000\000\000\000\r*\000\000\0035\000\000\0035\0035\000\000\000\000\000\000\000\000\000\000\0035\0035\0035\007\182\000\000\000\000\000\000\000\000\000\242\0035\0035\014b\0035\0035\0035\0035\0035\0035\000\000\0035\000\000\023~\000\000\0035\003\022\0035\0035\000\000\000\000\007\190\000\000\0035\000\000\000\000\0035\000\000\0035\0035\000\000\0035\0035\0035\0035\015\237\000\000\000\000\0035\000\000\0035\0035\000\000\0035\0035\0035\0035\0035\0035\0035\000\000\000\000\0035\0035\0035\023\130\000\000\000\000\000\000\0035\0035\0035\0035\003\t\003\t\r\022\003\t\025>\003\t\000\242\025N\023\142\003\t\000\000\000\000\003\t\r*\003\t\000\000\000\000\003\t\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\003r\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\003\t\007\186\000\000\000\000\rF\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\003\t\b\138\003\t\003\t\000\000\b.\000\000\000\000\000\000\003\t\003\t\003\t\b\170\030Z\000\000\018\162\b\182\004v\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\000\000\003\t\000\000\000\000\018\198\003\t\018\234\003\t\003\t\000\000\000\000\000\242\000\000\003\t\000\000\000\000\003\t\000\000\003\t\003\t\000\000\003\t\003\t\003\t\003\t\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\r\022\003\t\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\003\t\r*\000\000\017\026\000\000\000\000\003\t\003\t\003\t\003\t\003\005\003\005\000\000\003\005\000\000\003\005\000\242\017\"\000\000\003\005\003r\017.\003\005\003\022\003\005\000\000\000\000\003\005\017:\003\005\003\005\003\005\017F\003\005\003\005\003\005\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\003\005\000\000\003\005\n\001\000\000\000\000\t\157\n\001\000\000\003\005\003\005\003\005\003\005\003\005\000\000\000\000\000\000\026\150\000\000\003\005\t\157\003\005\003\005\000\000\b.\000\000\000\000\000\000\003\005\003\005\003\005\t\157\000\000\023\142\000\000\t\157\000\000\003\005\003\005\014b\003\005\003\005\003\005\003\005\003\005\003\005\000\000\003\005\n\001\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\t\185\000\000\003\005\000\000\000\000\003\005\007\186\003\005\003\005\000\000\003\005\003\005\003\005\003\005\000\000\n\001\000\000\003\005\000\000\003\005\003\005\000\000\003\005\003\005\003\005\003\005\003\005\003\005\003\005\000\000\000\000\003\005\003\005\003\005\000\000\t\185\000\000\000\000\003\005\003\005\003\005\003\005\003!\003!\000\000\003!\000\000\003!\000\242\t\185\000\000\003!\000\000\b.\003!\006.\003!\000\000\000\000\003!\t\185\003!\003!\003!\t\185\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\003!\000\000\000\000\000\000\t\213\000\000\000\000\003!\003!\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\b\138\003!\003!\000\000\b.\000\000\000\000\000\000\003!\003!\003!\t\213\000\000\000\000\000\000\t\213\000\000\003!\003!\003!\003!\003!\003!\003!\003!\003!\000\000\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\t\205\000\000\003!\000\000\000\000\003!\000\000\003!\003!\000\000\003!\003!\003!\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\r\022\003!\003!\003!\003!\003!\003!\000\000\000\000\003!\003!\r*\000\000\t\205\000\000\000\000\003!\003!\003!\003!\003\029\003\029\000\000\003\029\000\000\003\029\000\242\017^\000\000\003\029\000\000\t\205\003\029\000\000\003\029\000\000\000\000\014J\t\205\003\029\003\029\003\029\t\205\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\003\029\014\202\003\029\000\000\003\029\000\000\000\000\000\000\t\153\000\000\000\000\003\029\003\029\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\003\029\t\153\003\029\003\029\000\000\b.\000\000\000\000\000\000\003\029\003\029\003\029\t\153\000\000\000\000\000\000\t\153\000\000\003\029\003\029\014b\014\226\003\029\003\029\003\029\003\029\003\029\000\000\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\242\000\000\003\029\000\000\000\000\003\029\000\000\003\029\003\029\000\000\003\029\003\029\003\029\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\003\029\003\029\003\029\003\029\003\029\003\029\003\029\000\000\000\000\003\029\003\029\003\029\000\000\020z\000\000\000\000\003\029\003\029\003\029\003\029\003A\003A\000\000\003A\000\000\003A\000\000\017\"\000\000\003A\000\000\017.\003A\000\000\003A\000\000\000\000\003A\017:\003A\003A\003A\017F\003A\003A\003A\000\000\000\000\000\000\000\000\000\000\003A\003A\003A\003A\003A\000\000\003A\000\000\000\000\000\000\000\000\b\169\000\000\003A\003A\003A\003A\003A\000\000\000\000\000\000\000\000\000\000\003A\000\000\003A\003A\000\000\000\000\000\000\000\000\b\169\003A\003A\003A\b\169\000\000\000\000\000\000\000\000\000\000\003A\003A\003A\003A\003A\003A\003A\003A\003A\000\000\003A\000\000\000\000\000\000\003A\000\000\003A\003A\000\000\000\000\000\242\000\000\003A\000\000\000\000\003A\000\000\003A\003A\000\000\003A\003A\003A\003A\000\000\020\238\000\000\003A\000\000\003A\003A\000\000\r\022\003A\003A\003A\003A\003A\003A\000\000\000\000\003A\003A\r*\000\000\000\000\000\000\000\000\003A\003A\003A\003A\003=\003=\000\000\003=\000\000\003=\000\000\b\138\b\169\003=\000\000\b.\003=\000\000\003=\000\000\000\000\003=\b\170\003=\003=\003=\b\182\003=\003=\003=\000\000\004\238\000\000\000\000\000\000\003=\003=\003=\003=\003=\000\000\003=\000\000\000\000\000\000\000\000\000\000\000\000\003=\003=\003=\003=\003=\000\000\000\000\000\000\000\000\000\000\003=\000\000\003=\003=\000\000\000\000\000\000\000\000\000\000\003=\003=\003=\000\000\000\000\000\000\000\000\000\000\000\000\003=\003=\014b\003=\003=\003=\003=\003=\003=\000\000\003=\000\000\000\000\000\000\003=\000\000\003=\003=\000\000\000\000\000\000\000\000\003=\000\000\000\000\003=\000\000\003=\003=\000\000\003=\003=\003=\003=\000\000\000\000\000\000\003=\000\000\003=\003=\000\000\003=\003=\003=\003=\003=\003=\003=\000\000\000\000\003=\003=\003=\000\000\000\000\000\000\000\000\003=\003=\003=\003=\003\001\003\001\000\000\003\001\000\000\003\001\000\000\000\000\000\000\003\001\000\000\000\000\003\001\000\000\003\001\000\000\000\000\003\001\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\000\000\003\001\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\003\001\000\000\000\000\003\001\000\000\003\001\003\001\000\000\003\001\003\001\003\001\003\001\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\r\022\003\001\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\003\001\r*\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\002\253\002\253\000\000\002\253\000\000\002\253\000\000\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\000\000\000\000\002\253\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\253\000\000\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\014b\002\253\002\253\002\253\002\253\002\253\002\253\000\000\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\002\253\000\000\002\253\002\253\002\253\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\002\253\002\253\002\253\002\253\002\253\002\253\002\253\000\000\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\003\025\003\025\000\000\003\025\000\000\003\025\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\000\000\000\000\003\025\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\003\025\000\000\003\025\003\025\003\025\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\r\022\003\025\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\003\025\r*\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\021\003\021\000\000\003\021\000\000\003\021\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\000\000\000\000\014J\000\000\003\021\003\021\003\021\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\003\021\014\202\003\021\000\000\003\021\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\014b\014\226\003\021\003\021\003\021\003\021\003\021\000\000\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\003\021\000\000\003\021\003\021\003\021\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\003\021\003\021\003\021\003\021\003\021\003\021\003\021\000\000\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\003\021\003\021\003\021\003\021\003\017\003\017\000\000\003\017\000\000\003\017\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\000\000\000\000\003\017\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\003\017\000\000\003\017\003\017\003\017\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\r\022\003\017\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\003\017\r*\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\r\003\r\000\000\003\r\000\000\003\r\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\000\000\000\000\014J\000\000\003\r\003\r\003\r\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\014\202\003\r\000\000\003\r\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\014b\014\226\003\r\003\r\003\r\003\r\003\r\000\000\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\003\r\003\r\003\r\003\r\000\000\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\003\r\003\r\003\r\003\r\003a\003a\000\000\003a\000\000\003a\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\000\000\000\000\003a\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\003a\003a\003a\003a\000\000\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\003a\000\000\003a\003a\003a\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\r\022\003a\003a\003a\003a\003a\003a\000\000\000\000\003a\003a\r*\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003]\003]\000\000\003]\000\000\003]\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\000\000\000\000\014J\000\000\003]\003]\003]\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003]\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\015B\015Z\003]\000\000\000\000\000\000\000\000\000\000\003]\000\000\015r\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\014b\014\226\015\138\015\162\015\210\003]\003]\000\000\003]\000\000\000\000\000\000\003]\000\000\003]\015\234\000\000\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\016\002\000\000\003]\003]\003]\003]\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\003]\003]\003]\003]\015\186\003]\003]\000\000\000\000\003]\016\026\003]\000\000\000\000\000\000\000\000\003]\003]\0162\016J\0031\0031\000\000\0031\000\000\0031\000\000\000\000\000\000\0031\000\000\000\000\0031\000\000\0031\000\000\000\000\0031\000\000\0031\0031\0031\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\0031\0031\0031\0031\000\000\0031\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\0031\000\000\000\000\0031\000\000\0031\0031\000\000\0031\0031\0031\0031\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\r\022\0031\0031\0031\0031\0031\0031\000\000\000\000\0031\0031\r*\000\000\000\000\000\000\000\000\0031\0031\0031\0031\003-\003-\000\000\003-\000\000\003-\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\000\000\000\000\014J\000\000\003-\003-\003-\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\014\202\003-\000\000\003-\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\014b\014\226\003-\003-\003-\003-\003-\000\000\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\003-\000\000\003-\003-\003-\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\003-\003-\003-\003-\003-\003-\003-\000\000\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003)\003)\000\000\003)\000\000\003)\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\000\000\000\000\003)\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\003)\003)\003)\003)\000\000\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\003)\000\000\003)\003)\003)\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\r\022\003)\003)\003)\003)\003)\003)\000\000\000\000\003)\003)\r*\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003%\003%\000\000\003%\000\000\003%\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\000\000\000\000\014J\000\000\003%\003%\003%\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\014\202\003%\000\000\003%\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\014b\014\226\003%\003%\003%\003%\003%\000\000\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\003%\000\000\003%\003%\003%\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\003%\003%\003%\003%\003%\003%\003%\000\000\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\003%\003%\003%\003%\003Q\003Q\000\000\003Q\000\000\003Q\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\000\000\000\000\003Q\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\003Q\000\000\003Q\003Q\003Q\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\r\022\003Q\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\003Q\r*\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003M\003M\000\000\003M\000\000\003M\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\000\000\000\000\014J\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\003M\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\015B\015Z\003M\000\000\000\000\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\014b\014\226\015\138\015\162\003M\003M\003M\000\000\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\003M\000\000\003M\003M\003M\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\003M\003M\003M\003M\015\186\003M\003M\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\003M\002\249\002\249\000\000\002\249\000\000\002\249\000\000\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\002\249\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\002\249\000\000\002\249\002\249\002\249\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\r\022\002\249\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\002\249\r*\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\245\002\245\000\000\002\245\000\000\002\245\000\000\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\000\000\000\000\014J\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\014\202\002\245\000\000\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\014b\014\226\002\245\002\245\002\245\002\245\002\245\000\000\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\002\245\000\000\002\245\002\245\002\245\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\002\245\002\245\002\245\002\245\002\245\002\245\002\245\000\000\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\002\241\002\241\000\000\002\241\000\000\002\241\000\000\000\000\000\000\002\241\000\000\000\000\002\241\000\000\002\241\000\000\000\000\002\241\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\000\000\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\000\000\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\002\241\000\000\000\000\002\241\000\000\002\241\002\241\000\000\002\241\002\241\002\241\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\r\022\002\241\002\241\002\241\002\241\002\241\002\241\000\000\000\000\002\241\002\241\r*\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\237\002\237\000\000\002\237\000\000\002\237\000\000\000\000\000\000\002\237\000\000\000\000\002\237\000\000\002\237\000\000\000\000\014J\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\002\237\000\000\002\237\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\015B\015Z\002\237\000\000\000\000\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\014b\014\226\015\138\015\162\002\237\002\237\002\237\000\000\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\002\237\000\000\000\000\002\237\000\000\002\237\002\237\000\000\002\237\002\237\002\237\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\002\237\002\237\002\237\002\237\015\186\002\237\002\237\000\000\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\003\145\003\145\000\000\003\145\000\000\003\145\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\000\000\000\000\003\145\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\003\145\000\000\003\145\003\145\003\145\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\r\022\003\145\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\003\145\r*\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\141\003\141\000\000\003\141\000\000\003\141\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\000\000\000\000\014J\000\000\003\141\003\141\003\141\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\003\141\000\000\003\141\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\015B\015Z\003\141\000\000\000\000\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\000\000\000\000\000\000\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\014b\014\226\015\138\003\141\003\141\003\141\003\141\000\000\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\003\141\000\000\003\141\003\141\003\141\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\003\141\003\141\003\141\003\141\015\186\003\141\003\141\000\000\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\003\141\003\141\003\141\003\141\002\233\002\233\000\000\002\233\000\000\002\233\000\000\000\000\000\000\002\233\000\000\000\000\002\233\000\000\002\233\000\000\000\000\002\233\000\000\002\233\002\233\002\233\000\000\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\002\233\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\000\000\002\233\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\000\000\002\233\000\000\000\000\002\233\000\000\002\233\002\233\000\000\002\233\002\233\002\233\002\233\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\r\022\002\233\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\002\233\r*\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\229\002\229\000\000\002\229\000\000\002\229\000\000\000\000\000\000\002\229\000\000\000\000\002\229\000\000\002\229\000\000\000\000\014J\000\000\002\229\002\229\002\229\000\000\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\002\229\000\000\002\229\000\000\000\000\000\000\000\000\000\000\000\000\002\229\002\229\015B\015Z\002\229\000\000\000\000\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\000\000\002\229\002\229\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\229\002\229\014b\014\226\015\138\015\162\002\229\002\229\002\229\000\000\002\229\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\002\229\000\000\000\000\002\229\000\000\002\229\002\229\000\000\002\229\002\229\002\229\002\229\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\002\229\002\229\002\229\002\229\015\186\002\229\002\229\000\000\000\000\002\229\002\229\002\229\000\000\000\000\000\000\000\000\002\229\002\229\002\229\002\229\003Y\003Y\000\000\003Y\000\000\003Y\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\000\000\000\000\003Y\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\003Y\000\000\003Y\003Y\003Y\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\r\022\003Y\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\003Y\r*\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003U\003U\000\000\003U\000\000\003U\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\000\000\000\000\014J\000\000\003U\003U\003U\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\003U\000\000\003U\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\015B\015Z\003U\000\000\000\000\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\014b\014\226\015\138\015\162\003U\003U\003U\000\000\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\003U\000\000\003U\003U\003U\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\003U\003U\003U\003U\015\186\003U\003U\000\000\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\003U\003U\003U\003U\003I\003I\000\000\003I\000\000\003I\000\000\000\000\000\000\003I\000\000\000\000\003I\000\000\003I\000\000\000\000\003I\000\000\003I\003I\003I\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\003I\003I\000\000\003I\000\000\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\003I\003I\003I\003I\003I\003I\000\000\003I\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\000\000\000\000\000\000\003I\000\000\000\000\003I\000\000\003I\003I\000\000\003I\003I\003I\003I\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\r\022\003I\003I\003I\003I\003I\003I\000\000\000\000\003I\003I\r*\000\000\000\000\000\000\000\000\003I\003I\003I\003I\003E\003E\000\000\003E\000\000\003E\000\000\000\000\000\000\003E\000\000\000\000\003E\000\000\003E\000\000\000\000\014J\000\000\003E\003E\003E\000\000\003E\003E\003E\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\003E\000\000\003E\000\000\000\000\000\000\000\000\000\000\000\000\003E\003E\015B\015Z\003E\000\000\000\000\000\000\000\000\000\000\003E\000\000\003E\003E\000\000\000\000\000\000\000\000\000\000\003E\003E\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003E\003E\014b\014\226\015\138\015\162\003E\003E\003E\000\000\003E\000\000\000\000\000\000\003E\000\000\003E\003E\000\000\000\000\000\000\000\000\003E\000\000\000\000\003E\000\000\003E\003E\000\000\003E\003E\003E\003E\000\000\000\000\000\000\003E\000\000\003E\003E\000\000\003E\003E\003E\003E\015\186\003E\003E\000\000\000\000\003E\003E\003E\000\000\000\000\000\000\000\000\003E\003E\003E\003E\003i\003i\000\000\003i\000\000\003i\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\000\000\000\000\003i\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\003i\003i\003i\003i\000\000\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\003i\000\000\003i\003i\003i\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\r\022\003i\003i\003i\003i\003i\003i\000\000\000\000\003i\003i\r*\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003e\003e\000\000\003e\000\000\003e\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\000\000\000\000\014J\000\000\003e\003e\003e\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003e\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\015B\015Z\003e\000\000\000\000\000\000\000\000\000\000\003e\000\000\015r\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\014b\014\226\015\138\015\162\015\210\003e\003e\000\000\003e\000\000\000\000\000\000\003e\000\000\003e\015\234\000\000\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\016\002\000\000\003e\003e\003e\003e\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\003e\003e\003e\003e\015\186\003e\003e\000\000\000\000\003e\016\026\003e\000\000\000\000\000\000\000\000\003e\003e\0162\016J\003q\003q\000\000\003q\000\000\003q\000\000\000\000\000\000\003q\000\000\000\000\003q\000\000\003q\000\000\000\000\003q\000\000\003q\003q\003q\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\003q\003q\003q\003q\000\000\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\003q\000\000\000\000\003q\000\000\003q\003q\000\000\003q\003q\003q\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\r\022\003q\003q\003q\003q\003q\003q\000\000\000\000\003q\003q\r*\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003m\003m\000\000\003m\000\000\003m\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\000\000\000\000\014J\000\000\003m\003m\003m\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\003m\000\000\003m\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\015B\015Z\003m\000\000\000\000\000\000\000\000\000\000\003m\000\000\015r\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\014b\014\226\015\138\015\162\015\210\003m\003m\000\000\003m\000\000\000\000\000\000\003m\000\000\003m\015\234\000\000\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\016\002\000\000\003m\003m\003m\003m\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\003m\003m\003m\003m\015\186\003m\003m\000\000\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\003m\003m\0162\016J\003y\003y\000\000\003y\000\000\003y\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\000\000\000\000\003y\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\003y\003y\003y\003y\000\000\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\003y\000\000\003y\003y\003y\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\r\022\003y\003y\003y\003y\003y\003y\000\000\000\000\003y\003y\r*\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003u\003u\000\000\003u\000\000\003u\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\000\000\000\000\014J\000\000\003u\003u\003u\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\003u\000\000\003u\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\015B\015Z\003u\000\000\000\000\000\000\000\000\000\000\003u\000\000\015r\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\014b\014\226\015\138\015\162\015\210\003u\003u\000\000\003u\000\000\000\000\000\000\003u\000\000\003u\015\234\000\000\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\016\002\000\000\003u\003u\003u\003u\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\003u\003u\003u\003u\015\186\003u\003u\000\000\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\003u\003u\0162\016J\011\021\011\021\000\000\011\021\000\000\011\021\000\000\000\000\000\000\011\021\000\000\000\000\011\021\000\000\011\021\000\000\000\000\011\021\000\000\011\021\011\021\011\021\000\000\011\021\011\021\011\021\000\000\000\000\000\000\000\000\000\000\011\021\011\021\011\021\011\021\011\021\000\000\011\021\000\000\000\000\000\000\000\000\000\000\000\000\011\021\011\021\011\021\011\021\011\021\000\000\000\000\000\000\000\000\000\000\011\021\000\000\011\021\011\021\000\000\000\000\000\000\000\000\000\000\011\021\011\021\011\021\000\000\000\000\000\000\000\000\000\000\000\000\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\000\000\011\021\000\000\000\000\000\000\011\021\000\000\011\021\011\021\000\000\000\000\000\000\000\000\011\021\000\000\000\000\011\021\000\000\011\021\011\021\000\000\011\021\011\021\011\021\011\021\000\000\000\000\000\000\011\021\000\000\011\021\011\021\000\000\r\022\011\021\011\021\011\021\011\021\011\021\011\021\000\000\000\000\011\021\011\021\r*\000\000\000\000\000\000\000\000\011\021\011\021\011\021\011\021\011\017\011\017\000\000\011\017\000\000\011\017\000\000\000\000\000\000\011\017\000\000\000\000\011\017\000\000\011\017\000\000\000\000\014J\000\000\011\017\011\017\011\017\000\000\011\017\011\017\011\017\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\011\017\000\000\000\000\000\000\000\000\000\000\000\000\011\017\011\017\015B\015Z\011\017\000\000\000\000\000\000\000\000\000\000\011\017\000\000\015r\011\017\000\000\000\000\000\000\000\000\000\000\011\017\011\017\000\242\000\000\000\000\000\000\000\000\000\000\000\000\011\017\011\017\014b\014\226\015\138\015\162\015\210\011\017\011\017\000\000\011\017\000\000\000\000\000\000\011\017\000\000\011\017\015\234\000\000\000\000\000\000\000\000\011\017\000\000\000\000\011\017\000\000\011\017\016\002\000\000\011\017\011\017\011\017\011\017\000\000\000\000\000\000\011\017\000\000\011\017\011\017\000\000\011\017\011\017\011\017\011\017\015\186\011\017\011\017\000\000\000\000\011\017\016\026\011\017\000\000\000\000\000\000\000\000\011\017\011\017\0162\016J\003\129\003\129\000\000\003\129\000\000\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\000\000\000\000\003\129\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\003\129\000\000\003\129\003\129\003\129\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\r\022\003\129\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\003\129\r*\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003}\003}\000\000\003}\000\000\003}\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\000\000\000\000\014J\000\000\003}\003}\003}\000\000\003}\003}\003}\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003}\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\015B\015Z\003}\000\000\000\000\000\000\000\000\000\000\003}\000\000\015r\003}\000\000\000\000\000\000\000\000\000\000\003}\003}\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\014b\014\226\015\138\015\162\015\210\003}\003}\000\000\003}\000\000\000\000\000\000\003}\000\000\003}\015\234\000\000\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\016\002\000\000\003}\003}\003}\003}\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\016b\003}\003}\016z\015\186\003}\003}\000\000\000\000\003}\016\026\003}\000\000\000\000\000\000\000\000\003}\003}\0162\016J\011\t\011\t\000\000\011\t\000\000\011\t\000\000\000\000\000\000\011\t\000\000\000\000\011\t\000\000\011\t\000\000\000\000\014J\000\000\011\t\011\t\011\t\000\000\011\t\011\t\011\t\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\011\t\000\000\000\000\000\000\000\000\000\000\000\000\011\t\011\t\015B\015Z\011\t\000\000\000\000\000\000\000\000\000\000\011\t\000\000\015r\011\t\000\000\000\000\000\000\000\000\000\000\011\t\011\t\000\242\000\000\000\000\000\000\000\000\000\000\000\000\011\t\011\t\014b\014\226\015\138\015\162\015\210\011\t\011\t\000\000\011\t\000\000\000\000\000\000\011\t\000\000\011\t\015\234\000\000\000\000\000\000\000\000\011\t\000\000\000\000\011\t\000\000\011\t\016\002\000\000\011\t\011\t\011\t\011\t\000\000\000\000\000\000\011\t\000\000\011\t\011\t\000\000\011\t\011\t\011\t\011\t\015\186\011\t\011\t\000\000\000\000\011\t\016\026\011\t\000\000\000\000\000\000\000\000\011\t\011\t\0162\016J\003\193\003\193\000\000\003\193\000\000\003\193\000\000\000\000\000\000\003\193\000\000\000\000\003\193\000\000\003\193\000\000\000\000\003\193\000\000\003\193\003\193\003\193\000\000\003\193\003\193\003\193\000\000\000\000\000\000\000\000\000\000\003\193\003\193\003\193\003\193\003\193\000\000\003\193\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\003\193\003\193\003\193\000\000\000\000\000\000\000\000\000\000\003\193\000\000\003\193\003\193\000\000\000\000\000\000\000\000\000\000\003\193\003\193\003\193\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\000\000\003\193\000\000\000\000\000\000\003\193\000\000\003\193\003\193\000\000\000\000\000\000\000\000\003\193\000\000\000\000\003\193\000\000\003\193\003\193\000\000\003\193\003\193\003\193\003\193\000\000\000\000\000\000\003\193\000\000\003\193\003\193\000\000\r\022\003\193\003\193\003\193\003\193\003\193\003\193\000\000\000\000\003\193\003\193\r*\000\000\000\000\000\000\000\000\003\193\003\193\003\193\003\193\003\189\003\189\000\000\003\189\000\000\003\189\000\000\000\000\000\000\003\189\000\000\000\000\003\189\000\000\003\189\000\000\000\000\014J\000\000\003\189\003\189\003\189\000\000\003\189\003\189\003\189\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\189\000\000\000\000\000\000\000\000\000\000\000\000\003\189\003\189\015B\015Z\003\189\000\000\000\000\000\000\000\000\000\000\003\189\000\000\015r\003\189\000\000\000\000\000\000\000\000\000\000\003\189\003\189\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\189\003\189\014b\014\226\015\138\015\162\015\210\003\189\003\189\000\000\003\189\000\000\000\000\000\000\003\189\000\000\003\189\015\234\000\000\000\000\000\000\000\000\003\189\000\000\000\000\003\189\000\000\003\189\016\002\000\000\003\189\003\189\003\189\003\189\000\000\000\000\000\000\003\189\000\000\003\189\003\189\000\000\016b\003\189\003\189\016z\015\186\003\189\003\189\000\000\000\000\003\189\016\026\003\189\000\000\000\000\000\000\000\000\003\189\003\189\0162\016J\003\225\003\225\000\000\003\225\000\000\003\225\000\000\000\000\000\000\003\225\000\000\000\000\003\225\000\000\003\225\000\000\000\000\003\225\000\000\003\225\003\225\003\225\000\000\003\225\003\225\003\225\000\000\000\000\000\000\000\000\000\000\003\225\003\225\003\225\003\225\003\225\000\000\003\225\000\000\000\000\000\000\000\000\000\000\000\000\003\225\003\225\003\225\003\225\003\225\000\000\000\000\000\000\000\000\000\000\003\225\000\000\003\225\003\225\000\000\000\000\000\000\000\000\000\000\003\225\003\225\003\225\000\000\000\000\000\000\000\000\000\000\000\000\003\225\003\225\003\225\003\225\003\225\003\225\003\225\003\225\003\225\000\000\003\225\000\000\000\000\000\000\003\225\000\000\003\225\003\225\000\000\000\000\000\000\000\000\003\225\000\000\000\000\003\225\000\000\003\225\003\225\000\000\003\225\003\225\003\225\003\225\000\000\000\000\000\000\003\225\000\000\003\225\003\225\000\000\r\022\003\225\003\225\003\225\003\225\003\225\003\225\000\000\000\000\003\225\003\225\r*\000\000\000\000\000\000\000\000\003\225\003\225\003\225\003\225\003\221\003\221\000\000\003\221\000\000\003\221\000\000\000\000\000\000\003\221\000\000\000\000\003\221\000\000\003\221\000\000\000\000\014J\000\000\003\221\003\221\003\221\000\000\003\221\003\221\003\221\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\221\000\000\000\000\000\000\000\000\000\000\000\000\003\221\003\221\015B\015Z\003\221\000\000\000\000\000\000\000\000\000\000\003\221\000\000\015r\003\221\000\000\000\000\000\000\000\000\000\000\003\221\003\221\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\221\003\221\014b\014\226\015\138\015\162\015\210\003\221\003\221\000\000\003\221\000\000\000\000\000\000\003\221\000\000\003\221\015\234\000\000\000\000\000\000\000\000\003\221\000\000\000\000\003\221\000\000\003\221\016\002\000\000\003\221\003\221\003\221\003\221\000\000\000\000\000\000\003\221\000\000\003\221\003\221\000\000\016b\003\221\003\221\016z\015\186\003\221\003\221\000\000\000\000\003\221\016\026\003\221\000\000\000\000\000\000\000\000\003\221\003\221\0162\016J\003\209\003\209\000\000\003\209\000\000\003\209\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\003\209\000\000\000\000\003\209\000\000\003\209\003\209\003\209\000\000\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\003\209\003\209\000\000\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\000\000\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\003\209\003\209\003\209\003\209\003\209\003\209\000\000\003\209\000\000\000\000\000\000\003\209\000\000\003\209\003\209\000\000\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\003\209\003\209\000\000\003\209\003\209\003\209\003\209\000\000\000\000\000\000\003\209\000\000\003\209\003\209\000\000\r\022\003\209\003\209\003\209\003\209\003\209\003\209\000\000\000\000\003\209\003\209\r*\000\000\000\000\000\000\000\000\003\209\003\209\003\209\003\209\003\205\003\205\000\000\003\205\000\000\003\205\000\000\000\000\000\000\003\205\000\000\000\000\003\205\000\000\003\205\000\000\000\000\014J\000\000\003\205\003\205\003\205\000\000\003\205\003\205\003\205\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\205\000\000\000\000\000\000\000\000\000\000\000\000\003\205\003\205\015B\015Z\003\205\000\000\000\000\000\000\000\000\000\000\003\205\000\000\015r\003\205\000\000\000\000\000\000\000\000\000\000\003\205\003\205\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\205\003\205\014b\014\226\015\138\015\162\015\210\003\205\003\205\000\000\003\205\000\000\000\000\000\000\003\205\000\000\003\205\015\234\000\000\000\000\000\000\000\000\003\205\000\000\000\000\003\205\000\000\003\205\016\002\000\000\003\205\003\205\003\205\003\205\000\000\000\000\000\000\003\205\000\000\003\205\003\205\000\000\016b\003\205\003\205\016z\015\186\003\205\003\205\000\000\000\000\003\205\016\026\003\205\000\000\000\000\000\000\000\000\003\205\003\205\0162\016J\003\169\003\169\000\000\003\169\000\000\003\169\000\000\000\000\000\000\003\169\000\000\000\000\003\169\000\000\003\169\000\000\000\000\003\169\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\003\169\000\000\000\000\003\169\000\000\003\169\003\169\000\000\003\169\003\169\003\169\003\169\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\r\022\003\169\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\003\169\r*\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\165\003\165\000\000\003\165\000\000\003\165\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\000\000\000\000\014J\000\000\003\165\003\165\003\165\000\000\003\165\003\165\003\165\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\165\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\015B\015Z\003\165\000\000\000\000\000\000\000\000\000\000\003\165\000\000\015r\003\165\000\000\000\000\000\000\000\000\000\000\003\165\003\165\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\014b\014\226\015\138\015\162\015\210\003\165\003\165\000\000\003\165\000\000\000\000\000\000\003\165\000\000\003\165\015\234\000\000\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\016\002\000\000\003\165\003\165\003\165\003\165\000\000\000\000\000\000\003\165\000\000\003\165\003\165\000\000\016b\003\165\003\165\016z\015\186\003\165\003\165\000\000\000\000\003\165\016\026\003\165\000\000\000\000\000\000\000\000\003\165\003\165\0162\016J\003\185\003\185\000\000\003\185\000\000\003\185\000\000\000\000\000\000\003\185\000\000\000\000\003\185\000\000\003\185\000\000\000\000\003\185\000\000\003\185\003\185\003\185\000\000\003\185\003\185\003\185\000\000\000\000\000\000\000\000\000\000\003\185\003\185\003\185\003\185\003\185\000\000\003\185\000\000\000\000\000\000\000\000\000\000\000\000\003\185\003\185\003\185\003\185\003\185\000\000\000\000\000\000\000\000\000\000\003\185\000\000\003\185\003\185\000\000\000\000\000\000\000\000\000\000\003\185\003\185\003\185\000\000\000\000\000\000\000\000\000\000\000\000\003\185\003\185\003\185\003\185\003\185\003\185\003\185\003\185\003\185\000\000\003\185\000\000\000\000\000\000\003\185\000\000\003\185\003\185\000\000\000\000\000\000\000\000\003\185\000\000\000\000\003\185\000\000\003\185\003\185\000\000\003\185\003\185\003\185\003\185\000\000\000\000\000\000\003\185\000\000\003\185\003\185\000\000\r\022\003\185\003\185\003\185\003\185\003\185\003\185\000\000\000\000\003\185\003\185\r*\000\000\000\000\000\000\000\000\003\185\003\185\003\185\003\185\003\181\003\181\000\000\003\181\000\000\003\181\000\000\000\000\000\000\003\181\000\000\000\000\003\181\000\000\003\181\000\000\000\000\014J\000\000\003\181\003\181\003\181\000\000\003\181\003\181\003\181\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\181\000\000\000\000\000\000\000\000\000\000\000\000\003\181\003\181\015B\015Z\003\181\000\000\000\000\000\000\000\000\000\000\003\181\000\000\015r\003\181\000\000\000\000\000\000\000\000\000\000\003\181\003\181\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\181\003\181\014b\014\226\015\138\015\162\015\210\003\181\003\181\000\000\003\181\000\000\000\000\000\000\003\181\000\000\003\181\015\234\000\000\000\000\000\000\000\000\003\181\000\000\000\000\003\181\000\000\003\181\016\002\000\000\003\181\003\181\003\181\003\181\000\000\000\000\000\000\003\181\000\000\003\181\003\181\000\000\016b\003\181\003\181\016z\015\186\003\181\003\181\000\000\000\000\003\181\016\026\003\181\000\000\000\000\000\000\000\000\003\181\003\181\0162\016J\003\177\003\177\000\000\003\177\000\000\003\177\000\000\000\000\000\000\003\177\000\000\000\000\003\177\000\000\003\177\000\000\000\000\003\177\000\000\003\177\003\177\003\177\000\000\003\177\003\177\003\177\000\000\000\000\000\000\000\000\000\000\003\177\003\177\003\177\003\177\003\177\000\000\003\177\000\000\000\000\000\000\000\000\000\000\000\000\003\177\003\177\003\177\003\177\003\177\000\000\000\000\000\000\000\000\000\000\003\177\000\000\003\177\003\177\000\000\000\000\000\000\000\000\000\000\003\177\003\177\003\177\000\000\000\000\000\000\000\000\000\000\000\000\003\177\003\177\003\177\003\177\003\177\003\177\003\177\003\177\003\177\000\000\003\177\000\000\000\000\000\000\003\177\000\000\003\177\003\177\000\000\000\000\000\000\000\000\003\177\000\000\000\000\003\177\000\000\003\177\003\177\000\000\003\177\003\177\003\177\003\177\000\000\000\000\000\000\003\177\000\000\003\177\003\177\000\000\r\022\003\177\003\177\003\177\003\177\003\177\003\177\000\000\000\000\003\177\003\177\r*\000\000\000\000\000\000\000\000\003\177\003\177\003\177\003\177\003\173\003\173\000\000\003\173\000\000\003\173\000\000\000\000\000\000\003\173\000\000\000\000\003\173\000\000\003\173\000\000\000\000\014J\000\000\003\173\003\173\003\173\000\000\003\173\003\173\003\173\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\173\000\000\000\000\000\000\000\000\000\000\000\000\003\173\003\173\015B\015Z\003\173\000\000\000\000\000\000\000\000\000\000\003\173\000\000\015r\003\173\000\000\000\000\000\000\000\000\000\000\003\173\003\173\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\173\003\173\014b\014\226\015\138\015\162\015\210\003\173\003\173\000\000\003\173\000\000\000\000\000\000\003\173\000\000\003\173\015\234\000\000\000\000\000\000\000\000\003\173\000\000\000\000\003\173\000\000\003\173\016\002\000\000\003\173\003\173\003\173\003\173\000\000\000\000\000\000\003\173\000\000\003\173\003\173\000\000\016b\003\173\003\173\016z\015\186\003\173\003\173\000\000\000\000\003\173\016\026\003\173\000\000\000\000\000\000\000\000\003\173\003\173\0162\016J\003\201\003\201\000\000\003\201\000\000\003\201\000\000\000\000\000\000\003\201\000\000\000\000\003\201\000\000\003\201\000\000\000\000\003\201\000\000\003\201\003\201\003\201\000\000\003\201\003\201\003\201\000\000\000\000\000\000\000\000\000\000\003\201\003\201\003\201\003\201\003\201\000\000\003\201\000\000\000\000\000\000\000\000\000\000\000\000\003\201\003\201\003\201\003\201\003\201\000\000\000\000\000\000\000\000\000\000\003\201\000\000\003\201\003\201\000\000\000\000\000\000\000\000\000\000\003\201\003\201\003\201\000\000\000\000\000\000\000\000\000\000\000\000\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\000\000\003\201\000\000\000\000\000\000\003\201\000\000\003\201\003\201\000\000\000\000\000\000\000\000\003\201\000\000\000\000\003\201\000\000\003\201\003\201\000\000\003\201\003\201\003\201\003\201\000\000\000\000\000\000\003\201\000\000\003\201\003\201\000\000\r\022\003\201\003\201\003\201\003\201\003\201\003\201\000\000\000\000\003\201\003\201\r*\000\000\000\000\000\000\000\000\003\201\003\201\003\201\003\201\003\197\003\197\000\000\003\197\000\000\003\197\000\000\000\000\000\000\003\197\000\000\000\000\003\197\000\000\003\197\000\000\000\000\014J\000\000\003\197\003\197\003\197\000\000\003\197\003\197\003\197\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\197\000\000\000\000\000\000\000\000\000\000\000\000\003\197\003\197\015B\015Z\003\197\000\000\000\000\000\000\000\000\000\000\003\197\000\000\015r\003\197\000\000\000\000\000\000\000\000\000\000\003\197\003\197\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\197\003\197\014b\014\226\015\138\015\162\015\210\003\197\003\197\000\000\003\197\000\000\000\000\000\000\003\197\000\000\003\197\015\234\000\000\000\000\000\000\000\000\003\197\000\000\000\000\003\197\000\000\003\197\016\002\000\000\003\197\003\197\003\197\003\197\000\000\000\000\000\000\003\197\000\000\003\197\003\197\000\000\016b\003\197\003\197\016z\015\186\003\197\003\197\000\000\000\000\003\197\016\026\003\197\000\000\000\000\000\000\000\000\003\197\003\197\0162\016J\003\233\003\233\000\000\003\233\000\000\003\233\000\000\000\000\000\000\003\233\000\000\000\000\003\233\000\000\003\233\000\000\000\000\003\233\000\000\003\233\003\233\003\233\000\000\003\233\003\233\003\233\000\000\000\000\000\000\000\000\000\000\003\233\003\233\003\233\003\233\003\233\000\000\003\233\000\000\000\000\000\000\000\000\000\000\000\000\003\233\003\233\003\233\003\233\003\233\000\000\000\000\000\000\000\000\000\000\003\233\000\000\003\233\003\233\000\000\000\000\000\000\000\000\000\000\003\233\003\233\003\233\000\000\000\000\000\000\000\000\000\000\000\000\003\233\003\233\003\233\003\233\003\233\003\233\003\233\003\233\003\233\000\000\003\233\000\000\000\000\000\000\003\233\000\000\003\233\003\233\000\000\000\000\000\000\000\000\003\233\000\000\000\000\003\233\000\000\003\233\003\233\000\000\003\233\003\233\003\233\003\233\000\000\000\000\000\000\003\233\000\000\003\233\003\233\000\000\r\022\003\233\003\233\003\233\003\233\003\233\003\233\000\000\000\000\003\233\003\233\r*\000\000\000\000\000\000\000\000\003\233\003\233\003\233\003\233\003\229\003\229\000\000\003\229\000\000\003\229\000\000\000\000\000\000\003\229\000\000\000\000\003\229\000\000\003\229\000\000\000\000\014J\000\000\003\229\003\229\003\229\000\000\003\229\003\229\003\229\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\229\000\000\000\000\000\000\000\000\000\000\000\000\003\229\003\229\015B\015Z\003\229\000\000\000\000\000\000\000\000\000\000\003\229\000\000\015r\003\229\000\000\000\000\000\000\000\000\000\000\003\229\003\229\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\229\003\229\014b\014\226\015\138\015\162\015\210\003\229\003\229\000\000\003\229\000\000\000\000\000\000\003\229\000\000\003\229\015\234\000\000\000\000\000\000\000\000\003\229\000\000\000\000\003\229\000\000\003\229\016\002\000\000\003\229\003\229\003\229\003\229\000\000\000\000\000\000\003\229\000\000\003\229\003\229\000\000\016b\003\229\003\229\016z\015\186\003\229\003\229\000\000\000\000\003\229\016\026\003\229\000\000\000\000\000\000\000\000\003\229\003\229\0162\016J\003\217\003\217\000\000\003\217\000\000\003\217\000\000\000\000\000\000\003\217\000\000\000\000\003\217\000\000\003\217\000\000\000\000\003\217\000\000\003\217\003\217\003\217\000\000\003\217\003\217\003\217\000\000\000\000\000\000\000\000\000\000\003\217\003\217\003\217\003\217\003\217\000\000\003\217\000\000\000\000\000\000\000\000\000\000\000\000\003\217\003\217\003\217\003\217\003\217\000\000\000\000\000\000\000\000\000\000\003\217\000\000\003\217\003\217\000\000\000\000\000\000\000\000\000\000\003\217\003\217\003\217\000\000\000\000\000\000\000\000\000\000\000\000\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\000\000\003\217\000\000\000\000\000\000\003\217\000\000\003\217\003\217\000\000\000\000\000\000\000\000\003\217\000\000\000\000\003\217\000\000\003\217\003\217\000\000\003\217\003\217\003\217\003\217\000\000\000\000\000\000\003\217\000\000\003\217\003\217\000\000\r\022\003\217\003\217\003\217\003\217\003\217\003\217\000\000\000\000\003\217\003\217\r*\000\000\000\000\000\000\000\000\003\217\003\217\003\217\003\217\003\213\003\213\000\000\003\213\000\000\003\213\000\000\000\000\000\000\003\213\000\000\000\000\003\213\000\000\003\213\000\000\000\000\014J\000\000\003\213\003\213\003\213\000\000\003\213\003\213\003\213\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\213\000\000\000\000\000\000\000\000\000\000\000\000\003\213\003\213\015B\015Z\003\213\000\000\000\000\000\000\000\000\000\000\003\213\000\000\015r\003\213\000\000\000\000\000\000\000\000\000\000\003\213\003\213\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\213\003\213\014b\014\226\015\138\015\162\015\210\003\213\003\213\000\000\003\213\000\000\000\000\000\000\003\213\000\000\003\213\015\234\000\000\000\000\000\000\000\000\003\213\000\000\000\000\003\213\000\000\003\213\016\002\000\000\003\213\003\213\003\213\003\213\000\000\000\000\000\000\003\213\000\000\003\213\003\213\000\000\016b\003\213\003\213\016z\015\186\003\213\003\213\000\000\000\000\003\213\016\026\003\213\000\000\000\000\000\000\000\000\003\213\003\213\0162\016J\003\161\003\161\000\000\003\161\000\000\003\161\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\000\000\000\000\003\161\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\003\161\000\000\003\161\003\161\003\161\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\r\022\003\161\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\003\161\r*\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\157\003\157\000\000\003\157\000\000\003\157\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\000\000\000\000\014J\000\000\003\157\003\157\003\157\000\000\003\157\003\157\003\157\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\157\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\015B\015Z\003\157\000\000\000\000\000\000\000\000\000\000\003\157\000\000\015r\003\157\000\000\000\000\000\000\000\000\000\000\003\157\003\157\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\014b\014\226\015\138\015\162\015\210\003\157\003\157\000\000\003\157\000\000\000\000\000\000\003\157\000\000\003\157\015\234\000\000\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\016\002\000\000\003\157\003\157\003\157\003\157\000\000\000\000\000\000\003\157\000\000\003\157\003\157\000\000\016b\003\157\003\157\016z\015\186\003\157\003\157\000\000\000\000\003\157\016\026\003\157\000\000\000\000\000\000\000\000\003\157\003\157\0162\016J\011\025\011\025\000\000\011\025\000\000\011\025\000\000\000\000\000\000\011\025\000\000\000\000\011\025\000\000\011\025\000\000\000\000\014J\000\000\011\025\011\025\011\025\000\000\011\025\011\025\011\025\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\011\025\000\000\000\000\000\000\000\000\000\000\000\000\011\025\011\025\015B\015Z\011\025\000\000\000\000\000\000\000\000\000\000\011\025\000\000\015r\011\025\000\000\000\000\000\000\000\000\000\000\011\025\011\025\000\242\000\000\000\000\000\000\000\000\000\000\000\000\011\025\011\025\014b\014\226\015\138\015\162\015\210\011\025\011\025\000\000\011\025\000\000\000\000\000\000\011\025\000\000\011\025\015\234\000\000\000\000\000\000\000\000\011\025\000\000\000\000\011\025\000\000\011\025\016\002\000\000\011\025\011\025\011\025\011\025\000\000\000\000\000\000\011\025\000\000\011\025\011\025\000\000\011\025\011\025\011\025\011\025\015\186\011\025\011\025\000\000\000\000\011\025\016\026\011\025\000\000\000\000\000\000\000\000\011\025\011\025\0162\016J\011q\011q\000\000\011q\000\000\011q\000\000\000\000\000\000\011q\000\000\000\000\011q\000\000\011q\000\000\000\000\011q\000\000\011q\011q\011q\000\000\011q\011q\011q\000\000\000\000\000\000\000\000\000\000\011q\011q\011q\011q\011q\000\000\011q\000\000\000\000\000\000\000\000\000\000\000\000\011q\011q\011q\011q\011q\000\000\000\000\000\000\000\000\000\000\011q\000\000\011q\011q\000\000\000\000\000\000\000\000\000\000\011q\011q\011q\000\000\000\000\000\000\000\000\000\000\000\000\011q\011q\011q\011q\011q\011q\011q\011q\011q\000\000\011q\000\000\000\000\000\000\011q\000\000\011q\011q\000\000\000\000\000\000\000\000\011q\000\000\000\000\011q\000\000\011q\011q\000\000\011q\011q\011q\011q\000\000\000\000\000\000\011q\000\000\011q\011q\000\000\r\022\011q\011q\011q\011q\011q\011q\000\000\000\000\011q\011q\r*\000\000\000\000\000\000\000\000\011q\011q\011q\011q\002\165\002\165\000\000\002\165\000\000\002\165\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\000\000\000\000\002\165\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\002\165\002\165\002\165\002\165\000\000\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\020>\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\r\022\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\002\165\r*\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\157\002\157\000\000\002\157\000\000\002\157\000\000\000\000\000\000\002\157\000\000\000\000\002\157\000\000\002\157\000\000\000\000\002\157\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\000\000\002\157\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\002\157\000\000\000\000\002\157\000\000\002\157\002\157\000\000\002\157\002\157\002\157\002\157\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\r\022\002\157\002\157\002\157\002\157\002\157\002\157\000\000\000\000\002\157\002\157\r*\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\153\002\153\000\000\002\153\000\000\002\153\000\000\000\000\000\000\002\153\000\000\000\000\002\153\000\000\002\153\000\000\000\000\014J\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\015B\015Z\002\153\000\000\000\000\000\000\000\000\000\000\002\153\000\000\015r\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\014b\014\226\015\138\015\162\015\210\002\153\002\153\000\000\002\153\000\000\000\000\000\000\002\153\000\000\002\153\015\234\000\000\000\000\000\000\000\000\002\153\000\000\000\000\002\153\000\000\002\153\016\002\000\000\002\153\002\153\002\153\002\153\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\016b\002\153\002\153\016z\015\186\002\153\002\153\000\000\000\000\002\153\016\026\002\153\000\000\000\000\000\000\000\000\002\153\002\153\0162\016J\002\161\002\161\000\000\002\161\000\000\002\161\000\000\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\000\000\000\000\014J\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\015B\015Z\002\161\000\000\000\000\000\000\000\000\000\000\002\161\000\000\015r\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\014b\014\226\015\138\015\162\015\210\002\161\002\161\000\000\002\161\000\000\000\000\000\000\002\161\000\000\002\161\015\234\000\000\000\000\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\016\002\000\000\002\161\002\161\020Z\002\161\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\016b\002\161\002\161\016z\015\186\002\161\002\161\000\000\000\000\002\161\016\026\002\161\000\000\000\000\000\000\000\000\002\161\002\161\0162\016J\002\149\002\149\000\000\002\149\000\000\002\149\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\002\149\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\000\000\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\000\000\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\002\149\000\000\002\149\002\149\002\149\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\r\022\002\149\002\149\002\149\002\149\002\149\002\149\000\000\000\000\002\149\002\149\r*\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\145\002\145\000\000\002\145\000\000\002\145\000\000\000\000\000\000\002\145\000\000\000\000\002\145\000\000\002\145\000\000\000\000\014J\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\002\145\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\015B\015Z\002\145\000\000\000\000\000\000\000\000\000\000\002\145\000\000\015r\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\014b\014\226\015\138\015\162\015\210\002\145\002\145\000\000\002\145\000\000\000\000\000\000\002\145\000\000\002\145\015\234\000\000\000\000\000\000\000\000\002\145\000\000\000\000\002\145\000\000\002\145\016\002\000\000\002\145\002\145\002\145\002\145\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\016b\002\145\002\145\016z\015\186\002\145\002\145\000\000\000\000\002\145\016\026\002\145\000\000\000\000\000\000\000\000\002\145\002\145\0162\016J\003\153\003\153\000\000\003\153\000\000\003\153\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\000\000\000\000\003\153\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\003\153\000\000\003\153\003\153\003\153\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\r\022\003\153\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\003\153\r*\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\149\003\149\000\000\003\149\000\000\003\149\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\000\000\000\000\014J\000\000\003\149\003\149\003\149\000\000\003\149\003\149\003\149\000\000\000\000\000\000\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\003\149\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\015B\015Z\003\149\000\000\000\000\000\000\000\000\000\000\003\149\000\000\015r\003\149\000\000\000\000\000\000\000\000\000\000\003\149\003\149\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\014b\014\226\015\138\015\162\015\210\003\149\003\149\000\000\003\149\000\000\000\000\000\000\003\149\000\000\003\149\015\234\000\000\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\016\002\000\000\003\149\003\149\003\149\003\149\000\000\000\000\000\000\003\149\000\000\003\149\003\149\000\000\016b\003\149\003\149\016z\015\186\003\149\003\149\000\000\000\000\003\149\016\026\003\149\000\000\000\000\000\000\000\000\003\149\003\149\0162\016J\002\133\002\133\000\000\002\133\000\000\002\133\000\000\000\000\000\000\002\133\000\000\000\000\002\133\000\000\002\133\000\000\000\000\002\133\000\000\002\133\002\133\002\133\000\000\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\002\133\002\133\000\000\002\133\000\000\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\000\000\002\133\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\000\000\000\000\000\000\002\133\000\000\000\000\002\133\000\000\002\133\002\133\000\000\002\133\002\133\002\133\002\133\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\002\133\002\133\002\133\002\133\002\133\002\133\002\133\000\000\000\000\002\133\002\133\r*\000\000\000\000\000\000\000\000\002\133\002\133\002\133\002\133\002\137\002\137\000\000\002\137\000\000\002\137\000\000\000\000\000\000\002\137\000\000\000\000\002\137\000\000\002\137\000\000\000\000\002\137\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\002\137\002\137\000\000\002\137\0119\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\002\137\000\000\002\137\002\137\r\134\0119\000\000\0119\0119\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\000\000\002\137\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\000\000\000\000\000\000\002\137\000\000\000\000\002\137\000\000\002\137\002\137\000\000\002\137\002\137\002\137\002\137\b\130\000\000\000\000\002\137\000\000\002\137\002\137\000\000\002\137\002\137\002\137\002\137\002\137\002\137\002\137\000\000\000\000\002\137\002\137\r*\000\000\b\134\b\130\000\000\002\137\002\137\002\137\002\137\001\n\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\b\134\003\130\001\014\r\022\0119\000\000\003*\000\000\000\000\000\000\000\000\001\238\0119\000\000\r*\004\174\001\022\011Z\011^\001\"\001&\000\000\000\242\004f\000\000\003\138\000\000\004j\000\000\024\222\n\189\011\130\011\134\000\000\004\158\004\170\004\182\004\186\011\138\t\142\000\000\001>\000\000\003b\000\242\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\011\158\000\000\007\166\007\170\001V\b\138\n\189\000\000\001Z\b.\b\150\011\170\011\194\r6\007\182\007\186\b\170\rJ\000\000\001^\b\182\000\000\000\000\000\000\000\000\001b\000\000\b\138\000\000\000\000\n\189\b.\012^\000\000\011\190\000\000\001\158\bv\b\170\000\000\007\190\011\022\b\182\001\162\000\000\020\154\005J\rN\001\n\001\170\000\006\001\174\001\178\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\001\014\n\189\000\000\000\000\011V\006.\000\000\000\000\n\189\001\238\000\000\020\018\000\000\004\174\001\022\011Z\011^\001\"\001&\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\011b\000\000\011\130\011\134\000\242\004\158\004\170\004\182\004\186\011\138\t\142\000\000\001>\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\022*\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\011\158\000\000\007\166\007\170\001V\000\000\000\000\000\000\001Z\000\000\011U\011\170\011\194\r6\007\182\007\186\b\138\rJ\b\213\001^\b.\000\000\000\000\000\000\000\000\001b\000\000\b\170\000\000\000\000\b\246\b\182\000\000\011U\000\000\000\000\001\158\b\202\b\213\000\000\007\190\011\022\b\213\001\162\000\000\020\154\005J\rN\005\205\001\170\000\006\001\174\001\178\000\250\003j\003n\003r\004\006\003v\003\022\000\000\000\000\000\000\000\000\003\130\r^\000\000\0042\rf\r\234\000\000\005\205\000\000\0046\001\238\000\242\026&\000\000\003\134\000\000\004:\004>\000\000\000\000\000\000\004B\004f\000\000\003\138\rn\004j\r\242\025\186\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\026\030\003b\000\000\000\000\004\178\n\250\0266\000\000\000\000\n\254\011\002\011\014\011\"\b\213\007\154\000\000\000\000\000\000\000\000\b\138\011U\000\000\026>\b.\011\158\000\000\007\166\007\170\011U\r\174\b\170\000\000\r\186\000\000\b\182\011\170\011\194\r6\007\182\007\186\026F\rJ\026\130\000\000\000\006\005\205\005\205\000\250\003j\003n\003r\004\006\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\005\237\026\190\030\218\007\190\011\022\000\000\0046\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\004B\004f\000\000\003\138\000\000\004j\000\000\025\186\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\026\030\003b\000\000\000\000\004\178\n\250\0266\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026>\000\000\011\158%\178\007\166\007\170\000\000%\210\000\000\000\000\000\000\000\000\000\000\011\170\011\194\r6\007\182\007\186\026F\rJ\026\130\000\000\000\006%\243\022j\000\250\003j\003n\003r\004\006\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000&\"\000\000\030\218\007\190\011\022\000\000\0046\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\004B\004f\000\000\003\138\000\000\004j\000\000\025\186\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\026\030\003b\000\000\000\000\004\178\n\250\0266\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026>\000\000\011\158%\178\007\166\007\170\000\000%\210\000\000\000\000\000\000\000\000\000\000\011\170\011\194\r6\007\182\007\186\026F\rJ\026\130\000m\000\000\005\245\000\000\000\000\000\000\000\000\n\185\001\n\000m\000\000\000\000\000\000\000m\001\206\003\154\003r\012\026\000\000\003\022\030\218\007\190\011\022\000\000\003\130\001\014\011.\005J\rN\003*\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000m\001\018\001\022\001\026\003\202\001\"\001&\000m\000\000\001\210\000\000\000\000\n\185\000\000\000\000\003\206\000\000\0012\br\000\000\000m\003\198\001\214\001\194\001:\000\000\000\000\001>\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\n\185\004\206\000\000\004\214\007\142\000m\007\154\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\000\000\007\158\007\166\007\170\001V\007\174\000\000\000\000\001Z\000\000\b\130\000\000\000\000\004^\007\182\007\186\003r\000m\b\014\001^\n\185\000\000\002\026\003\254\006.\001b\004R\n\185\000\000\n\194\000\000\b\134\000m\000\000\001\238\000\000\001\158\bv\000\000\000\000\007\190\000\000\000\000\001\162\000\000\001\166\005J\000\000\000\213\001\170\000\000\001\174\001\178\000\213\000\000\000\000\003r\000\213\004Z\003\022\000\000\r\162\000\000\000\000\003\130\000\000\003b\000\213\000\000\000\213\000\000\000\213\000\000\000\213\001\238\000\242\r\218\000\000\003\134\000\000\000\000\000\000\000\000\000\000\r\226\000\213\000\000\000\000\003\138\000\000\004j\000\000\000\213\000\000\000\000\000\000\000\213\000\000\004\170\t\162\001\194\000\000\000\213\000\000\000\000\000\213\003b\000\000\001\234\004\178\n\250\000\213\000\213\000\213\n\254\011\002\011\014\000\000\018\026\007\154\000\213\000\213\000\000\000\000\b\138\000\000\001\238\000\213\b.\012\138\000\213\007\166\007\170\000\000\000\213\b\170\000\000\000\000\000\000\b\182\027\218\000\000\000\000\007\182\007\186\000\213\000\000\000\213\000\000\000\000\000\213\000\213\005\018\000\000\028R\000\000\000\000\000\000\003b\000\000\000\213\000\000\000\000\000\000\000\000\000\000\028j\000\213\000\213\007\190\011\022\000\000\000\000\000\237\011.\005J\000\000\000\213\000\237\000\213\000\000\003r\000\237\000\000\003\022\000\000\r\162\000\000\000\000\003\130\000\000\000\000\000\237\000\000\000\237\000\000\000\237\000\000\000\237\001\238\000\000\r\218\000\000\003\134\000\000\000\000\000\000\000\000\000\000\r\226\000\237\000\000\000\000\003\138\000\000\004j\000\000\000\237\000\000\000\000\000\000\000\237\000\000\004\170\000\000\001\194\000\000\000\237\000\000\000\000\000\237\003b\000\000\000\000\004\178\n\250\000\237\000\237\000\237\n\254\011\002\011\014\000\000\018\026\007\154\000\237\000\237\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\237\007\166\007\170\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\182\007\186\000\237\000\000\000\237\000\000\000\000\000\237\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\237\007\190\011\022\000\000\000\000\005\025\011.\005J\000\000\000\237\005\025\000\237\003\154\003r\005\025\000\000\003\022\000\000\tB\000\000\000\000\003\130\000\000\000\000\005\025\000\000\000\000\000\000\005\025\000\000\005\025\001\238\000\000\tz\000\000\000i\000\000\000\000\003\158\000\000\000\000\011\206\005\025\000\000\000i\000\000\000\000\000\000\000i\005\025\000\000\000\000\003\178\000\000\n\157\012\022\000\000\001\194\000\000\005\025\000\000\000\000\005\025\003b\000\000\000\000\004\198\004\202\005\025\005\025\rm\004\206\000i\004\214\000\000\012~\007\154\n\157\000\000\000i\000\000\000\000\000\000\000\000\005\025\005\025\000\000\007\158\007\166\007\170\000\000\007\174\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\182\007\186\005\025\000\000\005\025\016\158\000\000\005\025\005\025\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000\000\000\000\rm\000\000\r\174\000\000\rm\016\166\005\025\007\190\000\000\000\000\000\000\rm\001\n\005J\000\000\rm\n\157\005\025\000\000\003\154\003r\bR\000i\003\022\000\000\000\000\000\000\0022\003\130\001\014\000\000\000\000\000\000\003*\000\000\000\000\000\000\000i\001\238\000\000\000\000\006]\001\018\001\022\001\026\003\202\001\"\001&\000\000\000\000\000\000\000\000\000\000\006]\000\000\000\000\003\206\000\000\0012\br\000\000\000\000\003\198\000\000\001\194\001:\000\000\000\000\001>\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\006]\001B\001F\001J\001N\001R\000\000\000\000\000\000\007\158\007\166\007\170\001V\007\174\000\000\000\000\001Z\000\000\000\000\000\000\000\000\000\000\007\182\007\186\000\000\000\000\b\014\001^\000\000\000\000\006]\000\000\000\000\001b\006]\000\000\000\000\006]\000\000\000\000\000\000\000\000\000\000\000\000\001\158\bv\000\000\000\000\007\190\000\000\000\000\001\162\000\000\001\166\005J\000\000\000\000\001\170\000\000\001\174\001\178\000\014\000\018\000\022\000\026\000\030\000\000#6\000\"\000&\000*\000.\0002\003r\0006\000:\000\000\000\000\000>\000\000\000\000\000\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000F\000\000\001\238\000\000\000\000\000\000\000J\000\000\000N\000\000\000R\000V\000Z\000^\000b\000f\030\250\000\000\000\000\000j\000n\000\000\000r\000v\000\000\000z :\000\000\004v\000\000 >\000\000\000\000\000\000\003b\000\000\001\230\001\234\000\000\000\000\000~\000\000 n\000\130\000\134\000\000\000\000\000\000\000\000\000\000\000\138\000\142\000\146\000\000\000\000\001\238\003\026\000\000\000\000\000\000\000\000\000\000\000\150\000\154\000\158\000\162\000\000\000\166\000\170 ~\000\174\000\000\000\000\000\000\000\178\000\182\000\186\000\000\000\000\003R\000\190#2\000\194\000\198\000\000\003N\000\000\003b\004\242\004\254\000\000\000\202\000\000\000\206\000\000\005\n\000\000\000\000\000\000\000\210\000\214\011=\000\218\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\005\014\000\000\003\130#^\000\000\000\000\000\000\011=\000\000\011=\011=\000\000\001\238\000\000\000\000\000\000\003\134\000\000\004:\004>\000\000#J\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\001\230\001\234\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\001\238\003\026\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rv\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\000\003R\000\000\005\018\000\000\002E\000\000\003N\000\000\003b\004\242\004\254\002E\000\000\011=\002E\000\000\005\n\000\000\023\154\007\190\011\022\011=\002E\000\000\011.\005J\rN\0115\000\000\000\006\000\n\000\000\000\000\003j\003n\003r\005\014\003v\003\022\000\000\023\230\000\000\000\000\003\130\000\000\000\000\002E\000\000\0115\000\000\0115\0115\000\000\001\238\002E\000\000\000\000\003\134\000\000\004:\004>\002E\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\002E\004\178\n\250\000\000\000\000\016\029\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\016\029\015\197\000\000\002j\000\000\015\197\002n\rv\011\194\r6\007\182\007\186\000\000\rJ\000\000\015\197\000\000\000\000\000\000\000\000\002z\015\197\000\000\002\130\000\000\016\017\000\000\000\000\000\000\000\000\0115\000\000\000\000\015\197\000\000\000\000\007\190\011\022\0115\000\000\015\197\011.\005J\rN\011\201\000\000\000\000\011\201\000\000\002\134\015\197\011\201\011\201\015\197\000\000\011\201\000\000\011\201\000\000\015\197\011\201\000\000\000\000\000\000\011\201\011\201\000\000\011\201\011\201\000\000\011\201\000\000\011\201\000\000\000\000\015\197\000\000\011\201\015\197\000\000\011\201\000\000\015\197\000\000\000\000\000\000\000\000\000\000\000\000\011\201\000\000\011\201\000\000\015\197\011\201\015\197\011\201\000\000\015\197\002\138\000\000\000\000\011\201\001.%\170\011\201\011\201\000\000\000\000\011\201\011\201\002E\011\201\000\000\011\201\011\201\015\197\000\000\002E\000\000\000\000\002E\000\000\002E\011\201\000\000\011\201\011\201\011\201\002E\011\201\000\000\000\000\000\000\000\000\000\000\000\000\000\n\002E\011\201\011\201\000\000\000\000\002E\011\201\002E\011\201\002E\002E\000\000\000\000\007\226\000\n\002E\000\000\002E\002E\000\000\011\201\011\201\011\201\002E\011\201\011\201\000\n\011\201\002E\011\201\002E\011\201\002E\011\201\000\000\011\201\002E\002E\002E\000\000\002E\002E\002E\002E\000\000\002E\002E\002E\000\000\000\000\002E\000\000\002E\002E\002E\000\000\002E\002E\002E\000\000\002E\000\000\002E\002E\000\n\002E\002E\000\000\002E\000\000\002E\002E\002E\000\n\000\000\000\000\002E\002E\000\000\002E\002E\002E\002E\002E\002E\000\000\000\000\000\000\002E\002E\000\000\002E\002E\000\000\000\000\002E\002E\002E\002E\002E\002E\002E\000\000\000\000\002E\000\000\002E\000\000\000\000\000\000\000\000\002E\002E\002E\002E\000\000\002E\000\000\004F\000\000\000\000\000\000\002E\002E\002E\002E\002E\000\000\002E\bA\002E\000A\000\000\002E\000\000\000A\000A\000A\000\000\000A\000A\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\000\000\bA\002E\002E\000\000\000\000\000A\002E\002E\002E\000A\000\000\000A\000A\000\000\000\000\t\150\000\000\000A\000\000\000A\000\000\000A\000\000\000\000\000\000\000A\000A\000\000\000A\000A\000A\000A\000A\000A\000\000\000\000\000\000\000A\000\000\005\185\000A\000A\000\000\000\000\005\185\000A\000A\000A\000A\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000A\000A\005\185\000\000\000\000\000\000\000\000\000\000\000\000\000A\000A\000A\000A\000A\000\000\000A\b=\000\000\000=\000\000\000\000\000\000\000=\000=\000=\005\185\000=\000=\000\000\000\000\000\000\000\000\000=\000\000\005\185\000\000\000\000\b=\000A\000A\005\185\004*\000=\000A\000A\000A\000=\000\000\000=\000=\005\185\000\000\000\000\000\000\000=\000\000\000=\000\000\000=\000\000\000\000\000\000\000=\000=\000\000\000=\000=\000=\000=\000=\000=\000\000\000\000\000\000\000=\000\000\005\221\000=\000=\000\000\005\185\027\242\000=\000=\000=\000=\000\000\000=\000\000\005\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000=\000=\0046\000\000\000\000\000\000\000\000\000\000\000\000\000=\000=\000=\000=\000=\000\000\000=\bM\000\000\015\141\000\000\000\000\000\000\015\141\015\141\015\141\028\030\015\141\015\141\000\000\000\000\000\000\000\000\015\141\000\000\026\030\000\000\000\000\bM\000=\000=\0266\000\000\015\141\000=\000=\000=\015\141\000\000\015\141\015\141\028J\000\000\000\000\000\000\015\141\000\000\015\141\000\000\015\141\000\000\000\000\000\000\015\141\015\141\000\000\015\141\015\141\015\141\015\141\015\141\015\141\000\000\000\000\000\000\015\141\000\000\000\000\015\141\015\141\000\000\005\221\000\000\015\141\015\141\015\141\015\141\000\000\015\141\000\000\028\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\141\000\000\015\141\015\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\141\015\141\015\141\015\141\015\141\000\000\015\141\bI\000\000\015\137\000\000\000\000\000\000\015\137\015\137\015\137\000\000\015\137\015\137\000\000\000\000\000\000\000\000\015\137\000\000\000\000\000\000\000\000\bI\015\141\015\141\000\000\000\000\015\137\015\141\015\141\015\141\015\137\000\000\015\137\015\137\000\000\000\000\000\000\000\000\015\137\000\000\015\137\000\000\015\137\000\000\000\000\000\000\015\137\015\137\000\000\015\137\015\137\015\137\015\137\015\137\015\137\000\000\000\000\000\000\015\137\000\000\000\000\015\137\015\137\000\000\000\000\000\000\015\137\015\137\015\137\015\137\000\000\015\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\137\000\000\015\137\015\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\137\015\137\015\137\015\137\015\137\000\000\015\137\005\193\000\000\000\006\000\000\000\000\000\250\003j\003n\003r\002^\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\026\194\000\000\000\000\015\137\015\137\000\000\0046\001\238\015\137\015\137\015\137\003\134\000\000\004:\004>\000\000\000\000\000\000\026\198\004f\000\000\003\138\000\000\004j\000\000\026\238\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\026\030\003b\000\000\000\000\004\178\n\250\0266\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026>\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\166\011\194\r6\007\182\007\186\026F\rJ\027\142\000\000\000\000\005\193\005\193\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\024\190\000\000\000\000\000\000\003\130\027\158\007\190\011\022\000\000\000\000\000\000\011.\005J\rN\001\238\000\000\000\000\000\000\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\230\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\021\000\000\000\006\000\000\000\000\002\021\003j\003n\003r\000\000\003v\003\022\000\000\007\190\011\022\022\254\003\130\000\000\011.\005J\rN\000\000\000\000\004\210\000\000\002\021\001\238\000\000\000\000\000\000\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\002\021\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\002\021\003b\000\000\000\000\004\178\n\250\002\021\002\021\000\242\n\254\011\002\011\014\011\"\000\000\007\154\002\021\002\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\182\011\194\r6\007\182\007\186\000\000\rJ\016q\000\000\000\006\000\000\002\021\016q\003j\003n\003r\000\000\003v\003\022\000\000\002\021\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\016q\001\238\011.\005J\rN\003\134\000\000\004:\004>\005\229\000\000\000\000\000\000\004f\031\006\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\016q\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\016q\003b\0046\000\000\004\178\n\250\016q\016q\000\242\n\254\011\002\011\014\011\"\000\000\007\154\016q\016q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\031z\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\026\030\020\174\011\194\r6\007\182\007\186\0266\rJ\000\000\000\000\000\000\000\000\016q\000\000\000\006 \030 .\000\000\003j\003n\003r\016q\003v\003\022\021\134\000\000\000\000\000\000\003\130\000\000\007\190\011\022\000\000\000\000\000\000\011.\005J\rN\001\238\000\000\000\000\000\000\003\134\000\000\004:\004>\005\229\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j!\"\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\166\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\185\000\000\000\006\000\000\000\000\005\185\003j\003n\003r\000\000\003v\003\022\000\000\007\190\011\022\021\190\003\130\000\000\011.\005J\rN\000\000\000\000\021\222\000\000\005\185\001\238\000\000\000\000\000\000\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\005\185\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\005\185\003b\000\000\000\000\004\178\n\250\005\185\004*\000\242\n\254\011\002\011\014\011\"\000\000\007\154\005\185\005\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\226\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\005\185\000\000\003j\003n\003r\000\000\003v\003\022\000\000\005\185\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025&\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\142\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\134\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\006\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\026\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\142\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\014\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014N\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014f\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\138\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\182\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\206\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\230\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\254\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\022\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015.\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015F\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015^\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015v\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\142\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\166\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\190\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\214\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\238\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\006\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\030\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016N\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016f\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016~\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018:\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018b\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\138\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\178\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\214\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\250\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019&\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019J\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019n\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\138\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020.\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020B\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020^\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\194\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\242\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\014\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021&\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\000\000\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\011\"\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021:\011\194\r6\007\182\007\186\000\000\rJ\b\153\000\000\000\006\000\000\000\000\b\153\003j\003n\003r\000\000\003v\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\b\153\001\238\011.\005J\rN\003\134\000\000\004:\004>\000\000\000\000\000\000\000\000\004f\000\000\003\138\000\000\004j\000\000\000\000\000\000\004\150\004\154\b\153\004\158\004\170\004\182\004\186\004\194\t\142\000\000\000\000\b\153\003b\000\000\000\000\004\178\n\250\b\153\b\153\000\242\n\254\011\002\011\014\011\"\000\000\007\154\b\153\b\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\158\000\000\007\166\007\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021V\011\194\r6\007\182\007\186\000\000\rJ\000\000\000\000\002J\000\000\b\153\000\000\000\000\000\000\000\000\002N\000\000\000\000\002V\b\153\000\000\t\190\000\189\000\000\000\000\000\000\001\238\000\189\007\190\011\022\000\189\000\189\000\000\011.\005J\rN!\002\016\029\016\017\000\189\000\000\000\189\000\189\000\189\003\238\000\189\000\189\000\189\000\000\n\161\t\186\000\000\001\250\000\000\000\000\000\000\000\000\016\029\003b\000\189\002j\000\000\000\000\002n\001\230\001\234\000\189\000\189\000\000\000\000\000\189\002v\n\161\000\000\000\189\000\000\000\189\002z\000\000\000\189\002\130\000\000\016\017\001\238\003\026\000\189\000\189\000\189\000\000\000\000\000\000\t\198\000\000\000\000\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\189\000\189\000\000\000\189\000\000\002\134\005\186\000\189\005\018\000\000\000\189\000\000\003N\000\000\003b\004\242\004\254\000\000\000\189\000\000\000\189\000\189\005\n\000\189\000\189\001\230\001\234\000\000\000\000\n\161\000\000\000\000\000\000\000\189\000\000\000\189\000\000\000\189\000\000\000\000\r\145\000\189\005\014\r\145\001\238\003\026\000\189\003\154\003r\000\000\000\189\003\022\000\189\000\000\000\000\002\138\003\130\000\000\000\000\000\000\r\145\r\145\000\000\r\145\r\145\000\000\001\238\000\000\003R\000\000#2\000\000\000\000\003\158\003N\000\000\003b\004\242\004\254\000\000\000\000\000\000\000\000\000\000\005\n\r\145\000\000\003\178\000\000\000\000\003\198\020\230\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\005\014\r\145\004\206\006-\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\145\000\000\007\158\007\166\007\170#J\007\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\182\007\186\000\000\000\000\b\014\r\145\000\000\r\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\145\r\145\000\000\000\000\r\145\r\145\000\000\007\190\000\000\r\145\000\000\r\145\000\000\005J\r\141\r\145\000\000\r\141\000\000\000\000\000\000\003\154\003r\000\000\000\000\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\r\141\r\141\000\000\r\141\r\141\000\000\001\238\000\000\000\000\000\000\000i\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000i\000\000\r\141\000\000\003\178\000\000\n\157\bN\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\r\141\004\206\000i\004\214\007\142\000\000\007\154\n\157\000\000\000i\000\000\000\000\000\000\000\000\000\000\r\141\000\000\007\158\007\166\007\170\000\000\007\174\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\182\007\186\000\000\000\000\b\014\r\141\000\000\r\141\000\000\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000\000\000\000\r\141\r\141\000\000\000\000\r\141\r\141\000\000\007\190\000\000\r\141\000\000\r\141\000i\005J\000\000\r\141\n\157\000i\000\000\000\000\000i\000i\000i\000\000\000\000\000\000\000\000\0036\000\000\000i\000\000\000i\000i\000i\000\000\000i\000i\000i\000\000\n\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000\000\000\000\000\000\000i\000i\000\000\000\000\000i\000\000\n\157\000\000\000i\000\000\000i\000\000\000\000\000i\000\000\000\000\000\000\000\000\000\000\000i\000i\000i\000\000\000\000\000\000\000\000\000\000\000\000\000i\000i\006\141\016e\000\000\000\000\000\000\000i\000i\000\000\000i\000\000\000\000\000\000\000i\000\000\000\000\000i\000\000\000\000\000\000\000\000\006\141\000\000\000\000\000i\006\141\000i\000i\000\000\000i\000i\000\000\006]\000\000\000\000\n\157\000\000\006]\000\000\000i\006]\006]\000\000\000i\000\000\006]\000\000\000i\006]\006]\000\000\006]\000i\006]\000\000\006]\000i\006]\000i\006]\006]\006]\000\000\006]\006]\006]\000\000\000\000\000\000\006]\000\000\000\000\000\000\0015\000\000\000\000\006]\006]\0015\000\000\000\000\000\000\000\000\016e\006]\006]\016e\016e\006]\006]\000\000\000\000\006]\000\000\006]\006]\006]\006]\0015\000\000\000\000\006\141\000\000\006]\006]\006]\000\000\016e\000\000\016e\000\000\006]\006]\006]\006]\000\000\000\000\006\141\006]\006]\006\141\0015\006]\003\150\000\000\000\000\006]\000\000\000\000\006]\0015\006]\006]\000\000\006]\006]\0015\006]\000\000\006]\006]\000\000\006]\006]\000\000\0015\0015\000\000\000\000\000\000\000\000\0296\006]\000\000\006]\000\000\006]\000\000\000\000\003F\006]\000\000\000\000\006]\000\000\006]\000\000\000\000\000\000\006]\000\000\006]\006]\000}\000}\000\000\0015\000\000\000}\000\000\000\000\000}\000}\000\000\000\000\0015\000\000\000\000\016\029\016\017\000}\000\000\000}\000}\000}\000\000\000}\000}\000}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\029\005\185\000}\002j\000\000\005\185\002n\000\000\000\000\000}\000}\000\000\000\000\000}\004\018\005\185\000\000\000}\000\000\000}\002z\005\185\000}\002\130\000\000\016\017\000\000\000\000\000}\000}\000}\000\000\000\000\005\185\000\000\000\000\000\000\000}\000}\000\000\005\185\000\000\000\000\000\000\000}\000}\000\000\005V\000\000\002\134\005\185\000}\000\000\005\185\000}\000\000\000\000\000\000\000\000\005\185\004*\000\000\000}\000\000\000}\000}\000\000\000}\000}\000\000\000\000\000\000\000\000\000\000\000\000\005\185\000\000\000}\005\185\000}\000\000\000}\005\185\000\129\000\129\000}\000\000\000\000\000\129\000\000\000}\000\129\000\129\005\185\000}\005\185\000}\000}\005\185\002\138\000\129\000\000\000\129\000\129\000\129\000\000\000\129\000\129\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\185\000\000\000\000\000\250\000\129\000\000\000\000\004\006\000\000\000\000\000\000\000\129\000\129\000\000\000\000\000\129\000\000&\"\004q\000\129\000\000\000\129\000\000\0046\000\129\004q\000\000\000\000\004q\000\000\000\129\000\129\000\129\000\000\000\000\004B\004q\000\000\000\000\000\129\000\129\000\000\025\186\000\000\004q\000\000\000\129\000\129\000\000\005\138\000\000\000\000!\162\000\129\004q\026\030\000\129\000\000\000\000\000\000\004q\0266\004q\000\000\000\129\000\000\000\129\000\129\004q\000\129\000\129\000\000\000\000\000\000\000\000\004q\000\000\026>\000\000\000\129%\178\000\129\000\000\000\129%\210\000\133\000\133\000\129\000\000\000\000\000\133\000\000\000\129\000\133\000\133\026F\000\129\026\130\000\129\000\129\005\245\026B\000\133\000\000\000\133\000\133\000\133\000\000\000\133\000\133\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\218\000\000\000\000\000\250\000\133\000\000\000\000\004\006\000\000\000\000\011v\000\133\000\133\000\000\000\000\000\133\000\000\005\237\002J\000\133\000\000\000\133\000\000\0046\000\133\002N\000\000\000\000\002V\000\000\000\133\000\133\000\133\000\000\000\000\004B\001\238\000\000\000\000\000\133\000\133\000\000\025\186\000\000\000\000\000\000\000\133\000\133\000\000\005\174\000\000\000\000!\162\000\133\003\238\026\030\000\133\000\000\000\000\000\000\t\186\0266\001\250\000\000\000\133\000\000\000\133\000\133\003b\000\133\000\133\000\000\000\000\000\000\000\000\000\000\000\000\026>\000\000\000\133\000\000\000\133\000\000\000\133\000\000\011!\011!\000\133\000\000\000\000\011!\000\000\000\133\001\234\011!\026F\000\133\026\130\000\133\000\133\000\000\t\198\011!\000\000\011!\011!\011!\000\000\011!\011!\011!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\218\000\000\000\000\000\000\011!\000\000\000\000\000\000\000\000\001\230\001\234\011!\011!\000\000\000\000\011!\000\000\000\000\000\000\005\018\000\000\011!\000\000\000\000\011!\000\000\000\000\000\000\001\238\003\026\011!\011!\011!\000\000\000\000\006\145\016e\000\000\000\000\011!\011!\000\000\000\000\000\000\000\000\000\000\011!\000\000\000\000\011!\000\000\000\000\006\186\005~\005\018\006\145\011!\000\000\003N\006\145\003b\004\242\004\254\000\000\011!\000\000\011!\011!\005\n\011!\011!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011!\000\000\011!\000\000\011!\000\000\015\225\015\225\011!\005\014\000\000\015\225\000\000\011!\001\234\015\225\000\000\011!\000\000\011!\011!\000\000\000\000\006\030\000\000\015\225\015\225\015\225\000\000\015\225\015\225\015\225\000\000\000\000\000\000\000\000\000\000\000\000\016e\000\000\000\000\016e\016e\015\225\000\000\000\000\000\000\000\000\001\230\001\234\015\225\015\225\000\000\000\000\015\225\000\000\006\145\000\000\005\018\000\000\015\225\000\000\016e\015\225\016e\000\000\000\000\001\238\003\026\015\225\015\225\015\225\006\145\000\000\000\000\006\145\000\000\000\000\015\225\015\225\000\000\000\000\000\000\000\000\000\000\015\225\000\000\000\000\015\225\000\000\000\000#\170\005~\005\018\000\000\015\225\000\000\003N\000\000\003b\004\242\004\254\000\000\015\225\000\000\015\225\015\225\005\n\015\225\015\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\225\000\000\015\225\000\000\015\225\000\000\011%\011%\015\225\005\014\000\000\011%\000\000\015\225\001\234\011%\000\000\015\225\000\000\015\225\015\225\000\000\000\000\011%\000\000\011%\011%\011%\000\000\011%\011%\011%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011%\000\000\000\000\000\000\000\000\000\000\000\000\011%\011%\000\000\000\000\011%\000\000\000\000\000\000\005\018\000\000\011%\000\000\000\000\011%\000\000\000\000\000\000\000\000\000\000\011%\011%\011%\000\000\000\000\000\000\023N\000\000\000\000\011%\011%\000\000\000\000\000\000\002J\000\000\011%\000\000\000\000\011%\000\000\002N\000\000\005~\002V\000\000\011%\000\000\000\000\000\000\000\000\000\000\001\238\000\000\011%\000\000\011%\011%\000\000\011%\011%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011%\003\238\011%\000\000\011%\015\229\015\229\t\186\011%\001\250\015\229\000\000\000\000\011%\015\229\003b\000\000\011%\000\000\011%\011%\000\000\005n\000\000\015\229\015\229\015\229\000\000\015\229\015\229\015\229\000\000\000\000\000\000\000\000\000\000\000\000\001\230\001\234\000\000\000\000\000\000\015\229\000\000\000\000\000\000\000\000\000\000\t\198\015\229\015\229\000\000\000\000\015\229\000\000\000\000\001\238\001\242\000\000\015\229\000\000\000\000\015\229\000\000\000\000\000\000\000\000\000\000\015\229\015\229\015\229\000\000\000\000\000\000\000\000\000\000\000\000\015\229\015\229\000\000\024\014\000\000\005\018\000\000\015\229\000\000\003N\015\229\003b\004\242\004\254\015\229\000\000\000\000\015\229\000\000\005\n\000\000\023\154\000\000\000\000\000\000\015\229\000\000\015\229\015\229\000\000\015\229\015\229\001\230\001\234\000\000\000\000\000\000\000\000\000\000\005\014\015\229\000\000\015\229\023\230\015\229\004%\004%\000\000\015\229\000\000\004%\001\238\003\026\015\229\004%\000\000\000\000\015\229\000\000\015\229\015\229\000\000\000\000\000\000\004%\004%\004%\000\000\004%\004%\004%\000\000\000\000\000\000\000\000\003R\000\000#2\000\000\000\000\000\000\003N\004%\003b\004\242\004\254\000\000\000\000\000\000\004%\005^\005\n\000\000\004%\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\004%\004%\004%\005\014\000\000\000\000\0061\000\000\000\000\004%\004%\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\004%\000\000\000\000\000\000\004%#J\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\004%\004%\000\000\004%\004%\001\230\001\234\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\004%\000\000\004%\015)\015)\000\000\004%\000\000\015)\001\238\003\026\004%\015)\000\000\000\000\004%\000\000\004%\004%\000\000\000\000\000\000\015)\015)\015)\000\000\015)\015)\015)\000\000\000\000\000\000\000\000\003R\000\000\005\018\000\000\000\000\000\000\003N\015)\003b\004\242\004\254\000\000\000\000\024\246\015)\005^\005\n\000\000\015)\000\000\000\000\002J\000\000\000\000\015)\000\000\000\000\015)\002N\000\000\000\000\002V\000\000\015)\015)\015)\005\014\000\000\000\000\001\238\023\246\000\000\015)\015)\000\000\000\000\000\000\000\000\000\000\015)\000\000\000\000\015)\000\000\000\000\000\000\015)\003\238\000\000\015)\000\000\000\000\000\000\t\186\000\000\001\250\000\000\015)\000\000\015)\015)\003b\015)\015)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015)\000\000\015)\000\000\015)\0151\0151\000\000\015)\000\000\0151\000\000\000\000\015)\0151\000\000\000\000\015)\000\000\015)\015)\000\000\t\198\000\000\0151\0151\0151\000\000\0151\0151\0151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0151\000\000\000\000\000\000\000\000\000\000\025B\0151\005^\000\000\000\000\0151\000\000\000\000\002J\000\000\000\000\0151\000\000\000\000\0151\002N\000\000\000\000\002V\000\000\0151\0151\0151\000\000\000\000\000\000\001\238\000\000\000\000\0151\0151\000\000\000\000\000\000\000\000\000\000\0151\000\000\000\000\0151\000\000\000\000\000\000\0151\003\238\000\000\0151\000\000\000\000\000\000\t\186\000\000\001\250\000\000\0151\000\000\0151\0151\003b\0151\0151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0151\000\000\0151\000\000\0151\0155\0155\000\000\0151\000\000\0155\000\000\000\000\0151\0155\000\000\000\000\0151\000\000\0151\0151\000\000\t\198\000\000\0155\0155\0155\000\000\0155\0155\0155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0155\000\000\000\000\000\000\000\000\000\000\025R\0155\006\006\000\000\000\000\0155\000\000\000\000\002J\000\000\000\000\0155\000\000\000\000\0155\002N\000\000\000\000\002V\000\000\0155\0155\0155\000\000\000\000\000\000\001\238\000\000\000\000\0155\0155\000\000\000\000\000\000\000\000\000\000\0155\000\000\000\000\0155\000\000\000\000\000\000\0155\003\238\000\000\0155\000\000\000\000\000\000\t\186\000\000\001\250\000\000\0155\000\000\0155\0155\003b\0155\0155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0155\000\000\0155\000\000\0155\0159\0159\000\000\0155\000\000\0159\000\000\000\000\0155\0159\000\000\000\000\0155\000\000\0155\0155\000\000\t\198\000\000\0159\0159\0159\000\000\0159\0159\0159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0159\000\000\000\000\000\000\000\000\000\000\025z\0159\005^\000\000\000\000\0159\000\000\000\000\002J\000\000\000\000\0159\000\000\000\000\0159\002N\000\000\000\000\002V\000\000\0159\0159\0159\000\000\000\000\000\000\001\238\000\000\000\000\0159\0159\000\000\000\000\000\000\000\000\000\000\0159\000\000\000\000\0159\000\000\000\000\000\000\0159\003\238\000\000\0159\000\000\000\000\000\000\t\186\000\000\001\250\000\000\0159\000\000\0159\0159\003b\0159\0159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0159\000\000\0159\000\000\0159\015=\015=\000\000\0159\000\000\015=\000\000\000\000\0159\015=\000\000\000\000\0159\000\000\0159\0159\000\000\t\198\000\000\015=\015=\015=\000\000\015=\015=\015=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015=\000\000\000\000\000\000\000\000\000\000\025\138\015=\006\006\000\000\000\000\015=\000\000\000\000\002J\000\000\000\000\015=\000\000\000\000\015=\002N\000\000\000\000\002V\000\000\015=\015=\015=\000\000\000\000\000\000\001\238\000\000\000\000\015=\015=\000\000\000\000\000\000\000\000\000\000\015=\000\000\000\000\015=\000\000\000\000\000\000\015=\003\238\000\000\015=\000\000\000\000\000\000\t\186\000\000\001\250\000\000\015=\000\000\015=\015=\003b\015=\015=\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\015=\000\000\015=\001=\015=\014\225\014\225\000\000\015=\000\000\014\225\000\000\000\000\015=\014\225\000\000\000\000\015=\000\000\015=\015=\000\000\t\198\001=\014\225\014\225\014\225\000\000\014\225\014\225\014\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\225\000\000\000\000\000\000\001=\000\000\027\226\014\225\005^\000\000\000\000\014\225\000\000\001=\000\000\000\000\000\000\014\225\000\000\001=\014\225\000\000\000\000\000\000\000\000\000\000\014\225\014\225\014\225\001=\000\000\000\000\000\000\000\000\000\000\014\225\014\225\000\000\000\000\000\000\000\000\000\000\014\225\000\000\000\000\014\225\000\000\000\000\000\000\014\225\000\000\000\000\014\225\000\000\000\000\000\000\000\000\000\000\000\000\001=\014\225\000\000\014\225\014\225\000\000\014\225\014\225\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\014\225\000\000\014\225\000\000\014\225\014\229\014\229\000\000\014\225\000\000\014\229\000\000\000\000\014\225\014\229\000\000\000\000\014\225\000\000\014\225\014\225\000\000\000\000\000\000\014\229\014\229\014\229\000\000\014\229\014\229\014\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\229\000\000\000\000\000\000\000\000\000\000\000\000\014\229\006\006\000\000\000\000\014\229\000\000\000\000\000\000\000\000\000\000\014\229\000\000\000\000\014\229\000\000\000\000\000\000\000\000\000\000\014\229\014\229\014\229\000\000\000\000\000\000\000\000\000\000\000\000\014\229\014\229\000\000\000\000\000\000\000\000\000\000\014\229\000\000\000\000\014\229\000\000\000\000\000\000\014\229\000\000\000\000\014\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\229\000\000\014\229\014\229\000\000\014\229\014\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\229\000\000\014\229\000\000\014\229\014\233\014\233\000\000\014\229\000\000\014\233\000\000\000\000\014\229\014\233\000\000\000\000\014\229\000\000\014\229\014\229\000\000\000\000\000\000\014\233\014\233\014\233\000\000\014\233\014\233\014\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\233\000\000\000\000\000\000\000\000\000\000\000\000\014\233\005^\000\000\000\000\014\233\000\000\000\000\000\000\000\000\000\000\014\233\000\000\000\000\014\233\000\000\000\000\000\000\000\000\000\000\014\233\014\233\014\233\000\000\000\000\000\000\000\000\000\000\000\000\014\233\014\233\000\000\000\000\000\000\000\000\000\000\014\233\000\000\000\000\014\233\000\000\000\000\000\000\014\233\000\000\000\000\014\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\233\000\000\014\233\014\233\000\000\014\233\014\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\233\000\000\014\233\000\000\014\233\014\237\014\237\000\000\014\233\000\000\014\237\000\000\000\000\014\233\014\237\000\000\000\000\014\233\000\000\014\233\014\233\000\000\000\000\000\000\014\237\014\237\014\237\000\000\014\237\014\237\014\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\237\000\000\000\000\000\000\000\000\000\000\000\000\014\237\006\006\000\000\000\000\014\237\000\000\000\000\000\000\000\000\000\000\014\237\000\000\000\000\014\237\000\000\000\000\000\000\000\000\000\000\014\237\014\237\014\237\000\000\000\000\000\000\000\000\000\000\000\000\014\237\014\237\000\000\000\000\000\000\000\000\000\000\014\237\000\000\000\000\014\237\000\000\000\000\000\000\014\237\000\000\000\000\014\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\237\000\000\014\237\014\237\000\000\014\237\014\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\237\000\000\014\237\000\000\014\237\014\241\014\241\000\000\014\237\000\000\014\241\000\000\000\000\014\237\014\241\000\000\000\000\014\237\000\000\014\237\014\237\000\000\000\000\000\000\014\241\014\241\014\241\000\000\014\241\014\241\014\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\241\000\000\000\000\000\000\000\000\000\000\000\000\014\241\005^\000\000\000\000\014\241\000\000\000\000\000\000\000\000\000\000\014\241\000\000\000\000\014\241\000\000\000\000\000\000\000\000\000\000\014\241\014\241\014\241\000\000\000\000\000\000\000\000\000\000\000\000\014\241\014\241\000\000\000\000\000\000\000\000\000\000\014\241\000\000\000\000\014\241\000\000\000\000\000\000\014\241\000\000\000\000\014\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\241\000\000\014\241\014\241\000\000\014\241\014\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\241\000\000\014\241\000\000\014\241\014\245\014\245\000\000\014\241\000\000\014\245\000\000\000\000\014\241\014\245\000\000\000\000\014\241\000\000\014\241\014\241\000\000\000\000\000\000\014\245\014\245\014\245\000\000\014\245\014\245\014\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\245\000\000\000\000\000\000\000\000\000\000\000\000\014\245\006\006\000\000\000\000\014\245\000\000\000\000\000\000\000\000\000\000\014\245\000\000\000\000\014\245\000\000\000\000\000\000\000\000\000\000\014\245\014\245\014\245\000\000\000\000\000\000\000\000\000\000\000\000\014\245\014\245\000\000\000\000\000\000\000\000\000\000\014\245\000\000\000\000\014\245\000\000\000\000\000\000\014\245\000\000\000\000\014\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\245\000\000\014\245\014\245\000\000\014\245\014\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\245\000\000\014\245\000\000\014\245\014\249\014\249\000\000\014\245\000\000\014\249\000\000\000\000\014\245\014\249\000\000\000\000\014\245\000\000\014\245\014\245\000\000\000\000\000\000\014\249\014\249\014\249\000\000\014\249\014\249\014\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\249\000\000\000\000\000\000\000\000\000\000\000\000\014\249\005^\000\000\000\000\014\249\000\000\000\000\000\000\000\000\000\000\014\249\000\000\000\000\014\249\000\000\000\000\000\000\000\000\000\000\014\249\014\249\014\249\000\000\000\000\000\000\000\000\000\000\000\000\014\249\014\249\000\000\000\000\000\000\000\000\000\000\014\249\000\000\000\000\014\249\000\000\000\000\000\000\014\249\000\000\000\000\014\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\249\000\000\014\249\014\249\000\000\014\249\014\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\249\000\000\014\249\000\000\014\249\014\253\014\253\000\000\014\249\000\000\014\253\000\000\000\000\014\249\014\253\000\000\000\000\014\249\000\000\014\249\014\249\000\000\000\000\000\000\014\253\014\253\014\253\000\000\014\253\014\253\014\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\253\000\000\000\000\000\000\000\000\000\000\000\000\014\253\006\006\000\000\000\000\014\253\000\000\000\000\000\000\000\000\000\000\014\253\000\000\000\000\014\253\000\000\000\000\000\000\000\000\000\000\014\253\014\253\014\253\000\000\000\000\000\000\000\000\000\000\000\000\014\253\014\253\000\000\000\000\000\000\000\000\000\000\014\253\000\000\000\000\014\253\000\000\000\000\000\000\014\253\000\000\000\000\014\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\253\000\000\014\253\014\253\000\000\014\253\014\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\253\000\000\014\253\000\000\014\253\015-\015-\000\000\014\253\000\000\015-\000\000\000\000\014\253\015-\000\000\000\000\014\253\000\000\014\253\014\253\000\000\000\000\000\000\015-\015-\015-\000\000\015-\015-\015-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015-\000\000\000\000\000\000\000\000\000\000\000\000\015-\006\006\000\000\000\000\015-\000\000\000\000\000\000\000\000\000\000\015-\000\000\000\000\015-\000\000\000\000\000\000\000\000\000\000\015-\015-\015-\000\000\000\000\000\000\000\000\000\000\000\000\015-\015-\000\000\000\000\000\000\000\000\000\000\015-\000\000\000\000\015-\000\000\000\000\000\000\015-\000\000\000\000\015-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015-\000\000\015-\015-\000\000\015-\015-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015-\000\000\015-\000\000\015-\015!\015!\000\000\015-\000\000\015!\000\000\000\000\015-\015!\000\000\000\000\015-\000\000\015-\015-\000\000\000\000\000\000\015!\015!\015!\000\000\015!\015!\015!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015!\000\000\000\000\000\000\000\000\000\000\000\000\015!\005^\000\000\000\000\015!\000\000\000\000\000\000\000\000\000\000\015!\000\000\000\000\015!\000\000\000\000\000\000\000\000\000\000\015!\015!\015!\000\000\000\000\000\000\000\000\000\000\000\000\015!\015!\000\000\000\000\000\000\000\000\000\000\015!\000\000\000\000\015!\000\000\000\000\000\000\015!\000\000\000\000\015!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015!\000\000\015!\015!\000\000\015!\015!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015!\000\000\015!\000\000\015!\015%\015%\000\000\015!\000\000\015%\000\000\000\000\015!\015%\000\000\000\000\015!\000\000\015!\015!\000\000\000\000\000\000\015%\015%\015%\000\000\015%\015%\015%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015%\000\000\000\000\000\000\000\000\000\000\000\000\015%\006\006\000\000\000\000\015%\000\000\000\000\000\000\000\000\000\000\015%\000\000\000\000\015%\000\000\000\000\000\000\000\000\000\000\015%\015%\015%\000\000\000\000\000\000\000\000\000\000\000\000\015%\015%\000\000\000\000\000\000\000\000\000\000\015%\000\000\000\000\015%\000\000\000\000\000\000\015%\000\000\000\000\015%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015%\000\000\015%\015%\000\000\015%\015%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015%\000\000\015%\000\000\015%\015\001\015\001\000\000\015%\000\000\015\001\000\000\000\000\015%\015\001\000\000\000\000\015%\000\000\015%\015%\000\000\000\000\000\000\015\001\015\001\015\001\000\000\015\001\015\001\015\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\001\000\000\000\000\000\000\000\000\000\000\000\000\015\001\005^\000\000\000\000\015\001\000\000\000\000\000\000\000\000\000\000\015\001\000\000\000\000\015\001\000\000\000\000\000\000\000\000\000\000\015\001\015\001\015\001\000\000\000\000\000\000\000\000\000\000\000\000\015\001\015\001\000\000\000\000\000\000\000\000\000\000\015\001\000\000\000\000\015\001\000\000\000\000\000\000\015\001\000\000\000\000\015\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\001\000\000\015\001\015\001\000\000\015\001\015\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\001\000\000\015\001\000\000\015\001\015\005\015\005\000\000\015\001\000\000\015\005\000\000\000\000\015\001\015\005\000\000\000\000\015\001\000\000\015\001\015\001\000\000\000\000\000\000\015\005\015\005\015\005\000\000\015\005\015\005\015\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\005\000\000\000\000\000\000\000\000\000\000\000\000\015\005\006\006\000\000\000\000\015\005\000\000\000\000\000\000\000\000\000\000\015\005\000\000\000\000\015\005\000\000\000\000\000\000\000\000\000\000\015\005\015\005\015\005\000\000\000\000\000\000\000\000\000\000\000\000\015\005\015\005\000\000\000\000\000\000\000\000\000\000\015\005\000\000\000\000\015\005\000\000\000\000\000\000\015\005\000\000\000\000\015\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\005\000\000\015\005\015\005\000\000\015\005\015\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\005\000\000\015\005\000\000\015\005\015\t\015\t\000\000\015\005\000\000\015\t\000\000\000\000\015\005\015\t\000\000\000\000\015\005\000\000\015\005\015\005\000\000\000\000\000\000\015\t\015\t\015\t\000\000\015\t\015\t\015\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\t\000\000\000\000\000\000\000\000\000\000\000\000\015\t\005^\000\000\000\000\015\t\000\000\000\000\000\000\000\000\000\000\015\t\000\000\000\000\015\t\000\000\000\000\000\000\000\000\000\000\015\t\015\t\015\t\000\000\000\000\000\000\000\000\000\000\000\000\015\t\015\t\000\000\000\000\000\000\000\000\000\000\015\t\000\000\000\000\015\t\000\000\000\000\000\000\015\t\000\000\000\000\015\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\t\000\000\015\t\015\t\000\000\015\t\015\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\t\000\000\015\t\000\000\015\t\015\r\015\r\000\000\015\t\000\000\015\r\000\000\000\000\015\t\015\r\000\000\000\000\015\t\000\000\015\t\015\t\000\000\000\000\000\000\015\r\015\r\015\r\000\000\015\r\015\r\015\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\r\000\000\000\000\000\000\000\000\000\000\000\000\015\r\006\006\000\000\000\000\015\r\000\000\000\000\000\000\000\000\000\000\015\r\000\000\000\000\015\r\000\000\000\000\000\000\000\000\000\000\015\r\015\r\015\r\000\000\000\000\000\000\000\000\000\000\000\000\015\r\015\r\000\000\000\000\000\000\000\000\000\000\015\r\000\000\000\000\015\r\000\000\000\000\000\000\015\r\000\000\000\000\015\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\r\000\000\015\r\015\r\000\000\015\r\015\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\r\000\000\015\r\000\000\015\r\015\017\015\017\000\000\015\r\000\000\015\017\000\000\000\000\015\r\015\017\000\000\000\000\015\r\000\000\015\r\015\r\000\000\000\000\000\000\015\017\015\017\015\017\000\000\015\017\015\017\015\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\017\000\000\000\000\000\000\000\000\000\000\000\000\015\017\005^\000\000\000\000\015\017\000\000\000\000\000\000\000\000\000\000\015\017\000\000\000\000\015\017\000\000\000\000\000\000\000\000\000\000\015\017\015\017\015\017\000\000\000\000\000\000\000\000\000\000\000\000\015\017\015\017\000\000\000\000\000\000\000\000\000\000\015\017\000\000\000\000\015\017\000\000\000\000\000\000\015\017\000\000\000\000\015\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\017\000\000\015\017\015\017\000\000\015\017\015\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\017\000\000\015\017\000\000\015\017\015\021\015\021\000\000\015\017\000\000\015\021\000\000\000\000\015\017\015\021\000\000\000\000\015\017\000\000\015\017\015\017\000\000\000\000\000\000\015\021\015\021\015\021\000\000\015\021\015\021\015\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\021\000\000\000\000\000\000\000\000\000\000\000\000\015\021\006\006\000\000\000\000\015\021\000\000\000\000\000\000\000\000\000\000\015\021\000\000\000\000\015\021\000\000\000\000\000\000\000\000\000\000\015\021\015\021\015\021\000\000\000\000\000\000\000\000\000\000\000\000\015\021\015\021\000\000\000\000\000\000\000\000\000\000\015\021\000\000\000\000\015\021\000\000\000\000\000\000\015\021\000\000\000\000\015\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\021\000\000\015\021\015\021\000\000\015\021\015\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\021\000\000\015\021\000\000\015\021\015\025\015\025\000\000\015\021\000\000\015\025\000\000\000\000\015\021\015\025\000\000\000\000\015\021\000\000\015\021\015\021\000\000\000\000\000\000\015\025\015\025\015\025\000\000\015\025\015\025\015\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\025\000\000\000\000\000\000\000\000\000\000\000\000\015\025\005^\000\000\000\000\015\025\000\000\000\000\000\000\000\000\000\000\015\025\000\000\000\000\015\025\000\000\000\000\000\000\000\000\000\000\015\025\015\025\015\025\000\000\000\000\000\000\000\000\000\000\000\000\015\025\015\025\000\000\000\000\000\000\000\000\000\000\015\025\000\000\000\000\015\025\000\000\000\000\000\000\015\025\000\000\000\000\015\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\025\000\000\015\025\015\025\000\000\015\025\015\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\025\000\000\015\025\000\000\015\025\015\029\015\029\000\000\015\025\000\000\015\029\000\000\000\000\015\025\015\029\000\000\000\000\015\025\000\000\015\025\015\025\000\000\000\000\000\000\015\029\015\029\015\029\000\000\015\029\015\029\015\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\029\000\000\000\000\000\000\000\000\000\000\000\000\015\029\006\006\000\000\000\000\015\029\000\000\000\000\000\000\000\000\000\000\015\029\000\000\000\000\015\029\000\000\000\000\000\000\000\000\000\000\015\029\015\029\015\029\000\000\000\000\000\000\000\000\000\000\000\000\015\029\015\029\000\000\000\000\000\000\000\000\000\000\015\029\000\000\000\000\015\029\000\000\000\000\000\000\015\029\000\000\000\000\015\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\029\000\000\015\029\015\029\000\000\015\029\015\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\029\000\000\015\029\000\000\015\029\0025\0025\000\000\015\029\000\000\0025\000\000\000\000\015\029\0025\000\000\000\000\015\029\000\000\015\029\015\029\000\000\000\000\000\000\0025\0025\0025\000\000\0025\0025\0025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0025\000\000\000\000\000\000\000\000\000\000\000\000\0025\0025\000\000\000\000\0025\000\000\000\000\000\000\000\000\000\000\0025\000\000\000\000\0025\000\000\000\000\000\000\000\000\000\000\0025\0025\0025\000\000\000\000\000\000\000\000\000\000\000\000\0025\0025\000\000\000\000\000\000\000\000\000\000\0025\000\000\000\000\0025\000\000\000\000\000\000\0025\000\000\000\000\0025\000\000\000\000\003\154\003r\000\000\000\000\003\022\0025\tB\0025\0025\003\130\0025\0025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\238\0025\tz\0025\000\000\0025\000\000\003\158\000\000\0025\011\206\000\000\000\000\000\000\0025\000\000\000\000\000\000\006.\000\000\0025\003\178\000\000\000\000\012\022\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\rm\004\206\000\000\004\214\000\000\012~\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005e\000\000\007\158\007\166\007\170\000\000\007\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\182\007\186\000\000\000\000\000\000\016\158\000\000\000\000\000\000\000\000\000\000\002E\002E\002E\000\000\000\000\002E\000\000\000\000\rm\000\000\002E\000\000\rm\rm\000\000\007\190\002E\000\000\000\000\rm\002E\005J\000\000\rm\005e\000\000\000\000\002E\000\n\000\000\000\000\t\146\002E\000\000\000\000\000\000\000\000\000\000\0232\000\000\000\000\002E\000\000\000\000\002E\002E\002E\000\000\000\000\000\000\000\000\000\000\002E\000\000\000\000\002E\002E\000\000\000\000\002E\002E\000\000\002E\002E\000\000\002E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002E\002E\002E\000\000\002E\001\206\007\145\007\145\000\000\000\000\007\145\000\000\000\000\002E\002E\007\145\000\000\023r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\145\007\145\000\000\000\000\000\000\000\000\000\000\007\145\000\000\000\000\000\000\000\000\001\210\000\000\002E\000\000\000\000\000\000\000\000\000\000\002E\007\145\000\000\000\000\007\145\001\214\007\145\000\000\000\000\000\000\007\145\000\000\007\145\007\145\007\145\007\145\007\145\000\000\000\000\000\000\007\145\000\000\007\145\007\145\000\000\007\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\145\007\145\007\145\000\000\007\145\001\206\007\149\007\149\000\000\000\000\007\149\000\000\000\000\007\145\007\145\007\149\000\000\007\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\149\007\149\000\000\000\000\000\000\000\000\000\000\007\149\000\000\000\000\000\000\000\000\001\210\000\000\007\145\000\000\000\000\000\000\000\000\000\000\007\145\007\149\000\000\000\000\007\149\001\214\007\149\000\000\000\000\000\000\007\149\000\000\007\149\007\149\007\149\007\149\007\149\000\000\000\000\000\000\007\149\000\000\007\149\007\149\000\000\007\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\149\007\149\007\149\000\000\007\149\001\206\007\141\007\141\000\000\000\000\007\141\000\000\000\000\007\149\007\149\007\141\000\000\007\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\141\007\141\000\000\000\000\000\000\000\000\000\000\007\141\000\000\000\000\000\000\000\000\001\210\000\000\007\149\000\000\000\000\000\000\000\000\000\000\007\149\007\141\000\000\000\000\007\141\001\214\007\141\000\000\000\000\000\000\007\141\000\000\007\141\007\141\007\141\007\141\007\141\000\000\000\000\000\000\007\141\000\000\007\141\007\141\000\000\007\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\141\007\141\007\141\000\000\007\141\000\000\006\233\006\233\000\000\000\000\000\000\006\233\000\000\007\141\007\141\006\233\000\000\007\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\233\000\000\006\233\000\000\006\233\000\000\006\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\141\000\000\000\000\000\000\006\233\000\000\007\141\000\000\000\000\000\000\000\000\006\233\006\233\000\000\000\000\000\000\000\000\006\233\000\000\000\000\000\000\006\233\000\000\000\000\006\233\000\000\000\000\000\000\000\000\000\000\006\233\006\233\006\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\233\006\233\000\000\006\233\000\000\000\000\000\000\006\233\000\000\000\000\000\000\000\000\000\000\003\154\003r\000\000\000\000\003\022\006\233\tB\006\233\006\233\003\130\006\233\006\233\000\000\000\000\000\000\000\000\nn\000\000\000\000\001\238\000\000\tz\000\000\000\000\006\233\000\000\003\158\006\233\006\233\011\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\017\006\233\003\178\000\000\000\000\012\022\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\000\000\012~\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\158\007\166\007\170\000\000\007\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\182\007\186\005\161\005\161\005\161\004\017\000\000\005\161\000\000\000\000\000\000\000\000\005\161\000\000\000\000\000\000\000\000\000\000\005\161\000\000\000\000\004\017\005\161\000\000\004\017\000\000\007\190\000\000\000\000\005\161 B\000\000\005J Z\005\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\161\000\000\000\000\005\161\005\161\005\161\000\000\004e\004e\004e\000\000\005\161\004e\004e\005\161\005\161\004e\004e\000\242\005\161\000\000\005\161\005\161\000\000\005\161\000\000\004e\004e\004e\004e\004e\004e\004e\004e\000\000\005\161\005\161\005\161\000\000\005\161\000\000\000\000\000\000\000\000\004e\004e\000\000\000\000\005\161\005\161\000\000\004e\004e\004e\000\000\000\000\000\000\006e\006i\000\000\000\000\004e\004e\000\000\004e\004e\000\000\000\000\000\000\000\000\004e\004e\004e\004e\005\161\000\000\000\000\000\000\000\000\000\000\005\161\000\000\000\000\000\000\000\000\000\000\004e\004e\000\000\004e\004e\000\000\000\000\004e\004e\000\000\000\000\000\000\001\206\001\230\001\234\000\000\000\000\000\000\004e\004e\004e\004e\004e\004e\004e\004e\006\221\006\221\000\000\006e\006i\006\221\001\238\003\026\000\000\006\221\000\000\004e\004e\004e\000\000\004e\004e\000\000\001\210\006\221\000\000\006\221\000\000\006\221\000\000\006\221\004e\004e\000\000\000\000\003J\001\214\005\018\000\000\000\000\000\000\003N\006\221\003b\004\242\004\254\000\000\000\000\000\000\006\221\006\221\005\n\000\000\000\000\000\000\n\190\000\000\000\000\000\000\006\221\000\000\000\000\006\221\000\000\000\000\000\000\000\000\000\000\006\221\006\221\000\242\005\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\221\006\221\000\000\006\221\000\000\000\000\000\000\006\221\000\000\000\000\003\154\003r\000\000\000\000\003\022\000\000\tB\000\000\006\221\003\130\006\221\006\221\000\000\006\221\006\221\000\000\000\000\000\000\000\000\001\238\000\000\tz\000\000\000\000\000\000\000\000\003\158\006\221\000\000\011\206\006\221\006\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\178\000\000\006\221\012\022\000\000\001\194\000\000\000\000\000\000\000\000\0111\003b\000\000\020\190\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\019\222\012~\007\154\000\000\000\000\014J\000\000\000\000\017\238\0111\000\000\0111\0111\007\158\007\166\007\170\000\000\007\174\000\000\014\178\014\250\015\018\014\202\015*\000\000\000\000\007\182\007\186\000\000\000\000\000\000\016\158\000\000\000\000\015B\015Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015r\000\000\000\000\r\174\000\000\000\000\017n\000\000\007\190\000\242\000\000\000\000\000\000\000\000\005J\000\000\000\000\000\000\014b\014\226\015\138\015\162\015\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\234\000\000\000\000\000\000\000\000\020\214\000\000\000\000\000\000\000\000\000\000\016\002\000\000\b\154\000\000\000\000\019\226\000\000\000\250\001\206\001\230\001\234\002^\000\000\000\000\016b\0111\000\000\016z\015\186\000\000\000\000\026\194\000\000\0111\016\026\005\193\000\000\0046\001\238\003\026\002\002\000\000\0162\016J\000\000\000\000\000\000\000\000\002\014\026\198\001\210\000\000\000\000\000\000\000\000\000\000\026\238\000\000\000\000\000\000\000\000\000\000\003^\001\214\003B\000\000\000\000\000\000\003N\026\030\003b\004\242\004\254\001\n\000\000\0266\000\000\000\000\005\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\014\026>\000\000\000\000\003*\000\000\000\000\000\000\005\014\000\000\000\000\000\000\000\000\001\018\001\022\001\026\001\030\001\"\001&\026F\000\000\027\142\000\000\000\000\000\000\000\000\000\000\001*\000\000\0012\0016\000\000\000\000\000\000\000\000\000\000\001:\000\000\000\000\001>\000\000\000\000\027\158\000\000\000\000\000\000\000\000\005F\000\000\005J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\000\000\000\000\000\000\000\000\001V\000\000\011Y\000\000\001Z\000\000\000\000\000\000\001\206\003\154\003r\000\000\000\000\003\022\000\000\001^\000\000\000\000\003\130\000\000\000\000\001b\000\000\000\000\000\000\011Y\000\000\000\000\001\238\000\000\000\000\000\000\001\158$\198\000\000\003\158\000\000\000\000\000\000\001\162\001\210\001\166\000\000\000\000\000\000\001\170\000\000\001\174\001\178\003\178\000\000\000\000\003\198\001\214\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\158\007\166\007\170\000\000\007\174\000\000\nm\nm\000\000\000\000\000\000\nm\000\000\007\182\007\186\nm\000\000\b\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nm\000\000\nm\000\000\nm\000\000\nm\000\000\011Y\000\000\000\000\000\000\000\000\000\000\007\190\000\000\011Y\000\000\nm\000\000\005J\000\000\000\000\000\000\000\000\nm\nm\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nm\000\000\000\000\nm\000\000\000\000\000\000\000\000\000\000\nm\nm\nm\000\000\000\000\000\000\016\193\016\193\000\000\000\000\000\000\016\193\000\000\000\000\000\000\016\193\nm\000\000\000\000\nm\000\000\000\000\000\000\nm\000\000\016\193\000\000\016\193\000\000\016\193\000\000\016\193\000\000\000\000\nm\000\000\nm\nm\000\000\nm\nm\000\000\000\000\016\193\000\000\000\000\000\000\000\000\000\000\nm\016\193\016\193\000\000\nm\000\000\000\000\005\026\nm\000\000\000\000\016\193\000\000\000\000\016\193\000\000\000\000\006.\000\000\nm\016\193\016\193\016\193\000\000\000\000\000\000\016\197\016\197\000\000\000\000\000\000\016\197\000\000\000\000\000\000\016\197\016\193\000\000\000\000\016\193\000\000\000\000\000\000\016\193\000\000\016\197\000\000\016\197\000\000\016\197\000\000\016\197\000\000\000\000\016\193\000\000\016\193\016\193\000\000\016\193\016\193\000\000\000\000\016\197\000\000\005*\000\000\000\000\000\000\000\000\016\197\016\197\000\000\016\193\000\000\000\000\005\026\016\193\000\000\000\000\016\197\000\000\000\000\016\197\000\000\000\000\000\000\000\000\016\193\016\197\016\197\016\197\000\000\000\000\000\000\007=\007=\000\000\000\000\000\000\007=\000\000\000\000\000\000\007=\016\197\000\000\000\000\016\197\000\000\000\000\000\000\016\197\000\000\007=\000\000\007=\000\000\007=\000\000\007=\000\000\000\000\016\197\000\000\016\197\016\197\000\000\016\197\016\197\000\000\000\000\007=\000\000\005*\000\000\000\000\000\000\000\000\007=\007=\000\000\016\197\000\000\000\000\005\026\016\197\000\000\000\000\007=\000\000\000\000\007=\000\000\000\000\000\000\001\193\016\197\007=\007=\007=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014J\000\000\000\000\000\000\007=\000\000\001\193\007=\000\000\000\000\000\000\007=\000\000\000\000\014\178\014\250\015\018\014\202\015*\000\000\000\000\000\000\007=\000\000\007=\007=\000\000\007=\007=\015B\015Z\ty\000\000\005*\ty\000\000\000\000\000\000\000\000\015r\000\000\007=\000\000\000\000\000\000\007=\000\000\b\181\000\242\000\000\001\217\ty\ty\000\000\ty\ty\007=\014b\014\226\015\138\015\162\015\210\000\000\000\000\014J\000\000\000\000\b\181\000\000\000\000\001\217\b\181\015\234\000\000\000\000\000\000\ty\001\193\014\178\014\250\015\018\014\202\015*\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015B\015Z\000\000\ty\016b\001\193\000\000\016z\015\186\000\000\015r\000\000\000\000\001\193\016\026\000\000\000\000\000\000\ty\000\242\000\000\001\193\0162\016J\000\000\000\000\000\000\000\000\014b\014\226\015\138\015\162\015\210\000\000\000\000\000\000\000\000\000\000\ty\000\000\ty\000\000\b\181\015\234\000\000\000\000\000\000\000\000\001\217\000\000\000\000\000\000\b&\ty\016\002\000\000\ty\ty\000\000\000\000\001\209\ty\000\000\ty\000\000\000\000\000\000\ty\016b\001\217\000\000\016z\015\186\000\000\014J\000\000\000\000\001\217\016\026\000\000\001\209\000\000\000\000\000\000\000\000\001\217\0162\016J\014\178\014\250\015\018\014\202\015*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015B\015Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\001\201\000\000\000\000\000\000\000\000\000\000\000\000\014b\014\226\015\138\015\162\015\210\000\000\000\000\014J\000\000\000\000\000\000\000\000\000\000\001\201\000\000\015\234\000\000\000\000\000\000\000\000\001\209\014\178\014\250\015\018\014\202\015*\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015B\015Z\000\000\000\000\016b\001\209\000\000\016z\015\186\000\000\015r\000\000\000\000\001\209\016\026\000\000\000\000\000\000\000\000\000\242\000\000\001\209\0162\016J\000\000\000\000\000\000\000\000\014b\014\226\015\138\015\162\015\210\000\000\000\000\000\000\002\029\000\000\000\000\000\000\000\000\002\029\000\000\015\234\001\234\002\029\000\000\000\000\001\201\000\000\000\000\000\000\000\000\n\245\016\002\002\029\000\000\000\000\000\000\002\029\000\000\002\029\000\000\000\000\000\000\000\000\000\000\000\000\016b\001\201\000\000\016z\015\186\002\029\000\000\000\000\000\000\001\201\016\026\000\000\002\029\002\029\000\000\000\000\000\000\001\201\0162\016J\005\018\000\000\002\029\000\000\000\000\002\029\000\000\000\000\000\000\000\000\000\000\002\029\002\029\002\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\029\002\029\000\000\002\029\000\000\000\000\000\000\005~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002%\002\029\000\000\002\029\000\000\002%\002\029\002\029\001\234\002%\000\000\000\000\000\000\000\000\000\000\000\000\002\029\n\253\000\000\002%\000\000\000\000\000\000\002%\002\029\002%\000\000\000\000\000\000\002\029\000\000\000\000\000\000\000\000\000\000\002\029\000\000\002%\000\000\000\000\000\000\000\000\000\000\000\000\002%\002%\000\000\000\000\000\000\000\000\000\000\000\000\005\018\000\000\002%\000\000\000\000\002%\000\000\000\000\000\000\000\000\000\000\002%\002%\002%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002%\002%\000\000\002%\000\000\000\000\000\000\005~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002!\002%\000\000\002%\000\000\002!\002%\002%\001\234\002!\000\000\000\000\000\000\000\000\000\000\000\000\002%\n\249\000\000\002!\000\000\000\000\000\000\002!\002%\002!\000\000\000\000\000\000\002%\000\000\000\000\000\000\000\000\000\000\002%\000\000\002!\000\000\000\000\000\000\000\000\000\000\000\000\002!\002!\000\000\000\000\000\000\000\000\000\000\000\000\005\018\000\000\002!\000\000\000\000\002!\000\000\000\000\000\000\000\000\000\000\002!\002!\002!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002!\002!\000\000\002!\000\000\000\000\000\000\005~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004I\002!\000\000\002!\000\000\004I\002!\002!\001\234\004I\000\000\000\000\000\000\000\000\000\000\000\000\002!\n\241\000\000\004I\000\000\000\000\000\000\004I\002!\004I\000\000\000\000\000\000\002!\000\000\000\000\000\000\000\000\000\000\002!\000\000\004I\000\000\000\000\000\000\000\000\000\000\000\000\004I\002\025\000\000\000\000\000\000\000\000\000\000\000\000\005\018\000\000\004I\000\000\000\000\004I\000\000\000\000\000\000\000\000\000\000\004I\004I\004I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004I\004I\000\000\004I\000\000\000\000\000\000\005~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004E\004I\000\000\004I\000\000\004E\004I\004I\001\234\004E\000\000\000\000\000\000\000\000\000\000\000\000\004I\n\241\000\000\004E\000\000\000\000\000\000\004E\004I\004E\000\000\000\000\000\000\004I\003\154\003r\000\000\000\000\003\022\004I\tB\004E\000\000\003\130\000\000\000\000\000\000\000\000\004E\002\025\000\000\000\000\000\000\001\238\000\000\tz\005\018\000\000\004E\000\000\003\158\004E\000\000\011\206\000\000\000\000\000\000\004E\004E\004E\000\000\000\000 \138\000\000\003\178\000\000\000\000\030\242\000\000\001\194\000\000\000\000\000\000\004E\004E\003b\004E\000\000\004\198\004\202\005~\000\000\000\000\004\206\000\000\004\214\000\000\012~\007\154\000\000\000\000\004E\000\000\004E\000\000\000\000\004E\004E\000\000\007\158\007\166\007\170\000\000\007\174\000\000\000\000\004E\000\000\000\000\000\000\000\000\000\000\007\182\007\186\004E\000\000\000\000\030\246\000\000\004E\003\154\003r\000\000\000\000\003\022\004E\tB\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000!V\000\000\007\190\001\238\000\000\tz\000\000\000\000\005J\000\000\003\158\000\000\000\000\011\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\178\000\000\000\000\012\022\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\000\000\012~\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\158\007\166\007\170\000\000\007\174\000\000\003\154\003r\000\000\000\000\003\022\000\000\tB\007\182\007\186\003\130\000\000\000\000\016\158\000\000\000\000\000\000\000\000\000\000\000\000\001\238\000\000\tz\000\000\000\000\000\000\000\000\003\158\000\000\000\000\011\206\000\000\031\146\000\000\007\190\000\000\000\000\000\000\000\221\000\000\005J\003\178\000\000\000\221\012\022\000\000\001\194\000\221\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\221\000\000\000\221\004\206\000\221\004\214\000\221\012~\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\007\158\007\166\007\170\000\000\007\174\000\000\000\221\000\000\000\000\000\000\000\221\000\000\000\000\007\182\007\186\000\000\000\221\000\000\016\158\000\221\000\000\000\000\000\000\000\000\000\000\000\221\000\221\000\242\000\000\000\000\000\000\001!\000\000\000\000\000\221\000\221\001!\031\242\000\000\007\190\001!\000\221\000\000\000\000\000\221\005J\000\000\000\000\000\221\000\000\001!\000\000\001!\000\000\001!\000\000\001!\000\000\000\000\000\221\000\000\000\221\000\000\000\000\000\221\000\221\t\141\000\000\001!\t\141\000\000\000\000\000\000\000\000\000\221\001!\000\000\000\000\000\000\001!\000\000\000\221\000\221\000\000\000\000\001!\t\141\t\141\001!\t\141\t\141\000\221\000\000\000\221\001!\001!\000\242\000\000\000\000\000\000\000\229\000\000\000\000\001!\001!\000\229\000\000\000\000\000\000\000\229\001!\t\141\000\000\001!\000\000\000\000\000\000\001!\000\000\000\229\000\000\000\229\000\000\000\229\000\000\000\229\000\000\000\000\001!\000\000\001!\000\242\000\000\001!\001!\000\000\000\000\000\229\000\000\000\000\000\000\000\000\000\000\001!\000\229\000\000\t\141\000\000\000\229\000\000\001!\001!\000\000\000\000\000\229\000\000\000\000\000\229\000\000\000\000\001!\000\000\001!\000\229\000\229\000\242\t\141\000\000\t\141\000\225\000\000\000\000\000\229\000\229\000\225\000\000\000\000\000\000\000\225\000\229\t\141\t\141\000\229\000\000\b.\t\141\000\229\000\000\000\225\t\141\000\225\t\141\000\225\000\000\000\225\t\141\000\000\000\229\000\000\000\229\000\000\000\000\000\229\000\229\000\000\000\000\000\225\000\000\000\000\000\000\000\000\000\000\000\229\000\225\000\000\000\000\000\000\000\225\000\000\000\229\000\229\000\000\000\000\000\225\000\000\000\000\000\225\000\000\000\000\000\229\001\n\000\229\000\225\000\225\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\225\000\000\000\000\000\000\000\000\001\014\000\225\000\000\000\000\000\225\000\000\000\000\000\000\000\225\000\000\000\000\000\000\000\000\001\018\001\022\001\026\001\030\001\"\001&\000\225\000\000\000\225\000\000\000\000\000\225\000\225\000\000\001*\000\000\0012\0016\000\000\000\000\000\000\000\225\000\000\001:\000\000\000\000\001>\000\000\000\225\000\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\000\000\225\000\000\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\000\000\000\000\000\000\000\000\001V\000\000\000\000\000\000\001Z\001\249\000\000\000\000\000\000\000\000\001\249\000\000\000\000\000\000\001\249\001^\000\000\000\000\000\000\000\000\000\000\001b\000\000\000\000\001\249\000\000\000\000\000\000\001\249\000\000\001\249\000\000\001\158$\226\000\000\000\000\000\000\000\000\000\000\001\162\000\000\001\166\001\249\000\000\001\249\001\170\000\000\001\174\001\178\001\249\000\000\000\000\000\000\000\000\000\000\006e\000\000\000\000\000\000\001\249\000\000\000\000\001\249\000\000\000\000\000\000\000\000\000\000\001\249\001\249\001\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\249\b\006\000\000\001\249\000\000\000\000\000\000\001\249\003\154\003r\000\000\000\000\003\022\000\000\000\000\000\000\000\000\003\130\001\249\000\000\001\249\000\000\b\n\001\249\001\249\000\000\000\000\001\238\000\000\006e\000\000\000\000\000\000\001\249\003\158\000\000\000\000\000\000\000\000\000\000\001\249\001\249\000\000\000\000\000\000\000\000\001\249\000\000\003\178\000\000\000\000\003\198\001\249\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\158\007\166\007\170\000\000\007\174\000\000\016\189\016\189\000\000\000\000\000\000\016\189\000\000\007\182\007\186\016\189\000\000\b\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\189\000\000\016\189\000\000\016\189\000\000\016\189\000\000\t.\000\000\000\000\b\202\000\000\000\000\007\190\000\000\t\030\000\000\016\189\000\000\005J\000\000\000\000\000\000\000\000\016\189\016\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\189\000\000\000\000\016\189\000\000\000\000\000\000\000\000\000\000\016\189\016\189\016\189\000\000\000\000\000\000\016\185\016\185\000\000\000\000\000\000\016\185\000\000\000\000\000\000\016\185\016\189\000\000\000\000\016\189\000\000\000\000\000\000\016\189\000\000\016\185\000\000\016\185\000\000\016\185\000\000\016\185\000\000\000\000\016\189\000\000\016\189\016\189\000\000\016\189\016\189\000\000\000\000\016\185\000\000\000\000\000\000\000\000\000\000\000\000\016\185\016\185\000\000\016\189\000\000\000\000\000\000\016\189\000\000\000\000\016\185\000\000\000\000\016\185\000\000\000\000\006.\000\000\016\189\016\185\016\185\016\185\000\000\000\000\000\000\nq\nq\000\000\000\000\000\000\nq\000\000\000\000\000\000\nq\016\185\000\000\000\000\016\185\000\000\000\000\000\000\016\185\000\000\nq\000\000\nq\000\000\nq\000\000\nq\000\000\000\000\016\185\000\000\016\185\016\185\000\000\016\185\016\185\000\000\000\000\nq\000\000\000\000\000\000\000\000\000\000\n\n\nq\nq\000\000\016\185\000\000\000\000\000\000\016\185\000\000\000\000\nq\000\000\000\000\nq\000\000\000\000\000\000\000\000\016\185\nq\nq\000\242\000\000\000\000\002E\002E\000\000\000\000\002E\000\000\000\000\000\000\000\000\002E\000\000\nq\000\000\000\000\nq\000\000\000\000\000\000\nq\002E\000\000\000\000\000\000\000\000\000\000\000\000\002E\000\n\000\000\nq\000\000\nq\nq\000\000\nq\nq\000\000\000\000\000\000\000\000\002E\000\000\000\000\002E\nq\002E\000\000\000\000\nq\000\000\000\000\002E\nq\001\181\002E\002E\000\000\000\000\002E\002E\000\000\002E\002E\nq\002E\000\000\000\000\014J\000\000\000\000\000\000\000\000\000\000\001\181\000\000\002E\002E\002E\000\000\002E\000\000\014\178\014\250\015\018\014\202\015*\000\000\000\000\002E\002E\000\000\000\000\002E\000\000\000\000\000\000\015B\015Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002E\000\242\000\000\000\000\002E\000\000\002E\000\000\000\000\000\000\014b\014\226\015\138\015\162\015\210\000\000\000\000\000\000\002\025\000\000\000\000\000\000\000\000\002\025\000\000\015\234\001\234\002\025\000\000\000\000\001\181\000\000\000\000\000\000\000\000\n\241\016\002\002\025\000\000\000\000\000\000\002\025\000\000\002\025\000\000\000\000\000\000\n-\n-\n-\016b\001\181\n-\016z\015\186\002\025\000\000\n-\000\000\001\181\016\026\000\000\002\025\024^\000\000\000\000\000\000\n-\0162\016J\005\018\000\000\002\025\000\000\n-\002\025\000\000\000\000\000\000\n-\000\000\002\025\002\025\002\025\000\000\000\000\000\000\000\000\n-\000\000\000\000\n-\n-\n-\000\000\000\000\000\000\002\025\002\025\n-\002\025\000\000\n-\n-\005~\000\000\000\000\n-\000\000\n-\n-\000\000\n-\000\000\000\000\002\025\000\000\002\025\000\000\000\000\002\025\002\025\000\000\n-\n-\n-\000\000\n-\000\000\000\000\002\025\000\000\000\000\000\000\000\000\000\000\n-\n-\002\025\000\000\000\000\000\000\000\000\002\025\000\000\000\000\007\025\007\025\000\000\002\025\000\000\007\025\000\000\000\000\000\000\007\025\000\000\000\000\000\000\000\000\000\000\000\000\n-\000\000\000\000\007\025\000\000\007\025\n-\007\025\000\000\007\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\025\000\000\000\000\000\000\000\000\000\000\000\000\007\025\007\025\000\000\007\021\t\222\000\000\n\190\000\000\007\021\000\000\007\025\000\000\007\021\007\025\000\000\000\000\000\000\000\000\000\000\007\025\007\025\000\242\007\021\000\000\007\021\000\000\007\021\000\000\007\021\000\000\000\000\000\000\000\000\000\000\000\000\007\025\000\000\000\000\007\025\000\000\007\021\000\000\007\025\000\000\000\000\000\000\000\000\007\021\nZ\000\000\000\000\000\000\000\000\007\025\000\000\007\025\007\025\007\021\007\025\007\025\007\021\000\000\000\000\000\000\000\000\000\000\007\021\007\021\000\242\000\000\000\000\000\000\007\025\000\000\000\000\000\000\007\025\000\000\000\000\000\000\000\000\000\000\007\021\000\000\000\000\007\021\000\000\007\025\000\000\007\021\000\000\000\000\016\201\016\201\000\000\000\000\000\000\016\201\000\000\000\000\007\021\016\201\007\021\007\021\000\000\007\021\007\021\000\000\000\000\000\000\000\000\016\201\000\000\016\201\000\000\016\201\000\000\016\201\000\000\007\021\000\000\000\000\000\000\007\021\000\000\000\000\000\000\000\000\000\000\016\201\000\000\000\000\000\000\000\000\007\021\000\000\016\201\016\201\000\000\016\205\016\205\000\000\000\000\000\000\016\205\000\000\016\201\000\000\016\205\016\201\000\000\000\000\000\000\000\000\000\000\016\201\016\201\000\242\016\205\000\000\016\205\000\000\016\205\000\000\016\205\000\000\000\000\000\000\000\000\000\000\000\000\016\201\000\000\000\000\016\201\000\000\016\205\000\000\016\201\000\000\000\000\000\000\000\000\016\205\nZ\000\000\000\000\000\000\000\000\016\201\000\000\016\201\016\201\016\205\016\201\016\201\016\205\000\000\000\000\000\000\000\000\000\000\016\205\016\205\000\242\000\000\000\000\000\000\016\201\000\000\000\000\000\000\016\201\000\000\000\000\000\000\000\000\000\000\016\205\000\000\000\000\016\205\000\000\016\201\000\000\016\205\000\000\000\000\0071\t\222\000\000\000\000\000\000\0071\000\000\000\000\016\205\0071\016\205\016\205\000\000\016\205\016\205\000\000\000\000\000\000\000\000\0071\000\000\0071\000\000\0071\000\000\0071\000\000\016\205\000\000\000\000\000\000\016\205\000\000\000\000\000\000\000\000\000\000\0071\000\000\000\000\000\000\000\000\016\205\000\000\0071\nZ\000\000\0075\0075\000\000\000\000\000\000\0075\000\000\0071\000\000\0075\0071\000\000\000\000\000\000\000\000\000\000\0071\0071\000\242\0075\000\000\0075\000\000\0075\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\0071\000\000\000\000\0071\000\000\0075\000\000\0071\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\000\000\0071\000\000\0071\0071\0075\0071\0071\0075\000\000\000\000\000\000\000\000\000\000\0075\0075\0075\000\000\000\000\000\000\0071\000\000\000\000\000\000\0071\000\000\000\000\000\000\000\000\000\000\0075\000\000\000\000\0075\000\000\0071\000\000\0075\000\000\000\000\007-\007-\000\000\000\000\000\000\007-\000\000\000\000\0075\007-\0075\0075\000\000\0075\0075\000\000\000\000\000\000\000\000\007-\000\000\007-\000\000\007-\000\000\007-\000\000\0075\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\007-\000\000\000\000\000\000\000\000\n\130\000\000\007-\nZ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007-\000\000\000\000\007-\000\000\000\000\000\000\000\000\000\000\007-\007-\000\242\000\000\000\000\000\000\004A\000\000\000\000\000\000\000\000\004A\000\000\000\000\001\234\004A\007-\000\000\000\000\007-\000\000\000\000\000\000\007-\000\000\004A\000\000\000\000\000\000\004A\000\000\004A\000\000\000\000\007-\000\000\007-\007-\000\000\007-\007-\000\000\000\000\004A\000\000\000\000\000\000\000\000\000\000\000\000\004A\000\000\000\000\007-\000\000\000\000\000\000\007-\005\018\000\000\004A\000\000\000\000\004A\000\000\000\000\000\000\000\000\007-\004A\004A\004A\000\000\000\000\000\000\004=\000\000\000\000\000\000\000\000\004=\000\000\000\000\001\234\004=\004A\004A\000\000\004A\000\000\000\000\000\000\005~\000\000\004=\000\000\000\000\000\000\004=\000\000\004=\te\000\000\004A\te\004A\000\000\000\000\004A\004A\000\000\000\000\004=\000\000\000\000\000\000\000\000\000\000\004A\004=\000\000\te\te\000\000\te\te\004A\005\018\000\000\004=\000\000\004A\004=\000\000\000\000\000\000\000\000\004A\004=\004=\004=\000\000\000\000\000\000\000\000\000\000\te\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004=\004=\000\000\004=\025n\000\000\000\000\005~\000\000\000\000\000\000\000\000\te\000\000\000\000\000\000\000\000\000\000\004=\000\000\004=\014J\000\000\004=\004=\025r\000\000\te\000\000\000\000\000\000\000\000\000\000\004=\000\000\014\178\014\250\015\018\014\202\015*\000\000\004=\000\000\000\000\000\000\000\000\004=\te\000\000\te\015B\015Z\004=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015r\te\te\000\000\000\000\b.\te\000\000\000\000\000\242\te\000\000\te\000\000\000\000\000\000\te\000\000\014b\014\226\015\138\015\162\015\210\000\000\000\000\000\000\000\000\001u\000\000\000\000\000\000\000\000\001u\015\234\000\000\000\000\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\002\000\000\001u\000\000\001u\000\000\001u\000\000\001u\000\000\000\000\000\000\000\000\000\000\016b\000\000\025v\016z\015\186\025\134\001u\000\000\000\000\000\000\016\026\000\000\000\000\001u\000\000\000\000\000\000\001u\0162\016J\000\000\000\000\000\000\001u\000\000\000\000\001u\000\000\000\000\000\000\000\000\000\000\001u\001u\000\242\000\000\000\000\000\000\001q\000\000\000\000\000\000\001u\001q\000\000\000\000\000\000\001q\001u\000\000\000\000\001u\000\000\000\000\000\000\001u\000\000\001q\000\000\001q\000\000\001q\000\000\001q\000\000\000\000\001u\000\000\001u\001u\000\000\001u\001u\000\000\000\000\001q\000\000\000\000\000\000\000\000\000\000\001u\001q\000\000\000\000\000\000\001q\000\000\000\000\001u\000\000\000\000\001q\000\000\000\000\001q\000\000\000\000\000\000\000\000\001u\001q\001q\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\000\001q\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001q\000\000\001q\001q\001\173\001q\001q\016\005\001\173\000\000\000\000\000\000\000\000\000\000\000\000\001q\016\005\000\000\001\173\000\000\001\173\000\000\001\173\001q\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\001\173\000\000\000\000\000\000\000\000\000\000\000\000\001\173\016\005\000\000\000\000\000\000\000\000\000\000\002-\016\005\000\000\000\000\000\000\002-\001\173\000\000\023~\002-\000\000\003\022\001\173\001\173\001\173\000\000\000\000\000\000\000\000\002-\000\000\000\000\000\000\002-\000\000\002-\000\000\000\000\001\173\000\000\000\000\016\005\000\000\000\000\000\000\016\005\000\000\002-\000\000\000\000\000\000\000\000\000\000\000\000\002-\000\000\001\173\000\000\001\173\001\173\023\130\001\173\001\173\000\000\002-\000\000\000\000\002-\000\000\000\000\000\000\000\000\000\000\002-\002-\000\000\023\142\"\250\000\000\001\173\000\000\000\000\000\000\000\000\003\154\003r\000\000\000\000\003\022\002-\001\173\000\000\002-\003\130\000\000\000\000\002-\000\000\000\000\000\000\004\210\000\000\000\000\001\238\000\000\000\000\007\186\002-\000\000\002-\003\158\000\000\002-\002-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002-\000\000\003\178\000\000\000\000\003\198\000\000\001\194\002-\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\002-\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\158\007\166\007\170\000\000\007\174\000\000\000\000\007\253\000\000\000\000\000\000\000\000\000\000\007\182\007\186\003r\000\000\b\014\003\022\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\007\253\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000\000\003\134\000\000\007\190\000\000\000\000\000\000\011\182\000\000\005J\000\000\003\138\000\000\004j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\170\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\000\000\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\b2\000\000\000\000\000\000\000\000\007\166\007\170\003\154\003r\000\000\000\000\003\022\000\000\000\000\000\000\000\000\003\130\007\182\007\186\000\000\000\000\000\000\000\000\b\226\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\190\011\022\000\000\000\000\003\178\011.\005J\003\198\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\142\007\158\007\166\007\170\000\000\007\174\000\000\003\154\003r\000\000\000\000\003\022\000\000\000\000\007\182\007\186\003\130\000\000\b\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\007\190\000\000\000\000\000\000\000\000\000\000\005J\003\178\000\000\000\000\003\198\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\174\007\158\007\166\007\170\000\000\007\174\000\000\003\154\003r\000\000\000\000\003\022\000\000\000\000\007\182\007\186\003\130\000\000\b\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\007\190\000\000\000\000\000\000\000\000\000\000\005J\003\178\000\000\000\000\003\198\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\001\007\158\007\166\007\170\000\000\007\174\000\000\003\154\003r\000\000\000\000\003\022\000\000\000\000\007\182\007\186\003\130\000\000\b\014\000\000\000\000\b\001\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\007\190\000\000\000\000\000\000\000\000\000\000\005J\003\178\000\000\000\000\003\198\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017&\007\158\007\166\007\170\000\000\007\174\000\000\003\154\003r\000\000\000\000\003\022\000\000\000\000\007\182\007\186\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\007\190\000\000\000\000\000\000\000\000\000\000\005J\003\178\000\000\000\000\003\198\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0172\007\158\007\166\007\170\000\000\007\174\000\000\003\154\003r\000\000\000\000\003\022\000\000\000\000\007\182\007\186\003\130\000\000\b\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\007\190\000\000\000\000\000\000\000\000\000\000\005J\003\178\000\000\000\000\003\198\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\000\000\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017>\007\158\007\166\007\170\000\000\007\174\000\000\003\154\003r\000\000\000\000\003\022\000\000\000\000\007\182\007\186\003\130\000\000\b\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\007\190\000\000\000\000\000\000\000\000\000\000\005J\003\178\000\000\000\000\003\198\000\000\001\194\000\000\005\185\000\000\000\000\000\000\003b\005\185\000\000\004\198\004\202\005\185\000\000\000\000\004\206\000\000\004\214\007\142\000\000\007\154\000\000\005\185\000\000\000\000\000\000\005\185\000\000\005\185\000\000\000\000\007\158\007\166\007\170\005\185\007\174\000\000\000\000\000\000\005\185\005\185\000\000\000\000\005\185\007\182\007\186\000\000\005\185\b\014\000\000\000\000\000\000\000\000\005\185\000\000\000\000\000\000\005\185\000\000\005\185\005\185\000\000\000\000\000\000\000\000\000\000\005\185\004*\000\000\000\000\007\190\005\185\000\000\000\000\000\000\000\000\005J\000\000\005\185\000\000\000\000\000\000\005\185\000\000\n\190\005\185\000\000\000\000\005\185\005\185\000\000\005\185\000\000\000\000\000\000\000\000\000\000\005\185\004*\000\242\005\185\000\000\005\185\000\000\000\000\005\185\005\185\005\185\000\000\000\000\000\000\nn\000\000\005\185\005\185\000\000\005\185\000\000\b%\000\000\005\185\000\000\000\000\005\185\000\000\000\000\003r\000\000\"B\003\022\000\000\005\185\000\000\005\185\003\130\000\000\005\185\005\185\000\000\b%\000\000\000\000\000\000\000\000\001\238\000\000\005\185\000\000\003\134\000\000\000\000\000\000\000\000\000\000\005\185\000\000\000\000\000\000\003\138\030Z\004j\000\000\000\000\000\000\000\000\005\185\000\000\000\000\004\170\000\000\001\194\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\178\n\250\000\000\000\000\000\000\n\254\011\002\011\014\000\000\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\253\000\000\000\000\007\166\007\170\t\253\000\000\000\000\000\000\t\253\000\000\000\000\000\000\000\000\000\000\007\182\007\186\000\000\000\000\t\253\000\000\000\000\000\000\t\253\000\000\t\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\253\000\000\000\000\000\000\007\190\011\022\000\000\t\253\000\000\011.\005J\t\253\000\000\000\000\000\000\000\000\000\000\t\253\000\000\000\000\t\253\000\000\000\000\000\000\000\000\000\000\t\253\t\253\000\242\000\000\000\000\000\000\t\249\000\000\000\000\t\253\t\253\t\249\000\000\000\000\000\000\t\249\t\253\000\000\000\000\t\253\000\000\000\000\000\000\t\253\000\000\t\249\000\000\000\000\000\000\t\249\000\000\t\249\000\000\000\000\t\253\000\000\t\253\t\253\000\000\t\253\t\253\000\000\000\000\t\249\000\000\000\000\000\000\000\000\000\000\t\253\t\249\000\000\000\000\000\000\t\249\000\000\000\000\t\253\000\000\000\000\t\249\000\000\000\000\t\249\000\000\000\000\000\000\000\000\000\000\t\249\t\249\000\242\000\000\000\000\000\000\000\000\000\000\000\000\t\249\t\249\000\000\000\000\000\000\000\000\000\000\t\249\000\000\000\000\t\249\000\000\000\000\000\000\t\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001a\t\249\000\000\t\249\t\249\001a\t\249\t\249\000\185\001a\000\000\000\000\000\000\000\000\000\000\000\000\t\249\000\185\000\000\001a\000\000\001a\000\000\001a\t\249\001a\000\000\000\000\000\000\000\000\0045\000\000\000\000\000\000\000\000\0045\000\000\001a\000\000\0045\000\000\000\000\000\000\000\000\001a\000\185\000\000\000\000\000\000\0045\000\000\000\000\000\185\0045\000\000\0045\000\000\001a\000\000\000\000\000\000\000\000\000\000\001a\001a\001a\000\000\0045\000\000\023\150\000\000\0045\000\000\000\000\0045\000\000\0045\000\000\000\000\001a\0045\000\000\000\000\000\000\0045\000\000\000\185\0045\000\000\000\000\0045\000\000\000\000\0045\0045\0045\0045\001a\000\000\001a\001a\000\000\001a\001a\000\000\000\000\000\000\000\000\0045\0045\023\150\000\000\0045\000\000\000\000\0045\0045\000\000\000\000\000\000\001a\b\145\000\000\000\000\000\000\0045\b\145\0045\0045\0045\b\145\001a\0045\0045\0045\0045\0045\000\000\000\000\000\000\b\145\000\000\0045\000\000\b\145\000\000\b\145\000\000\000\000\024\n\0045\000\000\006]\0045\000\000\0045\000\000\0045\b\145\000\000\000\000\0045\000\000\000\000\000\000\b\145\000\000\000\000\0045\000\000\0045\"J\0045\0045\0045\b\145\000\000\0045\b\145\000\000\000\000\0045\000\000\000\000\b\145\b\145\000\000\000\000\000\000\000\000\024\n\0045\000\000\000\000\000\000\0045\0045\0045\000\000\000\000\b\145\000\000\000\000\b\145\000\000\000\000\000\000\b\145\000\000\0045\000\000\023\150\000\000\000\000\000\000\000\000\0045\000\000\b\145\000\000\b\145\b\145\000\000\b\145\b\145\000\000\0045\000\000\000\000\0045\000\000\000\000\000\000\b\145\000\000\0045\0045\0045\b\145\000\000\002\254\b\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0045\b\145\000\000\0045\000\000\000\000\006\181\0045\000\000\000\000\000\000\006\181\000\000\000\000\000\000\006\181\000\000\000\000\0045\000\000\0045\"z\000\000\0045\0045\006\181\000\000\000\000\000\000\006\181\000\000\006\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\0045\000\000\006\181\000\000\000\000\0045\000\000\000\000\000\000\006\181\000\000\000\000\000\000\000\000\000\000\n\190\000\000\000\000\000\000\006\181\000\000\000\000\006\181\000\000\000\000\000\000\000\000\000\000\006\181\006\181\000\242\000\000\000\000\000\000\006\189\000\000\000\000\000\000\000\000\006\189\000\000\000\000\000\000\006\189\006\181\006\181\000\000\006\181\000\000\000\000\000\000\006\181\000\000\006\189\000\000\000\000\000\000\006\189\000\000\006\189\000\000\000\000\006\181\000\000\006\181\000\000\000\000\006\181\006\181\000\000\000\000\006\189\000\000\000\000\000\000\000\000\000\000\000\000\006\189\000\000\000\000\000\000\000\000\000\000\n\190\006\181\000\000\000\000\006\189\000\000\000\000\006\189\000\000\000\000\000\000\000\000\006\181\006\189\006\189\000\242\000\000\000\000\000\000\0045\000\000\000\000\000\000\000\000\0045\000\000\000\000\000\000\0045\006\189\006\189\000\000\006\189\000\000\000\000\000\000\006\189\000\000\0045\000\000\000\000\000\000\0045\000\000\0045\000\000\000\000\006\189\000\000\006\189\000\000\000\000\006\189\006\189\000\000\000\000\0045\000\000\023\150\000\000\000\000\000\000\000\000\0045\000\000\000\000\007\181\000\000\000\000\000\000\006\189\007\181\000\000\0045\000\000\007\181\0045\000\000\000\000\000\000\000\000\006\189\0045\0045\0045\007\181\000\000\000\000\000\000\007\181\000\000\007\181\000\000\000\000\000\000\000\000\000\000\000\000\0045\000\000\000\000\0045\000\000\007\181\000\000\0045\000\000\000\000\000\000\000\000\007\181\000\000\000\000\000\000\000\000\000\000\0045\000\000\0045\026\146\007\181\0045\0045\007\181\000\000\000\000\000\000\000\000\000\000\007\181\007\181\000\242\000\000\000\000\000\000\000\000\000\000\000\000\024\n\0045\000\000\000\000\000\000\000\000\000\000\007\181\000\000\000\000\007\181\000\000\000\000\000\000\007\181\000\000\000\000\000\000\000\000\000\000\000\000\001\206\001\230\003\018\000\000\007\181\003\022\007\181\030~\000\000\007\181\007\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\181\001\238\003\026\002\002\003\"\015\253\000\000\000\000\007\181\000\000\015\253\002\014\000\000\001\210\015\253\000\000\000\000\000\000\000\000\007\181\000\000\000\000\000\000\000\000\015\253\003&\001\214\003B\015\253\000\000\015\253\003N\000\000\003b\004\242\004\254\000\000\000\000\000\000\000\000\000\000\0302\015\253\0306\000\000\000\000\000\000\000\000\000\000\015\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\253\000\000\005\014\015\253\000\000\000\000\000\000\000\000\000\000\015\253\015\253\000\000\007\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030B\000\000\015\253\000\000\000\000\015\253\000\000\000\000\000\000\015\253\003\154\003r\000\000\000\000\003\022\000\000\000\000\000\000\030F\003\130\015\253\000\000\015\253\003\014\000\000\015\253\015\253\000\000\000\000\001\238\000\000\000\000\000\000\000\000\000\000\015\253\003\158\000\000\000\000\000\000$\006\000\000\000\000\015\253\000\000\000\000\000\000\b\193\t\222\000\000\003\178\000\000\b\193\012\130\015\253\001\194\b\193\000\000\000\000\000\000\000\000\003b\000\000\000\000\004\198\004\202\b\193\000\000\000\000\004\206\b\193\004\214\b\193\000\000\007\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\193\007\158\007\166\007\170\000\000\007\174\000\000\b\193\nZ\000\000\000\000\000\000\000\000\002\005\007\182\007\186\000\000\b\193\002\005\000\000\b\193\000\000\002\005\000\000\000\000\000\000\b\193\b\193\000\242\000\000\000\000\000\000\002\005\000\000\000\000\000\000\002\005\000\000\002\005\000\000\007\190\000\000\b\193\000\000\000\000\b\193\005J\000\000\000\000\b\193\002\005\000\000\000\000\000\000\000\000\000\000\000\000\002\005\000\000\000\000\b\193\000\000\b\193\0021\000\000\b\193\b\193\002\005\0021\000\000\002\005\000\000\0021\000\000\000\000\000\000\002\005\002\005\002\005\000\000\000\000\000\000\0021\b\193\000\000\000\000\0021\000\000\0021\000\000\000\000\000\000\002\005\000\000\000\000\002\005\000\000\000\000\000\000\002\005\0021\000\000\000\000\000\000\000\000\000\000\000\000\0021\000\000\000\000\002\005\000\000\002\005\000\000\000\000\002\005\002\005\0021\000\000\000\000\0021\026\158\000\000\000\000\000\000\000\000\0021\0021\000\000\000\000\000\000\000\000\007\185\002\005\000\000\000\000\000\000\007\185\002\005\000\000\000\000\007\185\0021\000\000\000\000\0021\000\000\000\000\000\000\0021\000\000\007\185\000\000\000\000\000\000\007\185\000\000\007\185\000\000\000\000\0021\000\000\0021\000\000\000\000\0021\0021\000\000\000\000\007\185\000\000\000\000\000\000\000\000\000\000\0021\007\185\000\000\000\000\000\000\000\000\000\000\000\000\0021\000\000\000\000\007\185\000\000\030Z\007\185\000\000\000\000\000\000\000\000\0021\007\185\007\185\000\242\000\000\000\000\000\000\015\181\000\000\000\000\003r\015\181\000\000%\186\000\000\000\000\000\000\007\185%\190\000\000\007\185\015\181\000\000\000\000\007\185\000\000\000\000\015\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\185\000\000\007\185\000\000\015\181\007\185\007\185\000\000\000\000\000\000\000\000\015\181\000\000\000\000\000\000\007\185\000\000\001\006\000\000\001\194\000\000\015\181\000\000\007\185\015\181\000\000\000\000\000\000\000\000\000\000\015\181\000\000\000\000\000\000\007\185\000\000\015\153\000\000%\194\003r\015\153\000\000%\218\000\000\000\000\000\000\015\181%\222\000\000\015\181\015\153\000\000\000\000\015\181\000\000\000\000\015\153\000\000\000\000\000\000\000\000\000\000\000\000%\198\015\181\000\000\015\181\000\000\015\153\015\181\000\000\000\000\000\000\000\000\000\000\015\153\000\000\000\000\000\000\000\000\000\000\001\006\000\000\001\194\000\000\015\153\000\000\015\181\015\153\000\000\000\000\000\000\000\000\000\000\015\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000%\226\000\000\001\206\001\230\003\018\000\000\000\000\003\022\015\153\000\000\000\000\015\153\000\000\000\000\000\000\015\153\000\000\000\000\000\000\000\000\000\000\000\000\001\238\003\026\002\002%\230\015\153\000\000\015\153\000\000\000\000\015\153\002\014\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003&\001\214\003B\015\153\000\000\000\000\003N\000\000\003b\004\242\004\254\000\000\000\000\000\000\005\185\000\000\0302\000\000#\234\005\185\000\000\000\000\001\021\005\185\000\000\000\000\000\000\001\021\000\000\000\000\000\000\001\021\000\000\005\185\000\000\000\000\005\014\005\185\000\000\005\185\000\000\001\021\000\000\000\000\000\000\001\021\007\186\001\021\000\000\000\000\000\000\005\185\000\000\000\000\000\000\000\000\000\000#\246\005\185\001\021\000\000\000\000\000\000\000\000\005\026\000\000\001\021\000\000\005\185\000\000\000\000\005\185\000\000\000\000\000\000\030F\001\021\005\185\004*\001\021\000\000\000\000\000\000\000\000\000\000\001\021\001\021\000\242\000\000\000\000\000\000\000\000\000\000\005\185\000\000\000\000\005\185\000\000\000\000\000\000\005\185\001\021\000\000\000\000\001\021\000\000\000\000\000\000\001\021\000\000\000\000\005\185\t\145\005\185\000\000\t\145\005\185\005\185\001\025\001\021\000\000\001\021\005*\001\025\001\021\001\021\n\n\001\025\000\000\000\000\000\000\000\000\t\145\t\145\005\185\t\145\t\145\001\025\000\000\000\000\000\000\001\025\001\021\001\025\000\000\005\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\021\000\000\001\025\000\000\t\145\000\000\000\000\000\000\000\000\001\025\000\000\000\000\b\189\000\000\000\000\000\000\000\000\b\189\000\000\001\025\000\000\b\189\001\025\000\000\000\242\000\000\000\000\000\000\001\025\001\025\000\242\b\189\000\000\000\000\000\000\b\189\000\000\b\189\000\000\t\145\000\000\000\000\000\000\000\000\001\025\000\000\000\000\001\025\000\000\b\189\000\000\001\025\000\000\000\000\000\000\000\000\b\189\000\000\000\000\t\145\000\000\t\145\001\025\000\000\001\025\000\000\b\189\001\025\001\025\b\189\000\000\000\000\000\000\t\145\t\145\b\189\b\189\b.\t\145\000\000\000\000\007\173\t\145\000\000\t\145\001\025\007\173\000\000\t\145\000\000\007\173\b\189\000\000\000\000\b\189\000\000\001\025\026n\b\189\000\000\007\173\000\000\000\000\000\000\007\173\000\000\007\173\000\000\000\000\b\189\000\000\b\189\025\206\000\000\b\189\b\189\000\000\000\000\007\173\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\005\185\t\222\000\000\000\000\b\189\005\185\000\000\007\173\000\000\005\185\007\173\000\000\000\000\000\000\000\000\000\000\007\173\007\173\000\000\005\185\000\000\000\000\000\000\005\185\000\000\005\185\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\007\173\000\000\005\185\000\000\007\173\000\000\000\000\000\000\000\000\005\185\nZ\000\000\000\000\000\000\001\153\007\173\000\000\007\173\000\000\001\153\007\173\007\173\005\185\001\153\000\000\000\000\000\000\000\000\005\185\004*\000\242\000\000\000\000\001\153\000\000\001\153\000\000\001\153\007\173\001\153\000\000\000\000\000\000\000\000\005\185\000\000\000\000\015I\000\000\000\000\000\000\001\153\015I\000\000\000\000\000\000\015I\000\000\001\153\000\000\000\000\000\000\005\185\000\000\005\185\000\000\015I\005\185\005\185\000\000\015I\001\153\015I\000\000\000\000\000\000\000\000\001\153\001\153\000\242\000\000\000\000\000\000\000\000\015I\005\185\000\000\000\000\000\000\000\000\000\000\015I\000\000\001\153\000\000\000\000\005\185\000\000\000\000\000\000\000\000\015I\000\000\000\000\015I\000\000\000\000\000\000\000\000\000\000\015I\001\153\000\000\001\153\001\153\000\000\001\153\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015I\014:\000\000\015I\000\000\000\000\015\253\015I\001\153\000\000\000\000\015\253\000\000\000\000\000\000\015\253\000\000\000\000\015I\001\153\015I\000\000\000\000\015I\015I\015\253\000\000\000\000\000\000\015\253\000\000\015\253\000\000\000\000\001\206\002\022\001\234\000\000\000\000\000\000\000\000\015I\000\000\015\253\000\000\000\000\000\000\000\000\000\000\003*\015\253\000\000\016\146\000\000\001\238\003.\002\002\000\000\000\000\000\000\000\000\000\000\000\000\015\253\002\014\000\000\001\210\000\000\000\000\015\253\015\253\000\000\002>\000\000\000\000\000\000\000\000\000\000\002\018\001\214\003B\000\000\000\000\000\000\003N\015\253\003b\004\242\004\254\000\000\b\129\b\129\b\129\000\000\005\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\253\000\000\015\253\003\014\005\002\015\253\015\253\b\129\b\129\b\129\000\000\005\014\000\000\000\000\000\000\015\253\000\000\b\129\000\000\b\129$B\000\000\000\000\015\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\129\b\129\b\129\015\253\000\000\000\000\b\129\000\000\b\129\b\129\b\129\000\000\023\134\000\000\000\000\005\145\b\129\000\000\000\000\000\000\005\145\000\000\000\000\000\000\005\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\145\000\000\b\129\000\000\005\145\000\000\005\145\000\000\006\197\t\222\000\000\000\000\000\000\006\197\000\000\000\000\000\000\006\197\005\145\000\000\000\000\000\000\000\000\000\000\000\000\005\145\000\000\006\197\000\000\000\000\000\000\006\197\000\000\006\197\000\000\005\145\000\000\000\000\005\145\000\000\000\000\004\246\000\000\b\129\005\145\006\197\000\000\000\000\000\000\000\000\000\000\000\000\006\197\nZ\000\000\000\000\000\000\000\000\000\000\000\000\005\145\000\000\000\000\005\145\000\000\006\197\000\000\005\145\000\000\000\000\000\000\006\197\006\197\000\242\000\000\000\000\000\000\005\137\005\145\000\000\005\145\000\000\005\137\005\145\005\145\000\000\005\137\006\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\137\000\000\000\000\000\000\005\137\005\145\005\137\000\000\005\169\006\197\000\000\006\197\000\000\005\169\006\197\006\197\025\246\005\169\005\137\000\000\000\000\000\000\000\000\000\000\000\000\005\137\000\000\005\169\000\000\000\000\000\000\005\169\006\197\005\169\000\000\005\137\000\000\000\000\005\137\000\000\000\000\000\000\000\000\000\000\005\137\005\169\000\000\000\000\000\000\000\000\000\000\000\000\005\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\137\000\000\005\169\005\137\000\000\005\169\000\000\005\137\000\000\000\000\000\000\005\169\000\000\000\000\000\000\000\000\000\000\000\000\005\137\000\000\005\137\000\000\000\000\005\137\005\137\000\000\000\000\005\169\000\000\000\000\005\169\r\178\000\000\000\000\005\169\000\000\000\000\001\206\001\230\001\234\000\000\005\137\000\000\000\000\000\000\005\169\000\000\005\169\000\000\000\000\005\169\005\169\028\242\000\000\004\210\000\000\015\169\001\238\003\026\002\002\015\169\000\000\000\000\000\000\000\000\000\000\000\000\002\014\005\169\001\210\015\169\000\000\000\000\000\000\000\000\005y\015\169\000\000\000\000\029\234\005y\003^\001\214\003B\005y\000\000\000\000\003N\015\169\003b\004\242\004\254\000\000\000\000\005y\015\169\000\000\005\n\005y\000\000\005y\000\000\000\000\000\000\000\000\015\169\000\000\000\000\015\169\000\000\000\000\000\000\005y\000\000\015\169\000\000\000\000\005\014\000\000\005y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005y\015\169\000\000\005y\015\169\000\000\000\000\000\000\015\169\005y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\169\000\000\015\169\000\000\000\000\015\169\005y\000\000\005F\005y\005J%\170\r\190\005y\000\000\000\000\000\000\000\000\001\206\001\230\001\234\016\170\000\000\015\169\005y\000\000\005y\000\000\000\000\005y\005y\000\000\b\189\000\000\000\000\000\000\000\000\b\189\001\238\001\242\002\002\b\189\000\000\000\000\000\000\000\000\000\000\005y\002\014\000\000\001\210\b\189\000\000\000\000\000\000\b\189\000\000\b\189!v\000\000\000\000\000\000\002\018\001\214\003B\000\000\000\000\000\000\003N\b\189\003b\004\242\004\254\000\000\000\000\000\000\b\189\000\000\005\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\189\000\000\000\000\000\000\000\000\000\000\b\189\b\189\000\000\005\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\189\000\000\000\000\000\000\000\000\001\206\002\022\001\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\189\000\000\b\189\025\206\000\000\b\189\b\189\001\238\002*\002\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\001\210\027\002\000\000\000\000\b\189\000\000\002>\000\000\000\000\001\206\002\022\001\234\002\018\001\214\003B\000\000\000\000\000\000\003N\000\000\003b\004\242\004\254\000\000\000\000\000\000\000\000\000\000\005\n\001\238\003V\002\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\001\210\000\000\000\000\000\000\000\000\000\000\002>\005\014\000\000\b}\b}\b}\003^\001\214\003B\000\000\000\000\000\000\003N\000\000\003b\004\242\004\254\t\129\000\000\000\000\t\129\000\000\005\n\b}\b}\b}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b}\000\000\b}\000\000\t\129\t\129\000\000\t\129\t\129\005\014\000\000\000\000\000\000\000\000\b}\b}\b}\000\000\000\000\000\000\b}\000\000\b}\b}\b}\016\209\016\209\016\209\000\000\t\129\b}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\209\016\209\016\209\t\242\000\242\b}\000\000\000\000\000\000\000\000\016\209\000\000\016\209\000\000\000\000\000\000\000\000\000\000\000\000\t\129\000\000\000\000\000\000\000\000\016\209\016\209\016\209\000\000\000\000\000\000\016\209\000\000\016\209\016\209\016\209\000\000\000\000\000\000\000\000\t\129\016\209\t\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\"\000\000\b\138\t\129\000\000\000\000\b.\t\129\b\154\016\209\000\000\t\129\000\000\t\129\001\206\001\230\001\234\t\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\190\000\000\000\000\000\000\000\000\000\000\001\206\001\230\001\234\001\238\001\242\002\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\001\210\000\000\000\000\000\000\000\000\001\238\003\026\002\002\000\000\000\000\000\000\000\000\002\018\001\214\003B\002\014\000\000\001\210\003N\000\000\003b\004\242\004\254\000\000\000\000\000\000\000\000\000\000\005\n\003^\001\214\003B\001\206\002\022\001\234\003N\000\000\003b\004\242\004\254\000\000\000\000\000\000\000\000\000\000\005\n\000\000\000\000\005\014\000\000\000\000\000\000\001\238\024\018\002\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\001\210\005\014\000\000\000\000\000\000\000\000\002>\000\000\000\000\000\000\000\000\000\000\003^\001\214\003B\000\000\000\000\000\000\003N\000\000\003b\004\242\004\254\001\206\001\230\001\234\031\150\000\000\005\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\238\001\242\002\002\000\000\000\000\005\014\000\000\000\000\000\000\000\000\002\014\000\000\001\210\000\000\000\000\000\000\000\000\001\206\001\230\001\234\031\246\000\000\000\000\000\000\002\018\001\214\003B\000\000\000\000\000\000\003N\000\000\003b\004\242\004\254\000\000\000\000\001\238\001\242\002\002\005\n\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\153\005\014\002\018\001\214\003B\005\153\000\000\000\000\003N\005\153\003b\004\242\004\254\000\000\000\000\000\000\000\000\000\000\005\n\005\153\000\000\000\000\000\000\005\153\000\000\005\153\000\000\005\129\001\206\001\230\001\234\000\000\005\129\000\000\000\000\000\000\005\129\005\153\005\014\000\000\000\000\000\000\000\000\000\000\005\153\000\000\005\129\000\000\001\238\003\026\005\129\000\000\005\129\000\000\000\000\000\000\000\000\005\153\000\000\000\000\001\210\000\000\000\000\005\153\005\129\000\000\000\000\000\000\000\000\000\000\000\000\005\129\005\146\001\214\005\018\000\000\000\000\000\000\003N\005\153\003b\004\242\004\254\000\000\005\129\000\000\000\000\000\000\005\n\000\000\005\129\005\177\000\000\000\000\000\000\000\000\005\177\005\153\000\000\005\153\005\177\000\000\005\153\005\153\000\000\000\000\005\129\000\000\005\014\000\000\005\177\000\000\000\000\000\000\005\177\000\000\005\177\000\000\005\205\000\000\005\153\000\000\000\000\000\250\005\129\000\000\005\129\004\006\005\177\005\129\005\129\027>\000\000\000\000\000\000\005\177\000\000\0042\000\000\000\000\000\000\005\205\000\000\0046\000\000\000\000\000\000\005\129\005\177\000\000\000\000\000\000\000\000\000\000\005\177\004B\000\000\000\000\029~\000\000\000\000\000\000\025\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\177\000\000!\162\000\000\000\000\026\030\000\000\000\000\000\000\000\000\000\000\0266\005\193\000\000\000\000\000\000\000\000\000\250\005\177\000\000\005\177\002^\000\000\005\177\005\177\000\000\000\000\026>\000\000\000\000\000\000\026\194\000\000\000\000\000\000\005\193\000\000\0046\000\000\000\000\000\000\005\177\000\000\001\230\001\234\026F\000\000\026\130\000\000\026\198\005\205\005\205\030\026\000\000\000\000\000\000\026\238\000\000\000\000\000\000\000\000\000\000\001\238\003\026\002\002\000\000\000\000\000\000\030\218\026\030\000\000\000\000\002\014\000\000\000\000\0266\027\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003R\000\000\0292\000\000\028R\026>\003N\000\000\003b\004\242\004\254\000\000\000\000\000\000\000\000\000\000\029B\000\000\000\000\000\000\000\000\000\000\000\000\026F\000\000\027\142\000\000\000\000\005\193\005\193\000\000\000\000\000\000\000\000\000\000\000\000\005\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\027\158")) + ((32, "\000\000\139\234\000\000\150\214\000\000\147\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\220\000\000\147\236\000\000\000\000\000\000\000\000\000\000\022\206\000\000\147\236\000\000\139\234\000\000\000\254\000\000\000\021\000\000\001\206\000\001Kv\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000\000\000P\000\000\001\n\000\000\000\000\000\000\002\188\000\000\004L\000\000\000\000\000\000\001\208\000\000\003\028\000\000\007\142\000\000\000\000\000\000\000\005\000\000\004t\000\000\007\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\208\000\001\146\154\000\001H$\000\001H\204\000\001It\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001$\000\000\000\000\000\000\000\000\000\000\215\226\000\000\005\230\000\000\005\252\000\000\000\000\000\000\000\000\000\000\148\020\000\000\141$\000\000\023\162\000\000\000\000\000\001Y\132\000\000\001$\000\000\000\000\000\001P\150\000\000\001$\000\000\145\134\000\000\023\162\000\000\007\220\000\000\000\000\000\001c\232\000\001Y\132\000\000\156\014\000\000\000\000\000\001K\186\000\001P\150\000\000\1442\000\000\022\206\000\000\141\128\000\001QJ\000\000\bd\000\000\000\000\000\000\022\206\000\000\159\200\000\000\150\174\000\000\022\206\000\000\151\242\000\000\000\000\000\000\n\154\000\000\000\000\000\000\151\242\000\000\011\176\000\000\000\000\000\000\139\208\000\000\000\000\000\000\0226\000\000\000\000\000\000\000\000\000\000\002\210\000\000\003\012\000\000\bz\000\000\023\162\000\000\000\000\000\000\000\000\000\000\022\206\000\000\000\000\000\000\001$\000\000\003\012\000\000\012\210\000\000\023\162\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\139\208\000\000\000\000\000\000\000\000\000\000\003\238\000\000\022f\000\000\000\000\000\000\001$\000\000\022f\000\000\000\000\000\000\005|\000\001\129~\000\000\023\162\000\000\000\000\000\001k\028\000\001\137\224\000\001d|\000\000\000\000\000\001\139\222\000\001P\150\000\000\000\000\000\000\143,\000\001\147\156\000\000\001$\000\000\145\134\000\000\147\236\000\000\139\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\150\214\000\000\022\206\000\000\000\000\000\000\002.\000\000\bj\000\000\000\226\000\001Y\132\000\000\000\000\000\001\143\152\000\000\000\000\000\001Y\132\000\001\143\152\000\000\000\000\000\001Y\132\000\001Y\132\000\000\bZ\000\000\000\000\000\000\002\240\000\000\006\152\000\000\000\000\000\000\023Z\000\000\000\000\000\000\t\012\000\000\000\000\000\000\000\000\000\000\0120\000\000\000\000\000\000\000\000\000\000\000\000\000\001Y\132\000\000\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\218\182\000\001Y\132\000\000\219\168\000\000\bN\000\000\000\000\000\000\220\154\000\000\000\000\000\000\000\000\000\001\017\138\000\001Y\132\000\000\221\140\000\001\018|\000\000\000\000\000\001t\128\000\001P\150\000\000\000\000\000\000\006\212\000\000\001\208\000\000\156\014\000\000\bZ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006p\000\000\015\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Y\132\000\000\217\b\000\001P\150\000\000\002\130\000\000\001$\000\000\000\000\000\000\t\"\000\000\001$\000\000\b\134\000\000\023\162\000\000\t\192\000\000\000\000\000\001Y\132\000\000\000\000\000\000\000\000\000\000\006\168\000\000\004\004\000\001Y\132\000\000\222~\000\001\019n\000\000\000\000\000\000\217\b\000\000\223p\000\001Y\132\000\000\224b\000\001\020`\000\000\000\000\000\000\217\b\000\000\225T\000\001\021R\000\001Y\132\000\000\226F\000\001\022D\000\000\000\000\000\000\217\b\000\000\2278\000\001\0236\000\000\162Z\000\000\217\250\000\000\156\030\000\000\218\236\000\000\163L\000\000\bZ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\216\210\000\000\219\222\000\000\156L\000\000\218\236\000\000\164>\000\000\1650\000\000\166\"\000\001\024(\000\000\n4\000\001Y\132\000\000\228*\000\001\025\026\000\000\000\000\000\000\217\b\000\000\229\028\000\001\026\012\000\000\000\000\000\001Fz\000\000\002n\000\000\001$\000\000\000\000\000\000\005\004\000\000\n>\000\000\023\162\000\000\0124\000\000\000\000\000\000\001$\000\000\011\184\000\000\023\162\000\000\014.\000\000\000\000\000\000\000\166\000\000\000\000\000\001Y\132\000\000\003\232\000\000\t6\000\000\014\164\000\000\007*\000\000\007\240\000\001Y\132\000\000\016\234\000\000\n\136\000\001Y\132\000\000\230\014\000\001\026\254\000\000\000\000\000\000\217\b\000\000\231\000\000\001\027\240\000\000\015\018\000\001Y\132\000\000\231\242\000\001\028\226\000\000\000\000\000\000\217\b\000\000\232\228\000\001\029\212\000\000\n\164\000\001Y\132\000\000\233\214\000\001\030\198\000\000\000\000\000\000\217\b\000\000\234\200\000\001\031\184\000\000\015\162\000\001Y\132\000\000\235\186\000\001 \170\000\000\000\000\000\000\217\b\000\000\236\172\000\001!\156\000\000\221\194\000\001P\150\000\000\t\006\000\001Y\132\000\000\016\240\000\000\015\246\000\001Y\132\000\000\237\158\000\001\"\142\000\000\000\000\000\000\217\b\000\000\238\144\000\001#\128\000\000\015\192\000\001Y\132\000\000\239\130\000\001$r\000\000\000\000\000\000\217\b\000\000\240t\000\001%d\000\000\017\012\000\001Y\132\000\000\241f\000\001&V\000\000\000\000\000\000\217\b\000\000\242X\000\001'H\000\000\017\016\000\001Y\132\000\000\243J\000\001(:\000\000\000\000\000\000\217\b\000\000\244<\000\001),\000\000\217\b\000\000\245.\000\001*\030\000\000\000\000\000\000\217\b\000\000\246 \000\001+\016\000\000\017>\000\000\000\000\000\000\000\000\000\000\000\026\000\000\000\000\000\001Y\132\000\000\000\000\000\000\022\206\000\001\147\240\000\000\000\000\000\001Y\132\000\000\022\186\000\001Y\132\000\000\028H\000\000\000\000\000\000\029^\000\000\000\000\000\000\003f\000\000\001\156\000\000\000\000\000\000\017\026\000\001Y\132\000\000\005\140\000\000\000\000\000\000\b\188\000\000\000\000\000\000\011>\000\000\000\000\000\000\000\000\000\000\006b\000\000\000\000\000\000\000\000\000\000\000\000\000\000'<\000\001\144t\000\000\000\000\000\000\028`\000\001Y\132\000\000(R\000\000\018\024\000\000\017^\000\000\167,\000\000\004(\000\000\018\024\000\000\000\226\000\000\018p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018v\000\000\150\216\000\000\022\206\000\000\2246\000\000\169\170\000\000\000\000\000\000\007<\000\000\018^\000\000\018<\000\001Y\132\000\000\017l\000\000\018n\000\001k\250\000\000\007\134\000\000\018\244\000\000\018\188\000\001Y\132\000\000\017\154\000\000\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\140\234\000\000\028\226\000\000\026\b\000\000\000\204\000\000\011F\000\000\000\000\000\000\000\000\000\000\012\164\000\000\000\000\000\000\141\128\000\000\019\180\000\000\019\170\000\000\022\206\000\000\027T\000\000\022\206\000\000\139\234\000\000\150\174\000\000\022\206\000\000\162\210\000\000\151\242\000\000\018\026\000\001\129~\000\001\134\020\000\000\000\000\000\001\127\180\000\000\147\236\000\000\139\234\000\000\139\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\137\002\000\000\026>\000\000\022\206\000\000\027T\000\000\020\006\000\000\000\000\000\000\027T\000\000\022\206\000\000\167\248\000\000\000\000\000\000\026\b\000\000\nv\000\000\018 \000\000\000\000\000\000\019b\000\000\018\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\150\214\000\000\022\206\000\000\000\000\000\000\137\210\000\001\130.\000\000\157V\000\000\000\000\000\000\001\022\000\000\168\196\000\001s@\000\000\th\000\000\020D\000\000\019\250\000\001Y\132\000\000\018\176\000\000\020$\000\001|\230\000\000\t\178\000\000\020\178\000\000\020b\000\001Y\132\000\000\019\022\000\000\000\000\000\000\000\000\000\001Y\242\000\001Y\242\000\001Y\242\000\000\000\000\000\000\018 \000\000\000\000\000\000\011\184\000\000\000\000\000\000\000\000\000\000\031,\000\001Y\132\000\000#\202\000\000 B\000\000\169\170\000\000\150\204\000\000\022\206\000\000\169\170\000\000\000\000\000\000\0196\000\000\000\000\000\000\000\000\000\000\011\222\000\000\019p\000\000\000\000\000\000\000\000\000\000\0196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\151\188\000\000'f\000\000\000w\000\000\004\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\027\014\000\001Y\242\000\000\000\000\000\000\000\000\000\000\169\170\000\000\020r\000\001l\180\000\000\011\148\000\000\021 \000\000\021\016\000\001Y\132\000\000\019\152\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\150\204\000\000\022\206\000\000\169\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\001X(\000\001mn\000\000\011\194\000\000\021\178\000\000\0210\000\001Y\132\000\000\019\210\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\001\144.\000\001n(\000\000\000\000\000\001\144\226\000\000\170\180\000\000\143\192\000\000\021\254\000\001Z\168\000\000\000\000\000\000\022X\000\000\169\170\000\000\000\000\000\000\029\248\000\000\022^\000\000\000\000\000\000\137\198\000\000\000\000\000\000\000\000\000\001e\004\000\000\000\000\000\000\012\244\000\000\023\000\000\000\022\184\000\001Y\132\000\000\0202\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\001\145\030\000\001\148D\000\000\000\000\000\000\004|\000\000\000\000\000\000\000\000\000\000\012\194\000\000\000\000\000\000\000\000\000\000\023\140\000\000\000\000\000\001n\208\000\000\000\000\000\001\145V\000\000\012\166\000\000\000\000\000\000\000\000\000\000\023\206\000\000\000\000\000\000\000\000\000\000\000\000\000\001\145\152\000\000\024N\000\000\000\000\000\000\147t\000\000\000\000\000\000\000\000\000\001kR\000\000\000\000\000\000\b\252\000\000\000\000\000\000\000\000\000\000\148\238\000\001R\020\000\000\000\000\000\000\000\000\000\000\151\b\000\000\005\250\000\000\026p\000\000\007\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rt\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\218\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\180\000\001ox\000\000\000\000\000\000\151 \000\000\000\000\000\000\000\000\000\000\160B\000\001}\152\000\000\r\188\000\000\024`\000\000\024:\000\001Y\132\000\000\020J\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\000\161n\000\000\024F\000\001~J\000\000\014r\000\000\025,\000\000\024\184\000\001Y\132\000\000\020l\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\000\161\148\000\000\169\170\000\000\025H\000\001~\252\000\000\015 \000\000\025\246\000\000\025\144\000\001Y\132\000\000\020\134\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\000\162\n\000\001G^\000\000\0156\000\000\025\224\000\000\024f\000\001\146\154\000\000\0112\000\001Y\132\000\000\0278\000\000\000\000\000\000\027\164\000\000\000\000\000\000\000\000\000\000\025\224\000\000\026\216\000\000\000\000\000\000\027\030\000\000\000\000\000\000\000\000\000\000\016\026\000\000\025\224\000\000\025\224\000\000\017:\000\000\000\000\000\000\150\214\000\000\1442\000\000\026>\000\000\022\206\000\000\027T\000\000\000\021\000\000\001\006\000\000\rF\000\000\000\000\000\000\026f\000\000\141\128\000\000\141\128\000\000\027>\000\000\141\128\000\000\000\021\000\000\001\006\000\000\001\006\000\000\141\128\000\000\000\000\000\001p.\000\000\rp\000\000\151\242\000\000\018 \000\000\002\202\000\001\148\164\000\000\000\000\000\001Y\132\000\001e\188\000\001Y\132\000\001[.\000\001e\240\000\001Y\132\000\000\003\224\000\001Y\132\000\001f\208\000\000\000\000\000\000\012Z\000\000\020\200\000\000\007\134\000\000\141\128\000\001pb\000\000\000\000\000\000\r\006\000\000\006\216\000\001R\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\141\128\000\001q8\000\000\141\128\000\001ql\000\000\005Z\000\000\001\208\000\001[\180\000\000\0142\000\000\001\208\000\001\\\138\000\000\000\000\000\001rB\000\000\002\014\000\000\000\000\000\001]`\000\000\000\000\000\000\000\000\000\001rv\000\000\001\"\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\014\014\000\000\027T\000\000\000\000\000\001S\160\000\000\027T\000\000\000\000\000\000#\206\000\000\000\000\000\000\000\000\000\000\141\128\000\000\002\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001LH\000\000\000\000\000\000\nl\000\000\000\000\000\000\158*\000\000\158\252\000\000\015Z\000\000\030\n\000\000\171\182\000\000\024\226\000\000\218(\000\000\150\214\000\000\022\206\000\000\141\246\000\000\150\214\000\000\022\206\000\000\018v\000\000\018v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002,\000\000\029:\000\000\138\222\000\000\000\000\000\000\152\190\000\000\153\138\000\000\144\172\000\000\022\206\000\000\027T\000\000\001n\000\000\170\238\000\000\000\000\000\000\005\022\000\000\000\000\000\000\154V\000\000\155\"\000\001s@\000\000\157\208\000\001Y\132\000\000\b8\000\000\000\000\000\000\018v\000\000\023\226\000\000\0272\000\000\000\000\000\000\018v\000\000\003B\000\000\003(\000\000\148\250\000\000\150\214\000\000\022\206\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000\169\170\000\000\140\200\000\000\000\000\000\000\150\214\000\000\022\206\000\000\146\220\000\000\b\152\000\000\000\000\000\000\169\170\000\000\164\014\000\001\146\154\000\000\012H\000\001Y\132\000\000\028\130\000\000\000\000\000\000 \218\000\000\000\000\000\000\000\000\000\000\169\170\000\000\017:\000\000\028J\000\000\000\000\000\000\017:\000\000\028\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\140\234\000\000\0166\000\000\028J\000\000\027\246\000\000\023\162\000\000\028\242\000\000\000\000\000\000\0284\000\000\023\162\000\000\028\244\000\000\000\000\000\000\000\000\000\000\029\006\000\000\000\000\000\000\029`\000\000\000\000\000\000\000\000\000\000\140\200\000\001\148\248\000\000\r^\000\001Y\132\000\000\004\158\000\000\000\000\000\000\029\028\000\000\000\000\000\000\169\170\000\000\029J\000\000\000\000\000\001\138N\000\000\140\234\000\000\145\162\000\001\148\248\000\000\014t\000\001Y\132\000\000\t\144\000\000\000\000\000\000\029\\\000\000\000\000\000\000\169\170\000\000\026:\000\000\000\000\000\000\018\184\000\000\001$\000\000\000\000\000\000\029l\000\000\001$\000\000\028\190\000\000\023\162\000\000\029\188\000\000\000\000\000\000\015\138\000\001Y\132\000\000\011\000\000\000\000\000\000\000\029\196\000\000\000\000\000\000\000\000\000\000\000\000\000\001Tj\000\000\000\000\000\000\000\000\000\000\003\n\000\000\218\236\000\000\0074\000\000\030\000\000\000\172\130\000\001^*\000\000\022\206\000\001kR\000\000#\190\000\000\173N\000\000\016\158\000\000\030\n\000\000\000\226\000\000\030n\000\000\000\000\000\000\000\000\000\000\018v\000\000\024\226\000\000\0302\000\000\000\000\000\000\031l\000\000\000\000\000\000\150\204\000\000\022\206\000\000\169\170\000\000\162\252\000\000\000\000\000\000\000\000\000\000\150\214\000\000\022\206\000\000\018v\000\000\025\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\174\026\000\001^*\000\000\022\206\000\001kR\000\000\000\000\000\000\000\000\000\000\018v\000\000\017L\000\000\030`\000\000\000\226\000\000\030\236\000\000\000\000\000\000\000\000\000\000\030\232\000\000\000\000\000\000\018v\000\000\004X\000\000\018v\000\000\005n\000\000\016P\000\000\148\250\000\001^*\000\000\022\206\000\001kR\000\000\145D\000\000\148\250\000\000\000\000\000\000$\212\000\000\174\230\000\000\018\020\000\000\030\240\000\000\000\226\000\000\031H\000\000\000\000\000\000\000\000\000\000\018v\000\000\027\014\000\001^*\000\000\022\206\000\001kR\000\000%\234\000\000\169\170\000\000\000\000\000\000\019\140\000\000\028$\000\000\018\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000\175\178\000\001^*\000\000\022\206\000\001kR\000\000(\022\000\000),\000\000\176~\000\001^*\000\000\022\206\000\001kR\000\000*B\000\000+X\000\000\000\000\000\000\020\162\000\000\029:\000\000\177J\000\001^*\000\000\022\206\000\001kR\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\178\022\000\001^*\000\000\022\206\000\001kR\000\000,n\000\000-\132\000\000\178\226\000\001^*\000\000\022\206\000\001kR\000\000.\154\000\000/\176\000\000\179\174\000\001^*\000\000\022\206\000\001kR\000\0000\198\000\0001\220\000\000\180z\000\001^*\000\000\022\206\000\001kR\000\0002\242\000\0004\b\000\000\181F\000\001^*\000\000\022\206\000\001kR\000\0005\030\000\00064\000\000\182\018\000\001^*\000\000\022\206\000\001kR\000\0007J\000\0008`\000\000\182\222\000\001^*\000\000\022\206\000\001kR\000\0009v\000\000:\140\000\000\183\170\000\001^*\000\000\022\206\000\001kR\000\000;\162\000\000<\184\000\000\184v\000\001^*\000\000\022\206\000\001kR\000\000=\206\000\000>\228\000\000\185B\000\001^*\000\000\022\206\000\001kR\000\000?\250\000\000A\016\000\000\186\014\000\001^*\000\000\022\206\000\001kR\000\000B&\000\000C<\000\000\186\218\000\001^*\000\000\022\206\000\001kR\000\000DR\000\000Eh\000\000\187\166\000\001^*\000\000\022\206\000\001kR\000\000F~\000\000G\148\000\000\188r\000\001^*\000\000\022\206\000\001kR\000\000H\170\000\000I\192\000\000\189>\000\001^*\000\000\022\206\000\001kR\000\000J\214\000\000K\236\000\000\190\n\000\001^*\000\000\022\206\000\001kR\000\000M\002\000\000N\024\000\000\190\214\000\001^*\000\000\022\206\000\001kR\000\000O.\000\000PD\000\000\191\162\000\001^*\000\000\022\206\000\001kR\000\000QZ\000\000Rp\000\000\192n\000\001^*\000\000\022\206\000\001kR\000\000S\134\000\000T\156\000\000\193:\000\001^*\000\000\022\206\000\001kR\000\000U\178\000\000V\200\000\000\194\006\000\001^*\000\000\022\206\000\001kR\000\000W\222\000\000X\244\000\000\194\210\000\000\019\138\000\000\031\026\000\000\000\226\000\000\031r\000\000\000\000\000\000\000\000\000\000\018v\000\000\030P\000\001^*\000\000\022\206\000\001kR\000\000Z\n\000\000[ \000\000\195\158\000\001^*\000\000\022\206\000\001kR\000\000\\6\000\000]L\000\000\022\206\000\001g\154\000\000\140\234\000\000\155\000\000\000\031\136\000\000\146\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n:\000\000\000\000\000\000\030\234\000\000\172\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\146\220\000\001\146\154\000\000\020@\000\000\030\240\000\001Y\132\000\000\014Z\000\000\000\000\000\000\000\000\000\000\031\014\000\000\000\000\000\000\000\000\000\000\017\182\000\001Y\132\000\000\015p\000\000\000\000\000\000\000\000\000\000\031\016\000\000\000\000\000\000\000\000\000\000\t\012\000\000\000\000\000\000\000\000\000\000\031\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\"\000\000\000\000\000\000\000\000\000\000\1468\000\001Y\132\000\000\016\134\000\000\000\000\000\000\000\000\000\000\031&\000\000\000\000\000\000\000\000\000\000\031@\000\000\000\000\000\000\000\000\000\000\163\170\000\000\000\000\000\000\000\000\000\001s\232\000\000\000\000\000\000\020\142\000\000\031\168\000\000\031&\000\001Y\132\000\000\020\232\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\000\163\238\000\001t\162\000\000\000\000\000\000\164\156\000\000\014\210\000\000\000\000\000\000\000\000\000\000\001\206\000\001U\018\000\001\146\154\000\000\018\204\000\001Y\132\000\000\017\156\000\000\000\000\000\000\000\000\000\000\031T\000\000\000\000\000\000\000\000\000\000\015H\000\000\000\000\000\000\000\000\000\000\031V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031^\000\000\000\000\000\000\000\000\000\000\000\000\000\001\127l\000\001\127l\000\000\000\000\000\000\000\000\000\000\000\000\000\000^b\000\001J\020\000\000\150\002\000\000\000\000\000\000\n\000\000\000\000\000\000\000\006\132\000\000\196j\000\001^*\000\000\022\206\000\001kR\000\000_x\000\000`\142\000\000\148\250\000\000\n@\000\000\000\000\000\000\007\154\000\000\1976\000\001^*\000\000\022\206\000\001kR\000\000a\164\000\000b\186\000\000\148\250\000\000\020\004\000\000\000\000\000\000\b\176\000\000\198\002\000\001^*\000\000\022\206\000\001kR\000\000c\208\000\000d\230\000\000!x\000\000\000\000\000\000\r\234\000\000\000\000\000\000\t\198\000\000\198\206\000\001^*\000\000\022\206\000\001kR\000\000e\252\000\000g\018\000\000\000\000\000\000\n\128\000\000\000\000\000\000\n\220\000\000\199\154\000\001^*\000\000\022\206\000\001kR\000\000h(\000\000i>\000\000\000\000\000\000\021\026\000\000\000\000\000\000\011\242\000\000\200f\000\001^*\000\000\022\206\000\001kR\000\000jT\000\000kj\000\000\020\226\000\000\017F\000\000\148\250\000\000\020n\000\000\000\000\000\000\r\b\000\000\2012\000\001^*\000\000\022\206\000\001kR\000\000l\128\000\000m\150\000\000\148\250\000\000\n\232\000\000\000\000\000\000\014\030\000\000\201\254\000\001^*\000\000\022\206\000\001kR\000\000n\172\000\000o\194\000\000\148\250\000\000\021\172\000\000\000\000\000\000\0154\000\000\202\202\000\001^*\000\000\022\206\000\001kR\000\000p\216\000\000q\238\000\000\016J\000\000\203\150\000\001^*\000\000\022\206\000\001kR\000\000s\004\000\000t\026\000\000\017`\000\000\021\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031L\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\020\220\000\000\000\000\000\000\000\000\000\000\011\150\000\000\000\000\000\000\000\000\000\000\0220\000\000\000\000\000\000\021\020\000\000\018\\\000\000\148\250\000\000\021\132\000\000\000\000\000\000\148\250\000\000\015\128\000\000\000\000\000\000\148\250\000\000\024\006\000\000\000\000\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000u0\000\000vF\000\000\000\000\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\\\000\000 L\000\000\204b\000\001^*\000\000\022\206\000\001kR\000\000xr\000\000\205.\000\001^*\000\000\022\206\000\001kR\000\000y\136\000\000z\158\000\000{\180\000\000\205\250\000\001^*\000\000\022\206\000\001kR\000\000|\202\000\000}\224\000\000\021\228\000\000\000\000\000\000\148\250\000\000\016@\000\000\000\000\000\000\148\250\000\000\025\190\000\000\000\000\000\000\206\198\000\000\021\160\000\000 \022\000\000\000\226\000\000 ^\000\000\000\000\000\000\000\000\000\000\018v\000\000\031f\000\001^*\000\000\022\206\000\001kR\000\000~\246\000\000\128\012\000\000\000\000\000\000\164\224\000\000\000\000\000\000\000\000\000\000\005\176\000\000\000\000\000\000\000\000\000\001s@\000\000\000\000\000\000\000\000\000\001\130\144\000\000\022H\000\000\000\000\000\000\000\000\000\000\159\200\000\001^*\000\000\022\206\000\001kR\000\000\030\180\000\000\207\146\000\001^*\000\000\022\206\000\001kR\000\000\025D\000\001U\140\000\000\022\206\000\000\031t\000\000\022\206\000\001R\020\000\000\169\170\000\000\027P\000\000\208^\000\001^*\000\000\022\206\000\001kR\000\000\030\208\000\001L\234\000\000\169\170\000\000%\022\000\000\209*\000\001^*\000\000\022\206\000\001kR\000\000\031\230\000\001Mp\000\000\169\170\000\000&,\000\000\209\246\000\001^*\000\000\022\206\000\001kR\000\000 \252\000\001NN\000\000\143$\000\000\210\194\000\001^*\000\000\022\206\000\001kR\000\000\"\018\000\001N\132\000\000\211\142\000\001^*\000\000\022\206\000\001kR\000\000\004\254\000\000\212Z\000\001^*\000\000\022\206\000\001kR\000\000#(\000\001Ob\000\001J\020\000\000\213&\000\001^*\000\000\022\206\000\001kR\000\000$>\000\001O\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012V\000\000\000\000\000\000\000\000\000\001J\020\000\000\014\192\000\000\000\000\000\000\160\156\000\001^*\000\000\022\206\000\001kR\000\000\152T\000\000\012\024\000\000\000\000\000\000\000\000\000\000\023\174\000\000\000\000\000\000\000\000\000\001J\020\000\000\r\022\000\000\000\000\000\000\161n\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000#\132\000\000\012T\000\000\000\000\000\000\016\150\000\000\000\000\000\000\000\000\000\001J\020\000\000\014&\000\000\000\000\000\000\015Z\000\000\012H\000\000\000\000\000\000\000\000\000\000\024\226\000\000 \240\000\000\018 \000\000\000\000\000\000\027\234\000\000\"&\000\000\nR\000\000\0304\000\000\000\000\000\000\000\000\000\000\026\212\000\000\000\000\000\000\000\000\000\000\001\160\000\000%\234\000\000\220\012\000\000\000\000\000\000 |\000\000\000\000\000\000\021\198\000\000\000\000\000\000\000\000\000\000\027\018\000\000\000\000\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000\029\206\000\001Mp\000\000\004\192\000\000\018\204\000\000\000\000\000\000\000\000\000\000\019\144\000\000\000\000\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000#\132\000\000\014\128\000\000\000\000\000\000\017V\000\000\000\000\000\000\000\000\000\001J\020\000\000\014\192\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000\152T\000\000\r.\000\000\000\000\000\000\000\000\000\000\023\244\000\000\000\000\000\000\000\000\000\001J\020\000\000\014D\000\000\000\000\000\000\000\000\000\000\022\206\000\000\027T\000\000\014\196\000\000\000\000\000\000\000\000\000\000\024\166\000\000\000\204\000\000\011F\000\000\027f\000\000\027T\000\001\131\202\000\000\216\188\000\000\000\000\000\000\005\186\000\000\027T\000\001\132P\000\000\031\230\000\000\000\000\000\000\000\000\000\000\027f\000\000\000\000\000\000\026\002\000\000\022\206\000\000\027\178\000\000\000\000\000\000\t@\000\000 f\000\000\000\000\000\000 d\000\000\030\140\000\001\\d\000\000\001h\000\000\000\000\000\000\000\000\000\000 0\000\000\031\172\000\001\146\154\000\000\019\226\000\001Y\132\000\000\023\250\000\000\005\170\000\000\022(\000\000\000\000\000\001V^\000\000\000\000\000\000\000\000\000\000\014Z\000\000\021\156\000\000\022\166\000\000\000\000\000\000\024\150\000\000 \130\000\000\000\000\000\000\004z\000\000\000\000\000\000\000\000\000\000\218\236\000\001V\228\000\001uR\000\000 \146\000\001b~\000\000\218\236\000\001V\228\000\001u\216\000\001V\228\000\001v^\000\000\000\000\000\001V\228\000\001v\228\000\001]:\000\001\149L\000\000\001$\000\000\153P\000\000\023\162\000\000 \140\000\000\214\018\000\000\020\248\000\001\\d\000\000 h\000\000\218\236\000\001wj\000\001W\148\000\000 l\000\000\218\236\000\001w\240\000\001X|\000\000\003f\000\000 (\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\206\000\001^\210\000\000\000\000\000\001g\154\000\001\127l\000\000\000\000\000\000\000\000\000\000 \182\000\000\000\000\000\000\017:\000\000 \186\000\000\000\000\000\000\000\000\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000\129\"\000\000\1308\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000\030\180\000\000\015\214\000\000\000\000\000\000\000\000\000\000\022 \000\000\000\000\000\000\000\000\000\001J\020\000\000\016\236\000\000\000\000\000\000\000\000\000\000\144\172\000\000\022\206\000\000\027T\000\000\031\196\000\000\000\000\000\000\226\140\000\000\000\000\000\000\006\144\000\000\000\000\000\000\000\226\000\000\000\000\000\000\000\000\000\000\016,\000\000\000\000\000\000 \190\000\000\000\000\000\000 \242\000\001kR\000\000\131N\000\000\000\000\000\001^*\000\000\022\206\000\001kR\000\000\023\218\000\000\000\000\000\000\000\000\000\000\227~\000\000\000\000\000\000\007\166\000\000\000\000\000\000\228p\000\000\000\000\000\000\027\026\000\000\000\000\000\000\141\128\000\000\bX\000\000\000\000\000\001_J\000\000\000\000\000\000\000\000\000\000\229b\000\000\000\000\000\000\b\188\000\000\000\000\000\000\230T\000\000\000\000\000\000\027Z\000\000\000\000\000\000\141\128\000\000\tn\000\000\000\000\000\001\127l\000\000\000\000\000\000\022\206\000\000\027T\000\001\127l\000\000\000\000\000\000%r\000\000\026\b\000\000\nv\000\000\001$\000\001\140@\000\000\141\128\000\001\134\154\000\001\127l\000\000\000\000\000\000\nv\000\000\020<\000\000\011F\000\000\027f\000\001\127l\000\001\141H\000\000\000\204\000\000\011F\000\000\027f\000\001\127l\000\001\141H\000\000\000\000\000\000\000\000\000\000\027f\000\001\127l\000\000\000\000\000\000\147\236\000\000\139\234\000\000\169\170\000\000\029|\000\000\000\000\000\000\000\000\000\000\147\236\000\000\139\234\000\000 \142\000\000 ,\000\000\023\162\000\000\000\000\000\000\225\154\000\000\000\000\000\000\000\254\000\000\000\021\000\000\001\206\000\000 \018\000\001\146\154\000\000\023n\000\001Y\132\000\001xv\000\000 :\000\000 \234\000\001\140l\000\000\000\000\000\001\127l\000\000\000\000\000\001y\006\000\000\026\002\000\000\022\206\000\000\027\178\000\001\133\000\000\000\031\004\000\000\014\b\000\001\135 \000\000\0142\000\000 2\000\000\022\206\000\001\127l\000\000\000\000\000\000\022\206\000\001\127l\000\000\000\000\000\001Y\132\000\001\152\b\000\000\025\240\000\000\023\210\000\000\000\204\000\000\001\208\000\001\143\250\000\000\000\000\000\000\000\204\000\000\001\208\000\001\143\250\000\000\000\000\000\000&\136\000\000\026\b\000\000\nv\000\000\001$\000\000\157V\000\000\141\128\000\001\127l\000\000\000\000\000\000\nv\000\000\021R\000\000!\188\000\000\r\194\000\000\000\000\000\001\143\250\000\000\000\000\000\000\011F\000\000 4\000\000\141\128\000\001\127l\000\001\149\174\000\000\000\204\000\000\011F\000\000 <\000\000\141\128\000\001\127l\000\001\149\174\000\000\000\000\000\000\000\000\000\000\030z\000\000\025\252\000\000\000\000\000\001\127\212\000\000\000\000\000\000\141\128\000\001\142\004\000\001\127l\000\000\000\000\000\000\030\166\000\000\025\252\000\000\000\000\000\000\026\002\000\000\022\206\000\000\027\178\000\001\128\206\000\000\140\212\000\000 F\000\000\022l\000\000\000\180\000\000\000\000\000\000\005>\000\000\139\208\000\000\000\000\000\000\024h\000\000\000\000\000\000\139\208\000\000\000\000\000\000 \204\000\000 j\000\000\026\172\000\000\022\206\000\000\152\136\000\001Y\132\000\000\023F\000\000\000\000\000\000\137\130\000\000\022l\000\000\025\006\000\000\004\190\000\000\000\000\000\000\017\210\000\000\000\000\000\000 \208\000\000 H\000\001Y\132\000\000\217\202\000\000\000\000\000\000\022\186\000\000\028h\000\000\027\028\000\000\000\000\000\000\018\232\000\000\000\000\000\000 \214\000\000 N\000\001\146\154\000\000\163 \000\000\000\000\000\000\022\144\000\000\026\172\000\000 \252\000\000\023z\000\000\000\204\000\000\000\000\000\000\026\018\000\000\026\172\000\001Y\132\000\000\025\132\000\000\bZ\000\000\000\000\000\001Y\132\000\000\n\188\000\000\011\022\000\000\000\000\000\000\000\000\000\001y\150\000\000\000\000\000\000\000\000\000\000\026\130\000\000\026\172\000\001zF\000\000\217\202\000\000\000\000\000\000\022\206\000\001Y\132\000\000\016\250\000\001Y\132\000\000\220\160\000\000\163 \000\000\000\000\000\000\022\212\000\000\000\000\000\000\000\000\000\000\163 \000\000\000\000\000\000\000\000\000\000\137\130\000\000\000\000\000\001\127l\000\001\1428\000\000\022l\000\000\000\180\000\000\005>\000\000 \238\000\000 \150\000\000\026\172\000\001\127l\000\001\1428\000\000\000\000\000\000\000\000\000\000\022l\000\000\000\180\000\000\005>\000\000!\n\000\000 \130\000\000\169.\000\001h\n\000\000\218\236\000\000!\"\000\000\169.\000\001Y\132\000\000\011\022\000\000!$\000\000\169.\000\000\218\236\000\000!:\000\000\169.\000\000\022\128\000\000\024N\000\001{\030\000\001\128:\000\000\000\000\000\000\167,\000\000\000\000\000\000\000\000\000\001\127l\000\001\149\218\000\000\022l\000\000\000\180\000\000\005>\000\000!4\000\000 \178\000\000\169.\000\001\127l\000\001\149\218\000\000\000\000\000\000\000\000\000\000\000\000\000\001\152\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\127l\000\000\000\000\000\000\1442\000\000\022\206\000\000\141\128\000\001\127l\000\000\000\000\000\001\142H\000\000\022\206\000\000\148z\000\000!B\000\001\129~\000\001\134\020\000\000\000\000\000\001\127\180\000\001\142l\000\000\000\000\000\000\000\000\000\000\000\000\000\001\150B\000\000\022\206\000\000\148z\000\000!F\000\000\024(\000\000 \194\000\001\137\224\000\001\144t\000\000\001h\000\000!\134\000\000\000\000\000\000\000\000\000\001{\164\000\001\128\206\000\000\022\206\000\000\000\000\000\001\135\174\000\000\027\178\000\000\000\000\000\000\000\000\000\001\127\180\000\001\150B\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\142\000\000\139\254\000\000\147\006\000\000\001h\000\000!\150\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\206\000\000\022\206\000\000\000\000\000\000\001h\000\000!\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\166\000\000\140\212\000\000\022l\000\000\000\180\000\000\005>\000\000!b\000\001h\146\000\000\140\234\000\000\154\190\000\000\022\206\000\000\2246\000\000\224R\000\000\022l\000\000\018Z\000\000\0254\000\000\000\000\000\000!p\000\000\0168\000\000\000\000\000\000\000\000\000\000!\022\000\000\000\000\000\000\000\000\000\000\169\234\000\000\000\000\000\000\028$\000\000\028\002\000\000\000\000\000\000\023\182\000\000\000\000\000\000!\140\000\000!\006\000\001Y\132\000\000\222\132\000\000!\158\000\000\018\234\000\000\000\000\000\000\000\000\000\000!<\000\000\000\000\000\000\000\000\000\000\022\186\000\000\022f\000\000\027h\000\000\000\000\000\000!\164\000\001i:\000\001\150\184\000\000\020@\000\000!2\000\001Y\132\000\000\019\020\000\000\000\000\000\000\000\000\000\000!L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\169\234\000\000\000\000\000\000\030L\000\000\028f\000\000\000\000\000\000\024n\000\000\000\000\000\000!\178\000\000!*\000\001\146\154\000\000\000\000\000\000!\182\000\001i\226\000\001\1518\000\000\020@\000\000!\\\000\001Y\132\000\000\025@\000\000\000\000\000\000\000\000\000\000!p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\206\000\000\000\000\000\000\169\234\000\000\000\000\000\000\023\024\000\000\022\144\000\000\154\190\000\000\154\190\000\001J\254\000\000\147\236\000\000\022\206\000\001^\210\000\001g\154\000\000\012.\000\000\000\000\000\000\030H\000\000\000\204\000\000\000\000\000\000\029\n\000\000\154\190\000\001Y\132\000\000\027\170\000\000\018 \000\000\000\000\000\000\022\206\000\001h\146\000\001h\146\000\000\154\190\000\000\027\140\000\000\154\190\000\000\000\000\000\000\144\204\000\000\145\212\000\000\000\000\000\001_\246\000\000\000\000\000\000\000\000\000\001`\166\000\000\000\000\000\000\000\000\000\001aV\000\000\000\000\000\000\029^\000\000\154\190\000\001b\006\000\001^\210\000\001g\154\000\000\012.\000\000\000\000\000\000\006x\000\000\000\000\000\000\000\000\000\000\169.\000\000\024\130\000\000\000\000\000\000\000\000\000\000\213&\000\000!\220\000\000\000\000\000\000\169\234\000\000\000\000\000\000\154\190\000\000\213&\000\000\169\234\000\000\000\000\000\000\022\206\000\001Y\132\000\000\169\234\000\000\000\000\000\000\026v\000\000\000\000\000\000\000\000\000\000\169\234\000\000\000\000\000\000\000\000\000\000\224R\000\000\000\000\000\001\138\172\000\000\169.\000\000!~\000\000\154\190\000\001\1392\000\001h\146\000\000\000\000\000\001\127l\000\001\143 \000\000\022l\000\000\000\180\000\000\005>\000\000!\230\000\001h\146\000\001\127l\000\001\143 \000\000\000\000\000\000\000\000\000\000\000\000\000\001\151L\000\000\150\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\141\028\000\000\000\000\000\001\127l\000\000\000\000\000\000\026>\000\000\022\206\000\000\027T\000\001\127l\000\000\000\000\000\001\142l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\127l\000\001\151L\000\000\000\000\000\000\000\000\000\000\000\000\000\001\141\028\000\000\"$\000\000\000\000\000\000\"*\000\000\000\000\000\001\127l\000\001\151L\000\000\000\000\000\000\000\000\000\000\".\000\000\000\000\000\000\000\000\000\000\"$\000\000%x\000\000\027\178\000\000\027\178\000\001\128\206\000\000\031\004\000\000\022\206\000\000\000\000\000\001\127\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\1316\000\000\031\004\000\000\022\206\000\000\000\000\000\000\0256\000\001\129~\000\001\134\020\000\000\000\000\000\001\127\180\000\000\000\000\000\000\"0\000\000%x\000\000\027\178\000\001\127\180\000\000\000\000\000\000\028\244\000\000\000\000\000\000\000\000\000\001j\136\000\000\003N\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\001\146\150\000\000!\138\000\001|,\000\000\026L\000\000\"\016\000\000!\152\000\001Y\132\000\000\025\160\000\000\000\000\000\000\000\000\000\000\169\170\000\000\000\000\000\000\000\000\000\001\146\238\000\000\027P\000\000\000\000\000\001Y\132\000\000\027l\000\000\000\000\000\000\224R\000\000\029&\000\000\000\000\000\000\000\000\000\000\018v\000\000!\146\000\001^*\000\000\022\206\000\001kR\000\000\132d\000\000\133z\000\000!\170\000\000\214\246\000\000\029\b\000\000\",\000\000\000\226\000\000\"r\000\000\000\000\000\000\000\000\000\000\018v\000\000\"\168\000\001^*\000\000\022\206\000\001kR\000\000\134\144\000\000\135\166\000\000\"\156\000\001kR\000\000\000\000\000\000\136\188\000\000\000\000\000\000\"\134\000\000\000\000\000\000\024D\000\001\146\154\000\000\006\168\000\000\0150\000\000\022\206\000\000\170\020\000\000\000\000\000\000\000\000\000\000\025\244\000\001\131l\000\000\000\000\000\000\000\000\000\000!\254\000\000\000\000\000\000\023p\000\001Y\132\000\000\030\028\000\000\020j\000\001Y\132\000\000\247\018\000\001,\002\000\000\000\000\000\000\217\b\000\000\248\004\000\001,\244\000\000\"\\\000\001Y\132\000\000\248\246\000\001-\230\000\000\000\000\000\000\217\b\000\000\249\232\000\001.\216\000\000\001h\000\000\"\140\000\000\000\000\000\000\000\000\000\001\1364\000\000\000\000\000\000\000\000\000\001\137\224\000\000\000\000\000\001\127\180\000\000\000\000\000\000\"\128\000\000%x\000\000 \134\000\001\127\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030z\000\001\129~\000\001\134\020\000\001\137\224\000\000\000\000\000\001\127\180\000\000\000\000\000\000\"\132\000\000%x\000\000 \134\000\001\127\212\000\000\000\000\000\000\029\244\000\000\000\000\000\000\000\000\000\000\t\210\000\000\000\000\000\000\028z\000\001Y\132\000\000\030x\000\000\029\020\000\001Y\132\000\000\250\218\000\001/\202\000\000\000\000\000\000\217\b\000\000\251\204\000\0010\188\000\000\"j\000\001Y\132\000\000\252\190\000\0011\174\000\000\000\000\000\000\217\b\000\000\253\176\000\0012\160\000\000\029X\000\001Y\132\000\000\254\162\000\0013\146\000\000\000\000\000\000\217\b\000\000\255\148\000\0014\132\000\000\"l\000\001Y\132\000\001\000\134\000\0015v\000\000\000\000\000\000\217\b\000\001\001x\000\0016h\000\000\223\166\000\001P\150\000\000\030\168\000\001Y\132\000\000\030\156\000\000\030\174\000\001Y\132\000\001\002j\000\0017Z\000\000\000\000\000\000\217\b\000\001\003\\\000\0018L\000\000\"p\000\001Y\132\000\001\004N\000\0019>\000\000\000\000\000\000\217\b\000\001\005@\000\001:0\000\000\030\220\000\001Y\132\000\001\0062\000\001;\"\000\000\000\000\000\000\217\b\000\001\007$\000\001<\020\000\000\"\128\000\001Y\132\000\001\b\022\000\001=\006\000\000\000\000\000\000\217\b\000\001\t\b\000\001=\248\000\000\136\230\000\000\217\250\000\000\b \000\001Y\132\000\001\t\250\000\001>\234\000\000\000\000\000\000\217\b\000\001\n\236\000\001?\220\000\000\"\130\000\001Y\132\000\001\011\222\000\001@\206\000\000\000\000\000\000\217\b\000\001\012\208\000\001A\192\000\000\138\166\000\000\217\250\000\000\217\196\000\001Y\132\000\001\r\194\000\001B\178\000\000\000\000\000\000\217\b\000\001\014\180\000\001C\164\000\000\"\132\000\001Y\132\000\001\015\166\000\001D\150\000\000\000\000\000\000\217\b\000\001\016\152\000\001E\136\000\001b\220\000\000\021\254\000\000\000\000\000\001cb\000\000\"\184\000\000\000\000\000\000\001$\000\000\215\178\000\001\127l\000\000\000\000\000\001\127l\000\000\000\000\000\000\"\182\000\000\000\000\000\000\000\000\000\000\"\012\000\000\000\000\000\000\0222\000\000\000\000\000\000\000\000\000\000\"$\000\000\000\000\000\000\000\000\000\000\148\250\000\000\"&\000\000\000\000\000\000\000\000\000\000\028\216\000\001Kv\000\000\"\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031H\000\000\006\216\000\001Px\000\000\"\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\">\000\000\000\000\000\000\031\004\000\000\000\000\000\000\"B\000\000\000\000\000\001Y\132\000\000\000\000\000\000\nv\000\000\000\000\000\000\000\000\000\000\"F\000\000\000\000\000\000\000\000\000\000\001\208\000\000\000\000\000\000\b\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030&\000\000\000\000\000\000\027T\000\000\000\000\000\000\005Z\000\000\000\000\000\000\141\128\000\000\000\000\000\000\002\234\000\000\000\000\000\000\020\200\000\000\000\000\000\000\"L\000\000\000\000\000\000\169\170\000\000\143$\000\000\000\000\000\000\000\000\000\000\015\136\000\000\"N\000\000\000\000\000\000\000\000\000\000\"F\000\000\016H\000\000\141\246\000\000\001$\000\001\136\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\144\000\000\001$\000\001\137@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\162\000\000\000\000\000\000\000\000\000\000#\000\000\000\000\000\000\001d\020\000\000\000\000\000\000\028\n\000\000#\n\000\000\000\000\000\000#\012\000\000\000\000\000\000\142\194\000\000\142\194\000\001S\246\000\001S\246\000\000\000\000\000\000\000\000\000\001\127l\000\001S\246\000\000\000\000\000\000\000\000\000\000\000\000\000\001\127l\000\001S\246\000\000\"b\000\000\000\000\000\000\"d\000\000\000\000"), (16, "\004Q\004Q\000\006\004Q\024^\004Q\003j\003n\003r\004Q\003v\003B\004Q\003\130\004Q\b\030\007\198\004Q\001n\004Q\004Q\004Q\004\177\004Q\004Q\004Q\001\250\b\"\b&\001.\007\202\004Q\b\182\b\186\018\146\004Q\007\022\004Q\b\226\b*\007\206\006\225\b\230\006\225\004Q\004Q\004Q\t\018\t\022\004Q\t\026\t&\t2\t6\t>\r:\000\242\004Q\004Q\003b\001n\004\177\t.\014\166\004Q\004Q\004Q\014\170\014\174\014\186\014\206\015J\001j\004Q\t\190\004Q\004Q\004Q\004Q\004Q\004Q\004Q\004Q\004Q\015j\004Q\t\214\t\218\001\130\004Q\001\146\004Q\004Q\002\254!Z\015v\015\142\017:\t\230\t\234\004Q\017N\004Q\004Q\005\178\004Q\004Q\004Q\004Q\006\225\006\225\024\222\004Q\030\154\004Q\004Q\024b\004Q\004Q\004Q\004Q\004Q\004Q\004Q\t\238\014\194\004Q\004Q\004Q\014\218\003\238\004Q\004Q\017R\030\158\004Q\004Q\004Q\004Q\020!\020!\007\026\020!\020Y\020!\014J\r\138\020!\020!\000\242\020!\020!\020!\020!\002\002\020!\020!\020Y\020!\020!\020!\000\n\020!\020!\020!\020!\014N\020!\000\242\020!\020!\020!\020!\020!\020!\020!\020!\r~\002e\020!\002e\020!\rV\020!\020!\020!\020!\020!\020!\003\002\020!\014\006\020!\002e\020!\t:\020!\020!\020!\002\006\005\182\020!\020!\020!\020!\020!\020!\020!\020!\002%\020!\000\242\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\028\254\020!\020!\020!\020!\020!\007R\020!\020!\003\142\b\165\014j\007\142\020!\020!\020!\020!\001\246\020!\020!\001r\020!\020!\020!\020!\020!\000\242\020!\020!\001n\020!\020!\004\177\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\020!\r\142\029\002\020!\020!\020!\020!\002%\002%\002%\002%\001\006\002%\001\206\004N\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\015\030\002%\r\202\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\027\186\002%\004R\002%\002%\002%\002%\002%\002%\002%\002%\003\134\002%)\014\002%\r!\002%\002%\002%\005~\002%\002%\002%\002%\002%\002%\002%\002%\002%\004\138\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\005\134\002%\002%\002%\002%\002%\002\198\002%\002%\001z\004\146\014\134\r\138\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002\226\014\250\002%\n.\002%\002%\014\138\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\006\225\002%\002%\002%\002%\002%\014\205\014\205\014\006\014\205\001\138\014\205(\130\r\138\014\205\014\205\003\190\014\205\014\205\014\205\014\205\004\170\014\205\014\205\n\r\014\205\014\205\014\205\000\242\014\205\014\205\014\205\014\205(\134\014\205\001\198\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\015f\000\242\014\205\r%\014\205\r\154\014\205\014\205\014\205\014\205\014\205\014\205\001\202\014\205\014\006\014\205\025B\014\205\025N\014\205\014\205\014\205\r\162-K\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\003\218\014\205\000\242\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\000\242\014\205\014\205\014\205\014\205\014\205\006\225\014\205\014\205\003\018\016\230\006\225\r\138\014\205\014\205\014\205\014\205\006\225\014\205\014\205\r\029\014\205\014\205\014\205\014\205\015b\r%\0172\014\205\003\026\014\205\014\205\014V\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\014\205\ti\014\205\014\205\014\205\014\205\014\205\005)\005)\014\006\005)\004\190\005)\000\242\r%\005)\005)\000\242\005)\005)\005)\005)\ti\005)\005)\011Z\005)\005)\005)\000\242\005)\005)\005)\005)\007\178\005)\007\194\005)\005)\005)\005)\005)\005)\005)\005)\001\154\011^\005)\004\241\005)\r\190\005)\005)\005)\005)\005)\005)\001~\005)\rA\005)\001\214\005)\016F\005)\005)\005)\028\254\r\029\005)\005)\005)\005)\005)\005)\005)\005)\b\165\005)\027\254\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\000\242\015R\005)\005)\015Z\017*\004\018\005)\005)\005\138!\170\024F\r\138\005)\005)\005)\005)\000\242\005)\005)\b\185\005)\005)\005)\005)\015b\029\002\0172\005)\005\154\005)\005)\015*\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\005)\b2\005)\005)\005)\005)\005)\005\025\005\025\014\006\005\025\rA\005\025\b6\b:\005\025\005\025\011b\005\025\005\025\005\025\005\025\001\246\005\025\005\025\b>\005\025\005\025\005\025\000\242\005\025\005\025\005\025\005\025\011b\005\025\002\129\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\007b\r\138\005\025\014j\005\025!b\005\025\005\025\005\025\005\025\005\025\005\025\nI\005\025\024J\005\025\nI\005\025\000\242\005\025\005\025\005\025\003*\017\006\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\007I\005\025\018\022\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\014\006\015R\005\025\005\025\015Z\017*\011\226\005\025\005\025\014\018\007I-;\nI\005\025\005\025\005\025\005\025\014\026\005\025\005\025\000\242\005\025\005\025\005\025\005\025\015b\014\030\0172\005\025\002\018\005\025\005\025\025\166\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025\005\025&\158\005\025\005\025\005\025\005\025\005\025\0145\0145\028\182\0145\007\026\0145\007~\r\138\0145\0145\003\194\0145\0145\0145\0145&\162\0145\0145\001\246\0145\0145\0145\029\"\0145\0145\0145\0145\030\146\0145\025\174\0145\0145\0145\0145\0145\0145\0145\0145\006\225\004\186\0145\003\190\0145\012\014\0145\0145\0145\0145\0145\0145\r\234\0145\014\006\0145\002\022\0145\022\170\0145\0145\0145\000\242\004J\0145\0145\0145\0145\0145\0145\0145\0145\t\245\0145\000\242\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\000\242\0145\0145\0145\0145\0145\011\234\0145\0145,\182\t\245\002\006\001\246\0145\0145\0145\0145\004f\0145\0145\r\025\0145\0145\0145\0145\0145\006\225\0145\0145\003\238\0145\0145&\166\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\tq\n\017\0145\0145\0145\0145\014E\014E\004N\014E\007\230\014E(\154\r\138\014E\014E\000\242\014E\014E\014E\014E\tq\014E\014E\004z\014E\014E\014E\012\018\014E\014E\014E\014E\030\230\014E\011M\014E\014E\014E\014E\014E\014E\014E\014E\005\"\ty\014E\b\002\014E\b\022\014E\014E\014E\014E\014E\014E\001\142\014E\014\006\014E\002N\014E\022\210\014E\014E\014E\ty\r\025\014E\014E\014E\014E\014E\014E\014E\014E\004\138\014E\000\242\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\0056\014E\014E\014E\014E\014E\004\022\014E\014E\r\214\004\146\001\158\r\138\014E\014E\014E\014E\002~\014E\014E\001\246\014E\014E\014E\014E\014E\r\254\014E\014E+\166\014E\014E\031\002\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\019\189\015\158\014E\014E\014E\014E\014=\014=\014\006\014=\004\026\014=\000\242\r\138\014=\014=\003\182\014=\014=\014=\014=\005\206\014=\014=\003\138\014=\014=\014=\000\242\014=\014=\014=\014=\031\030\014=\007j\014=\014=\014=\014=\014=\014=\014=\014=\011\194\015\162\014=\015\230\014=\015F\014=\014=\014=\014=\014=\014=\003\190\014=\014\006\014=\003\210\014=\022\250\014=\014=\014=\004\018\011\198\014=\014=\014=\014=\014=\014=\014=\014=\004\138\014=\000\242\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\004\150\014=\014=\014=\014=\014=\019\189\014=\014=\003N\004\146\002\206\r\138\014=\014=\014=\014=\004\158\014=\014=-\027\014=\014=\014=\014=\014=\003\206\014=\014=\004\214\014=\014=\031:\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\014=\016z\007\026\014=\014=\014=\014=\014)\014)\014\006\014)\tF\014)\012r\r\138\014)\014)\021z\014)\014)\014)\014)\006b\014)\014)\004\166\014)\014)\014)\000\242\014)\014)\014)\014)*v\014)\022\162\014)\014)\014)\014)\014)\014)\014)\014)\011b\000\242\014)\tb\014)\tv\014)\014)\014)\014)\014)\014)\022\166\014)\014\006\014)\028\230\014)\023&\014)\014)\014)\004\018\022\202\014)\014)\014)\014)\014)\014)\014)\014)\rY\014)\000\242\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\022\206\014)\014)\014)\014)\014)\027\158\014)\014)\023F\rY\006\225\006\225\014)\014)\014)\014)\005V\014)\014)\011b\014)\014)\014)\014)\014)\006\225\014)\014)\019\221\014)\014)\023J\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\014)\019\221\014j\014)\014)\014)\014)\0141\0141\006\225\0141\005\218\0141\023\198\012\229\0141\0141\000\242\0141\0141\0141\0141\000\242\0141\0141\006\026\0141\0141\0141\nA\0141\0141\0141\0141\014\162\0141\023\202\0141\0141\0141\0141\0141\0141\0141\0141\003\142\016\194\0141\007\142\0141\005\142\0141\0141\0141\0141\0141\0141\000\242\0141\012\225\0141,\251\0141\023N\0141\0141\0141\bV\bZ\0141\0141\0141\0141\0141\0141\0141\0141\004\138\0141\007r\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\000\242\0141\0141\0141\0141\0141\004\018\0141\0141\023F\004\146\000\242\002\158\0141\0141\0141\0141\012\229\0141\0141\004\018\0141\0141\0141\0141\0141\t\150\0141\0141\019\225\0141\0141\024v\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\0141\019\225\t\154\0141\0141\0141\0141\014-\014-\007v\014-\nN\014-\nb\012\225\014-\014-\011b\014-\014-\014-\014-\012\246\014-\014-\r%\014-\014-\014-\025\222\014-\014-\014-\014-\n\174\014-\n\194\014-\014-\014-\014-\014-\014-\014-\014-\007\026\003\210\014-\003\190\014-\027z\014-\014-\014-\014-\014-\014-\026\238\014-\025\222\014-\005\150\014-\023v\014-\014-\014-\003r\r\206\014-\014-\014-\014-\014-\014-\014-\014-\004\138\014-\027V\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\003\222\014-\014-\014-\014-\014-\011\134\014-\014-\005\162\004\146\b\166\002\170\014-\014-\014-\014-\t\210\014-\014-\011f\014-\014-\014-\014-\014-\bb\014-\014-\006\249\014-\014-\025\246\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\014-\019\185\027~\014-\014-\014-\014-\0149\0149\001\006\0149\001\206\0149\027\026\025\246\0149\0149\025\222\0149\0149\0149\0149\015\178\0149\0149\004\026\0149\0149\0149\025\222\0149\0149\0149\0149\006\249\0149\026\242\0149\0149\0149\0149\0149\0149\0149\0149\bV\bZ\0149\011&\0149\011:\0149\0149\0149\0149\0149\0149\003\190\0149\rZ\0149\011\254\0149\023\166\0149\0149\0149\001\246\r\142\0149\0149\0149\0149\0149\0149\0149\0149\004\138\0149\bf\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\025\222\0149\0149\0149\0149\0149\019\185\0149\0149 \202\004\146\002\238\r\202\0149\0149\0149\0149\001\246\0149\0149\025\246\0149\0149\0149\0149\0149\r\230\0149\0149\023\030\0149\0149\025\246\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0276\023\"\0149\0149\0149\0149\014I\014I\012J\014I\012^\014I\028Z\025\222\014I\014I\003N\014I\014I\014I\014I\016>\014I\014I\b\254\014I\014I\014I\025\222\014I\014I\014I\014I\027n\014I\005\170\014I\014I\014I\014I\014I\014I\014I\014I\014^\025\246\014I\012\002\014I\rV\014I\014I\014I\014I\014I\014I\006\225\014I\025\222\014I\006\225\014I\023\206\014I\014I\014I\026\218 N\014I\014I\014I\014I\014I\014I\014I\014I\004\138\014I\028*\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\025\222\014I\014I\014I\014I\014I\022\026\014I\014I\012~\004\146\012\146\000\242\014I\014I\014I\014I\025\246\014I\014I\028B\014I\014I\014I\014I\014I\011\006\014I\014I\004\242\014I\014I\025\246\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\014I\021B\014j\014I\014I\014I\014I\014A\014A\001\006\014A\001\206\014A\028v\025\246\014A\014A\000\242\014A\014A\014A\014A\016r\014A\014A)v\014A\014A\014A\011b\014A\014A\014A\014A\028\138\014A\005\250\014A\014A\014A\014A\014A\014A\014A\014A\023\198\025\246\014A\012\182\014A\012\202\014A\014A\014A\014A\014A\014A\003r\014A\012\230\014A\r\"\014A\023\246\014A\014A\014A\026\254\024\162\014A\014A\014A\014A\014A\014A\014A\014A\004\138\014A\014\178\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\025\222\014A\014A\014A\014A\014A\007u\014A\014A\001\006\004\146\001\206\000\242\014A\014A\014A\014A\006:\014A\014A\003\210\014A\014A\014A\014A\014A\028\006\014A\014A\022R\014A\014A\006\142\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\014A\021b\022\202\014A\014A\014A\014A\014\181\014\181\011b\014\181\006n\014\181\030\166\b\254\014\181\014\181\004N\014\181\014\181\014\181\014\181\016\186\014\181\014\181\025J\014\181\014\181\014\181\011b\014\181\014\181\014\181\014\181\r*\014\181\030\026\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\027^\025\246\014\181\015\246\014\181\016\n\014\181\014\181\014\181\014\181\014\181\014\181\001\006\014\181\001\206\014\181\017\194\014\181\024\018\014\181\014\181\014\181\030N\027b\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\022\194\014\181\022\234\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\025\222\014\181\014\181\014\181\014\181\014\181\004\018\014\181\014\181\017\014$\214\017\030\000\242\014\181\014\181\014\181\014\181\005\214\014\181\014\181\006j\014\181\014\181\014\181\014\181\014\181\003\142\014\181\014\181\007\142\014\181\014\181\011b\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\014\181\021\170\0282\014\181\014\181\014\181\014\181\005\021\005\021\n9\005\021\006\174\005\021\006\206\000\242\005\021\005\021\000\242\005\021\005\021\005\021\005\021\000\242\005\021\005\021\0286\005\021\005\021\005\021\011b\005\021\005\021\005\021\005\021\007\246\005\021\004*\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\023\150\025\246\005\021\017\146\005\021\017\162\005\021\005\021\005\021\005\021\005\021\005\021\b\018\005\021\"f\005\021\023\190\005\021\023\230\005\021\005\021\005\021\030j!\178\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\004\138\005\021\000\242\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\r6\015R\005\021\005\021\015Z\017*\004\018\005\021\005\021\007Z\004\146\000\242\000\242\005\021\005\021\005\021\005\021\001\246\005\021\005\021\003r\005\021\005\021\005\021\005\021\015b\b\181\0172\005\021\007\166\005\021\005\021\007\170\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\005\021\022:\005\021\005\021\005\021\005\021\005\021\002\145\002\145\017\234\002\145\017\250\002\145\007\182\b\150\003r\002\145\b\242\003B\002\145\017\142\002\145\021Z\007\198\002\145\007\190\002\145\002\145\002\145\011b\002\145\002\145\002\145\001\250\b\254\017\166\006\225\007\202\002\145\002\145\002\145\002\145\002\145\017\174\002\145\024\142\006\225\007\206\007\234\b\230\rE\002\145\002\145\002\145\002\145\002\145\002\145\tV\t&\000\242\001\206\024\154\002\145\024\166\002\145\002\145\003b\016\150!\222\t.\014\166\002\145\002\145\002\145\014\170\014\174\014\186\004\138\017\182\t\002\002\145\t\190\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\016\158\015R\t\214\t\218\015Z\017*\018*\002\145\002\145\007\238\004\146\000\242\014\178\002\145\t\230\t\234\002\145\tr\002\145\002\145\001\246\002\145\002\145\002\145\002\145\017\190\011}\023\018\002\145\007\250\002\145\002\145\b\006\002\145\002\145\002\145\002\145\002\145\002\145\002\145\t\238\014\194\002\145\002\145\002\145\014\218\003\238\002\145\002\145\003\210\rE\002\145\002\145\002\145\002\145\014\157\014\157\028\014\014\157\020\234\014\157\000\242\000\242\003r\014\157\t\198\003B\014\157\014\157\014\157\0222\007\198\014\157\b\n\014\157\014\157\014\157%\030\014\157\014\157\014\157\001\250\n^\014\157\bn\007\202\014\157\014\157\014\157\014\157\014\157\014\157\014\157\003\142\t\198\007\206\007\142\b\230%^\014\157\014\157\014\157\014\157\014\157\014\157\020\162\t&\020\178\001\206\br\014\157\n\190\014\157\014\157\003b\022\242\b\210\t.\014\166\014\157\014\157\014\157\014\170\014\174\014\186\004\138\014\157\000\242\014\157\t\190\014\157\014\157\014\157\014\157\014\157\014\157\014\157\014\157\014\157\022\246\014\157\t\214\t\218\014\157\014\157\b\250\014\157\014\157\028\018\004\146\bV\bZ\014\157\t\230\t\234\014\157\000\242\014\157\014\157\0116\014\157\014\157\014\157\014\157\014\157\031\130\014\157\014\157\023\158\014\157\014\157\012Z\014\157\014\157\014\157\014\157\014\157\014\157\014\157\t\238\014\194\014\157\014\157\014\157\014\218\003\238\014\157\014\157\012\142\023\162\014\157\014\157\014\157\014\157\014\153\014\153\015\246\014\153\016*\014\153\tJ\012\198\003r\014\153\000\242\003B\014\153\014\153\014\153\029\022\007\198\014\153)\174\014\153\014\153\014\153\000\242\014\153\014\153\014\153\001\250\002v\014\153\023\030\007\202\014\153\014\153\014\153\014\153\014\153\014\153\014\153\tN\000\242\007\206\021\226\b\230\021\246\014\153\014\153\014\153\014\153\014\153\014\153\024j\t&\000\242\001\206\tZ\014\153\021\242\014\153\014\153\003b\023n\tf\t.\014\166\014\153\014\153\014\153\014\170\014\174\014\186\004\138\014\153\002\006\014\153\t\190\014\153\014\153\014\153\014\153\014\153\014\153\014\153\014\153\014\153\023r\014\153\t\214\t\218\014\153\014\153\tj\014\153\014\153\nF\004\146\bV \194\014\153\t\230\t\234\014\153\000\242\014\153\014\153\004\018\014\153\014\153\014\153\014\153\014\153 \214\014\153\014\153\023\158\014\153\014\153\nR\014\153\014\153\014\153\014\153\014\153\014\153\014\153\t\238\014\194\014\153\014\153\014\153\014\218\003\238\014\153\014\153\023\238\024\150\014\153\014\153\014\153\014\153\002\245\002\245\023\146\002\245\b\250\002\245\029>\027\210\003r\002\245\004\229\003B\002\245\017\142\002\245\029\178\007\198\002\245\023\242\002\245\002\245\002\245\022\162\002\245\002\245\002\245\001\250\024\138\017\166\b\250\007\202\002\245\002\245\002\245\002\245\002\245\017\174\002\245\nV\025b\007\206\025r\b\230\025>\002\245\002\245\002\245\002\245\002\245\002\245\n\178\t&\030Z\001\206\n\182\002\245\029&\002\245\002\245\003b\023n,r\t.\014\166\002\245\002\245\002\245\014\170\014\174\014\186\019\229\017\182\025\194\002\245\t\190\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\024\130\002\245\t\214\t\218\n\238\002\245\019\229\002\245\002\245\025\198\006\225\006\225\002\186\002\245\t\230\t\234\002\245\n\250\002\245\002\245\011\n\002\245\002\245\002\245\002\245\029*\006\225\002\190\002\245\027\214\002\245\002\245\006\225\002\245\002\245\002\245\002\245\002\245\002\245\002\245\t\238\014\194\002\245\002\245\002\245\014\218\003\238\002\245\002\245\006\225\006\225\002\245\002\245\002\245\002\245\006\225\006\225\006\225\"z\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\003\190\006\225\000\242\006\225\006\225\000\242\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\030^\006\225\006\225,v\000\242\006\225\006\225\006\225\007&\006\225\006\225\006\225\006\225\006\225\006\225\000\242\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\000\242\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\000\242\006\225\006\225\006\225\006\225\006\225#\014\006\225\006\225\006\225\006\225\006\225\011*\006\225$\194!\150\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\003\202\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\006\225\000\242\006\225\006\225\006\225\004\138\004\138\"~\006\225\011.\027&\002*\002\002\006\225\011r\006\225\006\225%6%\002\003\190\006\225\006\225\006\225\006\225\000\242\0076\006\225\006\225\006\225\004\146\004\146\006\225\030\210\000\213\006\225\000\213\002e\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\028f\000\213\011\146\000\213\000\213\000\242\000\213\000\213\030\214\023\238\000\213\000\213\002\006\000\213\000\213\000\213\000\213\000\n\000\213%\234\000\213\000\213\b\161\011e\000\213\000\213\000\213\011e\000\213\000\213\000\213\002.\000\213\024\174\003\206\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\213 \n)\162\000\213\000\213\019\209\002e\000\213\000\213\000\213\003\210\000\213\000\213\000\213\000\213\000\213\000\213\019\209\000\213\000\213\000\213\000\213%\142\011\166\000\213\"\006\011e\000\213&\174\000\213\000\213\000\213\000\213\015R\000\213\004\249\015Z\017*!n\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\027*&\178\019\209\000\213\011e\002e\002e#\018\000\226\015b\011a\0172\000\213\017\006\011a\030\218\012N\025Z\030\234\000\213\000\213\000\213\000\213\011u\018\022\000\213\000\213\000\213\011\253\011\253\000\213\011\253\000\n\011\253\002^\028j\003r\011\253\019\209\003B\011\253\019\209\011\253\011e\007\198\011\253\005z\011\253\011\253\011\253!\166\011\253\011\253\011\253\001\250\t\253\011a\003.\007\202\011\253\011\253\011\253\011\253\011\253\002e\011\253\012R\012v\007\206\004\249\b\230)j\011\253\011\253\011\253\011\253\011\253\011\253\001\246\t&\001\201\014\190\011a\011\253!r\011\253\011\253\003b\012\238!\174\t.\014\166\011\253\011\253\011\253\014\170\014\174\014\186\004\018\b\177\001\201\011\253\t\190\011\253\011\253\011\253\011\253\011\253\011\253\011\253\011\253\011\253$\202\015R\t\214\t\218\015Z\017*\012\130\011\253\011\253\011a\b\157(F\005z\011\253\t\230\t\234\011\253\012\134\011\253\011\253\"\030\011\253\011\253\011\253\011\253\015b\022\242\0172\011\253\000\242\011\253\011\253(\182\011\253\011\253\011\253\011\253\011\253\011\253\011\253\t\238\014\194\011\253\011\253\011\253\014\218\003\238\011\253\011\253\001\218\025V\011\253\011\253\011\253\011\253\002\217\002\217!\018\002\217\002e\002\217\001\246\001\201\001.\002\217\003r%\190\002\217\002e\002\217\002e\002e\002\217)\138\002\217\002\217\002\217\000\242\002\217\002\217\002\217\001\222\017\006\001\201\012\174\000\n\002\217\002\217\002\217\002\217\002\217\001\201\002\217\018\022\000\n\001\226\012\234\000\n\002e\002\217\002\217\002\217\002\217\002\217\002\217\002e\004N\012\186\002e\016\142\002\217\002e\002\217\002\217\"&\007M\002e\002e&\238\002\217\002\217\002\217\011\230\003r\000\n\012\190\002e\002e\002\217\002e\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\007M\015R\002e\005\"\015Z\017*\007y\002\217\002\217(\166\002e(\186\"\018\002\217\001\246\000\242\002\217\002e\002\217\002\217\002e\002\217\002\217\002\217\002\217\015b\027\174\0172\002\217\b\242\002\217\002\217\001\250\002\217\002\217\002\217\002\217\002\217\002\217\002\217\014\026 v\002\217\002\217\002\217\002e!\134\002\217\002\217\r\022\027\178\002\217\002\217\002\217\002\217\011\213\011\213\027\222\011\213\003\182\011\213!\254\r\138\b\254\011\213\003b\011\026\011\213\"J\011\213\n\214\016\146\011\213\"\022\011\213\011\213\011\213\011v\011\213\011\213\011\213\027\226\030\246\011\130\r\030&\242\011\213\011\213\011\213\011\213\011\213!\214\011\213\rb\r\138\b\218\014\026\005\t\003r\011\213\011\213\011\213\011\213\011\213\011\213\bz\n2\014\006\b\206(\210\011\213\014n\011\213\011\213\031.\011\129\001\250\tz\t~\011\213\011\213\011\213\011\182(\222\t\138\rn\015V\000\242\011\213%>\011\213\011\213\011\213\011\213\011\213\011\213\011\213\011\213\011\213\014\006\015R\b\214\000\242\015Z\017*\028\222\011\213\011\213\003B\003b\rV\005\001\011\213\011q\000\242\011\213&.\011\213\011\213\000\242\011\213\011\213\011\213\011\213\015b\nA\0172\011\213\000\242\011\213\011\213\026\014\011\213\011\213\011\213\011\213\011\213\011\213\011\213\005\t\030\250\011\213\011\213\011\213\rN\nA\011\213\011\213\028\226\nA\011\213\011\213\011\213\011\213\003\001\003\001\000\242\003\001$\246\003\001\006\249&J\028\162\003\001\028\238\011\026\003\001\011b\003\001\n\214(\214\003\001\0312\003\001\003\001\003\001\011v\003\001\003\001\003\001$\250\028\170\011\130\b\201\019\153\003\001\003\001\003\001\003\001\003\001\020a\003\001!\210\005\001\015\214\012\197\t\234$\254\003\001\003\001\003\001\003\001\003\001\003\001\019\153\019\153\b\166\b\157\019\153\003\001\"&\003\001\003\001\b\201\020\234\b\201%\134!\218\003\001\003\001\003\001\011b\006\153\015\226\004\138'\254\015\250\003\001\nA\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\012\197\015R\020m\011y\015Z\017*\003\142\003\001\003\001\007\142\004\146\t\169\000\242\003\001\002v\015\254\003\001\003B\003\001\003\001(r\003\001\003\001\003\001\003\001\015b\012\197\0172\003\001\000\242\003\001\003\001\t\169\003\001\003\001\003\001\003\001\003\001\003\001\003\001\016\006\016\022\003\001\003\001\003\001(\234\016\014\003\001\003\001\019\153\016\"\003\001\003\001\003\001\003\001\002\253\002\253,\154\002\253\002\006\002\253\016N\012\197\b\254\002\253\007\154\006\153\002\253\005z\002\253*~\012\197\002\253\028\238\002\253\002\253\002\253\019\153\002\253\002\253\002\253)\026*\138)*\016Z\b\030\002\253\002\253\002\253\002\253\002\253\031\202\002\253\016\130\011b\t\005\012\193\b\"\b&\002\253\002\253\002\253\002\253\002\253\002\253\t\234\014\254\016\162\001\206\b*\002\253\011Q\002\253\002\253&\"\016\170*\202\025\202\027\002\002\253\002\253\002\253\027:\027r\027\130\015\246(v\016*\002\253\n%\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\012\193\015R\016\178\014\026\015Z\017*\016\202\002\253\002\253*j\n%\t\181(\238\002\253\n%\000\242\002\253&\130\002\253\002\253\n\029\002\253\002\253\002\253\002\253\015b\012\193\0172\002\253\004\018\002\253\002\253\t\181\002\253\002\253\002\253\002\253\002\253\002\253\002\253\n\029\r]\002\253\002\253\002\253\014\026\t\005\002\253\002\253\003r)\170\002\253\002\253\002\253\002\253\011\233\011\233%\130\011\233\006\225\011\233\016\242\012\193\004\018\011\233\r]\011\026\011\233\005z\011\233\n\214\012\193\011\233\017\018\011\233\011\233\011\233\011v\011\233\011\233\011\233\n%%\138\011\130\001\246\b2\011\233\011\233\011\233\011\233\011\233\017\026\011\233\017.\b\242\000\242*\134\b6\b:\011\233\011\233\011\233\011\233\011\233\011\233\r1\011q\017\006\025\222\b>\011\233\n\029\011\233\011\233+\026*n\017\150\000\242\018\022\011\233\011\233\011\233\001\221\014\182\028\246\017\214\004\138\rV\011\233*:\011\233\011\233\011\233\011\233\011\233\011\233\011\233\011\233\011\233-+\015R\000\242\001\221\015Z\017*\014\026\011\233\011\233+\030\rV\004\146\004m\011\233\003r\017\158\011\233\003B\011\233\011\233\000\242\011\233\011\233\011\233\011\233\015b\n\021\0172\011\233\004m\011\233\011\233+^\011\233\011\233\011\233\011\233\011\233\011\233\011\233!\014&\022\011\233\011\233\011\233\017\170\n\021\011\233\011\233\017\238\n\021\011\233\011\233\011\233\011\233\012\017\012\017 B\012\017!\030\012\017\017\246!2\025\246\012\017\001\193\003r\012\017\029\146\012\017\020\166+\018\012\017\028\238\012\017\012\017\012\017\001\221\012\017\012\017\012\017!\030\020\174\017\006\r1\001\193\012\017\012\017\012\017\012\017\012\017\003\190\012\017\020\254\018\022\004\018\021\026\017\006\001\221\012\017\012\017\012\017\012\017\012\017\012\017\t\234\001\221\021:\018\022\0176\012\017\b\242\012\017\012\017\021N\021n\001\221\021\134\004\018\012\017\012\017\012\017\001\229\030\130\021\150\024n\021\182\024z\012\017\n\021\012\017\012\017\012\017\012\017\012\017\012\017\012\017\012\017\012\017\021\194\015R\021\230\001\229\015Z\017*\021\234\012\017\012\017\t\162\022F\022^,\178\012\017\014j\022n\012\017\024V\012\017\012\017\001\193\012\017\012\017\012\017\012\017\015b\n1\0172\012\017\000\242\012\017\012\017\002e\012\017\012\017\012\017\012\017\012\017\012\017\012\017\024\210\001\193\012\017\012\017\012\017\024\242\n1\012\017\012\017\001\193\n1\012\017\012\017\012\017\012\017\002\221\002\221\025f\002\221\025\254\002\221\025n\000\n\028\194\002\221\028\234\t\134\002\221\028\222\002\221\029\n\003B\002\221\029\014\002\221\002\221\002\221\001\229\002\221\002\221\002\221\002e\029N\029n\029\170\030\134\002\221\002\221\002\221\002\221\002\221\029\186\002\221\029\202\002e\002e\029\222\017\006\001\229\002\221\002\221\002\221\002\221\002\221\002\221\030\n\001\229\030\022\018\022\030\174\002\221\028\226\002\221\002\221\027\138\030\182\001\229\031\222\031\226\002\221\002\221\002\221\001\213\006\145 \002 \022 \026\028\238\002\221\t\174\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\011\162\015R \222\001\213\015Z\017* \246\002\221\002\221!~!\130!\186!\190\002\221!\230!\234\002\221\"\002\002\221\002\221\t\234\002\221\002\221\002\221\002\221\015b\"\174\0172\002\221\000\242\002\221\002\221\"\178\002\221\002\221\002\221\002\221\002\221\002\221\002\221\"\214\"\218\002\221\002\221\002\221\"\234\"\250\002\221\002\221$\018\003r\002\221\002\221\002\221\002\221\0129\0129#\006\0129\015R\0129#B\015Z\017*\0129#F\006\145\0129#\174\0129#\222#\230\0129#\246\0129\0129\0129\001\213\0129\0129\0129$F$f\015b$\166\0172\0129\0129\0129\0129\0129$\210\0129\023\022\011b\b\242$\226\017\006\001\213\0129\0129\0129\0129\0129\0129%\n\001\213%\014\018\022\023>\0129\023f\0129\0129%\026%*\001\213%F%V\0129\0129\0129\001\253%j%\150%\154%\166\bI\0129\n\029\0129\0129\0129\0129\0129\0129\0129\0129\0129%\182\015R%\202\001\253\015Z\017*&\190\0129\0129'\022\n\029'>'\202\0129\n\029'\210\0129'\234\0129\0129'\246\0129\0129\0129\0129\015b(^\0172\0129(\158\0129\0129(\170\0129\0129\0129\0129\0129\0129\0129\bI(\174\0129\0129\0129)\018)\030\0129\0129)&)N\0129\0129\0129\0129\012%\012% \198\012%\bI\012%)b)\154)\206\012%)\242*\026\012%*V\012%*\170*\234\012%+>\012%\012%\012%\001\253\012%\012%\012%+~+\198,\014,>,^\012%\012%\012%\012%\012%,j\012%\014\182,\127,\143,\162\017\006\001\253\012%\012%\012%\012%\012%\012%,\190\001\253,\219\018\022,\235\012%-\007\012%\012%-[-w\001\253-\130-\215\012%\012%\012%\001\245-\235-\243./.7\000\000\012%\000\000\012%\012%\012%\012%\012%\012%\012%\012%\012%\000\000\015R\000\000\001\245\015Z\017*\000\000\012%\012%\000\000\000\000\000\000\000\000\012%\000\000\000\000\012%\000\000\012%\012%\000\000\012%\012%\012%\012%\015b\r1\0172\012%\025\222\012%\012%\000\000\012%\012%\012%\012%\012%\012%\012%\000\000\000\000\012%\012%\012%\000\000\017\214\012%\012%\r1\000\000\012%\012%\012%\012%\002\137\002\137\000\000\002\137\000\000\002\137\n\025\000\000\014v\002\137\000\000\000\000\002\137\000\000\002\137\000\000\000\000\002\137\000\000\002\137\002\137\002\137\001\245\002\137\002\137\002\137\n\025\000\000\000\000\014z\n\025\002\137\002\137\002\137\002\137\002\137\000\000\002\137\000\000\000\000\000\000\000\000\017\006\001\245\002\137\002\137\002\137\002\137\002\137\002\137\000\000\001\245\000\000\018\022\000\000\002\137\000\000\002\137\002\137\014j\000\000\001\245\000\000\000\000\002\137\002\137\002\137\001\237\025\246\000\000\000\000\000\000\000\242\002\137\000\242\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\000\000\002\137\000\000\001\237\017\006\002\137\000\000\002\137\002\137\000\000\000\000\000\000\000\000\002\137\000\000\018\022\002\137\000\000\002\137\002\137\000\000\002\137\002\137\002\137\002\137\n\025\000\000\000\000\002\137\000\000\002\137\002\137\000\000\017\006\002\137\002\137\002\137\002\137\002\137\002\137\000\000\000\000\002\137\002\137\018\022\000\000\014~\002\137\002\137\000\000\000\000\002\137\002\137\002\137\002\137\002\249\002\249\000\000\002\249\000\000\002\249\000\000\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\002\249\000\000\002\249\002\249\002\249\001\237\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\000\000\017\006\001\237\002\249\002\249\002\249\002\249\002\249\002\249\000\000\001\237\000\000\018\022\000\000\002\249\000\000\002\249\002\249\000\000\000\000\001\237\000\000\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\000\000\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\000\000\002\249\002e\002e\031Z\002\249\011q\002\249\002\249\011q\000\000\000\000\000\000\002\249\000\000\000\242\002\249\002e\002\249\002\249\000\000\002\249\002\249\002\249\002\249\000\000\000\000%>\002\249\000\n\002\249\002\249\026.\017\226\002\249\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\002\249\002\249\000\000\000\000\002\249\002\249\011q\000\000\002\249\002\249\002\249\002\249\011\209\011\209\000\000\011\209\000\000\011\209\002e\000\000\b\254\011\209\011q\011\026\011\209\000\000\011\209\n\214\000\000\011\209\000\000\011\209\011\209\011\209\011v\011\209\011\209\011\209\000\000\000\000\011\130\000\000\000\000\011\209\011\209\011\209\011\209\011\209\000\000\011\209\000\000\000\000\000\000\000\000\011q\000\000\011\209\011\209\011\209\011\209\011\209\011\209\000\000\014\254\000\000\027\190\000\000\011\209\000\000\011\209\011\209\000\000\000\000\000\000\025\202\027\002\011\209\011\209\011\209\027:\027r\027\130\000\000\011q\000\000\011\209\000\000\011\209\011\209\011\209\011\209\011\209\011\209\011\209\011\209\011\209\000\000\011\209\002e\002e \158\011\209\000\000\011\209\011\209\000\000\000\000\000\000\000\000\011\209\000\000\000\242\011\209\002e\011\209\011\209\000\000\011\209\011\209\011\209\011\209\000\000\000\000\000\000\011\209\000\n\011\209\011\209\026N\017\006\011\209\011\209\011\209\011\209\011\209\011\209\000\000\000\000\011\209\011\209\018\022\000\000\000\000\011\209\011\209\000\000\000\000\011\209\011\209\011\209\011\209\004M\004M\000\000\004M\000\000\004M\002e\000\000\000\000\004M\000\000\011\026\004M\000\000\004M\n\214\000\000\018:\000\000\004M\018\142\004M\011v\004M\004M\004M\000\000\000\000\011\130\000\000\019\161\018\162\019\002\019\026\018\186\0192\000\000\004M\000\000\000\000\000\000\000\000\000\000\000\000\004M\018\210\004M\019J\019b\004M\019\161\019\161\000\000\000\000\019\161\004M\000\000\019z\004M\000\000\000\000\000\000\000\000\000\000\004M\004M\000\242\007\198\000\000\000\000\000\000\000\000\000\000\004M\000\000\004M\004M\018R\018\234\019\146\019\170\020\n\004M\004M\n\022\004M\000\000\000\000\000\000\004M\000\000\004M\020\"\000\000\000\000\000\000\000\242\004M\000\000\n\026\004M\000\000\004M\020:\000\000\004M\004M\004M\004M\000\000\000\000\000\000\004M\000\000\004M\004M\000\000\020\154\004M\004M\020\210\019\194\004M\004M\000\000\t\190\004M\020R\004M\000\000\000\000\019\218\019\242\019\161\000\000\004M\004M\020j\020\130\003q\003q\000\000\003q\000\000\003q\000\000\000\000\000\000\003q\t\230\000\000\003q\000\000\003q\000\000\000\000\003q\000\000\003q\003q\003q\019\161\003q\003q\003q\000\000\000\000\000\000\000\000\019\157\003q\003q\003q\003q\003q\t\238\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\003q\019\157\019\157\000\000\000\000\019\157\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\000\000\003q\003q\003q\003q\003q\003q\003q\003q\003q\000\000\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\242\003q\000\000\000\000\003q\000\000\003q\003q\000\000\003q\003q\003q\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\017\006\003q\003q\003q\003q\003q\003q\000\000\000\000\003q\003q\018\022\000\000\000\000\003q\003q\019\157\000\000\003q\003q\003q\003q\003m\003m\000\000\003m\000\000\003m\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\000\000\000\000\003m\000\000\003m\003m\003m\019\157\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\003m\003m\003m\000\000\003m\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\003m\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\000\000\003m\000\000\003m\003m\018R\003m\003m\003m\003m\003m\003m\000\000\003m\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\003m\000\000\003m\003m\003m\003m\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\003m\003m\003m\003m\003m\003m\003m\000\000\000\000\003m\003m\003m\000\000\000\000\003m\003m\000\000\000\000\003m\003m\003m\003m\003A\003A\000\000\003A\000\000\003A\000\000\000\000\000\000\003A\000\000\000\000\003A\000\000\003A\000\000\000\000\003A\000\000\003A\003A\003A\000\000\003A\003A\003A\000\000\000\000\000\000\000\000\000\000\003A\003A\003A\003A\003A\000\000\003A\000\000\000\000\000\000\000\000\000\000\000\000\003A\003A\003A\003A\003A\003A\000\000\000\000\000\000\000\000\000\000\003A\000\000\003A\003A\000\000\000\000\000\000\000\000\000\000\003A\003A\003A\000\000\000\000\000\000\000\000\000\000\000\000\003A\000\000\003A\003A\003A\003A\003A\003A\003A\003A\003A\000\000\003A\000\000\000\000\000\000\003A\000\000\003A\003A\000\000\000\000\000\000\000\000\003A\000\000\000\000\003A\000\000\003A\003A\000\000\003A\003A\003A\003A\000\000\000\000\000\000\003A\000\000\003A\003A\000\000\017\006\003A\003A\003A\003A\003A\003A\000\000\000\000\003A\003A\018\022\000\000\000\000\003A\003A\000\000\000\000\003A\003A\003A\003A\003=\003=\000\000\003=\000\000\003=\000\000\000\000\000\000\003=\000\000\000\000\003=\000\000\003=\000\000\000\000\003=\000\000\003=\003=\003=\000\000\003=\003=\003=\000\000\000\000\000\000\000\000\000\000\003=\003=\003=\003=\003=\000\000\003=\000\000\000\000\000\000\000\000\000\000\000\000\003=\003=\003=\003=\003=\003=\000\000\000\000\000\000\000\000\000\000\003=\000\000\003=\003=\000\000\000\000\000\000\000\000\000\000\003=\003=\003=\000\000\000\000\000\000\000\000\000\000\000\000\003=\000\000\003=\003=\018R\003=\003=\003=\003=\003=\003=\000\000\003=\000\000\000\000\000\000\003=\000\000\003=\003=\000\000\000\000\000\000\000\000\003=\000\000\000\000\003=\000\000\003=\003=\000\000\003=\003=\003=\003=\000\000\000\000\000\000\003=\000\000\003=\003=\000\000\003=\003=\003=\003=\003=\003=\003=\000\000\000\000\003=\003=\003=\000\000\000\000\003=\003=\000\000\000\000\003=\003=\003=\003=\003Y\003Y\000\000\003Y\000\000\003Y\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\000\000\000\000\003Y\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\000\000\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\003Y\000\000\003Y\003Y\003Y\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\017\006\003Y\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\003Y\018\022\000\000\000\000\003Y\003Y\000\000\000\000\003Y\003Y\003Y\003Y\003U\003U\000\000\003U\000\000\003U\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\000\000\000\000\018:\000\000\003U\003U\003U\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\003U\018\186\003U\000\000\003U\000\000\000\000\000\000\000\000\000\000\000\000\003U\018\210\003U\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\000\000\003U\000\000\003U\003U\018R\018\234\003U\003U\003U\003U\003U\000\000\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\003U\000\000\003U\003U\003U\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\003U\003U\003U\003U\003U\003U\003U\000\000\000\000\003U\003U\003U\000\000\000\000\003U\003U\000\000\000\000\003U\003U\003U\003U\003y\003y\000\000\003y\000\000\003y\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\000\000\000\000\003y\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\000\000\003y\003y\003y\003y\003y\003y\003y\003y\003y\000\000\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\003y\000\000\003y\003y\003y\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\017\006\003y\003y\003y\003y\003y\003y\000\000\000\000\003y\003y\018\022\000\000\000\000\003y\003y\000\000\000\000\003y\003y\003y\003y\003u\003u\000\000\003u\000\000\003u\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\000\000\000\000\003u\000\000\003u\003u\003u\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\003u\003u\003u\000\000\003u\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\003u\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\000\000\003u\000\000\003u\003u\018R\003u\003u\003u\003u\003u\003u\000\000\003u\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\003u\000\000\003u\003u\003u\003u\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\003u\003u\003u\003u\003u\003u\003u\000\000\000\000\003u\003u\003u\000\000\000\000\003u\003u\000\000\000\000\003u\003u\003u\003u\0039\0039\000\000\0039\000\000\0039\000\000\000\000\000\000\0039\000\000\000\000\0039\000\000\0039\000\000\000\000\0039\000\000\0039\0039\0039\000\000\0039\0039\0039\000\000\000\000\000\000\000\000\000\000\0039\0039\0039\0039\0039\000\000\0039\000\000\000\000\000\000\000\000\000\000\000\000\0039\0039\0039\0039\0039\0039\000\000\000\000\000\000\000\000\000\000\0039\000\000\0039\0039\000\000\000\000\000\000\000\000\000\000\0039\0039\0039\000\000\000\000\000\000\000\000\000\000\000\000\0039\000\000\0039\0039\0039\0039\0039\0039\0039\0039\0039\000\000\0039\000\000\000\000\000\000\0039\000\000\0039\0039\000\000\000\000\000\000\000\000\0039\000\000\000\000\0039\000\000\0039\0039\000\000\0039\0039\0039\0039\000\000\000\000\000\000\0039\000\000\0039\0039\000\000\017\006\0039\0039\0039\0039\0039\0039\000\000\000\000\0039\0039\018\022\000\000\000\000\0039\0039\000\000\000\000\0039\0039\0039\0039\0035\0035\000\000\0035\000\000\0035\000\000\000\000\000\000\0035\000\000\000\000\0035\000\000\0035\000\000\000\000\0035\000\000\0035\0035\0035\000\000\0035\0035\0035\000\000\000\000\000\000\000\000\000\000\0035\0035\0035\0035\0035\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\0035\0035\0035\0035\0035\0035\000\000\000\000\000\000\000\000\000\000\0035\000\000\0035\0035\000\000\000\000\000\000\000\000\000\000\0035\0035\0035\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\0035\0035\018R\0035\0035\0035\0035\0035\0035\000\000\0035\000\000\000\000\000\000\0035\000\000\0035\0035\000\000\000\000\000\000\000\000\0035\000\000\000\000\0035\000\000\0035\0035\000\000\0035\0035\0035\0035\000\000\000\000\000\000\0035\000\000\0035\0035\000\000\0035\0035\0035\0035\0035\0035\0035\000\000\000\000\0035\0035\0035\000\000\000\000\0035\0035\000\000\000\000\0035\0035\0035\0035\0031\0031\000\000\0031\000\000\0031\000\000\000\000\000\000\0031\000\000\000\000\0031\000\000\0031\000\000\000\000\0031\000\000\0031\0031\0031\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\000\000\0031\0031\0031\0031\0031\0031\0031\0031\0031\000\000\0031\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\0031\000\000\000\000\0031\000\000\0031\0031\000\000\0031\0031\0031\0031\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\017\006\0031\0031\0031\0031\0031\0031\000\000\000\000\0031\0031\018\022\000\000\000\000\0031\0031\000\000\000\000\0031\0031\0031\0031\003-\003-\000\000\003-\000\000\003-\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\000\000\000\000\003-\000\000\003-\003-\003-\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003-\000\000\003-\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\000\000\003-\000\000\003-\003-\018R\003-\003-\003-\003-\003-\003-\000\000\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\003-\000\000\003-\003-\003-\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\003-\003-\003-\003-\003-\003-\003-\000\000\000\000\003-\003-\003-\000\000\000\000\003-\003-\000\000\000\000\003-\003-\003-\003-\003Q\003Q\000\000\003Q\000\000\003Q\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\000\000\000\000\003Q\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\000\000\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\003Q\000\000\003Q\003Q\003Q\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\017\006\003Q\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\003Q\018\022\000\000\000\000\003Q\003Q\000\000\000\000\003Q\003Q\003Q\003Q\003M\003M\000\000\003M\000\000\003M\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\000\000\000\000\018:\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\018\186\003M\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\018\210\003M\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\000\000\003M\003M\018R\018\234\003M\003M\003M\003M\003M\000\000\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\003M\000\000\003M\003M\003M\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\003M\003M\003M\003M\003M\003M\003M\000\000\000\000\003M\003M\003M\000\000\000\000\003M\003M\000\000\000\000\003M\003M\003M\003M\003I\003I\000\000\003I\000\000\003I\000\000\000\000\000\000\003I\000\000\000\000\003I\000\000\003I\000\000\000\000\003I\000\000\003I\003I\003I\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\003I\003I\000\000\003I\000\000\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\000\000\003I\000\000\003I\003I\003I\003I\003I\003I\003I\003I\003I\000\000\003I\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\000\000\000\000\000\000\003I\000\000\000\000\003I\000\000\003I\003I\000\000\003I\003I\003I\003I\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\017\006\003I\003I\003I\003I\003I\003I\000\000\000\000\003I\003I\018\022\000\000\000\000\003I\003I\000\000\000\000\003I\003I\003I\003I\003E\003E\000\000\003E\000\000\003E\000\000\000\000\000\000\003E\000\000\000\000\003E\000\000\003E\000\000\000\000\018:\000\000\003E\003E\003E\000\000\003E\003E\003E\000\000\000\000\000\000\000\000\000\000\003E\003E\003E\018\186\003E\000\000\003E\000\000\000\000\000\000\000\000\000\000\000\000\003E\018\210\003E\003E\003E\003E\000\000\000\000\000\000\000\000\000\000\003E\000\000\003E\003E\000\000\000\000\000\000\000\000\000\000\003E\003E\003E\000\000\000\000\000\000\000\000\000\000\000\000\003E\000\000\003E\003E\018R\018\234\003E\003E\003E\003E\003E\000\000\003E\000\000\000\000\000\000\003E\000\000\003E\003E\000\000\000\000\000\000\000\000\003E\000\000\000\000\003E\000\000\003E\003E\000\000\003E\003E\003E\003E\000\000\000\000\000\000\003E\000\000\003E\003E\000\000\003E\003E\003E\003E\003E\003E\003E\000\000\000\000\003E\003E\003E\000\000\000\000\003E\003E\000\000\000\000\003E\003E\003E\003E\003\153\003\153\000\000\003\153\000\000\003\153\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\000\000\000\000\003\153\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\000\000\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\003\153\000\000\003\153\003\153\003\153\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\017\006\003\153\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\003\153\018\022\000\000\000\000\003\153\003\153\000\000\000\000\003\153\003\153\003\153\003\153\003\149\003\149\000\000\003\149\000\000\003\149\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\000\000\000\000\018:\000\000\003\149\003\149\003\149\000\000\003\149\003\149\003\149\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\149\000\000\000\000\000\000\000\000\000\000\000\000\003\149\018\210\003\149\019J\019b\003\149\000\000\000\000\000\000\000\000\000\000\003\149\000\000\019z\003\149\000\000\000\000\000\000\000\000\000\000\003\149\003\149\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\149\000\000\003\149\003\149\018R\018\234\019\146\019\170\020\n\003\149\003\149\000\000\003\149\000\000\000\000\000\000\003\149\000\000\003\149\020\"\000\000\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\020:\000\000\003\149\003\149\003\149\003\149\000\000\000\000\000\000\003\149\000\000\003\149\003\149\000\000\003\149\003\149\003\149\003\149\019\194\003\149\003\149\000\000\000\000\003\149\020R\003\149\000\000\000\000\019\218\019\242\000\000\000\000\003\149\003\149\020j\020\130\003i\003i\000\000\003i\000\000\003i\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\000\000\000\000\003i\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\000\000\003i\003i\003i\003i\003i\003i\003i\003i\003i\000\000\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\003i\000\000\003i\003i\003i\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\017\006\003i\003i\003i\003i\003i\003i\000\000\000\000\003i\003i\018\022\000\000\000\000\003i\003i\000\000\000\000\003i\003i\003i\003i\003e\003e\000\000\003e\000\000\003e\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\000\000\000\000\018:\000\000\003e\003e\003e\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\003e\018\186\003e\000\000\003e\000\000\000\000\000\000\000\000\000\000\000\000\003e\018\210\003e\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\000\000\003e\000\000\003e\003e\018R\018\234\003e\003e\003e\003e\003e\000\000\003e\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\003e\000\000\003e\003e\003e\003e\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\003e\003e\003e\003e\003e\003e\003e\000\000\000\000\003e\003e\003e\000\000\000\000\003e\003e\000\000\000\000\003e\003e\003e\003e\003a\003a\000\000\003a\000\000\003a\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\000\000\000\000\003a\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\000\000\003a\003a\003a\003a\003a\003a\003a\003a\003a\000\000\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\003a\000\000\003a\003a\003a\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\017\006\003a\003a\003a\003a\003a\003a\000\000\000\000\003a\003a\018\022\000\000\000\000\003a\003a\000\000\000\000\003a\003a\003a\003a\003]\003]\000\000\003]\000\000\003]\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\000\000\000\000\018:\000\000\003]\003]\003]\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\018\186\003]\000\000\003]\000\000\000\000\000\000\000\000\000\000\000\000\003]\018\210\003]\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\000\000\003]\000\000\003]\003]\018R\018\234\003]\003]\003]\003]\003]\000\000\003]\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\003]\000\000\003]\003]\003]\003]\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\003]\003]\003]\003]\003]\003]\003]\000\000\000\000\003]\003]\003]\000\000\000\000\003]\003]\000\000\000\000\003]\003]\003]\003]\003\137\003\137\000\000\003\137\000\000\003\137\000\000\000\000\000\000\003\137\000\000\000\000\003\137\000\000\003\137\000\000\000\000\003\137\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\000\000\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\000\000\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\000\000\003\137\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\003\137\000\000\000\000\003\137\000\000\003\137\003\137\000\000\003\137\003\137\003\137\003\137\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\017\006\003\137\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\003\137\018\022\000\000\000\000\003\137\003\137\000\000\000\000\003\137\003\137\003\137\003\137\003\133\003\133\000\000\003\133\000\000\003\133\000\000\000\000\000\000\003\133\000\000\000\000\003\133\000\000\003\133\000\000\000\000\018:\000\000\003\133\003\133\003\133\000\000\003\133\003\133\003\133\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\133\000\000\003\133\000\000\000\000\000\000\000\000\000\000\000\000\003\133\018\210\003\133\019J\019b\003\133\000\000\000\000\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\000\000\000\000\000\000\000\000\003\133\003\133\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\133\000\000\003\133\003\133\018R\018\234\019\146\019\170\003\133\003\133\003\133\000\000\003\133\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\000\000\000\000\000\000\003\133\000\000\000\000\003\133\000\000\003\133\003\133\000\000\003\133\003\133\003\133\003\133\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\003\133\003\133\003\133\003\133\019\194\003\133\003\133\000\000\000\000\003\133\003\133\003\133\000\000\000\000\019\218\019\242\000\000\000\000\003\133\003\133\003\133\003\133\003)\003)\000\000\003)\000\000\003)\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\000\000\000\000\003)\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\000\000\003)\003)\003)\003)\003)\003)\003)\003)\003)\000\000\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\003)\000\000\003)\003)\003)\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\017\006\003)\003)\003)\003)\003)\003)\000\000\000\000\003)\003)\018\022\000\000\000\000\003)\003)\000\000\000\000\003)\003)\003)\003)\003%\003%\000\000\003%\000\000\003%\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\000\000\000\000\018:\000\000\003%\003%\003%\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\018\186\003%\000\000\003%\000\000\000\000\000\000\000\000\000\000\000\000\003%\018\210\003%\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\000\000\003%\000\000\003%\003%\018R\018\234\003%\003%\003%\003%\003%\000\000\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\003%\000\000\003%\003%\003%\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\003%\003%\003%\003%\003%\003%\003%\000\000\000\000\003%\003%\003%\000\000\000\000\003%\003%\000\000\000\000\003%\003%\003%\003%\003!\003!\000\000\003!\000\000\003!\000\000\000\000\000\000\003!\000\000\000\000\003!\000\000\003!\000\000\000\000\003!\000\000\003!\003!\003!\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\000\000\003!\003!\003!\003!\003!\003!\003!\003!\003!\000\000\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\003!\000\000\000\000\003!\000\000\003!\003!\000\000\003!\003!\003!\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\017\006\003!\003!\003!\003!\003!\003!\000\000\000\000\003!\003!\018\022\000\000\000\000\003!\003!\000\000\000\000\003!\003!\003!\003!\003\029\003\029\000\000\003\029\000\000\003\029\000\000\000\000\000\000\003\029\000\000\000\000\003\029\000\000\003\029\000\000\000\000\018:\000\000\003\029\003\029\003\029\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\029\000\000\003\029\000\000\000\000\000\000\000\000\000\000\000\000\003\029\018\210\003\029\019J\019b\003\029\000\000\000\000\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\029\000\000\003\029\003\029\018R\018\234\019\146\019\170\003\029\003\029\003\029\000\000\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\000\000\003\029\000\000\000\000\003\029\000\000\003\029\003\029\000\000\003\029\003\029\003\029\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\003\029\003\029\003\029\003\029\019\194\003\029\003\029\000\000\000\000\003\029\003\029\003\029\000\000\000\000\019\218\019\242\000\000\000\000\003\029\003\029\003\029\003\029\003\201\003\201\000\000\003\201\000\000\003\201\000\000\000\000\000\000\003\201\000\000\000\000\003\201\000\000\003\201\000\000\000\000\003\201\000\000\003\201\003\201\003\201\000\000\003\201\003\201\003\201\000\000\000\000\000\000\000\000\000\000\003\201\003\201\003\201\003\201\003\201\000\000\003\201\000\000\000\000\000\000\000\000\000\000\000\000\003\201\003\201\003\201\003\201\003\201\003\201\000\000\000\000\000\000\000\000\000\000\003\201\000\000\003\201\003\201\000\000\000\000\000\000\000\000\000\000\003\201\003\201\003\201\000\000\000\000\000\000\000\000\000\000\000\000\003\201\000\000\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\000\000\003\201\000\000\000\000\000\000\003\201\000\000\003\201\003\201\000\000\000\000\000\000\000\000\003\201\000\000\000\000\003\201\000\000\003\201\003\201\000\000\003\201\003\201\003\201\003\201\000\000\000\000\000\000\003\201\000\000\003\201\003\201\000\000\017\006\003\201\003\201\003\201\003\201\003\201\003\201\000\000\000\000\003\201\003\201\018\022\000\000\000\000\003\201\003\201\000\000\000\000\003\201\003\201\003\201\003\201\003\197\003\197\000\000\003\197\000\000\003\197\000\000\000\000\000\000\003\197\000\000\000\000\003\197\000\000\003\197\000\000\000\000\018:\000\000\003\197\003\197\003\197\000\000\003\197\003\197\003\197\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\197\000\000\003\197\000\000\000\000\000\000\000\000\000\000\000\000\003\197\018\210\003\197\019J\019b\003\197\000\000\000\000\000\000\000\000\000\000\003\197\000\000\003\197\003\197\000\000\000\000\000\000\000\000\000\000\003\197\003\197\003\197\000\000\000\000\000\000\000\000\000\000\000\000\003\197\000\000\003\197\003\197\018R\018\234\019\146\003\197\003\197\003\197\003\197\000\000\003\197\000\000\000\000\000\000\003\197\000\000\003\197\003\197\000\000\000\000\000\000\000\000\003\197\000\000\000\000\003\197\000\000\003\197\003\197\000\000\003\197\003\197\003\197\003\197\000\000\000\000\000\000\003\197\000\000\003\197\003\197\000\000\003\197\003\197\003\197\003\197\019\194\003\197\003\197\000\000\000\000\003\197\003\197\003\197\000\000\000\000\003\197\003\197\000\000\000\000\003\197\003\197\003\197\003\197\003\025\003\025\000\000\003\025\000\000\003\025\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\000\000\000\000\003\025\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\000\000\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\003\025\000\000\003\025\003\025\003\025\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\017\006\003\025\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\003\025\018\022\000\000\000\000\003\025\003\025\000\000\000\000\003\025\003\025\003\025\003\025\003\021\003\021\000\000\003\021\000\000\003\021\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\000\000\000\000\018:\000\000\003\021\003\021\003\021\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\021\000\000\003\021\000\000\000\000\000\000\000\000\000\000\000\000\003\021\018\210\003\021\019J\019b\003\021\000\000\000\000\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\021\000\000\003\021\003\021\018R\018\234\019\146\019\170\003\021\003\021\003\021\000\000\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\003\021\000\000\003\021\003\021\003\021\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\003\021\003\021\003\021\003\021\019\194\003\021\003\021\000\000\000\000\003\021\003\021\003\021\000\000\000\000\019\218\019\242\000\000\000\000\003\021\003\021\003\021\003\021\003\017\003\017\000\000\003\017\000\000\003\017\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\000\000\000\000\003\017\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\000\000\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\003\017\000\000\003\017\003\017\003\017\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\017\006\003\017\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\003\017\018\022\000\000\000\000\003\017\003\017\000\000\000\000\003\017\003\017\003\017\003\017\003\r\003\r\000\000\003\r\000\000\003\r\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\000\000\000\000\018:\000\000\003\r\003\r\003\r\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\r\000\000\003\r\000\000\000\000\000\000\000\000\000\000\000\000\003\r\018\210\003\r\019J\019b\003\r\000\000\000\000\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\r\000\000\003\r\003\r\018R\018\234\019\146\019\170\003\r\003\r\003\r\000\000\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\003\r\019\194\003\r\003\r\000\000\000\000\003\r\003\r\003\r\000\000\000\000\019\218\019\242\000\000\000\000\003\r\003\r\003\r\003\r\003\t\003\t\000\000\003\t\000\000\003\t\000\000\000\000\000\000\003\t\000\000\000\000\003\t\000\000\003\t\000\000\000\000\003\t\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\000\000\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\003\t\000\000\000\000\003\t\000\000\003\t\003\t\000\000\003\t\003\t\003\t\003\t\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\017\006\003\t\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\003\t\018\022\000\000\000\000\003\t\003\t\000\000\000\000\003\t\003\t\003\t\003\t\003\005\003\005\000\000\003\005\000\000\003\005\000\000\000\000\000\000\003\005\000\000\000\000\003\005\000\000\003\005\000\000\000\000\018:\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\005\000\000\003\005\000\000\000\000\000\000\000\000\000\000\000\000\003\005\018\210\003\005\019J\019b\003\005\000\000\000\000\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\000\000\003\005\003\005\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\005\000\000\003\005\003\005\018R\018\234\019\146\019\170\003\005\003\005\003\005\000\000\003\005\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\003\005\000\000\000\000\003\005\000\000\003\005\003\005\000\000\003\005\003\005\003\005\003\005\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\003\005\003\005\003\005\003\005\019\194\003\005\003\005\000\000\000\000\003\005\003\005\003\005\000\000\000\000\019\218\019\242\000\000\000\000\003\005\003\005\003\005\003\005\003\145\003\145\000\000\003\145\000\000\003\145\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\000\000\000\000\003\145\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\000\000\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\003\145\000\000\003\145\003\145\003\145\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\017\006\003\145\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\003\145\018\022\000\000\000\000\003\145\003\145\000\000\000\000\003\145\003\145\003\145\003\145\003\141\003\141\000\000\003\141\000\000\003\141\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\000\000\000\000\018:\000\000\003\141\003\141\003\141\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\141\000\000\003\141\000\000\000\000\000\000\000\000\000\000\000\000\003\141\018\210\003\141\019J\019b\003\141\000\000\000\000\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\000\000\000\000\000\000\000\000\003\141\003\141\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\141\000\000\003\141\003\141\018R\018\234\019\146\019\170\003\141\003\141\003\141\000\000\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\003\141\000\000\003\141\003\141\003\141\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\003\141\003\141\003\141\003\141\019\194\003\141\003\141\000\000\000\000\003\141\003\141\003\141\000\000\000\000\019\218\019\242\000\000\000\000\003\141\003\141\003\141\003\141\003\129\003\129\000\000\003\129\000\000\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\000\000\000\000\003\129\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\000\000\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\003\129\000\000\003\129\003\129\003\129\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\017\006\003\129\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\003\129\018\022\000\000\000\000\003\129\003\129\000\000\000\000\003\129\003\129\003\129\003\129\003}\003}\000\000\003}\000\000\003}\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\000\000\000\000\018:\000\000\003}\003}\003}\000\000\003}\003}\003}\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003}\000\000\003}\000\000\000\000\000\000\000\000\000\000\000\000\003}\018\210\003}\019J\019b\003}\000\000\000\000\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\000\000\000\000\000\000\000\000\003}\003}\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003}\000\000\003}\003}\018R\018\234\019\146\019\170\003}\003}\003}\000\000\003}\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\003}\000\000\003}\003}\003}\003}\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\003}\003}\003}\003}\019\194\003}\003}\000\000\000\000\003}\003}\003}\000\000\000\000\019\218\019\242\000\000\000\000\003}\003}\003}\003}\003\161\003\161\000\000\003\161\000\000\003\161\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\000\000\000\000\003\161\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\000\000\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\003\161\000\000\003\161\003\161\003\161\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\017\006\003\161\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\003\161\018\022\000\000\000\000\003\161\003\161\000\000\000\000\003\161\003\161\003\161\003\161\003\157\003\157\000\000\003\157\000\000\003\157\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\000\000\000\000\018:\000\000\003\157\003\157\003\157\000\000\003\157\003\157\003\157\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\157\000\000\000\000\000\000\000\000\000\000\000\000\003\157\018\210\003\157\019J\019b\003\157\000\000\000\000\000\000\000\000\000\000\003\157\000\000\019z\003\157\000\000\000\000\000\000\000\000\000\000\003\157\003\157\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\157\000\000\003\157\003\157\018R\018\234\019\146\019\170\020\n\003\157\003\157\000\000\003\157\000\000\000\000\000\000\003\157\000\000\003\157\020\"\000\000\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\020:\000\000\003\157\003\157\003\157\003\157\000\000\000\000\000\000\003\157\000\000\003\157\003\157\000\000\003\157\003\157\003\157\003\157\019\194\003\157\003\157\000\000\000\000\003\157\020R\003\157\000\000\000\000\019\218\019\242\000\000\000\000\003\157\003\157\020j\020\130\003\169\003\169\000\000\003\169\000\000\003\169\000\000\000\000\000\000\003\169\000\000\000\000\003\169\000\000\003\169\000\000\000\000\003\169\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\000\000\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\003\169\000\000\000\000\003\169\000\000\003\169\003\169\000\000\003\169\003\169\003\169\003\169\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\017\006\003\169\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\003\169\018\022\000\000\000\000\003\169\003\169\000\000\000\000\003\169\003\169\003\169\003\169\003\165\003\165\000\000\003\165\000\000\003\165\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\000\000\000\000\018:\000\000\003\165\003\165\003\165\000\000\003\165\003\165\003\165\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\165\000\000\003\165\000\000\000\000\000\000\000\000\000\000\000\000\003\165\018\210\003\165\019J\019b\003\165\000\000\000\000\000\000\000\000\000\000\003\165\000\000\019z\003\165\000\000\000\000\000\000\000\000\000\000\003\165\003\165\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\165\000\000\003\165\003\165\018R\018\234\019\146\019\170\020\n\003\165\003\165\000\000\003\165\000\000\000\000\000\000\003\165\000\000\003\165\020\"\000\000\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\020:\000\000\003\165\003\165\003\165\003\165\000\000\000\000\000\000\003\165\000\000\003\165\003\165\000\000\003\165\003\165\003\165\003\165\019\194\003\165\003\165\000\000\000\000\003\165\003\165\003\165\000\000\000\000\019\218\019\242\000\000\000\000\003\165\003\165\020j\020\130\003\177\003\177\000\000\003\177\000\000\003\177\000\000\000\000\000\000\003\177\000\000\000\000\003\177\000\000\003\177\000\000\000\000\003\177\000\000\003\177\003\177\003\177\000\000\003\177\003\177\003\177\000\000\000\000\000\000\000\000\000\000\003\177\003\177\003\177\003\177\003\177\000\000\003\177\000\000\000\000\000\000\000\000\000\000\000\000\003\177\003\177\003\177\003\177\003\177\003\177\000\000\000\000\000\000\000\000\000\000\003\177\000\000\003\177\003\177\000\000\000\000\000\000\000\000\000\000\003\177\003\177\003\177\000\000\000\000\000\000\000\000\000\000\000\000\003\177\000\000\003\177\003\177\003\177\003\177\003\177\003\177\003\177\003\177\003\177\000\000\003\177\000\000\000\000\000\000\003\177\000\000\003\177\003\177\000\000\000\000\000\000\000\000\003\177\000\000\000\000\003\177\000\000\003\177\003\177\000\000\003\177\003\177\003\177\003\177\000\000\000\000\000\000\003\177\000\000\003\177\003\177\000\000\017\006\003\177\003\177\003\177\003\177\003\177\003\177\000\000\000\000\003\177\003\177\018\022\000\000\000\000\003\177\003\177\000\000\000\000\003\177\003\177\003\177\003\177\003\173\003\173\000\000\003\173\000\000\003\173\000\000\000\000\000\000\003\173\000\000\000\000\003\173\000\000\003\173\000\000\000\000\018:\000\000\003\173\003\173\003\173\000\000\003\173\003\173\003\173\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\003\173\000\000\003\173\000\000\000\000\000\000\000\000\000\000\000\000\003\173\018\210\003\173\019J\019b\003\173\000\000\000\000\000\000\000\000\000\000\003\173\000\000\019z\003\173\000\000\000\000\000\000\000\000\000\000\003\173\003\173\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\173\000\000\003\173\003\173\018R\018\234\019\146\019\170\020\n\003\173\003\173\000\000\003\173\000\000\000\000\000\000\003\173\000\000\003\173\020\"\000\000\000\000\000\000\000\000\003\173\000\000\000\000\003\173\000\000\003\173\020:\000\000\003\173\003\173\003\173\003\173\000\000\000\000\000\000\003\173\000\000\003\173\003\173\000\000\003\173\003\173\003\173\003\173\019\194\003\173\003\173\000\000\000\000\003\173\003\173\003\173\000\000\000\000\019\218\019\242\000\000\000\000\003\173\003\173\020j\020\130\011\229\011\229\000\000\011\229\000\000\011\229\000\000\000\000\000\000\011\229\000\000\000\000\011\229\000\000\011\229\000\000\000\000\011\229\000\000\011\229\011\229\011\229\000\000\011\229\011\229\011\229\000\000\000\000\000\000\000\000\000\000\011\229\011\229\011\229\011\229\011\229\000\000\011\229\000\000\000\000\000\000\000\000\000\000\000\000\011\229\011\229\011\229\011\229\011\229\011\229\000\000\000\000\000\000\000\000\000\000\011\229\000\000\011\229\011\229\000\000\000\000\000\000\000\000\000\000\011\229\011\229\011\229\000\000\000\000\000\000\000\000\000\000\000\000\011\229\000\000\011\229\011\229\011\229\011\229\011\229\011\229\011\229\011\229\011\229\000\000\011\229\000\000\000\000\000\000\011\229\000\000\011\229\011\229\000\000\000\000\000\000\000\000\011\229\000\000\000\000\011\229\000\000\011\229\011\229\000\000\011\229\011\229\011\229\011\229\000\000\000\000\000\000\011\229\000\000\011\229\011\229\000\000\017\006\011\229\011\229\011\229\011\229\011\229\011\229\000\000\000\000\011\229\011\229\018\022\000\000\000\000\011\229\011\229\000\000\000\000\011\229\011\229\011\229\011\229\011\225\011\225\000\000\011\225\000\000\011\225\000\000\000\000\000\000\011\225\000\000\000\000\011\225\000\000\011\225\000\000\000\000\018:\000\000\011\225\011\225\011\225\000\000\011\225\011\225\011\225\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\011\225\000\000\000\000\000\000\000\000\000\000\000\000\011\225\018\210\011\225\019J\019b\011\225\000\000\000\000\000\000\000\000\000\000\011\225\000\000\019z\011\225\000\000\000\000\000\000\000\000\000\000\011\225\011\225\000\242\000\000\000\000\000\000\000\000\000\000\000\000\011\225\000\000\011\225\011\225\018R\018\234\019\146\019\170\020\n\011\225\011\225\000\000\011\225\000\000\000\000\000\000\011\225\000\000\011\225\020\"\000\000\000\000\000\000\000\000\011\225\000\000\000\000\011\225\000\000\011\225\020:\000\000\011\225\011\225\011\225\011\225\000\000\000\000\000\000\011\225\000\000\011\225\011\225\000\000\011\225\011\225\011\225\011\225\019\194\011\225\011\225\000\000\000\000\011\225\020R\011\225\000\000\000\000\019\218\019\242\000\000\000\000\011\225\011\225\020j\020\130\003\185\003\185\000\000\003\185\000\000\003\185\000\000\000\000\000\000\003\185\000\000\000\000\003\185\000\000\003\185\000\000\000\000\003\185\000\000\003\185\003\185\003\185\000\000\003\185\003\185\003\185\000\000\000\000\000\000\000\000\000\000\003\185\003\185\003\185\003\185\003\185\000\000\003\185\000\000\000\000\000\000\000\000\000\000\000\000\003\185\003\185\003\185\003\185\003\185\003\185\000\000\000\000\000\000\000\000\000\000\003\185\000\000\003\185\003\185\000\000\000\000\000\000\000\000\000\000\003\185\003\185\003\185\000\000\000\000\000\000\000\000\000\000\000\000\003\185\000\000\003\185\003\185\003\185\003\185\003\185\003\185\003\185\003\185\003\185\000\000\003\185\000\000\000\000\000\000\003\185\000\000\003\185\003\185\000\000\000\000\000\000\000\000\003\185\000\000\000\000\003\185\000\000\003\185\003\185\000\000\003\185\003\185\003\185\003\185\000\000\000\000\000\000\003\185\000\000\003\185\003\185\000\000\017\006\003\185\003\185\003\185\003\185\003\185\003\185\000\000\000\000\003\185\003\185\018\022\000\000\000\000\003\185\003\185\000\000\000\000\003\185\003\185\003\185\003\185\003\181\003\181\000\000\003\181\000\000\003\181\000\000\000\000\000\000\003\181\000\000\000\000\003\181\000\000\003\181\000\000\000\000\018:\000\000\003\181\003\181\003\181\000\000\003\181\003\181\003\181\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\181\000\000\000\000\000\000\000\000\000\000\000\000\003\181\018\210\003\181\019J\019b\003\181\000\000\000\000\000\000\000\000\000\000\003\181\000\000\019z\003\181\000\000\000\000\000\000\000\000\000\000\003\181\003\181\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\181\000\000\003\181\003\181\018R\018\234\019\146\019\170\020\n\003\181\003\181\000\000\003\181\000\000\000\000\000\000\003\181\000\000\003\181\020\"\000\000\000\000\000\000\000\000\003\181\000\000\000\000\003\181\000\000\003\181\020:\000\000\003\181\003\181\003\181\003\181\000\000\000\000\000\000\003\181\000\000\003\181\003\181\000\000\020\154\003\181\003\181\020\210\019\194\003\181\003\181\000\000\000\000\003\181\020R\003\181\000\000\000\000\019\218\019\242\000\000\000\000\003\181\003\181\020j\020\130\011\205\011\205\000\000\011\205\000\000\011\205\000\000\000\000\000\000\011\205\000\000\000\000\011\205\000\000\011\205\000\000\000\000\018:\000\000\011\205\011\205\011\205\000\000\011\205\011\205\011\205\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\011\205\000\000\000\000\000\000\000\000\000\000\000\000\011\205\018\210\011\205\019J\019b\011\205\000\000\000\000\000\000\000\000\000\000\011\205\000\000\019z\011\205\000\000\000\000\000\000\000\000\000\000\011\205\011\205\000\242\000\000\000\000\000\000\000\000\000\000\000\000\011\205\000\000\011\205\011\205\018R\018\234\019\146\019\170\020\n\011\205\011\205\000\000\011\205\000\000\000\000\000\000\011\205\000\000\011\205\020\"\000\000\000\000\000\000\000\000\011\205\000\000\000\000\011\205\000\000\011\205\020:\000\000\011\205\011\205\011\205\011\205\000\000\000\000\000\000\011\205\000\000\011\205\011\205\000\000\011\205\011\205\011\205\011\205\019\194\011\205\011\205\000\000\000\000\011\205\020R\011\205\000\000\000\000\019\218\019\242\000\000\000\000\011\205\011\205\020j\020\130\003\249\003\249\000\000\003\249\000\000\003\249\000\000\000\000\000\000\003\249\000\000\000\000\003\249\000\000\003\249\000\000\000\000\003\249\000\000\003\249\003\249\003\249\000\000\003\249\003\249\003\249\000\000\000\000\000\000\000\000\000\000\003\249\003\249\003\249\003\249\003\249\000\000\003\249\000\000\000\000\000\000\000\000\000\000\000\000\003\249\003\249\003\249\003\249\003\249\003\249\000\000\000\000\000\000\000\000\000\000\003\249\000\000\003\249\003\249\000\000\000\000\000\000\000\000\000\000\003\249\003\249\003\249\000\000\000\000\000\000\000\000\000\000\000\000\003\249\000\000\003\249\003\249\003\249\003\249\003\249\003\249\003\249\003\249\003\249\000\000\003\249\000\000\000\000\000\000\003\249\000\000\003\249\003\249\000\000\000\000\000\000\000\000\003\249\000\000\000\000\003\249\000\000\003\249\003\249\000\000\003\249\003\249\003\249\003\249\000\000\000\000\000\000\003\249\000\000\003\249\003\249\000\000\017\006\003\249\003\249\003\249\003\249\003\249\003\249\000\000\000\000\003\249\003\249\018\022\000\000\000\000\003\249\003\249\000\000\000\000\003\249\003\249\003\249\003\249\003\245\003\245\000\000\003\245\000\000\003\245\000\000\000\000\000\000\003\245\000\000\000\000\003\245\000\000\003\245\000\000\000\000\018:\000\000\003\245\003\245\003\245\000\000\003\245\003\245\003\245\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\245\000\000\000\000\000\000\000\000\000\000\000\000\003\245\018\210\003\245\019J\019b\003\245\000\000\000\000\000\000\000\000\000\000\003\245\000\000\019z\003\245\000\000\000\000\000\000\000\000\000\000\003\245\003\245\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\245\000\000\003\245\003\245\018R\018\234\019\146\019\170\020\n\003\245\003\245\000\000\003\245\000\000\000\000\000\000\003\245\000\000\003\245\020\"\000\000\000\000\000\000\000\000\003\245\000\000\000\000\003\245\000\000\003\245\020:\000\000\003\245\003\245\003\245\003\245\000\000\000\000\000\000\003\245\000\000\003\245\003\245\000\000\020\154\003\245\003\245\020\210\019\194\003\245\003\245\000\000\000\000\003\245\020R\003\245\000\000\000\000\019\218\019\242\000\000\000\000\003\245\003\245\020j\020\130\004\025\004\025\000\000\004\025\000\000\004\025\000\000\000\000\000\000\004\025\000\000\000\000\004\025\000\000\004\025\000\000\000\000\004\025\000\000\004\025\004\025\004\025\000\000\004\025\004\025\004\025\000\000\000\000\000\000\000\000\000\000\004\025\004\025\004\025\004\025\004\025\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\004\025\004\025\004\025\004\025\004\025\004\025\000\000\000\000\000\000\000\000\000\000\004\025\000\000\004\025\004\025\000\000\000\000\000\000\000\000\000\000\004\025\004\025\004\025\000\000\000\000\000\000\000\000\000\000\000\000\004\025\000\000\004\025\004\025\004\025\004\025\004\025\004\025\004\025\004\025\004\025\000\000\004\025\000\000\000\000\000\000\004\025\000\000\004\025\004\025\000\000\000\000\000\000\000\000\004\025\000\000\000\000\004\025\000\000\004\025\004\025\000\000\004\025\004\025\004\025\004\025\000\000\000\000\000\000\004\025\000\000\004\025\004\025\000\000\017\006\004\025\004\025\004\025\004\025\004\025\004\025\000\000\000\000\004\025\004\025\018\022\000\000\000\000\004\025\004\025\000\000\000\000\004\025\004\025\004\025\004\025\004\021\004\021\000\000\004\021\000\000\004\021\000\000\000\000\000\000\004\021\000\000\000\000\004\021\000\000\004\021\000\000\000\000\018:\000\000\004\021\004\021\004\021\000\000\004\021\004\021\004\021\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\004\021\000\000\000\000\000\000\000\000\000\000\000\000\004\021\018\210\004\021\019J\019b\004\021\000\000\000\000\000\000\000\000\000\000\004\021\000\000\019z\004\021\000\000\000\000\000\000\000\000\000\000\004\021\004\021\000\242\000\000\000\000\000\000\000\000\000\000\000\000\004\021\000\000\004\021\004\021\018R\018\234\019\146\019\170\020\n\004\021\004\021\000\000\004\021\000\000\000\000\000\000\004\021\000\000\004\021\020\"\000\000\000\000\000\000\000\000\004\021\000\000\000\000\004\021\000\000\004\021\020:\000\000\004\021\004\021\004\021\004\021\000\000\000\000\000\000\004\021\000\000\004\021\004\021\000\000\020\154\004\021\004\021\020\210\019\194\004\021\004\021\000\000\000\000\004\021\020R\004\021\000\000\000\000\019\218\019\242\000\000\000\000\004\021\004\021\020j\020\130\004\t\004\t\000\000\004\t\000\000\004\t\000\000\000\000\000\000\004\t\000\000\000\000\004\t\000\000\004\t\000\000\000\000\004\t\000\000\004\t\004\t\004\t\000\000\004\t\004\t\004\t\000\000\000\000\000\000\000\000\000\000\004\t\004\t\004\t\004\t\004\t\000\000\004\t\000\000\000\000\000\000\000\000\000\000\000\000\004\t\004\t\004\t\004\t\004\t\004\t\000\000\000\000\000\000\000\000\000\000\004\t\000\000\004\t\004\t\000\000\000\000\000\000\000\000\000\000\004\t\004\t\004\t\000\000\000\000\000\000\000\000\000\000\000\000\004\t\000\000\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\000\000\004\t\000\000\000\000\000\000\004\t\000\000\004\t\004\t\000\000\000\000\000\000\000\000\004\t\000\000\000\000\004\t\000\000\004\t\004\t\000\000\004\t\004\t\004\t\004\t\000\000\000\000\000\000\004\t\000\000\004\t\004\t\000\000\017\006\004\t\004\t\004\t\004\t\004\t\004\t\000\000\000\000\004\t\004\t\018\022\000\000\000\000\004\t\004\t\000\000\000\000\004\t\004\t\004\t\004\t\004\005\004\005\000\000\004\005\000\000\004\005\000\000\000\000\000\000\004\005\000\000\000\000\004\005\000\000\004\005\000\000\000\000\018:\000\000\004\005\004\005\004\005\000\000\004\005\004\005\004\005\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\004\005\000\000\000\000\000\000\000\000\000\000\000\000\004\005\018\210\004\005\019J\019b\004\005\000\000\000\000\000\000\000\000\000\000\004\005\000\000\019z\004\005\000\000\000\000\000\000\000\000\000\000\004\005\004\005\000\242\000\000\000\000\000\000\000\000\000\000\000\000\004\005\000\000\004\005\004\005\018R\018\234\019\146\019\170\020\n\004\005\004\005\000\000\004\005\000\000\000\000\000\000\004\005\000\000\004\005\020\"\000\000\000\000\000\000\000\000\004\005\000\000\000\000\004\005\000\000\004\005\020:\000\000\004\005\004\005\004\005\004\005\000\000\000\000\000\000\004\005\000\000\004\005\004\005\000\000\020\154\004\005\004\005\020\210\019\194\004\005\004\005\000\000\000\000\004\005\020R\004\005\000\000\000\000\019\218\019\242\000\000\000\000\004\005\004\005\020j\020\130\003\225\003\225\000\000\003\225\000\000\003\225\000\000\000\000\000\000\003\225\000\000\000\000\003\225\000\000\003\225\000\000\000\000\003\225\000\000\003\225\003\225\003\225\000\000\003\225\003\225\003\225\000\000\000\000\000\000\000\000\000\000\003\225\003\225\003\225\003\225\003\225\000\000\003\225\000\000\000\000\000\000\000\000\000\000\000\000\003\225\003\225\003\225\003\225\003\225\003\225\000\000\000\000\000\000\000\000\000\000\003\225\000\000\003\225\003\225\000\000\000\000\000\000\000\000\000\000\003\225\003\225\003\225\000\000\000\000\000\000\000\000\000\000\000\000\003\225\000\000\003\225\003\225\003\225\003\225\003\225\003\225\003\225\003\225\003\225\000\000\003\225\000\000\000\000\000\000\003\225\000\000\003\225\003\225\000\000\000\000\000\000\000\000\003\225\000\000\000\000\003\225\000\000\003\225\003\225\000\000\003\225\003\225\003\225\003\225\000\000\000\000\000\000\003\225\000\000\003\225\003\225\000\000\017\006\003\225\003\225\003\225\003\225\003\225\003\225\000\000\000\000\003\225\003\225\018\022\000\000\000\000\003\225\003\225\000\000\000\000\003\225\003\225\003\225\003\225\003\221\003\221\000\000\003\221\000\000\003\221\000\000\000\000\000\000\003\221\000\000\000\000\003\221\000\000\003\221\000\000\000\000\018:\000\000\003\221\003\221\003\221\000\000\003\221\003\221\003\221\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\221\000\000\000\000\000\000\000\000\000\000\000\000\003\221\018\210\003\221\019J\019b\003\221\000\000\000\000\000\000\000\000\000\000\003\221\000\000\019z\003\221\000\000\000\000\000\000\000\000\000\000\003\221\003\221\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\221\000\000\003\221\003\221\018R\018\234\019\146\019\170\020\n\003\221\003\221\000\000\003\221\000\000\000\000\000\000\003\221\000\000\003\221\020\"\000\000\000\000\000\000\000\000\003\221\000\000\000\000\003\221\000\000\003\221\020:\000\000\003\221\003\221\003\221\003\221\000\000\000\000\000\000\003\221\000\000\003\221\003\221\000\000\020\154\003\221\003\221\020\210\019\194\003\221\003\221\000\000\000\000\003\221\020R\003\221\000\000\000\000\019\218\019\242\000\000\000\000\003\221\003\221\020j\020\130\003\241\003\241\000\000\003\241\000\000\003\241\000\000\000\000\000\000\003\241\000\000\000\000\003\241\000\000\003\241\000\000\000\000\003\241\000\000\003\241\003\241\003\241\000\000\003\241\003\241\003\241\000\000\000\000\000\000\000\000\000\000\003\241\003\241\003\241\003\241\003\241\000\000\003\241\000\000\000\000\000\000\000\000\000\000\000\000\003\241\003\241\003\241\003\241\003\241\003\241\000\000\000\000\000\000\000\000\000\000\003\241\000\000\003\241\003\241\000\000\000\000\000\000\000\000\000\000\003\241\003\241\003\241\000\000\000\000\000\000\000\000\000\000\000\000\003\241\000\000\003\241\003\241\003\241\003\241\003\241\003\241\003\241\003\241\003\241\000\000\003\241\000\000\000\000\000\000\003\241\000\000\003\241\003\241\000\000\000\000\000\000\000\000\003\241\000\000\000\000\003\241\000\000\003\241\003\241\000\000\003\241\003\241\003\241\003\241\000\000\000\000\000\000\003\241\000\000\003\241\003\241\000\000\017\006\003\241\003\241\003\241\003\241\003\241\003\241\000\000\000\000\003\241\003\241\018\022\000\000\000\000\003\241\003\241\000\000\000\000\003\241\003\241\003\241\003\241\003\237\003\237\000\000\003\237\000\000\003\237\000\000\000\000\000\000\003\237\000\000\000\000\003\237\000\000\003\237\000\000\000\000\018:\000\000\003\237\003\237\003\237\000\000\003\237\003\237\003\237\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\237\000\000\000\000\000\000\000\000\000\000\000\000\003\237\018\210\003\237\019J\019b\003\237\000\000\000\000\000\000\000\000\000\000\003\237\000\000\019z\003\237\000\000\000\000\000\000\000\000\000\000\003\237\003\237\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\237\000\000\003\237\003\237\018R\018\234\019\146\019\170\020\n\003\237\003\237\000\000\003\237\000\000\000\000\000\000\003\237\000\000\003\237\020\"\000\000\000\000\000\000\000\000\003\237\000\000\000\000\003\237\000\000\003\237\020:\000\000\003\237\003\237\003\237\003\237\000\000\000\000\000\000\003\237\000\000\003\237\003\237\000\000\020\154\003\237\003\237\020\210\019\194\003\237\003\237\000\000\000\000\003\237\020R\003\237\000\000\000\000\019\218\019\242\000\000\000\000\003\237\003\237\020j\020\130\003\233\003\233\000\000\003\233\000\000\003\233\000\000\000\000\000\000\003\233\000\000\000\000\003\233\000\000\003\233\000\000\000\000\003\233\000\000\003\233\003\233\003\233\000\000\003\233\003\233\003\233\000\000\000\000\000\000\000\000\000\000\003\233\003\233\003\233\003\233\003\233\000\000\003\233\000\000\000\000\000\000\000\000\000\000\000\000\003\233\003\233\003\233\003\233\003\233\003\233\000\000\000\000\000\000\000\000\000\000\003\233\000\000\003\233\003\233\000\000\000\000\000\000\000\000\000\000\003\233\003\233\003\233\000\000\000\000\000\000\000\000\000\000\000\000\003\233\000\000\003\233\003\233\003\233\003\233\003\233\003\233\003\233\003\233\003\233\000\000\003\233\000\000\000\000\000\000\003\233\000\000\003\233\003\233\000\000\000\000\000\000\000\000\003\233\000\000\000\000\003\233\000\000\003\233\003\233\000\000\003\233\003\233\003\233\003\233\000\000\000\000\000\000\003\233\000\000\003\233\003\233\000\000\017\006\003\233\003\233\003\233\003\233\003\233\003\233\000\000\000\000\003\233\003\233\018\022\000\000\000\000\003\233\003\233\000\000\000\000\003\233\003\233\003\233\003\233\003\229\003\229\000\000\003\229\000\000\003\229\000\000\000\000\000\000\003\229\000\000\000\000\003\229\000\000\003\229\000\000\000\000\018:\000\000\003\229\003\229\003\229\000\000\003\229\003\229\003\229\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\229\000\000\000\000\000\000\000\000\000\000\000\000\003\229\018\210\003\229\019J\019b\003\229\000\000\000\000\000\000\000\000\000\000\003\229\000\000\019z\003\229\000\000\000\000\000\000\000\000\000\000\003\229\003\229\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\229\000\000\003\229\003\229\018R\018\234\019\146\019\170\020\n\003\229\003\229\000\000\003\229\000\000\000\000\000\000\003\229\000\000\003\229\020\"\000\000\000\000\000\000\000\000\003\229\000\000\000\000\003\229\000\000\003\229\020:\000\000\003\229\003\229\003\229\003\229\000\000\000\000\000\000\003\229\000\000\003\229\003\229\000\000\020\154\003\229\003\229\020\210\019\194\003\229\003\229\000\000\000\000\003\229\020R\003\229\000\000\000\000\019\218\019\242\000\000\000\000\003\229\003\229\020j\020\130\004\001\004\001\000\000\004\001\000\000\004\001\000\000\000\000\000\000\004\001\000\000\000\000\004\001\000\000\004\001\000\000\000\000\004\001\000\000\004\001\004\001\004\001\000\000\004\001\004\001\004\001\000\000\000\000\000\000\000\000\000\000\004\001\004\001\004\001\004\001\004\001\000\000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\004\001\004\001\004\001\004\001\004\001\004\001\000\000\000\000\000\000\000\000\000\000\004\001\000\000\004\001\004\001\000\000\000\000\000\000\000\000\000\000\004\001\004\001\004\001\000\000\000\000\000\000\000\000\000\000\000\000\004\001\000\000\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\000\000\004\001\000\000\000\000\000\000\004\001\000\000\004\001\004\001\000\000\000\000\000\000\000\000\004\001\000\000\000\000\004\001\000\000\004\001\004\001\000\000\004\001\004\001\004\001\004\001\000\000\000\000\000\000\004\001\000\000\004\001\004\001\000\000\017\006\004\001\004\001\004\001\004\001\004\001\004\001\000\000\000\000\004\001\004\001\018\022\000\000\000\000\004\001\004\001\000\000\000\000\004\001\004\001\004\001\004\001\003\253\003\253\000\000\003\253\000\000\003\253\000\000\000\000\000\000\003\253\000\000\000\000\003\253\000\000\003\253\000\000\000\000\018:\000\000\003\253\003\253\003\253\000\000\003\253\003\253\003\253\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\253\000\000\000\000\000\000\000\000\000\000\000\000\003\253\018\210\003\253\019J\019b\003\253\000\000\000\000\000\000\000\000\000\000\003\253\000\000\019z\003\253\000\000\000\000\000\000\000\000\000\000\003\253\003\253\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\253\000\000\003\253\003\253\018R\018\234\019\146\019\170\020\n\003\253\003\253\000\000\003\253\000\000\000\000\000\000\003\253\000\000\003\253\020\"\000\000\000\000\000\000\000\000\003\253\000\000\000\000\003\253\000\000\003\253\020:\000\000\003\253\003\253\003\253\003\253\000\000\000\000\000\000\003\253\000\000\003\253\003\253\000\000\020\154\003\253\003\253\020\210\019\194\003\253\003\253\000\000\000\000\003\253\020R\003\253\000\000\000\000\019\218\019\242\000\000\000\000\003\253\003\253\020j\020\130\004!\004!\000\000\004!\000\000\004!\000\000\000\000\000\000\004!\000\000\000\000\004!\000\000\004!\000\000\000\000\004!\000\000\004!\004!\004!\000\000\004!\004!\004!\000\000\000\000\000\000\000\000\000\000\004!\004!\004!\004!\004!\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\004!\004!\004!\004!\004!\004!\000\000\000\000\000\000\000\000\000\000\004!\000\000\004!\004!\000\000\000\000\000\000\000\000\000\000\004!\004!\004!\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\004!\004!\004!\004!\004!\004!\004!\004!\004!\000\000\004!\000\000\000\000\000\000\004!\000\000\004!\004!\000\000\000\000\000\000\000\000\004!\000\000\000\000\004!\000\000\004!\004!\000\000\004!\004!\004!\004!\000\000\000\000\000\000\004!\000\000\004!\004!\000\000\017\006\004!\004!\004!\004!\004!\004!\000\000\000\000\004!\004!\018\022\000\000\000\000\004!\004!\000\000\000\000\004!\004!\004!\004!\004\029\004\029\000\000\004\029\000\000\004\029\000\000\000\000\000\000\004\029\000\000\000\000\004\029\000\000\004\029\000\000\000\000\018:\000\000\004\029\004\029\004\029\000\000\004\029\004\029\004\029\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\004\029\000\000\000\000\000\000\000\000\000\000\000\000\004\029\018\210\004\029\019J\019b\004\029\000\000\000\000\000\000\000\000\000\000\004\029\000\000\019z\004\029\000\000\000\000\000\000\000\000\000\000\004\029\004\029\000\242\000\000\000\000\000\000\000\000\000\000\000\000\004\029\000\000\004\029\004\029\018R\018\234\019\146\019\170\020\n\004\029\004\029\000\000\004\029\000\000\000\000\000\000\004\029\000\000\004\029\020\"\000\000\000\000\000\000\000\000\004\029\000\000\000\000\004\029\000\000\004\029\020:\000\000\004\029\004\029\004\029\004\029\000\000\000\000\000\000\004\029\000\000\004\029\004\029\000\000\020\154\004\029\004\029\020\210\019\194\004\029\004\029\000\000\000\000\004\029\020R\004\029\000\000\000\000\019\218\019\242\000\000\000\000\004\029\004\029\020j\020\130\004\017\004\017\000\000\004\017\000\000\004\017\000\000\000\000\000\000\004\017\000\000\000\000\004\017\000\000\004\017\000\000\000\000\004\017\000\000\004\017\004\017\004\017\000\000\004\017\004\017\004\017\000\000\000\000\000\000\000\000\000\000\004\017\004\017\004\017\004\017\004\017\000\000\004\017\000\000\000\000\000\000\000\000\000\000\000\000\004\017\004\017\004\017\004\017\004\017\004\017\000\000\000\000\000\000\000\000\000\000\004\017\000\000\004\017\004\017\000\000\000\000\000\000\000\000\000\000\004\017\004\017\004\017\000\000\000\000\000\000\000\000\000\000\000\000\004\017\000\000\004\017\004\017\004\017\004\017\004\017\004\017\004\017\004\017\004\017\000\000\004\017\000\000\000\000\000\000\004\017\000\000\004\017\004\017\000\000\000\000\000\000\000\000\004\017\000\000\000\000\004\017\000\000\004\017\004\017\000\000\004\017\004\017\004\017\004\017\000\000\000\000\000\000\004\017\000\000\004\017\004\017\000\000\017\006\004\017\004\017\004\017\004\017\004\017\004\017\000\000\000\000\004\017\004\017\018\022\000\000\000\000\004\017\004\017\000\000\000\000\004\017\004\017\004\017\004\017\004\r\004\r\000\000\004\r\000\000\004\r\000\000\000\000\000\000\004\r\000\000\000\000\004\r\000\000\004\r\000\000\000\000\018:\000\000\004\r\004\r\004\r\000\000\004\r\004\r\004\r\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\004\r\000\000\000\000\000\000\000\000\000\000\000\000\004\r\018\210\004\r\019J\019b\004\r\000\000\000\000\000\000\000\000\000\000\004\r\000\000\019z\004\r\000\000\000\000\000\000\000\000\000\000\004\r\004\r\000\242\000\000\000\000\000\000\000\000\000\000\000\000\004\r\000\000\004\r\004\r\018R\018\234\019\146\019\170\020\n\004\r\004\r\000\000\004\r\000\000\000\000\000\000\004\r\000\000\004\r\020\"\000\000\000\000\000\000\000\000\004\r\000\000\000\000\004\r\000\000\004\r\020:\000\000\004\r\004\r\004\r\004\r\000\000\000\000\000\000\004\r\000\000\004\r\004\r\000\000\020\154\004\r\004\r\020\210\019\194\004\r\004\r\000\000\000\000\004\r\020R\004\r\000\000\000\000\019\218\019\242\000\000\000\000\004\r\004\r\020j\020\130\003\217\003\217\000\000\003\217\000\000\003\217\000\000\000\000\000\000\003\217\000\000\000\000\003\217\000\000\003\217\000\000\000\000\003\217\000\000\003\217\003\217\003\217\000\000\003\217\003\217\003\217\000\000\000\000\000\000\000\000\000\000\003\217\003\217\003\217\003\217\003\217\000\000\003\217\000\000\000\000\000\000\000\000\000\000\000\000\003\217\003\217\003\217\003\217\003\217\003\217\000\000\000\000\000\000\000\000\000\000\003\217\000\000\003\217\003\217\000\000\000\000\000\000\000\000\000\000\003\217\003\217\003\217\000\000\000\000\000\000\000\000\000\000\000\000\003\217\000\000\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\000\000\003\217\000\000\000\000\000\000\003\217\000\000\003\217\003\217\000\000\000\000\000\000\000\000\003\217\000\000\000\000\003\217\000\000\003\217\003\217\000\000\003\217\003\217\003\217\003\217\000\000\000\000\000\000\003\217\000\000\003\217\003\217\000\000\017\006\003\217\003\217\003\217\003\217\003\217\003\217\000\000\000\000\003\217\003\217\018\022\000\000\000\000\003\217\003\217\000\000\000\000\003\217\003\217\003\217\003\217\003\213\003\213\000\000\003\213\000\000\003\213\000\000\000\000\000\000\003\213\000\000\000\000\003\213\000\000\003\213\000\000\000\000\018:\000\000\003\213\003\213\003\213\000\000\003\213\003\213\003\213\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\213\000\000\000\000\000\000\000\000\000\000\000\000\003\213\018\210\003\213\019J\019b\003\213\000\000\000\000\000\000\000\000\000\000\003\213\000\000\019z\003\213\000\000\000\000\000\000\000\000\000\000\003\213\003\213\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\213\000\000\003\213\003\213\018R\018\234\019\146\019\170\020\n\003\213\003\213\000\000\003\213\000\000\000\000\000\000\003\213\000\000\003\213\020\"\000\000\000\000\000\000\000\000\003\213\000\000\000\000\003\213\000\000\003\213\020:\000\000\003\213\003\213\003\213\003\213\000\000\000\000\000\000\003\213\000\000\003\213\003\213\000\000\020\154\003\213\003\213\020\210\019\194\003\213\003\213\000\000\000\000\003\213\020R\003\213\000\000\000\000\019\218\019\242\000\000\000\000\003\213\003\213\020j\020\130\011\249\011\249\000\000\011\249\000\000\011\249\000\000\000\000\000\000\011\249\000\000\000\000\011\249\000\000\011\249\000\000\000\000\011\249\000\000\011\249\011\249\011\249\000\000\011\249\011\249\011\249\000\000\000\000\000\000\000\000\000\000\011\249\011\249\011\249\011\249\011\249\000\000\011\249\000\000\000\000\000\000\000\000\000\000\000\000\011\249\011\249\011\249\011\249\011\249\011\249\000\000\000\000\000\000\000\000\000\000\011\249\000\000\011\249\011\249\000\000\000\000\000\000\000\000\000\000\011\249\011\249\011\249\000\000\000\000\000\000\000\000\000\000\000\000\011\249\000\000\011\249\011\249\011\249\011\249\011\249\011\249\011\249\011\249\011\249\000\000\011\249\000\000\000\000\000\000\011\249\000\000\011\249\011\249\000\000\000\000\000\000\000\000\011\249\000\000\000\000\011\249\000\000\011\249\011\249\000\000\011\249\011\249\011\249\011\249\000\000\000\000\000\000\011\249\000\000\011\249\011\249\000\000\017\006\011\249\011\249\011\249\011\249\011\249\011\249\000\000\000\000\011\249\011\249\018\022\000\000\000\000\011\249\011\249\000\000\000\000\011\249\011\249\011\249\011\249\011\245\011\245\000\000\011\245\000\000\011\245\000\000\000\000\000\000\011\245\000\000\000\000\011\245\000\000\011\245\000\000\000\000\018:\000\000\011\245\011\245\011\245\000\000\011\245\011\245\011\245\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\011\245\000\000\000\000\000\000\000\000\000\000\000\000\011\245\018\210\011\245\019J\019b\011\245\000\000\000\000\000\000\000\000\000\000\011\245\000\000\019z\011\245\000\000\000\000\000\000\000\000\000\000\011\245\011\245\000\242\000\000\000\000\000\000\000\000\000\000\000\000\011\245\000\000\011\245\011\245\018R\018\234\019\146\019\170\020\n\011\245\011\245\000\000\011\245\000\000\000\000\000\000\011\245\000\000\011\245\020\"\000\000\000\000\000\000\000\000\011\245\000\000\000\000\011\245\000\000\011\245\020:\000\000\011\245\011\245\011\245\011\245\000\000\000\000\000\000\011\245\000\000\011\245\011\245\000\000\011\245\011\245\011\245\011\245\019\194\011\245\011\245\000\000\000\000\011\245\020R\011\245\000\000\000\000\019\218\019\242\000\000\000\000\011\245\011\245\020j\020\130\ri\ri\000\000\ri\000\000\ri\000\000\000\000\000\000\ri\000\000\000\000\ri\000\000\ri\000\000\000\000\ri\000\000\ri\ri\ri\000\000\ri\ri\ri\000\000\000\000\000\000\000\000\000\000\ri\ri\ri\ri\ri\000\000\ri\000\000\000\000\000\000\000\000\000\000\000\000\ri\ri\ri\ri\ri\ri\000\000\000\000\000\000\000\000\000\000\ri\000\000\ri\ri\000\000\000\000\000\000\000\000\000\000\ri\ri\ri\000\000\000\000\000\000\000\000\000\000\000\000\ri\000\000\ri\ri\ri\ri\ri\ri\ri\ri\ri\000\000\ri\000\000\000\000\000\000\ri\000\000\ri\ri\000\000\000\000\000\000\000\000\ri\000\000\000\000\ri\000\000\ri\ri\000\000\ri\ri\ri\ri\000\000\000\000\000\000\ri\000\000\ri\ri\000\000\017\006\ri\ri\ri\ri\ri\ri\000\000\000\000\ri\ri\018\022\000\000\000\000\ri\ri\000\000\000\000\ri\ri\ri\ri\002\197\002\197\000\000\002\197\000\000\002\197\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\000\000\000\000\002\197\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\000\000\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\000\000\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\000\000\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\002\197\000\000\002\197\002\197\025\006\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\017\006\002\197\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\002\197\018\022\000\000\000\000\002\197\002\197\000\000\000\000\002\197\002\197\002\197\002\197\002\189\002\189\000\000\002\189\000\000\002\189\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\002\189\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\000\000\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\000\000\002\189\002\189\002\189\002\189\002\189\002\189\002\189\002\189\002\189\000\000\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\002\189\000\000\002\189\002\189\002\189\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\017\006\002\189\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\002\189\018\022\000\000\000\000\002\189\002\189\000\000\000\000\002\189\002\189\002\189\002\189\002\185\002\185\000\000\002\185\000\000\002\185\000\000\000\000\000\000\002\185\000\000\000\000\002\185\000\000\002\185\000\000\000\000\018:\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\185\018\210\002\185\019J\019b\002\185\000\000\000\000\000\000\000\000\000\000\002\185\000\000\019z\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\185\002\185\018R\018\234\019\146\019\170\020\n\002\185\002\185\000\000\002\185\000\000\000\000\000\000\002\185\000\000\002\185\020\"\000\000\000\000\000\000\000\000\002\185\000\000\000\000\002\185\000\000\002\185\020:\000\000\002\185\002\185\002\185\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\020\154\002\185\002\185\020\210\019\194\002\185\002\185\000\000\000\000\002\185\020R\002\185\000\000\000\000\019\218\019\242\000\000\000\000\002\185\002\185\020j\020\130\002\193\002\193\000\000\002\193\000\000\002\193\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\000\000\000\000\018:\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\018\210\002\193\019J\019b\002\193\000\000\000\000\000\000\000\000\000\000\002\193\000\000\019z\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\193\000\000\002\193\002\193\018R\018\234\019\146\019\170\020\n\002\193\002\193\000\000\002\193\000\000\000\000\000\000\002\193\000\000\002\193\020\"\000\000\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\020:\000\000\002\193\002\193\025\"\002\193\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\020\154\002\193\002\193\020\210\019\194\002\193\002\193\000\000\000\000\002\193\020R\002\193\000\000\000\000\019\218\019\242\000\000\000\000\002\193\002\193\020j\020\130\002\181\002\181\000\000\002\181\000\000\002\181\000\000\000\000\000\000\002\181\000\000\000\000\002\181\000\000\002\181\000\000\000\000\002\181\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\000\000\002\181\000\000\002\181\002\181\002\181\002\181\002\181\002\181\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\002\181\000\000\000\000\002\181\000\000\002\181\002\181\000\000\002\181\002\181\002\181\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\017\006\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\002\181\018\022\000\000\000\000\002\181\002\181\000\000\000\000\002\181\002\181\002\181\002\181\002\177\002\177\000\000\002\177\000\000\002\177\000\000\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\018:\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\018\210\002\177\019J\019b\002\177\000\000\000\000\000\000\000\000\000\000\002\177\000\000\019z\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\177\000\000\002\177\002\177\018R\018\234\019\146\019\170\020\n\002\177\002\177\000\000\002\177\000\000\000\000\000\000\002\177\000\000\002\177\020\"\000\000\000\000\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\020:\000\000\002\177\002\177\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\020\154\002\177\002\177\020\210\019\194\002\177\002\177\000\000\000\000\002\177\020R\002\177\000\000\000\000\019\218\019\242\000\000\000\000\002\177\002\177\020j\020\130\012\r\012\r\000\000\012\r\000\000\012\r\000\000\000\000\000\000\012\r\000\000\000\000\012\r\000\000\012\r\000\000\000\000\012\r\000\000\012\r\012\r\012\r\000\000\012\r\012\r\012\r\000\000\000\000\000\000\000\000\000\000\012\r\012\r\012\r\012\r\012\r\000\000\012\r\000\000\000\000\000\000\000\000\000\000\000\000\012\r\012\r\012\r\012\r\012\r\012\r\000\000\000\000\000\000\000\000\000\000\012\r\000\000\012\r\012\r\000\000\000\000\000\000\000\000\000\000\012\r\012\r\012\r\000\000\000\000\000\000\000\000\000\000\000\000\012\r\000\000\012\r\012\r\012\r\012\r\012\r\012\r\012\r\012\r\012\r\000\000\012\r\000\000\000\000\000\000\012\r\000\000\012\r\012\r\000\000\000\000\000\000\000\000\012\r\000\000\000\000\012\r\000\000\012\r\012\r\000\000\012\r\012\r\012\r\012\r\000\000\000\000\000\000\012\r\000\000\012\r\012\r\000\000\017\006\012\r\012\r\012\r\012\r\012\r\012\r\000\000\000\000\012\r\012\r\018\022\000\000\000\000\012\r\012\r\000\000\000\000\012\r\012\r\012\r\012\r\012\t\012\t\000\000\012\t\000\000\012\t\000\000\000\000\000\000\012\t\000\000\000\000\012\t\000\000\012\t\000\000\000\000\018:\000\000\012\t\012\t\012\t\000\000\012\t\012\t\012\t\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\012\t\000\000\000\000\000\000\000\000\000\000\000\000\012\t\018\210\012\t\019J\019b\012\t\000\000\000\000\000\000\000\000\000\000\012\t\000\000\019z\012\t\000\000\000\000\000\000\000\000\000\000\012\t\012\t\000\242\000\000\000\000\000\000\000\000\000\000\000\000\012\t\000\000\012\t\012\t\018R\018\234\019\146\019\170\020\n\012\t\012\t\000\000\012\t\000\000\000\000\000\000\012\t\000\000\012\t\020\"\000\000\000\000\000\000\000\000\012\t\000\000\000\000\012\t\000\000\012\t\020:\000\000\012\t\012\t\012\t\012\t\000\000\000\000\000\000\012\t\000\000\012\t\012\t\000\000\012\t\012\t\012\t\012\t\019\194\012\t\012\t\000\000\000\000\012\t\020R\012\t\000\000\000\000\019\218\019\242\000\000\000\000\012\t\012\t\020j\020\130\003\209\003\209\000\000\003\209\000\000\003\209\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\003\209\000\000\000\000\003\209\000\000\003\209\003\209\003\209\000\000\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\003\209\003\209\000\000\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\000\000\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\000\000\003\209\003\209\003\209\003\209\003\209\003\209\003\209\003\209\003\209\000\000\003\209\000\000\000\000\000\000\003\209\000\000\003\209\003\209\000\000\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\003\209\003\209\000\000\003\209\003\209\003\209\003\209\000\000\000\000\000\000\003\209\000\000\003\209\003\209\000\000\017\006\003\209\003\209\003\209\003\209\003\209\003\209\000\000\000\000\003\209\003\209\018\022\000\000\000\000\003\209\003\209\000\000\000\000\003\209\003\209\003\209\003\209\003\205\003\205\000\000\003\205\000\000\003\205\000\000\000\000\000\000\003\205\000\000\000\000\003\205\000\000\003\205\000\000\000\000\018:\000\000\003\205\003\205\003\205\000\000\003\205\003\205\003\205\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\003\205\000\000\000\000\000\000\000\000\000\000\000\000\003\205\018\210\003\205\019J\019b\003\205\000\000\000\000\000\000\000\000\000\000\003\205\000\000\019z\003\205\000\000\000\000\000\000\000\000\000\000\003\205\003\205\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\205\000\000\003\205\003\205\018R\018\234\019\146\019\170\020\n\003\205\003\205\000\000\003\205\000\000\000\000\000\000\003\205\000\000\003\205\020\"\000\000\000\000\000\000\000\000\003\205\000\000\000\000\003\205\000\000\003\205\020:\000\000\003\205\003\205\003\205\003\205\000\000\000\000\000\000\003\205\000\000\003\205\003\205\000\000\020\154\003\205\003\205\020\210\019\194\003\205\003\205\000\000\000\000\003\205\020R\003\205\000\000\000\000\019\218\019\242\000\000\000\000\003\205\003\205\020j\020\130\002\165\002\165\000\000\002\165\000\000\002\165\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\000\000\000\000\002\165\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\002\165\002\165\002\165\002\165\002\165\002\165\002\165\000\000\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\002\165\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\002\165\018\022\000\000\000\000\002\165\002\165\000\000\000\000\002\165\002\165\002\165\002\165\0125\0125\000\000\0125\000\000\0125\000\000\000\000\000\000\0125\000\000\000\000\0125\000\000\0125\000\000\000\000\0125\000\000\0125\0125\0125\000\000\0125\0125\0125\000\000\000\000\000\000\000\000\000\000\0125\0125\0125\0125\0125\000\000\0125\000\000\000\000\000\000\000\000\000\000\000\000\0125\0125\0125\0125\0125\0125\000\000\000\000\000\000\000\000\000\000\0125\000\000\0125\0125\000\000\000\000\000\000\000\000\000\000\0125\0125\0125\000\000\000\000\000\000\000\000\000\000\000\000\0125\000\000\0125\0125\0125\0125\0125\0125\0125\0125\0125\000\000\0125\000\000\000\000\000\000\0125\000\000\0125\0125\000\000\000\000\000\000\000\000\0125\000\000\000\000\0125\000\000\0125\0125\000\000\0125\0125\0125\0125\000\000\000\000\000\000\0125\000\000\0125\0125\000\000\017\006\0125\0125\0125\0125\0125\0125\000\000\000\000\0125\0125\018\022\000\000\000\000\0125\0125\000\000\000\000\0125\0125\0125\0125\0121\0121\000\000\0121\000\000\0121\000\000\000\000\000\000\0121\000\000\000\000\0121\000\000\0121\000\000\000\000\018:\000\000\0121\0121\0121\000\000\0121\0121\0121\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\0121\000\000\000\000\000\000\000\000\000\000\000\000\0121\018\210\0121\019J\019b\0121\000\000\000\000\000\000\000\000\000\000\0121\000\000\019z\0121\000\000\000\000\000\000\000\000\000\000\0121\0121\000\242\000\000\000\000\000\000\000\000\000\000\000\000\0121\000\000\0121\0121\018R\018\234\019\146\019\170\020\n\0121\0121\000\000\0121\000\000\000\000\000\000\0121\000\000\0121\020\"\000\000\000\000\000\000\000\000\0121\000\000\000\000\0121\000\000\0121\020:\000\000\0121\0121\0121\0121\000\000\000\000\000\000\0121\000\000\0121\0121\000\000\0121\0121\0121\0121\019\194\0121\0121\000\000\000\000\0121\020R\0121\000\000\000\000\019\218\019\242\000\000\000\000\0121\0121\020j\020\130\012!\012!\000\000\012!\000\000\012!\000\000\000\000\000\000\012!\000\000\000\000\012!\000\000\012!\000\000\000\000\012!\000\000\012!\012!\012!\000\000\012!\012!\012!\000\000\000\000\000\000\000\000\000\000\012!\012!\012!\012!\012!\000\000\012!\000\000\000\000\000\000\000\000\000\000\000\000\012!\012!\012!\012!\012!\012!\000\000\000\000\000\000\000\000\000\000\012!\000\000\012!\012!\000\000\000\000\000\000\000\000\000\000\012!\012!\012!\000\000\000\000\000\000\000\000\000\000\000\000\012!\000\000\012!\012!\012!\012!\012!\012!\012!\012!\012!\000\000\012!\000\000\000\000\000\000\012!\000\000\012!\012!\000\000\000\000\000\000\000\000\012!\000\000\000\000\012!\000\000\012!\012!\000\000\012!\012!\012!\012!\000\000\000\000\000\000\012!\000\000\012!\012!\000\000\017\006\012!\012!\012!\012!\012!\012!\000\000\000\000\012!\012!\018\022\000\000\000\000\012!\012!\000\000\000\000\012!\012!\012!\012!\012\029\012\029\000\000\012\029\000\000\012\029\000\000\000\000\000\000\012\029\000\000\000\000\012\029\000\000\012\029\000\000\000\000\018:\000\000\012\029\012\029\012\029\000\000\012\029\012\029\012\029\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\012\029\000\000\000\000\000\000\000\000\000\000\000\000\012\029\018\210\012\029\019J\019b\012\029\000\000\000\000\000\000\000\000\000\000\012\029\000\000\019z\012\029\000\000\000\000\000\000\000\000\000\000\012\029\012\029\000\242\000\000\000\000\000\000\000\000\000\000\000\000\012\029\000\000\012\029\012\029\018R\018\234\019\146\019\170\020\n\012\029\012\029\000\000\012\029\000\000\000\000\000\000\012\029\000\000\012\029\020\"\000\000\000\000\000\000\000\000\012\029\000\000\000\000\012\029\000\000\012\029\020:\000\000\012\029\012\029\012\029\012\029\000\000\000\000\000\000\012\029\000\000\012\029\012\029\000\000\012\029\012\029\012\029\012\029\019\194\012\029\012\029\000\000\000\000\012\029\020R\012\029\000\000\000\000\019\218\019\242\000\000\000\000\012\029\012\029\020j\020\130\002\169\002\169\000\000\002\169\000\000\002\169\000\000\000\000\000\000\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\002\169\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\001\246\000\000\002\169\002\169\002\169\002\169\002\169\000\000\002\169+\158\000\000\000\000\000\000\000\000\002e\002\169\002\169\002\169\002\169\002\169\002\169\002e\000\000\000\000\002e\000\000\002\169\000\000\002\169\002\169\000\000\000\000\002e\000\000\000\000\002\169\002\169\002\169\019\145\000\000\000\n\000\000\000\000\000\000\002\169\004N\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\000\000\002\169\002e\000\000\000\000\002\169\000\000\002\169\002\169\000\000\002e\000\000\000\000\002\169\000\000\007\029\002\169\002e\002\169\002\169!\158\002\169\002\169\002\169\002\169\000\000\005\"\000\000\002\169\000\000\002\169\002\169\000\000\002\169\002\169\002\169\002\169\002\169\002\169\002\169\b\178\000\000\002\169\002\169\018\022\002e\000\000\002\169\002\169\011\018\000\000\002\169\002\169\002\169\002\169\001\n\000\000\000\006\000\000\000\000\000\000\003j\003n\003r!\202\003v\003B\000\000\003\130\019\145\011\022\007\198\001\014\031\186\000\000\000\000\003N\000\000\000\000\031\210\b\194\001\250\000\000\000\000\000\000\t*\001\022\015\006\015\n\001\"\001&!\246\000\000\b\226\000\000\007\206\000\000\b\230\000\000\030r\0012\000\000\015.\0152\000\000\t\026\t&\t2\t6\0156\r:\000\000\001B\000\000\003b\000\242\000\000\t.\014\166\000\000\000\000\007\029\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\"Z\000\000\001F\001J\001N\001R\001V\000\000\000\000\015j\000\000\t\214\t\218\001Z\000\000\000\000\000\000\001^\000\000\000\000\015v\015\142\017:\t\230\t\234\000\000\017N\000\000\001b\000\000\000\000\000\000\000\000\000\000\001f\000\000\011\026\000\000\000\000\001\246\n\214\011N\000\000\000\000\000\000\001\162\011\006\011v+\230\t\238\014\194\004\018\001\166\011\130\025\186\003\238\001\174\001\178\017R\001\n\001\182\000\006\001\186\001\190\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\001\014\019\145\000\000\000\000\015\002\000\000\000\000\000\000\004N\001\250\000\000\000\000\000\000\t*\001\022\015\006\015\n\001\"\001&\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\015\014\0012\000\000\015.\0152\000\000\t\026\t&\t2\t6\0156\r:\000\000\001B\000\000\003b\000\000\005\"\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\001F\001J\001N\001R\001V\000\000\000\000\015j\000\000\t\214\t\218\001Z\000\000\000\000\000\000\001^\000\000\000\000\015v\015\142\017:\t\230\t\234\000\000\017N\000\000\001b\019\145\000\000\000\000\000\000\000\000\001f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\162\011\162\000\000\000\000\t\238\014\194\000\000\001\166\019\217\025\186\003\238\001\174\001\178\017R\007\r\001\182\000\006\001\186\001\190\000\250\003j\003n\003r\b\130\003v\003B\000\000\003\130\019\217\000\000\007\198\002\150\028\222\b\174\002\154\003B\000\000\007\r\000\000\b\178\001\250\000\000\031\194\000\000\007\202\000\000\b\182\b\186\000\000\002\166\000\000\b\190\b\226$:\007\206\000\000\b\230\000\000\031V\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\031\186\003b\000\000\028\226\t.\014\166\031\210\000\000\002\178\014\170\014\174\014\186\014\206\015J\000\000\031\218\t\190\000\000\000\000\028\238\000\000$^\000\000\000\000\031\234\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015v\015\142\017:\t\230\t\234\031\242\017N .\000\000\000\000\007\r\007\r\000\000\000\000\t\234\000\000\011\018\000\000\000\000\015\138\000\000\002\182\000\000\000\000\000\000$j\002e j$\146\t\238\014\194!N\000\000\001\n\014\218\003\238\000\000\011\022\017R\001\218\007\222\003r\015\242#\254\003B\000\000\007\226\000\000\000\000\007\198\001\014\000\000\000\000\000\000\003N\000\000\000\n\000\000\000\000\001\250\000\000\000\000\024\218\001\018\001\022\001\026\bF\001\"\001&\000\000\000}\001\222\000\000\000\000\000\000\002e\000\000\bJ\0012\000}\0016\011\002\000\242\000}\bB\001\226\001\206\001>\002e\002e\001B\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n>\000\000\000\000\t\190\000}\000\000\001F\001J\001N\001R\001V\000}\002v\000\000\t\194\t\214\t\218\001Z\t\222\002z\000\000\001^\002\130\000\000\000}\rj\000\000\t\230\t\234\011\026\001\250\nz\001b\n\214\0166\000\000\000\000\000\000\001f\000\000\011v\000\000\000\000\000\000\004\018\000\000\011\130\000}\bj\001\162\011\006\000\000\000\000\t\238\000\000\rf\001\166\002\006\001\170\003\238\001\174\001\178\000\000\003b\001\182\000\006\001\186\001\190\000\250\003j\003n\003r\b\130\003v\003B\000}\003\130\000\000\000\000\007\198\002&\000\000\007-\000\000\000\000\000\000\000\000\000\000\b\178\001\250\000}\000\000\000}\007\202\000\000\b\182\b\186\000\000\rr\000\000\b\190\b\226\000\000\007\206\000\000\b\230\000\000\031V\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\031\186\003b\000\000\000\000\t.\014\166\031\210\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\031\218\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\234\000\000\015j-\138\t\214\t\218\000\000-\170\000\000\000\000\000\000\000\000\000\000\015v\015\142\017:\t\230\t\234\031\242\017N .\000\000\000\006-\203\027\202\000\250\003j\003n\003r\b\130\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000-\250\000\000$\146\t\238\014\194\000\000\b\178\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\b\190\b\226\000\000\007\206\000\000\b\230\000\000\031V\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\031\186\003b\001\242\001\246\t.\014\166\031\210\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\031\218\t\190\000\000\000\000\000\000\000\000\001\250\0022\000\000\031\234\000\000\015j-\138\t\214\t\218\000\000-\170\000\000\000\000\000\000\000\000\000\000\015v\015\142\017:\t\230\t\234\031\242\017N .\000\000\003V\0075)f\000\000\000\000\000\000\003R\000\000\003b\003\150\003\162\000\242\000\000\000\000\000\000\000\000\003\174\000\000\000\000$\146\t\238\014\194\000\000\001\n\000\000\014\218\003\238\000\000\026j\017R\007\222\003r\n\234\000\000\003B\000\000\007\226\000\000\003\178\007\198\001\014)\146\000\000\000\000\003N\000\000\000\000\000\000\026\130\001\250-g\000\000\000\000\001\018\001\022\001\026\bF\001\"\001&)~\000\000\000\000\011\026\000\000\000\000\000\000\n\214\bJ\0012\000\000\0016\011\002\000\000\011v\bB\000\000\001\206\001>\000\000\011\130\001B\000\000\003b\000\242\000\000\tz\t~\000\000\002e\000\000\t\130\000\000\t\138\t\178\n>\002e\000\000\t\190\002e\000\000\001F\001J\001N\001R\001V\000\000\002e\000\000\t\194\t\214\t\218\001Z\t\222\000\000\000\n\001^\000\000\000\000\000\000\000\000\006\r\t\230\t\234\000\000\002e\nz\001b\000\000\000\000\000\000\000\000\002e\001f\002e\006\r\000\000\000\000\000\000\012*\002e\000\000\001.\000\000\001\162\011\006\006\r\002e\t\238\000\000\002e\001\166\006\r\001\170\003\238\001\174\001\178\002e\000\229\001\182\002e\001\186\001\190\000\229\000\000\000\000\003r\000\229\002e\003B\000\000\017\142\000\000\000\000\007\198\002e\000\n\000\229\000\000\000\229\000\000\000\229\000\000\000\229\001\250\000\000\017\166\000\000\007\202\000\000\000\000\000\000\000\000\002e\017\174\000\229\000\000\000\000\007\206\000\000\b\230\002e\000\229\000\000\000\000\000\000\000\000\000\229\002e\t&\rB\001\206\000\000\000\229\000\000\000\000\000\229\003b\r1\000\000\t.\014\166\000\229\000\229\000\229\014\170\014\174\014\186\000\000\017\182\000\000\000\229\t\190\000\229\000\229\000\000\002e\000\000\017\214\r1\000\229\r1\r1\000\229\t\214\t\218\000\000\000\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\000\229\000y\000\229\000\000\000\000\000\229\000\229\011\018\000\000\000\000\000y\000\000\000\000\000\000\000y\000\229\000\000\000\000\000\000\000\000\012\165\000\000\000\229\000\229\t\238\014\194\000\000\000\000\011\022\014\218\003\238\000\000\000\253\000\000\000\229\000\000\000\229\000\253\000\000\000y\003r\000\253\000\000\003B\012\165\017\142\000y\000\000\007\198\000\000\000\000\000\253\000\000\000\253\000\000\000\253\000\000\000\253\001\250\000y\017\166\000\000\007\202\000\000\000\000\000\000\000\000\000\000\017\174\000\253\000\000\000\000\007\206\000\242\b\230\000\000\000\253\017\006\r1\000\000\000\000\000\253\000y\t&\000\000\001\206\r1\000\253\018\022\000\000\000\253\003b\000\000\000\000\t.\014\166\000\253\000\253\000\253\014\170\014\174\014\186\000\000\017\182\012\165\000\253\t\190\000\253\000\253\000\000\000y\000\000\000\000\000\000\000\253\002F\000\000\000\253\t\214\t\218\000\000\000\253\000\000\000\000\011\026\000y\000\000\000y\n\214\016j\t\230\t\234\000\253\000\000\000\253\011v\000\000\000\253\000\253\004\018\000\000\011\130\000\000\000\000\000\000\000\000\000\000\000\253\015q\000\000\000\000\000\000\000\000\000\000\000\253\000\253\t\238\014\194\000\000\000\000\000\000\014\218\003\238\000\000\006%\000\000\000\253\000\000\000\253\006%\000\000\007\222\003r\006%\000\000\003B\000\000\012\226\000\000\000\000\007\198\000\000\000\000\006%\000\000\015q\000\000\006%\000\000\006%\001\250\000\000\r&\028\222\000\000\000\000\003B\b\026\000\000\015q\015\154\006%\000\000\015q\021\162\000\000\000\000\000\000\006%\000\000\015q\000\000\b.\000\000\004\018\015\238\015q\001\206\000\000\006%\000\000\000\000\006%\003b\000\000\000\000\tz\t~\006%\006%\015m\t\130\000\000\t\138\000\000\016^\028\226\006%\t\190\000\000\011\174\000\000\000\000\000\000\000\000\000\000\006%\006%\000\000\t\194\t\214\t\218\028\238\t\222$>\000\000\000\000\000\000\000\000\000\000\000\000\011\178\t\230\t\234\006%\000\000\006%\021\002\000\000\006%\006%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015m\000\000\003\142\t\234\015m\021.\006%\t\238\000\000\000\000\000\000\015m\000\000\003\238$J\004\018\000\000\015m\000\000\006%\000\014\000\018\000\022\000\026\000\030\000\242\000\000\000\"\000&\000*\000.\0002#\254\0006\000:\000\000\000\000\000>\000\000\000\000\000\000\000B\000\000\000\000\000\000\001\218\002\"\001\246\000F\000\000\000\000\000\000\000\000\000\000\000J\000\000\000N\000\000\000R\000V\000Z\000^\000b\000f\000\000\001\250,B\002\014\000j\000n\000\000\000r\000v\000\000\000z\002\026\011\026\001\222\000\000\000\000\n\214\000\000\000\000\002j\000\000\000\000\000\000\011v\000\000\000~\002\030\001\226\002Z\011\130\000\130\000\134\003R\019\217\003b\003\150\003\162\000\138\000\142\000\146\000\000\000\000\003\174\000\000\000\000\000\000\000\000\000\000\000\000\000\150\000\154\000\158\000\162\019\217\000\166\000\170\002\150\000\174\000\000\002\154\000\000\000\178\000\182\000\186\003\178\000\000\000\000\000\190\000\000\000\194\000\198\000\000\000\000\000\000\002\166\000\000\000\000\002\174\000\202\019\193\000\206\000\000\000\000\000\000\rM\000\000\000\000\000\000\000\210\000\214\r5\000\218\000\006\000\000\000\000\000\250\003j\003n\003r\002\138\003v\003B\000\000\003\130\011\206\002\178\007\198\rM\000\000 n\000\000\r5\000\000\r5\r5\b\178\001\250\000\000\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000 r\b\226\000\000\007\206\000\000\b\230\000\000 \154\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\031\186\003b\000\242\000\000\t.\014\166\031\210\002\182\000\000\014\170\014\174\014\186\014\206\015J\000\000\031\218\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\234\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\198\015\142\017:\t\230\t\234\031\242\017N!:\000\000\000\000\007\001\000\000\000\000\000\000\000\000\000\000\011\026\rM\000\000\000\000\n\214\000\000\000\000\r5\000\000\rM\000\000\011v!J\t\238\014\194\r5\000\000\011\130\014\218\003\238\000\000\r-\017R\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\r-\000\000\r-\r-\000\000\001\250\000\000\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\002e\002e\017\198\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\000\000\000\000\002e\002e\002e\000\000\002e\002e\r-\002e\000\n\000\000\002e\002e\t\238\014\194\r-\002e\002e\014\218\003\238\n5\002e\017R\002e\000\n\002e\002e\002e\002e\000\n\000\n\002e\r>\002e\000\000\002e\000\000\002e\002e\028\146\n5\002e\002e\002e\n5\002e\002e\002e\002e\002e\002e\000\000\002e\002e\002e\000\000\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\000\000\000\000\002e\000\000\002e\002e\000\000\000\000\002e\002e\002e\000\000\002e\002e\002e\002e\000\000\002e\000\000\000\242\000\000\002e\002e\002e\002e\002e\002e\002e\000\000\002e\028\210\011\025\000\000\000\000\002e\002e\000\000\002e\000\000\000\000\000\000\000\000\000\000\r\197\002e\000\000\r\197\002e\000\000\000\000\r\197\r\197\002e\002e\r\197\000\000\r\197\002e\002e\r\197\000\000\002e\000\000\r\197\r\197\000\000\r\197\r\197\011\025\r\197\011\026\r\197\000\000\000\000\n\214\000\000\r\197\019\217\019\193\r\197\000\000\011v\011\025\000\000\000\000\000\000\n\214\011\130\000\000\r\197\000\000\r\197\000\000\011\025\r\197\000\000\r\197\019\217\000\000\011\025\002\150\000\000\r\197\002\154\000\000\r\197\r\197\000\000\000\000\r\197\r\197\002\162\r\197\000\000\r\197\000\000\000\000\r\197\002\166\r1\000\000\002\174\025\222\019\193\000\000\000\000\r\197\000\000\r\197\r\197\r\197\000\000\r\197\000\000\000\000\000\000\000\000\000\000\000\000\017\214\000\000\r\197\r\197\000\000\000\000\001M\r\197\000\000\r\197\002\178\001M\000\000\000\000\n\018\000\000\000\000\000\000\000\000\000\000\000\000\r\197\r\197\r\197\000\000\r\197\r\197\000\000\r\197\000\000\r\197\001M\r\197\t\173\r\197\000A\r\197\000\000\r\197\000A\000A\000A\000\000\000A\000A\000\000\000A\000\000\000\000\000A\000\000\000\000\000\000\000\000\t\173\001M\000\000!\142\000\000\000A\002\182\000\000\000\000\000A\001M\000A\000A\000\000\000\000\000\000\001M\000A\000\000\000A\000\000\000A\000\000\025\246\000\000\000\000\000A\000A\001M\000A\000A\000A\000A\000A\000A\000\000\000\000\000\000\000A\000\000\000\000\000A\000A\017\006\000\000\000\000\000A\000A\000A\000A\000A\000\000\r1\000A\018\022\000\000\000\000\000\000\001M\000\000\000y\000\000\000\000\000A\000\000\000A\000A\001M\000\000\000y\000\000\000\000\000\000\000y\000A\000A\000A\000A\000A\000\000\000A\t\169\000\000\000=\000\000\000\000\000\000\000=\000=\000=\000\000\000=\000=\000\000\000=\000\000\000\000\000=\000y\000\000\000\000\000\000\t\169\000A\000A\000y\000\000\000=\000A\000A\000\000\000=\000A\000=\000=\000\000\000\000\000\000\000y\000=\000\000\000=\000\000\000=\000\000\000\000\000\000\000\000\000=\000=\000\000\000=\000=\000=\000=\000=\000=\000\000\000\000\000\000\000=\000y\000\000\000=\000=\000\000\000\000\000\000\000=\000=\000=\000=\000=\000\000\000\000\000=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000=\000=\000y\000\000\000\000\000\000\000\000\029\162\000\000\000=\000=\000=\000=\000=\000\000\000=\t\185\000y\019=\000y\000\000\000\000\019=\019=\019=\000\000\019=\019=\000\000\019=\000\000\000\000\019=\000\000\000\000\000\000\000\000\t\185\000=\000=\000\000\000\000\019=\000=\000=\000\000\019=\000=\019=\019=\000\000\000\000\000\000\000\000\019=\000\000\019=\000\000\019=\000\000\000\000\000\000\000\000\019=\019=\000\000\019=\019=\019=\019=\019=\019=\000\000\000\000\000\000\019=\003r\000\000\019=\019=\000\000\000\000\000\000\019=\019=\019=\019=\019=\000\000\000\000\019=\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\019=\015m\019=\019=\000\000\000\000\000\000\000\000$\178\000\000\000\000\019=\019=\019=\019=\019=\000\000\019=\t\181%\242\0199\b\242\015m%\246\0199\0199\0199\003b\0199\0199\000\000\0199\000\000\000\000\0199&&\000\000\000\000\000\000\t\181\019=\019=\000\000\000\000\0199\019=\019=\000\000\0199\019=\0199\0199\000\000\000\000\000\000\000\000\0199\000\000\0199\000\000\0199\000\000\000\000\000\000&6\0199\0199\015m\0199\0199\0199\0199\0199\0199\000\000\000\000\000\000\0199\000\000\000\000\0199\0199\000\000\000\000\000\000\0199\0199\0199\0199\0199\000\000\000\000\0199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0199\000\000\0199\0199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0199\0199\0199\0199\0199\015m\0199\000\000\000\000\015m\015m\000\000\000\000\000\000\000\000\000\000\015m\000\000\000\000\000\000\004\018\000\000\015m\019\209\019\209\000\000\000\000\000\000\019\209\0199\0199\019\209\019\209\000\000\0199\0199\019\209\000\000\0199\019\209\019\209\000\000\019\209\019\209\019\209\000\000\019\209\019\209\019\209\000\000\019\209\019\209\019\209\000\000\019\209\019\209\019\209\000\000\000\000\019\209\019\209\000\000\019\209\019\209\000\000\000\000\000\000\019\209\019\209\019\209\000\000\019\209\019\209\019\209\019\209\019\209\019\209\019\209\019\209\019\209\019\209\019\209\000\000\000\000\019\209\000\000\019\209\019\209\019\209\019\209\000\000\019\209\000\000\000\000\000\000\019\209\019\209\019\209\019\209\019\209\019\209\000\000\000\000\019\209\019\209\019\209\019\209\019\209\002^\019\209\000\000\000\000\019\209\019\209\000\000\019\209\002^\000\000\019\209\019\209\019\209\000\000\000\000\019\209\000\000\019\209\019\209\019\209\019\209\019\209\019\209\019\209\000\000\019\209\019\209\000\000\019\209\019\209\019\209\002^\019\209\000\000\019\209\019\209\000\000\002b\019\209\000\000\019\209\000\000\019\209\019\209\000\000\005\026\019\209\019\209\019\209\019\209\000\000\019\209\019\209\000\000\019\209\019\209\000\000\019\209\000\000\019\209\019\209\019\209\000\000\019\209\000\000\019\209\019\209\000\000\005>\019\209\000\000\000\000\000\000\000\000\019\209\000\000\000\000\019\209\019\209\n)\019\209\000\006\019\209\019\209\n)\003j\003n\003r\n)\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\n)\000\000\000\000\000\000\n)\000\000\n)\001\250\000\000\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\n)\b\226\000\000\007\206\000\000\b\230\000\000\n)\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\n)\003b\000\000\000\000\t.\014\166\n)\n)\000\000\014\170\014\174\014\186\014\206\015J\000\000\n)\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n)\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030:\015\142\017:\t\230\t\234\n)\017N\n)\031j\000\000\n)\n)\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\030R\003\130 \174\000\000\007\198\n)\t\238\014\194\000\000\011\005\000\000\014\218\003\238\000\000\001\250\017R\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\011\005\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\011\005\000\000\t\190\000\000\011\005\015>\000\000\000\000\000\000\000\000\000\000\011\005\015j\000\000\t\214\t\218\000\000\011\005\000\000\000\000\000\000\000\000\000\000\028F\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\t\238\014\194\028^\000\000\t\134\014\218\003\238\001\250\000\000\017R\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\022\015\142\017:\t\230\t\234\000\000\017N\007\001\000\000\000\006\000\000\000\000\000\250\003j\003n\003r\002\138\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000 n\000\000\000\000\t\238\014\194\000\000\b\178\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000 r\b\226\000\000\007\206\000\000\b\230\000\000 \154\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\031\186\003b\000\000\000\000\t.\014\166\031\210\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\031\218\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\234\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\206\015\142\017:\t\230\t\234\031\242\017N!:\000\000\000\000\000\000\007\001\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\026\230\003\130\000\000\000\000\007\198!J\t\238\014\194\000\000\012]\000\000\014\218\003\238\000\000\001\250\017R\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\012]\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\012B\000\000\t\190\000\000\012]\000\000\000\000\000\000\000\000\000\000\000\000\012]\015j\000\000\t\214\t\218\000\000\012]\000\000\000\000\000\000\000\000\000\000\027\006\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\t\238\014\194\027\030\000\000\027>\014\218\003\238\001\250\000\000\017R\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\242\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\242\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\027B\015\142\017:\t\230\t\234\000\000\017N\000\000\005\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\205\019\145\019\145\000\000\012*\005\253\019\145\t\238\014\194\001\246\019\145\005\205\014\218\003\238\000\000\000\000\017R\005\205\005\018\005\253\019\145\019\145\019\145\012*\019\145\019\145\019\145\000\242\000\000\000\000\005\253\000\000\000\000\000\000\000\000\000\000\005\253\000\000\019\145\000\000\000\000\000\000\000\000\000\000\000\000\019\145\019\145\019\145\000\000\000\000\019\145\000\000\000\000\000\000\004N\000\000\019\145\000\000\000\000\019\145\000\000\000\000\000\000\000\000\005\237\019\145\019\145\019\145\019\217\019\193\000\000\000\000\000\000\000\000\019\145\000\000\019\145\019\145\005\237\000\000\000\000\000\000\012*\019\145\000\000\000\000\019\145\000\000\019\217\005\237\005\"\002\150\000\000\019\145\002\154\005\237\000\000\000\000\000\000\000\000\006\249\019\145\b\142\019\145\019\145\006\249\019\145\019\145\000\000\002\166\000\000\000\000\002\174\000\000\019\193\000\000\019\145\000\000\019\145\000\000\019\145\019\145\r\r\r\r\019\145\006\249\000\000\r\r\000\000\019\145\001\246\r\r\019\145\019\145\000\000\019\145\000\000\019\145\019\145\r\r\002\178\r\r\r\r\r\r\000\000\r\r\r\r\r\r\000\242\006\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\249\r\r\000\000\000\000\000\000\000\000\006\249\b\166\r\r\r\r\r\r\000\000\000\000\r\r\000\000\000\000\000\000\004N\006\249\r\r\000\000\000\000\r\r\000\000\000\000\000\000\000\000\017J\r\r\r\r\r\r\000\000\002\182\000\000\000\000\000\000\000\000\r\r\000\000\r\r\r\r\011\026\000\000\000\000\000\000\n\214\r\r\000\000\006\249\r\r\000\000\000\000\011v\005\"\000\000\000\000\r\r\006\249\011\130\000\000\000\000\000\000\000\000\000\000\r\r\000\000\r\r\r\r\000\000\r\r\r\r\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\r\r\000\000\r\r\006\137\r\r\r\r\r\021\r\021\r\r\000\000\000\000\r\021\000\000\r\r\001\246\r\021\r\r\r\r\000\000\r\r\000\000\r\r\r\r\r\021\000\000\r\021\r\021\r\021\000\000\r\021\r\021\r\021\000\242\000\000\000\000\021\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\021\000\000\000\000\000\000\000\000\000\242\021\214\r\021\r\021\r\021\012*\000\000\r\021\000\000\000\000\000\000\004N\022\n\r\021\000\000\000\000\r\021\000\000\022\022\000\000\000\000\005\221\r\021\r\021\r\021\000\000\000\000\000\000\000\000\000\000\000\000\r\021\000\000\r\021\r\021\005\221\000\000\006\137\000\000\012*\r\021\000\000\000\000\r\021\000\000\000\000\005\221\005\"\000\000\000\000\r\021\011\026\005\221\000\000\000\000\n\214\015\170\000\000\r\021\000\000\r\021\r\021\011v\r\021\r\021\000\000\004\018\000\000\011\130\000\000\000\000\000\242\000\000\r\021\000\000\r\021\000\000\r\021\r\021\r\017\r\017\r\021\000\000\000\000\r\017\000\000\r\021\001\246\r\017\r\021\r\021\000\000\r\021\000\000\r\021\r\021\r\017\000\000\r\017\r\017\r\017\000\000\r\017\r\017\r\017\000\242\000\000\000\000\0111\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\017\000\000\000\000\000\000\000\000\000\000\011\026\r\017\r\017\r\017\n\214\000\000\r\017\000\000\000\000\000\000\004N\0111\r\017\000\000\000\000\r\017\000\000\0111\000\000\000\000\025\154\r\017\r\017\r\017\000\000\000\000\000\000\000\000\000\000\000\000\r\017\000\000\r\017\r\017\021\214\000\000\000\000\000\000\012*\r\017\000\000\000\000\r\017\000\000\000\000\022\n\005\"\000\000\000\000\r\017\000\000\022\022\000\000\000\000\000\000\000\000\000\000\r\017\000\000\r\017\r\017\000\000\r\017\r\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\017\000\000\r\017\000\000\r\017\r\017\r\t\r\t\r\017\000\000\000\000\r\t\000\000\r\017\001\246\r\t\r\017\r\017\000\000\r\017\000\000\r\017\r\017\r\t\000\000\r\t\r\t\r\t\000\000\r\t\r\t\r\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\t\000\000\000\000\000\000\000\000\000\000\000\000\r\t\r\t\r\t\000\000\000\000\r\t\000\000\000\000\000\000\004N\000\000\r\t\000\000\000\000\r\t\000\000\000\000\000\000\000\000\000\000\r\t\r\t\r\t\000\000\000\000\000\000\000\000\000\000\000\000\r\t\000\000\r\t\r\t\000\000\000\000\000\000\000\000\000\000\r\t\000\000\000\000\r\t\000\000\000\000\000\000\005\"\000\000\000\000\r\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\t\000\000\r\t\r\t\000\000\r\t\r\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\t\000\000\r\t\000\000\r\t\r\t\000\000\000\000\r\t\000\000\000\000\000\000\000\000\r\t\000\000\000\000\r\t\r\t\001\169\r\t\000\006\r\t\r\t\001\169\003j\003n\003r\001\169\003v\003B\000\000\007\174\000\000\000\000\007\198\000\000\000\000\001\169\000\000\001\169\000\000\001\169\000\000\001\169\001\250\000\000\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\001\169\b\226\000\000\007\206\000\000\b\230\000\000\001\169\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\001\169\003b\000\000\000\000\t.\014\166\001\169\001\169\000\242\014\170\014\174\014\186\014\206(\242\000\000\001\169\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\169\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\250\015\142\017:\t\230\t\234\001\169\017N\001\169\001\169\000\006\001\169\001\169\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\001\169\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\001\169\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\194\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\001\242\001\246\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\001\250\0022\002\014\000\000\000\000\015j\000\000\t\214\t\218\000\000\002\026\000\000\000\000\000\000!\134\000\000\030\"\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\003V\000\000\"\222\000\000!\254\000\000\003R\000\000\003b\003\150\003\162\015\145\000\000\000\000\015\145\000\000\"\238\001\218\007\222\003r\t\238\014\194\003B\000\000\007\226\014\218\003\238\007\198\000\000\017R\000\000\015\145\015\145\000\000\015\145\015\145\000\000\001\250\003\178\000\000\000\000\000\000\000\000\006\249\b\026\000\000\000\000\000\000\006\249\001\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\145\000\000\b.\000\000\000\000\bB\001\226\001\206\000\000\000\000\000\000\006\249\000\000\003b\001\242\001\246\tz\t~\000\000\000\000\015\145\t\130\000\000\t\138\t\178\n>\000\000\000\000\t\190\000\000\000\000\000\000\000\000\001\250\0022\006\249\000\000\015\145\000\000\t\194\t\214\t\218\000\000\t\222\006\249\000\000\000\000\000\000\000\000\000\000\006\249\b\166\t\230\t\234\000\000\000\000\nz\015\145\003V\015\145)f\006\249\006\249\000\000\003R\000\000\003b\003\150\003\162\000\000\000\000\015\145\015\145\000\000\003\174\015\145\015\145\000\000\t\238\000\000\015\145\000\000\015\145\000\000\003\238\000\000\015\145\015\141\015\145\000\000\015\141\000\000\006\249\000\000\007\222\003r\003\178\000\000\003B\007m\007\226\006\249\000\000\007\198\000\000\000\000\000\000\015\141\015\141\000\000\015\141\015\141\000\000\001\250\000\000\000\000\015\")~\000\000\000\000\b\026\000\000\000\000\000\000\002v\000\000\000\000\000\000\000\000\000\000\000\000\002z\000\000\015\141\002\130\b.\000\000\000\000\n\230\000\000\001\206\000\000\001\250\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\015\141\t\130\000\000\t\138\t\178\n>\000\000\bj\t\190\000\000\000\000\000\000\000\000\000\000\rf\000\000\002\006\015\141\000\000\t\194\t\214\t\218\003b\t\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\000\000\000\000\nz\015\141\000\000\015\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\141\015\141\000\000\000\000\015\141\015\141\rr\t\238\000\000\015\141\000\000\015\141\000\000\003\238\000\006\015\141\000\000\015\141\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\027\230\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\246\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\017\n\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\017\"\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\182\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017v\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\017\230\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\017\254\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\006\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018>\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018V\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018z\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\166\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\190\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\214\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\238\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\006\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\030\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0196\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019N\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019f\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019~\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\150\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\174\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\198\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\222\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\246\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\014\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020&\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020>\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020V\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020n\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\134\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\020\158\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\020\182\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\190\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\214\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\174\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\214\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\254\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023*\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023R\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023z\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\170\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\210\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\250\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\022\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\246\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\n\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025&\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\025^\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\025v\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025~\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\226\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\018\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0262\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026R\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026n\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\134\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\006\000\000\000\000\000\000\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\000\000\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\154\015\142\017:\t\230\t\234\000\000\017N\n\005\000\000\000\006\000\000\000\000\n\005\003j\003n\003r\000\000\003v\003B\000\000\003\130\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\t\238\014\194\000\000\n\005\001\250\014\218\003\238\000\000\007\202\017R\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\n\005\t\026\t&\t2\t6\t>\r:\000\000\000\000\n\005\003b\000\000\000\000\t.\014\166\n\005\n\005\000\242\014\170\014\174\014\186\014\206\015J\000\000\000\000\t\190\n\005\n\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\182\015\142\017:\t\230\t\234\000\000\017N\000\000\000\000\000\000\000\000\n\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\005\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\205\t\238\014\194\000\205\000\205\000\000\014\218\003\238\000\000\000\000\017R&\186\000\205\000\000\000\205\000\205\000\205\000\000\000\205\000\205\000\205\000\000\012\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\000\000\205\000\000\000\205\000\000\000\000\000\205\000\000\012\169\000\000\000\205\000\000\000\205\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\205\000\205\000\205\000\000\000\000\000\000\000\000\000\000\000\000\000\205\000\000\000\205\000\205\000\000\000\000\000\000\000\000\000\000\000\205\000\205\000\000\000\205\000\000\000\000\000\000\000\205\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\205\000\000\000\205\000\205\000\000\000\205\000\205\000\000\000\000\000\000\000\000\012\169\000\000\000\000\000\000\000\205\000\006\000\205\000\000\000\205\003j\003n\003r\000\205\003v\003B\000\000)\022\000\205\000\000\007\198\000\205\000\205\000\000\000\205\000\000\000\205\000\000\000\000\000\000\001\250\000\000\000\000\000\000\007\202\000\000\b\182\b\186\000\000\000\000\000\000\000\000\b\226\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\t\018\t\022\000\000\t\026\t&\t2\t6\t>\r:\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\014\206).\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015j\000\000\t\214\t\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000)6\015\142\017:\t\230\t\234\000\000\017N\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000y\000\000\000\000\000y\000\000\000\000\012\165\000\000\000y\t\238\014\194\000y\000y\000\000\014\218\003\238\000\000\000\000\017R\000\000\000y\000\000\000y\000y\000y\000y\000y\000y\000y\000\000\012\165\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\000\000y\000\000\000y\000\000\000y\000\000\000\000\000y\000\000\012\165\000\000\000y\000\000\000y\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000y\000y\000y\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000y\000\000\012\165\000\000\000y\000\000\000\000\000y\000y\000\000\000\000\000\000\000\000\029\162\000\000\000y\000\000\000y\000y\000\000\000y\000y\000\000\000y\028\174\000y\012\165\000\000\000\000\000\000\000y\000\000\002v\000\000\000y\019\149\019\149\000\000\000y\002z\019\149\000\000\002\130\000y\019\149\000\000\000y\000y\000\000\000y\001\250\000y\0056\000\000\019\149\019\149\019\149\000\000\019\149\019\149\019\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bj\001\242\001\246\000\000\019\149\000\000\000\000\rf\000\000\002\006\000\000\019\149\019\149\019\149\000\000\003b\019\149\000\000\000\000\000\000\001\250\0022\019\149\000\000\000\000\019\149\000\000\000\000\000\000\000\000\000\000\019\149\019\149\019\149\000\000\000\000\000\000\000\000\000\000\000\000\019\149\000\000\019\149\019\149\000\000\004\130\000\000\004N\000\000\019\149\rr\003R\019\149\003b\003\150\003\162\019\149\000\000\000\000\019\149\000\000\003\174\000\000\000\000\000\000\000\000\000\000\019\149\000\000\019\149\019\149\000\000\019\149\019\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\149\003\178\019\149\000\000\019\149\019\149\018\233\018\233\019\149\006\249\000\000\018\233\000\000\019\149\006\249\018\233\019\149\019\149\000\000\019\149\000\000\019\149\019\149\0056\000\000\018\233\018\233\018\233\000\000\018\233\018\233\018\233\000\000\000\000\006\249\000\000\000\000\000\000\000\000\000\000\001\242\001\246\000\000\018\233\000\000\000\000\000\000\000\000\000\000\000\000\018\233\018\233+\238\000\000\000\000\018\233\007\221\020!\006\249\001\250\0022\018\233\000\000\000\000\018\233\000\000\000\000\006\249\000\000\000\000\018\233\018\233\018\233\006\249\b\166\000\242\007\221\000\000\000\000\018\233\007\221\018\233\018\233\000\000\003V\006\249\005\022\000\000\018\233\000\000\003R\018\233\003b\003\150\003\162\018\233\000\000\000\000\018\233\000\000\003\174\000\000\000\000\000\000\000\000\000\000\018\233\000\000\018\233\018\233\000\000\018\233\018\233\000\000\000\000\006\249\000\000\000\000\000\000\000\000\000\000\018\233\003\178\018\233\006\249\018\233\018\233\004]\004]\018\233\000\000\000\000\004]\000\000\018\233\000\000\004]\018\233\004\018\000\000\018\233\020!\018\233\018\233\020!\020!\004]\004]\004]\000\000\004]\004]\004]\000\000\000\000\000\000\000\000\000\000\000\000\007\221\000\000\001\242\001\246\000\000\004]\020!\000\000\020!\000\000\000\000\000\000\004]\004]\004\n\000\000\007\221\004]\000\000\007\221\000\000\001\250\0022\004]\000\000\000\000\004]\000\000\000\000\000\000\000\000\000\000\004]\004]\004]\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\004]\004]\000\000\003V\000\000\004N\000\000\004]\000\000\003R\004]\003b\003\150\003\162\004]\000\000\000\000\004]\000\000\003\174\000\000\000\000\000\000\000\000\000\000\004]\000\000\004]\004]\000\000\004]\004]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\003\178\004]\000\000\004]\004]\0189\0189\004]\000\000\000\000\0189\000\000\004]\000\000\0189\004]\004\018\000\000\004]\000\000\004]\004]\000\000\000\000\0189\0189\0189\000\000\0189\0189\0189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\246\000\000\0189\000\000\000\000\000\000\000\000\000\000\000\000\0189\0189\004\n\000\000\000\000\0189\007\225\020!\000\000\001\250\0022\0189\000\000\000\000\0189\000\000\000\000\000\000\000\000\000\000\0189\0189\0189\000\000\000\000\000\000\007\225\000\000\000\000\0189\007\225\0189\0189\000\000\003V\000\000\005:\000\000\0189\000\000\003R\0189\003b\003\150\003\162\0189\000\000\000\000\0189\000\000\003\174\000\000\000\000\000\000\000\000\000\000\0189\000\000\0189\0189\000\000\0189\0189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0189\003\178\0189\000\000\0189\0189\b\229\b\229\0189\0025\000\000\b\229\000\000\0189\0025\b\229\0189\004\018\000\000\0189\020!\0189\0189\020!\020!\b\229\b\229\b\229\000\000\b\229\b\229\b\229\000\000\000\000\0025\000\000\000\000\000\000\007\225\000\000\000\000\000\000\000\000\b\229\020!\000\000\020!\000\000\000\000\000\000\b\229\b\229\b\229\000\000\007\225\b\229\000\000\007\225\0025\004\026\000\000\b\229\000\000\000\000\b\229\000\000\000\000\0025\000\000\000\000\b\229\b\229\b\229\0025\0025\000\242\000\000\000\000\000\000\b\229\000\000\b\229\b\229\000\000\0025\0025\000\000\000\000\b\229\000\000\000\000\b\229\000\000\000\000\000\000\b\229\000\000\000\000\b\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\229\000\000\b\229\b\229\000\000\b\229\b\229\000\000\000\000\0025\000\000\000\000\000\000\000\000\000\000\b\229\000\000\b\229\0025\b\229\b\229\018I\018I\b\229\000\000\000\000\018I\000\000\b\229\000\000\018I\b\229\000\000\000\000\b\229\000\000\b\229\b\229\000\000\000\000\018I\018I\018I\000\000\018I\018I\018I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\246\000\000\018I\000\000\000\000\000\000\000\000\000\000\000\000\018I\018I\004\n\000\000\000\000\018I\000\000\000\000\000\000\001\250\0022\018I\000\000\000\000\018I\000\000\000\000\000\000\000\000\000\000\018I\018I\018I\000\000\000\000\000\000\000\000\000\000\000\000\018I\000\000\018I\018I\000\000\006Z\000\000\004N\000\000\018I\000\000\003R\018I\003b\003\150\003\162\018I\000\000\000\000\018I\000\000\003\174\000\000\000\000\000\000\000\000\000\000\018I\000\000\018I\018I\000\000\018I\018I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018I\003\178\018I\000\000\018I\018I\018Y\018Y\018I\020-\000\000\018Y\000\000\018I\020-\018Y\018I\004\018\000\000\018I\000\000\018I\018I\000\000\000\000\018Y\018Y\018Y\000\000\018Y\018Y\018Y\000\000\000\000\020-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018Y\000\000\000\000\000\000\000\000\000\000\000\000\018Y\018Y\004\n\000\000\000\000\018Y\000\000\000\000\020-\000\000\000\000\018Y\000\000\000\000\018Y\000\000\000\000\020-\000\000\000\000\018Y\018Y\018Y\020-\020-\000\242\000\000\000\000\000\000\018Y\000\000\018Y\018Y\000\000\020-\020-\000\000\000\000\018Y\000\000\000\000\018Y\000\000\000\000\000\000\018Y\000\000\000\000\018Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018Y\000\000\018Y\018Y\000\000\018Y\018Y\000\000\000\000\020-\000\000\000\000\000\000\000\000\000\000\018Y\000\000\018Y\020-\018Y\018Y\018a\018a\018Y\000\000\000\000\018a\000\000\018Y\000\000\018a\018Y\004\018\000\000\018Y\000\000\018Y\018Y\000\000\000\000\018a\018a\018a\000\000\018a\018a\018a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\246\000\000\018a\000\000\000\000\000\000\000\000\000\000\000\000\018a\018a\004\214\000\000\000\000\018a\000\000\000\000\000\000\001\250\0022\018a\000\000\000\000\018a\000\000\000\000\000\000\000\000\000\000\018a\018a\018a\000\000\000\000\000\000\000\000\000\000\000\000\018a\000\000\018a\018a\000\000+\n\000\000\004N\000\000\018a\000\000\003R\018a\003b\003\150\003\162\018a\000\000\000\000\018a\000\000\003\174\000\000\000\000\000\000\000\000\001E\018a\000\000\018a\018a\001E\018a\018a\000\000\000\000\000\000\000\000\000\000\000\000\007%\000\000\018a\003\178\018a$\190\018a\018a\018y\018y\018a\001E\000\000\018y\000\000\018a\000\000\018y\018a\004\018\000\000\018a\000\000\018a\018a\b\178\000\000\018y\018y\018y\000\000\018y\018y\018y\000\000\001E\000\000\007\218\000\000\000\000\000\000\000\000\000\000\000\000\001E\018y\000\000\000\000\000\000%2\001E\000\000\018y\018y\004\n\000\000\000\000\018y\031\186\000\000\000\000\001E\001E\018y\031\210\000\000\018y\000\000\000\000\000\000\000\000\000\000\018y\018y\018y%\214%\230\000\000\000\000\000\000\000\000\018y\000\000\018y\018y\000\000\000\000\000\000\000\000\000\000\018y\000\000\001E\018y\000\000\000\000\000\000\018y\000\000\000\000\018y\001E\000\000\000\000\000\000\000\000\007%\000\000\018y\000\000\018y\018y\000\000\018y\018y&\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018y\000\000\018y\000\000\018y\018y\018\129\018\129\018y\000\000\000\000\018\129\000\000\018y\000\000\018\129\018y\004\018\000\000\018y\000\000\018y\018y\000\000\000\000\018\129\018\129\018\129\000\000\018\129\018\129\018\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\129\000\000\000\000\000\000\000\000\000\000\004\169\018\129\018\129\004\214\000\000\000\000\018\129\004\169\000\000\000\000\004\169\000\000\018\129\000\000\000\000\018\129\000\000\000\000\004\169\000\000\000\000\018\129\018\129\018\129\000\000\000\000\004\169\000\000\000\000\000\000\018\129\000\000\018\129\018\129\000\000\000\000\004\169\000\000\000\000\018\129\000\000\000\000\018\129\004\169\000\000\004\169\018\129\000\000\000\000\018\129\000\000\004\169\000\000\000\000\000\000\000\000\000\000\018\129\004\169\018\129\018\129\000\000\018\129\018\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\129\000\000\018\129\000\000\018\129\018\129\018\137\018\137\018\129\000\000\000\000\018\137\000\000\018\129\031\238\018\137\018\129\004\018\000\000\018\129\000\000\018\129\018\129\000\000\000\000\018\137\018\137\018\137\000\000\018\137\018\137\018\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\138\000\000\018\137\000\000\000\000\000\000\000\000\000\000\002v\018\137\018\137\004\n\000\000\000\000\018\137\002z\000\000\000\000\002\130\000\000\018\137\000\000\000\000\018\137\000\000\000\000\001\250\000\000\000\000\018\137\018\137\018\137\000\000\000\000\000\000\000\000\000\000\000\000\018\137\000\000\018\137\018\137\000\000\000\000\bj\000\000\000\000\018\137\000\000\000\000\018\137\rf\000\000\002\006\018\137\000\000\000\000\018\137\000\000\003b\000\000\000\000\000\000\000\000\000\000\018\137\000\000\018\137\018\137\000\000\018\137\018\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\137\000\000\018\137\000\000\018\137\018\137\018\145\018\145\018\137\000\000\000\000\018\145\000\000\018\137\rr\018\145\018\137\004\018\000\000\018\137\000\000\018\137\018\137\000\000\000\000\018\145\018\145\018\145\000\000\018\145\018\145\018\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\222\000\000\018\145\000\000\000\000\000\000\000\000\000\000\002v\018\145\018\145\004\214\000\000\000\000\018\145\002z\000\000\000\000\002\130\000\000\018\145\000\000\000\000\018\145\000\000\000\000\001\250\000\000\000\000\018\145\018\145\018\145\000\000\000\000\000\000\000\000\000\000\000\000\018\145\000\000\018\145\018\145\000\000\000\000\bj\000\000\000\000\018\145\000\000\000\000\018\145\rf\000\000\002\006\018\145\000\000\000\000\018\145\000\000\003b\000\000\000\000\000\000\000\000\000\000\018\145\000\000\018\145\018\145\000\000\018\145\018\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\145\000\000\018\145\000\000\018\145\018\145\018i\018i\018\145\000\000\000\000\018i\000\000\018\145\rr\018i\018\145\004\018\000\000\018\145\000\000\018\145\018\145\000\000\000\000\018i\018i\018i\000\000\018i\018i\018i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\238\000\000\018i\000\000\000\000\000\000\000\000\000\000\002v\018i\018i\004\n\000\000\000\000\018i\002z\000\000\000\000\002\130\000\000\018i\000\000\000\000\018i\000\000\000\000\001\250\000\000\000\000\018i\018i\018i\000\000\000\000\000\000\000\000\000\000\000\000\018i\000\000\018i\018i\000\000\000\000\bj\000\000\000\000\018i\000\000\000\000\018i\rf\000\000\002\006\018i\000\000\000\000\018i\000\000\003b\000\000\000\000\000\000\000\000\000\000\018i\000\000\018i\018i\000\000\018i\018i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018i\000\000\018i\000\000\018i\018i\018q\018q\018i\000\000\000\000\018q\000\000\018i\rr\018q\018i\004\018\000\000\018i\000\000\018i\018i\000\000\000\000\018q\018q\018q\000\000\018q\018q\018q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\022\000\000\018q\000\000\000\000\000\000\000\000\000\000\002v\018q\018q\004\214\000\000\000\000\018q\002z\000\000\000\000\002\130\000\000\018q\000\000\000\000\018q\000\000\000\000\001\250\000\000\000\000\018q\018q\018q\000\000\000\000\000\000\000\000\000\000\000\000\018q\000\000\018q\018q\000\000\000\000\bj\000\000\000\000\018q\000\000\000\000\018q\rf\000\000\002\006\018q\000\000\000\000\018q\000\000\003b\000\000\000\000\000\000\000\000\000\000\018q\000\000\018q\018q\000\000\018q\018q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018q\000\000\018q\000\000\018q\018q\017\025\017\025\018q\000\000\000\000\017\025\000\000\018q\rr\017\025\018q\004\018\000\000\018q\000\000\018q\018q\000\000\000\000\017\025\017\025\017\025\000\000\017\025\017\025\017\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031&\000\000\017\025\000\000\000\000\000\000\000\000\000\000\002v\017\025\017\025\004\n\000\000\000\000\017\025\002z\000\000\000\000\002\130\000\000\017\025\000\000\000\000\017\025\000\000\000\000\001\250\000\000\000\000\017\025\017\025\017\025\000\000\000\000\000\000\000\000\000\000\000\000\017\025\000\000\017\025\017\025\000\000\000\000\bj\000\000\000\000\017\025\000\000\000\000\017\025\rf\000\000\002\006\017\025\000\000\000\000\017\025\000\000\003b\000\000\000\000\000\000\000\000\000\000\017\025\000\000\017\025\017\025\000\000\017\025\017\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\025\000\000\017\025\000\000\017\025\017\025\017!\017!\017\025\000\000\000\000\017!\000\000\017\025\rr\017!\017\025\004\018\000\000\017\025\000\000\017\025\017\025\000\000\000\000\017!\017!\017!\000\000\017!\017!\017!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017!\000\000\000\000\000\000\000\000\000\000\000\000\017!\017!\004\214\000\000\000\000\017!\000\000\000\000\000\000\000\000\000\000\017!\000\000\000\000\017!\000\000\000\000\000\000\000\000\000\000\017!\017!\017!\000\000\000\000\000\000\000\000\000\000\000\000\017!\000\000\017!\017!\000\000\000\000\000\000\000\000\000\000\017!\000\000\000\000\017!\000\000\000\000\000\000\017!\000\000\000\000\017!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017!\000\000\017!\017!\000\000\017!\017!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017!\000\000\017!\000\000\017!\017!\017)\017)\017!\000\000\000\000\017)\000\000\017!\000\000\017)\017!\004\018\000\000\017!\000\000\017!\017!\000\000\000\000\017)\017)\017)\000\000\017)\017)\017)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017)\000\000\000\000\000\000\000\000\000\000\000\000\017)\017)\004\n\000\000\000\000\017)\000\000\000\000\000\000\000\000\000\000\017)\000\000\000\000\017)\000\000\000\000\000\000\000\000\000\000\017)\017)\017)\000\000\000\000\000\000\000\000\000\000\000\000\017)\000\000\017)\017)\000\000\000\000\000\000\000\000\000\000\017)\000\000\000\000\017)\000\000\000\000\000\000\017)\000\000\000\000\017)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017)\000\000\017)\017)\000\000\017)\017)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017)\000\000\017)\000\000\017)\017)\0171\0171\017)\000\000\000\000\0171\000\000\017)\000\000\0171\017)\004\018\000\000\017)\000\000\017)\017)\000\000\000\000\0171\0171\0171\000\000\0171\0171\0171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0171\000\000\000\000\000\000\000\000\000\000\000\000\0171\0171\004\214\000\000\000\000\0171\000\000\000\000\000\000\000\000\000\000\0171\000\000\000\000\0171\000\000\000\000\000\000\000\000\000\000\0171\0171\0171\000\000\000\000\000\000\000\000\000\000\000\000\0171\000\000\0171\0171\000\000\000\000\000\000\000\000\000\000\0171\000\000\000\000\0171\000\000\000\000\000\000\0171\000\000\000\000\0171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0171\000\000\0171\0171\000\000\0171\0171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0171\000\000\0171\000\000\0171\0171\0179\0179\0171\000\000\000\000\0179\000\000\0171\000\000\0179\0171\004\018\000\000\0171\000\000\0171\0171\000\000\000\000\0179\0179\0179\000\000\0179\0179\0179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0179\000\000\000\000\000\000\000\000\000\000\000\000\0179\0179\004\n\000\000\000\000\0179\000\000\000\000\000\000\000\000\000\000\0179\000\000\000\000\0179\000\000\000\000\000\000\000\000\000\000\0179\0179\0179\000\000\000\000\000\000\000\000\000\000\000\000\0179\000\000\0179\0179\000\000\000\000\000\000\000\000\000\000\0179\000\000\000\000\0179\000\000\000\000\000\000\0179\000\000\000\000\0179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0179\000\000\0179\0179\000\000\0179\0179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0179\000\000\0179\000\000\0179\0179\017A\017A\0179\000\000\000\000\017A\000\000\0179\000\000\017A\0179\004\018\000\000\0179\000\000\0179\0179\000\000\000\000\017A\017A\017A\000\000\017A\017A\017A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017A\000\000\000\000\000\000\000\000\000\000\000\000\017A\017A\004\214\000\000\000\000\017A\000\000\000\000\000\000\000\000\000\000\017A\000\000\000\000\017A\000\000\000\000\000\000\000\000\000\000\017A\017A\017A\000\000\000\000\000\000\000\000\000\000\000\000\017A\000\000\017A\017A\000\000\000\000\000\000\000\000\000\000\017A\000\000\000\000\017A\000\000\000\000\000\000\017A\000\000\000\000\017A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017A\000\000\017A\017A\000\000\017A\017A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017A\000\000\017A\000\000\017A\017A\017I\017I\017A\000\000\000\000\017I\000\000\017A\000\000\017I\017A\004\018\000\000\017A\000\000\017A\017A\000\000\000\000\017I\017I\017I\000\000\017I\017I\017I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017I\000\000\000\000\000\000\000\000\000\000\000\000\017I\017I\004\n\000\000\000\000\017I\000\000\000\000\000\000\000\000\000\000\017I\000\000\000\000\017I\000\000\000\000\000\000\000\000\000\000\017I\017I\017I\000\000\000\000\000\000\000\000\000\000\000\000\017I\000\000\017I\017I\000\000\000\000\000\000\000\000\000\000\017I\000\000\000\000\017I\000\000\000\000\000\000\017I\000\000\000\000\017I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017I\000\000\017I\017I\000\000\017I\017I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017I\000\000\017I\000\000\017I\017I\017Q\017Q\017I\000\000\000\000\017Q\000\000\017I\000\000\017Q\017I\004\018\000\000\017I\000\000\017I\017I\000\000\000\000\017Q\017Q\017Q\000\000\017Q\017Q\017Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017Q\000\000\000\000\000\000\000\000\000\000\000\000\017Q\017Q\004\214\000\000\000\000\017Q\000\000\000\000\000\000\000\000\000\000\017Q\000\000\000\000\017Q\000\000\000\000\000\000\000\000\000\000\017Q\017Q\017Q\000\000\000\000\000\000\000\000\000\000\000\000\017Q\000\000\017Q\017Q\000\000\000\000\000\000\000\000\000\000\017Q\000\000\000\000\017Q\000\000\000\000\000\000\017Q\000\000\000\000\017Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017Q\000\000\017Q\017Q\000\000\017Q\017Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017Q\000\000\017Q\000\000\017Q\017Q\017Y\017Y\017Q\000\000\000\000\017Y\000\000\017Q\000\000\017Y\017Q\004\018\000\000\017Q\000\000\017Q\017Q\000\000\000\000\017Y\017Y\017Y\000\000\017Y\017Y\017Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017Y\000\000\000\000\000\000\000\000\000\000\000\000\017Y\017Y\004\n\000\000\000\000\017Y\000\000\000\000\000\000\000\000\000\000\017Y\000\000\000\000\017Y\000\000\000\000\000\000\000\000\000\000\017Y\017Y\017Y\000\000\000\000\000\000\000\000\000\000\000\000\017Y\000\000\017Y\017Y\000\000\000\000\000\000\000\000\000\000\017Y\000\000\000\000\017Y\000\000\000\000\000\000\017Y\000\000\000\000\017Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017Y\000\000\017Y\017Y\000\000\017Y\017Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017Y\000\000\017Y\000\000\017Y\017Y\017a\017a\017Y\000\000\000\000\017a\000\000\017Y\000\000\017a\017Y\004\018\000\000\017Y\000\000\017Y\017Y\000\000\000\000\017a\017a\017a\000\000\017a\017a\017a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017a\000\000\000\000\000\000\000\000\000\000\000\000\017a\017a\004\214\000\000\000\000\017a\000\000\000\000\000\000\000\000\000\000\017a\000\000\000\000\017a\000\000\000\000\000\000\000\000\000\000\017a\017a\017a\000\000\000\000\000\000\000\000\000\000\000\000\017a\000\000\017a\017a\000\000\000\000\000\000\000\000\000\000\017a\000\000\000\000\017a\000\000\000\000\000\000\017a\000\000\000\000\017a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017a\000\000\017a\017a\000\000\017a\017a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017a\000\000\017a\000\000\017a\017a\017i\017i\017a\000\000\000\000\017i\000\000\017a\000\000\017i\017a\004\018\000\000\017a\000\000\017a\017a\000\000\000\000\017i\017i\017i\000\000\017i\017i\017i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017i\000\000\000\000\000\000\000\000\000\000\000\000\017i\017i\004\n\000\000\000\000\017i\000\000\000\000\000\000\000\000\000\000\017i\000\000\000\000\017i\000\000\000\000\000\000\000\000\000\000\017i\017i\017i\000\000\000\000\000\000\000\000\000\000\000\000\017i\000\000\017i\017i\000\000\000\000\000\000\000\000\000\000\017i\000\000\000\000\017i\000\000\000\000\000\000\017i\000\000\000\000\017i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017i\000\000\017i\017i\000\000\017i\017i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017i\000\000\017i\000\000\017i\017i\017q\017q\017i\000\000\000\000\017q\000\000\017i\000\000\017q\017i\004\018\000\000\017i\000\000\017i\017i\000\000\000\000\017q\017q\017q\000\000\017q\017q\017q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017q\000\000\000\000\000\000\000\000\000\000\000\000\017q\017q\004\214\000\000\000\000\017q\000\000\000\000\000\000\000\000\000\000\017q\000\000\000\000\017q\000\000\000\000\000\000\000\000\000\000\017q\017q\017q\000\000\000\000\000\000\000\000\000\000\000\000\017q\000\000\017q\017q\000\000\000\000\000\000\000\000\000\000\017q\000\000\000\000\017q\000\000\000\000\000\000\017q\000\000\000\000\017q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017q\000\000\017q\017q\000\000\017q\017q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017q\000\000\017q\000\000\017q\017q\017y\017y\017q\000\000\000\000\017y\000\000\017q\000\000\017y\017q\004\018\000\000\017q\000\000\017q\017q\000\000\000\000\017y\017y\017y\000\000\017y\017y\017y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017y\000\000\000\000\000\000\000\000\000\000\000\000\017y\017y\004\n\000\000\000\000\017y\000\000\000\000\000\000\000\000\000\000\017y\000\000\000\000\017y\000\000\000\000\000\000\000\000\000\000\017y\017y\017y\000\000\000\000\000\000\000\000\000\000\000\000\017y\000\000\017y\017y\000\000\000\000\000\000\000\000\000\000\017y\000\000\000\000\017y\000\000\000\000\000\000\017y\000\000\000\000\017y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017y\000\000\017y\017y\000\000\017y\017y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017y\000\000\017y\000\000\017y\017y\017\129\017\129\017y\000\000\000\000\017\129\000\000\017y\000\000\017\129\017y\004\018\000\000\017y\000\000\017y\017y\000\000\000\000\017\129\017\129\017\129\000\000\017\129\017\129\017\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\129\000\000\000\000\000\000\000\000\000\000\000\000\017\129\017\129\004\214\000\000\000\000\017\129\000\000\000\000\000\000\000\000\000\000\017\129\000\000\000\000\017\129\000\000\000\000\000\000\000\000\000\000\017\129\017\129\017\129\000\000\000\000\000\000\000\000\000\000\000\000\017\129\000\000\017\129\017\129\000\000\000\000\000\000\000\000\000\000\017\129\000\000\000\000\017\129\000\000\000\000\000\000\017\129\000\000\000\000\017\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\129\000\000\017\129\017\129\000\000\017\129\017\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\129\000\000\017\129\000\000\017\129\017\129\017\137\017\137\017\129\000\000\000\000\017\137\000\000\017\129\000\000\017\137\017\129\004\018\000\000\017\129\000\000\017\129\017\129\000\000\000\000\017\137\017\137\017\137\000\000\017\137\017\137\017\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\137\000\000\000\000\000\000\000\000\000\000\000\000\017\137\017\137\004\n\000\000\000\000\017\137\000\000\000\000\000\000\000\000\000\000\017\137\000\000\000\000\017\137\000\000\000\000\000\000\000\000\000\000\017\137\017\137\017\137\000\000\000\000\000\000\000\000\000\000\000\000\017\137\000\000\017\137\017\137\000\000\000\000\000\000\000\000\000\000\017\137\000\000\000\000\017\137\000\000\000\000\000\000\017\137\000\000\000\000\017\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\137\000\000\017\137\017\137\000\000\017\137\017\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\137\000\000\017\137\000\000\017\137\017\137\017\145\017\145\017\137\000\000\000\000\017\145\000\000\017\137\000\000\017\145\017\137\004\018\000\000\017\137\000\000\017\137\017\137\000\000\000\000\017\145\017\145\017\145\000\000\017\145\017\145\017\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\145\000\000\000\000\000\000\000\000\000\000\000\000\017\145\017\145\004\214\000\000\000\000\017\145\000\000\000\000\000\000\000\000\000\000\017\145\000\000\000\000\017\145\000\000\000\000\000\000\000\000\000\000\017\145\017\145\017\145\000\000\000\000\000\000\000\000\000\000\000\000\017\145\000\000\017\145\017\145\000\000\000\000\000\000\000\000\000\000\017\145\000\000\000\000\017\145\000\000\000\000\000\000\017\145\000\000\000\000\017\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\145\000\000\017\145\017\145\000\000\017\145\017\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\145\000\000\017\145\000\000\017\145\017\145\018Q\018Q\017\145\000\000\000\000\018Q\000\000\017\145\000\000\018Q\017\145\004\018\000\000\017\145\000\000\017\145\017\145\000\000\000\000\018Q\018Q\018Q\000\000\018Q\018Q\018Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018Q\000\000\000\000\000\000\000\000\000\000\000\000\018Q\018Q\004\214\000\000\000\000\018Q\000\000\000\000\000\000\000\000\000\000\018Q\000\000\000\000\018Q\000\000\000\000\000\000\000\000\000\000\018Q\018Q\018Q\000\000\000\000\000\000\000\000\000\000\000\000\018Q\000\000\018Q\018Q\000\000\000\000\000\000\000\000\000\000\018Q\000\000\000\000\018Q\000\000\000\000\000\000\018Q\000\000\000\000\018Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018Q\000\000\018Q\018Q\000\000\018Q\018Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018Q\000\000\018Q\000\000\018Q\018Q\018A\018A\018Q\000\000\000\000\018A\000\000\018Q\000\000\018A\018Q\004\018\000\000\018Q\000\000\018Q\018Q\000\000\000\000\018A\018A\018A\000\000\018A\018A\018A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018A\000\000\000\000\000\000\000\000\000\000\000\000\018A\018A\004\214\000\000\000\000\018A\000\000\000\000\000\000\000\000\000\000\018A\000\000\000\000\018A\000\000\000\000\000\000\000\000\000\000\018A\018A\018A\000\000\000\000\000\000\000\000\000\000\000\000\018A\000\000\018A\018A\000\000\000\000\000\000\000\000\000\000\018A\000\000\000\000\018A\000\000\000\000\000\000\018A\000\000\000\000\018A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018A\000\000\018A\018A\000\000\018A\018A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018A\000\000\018A\000\000\018A\018A\018\025\018\025\018A\000\000\000\000\018\025\000\000\018A\000\000\018\025\018A\004\018\000\000\018A\000\000\018A\018A\000\000\000\000\018\025\018\025\018\025\000\000\018\025\018\025\018\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\025\000\000\000\000\000\000\000\000\000\000\000\000\018\025\018\025\004\n\000\000\000\000\018\025\000\000\000\000\000\000\000\000\000\000\018\025\000\000\000\000\018\025\000\000\000\000\000\000\000\000\000\000\018\025\018\025\018\025\000\000\000\000\000\000\000\000\000\000\000\000\018\025\000\000\018\025\018\025\000\000\000\000\000\000\000\000\000\000\018\025\000\000\000\000\018\025\000\000\000\000\000\000\018\025\000\000\000\000\018\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\025\000\000\018\025\018\025\000\000\018\025\018\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\025\000\000\018\025\000\000\018\025\018\025\018!\018!\018\025\000\000\000\000\018!\000\000\018\025\000\000\018!\018\025\004\018\000\000\018\025\000\000\018\025\018\025\000\000\000\000\018!\018!\018!\000\000\018!\018!\018!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018!\000\000\000\000\000\000\000\000\000\000\000\000\018!\018!\004\214\000\000\000\000\018!\000\000\000\000\000\000\000\000\000\000\018!\000\000\000\000\018!\000\000\000\000\000\000\000\000\000\000\018!\018!\018!\000\000\000\000\000\000\000\000\000\000\000\000\018!\000\000\018!\018!\000\000\000\000\000\000\000\000\000\000\018!\000\000\000\000\018!\000\000\000\000\000\000\018!\000\000\000\000\018!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018!\000\000\018!\018!\000\000\018!\018!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018!\000\000\018!\000\000\018!\018!\018)\018)\018!\000\000\000\000\018)\000\000\018!\000\000\018)\018!\004\018\000\000\018!\000\000\018!\018!\000\000\000\000\018)\018)\018)\000\000\018)\018)\018)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018)\000\000\000\000\000\000\000\000\000\000\000\000\018)\018)\004\n\000\000\000\000\018)\000\000\000\000\000\000\000\000\000\000\018)\000\000\000\000\018)\000\000\000\000\000\000\000\000\000\000\018)\018)\018)\000\000\000\000\000\000\000\000\000\000\000\000\018)\000\000\018)\018)\000\000\000\000\000\000\000\000\000\000\018)\000\000\000\000\018)\000\000\000\000\000\000\018)\000\000\000\000\018)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018)\000\000\018)\018)\000\000\018)\018)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018)\000\000\018)\000\000\018)\018)\0181\0181\018)\000\000\000\000\0181\000\000\018)\000\000\0181\018)\004\018\000\000\018)\000\000\018)\018)\000\000\000\000\0181\0181\0181\000\000\0181\0181\0181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0181\000\000\000\000\000\000\000\000\000\000\000\000\0181\0181\004\214\000\000\000\000\0181\000\000\000\000\000\000\000\000\000\000\0181\000\000\000\000\0181\000\000\000\000\000\000\000\000\000\000\0181\0181\0181\000\000\000\000\000\000\000\000\000\000\000\000\0181\000\000\0181\0181\000\000\000\000\000\000\000\000\000\000\0181\000\000\000\000\0181\000\000\000\000\000\000\0181\000\000\000\000\0181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0181\000\000\0181\0181\000\000\0181\0181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0181\000\000\0181\000\000\0181\0181\017\153\017\153\0181\000\000\000\000\017\153\000\000\0181\000\000\017\153\0181\004\018\000\000\0181\000\000\0181\0181\000\000\000\000\017\153\017\153\017\153\000\000\017\153\017\153\017\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\153\000\000\000\000\000\000\000\000\000\000\000\000\017\153\017\153\004\n\000\000\000\000\017\153\000\000\000\000\000\000\000\000\000\000\017\153\000\000\000\000\017\153\000\000\000\000\000\000\000\000\000\000\017\153\017\153\017\153\000\000\000\000\000\000\000\000\000\000\000\000\017\153\000\000\017\153\017\153\000\000\000\000\000\000\000\000\000\000\017\153\000\000\000\000\017\153\000\000\000\000\000\000\017\153\000\000\000\000\017\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\153\000\000\017\153\017\153\000\000\017\153\017\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\153\000\000\017\153\000\000\017\153\017\153\017\161\017\161\017\153\000\000\000\000\017\161\000\000\017\153\000\000\017\161\017\153\004\018\000\000\017\153\000\000\017\153\017\153\000\000\000\000\017\161\017\161\017\161\000\000\017\161\017\161\017\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\161\000\000\000\000\000\000\000\000\000\000\000\000\017\161\017\161\004\214\000\000\000\000\017\161\000\000\000\000\000\000\000\000\000\000\017\161\000\000\000\000\017\161\000\000\000\000\000\000\000\000\000\000\017\161\017\161\017\161\000\000\000\000\000\000\000\000\000\000\000\000\017\161\000\000\017\161\017\161\000\000\000\000\000\000\000\000\000\000\017\161\000\000\000\000\017\161\000\000\000\000\000\000\017\161\000\000\000\000\017\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\161\000\000\017\161\017\161\000\000\017\161\017\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\161\000\000\017\161\000\000\017\161\017\161\017\169\017\169\017\161\000\000\000\000\017\169\000\000\017\161\000\000\017\169\017\161\004\018\000\000\017\161\000\000\017\161\017\161\000\000\000\000\017\169\017\169\017\169\000\000\017\169\017\169\017\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\169\000\000\000\000\000\000\000\000\000\000\000\000\017\169\017\169\004\n\000\000\000\000\017\169\000\000\000\000\000\000\000\000\000\000\017\169\000\000\000\000\017\169\000\000\000\000\000\000\000\000\000\000\017\169\017\169\017\169\000\000\000\000\000\000\000\000\000\000\000\000\017\169\000\000\017\169\017\169\000\000\000\000\000\000\000\000\000\000\017\169\000\000\000\000\017\169\000\000\000\000\000\000\017\169\000\000\000\000\017\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\169\000\000\017\169\017\169\000\000\017\169\017\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\169\000\000\017\169\000\000\017\169\017\169\017\177\017\177\017\169\000\000\000\000\017\177\000\000\017\169\000\000\017\177\017\169\004\018\000\000\017\169\000\000\017\169\017\169\000\000\000\000\017\177\017\177\017\177\000\000\017\177\017\177\017\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\177\000\000\000\000\000\000\000\000\000\000\000\000\017\177\017\177\004\214\000\000\000\000\017\177\000\000\000\000\000\000\000\000\000\000\017\177\000\000\000\000\017\177\000\000\000\000\000\000\000\000\000\000\017\177\017\177\017\177\000\000\000\000\000\000\000\000\000\000\000\000\017\177\000\000\017\177\017\177\000\000\000\000\000\000\000\000\000\000\017\177\000\000\000\000\017\177\000\000\000\000\000\000\017\177\000\000\000\000\017\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\177\000\000\017\177\017\177\000\000\017\177\017\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\177\000\000\017\177\000\000\017\177\017\177\017\185\017\185\017\177\000\000\000\000\017\185\000\000\017\177\000\000\017\185\017\177\004\018\000\000\017\177\000\000\017\177\017\177\000\000\000\000\017\185\017\185\017\185\000\000\017\185\017\185\017\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\185\000\000\000\000\000\000\000\000\000\000\000\000\017\185\017\185\004\n\000\000\000\000\017\185\000\000\000\000\000\000\000\000\000\000\017\185\000\000\000\000\017\185\000\000\000\000\000\000\000\000\000\000\017\185\017\185\017\185\000\000\000\000\000\000\000\000\000\000\000\000\017\185\000\000\017\185\017\185\000\000\000\000\000\000\000\000\000\000\017\185\000\000\000\000\017\185\000\000\000\000\000\000\017\185\000\000\000\000\017\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\185\000\000\017\185\017\185\000\000\017\185\017\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\185\000\000\017\185\000\000\017\185\017\185\017\193\017\193\017\185\000\000\000\000\017\193\000\000\017\185\000\000\017\193\017\185\004\018\000\000\017\185\000\000\017\185\017\185\000\000\000\000\017\193\017\193\017\193\000\000\017\193\017\193\017\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\193\000\000\000\000\000\000\000\000\000\000\000\000\017\193\017\193\004\214\000\000\000\000\017\193\000\000\000\000\000\000\000\000\000\000\017\193\000\000\000\000\017\193\000\000\000\000\000\000\000\000\000\000\017\193\017\193\017\193\000\000\000\000\000\000\000\000\000\000\000\000\017\193\000\000\017\193\017\193\000\000\000\000\000\000\000\000\000\000\017\193\000\000\000\000\017\193\000\000\000\000\000\000\017\193\000\000\000\000\017\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\193\000\000\017\193\017\193\000\000\017\193\017\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\193\000\000\017\193\000\000\017\193\017\193\017\201\017\201\017\193\000\000\000\000\017\201\000\000\017\193\000\000\017\201\017\193\004\018\000\000\017\193\000\000\017\193\017\193\000\000\000\000\017\201\017\201\017\201\000\000\017\201\017\201\017\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\201\000\000\000\000\000\000\000\000\000\000\000\000\017\201\017\201\004\n\000\000\000\000\017\201\000\000\000\000\000\000\000\000\000\000\017\201\000\000\000\000\017\201\000\000\000\000\000\000\000\000\000\000\017\201\017\201\017\201\000\000\000\000\000\000\000\000\000\000\000\000\017\201\000\000\017\201\017\201\000\000\000\000\000\000\000\000\000\000\017\201\000\000\000\000\017\201\000\000\000\000\000\000\017\201\000\000\000\000\017\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\201\000\000\017\201\017\201\000\000\017\201\017\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\201\000\000\017\201\000\000\017\201\017\201\017\209\017\209\017\201\000\000\000\000\017\209\000\000\017\201\000\000\017\209\017\201\004\018\000\000\017\201\000\000\017\201\017\201\000\000\000\000\017\209\017\209\017\209\000\000\017\209\017\209\017\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\209\000\000\000\000\000\000\000\000\000\000\000\000\017\209\017\209\004\214\000\000\000\000\017\209\000\000\000\000\000\000\000\000\000\000\017\209\000\000\000\000\017\209\000\000\000\000\000\000\000\000\000\000\017\209\017\209\017\209\000\000\000\000\000\000\000\000\000\000\000\000\017\209\000\000\017\209\017\209\000\000\000\000\000\000\000\000\000\000\017\209\000\000\000\000\017\209\000\000\000\000\000\000\017\209\000\000\000\000\017\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\209\000\000\017\209\017\209\000\000\017\209\017\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\209\000\000\017\209\000\000\017\209\017\209\017\217\017\217\017\209\000\000\000\000\017\217\000\000\017\209\000\000\017\217\017\209\004\018\000\000\017\209\000\000\017\209\017\209\000\000\000\000\017\217\017\217\017\217\000\000\017\217\017\217\017\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\217\000\000\000\000\000\000\000\000\000\000\000\000\017\217\017\217\004\n\000\000\000\000\017\217\000\000\000\000\000\000\000\000\000\000\017\217\000\000\000\000\017\217\000\000\000\000\000\000\000\000\000\000\017\217\017\217\017\217\000\000\000\000\000\000\000\000\000\000\000\000\017\217\000\000\017\217\017\217\000\000\000\000\000\000\000\000\000\000\017\217\000\000\000\000\017\217\000\000\000\000\000\000\017\217\000\000\000\000\017\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\217\000\000\017\217\017\217\000\000\017\217\017\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\217\000\000\017\217\000\000\017\217\017\217\017\225\017\225\017\217\000\000\000\000\017\225\000\000\017\217\000\000\017\225\017\217\004\018\000\000\017\217\000\000\017\217\017\217\000\000\000\000\017\225\017\225\017\225\000\000\017\225\017\225\017\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\225\000\000\000\000\000\000\000\000\000\000\000\000\017\225\017\225\004\214\000\000\000\000\017\225\000\000\000\000\000\000\000\000\000\000\017\225\000\000\000\000\017\225\000\000\000\000\000\000\000\000\000\000\017\225\017\225\017\225\000\000\000\000\000\000\000\000\000\000\000\000\017\225\000\000\017\225\017\225\000\000\000\000\000\000\000\000\000\000\017\225\000\000\000\000\017\225\000\000\000\000\000\000\017\225\000\000\000\000\017\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\225\000\000\017\225\017\225\000\000\017\225\017\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\225\000\000\017\225\000\000\017\225\017\225\017\233\017\233\017\225\000\000\000\000\017\233\000\000\017\225\000\000\017\233\017\225\004\018\000\000\017\225\000\000\017\225\017\225\000\000\000\000\017\233\017\233\017\233\000\000\017\233\017\233\017\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\233\000\000\000\000\000\000\000\000\000\000\000\000\017\233\017\233\004\n\000\000\000\000\017\233\000\000\000\000\000\000\000\000\000\000\017\233\000\000\000\000\017\233\000\000\000\000\000\000\000\000\000\000\017\233\017\233\017\233\000\000\000\000\000\000\000\000\000\000\000\000\017\233\000\000\017\233\017\233\000\000\000\000\000\000\000\000\000\000\017\233\000\000\000\000\017\233\000\000\000\000\000\000\017\233\000\000\000\000\017\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\233\000\000\017\233\017\233\000\000\017\233\017\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\233\000\000\017\233\000\000\017\233\017\233\017\241\017\241\017\233\000\000\000\000\017\241\000\000\017\233\000\000\017\241\017\233\004\018\000\000\017\233\000\000\017\233\017\233\000\000\000\000\017\241\017\241\017\241\000\000\017\241\017\241\017\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\241\000\000\000\000\000\000\000\000\000\000\000\000\017\241\017\241\004\214\000\000\000\000\017\241\000\000\000\000\000\000\000\000\000\000\017\241\000\000\000\000\017\241\000\000\000\000\000\000\000\000\000\000\017\241\017\241\017\241\000\000\000\000\000\000\000\000\000\000\000\000\017\241\000\000\017\241\017\241\000\000\000\000\000\000\000\000\000\000\017\241\000\000\000\000\017\241\000\000\000\000\000\000\017\241\000\000\000\000\017\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\241\000\000\017\241\017\241\000\000\017\241\017\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\241\000\000\017\241\000\000\017\241\017\241\017\249\017\249\017\241\000\000\000\000\017\249\000\000\017\241\000\000\017\249\017\241\004\018\000\000\017\241\000\000\017\241\017\241\000\000\000\000\017\249\017\249\017\249\000\000\017\249\017\249\017\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\249\000\000\000\000\000\000\000\000\000\000\000\000\017\249\017\249\004\n\000\000\000\000\017\249\000\000\000\000\000\000\000\000\000\000\017\249\000\000\000\000\017\249\000\000\000\000\000\000\000\000\000\000\017\249\017\249\017\249\000\000\000\000\000\000\000\000\000\000\000\000\017\249\000\000\017\249\017\249\000\000\000\000\000\000\000\000\000\000\017\249\000\000\000\000\017\249\000\000\000\000\000\000\017\249\000\000\000\000\017\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\249\000\000\017\249\017\249\000\000\017\249\017\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\249\000\000\017\249\000\000\017\249\017\249\018\001\018\001\017\249\000\000\000\000\018\001\000\000\017\249\000\000\018\001\017\249\004\018\000\000\017\249\000\000\017\249\017\249\000\000\000\000\018\001\018\001\018\001\000\000\018\001\018\001\018\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\001\000\000\000\000\000\000\000\000\000\000\000\000\018\001\018\001\004\214\000\000\000\000\018\001\000\000\000\000\000\000\000\000\000\000\018\001\000\000\000\000\018\001\000\000\000\000\000\000\000\000\000\000\018\001\018\001\018\001\000\000\000\000\000\000\000\000\000\000\000\000\018\001\000\000\018\001\018\001\000\000\000\000\000\000\000\000\000\000\018\001\000\000\000\000\018\001\000\000\000\000\000\000\018\001\000\000\000\000\018\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\001\000\000\018\001\018\001\000\000\018\001\018\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\001\000\000\018\001\000\000\018\001\018\001\018\t\018\t\018\001\000\000\000\000\018\t\000\000\018\001\000\000\018\t\018\001\004\018\000\000\018\001\000\000\018\001\018\001\000\000\000\000\018\t\018\t\018\t\000\000\018\t\018\t\018\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\t\000\000\000\000\000\000\000\000\000\000\000\000\018\t\018\t\004\n\000\000\000\000\018\t\000\000\000\000\000\000\000\000\000\000\018\t\000\000\000\000\018\t\000\000\000\000\000\000\000\000\000\000\018\t\018\t\018\t\000\000\000\000\000\000\000\000\000\000\000\000\018\t\000\000\018\t\018\t\000\000\000\000\000\000\000\000\000\000\018\t\000\000\000\000\018\t\000\000\000\000\000\000\018\t\000\000\000\000\018\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\t\000\000\018\t\018\t\000\000\018\t\018\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\t\000\000\018\t\000\000\018\t\018\t\018\017\018\017\018\t\000\000\000\000\018\017\000\000\018\t\000\000\018\017\018\t\004\018\000\000\018\t\000\000\018\t\018\t\000\000\000\000\018\017\018\017\018\017\000\000\018\017\018\017\018\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\017\000\000\000\000\000\000\000\000\000\000\000\000\018\017\018\017\004\214\000\000\000\000\018\017\000\000\000\000\000\000\000\000\000\000\018\017\000\000\000\000\018\017\000\000\000\000\000\000\000\000\000\000\018\017\018\017\018\017\000\000\000\000\000\000\000\000\000\000\000\000\018\017\000\000\018\017\018\017\000\000\000\000\000\000\000\000\000\000\018\017\000\000\000\000\018\017\000\000\000\000\000\000\018\017\000\000\000\000\018\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\017\000\000\018\017\018\017\000\000\018\017\018\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\017\000\000\018\017\000\000\018\017\018\017\018\201\018\201\018\017\000\000\000\000\018\201\000\000\018\017\000\000\018\201\018\017\004\018\000\000\018\017\000\000\018\017\018\017\000\000\000\000\018\201\018\201\018\201\000\000\018\201\018\201\018\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\201\000\000\000\000\000\000\000\000\000\000\000\000\018\201\018\201\004\n\000\000\000\000\018\201\000\000\000\000\000\000\000\000\000\000\018\201\000\000\000\000\018\201\000\000\000\000\000\000\000\000\000\000\018\201\018\201\018\201\000\000\000\000\000\000\000\000\000\000\000\000\018\201\000\000\018\201\018\201\000\000\000\000\000\000\000\000\000\000\018\201\000\000\000\000\018\201\000\000\000\000\000\000\018\201\000\000\000\000\018\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\201\000\000\018\201\018\201\000\000\018\201\018\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\201\000\000\018\201\000\000\018\201\018\201\018\209\018\209\018\201\000\000\000\000\018\209\000\000\018\201\000\000\018\209\018\201\004\018\000\000\018\201\000\000\018\201\018\201\000\000\000\000\018\209\018\209\018\209\000\000\018\209\018\209\018\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\209\000\000\000\000\000\000\000\000\000\000\000\000\018\209\018\209\004\214\000\000\000\000\018\209\000\000\000\000\000\000\000\000\000\000\018\209\000\000\000\000\018\209\000\000\000\000\000\000\000\000\000\000\018\209\018\209\018\209\000\000\000\000\000\000\000\000\000\000\000\000\018\209\000\000\018\209\018\209\000\000\000\000\000\000\000\000\000\000\018\209\000\000\000\000\018\209\000\000\000\000\000\000\018\209\000\000\000\000\018\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\209\000\000\018\209\018\209\000\000\018\209\018\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\209\000\000\018\209\000\000\018\209\018\209\018\217\018\217\018\209\000\000\000\000\018\217\000\000\018\209\000\000\018\217\018\209\004\018\000\000\018\209\000\000\018\209\018\209\000\000\000\000\018\217\018\217\018\217\000\000\018\217\018\217\018\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\217\000\000\000\000\000\000\000\000\000\000\000\000\018\217\018\217\004\n\000\000\000\000\018\217\000\000\000\000\000\000\000\000\000\000\018\217\000\000\000\000\018\217\000\000\000\000\000\000\000\000\000\000\018\217\018\217\018\217\000\000\000\000\000\000\000\000\000\000\000\000\018\217\000\000\018\217\018\217\000\000\000\000\000\000\000\000\000\000\018\217\000\000\000\000\018\217\000\000\000\000\000\000\018\217\000\000\000\000\018\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\217\000\000\018\217\018\217\000\000\018\217\018\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\217\000\000\018\217\000\000\018\217\018\217\018\225\018\225\018\217\000\000\000\000\018\225\000\000\018\217\000\000\018\225\018\217\004\018\000\000\018\217\000\000\018\217\018\217\000\000\000\000\018\225\018\225\018\225\000\000\018\225\018\225\018\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\225\000\000\000\000\000\000\000\000\000\000\000\000\018\225\018\225\004\214\000\000\000\000\018\225\000\000\000\000\000\000\000\000\000\000\018\225\000\000\000\000\018\225\000\000\000\000\000\000\000\000\000\000\018\225\018\225\018\225\000\000\000\000\000\000\000\000\000\000\000\000\018\225\000\000\018\225\018\225\000\000\000\000\000\000\000\000\000\000\018\225\000\000\000\000\018\225\000\000\000\000\000\000\018\225\000\000\000\000\018\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\225\000\000\018\225\018\225\000\000\018\225\018\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\225\000\000\018\225\000\000\018\225\018\225\018\169\018\169\018\225\000\000\000\000\018\169\000\000\018\225\000\000\018\169\018\225\004\018\000\000\018\225\000\000\018\225\018\225\000\000\000\000\018\169\018\169\018\169\000\000\018\169\018\169\018\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\169\000\000\000\000\000\000\000\000\000\000\000\000\018\169\018\169\004\n\000\000\000\000\018\169\000\000\000\000\000\000\000\000\000\000\018\169\000\000\000\000\018\169\000\000\000\000\000\000\000\000\000\000\018\169\018\169\018\169\000\000\000\000\000\000\000\000\000\000\000\000\018\169\000\000\018\169\018\169\000\000\000\000\000\000\000\000\000\000\018\169\000\000\000\000\018\169\000\000\000\000\000\000\018\169\000\000\000\000\018\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\169\000\000\018\169\018\169\000\000\018\169\018\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\169\000\000\018\169\000\000\018\169\018\169\018\177\018\177\018\169\000\000\000\000\018\177\000\000\018\169\000\000\018\177\018\169\004\018\000\000\018\169\000\000\018\169\018\169\000\000\000\000\018\177\018\177\018\177\000\000\018\177\018\177\018\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\177\000\000\000\000\000\000\000\000\000\000\000\000\018\177\018\177\004\214\000\000\000\000\018\177\000\000\000\000\000\000\000\000\000\000\018\177\000\000\000\000\018\177\000\000\000\000\000\000\000\000\000\000\018\177\018\177\018\177\000\000\000\000\000\000\000\000\000\000\000\000\018\177\000\000\018\177\018\177\000\000\000\000\000\000\000\000\000\000\018\177\000\000\000\000\018\177\000\000\000\000\000\000\018\177\000\000\000\000\018\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\177\000\000\018\177\018\177\000\000\018\177\018\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\177\000\000\018\177\000\000\018\177\018\177\018\185\018\185\018\177\000\000\000\000\018\185\000\000\018\177\000\000\018\185\018\177\004\018\000\000\018\177\000\000\018\177\018\177\000\000\000\000\018\185\018\185\018\185\000\000\018\185\018\185\018\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\185\000\000\000\000\000\000\000\000\000\000\000\000\018\185\018\185\004\n\000\000\000\000\018\185\000\000\000\000\000\000\000\000\000\000\018\185\000\000\000\000\018\185\000\000\000\000\000\000\000\000\000\000\018\185\018\185\018\185\000\000\000\000\000\000\000\000\000\000\000\000\018\185\000\000\018\185\018\185\000\000\000\000\000\000\000\000\000\000\018\185\000\000\000\000\018\185\000\000\000\000\000\000\018\185\000\000\000\000\018\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\185\000\000\018\185\018\185\000\000\018\185\018\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\185\000\000\018\185\000\000\018\185\018\185\018\193\018\193\018\185\000\000\000\000\018\193\000\000\018\185\000\000\018\193\018\185\004\018\000\000\018\185\000\000\018\185\018\185\000\000\000\000\018\193\018\193\018\193\000\000\018\193\018\193\018\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\193\000\000\000\000\000\000\000\000\000\000\000\000\018\193\018\193\004\214\000\000\000\000\018\193\000\000\000\000\000\000\000\000\000\000\018\193\000\000\000\000\018\193\000\000\000\000\000\000\000\000\000\000\018\193\018\193\018\193\000\000\000\000\000\000\000\000\000\000\000\000\018\193\000\000\018\193\018\193\000\000\000\000\000\000\000\000\000\000\018\193\000\000\000\000\018\193\000\000\000\000\000\000\018\193\000\000\000\000\018\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\193\000\000\018\193\018\193\000\000\018\193\018\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\193\000\000\018\193\000\000\018\193\018\193\018=\018=\018\193\000\000\000\000\018=\000\000\018\193\000\000\018=\018\193\004\018\000\000\018\193\000\000\018\193\018\193\000\000\000\000\018=\018=\018=\000\000\018=\018=\018=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018=\000\000\000\000\000\000\000\000\000\000\000\000\018=\018=\004*\000\000\000\000\018=\000\000\000\000\000\000\000\000\000\000\018=\000\000\000\000\018=\000\000\000\000\000\000\000\000\000\000\018=\018=\018=\000\000\000\000\000\000\000\000\000\000\000\000\018=\000\000\018=\018=\000\000\000\000\000\000\000\000\000\000\018=\000\000\000\000\018=\000\000\000\000\000\000\018=\000\000\000\000\018=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018=\000\000\018=\018=\000\000\018=\018=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018=\000\000\018=\000\000\018=\018=\018M\018M\018=\000\000\000\000\018M\000\000\018=\000\000\018M\018=\000\000\000\000\018=\000\000\018=\018=\000\000\000\000\018M\018M\018M\000\000\018M\018M\018M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018M\000\000\000\000\000\000\000\000\000\000\000\000\018M\018M\004*\000\000\000\000\018M\000\000\000\000\000\000\000\000\000\000\018M\000\000\000\000\018M\000\000\000\000\000\000\000\000\000\000\018M\018M\018M\000\000\000\000\000\000\000\000\000\000\000\000\018M\000\000\018M\018M\000\000\000\000\000\000\000\000\000\000\018M\000\000\000\000\018M\000\000\000\000\000\000\018M\000\000\000\000\018M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018M\000\000\018M\018M\000\000\018M\018M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018M\000\000\018M\000\000\018M\018M\018]\018]\018M\000\000\000\000\018]\000\000\018M\000\000\018]\018M\000\000\000\000\018M\000\000\018M\018M\000\000\000\000\018]\018]\018]\000\000\018]\018]\018]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018]\000\000\000\000\000\000\000\000\000\000\000\000\018]\018]\004*\000\000\000\000\018]\000\000\000\000\000\000\000\000\000\000\018]\000\000\000\000\018]\000\000\000\000\000\000\000\000\000\000\018]\018]\018]\000\000\000\000\000\000\000\000\000\000\000\000\018]\000\000\018]\018]\000\000\000\000\000\000\000\000\000\000\018]\000\000\000\000\018]\000\000\000\000\000\000\018]\000\000\000\000\018]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018]\000\000\018]\018]\000\000\018]\018]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018]\000\000\018]\000\000\018]\018]\018}\018}\018]\000\000\000\000\018}\000\000\018]\000\000\018}\018]\000\000\000\000\018]\000\000\018]\018]\000\000\000\000\018}\018}\018}\000\000\018}\018}\018}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018}\000\000\000\000\000\000\000\000\000\000\000\000\018}\018}\004*\000\000\000\000\018}\000\000\000\000\000\000\000\000\000\000\018}\000\000\000\000\018}\000\000\000\000\000\000\000\000\000\000\018}\018}\018}\000\000\000\000\000\000\000\000\000\000\000\000\018}\000\000\018}\018}\000\000\000\000\000\000\000\000\000\000\018}\000\000\000\000\018}\000\000\000\000\000\000\018}\000\000\000\000\018}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018}\000\000\018}\018}\000\000\018}\018}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018}\000\000\018}\000\000\018}\018}\018\133\018\133\018}\000\000\000\000\018\133\000\000\018}\000\000\018\133\018}\000\000\000\000\018}\000\000\018}\018}\000\000\000\000\018\133\018\133\018\133\000\000\018\133\018\133\018\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\133\000\000\000\000\000\000\000\000\000\000\000\000\018\133\018\133\004\242\000\000\000\000\018\133\000\000\000\000\000\000\000\000\000\000\018\133\000\000\000\000\018\133\000\000\000\000\000\000\000\000\000\000\018\133\018\133\018\133\000\000\000\000\000\000\000\000\000\000\000\000\018\133\000\000\018\133\018\133\000\000\000\000\000\000\000\000\000\000\018\133\000\000\000\000\018\133\000\000\000\000\000\000\018\133\000\000\000\000\018\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\133\000\000\018\133\018\133\000\000\018\133\018\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\133\000\000\018\133\000\000\018\133\018\133\018\141\018\141\018\133\000\000\000\000\018\141\000\000\018\133\000\000\018\141\018\133\000\000\000\000\018\133\000\000\018\133\018\133\000\000\000\000\018\141\018\141\018\141\000\000\018\141\018\141\018\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\141\000\000\000\000\000\000\000\000\000\000\000\000\018\141\018\141\004*\000\000\000\000\018\141\000\000\000\000\000\000\000\000\000\000\018\141\000\000\000\000\018\141\000\000\000\000\000\000\000\000\000\000\018\141\018\141\018\141\000\000\000\000\000\000\000\000\000\000\000\000\018\141\000\000\018\141\018\141\000\000\000\000\000\000\000\000\000\000\018\141\000\000\000\000\018\141\000\000\000\000\000\000\018\141\000\000\000\000\018\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\141\000\000\018\141\018\141\000\000\018\141\018\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\141\000\000\018\141\000\000\018\141\018\141\018\149\018\149\018\141\000\000\000\000\018\149\000\000\018\141\000\000\018\149\018\141\000\000\000\000\018\141\000\000\018\141\018\141\000\000\000\000\018\149\018\149\018\149\000\000\018\149\018\149\018\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\149\000\000\000\000\000\000\000\000\000\000\000\000\018\149\018\149\004\242\000\000\000\000\018\149\000\000\000\000\000\000\000\000\000\000\018\149\000\000\000\000\018\149\000\000\000\000\000\000\000\000\000\000\018\149\018\149\018\149\000\000\000\000\000\000\000\000\000\000\000\000\018\149\000\000\018\149\018\149\000\000\000\000\000\000\000\000\000\000\018\149\000\000\000\000\018\149\000\000\000\000\000\000\018\149\000\000\000\000\018\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\149\000\000\018\149\018\149\000\000\018\149\018\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\149\000\000\018\149\000\000\018\149\018\149\018e\018e\018\149\000\000\000\000\018e\000\000\018\149\000\000\018e\018\149\000\000\000\000\018\149\000\000\018\149\018\149\000\000\000\000\018e\018e\018e\000\000\018e\018e\018e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018e\000\000\000\000\000\000\000\000\000\000\000\000\018e\018e\004\242\000\000\000\000\018e\000\000\000\000\000\000\000\000\000\000\018e\000\000\000\000\018e\000\000\000\000\000\000\000\000\000\000\018e\018e\018e\000\000\000\000\000\000\000\000\000\000\000\000\018e\000\000\018e\018e\000\000\000\000\000\000\000\000\000\000\018e\000\000\000\000\018e\000\000\000\000\000\000\018e\000\000\000\000\018e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018e\000\000\018e\018e\000\000\018e\018e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018e\000\000\018e\000\000\018e\018e\018m\018m\018e\000\000\000\000\018m\000\000\018e\000\000\018m\018e\000\000\000\000\018e\000\000\018e\018e\000\000\000\000\018m\018m\018m\000\000\018m\018m\018m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018m\000\000\000\000\000\000\000\000\000\000\000\000\018m\018m\004*\000\000\000\000\018m\000\000\000\000\000\000\000\000\000\000\018m\000\000\000\000\018m\000\000\000\000\000\000\000\000\000\000\018m\018m\018m\000\000\000\000\000\000\000\000\000\000\000\000\018m\000\000\018m\018m\000\000\000\000\000\000\000\000\000\000\018m\000\000\000\000\018m\000\000\000\000\000\000\018m\000\000\000\000\018m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018m\000\000\018m\018m\000\000\018m\018m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018m\000\000\018m\000\000\018m\018m\018u\018u\018m\000\000\000\000\018u\000\000\018m\000\000\018u\018m\000\000\000\000\018m\000\000\018m\018m\000\000\000\000\018u\018u\018u\000\000\018u\018u\018u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018u\000\000\000\000\000\000\000\000\000\000\000\000\018u\018u\004\242\000\000\000\000\018u\000\000\000\000\000\000\000\000\000\000\018u\000\000\000\000\018u\000\000\000\000\000\000\000\000\000\000\018u\018u\018u\000\000\000\000\000\000\000\000\000\000\000\000\018u\000\000\018u\018u\000\000\000\000\000\000\000\000\000\000\018u\000\000\000\000\018u\000\000\000\000\000\000\018u\000\000\000\000\018u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018u\000\000\018u\018u\000\000\018u\018u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018u\000\000\018u\000\000\018u\018u\017\029\017\029\018u\000\000\000\000\017\029\000\000\018u\000\000\017\029\018u\000\000\000\000\018u\000\000\018u\018u\000\000\000\000\017\029\017\029\017\029\000\000\017\029\017\029\017\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\029\000\000\000\000\000\000\000\000\000\000\000\000\017\029\017\029\004*\000\000\000\000\017\029\000\000\000\000\000\000\000\000\000\000\017\029\000\000\000\000\017\029\000\000\000\000\000\000\000\000\000\000\017\029\017\029\017\029\000\000\000\000\000\000\000\000\000\000\000\000\017\029\000\000\017\029\017\029\000\000\000\000\000\000\000\000\000\000\017\029\000\000\000\000\017\029\000\000\000\000\000\000\017\029\000\000\000\000\017\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\029\000\000\017\029\017\029\000\000\017\029\017\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\029\000\000\017\029\000\000\017\029\017\029\017%\017%\017\029\000\000\000\000\017%\000\000\017\029\000\000\017%\017\029\000\000\000\000\017\029\000\000\017\029\017\029\000\000\000\000\017%\017%\017%\000\000\017%\017%\017%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017%\000\000\000\000\000\000\000\000\000\000\000\000\017%\017%\004\242\000\000\000\000\017%\000\000\000\000\000\000\000\000\000\000\017%\000\000\000\000\017%\000\000\000\000\000\000\000\000\000\000\017%\017%\017%\000\000\000\000\000\000\000\000\000\000\000\000\017%\000\000\017%\017%\000\000\000\000\000\000\000\000\000\000\017%\000\000\000\000\017%\000\000\000\000\000\000\017%\000\000\000\000\017%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017%\000\000\017%\017%\000\000\017%\017%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017%\000\000\017%\000\000\017%\017%\017-\017-\017%\000\000\000\000\017-\000\000\017%\000\000\017-\017%\000\000\000\000\017%\000\000\017%\017%\000\000\000\000\017-\017-\017-\000\000\017-\017-\017-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017-\000\000\000\000\000\000\000\000\000\000\000\000\017-\017-\004*\000\000\000\000\017-\000\000\000\000\000\000\000\000\000\000\017-\000\000\000\000\017-\000\000\000\000\000\000\000\000\000\000\017-\017-\017-\000\000\000\000\000\000\000\000\000\000\000\000\017-\000\000\017-\017-\000\000\000\000\000\000\000\000\000\000\017-\000\000\000\000\017-\000\000\000\000\000\000\017-\000\000\000\000\017-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017-\000\000\017-\017-\000\000\017-\017-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017-\000\000\017-\000\000\017-\017-\0175\0175\017-\000\000\000\000\0175\000\000\017-\000\000\0175\017-\000\000\000\000\017-\000\000\017-\017-\000\000\000\000\0175\0175\0175\000\000\0175\0175\0175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0175\000\000\000\000\000\000\000\000\000\000\000\000\0175\0175\004\242\000\000\000\000\0175\000\000\000\000\000\000\000\000\000\000\0175\000\000\000\000\0175\000\000\000\000\000\000\000\000\000\000\0175\0175\0175\000\000\000\000\000\000\000\000\000\000\000\000\0175\000\000\0175\0175\000\000\000\000\000\000\000\000\000\000\0175\000\000\000\000\0175\000\000\000\000\000\000\0175\000\000\000\000\0175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0175\000\000\0175\0175\000\000\0175\0175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0175\000\000\0175\000\000\0175\0175\017=\017=\0175\000\000\000\000\017=\000\000\0175\000\000\017=\0175\000\000\000\000\0175\000\000\0175\0175\000\000\000\000\017=\017=\017=\000\000\017=\017=\017=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017=\000\000\000\000\000\000\000\000\000\000\000\000\017=\017=\004*\000\000\000\000\017=\000\000\000\000\000\000\000\000\000\000\017=\000\000\000\000\017=\000\000\000\000\000\000\000\000\000\000\017=\017=\017=\000\000\000\000\000\000\000\000\000\000\000\000\017=\000\000\017=\017=\000\000\000\000\000\000\000\000\000\000\017=\000\000\000\000\017=\000\000\000\000\000\000\017=\000\000\000\000\017=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017=\000\000\017=\017=\000\000\017=\017=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017=\000\000\017=\000\000\017=\017=\017E\017E\017=\000\000\000\000\017E\000\000\017=\000\000\017E\017=\000\000\000\000\017=\000\000\017=\017=\000\000\000\000\017E\017E\017E\000\000\017E\017E\017E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017E\000\000\000\000\000\000\000\000\000\000\000\000\017E\017E\004\242\000\000\000\000\017E\000\000\000\000\000\000\000\000\000\000\017E\000\000\000\000\017E\000\000\000\000\000\000\000\000\000\000\017E\017E\017E\000\000\000\000\000\000\000\000\000\000\000\000\017E\000\000\017E\017E\000\000\000\000\000\000\000\000\000\000\017E\000\000\000\000\017E\000\000\000\000\000\000\017E\000\000\000\000\017E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017E\000\000\017E\017E\000\000\017E\017E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017E\000\000\017E\000\000\017E\017E\017M\017M\017E\000\000\000\000\017M\000\000\017E\000\000\017M\017E\000\000\000\000\017E\000\000\017E\017E\000\000\000\000\017M\017M\017M\000\000\017M\017M\017M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017M\000\000\000\000\000\000\000\000\000\000\000\000\017M\017M\004*\000\000\000\000\017M\000\000\000\000\000\000\000\000\000\000\017M\000\000\000\000\017M\000\000\000\000\000\000\000\000\000\000\017M\017M\017M\000\000\000\000\000\000\000\000\000\000\000\000\017M\000\000\017M\017M\000\000\000\000\000\000\000\000\000\000\017M\000\000\000\000\017M\000\000\000\000\000\000\017M\000\000\000\000\017M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017M\000\000\017M\017M\000\000\017M\017M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017M\000\000\017M\000\000\017M\017M\017U\017U\017M\000\000\000\000\017U\000\000\017M\000\000\017U\017M\000\000\000\000\017M\000\000\017M\017M\000\000\000\000\017U\017U\017U\000\000\017U\017U\017U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017U\000\000\000\000\000\000\000\000\000\000\000\000\017U\017U\004\242\000\000\000\000\017U\000\000\000\000\000\000\000\000\000\000\017U\000\000\000\000\017U\000\000\000\000\000\000\000\000\000\000\017U\017U\017U\000\000\000\000\000\000\000\000\000\000\000\000\017U\000\000\017U\017U\000\000\000\000\000\000\000\000\000\000\017U\000\000\000\000\017U\000\000\000\000\000\000\017U\000\000\000\000\017U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017U\000\000\017U\017U\000\000\017U\017U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017U\000\000\017U\000\000\017U\017U\017]\017]\017U\000\000\000\000\017]\000\000\017U\000\000\017]\017U\000\000\000\000\017U\000\000\017U\017U\000\000\000\000\017]\017]\017]\000\000\017]\017]\017]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017]\000\000\000\000\000\000\000\000\000\000\000\000\017]\017]\004*\000\000\000\000\017]\000\000\000\000\000\000\000\000\000\000\017]\000\000\000\000\017]\000\000\000\000\000\000\000\000\000\000\017]\017]\017]\000\000\000\000\000\000\000\000\000\000\000\000\017]\000\000\017]\017]\000\000\000\000\000\000\000\000\000\000\017]\000\000\000\000\017]\000\000\000\000\000\000\017]\000\000\000\000\017]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017]\000\000\017]\017]\000\000\017]\017]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017]\000\000\017]\000\000\017]\017]\017e\017e\017]\000\000\000\000\017e\000\000\017]\000\000\017e\017]\000\000\000\000\017]\000\000\017]\017]\000\000\000\000\017e\017e\017e\000\000\017e\017e\017e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017e\000\000\000\000\000\000\000\000\000\000\000\000\017e\017e\004\242\000\000\000\000\017e\000\000\000\000\000\000\000\000\000\000\017e\000\000\000\000\017e\000\000\000\000\000\000\000\000\000\000\017e\017e\017e\000\000\000\000\000\000\000\000\000\000\000\000\017e\000\000\017e\017e\000\000\000\000\000\000\000\000\000\000\017e\000\000\000\000\017e\000\000\000\000\000\000\017e\000\000\000\000\017e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017e\000\000\017e\017e\000\000\017e\017e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017e\000\000\017e\000\000\017e\017e\017m\017m\017e\000\000\000\000\017m\000\000\017e\000\000\017m\017e\000\000\000\000\017e\000\000\017e\017e\000\000\000\000\017m\017m\017m\000\000\017m\017m\017m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017m\000\000\000\000\000\000\000\000\000\000\000\000\017m\017m\004*\000\000\000\000\017m\000\000\000\000\000\000\000\000\000\000\017m\000\000\000\000\017m\000\000\000\000\000\000\000\000\000\000\017m\017m\017m\000\000\000\000\000\000\000\000\000\000\000\000\017m\000\000\017m\017m\000\000\000\000\000\000\000\000\000\000\017m\000\000\000\000\017m\000\000\000\000\000\000\017m\000\000\000\000\017m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017m\000\000\017m\017m\000\000\017m\017m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017m\000\000\017m\000\000\017m\017m\017u\017u\017m\000\000\000\000\017u\000\000\017m\000\000\017u\017m\000\000\000\000\017m\000\000\017m\017m\000\000\000\000\017u\017u\017u\000\000\017u\017u\017u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017u\000\000\000\000\000\000\000\000\000\000\000\000\017u\017u\004\242\000\000\000\000\017u\000\000\000\000\000\000\000\000\000\000\017u\000\000\000\000\017u\000\000\000\000\000\000\000\000\000\000\017u\017u\017u\000\000\000\000\000\000\000\000\000\000\000\000\017u\000\000\017u\017u\000\000\000\000\000\000\000\000\000\000\017u\000\000\000\000\017u\000\000\000\000\000\000\017u\000\000\000\000\017u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017u\000\000\017u\017u\000\000\017u\017u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017u\000\000\017u\000\000\017u\017u\017}\017}\017u\000\000\000\000\017}\000\000\017u\000\000\017}\017u\000\000\000\000\017u\000\000\017u\017u\000\000\000\000\017}\017}\017}\000\000\017}\017}\017}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017}\000\000\000\000\000\000\000\000\000\000\000\000\017}\017}\004*\000\000\000\000\017}\000\000\000\000\000\000\000\000\000\000\017}\000\000\000\000\017}\000\000\000\000\000\000\000\000\000\000\017}\017}\017}\000\000\000\000\000\000\000\000\000\000\000\000\017}\000\000\017}\017}\000\000\000\000\000\000\000\000\000\000\017}\000\000\000\000\017}\000\000\000\000\000\000\017}\000\000\000\000\017}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017}\000\000\017}\017}\000\000\017}\017}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017}\000\000\017}\000\000\017}\017}\017\133\017\133\017}\000\000\000\000\017\133\000\000\017}\000\000\017\133\017}\000\000\000\000\017}\000\000\017}\017}\000\000\000\000\017\133\017\133\017\133\000\000\017\133\017\133\017\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\133\000\000\000\000\000\000\000\000\000\000\000\000\017\133\017\133\004\242\000\000\000\000\017\133\000\000\000\000\000\000\000\000\000\000\017\133\000\000\000\000\017\133\000\000\000\000\000\000\000\000\000\000\017\133\017\133\017\133\000\000\000\000\000\000\000\000\000\000\000\000\017\133\000\000\017\133\017\133\000\000\000\000\000\000\000\000\000\000\017\133\000\000\000\000\017\133\000\000\000\000\000\000\017\133\000\000\000\000\017\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\133\000\000\017\133\017\133\000\000\017\133\017\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\133\000\000\017\133\000\000\017\133\017\133\017\141\017\141\017\133\000\000\000\000\017\141\000\000\017\133\000\000\017\141\017\133\000\000\000\000\017\133\000\000\017\133\017\133\000\000\000\000\017\141\017\141\017\141\000\000\017\141\017\141\017\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\141\000\000\000\000\000\000\000\000\000\000\000\000\017\141\017\141\004*\000\000\000\000\017\141\000\000\000\000\000\000\000\000\000\000\017\141\000\000\000\000\017\141\000\000\000\000\000\000\000\000\000\000\017\141\017\141\017\141\000\000\000\000\000\000\000\000\000\000\000\000\017\141\000\000\017\141\017\141\000\000\000\000\000\000\000\000\000\000\017\141\000\000\000\000\017\141\000\000\000\000\000\000\017\141\000\000\000\000\017\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\141\000\000\017\141\017\141\000\000\017\141\017\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\141\000\000\017\141\000\000\017\141\017\141\017\149\017\149\017\141\000\000\000\000\017\149\000\000\017\141\000\000\017\149\017\141\000\000\000\000\017\141\000\000\017\141\017\141\000\000\000\000\017\149\017\149\017\149\000\000\017\149\017\149\017\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\149\000\000\000\000\000\000\000\000\000\000\000\000\017\149\017\149\004\242\000\000\000\000\017\149\000\000\000\000\000\000\000\000\000\000\017\149\000\000\000\000\017\149\000\000\000\000\000\000\000\000\000\000\017\149\017\149\017\149\000\000\000\000\000\000\000\000\000\000\000\000\017\149\000\000\017\149\017\149\000\000\000\000\000\000\000\000\000\000\017\149\000\000\000\000\017\149\000\000\000\000\000\000\017\149\000\000\000\000\017\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\149\000\000\017\149\017\149\000\000\017\149\017\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\149\000\000\017\149\000\000\017\149\017\149\018U\018U\017\149\000\000\000\000\018U\000\000\017\149\000\000\018U\017\149\000\000\000\000\017\149\000\000\017\149\017\149\000\000\000\000\018U\018U\018U\000\000\018U\018U\018U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018U\000\000\000\000\000\000\000\000\000\000\000\000\018U\018U\004\242\000\000\000\000\018U\000\000\000\000\000\000\000\000\000\000\018U\000\000\000\000\018U\000\000\000\000\000\000\000\000\000\000\018U\018U\018U\000\000\000\000\000\000\000\000\000\000\000\000\018U\000\000\018U\018U\000\000\000\000\000\000\000\000\000\000\018U\000\000\000\000\018U\000\000\000\000\000\000\018U\000\000\000\000\018U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018U\000\000\018U\018U\000\000\018U\018U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018U\000\000\018U\000\000\018U\018U\018E\018E\018U\000\000\000\000\018E\000\000\018U\000\000\018E\018U\000\000\000\000\018U\000\000\018U\018U\000\000\000\000\018E\018E\018E\000\000\018E\018E\018E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018E\000\000\000\000\000\000\000\000\000\000\000\000\018E\018E\004\242\000\000\000\000\018E\000\000\000\000\000\000\000\000\000\000\018E\000\000\000\000\018E\000\000\000\000\000\000\000\000\000\000\018E\018E\018E\000\000\000\000\000\000\000\000\000\000\000\000\018E\000\000\018E\018E\000\000\000\000\000\000\000\000\000\000\018E\000\000\000\000\018E\000\000\000\000\000\000\018E\000\000\000\000\018E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018E\000\000\018E\018E\000\000\018E\018E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018E\000\000\018E\000\000\018E\018E\018\029\018\029\018E\000\000\000\000\018\029\000\000\018E\000\000\018\029\018E\000\000\000\000\018E\000\000\018E\018E\000\000\000\000\018\029\018\029\018\029\000\000\018\029\018\029\018\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\029\000\000\000\000\000\000\000\000\000\000\000\000\018\029\018\029\004*\000\000\000\000\018\029\000\000\000\000\000\000\000\000\000\000\018\029\000\000\000\000\018\029\000\000\000\000\000\000\000\000\000\000\018\029\018\029\018\029\000\000\000\000\000\000\000\000\000\000\000\000\018\029\000\000\018\029\018\029\000\000\000\000\000\000\000\000\000\000\018\029\000\000\000\000\018\029\000\000\000\000\000\000\018\029\000\000\000\000\018\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\029\000\000\018\029\018\029\000\000\018\029\018\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\029\000\000\018\029\000\000\018\029\018\029\018%\018%\018\029\000\000\000\000\018%\000\000\018\029\000\000\018%\018\029\000\000\000\000\018\029\000\000\018\029\018\029\000\000\000\000\018%\018%\018%\000\000\018%\018%\018%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018%\000\000\000\000\000\000\000\000\000\000\000\000\018%\018%\004\242\000\000\000\000\018%\000\000\000\000\000\000\000\000\000\000\018%\000\000\000\000\018%\000\000\000\000\000\000\000\000\000\000\018%\018%\018%\000\000\000\000\000\000\000\000\000\000\000\000\018%\000\000\018%\018%\000\000\000\000\000\000\000\000\000\000\018%\000\000\000\000\018%\000\000\000\000\000\000\018%\000\000\000\000\018%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018%\000\000\018%\018%\000\000\018%\018%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018%\000\000\018%\000\000\018%\018%\018-\018-\018%\000\000\000\000\018-\000\000\018%\000\000\018-\018%\000\000\000\000\018%\000\000\018%\018%\000\000\000\000\018-\018-\018-\000\000\018-\018-\018-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018-\000\000\000\000\000\000\000\000\000\000\000\000\018-\018-\004*\000\000\000\000\018-\000\000\000\000\000\000\000\000\000\000\018-\000\000\000\000\018-\000\000\000\000\000\000\000\000\000\000\018-\018-\018-\000\000\000\000\000\000\000\000\000\000\000\000\018-\000\000\018-\018-\000\000\000\000\000\000\000\000\000\000\018-\000\000\000\000\018-\000\000\000\000\000\000\018-\000\000\000\000\018-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018-\000\000\018-\018-\000\000\018-\018-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018-\000\000\018-\000\000\018-\018-\0185\0185\018-\000\000\000\000\0185\000\000\018-\000\000\0185\018-\000\000\000\000\018-\000\000\018-\018-\000\000\000\000\0185\0185\0185\000\000\0185\0185\0185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0185\000\000\000\000\000\000\000\000\000\000\000\000\0185\0185\004\242\000\000\000\000\0185\000\000\000\000\000\000\000\000\000\000\0185\000\000\000\000\0185\000\000\000\000\000\000\000\000\000\000\0185\0185\0185\000\000\000\000\000\000\000\000\000\000\000\000\0185\000\000\0185\0185\000\000\000\000\000\000\000\000\000\000\0185\000\000\000\000\0185\000\000\000\000\000\000\0185\000\000\000\000\0185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0185\000\000\0185\0185\000\000\0185\0185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0185\000\000\0185\000\000\0185\0185\017\157\017\157\0185\000\000\000\000\017\157\000\000\0185\000\000\017\157\0185\000\000\000\000\0185\000\000\0185\0185\000\000\000\000\017\157\017\157\017\157\000\000\017\157\017\157\017\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\157\000\000\000\000\000\000\000\000\000\000\000\000\017\157\017\157\004*\000\000\000\000\017\157\000\000\000\000\000\000\000\000\000\000\017\157\000\000\000\000\017\157\000\000\000\000\000\000\000\000\000\000\017\157\017\157\017\157\000\000\000\000\000\000\000\000\000\000\000\000\017\157\000\000\017\157\017\157\000\000\000\000\000\000\000\000\000\000\017\157\000\000\000\000\017\157\000\000\000\000\000\000\017\157\000\000\000\000\017\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\157\000\000\017\157\017\157\000\000\017\157\017\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\157\000\000\017\157\000\000\017\157\017\157\017\165\017\165\017\157\000\000\000\000\017\165\000\000\017\157\000\000\017\165\017\157\000\000\000\000\017\157\000\000\017\157\017\157\000\000\000\000\017\165\017\165\017\165\000\000\017\165\017\165\017\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\165\000\000\000\000\000\000\000\000\000\000\000\000\017\165\017\165\004\242\000\000\000\000\017\165\000\000\000\000\000\000\000\000\000\000\017\165\000\000\000\000\017\165\000\000\000\000\000\000\000\000\000\000\017\165\017\165\017\165\000\000\000\000\000\000\000\000\000\000\000\000\017\165\000\000\017\165\017\165\000\000\000\000\000\000\000\000\000\000\017\165\000\000\000\000\017\165\000\000\000\000\000\000\017\165\000\000\000\000\017\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\165\000\000\017\165\017\165\000\000\017\165\017\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\165\000\000\017\165\000\000\017\165\017\165\017\173\017\173\017\165\000\000\000\000\017\173\000\000\017\165\000\000\017\173\017\165\000\000\000\000\017\165\000\000\017\165\017\165\000\000\000\000\017\173\017\173\017\173\000\000\017\173\017\173\017\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\173\000\000\000\000\000\000\000\000\000\000\000\000\017\173\017\173\004*\000\000\000\000\017\173\000\000\000\000\000\000\000\000\000\000\017\173\000\000\000\000\017\173\000\000\000\000\000\000\000\000\000\000\017\173\017\173\017\173\000\000\000\000\000\000\000\000\000\000\000\000\017\173\000\000\017\173\017\173\000\000\000\000\000\000\000\000\000\000\017\173\000\000\000\000\017\173\000\000\000\000\000\000\017\173\000\000\000\000\017\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\173\000\000\017\173\017\173\000\000\017\173\017\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\173\000\000\017\173\000\000\017\173\017\173\017\181\017\181\017\173\000\000\000\000\017\181\000\000\017\173\000\000\017\181\017\173\000\000\000\000\017\173\000\000\017\173\017\173\000\000\000\000\017\181\017\181\017\181\000\000\017\181\017\181\017\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\181\000\000\000\000\000\000\000\000\000\000\000\000\017\181\017\181\004\242\000\000\000\000\017\181\000\000\000\000\000\000\000\000\000\000\017\181\000\000\000\000\017\181\000\000\000\000\000\000\000\000\000\000\017\181\017\181\017\181\000\000\000\000\000\000\000\000\000\000\000\000\017\181\000\000\017\181\017\181\000\000\000\000\000\000\000\000\000\000\017\181\000\000\000\000\017\181\000\000\000\000\000\000\017\181\000\000\000\000\017\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\181\000\000\017\181\017\181\000\000\017\181\017\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\181\000\000\017\181\000\000\017\181\017\181\017\189\017\189\017\181\000\000\000\000\017\189\000\000\017\181\000\000\017\189\017\181\000\000\000\000\017\181\000\000\017\181\017\181\000\000\000\000\017\189\017\189\017\189\000\000\017\189\017\189\017\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\189\000\000\000\000\000\000\000\000\000\000\000\000\017\189\017\189\004*\000\000\000\000\017\189\000\000\000\000\000\000\000\000\000\000\017\189\000\000\000\000\017\189\000\000\000\000\000\000\000\000\000\000\017\189\017\189\017\189\000\000\000\000\000\000\000\000\000\000\000\000\017\189\000\000\017\189\017\189\000\000\000\000\000\000\000\000\000\000\017\189\000\000\000\000\017\189\000\000\000\000\000\000\017\189\000\000\000\000\017\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\189\000\000\017\189\017\189\000\000\017\189\017\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\189\000\000\017\189\000\000\017\189\017\189\017\197\017\197\017\189\000\000\000\000\017\197\000\000\017\189\000\000\017\197\017\189\000\000\000\000\017\189\000\000\017\189\017\189\000\000\000\000\017\197\017\197\017\197\000\000\017\197\017\197\017\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\197\000\000\000\000\000\000\000\000\000\000\000\000\017\197\017\197\004\242\000\000\000\000\017\197\000\000\000\000\000\000\000\000\000\000\017\197\000\000\000\000\017\197\000\000\000\000\000\000\000\000\000\000\017\197\017\197\017\197\000\000\000\000\000\000\000\000\000\000\000\000\017\197\000\000\017\197\017\197\000\000\000\000\000\000\000\000\000\000\017\197\000\000\000\000\017\197\000\000\000\000\000\000\017\197\000\000\000\000\017\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\197\000\000\017\197\017\197\000\000\017\197\017\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\197\000\000\017\197\000\000\017\197\017\197\017\205\017\205\017\197\000\000\000\000\017\205\000\000\017\197\000\000\017\205\017\197\000\000\000\000\017\197\000\000\017\197\017\197\000\000\000\000\017\205\017\205\017\205\000\000\017\205\017\205\017\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\205\000\000\000\000\000\000\000\000\000\000\000\000\017\205\017\205\004*\000\000\000\000\017\205\000\000\000\000\000\000\000\000\000\000\017\205\000\000\000\000\017\205\000\000\000\000\000\000\000\000\000\000\017\205\017\205\017\205\000\000\000\000\000\000\000\000\000\000\000\000\017\205\000\000\017\205\017\205\000\000\000\000\000\000\000\000\000\000\017\205\000\000\000\000\017\205\000\000\000\000\000\000\017\205\000\000\000\000\017\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\205\000\000\017\205\017\205\000\000\017\205\017\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\205\000\000\017\205\000\000\017\205\017\205\017\213\017\213\017\205\000\000\000\000\017\213\000\000\017\205\000\000\017\213\017\205\000\000\000\000\017\205\000\000\017\205\017\205\000\000\000\000\017\213\017\213\017\213\000\000\017\213\017\213\017\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\213\000\000\000\000\000\000\000\000\000\000\000\000\017\213\017\213\004\242\000\000\000\000\017\213\000\000\000\000\000\000\000\000\000\000\017\213\000\000\000\000\017\213\000\000\000\000\000\000\000\000\000\000\017\213\017\213\017\213\000\000\000\000\000\000\000\000\000\000\000\000\017\213\000\000\017\213\017\213\000\000\000\000\000\000\000\000\000\000\017\213\000\000\000\000\017\213\000\000\000\000\000\000\017\213\000\000\000\000\017\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\213\000\000\017\213\017\213\000\000\017\213\017\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\213\000\000\017\213\000\000\017\213\017\213\017\221\017\221\017\213\000\000\000\000\017\221\000\000\017\213\000\000\017\221\017\213\000\000\000\000\017\213\000\000\017\213\017\213\000\000\000\000\017\221\017\221\017\221\000\000\017\221\017\221\017\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\221\000\000\000\000\000\000\000\000\000\000\000\000\017\221\017\221\004*\000\000\000\000\017\221\000\000\000\000\000\000\000\000\000\000\017\221\000\000\000\000\017\221\000\000\000\000\000\000\000\000\000\000\017\221\017\221\017\221\000\000\000\000\000\000\000\000\000\000\000\000\017\221\000\000\017\221\017\221\000\000\000\000\000\000\000\000\000\000\017\221\000\000\000\000\017\221\000\000\000\000\000\000\017\221\000\000\000\000\017\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\221\000\000\017\221\017\221\000\000\017\221\017\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\221\000\000\017\221\000\000\017\221\017\221\017\229\017\229\017\221\000\000\000\000\017\229\000\000\017\221\000\000\017\229\017\221\000\000\000\000\017\221\000\000\017\221\017\221\000\000\000\000\017\229\017\229\017\229\000\000\017\229\017\229\017\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\229\000\000\000\000\000\000\000\000\000\000\000\000\017\229\017\229\004\242\000\000\000\000\017\229\000\000\000\000\000\000\000\000\000\000\017\229\000\000\000\000\017\229\000\000\000\000\000\000\000\000\000\000\017\229\017\229\017\229\000\000\000\000\000\000\000\000\000\000\000\000\017\229\000\000\017\229\017\229\000\000\000\000\000\000\000\000\000\000\017\229\000\000\000\000\017\229\000\000\000\000\000\000\017\229\000\000\000\000\017\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\229\000\000\017\229\017\229\000\000\017\229\017\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\229\000\000\017\229\000\000\017\229\017\229\017\237\017\237\017\229\000\000\000\000\017\237\000\000\017\229\000\000\017\237\017\229\000\000\000\000\017\229\000\000\017\229\017\229\000\000\000\000\017\237\017\237\017\237\000\000\017\237\017\237\017\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\237\000\000\000\000\000\000\000\000\000\000\000\000\017\237\017\237\004*\000\000\000\000\017\237\000\000\000\000\000\000\000\000\000\000\017\237\000\000\000\000\017\237\000\000\000\000\000\000\000\000\000\000\017\237\017\237\017\237\000\000\000\000\000\000\000\000\000\000\000\000\017\237\000\000\017\237\017\237\000\000\000\000\000\000\000\000\000\000\017\237\000\000\000\000\017\237\000\000\000\000\000\000\017\237\000\000\000\000\017\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\237\000\000\017\237\017\237\000\000\017\237\017\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\237\000\000\017\237\000\000\017\237\017\237\017\245\017\245\017\237\000\000\000\000\017\245\000\000\017\237\000\000\017\245\017\237\000\000\000\000\017\237\000\000\017\237\017\237\000\000\000\000\017\245\017\245\017\245\000\000\017\245\017\245\017\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\245\000\000\000\000\000\000\000\000\000\000\000\000\017\245\017\245\004\242\000\000\000\000\017\245\000\000\000\000\000\000\000\000\000\000\017\245\000\000\000\000\017\245\000\000\000\000\000\000\000\000\000\000\017\245\017\245\017\245\000\000\000\000\000\000\000\000\000\000\000\000\017\245\000\000\017\245\017\245\000\000\000\000\000\000\000\000\000\000\017\245\000\000\000\000\017\245\000\000\000\000\000\000\017\245\000\000\000\000\017\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\245\000\000\017\245\017\245\000\000\017\245\017\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\245\000\000\017\245\000\000\017\245\017\245\017\253\017\253\017\245\000\000\000\000\017\253\000\000\017\245\000\000\017\253\017\245\000\000\000\000\017\245\000\000\017\245\017\245\000\000\000\000\017\253\017\253\017\253\000\000\017\253\017\253\017\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\253\000\000\000\000\000\000\000\000\000\000\000\000\017\253\017\253\004*\000\000\000\000\017\253\000\000\000\000\000\000\000\000\000\000\017\253\000\000\000\000\017\253\000\000\000\000\000\000\000\000\000\000\017\253\017\253\017\253\000\000\000\000\000\000\000\000\000\000\000\000\017\253\000\000\017\253\017\253\000\000\000\000\000\000\000\000\000\000\017\253\000\000\000\000\017\253\000\000\000\000\000\000\017\253\000\000\000\000\017\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\253\000\000\017\253\017\253\000\000\017\253\017\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\253\000\000\017\253\000\000\017\253\017\253\018\005\018\005\017\253\000\000\000\000\018\005\000\000\017\253\000\000\018\005\017\253\000\000\000\000\017\253\000\000\017\253\017\253\000\000\000\000\018\005\018\005\018\005\000\000\018\005\018\005\018\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\005\000\000\000\000\000\000\000\000\000\000\000\000\018\005\018\005\004\242\000\000\000\000\018\005\000\000\000\000\000\000\000\000\000\000\018\005\000\000\000\000\018\005\000\000\000\000\000\000\000\000\000\000\018\005\018\005\018\005\000\000\000\000\000\000\000\000\000\000\000\000\018\005\000\000\018\005\018\005\000\000\000\000\000\000\000\000\000\000\018\005\000\000\000\000\018\005\000\000\000\000\000\000\018\005\000\000\000\000\018\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\005\000\000\018\005\018\005\000\000\018\005\018\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\005\000\000\018\005\000\000\018\005\018\005\018\r\018\r\018\005\000\000\000\000\018\r\000\000\018\005\000\000\018\r\018\005\000\000\000\000\018\005\000\000\018\005\018\005\000\000\000\000\018\r\018\r\018\r\000\000\018\r\018\r\018\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\r\000\000\000\000\000\000\000\000\000\000\000\000\018\r\018\r\004*\000\000\000\000\018\r\000\000\000\000\000\000\000\000\000\000\018\r\000\000\000\000\018\r\000\000\000\000\000\000\000\000\000\000\018\r\018\r\018\r\000\000\000\000\000\000\000\000\000\000\000\000\018\r\000\000\018\r\018\r\000\000\000\000\000\000\000\000\000\000\018\r\000\000\000\000\018\r\000\000\000\000\000\000\018\r\000\000\000\000\018\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\r\000\000\018\r\018\r\000\000\018\r\018\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\r\000\000\018\r\000\000\018\r\018\r\018\021\018\021\018\r\000\000\000\000\018\021\000\000\018\r\000\000\018\021\018\r\000\000\000\000\018\r\000\000\018\r\018\r\000\000\000\000\018\021\018\021\018\021\000\000\018\021\018\021\018\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\021\000\000\000\000\000\000\000\000\000\000\000\000\018\021\018\021\004\242\000\000\000\000\018\021\000\000\000\000\000\000\000\000\000\000\018\021\000\000\000\000\018\021\000\000\000\000\000\000\000\000\000\000\018\021\018\021\018\021\000\000\000\000\000\000\000\000\000\000\000\000\018\021\000\000\018\021\018\021\000\000\000\000\000\000\000\000\000\000\018\021\000\000\000\000\018\021\000\000\000\000\000\000\018\021\000\000\000\000\018\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\021\000\000\018\021\018\021\000\000\018\021\018\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\021\000\000\018\021\000\000\018\021\018\021\018\205\018\205\018\021\000\000\000\000\018\205\000\000\018\021\000\000\018\205\018\021\000\000\000\000\018\021\000\000\018\021\018\021\000\000\000\000\018\205\018\205\018\205\000\000\018\205\018\205\018\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\205\000\000\000\000\000\000\000\000\000\000\000\000\018\205\018\205\004*\000\000\000\000\018\205\000\000\000\000\000\000\000\000\000\000\018\205\000\000\000\000\018\205\000\000\000\000\000\000\000\000\000\000\018\205\018\205\018\205\000\000\000\000\000\000\000\000\000\000\000\000\018\205\000\000\018\205\018\205\000\000\000\000\000\000\000\000\000\000\018\205\000\000\000\000\018\205\000\000\000\000\000\000\018\205\000\000\000\000\018\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\205\000\000\018\205\018\205\000\000\018\205\018\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\205\000\000\018\205\000\000\018\205\018\205\018\213\018\213\018\205\000\000\000\000\018\213\000\000\018\205\000\000\018\213\018\205\000\000\000\000\018\205\000\000\018\205\018\205\000\000\000\000\018\213\018\213\018\213\000\000\018\213\018\213\018\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\213\000\000\000\000\000\000\000\000\000\000\000\000\018\213\018\213\004\242\000\000\000\000\018\213\000\000\000\000\000\000\000\000\000\000\018\213\000\000\000\000\018\213\000\000\000\000\000\000\000\000\000\000\018\213\018\213\018\213\000\000\000\000\000\000\000\000\000\000\000\000\018\213\000\000\018\213\018\213\000\000\000\000\000\000\000\000\000\000\018\213\000\000\000\000\018\213\000\000\000\000\000\000\018\213\000\000\000\000\018\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\213\000\000\018\213\018\213\000\000\018\213\018\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\213\000\000\018\213\000\000\018\213\018\213\018\221\018\221\018\213\000\000\000\000\018\221\000\000\018\213\000\000\018\221\018\213\000\000\000\000\018\213\000\000\018\213\018\213\000\000\000\000\018\221\018\221\018\221\000\000\018\221\018\221\018\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\221\000\000\000\000\000\000\000\000\000\000\000\000\018\221\018\221\004*\000\000\000\000\018\221\000\000\000\000\000\000\000\000\000\000\018\221\000\000\000\000\018\221\000\000\000\000\000\000\000\000\000\000\018\221\018\221\018\221\000\000\000\000\000\000\000\000\000\000\000\000\018\221\000\000\018\221\018\221\000\000\000\000\000\000\000\000\000\000\018\221\000\000\000\000\018\221\000\000\000\000\000\000\018\221\000\000\000\000\018\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\221\000\000\018\221\018\221\000\000\018\221\018\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\221\000\000\018\221\000\000\018\221\018\221\018\229\018\229\018\221\000\000\000\000\018\229\000\000\018\221\000\000\018\229\018\221\000\000\000\000\018\221\000\000\018\221\018\221\000\000\000\000\018\229\018\229\018\229\000\000\018\229\018\229\018\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\229\000\000\000\000\000\000\000\000\000\000\000\000\018\229\018\229\004\242\000\000\000\000\018\229\000\000\000\000\000\000\000\000\000\000\018\229\000\000\000\000\018\229\000\000\000\000\000\000\000\000\000\000\018\229\018\229\018\229\000\000\000\000\000\000\000\000\000\000\000\000\018\229\000\000\018\229\018\229\000\000\000\000\000\000\000\000\000\000\018\229\000\000\000\000\018\229\000\000\000\000\000\000\018\229\000\000\000\000\018\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\229\000\000\018\229\018\229\000\000\018\229\018\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\229\000\000\018\229\000\000\018\229\018\229\018\173\018\173\018\229\000\000\000\000\018\173\000\000\018\229\000\000\018\173\018\229\000\000\000\000\018\229\000\000\018\229\018\229\000\000\000\000\018\173\018\173\018\173\000\000\018\173\018\173\018\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\173\000\000\000\000\000\000\000\000\000\000\000\000\018\173\018\173\004*\000\000\000\000\018\173\000\000\000\000\000\000\000\000\000\000\018\173\000\000\000\000\018\173\000\000\000\000\000\000\000\000\000\000\018\173\018\173\018\173\000\000\000\000\000\000\000\000\000\000\000\000\018\173\000\000\018\173\018\173\000\000\000\000\000\000\000\000\000\000\018\173\000\000\000\000\018\173\000\000\000\000\000\000\018\173\000\000\000\000\018\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\173\000\000\018\173\018\173\000\000\018\173\018\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\173\000\000\018\173\000\000\018\173\018\173\018\181\018\181\018\173\000\000\000\000\018\181\000\000\018\173\000\000\018\181\018\173\000\000\000\000\018\173\000\000\018\173\018\173\000\000\000\000\018\181\018\181\018\181\000\000\018\181\018\181\018\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\181\000\000\000\000\000\000\000\000\000\000\000\000\018\181\018\181\004\242\000\000\000\000\018\181\000\000\000\000\000\000\000\000\000\000\018\181\000\000\000\000\018\181\000\000\000\000\000\000\000\000\000\000\018\181\018\181\018\181\000\000\000\000\000\000\000\000\000\000\000\000\018\181\000\000\018\181\018\181\000\000\000\000\000\000\000\000\000\000\018\181\000\000\000\000\018\181\000\000\000\000\000\000\018\181\000\000\000\000\018\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\181\000\000\018\181\018\181\000\000\018\181\018\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\181\000\000\018\181\000\000\018\181\018\181\018\189\018\189\018\181\000\000\000\000\018\189\000\000\018\181\000\000\018\189\018\181\000\000\000\000\018\181\000\000\018\181\018\181\000\000\000\000\018\189\018\189\018\189\000\000\018\189\018\189\018\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\189\000\000\000\000\000\000\000\000\000\000\000\000\018\189\018\189\004*\000\000\000\000\018\189\000\000\000\000\000\000\000\000\000\000\018\189\000\000\000\000\018\189\000\000\000\000\000\000\000\000\000\000\018\189\018\189\018\189\000\000\000\000\000\000\000\000\000\000\000\000\018\189\000\000\018\189\018\189\000\000\000\000\000\000\000\000\000\000\018\189\000\000\000\000\018\189\000\000\000\000\000\000\018\189\000\000\000\000\018\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\189\000\000\018\189\018\189\000\000\018\189\018\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\189\000\000\018\189\000\000\018\189\018\189\018\197\018\197\018\189\000\000\000\000\018\197\000\000\018\189\000\000\018\197\018\189\000\000\000\000\018\189\000\000\018\189\018\189\000\000\000\000\018\197\018\197\018\197\000\000\018\197\018\197\018\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\197\000\000\000\000\000\000\000\000\000\000\000\000\018\197\018\197\004\242\000\000\000\000\018\197\000\000\000\000\000\000\000\000\000\000\018\197\000\000\000\000\018\197\000\000\000\000\000\000\000\000\000\000\018\197\018\197\018\197\000\000\000\000\000\000\000\000\000\000\000\000\018\197\000\000\018\197\018\197\000\000\000\000\000\000\000\000\000\000\018\197\000\000\000\000\018\197\000\000\000\000\000\000\018\197\000\000\000\000\018\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\197\000\000\018\197\018\197\000\000\018\197\018\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\197\000\000\018\197\000\000\018\197\018\197\002U\002U\018\197\000\000\000\000\002U\000\000\018\197\000\000\002U\018\197\000\000\000\000\018\197\000\000\018\197\018\197\000\000\000\000\002U\002U\002U\000\000\002U\002U\002U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002U\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\002U\000\000\000\000\002U\000\000\000\000\000\000\000\000\000\000\002U\000\000\000\000\002U\000\000\000\000\000\000\000\000\000\000\002U\002U\002U\000\000\000\000\000\000\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\000\000\000\000\000\000\000\000\002U\000\000\000\000\002U\000\000\000\000\000\000\002U\000\000\000\000\002U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\002U\002U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002U\000\000\002U\000\000\002U\002U\007\222\003r\002U\000\000\003B\000\000\012\226\002U\000\000\007\198\002U\000\000\000\000\005z\000\000\002U\000\000\000\000\000\000\001\250\000\000\r&\000\000\000\000\000\000\000\000\b\026\000\000\000\000\015\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\015\238\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\015m\t\130\000\000\t\138\000\000\016^\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\165\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\000\000\000\000\000\000\021\002\000\000\001\218\b\241\b\241\000\000\000\000\b\241\000\000\b\241\000\000\000\000\b\241\000\000\015m\000\000\000\000\000\000\015m\015m\000\000\t\238\b\241\b\241\000\000\015m\000\000\003\238\000\000\b\241\000\000\015m\006\165\000\000\001\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\241\000\000\000\000\b\241\001\226\b\241\000\000\000\000\000\000\b\241\000\000\b\241\b\241\b\241\b\241\b\241\000\000\000\000\000\000\b\241\000\000\b\241\b\241\b\241\000\000\000\000\b\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\241\b\241\b\241\000\000\b\241\001\218\b\245\b\245\000\000\000\000\b\245\000\000\b\245\b\241\b\241\b\245\000\000\b\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\245\b\245\000\000\000\000\000\000\000\000\000\000\b\245\000\000\000\000\000\000\000\000\001\222\000\000\b\241\000\000\000\000\000\000\000\000\000\000\b\241\000\000\b\245\000\000\000\000\b\245\001\226\b\245\000\000\000\000\000\000\b\245\000\000\b\245\b\245\b\245\b\245\b\245\000\000\000\000\000\000\b\245\000\000\b\245\b\245\b\245\000\000\000\000\b\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\245\b\245\b\245\000\000\b\245\001\218\b\237\b\237\000\000\000\000\b\237\000\000\b\237\b\245\b\245\b\237\000\000\b\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237\b\237\000\000\000\000\000\000\000\000\000\000\b\237\000\000\000\000\000\000\000\000\001\222\000\000\b\245\000\000\000\000\000\000\000\000\000\000\b\245\000\000\b\237\000\000\000\000\b\237\001\226\b\237\000\000\000\000\000\000\b\237\000\000\b\237\b\237\b\237\b\237\b\237\000\000\000\000\000\000\b\237\000\000\b\237\b\237\b\237\000\000\000\000\b\237\000\000\000\000\000\000\000\000\000\000\r)\000\000\000\000\025\222\000\000\b\237\b\237\b\237\000\000\b\237\000\000\000\000\024F\000\000\000\000\000\000\000\000\018:\b\237\b\237\022\150\r)\b\237\r)\r)\000\000\000\000\000\000\000\000\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\237\018\210\000\000\019J\019b\000\000\b\237\000\000\000\000\000\000\000\000\000\000\000\000\019z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018R\018\234\019\146\019\170\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\"\000\000\000\000\000\000\000\000\025\246\000\000\000\000\000\000\000\000\000\000\020:\000\000\000\000\000\000\000\000\024J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\154\r)\000\000\020\210\019\194\000\000\006\225\006\225\006\225\r)\020R\006\225\000\000\006\225\019\218\019\242\006\225\000\000\000\000\000\000\020j\020\130\006\225\000\000\000\000\000\000\006\225\000\000\000\000\000\000\000\000\000\000\000\000\006\225%\250\000\000\000\000&\018\006\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\225\000\000\000\000\006\225\006\225\006\225\000\000\000\000\000\000\000\000\000\000\006\225\001\n\000\000\006\225\006\225\000\000\000\000\000\242\006\225\000\000\006\225\006\225\006\225\000\000\000\000\006\225\000\000\000\000\001\014\000\000\000\000\000\000\003N\000\000\000\000\000\000\006\225\006\225\006\225\000\000\006\225\001\018\001\022\001\026\001\030\001\"\001&\000\000\000\000\006\225\006\225\001\218\001\242\001\246\000\000\001*\0012\000\000\0016\001:\000\000\000\000\000\000\000\000\000\000\001>\000\000\000\000\001B\000\000\000\000\001\250\0022\000\000\000\000\006\225\000\000\000\000\000\000\000\000\000\000\006\225\000\000\001\222\000\000\000\000\000\000\000\000\001F\001J\001N\001R\001V\000\000\000\000\000\000\002f\001\226\004N\001Z\000\000\000\000\003R\001^\003b\003\150\003\162\000\000\000\000\000\000\000\000\000\000\003\174\000\000\001b\000\000\b9\b9\000\000\000\000\001f\b9\000\000\000\000\000\000\b9\000\000\000\000\000\000\000\000\000\000\001\162,\158\000\000\003\178\b9\000\000\b9\001\166\b9\001\170\b9\001\174\001\178\000\000\000\000\001\182\000\000\001\186\001\190\000\000\000\000\000\000\b9\000\000\000\000\000\000\000\000\000\000\000\000\b9\000\000\b9\000\000\000\000\000\000\000\000\b9\000\000\000\000\000\000\b9\000\000\000\000\b9\000\000\000\000\000\000\000\000\000\000\b9\b9\b9\000\000\000\000\000\000\000\000\000\000\000\000\b9\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b9\b9\001\217\b9\000\000\000\000\000\000\b9\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018:\000\000\b9\000\000\b9\b9\001\217\b9\b9\000\000\000\000\000\000\000\000\014\026\018\162\019\002\019\026\018\186\0192\000\000\000\000\b9\000\000\000\000\b9\b9\000\000\000\000\018\210\000\000\019J\019b\000\000\000\000\000\000\000\000\000\000\000\000\b9\000\000\019z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242\n!\000\000\000\000\001\225\000\000\000\000\000\000\000\000\000\000\000\000\018R\018\234\019\146\019\170\020\n\000\000\000\000\018:\000\000\000\000\n!\000\000\000\000\001\225\n!\020\"\000\000\000\000\000\000\000\000\001\217\018\162\019\002\019\026\018\186\0192\020:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\210\000\000\019J\019b\000\000\020\154\001\217\000\000\020\210\019\194\000\000\000\000\019z\000\000\001\217\020R\000\000\000\000\000\000\019\218\019\242\000\242\000\000\000\000\001\217\020j\020\130\000\000\000\000\000\000\000\000\000\000\018R\018\234\019\146\019\170\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n!\020\"\000\000\000\000\000\000\000\000\001\225\000\000\000\000\000\000\000\000\000\000\020:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\020\154\001\225\000\000\020\210\019\194\000\000\000\000\000\000\000\000\001\225\020R\018:\000\000\000\000\019\218\019\242\000\000\001\209\000\000\001\225\020j\020\130\000\000\000\000\001\249\018\162\019\002\019\026\018\186\0192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018:\018\210\000\000\019J\019b\000\000\001\249\000\000\000\000\000\000\000\000\000\000\000\000\019z\018\162\019\002\019\026\018\186\0192\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\018\210\000\000\019J\019b\000\000\018R\018\234\019\146\019\170\020\n\000\000\000\000\019z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\"\000\242\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\020:\018R\018\234\019\146\019\170\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\154\001\209\020\"\020\210\019\194\000\000\000\000\001\249\000\000\001\209\020R\000\000\000\000\020:\019\218\019\242\000\000\000\000\000\000\001\209\020j\020\130\000\000\000\000\001\241\000\000\000\000\020\154\001\249\000\000\020\210\019\194\000\000\000\000\000\000\000\000\001\249\020R\018:\000\000\000\000\019\218\019\242\000\000\001\241\000\000\001\249\020j\020\130\000\000\000\000\001\233\018\162\019\002\019\026\018\186\0192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018:\018\210\000\000\019J\019b\000\000\001\233\000\000\000\000\000\000\000\000\000\000\000\000\019z\018\162\019\002\019\026\018\186\0192\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\018\210\000\000\019J\019b\000\000\018R\018\234\019\146\019\170\020\n\000\000\000\000\019z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\"\000\242\000\000\000\000\000\000\001\241\000\000\000\000\000\000\000\000\000\000\020:\018R\018\234\019\146\019\170\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\154\001\241\020\"\020\210\019\194\000\000\000\000\001\233\000\000\001\241\020R\000\000\000\000\020:\019\218\019\242\000\000\000\000\000\000\001\241\020j\020\130\001\n\000\000\000\000\000\000\000\000\020\154\001\233\000\000\020\210\019\194\000\000\000\000\000\000\000\000\001\233\020R\000\000\001\014\000\000\019\218\019\242\001\218\002\"\001\246\001\233\020j\020\130\000\000\000\000\000\000\001\018\001\022\001\026\001\030\001\"\001&\003N\000\000\000\000\000\000\000\000\001\250\002>\002\014\001*\0012\000\000\0016\001:\000\000\000\000\002\026\000\000\001\222\001>\000\000\000\000\001B\000\000\002j\000\000\000\000\000\000\000\000\000\000\000\000\002\030\001\226\002Z\000\000\000\000\000\000\003R\000\000\003b\003\150\003\162\001F\001J\001N\001R\001V\003\174\000\000\000\000\000\000\000\000\000\000\001Z\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001b\003\178\004\157\004\157\000\000\000\000\001f\004\157\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\001\162,\186\000\000\000\000\004\157\000\000\004\157\001\166\004\157\001\170\004\157\001\174\001\178\000\000\000\000\001\182\028\230\001\186\001\190\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\004\157\000\000\000\000\000\000\000\000\007\165\000\000\000\000\000\000\004\157\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\004\157\004\157\004\157\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\000\000\004\157\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\rQ\004\157\004\157\000\000\004\157\004\157\026\006\007\222\003r\000\000\007\165\003B\000\000\007\226\000\000\000\000\007\198\000\000\004\157\004\157\000\000\000\000\004\157\rQ\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\004\157\000\000\000\000\026&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\026F\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n>\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\004\157\004\157\000\000\000\000\000\000\004\157\000\000\t\230\t\234\004\157\000\000\nz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\004\157\000\000\004\157\000\000\004\157\000\000\rQ\000\000\000\000\000\000\000\000\000\000\t\238\000\000\rQ\000\000\004\157\000\000\003\238\000\000\000\000\000\000\000\000\004\157\000\000\004\157\000\000\000\000\000\000\000\000\007\169\000\000\000\000\000\000\004\157\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\004\157\004\157\004\157\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\000\000\004\157\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\004\157\004\157\000\000\004\157\004\157\b-\b-\000\000\000\000\007\169\b-\000\000\000\000\000\000\b-\000\000\000\000\004\157\004\157\000\000\000\000\004\157\000\000\000\000\b-\000\000\b-\000\000\b-\000\000\b-\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b-\000\000\000\000\000\000\000\000\000\000\000\000\b-\000\000\b-\000\000\000\250\000\000\000\000\014j\b\130\000\000\000\000\b-\000\000\000\000\b-\000\000\000\000\000\000-\250\000\000\b-\b-\000\242\000\000\b\178\000\000\000\000\000\000\000\000\b-\000\000\000\000\000\000\000\000\000\000\000\000\b\190\000\000\b-\b-\000\000\b-\000\000\031V\000\000\b-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'Z\000\000\b-\031\186\b-\b-\000\000\b-\b-\031\210\007\222\003r\000\000\000\000\003B\000\000\012\226\000\000\031\218\007\198\000\000\b-\000\000\000\000\b-\b-\000\000\031\234\000\000\001\250-\138\r&\000\000\000\000-\170\000\000\b\026\000\000\b-\015\154\000\000\000\000\000\000\000\000\000\000\031\242\000\000 .\000\000\004I\0075\b.\000\000\000\000\015\238\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000$\146\000\000\t\130\000\000\t\138\000\000\016^\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\007\222\003r\000\000\000\000\003B\000\000\012\226\t\230\t\234\007\198\000\000\000\000\004I\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\r&\000\000\000\000\000\000\000\000\b\026\000\000\004I\015\154\000\000\004I\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\b.\000\000\000\000\015\238\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\001\197\000\000\000\000\t\130\000\000\t\138\000\000\016^\000\000\000\000\t\190\000\000\000\000\000\000\018:\000\000\000\000\000\000\000\000\000\000\001\197\t\194\t\214\t\218\000\000\t\222\000\000\000\000\018\162\019\002\019\026\018\186\0192\000\000\t\230\t\234\000\000\000\000\000\000\021\002\000\000\000\000\018\210\000\000\019J\019b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019z\003\142\000\000\000\000\022*\000\000\t\238\000\000\000\000\000\242\000\000\000\000\003\238\000\000\004\018\000\000\000\000\000\000\000\000\000\000\018R\018\234\019\146\019\170\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\"\000\000\000\000\000\000\000\000\001\197\000\000\000\000\000\000\000\000\000\000\020:\000\000\b\221\000\000\000\000\000\000\000\000\b\221\000\000\000\000\000\000\b\221\000\000\000\000\020\154\001\197\000\000\020\210\019\194\b\221\000\000\b\221\b\221\001\197\020R\b\221\b\221\b\221\019\218\019\242\000\000\000\000\000\000\000\000\020j\020\130\000\000\000\000\000\000\b\221\000\000\000\000\000\000\000\000\000\000\000\000\b\221\000\000\b\221\000\000\000\000\000\000\000\000\000\000\000\000\029*\000\000\b\221\000\000\000\000\b\221\000\000\000\000\000\000\000\000\000\000\b\221\b\221\b\221\nI\000\000\000\000\000\000\000\000\nI\b\221\000\000\001\246\nI\000\000\000\000\000\000\000\000\000\000\b\221\b\221\nI\b\221\nI\000\000\000\000\b\221\nI\000\000\nI\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\221\000\000\b\221\000\000\nI\b\221\b\221\000\000\000\000\000\000\000\000\nI\000\000\nI\000\000\b\221\000\000\000\000\000\000\000\000\004N\000\000\nI\b\221\000\000\nI\000\000\000\000\b\221\000\000\000\000\nI\nI\nI\000\000\000\000\b\221\000\000\000\000\000\000\nI\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nI\nI\000\000\nI\000\000\000\000\004\129\005\"\000\000\000\000\000\000\004\129\000\000\000\000\001\246\004\129\000\000\000\000\nI\000\000\nI\000\000\000\000\nI\nI\004\129\000\000\000\000\000\000\004\129\000\000\004\129\000\000\nI\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nI\000\000\004\129\000\000\000\000\nI\000\000\000\000\029\"\004\129\000\000\nI\000\000\nI\000\000\000\000\000\000\000\000\004N\000\000\004\129\000\000\000\000\004\129\000\000\000\000\000\000\000\000\000\000\004\129\004\129\004\129\000\000\000\000\000\000\000\000\000\000\000\000\004\129\012E\000\000\000\000\012E\000\000\000\000\000\000\000\000\004\129\004\129\000\000\004\129\000\000\000\000\000\000\005\"\000\000\000\000\000\000\000\000\012E\012E\000\000\012E\012E\000\000\004\129\000\000\004\129\000\000\000\000\004\129\004\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\129\004}\000\000\000\000\000\000\012E\004}\000\000\004\129\001\246\004}\000\000\000\000\004\129\000\000\000\000\029\"\000\000\nI\000\000\004}\004\129\000\000\000\000\004}\012E\004}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004}\000\000\000\000\000\000\012E\000\000\000\000\004}\000\000\nI\000\000\000\000\000\000\000\000\000\000\000\000\004N\000\000\004}\000\000\000\000\004}\000\000\000\000\012E\000\000\012E\004}\004}\004}\000\000\000\000\000\000\000\000\000\000\000\000\004}\000\000\n\166\012E\000\000\000\000\012E\012E\000\000\004}\004}\012E\004}\012E\000\000\000\000\005\"\012E\000\000\012E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004}\000\000\004}\000\000\000\000\004}\004}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004}\000\000\000\000\000\000\000\000\004}\000\000\000\000\029\"\003\146\000\000\000\000\000\000\004}\000\250\001\218\001\242\001\246\002\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 n\000\000\000\000\000\000\007\001\000\000\b\178\001\250\0022\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\026 r\001\222\000\000\000\000\000\000\000\000\000\000 \154\000\000\000\000\000\000\000\000\000\000\000\000\002:\001\226\002Z\000\000\n6\000\000\003R\031\186\003b\003\150\003\162\007\222\003r\031\210\000\000\003B\003\174\007\226\000\000\000\000\007\198\000\000\031\218\000\000\000\000\n:\000\000\t\134\000\000\000\000\001\250\031\234\000\000\000\000\000\000\000\000\000\000\b\026\003\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\242\000\000!:\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130!J\t\138\t\178\n>\000\000\003\234\t\190\003\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\b\213\b\213\000\000\000\000\000\000\b\213\000\000\t\230\t\234\b\213\000\000\nz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\213\000\000\b\213\000\000\b\213\000\000\b\213\000\000\012\006\000\000\000\000\011\162\000\000\000\000\t\238\000\000\011\246\000\000\b\213\000\000\003\238\000\000\000\000\000\000\000\000\b\213\b\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\238\000\000\b\213\000\000\000\000\b\213\000\000\000\000\000\000\000\000\000\000\b\213\b\213\000\000\012u\012u\000\000\000\000\000\000\012u\b\213\000\000\000\000\012u\000\000\000\000\000\000\000\000\000\000\b\213\000\000\000\000\b\213\012u\000\000\012u\b\213\012u\000\000\012u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\213\000\000\b\213\b\213\012u\b\213\b\213\000\000\000\000\000\000\000\000\012u\000\000\012u\000\000\b\213\000\000\b\213\000\000\000\000\b\213\000\000\012u\b\213\000\000\012u\000\000\000\000\000\000\000\000\000\000\012u\012u\012u\020\129\020\129\b\213\000\000\000\000\020\129\012u\000\000\000\000\020\129\000\000\000\000\000\000\000\000\000\000\012u\000\000\000\000\012u\020\129\000\000\020\129\012u\020\129\000\000\020\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012u\000\000\012u\012u\020\129\012u\012u\000\000\000\000\000\000\000\000\020\129\000\000\020\129\000\000\012u\000\000\000\000\003\190\012u\000\000\000\000\020\129\012u\000\000\020\129\000\000\000\000\000\000\000\000\000\000\020\129\020\129\020\129\005z\000\000\012u\000\000\000\000\000\000\020\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\129\000\000\000\000\020\129\000\000\000\000\000\000\020\129\000\000\000\000\000\000\000\000\000\000\001\242\001\246\000\000\000\000\000\000\020\129\000\000\020\129\020\129\000\000\020\129\020\129\020\133\020\133\000\000\000\000\003\206\020\133\000\000\001\250\0022\020\133\000\000\000\000\020\129\000\000\000\000\000\000\020\129\000\000\000\000\020\133\000\000\020\133\000\000\020\133\000\000\020\133\000\000\000\000\000\000\020\129\000\000\000\000\003V\000\000\004N\000\000\000\000\020\133\003R\000\000\003b\003\150\003\162\000\000\020\133\000\000\020\133\000\000\003\174\000\000\028\250\003\190\000\000\000\000\000\000\020\133\000\000\000\000\020\133\000\000\000\000\000\000\000\000\000\000\020\133\020\133\020\133\000\000\000\000\000\000\003\178\000\000\000\000\020\133\029^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\133\000\000\000\000\020\133\000\000\000\000\000\000\020\133\000\000\000\000\000\000\000\000\000\000\001\242\001\246\000\000\000\000\000\000\020\133\000\000\020\133\020\133\000\000\020\133\020\133\b\141\b\141\000\000\000\000\003\206\b\141\000\000\001\250\001\254\b\141\000\000\000\000\020\133\000\000\000\000\000\000\020\133\000\000\000\000\b\141\000\000\b\141\000\000\b\141\000\000\b\141\000\000\000\000\000\000\020\133\000\000\000\000\029\150\000\000\004N\000\000\000\000\b\141\003R\000\000\003b\003\150\003\162\000\000\b\141\000\000\b\141\000\000\003\174\000\000\028\250\003\190\000\000\000\000\000\000\b\141\000\000\000\000\b\141\000\000\000\000\000\000\000\000\000\000\b\141\b\141\b\141\000\000\000\000\000\000\003\178\000\000\000\000\b\141\029^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\141\000\000\000\000\b\141\000\000\000\000\000\000\b\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\141\000\000\b\141\b\141\000\000\b\141\b\141\000\000\002e\002e\000\000\003\206\002e\000\000\002e\000\000\000\000\002e\000\000\b\141\000\000\000\000\000\000\b\141\000\000\000\000\000\000\002e\000\000\000\000\000\000\000\000\000\000\000\000\002e\000\n\b\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002e\000\000\000\000\002e\000\000\002e\000\000\000\000\000\000\000\000\000\000\002e\000\000\000\000\002e\002e\000\000\000\000\002e\002e\000\000\002e\002e\002e\000\000\000\000\002e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\000\000\002e\011\141\011\141\011\141\000\000\000\000\011\141\000\000\011\141\002e\002e\011\141\000\000\002e\000\000\000\000\000\000\029\242\000\000\000\000\000\000\011\141\000\000\000\000\000\000\000\000\000\000\000\000\011\141\000\000\000\000\000\000\000\000\011\141\000\000\002e\000\000\000\000\000\000\002e\000\000\002e\000\000\011\141\000\000\000\000\011\141\011\141\011\141\000\000\000\000\000\000\000\000\000\000\011\141\031\n\000\000\011\141\011\141\000\000\000\000\000\000\011\141\000\000\011\141\011\141\011\141\000\000\000\000\011\141\000\000\000\000\018:\000\000\000\000\000\000\031\014\000\000\000\000\000\000\011\141\011\141\011\141\000\000\011\141\000\000\018\162\019\002\019\026\018\186\0192\000\000\000\000\011\141\011\141\000\000\000\000\000\000\000\000\000\000\018\210\000\000\019J\019b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019z\000\000\000\000\000\000\000\000\000\000\000\000\011\141\000\000\000\242\000\000\000\000\000\000\011\141\000\000\000\000\000\000\000\000\000\000\000\000\018R\018\234\019\146\019\170\020\n\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\237\020\"\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020:\000\000\000\237\000\000\000\237\000\000\000\237\000\000\000\237\000\000\000\000\000\000\000\000\000\000\020\154\000\000\031\018\020\210\019\194\031\"\000\237\000\000\000\000\000\000\020R\000\000\000\000\000\237\019\218\019\242\000\000\000\000\000\237\000\000\020j\020\130\000\000\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\237\000\237\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\237\000\237\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\237\000\000\000\000\0011\000\237\000\000\000\000\000\000\0011\000\000\000\000\000\000\0011\000\000\000\000\000\237\000\000\000\237\000\000\000\000\000\237\000\237\0011\000\000\0011\000\000\0011\000\000\0011\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\237\000\000\0011\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\237\000\000\000\237\0011\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\0011\000\000\000\000\000\000\000\000\000\000\0011\0011\000\242\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\0011\0011\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\0011\000\000\000\000\000\245\0011\000\000\000\000\000\000\000\245\000\000\000\000\000\000\000\245\000\000\000\000\0011\000\000\0011\000\000\000\000\0011\0011\000\245\000\000\000\245\000\000\000\245\000\000\000\245\000\000\0011\000\000\000\000\000\000\000\000\000\000\000\000\0011\0011\000\000\000\245\000\000\000\000\000\000\000\000\000\000\000\000\000\245\000\000\0011\000\000\0011\000\245\000\000\000\000\000\000\000\000\000\000\000\245\000\000\000\000\000\245\000\000\000\000\000\000\000\000\000\000\000\245\000\245\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\245\000\000\000\245\000\245\000\000\000\000\000\000\000\000\000\000\000\245\000\000\000\000\000\245\000\000\000\000\000\241\000\245\000\000\000\000\000\000\000\241\000\000\000\000\000\000\000\241\000\000\000\000\000\245\000\000\000\245\000\000\000\000\000\245\000\245\000\241\000\000\000\241\000\000\000\241\000\000\000\241\000\000\000\245\000\000\000\000\000\000\000\000\000\000\000\000\000\245\000\245\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\245\000\000\000\245\000\241\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\241\000\241\000\242\001\242\001\246\000\000\000\000\000\000\000\000\000\241\000\000\000\241\000\241\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\000\241\001\250\0022\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\241\000\000\000\000\000\241\000\241\004\201\004\201\000\000\000\000\003V\004\201\004N\000\000\000\241\004\201\003R\000\000\003b\003\150\003\162\000\241\000\241\000\000\000\000\004\201\003\174\004\201\000\000\004\201\000\000\004\201\000\000\000\241\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\201\000\000\000\000\000\000\000\000\003\178\000\000\004\201\004\201\029r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\201\000\000\000\000\004\201\000\000\000\000\000\000\000\000\000\000\004\201\004\201\000\242\004\209\004\209\000\000\000\000\000\000\004\209\004\201\000\000\000\000\004\209\000\000\000\000\000\000\000\000\000\000\004\201\000\000\000\000\004\201\004\209\000\000\004\209\004\201\004\209\000\000\004\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\201\000\000\004\201\004\201\004\209\004\201\004\201\000\000\000\000\000\000\000\000\004\209\004\209\000\000\000\000\004\201\000\000\004\201\000\000\000\000\004\201\000\000\004\209\004\201\000\000\004\209\000\000\000\000\000\000\000\000\000\000\004\209\004\209\000\242\004\217\002V\004\201\000\000\000\000\004\217\004\209\000\000\000\000\004\217\000\000\000\000\000\000\000\000\000\000\004\209\000\000\000\000\004\209\004\217\000\000\004\217\004\209\004\217\000\000\004\217\000\000\000\250\000\000\000\000\000\000\b\130\000\000\004\209\000\000\004\209\004\209\004\217\004\209\004\209\000\000\007-\000\000\000\000\004\217,.\000\000\b\178\004\209\000\000\004\209\000\000\000\000\004\209\000\000\004\217\004\209\000\000\004\217\b\190\000\000\000\000\000\000\000\000\004\217\004\217\031V\000\000\000\000\004\209\000\000\000\000\000\000\004\217\002\025\000\000\000\000'Z\000\000\002\025\031\186\000\000\004\217\002\025\000\000\004\217\031\210\000\000\000\000\004\217\000\000\000\000\000\000\002\025\000\000\031\218\000\000\002\025\000\000\002\025\004\217\000\000\004\217\004\217\031\234\004\217\004\217\000\000\000\000\000\000\000\000\002\025\000\000\002\025\000\000\004\217\000\000\004\217\002\025\000\000\004\217\000\000\031\242\004\217 .\007\165\000\000\000\000\000\000\002\025\000\000\000\000\002\025\000\000\000\000\000\000\004\217\000\000\002\025\002\025\002\025\000\000\011\030\000\000\000\000$\146\000\000\002\025\000\000\007\222\003r\000\000\000\000\003B\000\000\011\"\002\025\000\000\007\198\002\025\000\000\000\000\000\000\002\025\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\002\025\b\026\002\025\000\000\000\000\002\025\002\025\000\000\000\000\000\000\000\000\007\165\000\000\000\000\000\000\002\025\b.\000\000\000\000\bB\000\000\001\206\002\025\002\025\000\000\000\000\000\000\003b\002\025\000\000\tz\t~\000\000\000\000\000\000\t\130\002\025\t\138\t\178\011>\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\020}\020}\000\000\000\000\000\000\020}\t\230\t\234\000\000\020}\nz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011F\020}\000\000\020}\000\000\020}\000\000\020}\020y\020y\000\000\000\000\000\000\020y\t\238\000\000\000\000\020y\000\000\020}\003\238\000\000\000\000\000\000\000\000\000\000\020}\020y\020}\020y\000\000\020y\000\000\020y\000\000\000\000\000\000\020}\000\000\000\000\020}\000\000\000\000\000\000\000\000\020y\020}\020}\020}\000\000\000\000\000\000\020y\000\000\020y\020}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020y\020}\000\000\020y\020}\000\000\000\000\000\000\020}\020y\020y\020y\000\000\000\000\000\000\000\000\000\000\000\000\020y\020}\000\000\020}\020}\000\000\020}\020}\000\000\020y\000\000\000\000\020y\000\000\000\000\000\000\020y\000\000\000\000\000\000\020}\000\000\000\000\000\000\020}\000\000\000\000\020y\000\000\020y\020y\000\000\020y\020y\000\000\005z\000\000\020}\000\000\012y\012y\000\000\r\182\000\000\012y\000\000\020y\000\000\012y\000\000\020y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012y\000\000\012y\000\000\012y\020y\012y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012y\000\000\000\000\000\000\000\000\000\000\000\000\012y\000\000\012y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012y\000\000\000\000\012y\000\000\000\000\000\000\000\000\000\000\012y\012y\000\242\000\000\000\000\000\000\000\000\000\000\000\000\012y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012y\000\000\000\000\012y\000\000\000\000\000\000\012y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012y\000\000\012y\012y\000\000\012y\012y\001\218\007\222\003r\000\000\000\000\003B\000\000\tB\012y\000\000\007\198\000\000\012y\000\000\000\000\000\000\012y\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\012y\000\000\000\000\001\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\020\242\001\226\001\206\000\000\000\000\007\157\000\000\000\000\003b\000\000\007\157\tz\t~\019\209\007\157\000\000\t\130\000\000\t\138\t\178\012\166\000\000\019\209\t\190\007\157\000\000\007\157\000\000\007\157\000\000\007\157\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\007\157\000\000\000\000\000\000\000\000\t\230\t\234\007\157\000\000\019\209\000\000\000\000\000\000\000\000\000\000\000\000\019\209\000\000\000\000\000\000\000\000\007\157\000\000\000\000\000\000\000\000\000\000\007\157\007\157\007\157\000\000\t\238\000\000\000\000\000\000\000\000\007\157\003\238\007\222\003r\000\000\000\000\003B\000\000\012\226\007\157\000\000\007\198\002^\000\000\000\000\000\000\019\209\000\000\000\000\000\000\000\000\001\250\000\000\r&\000\000\000\000\000\000\007\157\b\026\007\157\007\157\015\154\007\157\007\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000&B\000\000\b.\000\000\000\000$\170\000\000\001\206\"\226\007\157\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\007\157\t\138\000\000\016^\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\007\222\003r\000\000\000\000\003B\000\000\012\226\t\230\t\234\007\198\000\000\000\000$\174\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\r&\000\000\000\000\000\000\000\000\b\026\000\000\000\000\015\154\000\000'\014\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\b.\000\000\000\000\015\238\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\000\000\016^\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\007\222\003r\000\000\000\000\003B\000\000\012\226\t\230\t\234\007\198\000\000\000\000\021\002\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\r&\000\000\000\000\000\000\000\000\b\026\000\000\000\000\015\154\000\000%J\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\b.\000\000\000\000\015\238\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\000\000\016^\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bi\bi\t\194\t\214\t\218\bi\t\222\000\000\000\000\bi\000\000\000\000\000\000\000\000\000\000\t\230\t\234\000\000\000\000\bi\021\002\bi\000\000\bi\000\000\bi\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bi\000\000%\170\000\000\t\238\000\000\000\000\bi\000\000\bi\003\238\000\000\000\000\000\000\014j\000\000\000\000\000\000\bi\000\000\000\000\bi\000\000\000\000\000\000\000\000\000\000\bi\bi\000\242\000\000\000\000\000\000\000\000\000\000\000\000\bi\019\173\000\000\000\000\000\000\000\000\019\173\000\000\000\000\bi\019\173\000\000\bi\000\000\000\000\000\000\bi\000\000\000\000\000\000\019\173\000\000\000\000\000\000\019\173\000\000\019\173\bi)R\bi\bi\000\000\bi\bi\000\000\007\222\003r\000\000\019\173\003B\000\000\007\226\000\000\000\000\007\198\019\173\bi\000\000\000\000\000\000\bi\011\186\000\000\000\000\001\250\000\000\000\000\000\000\000\000\019\173\000\000\b\026\000\000\bi\000\000\019\173\019\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\173\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\019\173\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n>\000\000\019\173\t\190\019\173\003:\000\000\019\173\019\173\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\019\173\t\222\000\000\007\222\003r*\006\000\000\003B\019\173\007\254\t\230\t\234\007\198\000\000\nz\000\000\000\000\000\000\000\000\000\000\000\000\019\173\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\000\000\000\000\000\000\000\000\000\000\t\238\000\000\000\000\000\000\015\130\000\000\003\238\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178(\138\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\007\222\003r\nz\000\000\003B\000\000\nJ\000\000\000\000\007\198(\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\t\238\000\000\b\026\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\nf\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\007\222\003r\nz\000\000\003B\000\000\n\170\000\000\000\000\007\198\011\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\t\238\000\000\b\026\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n\198\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\n\218\000\000\000\000\000\000\000\000\t\230\t\234\007\222\003r\nz\000\000\003B\000\000\007\226\000\000\000\000\007\198\n\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\t\238\000\000\b\026\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n>\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011z\t\194\t\214\t\218\000\000\t\222\000\000\007\222\003r\000\000\000\000\003B\000\000\007\226\t\230\t\234\007\198\000\000\nz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\000\000\000\000\000\000\000\000\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n>\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012.\t\194\t\214\t\218\000\000\t\222\000\000\007\222\003r\000\000\000\000\003B\000\000\007\226\t\230\t\234\007\198\000\000\nz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\000\000\000\000\000\000\000\000\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n>\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\be\r\138\000\000\000\000\000\000\be\000\000\t\230\t\234\be\000\000\nz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\be\000\000\be\000\000\be\000\000\be\020\137\020\137\000\000\000\000\000\000\020\137\000\000\t\238\000\000\020\137\000\000\be\000\000\003\238\000\000\000\000\000\000\000\000\be\020\137\014\006\020\137\000\000\020\137\000\000\020\137\000\000\000\000\000\000\be\000\000\000\000\be\000\000\000\000\000\000\000\000\020\137\be\be\000\242\000\000\000\000\000\000\020\137\000\000\020\137\be\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\137\be\000\000\020\137\be\000\000\000\000\000\000\be\020\137\020\137\000\242\000\000\000\000\000\000\000\000\000\000\000\000\020\137\be\000\000\be\be\000\000\be\be\000\000\020\137\000\000\000\000\020\137\000\000\000\000\000\000\020\137\000\000\000\000\000\000\be\000\000\000\000\000\000\be\000\000\000\000\020\137\000\000\020\137\020\137\000\000\020\137\020\137\020\141\020\141\000\000\be\000\000\020\141\000\000\000\000\000\000\020\141\000\000\000\000\020\137\000\000\000\000\000\000\020\137\000\000\000\000\020\141\000\000\020\141\000\000\020\141\000\000\020\141\b\129\r\138\000\000\020\137\000\000\b\129\000\000\000\000\000\000\b\129\000\000\020\141\000\000\000\000\000\000\000\000\000\000\000\000\020\141\b\129\014\006\b\129\000\000\b\129\000\000\b\129\000\000\000\000\000\000\020\141\000\000\000\000\020\141\000\000\000\000\000\000\000\000\b\129\020\141\020\141\000\242\000\000\000\000\000\000\b\129\000\000\014\006\020\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\129\020\141\000\000\b\129\020\141\000\000\000\000\000\000\020\141\b\129\b\129\000\242\000\000\000\000\000\000\000\000\000\000\000\000\b\129\020\141\000\000\020\141\020\141\000\000\020\141\020\141\000\000\b\129\000\000\000\000\b\129\000\000\000\000\000\000\b\129\000\000\000\000\000\000\020\141\000\000\000\000\000\000\020\141\000\000\000\000\b\129\000\000\b\129\b\129\000\000\b\129\b\129\b\133\b\133\000\000\020\141\000\000\b\133\000\000\000\000\000\000\b\133\000\000\000\000\b\129\000\000\000\000\000\000\b\129\000\000\000\000\b\133\000\000\b\133\000\000\b\133\000\000\b\133\b}\b}\000\000\b\129\000\000\b}\000\000\000\000\000\000\b}\000\000\b\133\000\000\000\000\000\000\000\000\000\000\000\000\b\133\b}\b\133\b}\000\000\b}\000\000\b}\000\000\000\000\000\000\b\133\000\000\000\000\b\133\000\000\000\000\000\000\000\000\b}\b\133\b\133\b\133\000\000\000\000\000\000\b}\000\000\014\006\b\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b}\b\133\000\000\b}\b\133\000\000\000\000\000\000\b\133\b}\b}\000\242\000\000\000\000\000\000\000\000\000\000\000\000\b}\b\133\000\000\b\133\b\133\000\000\b\133\b\133\000\000\b}\000\000\000\000\b}\000\000\000\000\000\000\b}\000\000\000\000\000\000\b\133\000\000\000\000\000\000\b\133\000\000\000\000\b}\ta\b}\b}\000\000\b}\b}\000\000\007\222\003r\014.\000\000\003B\000\000\tB\000\000\000\000\007\198\000\000\b}\000\000\000\000\ta\b}\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\b}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\012\166\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\218\t\194\t\214\t\218\000\000\t\222\000\000\007\222\003r\000\000\000\000\003B\000\000\021\222\t\230\t\234\007\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\000\000\000\000\000\000\000\000\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\021\250\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\218\001\242\001\246\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\022\014\000\000\000\000\000\000\000\000\t\230\t\234\007\222\003r\001\250\0022\003B\000\000\007\226\000\000\000\000\007\198\022\002\000\000\000\000\000\000\001\222\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\t\238\000\000\b\026\004>\001\226\004N\003\238\000\000\000\000\003R\000\000\003b\003\150\003\162\000\000\000\000\000\000\b.\000\000\003\174\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\n>\003\178\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\002=\t\222\000\000\000\000\000\000\002=\000\000\000\000\000\000\002=\t\230\t\234\000\000\000\000\nz\000\000\000\000\012\253\000\000\002=\000\000\000\000\000\000\002=\000\000\002=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\238\002=\000\000\000\000\000\000\000\000\003\238\000\000\002=\000\000\002=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002=\000\000\000\000\002=\000\000\000\000\000\000\000\000\000\000\002=\002=\002=\002E\000\000\000\000\000\000\000\000\002E\002=\000\000\000\000\002E\000\000\000\000\000\000\000\000\000\000\002=\002=\r\005\002=\002E\000\000\000\000\002=\002E\000\000\002E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002=\000\000\002=\000\000\002E\002=\002=\000\000\000\000\000\000\000\000\002E\000\000\002E\000\000\002=\000\000\000\000\000\000\000\000\000\000\000\000\002E\002=\000\000\002E\000\000\000\000\002=\000\000\000\000\002E\002E\002E\002A\000\000\002=\000\000\000\000\002A\002E\000\000\000\000\002A\000\000\000\000\000\000\000\000\000\000\002E\002E\r\001\002E\002A\000\000\000\000\002E\002A\000\000\002A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002E\000\000\002E\000\000\002A\002E\002E\000\000\000\000\000\000\000\000\002A\000\000\002A\000\000\002E\000\000\000\000\000\000\000\000\000\000\000\000\002A\002E\000\000\002A\000\000\000\000\002E\000\000\000\000\002A\002A\002A\0029\000\000\002E\000\000\000\000\0029\002A\000\000\000\000\0029\000\000\000\000\000\000\000\000\000\000\002A\002A\012\249\002A\0029\000\000\000\000\002A\0029\000\000\0029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002A\000\000\0029\002A\002A\000\000\000\000\000\000\000\000\0029\000\000\0029\000\000\002A\000\000\000\000\000\000\000\000\000\000\000\000\0029\002A\000\000\0029\000\000\000\000\002A\000\000\000\000\0029\0029\0029\004y\000\000\002A\000\000\000\000\004y\0029\000\000\001\246\004y\000\000\000\000\000\000\000\000\000\000\0029\0029\000\000\0029\004y\000\000\000\000\0029\004y\000\000\004y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0029\000\000\0029\000\000\004y\0029\0029\000\000\000\000\000\000\000\000\004y\000\000\000\000\000\000\0029\000\000\000\000\000\000\000\000\004N\000\000\004y\0029\000\000\004y\000\000\000\000\0029\000\000\000\000\004y\004y\004y\004u\000\000\0029\000\000\000\000\004u\004y\000\000\001\246\004u\000\000\000\000\000\000\000\000\000\000\004y\004y\000\000\004y\004u\000\000\000\000\005\"\004u\000\000\004u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004y\000\000\004y\000\000\004u\004y\004y\000\000\000\000\000\000\000\000\004u\000\000\000\000\000\000\004y\000\000\000\000\000\000\000\000\004N\000\000\004u\004y\000\000\004u\000\000\000\000\004y\000\000\000\000\004u\004u\004u\011]\000\000\004y\000\000\000\000\011]\004u\000\000\000\000\011]\000\000\000\000\000\000\000\000\000\000\004u\004u\000\000\004u\011]\000\000\000\000\005\"\011]\000\000\011]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004u\000\000\004u\000\000\011]\004u\004u\000\000\000\000\000\000\000\000\011]\000\000\000\000\000\000\004u\011]\000\000\000\000\000\000\000\000\000\000\011]\004u\000\000\011]\000\000\000\000\004u\000\000\000\000\011]\011]\000\242\000\000\000\000\004u\000\000\000\000\011Y\011]\000\000\011]\011]\011Y\000\000\000\000\000\000\011Y\011]\000\000\000\000\011]\000\000\000\000\000\000\011]\000\000\011Y\000\000\000\000\000\000\011Y\000\000\011Y\000\000\000\000\011]\000\000\011]\011]\000\000\011]\011]\000\000\000\000\011Y\000\000\000\000\000\000\000\000\000\000\011]\011Y\000\000\000\000\000\000\000\000\011Y\000\000\011]\000\000\000\000\000\000\011Y\000\000\000\000\011Y\011]\000\000\000\000\000\000\000\000\011Y\011Y\000\242\000\000\000\000\000\000\000\000\000\000\001\133\011Y\000\000\011Y\011Y\001\133\000\000\000\000\000\000\001\133\011Y\000\000\000\000\011Y\000\000\000\000\000\000\011Y\000\000\001\133\000\000\001\133\000\000\001\133\000\000\001\133\000\000\000\000\011Y\000\000\011Y\011Y\000\000\011Y\011Y\000\000\000\000\001\133\000\000\000\000\000\000\000\000\000\000\011Y\001\133\000\000\000\000\000\000\000\000\001\133\000\000\011Y\000\000\000\000\000\000\001\133\000\000\000\000\001\133\011Y\000\000\000\000\000\000\000\000\001\133\001\133\000\242\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\000\000\001\133\000\000\000\000\000\000\000\000\000\000\001\133\000\000\000\000\001\133\000\000\000\000\001\129\001\133\000\000\000\000\000\000\001\129\000\000\000\000\000\000\001\129\000\000\000\000\001\133\000\000\001\133\001\133\000\000\001\133\001\133\001\129\000\000\001\129\000\000\001\129\000\000\001\129\000\000\001\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\129\000\000\000\000\000\000\000\000\019u\000\000\001\129\000\000\019u\000\000\001\133\001\129\000\000\000\000\000\000\000\000\000\000\001\129\019u\000\000\001\129\000\000\000\000\000\000\019u\000\000\001\129\001\129\000\242\000\000\000\000\000\000\000\000\000\000\000\000\001\129\019u\000\000\001\129\000\000\000\000\000\000\000\000\019u\001\129\000\000\000\000\001\129\000\000\000\000\000\000\001\129\000\000\000\000\019u\000\000\000\000\019u\000\000\000\000\000\000\000\000\001\129\019u\001\129\001\129\000\000\001\129\001\129\000\000\007\161\000\000\019u\000\000\000\000\007\161\000\000\001\129\019\209\007\161\000\000\019u\000\000\000\000\019u\001\129\000\000\019\209\019u\007\161\000\000\007\161\000\000\007\161\000\000\007\161\000\000\000\000\001\129\019u\000\000\019u\000\000\000\000\019u\000\000\000\000\007\161\000\000\000\000-\130\000\000\000\000\000\000\007\161\000\000\019\209\000\000\000\000\000\000\000\000\000\000\019u\019\209\000\000\000\000\000\000\000\000\007\161\000\000\000\000\000\000\000\000\000\000\007\161\007\161\007\161\002M\000\000\000\000\000\000\000\000\002M\007\161\000\000\028\222\002M\000\000\003B\000\000\000\000\000\000\007\161\000\000\000\000\002^\002M\000\000\000\000\019\209\002M\000\000\002M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\161\000\000\007\161\007\161\002M\007\161\007\161\000\000\000\000\000\000\000\000\002M\000\000\000\000\000\000\000\000\000\000\000\000\028\226\000\000\000\000\000\000\002M\007\161\000\000\002M\000\000\000\000\000\000\000\000\000\000\002M\002M\000\000\028\238\000\000\007\161\000\000\000\000\000\000\002M\000\000\007\222\003r\000\000\000\000\003B\000\000(\162\002M\000\000\007\198\002M\000\000\000\000\000\000\002M\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\t\234\002M\b\026\002M\000\000\000\000\002M\002M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002M\b.\000\000\000\000\bB\000\000\001\206\000\000\002M\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\002M\t\138\t\178(\190\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\007\222\003r\nz\000\000\003B\000\000\t^\000\000\000\000\007\198(\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\t\238\000\000\b\026\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\012\022\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\007\222\003r\t\230\t\234\003B\000\000\012F\000\000\000\000\007\198\000\000\000\000\000\000\000\000\012\030\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\012b\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\007\222\003r\t\230\t\234\003B\000\000\012z\000\000\000\000\007\198\000\000\000\000\000\000\000\000\012j\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\000\000\t\130\000\000\t\138\t\178\012\150\000\000\000\000\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\007\222\003r\t\230\t\234\003B\000\000\012\178\000\000\000\000\007\198\000\000\000\000\000\000\000\000\012\158\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\000\000\t\238\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\b.\000\000\000\000\bB\000\000\001\206\000\000\000\000\006\249\r\138\000\000\003b\000\000\006\249\tz\t~\000\000\006\249\000\000\t\130\000\000\t\138\t\178\012\206\000\000\000\000\t\190\006\249\000\000\000\000\000\000\006\249\000\000\006\249\000\000\000\000\000\000\t\194\t\214\t\218\000\000\t\222\000\000\000\000\006\249\006\249\000\000\000\000\000\000\006\249\t\230\t\234\006\249\006\249\014\006\000\000\000\000\006\249\000\000\014j\006\249\000\000\012\214\006\249\000\000\006\249\006\249\006\249\000\000\006\249\000\000\000\000\006\249\b\166\000\242\000\000\t\238\000\000\000\000\006\249\000\000\006\249\003\238\006\249\006\249\006\249\000\000\000\000\006\249\000\000\006\249\006\249\000\000\006\249\000\000\000\000\000\000\006\249\000\000\006\249\000\000\000\000\006\249\000\000\006\249\000\000\000\000\000\000\006\249\b\166\006\249\001q\000\000\006\249\006\249\000\000\001q\006\249\006\249\000\201\001q\000\000\000\000\006\249\006\249\b\166\006\249\000\000\000\201\006\249\001q\006\249\001q\006\249\001q\000\000\001q\000\000\000\000\011b\000\000\000\000\006\249\000\000\006\249\000\000\006\249\000\000\001q\006\249\006\249\000\000\000\000\000\000\000\000\001q\000\000\000\201\000\000\r\182\006\249\000\000\006\249\000\000\000\201\006\249\006\249\006\249\000\000\001q\000\000\014\026'\254\000\000\000\000\001q\001q\001q\000\000\000\000\006\249\000\000\000\000\006\249\001q\004m\000\000\000\000$\018\000\000\004m\000\000\000\000\001q\004m\000\000\000\000\000\000\000\000\000\000\000\201\000\000\000\000\000\000\004m\000\000\000\000\000\000\004m\000\000\004m\001q\000\000\001q\001q\000\000\001q\001q\000\000\000\000\000\000\000\000\004m\000\000\028\246\000\000\000\000\000\000\000\000\004m\000\000\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\000\000\004m\000\000\000\000\004m\000\000\000\000\000\000\001q\000\000\004m\004m\004m\000\000\000\000\000\000\000\000\000\000\000\000\004m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004m\000\000\000\000\004m\000\000\000\000\t\253\004m\000\000\000\000\000\000\t\253\000\000\000\000\000\000\t\253\000\000\000\000\004m\000\000\004m(\006\000\000\004m\004m\t\253\000\000\000\000\000\000\t\253\000\000\t\253\000\000\004m\000\000\000\000\000\000\019\209\000\000\000\000\029\146\004m\000\000\t\253\000\000\000\000\004m\000\000\000\000\000\000\t\253\000\000\000\000\000\000\004m\000\000\000\000\000\000\000\000\000\000\000\000\t\253\000\000\000\000\t\253\000\000\000\000\000\000\000\000\000\000\t\253\t\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\253\000\000\000\000\t\253\000\000\000\000\t]\t\253\000\000\000\000\000\000\000\000\000\000\000\000\003r\000\000\000\000\003B\t\253\000\000\t\253\t\253\007\198\t\253\t\253\000\000\000\000\t]\000\000\000\000\000\000\000\000\001\250\t\253\000\000\000\000\007\202\000\000\t\253\000\000\003.\t\253\000\000\000\000\000\000\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\000\000\t\253\t\133\000\000\t&\000\000\001\206\000\000\000\000\000\000\003r\000\000\003b\003B\000\000\t.\014\166\000\000\007\198\000\000\014\170\014\174\014\186\t\133\000\000\000\000\000\000\t\190\001\250\000\000\000\000\000\000\007\202\000\000\000\000\000\000\000\000\000\000\000\000\t\214\t\218\000\000\007\206\000\000\b\230\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\t&\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\t.\014\166\000\000\000\000\000\000\014\170\014\174\014\186\000\000\000\000\000\000\000\000\t\190\t\238\014\194\000\000\000\000\000\000\014\218\003\238\000\000\004m\000\000\000\000\t\214\t\218\004m\000\000\000\000\000\000\004m\000\000\000\000\000\000\000\000\000\000\t\230\t\234\000\000\000\000\004m\000\000\000\000\000\000\004m\000\000\004m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\246\000\000\004m\000\000\028\246\000\000\t\238\014\194\000\000\004m\000\000\014\218\003\238\000\000\000\000\000\000\000\000\000\000\001\250\0022\004m\000\000\000\000\004m\000\000\000\000\000\000\000\000\000\000\004m\004m\004m\000\000\000\000\000\000\000\000\000\000\000\000\004m\b\005\000\000\000\000\000\000\003V\b\005)f\000\000\004m\b\005\003R\004m\003b\003\150\003\162\004m\000\000\000\000\000\000\b\005\003\174\000\000\000\000\b\005\000\000\b\005\004m\000\000\004m(6\000\000\004m\004m\000\000\000\000\000\000\000\000\b\005\000\000\000\000\000\000\000\000\003\178\000\000\b\005\007q\000\000\000\000\029\146\004m\000\000\014j\000\000\000\000\004m\b\005\000\000\000\000\b\005\000\000\000\000\000\000\000\000)~\b\005\b\005\000\242\b\r\000\000\000\000\000\000\000\000\b\r\b\005\000\000\000\000\b\r\000\000\000\000\000\000\000\000\000\000\b\005\b\005\000\000\b\005\b\r\000\000\000\000\b\005\b\r\000\000\b\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\005\000\000\b\005\000\000\b\r\b\005\b\005\000\000\000\000\000\000\000\000\b\r\000\000\000\000\000\000\000\000\000\000\000\000\014j\000\000\000\000\000\000\b\r\b\005\000\000\b\r\000\000\000\000\000\000\000\000\000\000\b\r\b\r\000\242\000\000\000\000\b\005\000\000\000\000\000\000\b\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\r\b\r\000\000\b\r\000\000\000\000\004m\b\r\000\000\000\000\000\000\004m\000\000\000\000\000\000\004m\000\000\000\000\b\r\000\000\b\r\000\000\000\000\b\r\b\r\004m\000\000\000\000\000\000\004m\000\000\004m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\r\000\000\004m\000\000\028\246\000\000\000\000\000\000\000\000\004m\000\000\000\000\000\000\b\r\000\000\000\000\000\000\000\000\000\000\000\000\004m\000\000\000\000\004m\000\000\000\000\000\000\000\000\000\000\004m\004m\004m\000\000\000\000\000\000\000\000\t\021\000\000\004m\000\000\000\000\t\021\000\000\000\000\000\000\t\021\000\000\004m\000\000\000\000\004m\000\000\000\000\000\000\004m\t\021\000\000\000\000\000\000\t\021\000\000\t\021\000\000\000\000\000\000\004m\000\000\004m >\000\000\004m\004m\000\000\t\021\000\000\000\000\000\000\000\000\000\000\000\000\t\021\000\000\000\000\000\000\000\000\000\000\000\000\029\146\004m\000\000\000\000\t\021\000\000\000\000\t\021\000\000\000\000\000\000\000\000\000\000\t\021\t\021\000\242\019\173\000\000\000\000\000\000\000\000\019\173\t\021\000\000\000\000\019\173\000\000\000\000\000\000\000\000\000\000\t\021\000\000\000\000\t\021\019\173\000\000\000\000\t\021\019\173\000\000\019\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\021\000\000\t\021$6\019\173\t\021\t\021\000\000\000\000\000\000\000\000\019\173\000\000\000\000\000\000\t\021\000\000\000\000\000\000\000\000\000\000\000\000\019\173\t\021\000\000\019\173\000\000\000\000\000\000\000\000\000\000\019\173\019\173\000\000\n-\r\138\t\021\000\000\000\000\n-\019\173\000\000\000\000\n-\000\000\000\000\000\000\000\000\000\000\019\173\000\000\000\000\019\173\n-\000\000\000\000\019\173\n-\000\000\n-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\173\000\000\019\173\003:\n-\019\173\019\173\000\000\000\000\000\000\000\000\n-\000\000\014\006\000\000\019\173\000\000\000\000\000\000\000\000*B\000\000\n-\019\173\000\000\n-\000\000\000\000\000\000\000\000\000\000\n-\n-\000\242\002%\000\000\019\173\000\000\000\000\002%\n-\000\000\000\000\002%\000\000\000\000\000\000\000\000\000\000\n-\000\000\000\000\n-\002%\000\000\000\000\n-\002%\000\000\002%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n-\000\000\n-\000\000\002%\n-\n-\000\000\000\000\000\000\000\000\002%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002%\n-\000\000\002%\000\000\000\000\000\000\000\000\000\000\002%\002%\002%\000\000\000\000\000\000\000\000\002Q\000\000\002%\000\000\000\000\002Q\000\000\000\000\000\000\002Q\000\000\002%\000\000\000\000\002%\000\000\000\000\000\000\002%\002Q\000\000\000\000\000\000\002Q\000\000\002Q\000\000\000\000\000\000\002%\000\000\002%\000\000\000\000\002%\002%\000\000\002Q\000\000\000\000 J\000\000\000\000\000\000\002Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002%\000\000\000\000\002Q\000\000\002%\002Q\000\000\000\000\000\000\000\000\000\000\002Q\002Q\000\000\t\025\000\000\000\000\000\000\000\000\t\025\002Q\000\000\000\000\t\025\000\000\000\000\000\000\000\000\000\000\002Q\000\000\000\000\002Q\t\025\000\000\000\000\002Q\t\025\000\000\t\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002Q\000\000\002Q\000\000\t\025\002Q\002Q\000\000\000\000\000\000\000\000\t\025\000\000\000\000\000\000\002Q\000\000\000\000\000\000\000\000\000\000\000\000\t\025\002Q\000\000\t\025\000\000\000\000$\018\000\000\000\000\t\025\t\025\000\242\000\000\000\000\002Q\000\000\000\000\019e\t\025\000\000\003r\019e\000\000-\146\000\000\000\000\000\000\t\025-\150\000\000\t\025\019e\000\000\000\000\t\025\000\000\000\000\019e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\025\000\000\t\025\000\000\019e\t\025\t\025\000\000\000\000\000\000\000\000\019e\000\000\000\000\000\000\t\025\000\000\000\000\001\006\000\000\001\206\000\000\019e\t\025\000\000\019e\000\000\000\000\000\000\000\000\000\000\019e\000\000\000\000\000\000\000\000\t\025\000\000\000\000\019I\019e-\154\003r\019I\000\000-\178\000\000\000\000\000\000\019e-\182\000\000\019e\019I\000\000\000\000\019e\000\000\000\000\019I\000\000\000\000\000\000\000\000\000\000\000\000-\158\019e\000\000\019e\000\000\019I\019e\000\000\000\000\000\000\000\000\000\000\019I\000\000\000\000\000\000\000\000\000\000\000\000\001\006\000\000\001\206\000\000\019I\019e\000\000\019I\000\000\000\000\000\000\000\000\000\000\019I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019I-\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019I\000\000\000\000\019I\001\218\001\242\003>\019I\000\000\003B\000\000\000\000\000\000\000\000\000\000\000\000\000\000-\190\019I\000\000\019I\000\000\000\000\019I\001\250\0022\002\014\003F\000\000\000\000\000\000\000\000\000\000\000\000\002\026\000\000\001\222\000\000\000\000\000\000\000\000\019I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003J\001\226\002Z\000\000\000\000\000\000\003R\000\000\003b\003\150\003\162\007\222\003r\000\000\000\000\003B#\234\000\000#\238\000\000\007\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\b\026\003\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\234\000\000\000\000\001%\b.\000\000\000\000\016b\001%\001\206\000\000#\250\001%\000\000\000\000\003b\000\000\000\000\tz\t~\000\000\000\000\001%\t\130\000\000\t\138\001%\000\000\001%#\254\t\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001%\t\194\t\214\t\218\000\000\t\222\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\t\230\t\234\000\000\000\000\001%\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\001%\001%\000\242\001)\000\000\000\000\000\000\000\000\001)\001%\000\000\000\000\001)\t\238\000\000\000\000\000\000\000\000\001%\003\238\000\000\001%\001)\000\000\000\000\001%\001)\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\001%\000\000\001)\001%\001%\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\001%\000\000\001)\000\000\000\000\000\000\000\000\000\000\001)\001)\000\242\000\000\000\000\001%\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\001)\000\000\000\000\000\000\001)\000\000\000\000\001\218\001\242\003>\000\000\000\000\003B\000\000\000\000\001)\000\000\001)\000\000\000\000\001)\001)\000\000\000\000\000\000\000\000\000\000\001\250\0022\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\026\001)\001\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n)\001)\003J\001\226\002Z\n)\000\000\000\000\003R\n)\003b\003\150\003\162\000\000\000\000\000\000\000\000\000\000#\234\n))\234\000\000\t\r\n)\000\000\n)\000\000\t\r\000\000\000\000\000\000\t\r\000\000\000\000\000\000\000\000\000\000\n) \026\000\000\003\178\t\r\000\000\000\000\n)\t\r\000\000\t\r\000\000\000\000\t\234\000\000\000\000\000\000\000\000\n)\000\000\000\000\n)\t\r\000\000)\246\000\000\000\000\n)\n)\t\r\000\000\000\000\000\000\000\000\000\000\000\000\n)\000\000\000\000\000\000\t\r\000\000#\254\t\r\000\000\n)\000\000\000\000\n)\t\r\t\r\000\000\n)\000\000\000\000\000\000\000\000\000\000\t\r\000\000\000\000\000\000\000\000\n)\000\000\n)\031j\t\r\n)\n)\t\r\000\000\000\000\018\245\t\r\000\000\000\000\000\000\018\245\000\000\000\000\000\000\018\245\000\000\000\000\t\r\n)\t\r\000\000\000\000\t\r\t\r\018\245\000\000\000\000\006\209\018\245\000\000\018\245\000\000\006\209\000\000\000\000\000\000\006\209\000\000\000\000\000\000\t\r\000\000\018\245\000\000\000\000\000\000\006\209\000\000\000\000\018\245\006\209\000\000\006\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\245\000\000\000\000\018\245\006\209\000\000\000\000\000\000\000\000\018\245\000\000\006\209\000\000\000\000\000\000\000\000\000\000\000\000\018\245\000\000\000\000\000\000\006\209\000\000\000\000\006\209\000\000\018\245\018*\000\000\018\245\006\209\000\000\000\000\018\245\000\000\000\000\000\000\000\000\000\000\006\209\000\000\000\000\000\000\000\000\018\245\000\000\018\245\000\000\006\209\018\245\018\245\006\209\000\000\000\000\000\000\006\209\000\000\000\000\000\000\000\000\b\021\r\138\000\000\000\000\000\000\b\021\006\209\018\245\006\209\b\021\000\000\006\209\006\209\000\000\000\000\000\000\000\000\000\000\000\000\b\021\020\234\000\000\000\000\b\021\000\000\b\021\006\201\000\000\000\000\006\209\000\000\006\201\000\000\000\000\006\233\006\201\000\000\b\021\000\000\006\233\000\000\000\000\031\146\006\233\b\021\006\201\014\006\000\000\000\000\006\201\000\000\006\201\006\233\006\233\000\000\000\000\000\000\006\233\b\021\006\233\000\000\006\233\000\000\006\201\b\021\b\021\000\242\000\000\000\000\000\000\006\201\006\233\000\000\b\021\000\000\006\233\000\000\006\233\006\233\000\000\000\000\006\201\b\021\000\000\006\201\000\000\000\000\000\000\000\000\006\233\006\201\000\000\006\233\000\000\000\000\000\000\006\233\000\000\006\233\006\201\b\021\000\000\b\021\000\000\000\000\b\021\b\021\006\233\006\201\000\000\006\233\006\201\000\000\000\000\000\000\006\201\006\233\000\000\000\000\000\000\000\000\000\000\000\000\b\021\000\000\006\233\006\201\000\000\006\201\000\000\000\000\006\201\006\201\000\000\006\233\000\000\006\233\006\233\000\000\006\233\006\233\006\233\006\185\000\000\000\000\000\000\000\000\006\185\000\000\006\201\000\000\006\185\006\233\000\000\006\233\000\000\000\000\006\233\006\233\000\000\000\000\006\185\"\158\000\000\000\000\006\185\000\000\006\185\000\000\000\000#\162\000\000\000\000\000\000\000\000\006\233\000\000\000\000\000\000\006\185\000\000\000\000\000\000\000\000\000\000\000\000\006\185\000\000#\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\185\000\000\000\000\006\185\000\000\000\000\000\000\000\000\000\000\006\185\000\000\t\237\t\237\t\237\000\000\000\000\000\000\000\000\006\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\185\003\166\000\000\006\185\t\237\t\237\t\237\006\185\000\000\000\000\000\000\000\000\000\000\000\000\t\237\000\000\t\237\000\000\006\185\000\000\006\185\000\000\000\000\006\185\006\185\000\000\000\000\006\249\000\000\t\237\t\237\t\237\006\249\000\000\000\000\t\237\006\249\t\237\t\237\t\237\000\000\006\185\000\000\000\000\000\000\t\237\006\249\000\000\000\000\000\000\006\249\000\000\006\249\005y'.\000\000\005y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\249\000\000\000\000\t\237\000\000\000\000\000\000\006\249\000\000\005y\005y\000\000\005y\005y\003\190\000\000\000\000\000\000\000\000\000\000\000\000\006\249\000\000\000\000\007\146\000\000\000\000\006\249\b\166\000\000\001\218\001\242\001\246\000\000\000\000\005y\006\249\000\000\000\000\000\000\000\000\000\000\003\154\000\000\t\237\006\249\000\000\t\134\000\000\000\000\001\250\0022\002\014\000\000\000\000\000\242\000\000\000\000\000\000\000\000\002\026\000\000\001\222\006\249\000\000\006\249\000\000\000\000\006\249\006\249\000\000\000\000\005y\000\000\003\206\002:\001\226\002Z\000\000\n\221\000\000\003R\n\221\003b\003\150\003\162\006\249\000\000\000\000\000\000\000\000\003\174\005y\000\000\005y\000\000\000\000\000\000\000\000\n\221\n\221\000\000\n\221\n\221\000\000\000\000\005y\005y\000\000\005\137\n\214\005y\005\137\003\178\000\000\005y\000\000\005y\000\000\000\000\000\000\005y\000\000\005y\000\000\n\221\000\000\000\000\000\000\005\137\005\137\000\000\005\137\005\137\000\000\000\000\000\000\n\245\000\000\000\000\n\245\000\000\000\000\000\000\000\000\n\221\000\000\000\000\000\000\000\000\000\000\000\000\003\234\000\000\003\238\005\137\000\000\n\245\n\245\000\000\n\245\n\245\n\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\153\000\000\000\000\005\153\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\n\221\n\245\n\221\000\000\000\000\000\000\000\000\000\000\005\153\005\153\005\137\005\153\005\153\000\000\n\221\n\221\000\000\000\000\n\214\n\221\000\000\000\242\000\000\n\221\000\000\n\221\000\000\000\000\000\000\n\221\005\137\n\221\005\137\000\000\005\153\000\000\000\000\000\000\n\245\000\000\000\000\000\000\000\000\000\000\005\137\005\137\000\000\000\000\n\214\005\137\000\000\000\000\000\000\005\137\000\242\005\137\000\000\000\000\n\245\005\137\n\245\005\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\153\011\026\n\245\000\000\000\000\n\214\n\245\000\000\000\000\000\000\n\245\000\000\n\245\000\000\000\000\000\000\n\245\000\000\n\245\000\000\005\153\000\000\005\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\153\005\153\000\000\000\000\n\214\005\153\000\000\000\000\000\000\005\153\005\185\005\153\007\146\005\185\000\000\005\153\000\000\005\153\001\218\001\242\001\246\0212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\185\005\185\000\000\005\185\005\185\000\000\000\000\000\000\001\250\001\254\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\026\000\000\001\222\000\000\000\000\000\000\005\169\000\000\005\185\005\169\000\000\000\000\000\000\000\000\000\000\002\030\001\226\002Z\000\000\000\000\000\000\003R\000\000\003b\003\150\003\162\005\169\005\169\000\242\005\169\005\169\003\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\185\000\000\000\000\000\000\000\000\000\000\000\000\005\169\003\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\185\000\000\005\185\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\005\185\005\185\000\000\000\000\n\214\005\185\000\000\000\000\000\000\005\185\005\169\005\185\000\000\000\000\000\000\005\185\000\000\005\185\000\000\000\000\001\218\002\"\001\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\169\000\000\005\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\003Z\002\014\000\000\005\169\005\169\000\000\000\000\n\214\005\169\002\026\000\000\001\222\005\169\000\000\005\169\000\000\000\000\002j\005\169\000\000\005\169\t\233\t\233\t\233\002:\001\226\002Z\000\000\000\000\000\000\003R\000\000\003b\003\150\003\162\000\000\000\000\000\000\000\000\000\000\003\174\t\233\t\233\t\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\233\000\000\t\233\000\000\000\000\000\000\011R\000\000\000\000\000\000\000\000\003\178\001\218\001\242\001\246\t\233\t\233\t\233\000\000\000\000\000\000\t\233\000\000\t\233\t\233\t\233\000\000\000\000\000\000\000\000\000\000\t\233\001\250\0022\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\026\000\000\001\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\233\000\000\000\000\000\000\002:\001\226\002Z\020\145\020\145\020\145\003R\000\000\003b\003\150\003\162\000\000\000\000\000\000\000\000\000\000\003\174\000\000\000\000\000\000\000\000\000\000\000\000\020\145\020\145\020\145\r\158\000\000\000\000\000\000\000\000\000\000\000\000\020\145\000\000\020\145\000\000\000\000\003\178\011R\000\000\000\000\000\000\000\000\007*\001\218\001\242\001\246\020\145\020\145\020\145\000\000\000\000\000\000\020\145\000\000\020\145\020\145\020\145\000\000\000\000\000\000\000\000\000\000\020\145\001\250\001\254\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\026\000\000\001\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\145\001\218\002\"\001\246\002\030\001\226\002Z\000\000\000\000\000\000\003R\000\000\003b\003\150\003\162\000\000\000\000\000\000\000\000\000\000\003\174\001\250\029\154\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\026\000\000\001\222\000\000\000\000\000\000\000\000\000\000\002j\000\000\000\000\003\178\000\000\006\217\000\000\002:\001\226\002Z\006\217\000\000\000\000\003R\006\217\003b\003\150\003\162\000\000\000\000\000\000\000\000\000\000\003\174\006\217\000\000\000\000\006\193\006\217\000\000\006\217\000\000\006\193\000\000\000\000\000\000\006\193\000\000\000\000\000\000\000\000\000\000\006\217\000\000\000\000\003\178\006\193\000\000\000\000\006\217\006\193\000\000\006\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\217\006\193\000\000\000\000\000\000\000\000\006\217\000\000\006\193\000\000\000\000\000\000\000\000\000\000\000\000\006\217\006\241\000\000\000\000\000\000\000\000\006\241\006\193\000\000\006\217\006\241\000\000\000\000\006\193\000\000\000\000\000\000\000\000\000\000\000\000\006\241\000\000\006\193\000\000\006\241\000\000\006\241\006\217\000\000\006\217\000\000\006\193\006\217\006\217\000\000\000\000\000\000\000\000\006\241\000\000\000\000\000\000\000\000\000\000\000\000\006\241\000\000\000\000\000\000\006\193\006\217\006\193\000\000\000\000\006\193\006\193\000\000\000\000\000\000\006\241\000\000\000\000\000\000 \234\000\000\006\241\001\218\001\242\001\246%N\000\000\000\000\006\193\000\000\006\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\241\000\000#2\001\250\001\254\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\026\000\000\001\222\000\000\000\000\006\241\000\000\006\241\000\000\000\000\006\241\006\241\000\000\000\000\000\000\002\030\001\226\002Z\000\000\000\000\000\000\003R\000\000\003b\003\150\003\162\000\000\000\000\006\241\000\000\000\000\003\174\000\000\000\000\001\218\001\242\001\246%\174\007\r\000\000\000\000#\210\000\000\000\250\000\000\000\000\000\000\b\130\000\000\000\000\000\000\000\000\000\000\003\178\001\250\001\254\002\014\b\174\000\000\000\000\000\000\007\r\000\000\b\178\002\026\000\000\001\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\190\000\000\000\000\000\000\002\030\001\226\002Z\031V\000\000\000\000\003R\019Y\003b\003\150\003\162\019Y\000\000\000\000'Z\000\000\003\174\031\186\000\000\000\000\000\000\019Y\000\000\031\210\000\000\000\000\000\000\019Y\000\000\000\000\000\000\000\000\031\218\000\000\000\000\000\000\000\000\000\000\003\178\019Y\000\000\031\234\000\000\000\000\000\000\000\000\019Y\000\000\000\000\000\000\000\000\000\000\000\000\007\001\000\000\000\000\000\000\019Y\000\250\031\242\019Y .\002\138\000\000\007\r\007\r\019Y\000\000\000\000\000\000\000\000\000\000 n\000\000\000\000\019Y\007\001\000\000\b\178\000\000\000\000\000\000$\146\000\000\019Y\000\000\000\000\019Y\000\000\000\000 r\019Y\000\000\000\000\000\000\000\000\000\000 \154\000\000\000\000\000\000\000\000\019Y\000\000\019Y\000\000\000\000\019Y\000\000\000\000\000\000\031\186\000\000-\130\000\000\000\000\000\000\031\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019Y\031\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\242\000\000!:\000\000\000\000\007\001\007\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!J")) and lhs = - (8, "\014\r\012\011\n\t\b\007\006\005\004\003\002\001\000\247\247\246\246\246\246\245\244\244\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\243\242\242\241\240\239\239\239\239\239\239\239\239\238\238\238\238\238\238\238\238\237\237\237\236\236\235\234\234\234\233\233\232\232\232\232\232\232\231\231\231\231\231\231\231\231\230\230\230\230\230\230\230\230\229\229\229\229\228\227\226\226\226\225\225\225\224\224\224\224\224\224\223\223\222\222\222\222\221\221\221\220\220\220\220\219\218\218\218\218\218\217\217\216\216\215\215\214\214\213\213\212\211\210\209\209\208\208\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\207\206\206\206\205\204\204\204\204\203\203\202\202\201\201\201\201\201\201\200\199\198\198\197\197\196\196\195\194\194\193\193\192\191\191\190\189\188\187\186\185\185\185\184\184\184\183\182\182\182\182\182\182\181\181\181\181\181\181\181\181\181\181\181\181\181\181\181\181\180\180\179\179\179\179\179\179\179\179\179\178\178\177\177\177\176\176\176\175\175\175\175\174\174\173\173\172\172\171\171\170\170\169\169\168\168\167\167\166\166\165\165\164\164\164\163\163\163\163\162\162\161\161\160\160\159\159\159\159\159\158\158\158\158\157\157\157\156\156\156\156\156\156\156\155\155\155\155\155\155\155\154\154\153\153\152\152\152\152\152\152\151\151\150\150\149\149\148\148\147\147\147\146\145\145\145\145\144\144\144\143\143\143\143\143\143\143\143\143\143\142\142\141\141\140\140\140\140\140\140\140\140\140\140\140\140\140\140\139\138\137\136\136\135\135\135\134\134\134\134\134\133\132\132\131\130\130\129\129\129\129\129\129\128\128\127\127~~~~~~~~~~~~~~}}||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzyyxxwwvvuuttsssrrqqppoonnmmmmmmmmmmmmmmmmmmlllkjihgfedcba``````````___^^^]]]]]\\\\\\\\\\\\\\\\\\[[ZZZZZYYXXWVUUTTTTTSSRRQQQPPPPPPOOONNMMLLKKJJIIHHHHGGGFFEEDDCCBBAA@@????>>======<<;;::::::99988877766543333333333333333333222222111110000000000////////////////////////////////////////////////////////////////////////////////////..-----------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++**))))))))))))))))))))))))))))))))))))((''''''''''''''''&&%%$$$$$$$$$$$$$$####\"\"!!!!! \031\030\030\029\029\029\028\028\028\028\028\028\028\028\028\028\027\027\026\026\025\025\025\025\024\024\023\022\022\022\022\022\021\021\021\021\020\019\019\018\018\018\017\017\017\016\016\016\016\016\016\015\015") + (16, "\000\014\000\r\000\012\000\011\000\n\000\t\000\b\000\007\000\006\000\005\000\004\000\003\000\002\000\001\000\000\001\004\001\004\001\003\001\003\001\003\001\003\001\002\001\001\001\001\001\000\001\000\000\255\000\255\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\253\000\253\000\252\000\251\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\248\000\248\000\248\000\247\000\247\000\246\000\245\000\245\000\245\000\244\000\244\000\243\000\243\000\243\000\243\000\243\000\243\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\240\000\240\000\240\000\240\000\239\000\238\000\237\000\237\000\237\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\235\000\235\000\235\000\235\000\235\000\235\000\234\000\234\000\233\000\233\000\233\000\233\000\232\000\232\000\232\000\231\000\231\000\231\000\231\000\230\000\229\000\229\000\229\000\229\000\229\000\228\000\228\000\227\000\227\000\226\000\226\000\225\000\225\000\224\000\224\000\223\000\222\000\221\000\220\000\220\000\219\000\219\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\217\000\217\000\217\000\216\000\215\000\215\000\215\000\215\000\214\000\214\000\213\000\213\000\212\000\212\000\212\000\212\000\212\000\212\000\211\000\210\000\209\000\209\000\208\000\208\000\207\000\207\000\206\000\205\000\205\000\204\000\204\000\203\000\202\000\202\000\201\000\201\000\201\000\201\000\201\000\200\000\199\000\198\000\197\000\196\000\195\000\195\000\195\000\194\000\194\000\194\000\194\000\194\000\194\000\193\000\192\000\192\000\192\000\192\000\192\000\192\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\188\000\188\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\186\000\186\000\185\000\185\000\185\000\184\000\184\000\184\000\184\000\184\000\184\000\183\000\183\000\183\000\183\000\182\000\182\000\181\000\181\000\180\000\180\000\179\000\179\000\178\000\178\000\177\000\177\000\176\000\176\000\175\000\175\000\174\000\174\000\173\000\173\000\172\000\172\000\172\000\171\000\171\000\171\000\171\000\170\000\170\000\169\000\169\000\168\000\168\000\167\000\167\000\167\000\167\000\167\000\166\000\166\000\166\000\166\000\165\000\165\000\165\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\162\000\162\000\161\000\161\000\160\000\160\000\160\000\160\000\160\000\160\000\159\000\159\000\158\000\158\000\157\000\157\000\156\000\156\000\155\000\155\000\154\000\154\000\153\000\153\000\153\000\152\000\151\000\151\000\151\000\151\000\150\000\150\000\150\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\148\000\148\000\147\000\147\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\145\000\144\000\143\000\142\000\142\000\141\000\141\000\141\000\140\000\140\000\140\000\140\000\140\000\139\000\138\000\138\000\137\000\136\000\136\000\135\000\135\000\134\000\134\000\133\000\133\000\133\000\133\000\133\000\133\000\132\000\132\000\131\000\131\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\129\000\129\000\128\000\128\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000~\000~\000}\000}\000|\000|\000{\000{\000z\000z\000y\000y\000x\000x\000w\000w\000w\000v\000v\000u\000u\000t\000t\000s\000s\000r\000r\000r\000q\000q\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000p\000o\000o\000o\000n\000m\000l\000k\000j\000i\000h\000g\000f\000e\000d\000c\000c\000c\000c\000c\000c\000c\000c\000c\000c\000b\000b\000b\000b\000b\000a\000a\000a\000a\000a\000a\000a\000a\000a\000`\000`\000_\000_\000_\000_\000_\000^\000^\000]\000]\000\\\000[\000Z\000Z\000Y\000Y\000Y\000Y\000Y\000X\000X\000W\000W\000V\000V\000V\000U\000U\000U\000U\000U\000U\000T\000T\000T\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000R\000R\000R\000R\000R\000R\000Q\000Q\000Q\000Q\000Q\000Q\000P\000P\000O\000O\000N\000N\000M\000M\000L\000L\000K\000K\000J\000J\000J\000J\000I\000I\000I\000H\000H\000G\000G\000F\000F\000E\000E\000D\000D\000C\000C\000B\000B\000A\000A\000A\000A\000@\000@\000@\000@\000?\000?\000>\000>\000=\000=\000=\000=\000=\000=\000<\000<\000<\000;\000;\000;\000:\000:\000:\0009\0009\0008\0007\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0005\0005\0005\0005\0005\0005\0004\0004\0004\0004\0004\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0002\0001\0001\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000/\000.\000.\000-\000-\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000+\000+\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000)\000)\000(\000(\000'\000'\000'\000'\000'\000'\000'\000'\000'\000'\000'\000'\000'\000'\000&\000&\000&\000&\000%\000%\000$\000$\000$\000$\000$\000#\000#\000\"\000!\000!\000 \000 \000 \000\031\000\030\000\029\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\027\000\027\000\026\000\026\000\025\000\025\000\025\000\025\000\024\000\024\000\023\000\022\000\022\000\022\000\022\000\022\000\021\000\021\000\021\000\021\000\020\000\020\000\019\000\019\000\018\000\018\000\018\000\017\000\017\000\017\000\016\000\016\000\016\000\016\000\016\000\016\000\015\000\015") and goto = - ((16, "\002\028\001\147\000\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\187\003X\000)\001O\000g\000\030\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000K\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\154\000\228\001\138\000\000\000\000\000\000\000\000\000\000\000\000\001Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029\212\000\000\000\011\000\000\000\000\000\000\001\172\000\000\000\016\000\000\000\000\001\156\000\134\000\166\000\000\000\000\000\000\001\156<\254\002H\002^\000\158\000\000\000\000\000\000\002 \000\000\000\000\000\136\000\000\000\000\000\000\000\000\000\000\003D\000\000\000\230\000\000\003|\000\000\002v\003\202\000\000\001\250\000\000\000\000\000\000\000\000\000|\000\000\000\000\000\000\004T\000\000\003\004\004x\000\000\000x\001T\000\178\000\000\000\000\004z\004t\000\000\000\000\003X\000\000#h\029\212\000\000\003\198\000\000\004\234\000\000\000\000\000\000\000~@X\0050\n\204\004\012\000\000\029\212\003p\002\210\n\012\000\000\000\000\004\210\004\226\n\194\000\000\030\246\004\250\005H\005tZ~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)^\000\000\006\020\005R\006\196\000\000\000\000\000\000\000\000\000\204\000\000\000\000\005\200\000\240\006\128\005\162\006>\006\192\002\188\005\194\002\222\002l\004z\bF\000\188\005\142\000D\007P\000\000\000\000\000\000\007\158\007\184\b,\003\128\000\000\000\000\003\228\b\252D\142\011\016\007\254\t\028\001\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\"\tp\011(\b\240\030\246#\162\011\222\000\000E\150\0124F\030FrF\186\000\000\000\197\000\000\000\000\000\000\000\000\t\006a\144\t$\000\000+\168\t<\000\000PD8\134\000R\000\000\000\000\005\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Zz\b\192\000\000\000\000\000\000\000\000\000#\000\000\000\000\000\000\004\146\000\000\000\000\004T\000\196\000\000\000\000\000\000\016xU\250\000\000\000\000\006\004\003\190\000\000\000\000\000\000hh\bZXt\000\000\tX\000\000\000\000\n\000\000\000\006:\000\000\000\000h\218\000\000\007x\000\000\002^\000\000\000\000\r\210\000\000\0044\000\000\000\000\015\030\000\000\004T\b\166\004T\000\000\000\000\000\000\n\014\000\000\000\000\000\000\006j\000\000\000\000\nR\000\000\007\002\000\000\000\000\007x\000\000h\240\007x\000\000\007x\000\000h\250\007x\000\000\r(\000\000\000\000\017\028\000\000\000\000\029\184\000\000\000\000\018*\000\000\019|bj\000\000i|\007x\000\000#\168\000\000\000\000\021p\000\000\000\000*\224\000\000\000\000\021\202\000\000\021\246\000\000\000\000\000\000\000\000\000\000?`\000\000\n\020\011\142\000\000i\246\n2&\164\000\000\000\000\000\000\000\000\007x\000\000\000\000\000\000Z\132\000\000\000\000\000\000\000\000\000\000\000\000\000\143\011\224\000\000\000\000\000\000\007x\012\018[\138\011d\nL\023\190\000\000\006\146\000\000\000\000\000\000\007>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002j\000\000\000\000\000\000\000\000\000\000\000\000\rr[\154\000\000\000\000\012>\nV\\V\000\000\000\000\000\000\\f\003\246\\\164\000\000\003\246\000\000]\\\003\246\000\000]p)^\012\234\012\244\000\000\000\000dV\000\000\000\000\000\000\000\000\000\000\000\000\003\246\000\000\000\000^\018\000\000\003\246d\144\000\000\007x\000\000\000\000^(\000\000\003\246\000P\000\000\000\000\003\246\003\246\000\000\000\000\003\246\000\000\000\000F\186\000\000\000\000\000\000\000\000\003\246GV\000\000\000\000\003\246\000\000\001\238\r\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000%\018\000\000\000;\000\000dp\000\000i\254\007x\007x\012\150\000\000\000\000\000\000\000\000\000\000\000\000\000P\012\156\r4\012\166\012n\012z\012\132\n^\004\004\nd\003\214\r \000\000\000\000\002\164\006r\000\000\b\190\n\136\006\214\012\172\0126\000\000\000X\001\192\tf\003\232\014\198\000\000\000\000q \000\000q(\014Z\000\000j\b\007xj \007x\000\000\002\240\002$\000\000\016\128\000X\000\000\000\000\rv\000\000\000\000\000\000\000\000\000\000\016\158\000X\018 \000X\000\000\007b\000\000\000\000\007h\000\000\000\000\000\000\014\234\000\000\000\000\000\000\000\000\000X\000X\000\000\000\000\000X\000\000\012\172\004x\000\000\001\154\003\228\000\000\001\154\000\000\000\000\019\030\000X\000\000\000\000\000\000\000\000\000\000\000\000\001\154\012\244%P%h\014\154\014,G\188^|\000\000\rj\n\146\r\004\rt\n\1684\220e\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004v\t\000\000\000\000\000\000\000\rv\n\186\005\184\001\154\021b\000\000\000X\000\000\000\000\000\000\0124\000\000j\250\007x\r|\rx\n\212\014<\r|\n\222%\140H8\003\246\014L\r\132\n\254H\"\014|\000\000&&\003\246d\128\000\000k\012\007x\007xHt\014V\000\000\000\000\014`\000\000\000\000\000\000\000\000'\002\000\165\000\000\000\000\007D\000\000\000\000\000\000\b\222\000\000\000\000\000\000\000\000\000\000\003\202\000\000\000\000\003\246d\144\000\000k\"\007x\000\000I.\000\000\000\000e\150'@\003\246e\\\000\000k8\007x\000\000^\244\003\246\000\000\014\202\r\224\000\000\000\000\r\228\000\000\t:\000\000\000\000\000\000k\128\007x\000\000\000\000\000\000a\200\000\000\000\000\014\144\b\234\004T\000\000\014\158\014\030\011P'\182\000\000H\218\014`\011\\'\248\000\000I\230\000\000\000\000\014z\011f_2\003\246\015\"\015t\014\132\011ll\028\000\000\000\000\000\000lN\000\000\000\000(R\014\172\011t(\196\000\000(\160J2\014\178\011z(\220\000\000\026\166\000\000\000\000\016\030l\130\000\000\007xe\156\000\000\007xl\134\007x\000\000\000\000\000\000\000\000\000\000lj\000\000\000\000\000\000\004\014\015\132\000\000\000\000\000\000\000\000J<\014\182\011\138*@\000\000m \000\000\000\000\000\000\000\000\000\000\014\128\016D\000\000\000\000\002\208J\142\014\212\011\146*|\000\000\002\208J\244\014\220\011\166*\148\000\000\002\208\000\000ml\000\000KF\014\230\011\170+6\000\000\002\208\016\188\006F\016\204\000\000\000\000KP\0156\011\196+N\000\000\002\208LX\015b\011\200,D\000\000\002\208L\154\015t\011\216,\\\000\000\002\208L\246\015\164\011\220,\250\000\000\002\208M\000\015\212\011\244-\022\000\000\002\208M\\\015\228\012\006-h\000\000\002\208M\158\015\240\012(.\012\000\000\002\208N\004\015\244\0122.L\000\000\002\208N\166\016\012\012D/\002\000\000\002\208N\244\016\018\012R/\030\000\000\002\208OJ\016(\012f/p\000\000\002\208O\170\016,\012r/\184\000\000\002\208O\180\0162\012t0*\000\000\002\208P\n\016<\012v0\156\000\000\002\208P\192\016L\012\1480\222\000\000\002\208Q^\016Z\012\1641P\000\000\002\208Q\136\016\180\012\1701\146\000\000\002\208Q\214\016\198\012\2282\004\000\000\002\208Q\230\016\212\012\2482F\000\000\002\208RD\016\214\012\2522\184\000\000\002\208\r\016\017\218\017\"\018v\000\000e\156\000i\000\000m\132\007x\018\196\000\000\000\000m\162\007x\018\220\000\000\000\000\019H\000\000\000\000\007P\000\000\000\000\019\128\000\000\000\000\000\000\000\000m\196\007x\019\236\000\000\016\176\020\142\000\000_\172\000\000\003\246_\234\000\000\003\246`(\000\000\003\246\b$\000\000\000\000\000\000\000\000\000\000`d\003\246\b\226\020\242e\234\000\000n\016\007x\0216\000\000\000\000\021\150\000\000\000\000\000\000\t\180\n\138\000\000\000\000\000\000\002\208\021\174\000\000\000\000\000\000\022:\000\000\000\000\000\000\000\000\000\0003(\000\000\000\000\000\000\002\20832\000\0003\154\000\000\000\000\000\00046\000\000\000\000\000\000\000\000n\222\000\000\000\0004\210\000\000\000\000\000\000R\166\016\240\r 5\024\000\000\002\2085:\000\000\000\000\000\000S|\017\n\r(6H\000\000\002\2086\176\000\000\000\000\000\000S\140\017\020\r06\236\000\000\002\208\006&\022\154\000\000\000\000S\222\017\024\rd7\004\000\000\002\208\023\\\000\000\000\000S\238\017\028\rj7\190\000\000\002\208\023\224\000\000\000\000TD\017*\rn8&\000\000\002\208\000\000\000\0007j\000\000\000\000TN\017<\r\1588\220\000\000\002\2089$\000\000\000\000U\138\017h\r\1709\150\000\000\002\2089\222\000\000\000\000U\148\017x\r\178:\186\000\000\002\208\000\000U\234\017z\r\204:\252\000\000\002\208\000\000%\212\000\000\000\000\002\208\000\000\000\000\000\000:\196\000\000\000\000;b\000\000\000\000\000\000\017\150\000\000\000\000\0242\000\000\024B\000\000\000\000\000\000\002\208\000\000\000\000\025\002\000\000\025z\000\000\000\000\000\000\000\000\000\000U\244\017\158\r\220;\216\000\000VJ\017\160\r\236\162\000\000\002\208X\172\018*\014t>\226\0186X\196\018F\014\134?\152\000\000\002\208\002\208Yf\018J\014\140?\180\000\000\002\208\000\000\000\000\000\000\0184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\170\0184\000\000@\002\018\\\014\152@\186\005\238\0184\000\000\000\000\000\000\000\000\000\000\007X\0184\000\000@~\000\000\018^\014\156A\156\b8\0184\000\000\000\000\000\000\000\000\t$\0184\000\000\019\186\000\000\000\000\000\000aJ\000\000\003\138\000\000\011B\019h\000\000\007\b\000\000\000\000\000\000\000\000\000\000\000\000\004v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\170\014\162A\238\000\000\002\208\000\000\019\246\000\000\000\000\000\000\000\000\000\000\018\190\014\192BV\b\176\0184\000\000\000\000\000\000\000\000\t2\0184\000\000\018\204\014\198B\146\t\"\0184\000\000\000\000\000\000\000\000\000\000\t<\0184\000\000\000\000\014\202\006J\001\154\026J\000\000\018\216\014\210\019\130\005\200\006\174\001\154\021\240\000\000\000X\006\218\001\154\000\000\027 \000\000\t\248\000\000\018\244\014\226\t\166\000\000\000\000\000\000\000\000\000\000\019$\004\168\001H\000\000\000\000\000\000\000\000f\006\000\000q`\000\000\014\228\000\000\014\240\000\000\000\000\000\000\000\000\002z\000\000\000\000\011\218\004T\000\000\r\180\014\224\004T\004T\000\000\004T\001\\\n\204\0192\000\000\000\000\004\226\000\000\017\250\004T\004T\000\000\0182\004T\004T\014\242\000\000\0270\000\000\000\000\015\020\020&\000\000\028<\011\174\000\000\000\000\000\000\000\000\019\240\000\000\000\000\000\000\000\000\019&\015\024B\170\000\000\002\208\000\000\019(\015 Cd\n\144\0184\000\000\000\000\000\000\000\000\000\000\t\136\0184\000\000\000\000\0190\0154\007\212\001\154\000\000\022\180\000\000\000X\000\000\020\166\000\000\000\000\000\000\000\000\000\000C\204\000\000\000\000\019D\015DD@\000\000\000\000\000\000\023\"\000\000\000X\000\000\025\248\000\000\000X\000\000\0286\000X\000\000\002\208\000\000\000\000\031\152\000\000\000X\000\000\031\188\000\000\000X\000\000\031\198\000X\000\000\002\188\000\000\015F\b\212\004V\000\000\019H\019L\015T\019v\020\030 \004\000X\011\192\000\000\015d\019\238\019\240\n\174\012\240\019\198\015h\020\016\n\180\r\148\019\218\000\000\000\000\011\014\r\224\000\000\007\204\003>aZ\003\246\027\240\000\000\t>\000\250\000\000\000\000\019\148\015~\012t\000\0007\006\000\000nj\007x\000\000\020F\020J\000\000\014(\000\000\007x\019\158\015\134\011`\019\198\000\242\000\000\000\000\000\000\000\000\015\148\014>\000\000\015\182\014F\000\000\b^0\n\019\174\019\176\015\186\011x\014\148\000\000\015\234\012N\014\212\000\000\019\196\019\198\015\238\019\236\020\030!\148\000X\000\000\015\250\020Z\000\000\012f\000\000\015\128\000\000\020\\\000\000!\178\002\182\020(\016\012\020`\000\000\"\196\003\170\020,\000\000\000\000\012n\003\004\000\000\016&\000\000#\206\000X\016.\000\000\014l\000\000\000\000\019\212\016\026\012\028\019\198\019\218\019\220\0168\021h\000\000\019\238\000-\000\000\000\000\000\000\011\138\000\000\000\000\000\000\000\219\016:\019\192n\198\007x\000\000\001\128\016<\020\142\000\000\000\000\000\000\000\000\000\000\000\000o\n\007x\000\000\016>\020\244\000\000\000\000\000\000\000\000\000\000\000\000B\172\016\168\000\000\016d\001\n\000\000\016j\016r\n\196\000\000\004\194K\016\000\000\005~\000\000o4\007x\007x\000\000\000\000\tR\000\000\n\254\000\000\005\018\tR\tR\000\000\016xf\150\007xo\\\007x\016\246\000\000\000\000\000\000\000\000\017\018\000\000\000\000\001\244\000\000\n6\020H\016\130\021z\020\004\000\000\000\000\005N\nf\020V\000\000\000\000\016\174\021\148\020\026\000\000\000\000\b\172\000\000\025\250\000\000\014R\0062\007x\000\000\024N\026\162\000\000\027Z\000\000\000\000\000\000\tR\000\000\000\000\017<\020f\016\190\021\156\020(\000\000\000\000\028\146\017d\020v\000\000\000\000\000\0009\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017f\000\000\020$\016\212$\168\n\188\000\000\020\132\016\216\nH\000\000\b\b\021\148\021:\017h\020\152\000\000\000\000\000\000\020\158\017\006\n\158\000\000\n\138\000\000\028\1428\134\004\214\000\000\000\000\000\000\012f\020Z\017\028\000\000\020^\012f\000\000\021T\017\128\020\170\000\000\000\000\000\000\007x\000y\000z\007D\000\000\000\000\000\000\000\000\020f\017J\000\000\007\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007x\020R\017\128\021\218\020b\000\000\007\220'\002\000\249\017\130\0202\000\249\000\160\017\136\020\250\000\000\000\000\021\208\029\004\000\000\000\000\029\160\000\000\017\206\000\000\001\252\000\000\000\000\000\000\000\000\000\000\000\000o\160\007x\000\000\021\210\030$\000\000\000\000\030<\000\000\000\199\017\144\021n\000\000\000\000D\132b\146\007\252\000\000o\252\007x\030\162\000\000\000\000\031>\000\000\000\000\017\208\000\000\012\160\000\000\000\000\000\000\000\000\000\000\000\000c\\\000\000\000\000D\218cd\bh\000\000p\006\007x\031\218\000\000\000\000 @\000\000\000\000\017\156 X\017\234\000\000\017\168\017\176\000\229\006*\017\184\012\024\017\230\021x!j\018 \000\000\018\n\018\028\012\144\000\000\t\160f\178\000\000\007\180\000\000\018\030\"\254B8\017\242\0206\019d\000\000 \226%\212\000\000\005>\000\000\000\000\005>\000\000\000\000\005>\012\184\000\000\025\028\005>\021|!\128\018<\000\000\005>\000\000\000\000>\158\000\000\000\000\000\000\005>\000\000\000\000\018\142\000\000\026\206\t\220\018\220\000\000\0182f\220\018\224\000\000\000\000\000\000\000\000\018\244\000\000\000\000\006\200\000\000\005>Ap\000\000!\030\005>b\006\000\000\018\254\020\202\018t\022\004\020\140\000\000bP\0194\020\214\000\000\000\000\000\000\001f\012n\000\000\000\000\000\000\000\000\000\000\000\000\014\128\019B\000\000\020\134\018\178\nt\005\006\000\000\020\232\000\000\000\000\000\000\000\000\019\140\t\012\000\000\000\000\000\000\014\128\000\000\000\000\000\000\000\000\019\1424 \000\000\000\000\000\000\000\000\000\000\000\000\021\146\007\002\012|\020Z\005\222\018\188\000\000\b\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020f\007\236\018\212\000\000\t\128\015 \021\254\021\168\019\148\000\000\000\000\021\158\b\012\t\018\000\000\000\000\000\000\000\000\001\154\000X\000\000\000\000\003\246\000\000p&\007x\000\000\t\214\000\000\000\000\000\000\000\000E\166\000\000\000\000\000\000\000\000\000\000\000\000p\152\007x\000\000,\168\000\000\000\000!0\000\000\000\000gh\019\n\000\000\019\014\n\172\000\000\000\000\004T\011R\000\000\000\000\000\000\000\000\000\000q\000\007x\000\000F\206\000\000\000\000\"\144\000\000\000\000M\180\000\000\000\000#\138\000\000#\248cn\000\000q\024\007x\000\000\\\184\000\000\000\000$\242\000\000\000\000]\198\000\000\000\000&\146\000\000\007\222\000\000\000\000\000\000\007x\000\000\000\000!\188\021\178\019\152\000\000\000\000\021\166\001\024\005z\000\000\000\000\000\000\000\000\t\212\016(\021\254!\218\021\182\019\178\000\000\000\000\021\170\0040\t\020\000\000\000\000\000\000\000\000\000X\000\000\019\200\000\000\000\000\000\000\"\212\000\000#P\000\000\000\000\000\000\000\000\000\000\000\000\006\150\000\000\000\000\000\000\002\220\000\027\000\000\000\000\000\000\000\000\000\000\007\164\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\156\000\000\000\000\000\000g:\000\000\007x\000\000\n\002\000\000\000\000\000\000\0058\000\000\000\000\000\000\004\238\000\000\000\000\000\000\003V\000\000\001\154\000\000\000\139\000\000\000X\000\000\007\030\000\000\000\000\000\000Y\226\003\246\000\000\000\000\000\029\000\000\000\000\000\000\000\000\004v\003\244\020\206\000\n\000\000\000\000\000\000\000\000\000\000\000\000\020\208\003\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nx\000\000\019\232\000\000\000\000\000\000\000\000\005\022\006\196O\028g\204\000\000\000\000\020\020h`\000\000\000\000\000\000\020 hb\000\000\000\000\000\000\000\000"), (16, "\bg\002\205\001\221\002\206\002\207\001\243\000\184\002\208\006\239\tg\002\207\001\243\001\031\000<\001U\001#\001$\001Y\003c\bh\b|\007\150\001\031\bj\001Z\001#\001$\003h\ts\002\207\001\243\t[\001\031\bk\b}\001#\001$\bM\001F\000r\001\243\003\130\006\240\001[\001M\001P\003\017\000@\001\031\003\018\003\020\001#\0017\b$\bg\002\205\007\240\002\206\002\207\001\243\0018\002\208\001\224\b$\0020\001\243\bl\bP\002v\007\242\b\128\t\\\003c\bh\b|\t#\003\017\bj\002\142\004,\003\020\003h\002\146\ti\001M\001;\bR\bk\b}\b&\000\166\t\006\000\178\001d\001U\003\130\000\166\b\228\000\178\b&\002Y\001%\007\205\0059\007\"\bm\b'\000\184\t\014\002\135\000n\b)\001\191\003\136\bS\bU\b'\000A\007#\bn\bl\b)\007;\001[\b\128\b@\002\211\002\147\003\138\001#\001F\004h\tj\000\179\003\138\001#\001M\001]\0008\007\157\007\158\000\171\007\150\b\129\002\148\bg\002\205\000\171\002\206\002\207\001\243\tt\002\208\003\138\001#\002\\\000]\007\174\b\130\bm\005\\\007\167\006\021\003c\bh\b|\000a\003\136\bj\002a\000\182\bq\003h\bn\bs\000\171\000\183\bx\bk\b}\002\211\004h\003\138\001#\003\145\000\136\003\130\003\146\001F\000\171\bz\000\138\b\234\003\139\001M\001P\001^\b\129\000\142\bg\003\160\000e\002\028\003\141\000\138\001U\000y\001F\b{\006\195\001F\bl\b\130\001M\001]\b\128\001M\001]\bh\t\t\002v\t!\bj\t\029\006\031\bq\001\135\003\162\bs\002\174\002\142\bx\bk\0008\002\146\000\146\001M\005\252\003\145\002v\002\159\003\146\b\177\000x\bz\001F\006\007\003\139\007\207\002\142\bm\001M\001P\002\146\003\160\001M\002\028\003\141\003\136\b\141\007\157\007\158\b{\b\176\bn\bl\002\187\006\167\001Q\001#\001#\002\211\007\212\003\138\001#\b\139\001^\000\193\007\166\002\147\001F\003\162\007\167\006\021\002\141\000\194\001M\001P\b\129\000\195\bg\002\205\002\160\002\206\002\207\001\243\002\148\002\208\002\147\005\234\000\184\000\190\002\135\b\130\bm\000\170\001\135\000\171\003c\bh\t)\000\138\tC\bj\002\185\002\148\bq\003h\bn\bs\000\171\001F\bx\bk\b}\001a\000w\001M\001]\003\145\001\241\003\130\003\146\002\188\001U\bz\000;\001~\003\139\t\012\t\r\006\170\bo\002\028\001\127\003\160\007\"\002\028\003\141\005\245\005\247\005\249\006\167\b{\0073\001#\bl\bp\001\252\007\132\007#\007\167\006\021\001[\007*\001U\b\131\0057\001W\000\128\bq\002\163\003\162\bs\000\151\001f\bx\001M\000\184\b\162\002\135\bg\002\205\0076\002\206\002\207\001\243\001^\002\208\bz\007\216\t4\006\r\001\031\001[\bm\001#\0017\b\142\003c\bh\b|\0078\003\136\bj\002G\006\151\b{\003h\bn\000\140\002\138\007:\001d\bk\b}\002\211\006\016\003\138\001#\000\145\002\142\003\130\t\031\0079\002\146\tD\001M\002\028\001\b\001;\000:\001\128\b\129\004h\bg\002\205\004h\002\206\002\207\001\243\0076\002\208\000\177\001d\002\186\000\171\bl\b\130\000\138\001F\b\194\005\234\003c\bh\b|\001M\001]\bj\002\185\0078\bq\003h\001n\bs\t+\0059\bx\bk\b}\002\147\000\154\0008\t5\003\145\002v\003\130\003\146\002\170\005^\bz\001F\0079\003\139\0008\002\142\bm\001M\001]\002\146\003\160\001M\002\028\003\141\003\136\t{\002\207\001\243\b{\007\132\bn\bl\005\248\005\247\005\249\b\133\000\153\002\211\005\140\003\138\001#\000\174\006\207\t6\001F\006j\001^\003\162\t=\001M\001M\001]\002\153\005]\b\129\001#\bg\002\205\tW\002\206\002\207\001\243\006\219\002\208\002\147\001#\002\174\001z\000\171\b\130\bm\t~\t\127\000\171\003c\t\129\001\135\001^\003\136\bj\006\160\002\148\bq\003h\bn\bs\004h\002\174\bx\bk\t\131\002\211\t>\003\138\001#\003\145\002\172\003\130\003\146\001U\tX\bz\001\131\002\187\003\139\005U\001#\001\135\b\129\001\132\001\139\003\160\000\188\002\028\003\141\001b\000\168\002\141\t?\b{\002\186\006i\bl\b\130\002\187\005\153\001\243\001#\001[\001\031\003\159\001U\001#\0017\001W\001\t\bq\002\174\003\162\bs\t@\001f\bx\003\022\000\172\t\024\001U\003\020\t|\003\145\003\138\001#\003\146\002\174\000\200\bz\001F\001U\003\139\005a\001[\bm\001M\001P\006\213\003\160\005\141\002\028\003\141\003\136\002\188\002\178\004h\b{\002\187\bn\001\031\001#\001d\001#\0017\007\150\002\211\000\175\003\138\001#\001U\002\189\000\171\005\252\002\187\002\188\003\162\001#\002\185\004u\t\134\001\133\001#\0017\000>\bg\002\205\005g\002\206\002\207\001\243\t\146\002\208\000\205\001d\002\174\000\218\002{\b\130\001F\000\171\t\138\005\252\003c\t\139\001M\001]\002\165\bj\001U\t\001\bq\003h\001n\bs\001F\004\134\bx\bk\t\147\001j\001M\001]\002\141\003\145\002\188\003\130\003\146\000\215\002\175\bz\001F\002\187\003\139\006n\001#\000\186\001M\001]\000\171\003\160\002\188\002\028\003\141\004h\005[\001F\tS\b{\t\012\t\r\bl\001M\001]\000\189\bg\002\205\001F\002\206\002\207\001\243\002\015\002\208\001M\001]\001^\002\185\003\162\005\234\0008\001F\007\167\006\021\003c\bh\b\173\001M\001P\bj\000\184\001\006\002\135\003h\007\157\007\158\tO\001F\001z\bk\b}\bm\tT\001M\001]\001#\001\135\003\130\001^\003\136\002\188\007\159\007\175\004h\bC\bn\007\167\006\021\000\224\000\171\002\186\001F\002\211\001^\003\138\001#\001k\001M\001P\007\143\005\247\005\249\bl\bw\001^\t\151\001F\000\171\001\135\006\001\tP\001\139\001M\001]\000\207\b\217\001M\007\"\005a\001U\000\138\001F\001W\001_\b\130\001\210\000\223\001M\001P\001f\005n\007#\003\159\001^\006\002\007$\002\174\bq\006\t\000\229\bs\bm\0008\bx\000\246\001F\000\228\001\212\001[\003\136\003\145\001M\001P\003\146\007\028\bn\bz\007\"\007j\003\139\000\171\t\n\002\211\006\012\003\138\001#\003\160\001\233\002\028\003\141\002\220\007#\001^\002\187\b{\007)\001#\001I\002\186\b\129\005\216\bg\002\205\001M\002\206\002\207\001\243\007\"\002\208\007k\t-\007l\006\167\003\162\b\130\001#\t\011\t\138\001d\003c\t\139\007#\b\213\000\255\bj\007C\b+\bq\003h\002\174\bs\000\171\001F\bx\bk\t\142\000\171\001n\001M\001]\003\145\001\199\003\130\003\146\007m\007\030\bz\b\185\004\196\003\139\001\031\001#\0017\001#\001$\001F\003\160\005\219\002\028\003\141\002\188\001M\001]\005\202\b{\002t\002\187\bl\001\012\001#\005\145\bg\002\205\001\237\002\206\002\207\001\243\002v\002\208\002\174\002\167\b$\007n\003\162\004;\004\225\b\148\002\142\002\028\003c\bh\002\146\b\150\001M\bj\000\171\007o\007p\003h\007q\005a\002\174\001w\001F\bk\b\135\bm\000\245\000\138\001M\001]\001z\003\130\005\210\003\136\001\001\002\187\b&\t;\001#\bn\001^\007\181\000\249\007R\t_\001\146\002\211\001\003\003\138\001#\005u\000\138\002\188\b'\005\215\002\147\bl\002\187\b)\t\145\001#\001\241\b9\bT\001\242\001\243\001\004\001\244\007s\t/\001\135\007u\002\148\001\139\007z\007\134\0008\004h\b\130\003\170\001\031\004<\t`\001#\0017\001\245\0039\007\177\001\247\001\248\001\253\bq\002\142\bP\bs\bm\002\146\bx\001M\005\234\004T\001\243\002\188\003\136\003\145\007\178\000\171\003\146\001F\bn\bz\002\165\bR\003\139\001M\001]\002\211\005\141\003\138\001#\003\160\001\151\002\028\003\141\002\188\007j\002\155\000\138\b{\002\158\b\154\b\155\001M\b\138\001U\001M\001U\001\157\000\171\001W\bS\002\147\b\156\b\157\b\171\002\174\001f\003\162\b\130\007\163\005\247\005\249\b\158\006\021\003\011\007\007\007k\007\180\007l\004h\000\138\bq\005}\001[\bs\001[\001\031\bx\005\234\001#\001$\001\n\001U\001\254\003\145\001U\005\234\003\146\007S\006;\bz\007\127\002\187\003\139\003\017\001#\001\255\007\231\003\020\001#\003\160\007m\002\028\003\141\006\167\004[\001\243\001#\b{\002\205\005a\002\206\002\207\001\243\001[\002\208\001U\002\205\t<\002\206\002\207\001\243\bg\002\208\003\159\001d\003c\003\162\007\171\005\247\005\249\bZ\005\178\006k\003c\003h\b\252\005\247\005\249\007n\001\138\bh\006A\003h\001n\bj\001\019\b\151\003\017\003\130\005(\007\255\003\020\007o\007p\bk\007q\003\130\001\020\002\188\001F\007\132\001F\002\018\007U\b\031\001M\001]\001M\001]\002\027\0008\002\028\b\154\b\155\000\184\002z\002\135\b\160\007\181\002\028\001\028\b\152\002\174\006\137\b\156\b\157\b\\\bl\005\190\005\131\b\168\004h\004h\b\153\b\158\006\021\005\184\001F\001)\002v\001F\005\197\002\166\001M\001]\007s\001M\007X\007u\002\142\000n\007z\007\134\002\146\001\226\001M\006m\001z\000n\002\187\003\136\005a\001#\004h\007\177\001^\bm\001^\003\136\000\171\007\182\001F\t\021\002\211\001?\003\138\001#\001M\001]\0065\bn\002\211\007\178\003\138\001#\002\205\001B\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\001\135\002\208\001\135\002\147\001T\001\139\001\025\003c\001^\b\127\003\142\007Y\003c\003\015\b\172\t\025\003h\004h\003\142\000\138\002\148\003h\001\029\tK\bp\007#\005a\007^\b\193\007[\003\130\002\188\000\184\007}\002\135\003\130\003\145\bq\001\137\003\146\bs\001\135\001^\bx\003\145\003\139\007+\003\146\bg\b\152\t\011\001F\003\160\003\139\002\028\003\141\bz\001M\001]\0032\003\160\b\153\002\028\003\141\001*\000\138\001\031\t\129\bG\001#\001$\bj\003?\tM\b{\000\184\007\137\002\135\000\171\003\162\001r\bk\004h\005a\005a\001U\002\205\003\162\002\206\002\207\001\243\005a\002\208\001F\000\171\004j\005a\b$\003\159\001M\001]\001U\003\136\003c\001W\003\159\004h\003\136\b\186\005\220\003\159\001f\003h\006\143\bl\002\211\006.\003\138\001#\b\189\002\211\007%\003\138\001#\004h\002\205\003\130\002\206\002\207\001\243\001[\002\208\001g\b&\005a\002\174\000\171\002\205\bP\002\206\002\207\001\243\003c\002\208\005\229\006\021\001\208\003\142\003\159\004h\b'\003h\003\142\bm\003c\b)\007\139\bR\006I\b0\007<\001\206\004;\003h\001u\003\130\005\219\bn\001U\bv\006F\001\142\002\187\003\145\001\230\001#\003\146\003\130\003\145\002\006\001d\003\146\003\139\002h\007D\bS\002j\003\139\t\130\003\160\b+\002\028\003\141\000\184\003\160\006\243\002\028\003\141\003\136\001n\006|\001F\004i\006\129\002s\001\149\bp\001M\001]\002\200\b\212\002\211\007\025\003\138\001#\001#\003\162\001F\000\171\bq\002\203\003\162\bs\001M\001]\bx\007\132\007y\002\205\002\219\002\206\002\207\001\243\000\171\002\208\007%\001U\003\136\bz\002\188\005\142\007'\002\234\003\142\001#\003c\000\171\002\237\006\134\003\136\002\211\000\171\003\138\001#\003h\000\171\b{\005\219\000\171\007%\005\219\006)\002\211\002\243\003\138\001#\005a\001^\003\130\003\145\004h\001\241\003\146\001z\002P\001\243\000\171\001\244\003\139\004h\0008\000\171\003\142\001^\001F\003\160\001\153\002\028\003\141\001\202\001M\001]\000\171\b\215\003\142\001\245\002\228\b\213\001\247\001\248\001\253\000\171\002\141\006\182\003D\005\219\006\149\001\243\003\145\001M\003I\003\146\003\162\001\135\000\171\003P\001\139\003\139\003V\000\171\003\145\007\247\003`\003\146\003\160\003f\002\028\003\141\002\205\003\139\002\206\002\207\001\243\003\134\002\208\000\171\003\160\003\150\002\028\003\141\003\136\001\223\005\030\004V\004W\003c\002B\003\156\006\027\003\165\001^\003\162\001F\002\211\003h\003\138\001#\006w\001M\001]\001\229\006\028\003\176\003\162\003\182\006\164\006\021\002\205\003\130\002\206\002\207\001\243\003\188\002\208\003\194\002\205\000\171\002\206\002\207\001\243\b\213\002\208\000\171\002\016\003c\003\142\003\200\000\171\002v\007\251\000\171\002w\003c\003h\000\171\003\206\001\255\000\171\002\142\001#\005\199\003h\002\146\001U\001M\000\171\001\164\003\130\005\156\000\171\006\186\003\145\003\212\001\165\003\146\003\130\001M\003\218\001^\000\171\003\139\000\171\006\201\006\223\005!\005&\003\224\003\160\001M\002\028\003\141\004h\001[\003\230\000\171\002\205\000\171\002\206\002\207\001\243\003\136\002\208\b\026\003\236\000\171\001#\000\171\002\147\005\251\003\242\003\248\003\254\003c\002\211\003\162\003\138\001#\002@\000\171\006\231\006\021\003h\b2\002\018\002\148\001#\004\004\000\171\005\029\002\005\002\019\002\024\002\028\001U\004\n\003\130\002\023\004\016\b\018\003\136\002F\006\225\001d\002Z\000\171\003\142\002b\003\136\001U\000\171\006\029\001\129\002\211\006\022\003\138\001#\007\147\006\021\000\171\005\200\002\211\001\166\003\138\001#\002g\000\171\004\022\b\146\006\021\006}\002m\003\145\002\164\004h\003\146\000\171\004\028\001[\004\"\001F\003\139\000\171\000\171\000\171\003\142\001M\001]\003\160\004&\002\028\003\141\002\205\003\142\002\206\002\207\001\243\004\145\002\208\000\171\002\205\004\155\002\206\002\207\001\243\004\165\002\208\000\171\003\136\003c\000\171\003\145\004h\001U\003\146\003\162\007S\003c\003h\003\145\003\139\002\211\003\146\003\138\001#\005\n\003h\003\160\003\139\002\028\003\141\004\175\003\130\005\002\004\184\003\160\004\193\002\028\003\141\000\171\003\130\002\205\001[\002\206\002\207\001\243\001^\002\208\004h\000\171\001F\000\171\006\130\003\142\003\162\002\128\001M\001]\003c\004h\004\204\000\171\003\162\004h\002\130\001F\004\213\003h\002\145\000\171\004\222\001M\001]\000\171\002\162\005\171\001\135\000\171\005\167\003\145\002\199\003\130\003\146\004\229\001U\002\202\002\218\002\233\003\139\002\236\006\135\005\014\007U\002\242\003\005\003\160\002\255\002\028\003\141\005\019\005\026\003\002\004h\000\171\003\136\005.\000\171\002\205\000\171\002\206\002\207\001\243\003\136\002\208\0034\001U\001^\002\211\001\134\003\138\001#\003-\003\162\0030\003c\002\211\006\159\003\138\001#\001F\003@\001^\000\171\003h\004h\001M\007X\006\172\000\171\006\227\004\247\006\175\000\171\0053\001[\005?\006\000\003\130\002\205\003\142\002\206\002\207\001\243\003\136\002\208\000\171\002\205\003\142\002\206\002\207\001\243\001\135\002\208\000\171\005F\003c\002\211\005L\003\138\001#\003C\000\171\000\171\003c\003h\003\145\005Q\000\171\003\146\005X\006\183\004\246\003h\003\145\003\139\005l\003\146\005{\003\130\003\127\005\164\003\160\003\139\002\028\003\141\007Y\003\130\006\225\003\142\003\160\001F\002\028\003\141\003H\b\164\005\176\001M\001]\005\188\007#\005\201\007]\006\187\007[\005\207\000\171\003O\000\171\003\162\003\136\004h\003U\005\223\005\241\004>\001\135\003\162\003\146\005\001\005\243\006\018\001F\002\211\003\139\003\138\001#\000\171\001M\001]\000\171\003\160\003_\002\028\003\141\003e\003t\003\133\006\023\000\171\006&\004k\000\171\002\205\006,\002\206\002\207\001\243\000\171\002\208\000\171\003\136\003\149\000\171\006:\003\142\003\155\001^\003\162\003\136\003c\003\164\006L\006l\002\211\007\132\003\138\001#\000\171\003h\006r\000\171\002\211\000\171\003\138\001#\003\144\000\171\006y\001U\006\127\003\145\001\168\003\130\003\146\000\171\000\171\005\255\001^\006\202\003\139\006\148\000\171\000\171\004h\006\163\003\142\003\160\004h\002\028\003\141\003\175\006\171\002\205\003\142\002\206\002\207\001\243\001[\002\208\000\171\002\205\000\171\002\206\002\207\001\243\000\171\002\208\001\135\006\174\003c\006\181\003\145\003\181\003\162\003\146\000\171\t\016\003c\003h\003\145\003\139\003\187\003\146\000\171\000\171\003\172\003h\003\160\003\139\002\028\003\141\000\171\003\130\003\171\006\185\003\160\006\191\002\028\003\141\000\171\003\130\000\171\006\197\001\241\003\136\003\193\001\242\001\243\004h\001\244\001U\006\209\000\171\001\167\003\162\0046\000\171\002\211\006\230\003\138\001#\006\220\003\162\000\171\0049\006\224\001\174\001\245\0039\003\199\001\247\001\248\001\253\006\235\006\248\006\254\007\t\003\205\002v\001[\000\171\002\140\000\171\003\211\001F\003\217\007\132\004h\002\142\003\142\001M\001]\002\146\002v\001M\007\020\002\150\003\223\007&\003:\003\229\004h\007\024\002\142\003\136\007-\000\171\002\146\000\171\001M\007>\003\235\003\136\003\241\000\171\003\145\003\247\002\211\003\146\003\138\001#\003\253\004h\000\171\003\139\002\211\007\018\003\138\001#\004\003\000\171\003\160\007H\002\028\003\141\001\241\004\t\002\147\004'\001\243\007a\001\244\004h\004h\004h\000\171\000\171\000\171\000\171\003\142\001^\007w\002\147\007|\002\148\001\254\004h\003\142\003\162\004A\002\007\001U\001\247\001\248\001\253\0072\001F\000\171\001\255\002\148\000\171\001#\001M\001]\000\171\003\145\007\136\000\171\003\146\0077\001\135\004\015\000\171\003\145\003\139\001U\003\146\007\149\001\173\001U\004\021\003\160\003\139\002\028\003\141\004h\004h\004\027\004!\003\160\007_\002\028\003\141\003;\000\171\004U\004F\004V\004W\004h\007\169\004\144\000\171\002\205\001[\002\206\002\207\001\243\003\162\002\208\007g\007t\007\130\000\171\004\154\000\171\003\162\004:\004@\004\164\003c\004\174\001^\004\183\007\155\002\018\004h\007\185\007\192\003h\004\192\007\196\002\027\004Z\002\028\007\225\004)\002\016\000\171\004\203\004h\b\t\002\205\003\130\002\206\002\207\001\243\bE\002\208\000\171\001\255\b\014\001\135\001#\002\205\b5\002\206\002\207\001\243\003c\002\208\004\212\001\031\007\206\007\241\001#\001$\001F\003h\004\221\004\228\003c\000\171\001M\001]\0040\002v\b\011\b\019\002\152\003h\004h\003\130\004f\004g\004\250\002\142\0045\005\r\005\018\002\146\001F\001M\b$\003\130\001F\b1\001M\001]\000\171\000\171\001M\001]\000\171\b\022\b\025\b!\000\171\002\205\005\025\002\206\002\207\001\243\000\171\002\208\003\136\bJ\002\018\b8\000\171\004h\005-\004h\000\171\002\019\003c\002\028\000\171\002\211\b&\003\138\001#\004h\001^\003h\002\147\002\205\004h\002\206\002\207\001\243\0048\002\208\0052\001U\005>\b'\001\185\003\130\b_\000\171\b)\002\148\003c\003\136\b-\005E\001^\005K\bD\003\142\001^\003h\006\011\004h\005N\003\136\002\211\000\171\003\138\001#\004h\005P\001[\005W\005`\003\130\000\171\000\171\002\211\bu\003\138\001#\005k\005z\b\149\003\145\001\135\000\171\003\146\002\205\006\015\002\206\002\207\001\243\003\139\002\208\b\161\bH\003\142\bL\005\134\003\160\002v\002\028\003\141\002\182\003c\004h\004h\bQ\003\142\004h\002\142\004h\b]\003h\002\146\005\143\001M\003\136\000\171\005\163\004E\b\208\003\145\b\210\004h\003\146\003\162\003\130\005\169\005\175\002\211\003\139\003\138\001#\003\145\004h\005\187\003\146\003\160\bd\002\028\003\141\005\206\003\139\001\031\003\136\br\001#\001$\000\171\003\160\004h\002\028\003\141\000\171\005\208\005\222\001F\002\211\002\147\003\138\001#\003\142\001M\001]\003\162\000\171\006\017\002\205\006\006\002\206\002\207\001\243\004h\002\208\b$\002\148\003\162\006\025\004h\006 \006%\006+\b~\b\136\003c\0069\b\167\003\145\t\005\003\142\003\146\006D\000\171\003h\000\171\006K\003\139\006x\003\136\006q\004H\t\020\006s\003\160\006v\002\028\003\141\003\130\006\133\006{\b&\002\211\t \003\138\001#\004>\006\132\001\241\003\146\004?\001\242\001\243\001^\001\244\003\139\006\128\006\131\b'\t\132\004b\003\162\003\160\b)\002\028\003\141\006\147\b*\006\158\004e\006\157\006\162\001\245\0039\003\142\001\247\001\248\001\253\006\173\006\184\006\180\t\143\002\205\001\135\002\206\002\207\001\243\t\148\002\208\003\162\006\196\006\190\006\192\006\216\006\204\006\215\006\210\006\214\006\229\003c\003\145\007G\006\234\003\146\003:\006\237\006\244\006\252\003h\003\139\003\136\007\003\007\014\007F\007?\004a\003\160\007@\002\028\003\141\007E\001U\003\130\002\211\001\184\003\138\001#\007I\007J\007i\002\205\007b\002\206\002\207\001\243\007c\002\208\007h\007v\007\133\007\128\007\129\002\205\003\162\002\206\002\207\001\243\003c\002\208\007\131\001[\007\176\007\148\007\152\007\154\003\142\003h\007\156\007\168\003c\001\254\007\184\007\186\004d\007\187\007\193\001U\007\198\003h\001\190\003\130\007\202\007\220\001\255\007\227\004n\001#\b\020\b,\b6\bf\003\145\003\130\b`\003\146\ba\be\bt\001U\by\003\139\001\192\b\144\b\165\003\136\001[\b\166\003\160\b\170\002\028\003\141\t\004\t\b\t\019\t\023\tn\tv\002\211\003;\003\138\001#\000\000\002\205\000\000\002\206\002\207\001\243\001[\002\208\000\000\002v\000\000\000\000\002\223\003\162\000\000\000\000\000\000\000\000\003c\002\142\000\000\004:\004@\002\146\000\000\001M\001F\003h\003\142\002\018\000\000\003\136\001M\001]\004r\000\000\002\027\000\000\002\028\000\000\000\000\003\130\000\000\003\136\002\211\000\000\003\138\001#\000\000\002\205\000\000\002\206\002\207\001\243\003\145\002\208\002\211\003\146\003\138\001#\000\000\000\000\000\000\003\139\000\000\000\000\003c\000\000\002\147\000\000\003\160\001F\002\028\003\141\000\000\003h\003\142\001M\001]\000\000\002v\000\000\004\170\005\213\000\000\002\148\000\000\000\000\003\142\003\130\002\142\000\000\001^\001F\002\146\000\000\001M\003\162\000\000\001M\001]\000\000\003\145\000\000\000\000\003\146\000\000\000\000\000\000\000\000\000\000\003\139\000\000\003\136\003\145\000\000\000\000\003\146\003\160\000\000\002\028\003\141\001\135\003\139\000\000\000\000\002\211\000\000\003\138\001#\003\160\000\000\002\028\003\141\000\000\000\000\000\000\001^\000\000\002\147\000\000\000\000\000\000\000\000\000\000\003\162\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\002\148\003\162\003\142\001^\000\000\003\136\000\000\003c\000\000\000\000\000\000\001\135\000\000\000\000\000\000\000\000\003h\000\000\002\211\000\000\003\138\001#\002v\004\179\000\000\006?\000\000\000\000\003\145\000\000\003\130\003\146\002\142\001\135\000\000\000\000\002\146\003\139\001M\001\241\000\000\000\000\001\242\001\243\003\160\001\244\002\028\003\141\000\000\000\000\003\142\000\000\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\001\245\001\246\000\000\001\247\001\248\001\253\000\000\000\000\003\162\000\000\003c\000\000\000\000\003\145\002v\000\000\003\146\006R\002\147\003h\000\000\000\000\003\139\000\000\002\142\000\000\004\188\000\000\002\146\003\160\001M\002\028\003\141\003\130\002\205\002\148\002\206\002\207\001\243\003\136\002\208\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\003c\002\211\000\000\003\138\001#\003\162\000\000\001U\003c\003h\007S\000\000\000\000\000\000\000\000\000\000\004\251\003h\000\000\000\000\000\000\000\000\002\147\003\130\004\253\000\000\000\000\000\000\000\000\000\000\000\000\003\130\000\000\003\142\000\000\000\000\001[\001\254\000\000\002\148\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\003\136\000\000\000\000\000\000\000\000\003\145\000\000\000\000\003\146\000\000\000\000\000\000\000\000\002\211\003\139\003\138\001#\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007U\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\136\000\000\000\000\000\000\003\142\000\000\000\000\003\162\003\136\003c\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\003h\000\000\000\000\002\211\002\018\003\138\001#\005\004\000\000\000\000\001F\002\027\003\145\002\028\003\130\003\146\001M\007X\000\000\000\000\000\000\003\139\000\000\000\000\000\000\000\000\000\000\003\142\003\160\000\000\002\028\003\141\000\000\000\000\002\205\003\142\002\206\002\207\001\243\000\000\002\208\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\003c\000\000\003\145\000\000\003\162\003\146\000\000\000\000\003c\003h\003\145\003\139\000\000\003\146\000\000\000\000\005\007\003h\003\160\003\139\002\028\003\141\000\000\003\130\005 \007Y\003\160\000\000\002\028\003\141\002\205\003\130\002\206\002\207\001\243\003\136\002\208\000\000\000\000\007#\000\000\007\\\000\000\007[\000\000\003\162\000\000\003c\002\211\000\000\003\138\001#\000\000\003\162\000\000\001\135\003h\001U\000\000\000\000\007O\001\031\000\000\005#\001#\001$\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\000\000\000\000\000\000\001[\002\205\000\000\002\206\002\207\001\243\b$\002\208\000\000\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\136\003c\000\000\003\145\000\000\002\211\003\146\003\138\001#\000\000\003h\000\000\003\139\002\211\000\000\003\138\001#\005\204\000\000\003\160\000\000\002\028\003\141\000\000\003\130\b&\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\003\142\001U\003\136\000\000\007V\b'\000\000\000\000\003\142\003\162\b)\000\000\000\000\000\000\b4\002\211\000\000\003\138\001#\004\232\000\000\000\000\002v\000\000\000\000\006V\003\145\000\000\000\000\003\146\001[\000\000\002\142\001F\003\145\003\139\002\146\003\146\001M\001M\001]\000\000\003\160\003\139\002\028\003\141\004\233\003\142\000\000\000\000\003\160\000\000\002\028\003\141\002\205\000\000\002\206\002\207\001\243\003\136\002\208\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\003\162\000\000\003c\002\211\003\145\003\138\001#\003\146\003\162\000\000\003c\003h\002\147\003\139\000\000\000\000\000\000\000\000\005\218\003h\003\160\000\000\002\028\003\141\001U\003\130\006\020\007S\000\000\002\148\001^\000\000\000\000\003\130\000\000\003\142\002\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\162\001F\002\211\000\000\003\138\001#\001[\001M\001]\000\000\000\000\000\000\000\000\001\135\003\145\000\000\000\000\003\146\000\000\000\000\000\000\000\000\001\031\003\139\000\000\001#\001$\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\000\000\000\000\004\235\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\136\000\000\000\000\b$\000\000\000\000\007U\003\162\003\136\003c\000\000\000\000\000\000\002\211\000\000\003\138\001#\001^\003h\003\139\000\000\002\211\000\000\003\138\001#\006\141\003\140\000\000\002\028\003\141\001\241\000\000\003\130\004'\001\243\000\000\001\244\000\000\000\000\b&\000\000\000\000\000\000\001F\000\000\003\142\000\000\001\135\000\000\001M\007X\000\000\000\000\003\142\004A\002\007\b'\001\247\001\248\001\253\000\000\b)\000\000\000\000\000\000\bF\000\000\000\000\000\000\000\000\000\000\003\145\000\000\000\000\003\146\000\000\000\000\000\000\000\000\003\145\003\139\001U\003\146\001U\001W\000\000\007S\003\160\003\139\002\028\003\141\001f\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\004F\004V\004W\003\136\000\000\000\000\000\000\000\000\007Y\001[\000\000\001[\000\000\003\162\000\000\000\000\002\211\000\000\003\138\001#\000\000\003\162\007#\000\000\007Z\000\000\007[\000\000\000\000\002\205\007\150\002\206\002\207\001\243\000\000\002\208\000\000\004Z\001\135\000\000\000\000\002\016\002v\000\000\000\000\006Y\003c\000\000\003\142\000\000\000\000\000\000\002\142\000\000\001\255\003h\002\146\001#\001M\001d\000\000\007U\007\201\000\000\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\003\145\007\153\000\000\003\146\001n\000\000\000\000\000\000\000\000\003\139\000\000\000\000\000\000\004f\006\026\000\000\003\160\000\000\002\028\003\141\000\000\000\000\001F\000\000\001F\000\000\000\000\002\147\001M\001]\001M\007X\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\003\162\002\148\000\000\000\000\002\018\000\000\000\000\003c\000\000\000\000\000\000\002\019\001U\002\028\000\000\001\170\003h\000\000\000\000\000\000\000\000\000\000\001\171\007\204\003\136\000\000\001U\000\000\000\000\001W\003\130\007\157\007\158\000\000\000\000\001z\001f\002\211\000\000\003\138\001#\001[\000\000\000\000\000\000\001^\000\000\007Y\007\159\007\175\000\000\000\000\000\000\007\167\006\021\001[\002\205\001g\002\206\002\207\001\243\007#\002\208\007f\000\000\007[\000\000\b\196\002\205\003\142\002\206\002\207\001\243\003c\002\208\001\135\000\000\001\135\001\139\000\000\000\000\000\000\003h\000\000\000\000\003c\000\000\000\000\000\000\007\219\000\000\001d\000\000\000\000\003h\003\145\003\130\000\000\003\146\000\000\000\000\007\222\003\136\000\000\003\139\001d\000\000\000\000\003\130\000\000\001\172\003\160\000\000\002\028\003\141\002\211\000\000\003\138\001#\002\205\000\000\002\206\002\207\001\243\001n\002\208\000\000\000\000\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\003c\000\000\003\162\000\000\000\000\000\000\001F\000\000\000\000\003h\000\000\003\142\001M\001]\000\000\000\000\007\235\000\000\000\000\000\000\000\000\000\000\000\000\003\130\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\003\136\000\000\000\000\000\000\000\000\003\145\000\000\000\000\003\146\000\000\000\000\000\000\003\136\002\211\003\139\003\138\001#\000\000\000\000\0067\000\000\003\160\000\000\002\028\003\141\002\211\001^\003\138\001#\002\205\001z\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\001^\000\000\000\000\001\153\000\000\003\142\003c\000\000\003\162\000\000\000\000\000\000\000\000\000\000\000\000\003h\001\135\003\142\000\000\000\000\000\000\000\000\007\238\003\136\000\000\000\000\000\000\000\000\000\000\003\130\001\135\003\145\000\000\001\139\003\146\000\000\002\211\000\000\003\138\001#\003\139\000\000\000\000\003\145\000\000\000\000\003\146\003\160\000\000\002\028\003\141\000\000\003\139\000\000\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\002\210\000\000\002\205\003\142\002\206\002\207\001\243\000\000\002\208\003\162\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\003c\000\000\003\162\000\000\000\000\000\000\000\000\000\000\000\000\003h\003\145\000\000\000\000\003\146\000\000\000\000\b\003\003\136\000\000\003\139\000\000\000\000\000\000\003\130\000\000\000\000\003\160\000\000\002\028\003\141\002\211\000\000\003\138\001#\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\003c\002\208\003\162\000\000\000\000\000\000\000\000\000\000\000\000\003h\003\139\003\142\003c\000\000\000\000\002v\b\006\003\140\006`\002\028\003\141\003h\000\000\003\130\000\000\002\142\000\000\000\000\b\n\002\146\000\000\001M\000\000\002v\000\000\003\130\006d\003\145\002v\000\000\003\146\006g\000\000\002\142\003\136\000\000\003\139\002\146\002\142\001M\000\000\000\000\002\146\003\160\001M\002\028\003\141\002\211\000\000\003\138\001#\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\002v\002\208\000\000\006u\000\000\002\147\000\000\000\000\000\000\000\000\002\142\003\162\000\000\000\000\002\146\000\000\001M\000\000\000\000\000\000\003\142\004\232\002\148\002\147\000\000\000\000\003\136\000\000\002\147\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\136\002\211\002\148\003\138\001#\000\000\001U\002\148\003\145\b\204\b(\003\146\000\000\002\211\000\000\003\138\001#\003\139\000\000\000\000\000\000\002\147\000\000\000\000\003\160\001\241\002\028\003\141\004'\001\243\000\000\001\244\000\000\003\142\000\000\001[\001\241\000\000\002\148\004'\001\243\000\000\001\244\000\000\000\000\003\142\000\000\000\000\000\000\004A\002\007\003\162\001\247\001\248\001\253\000\000\000\000\000\000\000\000\003\145\004A\002\007\003\146\001\247\001\248\001\253\000\000\000\000\003\139\002\210\000\000\003\145\000\000\000\000\003\146\003\160\001U\002\028\003\141\001W\003\139\000\000\002\211\000\000\003\138\001#\001f\003\160\000\000\002\028\003\141\001U\000\000\000\000\001W\000\000\004F\004V\004W\000\000\000\000\001f\003\162\000\000\000\000\001[\000\000\004F\004V\004W\000\000\000\000\001\031\000\000\003\162\001#\001$\000\000\004\235\000\000\001[\000\000\001F\000\000\000\000\000\000\007\150\000\000\001M\001]\000\000\000\000\000\000\004Z\000\000\000\000\000\000\002\016\000\000\000\000\000\000\007\150\000\000\b$\004Z\000\000\000\000\000\000\002\016\003\139\001\255\000\000\000\000\001#\000\000\001d\003\140\000\000\002\028\003\141\000\000\001\255\002v\000\000\001#\006\194\000\000\000\000\000\000\000\000\001d\t\003\002\142\000\000\001n\000\000\002\146\002v\001M\b&\006\206\000\000\001U\004f\b\021\b\227\t\018\002\142\001^\001n\000\000\002\146\001F\001M\004f\b7\b'\000\000\001M\001]\000\000\b)\000\000\000\000\000\000\bY\002\205\001F\002\206\002\207\001\243\001[\002\208\001M\001]\000\000\000\000\002\018\001\135\000\000\000\000\002\147\000\000\003c\002\019\000\000\002\028\001\241\002\018\000\000\001\242\001\243\003h\001\244\000\000\002\019\002\147\002\028\002\148\t$\000\000\000\000\000\000\000\000\007\157\007\158\003\130\000\000\001z\000\000\000\000\001\245\0039\002\148\001\247\001\248\001\253\000\000\001^\007\157\007\158\007\159\007\175\001z\000\000\000\000\007\167\006\021\002\205\000\000\002\206\002\207\001\243\001^\002\208\000\000\007\159\007\175\000\000\000\000\000\000\007\167\006\021\000\000\000\000\003c\000\000\000\000\001\135\000\000\001U\001\139\000\000\001W\003h\000\000\000\000\000\000\001F\000\000\001f\t&\000\000\001\135\001M\001]\001\139\001U\003\130\002\205\b\233\002\206\002\207\001\243\002v\002\208\000\000\006\212\003\136\001[\000\000\000\000\001U\000\000\002\142\001\181\003c\000\000\002\146\000\000\001M\002\211\001\182\003\138\001#\003h\001[\000\000\000\000\001\254\007\150\000\000\000\000\000\000\000\000\000\000\0061\000\000\000\000\003\130\000\000\001[\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\001U\003\142\001^\b\245\000\000\000\000\000\000\001d\000\000\000\000\000\000\002\147\000\000\000\000\000\000\000\000\000\000\000\000\003\136\000\000\000\000\000\000\000\000\000\000\000\000\b\"\001n\003\145\002\148\001[\003\146\002\211\001\135\003\138\001#\000\000\003\139\000\000\000\000\001d\000\000\000\000\000\000\003\160\001F\002\028\003\141\000\000\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\002\018\001\183\003\136\000\000\001F\000\000\003\142\002\027\000\000\002\028\001M\001]\000\000\003\162\000\000\002\211\000\000\003\138\001#\001F\000\000\000\000\000\000\b/\000\000\001M\001]\000\000\002v\000\000\000\000\006\222\003\145\000\000\000\000\003\146\000\000\000\000\002\142\007\157\007\158\003\139\002\146\001z\001M\000\000\000\000\003\142\003\160\000\000\002\028\003\141\000\000\001^\000\000\000\000\b\255\t\000\000\000\001F\000\000\007\167\006\021\000\000\000\000\001M\001]\000\000\001U\000\000\001^\b\244\000\000\000\000\001\241\003\162\0064\001\242\001\243\000\000\001\244\000\000\003\139\001\135\000\000\001^\001\139\002\147\000\000\003\160\000\000\002\028\003\141\000\000\000\000\006#\000\000\001[\001\245\0039\001\135\001\247\001\248\001\253\002\148\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\001\135\003\162\002\205\000\000\002\206\002\207\001\243\003c\002\208\000\000\001^\000\000\000\000\000\000\000\000\003:\003h\000\000\000\000\003c\001\241\000\000\002v\001\242\001\243\007x\001\244\005\193\003h\000\000\003\130\000\000\002\142\000\000\000\000\000\000\002\146\000\000\001M\005\180\001\135\000\000\003\130\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\001F\005\t\001\254\000\000\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\002\147\004\232\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\000\000\001\241\002\148\000\000\001\242\001\243\003\136\001\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\136\002\211\000\000\003\138\001#\003;\000\000\001\245\002\007\000\000\001\247\001\248\001\253\002\211\000\000\003\138\001#\000\000\002\016\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004:\004@\001\255\000\000\003\142\001#\000\000\000\000\002\018\000\000\000\000\000\000\000\000\003M\000\000\002\027\003\142\002\028\001U\000\000\000\000\b\250\001\135\000\000\000\000\002\210\002\b\001U\002\t\002\247\001W\000\000\000\000\005\196\000\000\000\000\000\000\001f\002\211\003\139\003\138\001#\000\000\000\000\000\000\005\183\003\160\001[\002\028\003\141\000\000\003\139\000\000\000\000\000\000\000\000\001[\000\000\003\160\000\000\002\028\003\141\002\253\000\000\001\241\000\000\002\016\001\242\001\243\002\018\001\244\000\000\000\000\003\162\004\234\000\000\002\019\000\000\002\028\001\255\000\000\000\000\001#\000\000\000\000\003\162\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\003\139\001d\000\000\000\000\003\001\000\000\000\000\003\140\000\000\002\028\003\141\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\001n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001F\000\000\002\b\000\000\002\t\003\023\001M\001]\000\000\001F\000\000\000\000\002\018\000\000\000\000\001M\001]\000\000\000\000\002\019\001\241\002\028\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000n\002\b\000\000\002\t\003\"\000\000\003\029\000\000\000\000\000\000\002\016\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000n\000\000\001z\001^\000\000\000\000\003(\003E\000\000\000\000\002\016\000\000\001^\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\002\b\000\000\002\t\002\239\001\135\000\000\002\205\000\000\002\206\002\207\001\243\003J\002\208\001\135\000\000\000\000\001\205\000\000\000\000\000\000\000\000\000\000\000\000\003c\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\000\003h\002\b\000\000\002\t\002\239\002\019\000\000\002\028\002\016\000\000\000\000\004\238\000\000\002\205\003\130\002\206\002\207\001\243\000\000\002\208\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\002\018\003c\001\241\003M\000\000\001\242\001\243\002\019\001\244\002\028\003h\000\000\002\016\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\004\237\000\000\000\000\003\130\001\255\001\245\002\007\001#\001\247\001\248\001\253\000\000\000\000\000\000\000\000\003M\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003a\000\000\000\000\000\000\000\000\003\136\000\000\002\018\000\000\000\000\000\000\000\000\003g\000\000\002\019\000\000\002\028\000\000\002\211\000\000\003\138\001#\002\b\000\000\002\t\002\239\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\002\b\000\000\002\t\002\239\000\000\000\000\002\018\000\000\000\000\000\000\003\136\000\000\000\000\002\019\000\000\002\028\003\142\001\245\002\007\000\000\001\247\001\248\001\253\002\211\000\000\003\138\001#\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\001\255\000\000\000\000\001#\004{\000\000\000\000\000\000\000\000\000\000\003\139\003M\001\255\000\000\003\142\001#\000\000\003\160\000\000\002\028\003\141\000\000\000\000\003M\002\b\000\000\002\t\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004{\003\162\000\000\000\000\000\000\000\000\003\139\000\000\000\000\000\000\000\000\000n\000\000\003\160\000\000\002\028\003\141\000\000\000\000\000\000\000\000\002\016\001\241\000\000\002\018\001\242\001\243\000\000\001\244\000\000\000\000\002\019\000\000\002\028\001\255\000\000\002\018\001#\000\000\000\000\003\162\000\000\000\000\002\019\000\000\002\028\001\245\002\007\000\000\001\247\001\248\001\253\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\003\135\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\002\b\000\000\002\t\002\239\000\000\000\000\000\000\002\018\003\151\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\001U\000\000\003\157\001\187\000\000\000\000\000\000\000\000\000\000\000\000\001\188\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\002\b\000\000\002\t\002\239\000\000\001[\000\000\000\000\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000\000\000\000\001\241\003M\000\000\001\242\001\243\000\000\001\244\002\016\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\002\016\001\255\000\000\000\000\001#\001\245\002\007\000\000\001\247\001\248\001\253\000\000\003M\001\255\000\000\001d\001#\000\000\000\000\003\166\000\000\000\000\000\000\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\003\177\000\000\000\000\001\189\000\000\001U\000\000\002\018\001W\000\000\002\b\001\193\002\t\002\239\002\019\001f\002\028\000\000\000\000\000\000\000\000\001F\002\b\000\000\002\t\002\239\000\000\001M\001]\000\000\000\000\000\000\000\000\001\194\001[\000\000\000\000\002\018\000\000\000\000\000\000\001\218\000\000\000\000\002\019\000\000\002\028\000\000\000\000\002\018\002\016\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\002\016\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\001\241\003M\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000\000\001d\001\241\003M\001^\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\001n\000\000\000\000\000\000\001\199\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\001\135\000\000\000\000\000\000\001F\000\000\003\183\000\000\000\000\000\000\001M\001]\000\000\002\018\000\000\000\000\001U\000\000\003\189\b\201\002\019\000\000\002\028\000\000\000\000\002\018\b\202\000\000\002\b\000\000\002\t\002\239\002\019\000\000\002\028\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\000\000\001[\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000\000\001z\001\241\000\000\000\000\001\242\001\243\000\000\001\244\002\016\000\000\001^\001\245\002\007\001\209\001\247\001\248\001\253\000\000\000\000\000\000\002\016\001\255\000\000\000\000\001#\001\245\002\007\000\000\001\247\001\248\001\253\000\000\003M\001\255\000\000\001d\001#\003\195\000\000\000\000\001\135\000\000\001\241\001\139\003M\001\242\001\243\000\000\001\244\000\000\000\000\003\201\000\000\000\000\b\203\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\001F\002\b\000\000\002\t\002\239\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\000\000\003\207\000\000\000\000\002\019\000\000\002\028\000\000\002\016\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\001\255\002\016\002\b\001#\002\t\002\239\000\000\000\000\000\000\000\000\000\000\003M\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000\000\000\000\000\000\003M\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\002\016\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\001\255\001\135\000\000\001#\000\000\000\000\000\000\003\213\000\000\000\000\000\000\003M\002\018\001\245\002\007\000\000\001\247\001\248\001\253\002\019\000\000\002\028\000\000\000\000\000\000\000\000\002\018\000\000\000\000\002\b\000\000\002\t\002\239\002\019\000\000\002\028\000\000\000\000\000\000\003\219\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\002\018\000\000\002\016\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000\000\000\000\000\000\003M\001\241\000\000\000\000\001\242\001\243\000\000\001\244\002\016\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\001\245\002\007\000\000\001\247\001\248\001\253\000\000\003M\000\000\000\000\000\000\000\000\003\225\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\003\231\000\000\000\000\000\000\000\000\002\018\000\000\000\000\002\b\000\000\002\t\002\239\002\019\000\000\002\028\001\245\002\007\000\000\001\247\001\248\001\253\000\000\002\b\000\000\002\t\002\239\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\002\018\000\000\000\000\000\000\003\237\000\000\000\000\002\019\000\000\002\028\000\000\002\016\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\001\255\002\016\002\b\001#\002\t\002\239\007j\000\000\000\000\000\000\000\000\003M\000\000\000\000\001\255\000\000\003\243\001#\000\000\000\000\000\000\000\000\000\000\001\241\000\000\003M\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007k\002\b\007l\002\t\002\239\002\016\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003M\002\018\000\000\000\000\000\000\000\000\007m\003\249\002\019\000\000\002\028\000\000\002\016\000\000\001\241\002\018\000\000\001\242\001\243\000\000\001\244\000\000\002\019\000\000\002\028\001\255\000\000\000\000\001#\002\b\000\000\002\t\002\239\000\000\000\000\000\000\003M\000\000\001\245\002\007\000\000\001\247\001\248\001\253\007n\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\002\018\000\000\007o\007p\000\000\007q\000\000\002\019\003\255\002\028\000\000\000\000\000\000\002\016\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\001\255\000\000\007\179\001#\002\b\000\000\002\t\002\239\000\000\000\000\002\018\003M\000\000\000\000\000\000\004\005\000\000\002\019\000\000\002\028\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\007s\000\000\000\000\007u\000\000\000\000\007z\007\134\002\b\000\000\002\t\002\239\000\000\000\000\000\000\002\016\000\000\001\245\002\007\007\177\001\247\001\248\001\253\000\000\000\000\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000\000\007\178\002\018\003M\000\000\000\000\000\000\004\011\000\000\002\019\000\000\002\028\002\016\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\002\b\000\000\002\t\002\239\000\000\000\000\000\000\003M\000\000\000\000\000\000\004\017\000\000\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\002\b\000\000\002\t\002\239\002\019\000\000\002\028\002\016\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000\000\000\000\002\018\003M\000\000\000\000\000\000\004\023\000\000\002\019\000\000\002\028\002\016\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\002\b\000\000\002\t\002\239\000\000\000\000\000\000\003M\000\000\000\000\000\000\004\029\000\000\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\002\b\000\000\002\t\002\239\002\019\000\000\002\028\002\016\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\002\018\003M\000\000\000\000\000\000\004#\000\000\002\019\000\000\002\028\002\016\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\001\255\000\000\000\000\001#\002\b\003c\002\t\002\239\000\000\000\000\003c\003M\000\000\000\000\003h\000\000\000\000\000\000\000\000\003h\000\000\000\000\000\000\000\000\000\000\004x\000\000\000\000\003\130\000\000\004}\000\000\000\000\003\130\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\002\016\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\003c\000\000\000\000\000\000\000\000\002\018\003M\000\000\000\000\003h\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\000\000\000\000\004\127\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\136\000\000\000\000\000\000\000\000\003\136\000\000\000\000\000\000\000\000\000\000\bg\000\000\002\211\000\000\003\138\001#\000\000\002\211\000\000\003\138\001#\000\000\002\205\002\018\002\206\002\207\001\243\000\000\002\208\bh\002\019\000\000\002\028\bj\000\000\000\000\000\000\000\000\000\000\003c\000\000\000\000\000\000\bk\003\142\000\000\000\000\000\000\003h\003\142\000\000\000\000\000\000\000\000\000\000\000\000\003\136\000\000\000\000\004\131\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\004{\000\000\000\000\bl\000\000\004{\003\139\000\000\000\000\000\000\000\000\003\139\000\000\003\160\000\000\002\028\003\141\000\000\003\160\000\000\002\028\003\141\000\000\000\000\000\000\000\000\000\000\002\205\003\142\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\000\000\003\162\000\000\bm\000\000\003c\003\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003h\000\000\000\000\bn\004{\005\154\000\000\000\000\003\136\001\241\003\139\004\139\001\242\001\243\003\130\001\244\000\000\003\160\000\000\002\028\003\141\002\211\000\000\003\138\001#\000\000\002\205\b\137\002\206\002\207\001\243\000\000\002\208\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\bp\003c\003\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003h\003\142\000\000\bq\000\000\000\000\bs\004\146\000\000\bx\000\000\004\149\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bz\000\000\000\000\000\000\000\000\000\000\000\000\002\b\004{\002\t\002\239\000\000\003\136\000\000\003\139\000\000\000\000\002\210\b{\000\000\000\000\003\160\000\000\002\028\003\141\002\211\000\000\003\138\001#\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\003\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\001\255\000\000\000\000\001#\003\136\000\000\000\000\000\000\000\000\000\000\000\000\003M\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\000\000\004{\001\241\000\000\000\000\001\242\001\243\003\139\001\244\000\000\000\000\000\000\003\139\000\000\003\160\000\000\002\028\003\141\000\000\003\140\000\000\002\028\003\141\000\000\003\142\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\162\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\004\156\004{\002\205\000\000\002\206\002\207\001\243\003\139\002\208\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\003c\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\003h\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\004\159\000\000\003\162\003\130\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\001U\001\245\002\007\001W\001\247\001\248\001\253\002\016\000\000\000\000\001f\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\004\166\000\000\001[\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\176\002\205\006\151\002\206\002\207\001\243\000\000\002\208\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\000\000\003c\006\154\003\136\000\000\002\b\000\000\002\t\002\239\000\000\003h\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\004\199\000\000\001d\003\130\000\000\001\241\000\000\000\000\001\242\001\243\002\018\001\244\002\016\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\001n\000\000\000\000\002\016\001\255\000\000\003\142\001#\001\245\002\007\000\000\001\247\001\248\001\253\000\000\003M\001\255\000\000\001F\001#\000\000\000\000\000\000\000\000\001M\001]\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\004\185\004{\001\241\000\000\000\000\001\242\001\243\003\139\001\244\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\003\136\000\000\002\b\000\000\002\t\002\239\001\245\002\007\000\000\001\247\001\248\001\253\000\000\002\211\000\000\003\138\001#\002\018\000\000\000\000\001z\003\162\000\000\000\000\002\019\000\000\002\028\000\000\000\000\002\018\001^\000\000\004\194\006\160\000\000\000\000\002\019\000\000\002\028\000\000\001U\000\000\002\016\001W\000\000\003\142\001\210\000\000\000\000\000\000\001f\000\000\000\000\000\000\002\b\001\255\002\t\002\239\001#\000\000\001\135\000\000\000\000\001\139\000\000\000\000\003M\000\000\001\212\001[\000\000\000\000\000\000\001\241\004{\000\000\001\242\001\243\000\000\001\244\003\139\000\000\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\000\000\002\016\000\000\000\000\001\245\002\007\007j\001\247\001\248\001\253\000\000\000\000\000\000\000\000\001\255\000\000\002\205\001#\002\206\002\207\001\243\003\162\002\208\000\000\000\000\003M\001d\000\000\000\000\002\018\004\205\000\000\000\000\003c\000\000\000\000\002\019\007k\002\028\007l\000\000\000\000\003h\000\000\000\000\001n\000\000\000\000\000\000\001\199\000\000\000\000\002\b\004\208\002\t\002\239\003\130\000\000\000\000\000\000\000\000\000\000\000\000\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\007m\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\002\016\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\001\255\000\000\000\000\001#\002\205\007n\002\206\002\207\001\243\000\000\002\208\003M\000\000\000\000\001z\000\000\000\000\000\000\004\214\007o\007p\003c\007q\003\136\001^\000\000\000\000\001\209\000\000\000\000\003h\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\002\b\004\217\002\t\002\239\003\130\007r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\018\003\142\000\000\000\000\000\000\007s\000\000\002\019\007u\002\028\000\000\007z\007\134\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\177\000\000\001\255\000\000\000\000\001#\004{\000\000\000\000\000\000\000\000\000\000\003\139\003M\000\000\000\000\000\000\000\000\007\178\003\160\000\000\002\028\003\141\001\241\000\000\003\136\001\242\001\243\002\205\001\244\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\003c\003\162\001\245\002\007\000\000\001\247\001\248\001\253\000\000\003h\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\004\241\000\000\000\000\003\130\002\018\003\142\000\000\000\000\004\223\000\000\000\000\002\019\000\000\002\028\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\004{\000\000\000\000\000\000\000\000\000\000\003\139\004\230\002\205\000\000\002\206\002\207\001\243\003\160\002\208\002\028\003\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003c\000\000\000\000\000\000\002\b\000\000\002\t\002\239\000\000\003h\000\000\002\016\000\000\000\000\000\000\003\162\003\136\000\000\000\000\000\000\004\244\000\000\000\000\003\130\001\255\000\000\000\000\001#\000\000\002\211\000\000\003\138\001#\000\000\000\000\003M\000\000\002\205\000\000\002\206\002\207\001\243\001\241\002\208\002\016\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\003c\000\000\000\000\001\255\000\000\000\000\001#\003\142\000\000\003h\000\000\000\000\001\245\002\007\003M\001\247\001\248\001\253\000\000\000\000\005c\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004{\002\018\005\015\000\000\000\000\003\136\003\139\000\000\002\019\000\000\002\028\000\000\000\000\003\160\000\000\002\028\003\141\000\000\002\211\000\000\003\138\001#\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\000\000\000\000\001\241\002\018\000\000\001\242\001\243\000\000\001\244\003\162\002\019\000\000\002\028\000\000\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\003\136\001\247\001\248\001\253\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\001\255\000\000\004{\001#\000\000\000\000\005\020\000\000\003\139\000\000\000\000\003M\000\000\000\000\000\000\003\160\001\241\002\028\003\141\001\242\001\243\007j\001\244\000\000\000\000\000\000\000\000\003\142\002\b\000\000\002\t\002\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\003\162\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\000\000\007k\t\026\007l\000\000\005f\000\000\000\000\000\000\000\000\000\000\003\139\000\000\000\000\000\000\005\027\002\018\002\016\003\160\000\000\002\028\003\141\000\000\002\019\000\000\002\028\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\007m\002\b\000\000\002\t\002\239\003M\000\000\000\000\001\241\003\162\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\007n\000\000\000\000\002\016\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\007o\007p\001\255\007q\000\000\001#\005/\000\000\000\000\002\018\000\000\001\241\000\000\003M\001\242\001\243\002\019\001\244\002\028\000\000\0054\000\000\000\000\000\000\000\000\000\000\007\181\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007s\000\000\000\000\007u\000\000\000\000\007z\007\134\005@\000\000\000\000\000\000\000\000\000\000\000\000\002\016\002\018\000\000\000\000\007\177\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\001\255\002\016\002\b\001#\002\t\002\239\000\000\000\000\000\000\007\178\000\000\003M\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\001U\000\000\000\000\007S\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\002\016\000\000\001\241\000\000\000\000\001\242\001\243\001[\001\244\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\005G\000\000\000\000\000\000\003M\002\018\001\245\002\007\000\000\001\247\001\248\001\253\002\019\000\000\002\028\000\000\000\000\000\000\000\000\002\018\000\000\000\000\002\b\000\000\002\t\002\239\002\019\000\000\002\028\000\000\000\000\000\000\005M\000\000\000\000\000\000\000\000\007U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\b\001U\002\t\002\239\001W\000\000\002\018\001\193\002\016\000\000\000\000\001f\000\000\002\019\000\000\002\028\000\000\000\000\000\000\001\241\001F\001\255\001\242\001\243\001#\001\244\001M\007X\000\000\001\198\001[\000\000\003M\001\241\000\000\000\000\001\242\001\243\000\000\001\244\002\016\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\001\245\002\007\000\000\001\247\001\248\001\253\000\000\003M\000\000\000\000\000\000\000\000\005R\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\001d\000\000\000\000\005Y\000\000\000\000\007Y\000\000\002\018\003c\000\000\002\b\000\000\002\t\002\239\002\019\000\000\002\028\003h\001n\007#\000\000\b=\001\199\007[\002\b\000\000\002\t\002\239\005q\000\000\000\000\003\130\000\000\000\000\000\000\001\135\001F\000\000\000\000\002\018\000\000\000\000\001M\001]\001U\000\000\002\019\001W\002\028\000\000\002\016\000\000\000\000\002\205\001f\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\001\255\002\016\000\000\001#\000\000\000\000\000\000\003c\000\000\000\000\001[\003M\001g\000\000\001\255\000\000\003h\001#\000\000\000\000\001\241\000\000\b\219\001\242\001\243\003M\001\244\005\127\000\000\001z\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001^\003\136\000\000\001\209\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\001d\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\000\001\135\005m\000\000\001\139\000\000\002\019\000\000\002\028\000\000\000\000\001n\000\000\002\018\000\000\000\000\000\000\003\142\000\000\000\000\002\019\000\000\002\028\000\000\002\b\000\000\002\t\002\239\000\000\001F\000\000\000\000\000\000\000\000\003\136\001M\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005t\002\211\000\000\003\138\001#\000\000\003\139\001U\000\000\000\000\007S\000\000\000\000\003\160\000\000\002\028\003\141\000\000\002\016\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\001\255\000\000\003\142\001#\000\000\001[\000\000\000\000\001z\003\162\000\000\003M\001\245\002\007\000\000\001\247\001\248\001\253\001^\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\241\000\000\005\130\001\242\001\243\000\000\001\244\000\000\003\139\005|\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\001\135\000\000\000\000\001\139\000\000\001\245\002\007\007U\001\247\001\248\001\253\000\000\002\b\000\000\002\t\002\239\000\000\000\000\001\241\002\018\000\000\001\242\001\243\003\162\001\244\000\000\002\019\000\000\002\028\000\000\000\000\005\165\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\001\245\0039\001F\001\247\001\248\001\253\000\000\000\000\001M\007X\002\016\002\b\000\000\002\t\002\239\001\245\002\007\000\000\001\247\001\248\001\253\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\000\000\000\000\001\241\003M\000\000\001\242\001\243\000\000\001\244\000\000\005\177\000\000\000\000\001U\001\245\002\007\001W\001\247\001\248\001\253\002\016\000\000\000\000\001f\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\002\b\001\255\002\t\002\239\001#\007Y\000\000\000\000\005\189\000\000\001[\000\000\003M\000\000\000\000\000\000\000\000\000\000\000\000\007#\006'\bW\006\151\007[\000\000\001\254\000\000\002\018\000\000\000\000\002\b\000\000\002\t\002\239\002\019\001\135\002\028\000\000\001\255\007\017\002\016\001#\002\b\000\000\002\t\002\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\001d\000\000\000\000\001\241\003M\000\000\001\242\001\243\002\018\001\244\002\016\000\000\000\000\b\"\000\000\002\019\000\000\002\028\000\000\001n\000\000\000\000\002\016\001\255\000\000\000\000\001#\001\245\002\007\000\000\001\247\001\248\001\253\000\000\003M\001\255\000\000\001F\001#\000\000\000\000\000\000\000\000\001M\001]\002\018\003M\000\000\000\000\000\000\000\000\000\000\002\027\006-\002\028\001\241\000\000\000\000\001\242\001\243\002\018\001\244\000\000\000\000\000\000\000\000\000\000\002\019\b.\002\028\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\001z\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\002\018\001^\000\000\006H\006\160\000\000\000\000\002\019\000\000\002\028\000\000\001\241\000\000\002\016\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\b\001\255\002\t\002\239\001#\000\000\001\135\000\000\000\000\001\139\001\245\002\007\003M\001\247\001\248\001\253\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\002\205\001\244\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\006M\000\000\000\000\000\000\002\016\007\239\003c\000\000\001\245\0039\000\000\001\247\001\248\001\253\000\000\003h\000\000\001\255\000\000\000\000\001#\000\000\002\b\000\000\002\t\002\239\000\000\001\241\003M\003\130\001\242\001\243\002\018\001\244\000\000\000\000\000\000\000\000\000\000\002\019\003:\002\028\000\000\000\000\000\000\000\000\000\000\000\000\b\007\000\000\000\000\001\245\0039\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\003:\002\018\000\000\003M\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\001\254\000\000\000\000\000\000\000\000\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\003c\001\254\000\000\000\000\002\018\000\000\003;\000\000\003\142\003h\000\000\002\019\000\000\002\028\001\255\001\245\002\007\001#\001\247\001\248\001\253\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\004:\004@\000\000\000\000\000\000\000\000\000\000\006[\002\018\000\000\000\000\b\192\000\000\003\139\000\000\002\027\000\000\002\028\000\000\003;\003\160\001\241\002\028\003\141\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\000\000\000\000\000\000\004:\004@\001\245\002\007\003\162\001\247\001\248\001\253\002\018\000\000\000\000\000\000\000\000\002M\000\000\002\027\000\000\002\028\000\000\000\000\001\241\000\000\003\136\001\242\001\243\000\000\001\244\000\000\000\000\000\000\002\016\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\001\255\001\245\002\007\001#\001\247\001\248\001\253\002\b\000\000\002\t\002=\003M\002I\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001U\000\000\000\000\b\224\001\245\002\007\000\000\001\247\001\248\001\253\b\225\000\000\000\000\000\000\002\016\002:\002\b\000\000\002\t\002=\006(\000\000\000\000\000\000\000\000\000\000\003\139\001\255\000\000\001[\001#\000\000\000\000\003\160\002\018\002\028\003\141\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002=\002\016\000\000\001\241\000\000\003\162\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\001d\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\002\016\002?\002\018\000\000\000\000\000\000\b\226\000\000\000\000\002\019\000\000\002\028\000\000\001\255\000\000\000\000\001#\002\205\000\000\002\206\002\207\001\243\000\000\002\208\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\003c\000\000\000\000\000\000\002\b\000\000\002\t\002=\000\000\003h\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\002\016\001\241\002\018\000\000\001\242\001\243\000\000\001\244\000\000\002\019\000\000\002\028\001^\001\255\001\245\0039\001#\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\001\135\000\000\000\000\000\000\003:\000\000\000\000\000\000\000\000\003\136\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\000\000\002\018\000\000\002\205\000\000\002\206\002\207\001\243\002\019\002\208\002\028\000\000\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\003c\000\000\000\000\001\254\002\b\000\000\002\t\002\247\000\000\003h\000\000\000\000\000\000\000\000\002\016\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\003\130\000\000\001\241\005\166\001\255\001\242\001\243\001#\001\244\003\139\000\000\000\000\000\000\000\000\000\000\005\b\003\160\000\000\002\028\003\141\000\000\002\016\000\000\000\000\000\000\000\000\001\245\002\007\003;\001\247\001\248\001\253\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\003\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003=\004@\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\000\000\002\254\000\000\000\000\002\027\000\000\002\028\000\000\002\018\003\136\000\000\002\b\000\000\002\t\002\247\002\019\000\000\002\028\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\002\016\000\000\000\000\003\142\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\000\000\000\000\005\000\000\000\000\000\003c\000\000\000\000\003\139\000\000\003c\000\000\000\000\003\030\003h\003\160\000\000\002\028\003\141\003h\000\000\000\000\002\b\000\000\002\t\002\239\000\000\000\000\003\130\000\000\000\000\000\000\000\000\003\130\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\018\003c\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\003h\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\130\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\002\205\003L\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\136\000\000\003c\000\000\000\000\003\136\000\000\000\000\000\000\001U\000\000\003h\001W\002\211\000\000\003\138\001#\000\000\002\211\001f\003\138\001#\000\000\000\000\000\000\003\130\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\001[\000\000\000\000\000\000\002\018\003c\007\028\003\142\003\136\000\000\003c\002\019\003\142\002\028\003h\000\000\000\000\000\000\000\000\003h\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\003\130\000\000\000\000\004\236\000\000\000\000\000\000\000\000\004l\003\139\000\000\000\000\000\000\000\000\003\139\000\000\003\160\001d\002\028\003\141\003\142\003\160\000\000\002\028\003\141\000\000\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\002\211\000\000\003\138\001#\003\162\000\000\000\000\000\000\000\000\003\162\003\152\000\000\000\000\000\000\000\000\001F\003\139\000\000\000\000\000\000\000\000\001M\001]\003\160\000\000\002\028\003\141\000\000\003\136\000\000\000\000\000\000\003\142\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\002\211\000\000\003\138\001#\003\162\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\158\000\000\000\000\000\000\000\000\000\000\003\139\000\000\000\000\003c\001z\000\000\003\142\003\160\000\000\002\028\003\141\003\142\003h\000\000\001^\000\000\000\000\007!\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\162\003\167\003c\000\000\000\000\000\000\003\178\003\139\000\000\000\000\001\135\003h\003\139\001\139\003\160\000\000\002\028\003\141\000\000\003\160\000\000\002\028\003\141\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\003\162\002\208\000\000\000\000\000\000\003\162\000\000\003c\000\000\000\000\000\000\000\000\003c\000\000\000\000\000\000\003h\000\000\000\000\000\000\000\000\003h\000\000\003\136\000\000\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\003\130\002\211\000\000\003\138\001#\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\136\000\000\003c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003h\003\142\002\211\000\000\003\138\001#\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003c\000\000\000\000\000\000\001U\000\000\003\184\b\230\000\000\003h\003\142\003\136\003\139\000\000\b\231\000\000\003\136\000\000\000\000\003\160\000\000\002\028\003\141\003\130\002\211\000\000\003\138\001#\000\000\002\211\000\000\003\138\001#\001[\002\205\000\000\002\206\002\207\001\243\003\190\002\208\000\000\000\000\000\000\000\000\003\139\003\162\000\000\000\000\000\000\000\000\003c\003\160\000\000\002\028\003\141\003\142\000\000\000\000\000\000\003h\003\142\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\130\002\211\000\000\003\138\001#\003\162\000\000\000\000\000\000\001d\000\000\003\196\000\000\000\000\000\000\000\000\003\202\003\139\000\000\000\000\000\000\003\136\003\139\000\000\003\160\000\000\002\028\003\141\b\232\003\160\000\000\002\028\003\141\003\142\002\211\000\000\003\138\001#\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\001F\002\208\000\000\000\000\000\000\003\162\001M\001]\000\000\000\000\003\162\000\000\003c\000\000\000\000\000\000\003\208\000\000\000\000\000\000\003\142\003h\003\139\000\000\000\000\000\000\003\136\000\000\000\000\003\160\000\000\002\028\003\141\000\000\002\205\003\130\002\206\002\207\001\243\002\211\002\208\003\138\001#\000\000\000\000\000\000\000\000\000\000\000\000\003\214\000\000\003c\000\000\bg\000\000\003\139\003\162\000\000\000\000\000\000\003h\000\000\003\160\000\000\002\028\003\141\001^\000\000\000\000\t\138\000\000\003\142\t\139\000\000\003\130\000\000\bj\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\bk\000\000\000\000\003\162\000\000\000\000\000\000\000\000\003c\000\000\001\135\000\000\000\000\000\000\003\220\000\000\000\000\003h\000\000\000\000\003\139\003\136\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\003\130\000\000\bl\002\211\000\000\003\138\001#\000\000\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\003\162\000\000\003c\000\000\000\000\000\000\003\136\003c\000\000\000\000\000\000\003h\003\142\000\000\000\000\000\000\003h\000\000\bm\002\211\000\000\003\138\001#\000\000\000\000\003\130\000\000\000\000\000\000\000\000\003\130\000\000\bn\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\226\000\000\000\000\000\000\000\000\000\000\003\139\000\000\003\136\003c\003\142\t\141\000\000\003\160\000\000\002\028\003\141\000\000\003h\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\000\000\bp\001U\003\130\000\000\001W\000\000\000\000\001\193\000\000\003\232\003\162\001f\000\000\bq\000\000\003\139\bs\000\000\000\000\bx\000\000\000\000\003\160\003\142\002\028\003\141\003\136\000\000\000\000\001\194\001[\003\136\bz\000\000\000\000\000\000\000\000\001\216\000\000\002\211\000\000\003\138\001#\000\000\002\211\000\000\003\138\001#\000\000\003\162\b{\000\000\003\238\002\205\000\000\002\206\002\207\001\243\003\139\002\208\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\003c\003\142\000\000\000\000\003\136\000\000\003\142\000\000\000\000\003h\001d\000\000\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\003\162\003\130\000\000\000\000\000\000\000\000\000\000\001n\003\244\000\000\000\000\001\199\000\000\003\250\003\139\000\000\000\000\000\000\000\000\003\139\000\000\003\160\000\000\002\028\003\141\001F\003\160\003\142\002\028\003\141\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\162\000\000\000\000\000\000\000\000\003\162\000\000\000\000\004\000\003c\000\000\000\000\000\000\002\205\003\139\002\206\002\207\001\243\003h\002\208\000\000\003\160\000\000\002\028\003\141\003\136\000\000\000\000\000\000\000\000\003c\000\000\003\130\001z\000\000\000\000\000\000\000\000\002\211\003h\003\138\001#\000\000\001^\000\000\000\000\001\209\000\000\003\162\000\000\000\000\000\000\002\205\003\130\002\206\002\207\001\243\000\000\002\208\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\003c\003\142\000\000\000\000\001\135\000\000\000\000\001\139\003c\003h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003h\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\004\006\003\130\000\000\000\000\000\000\003\136\003\139\000\000\002\205\000\000\002\206\002\207\001\243\003\160\002\208\002\028\003\141\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\003c\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003h\000\000\000\000\000\000\000\000\002\211\003\162\003\138\001#\000\000\000\000\000\000\000\000\000\000\003\130\000\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\136\000\000\000\000\000\000\000\000\000\000\003\142\000\000\003\136\003c\000\000\000\000\000\000\002\211\004\012\003\138\001#\000\000\003h\000\000\003\139\002\211\000\000\003\138\001#\000\000\000\000\003\160\000\000\002\028\003\141\000\000\003\130\000\000\000\000\004\018\000\000\000\000\000\000\000\000\000\000\003\139\000\000\000\000\000\000\003\142\000\000\000\000\003\160\000\000\002\028\003\141\000\000\003\142\003\162\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\004\024\003\162\000\000\000\000\000\000\000\000\003\139\000\000\004\030\000\000\000\000\000\000\000\000\003\160\003\139\002\028\003\141\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\002\205\003\142\002\206\002\207\001\243\003\136\002\208\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\003\162\000\000\003c\002\211\000\000\003\138\001#\000\000\003\162\000\000\003c\003h\000\000\000\000\000\000\004$\000\000\000\000\000\000\003h\000\000\003\139\000\000\000\000\000\000\003\130\000\000\000\000\003\160\000\000\002\028\003\141\000\000\003\130\002\205\003\142\002\206\002\207\001\243\000\000\002\208\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\003c\000\000\000\000\000\000\003\162\000\000\000\000\000\000\003c\003h\000\000\000\000\000\000\004\147\000\000\000\000\000\000\003h\000\000\003\139\000\000\000\000\000\000\003\130\000\000\000\000\003\160\000\000\002\028\003\141\000\000\003\130\000\000\000\000\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\003\136\000\000\000\000\000\000\000\000\003c\000\000\003\162\003\136\000\000\003c\000\000\000\000\002\211\003h\003\138\001#\000\000\000\000\003h\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\000\000\003\136\000\000\000\000\000\000\003\142\000\000\000\000\000\000\003\136\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\004\157\000\000\000\000\000\000\000\000\000\000\003\139\000\000\004\167\000\000\000\000\000\000\000\000\003\160\003\139\002\028\003\141\000\000\000\000\000\000\003\142\003\160\000\000\002\028\003\141\000\000\003\136\000\000\003\142\000\000\000\000\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\211\003\162\003\138\001#\000\000\002\211\000\000\003\138\001#\003\162\004\177\000\000\000\000\000\000\000\000\000\000\003\139\000\000\004\186\000\000\000\000\000\000\000\000\003\160\003\139\002\028\003\141\000\000\000\000\000\000\000\000\003\160\003\142\002\028\003\141\000\000\000\000\003\142\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\003\162\000\000\000\000\000\000\000\000\003c\000\000\000\000\003\162\000\000\003c\004\195\000\000\000\000\003h\000\000\004\206\003\139\000\000\003h\000\000\000\000\003\139\000\000\003\160\000\000\002\028\003\141\003\130\003\160\000\000\002\028\003\141\003\130\000\000\000\000\002\205\000\000\002\206\002\207\001\243\002\205\002\208\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\003\162\000\000\003c\001U\000\000\003\162\001W\003c\000\000\000\000\000\000\003h\000\000\001f\000\000\000\000\003h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\003\130\000\000\001[\002\205\001g\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\001\159\000\000\000\000\000\000\000\000\003\136\003c\000\000\000\000\000\000\003\136\000\000\000\000\000\000\000\000\003h\000\000\000\000\002\211\000\000\003\138\001#\000\000\002\211\000\000\003\138\001#\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\205\001d\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\003\136\003c\003\142\000\000\001n\003\136\000\000\000\000\000\000\000\000\003h\000\000\000\000\002\211\000\000\003\138\001#\000\000\002\211\000\000\003\138\001#\001F\000\000\003\130\000\000\004\215\000\000\001M\001]\001\241\004\224\003\139\002P\001\243\000\000\001\244\003\139\000\000\003\160\000\000\002\028\003\141\000\000\003\160\003\142\002\028\003\141\003\136\000\000\003\142\000\000\000\000\000\000\001\245\002\228\000\000\001\247\001\248\001\253\000\000\002\211\000\000\003\138\001#\000\000\003\162\000\000\000\000\000\000\000\000\003\162\000\000\000\000\004\231\000\000\000\000\000\000\001z\005\022\003\139\000\000\000\000\000\000\000\000\003\139\000\000\003\160\001^\002\028\003\141\001\153\003\160\003\142\002\028\003\141\003\136\000\000\000\000\000\000\000\000\005\030\004V\004W\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\003\162\000\000\000\000\000\000\001\135\003\162\000\000\001\139\005\021\002\205\000\000\002\206\002\207\001\243\003\139\002\208\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\003c\003\142\002\016\000\000\000\000\000\000\000\000\000\000\000\000\003h\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\003\162\003\130\000\000\000\000\000\000\000\000\000\000\000\000\005\028\002\205\000\000\002\206\002\207\001\243\003\139\002\208\000\000\000\000\000\000\000\000\000\000\003\160\005%\002\028\003\141\000\000\003c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003h\000\000\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\003\162\003\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003c\000\000\000\000\002\018\001U\000\000\000\000\001W\000\000\003h\002\019\000\000\002\028\000\000\001f\000\000\003\136\000\000\000\000\000\000\000\000\000\000\002\205\003\130\002\206\002\207\001\243\000\000\002\208\002\211\000\000\003\138\001#\001[\002\205\001g\002\206\002\207\001\243\003c\002\208\000\000\000\000\000\000\000\000\001p\000\000\000\000\003h\000\000\000\000\003c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003h\003\142\003\130\000\000\003\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\001d\000\000\000\000\000\000\000\000\000\000\000\000\0055\000\000\000\000\000\000\000\000\003\136\003\139\000\000\000\000\000\000\000\000\000\000\001n\003\160\000\000\002\028\003\141\000\000\002\211\003\142\003\138\001#\000\000\000\000\000\000\002\205\000\000\002\206\002\207\001\243\001F\002\208\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\003\162\000\000\003c\000\000\003\136\000\000\000\000\000\000\005A\000\000\003\142\003h\000\000\000\000\003\139\000\000\003\136\002\211\000\000\003\138\001#\003\160\000\000\002\028\003\141\003\130\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\000\000\000\000\005H\000\000\000\000\000\000\000\000\000\000\003\139\001z\001\241\003\162\003\142\001\242\001\243\003\160\001\244\002\028\003\141\001^\000\000\000\000\001\153\000\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\005T\003\162\000\000\000\000\000\000\000\000\003\139\000\000\001\135\000\000\000\000\001\139\005S\003\160\000\000\002\028\003\141\000\000\003\139\003\136\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\003\162\002\b\000\000\002\t\tc\000\000\te\001\241\000\000\000\000\001\242\001\243\003\162\001\244\000\000\001U\000\000\000\000\001W\000\000\001U\001\193\000\000\001W\003\142\001f\001\193\000\000\000\000\000\000\001f\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\002\016\000\000\001\194\001[\000\000\000\000\000\000\001\194\001[\000\000\001\195\000\000\005Z\001\255\000\000\001\214\001#\000\000\003\139\000\000\000\000\000\000\000\000\000\000\000\000\003\160\000\000\002\028\003\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\b\000\000\002\t\b\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\162\001d\000\000\000\000\000\000\000\000\001d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\000\001\199\001n\002\016\000\000\002\018\001\199\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\001F\001\255\000\000\000\000\001#\001F\001M\001]\000\000\000\000\001\241\001M\001]\001\242\001\243\000\000\001\244\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\001^\000\000\002\018\001\209\000\000\001^\000\000\000\000\001\209\002\019\000\000\002\028\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002A\000\000\000\000\000\000\000\000\002\b\000\000\002\t\0025\000\000\000\000\001\135\000\000\000\000\001\139\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\001\241\000\000\002\016\001\242\001\243\000\000\001\244\000\000\000\000\000\000\002\016\000\000\000\000\000\000\000\000\001\255\001\245\002\007\001#\001\247\001\248\001\253\000\000\001\255\001\245\002\007\001#\001\247\001\248\001\253\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001U\000\000\000\000\b\241\001\245\002\007\000\000\001\247\001\248\001\253\b\242\000\000\000\000\002\b\000\000\002\t\0022\000\000\000\000\000\000\000\000\002\b\000\000\002\t\002\011\000\000\000\000\000\000\000\000\001[\000\000\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\002\018\002\028\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\002\b\002\016\002\t\002\014\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\001d\000\000\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\002\016\000\000\000\000\000\000\001\245\002\007\b\243\001\247\001\248\001\253\000\000\000\000\000\000\001\255\001\245\002\007\001#\001\247\001\248\001\253\000\000\000\000\000\000\000\000\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\000\001U\000\000\000\000\b\247\000\000\002\019\002\018\002\028\000\000\002\b\b\248\002\t\002\017\002\019\000\000\002\028\000\000\000\000\000\000\002\b\000\000\002\t\0021\000\000\000\000\000\000\000\000\000\000\001\241\001[\000\000\001\242\001\243\000\000\001\244\000\000\000\000\002\018\000\000\001\241\000\000\000\000\001\242\001\243\002\019\001\244\002\028\001^\000\000\002\016\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\002\016\000\000\000\000\001\255\001\245\002\007\001#\001\247\001\248\001\253\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\001\135\000\000\001d\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\249\000\000\002\b\000\000\002\t\002%\000\000\000\000\000\000\005\138\000\000\000\000\000\000\002\b\000\000\002\t\002-\005\146\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\002\018\002\016\001\241\005\159\000\000\001\242\001\243\002\019\001\244\002\028\000\000\000\000\002\016\000\000\001\255\000\000\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\001\245\002\007\001#\001\247\001\248\001\253\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\210\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\000\000\005\150\000\000\003\138\001#\0017\000\000\001\135\002\b\000\000\002\t\003)\000\000\000\000\000\000\002\018\000\000\000\000\000\000\000\000\000\000\000\000\002\019\000\000\002\028\000\000\002\018\000\000\001\241\000\000\000\000\001\242\001\243\002\019\001\244\002\028\000\000\000\000\005\141\002\b\000\000\002\t\003Q\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\003\139\000\000\000\000\000\000\000\000\000\000\000\000\003\140\000\000\002\028\003\141\002\016\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\002\b\000\000\002\t\004K\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\002\018\000\000\000\000\002\b\000\000\002\t\004N\002\019\000\000\002\028\000\000\000\000\002\016\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\002\018\000\000\000\000\002\b\000\000\002\t\004Q\002\019\000\000\002\028\000\000\000\000\002\016\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\000\000\000\000\002\b\000\000\002\t\004Y\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\000\000\000\001\245\002\007\000\000\001\247\001\248\001\253\000\000\000\000\000\000\001\255\000\000\000\000\001#\000\000\002\018\000\000\000\000\002\b\000\000\002\t\005B\002\019\000\000\002\028\000\000\000\000\002\016\000\000\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\002\018\000\000\000\000\002\b\000\000\002\t\005;\002\019\000\000\002\028\005\138\000\000\002\016\000\000\000\000\000\000\001\245\002\007\005\146\001\247\001\248\001\253\000\000\000\000\000\000\001\255\000\000\000\000\001#\001U\000\000\002\018\001W\000\000\000\000\000\000\000\000\000\000\002\019\001f\002\028\000\000\000\000\002\016\000\000\005\147\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\001\255\000\000\001[\001#\000\000\002\018\000\000\000\000\002\b\000\000\002\t\006\139\002\019\000\000\002\028\001\245\0039\000\000\001\247\001\248\001\253\000\000\001\241\000\000\000\000\001\242\001\243\000\000\001\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\000\000\002\210\000\000\000\000\002\019\000\000\002\028\001\245\0039\002\016\001\247\001\248\001\253\001d\005\150\000\000\003\138\001#\0017\000\000\001\241\000\000\001\255\001\242\001\243\001#\001\244\000\000\002\018\000\000\000\000\000\000\001n\000\000\000\000\002\019\000\000\002\028\000\000\000\000\000\000\000\000\000\000\001U\001\245\0039\001W\001\247\001\248\001\253\001F\005\141\000\000\001f\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\001U\001\254\000\000\001W\000\000\000\000\000\000\000\000\000\000\001[\001f\001g\000\000\000\000\001\255\000\000\000\000\001#\003\139\000\000\000\000\001\176\000\000\000\000\000\000\003\140\002\018\002\028\003\141\001[\000\000\000\000\001\254\002\019\000\000\002\028\000\000\000\000\000\000\000\000\000\000\006\151\000\000\001z\000\000\001\255\000\000\000\000\001#\003;\000\000\000\000\000\000\001^\000\000\000\000\001\225\000\000\007\236\001d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000\000\000\000\003<\000\000\000\000\000\000\001n\001d\bZ\002\018\001\255\001\135\000\000\001#\001\139\000\000\002\027\000\000\002\028\000\000\000\000\000\000\000\000\000\000\001F\000\000\001n\000\000\000\000\001U\001M\001]\001W\001U\000\000\000\000\001W\000\000\001U\001f\002\018\001W\000\000\001f\001F\bZ\000\000\002\027\001f\002\028\001M\001]\000\000\000\000\000\000\000\000\000\000\000\000\001[\000\000\000\000\000\000\001[\000\000\b[\000\000\000\000\001[\000\000\001g\006\151\000\000\000\000\000\000\006\151\000\000\000\000\002\018\000\000\b\236\001z\000\000\000\000\000\000\002\027\000\000\002\028\007\250\000\000\000\000\001^\b\004\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\001z\bc\000\000\000\000\000\000\000\000\000\000\000\000\001d\000\000\001^\000\000\001d\006\160\000\000\000\000\000\000\001d\000\000\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\001n\000\000\000\000\000\000\001n\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001\241\001F\000\000\001\242\001\243\001F\001\244\001M\001]\000\000\001F\001M\001]\000\000\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\001U\001\245\002\026\001W\001\247\001\248\001\253\000\000\001U\000\000\001f\001W\000\000\000\000\000\000\000\000\001U\000\000\001f\001W\000\000\000\000\000\000\000\000\000\000\000\000\001f\000\000\000\000\001[\000\000\000\000\000\000\000\000\001z\000\000\000\000\001[\001z\000\000\000\000\002U\000\000\001z\001^\001[\000\000\006\160\001^\002\249\000\000\006\160\000\000\001^\000\000\000\000\001\153\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001\135\001d\000\000\001\139\000\000\001\135\000\000\000\000\001\139\001d\000\000\001\254\000\000\000\000\000\000\000\000\000\000\001d\000\000\000\000\001n\000\000\000\000\000\000\001\255\000\000\000\000\001#\001n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\001F\000\000\001U\000\000\000\000\001W\001M\001]\001F\000\000\000\000\000\000\001f\000\000\001M\001]\001F\000\000\000\000\000\000\000\000\001\241\001M\001]\001\242\001\243\002\205\001\244\002\206\002\207\001\243\001[\002\208\000\000\001U\000\000\000\000\001W\000\000\000\000\000\000\000\000\000\000\003$\001f\001\245\0038\000\000\001\247\001\248\001\253\000\000\002\209\002\018\000\000\000\000\001z\000\000\000\000\000\000\002\027\000\000\002\028\001[\001z\000\000\001^\000\000\000\000\002X\000\000\000\000\001z\001U\001^\0041\001W\002\252\000\000\000\000\000\000\001d\001^\001f\000\000\002(\000\000\001U\000\000\000\000\001W\000\000\000\000\000\000\000\000\000\000\001\135\001f\000\000\001\139\001n\000\000\001[\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\000\000\001\135\001d\004]\001\139\001[\000\000\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\005\237\000\000\000\000\000\000\001n\001\254\000\000\000\000\000\000\000\000\002\210\000\000\000\000\000\000\000\000\000\000\005\240\000\000\001\255\000\000\000\000\001#\001F\002\211\001d\003\138\001#\000\000\001M\001]\000\000\001U\000\000\000\000\001W\000\000\000\000\000\000\001d\000\000\000\000\001f\000\000\001n\000\000\001U\001z\000\000\001W\000\000\000\000\000\000\000\000\000\000\000\000\001f\001^\001n\000\000\002(\001[\001F\000\000\000\000\000\000\000\000\001U\001M\001]\001W\000\000\000\000\000\000\000\000\001[\001F\001f\000\000\001z\000\000\b\029\001M\001]\000\000\000\000\002\018\001\135\000\000\001^\001\139\003\139\003q\002\027\000\000\002\028\001[\000\000\003\140\000\000\002\028\003\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\000\000\000\000\001U\000\000\000\000\001W\001z\001\135\000\000\000\000\001\139\000\000\001f\001d\000\000\000\000\001^\000\000\001n\003q\001z\000\000\000\000\000\000\000\000\001U\000\000\000\000\001W\000\000\001^\001[\001n\000\000\001d\001f\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\001\135\000\000\000\000\001\139\001F\000\000\000\000\001n\001[\000\000\001M\001]\000\000\000\000\001\135\000\000\000\000\005\244\bg\000\000\005\237\000\000\000\000\000\000\000\000\001F\000\000\000\000\000\000\000\000\tG\001M\001]\000\000\t\138\001d\b\207\t\139\000\000\000\000\000\000\bj\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\bk\000\000\000\000\001n\000\000\001^\000\000\001d\007.\001z\000\000\0071\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001^\000\000\001F\007!\000\000\000\000\000\000\001n\001M\001]\000\000\001z\000\000\000\000\bl\000\000\001\135\000\000\000\000\001\139\000\000\001^\bg\bg\007.\001F\000\000\bK\000\000\000\000\001\135\001M\001]\001\139\000\000\000\000\000\000\001U\t\138\t\138\001W\t\139\t\139\000\000\000\000\bj\bj\001f\000\000\000\000\000\000\001\135\000\000\bm\001\139\bk\bk\000\000\001z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001[\bn\001^\000\000\000\000\tH\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\000\000\t\140\bl\bl\000\000\001^\000\000\000\000\001U\000\000\000\000\001W\001\135\000\000\000\000\001\139\000\000\000\000\001f\001U\bp\000\000\001W\000\000\001U\000\000\000\000\001W\000\000\001f\001d\000\000\000\000\bq\001f\001\135\bs\001[\005\244\bx\000\000\bm\bm\000\000\000\000\000\000\000\000\000\000\001[\001n\000\000\000\000\bz\001[\000\000\bn\bn\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001F\000\000\000\000\b{\000\000\000\000\001M\001]\t\144\t\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\000\000\001U\000\000\000\000\001W\000\000\bp\bp\000\000\000\000\001d\001f\000\000\000\000\000\000\001d\000\000\000\000\001n\bq\bq\000\000\bs\bs\000\000\bx\bx\000\000\000\000\001n\001[\000\000\000\000\000\000\001n\001z\001F\000\000\bz\bz\000\000\000\000\001M\001]\000\000\001^\000\000\001F\001\158\000\000\000\000\000\000\001F\001M\001]\000\000\b{\b{\001M\001]\000\000\000\000\001U\000\000\000\000\001W\001U\000\000\000\000\001W\000\000\001U\001f\000\000\001W\001\135\001f\000\000\001\139\000\000\001d\001f\000\000\001U\000\000\000\000\001W\000\000\000\000\000\000\000\000\001[\001z\001f\000\000\001[\000\000\000\000\000\000\001n\001[\001\203\001^\001z\000\000\001{\000\000\000\000\001z\000\000\000\000\000\000\001[\001^\000\000\000\000\001\156\001F\001^\000\000\000\000\001\161\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\001d\000\000\001\135\000\000\001d\001\139\000\000\001\135\000\000\001d\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\001d\000\000\001n\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\001F\000\000\000\000\001n\001F\001^\001M\001]\001\178\001F\001M\001]\000\000\000\000\001U\001M\001]\001W\000\000\000\000\000\000\001F\000\000\001U\001f\000\000\001W\001M\001]\000\000\000\000\000\000\000\000\001f\001U\001\135\000\000\001W\001\139\000\000\000\000\000\000\000\000\001[\001f\001U\000\000\000\000\001W\000\000\000\000\000\000\001[\000\000\000\000\001f\001z\000\000\000\000\000\000\001z\000\000\000\000\001[\000\000\001z\001^\000\000\000\000\000\000\001^\000\000\000\000\002W\001[\001^\000\000\001z\002\132\000\000\000\000\001U\000\000\000\000\001W\000\000\000\000\001^\000\000\000\000\002\134\001f\000\000\001d\000\000\000\000\001\135\000\000\000\000\001\207\001\135\000\000\001d\001\139\000\000\001\135\000\000\000\000\001\139\000\000\001[\000\000\001n\001d\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001n\000\000\000\000\001d\000\000\000\000\000\000\000\000\000\000\001F\000\000\001n\000\000\000\000\000\000\001M\001]\000\000\001F\000\000\000\000\000\000\001n\000\000\001M\001]\000\000\000\000\002\205\001F\002\206\002\207\001\243\000\000\002\208\001M\001]\000\000\000\000\001d\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\002\205\003W\002\206\002\207\001\243\001n\002\208\000\000\000\000\000\000\000\000\000\000\001z\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\001z\001^\001F\000\000\002\230\003[\000\000\000\000\001M\001]\001^\001z\000\000\002\251\000\000\001U\000\000\001U\001W\003z\001W\001^\001z\000\000\003\027\001f\000\000\001f\000\000\000\000\000\000\001\135\001^\000\000\001\139\003&\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001[\000\000\001[\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\001z\000\000\000\000\000\000\001\135\000\000\000\000\001\139\002\210\000\000\001^\000\000\000\000\0036\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\002\205\000\000\002\206\002\207\001\243\000\000\002\208\002\210\000\000\000\000\001d\000\000\001d\000\000\001\135\000\000\000\000\001\139\000\000\000\000\002\211\002\210\003\138\001#\000\000\000\000\003\137\000\000\000\000\001n\000\000\001n\000\000\000\000\002\211\000\000\003\138\001#\002\205\000\000\002\206\002\207\001\243\000\000\002\208\000\000\000\000\001F\000\000\001F\000\000\000\000\000\000\001M\001]\001M\001]\000\000\000\000\000\000\001U\000\000\003\139\001W\003\161\000\000\000\000\000\000\000\000\003\140\001f\002\028\003\141\000\000\000\000\001U\000\000\000\000\001W\000\000\000\000\000\000\000\000\000\000\000\000\001f\000\000\003\139\000\000\001[\000\000\000\000\001U\000\000\003\140\001W\002\028\003\141\000\000\000\000\000\000\003\139\001f\001z\001[\001z\000\000\000\000\003\140\000\000\002\028\003\141\002\210\001^\000\000\001^\003n\000\000\003s\000\000\000\000\001[\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\001U\000\000\000\000\001W\000\000\000\000\000\000\000\000\000\000\001d\001f\000\000\000\000\001\135\000\000\001\135\001\139\000\000\001\139\000\000\002\210\000\000\000\000\000\000\001d\000\000\000\000\000\000\001n\001[\000\000\000\000\000\000\002\211\000\000\003\138\001#\000\000\000\000\000\000\000\000\001d\000\000\001n\000\000\001U\001F\000\000\001W\000\000\000\000\000\000\001M\001]\000\000\001f\000\000\000\000\000\000\000\000\001n\001F\003\139\000\000\000\000\000\000\000\000\001M\001]\003\140\000\000\002\028\003\141\000\000\001[\000\000\000\000\000\000\001F\001d\000\000\000\000\000\000\000\000\001M\001]\000\000\000\000\000\000\000\000\000\000\001U\000\000\002\205\001W\002\206\002\207\001\243\001n\002\208\003\139\001f\001z\000\000\000\000\000\000\000\000\003\140\000\000\002\028\003\141\000\000\001^\000\000\000\000\004.\001F\001z\000\000\004\136\001[\000\000\001M\001]\001d\001U\000\000\001^\001W\000\000\0043\000\000\000\000\000\000\001z\001f\000\000\000\000\000\000\000\000\000\000\000\000\001\135\001n\001^\001\139\001U\004C\000\000\001W\000\000\000\000\000\000\000\000\001[\000\000\001f\001\135\000\000\000\000\001\139\001F\000\000\000\000\000\000\000\000\001U\001M\001]\001W\001d\000\000\001z\000\000\001\135\001[\001f\001\139\000\000\000\000\000\000\000\000\001^\000\000\000\000\004_\000\000\000\000\000\000\001n\000\000\000\000\000\000\000\000\000\000\001[\000\000\000\000\000\000\000\000\001U\000\000\000\000\001W\001d\002\210\000\000\001F\000\000\000\000\001f\000\000\001\135\001M\001]\001\139\000\000\001z\002\211\000\000\003\138\001#\000\000\001n\000\000\001d\000\000\001^\000\000\001[\006\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001F\000\000\000\000\001n\001d\001U\001M\001]\001W\000\000\001U\000\000\000\000\001W\000\000\001f\001\135\000\000\000\000\001\139\001f\001F\001z\001n\000\000\000\000\001U\001M\001]\001W\000\000\000\000\001^\000\000\001[\006\250\001f\000\000\001d\001[\000\000\001F\000\000\000\000\003\139\000\000\000\000\001M\001]\000\000\000\000\003\140\000\000\002\028\003\141\001[\001z\001n\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001^\000\000\000\000\007\006\000\000\000\000\000\000\000\000\000\000\001F\000\000\001z\000\000\000\000\000\000\001M\001]\001U\001d\000\000\001W\001^\000\000\001d\007 \000\000\000\000\001f\000\000\000\000\001\135\001z\000\000\001\139\000\000\000\000\000\000\001n\000\000\001d\000\000\001^\001n\000\000\0070\000\000\001[\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001F\000\000\000\000\001n\000\000\001F\001M\001]\000\000\000\000\001z\001M\001]\000\000\001U\000\000\001\135\001W\000\000\001\139\001^\001F\000\000\007\215\001f\000\000\001U\001M\001]\001W\001U\000\000\000\000\001W\001U\000\000\001f\001W\000\000\000\000\001f\001d\000\000\001[\001f\000\000\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\000\000\001[\001z\000\000\000\000\001[\001n\001z\001U\001[\000\000\001W\001^\000\000\000\000\007\233\000\000\001^\001f\000\000\b\001\000\000\000\000\001z\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\000\000\001^\000\000\000\000\b\183\001[\000\000\001d\000\000\000\000\001\135\000\000\000\000\001\139\000\000\001\135\000\000\000\000\001\139\001d\000\000\000\000\000\000\001d\000\000\000\000\001n\001d\000\000\000\000\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\001n\000\000\000\000\000\000\001n\000\000\001F\000\000\001n\000\000\001z\000\000\001M\001]\000\000\000\000\000\000\001d\001F\000\000\001^\000\000\001F\b\198\001M\001]\001F\000\000\001M\001]\000\000\000\000\001M\001]\000\000\000\000\001n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001F\000\000\000\000\000\000\000\000\000\000\001M\001]\001z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001^\000\000\001z\b\221\000\000\000\000\001z\000\000\000\000\000\000\001z\000\000\001^\000\000\000\000\b\238\001^\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\135\000\000\000\000\001\139\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\001\135\000\000\000\000\001\139\001\135\000\000\001^\002\127\001\135\000\000\000\000\002\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\135\000\000\000\000\005\239")) + ((16, "\002P\000\131\000[\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000S\000\000\000\000\000\195\002f\000)\000-\001n\000,\000\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\001b\000\000\000\000\000\000\002\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000S\026\002\222\002\240\003&\000\000\000\000\000\000\000\000\000\000\000\000\002\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000U\194\000\000\001\129\000\000{\014\003\"\000\000U\194\003\130\000\000\001w\000\000\000\000\000\000{\134\000\000\000\000\005\024V\206\003\136\002Z\001*\000\000\000\000\000\000\002\156_l\003\206\004\022\000d\000\000\000\000\000\000\000\128\000\000\000\000\0004\000\000\000\000\000\000\000\000\000\000\006.\000\000\001a\000\000\000\000\0074\000\000\003\246\007~\000\000\001/\000\000\000\000\000\000\000\000\002:\000\000\000\000\000\000\007\250\000\000\0048\b,\000\000\003\140\000q\000\254\000\000\005\158\tz\000\000\000\000\011\238U\194\000\000\006\230U\194\004\200\000\000\002l\003\228\016&\000\000\000\000\004\194\b\226\016\136\000\000\000\000\006j{\158\000\000\005\224\000\000\000\022\005\250\000\000\000\152G\238\000?\000\000\000\000\000c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0178\005\128\000\000\000\000\000\000\000\000\000\000\005l\019\176\005\250\007F\000\000\007R\000\000\000\000\000\000\135\242\006\134\000\000\000\000\012dW6\000\000\000\000\004\150\000\000\005\012\000\000\000\000\000\000\000\000\000\\\000\000\000\000\000\000\000\000{\234\016,WV\000\000\007\150\000\000\000\000\007\252\000\000\002\000\000\000\000\000|4\000\000\000\000\001\169\tH\144\028\t\\\000\000\000\000\028>\t\158\145\002\t\212\000\000\000\000+\128\t\226\000\000\145t\n\\\000\000\000\0006\212\n\226\000\000\000\b\028R\000\000\rJ\000\b\005\204\000\000\000\000\000\000\000\000\014b\000\000)\026\000\b\000\b\000\b\000\000\000\000\145\138\011\004\000\000\000\0008\164\011,\000\000\000\000\000\000\000\000\011\150\000\000\000\000\000\000\007\026\000\000\000\000\011\154\000\000\007\172\000\000\000\000\001\169\000\000|\168\001\169\011\198\000\000\001\169\000\000}T\001\169\012\014\145\190\012<\000\000\000\000?\134\012\144\000\000\000\000\145\214\012\202\000\000\000\000CZ\012\214\000\000\012\232\145\232\012\248\000\000\000\000F\014\r\004\000\000\000\000\146,\r\b\000\000\000\000J\168\r$\000\000N\148W\170\000\000}z\001\169\r0\146\148\r4\000\000\000\000\\\206\rB\000\000\000\000\146\254\r^\000\000\000\000i\214\rr\000\000\r\134\147f\r\180\000\000\000\000m\214\r\200\000\000\000\000\147\172\014\016\000\000\000\000p.\014\024\000\000s\240\014$\000\000\000\000zj\0140\000\000\000\000\000\000\000\000\000\000\000\000H(\000\000\b\238\015D\000\000}\200\t6\1402\000\000\000\000\000\000\000\000\001\169\000\000\000\000\000\000\017\140\000\000\000\000\000\000\000\000\000\000\000\000\001\154\015.\000\000\000\000\000\000\001\169x\164\000\000\001\169}\238\001\169\000\000\000\000Xl\000\000\000\000\016\n\000\000\000\000\000\000\000\000\t\"\014\158\n\192\014zX\206\000\000\000\000\000\000\000\000~\132\001\169\000\000YT\000\000\000\000\000\000~\154\001\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Hv\000\000\014\230\n\198\015\136\000\000\000\000\000\000\000\000\001\252\000\000\000\000\n\206\000\138\n\224\007@\0150\011(\001>\003\004\005\184\000\194\005\158\016\\\0020\005\178\000Z\b\212\000\000\000\000\000\000\015<\015T\011.\001\012\000\000\000\000\002~\0118X\244\017\238\015Z\011<\000\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015x\011L\018\132\011\168\t\"I\028\018\220\000\000Y\162\019\156\000\000\000\000\000\000\127\026\001\169\000\000Z|\000\000\000\000\000\000\127\196\001\169\000\000\000\000I\150J:JX\000\000\002\128\000\000\000\000\000\000\000\000\016P\127\240\001\169\016xZ\200\015\162\011b\006\160\000\000\007\022\000\000\000\000\000\000\000\\\000\000\000\000\007H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\000\000\000\000\000\000\000\000\000\000\017\020[\028\000\000\000\000Ar\000\000[p\000\000\000\000\000\000\128*\001\169\000\000\000\000gH\000\000\000\000\000\000\000\000\015\188\011h[\248\000\000\000\000\000\000\001(\000\000\\\016\001(\000\000\\\152\000\000\000\000\000\000\128T\001\169\000\000\000\000h\128\000\000\000\000\001(\\\236\000\000\001(]@Hv\016\194\016\200\000\000\000\000r\234\000\000\000\000\000\000\000\000\001(\000\000\000\000]\190\000\000\000\000\000\000\000\000\128x\001\169\000\000\000\000~\220\000\000\000\000\001(w\148\000\000\001\169\000\000\000\000\016\226\000\000\000\000\000\000\000\000^\018\000\000\001(\002x\000\000\000\000\000\000\000\000\001(\000\000\001(\000\000\000\000\001(\000\000\000\000JX\000\000\000\000\000\000\000\000\001(J\222\000\000\000\000\001(\000\000\005@\016\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\128\000\000\000\000\000\000\016\b^f\000\000\001(\000\000\000\000\000\000^\182\000\000\000\000\000\000\129\000\001\169\000\000\000\000\142\130\000\000\000\000\016\b\000\000_\006\000\000\000\000\000\000\129d\001\169\000\000\000\000\142\198\000\000\000\000\016\b\142\236\000\000_\136\000\000\000\000\000\000\129\136\001\169\000\000\000\000\143\\\000\000\000\000\016\b.\136\000\000\003\172\016\000v\244\000\000\129\210\001\127\000\000\002\142\000\000\000\000\016\136\000\000\000\000\000\000\000\000\000\000\000\000\004\238\016\158\017J\019\240\016r\016v\016\138\011l\006\024\011n\002\194\017,\000\000\000\000\002\176\003@\000\000\004\014\011\198\003L\016\184\004\234\000\000\000\005\000R\004\004\002@\018X\000\000\000\000\140|\000\000\140\142\017\220\000\000\130\154\001\169\130\222\001\169\000\000\004P\005\252\000\000\006l\000\005\000\000\000\000\016\228\000\000\000\000\000\000\000\000\000\000\007(\000\005\b\218\000\005\000\000\005\004\000\000\000\000\005\n\000\000\000\000\000\000\018l\000\000\000\000\000\000\000\000\000\005\000\005\000\000\000\000\000\005\000\000\016\184\b\188\000\000\000n\002~\000\000\000n\000\000\000\000\b\220\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000n\020BKHK\160\018,\017\188_p\br\000\000\017*\011\218\020R\0170\011\224O\bTT\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006r\r\030\000\000\000\000\000\000\017d\012\000\n8\000n\nT\000\000\000\005\000\000\000\000\000\000\019\156\000\000\131\000\001\169\020\170a\172\000\000\000\000\000\000e\136\000\000\000\000L\014\017j\012\030\021\002\017t\012 \021jLb\001(\022\022\017\146\012*\002\170\018\150\000\000\004D\003\014w8\000\000\131*\004J\000\000\004\154\000\000\000\000L\136\018p\000\000\000\000\018x\000\000\000\000\000\000\000\000\bh\000\208\000\000\000\000\b*\000\000\000\000\000\000\b\172\000\000\000\000\000\000\000\000\000\000\005\016\000\000\000\000\001(w\148\000\000\131\216\005^\000\000\000\000\000\000M\138\000\000\000\000\143\174\022\150\001(x\020\000\000\1324\005\162\000\000\000\000\000\000`\138\001(\000\000\018\208\017\200\000\000\000\000\017\212\000\000\t\000\000\000\000\000\000\000\132x\006\028\000\000\000\000\000\000\000\000\000\000\133\018\000\000\000\000\018\130V\242\000\b\000\000\022f\017\200\012R\023\194\000\000`0\000\000\000\000\019P\000\000\000\000\000\000f\016\000\000\000\000\000\000\004.\024\024\017\244\012Z`\176\001(\024B\024n\018\b\012xz\222\000\000\000\000\000\000\000\000\000\000aP\018\020\012z\024\158\000\000\000\0000\210\000\000\000\000\019\148\000\000\000\000\000\000\000\000\000\000\147J\000\000\147\224\000\000\000\000M\128\018 \012\178\025\146\000\000M\216\000\000\000\000af\000\000\000\000\019\208\000\000\000\000\000\000\148 \000\000\018r\012\190\0262\000\000N2\000\000\148\154\000\000\018X\025\214\000\000\000\000\004\166b\018\018\204\012\200\026P\000\000\004\166bb\019\000\012\202\027\014\000\000\004\166\000\000\148\164\000\000bz\019\012\012\208\027\134\000\000\004\166\027\144\007\170\027\254\000\000\000\000b\220\019\014\012\222\028\184\000\000\004\166c\140\019\\\012\226\029`\000\000\004\166c\238\019h\r4\029x\000\000\004\166d\020\019l\r\134\0302\000\000\004\166dv\019|\r\138\030\174\000\000\004\166d\196\019\136\r\150\031&\000\000\004\166e&\019\140\r\238\031p\000\000\004\166eL\019\152\r\240\031\232\000\000\004\166e\174\019\188\r\246 `\000\000\004\166f^\019\204\014\002 \168\000\000\004\166f\132\019\206\014\014! \000\000\004\166f\192\019\236\014\022!\152\000\000\004\166f\230\020\006\014d!\224\000\000\004\166g\150\0208\014~\"X\000\000\004\166g\188\020<\014\138\"\208\000\000\004\166g\248\020X\014\160#\024\000\000\004\166h\030\020f\014\180#\144\000\000\004\166h\206\020h\014\204$\b\000\000\004\166h\244\020r\014\226$P\000\000\004\166i0\020x\014\230$\200\000\000\004\166iV\020z\014\238%@\000\000\004\166j\006\000\000\000\000\021\246\000\000\000\000\000\000\148\250\000\000\020\128\015\012%\136\000\000\004\166j,\020\140\015\028&\000\000\000\004\166\015$\rBN\178\020R\000\000O4&\n\000\000\000\000\004`\000\000\000\000&P\000\000\000\000\000\000\r\152x\164\003\216\000\000\132\196\006n&|\000\000\000\000'D\000\000\000\000\133r\007\130'p\000\000\000\000'\182\000\000\020X(8\000\000\000\000(d\000\000\000\000\000\000(\144\000\000\020\\\133\206\t\150)\128\000\000\000\000)\172\000\000\000\000*Z\000\000\016\b*\160\000\000j\240\000\000\000\000\000\000\000\000\134\018\001\169\000\000\000\000\143\212\000\000\000\000\016\bk\178\000\000\001(\007\004\000\000\000\000\007H\r\252x\200\000\000\134^\t\254*\204\000\000\000\000+z\000\000\020b+\192\000\000\000\000,\150\000\000\000\000\000\000,\174\000\000\000\000\b\168\th\000\000\000\000\000\000\004\166\004\166O\140\000\000\000\000\000\000\000\000j\142\020\160\015,-H\000\000\004\166O\226\000\000\000\000\000\000k\218\020\164\0152-\200\000\000\004\166O\242\000\000\000\000\000\000l\000\020\170\015>.p\000\000\004\166\007\236-\238\000\000\000\000\000\000l\022\020\172\015B/J\000\000\004\166/\030\000\000\000\000\000\000l\214\020\174\015T/\252\000\000\004\166/\160\000\000\000\000\000\000m\018\020\178\015j0z\000\000\004\166\000\000\000\000Q\006\000\000\000\000\000\000m\140\020\192\015t1\026\000\000\004\166QX\000\000\000\000\000\000n\006\020\194\015\1301\194\000\000\004\166Q\174\000\000\000\000\000\000nB\020\196\015\1482\012\000\000\004\166\000\000nL\020\202\015\1602\180\000\000\004\166\000\000\023\218\000\000\000\000\004\166\000\000\020\202\000\000\000\0002\144\000\0002\246\000\000\000\000\000\000\000\000\000\0003<\000\000\000\0003\166\000\000\000\000\000\000\000\000Q\198\000\000\000\000R\024\000\000\000\000Rn\000\000\000\000\000\000\020\208\015\1664\188\000\000\004\166\000\000\000\0004Z\000\0004p\000\000\000\000\000\000\000\000\000\000n\136\020\224\015\1705\142\000\000o\002\020\226\015\1925\170\000\000\004\166\004\166o|\020\228\015\2146h\000\000\004\166\000\000\000\000S\020\000\000\000\000S\142\000\000\000\000o\184\000\000\000\000\022`\000\000\000\000\000\000\149\n\000\000\020\232\015\2326\132\000\000\004\166\000\000\016\b7\b\000\000\000\0007X\000\000T\b\000\000\000\000TT\000\000\000\000\000\000Tj\020\248\015\2427\162\003\228o\254\020\252\015\2448\144\000\000\004\166\b.\000\000\001\np\148p\176\001(qd\021\016\016\0128\216\000\000\004\166q\178\001(q\206\021\022\016D9P\000\000\004\166r(\001(r|\021\026\016H9\200\000\000\004\166\005jr\148\021\028\016P:\016\000\000\004\166s\144\021\030\016Z:\136\021$s\224\021,\016\130;\000\000\000\004\166\004\166tD\021.\016\166;H\000\000\004\166\000\000\000\000\000\000\021\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005b\021\024\000\000T\194\0212\016\170;\192\007\232\021\024\000\000\000\000\000\000\000\000\000\000\006B\021\024\000\000U\026\000\000\0218\016\178<8\t\180\021\024\000\000\000\000\000\000\000\000\006\230\021\024\000\000\022\138\000\000\000\000\000\000\030\134\000\000\001\252\000\000\n\188\022\022\000\000\003\172\000\000\000\000\000\000\000\000\000\000\000\000\006r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021D\016\202<\128\000\000\004\166\000\000\022\144\000\000\000\000\000\000\000\000\000\000\021L\016\204<\248\t\206\021\024\000\000\000\000\000\000\000\000\007\142\021\024\000\000\021N\016\254=p\n>\021\024\000\000\000\000\000\000\000\000\000\000\bz\021\024\000\000\000\000\017\012\n\140\000n=\178\000\000\021P\017\030\021\236\n\004\012\020\000n\n\242\000\000\000\005\r\016\000n\000\000>8\000\000\n\184\000\000\021T\017 \b\186\000\000\000\000\000\000\000\000\000\000\021p\014\252\004\004\000\000\000\000\000\000\000\000x\236\000\000\141\158\000\000\0226\022\014\000\000\022\016\000\000\000\000\017*\000\000\017:\000\000\000\000\000\000\000\000\004X\000\000\000\000W~\000\b\000\000\000\000b\186oL\000\138\000\000\003\016\000\000\000\000\006\130\000\000\004\180U\194\021\130\000\000\t.\000\000\000\000\000\000\018J\000\000u\130\000\b\006\130\000\000|\030\000\b\006\130\017F\000\000>\162\000\000\000\000\017P\022r\000\000\014z\011V\000\000\000\000\000\000\000\000\022<\000\000\000\000\000\000\000\000\021d\017r>\210\000\000\004\166\000\000\021f\017t?\192\011\000\021\024\000\000\000\000\000\000\000\000\000\000\t8\021\024\000\000\000\000\021l\017x\rX\000n\000\000\011\204\000\000\000\005\000\000\022\232\000\000\000\000\0214\000\000\000\000\000\000\000\000@~\000\000\000\000\021r\017z@\154\000\000\000\000\000\000\012\202\000\000\000\005\000\000\014.\000\000\000\005\000\000\0146\000\005\000\000\004\166\000\000\000\000\015\210\000\000\000\005\000\000\016p\000\000\000\005\000\000\016\210\000\005\000\000\000n\000\000\017\128\r\214\0010\000\000\021t\021|\017\154\021\162\022V\017&\000\005\012\000\000\000\017\168\022\028\022 \011\140\012>\021\234\017\176\022(\0128\012^\021\238\000\000\000\000\012n\r\026\000\000\n\024\004fs\188\001(A\004\000\000\012\244\001\206\000\000\000\000\t\152\000\000\000\000\000\000\021\146\017\186\011\236\000\000lV\000\000\134~\001\169\000\000\022P\022R\000\000\rX\000\000\001\169\021\156\017\188\011\002\021\184\002\246\000\000\000\000\000\000\000\000\017\200\rj\000\000\017\210\r\180\000\000\t\164\001\150\021\160\021\162\017\226\t\242\r\234\000\000\017\228\n\142\014\n\000\000\021\164\021\168\017\232\021\206\022V\017z\000\005\000\000\017\240\022F\000\000\012\216\000\000\014\164\000\000\022H\000\000\017\172\001`\022\016\017\250\022L\000\000\017\190\t^\022\020\000\000\000\000\000C\006\170\000\000\015(\000\000\019\n\000\005\015\216\000\000\012\192\000\000\000\000\021\182\018\024\011H\021\184\021\184\021\188\018 \023Z\000\000\021\202\007F\000\000\000\000\000\000\007\248\000\000\000\000\000\000\000\219\018.\021\158\135j\001\169\000\000\001\012\0184\022v\000\000\000\000\000\000\000\000\000\000\000\000\135\164\t\186\000\000\0186\022\222\000\000\000\000\000\000\000\000\000\000\000\000t\144\015\244\000\000\018@\t\200\000\000\018D\018J\b.\000\000\n\130Z\b\000\000\007\214\000\000\135\188\001\169\001\169\000\000\000\000\t\248\000\000\n\212\000\000\n\136\t\248\t\248\000\000\018dy4\001\169\136\024\001\169\016&\000\000\000\000\000\000\000\000\016f\000\000\000\000\004\174\000\000\n\174\022,\018p\023r\021\230\000\000\000\000\012\154\011\006\022<\000\000\000\000\018t\023\128\021\240\000\000\000\000\014\228\000\000~\172\000\000\021\168A\180\001\169\000\000MJ\140\234\000\000`\238\000\000\000\\\000\000\000\000\000\000\t\248\000\000\000\000\016t\022B\018\128\023\136\021\248\000\000\000\000kB\016\204\022J\000\000\000\000\000\0000~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\012\000\000\021\242\018\132\019z\011,\000\000\022X\018\136\t\142\000\000\0010\023r\023\026\018\166\022^\000\000\000\000\000\000\022b\018\208\011\022\000\000\006\176\000\000\n\174G\238\b&\000\000\000\000\000\000\012\198\022\024\019\004\000\000\022\028\012\198\000\000\023(\018\194\022r\000\000\000\000\000\000\001\169\002b\003l\bR\000\000\000\000\000\000\000\000\022(\019\b\000\000\b\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\169\022\016\019\014\023\174\022 \000\000\136X\bh\000\143\019@\021\242\006\248\000\020\019`\022\194\000\000\000\000\023\152AZ\000\000\000\000B4\000\000\018\240\000\000\012\202\000\000\000\000\000\000\000\000\000\000\000\000\136\198\001\169\000\000\023\154B\244\000\000\000\000C\030\000\000\000o\019h\0232\000\000\000\000U\130t\196\0040\000\000\137\004\001\169C\160\000\000\000\000D\b\000\000\000\000\018\244\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000u\156\000\000\000\000VTu\224\004X\000\000\137X\001\169DN\000\000\000\000D\184\000\000\000\000\019vD\208\019\206\000\000\019\134\019\142\000*\004\250\019\148\015J\019\150\023>\015X\019\226\000\000\019\160\019\162\rJ\000\000\006\156y\128\000\000\000;\000\000\019\172\137\138\137\254\006\206\021\236\t.\000\000>^\023\218\000\000\005\208\000\000\000\000\005\208\000\000\000\000\005\208\r\196\000\000\011\006\005\208\023F\015p\019\234\000\000\005\208\000\000\000\000\141\030\000\000\000\000\000\000\005\208\000\000\000\000\020\006\000\000\011 \bv\020&\000\000\019\176y\180\0208\000\000\000\000\000\000\000\000\020Z\000\000\000\000\t\130\000\000\005\208\141`\000\000\015d\005\208\138D\000\000\020b\022\144\019\180\023\214\022F\000\000\138\192\020\142\022\150\000\000\000\000\000\000\002>\016r\000\000\000\000\000\000\000\000\000\000\000\000\018X\000\000\020\144\000\000\022@\019\194\014\178\004\020\000\000\022\168\000\000\000\000\000\000\000\000\020\148C\244\000\000\000\000\000\000\018X\000\000\000\000\000\000\000\000\020\154\142\234\000\000\000\000\000\000\000\000\000\000\000\000\023Z\002\226\r,\022\024\006\174\019\224\000\000\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022(\007\030\019\226\000\000\007|\t\210\023\208\023x\020\170\000\000\000\000\023l\005\016\b\218\000\000\000\000\000\000\000\000\000n\000\005\000\000\000\000\144\134\000\000\000\000\001(\000\000u\222\000\000\000\000\000\000\138\162\001\169\000\000\000\000\144\208\000\000\000\000\001(\001(\000\000\138\254\001\169\000\000\nH\000\000\000\000\000\000\149T\000\000\022l\020ZF\b\000\000\004\166\000\000v4\000\000\000\000\023\232\000\000\000\000\000\000\149^\000\000\022p\020nF\128\000\000\004\166\000\000F\200\000\000\000\000\000\000\000\000\000\000\000\000y\252\020|\000\000\020\1685Z\000\000\000\000\000\b7h\000\000\000\000\000\000\000\000\000\000\139Z\001\169\0226\149\188\022<\000\000\000\000\151\206\022@\000\000\000\000\149\222\022D\000\000\000\000\153\020\022L\000\000\tH\000\000\000\000\000\000\001\169\000\000\000\000\n\196\023\176\020\194\000\000\000\000\023\158\001\198\002P\000\000\000\000\000\000\000\000\b\000\014$\023\208\011@\023\184\020\250\000\000\000\000\023\166\003X\005\206\000\000\000\000\000\000\000\000\000\005\000\000\000\000\139\208\001\169\022\\\150\b\022^\000\000\000\000\153&\022`\000\000\000\000\150^\022b\000\000\000\000\153<\022v\000\000\022z\151\018\022~\000\000\000\000\153Z\022\128\000\000\000\000\1514\022\130\000\000\000\000\153r\022\132\000\000\153\158v\168\000\000\140\014\001\169\022\140\151X\022\142\000\000\000\000\153\178\022\144\000\000\000\000\151\134\022\146\000\000\000\000\153\210\022\150\000\000\022\154\151\166\022\162\000\000\000\000\153\228\022\168\000\000\000\000\151\188\022\170\000\000\000\000\154F\022\172\000\000\000\b=\222\022\174\151\232\022\176\000\000\000\000\154~\022\178\000\000\000\000\152\146\022\182\000\000\000\000\154\240\022\184\000\000\000\bL(\022\186\152\200\022\188\000\000\000\000\155\n\022\194\000\000\000\000\152\254\022\196\000\000\000\000\155\030\022\198\000\000\001\169\023\186\000\000\001\169\000\000\000\000\023.\000\000\002d\000\000\021R\000\000\000\000\000\000F\234\000\000G@\000\000\000\000\000\000\000\000\000\000\000\0006\214\000\000\000\000\000\000\001\020\000\166\000\000\000\000\000\000\000\000\000\000\014\024\000\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\004\000\000\000\000\000\000z\140\000\000\001\169\000\000\015\216\000\000\000\000\000\000\tx\000\000\000\000\000\000\005\230\000\000\000\000\000\000\005\198\000\000\000n\000\000\001\186\000\000\000\005\000\000\003\228\000\000\000\000\000\000Vv\001(\000\000\000\000\000\r\000\000\000\000\000\000\000\000\006r\005x\0238\000\027\000\000\000\000\000\000\000\000\000\000\000\000\023<\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\242\000\000\021T\000\000\000\000\000\000\000\000\006.\007\1942ZA\000\000\000\000\000\021jG.\000\000\000\000\000\000\021t\142\022\000\000\000\000\000\000\000\000"), (16, "\t\213\003\184\0008\003\185\003\186\002\127\0008\003\187\011\015\000\149\011i\003\186\002\127\000\147\000\149\000\182\te\011]\003\186\002\127\000\182\004]\t\214\t\235\000\181\000\149\t\216\011q\003\186\002\127\004c\000\182\t;\001K\000\255\001\000\t\217\t\236\001L\001]\000\254\000\255\001\000\002\220\000\239\001\001\000u\002\127\001\002\000\189\000\149\001\195\000\246\000\249\000\177\001\017\000\182\003\138\002>\000\190\001]\002B\002C\004x\003@\t\213\003\184\000\206\003\185\003\186\002\127\t\218\003\187\001\196\005\160\t\239\001\027\001\028\000\196\011\025\001\220\002>\n\142\003r\002B\002C\004]\t\214\t\235\ti\005\160\t\216\000\196\000\191\011_\004c\000\202\003r\001K\000\255\001\000\t\217\t\236\001L\000\242\000\254\000\255\001\000\t^\t\219\001\001\003\139\000\246\001\002\t\146\b\141\001\195\bJ\007Z\004\136\001\017\t`\000\239\002>\001\015\t\220\002B\002C\004x\b\142\000\246\000\249\003\190\b\166\004Y\002B\t\218\000\195\001\196\011j\t\239\004Y\002B\b\242\001 \001\218\011`\005\160\004Y\002B\001\201\t\240\002D\t\148\000\183\n\006\011r\001\025\004Y\002B\000<\001\029\001\030\011*\001\025\000\246\t\241\003\164\001\029\001\030\t\149\b.\000\246\002>\t\219\t\151\002B\002C\t\223\t\195\bL\003\153\t\224\007_\004\136\t\226\t=\000\196\t\231\001\015\t\220\n\017\003r\n\007\003\142\004\141\000\183\003\190\004\142\004Y\002B\t\233\000\246\000@\004Z\n\b\t\146\000\250\000;\001 \000q\004\156\000:\002\158\004\\\001\201\t\240\t\141\n\031\t\234\002'\003\166\001\025\b\215\002B\001,\001\029\001\030\007\209\001\025\000\246\t\241\011\023\001\029\001\030\001-\004\007\000\246\001\211\0119\004\158\004\b\004\n\t\223\005\160\t\148\003\153\t\224\011+\003x\t\226\t\213\003\184\t\231\003\185\003\186\002\127\b\216\003\187\b\217\004\141\000\183\t\149\004\142\003\164\001D\t\233\t\151\005\160\004Z\001^\t\174\004]\t\214\t\235\b\237\004\156\t\216\002\158\004\\\001\223\004c\b\018\007\208\t\234\002B\003\166\t\217\t\236\002B\001,\011,\003a\003\167\b\218\n\157\b\242\t\250\0113\000\246\001-\002}\003y\001\211\b\158\004\158\003\165\t\213\003}\006\129\000\246\n\137\006\228\000\177\004x\000^\t\213\003\184\000\190\003\185\003\186\002\127\t\218\003\187\011Q\007\213\t\239\000\205\000\149\t\214\001D\b\219\002\136\t\216\000\182\001^\b\161\004]\t\214\011\031\002\227\002\127\t\216\t\217\001\226\0114\004c\b\220\b\221\b:\b\222\b\242\t\217\t\236\0008\b\163\003~\0008\003\167\000A\t\219\011:\002}\002\158\003a\002~\002\127\011R\002\128\006\180\004\136\0115\005\160\003\127\003y\t!\t\220\b\164\t\218\004x\003}\000b\000\246\003\190\000\183\004Y\002B\t\218\005\160\002\129\0045\t\004\002\131\002\132\002\137\0116\000\194\003a\005\160\002\166\n \b\224\t\240\003\165\002\228\b\225\002>\003y\b\227\002B\002d\b\232\b\244\003}\000\196\000\246\t\219\t\241\002%\003r\0046\001K\000\255\001\000\t\031\t\219\001L\003x\003~\t\223\003\151\003\153\t\220\t\224\000\183\004\136\t\226\n\140\n\141\t\231\002>\t\220\t \002B\002d\003\127\004\141\006\229\003\190\004\142\004Y\002B\t\233\t\252\n\005\004Z\001)\000\149\t\221\t\021\007z\003~\004\156\000\182\002\158\004\\\000f\t\240\003\157\n\138\t\234\003\166\002>\t\222\002B\002B\002d\000\157\003\127\011\020\002\138\003f\t\241\t\242\000\255\t\223\002e\003a\n\134\t\224\003\149\004\158\t\226\002\139\t\223\t\231\002B\003y\t\224\003_\000|\t\226\011!\003}\t\231\000\246\007a\n\139\t\233\000{\000\162\004\141\n\152\002h\004\142\t\011\t\012\t\233\t\213\003\184\004Z\003\185\003\186\002\127\t\004\003\187\t\234\004\156\006\233\002\158\004\\\b\018\0047\t\028\002B\t\234\000z\t\021\007z\004]\t\214\t\235\000\196\003\167\t\216\001\025\003e\003r\004c\001\029\001\030\003~\000\183\000\246\t\217\t\236\004\158\0049\005J\003a\000>\011\021\003\146\000\218\000\131\002\156\003\144\002}\003\127\003y\002~\002\127\002\157\002\128\002\158\003}\006\182\000\246\001]\n\t\n\n\004x\003B\t\213\003\184\000\183\003\185\003\186\002\127\t\218\003\187\n\011\n\012\nX\002\129\002\162\005E\002\131\002\132\002\137\011U\n\r\007z\003D\004]\t\214\t\235\002t\000\142\t\216\b\021\001\029\002\158\004c\005\160\000\246\001\023\000\255\001\000\t\217\t\236\001\024\002>\003~\004\007\002B\002d\t\219\002\163\005N\004\n\000\254\000\255\001\000\003\164\003\144\001\001\004\136\n\140\n\141\003\127\011V\002\166\t\220\002\164\003\234\004x\003\242\t\011\t\012\003\190\003y\004Y\002B\t\218\007B\000\145\003}\t\244\000\246\t\021\007z\003a\006\229\003G\003\145\t\020\007[\004\007\t\240\t\021\007z\003y\tU\004\n\005F\007l\000\156\003}\003\243\000\246\000\254\000\255\001\000\t\241\002\167\001\001\006\"\004\007\n\178\002B\002d\t\219\tm\004\n\t\230\t\223\007B\002\139\000\165\t\224\002B\004\136\t\226\003\132\003~\t\231\002B\t\220\007S\007U\007W\000\164\004\141\000\186\003\190\004\142\004Y\002B\t\233\t\213\003\184\004Z\003\185\003\186\002\127\003~\003\187\006-\004\156\003\247\002\158\004\\\n\026\t\240\006\185\002\169\t\234\011t\011u\001\025\004]\011w\003\127\001\029\001\030\t\216\000\200\000\246\t\241\004c\007V\007U\007W\002(\001\025\t\217\011y\004\158\001\029\001\030\t\223\000\255\000\246\003L\t\224\t\253\006\191\t\226\b\165\002\156\t\231\003a\003\165\000\183\003b\0008\002\185\004\141\002\158\004\012\004\142\003y\004x\t\233\n\194\004\n\004Z\003}\002>\000\246\t\218\002B\002C\004\156\003\134\002\158\004\\\003\137\000\239\001]\b\161\t\234\000\246\003\239\001\025\000\246\000\246\000\249\001\029\001\030\t\213\003\184\000\246\003\185\003\186\002\127\011\136\003\187\000\216\b\163\006\173\t\146\004\158\002>\007\132\001-\002B\002d\t\219\011\128\007r\004]\011\129\000\223\005\160\003~\t\216\002\253\004\136\001]\004c\b\164\011M\003\241\t\220\004\155\t\217\011\137\006\241\002\127\003\153\003\190\003\127\004Y\002B\007u\001\233\n\t\n\n\011I\t\148\001K\000\255\001\000\002h\t\177\001L\011|\002}\n\011\n\012\002~\002\127\004x\002\128\001-\000\232\t\149\006\205\n\r\007z\t\218\t\151\001\022\002t\t\241\t\167\011N\001\029\000\235\003\166\003\153\000\246\002B\000\239\002\129\002\130\t\223\002\131\002\132\002\137\t\224\000\246\000\249\t\226\n\249\011J\t\231\003u\002B\000\253\000\254\000\255\001\000\004\141\n\153\001\001\004\142\003y\t\219\t\233\005\136\002\127\004Z\003}\006\185\000\246\006\179\003\168\004\136\004\156\003\166\002\158\004\\\002B\t\220\000\255\001]\t\234\004\155\002s\004\019\003\190\002\166\004Y\002B\007d\t\213\003\184\001\194\003\185\003\186\002\127\n\139\003\187\005\138\002\127\011\141\000\196\004\158\006\219\000\255\003\167\bZ\003a\002y\000\179\003w\004]\t\214\n\028\001]\003~\t\216\003y\004 \t\241\004c\b\249\001J\003}\002+\000\246\t\217\t\236\001\025\002\138\000\255\t\223\001\029\001\030\n\023\t\224\000\246\t\153\t\226\b[\002>\t\231\002\139\002B\002C\002B\003\167\bF\004\141\b\018\002B\004\142\002B\004x\t\233\t\213\003\184\004Z\003\185\003\186\002\127\t\218\003\187\001\n\004\156\002>\002\158\004\\\002B\002C\0008\003~\t\234\t\146\011\128\001]\004]\011\129\001\025\0042\006\185\t\216\001\029\001\030\000\183\004c\000\246\007\016\003\127\nf\000\196\t\217\011\132\004\158\004\155\b^\000\255\b\242\t\146\t\219\n\149\003a\002t\t\187\003\129\b\018\001\029\001\t\002B\004\136\000\246\003y\t\148\001\b\002\156\t\220\001]\003}\004x\000\246\005S\002\157\003\190\002\158\004Y\002B\t\218\002t\n\003\t\149\002\158\001\029\006\198\001\r\t\151\000\246\t\190\t\148\t\158\002}\000\184\t\240\002~\002\127\003\184\002\128\003\185\003\186\002\127\001-\003\187\001e\000\149\002t\t\149\t\192\t\241\001\029\000\182\t\151\006\127\000\246\006\185\t\155\t\219\003~\002\129\002\162\t\223\002\131\002\132\002\137\t\224\006\226\004\136\t\226\004\155\000\187\t\231\nb\t\220\006\234\003\127\t\193\n\015\004\141\002\158\003\190\004\142\004Y\002B\t\233\t\213\003\184\004Z\003\185\003\186\002\127\000\239\003\187\002\163\004\156\011\135\002\158\004\\\007\029\000\246\000\249\005\228\t\234\006\247\002B\002d\004]\t\214\000\183\002\164\004\r\t\216\002t\001$\t\241\004c\001\029\001j\000\149\007B\000\246\t\217\t\246\004\158\000\182\003\184\t\223\003\185\003\186\002\127\t\224\003\187\000\198\t\226\b\132\005\160\t\231\002B\000q\006\185\t\181\007B\006\004\004\141\004\021\000\183\004\142\001]\004x\t\233\002\167\005[\004Z\004\155\007\156\003\189\t\218\000\201\006\129\004\156\005\160\002\158\004\\\002\139\001'\003\153\002B\t\234\006\238\004\166\004Y\002B\002d\b\253\007U\007W\b\137\000\254\000\255\001\000\004\001\000\149\001\001\007B\006\185\001\002\000\196\000\182\004\158\b\215\b\235\003r\001\017\007\154\t\219\t\017\007U\007W\000\254\000\255\001\000\002\169\003\154\001\001\004\136\003\166\001\002\000\183\002B\006\229\t\220\003a\003a\001\017\003\131\003\161\005\162\003\190\006\181\004Y\002B\003y\003y\b\216\t\"\b\217\005\160\003}\003}\000\246\000\246\005\160\000\183\000\183\t\004\002\156\t\249\t\025\007U\007W\004Z\n\027\002\185\003\189\002\158\004\005\000\149\004[\000\224\002\158\004\\\t\241\000\182\011E\001\210\006\213\003\190\006\185\004Y\002B\b\218\001\015\002>\t\223\007B\002B\002C\t\224\007\n\t\153\t\226\004\155\005\160\t\231\0008\003~\003~\003\167\n\129\n\007\004\141\001 \001\015\004\142\007=\007z\t\233\004,\000\149\004Z\001\208\n\b\003\127\003\127\000\182\t\146\004\156\b\219\002\158\004\\\011F\001\025\001 \005\160\t\234\001\029\001\030\b@\000\246\000\246\007j\000\149\005\161\b\220\b\221\n\019\b\222\000\182\n|\007U\007W\t\194\001\025\000\183\007\022\004\158\001\029\001\030\004Z\000\183\000\246\000\254\000\255\001\000\t\148\004[\001\001\002\158\004\\\001\002\000\239\t#\000\254\000\255\001\000\005E\001\017\001\001\000\246\000\249\001\002\t\149\006\185\br\t\190\003\153\t\151\001\017\t\011\t\012\t\152\b!\001,\007\250\000\149\000\183\004\155\b\224\0070\000\246\000\182\b\225\001-\t\192\b\227\t\r\t\029\b\232\b\244\001U\t\021\007z\000\196\001,\b\150\003x\b\247\003r\t\004\0012\t\031\b\242\003\199\001-\005\160\003\166\t$\003\153\002B\t\004\003a\t\193\001D\003\202\000\254\000\255\001\000\001^\t \001\001\003y\b\141\001\002\001]\006\185\001\015\003}\005m\000\246\001\017\n:\007\147\001T\001D\006\230\b\142\001\015\006\185\001^\b\149\0073\001]\t\007\000\239\007\"\001 \000\239\003\166\005\160\b%\002B\000\246\000\249\n\131\000\246\000\249\001 \000\246\003\184\0018\003\185\003\186\002\127\t\190\003\187\001\025\001<\005\160\0074\001\029\001\030\t\004\b\144\000\246\003~\001]\001\025\003\167\004]\005\145\001\029\001\030\t\192\b\146\000\246\b\167\002B\004c\005\160\003a\007\240\003\127\007-\006\185\007\166\b\000\002\127\001\246\001\015\003y\002\021\000\254\000\255\001\000\002\030\003}\001\001\000\246\002>\001\002\t\193\002B\002C\002 \b\141\n\146\001\017\b\141\001 \003\167\004x\002>\t\011\t\012\002B\002C\001,\001?\b\142\b\175\0073\b\142\b\143\t\011\t\012\b\148\001-\001,\001\025\t\r\t\029\t\146\001\029\001\030\t\021\007z\000\246\001-\b\231\002#\t\r\t\029\0023\003~\t\146\t\021\007z\0028\t\004\002<\000\254\000\255\001\000\b\144\000q\001\001\001D\002I\001\134\007\128\003\127\001^\000\183\005\160\007\227\000\183\004\136\001D\002o\000\183\t\148\002\161\001^\003S\003U\001\015\b\015\007z\000\183\003\190\006\185\004Y\002B\t\148\001C\t\011\t\012\t\149\003a\001,\tB\007\164\t\151\003\153\005\160\001 \t\162\b\144\003y\001-\t\149\001X\t\r\t\029\003}\t\151\000\246\t\021\007z\t\180\005\160\bR\007z\004\138\000\183\001\025\003x\000\183\003^\001\029\001\030\001\\\000\183\000\246\000\183\001a\0073\001h\003\179\001D\007*\003\182\000\183\003\166\001^\003\184\002B\003\185\003\186\002\127\0008\003\187\004\141\000\183\007\222\004\142\000\183\003\198\000\183\000\183\007\232\004Z\003~\002}\001\150\004]\005K\002\127\004\156\002\128\002\158\004\\\003\221\003\224\004c\000\254\000\255\001\000\003\230\003\127\001\001\006p\t\011\t\012\001\025\007\228\001,\007\237\001\029\001\030\005h\002\162\000\246\002\131\002\132\002\137\001-\004\158\004@\n\127\n\128\007\233\004Q\000\183\t\021\007z\002}\004x\001q\002~\002\127\000\239\002\128\000\183\005\160\003\167\000\183\004W\004`\000\246\000\249\005^\0073\003\t\tF\003a\001D\bN\007\185\003\153\005d\001^\000\183\002\129\0045\003y\002\131\002\132\002\137\005s\003\015\003}\b4\000\246\001~\005\160\004t\000\183\000\183\0073\000\246\000q\004\132\000\183\005\160\001-\002}\004\146\004\152\002~\002\127\004\161\002\128\004\136\0046\003\153\007/\001y\004\172\003\166\004\178\005\148\002B\000\183\0111\005\137\003\190\000\183\004Y\002B\005\154\002\167\b\141\002\129\0045\001D\002\131\002\132\002\137\003~\bL\005\160\000\183\000\183\002\139\007\238\b\142\002B\t\136\001\025\b\174\002B\007\160\001\029\001\030\003\166\003\127\000\246\002B\001}\004\138\004\184\t\001\007z\0046\000\254\000\255\001\000\005\160\002}\001\001\000\183\005K\002\127\002\138\002\128\b\n\000\183\003\153\005\158\005\159\003\016\000\183\000\183\005\160\b\023\000\183\002\139\001\129\004\141\002B\003\167\004\142\000\183\001\133\000\183\005h\002\162\004Z\002\131\002\132\002\137\004\190\001\142\004\196\004\156\007\246\002\158\004\\\t\160\004\202\001\137\002B\n\001\007z\007\212\002\156\001\141\003\166\001\145\001-\002B\b\026\002\185\002\138\002\158\0047\003\167\n\144\003\t\000\254\000\255\001\000\001\149\004\158\001\001\000\183\002\139\b\190\001\163\002B\001\158\000\254\000\255\001\000\005s\003\015\001\001\001\162\b\"\001H\005D\005J\003a\004\208\004\214\007\189\003a\004\220\002\156\007\192\005\160\001\166\003y\004\226\b&\002\157\003y\002\158\003}\004\232\000\246\001\170\003}\004\238\000\246\0047\000\183\007[\000\183\002}\005\137\001\179\005K\002\127\000\183\002\128\002\167\003\153\001\025\003\167\005e\002}\001\029\001\030\005K\002\127\000\246\002\128\0008\002\139\005D\005J\002B\b\242\001\174\0112\005h\002\162\002\156\002\131\002\132\002\137\004\244\b\192\001\178\002\157\003~\002\158\005h\002\162\003~\002\131\002\132\002\137\t\229\004\250\005\160\003\166\000\183\000\183\002B\005\000\000\183\003\127\005\158\007\127\003\016\003\127\000\183\003\t\005\155\b5\005\006\003\184\000\183\003\185\003\186\002\127\000\183\003\187\001\182\003\t\005\012\b\195\001\186\005s\003\015\001\029\001\030\001-\001\189\000\246\000\249\004]\005\018\001\025\001\193\005s\003\015\001\029\001\030\002\156\004c\000\246\001\204\005\024\001\225\005\030\002\185\011A\002\158\005$\003\184\001\239\003\185\003\186\002\127\000\183\003\187\001R\001\245\005\137\n9\000\254\000\255\001\000\0052\002\167\001\001\003\167\000\183\001p\004]\005\137\0058\004x\000\183\bG\005<\002\167\002\139\004c\005\174\002B\005\160\005\184\002>\000\183\nW\002B\002C\005\194\002\139\005\205\b\198\002B\002\020\000\183\005\160\011C\002\024\003\184\005\215\003\185\003\186\002\127\001-\003\187\b\142\000\183\b\203\007b\b\200\005\225\004x\005\158\t\131\003\016\005\237\t\146\000\183\004]\000\183\005\160\001D\005\247\000\183\005\158\t\165\003\016\004c\004\136\003a\002\"\006\001\007\199\007c\nS\002)\007\210\006\b\000\183\003y\0060\003\190\006@\004Y\002B\003}\000\183\000\246\0022\002\156\000\183\002;\005\160\006E\000\183\t\148\002\185\000\183\002\158\005\160\004x\002\156\bK\000\183\006L\000\183\002H\004\136\002\185\002k\002\158\t\128\t\149\006b\000\183\004\138\b}\t\151\006v\006{\003\190\t\199\004Y\002B\001\025\000\183\002\248\002n\001\029\001\030\000\183\006\135\000\246\003~\000\254\000\255\001\000\000\183\002\246\001\001\002\160\b\157\001\002\005\160\004\141\001\195\000\183\004\142\003a\001\017\003\127\007\203\000\183\004Z\004\138\000\183\004\136\000\183\003y\006\143\004\156\006\151\002\158\004\\\003}\006\158\000\246\001\196\000\183\003\190\006\164\004Y\002B\b\162\001\197\005\160\000\254\000\255\001\000\000\183\b\204\001\001\002\190\004\141\001\002\002\189\004\142\001\195\000\183\004\158\006\169\001\017\004Z\000\183\000\183\001-\002\219\003a\002\252\004\156\007\206\002\158\004\\\004\138\003\014\003C\000\183\003y\006\176\001\196\006\196\003E\003~\003}\006\211\000\246\001\216\003\184\001\015\003\185\003\186\002\127\003M\003\187\b\212\001D\006\252\007\b\004\158\003\127\007\130\007{\004\141\007 \000\183\004\142\000\183\004]\001 \003a\000\183\004Z\007\220\003R\001\201\000\183\004c\003X\004\156\003y\002\158\004\\\007\020\007\176\003\143\003}\b\226\000\246\001\025\007!\001\015\003~\001\029\001\030\003k\000\183\000\246\003m\007'\0077\003|\000\254\000\255\001\000\007O\003\141\001\001\004\158\003\127\004x\001 \003a\007Q\000\183\b-\000\183\001\201\007\003\007w\000\183\006\255\003y\003\184\007|\003\185\003\186\002\127\003}\003\187\000\246\001\025\000\183\000\183\003~\001\029\001\030\003a\007[\000\246\b9\007\139\007\145\004]\007\159\007\179\003a\003y\007\211\b?\001,\003\127\004c\003}\003\178\000\246\003y\003\181\000\183\007\173\001-\007\217\003}\001\211\000\246\000\183\004\136\003\184\007\224\003\185\003\186\002\127\007\230\003\187\000\183\000\183\003~\007\255\b\014\003\190\000\183\004Y\002B\003\197\b\022\004x\003\220\004]\000\183\b\025\001D\003\223\001,\003\127\000\183\001^\004c\b \b$\000\183\b*\003~\001-\007\142\b0\001\211\003\229\003\251\003\245\b<\003~\005\160\003\248\004\138\004.\004'\000\183\000\183\003\127\000\183\000\183\004*\004<\000\183\bQ\005\160\001\025\003\127\bV\004x\001\029\001\030\001D\004?\000\246\bc\000\183\001^\bi\bt\004F\004\136\004\141\000\183\b\127\004\142\b\145\000\183\005\160\b\131\005\160\004Z\000\183\000\183\003\190\004P\004Y\002B\004\156\000\183\002\158\004\\\b\152\002}\000\183\004V\0038\002\127\b\169\002\128\b\179\004_\000\183\000\183\004g\000\183\b\206\004s\b\229\000\183\b\234\000\254\000\255\001\000\000\183\004\136\001\001\004\158\004\138\001\004\002\129\003\207\b\240\002\131\002\132\002\137\001\190\001-\003\190\000\183\004Y\002B\007n\000\183\004}\003\184\t\t\003\185\003\186\002\127\000\183\003\187\003a\000\183\000\183\bI\b\246\004\141\004\131\000\183\004\142\000\183\003y\003\t\000\183\004]\004Z\007q\003}\t<\000\246\t_\004\138\004\156\004c\002\158\004\\\000\183\005\163\006f\003\015\007\129\t\003\000\183\t\023\000\183\003\184\t'\003\185\003\186\002\127\000\183\003\187\000\183\003\184\000\183\003\185\003\186\002\127\005\160\003\187\004\141\004\158\004\145\004\142\001\015\004]\004x\003a\005\160\004Z\b\230\t.\005\160\004]\004c\003~\004\156\003y\002\158\004\\\002\167\007\031\004c\003}\001\191\000\246\005\160\t2\004\151\006\244\000\183\tO\003\127\002\139\004\160\004\171\002B\003\184\tw\003\185\003\186\002\127\005\160\003\187\001\025\004\158\t\179\004x\001\029\001\030\t|\005\160\000\246\t\163\t\129\004x\000\183\004]\000\183\t\159\t\135\000\183\004\136\006i\006n\t\143\004c\t\184\005\160\t\205\003\016\003~\005\160\006e\004\177\003\190\t\228\004Y\002B\ty\004\183\003\184\004\189\003\185\003\186\002\127\000\183\003\187\003\127\t\132\004\195\n\004\n\016\t\166\005\160\005\160\004\201\005\160\004\207\004x\005\160\004]\000\183\004\136\004\213\002\156\000\183\t\178\005\160\004\138\004c\004\136\002\185\000\183\002\158\001-\003\190\006<\004Y\002B\005\160\000\183\004\219\t\182\003\190\000\183\004Y\002B\000\183\000\183\004\225\004\231\t\186\002}\000\183\000\183\002~\002\127\004\141\002\128\000\183\004\142\000\183\004x\000\183\001D\004\237\004Z\005\160\t\191\004\138\000\183\nA\t\203\004\156\004\136\002\158\004\\\004\138\004\243\002\129\002\162\nP\002\131\002\132\002\137\000\183\000\183\003\190\n]\004Y\002B\000\254\000\255\001\000\t\210\t\225\001\001\t\237\004\141\b\190\t\247\004\142\004\158\004\249\006;\004\255\004\141\004Z\n\022\004\142\n_\005\160\005\160\002\163\004\156\004Z\002\158\004\\\004\136\005\005\n\133\004\138\004\156\005\160\002\158\004\\\005\011\005\017\005\160\002\164\003\226\003\190\005\023\004Y\002B\005\029\005#\005+\003\184\0051\003\185\003\186\002\127\004\158\003\187\0057\000\183\005?\n\148\005a\004\141\004\158\005p\004\142\005\151\005\173\000\183\005\183\004]\004Z\005\193\005\204\005\214\000\183\005\224\004\138\004\156\004c\002\158\004\\\002\167\005\236\005\246\006\000\0064\b\192\006\007\006\020\003\184\006/\003\185\003\186\002\127\002\139\003\187\000\183\002B\006?\006D\006K\006[\006a\011\022\011z\004\141\004\158\004b\004\142\004]\006u\004x\006z\002}\004Z\011\133\002~\002\127\004c\002\128\011\138\004\156\006\134\002\158\004\\\006\142\b\195\006\150\006\157\006\163\001\029\001\030\002\169\006\166\000\246\000\249\006\168\006\175\006\184\006\195\002\129\002\162\006\210\002\131\002\132\002\137\006\222\006\231\006\251\007\001\004\158\004x\007\007\007\019\007&\007(\0076\007v\007N\007M\007L\007h\007~\007\133\007\138\007\144\002\156\004\136\007\158\007\169\007\171\007\178\007\223\002\185\002\163\002\158\007\216\007\218\007\221\007\236\003\190\007\226\004Y\002B\007\235\007\231\007\234\007\254\b\t\b\b\002\164\004\026\b\r\b\024\b#\b\031\b/\b\198\b)\b+\bC\b7\bB\b=\bA\bP\b\178\004\136\bU\bX\b_\b\142\bg\b\202\004\138\b\200\bn\by\b\177\000q\003\190\b\170\004Y\002B\b\171\004\"\b\176\001D\b\180\b\181\b\214\002\167\b\207\b\208\b\213\b\228\b\243\b\238\b\239\b\241\t\030\t\002\t\006\004\141\002\139\t\b\004\142\002B\t\n\t\022\t&\t(\004Z\t)\004\138\t/\t4\t8\tJ\004\156\tQ\002\158\004\\\002}\t\130\t\154\002~\002\127\t\164\002\128\t\212\t\206\t\207\t\211\t\227\003\184\t\232\003\185\003\186\002\127\t\255\003\187\002\169\005H\n\020\n\021\004\142\0063\004\158\n\025\002\129\002\162\004Z\002\131\002\132\002\137\n@\nI\nO\004\156\ns\002\158\004\\\nn\006\011\nr\003\184\nv\003\185\003\186\002\127\nz\003\187\n\132\n\136\004A\002\156\n\147\n\151\n\170\n\165\n\169\n\173\002\185\002\163\002\158\004]\003\184\004\158\003\185\003\186\002\127\n\177\003\187\n\186\004c\n\181\n\185\n\189\n\193\002\164\003\226\006\026\n\207\n\202\n\206\n\210\004]\n\214\003\184\n\223\003\185\003\186\002\127\n\218\003\187\004c\n\222\n\226\n\230\n\241\n\236\n\240\006\017\n\244\n\248\011\003\n\254\004x\004]\011\002\011\006\011\n\002}\011\r\011\018\002~\002\127\004c\002\128\011d\002\167\011l\000\000\000\000\006\016\000\000\000\000\000\000\004x\000\000\000\000\000\000\003\189\002\139\000\000\000\000\002B\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\003\190\004b\004Y\002B\000\000\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\136\004a\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\002\163\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\004\136\006\r\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\002\156\004\136\000\000\000\000\000\000\004\138\000\000\002\185\000\000\002\158\000\000\000\000\004Z\000\000\003\190\000\000\004Y\002B\000\000\004[\000\000\002\158\004\\\000\000\000\000\002\167\004\138\000\000\000\000\002}\000\000\000\000\002~\002\127\004\141\002\128\000\000\004\142\002\139\000\000\000\000\002B\000\000\004Z\000\000\000\000\000\000\000\000\004\138\000\000\004\156\004b\002\158\004\\\000\000\004\141\002\129\002\162\004\142\002\131\002\132\002\137\000\000\003\184\004Z\003\185\003\186\002\127\000\000\003\187\000\000\004\156\000\000\002\158\004\\\000\000\002\169\004\141\000\000\004\158\004\142\004u\000\000\004]\000\000\000\000\004Z\000\000\000\000\000\000\002\163\000\000\004c\004\156\000\000\002\158\004\\\000\000\000\000\004\140\004\158\000\000\000\000\000\000\000\000\000\000\002\164\003\226\000\000\002}\002\156\000\000\002~\002\127\000\000\002\128\000\000\002\185\000\000\002\158\000\000\000\000\004\158\000\000\002}\004x\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\002\167\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002\139\004\133\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\002\163\000\000\000\000\004b\000\000\000\000\004\147\000\000\000\000\000\000\000\000\004\136\000\000\000\000\000\000\002\163\002\164\003\226\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\002\169\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\002\167\004\138\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\139\002\158\002\167\002B\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\004b\000\000\002\139\000\000\004\141\002B\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\000\000\004b\000\000\000\000\004\153\000\000\004\156\000\000\002\158\004\\\000\000\002\169\002}\002\163\000\000\002~\002\127\003\184\002\128\003\185\003\186\002\127\000\000\003\187\000\000\000\000\002\169\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\004\158\000\000\004]\000\000\002\129\002\162\000\000\002\131\002\132\002\137\002\156\004c\000\000\000\000\000\000\000\000\000\000\002\185\004\168\002\158\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\004\162\000\000\000\000\002\185\000\000\002\158\002\167\000\000\003\184\002\163\003\185\003\186\002\127\000\000\003\187\004x\000\000\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\004]\000\000\000\000\000\000\004b\000\000\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\004\167\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\0015\002\169\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\002\167\000\000\000\000\000\000\004x\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\002\156\004b\001M\000\000\000\000\000\000\000\000\002\185\000\000\002\158\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\169\004\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\136\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\004\141\000\000\000\000\004\142\002\156\000\000\004\173\000\000\000\000\004Z\000\000\002\185\000\000\002\158\000\000\002\163\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\000\000\001\025\004\138\000\000\000\000\001\029\001\030\002\164\003\226\000\246\000\000\001\025\000\000\000\000\002}\001\029\001\030\002~\002\127\000\246\002\128\004\158\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\004\141\002\128\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\002\129\002\162\000\000\002\131\002\132\002\137\004\156\002\167\002\158\004\\\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\004\179\000\000\000\000\000\000\000\000\000\000\001-\000\000\004b\002\163\004\158\000\000\004\185\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\002\163\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\001D\002\164\003\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001S\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\167\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\002\167\002\139\002\129\002\162\002B\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\002\139\004b\000\000\002B\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004b\004\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\163\002}\000\000\002\169\002~\002\127\000\000\002\128\000\000\000\000\006\226\000\000\000\000\000\000\000\000\002\169\002\164\003\226\006\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\006\235\000\000\002\156\000\000\000\000\000\000\004\197\000\000\000\000\002\185\002\167\002\158\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\004b\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\002}\003\189\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\002\169\000\000\000\000\000\000\006\238\004\203\004Y\002B\002d\000\000\000\000\002\167\000\000\000\000\002\163\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\002\156\000\000\000\000\004b\000\000\000\000\000\000\002\185\004\209\002\158\000\000\006\229\000\000\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\002\167\000\000\000\000\000\000\000\000\004Z\002\129\002\162\000\000\002\131\002\132\002\137\004[\002\139\002\158\004\\\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\000\000\004\215\002\185\000\000\002\158\000\000\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\002\169\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\002\156\000\000\000\000\002\169\000\000\000\000\004\221\002\185\000\000\002\158\000\000\000\000\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\004\227\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\004\233\000\000\002\185\000\000\002\158\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\004\239\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\004\245\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\004\251\000\000\002\185\000\000\002\158\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\005\001\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\005\007\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\005\r\000\000\002\185\000\000\002\158\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\005\019\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\005\025\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\005\031\000\000\002\185\000\000\002\158\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\005%\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\0053\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\003\184\002\128\003\185\003\186\002\127\000\000\003\187\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\004]\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\004c\002\139\000\000\000\000\002B\000\000\003\184\005B\003\185\003\186\002\127\000\000\003\187\002\156\004b\000\000\000\000\000\000\0059\000\000\002\185\000\000\002\158\000\000\002\167\000\000\004]\002\163\003\184\000\000\003\185\003\186\002\127\004x\003\187\004c\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\004]\000\000\004b\000\000\000\000\000\000\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\005R\000\000\000\000\000\000\004x\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\000\000\000\000\004\136\004x\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\000\000\000\000\000\000\000\000\004\136\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\002\169\004\138\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\004\136\000\000\004]\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\004c\000\000\003\190\000\000\004Y\002B\000\000\005U\004\141\000\000\000\000\004\142\002\156\004]\004\138\000\000\000\000\004Z\000\000\002\185\000\000\002\158\004c\000\000\004\156\000\000\002\158\004\\\003\184\005Z\003\185\003\186\002\127\004x\003\187\000\000\004\138\000\000\000\000\000\000\000\000\000\000\000\000\005H\000\000\000\000\004\142\005I\004]\000\000\000\000\000\000\004Z\004\158\000\000\004x\000\000\004c\000\000\004\156\000\000\002\158\004\\\000\000\005]\004\141\000\000\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\004\158\004\136\004x\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\004\158\004\136\000\000\004]\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\004c\000\000\003\190\000\000\004Y\002B\000\000\005`\000\000\000\000\000\000\000\000\000\000\004]\004\138\003\184\000\000\003\185\003\186\002\127\000\000\003\187\004c\000\000\004\136\000\000\000\000\000\000\000\000\005c\000\000\000\000\000\000\004x\000\000\004]\004\138\003\190\000\000\004Y\002B\000\000\000\000\004\141\004c\000\000\004\142\000\000\000\000\000\000\000\000\005g\004Z\000\000\000\000\004x\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\004\138\000\000\000\000\004Z\000\000\000\000\004x\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\004\158\004\136\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\004\141\000\000\003\190\004\142\004Y\002B\000\000\000\000\000\000\004Z\004\158\004\136\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\004\136\000\000\003\184\004\138\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\004\158\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\004]\000\000\003\184\004\138\003\185\003\186\002\127\000\000\003\187\004c\004\141\000\000\000\000\004\142\000\000\000\000\005l\000\000\000\000\004Z\000\000\000\000\004]\000\000\000\000\004\138\004\156\000\000\002\158\004\\\000\000\004c\004\141\000\000\000\000\004\142\000\000\000\000\005o\000\000\000\000\004Z\004x\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004\141\004\158\000\000\004\142\000\000\000\000\000\000\001\025\000\000\004Z\004x\001\029\001\030\000\000\000\000\000\246\004\156\000\000\002\158\004\\\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004\136\004\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\004c\000\000\004\136\000\000\000\000\000\000\003\184\005r\003\185\003\186\002\127\000\000\003\187\000\000\001-\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\004\138\003\184\000\000\003\185\003\186\002\127\004x\003\187\004c\000\000\000\000\000\000\000\000\000\000\000\000\005u\000\000\001Q\000\000\000\000\000\000\004]\004\138\000\000\000\000\000\000\000\000\000\000\000\000\004\141\004c\000\000\004\142\000\000\000\000\000\000\000\000\005\144\004Z\000\000\000\000\004x\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\000\000\004\136\004x\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\004\158\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\004\158\004\136\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001;\004]\004\138\003\190\000\000\004Y\002B\000\000\000\000\000\000\004c\000\000\004\136\000\000\000\000\000\000\003\184\005\147\003\185\003\186\002\127\000\000\003\187\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\004\141\000\000\000\000\004\142\000\000\004]\004\138\000\000\000\000\004Z\000\000\000\000\004x\000\000\004c\000\000\004\156\000\000\002\158\004\\\000\000\005\150\000\000\000\000\000\000\000\000\000\000\000\000\004\138\000\000\000\000\000\000\000\000\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\004\158\000\000\004x\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\000\000\004\136\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\004\158\003\190\000\000\004Y\002B\001\025\000\000\000\000\000\000\001\029\001\030\000\000\003\184\000\246\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\004\158\004\136\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\004]\000\000\000\000\004\138\003\190\000\000\004Y\002B\000\000\004c\000\000\000\000\004]\000\000\000\000\000\000\005\153\000\000\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\005\157\000\000\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\004\138\000\000\000\000\004Z\004x\000\000\001-\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\141\000\000\002}\004\142\000\000\002~\002\127\001D\002\128\004Z\004\158\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\004\136\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\136\003\190\004\158\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\005\175\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\002\163\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\004\138\002\164\003\226\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\004\138\003\187\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\004\141\000\000\000\000\004\142\000\000\000\000\000\000\004c\000\000\004Z\000\000\005\185\004\141\002\167\005\199\004\142\004\156\000\000\002\158\004\\\002\163\004Z\000\000\000\000\000\000\000\000\002\139\000\000\004\156\002B\002\158\004\\\000\000\000\000\000\000\000\000\002\164\003\226\000\000\004b\004x\000\000\000\000\002}\000\000\004\158\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\002}\000\000\004\158\002~\002\127\000\000\002\128\000\000\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\002\167\000\000\007\136\000\000\000\000\002\129\0045\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\005\195\004\136\000\000\002\156\000\000\000\000\000\000\000\000\004b\002\163\002\185\000\000\002\158\000\000\003\190\000\000\004Y\002B\0046\000\000\000\000\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\004\138\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\004c\000\000\002\167\002\156\000\000\000\000\000\000\005\209\000\000\000\000\002\185\000\000\002\158\004\141\002\138\002\139\004\142\000\000\002B\000\000\002\129\002\162\004Z\002\131\002\132\002\137\000\000\002\139\004b\004\156\002B\002\158\004\\\004x\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\005\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\163\000\000\004]\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\004c\0047\000\000\000\000\000\000\002\164\003\226\005\219\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\002\156\002\128\004\136\000\000\005D\005J\000\000\002\185\000\000\002\158\000\000\004x\002\156\000\000\000\000\003\190\000\000\004Y\002B\002\157\000\000\002\158\002\129\002\162\002\167\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\005\216\000\000\004\138\004b\000\000\000\000\000\000\000\000\000\000\002\163\000\000\002}\b\215\000\000\002~\002\127\000\000\002\128\000\000\000\000\004\136\000\000\000\000\000\000\000\000\002\164\003\226\000\000\002\169\000\000\000\000\004\141\000\000\003\190\004\142\004Y\002B\000\000\002\129\002\162\004Z\002\131\002\132\002\137\000\000\000\000\b\216\004\156\b\217\002\158\004\\\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\002\156\005\226\000\000\000\000\002\167\004\138\000\000\002\185\000\000\002\158\002\163\000\000\000\000\000\000\004\158\000\000\000\000\002\139\000\000\000\000\002B\b\218\006\011\000\000\000\000\000\000\002\164\003\226\000\000\002}\004b\000\000\002~\002\127\004\141\002\128\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\000\000\006\012\000\000\004\156\000\000\002\158\004\\\000\000\002\169\002\129\002\162\b\219\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\000\000\000\000\b\220\b\221\000\000\b\222\000\000\004\158\002\139\005\238\000\000\002B\000\000\000\000\000\000\000\000\000\000\002\156\002\163\000\000\000\000\004b\000\000\000\000\002\185\000\000\002\158\000\000\000\000\000\000\b\223\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\003\189\000\000\002}\000\000\000\000\002~\002\127\002\169\002\128\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\b\224\000\000\000\000\000\000\b\225\000\000\000\000\b\227\000\000\000\000\b\232\b\244\002\129\002\162\000\000\002\131\002\132\002\137\000\000\002\167\000\000\000\000\002}\t\031\002\156\002~\002\127\000\000\002\128\000\000\000\000\002\185\002\139\002\158\000\000\002B\006\014\005\248\000\000\000\000\000\000\t \000\000\000\000\000\000\004b\002\163\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\t\213\000\000\002\164\003\226\000\000\000\000\000\000\000\000\004Z\000\000\002\169\000\000\000\000\000\000\006\002\004[\000\000\002\158\004\\\011\128\000\000\000\000\011\129\002\163\000\000\000\000\t\216\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\t\217\000\000\000\000\002\164\003\226\000\000\000\000\002\167\002\156\000\000\002}\000\000\004]\002~\002\127\002\185\002\128\002\158\000\000\000\000\002\139\004c\000\000\002B\000\000\000\000\000\000\000\000\006\021\000\000\000\000\000\000\000\000\004b\000\000\t\218\000\000\002\129\002\162\000\000\002\131\002\132\002\137\003\184\002\167\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\004x\000\000\000\000\002\139\002\169\000\000\002B\000\000\006\t\004]\000\000\000\000\000\000\000\000\000\000\000\000\004b\002\163\004c\t\219\000\000\000\000\000\000\000\000\003\184\006\023\003\185\003\186\002\127\000\000\003\187\000\000\000\000\002\164\003\226\t\220\000\000\000\000\002\156\000\000\000\000\002\169\000\000\000\000\004]\002\185\000\000\002\158\000\000\000\000\000\000\004x\000\000\004c\000\000\000\000\004\136\011\131\000\000\000\000\006\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\002\167\002\156\t\222\003\184\000\000\003\185\003\186\002\127\002\185\003\187\002\158\000\000\004x\002\139\t\223\000\000\002B\000\000\t\224\000\000\000\000\t\226\000\000\004]\t\231\000\000\004b\000\000\000\000\004\138\000\000\000\000\004c\004\136\000\000\000\000\000\000\t\233\000\000\006 \000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\002\169\000\000\000\000\000\000\t\234\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\000\000\004x\000\000\004Z\004\136\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004\138\003\190\000\000\004Y\002B\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\003\184\002\158\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\004\158\003\184\000\000\003\185\003\186\002\127\004\141\003\187\000\000\004\142\004]\000\000\004\138\000\000\000\000\004Z\000\000\000\000\004\136\004c\000\000\004]\004\156\000\000\002\158\004\\\0066\000\000\000\000\000\000\004c\003\190\000\000\004Y\002B\000\000\000\000\0069\000\000\002}\000\000\004\141\002~\002\127\004\142\002\128\000\000\000\000\000\000\000\000\004Z\004\158\004x\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004x\000\000\004\138\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\0061\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\002\163\000\000\000\000\004Z\000\000\000\000\000\000\000\000\004\136\000\000\004\156\000\000\002\158\004\\\000\000\000\000\002\164\003\226\000\000\004\136\000\000\003\190\000\000\004Y\002B\000\000\000\254\000\255\001\000\000\000\000\000\001\001\003\190\000\000\004Y\002B\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\004\138\000\000\002\167\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\004\138\000\000\000\000\000\000\002\139\002\129\002\162\002B\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\004b\004\141\002\129\002\162\004\142\002\131\002\132\002\137\000\000\000\000\004Z\000\000\004\141\006A\000\000\004\142\000\000\004\156\000\000\002\158\004\\\004Z\002\163\000\000\000\000\002\169\000\000\006F\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\002\163\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\004\158\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\001\025\002\158\000\000\002}\001\029\001\030\002~\002\127\000\246\002\128\000\000\na\002\167\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\002\139\002\167\000\000\002B\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\004b\002\139\000\000\000\000\002B\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\004b\000\000\000\000\006M\000\000\b\215\000\000\000\000\000\000\000\000\000\000\002\169\002\163\000\254\000\255\001\000\000\000\006c\001\001\001-\000\000\001B\000\000\000\000\000\000\002\169\002\163\000\000\002\164\003\226\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\b\216\011#\b\217\002\164\003\226\000\000\002\156\000\000\000\000\000\000\nb\000\000\004]\002\185\000\000\002\158\000\000\000\000\000\000\000\000\002\156\004c\000\000\000\000\000\000\000\000\000\000\002\185\006h\002\158\002\167\000\000\003\184\000\000\003\185\003\186\002\127\b\218\003\187\000\000\000\000\000\000\000\000\002\139\002\167\000\000\002B\000\000\000\254\000\255\001\000\000\000\004]\001\001\004x\000\000\004b\002\139\000\000\000\000\002B\004c\000\000\000\000\000\000\000\000\000\000\000\000\006k\002}\004b\000\000\002~\002\127\b\219\002\128\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\220\b\221\000\000\b\222\004x\002\169\002\129\002\162\001\025\002\131\002\132\002\137\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\004\136\000\000\000\000\000\000\000\000\002\156\000\000\000\000\t#\000\000\000\000\006w\002\185\003\190\002\158\004Y\002B\000\000\000\000\002\156\002\163\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\000\000\000\000\000\000\000\000\b\224\000\000\002\164\003\226\b\225\011%\004\136\b\227\000\000\000\000\b\232\b\244\000\000\004\138\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\t\031\000\000\001-\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\nd\000\000\t \004\141\002\167\002}\004\142\000\000\002~\002\127\000\000\002\128\004Z\000\000\004\138\000\000\001D\002\139\000\000\004\156\002B\002\158\004\\\000\254\000\255\001\000\000\000\000\000\001\001\000\000\004b\001[\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\004\141\002~\002\127\004\142\002\128\004\158\000\000\000\000\000\000\004Z\000\000\000\000\002\169\000\000\006|\000\000\004\156\001-\002\158\004\\\000\000\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\004\158\002\156\nb\000\000\000\000\006\136\000\000\000\000\002\185\000\000\002\158\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\004b\000\000\001\029\001\030\006\144\000\000\000\246\000\000\000\000\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\006\152\000\000\002\185\000\000\002\158\001-\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\001D\006\159\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\006\165\000\000\002\185\000\000\002\158\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\006\170\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\006\177\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\006\197\000\000\002\185\000\000\002\158\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\006\212\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\006\253\000\000\002\185\000\000\002\158\000\000\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\007\t\000\000\002\185\000\000\002\158\000\000\002\167\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\002\169\000\000\000\000\007\021\004]\002\185\000\000\002\158\000\000\002\167\000\000\000\000\002\163\004c\000\254\000\255\001\000\000\000\000\000\001\001\007$\000\000\002\139\000\000\000\000\002B\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\000\000\004x\000\000\000\000\n\233\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\002\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\167\003\184\004]\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\004c\000\000\002\139\000\000\000\000\002B\000\000\0072\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\000\000\000\000\006\011\000\000\002\185\004\136\002\158\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004x\000\000\003\190\000\000\004Y\002B\000\000\002\169\000\000\000\000\000\000\004]\t\150\000\000\000\000\002}\000\000\000\000\002~\002\127\004c\002\128\000\000\000\000\000\000\001\025\000\000\007y\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\004\138\000\000\000\000\000\000\000\000\002\156\002\129\002\162\000\000\002\131\002\132\002\137\002\185\000\000\002\158\000\000\000\000\004x\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\141\000\000\007\140\004\142\003\190\000\000\004Y\002B\000\000\004Z\003\189\002\163\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\003\190\000\000\004Y\002B\002\164\003\226\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\004\138\000\000\000\000\000\000\000\000\000\000\004\136\004\158\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001|\003\190\000\000\004Y\002B\001S\000\000\006\014\000\000\000\000\000\000\004\141\002\167\002}\004\142\000\000\002~\002\127\000\000\002\128\004Z\000\000\000\000\000\000\000\000\002\139\000\000\004\156\002B\002\158\004\\\000\000\000\000\000\000\000\000\004\138\000\000\000\000\004b\004Z\002\129\002\162\000\000\002\131\002\132\002\137\004[\000\000\002\158\004\\\000\000\000\000\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\002\169\004\141\007\146\000\000\004\142\000\000\000\000\000\000\000\000\000\000\004Z\002\163\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\002}\004\158\000\000\002~\002\127\000\000\002\128\000\000\001\025\000\000\000\000\000\000\001\029\001\030\002}\000\000\000\246\002~\002\127\000\000\002\128\000\000\000\000\002\167\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002\139\000\000\000\000\002B\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\004b\000\000\000\000\007\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\163\000\000\000\000\t\213\000\000\007\180\003\184\000\000\003\185\003\186\002\127\000\000\003\187\002\169\002\163\000\000\002\164\003\226\001-\000\000\000\000\000\000\011\128\000\000\000\000\011\129\004]\000\000\000\000\t\216\002\164\003\226\000\000\000\000\000\000\004c\000\000\000\000\000\000\t\217\000\000\000\000\007\244\000\000\000\000\000\000\000\000\002\156\001D\003\184\000\000\003\185\003\186\002\127\002\185\003\187\002\158\002\167\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\004x\004]\002\139\002\167\000\000\002B\t\218\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\004b\002\139\t7\000\000\002B\002\129\002\145\000\000\002\131\002\132\002\137\000\000\000\000\000\000\004b\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\002\169\000\000\001\002\004x\t\219\001\212\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\002\169\000\000\004\136\000\000\000\000\000\000\t\220\000\000\000\000\000\000\000\000\000\000\000\000\001\214\000\000\003\190\000\000\004Y\002B\b\135\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\011\130\002\158\000\000\000\000\000\000\000\000\002\156\000\000\003\184\000\000\003\185\003\186\002\127\002\185\003\187\002\158\000\000\004\136\000\000\t\222\000\000\004\138\000\000\000\000\000\000\000\000\000\000\000\000\004]\002\138\003\190\t\223\004Y\002B\000\000\t\224\001\015\004c\t\226\000\000\000\000\t\231\002\139\000\000\t:\002B\000\000\000\000\000\000\000\000\004\141\000\000\000\000\004\142\t\233\000\000\001 \000\000\000\000\004Z\000\000\000\000\001\201\000\000\004\138\000\000\004\156\000\000\002\158\004\\\004x\000\000\t\234\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\141\000\000\004\158\004\142\000\000\000\000\000\000\000\000\000\000\004Z\000\000\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\157\000\000\002\158\004]\003\184\004\136\003\185\003\186\002\127\000\000\003\187\000\000\004c\000\000\000\000\000\000\001,\004\158\003\190\tI\004Y\002B\000\000\000\000\004]\000\000\001-\000\000\000\000\b\189\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\tL\000\000\000\254\000\255\001\000\004x\000\000\001\001\000\000\000\000\001\132\000\000\004\138\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\004x\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\000\000\000\000\004]\004Z\000\000\000\000\000\000\000\000\000\000\000\000\004\156\004c\002\158\004\\\004\136\000\000\000\000\000\000\tY\000\000\000\000\000\000\000\000\t\213\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\003\184\004\136\003\185\003\186\002\127\004\158\003\187\000\000\000\000\000\000\004x\t\214\000\000\000\000\003\190\t\216\004Y\002B\000\000\000\000\004]\000\000\000\000\000\000\000\000\t\217\000\000\004\138\000\000\004c\000\000\000\000\000\000\000\000\000\000\003\184\t\\\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\001\025\000\000\000\000\004\138\001\029\001\030\000\000\000\000\000\246\000\000\004]\004\141\000\000\000\000\004\142\t\218\000\000\004x\000\000\004c\004Z\004\136\000\000\000\000\000\000\000\000\tq\004\156\000\000\002\158\004\\\000\000\004\141\000\000\003\190\004\142\004Y\002B\000\000\000\000\000\000\004Z\000\000\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004x\t\219\000\000\003\184\004\158\003\185\003\186\002\127\000\000\003\187\000\000\004]\000\000\000\000\000\000\000\000\004\138\t\220\000\000\001-\004c\004\136\000\000\004]\000\000\004\158\000\000\tt\000\000\000\000\000\000\000\000\004c\000\000\003\190\000\000\004Y\002B\000\000\tx\000\000\000\000\000\000\t\238\000\000\004\141\000\000\000\000\004\142\001D\000\000\000\000\000\000\004x\004Z\000\000\004\136\000\000\t\222\000\000\000\000\004\156\000\000\002\158\004\\\004x\000\000\000\000\004\138\003\190\t\223\004Y\002B\000\000\t\224\000\000\000\000\t\226\000\000\000\000\t\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\158\000\000\000\000\t\233\000\000\000\000\000\000\004\141\000\000\000\000\004\142\000\000\000\000\004\138\000\000\000\000\004Z\000\000\000\000\004\136\000\000\t\234\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\004\136\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\004\141\000\000\003\190\004\142\004Y\002B\000\000\000\000\000\000\004Z\004\158\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\004\138\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\004\138\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\004\158\001\140\000\000\000\000\000\000\000\000\000\000\000\000\004\141\002\129\002\162\004\142\002\131\002\132\002\137\000\000\000\000\004Z\000\000\000\000\004\141\000\000\000\000\004\142\004\156\000\000\002\158\004\\\000\000\004Z\000\000\000\000\000\000\000\000\nB\000\000\004\156\000\000\002\158\004\\\000\000\000\000\002}\002\163\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\002\164\003\226\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nQ\003\184\000\000\003\185\003\186\002\127\002\167\003\187\000\000\002\163\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\139\000\000\004]\002B\001\025\000\000\002\164\003\226\001\029\001\030\000\000\004c\000\246\004b\000\000\t\213\000\000\nV\011\026\000\000\000\000\000\000\000\000\000\000\000\000\003\184\002\163\003\185\003\186\002\127\000\000\003\187\000\000\000\000\011\128\000\000\000\000\011\129\002\169\000\000\000\000\t\216\002\164\003\226\004x\004]\000\000\002\167\000\000\000\000\000\000\t\217\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\002\139\011\028\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004b\000\000\001-\000\000\000\000\000\000\002\185\000\000\002\158\000\000\002\167\000\000\000\000\t\218\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\002\169\002B\004\136\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\004b\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\254\000\255\001\000\000\000\t\219\001\001\000\000\000\000\001\002\000\000\000\000\001\212\002\156\000\000\002\169\001\017\000\000\000\000\000\000\002\185\t\220\002\158\000\000\004\136\000\000\000\000\000\000\004\138\000\000\000\254\000\255\001\000\000\000\001\214\001\001\000\000\003\190\001\002\004Y\002B\001\195\000\000\011\134\000\000\001\017\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\004\141\002\158\000\000\004\142\002}\t\222\001\200\002~\002\127\004Z\002\128\000\000\000\000\000\000\004\138\000\000\004\156\t\223\002\158\004\\\000\000\t\224\000\000\000\000\t\226\000\000\000\000\t\231\001\015\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\t\233\000\000\000\000\004\141\000\000\004\158\004\142\000\000\001 \000\000\000\000\000\000\004Z\000\000\001\201\000\000\000\000\001\015\t\234\004\156\000\000\002\158\004\\\000\000\000\000\002\163\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\001 \000\000\000\000\000\000\002\164\002\196\001\201\000\000\000\000\000\000\003\184\004\158\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\004]\000\000\000\000\000q\000\000\000\000\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\007\150\000\000\001,\000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\001-\000\000\000\000\001\211\000\000\000\000\000\000\000\000\000\000\002}\004x\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\001D\000\000\001\211\000\000\002\169\001^\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\003\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\004\136\000\000\002\156\000\000\002\163\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\002\164\002\243\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\004\138\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002\167\000\000\002\255\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\002\139\000\000\000\000\002B\002\240\007\153\000\000\000\000\000\000\000\000\000\000\004Z\002\163\000\000\000\254\000\255\001\000\000\000\004\156\001\001\002\158\004\\\001\148\000\000\000\000\000\000\000\000\002\163\002\164\002\243\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\002\169\002\128\000\000\000\000\000\000\002\164\002\243\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002\167\000\000\002\245\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\002\139\000\000\002\167\002B\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\002\163\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\004]\000\000\000\000\000\000\002\164\002\243\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\002\169\000\000\000\000\000\000\000\000\000\000\007\025\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\002\169\003\187\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\004x\000\000\004]\002\167\000\000\000\000\002\156\000\000\000\000\000\000\000\000\004c\000\000\002\185\000\000\002\158\002\139\000\000\000\000\002B\000\000\002\156\007\012\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\004\136\004]\000\254\000\255\001\000\001-\000\000\001\001\000\000\000\000\004c\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\006O\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\002\156\000\000\000\000\001D\000\000\n\251\000\000\002\185\000\000\002\158\002}\004x\004\136\002~\002\127\004\138\002\128\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\007\028\000\000\000\000\000\000\000\000\002\163\004Z\000\000\000\000\000\000\000\000\000\000\004\138\004\156\000\000\002\158\004\\\000\000\000\000\000\000\004\136\002\164\003\226\000\000\002\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\002\164\003\234\004\158\000\000\007\015\000\000\000\000\001\025\000\000\000\000\004Z\001\029\001\030\000\000\000\000\000\246\000\000\004\156\000\000\002\158\004\\\000\000\002\167\000\000\000\000\000\000\000\000\004\138\000\254\000\255\001\000\000\000\000\000\001\001\000\000\002\139\b\190\000\000\002B\000\000\000\000\002\167\000\000\000\000\000\000\000\000\004\158\003\184\006:\003\185\003\186\002\127\002}\003\187\002\139\002~\002\127\002B\002\128\005\165\000\000\000\000\000\000\000\000\000\000\004Z\000\000\004]\000\000\000\000\000\000\000\000\004\156\002\169\002\158\004\\\004c\000\000\001-\002\129\002\162\000\000\002\131\002\132\002\137\000\000\003\244\005\168\000\000\000\000\000\000\003\184\002\169\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\002\156\001S\004x\000\000\004]\b\192\002\163\002\185\000\000\002\158\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\002\164\003\234\004w\000\000\002\185\000\000\002\158\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\195\004x\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\249\000\000\002\129\002\162\004\136\002\131\002\132\002\137\000\000\002\167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\002\163\001\001\000\000\002}\001\171\000\000\005>\002\127\000\000\002\128\000\000\000\000\004\136\000\000\000\000\004\138\002\164\003\226\004\022\000\000\000\000\000\000\000\000\000\000\002\169\003\190\b\198\004Y\002B\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\b\142\000\000\b\201\000\000\b\200\000\000\003\184\005\165\003\185\003\186\002\127\000\000\003\187\004Z\000\000\000\000\001D\002\167\002\156\004\138\004\156\000\000\002\158\004\\\002\163\002\185\000\000\002\158\002}\000\000\002\139\002~\002\127\002B\002\128\006\242\000\000\000\000\000\000\000\000\002\164\002\196\000\000\004\135\000\000\000\000\000\000\000\000\000\000\004\158\000\000\005\165\005C\000\000\000\000\002\129\0045\004Z\002\131\002\132\002\137\000\000\000\000\000\000\004\156\000\000\002\158\004\\\002\169\000q\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\001\025\002\167\000\000\000\000\001\029\001\030\0046\000\000\000\246\000\000\000\000\000\000\004]\004\158\002\139\000\000\000\000\002B\000\000\000\000\000\000\004c\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\005\167\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\003\184\003\189\003\185\003\186\002\127\000\000\003\187\000\000\000\000\002\169\000\000\004x\004]\000\000\003\190\000\000\004Y\002B\000\000\000\000\004]\004c\000\000\002\138\000\000\000\000\000\000\000\000\001-\004c\000\000\000\000\005\178\000\000\000\000\000\000\002\139\000\000\000\000\002B\005\188\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\004x\000\000\000\000\000\000\001D\000\000\000\000\000\000\004x\000\000\000\000\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0047\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\004Z\000\000\000\000\000\000\000\000\000\000\000\000\004[\000\000\002\158\004\\\000\000\000\000\000\000\005D\005J\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\004\136\000\000\000\000\000\000\004\138\002\157\000\000\002\158\004\136\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\005\165\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\000\000\004\138\004]\004\156\000\000\002\158\004\\\000\000\000\000\004\138\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\231\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004\158\005\165\000\000\000\000\000\000\000\000\000\000\004Z\000\000\005\165\000\000\004]\004x\000\000\004\156\004Z\002\158\004\\\000\000\000\000\004c\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\000\000\005\241\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004\158\000\000\000\000\003\184\000\000\003\185\003\186\002\127\004\158\003\187\004x\004]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004c\000\000\000\000\004]\000\000\004\136\000\000\000\000\000\000\000\000\000\000\005\251\004c\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\006%\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\004x\004\136\000\000\000\000\000\000\000\000\000\000\004\138\004c\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\006(\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\165\000\000\004x\004]\000\000\004\136\004Z\000\000\000\000\004\138\000\000\000\000\004c\004\156\000\000\002\158\004\\\004\136\003\190\000\000\004Y\002B\000\000\006+\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\165\004\158\000\000\000\000\004x\000\000\004Z\000\000\000\000\000\000\000\000\004\138\000\000\004\156\000\000\002\158\004\\\004\136\000\000\000\000\000\000\000\000\000\000\004\138\000\000\003\184\000\000\003\185\003\186\002\127\003\190\003\187\004Y\002B\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\004\158\005\165\001\002\004]\000\000\000\000\000\000\004Z\000\000\001\017\000\000\000\000\004c\005\165\004\156\000\000\002\158\004\\\004\136\004Z\000\000\000\000\004\138\006R\000\000\000\000\004\156\000\000\002\158\004\\\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\b\002\000\000\000\000\000\000\004\158\003\184\004x\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\005\165\004\158\000\000\000\000\000\000\011\019\004Z\000\000\000\000\000\000\004]\004\138\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004c\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\000\000\006U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\158\005\165\001 \000\000\000\000\004\136\000\000\004Z\000\000\002}\004x\000\000\0038\002\127\004\156\002\128\002\158\004\\\003\190\000\000\004Y\002B\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\002\129\003\207\000\000\002\131\002\132\002\137\000\000\004\158\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\004\138\003\187\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\004\136\000\000\000\000\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\188\000\000\004]\003\190\000\000\004Y\002B\001,\005\165\006f\003\015\004c\000\000\000\000\004Z\000\000\000\000\001-\000\000\000\000\b\011\004\156\006\187\002\158\004\\\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\004\138\000\000\000\000\000\000\000\000\000\000\000\000\004x\000\000\004]\001D\000\000\000\000\004\158\002\167\001^\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\006\201\002B\000\000\005\165\003\184\000\000\003\185\003\186\002\127\004Z\003\187\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004x\003\189\004]\000\000\000\000\000\000\000\000\006m\000\000\000\000\000\000\004c\004\136\003\016\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\006\215\004\158\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\004x\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\004\136\002\158\t]\004\138\000\000\002\129\0045\000\000\002\131\002\132\002\137\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\004Z\000\000\000\000\001\017\000\000\006\190\0046\004[\000\000\002\158\004\\\004Z\000\000\000\000\004\136\000\000\000\000\004\138\004\156\000\000\002\158\004\\\001\018\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\nh\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\158\000\000\006\204\000\000\000\000\000\000\002}\000\000\004Z\002~\002\127\000\000\002\128\000\000\004\138\004\156\000\000\002\158\004\\\002\138\000\000\000\000\000\000\002}\000\000\001\015\002~\002\127\000\000\002\128\tu\000\000\002\139\002\129\0045\002B\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\004\158\001 \006\218\000\000\000\000\000\000\002\129\002\162\004Z\002\131\002\132\002\137\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\0046\001\025\000\000\000\000\000\000\001\029\001\030\0047\000\000\000\246\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\002\163\000\000\000\000\000\000\004\158\000\000\001\017\000\000\000\000\000\254\000\255\001\000\005D\005J\001\001\000\000\002\164\011Y\000\000\011[\002\156\000\000\000\000\000\000\000\000\001\018\000\000\002\157\000\000\002\158\000\000\000\000\000\000\000\000\000\000\000\000\n\159\000\000\000\000\000\000\002\138\000\000\001,\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\001-\002\139\000\000\001l\002B\002\167\001\017\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\002\139\000\000\000\000\002B\001\017\001\015\000\000\001\018\000\000\000\254\000\255\001\000\001D\000\000\001\001\000\000\000\000\001^\001s\000\000\000\000\000\000\0047\001\018\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\001\"\000\000\001\001\000\000\002\169\001\002\000\000\000\000\000\000\000\000\000\000\001\025\001\017\005D\005J\001\029\001\030\000\000\000\000\000\246\000\000\002\156\000\000\001\015\000\000\000\000\000\000\000\000\002\157\001\025\002\158\001\018\000\000\001\029\001\030\000\000\000\000\000\246\002\156\001\015\000\000\000\000\001\152\001 \000\000\002\185\000\000\002\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\001,\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\001\015\001-\001\029\001\030\001l\003\184\000\246\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\001\025\001-\001 \000\000\001\029\001\030\000\000\004]\000\246\000\000\000\000\000\000\000\000\001D\000\000\000\000\004c\000\000\001^\000\000\000\000\000\000\001\025\000\000\000\000\001,\001\029\001\030\000\000\000\000\000\246\004;\000\000\000\000\000\000\001-\002}\000\000\001l\002~\002\127\001,\002\128\000\000\000\000\000\000\000\000\000\000\000\000\004x\000\000\001-\000\000\000\000\001l\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\002\129\002\162\001D\002\131\002\132\002\137\000\000\001^\001-\000\000\000\000\000\000\004]\000\000\000\000\000\000\000\000\000\000\001D\000\000\001,\004c\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\001l\002\163\000\000\000\000\000\000\007Y\000\000\002}\000\000\004\136\002~\002\127\000\000\002\128\000\000\000\000\000\000\002\164\n4\000\000\000\000\004x\003\190\000\000\004Y\002B\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\004\138\000\000\002\167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\002\163\000\000\000\000\002\139\000\000\000\000\002B\004c\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\002\164\n&\000\000\000\000\nC\000\000\003\190\000\000\004Y\002B\004Z\000\000\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\254\000\255\001\000\004x\002\169\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\004\138\002\167\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\000\000\002\156\b\135\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\000\000\002}\007\194\000\000\002~\002\127\000\000\002\128\004Z\000\000\004\136\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\002\169\003\190\000\000\004Y\002B\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\001\015\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\004\158\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \002\156\004\138\000\000\000\000\000\000\003\t\000\000\002\185\000\000\002\158\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\001\025\000\000\003\n\003\015\001\029\001\030\002}\000\000\000\246\002~\002\127\000\000\002\128\000\000\007\141\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\000\000\002\163\000\000\004\156\000\000\002\158\004\\\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\164\002\247\000\000\002\167\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\004\158\002\139\000\000\000\000\002B\001,\000\000\000\000\000\000\000\000\000\000\002\163\000\000\000\000\000\000\001-\000\000\000\000\b\140\002\129\002\162\000\000\002\131\002\132\002\137\000\000\002\167\002\164\002\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\016\002\139\000\000\000\000\002B\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\000\000\002\163\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\002\167\002\164\002\232\000\000\002}\002\156\000\000\002~\002\127\002\169\002\128\000\000\002\185\002\139\002\158\000\000\002B\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\002\167\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\169\002\158\002\163\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\002\163\000\000\000\000\000\000\002\164\002\165\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\002\164\002\168\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\169\002\158\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\254\000\255\001\000\002\167\000\000\001\001\000\000\002}\001\161\000\000\002~\002\127\000\000\002\128\000\000\002\167\002\139\000\000\000\000\002B\002\156\000\000\000\000\000\000\000\000\000\000\002\163\002\185\002\139\002\158\000\000\002B\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\002\164\002\181\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\002\169\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\169\000\000\002\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\002\167\002\164\002\184\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\139\002\158\000\000\002B\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\002\163\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\001\025\002\167\002\164\002\230\001\029\001\030\000\000\000\000\000\246\000\000\002\169\000\000\000\000\000\000\002\139\002\129\002\162\002B\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\002\167\002\156\000\000\000\000\000\000\000\000\002\163\000\000\002\185\002\169\002\158\000\000\000\000\002\139\002\129\002\162\002B\002\131\002\132\002\137\000\000\000\000\002\164\002\211\000\000\000\000\000\000\000\000\001-\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\002\163\000\000\002\185\002\169\002\158\000\000\000\000\000\000\002\129\002\162\001D\002\131\002\132\002\137\000\000\002\167\002\164\002\224\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\002\163\000\000\002\185\000\000\002\158\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\002\167\002\164\003\r\000\000\002}\000\000\000\000\002~\002\127\002\169\002\128\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\t\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\003\028\003\015\002\167\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\169\002\158\000\000\b\215\002\139\000\000\003\184\002B\003\185\003\186\002\127\000\000\003\187\003\t\000\000\000\000\000\000\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\004]\000\000\000\000\003)\003\015\002\167\000\000\000\000\002\156\004c\000\000\b\216\n\154\b\217\000\000\002\185\002\169\002\158\002\139\002\129\002\162\002B\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004x\000\000\000\000\002\167\000\000\000\000\b\218\000\000\002\156\000\000\003\t\000\000\000\000\003\016\000\000\002\185\002\139\002\158\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\0037\003\015\000\000\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\b\219\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\003\016\004]\002\185\004\136\002\158\000\000\b\220\b\221\000\000\b\222\004c\000\000\000\000\000\000\000\000\002\167\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\002\139\002~\002\127\002B\002\128\000\000\t#\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\004x\002\158\002}\000\000\000\000\002~\002\127\004\138\002\128\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\b\224\000\000\000\000\000\000\b\225\003\016\000\000\b\227\000\000\000\000\b\232\b\244\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\006\254\t\031\000\254\000\255\001\000\002\163\004Z\001\001\000\000\000\000\b\190\000\000\000\000\004\156\000\000\002\158\004\\\004\136\002\156\t \000\000\002\164\004#\000\000\002\163\002\185\000\000\002\158\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\002\164\004R\004\158\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\002\167\004]\004\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004c\000\000\004]\002\139\000\000\000\000\002B\000\000\000\000\002\167\000\000\004c\000\000\000\000\b\192\000\000\000\000\003\184\000\000\003\185\003\186\002\127\002\139\003\187\0062\002B\000\000\000\000\000\000\000\000\004Z\000\000\000\000\004x\000\000\000\000\000\000\004\156\000\000\002\158\004\\\002\169\000\000\000\000\004x\000\000\003\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\195\000\000\000\000\000\000\001\029\001\030\002\169\000\000\000\246\000\249\000\000\000\000\004\158\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\000\000\000\000\004]\004\136\000\000\000\000\000\000\000\000\002\156\000\000\000\000\004c\000\000\000\000\004\136\002\185\003\190\002\158\004Y\002B\000\000\000\000\003\184\000\000\003\185\003\186\002\127\003\190\003\187\004Y\002B\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\b\198\003\187\000\000\004]\000\000\004x\000\000\000\000\000\000\000\000\003\189\004\138\004c\000\000\b\142\004]\b\199\000\000\b\200\000\000\000\000\000\000\004\138\003\190\004c\004Y\002B\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\006\015\003\184\004x\003\185\003\186\002\127\004Z\003\187\000\000\000\000\000\000\005\164\000\000\004\156\004x\002\158\004\\\004Z\004\136\000\000\000\000\004]\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\004c\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004Z\004\158\000\000\000\000\000\000\000\000\004\136\004[\000\000\002\158\004\\\004x\000\000\004\138\000\000\000\000\000\000\000\000\004\136\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\004\148\000\000\000\000\000\000\000\000\000\000\004Z\000\000\004\138\000\000\000\000\000\000\004]\004\156\000\000\002\158\004\\\000\000\000\000\001\025\004\138\004c\004\136\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\004\154\003\184\004\158\003\185\003\186\002\127\004Z\003\187\000\000\000\000\000\000\000\000\004\163\004\156\004x\002\158\004\\\000\000\004Z\000\000\003\184\004]\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\004c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\004c\001-\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\004\174\000\000\004x\000\000\000\000\000\000\004Z\000\000\003\184\004\136\003\185\003\186\002\127\004\156\003\187\002\158\004\\\000\000\000\000\007`\000\000\004x\003\190\000\000\004Y\002B\000\000\000\000\004]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004\138\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\000\000\004x\003\190\000\000\004Y\002B\000\000\004c\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\180\000\000\003\190\000\000\004Y\002B\004Z\000\000\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\000\000\000\000\000\000\004x\000\000\000\000\000\000\000\000\000\000\003\184\004]\003\185\003\186\002\127\000\000\003\187\000\000\000\000\004\138\004c\004\136\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\004]\000\000\004\186\000\000\003\190\000\000\004Y\002B\004Z\004c\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\000\000\000\000\004\192\000\000\004x\000\000\000\000\000\000\004Z\000\000\003\184\004\136\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\003\216\000\000\000\000\004x\003\190\004\158\004Y\002B\000\000\000\000\004]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004c\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\000\000\004\198\000\000\000\000\000\000\000\000\000\000\004Z\004\138\003\184\004\136\003\185\003\186\002\127\004\156\003\187\002\158\004\\\000\000\000\000\000\000\000\000\004x\003\190\000\000\004Y\002B\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004J\000\000\004\204\000\000\003\190\004\158\004Y\002B\004Z\000\000\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\000\000\003\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\184\004]\003\185\003\186\002\127\003\190\003\187\004Y\002B\004\138\004c\004\136\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\004]\000\000\004\210\000\000\003\190\000\000\004Y\002B\004Z\004c\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\000\000\000\000\004\216\000\000\004x\000\000\000\000\000\000\004Z\000\000\003\184\004]\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\004c\003\189\000\000\004x\000\000\004\158\000\000\000\000\000\000\000\000\004]\000\000\000\000\000\000\003\190\000\000\004Y\002B\004Z\004c\000\000\000\000\000\000\000\000\004\158\004[\000\000\002\158\004\\\000\000\000\000\004\222\000\000\004x\000\000\000\000\000\000\004Z\000\000\002}\004\136\000\000\002~\002\127\004\156\002\128\002\158\004\\\000\000\000\000\000\000\000\000\004x\003\190\000\000\004Y\002B\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\155\000\000\002\131\002\132\002\137\003\190\004\158\004Y\002B\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\004Z\004\138\000\000\004\136\000\000\000\000\000\000\004[\000\000\002\158\004\\\003\184\004]\003\185\003\186\002\127\003\190\003\187\004Y\002B\004\138\004c\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\004\228\000\000\003\190\000\000\004Y\002B\004Z\004c\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\000\000\004\234\000\000\004x\000\000\000\000\000\000\004Z\000\000\003\184\004]\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\004c\002\138\000\000\004x\000\000\004\158\000\000\000\000\000\000\000\000\004]\000\000\004\240\000\000\002\139\000\000\000\000\002B\004Z\004c\000\000\000\000\000\000\000\000\004\158\004\156\000\000\002\158\004\\\000\000\000\000\004\246\000\000\004x\000\000\000\000\000\000\004Z\000\000\002}\004\136\000\000\002~\002\127\004\156\002\128\002\158\004\\\000\000\000\000\000\000\000\000\004x\003\190\004\158\004Y\002B\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\179\000\000\002\131\002\132\002\137\003\190\004\158\004Y\002B\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\002\156\004\138\000\000\004\136\000\000\000\000\000\000\002\157\000\000\002\158\000\000\003\184\004]\003\185\003\186\002\127\003\190\003\187\004Y\002B\004\138\004c\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\004\252\000\000\003\190\000\000\004Y\002B\004Z\004c\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\000\000\005\002\000\000\004x\000\000\000\000\000\000\004Z\000\000\003\184\004]\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\004c\002\138\000\000\004x\000\000\004\158\000\000\000\000\000\000\000\000\004]\000\000\005\b\000\000\002\139\000\000\000\000\002B\004Z\004c\000\000\000\000\000\000\000\000\004\158\004\156\000\000\002\158\004\\\000\000\000\000\005\014\000\000\004x\000\000\000\000\000\000\004Z\000\000\000\000\004\136\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\004x\003\190\004\158\004Y\002B\000\000\000\000\004\136\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\169\000\000\003\190\004\158\004Y\002B\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\002\156\004\138\000\000\004\136\000\000\000\000\000\000\002\157\000\000\002\158\000\000\003\184\004]\003\185\003\186\002\127\003\190\003\187\004Y\002B\004\138\004c\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\005\020\000\000\003\190\000\000\004Y\002B\004Z\004c\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\004\138\000\000\005\026\000\000\004x\000\000\000\000\000\000\004Z\000\000\003\184\000\000\003\185\003\186\002\127\004\156\003\187\002\158\004\\\004\138\000\000\000\000\000\000\004x\000\000\004\158\000\000\000\000\000\000\000\000\004]\000\000\005 \000\000\000\000\000\000\000\000\000\000\004Z\004c\000\000\000\000\000\000\000\000\004\158\004\156\000\000\002\158\004\\\000\000\001\025\005&\000\000\000\000\001\029\001\030\000\000\004Z\000\246\002}\004\136\000\000\002~\002\127\004\156\002\128\002\158\004\\\000\000\000\000\000\000\000\000\004x\003\190\004\158\004Y\002B\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\003\190\004\158\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\138\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\b\190\000\000\000\000\003\t\000\000\001-\000\000\000\000\000\000\000\000\004\138\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\005\130\003\015\000\000\000\000\0054\000\000\003\190\000\000\004Y\002B\004Z\000\000\000\000\000\000\000\000\000\000\001D\004\156\000\000\002\158\004\\\002}\000\000\005:\002~\002\127\000\000\002\128\000\000\004Z\000\000\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\004\138\003\184\002\167\003\185\003\186\002\127\004\158\003\187\002\129\002\162\000\000\002\131\002\132\002\137\000\000\002\139\000\000\b\192\002B\000\000\003\184\004]\003\185\003\186\002\127\004\158\003\187\000\000\000\000\000\000\004c\003\184\005\176\003\185\003\186\002\127\000\000\003\187\004Z\000\000\004]\000\000\002\163\000\000\000\000\004\156\000\000\002\158\004\\\004c\000\000\004]\003\016\000\000\000\000\000\000\000\000\b\195\002\164\005\133\004c\001\029\001\030\004x\000\000\000\246\000\249\000\000\000\000\000\000\000\000\000\254\000\255\001\000\004\158\000\000\001\001\000\000\000\000\001\002\000\000\000\000\004x\000\000\000\000\000\000\001\017\002\156\000\000\000\000\000\000\000\000\000\000\004x\002\185\000\000\002\158\000\000\000\000\002\167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\b\002\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\184\b\198\003\185\003\186\002\127\003\190\003\187\004Y\002B\b\005\000\000\004\136\000\000\000\000\000\000\b\142\000\000\b\211\000\000\b\200\004]\000\000\004\136\002\169\003\190\000\000\004Y\002B\001\015\004c\003\184\001D\003\185\003\186\002\127\003\190\003\187\004Y\002B\004\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\004]\000\000\000\000\000\000\000\000\000\000\000\000\002\156\004\138\004c\000\000\000\000\004x\000\000\002\185\000\000\002\158\000\000\001\025\004\138\000\000\005\186\001\029\001\030\000\000\000\000\000\246\004Z\000\000\000\000\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\000\000\000\000\005\196\003\184\004x\003\185\003\186\002\127\004Z\003\187\000\000\000\000\000\000\005\207\000\000\004\156\000\000\002\158\004\\\004Z\000\000\000\000\000\000\004]\000\000\004\158\004\156\000\000\002\158\004\\\004\136\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001,\000\000\003\190\004\158\004Y\002B\000\000\000\254\000\255\001\000\001-\000\000\001\001\b\011\004\158\001\177\000\000\000\000\000\000\004\136\000\000\000\000\000\000\003\184\004x\003\185\003\186\002\127\000\000\003\187\000\000\000\000\003\190\000\000\004Y\002B\004\138\000\000\000\000\000\000\001D\000\000\000\000\004]\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\004c\003\184\000\000\003\185\003\186\002\127\003\184\003\187\003\185\003\186\002\127\000\000\003\187\000\000\004\138\000\000\005\217\000\000\000\000\000\000\000\000\004]\004Z\000\000\000\000\000\000\004]\000\000\004\136\004\156\004c\002\158\004\\\004x\000\000\004c\003\184\000\000\003\185\003\186\002\127\003\190\003\187\004Y\002B\000\000\005\227\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\004]\000\000\004\158\004\156\000\000\002\158\004\\\004x\000\000\004c\000\000\000\000\004x\000\000\000\000\000\000\000\000\000\000\000\000\004\138\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\004\158\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\184\004x\003\185\003\186\002\127\003\190\003\187\004Y\002B\000\000\005\239\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\004]\000\000\004\136\004\156\000\000\002\158\004\\\004\136\000\000\004c\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\004\138\003\190\000\000\004Y\002B\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\004\158\001-\000\000\000\000\000\000\004\136\000\000\000\000\000\000\003\184\004x\003\185\003\186\002\127\000\000\003\187\000\000\004\138\003\190\005\249\004Y\002B\004\138\000\000\000\000\004Z\000\000\000\000\000\000\004]\000\000\001D\004\156\000\000\002\158\004\\\000\000\000\000\004c\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\006\003\000\000\000\000\004\138\000\000\006\n\004Z\000\000\000\000\000\000\004]\004Z\004\158\004\156\000\000\002\158\004\\\004\136\004\156\004c\002\158\004\\\004x\000\000\000\000\003\184\000\000\003\185\003\186\002\127\003\190\003\187\004Y\002B\000\000\006H\000\000\000\000\000\000\000\000\000\000\004Z\004\158\000\000\000\000\004]\000\000\004\158\004\156\000\000\002\158\004\\\004x\000\000\004c\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\004\138\001\185\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\004\158\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004x\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\006G\000\000\000\000\000\000\002}\000\000\004Z\002~\002\127\000\000\002\128\000\000\004\136\004\156\000\000\002\158\004\\\000\000\002}\000\000\000\000\002~\002\127\000\000\002\128\003\190\000\000\004Y\002B\004\138\000\000\002\129\002\162\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\004\158\001-\000\000\002\129\002\162\004\136\002\131\002\132\002\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\138\003\190\006N\004Y\002B\000\000\002\163\000\000\004Z\000\000\000\000\000\000\000\000\000\000\007^\004\156\000\000\002\158\004\\\000\000\002\163\000\000\002\164\006\154\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\006d\000\000\000\246\004\138\002\164\006\131\004Z\000\000\000\000\000\000\000\000\000\000\004\158\004\156\000\000\002\158\004\\\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\167\000\000\000\000\000\000\006}\000\000\004]\000\000\000\000\000\000\004Z\004\158\000\000\002\139\002\167\004c\002B\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\002}\000\000\002\139\002~\002\127\002B\002\128\000\000\000\000\001-\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\004\158\000\000\004x\000\000\000\000\002\169\002\129\002\162\000\000\002\131\002\132\002\137\000\000\004]\000\000\000\000\000\000\000\000\001D\002\169\000\000\000\000\004c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\002\156\002\163\002~\002\127\000\000\002\128\000\000\002\185\000\000\002\158\000\000\000\000\000\000\000\000\002\156\000\000\004x\002\164\006\139\004\136\000\000\002\185\000\000\002\158\000\000\000\000\002\129\002\162\000\000\002\131\002\132\002\137\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\002\167\003\187\002\163\004]\000\000\000\000\000\000\000\000\004\138\000\000\000\000\000\000\004c\002\139\004\136\004]\002B\000\000\002\164\006\147\000\000\000\000\000\000\000\000\004c\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\006\137\002~\002\127\000\000\002\128\004x\004Z\000\000\000\000\000\000\000\000\002\169\000\000\004\156\000\000\002\158\004\\\004x\000\000\002\167\000\000\004\138\000\000\000\000\000\000\002\129\002\192\000\000\002\131\002\132\002\137\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\004\158\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\185\006\145\002\158\000\000\000\000\000\000\000\000\004Z\000\000\004\136\000\000\000\000\000\000\000\000\004\156\000\000\002\158\004\\\002\169\000\000\000\000\004\136\003\190\000\000\004Y\002B\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\003\190\003\187\004Y\002B\000\000\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\000\004]\000\000\002}\002\156\000\000\002~\002\127\004\138\002\128\004c\002\185\000\000\002\158\000\000\000\000\002\138\000\000\000\000\000\000\004\138\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\002\139\002\129\002\162\002B\002\131\002\132\002\137\000\000\000\254\000\255\001\000\006\153\004]\001\001\004x\000\000\001\188\004Z\000\000\000\000\000\000\004c\000\000\006\160\004\156\000\000\002\158\004\\\000\000\004Z\000\000\000\000\000\000\000\000\000\000\002\163\004\156\000\000\002\158\004\\\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\002\164\007\242\004\158\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004]\000\000\000\000\004\158\000\000\000\000\000\000\000\000\004\136\004c\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\157\000\000\002\158\000\000\003\190\000\000\004Y\002B\000\000\000\254\000\255\001\000\000\000\002\167\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\004x\002\139\000\000\000\000\002B\000\000\004\136\000\000\000\000\000\000\000\254\000\255\001\000\004\138\000\000\001\001\000\000\000\000\001\002\003\190\000\000\004Y\002B\000\000\000\000\001\017\000\000\000\000\001\025\b\002\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\002\169\000\000\000\000\000\000\000\000\000\000\006\172\000\000\000\000\000\000\b|\000\000\004Z\000\000\004\138\000\000\b\002\004\136\000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\000\000\000\000\001\015\003\190\000\000\004Y\002B\002\156\000\000\tZ\000\000\000\000\000\000\000\000\002\185\000\000\002\158\000\000\000\000\006\171\000\000\004\158\001 \000\000\000\000\004Z\000\000\000\000\001\015\000\000\000\000\000\000\004\156\001-\002\158\004\\\000\000\004\138\000\000\000\254\000\255\001\000\001\025\000\000\001\001\000\000\001\029\001\030\001 \000\000\000\246\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\004\158\000\000\001D\000\000\000\000\000\000\001\017\001\025\006\178\000\000\000\000\001\029\001\030\000\000\004Z\000\246\002}\000\000\000\000\002~\002\127\004\156\002\128\002\158\004\\\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\b\002\000\000\000\000\000\000\001\017\000\000\001,\002\129\002\162\000\000\002\131\002\132\002\137\000\000\004\158\000\000\001-\000\000\000\000\b\011\th\000\000\000\000\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\001,\000\000\b\002\000\000\000\000\000\000\000\000\001\015\000\000\002\163\001-\004]\000\000\b\011\001D\000\000\000\000\000\000\000\000\001^\004c\000\000\tr\000\000\000\000\002\164\n3\001 \000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001D\001\015\000\246\000\000\000\000\001^\000\000\001\025\000\000\000\000\000\000\001\029\001\030\004x\000\000\000\246\000\000\000\254\000\255\001\000\000\000\001 \001\001\000\000\000\000\001\002\002\167\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\001\025\002B\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\001\018\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\n\196\001\002\000\000\001-\000\000\000\000\001,\004\136\001\017\000\000\000\000\000\000\000\000\000\000\000\000\002\169\001-\000\000\000\000\b\011\003\190\000\000\004Y\002B\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\007p\000\000\001\002\000\000\000\000\003=\001\015\001,\000\000\001\017\000\000\000\000\000\000\001D\000\000\000\000\002\156\001-\001^\000\000\b\011\004\138\000\000\002\185\000\000\002\158\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\236\000\254\000\255\001\000\000\000\001\015\001\001\001\025\001D\001\002\000\000\001\029\001\030\001^\nR\000\246\001\017\000\000\000\000\000\000\004Z\000\000\000\000\000\000\000\000\001 \000\000\004\156\000\000\002\158\004\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\000\000\001\025\004\015\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\004\158\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\001,\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\001-\001\025\001\017\001l\000\000\001\029\001\030\001\015\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \001,\000\000\001D\000\000\004\028\000\000\000\000\001^\000\000\000\000\001-\000\000\000\000\003A\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\254\000\255\001\000\001,\000\000\001\001\000\000\000\000\001\002\001D\000\000\000\000\001\015\001-\001^\001\017\003\240\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\001 \001\017\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\001D\001\002\005V\000\000\000\000\001^\001,\000\000\001\017\001\025\000\000\000\000\000\000\001\029\001\030\000\000\001-\000\246\000\000\002\214\005\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\007E\000\000\000\000\001\015\000\000\000\000\001\017\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\007H\000\000\001\015\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\001,\000\000\001\001\000\000\000\000\001\002\000\000\001\015\000\000\001 \001-\001\025\001\017\002\214\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\254\000\255\001\000\000\000\001 \001\001\001\025\000\000\001\002\000\000\001\029\001\030\000\000\t\139\000\246\001\017\000\000\001D\000\000\000\000\001\015\000\000\001^\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\254\000\255\001\000\000\000\001 \001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\001,\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\001\015\001-\001\025\000\000\001\230\000\000\001\029\001\030\000\000\001,\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\001 \000\000\001\230\007E\000\000\000\000\001\015\001,\000\000\000\000\000\000\001D\000\000\000\254\000\255\001\000\001^\001-\001\001\000\000\001\025\001\192\n\\\000\000\001\029\001\030\001 \000\000\000\246\001D\000\254\000\255\001\000\000\000\001^\001\001\000\000\000\000\001\002\000\000\000\000\000\000\001\015\001,\000\000\001\017\001\025\001D\000\000\000\000\001\029\001\030\007R\001-\000\246\000\000\b\153\000\000\000\000\b\156\000\000\000\000\001 \003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001,\001\025\001D\000\000\000\000\001\029\001\030\001^\000\000\000\246\001-\004X\000\000\b\140\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\001,\000\000\011=\001\017\000\000\000\000\000\000\001\015\000\000\000\000\001-\000\000\000\000\b\153\001D\000\000\t\185\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001,\000\000\000\246\000\000\001D\000\000\000\000\000\000\000\000\001^\001-\001\025\000\254\000\255\001\000\001\029\001\030\001\001\000\000\000\246\001\002\000\000\000\000\000\000\000\254\000\255\001\000\001\017\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\001\015\000\000\003\189\001\017\001D\000\000\000\000\000\000\000\000\007R\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\001-\000\000\001\001\000\000\000\000\001\002\000\000\001,\000\000\000\000\000\000\001\025\001\017\000\000\000\000\001\029\001\030\001-\000\000\000\246\011>\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\001D\001\015\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\001\015\000\000\000\000\000\000\001D\000\000\001\017\000\000\001 \001^\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\000\000\001 \000\000\004[\000\000\002\158\004\\\000\000\000\000\001\025\001,\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\001\015\001-\001\025\000\000\011\014\000\000\001\029\001\030\000\000\000\000\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\001 \000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\001\015\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001,\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\001-\000\000\001,\011\011\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\001-\000\246\000\000\001\227\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\001\015\001^\000\254\000\255\001\000\000\000\001,\001\001\001D\000\000\001\002\000\000\000\000\001^\000\000\000\000\001-\001\017\000\000\001r\001 \000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001\025\000\000\001-\001,\001\029\001\030\001D\000\000\000\246\000\000\000\000\001^\000\000\001-\000\000\000\000\001.\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\007t\000\000\000\000\001\017\000\000\000\000\000\000\000\254\000\255\001\000\000\000\001D\001\001\000\000\001\015\001\002\001^\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\001,\000\000\001\205\000\000\001\015\001 \000\000\000\000\000\000\000\000\001-\000\000\000\000\001o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\001\015\001\025\001^\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\001\015\001 \000\254\000\255\001\000\000\000\001\017\001\001\000\000\000\000\001\002\000\254\000\255\001\000\000\000\000\000\001\001\001\017\000\000\b\186\001 \001\025\000\000\000\000\001,\001\029\001\030\002}\000\000\000\246\002~\002\127\000\000\002\128\001-\000\000\000\000\001u\000\000\000\000\001\025\000\000\000\000\001,\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\001-\002\129\002\209\001\154\002\131\002\132\002\137\000\000\000\000\000\000\000\000\001D\000\000\000\254\000\255\001\000\001^\000\000\001\001\000\000\000\000\001\002\001\015\000\000\000\000\000\000\000\000\000\000\001\017\001,\001D\000\000\000\000\001\015\000\000\001^\000\000\000\000\000\000\001-\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\001,\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\001-\000\000\000\000\001\232\001\025\000\000\000\000\000\000\001\029\001\030\000\000\001D\000\246\000\000\000\000\001\025\001\209\000\000\000\000\001\029\001\030\000\000\000\000\000\246\001\025\000\000\000\000\000\000\001\029\001\030\001D\000\000\000\246\000\000\002\138\001^\000\000\000\000\000\000\001\015\000\254\000\255\001\000\000\000\000\000\001\001\000\000\002\139\001\002\000\000\002B\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001 \000\000\000\000\000\254\000\255\001\000\001,\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\001-\001,\001\017\001\253\001\025\000\000\000\000\000\000\001\029\001\030\000\000\001-\000\246\000\000\002\004\000\000\000\254\000\255\001\000\000\000\001-\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\001D\001\017\000\000\000\000\000\000\001^\000\000\000\254\000\255\001\000\000\000\001D\001\001\000\000\002\156\001\002\001^\000\000\000\000\001\015\001D\002\157\001\017\002\158\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\001,\000\000\000\000\000\000\001 \001\017\001\015\000\000\000\000\000\000\001-\000\000\000\000\002U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\001 \000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001\015\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\001 \001\015\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001\015\001\025\001 \000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \001-\001\025\000\000\002\\\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001,\000\254\000\255\001\000\000\000\000\000\001\001\001\025\000\000\001\002\001-\001\029\001\030\002j\000\000\000\246\001\017\000\000\001D\000\254\000\255\001\000\000\000\001^\001\001\000\000\000\000\001\002\000\000\001,\000\000\000\000\000\000\000\000\001\017\001\015\000\000\000\000\000\000\001-\001D\000\000\002\151\000\000\000\000\001^\000\000\000\000\000\000\000\000\001,\000\000\000\000\000\000\000\000\001 \000\254\000\255\001\000\000\000\001-\001\001\000\000\002\175\001\002\000\000\000\000\000\000\001,\001D\000\000\001\017\000\000\000\000\001^\001\025\000\000\000\000\001-\001\029\001\030\002\205\000\000\000\246\000\000\001\015\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\001 \000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\002}\001,\000\000\002~\002\127\001\015\002\128\000\000\001\025\000\000\000\000\001-\001\029\001\030\003\022\000\000\000\246\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\001 \001\001\002\129\003\007\001\002\002\131\002\132\002\137\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\001\025\001^\000\000\000\000\001\029\001\030\001,\000\000\000\246\000\000\000\254\000\255\001\000\000\000\000\000\001\001\001-\000\000\001\002\003#\000\000\000\000\000\000\000\000\001,\001\017\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\001-\001\002\000\000\0031\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001D\000\000\000\254\000\255\001\000\001^\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\001\015\001,\000\000\001\017\001D\000\000\000\000\000\000\000\000\001^\000\000\001-\000\000\002\138\003?\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\000\000\001\025\001D\000\000\000\000\001\029\001\030\001^\000\000\000\246\000\000\000\000\001\015\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \001\015\000\000\001\025\000\254\000\255\001\000\001\029\001\030\001\001\000\000\000\246\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001\025\001 \000\000\000\000\001\029\001\030\000\000\002\156\000\246\000\000\001,\000\000\000\000\000\000\002\157\000\000\002\158\000\000\000\000\000\000\001-\001\025\000\000\003o\000\000\001\029\001\030\000\000\000\000\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\001,\001\017\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\001-\001^\000\000\003q\000\000\000\000\000\000\001,\000\000\000\000\000\254\000\255\001\000\000\000\001\015\001\001\000\000\001-\001\002\000\000\003\209\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001,\000\000\001D\000\000\000\000\000\000\001 \001^\000\000\000\000\001-\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\001D\000\254\000\255\001\000\000\000\001^\001\001\001\025\000\000\001\002\000\000\001\029\001\030\001\015\000\000\000\246\001\017\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\002}\001 \000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\002\129\0045\000\246\002\131\002\132\002\137\000\000\000\000\001 \001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\004\017\000\000\000\000\000\000\001\015\000\000\001\025\000\254\000\255\001\000\001\029\001\030\001\001\000\000\000\246\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\001 \000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\001\025\000\000\004\030\000\000\001\029\001\030\000\000\000\000\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\001,\001\017\002\138\000\000\000\000\000\000\001D\000\000\000\000\000\000\001-\001^\000\000\0040\000\000\002\139\000\000\000\000\002B\000\000\000\254\000\255\001\000\000\000\001\015\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001,\000\000\001D\000\000\000\000\000\000\001 \001^\000\000\000\000\001-\000\000\000\000\005P\000\000\000\000\0047\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\001\025\000\000\001\002\000\000\001\029\001\030\001\015\000\000\000\246\001\017\000\254\000\255\001\000\000\000\001D\001\001\0048\000\000\001\002\001^\000\000\000\000\000\000\002\156\000\000\001\017\001 \000\000\000\000\000\000\002\157\000\000\002\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\001 \001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\005X\000\000\000\000\000\000\001\015\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\001 \000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\001,\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\001-\001\025\000\000\005j\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\254\000\255\001\000\000\000\000\000\001\001\001\025\000\000\001\002\000\000\001\029\001\030\000\000\001,\000\246\001\017\000\000\000\000\000\000\001D\000\000\000\000\000\000\001-\001^\000\000\005|\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\254\000\255\001\000\001\017\000\000\001\001\000\000\000\000\001\002\000\000\001,\000\000\001D\000\000\000\000\001\017\000\000\001^\000\000\000\000\001-\000\000\000\000\005\142\000\000\000\000\001,\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\012\001-\000\000\000\000\b\004\000\000\000\000\001\014\001\015\000\000\000\000\000\254\000\255\001\000\000\000\001D\001\001\000\000\000\000\001\002\001^\000\000\000\000\000\000\000\000\000\000\001\017\000\000\001 \000\000\000\000\001D\000\000\000\000\000\000\002}\001^\001\015\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\001\025\001\015\000\000\000\000\001\029\001\030\000\000\000\000\000\246\001 \000\000\000\000\000\000\000\000\002\129\0045\000\000\002\131\002\132\002\137\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\001\015\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001\015\001\187\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\001,\000\000\000\000\000\000\001\017\000\000\001 \001\025\000\000\000\000\001-\001\029\001\030\be\000\000\000\246\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\001\025\000\000\001\002\001,\001\029\001\030\000\000\000\000\000\246\001\017\000\000\000\000\000\000\001-\001D\001,\bq\000\000\002\138\001^\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\b\139\000\000\000\000\002\139\000\000\000\000\002B\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\001D\001\002\000\000\000\000\001\015\001^\000\000\000\000\001\017\001-\002}\000\000\001D\002~\002\127\000\000\002\128\001^\001,\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\t\200\001-\000\000\000\000\b\155\000\000\000\000\000\000\001\015\000\000\002\129\0045\001D\002\131\002\132\002\137\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001 \000\000\000\000\001D\000\000\002\156\000\000\000\000\001^\000\000\000\000\000\000\002\157\002}\002\158\000\000\002~\002\127\000\000\002\128\001\025\000\000\001\015\000\000\001\029\001\030\000\000\000\000\000\246\t\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\129\0045\001 \002\131\002\132\002\137\000\000\000\000\002}\000\000\001,\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\001-\000\000\001\025\tE\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\002\138\000\000\002\129\0045\000\000\002\131\002\132\002\137\001,\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\001D\001-\000\000\000\000\tW\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\002}\001\002\000\000\002~\002\127\000\000\002\128\000\000\001\017\000\000\000\000\001D\000\000\001,\000\000\t\144\001^\000\000\000\000\000\000\000\000\002\138\000\000\001-\000\000\000\000\to\002\129\0045\000\000\002\131\002\132\002\137\000\000\002\139\000\000\000\000\002B\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\002\156\000\000\000\000\000\000\000\000\001D\001\017\002\157\002\138\002\158\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\t\157\002B\t\144\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\001 \000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\002\156\000\000\t\200\000\000\000\000\000\000\000\000\002\157\000\000\002\158\000\000\001\025\002\138\000\000\000\000\001\029\001\030\001\015\000\000\000\246\000\000\000\000\000\000\t\156\000\000\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\001 \000\254\000\255\001\000\000\000\002\157\001\001\002\158\000\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001\025\000\000\t\201\000\000\001\029\001\030\001\015\t\200\000\246\000\000\000\000\000\000\000\254\000\255\001\000\001,\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\001-\001 \001\017\n-\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\002\000\000\002\156\000\000\000\000\000\000\000\000\001\017\001\025\002\157\000\000\002\158\001\029\001\030\000\000\000\000\000\246\001D\000\000\000\000\000\000\000\000\001^\001,\000\000\000\000\t\209\001\015\000\000\000\254\000\255\001\000\000\000\001-\001\001\000\000\n7\001\002\000\254\000\255\001\000\000\000\000\000\001\001\001\017\000\000\001\002\001 \000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\001\025\001^\001,\000\000\001\029\001\030\000\000\000\000\000\246\001\015\000\000\001 \001-\000\000\000\000\nj\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\b\193\000\000\000\000\000\000\001 \000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001D\000\254\000\255\001\000\001\015\001^\001\001\001\025\000\000\b\190\000\000\001\029\001\030\001\015\000\000\000\246\000\000\000\000\000\000\001,\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\001-\000\000\000\000\n\161\001 \000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\b\190\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001,\000\000\000\246\001\025\000\000\000\000\000\000\001\029\001\030\001D\001-\000\246\000\000\n\198\001^\000\254\000\255\001\000\001,\000\000\001\001\000\000\000\000\001\002\000\000\000\000\000\000\000\000\001-\000\000\001\017\000\000\000\000\000\000\000\000\b\192\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001,\000\000\000\246\001D\000\000\000\000\000\000\000\000\001\207\001,\001-\t\213\000\000\b\192\000\000\000\000\000\000\000\000\000\000\001-\b\195\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\249\011\128\000\000\000\000\011\129\000\000\000\000\000\000\t\216\000\000\000\000\001D\000\000\000\000\000\000\001\015\003j\000\000\t\217\000\000\001D\000\000\000\000\000\000\b\195\003l\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\249\000\000\001 \001-\002}\000\000\000\000\002~\002\127\000\000\002\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\218\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\b\198\000\246\002\129\003\026\001D\002\131\002\132\002\137\000\000\002}\000\000\000\000\002~\002\127\b\142\002\128\t\171\000\000\b\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\213\000\000\002}\t\219\001D\002~\002\127\b\198\002\128\000\000\002\129\003'\000\000\002\131\002\132\002\137\000\000\000\000\000\000\t\220\000\000\b\142\t\214\t\197\000\000\b\200\t\216\000\000\001,\002\129\003+\000\000\002\131\002\132\002\137\000\000\t\217\001D\001-\000\000\000\000\011\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\t\222\002~\002\127\000\000\002\128\000\000\000\000\002\138\001D\000\000\000\000\t\218\t\223\007G\000\000\000\000\t\224\000\000\000\000\t\226\002\139\000\000\t\231\002B\000\000\002\129\0035\000\000\002\131\002\132\002\137\000\000\000\000\000\000\000\000\t\233\000\000\000\000\000\000\002}\000\000\002\138\002~\002\127\000\000\002\128\000\000\000\000\000\000\t\219\000\000\000\000\000\000\t\234\002\139\000\000\000\000\002B\002}\000\000\002\138\002~\002\127\000\000\002\128\t\220\002\129\0044\000\000\002\131\002\132\002\137\t\213\002\139\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\129\005\128\000\000\002\131\002\132\002\137\t\248\002\156\000\000\011w\000\000\000\000\000\000\t\216\002\157\000\000\002\158\000\254\000\255\001\000\000\000\t\222\001\001\t\217\000\000\0011\000\000\000\000\000\000\000\000\000\000\002\138\0013\t\223\000\000\000\000\000\000\t\224\000\000\000\000\t\226\002\156\000\000\t\231\002\139\000\000\000\000\002B\002\157\000\000\002\158\000\000\000\000\000\000\000\000\000\000\t\233\000\000\t\218\000\000\002\156\000\000\002}\000\000\000\000\002~\002\127\002\157\002\128\002\158\000\000\000\000\002\138\000\000\t\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\000\000\002B\002\129\n$\002\138\002\131\002\132\002\137\000\000\t\219\000\000\000\000\002}\000\000\001\015\002~\002\127\002\139\002\128\000\000\002B\000\000\000\000\000\000\000\000\t\220\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\0014\000\000\002\157\000\000\002\158\002\129\n1\000\000\002\131\002\132\002\137\000\254\000\255\001\000\011x\000\000\001\001\000\000\000\000\0017\001\025\000\000\000\000\000\000\001\029\001\030\0019\000\000\000\246\000\000\000\000\000\000\t\222\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\157\t\223\002\158\000\000\000\000\t\224\000\000\000\000\t\226\000\000\000\000\t\231\002\156\000\000\000\000\000\000\002\138\000\000\000\000\002\157\000\000\002\158\000\000\000\000\t\233\000\254\000\255\001\000\000\000\002\139\001\001\000\000\002B\001>\000\000\000\000\000\254\000\255\001\000\000\000\001@\001\001\t\234\000\000\001W\000\000\000\000\000\000\001-\000\000\000\000\001Y\001\015\002\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\002\139\001\001\000\000\002B\001x\000\000\001:\000\000\000\254\000\255\001\000\001z\001D\001\001\000\000\000\000\001\128\000\254\000\255\001\000\000\000\000\000\001\001\001\130\000\000\001\136\001\025\000\000\000\000\000\000\001\029\001\030\001\138\000\000\000\246\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\157\001\015\002\158\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\255\001\000\001\015\000\000\001\001\000\000\000\000\001\144\000\000\000\000\000\000\001A\000\000\000\000\001\146\000\000\000\000\000\000\000\000\000\000\002\156\000\000\001Z\000\000\000\000\000\000\000\000\002\157\001\015\002\158\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\001\015\000\000\001\025\000\000\000\000\001-\001\029\001\030\001{\001\015\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\157\001\131\000\000\000\000\000\000\000\000\000\000\001\159\000\000\001\025\001\139\000\000\000\000\001\029\001\030\000\000\001D\000\246\000\000\000\000\000\000\001\025\000\000\000\000\001\015\001\029\001\030\000\000\000\000\000\246\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\001-\001\147\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\001\165\001-\000\000\000\000\000\000\000\000\000\000\001\167\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\001D\000\000\003\184\001\015\003\185\003\186\002\127\001-\003\187\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\001\160\000\254\000\255\001\000\000\000\001-\001\001\000\000\004m\001\173\000\000\000\000\000\000\000\000\001D\000\000\001\175\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001D\000\000\000\246\000\000\000\000\000\000\000\000\001\015\000\000\001D\000\254\000\255\001\000\001-\000\000\001\001\000\000\000\000\001\181\000\000\000\000\000\000\000\000\000\000\000\000\001\183\000\000\001\168\003\184\000\000\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\004o\000\000\001\015\003\184\000\000\003\185\003\186\002\127\001-\003\187\000\000\000\000\000\000\000\000\003\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\176\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\004\129\000\000\000\000\000\000\000\000\001\015\001D\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\001\184\000\000\000\000\000\000\001-\000\000\000\000\003\184\000\000\003\185\003\186\002\127\003\184\003\187\003\185\003\186\002\127\000\000\003\187\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\003\189\000\000\001D\000\000\004\137\000\000\000\000\000\000\000\000\004\157\004Z\000\000\000\000\003\190\000\000\004Y\002B\004[\000\000\002\158\004\\\000\000\000\000\003\184\001-\003\185\003\186\002\127\000\000\003\187\000\000\003\184\003\189\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\000\000\000\000\005/\000\000\001D\000\000\000\000\000\000\000\000\001-\006_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\185\003\186\002\127\003\184\003\187\003\185\003\186\002\127\000\000\003\187\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\000\000\001D\000\000\000\000\004[\003\189\002\158\004\\\000\000\n>\003\189\000\000\000\000\000\000\nM\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\003\190\000\000\004Y\002B\000\000\000\000\004Z\000\000\000\000\000\000\000\000\000\000\000\000\004[\000\000\002\158\004\\\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\nm\000\000\000\000\000\000\000\000\003\189\000\000\no\000\000\000\254\000\255\001\000\000\000\003\189\001\001\000\000\000\000\nu\003\190\000\000\004Y\002B\000\000\000\000\nw\000\000\003\190\000\000\004Y\002B\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\n\164\000\000\000\000\000\000\004Z\000\000\000\000\n\166\000\000\004Z\000\000\004[\003\189\002\158\004\\\000\000\004[\003\189\002\158\004\\\000\000\000\000\000\000\000\000\000\000\003\190\000\000\004Y\002B\000\000\003\190\000\000\004Y\002B\000\000\000\254\000\255\001\000\001\015\000\000\001\001\000\000\000\000\n\172\000\000\000\000\000\000\000\000\000\000\000\000\n\174\000\000\004Z\000\000\000\000\001\015\000\000\000\000\np\004[\004Z\002\158\004\\\000\000\000\000\000\000\000\000\004[\000\000\002\158\004\\\000\000\000\000\000\000\000\000\nx\001\015\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\n\167\004Z\000\000\001\029\001\030\000\000\004Z\000\246\004[\000\000\002\158\004\\\000\000\004[\000\000\002\158\004\\\000\000\000\000\000\000\001\025\000\000\000\000\001\015\001\029\001\030\000\000\000\000\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\n\180\000\000\000\000\000\000\000\000\000\000\n\175\n\182\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\001-\n\188\000\000\000\000\000\000\000\000\000\000\000\000\n\190\000\000\001\025\000\254\000\255\001\000\001\029\001\030\001\001\001-\000\246\n\201\000\000\000\000\000\000\000\000\000\000\000\000\n\203\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\254\000\255\001\000\000\000\001-\001\001\000\000\000\000\n\209\000\000\000\000\000\000\000\000\001D\000\000\n\211\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\n\217\000\000\001\015\000\254\000\255\001\000\000\000\n\219\001\001\000\000\001D\n\225\000\254\000\255\001\000\000\000\000\000\001\001\n\227\001\015\nq\000\000\n\183\001-\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\n\235\000\000\000\000\000\000\001\015\000\000\n\191\n\237\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001D\000\000\000\000\000\000\n\204\000\000\001\025\001\015\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\001\025\000\000\000\000\n\212\001\029\001\030\000\000\000\000\000\246\000\000\001\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\220\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\n\228\000\246\001\015\000\254\000\255\001\000\001-\000\000\001\001\001\025\000\000\n\243\000\000\001\029\001\030\000\000\000\000\000\246\n\245\000\000\001\025\000\000\n\238\001-\001\029\001\030\000\000\000\000\000\246\001\025\000\254\000\255\001\000\001\029\001\030\001\001\001D\000\246\n\253\000\000\000\000\001-\001\025\000\000\000\000\n\255\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001D\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\001-\011\005\000\000\000\000\000\254\000\255\001\000\001D\011\007\001\001\000\000\000\000\ny\000\254\000\255\001\000\001-\000\000\001\001\000\000\000\000\n\168\000\000\001\015\000\254\000\255\001\000\001-\000\000\001\001\001D\000\000\n\176\000\000\000\000\000\000\001-\000\000\000\000\000\254\000\255\001\000\000\000\n\246\001\001\000\000\001D\n\184\000\000\001-\001\015\000\254\000\255\001\000\000\000\000\000\001\001\001D\000\000\n\192\000\000\000\000\000\000\001\025\000\000\000\000\001D\001\029\001\030\000\000\011\000\000\246\000\000\000\254\000\255\001\000\000\000\001\015\001\001\001D\000\000\n\215\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\001\025\n\205\000\000\000\000\001\029\001\030\000\000\011\b\000\246\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\n\213\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\n\221\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001-\000\000\000\246\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\254\000\255\001\000\000\000\001-\001\001\001\025\001D\n\229\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\254\000\255\001\000\001-\000\000\001\001\001D\000\000\n\239\000\000\000\000\000\000\001\025\000\000\001-\000\000\001\029\001\030\000\000\000\000\000\246\000\000\001\025\001-\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\001D\001-\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\001D\000\000\000\246\001\025\000\000\001-\000\000\001\029\001\030\001D\000\000\000\246\000\000\000\254\000\255\001\000\000\000\001-\001\001\000\000\001D\n\247\000\000\000\000\000\000\000\000\000\254\000\255\001\000\000\000\000\000\001\001\000\000\000\000\011\001\001D\000\254\000\255\001\000\001-\000\000\001\001\000\000\000\000\011\t\000\000\000\000\001D\000\000\001-\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\n\231\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\001D\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\001\025\001-\000\000\001D\001\029\001\030\000\000\000\000\000\246\000\000\001\025\000\000\000\000\000\000\001\029\001\030\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D")) and semantic_action = [| @@ -1815,9 +1748,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4635 "parsing/parser.mly" +<<<<<<< HEAD +# 4918 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4922 "parsing/parser.mly" +||||||| 04da777f7 +# 4915 "parsing/parser.mly" +======= +# 4906 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "+" ) -# 1821 "parsing/parser.ml" +# 1754 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1840,9 +1783,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4636 "parsing/parser.mly" +<<<<<<< HEAD +# 4919 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4923 "parsing/parser.mly" +||||||| 04da777f7 +# 4916 "parsing/parser.mly" +======= +# 4907 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "+." ) -# 1846 "parsing/parser.ml" +# 1779 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1865,9 +1818,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 4093 "parsing/parser.mly" +<<<<<<< HEAD +# 4235 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4254 "parsing/parser.mly" +||||||| 04da777f7 +# 4247 "parsing/parser.mly" +======= +# 4238 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 1871 "parsing/parser.ml" +# 1804 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1903,7 +1866,7 @@ module Tables = struct }; }; } = _menhir_stack in - let tyvar : (string) = Obj.magic tyvar in + let tyvar : (Asttypes.label) = Obj.magic tyvar in let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let ty : (Parsetree.core_type) = Obj.magic ty in @@ -1912,24 +1875,44 @@ module Tables = struct let _endpos = _endpos_tyvar_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4096 "parsing/parser.mly" +<<<<<<< HEAD +# 4238 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4257 "parsing/parser.mly" +||||||| 04da777f7 +# 4250 "parsing/parser.mly" +======= +# 4241 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_alias(ty, tyvar) ) -# 1918 "parsing/parser.ml" +# 1851 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_tyvar_, _startpos_ty_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1927 "parsing/parser.ml" +# 1860 "parsing/parser.ml" in -# 4098 "parsing/parser.mly" +<<<<<<< HEAD +# 4240 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4259 "parsing/parser.mly" +||||||| 04da777f7 +# 4252 "parsing/parser.mly" +======= +# 4243 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 1933 "parsing/parser.ml" +# 1866 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1990,9 +1973,9 @@ module Tables = struct }; } = _menhir_stack in let _7 : unit = Obj.magic _7 in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in let _5 : unit = Obj.magic _5 in - let _2_inlined1 : (string) = Obj.magic _2_inlined1 in + let _2_inlined1 : (Asttypes.label) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -2003,19 +1986,35 @@ module Tables = struct let _v : (Parsetree.core_type) = let name = let _2 = _2_inlined1 in -# 3785 "parsing/parser.mly" +<<<<<<< HEAD +# 3945 "parsing/parser.mly" +||||||| 04da777f7 +# 3938 "parsing/parser.mly" +======= +# 3929 "parsing/parser.mly" +>>>>>>> origin/main ( Some _2 ) -# 2009 "parsing/parser.ml" +# 1942 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos_aliased_type_ in let _sloc = (_symbolstartpos, _endpos) in -# 4105 "parsing/parser.mly" +<<<<<<< HEAD +# 4247 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4266 "parsing/parser.mly" +||||||| 04da777f7 +# 4259 "parsing/parser.mly" +======= +# 4250 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) (Ltyp_alias { aliased_type; name; jkind }) ) -# 2019 "parsing/parser.ml" +# 1952 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2070,7 +2069,7 @@ module Tables = struct }; } = _menhir_stack in let _7 : unit = Obj.magic _7 in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in let _5 : unit = Obj.magic _5 in let _1 : unit = Obj.magic _1 in let _3 : unit = Obj.magic _3 in @@ -2080,18 +2079,34 @@ module Tables = struct let _startpos = _startpos_aliased_type_ in let _endpos = _endpos__7_ in let _v : (Parsetree.core_type) = let name = -# 3787 "parsing/parser.mly" +<<<<<<< HEAD +# 3947 "parsing/parser.mly" +||||||| 04da777f7 +# 3940 "parsing/parser.mly" +======= +# 3931 "parsing/parser.mly" +>>>>>>> origin/main ( None ) -# 2086 "parsing/parser.ml" +# 2019 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos_aliased_type_ in let _sloc = (_symbolstartpos, _endpos) in -# 4105 "parsing/parser.mly" +<<<<<<< HEAD +# 4247 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4266 "parsing/parser.mly" +||||||| 04da777f7 +# 4259 "parsing/parser.mly" +======= +# 4250 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) (Ltyp_alias { aliased_type; name; jkind }) ) -# 2095 "parsing/parser.ml" +# 2028 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2109,9 +2124,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = body_with_attrs2; + MenhirLib.EngineTypes.startp = _startpos_body_with_attrs2_; + MenhirLib.EngineTypes.endp = _endpos_body_with_attrs2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -2128,40 +2143,68 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = Obj.magic body in + let body_with_attrs2 : ((Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) * + Parsetree.attribute list) = Obj.magic body_with_attrs2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined2_ in - let _v : (let_binding) = let attrs2 = + let _v : (let_binding) = let attrs3 = let _1 = _1_inlined2 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2144 "parsing/parser.ml" +# 2078 "parsing/parser.ml" in - let _endpos_attrs2_ = _endpos__1_inlined2_ in + let _endpos_attrs3_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2153 "parsing/parser.ml" +# 2087 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in + let _endpos = _endpos_attrs3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3211 "parsing/parser.mly" +<<<<<<< HEAD +# 3201 "parsing/parser.mly" +||||||| 04da777f7 +# 3199 "parsing/parser.mly" +======= +# 3189 "parsing/parser.mly" +>>>>>>> origin/main ( - let attrs = attrs1 @ attrs2 in + let body, attrs2 = body_with_attrs2 in + let attrs = attrs1 @ attrs2 @ attrs3 in mklb ~loc:_sloc false body attrs ) -# 2165 "parsing/parser.ml" +# 2100 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2184,9 +2227,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4510 "parsing/parser.mly" +<<<<<<< HEAD +# 4790 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4794 "parsing/parser.mly" +||||||| 04da777f7 +# 4787 "parsing/parser.mly" +======= +# 4778 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2190 "parsing/parser.ml" +# 2125 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2204,14 +2257,240 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4511 "parsing/parser.mly" +<<<<<<< HEAD +# 4791 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4795 "parsing/parser.mly" +||||||| 04da777f7 +# 4788 "parsing/parser.mly" +======= +# 4779 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Lident _1 ) -# 2215 "parsing/parser.ml" +# 2150 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Mode.t) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4377 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4396 "parsing/parser.mly" +||||||| 04da777f7 +# 4389 "parsing/parser.mly" +======= +# 4380 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + mkloc _1 (make_loc _sloc) + ) +# 2189 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4383 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4402 "parsing/parser.mly" +||||||| 04da777f7 +# 4395 "parsing/parser.mly" +======= +# 4386 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + (_2) +# 2195 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Mode.t) = let _loc__2_ = (_startpos__2_, _endpos__2_) in + +<<<<<<< HEAD +# 4384 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4403 "parsing/parser.mly" +||||||| 04da777f7 +# 4396 "parsing/parser.mly" +======= +# 4387 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( expecting _loc__2_ "mode expression" ) +# 2228 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Mode.t) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4377 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4396 "parsing/parser.mly" +||||||| 04da777f7 +# 4389 "parsing/parser.mly" +======= +# 4380 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + mkloc _1 (make_loc _sloc) + ) +# 2267 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4400 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4419 "parsing/parser.mly" +||||||| 04da777f7 +# 4412 "parsing/parser.mly" +======= +# 4403 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + (_2) +# 2273 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Mode.t) = let _loc__2_ = (_startpos__2_, _endpos__2_) in + +<<<<<<< HEAD +# 4401 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4420 "parsing/parser.mly" +||||||| 04da777f7 +# 4413 "parsing/parser.mly" +======= +# 4404 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( expecting _loc__2_ "mode expression" ) +# 2306 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2248,9 +2527,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 4202 "parsing/parser.mly" +<<<<<<< HEAD +# 4478 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4482 "parsing/parser.mly" +||||||| 04da777f7 +# 4475 "parsing/parser.mly" +======= +# 4466 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _2 ) -# 2254 "parsing/parser.ml" +# 2345 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2301,7 +2590,7 @@ module Tables = struct let _5 : unit = Obj.magic _5 in let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -2313,11 +2602,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4282 "parsing/parser.mly" +<<<<<<< HEAD +# 4546 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 2321 "parsing/parser.ml" +# 2412 "parsing/parser.ml" in let _3 = @@ -2325,24 +2624,54 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2331 "parsing/parser.ml" +# 2422 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 2337 "parsing/parser.ml" +# 2428 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4204 "parsing/parser.mly" +<<<<<<< HEAD +# 4480 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4484 "parsing/parser.mly" +||||||| 04da777f7 +# 4477 "parsing/parser.mly" +======= +# 4468 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( wrap_typ_attrs ~loc:_sloc (reloc_typ ~loc:_sloc _4) _3 ) -# 2346 "parsing/parser.ml" +# 2437 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2366,31 +2695,51 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : (string) = Obj.magic _2 in + let _2 : (Asttypes.label) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4207 "parsing/parser.mly" +<<<<<<< HEAD +# 4483 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4487 "parsing/parser.mly" +||||||| 04da777f7 +# 4480 "parsing/parser.mly" +======= +# 4471 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_var _2 ) -# 2379 "parsing/parser.ml" +# 2470 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2388 "parsing/parser.ml" +# 2479 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2394 "parsing/parser.ml" +# 2485 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2414,23 +2763,43 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4209 "parsing/parser.mly" +<<<<<<< HEAD +# 4485 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4489 "parsing/parser.mly" +||||||| 04da777f7 +# 4482 "parsing/parser.mly" +======= +# 4473 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_any ) -# 2420 "parsing/parser.ml" +# 2511 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2428 "parsing/parser.ml" +# 2519 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2434 "parsing/parser.ml" +# 2525 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2442,23 +2811,16 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = let tid = @@ -2466,57 +2828,67 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2472 "parsing/parser.ml" +# 2556 "parsing/parser.ml" in let (_endpos_tid_, _startpos_tid_) = (_endpos__1_, _startpos__1_) in let tys = -# 4275 "parsing/parser.mly" +<<<<<<< HEAD +# 4539 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4543 "parsing/parser.mly" +||||||| 04da777f7 +# 4536 "parsing/parser.mly" +======= +# 4527 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( [] ) -# 2479 "parsing/parser.ml" +# 2563 "parsing/parser.ml" in - let (_endpos_tys_, _startpos_tys_) = (_endpos__0_, _endpos__0_) in - let _endpos = _endpos__3_ in - let _symbolstartpos = if _startpos_tys_ != _endpos_tys_ then - _startpos_tys_ - else - _startpos_tid_ in let _loc_tid_ = (_startpos_tid_, _endpos_tid_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _sloc = (_symbolstartpos, _endpos) in -# 4213 "parsing/parser.mly" - ( match tid.txt with - | Lident "float" -> - let ident_start = fst _loc_tid_ in - let hash_end = snd _loc__3_ in - unboxed_float_type (ident_start, hash_end) tys - | _ -> - (* CR layouts v2.1: We should avoid [not_expecting] in long-lived - code. When we support unboxed types other than float, we should - consider moving this check into the typechecker. - *) - not_expecting _sloc "Unboxed type other than float#" - ) -# 2504 "parsing/parser.ml" +<<<<<<< HEAD +# 4488 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4492 "parsing/parser.mly" +||||||| 04da777f7 +# 4485 "parsing/parser.mly" +======= +# 4476 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( unboxed_type _loc_tid_ tid.txt tys ) +# 2569 "parsing/parser.ml" in - let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2514 "parsing/parser.ml" +# 2578 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2520 "parsing/parser.ml" +# 2584 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2529,29 +2901,22 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in let _1 : (Longident.t) = Obj.magic _1 in let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_ty_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = let tid = @@ -2559,57 +2924,68 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2565 "parsing/parser.ml" +# 2622 "parsing/parser.ml" in let (_endpos_tid_, _startpos_tid_) = (_endpos__1_, _startpos__1_) in let tys = -# 4277 "parsing/parser.mly" +<<<<<<< HEAD +# 4541 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4545 "parsing/parser.mly" +||||||| 04da777f7 +# 4538 "parsing/parser.mly" +======= +# 4529 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( [ty] ) -# 2572 "parsing/parser.ml" +# 2629 "parsing/parser.ml" in - let (_endpos_tys_, _startpos_tys_) = (_endpos_ty_, _startpos_ty_) in - let _endpos = _endpos__3_ in - let _symbolstartpos = if _startpos_tys_ != _endpos_tys_ then - _startpos_tys_ - else - _startpos_tid_ in let _loc_tid_ = (_startpos_tid_, _endpos_tid_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _sloc = (_symbolstartpos, _endpos) in -# 4213 "parsing/parser.mly" - ( match tid.txt with - | Lident "float" -> - let ident_start = fst _loc_tid_ in - let hash_end = snd _loc__3_ in - unboxed_float_type (ident_start, hash_end) tys - | _ -> - (* CR layouts v2.1: We should avoid [not_expecting] in long-lived - code. When we support unboxed types other than float, we should - consider moving this check into the typechecker. - *) - not_expecting _sloc "Unboxed type other than float#" - ) -# 2597 "parsing/parser.ml" +<<<<<<< HEAD +# 4488 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4492 "parsing/parser.mly" +||||||| 04da777f7 +# 4485 "parsing/parser.mly" +======= +# 4476 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( unboxed_type _loc_tid_ tid.txt tys ) +# 2635 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_ty_) in + let _startpos__1_ = _startpos_ty_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2607 "parsing/parser.ml" +# 2645 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2613 "parsing/parser.ml" +# 2651 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2622,43 +2998,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3_inlined1; - MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in - let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let _3 : unit = Obj.magic _3 in let xs : (Parsetree.core_type list) = Obj.magic xs in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = let tid = @@ -2667,9 +3036,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2673 "parsing/parser.ml" +# 2704 "parsing/parser.ml" in let (_endpos_tid_, _startpos_tid_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in @@ -2678,60 +3047,71 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2682 "parsing/parser.ml" +# 2713 "parsing/parser.ml" in -# 1467 "parsing/parser.mly" +# 1380 "parsing/parser.mly" ( xs ) -# 2687 "parsing/parser.ml" +# 2718 "parsing/parser.ml" in -# 4279 "parsing/parser.mly" +<<<<<<< HEAD +# 4543 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4547 "parsing/parser.mly" +||||||| 04da777f7 +# 4540 "parsing/parser.mly" +======= +# 4531 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( tys ) -# 2693 "parsing/parser.ml" +# 2724 "parsing/parser.ml" in - let (_endpos_tys_, _startpos_tys_) = (_endpos__3_inlined1_, _startpos__1_) in - let _endpos = _endpos__3_ in - let _symbolstartpos = if _startpos_tys_ != _endpos_tys_ then - _startpos_tys_ - else - _startpos_tid_ in let _loc_tid_ = (_startpos_tid_, _endpos_tid_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _sloc = (_symbolstartpos, _endpos) in -# 4213 "parsing/parser.mly" - ( match tid.txt with - | Lident "float" -> - let ident_start = fst _loc_tid_ in - let hash_end = snd _loc__3_ in - unboxed_float_type (ident_start, hash_end) tys - | _ -> - (* CR layouts v2.1: We should avoid [not_expecting] in long-lived - code. When we support unboxed types other than float, we should - consider moving this check into the typechecker. - *) - not_expecting _sloc "Unboxed type other than float#" - ) -# 2719 "parsing/parser.ml" +<<<<<<< HEAD +# 4488 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4492 "parsing/parser.mly" +||||||| 04da777f7 +# 4485 "parsing/parser.mly" +======= +# 4476 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( unboxed_type _loc_tid_ tid.txt tys ) +# 2731 "parsing/parser.ml" in - let _endpos__1_ = _endpos__3_ in + let _endpos__1_ = _endpos__1_inlined1_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2729 "parsing/parser.ml" +# 2741 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2735 "parsing/parser.ml" +# 2747 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2760,35 +3140,65 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2766 "parsing/parser.ml" +# 2778 "parsing/parser.ml" in let tys = -# 4275 "parsing/parser.mly" +<<<<<<< HEAD +# 4539 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4543 "parsing/parser.mly" +||||||| 04da777f7 +# 4536 "parsing/parser.mly" +======= +# 4527 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( [] ) -# 2772 "parsing/parser.ml" +# 2784 "parsing/parser.ml" in -# 4227 "parsing/parser.mly" +<<<<<<< HEAD +# 4491 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4495 "parsing/parser.mly" +||||||| 04da777f7 +# 4488 "parsing/parser.mly" +======= +# 4479 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_constr(tid, tys) ) -# 2777 "parsing/parser.ml" +# 2789 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2786 "parsing/parser.ml" +# 2798 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2792 "parsing/parser.ml" +# 2804 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2824,20 +3234,40 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2830 "parsing/parser.ml" +# 2842 "parsing/parser.ml" in let tys = -# 4277 "parsing/parser.mly" +<<<<<<< HEAD +# 4541 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4545 "parsing/parser.mly" +||||||| 04da777f7 +# 4538 "parsing/parser.mly" +======= +# 4529 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( [ty] ) -# 2836 "parsing/parser.ml" +# 2848 "parsing/parser.ml" in -# 4227 "parsing/parser.mly" +<<<<<<< HEAD +# 4491 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4495 "parsing/parser.mly" +||||||| 04da777f7 +# 4488 "parsing/parser.mly" +======= +# 4479 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_constr(tid, tys) ) -# 2841 "parsing/parser.ml" +# 2853 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -2845,15 +3275,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2851 "parsing/parser.ml" +# 2863 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2857 "parsing/parser.ml" +# 2869 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2904,9 +3344,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2910 "parsing/parser.ml" +# 2922 "parsing/parser.ml" in let tys = @@ -2914,24 +3354,44 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2918 "parsing/parser.ml" +# 2930 "parsing/parser.ml" in -# 1467 "parsing/parser.mly" +# 1380 "parsing/parser.mly" ( xs ) -# 2923 "parsing/parser.ml" +# 2935 "parsing/parser.ml" in -# 4279 "parsing/parser.mly" +<<<<<<< HEAD +# 4543 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4547 "parsing/parser.mly" +||||||| 04da777f7 +# 4540 "parsing/parser.mly" +======= +# 4531 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( tys ) -# 2929 "parsing/parser.ml" +# 2941 "parsing/parser.ml" in -# 4227 "parsing/parser.mly" +<<<<<<< HEAD +# 4491 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4495 "parsing/parser.mly" +||||||| 04da777f7 +# 4488 "parsing/parser.mly" +======= +# 4479 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_constr(tid, tys) ) -# 2935 "parsing/parser.ml" +# 2947 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -2939,15 +3399,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2945 "parsing/parser.ml" +# 2957 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 2951 "parsing/parser.ml" +# 2963 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2985,24 +3455,44 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4229 "parsing/parser.mly" +<<<<<<< HEAD +# 4493 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4497 "parsing/parser.mly" +||||||| 04da777f7 +# 4490 "parsing/parser.mly" +======= +# 4481 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( let (f, c) = _2 in Ptyp_object (f, c) ) -# 2991 "parsing/parser.ml" +# 3003 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3000 "parsing/parser.ml" +# 3012 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3006 "parsing/parser.ml" +# 3018 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3033,24 +3523,44 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4231 "parsing/parser.mly" +<<<<<<< HEAD +# 4495 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4499 "parsing/parser.mly" +||||||| 04da777f7 +# 4492 "parsing/parser.mly" +======= +# 4483 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_object ([], Closed) ) -# 3039 "parsing/parser.ml" +# 3051 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3048 "parsing/parser.ml" +# 3060 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3054 "parsing/parser.ml" +# 3066 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3086,20 +3596,40 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 3092 "parsing/parser.ml" +# 3104 "parsing/parser.ml" in let tys = -# 4275 "parsing/parser.mly" +<<<<<<< HEAD +# 4539 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4543 "parsing/parser.mly" +||||||| 04da777f7 +# 4536 "parsing/parser.mly" +======= +# 4527 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( [] ) -# 3098 "parsing/parser.ml" +# 3110 "parsing/parser.ml" in -# 4235 "parsing/parser.mly" +<<<<<<< HEAD +# 4499 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4503 "parsing/parser.mly" +||||||| 04da777f7 +# 4496 "parsing/parser.mly" +======= +# 4487 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_class(cid, tys) ) -# 3103 "parsing/parser.ml" +# 3115 "parsing/parser.ml" in let _startpos__1_ = _startpos__2_ in @@ -3107,15 +3637,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3113 "parsing/parser.ml" +# 3125 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3119 "parsing/parser.ml" +# 3131 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3158,20 +3698,40 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 3164 "parsing/parser.ml" +# 3176 "parsing/parser.ml" in let tys = -# 4277 "parsing/parser.mly" +<<<<<<< HEAD +# 4541 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4545 "parsing/parser.mly" +||||||| 04da777f7 +# 4538 "parsing/parser.mly" +======= +# 4529 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( [ty] ) -# 3170 "parsing/parser.ml" +# 3182 "parsing/parser.ml" in -# 4235 "parsing/parser.mly" +<<<<<<< HEAD +# 4499 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4503 "parsing/parser.mly" +||||||| 04da777f7 +# 4496 "parsing/parser.mly" +======= +# 4487 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_class(cid, tys) ) -# 3175 "parsing/parser.ml" +# 3187 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -3179,15 +3739,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3185 "parsing/parser.ml" +# 3197 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3191 "parsing/parser.ml" +# 3203 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3245,9 +3815,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 3251 "parsing/parser.ml" +# 3263 "parsing/parser.ml" in let tys = @@ -3255,24 +3825,44 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3259 "parsing/parser.ml" +# 3271 "parsing/parser.ml" in -# 1467 "parsing/parser.mly" +# 1380 "parsing/parser.mly" ( xs ) -# 3264 "parsing/parser.ml" +# 3276 "parsing/parser.ml" in -# 4279 "parsing/parser.mly" +<<<<<<< HEAD +# 4543 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4547 "parsing/parser.mly" +||||||| 04da777f7 +# 4540 "parsing/parser.mly" +======= +# 4531 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( tys ) -# 3270 "parsing/parser.ml" +# 3282 "parsing/parser.ml" in -# 4235 "parsing/parser.mly" +<<<<<<< HEAD +# 4499 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4503 "parsing/parser.mly" +||||||| 04da777f7 +# 4496 "parsing/parser.mly" +======= +# 4487 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_class(cid, tys) ) -# 3276 "parsing/parser.ml" +# 3288 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -3280,15 +3870,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3286 "parsing/parser.ml" +# 3298 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3292 "parsing/parser.ml" +# 3304 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3326,24 +3926,44 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4238 "parsing/parser.mly" +<<<<<<< HEAD +# 4502 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4506 "parsing/parser.mly" +||||||| 04da777f7 +# 4499 "parsing/parser.mly" +======= +# 4490 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_variant([_2], Closed, None) ) -# 3332 "parsing/parser.ml" +# 3344 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3341 "parsing/parser.ml" +# 3353 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3347 "parsing/parser.ml" +# 3359 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3393,24 +4013,44 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3397 "parsing/parser.ml" +# 3409 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 3402 "parsing/parser.ml" +# 3414 "parsing/parser.ml" in -# 4288 "parsing/parser.mly" +<<<<<<< HEAD +# 4552 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4556 "parsing/parser.mly" +||||||| 04da777f7 +# 4549 "parsing/parser.mly" +======= +# 4540 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3408 "parsing/parser.ml" +# 3420 "parsing/parser.ml" in -# 4240 "parsing/parser.mly" +<<<<<<< HEAD +# 4504 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4508 "parsing/parser.mly" +||||||| 04da777f7 +# 4501 "parsing/parser.mly" +======= +# 4492 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_variant(_3, Closed, None) ) -# 3414 "parsing/parser.ml" +# 3426 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -3418,15 +4058,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3424 "parsing/parser.ml" +# 3436 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3430 "parsing/parser.ml" +# 3442 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3483,24 +4133,44 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3487 "parsing/parser.ml" +# 3499 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 3492 "parsing/parser.ml" +# 3504 "parsing/parser.ml" in -# 4288 "parsing/parser.mly" +<<<<<<< HEAD +# 4552 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4556 "parsing/parser.mly" +||||||| 04da777f7 +# 4549 "parsing/parser.mly" +======= +# 4540 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3498 "parsing/parser.ml" +# 3510 "parsing/parser.ml" in -# 4242 "parsing/parser.mly" +<<<<<<< HEAD +# 4506 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4510 "parsing/parser.mly" +||||||| 04da777f7 +# 4503 "parsing/parser.mly" +======= +# 4494 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_variant(_2 :: _4, Closed, None) ) -# 3504 "parsing/parser.ml" +# 3516 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -3508,15 +4178,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3514 "parsing/parser.ml" +# 3526 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3520 "parsing/parser.ml" +# 3532 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3566,24 +4246,44 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3570 "parsing/parser.ml" +# 3582 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 3575 "parsing/parser.ml" +# 3587 "parsing/parser.ml" in -# 4288 "parsing/parser.mly" +<<<<<<< HEAD +# 4552 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4556 "parsing/parser.mly" +||||||| 04da777f7 +# 4549 "parsing/parser.mly" +======= +# 4540 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3581 "parsing/parser.ml" +# 3593 "parsing/parser.ml" in -# 4244 "parsing/parser.mly" +<<<<<<< HEAD +# 4508 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4512 "parsing/parser.mly" +||||||| 04da777f7 +# 4505 "parsing/parser.mly" +======= +# 4496 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_variant(_3, Open, None) ) -# 3587 "parsing/parser.ml" +# 3599 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -3591,15 +4291,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3597 "parsing/parser.ml" +# 3609 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3603 "parsing/parser.ml" +# 3615 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3630,24 +4340,44 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4246 "parsing/parser.mly" +<<<<<<< HEAD +# 4510 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4514 "parsing/parser.mly" +||||||| 04da777f7 +# 4507 "parsing/parser.mly" +======= +# 4498 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_variant([], Open, None) ) -# 3636 "parsing/parser.ml" +# 3648 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3645 "parsing/parser.ml" +# 3657 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3651 "parsing/parser.ml" +# 3663 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3697,24 +4427,44 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3701 "parsing/parser.ml" +# 3713 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 3706 "parsing/parser.ml" +# 3718 "parsing/parser.ml" in -# 4288 "parsing/parser.mly" +<<<<<<< HEAD +# 4552 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4556 "parsing/parser.mly" +||||||| 04da777f7 +# 4549 "parsing/parser.mly" +======= +# 4540 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3712 "parsing/parser.ml" +# 3724 "parsing/parser.ml" in -# 4248 "parsing/parser.mly" +<<<<<<< HEAD +# 4512 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4516 "parsing/parser.mly" +||||||| 04da777f7 +# 4509 "parsing/parser.mly" +======= +# 4500 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_variant(_3, Closed, Some []) ) -# 3718 "parsing/parser.ml" +# 3730 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -3722,15 +4472,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3728 "parsing/parser.ml" +# 3740 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3734 "parsing/parser.ml" +# 3746 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3779,7 +4539,7 @@ module Tables = struct }; } = _menhir_stack in let _6 : unit = Obj.magic _6 in - let xs_inlined1 : (string list) = Obj.magic xs_inlined1 in + let xs_inlined1 : (Asttypes.label list) = Obj.magic xs_inlined1 in let _4 : unit = Obj.magic _4 in let xs : (Parsetree.row_field list) = Obj.magic xs in let _2 : (unit option) = Obj.magic _2 in @@ -3795,18 +4555,28 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3799 "parsing/parser.ml" +# 3811 "parsing/parser.ml" in -# 1387 "parsing/parser.mly" +# 1300 "parsing/parser.mly" ( xs ) -# 3804 "parsing/parser.ml" +# 3816 "parsing/parser.ml" in -# 4316 "parsing/parser.mly" +<<<<<<< HEAD +# 4580 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4584 "parsing/parser.mly" +||||||| 04da777f7 +# 4577 "parsing/parser.mly" +======= +# 4568 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3810 "parsing/parser.ml" +# 3822 "parsing/parser.ml" in let _3 = @@ -3814,24 +4584,44 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3818 "parsing/parser.ml" +# 3830 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 3823 "parsing/parser.ml" +# 3835 "parsing/parser.ml" in -# 4288 "parsing/parser.mly" +<<<<<<< HEAD +# 4552 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4556 "parsing/parser.mly" +||||||| 04da777f7 +# 4549 "parsing/parser.mly" +======= +# 4540 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3829 "parsing/parser.ml" +# 3841 "parsing/parser.ml" in -# 4250 "parsing/parser.mly" +<<<<<<< HEAD +# 4514 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +||||||| 04da777f7 +# 4511 "parsing/parser.mly" +======= +# 4502 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_variant(_3, Closed, Some _5) ) -# 3835 "parsing/parser.ml" +# 3847 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -3839,15 +4629,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3845 "parsing/parser.ml" +# 3857 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3851 "parsing/parser.ml" +# 3863 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3871,23 +4671,43 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 4252 "parsing/parser.mly" +<<<<<<< HEAD +# 4516 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4520 "parsing/parser.mly" +||||||| 04da777f7 +# 4513 "parsing/parser.mly" +======= +# 4504 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ptyp_extension _1 ) -# 3877 "parsing/parser.ml" +# 3889 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3885 "parsing/parser.ml" +# 3897 "parsing/parser.ml" in -# 4254 "parsing/parser.mly" +<<<<<<< HEAD +# 4518 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4522 "parsing/parser.mly" +||||||| 04da777f7 +# 4515 "parsing/parser.mly" +======= +# 4506 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 3891 "parsing/parser.ml" +# 3903 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3936,9 +4756,9 @@ module Tables = struct }; } = _menhir_stack in let _6 : unit = Obj.magic _6 in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in let _4 : unit = Obj.magic _4 in - let name : (string) = Obj.magic name in + let name : (Asttypes.label) = Obj.magic name in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -3948,10 +4768,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4256 "parsing/parser.mly" +<<<<<<< HEAD +# 4520 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4524 "parsing/parser.mly" +||||||| 04da777f7 +# 4517 "parsing/parser.mly" +======= +# 4508 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) @@ Ltyp_var { name = Some name; jkind } ) -# 3955 "parsing/parser.ml" +# 3967 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3994,7 +4824,7 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in @@ -4005,10 +4835,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4259 "parsing/parser.mly" +<<<<<<< HEAD +# 4523 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4527 "parsing/parser.mly" +||||||| 04da777f7 +# 4520 "parsing/parser.mly" +======= +# 4511 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) @@ Ltyp_var { name = None; jkind } ) -# 4012 "parsing/parser.ml" +# 4024 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4032,23 +4872,43 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Ast_helper.str) = let _1 = let _1 = -# 4703 "parsing/parser.mly" +<<<<<<< HEAD +# 4986 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4990 "parsing/parser.mly" +||||||| 04da777f7 +# 4983 "parsing/parser.mly" +======= +# 4974 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4038 "parsing/parser.ml" +# 4050 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1312 "parsing/parser.mly" +# 1225 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 4046 "parsing/parser.ml" +# 4058 "parsing/parser.ml" in -# 4705 "parsing/parser.mly" +<<<<<<< HEAD +# 4988 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4992 "parsing/parser.mly" +||||||| 04da777f7 +# 4985 "parsing/parser.mly" +======= +# 4976 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4052 "parsing/parser.ml" +# 4064 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4086,24 +4946,44 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Ast_helper.str) = let _1 = let _1 = -# 4704 "parsing/parser.mly" +<<<<<<< HEAD +# 4987 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4991 "parsing/parser.mly" +||||||| 04da777f7 +# 4984 "parsing/parser.mly" +======= +# 4975 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ^ "." ^ _3.txt ) -# 4092 "parsing/parser.ml" +# 4104 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1312 "parsing/parser.mly" +# 1225 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 4101 "parsing/parser.ml" +# 4113 "parsing/parser.ml" in -# 4705 "parsing/parser.mly" +<<<<<<< HEAD +# 4988 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4992 "parsing/parser.mly" +||||||| 04da777f7 +# 4985 "parsing/parser.mly" +======= +# 4976 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4107 "parsing/parser.ml" +# 4119 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4126,11 +5006,21 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.payload) = -# 4760 "parsing/parser.mly" +<<<<<<< HEAD +# 5043 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5047 "parsing/parser.mly" +||||||| 04da777f7 +# 5040 "parsing/parser.mly" +======= +# 5031 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Builtin_attributes.mark_payload_attrs_used _1; _1 ) -# 4134 "parsing/parser.ml" +# 4146 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4177,9 +5067,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4709 "parsing/parser.mly" +<<<<<<< HEAD +# 4992 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4996 "parsing/parser.mly" +||||||| 04da777f7 +# 4989 "parsing/parser.mly" +======= +# 4980 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) -# 4183 "parsing/parser.ml" +# 4195 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4202,9 +5102,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = -# 2327 "parsing/parser.mly" +<<<<<<< HEAD +# 2264 "parsing/parser.mly" +||||||| 04da777f7 +# 2262 "parsing/parser.mly" +======= +# 2252 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 4208 "parsing/parser.ml" +# 4220 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4243,18 +5149,34 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4249 "parsing/parser.ml" +# 4261 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2329 "parsing/parser.mly" +<<<<<<< HEAD +# 2266 "parsing/parser.mly" +||||||| 04da777f7 +# 2264 "parsing/parser.mly" +======= +# 2254 "parsing/parser.mly" +>>>>>>> origin/main ( wrap_class_attrs ~loc:_sloc _3 _2 ) -# 4258 "parsing/parser.ml" +# 4270 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4294,9 +5216,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2331 "parsing/parser.mly" +<<<<<<< HEAD +# 2268 "parsing/parser.mly" +||||||| 04da777f7 +# 2266 "parsing/parser.mly" +======= +# 2256 "parsing/parser.mly" +>>>>>>> origin/main ( class_of_let_bindings ~loc:_sloc _1 _3 ) -# 4300 "parsing/parser.ml" +# 4312 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4359,34 +5287,60 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4365 "parsing/parser.ml" +# 4377 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4374 "parsing/parser.ml" +# 4386 "parsing/parser.ml" in let _3 = -# 4627 "parsing/parser.mly" +<<<<<<< HEAD +# 4910 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Fresh ) -# 4380 "parsing/parser.ml" +# 4392 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2333 "parsing/parser.mly" +<<<<<<< HEAD +# 2270 "parsing/parser.mly" +||||||| 04da777f7 +# 2268 "parsing/parser.mly" +======= +# 2258 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 4390 "parsing/parser.ml" +# 4402 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4456,34 +5410,60 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4462 "parsing/parser.ml" +# 4474 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4471 "parsing/parser.ml" +# 4483 "parsing/parser.ml" in let _3 = -# 4628 "parsing/parser.mly" +<<<<<<< HEAD +# 4911 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Override ) -# 4477 "parsing/parser.ml" +# 4489 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2333 "parsing/parser.mly" +<<<<<<< HEAD +# 2270 "parsing/parser.mly" +||||||| 04da777f7 +# 2268 "parsing/parser.mly" +======= +# 2258 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 4487 "parsing/parser.ml" +# 4499 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4513,9 +5493,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 2337 "parsing/parser.mly" +<<<<<<< HEAD +# 2274 "parsing/parser.mly" +||||||| 04da777f7 +# 2272 "parsing/parser.mly" +======= +# 2262 "parsing/parser.mly" +>>>>>>> origin/main ( Cl.attr _1 _2 ) -# 4519 "parsing/parser.ml" +# 4531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4539,7 +5525,7 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : ((Asttypes.arg_label * Parsetree.expression) list) = Obj.magic xs in + let xs : ((Parsetree.arg_label * Parsetree.expression) list) = Obj.magic xs in let _1 : (Parsetree.class_expr) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -4550,18 +5536,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 4554 "parsing/parser.ml" +# 4566 "parsing/parser.ml" in -# 1387 "parsing/parser.mly" +# 1300 "parsing/parser.mly" ( xs ) -# 4559 "parsing/parser.ml" +# 4571 "parsing/parser.ml" in -# 2340 "parsing/parser.mly" +<<<<<<< HEAD +# 2277 "parsing/parser.mly" +||||||| 04da777f7 +# 2275 "parsing/parser.mly" +======= +# 2265 "parsing/parser.mly" +>>>>>>> origin/main ( Pcl_apply(_1, _2) ) -# 4565 "parsing/parser.ml" +# 4577 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -4569,15 +5561,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4575 "parsing/parser.ml" +# 4587 "parsing/parser.ml" in -# 2343 "parsing/parser.mly" +<<<<<<< HEAD +# 2280 "parsing/parser.mly" +||||||| 04da777f7 +# 2278 "parsing/parser.mly" +======= +# 2268 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 4581 "parsing/parser.ml" +# 4593 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4601,23 +5599,35 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2342 "parsing/parser.mly" +<<<<<<< HEAD +# 2279 "parsing/parser.mly" +||||||| 04da777f7 +# 2277 "parsing/parser.mly" +======= +# 2267 "parsing/parser.mly" +>>>>>>> origin/main ( Pcl_extension _1 ) -# 4607 "parsing/parser.ml" +# 4619 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4615 "parsing/parser.ml" +# 4627 "parsing/parser.ml" in -# 2343 "parsing/parser.mly" +<<<<<<< HEAD +# 2280 "parsing/parser.mly" +||||||| 04da777f7 +# 2278 "parsing/parser.mly" +======= +# 2268 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 4621 "parsing/parser.ml" +# 4633 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4660,7 +5670,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let self : (string Location.loc option) = Obj.magic self in + let self : (string Asttypes.loc option) = Obj.magic self in let _4 : (Parsetree.class_expr) = Obj.magic _4 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -4670,33 +5680,69 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined2 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4676 "parsing/parser.ml" +# 4688 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4685 "parsing/parser.ml" +# 4697 "parsing/parser.ml" in let _2 = -# 4627 "parsing/parser.mly" +<<<<<<< HEAD +# 4910 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Fresh ) -# 4691 "parsing/parser.ml" +# 4703 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2392 "parsing/parser.mly" +<<<<<<< HEAD +# 2329 "parsing/parser.mly" +||||||| 04da777f7 +# 2327 "parsing/parser.mly" +======= +# 2317 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 4700 "parsing/parser.ml" +# 4712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4745,7 +5791,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let self : (string Location.loc option) = Obj.magic self in + let self : (string Asttypes.loc option) = Obj.magic self in let _4 : (Parsetree.class_expr) = Obj.magic _4 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in @@ -4756,33 +5802,69 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined3 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4762 "parsing/parser.ml" +# 4774 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _3 = let _1 = _1_inlined2 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4771 "parsing/parser.ml" +# 4783 "parsing/parser.ml" in let _2 = -# 4628 "parsing/parser.mly" +<<<<<<< HEAD +# 4911 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Override ) -# 4777 "parsing/parser.ml" +# 4789 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2392 "parsing/parser.mly" +<<<<<<< HEAD +# 2329 "parsing/parser.mly" +||||||| 04da777f7 +# 2327 "parsing/parser.mly" +======= +# 2317 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 4786 "parsing/parser.ml" +# 4798 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4813,7 +5895,8 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : ((string Location.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * + let _2 : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * + Parsetree.class_field_kind) * Parsetree.attributes) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -4822,9 +5905,19 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4828 "parsing/parser.ml" +# 4841 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -4832,11 +5925,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2395 "parsing/parser.mly" +<<<<<<< HEAD +# 2332 "parsing/parser.mly" +||||||| 04da777f7 +# 2330 "parsing/parser.mly" +======= +# 2320 "parsing/parser.mly" +>>>>>>> origin/main ( let v, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_val v) ~attrs:(attrs@_3) ~docs ) -# 4840 "parsing/parser.ml" +# 4853 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4867,7 +5966,8 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * + let _2 : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * Parsetree.attributes) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -4876,9 +5976,19 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4882 "parsing/parser.ml" +# 4896 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -4886,11 +5996,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2399 "parsing/parser.mly" +<<<<<<< HEAD +# 2336 "parsing/parser.mly" +||||||| 04da777f7 +# 2334 "parsing/parser.mly" +======= +# 2324 "parsing/parser.mly" +>>>>>>> origin/main ( let meth, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_method meth) ~attrs:(attrs@_3) ~docs ) -# 4894 "parsing/parser.ml" +# 4908 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4936,28 +6052,54 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4942 "parsing/parser.ml" +# 4956 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 4951 "parsing/parser.ml" +# 4965 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2403 "parsing/parser.mly" +<<<<<<< HEAD +# 2340 "parsing/parser.mly" +||||||| 04da777f7 +# 2338 "parsing/parser.mly" +======= +# 2328 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 4961 "parsing/parser.ml" +# 4975 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5003,28 +6145,54 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5009 "parsing/parser.ml" +# 5023 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5018 "parsing/parser.ml" +# 5032 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2406 "parsing/parser.mly" +<<<<<<< HEAD +# 2343 "parsing/parser.mly" +||||||| 04da777f7 +# 2341 "parsing/parser.mly" +======= +# 2331 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_initializer _3) ~attrs:(_2@_4) ~docs ) -# 5028 "parsing/parser.ml" +# 5042 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5056,9 +6224,19 @@ module Tables = struct let _v : (Parsetree.class_field) = let _2 = let _1 = _1_inlined1 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5062 "parsing/parser.ml" +# 5076 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -5066,10 +6244,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2409 "parsing/parser.mly" +<<<<<<< HEAD +# 2346 "parsing/parser.mly" +||||||| 04da777f7 +# 2344 "parsing/parser.mly" +======= +# 2334 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_extension _1) ~attrs:_2 ~docs ) -# 5073 "parsing/parser.ml" +# 5087 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5093,23 +6277,35 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_field) = let _1 = let _1 = -# 2412 "parsing/parser.mly" +<<<<<<< HEAD +# 2349 "parsing/parser.mly" +||||||| 04da777f7 +# 2347 "parsing/parser.mly" +======= +# 2337 "parsing/parser.mly" +>>>>>>> origin/main ( Pcf_attribute _1 ) -# 5099 "parsing/parser.ml" +# 5113 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1333 "parsing/parser.mly" +# 1246 "parsing/parser.mly" ( mkcf ~loc:_sloc _1 ) -# 5107 "parsing/parser.ml" +# 5121 "parsing/parser.ml" in -# 2413 "parsing/parser.mly" +<<<<<<< HEAD +# 2350 "parsing/parser.mly" +||||||| 04da777f7 +# 2348 "parsing/parser.mly" +======= +# 2338 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 5113 "parsing/parser.ml" +# 5127 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5139,9 +6335,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 2307 "parsing/parser.mly" +<<<<<<< HEAD +# 2244 "parsing/parser.mly" +||||||| 04da777f7 +# 2242 "parsing/parser.mly" +======= +# 2232 "parsing/parser.mly" +>>>>>>> origin/main ( _2 ) -# 5145 "parsing/parser.ml" +# 5159 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5186,24 +6388,36 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2310 "parsing/parser.mly" +<<<<<<< HEAD +# 2247 "parsing/parser.mly" +||||||| 04da777f7 +# 2245 "parsing/parser.mly" +======= +# 2235 "parsing/parser.mly" +>>>>>>> origin/main ( Pcl_constraint(_4, _2) ) -# 5192 "parsing/parser.ml" +# 5206 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5201 "parsing/parser.ml" +# 5215 "parsing/parser.ml" in -# 2313 "parsing/parser.mly" +<<<<<<< HEAD +# 2250 "parsing/parser.mly" +||||||| 04da777f7 +# 2248 "parsing/parser.mly" +======= +# 2238 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 5207 "parsing/parser.ml" +# 5221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5228,30 +6442,42 @@ module Tables = struct }; } = _menhir_stack in let _2 : (Parsetree.class_expr) = Obj.magic _2 in - let _1 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2312 "parsing/parser.mly" +<<<<<<< HEAD +# 2249 "parsing/parser.mly" +||||||| 04da777f7 +# 2247 "parsing/parser.mly" +======= +# 2237 "parsing/parser.mly" +>>>>>>> origin/main ( let (l,o,p) = _1 in Pcl_fun(l, o, p, _2) ) -# 5240 "parsing/parser.ml" +# 5254 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5249 "parsing/parser.ml" +# 5263 "parsing/parser.ml" in -# 2313 "parsing/parser.mly" +<<<<<<< HEAD +# 2250 "parsing/parser.mly" +||||||| 04da777f7 +# 2248 "parsing/parser.mly" +======= +# 2238 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 5255 "parsing/parser.ml" +# 5269 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5283,30 +6509,42 @@ module Tables = struct } = _menhir_stack in let e : (Parsetree.class_expr) = Obj.magic e in let _2 : unit = Obj.magic _2 in - let _1 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2368 "parsing/parser.mly" +<<<<<<< HEAD +# 2305 "parsing/parser.mly" +||||||| 04da777f7 +# 2303 "parsing/parser.mly" +======= +# 2293 "parsing/parser.mly" +>>>>>>> origin/main ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 5295 "parsing/parser.ml" +# 5309 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5304 "parsing/parser.ml" +# 5318 "parsing/parser.ml" in -# 2369 "parsing/parser.mly" +<<<<<<< HEAD +# 2306 "parsing/parser.mly" +||||||| 04da777f7 +# 2304 "parsing/parser.mly" +======= +# 2294 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 5310 "parsing/parser.ml" +# 5324 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5331,30 +6569,42 @@ module Tables = struct }; } = _menhir_stack in let e : (Parsetree.class_expr) = Obj.magic e in - let _1 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2368 "parsing/parser.mly" +<<<<<<< HEAD +# 2305 "parsing/parser.mly" +||||||| 04da777f7 +# 2303 "parsing/parser.mly" +======= +# 2293 "parsing/parser.mly" +>>>>>>> origin/main ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 5343 "parsing/parser.ml" +# 5357 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5352 "parsing/parser.ml" +# 5366 "parsing/parser.ml" in -# 2369 "parsing/parser.mly" +<<<<<<< HEAD +# 2306 "parsing/parser.mly" +||||||| 04da777f7 +# 2304 "parsing/parser.mly" +======= +# 2294 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 5358 "parsing/parser.ml" +# 5372 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5377,9 +6627,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4500 "parsing/parser.mly" +<<<<<<< HEAD +# 4780 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4784 "parsing/parser.mly" +||||||| 04da777f7 +# 4777 "parsing/parser.mly" +======= +# 4768 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5383 "parsing/parser.ml" +# 5397 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5419,9 +6679,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2377 "parsing/parser.mly" +<<<<<<< HEAD +# 2314 "parsing/parser.mly" +||||||| 04da777f7 +# 2312 "parsing/parser.mly" +======= +# 2302 "parsing/parser.mly" +>>>>>>> origin/main ( reloc_pat ~loc:_sloc _2 ) -# 5425 "parsing/parser.ml" +# 5439 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5473,24 +6739,36 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2379 "parsing/parser.mly" +<<<<<<< HEAD +# 2316 "parsing/parser.mly" +||||||| 04da777f7 +# 2314 "parsing/parser.mly" +======= +# 2304 "parsing/parser.mly" +>>>>>>> origin/main ( Ppat_constraint(_2, _4) ) -# 5479 "parsing/parser.ml" +# 5493 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" +# 1230 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 5488 "parsing/parser.ml" +# 5502 "parsing/parser.ml" in -# 2380 "parsing/parser.mly" +<<<<<<< HEAD +# 2317 "parsing/parser.mly" +||||||| 04da777f7 +# 2315 "parsing/parser.mly" +======= +# 2305 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 5494 "parsing/parser.ml" +# 5508 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5509,9 +6787,15 @@ module Tables = struct let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 2382 "parsing/parser.mly" +<<<<<<< HEAD +# 2319 "parsing/parser.mly" +||||||| 04da777f7 +# 2317 "parsing/parser.mly" +======= +# 2307 "parsing/parser.mly" +>>>>>>> origin/main ( ghpat ~loc:_sloc Ppat_any ) -# 5515 "parsing/parser.ml" +# 5529 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5548,9 +6832,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 2507 "parsing/parser.mly" +<<<<<<< HEAD +# 2444 "parsing/parser.mly" +||||||| 04da777f7 +# 2442 "parsing/parser.mly" +======= +# 2432 "parsing/parser.mly" +>>>>>>> origin/main ( _2 ) -# 5554 "parsing/parser.ml" +# 5568 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5567,24 +6857,36 @@ module Tables = struct let _endpos = _startpos in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 2508 "parsing/parser.mly" +<<<<<<< HEAD +# 2445 "parsing/parser.mly" +||||||| 04da777f7 +# 2443 "parsing/parser.mly" +======= +# 2433 "parsing/parser.mly" +>>>>>>> origin/main ( Ptyp_any ) -# 5573 "parsing/parser.ml" +# 5587 "parsing/parser.ml" in let _endpos__1_ = _endpos__0_ in let _endpos = _endpos__1_ in let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 5582 "parsing/parser.ml" +# 5596 "parsing/parser.ml" in -# 2509 "parsing/parser.mly" +<<<<<<< HEAD +# 2446 "parsing/parser.mly" +||||||| 04da777f7 +# 2444 "parsing/parser.mly" +======= +# 2434 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 5588 "parsing/parser.ml" +# 5602 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5630,28 +6932,54 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5636 "parsing/parser.ml" +# 5650 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5645 "parsing/parser.ml" +# 5659 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2517 "parsing/parser.mly" +<<<<<<< HEAD +# 2454 "parsing/parser.mly" +||||||| 04da777f7 +# 2452 "parsing/parser.mly" +======= +# 2442 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_inherit _3) ~attrs:(_2@_4) ~docs ) -# 5655 "parsing/parser.ml" +# 5669 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5709,9 +7037,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _3 : unit = Obj.magic _3 in let _1_inlined2 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 5715 "parsing/parser.ml" +# 5729 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let flags : (Asttypes.mutable_flag * Asttypes.virtual_flag) = Obj.magic flags in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -5722,9 +7050,19 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined3 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5728 "parsing/parser.ml" +# 5742 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined3_ in @@ -5732,44 +7070,76 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let label = let _1 = -# 4356 "parsing/parser.mly" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5738 "parsing/parser.ml" +# 5752 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5746 "parsing/parser.ml" +# 5760 "parsing/parser.ml" in -# 2542 "parsing/parser.mly" +<<<<<<< HEAD +# 2479 "parsing/parser.mly" +||||||| 04da777f7 +# 2477 "parsing/parser.mly" +======= +# 2467 "parsing/parser.mly" +>>>>>>> origin/main ( let mut, virt = flags in label, mut, virt, ty ) -# 5755 "parsing/parser.ml" +# 5769 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5763 "parsing/parser.ml" +# 5777 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2520 "parsing/parser.mly" +<<<<<<< HEAD +# 2457 "parsing/parser.mly" +||||||| 04da777f7 +# 2455 "parsing/parser.mly" +======= +# 2445 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_val _3) ~attrs:(_2@_4) ~docs ) -# 5773 "parsing/parser.ml" +# 5787 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5827,9 +7197,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 5833 "parsing/parser.ml" +# 5847 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag * Asttypes.virtual_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -5840,53 +7210,99 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _7 = let _1 = _1_inlined4 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5846 "parsing/parser.ml" +# 5860 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _6 = let _1 = _1_inlined3 in -# 4059 "parsing/parser.mly" +<<<<<<< HEAD +# 4201 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4220 "parsing/parser.mly" +||||||| 04da777f7 +# 4213 "parsing/parser.mly" +======= +# 4204 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5855 "parsing/parser.ml" +# 5869 "parsing/parser.ml" in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 4356 "parsing/parser.mly" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5863 "parsing/parser.ml" +# 5877 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5871 "parsing/parser.ml" +# 5885 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5879 "parsing/parser.ml" +# 5893 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2524 "parsing/parser.mly" +<<<<<<< HEAD +# 2461 "parsing/parser.mly" +||||||| 04da777f7 +# 2459 "parsing/parser.mly" +======= +# 2449 "parsing/parser.mly" +>>>>>>> origin/main ( let (p, v) = _3 in let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_method (_4, p, v, _6)) ~attrs:(_2@_7) ~docs ) -# 5890 "parsing/parser.ml" +# 5904 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5932,28 +7348,54 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5938 "parsing/parser.ml" +# 5952 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5947 "parsing/parser.ml" +# 5961 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2528 "parsing/parser.mly" +<<<<<<< HEAD +# 2465 "parsing/parser.mly" +||||||| 04da777f7 +# 2463 "parsing/parser.mly" +======= +# 2453 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 5957 "parsing/parser.ml" +# 5971 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5985,9 +7427,19 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _2 = let _1 = _1_inlined1 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 5991 "parsing/parser.ml" +# 6005 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -5995,10 +7447,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2531 "parsing/parser.mly" +<<<<<<< HEAD +# 2468 "parsing/parser.mly" +||||||| 04da777f7 +# 2466 "parsing/parser.mly" +======= +# 2456 "parsing/parser.mly" +>>>>>>> origin/main ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_extension _1) ~attrs:_2 ~docs ) -# 6002 "parsing/parser.ml" +# 6016 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6022,23 +7480,35 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type_field) = let _1 = let _1 = -# 2534 "parsing/parser.mly" +<<<<<<< HEAD +# 2471 "parsing/parser.mly" +||||||| 04da777f7 +# 2469 "parsing/parser.mly" +======= +# 2459 "parsing/parser.mly" +>>>>>>> origin/main ( Pctf_attribute _1 ) -# 6028 "parsing/parser.ml" +# 6042 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1331 "parsing/parser.mly" +# 1244 "parsing/parser.mly" ( mkctf ~loc:_sloc _1 ) -# 6036 "parsing/parser.ml" +# 6050 "parsing/parser.ml" in -# 2535 "parsing/parser.mly" +<<<<<<< HEAD +# 2472 "parsing/parser.mly" +||||||| 04da777f7 +# 2470 "parsing/parser.mly" +======= +# 2460 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6042 "parsing/parser.ml" +# 6056 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6067,42 +7537,66 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6073 "parsing/parser.ml" +# 6087 "parsing/parser.ml" in let tys = let tys = -# 2493 "parsing/parser.mly" +<<<<<<< HEAD +# 2430 "parsing/parser.mly" +||||||| 04da777f7 +# 2428 "parsing/parser.mly" +======= +# 2418 "parsing/parser.mly" +>>>>>>> origin/main ( [] ) -# 6080 "parsing/parser.ml" +# 6094 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +<<<<<<< HEAD +# 2436 "parsing/parser.mly" +||||||| 04da777f7 +# 2434 "parsing/parser.mly" +======= +# 2424 "parsing/parser.mly" +>>>>>>> origin/main ( tys ) -# 6085 "parsing/parser.ml" +# 6099 "parsing/parser.ml" in -# 2476 "parsing/parser.mly" +<<<<<<< HEAD +# 2413 "parsing/parser.mly" +||||||| 04da777f7 +# 2411 "parsing/parser.mly" +======= +# 2401 "parsing/parser.mly" +>>>>>>> origin/main ( Pcty_constr (cid, tys) ) -# 6091 "parsing/parser.ml" +# 6105 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1329 "parsing/parser.mly" +# 1242 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6100 "parsing/parser.ml" +# 6114 "parsing/parser.ml" in -# 2479 "parsing/parser.mly" +<<<<<<< HEAD +# 2416 "parsing/parser.mly" +||||||| 04da777f7 +# 2414 "parsing/parser.mly" +======= +# 2404 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6106 "parsing/parser.ml" +# 6120 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6153,9 +7647,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6159 "parsing/parser.ml" +# 6173 "parsing/parser.ml" in let tys = @@ -6164,30 +7658,48 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 6168 "parsing/parser.ml" +# 6182 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 6173 "parsing/parser.ml" +# 6187 "parsing/parser.ml" in -# 2495 "parsing/parser.mly" +<<<<<<< HEAD +# 2432 "parsing/parser.mly" +||||||| 04da777f7 +# 2430 "parsing/parser.mly" +======= +# 2420 "parsing/parser.mly" +>>>>>>> origin/main ( params ) -# 6179 "parsing/parser.ml" +# 6193 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +<<<<<<< HEAD +# 2436 "parsing/parser.mly" +||||||| 04da777f7 +# 2434 "parsing/parser.mly" +======= +# 2424 "parsing/parser.mly" +>>>>>>> origin/main ( tys ) -# 6185 "parsing/parser.ml" +# 6199 "parsing/parser.ml" in -# 2476 "parsing/parser.mly" +<<<<<<< HEAD +# 2413 "parsing/parser.mly" +||||||| 04da777f7 +# 2411 "parsing/parser.mly" +======= +# 2401 "parsing/parser.mly" +>>>>>>> origin/main ( Pcty_constr (cid, tys) ) -# 6191 "parsing/parser.ml" +# 6205 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -6195,15 +7707,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1329 "parsing/parser.mly" +# 1242 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6201 "parsing/parser.ml" +# 6215 "parsing/parser.ml" in -# 2479 "parsing/parser.mly" +<<<<<<< HEAD +# 2416 "parsing/parser.mly" +||||||| 04da777f7 +# 2414 "parsing/parser.mly" +======= +# 2404 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6207 "parsing/parser.ml" +# 6221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6227,23 +7745,35 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = let _1 = let _1 = -# 2478 "parsing/parser.mly" +<<<<<<< HEAD +# 2415 "parsing/parser.mly" +||||||| 04da777f7 +# 2413 "parsing/parser.mly" +======= +# 2403 "parsing/parser.mly" +>>>>>>> origin/main ( Pcty_extension _1 ) -# 6233 "parsing/parser.ml" +# 6247 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1329 "parsing/parser.mly" +# 1242 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6241 "parsing/parser.ml" +# 6255 "parsing/parser.ml" in -# 2479 "parsing/parser.mly" +<<<<<<< HEAD +# 2416 "parsing/parser.mly" +||||||| 04da777f7 +# 2414 "parsing/parser.mly" +======= +# 2404 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6247 "parsing/parser.ml" +# 6261 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6300,44 +7830,72 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 6304 "parsing/parser.ml" +# 6318 "parsing/parser.ml" in -# 2513 "parsing/parser.mly" +<<<<<<< HEAD +# 2450 "parsing/parser.mly" +||||||| 04da777f7 +# 2448 "parsing/parser.mly" +======= +# 2438 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6309 "parsing/parser.ml" +# 6323 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1277 "parsing/parser.mly" +# 1190 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 6318 "parsing/parser.ml" +# 6332 "parsing/parser.ml" in -# 2503 "parsing/parser.mly" +<<<<<<< HEAD +# 2440 "parsing/parser.mly" +||||||| 04da777f7 +# 2438 "parsing/parser.mly" +======= +# 2428 "parsing/parser.mly" +>>>>>>> origin/main ( Csig.mk _1 _2 ) -# 6324 "parsing/parser.ml" +# 6338 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 6332 "parsing/parser.ml" +# 6346 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2481 "parsing/parser.mly" +<<<<<<< HEAD +# 2418 "parsing/parser.mly" +||||||| 04da777f7 +# 2416 "parsing/parser.mly" +======= +# 2406 "parsing/parser.mly" +>>>>>>> origin/main ( mkcty ~loc:_sloc ~attrs:_2 (Pcty_signature _3) ) -# 6341 "parsing/parser.ml" +# 6355 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6394,43 +7952,71 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 6398 "parsing/parser.ml" +# 6412 "parsing/parser.ml" in -# 2513 "parsing/parser.mly" +<<<<<<< HEAD +# 2450 "parsing/parser.mly" +||||||| 04da777f7 +# 2448 "parsing/parser.mly" +======= +# 2438 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6403 "parsing/parser.ml" +# 6417 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1277 "parsing/parser.mly" +# 1190 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 6412 "parsing/parser.ml" +# 6426 "parsing/parser.ml" in -# 2503 "parsing/parser.mly" +<<<<<<< HEAD +# 2440 "parsing/parser.mly" +||||||| 04da777f7 +# 2438 "parsing/parser.mly" +======= +# 2428 "parsing/parser.mly" +>>>>>>> origin/main ( Csig.mk _1 _2 ) -# 6418 "parsing/parser.ml" +# 6432 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 6426 "parsing/parser.ml" +# 6440 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2483 "parsing/parser.mly" +<<<<<<< HEAD +# 2420 "parsing/parser.mly" +||||||| 04da777f7 +# 2418 "parsing/parser.mly" +======= +# 2408 "parsing/parser.mly" +>>>>>>> origin/main ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 6434 "parsing/parser.ml" +# 6448 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6460,9 +8046,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_type) = -# 2485 "parsing/parser.mly" +<<<<<<< HEAD +# 2422 "parsing/parser.mly" +||||||| 04da777f7 +# 2420 "parsing/parser.mly" +======= +# 2410 "parsing/parser.mly" +>>>>>>> origin/main ( Cty.attr _1 _2 ) -# 6466 "parsing/parser.ml" +# 6480 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6525,34 +8117,60 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6531 "parsing/parser.ml" +# 6545 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 6540 "parsing/parser.ml" +# 6554 "parsing/parser.ml" in let _3 = -# 4627 "parsing/parser.mly" +<<<<<<< HEAD +# 4910 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Fresh ) -# 6546 "parsing/parser.ml" +# 6560 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2487 "parsing/parser.mly" +<<<<<<< HEAD +# 2424 "parsing/parser.mly" +||||||| 04da777f7 +# 2422 "parsing/parser.mly" +======= +# 2412 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 6556 "parsing/parser.ml" +# 6570 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6622,34 +8240,60 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6628 "parsing/parser.ml" +# 6642 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 6637 "parsing/parser.ml" +# 6651 "parsing/parser.ml" in let _3 = -# 4628 "parsing/parser.mly" +<<<<<<< HEAD +# 4911 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Override ) -# 6643 "parsing/parser.ml" +# 6657 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2487 "parsing/parser.mly" +<<<<<<< HEAD +# 2424 "parsing/parser.mly" +||||||| 04da777f7 +# 2422 "parsing/parser.mly" +======= +# 2412 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 6653 "parsing/parser.ml" +# 6667 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6686,9 +8330,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.class_expr) = -# 2347 "parsing/parser.mly" +<<<<<<< HEAD +# 2284 "parsing/parser.mly" +||||||| 04da777f7 +# 2282 "parsing/parser.mly" +======= +# 2272 "parsing/parser.mly" +>>>>>>> origin/main ( _2 ) -# 6692 "parsing/parser.ml" +# 6706 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6727,9 +8377,15 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2349 "parsing/parser.mly" +<<<<<<< HEAD +# 2286 "parsing/parser.mly" +||||||| 04da777f7 +# 2284 "parsing/parser.mly" +======= +# 2274 "parsing/parser.mly" +>>>>>>> origin/main ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 6733 "parsing/parser.ml" +# 6747 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6758,42 +8414,66 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6764 "parsing/parser.ml" +# 6778 "parsing/parser.ml" in let tys = let tys = -# 2493 "parsing/parser.mly" +<<<<<<< HEAD +# 2430 "parsing/parser.mly" +||||||| 04da777f7 +# 2428 "parsing/parser.mly" +======= +# 2418 "parsing/parser.mly" +>>>>>>> origin/main ( [] ) -# 6771 "parsing/parser.ml" +# 6785 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +<<<<<<< HEAD +# 2436 "parsing/parser.mly" +||||||| 04da777f7 +# 2434 "parsing/parser.mly" +======= +# 2424 "parsing/parser.mly" +>>>>>>> origin/main ( tys ) -# 6776 "parsing/parser.ml" +# 6790 "parsing/parser.ml" in -# 2352 "parsing/parser.mly" +<<<<<<< HEAD +# 2289 "parsing/parser.mly" +||||||| 04da777f7 +# 2287 "parsing/parser.mly" +======= +# 2277 "parsing/parser.mly" +>>>>>>> origin/main ( Pcl_constr(cid, tys) ) -# 6782 "parsing/parser.ml" +# 6796 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 6791 "parsing/parser.ml" +# 6805 "parsing/parser.ml" in -# 2359 "parsing/parser.mly" +<<<<<<< HEAD +# 2296 "parsing/parser.mly" +||||||| 04da777f7 +# 2294 "parsing/parser.mly" +======= +# 2284 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6797 "parsing/parser.ml" +# 6811 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6844,9 +8524,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6850 "parsing/parser.ml" +# 6864 "parsing/parser.ml" in let tys = @@ -6855,30 +8535,48 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 6859 "parsing/parser.ml" +# 6873 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 6864 "parsing/parser.ml" +# 6878 "parsing/parser.ml" in -# 2495 "parsing/parser.mly" +<<<<<<< HEAD +# 2432 "parsing/parser.mly" +||||||| 04da777f7 +# 2430 "parsing/parser.mly" +======= +# 2420 "parsing/parser.mly" +>>>>>>> origin/main ( params ) -# 6870 "parsing/parser.ml" +# 6884 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +<<<<<<< HEAD +# 2436 "parsing/parser.mly" +||||||| 04da777f7 +# 2434 "parsing/parser.mly" +======= +# 2424 "parsing/parser.mly" +>>>>>>> origin/main ( tys ) -# 6876 "parsing/parser.ml" +# 6890 "parsing/parser.ml" in -# 2352 "parsing/parser.mly" +<<<<<<< HEAD +# 2289 "parsing/parser.mly" +||||||| 04da777f7 +# 2287 "parsing/parser.mly" +======= +# 2277 "parsing/parser.mly" +>>>>>>> origin/main ( Pcl_constr(cid, tys) ) -# 6882 "parsing/parser.ml" +# 6896 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -6886,15 +8584,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 6892 "parsing/parser.ml" +# 6906 "parsing/parser.ml" in -# 2359 "parsing/parser.mly" +<<<<<<< HEAD +# 2296 "parsing/parser.mly" +||||||| 04da777f7 +# 2294 "parsing/parser.mly" +======= +# 2284 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 6898 "parsing/parser.ml" +# 6912 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6953,43 +8657,71 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 6957 "parsing/parser.ml" +# 6971 "parsing/parser.ml" in -# 2386 "parsing/parser.mly" - ( _1 ) -# 6962 "parsing/parser.ml" +<<<<<<< HEAD +# 2323 "parsing/parser.mly" +||||||| 04da777f7 +# 2321 "parsing/parser.mly" +======= +# 2311 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 6976 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1276 "parsing/parser.mly" +# 1189 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 6971 "parsing/parser.ml" +# 6985 "parsing/parser.ml" in -# 2373 "parsing/parser.mly" +<<<<<<< HEAD +# 2310 "parsing/parser.mly" +||||||| 04da777f7 +# 2308 "parsing/parser.mly" +======= +# 2298 "parsing/parser.mly" +>>>>>>> origin/main ( Cstr.mk _1 _2 ) -# 6977 "parsing/parser.ml" +# 6991 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 6985 "parsing/parser.ml" +# 6999 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2354 "parsing/parser.mly" +<<<<<<< HEAD +# 2291 "parsing/parser.mly" +||||||| 04da777f7 +# 2289 "parsing/parser.mly" +======= +# 2279 "parsing/parser.mly" +>>>>>>> origin/main ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 6993 "parsing/parser.ml" +# 7007 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -6997,15 +8729,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 7003 "parsing/parser.ml" +# 7017 "parsing/parser.ml" in -# 2359 "parsing/parser.mly" +<<<<<<< HEAD +# 2296 "parsing/parser.mly" +||||||| 04da777f7 +# 2294 "parsing/parser.mly" +======= +# 2284 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7009 "parsing/parser.ml" +# 7023 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7057,24 +8795,36 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2356 "parsing/parser.mly" +<<<<<<< HEAD +# 2293 "parsing/parser.mly" +||||||| 04da777f7 +# 2291 "parsing/parser.mly" +======= +# 2281 "parsing/parser.mly" +>>>>>>> origin/main ( Pcl_constraint(_2, _4) ) -# 7063 "parsing/parser.ml" +# 7077 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 7072 "parsing/parser.ml" +# 7086 "parsing/parser.ml" in -# 2359 "parsing/parser.mly" +<<<<<<< HEAD +# 2296 "parsing/parser.mly" +||||||| 04da777f7 +# 2294 "parsing/parser.mly" +======= +# 2284 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7078 "parsing/parser.ml" +# 7092 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7129,9 +8879,15 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2358 "parsing/parser.mly" +<<<<<<< HEAD +# 2295 "parsing/parser.mly" +||||||| 04da777f7 +# 2293 "parsing/parser.mly" +======= +# 2283 "parsing/parser.mly" +>>>>>>> origin/main ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 7135 "parsing/parser.ml" +# 7149 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -7139,15 +8895,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1335 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 7145 "parsing/parser.ml" +# 7159 "parsing/parser.ml" in -# 2359 "parsing/parser.mly" +<<<<<<< HEAD +# 2296 "parsing/parser.mly" +||||||| 04da777f7 +# 2294 "parsing/parser.mly" +======= +# 2284 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7151 "parsing/parser.ml" +# 7165 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7204,44 +8966,72 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 7208 "parsing/parser.ml" +# 7222 "parsing/parser.ml" in -# 2386 "parsing/parser.mly" +<<<<<<< HEAD +# 2323 "parsing/parser.mly" +||||||| 04da777f7 +# 2321 "parsing/parser.mly" +======= +# 2311 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7213 "parsing/parser.ml" +# 7227 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1276 "parsing/parser.mly" +# 1189 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 7222 "parsing/parser.ml" +# 7236 "parsing/parser.ml" in -# 2373 "parsing/parser.mly" +<<<<<<< HEAD +# 2310 "parsing/parser.mly" +||||||| 04da777f7 +# 2308 "parsing/parser.mly" +======= +# 2298 "parsing/parser.mly" +>>>>>>> origin/main ( Cstr.mk _1 _2 ) -# 7228 "parsing/parser.ml" +# 7242 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 7236 "parsing/parser.ml" +# 7250 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2361 "parsing/parser.mly" +<<<<<<< HEAD +# 2298 "parsing/parser.mly" +||||||| 04da777f7 +# 2296 "parsing/parser.mly" +======= +# 2286 "parsing/parser.mly" +>>>>>>> origin/main ( mkclass ~loc:_sloc ~attrs:_2 (Pcl_structure _3) ) -# 7245 "parsing/parser.ml" +# 7259 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7264,9 +9054,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = -# 2464 "parsing/parser.mly" +<<<<<<< HEAD +# 2401 "parsing/parser.mly" +||||||| 04da777f7 +# 2399 "parsing/parser.mly" +======= +# 2389 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7270 "parsing/parser.ml" +# 7284 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7311,15 +9107,48 @@ module Tables = struct let _endpos = _endpos_codomain_ in let _v : (Parsetree.class_type) = let _1 = let _1 = - let label = -# 4149 "parsing/parser.mly" + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Optional label ) -# 7318 "parsing/parser.ml" - in +# 7333 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 4347 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 7338 "parsing/parser.ml" + + in -# 2470 "parsing/parser.mly" +<<<<<<< HEAD +# 2407 "parsing/parser.mly" +||||||| 04da777f7 +# 2405 "parsing/parser.mly" +======= +# 2395 "parsing/parser.mly" +>>>>>>> origin/main ( Pcty_arrow(label, domain, codomain) ) -# 7323 "parsing/parser.ml" +# 7344 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -7327,15 +9156,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1329 "parsing/parser.mly" +# 1242 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 7333 "parsing/parser.ml" +# 7354 "parsing/parser.ml" in -# 2471 "parsing/parser.mly" +<<<<<<< HEAD +# 2408 "parsing/parser.mly" +||||||| 04da777f7 +# 2406 "parsing/parser.mly" +======= +# 2396 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7339 "parsing/parser.ml" +# 7360 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7382,24 +9217,57 @@ module Tables = struct let domain : (Parsetree.core_type) = Obj.magic domain in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 7388 "parsing/parser.ml" +# 7409 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in let _endpos = _endpos_codomain_ in let _v : (Parsetree.class_type) = let _1 = let _1 = - let label = -# 4151 "parsing/parser.mly" + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Labelled label ) -# 7398 "parsing/parser.ml" - in +# 7420 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 4347 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 7425 "parsing/parser.ml" + + in -# 2470 "parsing/parser.mly" +<<<<<<< HEAD +# 2407 "parsing/parser.mly" +||||||| 04da777f7 +# 2405 "parsing/parser.mly" +======= +# 2395 "parsing/parser.mly" +>>>>>>> origin/main ( Pcty_arrow(label, domain, codomain) ) -# 7403 "parsing/parser.ml" +# 7431 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -7407,15 +9275,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1329 "parsing/parser.mly" +# 1242 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 7413 "parsing/parser.ml" +# 7441 "parsing/parser.ml" in -# 2471 "parsing/parser.mly" +<<<<<<< HEAD +# 2408 "parsing/parser.mly" +||||||| 04da777f7 +# 2406 "parsing/parser.mly" +======= +# 2396 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7419 "parsing/parser.ml" +# 7447 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7454,14 +9328,30 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 4153 "parsing/parser.mly" +<<<<<<< HEAD +# 4349 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Nolabel ) -# 7460 "parsing/parser.ml" +# 7488 "parsing/parser.ml" in -# 2470 "parsing/parser.mly" +<<<<<<< HEAD +# 2407 "parsing/parser.mly" +||||||| 04da777f7 +# 2405 "parsing/parser.mly" +======= +# 2395 "parsing/parser.mly" +>>>>>>> origin/main ( Pcty_arrow(label, domain, codomain) ) -# 7465 "parsing/parser.ml" +# 7493 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_domain_) in @@ -7469,15 +9359,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1329 "parsing/parser.mly" +# 1242 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 7475 "parsing/parser.ml" +# 7503 "parsing/parser.ml" in -# 2471 "parsing/parser.mly" +<<<<<<< HEAD +# 2408 "parsing/parser.mly" +||||||| 04da777f7 +# 2406 "parsing/parser.mly" +======= +# 2396 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7481 "parsing/parser.ml" +# 7509 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7560,27 +9456,37 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _8 : unit = Obj.magic _8 in let _1_inlined2 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 7566 "parsing/parser.ml" +# 7594 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos_bs_ in - let _v : (string Location.loc option * Parsetree.class_type_declaration list) = let _1 = + let _v : (string Asttypes.loc option * Parsetree.class_type_declaration list) = let _1 = let a = let attrs2 = let _1 = _1_inlined3 in -# 4722 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 7584 "parsing/parser.ml" +# 7612 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -7590,24 +9496,40 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7596 "parsing/parser.ml" +# 7624 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 7604 "parsing/parser.ml" +# 7632 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2609 "parsing/parser.mly" +<<<<<<< HEAD +# 2546 "parsing/parser.mly" +||||||| 04da777f7 +# 2544 "parsing/parser.mly" +======= +# 2534 "parsing/parser.mly" +>>>>>>> origin/main ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -7615,19 +9537,25 @@ module Tables = struct ext, Ci.mk id csig ~virt ~params ~attrs ~loc ~docs ) -# 7619 "parsing/parser.ml" +# 7647 "parsing/parser.ml" in -# 1536 "parsing/parser.mly" +# 1449 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 7625 "parsing/parser.ml" +# 7653 "parsing/parser.ml" in -# 2597 "parsing/parser.mly" +<<<<<<< HEAD +# 2534 "parsing/parser.mly" +||||||| 04da777f7 +# 2532 "parsing/parser.mly" +======= +# 2522 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7631 "parsing/parser.ml" +# 7659 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7650,9 +9578,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4497 "parsing/parser.mly" +<<<<<<< HEAD +# 4777 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4781 "parsing/parser.mly" +||||||| 04da777f7 +# 4774 "parsing/parser.mly" +======= +# 4765 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 7656 "parsing/parser.ml" +# 7684 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7685,18 +9623,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7689 "parsing/parser.ml" +# 7717 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 7694 "parsing/parser.ml" +# 7722 "parsing/parser.ml" in -# 2965 "parsing/parser.mly" +<<<<<<< HEAD +# 2922 "parsing/parser.mly" +||||||| 04da777f7 +# 2920 "parsing/parser.mly" +======= +# 2910 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.For _2 ) -# 7700 "parsing/parser.ml" +# 7728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7728,20 +9672,38 @@ module Tables = struct let _v : (Jane_syntax.Comprehensions.clause) = let _2 = let _1 = _1_inlined1 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7734 "parsing/parser.ml" +# 7762 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7739 "parsing/parser.ml" +# 7767 "parsing/parser.ml" in -# 2967 "parsing/parser.mly" +<<<<<<< HEAD +# 2924 "parsing/parser.mly" +||||||| 04da777f7 +# 2922 "parsing/parser.mly" +======= +# 2912 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.When _2 ) -# 7745 "parsing/parser.ml" +# 7773 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7785,7 +9747,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -7799,18 +9761,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7803 "parsing/parser.ml" +# 7831 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 7808 "parsing/parser.ml" +# 7836 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 7814 "parsing/parser.ml" +# 7842 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -7819,40 +9787,78 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 7825 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 7853 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 7831 "parsing/parser.ml" +# 7859 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 7844 "parsing/parser.ml" +# 7872 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7850 "parsing/parser.ml" +# 7878 "parsing/parser.ml" in -# 2967 "parsing/parser.mly" +<<<<<<< HEAD +# 2924 "parsing/parser.mly" +||||||| 04da777f7 +# 2922 "parsing/parser.mly" +======= +# 2912 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.When _2 ) -# 7856 "parsing/parser.ml" +# 7884 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7889,14 +9895,30 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Jane_syntax.Comprehensions.clause_binding) = let _1 = -# 4726 "parsing/parser.mly" - ( _1 ) -# 7895 "parsing/parser.ml" - in - -# 2945 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 7923 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2904 "parsing/parser.mly" +||||||| 04da777f7 +# 2902 "parsing/parser.mly" +======= +# 2892 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.{ pattern = _2 ; iterator = _3 ; attributes = _1 } ) -# 7900 "parsing/parser.ml" +# 7928 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7909,9 +9931,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -7924,9 +9946,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -7938,52 +9960,99 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__1_inlined2_ in let _v : (Jane_syntax.Comprehensions.clause_binding) = let _5 = - let _1 = _1_inlined1 in + let _1 = _1_inlined2 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7955 "parsing/parser.ml" +# 7983 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 7960 "parsing/parser.ml" +# 7988 "parsing/parser.ml" in - let _endpos__5_ = _endpos__1_inlined1_ in + let _endpos__5_ = _endpos__1_inlined2_ in + let _2 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4354 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4373 "parsing/parser.mly" +||||||| 04da777f7 +# 4366 "parsing/parser.mly" +======= +# 4357 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "local" (make_loc _sloc) ) +# 8000 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in let _1 = -# 4726 "parsing/parser.mly" - ( _1 ) -# 7967 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8007 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then _startpos__1_ else _startpos__2_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2952 "parsing/parser.mly" - ( let expr = - mkexp_stack _5 ~kwd_loc:(make_loc _loc__2_) ~loc:(ghost_loc _sloc) - in +<<<<<<< HEAD +# 2911 "parsing/parser.mly" +||||||| 04da777f7 +# 2909 "parsing/parser.mly" +======= +# 2899 "parsing/parser.mly" +>>>>>>> origin/main + ( let expr = mkexp_with_modes ~loc:_sloc (Mode.singleton _2) _5 in Jane_syntax.Comprehensions. { pattern = _3 ; iterator = In expr ; attributes = _1 } ) -# 7987 "parsing/parser.ml" +# 8024 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8001,19 +10070,379 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Jane_syntax.Comprehensions.clause_binding) = let _5 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 8103 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 8108 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 8114 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8125 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 8131 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 8144 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 8150 "parsing/parser.ml" + + in + let _endpos__5_ = _endpos_xs_ in + let _2 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4354 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4373 "parsing/parser.mly" +||||||| 04da777f7 +# 4366 "parsing/parser.mly" +======= +# 4357 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "local" (make_loc _sloc) ) +# 8162 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _1 = +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8169 "parsing/parser.ml" + in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2911 "parsing/parser.mly" +||||||| 04da777f7 +# 2909 "parsing/parser.mly" +======= +# 2899 "parsing/parser.mly" +>>>>>>> origin/main + ( let expr = mkexp_with_modes ~loc:_sloc (Mode.singleton _2) _5 in + Jane_syntax.Comprehensions. + { pattern = _3 + ; iterator = In expr + ; attributes = _1 + } + ) +# 8186 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Jane_syntax.Comprehensions.clause_binding) = let _5 = + let _1 = _1_inlined2 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 8241 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 8246 "parsing/parser.ml" + + in + let _endpos__5_ = _endpos__1_inlined2_ in + let _2 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4356 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4375 "parsing/parser.mly" +||||||| 04da777f7 +# 4368 "parsing/parser.mly" +======= +# 4359 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "unique" (make_loc _sloc) ) +# 8258 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _1 = +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8265 "parsing/parser.ml" + in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2911 "parsing/parser.mly" +||||||| 04da777f7 +# 2909 "parsing/parser.mly" +======= +# 2899 "parsing/parser.mly" +>>>>>>> origin/main + ( let expr = mkexp_with_modes ~loc:_sloc (Mode.singleton _2) _5 in + Jane_syntax.Comprehensions. + { pattern = _3 + ; iterator = In expr + ; attributes = _1 + } + ) +# 8282 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -8026,9 +10455,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -8044,36 +10473,42 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos_xs_ in let _v : (Jane_syntax.Comprehensions.clause_binding) = let _5 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in let _1 = let _3 = let xs = let xs = # 253 "" ( List.rev xs ) -# 8066 "parsing/parser.ml" +# 8361 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 8071 "parsing/parser.ml" +# 8366 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 8077 "parsing/parser.ml" +# 8372 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8082,61 +10517,488 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 8088 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8383 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 8094 "parsing/parser.ml" +# 8389 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 8107 "parsing/parser.ml" +# 8402 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8113 "parsing/parser.ml" +# 8408 "parsing/parser.ml" in let _endpos__5_ = _endpos_xs_ in + let _2 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4356 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4375 "parsing/parser.mly" +||||||| 04da777f7 +# 4368 "parsing/parser.mly" +======= +# 4359 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "unique" (make_loc _sloc) ) +# 8420 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in let _1 = -# 4726 "parsing/parser.mly" - ( _1 ) -# 8120 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8427 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then _startpos__1_ else _startpos__2_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2952 "parsing/parser.mly" - ( let expr = - mkexp_stack _5 ~kwd_loc:(make_loc _loc__2_) ~loc:(ghost_loc _sloc) - in +<<<<<<< HEAD +# 2911 "parsing/parser.mly" +||||||| 04da777f7 +# 2909 "parsing/parser.mly" +======= +# 2899 "parsing/parser.mly" +>>>>>>> origin/main + ( let expr = mkexp_with_modes ~loc:_sloc (Mode.singleton _2) _5 in Jane_syntax.Comprehensions. { pattern = _3 ; iterator = In expr ; attributes = _1 } ) -# 8140 "parsing/parser.ml" +# 8444 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Jane_syntax.Comprehensions.clause_binding) = let _5 = + let _1 = _1_inlined2 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 8499 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 8504 "parsing/parser.ml" + + in + let _endpos__5_ = _endpos__1_inlined2_ in + let _2 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4358 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4377 "parsing/parser.mly" +||||||| 04da777f7 +# 4370 "parsing/parser.mly" +======= +# 4361 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "once" (make_loc _sloc) ) +# 8516 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _1 = +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8523 "parsing/parser.ml" + in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2911 "parsing/parser.mly" +||||||| 04da777f7 +# 2909 "parsing/parser.mly" +======= +# 2899 "parsing/parser.mly" +>>>>>>> origin/main + ( let expr = mkexp_with_modes ~loc:_sloc (Mode.singleton _2) _5 in + Jane_syntax.Comprehensions. + { pattern = _3 + ; iterator = In expr + ; attributes = _1 + } + ) +# 8540 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Jane_syntax.Comprehensions.clause_binding) = let _5 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 8619 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 8624 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 8630 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8641 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 8647 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 8660 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 8666 "parsing/parser.ml" + + in + let _endpos__5_ = _endpos_xs_ in + let _2 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4358 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4377 "parsing/parser.mly" +||||||| 04da777f7 +# 4370 "parsing/parser.mly" +======= +# 4361 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "once" (make_loc _sloc) ) +# 8678 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _1 = +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8685 "parsing/parser.ml" + in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2911 "parsing/parser.mly" +||||||| 04da777f7 +# 2909 "parsing/parser.mly" +======= +# 2899 "parsing/parser.mly" +>>>>>>> origin/main + ( let expr = mkexp_with_modes ~loc:_sloc (Mode.singleton _2) _5 in + Jane_syntax.Comprehensions. + { pattern = _3 + ; iterator = In expr + ; attributes = _1 + } + ) +# 8702 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8182,33 +11044,63 @@ module Tables = struct let _v : (Jane_syntax.Comprehensions.iterator) = let _4 = let _1 = _1_inlined2 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8188 "parsing/parser.ml" +# 8750 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8193 "parsing/parser.ml" +# 8755 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8201 "parsing/parser.ml" +# 8763 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8206 "parsing/parser.ml" +# 8768 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" +<<<<<<< HEAD +# 2897 "parsing/parser.mly" +||||||| 04da777f7 +# 2895 "parsing/parser.mly" +======= +# 2885 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.Range { start = _2 ; stop = _4 ; direction = _3 } ) -# 8212 "parsing/parser.ml" +# 8774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8264,7 +11156,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in let _1_inlined2 : unit = Obj.magic _1_inlined2 in let _3 : (Asttypes.direction_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in @@ -8280,18 +11172,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8284 "parsing/parser.ml" +# 8846 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 8289 "parsing/parser.ml" +# 8851 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 8295 "parsing/parser.ml" +# 8857 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8300,53 +11198,103 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 8306 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 8868 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 8312 "parsing/parser.ml" +# 8874 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 8325 "parsing/parser.ml" +# 8887 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8331 "parsing/parser.ml" +# 8893 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8339 "parsing/parser.ml" +# 8901 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8344 "parsing/parser.ml" +# 8906 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" +<<<<<<< HEAD +# 2897 "parsing/parser.mly" +||||||| 04da777f7 +# 2895 "parsing/parser.mly" +======= +# 2885 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.Range { start = _2 ; stop = _4 ; direction = _3 } ) -# 8350 "parsing/parser.ml" +# 8912 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8404,7 +11352,7 @@ module Tables = struct let _3 : (Asttypes.direction_flag) = Obj.magic _3 in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -8413,14 +11361,26 @@ module Tables = struct let _v : (Jane_syntax.Comprehensions.iterator) = let _4 = let _1 = _1_inlined4 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8419 "parsing/parser.ml" +# 8981 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8424 "parsing/parser.ml" +# 8986 "parsing/parser.ml" in let _2 = @@ -8431,18 +11391,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8435 "parsing/parser.ml" +# 8997 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 8440 "parsing/parser.ml" +# 9002 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 8446 "parsing/parser.ml" +# 9008 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8451,40 +11417,78 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 8457 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 9019 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 8463 "parsing/parser.ml" +# 9025 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 8476 "parsing/parser.ml" +# 9038 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8482 "parsing/parser.ml" +# 9044 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" +<<<<<<< HEAD +# 2897 "parsing/parser.mly" +||||||| 04da777f7 +# 2895 "parsing/parser.mly" +======= +# 2885 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.Range { start = _2 ; stop = _4 ; direction = _3 } ) -# 8488 "parsing/parser.ml" +# 9050 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8558,12 +11562,12 @@ module Tables = struct } = _menhir_stack in let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in let _1_inlined6 : (Parsetree.attributes) = Obj.magic _1_inlined6 in - let _1_inlined5 : (string Location.loc option) = Obj.magic _1_inlined5 in + let _1_inlined5 : (string Asttypes.loc option) = Obj.magic _1_inlined5 in let _1_inlined4 : unit = Obj.magic _1_inlined4 in let _3 : (Asttypes.direction_flag) = Obj.magic _3 in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -8577,18 +11581,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8581 "parsing/parser.ml" +# 9143 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 8586 "parsing/parser.ml" +# 9148 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 8592 "parsing/parser.ml" +# 9154 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8597,34 +11607,66 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 8603 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 9165 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 8609 "parsing/parser.ml" +# 9171 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 8622 "parsing/parser.ml" +# 9184 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8628 "parsing/parser.ml" +# 9190 "parsing/parser.ml" in let _2 = @@ -8635,18 +11677,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8639 "parsing/parser.ml" +# 9201 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 8644 "parsing/parser.ml" +# 9206 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 8650 "parsing/parser.ml" +# 9212 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8655,40 +11703,78 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 8661 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 9223 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 8667 "parsing/parser.ml" +# 9229 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 8680 "parsing/parser.ml" +# 9242 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8686 "parsing/parser.ml" +# 9248 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" +<<<<<<< HEAD +# 2897 "parsing/parser.mly" +||||||| 04da777f7 +# 2895 "parsing/parser.mly" +======= +# 2885 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.Range { start = _2 ; stop = _4 ; direction = _3 } ) -# 8692 "parsing/parser.ml" +# 9254 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8720,20 +11806,38 @@ module Tables = struct let _v : (Jane_syntax.Comprehensions.iterator) = let _2 = let _1 = _1_inlined1 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8726 "parsing/parser.ml" +# 9288 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8731 "parsing/parser.ml" +# 9293 "parsing/parser.ml" in -# 2940 "parsing/parser.mly" +<<<<<<< HEAD +# 2899 "parsing/parser.mly" +||||||| 04da777f7 +# 2897 "parsing/parser.mly" +======= +# 2887 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.In _2 ) -# 8737 "parsing/parser.ml" +# 9299 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8777,7 +11881,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -8791,18 +11895,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8795 "parsing/parser.ml" +# 9357 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 8800 "parsing/parser.ml" +# 9362 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 8806 "parsing/parser.ml" +# 9368 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8811,40 +11921,78 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 8817 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 9379 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 8823 "parsing/parser.ml" +# 9385 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 8836 "parsing/parser.ml" +# 9398 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 8842 "parsing/parser.ml" +# 9404 "parsing/parser.ml" in -# 2940 "parsing/parser.mly" +<<<<<<< HEAD +# 2899 "parsing/parser.mly" +||||||| 04da777f7 +# 2897 "parsing/parser.mly" +======= +# 2887 "parsing/parser.mly" +>>>>>>> origin/main ( Jane_syntax.Comprehensions.In _2 ) -# 8848 "parsing/parser.ml" +# 9410 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8867,9 +12015,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Constant.t) = -# 4373 "parsing/parser.mly" +<<<<<<< HEAD +# 4637 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4641 "parsing/parser.mly" +||||||| 04da777f7 +# 4634 "parsing/parser.mly" +======= +# 4625 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Constant.value _1 ) -# 8873 "parsing/parser.ml" +# 9435 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8892,9 +12050,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Constant.t) = -# 4374 "parsing/parser.mly" +<<<<<<< HEAD +# 4638 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4642 "parsing/parser.mly" +||||||| 04da777f7 +# 4635 "parsing/parser.mly" +======= +# 4626 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 8898 "parsing/parser.ml" +# 9460 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8923,10 +12091,20 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (string) = -# 4453 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4724 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4728 "parsing/parser.mly" +||||||| 04da777f7 +# 4721 "parsing/parser.mly" +======= +# 4712 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "[]" ) -# 8930 "parsing/parser.ml" +# 9492 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8955,10 +12133,20 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (string) = -# 4454 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4725 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4729 "parsing/parser.mly" +||||||| 04da777f7 +# 4722 "parsing/parser.mly" +======= +# 4713 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "()" ) -# 8962 "parsing/parser.ml" +# 9524 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8980,10 +12168,20 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4455 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4726 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4730 "parsing/parser.mly" +||||||| 04da777f7 +# 4723 "parsing/parser.mly" +======= +# 4714 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "false" ) -# 8987 "parsing/parser.ml" +# 9549 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9005,10 +12203,20 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4456 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4727 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4731 "parsing/parser.mly" +||||||| 04da777f7 +# 4724 "parsing/parser.mly" +======= +# 4715 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "true" ) -# 9012 "parsing/parser.ml" +# 9574 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9027,17 +12235,27 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1148 "parsing/parser.mly" +# 1061 "parsing/parser.mly" (string) -# 9033 "parsing/parser.ml" +# 9595 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4459 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4730 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4734 "parsing/parser.mly" +||||||| 04da777f7 +# 4727 "parsing/parser.mly" +======= +# 4718 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 9041 "parsing/parser.ml" +# 9603 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9073,15 +12291,35 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (string) = let _1 = -# 4450 "parsing/parser.mly" + let _v : (Asttypes.label) = let _1 = +<<<<<<< HEAD +# 4721 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4725 "parsing/parser.mly" +||||||| 04da777f7 +# 4718 "parsing/parser.mly" +======= +# 4709 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "::" ) -# 9080 "parsing/parser.ml" +# 9642 "parsing/parser.ml" in -# 4460 "parsing/parser.mly" +<<<<<<< HEAD +# 4731 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4735 "parsing/parser.mly" +||||||| 04da777f7 +# 4728 "parsing/parser.mly" +======= +# 4719 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 9085 "parsing/parser.ml" +# 9647 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9099,14 +12337,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4461 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4732 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4736 "parsing/parser.mly" +||||||| 04da777f7 +# 4729 "parsing/parser.mly" +======= +# 4720 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 9110 "parsing/parser.ml" +# 9672 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9129,9 +12377,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4464 "parsing/parser.mly" +<<<<<<< HEAD +# 4735 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4739 "parsing/parser.mly" +||||||| 04da777f7 +# 4732 "parsing/parser.mly" +======= +# 4723 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 9135 "parsing/parser.ml" +# 9697 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9182,14 +12440,34 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = let _3 = -# 4450 "parsing/parser.mly" +<<<<<<< HEAD +# 4721 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4725 "parsing/parser.mly" +||||||| 04da777f7 +# 4718 "parsing/parser.mly" +======= +# 4709 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "::" ) -# 9188 "parsing/parser.ml" +# 9750 "parsing/parser.ml" in -# 4465 "parsing/parser.mly" +<<<<<<< HEAD +# 4736 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4740 "parsing/parser.mly" +||||||| 04da777f7 +# 4733 "parsing/parser.mly" +======= +# 4724 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Ldot(_1,_3) ) -# 9193 "parsing/parser.ml" +# 9755 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9226,14 +12504,34 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = let _1 = -# 4450 "parsing/parser.mly" +<<<<<<< HEAD +# 4721 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4725 "parsing/parser.mly" +||||||| 04da777f7 +# 4718 "parsing/parser.mly" +======= +# 4709 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( "::" ) -# 9232 "parsing/parser.ml" - in - -# 4466 "parsing/parser.mly" +# 9794 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 4737 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4741 "parsing/parser.mly" +||||||| 04da777f7 +# 4734 "parsing/parser.mly" +======= +# 4725 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Lident _1 ) -# 9237 "parsing/parser.ml" +# 9799 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9251,14 +12549,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4467 "parsing/parser.mly" +<<<<<<< HEAD +# 4738 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4742 "parsing/parser.mly" +||||||| 04da777f7 +# 4735 "parsing/parser.mly" +======= +# 4726 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Lident _1 ) -# 9262 "parsing/parser.ml" +# 9824 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9295,9 +12603,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type * Parsetree.core_type) = -# 2553 "parsing/parser.mly" +<<<<<<< HEAD +# 2490 "parsing/parser.mly" +||||||| 04da777f7 +# 2488 "parsing/parser.mly" +======= +# 2478 "parsing/parser.mly" +>>>>>>> origin/main ( _1, _3 ) -# 9301 "parsing/parser.ml" +# 9863 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9309,6 +12623,8 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { +<<<<<<< HEAD +======= MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = cty; MenhirLib.EngineTypes.startp = _startpos_cty_; @@ -9323,43 +12639,187 @@ module Tables = struct let xs = let xs = let x = + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 9892 "parsing/parser.ml" + in let gbl = -# 4584 "parsing/parser.mly" - ( Nothing ) -# 9330 "parsing/parser.ml" +<<<<<<< HEAD +# 4871 "parsing/parser.mly" +||||||| 04da777f7 +# 4864 "parsing/parser.mly" +======= +# 4855 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 9897 "parsing/parser.ml" in - let (_endpos_gbl_, _startpos_gbl_) = (_endpos__0_, _endpos__0_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty ) -# 9339 "parsing/parser.ml" +# 9905 "parsing/parser.ml" in -# 1423 "parsing/parser.mly" +# 1336 "parsing/parser.mly" ( [ x ] ) -# 9345 "parsing/parser.ml" +# 9911 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 9351 "parsing/parser.ml" +# 9917 "parsing/parser.ml" in -# 1443 "parsing/parser.mly" +# 1356 "parsing/parser.mly" ( xs ) -# 9357 "parsing/parser.ml" +# 9923 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main + ( Pcstr_tuple tys ) +# 9929 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { +>>>>>>> upstream/main + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_cty_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_arguments) = let tys = + let xs = + let xs = + let x = +<<<<<<< HEAD + let gbl = +# 4867 "parsing/parser.mly" + ( [] ) +# 9899 "parsing/parser.ml" +======= + let m1 = +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +# 9965 "parsing/parser.ml" + in + let gbl = +<<<<<<< HEAD +# 4871 "parsing/parser.mly" +||||||| 04da777f7 +# 4864 "parsing/parser.mly" +======= +# 4855 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 9970 "parsing/parser.ml" +>>>>>>> upstream/main + in + let (_endpos_gbl_, _startpos_gbl_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 9914 "parsing/parser.ml" + + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +# 9920 "parsing/parser.ml" + + in + +# 253 "" + ( List.rev xs ) +# 9926 "parsing/parser.ml" + + in + +# 1356 "parsing/parser.mly" + ( xs ) +# 9932 "parsing/parser.ml" in -# 3911 "parsing/parser.mly" +<<<<<<< HEAD +# 4055 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Pcstr_tuple tys ) -# 9363 "parsing/parser.ml" +# 9938 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9372,6 +12832,11 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= MenhirLib.EngineTypes.semv = cty; MenhirLib.EngineTypes.startp = _startpos_cty_; MenhirLib.EngineTypes.endp = _endpos_cty_; @@ -9392,43 +12857,76 @@ module Tables = struct let xs = let xs = let x = - let gbl = -# 4585 "parsing/parser.mly" - ( Global ) -# 9399 "parsing/parser.ml" + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 10038 "parsing/parser.ml" in - let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +# 10047 "parsing/parser.ml" + + in -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty ) -# 9408 "parsing/parser.ml" +# 10056 "parsing/parser.ml" in -# 1423 "parsing/parser.mly" +# 1336 "parsing/parser.mly" ( [ x ] ) -# 9414 "parsing/parser.ml" +# 10062 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 9420 "parsing/parser.ml" +# 10068 "parsing/parser.ml" in -# 1443 "parsing/parser.mly" +# 1356 "parsing/parser.mly" ( xs ) -# 9426 "parsing/parser.ml" +# 10074 "parsing/parser.ml" in -# 3911 "parsing/parser.mly" +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main ( Pcstr_tuple tys ) -# 9432 "parsing/parser.ml" +# 10080 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9441,6 +12939,144 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_arguments) = let tys = + let xs = + let xs = + let x = +<<<<<<< HEAD +======= + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +# 10125 "parsing/parser.ml" + + in +>>>>>>> upstream/main + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4868 "parsing/parser.mly" + ( [ mkloc (Modality "global") (make_loc _sloc)] ) +# 9985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +# 10135 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 10001 "parsing/parser.ml" + + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +# 10007 "parsing/parser.ml" + + in + +# 253 "" + ( List.rev xs ) +# 10013 "parsing/parser.ml" + + in + +# 1356 "parsing/parser.mly" + ( xs ) +# 10019 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4055 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Pcstr_tuple tys ) +# 10025 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= MenhirLib.EngineTypes.semv = cty; MenhirLib.EngineTypes.startp = _startpos_cty_; MenhirLib.EngineTypes.endp = _endpos_cty_; @@ -9468,44 +13104,202 @@ module Tables = struct let xs = let xs = let x = + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 10211 "parsing/parser.ml" + in + let gbl = +<<<<<<< HEAD +# 4871 "parsing/parser.mly" +||||||| 04da777f7 +# 4864 "parsing/parser.mly" +======= +# 4855 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 10216 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +# 10224 "parsing/parser.ml" + + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +# 10230 "parsing/parser.ml" + + in + +# 253 "" + ( List.rev xs ) +# 10236 "parsing/parser.ml" + + in + +# 1356 "parsing/parser.mly" + ( xs ) +# 10242 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main + ( Pcstr_tuple tys ) +# 10248 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.constructor_argument list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_arguments) = let tys = + let xs = + let xs = + let x = +<<<<<<< HEAD let _endpos__0_ = _endpos__2_ in let gbl = -# 4584 "parsing/parser.mly" - ( Nothing ) -# 9476 "parsing/parser.ml" +# 4867 "parsing/parser.mly" + ( [] ) +# 10076 "parsing/parser.ml" +======= + let m1 = +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +# 10298 "parsing/parser.ml" + in + let gbl = +<<<<<<< HEAD +# 4871 "parsing/parser.mly" +||||||| 04da777f7 +# 4864 "parsing/parser.mly" +======= +# 4855 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 10303 "parsing/parser.ml" +>>>>>>> upstream/main in let (_endpos_gbl_, _startpos_gbl_) = (_endpos__0_, _endpos__0_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) -) -# 9485 "parsing/parser.ml" +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 10091 "parsing/parser.ml" in -# 1427 "parsing/parser.mly" +# 1340 "parsing/parser.mly" ( x :: xs ) -# 9491 "parsing/parser.ml" +# 10097 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 9497 "parsing/parser.ml" +# 10103 "parsing/parser.ml" in -# 1443 "parsing/parser.mly" +# 1356 "parsing/parser.mly" ( xs ) -# 9503 "parsing/parser.ml" +# 10109 "parsing/parser.ml" in -# 3911 "parsing/parser.mly" +<<<<<<< HEAD +# 4055 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Pcstr_tuple tys ) -# 9509 "parsing/parser.ml" +# 10115 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9518,6 +13312,11 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= MenhirLib.EngineTypes.semv = cty; MenhirLib.EngineTypes.startp = _startpos_cty_; MenhirLib.EngineTypes.endp = _endpos_cty_; @@ -9552,43 +13351,223 @@ module Tables = struct let xs = let xs = let x = - let gbl = -# 4585 "parsing/parser.mly" - ( Global ) -# 9559 "parsing/parser.ml" + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +# 10385 "parsing/parser.ml" in - let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +# 10394 "parsing/parser.ml" + + in -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty ) -# 9568 "parsing/parser.ml" +# 10403 "parsing/parser.ml" in -# 1427 "parsing/parser.mly" +# 1340 "parsing/parser.mly" ( x :: xs ) -# 9574 "parsing/parser.ml" +# 10409 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 9580 "parsing/parser.ml" +# 10415 "parsing/parser.ml" in -# 1443 "parsing/parser.mly" +# 1356 "parsing/parser.mly" ( xs ) -# 9586 "parsing/parser.ml" +# 10421 "parsing/parser.ml" in -# 3911 "parsing/parser.mly" +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main ( Pcstr_tuple tys ) -# 9592 "parsing/parser.ml" +# 10427 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.constructor_argument list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_arguments) = let tys = + let xs = + let xs = + let x = +<<<<<<< HEAD +======= + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +# 10486 "parsing/parser.ml" + + in +>>>>>>> upstream/main + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4868 "parsing/parser.mly" + ( [ mkloc (Modality "global") (make_loc _sloc)] ) +# 10176 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +# 10496 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 10192 "parsing/parser.ml" + + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +# 10198 "parsing/parser.ml" + + in + +# 253 "" + ( List.rev xs ) +# 10204 "parsing/parser.ml" + + in + +# 1356 "parsing/parser.mly" + ( xs ) +# 10210 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4055 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4072 "parsing/parser.mly" +||||||| 04da777f7 +# 4065 "parsing/parser.mly" +======= +# 4056 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Pcstr_tuple tys ) +# 10216 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9625,9 +13604,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.constructor_arguments) = -# 3913 "parsing/parser.mly" +<<<<<<< HEAD +# 4057 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4074 "parsing/parser.mly" +||||||| 04da777f7 +# 4067 "parsing/parser.mly" +======= +# 4058 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Pcstr_record _2 ) -# 9631 "parsing/parser.ml" +# 10255 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9650,9 +13639,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constructor_declaration list) = -# 3812 "parsing/parser.mly" +<<<<<<< HEAD +# 3972 "parsing/parser.mly" +||||||| 04da777f7 +# 3965 "parsing/parser.mly" +======= +# 3956 "parsing/parser.mly" +>>>>>>> origin/main ( [] ) -# 9656 "parsing/parser.ml" +# 10280 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9675,14 +13670,20 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.constructor_declaration list) = let cs = -# 1528 "parsing/parser.mly" +# 1441 "parsing/parser.mly" ( List.rev xs ) -# 9681 "parsing/parser.ml" +# 10305 "parsing/parser.ml" in -# 3814 "parsing/parser.mly" +<<<<<<< HEAD +# 3974 "parsing/parser.mly" +||||||| 04da777f7 +# 3967 "parsing/parser.mly" +======= +# 3958 "parsing/parser.mly" +>>>>>>> origin/main ( cs ) -# 9686 "parsing/parser.ml" +# 10310 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9705,14 +13706,34 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = -# 4084 "parsing/parser.mly" +<<<<<<< HEAD +# 4226 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4245 "parsing/parser.mly" +||||||| 04da777f7 +# 4238 "parsing/parser.mly" +======= +# 4229 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 9711 "parsing/parser.ml" +# 10335 "parsing/parser.ml" in -# 4074 "parsing/parser.mly" +<<<<<<< HEAD +# 4216 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4235 "parsing/parser.mly" +||||||| 04da777f7 +# 4228 "parsing/parser.mly" +======= +# 4219 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 9716 "parsing/parser.ml" +# 10340 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9742,9 +13763,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = -# 4076 "parsing/parser.mly" +<<<<<<< HEAD +# 4218 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4237 "parsing/parser.mly" +||||||| 04da777f7 +# 4230 "parsing/parser.mly" +======= +# 4221 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Typ.attr _1 _2 ) -# 9748 "parsing/parser.ml" +# 10372 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9767,9 +13798,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 4563 "parsing/parser.mly" +<<<<<<< HEAD +# 4843 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4847 "parsing/parser.mly" +||||||| 04da777f7 +# 4840 "parsing/parser.mly" +======= +# 4831 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Upto ) -# 9773 "parsing/parser.ml" +# 10397 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9792,9 +13833,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 4564 "parsing/parser.mly" +<<<<<<< HEAD +# 4844 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4848 "parsing/parser.mly" +||||||| 04da777f7 +# 4841 "parsing/parser.mly" +======= +# 4832 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Downto ) -# 9798 "parsing/parser.ml" +# 10422 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9809,10 +13860,20 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in - let _v : (string Location.loc option) = -# 4729 "parsing/parser.mly" + let _v : (string Asttypes.loc option) = +<<<<<<< HEAD +# 5012 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5016 "parsing/parser.mly" +||||||| 04da777f7 +# 5009 "parsing/parser.mly" +======= +# 5000 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( None ) -# 9816 "parsing/parser.ml" +# 10440 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9841,10 +13902,20 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (string Location.loc option) = -# 4730 "parsing/parser.mly" + let _v : (string Asttypes.loc option) = +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5017 "parsing/parser.mly" +||||||| 04da777f7 +# 5010 "parsing/parser.mly" +======= +# 5001 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Some _2 ) -# 9848 "parsing/parser.ml" +# 10472 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9888,9 +13959,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 4742 "parsing/parser.mly" +<<<<<<< HEAD +# 5025 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5029 "parsing/parser.mly" +||||||| 04da777f7 +# 5022 "parsing/parser.mly" +======= +# 5013 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( (_2, _3) ) -# 9894 "parsing/parser.ml" +# 10518 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9909,9 +13990,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1137 "parsing/parser.mly" +# 1050 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) -# 9915 "parsing/parser.ml" +# 10539 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -9920,9 +14001,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4744 "parsing/parser.mly" +<<<<<<< HEAD +# 5027 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5031 "parsing/parser.mly" +||||||| 04da777f7 +# 5024 "parsing/parser.mly" +======= +# 5015 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( mk_quotedext ~loc:_sloc _1 ) -# 9926 "parsing/parser.ml" +# 10550 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9967,7 +14058,7 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -9975,9 +14066,19 @@ module Tables = struct let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined3 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 9981 "parsing/parser.ml" +# 10605 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined3_ in @@ -9987,9 +14088,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 9993 "parsing/parser.ml" +# 10617 "parsing/parser.ml" in let cid = @@ -9998,19 +14099,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 10004 "parsing/parser.ml" +# 10628 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3989 "parsing/parser.mly" +<<<<<<< HEAD +# 4131 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4150 "parsing/parser.mly" +||||||| 04da777f7 +# 4143 "parsing/parser.mly" +======= +# 4134 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 10014 "parsing/parser.ml" +# 10638 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10049,16 +14160,26 @@ module Tables = struct let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in let _3 : unit = Obj.magic _3 in - let _1 : (string) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined2 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 10062 "parsing/parser.ml" +# 10686 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -10068,9 +14189,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 10074 "parsing/parser.ml" +# 10698 "parsing/parser.ml" in let cid = @@ -10078,25 +14199,45 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 10084 "parsing/parser.ml" +# 10708 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 4537 "parsing/parser.mly" +<<<<<<< HEAD +# 4817 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4821 "parsing/parser.mly" +||||||| 04da777f7 +# 4814 "parsing/parser.mly" +======= +# 4805 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( () ) -# 10091 "parsing/parser.ml" +# 10715 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in -# 3989 "parsing/parser.mly" +<<<<<<< HEAD +# 4131 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4150 "parsing/parser.mly" +||||||| 04da777f7 +# 4143 "parsing/parser.mly" +======= +# 4134 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 10100 "parsing/parser.ml" +# 10724 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10143,10 +14284,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4717 "parsing/parser.mly" +<<<<<<< HEAD +# 5000 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5004 "parsing/parser.mly" +||||||| 04da777f7 +# 4997 "parsing/parser.mly" +======= +# 4988 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( mark_symbol_docs _sloc; mk_attr ~loc:(make_loc _sloc) _2 _3 ) -# 10150 "parsing/parser.ml" +# 10774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10162,14 +14313,26 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let params = -# 2493 "parsing/parser.mly" +<<<<<<< HEAD +# 2430 "parsing/parser.mly" +||||||| 04da777f7 +# 2428 "parsing/parser.mly" +======= +# 2418 "parsing/parser.mly" +>>>>>>> origin/main ( [] ) -# 10168 "parsing/parser.ml" +# 10792 "parsing/parser.ml" in -# 2318 "parsing/parser.mly" +<<<<<<< HEAD +# 2255 "parsing/parser.mly" +||||||| 04da777f7 +# 2253 "parsing/parser.mly" +======= +# 2243 "parsing/parser.mly" +>>>>>>> origin/main ( params ) -# 10173 "parsing/parser.ml" +# 10797 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10210,24 +14373,36 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 10214 "parsing/parser.ml" +# 10838 "parsing/parser.ml" in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 10219 "parsing/parser.ml" +# 10843 "parsing/parser.ml" in -# 2495 "parsing/parser.mly" +<<<<<<< HEAD +# 2432 "parsing/parser.mly" +||||||| 04da777f7 +# 2430 "parsing/parser.mly" +======= +# 2420 "parsing/parser.mly" +>>>>>>> origin/main ( params ) -# 10225 "parsing/parser.ml" +# 10849 "parsing/parser.ml" in -# 2318 "parsing/parser.mly" +<<<<<<< HEAD +# 2255 "parsing/parser.mly" +||||||| 04da777f7 +# 2253 "parsing/parser.mly" +======= +# 2243 "parsing/parser.mly" +>>>>>>> origin/main ( params ) -# 10231 "parsing/parser.ml" +# 10855 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10265,7 +14440,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -10275,18 +14450,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 10279 "parsing/parser.ml" +# 10903 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 10284 "parsing/parser.ml" +# 10908 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 10290 "parsing/parser.ml" +# 10914 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -10295,22 +14476,48 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 10301 "parsing/parser.ml" +# 10925 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 10307 "parsing/parser.ml" +# 10931 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3264 "parsing/parser.mly" +<<<<<<< HEAD +# 3253 "parsing/parser.mly" +||||||| 04da777f7 +# 3251 "parsing/parser.mly" +======= +# 3241 "parsing/parser.mly" +>>>>>>> origin/main ( let ext, attrs = _2 in match ext with | None -> N_ary.Pfunction_cases (_3, make_loc _sloc, attrs) @@ -10320,7 +14527,7 @@ module Tables = struct let function_ = mkfunction [] None cases ~loc:_sloc ~attrs:_2 in N_ary.Pfunction_body function_ ) -# 10324 "parsing/parser.ml" +# 10948 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10343,9 +14550,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (N_ary.function_body) = -# 3274 "parsing/parser.mly" +<<<<<<< HEAD +# 3263 "parsing/parser.mly" +||||||| 04da777f7 +# 3261 "parsing/parser.mly" +======= +# 3251 "parsing/parser.mly" +>>>>>>> origin/main ( N_ary.Pfunction_body _1 ) -# 10349 "parsing/parser.ml" +# 10973 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10368,9 +14581,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2774 "parsing/parser.mly" +<<<<<<< HEAD +# 2731 "parsing/parser.mly" +||||||| 04da777f7 +# 2729 "parsing/parser.mly" +======= +# 2719 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 10374 "parsing/parser.ml" +# 10998 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10435,7 +14654,7 @@ module Tables = struct let _5 : (Parsetree.module_expr) = Obj.magic _5 in let _1_inlined3 : (string option) = Obj.magic _1_inlined3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10448,9 +14667,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 10454 "parsing/parser.ml" +# 11078 "parsing/parser.ml" in let _3 = @@ -10458,21 +14677,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 10464 "parsing/parser.ml" +# 11088 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 10470 "parsing/parser.ml" +# 11094 "parsing/parser.ml" in -# 2827 "parsing/parser.mly" +<<<<<<< HEAD +# 2784 "parsing/parser.mly" +||||||| 04da777f7 +# 2782 "parsing/parser.mly" +======= +# 2772 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_letmodule(_4, _5, _7), _3 ) -# 10476 "parsing/parser.ml" +# 11100 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -10480,10 +14725,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10487 "parsing/parser.ml" +# 11111 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10552,11 +14803,11 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _2_inlined1 : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * + let _2_inlined1 : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * Parsetree.constructor_arguments * Parsetree.core_type option) = Obj.magic _2_inlined1 in - let _1_inlined3 : (string) = Obj.magic _1_inlined3 in + let _1_inlined3 : (Asttypes.label) = Obj.magic _1_inlined3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10568,9 +14819,19 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 10574 "parsing/parser.ml" +# 11198 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -10579,23 +14840,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 10585 "parsing/parser.ml" +# 11209 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3880 "parsing/parser.mly" +<<<<<<< HEAD +# 4040 "parsing/parser.mly" +||||||| 04da777f7 +# 4033 "parsing/parser.mly" +======= +# 4024 "parsing/parser.mly" +>>>>>>> origin/main ( let vars_jkinds, args, res = _2 in Jane_syntax.Extension_constructor.extension_constructor_of ~loc:(make_loc _sloc) ~name:_1 ~attrs:_3 (Jext_layout (Lext_decl (vars_jkinds, args, res))) ) -# 10599 "parsing/parser.ml" +# 11223 "parsing/parser.ml" in let _3 = @@ -10603,21 +14870,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 10609 "parsing/parser.ml" +# 11233 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 10615 "parsing/parser.ml" +# 11239 "parsing/parser.ml" in -# 2829 "parsing/parser.mly" +<<<<<<< HEAD +# 2786 "parsing/parser.mly" +||||||| 04da777f7 +# 2784 "parsing/parser.mly" +======= +# 2774 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_letexception(_4, _6), _3 ) -# 10621 "parsing/parser.ml" +# 11245 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -10625,10 +14918,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10632 "parsing/parser.ml" +# 11256 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10686,7 +14985,7 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.module_expr) = Obj.magic _5 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10698,28 +14997,64 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 10704 "parsing/parser.ml" +# 11328 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 10710 "parsing/parser.ml" +# 11334 "parsing/parser.ml" in let _3 = -# 4627 "parsing/parser.mly" +<<<<<<< HEAD +# 4910 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Fresh ) -# 10716 "parsing/parser.ml" +# 11340 "parsing/parser.ml" in -# 2831 "parsing/parser.mly" +<<<<<<< HEAD +# 2788 "parsing/parser.mly" +||||||| 04da777f7 +# 2786 "parsing/parser.mly" +======= +# 2776 "parsing/parser.mly" +>>>>>>> origin/main ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 10723 "parsing/parser.ml" +# 11347 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -10727,10 +15062,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10734 "parsing/parser.ml" +# 11358 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10794,7 +15135,7 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.module_expr) = Obj.magic _5 in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in @@ -10807,28 +15148,64 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 10813 "parsing/parser.ml" +# 11437 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 10819 "parsing/parser.ml" +# 11443 "parsing/parser.ml" in let _3 = -# 4628 "parsing/parser.mly" +<<<<<<< HEAD +# 4911 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( Override ) -# 10825 "parsing/parser.ml" +# 11449 "parsing/parser.ml" in -# 2831 "parsing/parser.mly" +<<<<<<< HEAD +# 2788 "parsing/parser.mly" +||||||| 04da777f7 +# 2786 "parsing/parser.mly" +======= +# 2776 "parsing/parser.mly" +>>>>>>> origin/main ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 10832 "parsing/parser.ml" +# 11456 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -10836,10 +15213,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10843 "parsing/parser.ml" +# 11467 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10891,7 +15274,7 @@ module Tables = struct let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -10902,18 +15285,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 10906 "parsing/parser.ml" +# 11530 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 10911 "parsing/parser.ml" +# 11535 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 10917 "parsing/parser.ml" +# 11541 "parsing/parser.ml" in let _2 = @@ -10921,21 +15310,65 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +# 5009 "parsing/parser.mly" ( _1 ) -# 10927 "parsing/parser.ml" +<<<<<<< HEAD +# 11551 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +# 5022 "parsing/parser.mly" +======= +# 11864 "parsing/parser.ml" +<<<<<<< HEAD + + in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 11874 "parsing/parser.ml" +||||||| 04da777f7 + + in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 11874 "parsing/parser.ml" +======= +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 10933 "parsing/parser.ml" +# 11557 "parsing/parser.ml" in -# 2835 "parsing/parser.mly" +<<<<<<< HEAD +# 2792 "parsing/parser.mly" +||||||| 04da777f7 +# 2790 "parsing/parser.mly" +======= +# 2780 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_match(_3, _5), _2 ) -# 10939 "parsing/parser.ml" +# 11563 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -10943,10 +15376,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10950 "parsing/parser.ml" +# 11574 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10998,7 +15437,7 @@ module Tables = struct let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11009,18 +15448,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11013 "parsing/parser.ml" +# 11637 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 11018 "parsing/parser.ml" +# 11642 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 11024 "parsing/parser.ml" +# 11648 "parsing/parser.ml" in let _2 = @@ -11028,21 +15473,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 11034 "parsing/parser.ml" +# 11658 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11040 "parsing/parser.ml" +# 11664 "parsing/parser.ml" in -# 2837 "parsing/parser.mly" +<<<<<<< HEAD +# 2794 "parsing/parser.mly" +||||||| 04da777f7 +# 2792 "parsing/parser.mly" +======= +# 2782 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_try(_3, _5), _2 ) -# 11046 "parsing/parser.ml" +# 11670 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -11050,10 +15521,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 11057 "parsing/parser.ml" +# 11681 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11105,7 +15582,7 @@ module Tables = struct let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11116,21 +15593,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 11122 "parsing/parser.ml" +# 11746 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11128 "parsing/parser.ml" +# 11752 "parsing/parser.ml" in -# 2839 "parsing/parser.mly" +<<<<<<< HEAD +# 2796 "parsing/parser.mly" +||||||| 04da777f7 +# 2794 "parsing/parser.mly" +======= +# 2784 "parsing/parser.mly" +>>>>>>> origin/main ( syntax_error() ) -# 11134 "parsing/parser.ml" +# 11758 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -11138,10 +15641,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 11145 "parsing/parser.ml" +# 11769 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11207,7 +15716,7 @@ module Tables = struct let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11216,27 +15725,51 @@ module Tables = struct let _7 = let _1 = _1_inlined4 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11222 "parsing/parser.ml" +# 11846 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11227 "parsing/parser.ml" +# 11851 "parsing/parser.ml" in let _5 = let _1 = _1_inlined3 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11235 "parsing/parser.ml" +# 11859 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11240 "parsing/parser.ml" +# 11864 "parsing/parser.ml" in let _2 = @@ -11244,21 +15777,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 11250 "parsing/parser.ml" +# 11874 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11256 "parsing/parser.ml" +# 11880 "parsing/parser.ml" in -# 2841 "parsing/parser.mly" +<<<<<<< HEAD +# 2798 "parsing/parser.mly" +||||||| 04da777f7 +# 2796 "parsing/parser.mly" +======= +# 2786 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 11262 "parsing/parser.ml" +# 11886 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -11266,10 +15825,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 11273 "parsing/parser.ml" +# 11897 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11349,14 +15914,14 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined6 : (Parsetree.attributes) = Obj.magic _1_inlined6 in - let _1_inlined5 : (string Location.loc option) = Obj.magic _1_inlined5 in + let _1_inlined5 : (string Asttypes.loc option) = Obj.magic _1_inlined5 in let _1_inlined4 : unit = Obj.magic _1_inlined4 in let _6 : unit = Obj.magic _6 in let _1_inlined3 : (Parsetree.expression) = Obj.magic _1_inlined3 in let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11370,18 +15935,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11374 "parsing/parser.ml" +# 11998 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 11379 "parsing/parser.ml" +# 12003 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 11385 "parsing/parser.ml" +# 12009 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11390,47 +15961,91 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 11396 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 12020 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11402 "parsing/parser.ml" +# 12026 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 11415 "parsing/parser.ml" +# 12039 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11421 "parsing/parser.ml" +# 12045 "parsing/parser.ml" in let _5 = let _1 = _1_inlined3 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11429 "parsing/parser.ml" +# 12053 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11434 "parsing/parser.ml" +# 12058 "parsing/parser.ml" in let _2 = @@ -11438,21 +16053,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 11444 "parsing/parser.ml" +# 12068 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11450 "parsing/parser.ml" +# 12074 "parsing/parser.ml" in -# 2841 "parsing/parser.mly" +<<<<<<< HEAD +# 2798 "parsing/parser.mly" +||||||| 04da777f7 +# 2796 "parsing/parser.mly" +======= +# 2786 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 11456 "parsing/parser.ml" +# 12080 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -11460,10 +16101,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 11467 "parsing/parser.ml" +# 12091 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11545,12 +16192,12 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let _1_inlined4 : (string Location.loc option) = Obj.magic _1_inlined4 in + let _1_inlined4 : (string Asttypes.loc option) = Obj.magic _1_inlined4 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11559,14 +16206,26 @@ module Tables = struct let _7 = let _1 = _1_inlined6 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11565 "parsing/parser.ml" +# 12189 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11570 "parsing/parser.ml" +# 12194 "parsing/parser.ml" in let _5 = @@ -11577,18 +16236,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11581 "parsing/parser.ml" +# 12205 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 11586 "parsing/parser.ml" +# 12210 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 11592 "parsing/parser.ml" +# 12216 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11597,34 +16262,66 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 11603 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 12227 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11609 "parsing/parser.ml" +# 12233 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 11622 "parsing/parser.ml" +# 12246 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11628 "parsing/parser.ml" +# 12252 "parsing/parser.ml" in let _2 = @@ -11632,21 +16329,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 11638 "parsing/parser.ml" +# 12262 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11644 "parsing/parser.ml" +# 12268 "parsing/parser.ml" in -# 2841 "parsing/parser.mly" +<<<<<<< HEAD +# 2798 "parsing/parser.mly" +||||||| 04da777f7 +# 2796 "parsing/parser.mly" +======= +# 2786 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 11650 "parsing/parser.ml" +# 12274 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined6_ in @@ -11654,10 +16377,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 11661 "parsing/parser.ml" +# 12285 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11755,17 +16484,17 @@ module Tables = struct } = _menhir_stack in let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in let _1_inlined8 : (Parsetree.attributes) = Obj.magic _1_inlined8 in - let _1_inlined7 : (string Location.loc option) = Obj.magic _1_inlined7 in + let _1_inlined7 : (string Asttypes.loc option) = Obj.magic _1_inlined7 in let _1_inlined6 : unit = Obj.magic _1_inlined6 in let _6 : unit = Obj.magic _6 in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let _1_inlined4 : (string Location.loc option) = Obj.magic _1_inlined4 in + let _1_inlined4 : (string Asttypes.loc option) = Obj.magic _1_inlined4 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11779,18 +16508,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11783 "parsing/parser.ml" +# 12407 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 11788 "parsing/parser.ml" +# 12412 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 11794 "parsing/parser.ml" +# 12418 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11799,34 +16534,66 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 11805 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 12429 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11811 "parsing/parser.ml" +# 12435 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 11824 "parsing/parser.ml" +# 12448 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11830 "parsing/parser.ml" +# 12454 "parsing/parser.ml" in let _5 = @@ -11837,18 +16604,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11841 "parsing/parser.ml" +# 12465 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 11846 "parsing/parser.ml" +# 12470 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 11852 "parsing/parser.ml" +# 12476 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11857,34 +16630,66 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 11863 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 12487 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11869 "parsing/parser.ml" +# 12493 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 11882 "parsing/parser.ml" +# 12506 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11888 "parsing/parser.ml" +# 12512 "parsing/parser.ml" in let _2 = @@ -11892,21 +16697,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 11898 "parsing/parser.ml" +# 12522 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 11904 "parsing/parser.ml" +# 12528 "parsing/parser.ml" in -# 2841 "parsing/parser.mly" +<<<<<<< HEAD +# 2798 "parsing/parser.mly" +||||||| 04da777f7 +# 2796 "parsing/parser.mly" +======= +# 2786 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 11910 "parsing/parser.ml" +# 12534 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_inlined1_ in @@ -11914,10 +16745,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 11921 "parsing/parser.ml" +# 12545 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11969,7 +16806,7 @@ module Tables = struct let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11978,14 +16815,26 @@ module Tables = struct let _5 = let _1 = _1_inlined3 in let _1 = -# 2639 "parsing/parser.mly" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11984 "parsing/parser.ml" +# 12608 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 11989 "parsing/parser.ml" +# 12613 "parsing/parser.ml" in let _2 = @@ -11993,21 +16842,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 11999 "parsing/parser.ml" +# 12623 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12005 "parsing/parser.ml" +# 12629 "parsing/parser.ml" in -# 2843 "parsing/parser.mly" +<<<<<<< HEAD +# 2800 "parsing/parser.mly" +||||||| 04da777f7 +# 2798 "parsing/parser.mly" +======= +# 2788 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 12011 "parsing/parser.ml" +# 12635 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -12015,10 +16890,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12022 "parsing/parser.ml" +# 12646 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12086,12 +16967,12 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let _1_inlined4 : (string Location.loc option) = Obj.magic _1_inlined4 in + let _1_inlined4 : (string Asttypes.loc option) = Obj.magic _1_inlined4 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -12105,18 +16986,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 12109 "parsing/parser.ml" +# 12733 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 12114 "parsing/parser.ml" +# 12738 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 12120 "parsing/parser.ml" +# 12744 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12125,34 +17012,66 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 12131 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 12755 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12137 "parsing/parser.ml" +# 12761 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 12150 "parsing/parser.ml" +# 12774 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 12156 "parsing/parser.ml" +# 12780 "parsing/parser.ml" in let _2 = @@ -12160,21 +17079,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 12166 "parsing/parser.ml" +# 12790 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12172 "parsing/parser.ml" +# 12796 "parsing/parser.ml" in -# 2843 "parsing/parser.mly" +<<<<<<< HEAD +# 2800 "parsing/parser.mly" +||||||| 04da777f7 +# 2798 "parsing/parser.mly" +======= +# 2788 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 12178 "parsing/parser.ml" +# 12802 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -12182,10 +17127,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12189 "parsing/parser.ml" +# 12813 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12244,37 +17195,69 @@ module Tables = struct let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_inlined1_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2862 "parsing/parser.mly" +<<<<<<< HEAD +# 2819 "parsing/parser.mly" +||||||| 04da777f7 +# 2817 "parsing/parser.mly" +======= +# 2807 "parsing/parser.mly" +>>>>>>> origin/main ( e ) -# 12257 "parsing/parser.ml" +# 12881 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 12266 "parsing/parser.ml" +# 12890 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12272 "parsing/parser.ml" +# 12896 "parsing/parser.ml" in -# 2845 "parsing/parser.mly" +<<<<<<< HEAD +# 2802 "parsing/parser.mly" +||||||| 04da777f7 +# 2800 "parsing/parser.mly" +======= +# 2790 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_while(_3, _4), _2 ) -# 12278 "parsing/parser.ml" +# 12902 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -12282,10 +17265,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12289 "parsing/parser.ml" +# 12913 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12344,7 +17333,7 @@ module Tables = struct let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -12355,9 +17344,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2864 "parsing/parser.mly" +<<<<<<< HEAD +# 2821 "parsing/parser.mly" +||||||| 04da777f7 +# 2819 "parsing/parser.mly" +======= +# 2809 "parsing/parser.mly" +>>>>>>> origin/main ( unclosed "do" _loc__1_ "done" _loc__2_ ) -# 12361 "parsing/parser.ml" +# 12985 "parsing/parser.ml" in let _2 = @@ -12365,21 +17360,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 12371 "parsing/parser.ml" +# 12995 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12377 "parsing/parser.ml" +# 13001 "parsing/parser.ml" in -# 2845 "parsing/parser.mly" +<<<<<<< HEAD +# 2802 "parsing/parser.mly" +||||||| 04da777f7 +# 2800 "parsing/parser.mly" +======= +# 2790 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_while(_3, _4), _2 ) -# 12383 "parsing/parser.ml" +# 13007 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -12387,10 +17408,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12394 "parsing/parser.ml" +# 13018 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12477,37 +17504,69 @@ module Tables = struct let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.pattern) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_inlined1_ in let _v : (Parsetree.expression) = let _1 = let _8 = -# 2862 "parsing/parser.mly" +<<<<<<< HEAD +# 2819 "parsing/parser.mly" +||||||| 04da777f7 +# 2817 "parsing/parser.mly" +======= +# 2807 "parsing/parser.mly" +>>>>>>> origin/main ( e ) -# 12490 "parsing/parser.ml" +# 13114 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 12499 "parsing/parser.ml" +# 13123 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12505 "parsing/parser.ml" +# 13129 "parsing/parser.ml" in -# 2848 "parsing/parser.mly" +<<<<<<< HEAD +# 2805 "parsing/parser.mly" +||||||| 04da777f7 +# 2803 "parsing/parser.mly" +======= +# 2793 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_for(_3, _5, _7, _6, _8), _2 ) -# 12511 "parsing/parser.ml" +# 13135 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -12515,10 +17574,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12522 "parsing/parser.ml" +# 13146 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12605,7 +17670,7 @@ module Tables = struct let _4 : unit = Obj.magic _4 in let _3 : (Parsetree.pattern) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -12616,9 +17681,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2864 "parsing/parser.mly" +<<<<<<< HEAD +# 2821 "parsing/parser.mly" +||||||| 04da777f7 +# 2819 "parsing/parser.mly" +======= +# 2809 "parsing/parser.mly" +>>>>>>> origin/main ( unclosed "do" _loc__1_ "done" _loc__2_ ) -# 12622 "parsing/parser.ml" +# 13246 "parsing/parser.ml" in let _2 = @@ -12626,21 +17697,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 12632 "parsing/parser.ml" +# 13256 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12638 "parsing/parser.ml" +# 13262 "parsing/parser.ml" in -# 2848 "parsing/parser.mly" +<<<<<<< HEAD +# 2805 "parsing/parser.mly" +||||||| 04da777f7 +# 2803 "parsing/parser.mly" +======= +# 2793 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_for(_3, _5, _7, _6, _8), _2 ) -# 12644 "parsing/parser.ml" +# 13268 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -12648,10 +17745,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12655 "parsing/parser.ml" +# 13279 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12689,7 +17792,7 @@ module Tables = struct } = _menhir_stack in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -12700,21 +17803,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 12706 "parsing/parser.ml" +# 13330 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12712 "parsing/parser.ml" +# 13336 "parsing/parser.ml" in -# 2850 "parsing/parser.mly" +<<<<<<< HEAD +# 2807 "parsing/parser.mly" +||||||| 04da777f7 +# 2805 "parsing/parser.mly" +======= +# 2795 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_assert _3, _2 ) -# 12718 "parsing/parser.ml" +# 13342 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -12722,10 +17851,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12729 "parsing/parser.ml" +# 13353 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12763,7 +17898,7 @@ module Tables = struct } = _menhir_stack in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -12774,21 +17909,47 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 12780 "parsing/parser.ml" +# 13404 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 12786 "parsing/parser.ml" +# 13410 "parsing/parser.ml" in -# 2852 "parsing/parser.mly" +<<<<<<< HEAD +# 2809 "parsing/parser.mly" +||||||| 04da777f7 +# 2807 "parsing/parser.mly" +======= +# 2797 "parsing/parser.mly" +>>>>>>> origin/main ( Pexp_lazy _3, _2 ) -# 12792 "parsing/parser.ml" +# 13416 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -12796,10 +17957,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12803 "parsing/parser.ml" +# 13427 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12832,22 +17999,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in let _1 = -# 2639 "parsing/parser.mly" +# 2564 "parsing/parser.mly" ( _1 ) -# 12838 "parsing/parser.ml" +# 13462 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 12843 "parsing/parser.ml" +# 13467 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2854 "parsing/parser.mly" +# 2799 "parsing/parser.mly" ( let desc, attrs = mkuminus ~oploc:_loc__1_ _1 _2 in desc, (None, attrs) ) -# 12851 "parsing/parser.ml" +# 13475 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -12855,10 +18022,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +# 2721 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12862 "parsing/parser.ml" +# 13486 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12902,7 +18069,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (string) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -12917,18 +18084,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 12921 "parsing/parser.ml" +# 13545 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 12926 "parsing/parser.ml" +# 13550 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +# 3255 "parsing/parser.mly" ( xs ) -# 12932 "parsing/parser.ml" +# 13556 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12937,42 +18104,42 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +# 5009 "parsing/parser.mly" ( _1 ) -# 12943 "parsing/parser.ml" +# 13567 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +# 5022 "parsing/parser.mly" ( _1, _2 ) -# 12949 "parsing/parser.ml" +# 13573 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 12962 "parsing/parser.ml" +# 13586 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 12968 "parsing/parser.ml" +# 13592 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2854 "parsing/parser.mly" +# 2799 "parsing/parser.mly" ( let desc, attrs = mkuminus ~oploc:_loc__1_ _1 _2 in desc, (None, attrs) ) -# 12976 "parsing/parser.ml" +# 13600 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -12980,10 +18147,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +# 2721 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 12987 "parsing/parser.ml" +# 13611 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13016,22 +18183,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in let _1 = -# 2639 "parsing/parser.mly" +# 2564 "parsing/parser.mly" ( _1 ) -# 13022 "parsing/parser.ml" +# 13646 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 13027 "parsing/parser.ml" +# 13651 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2857 "parsing/parser.mly" +# 2802 "parsing/parser.mly" ( let desc, attrs = mkuplus ~oploc:_loc__1_ _1 _2 in desc, (None, attrs) ) -# 13035 "parsing/parser.ml" +# 13659 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -13039,10 +18206,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +# 2721 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 13046 "parsing/parser.ml" +# 13670 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13086,7 +18253,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (string) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -13101,18 +18268,180 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13105 "parsing/parser.ml" +# 13729 "parsing/parser.ml" in -# 1500 "parsing/parser.mly" +# 1413 "parsing/parser.mly" + ( xs ) +# 13734 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 13740 "parsing/parser.ml" +<<<<<<< HEAD +======= + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : (string) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let _2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 13775 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 13780 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2811 "parsing/parser.mly" +||||||| 04da777f7 +# 2809 "parsing/parser.mly" +======= +# 2799 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = mkuminus ~oploc:_loc__1_ _1 _2 in + desc, (None, attrs) ) +# 13788 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +# 13799 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (string) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 13858 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" ( xs ) -# 13110 "parsing/parser.ml" +# 13863 "parsing/parser.ml" in -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 13116 "parsing/parser.ml" +# 13869 "parsing/parser.ml" +>>>>>>> upstream/main in let _endpos__3_ = _endpos_xs_ in @@ -13121,42 +18450,85 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 13127 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 13751 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 13133 "parsing/parser.ml" +# 13757 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 13146 "parsing/parser.ml" +# 13770 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13152 "parsing/parser.ml" +# 13776 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2857 "parsing/parser.mly" +<<<<<<< HEAD +# 2802 "parsing/parser.mly" ( let desc, attrs = mkuplus ~oploc:_loc__1_ _1 _2 in +======= +<<<<<<< HEAD +# 2811 "parsing/parser.mly" +||||||| 04da777f7 +# 2809 "parsing/parser.mly" +======= +# 2799 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = mkuminus ~oploc:_loc__1_ _1 _2 in +>>>>>>> upstream/main desc, (None, attrs) ) -# 13160 "parsing/parser.ml" +# 13784 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -13164,10 +18536,270 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2776 "parsing/parser.mly" +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 13795 "parsing/parser.ml" +======= +# 13924 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : (string) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let _2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 13959 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 13964 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2814 "parsing/parser.mly" +||||||| 04da777f7 +# 2812 "parsing/parser.mly" +======= +# 2802 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = mkuplus ~oploc:_loc__1_ _1 _2 in + desc, (None, attrs) ) +# 13972 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +# 13983 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (string) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 14042 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 14047 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 14053 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 14064 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 14070 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 14083 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 14089 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2814 "parsing/parser.mly" +||||||| 04da777f7 +# 2812 "parsing/parser.mly" +======= +# 2802 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = mkuplus ~oploc:_loc__1_ _1 _2 in + desc, (None, attrs) ) +# 14097 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_xs_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2733 "parsing/parser.mly" +||||||| 04da777f7 +# 2731 "parsing/parser.mly" +======= +# 2721 "parsing/parser.mly" +>>>>>>> origin/main ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 13171 "parsing/parser.ml" +# 14108 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13226,7 +18858,7 @@ module Tables = struct let _4 : (Parsetree.core_type option) = Obj.magic _4 in let _3 : (N_ary.function_param list) = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -13236,33 +18868,59 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 13242 "parsing/parser.ml" +# 13866 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1, _2 ) -# 13248 "parsing/parser.ml" +# 13872 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2781 "parsing/parser.mly" +<<<<<<< HEAD +# 2738 "parsing/parser.mly" +||||||| 04da777f7 +# 2736 "parsing/parser.mly" +======= +# 2726 "parsing/parser.mly" +>>>>>>> origin/main ( let body_constraint = Option.map (fun x : N_ary.function_constraint -> { type_constraint = Pconstraint x - ; mode_annotations = [] + ; mode_annotations = Mode.empty }) _4 in mkfunction _3 body_constraint _6 ~loc:_sloc ~attrs:_2 ) -# 13266 "parsing/parser.ml" +# 13890 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13286,45 +18944,50 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : ((Asttypes.arg_label * Parsetree.expression) list) = Obj.magic xs in + let xs : ((Parsetree.arg_label * Parsetree.expression) list) = Obj.magic xs in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = - let xs = + let _2 = + let xs = # 253 "" ( List.rev xs ) -# 13301 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 13306 "parsing/parser.ml" - - in +# 13924 "parsing/parser.ml" + in -# 2868 "parsing/parser.mly" - ( Pexp_apply(_1, _2) ) -# 13312 "parsing/parser.ml" +# 1300 "parsing/parser.mly" + ( xs ) +# 13929 "parsing/parser.ml" in - let _endpos__1_ = _endpos_xs_ in - let _endpos = _endpos__1_ in + let _endpos__2_ = _endpos_xs_ in + let _endpos = _endpos__2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13322 "parsing/parser.ml" +<<<<<<< HEAD +# 2825 "parsing/parser.mly" +||||||| 04da777f7 +# 2823 "parsing/parser.mly" +======= +# 2813 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (Pexp_apply(_1, _2)) ) +# 13939 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13328 "parsing/parser.ml" +# 13945 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13342,35 +19005,27 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let xs : (Parsetree.expression list) = Obj.magic xs in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_xs_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = let _1 = - let _1 = - let es = - let xs = + let xs = # 253 "" ( List.rev xs ) -# 13357 "parsing/parser.ml" - in - -# 1467 "parsing/parser.mly" - ( xs ) -# 13362 "parsing/parser.ml" - - in - -# 3323 "parsing/parser.mly" - ( es ) -# 13368 "parsing/parser.ml" - - in +# 13972 "parsing/parser.ml" + in -# 2870 "parsing/parser.mly" - ( Pexp_tuple(_1) ) -# 13374 "parsing/parser.ml" +<<<<<<< HEAD +# 3388 "parsing/parser.mly" +||||||| 04da777f7 +# 3386 "parsing/parser.mly" +======= +# 3376 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 13977 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -13378,15 +19033,27 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13384 "parsing/parser.ml" +<<<<<<< HEAD +# 2827 "parsing/parser.mly" +||||||| 04da777f7 +# 2825 "parsing/parser.mly" +======= +# 2815 "parsing/parser.mly" +>>>>>>> origin/main + ( pexp_ltuple _sloc _1 ) +# 13987 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13390 "parsing/parser.ml" +# 13993 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13417,36 +19084,40 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 13428 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2872 "parsing/parser.mly" - ( Pexp_construct(_1, Some _2) ) -# 13434 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 14030 "parsing/parser.ml" in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13444 "parsing/parser.ml" +<<<<<<< HEAD +# 2829 "parsing/parser.mly" +||||||| 04da777f7 +# 2827 "parsing/parser.mly" +======= +# 2817 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (Pexp_construct(_1, Some _2)) ) +# 14039 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13450 "parsing/parser.ml" +# 14045 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13471,30 +19142,36 @@ module Tables = struct }; } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : (string) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = - let _1 = -# 2874 "parsing/parser.mly" - ( Pexp_variant(_1, Some _2) ) -# 13483 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13492 "parsing/parser.ml" +<<<<<<< HEAD +# 2831 "parsing/parser.mly" +||||||| 04da777f7 +# 2829 "parsing/parser.mly" +======= +# 2819 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (Pexp_variant(_1, Some _2)) ) +# 14081 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13498 "parsing/parser.ml" +# 14087 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13526,64 +19203,91 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 1068 "parsing/parser.mly" +# 976 "parsing/parser.mly" (string) -# 13532 "parsing/parser.ml" +# 14121 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13544 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 14132 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13549 "parsing/parser.ml" - - in - let op = - let _1 = -# 4423 "parsing/parser.mly" +# 14137 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4691 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4695 "parsing/parser.mly" +||||||| 04da777f7 +# 4688 "parsing/parser.mly" +======= +# 4679 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( op ) -# 13556 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 13565 "parsing/parser.ml" - - in +# 14145 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 13571 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14154 "parsing/parser.ml" in - let _startpos__1_ = _startpos_e1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13581 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14163 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13587 "parsing/parser.ml" +# 14169 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13633,112 +19337,165 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 1068 "parsing/parser.mly" +# 976 "parsing/parser.mly" (string) -# 13642 "parsing/parser.ml" +# 14224 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 13657 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 13662 "parsing/parser.ml" - - in +# 14238 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 13668 "parsing/parser.ml" +# 14243 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 14249 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 13679 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 13685 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 14260 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 14266 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 13698 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 13704 "parsing/parser.ml" +# 14279 "parsing/parser.ml" in - let op = - let _1 = -# 4423 "parsing/parser.mly" + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 14285 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4691 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4695 "parsing/parser.mly" +||||||| 04da777f7 +# 4688 "parsing/parser.mly" +======= +# 4679 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( op ) -# 13711 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 13720 "parsing/parser.ml" - - in +# 14293 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 13726 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14302 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13736 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14311 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13742 "parsing/parser.ml" +# 14317 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13751,14 +19508,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -13768,66 +19525,89 @@ module Tables = struct }; }; } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let op : ( -# 1069 "parsing/parser.mly" - (string) -# 13776 "parsing/parser.ml" - ) = Obj.magic op in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13788 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 14359 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13793 "parsing/parser.ml" - - in - let op = - let _1 = -# 4424 "parsing/parser.mly" - ( op ) -# 13800 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 13809 "parsing/parser.ml" - - in +# 14364 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 13815 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4693 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4697 "parsing/parser.mly" +||||||| 04da777f7 +# 4690 "parsing/parser.mly" +======= +# 4681 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ("@") +# 14372 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14380 "parsing/parser.ml" in - let _startpos__1_ = _startpos_e1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13825 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14389 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 13831 "parsing/parser.ml" +# 14395 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13845,24 +19625,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -13876,113 +19656,150 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let op : ( -# 1069 "parsing/parser.mly" - (string) -# 13886 "parsing/parser.ml" - ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 13901 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 13906 "parsing/parser.ml" - - in +# 14461 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 13912 "parsing/parser.ml" +# 14466 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 14472 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 13923 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 13929 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 14483 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 13942 "parsing/parser.ml" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 14489 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 13948 "parsing/parser.ml" - - in - let op = - let _1 = -# 4424 "parsing/parser.mly" - ( op ) -# 13955 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 13964 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 14502 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 13970 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 14508 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4693 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4697 "parsing/parser.mly" +||||||| 04da777f7 +# 4690 "parsing/parser.mly" +======= +# 4681 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ("@") +# 14516 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14524 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 13980 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14533 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 13986 "parsing/parser.ml" +# 14539 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13995,14 +19812,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -14012,66 +19829,55 @@ module Tables = struct }; }; } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let op : ( -# 1070 "parsing/parser.mly" - (string) -# 14020 "parsing/parser.ml" - ) = Obj.magic op in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 14032 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 14581 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 14037 "parsing/parser.ml" - - in - let op = - let _1 = -# 4425 "parsing/parser.mly" - ( op ) -# 14044 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 14053 "parsing/parser.ml" - - in +# 14586 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14059 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4694 "parsing/parser.mly" + ("@@") +# 14594 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14602 "parsing/parser.ml" in - let _startpos__1_ = _startpos_e1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14069 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14611 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 14075 "parsing/parser.ml" +# 14617 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14089,24 +19895,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -14120,113 +19926,102 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let op : ( -# 1070 "parsing/parser.mly" - (string) -# 14130 "parsing/parser.ml" - ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 14145 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 14150 "parsing/parser.ml" - - in +# 14683 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 14156 "parsing/parser.ml" +# 14688 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 14694 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 14167 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 14173 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 14705 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 14186 "parsing/parser.ml" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 14711 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 14192 "parsing/parser.ml" - - in - let op = - let _1 = -# 4425 "parsing/parser.mly" - ( op ) -# 14199 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 14208 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 14724 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14214 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 14730 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4694 "parsing/parser.mly" + ("@@") +# 14738 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14746 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14224 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14755 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 14230 "parsing/parser.ml" +# 14761 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14258,64 +20053,192 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 1071 "parsing/parser.mly" +# 979 "parsing/parser.mly" (string) -# 14264 "parsing/parser.ml" +# 14795 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 14276 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 14806 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 14281 "parsing/parser.ml" - - in - let op = - let _1 = -# 4426 "parsing/parser.mly" +# 14811 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = +# 4695 "parsing/parser.mly" ( op ) -# 14288 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" +# 14819 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14297 "parsing/parser.ml" - - in +# 14828 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14303 "parsing/parser.ml" + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14837 "parsing/parser.ml" +<<<<<<< HEAD +======= in - let _startpos__1_ = _startpos_e1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14313 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14846 "parsing/parser.ml" +>>>>>>> upstream/main in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 14843 "parsing/parser.ml" +======= +# 14852 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 14894 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 14899 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4698 "parsing/parser.mly" +||||||| 04da777f7 +# 4691 "parsing/parser.mly" +======= +# 4682 "parsing/parser.mly" +>>>>>>> origin/main + ("@@") +# 14907 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14915 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14924 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 14319 "parsing/parser.ml" +# 14930 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14333,24 +20256,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -14364,113 +20287,150 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let op : ( -# 1071 "parsing/parser.mly" - (string) -# 14374 "parsing/parser.ml" - ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 14389 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 14394 "parsing/parser.ml" - - in +# 14996 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 14400 "parsing/parser.ml" +# 15001 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 15007 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 14411 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 14417 "parsing/parser.ml" +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15018 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 14430 "parsing/parser.ml" +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 15024 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 14436 "parsing/parser.ml" - - in - let op = - let _1 = -# 4426 "parsing/parser.mly" - ( op ) -# 14443 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 14452 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 15037 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14458 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15043 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4698 "parsing/parser.mly" +||||||| 04da777f7 +# 4691 "parsing/parser.mly" +======= +# 4682 "parsing/parser.mly" +>>>>>>> origin/main + ("@@") +# 15051 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15059 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14468 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15068 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 14474 "parsing/parser.ml" +# 15074 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14502,64 +20462,88 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 1072 "parsing/parser.mly" +# 979 "parsing/parser.mly" (string) -# 14508 "parsing/parser.ml" +# 15108 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 14520 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 15119 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 14525 "parsing/parser.ml" - - in - let op = - let _1 = -# 4427 "parsing/parser.mly" +# 15124 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4699 "parsing/parser.mly" +||||||| 04da777f7 +# 4692 "parsing/parser.mly" +======= +# 4683 "parsing/parser.mly" +>>>>>>> origin/main ( op ) -# 14532 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 14541 "parsing/parser.ml" - - in +# 15132 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14547 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15141 "parsing/parser.ml" in - let _startpos__1_ = _startpos_e1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14557 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15150 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 14563 "parsing/parser.ml" +# 15156 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14609,112 +20593,144 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 1072 "parsing/parser.mly" +# 979 "parsing/parser.mly" (string) -# 14618 "parsing/parser.ml" +# 14898 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 14633 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 14638 "parsing/parser.ml" - - in +# 14912 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 14644 "parsing/parser.ml" +# 14917 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 14923 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 14655 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 14661 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 14934 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 14940 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 14674 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 14680 "parsing/parser.ml" +# 14953 "parsing/parser.ml" in - let op = - let _1 = -# 4427 "parsing/parser.mly" + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 14959 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4695 "parsing/parser.mly" ( op ) -# 14687 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 14696 "parsing/parser.ml" - - in +# 14967 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14702 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 14976 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14712 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 14985 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 14718 "parsing/parser.ml" +# 14991 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14727,14 +20743,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -14744,62 +20760,59 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let op : ( +# 980 "parsing/parser.mly" + (string) +# 15025 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 14761 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 15036 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 14766 "parsing/parser.ml" - - in - let op = - let _1 = -# 4428 "parsing/parser.mly" - ("+") -# 14773 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 14781 "parsing/parser.ml" - - in +# 15041 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14787 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = +# 4696 "parsing/parser.mly" + ( op ) +# 15049 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15058 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14797 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15067 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 14803 "parsing/parser.ml" +# 15073 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14817,24 +20830,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -14848,109 +20861,106 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let op : ( +# 980 "parsing/parser.mly" + (string) +# 15128 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 14870 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 14875 "parsing/parser.ml" - - in +# 15142 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 14881 "parsing/parser.ml" +# 15147 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 14892 "parsing/parser.ml" - - in + +# 3255 "parsing/parser.mly" + ( xs ) +# 15153 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 14898 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 15164 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 14911 "parsing/parser.ml" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 15170 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 14917 "parsing/parser.ml" - - in - let op = - let _1 = -# 4428 "parsing/parser.mly" - ("+") -# 14924 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 14932 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 15183 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 14938 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 15189 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4696 "parsing/parser.mly" + ( op ) +# 15197 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15206 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 14948 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15215 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 14954 "parsing/parser.ml" +# 15221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14963,14 +20973,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -14980,62 +20990,206 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let op : ( +# 981 "parsing/parser.mly" + (string) +# 15255 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 14997 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 15266 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 15002 "parsing/parser.ml" - - in - let op = - let _1 = -# 4429 "parsing/parser.mly" - ("+.") -# 15009 "parsing/parser.ml" +# 15271 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = + let op = +# 4687 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4699 "parsing/parser.mly" +||||||| 04da777f7 +# 4692 "parsing/parser.mly" +======= +# 4683 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( op ) +# 15280 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15017 "parsing/parser.ml" +# 4697 "parsing/parser.mly" + ( op ) +# 15285 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15023 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15295 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15033 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +<<<<<<< HEAD +# 15304 "parsing/parser.ml" +======= +# 15298 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15304 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let op : ( +# 980 "parsing/parser.mly" + (string) +# 15338 "parsing/parser.ml" + ) = Obj.magic op in + let e1 : (Parsetree.expression) = Obj.magic e1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15349 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15354 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4700 "parsing/parser.mly" +||||||| 04da777f7 +# 4693 "parsing/parser.mly" +======= +# 4684 "parsing/parser.mly" +>>>>>>> origin/main + ( op ) +# 15362 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15371 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15380 "parsing/parser.ml" +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15039 "parsing/parser.ml" +<<<<<<< HEAD +# 15310 "parsing/parser.ml" +======= +# 15386 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15053,24 +21207,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -15084,109 +21238,154 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let op : ( +# 980 "parsing/parser.mly" + (string) +# 15441 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 15106 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 15111 "parsing/parser.ml" - - in +# 15455 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 15117 "parsing/parser.ml" +# 15460 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 15466 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 15128 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 15134 "parsing/parser.ml" +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15477 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 15147 "parsing/parser.ml" +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 15483 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 15153 "parsing/parser.ml" - - in - let op = - let _1 = -# 4429 "parsing/parser.mly" - ("+.") -# 15160 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15168 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 15496 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15174 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15502 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4700 "parsing/parser.mly" +||||||| 04da777f7 +# 4693 "parsing/parser.mly" +======= +# 4684 "parsing/parser.mly" +>>>>>>> origin/main + ( op ) +# 15510 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15519 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15184 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15528 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15190 "parsing/parser.ml" +# 15534 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15199,14 +21398,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -15216,62 +21415,103 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let op : ( +# 981 "parsing/parser.mly" + (string) +# 15568 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15233 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 15579 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15238 "parsing/parser.ml" - - in - let op = - let _1 = -# 4430 "parsing/parser.mly" - ("+=") -# 15245 "parsing/parser.ml" +# 15584 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = + let op = +<<<<<<< HEAD +# 4691 "parsing/parser.mly" +||||||| 04da777f7 +# 4684 "parsing/parser.mly" +======= +# 4675 "parsing/parser.mly" +>>>>>>> origin/main + ( op ) +# 15593 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15253 "parsing/parser.ml" +<<<<<<< HEAD +# 4701 "parsing/parser.mly" +||||||| 04da777f7 +# 4694 "parsing/parser.mly" +======= +# 4685 "parsing/parser.mly" +>>>>>>> origin/main + ( op ) +# 15598 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15259 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15608 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15269 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15617 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15275 "parsing/parser.ml" +# 15623 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15289,24 +21529,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -15320,109 +21560,183 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let op : ( +# 981 "parsing/parser.mly" + (string) +# 15365 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 15342 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 15347 "parsing/parser.ml" - - in +# 15379 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 15353 "parsing/parser.ml" +# 15384 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 15390 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 15364 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 15370 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 15401 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 15407 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 15383 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 15389 "parsing/parser.ml" +# 15420 "parsing/parser.ml" in - let op = - let _1 = -# 4430 "parsing/parser.mly" - ("+=") -# 15396 "parsing/parser.ml" + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15426 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = + let op = +<<<<<<< HEAD +# 4687 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4691 "parsing/parser.mly" +||||||| 04da777f7 +# 4684 "parsing/parser.mly" +======= +# 4675 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( op ) +# 15435 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15404 "parsing/parser.ml" +<<<<<<< HEAD +# 4697 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4701 "parsing/parser.mly" +||||||| 04da777f7 +# 4694 "parsing/parser.mly" +======= +# 4685 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( op ) +# 15440 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15410 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15450 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15420 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15459 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15426 "parsing/parser.ml" +# 15465 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15459,55 +21773,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15469 "parsing/parser.ml" +# 15507 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15512 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = + let op = +<<<<<<< HEAD +# 4688 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4692 "parsing/parser.mly" +||||||| 04da777f7 +# 4685 "parsing/parser.mly" +======= +# 4676 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( "mod" ) +# 15521 "parsing/parser.ml" in -# 2823 "parsing/parser.mly" - ( _1 ) -# 15474 "parsing/parser.ml" - - in - let op = - let _1 = -# 4431 "parsing/parser.mly" - ("-") -# 15481 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15489 "parsing/parser.ml" +<<<<<<< HEAD +# 4697 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4701 "parsing/parser.mly" +||||||| 04da777f7 +# 4694 "parsing/parser.mly" +======= +# 4685 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( op ) +# 15526 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15495 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15535 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15505 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15544 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 15511 "parsing/parser.ml" +# 15550 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15557,7 +21909,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -15565,100 +21917,100 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 15578 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 15583 "parsing/parser.ml" - - in +# 15616 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 15589 "parsing/parser.ml" +# 15621 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 15627 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 15600 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 15606 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 15638 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 15644 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 15619 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 15625 "parsing/parser.ml" +# 15657 "parsing/parser.ml" in - let op = - let _1 = -# 4431 "parsing/parser.mly" - ("-") -# 15632 "parsing/parser.ml" + +# 2768 "parsing/parser.mly" + ( _1 ) +# 15663 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = + let op = +# 4688 "parsing/parser.mly" + ( "mod" ) +# 15672 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15640 "parsing/parser.ml" +# 4697 "parsing/parser.mly" + ( op ) +# 15677 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15646 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15686 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15656 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15695 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 15662 "parsing/parser.ml" +# 15701 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15671,14 +22023,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -15688,62 +22040,153 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let op : ( +# 982 "parsing/parser.mly" + (string) +# 15735 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 15705 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 15746 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 15710 "parsing/parser.ml" - - in - let op = - let _1 = -# 4432 "parsing/parser.mly" - ("-.") -# 15717 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15725 "parsing/parser.ml" - - in +# 15751 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15731 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = +# 4698 "parsing/parser.mly" + ( op ) +# 15759 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15768 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15741 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15777 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" + ( _1 ) +# 15783 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let op : ( +# 982 "parsing/parser.mly" + (string) +# 15838 "parsing/parser.ml" + ) = Obj.magic op in + let e1 : (Parsetree.expression) = Obj.magic e1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 15852 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 15857 "parsing/parser.ml" +<<<<<<< HEAD + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 15863 "parsing/parser.ml" +======= + + in + +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15747 "parsing/parser.ml" +# 15863 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15793,7 +22236,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -15801,100 +22244,167 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 15814 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 15819 "parsing/parser.ml" - - in +# 15929 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 15825 "parsing/parser.ml" +# 15934 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 15940 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 15836 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 15842 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 15874 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 15880 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 15855 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 15861 "parsing/parser.ml" +# 15893 "parsing/parser.ml" in - let op = - let _1 = -# 4432 "parsing/parser.mly" - ("-.") -# 15868 "parsing/parser.ml" + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 15899 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = +<<<<<<< HEAD + let _1 = +# 4698 "parsing/parser.mly" +======= + let _1 = + let op = +<<<<<<< HEAD +# 4692 "parsing/parser.mly" +||||||| 04da777f7 +# 4685 "parsing/parser.mly" +======= +# 4676 "parsing/parser.mly" +>>>>>>> origin/main + ( "mod" ) +# 15985 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15876 "parsing/parser.ml" +<<<<<<< HEAD +# 4701 "parsing/parser.mly" +||||||| 04da777f7 +# 4694 "parsing/parser.mly" +======= +# 4685 "parsing/parser.mly" +>>>>>>> origin/main + ( op ) +# 15990 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15882 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15999 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15892 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16008 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15898 "parsing/parser.ml" +# 16014 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15907,14 +22417,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -15924,62 +22434,93 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let op : ( +# 982 "parsing/parser.mly" + (string) +# 16048 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15941 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 16059 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15946 "parsing/parser.ml" - - in - let op = - let _1 = -# 4433 "parsing/parser.mly" - ("*") -# 15953 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 15961 "parsing/parser.ml" - - in +# 16064 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 15967 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4702 "parsing/parser.mly" +||||||| 04da777f7 +# 4695 "parsing/parser.mly" +======= +# 4686 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( op ) +# 15907 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15916 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 15977 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 15925 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 15983 "parsing/parser.ml" +<<<<<<< HEAD +# 15931 "parsing/parser.ml" +======= +# 16096 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15997,24 +22538,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = e1; @@ -16028,109 +22569,155 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let op : ( +# 982 "parsing/parser.mly" + (string) +# 16151 "parsing/parser.ml" + ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 16050 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 16055 "parsing/parser.ml" - - in +# 16165 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 16061 "parsing/parser.ml" +# 16170 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 16176 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 16072 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 16078 "parsing/parser.ml" +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 16187 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 16091 "parsing/parser.ml" +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 16193 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 16097 "parsing/parser.ml" - - in - let op = - let _1 = -# 4433 "parsing/parser.mly" - ("*") -# 16104 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16112 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 16206 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16118 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 16212 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4702 "parsing/parser.mly" +||||||| 04da777f7 +# 4695 "parsing/parser.mly" +======= +# 4686 "parsing/parser.mly" +>>>>>>> origin/main + ( op ) +# 16220 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16229 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16128 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16238 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 16134 "parsing/parser.ml" +# 16244 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16167,55 +22754,63 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 16177 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 16182 "parsing/parser.ml" - - in - let op = - let _1 = -# 4434 "parsing/parser.mly" - ("%") -# 16189 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16197 "parsing/parser.ml" - - in +# 15973 "parsing/parser.ml" + in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16203 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 15978 "parsing/parser.ml" +======= +# 16291 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4687 "parsing/parser.mly" + ("+") +# 16299 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16307 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16213 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16316 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 16219 "parsing/parser.ml" +# 16322 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16265,7 +22860,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -16273,100 +22868,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 16286 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 16291 "parsing/parser.ml" - - in +# 16388 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 16297 "parsing/parser.ml" +# 16393 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 16399 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 16308 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 16314 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 16410 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 16327 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 16416 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 16333 "parsing/parser.ml" - - in - let op = - let _1 = -# 4434 "parsing/parser.mly" - ("%") -# 16340 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16348 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 16429 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16354 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16435 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4687 "parsing/parser.mly" + ("+") +# 16443 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16451 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16364 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16460 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 16370 "parsing/parser.ml" +# 16466 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16403,55 +22991,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 16413 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 16508 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 16418 "parsing/parser.ml" - - in - let op = - let _1 = -# 4435 "parsing/parser.mly" - ("=") -# 16425 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16433 "parsing/parser.ml" - - in +# 16513 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16439 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4688 "parsing/parser.mly" + ("+.") +# 16521 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16529 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16449 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16538 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 16455 "parsing/parser.ml" +# 16544 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16501,7 +23082,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -16509,100 +23090,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 16522 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 16527 "parsing/parser.ml" - - in +# 16610 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 16533 "parsing/parser.ml" +# 16615 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 16621 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 16544 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 16550 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 16632 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 16563 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 16638 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 16569 "parsing/parser.ml" - - in - let op = - let _1 = -# 4435 "parsing/parser.mly" - ("=") -# 16576 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16584 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 16651 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16590 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16657 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4688 "parsing/parser.mly" + ("+.") +# 16665 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16673 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16600 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16682 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 16606 "parsing/parser.ml" +# 16688 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16639,55 +23213,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 16649 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 16730 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 16654 "parsing/parser.ml" - - in - let op = - let _1 = -# 4436 "parsing/parser.mly" - ("<") -# 16661 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16669 "parsing/parser.ml" - - in +# 16735 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16675 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4689 "parsing/parser.mly" + ("+=") +# 16743 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16751 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16685 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16760 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 16691 "parsing/parser.ml" +# 16766 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16737,7 +23304,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -16745,100 +23312,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 16758 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 16763 "parsing/parser.ml" - - in +# 16832 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 16769 "parsing/parser.ml" +# 16837 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 16843 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 16780 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 16786 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 16854 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 16799 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 16860 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 16805 "parsing/parser.ml" - - in - let op = - let _1 = -# 4436 "parsing/parser.mly" - ("<") -# 16812 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16820 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 16873 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16826 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16879 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4689 "parsing/parser.mly" + ("+=") +# 16887 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16895 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16836 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16904 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 16842 "parsing/parser.ml" +# 16910 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16875,55 +23435,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 16885 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 16952 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 16890 "parsing/parser.ml" - - in - let op = - let _1 = -# 4437 "parsing/parser.mly" - (">") -# 16897 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 16905 "parsing/parser.ml" - - in +# 16957 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 16911 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4690 "parsing/parser.mly" + ("-") +# 16965 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16973 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 16921 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16982 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 16927 "parsing/parser.ml" +# 16988 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16973,7 +23526,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -16981,100 +23534,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 16994 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 16999 "parsing/parser.ml" - - in +# 17054 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 17005 "parsing/parser.ml" +# 17059 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17065 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 17016 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 17022 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 17076 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 17035 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 17082 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 17041 "parsing/parser.ml" - - in - let op = - let _1 = -# 4437 "parsing/parser.mly" - (">") -# 17048 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17056 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17095 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17062 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17101 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4690 "parsing/parser.mly" + ("-") +# 17109 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17117 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17072 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17126 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17078 "parsing/parser.ml" +# 17132 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17111,55 +23657,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 17121 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 17174 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 17126 "parsing/parser.ml" - - in - let op = - let _1 = -# 4438 "parsing/parser.mly" - ("or") -# 17133 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17141 "parsing/parser.ml" - - in +# 17179 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17147 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4691 "parsing/parser.mly" + ("-.") +# 17187 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17195 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17157 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17204 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17163 "parsing/parser.ml" +# 17210 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17209,7 +23748,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -17217,100 +23756,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 17230 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 17235 "parsing/parser.ml" - - in +# 17276 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 17241 "parsing/parser.ml" +# 17281 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17287 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 17252 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 17258 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 17298 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 17271 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 17304 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 17277 "parsing/parser.ml" - - in - let op = - let _1 = -# 4438 "parsing/parser.mly" - ("or") -# 17284 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17292 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17317 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17298 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17323 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4691 "parsing/parser.mly" + ("-.") +# 17331 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17339 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17308 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17348 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17314 "parsing/parser.ml" +# 17354 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17347,55 +23879,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 17357 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 17396 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 17362 "parsing/parser.ml" - - in - let op = - let _1 = -# 4439 "parsing/parser.mly" - ("||") -# 17369 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17377 "parsing/parser.ml" - - in +# 17401 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17383 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4692 "parsing/parser.mly" + ("*") +# 17409 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17417 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17393 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17426 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17399 "parsing/parser.ml" +# 17432 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17445,7 +23970,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -17453,100 +23978,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 17466 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 17471 "parsing/parser.ml" - - in +# 17498 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 17477 "parsing/parser.ml" +# 17503 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17509 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 17488 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 17494 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 17520 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 17507 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 17526 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 17513 "parsing/parser.ml" - - in - let op = - let _1 = -# 4439 "parsing/parser.mly" - ("||") -# 17520 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17528 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17539 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17534 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17545 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4692 "parsing/parser.mly" + ("*") +# 17553 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17561 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17544 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17570 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17550 "parsing/parser.ml" +# 17576 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17583,55 +24101,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 17593 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 17618 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 17598 "parsing/parser.ml" - - in - let op = - let _1 = -# 4440 "parsing/parser.mly" - ("&") -# 17605 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17613 "parsing/parser.ml" - - in +# 17623 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17619 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4693 "parsing/parser.mly" + ("%") +# 17631 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17639 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17629 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17648 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17635 "parsing/parser.ml" +# 17654 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17681,7 +24192,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -17689,100 +24200,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 17702 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 17707 "parsing/parser.ml" - - in +# 17720 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 17713 "parsing/parser.ml" +# 17725 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17731 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 17724 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 17730 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 17742 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 17743 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 17748 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 17749 "parsing/parser.ml" - - in - let op = - let _1 = -# 4440 "parsing/parser.mly" - ("&") -# 17756 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17764 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17761 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17770 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17767 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4693 "parsing/parser.mly" + ("%") +# 17775 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17783 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17780 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17792 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17786 "parsing/parser.ml" +# 17798 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17819,55 +24323,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 17829 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 17840 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 17834 "parsing/parser.ml" - - in - let op = - let _1 = -# 4441 "parsing/parser.mly" - ("&&") -# 17841 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 17849 "parsing/parser.ml" - - in +# 17845 "parsing/parser.ml" -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 17855 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4694 "parsing/parser.mly" + ("=") +# 17853 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17861 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 17865 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17870 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 17871 "parsing/parser.ml" +# 17876 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17917,7 +24414,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -17925,100 +24422,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 17938 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 17943 "parsing/parser.ml" - - in +# 17942 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 17949 "parsing/parser.ml" +# 17947 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17953 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 17960 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 17966 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 17964 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 17979 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 17970 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 17985 "parsing/parser.ml" - - in - let op = - let _1 = -# 4441 "parsing/parser.mly" - ("&&") -# 17992 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 18000 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17983 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 18006 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17989 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4694 "parsing/parser.mly" + ("=") +# 17997 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18005 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 18016 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18014 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 18022 "parsing/parser.ml" +# 18020 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18055,55 +24545,48 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 18065 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 18070 "parsing/parser.ml" - - in - let op = - let _1 = -# 4442 "parsing/parser.mly" - (":=") -# 18077 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 18085 "parsing/parser.ml" - - in +# 18062 "parsing/parser.ml" + in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 18091 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 18067 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4695 "parsing/parser.mly" + ("<") +# 18075 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18083 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 18101 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18092 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 18107 "parsing/parser.ml" +# 18098 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18153,7 +24636,7 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let e1 : (Parsetree.expression) = Obj.magic e1 in @@ -18161,210 +24644,93 @@ module Tables = struct let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _1 = - let e2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 18174 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 18179 "parsing/parser.ml" - - in +# 18164 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 18185 "parsing/parser.ml" +# 18169 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 18175 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 18196 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 18202 "parsing/parser.ml" +# 4997 "parsing/parser.mly" + ( _1 ) +# 18186 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 18215 "parsing/parser.ml" +# 5010 "parsing/parser.mly" + ( _1, _2 ) +# 18192 "parsing/parser.ml" in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 18221 "parsing/parser.ml" - - in - let op = - let _1 = -# 4442 "parsing/parser.mly" - (":=") -# 18228 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 18236 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18205 "parsing/parser.ml" in -# 2876 "parsing/parser.mly" - ( mkinfix e1 op e2 ) -# 18242 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 18211 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4695 "parsing/parser.mly" + ("<") +# 18219 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18227 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 18252 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18236 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( _1 ) -# 18258 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (let_bindings) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2794 "parsing/parser.mly" - ( expr_of_let_bindings ~loc:_sloc _1 _3 ) -# 18300 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bindings; - MenhirLib.EngineTypes.startp = _startpos_bindings_; - MenhirLib.EngineTypes.endp = _endpos_bindings_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let body : (Parsetree.expression) = Obj.magic body in - let _3 : unit = Obj.magic _3 in - let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in - let _1 : ( -# 1074 "parsing/parser.mly" - (string) -# 18342 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_body_ in - let _v : (Parsetree.expression) = let pbop_op = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 18354 "parsing/parser.ml" - - in - let _startpos_pbop_op_ = _startpos__1_ in - let _endpos = _endpos_body_ in - let _symbolstartpos = _startpos_pbop_op_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2796 "parsing/parser.mly" - ( let (pbop_pat, pbop_exp, rev_ands) = bindings in - let ands = List.rev rev_ands in - let pbop_loc = make_loc _sloc in - let let_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in - mkexp ~loc:_sloc (Pexp_letop{ let_; ands; body}) ) -# 18368 "parsing/parser.ml" +# 18242 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18382,46 +24748,89 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.expression) = let _3 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 18409 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 18284 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 18414 "parsing/parser.ml" +# 18289 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4703 "parsing/parser.mly" + ("+") +# 16309 "parsing/parser.ml" +||||||| 04da777f7 +# 4696 "parsing/parser.mly" + ("+") +# 16309 "parsing/parser.ml" +======= +# 4696 "parsing/parser.mly" + (">") +# 18297 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18305 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18314 "parsing/parser.ml" in - let _endpos__3_ = _endpos__1_inlined1_ in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in -# 2802 "parsing/parser.mly" - ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 18425 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18320 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18454,14 +24863,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -18471,80 +24880,153 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression) = let _3 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 18490 "parsing/parser.ml" - in +# 18386 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18391 "parsing/parser.ml" + + in -# 1500 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 18495 "parsing/parser.ml" +# 18397 "parsing/parser.ml" in - -# 3278 "parsing/parser.mly" - ( xs ) -# 18501 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _endpos__3_ = _endpos_xs_ in let _2 = - let _1 = _1_inlined1 in + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18408 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 18512 "parsing/parser.ml" +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 18414 "parsing/parser.ml" in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 18518 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 18531 "parsing/parser.ml" +# 18427 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18433 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4703 "parsing/parser.mly" + ("+") +# 16453 "parsing/parser.ml" +||||||| 04da777f7 +# 4696 "parsing/parser.mly" + ("+") +# 16453 "parsing/parser.ml" +======= +# 4696 "parsing/parser.mly" + (">") +# 18441 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18449 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2823 "parsing/parser.mly" - ( _1 ) -# 18537 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18458 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in -# 2802 "parsing/parser.mly" - ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 18548 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18464 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18562,64 +25044,101 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 18583 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.expression) = let _3 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 18593 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 18506 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 18598 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos__1_inlined1_ in - let _1 = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 18606 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in +# 18511 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4704 "parsing/parser.mly" + ("+.") +# 16531 "parsing/parser.ml" +||||||| 04da777f7 +# 4697 "parsing/parser.mly" + ("+.") +# 16531 "parsing/parser.ml" +======= +# 4697 "parsing/parser.mly" + ("or") +# 18519 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18527 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 18614 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18536 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2804 "parsing/parser.mly" - ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 18623 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18542 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18652,14 +25171,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -18669,98 +25188,153 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 18679 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression) = let _3 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 18692 "parsing/parser.ml" - in +# 18608 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18613 "parsing/parser.ml" + + in -# 1500 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 18697 "parsing/parser.ml" +# 18619 "parsing/parser.ml" in - -# 3278 "parsing/parser.mly" - ( xs ) -# 18703 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _endpos__3_ = _endpos_xs_ in let _2 = - let _1 = _1_inlined1 in + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18630 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 18714 "parsing/parser.ml" +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 18636 "parsing/parser.ml" in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 18720 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 18733 "parsing/parser.ml" +# 18649 "parsing/parser.ml" + + in - in - -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 18739 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _1 = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 18747 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in +# 18655 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4704 "parsing/parser.mly" + ("+.") +# 16675 "parsing/parser.ml" +||||||| 04da777f7 +# 4697 "parsing/parser.mly" + ("+.") +# 16675 "parsing/parser.ml" +======= +# 4697 "parsing/parser.mly" + ("or") +# 18663 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18671 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 18755 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18680 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2804 "parsing/parser.mly" - ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 18764 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18686 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18773,75 +25347,106 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _4 : unit = Obj.magic _4 in - let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (Parsetree.expression) = let _5 = - let _1 = _1_inlined2 in - let _1 = -# 2639 "parsing/parser.mly" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 18819 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 18728 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 18824 "parsing/parser.ml" - - in - let _endpos__5_ = _endpos__1_inlined2_ in - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in +# 18733 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4705 "parsing/parser.mly" + ("+=") +# 16753 "parsing/parser.ml" +||||||| 04da777f7 +# 4698 "parsing/parser.mly" + ("+=") +# 16753 "parsing/parser.ml" +======= +# 4698 "parsing/parser.mly" + ("||") +# 18741 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18749 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 18836 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18758 "parsing/parser.ml" in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2806 "parsing/parser.mly" - ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 18845 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18764 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18859,42 +25464,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -18902,93 +25495,154 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _4 : unit = Obj.magic _4 in - let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression) = let _5 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let _1 = - let _3 = - let xs = - let xs = + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 18924 "parsing/parser.ml" - in +# 18830 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18835 "parsing/parser.ml" + + in -# 1500 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 18929 "parsing/parser.ml" +# 18841 "parsing/parser.ml" in - -# 3278 "parsing/parser.mly" - ( xs ) -# 18935 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _endpos__3_ = _endpos_xs_ in let _2 = - let _1 = _1_inlined1 in + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18852 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 18946 "parsing/parser.ml" +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 18858 "parsing/parser.ml" in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 18952 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 18965 "parsing/parser.ml" +# 18871 "parsing/parser.ml" + + in - in - -# 2823 "parsing/parser.mly" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 18971 "parsing/parser.ml" - - in - let _endpos__5_ = _endpos_xs_ in - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in +# 18877 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4705 "parsing/parser.mly" + ("+=") +# 16897 "parsing/parser.ml" +||||||| 04da777f7 +# 4698 "parsing/parser.mly" + ("+=") +# 16897 "parsing/parser.ml" +======= +# 4698 "parsing/parser.mly" + ("||") +# 18885 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18893 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 18983 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18902 "parsing/parser.ml" in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2806 "parsing/parser.mly" - ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 18992 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18908 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19010,83 +25664,103 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 19063 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 18950 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 19068 "parsing/parser.ml" - - in +# 18955 "parsing/parser.ml" +>>>>>>> upstream/main -# 2807 "parsing/parser.mly" - (Some v) -# 19074 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4706 "parsing/parser.mly" + ("-") +# 16975 "parsing/parser.ml" +||||||| 04da777f7 +# 4699 "parsing/parser.mly" + ("-") +# 16975 "parsing/parser.ml" +======= +# 4699 "parsing/parser.mly" +<<<<<<< HEAD + ("+") +# 15986 "parsing/parser.ml" +======= + ("&") +# 18963 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 15994 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 19080 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16003 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2808 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 19090 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 16009 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19123,35 +25797,11 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -19160,97 +25810,148 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 19185 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 19190 "parsing/parser.ml" - - in +# 16075 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 19196 "parsing/parser.ml" +# 16080 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 16086 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 19207 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 19213 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 16097 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 16103 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 19226 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 19232 "parsing/parser.ml" +# 16116 "parsing/parser.ml" in -# 2807 "parsing/parser.mly" - (Some v) -# 19238 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 16122 "parsing/parser.ml" in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4706 "parsing/parser.mly" + ("-") +# 17119 "parsing/parser.ml" +||||||| 04da777f7 +# 4699 "parsing/parser.mly" + ("-") +# 17119 "parsing/parser.ml" +======= +# 4699 "parsing/parser.mly" + ("+") +# 16130 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16138 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 19244 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16147 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2808 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 19254 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16153 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19272,83 +25973,63 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 19325 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 16195 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 19330 "parsing/parser.ml" - - in +# 16200 "parsing/parser.ml" -# 2807 "parsing/parser.mly" - (Some v) -# 19336 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4700 "parsing/parser.mly" + ("+.") +# 16208 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16216 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 19342 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16225 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2808 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 19352 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16231 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19385,35 +26066,11 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -19422,97 +26079,101 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 19447 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 19452 "parsing/parser.ml" - - in +# 16297 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 19458 "parsing/parser.ml" +# 16302 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 16308 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 19469 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 19475 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 16319 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 16325 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 19488 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 19494 "parsing/parser.ml" +# 16338 "parsing/parser.ml" in -# 2807 "parsing/parser.mly" - (Some v) -# 19500 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16344 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4700 "parsing/parser.mly" + ("+.") +# 16352 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16360 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 19506 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16369 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2808 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 19516 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16375 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19534,83 +26195,63 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 19587 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" +# 16417 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" ( _1 ) -# 19592 "parsing/parser.ml" - - in +# 16422 "parsing/parser.ml" -# 2807 "parsing/parser.mly" - (Some v) -# 19598 "parsing/parser.ml" + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4701 "parsing/parser.mly" + ("+=") +# 16430 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16438 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 19604 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16447 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2808 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 19614 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16453 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19647,35 +26288,11 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -19684,97 +26301,101 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 19709 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 19714 "parsing/parser.ml" - - in +# 16519 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 19720 "parsing/parser.ml" +# 16524 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 16530 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 19731 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 19737 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 16541 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 16547 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 19750 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 19756 "parsing/parser.ml" +# 16560 "parsing/parser.ml" in -# 2807 "parsing/parser.mly" - (Some v) -# 19762 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16566 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4701 "parsing/parser.mly" + ("+=") +# 16574 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16582 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 19768 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16591 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2808 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 19778 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16597 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19796,104 +26417,63 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 19840 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 19853 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 19858 "parsing/parser.ml" - - in +# 16639 "parsing/parser.ml" + in -# 2809 "parsing/parser.mly" - (Some v) -# 19864 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16644 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 19870 "parsing/parser.ml" - in - let d = + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = let _1 = -# 124 "" - ( None ) -# 19876 "parsing/parser.ml" +# 4702 "parsing/parser.mly" + ("-") +# 16652 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 19881 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16660 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 19887 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16669 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19897 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16675 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19930,35 +26510,11 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -19967,118 +26523,101 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 19980 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 19996 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 20001 "parsing/parser.ml" - - in +# 16741 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 20007 "parsing/parser.ml" +# 16746 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 16752 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 20018 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 20024 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 16763 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 16769 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 20037 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 20043 "parsing/parser.ml" +# 16782 "parsing/parser.ml" in -# 2809 "parsing/parser.mly" - (Some v) -# 20049 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16788 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 20055 "parsing/parser.ml" - in - let d = + let _endpos_e2_ = _endpos_xs_ in + let op = let _1 = -# 124 "" - ( None ) -# 20061 "parsing/parser.ml" +# 4702 "parsing/parser.mly" + ("-") +# 16796 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 20066 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16804 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 20072 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16813 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20082 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16819 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20091,136 +26630,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 20156 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__1_inlined2_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let _1_inlined1 = _1_inlined2 in - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 20172 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 20177 "parsing/parser.ml" - - in +# 16861 "parsing/parser.ml" + in -# 2809 "parsing/parser.mly" - (Some v) -# 20183 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 16866 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 20189 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 20197 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 20202 "parsing/parser.ml" - - in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4703 "parsing/parser.mly" + ("-.") +# 16874 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 20208 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 16882 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 20214 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 16891 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20224 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 16897 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20238,66 +26713,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -20305,130 +26744,102 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 20319 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 20338 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 20343 "parsing/parser.ml" - - in +# 16963 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 20349 "parsing/parser.ml" +# 16968 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 16974 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 20360 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 20366 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 16985 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 16991 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 20379 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 20385 "parsing/parser.ml" +# 17004 "parsing/parser.ml" in -# 2809 "parsing/parser.mly" - (Some v) -# 20391 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17010 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 20397 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 20405 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 20410 "parsing/parser.ml" - - in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4703 "parsing/parser.mly" + ("-.") +# 17018 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 20416 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17026 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 20422 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17035 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20432 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17041 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20450,104 +26861,63 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 20494 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 20507 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 20512 "parsing/parser.ml" - - in +# 17083 "parsing/parser.ml" + in -# 2809 "parsing/parser.mly" - (Some v) -# 20518 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17088 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 20524 "parsing/parser.ml" - in - let d = + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = let _1 = -# 124 "" - ( None ) -# 20530 "parsing/parser.ml" +# 4704 "parsing/parser.mly" + ("*") +# 17096 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 20535 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17104 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 20541 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17113 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20551 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17119 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20584,35 +26954,11 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -20621,118 +26967,101 @@ module Tables = struct } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 20634 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 20650 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 20655 "parsing/parser.ml" - - in +# 17185 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 20661 "parsing/parser.ml" +# 17190 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17196 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 20672 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 20678 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 17207 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 17213 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 20691 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 20697 "parsing/parser.ml" +# 17226 "parsing/parser.ml" in -# 2809 "parsing/parser.mly" - (Some v) -# 20703 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17232 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 20709 "parsing/parser.ml" - in - let d = + let _endpos_e2_ = _endpos_xs_ in + let op = let _1 = -# 124 "" - ( None ) -# 20715 "parsing/parser.ml" +# 4704 "parsing/parser.mly" + ("*") +# 17240 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 20720 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17248 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 20726 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17257 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20736 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17263 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20745,136 +27074,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 20810 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__1_inlined2_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let _1_inlined1 = _1_inlined2 in - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 20826 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 20831 "parsing/parser.ml" - - in +# 17305 "parsing/parser.ml" + in -# 2809 "parsing/parser.mly" - (Some v) -# 20837 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17310 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 20843 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 20851 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 20856 "parsing/parser.ml" - - in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4705 "parsing/parser.mly" + ("%") +# 17318 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 20862 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17326 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 20868 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17335 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20878 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17341 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20892,66 +27157,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -20959,130 +27188,102 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 20973 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 20992 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 20997 "parsing/parser.ml" - - in +# 17407 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 21003 "parsing/parser.ml" +# 17412 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17418 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 21014 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 21020 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 17429 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 17435 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 21033 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 21039 "parsing/parser.ml" +# 17448 "parsing/parser.ml" in -# 2809 "parsing/parser.mly" - (Some v) -# 21045 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17454 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 21051 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 21059 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 21064 "parsing/parser.ml" - - in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4705 "parsing/parser.mly" + ("%") +# 17462 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 21070 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17470 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 21076 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17479 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 21086 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17485 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21104,104 +27305,63 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 21148 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 21161 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 21166 "parsing/parser.ml" - - in +# 17527 "parsing/parser.ml" + in -# 2809 "parsing/parser.mly" - (Some v) -# 21172 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17532 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 21178 "parsing/parser.ml" - in - let d = + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = let _1 = -# 124 "" - ( None ) -# 21184 "parsing/parser.ml" +# 4706 "parsing/parser.mly" + ("=") +# 17540 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 21189 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17548 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 21195 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17557 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 21205 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17563 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21238,155 +27398,114 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 21288 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 21304 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 21309 "parsing/parser.ml" - - in +# 17629 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 21315 "parsing/parser.ml" +# 17634 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17640 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 21326 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 21332 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 17651 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 17657 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 21345 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 21351 "parsing/parser.ml" +# 17670 "parsing/parser.ml" in -# 2809 "parsing/parser.mly" - (Some v) -# 21357 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17676 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 21363 "parsing/parser.ml" - in - let d = + let _endpos_e2_ = _endpos_xs_ in + let op = let _1 = -# 124 "" - ( None ) -# 21369 "parsing/parser.ml" +# 4706 "parsing/parser.mly" + ("=") +# 17684 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 21374 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17692 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 21380 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17701 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 21390 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17707 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21399,136 +27518,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 21464 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__1_inlined2_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let r = - let _1_inlined1 = _1_inlined2 in - let v = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" ( _1 ) -# 21480 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 21485 "parsing/parser.ml" - - in +# 17749 "parsing/parser.ml" + in -# 2809 "parsing/parser.mly" - (Some v) -# 21491 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17754 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 21497 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 21505 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 21510 "parsing/parser.ml" - - in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4707 "parsing/parser.mly" + ("<") +# 17762 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 21516 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17770 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 21522 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17779 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 21532 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17785 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21546,66 +27601,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -21613,130 +27632,102 @@ module Tables = struct }; } = _menhir_stack in let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" - (string) -# 21627 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let r = - let (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let v = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 21646 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 21651 "parsing/parser.ml" - - in +# 17851 "parsing/parser.ml" + in -# 3278 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( xs ) -# 21657 "parsing/parser.ml" +# 17856 "parsing/parser.ml" in - let _endpos__3_ = _endpos_xs_ in + +# 3255 "parsing/parser.mly" + ( xs ) +# 17862 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 21668 "parsing/parser.ml" - - in + let _1 = _1_inlined1 in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 21674 "parsing/parser.ml" +# 5009 "parsing/parser.mly" + ( _1 ) +# 17873 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 17879 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in mkfunction [] None (Pfunction_cases (cases, loc, [])) ~loc:_sloc ~attrs:_2 ) -# 21687 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 21693 "parsing/parser.ml" +# 17892 "parsing/parser.ml" in -# 2809 "parsing/parser.mly" - (Some v) -# 21699 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 17898 "parsing/parser.ml" in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 21705 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 21713 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 21718 "parsing/parser.ml" - - in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4707 "parsing/parser.mly" + ("<") +# 17906 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 21724 "parsing/parser.ml" +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17914 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 21730 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17923 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2810 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 21740 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 17929 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21749,52 +27740,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : (Parsetree.attribute) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = -# 2812 "parsing/parser.mly" - ( Exp.attr _1 _2 ) -# 21772 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 17971 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 17976 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4708 "parsing/parser.mly" + (">") +# 17984 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17992 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18001 "parsing/parser.ml" + + in -# 2815 "parsing/parser.mly" - ( not_expecting _loc__1_ "wildcard \"_\"" ) -# 21798 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 18007 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21807,84 +27818,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4157 "parsing/parser.mly" - ( (Local, _sloc) ) -# 21834 "parsing/parser.ml" - - in - let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2818 "parsing/parser.mly" - ( mkexp_with_mode _sloc _1 _2 ) -# 21843 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in let _v : (Parsetree.expression) = let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18073 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18078 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 18084 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 18095 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 18101 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18114 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 18120 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4708 "parsing/parser.mly" + (">") +# 18128 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18136 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4159 "parsing/parser.mly" - ( (Unique, _sloc) ) -# 21879 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18145 "parsing/parser.ml" in - let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2818 "parsing/parser.mly" - ( mkexp_with_mode _sloc _1 _2 ) -# 21888 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 18151 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21897,39 +27962,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 18193 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 18198 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4709 "parsing/parser.mly" + ("or") +# 18206 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18214 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4161 "parsing/parser.mly" - ( (Once, _sloc) ) -# 21924 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18223 "parsing/parser.ml" in - let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2818 "parsing/parser.mly" - ( mkexp_with_mode _sloc _1 _2 ) -# 21933 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 18229 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21942,30 +28040,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18295 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18300 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 18306 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 18317 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 18323 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18336 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 18342 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4709 "parsing/parser.mly" + ("or") +# 18350 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18358 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18367 "parsing/parser.ml" + + in -# 2820 "parsing/parser.mly" - ( mkexp_exclave ~loc:_sloc ~kwd_loc:(_loc__1_) _2 ) -# 21969 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 18373 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21978,57 +28184,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty_params; - MenhirLib.EngineTypes.startp = _startpos_ty_params_; - MenhirLib.EngineTypes.endp = _endpos_ty_params_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let ty_params : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic ty_params in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (N_ary.function_param list) = let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3290 "parsing/parser.mly" - ( (* We desugar (type a b c) to (type a) (type b) (type c). - If we do this desugaring, the loc for each parameter is a ghost. - *) - let loc = - match ty_params with - | [] | [_] -> make_loc _sloc - | _ :: _ :: _ -> ghost_loc _sloc + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 18415 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 18420 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4710 "parsing/parser.mly" + ("||") +# 18428 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18436 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18445 "parsing/parser.ml" + in - List.map - (fun (newtype, jkind) -> - { N_ary.pparam_loc = loc; - pparam_desc = Pparam_newtype (newtype, jkind) - }) - ty_params - ) -# 22032 "parsing/parser.ml" + +# 2737 "parsing/parser.mly" + ( _1 ) +# 18451 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22041,19 +28262,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -22061,14 +28282,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -22076,41 +28297,103 @@ module Tables = struct }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : (Jane_asttypes.jkind_annotation) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" - (string) -# 22086 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (N_ary.function_param list) = let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18517 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18522 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 18528 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 18539 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 18545 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18558 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 18564 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4710 "parsing/parser.mly" + ("||") +# 18572 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18580 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 22101 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18589 "parsing/parser.ml" in - let _endpos = _endpos__6_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3306 "parsing/parser.mly" - ( [ { N_ary.pparam_loc = make_loc _sloc; - pparam_desc = Pparam_newtype (_3, Some _5) - } - ] - ) -# 22114 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 18595 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22122,90 +28405,93 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (N_ary.function_param list) = let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3312 "parsing/parser.mly" - ( let a, b, c = _1 in - [ { N_ary.pparam_loc = make_loc _sloc; - pparam_desc = Pparam_val (a, b, c) - } - ] - ) -# 22147 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let xs : (N_ary.function_param list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_xs_ in - let _v : (N_ary.function_param list) = let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 22173 "parsing/parser.ml" - in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 18637 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 18642 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4711 "parsing/parser.mly" + ("&") +<<<<<<< HEAD +# 18650 "parsing/parser.ml" +======= +# 19107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18658 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1407 "parsing/parser.mly" - ( xs ) -# 22178 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18667 "parsing/parser.ml" in -# 3320 "parsing/parser.mly" - ( _1 ) -# 22184 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = -# 2657 "parsing/parser.mly" - ( _1 ) -# 22209 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 18673 "parsing/parser.ml" +======= +# 19130 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22218,81 +28504,107 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = -# 2658 "parsing/parser.mly" - ( _1 ) -# 22241 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.expression) = let _1 = - let _1 = -# 2660 "parsing/parser.mly" - ( Pexp_sequence(_1, _3) ) -# 22281 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19172 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19177 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4707 "parsing/parser.mly" + ("-.") +# 17197 "parsing/parser.ml" +||||||| 04da777f7 +# 4700 "parsing/parser.mly" + ("-.") +# 17197 "parsing/parser.ml" +======= +# 4700 "parsing/parser.mly" + ("&&") +# 19185 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19193 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 22290 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19202 "parsing/parser.ml" in -# 2661 "parsing/parser.mly" - ( _1 ) -# 22296 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19208 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22305,102 +28617,204 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in - let _4 : (Ast_helper.str) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18739 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18744 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 18750 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 18761 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 18767 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18780 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18786 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4711 "parsing/parser.mly" + ("&") +# 18794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4707 "parsing/parser.mly" + ("-.") +# 17341 "parsing/parser.ml" +||||||| 04da777f7 +# 4700 "parsing/parser.mly" + ("-.") +# 17341 "parsing/parser.ml" +======= +# 4700 "parsing/parser.mly" + ("&&") +# 19329 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18802 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18811 "parsing/parser.ml" + + in -# 2663 "parsing/parser.mly" - ( let seq = mkexp ~loc:_sloc (Pexp_sequence (_1, _5)) in - let payload = PStr [mkstrexp seq []] in - mkexp ~loc:_sloc (Pexp_extension (_4, payload)) ) -# 22354 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_ty_ in - let _v : (Parsetree.core_type) = -# 4118 "parsing/parser.mly" - ( ty ) -# 22379 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_ty_ in - let _v : (Parsetree.core_type) = -# 4120 "parsing/parser.mly" - ( ty ) -# 22404 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18817 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22413,27 +28827,112 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Lexing.position * Parsetree.functor_parameter) = let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18859 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18864 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +<<<<<<< HEAD +# 4712 "parsing/parser.mly" + ("&&") +# 18872 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4708 "parsing/parser.mly" + ("*") +# 17419 "parsing/parser.ml" +||||||| 04da777f7 +# 4701 "parsing/parser.mly" + ("*") +# 17419 "parsing/parser.ml" +======= +# 4701 "parsing/parser.mly" + (":=") +# 19407 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18880 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18889 "parsing/parser.ml" + + in -# 1693 "parsing/parser.mly" - ( _startpos, Unit ) -# 22437 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 18895 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22446,78 +28945,182 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _3 : unit = Obj.magic _3 in - let _1_inlined1 : (string option) = Obj.magic _1_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Lexing.position * Parsetree.functor_parameter) = let x = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18961 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 18966 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 18972 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 18983 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 18989 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19002 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19008 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4712 "parsing/parser.mly" + ("&&") +# 19016 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4708 "parsing/parser.mly" + ("*") +# 17563 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17571 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 22495 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17580 "parsing/parser.ml" in - let _startpos = _startpos__1_ in -# 1696 "parsing/parser.mly" - ( _startpos, Named (x, mty) ) -# 22502 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3889 "parsing/parser.mly" - ( ([],Pcstr_tuple [],None) ) -# 22521 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 17586 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22530,74 +29133,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.constructor_arguments) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3890 "parsing/parser.mly" - ( ([],_2,None) ) -# 22554 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _4 : (Parsetree.core_type) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.constructor_arguments) = Obj.magic _2 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3892 "parsing/parser.mly" - ( ([],_2,Some _4) ) -# 22601 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 17628 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 17633 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4709 "parsing/parser.mly" + ("%") +# 17641 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17649 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17658 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 17664 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22610,34 +29211,34 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -22645,39 +29246,103 @@ module Tables = struct }; }; } = _menhir_stack in - let _6 : (Parsetree.core_type) = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.constructor_arguments) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = let _2 = - let _1 = - let xs = + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 22664 "parsing/parser.ml" +# 17730 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 17735 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 17741 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 17752 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 17758 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17771 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 17777 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4709 "parsing/parser.mly" + ("%") +# 17785 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1387 "parsing/parser.mly" - ( xs ) -# 22669 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17793 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4043 "parsing/parser.mly" - ( _1 ) -# 22675 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17802 "parsing/parser.ml" in -# 3895 "parsing/parser.mly" - ( (_2,_4,Some _6) ) -# 22681 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 17808 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22690,93 +29355,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.core_type) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3897 "parsing/parser.mly" - ( ([],Pcstr_tuple [],Some _2) ) -# 22714 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _4 : (Parsetree.core_type) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = let _2 = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 22763 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 17850 "parsing/parser.ml" in -# 1387 "parsing/parser.mly" - ( xs ) -# 22768 "parsing/parser.ml" +# 2780 "parsing/parser.mly" + ( _1 ) +# 17855 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4710 "parsing/parser.mly" + ("=") +# 17863 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17871 "parsing/parser.ml" in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4043 "parsing/parser.mly" - ( _1 ) -# 22774 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17880 "parsing/parser.ml" in -# 3899 "parsing/parser.mly" - ( (_2,Pcstr_tuple [],Some _4) ) -# 22780 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 17886 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22789,72 +29433,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = vars_args_res; - MenhirLib.EngineTypes.startp = _startpos_vars_args_res_; - MenhirLib.EngineTypes.endp = _endpos_vars_args_res_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let vars_args_res : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = Obj.magic vars_args_res in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = let attrs = - let _1 = _1_inlined2 in - -# 4726 "parsing/parser.mly" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 17952 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 17957 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 17963 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" ( _1 ) -# 22832 "parsing/parser.ml" - - in - let _endpos_attrs_ = _endpos__1_inlined2_ in - let cid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in +# 17974 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 17980 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17993 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 17999 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4710 "parsing/parser.mly" + ("=") +# 18007 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18015 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 22844 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18024 "parsing/parser.ml" in - let _endpos = _endpos_attrs_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3828 "parsing/parser.mly" - ( - let vars, args, res = vars_args_res in - let info = symbol_info _endpos in - let loc = make_loc _sloc in - cid, vars, args, res, attrs, loc, info - ) -# 22858 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 18030 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22872,65 +29582,67 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = vars_args_res; - MenhirLib.EngineTypes.startp = _startpos_vars_args_res_; - MenhirLib.EngineTypes.endp = _endpos_vars_args_res_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let vars_args_res : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = Obj.magic vars_args_res in - let _1 : (string) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in - let _v : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 22903 "parsing/parser.ml" - - in - let _endpos_attrs_ = _endpos__1_inlined1_ in - let cid = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 18072 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 18077 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4711 "parsing/parser.mly" + ("<") +# 18085 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18093 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 22914 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18102 "parsing/parser.ml" in - let _startpos_cid_ = _startpos__1_ in - let _1 = -# 4537 "parsing/parser.mly" - ( () ) -# 22921 "parsing/parser.ml" - in - let _endpos = _endpos_attrs_ in - let _symbolstartpos = _startpos_cid_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3828 "parsing/parser.mly" - ( - let vars, args, res = vars_args_res in - let info = symbol_info _endpos in - let loc = make_loc _sloc in - cid, vars, args, res, attrs, loc, info - ) -# 22934 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 18108 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22943,154 +29655,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let xs : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs in - let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in - let _1_inlined3 : unit = Obj.magic _1_inlined3 in - let jkind : (Parsetree.attribute option) = Obj.magic jkind in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 23014 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : ((Asttypes.rec_flag * string Location.loc option) * - Parsetree.type_declaration) = let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 23029 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let cstrs = - let _1 = - let xs = + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 23038 "parsing/parser.ml" +# 18174 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18179 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 18185 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 18196 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 18202 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18215 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 18221 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4711 "parsing/parser.mly" + ("<") +# 18229 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1369 "parsing/parser.mly" - ( xs ) -# 23043 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18237 "parsing/parser.ml" in - -# 3688 "parsing/parser.mly" - ( _1 ) -# 23049 "parsing/parser.ml" - - in - let kind_priv_manifest = -# 3723 "parsing/parser.mly" - ( _2 ) -# 23055 "parsing/parser.ml" - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 23065 "parsing/parser.ml" - - in - let flag = -# 4557 "parsing/parser.mly" - ( Recursive ) -# 23071 "parsing/parser.ml" - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 23078 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18246 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3659 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - (flag, ext), - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs - ) -# 23094 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 18252 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23103,167 +29799,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let xs : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs in - let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in - let _1_inlined4 : unit = Obj.magic _1_inlined4 in - let jkind : (Parsetree.attribute option) = Obj.magic jkind in - let _1_inlined3 : ( -# 1094 "parsing/parser.mly" - (string) -# 23180 "parsing/parser.ml" - ) = Obj.magic _1_inlined3 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined5_ in - let _v : ((Asttypes.rec_flag * string Location.loc option) * - Parsetree.type_declaration) = let attrs2 = - let _1 = _1_inlined5 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 23196 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined5_ in - let cstrs = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 23205 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 18294 "parsing/parser.ml" in -# 1369 "parsing/parser.mly" - ( xs ) -# 23210 "parsing/parser.ml" +# 2780 "parsing/parser.mly" + ( _1 ) +# 18299 "parsing/parser.ml" in - -# 3688 "parsing/parser.mly" - ( _1 ) -# 23216 "parsing/parser.ml" - - in - let kind_priv_manifest = -# 3723 "parsing/parser.mly" - ( _2 ) -# 23222 "parsing/parser.ml" - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4712 "parsing/parser.mly" + (">") +# 18307 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18315 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 23232 "parsing/parser.ml" - - in - let flag = - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in - -# 4559 "parsing/parser.mly" - ( not_expecting _loc "nonrec flag" ) -# 23243 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 23251 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18324 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3659 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - (flag, ext), - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs - ) -# 23267 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 18330 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23276,142 +29877,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = kind_priv_manifest; - MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; - MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let xs : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs in - let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in - let jkind : (Parsetree.attribute option) = Obj.magic jkind in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 23340 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : ((Asttypes.rec_flag * string Location.loc option) * - Parsetree.type_declaration) = let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 23355 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let cstrs = - let _1 = - let xs = + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 23364 "parsing/parser.ml" +# 18396 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18401 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 18407 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 18418 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 18424 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18437 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 18443 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4712 "parsing/parser.mly" + (">") +# 18451 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1369 "parsing/parser.mly" - ( xs ) -# 23369 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18459 "parsing/parser.ml" in - -# 3688 "parsing/parser.mly" - ( _1 ) -# 23375 "parsing/parser.ml" - - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 23386 "parsing/parser.ml" - - in - let flag = -# 4553 "parsing/parser.mly" - ( Recursive ) -# 23392 "parsing/parser.ml" - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 23399 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18468 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3659 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - (flag, ext), - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs - ) -# 23415 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 18474 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23424,178 +30021,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = kind_priv_manifest; - MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; - MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let xs : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs in - let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in - let jkind : (Parsetree.attribute option) = Obj.magic jkind in - let _1_inlined3 : ( -# 1094 "parsing/parser.mly" - (string) -# 23494 "parsing/parser.ml" - ) = Obj.magic _1_inlined3 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : ((Asttypes.rec_flag * string Location.loc option) * - Parsetree.type_declaration) = let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 23510 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let cstrs = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 23519 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 18516 "parsing/parser.ml" in -# 1369 "parsing/parser.mly" - ( xs ) -# 23524 "parsing/parser.ml" +# 2780 "parsing/parser.mly" + ( _1 ) +# 18521 "parsing/parser.ml" in - -# 3688 "parsing/parser.mly" - ( _1 ) -# 23530 "parsing/parser.ml" - - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4713 "parsing/parser.mly" + ("or") +# 18529 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18537 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 23541 "parsing/parser.ml" - - in - let flag = -# 4554 "parsing/parser.mly" - ( Nonrecursive ) -# 23547 "parsing/parser.ml" - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 23554 "parsing/parser.ml" +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18546 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3659 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - (flag, ext), - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs - ) -# 23570 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1148 "parsing/parser.mly" - (string) -# 23591 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4395 "parsing/parser.mly" - ( _1 ) -# 23599 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 18552 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23607,24 +30098,139 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 23620 "parsing/parser.ml" - ) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4396 "parsing/parser.mly" - ( _1 ) -# 23628 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18618 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18623 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 18629 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 18640 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 18646 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18659 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 18665 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4713 "parsing/parser.mly" + ("or") +# 18673 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18681 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18690 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 18696 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23637,26 +30243,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.structure) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.structure) = -# 1560 "parsing/parser.mly" - ( _1 ) -# 23660 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 18738 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 18743 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4714 "parsing/parser.mly" + ("||") +# 18751 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18759 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18768 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 18774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23668,20 +30320,139 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (bool) = -# 1948 "parsing/parser.mly" - ( false ) -# 23685 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18840 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18845 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 18851 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 18862 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 18868 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18881 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 18887 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4714 "parsing/parser.mly" + ("||") +# 18895 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18903 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18912 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 18918 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23694,44 +30465,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (bool) = -# 1950 "parsing/parser.mly" - ( true ) -# 23717 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (string) = -# 4445 "parsing/parser.mly" - ( "" ) -# 23735 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 18960 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 18965 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4715 "parsing/parser.mly" + ("&") +# 18973 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18981 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18990 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 18996 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23744,26 +30543,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (string) = -# 4446 "parsing/parser.mly" - ( ";.." ) -# 23767 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 19062 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 19067 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 19073 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 19084 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 19090 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19103 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 19109 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4715 "parsing/parser.mly" + ("&") +# 19117 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19125 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19134 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 19140 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23776,26 +30687,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.signature) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.signature) = -# 1567 "parsing/parser.mly" - ( _1 ) -# 23799 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 19182 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 19187 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4716 "parsing/parser.mly" + ("&&") +# 19195 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19203 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19212 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 19218 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23808,72 +30765,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.payload) = Obj.magic _3 in - let _2 : (Ast_helper.str) = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.extension) = -# 4747 "parsing/parser.mly" - ( (_2, _3) ) -# 23845 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1139 "parsing/parser.mly" - (string * Location.t * string * Location.t * string option) -# 23866 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.extension) = let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 19284 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 19289 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 19295 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 19306 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 19312 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19325 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 19331 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4716 "parsing/parser.mly" + ("&&") +# 19339 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19347 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19356 "parsing/parser.ml" + + in -# 4749 "parsing/parser.mly" - ( mk_quotedext ~loc:_sloc _1 ) -# 23877 "parsing/parser.ml" +# 2749 "parsing/parser.mly" + ( _1 ) +# 19362 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23885,24 +30908,75 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Jane_asttypes.jkind_annotation) = let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 19404 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 19409 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4717 "parsing/parser.mly" +||||||| 04da777f7 +# 4701 "parsing/parser.mly" + ("*") +# 17563 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17571 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17580 "parsing/parser.ml" + + in -# 3737 "parsing/parser.mly" - ( let loc = make_loc _sloc in - mkloc (check_jkind ~loc _1) loc ) -# 23906 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 17586 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23915,56 +30989,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let jkind : (string Location.loc) = Obj.magic jkind in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_jkind_ in - let _v : (Parsetree.attribute) = -# 3751 "parsing/parser.mly" - ( Attr.mk ~loc:jkind.loc jkind (PStr []) ) -# 23938 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string Location.loc) = let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 17628 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 17633 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4702 "parsing/parser.mly" + ("%") +# 17641 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17649 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17658 "parsing/parser.ml" + + in -# 3743 "parsing/parser.mly" - ( let loc = make_loc _sloc in - ignore (check_jkind ~loc _1 : const_jkind); - mkloc _1 loc ) -# 23968 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 17664 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23977,96 +31067,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _3 : unit = Obj.magic _3 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" - (string) -# 24016 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _1 : (Asttypes.mutable_flag * Jane_asttypes.global_flag) = Obj.magic _1 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.label_declaration) = let _5 = - let _1 = _1_inlined3 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 24027 "parsing/parser.ml" - - in - let _endpos__5_ = _endpos__1_inlined3_ in - let _4 = - let _1 = _1_inlined2 in - -# 4063 "parsing/parser.mly" - ( _1 ) -# 24036 "parsing/parser.ml" - - in - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 24044 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 17730 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 17735 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 17741 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 17752 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 17758 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17771 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 17777 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4702 "parsing/parser.mly" + ("%") +# 17785 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17793 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24052 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17802 "parsing/parser.ml" in - let _startpos__2_ = _startpos__1_inlined1_ in - let _endpos = _endpos__5_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - let _sloc = (_symbolstartpos, _endpos) in -# 3922 "parsing/parser.mly" - ( let info = symbol_info _endpos in - let mut, gbl = _1 in - mkld_global_maybe gbl - (Type.field _2 _4 ~mut ~attrs:_5 ~loc:(make_loc _sloc) ~info) - (make_loc _loc__1_) ) -# 24070 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 17808 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24079,173 +31211,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _6 : unit = Obj.magic _6 in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _3 : unit = Obj.magic _3 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" - (string) -# 24132 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _1 : (Asttypes.mutable_flag * Jane_asttypes.global_flag) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : (Parsetree.label_declaration) = let _7 = - let _1 = _1_inlined4 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 24143 "parsing/parser.ml" - - in - let _endpos__7_ = _endpos__1_inlined4_ in - let _5 = - let _1 = _1_inlined3 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 24152 "parsing/parser.ml" - - in - let _endpos__5_ = _endpos__1_inlined3_ in - let _4 = - let _1 = _1_inlined2 in - -# 4063 "parsing/parser.mly" - ( _1 ) -# 24161 "parsing/parser.ml" - - in - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 24169 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 17850 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 17855 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4703 "parsing/parser.mly" + ("=") +# 17863 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 17871 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24177 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 17880 "parsing/parser.ml" in - let _startpos__2_ = _startpos__1_inlined1_ in - let _endpos = _endpos__7_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - let _sloc = (_symbolstartpos, _endpos) in -# 3931 "parsing/parser.mly" - ( let info = - match rhs_info _endpos__5_ with - | Some _ as info_before_semi -> info_before_semi - | None -> symbol_info _endpos - in - let mut, gbl = _1 in - mkld_global_maybe gbl - (Type.field _2 _4 ~mut ~attrs:(_5 @ _7) ~loc:(make_loc _sloc) ~info) - (make_loc _loc__1_) ) -# 24199 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.label_declaration) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.label_declaration list) = -# 3916 "parsing/parser.mly" - ( [_1] ) -# 24224 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.label_declaration) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.label_declaration list) = -# 3917 "parsing/parser.mly" - ( [_1] ) -# 24249 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 17886 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24258,75 +31289,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.label_declaration list) = Obj.magic _2 in - let _1 : (Parsetree.label_declaration) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.label_declaration list) = -# 3918 "parsing/parser.mly" - ( _1 :: _2 ) -# 24281 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 24302 "parsing/parser.ml" - ) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string * Parsetree.pattern) = let x = - let _1 = + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 17952 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 17957 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 17963 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 17974 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 17980 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 17993 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 17999 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4703 "parsing/parser.mly" + ("=") +# 18007 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24315 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18015 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2729 "parsing/parser.mly" - ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 24324 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18024 "parsing/parser.ml" in -# 2713 "parsing/parser.mly" - ( x ) -# 24330 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 18030 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24339,63 +31433,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let cty : (Parsetree.core_type) = Obj.magic cty in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 24365 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_cty_ in - let _v : (string * Parsetree.pattern) = let x = - let _1 = + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 18072 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18077 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4704 "parsing/parser.mly" + ("<") +# 18085 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24378 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18093 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2729 "parsing/parser.mly" - ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 24387 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18102 "parsing/parser.ml" in - let _startpos_x_ = _startpos__1_ in - let _endpos = _endpos_cty_ in - let _symbolstartpos = _startpos_x_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2715 "parsing/parser.mly" - ( let lab, pat = x in - lab, - mkpat ~loc:_sloc (Ppat_constraint (pat, cty)) ) -# 24399 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 18108 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24408,140 +31511,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 24448 "parsing/parser.ml" - ) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_inner_type_ in - let _v : (string * Parsetree.pattern) = let cty = - let _1 = - let bound_vars = - let _1 = - let xs = + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 24460 "parsing/parser.ml" - in +# 18174 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18179 "parsing/parser.ml" + + in -# 1387 "parsing/parser.mly" +# 3265 "parsing/parser.mly" ( xs ) -# 24465 "parsing/parser.ml" +# 18185 "parsing/parser.ml" in - -# 4043 "parsing/parser.mly" + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" ( _1 ) -# 24471 "parsing/parser.ml" +# 18196 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 18202 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18215 "parsing/parser.ml" in -# 2722 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 24477 "parsing/parser.ml" +# 2778 "parsing/parser.mly" + ( _1 ) +# 18221 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 24487 "parsing/parser.ml" - - in - let _endpos_cty_ = _endpos_inner_type_ in - let x = - let _1 = + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4704 "parsing/parser.mly" + ("<") +# 18229 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24499 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18237 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2729 "parsing/parser.mly" - ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 24508 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18246 "parsing/parser.ml" in - let _startpos_x_ = _startpos__1_ in - let _endpos = _endpos_cty_ in - let _symbolstartpos = _startpos_x_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2723 "parsing/parser.mly" - ( let lab, pat = x in - lab, - mkpat ~loc:_sloc (Ppat_constraint (pat, cty)) ) -# 24520 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4477 "parsing/parser.mly" - ( _1 ) -# 24545 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 18252 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24553,20 +31654,73 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.arg_label * Parsetree.expression) = -# 3104 "parsing/parser.mly" - ( (Nolabel, _1) ) -# 24570 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 18294 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18299 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4705 "parsing/parser.mly" + (">") +# 18307 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18315 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18324 "parsing/parser.ml" + + in + +# 2747 "parsing/parser.mly" + ( _1 ) +# 18330 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24579,30 +31733,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : ( -# 1080 "parsing/parser.mly" - (string) -# 24598 "parsing/parser.ml" - ) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.arg_label * Parsetree.expression) = -# 3106 "parsing/parser.mly" - ( (Labelled _1, _2) ) -# 24606 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18396 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18401 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 18407 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 18418 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 18424 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18437 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18443 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4705 "parsing/parser.mly" + (">") +# 18451 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18459 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18468 "parsing/parser.ml" + + in + +# 2747 "parsing/parser.mly" + ( _1 ) +# 18474 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24615,32 +31877,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let label : ( -# 1094 "parsing/parser.mly" - (string) -# 24633 "parsing/parser.ml" - ) = Obj.magic label in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_label_ in - let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 18516 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18521 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4706 "parsing/parser.mly" + ("or") +# 18529 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18537 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18546 "parsing/parser.ml" + + in -# 3108 "parsing/parser.mly" - ( let loc = _loc_label_ in - (Labelled label, mkexpvar ~loc label) ) -# 24644 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 18552 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24653,54 +31955,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ty : (N_ary.type_constraint) = Obj.magic ty in - let label : ( -# 1094 "parsing/parser.mly" - (string) -# 24691 "parsing/parser.ml" - ) = Obj.magic label in - let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.arg_label * Parsetree.expression) = let _endpos = _endpos__5_ in - let _loc_label_ = (_startpos_label_, _endpos_label_) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18618 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18623 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 18629 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 18640 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 18646 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18659 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18665 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4706 "parsing/parser.mly" + ("or") +# 18673 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18681 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18690 "parsing/parser.ml" + + in -# 3111 "parsing/parser.mly" - ( (Labelled label, mkexp_constraint ~loc:(_startpos__2_, _endpos) - (mkexpvar ~loc:_loc_label_ label) ty) ) -# 24704 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 18696 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24713,32 +32099,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let label : ( -# 1094 "parsing/parser.mly" - (string) -# 24731 "parsing/parser.ml" - ) = Obj.magic label in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_label_ in - let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 18738 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18743 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4707 "parsing/parser.mly" + ("||") +# 18751 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18759 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18768 "parsing/parser.ml" + + in -# 3114 "parsing/parser.mly" - ( let loc = _loc_label_ in - (Optional label, mkexpvar ~loc label) ) -# 24742 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 18774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24751,30 +32177,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : ( -# 1113 "parsing/parser.mly" - (string) -# 24770 "parsing/parser.ml" - ) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.arg_label * Parsetree.expression) = -# 3117 "parsing/parser.mly" - ( (Optional _1, _2) ) -# 24778 "parsing/parser.ml" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 18840 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 18845 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 18851 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 18862 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 18868 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 18881 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18887 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4707 "parsing/parser.mly" + ("||") +# 18895 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18903 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18912 "parsing/parser.ml" + + in + +# 2747 "parsing/parser.mly" + ( _1 ) +# 18918 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24787,67 +32321,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in - let _4 : (string * Parsetree.pattern) = Obj.magic _4 in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = - let _1 = _1_inlined1 in - -# 2709 "parsing/parser.mly" - ( _1 ) -# 24833 "parsing/parser.ml" - - in - let _3 = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 24840 "parsing/parser.ml" - in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 18960 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 18965 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4708 "parsing/parser.mly" + ("&") +# 18973 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 18981 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 24845 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 18990 "parsing/parser.ml" in -# 2672 "parsing/parser.mly" - ( (Optional (fst _4), _5, mkpat_with_modes _3 (snd _4) ) ) -# 24851 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 18996 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24860,34 +32399,34 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -24895,39 +32434,103 @@ module Tables = struct }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in - let _4 : (string * Parsetree.pattern) = Obj.magic _4 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = - let _1 = _1_inlined1 in - -# 2709 "parsing/parser.mly" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 19062 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 19067 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 19073 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" ( _1 ) -# 24913 "parsing/parser.ml" - - in - let _3 = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 24920 "parsing/parser.ml" - in +# 19084 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 19090 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19103 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 19109 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4708 "parsing/parser.mly" + ("&") +# 19117 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19125 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 24925 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19134 "parsing/parser.ml" in -# 2672 "parsing/parser.mly" - ( (Optional (fst _4), _5, mkpat_with_modes _3 (snd _4) ) ) -# 24931 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 19140 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24944,47 +32547,68 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" - (string) -# 24958 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_e1_ in let _endpos = _endpos__1_inlined1_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 19182 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 19187 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4709 "parsing/parser.mly" + ("&&") +# 19195 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24973 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19203 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2729 "parsing/parser.mly" - ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 24982 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19212 "parsing/parser.ml" in -# 2674 "parsing/parser.mly" - ( (Optional (fst _2), None, snd _2) ) -# 24988 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 19218 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24997,71 +32621,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in - let _4 : (Parsetree.pattern) = Obj.magic _4 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1113 "parsing/parser.mly" - (string) -# 25037 "parsing/parser.ml" - ) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = - let _1 = _1_inlined1 in - -# 2709 "parsing/parser.mly" + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 19284 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 19289 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 19295 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" ( _1 ) -# 25047 "parsing/parser.ml" - - in - let _3 = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 25054 "parsing/parser.ml" - in +# 19306 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 19312 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19325 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 19331 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4709 "parsing/parser.mly" + ("&&") +# 19339 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19347 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 25059 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19356 "parsing/parser.ml" in -# 2676 "parsing/parser.mly" - ( (Optional _1, _5, mkpat_with_modes _3 _4) ) -# 25065 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 19362 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25074,78 +32765,89 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in - let _4 : (Parsetree.pattern) = Obj.magic _4 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1113 "parsing/parser.mly" - (string) -# 25121 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = - let _1 = _1_inlined1 in - -# 2709 "parsing/parser.mly" - ( _1 ) -# 25131 "parsing/parser.ml" - - in - let _3 = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 25138 "parsing/parser.ml" - in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" + ( _1 ) +# 19404 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 19409 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4710 "parsing/parser.mly" +======= +# 4701 "parsing/parser.mly" +>>>>>>> origin/main + (":=") +# 19551 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19024 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 25143 "parsing/parser.ml" +<<<<<<< HEAD +# 2833 "parsing/parser.mly" +||||||| 04da777f7 +# 2831 "parsing/parser.mly" +======= +# 2821 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19033 "parsing/parser.ml" in -# 2676 "parsing/parser.mly" - ( (Optional _1, _5, mkpat_with_modes _3 _4) ) -# 25149 "parsing/parser.ml" +<<<<<<< HEAD +# 2749 "parsing/parser.mly" +||||||| 04da777f7 +# 2747 "parsing/parser.mly" +======= +# 2737 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 19039 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25158,89 +32860,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in - let _1 : ( -# 1113 "parsing/parser.mly" - (string) -# 25177 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2678 "parsing/parser.mly" - ( (Optional _1, None, _2) ) -# 25185 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (string * Parsetree.pattern) = Obj.magic _4 in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 25232 "parsing/parser.ml" - in + let _startpos = _startpos_e1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 19081 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 19086 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos__1_inlined1_ in + let op = + let _1 = +# 4713 "parsing/parser.mly" + (":=") +# 19094 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19102 "parsing/parser.ml" + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 25237 "parsing/parser.ml" +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19111 "parsing/parser.ml" in -# 2680 "parsing/parser.mly" - ( (Labelled (fst _4), None, - mkpat_with_modes _3 (snd _4) ) ) -# 25244 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 19117 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 19440 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25253,60 +32942,204 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (string * Parsetree.pattern) = Obj.magic _4 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 25298 "parsing/parser.ml" - in + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 19183 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 19188 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 19194 "parsing/parser.ml" +======= +# 19506 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 19511 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 19517 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 19205 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 19211 "parsing/parser.ml" +======= +# 5013 "parsing/parser.mly" + ( _1 ) +# 19528 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 19534 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2566 "parsing/parser.mly" +======= +# 2578 "parsing/parser.mly" +>>>>>>> upstream/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 19224 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 19230 "parsing/parser.ml" +======= +# 19547 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 19553 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +<<<<<<< HEAD +# 4713 "parsing/parser.mly" + (":=") +# 19238 "parsing/parser.ml" +======= +# 4717 "parsing/parser.mly" + (":=") +# 19561 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19246 "parsing/parser.ml" +======= +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19569 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 25303 "parsing/parser.ml" +<<<<<<< HEAD +# 2821 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19255 "parsing/parser.ml" in -# 2680 "parsing/parser.mly" - ( (Labelled (fst _4), None, - mkpat_with_modes _3 (snd _4) ) ) -# 25310 "parsing/parser.ml" +# 2737 "parsing/parser.mly" + ( _1 ) +# 19261 "parsing/parser.ml" +======= +# 2833 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19578 "parsing/parser.ml" + + in + +# 2749 "parsing/parser.mly" + ( _1 ) +# 19584 "parsing/parser.ml" +||||||| 04da777f7 +# 19440 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25319,51 +33152,142 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e1; + MenhirLib.EngineTypes.startp = _startpos_e1_; + MenhirLib.EngineTypes.endp = _endpos_e1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" - (string) -# 25337 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = + let _startpos = _startpos_e1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let e2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 19506 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 19511 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 19517 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 19528 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 19534 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19547 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 19553 "parsing/parser.ml" + + in + let _endpos_e2_ = _endpos_xs_ in + let op = + let _1 = +# 4710 "parsing/parser.mly" + (":=") +# 19561 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 25352 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +# 19569 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _endpos = _endpos_e2_ in + let _symbolstartpos = _startpos_e1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2729 "parsing/parser.mly" - ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 25361 "parsing/parser.ml" +# 2831 "parsing/parser.mly" + ( mkexp ~loc:_sloc (mkinfix e1 op e2) ) +# 19578 "parsing/parser.ml" in -# 2683 "parsing/parser.mly" - ( (Labelled (fst _2), None, snd _2) ) -# 25367 "parsing/parser.ml" +# 2747 "parsing/parser.mly" + ( _1 ) +# 19584 "parsing/parser.ml" +======= +# 19574 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25376,30 +33300,42 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in - let _1 : ( -# 1080 "parsing/parser.mly" - (string) -# 25395 "parsing/parser.ml" - ) = Obj.magic _1 in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (let_bindings) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2685 "parsing/parser.mly" - ( (Labelled _1, None, _2) ) -# 25403 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2751 "parsing/parser.mly" +||||||| 04da777f7 +# 2749 "parsing/parser.mly" +======= +# 2739 "parsing/parser.mly" +>>>>>>> origin/main + ( expr_of_let_bindings ~loc:_sloc _1 _3 ) +# 19303 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25412,76 +33348,68 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = bindings; + MenhirLib.EngineTypes.startp = _startpos_bindings_; + MenhirLib.EngineTypes.endp = _endpos_bindings_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.pattern) = Obj.magic _4 in - let _3 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in + let body : (Parsetree.expression) = Obj.magic body in + let _3 : unit = Obj.magic _3 in + let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _1 : ( -# 1080 "parsing/parser.mly" +# 984 "parsing/parser.mly" (string) -# 25452 "parsing/parser.ml" +# 19345 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2687 "parsing/parser.mly" - ( (Labelled _1, None, mkpat_with_modes _3 _4 ) ) -# 25460 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2689 "parsing/parser.mly" - ( (Nolabel, None, _1) ) -# 25485 "parsing/parser.ml" + let _endpos = _endpos_body_ in + let _v : (Parsetree.expression) = let pbop_op = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 19357 "parsing/parser.ml" + + in + let _startpos_pbop_op_ = _startpos__1_ in + let _endpos = _endpos_body_ in + let _symbolstartpos = _startpos_pbop_op_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2753 "parsing/parser.mly" +||||||| 04da777f7 +# 2751 "parsing/parser.mly" +======= +# 2741 "parsing/parser.mly" +>>>>>>> origin/main + ( let (pbop_pat, pbop_exp, rev_ands) = bindings in + let ands = List.rev rev_ands in + let pbop_loc = make_loc _sloc in + let let_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in + mkexp ~loc:_sloc (Pexp_letop{ let_; ands; body}) ) +# 19371 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25494,40 +33422,69 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2691 "parsing/parser.mly" - ( (Nolabel, None, mkpat_with_modes _2 _3 ) ) -# 25531 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _3 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19412 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19417 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos__1_inlined1_ in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2759 "parsing/parser.mly" +||||||| 04da777f7 +# 2757 "parsing/parser.mly" +======= +# 2747 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) +# 19428 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25540,134 +33497,161 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined2; - MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _2_inlined2 : unit = Obj.magic _2_inlined2 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let pat : (Parsetree.pattern) = Obj.magic pat in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1080 "parsing/parser.mly" - (string) -# 25601 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _3 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in let _1 = - let _1 = - let cty = - let _1 = - let bound_vars = - let _1 = - let xs = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 25616 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +# 19493 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" ( xs ) -# 25621 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 25627 "parsing/parser.ml" - - in - -# 2747 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 25633 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +# 19498 "parsing/parser.ml" -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 25643 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 19504 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 19515 "parsing/parser.ml" in -# 2748 "parsing/parser.mly" - ( Ppat_constraint(pat, cty) ) -# 25649 "parsing/parser.ml" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 19521 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 25659 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19534 "parsing/parser.ml" in -# 2749 "parsing/parser.mly" - ( _1 ) -# 25665 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19540 "parsing/parser.ml" in + let _endpos__3_ = _endpos_xs_ in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in -# 2693 "parsing/parser.mly" - ( (Labelled _1, None, _3) ) -# 25671 "parsing/parser.ml" +<<<<<<< HEAD +# 2759 "parsing/parser.mly" +||||||| 04da777f7 +# 2757 "parsing/parser.mly" +======= +# 2747 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) +# 19551 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25680,141 +33664,119 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined2; - MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _2_inlined2 : unit = Obj.magic _2_inlined2 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let pat : (Parsetree.pattern) = Obj.magic pat in - let _3 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 1080 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 25748 "parsing/parser.ml" +# 19586 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = - let _1 = - let _1 = - let cty = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 25763 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 25768 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 25774 "parsing/parser.ml" - - in - -# 2747 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 25780 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 25790 "parsing/parser.ml" - - in - -# 2748 "parsing/parser.mly" - ( Ppat_constraint(pat, cty) ) -# 25796 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 25806 "parsing/parser.ml" - - in - -# 2749 "parsing/parser.mly" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _3 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 19596 "parsing/parser.ml" +======= +# 19909 "parsing/parser.ml" +<<<<<<< HEAD + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _3 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 19919 "parsing/parser.ml" +||||||| 04da777f7 + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _3 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" ( _1 ) -# 25812 "parsing/parser.ml" +# 19919 "parsing/parser.ml" +======= +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19601 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos__1_inlined1_ in + let _1 = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 19609 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 19617 "parsing/parser.ml" in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2695 "parsing/parser.mly" - ( (Labelled _1, None, mkpat_with_modes _3 _4) ) -# 25818 "parsing/parser.ml" +<<<<<<< HEAD +# 2761 "parsing/parser.mly" +||||||| 04da777f7 +# 2759 "parsing/parser.mly" +======= +# 2749 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) +# 19626 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25827,123 +33789,189 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let pat : (Parsetree.pattern) = Obj.magic pat in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +# 19682 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _2 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _3 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in let _1 = - let _1 = - let cty = - let _1 = - let bound_vars = - let _1 = - let xs = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 25892 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +# 19695 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" ( xs ) -# 25897 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 25903 "parsing/parser.ml" - - in - -# 2747 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 25909 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +# 19700 "parsing/parser.ml" -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 25919 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 19706 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 19717 "parsing/parser.ml" in -# 2748 "parsing/parser.mly" - ( Ppat_constraint(pat, cty) ) -# 25925 "parsing/parser.ml" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 19723 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 25935 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19736 "parsing/parser.ml" in -# 2749 "parsing/parser.mly" - ( _1 ) -# 25941 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19742 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _1 = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 19750 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 19758 "parsing/parser.ml" in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2697 "parsing/parser.mly" - ( (Nolabel, None, _2) ) -# 25947 "parsing/parser.ml" +<<<<<<< HEAD +# 2761 "parsing/parser.mly" +||||||| 04da777f7 +# 2759 "parsing/parser.mly" +======= +# 2749 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) +# 19767 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25955,190 +33983,94 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = -# 3178 "parsing/parser.mly" - ( let p,e,c = _1 in (p,e,c,false) ) -# 25974 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in - -# 3181 "parsing/parser.mly" - ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1, None, true) ) -# 26003 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _1_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list -> - Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : (string) = Obj.magic _1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = let _2 = - let _1 = _1_inlined1 in - -# 3260 "parsing/parser.mly" - (_1 []) -# 26039 "parsing/parser.ml" - - in - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _5 = + let _1 = _1_inlined2 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19822 "parsing/parser.ml" + in -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 26049 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19827 "parsing/parser.ml" in - -# 3128 "parsing/parser.mly" - ( (_1, _2, None) ) -# 26055 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (N_ary.type_constraint) = Obj.magic _3 in - let _1 : (string) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = let _2 = + let _endpos__5_ = _endpos__1_inlined2_ in + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 26106 "parsing/parser.ml" - - in - let _startpos__2_ = _startpos__1_ in - let _1 = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 26114 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 26119 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 19839 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__5_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3130 "parsing/parser.mly" - ( let v = _2 in (* PR#7344 *) - let t = - match _3 with - | N_ary.Pconstraint t -> - Pvc_constraint { locally_abstract_univars = []; typ=t } - | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} - in - let pat = mkpat_with_modes _1 v in - let exp = ghexp_with_modes _sloc _1 (wrap_exp_with_modes _1 _5) in - (pat, exp, Some t) - ) -# 26142 "parsing/parser.ml" +<<<<<<< HEAD +# 2763 "parsing/parser.mly" +||||||| 04da777f7 +# 2761 "parsing/parser.mly" +======= +# 2751 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) +# 19848 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26151,88 +34083,185 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in let _4 : unit = Obj.magic _4 in - let _3 : (N_ary.type_constraint) = Obj.magic _3 in - let _1 : (string) = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = let _2 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _5 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 19927 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 19932 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 19938 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 19949 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 19955 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 19968 "parsing/parser.ml" + + in -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 26200 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 19974 "parsing/parser.ml" in - let _startpos__2_ = _startpos__1_ in - let _1 = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 26208 "parsing/parser.ml" - in + let _endpos__5_ = _endpos_xs_ in + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 26213 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 19986 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_x_, _startpos_x_) in let _endpos = _endpos__5_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3130 "parsing/parser.mly" - ( let v = _2 in (* PR#7344 *) - let t = - match _3 with - | N_ary.Pconstraint t -> - Pvc_constraint { locally_abstract_univars = []; typ=t } - | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} - in - let pat = mkpat_with_modes _1 v in - let exp = ghexp_with_modes _sloc _1 (wrap_exp_with_modes _1 _5) in - (pat, exp, Some t) - ) -# 26236 "parsing/parser.ml" +<<<<<<< HEAD +# 2763 "parsing/parser.mly" +||||||| 04da777f7 +# 2761 "parsing/parser.mly" +======= +# 2751 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) +# 19995 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26245,39 +34274,39 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3_inlined1; - MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -26286,89 +34315,103 @@ module Tables = struct }; }; } = _menhir_stack in - let _6 : (Parsetree.expression) = Obj.magic _6 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _5 : unit = Obj.magic _5 in - let _3_inlined1 : (Parsetree.core_type) = Obj.magic _3_inlined1 in - let _2 : unit = Obj.magic _2 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let i : (Parsetree.expression) = Obj.magic i in let _3 : unit = Obj.magic _3 in - let _1 : (string) = Obj.magic _1 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = let _4 = - let _3 = _3_inlined1 in - let _1 = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 26308 "parsing/parser.ml" + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20066 "parsing/parser.ml" in -# 1387 "parsing/parser.mly" - ( xs ) -# 26313 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20071 "parsing/parser.ml" in -# 4043 "parsing/parser.mly" - ( _1 ) -# 26319 "parsing/parser.ml" +<<<<<<< HEAD +# 2764 "parsing/parser.mly" +||||||| 04da777f7 +# 2762 "parsing/parser.mly" +======= +# 2752 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 20077 "parsing/parser.ml" in -# 4047 "parsing/parser.mly" - ( (_1, _3) ) -# 26325 "parsing/parser.ml" +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +# 20083 "parsing/parser.ml" in - let (_endpos__4_, _startpos__4_) = (_endpos__3_inlined1_, _startpos_xs_) in - let _2 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 26336 "parsing/parser.ml" + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2753 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 20093 "parsing/parser.ml" +======= +# 20406 "parsing/parser.ml" +<<<<<<< HEAD in - let _startpos__2_ = _startpos__1_ in - let _1 = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 26344 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 26349 "parsing/parser.ml" + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2765 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20416 "parsing/parser.ml" +||||||| 04da777f7 in - let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in - let _endpos = _endpos__6_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in - let _loc__4_ = (_startpos__4_, _endpos__4_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3142 "parsing/parser.mly" - ( let bound_vars, inner_type = _4 in - let ltyp = Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } in - let typ_loc = Location.ghostify (make_loc _loc__4_) in - let typ = - Jane_syntax.Layouts.type_of ~loc:typ_loc ltyp - in - let pat = mkpat_with_modes _1 _2 in - let exp = ghexp_with_modes _sloc _1 _6 in - (pat, exp, Some (Pvc_constraint { locally_abstract_univars = []; typ })) - ) -# 26372 "parsing/parser.ml" +# 2763 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20416 "parsing/parser.ml" +======= +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26381,45 +34424,57 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3_inlined1; - MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -26428,90 +34483,177 @@ module Tables = struct }; }; } = _menhir_stack in - let _6 : (Parsetree.expression) = Obj.magic _6 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _5 : unit = Obj.magic _5 in - let _3_inlined1 : (Parsetree.core_type) = Obj.magic _3_inlined1 in - let _2 : unit = Obj.magic _2 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let i : (Parsetree.expression) = Obj.magic i in let _3 : unit = Obj.magic _3 in - let _1 : (string) = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = let _4 = - let _3 = _3_inlined1 in - let _1 = - let _1 = - let xs = + let _startpos = _startpos_array_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 26451 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +# 20188 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" ( xs ) -# 26456 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 26462 "parsing/parser.ml" +# 20193 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 20199 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 20210 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 20216 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 20229 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20235 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2764 "parsing/parser.mly" +||||||| 04da777f7 +# 2762 "parsing/parser.mly" +======= +# 2752 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 20241 "parsing/parser.ml" in -# 4047 "parsing/parser.mly" - ( (_1, _3) ) -# 26468 "parsing/parser.ml" +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +# 20247 "parsing/parser.ml" in - let (_endpos__4_, _startpos__4_) = (_endpos__3_inlined1_, _startpos_xs_) in - let _2 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 26479 "parsing/parser.ml" + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2753 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 20257 "parsing/parser.ml" +======= +# 20570 "parsing/parser.ml" +<<<<<<< HEAD in - let _startpos__2_ = _startpos__1_ in - let _1 = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 26487 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 26492 "parsing/parser.ml" + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2765 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20580 "parsing/parser.ml" +||||||| 04da777f7 in - let (_endpos__1_, _startpos__1_) = (_endpos_x_, _startpos_x_) in - let _endpos = _endpos__6_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in - let _loc__4_ = (_startpos__4_, _endpos__4_) in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3142 "parsing/parser.mly" - ( let bound_vars, inner_type = _4 in - let ltyp = Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } in - let typ_loc = Location.ghostify (make_loc _loc__4_) in - let typ = - Jane_syntax.Layouts.type_of ~loc:typ_loc ltyp - in - let pat = mkpat_with_modes _1 _2 in - let exp = ghexp_with_modes _sloc _1 _6 in - (pat, exp, Some (Pvc_constraint { locally_abstract_univars = []; typ })) - ) -# 26515 "parsing/parser.ml" +# 2763 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20580 "parsing/parser.ml" +======= +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26524,46 +34666,40 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -26571,78 +34707,103 @@ module Tables = struct }; }; } = _menhir_stack in - let _8 : (Parsetree.expression) = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let _6 : (Parsetree.core_type) = Obj.magic _6 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _5 : unit = Obj.magic _5 in - let _4 : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic _4 in + let i : (Parsetree.expression) = Obj.magic i in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (string) = Obj.magic _1 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__8_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20328 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20333 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2764 "parsing/parser.mly" +||||||| 04da777f7 +# 2762 "parsing/parser.mly" +======= +# 2752 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 20339 "parsing/parser.ml" + + in -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 26594 "parsing/parser.ml" +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +# 20345 "parsing/parser.ml" in - let _endpos = _endpos__8_ in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3165 "parsing/parser.mly" - ( let exp, poly = wrap_type_annotation ~loc:_sloc _4 _6 _8 in - let loc = (_startpos__1_, _endpos__6_) in - (ghpat ~loc (Ppat_constraint(_1, poly)), exp, None) - ) -# 26606 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = -# 3170 "parsing/parser.mly" - ( (_1, _3, None) ) -# 26646 "parsing/parser.ml" +# 2753 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 20355 "parsing/parser.ml" +======= +# 20668 "parsing/parser.ml" +<<<<<<< HEAD + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2765 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20678 "parsing/parser.ml" +||||||| 04da777f7 + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2763 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20678 "parsing/parser.ml" +======= +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26655,48 +34816,214 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.core_type) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = -# 3172 "parsing/parser.mly" - ( (_1, _5, Some(Pvc_constraint { locally_abstract_univars=[]; typ=_3 })) ) -# 26700 "parsing/parser.ml" + let _startpos = _startpos_array_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 20450 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 20455 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 20461 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 20472 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 20478 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 20491 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20497 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2764 "parsing/parser.mly" +||||||| 04da777f7 +# 2762 "parsing/parser.mly" +======= +# 2752 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 20503 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +# 20509 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2765 "parsing/parser.mly" +||||||| 04da777f7 +# 2763 "parsing/parser.mly" +======= +# 2753 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20519 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26709,49 +35036,122 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : ((mode_annotation * (Lexing.position * Lexing.position)) list -> - Parsetree.expression) = Obj.magic _3 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _1 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20590 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20595 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2764 "parsing/parser.mly" +||||||| 04da777f7 +# 2762 "parsing/parser.mly" +======= +# 2752 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 20601 "parsing/parser.ml" + + in -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 26746 "parsing/parser.ml" +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +# 20607 "parsing/parser.ml" in - let _endpos = _endpos__3_ in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3174 "parsing/parser.mly" - ( (_2, ghexp_with_modes _sloc _1 (_3 _1), None) ) -# 26755 "parsing/parser.ml" +<<<<<<< HEAD +# 2765 "parsing/parser.mly" +||||||| 04da777f7 +# 2763 "parsing/parser.mly" +======= +# 2753 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20617 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26764,19 +35164,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = rec_flag; - MenhirLib.EngineTypes.startp = _startpos_rec_flag_; - MenhirLib.EngineTypes.endp = _endpos_rec_flag_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -26784,65 +35184,194 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = Obj.magic body in - let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (let_bindings) = let _1 = - let attrs2 = - let _1 = _1_inlined2 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 26819 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined2_ in - let attrs1 = - let _1 = _1_inlined1 in + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 20712 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 20717 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 20723 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 20734 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 20740 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 20753 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20759 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 26828 "parsing/parser.ml" +<<<<<<< HEAD +# 2764 "parsing/parser.mly" +||||||| 04da777f7 +# 2762 "parsing/parser.mly" +======= +# 2752 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 20765 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3201 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) - ) -# 26840 "parsing/parser.ml" +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +# 20771 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3191 "parsing/parser.mly" - ( _1 ) -# 26846 "parsing/parser.ml" +<<<<<<< HEAD +# 2765 "parsing/parser.mly" +||||||| 04da777f7 +# 2763 "parsing/parser.mly" +======= +# 2753 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 20781 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26855,26 +35384,131 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (let_binding) = Obj.magic _2 in - let _1 : (let_bindings) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 20843 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (let_bindings) = -# 3192 "parsing/parser.mly" - ( addlb _1 _2 ) -# 26878 "parsing/parser.ml" + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20856 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 20861 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 20867 "parsing/parser.ml" + + in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 20873 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 20879 "parsing/parser.ml" + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 20884 "parsing/parser.ml" + + in + +# 2699 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 20890 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 20900 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26887,83 +35521,179 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = rec_flag; - MenhirLib.EngineTypes.startp = _startpos_rec_flag_; - MenhirLib.EngineTypes.endp = _endpos_rec_flag_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = Obj.magic body in - let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 20983 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (let_bindings) = let _1 = - let attrs2 = - let _1 = _1_inlined2 in - -# 4722 "parsing/parser.mly" + let _startpos = _startpos_array_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 20999 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 21004 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 21010 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" ( _1 ) -# 26935 "parsing/parser.ml" +# 21021 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 21027 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 21040 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 21046 "parsing/parser.ml" + + in + +# 2754 "parsing/parser.mly" + (Some v) +# 21052 "parsing/parser.ml" in - let _endpos_attrs2_ = _endpos__1_inlined2_ in - let attrs1 = - let _1 = _1_inlined1 in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 21058 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 21064 "parsing/parser.ml" + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 26944 "parsing/parser.ml" +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 21069 "parsing/parser.ml" in - let ext = -# 4733 "parsing/parser.mly" - ( None ) -# 26950 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3201 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) - ) -# 26961 "parsing/parser.ml" +# 2699 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 21075 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3191 "parsing/parser.mly" - ( _1 ) -# 26967 "parsing/parser.ml" +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21085 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26976,40 +35706,52 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = rec_flag; - MenhirLib.EngineTypes.startp = _startpos_rec_flag_; - MenhirLib.EngineTypes.endp = _endpos_rec_flag_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -27017,174 +35759,136 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = Obj.magic body in - let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _2 : (Ast_helper.str) = Obj.magic _2 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 21159 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (let_bindings) = let _1 = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 27038 "parsing/parser.ml" + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let _1_inlined1 = _1_inlined2 in + let v = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 21175 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 21180 "parsing/parser.ml" + + in +<<<<<<< HEAD +# 2754 "parsing/parser.mly" + (Some v) +======= in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let attrs1 = - let _1 = _1_inlined2 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 27047 "parsing/parser.ml" + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +>>>>>>> upstream/main +# 21186 "parsing/parser.ml" in - let ext = - let _startpos__1_ = _startpos__1_inlined1_ in - let _endpos = _endpos__2_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 21192 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2715 "parsing/parser.mly" + (_2) +# 21200 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 21205 "parsing/parser.ml" + + in -# 4735 "parsing/parser.mly" - ( not_expecting _loc "extension" ) -# 27058 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21211 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3201 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) - ) -# 27070 "parsing/parser.ml" +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +# 21217 "parsing/parser.ml" in - -# 3191 "parsing/parser.mly" - ( _1 ) -# 27076 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (let_binding) = Obj.magic _2 in - let _1 : (let_bindings) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (let_bindings) = -# 3192 "parsing/parser.mly" - ( addlb _1 _2 ) -# 27108 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = -# 2733 "parsing/parser.mly" - ( _1 ) -# 27133 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.core_type) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 2735 "parsing/parser.mly" - ( Ppat_constraint(_1, _3) ) -# 27173 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 21227 "parsing/parser.ml" +======= +# 21213 "parsing/parser.ml" +<<<<<<< HEAD -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 27182 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2767 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21223 "parsing/parser.ml" +||||||| 04da777f7 in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2736 "parsing/parser.mly" - ( _1 ) -# 27188 "parsing/parser.ml" +# 2765 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21223 "parsing/parser.ml" +======= +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27197,109 +35901,303 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in - let pat : (Parsetree.pattern) = Obj.magic pat in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 21322 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_pat_ in - let _endpos = _endpos_inner_type_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let cty = - let _1 = - let bound_vars = - let _1 = - let xs = + let _startpos = _startpos_array_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 27248 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +# 21341 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" ( xs ) -# 27253 "parsing/parser.ml" - - in +# 21346 "parsing/parser.ml" -# 4043 "parsing/parser.mly" + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 21352 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 27259 "parsing/parser.ml" +# 21363 "parsing/parser.ml" in -# 2747 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 27265 "parsing/parser.ml" +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 21369 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 27275 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 21382 "parsing/parser.ml" in -# 2748 "parsing/parser.mly" - ( Ppat_constraint(pat, cty) ) -# 27281 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +======= +# 21353 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 21359 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 27291 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 21365 "parsing/parser.ml" + + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 21371 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 21377 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21382 "parsing/parser.ml" in -# 2749 "parsing/parser.mly" - ( _1 ) -# 27297 "parsing/parser.ml" +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +>>>>>>> upstream/main +# 21388 "parsing/parser.ml" + + in + +# 2754 "parsing/parser.mly" + (Some v) +# 21394 "parsing/parser.ml" + + in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 21400 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2715 "parsing/parser.mly" + (_2) +# 21408 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 21413 "parsing/parser.ml" + + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 21419 "parsing/parser.ml" + + in + +# 2699 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 21425 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2738 "parsing/parser.mly" - ( _1 ) -# 27303 "parsing/parser.ml" +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 21435 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27316,69 +36214,109 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _1_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list -> - Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : (string) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 21497 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.pattern * Parsetree.expression) = let exp = - let _1 = _1_inlined1 in - -# 3260 "parsing/parser.mly" - (_1 []) -# 27338 "parsing/parser.ml" - - in - let pat = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 21510 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 21515 "parsing/parser.ml" + + in + +# 2754 "parsing/parser.mly" + (Some v) +# 21521 "parsing/parser.ml" + + in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 21527 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 21533 "parsing/parser.ml" + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 21538 "parsing/parser.ml" + + in -# 3124 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 27348 "parsing/parser.ml" +# 2701 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 21544 "parsing/parser.ml" in - -# 3218 "parsing/parser.mly" - ( (pat, exp) ) -# 27354 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern * Parsetree.expression) = let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3221 "parsing/parser.mly" - ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1) ) -# 27382 "parsing/parser.ml" +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21554 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27391,191 +36329,202 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = exp; - MenhirLib.EngineTypes.startp = _startpos_exp_; - MenhirLib.EngineTypes.endp = _endpos_exp_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = typ; - MenhirLib.EngineTypes.startp = _startpos_typ_; - MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let exp : (Parsetree.expression) = Obj.magic exp in - let _4 : unit = Obj.magic _4 in - let typ : (Parsetree.core_type) = Obj.magic typ in - let _2 : unit = Obj.magic _2 in - let pat : (Parsetree.pattern) = Obj.magic pat in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_pat_ in - let _endpos = _endpos_exp_ in - let _v : (Parsetree.pattern * Parsetree.expression) = -# 3223 "parsing/parser.mly" - ( let loc = (_startpos_pat_, _endpos_typ_) in - (ghpat ~loc (Ppat_constraint(pat, typ)), exp) ) -# 27436 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = exp; - MenhirLib.EngineTypes.startp = _startpos_exp_; - MenhirLib.EngineTypes.endp = _endpos_exp_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let exp : (Parsetree.expression) = Obj.magic exp in - let _2 : unit = Obj.magic _2 in - let pat : (Parsetree.pattern) = Obj.magic pat in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_pat_ in - let _endpos = _endpos_exp_ in - let _v : (Parsetree.pattern * Parsetree.expression) = -# 3226 "parsing/parser.mly" - ( (pat, exp) ) -# 27475 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_body_ in - let _endpos = _endpos_body_ in - let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = -# 3230 "parsing/parser.mly" - ( let let_pat, let_exp = body in - let_pat, let_exp, [] ) -# 27501 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = bindings; - MenhirLib.EngineTypes.startp = _startpos_bindings_; - MenhirLib.EngineTypes.endp = _endpos_bindings_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in - let _1 : ( -# 1075 "parsing/parser.mly" + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" (string) -# 27535 "parsing/parser.ml" - ) = Obj.magic _1 in - let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in +# 21637 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_bindings_ in - let _endpos = _endpos_body_ in - let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = let pbop_op = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_array_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 21653 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 21658 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 21664 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 21675 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 21681 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 21694 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 21700 "parsing/parser.ml" + + in + +# 2754 "parsing/parser.mly" + (Some v) +# 21706 "parsing/parser.ml" + + in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 21712 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 21718 "parsing/parser.ml" + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 21723 "parsing/parser.ml" + + in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27548 "parsing/parser.ml" +# 2701 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 21729 "parsing/parser.ml" +======= +# 21398 "parsing/parser.ml" +<<<<<<< HEAD +>>>>>>> upstream/main in - let _endpos = _endpos_body_ in - let _symbolstartpos = _startpos_bindings_ in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3233 "parsing/parser.mly" - ( let let_pat, let_exp, rev_ands = bindings in - let pbop_pat, pbop_exp = body in - let pbop_loc = make_loc _sloc in - let and_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in - let_pat, let_exp, and_ :: rev_ands ) -# 27561 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_declaration list) = -# 211 "" - ( [] ) -# 27579 "parsing/parser.ml" +<<<<<<< HEAD +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21739 "parsing/parser.ml" +======= +# 2767 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21408 "parsing/parser.ml" +||||||| 04da777f7 + + in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2765 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21408 "parsing/parser.ml" +======= +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27588,45 +36537,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -27635,87 +36590,151 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.class_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.class_expr) = Obj.magic body in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" (string) -# 27645 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in +# 21813 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.class_declaration list) = let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 27660 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let _1_inlined1 = _1_inlined2 in + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 21829 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +======= +# 21493 "parsing/parser.ml" + + in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27672 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 21499 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 21505 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +# 21513 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 21518 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 27680 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21524 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2296 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Ci.mk id body ~virt ~params ~attrs ~loc ~text ~docs - ) -# 27695 "parsing/parser.ml" +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +# 21530 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 27701 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_description list) = -# 211 "" - ( [] ) -# 27719 "parsing/parser.ml" +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21540 "parsing/parser.ml" +<<<<<<< HEAD + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2767 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21550 "parsing/parser.ml" +||||||| 04da777f7 + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2765 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21550 "parsing/parser.ml" +======= +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27733,45 +36752,63 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; @@ -27781,88 +36818,215 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.class_description list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let cty : (Parsetree.class_type) = Obj.magic cty in - let _6 : unit = Obj.magic _6 in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 27792 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 21635 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.class_description list) = let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 27807 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Parsetree.expression) = let _1 = + let r = + let (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 21654 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 21659 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 21665 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 21676 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21682 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 21695 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 21701 "parsing/parser.ml" + + in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27819 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 21707 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 21713 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +# 21721 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 21726 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 27827 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21732 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2587 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Ci.mk id cty ~virt ~params ~attrs ~loc ~text ~docs - ) -# 27842 "parsing/parser.ml" +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +# 21738 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 27848 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_type_declaration list) = -# 211 "" - ( [] ) -# 27866 "parsing/parser.ml" +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21748 "parsing/parser.ml" +<<<<<<< HEAD + + in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2767 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21758 "parsing/parser.ml" +||||||| 04da777f7 + + in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2765 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21758 "parsing/parser.ml" +======= +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27875,52 +37039,40 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = csig; - MenhirLib.EngineTypes.startp = _startpos_csig_; - MenhirLib.EngineTypes.endp = _endpos_csig_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -27928,88 +37080,142 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.class_type_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let csig : (Parsetree.class_type) = Obj.magic csig in - let _6 : unit = Obj.magic _6 in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 27939 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 21810 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.class_type_declaration list) = let x = - let attrs2 = - let _1 = _1_inlined3 in + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 21823 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 21828 "parsing/parser.ml" + + in -# 4722 "parsing/parser.mly" - ( _1 ) -# 27954 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +>>>>>>> upstream/main +# 21834 "parsing/parser.ml" + + in +<<<<<<< HEAD +# 2754 "parsing/parser.mly" + (Some v) +======= in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27966 "parsing/parser.ml" + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +>>>>>>> upstream/main +# 21840 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 21846 "parsing/parser.ml" +<<<<<<< HEAD +======= + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 27974 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21851 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2626 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Ci.mk id csig ~virt ~params ~attrs ~loc ~text ~docs - ) -# 27989 "parsing/parser.ml" +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +# 21857 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 27995 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.module_binding list) = -# 211 "" - ( [] ) -# 28013 "parsing/parser.ml" +# 2755 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21867 "parsing/parser.ml" +<<<<<<< HEAD + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2767 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21877 "parsing/parser.ml" +||||||| 04da777f7 + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2765 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21877 "parsing/parser.ml" +======= +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28032,106 +37238,229 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; }; }; } = _menhir_stack in - let xs : (Parsetree.module_binding list) = Obj.magic xs in + let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.module_expr) = Obj.magic body in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 21950 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.module_binding list) = let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 28076 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 21966 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 21971 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 21977 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 21988 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21994 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 22007 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22013 "parsing/parser.ml" + + in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 28088 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 22019 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 22025 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 22031 "parsing/parser.ml" + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 28096 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 22036 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1933 "parsing/parser.mly" - ( - let loc = make_loc _sloc in - let attrs = attrs1 @ attrs2 in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Mb.mk name body ~attrs ~loc ~text ~docs - ) -# 28111 "parsing/parser.ml" +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +# 22042 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 28117 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.module_declaration list) = -# 211 "" - ( [] ) -# 28135 "parsing/parser.ml" +<<<<<<< HEAD +# 2767 "parsing/parser.mly" +||||||| 04da777f7 +# 2765 "parsing/parser.mly" +======= +# 2755 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 22052 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28144,40 +37473,52 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -28185,132 +37526,132 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.module_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _4 : unit = Obj.magic _4 in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 22126 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.module_declaration list) = let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 28205 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let _1_inlined1 = _1_inlined2 in + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22142 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22147 "parsing/parser.ml" + + in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 28217 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 22153 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 22159 "parsing/parser.ml" +>>>>>>> upstream/main + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +# 21854 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 21859 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 28225 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 21865 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2237 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let docs = symbol_docs _sloc in - let loc = make_loc _sloc in - let text = symbol_text _symbolstartpos in - Md.mk name mty ~attrs ~loc ~text ~docs - ) -# 28240 "parsing/parser.ml" +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +# 21871 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 28246 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.attributes) = -# 211 "" - ( [] ) -# 28264 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let xs : (Parsetree.attributes) = Obj.magic xs in - let x : (Parsetree.attribute) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.attributes) = -# 213 "" - ( x :: xs ) -# 28296 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.type_declaration list) = -# 211 "" - ( [] ) -# 28314 "parsing/parser.ml" +<<<<<<< HEAD +# 2767 "parsing/parser.mly" +||||||| 04da777f7 +# 2765 "parsing/parser.mly" +======= +# 2755 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 21881 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28328,45 +37669,63 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = kind_priv_manifest; - MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; - MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; @@ -28376,109 +37735,205 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.type_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs_inlined1 in - let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in - let jkind : (Parsetree.attribute option) = Obj.magic jkind in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" (string) -# 28388 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in +# 21976 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.type_declaration list) = let x = - let xs = xs_inlined1 in - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 28403 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let cstrs = - let _1 = - let xs = + let _v : (Parsetree.expression) = let _1 = + let r = + let (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 28412 "parsing/parser.ml" - in - -# 1369 "parsing/parser.mly" +# 21995 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" ( xs ) -# 28417 "parsing/parser.ml" +# 22000 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 22006 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 22017 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 22023 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 22036 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22042 "parsing/parser.ml" in -# 3688 "parsing/parser.mly" - ( _1 ) -# 28423 "parsing/parser.ml" - - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 28434 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 22048 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 22054 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +# 22062 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 22067 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 28442 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 22073 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3677 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let text = symbol_text _symbolstartpos in - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text - ) -# 28458 "parsing/parser.ml" +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +# 22079 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 28464 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.type_declaration list) = -# 211 "" - ( [] ) -# 28482 "parsing/parser.ml" +<<<<<<< HEAD +# 2767 "parsing/parser.mly" +||||||| 04da777f7 +# 2765 "parsing/parser.mly" +======= +# 2755 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 22089 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28491,58 +37946,40 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -28550,165 +37987,114 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.type_declaration list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs_inlined1 in - let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in - let _1_inlined3 : unit = Obj.magic _1_inlined3 in - let jkind : (Parsetree.attribute option) = Obj.magic jkind in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 28563 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 22151 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.type_declaration list) = let x = - let xs = xs_inlined1 in - let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 28578 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let cstrs = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 28587 "parsing/parser.ml" + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22164 "parsing/parser.ml" in -# 1369 "parsing/parser.mly" - ( xs ) -# 28592 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22169 "parsing/parser.ml" in -# 3688 "parsing/parser.mly" - ( _1 ) -# 28598 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 22175 "parsing/parser.ml" in - let kind_priv_manifest = -# 3723 "parsing/parser.mly" - ( _2 ) -# 28604 "parsing/parser.ml" + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 22181 "parsing/parser.ml" in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 28614 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in + let d = + let _1 = +# 124 "" + ( None ) +# 22187 "parsing/parser.ml" + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 28622 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 22192 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3677 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let text = symbol_text _symbolstartpos in - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text - ) -# 28638 "parsing/parser.ml" +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +# 22198 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 28644 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.attributes) = -# 211 "" - ( [] ) -# 28662 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let xs : (Parsetree.attributes) = Obj.magic xs in - let x : (Parsetree.attribute) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.attributes) = -# 213 "" - ( x :: xs ) -# 28694 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.signature_item list list) = -# 211 "" - ( [] ) -# 28712 "parsing/parser.ml" +<<<<<<< HEAD +# 2767 "parsing/parser.mly" +||||||| 04da777f7 +# 2765 "parsing/parser.mly" +======= +# 2755 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 22208 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28725,102 +38111,243 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos_xs_; MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.signature_item list list) = Obj.magic xs in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 22291 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.signature_item list list) = let x = - let _1 = - let _startpos = _startpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 22307 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 22312 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 22318 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 22329 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 22335 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 22348 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22354 "parsing/parser.ml" + + in -# 1292 "parsing/parser.mly" - ( text_sig _startpos ) -# 28747 "parsing/parser.ml" +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 22360 "parsing/parser.ml" in - -# 2086 "parsing/parser.mly" - ( _1 ) -# 28753 "parsing/parser.ml" - - in - -# 213 "" - ( x :: xs ) -# 28759 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let xs : (Parsetree.signature_item list list) = Obj.magic xs in - let _1 : (Parsetree.signature_item) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.signature_item list list) = let x = - let _1 = - let _startpos = _startpos__1_ in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 22366 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 22372 "parsing/parser.ml" + in -# 1290 "parsing/parser.mly" - ( text_sig _startpos @ [_1] ) -# 28794 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 22377 "parsing/parser.ml" in -# 2086 "parsing/parser.mly" - ( _1 ) -# 28800 "parsing/parser.ml" +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +# 22383 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 28806 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.structure_item list list) = -# 211 "" - ( [] ) -# 28824 "parsing/parser.ml" +<<<<<<< HEAD +# 2767 "parsing/parser.mly" +||||||| 04da777f7 +# 2765 "parsing/parser.mly" +======= +# 2755 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 22393 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28833,60 +38360,184 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 22467 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.structure_item list list) = let x = - let _1 = - let ys = - let items = -# 1355 "parsing/parser.mly" - ( [] ) -# 28859 "parsing/parser.ml" + let _startpos = _startpos_array_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let _1_inlined1 = _1_inlined2 in + let v = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22483 "parsing/parser.ml" in -# 1805 "parsing/parser.mly" - ( items ) -# 28864 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22488 "parsing/parser.ml" in - let xs = - let _startpos = _startpos__1_ in + +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 22494 "parsing/parser.ml" + + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 22500 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +# 22508 "parsing/parser.ml" + in -# 1288 "parsing/parser.mly" - ( text_str _startpos ) -# 28872 "parsing/parser.ml" +# 126 "" + ( Some x ) +# 22513 "parsing/parser.ml" in -# 267 "" - ( xs @ ys ) -# 28878 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 22519 "parsing/parser.ml" in -# 1821 "parsing/parser.mly" - ( _1 ) -# 28884 "parsing/parser.ml" +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +# 22525 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 28890 "parsing/parser.ml" +<<<<<<< HEAD +# 2767 "parsing/parser.mly" +||||||| 04da777f7 +# 2765 "parsing/parser.mly" +======= +# 2755 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 22535 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28904,104 +38555,271 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = e; - MenhirLib.EngineTypes.startp = _startpos_e_; - MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; }; }; }; } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let e : (Parsetree.expression) = Obj.magic e in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 22630 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos_xs_ in - let _v : (Parsetree.structure_item list list) = let x = - let _1 = - let ys = - let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in - let items = - let x = - let _1 = - let _1 = - let attrs = -# 4722 "parsing/parser.mly" - ( _1 ) -# 28944 "parsing/parser.ml" - in - -# 1812 "parsing/parser.mly" - ( mkstrexp e attrs ) -# 28949 "parsing/parser.ml" - - in - let _startpos__1_ = _startpos_e_ in - let _startpos = _startpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let v = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 22649 "parsing/parser.ml" + in -# 1286 "parsing/parser.mly" - ( text_str _startpos @ [_1] ) -# 28957 "parsing/parser.ml" +# 1413 "parsing/parser.mly" + ( xs ) +# 22654 "parsing/parser.ml" in - let _startpos__1_ = _startpos_e_ in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in -# 1305 "parsing/parser.mly" - ( mark_rhs_docs _startpos _endpos; - _1 ) -# 28967 "parsing/parser.ml" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +# 22660 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 22671 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1, _2 ) +# 22677 "parsing/parser.ml" in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1357 "parsing/parser.mly" - ( x ) -# 28973 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 22690 "parsing/parser.ml" in -# 1805 "parsing/parser.mly" - ( items ) -# 28979 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 22696 "parsing/parser.ml" in - let xs = - let _startpos = _startpos__1_ in + +<<<<<<< HEAD +# 2766 "parsing/parser.mly" +||||||| 04da777f7 +# 2764 "parsing/parser.mly" +======= +# 2754 "parsing/parser.mly" +>>>>>>> origin/main + (Some v) +# 22702 "parsing/parser.ml" + + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +# 22708 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +# 22716 "parsing/parser.ml" + in -# 1288 "parsing/parser.mly" - ( text_str _startpos ) -# 28987 "parsing/parser.ml" +# 126 "" + ( Some x ) +# 22721 "parsing/parser.ml" in -# 267 "" - ( xs @ ys ) -# 28993 "parsing/parser.ml" +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +# 22727 "parsing/parser.ml" in -# 1821 "parsing/parser.mly" - ( _1 ) -# 28999 "parsing/parser.ml" +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +# 22733 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 29005 "parsing/parser.ml" +<<<<<<< HEAD +# 2767 "parsing/parser.mly" +||||||| 04da777f7 +# 2765 "parsing/parser.mly" +======= +# 2755 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 22743 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29014,9 +38832,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29025,30 +38843,21 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in - let _1 : (Parsetree.structure_item) = Obj.magic _1 in + let _2 : (Parsetree.attribute) = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.structure_item list list) = let x = - let _1 = - let _startpos = _startpos__1_ in - -# 1286 "parsing/parser.mly" - ( text_str _startpos @ [_1] ) -# 29040 "parsing/parser.ml" - - in - -# 1821 "parsing/parser.mly" - ( _1 ) -# 29046 "parsing/parser.ml" - - in - -# 213 "" - ( x :: xs ) -# 29052 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = +<<<<<<< HEAD +# 2769 "parsing/parser.mly" +||||||| 04da777f7 +# 2767 "parsing/parser.mly" +======= +# 2757 "parsing/parser.mly" +>>>>>>> origin/main + ( Exp.attr _1 _2 ) +# 22775 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29059,14 +38868,28 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_type_field list list) = -# 211 "" - ( [] ) -# 29070 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2772 "parsing/parser.mly" +||||||| 04da777f7 +# 2770 "parsing/parser.mly" +======= +# 2760 "parsing/parser.mly" +>>>>>>> origin/main + ( not_expecting _loc__1_ "wildcard \"_\"" ) +# 22801 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29079,9 +38902,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29090,41 +38913,44 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : (Parsetree.class_type_field list list) = Obj.magic xs in - let _1 : (Parsetree.class_type_field) = Obj.magic _1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.class_type_field list list) = let x = - let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1300 "parsing/parser.mly" - ( text_csig _startpos @ [_1] ) -# 29104 "parsing/parser.ml" +<<<<<<< HEAD +# 4354 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4373 "parsing/parser.mly" +||||||| 04da777f7 +# 4366 "parsing/parser.mly" +======= +# 4357 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "local" (make_loc _sloc) ) +# 22837 "parsing/parser.ml" in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 29110 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_field list list) = -# 211 "" - ( [] ) -# 29128 "parsing/parser.ml" +<<<<<<< HEAD +# 2775 "parsing/parser.mly" +||||||| 04da777f7 +# 2773 "parsing/parser.mly" +======= +# 2763 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp_with_modes ~loc:_sloc (Mode.singleton _1) _2 ) +# 22846 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29137,9 +38963,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29148,41 +38974,44 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : (Parsetree.class_field list list) = Obj.magic xs in - let _1 : (Parsetree.class_field) = Obj.magic _1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.class_field list list) = let x = - let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1298 "parsing/parser.mly" - ( text_cstr _startpos @ [_1] ) -# 29162 "parsing/parser.ml" +<<<<<<< HEAD +# 4356 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4375 "parsing/parser.mly" +||||||| 04da777f7 +# 4368 "parsing/parser.mly" +======= +# 4359 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "unique" (make_loc _sloc) ) +# 22882 "parsing/parser.ml" in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 29168 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.structure_item list list) = -# 211 "" - ( [] ) -# 29186 "parsing/parser.ml" +<<<<<<< HEAD +# 2775 "parsing/parser.mly" +||||||| 04da777f7 +# 2773 "parsing/parser.mly" +======= +# 2763 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp_with_modes ~loc:_sloc (Mode.singleton _1) _2 ) +# 22891 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29195,9 +39024,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29206,41 +39035,44 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in - let _1 : (Parsetree.structure_item) = Obj.magic _1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.structure_item list list) = let x = - let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1286 "parsing/parser.mly" - ( text_str _startpos @ [_1] ) -# 29220 "parsing/parser.ml" +<<<<<<< HEAD +# 4358 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4377 "parsing/parser.mly" +||||||| 04da777f7 +# 4370 "parsing/parser.mly" +======= +# 4361 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Mode.Const.mk "once" (make_loc _sloc) ) +# 22927 "parsing/parser.ml" in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 29226 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.toplevel_phrase list list) = -# 211 "" - ( [] ) -# 29244 "parsing/parser.ml" +<<<<<<< HEAD +# 2775 "parsing/parser.mly" +||||||| 04da777f7 +# 2773 "parsing/parser.mly" +======= +# 2763 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp_with_modes ~loc:_sloc (Mode.singleton _1) _2 ) +# 22936 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29253,9 +39085,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29264,41 +39096,25 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in + let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.toplevel_phrase list list) = let x = - let _1 = - let x = - let _1 = -# 1355 "parsing/parser.mly" - ( [] ) -# 29279 "parsing/parser.ml" - in - -# 1607 "parsing/parser.mly" - ( _1 ) -# 29284 "parsing/parser.ml" - - in - -# 183 "" - ( x ) -# 29290 "parsing/parser.ml" - - in - -# 1619 "parsing/parser.mly" - ( _1 ) -# 29296 "parsing/parser.ml" - - in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 29302 "parsing/parser.ml" +<<<<<<< HEAD +# 2777 "parsing/parser.mly" +||||||| 04da777f7 +# 2775 "parsing/parser.mly" +======= +# 2765 "parsing/parser.mly" +>>>>>>> origin/main + ( mkexp_exclave ~loc:_sloc ~kwd_loc:(_loc__1_) _2 ) +# 22972 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29311,19 +39127,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = ty_params; + MenhirLib.EngineTypes.startp = _startpos_ty_params_; + MenhirLib.EngineTypes.endp = _endpos_ty_params_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = e; - MenhirLib.EngineTypes.startp = _startpos_e_; - MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29334,74 +39150,40 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let e : (Parsetree.expression) = Obj.magic e in + let _4 : unit = Obj.magic _4 in + let ty_params : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic ty_params in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.toplevel_phrase list list) = let x = - let _1 = - let x = - let _1 = _1_inlined1 in - let _1 = - let x = - let _1 = - let _1 = - let attrs = -# 4722 "parsing/parser.mly" - ( _1 ) -# 29356 "parsing/parser.ml" - in - -# 1812 "parsing/parser.mly" - ( mkstrexp e attrs ) -# 29361 "parsing/parser.ml" - - in - -# 1296 "parsing/parser.mly" - ( Ptop_def [_1] ) -# 29367 "parsing/parser.ml" - - in - let _startpos__1_ = _startpos_e_ in - let _startpos = _startpos__1_ in - -# 1294 "parsing/parser.mly" - ( text_def _startpos @ [_1] ) -# 29375 "parsing/parser.ml" - - in - -# 1357 "parsing/parser.mly" - ( x ) -# 29381 "parsing/parser.ml" - - in - -# 1607 "parsing/parser.mly" - ( _1 ) -# 29387 "parsing/parser.ml" - - in - -# 183 "" - ( x ) -# 29393 "parsing/parser.ml" - - in - -# 1619 "parsing/parser.mly" - ( _1 ) -# 29399 "parsing/parser.ml" - - in + let _endpos = _endpos__4_ in + let _v : (N_ary.function_param list) = let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 29405 "parsing/parser.ml" +<<<<<<< HEAD +# 3279 "parsing/parser.mly" +||||||| 04da777f7 +# 3277 "parsing/parser.mly" +======= +# 3267 "parsing/parser.mly" +>>>>>>> origin/main + ( (* We desugar (type a b c) to (type a) (type b) (type c). + If we do this desugaring, the loc for each parameter is a ghost. + *) + let loc = + match ty_params with + | [] | [_] -> make_loc _sloc + | _ :: _ :: _ -> ghost_loc _sloc + in + List.map + (fun (newtype, jkind) -> + { N_ary.pparam_loc = loc; + pparam_desc = Pparam_newtype (newtype, jkind) + }) + ty_params + ) +# 23035 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29414,103 +39196,82 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in - let _1 : (Parsetree.structure_item) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.toplevel_phrase list list) = let x = - let _1 = - let _1 = -# 1296 "parsing/parser.mly" - ( Ptop_def [_1] ) -# 29439 "parsing/parser.ml" - in - let _startpos = _startpos__1_ in - -# 1294 "parsing/parser.mly" - ( text_def _startpos @ [_1] ) -# 29445 "parsing/parser.ml" - - in - -# 1619 "parsing/parser.mly" - ( _1 ) -# 29451 "parsing/parser.ml" - - in - -# 213 "" - ( x :: xs ) -# 29457 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in - let _1 : (Parsetree.toplevel_phrase) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let _5 : (Jane_syntax.Jkind.annotation) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +# 23089 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.toplevel_phrase list list) = let x = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - -# 1305 "parsing/parser.mly" - ( mark_rhs_docs _startpos _endpos; - _1 ) -# 29495 "parsing/parser.ml" - - in - let _startpos = _startpos__1_ in - -# 1294 "parsing/parser.mly" - ( text_def _startpos @ [_1] ) -# 29502 "parsing/parser.ml" - - in + let _endpos = _endpos__6_ in + let _v : (N_ary.function_param list) = let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1619 "parsing/parser.mly" - ( _1 ) -# 29508 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 23104 "parsing/parser.ml" in + let _endpos = _endpos__6_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 213 "" - ( x :: xs ) -# 29514 "parsing/parser.ml" +<<<<<<< HEAD +# 3295 "parsing/parser.mly" +||||||| 04da777f7 +# 3293 "parsing/parser.mly" +======= +# 3283 "parsing/parser.mly" +>>>>>>> origin/main + ( [ { N_ary.pparam_loc = make_loc _sloc; + pparam_desc = Pparam_newtype (_3, Some _5) + } + ] + ) +# 23117 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29522,72 +39283,34 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _v : ((Longident.t Location.loc * Parsetree.pattern) list * unit option) = let _2 = -# 124 "" - ( None ) -# 29553 "parsing/parser.ml" - in - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 29563 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3561 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy - ) -# 29585 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (N_ary.function_param list) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1544 "parsing/parser.mly" - ( [x], None ) -# 29591 "parsing/parser.ml" +<<<<<<< HEAD +# 3301 "parsing/parser.mly" +||||||| 04da777f7 +# 3299 "parsing/parser.mly" +======= +# 3289 "parsing/parser.mly" +>>>>>>> origin/main + ( let a, b, c = _1 in + [ { N_ary.pparam_loc = make_loc _sloc; + pparam_desc = Pparam_val (a, b, c) + } + ] + ) +# 23150 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29599,79 +39322,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : unit = Obj.magic x in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (N_ary.function_param list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : ((Longident.t Location.loc * Parsetree.pattern) list * unit option) = let _2 = -# 126 "" - ( Some x ) -# 29637 "parsing/parser.ml" - in - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 29647 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_xs_ in + let _v : (N_ary.function_param list) = let _1 = + let xs = +# 253 "" + ( List.rev xs ) +# 23176 "parsing/parser.ml" + in -# 3561 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy - ) -# 29669 "parsing/parser.ml" +# 1320 "parsing/parser.mly" + ( xs ) +# 23181 "parsing/parser.ml" in -# 1544 "parsing/parser.mly" - ( [x], None ) -# 29675 "parsing/parser.ml" +<<<<<<< HEAD +# 3309 "parsing/parser.mly" +||||||| 04da777f7 +# 3307 "parsing/parser.mly" +======= +# 3297 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 23187 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29683,88 +39365,26 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = y; - MenhirLib.EngineTypes.startp = _startpos_y_; - MenhirLib.EngineTypes.endp = _endpos_y_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : (unit option) = Obj.magic _4 in - let y : unit = Obj.magic y in - let _2 : unit = Obj.magic _2 in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : ((Longident.t Location.loc * Parsetree.pattern) list * unit option) = let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 29740 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3561 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy - ) -# 29762 "parsing/parser.ml" - - in - -# 1546 "parsing/parser.mly" - ( [x], Some y ) -# 29768 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = +<<<<<<< HEAD +# 2594 "parsing/parser.mly" +||||||| 04da777f7 +# 2592 "parsing/parser.mly" +======= +# 2582 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 23212 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29777,81 +39397,32 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = tail; - MenhirLib.EngineTypes.startp = _startpos_tail_; - MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let tail : ((Longident.t Location.loc * Parsetree.pattern) list * unit option) = Obj.magic tail in let _2 : unit = Obj.magic _2 in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_tail_ in - let _v : ((Longident.t Location.loc * Parsetree.pattern) list * unit option) = let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 29826 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3561 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy - ) -# 29848 "parsing/parser.ml" - - in - -# 1550 "parsing/parser.mly" - ( let xs, y = tail in - x :: xs, y ) -# 29855 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = +<<<<<<< HEAD +# 2595 "parsing/parser.mly" +||||||| 04da777f7 +# 2593 "parsing/parser.mly" +======= +# 2583 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 23244 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29883,14 +39454,42 @@ module Tables = struct } = _menhir_stack in let _3 : (Parsetree.expression) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (Parsetree.case) = -# 3282 "parsing/parser.mly" - ( Exp.case _1 _3 ) -# 29894 "parsing/parser.ml" + let _v : (Parsetree.expression) = let _1 = + let _1 = +<<<<<<< HEAD +# 2597 "parsing/parser.mly" +||||||| 04da777f7 +# 2595 "parsing/parser.mly" +======= +# 2585 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_sequence(_1, _3) ) +# 23284 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +# 23293 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 2598 "parsing/parser.mly" +||||||| 04da777f7 +# 2596 "parsing/parser.mly" +======= +# 2586 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 23299 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29933,17 +39532,28 @@ module Tables = struct }; } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.expression) = Obj.magic _3 in + let _4 : (Ast_helper.str) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.case) = -# 3284 "parsing/parser.mly" - ( Exp.case _1 ~guard:_3 _5 ) -# 29947 "parsing/parser.ml" + let _v : (Parsetree.expression) = let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2600 "parsing/parser.mly" +||||||| 04da777f7 +# 2598 "parsing/parser.mly" +======= +# 2588 "parsing/parser.mly" +>>>>>>> origin/main + ( let seq = mkexp ~loc:_sloc (Pexp_sequence (_1, _5)) in + let payload = PStr [mkstrexp seq []] in + mkexp ~loc:_sloc (Pexp_extension (_4, payload)) ) +# 23357 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29955,35 +39565,30 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.case) = let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3286 "parsing/parser.mly" - ( Exp.case _1 (Exp.unreachable ~loc:(make_loc _loc__3_) ()) ) -# 29987 "parsing/parser.ml" + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = +<<<<<<< HEAD +# 4260 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4279 "parsing/parser.mly" +||||||| 04da777f7 +# 4272 "parsing/parser.mly" +======= +# 4263 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( ty ) +# 23382 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29995,123 +39600,30 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = tail; - MenhirLib.EngineTypes.startp = _startpos_tail_; - MenhirLib.EngineTypes.endp = _endpos_tail_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 30050 "parsing/parser.ml" - ) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_tail_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = - let _6 = - let _1 = _1_inlined3 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 30061 "parsing/parser.ml" - - in - let _endpos__6_ = _endpos__1_inlined3_ in - let _4 = - let _1 = _1_inlined2 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 30070 "parsing/parser.ml" - - in - let _endpos__4_ = _endpos__1_inlined2_ in - let _3 = - let _1 = _1_inlined1 in - -# 4063 "parsing/parser.mly" - ( _1 ) -# 30079 "parsing/parser.ml" - - in - let _1 = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30086 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 30094 "parsing/parser.ml" - - in - let _endpos = _endpos__6_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4341 "parsing/parser.mly" - ( let info = - match rhs_info _endpos__4_ with - | Some _ as info_before_semi -> info_before_semi - | None -> symbol_info _endpos - in - let attrs = add_info_attrs info (_4 @ _6) in - Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 30109 "parsing/parser.ml" - - in - -# 4322 "parsing/parser.mly" - ( let (f, c) = tail in (head :: f, c) ) -# 30115 "parsing/parser.ml" + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = +<<<<<<< HEAD +# 4262 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4281 "parsing/parser.mly" +||||||| 04da777f7 +# 4274 "parsing/parser.mly" +======= +# 4265 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( ty ) +# 23407 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30124,43 +39636,27 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = tail; - MenhirLib.EngineTypes.startp = _startpos_tail_; - MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in let _2 : unit = Obj.magic _2 in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_tail_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = - let _endpos = _endpos_ty_ in - let _symbolstartpos = _startpos_ty_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4352 "parsing/parser.mly" - ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 30158 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Lexing.position * Parsetree.functor_parameter) = let _startpos = _startpos__1_ in -# 4322 "parsing/parser.mly" - ( let (f, c) = tail in (head :: f, c) ) -# 30164 "parsing/parser.ml" +# 1606 "parsing/parser.mly" + ( _startpos, Unit ) +# 23440 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30173,115 +39669,84 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 30220 "parsing/parser.ml" - ) = Obj.magic _1 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (string option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = - let _6 = - let _1 = _1_inlined3 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 30231 "parsing/parser.ml" - - in - let _endpos__6_ = _endpos__1_inlined3_ in - let _4 = - let _1 = _1_inlined2 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 30240 "parsing/parser.ml" - - in - let _endpos__4_ = _endpos__1_inlined2_ in - let _3 = - let _1 = _1_inlined1 in - -# 4063 "parsing/parser.mly" - ( _1 ) -# 30249 "parsing/parser.ml" - - in - let _1 = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30256 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 30264 "parsing/parser.ml" - - in - let _endpos = _endpos__6_ in + let _endpos = _endpos__5_ in + let _v : (Lexing.position * Parsetree.functor_parameter) = let x = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4341 "parsing/parser.mly" - ( let info = - match rhs_info _endpos__4_ with - | Some _ as info_before_semi -> info_before_semi - | None -> symbol_info _endpos - in - let attrs = add_info_attrs info (_4 @ _6) in - Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 30279 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 23498 "parsing/parser.ml" in + let _startpos = _startpos__1_ in -# 4325 "parsing/parser.mly" - ( [head], Closed ) -# 30285 "parsing/parser.ml" +# 1609 "parsing/parser.mly" + ( _startpos, Named (x, mty) ) +# 23505 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = +<<<<<<< HEAD +# 4049 "parsing/parser.mly" +||||||| 04da777f7 +# 4042 "parsing/parser.mly" +======= +# 4033 "parsing/parser.mly" +>>>>>>> origin/main + ( ([],Pcstr_tuple [],None) ) +# 23524 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30299,31 +39764,28 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : (Parsetree.constructor_arguments) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = - let _endpos = _endpos_ty_ in - let _symbolstartpos = _startpos_ty_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4352 "parsing/parser.mly" - ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 30321 "parsing/parser.ml" - - in - -# 4325 "parsing/parser.mly" - ( [head], Closed ) -# 30327 "parsing/parser.ml" + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = +<<<<<<< HEAD +# 4050 "parsing/parser.mly" +||||||| 04da777f7 +# 4043 "parsing/parser.mly" +======= +# 4034 "parsing/parser.mly" +>>>>>>> origin/main + ( ([],_2,None) ) +# 23557 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30336,14 +39798,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -30359,65 +39821,120 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 30369 "parsing/parser.ml" - ) = Obj.magic _1 in + let _4 : (Parsetree.core_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.constructor_arguments) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = - let _4 = - let _1 = _1_inlined2 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 30380 "parsing/parser.ml" - - in - let _endpos__4_ = _endpos__1_inlined2_ in - let _3 = - let _1 = _1_inlined1 in - -# 4063 "parsing/parser.mly" - ( _1 ) -# 30389 "parsing/parser.ml" - - in + let _endpos = _endpos__4_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = +<<<<<<< HEAD +# 4052 "parsing/parser.mly" +||||||| 04da777f7 +# 4045 "parsing/parser.mly" +======= +# 4036 "parsing/parser.mly" +>>>>>>> origin/main + ( ([],_2,Some _4) ) +# 23604 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : (Parsetree.core_type) = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.constructor_arguments) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = let _2 = let _1 = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30396 "parsing/parser.ml" + let xs = +# 253 "" + ( List.rev xs ) +# 23667 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 30404 "parsing/parser.ml" +# 1300 "parsing/parser.mly" + ( xs ) +# 23672 "parsing/parser.ml" in - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 4334 "parsing/parser.mly" - ( let info = symbol_info _endpos in - let attrs = add_info_attrs info _4 in - Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 30415 "parsing/parser.ml" +<<<<<<< HEAD +# 4185 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 23678 "parsing/parser.ml" in -# 4328 "parsing/parser.mly" - ( [head], Closed ) -# 30421 "parsing/parser.ml" +<<<<<<< HEAD +# 4055 "parsing/parser.mly" +||||||| 04da777f7 +# 4048 "parsing/parser.mly" +======= +# 4039 "parsing/parser.mly" +>>>>>>> origin/main + ( (_2,_4,Some _6) ) +# 23684 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30429,30 +39946,34 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : (Parsetree.core_type) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_ty_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = - let _endpos = _endpos_ty_ in - let _symbolstartpos = _startpos_ty_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4352 "parsing/parser.mly" - ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 30450 "parsing/parser.ml" - - in - -# 4328 "parsing/parser.mly" - ( [head], Closed ) -# 30456 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = +<<<<<<< HEAD +# 4057 "parsing/parser.mly" +||||||| 04da777f7 +# 4050 "parsing/parser.mly" +======= +# 4041 "parsing/parser.mly" +>>>>>>> origin/main + ( ([],Pcstr_tuple [],Some _2) ) +# 23717 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30464,20 +39985,77 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in + let _4 : (Parsetree.core_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = -# 4330 "parsing/parser.mly" - ( [], Open ) -# 30481 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = let _2 = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +# 23766 "parsing/parser.ml" + in + +# 1300 "parsing/parser.mly" + ( xs ) +# 23771 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4185 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 23777 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 4059 "parsing/parser.mly" +||||||| 04da777f7 +# 4052 "parsing/parser.mly" +======= +# 4043 "parsing/parser.mly" +>>>>>>> origin/main + ( (_2,Pcstr_tuple [],Some _4) ) +# 23783 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30495,81 +40073,83 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = vars_args_res; + MenhirLib.EngineTypes.startp = _startpos_vars_args_res_; + MenhirLib.EngineTypes.endp = _endpos_vars_args_res_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = private_; - MenhirLib.EngineTypes.startp = _startpos_private__; - MenhirLib.EngineTypes.endp = _endpos_private__; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _5 : unit = Obj.magic _5 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" - (string) -# 30528 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let private_ : (Asttypes.private_flag) = Obj.magic private_ in - let _1 : (Parsetree.attributes) = Obj.magic _1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let vars_args_res : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = Obj.magic vars_args_res in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined2_ in - let _v : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * - Parsetree.attributes) = let ty = + let _v : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = let attrs = let _1 = _1_inlined2 in -# 4059 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 30541 "parsing/parser.ml" +# 23835 "parsing/parser.ml" in - let label = + let _endpos_attrs_ = _endpos__1_inlined2_ in + let cid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30549 "parsing/parser.ml" - in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30557 "parsing/parser.ml" +# 23847 "parsing/parser.ml" in - let attrs = -# 4726 "parsing/parser.mly" - ( _1 ) -# 30563 "parsing/parser.ml" - in - let _1 = -# 4624 "parsing/parser.mly" - ( Fresh ) -# 30568 "parsing/parser.ml" - in + let _endpos = _endpos_attrs_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2434 "parsing/parser.mly" - ( (label, private_, Cfk_virtual ty), attrs ) -# 30573 "parsing/parser.ml" +<<<<<<< HEAD +# 3988 "parsing/parser.mly" +||||||| 04da777f7 +# 3981 "parsing/parser.mly" +======= +# 3972 "parsing/parser.mly" +>>>>>>> origin/main + ( + let vars, args, res = vars_args_res in + let info = symbol_info _endpos in + let loc = make_loc _sloc in + cid, vars, args, res, attrs, loc, info + ) +# 23861 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30582,83 +40162,96 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = vars_args_res; + MenhirLib.EngineTypes.startp = _startpos_vars_args_res_; + MenhirLib.EngineTypes.endp = _endpos_vars_args_res_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined2 : ((mode_annotation * (Lexing.position * Lexing.position)) list -> - Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" - (string) -# 30614 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1 : (Parsetree.attributes) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let vars_args_res : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = Obj.magic vars_args_res in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * - Parsetree.attributes) = let _5 = - let _1 = _1_inlined2 in + let _endpos = _endpos__1_inlined1_ in + let _v : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = let attrs = + let _1 = _1_inlined1 in -# 3260 "parsing/parser.mly" - (_1 []) -# 30627 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 23906 "parsing/parser.ml" in - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30635 "parsing/parser.ml" - in + let _endpos_attrs_ = _endpos__1_inlined1_ in + let cid = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30643 "parsing/parser.ml" +# 23917 "parsing/parser.ml" in - let _2 = -# 4726 "parsing/parser.mly" - ( _1 ) -# 30649 "parsing/parser.ml" - in + let _startpos_cid_ = _startpos__1_ in let _1 = -# 4627 "parsing/parser.mly" - ( Fresh ) -# 30654 "parsing/parser.ml" +<<<<<<< HEAD +# 4817 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4821 "parsing/parser.mly" +||||||| 04da777f7 +# 4814 "parsing/parser.mly" +======= +# 4805 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( () ) +# 23924 "parsing/parser.ml" in + let _endpos = _endpos_attrs_ in + let _symbolstartpos = _startpos_cid_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2436 "parsing/parser.mly" - ( let e = _5 in - let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in - (_4, _3, - Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 30662 "parsing/parser.ml" +<<<<<<< HEAD +# 3988 "parsing/parser.mly" +||||||| 04da777f7 +# 3981 "parsing/parser.mly" +======= +# 3972 "parsing/parser.mly" +>>>>>>> origin/main + ( + let vars, args, res = vars_args_res in + let info = symbol_info _endpos in + let loc = make_loc _sloc in + cid, vars, args, res, attrs, loc, info + ) +# 23937 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30671,93 +40264,203 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : ((mode_annotation * (Lexing.position * Lexing.position)) list -> - Parsetree.expression) = Obj.magic _1_inlined3 in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let xs : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs in + let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let jkind : (Jane_syntax.Jkind.annotation option) = Obj.magic jkind in let _1_inlined2 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 30709 "parsing/parser.ml" +# 24017 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * - Parsetree.attributes) = let _5 = - let _1 = _1_inlined3 in + let _endpos = _endpos__1_inlined4_ in + let _v : ((Asttypes.rec_flag * string Asttypes.loc option) * + Parsetree.type_declaration) = let attrs2 = + let _1 = _1_inlined4 in -# 3260 "parsing/parser.mly" - (_1 []) -# 30723 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 24032 "parsing/parser.ml" in - let _4 = + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let cstrs = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +# 24041 "parsing/parser.ml" + in + +# 1282 "parsing/parser.mly" + ( xs ) +# 24046 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3827 "parsing/parser.mly" +||||||| 04da777f7 +# 3825 "parsing/parser.mly" +======= +# 3816 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 24052 "parsing/parser.ml" + + in + let kind_priv_manifest = +<<<<<<< HEAD +# 3862 "parsing/parser.mly" +||||||| 04da777f7 +# 3860 "parsing/parser.mly" +======= +# 3851 "parsing/parser.mly" +>>>>>>> origin/main + ( _2 ) +# 24058 "parsing/parser.ml" + in + let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30731 "parsing/parser.ml" - in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30739 "parsing/parser.ml" +# 24068 "parsing/parser.ml" in - let _2 = + let flag = +<<<<<<< HEAD +# 4837 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4841 "parsing/parser.mly" +||||||| 04da777f7 +# 4834 "parsing/parser.mly" +======= +# 4825 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Recursive ) +# 24074 "parsing/parser.ml" + in + let attrs1 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 30747 "parsing/parser.ml" +# 24081 "parsing/parser.ml" in - let _1 = -# 4628 "parsing/parser.mly" - ( Override ) -# 30753 "parsing/parser.ml" - in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2436 "parsing/parser.mly" - ( let e = _5 in - let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in - (_4, _3, - Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 30761 "parsing/parser.ml" +<<<<<<< HEAD +# 3796 "parsing/parser.mly" +||||||| 04da777f7 +# 3794 "parsing/parser.mly" +======= +# 3785 "parsing/parser.mly" +>>>>>>> origin/main + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + (flag, ext), + Jane_syntax.Layouts.type_declaration_of + id ~params ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:None ~jkind + ) +# 24098 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30770,40 +40473,64 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; @@ -30811,63 +40538,151 @@ module Tables = struct }; }; } = _menhir_stack in - let _8 : (Parsetree.expression) = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _5 : unit = Obj.magic _5 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" + let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in + let xs : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs in + let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in + let _1_inlined4 : unit = Obj.magic _1_inlined4 in + let jkind : (Jane_syntax.Jkind.annotation option) = Obj.magic jkind in + let _1_inlined3 : ( +# 1006 "parsing/parser.mly" (string) -# 30822 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1 : (Parsetree.attributes) = Obj.magic _1 in +# 24184 "parsing/parser.ml" + ) = Obj.magic _1_inlined3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__8_ in - let _v : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * - Parsetree.attributes) = let _6 = - let _1 = _1_inlined2 in + let _endpos = _endpos__1_inlined5_ in + let _v : ((Asttypes.rec_flag * string Asttypes.loc option) * + Parsetree.type_declaration) = let attrs2 = + let _1 = _1_inlined5 in -# 4059 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 30835 "parsing/parser.ml" +# 24200 "parsing/parser.ml" in - let _startpos__6_ = _startpos__1_inlined2_ in - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30844 "parsing/parser.ml" - in + let _endpos_attrs2_ = _endpos__1_inlined5_ in + let cstrs = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +# 24209 "parsing/parser.ml" + in + +# 1282 "parsing/parser.mly" + ( xs ) +# 24214 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3827 "parsing/parser.mly" +||||||| 04da777f7 +# 3825 "parsing/parser.mly" +======= +# 3816 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 24220 "parsing/parser.ml" + + in + let kind_priv_manifest = +<<<<<<< HEAD +# 3862 "parsing/parser.mly" +||||||| 04da777f7 +# 3860 "parsing/parser.mly" +======= +# 3851 "parsing/parser.mly" +>>>>>>> origin/main + ( _2 ) +# 24226 "parsing/parser.ml" + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30852 "parsing/parser.ml" +# 24236 "parsing/parser.ml" in - let _2 = -# 4726 "parsing/parser.mly" + let flag = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +<<<<<<< HEAD +# 4839 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4843 "parsing/parser.mly" +||||||| 04da777f7 +# 4836 "parsing/parser.mly" +======= +# 4827 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( not_expecting _loc "nonrec flag" ) +# 24247 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 30858 "parsing/parser.ml" - in - let _1 = -# 4627 "parsing/parser.mly" - ( Fresh ) -# 30863 "parsing/parser.ml" - in +# 24255 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2442 "parsing/parser.mly" - ( let poly_exp = - let loc = (_startpos__6_, _endpos__8_) in - ghexp ~loc (Pexp_poly(_8, Some _6)) in - (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 30871 "parsing/parser.ml" +<<<<<<< HEAD +# 3796 "parsing/parser.mly" +||||||| 04da777f7 +# 3794 "parsing/parser.mly" +======= +# 3785 "parsing/parser.mly" +>>>>>>> origin/main + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + (flag, ext), + Jane_syntax.Layouts.type_declaration_of + id ~params ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:None ~jkind + ) +# 24272 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30880,24 +40695,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = kind_priv_manifest; + MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; + MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined2; @@ -30905,20 +40720,26 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -30927,67 +40748,132 @@ module Tables = struct }; }; } = _menhir_stack in - let _8 : (Parsetree.expression) = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let xs : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs in + let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in + let jkind : (Jane_syntax.Jkind.annotation option) = Obj.magic jkind in let _1_inlined2 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 30938 "parsing/parser.ml" +# 24345 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__8_ in - let _v : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * - Parsetree.attributes) = let _6 = + let _endpos = _endpos__1_inlined3_ in + let _v : ((Asttypes.rec_flag * string Asttypes.loc option) * + Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined3 in -# 4059 "parsing/parser.mly" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 30952 "parsing/parser.ml" +# 24360 "parsing/parser.ml" in - let _startpos__6_ = _startpos__1_inlined3_ in - let _4 = + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let cstrs = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +# 24369 "parsing/parser.ml" + in + +# 1282 "parsing/parser.mly" + ( xs ) +# 24374 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3827 "parsing/parser.mly" +||||||| 04da777f7 +# 3825 "parsing/parser.mly" +======= +# 3816 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 24380 "parsing/parser.ml" + + in + let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 30961 "parsing/parser.ml" - in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30969 "parsing/parser.ml" +# 24391 "parsing/parser.ml" in - let _2 = - let _1 = _1_inlined1 in + let flag = +<<<<<<< HEAD +# 4833 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4837 "parsing/parser.mly" +||||||| 04da777f7 +# 4830 "parsing/parser.mly" +======= +# 4821 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Recursive ) +# 24397 "parsing/parser.ml" + in + let attrs1 = + let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( _1 ) -# 30977 "parsing/parser.ml" +# 24404 "parsing/parser.ml" in - let _1 = -# 4628 "parsing/parser.mly" - ( Override ) -# 30983 "parsing/parser.ml" - in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2442 "parsing/parser.mly" - ( let poly_exp = - let loc = (_startpos__6_, _endpos__8_) in - ghexp ~loc (Pexp_poly(_8, Some _6)) in - (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 30991 "parsing/parser.ml" +<<<<<<< HEAD +# 3796 "parsing/parser.mly" +||||||| 04da777f7 +# 3794 "parsing/parser.mly" +======= +# 3785 "parsing/parser.mly" +>>>>>>> origin/main + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + (flag, ext), + Jane_syntax.Layouts.type_declaration_of + id ~params ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:None ~jkind + ) +# 24421 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31000,39 +40886,39 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _11; - MenhirLib.EngineTypes.startp = _startpos__11_; - MenhirLib.EngineTypes.endp = _endpos__11_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _10; - MenhirLib.EngineTypes.startp = _startpos__10_; - MenhirLib.EngineTypes.endp = _endpos__10_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; + MenhirLib.EngineTypes.semv = kind_priv_manifest; + MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; + MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -31040,9 +40926,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -31059,78 +40945,133 @@ module Tables = struct }; }; } = _menhir_stack in - let _11 : (Parsetree.expression) = Obj.magic _11 in - let _10 : unit = Obj.magic _10 in - let _9 : (Parsetree.core_type) = Obj.magic _9 in - let _8 : unit = Obj.magic _8 in - let _7 : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let xs : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs in + let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in + let jkind : (Jane_syntax.Jkind.annotation option) = Obj.magic jkind in + let _1_inlined3 : ( +# 1006 "parsing/parser.mly" (string) -# 31073 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1 : (Parsetree.attributes) = Obj.magic _1 in +# 24500 "parsing/parser.ml" + ) = Obj.magic _1_inlined3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__11_ in - let _v : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * - Parsetree.attributes) = let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 31086 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined4_ in + let _v : ((Asttypes.rec_flag * string Asttypes.loc option) * + Parsetree.type_declaration) = let attrs2 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 24516 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let cstrs = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +# 24525 "parsing/parser.ml" + in + +# 1282 "parsing/parser.mly" + ( xs ) +# 24530 "parsing/parser.ml" + + in + +<<<<<<< HEAD +# 3827 "parsing/parser.mly" +||||||| 04da777f7 +# 3825 "parsing/parser.mly" +======= +# 3816 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 24536 "parsing/parser.ml" + + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31094 "parsing/parser.ml" +# 24547 "parsing/parser.ml" in - let _startpos__4_ = _startpos__1_inlined1_ in - let _2 = -# 4726 "parsing/parser.mly" - ( _1 ) -# 31101 "parsing/parser.ml" - in - let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in - let _1 = -# 4627 "parsing/parser.mly" - ( Fresh ) -# 31107 "parsing/parser.ml" + let flag = +<<<<<<< HEAD +# 4834 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4838 "parsing/parser.mly" +||||||| 04da777f7 +# 4831 "parsing/parser.mly" +======= +# 4822 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( Nonrecursive ) +# 24553 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in - let _endpos = _endpos__11_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - if _startpos__2_ != _endpos__2_ then - _startpos__2_ - else - if _startpos__3_ != _endpos__3_ then - _startpos__3_ - else - _startpos__4_ in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 24560 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2448 "parsing/parser.mly" - ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in - let poly_exp = - let exp, poly = - (* it seems odd to use the global ~loc here while poly_exp_loc - is tighter, but this is what ocamlyacc does; - TODO improve parser.mly *) - wrap_type_annotation ~loc:_sloc _7 _9 _11 in - ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in - (_4, _3, - Cfk_concrete (_1, poly_exp)), _2 ) -# 31134 "parsing/parser.ml" +<<<<<<< HEAD +# 3796 "parsing/parser.mly" +||||||| 04da777f7 +# 3794 "parsing/parser.mly" +======= +# 3785 "parsing/parser.mly" +>>>>>>> origin/main + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + (flag, ext), + Jane_syntax.Layouts.type_declaration_of + id ~params ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:None ~jkind + ) +# 24577 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31142,147 +41083,34 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _11; - MenhirLib.EngineTypes.startp = _startpos__11_; - MenhirLib.EngineTypes.endp = _endpos__11_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _10; - MenhirLib.EngineTypes.startp = _startpos__10_; - MenhirLib.EngineTypes.endp = _endpos__10_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _11 : (Parsetree.expression) = Obj.magic _11 in - let _10 : unit = Obj.magic _10 in - let _9 : (Parsetree.core_type) = Obj.magic _9 in - let _8 : unit = Obj.magic _8 in - let _7 : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" + let _1 : ( +# 1061 "parsing/parser.mly" (string) -# 31222 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in +# 24598 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__11_ in - let _v : ((string Location.loc * Asttypes.private_flag * Parsetree.class_field_kind) * - Parsetree.attributes) = let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 31236 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 31244 "parsing/parser.ml" - - in - let _startpos__4_ = _startpos__1_inlined2_ in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 31253 "parsing/parser.ml" - - in - let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in - let _1 = -# 4628 "parsing/parser.mly" - ( Override ) -# 31260 "parsing/parser.ml" - in - let _endpos = _endpos__11_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - if _startpos__2_ != _endpos__2_ then - _startpos__2_ - else - if _startpos__3_ != _endpos__3_ then - _startpos__3_ - else - _startpos__4_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2448 "parsing/parser.mly" - ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in - let poly_exp = - let exp, poly = - (* it seems odd to use the global ~loc here while poly_exp_loc - is tighter, but this is what ocamlyacc does; - TODO improve parser.mly *) - wrap_type_annotation ~loc:_sloc _7 _9 _11 in - ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in - (_4, _3, - Cfk_concrete (_1, poly_exp)), _2 ) -# 31286 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4659 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4663 "parsing/parser.mly" +||||||| 04da777f7 +# 4656 "parsing/parser.mly" +======= +# 4647 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 24606 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31301,17 +41129,27 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 31307 "parsing/parser.ml" +# 24627 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31315 "parsing/parser.ml" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4660 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4664 "parsing/parser.mly" +||||||| 04da777f7 +# 4657 "parsing/parser.mly" +======= +# 4648 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 24635 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31324,37 +41162,26 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : ( -# 1094 "parsing/parser.mly" - (string) -# 31348 "parsing/parser.ml" - ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Parsetree.structure) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31358 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.structure) = +# 1473 "parsing/parser.mly" + ( _1 ) +# 24667 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31372,18 +41199,20 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : ( -# 1148 "parsing/parser.mly" - (string) -# 31379 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31387 "parsing/parser.ml" + let _v : (bool) = +<<<<<<< HEAD +# 1878 "parsing/parser.mly" +||||||| 04da777f7 +# 1877 "parsing/parser.mly" +======= +# 1867 "parsing/parser.mly" +>>>>>>> origin/main + ( false ) +# 24692 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31396,37 +41225,32 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : ( -# 1148 "parsing/parser.mly" - (string) -# 31420 "parsing/parser.ml" - ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31430 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (bool) = +<<<<<<< HEAD +# 1880 "parsing/parser.mly" +||||||| 04da777f7 +# 1879 "parsing/parser.mly" +======= +# 1869 "parsing/parser.mly" +>>>>>>> origin/main + ( true ) +# 24724 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31437,26 +41261,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = let _1 = -# 4509 "parsing/parser.mly" - ( _1 ) -# 31455 "parsing/parser.ml" - in - -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31460 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (string) = +<<<<<<< HEAD +# 4716 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4720 "parsing/parser.mly" +||||||| 04da777f7 +# 4713 "parsing/parser.mly" +======= +# 4704 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( "" ) +# 24742 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31469,45 +41291,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = let _1 = - let _1 = -# 4450 "parsing/parser.mly" - ( "::" ) -# 31500 "parsing/parser.ml" - in - -# 4509 "parsing/parser.mly" - ( _1 ) -# 31505 "parsing/parser.ml" - - in - -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31511 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (string) = +<<<<<<< HEAD +# 4717 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4721 "parsing/parser.mly" +||||||| 04da777f7 +# 4714 "parsing/parser.mly" +======= +# 4705 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( ";.." ) +# 24774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31519,25 +41332,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.signature) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = let _1 = -# 4509 "parsing/parser.mly" - ( _1 ) -# 31536 "parsing/parser.ml" - in - -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31541 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.signature) = +# 1480 "parsing/parser.mly" + ( _1 ) +# 24806 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31550,217 +41365,50 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Longident.t) = let _3 = - let _1 = _1_inlined1 in - -# 4509 "parsing/parser.mly" - ( _1 ) -# 31582 "parsing/parser.ml" - - in - -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31588 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = let _3 = - let _1 = -# 4450 "parsing/parser.mly" - ( "::" ) -# 31642 "parsing/parser.ml" - in - -# 4509 "parsing/parser.mly" - ( _1 ) -# 31647 "parsing/parser.ml" - - in - -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31653 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Longident.t) = let _3 = - let _1 = _1_inlined1 in - -# 4509 "parsing/parser.mly" - ( _1 ) -# 31694 "parsing/parser.ml" - - in - -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31700 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31725 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (string) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.payload) = Obj.magic _3 in + let _2 : (Ast_helper.str) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31764 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Parsetree.extension) = +<<<<<<< HEAD +# 5030 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5034 "parsing/parser.mly" +||||||| 04da777f7 +# 5027 "parsing/parser.mly" +======= +# 5018 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( (_2, _3) ) +# 24852 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31779,17 +41427,30 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 31785 "parsing/parser.ml" +# 1052 "parsing/parser.mly" + (string * Location.t * string * Location.t * string option) +# 24873 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31793 "parsing/parser.ml" + let _v : (Parsetree.extension) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 5032 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 5036 "parsing/parser.mly" +||||||| 04da777f7 +# 5029 "parsing/parser.mly" +======= +# 5020 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( mk_quotedext ~loc:_sloc _1 ) +# 24884 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31819,49 +41480,41 @@ module Tables = struct }; }; } = _menhir_stack in - let _3 : ( -# 1094 "parsing/parser.mly" - (string) -# 31826 "parsing/parser.ml" - ) = Obj.magic _3 in + let _3 : (string Asttypes.loc list) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Jane_syntax.Jkind.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31836 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1148 "parsing/parser.mly" - (string) -# 31857 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31865 "parsing/parser.ml" +<<<<<<< HEAD + let _v : (Jane_syntax.Jkind.t) = +# 3876 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Jane_asttypes.const_jkind) = +# 3874 "parsing/parser.mly" +======= + let _v : (Jane_asttypes.const_jkind) = +# 3865 "parsing/parser.mly" +>>>>>>> origin/main + ( (* LIDENTs here are for modes *) + let mode_list = + List.map + (fun {txt; loc} -> Jane_syntax.Mode_expr.Const.mk txt loc) + _3 + in + Jane_syntax.Jkind.Mod (_1, mode_list) + ) +<<<<<<< HEAD +# 24925 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25253 "parsing/parser.ml" +||||||| 04da777f7 +# 25248 "parsing/parser.ml" +======= +# 25238 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31891,20 +41544,36 @@ module Tables = struct }; }; } = _menhir_stack in - let _3 : ( -# 1148 "parsing/parser.mly" - (string) -# 31898 "parsing/parser.ml" - ) = Obj.magic _3 in + let _3 : (Parsetree.core_type) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Jane_syntax.Jkind.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31908 "parsing/parser.ml" +<<<<<<< HEAD + let _v : (Jane_syntax.Jkind.t) = +# 3884 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Jane_asttypes.const_jkind) = +# 3877 "parsing/parser.mly" +======= + let _v : (Jane_asttypes.const_jkind) = +# 3868 "parsing/parser.mly" +>>>>>>> origin/main + ( + Jane_syntax.Jkind.With (_1, _3) + ) +<<<<<<< HEAD +# 24966 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25294 "parsing/parser.ml" +||||||| 04da777f7 +# 25289 "parsing/parser.ml" +======= +# 25279 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31922,14 +41591,54 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4470 "parsing/parser.mly" - ( Lident _1 ) -# 31933 "parsing/parser.ml" + let _v : (Jane_syntax.Jkind.t) = let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 24995 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25323 "parsing/parser.ml" +||||||| 04da777f7 +# 25318 "parsing/parser.ml" +======= +# 25308 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3887 "parsing/parser.mly" +||||||| 04da777f7 +# 3880 "parsing/parser.mly" +======= +# 3871 "parsing/parser.mly" +>>>>>>> origin/main + ( + let {txt; loc} = _1 in + Jane_syntax.Jkind.(Primitive_layout_or_abbreviation + (Const.mk txt loc)) + ) +<<<<<<< HEAD +# 25004 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25333 "parsing/parser.ml" +||||||| 04da777f7 +# 25327 "parsing/parser.ml" +======= +# 25317 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31942,33 +41651,46 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : (string) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 4471 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 31972 "parsing/parser.ml" + let _endpos = _endpos_ty_ in +<<<<<<< HEAD + let _v : (Jane_syntax.Jkind.t) = +# 3892 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Jane_asttypes.const_jkind) = +# 3884 "parsing/parser.mly" +======= + let _v : (Jane_asttypes.const_jkind) = +# 3875 "parsing/parser.mly" +>>>>>>> origin/main + ( + Jane_syntax.Jkind.Kind_of ty + ) +<<<<<<< HEAD +# 25039 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25367 "parsing/parser.ml" +||||||| 04da777f7 +# 25362 "parsing/parser.ml" +======= +# 25352 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31986,103 +41708,34 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4487 "parsing/parser.mly" - ( _1 ) -# 31997 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Longident.t) = let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4489 "parsing/parser.mly" - ( lapply ~loc:_sloc _1 _3 ) -# 32046 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 4491 "parsing/parser.mly" - ( expecting _loc__3_ "module path" ) -# 32086 "parsing/parser.ml" +<<<<<<< HEAD + let _v : (Jane_syntax.Jkind.t) = +# 3895 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Jane_asttypes.const_jkind) = +# 3888 "parsing/parser.mly" +======= + let _v : (Jane_asttypes.const_jkind) = +# 3879 "parsing/parser.mly" +>>>>>>> origin/main + ( + Jane_syntax.Jkind.Default + ) +<<<<<<< HEAD +# 25066 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25394 "parsing/parser.ml" +||||||| 04da777f7 +# 25389 "parsing/parser.ml" +======= +# 25379 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32100,46 +41753,50 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Jane_syntax.Jkind.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4484 "parsing/parser.mly" - ( _1 ) -# 32111 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_me_ in - let _v : (Parsetree.module_expr) = -# 1890 "parsing/parser.mly" - ( me ) -# 32143 "parsing/parser.ml" + let _v : (Jane_syntax.Jkind.annotation) = let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25095 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25423 "parsing/parser.ml" +||||||| 04da777f7 +# 25418 "parsing/parser.ml" +======= +# 25408 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3901 "parsing/parser.mly" +||||||| 04da777f7 +# 3894 "parsing/parser.mly" +======= +# 3885 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25101 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25429 "parsing/parser.ml" +||||||| 04da777f7 +# 25424 "parsing/parser.ml" +======= +# 25414 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32163,16 +41820,33 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let _2 : (Jane_syntax.Jkind.annotation) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Parsetree.module_expr) = let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 1892 "parsing/parser.mly" - ( expecting _loc__1_ "=" ) -# 32176 "parsing/parser.ml" +<<<<<<< HEAD + let _v : (Jane_syntax.Jkind.annotation) = +# 3905 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Jane_asttypes.jkind_annotation) = +# 3898 "parsing/parser.mly" +======= + let _v : (Jane_asttypes.jkind_annotation) = +# 3889 "parsing/parser.mly" +>>>>>>> origin/main + ( _2 ) +<<<<<<< HEAD +# 25133 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25461 "parsing/parser.ml" +||||||| 04da777f7 +# 25456 "parsing/parser.ml" +======= +# 25446 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32185,9 +41859,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -32195,9 +41869,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -32208,33 +41882,70 @@ module Tables = struct }; }; } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in let _3 : unit = Obj.magic _3 in - let mty : (Parsetree.module_type) = Obj.magic mty in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25174 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25502 "parsing/parser.ml" +||||||| 04da777f7 +# 25497 "parsing/parser.ml" +======= +# 25487 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_me_ in - let _v : (Parsetree.module_expr) = let _1 = - let _1 = -# 1895 "parsing/parser.mly" - ( Pmod_constraint(me, mty) ) -# 32223 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_me_ in + let _endpos = _endpos_jkind_ in + let _v : (string Asttypes.loc * Jane_syntax.Jkind.annotation) = let abbrev = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1325 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 32232 "parsing/parser.ml" - - in - -# 1899 "parsing/parser.mly" - ( _1 ) -# 32238 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25188 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25516 "parsing/parser.ml" +||||||| 04da777f7 +# 25511 "parsing/parser.ml" +======= +# 25501 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3909 "parsing/parser.mly" +||||||| 04da777f7 +# 3902 "parsing/parser.mly" +======= +# 3893 "parsing/parser.mly" +>>>>>>> origin/main + ( + (abbrev, jkind) + ) +<<<<<<< HEAD +# 25196 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25524 "parsing/parser.ml" +||||||| 04da777f7 +# 25519 "parsing/parser.ml" +======= +# 25509 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32247,43 +41958,177 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = arg_and_pos; - MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; - MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let body : (Parsetree.module_expr) = Obj.magic body in - let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_arg_and_pos_ in - let _endpos = _endpos_body_ in - let _v : (Parsetree.module_expr) = let _1 = - let _1 = -# 1897 "parsing/parser.mly" - ( let (_, arg) = arg_and_pos in - Pmod_functor(arg, body) ) -# 32272 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25572 "parsing/parser.ml" +||||||| 04da777f7 +# 25567 "parsing/parser.ml" +======= +# 25557 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.mutable_flag * Mode.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.label_declaration) = let attrs = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25583 "parsing/parser.ml" +||||||| 04da777f7 +# 25578 "parsing/parser.ml" +======= +# 25568 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos_attrs_ = _endpos__1_inlined3_ in + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 25590 "parsing/parser.ml" +||||||| 04da777f7 +# 25585 "parsing/parser.ml" +======= +# 25575 "parsing/parser.ml" +>>>>>>> origin/main + in + let _4 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4224 "parsing/parser.mly" +||||||| 04da777f7 +# 4217 "parsing/parser.mly" +======= +# 4208 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25597 "parsing/parser.ml" +||||||| 04da777f7 +# 25592 "parsing/parser.ml" +======= +# 25582 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25605 "parsing/parser.ml" +||||||| 04da777f7 +# 25600 "parsing/parser.ml" +======= +# 25590 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1325 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 32281 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25613 "parsing/parser.ml" +||||||| 04da777f7 +# 25608 "parsing/parser.ml" +======= +# 25598 "parsing/parser.ml" +>>>>>>> origin/main in + let _startpos__2_ = _startpos__1_inlined1_ in + let _endpos = _endpos_attrs_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1899 "parsing/parser.mly" - ( _1 ) -# 32287 "parsing/parser.ml" +<<<<<<< HEAD +# 4083 "parsing/parser.mly" +||||||| 04da777f7 +# 4076 "parsing/parser.mly" +======= +# 4067 "parsing/parser.mly" +>>>>>>> origin/main + ( let info = symbol_info _endpos in + let mut, m0 = _1 in + let m = Mode.concat m0 m1 in + let typ = mktyp_with_modes m _4 in + Type.field _2 typ ~mut ~attrs ~loc:(make_loc _sloc) ~info) +<<<<<<< HEAD +# 25630 "parsing/parser.ml" +||||||| 04da777f7 +# 25625 "parsing/parser.ml" +======= +# 25615 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32296,26 +42141,221 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _1 : unit = Obj.magic _1 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25251 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25685 "parsing/parser.ml" +||||||| 04da777f7 +# 25680 "parsing/parser.ml" +======= +# 25670 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.mutable_flag * Parsetree.modality Ast_helper.with_loc list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_mty_ in - let _v : (Parsetree.module_type) = -# 2161 "parsing/parser.mly" - ( mty ) -# 32319 "parsing/parser.ml" + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.label_declaration) = let attrs = +<<<<<<< HEAD + let _1 = _1_inlined3 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 25262 "parsing/parser.ml" +======= + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25696 "parsing/parser.ml" +||||||| 04da777f7 +# 25691 "parsing/parser.ml" +======= +# 25681 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos_attrs_ = _endpos__1_inlined4_ in + let m1 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 25705 "parsing/parser.ml" +||||||| 04da777f7 +# 25700 "parsing/parser.ml" +======= +# 25690 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4205 "parsing/parser.mly" + ( _1 ) +# 25271 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4224 "parsing/parser.mly" +||||||| 04da777f7 +# 4217 "parsing/parser.mly" +======= +# 4208 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25713 "parsing/parser.ml" +||||||| 04da777f7 +# 25708 "parsing/parser.ml" +======= +# 25698 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 25279 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25721 "parsing/parser.ml" +||||||| 04da777f7 +# 25716 "parsing/parser.ml" +======= +# 25706 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25287 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25729 "parsing/parser.ml" +||||||| 04da777f7 +# 25724 "parsing/parser.ml" +======= +# 25714 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _endpos = _endpos_attrs_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4066 "parsing/parser.mly" + ( let info = symbol_info _endpos in + let mut, m0 = _1 in + let modalities = m0 @ m1 in + Type.field _2 _4 ~mut ~modalities ~attrs ~loc:(make_loc _sloc) ~info) +# 25303 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4083 "parsing/parser.mly" +||||||| 04da777f7 +# 4076 "parsing/parser.mly" +======= +# 4067 "parsing/parser.mly" +>>>>>>> origin/main + ( let info = symbol_info _endpos in + let mut, m0 = _1 in + let m = Mode.concat m0 m1 in + let typ = mktyp_with_modes m _4 in + Type.field _2 typ ~mut ~attrs ~loc:(make_loc _sloc) ~info) +<<<<<<< HEAD +# 25746 "parsing/parser.ml" +||||||| 04da777f7 +# 25741 "parsing/parser.ml" +======= +# 25731 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32328,27 +42368,216 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25808 "parsing/parser.ml" +||||||| 04da777f7 +# 25803 "parsing/parser.ml" +======= +# 25793 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.mutable_flag * Mode.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.module_type) = let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.label_declaration) = let attrs1 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25819 "parsing/parser.ml" +||||||| 04da777f7 +# 25814 "parsing/parser.ml" +======= +# 25804 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos_attrs1_ = _endpos__1_inlined4_ in + let attrs0 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25828 "parsing/parser.ml" +||||||| 04da777f7 +# 25823 "parsing/parser.ml" +======= +# 25813 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos_attrs0_ = _endpos__1_inlined3_ in + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 25835 "parsing/parser.ml" +||||||| 04da777f7 +# 25830 "parsing/parser.ml" +======= +# 25820 "parsing/parser.ml" +>>>>>>> origin/main + in + let _4 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4224 "parsing/parser.mly" +||||||| 04da777f7 +# 4217 "parsing/parser.mly" +======= +# 4208 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25842 "parsing/parser.ml" +||||||| 04da777f7 +# 25837 "parsing/parser.ml" +======= +# 25827 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25850 "parsing/parser.ml" +||||||| 04da777f7 +# 25845 "parsing/parser.ml" +======= +# 25835 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25858 "parsing/parser.ml" +||||||| 04da777f7 +# 25853 "parsing/parser.ml" +======= +# 25843 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _endpos = _endpos_attrs1_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2163 "parsing/parser.mly" - ( expecting _loc__1_ ":" ) -# 32352 "parsing/parser.ml" +<<<<<<< HEAD +# 4092 "parsing/parser.mly" +||||||| 04da777f7 +# 4085 "parsing/parser.mly" +======= +# 4076 "parsing/parser.mly" +>>>>>>> origin/main + ( let info = + match rhs_info _endpos_attrs0_ with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info _endpos + in + let mut, m0 = _1 in + let m = Mode.concat m0 m1 in + let typ = mktyp_with_modes m _4 in + Type.field _2 typ ~mut ~attrs:(attrs0 @ attrs1) ~loc:(make_loc _sloc) ~info) +<<<<<<< HEAD +# 25879 "parsing/parser.ml" +||||||| 04da777f7 +# 25874 "parsing/parser.ml" +======= +# 25864 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32361,43 +42590,255 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = arg_and_pos; - MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; - MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let body : (Parsetree.module_type) = Obj.magic body in - let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25372 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 25948 "parsing/parser.ml" +||||||| 04da777f7 +# 25943 "parsing/parser.ml" +======= +# 25933 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.mutable_flag * Parsetree.modality Ast_helper.with_loc list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_arg_and_pos_ in - let _endpos = _endpos_body_ in - let _v : (Parsetree.module_type) = let _1 = + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.label_declaration) = let attrs1 = +<<<<<<< HEAD + let _1 = _1_inlined4 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 25383 "parsing/parser.ml" +======= + let _1 = _1_inlined5 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25959 "parsing/parser.ml" +||||||| 04da777f7 +# 25954 "parsing/parser.ml" +======= +# 25944 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos_attrs1_ = _endpos__1_inlined5_ in + let attrs0 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25968 "parsing/parser.ml" +||||||| 04da777f7 +# 25963 "parsing/parser.ml" +======= +# 25953 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs1_ = _endpos__1_inlined4_ in + let attrs0 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 25392 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 25977 "parsing/parser.ml" +||||||| 04da777f7 +# 25972 "parsing/parser.ml" +======= +# 25962 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs0_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4205 "parsing/parser.mly" + ( _1 ) +# 25401 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4224 "parsing/parser.mly" +||||||| 04da777f7 +# 4217 "parsing/parser.mly" +======= +# 4208 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25985 "parsing/parser.ml" +||||||| 04da777f7 +# 25980 "parsing/parser.ml" +======= +# 25970 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 2166 "parsing/parser.mly" - ( let (_, arg) = arg_and_pos in - Pmty_functor(arg, body) ) -# 32386 "parsing/parser.ml" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 25409 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 25993 "parsing/parser.ml" +||||||| 04da777f7 +# 25988 "parsing/parser.ml" +======= +# 25978 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1327 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 32395 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25417 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26001 "parsing/parser.ml" +||||||| 04da777f7 +# 25996 "parsing/parser.ml" +======= +# 25986 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos__2_ = _startpos__1_inlined1_ in + let _endpos = _endpos_attrs1_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2169 "parsing/parser.mly" - ( _1 ) -# 32401 "parsing/parser.ml" +<<<<<<< HEAD +# 4074 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4092 "parsing/parser.mly" +||||||| 04da777f7 +# 4085 "parsing/parser.mly" +======= +# 4076 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let info = + match rhs_info _endpos_attrs0_ with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info _endpos + in + let mut, m0 = _1 in +<<<<<<< HEAD + let modalities = m0 @ m1 in + Type.field _2 _4 ~mut ~modalities ~attrs:(attrs0 @ attrs1) ~loc:(make_loc _sloc) ~info) +# 25437 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32409,52 +42850,32 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let s : (Parsetree.structure) = Obj.magic s in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.label_declaration) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.module_expr) = let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 32449 "parsing/parser.ml" - - in - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1719 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_structure s) ) -# 32458 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Parsetree.label_declaration list) = +# 4060 "parsing/parser.mly" + ( [_1] ) +# 25462 "parsing/parser.ml" +======= + let m = Mode.concat m0 m1 in + let typ = mktyp_with_modes m _4 in + Type.field _2 typ ~mut ~attrs:(attrs0 @ attrs1) ~loc:(make_loc _sloc) ~info) +<<<<<<< HEAD +# 26022 "parsing/parser.ml" +||||||| 04da777f7 +# 26017 "parsing/parser.ml" +======= +# 26007 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32466,51 +42887,73 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.structure) = Obj.magic _3 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.label_declaration) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.module_expr) = let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 32506 "parsing/parser.ml" - - in - let _loc__4_ = (_startpos__4_, _endpos__4_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 1721 "parsing/parser.mly" - ( unclosed "struct" _loc__1_ "end" _loc__4_ ) -# 32514 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Parsetree.label_declaration list) = +<<<<<<< HEAD +# 4077 "parsing/parser.mly" +||||||| 04da777f7 +# 4070 "parsing/parser.mly" +======= +# 4061 "parsing/parser.mly" +>>>>>>> origin/main + ( [_1] ) +<<<<<<< HEAD +# 25487 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26047 "parsing/parser.ml" +||||||| 04da777f7 +# 26042 "parsing/parser.ml" +======= +# 26032 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.label_declaration) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.label_declaration list) = +<<<<<<< HEAD +# 4078 "parsing/parser.mly" +||||||| 04da777f7 +# 4071 "parsing/parser.mly" +======= +# 4062 "parsing/parser.mly" +>>>>>>> origin/main + ( [_1] ) +<<<<<<< HEAD +# 26072 "parsing/parser.ml" +||||||| 04da777f7 +# 26067 "parsing/parser.ml" +======= +# 26057 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32534,149 +42977,33 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _2 : (Parsetree.label_declaration list) = Obj.magic _2 in + let _1 : (Parsetree.label_declaration) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Parsetree.module_expr) = let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 1723 "parsing/parser.mly" - ( expecting _loc__1_ "struct" ) -# 32547 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in - let _4 : unit = Obj.magic _4 in - let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_me_ in - let _v : (Parsetree.module_expr) = let args = - let _1 = _1_inlined2 in - -# 1685 "parsing/parser.mly" - ( _1 ) -# 32602 "parsing/parser.ml" - - in - let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 32610 "parsing/parser.ml" - - in - let _endpos = _endpos_me_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1725 "parsing/parser.mly" - ( wrap_mod_attrs ~loc:_sloc attrs ( - List.fold_left (fun acc (startpos, arg) -> - mkmod ~loc:(startpos, _endpos) (Pmod_functor (arg, acc)) - ) me args - ) ) -# 32623 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me_ in - let _endpos = _endpos_me_ in - let _v : (Parsetree.module_expr) = -# 1731 "parsing/parser.mly" - ( me ) -# 32648 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = attr; - MenhirLib.EngineTypes.startp = _startpos_attr_; - MenhirLib.EngineTypes.endp = _endpos_attr_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let attr : (Parsetree.attribute) = Obj.magic attr in - let me : (Parsetree.module_expr) = Obj.magic me in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me_ in - let _endpos = _endpos_attr_ in - let _v : (Parsetree.module_expr) = -# 1733 "parsing/parser.mly" - ( Mod.attr me attr ) -# 32680 "parsing/parser.ml" + let _v : (Parsetree.label_declaration list) = +<<<<<<< HEAD +# 4062 "parsing/parser.mly" + ( _1 :: _2 ) +# 25519 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4079 "parsing/parser.mly" +||||||| 04da777f7 +# 4072 "parsing/parser.mly" +======= +# 4063 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 :: _2 ) +<<<<<<< HEAD +# 26104 "parsing/parser.ml" +||||||| 04da777f7 +# 26099 "parsing/parser.ml" +======= +# 26089 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32694,41 +43021,116 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26125 "parsing/parser.ml" +||||||| 04da777f7 +# 26120 "parsing/parser.ml" +======= +# 26110 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.module_expr) = let _1 = + let _v : (string * Parsetree.pattern * Mode.t) = let modes = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 25548 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 26133 "parsing/parser.ml" +||||||| 04da777f7 +# 26128 "parsing/parser.ml" +======= +# 26118 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = let _1 = - let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 32711 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1737 "parsing/parser.mly" - ( Pmod_ident x ) -# 32717 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25558 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26143 "parsing/parser.ml" +||||||| 04da777f7 +# 26138 "parsing/parser.ml" +======= +# 26128 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1325 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 32726 "parsing/parser.ml" - - in - -# 1748 "parsing/parser.mly" - ( _1 ) -# 32732 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 25567 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26152 "parsing/parser.ml" +||||||| 04da777f7 +# 26147 "parsing/parser.ml" +======= +# 26137 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2662 "parsing/parser.mly" +||||||| 04da777f7 +# 2660 "parsing/parser.mly" +======= +# 2650 "parsing/parser.mly" +>>>>>>> origin/main + ( let lab, pat = x in + lab, + pat, + modes ) +<<<<<<< HEAD +# 25576 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26161 "parsing/parser.ml" +||||||| 04da777f7 +# 26156 "parsing/parser.ml" +======= +# 26146 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32741,42 +43143,131 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me2; - MenhirLib.EngineTypes.startp = _startpos_me2_; - MenhirLib.EngineTypes.endp = _endpos_me2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me1; - MenhirLib.EngineTypes.startp = _startpos_me1_; - MenhirLib.EngineTypes.endp = _endpos_me1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let me2 : (Parsetree.module_expr) = Obj.magic me2 in - let me1 : (Parsetree.module_expr) = Obj.magic me1 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25604 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26189 "parsing/parser.ml" +||||||| 04da777f7 +# 26184 "parsing/parser.ml" +======= +# 26174 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me1_ in - let _endpos = _endpos_me2_ in - let _v : (Parsetree.module_expr) = let _1 = - let _1 = -# 1740 "parsing/parser.mly" - ( Pmod_apply(me1, me2) ) -# 32765 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_me2_, _startpos_me1_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (string * Parsetree.pattern * Mode.t) = let modes = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 25614 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 26199 "parsing/parser.ml" +||||||| 04da777f7 +# 26194 "parsing/parser.ml" +======= +# 26184 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25625 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26210 "parsing/parser.ml" +||||||| 04da777f7 +# 26205 "parsing/parser.ml" +======= +# 26195 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1325 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 32774 "parsing/parser.ml" - - in - -# 1748 "parsing/parser.mly" - ( _1 ) -# 32780 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 25634 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26219 "parsing/parser.ml" +||||||| 04da777f7 +# 26214 "parsing/parser.ml" +======= +# 26204 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2662 "parsing/parser.mly" +||||||| 04da777f7 +# 2660 "parsing/parser.mly" +======= +# 2650 "parsing/parser.mly" +>>>>>>> origin/main + ( let lab, pat = x in + lab, + pat, + modes ) +<<<<<<< HEAD +# 25643 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26228 "parsing/parser.ml" +||||||| 04da777f7 +# 26223 "parsing/parser.ml" +======= +# 26213 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32789,9 +43280,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -32799,39 +43290,130 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let cty : (Parsetree.core_type) = Obj.magic cty in let _2 : unit = Obj.magic _2 in - let me : (Parsetree.module_expr) = Obj.magic me in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25678 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26263 "parsing/parser.ml" +||||||| 04da777f7 +# 26258 "parsing/parser.ml" +======= +# 26248 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.module_expr) = let _1 = - let _1 = -# 1743 "parsing/parser.mly" - ( Pmod_apply_unit me ) -# 32820 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_me_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos_cty_ in + let _v : (string * Parsetree.pattern * Mode.t) = let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 25686 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 26271 "parsing/parser.ml" +||||||| 04da777f7 +# 26266 "parsing/parser.ml" +======= +# 26256 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos_modes_ = _endpos_cty_ in + let x = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25697 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26282 "parsing/parser.ml" +||||||| 04da777f7 +# 26277 "parsing/parser.ml" +======= +# 26267 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1325 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 32829 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 25706 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26291 "parsing/parser.ml" +||||||| 04da777f7 +# 26286 "parsing/parser.ml" +======= +# 26276 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos_x_ = _startpos__1_ in + let _endpos = _endpos_modes_ in + let _symbolstartpos = _startpos_x_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1748 "parsing/parser.mly" - ( _1 ) -# 32835 "parsing/parser.ml" +<<<<<<< HEAD +# 2667 "parsing/parser.mly" +||||||| 04da777f7 +# 2665 "parsing/parser.mly" +======= +# 2655 "parsing/parser.mly" +>>>>>>> origin/main + ( let lab, pat = x in + lab, + mkpat ~loc:_sloc (Ppat_constraint (pat, cty)), + modes ) +<<<<<<< HEAD +# 25719 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26304 "parsing/parser.ml" +||||||| 04da777f7 +# 26299 "parsing/parser.ml" +======= +# 26289 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32843,90 +43425,151 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ex; - MenhirLib.EngineTypes.startp = _startpos_ex_; - MenhirLib.EngineTypes.endp = _endpos_ex_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let ex : (Parsetree.extension) = Obj.magic ex in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 25761 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26346 "parsing/parser.ml" +||||||| 04da777f7 +# 26341 "parsing/parser.ml" +======= +# 26331 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ex_ in - let _endpos = _endpos_ex_ in - let _v : (Parsetree.module_expr) = let _1 = - let _1 = -# 1746 "parsing/parser.mly" - ( Pmod_extension ex ) -# 32861 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_ex_, _startpos_ex_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (string * Parsetree.pattern * Mode.t) = let modes = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 25771 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 26356 "parsing/parser.ml" +||||||| 04da777f7 +# 26351 "parsing/parser.ml" +======= +# 26341 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_modes_ = _endpos__1_inlined1_ in + let x = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25783 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26368 "parsing/parser.ml" +||||||| 04da777f7 +# 26363 "parsing/parser.ml" +======= +# 26353 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1325 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 32870 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 25792 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26377 "parsing/parser.ml" +||||||| 04da777f7 +# 26372 "parsing/parser.ml" +======= +# 26362 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos_x_ = _startpos__1_ in + let _endpos = _endpos_modes_ in + let _symbolstartpos = _startpos_x_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1748 "parsing/parser.mly" - ( _1 ) -# 32876 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : ( -# 1148 "parsing/parser.mly" - (string) -# 32897 "parsing/parser.ml" - ) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (string option) = -# 1702 "parsing/parser.mly" - ( Some x ) -# 32905 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string option) = -# 1705 "parsing/parser.mly" - ( None ) -# 32930 "parsing/parser.ml" +<<<<<<< HEAD +# 2667 "parsing/parser.mly" +||||||| 04da777f7 +# 2665 "parsing/parser.mly" +======= +# 2655 "parsing/parser.mly" +>>>>>>> origin/main + ( let lab, pat = x in + lab, + mkpat ~loc:_sloc (Ppat_constraint (pat, cty)), + modes ) +<<<<<<< HEAD +# 25805 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26390 "parsing/parser.ml" +||||||| 04da777f7 +# 26385 "parsing/parser.ml" +======= +# 26375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32939,112 +43582,255 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : ( -# 1148 "parsing/parser.mly" + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 1006 "parsing/parser.mly" (string) -# 32990 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in +<<<<<<< HEAD +# 25854 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26439 "parsing/parser.ml" +||||||| 04da777f7 +# 26434 "parsing/parser.ml" +======= +# 26424 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : (Parsetree.module_substitution * string Location.loc option) = let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" + let _endpos = _endpos_inner_type_ in + let _v : (string * Parsetree.pattern * Mode.t) = let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 25862 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 26447 "parsing/parser.ml" +||||||| 04da777f7 +# 26442 "parsing/parser.ml" +======= +# 26432 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos_modes_ = _endpos_inner_type_ in + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 25872 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26457 "parsing/parser.ml" +||||||| 04da777f7 +# 26452 "parsing/parser.ml" +======= +# 26442 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 25877 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" ( _1 ) -# 33003 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let body = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in +# 25883 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26462 "parsing/parser.ml" +||||||| 04da777f7 +# 26457 "parsing/parser.ml" +======= +# 26447 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 26468 "parsing/parser.ml" +||||||| 04da777f7 +# 26463 "parsing/parser.ml" +======= +# 26453 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2675 "parsing/parser.mly" +||||||| 04da777f7 +# 2673 "parsing/parser.mly" +======= +# 2663 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 25889 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26474 "parsing/parser.ml" +||||||| 04da777f7 +# 26469 "parsing/parser.ml" +======= +# 26459 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 33015 "parsing/parser.ml" +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 25899 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26484 "parsing/parser.ml" +||||||| 04da777f7 +# 26479 "parsing/parser.ml" +======= +# 26469 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let uid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 25910 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26495 "parsing/parser.ml" +||||||| 04da777f7 +# 26490 "parsing/parser.ml" +======= +# 26480 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 33026 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 33034 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 25919 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26504 "parsing/parser.ml" +||||||| 04da777f7 +# 26499 "parsing/parser.ml" +======= +# 26489 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in + let _startpos_x_ = _startpos__1_ in + let _endpos = _endpos_modes_ in + let _symbolstartpos = _startpos_x_ in let _sloc = (_symbolstartpos, _endpos) in -# 2199 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Ms.mk uid body ~attrs ~loc ~docs, ext - ) -# 33048 "parsing/parser.ml" +<<<<<<< HEAD +# 2677 "parsing/parser.mly" +||||||| 04da777f7 +# 2675 "parsing/parser.mly" +======= +# 2665 "parsing/parser.mly" +>>>>>>> origin/main + ( let lab, pat = x in + lab, + mkpat ~loc:_sloc (Ppat_constraint (pat, cty)), + modes ) +<<<<<<< HEAD +# 25932 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26517 "parsing/parser.ml" +||||||| 04da777f7 +# 26512 "parsing/parser.ml" +======= +# 26502 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33057,24 +43843,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -33092,43 +43878,230 @@ module Tables = struct }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : ( -# 1148 "parsing/parser.mly" + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 1006 "parsing/parser.mly" (string) -# 33101 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : (string Location.loc option) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in +<<<<<<< HEAD +# 25988 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26573 "parsing/parser.ml" +||||||| 04da777f7 +# 26568 "parsing/parser.ml" +======= +# 26558 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.module_substitution * string Location.loc option) = let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_inlined1_ in + let _v : (string * Parsetree.pattern * Mode.t) = let modes = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 25998 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 26583 "parsing/parser.ml" +||||||| 04da777f7 +# 26578 "parsing/parser.ml" +======= +# 26568 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_modes_ = _endpos__1_inlined1_ in + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 26009 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26594 "parsing/parser.ml" +||||||| 04da777f7 +# 26589 "parsing/parser.ml" +======= +# 26579 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 26014 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 26020 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26599 "parsing/parser.ml" +||||||| 04da777f7 +# 26594 "parsing/parser.ml" +======= +# 26584 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 26605 "parsing/parser.ml" +||||||| 04da777f7 +# 26600 "parsing/parser.ml" +======= +# 26590 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2675 "parsing/parser.mly" +||||||| 04da777f7 +# 2673 "parsing/parser.mly" +======= +# 2663 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 26026 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26611 "parsing/parser.ml" +||||||| 04da777f7 +# 26606 "parsing/parser.ml" +======= +# 26596 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 33117 "parsing/parser.ml" +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 26036 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26621 "parsing/parser.ml" +||||||| 04da777f7 +# 26616 "parsing/parser.ml" +======= +# 26606 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _3 = - let _1 = _1_inlined1 in + let x = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 26047 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26632 "parsing/parser.ml" +||||||| 04da777f7 +# 26627 "parsing/parser.ml" +======= +# 26617 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 33125 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 26056 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26641 "parsing/parser.ml" +||||||| 04da777f7 +# 26636 "parsing/parser.ml" +======= +# 26626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _startpos_x_ = _startpos__1_ in + let _endpos = _endpos_modes_ in + let _symbolstartpos = _startpos_x_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2206 "parsing/parser.mly" - ( expecting _loc__6_ "module path" ) -# 33132 "parsing/parser.ml" +<<<<<<< HEAD +# 2677 "parsing/parser.mly" +||||||| 04da777f7 +# 2675 "parsing/parser.mly" +======= +# 2665 "parsing/parser.mly" +>>>>>>> origin/main + ( let lab, pat = x in + lab, + mkpat ~loc:_sloc (Ppat_constraint (pat, cty)), + modes ) +<<<<<<< HEAD +# 26069 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26654 "parsing/parser.ml" +||||||| 04da777f7 +# 26649 "parsing/parser.ml" +======= +# 26639 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33140,52 +44113,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let s : (Parsetree.signature) = Obj.magic s in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.module_type) = let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 33180 "parsing/parser.ml" - - in - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2032 "parsing/parser.mly" - ( mkmty ~loc:_sloc ~attrs (Pmty_signature s) ) -# 33189 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4748 "parsing/parser.mly" + ( _1 ) +# 26094 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4752 "parsing/parser.mly" +||||||| 04da777f7 +# 4745 "parsing/parser.mly" +======= +# 4736 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 26679 "parsing/parser.ml" +||||||| 04da777f7 +# 26674 "parsing/parser.ml" +======= +# 26664 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33197,51 +44156,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.signature) = Obj.magic _3 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.module_type) = let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 33237 "parsing/parser.ml" - - in - let _loc__4_ = (_startpos__4_, _endpos__4_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2034 "parsing/parser.mly" - ( unclosed "sig" _loc__1_ "end" _loc__4_ ) -# 33245 "parsing/parser.ml" + let _endpos = _endpos__1_ in +<<<<<<< HEAD + let _v : (Asttypes.arg_label * Parsetree.expression) = +# 3061 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Asttypes.arg_label * Parsetree.expression) = +# 3059 "parsing/parser.mly" +======= + let _v : (Parsetree.arg_label * Parsetree.expression) = +# 3049 "parsing/parser.mly" +>>>>>>> origin/main + ( (Nolabel, _1) ) +<<<<<<< HEAD +# 26119 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26704 "parsing/parser.ml" +||||||| 04da777f7 +# 26699 "parsing/parser.ml" +======= +# 26689 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33265,16 +44211,47 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26147 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26732 "parsing/parser.ml" +||||||| 04da777f7 +# 26727 "parsing/parser.ml" +======= +# 26717 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Parsetree.module_type) = let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2036 "parsing/parser.mly" - ( expecting _loc__1_ "sig" ) -# 33278 "parsing/parser.ml" +<<<<<<< HEAD + let _v : (Asttypes.arg_label * Parsetree.expression) = +# 3063 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Asttypes.arg_label * Parsetree.expression) = +# 3061 "parsing/parser.mly" +======= + let _v : (Parsetree.arg_label * Parsetree.expression) = +# 3051 "parsing/parser.mly" +>>>>>>> origin/main + ( (Labelled _1, _2) ) +<<<<<<< HEAD +# 26155 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26740 "parsing/parser.ml" +||||||| 04da777f7 +# 26735 "parsing/parser.ml" +======= +# 26725 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33287,70 +44264,58 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _4 : unit = Obj.magic _4 in - let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26182 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26767 "parsing/parser.ml" +||||||| 04da777f7 +# 26762 "parsing/parser.ml" +======= +# 26752 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_mty_ in - let _v : (Parsetree.module_type) = let args = - let _1 = _1_inlined2 in - -# 1685 "parsing/parser.mly" - ( _1 ) -# 33333 "parsing/parser.ml" - - in - let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 33341 "parsing/parser.ml" - - in - let _endpos = _endpos_mty_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_label_ in + let _v : (Parsetree.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2040 "parsing/parser.mly" - ( wrap_mty_attrs ~loc:_sloc attrs ( - List.fold_left (fun acc (startpos, arg) -> - mkmty ~loc:(startpos, _endpos) (Pmty_functor (arg, acc)) - ) mty args - ) ) -# 33354 "parsing/parser.ml" +<<<<<<< HEAD +# 3065 "parsing/parser.mly" +||||||| 04da777f7 +# 3063 "parsing/parser.mly" +======= +# 3053 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + (Labelled label, mkexpvar ~loc label) ) +<<<<<<< HEAD +# 26193 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26778 "parsing/parser.ml" +||||||| 04da777f7 +# 26773 "parsing/parser.ml" +======= +# 26763 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33368,14 +44333,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -33392,68 +44357,51 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : (Parsetree.module_expr) = Obj.magic _5 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26240 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26825 "parsing/parser.ml" +||||||| 04da777f7 +# 26820 "parsing/parser.ml" +======= +# 26810 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.module_type) = let _4 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 33409 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Parsetree.arg_label * Parsetree.expression) = let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2046 "parsing/parser.mly" - ( mkmty ~loc:_sloc ~attrs:_4 (Pmty_typeof _5) ) -# 33418 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_type) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.module_type) = -# 2048 "parsing/parser.mly" - ( _2 ) -# 33457 "parsing/parser.ml" +<<<<<<< HEAD +# 3068 "parsing/parser.mly" +||||||| 04da777f7 +# 3066 "parsing/parser.mly" +======= +# 3056 "parsing/parser.mly" +>>>>>>> origin/main + ( (Labelled label, mkexp_type_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_label_ label) c) ) +<<<<<<< HEAD +# 26253 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26838 "parsing/parser.ml" +||||||| 04da777f7 +# 26833 "parsing/parser.ml" +======= +# 26823 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33466,35 +44414,58 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_type) = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26280 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26865 "parsing/parser.ml" +||||||| 04da777f7 +# 26860 "parsing/parser.ml" +======= +# 26850 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.module_type) = let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos_label_ in + let _v : (Parsetree.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2050 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 33498 "parsing/parser.ml" +<<<<<<< HEAD +# 3071 "parsing/parser.mly" +||||||| 04da777f7 +# 3069 "parsing/parser.mly" +======= +# 3059 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + (Optional label, mkexpvar ~loc label) ) +<<<<<<< HEAD +# 26291 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26876 "parsing/parser.ml" +||||||| 04da777f7 +# 26871 "parsing/parser.ml" +======= +# 26861 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33518,15 +44489,47 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : (Parsetree.attribute) = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : ( +# 1026 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26319 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26904 "parsing/parser.ml" +||||||| 04da777f7 +# 26899 "parsing/parser.ml" +======= +# 26889 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Parsetree.module_type) = -# 2052 "parsing/parser.mly" - ( Mty.attr _1 _2 ) -# 33530 "parsing/parser.ml" +<<<<<<< HEAD + let _v : (Asttypes.arg_label * Parsetree.expression) = +# 3074 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Asttypes.arg_label * Parsetree.expression) = +# 3072 "parsing/parser.mly" +======= + let _v : (Parsetree.arg_label * Parsetree.expression) = +# 3062 "parsing/parser.mly" +>>>>>>> origin/main + ( (Optional _1, _2) ) +<<<<<<< HEAD +# 26327 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26912 "parsing/parser.ml" +||||||| 04da777f7 +# 26907 "parsing/parser.ml" +======= +# 26897 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33538,47 +44541,113 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in + let _4 : (string * Parsetree.pattern * Mode.t) = Obj.magic _4 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.module_type) = let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 33561 "parsing/parser.ml" - - in - -# 2055 "parsing/parser.mly" - ( Pmty_ident _1 ) -# 33567 "parsing/parser.ml" - - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__6_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = + let _1 = _1_inlined1 in -# 1327 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 33576 "parsing/parser.ml" +<<<<<<< HEAD +# 2658 "parsing/parser.mly" +||||||| 04da777f7 +# 2656 "parsing/parser.mly" +======= +# 2646 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 26382 "parsing/parser.ml" + + in + let modes0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 26388 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26967 "parsing/parser.ml" +||||||| 04da777f7 +# 26962 "parsing/parser.ml" +======= +# 26952 "parsing/parser.ml" +>>>>>>> origin/main in - -# 2068 "parsing/parser.mly" - ( _1 ) -# 33582 "parsing/parser.ml" + let modes0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 26973 "parsing/parser.ml" +||||||| 04da777f7 +# 26968 "parsing/parser.ml" +======= +# 26958 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2609 "parsing/parser.mly" +||||||| 04da777f7 +# 2607 "parsing/parser.mly" +======= +# 2597 "parsing/parser.mly" +>>>>>>> origin/main + ( let lbl, pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Optional lbl, _5, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 26395 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 26980 "parsing/parser.ml" +||||||| 04da777f7 +# 26975 "parsing/parser.ml" +======= +# 26965 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33591,56 +44660,259 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let _4 : (Parsetree.module_type) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : (Parsetree.expression option) = Obj.magic _1_inlined2 in + let _4 : (string * Parsetree.pattern * Mode.t) = Obj.magic _4 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.module_type) = let _1 = - let _1 = -# 2057 "parsing/parser.mly" - ( Pmty_functor(Unit, _4) ) -# 33629 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__6_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 2658 "parsing/parser.mly" +||||||| 04da777f7 +# 2656 "parsing/parser.mly" +======= +# 2646 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 26457 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27042 "parsing/parser.ml" +||||||| 04da777f7 +# 27037 "parsing/parser.ml" +======= +# 27027 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let modes0 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 26469 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 26475 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 27054 "parsing/parser.ml" +||||||| 04da777f7 +# 27049 "parsing/parser.ml" +======= +# 27039 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 27060 "parsing/parser.ml" +||||||| 04da777f7 +# 27055 "parsing/parser.ml" +======= +# 27045 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2609 "parsing/parser.mly" +||||||| 04da777f7 +# 2607 "parsing/parser.mly" +======= +# 2597 "parsing/parser.mly" +>>>>>>> origin/main + ( let lbl, pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Optional lbl, _5, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 26483 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27068 "parsing/parser.ml" +||||||| 04da777f7 +# 27063 "parsing/parser.ml" +======= +# 27053 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26510 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27095 "parsing/parser.ml" +||||||| 04da777f7 +# 27090 "parsing/parser.ml" +======= +# 27080 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 26525 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27110 "parsing/parser.ml" +||||||| 04da777f7 +# 27105 "parsing/parser.ml" +======= +# 27095 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1327 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 33638 "parsing/parser.ml" - - in - -# 2068 "parsing/parser.mly" - ( _1 ) -# 33644 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 26534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27119 "parsing/parser.ml" +||||||| 04da777f7 +# 27114 "parsing/parser.ml" +======= +# 27104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2613 "parsing/parser.mly" +||||||| 04da777f7 +# 2611 "parsing/parser.mly" +======= +# 2601 "parsing/parser.mly" +>>>>>>> origin/main + ( (Optional (fst _2), None, snd _2) ) +<<<<<<< HEAD +# 26540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27125 "parsing/parser.ml" +||||||| 04da777f7 +# 27120 "parsing/parser.ml" +======= +# 27110 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33653,49 +44925,126 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.module_type) = Obj.magic _3 in + let _6 : unit = Obj.magic _6 in + let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in + let _4 : (Parsetree.pattern * Mode.t) = Obj.magic _4 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _1 : ( +# 1026 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26589 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27174 "parsing/parser.ml" +||||||| 04da777f7 +# 27169 "parsing/parser.ml" +======= +# 27159 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.module_type) = let _1 = - let _1 = -# 2060 "parsing/parser.mly" - ( Pmty_functor(Named (mknoloc None, _1), _3) ) -# 33684 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1327 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 33693 "parsing/parser.ml" + let _endpos = _endpos__6_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = + let _1 = _1_inlined1 in - in - -# 2068 "parsing/parser.mly" - ( _1 ) -# 33699 "parsing/parser.ml" +<<<<<<< HEAD +# 2658 "parsing/parser.mly" +||||||| 04da777f7 +# 2656 "parsing/parser.mly" +======= +# 2646 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 26599 "parsing/parser.ml" + + in + let modes0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 26605 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27184 "parsing/parser.ml" +||||||| 04da777f7 +# 27179 "parsing/parser.ml" +======= +# 27169 "parsing/parser.ml" +>>>>>>> origin/main + + in + let modes0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 27190 "parsing/parser.ml" +||||||| 04da777f7 +# 27185 "parsing/parser.ml" +======= +# 27175 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2615 "parsing/parser.mly" +||||||| 04da777f7 +# 2613 "parsing/parser.mly" +======= +# 2603 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Optional _1, _5, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 26612 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27197 "parsing/parser.ml" +||||||| 04da777f7 +# 27192 "parsing/parser.ml" +======= +# 27182 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33708,63 +45057,164 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; } = _menhir_stack in - let xs : (Parsetree.with_constraint list) = Obj.magic xs in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : (Parsetree.expression option) = Obj.magic _1_inlined2 in + let _4 : (Parsetree.pattern * Mode.t) = Obj.magic _4 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _1 : ( +# 1026 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26668 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27253 "parsing/parser.ml" +||||||| 04da777f7 +# 27248 "parsing/parser.ml" +======= +# 27238 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.module_type) = let _1 = + let _endpos = _endpos__6_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 2658 "parsing/parser.mly" +||||||| 04da777f7 +# 2656 "parsing/parser.mly" +======= +# 2646 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 26678 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27263 "parsing/parser.ml" +||||||| 04da777f7 +# 27258 "parsing/parser.ml" +======= +# 27248 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let modes0 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = - let _3 = - let xs = -# 253 "" - ( List.rev xs ) -# 33741 "parsing/parser.ml" - in - -# 1439 "parsing/parser.mly" - ( xs ) -# 33746 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2062 "parsing/parser.mly" - ( Pmty_with(_1, _3) ) -# 33752 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 26690 "parsing/parser.ml" in - let _endpos__1_ = _endpos_xs_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1327 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 33762 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 26696 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 27275 "parsing/parser.ml" +||||||| 04da777f7 +# 27270 "parsing/parser.ml" +======= +# 27260 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 27281 "parsing/parser.ml" +||||||| 04da777f7 +# 27276 "parsing/parser.ml" +======= +# 27266 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2068 "parsing/parser.mly" - ( _1 ) -# 33768 "parsing/parser.ml" +<<<<<<< HEAD +# 2615 "parsing/parser.mly" +||||||| 04da777f7 +# 2613 "parsing/parser.mly" +======= +# 2603 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Optional _1, _5, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 26704 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27289 "parsing/parser.ml" +||||||| 04da777f7 +# 27284 "parsing/parser.ml" +======= +# 27274 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33776,35 +45226,59 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.extension) = Obj.magic _1 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : ( +# 1026 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27317 "parsing/parser.ml" +||||||| 04da777f7 +# 27312 "parsing/parser.ml" +======= +# 27302 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.module_type) = let _1 = - let _1 = -# 2066 "parsing/parser.mly" - ( Pmty_extension _1 ) -# 33794 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1327 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 33802 "parsing/parser.ml" - - in - -# 2068 "parsing/parser.mly" - ( _1 ) -# 33808 "parsing/parser.ml" + let _endpos = _endpos__2_ in +<<<<<<< HEAD + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2619 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2617 "parsing/parser.mly" +======= + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2607 "parsing/parser.mly" +>>>>>>> origin/main + ( (Optional _1, None, _2) ) +<<<<<<< HEAD +# 26740 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27325 "parsing/parser.ml" +||||||| 04da777f7 +# 27320 "parsing/parser.ml" +======= +# 27310 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33817,49 +45291,84 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let _4 : (string * Parsetree.pattern * Mode.t) = Obj.magic _4 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.module_type) = let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 33852 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos__1_inlined1_ in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2070 "parsing/parser.mly" - ( Jane_syntax.Strengthen.mty_of ~loc:(make_loc _sloc) - { mty = _1; mod_id = _3 } ) -# 33863 "parsing/parser.ml" + let _endpos = _endpos__5_ in +<<<<<<< HEAD + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let modes0 = +# 4386 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let modes0 = +# 4379 "parsing/parser.mly" +======= + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let modes0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 26786 "parsing/parser.ml" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 27371 "parsing/parser.ml" +||||||| 04da777f7 +# 27366 "parsing/parser.ml" +======= +# 27356 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2621 "parsing/parser.mly" +||||||| 04da777f7 +# 2619 "parsing/parser.mly" +======= +# 2609 "parsing/parser.mly" +>>>>>>> origin/main + ( let lbl, pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Labelled lbl, None, + mkpat_with_modes modes pat ) ) +<<<<<<< HEAD +# 26794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27379 "parsing/parser.ml" +||||||| 04da777f7 +# 27374 "parsing/parser.ml" +======= +# 27364 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33872,97 +45381,229 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = typ; - MenhirLib.EngineTypes.startp = _startpos_typ_; - MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let typ : (Parsetree.module_type option) = Obj.magic typ in - let _1_inlined2 : (string) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _5 : unit = Obj.magic _5 in + let _4 : (string * Parsetree.pattern * Mode.t) = Obj.magic _4 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.module_type_declaration * string Location.loc option) = let attrs2 = - let _1 = _1_inlined3 in + let _endpos = _endpos__5_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let modes0 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 26853 "parsing/parser.ml" + + in -# 4722 "parsing/parser.mly" - ( _1 ) -# 33932 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 26859 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 27438 "parsing/parser.ml" +||||||| 04da777f7 +# 27433 "parsing/parser.ml" +======= +# 27423 "parsing/parser.ml" +>>>>>>> origin/main + + in - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 27444 "parsing/parser.ml" +||||||| 04da777f7 +# 27439 "parsing/parser.ml" +======= +# 27429 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2621 "parsing/parser.mly" +||||||| 04da777f7 +# 2619 "parsing/parser.mly" +======= +# 2609 "parsing/parser.mly" +>>>>>>> origin/main + ( let lbl, pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Labelled lbl, None, + mkpat_with_modes modes pat ) ) +<<<<<<< HEAD +# 26868 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27453 "parsing/parser.ml" +||||||| 04da777f7 +# 27448 "parsing/parser.ml" +======= +# 27438 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 26895 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27480 "parsing/parser.ml" +||||||| 04da777f7 +# 27475 "parsing/parser.ml" +======= +# 27465 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 26910 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27495 "parsing/parser.ml" +||||||| 04da777f7 +# 27490 "parsing/parser.ml" +======= +# 27480 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 33944 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 33952 "parsing/parser.ml" +<<<<<<< HEAD +# 2684 "parsing/parser.mly" +||||||| 04da777f7 +# 2682 "parsing/parser.mly" +======= +# 2672 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) +<<<<<<< HEAD +# 26919 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27504 "parsing/parser.ml" +||||||| 04da777f7 +# 27499 "parsing/parser.ml" +======= +# 27489 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1978 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Mtd.mk id ?typ ~attrs ~loc ~docs, ext - ) -# 33966 "parsing/parser.ml" +<<<<<<< HEAD +# 2626 "parsing/parser.mly" +||||||| 04da777f7 +# 2624 "parsing/parser.mly" +======= +# 2614 "parsing/parser.mly" +>>>>>>> origin/main + ( (Labelled (fst _2), None, snd _2) ) +<<<<<<< HEAD +# 26925 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27510 "parsing/parser.ml" +||||||| 04da777f7 +# 27505 "parsing/parser.ml" +======= +# 27495 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33975,387 +45616,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = typ; - MenhirLib.EngineTypes.startp = _startpos_typ_; - MenhirLib.EngineTypes.endp = _endpos_typ_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let typ : (Parsetree.module_type) = Obj.magic typ in - let _6 : unit = Obj.magic _6 in - let _1_inlined2 : (string) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.module_type_declaration * string Location.loc option) = let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 34042 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 34054 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 34062 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2255 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Mtd.mk id ~typ ~attrs ~loc ~docs, ext - ) -# 34076 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 4494 "parsing/parser.mly" - ( _1 ) -# 34101 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.mutable_flag) = -# 4575 "parsing/parser.mly" - ( Immutable ) -# 34119 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag) = -# 4576 "parsing/parser.mly" - ( Mutable ) -# 34144 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.mutable_flag * Jane_asttypes.global_flag) = -# 4579 "parsing/parser.mly" - ( Immutable, Nothing ) -# 34162 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag * Jane_asttypes.global_flag) = -# 4580 "parsing/parser.mly" - ( Mutable, Nothing ) -# 34187 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag * Jane_asttypes.global_flag) = -# 4581 "parsing/parser.mly" - ( Immutable, Global ) -# 34212 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 4593 "parsing/parser.mly" - ( Immutable, Concrete ) -# 34230 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 4595 "parsing/parser.mly" - ( Mutable, Concrete ) -# 34255 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 4597 "parsing/parser.mly" - ( Immutable, Virtual ) -# 34280 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 4600 "parsing/parser.mly" - ( Mutable, Virtual ) -# 34312 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 4600 "parsing/parser.mly" - ( Mutable, Virtual ) -# 34344 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -34364,54 +45627,47 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : (string) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (string) = -# 4546 "parsing/parser.mly" - ( _2 ) -# 34376 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in + let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 1094 "parsing/parser.mly" +# 992 "parsing/parser.mly" (string) -# 34397 "parsing/parser.ml" +<<<<<<< HEAD +# 26953 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27538 "parsing/parser.ml" +||||||| 04da777f7 +# 27533 "parsing/parser.ml" +======= +# 27523 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string Location.loc * Jane_asttypes.jkind_annotation option) = let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 34409 "parsing/parser.ml" - - in - -# 3380 "parsing/parser.mly" - ( _1, None ) -# 34415 "parsing/parser.ml" + let _endpos = _endpos__2_ in +<<<<<<< HEAD + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2628 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2626 "parsing/parser.mly" +======= + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2616 "parsing/parser.mly" +>>>>>>> origin/main + ( (Labelled _1, None, _2) ) +<<<<<<< HEAD +# 26961 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27546 "parsing/parser.ml" +||||||| 04da777f7 +# 27541 "parsing/parser.ml" +======= +# 27531 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34429,19 +45685,19 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -34454,32 +45710,76 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in - let _3 : unit = Obj.magic _3 in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" + let _4 : (Parsetree.pattern) = Obj.magic _4 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 992 "parsing/parser.mly" (string) -# 34463 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in +<<<<<<< HEAD +# 27010 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27595 "parsing/parser.ml" +||||||| 04da777f7 +# 27590 "parsing/parser.ml" +======= +# 27580 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (string Location.loc * Jane_asttypes.jkind_annotation option) = let name = + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 34477 "parsing/parser.ml" - - in - -# 3382 "parsing/parser.mly" - ( name, Some jkind ) -# 34483 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 27023 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 27608 "parsing/parser.ml" +||||||| 04da777f7 +# 27603 "parsing/parser.ml" +======= +# 27593 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2630 "parsing/parser.mly" +||||||| 04da777f7 +# 2628 "parsing/parser.mly" +======= +# 2618 "parsing/parser.mly" +>>>>>>> origin/main + ( (Labelled _1, None, mkpat_with_modes _3 _4 ) ) +<<<<<<< HEAD +# 27029 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27614 "parsing/parser.ml" +||||||| 04da777f7 +# 27609 "parsing/parser.ml" +======= +# 27599 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34497,14 +45797,32 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = -# 3377 "parsing/parser.mly" - ( _1 ) -# 34508 "parsing/parser.ml" +<<<<<<< HEAD + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2632 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2630 "parsing/parser.mly" +======= + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2620 "parsing/parser.mly" +>>>>>>> origin/main + ( (Nolabel, None, _1) ) +<<<<<<< HEAD +# 27054 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27639 "parsing/parser.ml" +||||||| 04da777f7 +# 27634 "parsing/parser.ml" +======= +# 27624 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34516,34 +45834,88 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 34529 "parsing/parser.ml" - ) = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.pattern * Mode.t) = Obj.magic _3 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string Location.loc list) = let x = + let _endpos = _endpos__4_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let modes0 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 34541 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 27105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 27690 "parsing/parser.ml" +||||||| 04da777f7 +# 27685 "parsing/parser.ml" +======= +# 27675 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 221 "" - ( [ x ] ) -# 34547 "parsing/parser.ml" +<<<<<<< HEAD +# 2634 "parsing/parser.mly" +||||||| 04da777f7 +# 2632 "parsing/parser.mly" +======= +# 2622 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes1 = _3 in + let modes = Mode.concat modes0 modes1 in + (Nolabel, None, mkpat_with_modes modes pat ) ) +<<<<<<< HEAD +# 27113 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27698 "parsing/parser.ml" +||||||| 04da777f7 +# 27693 "parsing/parser.ml" +======= +# 27683 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34556,75 +45928,290 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (string Location.loc list) = Obj.magic xs in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 34575 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (string Location.loc list) = let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 34587 "parsing/parser.ml" - - in - -# 223 "" - ( x :: xs ) -# 34593 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 27183 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27768 "parsing/parser.ml" +||||||| 04da777f7 +# 27763 "parsing/parser.ml" +======= +# 27753 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list) = let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4157 "parsing/parser.mly" - ( (Local, _sloc) ) -# 34622 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = + let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 27192 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 27777 "parsing/parser.ml" +||||||| 04da777f7 +# 27772 "parsing/parser.ml" +======= +# 27762 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 27203 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27788 "parsing/parser.ml" +||||||| 04da777f7 +# 27783 "parsing/parser.ml" +======= +# 27773 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 27208 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 27214 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27793 "parsing/parser.ml" +||||||| 04da777f7 +# 27788 "parsing/parser.ml" +======= +# 27778 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 27799 "parsing/parser.ml" +||||||| 04da777f7 +# 27794 "parsing/parser.ml" +======= +# 27784 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 27220 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27805 "parsing/parser.ml" +||||||| 04da777f7 +# 27800 "parsing/parser.ml" +======= +# 27790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 27230 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27815 "parsing/parser.ml" +||||||| 04da777f7 +# 27810 "parsing/parser.ml" +======= +# 27800 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 27236 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27821 "parsing/parser.ml" +||||||| 04da777f7 +# 27816 "parsing/parser.ml" +======= +# 27806 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 27246 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27831 "parsing/parser.ml" +||||||| 04da777f7 +# 27826 "parsing/parser.ml" +======= +# 27816 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in - in - -# 221 "" - ( [ x ] ) -# 34628 "parsing/parser.ml" +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 27252 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27837 "parsing/parser.ml" +||||||| 04da777f7 +# 27832 "parsing/parser.ml" +======= +# 27822 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2638 "parsing/parser.mly" +||||||| 04da777f7 +# 2636 "parsing/parser.mly" +======= +# 2626 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes = _3 in + (Labelled _1, None, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 27259 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27844 "parsing/parser.ml" +||||||| 04da777f7 +# 27839 "parsing/parser.ml" +======= +# 27829 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34636,30 +46223,299 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 27336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27921 "parsing/parser.ml" +||||||| 04da777f7 +# 27916 "parsing/parser.ml" +======= +# 27906 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list) = let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4159 "parsing/parser.mly" - ( (Unique, _sloc) ) -# 34657 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = + let _1 = _1_inlined1 in + let modes = +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 27346 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 27931 "parsing/parser.ml" +||||||| 04da777f7 +# 27926 "parsing/parser.ml" +======= +# 27916 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 27357 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27942 "parsing/parser.ml" +||||||| 04da777f7 +# 27937 "parsing/parser.ml" +======= +# 27927 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 27362 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 27368 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27947 "parsing/parser.ml" +||||||| 04da777f7 +# 27942 "parsing/parser.ml" +======= +# 27932 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 27953 "parsing/parser.ml" +||||||| 04da777f7 +# 27948 "parsing/parser.ml" +======= +# 27938 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 27374 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27959 "parsing/parser.ml" +||||||| 04da777f7 +# 27954 "parsing/parser.ml" +======= +# 27944 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 27384 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27969 "parsing/parser.ml" +||||||| 04da777f7 +# 27964 "parsing/parser.ml" +======= +# 27954 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 27390 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27975 "parsing/parser.ml" +||||||| 04da777f7 +# 27970 "parsing/parser.ml" +======= +# 27960 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 27400 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27985 "parsing/parser.ml" +||||||| 04da777f7 +# 27980 "parsing/parser.ml" +======= +# 27970 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in - in - -# 221 "" - ( [ x ] ) -# 34663 "parsing/parser.ml" +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 27406 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27991 "parsing/parser.ml" +||||||| 04da777f7 +# 27986 "parsing/parser.ml" +======= +# 27976 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2638 "parsing/parser.mly" +||||||| 04da777f7 +# 2636 "parsing/parser.mly" +======= +# 2626 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes = _3 in + (Labelled _1, None, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 27413 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 27998 "parsing/parser.ml" +||||||| 04da777f7 +# 27993 "parsing/parser.ml" +======= +# 27983 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34671,30 +46527,328 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 27490 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28075 "parsing/parser.ml" +||||||| 04da777f7 +# 28070 "parsing/parser.ml" +======= +# 28060 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list) = let x = + let _endpos = _endpos__5_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = + let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 27499 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 28084 "parsing/parser.ml" +||||||| 04da777f7 +# 28079 "parsing/parser.ml" +======= +# 28069 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 27510 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28095 "parsing/parser.ml" +||||||| 04da777f7 +# 28090 "parsing/parser.ml" +======= +# 28080 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 27515 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 27521 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28100 "parsing/parser.ml" +||||||| 04da777f7 +# 28095 "parsing/parser.ml" +======= +# 28085 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 28106 "parsing/parser.ml" +||||||| 04da777f7 +# 28101 "parsing/parser.ml" +======= +# 28091 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 27527 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28112 "parsing/parser.ml" +||||||| 04da777f7 +# 28107 "parsing/parser.ml" +======= +# 28097 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 27537 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28122 "parsing/parser.ml" +||||||| 04da777f7 +# 28117 "parsing/parser.ml" +======= +# 28107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 27543 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28128 "parsing/parser.ml" +||||||| 04da777f7 +# 28123 "parsing/parser.ml" +======= +# 28113 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 27553 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28138 "parsing/parser.ml" +||||||| 04da777f7 +# 28133 "parsing/parser.ml" +======= +# 28123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 27559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28144 "parsing/parser.ml" +||||||| 04da777f7 +# 28139 "parsing/parser.ml" +======= +# 28129 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let modes0 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4161 "parsing/parser.mly" - ( (Once, _sloc) ) -# 34692 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 27570 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 28155 "parsing/parser.ml" +||||||| 04da777f7 +# 28150 "parsing/parser.ml" +======= +# 28140 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 221 "" - ( [ x ] ) -# 34698 "parsing/parser.ml" +<<<<<<< HEAD +# 2641 "parsing/parser.mly" +||||||| 04da777f7 +# 2639 "parsing/parser.mly" +======= +# 2629 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Labelled _1, None, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 27578 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28163 "parsing/parser.ml" +||||||| 04da777f7 +# 28158 "parsing/parser.ml" +======= +# 28148 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34707,36 +46861,335 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 27662 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28247 "parsing/parser.ml" +||||||| 04da777f7 +# 28242 "parsing/parser.ml" +======= +# 28232 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list) = let x = + let _endpos = _endpos__5_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = + let _1 = _1_inlined2 in + let modes = +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 27672 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 28257 "parsing/parser.ml" +||||||| 04da777f7 +# 28252 "parsing/parser.ml" +======= +# 28242 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 27683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28268 "parsing/parser.ml" +||||||| 04da777f7 +# 28263 "parsing/parser.ml" +======= +# 28253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 27688 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 27694 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28273 "parsing/parser.ml" +||||||| 04da777f7 +# 28268 "parsing/parser.ml" +======= +# 28258 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 28279 "parsing/parser.ml" +||||||| 04da777f7 +# 28274 "parsing/parser.ml" +======= +# 28264 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 27700 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28285 "parsing/parser.ml" +||||||| 04da777f7 +# 28280 "parsing/parser.ml" +======= +# 28270 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 27710 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28295 "parsing/parser.ml" +||||||| 04da777f7 +# 28290 "parsing/parser.ml" +======= +# 28280 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 27716 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28301 "parsing/parser.ml" +||||||| 04da777f7 +# 28296 "parsing/parser.ml" +======= +# 28286 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 27726 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28311 "parsing/parser.ml" +||||||| 04da777f7 +# 28306 "parsing/parser.ml" +======= +# 28296 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 27732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28317 "parsing/parser.ml" +||||||| 04da777f7 +# 28312 "parsing/parser.ml" +======= +# 28302 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let modes0 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4157 "parsing/parser.mly" - ( (Local, _sloc) ) -# 34734 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 27743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 28328 "parsing/parser.ml" +||||||| 04da777f7 +# 28323 "parsing/parser.ml" +======= +# 28313 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 223 "" - ( x :: xs ) -# 34740 "parsing/parser.ml" +<<<<<<< HEAD +# 2641 "parsing/parser.mly" +||||||| 04da777f7 +# 2639 "parsing/parser.mly" +======= +# 2629 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes1 = _4 in + let modes = Mode.concat modes0 modes1 in + (Labelled _1, None, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 27751 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28336 "parsing/parser.ml" +||||||| 04da777f7 +# 28331 "parsing/parser.ml" +======= +# 28321 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34749,36 +47202,269 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let pat : (Parsetree.pattern) = Obj.magic pat in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list) = let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__3_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _2 = + let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 27819 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 28404 "parsing/parser.ml" +||||||| 04da777f7 +# 28399 "parsing/parser.ml" +======= +# 28389 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 27830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28415 "parsing/parser.ml" +||||||| 04da777f7 +# 28410 "parsing/parser.ml" +======= +# 28400 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 27835 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 27841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28420 "parsing/parser.ml" +||||||| 04da777f7 +# 28415 "parsing/parser.ml" +======= +# 28405 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 28426 "parsing/parser.ml" +||||||| 04da777f7 +# 28421 "parsing/parser.ml" +======= +# 28411 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 27847 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28432 "parsing/parser.ml" +||||||| 04da777f7 +# 28427 "parsing/parser.ml" +======= +# 28417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 27857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28442 "parsing/parser.ml" +||||||| 04da777f7 +# 28437 "parsing/parser.ml" +======= +# 28427 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 27863 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28448 "parsing/parser.ml" +||||||| 04da777f7 +# 28443 "parsing/parser.ml" +======= +# 28433 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 27873 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28458 "parsing/parser.ml" +||||||| 04da777f7 +# 28453 "parsing/parser.ml" +======= +# 28443 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4159 "parsing/parser.mly" - ( (Unique, _sloc) ) -# 34776 "parsing/parser.ml" +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 27879 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28464 "parsing/parser.ml" +||||||| 04da777f7 +# 28459 "parsing/parser.ml" +======= +# 28449 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 223 "" - ( x :: xs ) -# 34782 "parsing/parser.ml" +<<<<<<< HEAD +# 2645 "parsing/parser.mly" +||||||| 04da777f7 +# 2643 "parsing/parser.mly" +======= +# 2633 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes = _2 in + (Nolabel, None, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 27886 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28471 "parsing/parser.ml" +||||||| 04da777f7 +# 28466 "parsing/parser.ml" +======= +# 28456 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34791,61 +47477,277 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let pat : (Parsetree.pattern) = Obj.magic pat in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list) = let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4161 "parsing/parser.mly" - ( (Once, _sloc) ) -# 34818 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.arg_label * Parsetree.expression option * Parsetree.pattern) = let _2 = + let _1 = _1_inlined1 in + let modes = +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 27962 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 28547 "parsing/parser.ml" +||||||| 04da777f7 +# 28542 "parsing/parser.ml" +======= +# 28532 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 27973 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28558 "parsing/parser.ml" +||||||| 04da777f7 +# 28553 "parsing/parser.ml" +======= +# 28543 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 27978 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 27984 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28563 "parsing/parser.ml" +||||||| 04da777f7 +# 28558 "parsing/parser.ml" +======= +# 28548 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 28569 "parsing/parser.ml" +||||||| 04da777f7 +# 28564 "parsing/parser.ml" +======= +# 28554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 27990 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28575 "parsing/parser.ml" +||||||| 04da777f7 +# 28570 "parsing/parser.ml" +======= +# 28560 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 28000 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28585 "parsing/parser.ml" +||||||| 04da777f7 +# 28580 "parsing/parser.ml" +======= +# 28570 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 28006 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28591 "parsing/parser.ml" +||||||| 04da777f7 +# 28586 "parsing/parser.ml" +======= +# 28576 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 28016 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28601 "parsing/parser.ml" +||||||| 04da777f7 +# 28596 "parsing/parser.ml" +======= +# 28586 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in - in - -# 223 "" - ( x :: xs ) -# 34824 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : (string Location.loc * Jane_asttypes.jkind_annotation option) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = -# 221 "" - ( [ x ] ) -# 34849 "parsing/parser.ml" +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 28022 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28607 "parsing/parser.ml" +||||||| 04da777f7 +# 28602 "parsing/parser.ml" +======= +# 28592 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2645 "parsing/parser.mly" +||||||| 04da777f7 +# 2643 "parsing/parser.mly" +======= +# 2633 "parsing/parser.mly" +>>>>>>> origin/main + ( let pat, modes = _2 in + (Nolabel, None, mkpat_with_modes modes pat) ) +<<<<<<< HEAD +# 28029 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28614 "parsing/parser.ml" +||||||| 04da777f7 +# 28609 "parsing/parser.ml" +======= +# 28599 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34858,26 +47760,73 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let x : (string Location.loc * Jane_asttypes.jkind_annotation option) = Obj.magic x in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_xs_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = -# 223 "" - ( x :: xs ) -# 34881 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28655 "parsing/parser.ml" +||||||| 04da777f7 +# 28650 "parsing/parser.ml" +======= +# 28640 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 28076 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28661 "parsing/parser.ml" +||||||| 04da777f7 +# 28656 "parsing/parser.ml" +======= +# 28646 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34889,29 +47838,95 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let s : ( -# 1135 "parsing/parser.mly" - (string * Location.t * string option) -# 34902 "parsing/parser.ml" - ) = Obj.magic s in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28116 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28701 "parsing/parser.ml" +||||||| 04da777f7 +# 28696 "parsing/parser.ml" +======= +# 28686 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_s_ in - let _endpos = _endpos_s_ in - let _v : (string list) = let x = -# 4542 "parsing/parser.mly" - ( let body, _, _ = s in body ) -# 34910 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 28128 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28713 "parsing/parser.ml" +||||||| 04da777f7 +# 28708 "parsing/parser.ml" +======= +# 28698 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 221 "" - ( [ x ] ) -# 34915 "parsing/parser.ml" +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 28134 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28719 "parsing/parser.ml" +||||||| 04da777f7 +# 28714 "parsing/parser.ml" +======= +# 28704 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34924,35 +47939,95 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let xs : (string list) = Obj.magic xs in - let s : ( -# 1135 "parsing/parser.mly" - (string * Location.t * string option) -# 34943 "parsing/parser.ml" - ) = Obj.magic s in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28758 "parsing/parser.ml" +||||||| 04da777f7 +# 28753 "parsing/parser.ml" +======= +# 28743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_s_ in - let _endpos = _endpos_xs_ in - let _v : (string list) = let x = -# 4542 "parsing/parser.mly" - ( let body, _, _ = s in body ) -# 34951 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 28187 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28772 "parsing/parser.ml" +||||||| 04da777f7 +# 28767 "parsing/parser.ml" +======= +# 28757 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 223 "" - ( x :: xs ) -# 34956 "parsing/parser.ml" +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 28193 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28778 "parsing/parser.ml" +||||||| 04da777f7 +# 28773 "parsing/parser.ml" +======= +# 28763 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34964,25 +48039,125 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28259 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28844 "parsing/parser.ml" +||||||| 04da777f7 +# 28839 "parsing/parser.ml" +======= +# 28829 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_ty_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4571 "parsing/parser.mly" - ( Public ) -# 34981 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 28275 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28860 "parsing/parser.ml" +||||||| 04da777f7 +# 28855 "parsing/parser.ml" +======= +# 28845 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 3697 "parsing/parser.mly" - ( (Ptype_abstract, priv, Some ty) ) -# 34986 "parsing/parser.ml" +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 28281 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28866 "parsing/parser.ml" +||||||| 04da777f7 +# 28861 "parsing/parser.ml" +======= +# 28851 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34995,122 +48170,92 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_ty_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4572 "parsing/parser.mly" - ( Private ) -# 35018 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28322 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28907 "parsing/parser.ml" +||||||| 04da777f7 +# 28902 "parsing/parser.ml" +======= +# 28892 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28328 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28913 "parsing/parser.ml" +||||||| 04da777f7 +# 28908 "parsing/parser.ml" in -# 3697 "parsing/parser.mly" - ( (Ptype_abstract, priv, Some ty) ) -# 35023 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_cs_ in - let _endpos = _endpos_cs_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4571 "parsing/parser.mly" - ( Public ) -# 35048 "parsing/parser.ml" - in - let oty = - let _1 = -# 124 "" - ( None ) -# 35054 "parsing/parser.ml" - in - -# 3713 "parsing/parser.mly" - ( _1 ) -# 35059 "parsing/parser.ml" - - in - -# 3701 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 35065 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_cs_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4572 "parsing/parser.mly" - ( Private ) -# 35097 "parsing/parser.ml" - in - let oty = - let _1 = -# 124 "" - ( None ) -# 35103 "parsing/parser.ml" - in - -# 3713 "parsing/parser.mly" - ( _1 ) -# 35108 "parsing/parser.ml" - - in - -# 3701 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 35114 "parsing/parser.ml" +# 3560 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 28913 "parsing/parser.ml" +======= +# 28898 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28333 "parsing/parser.ml" +======= +# 28903 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 3562 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 28918 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35123,57 +48268,113 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28373 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28958 "parsing/parser.ml" +||||||| 04da777f7 +# 28953 "parsing/parser.ml" +======= +# 28943 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_cs_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4571 "parsing/parser.mly" - ( Public ) -# 35153 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 191 "" - ( x ) -# 35160 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 35165 "parsing/parser.ml" - - in - -# 3713 "parsing/parser.mly" - ( _1 ) -# 35171 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 28385 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28970 "parsing/parser.ml" +||||||| 04da777f7 +# 28965 "parsing/parser.ml" +======= +# 28955 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28391 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 28976 "parsing/parser.ml" +||||||| 04da777f7 +# 28971 "parsing/parser.ml" + in -# 3701 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 35177 "parsing/parser.ml" +# 3560 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 28976 "parsing/parser.ml" +======= +# 28961 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28396 "parsing/parser.ml" +======= +# 28966 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 3562 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 28981 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35186,14 +48387,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -35201,91 +48402,99 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in - let _1 : unit = Obj.magic _1 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28435 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29020 "parsing/parser.ml" +||||||| 04da777f7 +# 29015 "parsing/parser.ml" +======= +# 29005 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_cs_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4572 "parsing/parser.mly" - ( Private ) -# 35223 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 191 "" - ( x ) -# 35230 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 35235 "parsing/parser.ml" - - in - -# 3713 "parsing/parser.mly" - ( _1 ) -# 35241 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 28449 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29034 "parsing/parser.ml" +||||||| 04da777f7 +# 29029 "parsing/parser.ml" +======= +# 29019 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28455 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29040 "parsing/parser.ml" +||||||| 04da777f7 +# 29035 "parsing/parser.ml" + in -# 3701 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 35247 "parsing/parser.ml" +# 3560 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29040 "parsing/parser.ml" +======= +# 29025 "parsing/parser.ml" +>>>>>>> upstream/main in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__3_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4571 "parsing/parser.mly" - ( Public ) -# 35272 "parsing/parser.ml" + +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28460 "parsing/parser.ml" +======= +# 29030 "parsing/parser.ml" +>>>>>>> origin/main in - let oty = - let _1 = -# 124 "" - ( None ) -# 35278 "parsing/parser.ml" - in - -# 3713 "parsing/parser.mly" - ( _1 ) -# 35283 "parsing/parser.ml" - - in -# 3705 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 35289 "parsing/parser.ml" +# 3562 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29045 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35298,43 +48507,143 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _1 : unit = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28526 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29111 "parsing/parser.ml" +||||||| 04da777f7 +# 29106 "parsing/parser.ml" +======= +# 29096 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4572 "parsing/parser.mly" - ( Private ) -# 35321 "parsing/parser.ml" - in - let oty = - let _1 = -# 124 "" - ( None ) -# 35327 "parsing/parser.ml" - in + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 3713 "parsing/parser.mly" - ( _1 ) -# 35332 "parsing/parser.ml" +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 28542 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29127 "parsing/parser.ml" +||||||| 04da777f7 +# 29122 "parsing/parser.ml" +======= +# 29112 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28548 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29133 "parsing/parser.ml" +||||||| 04da777f7 +# 29128 "parsing/parser.ml" + in -# 3705 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 35338 "parsing/parser.ml" +# 3560 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29133 "parsing/parser.ml" +======= +# 29118 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28553 "parsing/parser.ml" +======= +# 29123 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 3562 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29138 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35347,57 +48656,118 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28595 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29180 "parsing/parser.ml" +||||||| 04da777f7 +# 29175 "parsing/parser.ml" +======= +# 29165 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4571 "parsing/parser.mly" - ( Public ) -# 35377 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 191 "" - ( x ) -# 35384 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 35389 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in -# 3713 "parsing/parser.mly" - ( _1 ) -# 35395 "parsing/parser.ml" +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28605 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29190 "parsing/parser.ml" +||||||| 04da777f7 +# 29185 "parsing/parser.ml" +======= +# 29175 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 28613 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29198 "parsing/parser.ml" +||||||| 04da777f7 +# 29193 "parsing/parser.ml" +======= +# 29183 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3705 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 35401 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28619 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29204 "parsing/parser.ml" +||||||| 04da777f7 +# 29199 "parsing/parser.ml" +======= +# 29189 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35410,64 +48780,139 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _1 : unit = Obj.magic _1 in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28665 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29250 "parsing/parser.ml" +||||||| 04da777f7 +# 29245 "parsing/parser.ml" +======= +# 29235 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28672 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29257 "parsing/parser.ml" +||||||| 04da777f7 +# 29252 "parsing/parser.ml" +======= +# 29242 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4572 "parsing/parser.mly" - ( Private ) -# 35447 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 191 "" - ( x ) -# 35454 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 35459 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined2_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in -# 3713 "parsing/parser.mly" - ( _1 ) -# 35465 "parsing/parser.ml" +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 28682 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29267 "parsing/parser.ml" +||||||| 04da777f7 +# 29262 "parsing/parser.ml" +======= +# 29252 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 28690 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29275 "parsing/parser.ml" +||||||| 04da777f7 +# 29270 "parsing/parser.ml" +======= +# 29260 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3705 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 35471 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28696 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29281 "parsing/parser.ml" +||||||| 04da777f7 +# 29276 "parsing/parser.ml" +======= +# 29266 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35480,50 +48925,140 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28741 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29326 "parsing/parser.ml" +||||||| 04da777f7 +# 29321 "parsing/parser.ml" +======= +# 29311 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28749 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29334 "parsing/parser.ml" +||||||| 04da777f7 +# 29329 "parsing/parser.ml" +======= +# 29319 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__3_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4571 "parsing/parser.mly" - ( Public ) -# 35510 "parsing/parser.ml" - in - let oty = - let _1 = -# 124 "" - ( None ) -# 35516 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 28760 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29345 "parsing/parser.ml" +||||||| 04da777f7 +# 29340 "parsing/parser.ml" +======= +# 29330 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main -# 3713 "parsing/parser.mly" - ( _1 ) -# 35521 "parsing/parser.ml" + in + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 28768 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29353 "parsing/parser.ml" +||||||| 04da777f7 +# 29348 "parsing/parser.ml" +======= +# 29338 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3709 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 35527 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29359 "parsing/parser.ml" +||||||| 04da777f7 +# 29354 "parsing/parser.ml" +======= +# 29344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35536,57 +49071,169 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in - let _1 : unit = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28846 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29431 "parsing/parser.ml" +||||||| 04da777f7 +# 29426 "parsing/parser.ml" +======= +# 29416 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29440 "parsing/parser.ml" +||||||| 04da777f7 +# 29435 "parsing/parser.ml" +======= +# 29425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4572 "parsing/parser.mly" - ( Private ) -# 35573 "parsing/parser.ml" - in - let oty = - let _1 = -# 124 "" - ( None ) -# 35579 "parsing/parser.ml" - in + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 3713 "parsing/parser.mly" - ( _1 ) -# 35584 "parsing/parser.ml" +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 28867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29452 "parsing/parser.ml" +||||||| 04da777f7 +# 29447 "parsing/parser.ml" +======= +# 29437 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - -# 3709 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 35590 "parsing/parser.ml" + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 28875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29460 "parsing/parser.ml" +||||||| 04da777f7 +# 29455 "parsing/parser.ml" +======= +# 29445 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 28881 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29466 "parsing/parser.ml" +||||||| 04da777f7 +# 29461 "parsing/parser.ml" +======= +# 29451 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35599,71 +49246,78 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 28922 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29507 "parsing/parser.ml" +||||||| 04da777f7 +# 29502 "parsing/parser.ml" +======= +# 29492 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4571 "parsing/parser.mly" - ( Public ) -# 35643 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 191 "" - ( x ) -# 35650 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 35655 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in -# 3713 "parsing/parser.mly" - ( _1 ) -# 35661 "parsing/parser.ml" +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 28933 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3539 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 28942 "parsing/parser.ml" in -# 3709 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 35667 "parsing/parser.ml" +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 28948 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35676,78 +49330,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in - let _1 : unit = Obj.magic _1 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +# 28994 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 29000 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 4572 "parsing/parser.mly" - ( Private ) -# 35727 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 191 "" - ( x ) -# 35734 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 35739 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in -# 3713 "parsing/parser.mly" - ( _1 ) -# 35745 "parsing/parser.ml" +# 3525 "parsing/parser.mly" + ( Some _1, _2 ) +# 29011 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3539 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 29020 "parsing/parser.ml" in -# 3709 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 35751 "parsing/parser.ml" +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29026 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35760,24 +49408,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -35789,48 +49437,45 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let me : (Parsetree.module_expr) = Obj.magic me in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +# 29071 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 29078 "parsing/parser.ml" + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (Parsetree.open_declaration * string Location.loc option) = let attrs2 = - let _1 = _1_inlined2 in + let _endpos = _endpos_label_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 4722 "parsing/parser.mly" - ( _1 ) -# 35806 "parsing/parser.ml" +# 3527 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 29091 "parsing/parser.ml" in - let _endpos_attrs2_ = _endpos__1_inlined2_ in - let attrs1 = - let _1 = _1_inlined1 in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 35815 "parsing/parser.ml" +# 3539 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 29100 "parsing/parser.ml" in - let override = -# 4627 "parsing/parser.mly" - ( Fresh ) -# 35821 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1997 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk me ~override ~attrs ~loc ~docs, ext - ) -# 35834 "parsing/parser.ml" +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29106 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35843,84 +49488,103 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let me : (Parsetree.module_expr) = Obj.magic me in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let ext : (string Location.loc option) = Obj.magic ext in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +# 29178 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 29186 "parsing/parser.ml" + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.open_declaration * string Location.loc option) = let attrs2 = - let _1 = _1_inlined3 in + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 4722 "parsing/parser.mly" - ( _1 ) -# 35896 "parsing/parser.ml" +# 3530 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 29200 "parsing/parser.ml" in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let attrs1 = - let _1 = _1_inlined2 in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 35905 "parsing/parser.ml" +# 3539 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 29209 "parsing/parser.ml" in - let override = -# 4628 "parsing/parser.mly" - ( Override ) -# 35911 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1997 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk me ~override ~attrs ~loc ~docs, ext - ) -# 35924 "parsing/parser.ml" +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29215 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35933,88 +49597,93 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 29283 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.open_description * string Location.loc option) = let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 35979 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 35991 "parsing/parser.ml" +# 3523 "parsing/parser.mly" + ( None, _1 ) +# 29295 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 35999 "parsing/parser.ml" +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +# 29308 "parsing/parser.ml" in - let override = -# 4627 "parsing/parser.mly" - ( Fresh ) -# 36005 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2012 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk id ~override ~attrs ~loc ~docs, ext - ) -# 36018 "parsing/parser.ml" +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29314 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36027,182 +49696,104 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +# 29384 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 29393 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : (Parsetree.open_description * string Location.loc option) = let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 36080 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__2_inlined2_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 36092 "parsing/parser.ml" +# 3525 "parsing/parser.mly" + ( Some _1, _2 ) +# 29405 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined2 in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 36100 "parsing/parser.ml" +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +# 29418 "parsing/parser.ml" in - let override = -# 4628 "parsing/parser.mly" - ( Override ) -# 36106 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2012 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk id ~override ~attrs ~loc ~docs, ext - ) -# 36119 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1120 "parsing/parser.mly" - (string) -# 36140 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4409 "parsing/parser.mly" - ( _1 ) -# 36148 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1074 "parsing/parser.mly" - (string) -# 36169 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4410 "parsing/parser.mly" - ( _1 ) -# 36177 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1075 "parsing/parser.mly" - (string) -# 36198 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4411 "parsing/parser.mly" - ( _1 ) -# 36206 "parsing/parser.ml" +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 29424 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36215,44 +49806,120 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +# 29493 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1073 "parsing/parser.mly" + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36248 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (string) = -# 4412 "parsing/parser.mly" - ( "."^ _1 ^"(" ^ _3 ^ ")" ) -# 36256 "parsing/parser.ml" +# 29503 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 29518 "parsing/parser.ml" +||||||| 04da777f7 +# 29513 "parsing/parser.ml" +======= +# 29503 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 29527 "parsing/parser.ml" +||||||| 04da777f7 +# 29522 "parsing/parser.ml" +======= +# 29512 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 29533 "parsing/parser.ml" +||||||| 04da777f7 +# 29528 "parsing/parser.ml" +======= +# 29518 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36265,24 +49932,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -36294,22 +49961,91 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 29579 "parsing/parser.ml" +||||||| 04da777f7 +# 29574 "parsing/parser.ml" +======= +# 29564 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1073 "parsing/parser.mly" + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36305 "parsing/parser.ml" - ) = Obj.magic _1 in +<<<<<<< HEAD +# 29585 "parsing/parser.ml" +||||||| 04da777f7 +# 29580 "parsing/parser.ml" +======= +# 29570 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (string) = -# 4413 "parsing/parser.mly" - ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) -# 36313 "parsing/parser.ml" + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 29596 "parsing/parser.ml" +||||||| 04da777f7 +# 29591 "parsing/parser.ml" +======= +# 29581 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 29605 "parsing/parser.ml" +||||||| 04da777f7 +# 29600 "parsing/parser.ml" +======= +# 29590 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 29611 "parsing/parser.ml" +||||||| 04da777f7 +# 29606 "parsing/parser.ml" +======= +# 29596 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36322,44 +50058,122 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 29656 "parsing/parser.ml" +||||||| 04da777f7 +# 29651 "parsing/parser.ml" +======= +# 29641 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1073 "parsing/parser.mly" + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36355 "parsing/parser.ml" - ) = Obj.magic _1 in +<<<<<<< HEAD +# 29663 "parsing/parser.ml" +||||||| 04da777f7 +# 29658 "parsing/parser.ml" +======= +# 29648 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (string) = -# 4414 "parsing/parser.mly" - ( "."^ _1 ^"[" ^ _3 ^ "]" ) -# 36363 "parsing/parser.ml" + let _endpos = _endpos_label_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 29676 "parsing/parser.ml" +||||||| 04da777f7 +# 29671 "parsing/parser.ml" +======= +# 29661 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 29685 "parsing/parser.ml" +||||||| 04da777f7 +# 29680 "parsing/parser.ml" +======= +# 29670 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 29691 "parsing/parser.ml" +||||||| 04da777f7 +# 29686 "parsing/parser.ml" +======= +# 29676 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36372,51 +50186,151 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 29763 "parsing/parser.ml" +||||||| 04da777f7 +# 29758 "parsing/parser.ml" +======= +# 29748 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label_inlined1 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1073 "parsing/parser.mly" + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36412 "parsing/parser.ml" - ) = Obj.magic _1 in +<<<<<<< HEAD +# 29771 "parsing/parser.ml" +||||||| 04da777f7 +# 29766 "parsing/parser.ml" +======= +# 29756 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (string) = -# 4415 "parsing/parser.mly" - ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) -# 36420 "parsing/parser.ml" + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 29785 "parsing/parser.ml" +||||||| 04da777f7 +# 29780 "parsing/parser.ml" +======= +# 29770 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 29794 "parsing/parser.ml" +||||||| 04da777f7 +# 29789 "parsing/parser.ml" +======= +# 29779 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 29800 "parsing/parser.ml" +||||||| 04da777f7 +# 29795 "parsing/parser.ml" +======= +# 29785 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36429,44 +50343,137 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1073 "parsing/parser.mly" + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36462 "parsing/parser.ml" - ) = Obj.magic _1 in +<<<<<<< HEAD +# 29868 "parsing/parser.ml" +||||||| 04da777f7 +# 29863 "parsing/parser.ml" +======= +# 29853 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (string) = -# 4416 "parsing/parser.mly" - ( "."^ _1 ^"{" ^ _3 ^ "}" ) -# 36470 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 29880 "parsing/parser.ml" +||||||| 04da777f7 +# 29875 "parsing/parser.ml" +======= +# 29865 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 29890 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 29885 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +# 29878 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 29896 "parsing/parser.ml" +||||||| 04da777f7 +# 29891 "parsing/parser.ml" +======= +# 29884 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36479,51 +50486,154 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 29966 "parsing/parser.ml" +||||||| 04da777f7 +# 29961 "parsing/parser.ml" +======= +# 29954 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 1073 "parsing/parser.mly" + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36519 "parsing/parser.ml" - ) = Obj.magic _1 in +<<<<<<< HEAD +# 29975 "parsing/parser.ml" +||||||| 04da777f7 +# 29970 "parsing/parser.ml" +======= +# 29963 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (string) = -# 4417 "parsing/parser.mly" - ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) -# 36527 "parsing/parser.ml" + let _endpos = _endpos__2_inlined2_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 29987 "parsing/parser.ml" +||||||| 04da777f7 +# 29982 "parsing/parser.ml" +======= +# 29975 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 29997 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 29992 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +# 29988 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30003 "parsing/parser.ml" +||||||| 04da777f7 +# 29998 "parsing/parser.ml" +======= +# 29994 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36535,24 +50645,170 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : ( -# 1132 "parsing/parser.mly" + let label_inlined1 : ( +# 1006 "parsing/parser.mly" (string) -# 36548 "parsing/parser.ml" - ) = Obj.magic _1 in +<<<<<<< HEAD +# 30072 "parsing/parser.ml" +||||||| 04da777f7 +# 30067 "parsing/parser.ml" +======= +# 30063 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30082 "parsing/parser.ml" +||||||| 04da777f7 +# 30077 "parsing/parser.ml" +======= +# 30073 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4418 "parsing/parser.mly" - ( _1 ) -# 36556 "parsing/parser.ml" + let _endpos = _endpos_label_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 29517 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30096 "parsing/parser.ml" +||||||| 04da777f7 +# 30091 "parsing/parser.ml" +======= +# 30087 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 30106 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 30101 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +<<<<<<< HEAD +# 29530 "parsing/parser.ml" +======= +# 30100 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 29536 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30112 "parsing/parser.ml" +||||||| 04da777f7 +# 30107 "parsing/parser.ml" +======= +# 30106 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36564,20 +50820,206 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6_inlined1; + MenhirLib.EngineTypes.startp = _startpos__6_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__6_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_cty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_cty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4_inlined1; + MenhirLib.EngineTypes.startp = _startpos__4_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__4_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in + let _6_inlined1 : unit = Obj.magic _6_inlined1 in + let cty_inlined1 : (Parsetree.core_type) = Obj.magic cty_inlined1 in + let _4_inlined1 : unit = Obj.magic _4_inlined1 in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 29632 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30208 "parsing/parser.ml" +||||||| 04da777f7 +# 30203 "parsing/parser.ml" +======= +# 30202 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label_inlined1 in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 29643 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30219 "parsing/parser.ml" +||||||| 04da777f7 +# 30214 "parsing/parser.ml" +======= +# 30213 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4419 "parsing/parser.mly" - ( "!" ) -# 36581 "parsing/parser.ml" + let _endpos = _endpos__6_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, cty, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, cty_inlined1, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 29658 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30234 "parsing/parser.ml" +||||||| 04da777f7 +# 30229 "parsing/parser.ml" +======= +# 30228 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 30244 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 30239 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +<<<<<<< HEAD +# 29671 "parsing/parser.ml" +======= +# 30241 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 29677 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30250 "parsing/parser.ml" +||||||| 04da777f7 +# 30245 "parsing/parser.ml" +======= +# 30247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36589,29 +51031,51 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let op : ( -# 1068 "parsing/parser.mly" - (string) -# 36602 "parsing/parser.ml" - ) = Obj.magic op in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in - let _v : (string) = let _1 = -# 4423 "parsing/parser.mly" - ( op ) -# 36610 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : ((string option * Parsetree.pattern) list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36615 "parsing/parser.ml" +<<<<<<< HEAD +# 3564 "parsing/parser.mly" +||||||| 04da777f7 +# 3562 "parsing/parser.mly" +======= +# 3553 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__3_ "pattern" ) +<<<<<<< HEAD +# 29717 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30290 "parsing/parser.ml" +||||||| 04da777f7 +# 30285 "parsing/parser.ml" +======= +# 30287 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36623,29 +51087,74 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let op : ( -# 1069 "parsing/parser.mly" - (string) -# 36636 "parsing/parser.ml" - ) = Obj.magic op in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in - let _v : (string) = let _1 = -# 4424 "parsing/parser.mly" - ( op ) -# 36644 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 29758 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30331 "parsing/parser.ml" +||||||| 04da777f7 +# 30326 "parsing/parser.ml" +======= +# 30328 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36649 "parsing/parser.ml" +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 29764 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30337 "parsing/parser.ml" +||||||| 04da777f7 +# 30332 "parsing/parser.ml" +======= +# 30334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36657,29 +51166,95 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let op : ( -# 1070 "parsing/parser.mly" + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" (string) -# 36670 "parsing/parser.ml" - ) = Obj.magic op in +<<<<<<< HEAD +# 29804 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30377 "parsing/parser.ml" +||||||| 04da777f7 +# 30372 "parsing/parser.ml" +======= +# 30374 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in - let _v : (string) = let _1 = -# 4425 "parsing/parser.mly" - ( op ) -# 36678 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 29816 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30389 "parsing/parser.ml" +||||||| 04da777f7 +# 30384 "parsing/parser.ml" +======= +# 30386 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36683 "parsing/parser.ml" +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 29822 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30395 "parsing/parser.ml" +||||||| 04da777f7 +# 30390 "parsing/parser.ml" +======= +# 30392 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36691,29 +51266,96 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let op : ( -# 1071 "parsing/parser.mly" + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36704 "parsing/parser.ml" - ) = Obj.magic op in +<<<<<<< HEAD +# 29861 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30434 "parsing/parser.ml" +||||||| 04da777f7 +# 30429 "parsing/parser.ml" +======= +# 30431 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in - let _v : (string) = let _1 = -# 4426 "parsing/parser.mly" - ( op ) -# 36712 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 29875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30448 "parsing/parser.ml" +||||||| 04da777f7 +# 30443 "parsing/parser.ml" +======= +# 30445 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36717 "parsing/parser.ml" +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 29881 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30454 "parsing/parser.ml" +||||||| 04da777f7 +# 30449 "parsing/parser.ml" +======= +# 30451 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36725,29 +51367,125 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let op : ( -# 1072 "parsing/parser.mly" + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" (string) -# 36738 "parsing/parser.ml" - ) = Obj.magic op in +<<<<<<< HEAD +# 29947 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30520 "parsing/parser.ml" +||||||| 04da777f7 +# 30515 "parsing/parser.ml" +======= +# 30517 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in - let _v : (string) = let _1 = -# 4427 "parsing/parser.mly" - ( op ) -# 36746 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 29963 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30536 "parsing/parser.ml" +||||||| 04da777f7 +# 30531 "parsing/parser.ml" +======= +# 30533 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36751 "parsing/parser.ml" +<<<<<<< HEAD +# 3560 "parsing/parser.mly" +||||||| 04da777f7 +# 3558 "parsing/parser.mly" +======= +# 3549 "parsing/parser.mly" +>>>>>>> origin/main + ( _3 :: _1 ) +<<<<<<< HEAD +# 29969 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30542 "parsing/parser.ml" +||||||| 04da777f7 +# 30537 "parsing/parser.ml" +======= +# 30539 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36759,55 +51497,93 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4428 "parsing/parser.mly" - ("+") -# 36776 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30010 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30583 "parsing/parser.ml" +||||||| 04da777f7 +# 30578 "parsing/parser.ml" +======= +# 30580 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30016 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30589 "parsing/parser.ml" +||||||| 04da777f7 +# 30584 "parsing/parser.ml" in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36781 "parsing/parser.ml" +# 3560 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 30589 "parsing/parser.ml" +======= +# 30586 "parsing/parser.ml" +>>>>>>> upstream/main in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4429 "parsing/parser.mly" - ("+.") -# 36806 "parsing/parser.ml" + +# 3551 "parsing/parser.mly" + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30021 "parsing/parser.ml" +======= +# 30591 "parsing/parser.ml" +>>>>>>> origin/main in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36811 "parsing/parser.ml" +# 3562 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 30594 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36819,25 +51595,116 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30061 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30634 "parsing/parser.ml" +||||||| 04da777f7 +# 30629 "parsing/parser.ml" +======= +# 30631 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4430 "parsing/parser.mly" - ("+=") -# 36836 "parsing/parser.ml" - in - -# 4420 "parsing/parser.mly" - ( _1 ) -# 36841 "parsing/parser.ml" + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 30073 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30646 "parsing/parser.ml" +||||||| 04da777f7 +# 30641 "parsing/parser.ml" +======= +# 30643 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30079 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30652 "parsing/parser.ml" +||||||| 04da777f7 +# 30647 "parsing/parser.ml" +======= +# 30649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30657 "parsing/parser.ml" +||||||| 04da777f7 +# 30652 "parsing/parser.ml" +======= +# 30654 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36849,25 +51716,117 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30123 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30696 "parsing/parser.ml" +||||||| 04da777f7 +# 30691 "parsing/parser.ml" +======= +# 30693 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4431 "parsing/parser.mly" - ("-") -# 36866 "parsing/parser.ml" + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 30137 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30710 "parsing/parser.ml" +||||||| 04da777f7 +# 30705 "parsing/parser.ml" +======= +# 30707 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30143 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30716 "parsing/parser.ml" +||||||| 04da777f7 +# 30711 "parsing/parser.ml" +======= +# 30713 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36871 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30148 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30721 "parsing/parser.ml" +||||||| 04da777f7 +# 30716 "parsing/parser.ml" +======= +# 30718 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36879,25 +51838,146 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30214 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30787 "parsing/parser.ml" +||||||| 04da777f7 +# 30782 "parsing/parser.ml" +======= +# 30784 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4432 "parsing/parser.mly" - ("-.") -# 36896 "parsing/parser.ml" + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 30230 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30803 "parsing/parser.ml" +||||||| 04da777f7 +# 30798 "parsing/parser.ml" +======= +# 30800 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30236 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30809 "parsing/parser.ml" +||||||| 04da777f7 +# 30804 "parsing/parser.ml" +======= +# 30806 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36901 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30241 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30814 "parsing/parser.ml" +||||||| 04da777f7 +# 30809 "parsing/parser.ml" +======= +# 30811 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36909,25 +51989,119 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30283 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30856 "parsing/parser.ml" +||||||| 04da777f7 +# 30851 "parsing/parser.ml" +======= +# 30853 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4433 "parsing/parser.mly" - ("*") -# 36926 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30293 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30866 "parsing/parser.ml" +||||||| 04da777f7 +# 30861 "parsing/parser.ml" +======= +# 30863 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 30301 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30874 "parsing/parser.ml" +||||||| 04da777f7 +# 30869 "parsing/parser.ml" +======= +# 30871 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36931 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30307 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30880 "parsing/parser.ml" +||||||| 04da777f7 +# 30875 "parsing/parser.ml" +======= +# 30877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36939,25 +52113,140 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30353 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30926 "parsing/parser.ml" +||||||| 04da777f7 +# 30921 "parsing/parser.ml" +======= +# 30923 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30360 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30933 "parsing/parser.ml" +||||||| 04da777f7 +# 30928 "parsing/parser.ml" +======= +# 30930 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4434 "parsing/parser.mly" - ("%") -# 36956 "parsing/parser.ml" - in - -# 4420 "parsing/parser.mly" - ( _1 ) -# 36961 "parsing/parser.ml" + let _endpos = _endpos__2_inlined2_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 30370 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30943 "parsing/parser.ml" +||||||| 04da777f7 +# 30938 "parsing/parser.ml" +======= +# 30940 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 30378 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30951 "parsing/parser.ml" +||||||| 04da777f7 +# 30946 "parsing/parser.ml" +======= +# 30948 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30384 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 30957 "parsing/parser.ml" +||||||| 04da777f7 +# 30952 "parsing/parser.ml" +======= +# 30954 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36969,25 +52258,141 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30429 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31002 "parsing/parser.ml" +||||||| 04da777f7 +# 30997 "parsing/parser.ml" +======= +# 30999 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30437 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31010 "parsing/parser.ml" +||||||| 04da777f7 +# 31005 "parsing/parser.ml" +======= +# 31007 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4435 "parsing/parser.mly" - ("=") -# 36986 "parsing/parser.ml" - in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 30448 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31021 "parsing/parser.ml" +||||||| 04da777f7 +# 31016 "parsing/parser.ml" +======= +# 31018 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 30456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31029 "parsing/parser.ml" +||||||| 04da777f7 +# 31024 "parsing/parser.ml" +======= +# 31026 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 36991 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30462 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31035 "parsing/parser.ml" +||||||| 04da777f7 +# 31030 "parsing/parser.ml" +======= +# 31032 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36999,25 +52404,170 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31107 "parsing/parser.ml" +||||||| 04da777f7 +# 31102 "parsing/parser.ml" +======= +# 31104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30543 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31116 "parsing/parser.ml" +||||||| 04da777f7 +# 31111 "parsing/parser.ml" +======= +# 31113 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4436 "parsing/parser.mly" - ("<") -# 37016 "parsing/parser.ml" - in + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 30555 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31128 "parsing/parser.ml" +||||||| 04da777f7 +# 31123 "parsing/parser.ml" +======= +# 31125 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 30563 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31136 "parsing/parser.ml" +||||||| 04da777f7 +# 31131 "parsing/parser.ml" +======= +# 31133 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 37021 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31142 "parsing/parser.ml" +||||||| 04da777f7 +# 31137 "parsing/parser.ml" +======= +# 31139 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37029,25 +52579,120 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30610 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31183 "parsing/parser.ml" +||||||| 04da777f7 +# 31178 "parsing/parser.ml" +======= +# 31180 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4437 "parsing/parser.mly" - (">") -# 37046 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30621 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31194 "parsing/parser.ml" +||||||| 04da777f7 +# 31189 "parsing/parser.ml" +======= +# 31191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 30630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31203 "parsing/parser.ml" +||||||| 04da777f7 +# 31198 "parsing/parser.ml" +======= +# 31200 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 37051 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30636 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31209 "parsing/parser.ml" +||||||| 04da777f7 +# 31204 "parsing/parser.ml" +======= +# 31206 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37059,55 +52704,141 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4438 "parsing/parser.mly" - ("or") -# 37076 "parsing/parser.ml" - in - -# 4420 "parsing/parser.mly" - ( _1 ) -# 37081 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30682 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31255 "parsing/parser.ml" +||||||| 04da777f7 +# 31250 "parsing/parser.ml" +======= +# 31252 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30688 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31261 "parsing/parser.ml" +||||||| 04da777f7 +# 31256 "parsing/parser.ml" +======= +# 31258 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4439 "parsing/parser.mly" - ("||") -# 37106 "parsing/parser.ml" - in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 30699 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31272 "parsing/parser.ml" +||||||| 04da777f7 +# 31267 "parsing/parser.ml" +======= +# 31269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 30708 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31281 "parsing/parser.ml" +||||||| 04da777f7 +# 31276 "parsing/parser.ml" +======= +# 31278 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 37111 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30714 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31287 "parsing/parser.ml" +||||||| 04da777f7 +# 31282 "parsing/parser.ml" +======= +# 31284 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37119,25 +52850,143 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30759 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31332 "parsing/parser.ml" +||||||| 04da777f7 +# 31327 "parsing/parser.ml" +======= +# 31329 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31339 "parsing/parser.ml" +||||||| 04da777f7 +# 31334 "parsing/parser.ml" +======= +# 31336 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4440 "parsing/parser.mly" - ("&") -# 37136 "parsing/parser.ml" - in + let _endpos = _endpos_label_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 30779 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31352 "parsing/parser.ml" +||||||| 04da777f7 +# 31347 "parsing/parser.ml" +======= +# 31349 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 30788 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31361 "parsing/parser.ml" +||||||| 04da777f7 +# 31356 "parsing/parser.ml" +======= +# 31358 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 37141 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31367 "parsing/parser.ml" +||||||| 04da777f7 +# 31362 "parsing/parser.ml" +======= +# 31364 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37149,25 +52998,172 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30866 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31439 "parsing/parser.ml" +||||||| 04da777f7 +# 31434 "parsing/parser.ml" +======= +# 31436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label_inlined1 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30874 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31447 "parsing/parser.ml" +||||||| 04da777f7 +# 31442 "parsing/parser.ml" +======= +# 31444 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4441 "parsing/parser.mly" - ("&&") -# 37166 "parsing/parser.ml" - in + let _endpos = _endpos__6_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 30888 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31461 "parsing/parser.ml" +||||||| 04da777f7 +# 31456 "parsing/parser.ml" +======= +# 31458 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 30897 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31470 "parsing/parser.ml" +||||||| 04da777f7 +# 31465 "parsing/parser.ml" +======= +# 31467 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 37171 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 30903 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31476 "parsing/parser.ml" +||||||| 04da777f7 +# 31471 "parsing/parser.ml" +======= +# 31473 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37179,25 +53175,144 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 30971 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31544 "parsing/parser.ml" +||||||| 04da777f7 +# 31539 "parsing/parser.ml" +======= +# 31541 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = let _1 = -# 4442 "parsing/parser.mly" - (":=") -# 37196 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3535 "parsing/parser.mly" +||||||| 04da777f7 +# 3533 "parsing/parser.mly" +======= +# 3523 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 30983 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31556 "parsing/parser.ml" +||||||| 04da777f7 +# 31551 "parsing/parser.ml" +======= +# 31553 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31566 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31561 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +<<<<<<< HEAD +# 30996 "parsing/parser.ml" +======= +# 31566 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4420 "parsing/parser.mly" - ( _1 ) -# 37201 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +# 31002 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37209,56 +53324,145 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +# 31072 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 31081 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (bool) = -# 4307 "parsing/parser.mly" - ( true ) -# 37226 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (bool) = -# 4308 "parsing/parser.mly" - ( false ) -# 37244 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (unit option) = -# 114 "" - ( None ) -# 37262 "parsing/parser.ml" + let _endpos = _endpos__2_inlined2_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in + +<<<<<<< HEAD +# 3537 "parsing/parser.mly" +||||||| 04da777f7 +# 3535 "parsing/parser.mly" +======= +# 3525 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +# 31093 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31673 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31668 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +<<<<<<< HEAD +# 31106 "parsing/parser.ml" +======= +# 31676 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 31112 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31679 "parsing/parser.ml" +||||||| 04da777f7 +# 31674 "parsing/parser.ml" +======= +# 31682 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37270,124 +53474,177 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let x : unit = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (unit option) = -# 116 "" - ( Some x ) -# 37287 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let label_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 31181 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31748 "parsing/parser.ml" +||||||| 04da777f7 +# 31743 "parsing/parser.ml" +======= +# 31751 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 31191 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31758 "parsing/parser.ml" +||||||| 04da777f7 +# 31753 "parsing/parser.ml" +======= +# 31761 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (unit option) = -# 114 "" - ( None ) -# 37305 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : unit = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (unit option) = -# 116 "" - ( Some x ) -# 37330 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.attribute option) = -# 114 "" - ( None ) -# 37348 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : (Parsetree.attribute) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.attribute option) = -# 116 "" - ( Some x ) -# 37373 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (string Location.loc option) = -# 114 "" - ( None ) -# 37391 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3539 "parsing/parser.mly" +||||||| 04da777f7 +# 3537 "parsing/parser.mly" +======= +# 3527 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 31205 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31772 "parsing/parser.ml" +||||||| 04da777f7 +# 31767 "parsing/parser.ml" +======= +# 31775 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31782 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31777 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +<<<<<<< HEAD +# 31218 "parsing/parser.ml" +======= +# 31788 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 31224 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31788 "parsing/parser.ml" +||||||| 04da777f7 +# 31783 "parsing/parser.ml" +======= +# 31794 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37400,48 +53657,227 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _6_inlined1; + MenhirLib.EngineTypes.startp = _startpos__6_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__6_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_cty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_cty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4_inlined1; + MenhirLib.EngineTypes.startp = _startpos__4_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__4_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _1_inlined1 : ( -# 1094 "parsing/parser.mly" + let _6_inlined1 : unit = Obj.magic _6_inlined1 in + let cty_inlined1 : (Parsetree.core_type) = Obj.magic cty_inlined1 in + let _4_inlined1 : unit = Obj.magic _4_inlined1 in + let label_inlined1 : ( +<<<<<<< HEAD +# 1016 "parsing/parser.mly" (string) -# 37418 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in +<<<<<<< HEAD +# 31320 "parsing/parser.ml" +======= +# 31884 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1016 "parsing/parser.mly" +||||||| 04da777f7 +# 1016 "parsing/parser.mly" + (string) +# 31879 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1016 "parsing/parser.mly" +======= +# 1006 "parsing/parser.mly" +>>>>>>> origin/main + (string) +<<<<<<< HEAD +# 31895 "parsing/parser.ml" +||||||| 04da777f7 +# 31890 "parsing/parser.ml" +======= +# 31890 "parsing/parser.ml" +>>>>>>> upstream/main + ) = Obj.magic label_inlined1 in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 31331 "parsing/parser.ml" +======= +# 31901 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (string Location.loc option) = let x = - let x = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 37433 "parsing/parser.ml" - - in + let _endpos = _endpos__6_inlined1_ in + let _v : ((string option * Parsetree.pattern) list) = let _3 = + let (_endpos_label_, _startpos_label_, cty, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, cty_inlined1, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 183 "" - ( x ) -# 37439 "parsing/parser.ml" +<<<<<<< HEAD +# 3542 "parsing/parser.mly" +||||||| 04da777f7 +# 3540 "parsing/parser.mly" +======= +# 3530 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +<<<<<<< HEAD +# 31346 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31910 "parsing/parser.ml" +||||||| 04da777f7 +# 31905 "parsing/parser.ml" +======= +# 31916 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31920 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 31915 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +<<<<<<< HEAD +# 31359 "parsing/parser.ml" +======= +# 31929 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 116 "" - ( Some x ) -# 37445 "parsing/parser.ml" +<<<<<<< HEAD +# 3562 "parsing/parser.mly" +||||||| 04da777f7 +# 3560 "parsing/parser.mly" +======= +# 3551 "parsing/parser.mly" +>>>>>>> origin/main + ( [ _3; _1 ] ) +<<<<<<< HEAD +# 31365 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31926 "parsing/parser.ml" +||||||| 04da777f7 +# 31921 "parsing/parser.ml" +======= +# 31935 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37452,14 +53888,52 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.core_type option) = -# 114 "" - ( None ) -# 37463 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : ((string option * Parsetree.pattern) list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3564 "parsing/parser.mly" +||||||| 04da777f7 +# 3562 "parsing/parser.mly" +======= +# 3553 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__3_ "pattern" ) +<<<<<<< HEAD +# 31405 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31966 "parsing/parser.ml" +||||||| 04da777f7 +# 31961 "parsing/parser.ml" +======= +# 31975 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37471,32 +53945,39 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type option) = let x = -# 183 "" - ( x ) -# 37495 "parsing/parser.ml" - in - -# 116 "" - ( Some x ) -# 37500 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : ((Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) * + Parsetree.attribute list) = +<<<<<<< HEAD +# 3167 "parsing/parser.mly" +||||||| 04da777f7 +# 3165 "parsing/parser.mly" +======= +# 3155 "parsing/parser.mly" +>>>>>>> origin/main + ( let p,e,c,attrs = _1 in (p,e,c,false), attrs ) +<<<<<<< HEAD +# 31433 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 31994 "parsing/parser.ml" +||||||| 04da777f7 +# 31989 "parsing/parser.ml" +======= +# 32003 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37507,14 +53988,40 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.core_type option) = -# 114 "" - ( None ) -# 37518 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : ((Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) * + Parsetree.attribute list) = let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +<<<<<<< HEAD +# 3170 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1, None, true), [] ) +# 32024 "parsing/parser.ml" +||||||| 04da777f7 +# 3168 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1, None, true), [] ) +# 32019 "parsing/parser.ml" +======= +# 3158 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, ghexpvar ~loc:_loc _1, None, true), [] ) +<<<<<<< HEAD +# 31463 "parsing/parser.ml" +======= +# 32033 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37527,9 +54034,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -37538,38 +54045,82 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type option) = let x = -# 183 "" - ( x ) -# 37550 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3249 "parsing/parser.mly" +||||||| 04da777f7 +# 3247 "parsing/parser.mly" +======= +# 3237 "parsing/parser.mly" +>>>>>>> origin/main + (_1 Mode.empty) +<<<<<<< HEAD +# 31498 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32059 "parsing/parser.ml" +||||||| 04da777f7 +# 32054 "parsing/parser.ml" +======= +# 32068 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 31508 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32069 "parsing/parser.ml" +||||||| 04da777f7 +# 32064 "parsing/parser.ml" +======= +# 32078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 116 "" - ( Some x ) -# 37555 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.expression option) = -# 114 "" - ( None ) -# 37573 "parsing/parser.ml" +<<<<<<< HEAD +# 3091 "parsing/parser.mly" +||||||| 04da777f7 +# 3089 "parsing/parser.mly" +======= +# 3079 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _2, None, []) ) +<<<<<<< HEAD +# 31514 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32075 "parsing/parser.ml" +||||||| 04da777f7 +# 32070 "parsing/parser.ml" +======= +# 32084 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37582,46 +54133,198 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (N_ary.type_constraint) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.expression option) = let x = - let x = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 37608 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _3 = + let _1 = _1_inlined1 in + let _1 = + let _2 = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 31564 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 32125 "parsing/parser.ml" +||||||| 04da777f7 +# 32120 "parsing/parser.ml" +======= +# 32134 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2823 "parsing/parser.mly" - ( _1 ) -# 37613 "parsing/parser.ml" +<<<<<<< HEAD +# 3441 "parsing/parser.mly" +||||||| 04da777f7 +# 3439 "parsing/parser.mly" +======= +# 3429 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 31569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32130 "parsing/parser.ml" +||||||| 04da777f7 +# 32125 "parsing/parser.ml" +======= +# 32139 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 183 "" - ( x ) -# 37619 "parsing/parser.ml" +<<<<<<< HEAD +# 3446 "parsing/parser.mly" +||||||| 04da777f7 +# 3444 "parsing/parser.mly" +======= +# 3434 "parsing/parser.mly" +>>>>>>> origin/main + ( let ty, modes = _1 in + Some ty, modes ) +<<<<<<< HEAD +# 31576 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32137 "parsing/parser.ml" +||||||| 04da777f7 +# 32132 "parsing/parser.ml" +======= +# 32146 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 31586 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32147 "parsing/parser.ml" +||||||| 04da777f7 +# 32142 "parsing/parser.ml" +======= +# 32156 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos__2_ = _startpos__1_ in + let modes0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 31593 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 32154 "parsing/parser.ml" +||||||| 04da777f7 +# 32149 "parsing/parser.ml" +======= +# 32163 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 116 "" - ( Some x ) -# 37625 "parsing/parser.ml" +<<<<<<< HEAD +# 3095 "parsing/parser.mly" +||||||| 04da777f7 +# 3093 "parsing/parser.mly" +======= +# 3083 "parsing/parser.mly" +>>>>>>> origin/main + ( let v = _2 in (* PR#7344 *) + let typ, modes1 = _3 in + let t = + Option.map (function + | N_ary.Pconstraint t -> + Pvc_constraint { locally_abstract_univars = []; typ=t } + | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + ) typ + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _5 in + (v, exp, t, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 31618 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32179 "parsing/parser.ml" +||||||| 04da777f7 +# 32174 "parsing/parser.ml" +======= +# 32188 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37634,14 +54337,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined2; @@ -37663,101 +54366,179 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (N_ary.type_constraint) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression option) = let x = - let x = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 37684 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 37689 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 37695 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 37706 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 37712 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _1 = + let _2 = + let _1 = _1_inlined1 in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 37725 "parsing/parser.ml" +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 31677 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 32238 "parsing/parser.ml" +||||||| 04da777f7 +# 32233 "parsing/parser.ml" +======= +# 32247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2823 "parsing/parser.mly" - ( _1 ) -# 37731 "parsing/parser.ml" +<<<<<<< HEAD +# 3441 "parsing/parser.mly" +||||||| 04da777f7 +# 3439 "parsing/parser.mly" +======= +# 3429 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 31683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32244 "parsing/parser.ml" +||||||| 04da777f7 +# 32239 "parsing/parser.ml" +======= +# 32253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 183 "" - ( x ) -# 37737 "parsing/parser.ml" +<<<<<<< HEAD +# 3446 "parsing/parser.mly" +||||||| 04da777f7 +# 3444 "parsing/parser.mly" +======= +# 3434 "parsing/parser.mly" +>>>>>>> origin/main + ( let ty, modes = _1 in + Some ty, modes ) +<<<<<<< HEAD +# 31690 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32251 "parsing/parser.ml" +||||||| 04da777f7 +# 32246 "parsing/parser.ml" +======= +# 32260 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 31700 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32261 "parsing/parser.ml" +||||||| 04da777f7 +# 32256 "parsing/parser.ml" +======= +# 32270 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos__2_ = _startpos__1_ in + let modes0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 31707 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 32268 "parsing/parser.ml" +||||||| 04da777f7 +# 32263 "parsing/parser.ml" +======= +# 32277 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 116 "" - ( Some x ) -# 37743 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.module_type option) = -# 114 "" - ( None ) -# 37761 "parsing/parser.ml" +<<<<<<< HEAD +# 3095 "parsing/parser.mly" +||||||| 04da777f7 +# 3093 "parsing/parser.mly" +======= +# 3083 "parsing/parser.mly" +>>>>>>> origin/main + ( let v = _2 in (* PR#7344 *) + let typ, modes1 = _3 in + let t = + Option.map (function + | N_ary.Pconstraint t -> + Pvc_constraint { locally_abstract_univars = []; typ=t } + | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + ) typ + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _5 in + (v, exp, t, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 31732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32293 "parsing/parser.ml" +||||||| 04da777f7 +# 32288 "parsing/parser.ml" +======= +# 32302 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37770,213 +54551,151 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let x : (Parsetree.module_type) = Obj.magic x in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.module_type option) = let x = -# 183 "" - ( x ) -# 37793 "parsing/parser.ml" - in - -# 116 "" - ( Some x ) -# 37798 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.pattern option) = -# 114 "" - ( None ) -# 37816 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let x : (Parsetree.pattern) = Obj.magic x in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.pattern option) = let x = -# 183 "" - ( x ) -# 37848 "parsing/parser.ml" - in - -# 116 "" - ( Some x ) -# 37853 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.expression option) = -# 114 "" - ( None ) -# 37871 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let x : (Parsetree.expression) = Obj.magic x in - let _1 : unit = Obj.magic _1 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.expression option) = let x = -# 183 "" - ( x ) -# 37903 "parsing/parser.ml" - in + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3449 "parsing/parser.mly" +||||||| 04da777f7 +# 3447 "parsing/parser.mly" +======= +# 3437 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 31781 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32342 "parsing/parser.ml" +||||||| 04da777f7 +# 32337 "parsing/parser.ml" +======= +# 32351 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 31791 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32352 "parsing/parser.ml" +||||||| 04da777f7 +# 32347 "parsing/parser.ml" +======= +# 32361 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__2_ = _startpos__1_ in + let modes0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 31798 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 32359 "parsing/parser.ml" +||||||| 04da777f7 +# 32354 "parsing/parser.ml" +======= +# 32368 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 116 "" - ( Some x ) -# 37908 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (N_ary.type_constraint option) = -# 114 "" - ( None ) -# 37926 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : (N_ary.type_constraint) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (N_ary.type_constraint option) = -# 116 "" - ( Some x ) -# 37951 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1113 "parsing/parser.mly" - (string) -# 37972 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4639 "parsing/parser.mly" - ( _1 ) -# 37980 "parsing/parser.ml" +<<<<<<< HEAD +# 3095 "parsing/parser.mly" +||||||| 04da777f7 +# 3093 "parsing/parser.mly" +======= +# 3083 "parsing/parser.mly" +>>>>>>> origin/main + ( let v = _2 in (* PR#7344 *) + let typ, modes1 = _3 in + let t = + Option.map (function + | N_ary.Pconstraint t -> + Pvc_constraint { locally_abstract_univars = []; typ=t } + | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + ) typ + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _5 in + (v, exp, t, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 31823 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32384 "parsing/parser.ml" +||||||| 04da777f7 +# 32379 "parsing/parser.ml" +======= +# 32393 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37989,37 +54708,236 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1094 "parsing/parser.mly" - (string) -# 38014 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : (N_ary.type_constraint) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (string) = -# 4640 "parsing/parser.mly" - ( _2 ) -# 38023 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _3 = + let _1 = _1_inlined2 in + let _1 = + let _2 = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 31880 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 32441 "parsing/parser.ml" +||||||| 04da777f7 +# 32436 "parsing/parser.ml" +======= +# 32450 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3441 "parsing/parser.mly" +||||||| 04da777f7 +# 3439 "parsing/parser.mly" +======= +# 3429 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 31885 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32446 "parsing/parser.ml" +||||||| 04da777f7 +# 32441 "parsing/parser.ml" +======= +# 32455 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3446 "parsing/parser.mly" +||||||| 04da777f7 +# 3444 "parsing/parser.mly" +======= +# 3434 "parsing/parser.mly" +>>>>>>> origin/main + ( let ty, modes = _1 in + Some ty, modes ) +<<<<<<< HEAD +# 31892 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32453 "parsing/parser.ml" +||||||| 04da777f7 +# 32448 "parsing/parser.ml" +======= +# 32462 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 31903 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32464 "parsing/parser.ml" +||||||| 04da777f7 +# 32459 "parsing/parser.ml" +======= +# 32473 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let modes0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 31915 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 31921 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 32476 "parsing/parser.ml" +||||||| 04da777f7 +# 32471 "parsing/parser.ml" +======= +# 32485 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 32482 "parsing/parser.ml" +||||||| 04da777f7 +# 32477 "parsing/parser.ml" +======= +# 32491 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3095 "parsing/parser.mly" +||||||| 04da777f7 +# 3093 "parsing/parser.mly" +======= +# 3083 "parsing/parser.mly" +>>>>>>> origin/main + ( let v = _2 in (* PR#7344 *) + let typ, modes1 = _3 in + let t = + Option.map (function + | N_ary.Pconstraint t -> + Pvc_constraint { locally_abstract_univars = []; typ=t } + | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + ) typ + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _5 in + (v, exp, t, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 31947 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32508 "parsing/parser.ml" +||||||| 04da777f7 +# 32503 "parsing/parser.ml" +======= +# 32517 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38037,45 +54955,241 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _3 : unit = Obj.magic _3 in - let me : (Parsetree.module_expr) = Obj.magic me in - let _1 : unit = Obj.magic _1 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let _1_inlined2 : (N_ary.type_constraint) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _3 = + let (_1_inlined1, _1) = (_1_inlined3, _1_inlined2) in + let _1 = + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 32013 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 32574 "parsing/parser.ml" +||||||| 04da777f7 +# 32569 "parsing/parser.ml" +======= +# 32583 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3441 "parsing/parser.mly" +||||||| 04da777f7 +# 3439 "parsing/parser.mly" +======= +# 3429 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 32019 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32580 "parsing/parser.ml" +||||||| 04da777f7 +# 32575 "parsing/parser.ml" +======= +# 32589 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3446 "parsing/parser.mly" +||||||| 04da777f7 +# 3444 "parsing/parser.mly" +======= +# 3434 "parsing/parser.mly" +>>>>>>> origin/main + ( let ty, modes = _1 in + Some ty, modes ) +<<<<<<< HEAD +# 32026 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32587 "parsing/parser.ml" +||||||| 04da777f7 +# 32582 "parsing/parser.ml" +======= +# 32596 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32037 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32598 "parsing/parser.ml" +||||||| 04da777f7 +# 32593 "parsing/parser.ml" +======= +# 32607 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let modes0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 32049 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 32055 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 32610 "parsing/parser.ml" +||||||| 04da777f7 +# 32605 "parsing/parser.ml" +======= +# 32619 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 32616 "parsing/parser.ml" +||||||| 04da777f7 +# 32611 "parsing/parser.ml" +======= +# 32625 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 1757 "parsing/parser.mly" - ( mkmod ~loc:_sloc (Pmod_constraint(me, mty)) ) -# 38079 "parsing/parser.ml" +<<<<<<< HEAD +# 3095 "parsing/parser.mly" +||||||| 04da777f7 +# 3093 "parsing/parser.mly" +======= +# 3083 "parsing/parser.mly" +>>>>>>> origin/main + ( let v = _2 in (* PR#7344 *) + let typ, modes1 = _3 in + let t = + Option.map (function + | N_ary.Pconstraint t -> + Pvc_constraint { locally_abstract_univars = []; typ=t } + | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + ) typ + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _5 in + (v, exp, t, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 32081 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32642 "parsing/parser.ml" +||||||| 04da777f7 +# 32637 "parsing/parser.ml" +======= +# 32651 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38098,14 +55212,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -38117,20 +55231,160 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.module_type) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_expr) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _3 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 3449 "parsing/parser.mly" +||||||| 04da777f7 +# 3447 "parsing/parser.mly" +======= +# 3437 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 32137 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32698 "parsing/parser.ml" +||||||| 04da777f7 +# 32693 "parsing/parser.ml" +======= +# 32707 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32148 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32709 "parsing/parser.ml" +||||||| 04da777f7 +# 32704 "parsing/parser.ml" +======= +# 32718 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let modes0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 32160 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 32166 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 32721 "parsing/parser.ml" +||||||| 04da777f7 +# 32716 "parsing/parser.ml" +======= +# 32730 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 32727 "parsing/parser.ml" +||||||| 04da777f7 +# 32722 "parsing/parser.ml" +======= +# 32736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1759 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 38134 "parsing/parser.ml" +<<<<<<< HEAD +# 3095 "parsing/parser.mly" +||||||| 04da777f7 +# 3093 "parsing/parser.mly" +======= +# 3083 "parsing/parser.mly" +>>>>>>> origin/main + ( let v = _2 in (* PR#7344 *) + let typ, modes1 = _3 in + let t = + Option.map (function + | N_ary.Pconstraint t -> + Pvc_constraint { locally_abstract_univars = []; typ=t } + | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + ) typ + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _5 in + (v, exp, t, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 32192 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32753 "parsing/parser.ml" +||||||| 04da777f7 +# 32748 "parsing/parser.ml" +======= +# 32762 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38143,158 +55397,254 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let me : (Parsetree.module_expr) = Obj.magic me in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.module_expr) = -# 1762 "parsing/parser.mly" - ( me (* TODO consider reloc *) ) -# 38173 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_expr) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.module_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 1764 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 38214 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _7 : (Parsetree.expression) = Obj.magic _7 in + let _6 : unit = Obj.magic _6 in + let _3_inlined1 : (Parsetree.core_type) = Obj.magic _3_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let _1 = _1_inlined2 in - let e = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 38270 "parsing/parser.ml" - in + let _endpos = _endpos__7_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let modes1 = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 32260 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 32821 "parsing/parser.ml" +||||||| 04da777f7 +# 32816 "parsing/parser.ml" +======= +# 32830 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _4 = + let _3 = _3_inlined1 in + let _1 = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 32269 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32830 "parsing/parser.ml" +||||||| 04da777f7 +# 32825 "parsing/parser.ml" +======= +# 32839 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 32274 "parsing/parser.ml" + + in -# 2823 "parsing/parser.mly" - ( _1 ) -# 38275 "parsing/parser.ml" +# 4185 "parsing/parser.mly" + ( _1 ) +# 32280 "parsing/parser.ml" in -# 1781 "parsing/parser.mly" - ( e ) -# 38281 "parsing/parser.ml" +# 4189 "parsing/parser.mly" + ( (_1, _3) ) +# 32286 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32835 "parsing/parser.ml" +||||||| 04da777f7 +# 32830 "parsing/parser.ml" +======= +# 32844 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 32841 "parsing/parser.ml" +||||||| 04da777f7 +# 32836 "parsing/parser.ml" +======= +# 32850 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4208 "parsing/parser.mly" +||||||| 04da777f7 +# 4201 "parsing/parser.mly" +======= +# 4192 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _3) ) +<<<<<<< HEAD +# 32847 "parsing/parser.ml" +||||||| 04da777f7 +# 32842 "parsing/parser.ml" +======= +# 32856 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let attrs = - let _1 = _1_inlined1 in + let (_endpos__4_, _startpos__4_) = (_endpos__3_inlined1_, _startpos_xs_) in + let _2 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 38289 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32297 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32858 "parsing/parser.ml" +||||||| 04da777f7 +# 32853 "parsing/parser.ml" +======= +# 32867 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in + let _startpos__2_ = _startpos__1_ in + let modes0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 32304 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 32865 "parsing/parser.ml" +||||||| 04da777f7 +# 32860 "parsing/parser.ml" +======= +# 32874 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__7_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 38298 "parsing/parser.ml" +<<<<<<< HEAD +# 3110 "parsing/parser.mly" +||||||| 04da777f7 +# 3108 "parsing/parser.mly" +======= +# 3098 "parsing/parser.mly" +>>>>>>> origin/main + ( let bound_vars, inner_type = _4 in + let ltyp = Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } in + let typ_loc = Location.ghostify (make_loc _loc__4_) in + let typ = + Jane_syntax.Layouts.type_of ~loc:typ_loc ltyp + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _7 in + (_2, exp, Some (Pvc_constraint { locally_abstract_univars = []; typ }), + let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 32328 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32889 "parsing/parser.ml" +||||||| 04da777f7 +# 32884 "parsing/parser.ml" +======= +# 32898 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38307,39 +55657,39 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -38354,97 +55704,217 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _7 : (Parsetree.expression) = Obj.magic _7 in + let _6 : unit = Obj.magic _6 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _3_inlined1 : (Parsetree.core_type) = Obj.magic _3_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let e = + let _endpos = _endpos__7_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let modes1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 32405 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 32966 "parsing/parser.ml" +||||||| 04da777f7 +# 32961 "parsing/parser.ml" +======= +# 32975 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _4 = + let _3 = _3_inlined1 in + let _1 = let _1 = - let _3 = - let xs = - let xs = + let xs = # 253 "" ( List.rev xs ) -# 38378 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 38383 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 32415 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32976 "parsing/parser.ml" +||||||| 04da777f7 +# 32971 "parsing/parser.ml" +======= +# 32985 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" ( xs ) -# 38389 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 38400 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 38406 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +<<<<<<< HEAD +# 32420 "parsing/parser.ml" -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 38419 "parsing/parser.ml" + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 32426 "parsing/parser.ml" + + in + +# 4189 "parsing/parser.mly" + ( (_1, _3) ) +# 32432 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 32981 "parsing/parser.ml" +||||||| 04da777f7 +# 32976 "parsing/parser.ml" +======= +# 32990 "parsing/parser.ml" +>>>>>>> origin/main in -# 2823 "parsing/parser.mly" - ( _1 ) -# 38425 "parsing/parser.ml" +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 32987 "parsing/parser.ml" +||||||| 04da777f7 +# 32982 "parsing/parser.ml" +======= +# 32996 "parsing/parser.ml" +>>>>>>> origin/main in -# 1781 "parsing/parser.mly" - ( e ) -# 38431 "parsing/parser.ml" +<<<<<<< HEAD +# 4208 "parsing/parser.mly" +||||||| 04da777f7 +# 4201 "parsing/parser.mly" +======= +# 4192 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _3) ) +<<<<<<< HEAD +# 32993 "parsing/parser.ml" +||||||| 04da777f7 +# 32988 "parsing/parser.ml" +======= +# 33002 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let attrs = - let _1 = _1_inlined1 in + let (_endpos__4_, _startpos__4_) = (_endpos__3_inlined1_, _startpos_xs_) in + let _2 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 38439 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32443 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33004 "parsing/parser.ml" +||||||| 04da777f7 +# 32999 "parsing/parser.ml" +======= +# 33013 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in + let _startpos__2_ = _startpos__1_ in + let modes0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 32450 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 33011 "parsing/parser.ml" +||||||| 04da777f7 +# 33006 "parsing/parser.ml" +======= +# 33020 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__7_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 38448 "parsing/parser.ml" +<<<<<<< HEAD +# 3110 "parsing/parser.mly" +||||||| 04da777f7 +# 3108 "parsing/parser.mly" +======= +# 3098 "parsing/parser.mly" +>>>>>>> origin/main + ( let bound_vars, inner_type = _4 in + let ltyp = Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } in + let typ_loc = Location.ghostify (make_loc _loc__4_) in + let typ = + Jane_syntax.Layouts.type_of ~loc:typ_loc ltyp + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _7 in + (_2, exp, Some (Pvc_constraint { locally_abstract_univars = []; typ }), + let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 32474 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33035 "parsing/parser.ml" +||||||| 04da777f7 +# 33030 "parsing/parser.ml" +======= +# 33044 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38457,40 +55927,46 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -38498,69 +55974,245 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _7 : (Parsetree.expression) = Obj.magic _7 in + let _6 : unit = Obj.magic _6 in + let _3_inlined1 : (Parsetree.core_type) = Obj.magic _3_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in - let ty = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__7_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let modes1 = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 32549 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 33110 "parsing/parser.ml" +||||||| 04da777f7 +# 33105 "parsing/parser.ml" +======= +# 33119 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _4 = + let _3 = _3_inlined1 in + let _1 = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 32558 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33119 "parsing/parser.ml" +||||||| 04da777f7 +# 33114 "parsing/parser.ml" +======= +# 33128 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 32563 "parsing/parser.ml" + + in -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 38524 "parsing/parser.ml" +# 4185 "parsing/parser.mly" + ( _1 ) +# 32569 "parsing/parser.ml" in - let _endpos_ty_ = _endpos__1_inlined1_ in - let e = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 38532 "parsing/parser.ml" - in + +# 4189 "parsing/parser.mly" + ( (_1, _3) ) +# 32575 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33124 "parsing/parser.ml" +||||||| 04da777f7 +# 33119 "parsing/parser.ml" +======= +# 33133 "parsing/parser.ml" +>>>>>>> origin/main + + in -# 2823 "parsing/parser.mly" - ( _1 ) -# 38537 "parsing/parser.ml" +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 33130 "parsing/parser.ml" +||||||| 04da777f7 +# 33125 "parsing/parser.ml" +======= +# 33139 "parsing/parser.ml" +>>>>>>> origin/main in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in -# 1783 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 38547 "parsing/parser.ml" +<<<<<<< HEAD +# 4208 "parsing/parser.mly" +||||||| 04da777f7 +# 4201 "parsing/parser.mly" +======= +# 4192 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _3) ) +<<<<<<< HEAD +# 33136 "parsing/parser.ml" +||||||| 04da777f7 +# 33131 "parsing/parser.ml" +======= +# 33145 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let attrs = - let _1 = _1_inlined1 in + let (_endpos__4_, _startpos__4_) = (_endpos__3_inlined1_, _startpos_xs_) in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 38555 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32587 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33148 "parsing/parser.ml" +||||||| 04da777f7 +# 33143 "parsing/parser.ml" +======= +# 33157 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in + let _startpos__2_ = _startpos__1_inlined1_ in + let modes0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 32599 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 32605 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 33160 "parsing/parser.ml" +||||||| 04da777f7 +# 33155 "parsing/parser.ml" +======= +# 33169 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 33166 "parsing/parser.ml" +||||||| 04da777f7 +# 33161 "parsing/parser.ml" +======= +# 33175 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos__7_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 38564 "parsing/parser.ml" +<<<<<<< HEAD +# 3110 "parsing/parser.mly" +||||||| 04da777f7 +# 3108 "parsing/parser.mly" +======= +# 3098 "parsing/parser.mly" +>>>>>>> origin/main + ( let bound_vars, inner_type = _4 in + let ltyp = Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } in + let typ_loc = Location.ghostify (make_loc _loc__4_) in + let typ = + Jane_syntax.Layouts.type_of ~loc:typ_loc ltyp + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _7 in + (_2, exp, Some (Pvc_constraint { locally_abstract_univars = []; typ }), + let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 32630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33191 "parsing/parser.ml" +||||||| 04da777f7 +# 33186 "parsing/parser.ml" +======= +# 33200 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38573,56 +56225,50 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -38632,117 +56278,249 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _7 : (Parsetree.expression) = Obj.magic _7 in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _3_inlined1 : (Parsetree.core_type) = Obj.magic _3_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in - let ty = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 38661 "parsing/parser.ml" - - in - let _endpos_ty_ = _endpos__1_inlined3_ in - let e = + let _endpos = _endpos__7_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let modes1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 32714 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 33275 "parsing/parser.ml" +||||||| 04da777f7 +# 33270 "parsing/parser.ml" +======= +# 33284 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _4 = + let _3 = _3_inlined1 in + let _1 = let _1 = - let _3 = - let xs = - let xs = + let xs = # 253 "" ( List.rev xs ) -# 38672 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 38677 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" +<<<<<<< HEAD +# 32724 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33285 "parsing/parser.ml" +||||||| 04da777f7 +# 33280 "parsing/parser.ml" +======= +# 33294 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" ( xs ) -# 38683 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 38694 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 38700 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +<<<<<<< HEAD +# 32729 "parsing/parser.ml" -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 38713 "parsing/parser.ml" + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 32735 "parsing/parser.ml" + + in + +# 4189 "parsing/parser.mly" + ( (_1, _3) ) +# 32741 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33290 "parsing/parser.ml" +||||||| 04da777f7 +# 33285 "parsing/parser.ml" +======= +# 33299 "parsing/parser.ml" +>>>>>>> origin/main in -# 2823 "parsing/parser.mly" - ( _1 ) -# 38719 "parsing/parser.ml" +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 33296 "parsing/parser.ml" +||||||| 04da777f7 +# 33291 "parsing/parser.ml" +======= +# 33305 "parsing/parser.ml" +>>>>>>> origin/main in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in -# 1783 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 38729 "parsing/parser.ml" +<<<<<<< HEAD +# 4208 "parsing/parser.mly" +||||||| 04da777f7 +# 4201 "parsing/parser.mly" +======= +# 4192 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _3) ) +<<<<<<< HEAD +# 33302 "parsing/parser.ml" +||||||| 04da777f7 +# 33297 "parsing/parser.ml" +======= +# 33311 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let attrs = - let _1 = _1_inlined1 in + let (_endpos__4_, _startpos__4_) = (_endpos__3_inlined1_, _startpos_xs_) in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 38737 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32753 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33314 "parsing/parser.ml" +||||||| 04da777f7 +# 33309 "parsing/parser.ml" +======= +# 33323 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in + let _startpos__2_ = _startpos__1_inlined1_ in + let modes0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 32765 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 32771 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 33326 "parsing/parser.ml" +||||||| 04da777f7 +# 33321 "parsing/parser.ml" +======= +# 33335 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 33332 "parsing/parser.ml" +||||||| 04da777f7 +# 33327 "parsing/parser.ml" +======= +# 33341 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_modes0_, _startpos_modes0_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos__7_ in + let _symbolstartpos = if _startpos_modes0_ != _endpos_modes0_ then + _startpos_modes0_ + else + _startpos__2_ in + let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 38746 "parsing/parser.ml" +<<<<<<< HEAD +# 3110 "parsing/parser.mly" +||||||| 04da777f7 +# 3108 "parsing/parser.mly" +======= +# 3098 "parsing/parser.mly" +>>>>>>> origin/main + ( let bound_vars, inner_type = _4 in + let ltyp = Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } in + let typ_loc = Location.ghostify (make_loc _loc__4_) in + let typ = + Jane_syntax.Layouts.type_of ~loc:typ_loc ltyp + in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _7 in + (_2, exp, Some (Pvc_constraint { locally_abstract_univars = []; typ }), + let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 32796 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33357 "parsing/parser.ml" +||||||| 04da777f7 +# 33352 "parsing/parser.ml" +======= +# 33366 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38755,51 +56533,45 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _9; + MenhirLib.EngineTypes.startp = _startpos__9_; + MenhirLib.EngineTypes.endp = _endpos__9_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -38808,84 +56580,98 @@ module Tables = struct }; }; } = _menhir_stack in + let _9 : (Parsetree.expression) = Obj.magic _9 in + let _8 : unit = Obj.magic _8 in + let _6 : (Parsetree.core_type) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let _1_inlined4 : (Parsetree.module_type) = Obj.magic _1_inlined4 in - let _4 : unit = Obj.magic _4 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _4 : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let (_endpos__1_inlined2_, _startpos__1_inlined2_, _endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined2, _1_inlined1, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined4, _1_inlined3, _1_inlined2) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 38836 "parsing/parser.ml" - - in - let _endpos_ty2_ = _endpos__1_inlined2_ in - let ty1 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 38850 "parsing/parser.ml" - - in - let e = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 38857 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 38862 "parsing/parser.ml" - - in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in - -# 1785 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 38872 "parsing/parser.ml" - - in - let attrs = - let _1 = _1_inlined1 in + let _endpos = _endpos__9_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 32871 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 33432 "parsing/parser.ml" +||||||| 04da777f7 +# 33427 "parsing/parser.ml" +======= +# 33441 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 38880 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32880 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33441 "parsing/parser.ml" +||||||| 04da777f7 +# 33436 "parsing/parser.ml" +======= +# 33450 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__5_ in + let _endpos = _endpos__9_ in let _symbolstartpos = _startpos__1_ in + let _loc__6_ = (_startpos__6_, _endpos__6_) in let _sloc = (_symbolstartpos, _endpos) in -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 38889 "parsing/parser.ml" +<<<<<<< HEAD +# 3139 "parsing/parser.mly" +||||||| 04da777f7 +# 3137 "parsing/parser.mly" +======= +# 3127 "parsing/parser.mly" +>>>>>>> origin/main + ( let exp, poly = + wrap_type_annotation ~loc:_sloc ~typloc:_loc__6_ _4 _6 _9 + in + let loc = (_startpos__1_, _endpos__6_) in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost exp in + (ghpat ~loc (Ppat_constraint(_1, poly)), exp, None, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 32897 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33458 "parsing/parser.ml" +||||||| 04da777f7 +# 33453 "parsing/parser.ml" +======= +# 33467 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38898,68 +56684,50 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _9; + MenhirLib.EngineTypes.startp = _startpos__9_; + MenhirLib.EngineTypes.endp = _endpos__9_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined6; - MenhirLib.EngineTypes.startp = _startpos__1_inlined6_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined6_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -38969,132 +56737,102 @@ module Tables = struct }; }; } = _menhir_stack in + let _9 : (Parsetree.expression) = Obj.magic _9 in + let _8 : unit = Obj.magic _8 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _6 : (Parsetree.core_type) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let _1_inlined6 : (Parsetree.module_type) = Obj.magic _1_inlined6 in - let _4 : unit = Obj.magic _4 in - let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _4 : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined4, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined6_, _startpos__1_inlined6_, _endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined6, _1_inlined5, _1_inlined4, _1_inlined3) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _1_inlined4) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 39000 "parsing/parser.ml" - - in - let _endpos_ty2_ = _endpos__1_inlined4_ in - let ty1 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 39014 "parsing/parser.ml" - - in - let e = - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 39024 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 39029 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 39035 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39046 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 39052 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 39065 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 39071 "parsing/parser.ml" - - in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in + let _endpos = _endpos__9_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let modes = + let _1 = _1_inlined1 in -# 1785 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 39081 "parsing/parser.ml" +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 32981 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 33542 "parsing/parser.ml" +||||||| 04da777f7 +# 33537 "parsing/parser.ml" +======= +# 33551 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let attrs = - let _1 = _1_inlined1 in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 39089 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 32991 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33552 "parsing/parser.ml" +||||||| 04da777f7 +# 33547 "parsing/parser.ml" +======= +# 33561 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__5_ in + let _endpos = _endpos__9_ in let _symbolstartpos = _startpos__1_ in + let _loc__6_ = (_startpos__6_, _endpos__6_) in let _sloc = (_symbolstartpos, _endpos) in -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 39098 "parsing/parser.ml" +<<<<<<< HEAD +# 3139 "parsing/parser.mly" +||||||| 04da777f7 +# 3137 "parsing/parser.mly" +======= +# 3127 "parsing/parser.mly" +>>>>>>> origin/main + ( let exp, poly = + wrap_type_annotation ~loc:_sloc ~typloc:_loc__6_ _4 _6 _9 + in + let loc = (_startpos__1_, _endpos__6_) in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost exp in + (ghpat ~loc (Ppat_constraint(_1, poly)), exp, None, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 33008 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33569 "parsing/parser.ml" +||||||| 04da777f7 +# 33564 "parsing/parser.ml" +======= +# 33578 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39107,110 +56845,50 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _3 : (Parsetree.expression) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 39174 "parsing/parser.ml" - - in - let _endpos_ty2_ = _endpos__1_inlined1_ in - let e = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 39182 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 39187 "parsing/parser.ml" - - in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in - -# 1787 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 39197 "parsing/parser.ml" - - in - let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39205 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 39214 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = +<<<<<<< HEAD +# 3148 "parsing/parser.mly" +||||||| 04da777f7 +# 3146 "parsing/parser.mly" +======= +# 3136 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _3, None, []) ) +<<<<<<< HEAD +# 33048 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33609 "parsing/parser.ml" +||||||| 04da777f7 +# 33604 "parsing/parser.ml" +======= +# 33618 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39223,176 +56901,89 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let e = - let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 39311 "parsing/parser.ml" - - in - let _endpos_ty2_ = _endpos__1_inlined3_ in - let e = - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 39322 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 39327 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 39333 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39344 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 39350 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 39363 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 39369 "parsing/parser.ml" - - in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in - -# 1787 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 39379 "parsing/parser.ml" - - in - let attrs = + let _endpos = _endpos__4_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 39387 "parsing/parser.ml" +<<<<<<< HEAD +# 3084 "parsing/parser.mly" +||||||| 04da777f7 +# 3082 "parsing/parser.mly" +======= +# 3072 "parsing/parser.mly" +>>>>>>> origin/main + (None, _1) +<<<<<<< HEAD +# 33097 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33658 "parsing/parser.ml" +||||||| 04da777f7 +# 33653 "parsing/parser.ml" +======= +# 33667 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__5_ in + let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1768 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 39396 "parsing/parser.ml" +<<<<<<< HEAD +# 3150 "parsing/parser.mly" +||||||| 04da777f7 +# 3148 "parsing/parser.mly" +======= +# 3138 "parsing/parser.mly" +>>>>>>> origin/main + ( + let pvc, modes = _2 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _4 in + (_1, exp, pvc, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 33111 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33672 "parsing/parser.ml" +||||||| 04da777f7 +# 33667 "parsing/parser.ml" +======= +# 33681 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39405,77 +56996,120 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.core_type) = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.module_expr) = let _4 = - let _1 = _1_inlined2 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 39458 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _2 = + let _3 = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 33166 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 33727 "parsing/parser.ml" +||||||| 04da777f7 +# 33722 "parsing/parser.ml" +======= +# 33736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2823 "parsing/parser.mly" - ( _1 ) -# 39463 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39471 "parsing/parser.ml" +<<<<<<< HEAD +# 3085 "parsing/parser.mly" +||||||| 04da777f7 +# 3083 "parsing/parser.mly" +======= +# 3073 "parsing/parser.mly" +>>>>>>> origin/main + ( + Some(Pvc_constraint { locally_abstract_univars=[]; typ=_2 }), _3 + ) +<<<<<<< HEAD +# 33173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33734 "parsing/parser.ml" +||||||| 04da777f7 +# 33729 "parsing/parser.ml" +======= +# 33743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1770 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 39479 "parsing/parser.ml" +<<<<<<< HEAD +# 3150 "parsing/parser.mly" +||||||| 04da777f7 +# 3148 "parsing/parser.mly" +======= +# 3138 "parsing/parser.mly" +>>>>>>> origin/main + ( + let pvc, modes = _2 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _4 in + (_1, exp, pvc, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 33187 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33748 "parsing/parser.ml" +||||||| 04da777f7 +# 33743 "parsing/parser.ml" +======= +# 33757 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39488,143 +57122,131 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _2 : (Parsetree.core_type) = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.module_expr) = let _4 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 39565 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 39570 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 39576 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39587 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 39593 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__4_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _2 = + let _1_inlined1 = _1_inlined2 in + let _3 = + let _1 = _1_inlined1 in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 39606 "parsing/parser.ml" +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 33252 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 33813 "parsing/parser.ml" +||||||| 04da777f7 +# 33808 "parsing/parser.ml" +======= +# 33822 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2823 "parsing/parser.mly" - ( _1 ) -# 39612 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39620 "parsing/parser.ml" +<<<<<<< HEAD +# 3085 "parsing/parser.mly" +||||||| 04da777f7 +# 3083 "parsing/parser.mly" +======= +# 3073 "parsing/parser.mly" +>>>>>>> origin/main + ( + Some(Pvc_constraint { locally_abstract_univars=[]; typ=_2 }), _3 + ) +<<<<<<< HEAD +# 33260 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33821 "parsing/parser.ml" +||||||| 04da777f7 +# 33816 "parsing/parser.ml" +======= +# 33830 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1770 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 39628 "parsing/parser.ml" +<<<<<<< HEAD +# 3150 "parsing/parser.mly" +||||||| 04da777f7 +# 3148 "parsing/parser.mly" +======= +# 3138 "parsing/parser.mly" +>>>>>>> origin/main + ( + let pvc, modes = _2 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost _4 in + (_1, exp, pvc, let_binding_mode_attrs modes) + ) +<<<<<<< HEAD +# 33274 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33835 "parsing/parser.ml" +||||||| 04da777f7 +# 33830 "parsing/parser.ml" +======= +# 33844 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39637,226 +57259,111 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _3 : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = Obj.magic _3 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.module_expr) = let _4 = - let _1 = _1_inlined2 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 39690 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 39695 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39703 "parsing/parser.ml" - - in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 1772 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 39711 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.module_expr) = let _4 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 39797 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 39802 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 39808 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 39819 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 39825 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 39838 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 39844 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 39852 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 33319 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33880 "parsing/parser.ml" +||||||| 04da777f7 +# 33875 "parsing/parser.ml" +======= +# 33889 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let modes = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in - in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 33329 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 33890 "parsing/parser.ml" +||||||| 04da777f7 +# 33885 "parsing/parser.ml" +======= +# 33899 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_modes_ = _startpos__1_ in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos_modes_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1772 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 39860 "parsing/parser.ml" +<<<<<<< HEAD +# 3157 "parsing/parser.mly" +||||||| 04da777f7 +# 3155 "parsing/parser.mly" +======= +# 3145 "parsing/parser.mly" +>>>>>>> origin/main + ( let modes_ghost = Mode.ghostify modes in + (_2, mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost (_3 modes_ghost), None, + let_binding_mode_attrs modes) ) +<<<<<<< HEAD +# 33341 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33902 "parsing/parser.ml" +||||||| 04da777f7 +# 33897 "parsing/parser.ml" +======= +# 33911 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39874,19 +57381,19 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = modes; + MenhirLib.EngineTypes.startp = _startpos_modes_; + MenhirLib.EngineTypes.endp = _endpos_modes_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -39898,41 +57405,67 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let _5 : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let modes : (Mode.t) = Obj.magic modes in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let _4 = - let _1 = _1_inlined2 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 39915 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 39920 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * Parsetree.attribute list) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 39928 "parsing/parser.ml" +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 33400 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33961 "parsing/parser.ml" +||||||| 04da777f7 +# 33956 "parsing/parser.ml" +======= +# 33970 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1774 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 39936 "parsing/parser.ml" +<<<<<<< HEAD +# 3161 "parsing/parser.mly" +||||||| 04da777f7 +# 3159 "parsing/parser.mly" +======= +# 3149 "parsing/parser.mly" +>>>>>>> origin/main + ( let modes_ghost = Mode.ghostify modes in + (_2, mkexp_with_modes ~ghost:true ~loc:_sloc modes_ghost (_5 modes_ghost), None, + let_binding_mode_attrs modes) ) +<<<<<<< HEAD +# 33411 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 33972 "parsing/parser.ml" +||||||| 04da777f7 +# 33967 "parsing/parser.ml" +======= +# 33981 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39945,136 +57478,155 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = body_with_attrs2; + MenhirLib.EngineTypes.startp = _startpos_body_with_attrs2_; + MenhirLib.EngineTypes.endp = _endpos_body_with_attrs2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = rec_flag; + MenhirLib.EngineTypes.startp = _startpos_rec_flag_; + MenhirLib.EngineTypes.endp = _endpos_rec_flag_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let body_with_attrs2 : ((Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) * + Parsetree.attribute list) = Obj.magic body_with_attrs2 in + let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.module_expr) = let _4 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 40015 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 40020 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 40026 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 40037 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 40043 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__1_inlined2_ in + let _v : (let_bindings) = let _1 = + let attrs3 = + let _1 = _1_inlined2 in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 40056 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 33476 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34037 "parsing/parser.ml" +||||||| 04da777f7 +# 34032 "parsing/parser.ml" +======= +# 34046 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos_attrs3_ = _endpos__1_inlined2_ in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 33485 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34046 "parsing/parser.ml" +||||||| 04da777f7 +# 34041 "parsing/parser.ml" +======= +# 34055 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2823 "parsing/parser.mly" - ( _1 ) -# 40062 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 40070 "parsing/parser.ml" +<<<<<<< HEAD +# 3190 "parsing/parser.mly" +||||||| 04da777f7 +# 3188 "parsing/parser.mly" +======= +# 3178 "parsing/parser.mly" +>>>>>>> origin/main + ( + let body, attrs2 = body_with_attrs2 in + let attrs = attrs1 @ attrs2 @ attrs3 in + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) + ) +<<<<<<< HEAD +# 33498 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34059 "parsing/parser.ml" +||||||| 04da777f7 +# 34054 "parsing/parser.ml" +======= +# 34068 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1774 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 40078 "parsing/parser.ml" +<<<<<<< HEAD +# 3180 "parsing/parser.mly" +||||||| 04da777f7 +# 3178 "parsing/parser.mly" +======= +# 3168 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 33504 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34065 "parsing/parser.ml" +||||||| 04da777f7 +# 34060 "parsing/parser.ml" +======= +# 34074 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40086,20 +57638,43 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic _1 in + let _2 : (let_binding) = Obj.magic _2 in + let _1 : (let_bindings) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = -# 3764 "parsing/parser.mly" - ( _1 ) -# 40103 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (let_bindings) = +<<<<<<< HEAD +# 3181 "parsing/parser.mly" +||||||| 04da777f7 +# 3179 "parsing/parser.mly" +======= +# 3169 "parsing/parser.mly" +>>>>>>> origin/main + ( addlb _1 _2 ) +<<<<<<< HEAD +# 33536 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34097 "parsing/parser.ml" +||||||| 04da777f7 +# 34092 "parsing/parser.ml" +======= +# 34106 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40112,80 +57687,171 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = body_with_attrs2; + MenhirLib.EngineTypes.startp = _startpos_body_with_attrs2_; + MenhirLib.EngineTypes.endp = _endpos_body_with_attrs2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = rec_flag; + MenhirLib.EngineTypes.startp = _startpos_rec_flag_; + MenhirLib.EngineTypes.endp = _endpos_rec_flag_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in - let _3 : unit = Obj.magic _3 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _2 : (string) = Obj.magic _2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : (Asttypes.variance * Asttypes.injectivity) = Obj.magic _1 in + let body_with_attrs2 : ((Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) * + Parsetree.attribute list) = Obj.magic body_with_attrs2 in + let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_jkind_ in - let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = let _2 = - let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in - let attrs = + let _endpos = _endpos__1_inlined2_ in + let _v : (let_bindings) = let _1 = + let attrs3 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 33594 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34155 "parsing/parser.ml" +||||||| 04da777f7 +# 34150 "parsing/parser.ml" +======= +# 34164 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs3_ = _endpos__1_inlined2_ in + let attrs1 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 40167 "parsing/parser.ml" +# 33603 "parsing/parser.ml" in - let name = -# 3785 "parsing/parser.mly" - ( Some _2 ) -# 40173 "parsing/parser.ml" + let ext = +# 5016 "parsing/parser.mly" + ( None ) +# 33609 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34164 "parsing/parser.ml" +||||||| 04da777f7 +# 34159 "parsing/parser.ml" +======= +# 34173 "parsing/parser.ml" +>>>>>>> origin/main + + in + let ext = +<<<<<<< HEAD +# 5020 "parsing/parser.mly" +||||||| 04da777f7 +# 5013 "parsing/parser.mly" +======= +# 5004 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 34170 "parsing/parser.ml" +||||||| 04da777f7 +# 34165 "parsing/parser.ml" +======= +# 34179 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _startpos_name_ = _startpos__1_ in - let _endpos = _endpos_jkind_ in - let _symbolstartpos = _startpos_name_ in + let _endpos = _endpos_attrs3_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3759 "parsing/parser.mly" - ( Jane_syntax.Core_type.core_type_of ~loc:(make_loc _sloc) ~attrs - (Jtyp_layout (Ltyp_var { name; jkind })) ) -# 40183 "parsing/parser.ml" - - in - -# 3766 "parsing/parser.mly" - ( _2, _1 ) -# 40189 "parsing/parser.ml" +<<<<<<< HEAD +# 3190 "parsing/parser.mly" +||||||| 04da777f7 +# 3188 "parsing/parser.mly" +======= +# 3178 "parsing/parser.mly" +>>>>>>> origin/main + ( + let body, attrs2 = body_with_attrs2 in + let attrs = attrs1 @ attrs2 @ attrs3 in + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) + ) +<<<<<<< HEAD +# 33621 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34182 "parsing/parser.ml" +||||||| 04da777f7 +# 34177 "parsing/parser.ml" +======= +# 34191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3180 "parsing/parser.mly" +||||||| 04da777f7 +# 3178 "parsing/parser.mly" +======= +# 3168 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 33627 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34188 "parsing/parser.ml" +||||||| 04da777f7 +# 34183 "parsing/parser.ml" +======= +# 34197 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40198,73 +57864,191 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = body_with_attrs2; + MenhirLib.EngineTypes.startp = _startpos_body_with_attrs2_; + MenhirLib.EngineTypes.endp = _endpos_body_with_attrs2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = rec_flag; + MenhirLib.EngineTypes.startp = _startpos_rec_flag_; + MenhirLib.EngineTypes.endp = _endpos_rec_flag_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; }; } = _menhir_stack in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in - let _3 : unit = Obj.magic _3 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body_with_attrs2 : ((Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) * + Parsetree.attribute list) = Obj.magic body_with_attrs2 in + let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _2 : (Ast_helper.str) = Obj.magic _2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : (Asttypes.variance * Asttypes.injectivity) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_jkind_ in - let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = let _2 = - let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in - let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" + let _endpos = _endpos__1_inlined3_ in + let _v : (let_bindings) = let _1 = + let attrs3 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" ( _1 ) -# 40246 "parsing/parser.ml" +# 33699 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34260 "parsing/parser.ml" +||||||| 04da777f7 +# 34255 "parsing/parser.ml" +======= +# 34269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let name = -# 3787 "parsing/parser.mly" - ( None ) -# 40252 "parsing/parser.ml" - in - let _startpos_name_ = _startpos__1_ in - let _endpos = _endpos_jkind_ in - let _symbolstartpos = _startpos_name_ in + let _endpos_attrs3_ = _endpos__1_inlined3_ in + let attrs1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 33708 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34269 "parsing/parser.ml" +||||||| 04da777f7 +# 34264 "parsing/parser.ml" +======= +# 34278 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ext = + let _startpos__1_ = _startpos__1_inlined1_ in + let _endpos = _endpos__2_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +<<<<<<< HEAD +# 5018 "parsing/parser.mly" + ( not_expecting _loc "extension" ) +# 33719 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5022 "parsing/parser.mly" +||||||| 04da777f7 +# 5015 "parsing/parser.mly" +======= +# 5006 "parsing/parser.mly" +>>>>>>> origin/main + ( not_expecting _loc "extension" ) +<<<<<<< HEAD +# 34280 "parsing/parser.ml" +||||||| 04da777f7 +# 34275 "parsing/parser.ml" +======= +# 34289 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs3_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3759 "parsing/parser.mly" - ( Jane_syntax.Core_type.core_type_of ~loc:(make_loc _sloc) ~attrs - (Jtyp_layout (Ltyp_var { name; jkind })) ) -# 40262 "parsing/parser.ml" - - in - -# 3766 "parsing/parser.mly" - ( _2, _1 ) -# 40268 "parsing/parser.ml" +<<<<<<< HEAD +# 3190 "parsing/parser.mly" +||||||| 04da777f7 +# 3188 "parsing/parser.mly" +======= +# 3178 "parsing/parser.mly" +>>>>>>> origin/main + ( + let body, attrs2 = body_with_attrs2 in + let attrs = attrs1 @ attrs2 @ attrs3 in + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) + ) +<<<<<<< HEAD +# 33732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34293 "parsing/parser.ml" +||||||| 04da777f7 +# 34288 "parsing/parser.ml" +======= +# 34302 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3180 "parsing/parser.mly" +||||||| 04da777f7 +# 3178 "parsing/parser.mly" +======= +# 3168 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 33738 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34299 "parsing/parser.ml" +||||||| 04da777f7 +# 34294 "parsing/parser.ml" +======= +# 34308 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40288,15 +58072,31 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _2 : (let_binding) = Obj.magic _2 in + let _1 : (let_bindings) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1675 "parsing/parser.mly" - ( _1 ) -# 40300 "parsing/parser.ml" + let _v : (let_bindings) = +<<<<<<< HEAD +# 3181 "parsing/parser.mly" +||||||| 04da777f7 +# 3179 "parsing/parser.mly" +======= +# 3169 "parsing/parser.mly" +>>>>>>> origin/main + ( addlb _1 _2 ) +<<<<<<< HEAD +# 33770 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34331 "parsing/parser.ml" +||||||| 04da777f7 +# 34326 "parsing/parser.ml" +======= +# 34340 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40308,27 +58108,59 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1660 "parsing/parser.mly" - ( _1 ) -# 40332 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern * Mode.t) = let modes = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 33795 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 34356 "parsing/parser.ml" +||||||| 04da777f7 +# 34351 "parsing/parser.ml" +======= +# 34365 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2688 "parsing/parser.mly" +||||||| 04da777f7 +# 2686 "parsing/parser.mly" +======= +# 2676 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 33800 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34361 "parsing/parser.ml" +||||||| 04da777f7 +# 34356 "parsing/parser.ml" +======= +# 34370 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40341,9 +58173,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -40352,15 +58184,57 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.core_type) = -# 1635 "parsing/parser.mly" - ( _1 ) -# 40364 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern * Mode.t) = let modes = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 33834 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 34395 "parsing/parser.ml" +||||||| 04da777f7 +# 34390 "parsing/parser.ml" +======= +# 34404 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2688 "parsing/parser.mly" +||||||| 04da777f7 +# 2686 "parsing/parser.mly" +======= +# 2676 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 33840 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34401 "parsing/parser.ml" +||||||| 04da777f7 +# 34396 "parsing/parser.ml" +======= +# 34410 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40373,26 +58247,114 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in + let _3 : (Parsetree.core_type) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = -# 1640 "parsing/parser.mly" - ( _1 ) -# 40396 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern * Mode.t) = let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 33879 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 34440 "parsing/parser.ml" +||||||| 04da777f7 +# 34435 "parsing/parser.ml" +======= +# 34449 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = +<<<<<<< HEAD +# 2690 "parsing/parser.mly" +||||||| 04da777f7 +# 2688 "parsing/parser.mly" +======= +# 2678 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(_1, _3) ) +<<<<<<< HEAD +# 33885 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34446 "parsing/parser.ml" +||||||| 04da777f7 +# 34441 "parsing/parser.ml" +======= +# 34455 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 33894 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34455 "parsing/parser.ml" +||||||| 04da777f7 +# 34450 "parsing/parser.ml" +======= +# 34464 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2692 "parsing/parser.mly" +||||||| 04da777f7 +# 2690 "parsing/parser.mly" +======= +# 2680 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 33900 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34461 "parsing/parser.ml" +||||||| 04da777f7 +# 34456 "parsing/parser.ml" +======= +# 34470 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40405,26 +58367,124 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _3 : (Parsetree.core_type) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1665 "parsing/parser.mly" - ( _1 ) -# 40428 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern * Mode.t) = let modes = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 33948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 34509 "parsing/parser.ml" +||||||| 04da777f7 +# 34504 "parsing/parser.ml" +======= +# 34518 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _1 = +<<<<<<< HEAD +# 2690 "parsing/parser.mly" +||||||| 04da777f7 +# 2688 "parsing/parser.mly" +======= +# 2678 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(_1, _3) ) +<<<<<<< HEAD +# 33955 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34516 "parsing/parser.ml" +||||||| 04da777f7 +# 34511 "parsing/parser.ml" +======= +# 34525 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 33964 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34525 "parsing/parser.ml" +||||||| 04da777f7 +# 34520 "parsing/parser.ml" +======= +# 34534 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2692 "parsing/parser.mly" +||||||| 04da777f7 +# 2690 "parsing/parser.mly" +======= +# 2680 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 33970 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34531 "parsing/parser.ml" +||||||| 04da777f7 +# 34526 "parsing/parser.ml" +======= +# 34540 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40437,26 +58497,254 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let pat : (Parsetree.pattern) = Obj.magic pat in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1670 "parsing/parser.mly" - ( _1 ) -# 40460 "parsing/parser.ml" + let _startpos = _startpos_pat_ in + let _endpos = _endpos_inner_type_ in + let _v : (Parsetree.pattern * Mode.t) = let _1 = + let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 34024 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 34585 "parsing/parser.ml" +||||||| 04da777f7 +# 34580 "parsing/parser.ml" +======= +# 34594 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 34035 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34596 "parsing/parser.ml" +||||||| 04da777f7 +# 34591 "parsing/parser.ml" +======= +# 34605 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 34040 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 34046 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34601 "parsing/parser.ml" +||||||| 04da777f7 +# 34596 "parsing/parser.ml" +======= +# 34610 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34607 "parsing/parser.ml" +||||||| 04da777f7 +# 34602 "parsing/parser.ml" +======= +# 34616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 34052 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34613 "parsing/parser.ml" +||||||| 04da777f7 +# 34608 "parsing/parser.ml" +======= +# 34622 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 34062 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34623 "parsing/parser.ml" +||||||| 04da777f7 +# 34618 "parsing/parser.ml" +======= +# 34632 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 34068 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34629 "parsing/parser.ml" +||||||| 04da777f7 +# 34624 "parsing/parser.ml" +======= +# 34638 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 34078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34639 "parsing/parser.ml" +||||||| 04da777f7 +# 34634 "parsing/parser.ml" +======= +# 34648 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 34084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34645 "parsing/parser.ml" +||||||| 04da777f7 +# 34640 "parsing/parser.ml" +======= +# 34654 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2694 "parsing/parser.mly" +||||||| 04da777f7 +# 2692 "parsing/parser.mly" +======= +# 2682 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34090 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34651 "parsing/parser.ml" +||||||| 04da777f7 +# 34646 "parsing/parser.ml" +======= +# 34660 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40469,26 +58757,261 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in + let _1 : (Mode.t) = Obj.magic _1 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_expr) = Obj.magic _1 in + let pat : (Parsetree.pattern) = Obj.magic pat in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.module_expr) = -# 1630 "parsing/parser.mly" + let _startpos = _startpos_pat_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern * Mode.t) = let _1 = + let modes = +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 34151 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 34712 "parsing/parser.ml" +||||||| 04da777f7 +# 34707 "parsing/parser.ml" +======= +# 34721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let cty = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 34162 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34723 "parsing/parser.ml" +||||||| 04da777f7 +# 34718 "parsing/parser.ml" +======= +# 34732 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 34167 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 34173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34728 "parsing/parser.ml" +||||||| 04da777f7 +# 34723 "parsing/parser.ml" +======= +# 34737 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 40492 "parsing/parser.ml" +<<<<<<< HEAD +# 34734 "parsing/parser.ml" +||||||| 04da777f7 +# 34729 "parsing/parser.ml" +======= +# 34743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2703 "parsing/parser.mly" +||||||| 04da777f7 +# 2701 "parsing/parser.mly" +======= +# 2691 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 34179 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34740 "parsing/parser.ml" +||||||| 04da777f7 +# 34735 "parsing/parser.ml" +======= +# 34749 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 34189 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34750 "parsing/parser.ml" +||||||| 04da777f7 +# 34745 "parsing/parser.ml" +======= +# 34759 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2704 "parsing/parser.mly" +||||||| 04da777f7 +# 2702 "parsing/parser.mly" +======= +# 2692 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_constraint(pat, cty) ) +<<<<<<< HEAD +# 34195 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34756 "parsing/parser.ml" +||||||| 04da777f7 +# 34751 "parsing/parser.ml" +======= +# 34765 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_inner_type_, _startpos_pat_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 34205 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34766 "parsing/parser.ml" +||||||| 04da777f7 +# 34761 "parsing/parser.ml" +======= +# 34775 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2706 "parsing/parser.mly" +||||||| 04da777f7 +# 2704 "parsing/parser.mly" +======= +# 2694 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, modes) ) +<<<<<<< HEAD +# 34211 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34772 "parsing/parser.ml" +||||||| 04da777f7 +# 34767 "parsing/parser.ml" +======= +# 34781 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2694 "parsing/parser.mly" +||||||| 04da777f7 +# 2692 "parsing/parser.mly" +======= +# 2682 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 34217 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34778 "parsing/parser.ml" +||||||| 04da777f7 +# 34773 "parsing/parser.ml" +======= +# 34787 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40501,9 +59024,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -40512,15 +59035,81 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _1_inlined1 : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.module_type) = -# 1625 "parsing/parser.mly" - ( _1 ) -# 40524 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern * Parsetree.expression) = let exp = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3249 "parsing/parser.mly" +||||||| 04da777f7 +# 3247 "parsing/parser.mly" +======= +# 3237 "parsing/parser.mly" +>>>>>>> origin/main + (_1 Mode.empty) +<<<<<<< HEAD +# 34251 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34812 "parsing/parser.ml" +||||||| 04da777f7 +# 34807 "parsing/parser.ml" +======= +# 34821 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let pat = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3081 "parsing/parser.mly" +||||||| 04da777f7 +# 3079 "parsing/parser.mly" +======= +# 3069 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpatvar ~loc:_sloc _1 ) +<<<<<<< HEAD +# 34261 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34822 "parsing/parser.ml" +||||||| 04da777f7 +# 34817 "parsing/parser.ml" +======= +# 34831 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3209 "parsing/parser.mly" +||||||| 04da777f7 +# 3207 "parsing/parser.mly" +======= +# 3197 "parsing/parser.mly" +>>>>>>> origin/main + ( (pat, exp) ) +<<<<<<< HEAD +# 34267 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34828 "parsing/parser.ml" +||||||| 04da777f7 +# 34823 "parsing/parser.ml" +======= +# 34837 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40532,27 +59121,37 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1650 "parsing/parser.mly" - ( _1 ) -# 40556 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern * Parsetree.expression) = let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +<<<<<<< HEAD +# 3212 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1) ) +# 34856 "parsing/parser.ml" +||||||| 04da777f7 +# 3210 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1) ) +# 34851 "parsing/parser.ml" +======= +# 3200 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, ghexpvar ~loc:_loc _1) ) +<<<<<<< HEAD +# 34295 "parsing/parser.ml" +======= +# 34865 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40565,58 +59164,64 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = exp; + MenhirLib.EngineTypes.startp = _startpos_exp_; + MenhirLib.EngineTypes.endp = _endpos_exp_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = typ; + MenhirLib.EngineTypes.startp = _startpos_typ_; + MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in + let exp : (Parsetree.expression) = Obj.magic exp in + let _4 : unit = Obj.magic _4 in + let typ : (Parsetree.core_type) = Obj.magic typ in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let pat : (Parsetree.pattern) = Obj.magic pat in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = -# 1645 "parsing/parser.mly" - ( _1 ) -# 40588 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1655 "parsing/parser.mly" - ( _1 ) -# 40620 "parsing/parser.ml" + let _startpos = _startpos_pat_ in + let _endpos = _endpos_exp_ in + let _v : (Parsetree.pattern * Parsetree.expression) = +<<<<<<< HEAD +# 3215 "parsing/parser.mly" +||||||| 04da777f7 +# 3213 "parsing/parser.mly" +======= +# 3203 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = (_startpos_pat_, _endpos_typ_) in + (ghpat ~loc (Ppat_constraint(pat, typ)), exp) ) +<<<<<<< HEAD +# 34349 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34910 "parsing/parser.ml" +||||||| 04da777f7 +# 34905 "parsing/parser.ml" +======= +# 34919 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40629,9 +59234,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = exp; + MenhirLib.EngineTypes.startp = _startpos_exp_; + MenhirLib.EngineTypes.endp = _endpos_exp_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -40639,71 +59244,39 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let exp : (Parsetree.expression) = Obj.magic exp in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in - -# 3419 "parsing/parser.mly" - ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 40664 "parsing/parser.ml" - - in - -# 3407 "parsing/parser.mly" - ( _1 ) -# 40670 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.attribute) = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let pat : (Parsetree.pattern) = Obj.magic pat in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = let _1 = -# 3421 "parsing/parser.mly" - ( Pat.attr _1 _2 ) -# 40702 "parsing/parser.ml" - in - -# 3407 "parsing/parser.mly" - ( _1 ) -# 40707 "parsing/parser.ml" + let _startpos = _startpos_pat_ in + let _endpos = _endpos_exp_ in + let _v : (Parsetree.pattern * Parsetree.expression) = +<<<<<<< HEAD +# 3218 "parsing/parser.mly" +||||||| 04da777f7 +# 3216 "parsing/parser.mly" +======= +# 3206 "parsing/parser.mly" +>>>>>>> origin/main + ( (pat, exp) ) +<<<<<<< HEAD +# 34388 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34949 "parsing/parser.ml" +||||||| 04da777f7 +# 34944 "parsing/parser.ml" +======= +# 34958 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40716,24 +59289,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = -# 3423 "parsing/parser.mly" - ( _1 ) -# 40732 "parsing/parser.ml" - in - -# 3407 "parsing/parser.mly" - ( _1 ) -# 40737 "parsing/parser.ml" + let _startpos = _startpos_body_ in + let _endpos = _endpos_body_ in + let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = +<<<<<<< HEAD +# 3222 "parsing/parser.mly" +||||||| 04da777f7 +# 3220 "parsing/parser.mly" +======= +# 3210 "parsing/parser.mly" +>>>>>>> origin/main + ( let let_pat, let_exp = body in + let_pat, let_exp, [] ) +<<<<<<< HEAD +# 34414 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 34975 "parsing/parser.ml" +||||||| 04da777f7 +# 34970 "parsing/parser.ml" +======= +# 34984 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40746,69 +59331,118 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = bindings; + MenhirLib.EngineTypes.startp = _startpos_bindings_; + MenhirLib.EngineTypes.endp = _endpos_bindings_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in + let _1 : ( +# 985 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 34448 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35009 "parsing/parser.ml" +||||||| 04da777f7 +# 35004 "parsing/parser.ml" +======= +# 35018 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 40784 "parsing/parser.ml" - - in - -# 3426 "parsing/parser.mly" - ( Ppat_alias(_1, _3) ) -# 40790 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 40800 "parsing/parser.ml" - - in + let _startpos = _startpos_bindings_ in + let _endpos = _endpos_body_ in + let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = let pbop_op = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3437 "parsing/parser.mly" - ( _1 ) -# 40806 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 34461 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35022 "parsing/parser.ml" +||||||| 04da777f7 +# 35017 "parsing/parser.ml" +======= +# 35031 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_body_ in + let _symbolstartpos = _startpos_bindings_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3407 "parsing/parser.mly" - ( _1 ) -# 40812 "parsing/parser.ml" +<<<<<<< HEAD +# 3225 "parsing/parser.mly" +||||||| 04da777f7 +# 3223 "parsing/parser.mly" +======= +# 3213 "parsing/parser.mly" +>>>>>>> origin/main + ( let let_pat, let_exp, rev_ands = bindings in + let pbop_pat, pbop_exp = body in + let pbop_loc = make_loc _sloc in + let and_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in + let_pat, let_exp, and_ :: rev_ands ) +<<<<<<< HEAD +# 34474 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35035 "parsing/parser.ml" +||||||| 04da777f7 +# 35030 "parsing/parser.ml" +======= +# 35044 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_declaration list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 34492 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35053 "parsing/parser.ml" +||||||| 04da777f7 +# 35048 "parsing/parser.ml" +======= +# 35062 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40821,59 +59455,198 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.class_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.class_expr) = Obj.magic body in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 34558 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35119 "parsing/parser.ml" +||||||| 04da777f7 +# 35114 "parsing/parser.ml" +======= +# 35128 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3428 "parsing/parser.mly" - ( expecting _loc__3_ "identifier" ) -# 40855 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.class_declaration list) = let x = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 34573 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35134 "parsing/parser.ml" +||||||| 04da777f7 +# 35129 "parsing/parser.ml" +======= +# 35143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 40865 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 34585 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35146 "parsing/parser.ml" +||||||| 04da777f7 +# 35141 "parsing/parser.ml" +======= +# 35155 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - -# 3437 "parsing/parser.mly" + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 40871 "parsing/parser.ml" +# 34593 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35154 "parsing/parser.ml" +||||||| 04da777f7 +# 35149 "parsing/parser.ml" +======= +# 35163 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2233 "parsing/parser.mly" +||||||| 04da777f7 +# 2231 "parsing/parser.mly" +======= +# 2221 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Ci.mk id body ~virt ~params ~attrs ~loc ~text ~docs + ) +<<<<<<< HEAD +# 34608 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35169 "parsing/parser.ml" +||||||| 04da777f7 +# 35164 "parsing/parser.ml" +======= +# 35178 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3407 "parsing/parser.mly" - ( _1 ) -# 40877 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 34614 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35175 "parsing/parser.ml" +||||||| 04da777f7 +# 35170 "parsing/parser.ml" +======= +# 35184 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40884,43 +59657,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = -# 3430 "parsing/parser.mly" - ( Ppat_tuple(List.rev _1) ) -# 40904 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 40912 "parsing/parser.ml" - - in - -# 3437 "parsing/parser.mly" - ( _1 ) -# 40918 "parsing/parser.ml" - - in - -# 3407 "parsing/parser.mly" - ( _1 ) -# 40924 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_description list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 34632 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35193 "parsing/parser.ml" +||||||| 04da777f7 +# 35188 "parsing/parser.ml" +======= +# 35202 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40933,59 +59687,233 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.class_description list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let cty : (Parsetree.class_type) = Obj.magic cty in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 34705 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35266 "parsing/parser.ml" +||||||| 04da777f7 +# 35261 "parsing/parser.ml" +======= +# 35275 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3432 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 40967 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.class_description list) = let x = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 34720 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35281 "parsing/parser.ml" +||||||| 04da777f7 +# 35276 "parsing/parser.ml" +======= +# 35290 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 40977 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 34732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35293 "parsing/parser.ml" +||||||| 04da777f7 +# 35288 "parsing/parser.ml" +======= +# 35302 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - -# 3437 "parsing/parser.mly" + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 40983 "parsing/parser.ml" +# 34740 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35301 "parsing/parser.ml" +||||||| 04da777f7 +# 35296 "parsing/parser.ml" +======= +# 35310 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2524 "parsing/parser.mly" +||||||| 04da777f7 +# 2522 "parsing/parser.mly" +======= +# 2512 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Ci.mk id cty ~virt ~params ~attrs ~loc ~text ~docs + ) +<<<<<<< HEAD +# 34755 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35316 "parsing/parser.ml" +||||||| 04da777f7 +# 35311 "parsing/parser.ml" +======= +# 35325 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3407 "parsing/parser.mly" - ( _1 ) -# 40989 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 34761 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35322 "parsing/parser.ml" +||||||| 04da777f7 +# 35317 "parsing/parser.ml" +======= +# 35331 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_type_declaration list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 34779 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35340 "parsing/parser.ml" +||||||| 04da777f7 +# 35335 "parsing/parser.ml" +======= +# 35349 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40998,56 +59926,205 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = csig; + MenhirLib.EngineTypes.startp = _startpos_csig_; + MenhirLib.EngineTypes.endp = _endpos_csig_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.class_type_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let csig : (Parsetree.class_type) = Obj.magic csig in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 34852 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35413 "parsing/parser.ml" +||||||| 04da777f7 +# 35408 "parsing/parser.ml" +======= +# 35422 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = -# 3434 "parsing/parser.mly" - ( Ppat_or(_1, _3) ) -# 41030 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.class_type_declaration list) = let x = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 34867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35428 "parsing/parser.ml" +||||||| 04da777f7 +# 35423 "parsing/parser.ml" +======= +# 35437 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 41039 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 34879 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35440 "parsing/parser.ml" +||||||| 04da777f7 +# 35435 "parsing/parser.ml" +======= +# 35449 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 34887 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35448 "parsing/parser.ml" +||||||| 04da777f7 +# 35443 "parsing/parser.ml" +======= +# 35457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3437 "parsing/parser.mly" - ( _1 ) -# 41045 "parsing/parser.ml" +<<<<<<< HEAD +# 2563 "parsing/parser.mly" +||||||| 04da777f7 +# 2561 "parsing/parser.mly" +======= +# 2551 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Ci.mk id csig ~virt ~params ~attrs ~loc ~text ~docs + ) +<<<<<<< HEAD +# 34902 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35463 "parsing/parser.ml" +||||||| 04da777f7 +# 35458 "parsing/parser.ml" +======= +# 35472 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3407 "parsing/parser.mly" - ( _1 ) -# 41051 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 34908 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35469 "parsing/parser.ml" +||||||| 04da777f7 +# 35464 "parsing/parser.ml" +======= +# 35478 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41058,61 +60135,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3436 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 41094 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 41104 "parsing/parser.ml" - - in - -# 3437 "parsing/parser.mly" - ( _1 ) -# 41110 "parsing/parser.ml" - - in - -# 3407 "parsing/parser.mly" - ( _1 ) -# 41116 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.module_binding list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 34926 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35487 "parsing/parser.ml" +||||||| 04da777f7 +# 35482 "parsing/parser.ml" +======= +# 35496 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41125,59 +60165,170 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let xs : (Parsetree.module_binding list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.module_expr) = Obj.magic body in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.module_binding list) = let x = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 34989 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35550 "parsing/parser.ml" +||||||| 04da777f7 +# 35545 "parsing/parser.ml" +======= +# 35559 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 35001 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35562 "parsing/parser.ml" +||||||| 04da777f7 +# 35557 "parsing/parser.ml" +======= +# 35571 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 41166 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 35009 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35570 "parsing/parser.ml" +||||||| 04da777f7 +# 35565 "parsing/parser.ml" +======= +# 35579 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 41172 "parsing/parser.ml" +<<<<<<< HEAD +# 1863 "parsing/parser.mly" +||||||| 04da777f7 +# 1862 "parsing/parser.mly" +======= +# 1852 "parsing/parser.mly" +>>>>>>> origin/main + ( + let loc = make_loc _sloc in + let attrs = attrs1 @ attrs2 in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Mb.mk name body ~attrs ~loc ~text ~docs + ) +<<<<<<< HEAD +# 35024 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35585 "parsing/parser.ml" +||||||| 04da777f7 +# 35580 "parsing/parser.ml" +======= +# 35594 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3409 "parsing/parser.mly" - ( mkpat_attrs ~loc:_sloc (Ppat_exception _3) _2) -# 41181 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35030 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35591 "parsing/parser.ml" +||||||| 04da777f7 +# 35586 "parsing/parser.ml" +======= +# 35600 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41188,35 +60339,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3541 "parsing/parser.mly" - ( _3 :: _1 ) -# 41220 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.module_declaration list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35048 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35609 "parsing/parser.ml" +||||||| 04da777f7 +# 35604 "parsing/parser.ml" +======= +# 35618 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41229,33 +60369,177 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.module_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3542 "parsing/parser.mly" - ( [_3; _1] ) -# 41259 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v : (Parsetree.module_declaration list) = let x = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 35118 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35679 "parsing/parser.ml" +||||||| 04da777f7 +# 35674 "parsing/parser.ml" +======= +# 35688 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 35130 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35691 "parsing/parser.ml" +||||||| 04da777f7 +# 35686 "parsing/parser.ml" +======= +# 35700 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 35138 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35699 "parsing/parser.ml" +||||||| 04da777f7 +# 35694 "parsing/parser.ml" +======= +# 35708 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2174 "parsing/parser.mly" +||||||| 04da777f7 +# 2172 "parsing/parser.mly" +======= +# 2162 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let docs = symbol_docs _sloc in + let loc = make_loc _sloc in + let text = symbol_text _symbolstartpos in + Md.mk name mty ~attrs ~loc ~text ~docs + ) +<<<<<<< HEAD +# 35153 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35714 "parsing/parser.ml" +||||||| 04da777f7 +# 35709 "parsing/parser.ml" +======= +# 35723 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35159 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35720 "parsing/parser.ml" +||||||| 04da777f7 +# 35715 "parsing/parser.ml" +======= +# 35729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41266,36 +60550,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3543 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 41299 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.attributes) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35738 "parsing/parser.ml" +||||||| 04da777f7 +# 35733 "parsing/parser.ml" +======= +# 35747 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41308,33 +60580,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in + let xs : (Parsetree.attributes) = Obj.magic xs in + let x : (Parsetree.attribute) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3541 "parsing/parser.mly" - ( _3 :: _1 ) -# 41338 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.attributes) = +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35209 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35770 "parsing/parser.ml" +||||||| 04da777f7 +# 35765 "parsing/parser.ml" +======= +# 35779 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41345,35 +60620,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3542 "parsing/parser.mly" - ( [_3; _1] ) -# 41377 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.type_declaration list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35227 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35788 "parsing/parser.ml" +||||||| 04da777f7 +# 35783 "parsing/parser.ml" +======= +# 35797 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41386,119 +60650,291 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3543 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 41417 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = -# 3442 "parsing/parser.mly" - ( _1 ) -# 41442 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = kind_priv_manifest; + MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; + MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.type_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs_inlined1 in + let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in + let jkind : (Jane_syntax.Jkind.annotation option) = Obj.magic jkind in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 35301 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35862 "parsing/parser.ml" +||||||| 04da777f7 +# 35857 "parsing/parser.ml" +======= +# 35871 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.type_declaration list) = let x = + let xs = xs_inlined1 in + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 35316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35877 "parsing/parser.ml" +||||||| 04da777f7 +# 35872 "parsing/parser.ml" +======= +# 35886 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let cstrs = let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 35325 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35886 "parsing/parser.ml" +||||||| 04da777f7 +# 35881 "parsing/parser.ml" +======= +# 35895 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in # 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 41480 "parsing/parser.ml" + ( xs ) +<<<<<<< HEAD +# 35330 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35891 "parsing/parser.ml" +||||||| 04da777f7 +# 35886 "parsing/parser.ml" +======= +# 35900 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3445 "parsing/parser.mly" - ( Ppat_construct(_1, Some ([], _2)) ) -# 41486 "parsing/parser.ml" +<<<<<<< HEAD +# 3827 "parsing/parser.mly" +||||||| 04da777f7 +# 3825 "parsing/parser.mly" +======= +# 3816 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35897 "parsing/parser.ml" +||||||| 04da777f7 +# 35892 "parsing/parser.ml" +======= +# 35906 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 35347 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35908 "parsing/parser.ml" +||||||| 04da777f7 +# 35903 "parsing/parser.ml" +======= +# 35917 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 35355 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35916 "parsing/parser.ml" +||||||| 04da777f7 +# 35911 "parsing/parser.ml" +======= +# 35925 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 41496 "parsing/parser.ml" +<<<<<<< HEAD +# 3815 "parsing/parser.mly" +||||||| 04da777f7 +# 3813 "parsing/parser.mly" +======= +# 3804 "parsing/parser.mly" +>>>>>>> origin/main + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let text = symbol_text _symbolstartpos in + Jane_syntax.Layouts.type_declaration_of + id ~params ~jkind ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:(Some text) + ) +<<<<<<< HEAD +# 35372 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35933 "parsing/parser.ml" +||||||| 04da777f7 +# 35928 "parsing/parser.ml" +======= +# 35942 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3451 "parsing/parser.mly" - ( _1 ) -# 41502 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35378 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35939 "parsing/parser.ml" +||||||| 04da777f7 +# 35934 "parsing/parser.ml" +======= +# 35948 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.type_declaration list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35396 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 35957 "parsing/parser.ml" +||||||| 04da777f7 +# 35952 "parsing/parser.ml" +======= +# 35966 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41511,87 +60947,319 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; }; }; } = _menhir_stack in - let pat : (Parsetree.pattern) = Obj.magic pat in - let _5 : unit = Obj.magic _5 in - let xs : (string Location.loc list) = Obj.magic xs in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.type_declaration list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs_inlined1 in + let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let jkind : (Jane_syntax.Jkind.annotation option) = Obj.magic jkind in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 35477 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36038 "parsing/parser.ml" +||||||| 04da777f7 +# 36033 "parsing/parser.ml" +======= +# 36047 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_pat_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let newtypes = -# 3121 "parsing/parser.mly" - ( xs ) -# 41564 "parsing/parser.ml" - in - let constr = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.type_declaration list) = let x = + let xs = xs_inlined1 in + let attrs2 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 35492 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 36053 "parsing/parser.ml" +||||||| 04da777f7 +# 36048 "parsing/parser.ml" +======= +# 36062 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let cstrs = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 35501 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36062 "parsing/parser.ml" +||||||| 04da777f7 +# 36057 "parsing/parser.ml" +======= +# 36071 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in # 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 41573 "parsing/parser.ml" + ( xs ) +<<<<<<< HEAD +# 35506 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36067 "parsing/parser.ml" +||||||| 04da777f7 +# 36062 "parsing/parser.ml" +======= +# 36076 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3448 "parsing/parser.mly" - ( Ppat_construct(constr, Some (newtypes, pat)) ) -# 41579 "parsing/parser.ml" +<<<<<<< HEAD +# 3827 "parsing/parser.mly" +||||||| 04da777f7 +# 3825 "parsing/parser.mly" +======= +# 3816 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35512 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36073 "parsing/parser.ml" +||||||| 04da777f7 +# 36068 "parsing/parser.ml" +======= +# 36082 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos_pat_ in - let _endpos = _endpos__1_ in + let kind_priv_manifest = +<<<<<<< HEAD +# 3862 "parsing/parser.mly" +||||||| 04da777f7 +# 3860 "parsing/parser.mly" +======= +# 3851 "parsing/parser.mly" +>>>>>>> origin/main + ( _2 ) +<<<<<<< HEAD +# 35518 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36079 "parsing/parser.ml" +||||||| 04da777f7 +# 36074 "parsing/parser.ml" +======= +# 36088 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 35528 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36089 "parsing/parser.ml" +||||||| 04da777f7 +# 36084 "parsing/parser.ml" +======= +# 36098 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 35536 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 36097 "parsing/parser.ml" +||||||| 04da777f7 +# 36092 "parsing/parser.ml" +======= +# 36106 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 41589 "parsing/parser.ml" +<<<<<<< HEAD +# 3815 "parsing/parser.mly" +||||||| 04da777f7 +# 3813 "parsing/parser.mly" +======= +# 3804 "parsing/parser.mly" +>>>>>>> origin/main + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let text = symbol_text _symbolstartpos in + Jane_syntax.Layouts.type_declaration_of + id ~params ~jkind ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:(Some text) + ) +<<<<<<< HEAD +# 35553 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36114 "parsing/parser.ml" +||||||| 04da777f7 +# 36109 "parsing/parser.ml" +======= +# 36123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3451 "parsing/parser.mly" - ( _1 ) -# 41595 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36120 "parsing/parser.ml" +||||||| 04da777f7 +# 36115 "parsing/parser.ml" +======= +# 36129 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.attributes) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35577 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36138 "parsing/parser.ml" +||||||| 04da777f7 +# 36133 "parsing/parser.ml" +======= +# 36147 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41604,42 +61272,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in - let _1 : (string) = Obj.magic _1 in + let xs : (Parsetree.attributes) = Obj.magic xs in + let x : (Parsetree.attribute) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 3450 "parsing/parser.mly" - ( Ppat_variant(_1, Some _2) ) -# 41628 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 41637 "parsing/parser.ml" - - in - -# 3451 "parsing/parser.mly" - ( _1 ) -# 41643 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.attributes) = +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35609 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36170 "parsing/parser.ml" +||||||| 04da777f7 +# 36165 "parsing/parser.ml" +======= +# 36179 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41650,61 +61312,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 41693 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 41699 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3453 "parsing/parser.mly" - ( mkpat_attrs ~loc:_sloc (Ppat_lazy _3) _2) -# 41708 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.signature_item list list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35627 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36188 "parsing/parser.ml" +||||||| 04da777f7 +# 36183 "parsing/parser.ml" +======= +# 36197 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41717,44 +61342,77 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.signature_item list list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.signature_item list list) = let x = + let _1 = + let _startpos = _startpos__1_ in + +# 1205 "parsing/parser.mly" + ( text_sig _startpos ) +<<<<<<< HEAD +# 35662 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36223 "parsing/parser.ml" +||||||| 04da777f7 +# 36218 "parsing/parser.ml" +======= +# 36232 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 3419 "parsing/parser.mly" - ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 41752 "parsing/parser.ml" +<<<<<<< HEAD +# 2016 "parsing/parser.mly" +||||||| 04da777f7 +# 2015 "parsing/parser.mly" +======= +# 2005 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 35668 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36229 "parsing/parser.ml" +||||||| 04da777f7 +# 36224 "parsing/parser.ml" +======= +# 36238 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3414 "parsing/parser.mly" - ( _1 ) -# 41758 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35674 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36235 "parsing/parser.ml" +||||||| 04da777f7 +# 36230 "parsing/parser.ml" +======= +# 36244 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41767,9 +61425,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -41778,20 +61436,66 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : (Parsetree.attribute) = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.signature_item list list) = Obj.magic xs in + let _1 : (Parsetree.signature_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = let _1 = -# 3421 "parsing/parser.mly" - ( Pat.attr _1 _2 ) -# 41790 "parsing/parser.ml" - in - -# 3414 "parsing/parser.mly" + let _endpos = _endpos_xs_ in + let _v : (Parsetree.signature_item list list) = let x = + let _1 = + let _startpos = _startpos__1_ in + +# 1203 "parsing/parser.mly" + ( text_sig _startpos @ [_1] ) +<<<<<<< HEAD +# 35709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36270 "parsing/parser.ml" +||||||| 04da777f7 +# 36265 "parsing/parser.ml" +======= +# 36279 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2016 "parsing/parser.mly" +||||||| 04da777f7 +# 2015 "parsing/parser.mly" +======= +# 2005 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 41795 "parsing/parser.ml" +<<<<<<< HEAD +# 35715 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36276 "parsing/parser.ml" +||||||| 04da777f7 +# 36271 "parsing/parser.ml" +======= +# 36285 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35721 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36282 "parsing/parser.ml" +||||||| 04da777f7 +# 36277 "parsing/parser.ml" +======= +# 36291 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41802,26 +61506,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = -# 3423 "parsing/parser.mly" - ( _1 ) -# 41820 "parsing/parser.ml" - in - -# 3414 "parsing/parser.mly" - ( _1 ) -# 41825 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.structure_item list list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35739 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36300 "parsing/parser.ml" +||||||| 04da777f7 +# 36295 "parsing/parser.ml" +======= +# 36309 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41834,69 +61536,120 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.structure_item list list) = let x = let _1 = - let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 41872 "parsing/parser.ml" - - in + let ys = + let items = +# 1268 "parsing/parser.mly" + ( [] ) +<<<<<<< HEAD +# 35774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36335 "parsing/parser.ml" +||||||| 04da777f7 +# 36330 "parsing/parser.ml" +======= +# 36344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 3426 "parsing/parser.mly" - ( Ppat_alias(_1, _3) ) -# 41878 "parsing/parser.ml" +# 1718 "parsing/parser.mly" + ( items ) +<<<<<<< HEAD +# 35779 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36340 "parsing/parser.ml" +||||||| 04da777f7 +# 36335 "parsing/parser.ml" +======= +# 36349 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let xs = + let _startpos = _startpos__1_ in + +# 1201 "parsing/parser.mly" + ( text_str _startpos ) +<<<<<<< HEAD +# 35787 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36348 "parsing/parser.ml" +||||||| 04da777f7 +# 36343 "parsing/parser.ml" +======= +# 36357 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__1_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 41888 "parsing/parser.ml" +# 267 "" + ( xs @ ys ) +<<<<<<< HEAD +# 35793 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36354 "parsing/parser.ml" +||||||| 04da777f7 +# 36349 "parsing/parser.ml" +======= +# 36363 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3437 "parsing/parser.mly" - ( _1 ) -# 41894 "parsing/parser.ml" +# 1734 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 35799 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36360 "parsing/parser.ml" +||||||| 04da777f7 +# 36355 "parsing/parser.ml" +======= +# 36369 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3414 "parsing/parser.mly" - ( _1 ) -# 41900 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35805 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36366 "parsing/parser.ml" +||||||| 04da777f7 +# 36361 "parsing/parser.ml" +======= +# 36375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41909,106 +61662,217 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = e; + MenhirLib.EngineTypes.startp = _startpos_e_; + MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let e : (Parsetree.expression) = Obj.magic e in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.structure_item list list) = let x = let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let ys = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + let items = + let x = + let _1 = + let _1 = + let attrs = +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 35859 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 36420 "parsing/parser.ml" +||||||| 04da777f7 +# 36415 "parsing/parser.ml" +======= +# 36429 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1725 "parsing/parser.mly" + ( mkstrexp e attrs ) +<<<<<<< HEAD +# 35864 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36425 "parsing/parser.ml" +||||||| 04da777f7 +# 36420 "parsing/parser.ml" +======= +# 36434 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__1_ = _startpos_e_ in + let _startpos = _startpos__1_ in + +# 1199 "parsing/parser.mly" + ( text_str _startpos @ [_1] ) +<<<<<<< HEAD +# 35872 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36433 "parsing/parser.ml" +||||||| 04da777f7 +# 36428 "parsing/parser.ml" +======= +# 36442 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__1_ = _startpos_e_ in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + +# 1218 "parsing/parser.mly" + ( mark_rhs_docs _startpos _endpos; + _1 ) +<<<<<<< HEAD +# 35882 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36443 "parsing/parser.ml" +||||||| 04da777f7 +# 36438 "parsing/parser.ml" +======= +# 36452 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1270 "parsing/parser.mly" + ( x ) +<<<<<<< HEAD +# 35888 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36449 "parsing/parser.ml" +||||||| 04da777f7 +# 36444 "parsing/parser.ml" +======= +# 36458 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 3428 "parsing/parser.mly" - ( expecting _loc__3_ "identifier" ) -# 41943 "parsing/parser.ml" +# 1718 "parsing/parser.mly" + ( items ) +<<<<<<< HEAD +# 35894 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36455 "parsing/parser.ml" +||||||| 04da777f7 +# 36450 "parsing/parser.ml" +======= +# 36464 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let xs = + let _startpos = _startpos__1_ in + +# 1201 "parsing/parser.mly" + ( text_str _startpos ) +<<<<<<< HEAD +# 35902 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36463 "parsing/parser.ml" +||||||| 04da777f7 +# 36458 "parsing/parser.ml" +======= +# 36472 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 41953 "parsing/parser.ml" +# 267 "" + ( xs @ ys ) +<<<<<<< HEAD +# 35908 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36469 "parsing/parser.ml" +||||||| 04da777f7 +# 36464 "parsing/parser.ml" +======= +# 36478 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3437 "parsing/parser.mly" - ( _1 ) -# 41959 "parsing/parser.ml" - - in - -# 3414 "parsing/parser.mly" +# 1734 "parsing/parser.mly" ( _1 ) -# 41965 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = -# 3430 "parsing/parser.mly" - ( Ppat_tuple(List.rev _1) ) -# 41992 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 42000 "parsing/parser.ml" - - in - -# 3437 "parsing/parser.mly" - ( _1 ) -# 42006 "parsing/parser.ml" +<<<<<<< HEAD +# 35914 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36475 "parsing/parser.ml" +||||||| 04da777f7 +# 36470 "parsing/parser.ml" +======= +# 36484 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3414 "parsing/parser.mly" - ( _1 ) -# 42012 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35920 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36481 "parsing/parser.ml" +||||||| 04da777f7 +# 36476 "parsing/parser.ml" +======= +# 36490 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42021,59 +61885,71 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1 : (Parsetree.structure_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.structure_item list list) = let x = let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3432 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 42055 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos__1_ in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 42065 "parsing/parser.ml" +# 1199 "parsing/parser.mly" + ( text_str _startpos @ [_1] ) +<<<<<<< HEAD +# 35955 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36516 "parsing/parser.ml" +||||||| 04da777f7 +# 36511 "parsing/parser.ml" +======= +# 36525 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3437 "parsing/parser.mly" - ( _1 ) -# 42071 "parsing/parser.ml" +# 1734 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 35961 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36522 "parsing/parser.ml" +||||||| 04da777f7 +# 36517 "parsing/parser.ml" +======= +# 36531 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3414 "parsing/parser.mly" - ( _1 ) -# 42077 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 35967 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36528 "parsing/parser.ml" +||||||| 04da777f7 +# 36523 "parsing/parser.ml" +======= +# 36537 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42084,58 +61960,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = -# 3434 "parsing/parser.mly" - ( Ppat_or(_1, _3) ) -# 42118 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 42127 "parsing/parser.ml" - - in - -# 3437 "parsing/parser.mly" - ( _1 ) -# 42133 "parsing/parser.ml" - - in - -# 3414 "parsing/parser.mly" - ( _1 ) -# 42139 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_type_field list list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 35985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36546 "parsing/parser.ml" +||||||| 04da777f7 +# 36541 "parsing/parser.ml" +======= +# 36555 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42148,59 +61990,54 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.class_type_field list list) = Obj.magic xs in + let _1 : (Parsetree.class_type_field) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3436 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 42182 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 42192 "parsing/parser.ml" - - in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.class_type_field list list) = let x = + let _startpos = _startpos__1_ in -# 3437 "parsing/parser.mly" - ( _1 ) -# 42198 "parsing/parser.ml" +# 1213 "parsing/parser.mly" + ( text_csig _startpos @ [_1] ) +<<<<<<< HEAD +# 36019 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36580 "parsing/parser.ml" +||||||| 04da777f7 +# 36575 "parsing/parser.ml" +======= +# 36589 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3414 "parsing/parser.mly" - ( _1 ) -# 42204 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 36025 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36586 "parsing/parser.ml" +||||||| 04da777f7 +# 36581 "parsing/parser.ml" +======= +# 36595 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42211,52 +62048,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 42225 "parsing/parser.ml" - ) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 42239 "parsing/parser.ml" - - in - -# 2702 "parsing/parser.mly" - ( Ppat_var _1 ) -# 42245 "parsing/parser.ml" - - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 42254 "parsing/parser.ml" - - in - -# 2704 "parsing/parser.mly" - ( _1 ) -# 42260 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_field list list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 36043 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36604 "parsing/parser.ml" +||||||| 04da777f7 +# 36599 "parsing/parser.ml" +======= +# 36613 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42268,35 +62077,55 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.class_field list list) = Obj.magic xs in + let _1 : (Parsetree.class_field) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 2703 "parsing/parser.mly" - ( Ppat_any ) -# 42286 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.class_field list list) = let x = + let _startpos = _startpos__1_ in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 42294 "parsing/parser.ml" +# 1211 "parsing/parser.mly" + ( text_cstr _startpos @ [_1] ) +<<<<<<< HEAD +# 36077 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36638 "parsing/parser.ml" +||||||| 04da777f7 +# 36633 "parsing/parser.ml" +======= +# 36647 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2704 "parsing/parser.mly" - ( _1 ) -# 42300 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 36083 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36644 "parsing/parser.ml" +||||||| 04da777f7 +# 36639 "parsing/parser.ml" +======= +# 36653 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42307,21 +62136,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.structure) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.payload) = -# 4752 "parsing/parser.mly" - ( PStr _1 ) -# 42325 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.structure_item list list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 36101 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36662 "parsing/parser.ml" +||||||| 04da777f7 +# 36657 "parsing/parser.ml" +======= +# 36671 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42334,9 +62166,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -42345,15 +62177,43 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : (Parsetree.signature) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1 : (Parsetree.structure_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.payload) = -# 4753 "parsing/parser.mly" - ( PSig _2 ) -# 42357 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v : (Parsetree.structure_item list list) = let x = + let _startpos = _startpos__1_ in + +# 1199 "parsing/parser.mly" + ( text_str _startpos @ [_1] ) +<<<<<<< HEAD +# 36135 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36696 "parsing/parser.ml" +||||||| 04da777f7 +# 36691 "parsing/parser.ml" +======= +# 36705 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 36141 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36702 "parsing/parser.ml" +||||||| 04da777f7 +# 36697 "parsing/parser.ml" +======= +# 36711 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42364,28 +62224,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.core_type) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.payload) = -# 4754 "parsing/parser.mly" - ( PTyp _2 ) -# 42389 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.toplevel_phrase list list) = +# 211 "" + ( [] ) +<<<<<<< HEAD +# 36159 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36720 "parsing/parser.ml" +||||||| 04da777f7 +# 36715 "parsing/parser.ml" +======= +# 36729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42398,9 +62254,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -42409,15 +62265,91 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.payload) = -# 4755 "parsing/parser.mly" - ( PPat (_2, None) ) -# 42421 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v : (Parsetree.toplevel_phrase list list) = let x = + let _1 = + let x = + let _1 = +# 1268 "parsing/parser.mly" + ( [] ) +<<<<<<< HEAD +# 36194 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36755 "parsing/parser.ml" +||||||| 04da777f7 +# 36750 "parsing/parser.ml" +======= +# 36764 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1520 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 36199 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36760 "parsing/parser.ml" +||||||| 04da777f7 +# 36755 "parsing/parser.ml" +======= +# 36769 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 183 "" + ( x ) +<<<<<<< HEAD +# 36205 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36766 "parsing/parser.ml" +||||||| 04da777f7 +# 36761 "parsing/parser.ml" +======= +# 36775 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1532 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 36211 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36772 "parsing/parser.ml" +||||||| 04da777f7 +# 36767 "parsing/parser.ml" +======= +# 36781 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 36217 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36778 "parsing/parser.ml" +||||||| 04da777f7 +# 36773 "parsing/parser.ml" +======= +# 36787 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42430,19 +62362,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = e; + MenhirLib.EngineTypes.startp = _startpos_e_; + MenhirLib.EngineTypes.endp = _endpos_e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -42453,17 +62385,172 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let e : (Parsetree.expression) = Obj.magic e in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.payload) = -# 4756 "parsing/parser.mly" - ( PPat (_2, Some _4) ) -# 42467 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v : (Parsetree.toplevel_phrase list list) = let x = + let _1 = + let x = + let _1 = _1_inlined1 in + let _1 = + let x = + let _1 = + let _1 = + let attrs = +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 36271 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 36832 "parsing/parser.ml" +||||||| 04da777f7 +# 36827 "parsing/parser.ml" +======= +# 36841 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1725 "parsing/parser.mly" + ( mkstrexp e attrs ) +<<<<<<< HEAD +# 36276 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36837 "parsing/parser.ml" +||||||| 04da777f7 +# 36832 "parsing/parser.ml" +======= +# 36846 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1209 "parsing/parser.mly" + ( Ptop_def [_1] ) +<<<<<<< HEAD +# 36282 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36843 "parsing/parser.ml" +||||||| 04da777f7 +# 36838 "parsing/parser.ml" +======= +# 36852 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__1_ = _startpos_e_ in + let _startpos = _startpos__1_ in + +# 1207 "parsing/parser.mly" + ( text_def _startpos @ [_1] ) +<<<<<<< HEAD +# 36290 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36851 "parsing/parser.ml" +||||||| 04da777f7 +# 36846 "parsing/parser.ml" +======= +# 36860 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1270 "parsing/parser.mly" + ( x ) +<<<<<<< HEAD +# 36296 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36857 "parsing/parser.ml" +||||||| 04da777f7 +# 36852 "parsing/parser.ml" +======= +# 36866 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1520 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 36302 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36863 "parsing/parser.ml" +||||||| 04da777f7 +# 36858 "parsing/parser.ml" +======= +# 36872 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 183 "" + ( x ) +<<<<<<< HEAD +# 36308 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36869 "parsing/parser.ml" +||||||| 04da777f7 +# 36864 "parsing/parser.ml" +======= +# 36878 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1532 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 36314 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36875 "parsing/parser.ml" +||||||| 04da777f7 +# 36870 "parsing/parser.ml" +======= +# 36884 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 36320 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36881 "parsing/parser.ml" +||||||| 04da777f7 +# 36876 "parsing/parser.ml" +======= +# 36890 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42475,20 +62562,87 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in + let _1 : (Parsetree.structure_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.core_type) = -# 4051 "parsing/parser.mly" - ( _1 ) -# 42492 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v : (Parsetree.toplevel_phrase list list) = let x = + let _1 = + let _1 = +# 1209 "parsing/parser.mly" + ( Ptop_def [_1] ) +<<<<<<< HEAD +# 36354 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36915 "parsing/parser.ml" +||||||| 04da777f7 +# 36910 "parsing/parser.ml" +======= +# 36924 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _startpos = _startpos__1_ in + +# 1207 "parsing/parser.mly" + ( text_def _startpos @ [_1] ) +<<<<<<< HEAD +# 36360 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36921 "parsing/parser.ml" +||||||| 04da777f7 +# 36916 "parsing/parser.ml" +======= +# 36930 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1532 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 36366 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36927 "parsing/parser.ml" +||||||| 04da777f7 +# 36922 "parsing/parser.ml" +======= +# 36936 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 36372 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36933 "parsing/parser.ml" +||||||| 04da777f7 +# 36928 "parsing/parser.ml" +======= +# 36942 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42501,95 +62655,91 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : (Parsetree.core_type) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in + let _1 : (Parsetree.toplevel_phrase) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.core_type) = let _1 = + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.toplevel_phrase list list) = let x = let _1 = let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 42534 "parsing/parser.ml" - in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in -# 1387 "parsing/parser.mly" - ( xs ) -# 42539 "parsing/parser.ml" +# 1218 "parsing/parser.mly" + ( mark_rhs_docs _startpos _endpos; + _1 ) +<<<<<<< HEAD +# 36410 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36971 "parsing/parser.ml" +||||||| 04da777f7 +# 36966 "parsing/parser.ml" +======= +# 36980 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos = _startpos__1_ in -# 4043 "parsing/parser.mly" - ( _1 ) -# 42545 "parsing/parser.ml" +# 1207 "parsing/parser.mly" + ( text_def _startpos @ [_1] ) +<<<<<<< HEAD +# 36417 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36978 "parsing/parser.ml" +||||||| 04da777f7 +# 36973 "parsing/parser.ml" +======= +# 36987 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4047 "parsing/parser.mly" - ( (_1, _3) ) -# 42551 "parsing/parser.ml" +# 1532 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 36423 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36984 "parsing/parser.ml" +||||||| 04da777f7 +# 36979 "parsing/parser.ml" +======= +# 36993 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4053 "parsing/parser.mly" - ( let bound_vars, inner_type = _1 in - Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) - (Ltyp_poly { bound_vars; inner_type }) ) -# 42563 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.core_type) = let _1 = -# 4084 "parsing/parser.mly" - ( _1 ) -# 42588 "parsing/parser.ml" - in -# 4051 "parsing/parser.mly" - ( _1 ) -# 42593 "parsing/parser.ml" +# 213 "" + ( x :: xs ) +<<<<<<< HEAD +# 36429 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 36990 "parsing/parser.ml" +||||||| 04da777f7 +# 36985 "parsing/parser.ml" +======= +# 36999 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42602,70 +62752,117 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.core_type) = let _1 = - let _3 = -# 4084 "parsing/parser.mly" - ( _1 ) -# 42633 "parsing/parser.ml" - in - let _1 = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 42640 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 42645 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 36468 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37029 "parsing/parser.ml" +||||||| 04da777f7 +# 37024 "parsing/parser.ml" +======= +# 37038 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4043 "parsing/parser.mly" - ( _1 ) -# 42651 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 36478 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37039 "parsing/parser.ml" +||||||| 04da777f7 +# 37034 "parsing/parser.ml" +======= +# 37048 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4047 "parsing/parser.mly" - ( (_1, _3) ) -# 42657 "parsing/parser.ml" +<<<<<<< HEAD +# 3696 "parsing/parser.mly" +||||||| 04da777f7 +# 3694 "parsing/parser.mly" +======= +# 3685 "parsing/parser.mly" +>>>>>>> origin/main + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +<<<<<<< HEAD +# 36500 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37061 "parsing/parser.ml" +||||||| 04da777f7 +# 37056 "parsing/parser.ml" +======= +# 37070 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _startpos__1_ = _startpos_xs_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 4053 "parsing/parser.mly" - ( let bound_vars, inner_type = _1 in - Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) - (Ltyp_poly { bound_vars; inner_type }) ) -# 42669 "parsing/parser.ml" +# 1457 "parsing/parser.mly" + ( [x], None ) +<<<<<<< HEAD +# 36506 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37067 "parsing/parser.ml" +||||||| 04da777f7 +# 37062 "parsing/parser.ml" +======= +# 37076 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42678,19 +62875,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -42701,20 +62898,101 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.payload) = Obj.magic _3 in - let _2 : (Ast_helper.str) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let x : unit = Obj.magic x in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.attribute) = let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_x_ in + let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 36552 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37113 "parsing/parser.ml" +||||||| 04da777f7 +# 37108 "parsing/parser.ml" +======= +# 37122 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 36562 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37123 "parsing/parser.ml" +||||||| 04da777f7 +# 37118 "parsing/parser.ml" +======= +# 37132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3696 "parsing/parser.mly" +||||||| 04da777f7 +# 3694 "parsing/parser.mly" +======= +# 3685 "parsing/parser.mly" +>>>>>>> origin/main + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +<<<<<<< HEAD +# 36584 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37145 "parsing/parser.ml" +||||||| 04da777f7 +# 37140 "parsing/parser.ml" +======= +# 37154 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4713 "parsing/parser.mly" - ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) -# 42718 "parsing/parser.ml" +# 1457 "parsing/parser.mly" + ( [x], None ) +<<<<<<< HEAD +# 36590 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37151 "parsing/parser.ml" +||||||| 04da777f7 +# 37146 "parsing/parser.ml" +======= +# 37160 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42727,133 +63005,123 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = prim; - MenhirLib.EngineTypes.startp = _startpos_prim_; - MenhirLib.EngineTypes.endp = _endpos_prim_; + MenhirLib.EngineTypes.semv = y; + MenhirLib.EngineTypes.startp = _startpos_y_; + MenhirLib.EngineTypes.endp = _endpos_y_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let prim : (string list) = Obj.magic prim in - let _7 : unit = Obj.magic _7 in - let ty : (Parsetree.core_type) = Obj.magic ty in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (string) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let _4 : (unit option) = Obj.magic _4 in + let y : unit = Obj.magic y in + let _2 : unit = Obj.magic _2 in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.value_description * string Location.loc option) = let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 42801 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" + let _endpos = _endpos__4_ in + let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42813 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in +<<<<<<< HEAD +# 36655 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37216 "parsing/parser.ml" +||||||| 04da777f7 +# 37211 "parsing/parser.ml" +======= +# 37225 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4726 "parsing/parser.mly" - ( _1 ) -# 42821 "parsing/parser.ml" +<<<<<<< HEAD +# 3696 "parsing/parser.mly" +||||||| 04da777f7 +# 3694 "parsing/parser.mly" +======= +# 3685 "parsing/parser.mly" +>>>>>>> origin/main + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +<<<<<<< HEAD +# 36677 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37238 "parsing/parser.ml" +||||||| 04da777f7 +# 37233 "parsing/parser.ml" +======= +# 37247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3605 "parsing/parser.mly" - ( let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Val.mk id ty ~prim ~attrs ~loc ~docs, - ext ) -# 42834 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.private_flag) = let _1 = -# 4571 "parsing/parser.mly" - ( Public ) -# 42852 "parsing/parser.ml" - in - -# 4568 "parsing/parser.mly" - ( _1 ) -# 42857 "parsing/parser.ml" +# 1459 "parsing/parser.mly" + ( [x], Some y ) +<<<<<<< HEAD +# 36683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37244 "parsing/parser.ml" +||||||| 04da777f7 +# 37239 "parsing/parser.ml" +======= +# 37253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42865,68 +63133,118 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = tail; + MenhirLib.EngineTypes.startp = _startpos_tail_; + MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let tail : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = Obj.magic tail in + let _2 : unit = Obj.magic _2 in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.private_flag) = let _1 = -# 4572 "parsing/parser.mly" - ( Private ) -# 42882 "parsing/parser.ml" - in + let _endpos = _endpos_tail_ in + let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 36741 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37302 "parsing/parser.ml" +||||||| 04da777f7 +# 37297 "parsing/parser.ml" +======= +# 37311 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3696 "parsing/parser.mly" +||||||| 04da777f7 +# 3694 "parsing/parser.mly" +======= +# 3685 "parsing/parser.mly" +>>>>>>> origin/main + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +<<<<<<< HEAD +# 36763 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37324 "parsing/parser.ml" +||||||| 04da777f7 +# 37319 "parsing/parser.ml" +======= +# 37333 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4568 "parsing/parser.mly" - ( _1 ) -# 42887 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 4603 "parsing/parser.mly" - ( Public, Concrete ) -# 42905 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 4604 "parsing/parser.mly" - ( Private, Concrete ) -# 42930 "parsing/parser.ml" +# 1463 "parsing/parser.mly" + ( let xs, y = tail in + x :: xs, y ) +<<<<<<< HEAD +# 36770 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37331 "parsing/parser.ml" +||||||| 04da777f7 +# 37326 "parsing/parser.ml" +======= +# 37340 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42938,20 +63256,50 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 4605 "parsing/parser.mly" - ( Public, Virtual ) -# 42955 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.case) = +<<<<<<< HEAD +# 3271 "parsing/parser.mly" +||||||| 04da777f7 +# 3269 "parsing/parser.mly" +======= +# 3259 "parsing/parser.mly" +>>>>>>> origin/main + ( Exp.case _1 _3 ) +<<<<<<< HEAD +# 36809 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37370 "parsing/parser.ml" +||||||| 04da777f7 +# 37365 "parsing/parser.ml" +======= +# 37379 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42964,26 +63312,63 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.expression) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 4606 "parsing/parser.mly" - ( Private, Virtual ) -# 42987 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Parsetree.case) = +<<<<<<< HEAD +# 3273 "parsing/parser.mly" +||||||| 04da777f7 +# 3271 "parsing/parser.mly" +======= +# 3261 "parsing/parser.mly" +>>>>>>> origin/main + ( Exp.case _1 ~guard:_3 _5 ) +<<<<<<< HEAD +# 36862 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37423 "parsing/parser.ml" +||||||| 04da777f7 +# 37418 "parsing/parser.ml" +======= +# 37432 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42996,44 +63381,50 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 4607 "parsing/parser.mly" - ( Private, Virtual ) -# 43019 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.rec_flag) = -# 4549 "parsing/parser.mly" - ( Nonrecursive ) -# 43037 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.case) = let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3275 "parsing/parser.mly" +||||||| 04da777f7 +# 3273 "parsing/parser.mly" +======= +# 3263 "parsing/parser.mly" +>>>>>>> origin/main + ( Exp.case _1 (Exp.unreachable ~loc:(make_loc _loc__3_) ()) ) +<<<<<<< HEAD +# 36902 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37463 "parsing/parser.ml" +||||||| 04da777f7 +# 37458 "parsing/parser.ml" +======= +# 37472 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43045,51 +63436,253 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = tail; + MenhirLib.EngineTypes.startp = _startpos_tail_; + MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 36965 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37526 "parsing/parser.ml" +||||||| 04da777f7 +# 37521 "parsing/parser.ml" +======= +# 37535 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.rec_flag) = -# 4550 "parsing/parser.mly" - ( Recursive ) -# 43062 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = fields; - MenhirLib.EngineTypes.startp = _startpos_fields_; - MenhirLib.EngineTypes.endp = _endpos_fields_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let fields : ((Longident.t Location.loc * Parsetree.expression) list) = Obj.magic fields in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_fields_ in - let _endpos = _endpos_fields_ in - let _v : (Parsetree.expression option * - (Longident.t Location.loc * Parsetree.expression) list) = let eo = -# 124 "" - ( None ) -# 43088 "parsing/parser.ml" - in + let _endpos = _endpos_tail_ in + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = + let _6 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 36976 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37537 "parsing/parser.ml" +||||||| 04da777f7 +# 37532 "parsing/parser.ml" +======= +# 37546 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__6_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 36985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37546 "parsing/parser.ml" +||||||| 04da777f7 +# 37541 "parsing/parser.ml" +======= +# 37555 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__4_ = _endpos__1_inlined2_ in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4205 "parsing/parser.mly" + ( _1 ) +# 36994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4224 "parsing/parser.mly" +||||||| 04da777f7 +# 4217 "parsing/parser.mly" +======= +# 4208 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37555 "parsing/parser.ml" +||||||| 04da777f7 +# 37550 "parsing/parser.ml" +======= +# 37564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37001 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37562 "parsing/parser.ml" +||||||| 04da777f7 +# 37557 "parsing/parser.ml" +======= +# 37571 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37009 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37570 "parsing/parser.ml" +||||||| 04da777f7 +# 37565 "parsing/parser.ml" +======= +# 37579 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__6_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4605 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4609 "parsing/parser.mly" +||||||| 04da777f7 +# 4602 "parsing/parser.mly" +======= +# 4593 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let info = + match rhs_info _endpos__4_ with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info _endpos + in + let attrs = add_info_attrs info (_4 @ _6) in + Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) +<<<<<<< HEAD +# 37024 "parsing/parser.ml" + + in -# 3328 "parsing/parser.mly" - ( eo, fields ) -# 43093 "parsing/parser.ml" +# 4586 "parsing/parser.mly" + ( let (f, c) = tail in (head :: f, c) ) +# 37030 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37585 "parsing/parser.ml" +||||||| 04da777f7 +# 37580 "parsing/parser.ml" +======= +# 37594 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4590 "parsing/parser.mly" +||||||| 04da777f7 +# 4583 "parsing/parser.mly" +======= +# 4574 "parsing/parser.mly" +>>>>>>> origin/main + ( let (f, c) = tail in (head :: f, c) ) +<<<<<<< HEAD +# 37591 "parsing/parser.ml" +||||||| 04da777f7 +# 37586 "parsing/parser.ml" +======= +# 37600 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43102,9 +63695,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = fields; - MenhirLib.EngineTypes.startp = _startpos_fields_; - MenhirLib.EngineTypes.endp = _endpos_fields_; + MenhirLib.EngineTypes.semv = tail; + MenhirLib.EngineTypes.startp = _startpos_tail_; + MenhirLib.EngineTypes.endp = _endpos_tail_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -43112,36 +63705,69 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let fields : ((Longident.t Location.loc * Parsetree.expression) list) = Obj.magic fields in + let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.expression) = Obj.magic x in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_fields_ in - let _v : (Parsetree.expression option * - (Longident.t Location.loc * Parsetree.expression) list) = let eo = - let x = -# 191 "" - ( x ) -# 43134 "parsing/parser.ml" - in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_tail_ in + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = + let _endpos = _endpos_ty_ in + let _symbolstartpos = _startpos_ty_ in + let _sloc = (_symbolstartpos, _endpos) in -# 126 "" - ( Some x ) -# 43139 "parsing/parser.ml" +<<<<<<< HEAD +# 4616 "parsing/parser.mly" + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +# 37073 "parsing/parser.ml" in -# 3328 "parsing/parser.mly" - ( eo, fields ) -# 43145 "parsing/parser.ml" +# 4586 "parsing/parser.mly" + ( let (f, c) = tail in (head :: f, c) ) +# 37079 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4620 "parsing/parser.mly" +||||||| 04da777f7 +# 4613 "parsing/parser.mly" +======= +# 4604 "parsing/parser.mly" +>>>>>>> origin/main + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +<<<<<<< HEAD +# 37634 "parsing/parser.ml" +||||||| 04da777f7 +# 37629 "parsing/parser.ml" +======= +# 37643 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4590 "parsing/parser.mly" +||||||| 04da777f7 +# 4583 "parsing/parser.mly" +======= +# 4574 "parsing/parser.mly" +>>>>>>> origin/main + ( let (f, c) = tail in (head :: f, c) ) +<<<<<<< HEAD +# 37640 "parsing/parser.ml" +||||||| 04da777f7 +# 37635 "parsing/parser.ml" +======= +# 37649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43153,69 +63779,246 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37135 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37696 "parsing/parser.ml" +||||||| 04da777f7 +# 37691 "parsing/parser.ml" +======= +# 37705 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.constructor_declaration list) = let x = -# 3837 "parsing/parser.mly" - ( - let cid, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Layouts.constructor_declaration_of - cid ~vars_jkinds ~args ~res ~attrs ~loc ~info - ) -# 43177 "parsing/parser.ml" - in - -# 1517 "parsing/parser.mly" - ( [x] ) -# 43182 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.constructor_declaration list) = let x = -# 3837 "parsing/parser.mly" - ( - let cid, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Layouts.constructor_declaration_of - cid ~vars_jkinds ~args ~res ~attrs ~loc ~info - ) -# 43214 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = + let _6 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 37146 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37707 "parsing/parser.ml" +||||||| 04da777f7 +# 37702 "parsing/parser.ml" +======= +# 37716 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__6_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 37155 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37716 "parsing/parser.ml" +||||||| 04da777f7 +# 37711 "parsing/parser.ml" +======= +# 37725 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__4_ = _endpos__1_inlined2_ in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4205 "parsing/parser.mly" + ( _1 ) +# 37164 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4224 "parsing/parser.mly" +||||||| 04da777f7 +# 4217 "parsing/parser.mly" +======= +# 4208 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37725 "parsing/parser.ml" +||||||| 04da777f7 +# 37720 "parsing/parser.ml" +======= +# 37734 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37171 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37732 "parsing/parser.ml" +||||||| 04da777f7 +# 37727 "parsing/parser.ml" +======= +# 37741 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37179 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37740 "parsing/parser.ml" +||||||| 04da777f7 +# 37735 "parsing/parser.ml" +======= +# 37749 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__6_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4605 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4609 "parsing/parser.mly" +||||||| 04da777f7 +# 4602 "parsing/parser.mly" +======= +# 4593 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let info = + match rhs_info _endpos__4_ with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info _endpos + in + let attrs = add_info_attrs info (_4 @ _6) in + Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) +<<<<<<< HEAD +# 37194 "parsing/parser.ml" + + in -# 1520 "parsing/parser.mly" - ( [x] ) -# 43219 "parsing/parser.ml" +# 4589 "parsing/parser.mly" + ( [head], Closed ) +# 37200 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37755 "parsing/parser.ml" +||||||| 04da777f7 +# 37750 "parsing/parser.ml" +======= +# 37764 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4593 "parsing/parser.mly" +||||||| 04da777f7 +# 4586 "parsing/parser.mly" +======= +# 4577 "parsing/parser.mly" +>>>>>>> origin/main + ( [head], Closed ) +<<<<<<< HEAD +# 37761 "parsing/parser.ml" +||||||| 04da777f7 +# 37756 "parsing/parser.ml" +======= +# 37770 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43228,83 +64031,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in - let xs : (Parsetree.constructor_declaration list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.constructor_declaration list) = let x = -# 3837 "parsing/parser.mly" - ( - let cid, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Layouts.constructor_declaration_of - cid ~vars_jkinds ~args ~res ~attrs ~loc ~info - ) -# 43258 "parsing/parser.ml" - in - -# 1524 "parsing/parser.mly" - ( x :: xs ) -# 43263 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in + let _2 : unit = Obj.magic _2 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.extension_constructor list) = let x = - let _1 = -# 3976 "parsing/parser.mly" - ( - let name, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Extension_constructor.extension_constructor_of - ~loc ~attrs ~info ~name - (Jext_layout (Lext_decl(vars_jkinds, args, res))) - ) -# 43297 "parsing/parser.ml" - in + let _startpos = _startpos_ty_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = + let _endpos = _endpos_ty_ in + let _symbolstartpos = _startpos_ty_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3970 "parsing/parser.mly" - ( _1 ) -# 43302 "parsing/parser.ml" +<<<<<<< HEAD +# 4616 "parsing/parser.mly" + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +# 37236 "parsing/parser.ml" in -# 1517 "parsing/parser.mly" - ( [x] ) -# 43308 "parsing/parser.ml" +# 4589 "parsing/parser.mly" + ( [head], Closed ) +# 37242 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4620 "parsing/parser.mly" +||||||| 04da777f7 +# 4613 "parsing/parser.mly" +======= +# 4604 "parsing/parser.mly" +>>>>>>> origin/main + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +<<<<<<< HEAD +# 37797 "parsing/parser.ml" +||||||| 04da777f7 +# 37792 "parsing/parser.ml" +======= +# 37806 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4593 "parsing/parser.mly" +||||||| 04da777f7 +# 4586 "parsing/parser.mly" +======= +# 4577 "parsing/parser.mly" +>>>>>>> origin/main + ( [head], Closed ) +<<<<<<< HEAD +# 37803 "parsing/parser.ml" +||||||| 04da777f7 +# 37798 "parsing/parser.ml" +======= +# 37812 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43316,25 +64108,201 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37284 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37845 "parsing/parser.ml" +||||||| 04da777f7 +# 37840 "parsing/parser.ml" +======= +# 37854 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.extension_constructor list) = let x = -# 3972 "parsing/parser.mly" - ( _1 ) -# 43333 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = + let _4 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 37295 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37856 "parsing/parser.ml" +||||||| 04da777f7 +# 37851 "parsing/parser.ml" +======= +# 37865 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__4_ = _endpos__1_inlined2_ in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4205 "parsing/parser.mly" + ( _1 ) +# 37304 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4224 "parsing/parser.mly" +||||||| 04da777f7 +# 4217 "parsing/parser.mly" +======= +# 4208 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37865 "parsing/parser.ml" +||||||| 04da777f7 +# 37860 "parsing/parser.ml" +======= +# 37874 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37311 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 37872 "parsing/parser.ml" +||||||| 04da777f7 +# 37867 "parsing/parser.ml" +======= +# 37881 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37319 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 37880 "parsing/parser.ml" +||||||| 04da777f7 +# 37875 "parsing/parser.ml" +======= +# 37889 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4598 "parsing/parser.mly" + ( let info = symbol_info _endpos in + let attrs = add_info_attrs info _4 in + Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) +# 37330 "parsing/parser.ml" + + in -# 1517 "parsing/parser.mly" - ( [x] ) -# 43338 "parsing/parser.ml" +# 4592 "parsing/parser.mly" + ( [head], Closed ) +# 37336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4602 "parsing/parser.mly" +||||||| 04da777f7 +# 4595 "parsing/parser.mly" +======= +# 4586 "parsing/parser.mly" +>>>>>>> origin/main + ( let info = symbol_info _endpos in + let attrs = add_info_attrs info _4 in + Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) +<<<<<<< HEAD +# 37891 "parsing/parser.ml" +||||||| 04da777f7 +# 37886 "parsing/parser.ml" +======= +# 37900 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4596 "parsing/parser.mly" +||||||| 04da777f7 +# 4589 "parsing/parser.mly" +======= +# 4580 "parsing/parser.mly" +>>>>>>> origin/main + ( [head], Closed ) +<<<<<<< HEAD +# 37897 "parsing/parser.ml" +||||||| 04da777f7 +# 37892 "parsing/parser.ml" +======= +# 37906 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43347,39 +64315,65 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.extension_constructor list) = let x = - let _1 = -# 3976 "parsing/parser.mly" - ( - let name, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Extension_constructor.extension_constructor_of - ~loc ~attrs ~info ~name - (Jext_layout (Lext_decl(vars_jkinds, args, res))) - ) -# 43372 "parsing/parser.ml" - in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = let head = + let _endpos = _endpos_ty_ in + let _symbolstartpos = _startpos_ty_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3970 "parsing/parser.mly" - ( _1 ) -# 43377 "parsing/parser.ml" +<<<<<<< HEAD +# 4616 "parsing/parser.mly" + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +# 37365 "parsing/parser.ml" in -# 1520 "parsing/parser.mly" - ( [x] ) -# 43383 "parsing/parser.ml" +# 4592 "parsing/parser.mly" + ( [head], Closed ) +# 37371 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4620 "parsing/parser.mly" +||||||| 04da777f7 +# 4613 "parsing/parser.mly" +======= +# 4604 "parsing/parser.mly" +>>>>>>> origin/main + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +<<<<<<< HEAD +# 37926 "parsing/parser.ml" +||||||| 04da777f7 +# 37921 "parsing/parser.ml" +======= +# 37935 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4596 "parsing/parser.mly" +||||||| 04da777f7 +# 4589 "parsing/parser.mly" +======= +# 4580 "parsing/parser.mly" +>>>>>>> origin/main + ( [head], Closed ) +<<<<<<< HEAD +# 37932 "parsing/parser.ml" +||||||| 04da777f7 +# 37927 "parsing/parser.ml" +======= +# 37941 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43397,19 +64391,32 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.extension_constructor list) = let x = -# 3972 "parsing/parser.mly" - ( _1 ) -# 43408 "parsing/parser.ml" - in - -# 1520 "parsing/parser.mly" - ( [x] ) -# 43413 "parsing/parser.ml" + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = +<<<<<<< HEAD +# 4594 "parsing/parser.mly" + ( [], Open ) +# 37396 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4598 "parsing/parser.mly" +||||||| 04da777f7 +# 4591 "parsing/parser.mly" +======= +# 4582 "parsing/parser.mly" +>>>>>>> origin/main + ( [], Open ) +<<<<<<< HEAD +# 37957 "parsing/parser.ml" +||||||| 04da777f7 +# 37952 "parsing/parser.ml" +======= +# 37966 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43422,46 +64429,191 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = private_; + MenhirLib.EngineTypes.startp = _startpos_private__; + MenhirLib.EngineTypes.endp = _endpos_private__; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37443 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38004 "parsing/parser.ml" +||||||| 04da777f7 +# 37999 "parsing/parser.ml" +======= +# 38013 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let private_ : (Asttypes.private_flag) = Obj.magic private_ in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.extension_constructor list) = let x = + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes) = let ty = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4201 "parsing/parser.mly" + ( _1 ) +# 37457 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4220 "parsing/parser.mly" +||||||| 04da777f7 +# 4213 "parsing/parser.mly" +======= +# 4204 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38018 "parsing/parser.ml" +||||||| 04da777f7 +# 38013 "parsing/parser.ml" +======= +# 38027 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3976 "parsing/parser.mly" - ( - let name, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Extension_constructor.extension_constructor_of - ~loc ~attrs ~info ~name - (Jext_layout (Lext_decl(vars_jkinds, args, res))) - ) -# 43454 "parsing/parser.ml" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37465 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38026 "parsing/parser.ml" +||||||| 04da777f7 +# 38021 "parsing/parser.ml" +======= +# 38035 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3970 "parsing/parser.mly" - ( _1 ) -# 43459 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37473 "parsing/parser.ml" + + in + let attrs = +# 5009 "parsing/parser.mly" + ( _1 ) +# 37479 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38034 "parsing/parser.ml" +||||||| 04da777f7 +# 38029 "parsing/parser.ml" +======= +# 38043 "parsing/parser.ml" +>>>>>>> origin/main in + let attrs = +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38040 "parsing/parser.ml" +||||||| 04da777f7 +# 38035 "parsing/parser.ml" + in + let _1 = +# 4904 "parsing/parser.mly" + ( Fresh ) +# 38040 "parsing/parser.ml" +======= +# 38049 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _1 = +# 4907 "parsing/parser.mly" + ( Fresh ) +<<<<<<< HEAD +# 37484 "parsing/parser.ml" +======= +# 38054 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in +<<<<<<< HEAD + let _1 = +# 4911 "parsing/parser.mly" + ( Fresh ) +# 38045 "parsing/parser.ml" +||||||| 04da777f7 -# 1524 "parsing/parser.mly" - ( x :: xs ) -# 43465 "parsing/parser.ml" +# 2369 "parsing/parser.mly" + ( (label, private_, Cfk_virtual ty), attrs ) +# 38045 "parsing/parser.ml" +======= + +# 2359 "parsing/parser.mly" + ( (label, private_, Cfk_virtual ty), attrs ) +<<<<<<< HEAD +# 37489 "parsing/parser.ml" +======= +# 38059 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 2371 "parsing/parser.mly" + ( (label, private_, Cfk_virtual ty), attrs ) +# 38050 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43474,31 +64626,185 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _1_inlined2 : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37529 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38090 "parsing/parser.ml" +||||||| 04da777f7 +# 38085 "parsing/parser.ml" +======= +# 38099 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.extension_constructor list) = let x = -# 3972 "parsing/parser.mly" - ( _1 ) -# 43497 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes) = let _5 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 3249 "parsing/parser.mly" +||||||| 04da777f7 +# 3247 "parsing/parser.mly" +======= +# 3237 "parsing/parser.mly" +>>>>>>> origin/main + (_1 Mode.empty) +<<<<<<< HEAD +# 37543 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38104 "parsing/parser.ml" +||||||| 04da777f7 +# 38099 "parsing/parser.ml" +======= +# 38113 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37551 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38112 "parsing/parser.ml" +||||||| 04da777f7 +# 38107 "parsing/parser.ml" +======= +# 38121 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37559 "parsing/parser.ml" + + in + let _2 = +# 5009 "parsing/parser.mly" + ( _1 ) +# 37565 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38120 "parsing/parser.ml" +||||||| 04da777f7 +# 38115 "parsing/parser.ml" +======= +# 38129 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _2 = +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38126 "parsing/parser.ml" +||||||| 04da777f7 +# 38121 "parsing/parser.ml" + in + let _1 = +# 4907 "parsing/parser.mly" + ( Fresh ) +# 38126 "parsing/parser.ml" +======= +# 38135 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _1 = +# 4910 "parsing/parser.mly" + ( Fresh ) +<<<<<<< HEAD +# 37570 "parsing/parser.ml" +======= +# 38140 "parsing/parser.ml" +>>>>>>> origin/main + in + let _1 = +# 4914 "parsing/parser.mly" + ( Fresh ) +# 38131 "parsing/parser.ml" +>>>>>>> upstream/main in -# 1524 "parsing/parser.mly" - ( x :: xs ) -# 43502 "parsing/parser.ml" +<<<<<<< HEAD +# 2373 "parsing/parser.mly" +||||||| 04da777f7 +# 2371 "parsing/parser.mly" +======= +# 2361 "parsing/parser.mly" +>>>>>>> origin/main + ( let e = _5 in + let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in + (_4, _3, + Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) +<<<<<<< HEAD +# 37578 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38139 "parsing/parser.ml" +||||||| 04da777f7 +# 38134 "parsing/parser.ml" +======= +# 38148 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43510,71 +64816,200 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.extension_constructor list) = let x = -# 3976 "parsing/parser.mly" - ( - let name, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Extension_constructor.extension_constructor_of - ~loc ~attrs ~info ~name - (Jext_layout (Lext_decl(vars_jkinds, args, res))) - ) -# 43535 "parsing/parser.ml" - in - -# 1517 "parsing/parser.mly" - ( [x] ) -# 43540 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in + let _1_inlined3 : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = Obj.magic _1_inlined3 in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37624 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38185 "parsing/parser.ml" +||||||| 04da777f7 +# 38180 "parsing/parser.ml" +======= +# 38194 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.extension_constructor list) = let x = -# 3976 "parsing/parser.mly" - ( - let name, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Extension_constructor.extension_constructor_of - ~loc ~attrs ~info ~name - (Jext_layout (Lext_decl(vars_jkinds, args, res))) - ) -# 43573 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes) = let _5 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 3249 "parsing/parser.mly" +||||||| 04da777f7 +# 3247 "parsing/parser.mly" +======= +# 3237 "parsing/parser.mly" +>>>>>>> origin/main + (_1 Mode.empty) +<<<<<<< HEAD +# 37639 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38200 "parsing/parser.ml" +||||||| 04da777f7 +# 38195 "parsing/parser.ml" +======= +# 38209 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37647 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38208 "parsing/parser.ml" +||||||| 04da777f7 +# 38203 "parsing/parser.ml" +======= +# 38217 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37655 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38216 "parsing/parser.ml" +||||||| 04da777f7 +# 38211 "parsing/parser.ml" +======= +# 38225 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 37663 "parsing/parser.ml" + + in + let _1 = +# 4911 "parsing/parser.mly" + ( Override ) +# 37669 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38224 "parsing/parser.ml" +||||||| 04da777f7 +# 38219 "parsing/parser.ml" +======= +# 38233 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main + ( Override ) +<<<<<<< HEAD +# 38230 "parsing/parser.ml" +||||||| 04da777f7 +# 38225 "parsing/parser.ml" +======= +# 38239 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1520 "parsing/parser.mly" - ( [x] ) -# 43578 "parsing/parser.ml" +<<<<<<< HEAD +# 2373 "parsing/parser.mly" +||||||| 04da777f7 +# 2371 "parsing/parser.mly" +======= +# 2361 "parsing/parser.mly" +>>>>>>> origin/main + ( let e = _5 in + let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in + (_4, _3, + Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) +<<<<<<< HEAD +# 37677 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38238 "parsing/parser.ml" +||||||| 04da777f7 +# 38233 "parsing/parser.ml" +======= +# 38247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43587,57 +65022,209 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let d : (Ast_helper.str * - (string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option * - Parsetree.attributes * Warnings.loc * Docstrings.info) = Obj.magic d in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _8 : (Parsetree.expression) = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37738 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38299 "parsing/parser.ml" +||||||| 04da777f7 +# 38294 "parsing/parser.ml" +======= +# 38308 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_d_ in - let _v : (Parsetree.extension_constructor list) = let x = -# 3976 "parsing/parser.mly" - ( - let name, vars_jkinds, args, res, attrs, loc, info = d in - Jane_syntax.Extension_constructor.extension_constructor_of - ~loc ~attrs ~info ~name - (Jext_layout (Lext_decl(vars_jkinds, args, res))) - ) -# 43618 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__8_ in + let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes) = let _6 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4201 "parsing/parser.mly" + ( _1 ) +# 37752 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4220 "parsing/parser.mly" +||||||| 04da777f7 +# 4213 "parsing/parser.mly" +======= +# 4204 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38313 "parsing/parser.ml" +||||||| 04da777f7 +# 38308 "parsing/parser.ml" +======= +# 38322 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__6_ = _startpos__1_inlined2_ in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37761 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38322 "parsing/parser.ml" +||||||| 04da777f7 +# 38317 "parsing/parser.ml" +======= +# 38331 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37769 "parsing/parser.ml" + + in + let _2 = +# 5009 "parsing/parser.mly" + ( _1 ) +# 37775 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38330 "parsing/parser.ml" +||||||| 04da777f7 +# 38325 "parsing/parser.ml" +======= +# 38339 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _2 = +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38336 "parsing/parser.ml" +||||||| 04da777f7 +# 38331 "parsing/parser.ml" in - -# 1524 "parsing/parser.mly" - ( x :: xs ) -# 43623 "parsing/parser.ml" + let _1 = +# 4907 "parsing/parser.mly" + ( Fresh ) +# 38336 "parsing/parser.ml" +======= +# 38345 "parsing/parser.ml" +>>>>>>> upstream/main in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = -# 1363 "parsing/parser.mly" - ( [] ) -# 43641 "parsing/parser.ml" + let _1 = +# 4910 "parsing/parser.mly" + ( Fresh ) +<<<<<<< HEAD +# 37780 "parsing/parser.ml" +======= +# 38350 "parsing/parser.ml" +>>>>>>> origin/main + in + let _1 = +# 4914 "parsing/parser.mly" + ( Fresh ) +# 38341 "parsing/parser.ml" +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2379 "parsing/parser.mly" +||||||| 04da777f7 +# 2377 "parsing/parser.mly" +======= +# 2367 "parsing/parser.mly" +>>>>>>> origin/main + ( let poly_exp = + let loc = (_startpos__6_, _endpos__8_) in + ghexp ~loc (Pexp_poly(_8, Some _6)) in + (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) +<<<<<<< HEAD +# 37788 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38349 "parsing/parser.ml" +||||||| 04da777f7 +# 38344 "parsing/parser.ml" +======= +# 38358 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43650,65 +65237,223 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let _3 : (Parsetree.core_type) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _8 : (Parsetree.expression) = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38416 "parsing/parser.ml" +||||||| 04da777f7 +# 38411 "parsing/parser.ml" +======= +# 38425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let xs : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__3_ in - let _v : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = let x = - let x = - let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2549 "parsing/parser.mly" - ( _1, _3, make_loc _sloc ) -# 43700 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__8_ in + let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes) = let _6 = + let _1 = _1_inlined3 in -# 183 "" - ( x ) -# 43706 "parsing/parser.ml" +<<<<<<< HEAD +# 4201 "parsing/parser.mly" + ( _1 ) +# 37870 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4220 "parsing/parser.mly" +||||||| 04da777f7 +# 4213 "parsing/parser.mly" +======= +# 4204 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38431 "parsing/parser.ml" +||||||| 04da777f7 +# 38426 "parsing/parser.ml" +======= +# 38440 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__6_ = _startpos__1_inlined3_ in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 37879 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38440 "parsing/parser.ml" +||||||| 04da777f7 +# 38435 "parsing/parser.ml" +======= +# 38449 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 37887 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38448 "parsing/parser.ml" +||||||| 04da777f7 +# 38443 "parsing/parser.ml" +======= +# 38457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 37895 "parsing/parser.ml" in + let _1 = +# 4911 "parsing/parser.mly" + ( Override ) +# 37901 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38456 "parsing/parser.ml" +||||||| 04da777f7 +# 38451 "parsing/parser.ml" +======= +# 38465 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main + ( Override ) +<<<<<<< HEAD +# 38462 "parsing/parser.ml" +||||||| 04da777f7 +# 38457 "parsing/parser.ml" +======= +# 38471 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 1365 "parsing/parser.mly" - ( x :: xs ) -# 43712 "parsing/parser.ml" +<<<<<<< HEAD +# 2379 "parsing/parser.mly" +||||||| 04da777f7 +# 2377 "parsing/parser.mly" +======= +# 2367 "parsing/parser.mly" +>>>>>>> origin/main + ( let poly_exp = + let loc = (_startpos__6_, _endpos__8_) in + ghexp ~loc (Pexp_poly(_8, Some _6)) in + (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) +<<<<<<< HEAD +# 37909 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38470 "parsing/parser.ml" +||||||| 04da777f7 +# 38465 "parsing/parser.ml" +======= +# 38479 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43720,20 +65465,229 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _11; + MenhirLib.EngineTypes.startp = _startpos__11_; + MenhirLib.EngineTypes.endp = _endpos__11_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _10; + MenhirLib.EngineTypes.startp = _startpos__10_; + MenhirLib.EngineTypes.endp = _endpos__10_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _9; + MenhirLib.EngineTypes.startp = _startpos__9_; + MenhirLib.EngineTypes.endp = _endpos__9_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let x : (N_ary.function_param list) = Obj.magic x in + let _11 : (Parsetree.expression) = Obj.magic _11 in + let _10 : unit = Obj.magic _10 in + let _9 : (Parsetree.core_type) = Obj.magic _9 in + let _8 : unit = Obj.magic _8 in + let _7 : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic _7 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 37991 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38552 "parsing/parser.ml" +||||||| 04da777f7 +# 38547 "parsing/parser.ml" +======= +# 38561 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (N_ary.function_param list) = -# 1396 "parsing/parser.mly" - ( List.rev x ) -# 43737 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__11_ in + let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes) = let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 38005 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38566 "parsing/parser.ml" +||||||| 04da777f7 +# 38561 "parsing/parser.ml" +======= +# 38575 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 38013 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38574 "parsing/parser.ml" +||||||| 04da777f7 +# 38569 "parsing/parser.ml" +======= +# 38583 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__4_ = _startpos__1_inlined1_ in + let _2 = +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 38020 "parsing/parser.ml" + in + let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in + let _1 = +# 4910 "parsing/parser.mly" + ( Fresh ) +# 38026 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38581 "parsing/parser.ml" +||||||| 04da777f7 +# 38576 "parsing/parser.ml" +======= +# 38590 "parsing/parser.ml" +>>>>>>> origin/main + in + let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in + let _1 = +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main + ( Fresh ) +<<<<<<< HEAD +# 38587 "parsing/parser.ml" +||||||| 04da777f7 +# 38582 "parsing/parser.ml" +======= +# 38596 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__11_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + if _startpos__2_ != _endpos__2_ then + _startpos__2_ + else + if _startpos__3_ != _endpos__3_ then + _startpos__3_ + else + _startpos__4_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2385 "parsing/parser.mly" +||||||| 04da777f7 +# 2383 "parsing/parser.mly" +======= +# 2373 "parsing/parser.mly" +>>>>>>> origin/main + ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in + let poly_exp = + let exp, poly = + (* it seems odd to use the global ~loc here while poly_exp_loc + is tighter, but this is what ocamlyacc does; + TODO improve parser.mly *) + wrap_type_annotation ~loc:_sloc _7 _9 _11 in + ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in + (_4, _3, + Cfk_concrete (_1, poly_exp)), _2 ) +<<<<<<< HEAD +# 38053 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38614 "parsing/parser.ml" +||||||| 04da777f7 +# 38609 "parsing/parser.ml" +======= +# 38623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43746,26 +65700,237 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _11; + MenhirLib.EngineTypes.startp = _startpos__11_; + MenhirLib.EngineTypes.endp = _endpos__11_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _10; + MenhirLib.EngineTypes.startp = _startpos__10_; + MenhirLib.EngineTypes.endp = _endpos__10_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _9; + MenhirLib.EngineTypes.startp = _startpos__9_; + MenhirLib.EngineTypes.endp = _endpos__9_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let x : (N_ary.function_param list) = Obj.magic x in - let xs : (N_ary.function_param list) = Obj.magic xs in + let _11 : (Parsetree.expression) = Obj.magic _11 in + let _10 : unit = Obj.magic _10 in + let _9 : (Parsetree.core_type) = Obj.magic _9 in + let _8 : unit = Obj.magic _8 in + let _7 : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic _7 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38141 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38702 "parsing/parser.ml" +||||||| 04da777f7 +# 38697 "parsing/parser.ml" +======= +# 38711 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (N_ary.function_param list) = -# 1398 "parsing/parser.mly" - ( List.rev_append x xs ) -# 43769 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__11_ in + let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes) = let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 38156 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38717 "parsing/parser.ml" +||||||| 04da777f7 +# 38712 "parsing/parser.ml" +======= +# 38726 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 38164 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38725 "parsing/parser.ml" +||||||| 04da777f7 +# 38720 "parsing/parser.ml" +======= +# 38734 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__4_ = _startpos__1_inlined2_ in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 38173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38734 "parsing/parser.ml" +||||||| 04da777f7 +# 38729 "parsing/parser.ml" +======= +# 38743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _1 = +<<<<<<< HEAD +# 4911 "parsing/parser.mly" + ( Override ) +# 38180 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main + ( Override ) +<<<<<<< HEAD +# 38741 "parsing/parser.ml" +||||||| 04da777f7 +# 38736 "parsing/parser.ml" +======= +# 38750 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__11_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + if _startpos__2_ != _endpos__2_ then + _startpos__2_ + else + if _startpos__3_ != _endpos__3_ then + _startpos__3_ + else + _startpos__4_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2385 "parsing/parser.mly" +||||||| 04da777f7 +# 2383 "parsing/parser.mly" +======= +# 2373 "parsing/parser.mly" +>>>>>>> origin/main + ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in + let poly_exp = + let exp, poly = + (* it seems odd to use the global ~loc here while poly_exp_loc + is tighter, but this is what ocamlyacc does; + TODO improve parser.mly *) + wrap_type_annotation ~loc:_sloc _7 _9 _11 in + ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in + (_4, _3, + Cfk_concrete (_1, poly_exp)), _2 ) +<<<<<<< HEAD +# 38206 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38767 "parsing/parser.ml" +||||||| 04da777f7 +# 38762 "parsing/parser.ml" +======= +# 38776 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43778,19 +65943,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Jane_syntax.Comprehensions.clause) = Obj.magic x in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38227 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38788 "parsing/parser.ml" +||||||| 04da777f7 +# 38783 "parsing/parser.ml" +======= +# 38797 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Jane_syntax.Comprehensions.clause list) = -# 1377 "parsing/parser.mly" - ( [ x ] ) -# 43794 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38235 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 38796 "parsing/parser.ml" +||||||| 04da777f7 +# 38791 "parsing/parser.ml" +======= +# 38805 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43803,26 +66000,65 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let x : (Jane_syntax.Comprehensions.clause) = Obj.magic x in - let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _3 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38268 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38829 "parsing/parser.ml" +||||||| 04da777f7 +# 38824 "parsing/parser.ml" +======= +# 38838 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Jane_syntax.Comprehensions.clause list) = -# 1379 "parsing/parser.mly" - ( x :: xs ) -# 43826 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38278 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 38839 "parsing/parser.ml" +||||||| 04da777f7 +# 38834 "parsing/parser.ml" +======= +# 38848 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43835,19 +66071,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Lexing.position * Parsetree.functor_parameter) = Obj.magic x in + let _1 : ( +# 1061 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38299 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38860 "parsing/parser.ml" +||||||| 04da777f7 +# 38855 "parsing/parser.ml" +======= +# 38869 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 1377 "parsing/parser.mly" - ( [ x ] ) -# 43851 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38307 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 38868 "parsing/parser.ml" +||||||| 04da777f7 +# 38863 "parsing/parser.ml" +======= +# 38877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43860,26 +66128,65 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let x : (Lexing.position * Parsetree.functor_parameter) = Obj.magic x in - let xs : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic xs in + let _3 : ( +# 1061 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38340 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 38901 "parsing/parser.ml" +||||||| 04da777f7 +# 38896 "parsing/parser.ml" +======= +# 38910 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 1379 "parsing/parser.mly" - ( x :: xs ) -# 43883 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38350 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 38911 "parsing/parser.ml" +||||||| 04da777f7 +# 38906 "parsing/parser.ml" +======= +# 38920 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43892,19 +66199,59 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Asttypes.arg_label * Parsetree.expression) = Obj.magic x in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 1377 "parsing/parser.mly" - ( [ x ] ) -# 43908 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = let _1 = +<<<<<<< HEAD +# 4789 "parsing/parser.mly" + ( _1 ) +# 38375 "parsing/parser.ml" + in + +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38380 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4793 "parsing/parser.mly" +||||||| 04da777f7 +# 4786 "parsing/parser.mly" +======= +# 4777 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38936 "parsing/parser.ml" +||||||| 04da777f7 +# 38931 "parsing/parser.ml" +======= +# 38945 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 38941 "parsing/parser.ml" +||||||| 04da777f7 +# 38936 "parsing/parser.ml" +======= +# 38950 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43917,26 +66264,98 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let x : (Asttypes.arg_label * Parsetree.expression) = Obj.magic x in - let xs : ((Asttypes.arg_label * Parsetree.expression) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 1379 "parsing/parser.mly" - ( x :: xs ) -# 43940 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = let _1 = + let _1 = +<<<<<<< HEAD +# 4721 "parsing/parser.mly" + ( "::" ) +# 38420 "parsing/parser.ml" + in + +# 4789 "parsing/parser.mly" + ( _1 ) +# 38425 "parsing/parser.ml" + + in + +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38431 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4725 "parsing/parser.mly" +||||||| 04da777f7 +# 4718 "parsing/parser.mly" +======= +# 4709 "parsing/parser.mly" +>>>>>>> origin/main + ( "::" ) +<<<<<<< HEAD +# 38981 "parsing/parser.ml" +||||||| 04da777f7 +# 38976 "parsing/parser.ml" +======= +# 38990 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4793 "parsing/parser.mly" +||||||| 04da777f7 +# 4786 "parsing/parser.mly" +======= +# 4777 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 38986 "parsing/parser.ml" +||||||| 04da777f7 +# 38981 "parsing/parser.ml" +======= +# 38995 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 38992 "parsing/parser.ml" +||||||| 04da777f7 +# 38987 "parsing/parser.ml" +======= +# 39001 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43949,51 +66368,59 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (string) = Obj.magic x in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (string list) = -# 1377 "parsing/parser.mly" - ( [ x ] ) -# 43965 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = let _1 = +<<<<<<< HEAD +# 4789 "parsing/parser.mly" + ( _1 ) +# 38456 "parsing/parser.ml" in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let x : (string) = Obj.magic x in - let xs : (string list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (string list) = -# 1379 "parsing/parser.mly" - ( x :: xs ) -# 43997 "parsing/parser.ml" + +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38461 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4793 "parsing/parser.mly" +||||||| 04da777f7 +# 4786 "parsing/parser.mly" +======= +# 4777 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39017 "parsing/parser.ml" +||||||| 04da777f7 +# 39012 "parsing/parser.ml" +======= +# 39026 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 39022 "parsing/parser.ml" +||||||| 04da777f7 +# 39017 "parsing/parser.ml" +======= +# 39031 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44010,40 +66437,73 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined1_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = let x = - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 44035 "parsing/parser.ml" - - in + let _v : (Longident.t) = let _3 = + let _1 = _1_inlined1 in -# 4036 "parsing/parser.mly" - ( (_2, None) ) -# 44041 "parsing/parser.ml" +<<<<<<< HEAD +# 4789 "parsing/parser.mly" + ( _1 ) +# 38502 "parsing/parser.ml" in -# 1377 "parsing/parser.mly" - ( [ x ] ) -# 44047 "parsing/parser.ml" +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38508 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4793 "parsing/parser.mly" +||||||| 04da777f7 +# 4786 "parsing/parser.mly" +======= +# 4777 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39063 "parsing/parser.ml" +||||||| 04da777f7 +# 39058 "parsing/parser.ml" +======= +# 39072 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39069 "parsing/parser.ml" +||||||| 04da777f7 +# 39064 "parsing/parser.ml" +======= +# 39078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44056,72 +66516,112 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in - let _4 : unit = Obj.magic _4 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = let x = - let tyvar = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 44113 "parsing/parser.ml" - - in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = let _3 = + let _1 = +<<<<<<< HEAD +# 4721 "parsing/parser.mly" + ( "::" ) +# 38562 "parsing/parser.ml" + in -# 4038 "parsing/parser.mly" - ( (tyvar, Some jkind) ) -# 44119 "parsing/parser.ml" +# 4789 "parsing/parser.mly" + ( _1 ) +# 38567 "parsing/parser.ml" in -# 1377 "parsing/parser.mly" - ( [ x ] ) -# 44125 "parsing/parser.ml" +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38573 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4725 "parsing/parser.mly" +||||||| 04da777f7 +# 4718 "parsing/parser.mly" +======= +# 4709 "parsing/parser.mly" +>>>>>>> origin/main + ( "::" ) +<<<<<<< HEAD +# 39123 "parsing/parser.ml" +||||||| 04da777f7 +# 39118 "parsing/parser.ml" +======= +# 39132 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4793 "parsing/parser.mly" +||||||| 04da777f7 +# 4786 "parsing/parser.mly" +======= +# 4777 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39128 "parsing/parser.ml" +||||||| 04da777f7 +# 39123 "parsing/parser.ml" +======= +# 39137 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39134 "parsing/parser.ml" +||||||| 04da777f7 +# 39129 "parsing/parser.ml" +======= +# 39143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44139,131 +66639,72 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined1_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = let x = - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 44170 "parsing/parser.ml" - - in + let _v : (Longident.t) = let _3 = + let _1 = _1_inlined1 in -# 4036 "parsing/parser.mly" - ( (_2, None) ) -# 44176 "parsing/parser.ml" +<<<<<<< HEAD +# 4789 "parsing/parser.mly" + ( _1 ) +# 38614 "parsing/parser.ml" in -# 1379 "parsing/parser.mly" - ( x :: xs ) -# 44182 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = jkind; - MenhirLib.EngineTypes.startp = _startpos_jkind_; - MenhirLib.EngineTypes.endp = _endpos_jkind_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let jkind : (Jane_asttypes.jkind_annotation) = Obj.magic jkind in - let _4 : unit = Obj.magic _4 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__6_ in - let _v : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = let x = - let tyvar = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 44255 "parsing/parser.ml" - - in - -# 4038 "parsing/parser.mly" - ( (tyvar, Some jkind) ) -# 44261 "parsing/parser.ml" +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38620 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4793 "parsing/parser.mly" +||||||| 04da777f7 +# 4786 "parsing/parser.mly" +======= +# 4777 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39175 "parsing/parser.ml" +||||||| 04da777f7 +# 39170 "parsing/parser.ml" +======= +# 39184 "parsing/parser.ml" +>>>>>>> origin/main in -# 1379 "parsing/parser.mly" - ( x :: xs ) -# 44267 "parsing/parser.ml" +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39181 "parsing/parser.ml" +||||||| 04da777f7 +# 39176 "parsing/parser.ml" +======= +# 39190 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44276,64 +66717,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : (Parsetree.case) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.case list) = let _1 = -# 124 "" - ( None ) -# 44292 "parsing/parser.ml" - in - -# 1488 "parsing/parser.mly" - ( [x] ) -# 44297 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; } = _menhir_stack in - let x : (Parsetree.case) = Obj.magic x in - let x_inlined1 : unit = Obj.magic x_inlined1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_inlined1_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.case list) = let _1 = - let x = x_inlined1 in - -# 126 "" - ( Some x ) -# 44331 "parsing/parser.ml" - - in - -# 1488 "parsing/parser.mly" - ( [x] ) -# 44337 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38645 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 39206 "parsing/parser.ml" +||||||| 04da777f7 +# 39201 "parsing/parser.ml" +======= +# 39215 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44346,9 +66760,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -44356,23 +66770,41 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let x : (Parsetree.case) = Obj.magic x in + let _3 : (Asttypes.label) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.case list) = Obj.magic xs in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.case list) = -# 1492 "parsing/parser.mly" - ( x :: xs ) -# 44376 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38684 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39245 "parsing/parser.ml" +||||||| 04da777f7 +# 39240 "parsing/parser.ml" +======= +# 39254 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44390,26 +66822,32 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _1 : (string) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.core_type list) = let xs = - let x = -# 4084 "parsing/parser.mly" - ( _1 ) -# 44402 "parsing/parser.ml" - in - -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44407 "parsing/parser.ml" - - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44413 "parsing/parser.ml" + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 39270 "parsing/parser.ml" +||||||| 04da777f7 +# 39265 "parsing/parser.ml" +======= +# 39279 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44422,9 +66860,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -44432,35 +66870,41 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.core_type list) = let xs = - let x = -# 4084 "parsing/parser.mly" - ( _1 ) -# 44453 "parsing/parser.ml" - in - -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 44458 "parsing/parser.ml" - - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44464 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38748 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39309 "parsing/parser.ml" +||||||| 04da777f7 +# 39304 "parsing/parser.ml" +======= +# 39318 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44473,24 +66917,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Jane_syntax.Comprehensions.clause_binding) = Obj.magic x in + let _1 : (string) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Jane_syntax.Comprehensions.clause_binding list) = let xs = -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44489 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44494 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38773 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 39334 "parsing/parser.ml" +||||||| 04da777f7 +# 39329 "parsing/parser.ml" +======= +# 39343 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44503,9 +66960,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -44513,28 +66970,41 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let x : (Jane_syntax.Comprehensions.clause_binding) = Obj.magic x in + let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let xs : (Jane_syntax.Comprehensions.clause_binding list) = Obj.magic xs in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Jane_syntax.Comprehensions.clause_binding list) = let xs = -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 44533 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44538 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38812 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39373 "parsing/parser.ml" +||||||| 04da777f7 +# 39368 "parsing/parser.ml" +======= +# 39382 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44547,24 +67017,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Parsetree.with_constraint) = Obj.magic x in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38833 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39394 "parsing/parser.ml" +||||||| 04da777f7 +# 39389 "parsing/parser.ml" +======= +# 39403 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.with_constraint list) = let xs = -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44563 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44568 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 39402 "parsing/parser.ml" +||||||| 04da777f7 +# 39397 "parsing/parser.ml" +======= +# 39411 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44577,9 +67074,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -44587,28 +67084,55 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let x : (Parsetree.with_constraint) = Obj.magic x in + let _3 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38874 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39435 "parsing/parser.ml" +||||||| 04da777f7 +# 39430 "parsing/parser.ml" +======= +# 39444 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.with_constraint list) = Obj.magic xs in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.with_constraint list) = let xs = -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 44607 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44612 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38884 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39445 "parsing/parser.ml" +||||||| 04da777f7 +# 39440 "parsing/parser.ml" +======= +# 39454 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44621,24 +67145,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Parsetree.row_field) = Obj.magic x in + let _1 : ( +# 1061 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38905 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39466 "parsing/parser.ml" +||||||| 04da777f7 +# 39461 "parsing/parser.ml" +======= +# 39475 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.row_field list) = let xs = -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44637 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44642 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 39474 "parsing/parser.ml" +||||||| 04da777f7 +# 39469 "parsing/parser.ml" +======= +# 39483 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44651,9 +67202,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -44661,28 +67212,55 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let x : (Parsetree.row_field) = Obj.magic x in + let _3 : ( +# 1061 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 38946 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39507 "parsing/parser.ml" +||||||| 04da777f7 +# 39502 "parsing/parser.ml" +======= +# 39516 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.row_field list) = Obj.magic xs in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.row_field list) = let xs = -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 44681 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44686 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 38956 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39517 "parsing/parser.ml" +||||||| 04da777f7 +# 39512 "parsing/parser.ml" +======= +# 39526 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44695,24 +67273,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type list) = let xs = -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44711 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44716 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4741 "parsing/parser.mly" + ( Lident _1 ) +# 38981 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4745 "parsing/parser.mly" +||||||| 04da777f7 +# 4738 "parsing/parser.mly" +======= +# 4729 "parsing/parser.mly" +>>>>>>> origin/main + ( Lident _1 ) +<<<<<<< HEAD +# 39542 "parsing/parser.ml" +||||||| 04da777f7 +# 39537 "parsing/parser.ml" +======= +# 39551 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44725,9 +67316,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -44735,28 +67326,41 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in + let _3 : (Asttypes.label) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type list) = let xs = -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 44755 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44760 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4742 "parsing/parser.mly" + ( Ldot(_1,_3) ) +# 39020 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4746 "parsing/parser.mly" +||||||| 04da777f7 +# 4739 "parsing/parser.mly" +======= +# 4730 "parsing/parser.mly" +>>>>>>> origin/main + ( Ldot(_1,_3) ) +<<<<<<< HEAD +# 39581 "parsing/parser.ml" +||||||| 04da777f7 +# 39576 "parsing/parser.ml" +======= +# 39590 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44769,24 +67373,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44785 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44790 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4767 "parsing/parser.mly" + ( _1 ) +# 39045 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4771 "parsing/parser.mly" +||||||| 04da777f7 +# 4764 "parsing/parser.mly" +======= +# 4755 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39606 "parsing/parser.ml" +||||||| 04da777f7 +# 39601 "parsing/parser.ml" +======= +# 39615 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44799,68 +67416,61 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let xs : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 44829 "parsing/parser.ml" - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44834 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _4 : unit = Obj.magic _4 in + let _3 : (Longident.t) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44859 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Longident.t) = let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1431 "parsing/parser.mly" - ( xs ) -# 44864 "parsing/parser.ml" +<<<<<<< HEAD +# 4769 "parsing/parser.mly" + ( lapply ~loc:_sloc _1 _3 ) +# 39094 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4773 "parsing/parser.mly" +||||||| 04da777f7 +# 4766 "parsing/parser.mly" +======= +# 4757 "parsing/parser.mly" +>>>>>>> origin/main + ( lapply ~loc:_sloc _1 _3 ) +<<<<<<< HEAD +# 39655 "parsing/parser.ml" +||||||| 04da777f7 +# 39650 "parsing/parser.ml" +======= +# 39664 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44873,9 +67483,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -44883,28 +67493,42 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let xs : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic xs in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 44903 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Longident.t) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 1431 "parsing/parser.mly" - ( xs ) -# 44908 "parsing/parser.ml" +<<<<<<< HEAD +# 4771 "parsing/parser.mly" + ( expecting _loc__3_ "module path" ) +# 39134 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4775 "parsing/parser.mly" +||||||| 04da777f7 +# 4768 "parsing/parser.mly" +======= +# 4759 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__3_ "module path" ) +<<<<<<< HEAD +# 39695 "parsing/parser.ml" +||||||| 04da777f7 +# 39690 "parsing/parser.ml" +======= +# 39704 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44917,42 +67541,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let cty : (Parsetree.core_type) = Obj.magic cty in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_cty_ in - let _endpos = _endpos_cty_ in - let _v : (Parsetree.core_type list) = let xs = - let x = - let gbl = -# 4584 "parsing/parser.mly" - ( Nothing ) -# 44935 "parsing/parser.ml" - in - let (_endpos_gbl_, _startpos_gbl_) = (_endpos__0_, _endpos__0_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in - -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) -) -# 44944 "parsing/parser.ml" - - in - -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 44950 "parsing/parser.ml" - - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 44956 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4764 "parsing/parser.mly" + ( _1 ) +# 39159 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4768 "parsing/parser.mly" +||||||| 04da777f7 +# 4761 "parsing/parser.mly" +======= +# 4752 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39720 "parsing/parser.ml" +||||||| 04da777f7 +# 39715 "parsing/parser.ml" +======= +# 39729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44965,9 +67584,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -44976,38 +67595,31 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let cty : (Parsetree.core_type) = Obj.magic cty in + let me : (Parsetree.module_expr) = Obj.magic me in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_cty_ in - let _v : (Parsetree.core_type list) = let xs = - let x = - let gbl = -# 4585 "parsing/parser.mly" - ( Global ) -# 44990 "parsing/parser.ml" - in - let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in - -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) -) -# 44999 "parsing/parser.ml" - - in - -# 1423 "parsing/parser.mly" - ( [ x ] ) -# 45005 "parsing/parser.ml" - - in - -# 1431 "parsing/parser.mly" - ( xs ) -# 45011 "parsing/parser.ml" + let _endpos = _endpos_me_ in + let _v : (Parsetree.module_expr) = +<<<<<<< HEAD +# 1820 "parsing/parser.mly" +||||||| 04da777f7 +# 1819 "parsing/parser.mly" +======= +# 1809 "parsing/parser.mly" +>>>>>>> origin/main + ( me ) +<<<<<<< HEAD +# 39191 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39752 "parsing/parser.ml" +||||||| 04da777f7 +# 39747 "parsing/parser.ml" +======= +# 39761 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45020,57 +67632,43 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let cty : (Parsetree.core_type) = Obj.magic cty in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_cty_ in - let _v : (Parsetree.core_type list) = let xs = - let x = - let _endpos__0_ = _endpos__2_ in - let gbl = -# 4584 "parsing/parser.mly" - ( Nothing ) -# 45053 "parsing/parser.ml" - in - let (_endpos_gbl_, _startpos_gbl_) = (_endpos__0_, _endpos__0_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in - -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) -) -# 45062 "parsing/parser.ml" - - in - -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 45068 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_expr) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1431 "parsing/parser.mly" - ( xs ) -# 45074 "parsing/parser.ml" +<<<<<<< HEAD +# 1822 "parsing/parser.mly" +||||||| 04da777f7 +# 1821 "parsing/parser.mly" +======= +# 1811 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__1_ "=" ) +<<<<<<< HEAD +# 39224 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39785 "parsing/parser.ml" +||||||| 04da777f7 +# 39780 "parsing/parser.ml" +======= +# 39794 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45083,63 +67681,98 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let cty : (Parsetree.core_type) = Obj.magic cty in + let me : (Parsetree.module_expr) = Obj.magic me in + let _3 : unit = Obj.magic _3 in + let mty : (Parsetree.module_type) = Obj.magic mty in let _1 : unit = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_cty_ in - let _v : (Parsetree.core_type list) = let xs = - let x = - let gbl = -# 4585 "parsing/parser.mly" - ( Global ) -# 45122 "parsing/parser.ml" - in - let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in - let _loc_gbl_ = (_startpos_gbl_, _endpos_gbl_) in - -# 3903 "parsing/parser.mly" - ( - mkcty_global_maybe gbl cty (make_loc _loc_gbl_) -) -# 45131 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos_me_ in + let _v : (Parsetree.module_expr) = let _1 = + let _1 = +<<<<<<< HEAD +# 1825 "parsing/parser.mly" +||||||| 04da777f7 +# 1824 "parsing/parser.mly" +======= +# 1814 "parsing/parser.mly" +>>>>>>> origin/main + ( Pmod_constraint(me, mty) ) +<<<<<<< HEAD +# 39271 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39832 "parsing/parser.ml" +||||||| 04da777f7 +# 39827 "parsing/parser.ml" +======= +# 39841 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_me_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1427 "parsing/parser.mly" - ( x :: xs ) -# 45137 "parsing/parser.ml" +# 1238 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +<<<<<<< HEAD +# 39280 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39841 "parsing/parser.ml" +||||||| 04da777f7 +# 39836 "parsing/parser.ml" +======= +# 39850 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1431 "parsing/parser.mly" - ( xs ) -# 45143 "parsing/parser.ml" +<<<<<<< HEAD +# 1829 "parsing/parser.mly" +||||||| 04da777f7 +# 1828 "parsing/parser.mly" +======= +# 1818 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39286 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39847 "parsing/parser.ml" +||||||| 04da777f7 +# 39842 "parsing/parser.ml" +======= +# 39856 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45152,33 +67785,85 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = arg_and_pos; + MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; + MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in + let body : (Parsetree.module_expr) = Obj.magic body in + let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type list) = -# 1454 "parsing/parser.mly" - ( x :: xs ) -# 45182 "parsing/parser.ml" + let _startpos = _startpos_arg_and_pos_ in + let _endpos = _endpos_body_ in + let _v : (Parsetree.module_expr) = let _1 = + let _1 = +<<<<<<< HEAD +# 1827 "parsing/parser.mly" +||||||| 04da777f7 +# 1826 "parsing/parser.mly" +======= +# 1816 "parsing/parser.mly" +>>>>>>> origin/main + ( let (_, arg) = arg_and_pos in + Pmod_functor(arg, body) ) +<<<<<<< HEAD +# 39320 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39881 "parsing/parser.ml" +||||||| 04da777f7 +# 39876 "parsing/parser.ml" +======= +# 39890 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1238 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +<<<<<<< HEAD +# 39329 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39890 "parsing/parser.ml" +||||||| 04da777f7 +# 39885 "parsing/parser.ml" +======= +# 39899 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 1829 "parsing/parser.mly" +||||||| 04da777f7 +# 1828 "parsing/parser.mly" +======= +# 1818 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39335 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39896 "parsing/parser.ml" +||||||| 04da777f7 +# 39891 "parsing/parser.ml" +======= +# 39905 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45191,33 +67876,42 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x2; - MenhirLib.EngineTypes.startp = _startpos_x2_; - MenhirLib.EngineTypes.endp = _endpos_x2_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x1; - MenhirLib.EngineTypes.startp = _startpos_x1_; - MenhirLib.EngineTypes.endp = _endpos_x1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x2 : (Parsetree.core_type) = Obj.magic x2 in - let _2 : unit = Obj.magic _2 in - let x1 : (Parsetree.core_type) = Obj.magic x1 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x1_ in - let _endpos = _endpos_x2_ in - let _v : (Parsetree.core_type list) = -# 1458 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 45221 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos_mty_ in + let _v : (Parsetree.module_type) = +<<<<<<< HEAD +# 2098 "parsing/parser.mly" +||||||| 04da777f7 +# 2096 "parsing/parser.mly" +======= +# 2086 "parsing/parser.mly" +>>>>>>> origin/main + ( mty ) +<<<<<<< HEAD +# 39367 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39928 "parsing/parser.ml" +||||||| 04da777f7 +# 39923 "parsing/parser.ml" +======= +# 39937 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45230,45 +67924,134 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.expression list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.expression list) = let x = + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2100 "parsing/parser.mly" +||||||| 04da777f7 +# 2098 "parsing/parser.mly" +======= +# 2088 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__1_ ":" ) +<<<<<<< HEAD +# 39400 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39961 "parsing/parser.ml" +||||||| 04da777f7 +# 39956 "parsing/parser.ml" +======= +# 39970 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = arg_and_pos; + MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; + MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let body : (Parsetree.module_type) = Obj.magic body in + let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_arg_and_pos_ in + let _endpos = _endpos_body_ in + let _v : (Parsetree.module_type) = let _1 = let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 45261 "parsing/parser.ml" +<<<<<<< HEAD +# 2103 "parsing/parser.mly" +||||||| 04da777f7 +# 2101 "parsing/parser.mly" +======= +# 2091 "parsing/parser.mly" +>>>>>>> origin/main + ( let (_, arg) = arg_and_pos in + Pmty_functor(arg, body) ) +<<<<<<< HEAD +# 39434 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 39995 "parsing/parser.ml" +||||||| 04da777f7 +# 39990 "parsing/parser.ml" +======= +# 40004 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2823 "parsing/parser.mly" - ( _1 ) -# 45266 "parsing/parser.ml" +# 1240 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +<<<<<<< HEAD +# 39443 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40004 "parsing/parser.ml" +||||||| 04da777f7 +# 39999 "parsing/parser.ml" +======= +# 40013 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1454 "parsing/parser.mly" - ( x :: xs ) -# 45272 "parsing/parser.ml" +<<<<<<< HEAD +# 2106 "parsing/parser.mly" +||||||| 04da777f7 +# 2104 "parsing/parser.mly" +======= +# 2094 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 39449 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40010 "parsing/parser.ml" +||||||| 04da777f7 +# 40005 "parsing/parser.ml" +======= +# 40019 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45281,112 +68064,79 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _4 : unit = Obj.magic _4 in + let s : (Parsetree.structure) = Obj.magic s in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.expression list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_xs_inlined1_ in - let _v : (Parsetree.expression list) = let x = - let (_endpos_xs_, xs) = (_endpos_xs_inlined1_, xs_inlined1) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 45337 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 45342 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 45348 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 45359 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 45365 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 45378 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.module_expr) = let attrs = + let _1 = _1_inlined1 in -# 2823 "parsing/parser.mly" - ( _1 ) -# 45384 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 39497 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40058 "parsing/parser.ml" +||||||| 04da777f7 +# 40053 "parsing/parser.ml" +======= +# 40067 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - -# 1454 "parsing/parser.mly" - ( x :: xs ) -# 45390 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1632 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_structure s) ) +<<<<<<< HEAD +# 39506 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40067 "parsing/parser.ml" +||||||| 04da777f7 +# 40062 "parsing/parser.ml" +======= +# 40076 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45399,58 +68149,78 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.structure) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.expression list) = let x2 = + let _endpos = _endpos__4_ in + let _v : (Parsetree.module_expr) = let _2 = let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 45431 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 45436 "parsing/parser.ml" - - in - let x1 = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 45443 "parsing/parser.ml" - in -# 2823 "parsing/parser.mly" - ( _1 ) -# 45448 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 39554 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40115 "parsing/parser.ml" +||||||| 04da777f7 +# 40110 "parsing/parser.ml" +======= +# 40124 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _loc__4_ = (_startpos__4_, _endpos__4_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1458 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 45454 "parsing/parser.ml" +# 1634 "parsing/parser.mly" + ( unclosed "struct" _loc__1_ "end" _loc__4_ ) +<<<<<<< HEAD +# 39562 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40123 "parsing/parser.ml" +||||||| 04da777f7 +# 40118 "parsing/parser.ml" +======= +# 40132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45463,124 +68233,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression list) = let x2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 45519 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 45524 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 45530 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 45541 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 45547 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 45560 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 45566 "parsing/parser.ml" - - in - let x1 = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 45573 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 45578 "parsing/parser.ml" - - in + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_expr) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1458 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 45584 "parsing/parser.ml" +# 1636 "parsing/parser.mly" + ( expecting _loc__1_ "struct" ) +<<<<<<< HEAD +# 39595 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40156 "parsing/parser.ml" +||||||| 04da777f7 +# 40151 "parsing/parser.ml" +======= +# 40165 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45593,124 +68276,108 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.expression) = Obj.magic _1_inlined3 in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let me : (Parsetree.module_expr) = Obj.magic me in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.expression list) = let x2 = - let _1 = _1_inlined3 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 45646 "parsing/parser.ml" - in + let _endpos = _endpos_me_ in + let _v : (Parsetree.module_expr) = let args = + let _1 = _1_inlined2 in -# 2823 "parsing/parser.mly" - ( _1 ) -# 45651 "parsing/parser.ml" +# 1598 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 39650 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40211 "parsing/parser.ml" +||||||| 04da777f7 +# 40206 "parsing/parser.ml" +======= +# 40220 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let x1 = - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 45661 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 45666 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 45672 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 45683 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 45689 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 45702 "parsing/parser.ml" - - in + let attrs = + let _1 = _1_inlined1 in -# 2823 "parsing/parser.mly" - ( _1 ) -# 45708 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 39658 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40219 "parsing/parser.ml" +||||||| 04da777f7 +# 40214 "parsing/parser.ml" +======= +# 40228 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_me_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1458 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 45714 "parsing/parser.ml" +# 1638 "parsing/parser.mly" + ( wrap_mod_attrs ~loc:_sloc attrs ( + List.fold_left (fun acc (startpos, arg) -> + mkmod ~loc:(startpos, _endpos) (Pmod_functor (arg, acc)) + ) me args + ) ) +<<<<<<< HEAD +# 39671 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40232 "parsing/parser.ml" +||||||| 04da777f7 +# 40227 "parsing/parser.ml" +======= +# 40241 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45722,191 +68389,30 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in - let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let _1_inlined4 : (string Location.loc option) = Obj.magic _1_inlined4 in - let _1_inlined3 : unit = Obj.magic _1_inlined3 in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let me : (Parsetree.module_expr) = Obj.magic me in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_inlined1_ in - let _v : (Parsetree.expression list) = let x2 = - let (_endpos_xs_, _startpos__1_, xs, _1_inlined2, _1_inlined1) = (_endpos_xs_inlined1_, _startpos__1_inlined3_, xs_inlined1, _1_inlined5, _1_inlined4) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 45800 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 45805 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 45811 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 45822 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 45828 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 45841 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 45847 "parsing/parser.ml" - - in - let x1 = - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 45857 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 45862 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 45868 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 45879 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 45885 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 45898 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 45904 "parsing/parser.ml" - - in - -# 1458 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 45910 "parsing/parser.ml" + let _startpos = _startpos_me_ in + let _endpos = _endpos_me_ in + let _v : (Parsetree.module_expr) = +# 1644 "parsing/parser.mly" + ( me ) +<<<<<<< HEAD +# 39696 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40257 "parsing/parser.ml" +||||||| 04da777f7 +# 40252 "parsing/parser.ml" +======= +# 40266 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45919,33 +68425,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = attr; + MenhirLib.EngineTypes.startp = _startpos_attr_; + MenhirLib.EngineTypes.endp = _endpos_attr_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in + let attr : (Parsetree.attribute) = Obj.magic attr in + let me : (Parsetree.module_expr) = Obj.magic me in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type list) = -# 1454 "parsing/parser.mly" - ( x :: xs ) -# 45949 "parsing/parser.ml" + let _startpos = _startpos_me_ in + let _endpos = _endpos_attr_ in + let _v : (Parsetree.module_expr) = +# 1646 "parsing/parser.mly" + ( Mod.attr me attr ) +<<<<<<< HEAD +# 39728 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40289 "parsing/parser.ml" +||||||| 04da777f7 +# 40284 "parsing/parser.ml" +======= +# 40298 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45957,34 +68466,87 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x2; - MenhirLib.EngineTypes.startp = _startpos_x2_; - MenhirLib.EngineTypes.endp = _endpos_x2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x1; - MenhirLib.EngineTypes.startp = _startpos_x1_; - MenhirLib.EngineTypes.endp = _endpos_x1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x2 : (Parsetree.core_type) = Obj.magic x2 in - let _2 : unit = Obj.magic _2 in - let x1 : (Parsetree.core_type) = Obj.magic x1 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x1_ in - let _endpos = _endpos_x2_ in - let _v : (Parsetree.core_type list) = -# 1458 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 45988 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.module_expr) = let _1 = + let _1 = + let x = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 39759 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40320 "parsing/parser.ml" +||||||| 04da777f7 +# 40315 "parsing/parser.ml" +======= +# 40329 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1650 "parsing/parser.mly" + ( Pmod_ident x ) +<<<<<<< HEAD +# 39765 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40326 "parsing/parser.ml" +||||||| 04da777f7 +# 40321 "parsing/parser.ml" +======= +# 40335 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1238 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +<<<<<<< HEAD +# 39774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40335 "parsing/parser.ml" +||||||| 04da777f7 +# 40330 "parsing/parser.ml" +======= +# 40344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1661 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 39780 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40341 "parsing/parser.ml" +||||||| 04da777f7 +# 40336 "parsing/parser.ml" +======= +# 40350 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45996,20 +68558,73 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = me2; + MenhirLib.EngineTypes.startp = _startpos_me2_; + MenhirLib.EngineTypes.endp = _endpos_me2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = me1; + MenhirLib.EngineTypes.startp = _startpos_me1_; + MenhirLib.EngineTypes.endp = _endpos_me1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.row_field) = Obj.magic _1 in + let me2 : (Parsetree.module_expr) = Obj.magic me2 in + let me1 : (Parsetree.module_expr) = Obj.magic me1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.row_field) = -# 4292 "parsing/parser.mly" - ( _1 ) -# 46013 "parsing/parser.ml" + let _startpos = _startpos_me1_ in + let _endpos = _endpos_me2_ in + let _v : (Parsetree.module_expr) = let _1 = + let _1 = +# 1653 "parsing/parser.mly" + ( Pmod_apply(me1, me2) ) +<<<<<<< HEAD +# 39813 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40374 "parsing/parser.ml" +||||||| 04da777f7 +# 40369 "parsing/parser.ml" +======= +# 40383 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos__1_, _startpos__1_) = (_endpos_me2_, _startpos_me1_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1238 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +<<<<<<< HEAD +# 39822 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40383 "parsing/parser.ml" +||||||| 04da777f7 +# 40378 "parsing/parser.ml" +======= +# 40392 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1661 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 39828 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40389 "parsing/parser.ml" +||||||| 04da777f7 +# 40384 "parsing/parser.ml" +======= +# 40398 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46021,23 +68636,80 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let me : (Parsetree.module_expr) = Obj.magic me in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.row_field) = let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_me_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.module_expr) = let _1 = + let _1 = +# 1656 "parsing/parser.mly" + ( Pmod_apply_unit me ) +<<<<<<< HEAD +# 39868 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40429 "parsing/parser.ml" +||||||| 04da777f7 +# 40424 "parsing/parser.ml" +======= +# 40438 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_me_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1238 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +<<<<<<< HEAD +# 39877 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40438 "parsing/parser.ml" +||||||| 04da777f7 +# 40433 "parsing/parser.ml" +======= +# 40447 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4294 "parsing/parser.mly" - ( Rf.inherit_ ~loc:(make_loc _sloc) _1 ) -# 46041 "parsing/parser.ml" +# 1661 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 39883 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40444 "parsing/parser.ml" +||||||| 04da777f7 +# 40439 "parsing/parser.ml" +======= +# 40453 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46050,36 +68722,65 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = ex; + MenhirLib.EngineTypes.startp = _startpos_ex_; + MenhirLib.EngineTypes.endp = _endpos_ex_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let ex : (Parsetree.extension) = Obj.magic ex in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.expression list) = let _2 = -# 124 "" - ( None ) -# 46066 "parsing/parser.ml" - in - let x = + let _startpos = _startpos_ex_ in + let _endpos = _endpos_ex_ in + let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 46072 "parsing/parser.ml" +# 1659 "parsing/parser.mly" + ( Pmod_extension ex ) +<<<<<<< HEAD +# 39909 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40470 "parsing/parser.ml" +||||||| 04da777f7 +# 40465 "parsing/parser.ml" +======= +# 40479 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let (_endpos__1_, _startpos__1_) = (_endpos_ex_, _startpos_ex_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2823 "parsing/parser.mly" - ( _1 ) -# 46077 "parsing/parser.ml" +# 1238 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +<<<<<<< HEAD +# 39918 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40479 "parsing/parser.ml" +||||||| 04da777f7 +# 40474 "parsing/parser.ml" +======= +# 40488 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1475 "parsing/parser.mly" - ( [x] ) -# 46083 "parsing/parser.ml" +# 1661 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 39924 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40485 "parsing/parser.ml" +||||||| 04da777f7 +# 40480 "parsing/parser.ml" +======= +# 40494 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46091,44 +68792,79 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = x; MenhirLib.EngineTypes.startp = _startpos_x_; MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : unit = Obj.magic x in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let x : ( +# 1061 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 39945 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40506 "parsing/parser.ml" +||||||| 04da777f7 +# 40501 "parsing/parser.ml" +======= +# 40515 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in - let _v : (Parsetree.expression list) = let _2 = -# 126 "" - ( Some x ) -# 46115 "parsing/parser.ml" + let _v : (string option) = +# 1615 "parsing/parser.mly" + ( Some x ) +<<<<<<< HEAD +# 39953 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40514 "parsing/parser.ml" +||||||| 04da777f7 +# 40509 "parsing/parser.ml" +======= +# 40523 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let x = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 46121 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 46126 "parsing/parser.ml" - - in - -# 1475 "parsing/parser.mly" - ( [x] ) -# 46132 "parsing/parser.ml" + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string option) = +# 1618 "parsing/parser.mly" + ( None ) +<<<<<<< HEAD +# 39978 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40539 "parsing/parser.ml" +||||||| 04da777f7 +# 40534 "parsing/parser.ml" +======= +# 40548 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46141,102 +68877,194 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; } = _menhir_stack in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : ( +# 1061 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 40038 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40599 "parsing/parser.ml" +||||||| 04da777f7 +# 40594 "parsing/parser.ml" +======= +# 40608 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression list) = let _2 = -# 124 "" - ( None ) -# 46178 "parsing/parser.ml" - in - let x = - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 46187 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 46192 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 46198 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 46209 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 46215 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 46228 "parsing/parser.ml" - - in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.module_substitution * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined4 in -# 2823 "parsing/parser.mly" - ( _1 ) -# 46234 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 40051 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40612 "parsing/parser.ml" +||||||| 04da777f7 +# 40607 "parsing/parser.ml" +======= +# 40621 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let body = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 40063 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40624 "parsing/parser.ml" +||||||| 04da777f7 +# 40619 "parsing/parser.ml" +======= +# 40633 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let uid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 40074 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40635 "parsing/parser.ml" +||||||| 04da777f7 +# 40630 "parsing/parser.ml" +======= +# 40644 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 40082 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40643 "parsing/parser.ml" +||||||| 04da777f7 +# 40638 "parsing/parser.ml" +======= +# 40652 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1475 "parsing/parser.mly" - ( [x] ) -# 46240 "parsing/parser.ml" +<<<<<<< HEAD +# 2136 "parsing/parser.mly" +||||||| 04da777f7 +# 2134 "parsing/parser.mly" +======= +# 2124 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Ms.mk uid body ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 40096 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40657 "parsing/parser.ml" +||||||| 04da777f7 +# 40652 "parsing/parser.ml" +======= +# 40666 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46249,14 +69077,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined2; @@ -46268,90 +69096,113 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in - let x : unit = Obj.magic x in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : ( +# 1061 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 40149 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40710 "parsing/parser.ml" +||||||| 04da777f7 +# 40705 "parsing/parser.ml" +======= +# 40719 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : (string Asttypes.loc option) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.expression list) = let _2 = -# 126 "" - ( Some x ) -# 46293 "parsing/parser.ml" - in - let x = - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 46302 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 46307 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 46313 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 46324 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 46330 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 46343 "parsing/parser.ml" - - in + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_substitution * string Asttypes.loc option) = let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2823 "parsing/parser.mly" - ( _1 ) -# 46349 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 40165 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40726 "parsing/parser.ml" +||||||| 04da777f7 +# 40721 "parsing/parser.ml" +======= +# 40735 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 40173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40734 "parsing/parser.ml" +||||||| 04da777f7 +# 40729 "parsing/parser.ml" +======= +# 40743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in -# 1475 "parsing/parser.mly" - ( [x] ) -# 46355 "parsing/parser.ml" +<<<<<<< HEAD +# 2143 "parsing/parser.mly" +||||||| 04da777f7 +# 2141 "parsing/parser.mly" +======= +# 2131 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__6_ "module path" ) +<<<<<<< HEAD +# 40180 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40741 "parsing/parser.ml" +||||||| 04da777f7 +# 40736 "parsing/parser.ml" +======= +# 40750 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46364,45 +69215,85 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let xs : (Parsetree.expression list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let s : (Parsetree.signature) = Obj.magic s in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression list) = let x = - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 46395 "parsing/parser.ml" - in + let _endpos = _endpos__4_ in + let _v : (Parsetree.module_type) = let attrs = + let _1 = _1_inlined1 in -# 2823 "parsing/parser.mly" - ( _1 ) -# 46400 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 40228 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40789 "parsing/parser.ml" +||||||| 04da777f7 +# 40784 "parsing/parser.ml" +======= +# 40798 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1479 "parsing/parser.mly" - ( x :: xs ) -# 46406 "parsing/parser.ml" +<<<<<<< HEAD +# 1962 "parsing/parser.mly" +||||||| 04da777f7 +# 1961 "parsing/parser.mly" +======= +# 1951 "parsing/parser.mly" +>>>>>>> origin/main + ( mkmty ~loc:_sloc ~attrs (Pmty_signature s) ) +<<<<<<< HEAD +# 40237 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40798 "parsing/parser.ml" +||||||| 04da777f7 +# 40793 "parsing/parser.ml" +======= +# 40807 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46415,112 +69306,84 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let xs : (Parsetree.expression list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in - let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.signature) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression list) = let x = - let (_endpos_xs_, xs) = (_endpos_xs_inlined1_, xs_inlined1) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 46471 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 46476 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 46482 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 46493 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 46499 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 46512 "parsing/parser.ml" - - in + let _endpos = _endpos__4_ in + let _v : (Parsetree.module_type) = let _2 = + let _1 = _1_inlined1 in -# 2823 "parsing/parser.mly" - ( _1 ) -# 46518 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 40285 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40846 "parsing/parser.ml" +||||||| 04da777f7 +# 40841 "parsing/parser.ml" +======= +# 40855 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _loc__4_ = (_startpos__4_, _endpos__4_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1479 "parsing/parser.mly" - ( x :: xs ) -# 46524 "parsing/parser.ml" +<<<<<<< HEAD +# 1964 "parsing/parser.mly" +||||||| 04da777f7 +# 1963 "parsing/parser.mly" +======= +# 1953 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "sig" _loc__1_ "end" _loc__4_ ) +<<<<<<< HEAD +# 40293 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40854 "parsing/parser.ml" +||||||| 04da777f7 +# 40849 "parsing/parser.ml" +======= +# 40863 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46533,9 +69396,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = oe; - MenhirLib.EngineTypes.startp = _startpos_oe_; - MenhirLib.EngineTypes.endp = _endpos_oe_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -46544,54 +69407,32 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let oe : (Parsetree.expression option) = Obj.magic oe in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 46552 "parsing/parser.ml" - ) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_oe_ in - let _v : ((string Location.loc * Parsetree.expression) list) = let _2 = -# 124 "" - ( None ) -# 46560 "parsing/parser.ml" - in - let x = - let label = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 46567 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 46575 "parsing/parser.ml" - - in - -# 3351 "parsing/parser.mly" - ( let label, e = - match oe with - | None -> - (* No expression; this is a pun. Desugar it. *) - make_ghost label, exp_of_label label - | Some e -> - label, e - in - label, e ) -# 46589 "parsing/parser.ml" - - in + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1475 "parsing/parser.mly" - ( [x] ) -# 46595 "parsing/parser.ml" +<<<<<<< HEAD +# 1966 "parsing/parser.mly" +||||||| 04da777f7 +# 1965 "parsing/parser.mly" +======= +# 1955 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__1_ "sig" ) +<<<<<<< HEAD +# 40326 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40887 "parsing/parser.ml" +||||||| 04da777f7 +# 40882 "parsing/parser.ml" +======= +# 40896 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46604,72 +69445,114 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = oe; - MenhirLib.EngineTypes.startp = _startpos_oe_; - MenhirLib.EngineTypes.endp = _endpos_oe_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let x : unit = Obj.magic x in - let oe : (Parsetree.expression option) = Obj.magic oe in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 46630 "parsing/parser.ml" - ) = Obj.magic _1 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : ((string Location.loc * Parsetree.expression) list) = let _2 = -# 126 "" - ( Some x ) -# 46638 "parsing/parser.ml" - in - let x = - let label = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 46645 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 46653 "parsing/parser.ml" - - in + let _endpos = _endpos_mty_ in + let _v : (Parsetree.module_type) = let args = + let _1 = _1_inlined2 in + +# 1598 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 40381 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40942 "parsing/parser.ml" +||||||| 04da777f7 +# 40937 "parsing/parser.ml" +======= +# 40951 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main -# 3351 "parsing/parser.mly" - ( let label, e = - match oe with - | None -> - (* No expression; this is a pun. Desugar it. *) - make_ghost label, exp_of_label label - | Some e -> - label, e in - label, e ) -# 46667 "parsing/parser.ml" + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 40389 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40950 "parsing/parser.ml" +||||||| 04da777f7 +# 40945 "parsing/parser.ml" +======= +# 40959 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_mty_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1475 "parsing/parser.mly" - ( [x] ) -# 46673 "parsing/parser.ml" +<<<<<<< HEAD +# 1970 "parsing/parser.mly" +||||||| 04da777f7 +# 1969 "parsing/parser.mly" +======= +# 1959 "parsing/parser.mly" +>>>>>>> origin/main + ( wrap_mty_attrs ~loc:_sloc attrs ( + List.fold_left (fun acc (startpos, arg) -> + mkmty ~loc:(startpos, _endpos) (Pmty_functor (arg, acc)) + ) mty args + ) ) +<<<<<<< HEAD +# 40402 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 40963 "parsing/parser.ml" +||||||| 04da777f7 +# 40958 "parsing/parser.ml" +======= +# 40972 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46682,104 +69565,92 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = oe; - MenhirLib.EngineTypes.startp = _startpos_oe_; - MenhirLib.EngineTypes.endp = _endpos_oe_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; } = _menhir_stack in - let xs : ((string Location.loc * Parsetree.expression) list) = Obj.magic xs in + let _5 : (Parsetree.module_expr) = Obj.magic _5 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let oe : (Parsetree.expression option) = Obj.magic oe in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 46715 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : ((string Location.loc * Parsetree.expression) list) = let x = - let label = - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 46725 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 46733 "parsing/parser.ml" - - in + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_type) = let _4 = + let _1 = _1_inlined1 in -# 3351 "parsing/parser.mly" - ( let label, e = - match oe with - | None -> - (* No expression; this is a pun. Desugar it. *) - make_ghost label, exp_of_label label - | Some e -> - label, e - in - label, e ) -# 46747 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 40457 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 41018 "parsing/parser.ml" +||||||| 04da777f7 +# 41013 "parsing/parser.ml" +======= +# 41027 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1479 "parsing/parser.mly" - ( x :: xs ) -# 46753 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : (Parsetree.pattern) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.pattern list) = let _2 = -# 124 "" - ( None ) -# 46778 "parsing/parser.ml" - in - -# 1475 "parsing/parser.mly" - ( [x] ) -# 46783 "parsing/parser.ml" +<<<<<<< HEAD +# 1976 "parsing/parser.mly" +||||||| 04da777f7 +# 1975 "parsing/parser.mly" +======= +# 1965 "parsing/parser.mly" +>>>>>>> origin/main + ( mkmty ~loc:_sloc ~attrs:_4 (Pmty_typeof _5) ) +<<<<<<< HEAD +# 40466 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41027 "parsing/parser.ml" +||||||| 04da777f7 +# 41022 "parsing/parser.ml" +======= +# 41036 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46792,34 +69663,49 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let x_inlined1 : unit = Obj.magic x_inlined1 in - let x : (Parsetree.pattern) = Obj.magic x in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_type) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_inlined1_ in - let _v : (Parsetree.pattern list) = let _2 = - let x = x_inlined1 in - -# 126 "" - ( Some x ) -# 46817 "parsing/parser.ml" - - in - -# 1475 "parsing/parser.mly" - ( [x] ) -# 46823 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.module_type) = +<<<<<<< HEAD +# 1978 "parsing/parser.mly" +||||||| 04da777f7 +# 1977 "parsing/parser.mly" +======= +# 1967 "parsing/parser.mly" +>>>>>>> origin/main + ( _2 ) +<<<<<<< HEAD +# 40505 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41066 "parsing/parser.ml" +||||||| 04da777f7 +# 41061 "parsing/parser.ml" +======= +# 41075 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46832,9 +69718,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -46842,23 +69728,41 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let xs : (Parsetree.pattern list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in - let x : (Parsetree.pattern) = Obj.magic x in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_type) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.pattern list) = -# 1479 "parsing/parser.mly" - ( x :: xs ) -# 46862 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.module_type) = let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1980 "parsing/parser.mly" +||||||| 04da777f7 +# 1979 "parsing/parser.mly" +======= +# 1969 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__1_ ")" _loc__3_ ) +<<<<<<< HEAD +# 40546 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41107 "parsing/parser.ml" +||||||| 04da777f7 +# 41102 "parsing/parser.ml" +======= +# 41116 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46871,67 +69775,42 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = eo; - MenhirLib.EngineTypes.startp = _startpos_eo_; - MenhirLib.EngineTypes.endp = _endpos_eo_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = c; - MenhirLib.EngineTypes.startp = _startpos_c_; - MenhirLib.EngineTypes.endp = _endpos_c_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let eo : (Parsetree.expression option) = Obj.magic eo in - let c : (N_ary.type_constraint option) = Obj.magic c in - let _1 : (Longident.t) = Obj.magic _1 in + let _2 : (Parsetree.attribute) = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_eo_ in - let _v : ((Longident.t Location.loc * Parsetree.expression) list) = let _2 = -# 124 "" - ( None ) -# 46901 "parsing/parser.ml" - in - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 46911 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_eo_ in - let _symbolstartpos = _startpos_label_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3334 "parsing/parser.mly" - ( let constraint_loc, label, e = - match eo with - | None -> - (* No pattern; this is a pun. Desugar it. *) - _sloc, make_ghost label, exp_of_longident label - | Some e -> - (_startpos_c_, _endpos), label, e - in - label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 46929 "parsing/parser.ml" - - in - -# 1475 "parsing/parser.mly" - ( [x] ) -# 46935 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = +<<<<<<< HEAD +# 1982 "parsing/parser.mly" +||||||| 04da777f7 +# 1981 "parsing/parser.mly" +======= +# 1971 "parsing/parser.mly" +>>>>>>> origin/main + ( Mty.attr _1 _2 ) +<<<<<<< HEAD +# 40578 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41139 "parsing/parser.ml" +||||||| 04da777f7 +# 41134 "parsing/parser.ml" +======= +# 41148 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46943,21 +69822,125 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = eo; - MenhirLib.EngineTypes.startp = _startpos_eo_; - MenhirLib.EngineTypes.endp = _endpos_eo_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = c; - MenhirLib.EngineTypes.startp = _startpos_c_; - MenhirLib.EngineTypes.endp = _endpos_c_; - MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.module_type) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 40609 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41170 "parsing/parser.ml" +||||||| 04da777f7 +# 41165 "parsing/parser.ml" +======= +# 41179 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 1985 "parsing/parser.mly" +||||||| 04da777f7 +# 1984 "parsing/parser.mly" +======= +# 1974 "parsing/parser.mly" +>>>>>>> origin/main + ( Pmty_ident _1 ) +<<<<<<< HEAD +# 40615 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41176 "parsing/parser.ml" +||||||| 04da777f7 +# 41171 "parsing/parser.ml" +======= +# 41185 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +<<<<<<< HEAD +# 40624 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41185 "parsing/parser.ml" +||||||| 04da777f7 +# 41180 "parsing/parser.ml" +======= +# 41194 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 1998 "parsing/parser.mly" +||||||| 04da777f7 +# 1997 "parsing/parser.mly" +======= +# 1987 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41191 "parsing/parser.ml" +||||||| 04da777f7 +# 41186 "parsing/parser.ml" +======= +# 41200 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; @@ -46967,51 +69950,172 @@ module Tables = struct }; }; } = _menhir_stack in - let x : unit = Obj.magic x in - let eo : (Parsetree.expression option) = Obj.magic eo in - let c : (N_ary.type_constraint option) = Obj.magic c in - let _1 : (Longident.t) = Obj.magic _1 in + let _4 : (Parsetree.module_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in - let _v : ((Longident.t Location.loc * Parsetree.expression) list) = let _2 = -# 126 "" - ( Some x ) -# 46981 "parsing/parser.ml" - in - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 46991 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_eo_ in - let _symbolstartpos = _startpos_label_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.module_type) = let _1 = + let _1 = +<<<<<<< HEAD +# 1987 "parsing/parser.mly" +||||||| 04da777f7 +# 1986 "parsing/parser.mly" +======= +# 1976 "parsing/parser.mly" +>>>>>>> origin/main + ( Pmty_functor(Unit, _4) ) +<<<<<<< HEAD +# 40677 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41238 "parsing/parser.ml" +||||||| 04da777f7 +# 41233 "parsing/parser.ml" +======= +# 41247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3334 "parsing/parser.mly" - ( let constraint_loc, label, e = - match eo with - | None -> - (* No pattern; this is a pun. Desugar it. *) - _sloc, make_ghost label, exp_of_longident label - | Some e -> - (_startpos_c_, _endpos), label, e - in - label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 47009 "parsing/parser.ml" +# 1240 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +<<<<<<< HEAD +# 40686 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41247 "parsing/parser.ml" +||||||| 04da777f7 +# 41242 "parsing/parser.ml" +======= +# 41256 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 1998 "parsing/parser.mly" +||||||| 04da777f7 +# 1997 "parsing/parser.mly" +======= +# 1987 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40692 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41253 "parsing/parser.ml" +||||||| 04da777f7 +# 41248 "parsing/parser.ml" +======= +# 41262 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.module_type) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.module_type) = let _1 = + let _1 = +<<<<<<< HEAD +# 1990 "parsing/parser.mly" +||||||| 04da777f7 +# 1989 "parsing/parser.mly" +======= +# 1979 "parsing/parser.mly" +>>>>>>> origin/main + ( Pmty_functor(Named (mknoloc None, _1), _3) ) +<<<<<<< HEAD +# 40732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41293 "parsing/parser.ml" +||||||| 04da777f7 +# 41288 "parsing/parser.ml" +======= +# 41302 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in - in - -# 1475 "parsing/parser.mly" - ( [x] ) -# 47015 "parsing/parser.ml" +# 1240 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +<<<<<<< HEAD +# 40741 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41302 "parsing/parser.ml" +||||||| 04da777f7 +# 41297 "parsing/parser.ml" +======= +# 41311 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 1998 "parsing/parser.mly" +||||||| 04da777f7 +# 1997 "parsing/parser.mly" +======= +# 1987 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40747 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41308 "parsing/parser.ml" +||||||| 04da777f7 +# 41303 "parsing/parser.ml" +======= +# 41317 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47033,67 +70137,116 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = eo; - MenhirLib.EngineTypes.startp = _startpos_eo_; - MenhirLib.EngineTypes.endp = _endpos_eo_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = c; - MenhirLib.EngineTypes.startp = _startpos_c_; - MenhirLib.EngineTypes.endp = _endpos_c_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let xs : ((Longident.t Location.loc * Parsetree.expression) list) = Obj.magic xs in + let xs : (Parsetree.with_constraint list) = Obj.magic xs in let _2 : unit = Obj.magic _2 in - let eo : (Parsetree.expression option) = Obj.magic eo in - let c : (N_ary.type_constraint option) = Obj.magic c in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos_xs_ in - let _v : ((Longident.t Location.loc * Parsetree.expression) list) = let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Parsetree.module_type) = let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 40789 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41350 "parsing/parser.ml" +||||||| 04da777f7 +# 41345 "parsing/parser.ml" +======= +# 41359 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 40794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41355 "parsing/parser.ml" +||||||| 04da777f7 +# 41350 "parsing/parser.ml" +======= +# 41364 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 47073 "parsing/parser.ml" +<<<<<<< HEAD +# 1992 "parsing/parser.mly" +||||||| 04da777f7 +# 1991 "parsing/parser.mly" +======= +# 1981 "parsing/parser.mly" +>>>>>>> origin/main + ( Pmty_with(_1, _3) ) +<<<<<<< HEAD +# 40800 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41361 "parsing/parser.ml" +||||||| 04da777f7 +# 41356 "parsing/parser.ml" +======= +# 41370 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_eo_ in - let _symbolstartpos = _startpos_label_ in + let _endpos__1_ = _endpos_xs_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3334 "parsing/parser.mly" - ( let constraint_loc, label, e = - match eo with - | None -> - (* No pattern; this is a pun. Desugar it. *) - _sloc, make_ghost label, exp_of_longident label - | Some e -> - (_startpos_c_, _endpos), label, e - in - label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 47091 "parsing/parser.ml" - - in - -# 1479 "parsing/parser.mly" - ( x :: xs ) -# 47097 "parsing/parser.ml" +# 1240 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +<<<<<<< HEAD +# 40810 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41371 "parsing/parser.ml" +||||||| 04da777f7 +# 41366 "parsing/parser.ml" +======= +# 41380 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 1998 "parsing/parser.mly" +||||||| 04da777f7 +# 1997 "parsing/parser.mly" +======= +# 1987 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40816 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41377 "parsing/parser.ml" +||||||| 04da777f7 +# 41372 "parsing/parser.ml" +======= +# 41386 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47111,19 +70264,152 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : (Parsetree.extension) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 47122 "parsing/parser.ml" + let _v : (Parsetree.module_type) = let _1 = + let _1 = +<<<<<<< HEAD +# 1996 "parsing/parser.mly" +||||||| 04da777f7 +# 1995 "parsing/parser.mly" +======= +# 1985 "parsing/parser.mly" +>>>>>>> origin/main + ( Pmty_extension _1 ) +<<<<<<< HEAD +# 40842 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41403 "parsing/parser.ml" +||||||| 04da777f7 +# 41398 "parsing/parser.ml" +======= +# 41412 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +<<<<<<< HEAD +# 40850 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41411 "parsing/parser.ml" +||||||| 04da777f7 +# 41406 "parsing/parser.ml" +======= +# 41420 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 1998 "parsing/parser.mly" +||||||| 04da777f7 +# 1997 "parsing/parser.mly" +======= +# 1987 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 40856 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41417 "parsing/parser.ml" +||||||| 04da777f7 +# 41412 "parsing/parser.ml" +======= +# 41426 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.module_type) = let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 40900 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41461 "parsing/parser.ml" +||||||| 04da777f7 +# 41456 "parsing/parser.ml" +======= +# 41470 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos__1_inlined1_ in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2668 "parsing/parser.mly" - ( _1 ) -# 47127 "parsing/parser.ml" +<<<<<<< HEAD +# 2000 "parsing/parser.mly" +||||||| 04da777f7 +# 1999 "parsing/parser.mly" +======= +# 1989 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Strengthen.mty_of ~loc:(make_loc _sloc) + { mty = _1; mod_id = _3 } ) +<<<<<<< HEAD +# 40911 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41472 "parsing/parser.ml" +||||||| 04da777f7 +# 41467 "parsing/parser.ml" +======= +# 41481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47136,90 +70422,159 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = typ; + MenhirLib.EngineTypes.startp = _startpos_typ_; + MenhirLib.EngineTypes.endp = _endpos_typ_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; } = _menhir_stack in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let typ : (Parsetree.module_type option) = Obj.magic typ in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.expression) = let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 47176 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 47181 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 47187 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 47198 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 47204 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.module_type_declaration * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 40980 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 41541 "parsing/parser.ml" +||||||| 04da777f7 +# 41536 "parsing/parser.ml" +======= +# 41550 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 47217 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 40992 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41553 "parsing/parser.ml" +||||||| 04da777f7 +# 41548 "parsing/parser.ml" +======= +# 41562 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 41000 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 41561 "parsing/parser.ml" +||||||| 04da777f7 +# 41556 "parsing/parser.ml" +======= +# 41570 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2668 "parsing/parser.mly" - ( _1 ) -# 47223 "parsing/parser.ml" +<<<<<<< HEAD +# 1908 "parsing/parser.mly" +||||||| 04da777f7 +# 1907 "parsing/parser.mly" +======= +# 1897 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Mtd.mk id ?typ ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 41014 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41575 "parsing/parser.ml" +||||||| 04da777f7 +# 41570 "parsing/parser.ml" +======= +# 41584 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47232,19 +70587,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = typ; + MenhirLib.EngineTypes.startp = _startpos_typ_; + MenhirLib.EngineTypes.endp = _endpos_typ_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = vars_args_res; - MenhirLib.EngineTypes.startp = _startpos_vars_args_res_; - MenhirLib.EngineTypes.endp = _endpos_vars_args_res_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined2; @@ -47261,11 +70616,17 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos_ext_; MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -47273,32 +70634,41 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let vars_args_res : ((string Location.loc * Jane_asttypes.jkind_annotation option) list * - Parsetree.constructor_arguments * Parsetree.core_type option) = Obj.magic vars_args_res in - let _1_inlined2 : (string) = Obj.magic _1_inlined2 in + let typ : (Parsetree.module_type) = Obj.magic typ in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : (Parsetree.type_exception * string Location.loc option) = let attrs = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 47293 "parsing/parser.ml" - - in - let _endpos_attrs_ = _endpos__1_inlined4_ in - let attrs2 = + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.module_type_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 47302 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 41090 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 41651 "parsing/parser.ml" +||||||| 04da777f7 +# 41646 "parsing/parser.ml" +======= +# 41660 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -47308,35 +70678,75 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47314 "parsing/parser.ml" +<<<<<<< HEAD +# 41102 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41663 "parsing/parser.ml" +||||||| 04da777f7 +# 41658 "parsing/parser.ml" +======= +# 41672 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let attrs1 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 47322 "parsing/parser.ml" +# 41110 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 41671 "parsing/parser.ml" +||||||| 04da777f7 +# 41666 "parsing/parser.ml" +======= +# 41680 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos_attrs_ in - let _startpos = _startpos__1_ in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3868 "parsing/parser.mly" - ( let vars_jkinds, args, res = vars_args_res in - let loc = make_loc (_startpos, _endpos_attrs2_) in - let docs = symbol_docs _sloc in - let ext_ctor = - Jane_syntax.Extension_constructor.extension_constructor_of - ~loc ~name:id ~attrs:(attrs1 @ attrs2) ~docs - (Jext_layout (Lext_decl (vars_jkinds, args, res))) - in - Te.mk_exception ~attrs ext_ctor, ext ) -# 47340 "parsing/parser.ml" +<<<<<<< HEAD +# 2192 "parsing/parser.mly" +||||||| 04da777f7 +# 2190 "parsing/parser.mly" +======= +# 2180 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Mtd.mk id ~typ ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 41124 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 41685 "parsing/parser.ml" +||||||| 04da777f7 +# 41680 "parsing/parser.ml" +======= +# 41694 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47349,34 +70759,59 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xss; - MenhirLib.EngineTypes.startp = _startpos_xss_; - MenhirLib.EngineTypes.endp = _endpos_xss_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let xss : (Parsetree.signature_item list list) = Obj.magic xss in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xss_ in - let _endpos = _endpos_xss_ in - let _v : (Parsetree.signature) = let _1 = - let _1 = -# 260 "" - ( List.flatten xss ) -# 47366 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - -# 1275 "parsing/parser.mly" - ( extra_sig _startpos _endpos _1 ) -# 47374 "parsing/parser.ml" - - in - -# 2077 "parsing/parser.mly" - ( _1 ) -# 47380 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4774 "parsing/parser.mly" + ( _1 ) +# 41149 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4778 "parsing/parser.mly" +||||||| 04da777f7 +# 4771 "parsing/parser.mly" +======= +# 4762 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 41710 "parsing/parser.ml" +||||||| 04da777f7 +# 41705 "parsing/parser.ml" +======= +# 41719 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.mutable_flag) = +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4859 "parsing/parser.mly" + ( Immutable ) +# 41728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47388,40 +70823,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : (Parsetree.extension) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.signature_item) = let _2 = - let _1 = _1_inlined1 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 47414 "parsing/parser.ml" - - in - let _endpos__2_ = _endpos__1_inlined1_ in - let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2092 "parsing/parser.mly" - ( let docs = symbol_docs _sloc in - mksig ~loc:_sloc (Psig_extension (_1, (add_docs_attrs docs _2))) ) -# 47425 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.mutable_flag) = +# 4860 "parsing/parser.mly" + ( Mutable ) +# 41753 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.mutable_flag * Mode.t) = +# 4864 "parsing/parser.mly" + ( Immutable, Mode.empty ) +# 41771 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47439,29 +70872,16 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.attribute) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2096 "parsing/parser.mly" - ( Psig_attribute _1 ) -# 47451 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1323 "parsing/parser.mly" - ( mksig ~loc:_sloc _1 ) -# 47459 "parsing/parser.ml" - - in - -# 2098 "parsing/parser.mly" - ( _1 ) -# 47465 "parsing/parser.ml" + let _v : (Asttypes.mutable_flag * Mode.t) = +# 4866 "parsing/parser.mly" +||||||| 04da777f7 +# 4852 "parsing/parser.mly" + ( Immutable ) +# 41723 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47479,29 +70899,32 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.value_description * string Location.loc option) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2101 "parsing/parser.mly" - ( psig_value _1 ) -# 47491 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 47499 "parsing/parser.ml" - - in - -# 2131 "parsing/parser.mly" - ( _1 ) -# 47505 "parsing/parser.ml" + let _v : (Asttypes.mutable_flag) = +# 4853 "parsing/parser.mly" + ( Mutable ) +# 41748 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.mutable_flag * Mode.t) = +# 4857 "parsing/parser.mly" + ( Immutable, Mode.empty ) +# 41766 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47519,29 +70942,267 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.value_description * string Location.loc option) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2103 "parsing/parser.mly" - ( psig_value _1 ) -# 47531 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 47539 "parsing/parser.ml" - - in + let _v : (Asttypes.mutable_flag * Mode.t) = +# 4859 "parsing/parser.mly" +======= +# 4843 "parsing/parser.mly" +>>>>>>> upstream/main + ( Immutable ) +# 41167 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.mutable_flag) = +# 4856 "parsing/parser.mly" + ( Mutable ) +# 41192 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.mutable_flag * Parsetree.modality Ast_helper.with_loc list) = +# 4860 "parsing/parser.mly" + ( Immutable, [] ) +# 41210 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in +<<<<<<< HEAD + let _v : (Asttypes.mutable_flag * Parsetree.modality Ast_helper.with_loc list) = +# 4862 "parsing/parser.mly" + ( Mutable, [] ) +# 41235 "parsing/parser.ml" +======= + let _v : (Asttypes.mutable_flag * Mode.t) = +# 4850 "parsing/parser.mly" +>>>>>>> origin/main + ( Mutable, Mode.empty ) +<<<<<<< HEAD +# 41796 "parsing/parser.ml" +||||||| 04da777f7 +# 41791 "parsing/parser.ml" +======= +# 41805 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.mutable_flag * Parsetree.modality Ast_helper.with_loc list) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2131 "parsing/parser.mly" - ( _1 ) -# 47545 "parsing/parser.ml" +<<<<<<< HEAD +# 4864 "parsing/parser.mly" + ( Immutable, [ mkloc (Modality "global") (make_loc _sloc)] ) +# 41263 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4868 "parsing/parser.mly" +||||||| 04da777f7 +# 4861 "parsing/parser.mly" +======= +# 4852 "parsing/parser.mly" +>>>>>>> origin/main + ( Immutable, Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +<<<<<<< HEAD +# 41824 "parsing/parser.ml" +||||||| 04da777f7 +# 41819 "parsing/parser.ml" +======= +# 41833 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4876 "parsing/parser.mly" + ( Immutable, Concrete ) +# 41281 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4880 "parsing/parser.mly" +||||||| 04da777f7 +# 4873 "parsing/parser.mly" +======= +# 4864 "parsing/parser.mly" +>>>>>>> origin/main + ( Immutable, Concrete ) +<<<<<<< HEAD +# 41842 "parsing/parser.ml" +||||||| 04da777f7 +# 41837 "parsing/parser.ml" +======= +# 41851 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4878 "parsing/parser.mly" + ( Mutable, Concrete ) +# 41306 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4882 "parsing/parser.mly" +||||||| 04da777f7 +# 4875 "parsing/parser.mly" +======= +# 4866 "parsing/parser.mly" +>>>>>>> origin/main + ( Mutable, Concrete ) +<<<<<<< HEAD +# 41867 "parsing/parser.ml" +||||||| 04da777f7 +# 41862 "parsing/parser.ml" +======= +# 41876 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4880 "parsing/parser.mly" + ( Immutable, Virtual ) +# 41331 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4884 "parsing/parser.mly" +||||||| 04da777f7 +# 4877 "parsing/parser.mly" +======= +# 4868 "parsing/parser.mly" +>>>>>>> origin/main + ( Immutable, Virtual ) +<<<<<<< HEAD +# 41892 "parsing/parser.ml" +||||||| 04da777f7 +# 41887 "parsing/parser.ml" +======= +# 41901 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47554,64 +71215,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bs; - MenhirLib.EngineTypes.startp = _startpos_bs_; - MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = a; - MenhirLib.EngineTypes.startp = _startpos_a_; - MenhirLib.EngineTypes.endp = _endpos_a_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let bs : (Parsetree.type_declaration list) = Obj.magic bs in - let a : ((Asttypes.rec_flag * string Location.loc option) * - Parsetree.type_declaration) = Obj.magic a in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_a_ in - let _endpos = _endpos_bs_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let _1 = - let _1 = -# 1536 "parsing/parser.mly" - ( let (x, b) = a in x, b :: bs ) -# 47582 "parsing/parser.ml" - in - -# 3641 "parsing/parser.mly" - ( _1 ) -# 47587 "parsing/parser.ml" - - in - -# 3624 "parsing/parser.mly" - ( _1 ) -# 47593 "parsing/parser.ml" - - in - -# 2105 "parsing/parser.mly" - ( psig_type _1 ) -# 47599 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 47609 "parsing/parser.ml" - - in - -# 2131 "parsing/parser.mly" - ( _1 ) -# 47615 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4883 "parsing/parser.mly" + ( Mutable, Virtual ) +# 41363 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4887 "parsing/parser.mly" +||||||| 04da777f7 +# 4880 "parsing/parser.mly" +======= +# 4871 "parsing/parser.mly" +>>>>>>> origin/main + ( Mutable, Virtual ) +<<<<<<< HEAD +# 41924 "parsing/parser.ml" +||||||| 04da777f7 +# 41919 "parsing/parser.ml" +======= +# 41933 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47624,64 +71265,169 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bs; - MenhirLib.EngineTypes.startp = _startpos_bs_; - MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = a; - MenhirLib.EngineTypes.startp = _startpos_a_; - MenhirLib.EngineTypes.endp = _endpos_a_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let bs : (Parsetree.type_declaration list) = Obj.magic bs in - let a : ((Asttypes.rec_flag * string Location.loc option) * - Parsetree.type_declaration) = Obj.magic a in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_a_ in - let _endpos = _endpos_bs_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let _1 = - let _1 = -# 1536 "parsing/parser.mly" - ( let (x, b) = a in x, b :: bs ) -# 47652 "parsing/parser.ml" - in - -# 3641 "parsing/parser.mly" - ( _1 ) -# 47657 "parsing/parser.ml" - - in - -# 3629 "parsing/parser.mly" - ( _1 ) -# 47663 "parsing/parser.ml" - - in - -# 2107 "parsing/parser.mly" - ( psig_typesubst _1 ) -# 47669 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4883 "parsing/parser.mly" + ( Mutable, Virtual ) +# 41395 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4887 "parsing/parser.mly" +||||||| 04da777f7 +# 4880 "parsing/parser.mly" +======= +# 4871 "parsing/parser.mly" +>>>>>>> origin/main + ( Mutable, Virtual ) +<<<<<<< HEAD +# 41956 "parsing/parser.ml" +||||||| 04da777f7 +# 41951 "parsing/parser.ml" +======= +# 41965 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Asttypes.label) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4826 "parsing/parser.mly" + ( _2 ) +# 41427 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4830 "parsing/parser.mly" +||||||| 04da777f7 +# 4823 "parsing/parser.mly" +======= +# 4814 "parsing/parser.mly" +>>>>>>> origin/main + ( _2 ) +<<<<<<< HEAD +# 41988 "parsing/parser.ml" +||||||| 04da777f7 +# 41983 "parsing/parser.ml" +======= +# 41997 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 41448 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42009 "parsing/parser.ml" +||||||| 04da777f7 +# 42004 "parsing/parser.ml" +======= +# 42018 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string Asttypes.loc * Jane_syntax.Jkind.annotation option) = let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 47679 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 41460 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42021 "parsing/parser.ml" +||||||| 04da777f7 +# 42016 "parsing/parser.ml" +======= +# 42030 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 47685 "parsing/parser.ml" +<<<<<<< HEAD +# 3459 "parsing/parser.mly" +||||||| 04da777f7 +# 3457 "parsing/parser.mly" +======= +# 3447 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, None ) +<<<<<<< HEAD +# 41466 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42027 "parsing/parser.ml" +||||||| 04da777f7 +# 42022 "parsing/parser.ml" +======= +# 42036 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47694,151 +71440,98 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = priv; - MenhirLib.EngineTypes.startp = _startpos_priv_; - MenhirLib.EngineTypes.endp = _endpos_priv_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in - let priv : (Asttypes.private_flag) = Obj.magic priv in - let _7 : unit = Obj.magic _7 in - let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _5 : unit = Obj.magic _5 in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 41514 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42075 "parsing/parser.ml" +||||||| 04da777f7 +# 42070 "parsing/parser.ml" +======= +# 42084 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let _1 = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 47772 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let cs = -# 1528 "parsing/parser.mly" - ( List.rev xs ) -# 47779 "parsing/parser.ml" - in - let tid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 47789 "parsing/parser.ml" - - in - let _4 = -# 4557 "parsing/parser.mly" - ( Recursive ) -# 47795 "parsing/parser.ml" - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 47802 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3963 "parsing/parser.mly" - ( let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, - ext ) -# 47814 "parsing/parser.ml" - - in - -# 3950 "parsing/parser.mly" - ( _1 ) -# 47820 "parsing/parser.ml" - - in - -# 2109 "parsing/parser.mly" - ( psig_typext _1 ) -# 47826 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos__5_ in + let _v : (string Asttypes.loc * Jane_syntax.Jkind.annotation option) = let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 47836 "parsing/parser.ml" - - in - -# 2131 "parsing/parser.mly" - ( _1 ) -# 47842 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 41528 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42089 "parsing/parser.ml" +||||||| 04da777f7 +# 42084 "parsing/parser.ml" +======= +# 42098 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3461 "parsing/parser.mly" +||||||| 04da777f7 +# 3459 "parsing/parser.mly" +======= +# 3449 "parsing/parser.mly" +>>>>>>> origin/main + ( name, Some jkind ) +<<<<<<< HEAD +# 41534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42095 "parsing/parser.ml" +||||||| 04da777f7 +# 42090 "parsing/parser.ml" +======= +# 42104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47850,165 +71543,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = priv; - MenhirLib.EngineTypes.startp = _startpos_priv_; - MenhirLib.EngineTypes.endp = _endpos_priv_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in - let priv : (Asttypes.private_flag) = Obj.magic priv in - let _7 : unit = Obj.magic _7 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let _1 : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let _1 = - let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 47936 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let cs = -# 1528 "parsing/parser.mly" - ( List.rev xs ) -# 47943 "parsing/parser.ml" - in - let tid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 47953 "parsing/parser.ml" - - in - let _4 = - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in - -# 4559 "parsing/parser.mly" - ( not_expecting _loc "nonrec flag" ) -# 47964 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 47972 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3963 "parsing/parser.mly" - ( let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, - ext ) -# 47984 "parsing/parser.ml" - - in - -# 3950 "parsing/parser.mly" - ( _1 ) -# 47990 "parsing/parser.ml" - - in - -# 2109 "parsing/parser.mly" - ( psig_typext _1 ) -# 47996 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48006 "parsing/parser.ml" - - in - -# 2131 "parsing/parser.mly" + let _endpos = _endpos__1_ in +<<<<<<< HEAD + let _v : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = +# 3456 "parsing/parser.mly" +||||||| 04da777f7 + let _v : ((string Asttypes.loc * Jane_asttypes.jkind_annotation option) list) = +# 3454 "parsing/parser.mly" +======= + let _v : ((string Asttypes.loc * Jane_asttypes.jkind_annotation option) list) = +# 3444 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 48012 "parsing/parser.ml" +<<<<<<< HEAD +# 41559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42120 "parsing/parser.ml" +||||||| 04da777f7 +# 42115 "parsing/parser.ml" +======= +# 42129 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48026,29 +71592,58 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.type_exception * string Location.loc option) = Obj.magic _1 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 41580 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42141 "parsing/parser.ml" +||||||| 04da777f7 +# 42136 "parsing/parser.ml" +======= +# 42150 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2111 "parsing/parser.mly" - ( psig_exception _1 ) -# 48038 "parsing/parser.ml" - in + let _v : (string Asttypes.loc list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48046 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 41592 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42153 "parsing/parser.ml" +||||||| 04da777f7 +# 42148 "parsing/parser.ml" +======= +# 42162 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48052 "parsing/parser.ml" +# 221 "" + ( [ x ] ) +<<<<<<< HEAD +# 41598 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42159 "parsing/parser.ml" +||||||| 04da777f7 +# 42154 "parsing/parser.ml" +======= +# 42168 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48061,115 +71656,70 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.module_type) = Obj.magic body in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 41626 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42187 "parsing/parser.ml" +||||||| 04da777f7 +# 42182 "parsing/parser.ml" +======= +# 42196 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 48117 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 48129 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 48137 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2150 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Md.mk name body ~attrs ~loc ~docs, ext - ) -# 48151 "parsing/parser.ml" - - in - -# 2113 "parsing/parser.mly" - ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 48157 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos_xs_ in + let _v : (string Asttypes.loc list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48167 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 41638 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42199 "parsing/parser.ml" +||||||| 04da777f7 +# 42194 "parsing/parser.ml" +======= +# 42208 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48173 "parsing/parser.ml" +# 223 "" + ( x :: xs ) +<<<<<<< HEAD +# 41644 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42205 "parsing/parser.ml" +||||||| 04da777f7 +# 42200 "parsing/parser.ml" +======= +# 42214 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48181,145 +71731,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 41665 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 48245 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let body = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let id = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 48258 "parsing/parser.ml" - - in - let (_endpos_id_, _startpos_id_) = (_endpos__1_, _startpos__1_) in - let _endpos = _endpos_id_ in - let _symbolstartpos = _startpos_id_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2189 "parsing/parser.mly" - ( Mty.alias ~loc:(make_loc _sloc) id ) -# 48268 "parsing/parser.ml" - - in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 48279 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 48287 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2180 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Md.mk name body ~attrs ~loc ~docs, ext - ) -# 48301 "parsing/parser.ml" - - in - -# 2115 "parsing/parser.mly" - ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 48307 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined4_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.modality Ast_helper.with_loc list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48317 "parsing/parser.ml" +# 4412 "parsing/parser.mly" + ( mkloc (Modality _1) (make_loc _sloc) ) +# 41677 "parsing/parser.ml" in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48323 "parsing/parser.ml" +# 221 "" + ( [ x ] ) +# 41683 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48331,35 +71771,41 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.module_substitution * string Location.loc option) = Obj.magic _1 in + let xs : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic xs in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +# 41711 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2117 "parsing/parser.mly" - ( let (body, ext) = _1 in (Psig_modsubst body, ext) ) -# 48349 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.modality Ast_helper.with_loc list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48357 "parsing/parser.ml" +# 4412 "parsing/parser.mly" + ( mkloc (Modality _1) (make_loc _sloc) ) +# 41723 "parsing/parser.ml" in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48363 "parsing/parser.ml" +# 223 "" + ( x :: xs ) +# 41729 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48371,151 +71817,71 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bs; - MenhirLib.EngineTypes.startp = _startpos_bs_; - MenhirLib.EngineTypes.endp = _endpos_bs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let bs : (Parsetree.module_declaration list) = Obj.magic bs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _6 : unit = Obj.magic _6 in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _4 : unit = Obj.magic _4 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +# 41750 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42226 "parsing/parser.ml" +||||||| 04da777f7 +# 42221 "parsing/parser.ml" +======= +# 42235 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_bs_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let _1 = - let a = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 48451 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 48463 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 48471 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2223 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - ext, Md.mk name mty ~attrs ~loc ~docs - ) -# 48485 "parsing/parser.ml" - - in - -# 1536 "parsing/parser.mly" - ( let (x, b) = a in x, b :: bs ) -# 48491 "parsing/parser.ml" - - in - -# 2212 "parsing/parser.mly" - ( _1 ) -# 48497 "parsing/parser.ml" - - in - -# 2119 "parsing/parser.mly" - ( let (ext, l) = _1 in (Psig_recmodule l, ext) ) -# 48503 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos_bs_ in + let _endpos = _endpos__1_ in + let _v : (Mode.Const.t list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48513 "parsing/parser.ml" +<<<<<<< HEAD +# 4373 "parsing/parser.mly" + ( Mode.Const.mk _1 (make_loc _sloc) ) +# 41762 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4392 "parsing/parser.mly" +||||||| 04da777f7 +# 4385 "parsing/parser.mly" +======= +# 4376 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk _1 (make_loc _sloc) ) +<<<<<<< HEAD +# 42238 "parsing/parser.ml" +||||||| 04da777f7 +# 42233 "parsing/parser.ml" +======= +# 42247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48519 "parsing/parser.ml" +# 221 "" + ( [ x ] ) +<<<<<<< HEAD +# 41768 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42244 "parsing/parser.ml" +||||||| 04da777f7 +# 42239 "parsing/parser.ml" +======= +# 42253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48527,35 +71893,79 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.module_type_declaration * string Location.loc option) = Obj.magic _1 in + let xs : (Mode.Const.t list) = Obj.magic xs in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 41796 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42272 "parsing/parser.ml" +||||||| 04da777f7 +# 42267 "parsing/parser.ml" +======= +# 42281 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2121 "parsing/parser.mly" - ( let (body, ext) = _1 in (Psig_modtype body, ext) ) -# 48545 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v : (Mode.Const.t list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48553 "parsing/parser.ml" +<<<<<<< HEAD +# 4373 "parsing/parser.mly" + ( Mode.Const.mk _1 (make_loc _sloc) ) +# 41808 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4392 "parsing/parser.mly" +||||||| 04da777f7 +# 4385 "parsing/parser.mly" +======= +# 4376 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk _1 (make_loc _sloc) ) +<<<<<<< HEAD +# 42284 "parsing/parser.ml" +||||||| 04da777f7 +# 42279 "parsing/parser.ml" +======= +# 42293 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48559 "parsing/parser.ml" +# 223 "" + ( x :: xs ) +<<<<<<< HEAD +# 41814 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42290 "parsing/parser.ml" +||||||| 04da777f7 +# 42285 "parsing/parser.ml" +======= +# 42299 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48573,29 +71983,52 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.module_type_declaration * string Location.loc option) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2123 "parsing/parser.mly" - ( let (body, ext) = _1 in (Psig_modtypesubst body, ext) ) -# 48585 "parsing/parser.ml" - in + let _v : (Mode.Const.t list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48593 "parsing/parser.ml" +<<<<<<< HEAD +# 4354 "parsing/parser.mly" + ( Mode.Const.mk "local" (make_loc _sloc) ) +# 41843 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4373 "parsing/parser.mly" +||||||| 04da777f7 +# 4366 "parsing/parser.mly" +======= +# 4357 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk "local" (make_loc _sloc) ) +<<<<<<< HEAD +# 42319 "parsing/parser.ml" +||||||| 04da777f7 +# 42314 "parsing/parser.ml" +======= +# 42328 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48599 "parsing/parser.ml" +# 221 "" + ( [ x ] ) +<<<<<<< HEAD +# 41849 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42325 "parsing/parser.ml" +||||||| 04da777f7 +# 42320 "parsing/parser.ml" +======= +# 42334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48613,29 +72046,52 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.open_description * string Location.loc option) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2125 "parsing/parser.mly" - ( let (body, ext) = _1 in (Psig_open body, ext) ) -# 48625 "parsing/parser.ml" - in + let _v : (Mode.Const.t list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48633 "parsing/parser.ml" +<<<<<<< HEAD +# 4356 "parsing/parser.mly" + ( Mode.Const.mk "unique" (make_loc _sloc) ) +# 41878 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4375 "parsing/parser.mly" +||||||| 04da777f7 +# 4368 "parsing/parser.mly" +======= +# 4359 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk "unique" (make_loc _sloc) ) +<<<<<<< HEAD +# 42354 "parsing/parser.ml" +||||||| 04da777f7 +# 42349 "parsing/parser.ml" +======= +# 42363 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48639 "parsing/parser.ml" +# 221 "" + ( [ x ] ) +<<<<<<< HEAD +# 41884 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42360 "parsing/parser.ml" +||||||| 04da777f7 +# 42355 "parsing/parser.ml" +======= +# 42369 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48647,163 +72103,58 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bs; - MenhirLib.EngineTypes.startp = _startpos_bs_; - MenhirLib.EngineTypes.endp = _endpos_bs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let bs : (Parsetree.class_description list) = Obj.magic bs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let cty : (Parsetree.class_type) = Obj.magic cty in - let _7 : unit = Obj.magic _7 in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 48718 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_bs_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = - let _1 = - let _1 = - let a = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 48738 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 48750 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 48758 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2570 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - ext, - Ci.mk id cty ~virt ~params ~attrs ~loc ~docs - ) -# 48773 "parsing/parser.ml" - - in - -# 1536 "parsing/parser.mly" - ( let (x, b) = a in x, b :: bs ) -# 48779 "parsing/parser.ml" - - in - -# 2558 "parsing/parser.mly" - ( _1 ) -# 48785 "parsing/parser.ml" - - in - -# 2127 "parsing/parser.mly" - ( let (ext, l) = _1 in (Psig_class l, ext) ) -# 48791 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos_bs_ in + let _endpos = _endpos__1_ in + let _v : (Mode.Const.t list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48801 "parsing/parser.ml" +<<<<<<< HEAD +# 4358 "parsing/parser.mly" + ( Mode.Const.mk "once" (make_loc _sloc) ) +# 41913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4377 "parsing/parser.mly" +||||||| 04da777f7 +# 4370 "parsing/parser.mly" +======= +# 4361 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk "once" (make_loc _sloc) ) +<<<<<<< HEAD +# 42389 "parsing/parser.ml" +||||||| 04da777f7 +# 42384 "parsing/parser.ml" +======= +# 42398 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48807 "parsing/parser.ml" +# 221 "" + ( [ x ] ) +<<<<<<< HEAD +# 41919 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42395 "parsing/parser.ml" +||||||| 04da777f7 +# 42390 "parsing/parser.ml" +======= +# 42404 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48815,35 +72166,65 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (string Location.loc option * Parsetree.class_type_declaration list) = Obj.magic _1 in + let xs : (Mode.Const.t list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.signature_item) = let _1 = - let _1 = -# 2129 "parsing/parser.mly" - ( let (ext, l) = _1 in (Psig_class_type l, ext) ) -# 48833 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v : (Mode.Const.t list) = let x = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1340 "parsing/parser.mly" - ( wrap_mksig_ext ~loc:_sloc _1 ) -# 48841 "parsing/parser.ml" +<<<<<<< HEAD +# 4354 "parsing/parser.mly" + ( Mode.Const.mk "local" (make_loc _sloc) ) +# 41955 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4373 "parsing/parser.mly" +||||||| 04da777f7 +# 4366 "parsing/parser.mly" +======= +# 4357 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk "local" (make_loc _sloc) ) +<<<<<<< HEAD +# 42431 "parsing/parser.ml" +||||||| 04da777f7 +# 42426 "parsing/parser.ml" +======= +# 42440 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2131 "parsing/parser.mly" - ( _1 ) -# 48847 "parsing/parser.ml" +# 223 "" + ( x :: xs ) +<<<<<<< HEAD +# 41961 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42437 "parsing/parser.ml" +||||||| 04da777f7 +# 42432 "parsing/parser.ml" +======= +# 42446 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48856,89 +72237,64 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = thing; - MenhirLib.EngineTypes.startp = _startpos_thing_; - MenhirLib.EngineTypes.endp = _endpos_thing_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = is_functor; - MenhirLib.EngineTypes.startp = _startpos_is_functor_; - MenhirLib.EngineTypes.endp = _endpos_is_functor_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let thing : (Parsetree.module_type) = Obj.magic thing in - let _1 : (Parsetree.attributes) = Obj.magic _1 in - let ext : (string Location.loc option) = Obj.magic ext in - let is_functor : (bool) = Obj.magic is_functor in + let xs : (Mode.Const.t list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_is_functor_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.signature_item) = let _1 = - let attrs2 = - let _1 = _1_inlined1 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 48903 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined1_ in - let attrs1 = -# 4726 "parsing/parser.mly" - ( _1 ) -# 48910 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos_is_functor_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Mode.Const.t list) = let x = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1961 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let incl = Incl.mk thing ~attrs ~loc ~docs in - is_functor, incl, ext - ) -# 48924 "parsing/parser.ml" +<<<<<<< HEAD +# 4356 "parsing/parser.mly" + ( Mode.Const.mk "unique" (make_loc _sloc) ) +# 41997 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4375 "parsing/parser.mly" +||||||| 04da777f7 +# 4368 "parsing/parser.mly" +======= +# 4359 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk "unique" (make_loc _sloc) ) +<<<<<<< HEAD +# 42473 "parsing/parser.ml" +||||||| 04da777f7 +# 42468 "parsing/parser.ml" +======= +# 42482 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_is_functor_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2133 "parsing/parser.mly" - ( let is_functor, incl, ext = _1 in - let item = - if is_functor - then Jane_syntax.Include_functor.sig_item_of ~loc:(make_loc _sloc) - (Ifsig_include_functor incl) - else mksig ~loc:_sloc (Psig_include incl) - in - wrap_sig_ext ~loc:_sloc item ext - ) -# 48942 "parsing/parser.ml" +# 223 "" + ( x :: xs ) +<<<<<<< HEAD +# 42003 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42479 "parsing/parser.ml" +||||||| 04da777f7 +# 42474 "parsing/parser.ml" +======= +# 42488 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48950,20 +72306,65 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.constant) = Obj.magic _1 in + let xs : (Mode.Const.t list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Constant.t) = -# 4384 "parsing/parser.mly" - ( Constant.value _1 ) -# 48967 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v : (Mode.Const.t list) = let x = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4358 "parsing/parser.mly" + ( Mode.Const.mk "once" (make_loc _sloc) ) +# 42039 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4377 "parsing/parser.mly" +||||||| 04da777f7 +# 4370 "parsing/parser.mly" +======= +# 4361 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.Const.mk "once" (make_loc _sloc) ) +<<<<<<< HEAD +# 42515 "parsing/parser.ml" +||||||| 04da777f7 +# 42510 "parsing/parser.ml" +======= +# 42524 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 223 "" + ( x :: xs ) +<<<<<<< HEAD +# 42045 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42521 "parsing/parser.ml" +||||||| 04da777f7 +# 42516 "parsing/parser.ml" +======= +# 42530 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48976,19 +72377,29 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Constant.t) = Obj.magic _1 in + let x : (string Asttypes.loc * Jane_syntax.Jkind.annotation option) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Constant.t) = -# 4385 "parsing/parser.mly" - ( _1 ) -# 48992 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = +# 221 "" + ( [ x ] ) +<<<<<<< HEAD +# 42070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42546 "parsing/parser.ml" +||||||| 04da777f7 +# 42541 "parsing/parser.ml" +======= +# 42555 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49001,34 +72412,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : ( -# 1079 "parsing/parser.mly" - (string * char option) -# 49019 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let x : (string Asttypes.loc * Jane_syntax.Jkind.annotation option) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Constant.t) = let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in - -# 4386 "parsing/parser.mly" - ( unboxed_int _sloc _loc__2_ Negative _2 ) -# 49032 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_xs_ in + let _v : ((string Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = +# 223 "" + ( x :: xs ) +<<<<<<< HEAD +# 42102 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42578 "parsing/parser.ml" +||||||| 04da777f7 +# 42573 "parsing/parser.ml" +======= +# 42587 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49040,34 +72453,67 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : ( -# 1056 "parsing/parser.mly" - (string * char option) -# 49059 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let s : ( +# 1048 "parsing/parser.mly" + (string * Location.t * string option) +<<<<<<< HEAD +# 42123 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42599 "parsing/parser.ml" +||||||| 04da777f7 +# 42594 "parsing/parser.ml" +======= +# 42608 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Constant.t) = let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_s_ in + let _endpos = _endpos_s_ in + let _v : (string list) = let x = +<<<<<<< HEAD +# 4822 "parsing/parser.mly" + ( let body, _, _ = s in body ) +# 42131 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4826 "parsing/parser.mly" +||||||| 04da777f7 +# 4819 "parsing/parser.mly" +======= +# 4810 "parsing/parser.mly" +>>>>>>> origin/main + ( let body, _, _ = s in body ) +<<<<<<< HEAD +# 42607 "parsing/parser.ml" +||||||| 04da777f7 +# 42602 "parsing/parser.ml" +======= +# 42616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 4387 "parsing/parser.mly" - ( unboxed_float _sloc Negative _2 ) -# 49071 "parsing/parser.ml" +# 221 "" + ( [ x ] ) +<<<<<<< HEAD +# 42136 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42612 "parsing/parser.ml" +||||||| 04da777f7 +# 42607 "parsing/parser.ml" +======= +# 42621 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49080,34 +72526,137 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : ( -# 1079 "parsing/parser.mly" - (string * char option) -# 49098 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : (string list) = Obj.magic xs in + let s : ( +# 1048 "parsing/parser.mly" + (string * Location.t * string option) +<<<<<<< HEAD +# 42164 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42640 "parsing/parser.ml" +||||||| 04da777f7 +# 42635 "parsing/parser.ml" +======= +# 42649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Constant.t) = let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_s_ in + let _endpos = _endpos_xs_ in + let _v : (string list) = let x = +<<<<<<< HEAD +# 4822 "parsing/parser.mly" + ( let body, _, _ = s in body ) +# 42172 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4826 "parsing/parser.mly" +||||||| 04da777f7 +# 4819 "parsing/parser.mly" +======= +# 4810 "parsing/parser.mly" +>>>>>>> origin/main + ( let body, _, _ = s in body ) +<<<<<<< HEAD +# 42648 "parsing/parser.ml" +||||||| 04da777f7 +# 42643 "parsing/parser.ml" +======= +# 42657 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 4388 "parsing/parser.mly" - ( unboxed_int _sloc _loc__2_ Positive _2 ) -# 49111 "parsing/parser.ml" +# 223 "" + ( x :: xs ) +<<<<<<< HEAD +# 42177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42653 "parsing/parser.ml" +||||||| 04da777f7 +# 42648 "parsing/parser.ml" +======= +# 42662 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 42202 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 42678 "parsing/parser.ml" +||||||| 04da777f7 +# 42673 "parsing/parser.ml" +======= +# 42687 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3836 "parsing/parser.mly" +||||||| 04da777f7 +# 3834 "parsing/parser.mly" +======= +# 3825 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_abstract, priv, Some ty) ) +<<<<<<< HEAD +# 42207 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42683 "parsing/parser.ml" +||||||| 04da777f7 +# 42678 "parsing/parser.ml" +======= +# 42692 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49120,9 +72669,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -49131,22 +72680,54 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : ( -# 1056 "parsing/parser.mly" - (string * char option) -# 49138 "parsing/parser.ml" - ) = Obj.magic _2 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Constant.t) = let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4389 "parsing/parser.mly" - ( unboxed_float _sloc Positive _2 ) -# 49150 "parsing/parser.ml" + let _endpos = _endpos_ty_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 42239 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 42715 "parsing/parser.ml" +||||||| 04da777f7 +# 42710 "parsing/parser.ml" +======= +# 42724 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3836 "parsing/parser.mly" +||||||| 04da777f7 +# 3834 "parsing/parser.mly" +======= +# 3825 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_abstract, priv, Some ty) ) +<<<<<<< HEAD +# 42244 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42720 "parsing/parser.ml" +||||||| 04da777f7 +# 42715 "parsing/parser.ml" +======= +# 42729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49159,19 +72740,96 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.constant) = Obj.magic _1 in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.constant) = -# 4377 "parsing/parser.mly" - ( _1 ) -# 49175 "parsing/parser.ml" + let _startpos = _startpos_cs_ in + let _endpos = _endpos_cs_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 42269 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 42745 "parsing/parser.ml" +||||||| 04da777f7 +# 42740 "parsing/parser.ml" +======= +# 42754 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 42275 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42751 "parsing/parser.ml" +||||||| 04da777f7 +# 42746 "parsing/parser.ml" +======= +# 42760 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42280 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42756 "parsing/parser.ml" +||||||| 04da777f7 +# 42751 "parsing/parser.ml" +======= +# 42765 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3840 "parsing/parser.mly" +||||||| 04da777f7 +# 3838 "parsing/parser.mly" +======= +# 3829 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_variant cs, priv, oty) ) +<<<<<<< HEAD +# 42286 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42762 "parsing/parser.ml" +||||||| 04da777f7 +# 42757 "parsing/parser.ml" +======= +# 42771 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49184,9 +72842,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -49195,19 +72853,92 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : ( -# 1078 "parsing/parser.mly" - (string * char option) -# 49202 "parsing/parser.ml" - ) = Obj.magic _2 in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.constant) = -# 4378 "parsing/parser.mly" - ( let (n, m) = _2 in Pconst_integer("-" ^ n, m) ) -# 49211 "parsing/parser.ml" + let _endpos = _endpos_cs_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 42318 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 42794 "parsing/parser.ml" +||||||| 04da777f7 +# 42789 "parsing/parser.ml" +======= +# 42803 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 42324 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42800 "parsing/parser.ml" +||||||| 04da777f7 +# 42795 "parsing/parser.ml" +======= +# 42809 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42329 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42805 "parsing/parser.ml" +||||||| 04da777f7 +# 42800 "parsing/parser.ml" +======= +# 42814 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3840 "parsing/parser.mly" +||||||| 04da777f7 +# 3838 "parsing/parser.mly" +======= +# 3829 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_variant cs, priv, oty) ) +<<<<<<< HEAD +# 42335 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42811 "parsing/parser.ml" +||||||| 04da777f7 +# 42806 "parsing/parser.ml" +======= +# 42820 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49220,30 +72951,127 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : ( -# 1055 "parsing/parser.mly" - (string * char option) -# 49238 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.constant) = -# 4379 "parsing/parser.mly" - ( let (f, m) = _2 in Pconst_float("-" ^ f, m) ) -# 49247 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_cs_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 42374 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 42850 "parsing/parser.ml" +||||||| 04da777f7 +# 42845 "parsing/parser.ml" +======= +# 42859 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = + let x = +# 191 "" + ( x ) +<<<<<<< HEAD +# 42381 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42857 "parsing/parser.ml" +||||||| 04da777f7 +# 42852 "parsing/parser.ml" +======= +# 42866 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 42386 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42862 "parsing/parser.ml" +||||||| 04da777f7 +# 42857 "parsing/parser.ml" +======= +# 42871 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42392 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42868 "parsing/parser.ml" +||||||| 04da777f7 +# 42863 "parsing/parser.ml" +======= +# 42877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3840 "parsing/parser.mly" +||||||| 04da777f7 +# 3838 "parsing/parser.mly" +======= +# 3829 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_variant cs, priv, oty) ) +<<<<<<< HEAD +# 42398 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42874 "parsing/parser.ml" +||||||| 04da777f7 +# 42869 "parsing/parser.ml" +======= +# 42883 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49256,30 +73084,236 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let _2 : ( -# 1078 "parsing/parser.mly" - (string * char option) -# 49274 "parsing/parser.ml" - ) = Obj.magic _2 in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.constant) = -# 4380 "parsing/parser.mly" - ( let (n, m) = _2 in Pconst_integer (n, m) ) -# 49283 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_cs_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 42444 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 42920 "parsing/parser.ml" +||||||| 04da777f7 +# 42915 "parsing/parser.ml" +======= +# 42929 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = + let x = +# 191 "" + ( x ) +<<<<<<< HEAD +# 42451 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42927 "parsing/parser.ml" +||||||| 04da777f7 +# 42922 "parsing/parser.ml" +======= +# 42936 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 42456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42932 "parsing/parser.ml" +||||||| 04da777f7 +# 42927 "parsing/parser.ml" +======= +# 42941 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42462 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42938 "parsing/parser.ml" +||||||| 04da777f7 +# 42933 "parsing/parser.ml" +======= +# 42947 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3840 "parsing/parser.mly" +||||||| 04da777f7 +# 3838 "parsing/parser.mly" +======= +# 3829 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_variant cs, priv, oty) ) +<<<<<<< HEAD +# 42468 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42944 "parsing/parser.ml" +||||||| 04da777f7 +# 42939 "parsing/parser.ml" +======= +# 42953 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__3_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 42493 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 42969 "parsing/parser.ml" +||||||| 04da777f7 +# 42964 "parsing/parser.ml" +======= +# 42978 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 42499 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42975 "parsing/parser.ml" +||||||| 04da777f7 +# 42970 "parsing/parser.ml" +======= +# 42984 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42504 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42980 "parsing/parser.ml" +||||||| 04da777f7 +# 42975 "parsing/parser.ml" +======= +# 42989 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3844 "parsing/parser.mly" +||||||| 04da777f7 +# 3842 "parsing/parser.mly" +======= +# 3833 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_open, priv, oty) ) +<<<<<<< HEAD +# 42510 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 42986 "parsing/parser.ml" +||||||| 04da777f7 +# 42981 "parsing/parser.ml" +======= +# 42995 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49292,9 +73326,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -49303,19 +73337,92 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : ( -# 1055 "parsing/parser.mly" - (string * char option) -# 49310 "parsing/parser.ml" - ) = Obj.magic _2 in + let _3 : unit = Obj.magic _3 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.constant) = -# 4381 "parsing/parser.mly" - ( let (f, m) = _2 in Pconst_float(f, m) ) -# 49319 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 42542 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 43018 "parsing/parser.ml" +||||||| 04da777f7 +# 43013 "parsing/parser.ml" +======= +# 43027 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 42548 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43024 "parsing/parser.ml" +||||||| 04da777f7 +# 43019 "parsing/parser.ml" +======= +# 43033 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42553 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43029 "parsing/parser.ml" +||||||| 04da777f7 +# 43024 "parsing/parser.ml" +======= +# 43038 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3844 "parsing/parser.mly" +||||||| 04da777f7 +# 3842 "parsing/parser.mly" +======= +# 3833 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_open, priv, oty) ) +<<<<<<< HEAD +# 42559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43035 "parsing/parser.ml" +||||||| 04da777f7 +# 43030 "parsing/parser.ml" +======= +# 43044 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49333,57 +73440,122 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in let _3 : unit = Obj.magic _3 in - let _1_inlined1 : ((Longident.t Location.loc * Parsetree.pattern) list * unit option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 42598 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 43074 "parsing/parser.ml" +||||||| 04da777f7 +# 43069 "parsing/parser.ml" +======= +# 43083 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = let _1 = - let _2 = - let _1 = _1_inlined1 in - -# 3553 "parsing/parser.mly" - ( let fields, closed = _1 in - let closed = match closed with Some () -> Open | None -> Closed in - fields, closed ) -# 49364 "parsing/parser.ml" - - in + let x = +# 191 "" + ( x ) +<<<<<<< HEAD +# 42605 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43081 "parsing/parser.ml" +||||||| 04da777f7 +# 43076 "parsing/parser.ml" +======= +# 43090 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 3518 "parsing/parser.mly" - ( let (fields, closed) = _2 in - Ppat_record(fields, closed) ) -# 49371 "parsing/parser.ml" +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 42610 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43086 "parsing/parser.ml" +||||||| 04da777f7 +# 43081 "parsing/parser.ml" +======= +# 43095 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 49381 "parsing/parser.ml" - - in - -# 3532 "parsing/parser.mly" - ( _1 ) -# 49387 "parsing/parser.ml" +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42616 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43092 "parsing/parser.ml" +||||||| 04da777f7 +# 43087 "parsing/parser.ml" +======= +# 43101 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3844 "parsing/parser.mly" +||||||| 04da777f7 +# 3842 "parsing/parser.mly" +======= +# 3833 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_open, priv, oty) ) +<<<<<<< HEAD +# 42622 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43098 "parsing/parser.ml" +||||||| 04da777f7 +# 43093 "parsing/parser.ml" +======= +# 43107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49401,58 +73573,129 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in let _3 : unit = Obj.magic _3 in - let _1_inlined1 : ((Longident.t Location.loc * Parsetree.pattern) list * unit option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 42668 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 43144 "parsing/parser.ml" +||||||| 04da777f7 +# 43139 "parsing/parser.ml" +======= +# 43153 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = let _1 = - let _2 = - let _1 = _1_inlined1 in - -# 3553 "parsing/parser.mly" - ( let fields, closed = _1 in - let closed = match closed with Some () -> Open | None -> Closed in - fields, closed ) -# 49432 "parsing/parser.ml" - - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let x = +# 191 "" + ( x ) +<<<<<<< HEAD +# 42675 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43151 "parsing/parser.ml" +||||||| 04da777f7 +# 43146 "parsing/parser.ml" +======= +# 43160 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 3521 "parsing/parser.mly" - ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 49440 "parsing/parser.ml" +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 42680 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43156 "parsing/parser.ml" +||||||| 04da777f7 +# 43151 "parsing/parser.ml" +======= +# 43165 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 49450 "parsing/parser.ml" - in - -# 3532 "parsing/parser.mly" - ( _1 ) -# 49456 "parsing/parser.ml" +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42686 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43162 "parsing/parser.ml" +||||||| 04da777f7 +# 43157 "parsing/parser.ml" +======= +# 43171 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3844 "parsing/parser.mly" +||||||| 04da777f7 +# 3842 "parsing/parser.mly" +======= +# 3833 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_open, priv, oty) ) +<<<<<<< HEAD +# 42692 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43168 "parsing/parser.ml" +||||||| 04da777f7 +# 43163 "parsing/parser.ml" +======= +# 43177 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49465,57 +73708,110 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ps; - MenhirLib.EngineTypes.startp = _startpos_ps_; - MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in let _3 : unit = Obj.magic _3 in - let ps : (Parsetree.pattern list) = Obj.magic ps in - let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _2 = -# 3547 "parsing/parser.mly" - ( ps ) -# 49497 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3523 "parsing/parser.mly" - ( fst (mktailpat _loc__3_ _2) ) -# 49503 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 49513 "parsing/parser.ml" + let _startpos = _startpos__3_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 42731 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 43207 "parsing/parser.ml" +||||||| 04da777f7 +# 43202 "parsing/parser.ml" +======= +# 43216 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 42737 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43213 "parsing/parser.ml" +||||||| 04da777f7 +# 43208 "parsing/parser.ml" +======= +# 43222 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in - in - -# 3532 "parsing/parser.mly" - ( _1 ) -# 49519 "parsing/parser.ml" +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42742 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43218 "parsing/parser.ml" +||||||| 04da777f7 +# 43213 "parsing/parser.ml" +======= +# 43227 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3848 "parsing/parser.mly" +||||||| 04da777f7 +# 3846 "parsing/parser.mly" +======= +# 3837 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_record ls, priv, oty) ) +<<<<<<< HEAD +# 42748 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43224 "parsing/parser.ml" +||||||| 04da777f7 +# 43219 "parsing/parser.ml" +======= +# 43233 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49528,58 +73824,117 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ps; - MenhirLib.EngineTypes.startp = _startpos_ps_; - MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in let _3 : unit = Obj.magic _3 in - let ps : (Parsetree.pattern list) = Obj.magic ps in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _2 = -# 3547 "parsing/parser.mly" - ( ps ) -# 49560 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 3525 "parsing/parser.mly" - ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 49567 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 49577 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 42794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 43270 "parsing/parser.ml" +||||||| 04da777f7 +# 43265 "parsing/parser.ml" +======= +# 43279 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 42800 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43276 "parsing/parser.ml" +||||||| 04da777f7 +# 43271 "parsing/parser.ml" +======= +# 43285 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in - in - -# 3532 "parsing/parser.mly" - ( _1 ) -# 49583 "parsing/parser.ml" +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42805 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43281 "parsing/parser.ml" +||||||| 04da777f7 +# 43276 "parsing/parser.ml" +======= +# 43290 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3848 "parsing/parser.mly" +||||||| 04da777f7 +# 3846 "parsing/parser.mly" +======= +# 3837 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_record ls, priv, oty) ) +<<<<<<< HEAD +# 42811 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43287 "parsing/parser.ml" +||||||| 04da777f7 +# 43282 "parsing/parser.ml" +======= +# 43296 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49592,74 +73947,141 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ps; - MenhirLib.EngineTypes.startp = _startpos_ps_; - MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in let _3 : unit = Obj.magic _3 in - let ps : (Parsetree.pattern list) = Obj.magic ps in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = + let _startpos = _startpos_x_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 42864 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 43340 "parsing/parser.ml" +||||||| 04da777f7 +# 43335 "parsing/parser.ml" +======= +# 43349 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = let _1 = - let _1 = - let _1 = - let _2 = -# 3547 "parsing/parser.mly" - ( ps ) -# 49626 "parsing/parser.ml" - in - -# 2990 "parsing/parser.mly" - ( Generic_array.Simple.Literal _2 ) -# 49631 "parsing/parser.ml" - - in - -# 3014 "parsing/parser.mly" - ( _1 ) -# 49637 "parsing/parser.ml" - - in + let x = +# 191 "" + ( x ) +<<<<<<< HEAD +# 42871 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43347 "parsing/parser.ml" +||||||| 04da777f7 +# 43342 "parsing/parser.ml" +======= +# 43356 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 3527 "parsing/parser.mly" - ( Generic_array.Pattern.to_ast - "[|" "|]" - (fun elts -> Ppat_array elts) - _1 - ) -# 49647 "parsing/parser.ml" +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 42876 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43352 "parsing/parser.ml" +||||||| 04da777f7 +# 43347 "parsing/parser.ml" +======= +# 43361 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 49657 "parsing/parser.ml" - in - -# 3532 "parsing/parser.mly" +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 49663 "parsing/parser.ml" +<<<<<<< HEAD +# 42882 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43358 "parsing/parser.ml" +||||||| 04da777f7 +# 43353 "parsing/parser.ml" +======= +# 43367 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3848 "parsing/parser.mly" +||||||| 04da777f7 +# 3846 "parsing/parser.mly" +======= +# 3837 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_record ls, priv, oty) ) +<<<<<<< HEAD +# 42888 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43364 "parsing/parser.ml" +||||||| 04da777f7 +# 43359 "parsing/parser.ml" +======= +# 43373 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49672,76 +74094,148 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ps; - MenhirLib.EngineTypes.startp = _startpos_ps_; - MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in let _3 : unit = Obj.magic _3 in - let ps : (Parsetree.pattern list) = Obj.magic ps in let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = + let _startpos = _startpos_x_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 42948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 43424 "parsing/parser.ml" +||||||| 04da777f7 +# 43419 "parsing/parser.ml" +======= +# 43433 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let oty = let _1 = - let _1 = - let _1 = - let _2 = -# 3547 "parsing/parser.mly" - ( ps ) -# 49706 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2992 "parsing/parser.mly" - ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) -# 49713 "parsing/parser.ml" - - in - -# 3014 "parsing/parser.mly" - ( _1 ) -# 49719 "parsing/parser.ml" - - in + let x = +# 191 "" + ( x ) +<<<<<<< HEAD +# 42955 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43431 "parsing/parser.ml" +||||||| 04da777f7 +# 43426 "parsing/parser.ml" +======= +# 43440 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 3527 "parsing/parser.mly" - ( Generic_array.Pattern.to_ast - "[|" "|]" - (fun elts -> Ppat_array elts) - _1 - ) -# 49729 "parsing/parser.ml" +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 42960 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43436 "parsing/parser.ml" +||||||| 04da777f7 +# 43431 "parsing/parser.ml" +======= +# 43445 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 49739 "parsing/parser.ml" - in - -# 3532 "parsing/parser.mly" - ( _1 ) -# 49745 "parsing/parser.ml" +<<<<<<< HEAD +# 3852 "parsing/parser.mly" +||||||| 04da777f7 +# 3850 "parsing/parser.mly" +======= +# 3841 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 42966 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43442 "parsing/parser.ml" +||||||| 04da777f7 +# 43437 "parsing/parser.ml" +======= +# 43451 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3848 "parsing/parser.mly" +||||||| 04da777f7 +# 3846 "parsing/parser.mly" +======= +# 3837 "parsing/parser.mly" +>>>>>>> origin/main + ( (Ptype_record ls, priv, oty) ) +<<<<<<< HEAD +# 42972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43448 "parsing/parser.ml" +||||||| 04da777f7 +# 43443 "parsing/parser.ml" +======= +# 43457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49754,60 +74248,147 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let me : (Parsetree.module_expr) = Obj.magic me in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _1 = -# 2994 "parsing/parser.mly" - ( Generic_array.Simple.Literal [] ) -# 49780 "parsing/parser.ml" - in - -# 3014 "parsing/parser.mly" - ( _1 ) -# 49785 "parsing/parser.ml" - - in - -# 3527 "parsing/parser.mly" - ( Generic_array.Pattern.to_ast - "[|" "|]" - (fun elts -> Ppat_array elts) - _1 - ) -# 49795 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined2 in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 49805 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 43027 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43503 "parsing/parser.ml" +||||||| 04da777f7 +# 43498 "parsing/parser.ml" +======= +# 43512 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - -# 3532 "parsing/parser.mly" + let _endpos_attrs2_ = _endpos__1_inlined2_ in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 49811 "parsing/parser.ml" +# 43036 "parsing/parser.ml" + + in + let override = +# 4910 "parsing/parser.mly" + ( Fresh ) +# 43042 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43512 "parsing/parser.ml" +||||||| 04da777f7 +# 43507 "parsing/parser.ml" +======= +# 43521 "parsing/parser.ml" +>>>>>>> origin/main + + in + let override = +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main + ( Fresh ) +<<<<<<< HEAD +# 43518 "parsing/parser.ml" +||||||| 04da777f7 +# 43513 "parsing/parser.ml" +======= +# 43527 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 1927 "parsing/parser.mly" +||||||| 04da777f7 +# 1926 "parsing/parser.mly" +======= +# 1916 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk me ~override ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 43055 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43531 "parsing/parser.ml" +||||||| 04da777f7 +# 43526 "parsing/parser.ml" +======= +# 43540 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49820,60 +74401,154 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ps; - MenhirLib.EngineTypes.startp = _startpos_ps_; - MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let me : (Parsetree.module_expr) = Obj.magic me in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _2 = -# 3547 "parsing/parser.mly" - ( ps ) -# 49852 "parsing/parser.ml" - in - -# 2990 "parsing/parser.mly" - ( Generic_array.Simple.Literal _2 ) -# 49857 "parsing/parser.ml" - - in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined3 in -# 3014 "parsing/parser.mly" - ( _1 ) -# 49863 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 43117 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43593 "parsing/parser.ml" +||||||| 04da777f7 +# 43588 "parsing/parser.ml" +======= +# 43602 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let attrs1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 43126 "parsing/parser.ml" + + in + let override = +# 4911 "parsing/parser.mly" + ( Override ) +# 43132 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43602 "parsing/parser.ml" +||||||| 04da777f7 +# 43597 "parsing/parser.ml" +======= +# 43611 "parsing/parser.ml" +>>>>>>> origin/main + + in + let override = +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main + ( Override ) +<<<<<<< HEAD +# 43608 "parsing/parser.ml" +||||||| 04da777f7 +# 43603 "parsing/parser.ml" +======= +# 43617 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3534 "parsing/parser.mly" - ( Generic_array.Pattern.to_ast - "[:" ":]" - (ppat_iarray _sloc) - _1 - ) -# 49877 "parsing/parser.ml" +<<<<<<< HEAD +# 1927 "parsing/parser.mly" +||||||| 04da777f7 +# 1926 "parsing/parser.mly" +======= +# 1916 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk me ~override ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 43145 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43621 "parsing/parser.ml" +||||||| 04da777f7 +# 43616 "parsing/parser.ml" +======= +# 43630 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49886,62 +74561,168 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ps; - MenhirLib.EngineTypes.startp = _startpos_ps_; - MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _2 = -# 3547 "parsing/parser.mly" - ( ps ) -# 49918 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2992 "parsing/parser.mly" - ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) -# 49925 "parsing/parser.ml" - - in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined3 in -# 3014 "parsing/parser.mly" - ( _1 ) -# 49931 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 43200 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43676 "parsing/parser.ml" +||||||| 04da777f7 +# 43671 "parsing/parser.ml" +======= +# 43685 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 43212 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43688 "parsing/parser.ml" +||||||| 04da777f7 +# 43683 "parsing/parser.ml" +======= +# 43697 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 43220 "parsing/parser.ml" + + in + let override = +# 4910 "parsing/parser.mly" + ( Fresh ) +# 43226 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43696 "parsing/parser.ml" +||||||| 04da777f7 +# 43691 "parsing/parser.ml" +======= +# 43705 "parsing/parser.ml" +>>>>>>> origin/main + + in + let override = +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main + ( Fresh ) +<<<<<<< HEAD +# 43702 "parsing/parser.ml" +||||||| 04da777f7 +# 43697 "parsing/parser.ml" +======= +# 43711 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3534 "parsing/parser.mly" - ( Generic_array.Pattern.to_ast - "[:" ":]" - (ppat_iarray _sloc) - _1 - ) -# 49945 "parsing/parser.ml" +<<<<<<< HEAD +# 1942 "parsing/parser.mly" +||||||| 04da777f7 +# 1941 "parsing/parser.mly" +======= +# 1931 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk id ~override ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 43239 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43715 "parsing/parser.ml" +||||||| 04da777f7 +# 43710 "parsing/parser.ml" +======= +# 43724 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49954,46 +74735,175 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 2994 "parsing/parser.mly" - ( Generic_array.Simple.Literal [] ) -# 49978 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined4 in -# 3014 "parsing/parser.mly" - ( _1 ) -# 49983 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 43301 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43777 "parsing/parser.ml" +||||||| 04da777f7 +# 43772 "parsing/parser.ml" +======= +# 43786 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 43313 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43789 "parsing/parser.ml" +||||||| 04da777f7 +# 43784 "parsing/parser.ml" +======= +# 43798 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 43321 "parsing/parser.ml" + + in + let override = +# 4911 "parsing/parser.mly" + ( Override ) +# 43327 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 43797 "parsing/parser.ml" +||||||| 04da777f7 +# 43792 "parsing/parser.ml" +======= +# 43806 "parsing/parser.ml" +>>>>>>> origin/main + + in + let override = +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main + ( Override ) +<<<<<<< HEAD +# 43803 "parsing/parser.ml" +||||||| 04da777f7 +# 43798 "parsing/parser.ml" +======= +# 43812 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3534 "parsing/parser.mly" - ( Generic_array.Pattern.to_ast - "[:" ":]" - (ppat_iarray _sloc) - _1 - ) -# 49997 "parsing/parser.ml" +<<<<<<< HEAD +# 1942 "parsing/parser.mly" +||||||| 04da777f7 +# 1941 "parsing/parser.mly" +======= +# 1931 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk id ~override ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 43340 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43816 "parsing/parser.ml" +||||||| 04da777f7 +# 43811 "parsing/parser.ml" +======= +# 43825 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50005,37 +74915,33 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 1033 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 43361 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 43837 "parsing/parser.ml" +||||||| 04da777f7 +# 43832 "parsing/parser.ml" +======= +# 43846 "parsing/parser.ml" +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2881 "parsing/parser.mly" - ( reloc_exp ~loc:_sloc _2 ) -# 50039 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 4673 "parsing/parser.mly" + ( _1 ) +# 43369 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50047,36 +74953,53 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 984 "parsing/parser.mly" + (string) +# 43390 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2883 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 50080 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 4674 "parsing/parser.mly" + ( _1 ) +# 43398 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 985 "parsing/parser.mly" + (string) +# 43419 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 4675 "parsing/parser.mly" + ( _1 ) +# 43427 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50113,19 +75036,20 @@ module Tables = struct }; } = _menhir_stack in let _4 : unit = Obj.magic _4 in - let _3 : (N_ary.type_constraint) = Obj.magic _3 in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 983 "parsing/parser.mly" + (string) +# 43469 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2885 "parsing/parser.mly" - ( mkexp_constraint ~loc:_sloc _2 _3 ) -# 50129 "parsing/parser.ml" + let _v : (Asttypes.label) = +# 4676 "parsing/parser.mly" + ( "."^ _1 ^"(" ^ _3 ^ ")" ) +# 43477 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50143,9 +75067,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -50153,14 +75077,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -50168,33 +75092,21 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 983 "parsing/parser.mly" + (string) +# 43526 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2886 "parsing/parser.mly" - ( None ) -# 50183 "parsing/parser.ml" - in - -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 50188 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2887 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 50198 "parsing/parser.ml" + let _v : (Asttypes.label) = +# 4677 "parsing/parser.mly" + ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) +# 43534 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50207,63 +75119,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 983 "parsing/parser.mly" + (string) +# 43576 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2886 "parsing/parser.mly" - ( None ) -# 50252 "parsing/parser.ml" - in - -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 50257 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2887 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 50267 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4678 "parsing/parser.mly" + ( "."^ _1 ^"[" ^ _3 ^ "]" ) +# 43584 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50281,9 +75174,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = i; - MenhirLib.EngineTypes.startp = _startpos_i_; - MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -50291,14 +75184,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -50306,33 +75199,21 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let i : (Parsetree.expression) = Obj.magic i in - let _3 : unit = Obj.magic _3 in - let d : unit = Obj.magic d in - let array : (Parsetree.expression) = Obj.magic array in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 983 "parsing/parser.mly" + (string) +# 43633 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2886 "parsing/parser.mly" - ( None ) -# 50321 "parsing/parser.ml" - in - -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 50326 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2887 "parsing/parser.mly" - ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 50336 "parsing/parser.ml" + let _v : (Asttypes.label) = +# 4679 "parsing/parser.mly" + ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) +# 43641 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50345,84 +75226,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 983 "parsing/parser.mly" (string) -# 50384 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in +# 43683 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2890 "parsing/parser.mly" - ( None ) -# 50394 "parsing/parser.ml" - in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 50399 "parsing/parser.ml" - in - let d = - let _1 = -# 124 "" - ( None ) -# 50405 "parsing/parser.ml" - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 50410 "parsing/parser.ml" - - in - -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 50416 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2891 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 50426 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4680 "parsing/parser.mly" + ( "."^ _1 ^"{" ^ _3 ^ "}" ) +# 43691 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50440,9 +75281,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -50454,87 +75295,72 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 983 "parsing/parser.mly" (string) -# 50486 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in - let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in +# 43740 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2890 "parsing/parser.mly" - ( None ) -# 50498 "parsing/parser.ml" - in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 50503 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 50511 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 50516 "parsing/parser.ml" - - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 50522 "parsing/parser.ml" - - in - -# 2754 "parsing/parser.mly" - ( array, d, Paren, i, r ) -# 50528 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _v : (Asttypes.label) = +# 4681 "parsing/parser.mly" + ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) +# 43748 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 1045 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 43769 "parsing/parser.ml" +======= +# 44254 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2891 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 50538 "parsing/parser.ml" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4682 "parsing/parser.mly" + ( _1 ) +# 43777 "parsing/parser.ml" +======= +# 4677 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 43845 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50546,85 +75372,53 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" + let _1 : ( +# 994 "parsing/parser.mly" (string) -# 50586 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in +# 43866 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2890 "parsing/parser.mly" - ( None ) -# 50596 "parsing/parser.ml" - in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 50601 "parsing/parser.ml" - in - let d = - let _1 = -# 124 "" - ( None ) -# 50607 "parsing/parser.ml" - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 50612 "parsing/parser.ml" - - in - -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 50618 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2891 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 50628 "parsing/parser.ml" + let _v : (Asttypes.label) = +# 4678 "parsing/parser.mly" + ( _1 ) +# 43874 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 995 "parsing/parser.mly" + (string) +# 43895 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 4679 "parsing/parser.mly" + ( _1 ) +# 43903 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50637,106 +75431,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 50688 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in - let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in +# 43945 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2890 "parsing/parser.mly" - ( None ) -# 50700 "parsing/parser.ml" - in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 50705 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 50713 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 50718 "parsing/parser.ml" - - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 50724 "parsing/parser.ml" - - in - -# 2756 "parsing/parser.mly" - ( array, d, Brace, i, r ) -# 50730 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2891 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 50740 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4680 "parsing/parser.mly" + ( "."^ _1 ^"(" ^ _3 ^ ")" ) +# 43953 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50754,9 +75486,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -50769,9 +75501,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -50779,54 +75511,21 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 50788 "parsing/parser.ml" - ) = Obj.magic _2 in - let array : (Parsetree.expression) = Obj.magic array in +# 44002 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2890 "parsing/parser.mly" - ( None ) -# 50798 "parsing/parser.ml" - in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 50803 "parsing/parser.ml" - in - let d = - let _1 = -# 124 "" - ( None ) -# 50809 "parsing/parser.ml" - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 50814 "parsing/parser.ml" - - in - -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 50820 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2891 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 50830 "parsing/parser.ml" + let _v : (Asttypes.label) = +# 4681 "parsing/parser.mly" + ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) +# 44010 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50839,106 +75538,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = array; - MenhirLib.EngineTypes.startp = _startpos_array_; - MenhirLib.EngineTypes.endp = _endpos_array_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 50890 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in - let _1 : unit = Obj.magic _1 in - let array : (Parsetree.expression) = Obj.magic array in +# 44052 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_array_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let r = -# 2890 "parsing/parser.mly" - ( None ) -# 50902 "parsing/parser.ml" - in - let i = -# 3363 "parsing/parser.mly" - ( es ) -# 50907 "parsing/parser.ml" - in - let d = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 50915 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 50920 "parsing/parser.ml" - - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 50926 "parsing/parser.ml" - - in - -# 2758 "parsing/parser.mly" - ( array, d, Bracket, i, r ) -# 50932 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2891 "parsing/parser.mly" - ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 50942 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4682 "parsing/parser.mly" + ( "."^ _1 ^"[" ^ _3 ^ "]" ) +# 44060 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50951,9 +75588,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -50961,9 +75598,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -50980,27 +75617,22 @@ module Tables = struct }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _p : unit = Obj.magic _p in + let _5 : unit = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : ( +# 993 "parsing/parser.mly" + (string) +# 44109 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2763 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 50998 "parsing/parser.ml" - - in - -# 2892 "parsing/parser.mly" - ( _1 ) -# 51004 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Asttypes.label) = +# 4683 "parsing/parser.mly" + ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) +# 44117 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51013,56 +75645,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _p : unit = Obj.magic _p in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : ( +# 993 "parsing/parser.mly" + (string) +# 44159 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2765 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 51060 "parsing/parser.ml" - - in - -# 2892 "parsing/parser.mly" - ( _1 ) -# 51066 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4684 "parsing/parser.mly" + ( "."^ _1 ^"{" ^ _3 ^ "}" ) +# 44167 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51075,9 +75695,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -51085,9 +75705,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -51104,27 +75724,22 @@ module Tables = struct }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _p : unit = Obj.magic _p in + let _5 : unit = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : ( +# 993 "parsing/parser.mly" + (string) +# 44216 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2767 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 51122 "parsing/parser.ml" - - in - -# 2892 "parsing/parser.mly" - ( _1 ) -# 51128 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Asttypes.label) = +# 4685 "parsing/parser.mly" + ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) +# 44224 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51136,78 +75751,84 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let es : (Parsetree.expression list) = Obj.magic es in - let _p : unit = Obj.magic _p in - let _2 : ( -# 1073 "parsing/parser.mly" + let _1 : ( +# 1055 "parsing/parser.mly" (string) -# 51176 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 44245 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 51186 "parsing/parser.ml" - in - let _2 = - let _1 = -# 124 "" - ( None ) -# 51192 "parsing/parser.ml" - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 51197 "parsing/parser.ml" - - in - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2763 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 51205 "parsing/parser.ml" - - in - -# 2893 "parsing/parser.mly" - ( _1 ) -# 51211 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 4686 "parsing/parser.mly" + ( _1 ) +# 44253 "parsing/parser.ml" +||||||| 04da777f7 +# 43840 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 994 "parsing/parser.mly" + (string) +# 43861 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 4671 "parsing/parser.mly" + ( _1 ) +# 43869 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 995 "parsing/parser.mly" + (string) +# 43890 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 4672 "parsing/parser.mly" + ( _1 ) +# 43898 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51220,99 +75841,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let es : (Parsetree.expression list) = Obj.magic es in - let _p : unit = Obj.magic _p in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 51271 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 43940 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 51283 "parsing/parser.ml" - in - let _2 = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 51291 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 51296 "parsing/parser.ml" - - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 51302 "parsing/parser.ml" - - in - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2763 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 51310 "parsing/parser.ml" - - in - -# 2893 "parsing/parser.mly" - ( _1 ) -# 51316 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4673 "parsing/parser.mly" + ( "."^ _1 ^"(" ^ _3 ^ ")" ) +# 43948 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51325,19 +75891,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -51354,48 +75920,22 @@ module Tables = struct }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let es : (Parsetree.expression list) = Obj.magic es in - let _p : unit = Obj.magic _p in - let _2 : ( -# 1073 "parsing/parser.mly" + let _5 : unit = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 51364 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 43997 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 51374 "parsing/parser.ml" - in - let _2 = - let _1 = -# 124 "" - ( None ) -# 51380 "parsing/parser.ml" - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 51385 "parsing/parser.ml" - - in - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2765 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 51393 "parsing/parser.ml" - - in - -# 2893 "parsing/parser.mly" - ( _1 ) -# 51399 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Asttypes.label) = +# 4674 "parsing/parser.mly" + ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) +# 44005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51408,99 +75948,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let es : (Parsetree.expression list) = Obj.magic es in - let _p : unit = Obj.magic _p in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 51459 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 44047 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 51471 "parsing/parser.ml" - in - let _2 = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 51479 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 51484 "parsing/parser.ml" - - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 51490 "parsing/parser.ml" - - in - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2765 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 51498 "parsing/parser.ml" - - in - -# 2893 "parsing/parser.mly" - ( _1 ) -# 51504 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4675 "parsing/parser.mly" + ( "."^ _1 ^"[" ^ _3 ^ "]" ) +# 44055 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51513,19 +75998,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -51542,48 +76027,22 @@ module Tables = struct }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let es : (Parsetree.expression list) = Obj.magic es in - let _p : unit = Obj.magic _p in - let _2 : ( -# 1073 "parsing/parser.mly" + let _5 : unit = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 51552 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 44104 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 51562 "parsing/parser.ml" - in - let _2 = - let _1 = -# 124 "" - ( None ) -# 51568 "parsing/parser.ml" - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 51573 "parsing/parser.ml" - - in - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2767 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 51581 "parsing/parser.ml" - - in - -# 2893 "parsing/parser.mly" - ( _1 ) -# 51587 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Asttypes.label) = +# 4676 "parsing/parser.mly" + ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) +# 44112 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51596,99 +76055,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _e; - MenhirLib.EngineTypes.startp = _startpos__e_; - MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _p; - MenhirLib.EngineTypes.startp = _startpos__p_; - MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _e : unit = Obj.magic _e in - let es : (Parsetree.expression list) = Obj.magic es in - let _p : unit = Obj.magic _p in - let _2 : ( -# 1073 "parsing/parser.mly" + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" (string) -# 51647 "parsing/parser.ml" - ) = Obj.magic _2 in - let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 44154 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__e_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 51659 "parsing/parser.ml" - in - let _2 = - let _1 = - let _2 = _2_inlined1 in - let x = -# 2770 "parsing/parser.mly" - (_2) -# 51667 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 51672 "parsing/parser.ml" - - in - -# 2770 "parsing/parser.mly" - ( _1, _2 ) -# 51678 "parsing/parser.ml" - - in - let _loc__p_ = (_startpos__p_, _endpos__p_) in - let _loc__e_ = (_startpos__e_, _endpos__e_) in - -# 2767 "parsing/parser.mly" - ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 51686 "parsing/parser.ml" - - in - -# 2893 "parsing/parser.mly" - ( _1 ) -# 51692 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 4677 "parsing/parser.mly" + ( "."^ _1 ^"{" ^ _3 ^ "}" ) +# 44162 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51706,19 +76110,19 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = e; - MenhirLib.EngineTypes.startp = _startpos_e_; - MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -51731,37 +76135,21 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let e : (Parsetree.expression) = Obj.magic e in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 993 "parsing/parser.mly" + (string) +# 44211 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let attrs = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 51748 "parsing/parser.ml" - - in - -# 2917 "parsing/parser.mly" - ( e.pexp_desc, (ext, attrs @ e.pexp_attributes) ) -# 51754 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 51765 "parsing/parser.ml" + let _v : (Asttypes.label) = +# 4678 "parsing/parser.mly" + ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) +# 44219 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51773,72 +76161,28 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 1055 "parsing/parser.mly" + (string) +# 44240 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 51816 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 51822 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2919 "parsing/parser.mly" - ( Pexp_construct (mkloc (Lident "()") (make_loc _sloc), None), _2 ) -# 51831 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 51842 "parsing/parser.ml" + let _v : (Asttypes.label) = +# 4679 "parsing/parser.mly" + ( _1 ) +# 44248 "parsing/parser.ml" +======= +# 44262 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51850,78 +76194,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 51900 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 51906 "parsing/parser.ml" - - in - let _loc__4_ = (_startpos__4_, _endpos__4_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2921 "parsing/parser.mly" - ( unclosed "begin" _loc__1_ "end" _loc__4_ ) -# 51914 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 51925 "parsing/parser.ml" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4683 "parsing/parser.mly" + ( "!" ) +# 43802 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4687 "parsing/parser.mly" +||||||| 04da777f7 +# 4680 "parsing/parser.mly" +======= +# 4671 "parsing/parser.mly" +>>>>>>> origin/main + ( "!" ) +<<<<<<< HEAD +# 44278 "parsing/parser.ml" +||||||| 04da777f7 +# 44273 "parsing/parser.ml" +======= +# 44287 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51933,80 +76237,36 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let op : ( +# 976 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 43823 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 44299 "parsing/parser.ml" + ) = Obj.magic op in +||||||| 04da777f7 +# 44294 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.expression) = let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 51977 "parsing/parser.ml" - - in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 51987 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 51993 "parsing/parser.ml" - - in - -# 2923 "parsing/parser.mly" - ( Pexp_new(_3), _2 ) -# 51999 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4688 "parsing/parser.mly" + ( op ) +# 44302 "parsing/parser.ml" + in -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 52010 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44307 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52018,83 +76278,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.module_expr) = Obj.magic _4 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _3 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 52075 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 52081 "parsing/parser.ml" - - in - -# 2925 "parsing/parser.mly" - ( Pexp_pack _4, _3 ) -# 52087 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Asttypes.label) = let _1 = +# 4690 "parsing/parser.mly" + ("@") +# 44332 "parsing/parser.ml" + in -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 52098 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44337 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52106,113 +76308,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.module_expr) = Obj.magic _4 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _1 = - let _6 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 52180 "parsing/parser.ml" - - in - let _3 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 52190 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 52196 "parsing/parser.ml" - - in - let _endpos = _endpos__7_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2927 "parsing/parser.mly" - ( Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _4), _6), _3 ) -# 52205 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__7_ in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Asttypes.label) = let _1 = +# 4691 "parsing/parser.mly" + ("@@") +# 44362 "parsing/parser.ml" + in -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 52216 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44367 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52224,92 +76338,29 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.module_expr) = Obj.magic _4 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let op : ( +# 989 "parsing/parser.mly" + (string) +# 44388 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v : (Parsetree.expression) = let _1 = - let _3 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 52288 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 52294 "parsing/parser.ml" - - in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2929 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 52302 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__6_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4692 "parsing/parser.mly" + ( op ) +# 44396 "parsing/parser.ml" + in -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 52313 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44401 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52321,113 +76372,29 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xss; - MenhirLib.EngineTypes.startp = _startpos_xss_; - MenhirLib.EngineTypes.endp = _endpos_xss_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xss : (Parsetree.class_field list list) = Obj.magic xss in - let _1_inlined3 : (Parsetree.pattern) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let op : ( +# 990 "parsing/parser.mly" + (string) +# 44422 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _3 = - let _1 = _1_inlined3 in - let _2 = - let _1 = - let _1 = -# 260 "" - ( List.flatten xss ) -# 52378 "parsing/parser.ml" - in - -# 2386 "parsing/parser.mly" - ( _1 ) -# 52383 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - -# 1276 "parsing/parser.mly" - ( extra_cstr _startpos _endpos _1 ) -# 52392 "parsing/parser.ml" - - in - -# 2373 "parsing/parser.mly" - ( Cstr.mk _1 _2 ) -# 52398 "parsing/parser.ml" - - in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 52408 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 52414 "parsing/parser.ml" - - in - -# 2931 "parsing/parser.mly" - ( Pexp_object _3, _2 ) -# 52420 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4693 "parsing/parser.mly" + ( op ) +# 44430 "parsing/parser.ml" + in -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 52431 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44435 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52439,115 +76406,36 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xss; - MenhirLib.EngineTypes.startp = _startpos_xss_; - MenhirLib.EngineTypes.endp = _endpos_xss_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xss : (Parsetree.class_field list list) = Obj.magic xss in - let _1_inlined3 : (Parsetree.pattern) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let op : ( +# 991 "parsing/parser.mly" + (string) +# 44456 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _3 = - let _1 = _1_inlined3 in - let _2 = - let _1 = - let _1 = -# 260 "" - ( List.flatten xss ) -# 52496 "parsing/parser.ml" - in - -# 2386 "parsing/parser.mly" - ( _1 ) -# 52501 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - -# 1276 "parsing/parser.mly" - ( extra_cstr _startpos _endpos _1 ) -# 52510 "parsing/parser.ml" - - in - -# 2373 "parsing/parser.mly" - ( Cstr.mk _1 _2 ) -# 52516 "parsing/parser.ml" - - in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 52526 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 52532 "parsing/parser.ml" - - in - let _loc__4_ = (_startpos__4_, _endpos__4_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = + let op = +# 4684 "parsing/parser.mly" + ( op ) +# 44465 "parsing/parser.ml" + in -# 2933 "parsing/parser.mly" - ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 52540 "parsing/parser.ml" +# 4694 "parsing/parser.mly" + ( op ) +# 44470 "parsing/parser.ml" in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2895 "parsing/parser.mly" - ( let desc, attrs = _1 in - mkexp_attrs ~loc:_sloc desc attrs ) -# 52551 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44476 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52565,41 +76453,64 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 52582 "parsing/parser.ml" - - in - -# 3024 "parsing/parser.mly" - ( Pexp_ident (_1) ) -# 52588 "parsing/parser.ml" - - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _v : (Asttypes.label) = let _1 = + let op = +# 4685 "parsing/parser.mly" + ( "mod" ) +# 44502 "parsing/parser.ml" + in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52597 "parsing/parser.ml" +# 4694 "parsing/parser.mly" + ( op ) +# 44507 "parsing/parser.ml" in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52603 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44513 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let op : ( +# 992 "parsing/parser.mly" + (string) +# 44534 "parsing/parser.ml" + ) = Obj.magic op in +======= +# 44308 "parsing/parser.ml" +>>>>>>> upstream/main + ) = Obj.magic op in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4691 "parsing/parser.mly" + ( op ) +# 43831 "parsing/parser.ml" + in + +# 4684 "parsing/parser.mly" + ( _1 ) +# 43836 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52617,41 +76528,48 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in +>>>>>>> origin/main let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 52634 "parsing/parser.ml" - - in - -# 3026 "parsing/parser.mly" - ( Pexp_construct(_1, None) ) -# 52640 "parsing/parser.ml" - - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52649 "parsing/parser.ml" - - in + let _v : (Asttypes.label) = let _1 = +<<<<<<< HEAD +# 4695 "parsing/parser.mly" + ( op ) +# 44307 "parsing/parser.ml" +||||||| 04da777f7 +# 4695 "parsing/parser.mly" + ( op ) +# 44542 "parsing/parser.ml" +======= +# 4693 "parsing/parser.mly" +<<<<<<< HEAD + ("@") +# 43861 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52655 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 43866 "parsing/parser.ml" +======= + ("%") +# 44766 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4688 "parsing/parser.mly" +||||||| 04da777f7 +# 4681 "parsing/parser.mly" +======= +# 4672 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 44312 "parsing/parser.ml" +||||||| 04da777f7 +# 44547 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52669,29 +76587,22 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = -# 3028 "parsing/parser.mly" - ( Pexp_variant(_1, None) ) -# 52681 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52689 "parsing/parser.ml" - - in + let _v : (Asttypes.label) = let _1 = +# 4696 "parsing/parser.mly" + ("+") +# 44572 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52695 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44577 "parsing/parser.ml" +======= +# 44771 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52703,59 +76614,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : ( -# 1120 "parsing/parser.mly" - (string) -# 52723 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 52737 "parsing/parser.ml" - - in - -# 3030 "parsing/parser.mly" - ( Pexp_apply(_1, [Nolabel,_2]) ) -# 52743 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52753 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4694 "parsing/parser.mly" + ("@@") +# 43891 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52759 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 43896 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52767,60 +76644,29 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let op : ( +# 979 "parsing/parser.mly" + (string) +# 43917 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _1 = -# 3031 "parsing/parser.mly" - ("!") -# 52794 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 52802 "parsing/parser.ml" - - in - -# 3032 "parsing/parser.mly" - ( Pexp_apply(_1, [Nolabel,_2]) ) -# 52808 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52818 "parsing/parser.ml" - - in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4695 "parsing/parser.mly" + ( op ) +# 43925 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52824 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 43930 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52832,57 +76678,34 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Parsetree.expression) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let op : ( +# 980 "parsing/parser.mly" + (string) +# 43951 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = -# 3346 "parsing/parser.mly" - ( xs ) -# 52865 "parsing/parser.ml" - in - -# 3034 "parsing/parser.mly" - ( Pexp_override _2 ) -# 52870 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52880 "parsing/parser.ml" - - in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4696 "parsing/parser.mly" + ( op ) +# 43959 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52886 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 43964 "parsing/parser.ml" +======= +# 44861 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52894,59 +76717,66 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Parsetree.expression) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let op : ( +# 981 "parsing/parser.mly" + (string) +# 43985 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = -# 3346 "parsing/parser.mly" - ( xs ) -# 52927 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 3036 "parsing/parser.mly" - ( unclosed "{<" _loc__1_ ">}" _loc__3_ ) -# 52934 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = + let op = +# 4687 "parsing/parser.mly" + ( op ) +# 43994 "parsing/parser.ml" + in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52944 "parsing/parser.ml" +# 4697 "parsing/parser.mly" +<<<<<<< HEAD + ( op ) +# 43999 "parsing/parser.ml" in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52950 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44005 "parsing/parser.ml" +======= +<<<<<<< HEAD + ("@") +# 44337 "parsing/parser.ml" +||||||| 04da777f7 + ("+.") +# 44602 "parsing/parser.ml" +======= + ("or") +# 44886 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4688 "parsing/parser.mly" +||||||| 04da777f7 +# 4681 "parsing/parser.mly" +======= +# 4672 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 44342 "parsing/parser.ml" +||||||| 04da777f7 +# 44607 "parsing/parser.ml" +======= +# 44891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52958,43 +76788,32 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = -# 3038 "parsing/parser.mly" - ( Pexp_override [] ) -# 52983 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = + let op = +# 4688 "parsing/parser.mly" + ( "mod" ) +# 44031 "parsing/parser.ml" in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 52992 "parsing/parser.ml" +# 4697 "parsing/parser.mly" + ( op ) +# 44036 "parsing/parser.ml" in -# 2898 "parsing/parser.mly" - ( _1 ) -# 52998 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44042 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53006,63 +76825,59 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let op : ( +# 982 "parsing/parser.mly" + (string) +# 44063 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53044 "parsing/parser.ml" - - in - -# 3040 "parsing/parser.mly" - ( Pexp_field(_1, _3) ) -# 53050 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53060 "parsing/parser.ml" - - in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4698 "parsing/parser.mly" +<<<<<<< HEAD + ( op ) +# 44071 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53066 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44076 "parsing/parser.ml" +======= +<<<<<<< HEAD + ("@@") +# 44367 "parsing/parser.ml" +||||||| 04da777f7 + ("+=") +# 44632 "parsing/parser.ml" +======= + ("||") +# 44916 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4688 "parsing/parser.mly" +||||||| 04da777f7 +# 4681 "parsing/parser.mly" +======= +# 4672 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 44372 "parsing/parser.ml" +||||||| 04da777f7 +# 44637 "parsing/parser.ml" +======= +# 44921 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53074,86 +76889,59 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let op : ( +# 989 "parsing/parser.mly" + (string) +# 44393 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53126 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 53135 "parsing/parser.ml" - - in - -# 3042 "parsing/parser.mly" - ( Pexp_open(od, _4) ) -# 53141 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53151 "parsing/parser.ml" - - in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4699 "parsing/parser.mly" +<<<<<<< HEAD + ("+") +# 44101 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53157 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44106 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( op ) +# 44401 "parsing/parser.ml" +||||||| 04da777f7 + ("-") +# 44662 "parsing/parser.ml" +======= + ("&") +# 44946 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4688 "parsing/parser.mly" +||||||| 04da777f7 +# 4681 "parsing/parser.mly" +======= +# 4672 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 44406 "parsing/parser.ml" +||||||| 04da777f7 +# 44667 "parsing/parser.ml" +======= +# 44951 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53165,96 +76953,58 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let xs : ((string Location.loc * Parsetree.expression) list) = Obj.magic xs in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let op : ( +# 990 "parsing/parser.mly" + (string) +# 44427 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _4 = -# 3346 "parsing/parser.mly" - ( xs ) -# 53212 "parsing/parser.ml" - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53222 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 53231 "parsing/parser.ml" - - in - let _startpos_od_ = _startpos__1_ in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos_od_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3044 "parsing/parser.mly" - ( (* TODO: review the location of Pexp_override *) - Pexp_open(od, mkexp ~loc:_sloc (Pexp_override _4)) ) -# 53242 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53252 "parsing/parser.ml" - - in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4700 "parsing/parser.mly" +<<<<<<< HEAD + ("+.") +# 44131 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53258 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44136 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( op ) +# 44435 "parsing/parser.ml" +||||||| 04da777f7 + ("-.") +# 44692 "parsing/parser.ml" +======= + ("&&") +# 44976 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4688 "parsing/parser.mly" +||||||| 04da777f7 +# 4681 "parsing/parser.mly" +======= +# 4672 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 44440 "parsing/parser.ml" +||||||| 04da777f7 +# 44697 "parsing/parser.ml" +======= +# 44981 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53266,73 +77016,37 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let xs : ((string Location.loc * Parsetree.expression) list) = Obj.magic xs in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let op : ( +# 991 "parsing/parser.mly" + (string) +# 44461 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _4 = -# 3346 "parsing/parser.mly" - ( xs ) -# 53313 "parsing/parser.ml" - in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3047 "parsing/parser.mly" - ( unclosed "{<" _loc__3_ ">}" _loc__5_ ) -# 53320 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = + let op = +# 4691 "parsing/parser.mly" + ( op ) +# 44470 "parsing/parser.ml" + in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53330 "parsing/parser.ml" +# 4701 "parsing/parser.mly" +<<<<<<< HEAD + ( op ) +# 44475 "parsing/parser.ml" in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53336 "parsing/parser.ml" +# 4688 "parsing/parser.mly" + ( _1 ) +# 44481 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53344,77 +77058,32 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 53369 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 53383 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53391 "parsing/parser.ml" - - in - let _2 = -# 3018 "parsing/parser.mly" - ( () ) -# 53397 "parsing/parser.ml" - in - -# 3049 "parsing/parser.mly" - ( Pexp_send(_1, _3) ) -# 53402 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = + let op = +# 4692 "parsing/parser.mly" + ( "mod" ) +# 44507 "parsing/parser.ml" + in -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53412 "parsing/parser.ml" +# 4701 "parsing/parser.mly" + ( op ) +# 44512 "parsing/parser.ml" in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53418 "parsing/parser.ml" +# 4688 "parsing/parser.mly" + ( _1 ) +# 44518 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53426,77 +77095,30 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" + let op : ( +# 992 "parsing/parser.mly" (string) -# 53451 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 44539 "parsing/parser.ml" + ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 4356 "parsing/parser.mly" - ( _1 ) -# 53465 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53473 "parsing/parser.ml" - - in - let _2 = -# 3019 "parsing/parser.mly" - ( () ) -# 53479 "parsing/parser.ml" - in - -# 3049 "parsing/parser.mly" - ( Pexp_send(_1, _3) ) -# 53484 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53494 "parsing/parser.ml" - - in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v : (Asttypes.label) = let _1 = +# 4702 "parsing/parser.mly" + ( op ) +# 44547 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53500 "parsing/parser.ml" +# 4688 "parsing/parser.mly" + ( _1 ) +# 44552 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53508,67 +77130,26 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _1_inlined1 : ( -# 1132 "parsing/parser.mly" - (string) -# 53534 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1309 "parsing/parser.mly" - ( mkoperator ~loc:_sloc _1 ) -# 53550 "parsing/parser.ml" - - in - -# 3051 "parsing/parser.mly" - ( mkinfix _1 _2 _3 ) -# 53556 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53566 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +<<<<<<< HEAD +# 4701 "parsing/parser.mly" + ("+=") +# 44161 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53572 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44166 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53586,29 +77167,19 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.extension) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = -# 3053 "parsing/parser.mly" - ( Pexp_extension _1 ) -# 53598 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53606 "parsing/parser.ml" - - in + let _v : (Asttypes.label) = let _1 = +# 4702 "parsing/parser.mly" + ("-") +# 44191 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53612 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44196 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53620,98 +77191,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_inlined1_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in - let _1 = -# 3054 "parsing/parser.mly" - (Lident "()") -# 53662 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53671 "parsing/parser.ml" - - in - let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53683 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 53692 "parsing/parser.ml" - - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3055 "parsing/parser.mly" - ( Pexp_open(od, mkexp ~loc:(_loc__3_) (Pexp_construct(_3, None))) ) -# 53699 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53709 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4703 "parsing/parser.mly" + ("-.") +# 44221 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53715 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44226 "parsing/parser.ml" +======= +# 4703 "parsing/parser.mly" + ("+") +# 44577 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44582 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53723,68 +77231,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3057 "parsing/parser.mly" - ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 53772 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53782 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4704 "parsing/parser.mly" +<<<<<<< HEAD + ("*") +# 44251 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53788 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44256 "parsing/parser.ml" +======= + ("+.") +# 44607 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44612 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53796,52 +77271,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.expression option * - (Longident.t Location.loc * Parsetree.expression) list) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = -# 3059 "parsing/parser.mly" - ( let (exten, fields) = _2 in - Pexp_record(fields, exten) ) -# 53830 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53839 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4705 "parsing/parser.mly" +<<<<<<< HEAD + ("%") +# 44281 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53845 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44286 "parsing/parser.ml" +======= + ("+=") +# 44637 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44642 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53853,55 +77311,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.expression option * - (Longident.t Location.loc * Parsetree.expression) list) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 3062 "parsing/parser.mly" - ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 53889 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53899 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4706 "parsing/parser.mly" +<<<<<<< HEAD + ("=") +# 44311 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 53905 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44316 "parsing/parser.ml" +======= + ("-") +# 44667 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44672 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53913,90 +77351,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression option * - (Longident.t Location.loc * Parsetree.expression) list) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 53966 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 53975 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in - -# 3064 "parsing/parser.mly" - ( let (exten, fields) = _4 in - Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) - (Pexp_record(fields, exten))) ) -# 53984 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 53994 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4707 "parsing/parser.mly" +<<<<<<< HEAD + ("<") +# 44341 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54000 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44346 "parsing/parser.ml" +======= + ("-.") +# 44697 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44702 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54008,69 +77391,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression option * - (Longident.t Location.loc * Parsetree.expression) list) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3068 "parsing/parser.mly" - ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 54058 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54068 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4708 "parsing/parser.mly" +<<<<<<< HEAD + (">") +# 44371 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54074 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44376 "parsing/parser.ml" +======= + ("*") +# 44727 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44732 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54082,75 +77431,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let es : (Parsetree.expression list) = Obj.magic es in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _1 = - let _2 = -# 3363 "parsing/parser.mly" - ( es ) -# 54117 "parsing/parser.ml" - in - -# 2990 "parsing/parser.mly" - ( Generic_array.Simple.Literal _2 ) -# 54122 "parsing/parser.ml" - - in - -# 2999 "parsing/parser.mly" - ( Generic_array.Expression.Simple _1 ) -# 54128 "parsing/parser.ml" - - in - -# 3070 "parsing/parser.mly" - ( Generic_array.Expression.to_desc - "[|" "|]" - (fun elts -> Pexp_array elts) - _1 - ) -# 54138 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54148 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4709 "parsing/parser.mly" +<<<<<<< HEAD + ("or") +# 44401 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54154 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44406 "parsing/parser.ml" +======= + ("%") +# 44757 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44762 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54162,77 +77471,37 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let es : (Parsetree.expression list) = Obj.magic es in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _1 = - let _2 = -# 3363 "parsing/parser.mly" - ( es ) -# 54197 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2992 "parsing/parser.mly" - ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) -# 54204 "parsing/parser.ml" - - in - -# 2999 "parsing/parser.mly" - ( Generic_array.Expression.Simple _1 ) -# 54210 "parsing/parser.ml" - - in - -# 3070 "parsing/parser.mly" - ( Generic_array.Expression.to_desc - "[|" "|]" - (fun elts -> Pexp_array elts) - _1 - ) -# 54220 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54230 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4710 "parsing/parser.mly" +<<<<<<< HEAD + ("||") +# 44431 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54236 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44436 "parsing/parser.ml" +======= + ("=") +# 44787 "parsing/parser.ml" +||||||| 04da777f7 + ("*") +# 44722 "parsing/parser.ml" + in + +# 4681 "parsing/parser.mly" + ( _1 ) +# 44727 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54244,61 +77513,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _1 = -# 2994 "parsing/parser.mly" - ( Generic_array.Simple.Literal [] ) -# 54271 "parsing/parser.ml" - in - -# 2999 "parsing/parser.mly" - ( Generic_array.Expression.Simple _1 ) -# 54276 "parsing/parser.ml" - - in - -# 3070 "parsing/parser.mly" - ( Generic_array.Expression.to_desc - "[|" "|]" - (fun elts -> Pexp_array elts) - _1 - ) -# 54286 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54296 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4702 "parsing/parser.mly" + ("%") +# 44752 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54302 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44757 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54310,104 +77543,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 54358 "parsing/parser.ml" - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 54368 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 54377 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in - -# 3001 "parsing/parser.mly" - ( Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, _4) - ) -# 54385 "parsing/parser.ml" - - in - -# 3070 "parsing/parser.mly" - ( Generic_array.Expression.to_desc - "[|" "|]" - (fun elts -> Pexp_array elts) - _1 - ) -# 54395 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54405 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4703 "parsing/parser.mly" + ("=") +# 44782 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54411 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44787 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54419,93 +77573,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 54465 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 54474 "parsing/parser.ml" - - in - let _endpos = _endpos__4_ in - -# 3004 "parsing/parser.mly" - ( (* TODO: review the location of Pexp_array *) - Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, []) - ) -# 54483 "parsing/parser.ml" - - in - -# 3070 "parsing/parser.mly" - ( Generic_array.Expression.to_desc - "[|" "|]" - (fun elts -> Pexp_array elts) - _1 - ) -# 54493 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54503 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4704 "parsing/parser.mly" + ("<") +# 44812 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54509 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44817 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54517,84 +77603,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 54565 "parsing/parser.ml" - in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3009 "parsing/parser.mly" - ( Generic_array.Expression.Simple (Unclosed(_loc__3_, _loc__5_)) ) -# 54572 "parsing/parser.ml" - - in - -# 3070 "parsing/parser.mly" - ( Generic_array.Expression.to_desc - "[|" "|]" - (fun elts -> Pexp_array elts) - _1 - ) -# 54582 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54592 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4705 "parsing/parser.mly" + (">") +# 44842 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54598 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44847 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54606,58 +77633,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let es : (Parsetree.expression list) = Obj.magic es in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = -# 3363 "parsing/parser.mly" - ( es ) -# 54639 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3076 "parsing/parser.mly" - ( fst (mktailexp _loc__3_ _2) ) -# 54645 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54655 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4706 "parsing/parser.mly" + ("or") +# 44872 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54661 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44877 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54669,59 +77663,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let es : (Parsetree.expression list) = Obj.magic es in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = -# 3363 "parsing/parser.mly" - ( es ) -# 54702 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 3078 "parsing/parser.mly" - ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 54709 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54719 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4707 "parsing/parser.mly" + ("||") +# 44902 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54725 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44907 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54733,144 +77693,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in - let _1 = - let _1 = - let _3 = - let xs = -# 253 "" - ( List.rev xs ) -# 54792 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 54797 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 54805 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 54810 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 54816 "parsing/parser.ml" - - in - -# 2976 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) -# 54822 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 54832 "parsing/parser.ml" - - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 54843 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 54852 "parsing/parser.ml" - - in - -# 3080 "parsing/parser.mly" - ( Pexp_open(od, _3) ) -# 54858 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 54868 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4708 "parsing/parser.mly" + ("&") +# 44932 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 54874 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44937 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54882,211 +77723,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_startpos__1_inlined1_, _startpos__1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _startpos__1_inlined1_, _1_inlined4, _1_inlined3) in - let _1 = - let _1 = - let _3 = - let xs = xs_inlined1 in - let xs = -# 253 "" - ( List.rev xs ) -# 54963 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 54968 "parsing/parser.ml" - - in - let _2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 54979 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 54984 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 54990 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 55001 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 55007 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 55020 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 55026 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 55032 "parsing/parser.ml" - - in - -# 2976 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) -# 55038 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 55048 "parsing/parser.ml" - - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55059 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 55068 "parsing/parser.ml" - - in - -# 3080 "parsing/parser.mly" - ( Pexp_open(od, _3) ) -# 55074 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 55084 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4709 "parsing/parser.mly" + ("&&") +# 44962 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 55090 "parsing/parser.ml" +# 4681 "parsing/parser.mly" + ( _1 ) +# 44967 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55098,144 +77753,37 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in - let _1 = - let _1 = - let _3 = - let xs = -# 253 "" - ( List.rev xs ) -# 55157 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 55162 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 55170 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 55175 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 55181 "parsing/parser.ml" - - in - -# 2978 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) -# 55187 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 55197 "parsing/parser.ml" - - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55208 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 55217 "parsing/parser.ml" - - in - -# 3080 "parsing/parser.mly" - ( Pexp_open(od, _3) ) -# 55223 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 55233 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4710 "parsing/parser.mly" + (":=") +# 44992 "parsing/parser.ml" +======= + (":=") +# 45006 "parsing/parser.ml" +>>>>>>> origin/main + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 55239 "parsing/parser.ml" +<<<<<<< HEAD +# 4688 "parsing/parser.mly" +||||||| 04da777f7 +# 4681 "parsing/parser.mly" +======= +# 4672 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 44792 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55247,211 +77795,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_startpos__1_inlined1_, _startpos__1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _startpos__1_inlined1_, _1_inlined4, _1_inlined3) in - let _1 = - let _1 = - let _3 = - let xs = xs_inlined1 in - let xs = -# 253 "" - ( List.rev xs ) -# 55328 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 55333 "parsing/parser.ml" - - in - let _2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 55344 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 55349 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 55355 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 55366 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 55372 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 55385 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 55391 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 55397 "parsing/parser.ml" - - in - -# 2978 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) -# 55403 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 55413 "parsing/parser.ml" - - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55424 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 55433 "parsing/parser.ml" - - in - -# 3080 "parsing/parser.mly" - ( Pexp_open(od, _3) ) -# 55439 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 55449 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4711 "parsing/parser.mly" +<<<<<<< HEAD + ("&") +# 44461 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 55455 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44466 "parsing/parser.ml" +======= + ("<") +# 44817 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44822 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55463,144 +77835,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in - let _1 = - let _1 = - let _3 = - let xs = -# 253 "" - ( List.rev xs ) -# 55522 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 55527 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 55535 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 55540 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 55546 "parsing/parser.ml" - - in - -# 2980 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) -# 55552 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 55562 "parsing/parser.ml" - - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55573 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 55582 "parsing/parser.ml" - - in - -# 3080 "parsing/parser.mly" - ( Pexp_open(od, _3) ) -# 55588 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 55598 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4712 "parsing/parser.mly" +<<<<<<< HEAD + ("&&") +# 44491 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 55604 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44496 "parsing/parser.ml" +======= + (">") +# 44847 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44852 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55612,211 +77875,34 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Location.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_startpos__1_inlined1_, _startpos__1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _startpos__1_inlined1_, _1_inlined4, _1_inlined3) in - let _1 = - let _1 = - let _3 = - let xs = xs_inlined1 in - let xs = -# 253 "" - ( List.rev xs ) -# 55693 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 55698 "parsing/parser.ml" - - in - let _2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 55709 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 55714 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 55720 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 55731 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 55737 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 55750 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 55756 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 55762 "parsing/parser.ml" - - in - -# 2980 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) -# 55768 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 55778 "parsing/parser.ml" - - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55789 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 55798 "parsing/parser.ml" - - in - -# 3080 "parsing/parser.mly" - ( Pexp_open(od, _3) ) -# 55804 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 55814 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4713 "parsing/parser.mly" +<<<<<<< HEAD + (":=") +# 44521 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 55820 "parsing/parser.ml" +# 4684 "parsing/parser.mly" + ( _1 ) +# 44526 "parsing/parser.ml" +======= + ("or") +# 44877 "parsing/parser.ml" + in + +# 4688 "parsing/parser.mly" + ( _1 ) +# 44882 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55828,97 +77914,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 55875 "parsing/parser.ml" - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55885 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 55894 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - -# 3082 "parsing/parser.mly" - ( let list_exp = - (* TODO: review the location of list_exp *) - let tail_exp, _tail_loc = mktailexp _loc__5_ _4 in - mkexp ~loc:(_startpos__3_, _endpos) tail_exp in - Pexp_open(od, list_exp) ) -# 55906 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 55916 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4714 "parsing/parser.mly" + ("||") +# 44907 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 55922 "parsing/parser.ml" +# 4688 "parsing/parser.mly" + ( _1 ) +# 44912 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55930,98 +77944,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_inlined1_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _3 = - let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in - let _1 = -# 3087 "parsing/parser.mly" - (Lident "[]") -# 55972 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55981 "parsing/parser.ml" - - in - let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 55993 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 56002 "parsing/parser.ml" - - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3088 "parsing/parser.mly" - ( Pexp_open(od, mkexp ~loc:_loc__3_ (Pexp_construct(_3, None))) ) -# 56009 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 56019 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4715 "parsing/parser.mly" + ("&") +# 44937 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 56025 "parsing/parser.ml" +# 4688 "parsing/parser.mly" + ( _1 ) +# 44942 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56033,73 +77974,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 56080 "parsing/parser.ml" - in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3091 "parsing/parser.mly" - ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 56087 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 56097 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4716 "parsing/parser.mly" + ("&&") +# 44967 "parsing/parser.ml" + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 56103 "parsing/parser.ml" +# 4688 "parsing/parser.mly" + ( _1 ) +# 44972 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56111,157 +78004,31 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _9 : unit = Obj.magic _9 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _7 : unit = Obj.magic _7 in - let _6 : (Parsetree.module_expr) = Obj.magic _6 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _4 : unit = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__9_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _8 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 56200 "parsing/parser.ml" - - in - let _5 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 56210 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 56216 "parsing/parser.ml" - - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 56227 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 56236 "parsing/parser.ml" - - in - let _startpos_od_ = _startpos__1_ in - let _endpos = _endpos__9_ in - let _symbolstartpos = _startpos_od_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3094 "parsing/parser.mly" - ( let modexp = - mkexp_attrs ~loc:(_startpos__3_, _endpos) - (Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _6), _8)) _5 in - Pexp_open(od, modexp) ) -# 56249 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__9_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 56259 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = let _1 = +# 4717 "parsing/parser.mly" + (":=") +# 44997 "parsing/parser.ml" +||||||| 04da777f7 +# 44997 "parsing/parser.ml" +======= +# 45011 "parsing/parser.ml" +>>>>>>> origin/main + in -# 2898 "parsing/parser.mly" - ( _1 ) -# 56265 "parsing/parser.ml" +# 4688 "parsing/parser.mly" + ( _1 ) +# 45002 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56273,112 +78040,102 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _8 : unit = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let _6 : (Parsetree.module_expr) = Obj.magic _6 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _4 : unit = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__8_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _5 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 56352 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 56358 "parsing/parser.ml" - - in - let _loc__8_ = (_startpos__8_, _endpos__8_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3100 "parsing/parser.mly" - ( unclosed "(" _loc__3_ ")" _loc__8_ ) -# 56366 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__8_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1315 "parsing/parser.mly" - ( mkexp ~loc:_sloc _1 ) -# 56376 "parsing/parser.ml" - - in - -# 2898 "parsing/parser.mly" - ( _1 ) -# 56382 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (bool) = +<<<<<<< HEAD +# 4571 "parsing/parser.mly" + ( true ) +# 44551 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4575 "parsing/parser.mly" +||||||| 04da777f7 +# 4568 "parsing/parser.mly" +======= +# 4559 "parsing/parser.mly" +>>>>>>> origin/main + ( true ) +<<<<<<< HEAD +# 45027 "parsing/parser.ml" +||||||| 04da777f7 +# 45022 "parsing/parser.ml" +======= +# 45036 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (bool) = +<<<<<<< HEAD +# 4572 "parsing/parser.mly" + ( false ) +# 44569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4576 "parsing/parser.mly" +||||||| 04da777f7 +# 4569 "parsing/parser.mly" +======= +# 4560 "parsing/parser.mly" +>>>>>>> origin/main + ( false ) +<<<<<<< HEAD +# 45045 "parsing/parser.ml" +||||||| 04da777f7 +# 45040 "parsing/parser.ml" +======= +# 45054 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (unit option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 44587 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45063 "parsing/parser.ml" +||||||| 04da777f7 +# 45058 "parsing/parser.ml" +======= +# 45072 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56390,65 +78147,58 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let es : (Parsetree.expression list) = Obj.magic es in - let _1 : unit = Obj.magic _1 in + let x : unit = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = -# 3363 "parsing/parser.mly" - ( es ) -# 56423 "parsing/parser.ml" - in - -# 2990 "parsing/parser.mly" - ( Generic_array.Simple.Literal _2 ) -# 56428 "parsing/parser.ml" - - in - -# 2999 "parsing/parser.mly" - ( Generic_array.Expression.Simple _1 ) -# 56434 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2903 "parsing/parser.mly" - ( Generic_array.Expression.to_expression - "[:" ":]" - ~loc:_sloc - (fun ~loc elts -> - Jane_syntax.Immutable_arrays.expr_of - ~loc:(make_loc loc) - (Iaexp_immutable_array elts)) - _1 - ) -# 56452 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (unit option) = +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 44612 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45088 "parsing/parser.ml" +||||||| 04da777f7 +# 45083 "parsing/parser.ml" +======= +# 45097 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (unit option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 44630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45106 "parsing/parser.ml" +||||||| 04da777f7 +# 45101 "parsing/parser.ml" +======= +# 45115 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56460,67 +78210,121 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let es : (Parsetree.expression list) = Obj.magic es in - let _1 : unit = Obj.magic _1 in + let x : unit = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _2 = -# 3363 "parsing/parser.mly" - ( es ) -# 56493 "parsing/parser.ml" - in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2992 "parsing/parser.mly" - ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) -# 56500 "parsing/parser.ml" - - in - -# 2999 "parsing/parser.mly" - ( Generic_array.Expression.Simple _1 ) -# 56506 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2903 "parsing/parser.mly" - ( Generic_array.Expression.to_expression - "[:" ":]" - ~loc:_sloc - (fun ~loc elts -> - Jane_syntax.Immutable_arrays.expr_of - ~loc:(make_loc loc) - (Iaexp_immutable_array elts)) - _1 - ) -# 56524 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (unit option) = +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 44655 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45131 "parsing/parser.ml" +||||||| 04da777f7 +# 45126 "parsing/parser.ml" +======= +# 45140 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Jane_syntax.Jkind.annotation option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 44673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45149 "parsing/parser.ml" +||||||| 04da777f7 +# 45144 "parsing/parser.ml" +======= +# 45158 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Jane_syntax.Jkind.annotation) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Jane_syntax.Jkind.annotation option) = +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 44698 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45174 "parsing/parser.ml" +||||||| 04da777f7 +# 45169 "parsing/parser.ml" +======= +# 45183 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (string Asttypes.loc option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 44716 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45192 "parsing/parser.ml" +||||||| 04da777f7 +# 45187 "parsing/parser.ml" +======= +# 45201 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56533,9 +78337,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -56544,39 +78348,105 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 44743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45219 "parsing/parser.ml" +||||||| 04da777f7 +# 45214 "parsing/parser.ml" +======= +# 45228 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = -# 2994 "parsing/parser.mly" - ( Generic_array.Simple.Literal [] ) -# 56557 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v : (string Asttypes.loc option) = let x = + let x = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 44758 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45234 "parsing/parser.ml" +||||||| 04da777f7 +# 45229 "parsing/parser.ml" +======= +# 45243 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 2999 "parsing/parser.mly" - ( Generic_array.Expression.Simple _1 ) -# 56562 "parsing/parser.ml" +# 183 "" + ( x ) +<<<<<<< HEAD +# 44764 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45240 "parsing/parser.ml" +||||||| 04da777f7 +# 45235 "parsing/parser.ml" +======= +# 45249 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2903 "parsing/parser.mly" - ( Generic_array.Expression.to_expression - "[:" ":]" - ~loc:_sloc - (fun ~loc elts -> - Jane_syntax.Immutable_arrays.expr_of - ~loc:(make_loc loc) - (Iaexp_immutable_array elts)) - _1 - ) -# 56580 "parsing/parser.ml" +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 44770 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45246 "parsing/parser.ml" +||||||| 04da777f7 +# 45241 "parsing/parser.ml" +======= +# 45255 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.core_type option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 44788 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45264 "parsing/parser.ml" +||||||| 04da777f7 +# 45259 "parsing/parser.ml" +======= +# 45273 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56589,93 +78459,55 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let x : (Parsetree.core_type) = Obj.magic x in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 56634 "parsing/parser.ml" - in - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 56644 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 56653 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in - -# 3001 "parsing/parser.mly" - ( Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, _4) - ) -# 56661 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_x_ in + let _v : (Parsetree.core_type option) = let x = +# 183 "" + ( x ) +<<<<<<< HEAD +# 44820 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45296 "parsing/parser.ml" +||||||| 04da777f7 +# 45291 "parsing/parser.ml" + in -# 2903 "parsing/parser.mly" - ( Generic_array.Expression.to_expression - "[:" ":]" - ~loc:_sloc - (fun ~loc elts -> - Jane_syntax.Immutable_arrays.expr_of - ~loc:(make_loc loc) - (Iaexp_immutable_array elts)) - _1 - ) -# 56679 "parsing/parser.ml" +# 116 "" + ( Some x ) +# 45296 "parsing/parser.ml" +======= +# 45305 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 44825 "parsing/parser.ml" +======= +# 45310 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 116 "" + ( Some x ) +# 45301 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56686,84 +78518,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let od = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 56731 "parsing/parser.ml" - - in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - -# 2021 "parsing/parser.mly" - ( let loc = make_loc _loc__1_ in - let me = Mod.ident ~loc _1 in - Opn.mk ~loc me ) -# 56740 "parsing/parser.ml" - - in - let _endpos = _endpos__4_ in - -# 3004 "parsing/parser.mly" - ( (* TODO: review the location of Pexp_array *) - Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, []) - ) -# 56749 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2903 "parsing/parser.mly" - ( Generic_array.Expression.to_expression - "[:" ":]" - ~loc:_sloc - (fun ~loc elts -> - Jane_syntax.Immutable_arrays.expr_of - ~loc:(make_loc loc) - (Iaexp_immutable_array elts)) - _1 - ) -# 56767 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.core_type option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 44843 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45319 "parsing/parser.ml" +||||||| 04da777f7 +# 45314 "parsing/parser.ml" +======= +# 45328 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56776,73 +78548,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let x : (Parsetree.core_type) = Obj.magic x in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _1 = - let _4 = -# 3363 "parsing/parser.mly" - ( es ) -# 56821 "parsing/parser.ml" - in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 3009 "parsing/parser.mly" - ( Generic_array.Expression.Simple (Unclosed(_loc__3_, _loc__5_)) ) -# 56828 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_x_ in + let _v : (Parsetree.core_type option) = let x = +# 183 "" + ( x ) +<<<<<<< HEAD +# 44875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45351 "parsing/parser.ml" +||||||| 04da777f7 +# 45346 "parsing/parser.ml" +======= +# 45360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 2903 "parsing/parser.mly" - ( Generic_array.Expression.to_expression - "[:" ":]" - ~loc:_sloc - (fun ~loc elts -> - Jane_syntax.Immutable_arrays.expr_of - ~loc:(make_loc loc) - (Iaexp_immutable_array elts)) - _1 - ) -# 56846 "parsing/parser.ml" +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 44880 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45356 "parsing/parser.ml" +||||||| 04da777f7 +# 45351 "parsing/parser.ml" +======= +# 45365 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56853,24 +78603,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Constant.t) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2912 "parsing/parser.mly" - ( Constant.to_expression ~loc:_sloc _1 ) -# 56874 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.expression option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 44898 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45374 "parsing/parser.ml" +||||||| 04da777f7 +# 45369 "parsing/parser.ml" +======= +# 45383 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56883,90 +78633,98 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _3 = - let xs = -# 253 "" - ( List.rev xs ) -# 56924 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 56929 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression option) = let x = + let x = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 56937 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 56942 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 56948 "parsing/parser.ml" - - in +<<<<<<< HEAD +# 44933 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45409 "parsing/parser.ml" +||||||| 04da777f7 +# 45404 "parsing/parser.ml" +======= +# 45418 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 2976 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) -# 56954 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 44938 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45414 "parsing/parser.ml" +||||||| 04da777f7 +# 45409 "parsing/parser.ml" +======= +# 45423 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 56964 "parsing/parser.ml" +# 183 "" + ( x ) +<<<<<<< HEAD +# 44944 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45420 "parsing/parser.ml" +||||||| 04da777f7 +# 45415 "parsing/parser.ml" +======= +# 45429 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2913 "parsing/parser.mly" - ( _1 ) -# 56970 "parsing/parser.ml" +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 44950 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45426 "parsing/parser.ml" +||||||| 04da777f7 +# 45421 "parsing/parser.ml" +======= +# 45435 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56979,157 +78737,236 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression option) = let x = + let x = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in let _1 = let _3 = - let xs = xs_inlined1 in - let xs = + let xs = + let xs = # 253 "" ( List.rev xs ) -# 57042 "parsing/parser.ml" - in +<<<<<<< HEAD +# 45009 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45485 "parsing/parser.ml" +||||||| 04da777f7 +# 45480 "parsing/parser.ml" +======= +# 45494 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 45014 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45490 "parsing/parser.ml" +||||||| 04da777f7 +# 45485 "parsing/parser.ml" +======= +# 45499 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main ( xs ) -# 57047 "parsing/parser.ml" +<<<<<<< HEAD +# 45020 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45496 "parsing/parser.ml" +||||||| 04da777f7 +# 45491 "parsing/parser.ml" +======= +# 45505 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos__3_ = _endpos_xs_ in let _2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 57058 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 57063 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 57069 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 57080 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 57086 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +# 45031 "parsing/parser.ml" -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 57099 "parsing/parser.ml" + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 45037 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45507 "parsing/parser.ml" +||||||| 04da777f7 +# 45502 "parsing/parser.ml" +======= +# 45516 "parsing/parser.ml" +>>>>>>> origin/main in -# 2823 "parsing/parser.mly" - ( _1 ) -# 57105 "parsing/parser.ml" +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 45513 "parsing/parser.ml" +||||||| 04da777f7 +# 45508 "parsing/parser.ml" +======= +# 45522 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 57111 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 45050 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45526 "parsing/parser.ml" +||||||| 04da777f7 +# 45521 "parsing/parser.ml" +======= +# 45535 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2976 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) -# 57117 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45056 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45532 "parsing/parser.ml" +||||||| 04da777f7 +# 45527 "parsing/parser.ml" +======= +# 45541 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 57127 "parsing/parser.ml" +# 183 "" + ( x ) +<<<<<<< HEAD +# 45062 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45538 "parsing/parser.ml" +||||||| 04da777f7 +# 45533 "parsing/parser.ml" +======= +# 45547 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2913 "parsing/parser.mly" - ( _1 ) -# 57133 "parsing/parser.ml" +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 45068 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45544 "parsing/parser.ml" +||||||| 04da777f7 +# 45539 "parsing/parser.ml" +======= +# 45553 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57140,92 +78977,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _3 = - let xs = -# 253 "" - ( List.rev xs ) -# 57183 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 57188 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 57196 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 57201 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 57207 "parsing/parser.ml" - - in - -# 2978 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) -# 57213 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 57223 "parsing/parser.ml" - - in - -# 2913 "parsing/parser.mly" - ( _1 ) -# 57229 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.module_type option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 45086 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45562 "parsing/parser.ml" +||||||| 04da777f7 +# 45557 "parsing/parser.ml" +======= +# 45571 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57238,157 +79007,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let x : (Parsetree.module_type) = Obj.magic x in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _3 = - let xs = xs_inlined1 in - let xs = -# 253 "" - ( List.rev xs ) -# 57301 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 57306 "parsing/parser.ml" - - in - let _2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 57317 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 57322 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 57328 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 57339 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 57345 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 57358 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 57364 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 57370 "parsing/parser.ml" - - in - -# 2978 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) -# 57376 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 57386 "parsing/parser.ml" - - in + let _endpos = _endpos_x_ in + let _v : (Parsetree.module_type option) = let x = +# 183 "" + ( x ) +<<<<<<< HEAD +# 45118 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45594 "parsing/parser.ml" +||||||| 04da777f7 +# 45589 "parsing/parser.ml" +======= +# 45603 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 2913 "parsing/parser.mly" - ( _1 ) -# 57392 "parsing/parser.ml" +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 45123 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45599 "parsing/parser.ml" +||||||| 04da777f7 +# 45594 "parsing/parser.ml" +======= +# 45608 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57399,92 +79062,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _3 = - let xs = -# 253 "" - ( List.rev xs ) -# 57442 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 57447 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - let _1 = -# 2639 "parsing/parser.mly" - ( _1 ) -# 57455 "parsing/parser.ml" - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 57460 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 57466 "parsing/parser.ml" - - in - -# 2980 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) -# 57472 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 57482 "parsing/parser.ml" - - in - -# 2913 "parsing/parser.mly" - ( _1 ) -# 57488 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.pattern option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 45141 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45617 "parsing/parser.ml" +||||||| 04da777f7 +# 45612 "parsing/parser.ml" +======= +# 45626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57497,157 +79092,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Location.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let x : (Parsetree.pattern) = Obj.magic x in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.expression) = let _1 = - let _1 = - let _1 = - let _3 = - let xs = xs_inlined1 in - let xs = -# 253 "" - ( List.rev xs ) -# 57560 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 57565 "parsing/parser.ml" - - in - let _2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 253 "" - ( List.rev xs ) -# 57576 "parsing/parser.ml" - in - -# 1500 "parsing/parser.mly" - ( xs ) -# 57581 "parsing/parser.ml" - - in - -# 3278 "parsing/parser.mly" - ( xs ) -# 57587 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 57598 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 57604 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2641 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - mkfunction [] None (Pfunction_cases (cases, loc, [])) - ~loc:_sloc ~attrs:_2 - ) -# 57617 "parsing/parser.ml" - - in - -# 2823 "parsing/parser.mly" - ( _1 ) -# 57623 "parsing/parser.ml" - - in - -# 2971 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) -# 57629 "parsing/parser.ml" - - in - -# 2980 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) -# 57635 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2985 "parsing/parser.mly" - ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) -# 57645 "parsing/parser.ml" - - in + let _endpos = _endpos_x_ in + let _v : (Parsetree.pattern option) = let x = +# 183 "" + ( x ) +<<<<<<< HEAD +# 45173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45649 "parsing/parser.ml" +||||||| 04da777f7 +# 45644 "parsing/parser.ml" +======= +# 45658 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 2913 "parsing/parser.mly" - ( _1 ) -# 57651 "parsing/parser.ml" +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 45178 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45654 "parsing/parser.ml" +||||||| 04da777f7 +# 45649 "parsing/parser.ml" +======= +# 45663 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57658,48 +79147,24 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 57682 "parsing/parser.ml" - - in - -# 3457 "parsing/parser.mly" - ( Ppat_var (_1) ) -# 57688 "parsing/parser.ml" - - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 57697 "parsing/parser.ml" - - in - -# 3458 "parsing/parser.mly" - ( _1 ) -# 57703 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.expression option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 45196 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45672 "parsing/parser.ml" +||||||| 04da777f7 +# 45667 "parsing/parser.ml" +======= +# 45681 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57711,20 +79176,124 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let x : (Parsetree.expression) = Obj.magic x in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = -# 3459 "parsing/parser.mly" - ( _1 ) -# 57728 "parsing/parser.ml" + let _endpos = _endpos_x_ in + let _v : (Parsetree.expression option) = let x = +# 183 "" + ( x ) +<<<<<<< HEAD +# 45228 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45704 "parsing/parser.ml" +||||||| 04da777f7 +# 45699 "parsing/parser.ml" +======= +# 45713 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 45233 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45709 "parsing/parser.ml" +||||||| 04da777f7 +# 45704 "parsing/parser.ml" +======= +# 45718 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (N_ary.type_constraint option) = +# 114 "" + ( None ) +<<<<<<< HEAD +# 45251 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45727 "parsing/parser.ml" +||||||| 04da777f7 +# 45722 "parsing/parser.ml" +======= +# 45736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (N_ary.type_constraint) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (N_ary.type_constraint option) = +# 116 "" + ( Some x ) +<<<<<<< HEAD +# 45276 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.modality Ast_helper.with_loc list) = +# 4419 "parsing/parser.mly" + ( [] ) +# 45294 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57737,36 +79306,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1_inlined1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.modality Ast_helper.with_loc list) = let _2 = + let _1 = _1_inlined1 in + +# 4415 "parsing/parser.mly" + ( _1 ) +# 45328 "parsing/parser.ml" + + in -# 3464 "parsing/parser.mly" - ( reloc_pat ~loc:_sloc _2 ) -# 57770 "parsing/parser.ml" +# 4420 "parsing/parser.mly" + ( _2 ) +# 45334 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.modality Ast_helper.with_loc list) = let _loc__2_ = (_startpos__2_, _endpos__2_) in + +# 4421 "parsing/parser.mly" + ( expecting _loc__2_ "modality expression" ) +# 45367 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45752 "parsing/parser.ml" +||||||| 04da777f7 +# 45747 "parsing/parser.ml" +======= +# 45761 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57784,14 +79393,117 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : ( +# 1026 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 45388 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45773 "parsing/parser.ml" +||||||| 04da777f7 +# 45768 "parsing/parser.ml" +======= +# 45782 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = -# 3466 "parsing/parser.mly" - ( _1 ) -# 57795 "parsing/parser.ml" + let _v : (string) = +<<<<<<< HEAD +# 4922 "parsing/parser.mly" + ( _1 ) +# 45396 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4926 "parsing/parser.mly" +||||||| 04da777f7 +# 4919 "parsing/parser.mly" +======= +# 4910 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45781 "parsing/parser.ml" +||||||| 04da777f7 +# 45776 "parsing/parser.ml" +======= +# 45790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 45430 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45815 "parsing/parser.ml" +||||||| 04da777f7 +# 45810 "parsing/parser.ml" +======= +# 45824 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (string) = +<<<<<<< HEAD +# 4923 "parsing/parser.mly" + ( _2 ) +# 45439 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4927 "parsing/parser.mly" +||||||| 04da777f7 +# 4920 "parsing/parser.mly" +======= +# 4911 "parsing/parser.mly" +>>>>>>> origin/main + ( _2 ) +<<<<<<< HEAD +# 45824 "parsing/parser.ml" +||||||| 04da777f7 +# 45819 "parsing/parser.ml" +======= +# 45833 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57809,79 +79521,55 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let _1_inlined3 : (string option) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _3 : unit = Obj.magic _3 in + let me : (Parsetree.module_expr) = Obj.magic me in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern) = let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 57860 "parsing/parser.ml" - - in - let _3 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 57870 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 57876 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3468 "parsing/parser.mly" - ( mkpat_attrs ~loc:_sloc (Ppat_unpack _4) _3 ) -# 57885 "parsing/parser.ml" +# 1670 "parsing/parser.mly" + ( mkmod ~loc:_sloc (Pmod_constraint(me, mty)) ) +<<<<<<< HEAD +# 45495 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45880 "parsing/parser.ml" +||||||| 04da777f7 +# 45875 "parsing/parser.ml" +======= +# 45889 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57894,115 +79582,59 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in - let _1_inlined4 : (Parsetree.module_type) = Obj.magic _1_inlined4 in let _5 : unit = Obj.magic _5 in - let _1_inlined3 : (string option) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let _4 : (Parsetree.module_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_expr) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.pattern) = let _6 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _1_inlined4) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 57966 "parsing/parser.ml" - - in - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 57977 "parsing/parser.ml" - - in - let (_endpos__4_, _startpos__4_) = (_endpos__1_inlined3_, _startpos__1_inlined3_) in - let _3 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 57988 "parsing/parser.ml" - - in - -# 4739 "parsing/parser.mly" - ( _1, _2 ) -# 57994 "parsing/parser.ml" - - in - let _endpos = _endpos__7_ in - let _symbolstartpos = _startpos__1_ in - let _loc__4_ = (_startpos__4_, _endpos__4_) in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3470 "parsing/parser.mly" - ( mkpat_attrs ~loc:_sloc - (Ppat_constraint(mkpat ~loc:_loc__4_ (Ppat_unpack _4), _6)) - _3 ) -# 58006 "parsing/parser.ml" +# 1672 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__5_ ) +<<<<<<< HEAD +# 45550 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45935 "parsing/parser.ml" +||||||| 04da777f7 +# 45930 "parsing/parser.ml" +======= +# 45944 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58014,35 +79646,44 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let me : (Parsetree.module_expr) = Obj.magic me in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 3479 "parsing/parser.mly" - ( Ppat_any ) -# 58032 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58040 "parsing/parser.ml" - - in - -# 3474 "parsing/parser.mly" - ( _1 ) -# 58046 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.module_expr) = +# 1675 "parsing/parser.mly" + ( me (* TODO consider reloc *) ) +<<<<<<< HEAD +# 45589 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 45974 "parsing/parser.ml" +||||||| 04da777f7 +# 45969 "parsing/parser.ml" +======= +# 45983 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58072,32 +79713,28 @@ module Tables = struct }; }; } = _menhir_stack in - let _3 : (Parsetree.constant) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.constant) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_expr) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 3481 "parsing/parser.mly" - ( Ppat_interval (_1, _3) ) -# 58086 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58095 "parsing/parser.ml" - - in + let _v : (Parsetree.module_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58101 "parsing/parser.ml" +# 1677 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__3_ ) +<<<<<<< HEAD +# 45630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46015 "parsing/parser.ml" +||||||| 04da777f7 +# 46010 "parsing/parser.ml" +======= +# 46024 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58109,87 +79746,149 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58132 "parsing/parser.ml" - - in + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let e = + let _1 = _1_inlined2 in + let e = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45686 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46071 "parsing/parser.ml" +||||||| 04da777f7 +# 46066 "parsing/parser.ml" +======= +# 46080 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 3483 "parsing/parser.mly" - ( Ppat_construct(_1, None) ) -# 58138 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45691 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46076 "parsing/parser.ml" +||||||| 04da777f7 +# 46071 "parsing/parser.ml" +======= +# 46085 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58147 "parsing/parser.ml" +# 1694 "parsing/parser.mly" + ( e ) +<<<<<<< HEAD +# 45697 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46082 "parsing/parser.ml" +||||||| 04da777f7 +# 46077 "parsing/parser.ml" +======= +# 46091 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 45705 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46090 "parsing/parser.ml" +||||||| 04da777f7 +# 46085 "parsing/parser.ml" +======= +# 46099 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58153 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 3485 "parsing/parser.mly" - ( Ppat_variant(_1, None) ) -# 58179 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58187 "parsing/parser.ml" - - in - -# 3474 "parsing/parser.mly" - ( _1 ) -# 58193 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 45714 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46099 "parsing/parser.ml" +||||||| 04da777f7 +# 46094 "parsing/parser.ml" +======= +# 46108 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58202,60 +79901,286 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let e = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let e = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 45794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46179 "parsing/parser.ml" +||||||| 04da777f7 +# 46174 "parsing/parser.ml" +======= +# 46188 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 45799 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46184 "parsing/parser.ml" +||||||| 04da777f7 +# 46179 "parsing/parser.ml" +======= +# 46193 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 45805 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46190 "parsing/parser.ml" +||||||| 04da777f7 +# 46185 "parsing/parser.ml" +======= +# 46199 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 45816 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 45822 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46201 "parsing/parser.ml" +||||||| 04da777f7 +# 46196 "parsing/parser.ml" +======= +# 46210 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 46207 "parsing/parser.ml" +||||||| 04da777f7 +# 46202 "parsing/parser.ml" +======= +# 46216 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58232 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 45835 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46220 "parsing/parser.ml" +||||||| 04da777f7 +# 46215 "parsing/parser.ml" +======= +# 46229 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _1 = -# 3018 "parsing/parser.mly" - ( () ) -# 58238 "parsing/parser.ml" - in -# 3487 "parsing/parser.mly" - ( Ppat_type (_2) ) -# 58243 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46226 "parsing/parser.ml" +||||||| 04da777f7 +# 46221 "parsing/parser.ml" +======= +# 46235 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__1_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58253 "parsing/parser.ml" +# 1694 "parsing/parser.mly" + ( e ) +<<<<<<< HEAD +# 45847 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46232 "parsing/parser.ml" +||||||| 04da777f7 +# 46227 "parsing/parser.ml" +======= +# 46241 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 45855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46240 "parsing/parser.ml" +||||||| 04da777f7 +# 46235 "parsing/parser.ml" +======= +# 46249 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58259 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 45864 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46249 "parsing/parser.ml" +||||||| 04da777f7 +# 46244 "parsing/parser.ml" +======= +# 46258 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58268,60 +80193,200 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58298 "parsing/parser.ml" - - in + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let e = + let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let ty = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 45940 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 46325 "parsing/parser.ml" +||||||| 04da777f7 +# 46320 "parsing/parser.ml" +======= +# 46334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos__1_inlined1_ in + let e = let _1 = -# 3019 "parsing/parser.mly" - ( () ) -# 58304 "parsing/parser.ml" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46333 "parsing/parser.ml" +||||||| 04da777f7 +# 46328 "parsing/parser.ml" +======= +# 46342 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3487 "parsing/parser.mly" - ( Ppat_type (_2) ) -# 58309 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 45953 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46338 "parsing/parser.ml" +||||||| 04da777f7 +# 46333 "parsing/parser.ml" +======= +# 46347 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__1_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58319 "parsing/parser.ml" +# 1696 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) +<<<<<<< HEAD +# 45963 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46348 "parsing/parser.ml" +||||||| 04da777f7 +# 46343 "parsing/parser.ml" +======= +# 46357 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 45971 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46356 "parsing/parser.ml" +||||||| 04da777f7 +# 46351 "parsing/parser.ml" +======= +# 46365 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58325 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 45980 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46365 "parsing/parser.ml" +||||||| 04da777f7 +# 46360 "parsing/parser.ml" +======= +# 46374 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58334,61 +80399,338 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let e = + let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in + let ty = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 46077 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 46462 "parsing/parser.ml" +||||||| 04da777f7 +# 46457 "parsing/parser.ml" +======= +# 46471 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos__1_inlined3_ in + let e = let _1 = - let _endpos = _endpos__1_ in + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 46088 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46473 "parsing/parser.ml" +||||||| 04da777f7 +# 46468 "parsing/parser.ml" +======= +# 46482 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 46093 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46478 "parsing/parser.ml" +||||||| 04da777f7 +# 46473 "parsing/parser.ml" +======= +# 46487 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 46099 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46484 "parsing/parser.ml" +||||||| 04da777f7 +# 46479 "parsing/parser.ml" +======= +# 46493 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46110 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 46116 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46495 "parsing/parser.ml" +||||||| 04da777f7 +# 46490 "parsing/parser.ml" +======= +# 46504 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 46501 "parsing/parser.ml" +||||||| 04da777f7 +# 46496 "parsing/parser.ml" +======= +# 46510 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58370 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 46129 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46514 "parsing/parser.ml" +||||||| 04da777f7 +# 46509 "parsing/parser.ml" +======= +# 46523 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3489 "parsing/parser.mly" - ( Ppat_open(_1, _3) ) -# 58376 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46135 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46520 "parsing/parser.ml" +||||||| 04da777f7 +# 46515 "parsing/parser.ml" +======= +# 46529 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58386 "parsing/parser.ml" +# 1696 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) +<<<<<<< HEAD +# 46145 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46530 "parsing/parser.ml" +||||||| 04da777f7 +# 46525 "parsing/parser.ml" +======= +# 46539 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46153 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46538 "parsing/parser.ml" +||||||| 04da777f7 +# 46533 "parsing/parser.ml" +======= +# 46547 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58392 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 46162 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46547 "parsing/parser.ml" +||||||| 04da777f7 +# 46542 "parsing/parser.ml" +======= +# 46556 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58401,184 +80743,247 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_inlined1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _3 = - let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in - let _1 = -# 3490 "parsing/parser.mly" - (Lident "[]") -# 58442 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58451 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos__2_inlined1_ in - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58462 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3491 "parsing/parser.mly" - ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 58471 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58481 "parsing/parser.ml" - - in - -# 3474 "parsing/parser.mly" - ( _1 ) -# 58487 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; }; } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined4 : (Parsetree.module_type) = Obj.magic _1_inlined4 in + let _4 : unit = Obj.magic _4 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_inlined1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _3 = - let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in - let _1 = -# 3492 "parsing/parser.mly" - (Lident "()") -# 58537 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58546 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos__2_inlined1_ in - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58557 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let e = + let (_endpos__1_inlined2_, _startpos__1_inlined2_, _endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined2, _1_inlined1, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined4, _1_inlined3, _1_inlined2) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3493 "parsing/parser.mly" - ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 58566 "parsing/parser.ml" +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 46252 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 46637 "parsing/parser.ml" +||||||| 04da777f7 +# 46632 "parsing/parser.ml" +======= +# 46646 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__2_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos_ty2_ = _endpos__1_inlined2_ in + let ty1 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 46266 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 46651 "parsing/parser.ml" +||||||| 04da777f7 +# 46646 "parsing/parser.ml" +======= +# 46660 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let e = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46273 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46658 "parsing/parser.ml" +||||||| 04da777f7 +# 46653 "parsing/parser.ml" +======= +# 46667 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46278 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46663 "parsing/parser.ml" +||||||| 04da777f7 +# 46658 "parsing/parser.ml" +======= +# 46672 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58576 "parsing/parser.ml" +# 1698 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) +<<<<<<< HEAD +# 46288 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46673 "parsing/parser.ml" +||||||| 04da777f7 +# 46668 "parsing/parser.ml" +======= +# 46682 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46296 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46681 "parsing/parser.ml" +||||||| 04da777f7 +# 46676 "parsing/parser.ml" +======= +# 46690 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58582 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 46305 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46690 "parsing/parser.ml" +||||||| 04da777f7 +# 46685 "parsing/parser.ml" +======= +# 46699 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58596,70 +81001,380 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined6; + MenhirLib.EngineTypes.startp = _startpos__1_inlined6_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.pattern) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in + let _1_inlined6 : (Parsetree.module_type) = Obj.magic _1_inlined6 in + let _4 : unit = Obj.magic _4 in + let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = + let _v : (Parsetree.module_expr) = let e = + let (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined4, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined6_, _startpos__1_inlined6_, _endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined6, _1_inlined5, _1_inlined4, _1_inlined3) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _1_inlined4) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 46416 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 46801 "parsing/parser.ml" +||||||| 04da777f7 +# 46796 "parsing/parser.ml" +======= +# 46810 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty2_ = _endpos__1_inlined4_ in + let ty1 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 46430 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 46815 "parsing/parser.ml" +||||||| 04da777f7 +# 46810 "parsing/parser.ml" +======= +# 46824 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let e = let _1 = - let _endpos = _endpos__1_ in + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 46440 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46825 "parsing/parser.ml" +||||||| 04da777f7 +# 46820 "parsing/parser.ml" +======= +# 46834 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 46445 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46830 "parsing/parser.ml" +||||||| 04da777f7 +# 46825 "parsing/parser.ml" +======= +# 46839 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 46451 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46836 "parsing/parser.ml" +||||||| 04da777f7 +# 46831 "parsing/parser.ml" +======= +# 46845 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46462 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 46468 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46847 "parsing/parser.ml" +||||||| 04da777f7 +# 46842 "parsing/parser.ml" +======= +# 46856 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 46853 "parsing/parser.ml" +||||||| 04da777f7 +# 46848 "parsing/parser.ml" +======= +# 46862 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 58641 "parsing/parser.ml" +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 46481 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46866 "parsing/parser.ml" +||||||| 04da777f7 +# 46861 "parsing/parser.ml" +======= +# 46875 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3495 "parsing/parser.mly" - ( Ppat_open (_1, _4) ) -# 58647 "parsing/parser.ml" +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46487 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46872 "parsing/parser.ml" +||||||| 04da777f7 +# 46867 "parsing/parser.ml" +======= +# 46881 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58657 "parsing/parser.ml" +# 1698 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) +<<<<<<< HEAD +# 46497 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46882 "parsing/parser.ml" +||||||| 04da777f7 +# 46877 "parsing/parser.ml" +======= +# 46891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46505 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46890 "parsing/parser.ml" +||||||| 04da777f7 +# 46885 "parsing/parser.ml" +======= +# 46899 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58663 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 46514 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46899 "parsing/parser.ml" +||||||| 04da777f7 +# 46894 "parsing/parser.ml" +======= +# 46908 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58677,62 +81392,195 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.pattern) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _v : (Parsetree.module_expr) = let e = + let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3497 "parsing/parser.mly" - ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 58720 "parsing/parser.ml" +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 46590 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 46975 "parsing/parser.ml" +||||||| 04da777f7 +# 46970 "parsing/parser.ml" +======= +# 46984 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos_ty2_ = _endpos__1_inlined1_ in + let e = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46598 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46983 "parsing/parser.ml" +||||||| 04da777f7 +# 46978 "parsing/parser.ml" +======= +# 46992 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46603 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46988 "parsing/parser.ml" +||||||| 04da777f7 +# 46983 "parsing/parser.ml" +======= +# 46997 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58730 "parsing/parser.ml" +# 1700 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) +<<<<<<< HEAD +# 46613 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 46998 "parsing/parser.ml" +||||||| 04da777f7 +# 46993 "parsing/parser.ml" +======= +# 47007 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46621 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47006 "parsing/parser.ml" +||||||| 04da777f7 +# 47001 "parsing/parser.ml" +======= +# 47015 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58736 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 46630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47015 "parsing/parser.ml" +||||||| 04da777f7 +# 47010 "parsing/parser.ml" +======= +# 47024 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58745,118 +81593,338 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _loc__4_ = (_startpos__4_, _endpos__4_) in - -# 3499 "parsing/parser.mly" - ( expecting _loc__4_ "pattern" ) -# 58785 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58795 "parsing/parser.ml" - - in - -# 3474 "parsing/parser.mly" - ( _1 ) -# 58801 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _5 : unit = Obj.magic _5 in + let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let e = + let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3501 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 58844 "parsing/parser.ml" +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 46727 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 47112 "parsing/parser.ml" +||||||| 04da777f7 +# 47107 "parsing/parser.ml" +======= +# 47121 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos_ty2_ = _endpos__1_inlined3_ in + let e = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 46738 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47123 "parsing/parser.ml" +||||||| 04da777f7 +# 47118 "parsing/parser.ml" +======= +# 47132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 46743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47128 "parsing/parser.ml" +||||||| 04da777f7 +# 47123 "parsing/parser.ml" +======= +# 47137 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 46749 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47134 "parsing/parser.ml" +||||||| 04da777f7 +# 47129 "parsing/parser.ml" +======= +# 47143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46760 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 46766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47145 "parsing/parser.ml" +||||||| 04da777f7 +# 47140 "parsing/parser.ml" +======= +# 47154 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 47151 "parsing/parser.ml" +||||||| 04da777f7 +# 47146 "parsing/parser.ml" +======= +# 47160 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 46779 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47164 "parsing/parser.ml" +||||||| 04da777f7 +# 47159 "parsing/parser.ml" +======= +# 47173 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46785 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47170 "parsing/parser.ml" +||||||| 04da777f7 +# 47165 "parsing/parser.ml" +======= +# 47179 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58854 "parsing/parser.ml" +# 1700 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) +<<<<<<< HEAD +# 46795 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47180 "parsing/parser.ml" +||||||| 04da777f7 +# 47175 "parsing/parser.ml" +======= +# 47189 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 46803 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47188 "parsing/parser.ml" +||||||| 04da777f7 +# 47183 "parsing/parser.ml" +======= +# 47197 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58860 "parsing/parser.ml" +# 1681 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +<<<<<<< HEAD +# 46812 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47197 "parsing/parser.ml" +||||||| 04da777f7 +# 47192 "parsing/parser.ml" +======= +# 47206 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58869,63 +81937,84 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in + let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.core_type) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_expr) = let _4 = + let _1 = _1_inlined2 in let _1 = -# 3503 "parsing/parser.mly" - ( Ppat_constraint(_2, _4) ) -# 58914 "parsing/parser.ml" +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 46874 "parsing/parser.ml" in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58923 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 46879 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 46887 "parsing/parser.ml" in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 58929 "parsing/parser.ml" +# 1683 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +# 46895 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58938,67 +82027,143 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in + let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.core_type) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_expr) = let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in let _1 = - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 46981 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 46986 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 46992 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 47003 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 47009 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3505 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 58986 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 47022 "parsing/parser.ml" in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 58996 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 47028 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 47036 "parsing/parser.ml" in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 59002 "parsing/parser.ml" +# 1683 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +# 47044 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59011,59 +82176,77 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = - let _loc__4_ = (_startpos__4_, _endpos__4_) in - -# 3507 "parsing/parser.mly" - ( expecting _loc__4_ "type" ) -# 59051 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_expr) = let _4 = + let _1 = _1_inlined2 in + let _1 = +# 2564 "parsing/parser.mly" + ( _1 ) +# 47106 "parsing/parser.ml" + in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 59061 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 47111 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 47119 "parsing/parser.ml" in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 59067 "parsing/parser.ml" +# 1685 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +# 47127 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59076,45 +82259,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -59123,70 +82312,139 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let _4 : (string option) = Obj.magic _4 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Location.loc option) = Obj.magic _1_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_expr) = let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in let _1 = - let _6 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 47213 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 47218 "parsing/parser.ml" + + in -# 4282 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 59150 "parsing/parser.ml" +# 3255 "parsing/parser.mly" + ( xs ) +# 47224 "parsing/parser.ml" in - let _3 = + let _endpos__3_ = _endpos_xs_ in + let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +# 5009 "parsing/parser.mly" ( _1 ) -# 59160 "parsing/parser.ml" +# 47235 "parsing/parser.ml" in -# 4739 "parsing/parser.mly" +# 5022 "parsing/parser.mly" ( _1, _2 ) -# 59166 "parsing/parser.ml" +# 47241 "parsing/parser.ml" in - let _loc__7_ = (_startpos__7_, _endpos__7_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3510 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__7_ ) -# 59174 "parsing/parser.ml" +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 47254 "parsing/parser.ml" in - let _endpos__1_ = _endpos__7_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 59184 "parsing/parser.ml" +# 2768 "parsing/parser.mly" + ( _1 ) +# 47260 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 47268 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47259 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 47264 "parsing/parser.ml" +||||||| 04da777f7 +# 47254 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 47259 "parsing/parser.ml" +======= +# 47268 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 47273 "parsing/parser.ml" +>>>>>>> origin/main in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47272 "parsing/parser.ml" +||||||| 04da777f7 +# 47267 "parsing/parser.ml" +======= +# 47281 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 59190 "parsing/parser.ml" +# 1683 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +<<<<<<< HEAD +# 47280 "parsing/parser.ml" +||||||| 04da777f7 +# 47275 "parsing/parser.ml" +======= +# 47289 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59198,35 +82456,238 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.extension) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _1 = - let _1 = -# 3512 "parsing/parser.mly" - ( Ppat_extension _1 ) -# 59216 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_expr) = let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 47366 "parsing/parser.ml" +||||||| 04da777f7 +# 47361 "parsing/parser.ml" +======= +# 47375 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 47371 "parsing/parser.ml" +||||||| 04da777f7 +# 47366 "parsing/parser.ml" +======= +# 47380 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 47377 "parsing/parser.ml" +||||||| 04da777f7 +# 47372 "parsing/parser.ml" +======= +# 47386 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47388 "parsing/parser.ml" +||||||| 04da777f7 +# 47383 "parsing/parser.ml" +======= +# 47397 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 47394 "parsing/parser.ml" +||||||| 04da777f7 +# 47389 "parsing/parser.ml" +======= +# 47403 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 47407 "parsing/parser.ml" + + in -# 1317 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 59224 "parsing/parser.ml" +# 2780 "parsing/parser.mly" + ( _1 ) +# 47413 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 47421 "parsing/parser.ml" +||||||| 04da777f7 +# 47402 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 47408 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 47416 "parsing/parser.ml" +======= +# 47416 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 47422 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4997 "parsing/parser.mly" + ( _1 ) +# 47430 "parsing/parser.ml" +>>>>>>> origin/main in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3474 "parsing/parser.mly" - ( _1 ) -# 59230 "parsing/parser.ml" +# 1683 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +<<<<<<< HEAD +# 47429 "parsing/parser.ml" +||||||| 04da777f7 +# 47424 "parsing/parser.ml" +======= +# 47438 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59238,23 +82699,124 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : (Constant.t) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_expr) = let _4 = + let _1 = _1_inlined2 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47491 "parsing/parser.ml" +||||||| 04da777f7 +# 47486 "parsing/parser.ml" +======= +# 47500 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47496 "parsing/parser.ml" +||||||| 04da777f7 +# 47491 "parsing/parser.ml" +======= +# 47505 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47504 "parsing/parser.ml" +||||||| 04da777f7 +# 47499 "parsing/parser.ml" +======= +# 47513 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3475 "parsing/parser.mly" - ( Constant.to_pattern _1 ~loc:_sloc ) -# 59258 "parsing/parser.ml" +# 1685 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +<<<<<<< HEAD +# 47276 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47512 "parsing/parser.ml" +||||||| 04da777f7 +# 47507 "parsing/parser.ml" +======= +# 47521 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59266,24 +82828,235 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : ( -# 1094 "parsing/parser.mly" - (string) -# 59279 "parsing/parser.ml" - ) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4646 "parsing/parser.mly" - ( _1 ) -# 59287 "parsing/parser.ml" + let _endpos = _endpos__6_ in + let _v : (Parsetree.module_expr) = let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 47598 "parsing/parser.ml" +||||||| 04da777f7 +# 47593 "parsing/parser.ml" +======= +# 47607 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 47603 "parsing/parser.ml" +||||||| 04da777f7 +# 47598 "parsing/parser.ml" +======= +# 47612 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 47609 "parsing/parser.ml" +||||||| 04da777f7 +# 47604 "parsing/parser.ml" +======= +# 47618 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47620 "parsing/parser.ml" +||||||| 04da777f7 +# 47615 "parsing/parser.ml" +======= +# 47629 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 47626 "parsing/parser.ml" +||||||| 04da777f7 +# 47621 "parsing/parser.ml" +======= +# 47635 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 47639 "parsing/parser.ml" +||||||| 04da777f7 +# 47634 "parsing/parser.ml" +======= +# 47648 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47645 "parsing/parser.ml" +||||||| 04da777f7 +# 47640 "parsing/parser.ml" +======= +# 47654 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47653 "parsing/parser.ml" +||||||| 04da777f7 +# 47648 "parsing/parser.ml" +======= +# 47662 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1685 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +<<<<<<< HEAD +# 47661 "parsing/parser.ml" +||||||| 04da777f7 +# 47656 "parsing/parser.ml" +======= +# 47670 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59295,24 +83068,131 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : ( -# 1148 "parsing/parser.mly" - (string) -# 59308 "parsing/parser.ml" - ) = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4647 "parsing/parser.mly" - ( _1 ) -# 59316 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let _4 = + let _1 = _1_inlined2 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47331 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47716 "parsing/parser.ml" +||||||| 04da777f7 +# 47711 "parsing/parser.ml" +======= +# 47725 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47721 "parsing/parser.ml" +||||||| 04da777f7 +# 47716 "parsing/parser.ml" +======= +# 47730 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 47344 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47729 "parsing/parser.ml" +||||||| 04da777f7 +# 47724 "parsing/parser.ml" +======= +# 47738 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1687 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__5_ ) +<<<<<<< HEAD +# 47352 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47737 "parsing/parser.ml" +||||||| 04da777f7 +# 47732 "parsing/parser.ml" +======= +# 47746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59324,20 +83204,269 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4648 "parsing/parser.mly" - ( "and" ) -# 59341 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Parsetree.module_expr) = let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 47431 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47816 "parsing/parser.ml" +||||||| 04da777f7 +# 47811 "parsing/parser.ml" +======= +# 47825 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 47436 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47821 "parsing/parser.ml" +||||||| 04da777f7 +# 47816 "parsing/parser.ml" +======= +# 47830 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 47442 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47827 "parsing/parser.ml" +||||||| 04da777f7 +# 47822 "parsing/parser.ml" +======= +# 47836 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 47453 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 47459 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47838 "parsing/parser.ml" +||||||| 04da777f7 +# 47833 "parsing/parser.ml" +======= +# 47847 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 47844 "parsing/parser.ml" +||||||| 04da777f7 +# 47839 "parsing/parser.ml" +======= +# 47853 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 47472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47857 "parsing/parser.ml" +||||||| 04da777f7 +# 47852 "parsing/parser.ml" +======= +# 47866 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47478 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47863 "parsing/parser.ml" +||||||| 04da777f7 +# 47858 "parsing/parser.ml" +======= +# 47872 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _3 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 47486 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47871 "parsing/parser.ml" +||||||| 04da777f7 +# 47866 "parsing/parser.ml" +======= +# 47880 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1687 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__5_ ) +<<<<<<< HEAD +# 47494 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47879 "parsing/parser.ml" +||||||| 04da777f7 +# 47874 "parsing/parser.ml" +======= +# 47888 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59355,14 +83484,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4649 "parsing/parser.mly" - ( "as" ) -# 59366 "parsing/parser.ml" + let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = +<<<<<<< HEAD +# 3924 "parsing/parser.mly" +||||||| 04da777f7 +# 3917 "parsing/parser.mly" +======= +# 3908 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47519 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47904 "parsing/parser.ml" +||||||| 04da777f7 +# 47899 "parsing/parser.ml" +======= +# 47913 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59374,20 +83519,147 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _2 : (Asttypes.label) = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Asttypes.variance * Asttypes.injectivity) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4650 "parsing/parser.mly" - ( "assert" ) -# 59391 "parsing/parser.ml" + let _endpos = _endpos_jkind_ in + let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = let _2 = + let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 47583 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 47968 "parsing/parser.ml" +||||||| 04da777f7 +# 47963 "parsing/parser.ml" +======= +# 47977 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let name = +<<<<<<< HEAD +# 3945 "parsing/parser.mly" +||||||| 04da777f7 +# 3938 "parsing/parser.mly" +======= +# 3929 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _2 ) +<<<<<<< HEAD +# 47589 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47974 "parsing/parser.ml" +||||||| 04da777f7 +# 47969 "parsing/parser.ml" +======= +# 47983 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _startpos_name_ = _startpos__1_ in + let _endpos = _endpos_jkind_ in + let _symbolstartpos = _startpos_name_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3919 "parsing/parser.mly" +||||||| 04da777f7 +# 3912 "parsing/parser.mly" +======= +# 3903 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Core_type.core_type_of ~loc:(make_loc _sloc) ~attrs + (Jtyp_layout (Ltyp_var { name; jkind })) ) +<<<<<<< HEAD +# 47599 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47984 "parsing/parser.ml" +||||||| 04da777f7 +# 47979 "parsing/parser.ml" +======= +# 47993 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3926 "parsing/parser.mly" +||||||| 04da777f7 +# 3919 "parsing/parser.mly" +======= +# 3910 "parsing/parser.mly" +>>>>>>> origin/main + ( _2, _1 ) +<<<<<<< HEAD +# 47605 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 47990 "parsing/parser.ml" +||||||| 04da777f7 +# 47985 "parsing/parser.ml" +======= +# 47999 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59399,20 +83671,134 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Asttypes.variance * Asttypes.injectivity) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4651 "parsing/parser.mly" - ( "begin" ) -# 59416 "parsing/parser.ml" + let _endpos = _endpos_jkind_ in + let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = let _2 = + let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 47662 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48047 "parsing/parser.ml" +||||||| 04da777f7 +# 48042 "parsing/parser.ml" +======= +# 48056 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let name = +<<<<<<< HEAD +# 3947 "parsing/parser.mly" +||||||| 04da777f7 +# 3940 "parsing/parser.mly" +======= +# 3931 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 47668 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48053 "parsing/parser.ml" +||||||| 04da777f7 +# 48048 "parsing/parser.ml" +======= +# 48062 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _startpos_name_ = _startpos__1_ in + let _endpos = _endpos_jkind_ in + let _symbolstartpos = _startpos_name_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3919 "parsing/parser.mly" +||||||| 04da777f7 +# 3912 "parsing/parser.mly" +======= +# 3903 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Core_type.core_type_of ~loc:(make_loc _sloc) ~attrs + (Jtyp_layout (Ltyp_var { name; jkind })) ) +<<<<<<< HEAD +# 47678 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48063 "parsing/parser.ml" +||||||| 04da777f7 +# 48058 "parsing/parser.ml" +======= +# 48072 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3926 "parsing/parser.mly" +||||||| 04da777f7 +# 3919 "parsing/parser.mly" +======= +# 3910 "parsing/parser.mly" +>>>>>>> origin/main + ( _2, _1 ) +<<<<<<< HEAD +# 47684 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48069 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59424,20 +83810,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4652 "parsing/parser.mly" - ( "class" ) -# 59441 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1598 "parsing/parser.mly" + ( _1 ) +# 48101 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59449,20 +83842,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4653 "parsing/parser.mly" - ( "constraint" ) -# 59466 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1583 "parsing/parser.mly" + ( _1 ) +# 48133 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59474,20 +83874,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4654 "parsing/parser.mly" - ( "do" ) -# 59491 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.core_type) = +# 1558 "parsing/parser.mly" + ( _1 ) +# 48165 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59499,20 +83906,29 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4655 "parsing/parser.mly" - ( "done" ) -# 59516 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = +# 1563 "parsing/parser.mly" + ( _1 ) +# 48197 "parsing/parser.ml" +||||||| 04da777f7 +# 48064 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59524,20 +83940,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4656 "parsing/parser.mly" - ( "downto" ) -# 59541 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1598 "parsing/parser.mly" + ( _1 ) +# 48096 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59549,20 +83972,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4657 "parsing/parser.mly" - ( "else" ) -# 59566 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1583 "parsing/parser.mly" + ( _1 ) +# 48128 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59574,20 +84004,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4658 "parsing/parser.mly" - ( "end" ) -# 59591 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.core_type) = +# 1558 "parsing/parser.mly" + ( _1 ) +# 48160 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59599,20 +84036,31 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4659 "parsing/parser.mly" - ( "exception" ) -# 59616 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = +# 1563 "parsing/parser.mly" + ( _1 ) +# 48192 "parsing/parser.ml" +======= +# 48078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59624,20 +84072,31 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4660 "parsing/parser.mly" - ( "external" ) -# 59641 "parsing/parser.ml" + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1588 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 47716 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48229 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59649,20 +84108,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4661 "parsing/parser.mly" - ( "false" ) -# 59666 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1593 "parsing/parser.mly" + ( _1 ) +# 48261 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59674,20 +84140,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_expr) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4662 "parsing/parser.mly" - ( "for" ) -# 59691 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_expr) = +# 1553 "parsing/parser.mly" + ( _1 ) +# 48293 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59699,20 +84172,29 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4663 "parsing/parser.mly" - ( "fun" ) -# 59716 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = +# 1548 "parsing/parser.mly" + ( _1 ) +# 48325 "parsing/parser.ml" +||||||| 04da777f7 +# 48224 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59724,20 +84206,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4664 "parsing/parser.mly" - ( "function" ) -# 59741 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1593 "parsing/parser.mly" + ( _1 ) +# 48256 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59749,20 +84238,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_expr) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4665 "parsing/parser.mly" - ( "functor" ) -# 59766 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_expr) = +# 1553 "parsing/parser.mly" + ( _1 ) +# 48288 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59774,20 +84270,31 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4666 "parsing/parser.mly" - ( "if" ) -# 59791 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = +# 1548 "parsing/parser.mly" + ( _1 ) +# 48320 "parsing/parser.ml" +======= +# 48110 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59799,20 +84306,37 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4667 "parsing/parser.mly" - ( "in" ) -# 59816 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1573 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 47748 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48357 "parsing/parser.ml" +||||||| 04da777f7 +# 48352 "parsing/parser.ml" +======= +# 48142 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59824,20 +84348,36 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4668 "parsing/parser.mly" - ( "include" ) -# 59841 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.core_type) = +# 1548 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 47780 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48389 "parsing/parser.ml" +||||||| 04da777f7 +# 48384 "parsing/parser.ml" +======= +# 48174 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59849,20 +84389,32 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4669 "parsing/parser.mly" - ( "inherit" ) -# 59866 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = +# 1553 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 47812 "parsing/parser.ml" +======= +# 48206 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59874,20 +84426,36 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4670 "parsing/parser.mly" - ( "initializer" ) -# 59891 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1578 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 47844 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48421 "parsing/parser.ml" +||||||| 04da777f7 +# 48416 "parsing/parser.ml" +======= +# 48238 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59899,20 +84467,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4671 "parsing/parser.mly" - ( "lazy" ) -# 59916 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1583 "parsing/parser.mly" + ( _1 ) +# 47876 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59924,20 +84499,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_expr) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4672 "parsing/parser.mly" - ( "let" ) -# 59941 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_expr) = +# 1543 "parsing/parser.mly" + ( _1 ) +# 47908 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59949,20 +84531,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4673 "parsing/parser.mly" - ( "local_" ) -# 59966 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = +# 1538 "parsing/parser.mly" + ( _1 ) +# 47940 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59974,20 +84563,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4674 "parsing/parser.mly" - ( "match" ) -# 59991 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1563 "parsing/parser.mly" + ( _1 ) +# 47972 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59999,20 +84595,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4675 "parsing/parser.mly" - ( "method" ) -# 60016 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = +# 1558 "parsing/parser.mly" + ( _1 ) +# 48004 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60024,20 +84627,32 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4676 "parsing/parser.mly" - ( "module" ) -# 60041 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1568 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 48036 "parsing/parser.ml" +======= +# 48430 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60049,20 +84664,77 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4677 "parsing/parser.mly" - ( "mutable" ) -# 60066 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3498 "parsing/parser.mly" +||||||| 04da777f7 +# 3496 "parsing/parser.mly" +======= +# 3486 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) +<<<<<<< HEAD +# 48080 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48465 "parsing/parser.ml" +||||||| 04da777f7 +# 48460 "parsing/parser.ml" +======= +# 48474 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3486 "parsing/parser.mly" +||||||| 04da777f7 +# 3484 "parsing/parser.mly" +======= +# 3474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48086 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48471 "parsing/parser.ml" +||||||| 04da777f7 +# 48466 "parsing/parser.ml" +======= +# 48480 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60074,20 +84746,64 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : (Parsetree.attribute) = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4678 "parsing/parser.mly" - ( "new" ) -# 60091 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = let _1 = +<<<<<<< HEAD +# 3500 "parsing/parser.mly" +||||||| 04da777f7 +# 3498 "parsing/parser.mly" +======= +# 3488 "parsing/parser.mly" +>>>>>>> origin/main + ( Pat.attr _1 _2 ) +<<<<<<< HEAD +# 48118 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48503 "parsing/parser.ml" +||||||| 04da777f7 +# 48498 "parsing/parser.ml" +======= +# 48512 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3486 "parsing/parser.mly" +||||||| 04da777f7 +# 3484 "parsing/parser.mly" +======= +# 3474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48123 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48508 "parsing/parser.ml" +||||||| 04da777f7 +# 48503 "parsing/parser.ml" +======= +# 48517 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60105,14 +84821,35 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4679 "parsing/parser.mly" - ( "nonrec" ) -# 60116 "parsing/parser.ml" + let _v : (Parsetree.pattern) = let _1 = +<<<<<<< HEAD +# 3502 "parsing/parser.mly" +||||||| 04da777f7 +# 3500 "parsing/parser.mly" + ( _1 ) +# 48528 "parsing/parser.ml" + in + +# 3484 "parsing/parser.mly" +======= +# 3490 "parsing/parser.mly" + ( _1 ) +# 48148 "parsing/parser.ml" + in + +# 3474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 48153 "parsing/parser.ml" + in + +# 3486 "parsing/parser.mly" + ( _1 ) +# 48538 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60124,20 +84861,134 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4680 "parsing/parser.mly" - ( "object" ) -# 60141 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 48200 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48585 "parsing/parser.ml" +||||||| 04da777f7 +# 48580 "parsing/parser.ml" +======= +# 48594 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3505 "parsing/parser.mly" +||||||| 04da777f7 +# 3503 "parsing/parser.mly" +======= +# 3493 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_alias(_1, _3) ) +<<<<<<< HEAD +# 48206 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48591 "parsing/parser.ml" +||||||| 04da777f7 +# 48586 "parsing/parser.ml" +======= +# 48600 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 48216 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48601 "parsing/parser.ml" +||||||| 04da777f7 +# 48596 "parsing/parser.ml" +======= +# 48610 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3514 "parsing/parser.mly" +||||||| 04da777f7 +# 3512 "parsing/parser.mly" +======= +# 3502 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48222 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48607 "parsing/parser.ml" +||||||| 04da777f7 +# 48602 "parsing/parser.ml" +======= +# 48616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3486 "parsing/parser.mly" +||||||| 04da777f7 +# 3484 "parsing/parser.mly" +======= +# 3474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48228 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48613 "parsing/parser.ml" +||||||| 04da777f7 +# 48608 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60149,20 +85000,63 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4681 "parsing/parser.mly" - ( "of" ) -# 60166 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3505 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 48651 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 48661 "parsing/parser.ml" + + in + +# 3512 "parsing/parser.mly" + ( _1 ) +# 48667 "parsing/parser.ml" + + in + +# 3484 "parsing/parser.mly" + ( _1 ) +# 48673 "parsing/parser.ml" +======= +# 48622 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60174,20 +85068,65 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4682 "parsing/parser.mly" - ( "open" ) -# 60191 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3495 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 48271 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 48281 "parsing/parser.ml" + + in + +# 3502 "parsing/parser.mly" + ( _1 ) +# 48287 "parsing/parser.ml" + + in + +# 3474 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 48293 "parsing/parser.ml" +======= +# 48687 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60199,20 +85138,112 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4683 "parsing/parser.mly" - ( "or" ) -# 60216 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3507 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 48656 "parsing/parser.ml" +||||||| 04da777f7 +# 3507 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 48716 "parsing/parser.ml" +======= +# 3497 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +<<<<<<< HEAD +# 48336 "parsing/parser.ml" +======= +# 48730 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 48346 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48666 "parsing/parser.ml" +||||||| 04da777f7 +# 48726 "parsing/parser.ml" +======= +# 48740 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3514 "parsing/parser.mly" +||||||| 04da777f7 +# 3512 "parsing/parser.mly" +======= +# 3502 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48352 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48672 "parsing/parser.ml" +||||||| 04da777f7 +# 48732 "parsing/parser.ml" +======= +# 48746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3486 "parsing/parser.mly" +||||||| 04da777f7 +# 3484 "parsing/parser.mly" +======= +# 3474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48358 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48678 "parsing/parser.ml" +||||||| 04da777f7 +# 48738 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60224,20 +85255,60 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4684 "parsing/parser.mly" - ( "private" ) -# 60241 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +# 3509 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 48779 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 48788 "parsing/parser.ml" + + in + +# 3512 "parsing/parser.mly" + ( _1 ) +# 48794 "parsing/parser.ml" + + in + +# 3484 "parsing/parser.mly" + ( _1 ) +# 48800 "parsing/parser.ml" +======= +# 48752 "parsing/parser.ml" +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60249,20 +85320,62 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4685 "parsing/parser.mly" - ( "rec" ) -# 60266 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +# 3499 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 48399 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 48408 "parsing/parser.ml" + + in + +# 3502 "parsing/parser.mly" + ( _1 ) +# 48414 "parsing/parser.ml" + + in + +# 3474 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 48420 "parsing/parser.ml" +======= +# 48814 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60274,20 +85387,112 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4686 "parsing/parser.mly" - ( "sig" ) -# 60291 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3509 "parsing/parser.mly" +||||||| 04da777f7 +# 3511 "parsing/parser.mly" +======= +# 3501 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__3_ "pattern" ) +<<<<<<< HEAD +# 48463 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48721 "parsing/parser.ml" +||||||| 04da777f7 +# 48843 "parsing/parser.ml" +======= +# 48857 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 48473 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48731 "parsing/parser.ml" +||||||| 04da777f7 +# 48853 "parsing/parser.ml" +======= +# 48867 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3514 "parsing/parser.mly" +||||||| 04da777f7 +# 3512 "parsing/parser.mly" +======= +# 3502 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48479 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48737 "parsing/parser.ml" +||||||| 04da777f7 +# 48859 "parsing/parser.ml" +======= +# 48873 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3486 "parsing/parser.mly" +||||||| 04da777f7 +# 3484 "parsing/parser.mly" +======= +# 3474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48485 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48743 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60299,20 +85504,57 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4687 "parsing/parser.mly" - ( "struct" ) -# 60316 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +# 3511 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 48784 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 48793 "parsing/parser.ml" + + in + +# 3514 "parsing/parser.mly" + ( _1 ) +# 48799 "parsing/parser.ml" + + in + +# 3486 "parsing/parser.mly" + ( _1 ) +# 48805 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60324,20 +85566,66 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4688 "parsing/parser.mly" - ( "then" ) -# 60341 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3513 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 48848 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 48858 "parsing/parser.ml" + + in + +# 3514 "parsing/parser.mly" + ( _1 ) +# 48864 "parsing/parser.ml" + + in + +# 3486 "parsing/parser.mly" + ( _1 ) +# 48870 "parsing/parser.ml" +||||||| 04da777f7 +# 48865 "parsing/parser.ml" +======= +# 48879 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60355,14 +85643,175 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4689 "parsing/parser.mly" - ( "to" ) -# 60366 "parsing/parser.ml" + let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3516 "parsing/parser.mly" +||||||| 04da777f7 +# 3514 "parsing/parser.mly" +======= +# 3504 "parsing/parser.mly" +>>>>>>> origin/main + ( let closed, pats = _1 in + ppat_ltuple _sloc (List.rev pats) closed + ) +<<<<<<< HEAD +# 48516 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48901 "parsing/parser.ml" +||||||| 04da777f7 +# 48896 "parsing/parser.ml" +======= +# 48910 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3486 "parsing/parser.mly" +||||||| 04da777f7 +# 3484 "parsing/parser.mly" +======= +# 3474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48522 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48907 "parsing/parser.ml" +||||||| 04da777f7 +# 48902 "parsing/parser.ml" +======= +# 48916 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 48572 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 48578 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48957 "parsing/parser.ml" +||||||| 04da777f7 +# 48952 "parsing/parser.ml" +======= +# 48966 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 48963 "parsing/parser.ml" +||||||| 04da777f7 +# 48958 "parsing/parser.ml" +======= +# 48972 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3488 "parsing/parser.mly" +||||||| 04da777f7 +# 3486 "parsing/parser.mly" +======= +# 3476 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_attrs ~loc:_sloc (Ppat_exception _3) _2) +<<<<<<< HEAD +# 48587 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48972 "parsing/parser.ml" +||||||| 04da777f7 +# 48967 "parsing/parser.ml" +======= +# 48981 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60380,14 +85829,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4690 "parsing/parser.mly" - ( "true" ) -# 60391 "parsing/parser.ml" + let _v : (Parsetree.pattern) = +<<<<<<< HEAD +# 3577 "parsing/parser.mly" +||||||| 04da777f7 +# 3575 "parsing/parser.mly" +======= +# 3566 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48612 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 48997 "parsing/parser.ml" +||||||| 04da777f7 +# 48992 "parsing/parser.ml" +======= +# 49006 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60399,20 +85864,268 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 48650 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49035 "parsing/parser.ml" +||||||| 04da777f7 +# 49030 "parsing/parser.ml" +======= +# 49044 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3580 "parsing/parser.mly" +||||||| 04da777f7 +# 3578 "parsing/parser.mly" +======= +# 3569 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_construct(_1, Some ([], _2)) ) +<<<<<<< HEAD +# 48656 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49041 "parsing/parser.ml" +||||||| 04da777f7 +# 49036 "parsing/parser.ml" +======= +# 49050 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 48666 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49051 "parsing/parser.ml" +||||||| 04da777f7 +# 49046 "parsing/parser.ml" +======= +# 49060 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3586 "parsing/parser.mly" +||||||| 04da777f7 +# 3584 "parsing/parser.mly" +======= +# 3575 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48672 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49057 "parsing/parser.ml" +||||||| 04da777f7 +# 49052 "parsing/parser.ml" +======= +# 49066 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _5 : unit = Obj.magic _5 in + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4691 "parsing/parser.mly" - ( "try" ) -# 60416 "parsing/parser.ml" + let _endpos = _endpos_pat_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let newtypes = +<<<<<<< HEAD +# 3078 "parsing/parser.mly" +||||||| 04da777f7 +# 3076 "parsing/parser.mly" +======= +# 3066 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 48734 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49119 "parsing/parser.ml" +||||||| 04da777f7 +# 49114 "parsing/parser.ml" +======= +# 49128 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let constr = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 48743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49128 "parsing/parser.ml" +||||||| 04da777f7 +# 49123 "parsing/parser.ml" +======= +# 49137 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3583 "parsing/parser.mly" +||||||| 04da777f7 +# 3581 "parsing/parser.mly" +======= +# 3572 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_construct(constr, Some (newtypes, pat)) ) +<<<<<<< HEAD +# 48749 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49134 "parsing/parser.ml" +||||||| 04da777f7 +# 49129 "parsing/parser.ml" +======= +# 49143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_pat_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 48759 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49144 "parsing/parser.ml" +||||||| 04da777f7 +# 49139 "parsing/parser.ml" +======= +# 49153 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3586 "parsing/parser.mly" +||||||| 04da777f7 +# 3584 "parsing/parser.mly" +======= +# 3575 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48765 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49150 "parsing/parser.ml" +||||||| 04da777f7 +# 49145 "parsing/parser.ml" +======= +# 49159 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60424,20 +86137,202 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = +<<<<<<< HEAD +# 3585 "parsing/parser.mly" +||||||| 04da777f7 +# 3583 "parsing/parser.mly" +======= +# 3574 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_variant(_1, Some _2) ) +<<<<<<< HEAD +# 48798 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49183 "parsing/parser.ml" +||||||| 04da777f7 +# 49178 "parsing/parser.ml" +======= +# 49192 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 48807 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49192 "parsing/parser.ml" +||||||| 04da777f7 +# 49187 "parsing/parser.ml" +======= +# 49201 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3586 "parsing/parser.mly" +||||||| 04da777f7 +# 3584 "parsing/parser.mly" +======= +# 3575 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48813 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49198 "parsing/parser.ml" +||||||| 04da777f7 +# 49193 "parsing/parser.ml" +======= +# 49207 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4692 "parsing/parser.mly" - ( "type" ) -# 60441 "parsing/parser.ml" + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 48863 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 48869 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49248 "parsing/parser.ml" +||||||| 04da777f7 +# 49243 "parsing/parser.ml" +======= +# 49257 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 49254 "parsing/parser.ml" +||||||| 04da777f7 +# 49249 "parsing/parser.ml" +======= +# 49263 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3588 "parsing/parser.mly" +||||||| 04da777f7 +# 3586 "parsing/parser.mly" +======= +# 3577 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_attrs ~loc:_sloc (Ppat_lazy _3) _2) +<<<<<<< HEAD +# 48878 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49263 "parsing/parser.ml" +||||||| 04da777f7 +# 49258 "parsing/parser.ml" +======= +# 49272 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60449,20 +86344,146 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3498 "parsing/parser.mly" +||||||| 04da777f7 +# 3496 "parsing/parser.mly" +======= +# 3486 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) +<<<<<<< HEAD +# 48922 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49307 "parsing/parser.ml" +||||||| 04da777f7 +# 49302 "parsing/parser.ml" +======= +# 49316 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3493 "parsing/parser.mly" +||||||| 04da777f7 +# 3491 "parsing/parser.mly" +======= +# 3481 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48928 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49313 "parsing/parser.ml" +||||||| 04da777f7 +# 49308 "parsing/parser.ml" +======= +# 49322 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : (Parsetree.attribute) = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4693 "parsing/parser.mly" - ( "val" ) -# 60466 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = let _1 = +<<<<<<< HEAD +# 3500 "parsing/parser.mly" +||||||| 04da777f7 +# 3498 "parsing/parser.mly" +======= +# 3488 "parsing/parser.mly" +>>>>>>> origin/main + ( Pat.attr _1 _2 ) +<<<<<<< HEAD +# 48960 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49345 "parsing/parser.ml" +||||||| 04da777f7 +# 49340 "parsing/parser.ml" +======= +# 49354 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3493 "parsing/parser.mly" +||||||| 04da777f7 +# 3491 "parsing/parser.mly" +======= +# 3481 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 48965 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49350 "parsing/parser.ml" +||||||| 04da777f7 +# 49345 "parsing/parser.ml" +======= +# 49359 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60480,14 +86501,95323 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4694 "parsing/parser.mly" - ( "virtual" ) -# 60491 "parsing/parser.ml" + let _v : (Parsetree.pattern) = let _1 = +<<<<<<< HEAD +# 3502 "parsing/parser.mly" +||||||| 04da777f7 +# 3500 "parsing/parser.mly" + ( _1 ) +# 49370 "parsing/parser.ml" + in + +# 3491 "parsing/parser.mly" +======= +# 3490 "parsing/parser.mly" + ( _1 ) +# 48990 "parsing/parser.ml" + in + +# 3481 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +# 48995 "parsing/parser.ml" + in + +# 3493 "parsing/parser.mly" + ( _1 ) +# 49380 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 49042 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49427 "parsing/parser.ml" +||||||| 04da777f7 +# 49422 "parsing/parser.ml" +======= +# 49436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3505 "parsing/parser.mly" +||||||| 04da777f7 +# 3503 "parsing/parser.mly" +======= +# 3493 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_alias(_1, _3) ) +<<<<<<< HEAD +# 49048 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49433 "parsing/parser.ml" +||||||| 04da777f7 +# 49428 "parsing/parser.ml" +======= +# 49442 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 49058 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49443 "parsing/parser.ml" +||||||| 04da777f7 +# 49438 "parsing/parser.ml" +======= +# 49452 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3514 "parsing/parser.mly" +||||||| 04da777f7 +# 3512 "parsing/parser.mly" +======= +# 3502 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49064 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49449 "parsing/parser.ml" +||||||| 04da777f7 +# 49444 "parsing/parser.ml" +======= +# 49458 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3493 "parsing/parser.mly" +||||||| 04da777f7 +# 3491 "parsing/parser.mly" +======= +# 3481 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49455 "parsing/parser.ml" +||||||| 04da777f7 +# 49450 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3505 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 49493 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 49503 "parsing/parser.ml" + + in + +# 3512 "parsing/parser.mly" + ( _1 ) +# 49509 "parsing/parser.ml" + + in + +# 3491 "parsing/parser.mly" + ( _1 ) +# 49515 "parsing/parser.ml" +======= +# 49464 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3495 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 49113 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 49123 "parsing/parser.ml" + + in + +# 3502 "parsing/parser.mly" + ( _1 ) +# 49129 "parsing/parser.ml" + + in + +# 3481 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 49135 "parsing/parser.ml" +======= +# 49529 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3507 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 49498 "parsing/parser.ml" +||||||| 04da777f7 +# 3507 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 49558 "parsing/parser.ml" +======= +# 3497 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +<<<<<<< HEAD +# 49178 "parsing/parser.ml" +======= +# 49572 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 49188 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49508 "parsing/parser.ml" +||||||| 04da777f7 +# 49568 "parsing/parser.ml" +======= +# 49582 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3514 "parsing/parser.mly" +||||||| 04da777f7 +# 3512 "parsing/parser.mly" +======= +# 3502 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49194 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49514 "parsing/parser.ml" +||||||| 04da777f7 +# 49574 "parsing/parser.ml" +======= +# 49588 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3493 "parsing/parser.mly" +||||||| 04da777f7 +# 3491 "parsing/parser.mly" +======= +# 3481 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49200 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49520 "parsing/parser.ml" +||||||| 04da777f7 +# 49580 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +# 3509 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 49621 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 49630 "parsing/parser.ml" + + in + +# 3512 "parsing/parser.mly" + ( _1 ) +# 49636 "parsing/parser.ml" + + in + +# 3491 "parsing/parser.mly" + ( _1 ) +# 49642 "parsing/parser.ml" +======= +# 49594 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +# 3499 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 49241 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 49250 "parsing/parser.ml" + + in + +# 3502 "parsing/parser.mly" + ( _1 ) +# 49256 "parsing/parser.ml" + + in + +# 3481 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 49262 "parsing/parser.ml" +======= +# 49656 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3509 "parsing/parser.mly" +||||||| 04da777f7 +# 3511 "parsing/parser.mly" +======= +# 3501 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__3_ "pattern" ) +<<<<<<< HEAD +# 49305 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49563 "parsing/parser.ml" +||||||| 04da777f7 +# 49685 "parsing/parser.ml" +======= +# 49699 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 49315 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49573 "parsing/parser.ml" +||||||| 04da777f7 +# 49695 "parsing/parser.ml" +======= +# 49709 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3514 "parsing/parser.mly" +||||||| 04da777f7 +# 3512 "parsing/parser.mly" +======= +# 3502 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49321 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49579 "parsing/parser.ml" +||||||| 04da777f7 +# 49701 "parsing/parser.ml" +======= +# 49715 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3493 "parsing/parser.mly" +||||||| 04da777f7 +# 3491 "parsing/parser.mly" +======= +# 3481 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49327 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49585 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +# 3511 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 49626 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 49635 "parsing/parser.ml" + + in + +# 3514 "parsing/parser.mly" + ( _1 ) +# 49641 "parsing/parser.ml" + + in + +# 3493 "parsing/parser.mly" + ( _1 ) +# 49647 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3513 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 49690 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 49700 "parsing/parser.ml" + + in + +# 3514 "parsing/parser.mly" + ( _1 ) +# 49706 "parsing/parser.ml" + + in + +# 3493 "parsing/parser.mly" + ( _1 ) +# 49712 "parsing/parser.ml" +||||||| 04da777f7 +# 49707 "parsing/parser.ml" +======= +# 49721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3516 "parsing/parser.mly" +||||||| 04da777f7 +# 3514 "parsing/parser.mly" +======= +# 3504 "parsing/parser.mly" +>>>>>>> origin/main + ( let closed, pats = _1 in + ppat_ltuple _sloc (List.rev pats) closed + ) +<<<<<<< HEAD +# 49358 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49743 "parsing/parser.ml" +||||||| 04da777f7 +# 49738 "parsing/parser.ml" +======= +# 49752 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3493 "parsing/parser.mly" +||||||| 04da777f7 +# 3491 "parsing/parser.mly" +======= +# 3481 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49364 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49749 "parsing/parser.ml" +||||||| 04da777f7 +# 49744 "parsing/parser.ml" +======= +# 49758 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 49385 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49770 "parsing/parser.ml" +||||||| 04da777f7 +# 49765 "parsing/parser.ml" +======= +# 49779 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 49399 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49784 "parsing/parser.ml" +||||||| 04da777f7 +# 49779 "parsing/parser.ml" +======= +# 49793 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2651 "parsing/parser.mly" +||||||| 04da777f7 +# 2649 "parsing/parser.mly" +======= +# 2639 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_var _1 ) +<<<<<<< HEAD +# 49405 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49790 "parsing/parser.ml" +||||||| 04da777f7 +# 49785 "parsing/parser.ml" +======= +# 49799 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 49414 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49799 "parsing/parser.ml" +||||||| 04da777f7 +# 49794 "parsing/parser.ml" +======= +# 49808 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2653 "parsing/parser.mly" +||||||| 04da777f7 +# 2651 "parsing/parser.mly" +======= +# 2641 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49420 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49805 "parsing/parser.ml" +||||||| 04da777f7 +# 49800 "parsing/parser.ml" +======= +# 49814 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = +<<<<<<< HEAD +# 2652 "parsing/parser.mly" +||||||| 04da777f7 +# 2650 "parsing/parser.mly" +======= +# 2640 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_any ) +<<<<<<< HEAD +# 49446 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49831 "parsing/parser.ml" +||||||| 04da777f7 +# 49826 "parsing/parser.ml" +======= +# 49840 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 49454 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49839 "parsing/parser.ml" +||||||| 04da777f7 +# 49834 "parsing/parser.ml" +======= +# 49848 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2653 "parsing/parser.mly" +||||||| 04da777f7 +# 2651 "parsing/parser.mly" +======= +# 2641 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 49460 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 49845 "parsing/parser.ml" +||||||| 04da777f7 +# 49840 "parsing/parser.ml" +======= +# 49854 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.structure) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.payload) = +<<<<<<< HEAD +# 5035 "parsing/parser.mly" + ( PStr _1 ) +# 49485 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5039 "parsing/parser.mly" +||||||| 04da777f7 +# 5032 "parsing/parser.mly" +======= +# 5023 "parsing/parser.mly" +>>>>>>> origin/main + ( PStr _1 ) +<<<<<<< HEAD +# 49870 "parsing/parser.ml" +||||||| 04da777f7 +# 49865 "parsing/parser.ml" +======= +# 49879 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.signature) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.payload) = +<<<<<<< HEAD +# 5036 "parsing/parser.mly" + ( PSig _2 ) +# 49517 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5040 "parsing/parser.mly" +||||||| 04da777f7 +# 5033 "parsing/parser.mly" +======= +# 5024 "parsing/parser.mly" +>>>>>>> origin/main + ( PSig _2 ) +<<<<<<< HEAD +# 49902 "parsing/parser.ml" +||||||| 04da777f7 +# 49897 "parsing/parser.ml" +======= +# 49911 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.core_type) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.payload) = +<<<<<<< HEAD +# 5037 "parsing/parser.mly" + ( PTyp _2 ) +# 49549 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5041 "parsing/parser.mly" +||||||| 04da777f7 +# 5034 "parsing/parser.mly" +======= +# 5025 "parsing/parser.mly" +>>>>>>> origin/main + ( PTyp _2 ) +<<<<<<< HEAD +# 49934 "parsing/parser.ml" +||||||| 04da777f7 +# 49929 "parsing/parser.ml" +======= +# 49943 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.payload) = +<<<<<<< HEAD +# 5038 "parsing/parser.mly" + ( PPat (_2, None) ) +# 49581 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5042 "parsing/parser.mly" +||||||| 04da777f7 +# 5035 "parsing/parser.mly" +======= +# 5026 "parsing/parser.mly" +>>>>>>> origin/main + ( PPat (_2, None) ) +<<<<<<< HEAD +# 49966 "parsing/parser.ml" +||||||| 04da777f7 +# 49961 "parsing/parser.ml" +======= +# 49975 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.payload) = +<<<<<<< HEAD +# 5039 "parsing/parser.mly" + ( PPat (_2, Some _4) ) +# 49627 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5043 "parsing/parser.mly" +||||||| 04da777f7 +# 5036 "parsing/parser.mly" +======= +# 5027 "parsing/parser.mly" +>>>>>>> origin/main + ( PPat (_2, Some _4) ) +<<<<<<< HEAD +# 50012 "parsing/parser.ml" +||||||| 04da777f7 +# 50007 "parsing/parser.ml" +======= +# 50021 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type) = +<<<<<<< HEAD +# 4193 "parsing/parser.mly" + ( _1 ) +# 49652 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4212 "parsing/parser.mly" +||||||| 04da777f7 +# 4205 "parsing/parser.mly" +======= +# 4196 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50037 "parsing/parser.ml" +||||||| 04da777f7 +# 50032 "parsing/parser.ml" +======= +# 50046 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.core_type) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 49694 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50079 "parsing/parser.ml" +||||||| 04da777f7 +# 50074 "parsing/parser.ml" +======= +# 50088 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 49699 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 49705 "parsing/parser.ml" + + in + +# 4189 "parsing/parser.mly" + ( (_1, _3) ) +# 49711 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50084 "parsing/parser.ml" +||||||| 04da777f7 +# 50079 "parsing/parser.ml" +======= +# 50093 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50090 "parsing/parser.ml" +||||||| 04da777f7 +# 50085 "parsing/parser.ml" +======= +# 50099 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4208 "parsing/parser.mly" +||||||| 04da777f7 +# 4201 "parsing/parser.mly" +======= +# 4192 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _3) ) +<<<<<<< HEAD +# 50096 "parsing/parser.ml" +||||||| 04da777f7 +# 50091 "parsing/parser.ml" +======= +# 50105 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4195 "parsing/parser.mly" + ( let bound_vars, inner_type = _1 in + Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) + (Ltyp_poly { bound_vars; inner_type }) ) +# 49723 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4214 "parsing/parser.mly" +||||||| 04da777f7 +# 4207 "parsing/parser.mly" +======= +# 4198 "parsing/parser.mly" +>>>>>>> origin/main + ( let bound_vars, inner_type = _1 in + Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) + (Ltyp_poly { bound_vars; inner_type }) ) +<<<<<<< HEAD +# 50108 "parsing/parser.ml" +||||||| 04da777f7 +# 50103 "parsing/parser.ml" +======= +# 50117 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type) = let _1 = +<<<<<<< HEAD +# 4226 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4245 "parsing/parser.mly" +||||||| 04da777f7 +# 4238 "parsing/parser.mly" + ( _1 ) +# 50128 "parsing/parser.ml" + in + +# 4205 "parsing/parser.mly" +======= +# 4229 "parsing/parser.mly" +>>>>>>> upstream/main + ( _1 ) +# 49748 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 4193 "parsing/parser.mly" +======= +# 4196 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( _1 ) +# 49753 "parsing/parser.ml" + in + +# 4212 "parsing/parser.mly" + ( _1 ) +# 50138 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type) = let _1 = + let _3 = +<<<<<<< HEAD +# 4226 "parsing/parser.mly" + ( _1 ) +# 49793 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4245 "parsing/parser.mly" +||||||| 04da777f7 +# 4238 "parsing/parser.mly" +======= +# 4229 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50178 "parsing/parser.ml" +||||||| 04da777f7 +# 50173 "parsing/parser.ml" +======= +# 50187 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _1 = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 49800 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50185 "parsing/parser.ml" +||||||| 04da777f7 +# 50180 "parsing/parser.ml" +======= +# 50194 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 49805 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 49811 "parsing/parser.ml" + + in + +# 4189 "parsing/parser.mly" + ( (_1, _3) ) +# 49817 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50190 "parsing/parser.ml" +||||||| 04da777f7 +# 50185 "parsing/parser.ml" +======= +# 50199 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50196 "parsing/parser.ml" +||||||| 04da777f7 +# 50191 "parsing/parser.ml" +======= +# 50205 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4208 "parsing/parser.mly" +||||||| 04da777f7 +# 4201 "parsing/parser.mly" +======= +# 4192 "parsing/parser.mly" +>>>>>>> origin/main + ( (_1, _3) ) +<<<<<<< HEAD +# 50202 "parsing/parser.ml" +||||||| 04da777f7 +# 50197 "parsing/parser.ml" +======= +# 50211 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__1_ = _startpos_xs_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4195 "parsing/parser.mly" + ( let bound_vars, inner_type = _1 in + Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) + (Ltyp_poly { bound_vars; inner_type }) ) +# 49829 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4214 "parsing/parser.mly" +||||||| 04da777f7 +# 4207 "parsing/parser.mly" +======= +# 4198 "parsing/parser.mly" +>>>>>>> origin/main + ( let bound_vars, inner_type = _1 in + Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) + (Ltyp_poly { bound_vars; inner_type }) ) +<<<<<<< HEAD +# 50214 "parsing/parser.ml" +||||||| 04da777f7 +# 50209 "parsing/parser.ml" +======= +# 50223 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.payload) = Obj.magic _3 in + let _2 : (Ast_helper.str) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.attribute) = let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4996 "parsing/parser.mly" + ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) +# 49878 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5000 "parsing/parser.mly" +||||||| 04da777f7 +# 4993 "parsing/parser.mly" +======= +# 4984 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) +<<<<<<< HEAD +# 50263 "parsing/parser.ml" +||||||| 04da777f7 +# 50258 "parsing/parser.ml" +======= +# 50272 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = prim; + MenhirLib.EngineTypes.startp = _startpos_prim_; + MenhirLib.EngineTypes.endp = _endpos_prim_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let prim : (string list) = Obj.magic prim in + let _7 : unit = Obj.magic _7 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 49961 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50346 "parsing/parser.ml" +||||||| 04da777f7 +# 50341 "parsing/parser.ml" +======= +# 50355 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 49973 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50358 "parsing/parser.ml" +||||||| 04da777f7 +# 50353 "parsing/parser.ml" +======= +# 50367 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 49981 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50366 "parsing/parser.ml" +||||||| 04da777f7 +# 50361 "parsing/parser.ml" +======= +# 50375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3742 "parsing/parser.mly" +||||||| 04da777f7 +# 3740 "parsing/parser.mly" +======= +# 3731 "parsing/parser.mly" +>>>>>>> origin/main + ( let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Val.mk id ty ~prim ~attrs ~loc ~docs, + ext ) +<<<<<<< HEAD +# 49994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50379 "parsing/parser.ml" +||||||| 04da777f7 +# 50374 "parsing/parser.ml" +======= +# 50388 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.private_flag) = let _1 = +<<<<<<< HEAD +# 4851 "parsing/parser.mly" + ( Public ) +# 50012 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4855 "parsing/parser.mly" +||||||| 04da777f7 +# 4848 "parsing/parser.mly" +======= +# 4839 "parsing/parser.mly" +>>>>>>> origin/main + ( Public ) +<<<<<<< HEAD +# 50397 "parsing/parser.ml" +||||||| 04da777f7 +# 50392 "parsing/parser.ml" + in + +# 4845 "parsing/parser.mly" + ( _1 ) +# 50397 "parsing/parser.ml" +======= +# 50406 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 4848 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 50017 "parsing/parser.ml" +======= +# 50411 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 4852 "parsing/parser.mly" + ( _1 ) +# 50402 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.private_flag) = let _1 = +<<<<<<< HEAD +# 4852 "parsing/parser.mly" + ( Private ) +# 50042 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4856 "parsing/parser.mly" +||||||| 04da777f7 +# 4849 "parsing/parser.mly" +======= +# 4840 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 50427 "parsing/parser.ml" +||||||| 04da777f7 +# 50422 "parsing/parser.ml" + in + +# 4845 "parsing/parser.mly" + ( _1 ) +# 50427 "parsing/parser.ml" +======= +# 50436 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 4848 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 50047 "parsing/parser.ml" +======= +# 50441 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 4852 "parsing/parser.mly" + ( _1 ) +# 50432 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4886 "parsing/parser.mly" + ( Public, Concrete ) +# 50065 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4890 "parsing/parser.mly" +||||||| 04da777f7 +# 4883 "parsing/parser.mly" +======= +# 4874 "parsing/parser.mly" +>>>>>>> origin/main + ( Public, Concrete ) +<<<<<<< HEAD +# 50450 "parsing/parser.ml" +||||||| 04da777f7 +# 50445 "parsing/parser.ml" +======= +# 50459 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4887 "parsing/parser.mly" + ( Private, Concrete ) +# 50090 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4891 "parsing/parser.mly" +||||||| 04da777f7 +# 4884 "parsing/parser.mly" +======= +# 4875 "parsing/parser.mly" +>>>>>>> origin/main + ( Private, Concrete ) +<<<<<<< HEAD +# 50475 "parsing/parser.ml" +||||||| 04da777f7 +# 50470 "parsing/parser.ml" +======= +# 50484 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4888 "parsing/parser.mly" + ( Public, Virtual ) +# 50115 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4892 "parsing/parser.mly" +||||||| 04da777f7 +# 4885 "parsing/parser.mly" +======= +# 4876 "parsing/parser.mly" +>>>>>>> origin/main + ( Public, Virtual ) +<<<<<<< HEAD +# 50500 "parsing/parser.ml" +||||||| 04da777f7 +# 50495 "parsing/parser.ml" +======= +# 50509 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4889 "parsing/parser.mly" + ( Private, Virtual ) +# 50147 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4893 "parsing/parser.mly" +||||||| 04da777f7 +# 4886 "parsing/parser.mly" +======= +# 4877 "parsing/parser.mly" +>>>>>>> origin/main + ( Private, Virtual ) +<<<<<<< HEAD +# 50532 "parsing/parser.ml" +||||||| 04da777f7 +# 50527 "parsing/parser.ml" +======= +# 50541 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +<<<<<<< HEAD +# 4890 "parsing/parser.mly" + ( Private, Virtual ) +# 50179 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4894 "parsing/parser.mly" +||||||| 04da777f7 +# 4887 "parsing/parser.mly" +======= +# 4878 "parsing/parser.mly" +>>>>>>> origin/main + ( Private, Virtual ) +<<<<<<< HEAD +# 50564 "parsing/parser.ml" +||||||| 04da777f7 +# 50559 "parsing/parser.ml" +======= +# 50573 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.rec_flag) = +<<<<<<< HEAD +# 4829 "parsing/parser.mly" + ( Nonrecursive ) +# 50197 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4833 "parsing/parser.mly" +||||||| 04da777f7 +# 4826 "parsing/parser.mly" +======= +# 4817 "parsing/parser.mly" +>>>>>>> origin/main + ( Nonrecursive ) +<<<<<<< HEAD +# 50582 "parsing/parser.ml" +||||||| 04da777f7 +# 50577 "parsing/parser.ml" +======= +# 50591 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.rec_flag) = +<<<<<<< HEAD +# 4830 "parsing/parser.mly" + ( Recursive ) +# 50222 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4834 "parsing/parser.mly" +||||||| 04da777f7 +# 4827 "parsing/parser.mly" +======= +# 4818 "parsing/parser.mly" +>>>>>>> origin/main + ( Recursive ) +<<<<<<< HEAD +# 50607 "parsing/parser.ml" +||||||| 04da777f7 +# 50602 "parsing/parser.ml" +======= +# 50616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = fields; + MenhirLib.EngineTypes.startp = _startpos_fields_; + MenhirLib.EngineTypes.endp = _endpos_fields_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let fields : ((Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic fields in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_fields_ in + let _endpos = _endpos_fields_ in + let _v : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list) = let eo = +# 124 "" + ( None ) +<<<<<<< HEAD +# 50248 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50633 "parsing/parser.ml" +||||||| 04da777f7 +# 50628 "parsing/parser.ml" +======= +# 50642 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3394 "parsing/parser.mly" +||||||| 04da777f7 +# 3392 "parsing/parser.mly" +======= +# 3382 "parsing/parser.mly" +>>>>>>> origin/main + ( eo, fields ) +<<<<<<< HEAD +# 50253 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50638 "parsing/parser.ml" +||||||| 04da777f7 +# 50633 "parsing/parser.ml" +======= +# 50647 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = fields; + MenhirLib.EngineTypes.startp = _startpos_fields_; + MenhirLib.EngineTypes.endp = _endpos_fields_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let fields : ((Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic fields in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.expression) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_fields_ in + let _v : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list) = let eo = + let x = +# 191 "" + ( x ) +<<<<<<< HEAD +# 50294 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50679 "parsing/parser.ml" +||||||| 04da777f7 +# 50674 "parsing/parser.ml" +======= +# 50688 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 50299 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50684 "parsing/parser.ml" +||||||| 04da777f7 +# 50679 "parsing/parser.ml" +======= +# 50693 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3394 "parsing/parser.mly" +||||||| 04da777f7 +# 3392 "parsing/parser.mly" +======= +# 3382 "parsing/parser.mly" +>>>>>>> origin/main + ( eo, fields ) +<<<<<<< HEAD +# 50305 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50690 "parsing/parser.ml" +||||||| 04da777f7 +# 50685 "parsing/parser.ml" +======= +# 50699 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.constructor_declaration list) = let x = +<<<<<<< HEAD +# 3997 "parsing/parser.mly" +||||||| 04da777f7 +# 3990 "parsing/parser.mly" +======= +# 3981 "parsing/parser.mly" +>>>>>>> origin/main + ( + let cid, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Layouts.constructor_declaration_of + cid ~vars_jkinds ~args ~res ~attrs ~loc ~info + ) +<<<<<<< HEAD +# 50337 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50722 "parsing/parser.ml" +||||||| 04da777f7 +# 50717 "parsing/parser.ml" +======= +# 50731 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1430 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50342 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50727 "parsing/parser.ml" +||||||| 04da777f7 +# 50722 "parsing/parser.ml" +======= +# 50736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.constructor_declaration list) = let x = +<<<<<<< HEAD +# 3997 "parsing/parser.mly" +||||||| 04da777f7 +# 3990 "parsing/parser.mly" +======= +# 3981 "parsing/parser.mly" +>>>>>>> origin/main + ( + let cid, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Layouts.constructor_declaration_of + cid ~vars_jkinds ~args ~res ~attrs ~loc ~info + ) +<<<<<<< HEAD +# 50374 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50759 "parsing/parser.ml" +||||||| 04da777f7 +# 50754 "parsing/parser.ml" +======= +# 50768 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1433 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50379 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50764 "parsing/parser.ml" +||||||| 04da777f7 +# 50759 "parsing/parser.ml" +======= +# 50773 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let xs : (Parsetree.constructor_declaration list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.constructor_declaration list) = let x = +<<<<<<< HEAD +# 3997 "parsing/parser.mly" +||||||| 04da777f7 +# 3990 "parsing/parser.mly" +======= +# 3981 "parsing/parser.mly" +>>>>>>> origin/main + ( + let cid, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Layouts.constructor_declaration_of + cid ~vars_jkinds ~args ~res ~attrs ~loc ~info + ) +<<<<<<< HEAD +# 50418 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50803 "parsing/parser.ml" +||||||| 04da777f7 +# 50798 "parsing/parser.ml" + in + +# 1447 "parsing/parser.mly" + ( x :: xs ) +# 50803 "parsing/parser.ml" +======= +# 50812 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 1437 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 50423 "parsing/parser.ml" +======= +# 50817 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 1447 "parsing/parser.mly" + ( x :: xs ) +# 50808 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.extension_constructor list) = let x = + let _1 = +<<<<<<< HEAD +# 4118 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4137 "parsing/parser.mly" +||||||| 04da777f7 +# 4130 "parsing/parser.mly" +======= +# 4121 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let name, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Extension_constructor.extension_constructor_of + ~loc ~attrs ~info ~name + (Jext_layout (Lext_decl(vars_jkinds, args, res))) + ) +<<<<<<< HEAD +# 50457 "parsing/parser.ml" + in + +# 4112 "parsing/parser.mly" + ( _1 ) +# 50462 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50842 "parsing/parser.ml" +||||||| 04da777f7 +# 50837 "parsing/parser.ml" +======= +# 50851 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4131 "parsing/parser.mly" +||||||| 04da777f7 +# 4124 "parsing/parser.mly" +======= +# 4115 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50847 "parsing/parser.ml" +||||||| 04da777f7 +# 50842 "parsing/parser.ml" +======= +# 50856 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1430 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50468 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50853 "parsing/parser.ml" +||||||| 04da777f7 +# 50848 "parsing/parser.ml" +======= +# 50862 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.extension_constructor list) = let x = +<<<<<<< HEAD +# 4114 "parsing/parser.mly" + ( _1 ) +# 50493 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4133 "parsing/parser.mly" +||||||| 04da777f7 +# 4126 "parsing/parser.mly" +======= +# 4117 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50878 "parsing/parser.ml" +||||||| 04da777f7 +# 50873 "parsing/parser.ml" + in + +# 1440 "parsing/parser.mly" + ( [x] ) +# 50878 "parsing/parser.ml" +======= +# 50887 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 1430 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50498 "parsing/parser.ml" +======= +# 50892 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 1440 "parsing/parser.mly" + ( [x] ) +# 50883 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.extension_constructor list) = let x = + let _1 = +<<<<<<< HEAD +# 4118 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4137 "parsing/parser.mly" +||||||| 04da777f7 +# 4130 "parsing/parser.mly" +======= +# 4121 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let name, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Extension_constructor.extension_constructor_of + ~loc ~attrs ~info ~name + (Jext_layout (Lext_decl(vars_jkinds, args, res))) + ) +<<<<<<< HEAD +# 50532 "parsing/parser.ml" + in + +# 4112 "parsing/parser.mly" + ( _1 ) +# 50537 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50917 "parsing/parser.ml" +||||||| 04da777f7 +# 50912 "parsing/parser.ml" +======= +# 50926 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4131 "parsing/parser.mly" +||||||| 04da777f7 +# 4124 "parsing/parser.mly" +======= +# 4115 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50922 "parsing/parser.ml" +||||||| 04da777f7 +# 50917 "parsing/parser.ml" +======= +# 50931 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1433 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50543 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50928 "parsing/parser.ml" +||||||| 04da777f7 +# 50923 "parsing/parser.ml" +======= +# 50937 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.extension_constructor list) = let x = +<<<<<<< HEAD +# 4114 "parsing/parser.mly" + ( _1 ) +# 50568 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4133 "parsing/parser.mly" +||||||| 04da777f7 +# 4126 "parsing/parser.mly" +======= +# 4117 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50953 "parsing/parser.ml" +||||||| 04da777f7 +# 50948 "parsing/parser.ml" +======= +# 50962 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1433 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50573 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50958 "parsing/parser.ml" +||||||| 04da777f7 +# 50953 "parsing/parser.ml" +======= +# 50967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.extension_constructor list) = let x = + let _1 = +<<<<<<< HEAD +# 4118 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4137 "parsing/parser.mly" +||||||| 04da777f7 +# 4130 "parsing/parser.mly" +======= +# 4121 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let name, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Extension_constructor.extension_constructor_of + ~loc ~attrs ~info ~name + (Jext_layout (Lext_decl(vars_jkinds, args, res))) + ) +<<<<<<< HEAD +# 50614 "parsing/parser.ml" + in + +# 4112 "parsing/parser.mly" + ( _1 ) +# 50619 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 50999 "parsing/parser.ml" +||||||| 04da777f7 +# 50994 "parsing/parser.ml" +======= +# 51008 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4131 "parsing/parser.mly" +||||||| 04da777f7 +# 4124 "parsing/parser.mly" +======= +# 4115 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51004 "parsing/parser.ml" +||||||| 04da777f7 +# 50999 "parsing/parser.ml" +======= +# 51013 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1437 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 50625 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51010 "parsing/parser.ml" +||||||| 04da777f7 +# 51005 "parsing/parser.ml" +======= +# 51019 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.extension_constructor list) = let x = +<<<<<<< HEAD +# 4114 "parsing/parser.mly" + ( _1 ) +# 50657 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4133 "parsing/parser.mly" +||||||| 04da777f7 +# 4126 "parsing/parser.mly" +======= +# 4117 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51042 "parsing/parser.ml" +||||||| 04da777f7 +# 51037 "parsing/parser.ml" +======= +# 51051 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1437 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 50662 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51047 "parsing/parser.ml" +||||||| 04da777f7 +# 51042 "parsing/parser.ml" +======= +# 51056 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.extension_constructor list) = let x = +<<<<<<< HEAD +# 4118 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4137 "parsing/parser.mly" +||||||| 04da777f7 +# 4130 "parsing/parser.mly" +======= +# 4121 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let name, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Extension_constructor.extension_constructor_of + ~loc ~attrs ~info ~name + (Jext_layout (Lext_decl(vars_jkinds, args, res))) + ) +<<<<<<< HEAD +# 50695 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51080 "parsing/parser.ml" +||||||| 04da777f7 +# 51075 "parsing/parser.ml" +======= +# 51089 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1430 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50700 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51085 "parsing/parser.ml" +||||||| 04da777f7 +# 51080 "parsing/parser.ml" +======= +# 51094 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.extension_constructor list) = let x = +<<<<<<< HEAD +# 4118 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4137 "parsing/parser.mly" +||||||| 04da777f7 +# 4130 "parsing/parser.mly" +======= +# 4121 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let name, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Extension_constructor.extension_constructor_of + ~loc ~attrs ~info ~name + (Jext_layout (Lext_decl(vars_jkinds, args, res))) + ) +<<<<<<< HEAD +# 50733 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51118 "parsing/parser.ml" +||||||| 04da777f7 +# 51113 "parsing/parser.ml" +======= +# 51127 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1433 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 50738 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51123 "parsing/parser.ml" +||||||| 04da777f7 +# 51118 "parsing/parser.ml" +======= +# 51132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let d : (Ast_helper.str * + (Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option * + Parsetree.attributes * Location.t * Docstrings.info) = Obj.magic d in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_d_ in + let _v : (Parsetree.extension_constructor list) = let x = +<<<<<<< HEAD +# 4118 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4137 "parsing/parser.mly" +||||||| 04da777f7 +# 4130 "parsing/parser.mly" +======= +# 4121 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let name, vars_jkinds, args, res, attrs, loc, info = d in + Jane_syntax.Extension_constructor.extension_constructor_of + ~loc ~attrs ~info ~name + (Jext_layout (Lext_decl(vars_jkinds, args, res))) + ) +<<<<<<< HEAD +# 50778 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51163 "parsing/parser.ml" +||||||| 04da777f7 +# 51158 "parsing/parser.ml" +======= +# 51172 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1437 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 50783 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51168 "parsing/parser.ml" +||||||| 04da777f7 +# 51163 "parsing/parser.ml" +======= +# 51177 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in + let _v : ((string option * Parsetree.expression) list) = let x = + let _1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50824 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51209 "parsing/parser.ml" +||||||| 04da777f7 +# 51204 "parsing/parser.ml" +======= +# 51218 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50829 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51214 "parsing/parser.ml" +||||||| 04da777f7 +# 51209 "parsing/parser.ml" +======= +# 51223 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 50835 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51220 "parsing/parser.ml" +||||||| 04da777f7 +# 51215 "parsing/parser.ml" +======= +# 51229 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3362 "parsing/parser.mly" +||||||| 04da777f7 +# 3360 "parsing/parser.mly" +======= +# 3350 "parsing/parser.mly" +>>>>>>> origin/main + ( x :: xs ) +<<<<<<< HEAD +# 50841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51226 "parsing/parser.ml" +||||||| 04da777f7 +# 51221 "parsing/parser.ml" +======= +# 51235 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_xs_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x = + let (_endpos_xs_, xs) = (_endpos_xs_inlined1_, xs_inlined1) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 50907 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51292 "parsing/parser.ml" +||||||| 04da777f7 +# 51287 "parsing/parser.ml" +======= +# 51301 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 50912 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51297 "parsing/parser.ml" +||||||| 04da777f7 +# 51292 "parsing/parser.ml" +======= +# 51306 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 50918 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51303 "parsing/parser.ml" +||||||| 04da777f7 +# 51298 "parsing/parser.ml" +======= +# 51312 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 50929 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 50935 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51314 "parsing/parser.ml" +||||||| 04da777f7 +# 51309 "parsing/parser.ml" +======= +# 51323 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 51320 "parsing/parser.ml" +||||||| 04da777f7 +# 51315 "parsing/parser.ml" +======= +# 51329 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 50948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51333 "parsing/parser.ml" +||||||| 04da777f7 +# 51328 "parsing/parser.ml" +======= +# 51342 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 50954 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51339 "parsing/parser.ml" +||||||| 04da777f7 +# 51334 "parsing/parser.ml" +======= +# 51348 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 50960 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51345 "parsing/parser.ml" +||||||| 04da777f7 +# 51340 "parsing/parser.ml" +======= +# 51354 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3362 "parsing/parser.mly" +||||||| 04da777f7 +# 3360 "parsing/parser.mly" +======= +# 3350 "parsing/parser.mly" +>>>>>>> origin/main + ( x :: xs ) +<<<<<<< HEAD +# 50966 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51351 "parsing/parser.ml" +||||||| 04da777f7 +# 51346 "parsing/parser.ml" +======= +# 51360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 51006 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51391 "parsing/parser.ml" +||||||| 04da777f7 +# 51386 "parsing/parser.ml" +======= +# 51400 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3348 "parsing/parser.mly" +||||||| 04da777f7 +# 3346 "parsing/parser.mly" +======= +# 3336 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 51018 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51403 "parsing/parser.ml" +||||||| 04da777f7 +# 51398 "parsing/parser.ml" +======= +# 51412 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3362 "parsing/parser.mly" +||||||| 04da777f7 +# 3360 "parsing/parser.mly" +======= +# 3350 "parsing/parser.mly" +>>>>>>> origin/main + ( x :: xs ) +<<<<<<< HEAD +# 51024 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51409 "parsing/parser.ml" +||||||| 04da777f7 +# 51404 "parsing/parser.ml" +======= +# 51418 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 51063 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51448 "parsing/parser.ml" +||||||| 04da777f7 +# 51443 "parsing/parser.ml" +======= +# 51457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.expression) list) = let x = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3350 "parsing/parser.mly" +||||||| 04da777f7 +# 3348 "parsing/parser.mly" +======= +# 3338 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +<<<<<<< HEAD +# 51077 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51462 "parsing/parser.ml" +||||||| 04da777f7 +# 51457 "parsing/parser.ml" +======= +# 51471 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3362 "parsing/parser.mly" +||||||| 04da777f7 +# 3360 "parsing/parser.mly" +======= +# 3350 "parsing/parser.mly" +>>>>>>> origin/main + ( x :: xs ) +<<<<<<< HEAD +# 51083 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51468 "parsing/parser.ml" +||||||| 04da777f7 +# 51463 "parsing/parser.ml" +======= +# 51477 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 51142 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51527 "parsing/parser.ml" +||||||| 04da777f7 +# 51522 "parsing/parser.ml" +======= +# 51536 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__5_ in + let _v : ((string option * Parsetree.expression) list) = let x = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3353 "parsing/parser.mly" +||||||| 04da777f7 +# 3351 "parsing/parser.mly" +======= +# 3341 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) c ) +<<<<<<< HEAD +# 51160 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51545 "parsing/parser.ml" +||||||| 04da777f7 +# 51540 "parsing/parser.ml" +======= +# 51554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3362 "parsing/parser.mly" +||||||| 04da777f7 +# 3360 "parsing/parser.mly" +======= +# 3350 "parsing/parser.mly" +>>>>>>> origin/main + ( x :: xs ) +<<<<<<< HEAD +# 51166 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51551 "parsing/parser.ml" +||||||| 04da777f7 +# 51546 "parsing/parser.ml" +======= +# 51560 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _1 = _1_inlined1 in + let _1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51208 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51593 "parsing/parser.ml" +||||||| 04da777f7 +# 51588 "parsing/parser.ml" +======= +# 51602 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51213 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51598 "parsing/parser.ml" +||||||| 04da777f7 +# 51593 "parsing/parser.ml" +======= +# 51607 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 51219 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51604 "parsing/parser.ml" +||||||| 04da777f7 +# 51599 "parsing/parser.ml" +======= +# 51613 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51226 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51611 "parsing/parser.ml" +||||||| 04da777f7 +# 51606 "parsing/parser.ml" +======= +# 51620 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51231 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51616 "parsing/parser.ml" +||||||| 04da777f7 +# 51611 "parsing/parser.ml" +======= +# 51625 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 51237 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51622 "parsing/parser.ml" +||||||| 04da777f7 +# 51617 "parsing/parser.ml" +======= +# 51631 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 51303 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51688 "parsing/parser.ml" +||||||| 04da777f7 +# 51683 "parsing/parser.ml" +======= +# 51697 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 51308 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51693 "parsing/parser.ml" +||||||| 04da777f7 +# 51688 "parsing/parser.ml" +======= +# 51702 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 51314 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51699 "parsing/parser.ml" +||||||| 04da777f7 +# 51694 "parsing/parser.ml" +======= +# 51708 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 51325 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 51331 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51710 "parsing/parser.ml" +||||||| 04da777f7 +# 51705 "parsing/parser.ml" +======= +# 51719 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 51716 "parsing/parser.ml" +||||||| 04da777f7 +# 51711 "parsing/parser.ml" +======= +# 51725 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 51344 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51729 "parsing/parser.ml" +||||||| 04da777f7 +# 51724 "parsing/parser.ml" +======= +# 51738 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51350 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51735 "parsing/parser.ml" +||||||| 04da777f7 +# 51730 "parsing/parser.ml" +======= +# 51744 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 51356 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51741 "parsing/parser.ml" +||||||| 04da777f7 +# 51736 "parsing/parser.ml" +======= +# 51750 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51363 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51748 "parsing/parser.ml" +||||||| 04da777f7 +# 51743 "parsing/parser.ml" +======= +# 51757 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51368 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51753 "parsing/parser.ml" +||||||| 04da777f7 +# 51748 "parsing/parser.ml" +======= +# 51762 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 51374 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51759 "parsing/parser.ml" +||||||| 04da777f7 +# 51754 "parsing/parser.ml" +======= +# 51768 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 51414 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51799 "parsing/parser.ml" +||||||| 04da777f7 +# 51794 "parsing/parser.ml" +======= +# 51808 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3348 "parsing/parser.mly" +||||||| 04da777f7 +# 3346 "parsing/parser.mly" +======= +# 3336 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 51426 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51811 "parsing/parser.ml" +||||||| 04da777f7 +# 51806 "parsing/parser.ml" +======= +# 51820 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51433 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51818 "parsing/parser.ml" +||||||| 04da777f7 +# 51813 "parsing/parser.ml" +======= +# 51827 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51438 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51823 "parsing/parser.ml" +||||||| 04da777f7 +# 51818 "parsing/parser.ml" +======= +# 51832 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 51444 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51829 "parsing/parser.ml" +||||||| 04da777f7 +# 51824 "parsing/parser.ml" +======= +# 51838 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 51483 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51868 "parsing/parser.ml" +||||||| 04da777f7 +# 51863 "parsing/parser.ml" +======= +# 51877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3350 "parsing/parser.mly" +||||||| 04da777f7 +# 3348 "parsing/parser.mly" +======= +# 3338 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +<<<<<<< HEAD +# 51497 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51882 "parsing/parser.ml" +||||||| 04da777f7 +# 51877 "parsing/parser.ml" +======= +# 51891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51504 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51889 "parsing/parser.ml" +||||||| 04da777f7 +# 51884 "parsing/parser.ml" +======= +# 51898 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51509 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51894 "parsing/parser.ml" +||||||| 04da777f7 +# 51889 "parsing/parser.ml" +======= +# 51903 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 51515 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51900 "parsing/parser.ml" +||||||| 04da777f7 +# 51895 "parsing/parser.ml" +======= +# 51909 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 51574 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51959 "parsing/parser.ml" +||||||| 04da777f7 +# 51954 "parsing/parser.ml" +======= +# 51968 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3353 "parsing/parser.mly" +||||||| 04da777f7 +# 3351 "parsing/parser.mly" +======= +# 3341 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) c ) +<<<<<<< HEAD +# 51592 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51977 "parsing/parser.ml" +||||||| 04da777f7 +# 51972 "parsing/parser.ml" +======= +# 51986 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51599 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51984 "parsing/parser.ml" +||||||| 04da777f7 +# 51979 "parsing/parser.ml" +======= +# 51993 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51604 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51989 "parsing/parser.ml" +||||||| 04da777f7 +# 51984 "parsing/parser.ml" +======= +# 51998 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 51610 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 51995 "parsing/parser.ml" +||||||| 04da777f7 +# 51990 "parsing/parser.ml" +======= +# 52004 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.expression) = Obj.magic _1_inlined3 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _1 = _1_inlined3 in + let _1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52058 "parsing/parser.ml" +||||||| 04da777f7 +# 52053 "parsing/parser.ml" +======= +# 52067 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51678 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52063 "parsing/parser.ml" +||||||| 04da777f7 +# 52058 "parsing/parser.ml" +======= +# 52072 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 51684 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52069 "parsing/parser.ml" +||||||| 04da777f7 +# 52064 "parsing/parser.ml" +======= +# 52078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 51694 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52079 "parsing/parser.ml" +||||||| 04da777f7 +# 52074 "parsing/parser.ml" +======= +# 52088 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 51699 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52084 "parsing/parser.ml" +||||||| 04da777f7 +# 52079 "parsing/parser.ml" +======= +# 52093 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 51705 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52090 "parsing/parser.ml" +||||||| 04da777f7 +# 52085 "parsing/parser.ml" +======= +# 52099 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 51716 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 51722 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52101 "parsing/parser.ml" +||||||| 04da777f7 +# 52096 "parsing/parser.ml" +======= +# 52110 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 52107 "parsing/parser.ml" +||||||| 04da777f7 +# 52102 "parsing/parser.ml" +======= +# 52116 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 51735 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52120 "parsing/parser.ml" +||||||| 04da777f7 +# 52115 "parsing/parser.ml" +======= +# 52129 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51741 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52126 "parsing/parser.ml" +||||||| 04da777f7 +# 52121 "parsing/parser.ml" +======= +# 52135 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 51747 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52132 "parsing/parser.ml" +||||||| 04da777f7 +# 52127 "parsing/parser.ml" +======= +# 52141 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in + let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in + let _1_inlined4 : (string Asttypes.loc option) = Obj.magic _1_inlined4 in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_endpos_xs_, _startpos__1_, xs, _1_inlined2, _1_inlined1) = (_endpos_xs_inlined1_, _startpos__1_inlined3_, xs_inlined1, _1_inlined5, _1_inlined4) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 51834 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52219 "parsing/parser.ml" +||||||| 04da777f7 +# 52214 "parsing/parser.ml" +======= +# 52228 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 51839 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52224 "parsing/parser.ml" +||||||| 04da777f7 +# 52219 "parsing/parser.ml" +======= +# 52233 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 51845 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52230 "parsing/parser.ml" +||||||| 04da777f7 +# 52225 "parsing/parser.ml" +======= +# 52239 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 51856 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 51862 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52241 "parsing/parser.ml" +||||||| 04da777f7 +# 52236 "parsing/parser.ml" +======= +# 52250 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 52247 "parsing/parser.ml" +||||||| 04da777f7 +# 52242 "parsing/parser.ml" +======= +# 52256 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 51875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52260 "parsing/parser.ml" +||||||| 04da777f7 +# 52255 "parsing/parser.ml" +======= +# 52269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51881 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52266 "parsing/parser.ml" +||||||| 04da777f7 +# 52261 "parsing/parser.ml" +======= +# 52275 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 51887 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52272 "parsing/parser.ml" +||||||| 04da777f7 +# 52267 "parsing/parser.ml" +======= +# 52281 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 51897 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52282 "parsing/parser.ml" +||||||| 04da777f7 +# 52277 "parsing/parser.ml" +======= +# 52291 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 51902 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52287 "parsing/parser.ml" +||||||| 04da777f7 +# 52282 "parsing/parser.ml" +======= +# 52296 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 51908 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52293 "parsing/parser.ml" +||||||| 04da777f7 +# 52288 "parsing/parser.ml" +======= +# 52302 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 51919 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 51925 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52304 "parsing/parser.ml" +||||||| 04da777f7 +# 52299 "parsing/parser.ml" +======= +# 52313 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 52310 "parsing/parser.ml" +||||||| 04da777f7 +# 52305 "parsing/parser.ml" +======= +# 52319 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 51938 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52323 "parsing/parser.ml" +||||||| 04da777f7 +# 52318 "parsing/parser.ml" +======= +# 52332 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 51944 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52329 "parsing/parser.ml" +||||||| 04da777f7 +# 52324 "parsing/parser.ml" +======= +# 52338 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 51950 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52335 "parsing/parser.ml" +||||||| 04da777f7 +# 52330 "parsing/parser.ml" +======= +# 52344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1_inlined3 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52008 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52393 "parsing/parser.ml" +||||||| 04da777f7 +# 52388 "parsing/parser.ml" +======= +# 52402 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined3 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_2, _1) = (_2_inlined1, _1_inlined3) in + +<<<<<<< HEAD +# 3348 "parsing/parser.mly" +||||||| 04da777f7 +# 3346 "parsing/parser.mly" +======= +# 3336 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 52023 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52408 "parsing/parser.ml" +||||||| 04da777f7 +# 52403 "parsing/parser.ml" +======= +# 52417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 52033 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52418 "parsing/parser.ml" +||||||| 04da777f7 +# 52413 "parsing/parser.ml" +======= +# 52427 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 52038 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52423 "parsing/parser.ml" +||||||| 04da777f7 +# 52418 "parsing/parser.ml" +======= +# 52432 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 52044 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52429 "parsing/parser.ml" +||||||| 04da777f7 +# 52424 "parsing/parser.ml" +======= +# 52438 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 52055 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 52061 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52440 "parsing/parser.ml" +||||||| 04da777f7 +# 52435 "parsing/parser.ml" +======= +# 52449 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 52446 "parsing/parser.ml" +||||||| 04da777f7 +# 52441 "parsing/parser.ml" +======= +# 52455 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 52074 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52459 "parsing/parser.ml" +||||||| 04da777f7 +# 52454 "parsing/parser.ml" +======= +# 52468 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52080 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52465 "parsing/parser.ml" +||||||| 04da777f7 +# 52460 "parsing/parser.ml" +======= +# 52474 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 52086 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52471 "parsing/parser.ml" +||||||| 04da777f7 +# 52466 "parsing/parser.ml" +======= +# 52480 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52143 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52528 "parsing/parser.ml" +||||||| 04da777f7 +# 52523 "parsing/parser.ml" +======= +# 52537 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3350 "parsing/parser.mly" +||||||| 04da777f7 +# 3348 "parsing/parser.mly" +======= +# 3338 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +<<<<<<< HEAD +# 52160 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52545 "parsing/parser.ml" +||||||| 04da777f7 +# 52540 "parsing/parser.ml" +======= +# 52554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 52170 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52555 "parsing/parser.ml" +||||||| 04da777f7 +# 52550 "parsing/parser.ml" +======= +# 52564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 52175 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52560 "parsing/parser.ml" +||||||| 04da777f7 +# 52555 "parsing/parser.ml" +======= +# 52569 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 52181 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52566 "parsing/parser.ml" +||||||| 04da777f7 +# 52561 "parsing/parser.ml" +======= +# 52575 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 52192 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 52198 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52577 "parsing/parser.ml" +||||||| 04da777f7 +# 52572 "parsing/parser.ml" +======= +# 52586 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 52583 "parsing/parser.ml" +||||||| 04da777f7 +# 52578 "parsing/parser.ml" +======= +# 52592 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 52211 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52596 "parsing/parser.ml" +||||||| 04da777f7 +# 52591 "parsing/parser.ml" +======= +# 52605 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52217 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52602 "parsing/parser.ml" +||||||| 04da777f7 +# 52597 "parsing/parser.ml" +======= +# 52611 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 52223 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52608 "parsing/parser.ml" +||||||| 04da777f7 +# 52603 "parsing/parser.ml" +======= +# 52617 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52300 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52685 "parsing/parser.ml" +||||||| 04da777f7 +# 52680 "parsing/parser.ml" +======= +# 52694 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3353 "parsing/parser.mly" +||||||| 04da777f7 +# 3351 "parsing/parser.mly" +======= +# 3341 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) c ) +<<<<<<< HEAD +# 52321 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52706 "parsing/parser.ml" +||||||| 04da777f7 +# 52701 "parsing/parser.ml" +======= +# 52715 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 52331 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52716 "parsing/parser.ml" +||||||| 04da777f7 +# 52711 "parsing/parser.ml" +======= +# 52725 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 52336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52721 "parsing/parser.ml" +||||||| 04da777f7 +# 52716 "parsing/parser.ml" +======= +# 52730 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 52342 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52727 "parsing/parser.ml" +||||||| 04da777f7 +# 52722 "parsing/parser.ml" +======= +# 52736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 52353 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 52359 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52738 "parsing/parser.ml" +||||||| 04da777f7 +# 52733 "parsing/parser.ml" +======= +# 52747 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 52744 "parsing/parser.ml" +||||||| 04da777f7 +# 52739 "parsing/parser.ml" +======= +# 52753 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 52372 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52757 "parsing/parser.ml" +||||||| 04da777f7 +# 52752 "parsing/parser.ml" +======= +# 52766 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52378 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52763 "parsing/parser.ml" +||||||| 04da777f7 +# 52758 "parsing/parser.ml" +======= +# 52772 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3367 "parsing/parser.mly" +||||||| 04da777f7 +# 3365 "parsing/parser.mly" +======= +# 3355 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; None, x1 ] ) +<<<<<<< HEAD +# 52384 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52769 "parsing/parser.ml" +||||||| 04da777f7 +# 52764 "parsing/parser.ml" +======= +# 52778 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52426 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52811 "parsing/parser.ml" +||||||| 04da777f7 +# 52806 "parsing/parser.ml" +======= +# 52820 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_l1_ in + let _endpos = _endpos__1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52436 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52821 "parsing/parser.ml" +||||||| 04da777f7 +# 52816 "parsing/parser.ml" +======= +# 52830 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52441 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52826 "parsing/parser.ml" +||||||| 04da777f7 +# 52821 "parsing/parser.ml" +======= +# 52835 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 52447 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52832 "parsing/parser.ml" +||||||| 04da777f7 +# 52827 "parsing/parser.ml" +======= +# 52841 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3371 "parsing/parser.mly" +||||||| 04da777f7 +# 3369 "parsing/parser.mly" +======= +# 3359 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; Some l1, x1 ] ) +<<<<<<< HEAD +# 52453 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52838 "parsing/parser.ml" +||||||| 04da777f7 +# 52833 "parsing/parser.ml" +======= +# 52847 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52516 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52901 "parsing/parser.ml" +||||||| 04da777f7 +# 52896 "parsing/parser.ml" +======= +# 52910 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_l1_ in + let _endpos = _endpos_xs_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 52529 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52914 "parsing/parser.ml" +||||||| 04da777f7 +# 52909 "parsing/parser.ml" +======= +# 52923 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 52534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52919 "parsing/parser.ml" +||||||| 04da777f7 +# 52914 "parsing/parser.ml" +======= +# 52928 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 52540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52925 "parsing/parser.ml" +||||||| 04da777f7 +# 52920 "parsing/parser.ml" +======= +# 52934 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 52551 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 52557 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52936 "parsing/parser.ml" +||||||| 04da777f7 +# 52931 "parsing/parser.ml" +======= +# 52945 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 52942 "parsing/parser.ml" +||||||| 04da777f7 +# 52937 "parsing/parser.ml" +======= +# 52951 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 52570 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52955 "parsing/parser.ml" +||||||| 04da777f7 +# 52950 "parsing/parser.ml" +======= +# 52964 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52576 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52961 "parsing/parser.ml" +||||||| 04da777f7 +# 52956 "parsing/parser.ml" +======= +# 52970 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 52582 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52967 "parsing/parser.ml" +||||||| 04da777f7 +# 52962 "parsing/parser.ml" +======= +# 52976 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3371 "parsing/parser.mly" +||||||| 04da777f7 +# 3369 "parsing/parser.mly" +======= +# 3359 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; Some l1, x1 ] ) +<<<<<<< HEAD +# 52588 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 52973 "parsing/parser.ml" +||||||| 04da777f7 +# 52968 "parsing/parser.ml" +======= +# 52982 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52634 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53019 "parsing/parser.ml" +||||||| 04da777f7 +# 53014 "parsing/parser.ml" +======= +# 53028 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52641 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53026 "parsing/parser.ml" +||||||| 04da777f7 +# 53021 "parsing/parser.ml" +======= +# 53035 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_l1_ in + let _endpos = _endpos__2_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = +<<<<<<< HEAD +# 3348 "parsing/parser.mly" +||||||| 04da777f7 +# 3346 "parsing/parser.mly" +======= +# 3336 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 52649 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53034 "parsing/parser.ml" +||||||| 04da777f7 +# 53029 "parsing/parser.ml" +======= +# 53043 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3371 "parsing/parser.mly" +||||||| 04da777f7 +# 3369 "parsing/parser.mly" +======= +# 3359 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; Some l1, x1 ] ) +<<<<<<< HEAD +# 52654 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53039 "parsing/parser.ml" +||||||| 04da777f7 +# 53034 "parsing/parser.ml" +======= +# 53048 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52699 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53084 "parsing/parser.ml" +||||||| 04da777f7 +# 53079 "parsing/parser.ml" +======= +# 53093 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52707 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53092 "parsing/parser.ml" +||||||| 04da777f7 +# 53087 "parsing/parser.ml" +======= +# 53101 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_l1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3350 "parsing/parser.mly" +||||||| 04da777f7 +# 3348 "parsing/parser.mly" +======= +# 3338 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +<<<<<<< HEAD +# 52718 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53103 "parsing/parser.ml" +||||||| 04da777f7 +# 53098 "parsing/parser.ml" +======= +# 53112 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3371 "parsing/parser.mly" +||||||| 04da777f7 +# 3369 "parsing/parser.mly" +======= +# 3359 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; Some l1, x1 ] ) +<<<<<<< HEAD +# 52724 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53109 "parsing/parser.ml" +||||||| 04da777f7 +# 53104 "parsing/parser.ml" +======= +# 53118 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52789 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53174 "parsing/parser.ml" +||||||| 04da777f7 +# 53169 "parsing/parser.ml" +======= +# 53183 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52798 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53183 "parsing/parser.ml" +||||||| 04da777f7 +# 53178 "parsing/parser.ml" +======= +# 53192 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_l1_ in + let _endpos = _endpos__5_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3353 "parsing/parser.mly" +||||||| 04da777f7 +# 3351 "parsing/parser.mly" +======= +# 3341 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) c ) +<<<<<<< HEAD +# 52811 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53196 "parsing/parser.ml" +||||||| 04da777f7 +# 53191 "parsing/parser.ml" +======= +# 53205 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3371 "parsing/parser.mly" +||||||| 04da777f7 +# 3369 "parsing/parser.mly" +======= +# 3359 "parsing/parser.mly" +>>>>>>> origin/main + ( [ x2; Some l1, x1 ] ) +<<<<<<< HEAD +# 52817 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53202 "parsing/parser.ml" +||||||| 04da777f7 +# 53197 "parsing/parser.ml" +======= +# 53211 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52858 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53243 "parsing/parser.ml" +||||||| 04da777f7 +# 53238 "parsing/parser.ml" +======= +# 53252 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _1 = _1_inlined1 in + let _1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52870 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53255 "parsing/parser.ml" +||||||| 04da777f7 +# 53250 "parsing/parser.ml" +======= +# 53264 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 52875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53260 "parsing/parser.ml" +||||||| 04da777f7 +# 53255 "parsing/parser.ml" +======= +# 53269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 52881 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53266 "parsing/parser.ml" +||||||| 04da777f7 +# 53261 "parsing/parser.ml" +======= +# 53275 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3375 "parsing/parser.mly" +||||||| 04da777f7 +# 3373 "parsing/parser.mly" +======= +# 3363 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +<<<<<<< HEAD +# 52889 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53274 "parsing/parser.ml" +||||||| 04da777f7 +# 53269 "parsing/parser.ml" +======= +# 53283 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 52951 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53336 "parsing/parser.ml" +||||||| 04da777f7 +# 53331 "parsing/parser.ml" +======= +# 53345 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 52966 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53351 "parsing/parser.ml" +||||||| 04da777f7 +# 53346 "parsing/parser.ml" +======= +# 53360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 52971 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53356 "parsing/parser.ml" +||||||| 04da777f7 +# 53351 "parsing/parser.ml" +======= +# 53365 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 52977 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53362 "parsing/parser.ml" +||||||| 04da777f7 +# 53357 "parsing/parser.ml" +======= +# 53371 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 52988 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 52994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 53373 "parsing/parser.ml" +||||||| 04da777f7 +# 53368 "parsing/parser.ml" +======= +# 53382 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 53379 "parsing/parser.ml" +||||||| 04da777f7 +# 53374 "parsing/parser.ml" +======= +# 53388 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 53007 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53392 "parsing/parser.ml" +||||||| 04da777f7 +# 53387 "parsing/parser.ml" +======= +# 53401 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 53013 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53398 "parsing/parser.ml" +||||||| 04da777f7 +# 53393 "parsing/parser.ml" +======= +# 53407 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 53019 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53404 "parsing/parser.ml" +||||||| 04da777f7 +# 53399 "parsing/parser.ml" +======= +# 53413 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3375 "parsing/parser.mly" +||||||| 04da777f7 +# 3373 "parsing/parser.mly" +======= +# 3363 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +<<<<<<< HEAD +# 53027 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53412 "parsing/parser.ml" +||||||| 04da777f7 +# 53407 "parsing/parser.ml" +======= +# 53421 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53073 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53458 "parsing/parser.ml" +||||||| 04da777f7 +# 53453 "parsing/parser.ml" +======= +# 53467 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53079 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53464 "parsing/parser.ml" +||||||| 04da777f7 +# 53459 "parsing/parser.ml" +======= +# 53473 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3348 "parsing/parser.mly" +||||||| 04da777f7 +# 3346 "parsing/parser.mly" +======= +# 3336 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 53090 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53475 "parsing/parser.ml" +||||||| 04da777f7 +# 53470 "parsing/parser.ml" +======= +# 53484 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3375 "parsing/parser.mly" +||||||| 04da777f7 +# 3373 "parsing/parser.mly" +======= +# 3363 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +<<<<<<< HEAD +# 53098 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53483 "parsing/parser.ml" +||||||| 04da777f7 +# 53478 "parsing/parser.ml" +======= +# 53492 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53143 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53528 "parsing/parser.ml" +||||||| 04da777f7 +# 53523 "parsing/parser.ml" +======= +# 53537 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53150 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53535 "parsing/parser.ml" +||||||| 04da777f7 +# 53530 "parsing/parser.ml" +======= +# 53544 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3350 "parsing/parser.mly" +||||||| 04da777f7 +# 3348 "parsing/parser.mly" +======= +# 3338 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +<<<<<<< HEAD +# 53162 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53547 "parsing/parser.ml" +||||||| 04da777f7 +# 53542 "parsing/parser.ml" +======= +# 53556 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3375 "parsing/parser.mly" +||||||| 04da777f7 +# 3373 "parsing/parser.mly" +======= +# 3363 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +<<<<<<< HEAD +# 53170 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53555 "parsing/parser.ml" +||||||| 04da777f7 +# 53550 "parsing/parser.ml" +======= +# 53564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53235 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53620 "parsing/parser.ml" +||||||| 04da777f7 +# 53615 "parsing/parser.ml" +======= +# 53629 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2 : unit = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53243 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53628 "parsing/parser.ml" +||||||| 04da777f7 +# 53623 "parsing/parser.ml" +======= +# 53637 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3353 "parsing/parser.mly" +||||||| 04da777f7 +# 3351 "parsing/parser.mly" +======= +# 3341 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) c ) +<<<<<<< HEAD +# 53257 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53642 "parsing/parser.ml" +||||||| 04da777f7 +# 53637 "parsing/parser.ml" +======= +# 53651 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3375 "parsing/parser.mly" +||||||| 04da777f7 +# 3373 "parsing/parser.mly" +======= +# 3363 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +<<<<<<< HEAD +# 53265 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53650 "parsing/parser.ml" +||||||| 04da777f7 +# 53645 "parsing/parser.ml" +======= +# 53659 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53326 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53711 "parsing/parser.ml" +||||||| 04da777f7 +# 53706 "parsing/parser.ml" +======= +# 53720 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _1 = _1_inlined1 in + let _1 = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 53339 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53724 "parsing/parser.ml" +||||||| 04da777f7 +# 53719 "parsing/parser.ml" +======= +# 53733 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 53344 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53729 "parsing/parser.ml" +||||||| 04da777f7 +# 53724 "parsing/parser.ml" +======= +# 53738 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 53350 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53735 "parsing/parser.ml" +||||||| 04da777f7 +# 53730 "parsing/parser.ml" +======= +# 53744 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_x2_ = _endpos__1_inlined1_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3380 "parsing/parser.mly" +||||||| 04da777f7 +# 3378 "parsing/parser.mly" +======= +# 3368 "parsing/parser.mly" +>>>>>>> origin/main + ( let x1 = + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +<<<<<<< HEAD +# 53363 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53748 "parsing/parser.ml" +||||||| 04da777f7 +# 53743 "parsing/parser.ml" +======= +# 53757 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53445 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53830 "parsing/parser.ml" +||||||| 04da777f7 +# 53825 "parsing/parser.ml" +======= +# 53839 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 53461 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53846 "parsing/parser.ml" +||||||| 04da777f7 +# 53841 "parsing/parser.ml" +======= +# 53855 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 53466 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53851 "parsing/parser.ml" +||||||| 04da777f7 +# 53846 "parsing/parser.ml" +======= +# 53860 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 53472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53857 "parsing/parser.ml" +||||||| 04da777f7 +# 53852 "parsing/parser.ml" +======= +# 53866 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 53483 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 53489 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 53868 "parsing/parser.ml" +||||||| 04da777f7 +# 53863 "parsing/parser.ml" +======= +# 53877 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 53874 "parsing/parser.ml" +||||||| 04da777f7 +# 53869 "parsing/parser.ml" +======= +# 53883 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 53502 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53887 "parsing/parser.ml" +||||||| 04da777f7 +# 53882 "parsing/parser.ml" +======= +# 53896 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 53508 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53893 "parsing/parser.ml" +||||||| 04da777f7 +# 53888 "parsing/parser.ml" +======= +# 53902 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3346 "parsing/parser.mly" +||||||| 04da777f7 +# 3344 "parsing/parser.mly" +======= +# 3334 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 53514 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53899 "parsing/parser.ml" +||||||| 04da777f7 +# 53894 "parsing/parser.ml" +======= +# 53908 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_x2_ = _endpos_xs_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3380 "parsing/parser.mly" +||||||| 04da777f7 +# 3378 "parsing/parser.mly" +======= +# 3368 "parsing/parser.mly" +>>>>>>> origin/main + ( let x1 = + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +<<<<<<< HEAD +# 53527 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53912 "parsing/parser.ml" +||||||| 04da777f7 +# 53907 "parsing/parser.ml" +======= +# 53921 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53591 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53976 "parsing/parser.ml" +||||||| 04da777f7 +# 53971 "parsing/parser.ml" +======= +# 53985 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53599 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53984 "parsing/parser.ml" +||||||| 04da777f7 +# 53979 "parsing/parser.ml" +======= +# 53993 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +<<<<<<< HEAD +# 3348 "parsing/parser.mly" +||||||| 04da777f7 +# 3346 "parsing/parser.mly" +======= +# 3336 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 53611 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 53996 "parsing/parser.ml" +||||||| 04da777f7 +# 53991 "parsing/parser.ml" +======= +# 54005 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_x2_ = _endpos__2_inlined1_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3380 "parsing/parser.mly" +||||||| 04da777f7 +# 3378 "parsing/parser.mly" +======= +# 3368 "parsing/parser.mly" +>>>>>>> origin/main + ( let x1 = + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +<<<<<<< HEAD +# 53624 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54009 "parsing/parser.ml" +||||||| 04da777f7 +# 54004 "parsing/parser.ml" +======= +# 54018 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53687 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54072 "parsing/parser.ml" +||||||| 04da777f7 +# 54067 "parsing/parser.ml" +======= +# 54081 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53696 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54081 "parsing/parser.ml" +||||||| 04da777f7 +# 54076 "parsing/parser.ml" +======= +# 54090 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3350 "parsing/parser.mly" +||||||| 04da777f7 +# 3348 "parsing/parser.mly" +======= +# 3338 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +<<<<<<< HEAD +# 53709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54094 "parsing/parser.ml" +||||||| 04da777f7 +# 54089 "parsing/parser.ml" +======= +# 54103 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_x2_ = _endpos_label_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3380 "parsing/parser.mly" +||||||| 04da777f7 +# 3378 "parsing/parser.mly" +======= +# 3368 "parsing/parser.mly" +>>>>>>> origin/main + ( let x1 = + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +<<<<<<< HEAD +# 53722 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54107 "parsing/parser.ml" +||||||| 04da777f7 +# 54102 "parsing/parser.ml" +======= +# 54116 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5_inlined1; + MenhirLib.EngineTypes.startp = _startpos__5_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__5_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c_inlined1; + MenhirLib.EngineTypes.startp = _startpos_c_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_c_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5_inlined1 : unit = Obj.magic _5_inlined1 in + let c_inlined1 : (N_ary.type_constraint) = Obj.magic c_inlined1 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53805 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54190 "parsing/parser.ml" +||||||| 04da777f7 +# 54185 "parsing/parser.ml" +======= +# 54199 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (N_ary.type_constraint) = Obj.magic c in + let l1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 53815 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54200 "parsing/parser.ml" +||||||| 04da777f7 +# 54195 "parsing/parser.ml" +======= +# 54209 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic l1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_inlined1_ in + let _v : ((string option * Parsetree.expression) list) = let x2 = + let (_endpos__5_, _startpos__2_, c) = (_endpos__5_inlined1_, _startpos__2_inlined1_, c_inlined1) in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3353 "parsing/parser.mly" +||||||| 04da777f7 +# 3351 "parsing/parser.mly" +======= +# 3341 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) c ) +<<<<<<< HEAD +# 53831 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54216 "parsing/parser.ml" +||||||| 04da777f7 +# 54211 "parsing/parser.ml" +======= +# 54225 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_x2_ = _endpos__5_inlined1_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + +<<<<<<< HEAD +# 3380 "parsing/parser.mly" +||||||| 04da777f7 +# 3378 "parsing/parser.mly" +======= +# 3368 "parsing/parser.mly" +>>>>>>> origin/main + ( let x1 = + mkexp_type_constraint + ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +<<<<<<< HEAD +# 53844 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54229 "parsing/parser.ml" +||||||| 04da777f7 +# 54224 "parsing/parser.ml" +======= +# 54238 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +<<<<<<< HEAD +# 3569 "parsing/parser.mly" +||||||| 04da777f7 +# 3567 "parsing/parser.mly" +======= +# 3558 "parsing/parser.mly" +>>>>>>> origin/main + ( Closed, _1 ) +<<<<<<< HEAD +# 53869 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +# 3560 "parsing/parser.mly" + ( Open, _1 ) +# 53908 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = +# 3535 "parsing/parser.mly" + ( None, _1 ) +# 53947 "parsing/parser.ml" + in + +# 3562 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 53952 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +# 53994 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _2 = _2_inlined1 in + +# 3537 "parsing/parser.mly" + ( Some _1, _2 ) +# 54004 "parsing/parser.ml" + + in + +# 3562 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 54010 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 54051 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3539 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 54063 "parsing/parser.ml" + + in + +# 3562 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 54069 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +# 54137 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +# 54154 "parsing/parser.ml" + + in + +# 3562 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 54160 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +# 3558 "parsing/parser.mly" + ( Closed, _1 ) +# 54185 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +# 3560 "parsing/parser.mly" + ( Open, _1 ) +# 54224 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = +# 3535 "parsing/parser.mly" + ( None, _1 ) +======= +<<<<<<< HEAD +# 54254 "parsing/parser.ml" +||||||| 04da777f7 +# 54249 "parsing/parser.ml" +======= +>>>>>>> upstream/main +# 54263 "parsing/parser.ml" +>>>>>>> origin/main + in +<<<<<<< HEAD + +# 3562 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 54268 "parsing/parser.ml" +======= + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +<<<<<<< HEAD +# 3571 "parsing/parser.mly" +||||||| 04da777f7 +# 3569 "parsing/parser.mly" +======= +# 3560 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, _1 ) +<<<<<<< HEAD +# 54293 "parsing/parser.ml" +||||||| 04da777f7 +# 54288 "parsing/parser.ml" +======= +# 54302 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 54332 "parsing/parser.ml" +||||||| 04da777f7 +# 54327 "parsing/parser.ml" + in + +# 3571 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 54332 "parsing/parser.ml" +======= +# 54341 "parsing/parser.ml" + in + +# 3562 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 54346 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 3573 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 54337 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 54310 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54379 "parsing/parser.ml" +||||||| 04da777f7 +# 54374 "parsing/parser.ml" +======= +# 54388 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 54320 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54389 "parsing/parser.ml" +||||||| 04da777f7 +# 54384 "parsing/parser.ml" +======= +# 54398 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3573 "parsing/parser.mly" +||||||| 04da777f7 +# 3571 "parsing/parser.mly" +======= +# 3562 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, [ _1 ] ) +<<<<<<< HEAD +# 54326 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54395 "parsing/parser.ml" +||||||| 04da777f7 +# 54390 "parsing/parser.ml" +======= +# 54404 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 54367 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54436 "parsing/parser.ml" +||||||| 04da777f7 +# 54431 "parsing/parser.ml" +======= +# 54445 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 54379 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54448 "parsing/parser.ml" +||||||| 04da777f7 +# 54443 "parsing/parser.ml" +======= +# 54457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3573 "parsing/parser.mly" +||||||| 04da777f7 +# 3571 "parsing/parser.mly" +======= +# 3562 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, [ _1 ] ) +<<<<<<< HEAD +# 54385 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54454 "parsing/parser.ml" +||||||| 04da777f7 +# 54449 "parsing/parser.ml" +======= +# 54463 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 54453 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54522 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 54536 "parsing/parser.ml" +||||||| 04da777f7 +# 54517 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 54531 "parsing/parser.ml" +======= +# 54531 "parsing/parser.ml" +>>>>>>> upstream/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +<<<<<<< HEAD +# 54470 "parsing/parser.ml" +======= +# 54548 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3573 "parsing/parser.mly" +||||||| 04da777f7 +# 3571 "parsing/parser.mly" +======= +# 3562 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, [ _1 ] ) +<<<<<<< HEAD +# 54476 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54542 "parsing/parser.ml" +||||||| 04da777f7 +# 54537 "parsing/parser.ml" +======= +# 54554 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +<<<<<<< HEAD +# 3569 "parsing/parser.mly" +||||||| 04da777f7 +# 3567 "parsing/parser.mly" +======= +# 3558 "parsing/parser.mly" +>>>>>>> origin/main + ( Closed, _1 ) +<<<<<<< HEAD +# 54567 "parsing/parser.ml" +||||||| 04da777f7 +# 54562 "parsing/parser.ml" +======= +# 54579 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +<<<<<<< HEAD +# 3571 "parsing/parser.mly" +||||||| 04da777f7 +# 3569 "parsing/parser.mly" +======= +# 3560 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, _1 ) +<<<<<<< HEAD +# 54606 "parsing/parser.ml" +||||||| 04da777f7 +# 54601 "parsing/parser.ml" +======= +# 54618 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = +<<<<<<< HEAD +# 3547 "parsing/parser.mly" +||||||| 04da777f7 +# 3545 "parsing/parser.mly" +======= +# 3535 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 54645 "parsing/parser.ml" +||||||| 04da777f7 +# 54640 "parsing/parser.ml" +======= +# 54657 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 3573 "parsing/parser.mly" +||||||| 04da777f7 +# 3571 "parsing/parser.mly" +======= +# 3562 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, [ _1 ] ) +<<<<<<< HEAD +# 54650 "parsing/parser.ml" +||||||| 04da777f7 +# 54645 "parsing/parser.ml" +======= +# 54662 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 992 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 54692 "parsing/parser.ml" +||||||| 04da777f7 +# 54687 "parsing/parser.ml" +======= +# 54704 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _2 = _2_inlined1 in + +<<<<<<< HEAD +# 3549 "parsing/parser.mly" +||||||| 04da777f7 +# 3547 "parsing/parser.mly" +======= +# 3537 "parsing/parser.mly" +>>>>>>> origin/main + ( Some _1, _2 ) +<<<<<<< HEAD +# 54702 "parsing/parser.ml" +||||||| 04da777f7 +# 54697 "parsing/parser.ml" +======= +# 54714 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3573 "parsing/parser.mly" +||||||| 04da777f7 +# 3571 "parsing/parser.mly" +======= +# 3562 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, [ _1 ] ) +<<<<<<< HEAD +# 54708 "parsing/parser.ml" +||||||| 04da777f7 +# 54703 "parsing/parser.ml" +======= +# 54720 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 54749 "parsing/parser.ml" +||||||| 04da777f7 +# 54744 "parsing/parser.ml" +======= +# 54761 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3551 "parsing/parser.mly" +||||||| 04da777f7 +# 3549 "parsing/parser.mly" +======= +# 3539 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +<<<<<<< HEAD +# 54761 "parsing/parser.ml" +||||||| 04da777f7 +# 54756 "parsing/parser.ml" +======= +# 54773 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3573 "parsing/parser.mly" +||||||| 04da777f7 +# 3571 "parsing/parser.mly" +======= +# 3562 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, [ _1 ] ) +<<<<<<< HEAD +# 54767 "parsing/parser.ml" +||||||| 04da777f7 +# 54762 "parsing/parser.ml" +======= +# 54779 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 54835 "parsing/parser.ml" +||||||| 04da777f7 +# 54830 "parsing/parser.ml" +======= +# 54847 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +<<<<<<< HEAD +# 3554 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 54849 "parsing/parser.ml" +||||||| 04da777f7 +# 3552 "parsing/parser.mly" + ( let loc = _loc_label_ in + let pat = mkpatvar ~loc label in + Some label, mkpat_opt_constraint ~loc pat (Some cty) ) +# 54844 "parsing/parser.ml" +======= +# 3542 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) ) +# 54864 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3573 "parsing/parser.mly" +||||||| 04da777f7 +# 3571 "parsing/parser.mly" +======= +# 3562 "parsing/parser.mly" +>>>>>>> origin/main + ( Open, [ _1 ] ) +<<<<<<< HEAD +# 54855 "parsing/parser.ml" +||||||| 04da777f7 +# 54850 "parsing/parser.ml" +======= +# 54870 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = +# 1276 "parsing/parser.mly" + ( [] ) +<<<<<<< HEAD +# 54494 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54873 "parsing/parser.ml" +||||||| 04da777f7 +# 54868 "parsing/parser.ml" +======= +# 54888 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.core_type) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let xs : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__3_ in + let _v : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = let x = + let x = + let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2486 "parsing/parser.mly" +||||||| 04da777f7 +# 2484 "parsing/parser.mly" +======= +# 2474 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _3, make_loc _sloc ) +<<<<<<< HEAD +# 54553 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54932 "parsing/parser.ml" +||||||| 04da777f7 +# 54927 "parsing/parser.ml" +======= +# 54947 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 183 "" + ( x ) +<<<<<<< HEAD +# 54559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54938 "parsing/parser.ml" +||||||| 04da777f7 +# 54933 "parsing/parser.ml" +======= +# 54953 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1278 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 54565 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54944 "parsing/parser.ml" +||||||| 04da777f7 +# 54939 "parsing/parser.ml" +======= +# 54959 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (N_ary.function_param list) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (N_ary.function_param list) = +# 1309 "parsing/parser.mly" + ( List.rev x ) +<<<<<<< HEAD +# 54590 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 54969 "parsing/parser.ml" +||||||| 04da777f7 +# 54964 "parsing/parser.ml" +======= +# 54984 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (N_ary.function_param list) = Obj.magic x in + let xs : (N_ary.function_param list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (N_ary.function_param list) = +# 1311 "parsing/parser.mly" + ( List.rev_append x xs ) +<<<<<<< HEAD +# 54622 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55001 "parsing/parser.ml" +||||||| 04da777f7 +# 54996 "parsing/parser.ml" +======= +# 55016 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Jane_syntax.Comprehensions.clause) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Jane_syntax.Comprehensions.clause list) = +# 1290 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 54647 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55026 "parsing/parser.ml" +||||||| 04da777f7 +# 55021 "parsing/parser.ml" +======= +# 55041 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Jane_syntax.Comprehensions.clause) = Obj.magic x in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Jane_syntax.Comprehensions.clause list) = +# 1292 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 54679 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55058 "parsing/parser.ml" +||||||| 04da777f7 +# 55053 "parsing/parser.ml" +======= +# 55073 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Lexing.position * Parsetree.functor_parameter) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : ((Lexing.position * Parsetree.functor_parameter) list) = +# 1290 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 54704 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55083 "parsing/parser.ml" +||||||| 04da777f7 +# 55078 "parsing/parser.ml" +======= +# 55098 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Lexing.position * Parsetree.functor_parameter) = Obj.magic x in + let xs : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : ((Lexing.position * Parsetree.functor_parameter) list) = +# 1292 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 54736 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55115 "parsing/parser.ml" +||||||| 04da777f7 +# 55110 "parsing/parser.ml" +======= +# 55130 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.arg_label * Parsetree.expression) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.arg_label * Parsetree.expression) list) = +# 1290 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 54761 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55140 "parsing/parser.ml" +||||||| 04da777f7 +# 55135 "parsing/parser.ml" +======= +# 55155 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Parsetree.arg_label * Parsetree.expression) = Obj.magic x in + let xs : ((Parsetree.arg_label * Parsetree.expression) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.arg_label * Parsetree.expression) list) = +# 1292 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 54793 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55172 "parsing/parser.ml" +||||||| 04da777f7 +# 55167 "parsing/parser.ml" +======= +# 55187 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Asttypes.label) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Asttypes.label list) = +# 1290 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 54818 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55197 "parsing/parser.ml" +||||||| 04da777f7 +# 55192 "parsing/parser.ml" +======= +# 55212 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Asttypes.label) = Obj.magic x in + let xs : (Asttypes.label list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Asttypes.label list) = +# 1292 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 54850 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55229 "parsing/parser.ml" +||||||| 04da777f7 +# 55224 "parsing/parser.ml" +======= +# 55244 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = let x = + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 54888 "parsing/parser.ml" + + in + +# 4178 "parsing/parser.mly" + ( (_2, None) ) +# 54894 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55267 "parsing/parser.ml" +||||||| 04da777f7 +# 55262 "parsing/parser.ml" +======= +# 55282 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4197 "parsing/parser.mly" +||||||| 04da777f7 +# 4190 "parsing/parser.mly" +======= +# 4181 "parsing/parser.mly" +>>>>>>> origin/main + ( (_2, None) ) +<<<<<<< HEAD +# 55273 "parsing/parser.ml" +||||||| 04da777f7 +# 55268 "parsing/parser.ml" +======= +# 55288 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1290 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 54900 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55279 "parsing/parser.ml" +||||||| 04da777f7 +# 55274 "parsing/parser.ml" +======= +# 55294 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = let x = + let tyvar = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 54966 "parsing/parser.ml" + + in + +# 4180 "parsing/parser.mly" + ( (tyvar, Some jkind) ) +# 54972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55345 "parsing/parser.ml" +||||||| 04da777f7 +# 55340 "parsing/parser.ml" +======= +# 55360 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4199 "parsing/parser.mly" +||||||| 04da777f7 +# 4192 "parsing/parser.mly" +======= +# 4183 "parsing/parser.mly" +>>>>>>> origin/main + ( (tyvar, Some jkind) ) +<<<<<<< HEAD +# 55351 "parsing/parser.ml" +||||||| 04da777f7 +# 55346 "parsing/parser.ml" +======= +# 55366 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1290 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 54978 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55357 "parsing/parser.ml" +||||||| 04da777f7 +# 55352 "parsing/parser.ml" +======= +# 55372 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_inlined1_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = let x = + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 55023 "parsing/parser.ml" + + in + +# 4178 "parsing/parser.mly" + ( (_2, None) ) +# 55029 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55402 "parsing/parser.ml" +||||||| 04da777f7 +# 55397 "parsing/parser.ml" +======= +# 55417 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4197 "parsing/parser.mly" +||||||| 04da777f7 +# 4190 "parsing/parser.mly" +======= +# 4181 "parsing/parser.mly" +>>>>>>> origin/main + ( (_2, None) ) +<<<<<<< HEAD +# 55408 "parsing/parser.ml" +||||||| 04da777f7 +# 55403 "parsing/parser.ml" +======= +# 55423 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1292 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55035 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55414 "parsing/parser.ml" +||||||| 04da777f7 +# 55409 "parsing/parser.ml" +======= +# 55429 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = jkind; + MenhirLib.EngineTypes.startp = _startpos_jkind_; + MenhirLib.EngineTypes.endp = _endpos_jkind_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let jkind : (Jane_syntax.Jkind.annotation) = Obj.magic jkind in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__6_ in + let _v : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = let x = + let tyvar = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 55108 "parsing/parser.ml" + + in + +# 4180 "parsing/parser.mly" + ( (tyvar, Some jkind) ) +# 55114 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55487 "parsing/parser.ml" +||||||| 04da777f7 +# 55482 "parsing/parser.ml" +======= +# 55502 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4199 "parsing/parser.mly" +||||||| 04da777f7 +# 4192 "parsing/parser.mly" +======= +# 4183 "parsing/parser.mly" +>>>>>>> origin/main + ( (tyvar, Some jkind) ) +<<<<<<< HEAD +# 55493 "parsing/parser.ml" +||||||| 04da777f7 +# 55488 "parsing/parser.ml" +======= +# 55508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1292 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55120 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55499 "parsing/parser.ml" +||||||| 04da777f7 +# 55494 "parsing/parser.ml" +======= +# 55514 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.case) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.case list) = let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 55145 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55524 "parsing/parser.ml" +||||||| 04da777f7 +# 55519 "parsing/parser.ml" +======= +# 55539 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1401 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 55150 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55529 "parsing/parser.ml" +||||||| 04da777f7 +# 55524 "parsing/parser.ml" +======= +# 55544 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x_inlined1; + MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Parsetree.case) = Obj.magic x in + let x_inlined1 : unit = Obj.magic x_inlined1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_inlined1_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.case list) = let _1 = + let x = x_inlined1 in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 55184 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55563 "parsing/parser.ml" +||||||| 04da777f7 +# 55558 "parsing/parser.ml" +======= +# 55578 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1401 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 55190 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55569 "parsing/parser.ml" +||||||| 04da777f7 +# 55564 "parsing/parser.ml" +======= +# 55584 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.case) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.case list) = +# 1405 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55229 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55608 "parsing/parser.ml" +||||||| 04da777f7 +# 55603 "parsing/parser.ml" +======= +# 55623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type list) = let xs = + let x = +<<<<<<< HEAD +# 4226 "parsing/parser.mly" + ( _1 ) +# 55255 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4245 "parsing/parser.mly" +||||||| 04da777f7 +# 4238 "parsing/parser.mly" +======= +# 4229 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 55634 "parsing/parser.ml" +||||||| 04da777f7 +# 55629 "parsing/parser.ml" +======= +# 55649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55260 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55639 "parsing/parser.ml" +||||||| 04da777f7 +# 55634 "parsing/parser.ml" +======= +# 55654 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55266 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55645 "parsing/parser.ml" +||||||| 04da777f7 +# 55640 "parsing/parser.ml" +======= +# 55660 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.core_type list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type list) = let xs = + let x = +<<<<<<< HEAD +# 4226 "parsing/parser.mly" + ( _1 ) +# 55306 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4245 "parsing/parser.mly" +||||||| 04da777f7 +# 4238 "parsing/parser.mly" +======= +# 4229 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 55685 "parsing/parser.ml" +||||||| 04da777f7 +# 55680 "parsing/parser.ml" +======= +# 55700 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55311 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55690 "parsing/parser.ml" +||||||| 04da777f7 +# 55685 "parsing/parser.ml" +======= +# 55705 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55317 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55696 "parsing/parser.ml" +||||||| 04da777f7 +# 55691 "parsing/parser.ml" +======= +# 55711 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Jane_syntax.Comprehensions.clause_binding) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Jane_syntax.Comprehensions.clause_binding list) = let xs = +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55342 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55721 "parsing/parser.ml" +||||||| 04da777f7 +# 55716 "parsing/parser.ml" +======= +# 55736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55347 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55726 "parsing/parser.ml" +||||||| 04da777f7 +# 55721 "parsing/parser.ml" +======= +# 55741 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Jane_syntax.Comprehensions.clause_binding) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : (Jane_syntax.Comprehensions.clause_binding list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Jane_syntax.Comprehensions.clause_binding list) = let xs = +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55386 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55765 "parsing/parser.ml" +||||||| 04da777f7 +# 55760 "parsing/parser.ml" +======= +# 55780 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55391 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55770 "parsing/parser.ml" +||||||| 04da777f7 +# 55765 "parsing/parser.ml" +======= +# 55785 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.with_constraint) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.with_constraint list) = let xs = +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55416 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55795 "parsing/parser.ml" +||||||| 04da777f7 +# 55790 "parsing/parser.ml" +======= +# 55810 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55421 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55800 "parsing/parser.ml" +||||||| 04da777f7 +# 55795 "parsing/parser.ml" +======= +# 55815 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.with_constraint) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.with_constraint list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.with_constraint list) = let xs = +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55460 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55839 "parsing/parser.ml" +||||||| 04da777f7 +# 55834 "parsing/parser.ml" +======= +# 55854 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55465 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55844 "parsing/parser.ml" +||||||| 04da777f7 +# 55839 "parsing/parser.ml" +======= +# 55859 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.row_field) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.row_field list) = let xs = +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55490 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55869 "parsing/parser.ml" +||||||| 04da777f7 +# 55864 "parsing/parser.ml" +======= +# 55884 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55495 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55874 "parsing/parser.ml" +||||||| 04da777f7 +# 55869 "parsing/parser.ml" +======= +# 55889 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.row_field) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.row_field list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.row_field list) = let xs = +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55913 "parsing/parser.ml" +||||||| 04da777f7 +# 55908 "parsing/parser.ml" +======= +# 55928 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55539 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55918 "parsing/parser.ml" +||||||| 04da777f7 +# 55913 "parsing/parser.ml" +======= +# 55933 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.core_type) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.core_type list) = let xs = +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55564 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55943 "parsing/parser.ml" +||||||| 04da777f7 +# 55938 "parsing/parser.ml" +======= +# 55958 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55948 "parsing/parser.ml" +||||||| 04da777f7 +# 55943 "parsing/parser.ml" +======= +# 55963 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.core_type) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.core_type list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.core_type list) = let xs = +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55608 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 55987 "parsing/parser.ml" +||||||| 04da777f7 +# 55982 "parsing/parser.ml" + in + +# 1354 "parsing/parser.mly" + ( xs ) +# 55987 "parsing/parser.ml" +======= +# 56002 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55613 "parsing/parser.ml" +======= +# 56007 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 1354 "parsing/parser.mly" + ( xs ) +# 55992 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55638 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56017 "parsing/parser.ml" +||||||| 04da777f7 +# 56012 "parsing/parser.ml" + in + +# 1354 "parsing/parser.mly" + ( xs ) +# 56017 "parsing/parser.ml" +======= +# 56032 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55643 "parsing/parser.ml" +======= +# 56037 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 1354 "parsing/parser.mly" + ( xs ) +# 56022 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55682 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56061 "parsing/parser.ml" +||||||| 04da777f7 +# 56056 "parsing/parser.ml" +======= +# 56076 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55687 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56066 "parsing/parser.ml" +||||||| 04da777f7 +# 56061 "parsing/parser.ml" +======= +# 56081 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55712 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56091 "parsing/parser.ml" +||||||| 04da777f7 +# 56086 "parsing/parser.ml" +======= +# 56106 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55717 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56096 "parsing/parser.ml" +||||||| 04da777f7 +# 56091 "parsing/parser.ml" +======= +# 56111 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55756 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56135 "parsing/parser.ml" +||||||| 04da777f7 +# 56130 "parsing/parser.ml" +======= +# 56150 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55761 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56140 "parsing/parser.ml" +||||||| 04da777f7 +# 56135 "parsing/parser.ml" +======= +# 56155 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_cty_ in + let _endpos = _endpos_cty_ in + let _v : (Parsetree.core_type list) = let xs = + let x = + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 56167 "parsing/parser.ml" +||||||| 04da777f7 +# 56162 "parsing/parser.ml" + in + let gbl = +# 4864 "parsing/parser.mly" + ( Mode.empty ) +# 56167 "parsing/parser.ml" +======= +# 56182 "parsing/parser.ml" + in + let gbl = +# 4855 "parsing/parser.mly" + ( Mode.empty ) +# 56187 "parsing/parser.ml" +>>>>>>> origin/main + in + let gbl = +# 4871 "parsing/parser.mly" + ( Mode.empty ) +# 56172 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56180 "parsing/parser.ml" +||||||| 04da777f7 +# 56175 "parsing/parser.ml" +======= +# 56195 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 56186 "parsing/parser.ml" +||||||| 04da777f7 +# 56181 "parsing/parser.ml" +======= +# 56201 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56192 "parsing/parser.ml" +||||||| 04da777f7 +# 56187 "parsing/parser.ml" +======= +# 56207 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_cty_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_argument list) = let xs = + let x = +<<<<<<< HEAD + let gbl = +# 4867 "parsing/parser.mly" + ( [] ) +# 55795 "parsing/parser.ml" +======= + let m1 = +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 56226 "parsing/parser.ml" +||||||| 04da777f7 +# 56221 "parsing/parser.ml" + in + let gbl = +# 4864 "parsing/parser.mly" + ( Mode.empty ) +# 56226 "parsing/parser.ml" +======= +# 56241 "parsing/parser.ml" + in + let gbl = +# 4855 "parsing/parser.mly" + ( Mode.empty ) +# 56246 "parsing/parser.ml" +>>>>>>> origin/main + in + let gbl = +# 4871 "parsing/parser.mly" + ( Mode.empty ) +# 56231 "parsing/parser.ml" +>>>>>>> upstream/main + in + let (_endpos_gbl_, _startpos_gbl_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( +<<<<<<< HEAD + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 55810 "parsing/parser.ml" +======= + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56239 "parsing/parser.ml" +||||||| 04da777f7 +# 56234 "parsing/parser.ml" +======= +# 56254 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55816 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56245 "parsing/parser.ml" +||||||| 04da777f7 +# 56240 "parsing/parser.ml" +======= +# 56260 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55822 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56251 "parsing/parser.ml" +||||||| 04da777f7 +# 56246 "parsing/parser.ml" +======= +# 56266 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_cty_ in + let _v : (Parsetree.core_type list) = let xs = + let x = + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 56285 "parsing/parser.ml" +||||||| 04da777f7 +# 56280 "parsing/parser.ml" +======= +# 56300 "parsing/parser.ml" +>>>>>>> origin/main + in + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +<<<<<<< HEAD +# 56294 "parsing/parser.ml" +||||||| 04da777f7 +# 56289 "parsing/parser.ml" +======= +# 56309 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56303 "parsing/parser.ml" +||||||| 04da777f7 +# 56298 "parsing/parser.ml" +======= +# 56318 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 56309 "parsing/parser.ml" +||||||| 04da777f7 +# 56304 "parsing/parser.ml" +======= +# 56324 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56315 "parsing/parser.ml" +||||||| 04da777f7 +# 56310 "parsing/parser.ml" +======= +# 56330 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_argument list) = let xs = + let x = +<<<<<<< HEAD +======= + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 56358 "parsing/parser.ml" +||||||| 04da777f7 +# 56353 "parsing/parser.ml" +======= +# 56373 "parsing/parser.ml" +>>>>>>> origin/main + + in +>>>>>>> upstream/main + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4868 "parsing/parser.mly" + ( [ mkloc (Modality "global") (make_loc _sloc)] ) +# 55867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +<<<<<<< HEAD +# 56368 "parsing/parser.ml" +||||||| 04da777f7 +# 56363 "parsing/parser.ml" +======= +# 56383 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( +<<<<<<< HEAD + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 55883 "parsing/parser.ml" +======= + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56377 "parsing/parser.ml" +||||||| 04da777f7 +# 56372 "parsing/parser.ml" +======= +# 56392 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 55889 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56383 "parsing/parser.ml" +||||||| 04da777f7 +# 56378 "parsing/parser.ml" +======= +# 56398 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55895 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56389 "parsing/parser.ml" +||||||| 04da777f7 +# 56384 "parsing/parser.ml" +======= +# 56404 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.core_type list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_cty_ in + let _v : (Parsetree.core_type list) = let xs = + let x = + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 56430 "parsing/parser.ml" +||||||| 04da777f7 +# 56425 "parsing/parser.ml" + in + let gbl = +# 4864 "parsing/parser.mly" + ( Mode.empty ) +# 56430 "parsing/parser.ml" +======= +# 56445 "parsing/parser.ml" + in + let gbl = +# 4855 "parsing/parser.mly" + ( Mode.empty ) +# 56450 "parsing/parser.ml" +>>>>>>> origin/main + in + let gbl = +# 4871 "parsing/parser.mly" + ( Mode.empty ) +# 56435 "parsing/parser.ml" + in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56443 "parsing/parser.ml" +||||||| 04da777f7 +# 56438 "parsing/parser.ml" +======= +# 56458 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56449 "parsing/parser.ml" +||||||| 04da777f7 +# 56444 "parsing/parser.ml" +======= +# 56464 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56455 "parsing/parser.ml" +||||||| 04da777f7 +# 56450 "parsing/parser.ml" +======= +# 56470 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.constructor_argument list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_argument list) = let xs = + let x = +<<<<<<< HEAD + let _endpos__0_ = _endpos__2_ in + let gbl = +# 4867 "parsing/parser.mly" + ( [] ) +# 55944 "parsing/parser.ml" +======= + let m1 = +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 56503 "parsing/parser.ml" +||||||| 04da777f7 +# 56498 "parsing/parser.ml" + in + let gbl = +# 4864 "parsing/parser.mly" + ( Mode.empty ) +# 56503 "parsing/parser.ml" +======= +# 56518 "parsing/parser.ml" + in + let gbl = +# 4855 "parsing/parser.mly" + ( Mode.empty ) +# 56523 "parsing/parser.ml" +>>>>>>> origin/main + in + let gbl = +# 4871 "parsing/parser.mly" + ( Mode.empty ) +# 56508 "parsing/parser.ml" +>>>>>>> upstream/main + in + let (_endpos_gbl_, _startpos_gbl_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( +<<<<<<< HEAD + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 55959 "parsing/parser.ml" +======= + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56516 "parsing/parser.ml" +||||||| 04da777f7 +# 56511 "parsing/parser.ml" +======= +# 56531 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 55965 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56522 "parsing/parser.ml" +||||||| 04da777f7 +# 56517 "parsing/parser.ml" +======= +# 56537 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 55971 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56528 "parsing/parser.ml" +||||||| 04da777f7 +# 56523 "parsing/parser.ml" +======= +# 56543 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; +<<<<<<< HEAD + MenhirLib.EngineTypes.semv = m1; + MenhirLib.EngineTypes.startp = _startpos_m1_; + MenhirLib.EngineTypes.endp = _endpos_m1_; +======= + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.core_type list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_cty_ in + let _v : (Parsetree.core_type list) = let xs = + let x = + let m1 = +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 56576 "parsing/parser.ml" +||||||| 04da777f7 +# 56571 "parsing/parser.ml" +======= +# 56591 "parsing/parser.ml" +>>>>>>> origin/main + in + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +<<<<<<< HEAD +# 56585 "parsing/parser.ml" +||||||| 04da777f7 +# 56580 "parsing/parser.ml" +======= +# 56600 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56594 "parsing/parser.ml" +||||||| 04da777f7 +# 56589 "parsing/parser.ml" +======= +# 56609 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56600 "parsing/parser.ml" +||||||| 04da777f7 +# 56595 "parsing/parser.ml" +======= +# 56615 "parsing/parser.ml" +>>>>>>> origin/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56606 "parsing/parser.ml" +||||||| 04da777f7 +# 56601 "parsing/parser.ml" +======= +# 56621 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; +>>>>>>> upstream/main + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let m1 : (Parsetree.modality Ast_helper.with_loc list) = Obj.magic m1 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.constructor_argument list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_m1_ in + let _v : (Parsetree.constructor_argument list) = let xs = + let x = +<<<<<<< HEAD +======= + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 56663 "parsing/parser.ml" +||||||| 04da777f7 +# 56658 "parsing/parser.ml" +======= +# 56678 "parsing/parser.ml" +>>>>>>> origin/main + + in +>>>>>>> upstream/main + let gbl = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4868 "parsing/parser.mly" + ( [ mkloc (Modality "global") (make_loc _sloc)] ) +# 56030 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4872 "parsing/parser.mly" +||||||| 04da777f7 +# 4865 "parsing/parser.mly" +======= +# 4856 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.singleton (Mode.Const.mk "global" (make_loc _sloc)) ) +<<<<<<< HEAD +# 56673 "parsing/parser.ml" +||||||| 04da777f7 +# 56668 "parsing/parser.ml" +======= +# 56688 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_gbl_, _startpos_gbl_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos_m1_ in + let _symbolstartpos = if _startpos_gbl_ != _endpos_gbl_ then + _startpos_gbl_ + else + _startpos_cty_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4063 "parsing/parser.mly" +||||||| 04da777f7 +# 4056 "parsing/parser.mly" +======= +# 4047 "parsing/parser.mly" +>>>>>>> origin/main + ( +<<<<<<< HEAD + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc _sloc) + ) +# 56046 "parsing/parser.ml" +======= + let m = Mode.concat gbl m1 in + mktyp_with_modes m cty +) +<<<<<<< HEAD +# 56682 "parsing/parser.ml" +||||||| 04da777f7 +# 56677 "parsing/parser.ml" +======= +# 56697 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56052 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56688 "parsing/parser.ml" +||||||| 04da777f7 +# 56683 "parsing/parser.ml" +======= +# 56703 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56058 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56694 "parsing/parser.ml" +||||||| 04da777f7 +# 56689 "parsing/parser.ml" +======= +# 56709 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : ((string option * Parsetree.core_type) list) = let xs = + let x = +<<<<<<< HEAD +# 4464 "parsing/parser.mly" + ( None, _1 ) +# 56084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4468 "parsing/parser.mly" +||||||| 04da777f7 +# 4461 "parsing/parser.mly" +======= +# 4452 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 56720 "parsing/parser.ml" +||||||| 04da777f7 +# 56715 "parsing/parser.ml" +======= +# 56735 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 56089 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56725 "parsing/parser.ml" +||||||| 04da777f7 +# 56720 "parsing/parser.ml" +======= +# 56740 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56095 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56731 "parsing/parser.ml" +||||||| 04da777f7 +# 56726 "parsing/parser.ml" +======= +# 56746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 56130 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56766 "parsing/parser.ml" +||||||| 04da777f7 +# 56761 "parsing/parser.ml" +======= +# 56781 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : ((string option * Parsetree.core_type) list) = let xs = + let x = +<<<<<<< HEAD +# 4466 "parsing/parser.mly" + ( Some label, ty ) +# 56139 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4470 "parsing/parser.mly" +||||||| 04da777f7 +# 4463 "parsing/parser.mly" +======= +# 4454 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, ty ) +<<<<<<< HEAD +# 56775 "parsing/parser.ml" +||||||| 04da777f7 +# 56770 "parsing/parser.ml" +======= +# 56790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1336 "parsing/parser.mly" + ( [ x ] ) +<<<<<<< HEAD +# 56144 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56780 "parsing/parser.ml" +||||||| 04da777f7 +# 56775 "parsing/parser.ml" +======= +# 56795 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56150 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56786 "parsing/parser.ml" +||||||| 04da777f7 +# 56781 "parsing/parser.ml" +======= +# 56801 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in + let _v : ((string option * Parsetree.core_type) list) = let xs = + let x = +<<<<<<< HEAD +# 4464 "parsing/parser.mly" + ( None, _1 ) +# 56190 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4468 "parsing/parser.mly" +||||||| 04da777f7 +# 4461 "parsing/parser.mly" +======= +# 4452 "parsing/parser.mly" +>>>>>>> origin/main + ( None, _1 ) +<<<<<<< HEAD +# 56826 "parsing/parser.ml" +||||||| 04da777f7 +# 56821 "parsing/parser.ml" +======= +# 56841 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56195 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56831 "parsing/parser.ml" +||||||| 04da777f7 +# 56826 "parsing/parser.ml" +======= +# 56846 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56201 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56837 "parsing/parser.ml" +||||||| 04da777f7 +# 56832 "parsing/parser.ml" +======= +# 56852 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 56248 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56884 "parsing/parser.ml" +||||||| 04da777f7 +# 56879 "parsing/parser.ml" +======= +# 56899 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_ty_ in + let _v : ((string option * Parsetree.core_type) list) = let xs = + let x = +<<<<<<< HEAD +# 4466 "parsing/parser.mly" + ( Some label, ty ) +# 56259 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4470 "parsing/parser.mly" +||||||| 04da777f7 +# 4463 "parsing/parser.mly" +======= +# 4454 "parsing/parser.mly" +>>>>>>> origin/main + ( Some label, ty ) +<<<<<<< HEAD +# 56895 "parsing/parser.ml" +||||||| 04da777f7 +# 56890 "parsing/parser.ml" +======= +# 56910 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1340 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56264 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56900 "parsing/parser.ml" +||||||| 04da777f7 +# 56895 "parsing/parser.ml" +======= +# 56915 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1344 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56270 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56906 "parsing/parser.ml" +||||||| 04da777f7 +# 56901 "parsing/parser.ml" +======= +# 56921 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.core_type) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.core_type list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.core_type list) = +# 1367 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56309 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56945 "parsing/parser.ml" +||||||| 04da777f7 +# 56940 "parsing/parser.ml" +======= +# 56960 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x2; + MenhirLib.EngineTypes.startp = _startpos_x2_; + MenhirLib.EngineTypes.endp = _endpos_x2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x2 : (Parsetree.core_type) = Obj.magic x2 in + let _2 : unit = Obj.magic _2 in + let x1 : (Parsetree.core_type) = Obj.magic x1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x1_ in + let _endpos = _endpos_x2_ in + let _v : (Parsetree.core_type list) = +# 1371 "parsing/parser.mly" + ( [ x2; x1 ] ) +<<<<<<< HEAD +# 56348 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 56984 "parsing/parser.ml" +||||||| 04da777f7 +# 56979 "parsing/parser.ml" +======= +# 56999 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.row_field) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.row_field) = +<<<<<<< HEAD +# 4556 "parsing/parser.mly" + ( _1 ) +# 56373 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4560 "parsing/parser.mly" +||||||| 04da777f7 +# 4553 "parsing/parser.mly" +======= +# 4544 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57009 "parsing/parser.ml" +||||||| 04da777f7 +# 57004 "parsing/parser.ml" +======= +# 57024 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.row_field) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4558 "parsing/parser.mly" + ( Rf.inherit_ ~loc:(make_loc _sloc) _1 ) +# 56401 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4562 "parsing/parser.mly" +||||||| 04da777f7 +# 4555 "parsing/parser.mly" +======= +# 4546 "parsing/parser.mly" +>>>>>>> origin/main + ( Rf.inherit_ ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 57037 "parsing/parser.ml" +||||||| 04da777f7 +# 57032 "parsing/parser.ml" +======= +# 57052 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression list) = let _2 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 56426 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57062 "parsing/parser.ml" +||||||| 04da777f7 +# 57057 "parsing/parser.ml" +======= +# 57077 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56432 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57068 "parsing/parser.ml" +||||||| 04da777f7 +# 57063 "parsing/parser.ml" +======= +# 57083 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56437 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57073 "parsing/parser.ml" +||||||| 04da777f7 +# 57068 "parsing/parser.ml" +======= +# 57088 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 56443 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57079 "parsing/parser.ml" +||||||| 04da777f7 +# 57074 "parsing/parser.ml" +======= +# 57094 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : unit = Obj.magic x in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.expression list) = let _2 = +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 56475 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57111 "parsing/parser.ml" +||||||| 04da777f7 +# 57106 "parsing/parser.ml" +======= +# 57126 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56481 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57117 "parsing/parser.ml" +||||||| 04da777f7 +# 57112 "parsing/parser.ml" +======= +# 57132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56486 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57122 "parsing/parser.ml" +||||||| 04da777f7 +# 57117 "parsing/parser.ml" +======= +# 57137 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 56492 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57128 "parsing/parser.ml" +||||||| 04da777f7 +# 57123 "parsing/parser.ml" +======= +# 57143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression list) = let _2 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 56538 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57174 "parsing/parser.ml" +||||||| 04da777f7 +# 57169 "parsing/parser.ml" +======= +# 57189 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 56547 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57183 "parsing/parser.ml" +||||||| 04da777f7 +# 57178 "parsing/parser.ml" +======= +# 57198 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56552 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57188 "parsing/parser.ml" +||||||| 04da777f7 +# 57183 "parsing/parser.ml" +======= +# 57203 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 56558 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57194 "parsing/parser.ml" +||||||| 04da777f7 +# 57189 "parsing/parser.ml" +======= +# 57209 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 56569 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 56575 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57205 "parsing/parser.ml" +||||||| 04da777f7 +# 57200 "parsing/parser.ml" +======= +# 57220 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 57211 "parsing/parser.ml" +||||||| 04da777f7 +# 57206 "parsing/parser.ml" +======= +# 57226 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 56588 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57224 "parsing/parser.ml" +||||||| 04da777f7 +# 57219 "parsing/parser.ml" +======= +# 57239 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56594 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57230 "parsing/parser.ml" +||||||| 04da777f7 +# 57225 "parsing/parser.ml" +======= +# 57245 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 56600 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57236 "parsing/parser.ml" +||||||| 04da777f7 +# 57231 "parsing/parser.ml" +======= +# 57251 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let x : unit = Obj.magic x in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.expression list) = let _2 = +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 56653 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57289 "parsing/parser.ml" +||||||| 04da777f7 +# 57284 "parsing/parser.ml" +======= +# 57304 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 56662 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57298 "parsing/parser.ml" +||||||| 04da777f7 +# 57293 "parsing/parser.ml" +======= +# 57313 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56667 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57303 "parsing/parser.ml" +||||||| 04da777f7 +# 57298 "parsing/parser.ml" +======= +# 57318 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 56673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57309 "parsing/parser.ml" +||||||| 04da777f7 +# 57304 "parsing/parser.ml" +======= +# 57324 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 56684 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 56690 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57320 "parsing/parser.ml" +||||||| 04da777f7 +# 57315 "parsing/parser.ml" +======= +# 57335 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 57326 "parsing/parser.ml" +||||||| 04da777f7 +# 57321 "parsing/parser.ml" +======= +# 57341 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 56703 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57339 "parsing/parser.ml" +||||||| 04da777f7 +# 57334 "parsing/parser.ml" +======= +# 57354 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57345 "parsing/parser.ml" +||||||| 04da777f7 +# 57340 "parsing/parser.ml" +======= +# 57360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 56715 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57351 "parsing/parser.ml" +||||||| 04da777f7 +# 57346 "parsing/parser.ml" +======= +# 57366 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.expression list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression list) = let x = + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56755 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57391 "parsing/parser.ml" +||||||| 04da777f7 +# 57386 "parsing/parser.ml" +======= +# 57406 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56760 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57396 "parsing/parser.ml" +||||||| 04da777f7 +# 57391 "parsing/parser.ml" +======= +# 57411 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1392 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57402 "parsing/parser.ml" +||||||| 04da777f7 +# 57397 "parsing/parser.ml" +======= +# 57417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.expression list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression list) = let x = + let (_endpos_xs_, xs) = (_endpos_xs_inlined1_, xs_inlined1) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 56831 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57467 "parsing/parser.ml" +||||||| 04da777f7 +# 57462 "parsing/parser.ml" +======= +# 57482 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 56836 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57472 "parsing/parser.ml" +||||||| 04da777f7 +# 57467 "parsing/parser.ml" +======= +# 57487 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 56842 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57478 "parsing/parser.ml" +||||||| 04da777f7 +# 57473 "parsing/parser.ml" +======= +# 57493 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 56853 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 56859 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57489 "parsing/parser.ml" +||||||| 04da777f7 +# 57484 "parsing/parser.ml" +======= +# 57504 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 57495 "parsing/parser.ml" +||||||| 04da777f7 +# 57490 "parsing/parser.ml" +======= +# 57510 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 56872 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57508 "parsing/parser.ml" +||||||| 04da777f7 +# 57503 "parsing/parser.ml" +======= +# 57523 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 56878 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57514 "parsing/parser.ml" +||||||| 04da777f7 +# 57509 "parsing/parser.ml" +======= +# 57529 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1392 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 56884 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57520 "parsing/parser.ml" +||||||| 04da777f7 +# 57515 "parsing/parser.ml" +======= +# 57535 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = oe; + MenhirLib.EngineTypes.startp = _startpos_oe_; + MenhirLib.EngineTypes.endp = _endpos_oe_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let oe : (Parsetree.expression option) = Obj.magic oe in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 56912 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57548 "parsing/parser.ml" +||||||| 04da777f7 +# 57543 "parsing/parser.ml" +======= +# 57563 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_oe_ in + let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 56920 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57556 "parsing/parser.ml" +||||||| 04da777f7 +# 57551 "parsing/parser.ml" +======= +# 57571 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let label = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 56927 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57563 "parsing/parser.ml" +||||||| 04da777f7 +# 57558 "parsing/parser.ml" +======= +# 57578 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 56935 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57571 "parsing/parser.ml" +||||||| 04da777f7 +# 57566 "parsing/parser.ml" +======= +# 57586 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3417 "parsing/parser.mly" +||||||| 04da777f7 +# 3415 "parsing/parser.mly" +======= +# 3405 "parsing/parser.mly" +>>>>>>> origin/main + ( let label, e = + match oe with + | None -> + (* No expression; this is a pun. Desugar it. *) + make_ghost label, exp_of_label label + | Some e -> + label, e + in + label, e ) +<<<<<<< HEAD +# 56949 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57585 "parsing/parser.ml" +||||||| 04da777f7 +# 57580 "parsing/parser.ml" +======= +# 57600 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 56955 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57591 "parsing/parser.ml" +||||||| 04da777f7 +# 57586 "parsing/parser.ml" +======= +# 57606 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = oe; + MenhirLib.EngineTypes.startp = _startpos_oe_; + MenhirLib.EngineTypes.endp = _endpos_oe_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : unit = Obj.magic x in + let oe : (Parsetree.expression option) = Obj.magic oe in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 56990 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57626 "parsing/parser.ml" +||||||| 04da777f7 +# 57621 "parsing/parser.ml" +======= +# 57641 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 56998 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57634 "parsing/parser.ml" +||||||| 04da777f7 +# 57629 "parsing/parser.ml" +======= +# 57649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let label = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 57005 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57641 "parsing/parser.ml" +||||||| 04da777f7 +# 57636 "parsing/parser.ml" +======= +# 57656 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 57013 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57649 "parsing/parser.ml" +||||||| 04da777f7 +# 57644 "parsing/parser.ml" +======= +# 57664 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3417 "parsing/parser.mly" +||||||| 04da777f7 +# 3415 "parsing/parser.mly" +======= +# 3405 "parsing/parser.mly" +>>>>>>> origin/main + ( let label, e = + match oe with + | None -> + (* No expression; this is a pun. Desugar it. *) + make_ghost label, exp_of_label label + | Some e -> + label, e + in + label, e ) +<<<<<<< HEAD +# 57027 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57663 "parsing/parser.ml" +||||||| 04da777f7 +# 57658 "parsing/parser.ml" +======= +# 57678 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 57033 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57669 "parsing/parser.ml" +||||||| 04da777f7 +# 57664 "parsing/parser.ml" +======= +# 57684 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = oe; + MenhirLib.EngineTypes.startp = _startpos_oe_; + MenhirLib.EngineTypes.endp = _endpos_oe_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let xs : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let oe : (Parsetree.expression option) = Obj.magic oe in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 57075 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57711 "parsing/parser.ml" +||||||| 04da777f7 +# 57706 "parsing/parser.ml" +======= +# 57726 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let x = + let label = + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 57085 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57721 "parsing/parser.ml" +||||||| 04da777f7 +# 57716 "parsing/parser.ml" +======= +# 57736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 57093 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57729 "parsing/parser.ml" +||||||| 04da777f7 +# 57724 "parsing/parser.ml" +======= +# 57744 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3417 "parsing/parser.mly" +||||||| 04da777f7 +# 3415 "parsing/parser.mly" +======= +# 3405 "parsing/parser.mly" +>>>>>>> origin/main + ( let label, e = + match oe with + | None -> + (* No expression; this is a pun. Desugar it. *) + make_ghost label, exp_of_label label + | Some e -> + label, e + in + label, e ) +<<<<<<< HEAD +# 57107 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57743 "parsing/parser.ml" +||||||| 04da777f7 +# 57738 "parsing/parser.ml" +======= +# 57758 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1392 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 57113 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57749 "parsing/parser.ml" +||||||| 04da777f7 +# 57744 "parsing/parser.ml" +======= +# 57764 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.pattern) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.pattern list) = let _2 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 57138 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57774 "parsing/parser.ml" +||||||| 04da777f7 +# 57769 "parsing/parser.ml" +======= +# 57789 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 57143 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57779 "parsing/parser.ml" +||||||| 04da777f7 +# 57774 "parsing/parser.ml" +======= +# 57794 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x_inlined1; + MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x_inlined1 : unit = Obj.magic x_inlined1 in + let x : (Parsetree.pattern) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_inlined1_ in + let _v : (Parsetree.pattern list) = let _2 = + let x = x_inlined1 in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 57177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57813 "parsing/parser.ml" +||||||| 04da777f7 +# 57808 "parsing/parser.ml" +======= +# 57828 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 57183 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57819 "parsing/parser.ml" +||||||| 04da777f7 +# 57814 "parsing/parser.ml" +======= +# 57834 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.pattern list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.pattern) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.pattern list) = +# 1392 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 57222 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57858 "parsing/parser.ml" +||||||| 04da777f7 +# 57853 "parsing/parser.ml" +======= +# 57873 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = eo; + MenhirLib.EngineTypes.startp = _startpos_eo_; + MenhirLib.EngineTypes.endp = _endpos_eo_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let eo : (Parsetree.expression option) = Obj.magic eo in + let c : (N_ary.type_constraint option) = Obj.magic c in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_eo_ in + let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 57261 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57897 "parsing/parser.ml" +||||||| 04da777f7 +# 57892 "parsing/parser.ml" +======= +# 57912 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 57271 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57907 "parsing/parser.ml" +||||||| 04da777f7 +# 57902 "parsing/parser.ml" +======= +# 57922 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_eo_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3400 "parsing/parser.mly" +||||||| 04da777f7 +# 3398 "parsing/parser.mly" +======= +# 3388 "parsing/parser.mly" +>>>>>>> origin/main + ( let constraint_loc, label, e = + match eo with + | None -> + (* No pattern; this is a pun. Desugar it. *) + _sloc, make_ghost label, exp_of_longident label + | Some e -> + (_startpos_c_, _endpos), label, e + in + label, mkexp_opt_type_constraint ~loc:constraint_loc e c ) +<<<<<<< HEAD +# 57289 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57925 "parsing/parser.ml" +||||||| 04da777f7 +# 57920 "parsing/parser.ml" +======= +# 57940 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 57295 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57931 "parsing/parser.ml" +||||||| 04da777f7 +# 57926 "parsing/parser.ml" +======= +# 57946 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = eo; + MenhirLib.EngineTypes.startp = _startpos_eo_; + MenhirLib.EngineTypes.endp = _endpos_eo_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let x : unit = Obj.magic x in + let eo : (Parsetree.expression option) = Obj.magic eo in + let c : (N_ary.type_constraint option) = Obj.magic c in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 57341 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57977 "parsing/parser.ml" +||||||| 04da777f7 +# 57972 "parsing/parser.ml" +======= +# 57992 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 57351 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 57987 "parsing/parser.ml" +||||||| 04da777f7 +# 57982 "parsing/parser.ml" +======= +# 58002 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_eo_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3400 "parsing/parser.mly" +||||||| 04da777f7 +# 3398 "parsing/parser.mly" +======= +# 3388 "parsing/parser.mly" +>>>>>>> origin/main + ( let constraint_loc, label, e = + match eo with + | None -> + (* No pattern; this is a pun. Desugar it. *) + _sloc, make_ghost label, exp_of_longident label + | Some e -> + (_startpos_c_, _endpos), label, e + in + label, mkexp_opt_type_constraint ~loc:constraint_loc e c ) +<<<<<<< HEAD +# 57369 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58005 "parsing/parser.ml" +||||||| 04da777f7 +# 58000 "parsing/parser.ml" +======= +# 58020 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1388 "parsing/parser.mly" + ( [x] ) +<<<<<<< HEAD +# 57375 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58011 "parsing/parser.ml" +||||||| 04da777f7 +# 58006 "parsing/parser.ml" +======= +# 58026 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = eo; + MenhirLib.EngineTypes.startp = _startpos_eo_; + MenhirLib.EngineTypes.endp = _endpos_eo_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let xs : ((Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let eo : (Parsetree.expression option) = Obj.magic eo in + let c : (N_ary.type_constraint option) = Obj.magic c in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 57433 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58069 "parsing/parser.ml" +||||||| 04da777f7 +# 58064 "parsing/parser.ml" +======= +# 58084 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_eo_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3400 "parsing/parser.mly" +||||||| 04da777f7 +# 3398 "parsing/parser.mly" +======= +# 3388 "parsing/parser.mly" +>>>>>>> origin/main + ( let constraint_loc, label, e = + match eo with + | None -> + (* No pattern; this is a pun. Desugar it. *) + _sloc, make_ghost label, exp_of_longident label + | Some e -> + (_startpos_c_, _endpos), label, e + in + label, mkexp_opt_type_constraint ~loc:constraint_loc e c ) +<<<<<<< HEAD +# 57451 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58087 "parsing/parser.ml" +||||||| 04da777f7 +# 58082 "parsing/parser.ml" +======= +# 58102 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1392 "parsing/parser.mly" + ( x :: xs ) +<<<<<<< HEAD +# 57457 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58093 "parsing/parser.ml" +||||||| 04da777f7 +# 58088 "parsing/parser.ml" +======= +# 58108 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57482 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58118 "parsing/parser.ml" +||||||| 04da777f7 +# 58113 "parsing/parser.ml" +======= +# 58133 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2605 "parsing/parser.mly" +||||||| 04da777f7 +# 2603 "parsing/parser.mly" +======= +# 2593 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57487 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58123 "parsing/parser.ml" +||||||| 04da777f7 +# 58118 "parsing/parser.ml" +======= +# 58138 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.expression) = let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 57536 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58172 "parsing/parser.ml" +||||||| 04da777f7 +# 58167 "parsing/parser.ml" +======= +# 58187 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 57541 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58177 "parsing/parser.ml" +||||||| 04da777f7 +# 58172 "parsing/parser.ml" +======= +# 58192 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 57547 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58183 "parsing/parser.ml" +||||||| 04da777f7 +# 58178 "parsing/parser.ml" +======= +# 58198 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 57558 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 57564 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58194 "parsing/parser.ml" +||||||| 04da777f7 +# 58189 "parsing/parser.ml" +======= +# 58209 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 58200 "parsing/parser.ml" +||||||| 04da777f7 +# 58195 "parsing/parser.ml" +======= +# 58215 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 57577 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58213 "parsing/parser.ml" +||||||| 04da777f7 +# 58208 "parsing/parser.ml" +======= +# 58228 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2605 "parsing/parser.mly" +||||||| 04da777f7 +# 2603 "parsing/parser.mly" +======= +# 2593 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57583 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58219 "parsing/parser.ml" +||||||| 04da777f7 +# 58214 "parsing/parser.ml" +======= +# 58234 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = vars_args_res; + MenhirLib.EngineTypes.startp = _startpos_vars_args_res_; + MenhirLib.EngineTypes.endp = _endpos_vars_args_res_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let vars_args_res : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list * + Parsetree.constructor_arguments * Parsetree.core_type option) = Obj.magic vars_args_res in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 57653 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58289 "parsing/parser.ml" +||||||| 04da777f7 +# 58284 "parsing/parser.ml" +======= +# 58304 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs_ = _endpos__1_inlined4_ in + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 57662 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58298 "parsing/parser.ml" +||||||| 04da777f7 +# 58293 "parsing/parser.ml" +======= +# 58313 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 57674 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58310 "parsing/parser.ml" +||||||| 04da777f7 +# 58305 "parsing/parser.ml" +======= +# 58325 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 57682 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58318 "parsing/parser.ml" +||||||| 04da777f7 +# 58313 "parsing/parser.ml" +======= +# 58333 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs_ in + let _startpos = _startpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4028 "parsing/parser.mly" +||||||| 04da777f7 +# 4021 "parsing/parser.mly" +======= +# 4012 "parsing/parser.mly" +>>>>>>> origin/main + ( let vars_jkinds, args, res = vars_args_res in + let loc = make_loc (_startpos, _endpos_attrs2_) in + let docs = symbol_docs _sloc in + let ext_ctor = + Jane_syntax.Extension_constructor.extension_constructor_of + ~loc ~name:id ~attrs:(attrs1 @ attrs2) ~docs + (Jext_layout (Lext_decl (vars_jkinds, args, res))) + in + Te.mk_exception ~attrs ext_ctor, ext ) +<<<<<<< HEAD +# 57700 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58336 "parsing/parser.ml" +||||||| 04da777f7 +# 58331 "parsing/parser.ml" +======= +# 58351 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xss; + MenhirLib.EngineTypes.startp = _startpos_xss_; + MenhirLib.EngineTypes.endp = _endpos_xss_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let xss : (Parsetree.signature_item list list) = Obj.magic xss in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xss_ in + let _endpos = _endpos_xss_ in + let _v : (Parsetree.signature) = let _1 = + let _1 = +# 260 "" + ( List.flatten xss ) +<<<<<<< HEAD +# 57726 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58362 "parsing/parser.ml" +||||||| 04da777f7 +# 58357 "parsing/parser.ml" +======= +# 58377 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + +# 1188 "parsing/parser.mly" + ( extra_sig _startpos _endpos _1 ) +<<<<<<< HEAD +# 57734 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58370 "parsing/parser.ml" +||||||| 04da777f7 +# 58365 "parsing/parser.ml" +======= +# 58385 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2007 "parsing/parser.mly" +||||||| 04da777f7 +# 2006 "parsing/parser.mly" +======= +# 1996 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57740 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58376 "parsing/parser.ml" +||||||| 04da777f7 +# 58371 "parsing/parser.ml" +======= +# 58391 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : (Parsetree.extension) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.signature_item) = let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 57774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58410 "parsing/parser.ml" +||||||| 04da777f7 +# 58405 "parsing/parser.ml" +======= +# 58425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__2_ = _endpos__1_inlined1_ in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2022 "parsing/parser.mly" +||||||| 04da777f7 +# 2021 "parsing/parser.mly" +======= +# 2011 "parsing/parser.mly" +>>>>>>> origin/main + ( let docs = symbol_docs _sloc in + mksig ~loc:_sloc (Psig_extension (_1, (add_docs_attrs docs _2))) ) +<<<<<<< HEAD +# 57785 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58421 "parsing/parser.ml" +||||||| 04da777f7 +# 58416 "parsing/parser.ml" +======= +# 58436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.attribute) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2026 "parsing/parser.mly" +||||||| 04da777f7 +# 2025 "parsing/parser.mly" +======= +# 2015 "parsing/parser.mly" +>>>>>>> origin/main + ( Psig_attribute _1 ) +<<<<<<< HEAD +# 57811 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58447 "parsing/parser.ml" +||||||| 04da777f7 +# 58442 "parsing/parser.ml" +======= +# 58462 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1236 "parsing/parser.mly" + ( mksig ~loc:_sloc _1 ) +<<<<<<< HEAD +# 57819 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58455 "parsing/parser.ml" +||||||| 04da777f7 +# 58450 "parsing/parser.ml" +======= +# 58470 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2028 "parsing/parser.mly" +||||||| 04da777f7 +# 2027 "parsing/parser.mly" +======= +# 2017 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57825 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58461 "parsing/parser.ml" +||||||| 04da777f7 +# 58456 "parsing/parser.ml" +======= +# 58476 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.value_description * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2031 "parsing/parser.mly" +||||||| 04da777f7 +# 2030 "parsing/parser.mly" +======= +# 2020 "parsing/parser.mly" +>>>>>>> origin/main + ( psig_value _1 ) +<<<<<<< HEAD +# 57851 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58487 "parsing/parser.ml" +||||||| 04da777f7 +# 58482 "parsing/parser.ml" +======= +# 58502 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 57859 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58495 "parsing/parser.ml" +||||||| 04da777f7 +# 58490 "parsing/parser.ml" +======= +# 58510 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57865 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58501 "parsing/parser.ml" +||||||| 04da777f7 +# 58496 "parsing/parser.ml" +======= +# 58516 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.value_description * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2033 "parsing/parser.mly" +||||||| 04da777f7 +# 2032 "parsing/parser.mly" +======= +# 2022 "parsing/parser.mly" +>>>>>>> origin/main + ( psig_value _1 ) +<<<<<<< HEAD +# 57891 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58527 "parsing/parser.ml" +||||||| 04da777f7 +# 58522 "parsing/parser.ml" +======= +# 58542 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 57899 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58535 "parsing/parser.ml" +||||||| 04da777f7 +# 58530 "parsing/parser.ml" +======= +# 58550 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57905 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58541 "parsing/parser.ml" +||||||| 04da777f7 +# 58536 "parsing/parser.ml" +======= +# 58556 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = bs; + MenhirLib.EngineTypes.startp = _startpos_bs_; + MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = a; + MenhirLib.EngineTypes.startp = _startpos_a_; + MenhirLib.EngineTypes.endp = _endpos_a_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let bs : (Parsetree.type_declaration list) = Obj.magic bs in + let a : ((Asttypes.rec_flag * string Asttypes.loc option) * + Parsetree.type_declaration) = Obj.magic a in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_a_ in + let _endpos = _endpos_bs_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let _1 = + let _1 = +# 1449 "parsing/parser.mly" + ( let (x, b) = a in x, b :: bs ) +<<<<<<< HEAD +# 57942 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58578 "parsing/parser.ml" + in + +# 3778 "parsing/parser.mly" + ( _1 ) +# 58583 "parsing/parser.ml" +||||||| 04da777f7 +# 58573 "parsing/parser.ml" + in + +# 3776 "parsing/parser.mly" + ( _1 ) +# 58578 "parsing/parser.ml" +======= +# 58593 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 3767 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 57947 "parsing/parser.ml" +======= +# 58598 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3761 "parsing/parser.mly" +||||||| 04da777f7 +# 3759 "parsing/parser.mly" +======= +# 3750 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57953 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58589 "parsing/parser.ml" +||||||| 04da777f7 +# 58584 "parsing/parser.ml" +======= +# 58604 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2035 "parsing/parser.mly" +||||||| 04da777f7 +# 2034 "parsing/parser.mly" +======= +# 2024 "parsing/parser.mly" +>>>>>>> origin/main + ( psig_type _1 ) +<<<<<<< HEAD +# 57959 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58595 "parsing/parser.ml" +||||||| 04da777f7 +# 58590 "parsing/parser.ml" +======= +# 58610 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 57969 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58605 "parsing/parser.ml" +||||||| 04da777f7 +# 58600 "parsing/parser.ml" +======= +# 58620 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 57975 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58611 "parsing/parser.ml" +||||||| 04da777f7 +# 58606 "parsing/parser.ml" +======= +# 58626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = bs; + MenhirLib.EngineTypes.startp = _startpos_bs_; + MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = a; + MenhirLib.EngineTypes.startp = _startpos_a_; + MenhirLib.EngineTypes.endp = _endpos_a_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let bs : (Parsetree.type_declaration list) = Obj.magic bs in + let a : ((Asttypes.rec_flag * string Asttypes.loc option) * + Parsetree.type_declaration) = Obj.magic a in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_a_ in + let _endpos = _endpos_bs_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let _1 = + let _1 = +# 1449 "parsing/parser.mly" + ( let (x, b) = a in x, b :: bs ) +<<<<<<< HEAD +# 58012 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58648 "parsing/parser.ml" +||||||| 04da777f7 +# 58643 "parsing/parser.ml" +======= +# 58663 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3778 "parsing/parser.mly" +||||||| 04da777f7 +# 3776 "parsing/parser.mly" +======= +# 3767 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58017 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58653 "parsing/parser.ml" +||||||| 04da777f7 +# 58648 "parsing/parser.ml" +======= +# 58668 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3766 "parsing/parser.mly" +||||||| 04da777f7 +# 3764 "parsing/parser.mly" +======= +# 3755 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58023 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58659 "parsing/parser.ml" +||||||| 04da777f7 +# 58654 "parsing/parser.ml" +======= +# 58674 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2037 "parsing/parser.mly" +||||||| 04da777f7 +# 2036 "parsing/parser.mly" +======= +# 2026 "parsing/parser.mly" +>>>>>>> origin/main + ( psig_typesubst _1 ) +<<<<<<< HEAD +# 58029 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58665 "parsing/parser.ml" +||||||| 04da777f7 +# 58660 "parsing/parser.ml" +======= +# 58680 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58039 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58675 "parsing/parser.ml" +||||||| 04da777f7 +# 58670 "parsing/parser.ml" +======= +# 58690 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58045 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58681 "parsing/parser.ml" +||||||| 04da777f7 +# 58676 "parsing/parser.ml" +======= +# 58696 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = priv; + MenhirLib.EngineTypes.startp = _startpos_priv_; + MenhirLib.EngineTypes.endp = _endpos_priv_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let priv : (Asttypes.private_flag) = Obj.magic priv in + let _7 : unit = Obj.magic _7 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let _1 = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 58132 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58768 "parsing/parser.ml" +||||||| 04da777f7 +# 58763 "parsing/parser.ml" +======= +# 58783 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let cs = +# 1441 "parsing/parser.mly" + ( List.rev xs ) +<<<<<<< HEAD +# 58139 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58775 "parsing/parser.ml" +||||||| 04da777f7 +# 58770 "parsing/parser.ml" +======= +# 58790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let tid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 58149 "parsing/parser.ml" + + in + let _4 = +# 4837 "parsing/parser.mly" + ( Recursive ) +# 58155 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58785 "parsing/parser.ml" +||||||| 04da777f7 +# 58780 "parsing/parser.ml" +======= +# 58800 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _4 = +<<<<<<< HEAD +# 4841 "parsing/parser.mly" +||||||| 04da777f7 +# 4834 "parsing/parser.mly" +======= +# 4825 "parsing/parser.mly" +>>>>>>> origin/main + ( Recursive ) +<<<<<<< HEAD +# 58791 "parsing/parser.ml" +||||||| 04da777f7 +# 58786 "parsing/parser.ml" +======= +# 58806 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 58162 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58798 "parsing/parser.ml" +||||||| 04da777f7 +# 58793 "parsing/parser.ml" +======= +# 58813 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4105 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4124 "parsing/parser.mly" +||||||| 04da777f7 +# 4117 "parsing/parser.mly" +======= +# 4108 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + Te.mk tid cs ~params ~priv ~attrs ~docs, + ext ) +<<<<<<< HEAD +# 58174 "parsing/parser.ml" + + in + +# 4092 "parsing/parser.mly" + ( _1 ) +# 58180 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58810 "parsing/parser.ml" +||||||| 04da777f7 +# 58805 "parsing/parser.ml" +======= +# 58825 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4111 "parsing/parser.mly" +||||||| 04da777f7 +# 4104 "parsing/parser.mly" +======= +# 4095 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58816 "parsing/parser.ml" +||||||| 04da777f7 +# 58811 "parsing/parser.ml" +======= +# 58831 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2039 "parsing/parser.mly" +||||||| 04da777f7 +# 2038 "parsing/parser.mly" +======= +# 2028 "parsing/parser.mly" +>>>>>>> origin/main + ( psig_typext _1 ) +<<<<<<< HEAD +# 58186 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58822 "parsing/parser.ml" +||||||| 04da777f7 +# 58817 "parsing/parser.ml" +======= +# 58837 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58196 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58832 "parsing/parser.ml" +||||||| 04da777f7 +# 58827 "parsing/parser.ml" +======= +# 58847 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58202 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58838 "parsing/parser.ml" +||||||| 04da777f7 +# 58833 "parsing/parser.ml" +======= +# 58853 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = priv; + MenhirLib.EngineTypes.startp = _startpos_priv_; + MenhirLib.EngineTypes.endp = _endpos_priv_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let priv : (Asttypes.private_flag) = Obj.magic priv in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let _1 = + let attrs2 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 58296 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58932 "parsing/parser.ml" +||||||| 04da777f7 +# 58927 "parsing/parser.ml" +======= +# 58947 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let cs = +# 1441 "parsing/parser.mly" + ( List.rev xs ) +<<<<<<< HEAD +# 58303 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58939 "parsing/parser.ml" +||||||| 04da777f7 +# 58934 "parsing/parser.ml" +======= +# 58954 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let tid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 58313 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58949 "parsing/parser.ml" +||||||| 04da777f7 +# 58944 "parsing/parser.ml" +======= +# 58964 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _4 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +<<<<<<< HEAD +# 4839 "parsing/parser.mly" + ( not_expecting _loc "nonrec flag" ) +# 58324 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4843 "parsing/parser.mly" +||||||| 04da777f7 +# 4836 "parsing/parser.mly" +======= +# 4827 "parsing/parser.mly" +>>>>>>> origin/main + ( not_expecting _loc "nonrec flag" ) +<<<<<<< HEAD +# 58960 "parsing/parser.ml" +||||||| 04da777f7 +# 58955 "parsing/parser.ml" +======= +# 58975 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 58332 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58968 "parsing/parser.ml" +||||||| 04da777f7 +# 58963 "parsing/parser.ml" +======= +# 58983 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4105 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4124 "parsing/parser.mly" +||||||| 04da777f7 +# 4117 "parsing/parser.mly" +======= +# 4108 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + Te.mk tid cs ~params ~priv ~attrs ~docs, + ext ) +<<<<<<< HEAD +# 58344 "parsing/parser.ml" + + in + +# 4092 "parsing/parser.mly" + ( _1 ) +# 58350 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58980 "parsing/parser.ml" +||||||| 04da777f7 +# 58975 "parsing/parser.ml" +======= +# 58995 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4111 "parsing/parser.mly" +||||||| 04da777f7 +# 4104 "parsing/parser.mly" +======= +# 4095 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58986 "parsing/parser.ml" +||||||| 04da777f7 +# 58981 "parsing/parser.ml" +======= +# 59001 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2039 "parsing/parser.mly" +||||||| 04da777f7 +# 2038 "parsing/parser.mly" +======= +# 2028 "parsing/parser.mly" +>>>>>>> origin/main + ( psig_typext _1 ) +<<<<<<< HEAD +# 58356 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 58992 "parsing/parser.ml" +||||||| 04da777f7 +# 58987 "parsing/parser.ml" +======= +# 59007 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58366 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59002 "parsing/parser.ml" +||||||| 04da777f7 +# 58997 "parsing/parser.ml" +======= +# 59017 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58372 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59008 "parsing/parser.ml" +||||||| 04da777f7 +# 59003 "parsing/parser.ml" +======= +# 59023 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.type_exception * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2041 "parsing/parser.mly" +||||||| 04da777f7 +# 2040 "parsing/parser.mly" +======= +# 2030 "parsing/parser.mly" +>>>>>>> origin/main + ( psig_exception _1 ) +<<<<<<< HEAD +# 58398 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59034 "parsing/parser.ml" +||||||| 04da777f7 +# 59029 "parsing/parser.ml" +======= +# 59049 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58406 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59042 "parsing/parser.ml" +||||||| 04da777f7 +# 59037 "parsing/parser.ml" +======= +# 59057 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58412 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59048 "parsing/parser.ml" +||||||| 04da777f7 +# 59043 "parsing/parser.ml" +======= +# 59063 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.module_type) = Obj.magic body in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 58477 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59113 "parsing/parser.ml" +||||||| 04da777f7 +# 59108 "parsing/parser.ml" +======= +# 59128 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 58489 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59125 "parsing/parser.ml" +||||||| 04da777f7 +# 59120 "parsing/parser.ml" +======= +# 59140 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 58497 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59133 "parsing/parser.ml" +||||||| 04da777f7 +# 59128 "parsing/parser.ml" +======= +# 59148 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2087 "parsing/parser.mly" +||||||| 04da777f7 +# 2085 "parsing/parser.mly" +======= +# 2075 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Md.mk name body ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 58511 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59147 "parsing/parser.ml" +||||||| 04da777f7 +# 59142 "parsing/parser.ml" +======= +# 59162 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2043 "parsing/parser.mly" +||||||| 04da777f7 +# 2042 "parsing/parser.mly" +======= +# 2032 "parsing/parser.mly" +>>>>>>> origin/main + ( let (body, ext) = _1 in (Psig_module body, ext) ) +<<<<<<< HEAD +# 58517 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59153 "parsing/parser.ml" +||||||| 04da777f7 +# 59148 "parsing/parser.ml" +======= +# 59168 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58527 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59163 "parsing/parser.ml" +||||||| 04da777f7 +# 59158 "parsing/parser.ml" +======= +# 59178 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58533 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59169 "parsing/parser.ml" +||||||| 04da777f7 +# 59164 "parsing/parser.ml" +======= +# 59184 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let attrs2 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 58605 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59241 "parsing/parser.ml" +||||||| 04da777f7 +# 59236 "parsing/parser.ml" +======= +# 59256 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let body = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let id = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 58618 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59254 "parsing/parser.ml" +||||||| 04da777f7 +# 59249 "parsing/parser.ml" +======= +# 59269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_id_, _startpos_id_) = (_endpos__1_, _startpos__1_) in + let _endpos = _endpos_id_ in + let _symbolstartpos = _startpos_id_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2126 "parsing/parser.mly" +||||||| 04da777f7 +# 2124 "parsing/parser.mly" +======= +# 2114 "parsing/parser.mly" +>>>>>>> origin/main + ( Mty.alias ~loc:(make_loc _sloc) id ) +<<<<<<< HEAD +# 58628 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59264 "parsing/parser.ml" +||||||| 04da777f7 +# 59259 "parsing/parser.ml" +======= +# 59279 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 58639 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59275 "parsing/parser.ml" +||||||| 04da777f7 +# 59270 "parsing/parser.ml" +======= +# 59290 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 58647 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59283 "parsing/parser.ml" +||||||| 04da777f7 +# 59278 "parsing/parser.ml" +======= +# 59298 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2117 "parsing/parser.mly" +||||||| 04da777f7 +# 2115 "parsing/parser.mly" +======= +# 2105 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Md.mk name body ~attrs ~loc ~docs, ext + ) +<<<<<<< HEAD +# 58661 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59297 "parsing/parser.ml" +||||||| 04da777f7 +# 59292 "parsing/parser.ml" +======= +# 59312 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2045 "parsing/parser.mly" +||||||| 04da777f7 +# 2044 "parsing/parser.mly" +======= +# 2034 "parsing/parser.mly" +>>>>>>> origin/main + ( let (body, ext) = _1 in (Psig_module body, ext) ) +<<<<<<< HEAD +# 58667 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59303 "parsing/parser.ml" +||||||| 04da777f7 +# 59298 "parsing/parser.ml" +======= +# 59318 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58677 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59313 "parsing/parser.ml" +||||||| 04da777f7 +# 59308 "parsing/parser.ml" +======= +# 59328 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59319 "parsing/parser.ml" +||||||| 04da777f7 +# 59314 "parsing/parser.ml" +======= +# 59334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.module_substitution * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2047 "parsing/parser.mly" +||||||| 04da777f7 +# 2046 "parsing/parser.mly" +======= +# 2036 "parsing/parser.mly" +>>>>>>> origin/main + ( let (body, ext) = _1 in (Psig_modsubst body, ext) ) +<<<<<<< HEAD +# 58709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59345 "parsing/parser.ml" +||||||| 04da777f7 +# 59340 "parsing/parser.ml" +======= +# 59360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58717 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59353 "parsing/parser.ml" +||||||| 04da777f7 +# 59348 "parsing/parser.ml" +======= +# 59368 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58723 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59359 "parsing/parser.ml" +||||||| 04da777f7 +# 59354 "parsing/parser.ml" +======= +# 59374 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = bs; + MenhirLib.EngineTypes.startp = _startpos_bs_; + MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let bs : (Parsetree.module_declaration list) = Obj.magic bs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_bs_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let _1 = + let a = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 58811 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59447 "parsing/parser.ml" +||||||| 04da777f7 +# 59442 "parsing/parser.ml" +======= +# 59462 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 58823 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59459 "parsing/parser.ml" +||||||| 04da777f7 +# 59454 "parsing/parser.ml" +======= +# 59474 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 58831 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59467 "parsing/parser.ml" +||||||| 04da777f7 +# 59462 "parsing/parser.ml" +======= +# 59482 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2160 "parsing/parser.mly" +||||||| 04da777f7 +# 2158 "parsing/parser.mly" +======= +# 2148 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + ext, Md.mk name mty ~attrs ~loc ~docs + ) +<<<<<<< HEAD +# 58845 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59481 "parsing/parser.ml" +||||||| 04da777f7 +# 59476 "parsing/parser.ml" +======= +# 59496 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1449 "parsing/parser.mly" + ( let (x, b) = a in x, b :: bs ) +<<<<<<< HEAD +# 58851 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59487 "parsing/parser.ml" +||||||| 04da777f7 +# 59482 "parsing/parser.ml" +======= +# 59502 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2149 "parsing/parser.mly" +||||||| 04da777f7 +# 2147 "parsing/parser.mly" +======= +# 2137 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59493 "parsing/parser.ml" +||||||| 04da777f7 +# 59488 "parsing/parser.ml" +======= +# 59508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2049 "parsing/parser.mly" +||||||| 04da777f7 +# 2048 "parsing/parser.mly" +======= +# 2038 "parsing/parser.mly" +>>>>>>> origin/main + ( let (ext, l) = _1 in (Psig_recmodule l, ext) ) +<<<<<<< HEAD +# 58863 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59499 "parsing/parser.ml" +||||||| 04da777f7 +# 59494 "parsing/parser.ml" +======= +# 59514 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_bs_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58873 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59509 "parsing/parser.ml" +||||||| 04da777f7 +# 59504 "parsing/parser.ml" +======= +# 59524 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 58879 "parsing/parser.ml" +======= +# 59515 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.module_type_declaration * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +# 2051 "parsing/parser.mly" + ( let (body, ext) = _1 in (Psig_modtype body, ext) ) +# 59541 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1263 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +# 59549 "parsing/parser.ml" + + in + +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" + ( _1 ) +# 59510 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.module_type_declaration * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +# 2050 "parsing/parser.mly" + ( let (body, ext) = _1 in (Psig_modtype body, ext) ) +# 59536 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1263 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +# 59544 "parsing/parser.ml" + + in + +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59555 "parsing/parser.ml" +||||||| 04da777f7 +# 59550 "parsing/parser.ml" +======= +# 59530 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.module_type_declaration * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2053 "parsing/parser.mly" + ( let (body, ext) = _1 in (Psig_modtypesubst body, ext) ) +# 59581 "parsing/parser.ml" +||||||| 04da777f7 +# 2052 "parsing/parser.mly" + ( let (body, ext) = _1 in (Psig_modtypesubst body, ext) ) +# 59576 "parsing/parser.ml" +======= +# 2040 "parsing/parser.mly" + ( let (body, ext) = _1 in (Psig_modtype body, ext) ) +<<<<<<< HEAD +# 58905 "parsing/parser.ml" +======= +# 59556 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59589 "parsing/parser.ml" +||||||| 04da777f7 +# 59584 "parsing/parser.ml" +======= +# 59564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58919 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59595 "parsing/parser.ml" +||||||| 04da777f7 +# 59590 "parsing/parser.ml" +======= +# 59570 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.module_type_declaration * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +# 2042 "parsing/parser.mly" + ( let (body, ext) = _1 in (Psig_modtypesubst body, ext) ) +# 58945 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +# 58953 "parsing/parser.ml" + + in + +# 2050 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 58959 "parsing/parser.ml" +======= +# 59610 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.open_description * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2055 "parsing/parser.mly" +||||||| 04da777f7 +# 2054 "parsing/parser.mly" +======= +# 2044 "parsing/parser.mly" +>>>>>>> origin/main + ( let (body, ext) = _1 in (Psig_open body, ext) ) +<<<<<<< HEAD +# 58985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59621 "parsing/parser.ml" +||||||| 04da777f7 +# 59616 "parsing/parser.ml" +======= +# 59636 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 58993 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59629 "parsing/parser.ml" +||||||| 04da777f7 +# 59624 "parsing/parser.ml" +======= +# 59644 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 58999 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59635 "parsing/parser.ml" +||||||| 04da777f7 +# 59630 "parsing/parser.ml" +======= +# 59650 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = bs; + MenhirLib.EngineTypes.startp = _startpos_bs_; + MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let bs : (Parsetree.class_description list) = Obj.magic bs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let cty : (Parsetree.class_type) = Obj.magic cty in + let _7 : unit = Obj.magic _7 in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 59078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59714 "parsing/parser.ml" +||||||| 04da777f7 +# 59709 "parsing/parser.ml" +======= +# 59729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_bs_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = + let _1 = + let _1 = + let a = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 59098 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59734 "parsing/parser.ml" +||||||| 04da777f7 +# 59729 "parsing/parser.ml" +======= +# 59749 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 59110 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59746 "parsing/parser.ml" +||||||| 04da777f7 +# 59741 "parsing/parser.ml" +======= +# 59761 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 59118 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59754 "parsing/parser.ml" +||||||| 04da777f7 +# 59749 "parsing/parser.ml" +======= +# 59769 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2507 "parsing/parser.mly" +||||||| 04da777f7 +# 2505 "parsing/parser.mly" +======= +# 2495 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + ext, + Ci.mk id cty ~virt ~params ~attrs ~loc ~docs + ) +<<<<<<< HEAD +# 59133 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59769 "parsing/parser.ml" +||||||| 04da777f7 +# 59764 "parsing/parser.ml" +======= +# 59784 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1449 "parsing/parser.mly" + ( let (x, b) = a in x, b :: bs ) +<<<<<<< HEAD +# 59139 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59775 "parsing/parser.ml" +||||||| 04da777f7 +# 59770 "parsing/parser.ml" +======= +# 59790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2495 "parsing/parser.mly" +||||||| 04da777f7 +# 2493 "parsing/parser.mly" +======= +# 2483 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59145 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59781 "parsing/parser.ml" +||||||| 04da777f7 +# 59776 "parsing/parser.ml" +======= +# 59796 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2057 "parsing/parser.mly" +||||||| 04da777f7 +# 2056 "parsing/parser.mly" +======= +# 2046 "parsing/parser.mly" +>>>>>>> origin/main + ( let (ext, l) = _1 in (Psig_class l, ext) ) +<<<<<<< HEAD +# 59151 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59787 "parsing/parser.ml" +||||||| 04da777f7 +# 59782 "parsing/parser.ml" +======= +# 59802 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_bs_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 59161 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59797 "parsing/parser.ml" +||||||| 04da777f7 +# 59792 "parsing/parser.ml" +======= +# 59812 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59167 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59803 "parsing/parser.ml" +||||||| 04da777f7 +# 59798 "parsing/parser.ml" +======= +# 59818 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (string Asttypes.loc option * Parsetree.class_type_declaration list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +<<<<<<< HEAD +# 2059 "parsing/parser.mly" +||||||| 04da777f7 +# 2058 "parsing/parser.mly" +======= +# 2048 "parsing/parser.mly" +>>>>>>> origin/main + ( let (ext, l) = _1 in (Psig_class_type l, ext) ) +<<<<<<< HEAD +# 59193 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59829 "parsing/parser.ml" +||||||| 04da777f7 +# 59824 "parsing/parser.ml" +======= +# 59844 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1253 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 59201 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59837 "parsing/parser.ml" +||||||| 04da777f7 +# 59832 "parsing/parser.ml" +======= +# 59852 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2061 "parsing/parser.mly" +||||||| 04da777f7 +# 2060 "parsing/parser.mly" +======= +# 2050 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59207 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59843 "parsing/parser.ml" +||||||| 04da777f7 +# 59838 "parsing/parser.ml" +======= +# 59858 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = thing; + MenhirLib.EngineTypes.startp = _startpos_thing_; + MenhirLib.EngineTypes.endp = _endpos_thing_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = is_functor; + MenhirLib.EngineTypes.startp = _startpos_is_functor_; + MenhirLib.EngineTypes.endp = _endpos_is_functor_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let thing : (Parsetree.module_type) = Obj.magic thing in + let _1 : (Parsetree.attributes) = Obj.magic _1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let is_functor : (bool) = Obj.magic is_functor in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_is_functor_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.signature_item) = let _1 = + let attrs2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 59263 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59899 "parsing/parser.ml" +||||||| 04da777f7 +# 59894 "parsing/parser.ml" +======= +# 59914 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined1_ in + let attrs1 = +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 59270 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 59906 "parsing/parser.ml" +||||||| 04da777f7 +# 59901 "parsing/parser.ml" +======= +# 59921 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos_is_functor_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 1891 "parsing/parser.mly" +||||||| 04da777f7 +# 1890 "parsing/parser.mly" +======= +# 1880 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let incl = Incl.mk thing ~attrs ~loc ~docs in + is_functor, incl, ext + ) +<<<<<<< HEAD +# 59284 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59920 "parsing/parser.ml" +||||||| 04da777f7 +# 59915 "parsing/parser.ml" +======= +# 59935 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_is_functor_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2063 "parsing/parser.mly" +||||||| 04da777f7 +# 2062 "parsing/parser.mly" +======= +# 2052 "parsing/parser.mly" +>>>>>>> origin/main + ( let is_functor, incl, ext = _1 in + let item = + if is_functor + then Jane_syntax.Include_functor.sig_item_of ~loc:(make_loc _sloc) + (Ifsig_include_functor incl) + else mksig ~loc:_sloc (Psig_include incl) + in + wrap_sig_ext ~loc:_sloc item ext + ) +<<<<<<< HEAD +# 59302 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59938 "parsing/parser.ml" +||||||| 04da777f7 +# 59933 "parsing/parser.ml" +======= +# 59953 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (string Asttypes.loc * Jane_syntax.Jkind.annotation) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in +<<<<<<< HEAD + let _v : (Parsetree.signature_item) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2073 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Parsetree.signature_item) = +# 2072 "parsing/parser.mly" +======= + let _v : (Parsetree.signature_item) = +# 2062 "parsing/parser.mly" +>>>>>>> origin/main + ( + let name, jkind = _1 in + Jane_syntax.Layouts.(sig_item_of + ~loc:(make_loc _sloc) + (Lsig_kind_abbrev (name, jkind))) + ) +<<<<<<< HEAD +# 59331 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 59971 "parsing/parser.ml" +||||||| 04da777f7 +# 59962 "parsing/parser.ml" +======= +# 59982 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.constant) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Constant.t) = +<<<<<<< HEAD +# 4648 "parsing/parser.mly" + ( Constant.value _1 ) +# 59356 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4652 "parsing/parser.mly" +||||||| 04da777f7 +# 4645 "parsing/parser.mly" +======= +# 4636 "parsing/parser.mly" +>>>>>>> origin/main + ( Constant.value _1 ) +<<<<<<< HEAD +# 59996 "parsing/parser.ml" +||||||| 04da777f7 +# 59987 "parsing/parser.ml" +======= +# 60007 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Constant.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Constant.t) = +<<<<<<< HEAD +# 4649 "parsing/parser.mly" + ( _1 ) +# 59381 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4653 "parsing/parser.mly" +||||||| 04da777f7 +# 4646 "parsing/parser.mly" +======= +# 4637 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60021 "parsing/parser.ml" +||||||| 04da777f7 +# 60012 "parsing/parser.ml" +======= +# 60032 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 989 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59408 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60048 "parsing/parser.ml" +||||||| 04da777f7 +# 60039 "parsing/parser.ml" +======= +# 60059 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Constant.t) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4650 "parsing/parser.mly" + ( unboxed_int _sloc _loc__2_ Negative _2 ) +# 59421 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4654 "parsing/parser.mly" +||||||| 04da777f7 +# 4647 "parsing/parser.mly" +======= +# 4638 "parsing/parser.mly" +>>>>>>> origin/main + ( unboxed_int _sloc _loc__2_ Negative _2 ) +<<<<<<< HEAD +# 60061 "parsing/parser.ml" +||||||| 04da777f7 +# 60052 "parsing/parser.ml" +======= +# 60072 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 964 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59448 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60088 "parsing/parser.ml" +||||||| 04da777f7 +# 60079 "parsing/parser.ml" +======= +# 60099 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in +<<<<<<< HEAD + let _v : (Constant.t) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4655 "parsing/parser.mly" + ( unboxed_float _sloc Negative _2 ) +# 60100 "parsing/parser.ml" +||||||| 04da777f7 + let _v : (Constant.t) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4648 "parsing/parser.mly" + ( unboxed_float _sloc Negative _2 ) +# 60091 "parsing/parser.ml" +======= + let _v : (Constant.t) = +# 4651 "parsing/parser.mly" + ( unboxed_float Negative _2 ) +<<<<<<< HEAD +# 59457 "parsing/parser.ml" +======= +# 60108 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 989 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59484 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60127 "parsing/parser.ml" +||||||| 04da777f7 +# 60118 "parsing/parser.ml" +======= +# 60135 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Constant.t) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4652 "parsing/parser.mly" + ( unboxed_int _sloc _loc__2_ Positive _2 ) +# 59497 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4656 "parsing/parser.mly" +||||||| 04da777f7 +# 4649 "parsing/parser.mly" +======= +# 4640 "parsing/parser.mly" +>>>>>>> origin/main + ( unboxed_int _sloc _loc__2_ Positive _2 ) +<<<<<<< HEAD +# 60140 "parsing/parser.ml" +||||||| 04da777f7 +# 60131 "parsing/parser.ml" +======= +# 60148 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 964 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59524 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60167 "parsing/parser.ml" +||||||| 04da777f7 +# 60158 "parsing/parser.ml" +======= +# 60175 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in +<<<<<<< HEAD + let _v : (Constant.t) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4657 "parsing/parser.mly" + ( unboxed_float _sloc Positive _2 ) +# 60179 "parsing/parser.ml" +||||||| 04da777f7 + let _v : (Constant.t) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4650 "parsing/parser.mly" + ( unboxed_float _sloc Positive _2 ) +# 60170 "parsing/parser.ml" +======= + let _v : (Constant.t) = +# 4653 "parsing/parser.mly" + ( unboxed_float Positive _2 ) +<<<<<<< HEAD +# 59533 "parsing/parser.ml" +======= +# 60184 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.constant) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.constant) = +<<<<<<< HEAD +# 4641 "parsing/parser.mly" + ( _1 ) +# 59558 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4645 "parsing/parser.mly" +||||||| 04da777f7 +# 4638 "parsing/parser.mly" +======= +# 4629 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60204 "parsing/parser.ml" +||||||| 04da777f7 +# 60195 "parsing/parser.ml" +======= +# 60209 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 988 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59585 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60231 "parsing/parser.ml" + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.constant) = +# 4646 "parsing/parser.mly" + ( let (n, m) = _2 in Pconst_integer("-" ^ n, m) ) +# 60240 "parsing/parser.ml" +||||||| 04da777f7 +# 60222 "parsing/parser.ml" + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.constant) = +# 4639 "parsing/parser.mly" + ( let (n, m) = _2 in Pconst_integer("-" ^ n, m) ) +# 60231 "parsing/parser.ml" +======= +# 60236 "parsing/parser.ml" +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.constant) = +# 4642 "parsing/parser.mly" + ( let (n, m) = _2 in Pconst_integer("-" ^ n, m) ) +<<<<<<< HEAD +# 59594 "parsing/parser.ml" +======= +# 60245 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 963 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59621 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60267 "parsing/parser.ml" +||||||| 04da777f7 +# 60258 "parsing/parser.ml" +======= +# 60272 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.constant) = +<<<<<<< HEAD +# 4643 "parsing/parser.mly" + ( let (f, m) = _2 in Pconst_float("-" ^ f, m) ) +# 59630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4647 "parsing/parser.mly" +||||||| 04da777f7 +# 4640 "parsing/parser.mly" +======= +# 4631 "parsing/parser.mly" +>>>>>>> origin/main + ( let (f, m) = _2 in Pconst_float("-" ^ f, m) ) +<<<<<<< HEAD +# 60276 "parsing/parser.ml" +||||||| 04da777f7 +# 60267 "parsing/parser.ml" +======= +# 60281 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 988 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59657 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60303 "parsing/parser.ml" +||||||| 04da777f7 +# 60294 "parsing/parser.ml" +======= +# 60308 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.constant) = +<<<<<<< HEAD +# 4644 "parsing/parser.mly" + ( let (n, m) = _2 in Pconst_integer (n, m) ) +# 59666 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4648 "parsing/parser.mly" +||||||| 04da777f7 +# 4641 "parsing/parser.mly" +======= +# 4632 "parsing/parser.mly" +>>>>>>> origin/main + ( let (n, m) = _2 in Pconst_integer (n, m) ) +<<<<<<< HEAD +# 60312 "parsing/parser.ml" +||||||| 04da777f7 +# 60303 "parsing/parser.ml" +======= +# 60317 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : ( +# 963 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 59693 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60339 "parsing/parser.ml" +||||||| 04da777f7 +# 60330 "parsing/parser.ml" +======= +# 60344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.constant) = +<<<<<<< HEAD +# 4645 "parsing/parser.mly" + ( let (f, m) = _2 in Pconst_float(f, m) ) +# 59702 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4649 "parsing/parser.mly" +||||||| 04da777f7 +# 4642 "parsing/parser.mly" +======= +# 4633 "parsing/parser.mly" +>>>>>>> origin/main + ( let (f, m) = _2 in Pconst_float(f, m) ) +<<<<<<< HEAD +# 60348 "parsing/parser.ml" +||||||| 04da777f7 +# 60339 "parsing/parser.ml" +======= +# 60353 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 3688 "parsing/parser.mly" +||||||| 04da777f7 +# 3686 "parsing/parser.mly" +======= +# 3677 "parsing/parser.mly" +>>>>>>> origin/main + ( let fields, closed = _1 in + let closed = match closed with Some () -> Open | None -> Closed in + fields, closed ) +<<<<<<< HEAD +# 59747 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60393 "parsing/parser.ml" +||||||| 04da777f7 +# 60384 "parsing/parser.ml" +======= +# 60398 "parsing/parser.ml" +>>>>>>> upstream/main + + in + +# 3647 "parsing/parser.mly" + ( let (fields, closed) = _2 in + Ppat_record(fields, closed) ) +# 59754 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 59764 "parsing/parser.ml" + + in + +# 3661 "parsing/parser.mly" + ( _1 ) +# 59770 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = + let _1 = _1_inlined1 in + +# 3677 "parsing/parser.mly" + ( let fields, closed = _1 in + let closed = match closed with Some () -> Open | None -> Closed in + fields, closed ) +# 59815 "parsing/parser.ml" + + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 3650 "parsing/parser.mly" + ( unclosed "{" _loc__1_ "}" _loc__3_ ) +# 59823 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 59833 "parsing/parser.ml" + + in + +# 3661 "parsing/parser.mly" + ( _1 ) +# 59839 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +# 3671 "parsing/parser.mly" + ( ps ) +# 59880 "parsing/parser.ml" + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3652 "parsing/parser.mly" + ( fst (mktailpat _loc__3_ _2) ) +# 59886 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 59896 "parsing/parser.ml" + + in + +# 3661 "parsing/parser.mly" + ( _1 ) +# 59902 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +# 3671 "parsing/parser.mly" + ( ps ) +# 59943 "parsing/parser.ml" + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 3654 "parsing/parser.mly" + ( unclosed "[" _loc__1_ "]" _loc__3_ ) +# 59950 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 59960 "parsing/parser.ml" + + in + +# 3661 "parsing/parser.mly" + ( _1 ) +# 59966 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = + let _2 = +# 3671 "parsing/parser.mly" + ( ps ) +# 60009 "parsing/parser.ml" + in + +# 2935 "parsing/parser.mly" + ( Generic_array.Simple.Literal _2 ) +# 60014 "parsing/parser.ml" + + in + +# 2959 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 60020 "parsing/parser.ml" + + in + +# 3656 "parsing/parser.mly" + ( Generic_array.Pattern.to_ast + "[|" "|]" + (fun elts -> Ppat_array elts) + _1 + ) +# 60030 "parsing/parser.ml" +======= +# 60671 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3658 "parsing/parser.mly" + ( let (fields, closed) = _2 in + Ppat_record(fields, closed) ) +# 60400 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 60040 "parsing/parser.ml" +======= +# 60410 "parsing/parser.ml" +>>>>>>> upstream/main + + in + +# 3672 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 60046 "parsing/parser.ml" +======= +# 60416 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = + let _1 = _1_inlined1 in + +# 3688 "parsing/parser.mly" + ( let fields, closed = _1 in + let closed = match closed with Some () -> Open | None -> Closed in + fields, closed ) +# 60461 "parsing/parser.ml" + + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 3661 "parsing/parser.mly" + ( unclosed "{" _loc__1_ "}" _loc__3_ ) +# 60469 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 60479 "parsing/parser.ml" + + in + +# 3672 "parsing/parser.mly" + ( _1 ) +# 60485 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +# 3682 "parsing/parser.mly" + ( ps ) +# 60526 "parsing/parser.ml" + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3663 "parsing/parser.mly" + ( fst (mktailpat _loc__3_ _2) ) +# 60532 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 60542 "parsing/parser.ml" + + in + +# 3672 "parsing/parser.mly" + ( _1 ) +# 60548 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +# 3682 "parsing/parser.mly" + ( ps ) +# 60589 "parsing/parser.ml" + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 3665 "parsing/parser.mly" + ( unclosed "[" _loc__1_ "]" _loc__3_ ) +# 60596 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 60606 "parsing/parser.ml" + + in + +# 3672 "parsing/parser.mly" + ( _1 ) +# 60612 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = + let _2 = +# 3682 "parsing/parser.mly" + ( ps ) +<<<<<<< HEAD +# 60089 "parsing/parser.ml" +======= +# 60655 "parsing/parser.ml" +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2937 "parsing/parser.mly" + ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) +# 60096 "parsing/parser.ml" +======= +# 2947 "parsing/parser.mly" + ( Generic_array.Simple.Literal _2 ) +# 60660 "parsing/parser.ml" +>>>>>>> upstream/main + + in + +# 2971 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 60102 "parsing/parser.ml" +======= +# 60666 "parsing/parser.ml" +>>>>>>> upstream/main + + in + +# 3667 "parsing/parser.mly" +||||||| 04da777f7 +# 3656 "parsing/parser.mly" + ( let (fields, closed) = _2 in + Ppat_record(fields, closed) ) +# 60391 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 60401 "parsing/parser.ml" + + in + +# 3670 "parsing/parser.mly" + ( _1 ) +# 60407 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = + let _1 = _1_inlined1 in + +# 3686 "parsing/parser.mly" + ( let fields, closed = _1 in + let closed = match closed with Some () -> Open | None -> Closed in + fields, closed ) +# 60452 "parsing/parser.ml" + + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 3659 "parsing/parser.mly" + ( unclosed "{" _loc__1_ "}" _loc__3_ ) +# 60460 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 60470 "parsing/parser.ml" + + in + +# 3670 "parsing/parser.mly" + ( _1 ) +# 60476 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +# 3680 "parsing/parser.mly" + ( ps ) +# 60517 "parsing/parser.ml" + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 3661 "parsing/parser.mly" + ( fst (mktailpat _loc__3_ _2) ) +# 60523 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 60533 "parsing/parser.ml" + + in + +# 3670 "parsing/parser.mly" + ( _1 ) +# 60539 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +# 3680 "parsing/parser.mly" + ( ps ) +# 60580 "parsing/parser.ml" + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 3663 "parsing/parser.mly" + ( unclosed "[" _loc__1_ "]" _loc__3_ ) +# 60587 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 60597 "parsing/parser.ml" + + in + +# 3670 "parsing/parser.mly" + ( _1 ) +# 60603 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = + let _2 = +# 3680 "parsing/parser.mly" + ( ps ) +# 60646 "parsing/parser.ml" + in + +# 2945 "parsing/parser.mly" + ( Generic_array.Simple.Literal _2 ) +# 60651 "parsing/parser.ml" + + in + +# 2969 "parsing/parser.mly" + ( _1 ) +# 60657 "parsing/parser.ml" + + in + +# 3665 "parsing/parser.mly" +======= +# 3656 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Pattern.to_ast + "[|" "|]" + (fun elts -> Ppat_array elts) + _1 + ) +<<<<<<< HEAD +# 60112 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60676 "parsing/parser.ml" +||||||| 04da777f7 +# 60667 "parsing/parser.ml" +======= +# 60681 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 60122 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60686 "parsing/parser.ml" +||||||| 04da777f7 +# 60677 "parsing/parser.ml" +======= +# 60691 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3672 "parsing/parser.mly" +||||||| 04da777f7 +# 3670 "parsing/parser.mly" +======= +# 3661 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60128 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60692 "parsing/parser.ml" +||||||| 04da777f7 +# 60683 "parsing/parser.ml" +======= +# 60697 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3682 "parsing/parser.mly" +||||||| 04da777f7 +# 3680 "parsing/parser.mly" +======= +# 3671 "parsing/parser.mly" +>>>>>>> origin/main + ( ps ) +<<<<<<< HEAD +# 60735 "parsing/parser.ml" +||||||| 04da777f7 +# 60726 "parsing/parser.ml" +======= +# 60740 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2949 "parsing/parser.mly" +||||||| 04da777f7 +# 2947 "parsing/parser.mly" +======= +# 2937 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) +<<<<<<< HEAD +# 60742 "parsing/parser.ml" +||||||| 04da777f7 +# 60733 "parsing/parser.ml" +======= +# 60747 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2971 "parsing/parser.mly" +||||||| 04da777f7 +# 2969 "parsing/parser.mly" +======= +# 2959 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60748 "parsing/parser.ml" +||||||| 04da777f7 +# 60739 "parsing/parser.ml" +======= +# 60753 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3667 "parsing/parser.mly" +||||||| 04da777f7 +# 3665 "parsing/parser.mly" +======= +# 3656 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Pattern.to_ast + "[|" "|]" + (fun elts -> Ppat_array elts) + _1 + ) +<<<<<<< HEAD +# 60758 "parsing/parser.ml" +||||||| 04da777f7 +# 60749 "parsing/parser.ml" +======= +# 60763 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 60768 "parsing/parser.ml" +||||||| 04da777f7 +# 60759 "parsing/parser.ml" +======= +# 60773 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 3672 "parsing/parser.mly" +||||||| 04da777f7 +# 3670 "parsing/parser.mly" +======= +# 3661 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60774 "parsing/parser.ml" +||||||| 04da777f7 +# 60765 "parsing/parser.ml" +======= +# 60779 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = +<<<<<<< HEAD +# 2951 "parsing/parser.mly" +||||||| 04da777f7 +# 2949 "parsing/parser.mly" +======= +# 2939 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Literal [] ) +<<<<<<< HEAD +# 60163 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60809 "parsing/parser.ml" +||||||| 04da777f7 +# 60800 "parsing/parser.ml" +======= +# 60814 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2971 "parsing/parser.mly" +||||||| 04da777f7 +# 2969 "parsing/parser.mly" +======= +# 2959 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60168 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60814 "parsing/parser.ml" +||||||| 04da777f7 +# 60805 "parsing/parser.ml" +======= +# 60819 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3667 "parsing/parser.mly" +||||||| 04da777f7 +# 3665 "parsing/parser.mly" +======= +# 3656 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Pattern.to_ast + "[|" "|]" + (fun elts -> Ppat_array elts) + _1 + ) +<<<<<<< HEAD +# 60178 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60824 "parsing/parser.ml" +||||||| 04da777f7 +# 60815 "parsing/parser.ml" +======= +# 60829 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 60188 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60834 "parsing/parser.ml" +||||||| 04da777f7 +# 60825 "parsing/parser.ml" +======= +# 60839 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3672 "parsing/parser.mly" +||||||| 04da777f7 +# 3670 "parsing/parser.mly" +======= +# 3661 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60194 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60840 "parsing/parser.ml" +||||||| 04da777f7 +# 60831 "parsing/parser.ml" +======= +# 60845 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3682 "parsing/parser.mly" +||||||| 04da777f7 +# 3680 "parsing/parser.mly" +======= +# 3671 "parsing/parser.mly" +>>>>>>> origin/main + ( ps ) +<<<<<<< HEAD +# 60235 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60881 "parsing/parser.ml" +||||||| 04da777f7 +# 60872 "parsing/parser.ml" +======= +# 60886 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2947 "parsing/parser.mly" +||||||| 04da777f7 +# 2945 "parsing/parser.mly" +======= +# 2935 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Literal _2 ) +<<<<<<< HEAD +# 60240 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60886 "parsing/parser.ml" +||||||| 04da777f7 +# 60877 "parsing/parser.ml" +======= +# 60891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2971 "parsing/parser.mly" +||||||| 04da777f7 +# 2969 "parsing/parser.mly" +======= +# 2959 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60246 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60892 "parsing/parser.ml" +||||||| 04da777f7 +# 60883 "parsing/parser.ml" +======= +# 60897 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3674 "parsing/parser.mly" +||||||| 04da777f7 +# 3672 "parsing/parser.mly" +======= +# 3663 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Pattern.to_ast + "[:" ":]" + (ppat_iarray _sloc) + _1 + ) +<<<<<<< HEAD +# 60260 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60906 "parsing/parser.ml" +||||||| 04da777f7 +# 60897 "parsing/parser.ml" +======= +# 60911 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ps; + MenhirLib.EngineTypes.startp = _startpos_ps_; + MenhirLib.EngineTypes.endp = _endpos_ps_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let ps : (Parsetree.pattern list) = Obj.magic ps in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3682 "parsing/parser.mly" +||||||| 04da777f7 +# 3680 "parsing/parser.mly" +======= +# 3671 "parsing/parser.mly" +>>>>>>> origin/main + ( ps ) +<<<<<<< HEAD +# 60301 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60947 "parsing/parser.ml" +||||||| 04da777f7 +# 60938 "parsing/parser.ml" +======= +# 60952 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2949 "parsing/parser.mly" +||||||| 04da777f7 +# 2947 "parsing/parser.mly" +======= +# 2937 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) +<<<<<<< HEAD +# 60308 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60954 "parsing/parser.ml" +||||||| 04da777f7 +# 60945 "parsing/parser.ml" +======= +# 60959 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2971 "parsing/parser.mly" +||||||| 04da777f7 +# 2969 "parsing/parser.mly" +======= +# 2959 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60314 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60960 "parsing/parser.ml" +||||||| 04da777f7 +# 60951 "parsing/parser.ml" +======= +# 60965 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3674 "parsing/parser.mly" +||||||| 04da777f7 +# 3672 "parsing/parser.mly" +======= +# 3663 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Pattern.to_ast + "[:" ":]" + (ppat_iarray _sloc) + _1 + ) +<<<<<<< HEAD +# 60328 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 60974 "parsing/parser.ml" +||||||| 04da777f7 +# 60965 "parsing/parser.ml" +======= +# 60979 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = +<<<<<<< HEAD +# 2951 "parsing/parser.mly" +||||||| 04da777f7 +# 2949 "parsing/parser.mly" +======= +# 2939 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Literal [] ) +<<<<<<< HEAD +# 60361 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61007 "parsing/parser.ml" +||||||| 04da777f7 +# 60998 "parsing/parser.ml" +======= +# 61012 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2971 "parsing/parser.mly" +||||||| 04da777f7 +# 2969 "parsing/parser.mly" +======= +# 2959 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 60366 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61012 "parsing/parser.ml" +||||||| 04da777f7 +# 61003 "parsing/parser.ml" +======= +# 61017 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3674 "parsing/parser.mly" +||||||| 04da777f7 +# 3672 "parsing/parser.mly" +======= +# 3663 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Pattern.to_ast + "[:" ":]" + (ppat_iarray _sloc) + _1 + ) +<<<<<<< HEAD +# 60380 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61026 "parsing/parser.ml" +||||||| 04da777f7 +# 61017 "parsing/parser.ml" +======= +# 61031 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2838 "parsing/parser.mly" +||||||| 04da777f7 +# 2836 "parsing/parser.mly" +======= +# 2826 "parsing/parser.mly" +>>>>>>> origin/main + ( reloc_exp ~loc:_sloc _2 ) +<<<<<<< HEAD +# 60422 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61068 "parsing/parser.ml" +||||||| 04da777f7 +# 61059 "parsing/parser.ml" +======= +# 61073 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2840 "parsing/parser.mly" +||||||| 04da777f7 +# 2838 "parsing/parser.mly" +======= +# 2828 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__1_ ")" _loc__3_ ) +<<<<<<< HEAD +# 60463 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61109 "parsing/parser.ml" +||||||| 04da777f7 +# 61100 "parsing/parser.ml" +======= +# 61114 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (N_ary.type_constraint) = Obj.magic _1_inlined1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _3 = + let _1 = _1_inlined1 in + let _2 = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 60511 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 61157 "parsing/parser.ml" +||||||| 04da777f7 +# 61148 "parsing/parser.ml" +======= +# 61162 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3441 "parsing/parser.mly" +||||||| 04da777f7 +# 3439 "parsing/parser.mly" +======= +# 3429 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 60516 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61162 "parsing/parser.ml" +||||||| 04da777f7 +# 61153 "parsing/parser.ml" +======= +# 61167 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2842 "parsing/parser.mly" +||||||| 04da777f7 +# 2840 "parsing/parser.mly" +======= +# 2830 "parsing/parser.mly" +>>>>>>> origin/main + ( let (t, m) = _3 in + mkexp_with_modes ~ghost:false ~loc:_sloc m @@ + mkexp_type_constraint ~ghost:true ~loc:_sloc _2 t ) +<<<<<<< HEAD +# 60527 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61173 "parsing/parser.ml" +||||||| 04da777f7 +# 61164 "parsing/parser.ml" +======= +# 61178 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (N_ary.type_constraint) = Obj.magic _1_inlined1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 60584 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 61230 "parsing/parser.ml" +||||||| 04da777f7 +# 61221 "parsing/parser.ml" +======= +# 61235 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3441 "parsing/parser.mly" +||||||| 04da777f7 +# 3439 "parsing/parser.mly" +======= +# 3429 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 60590 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61236 "parsing/parser.ml" +||||||| 04da777f7 +# 61227 "parsing/parser.ml" +======= +# 61241 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2842 "parsing/parser.mly" +||||||| 04da777f7 +# 2840 "parsing/parser.mly" +======= +# 2830 "parsing/parser.mly" +>>>>>>> origin/main + ( let (t, m) = _3 in + mkexp_with_modes ~ghost:false ~loc:_sloc m @@ + mkexp_type_constraint ~ghost:true ~loc:_sloc _2 t ) +<<<<<<< HEAD +# 60601 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61247 "parsing/parser.ml" +||||||| 04da777f7 +# 61238 "parsing/parser.ml" +======= +# 61252 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +<<<<<<< HEAD +# 2845 "parsing/parser.mly" +||||||| 04da777f7 +# 2843 "parsing/parser.mly" +======= +# 2833 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 60655 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61301 "parsing/parser.ml" +||||||| 04da777f7 +# 61292 "parsing/parser.ml" + in + +# 2709 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 61297 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2844 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 61307 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2843 "parsing/parser.mly" + ( None ) +# 61361 "parsing/parser.ml" +======= +# 61306 "parsing/parser.ml" +>>>>>>> upstream/main + in + +# 2699 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 60660 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2834 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 60670 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2833 "parsing/parser.mly" + ( None ) +<<<<<<< HEAD +# 60724 "parsing/parser.ml" +======= +# 61375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2711 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 61306 "parsing/parser.ml" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 61366 "parsing/parser.ml" +======= +# 2701 "parsing/parser.mly" + ( array, d, Brace, i, r ) +<<<<<<< HEAD +# 60729 "parsing/parser.ml" +======= +# 61380 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2846 "parsing/parser.mly" +||||||| 04da777f7 +# 2844 "parsing/parser.mly" +======= +# 2834 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 60739 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61316 "parsing/parser.ml" +||||||| 04da777f7 +# 61376 "parsing/parser.ml" +======= +# 61390 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +<<<<<<< HEAD +# 2845 "parsing/parser.mly" +||||||| 04da777f7 +# 2843 "parsing/parser.mly" +======= +# 2833 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 60793 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61370 "parsing/parser.ml" +||||||| 04da777f7 +# 61430 "parsing/parser.ml" +======= +# 61444 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2713 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 61375 "parsing/parser.ml" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 61435 "parsing/parser.ml" +======= +# 2703 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +<<<<<<< HEAD +# 60798 "parsing/parser.ml" +======= +# 61449 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2846 "parsing/parser.mly" +||||||| 04da777f7 +# 2844 "parsing/parser.mly" +======= +# 2834 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 60808 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61385 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2845 "parsing/parser.mly" + ( None ) +# 61439 "parsing/parser.ml" + in + +# 2715 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 61444 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2846 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 61454 "parsing/parser.ml" +||||||| 04da777f7 +# 61445 "parsing/parser.ml" +======= +# 61459 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 60856 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61502 "parsing/parser.ml" +||||||| 04da777f7 +# 61493 "parsing/parser.ml" +======= +# 61507 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +<<<<<<< HEAD +# 2849 "parsing/parser.mly" +||||||| 04da777f7 +# 2847 "parsing/parser.mly" +======= +# 2837 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 60866 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61512 "parsing/parser.ml" +||||||| 04da777f7 +# 61503 "parsing/parser.ml" +======= +# 61517 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 60871 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61517 "parsing/parser.ml" +||||||| 04da777f7 +# 61508 "parsing/parser.ml" +======= +# 61522 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let d = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 60877 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61523 "parsing/parser.ml" +||||||| 04da777f7 +# 61514 "parsing/parser.ml" +======= +# 61528 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 60882 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61528 "parsing/parser.ml" +||||||| 04da777f7 +# 61519 "parsing/parser.ml" +======= +# 61533 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +<<<<<<< HEAD +# 60888 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61534 "parsing/parser.ml" +||||||| 04da777f7 +# 61525 "parsing/parser.ml" +======= +# 61539 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2850 "parsing/parser.mly" +||||||| 04da777f7 +# 2848 "parsing/parser.mly" +======= +# 2838 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 60898 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61544 "parsing/parser.ml" +||||||| 04da777f7 +# 61535 "parsing/parser.ml" +======= +# 61549 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 60958 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61604 "parsing/parser.ml" +||||||| 04da777f7 +# 61595 "parsing/parser.ml" +======= +# 61609 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +<<<<<<< HEAD +# 2849 "parsing/parser.mly" +||||||| 04da777f7 +# 2847 "parsing/parser.mly" +======= +# 2837 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 60970 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61616 "parsing/parser.ml" +||||||| 04da777f7 +# 61607 "parsing/parser.ml" +======= +# 61621 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 60975 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61621 "parsing/parser.ml" +||||||| 04da777f7 +# 61612 "parsing/parser.ml" +======= +# 61626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +<<<<<<< HEAD +# 60983 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61629 "parsing/parser.ml" +||||||| 04da777f7 +# 61620 "parsing/parser.ml" +======= +# 61634 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 60988 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61634 "parsing/parser.ml" +||||||| 04da777f7 +# 61625 "parsing/parser.ml" +======= +# 61639 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 60994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61640 "parsing/parser.ml" +||||||| 04da777f7 +# 61631 "parsing/parser.ml" +======= +# 61645 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2711 "parsing/parser.mly" +||||||| 04da777f7 +# 2709 "parsing/parser.mly" +======= +# 2699 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Paren, i, r ) +<<<<<<< HEAD +# 61000 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61646 "parsing/parser.ml" +||||||| 04da777f7 +# 61637 "parsing/parser.ml" +======= +# 61651 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2850 "parsing/parser.mly" +||||||| 04da777f7 +# 2848 "parsing/parser.mly" +======= +# 2838 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 61010 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61656 "parsing/parser.ml" +||||||| 04da777f7 +# 61647 "parsing/parser.ml" +======= +# 61661 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 61058 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61704 "parsing/parser.ml" +||||||| 04da777f7 +# 61695 "parsing/parser.ml" +======= +# 61709 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +<<<<<<< HEAD +# 2849 "parsing/parser.mly" +||||||| 04da777f7 +# 2847 "parsing/parser.mly" +======= +# 2837 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 61068 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61714 "parsing/parser.ml" +||||||| 04da777f7 +# 61705 "parsing/parser.ml" +======= +# 61719 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 61073 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61719 "parsing/parser.ml" +||||||| 04da777f7 +# 61710 "parsing/parser.ml" +======= +# 61724 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let d = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 61079 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61725 "parsing/parser.ml" +||||||| 04da777f7 +# 61716 "parsing/parser.ml" +======= +# 61730 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 61084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61730 "parsing/parser.ml" +||||||| 04da777f7 +# 61721 "parsing/parser.ml" +======= +# 61735 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +<<<<<<< HEAD +# 61090 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61736 "parsing/parser.ml" +||||||| 04da777f7 +# 61727 "parsing/parser.ml" +======= +# 61741 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2850 "parsing/parser.mly" +||||||| 04da777f7 +# 2848 "parsing/parser.mly" +======= +# 2838 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 61100 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61746 "parsing/parser.ml" +||||||| 04da777f7 +# 61737 "parsing/parser.ml" +======= +# 61751 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 61160 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61806 "parsing/parser.ml" +||||||| 04da777f7 +# 61797 "parsing/parser.ml" +======= +# 61811 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +<<<<<<< HEAD +# 2849 "parsing/parser.mly" +||||||| 04da777f7 +# 2847 "parsing/parser.mly" +======= +# 2837 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 61172 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61818 "parsing/parser.ml" +||||||| 04da777f7 +# 61809 "parsing/parser.ml" +======= +# 61823 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 61177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61823 "parsing/parser.ml" +||||||| 04da777f7 +# 61814 "parsing/parser.ml" +======= +# 61828 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +<<<<<<< HEAD +# 61185 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 61190 "parsing/parser.ml" + + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 61196 "parsing/parser.ml" + + in + +# 2701 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 61202 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2838 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 61212 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 61260 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2837 "parsing/parser.mly" + ( None ) +# 61270 "parsing/parser.ml" + in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 61275 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 61281 "parsing/parser.ml" + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 61286 "parsing/parser.ml" + + in + +# 2703 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 61292 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2838 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 61302 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 61362 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2837 "parsing/parser.mly" + ( None ) +# 61374 "parsing/parser.ml" + in + let i = +# 3417 "parsing/parser.mly" + ( es ) +# 61379 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2715 "parsing/parser.mly" + (_2) +# 61387 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 61392 "parsing/parser.ml" + + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 61398 "parsing/parser.ml" + + in + +# 2703 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 61404 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2838 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 61414 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2708 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 61470 "parsing/parser.ml" + + in + +# 2839 "parsing/parser.mly" + ( _1 ) +# 61476 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2710 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 61532 "parsing/parser.ml" + + in + +# 2839 "parsing/parser.mly" + ( _1 ) +# 61538 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2712 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 61594 "parsing/parser.ml" + + in + +# 2839 "parsing/parser.mly" + ( _1 ) +# 61600 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 61648 "parsing/parser.ml" + ) = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 3417 "parsing/parser.mly" + ( es ) +# 61658 "parsing/parser.ml" + in + let _2 = + let _1 = +# 124 "" + ( None ) +# 61664 "parsing/parser.ml" + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 61669 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2708 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 61677 "parsing/parser.ml" + + in + +# 2840 "parsing/parser.mly" + ( _1 ) +# 61683 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 61743 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 3417 "parsing/parser.mly" + ( es ) +# 61755 "parsing/parser.ml" + in + let _2 = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2715 "parsing/parser.mly" + (_2) +# 61763 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 61768 "parsing/parser.ml" + + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +# 61774 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2708 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 61782 "parsing/parser.ml" + + in + +# 2840 "parsing/parser.mly" + ( _1 ) +# 61788 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 61836 "parsing/parser.ml" + ) = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 3417 "parsing/parser.mly" + ( es ) +# 61846 "parsing/parser.ml" + in + let _2 = + let _1 = +# 124 "" + ( None ) +# 61852 "parsing/parser.ml" + in +======= +<<<<<<< HEAD +# 61831 "parsing/parser.ml" +||||||| 04da777f7 +# 61822 "parsing/parser.ml" +======= +# 61836 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 61836 "parsing/parser.ml" +||||||| 04da777f7 +# 61827 "parsing/parser.ml" +======= +# 61841 "parsing/parser.ml" +>>>>>>> origin/main + + in +>>>>>>> upstream/main + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 61857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61842 "parsing/parser.ml" +||||||| 04da777f7 +# 61833 "parsing/parser.ml" +======= +# 61847 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2710 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 61865 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 2713 "parsing/parser.mly" +||||||| 04da777f7 +# 2711 "parsing/parser.mly" +======= +# 2701 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Brace, i, r ) +<<<<<<< HEAD +# 61848 "parsing/parser.ml" +||||||| 04da777f7 +# 61839 "parsing/parser.ml" +======= +# 61853 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2840 "parsing/parser.mly" + ( _1 ) +# 61871 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 2850 "parsing/parser.mly" +||||||| 04da777f7 +# 2848 "parsing/parser.mly" +======= +# 2838 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 61858 "parsing/parser.ml" +||||||| 04da777f7 +# 61849 "parsing/parser.ml" +======= +# 61863 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 61931 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 61906 "parsing/parser.ml" +||||||| 04da777f7 +# 61897 "parsing/parser.ml" +======= +# 61911 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = +<<<<<<< HEAD + let _4 = +======= + let r = +<<<<<<< HEAD +# 2849 "parsing/parser.mly" +||||||| 04da777f7 +# 2847 "parsing/parser.mly" +======= +# 2837 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 61916 "parsing/parser.ml" +||||||| 04da777f7 +# 61907 "parsing/parser.ml" +======= +# 61921 "parsing/parser.ml" +>>>>>>> origin/main + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +>>>>>>> upstream/main +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 61943 "parsing/parser.ml" + in + let _2 = +======= +<<<<<<< HEAD +# 61921 "parsing/parser.ml" +||||||| 04da777f7 +# 61912 "parsing/parser.ml" +======= +# 61926 "parsing/parser.ml" +>>>>>>> origin/main + in + let d = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 61927 "parsing/parser.ml" +||||||| 04da777f7 +# 61918 "parsing/parser.ml" +======= +# 61932 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 61932 "parsing/parser.ml" +||||||| 04da777f7 +# 61923 "parsing/parser.ml" +======= +# 61937 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +<<<<<<< HEAD +# 61938 "parsing/parser.ml" +||||||| 04da777f7 +# 61929 "parsing/parser.ml" +======= +# 61943 "parsing/parser.ml" +>>>>>>> origin/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2850 "parsing/parser.mly" +||||||| 04da777f7 +# 2848 "parsing/parser.mly" +======= +# 2838 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 61948 "parsing/parser.ml" +||||||| 04da777f7 +# 61939 "parsing/parser.ml" +======= +# 61953 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 62008 "parsing/parser.ml" +||||||| 04da777f7 +# 61999 "parsing/parser.ml" +======= +# 62013 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +<<<<<<< HEAD +# 2849 "parsing/parser.mly" +||||||| 04da777f7 +# 2847 "parsing/parser.mly" +======= +# 2837 "parsing/parser.mly" +>>>>>>> origin/main + ( None ) +<<<<<<< HEAD +# 62020 "parsing/parser.ml" +||||||| 04da777f7 +# 62011 "parsing/parser.ml" +======= +# 62025 "parsing/parser.ml" +>>>>>>> origin/main + in + let i = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 62025 "parsing/parser.ml" +||||||| 04da777f7 +# 62016 "parsing/parser.ml" +======= +# 62030 "parsing/parser.ml" +>>>>>>> origin/main + in + let d = +>>>>>>> upstream/main + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +<<<<<<< HEAD +# 61951 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62033 "parsing/parser.ml" +||||||| 04da777f7 +# 62024 "parsing/parser.ml" +======= +# 62038 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 61956 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62038 "parsing/parser.ml" +||||||| 04da777f7 +# 62029 "parsing/parser.ml" +======= +# 62043 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 61962 "parsing/parser.ml" + + in +======= +<<<<<<< HEAD +# 62044 "parsing/parser.ml" +||||||| 04da777f7 +# 62035 "parsing/parser.ml" +======= +# 62049 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2715 "parsing/parser.mly" +||||||| 04da777f7 +# 2713 "parsing/parser.mly" +======= +# 2703 "parsing/parser.mly" +>>>>>>> origin/main + ( array, d, Bracket, i, r ) +<<<<<<< HEAD +# 62050 "parsing/parser.ml" +||||||| 04da777f7 +# 62041 "parsing/parser.ml" +======= +# 62055 "parsing/parser.ml" +>>>>>>> origin/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2850 "parsing/parser.mly" +||||||| 04da777f7 +# 2848 "parsing/parser.mly" +======= +# 2838 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +<<<<<<< HEAD +# 62060 "parsing/parser.ml" +||||||| 04da777f7 +# 62051 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2718 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 62107 "parsing/parser.ml" + + in + +# 2849 "parsing/parser.mly" + ( _1 ) +# 62113 "parsing/parser.ml" +======= +# 62065 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2708 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 62121 "parsing/parser.ml" + + in + +# 2839 "parsing/parser.mly" + ( _1 ) +# 62127 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = +>>>>>>> upstream/main + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2720 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 62116 "parsing/parser.ml" +||||||| 04da777f7 +# 2720 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 62169 "parsing/parser.ml" +======= +# 2710 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +<<<<<<< HEAD +# 61970 "parsing/parser.ml" + + in + +# 2840 "parsing/parser.mly" + ( _1 ) +# 61976 "parsing/parser.ml" +======= +# 62183 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2851 "parsing/parser.mly" +||||||| 04da777f7 +# 2849 "parsing/parser.mly" +======= +# 2839 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62122 "parsing/parser.ml" +||||||| 04da777f7 +# 62175 "parsing/parser.ml" +======= +# 62189 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2722 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 62178 "parsing/parser.ml" +||||||| 04da777f7 +# 2722 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 62231 "parsing/parser.ml" +======= +# 2712 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 62245 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2851 "parsing/parser.mly" +||||||| 04da777f7 +# 2849 "parsing/parser.mly" +======= +# 2839 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62184 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2724 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 62240 "parsing/parser.ml" + + in + +# 2851 "parsing/parser.mly" + ( _1 ) +# 62246 "parsing/parser.ml" +||||||| 04da777f7 +# 62237 "parsing/parser.ml" +======= +# 62251 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 62024 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62294 "parsing/parser.ml" +||||||| 04da777f7 +# 62285 "parsing/parser.ml" +======= +# 62299 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 62034 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62304 "parsing/parser.ml" +||||||| 04da777f7 +# 62295 "parsing/parser.ml" +======= +# 62309 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _2 = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 62040 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62310 "parsing/parser.ml" +||||||| 04da777f7 +# 62301 "parsing/parser.ml" +======= +# 62315 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 62045 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62315 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2712 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 62053 "parsing/parser.ml" +======= +# 2720 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 62323 "parsing/parser.ml" + + in + +# 2852 "parsing/parser.mly" + ( _1 ) +# 62329 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 993 "parsing/parser.mly" + (string) +# 62389 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 3429 "parsing/parser.mly" + ( es ) +# 62401 "parsing/parser.ml" + in + let _2 = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2727 "parsing/parser.mly" + (_2) +# 62409 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 62414 "parsing/parser.ml" + + in + +# 2727 "parsing/parser.mly" + ( _1, _2 ) +# 62420 "parsing/parser.ml" +||||||| 04da777f7 +# 62306 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2718 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 62314 "parsing/parser.ml" + + in + +# 2850 "parsing/parser.mly" + ( _1 ) +# 62320 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 993 "parsing/parser.mly" + (string) +# 62380 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 3427 "parsing/parser.mly" + ( es ) +# 62392 "parsing/parser.ml" + in + let _2 = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2725 "parsing/parser.mly" + (_2) +# 62400 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 62405 "parsing/parser.ml" + + in + +# 2725 "parsing/parser.mly" + ( _1, _2 ) +# 62411 "parsing/parser.ml" +======= +# 62320 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2720 "parsing/parser.mly" +||||||| 04da777f7 +# 2718 "parsing/parser.mly" +======= +# 2708 "parsing/parser.mly" +>>>>>>> origin/main + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +<<<<<<< HEAD +# 62428 "parsing/parser.ml" + + in + +# 2852 "parsing/parser.mly" + ( _1 ) +# 62434 "parsing/parser.ml" +||||||| 04da777f7 +# 62419 "parsing/parser.ml" + + in + +# 2850 "parsing/parser.mly" + ( _1 ) +# 62425 "parsing/parser.ml" +======= +# 62328 "parsing/parser.ml" +>>>>>>> upstream/main + + in + +# 2840 "parsing/parser.mly" + ( _1 ) +# 62059 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +# 62119 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 3417 "parsing/parser.mly" + ( es ) +# 62131 "parsing/parser.ml" + in + let _2 = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2715 "parsing/parser.mly" + (_2) +# 62139 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 62144 "parsing/parser.ml" + + in + +# 2715 "parsing/parser.mly" + ( _1, _2 ) +<<<<<<< HEAD +# 62150 "parsing/parser.ml" +======= +# 62425 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2708 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 62433 "parsing/parser.ml" + + in + +# 2840 "parsing/parser.mly" + ( _1 ) +# 62439 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 62482 "parsing/parser.ml" +||||||| 04da777f7 +# 62473 "parsing/parser.ml" +======= +# 62487 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 62492 "parsing/parser.ml" +||||||| 04da777f7 +# 62483 "parsing/parser.ml" +======= +# 62497 "parsing/parser.ml" +>>>>>>> origin/main + in + let _2 = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 62498 "parsing/parser.ml" +||||||| 04da777f7 +# 62489 "parsing/parser.ml" +======= +# 62503 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 62503 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2722 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 62511 "parsing/parser.ml" + + in + +# 2852 "parsing/parser.mly" + ( _1 ) +# 62517 "parsing/parser.ml" +||||||| 04da777f7 +# 62494 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2720 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 62502 "parsing/parser.ml" + + in + +# 2850 "parsing/parser.mly" + ( _1 ) +# 62508 "parsing/parser.ml" +======= +# 62508 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2710 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 62516 "parsing/parser.ml" + + in + +# 2840 "parsing/parser.mly" + ( _1 ) +# 62522 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 62577 "parsing/parser.ml" +||||||| 04da777f7 +# 62568 "parsing/parser.ml" +======= +# 62582 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 62589 "parsing/parser.ml" +||||||| 04da777f7 +# 62580 "parsing/parser.ml" +======= +# 62594 "parsing/parser.ml" +>>>>>>> origin/main + in + let _2 = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +<<<<<<< HEAD +# 62597 "parsing/parser.ml" +||||||| 04da777f7 +# 62588 "parsing/parser.ml" +======= +# 62602 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 62602 "parsing/parser.ml" +||||||| 04da777f7 +# 62593 "parsing/parser.ml" +======= +# 62607 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 62608 "parsing/parser.ml" +||||||| 04da777f7 +# 62599 "parsing/parser.ml" +======= +# 62613 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2722 "parsing/parser.mly" +||||||| 04da777f7 +# 2720 "parsing/parser.mly" +======= +# 2710 "parsing/parser.mly" +>>>>>>> origin/main + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +<<<<<<< HEAD +# 62616 "parsing/parser.ml" +||||||| 04da777f7 +# 62607 "parsing/parser.ml" +======= +# 62621 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2852 "parsing/parser.mly" +||||||| 04da777f7 +# 2850 "parsing/parser.mly" +======= +# 2840 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62622 "parsing/parser.ml" +||||||| 04da777f7 +# 62613 "parsing/parser.ml" +======= +# 62627 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 62670 "parsing/parser.ml" +||||||| 04da777f7 +# 62661 "parsing/parser.ml" +======= +# 62675 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 62680 "parsing/parser.ml" +||||||| 04da777f7 +# 62671 "parsing/parser.ml" +======= +# 62685 "parsing/parser.ml" +>>>>>>> origin/main + in + let _2 = + let _1 = +# 124 "" + ( None ) +<<<<<<< HEAD +# 62686 "parsing/parser.ml" +||||||| 04da777f7 +# 62677 "parsing/parser.ml" +======= +# 62691 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 62691 "parsing/parser.ml" +||||||| 04da777f7 +# 62682 "parsing/parser.ml" +======= +# 62696 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2724 "parsing/parser.mly" +||||||| 04da777f7 +# 2722 "parsing/parser.mly" +======= +# 2712 "parsing/parser.mly" +>>>>>>> origin/main + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +<<<<<<< HEAD +# 62158 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62699 "parsing/parser.ml" +||||||| 04da777f7 +# 62690 "parsing/parser.ml" +======= +# 62704 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2852 "parsing/parser.mly" +||||||| 04da777f7 +# 2850 "parsing/parser.mly" +======= +# 2840 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62164 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62705 "parsing/parser.ml" +||||||| 04da777f7 +# 62696 "parsing/parser.ml" +======= +# 62710 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 983 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 62765 "parsing/parser.ml" +||||||| 04da777f7 +# 62756 "parsing/parser.ml" +======= +# 62770 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 62777 "parsing/parser.ml" +||||||| 04da777f7 +# 62768 "parsing/parser.ml" +======= +# 62782 "parsing/parser.ml" +>>>>>>> origin/main + in + let _2 = + let _1 = + let _2 = _2_inlined1 in + let x = +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + (_2) +<<<<<<< HEAD +# 62785 "parsing/parser.ml" +||||||| 04da777f7 +# 62776 "parsing/parser.ml" +======= +# 62790 "parsing/parser.ml" +>>>>>>> origin/main + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 62790 "parsing/parser.ml" +||||||| 04da777f7 +# 62781 "parsing/parser.ml" +======= +# 62795 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2727 "parsing/parser.mly" +||||||| 04da777f7 +# 2725 "parsing/parser.mly" +======= +# 2715 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 62796 "parsing/parser.ml" +||||||| 04da777f7 +# 62787 "parsing/parser.ml" +======= +# 62801 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +<<<<<<< HEAD +# 2724 "parsing/parser.mly" +||||||| 04da777f7 +# 2722 "parsing/parser.mly" +======= +# 2712 "parsing/parser.mly" +>>>>>>> origin/main + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +<<<<<<< HEAD +# 62804 "parsing/parser.ml" +||||||| 04da777f7 +# 62795 "parsing/parser.ml" +======= +# 62809 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 2852 "parsing/parser.mly" +||||||| 04da777f7 +# 2850 "parsing/parser.mly" +======= +# 2840 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62810 "parsing/parser.ml" +||||||| 04da777f7 +# 62801 "parsing/parser.ml" +======= +# 62815 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = e; + MenhirLib.EngineTypes.startp = _startpos_e_; + MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let e : (Parsetree.expression) = Obj.magic e in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let attrs = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62220 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62866 "parsing/parser.ml" +||||||| 04da777f7 +# 62857 "parsing/parser.ml" +======= +# 62871 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2876 "parsing/parser.mly" +||||||| 04da777f7 +# 2874 "parsing/parser.mly" +======= +# 2864 "parsing/parser.mly" +>>>>>>> origin/main + ( e.pexp_desc, (ext, attrs @ e.pexp_attributes) ) +<<<<<<< HEAD +# 62226 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62872 "parsing/parser.ml" +||||||| 04da777f7 +# 62863 "parsing/parser.ml" +======= +# 62877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62237 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62883 "parsing/parser.ml" +||||||| 04da777f7 +# 62874 "parsing/parser.ml" +======= +# 62888 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62288 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 62294 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62934 "parsing/parser.ml" +||||||| 04da777f7 +# 62925 "parsing/parser.ml" +======= +# 62939 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 62940 "parsing/parser.ml" +||||||| 04da777f7 +# 62931 "parsing/parser.ml" +======= +# 62945 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2878 "parsing/parser.mly" +||||||| 04da777f7 +# 2876 "parsing/parser.mly" +======= +# 2866 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_construct (mkloc (Lident "()") (make_loc _sloc), None), _2 ) +<<<<<<< HEAD +# 62303 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62949 "parsing/parser.ml" +||||||| 04da777f7 +# 62940 "parsing/parser.ml" +======= +# 62954 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62314 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 62960 "parsing/parser.ml" +||||||| 04da777f7 +# 62951 "parsing/parser.ml" +======= +# 62965 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62372 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 62378 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63018 "parsing/parser.ml" +||||||| 04da777f7 +# 63009 "parsing/parser.ml" +======= +# 63023 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 63024 "parsing/parser.ml" +||||||| 04da777f7 +# 63015 "parsing/parser.ml" +======= +# 63029 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__4_ = (_startpos__4_, _endpos__4_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2880 "parsing/parser.mly" +||||||| 04da777f7 +# 2878 "parsing/parser.mly" +======= +# 2868 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "begin" _loc__1_ "end" _loc__4_ ) +<<<<<<< HEAD +# 62386 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63032 "parsing/parser.ml" +||||||| 04da777f7 +# 63023 "parsing/parser.ml" +======= +# 63037 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62397 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63043 "parsing/parser.ml" +||||||| 04da777f7 +# 63034 "parsing/parser.ml" +======= +# 63048 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.expression) = let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 62449 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63095 "parsing/parser.ml" +||||||| 04da777f7 +# 63086 "parsing/parser.ml" +======= +# 63100 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62459 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 62465 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63105 "parsing/parser.ml" +||||||| 04da777f7 +# 63096 "parsing/parser.ml" +======= +# 63110 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 63111 "parsing/parser.ml" +||||||| 04da777f7 +# 63102 "parsing/parser.ml" +======= +# 63116 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2882 "parsing/parser.mly" +||||||| 04da777f7 +# 2880 "parsing/parser.mly" +======= +# 2870 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_new(_3), _2 ) +<<<<<<< HEAD +# 62471 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63117 "parsing/parser.ml" +||||||| 04da777f7 +# 63108 "parsing/parser.ml" +======= +# 63122 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62482 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63128 "parsing/parser.ml" +||||||| 04da777f7 +# 63119 "parsing/parser.ml" +======= +# 63133 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.module_expr) = Obj.magic _4 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62547 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 62553 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63193 "parsing/parser.ml" +||||||| 04da777f7 +# 63184 "parsing/parser.ml" +======= +# 63198 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 63199 "parsing/parser.ml" +||||||| 04da777f7 +# 63190 "parsing/parser.ml" +======= +# 63204 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2884 "parsing/parser.mly" +||||||| 04da777f7 +# 2882 "parsing/parser.mly" +======= +# 2872 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_pack _4, _3 ) +<<<<<<< HEAD +# 62559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63205 "parsing/parser.ml" +||||||| 04da777f7 +# 63196 "parsing/parser.ml" +======= +# 63210 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62570 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63216 "parsing/parser.ml" +||||||| 04da777f7 +# 63207 "parsing/parser.ml" +======= +# 63221 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.module_expr) = Obj.magic _4 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__7_ in + let _v : (Parsetree.expression) = let _1 = + let _6 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 62652 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 63298 "parsing/parser.ml" +||||||| 04da777f7 +# 63289 "parsing/parser.ml" +======= +# 63303 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62662 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 62668 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63308 "parsing/parser.ml" +||||||| 04da777f7 +# 63299 "parsing/parser.ml" +======= +# 63313 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 63314 "parsing/parser.ml" +||||||| 04da777f7 +# 63305 "parsing/parser.ml" +======= +# 63319 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__7_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2886 "parsing/parser.mly" +||||||| 04da777f7 +# 2884 "parsing/parser.mly" +======= +# 2874 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _4), _6), _3 ) +<<<<<<< HEAD +# 62677 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63323 "parsing/parser.ml" +||||||| 04da777f7 +# 63314 "parsing/parser.ml" +======= +# 63328 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__7_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62688 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63334 "parsing/parser.ml" +||||||| 04da777f7 +# 63325 "parsing/parser.ml" +======= +# 63339 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.module_expr) = Obj.magic _4 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v : (Parsetree.expression) = let _1 = + let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62760 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 62766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63406 "parsing/parser.ml" +||||||| 04da777f7 +# 63397 "parsing/parser.ml" +======= +# 63411 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 63412 "parsing/parser.ml" +||||||| 04da777f7 +# 63403 "parsing/parser.ml" +======= +# 63417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2888 "parsing/parser.mly" +||||||| 04da777f7 +# 2886 "parsing/parser.mly" +======= +# 2876 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +<<<<<<< HEAD +# 62774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63420 "parsing/parser.ml" +||||||| 04da777f7 +# 63411 "parsing/parser.ml" +======= +# 63425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__6_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62785 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63431 "parsing/parser.ml" +||||||| 04da777f7 +# 63422 "parsing/parser.ml" +======= +# 63436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xss; + MenhirLib.EngineTypes.startp = _startpos_xss_; + MenhirLib.EngineTypes.endp = _endpos_xss_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xss : (Parsetree.class_field list list) = Obj.magic xss in + let _1_inlined3 : (Parsetree.pattern) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _3 = + let _1 = _1_inlined3 in + let _2 = + let _1 = + let _1 = +# 260 "" + ( List.flatten xss ) +<<<<<<< HEAD +# 62850 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63496 "parsing/parser.ml" +||||||| 04da777f7 +# 63487 "parsing/parser.ml" +======= +# 63501 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2323 "parsing/parser.mly" +||||||| 04da777f7 +# 2321 "parsing/parser.mly" +======= +# 2311 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63501 "parsing/parser.ml" +||||||| 04da777f7 +# 63492 "parsing/parser.ml" +======= +# 63506 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + +# 1189 "parsing/parser.mly" + ( extra_cstr _startpos _endpos _1 ) +<<<<<<< HEAD +# 62864 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63510 "parsing/parser.ml" +||||||| 04da777f7 +# 63501 "parsing/parser.ml" +======= +# 63515 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2310 "parsing/parser.mly" +||||||| 04da777f7 +# 2308 "parsing/parser.mly" +======= +# 2298 "parsing/parser.mly" +>>>>>>> origin/main + ( Cstr.mk _1 _2 ) +<<<<<<< HEAD +# 62870 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63516 "parsing/parser.ml" +||||||| 04da777f7 +# 63507 "parsing/parser.ml" +======= +# 63521 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62880 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 62886 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63526 "parsing/parser.ml" +||||||| 04da777f7 +# 63517 "parsing/parser.ml" +======= +# 63531 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 63532 "parsing/parser.ml" +||||||| 04da777f7 +# 63523 "parsing/parser.ml" +======= +# 63537 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2890 "parsing/parser.mly" +||||||| 04da777f7 +# 2888 "parsing/parser.mly" +======= +# 2878 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_object _3, _2 ) +<<<<<<< HEAD +# 62892 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63538 "parsing/parser.ml" +||||||| 04da777f7 +# 63529 "parsing/parser.ml" +======= +# 63543 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 62903 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63549 "parsing/parser.ml" +||||||| 04da777f7 +# 63540 "parsing/parser.ml" +======= +# 63554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xss; + MenhirLib.EngineTypes.startp = _startpos_xss_; + MenhirLib.EngineTypes.endp = _endpos_xss_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xss : (Parsetree.class_field list list) = Obj.magic xss in + let _1_inlined3 : (Parsetree.pattern) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _3 = + let _1 = _1_inlined3 in + let _2 = + let _1 = + let _1 = +# 260 "" + ( List.flatten xss ) +<<<<<<< HEAD +# 62968 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63614 "parsing/parser.ml" +||||||| 04da777f7 +# 63605 "parsing/parser.ml" +======= +# 63619 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2323 "parsing/parser.mly" +||||||| 04da777f7 +# 2321 "parsing/parser.mly" +======= +# 2311 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 62973 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63619 "parsing/parser.ml" +||||||| 04da777f7 +# 63610 "parsing/parser.ml" +======= +# 63624 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + +# 1189 "parsing/parser.mly" + ( extra_cstr _startpos _endpos _1 ) +<<<<<<< HEAD +# 62982 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63628 "parsing/parser.ml" +||||||| 04da777f7 +# 63619 "parsing/parser.ml" +======= +# 63633 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2310 "parsing/parser.mly" +||||||| 04da777f7 +# 2308 "parsing/parser.mly" +======= +# 2298 "parsing/parser.mly" +>>>>>>> origin/main + ( Cstr.mk _1 _2 ) +<<<<<<< HEAD +# 62988 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63634 "parsing/parser.ml" +||||||| 04da777f7 +# 63625 "parsing/parser.ml" +======= +# 63639 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 62998 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 63004 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63644 "parsing/parser.ml" +||||||| 04da777f7 +# 63635 "parsing/parser.ml" +======= +# 63649 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 63650 "parsing/parser.ml" +||||||| 04da777f7 +# 63641 "parsing/parser.ml" +======= +# 63655 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__4_ = (_startpos__4_, _endpos__4_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2892 "parsing/parser.mly" +||||||| 04da777f7 +# 2890 "parsing/parser.mly" +======= +# 2880 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "object" _loc__1_ "end" _loc__4_ ) +<<<<<<< HEAD +# 63012 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63658 "parsing/parser.ml" +||||||| 04da777f7 +# 63649 "parsing/parser.ml" +======= +# 63663 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2854 "parsing/parser.mly" +||||||| 04da777f7 +# 2852 "parsing/parser.mly" +======= +# 2842 "parsing/parser.mly" +>>>>>>> origin/main + ( let desc, attrs = _1 in + mkexp_attrs ~loc:_sloc desc attrs ) +<<<<<<< HEAD +# 63023 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63669 "parsing/parser.ml" +||||||| 04da777f7 +# 63660 "parsing/parser.ml" +======= +# 63674 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 63054 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63700 "parsing/parser.ml" +||||||| 04da777f7 +# 63691 "parsing/parser.ml" + + in + +# 2979 "parsing/parser.mly" + ( Pexp_ident (_1) ) +# 63697 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1238 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +# 63706 "parsing/parser.ml" + + in + +# 2855 "parsing/parser.mly" + ( _1 ) +# 63712 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1205 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 63743 "parsing/parser.ml" +======= +# 63705 "parsing/parser.ml" +>>>>>>> upstream/main + + in + +# 2969 "parsing/parser.mly" + ( Pexp_ident (_1) ) +# 63060 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +# 63069 "parsing/parser.ml" + + in + +# 2845 "parsing/parser.mly" + ( _1 ) +# 63075 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 63106 "parsing/parser.ml" +======= +# 63757 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2981 "parsing/parser.mly" + ( Pexp_ident (_1) ) +# 63706 "parsing/parser.ml" +||||||| 04da777f7 +# 2981 "parsing/parser.mly" + ( Pexp_construct(_1, None) ) +# 63749 "parsing/parser.ml" +======= +# 2971 "parsing/parser.mly" + ( Pexp_construct(_1, None) ) +<<<<<<< HEAD +# 63112 "parsing/parser.ml" +======= +# 63763 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63121 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63715 "parsing/parser.ml" +||||||| 04da777f7 +# 63758 "parsing/parser.ml" +======= +# 63772 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63127 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63721 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1205 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 63752 "parsing/parser.ml" + + in + +# 2983 "parsing/parser.mly" + ( Pexp_construct(_1, None) ) +# 63758 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1238 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +# 63767 "parsing/parser.ml" + + in + +# 2857 "parsing/parser.mly" + ( _1 ) +# 63773 "parsing/parser.ml" +||||||| 04da777f7 +# 63764 "parsing/parser.ml" +======= +# 63778 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = +<<<<<<< HEAD +# 2985 "parsing/parser.mly" +||||||| 04da777f7 +# 2983 "parsing/parser.mly" +======= +# 2973 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_variant(_1, None) ) +<<<<<<< HEAD +# 63153 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63799 "parsing/parser.ml" +||||||| 04da777f7 +# 63790 "parsing/parser.ml" +======= +# 63804 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63161 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63807 "parsing/parser.ml" +||||||| 04da777f7 +# 63798 "parsing/parser.ml" +======= +# 63812 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63167 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63813 "parsing/parser.ml" +||||||| 04da777f7 +# 63804 "parsing/parser.ml" +======= +# 63818 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : ( +# 1033 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 63195 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63841 "parsing/parser.ml" +||||||| 04da777f7 +# 63832 "parsing/parser.ml" +======= +# 63846 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63209 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63855 "parsing/parser.ml" +||||||| 04da777f7 +# 63846 "parsing/parser.ml" +======= +# 63860 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2987 "parsing/parser.mly" +||||||| 04da777f7 +# 2985 "parsing/parser.mly" +======= +# 2975 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_apply(_1, [Nolabel,_2]) ) +<<<<<<< HEAD +# 63215 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63861 "parsing/parser.ml" +||||||| 04da777f7 +# 63852 "parsing/parser.ml" +======= +# 63866 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63225 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63871 "parsing/parser.ml" +||||||| 04da777f7 +# 63862 "parsing/parser.ml" +======= +# 63876 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63231 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63877 "parsing/parser.ml" +||||||| 04da777f7 +# 63868 "parsing/parser.ml" +======= +# 63882 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _1 = +<<<<<<< HEAD +# 2988 "parsing/parser.mly" +||||||| 04da777f7 +# 2986 "parsing/parser.mly" +======= +# 2976 "parsing/parser.mly" +>>>>>>> origin/main + ("!") +<<<<<<< HEAD +# 63266 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63912 "parsing/parser.ml" +||||||| 04da777f7 +# 63903 "parsing/parser.ml" +======= +# 63917 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63274 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63920 "parsing/parser.ml" +||||||| 04da777f7 +# 63911 "parsing/parser.ml" +======= +# 63925 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2989 "parsing/parser.mly" +||||||| 04da777f7 +# 2987 "parsing/parser.mly" +======= +# 2977 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_apply(_1, [Nolabel,_2]) ) +<<<<<<< HEAD +# 63280 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63926 "parsing/parser.ml" +||||||| 04da777f7 +# 63917 "parsing/parser.ml" +======= +# 63931 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63290 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63936 "parsing/parser.ml" +||||||| 04da777f7 +# 63927 "parsing/parser.ml" +======= +# 63941 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63296 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63942 "parsing/parser.ml" +||||||| 04da777f7 +# 63933 "parsing/parser.ml" +======= +# 63947 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let xs : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3412 "parsing/parser.mly" +||||||| 04da777f7 +# 3410 "parsing/parser.mly" +======= +# 3400 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 63337 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63983 "parsing/parser.ml" +||||||| 04da777f7 +# 63974 "parsing/parser.ml" +======= +# 63988 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2991 "parsing/parser.mly" +||||||| 04da777f7 +# 2989 "parsing/parser.mly" +======= +# 2979 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_override _2 ) +<<<<<<< HEAD +# 63342 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63988 "parsing/parser.ml" +||||||| 04da777f7 +# 63979 "parsing/parser.ml" +======= +# 63993 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63352 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 63998 "parsing/parser.ml" +||||||| 04da777f7 +# 63989 "parsing/parser.ml" +======= +# 64003 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63358 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64004 "parsing/parser.ml" +||||||| 04da777f7 +# 63995 "parsing/parser.ml" +======= +# 64009 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let xs : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3412 "parsing/parser.mly" +||||||| 04da777f7 +# 3410 "parsing/parser.mly" +======= +# 3400 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 63399 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64045 "parsing/parser.ml" +||||||| 04da777f7 +# 64036 "parsing/parser.ml" +======= +# 64050 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2993 "parsing/parser.mly" +||||||| 04da777f7 +# 2991 "parsing/parser.mly" +======= +# 2981 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "{<" _loc__1_ ">}" _loc__3_ ) +<<<<<<< HEAD +# 63406 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64052 "parsing/parser.ml" +||||||| 04da777f7 +# 64043 "parsing/parser.ml" +======= +# 64057 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63416 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64062 "parsing/parser.ml" +||||||| 04da777f7 +# 64053 "parsing/parser.ml" +======= +# 64067 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63422 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64068 "parsing/parser.ml" +||||||| 04da777f7 +# 64059 "parsing/parser.ml" +======= +# 64073 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = +<<<<<<< HEAD +# 2995 "parsing/parser.mly" +||||||| 04da777f7 +# 2993 "parsing/parser.mly" +======= +# 2983 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_override [] ) +<<<<<<< HEAD +# 63455 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64101 "parsing/parser.ml" +||||||| 04da777f7 +# 64092 "parsing/parser.ml" +======= +# 64106 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63464 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64110 "parsing/parser.ml" +||||||| 04da777f7 +# 64101 "parsing/parser.ml" +======= +# 64115 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63470 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64116 "parsing/parser.ml" +||||||| 04da777f7 +# 64107 "parsing/parser.ml" +======= +# 64121 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 63516 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64162 "parsing/parser.ml" +||||||| 04da777f7 +# 64153 "parsing/parser.ml" +======= +# 64167 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2997 "parsing/parser.mly" +||||||| 04da777f7 +# 2995 "parsing/parser.mly" +======= +# 2985 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_field(_1, _3) ) +<<<<<<< HEAD +# 63522 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64168 "parsing/parser.ml" +||||||| 04da777f7 +# 64159 "parsing/parser.ml" +======= +# 64173 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63532 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64178 "parsing/parser.ml" +||||||| 04da777f7 +# 64169 "parsing/parser.ml" +======= +# 64183 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63538 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64184 "parsing/parser.ml" +||||||| 04da777f7 +# 64175 "parsing/parser.ml" +======= +# 64189 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 63598 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64244 "parsing/parser.ml" +||||||| 04da777f7 +# 64235 "parsing/parser.ml" +======= +# 64249 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 63607 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64253 "parsing/parser.ml" +||||||| 04da777f7 +# 64244 "parsing/parser.ml" +======= +# 64258 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2999 "parsing/parser.mly" +||||||| 04da777f7 +# 2997 "parsing/parser.mly" +======= +# 2987 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, _4) ) +<<<<<<< HEAD +# 63613 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64259 "parsing/parser.ml" +||||||| 04da777f7 +# 64250 "parsing/parser.ml" +======= +# 64264 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63623 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64269 "parsing/parser.ml" +||||||| 04da777f7 +# 64260 "parsing/parser.ml" +======= +# 64274 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63629 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64275 "parsing/parser.ml" +||||||| 04da777f7 +# 64266 "parsing/parser.ml" +======= +# 64280 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let xs : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _4 = +<<<<<<< HEAD +# 3412 "parsing/parser.mly" +||||||| 04da777f7 +# 3410 "parsing/parser.mly" +======= +# 3400 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 63684 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64330 "parsing/parser.ml" +||||||| 04da777f7 +# 64321 "parsing/parser.ml" +======= +# 64335 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 63694 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64340 "parsing/parser.ml" +||||||| 04da777f7 +# 64331 "parsing/parser.ml" +======= +# 64345 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 63703 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64349 "parsing/parser.ml" +||||||| 04da777f7 +# 64340 "parsing/parser.ml" +======= +# 64354 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_od_ = _startpos__1_ in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos_od_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3001 "parsing/parser.mly" +||||||| 04da777f7 +# 2999 "parsing/parser.mly" +======= +# 2989 "parsing/parser.mly" +>>>>>>> origin/main + ( (* TODO: review the location of Pexp_override *) + Pexp_open(od, mkexp ~loc:_sloc (Pexp_override _4)) ) +<<<<<<< HEAD +# 63714 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64360 "parsing/parser.ml" +||||||| 04da777f7 +# 64351 "parsing/parser.ml" +======= +# 64365 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63724 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64370 "parsing/parser.ml" +||||||| 04da777f7 +# 64361 "parsing/parser.ml" +======= +# 64375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63730 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64376 "parsing/parser.ml" +||||||| 04da777f7 +# 64367 "parsing/parser.ml" +======= +# 64381 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let xs : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _4 = +<<<<<<< HEAD +# 3412 "parsing/parser.mly" +||||||| 04da777f7 +# 3410 "parsing/parser.mly" +======= +# 3400 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 63785 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64431 "parsing/parser.ml" +||||||| 04da777f7 +# 64422 "parsing/parser.ml" +======= +# 64436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3004 "parsing/parser.mly" +||||||| 04da777f7 +# 3002 "parsing/parser.mly" +======= +# 2992 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "{<" _loc__3_ ">}" _loc__5_ ) +<<<<<<< HEAD +# 63792 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64438 "parsing/parser.ml" +||||||| 04da777f7 +# 64429 "parsing/parser.ml" +======= +# 64443 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63802 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64448 "parsing/parser.ml" +||||||| 04da777f7 +# 64439 "parsing/parser.ml" +======= +# 64453 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63808 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64454 "parsing/parser.ml" +||||||| 04da777f7 +# 64445 "parsing/parser.ml" +======= +# 64459 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 63841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64487 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +# 4624 "parsing/parser.mly" + ( _1 ) +# 64501 "parsing/parser.ml" +||||||| 04da777f7 +# 64478 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +# 4617 "parsing/parser.mly" + ( _1 ) +# 64492 "parsing/parser.ml" +======= +# 64492 "parsing/parser.ml" +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +# 4620 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 63855 "parsing/parser.ml" +======= +# 64506 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 63863 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64509 "parsing/parser.ml" +||||||| 04da777f7 +# 64500 "parsing/parser.ml" +======= +# 64514 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = +<<<<<<< HEAD +# 2975 "parsing/parser.mly" +||||||| 04da777f7 +# 2973 "parsing/parser.mly" +======= +# 2963 "parsing/parser.mly" +>>>>>>> origin/main + ( () ) +<<<<<<< HEAD +# 63869 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64515 "parsing/parser.ml" +||||||| 04da777f7 +# 64506 "parsing/parser.ml" +======= +# 64520 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3006 "parsing/parser.mly" +||||||| 04da777f7 +# 3004 "parsing/parser.mly" +======= +# 2994 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_send(_1, _3) ) +<<<<<<< HEAD +# 63874 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64520 "parsing/parser.ml" +||||||| 04da777f7 +# 64511 "parsing/parser.ml" +======= +# 64525 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63884 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64530 "parsing/parser.ml" +||||||| 04da777f7 +# 64521 "parsing/parser.ml" +======= +# 64535 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63890 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64536 "parsing/parser.ml" +||||||| 04da777f7 +# 64527 "parsing/parser.ml" +======= +# 64541 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 63923 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64569 "parsing/parser.ml" +||||||| 04da777f7 +# 64560 "parsing/parser.ml" +======= +# 64574 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 63937 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64583 "parsing/parser.ml" +||||||| 04da777f7 +# 64574 "parsing/parser.ml" +======= +# 64588 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 63945 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64591 "parsing/parser.ml" +||||||| 04da777f7 +# 64582 "parsing/parser.ml" +======= +# 64596 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = +<<<<<<< HEAD +# 2976 "parsing/parser.mly" +||||||| 04da777f7 +# 2974 "parsing/parser.mly" +======= +# 2964 "parsing/parser.mly" +>>>>>>> origin/main + ( () ) +<<<<<<< HEAD +# 63951 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64597 "parsing/parser.ml" +||||||| 04da777f7 +# 64588 "parsing/parser.ml" +======= +# 64602 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3006 "parsing/parser.mly" +||||||| 04da777f7 +# 3004 "parsing/parser.mly" +======= +# 2994 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_send(_1, _3) ) +<<<<<<< HEAD +# 63956 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64602 "parsing/parser.ml" +||||||| 04da777f7 +# 64593 "parsing/parser.ml" +======= +# 64607 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 63966 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64612 "parsing/parser.ml" +||||||| 04da777f7 +# 64603 "parsing/parser.ml" +======= +# 64617 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 63972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64618 "parsing/parser.ml" +||||||| 04da777f7 +# 64609 "parsing/parser.ml" +======= +# 64623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _1_inlined1 : ( +# 1045 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 64006 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64652 "parsing/parser.ml" +||||||| 04da777f7 +# 64643 "parsing/parser.ml" +======= +# 64657 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1222 "parsing/parser.mly" + ( mkoperator ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64022 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64668 "parsing/parser.ml" +||||||| 04da777f7 +# 64659 "parsing/parser.ml" +======= +# 64673 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3008 "parsing/parser.mly" +||||||| 04da777f7 +# 3006 "parsing/parser.mly" +======= +# 2996 "parsing/parser.mly" +>>>>>>> origin/main + ( mkinfix _1 _2 _3 ) +<<<<<<< HEAD +# 64028 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64674 "parsing/parser.ml" +||||||| 04da777f7 +# 64665 "parsing/parser.ml" +======= +# 64679 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64038 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64684 "parsing/parser.ml" +||||||| 04da777f7 +# 64675 "parsing/parser.ml" +======= +# 64689 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64044 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64690 "parsing/parser.ml" +||||||| 04da777f7 +# 64681 "parsing/parser.ml" +======= +# 64695 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.extension) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = +<<<<<<< HEAD +# 3010 "parsing/parser.mly" +||||||| 04da777f7 +# 3008 "parsing/parser.mly" +======= +# 2998 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_extension _1 ) +<<<<<<< HEAD +# 64070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64716 "parsing/parser.ml" +||||||| 04da777f7 +# 64707 "parsing/parser.ml" +======= +# 64721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64724 "parsing/parser.ml" +||||||| 04da777f7 +# 64715 "parsing/parser.ml" +======= +# 64729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64730 "parsing/parser.ml" +||||||| 04da777f7 +# 64721 "parsing/parser.ml" +======= +# 64735 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let _1 = +<<<<<<< HEAD +# 3011 "parsing/parser.mly" +||||||| 04da777f7 +# 3009 "parsing/parser.mly" +======= +# 2999 "parsing/parser.mly" +>>>>>>> origin/main + (Lident "()") +<<<<<<< HEAD +# 64134 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64780 "parsing/parser.ml" +||||||| 04da777f7 +# 64771 "parsing/parser.ml" +======= +# 64785 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 64143 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64789 "parsing/parser.ml" +||||||| 04da777f7 +# 64780 "parsing/parser.ml" +======= +# 64794 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 64155 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64801 "parsing/parser.ml" +||||||| 04da777f7 +# 64792 "parsing/parser.ml" +======= +# 64806 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 64164 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64810 "parsing/parser.ml" +||||||| 04da777f7 +# 64801 "parsing/parser.ml" +======= +# 64815 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3012 "parsing/parser.mly" +||||||| 04da777f7 +# 3010 "parsing/parser.mly" +======= +# 3000 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, mkexp ~loc:(_loc__3_) (Pexp_construct(_3, None))) ) +<<<<<<< HEAD +# 64171 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64817 "parsing/parser.ml" +||||||| 04da777f7 +# 64808 "parsing/parser.ml" +======= +# 64822 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64181 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64827 "parsing/parser.ml" +||||||| 04da777f7 +# 64818 "parsing/parser.ml" +======= +# 64832 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64187 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64833 "parsing/parser.ml" +||||||| 04da777f7 +# 64824 "parsing/parser.ml" +======= +# 64838 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3014 "parsing/parser.mly" +||||||| 04da777f7 +# 3012 "parsing/parser.mly" +======= +# 3002 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__3_ ")" _loc__5_ ) +<<<<<<< HEAD +# 64244 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64890 "parsing/parser.ml" +||||||| 04da777f7 +# 64881 "parsing/parser.ml" +======= +# 64895 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64254 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64900 "parsing/parser.ml" +||||||| 04da777f7 +# 64891 "parsing/parser.ml" +======= +# 64905 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64260 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64906 "parsing/parser.ml" +||||||| 04da777f7 +# 64897 "parsing/parser.ml" +======= +# 64911 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = +<<<<<<< HEAD +# 3016 "parsing/parser.mly" +||||||| 04da777f7 +# 3014 "parsing/parser.mly" +======= +# 3004 "parsing/parser.mly" +>>>>>>> origin/main + ( let (exten, fields) = _2 in + Pexp_record(fields, exten) ) +<<<<<<< HEAD +# 64302 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64948 "parsing/parser.ml" +||||||| 04da777f7 +# 64939 "parsing/parser.ml" +======= +# 64953 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64311 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64957 "parsing/parser.ml" +||||||| 04da777f7 +# 64948 "parsing/parser.ml" +======= +# 64962 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64317 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 64963 "parsing/parser.ml" +||||||| 04da777f7 +# 64954 "parsing/parser.ml" +======= +# 64968 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 3019 "parsing/parser.mly" +||||||| 04da777f7 +# 3017 "parsing/parser.mly" +======= +# 3007 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "{" _loc__1_ "}" _loc__3_ ) +<<<<<<< HEAD +# 64361 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65007 "parsing/parser.ml" +||||||| 04da777f7 +# 64998 "parsing/parser.ml" +======= +# 65012 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64371 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65017 "parsing/parser.ml" +||||||| 04da777f7 +# 65008 "parsing/parser.ml" +======= +# 65022 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64377 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65023 "parsing/parser.ml" +||||||| 04da777f7 +# 65014 "parsing/parser.ml" +======= +# 65028 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 64438 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65084 "parsing/parser.ml" +||||||| 04da777f7 +# 65075 "parsing/parser.ml" +======= +# 65089 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 64447 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65093 "parsing/parser.ml" +||||||| 04da777f7 +# 65084 "parsing/parser.ml" +======= +# 65098 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__5_ in + +<<<<<<< HEAD +# 3021 "parsing/parser.mly" +||||||| 04da777f7 +# 3019 "parsing/parser.mly" +======= +# 3009 "parsing/parser.mly" +>>>>>>> origin/main + ( let (exten, fields) = _4 in + Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) + (Pexp_record(fields, exten))) ) +<<<<<<< HEAD +# 64456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65102 "parsing/parser.ml" +||||||| 04da777f7 +# 65093 "parsing/parser.ml" +======= +# 65107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64466 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65112 "parsing/parser.ml" +||||||| 04da777f7 +# 65103 "parsing/parser.ml" +======= +# 65117 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65118 "parsing/parser.ml" +||||||| 04da777f7 +# 65109 "parsing/parser.ml" +======= +# 65123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3025 "parsing/parser.mly" +||||||| 04da777f7 +# 3023 "parsing/parser.mly" +======= +# 3013 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "{" _loc__3_ "}" _loc__5_ ) +<<<<<<< HEAD +# 64530 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65176 "parsing/parser.ml" +||||||| 04da777f7 +# 65167 "parsing/parser.ml" +======= +# 65181 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65186 "parsing/parser.ml" +||||||| 04da777f7 +# 65177 "parsing/parser.ml" +======= +# 65191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64546 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65192 "parsing/parser.ml" +||||||| 04da777f7 +# 65183 "parsing/parser.ml" +======= +# 65197 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let es : (Parsetree.expression list) = Obj.magic es in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 64589 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65235 "parsing/parser.ml" +||||||| 04da777f7 +# 65226 "parsing/parser.ml" +======= +# 65240 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2947 "parsing/parser.mly" +||||||| 04da777f7 +# 2945 "parsing/parser.mly" +======= +# 2935 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Literal _2 ) +<<<<<<< HEAD +# 64594 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65240 "parsing/parser.ml" +||||||| 04da777f7 +# 65231 "parsing/parser.ml" +======= +# 65245 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2956 "parsing/parser.mly" +||||||| 04da777f7 +# 2954 "parsing/parser.mly" +======= +# 2944 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple _1 ) +<<<<<<< HEAD +# 64600 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65246 "parsing/parser.ml" +||||||| 04da777f7 +# 65237 "parsing/parser.ml" +======= +# 65251 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3027 "parsing/parser.mly" +||||||| 04da777f7 +# 3025 "parsing/parser.mly" +======= +# 3015 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_desc + "[|" "|]" + (fun elts -> Pexp_array elts) + _1 + ) +<<<<<<< HEAD +# 64610 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65256 "parsing/parser.ml" +||||||| 04da777f7 +# 65247 "parsing/parser.ml" +======= +# 65261 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64620 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65266 "parsing/parser.ml" +||||||| 04da777f7 +# 65257 "parsing/parser.ml" +======= +# 65271 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64626 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65272 "parsing/parser.ml" +||||||| 04da777f7 +# 65263 "parsing/parser.ml" +======= +# 65277 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let es : (Parsetree.expression list) = Obj.magic es in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 64669 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65315 "parsing/parser.ml" +||||||| 04da777f7 +# 65306 "parsing/parser.ml" +======= +# 65320 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2949 "parsing/parser.mly" +||||||| 04da777f7 +# 2947 "parsing/parser.mly" +======= +# 2937 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) +<<<<<<< HEAD +# 64676 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65322 "parsing/parser.ml" +||||||| 04da777f7 +# 65313 "parsing/parser.ml" +======= +# 65327 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2956 "parsing/parser.mly" +||||||| 04da777f7 +# 2954 "parsing/parser.mly" +======= +# 2944 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple _1 ) +<<<<<<< HEAD +# 64682 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65328 "parsing/parser.ml" +||||||| 04da777f7 +# 65319 "parsing/parser.ml" +======= +# 65333 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3027 "parsing/parser.mly" +||||||| 04da777f7 +# 3025 "parsing/parser.mly" +======= +# 3015 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_desc + "[|" "|]" + (fun elts -> Pexp_array elts) + _1 + ) +<<<<<<< HEAD +# 64692 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65338 "parsing/parser.ml" +||||||| 04da777f7 +# 65329 "parsing/parser.ml" +======= +# 65343 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64702 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65348 "parsing/parser.ml" +||||||| 04da777f7 +# 65339 "parsing/parser.ml" +======= +# 65353 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64708 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65354 "parsing/parser.ml" +||||||| 04da777f7 +# 65345 "parsing/parser.ml" +======= +# 65359 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _1 = +<<<<<<< HEAD +# 2951 "parsing/parser.mly" +||||||| 04da777f7 +# 2949 "parsing/parser.mly" +======= +# 2939 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Literal [] ) +<<<<<<< HEAD +# 64743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65389 "parsing/parser.ml" +||||||| 04da777f7 +# 65380 "parsing/parser.ml" +======= +# 65394 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2956 "parsing/parser.mly" +||||||| 04da777f7 +# 2954 "parsing/parser.mly" +======= +# 2944 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple _1 ) +<<<<<<< HEAD +# 64748 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65394 "parsing/parser.ml" +||||||| 04da777f7 +# 65385 "parsing/parser.ml" +======= +# 65399 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3027 "parsing/parser.mly" +||||||| 04da777f7 +# 3025 "parsing/parser.mly" +======= +# 3015 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_desc + "[|" "|]" + (fun elts -> Pexp_array elts) + _1 + ) +<<<<<<< HEAD +# 64758 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65404 "parsing/parser.ml" +||||||| 04da777f7 +# 65395 "parsing/parser.ml" +======= +# 65409 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64768 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65414 "parsing/parser.ml" +||||||| 04da777f7 +# 65405 "parsing/parser.ml" +======= +# 65419 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65420 "parsing/parser.ml" +||||||| 04da777f7 +# 65411 "parsing/parser.ml" +======= +# 65425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 64830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65476 "parsing/parser.ml" +||||||| 04da777f7 +# 65467 "parsing/parser.ml" +======= +# 65481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 64840 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65486 "parsing/parser.ml" +||||||| 04da777f7 +# 65477 "parsing/parser.ml" +======= +# 65491 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 64849 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65495 "parsing/parser.ml" +||||||| 04da777f7 +# 65486 "parsing/parser.ml" +======= +# 65500 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__5_ in + +<<<<<<< HEAD +# 2958 "parsing/parser.mly" +||||||| 04da777f7 +# 2956 "parsing/parser.mly" +======= +# 2946 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, _4) + ) +<<<<<<< HEAD +# 64857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65503 "parsing/parser.ml" +||||||| 04da777f7 +# 65494 "parsing/parser.ml" +======= +# 65508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3027 "parsing/parser.mly" +||||||| 04da777f7 +# 3025 "parsing/parser.mly" +======= +# 3015 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_desc + "[|" "|]" + (fun elts -> Pexp_array elts) + _1 + ) +<<<<<<< HEAD +# 64867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65513 "parsing/parser.ml" +||||||| 04da777f7 +# 65504 "parsing/parser.ml" +======= +# 65518 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64877 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65523 "parsing/parser.ml" +||||||| 04da777f7 +# 65514 "parsing/parser.ml" +======= +# 65528 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64883 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65529 "parsing/parser.ml" +||||||| 04da777f7 +# 65520 "parsing/parser.ml" +======= +# 65534 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 64937 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65583 "parsing/parser.ml" +||||||| 04da777f7 +# 65574 "parsing/parser.ml" +======= +# 65588 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 64946 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65592 "parsing/parser.ml" +||||||| 04da777f7 +# 65583 "parsing/parser.ml" +======= +# 65597 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__4_ in + +<<<<<<< HEAD +# 2961 "parsing/parser.mly" +||||||| 04da777f7 +# 2959 "parsing/parser.mly" +======= +# 2949 "parsing/parser.mly" +>>>>>>> origin/main + ( (* TODO: review the location of Pexp_array *) + Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, []) + ) +<<<<<<< HEAD +# 64955 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65601 "parsing/parser.ml" +||||||| 04da777f7 +# 65592 "parsing/parser.ml" +======= +# 65606 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3027 "parsing/parser.mly" +||||||| 04da777f7 +# 3025 "parsing/parser.mly" +======= +# 3015 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_desc + "[|" "|]" + (fun elts -> Pexp_array elts) + _1 + ) +<<<<<<< HEAD +# 64965 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65611 "parsing/parser.ml" +||||||| 04da777f7 +# 65602 "parsing/parser.ml" +======= +# 65616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 64975 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65621 "parsing/parser.ml" +||||||| 04da777f7 +# 65612 "parsing/parser.ml" +======= +# 65626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 64981 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65627 "parsing/parser.ml" +||||||| 04da777f7 +# 65618 "parsing/parser.ml" +======= +# 65632 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 65037 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65683 "parsing/parser.ml" +||||||| 04da777f7 +# 65674 "parsing/parser.ml" +======= +# 65688 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 2966 "parsing/parser.mly" +||||||| 04da777f7 +# 2964 "parsing/parser.mly" +======= +# 2954 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple (Unclosed(_loc__3_, _loc__5_)) ) +<<<<<<< HEAD +# 65044 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65690 "parsing/parser.ml" +||||||| 04da777f7 +# 65681 "parsing/parser.ml" +======= +# 65695 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3027 "parsing/parser.mly" +||||||| 04da777f7 +# 3025 "parsing/parser.mly" +======= +# 3015 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_desc + "[|" "|]" + (fun elts -> Pexp_array elts) + _1 + ) +<<<<<<< HEAD +# 65054 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65700 "parsing/parser.ml" +||||||| 04da777f7 +# 65691 "parsing/parser.ml" +======= +# 65705 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 65064 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65710 "parsing/parser.ml" +||||||| 04da777f7 +# 65701 "parsing/parser.ml" +======= +# 65715 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65716 "parsing/parser.ml" +||||||| 04da777f7 +# 65707 "parsing/parser.ml" +======= +# 65721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let es : (Parsetree.expression list) = Obj.magic es in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 65111 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65757 "parsing/parser.ml" +||||||| 04da777f7 +# 65748 "parsing/parser.ml" +======= +# 65762 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3033 "parsing/parser.mly" +||||||| 04da777f7 +# 3031 "parsing/parser.mly" +======= +# 3021 "parsing/parser.mly" +>>>>>>> origin/main + ( fst (mktailexp _loc__3_ _2) ) +<<<<<<< HEAD +# 65117 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65763 "parsing/parser.ml" +||||||| 04da777f7 +# 65754 "parsing/parser.ml" +======= +# 65768 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 65127 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65773 "parsing/parser.ml" +||||||| 04da777f7 +# 65764 "parsing/parser.ml" +======= +# 65778 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65133 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65779 "parsing/parser.ml" +||||||| 04da777f7 +# 65770 "parsing/parser.ml" +======= +# 65784 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let es : (Parsetree.expression list) = Obj.magic es in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 65174 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65820 "parsing/parser.ml" +||||||| 04da777f7 +# 65811 "parsing/parser.ml" +======= +# 65825 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 3035 "parsing/parser.mly" +||||||| 04da777f7 +# 3033 "parsing/parser.mly" +======= +# 3023 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "[" _loc__1_ "]" _loc__3_ ) +<<<<<<< HEAD +# 65181 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65827 "parsing/parser.ml" +||||||| 04da777f7 +# 65818 "parsing/parser.ml" +======= +# 65832 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 65191 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65837 "parsing/parser.ml" +||||||| 04da777f7 +# 65828 "parsing/parser.ml" +======= +# 65842 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65197 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65843 "parsing/parser.ml" +||||||| 04da777f7 +# 65834 "parsing/parser.ml" +======= +# 65848 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 65264 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65910 "parsing/parser.ml" +||||||| 04da777f7 +# 65901 "parsing/parser.ml" +======= +# 65915 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 65269 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65915 "parsing/parser.ml" +||||||| 04da777f7 +# 65906 "parsing/parser.ml" +======= +# 65920 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65277 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65923 "parsing/parser.ml" +||||||| 04da777f7 +# 65914 "parsing/parser.ml" +======= +# 65928 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65282 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65928 "parsing/parser.ml" +||||||| 04da777f7 +# 65919 "parsing/parser.ml" +======= +# 65933 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 65288 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65934 "parsing/parser.ml" +||||||| 04da777f7 +# 65925 "parsing/parser.ml" +======= +# 65939 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2933 "parsing/parser.mly" +||||||| 04da777f7 +# 2931 "parsing/parser.mly" +======= +# 2921 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +<<<<<<< HEAD +# 65294 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65940 "parsing/parser.ml" +||||||| 04da777f7 +# 65931 "parsing/parser.ml" +======= +# 65945 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 65304 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65950 "parsing/parser.ml" +||||||| 04da777f7 +# 65941 "parsing/parser.ml" +======= +# 65955 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 65315 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65961 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1951 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +# 65970 "parsing/parser.ml" +||||||| 04da777f7 +# 65952 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1950 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +# 65961 "parsing/parser.ml" +======= +# 65966 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1940 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 65324 "parsing/parser.ml" +======= +# 65975 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3037 "parsing/parser.mly" +||||||| 04da777f7 +# 3035 "parsing/parser.mly" +======= +# 3025 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, _3) ) +<<<<<<< HEAD +# 65330 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65976 "parsing/parser.ml" +||||||| 04da777f7 +# 65967 "parsing/parser.ml" +======= +# 65981 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 65340 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65986 "parsing/parser.ml" +||||||| 04da777f7 +# 65977 "parsing/parser.ml" +======= +# 65991 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65346 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 65992 "parsing/parser.ml" +||||||| 04da777f7 +# 65983 "parsing/parser.ml" +======= +# 65997 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_startpos__1_inlined1_, _startpos__1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _startpos__1_inlined1_, _1_inlined4, _1_inlined3) in + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 65435 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66081 "parsing/parser.ml" +||||||| 04da777f7 +# 66072 "parsing/parser.ml" +======= +# 66086 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 65440 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66086 "parsing/parser.ml" +||||||| 04da777f7 +# 66077 "parsing/parser.ml" +======= +# 66091 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 65451 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66097 "parsing/parser.ml" +||||||| 04da777f7 +# 66088 "parsing/parser.ml" +======= +# 66102 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 65456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66102 "parsing/parser.ml" +||||||| 04da777f7 +# 66093 "parsing/parser.ml" +======= +# 66107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 65462 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66108 "parsing/parser.ml" +||||||| 04da777f7 +# 66099 "parsing/parser.ml" +======= +# 66113 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 65473 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 65479 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66119 "parsing/parser.ml" +||||||| 04da777f7 +# 66110 "parsing/parser.ml" +======= +# 66124 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 66125 "parsing/parser.ml" +||||||| 04da777f7 +# 66116 "parsing/parser.ml" +======= +# 66130 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 65492 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66138 "parsing/parser.ml" +||||||| 04da777f7 +# 66129 "parsing/parser.ml" +======= +# 66143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65498 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66144 "parsing/parser.ml" +||||||| 04da777f7 +# 66135 "parsing/parser.ml" +======= +# 66149 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 65504 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66150 "parsing/parser.ml" +||||||| 04da777f7 +# 66141 "parsing/parser.ml" +======= +# 66155 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2933 "parsing/parser.mly" +||||||| 04da777f7 +# 2931 "parsing/parser.mly" +======= +# 2921 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +<<<<<<< HEAD +# 65510 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66156 "parsing/parser.ml" +||||||| 04da777f7 +# 66147 "parsing/parser.ml" +======= +# 66161 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 65520 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66166 "parsing/parser.ml" +||||||| 04da777f7 +# 66157 "parsing/parser.ml" +======= +# 66171 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 65531 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66177 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1951 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +# 66186 "parsing/parser.ml" +||||||| 04da777f7 +# 66168 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1950 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +# 66177 "parsing/parser.ml" +======= +# 66182 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1940 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 65540 "parsing/parser.ml" +======= +# 66191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3037 "parsing/parser.mly" +||||||| 04da777f7 +# 3035 "parsing/parser.mly" +======= +# 3025 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, _3) ) +<<<<<<< HEAD +# 65546 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66192 "parsing/parser.ml" +||||||| 04da777f7 +# 66183 "parsing/parser.ml" +======= +# 66197 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 65556 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66202 "parsing/parser.ml" +||||||| 04da777f7 +# 66193 "parsing/parser.ml" +======= +# 66207 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65562 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66208 "parsing/parser.ml" +||||||| 04da777f7 +# 66199 "parsing/parser.ml" +======= +# 66213 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 65629 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66275 "parsing/parser.ml" +||||||| 04da777f7 +# 66266 "parsing/parser.ml" +======= +# 66280 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 65634 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66280 "parsing/parser.ml" +||||||| 04da777f7 +# 66271 "parsing/parser.ml" +======= +# 66285 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65642 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66288 "parsing/parser.ml" +||||||| 04da777f7 +# 66279 "parsing/parser.ml" +======= +# 66293 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65647 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66293 "parsing/parser.ml" +||||||| 04da777f7 +# 66284 "parsing/parser.ml" +======= +# 66298 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 65653 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66299 "parsing/parser.ml" +||||||| 04da777f7 +# 66290 "parsing/parser.ml" +======= +# 66304 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2935 "parsing/parser.mly" +||||||| 04da777f7 +# 2933 "parsing/parser.mly" +======= +# 2923 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +<<<<<<< HEAD +# 65659 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66305 "parsing/parser.ml" +||||||| 04da777f7 +# 66296 "parsing/parser.ml" +======= +# 66310 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 65669 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66315 "parsing/parser.ml" +||||||| 04da777f7 +# 66306 "parsing/parser.ml" +======= +# 66320 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 65680 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66326 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1951 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +# 66335 "parsing/parser.ml" +||||||| 04da777f7 +# 66317 "parsing/parser.ml" + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1950 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +# 66326 "parsing/parser.ml" +======= +# 66331 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +# 1940 "parsing/parser.mly" + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 65689 "parsing/parser.ml" +======= +# 66340 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3037 "parsing/parser.mly" +||||||| 04da777f7 +# 3035 "parsing/parser.mly" +======= +# 3025 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, _3) ) +<<<<<<< HEAD +# 65695 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66341 "parsing/parser.ml" +||||||| 04da777f7 +# 66332 "parsing/parser.ml" +======= +# 66346 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 65705 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66351 "parsing/parser.ml" +||||||| 04da777f7 +# 66342 "parsing/parser.ml" +======= +# 66356 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65711 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66357 "parsing/parser.ml" +||||||| 04da777f7 +# 66348 "parsing/parser.ml" +======= +# 66362 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_startpos__1_inlined1_, _startpos__1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _startpos__1_inlined1_, _1_inlined4, _1_inlined3) in + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 65800 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66446 "parsing/parser.ml" +||||||| 04da777f7 +# 66437 "parsing/parser.ml" +======= +# 66451 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 65805 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66451 "parsing/parser.ml" +||||||| 04da777f7 +# 66442 "parsing/parser.ml" +======= +# 66456 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 65816 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66462 "parsing/parser.ml" +||||||| 04da777f7 +# 66453 "parsing/parser.ml" +======= +# 66467 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 65821 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66467 "parsing/parser.ml" +||||||| 04da777f7 +# 66458 "parsing/parser.ml" +======= +# 66472 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 65827 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66473 "parsing/parser.ml" +||||||| 04da777f7 +# 66464 "parsing/parser.ml" +======= +# 66478 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 65838 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 65844 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66484 "parsing/parser.ml" +||||||| 04da777f7 +# 66475 "parsing/parser.ml" +======= +# 66489 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 66490 "parsing/parser.ml" +||||||| 04da777f7 +# 66481 "parsing/parser.ml" +======= +# 66495 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 65857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66503 "parsing/parser.ml" +||||||| 04da777f7 +# 66494 "parsing/parser.ml" +======= +# 66508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65863 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66509 "parsing/parser.ml" +||||||| 04da777f7 +# 66500 "parsing/parser.ml" +======= +# 66514 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 65869 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66515 "parsing/parser.ml" +||||||| 04da777f7 +# 66506 "parsing/parser.ml" +======= +# 66520 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2935 "parsing/parser.mly" +||||||| 04da777f7 +# 2933 "parsing/parser.mly" +======= +# 2923 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +<<<<<<< HEAD +# 65875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66521 "parsing/parser.ml" +||||||| 04da777f7 +# 66512 "parsing/parser.ml" +======= +# 66526 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 65885 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66531 "parsing/parser.ml" +||||||| 04da777f7 +# 66522 "parsing/parser.ml" +======= +# 66536 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 65896 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66542 "parsing/parser.ml" +||||||| 04da777f7 +# 66533 "parsing/parser.ml" +======= +# 66547 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 65905 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66551 "parsing/parser.ml" +||||||| 04da777f7 +# 66542 "parsing/parser.ml" +======= +# 66556 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3037 "parsing/parser.mly" +||||||| 04da777f7 +# 3035 "parsing/parser.mly" +======= +# 3025 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, _3) ) +<<<<<<< HEAD +# 65911 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66557 "parsing/parser.ml" +||||||| 04da777f7 +# 66548 "parsing/parser.ml" +======= +# 66562 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 65921 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66567 "parsing/parser.ml" +||||||| 04da777f7 +# 66558 "parsing/parser.ml" +======= +# 66572 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 65927 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66573 "parsing/parser.ml" +||||||| 04da777f7 +# 66564 "parsing/parser.ml" +======= +# 66578 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_startpos__1_, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 65994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66640 "parsing/parser.ml" +||||||| 04da777f7 +# 66631 "parsing/parser.ml" +======= +# 66645 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 65999 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66645 "parsing/parser.ml" +||||||| 04da777f7 +# 66636 "parsing/parser.ml" +======= +# 66650 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66007 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66653 "parsing/parser.ml" +||||||| 04da777f7 +# 66644 "parsing/parser.ml" +======= +# 66658 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66012 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66658 "parsing/parser.ml" +||||||| 04da777f7 +# 66649 "parsing/parser.ml" +======= +# 66663 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 66018 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66664 "parsing/parser.ml" +||||||| 04da777f7 +# 66655 "parsing/parser.ml" +======= +# 66669 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2937 "parsing/parser.mly" +||||||| 04da777f7 +# 2935 "parsing/parser.mly" +======= +# 2925 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +<<<<<<< HEAD +# 66024 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66670 "parsing/parser.ml" +||||||| 04da777f7 +# 66661 "parsing/parser.ml" +======= +# 66675 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 66034 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66680 "parsing/parser.ml" +||||||| 04da777f7 +# 66671 "parsing/parser.ml" +======= +# 66685 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 66045 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66691 "parsing/parser.ml" +||||||| 04da777f7 +# 66682 "parsing/parser.ml" +======= +# 66696 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 66054 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66700 "parsing/parser.ml" +||||||| 04da777f7 +# 66691 "parsing/parser.ml" +======= +# 66705 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3037 "parsing/parser.mly" +||||||| 04da777f7 +# 3035 "parsing/parser.mly" +======= +# 3025 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, _3) ) +<<<<<<< HEAD +# 66060 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66706 "parsing/parser.ml" +||||||| 04da777f7 +# 66697 "parsing/parser.ml" +======= +# 66711 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 66070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66716 "parsing/parser.ml" +||||||| 04da777f7 +# 66707 "parsing/parser.ml" +======= +# 66721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66076 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66722 "parsing/parser.ml" +||||||| 04da777f7 +# 66713 "parsing/parser.ml" +======= +# 66727 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_startpos__1_inlined1_, _startpos__1_, _1_inlined3, _1_inlined2) = (_startpos__1_inlined2_, _startpos__1_inlined1_, _1_inlined4, _1_inlined3) in + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 66165 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66811 "parsing/parser.ml" +||||||| 04da777f7 +# 66802 "parsing/parser.ml" +======= +# 66816 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 66170 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66816 "parsing/parser.ml" +||||||| 04da777f7 +# 66807 "parsing/parser.ml" +======= +# 66821 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 66181 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66827 "parsing/parser.ml" +||||||| 04da777f7 +# 66818 "parsing/parser.ml" +======= +# 66832 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 66186 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66832 "parsing/parser.ml" +||||||| 04da777f7 +# 66823 "parsing/parser.ml" +======= +# 66837 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 66192 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66838 "parsing/parser.ml" +||||||| 04da777f7 +# 66829 "parsing/parser.ml" +======= +# 66843 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 66203 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 66209 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66849 "parsing/parser.ml" +||||||| 04da777f7 +# 66840 "parsing/parser.ml" +======= +# 66854 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 66855 "parsing/parser.ml" +||||||| 04da777f7 +# 66846 "parsing/parser.ml" +======= +# 66860 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 66222 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66868 "parsing/parser.ml" +||||||| 04da777f7 +# 66859 "parsing/parser.ml" +======= +# 66873 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66228 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66874 "parsing/parser.ml" +||||||| 04da777f7 +# 66865 "parsing/parser.ml" +======= +# 66879 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 66234 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66880 "parsing/parser.ml" +||||||| 04da777f7 +# 66871 "parsing/parser.ml" +======= +# 66885 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2937 "parsing/parser.mly" +||||||| 04da777f7 +# 2935 "parsing/parser.mly" +======= +# 2925 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +<<<<<<< HEAD +# 66240 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66886 "parsing/parser.ml" +||||||| 04da777f7 +# 66877 "parsing/parser.ml" +======= +# 66891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 66250 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66896 "parsing/parser.ml" +||||||| 04da777f7 +# 66887 "parsing/parser.ml" +======= +# 66901 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 66261 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66907 "parsing/parser.ml" +||||||| 04da777f7 +# 66898 "parsing/parser.ml" +======= +# 66912 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 66270 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66916 "parsing/parser.ml" +||||||| 04da777f7 +# 66907 "parsing/parser.ml" +======= +# 66921 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3037 "parsing/parser.mly" +||||||| 04da777f7 +# 3035 "parsing/parser.mly" +======= +# 3025 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, _3) ) +<<<<<<< HEAD +# 66276 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66922 "parsing/parser.ml" +||||||| 04da777f7 +# 66913 "parsing/parser.ml" +======= +# 66927 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 66286 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66932 "parsing/parser.ml" +||||||| 04da777f7 +# 66923 "parsing/parser.ml" +======= +# 66937 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66292 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66938 "parsing/parser.ml" +||||||| 04da777f7 +# 66929 "parsing/parser.ml" +======= +# 66943 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 66347 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 66993 "parsing/parser.ml" +||||||| 04da777f7 +# 66984 "parsing/parser.ml" +======= +# 66998 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 66357 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67003 "parsing/parser.ml" +||||||| 04da777f7 +# 66994 "parsing/parser.ml" +======= +# 67008 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 66366 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67012 "parsing/parser.ml" +||||||| 04da777f7 +# 67003 "parsing/parser.ml" +======= +# 67017 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__5_ in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + +<<<<<<< HEAD +# 3039 "parsing/parser.mly" +||||||| 04da777f7 +# 3037 "parsing/parser.mly" +======= +# 3027 "parsing/parser.mly" +>>>>>>> origin/main + ( let list_exp = + (* TODO: review the location of list_exp *) + let tail_exp, _tail_loc = mktailexp _loc__5_ _4 in + mkexp ~loc:(_startpos__3_, _endpos) tail_exp in + Pexp_open(od, list_exp) ) +<<<<<<< HEAD +# 66378 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67024 "parsing/parser.ml" +||||||| 04da777f7 +# 67015 "parsing/parser.ml" +======= +# 67029 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 66388 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67034 "parsing/parser.ml" +||||||| 04da777f7 +# 67025 "parsing/parser.ml" +======= +# 67039 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66394 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67040 "parsing/parser.ml" +||||||| 04da777f7 +# 67031 "parsing/parser.ml" +======= +# 67045 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _3 = + let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let _1 = +<<<<<<< HEAD +# 3044 "parsing/parser.mly" +||||||| 04da777f7 +# 3042 "parsing/parser.mly" +======= +# 3032 "parsing/parser.mly" +>>>>>>> origin/main + (Lident "[]") +<<<<<<< HEAD +# 66444 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67090 "parsing/parser.ml" +||||||| 04da777f7 +# 67081 "parsing/parser.ml" +======= +# 67095 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 66453 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67099 "parsing/parser.ml" +||||||| 04da777f7 +# 67090 "parsing/parser.ml" +======= +# 67104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 66465 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67111 "parsing/parser.ml" +||||||| 04da777f7 +# 67102 "parsing/parser.ml" +======= +# 67116 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 66474 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67120 "parsing/parser.ml" +||||||| 04da777f7 +# 67111 "parsing/parser.ml" +======= +# 67125 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3045 "parsing/parser.mly" +||||||| 04da777f7 +# 3043 "parsing/parser.mly" +======= +# 3033 "parsing/parser.mly" +>>>>>>> origin/main + ( Pexp_open(od, mkexp ~loc:_loc__3_ (Pexp_construct(_3, None))) ) +<<<<<<< HEAD +# 66481 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67127 "parsing/parser.ml" +||||||| 04da777f7 +# 67118 "parsing/parser.ml" +======= +# 67132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 66491 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67137 "parsing/parser.ml" +||||||| 04da777f7 +# 67128 "parsing/parser.ml" +======= +# 67142 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66497 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67143 "parsing/parser.ml" +||||||| 04da777f7 +# 67134 "parsing/parser.ml" +======= +# 67148 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 66552 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67198 "parsing/parser.ml" +||||||| 04da777f7 +# 67189 "parsing/parser.ml" +======= +# 67203 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3048 "parsing/parser.mly" +||||||| 04da777f7 +# 3046 "parsing/parser.mly" +======= +# 3036 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "[" _loc__3_ "]" _loc__5_ ) +<<<<<<< HEAD +# 66559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67205 "parsing/parser.ml" +||||||| 04da777f7 +# 67196 "parsing/parser.ml" +======= +# 67210 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 66569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67215 "parsing/parser.ml" +||||||| 04da777f7 +# 67206 "parsing/parser.ml" +======= +# 67220 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66575 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67221 "parsing/parser.ml" +||||||| 04da777f7 +# 67212 "parsing/parser.ml" +======= +# 67226 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _9; + MenhirLib.EngineTypes.startp = _startpos__9_; + MenhirLib.EngineTypes.endp = _endpos__9_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _9 : unit = Obj.magic _9 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _7 : unit = Obj.magic _7 in + let _6 : (Parsetree.module_expr) = Obj.magic _6 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _4 : unit = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__9_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _8 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 66672 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 67318 "parsing/parser.ml" +||||||| 04da777f7 +# 67309 "parsing/parser.ml" +======= +# 67323 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _5 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 66682 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 66688 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67328 "parsing/parser.ml" +||||||| 04da777f7 +# 67319 "parsing/parser.ml" +======= +# 67333 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 67334 "parsing/parser.ml" +||||||| 04da777f7 +# 67325 "parsing/parser.ml" +======= +# 67339 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 66699 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67345 "parsing/parser.ml" +||||||| 04da777f7 +# 67336 "parsing/parser.ml" +======= +# 67350 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 66708 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67354 "parsing/parser.ml" +||||||| 04da777f7 +# 67345 "parsing/parser.ml" +======= +# 67359 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos_od_ = _startpos__1_ in + let _endpos = _endpos__9_ in + let _symbolstartpos = _startpos_od_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3051 "parsing/parser.mly" +||||||| 04da777f7 +# 3049 "parsing/parser.mly" +======= +# 3039 "parsing/parser.mly" +>>>>>>> origin/main + ( let modexp = + mkexp_attrs ~loc:(_startpos__3_, _endpos) + (Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _6), _8)) _5 in + Pexp_open(od, modexp) ) +<<<<<<< HEAD +# 66721 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67367 "parsing/parser.ml" +||||||| 04da777f7 +# 67358 "parsing/parser.ml" +======= +# 67372 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__9_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 66731 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67377 "parsing/parser.ml" +||||||| 04da777f7 +# 67368 "parsing/parser.ml" +======= +# 67382 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66737 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67383 "parsing/parser.ml" +||||||| 04da777f7 +# 67374 "parsing/parser.ml" +======= +# 67388 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _8 : unit = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _6 : (Parsetree.module_expr) = Obj.magic _6 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _4 : unit = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__8_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _5 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 66824 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 66830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67470 "parsing/parser.ml" +||||||| 04da777f7 +# 67461 "parsing/parser.ml" +======= +# 67475 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 67476 "parsing/parser.ml" +||||||| 04da777f7 +# 67467 "parsing/parser.ml" +======= +# 67481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__8_ = (_startpos__8_, _endpos__8_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3057 "parsing/parser.mly" +||||||| 04da777f7 +# 3055 "parsing/parser.mly" +======= +# 3045 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__3_ ")" _loc__8_ ) +<<<<<<< HEAD +# 66838 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67484 "parsing/parser.ml" +||||||| 04da777f7 +# 67475 "parsing/parser.ml" +======= +# 67489 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__8_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1228 "parsing/parser.mly" + ( mkexp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 66848 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67494 "parsing/parser.ml" +||||||| 04da777f7 +# 67485 "parsing/parser.ml" +======= +# 67499 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2857 "parsing/parser.mly" +||||||| 04da777f7 +# 2855 "parsing/parser.mly" +======= +# 2845 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 66854 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67500 "parsing/parser.ml" +||||||| 04da777f7 +# 67491 "parsing/parser.ml" +======= +# 67505 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let es : (Parsetree.expression list) = Obj.magic es in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 66895 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67541 "parsing/parser.ml" +||||||| 04da777f7 +# 67532 "parsing/parser.ml" +======= +# 67546 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2947 "parsing/parser.mly" +||||||| 04da777f7 +# 2945 "parsing/parser.mly" +======= +# 2935 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Literal _2 ) +<<<<<<< HEAD +# 66900 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67546 "parsing/parser.ml" +||||||| 04da777f7 +# 67537 "parsing/parser.ml" +======= +# 67551 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2956 "parsing/parser.mly" +||||||| 04da777f7 +# 2954 "parsing/parser.mly" +======= +# 2944 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple _1 ) +<<<<<<< HEAD +# 66906 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67552 "parsing/parser.ml" +||||||| 04da777f7 +# 67543 "parsing/parser.ml" +======= +# 67557 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2862 "parsing/parser.mly" +||||||| 04da777f7 +# 2860 "parsing/parser.mly" +======= +# 2850 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_expression + "[:" ":]" + ~loc:_sloc + (fun ~loc elts -> + Jane_syntax.Immutable_arrays.expr_of + ~loc:(make_loc loc) + (Iaexp_immutable_array elts)) + _1 + ) +<<<<<<< HEAD +# 66924 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67570 "parsing/parser.ml" +||||||| 04da777f7 +# 67561 "parsing/parser.ml" +======= +# 67575 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let es : (Parsetree.expression list) = Obj.magic es in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _2 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 66965 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67611 "parsing/parser.ml" +||||||| 04da777f7 +# 67602 "parsing/parser.ml" +======= +# 67616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 2949 "parsing/parser.mly" +||||||| 04da777f7 +# 2947 "parsing/parser.mly" +======= +# 2937 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Unclosed(_loc__1_,_loc__3_) ) +<<<<<<< HEAD +# 66972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67618 "parsing/parser.ml" +||||||| 04da777f7 +# 67609 "parsing/parser.ml" +======= +# 67623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2956 "parsing/parser.mly" +||||||| 04da777f7 +# 2954 "parsing/parser.mly" +======= +# 2944 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple _1 ) +<<<<<<< HEAD +# 66978 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67624 "parsing/parser.ml" +||||||| 04da777f7 +# 67615 "parsing/parser.ml" +======= +# 67629 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2862 "parsing/parser.mly" +||||||| 04da777f7 +# 2860 "parsing/parser.mly" +======= +# 2850 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_expression + "[:" ":]" + ~loc:_sloc + (fun ~loc elts -> + Jane_syntax.Immutable_arrays.expr_of + ~loc:(make_loc loc) + (Iaexp_immutable_array elts)) + _1 + ) +<<<<<<< HEAD +# 66996 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67642 "parsing/parser.ml" +||||||| 04da777f7 +# 67633 "parsing/parser.ml" +======= +# 67647 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = +<<<<<<< HEAD +# 2951 "parsing/parser.mly" +||||||| 04da777f7 +# 2949 "parsing/parser.mly" +======= +# 2939 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Simple.Literal [] ) +<<<<<<< HEAD +# 67029 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67675 "parsing/parser.ml" +||||||| 04da777f7 +# 67666 "parsing/parser.ml" +======= +# 67680 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2956 "parsing/parser.mly" +||||||| 04da777f7 +# 2954 "parsing/parser.mly" +======= +# 2944 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple _1 ) +<<<<<<< HEAD +# 67034 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67680 "parsing/parser.ml" +||||||| 04da777f7 +# 67671 "parsing/parser.ml" +======= +# 67685 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2862 "parsing/parser.mly" +||||||| 04da777f7 +# 2860 "parsing/parser.mly" +======= +# 2850 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_expression + "[:" ":]" + ~loc:_sloc + (fun ~loc elts -> + Jane_syntax.Immutable_arrays.expr_of + ~loc:(make_loc loc) + (Iaexp_immutable_array elts)) + _1 + ) +<<<<<<< HEAD +# 67052 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67698 "parsing/parser.ml" +||||||| 04da777f7 +# 67689 "parsing/parser.ml" +======= +# 67703 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 67106 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67752 "parsing/parser.ml" +||||||| 04da777f7 +# 67743 "parsing/parser.ml" +======= +# 67757 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 67116 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67762 "parsing/parser.ml" +||||||| 04da777f7 +# 67753 "parsing/parser.ml" +======= +# 67767 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 67125 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67771 "parsing/parser.ml" +||||||| 04da777f7 +# 67762 "parsing/parser.ml" +======= +# 67776 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__5_ in + +<<<<<<< HEAD +# 2958 "parsing/parser.mly" +||||||| 04da777f7 +# 2956 "parsing/parser.mly" +======= +# 2946 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, _4) + ) +<<<<<<< HEAD +# 67133 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67779 "parsing/parser.ml" +||||||| 04da777f7 +# 67770 "parsing/parser.ml" +======= +# 67784 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2862 "parsing/parser.mly" +||||||| 04da777f7 +# 2860 "parsing/parser.mly" +======= +# 2850 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_expression + "[:" ":]" + ~loc:_sloc + (fun ~loc elts -> + Jane_syntax.Immutable_arrays.expr_of + ~loc:(make_loc loc) + (Iaexp_immutable_array elts)) + _1 + ) +<<<<<<< HEAD +# 67151 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67797 "parsing/parser.ml" +||||||| 04da777f7 +# 67788 "parsing/parser.ml" +======= +# 67802 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let od = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 67203 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67849 "parsing/parser.ml" +||||||| 04da777f7 +# 67840 "parsing/parser.ml" +======= +# 67854 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 1951 "parsing/parser.mly" +||||||| 04da777f7 +# 1950 "parsing/parser.mly" +======= +# 1940 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _loc__1_ in + let me = Mod.ident ~loc _1 in + Opn.mk ~loc me ) +<<<<<<< HEAD +# 67212 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67858 "parsing/parser.ml" +||||||| 04da777f7 +# 67849 "parsing/parser.ml" +======= +# 67863 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__4_ in + +<<<<<<< HEAD +# 2961 "parsing/parser.mly" +||||||| 04da777f7 +# 2959 "parsing/parser.mly" +======= +# 2949 "parsing/parser.mly" +>>>>>>> origin/main + ( (* TODO: review the location of Pexp_array *) + Generic_array.Expression.Opened_literal(od, _startpos__3_, _endpos, []) + ) +<<<<<<< HEAD +# 67221 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67867 "parsing/parser.ml" +||||||| 04da777f7 +# 67858 "parsing/parser.ml" +======= +# 67872 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2862 "parsing/parser.mly" +||||||| 04da777f7 +# 2860 "parsing/parser.mly" +======= +# 2850 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_expression + "[:" ":]" + ~loc:_sloc + (fun ~loc elts -> + Jane_syntax.Immutable_arrays.expr_of + ~loc:(make_loc loc) + (Iaexp_immutable_array elts)) + _1 + ) +<<<<<<< HEAD +# 67239 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67885 "parsing/parser.ml" +||||||| 04da777f7 +# 67876 "parsing/parser.ml" +======= +# 67890 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +<<<<<<< HEAD +# 3429 "parsing/parser.mly" +||||||| 04da777f7 +# 3427 "parsing/parser.mly" +======= +# 3417 "parsing/parser.mly" +>>>>>>> origin/main + ( es ) +<<<<<<< HEAD +# 67293 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67939 "parsing/parser.ml" +||||||| 04da777f7 +# 67930 "parsing/parser.ml" +======= +# 67944 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 2966 "parsing/parser.mly" +||||||| 04da777f7 +# 2964 "parsing/parser.mly" +======= +# 2954 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.Simple (Unclosed(_loc__3_, _loc__5_)) ) +<<<<<<< HEAD +# 67300 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67946 "parsing/parser.ml" +||||||| 04da777f7 +# 67937 "parsing/parser.ml" +======= +# 67951 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2862 "parsing/parser.mly" +||||||| 04da777f7 +# 2860 "parsing/parser.mly" +======= +# 2850 "parsing/parser.mly" +>>>>>>> origin/main + ( Generic_array.Expression.to_expression + "[:" ":]" + ~loc:_sloc + (fun ~loc elts -> + Jane_syntax.Immutable_arrays.expr_of + ~loc:(make_loc loc) + (Iaexp_immutable_array elts)) + _1 + ) +<<<<<<< HEAD +# 67318 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67964 "parsing/parser.ml" +||||||| 04da777f7 +# 67955 "parsing/parser.ml" +======= +# 67969 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Constant.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2871 "parsing/parser.mly" +||||||| 04da777f7 +# 2869 "parsing/parser.mly" +======= +# 2859 "parsing/parser.mly" +>>>>>>> origin/main + ( Constant.to_expression ~loc:_sloc _1 ) +<<<<<<< HEAD +# 67346 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 67992 "parsing/parser.ml" +||||||| 04da777f7 +# 67983 "parsing/parser.ml" +======= +# 67997 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 67396 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68042 "parsing/parser.ml" +||||||| 04da777f7 +# 68033 "parsing/parser.ml" +======= +# 68047 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 67401 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68047 "parsing/parser.ml" +||||||| 04da777f7 +# 68038 "parsing/parser.ml" +======= +# 68052 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" + ( _1 ) +# 68046 "parsing/parser.ml" + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 68051 "parsing/parser.ml" + + in + +# 2926 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +# 68057 "parsing/parser.ml" + + in + +# 2931 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +# 68063 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2940 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +# 68073 "parsing/parser.ml" + + in + +# 2870 "parsing/parser.mly" + ( _1 ) +# 68079 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +# 68151 "parsing/parser.ml" + in + +# 1310 "parsing/parser.mly" + ( xs ) +# 68156 "parsing/parser.ml" + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 68167 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 68172 "parsing/parser.ml" + + in + +# 3265 "parsing/parser.mly" + ( xs ) +# 68178 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5006 "parsing/parser.mly" + ( _1 ) +# 68189 "parsing/parser.ml" + + in + +# 5019 "parsing/parser.mly" + ( _1, _2 ) +# 68195 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2576 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 68208 "parsing/parser.ml" + + in + +# 2778 "parsing/parser.mly" + ( _1 ) +# 68214 "parsing/parser.ml" + + in + +# 2926 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +# 68220 "parsing/parser.ml" + + in + +# 2931 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +# 68226 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2940 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +# 68236 "parsing/parser.ml" + + in + +# 2870 "parsing/parser.mly" + ( _1 ) +# 68242 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +# 68292 "parsing/parser.ml" + in + +# 1310 "parsing/parser.mly" + ( xs ) +# 68297 "parsing/parser.ml" + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" + ( _1 ) +# 67409 "parsing/parser.ml" + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 67414 "parsing/parser.ml" + + in + +# 2916 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +# 67420 "parsing/parser.ml" + + in + +# 2921 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +# 67426 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2930 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +# 67436 "parsing/parser.ml" + + in + +# 2860 "parsing/parser.mly" + ( _1 ) +# 67442 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +# 67514 "parsing/parser.ml" + in + +# 1300 "parsing/parser.mly" + ( xs ) +# 67519 "parsing/parser.ml" + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 67530 "parsing/parser.ml" + in + +# 1413 "parsing/parser.mly" + ( xs ) +# 67535 "parsing/parser.ml" + + in + +# 3255 "parsing/parser.mly" + ( xs ) +# 67541 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5009 "parsing/parser.mly" + ( _1 ) +# 67552 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 67558 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2566 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 67571 "parsing/parser.ml" + + in + +# 2768 "parsing/parser.mly" + ( _1 ) +# 67577 "parsing/parser.ml" + + in + +# 2916 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +# 67583 "parsing/parser.ml" + + in + +# 2921 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +# 67589 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2930 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +# 67599 "parsing/parser.ml" + + in + +# 2860 "parsing/parser.mly" + ( _1 ) +# 67605 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +# 67655 "parsing/parser.ml" + in + +# 1300 "parsing/parser.mly" + ( xs ) +# 67660 "parsing/parser.ml" + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67668 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68055 "parsing/parser.ml" +||||||| 04da777f7 +# 68305 "parsing/parser.ml" +======= +# 68319 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68060 "parsing/parser.ml" +||||||| 04da777f7 +# 68310 "parsing/parser.ml" +======= +# 68324 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 67679 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68066 "parsing/parser.ml" +||||||| 04da777f7 +# 68316 "parsing/parser.ml" +======= +# 68330 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2933 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +# 68072 "parsing/parser.ml" +||||||| 04da777f7 +# 2933 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +# 68322 "parsing/parser.ml" +======= +# 2923 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +<<<<<<< HEAD +# 67685 "parsing/parser.ml" +======= +# 68336 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 67695 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68082 "parsing/parser.ml" +||||||| 04da777f7 +# 68332 "parsing/parser.ml" +======= +# 68346 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2872 "parsing/parser.mly" +||||||| 04da777f7 +# 2870 "parsing/parser.mly" +======= +# 2860 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67701 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68088 "parsing/parser.ml" +||||||| 04da777f7 +# 68338 "parsing/parser.ml" +======= +# 68352 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 67773 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68160 "parsing/parser.ml" +||||||| 04da777f7 +# 68410 "parsing/parser.ml" +======= +# 68424 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 67778 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68165 "parsing/parser.ml" +||||||| 04da777f7 +# 68415 "parsing/parser.ml" +======= +# 68429 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 67789 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68176 "parsing/parser.ml" +||||||| 04da777f7 +# 68426 "parsing/parser.ml" +======= +# 68440 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 67794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68181 "parsing/parser.ml" +||||||| 04da777f7 +# 68431 "parsing/parser.ml" +======= +# 68445 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 67800 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68187 "parsing/parser.ml" +||||||| 04da777f7 +# 68437 "parsing/parser.ml" +======= +# 68451 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 67811 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 67817 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68198 "parsing/parser.ml" +||||||| 04da777f7 +# 68448 "parsing/parser.ml" +======= +# 68462 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 68204 "parsing/parser.ml" +||||||| 04da777f7 +# 68454 "parsing/parser.ml" +======= +# 68468 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 67830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68217 "parsing/parser.ml" +||||||| 04da777f7 +# 68467 "parsing/parser.ml" +======= +# 68481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67836 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68223 "parsing/parser.ml" +||||||| 04da777f7 +# 68473 "parsing/parser.ml" +======= +# 68487 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 67842 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68229 "parsing/parser.ml" +||||||| 04da777f7 +# 68479 "parsing/parser.ml" +======= +# 68493 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2933 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_list_comprehension _1 ) +# 68235 "parsing/parser.ml" +||||||| 04da777f7 +# 2933 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +# 68485 "parsing/parser.ml" +======= +# 2923 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +<<<<<<< HEAD +# 67848 "parsing/parser.ml" +======= +# 68499 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 67858 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68245 "parsing/parser.ml" +||||||| 04da777f7 +# 68495 "parsing/parser.ml" +======= +# 68509 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2872 "parsing/parser.mly" +||||||| 04da777f7 +# 2870 "parsing/parser.mly" +======= +# 2860 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67864 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68251 "parsing/parser.ml" +||||||| 04da777f7 +# 68501 "parsing/parser.ml" +======= +# 68515 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 67914 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68301 "parsing/parser.ml" +||||||| 04da777f7 +# 68551 "parsing/parser.ml" +======= +# 68565 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 67919 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68306 "parsing/parser.ml" +||||||| 04da777f7 +# 68556 "parsing/parser.ml" +======= +# 68570 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +<<<<<<< HEAD +# 2576 "parsing/parser.mly" +||||||| 04da777f7 +# 2574 "parsing/parser.mly" +======= +# 2564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67927 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68314 "parsing/parser.ml" +||||||| 04da777f7 +# 68564 "parsing/parser.ml" +======= +# 68578 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67932 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68319 "parsing/parser.ml" +||||||| 04da777f7 +# 68569 "parsing/parser.ml" +======= +# 68583 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 67938 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68325 "parsing/parser.ml" +||||||| 04da777f7 +# 68575 "parsing/parser.ml" +======= +# 68589 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2935 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +# 68331 "parsing/parser.ml" +||||||| 04da777f7 +# 2935 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +# 68581 "parsing/parser.ml" +======= +# 2925 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +<<<<<<< HEAD +# 67944 "parsing/parser.ml" +======= +# 68595 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 67954 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68341 "parsing/parser.ml" +||||||| 04da777f7 +# 68591 "parsing/parser.ml" +======= +# 68605 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2872 "parsing/parser.mly" +||||||| 04da777f7 +# 2870 "parsing/parser.mly" +======= +# 2860 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 67960 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68347 "parsing/parser.ml" +||||||| 04da777f7 +# 68597 "parsing/parser.ml" +======= +# 68611 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 68032 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68419 "parsing/parser.ml" +||||||| 04da777f7 +# 68669 "parsing/parser.ml" +======= +# 68683 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 68037 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68424 "parsing/parser.ml" +||||||| 04da777f7 +# 68674 "parsing/parser.ml" +======= +# 68688 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 68048 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68435 "parsing/parser.ml" +||||||| 04da777f7 +# 68685 "parsing/parser.ml" +======= +# 68699 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1413 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 68053 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68440 "parsing/parser.ml" +||||||| 04da777f7 +# 68690 "parsing/parser.ml" +======= +# 68704 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3267 "parsing/parser.mly" +||||||| 04da777f7 +# 3265 "parsing/parser.mly" +======= +# 3255 "parsing/parser.mly" +>>>>>>> origin/main + ( xs ) +<<<<<<< HEAD +# 68059 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68446 "parsing/parser.ml" +||||||| 04da777f7 +# 68696 "parsing/parser.ml" +======= +# 68710 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 68070 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 68076 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68457 "parsing/parser.ml" +||||||| 04da777f7 +# 68707 "parsing/parser.ml" +======= +# 68721 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 68463 "parsing/parser.ml" +||||||| 04da777f7 +# 68713 "parsing/parser.ml" +======= +# 68727 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2578 "parsing/parser.mly" +||||||| 04da777f7 +# 2576 "parsing/parser.mly" +======= +# 2566 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +<<<<<<< HEAD +# 68089 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68476 "parsing/parser.ml" +||||||| 04da777f7 +# 68726 "parsing/parser.ml" +======= +# 68740 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2780 "parsing/parser.mly" +||||||| 04da777f7 +# 2778 "parsing/parser.mly" +======= +# 2768 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68095 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68482 "parsing/parser.ml" +||||||| 04da777f7 +# 68732 "parsing/parser.ml" +======= +# 68746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2928 "parsing/parser.mly" +||||||| 04da777f7 +# 2926 "parsing/parser.mly" +======= +# 2916 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +<<<<<<< HEAD +# 68101 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68488 "parsing/parser.ml" +||||||| 04da777f7 +# 68738 "parsing/parser.ml" +======= +# 68752 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2935 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Mutable, _1) ) +# 68494 "parsing/parser.ml" +||||||| 04da777f7 +# 2935 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +# 68744 "parsing/parser.ml" +======= +# 2925 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +<<<<<<< HEAD +# 68107 "parsing/parser.ml" +======= +# 68758 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2942 "parsing/parser.mly" +||||||| 04da777f7 +# 2940 "parsing/parser.mly" +======= +# 2930 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 68117 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68504 "parsing/parser.ml" +||||||| 04da777f7 +# 68754 "parsing/parser.ml" +======= +# 68768 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 2872 "parsing/parser.mly" +||||||| 04da777f7 +# 2870 "parsing/parser.mly" +======= +# 2860 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68123 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68510 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = +# 253 "" + ( List.rev xs ) +# 68560 "parsing/parser.ml" + in + +# 1310 "parsing/parser.mly" + ( xs ) +# 68565 "parsing/parser.ml" + + in + let _2 = + let _1 = _1_inlined1 in + let _1 = +# 2576 "parsing/parser.mly" + ( _1 ) +# 68573 "parsing/parser.ml" + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 68578 "parsing/parser.ml" + + in + +# 2928 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +# 68584 "parsing/parser.ml" + + in + +# 2937 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +# 68590 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2942 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +# 68600 "parsing/parser.ml" + + in + +# 2872 "parsing/parser.mly" + ( _1 ) +# 68606 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let xs_inlined1 : (Jane_syntax.Comprehensions.clause list) = Obj.magic xs_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.expression) = let _1 = + let _1 = + let _1 = + let _3 = + let xs = xs_inlined1 in + let xs = +# 253 "" + ( List.rev xs ) +# 68678 "parsing/parser.ml" + in + +# 1310 "parsing/parser.mly" + ( xs ) +# 68683 "parsing/parser.ml" + + in + let _2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 253 "" + ( List.rev xs ) +# 68694 "parsing/parser.ml" + in + +# 1423 "parsing/parser.mly" + ( xs ) +# 68699 "parsing/parser.ml" + + in + +# 3267 "parsing/parser.mly" + ( xs ) +# 68705 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 5013 "parsing/parser.mly" + ( _1 ) +# 68716 "parsing/parser.ml" + + in + +# 5026 "parsing/parser.mly" + ( _1, _2 ) +# 68722 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + mkfunction [] None (Pfunction_cases (cases, loc, [])) + ~loc:_sloc ~attrs:_2 + ) +# 68735 "parsing/parser.ml" + + in + +# 2780 "parsing/parser.mly" + ( _1 ) +# 68741 "parsing/parser.ml" + + in + +# 2928 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.{ body = _2; clauses = _3 } ) +# 68747 "parsing/parser.ml" + + in + +# 2937 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.Cexp_array_comprehension (Immutable, _1) ) +# 68753 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2942 "parsing/parser.mly" + ( Jane_syntax.Comprehensions.expr_of ~loc:(make_loc _sloc) _1 ) +# 68763 "parsing/parser.ml" + + in + +# 2872 "parsing/parser.mly" + ( _1 ) +# 68769 "parsing/parser.ml" +||||||| 04da777f7 +# 68760 "parsing/parser.ml" +======= +# 68774 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 68154 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68800 "parsing/parser.ml" +||||||| 04da777f7 +# 68791 "parsing/parser.ml" +======= +# 68805 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3592 "parsing/parser.mly" +||||||| 04da777f7 +# 3590 "parsing/parser.mly" +======= +# 3581 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_var (_1) ) +<<<<<<< HEAD +# 68160 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68806 "parsing/parser.ml" +||||||| 04da777f7 +# 68797 "parsing/parser.ml" +======= +# 68811 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68169 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68815 "parsing/parser.ml" +||||||| 04da777f7 +# 68806 "parsing/parser.ml" +======= +# 68820 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3593 "parsing/parser.mly" +||||||| 04da777f7 +# 3591 "parsing/parser.mly" +======= +# 3582 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68175 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68821 "parsing/parser.ml" +||||||| 04da777f7 +# 68812 "parsing/parser.ml" +======= +# 68826 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = +<<<<<<< HEAD +# 3594 "parsing/parser.mly" +||||||| 04da777f7 +# 3592 "parsing/parser.mly" +======= +# 3583 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68200 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68846 "parsing/parser.ml" +||||||| 04da777f7 +# 68837 "parsing/parser.ml" +======= +# 68851 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3599 "parsing/parser.mly" +||||||| 04da777f7 +# 3597 "parsing/parser.mly" +======= +# 3588 "parsing/parser.mly" +>>>>>>> origin/main + ( reloc_pat ~loc:_sloc _2 ) +<<<<<<< HEAD +# 68242 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68888 "parsing/parser.ml" +||||||| 04da777f7 +# 68879 "parsing/parser.ml" +======= +# 68893 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = +<<<<<<< HEAD +# 3601 "parsing/parser.mly" +||||||| 04da777f7 +# 3599 "parsing/parser.mly" +======= +# 3590 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68267 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68913 "parsing/parser.ml" +||||||| 04da777f7 +# 68904 "parsing/parser.ml" +======= +# 68918 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined3 : (string option) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern) = let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 68332 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 68978 "parsing/parser.ml" +||||||| 04da777f7 +# 68969 "parsing/parser.ml" +======= +# 68983 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 68342 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 68348 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68988 "parsing/parser.ml" +||||||| 04da777f7 +# 68979 "parsing/parser.ml" +======= +# 68993 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 68994 "parsing/parser.ml" +||||||| 04da777f7 +# 68985 "parsing/parser.ml" +======= +# 68999 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3603 "parsing/parser.mly" +||||||| 04da777f7 +# 3601 "parsing/parser.mly" +======= +# 3592 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_attrs ~loc:_sloc (Ppat_unpack _4) _3 ) +<<<<<<< HEAD +# 68357 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69003 "parsing/parser.ml" +||||||| 04da777f7 +# 68994 "parsing/parser.ml" +======= +# 69008 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _7 : unit = Obj.magic _7 in + let _1_inlined4 : (Parsetree.module_type) = Obj.magic _1_inlined4 in + let _5 : unit = Obj.magic _5 in + let _1_inlined3 : (string option) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__7_ in + let _v : (Parsetree.pattern) = let _6 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _1_inlined4) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 68438 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 69084 "parsing/parser.ml" +||||||| 04da777f7 +# 69075 "parsing/parser.ml" +======= +# 69089 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 68449 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69095 "parsing/parser.ml" +||||||| 04da777f7 +# 69086 "parsing/parser.ml" +======= +# 69100 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__4_, _startpos__4_) = (_endpos__1_inlined3_, _startpos__1_inlined3_) in + let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 68460 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 68466 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69106 "parsing/parser.ml" +||||||| 04da777f7 +# 69097 "parsing/parser.ml" +======= +# 69111 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 69112 "parsing/parser.ml" +||||||| 04da777f7 +# 69103 "parsing/parser.ml" +======= +# 69117 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__7_ in + let _symbolstartpos = _startpos__1_ in + let _loc__4_ = (_startpos__4_, _endpos__4_) in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3605 "parsing/parser.mly" +||||||| 04da777f7 +# 3603 "parsing/parser.mly" +======= +# 3594 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_attrs ~loc:_sloc + (Ppat_constraint(mkpat ~loc:_loc__4_ (Ppat_unpack _4), _6)) + _3 ) +<<<<<<< HEAD +# 68478 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69124 "parsing/parser.ml" +||||||| 04da777f7 +# 69115 "parsing/parser.ml" +======= +# 69129 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +<<<<<<< HEAD +# 3615 "parsing/parser.mly" +||||||| 04da777f7 +# 3613 "parsing/parser.mly" +======= +# 3604 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_any ) +<<<<<<< HEAD +# 68505 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69151 "parsing/parser.ml" +||||||| 04da777f7 +# 69142 "parsing/parser.ml" +======= +# 69156 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68513 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69159 "parsing/parser.ml" +||||||| 04da777f7 +# 69150 "parsing/parser.ml" +======= +# 69164 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68519 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69165 "parsing/parser.ml" +||||||| 04da777f7 +# 69156 "parsing/parser.ml" +======= +# 69170 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68525 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69171 "parsing/parser.ml" +||||||| 04da777f7 +# 69162 "parsing/parser.ml" +======= +# 69176 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.constant) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.constant) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +<<<<<<< HEAD +# 3617 "parsing/parser.mly" +||||||| 04da777f7 +# 3615 "parsing/parser.mly" +======= +# 3606 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_interval (_1, _3) ) +<<<<<<< HEAD +# 68566 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69212 "parsing/parser.ml" +||||||| 04da777f7 +# 69203 "parsing/parser.ml" +======= +# 69217 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68575 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69221 "parsing/parser.ml" +||||||| 04da777f7 +# 69212 "parsing/parser.ml" +======= +# 69226 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68581 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69227 "parsing/parser.ml" +||||||| 04da777f7 +# 69218 "parsing/parser.ml" +======= +# 69232 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68587 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69233 "parsing/parser.ml" +||||||| 04da777f7 +# 69224 "parsing/parser.ml" +======= +# 69238 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 68619 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69265 "parsing/parser.ml" +||||||| 04da777f7 +# 69256 "parsing/parser.ml" +======= +# 69270 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3619 "parsing/parser.mly" +||||||| 04da777f7 +# 3617 "parsing/parser.mly" +======= +# 3608 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_construct(_1, None) ) +<<<<<<< HEAD +# 68625 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69271 "parsing/parser.ml" +||||||| 04da777f7 +# 69262 "parsing/parser.ml" +======= +# 69276 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68634 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69280 "parsing/parser.ml" +||||||| 04da777f7 +# 69271 "parsing/parser.ml" +======= +# 69285 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68640 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69286 "parsing/parser.ml" +||||||| 04da777f7 +# 69277 "parsing/parser.ml" +======= +# 69291 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68646 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69292 "parsing/parser.ml" +||||||| 04da777f7 +# 69283 "parsing/parser.ml" +======= +# 69297 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +<<<<<<< HEAD +# 3621 "parsing/parser.mly" +||||||| 04da777f7 +# 3619 "parsing/parser.mly" +======= +# 3610 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_variant(_1, None) ) +<<<<<<< HEAD +# 68673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69319 "parsing/parser.ml" +||||||| 04da777f7 +# 69310 "parsing/parser.ml" +======= +# 69324 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68681 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69327 "parsing/parser.ml" +||||||| 04da777f7 +# 69318 "parsing/parser.ml" +======= +# 69332 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68687 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69333 "parsing/parser.ml" +||||||| 04da777f7 +# 69324 "parsing/parser.ml" +======= +# 69338 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68693 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69339 "parsing/parser.ml" +||||||| 04da777f7 +# 69330 "parsing/parser.ml" +======= +# 69344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 68733 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69379 "parsing/parser.ml" +||||||| 04da777f7 +# 69370 "parsing/parser.ml" +======= +# 69384 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = +<<<<<<< HEAD +# 2975 "parsing/parser.mly" +||||||| 04da777f7 +# 2973 "parsing/parser.mly" +======= +# 2963 "parsing/parser.mly" +>>>>>>> origin/main + ( () ) +<<<<<<< HEAD +# 68739 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69385 "parsing/parser.ml" +||||||| 04da777f7 +# 69376 "parsing/parser.ml" +======= +# 69390 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3623 "parsing/parser.mly" +||||||| 04da777f7 +# 3621 "parsing/parser.mly" +======= +# 3612 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_type (_2) ) +<<<<<<< HEAD +# 68744 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69390 "parsing/parser.ml" +||||||| 04da777f7 +# 69381 "parsing/parser.ml" +======= +# 69395 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68754 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69400 "parsing/parser.ml" +||||||| 04da777f7 +# 69391 "parsing/parser.ml" +======= +# 69405 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68760 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69406 "parsing/parser.ml" +||||||| 04da777f7 +# 69397 "parsing/parser.ml" +======= +# 69411 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69412 "parsing/parser.ml" +||||||| 04da777f7 +# 69403 "parsing/parser.ml" +======= +# 69417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 68806 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69452 "parsing/parser.ml" +||||||| 04da777f7 +# 69443 "parsing/parser.ml" +======= +# 69457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = +<<<<<<< HEAD +# 2976 "parsing/parser.mly" +||||||| 04da777f7 +# 2974 "parsing/parser.mly" +======= +# 2964 "parsing/parser.mly" +>>>>>>> origin/main + ( () ) +<<<<<<< HEAD +# 68812 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69458 "parsing/parser.ml" +||||||| 04da777f7 +# 69449 "parsing/parser.ml" +======= +# 69463 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3623 "parsing/parser.mly" +||||||| 04da777f7 +# 3621 "parsing/parser.mly" +======= +# 3612 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_type (_2) ) +<<<<<<< HEAD +# 68817 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69463 "parsing/parser.ml" +||||||| 04da777f7 +# 69454 "parsing/parser.ml" +======= +# 69468 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68827 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69473 "parsing/parser.ml" +||||||| 04da777f7 +# 69464 "parsing/parser.ml" +======= +# 69478 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68833 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69479 "parsing/parser.ml" +||||||| 04da777f7 +# 69470 "parsing/parser.ml" +======= +# 69484 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68839 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69485 "parsing/parser.ml" +||||||| 04da777f7 +# 69476 "parsing/parser.ml" +======= +# 69490 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 68885 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69531 "parsing/parser.ml" +||||||| 04da777f7 +# 69522 "parsing/parser.ml" +======= +# 69536 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3625 "parsing/parser.mly" +||||||| 04da777f7 +# 3623 "parsing/parser.mly" +======= +# 3614 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_open(_1, _3) ) +<<<<<<< HEAD +# 68891 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69537 "parsing/parser.ml" +||||||| 04da777f7 +# 69528 "parsing/parser.ml" +======= +# 69542 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 68901 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69547 "parsing/parser.ml" +||||||| 04da777f7 +# 69538 "parsing/parser.ml" +======= +# 69552 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68907 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69553 "parsing/parser.ml" +||||||| 04da777f7 +# 69544 "parsing/parser.ml" +======= +# 69558 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 68913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69559 "parsing/parser.ml" +||||||| 04da777f7 +# 69550 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let _1 = +# 3624 "parsing/parser.mly" + (Lident "[]") +# 69601 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1205 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 69610 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos__2_inlined1_ in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1205 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 69621 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3625 "parsing/parser.mly" + ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) +# 69630 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__2_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 69640 "parsing/parser.ml" + + in + +# 3645 "parsing/parser.mly" + ( _1 ) +# 69646 "parsing/parser.ml" + + in + +# 3607 "parsing/parser.mly" + ( _1 ) +# 69652 "parsing/parser.ml" +======= +# 69564 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let _1 = +# 3615 "parsing/parser.mly" + (Lident "[]") +# 68964 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 68973 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos__2_inlined1_ in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 68984 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3616 "parsing/parser.mly" + ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) +# 68993 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__2_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 69003 "parsing/parser.ml" + + in + +# 3636 "parsing/parser.mly" + ( _1 ) +# 69009 "parsing/parser.ml" + + in + +# 3598 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 69015 "parsing/parser.ml" +======= +# 69666 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let _1 = +<<<<<<< HEAD +# 3626 "parsing/parser.mly" + (Lident "[]") +# 69610 "parsing/parser.ml" +||||||| 04da777f7 +# 3626 "parsing/parser.mly" + (Lident "()") +# 69703 "parsing/parser.ml" +======= +# 3617 "parsing/parser.mly" + (Lident "()") +<<<<<<< HEAD +# 69066 "parsing/parser.ml" +======= +# 69717 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 69075 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69619 "parsing/parser.ml" +||||||| 04da777f7 +# 69712 "parsing/parser.ml" +======= +# 69726 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__3_ = _endpos__2_inlined1_ in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 69086 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69630 "parsing/parser.ml" +||||||| 04da777f7 +# 69723 "parsing/parser.ml" +======= +# 69737 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3618 "parsing/parser.mly" + ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) +<<<<<<< HEAD +# 69095 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69639 "parsing/parser.ml" +||||||| 04da777f7 +# 69732 "parsing/parser.ml" +======= +# 69746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__2_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69649 "parsing/parser.ml" +||||||| 04da777f7 +# 69742 "parsing/parser.ml" +======= +# 69756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69111 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69655 "parsing/parser.ml" +||||||| 04da777f7 +# 69748 "parsing/parser.ml" +======= +# 69762 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69117 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69661 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in + let _1 = +# 3628 "parsing/parser.mly" + (Lident "()") +# 69712 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1205 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 69721 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos__2_inlined1_ in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1205 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 69732 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3629 "parsing/parser.mly" + ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) +# 69741 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__2_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1240 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 69751 "parsing/parser.ml" + + in + +# 3647 "parsing/parser.mly" + ( _1 ) +# 69757 "parsing/parser.ml" + + in + +# 3609 "parsing/parser.mly" + ( _1 ) +# 69763 "parsing/parser.ml" +||||||| 04da777f7 +# 69754 "parsing/parser.ml" +======= +# 69768 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.pattern) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 69177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69823 "parsing/parser.ml" +||||||| 04da777f7 +# 69814 "parsing/parser.ml" +======= +# 69828 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3631 "parsing/parser.mly" +||||||| 04da777f7 +# 3629 "parsing/parser.mly" +======= +# 3620 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_open (_1, _4) ) +<<<<<<< HEAD +# 69183 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69829 "parsing/parser.ml" +||||||| 04da777f7 +# 69820 "parsing/parser.ml" +======= +# 69834 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69193 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69839 "parsing/parser.ml" +||||||| 04da777f7 +# 69830 "parsing/parser.ml" +======= +# 69844 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69199 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69845 "parsing/parser.ml" +||||||| 04da777f7 +# 69836 "parsing/parser.ml" +======= +# 69850 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69205 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69851 "parsing/parser.ml" +||||||| 04da777f7 +# 69842 "parsing/parser.ml" +======= +# 69856 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.pattern) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +<<<<<<< HEAD +# 3633 "parsing/parser.mly" +||||||| 04da777f7 +# 3631 "parsing/parser.mly" +======= +# 3622 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__3_ ")" _loc__5_ ) +<<<<<<< HEAD +# 69263 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69909 "parsing/parser.ml" +||||||| 04da777f7 +# 69900 "parsing/parser.ml" +======= +# 69914 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69273 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69919 "parsing/parser.ml" +||||||| 04da777f7 +# 69910 "parsing/parser.ml" +======= +# 69924 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69279 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69925 "parsing/parser.ml" +||||||| 04da777f7 +# 69916 "parsing/parser.ml" +======= +# 69930 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69285 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69931 "parsing/parser.ml" +||||||| 04da777f7 +# 69922 "parsing/parser.ml" +======= +# 69936 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__4_ = (_startpos__4_, _endpos__4_) in + +<<<<<<< HEAD +# 3635 "parsing/parser.mly" +||||||| 04da777f7 +# 3633 "parsing/parser.mly" +======= +# 3624 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__4_ "pattern" ) +<<<<<<< HEAD +# 69335 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69981 "parsing/parser.ml" +||||||| 04da777f7 +# 69972 "parsing/parser.ml" +======= +# 69986 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69345 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69991 "parsing/parser.ml" +||||||| 04da777f7 +# 69982 "parsing/parser.ml" +======= +# 69996 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69351 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 69997 "parsing/parser.ml" +||||||| 04da777f7 +# 69988 "parsing/parser.ml" +======= +# 70002 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69357 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70003 "parsing/parser.ml" +||||||| 04da777f7 +# 69994 "parsing/parser.ml" +======= +# 70008 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 3637 "parsing/parser.mly" +||||||| 04da777f7 +# 3635 "parsing/parser.mly" +======= +# 3626 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__1_ ")" _loc__3_ ) +<<<<<<< HEAD +# 69401 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70047 "parsing/parser.ml" +||||||| 04da777f7 +# 70038 "parsing/parser.ml" +======= +# 70052 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69411 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70057 "parsing/parser.ml" +||||||| 04da777f7 +# 70048 "parsing/parser.ml" +======= +# 70062 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69417 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70063 "parsing/parser.ml" +||||||| 04da777f7 +# 70054 "parsing/parser.ml" +======= +# 70068 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69423 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70069 "parsing/parser.ml" +||||||| 04da777f7 +# 70060 "parsing/parser.ml" +======= +# 70074 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.core_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 3639 "parsing/parser.mly" +||||||| 04da777f7 +# 3637 "parsing/parser.mly" +======= +# 3628 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__1_ ")" _loc__5_ ) +<<<<<<< HEAD +# 69481 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70127 "parsing/parser.ml" +||||||| 04da777f7 +# 70118 "parsing/parser.ml" +======= +# 70132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69491 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70137 "parsing/parser.ml" +||||||| 04da777f7 +# 70128 "parsing/parser.ml" +======= +# 70142 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69497 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70143 "parsing/parser.ml" +||||||| 04da777f7 +# 70134 "parsing/parser.ml" +======= +# 70148 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69503 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70149 "parsing/parser.ml" +||||||| 04da777f7 +# 70140 "parsing/parser.ml" +======= +# 70154 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _loc__4_ = (_startpos__4_, _endpos__4_) in + +<<<<<<< HEAD +# 3641 "parsing/parser.mly" +||||||| 04da777f7 +# 3639 "parsing/parser.mly" +======= +# 3630 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__4_ "type" ) +<<<<<<< HEAD +# 69553 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70199 "parsing/parser.ml" +||||||| 04da777f7 +# 70190 "parsing/parser.ml" +======= +# 70204 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69563 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70209 "parsing/parser.ml" +||||||| 04da777f7 +# 70200 "parsing/parser.ml" +======= +# 70214 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70215 "parsing/parser.ml" +||||||| 04da777f7 +# 70206 "parsing/parser.ml" +======= +# 70220 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69575 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70221 "parsing/parser.ml" +||||||| 04da777f7 +# 70212 "parsing/parser.ml" +======= +# 70226 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _4 : (string option) = Obj.magic _4 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__7_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = + let _6 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4546 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +# 69659 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4550 "parsing/parser.mly" +||||||| 04da777f7 +# 4543 "parsing/parser.mly" +======= +# 4534 "parsing/parser.mly" +>>>>>>> origin/main + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + let descr = Ptyp_package (lid, cstrs) in + mktyp ~loc:_sloc ~attrs descr ) +<<<<<<< HEAD +# 70305 "parsing/parser.ml" +||||||| 04da777f7 +# 70296 "parsing/parser.ml" +======= +# 70310 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _3 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 69669 "parsing/parser.ml" + + in + +# 5022 "parsing/parser.mly" + ( _1, _2 ) +# 69675 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 70315 "parsing/parser.ml" +||||||| 04da777f7 +# 70306 "parsing/parser.ml" +======= +# 70320 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 5026 "parsing/parser.mly" +||||||| 04da777f7 +# 5019 "parsing/parser.mly" +======= +# 5010 "parsing/parser.mly" +>>>>>>> origin/main + ( _1, _2 ) +<<<<<<< HEAD +# 70321 "parsing/parser.ml" +||||||| 04da777f7 +# 70312 "parsing/parser.ml" +======= +# 70326 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc__7_ = (_startpos__7_, _endpos__7_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + +<<<<<<< HEAD +# 3644 "parsing/parser.mly" +||||||| 04da777f7 +# 3642 "parsing/parser.mly" +======= +# 3633 "parsing/parser.mly" +>>>>>>> origin/main + ( unclosed "(" _loc__1_ ")" _loc__7_ ) +<<<<<<< HEAD +# 69683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70329 "parsing/parser.ml" +||||||| 04da777f7 +# 70320 "parsing/parser.ml" +======= +# 70334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__7_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69693 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70339 "parsing/parser.ml" +||||||| 04da777f7 +# 70330 "parsing/parser.ml" +======= +# 70344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69699 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70345 "parsing/parser.ml" +||||||| 04da777f7 +# 70336 "parsing/parser.ml" +======= +# 70350 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69705 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70351 "parsing/parser.ml" +||||||| 04da777f7 +# 70342 "parsing/parser.ml" +======= +# 70356 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.extension) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let _1 = +<<<<<<< HEAD +# 3646 "parsing/parser.mly" +||||||| 04da777f7 +# 3644 "parsing/parser.mly" +======= +# 3635 "parsing/parser.mly" +>>>>>>> origin/main + ( Ppat_extension _1 ) +<<<<<<< HEAD +# 69732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70378 "parsing/parser.ml" +||||||| 04da777f7 +# 70369 "parsing/parser.ml" +======= +# 70383 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1230 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +<<<<<<< HEAD +# 69740 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70386 "parsing/parser.ml" +||||||| 04da777f7 +# 70377 "parsing/parser.ml" +======= +# 70391 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3647 "parsing/parser.mly" +||||||| 04da777f7 +# 3645 "parsing/parser.mly" +======= +# 3636 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69746 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70392 "parsing/parser.ml" +||||||| 04da777f7 +# 70383 "parsing/parser.ml" +======= +# 70397 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69752 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70398 "parsing/parser.ml" +||||||| 04da777f7 +# 70389 "parsing/parser.ml" +======= +# 70403 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : (Mode.t) = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.pattern) = let _1 = +<<<<<<< HEAD +# 3649 "parsing/parser.mly" +||||||| 04da777f7 +# 3647 "parsing/parser.mly" +======= +# 3638 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_with_modes _3 _2 ) +<<<<<<< HEAD +# 69798 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70444 "parsing/parser.ml" +||||||| 04da777f7 +# 70435 "parsing/parser.ml" +======= +# 70449 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69803 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70449 "parsing/parser.ml" +||||||| 04da777f7 +# 70440 "parsing/parser.ml" +======= +# 70454 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let _4 : (Parsetree.core_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v : (Parsetree.pattern) = let _1 = + let _5 = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 69857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 70503 "parsing/parser.ml" +||||||| 04da777f7 +# 70494 "parsing/parser.ml" +======= +# 70508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__6_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3651 "parsing/parser.mly" +||||||| 04da777f7 +# 3649 "parsing/parser.mly" +======= +# 3640 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_with_modes _5 @@ + mkpat ~loc:_sloc (Ppat_constraint(_2, _4)) ) +<<<<<<< HEAD +# 69866 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70512 "parsing/parser.ml" +||||||| 04da777f7 +# 70503 "parsing/parser.ml" +======= +# 70517 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69872 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70518 "parsing/parser.ml" +||||||| 04da777f7 +# 70509 "parsing/parser.ml" +======= +# 70523 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _4 : (Parsetree.core_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v : (Parsetree.pattern) = let _1 = + let _5 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 69935 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 70581 "parsing/parser.ml" +||||||| 04da777f7 +# 70572 "parsing/parser.ml" +======= +# 70586 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos__6_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3651 "parsing/parser.mly" +||||||| 04da777f7 +# 3649 "parsing/parser.mly" +======= +# 3640 "parsing/parser.mly" +>>>>>>> origin/main + ( mkpat_with_modes _5 @@ + mkpat ~loc:_sloc (Ppat_constraint(_2, _4)) ) +<<<<<<< HEAD +# 69945 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70591 "parsing/parser.ml" +||||||| 04da777f7 +# 70582 "parsing/parser.ml" +======= +# 70596 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3609 "parsing/parser.mly" +||||||| 04da777f7 +# 3607 "parsing/parser.mly" +======= +# 3598 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 69951 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70597 "parsing/parser.ml" +||||||| 04da777f7 +# 70588 "parsing/parser.ml" +======= +# 70602 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Constant.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3610 "parsing/parser.mly" +||||||| 04da777f7 +# 3608 "parsing/parser.mly" +======= +# 3599 "parsing/parser.mly" +>>>>>>> origin/main + ( Constant.to_pattern _1 ~loc:_sloc ) +<<<<<<< HEAD +# 69979 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70625 "parsing/parser.ml" +||||||| 04da777f7 +# 70616 "parsing/parser.ml" +======= +# 70630 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 70000 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 70646 "parsing/parser.ml" +||||||| 04da777f7 +# 70637 "parsing/parser.ml" +======= +# 70651 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +<<<<<<< HEAD +# 4929 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4933 "parsing/parser.mly" + ( _1 ) +# 70654 "parsing/parser.ml" +||||||| 04da777f7 +# 4926 "parsing/parser.mly" + ( _1 ) +# 70645 "parsing/parser.ml" +======= +# 4917 "parsing/parser.mly" +>>>>>>> upstream/main + ( _1 ) +# 70008 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 1061 "parsing/parser.mly" + (string) +# 70029 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +<<<<<<< HEAD +======= +# 4918 "parsing/parser.mly" + ( _1 ) +# 70688 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4919 "parsing/parser.mly" + ( "and" ) +# 70713 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4920 "parsing/parser.mly" + ( "as" ) +# 70738 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4921 "parsing/parser.mly" + ( "assert" ) +# 70763 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4922 "parsing/parser.mly" + ( "begin" ) +# 70788 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4923 "parsing/parser.mly" + ( "class" ) +# 70813 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4924 "parsing/parser.mly" + ( "constraint" ) +# 70838 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4925 "parsing/parser.mly" + ( "do" ) +# 70863 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4926 "parsing/parser.mly" + ( "done" ) +# 70888 "parsing/parser.ml" +>>>>>>> origin/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in +<<<<<<< HEAD + let _1 : ( +# 1071 "parsing/parser.mly" + (string) +# 70675 "parsing/parser.ml" + ) = Obj.magic _1 in +||||||| 04da777f7 + let _1 : ( +# 1071 "parsing/parser.mly" + (string) +# 70666 "parsing/parser.ml" + ) = Obj.magic _1 in +======= + let _1 : unit = Obj.magic _1 in +>>>>>>> origin/main + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +<<<<<<< HEAD +||||||| 04da777f7 +# 4927 "parsing/parser.mly" + ( _1 ) +# 70674 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4928 "parsing/parser.mly" + ( "and" ) +# 70699 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4929 "parsing/parser.mly" + ( "as" ) +# 70724 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4930 "parsing/parser.mly" + ( "assert" ) +# 70749 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4931 "parsing/parser.mly" + ( "begin" ) +# 70774 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4932 "parsing/parser.mly" + ( "class" ) +# 70799 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4933 "parsing/parser.mly" + ( "constraint" ) +# 70824 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +======= +# 4927 "parsing/parser.mly" + ( "downto" ) +# 70913 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4928 "parsing/parser.mly" + ( "else" ) +# 70938 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4929 "parsing/parser.mly" + ( "end" ) +# 70963 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +>>>>>>> upstream/main +# 4930 "parsing/parser.mly" + ( _1 ) +# 70037 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4931 "parsing/parser.mly" + ( "and" ) +# 70062 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4932 "parsing/parser.mly" + ( "as" ) +# 70087 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4933 "parsing/parser.mly" + ( "assert" ) +# 70112 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +>>>>>>> origin/main +# 4934 "parsing/parser.mly" +<<<<<<< HEAD + ( "begin" ) +# 70137 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( _1 ) +# 70683 "parsing/parser.ml" +||||||| 04da777f7 + ( "do" ) +# 70849 "parsing/parser.ml" +======= + ( "fun" ) +# 71088 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4935 "parsing/parser.mly" +<<<<<<< HEAD + ( "class" ) +# 70162 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "and" ) +# 70708 "parsing/parser.ml" +||||||| 04da777f7 + ( "done" ) +# 70874 "parsing/parser.ml" +======= + ( "function" ) +# 71113 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4936 "parsing/parser.mly" +<<<<<<< HEAD + ( "constraint" ) +# 70187 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "as" ) +# 70733 "parsing/parser.ml" +||||||| 04da777f7 + ( "downto" ) +# 70899 "parsing/parser.ml" +======= + ( "functor" ) +# 71138 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4937 "parsing/parser.mly" +<<<<<<< HEAD + ( "do" ) +# 70212 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "assert" ) +# 70758 "parsing/parser.ml" +||||||| 04da777f7 + ( "else" ) +# 70924 "parsing/parser.ml" +======= + ( "if" ) +# 71163 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4938 "parsing/parser.mly" +<<<<<<< HEAD + ( "done" ) +# 70237 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "begin" ) +# 70783 "parsing/parser.ml" +||||||| 04da777f7 + ( "end" ) +# 70949 "parsing/parser.ml" +======= + ( "in" ) +# 71188 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4939 "parsing/parser.mly" +<<<<<<< HEAD + ( "downto" ) +# 70262 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "class" ) +# 70808 "parsing/parser.ml" +||||||| 04da777f7 + ( "exception" ) +# 70974 "parsing/parser.ml" +======= + ( "include" ) +# 71213 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4940 "parsing/parser.mly" +<<<<<<< HEAD + ( "else" ) +# 70287 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "constraint" ) +# 70833 "parsing/parser.ml" +||||||| 04da777f7 + ( "external" ) +# 70999 "parsing/parser.ml" +======= + ( "inherit" ) +# 71238 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4941 "parsing/parser.mly" +<<<<<<< HEAD + ( "end" ) +# 70312 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "do" ) +# 70858 "parsing/parser.ml" +||||||| 04da777f7 + ( "false" ) +# 71024 "parsing/parser.ml" +======= + ( "initializer" ) +# 71263 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4942 "parsing/parser.mly" +<<<<<<< HEAD + ( "exception" ) +# 70337 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "done" ) +# 70883 "parsing/parser.ml" +||||||| 04da777f7 + ( "for" ) +# 71049 "parsing/parser.ml" +======= + ( "lazy" ) +# 71288 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4943 "parsing/parser.mly" +<<<<<<< HEAD + ( "external" ) +# 70362 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "downto" ) +# 70908 "parsing/parser.ml" +||||||| 04da777f7 + ( "fun" ) +# 71074 "parsing/parser.ml" +======= + ( "let" ) +# 71313 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4944 "parsing/parser.mly" +<<<<<<< HEAD + ( "false" ) +# 70387 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "else" ) +# 70933 "parsing/parser.ml" +||||||| 04da777f7 + ( "function" ) +# 71099 "parsing/parser.ml" +======= + ( "local_" ) +# 71338 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4945 "parsing/parser.mly" +<<<<<<< HEAD + ( "for" ) +# 70412 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "end" ) +# 70958 "parsing/parser.ml" +||||||| 04da777f7 + ( "functor" ) +# 71124 "parsing/parser.ml" +======= + ( "match" ) +# 71363 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4946 "parsing/parser.mly" +<<<<<<< HEAD + ( "fun" ) +# 70437 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "exception" ) +# 70983 "parsing/parser.ml" +||||||| 04da777f7 + ( "if" ) +# 71149 "parsing/parser.ml" +======= + ( "method" ) +# 71388 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4947 "parsing/parser.mly" +<<<<<<< HEAD + ( "function" ) +# 70462 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "external" ) +# 71008 "parsing/parser.ml" +||||||| 04da777f7 + ( "in" ) +# 71174 "parsing/parser.ml" +======= + ( "module" ) +# 71413 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4948 "parsing/parser.mly" +<<<<<<< HEAD + ( "functor" ) +# 70487 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "false" ) +# 71033 "parsing/parser.ml" +||||||| 04da777f7 + ( "include" ) +# 71199 "parsing/parser.ml" +======= + ( "mutable" ) +# 71438 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4949 "parsing/parser.mly" +<<<<<<< HEAD + ( "if" ) +# 70512 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "for" ) +# 71058 "parsing/parser.ml" +||||||| 04da777f7 + ( "inherit" ) +# 71224 "parsing/parser.ml" +======= + ( "new" ) +# 71463 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4950 "parsing/parser.mly" +<<<<<<< HEAD + ( "in" ) +# 70537 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "fun" ) +# 71083 "parsing/parser.ml" +||||||| 04da777f7 + ( "initializer" ) +# 71249 "parsing/parser.ml" +======= + ( "nonrec" ) +# 71488 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4951 "parsing/parser.mly" +<<<<<<< HEAD + ( "include" ) +# 70562 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "function" ) +# 71108 "parsing/parser.ml" +||||||| 04da777f7 + ( "lazy" ) +# 71274 "parsing/parser.ml" +======= + ( "object" ) +# 71513 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4952 "parsing/parser.mly" +<<<<<<< HEAD + ( "inherit" ) +# 70587 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "functor" ) +# 71133 "parsing/parser.ml" +||||||| 04da777f7 + ( "let" ) +# 71299 "parsing/parser.ml" +======= + ( "of" ) +# 71538 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4953 "parsing/parser.mly" +<<<<<<< HEAD + ( "initializer" ) +# 70612 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "if" ) +# 71158 "parsing/parser.ml" +||||||| 04da777f7 + ( "local_" ) +# 71324 "parsing/parser.ml" +======= + ( "open" ) +# 71563 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4954 "parsing/parser.mly" +<<<<<<< HEAD + ( "lazy" ) +# 70637 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "in" ) +# 71183 "parsing/parser.ml" +||||||| 04da777f7 + ( "match" ) +# 71349 "parsing/parser.ml" +======= + ( "or" ) +# 71588 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4955 "parsing/parser.mly" +<<<<<<< HEAD + ( "let" ) +# 70662 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "include" ) +# 71208 "parsing/parser.ml" +||||||| 04da777f7 + ( "method" ) +# 71374 "parsing/parser.ml" +======= + ( "private" ) +# 71613 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4956 "parsing/parser.mly" +<<<<<<< HEAD + ( "local_" ) +# 70687 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "inherit" ) +# 71233 "parsing/parser.ml" +||||||| 04da777f7 + ( "module" ) +# 71399 "parsing/parser.ml" +======= + ( "rec" ) +# 71638 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4957 "parsing/parser.mly" +<<<<<<< HEAD + ( "match" ) +# 70712 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "initializer" ) +# 71258 "parsing/parser.ml" +||||||| 04da777f7 + ( "mutable" ) +# 71424 "parsing/parser.ml" +======= + ( "sig" ) +# 71663 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4958 "parsing/parser.mly" +<<<<<<< HEAD + ( "method" ) +# 70737 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "lazy" ) +# 71283 "parsing/parser.ml" +||||||| 04da777f7 + ( "new" ) +# 71449 "parsing/parser.ml" +======= + ( "struct" ) +# 71688 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4959 "parsing/parser.mly" +<<<<<<< HEAD + ( "module" ) +# 70762 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "let" ) +# 71308 "parsing/parser.ml" +||||||| 04da777f7 + ( "nonrec" ) +# 71474 "parsing/parser.ml" +======= + ( "then" ) +# 71713 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4960 "parsing/parser.mly" +<<<<<<< HEAD + ( "mutable" ) +# 70787 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "local_" ) +# 71333 "parsing/parser.ml" +||||||| 04da777f7 + ( "object" ) +# 71499 "parsing/parser.ml" +======= + ( "to" ) +# 71738 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4961 "parsing/parser.mly" +<<<<<<< HEAD + ( "new" ) +# 70812 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "match" ) +# 71358 "parsing/parser.ml" +||||||| 04da777f7 + ( "of" ) +# 71524 "parsing/parser.ml" +======= + ( "true" ) +# 71763 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4962 "parsing/parser.mly" +<<<<<<< HEAD + ( "nonrec" ) +# 70837 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "method" ) +# 71383 "parsing/parser.ml" +||||||| 04da777f7 + ( "open" ) +# 71549 "parsing/parser.ml" +======= + ( "try" ) +# 71788 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4963 "parsing/parser.mly" +<<<<<<< HEAD + ( "object" ) +# 70862 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "module" ) +# 71408 "parsing/parser.ml" +||||||| 04da777f7 + ( "or" ) +# 71574 "parsing/parser.ml" +======= + ( "type" ) +# 71813 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4964 "parsing/parser.mly" +<<<<<<< HEAD + ( "of" ) +# 70887 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "mutable" ) +# 71433 "parsing/parser.ml" +||||||| 04da777f7 + ( "private" ) +# 71599 "parsing/parser.ml" +======= + ( "val" ) +# 71838 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4965 "parsing/parser.mly" +<<<<<<< HEAD + ( "open" ) +# 70912 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "new" ) +# 71458 "parsing/parser.ml" +||||||| 04da777f7 + ( "rec" ) +# 71624 "parsing/parser.ml" +======= + ( "virtual" ) +# 71863 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4966 "parsing/parser.mly" +<<<<<<< HEAD + ( "or" ) +# 70937 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "nonrec" ) +# 71483 "parsing/parser.ml" +||||||| 04da777f7 + ( "sig" ) +# 71649 "parsing/parser.ml" +======= + ( "when" ) +# 71888 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4967 "parsing/parser.mly" +<<<<<<< HEAD + ( "private" ) +# 70962 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "object" ) +# 71508 "parsing/parser.ml" +||||||| 04da777f7 + ( "struct" ) +# 71674 "parsing/parser.ml" +======= + ( "while" ) +# 71913 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4968 "parsing/parser.mly" +<<<<<<< HEAD + ( "rec" ) +# 70987 "parsing/parser.ml" +======= +<<<<<<< HEAD + ( "of" ) +# 71533 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4969 "parsing/parser.mly" +<<<<<<< HEAD + ( "sig" ) +# 71012 "parsing/parser.ml" +======= + ( "open" ) +# 71558 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4970 "parsing/parser.mly" +<<<<<<< HEAD + ( "struct" ) +# 71037 "parsing/parser.ml" +======= + ( "or" ) +# 71583 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4971 "parsing/parser.mly" +<<<<<<< HEAD + ( "then" ) +# 71062 "parsing/parser.ml" +======= + ( "private" ) +# 71608 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4972 "parsing/parser.mly" +<<<<<<< HEAD + ( "to" ) +# 71087 "parsing/parser.ml" +======= + ( "rec" ) +# 71633 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4973 "parsing/parser.mly" +<<<<<<< HEAD + ( "true" ) +# 71112 "parsing/parser.ml" +======= + ( "sig" ) +# 71658 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4974 "parsing/parser.mly" +<<<<<<< HEAD + ( "try" ) +# 71137 "parsing/parser.ml" +======= + ( "struct" ) +# 71683 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4975 "parsing/parser.mly" +<<<<<<< HEAD + ( "type" ) +# 71162 "parsing/parser.ml" +======= + ( "then" ) +# 71708 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4976 "parsing/parser.mly" +<<<<<<< HEAD + ( "val" ) +# 71187 "parsing/parser.ml" +======= + ( "to" ) +# 71733 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4977 "parsing/parser.mly" +<<<<<<< HEAD + ( "virtual" ) +# 71212 "parsing/parser.ml" +======= + ( "true" ) +# 71758 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4978 "parsing/parser.mly" +<<<<<<< HEAD + ( "when" ) +# 71237 "parsing/parser.ml" +======= + ( "try" ) +# 71783 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4979 "parsing/parser.mly" +<<<<<<< HEAD + ( "while" ) +# 71262 "parsing/parser.ml" +======= + ( "type" ) +# 71808 "parsing/parser.ml" +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4980 "parsing/parser.mly" +<<<<<<< HEAD + ( "with" ) +# 71287 "parsing/parser.ml" +======= + ( "val" ) +# 71833 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4981 "parsing/parser.mly" + ( "virtual" ) +# 71858 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4982 "parsing/parser.mly" + ( "when" ) +# 71883 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4983 "parsing/parser.mly" + ( "while" ) +# 71908 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4984 "parsing/parser.mly" +||||||| 04da777f7 + ( "then" ) +# 71699 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4969 "parsing/parser.mly" + ( "to" ) +# 71724 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4970 "parsing/parser.mly" + ( "true" ) +# 71749 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4971 "parsing/parser.mly" + ( "try" ) +# 71774 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4972 "parsing/parser.mly" + ( "type" ) +# 71799 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4973 "parsing/parser.mly" + ( "val" ) +# 71824 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4974 "parsing/parser.mly" + ( "virtual" ) +# 71849 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4975 "parsing/parser.mly" + ( "when" ) +# 71874 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4976 "parsing/parser.mly" + ( "while" ) +# 71899 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4977 "parsing/parser.mly" +======= +>>>>>>> origin/main + ( "with" ) +<<<<<<< HEAD +# 71933 "parsing/parser.ml" +||||||| 04da777f7 +# 71924 "parsing/parser.ml" +======= +# 71938 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.type_exception * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.type_exception * string Asttypes.loc option) = +<<<<<<< HEAD +# 4005 "parsing/parser.mly" +||||||| 04da777f7 +# 3998 "parsing/parser.mly" +======= +# 3989 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 71312 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 71958 "parsing/parser.ml" +||||||| 04da777f7 +# 71949 "parsing/parser.ml" +======= +# 71963 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined5_ in + let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = + let _1 = _1_inlined5 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 71388 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72034 "parsing/parser.ml" +||||||| 04da777f7 +# 72025 "parsing/parser.ml" +======= +# 72039 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs_ = _endpos__1_inlined5_ in + let attrs2 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 71397 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72043 "parsing/parser.ml" +||||||| 04da777f7 +# 72034 "parsing/parser.ml" +======= +# 72048 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let lid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 71408 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72054 "parsing/parser.ml" +||||||| 04da777f7 +# 72045 "parsing/parser.ml" +======= +# 72059 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 71419 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72065 "parsing/parser.ml" +||||||| 04da777f7 +# 72056 "parsing/parser.ml" +======= +# 72070 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 71427 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72073 "parsing/parser.ml" +||||||| 04da777f7 +# 72064 "parsing/parser.ml" +======= +# 72078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4014 "parsing/parser.mly" +||||||| 04da777f7 +# 4007 "parsing/parser.mly" +======= +# 3998 "parsing/parser.mly" +>>>>>>> origin/main + ( let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Te.mk_exception ~attrs + (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) + , ext ) +<<<<<<< HEAD +# 71440 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72086 "parsing/parser.ml" +||||||| 04da777f7 +# 72077 "parsing/parser.ml" +======= +# 72091 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = +<<<<<<< HEAD +# 3233 "parsing/parser.mly" +||||||| 04da777f7 +# 3231 "parsing/parser.mly" +======= +# 3221 "parsing/parser.mly" +>>>>>>> origin/main + ( fun _ -> _2 ) +<<<<<<< HEAD +# 71472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72118 "parsing/parser.ml" +||||||| 04da777f7 +# 72109 "parsing/parser.ml" +======= +# 72123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : (N_ary.function_body) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (N_ary.type_constraint option) = Obj.magic _2 in + let _1 : (N_ary.function_param list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Jane_syntax.Mode_expr.t -> Parsetree.expression) = let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3237 "parsing/parser.mly" +||||||| 04da777f7 +# 3235 "parsing/parser.mly" +======= +# 3225 "parsing/parser.mly" +>>>>>>> origin/main + ( fun mode_annotations -> + let constraint_ : N_ary.function_constraint option = + match _2 with + | None -> None + | Some type_constraint -> Some { type_constraint; mode_annotations } + in + let exp = mkfunction _1 constraint_ _4 ~loc:_sloc ~attrs:(None, []) in + { exp with pexp_loc = { exp.pexp_loc with loc_ghost = true } } + ) +<<<<<<< HEAD +# 71529 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72175 "parsing/parser.ml" +||||||| 04da777f7 +# 72166 "parsing/parser.ml" +======= +# 72180 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 71606 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 72252 "parsing/parser.ml" +||||||| 04da777f7 +# 72243 "parsing/parser.ml" +======= +# 72257 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 71617 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72263 "parsing/parser.ml" +||||||| 04da777f7 +# 72254 "parsing/parser.ml" +======= +# 72268 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 71622 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 71628 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 71634 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72268 "parsing/parser.ml" +||||||| 04da777f7 +# 72259 "parsing/parser.ml" +======= +# 72273 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72274 "parsing/parser.ml" +||||||| 04da777f7 +# 72265 "parsing/parser.ml" +======= +# 72279 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 72280 "parsing/parser.ml" +||||||| 04da777f7 +# 72271 "parsing/parser.ml" +======= +# 72285 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 71644 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 71650 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72290 "parsing/parser.ml" +||||||| 04da777f7 +# 72281 "parsing/parser.ml" +======= +# 72295 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72296 "parsing/parser.ml" +||||||| 04da777f7 +# 72287 "parsing/parser.ml" +======= +# 72301 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 71657 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72303 "parsing/parser.ml" +||||||| 04da777f7 +# 72294 "parsing/parser.ml" +======= +# 72308 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 71664 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 72310 "parsing/parser.ml" +||||||| 04da777f7 +# 72301 "parsing/parser.ml" +======= +# 72315 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 71673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72319 "parsing/parser.ml" +||||||| 04da777f7 +# 72310 "parsing/parser.ml" +======= +# 72324 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 71680 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 71685 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 71692 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 72326 "parsing/parser.ml" +||||||| 04da777f7 +# 72317 "parsing/parser.ml" +======= +# 72331 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72331 "parsing/parser.ml" +||||||| 04da777f7 +# 72322 "parsing/parser.ml" +======= +# 72336 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 72338 "parsing/parser.ml" +||||||| 04da777f7 +# 72329 "parsing/parser.ml" +======= +# 72343 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 71702 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 71708 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72348 "parsing/parser.ml" +||||||| 04da777f7 +# 72339 "parsing/parser.ml" +======= +# 72353 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72354 "parsing/parser.ml" +||||||| 04da777f7 +# 72345 "parsing/parser.ml" +======= +# 72359 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 71794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 72440 "parsing/parser.ml" +||||||| 04da777f7 +# 72431 "parsing/parser.ml" +======= +# 72445 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 71806 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72452 "parsing/parser.ml" +||||||| 04da777f7 +# 72443 "parsing/parser.ml" +======= +# 72457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 71811 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 71817 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 71823 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72457 "parsing/parser.ml" +||||||| 04da777f7 +# 72448 "parsing/parser.ml" +======= +# 72462 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72463 "parsing/parser.ml" +||||||| 04da777f7 +# 72454 "parsing/parser.ml" +======= +# 72468 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 72469 "parsing/parser.ml" +||||||| 04da777f7 +# 72460 "parsing/parser.ml" +======= +# 72474 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 71833 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 71839 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72479 "parsing/parser.ml" +||||||| 04da777f7 +# 72470 "parsing/parser.ml" +======= +# 72484 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72485 "parsing/parser.ml" +||||||| 04da777f7 +# 72476 "parsing/parser.ml" +======= +# 72490 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 71846 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72492 "parsing/parser.ml" +||||||| 04da777f7 +# 72483 "parsing/parser.ml" +======= +# 72497 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 71853 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 72499 "parsing/parser.ml" +||||||| 04da777f7 +# 72490 "parsing/parser.ml" +======= +# 72504 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 71862 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72508 "parsing/parser.ml" +||||||| 04da777f7 +# 72499 "parsing/parser.ml" +======= +# 72513 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 71869 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 71874 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 71881 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 72515 "parsing/parser.ml" +||||||| 04da777f7 +# 72506 "parsing/parser.ml" +======= +# 72520 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72520 "parsing/parser.ml" +||||||| 04da777f7 +# 72511 "parsing/parser.ml" +======= +# 72525 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 72527 "parsing/parser.ml" +||||||| 04da777f7 +# 72518 "parsing/parser.ml" +======= +# 72532 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 71891 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 71897 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72537 "parsing/parser.ml" +||||||| 04da777f7 +# 72528 "parsing/parser.ml" +======= +# 72542 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72543 "parsing/parser.ml" +||||||| 04da777f7 +# 72534 "parsing/parser.ml" +======= +# 72548 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 71946 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 71952 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 72592 "parsing/parser.ml" +||||||| 04da777f7 +# 72583 "parsing/parser.ml" +======= +# 72597 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 72598 "parsing/parser.ml" +||||||| 04da777f7 +# 72589 "parsing/parser.ml" +======= +# 72603 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 71958 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 71964 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 72604 "parsing/parser.ml" +||||||| 04da777f7 +# 72595 "parsing/parser.ml" +======= +# 72609 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 72610 "parsing/parser.ml" +||||||| 04da777f7 +# 72601 "parsing/parser.ml" +======= +# 72615 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 71973 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72619 "parsing/parser.ml" +||||||| 04da777f7 +# 72610 "parsing/parser.ml" +======= +# 72624 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 71980 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 71985 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 71992 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 72626 "parsing/parser.ml" +||||||| 04da777f7 +# 72617 "parsing/parser.ml" +======= +# 72631 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72631 "parsing/parser.ml" +||||||| 04da777f7 +# 72622 "parsing/parser.ml" +======= +# 72636 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 72638 "parsing/parser.ml" +||||||| 04da777f7 +# 72629 "parsing/parser.ml" +======= +# 72643 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 72002 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 72008 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72648 "parsing/parser.ml" +||||||| 04da777f7 +# 72639 "parsing/parser.ml" +======= +# 72653 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72654 "parsing/parser.ml" +||||||| 04da777f7 +# 72645 "parsing/parser.ml" +======= +# 72659 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 72064 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 72070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 72710 "parsing/parser.ml" +||||||| 04da777f7 +# 72701 "parsing/parser.ml" +======= +# 72715 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 72716 "parsing/parser.ml" +||||||| 04da777f7 +# 72707 "parsing/parser.ml" +======= +# 72721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 72076 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 72082 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 72722 "parsing/parser.ml" +||||||| 04da777f7 +# 72713 "parsing/parser.ml" +======= +# 72727 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 72728 "parsing/parser.ml" +||||||| 04da777f7 +# 72719 "parsing/parser.ml" +======= +# 72733 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 72091 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72737 "parsing/parser.ml" +||||||| 04da777f7 +# 72728 "parsing/parser.ml" +======= +# 72742 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 72098 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 72103 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 72110 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 72744 "parsing/parser.ml" +||||||| 04da777f7 +# 72735 "parsing/parser.ml" +======= +# 72749 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72749 "parsing/parser.ml" +||||||| 04da777f7 +# 72740 "parsing/parser.ml" +======= +# 72754 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 72756 "parsing/parser.ml" +||||||| 04da777f7 +# 72747 "parsing/parser.ml" +======= +# 72761 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 72120 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 72126 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72766 "parsing/parser.ml" +||||||| 04da777f7 +# 72757 "parsing/parser.ml" +======= +# 72771 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72772 "parsing/parser.ml" +||||||| 04da777f7 +# 72763 "parsing/parser.ml" +======= +# 72777 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 72210 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 72856 "parsing/parser.ml" +||||||| 04da777f7 +# 72847 "parsing/parser.ml" +======= +# 72861 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 72222 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72868 "parsing/parser.ml" +||||||| 04da777f7 +# 72859 "parsing/parser.ml" +======= +# 72873 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 72227 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 72233 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 72239 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72873 "parsing/parser.ml" +||||||| 04da777f7 +# 72864 "parsing/parser.ml" +======= +# 72878 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72879 "parsing/parser.ml" +||||||| 04da777f7 +# 72870 "parsing/parser.ml" +======= +# 72884 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 72885 "parsing/parser.ml" +||||||| 04da777f7 +# 72876 "parsing/parser.ml" +======= +# 72890 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 72249 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 72255 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72895 "parsing/parser.ml" +||||||| 04da777f7 +# 72886 "parsing/parser.ml" +======= +# 72900 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72901 "parsing/parser.ml" +||||||| 04da777f7 +# 72892 "parsing/parser.ml" +======= +# 72906 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 72262 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72908 "parsing/parser.ml" +||||||| 04da777f7 +# 72899 "parsing/parser.ml" +======= +# 72913 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 72274 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 72280 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 72920 "parsing/parser.ml" +||||||| 04da777f7 +# 72911 "parsing/parser.ml" +======= +# 72925 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 72926 "parsing/parser.ml" +||||||| 04da777f7 +# 72917 "parsing/parser.ml" +======= +# 72931 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 72290 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72936 "parsing/parser.ml" +||||||| 04da777f7 +# 72927 "parsing/parser.ml" +======= +# 72941 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 72297 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 72302 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 72309 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 72943 "parsing/parser.ml" +||||||| 04da777f7 +# 72934 "parsing/parser.ml" +======= +# 72948 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72948 "parsing/parser.ml" +||||||| 04da777f7 +# 72939 "parsing/parser.ml" +======= +# 72953 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 72955 "parsing/parser.ml" +||||||| 04da777f7 +# 72946 "parsing/parser.ml" +======= +# 72960 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 72319 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 72325 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 72965 "parsing/parser.ml" +||||||| 04da777f7 +# 72956 "parsing/parser.ml" +======= +# 72970 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 72971 "parsing/parser.ml" +||||||| 04da777f7 +# 72962 "parsing/parser.ml" +======= +# 72976 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 72418 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 73064 "parsing/parser.ml" +||||||| 04da777f7 +# 73055 "parsing/parser.ml" +======= +# 73069 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 72431 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73077 "parsing/parser.ml" +||||||| 04da777f7 +# 73068 "parsing/parser.ml" +======= +# 73082 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 72436 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 72442 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 72448 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73082 "parsing/parser.ml" +||||||| 04da777f7 +# 73073 "parsing/parser.ml" +======= +# 73087 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73088 "parsing/parser.ml" +||||||| 04da777f7 +# 73079 "parsing/parser.ml" +======= +# 73093 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 73094 "parsing/parser.ml" +||||||| 04da777f7 +# 73085 "parsing/parser.ml" +======= +# 73099 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 72458 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 72464 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73104 "parsing/parser.ml" +||||||| 04da777f7 +# 73095 "parsing/parser.ml" +======= +# 73109 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73110 "parsing/parser.ml" +||||||| 04da777f7 +# 73101 "parsing/parser.ml" +======= +# 73115 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 72471 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73117 "parsing/parser.ml" +||||||| 04da777f7 +# 73108 "parsing/parser.ml" +======= +# 73122 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 72483 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 72489 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 73129 "parsing/parser.ml" +||||||| 04da777f7 +# 73120 "parsing/parser.ml" +======= +# 73134 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 73135 "parsing/parser.ml" +||||||| 04da777f7 +# 73126 "parsing/parser.ml" +======= +# 73140 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 72499 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73145 "parsing/parser.ml" +||||||| 04da777f7 +# 73136 "parsing/parser.ml" +======= +# 73150 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 72506 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 72511 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 72518 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 73152 "parsing/parser.ml" +||||||| 04da777f7 +# 73143 "parsing/parser.ml" +======= +# 73157 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73157 "parsing/parser.ml" +||||||| 04da777f7 +# 73148 "parsing/parser.ml" +======= +# 73162 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 73164 "parsing/parser.ml" +||||||| 04da777f7 +# 73155 "parsing/parser.ml" +======= +# 73169 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 72528 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 72534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73174 "parsing/parser.ml" +||||||| 04da777f7 +# 73165 "parsing/parser.ml" +======= +# 73179 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73180 "parsing/parser.ml" +||||||| 04da777f7 +# 73171 "parsing/parser.ml" +======= +# 73185 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 72590 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 72596 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 73236 "parsing/parser.ml" +||||||| 04da777f7 +# 73227 "parsing/parser.ml" +======= +# 73241 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 73242 "parsing/parser.ml" +||||||| 04da777f7 +# 73233 "parsing/parser.ml" +======= +# 73247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 72602 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73248 "parsing/parser.ml" +||||||| 04da777f7 +# 73239 "parsing/parser.ml" +======= +# 73253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 72613 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 72619 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 73259 "parsing/parser.ml" +||||||| 04da777f7 +# 73250 "parsing/parser.ml" +======= +# 73264 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 73265 "parsing/parser.ml" +||||||| 04da777f7 +# 73256 "parsing/parser.ml" +======= +# 73270 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 72629 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73275 "parsing/parser.ml" +||||||| 04da777f7 +# 73266 "parsing/parser.ml" +======= +# 73280 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 72636 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 72641 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 72648 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 73282 "parsing/parser.ml" +||||||| 04da777f7 +# 73273 "parsing/parser.ml" +======= +# 73287 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73287 "parsing/parser.ml" +||||||| 04da777f7 +# 73278 "parsing/parser.ml" +======= +# 73292 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 73294 "parsing/parser.ml" +||||||| 04da777f7 +# 73285 "parsing/parser.ml" +======= +# 73299 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 72658 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 72664 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73304 "parsing/parser.ml" +||||||| 04da777f7 +# 73295 "parsing/parser.ml" +======= +# 73309 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73310 "parsing/parser.ml" +||||||| 04da777f7 +# 73301 "parsing/parser.ml" +======= +# 73315 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 72729 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 73375 "parsing/parser.ml" +||||||| 04da777f7 +# 73366 "parsing/parser.ml" +======= +# 73380 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 72736 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 73382 "parsing/parser.ml" +||||||| 04da777f7 +# 73373 "parsing/parser.ml" +======= +# 73387 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 72742 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73388 "parsing/parser.ml" +||||||| 04da777f7 +# 73379 "parsing/parser.ml" +======= +# 73393 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 72753 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 72759 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 73399 "parsing/parser.ml" +||||||| 04da777f7 +# 73390 "parsing/parser.ml" +======= +# 73404 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 73405 "parsing/parser.ml" +||||||| 04da777f7 +# 73396 "parsing/parser.ml" +======= +# 73410 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 72769 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73415 "parsing/parser.ml" +||||||| 04da777f7 +# 73406 "parsing/parser.ml" +======= +# 73420 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 72776 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 72781 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 72788 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 73422 "parsing/parser.ml" +||||||| 04da777f7 +# 73413 "parsing/parser.ml" +======= +# 73427 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73427 "parsing/parser.ml" +||||||| 04da777f7 +# 73418 "parsing/parser.ml" +======= +# 73432 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 73434 "parsing/parser.ml" +||||||| 04da777f7 +# 73425 "parsing/parser.ml" +======= +# 73439 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 72798 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 72804 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73444 "parsing/parser.ml" +||||||| 04da777f7 +# 73435 "parsing/parser.ml" +======= +# 73449 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73450 "parsing/parser.ml" +||||||| 04da777f7 +# 73441 "parsing/parser.ml" +======= +# 73455 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 72881 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73527 "parsing/parser.ml" +||||||| 04da777f7 +# 73518 "parsing/parser.ml" +======= +# 73532 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 72892 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 73538 "parsing/parser.ml" +||||||| 04da777f7 +# 73529 "parsing/parser.ml" +======= +# 73543 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 72903 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73549 "parsing/parser.ml" +||||||| 04da777f7 +# 73540 "parsing/parser.ml" +======= +# 73554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 72908 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 72914 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 72920 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73554 "parsing/parser.ml" +||||||| 04da777f7 +# 73545 "parsing/parser.ml" +======= +# 73559 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73560 "parsing/parser.ml" +||||||| 04da777f7 +# 73551 "parsing/parser.ml" +======= +# 73565 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 73566 "parsing/parser.ml" +||||||| 04da777f7 +# 73557 "parsing/parser.ml" +======= +# 73571 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 72930 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 72936 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73576 "parsing/parser.ml" +||||||| 04da777f7 +# 73567 "parsing/parser.ml" +======= +# 73581 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73582 "parsing/parser.ml" +||||||| 04da777f7 +# 73573 "parsing/parser.ml" +======= +# 73587 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 72943 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73589 "parsing/parser.ml" +||||||| 04da777f7 +# 73580 "parsing/parser.ml" +======= +# 73594 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 72950 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 73596 "parsing/parser.ml" +||||||| 04da777f7 +# 73587 "parsing/parser.ml" +======= +# 73601 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 72959 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73605 "parsing/parser.ml" +||||||| 04da777f7 +# 73596 "parsing/parser.ml" +======= +# 73610 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 72966 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 72971 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 72978 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 73612 "parsing/parser.ml" +||||||| 04da777f7 +# 73603 "parsing/parser.ml" +======= +# 73617 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73617 "parsing/parser.ml" +||||||| 04da777f7 +# 73608 "parsing/parser.ml" +======= +# 73622 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 73624 "parsing/parser.ml" +||||||| 04da777f7 +# 73615 "parsing/parser.ml" +======= +# 73629 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 72988 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 72994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73634 "parsing/parser.ml" +||||||| 04da777f7 +# 73625 "parsing/parser.ml" +======= +# 73639 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73640 "parsing/parser.ml" +||||||| 04da777f7 +# 73631 "parsing/parser.ml" +======= +# 73645 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 73078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73724 "parsing/parser.ml" +||||||| 04da777f7 +# 73715 "parsing/parser.ml" +======= +# 73729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 73091 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 73737 "parsing/parser.ml" +||||||| 04da777f7 +# 73728 "parsing/parser.ml" +======= +# 73742 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 73103 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73749 "parsing/parser.ml" +||||||| 04da777f7 +# 73740 "parsing/parser.ml" +======= +# 73754 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 73108 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 73114 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 73120 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73754 "parsing/parser.ml" +||||||| 04da777f7 +# 73745 "parsing/parser.ml" +======= +# 73759 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73760 "parsing/parser.ml" +||||||| 04da777f7 +# 73751 "parsing/parser.ml" +======= +# 73765 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 73766 "parsing/parser.ml" +||||||| 04da777f7 +# 73757 "parsing/parser.ml" +======= +# 73771 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 73130 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 73136 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73776 "parsing/parser.ml" +||||||| 04da777f7 +# 73767 "parsing/parser.ml" +======= +# 73781 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73782 "parsing/parser.ml" +||||||| 04da777f7 +# 73773 "parsing/parser.ml" +======= +# 73787 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 73143 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73789 "parsing/parser.ml" +||||||| 04da777f7 +# 73780 "parsing/parser.ml" +======= +# 73794 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 73150 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 73796 "parsing/parser.ml" +||||||| 04da777f7 +# 73787 "parsing/parser.ml" +======= +# 73801 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 73159 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73805 "parsing/parser.ml" +||||||| 04da777f7 +# 73796 "parsing/parser.ml" +======= +# 73810 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 73166 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 73171 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 73178 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 73812 "parsing/parser.ml" +||||||| 04da777f7 +# 73803 "parsing/parser.ml" +======= +# 73817 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73817 "parsing/parser.ml" +||||||| 04da777f7 +# 73808 "parsing/parser.ml" +======= +# 73822 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 73824 "parsing/parser.ml" +||||||| 04da777f7 +# 73815 "parsing/parser.ml" +======= +# 73829 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 73188 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 73194 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73834 "parsing/parser.ml" +||||||| 04da777f7 +# 73825 "parsing/parser.ml" +======= +# 73839 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73840 "parsing/parser.ml" +||||||| 04da777f7 +# 73831 "parsing/parser.ml" +======= +# 73845 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 73243 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73889 "parsing/parser.ml" +||||||| 04da777f7 +# 73880 "parsing/parser.ml" +======= +# 73894 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 73254 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 73260 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 73900 "parsing/parser.ml" +||||||| 04da777f7 +# 73891 "parsing/parser.ml" +======= +# 73905 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 73906 "parsing/parser.ml" +||||||| 04da777f7 +# 73897 "parsing/parser.ml" +======= +# 73911 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 73266 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 73272 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 73912 "parsing/parser.ml" +||||||| 04da777f7 +# 73903 "parsing/parser.ml" +======= +# 73917 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 73918 "parsing/parser.ml" +||||||| 04da777f7 +# 73909 "parsing/parser.ml" +======= +# 73923 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 73281 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73927 "parsing/parser.ml" +||||||| 04da777f7 +# 73918 "parsing/parser.ml" +======= +# 73932 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 73288 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 73293 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 73300 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 73934 "parsing/parser.ml" +||||||| 04da777f7 +# 73925 "parsing/parser.ml" +======= +# 73939 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73939 "parsing/parser.ml" +||||||| 04da777f7 +# 73930 "parsing/parser.ml" +======= +# 73944 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 73946 "parsing/parser.ml" +||||||| 04da777f7 +# 73937 "parsing/parser.ml" +======= +# 73951 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 73310 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 73316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 73956 "parsing/parser.ml" +||||||| 04da777f7 +# 73947 "parsing/parser.ml" +======= +# 73961 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 73962 "parsing/parser.ml" +||||||| 04da777f7 +# 73953 "parsing/parser.ml" +======= +# 73967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 73372 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74018 "parsing/parser.ml" +||||||| 04da777f7 +# 74009 "parsing/parser.ml" +======= +# 74023 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 73383 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 73389 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 74029 "parsing/parser.ml" +||||||| 04da777f7 +# 74020 "parsing/parser.ml" +======= +# 74034 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 74035 "parsing/parser.ml" +||||||| 04da777f7 +# 74026 "parsing/parser.ml" +======= +# 74040 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 73395 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 73401 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 74041 "parsing/parser.ml" +||||||| 04da777f7 +# 74032 "parsing/parser.ml" +======= +# 74046 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 74047 "parsing/parser.ml" +||||||| 04da777f7 +# 74038 "parsing/parser.ml" +======= +# 74052 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 73410 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74056 "parsing/parser.ml" +||||||| 04da777f7 +# 74047 "parsing/parser.ml" +======= +# 74061 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 73417 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 73422 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 73429 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 74063 "parsing/parser.ml" +||||||| 04da777f7 +# 74054 "parsing/parser.ml" +======= +# 74068 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74068 "parsing/parser.ml" +||||||| 04da777f7 +# 74059 "parsing/parser.ml" +======= +# 74073 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 74075 "parsing/parser.ml" +||||||| 04da777f7 +# 74066 "parsing/parser.ml" +======= +# 74080 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 73439 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 73445 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74085 "parsing/parser.ml" +||||||| 04da777f7 +# 74076 "parsing/parser.ml" +======= +# 74090 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74091 "parsing/parser.ml" +||||||| 04da777f7 +# 74082 "parsing/parser.ml" +======= +# 74096 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 73529 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74175 "parsing/parser.ml" +||||||| 04da777f7 +# 74166 "parsing/parser.ml" +======= +# 74180 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 73540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 74186 "parsing/parser.ml" +||||||| 04da777f7 +# 74177 "parsing/parser.ml" +======= +# 74191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 73552 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74198 "parsing/parser.ml" +||||||| 04da777f7 +# 74189 "parsing/parser.ml" +======= +# 74203 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 73557 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 73563 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 73569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74203 "parsing/parser.ml" +||||||| 04da777f7 +# 74194 "parsing/parser.ml" +======= +# 74208 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74209 "parsing/parser.ml" +||||||| 04da777f7 +# 74200 "parsing/parser.ml" +======= +# 74214 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 74215 "parsing/parser.ml" +||||||| 04da777f7 +# 74206 "parsing/parser.ml" +======= +# 74220 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 73579 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 73585 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74225 "parsing/parser.ml" +||||||| 04da777f7 +# 74216 "parsing/parser.ml" +======= +# 74230 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74231 "parsing/parser.ml" +||||||| 04da777f7 +# 74222 "parsing/parser.ml" +======= +# 74236 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 73592 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74238 "parsing/parser.ml" +||||||| 04da777f7 +# 74229 "parsing/parser.ml" +======= +# 74243 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 73604 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 73610 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 74250 "parsing/parser.ml" +||||||| 04da777f7 +# 74241 "parsing/parser.ml" +======= +# 74255 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 74256 "parsing/parser.ml" +||||||| 04da777f7 +# 74247 "parsing/parser.ml" +======= +# 74261 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 73620 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74266 "parsing/parser.ml" +||||||| 04da777f7 +# 74257 "parsing/parser.ml" +======= +# 74271 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 73627 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 73632 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 73639 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 74273 "parsing/parser.ml" +||||||| 04da777f7 +# 74264 "parsing/parser.ml" +======= +# 74278 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74278 "parsing/parser.ml" +||||||| 04da777f7 +# 74269 "parsing/parser.ml" +======= +# 74283 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 74285 "parsing/parser.ml" +||||||| 04da777f7 +# 74276 "parsing/parser.ml" +======= +# 74290 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 73649 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 73655 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74295 "parsing/parser.ml" +||||||| 04da777f7 +# 74286 "parsing/parser.ml" +======= +# 74300 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74301 "parsing/parser.ml" +||||||| 04da777f7 +# 74292 "parsing/parser.ml" +======= +# 74306 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 73746 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74392 "parsing/parser.ml" +||||||| 04da777f7 +# 74383 "parsing/parser.ml" +======= +# 74397 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 73759 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 74405 "parsing/parser.ml" +||||||| 04da777f7 +# 74396 "parsing/parser.ml" +======= +# 74410 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 73772 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74418 "parsing/parser.ml" +||||||| 04da777f7 +# 74409 "parsing/parser.ml" +======= +# 74423 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 73777 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 73783 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 73789 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74423 "parsing/parser.ml" +||||||| 04da777f7 +# 74414 "parsing/parser.ml" +======= +# 74428 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74429 "parsing/parser.ml" +||||||| 04da777f7 +# 74420 "parsing/parser.ml" +======= +# 74434 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 74435 "parsing/parser.ml" +||||||| 04da777f7 +# 74426 "parsing/parser.ml" +======= +# 74440 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 73799 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 73805 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74445 "parsing/parser.ml" +||||||| 04da777f7 +# 74436 "parsing/parser.ml" +======= +# 74450 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74451 "parsing/parser.ml" +||||||| 04da777f7 +# 74442 "parsing/parser.ml" +======= +# 74456 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 73812 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74458 "parsing/parser.ml" +||||||| 04da777f7 +# 74449 "parsing/parser.ml" +======= +# 74463 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 73824 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 73830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 74470 "parsing/parser.ml" +||||||| 04da777f7 +# 74461 "parsing/parser.ml" +======= +# 74475 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 74476 "parsing/parser.ml" +||||||| 04da777f7 +# 74467 "parsing/parser.ml" +======= +# 74481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 73840 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74486 "parsing/parser.ml" +||||||| 04da777f7 +# 74477 "parsing/parser.ml" +======= +# 74491 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 73847 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 73852 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 73859 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 74493 "parsing/parser.ml" +||||||| 04da777f7 +# 74484 "parsing/parser.ml" +======= +# 74498 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74498 "parsing/parser.ml" +||||||| 04da777f7 +# 74489 "parsing/parser.ml" +======= +# 74503 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 74505 "parsing/parser.ml" +||||||| 04da777f7 +# 74496 "parsing/parser.ml" +======= +# 74510 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 73869 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 73875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74515 "parsing/parser.ml" +||||||| 04da777f7 +# 74506 "parsing/parser.ml" +======= +# 74520 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74521 "parsing/parser.ml" +||||||| 04da777f7 +# 74512 "parsing/parser.ml" +======= +# 74526 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 73931 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74577 "parsing/parser.ml" +||||||| 04da777f7 +# 74568 "parsing/parser.ml" +======= +# 74582 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 73942 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 73948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 74588 "parsing/parser.ml" +||||||| 04da777f7 +# 74579 "parsing/parser.ml" +======= +# 74593 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 74594 "parsing/parser.ml" +||||||| 04da777f7 +# 74585 "parsing/parser.ml" +======= +# 74599 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 73954 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74600 "parsing/parser.ml" +||||||| 04da777f7 +# 74591 "parsing/parser.ml" +======= +# 74605 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 73965 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 73971 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 74611 "parsing/parser.ml" +||||||| 04da777f7 +# 74602 "parsing/parser.ml" +======= +# 74616 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 74617 "parsing/parser.ml" +||||||| 04da777f7 +# 74608 "parsing/parser.ml" +======= +# 74622 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 73981 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74627 "parsing/parser.ml" +||||||| 04da777f7 +# 74618 "parsing/parser.ml" +======= +# 74632 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 73988 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 73993 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 74000 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 74634 "parsing/parser.ml" +||||||| 04da777f7 +# 74625 "parsing/parser.ml" +======= +# 74639 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74639 "parsing/parser.ml" +||||||| 04da777f7 +# 74630 "parsing/parser.ml" +======= +# 74644 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 74646 "parsing/parser.ml" +||||||| 04da777f7 +# 74637 "parsing/parser.ml" +======= +# 74651 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 74010 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 74016 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74656 "parsing/parser.ml" +||||||| 04da777f7 +# 74647 "parsing/parser.ml" +======= +# 74661 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74662 "parsing/parser.ml" +||||||| 04da777f7 +# 74653 "parsing/parser.ml" +======= +# 74667 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 74079 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74725 "parsing/parser.ml" +||||||| 04da777f7 +# 74716 "parsing/parser.ml" +======= +# 74730 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 74092 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 74738 "parsing/parser.ml" +||||||| 04da777f7 +# 74729 "parsing/parser.ml" +======= +# 74743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 74099 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 74745 "parsing/parser.ml" +||||||| 04da777f7 +# 74736 "parsing/parser.ml" +======= +# 74750 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 74105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74751 "parsing/parser.ml" +||||||| 04da777f7 +# 74742 "parsing/parser.ml" +======= +# 74756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 74116 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 74122 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 74762 "parsing/parser.ml" +||||||| 04da777f7 +# 74753 "parsing/parser.ml" +======= +# 74767 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 74768 "parsing/parser.ml" +||||||| 04da777f7 +# 74759 "parsing/parser.ml" +======= +# 74773 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 74132 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74778 "parsing/parser.ml" +||||||| 04da777f7 +# 74769 "parsing/parser.ml" +======= +# 74783 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 74139 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 74144 "parsing/parser.ml" + + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 74151 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 74785 "parsing/parser.ml" +||||||| 04da777f7 +# 74776 "parsing/parser.ml" +======= +# 74790 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74790 "parsing/parser.ml" +||||||| 04da777f7 +# 74781 "parsing/parser.ml" +======= +# 74795 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 74797 "parsing/parser.ml" +||||||| 04da777f7 +# 74788 "parsing/parser.ml" +======= +# 74802 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 74161 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 74167 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74807 "parsing/parser.ml" +||||||| 04da777f7 +# 74798 "parsing/parser.ml" +======= +# 74812 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74813 "parsing/parser.ml" +||||||| 04da777f7 +# 74804 "parsing/parser.ml" +======= +# 74818 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 74237 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 74883 "parsing/parser.ml" +||||||| 04da777f7 +# 74874 "parsing/parser.ml" +======= +# 74888 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 74248 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74894 "parsing/parser.ml" +||||||| 04da777f7 +# 74885 "parsing/parser.ml" +======= +# 74899 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 74253 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 74259 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 74265 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74899 "parsing/parser.ml" +||||||| 04da777f7 +# 74890 "parsing/parser.ml" +======= +# 74904 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74905 "parsing/parser.ml" +||||||| 04da777f7 +# 74896 "parsing/parser.ml" +======= +# 74910 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 74911 "parsing/parser.ml" +||||||| 04da777f7 +# 74902 "parsing/parser.ml" +======= +# 74916 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 74275 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 74281 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74921 "parsing/parser.ml" +||||||| 04da777f7 +# 74912 "parsing/parser.ml" +======= +# 74926 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74927 "parsing/parser.ml" +||||||| 04da777f7 +# 74918 "parsing/parser.ml" +======= +# 74932 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 74288 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74934 "parsing/parser.ml" +||||||| 04da777f7 +# 74925 "parsing/parser.ml" +======= +# 74939 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 74295 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 74941 "parsing/parser.ml" +||||||| 04da777f7 +# 74932 "parsing/parser.ml" +======= +# 74946 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 74304 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 74310 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 74316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74950 "parsing/parser.ml" +||||||| 04da777f7 +# 74941 "parsing/parser.ml" +======= +# 74955 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 74956 "parsing/parser.ml" +||||||| 04da777f7 +# 74947 "parsing/parser.ml" +======= +# 74961 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 74962 "parsing/parser.ml" +||||||| 04da777f7 +# 74953 "parsing/parser.ml" +======= +# 74967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 74326 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 74332 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 74972 "parsing/parser.ml" +||||||| 04da777f7 +# 74963 "parsing/parser.ml" +======= +# 74977 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 74978 "parsing/parser.ml" +||||||| 04da777f7 +# 74969 "parsing/parser.ml" +======= +# 74983 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 74411 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75057 "parsing/parser.ml" +||||||| 04da777f7 +# 75048 "parsing/parser.ml" +======= +# 75062 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 74423 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75069 "parsing/parser.ml" +||||||| 04da777f7 +# 75060 "parsing/parser.ml" +======= +# 75074 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 74428 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 74434 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 74440 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75074 "parsing/parser.ml" +||||||| 04da777f7 +# 75065 "parsing/parser.ml" +======= +# 75079 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75080 "parsing/parser.ml" +||||||| 04da777f7 +# 75071 "parsing/parser.ml" +======= +# 75085 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 75086 "parsing/parser.ml" +||||||| 04da777f7 +# 75077 "parsing/parser.ml" +======= +# 75091 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 74450 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 74456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75096 "parsing/parser.ml" +||||||| 04da777f7 +# 75087 "parsing/parser.ml" +======= +# 75101 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75102 "parsing/parser.ml" +||||||| 04da777f7 +# 75093 "parsing/parser.ml" +======= +# 75107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 74463 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75109 "parsing/parser.ml" +||||||| 04da777f7 +# 75100 "parsing/parser.ml" +======= +# 75114 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 74470 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 75116 "parsing/parser.ml" +||||||| 04da777f7 +# 75107 "parsing/parser.ml" +======= +# 75121 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 74479 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 74485 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 74491 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75125 "parsing/parser.ml" +||||||| 04da777f7 +# 75116 "parsing/parser.ml" +======= +# 75130 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 75131 "parsing/parser.ml" +||||||| 04da777f7 +# 75122 "parsing/parser.ml" +======= +# 75136 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 75137 "parsing/parser.ml" +||||||| 04da777f7 +# 75128 "parsing/parser.ml" +======= +# 75142 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 74501 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 74507 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75147 "parsing/parser.ml" +||||||| 04da777f7 +# 75138 "parsing/parser.ml" +======= +# 75152 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75153 "parsing/parser.ml" +||||||| 04da777f7 +# 75144 "parsing/parser.ml" +======= +# 75158 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 74549 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 74555 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 75195 "parsing/parser.ml" +||||||| 04da777f7 +# 75186 "parsing/parser.ml" +======= +# 75200 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 75201 "parsing/parser.ml" +||||||| 04da777f7 +# 75192 "parsing/parser.ml" +======= +# 75206 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 74561 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 74567 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 75207 "parsing/parser.ml" +||||||| 04da777f7 +# 75198 "parsing/parser.ml" +======= +# 75212 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 75213 "parsing/parser.ml" +||||||| 04da777f7 +# 75204 "parsing/parser.ml" +======= +# 75218 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 74576 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 74582 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 74588 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75222 "parsing/parser.ml" +||||||| 04da777f7 +# 75213 "parsing/parser.ml" +======= +# 75227 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 75228 "parsing/parser.ml" +||||||| 04da777f7 +# 75219 "parsing/parser.ml" +======= +# 75233 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 75234 "parsing/parser.ml" +||||||| 04da777f7 +# 75225 "parsing/parser.ml" +======= +# 75239 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 74598 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 74604 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75244 "parsing/parser.ml" +||||||| 04da777f7 +# 75235 "parsing/parser.ml" +======= +# 75249 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75250 "parsing/parser.ml" +||||||| 04da777f7 +# 75241 "parsing/parser.ml" +======= +# 75255 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 74653 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 74659 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75299 "parsing/parser.ml" +||||||| 04da777f7 +# 75290 "parsing/parser.ml" +======= +# 75304 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 75305 "parsing/parser.ml" +||||||| 04da777f7 +# 75296 "parsing/parser.ml" +======= +# 75310 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 74665 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 74671 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 75311 "parsing/parser.ml" +||||||| 04da777f7 +# 75302 "parsing/parser.ml" +======= +# 75316 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 75317 "parsing/parser.ml" +||||||| 04da777f7 +# 75308 "parsing/parser.ml" +======= +# 75322 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 74680 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 74686 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 74692 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75326 "parsing/parser.ml" +||||||| 04da777f7 +# 75317 "parsing/parser.ml" +======= +# 75331 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 75332 "parsing/parser.ml" +||||||| 04da777f7 +# 75323 "parsing/parser.ml" +======= +# 75337 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 75338 "parsing/parser.ml" +||||||| 04da777f7 +# 75329 "parsing/parser.ml" +======= +# 75343 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 74702 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 74708 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75348 "parsing/parser.ml" +||||||| 04da777f7 +# 75339 "parsing/parser.ml" +======= +# 75353 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75354 "parsing/parser.ml" +||||||| 04da777f7 +# 75345 "parsing/parser.ml" +======= +# 75359 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 74785 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 75431 "parsing/parser.ml" +||||||| 04da777f7 +# 75422 "parsing/parser.ml" +======= +# 75436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 74797 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75443 "parsing/parser.ml" +||||||| 04da777f7 +# 75434 "parsing/parser.ml" +======= +# 75448 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 74802 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 74808 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 74814 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75448 "parsing/parser.ml" +||||||| 04da777f7 +# 75439 "parsing/parser.ml" +======= +# 75453 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75454 "parsing/parser.ml" +||||||| 04da777f7 +# 75445 "parsing/parser.ml" +======= +# 75459 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 75460 "parsing/parser.ml" +||||||| 04da777f7 +# 75451 "parsing/parser.ml" +======= +# 75465 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 74824 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 74830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75470 "parsing/parser.ml" +||||||| 04da777f7 +# 75461 "parsing/parser.ml" +======= +# 75475 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75476 "parsing/parser.ml" +||||||| 04da777f7 +# 75467 "parsing/parser.ml" +======= +# 75481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 74837 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75483 "parsing/parser.ml" +||||||| 04da777f7 +# 75474 "parsing/parser.ml" +======= +# 75488 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 74849 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 74855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 75495 "parsing/parser.ml" +||||||| 04da777f7 +# 75486 "parsing/parser.ml" +======= +# 75500 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75501 "parsing/parser.ml" +||||||| 04da777f7 +# 75492 "parsing/parser.ml" +======= +# 75506 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 74865 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 74871 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 74877 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75511 "parsing/parser.ml" +||||||| 04da777f7 +# 75502 "parsing/parser.ml" +======= +# 75516 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 75517 "parsing/parser.ml" +||||||| 04da777f7 +# 75508 "parsing/parser.ml" +======= +# 75522 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 75523 "parsing/parser.ml" +||||||| 04da777f7 +# 75514 "parsing/parser.ml" +======= +# 75528 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 74887 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 74893 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75533 "parsing/parser.ml" +||||||| 04da777f7 +# 75524 "parsing/parser.ml" +======= +# 75538 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75539 "parsing/parser.ml" +||||||| 04da777f7 +# 75530 "parsing/parser.ml" +======= +# 75544 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 74979 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75625 "parsing/parser.ml" +||||||| 04da777f7 +# 75616 "parsing/parser.ml" +======= +# 75630 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 74992 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75638 "parsing/parser.ml" +||||||| 04da777f7 +# 75629 "parsing/parser.ml" +======= +# 75643 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 74997 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 75003 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 75009 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75643 "parsing/parser.ml" +||||||| 04da777f7 +# 75634 "parsing/parser.ml" +======= +# 75648 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75649 "parsing/parser.ml" +||||||| 04da777f7 +# 75640 "parsing/parser.ml" +======= +# 75654 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 75655 "parsing/parser.ml" +||||||| 04da777f7 +# 75646 "parsing/parser.ml" +======= +# 75660 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 75019 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 75025 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75665 "parsing/parser.ml" +||||||| 04da777f7 +# 75656 "parsing/parser.ml" +======= +# 75670 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75671 "parsing/parser.ml" +||||||| 04da777f7 +# 75662 "parsing/parser.ml" +======= +# 75676 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 75032 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75678 "parsing/parser.ml" +||||||| 04da777f7 +# 75669 "parsing/parser.ml" +======= +# 75683 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 75044 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 75050 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 75690 "parsing/parser.ml" +||||||| 04da777f7 +# 75681 "parsing/parser.ml" +======= +# 75695 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75696 "parsing/parser.ml" +||||||| 04da777f7 +# 75687 "parsing/parser.ml" +======= +# 75701 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75060 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 75066 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 75072 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75706 "parsing/parser.ml" +||||||| 04da777f7 +# 75697 "parsing/parser.ml" +======= +# 75711 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 75712 "parsing/parser.ml" +||||||| 04da777f7 +# 75703 "parsing/parser.ml" +======= +# 75717 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 75718 "parsing/parser.ml" +||||||| 04da777f7 +# 75709 "parsing/parser.ml" +======= +# 75723 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 75082 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 75088 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75728 "parsing/parser.ml" +||||||| 04da777f7 +# 75719 "parsing/parser.ml" +======= +# 75733 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75734 "parsing/parser.ml" +||||||| 04da777f7 +# 75725 "parsing/parser.ml" +======= +# 75739 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 75137 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 75143 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 75783 "parsing/parser.ml" +||||||| 04da777f7 +# 75774 "parsing/parser.ml" +======= +# 75788 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 75789 "parsing/parser.ml" +||||||| 04da777f7 +# 75780 "parsing/parser.ml" +======= +# 75794 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 75149 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75795 "parsing/parser.ml" +||||||| 04da777f7 +# 75786 "parsing/parser.ml" +======= +# 75800 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 75160 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 75166 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 75806 "parsing/parser.ml" +||||||| 04da777f7 +# 75797 "parsing/parser.ml" +======= +# 75811 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75812 "parsing/parser.ml" +||||||| 04da777f7 +# 75803 "parsing/parser.ml" +======= +# 75817 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75176 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 75182 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 75188 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75822 "parsing/parser.ml" +||||||| 04da777f7 +# 75813 "parsing/parser.ml" +======= +# 75827 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 75828 "parsing/parser.ml" +||||||| 04da777f7 +# 75819 "parsing/parser.ml" +======= +# 75833 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 75834 "parsing/parser.ml" +||||||| 04da777f7 +# 75825 "parsing/parser.ml" +======= +# 75839 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 75198 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 75204 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75844 "parsing/parser.ml" +||||||| 04da777f7 +# 75835 "parsing/parser.ml" +======= +# 75849 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75850 "parsing/parser.ml" +||||||| 04da777f7 +# 75841 "parsing/parser.ml" +======= +# 75855 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 75262 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75908 "parsing/parser.ml" +||||||| 04da777f7 +# 75899 "parsing/parser.ml" +======= +# 75913 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 75269 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 75915 "parsing/parser.ml" +||||||| 04da777f7 +# 75906 "parsing/parser.ml" +======= +# 75920 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 75275 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75921 "parsing/parser.ml" +||||||| 04da777f7 +# 75912 "parsing/parser.ml" +======= +# 75926 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 75286 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 75292 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 75932 "parsing/parser.ml" +||||||| 04da777f7 +# 75923 "parsing/parser.ml" +======= +# 75937 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 75938 "parsing/parser.ml" +||||||| 04da777f7 +# 75929 "parsing/parser.ml" +======= +# 75943 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75302 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 75308 "parsing/parser.ml" + in + +# 4271 "parsing/parser.mly" + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +# 75314 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75948 "parsing/parser.ml" +||||||| 04da777f7 +# 75939 "parsing/parser.ml" +======= +# 75953 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 75954 "parsing/parser.ml" +||||||| 04da777f7 +# 75945 "parsing/parser.ml" +======= +# 75959 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4290 "parsing/parser.mly" +||||||| 04da777f7 +# 4283 "parsing/parser.mly" +======= +# 4274 "parsing/parser.mly" +>>>>>>> origin/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 75960 "parsing/parser.ml" +||||||| 04da777f7 +# 75951 "parsing/parser.ml" +======= +# 75965 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 75324 "parsing/parser.ml" + + in + +# 4274 "parsing/parser.mly" + ( _1 ) +# 75330 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 75970 "parsing/parser.ml" +||||||| 04da777f7 +# 75961 "parsing/parser.ml" +======= +# 75975 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4293 "parsing/parser.mly" +||||||| 04da777f7 +# 4286 "parsing/parser.mly" +======= +# 4277 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 75976 "parsing/parser.ml" +||||||| 04da777f7 +# 75967 "parsing/parser.ml" +======= +# 75981 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 75407 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 75412 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76053 "parsing/parser.ml" +||||||| 04da777f7 +# 76044 "parsing/parser.ml" +======= +# 76058 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76058 "parsing/parser.ml" +||||||| 04da777f7 +# 76049 "parsing/parser.ml" +======= +# 76063 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75421 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76067 "parsing/parser.ml" +||||||| 04da777f7 +# 76058 "parsing/parser.ml" +======= +# 76072 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 75428 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76074 "parsing/parser.ml" +||||||| 04da777f7 +# 76065 "parsing/parser.ml" +======= +# 76079 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 75439 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76085 "parsing/parser.ml" +||||||| 04da777f7 +# 76076 "parsing/parser.ml" +======= +# 76090 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 75444 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 75450 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 75456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76090 "parsing/parser.ml" +||||||| 04da777f7 +# 76081 "parsing/parser.ml" +======= +# 76095 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76096 "parsing/parser.ml" +||||||| 04da777f7 +# 76087 "parsing/parser.ml" +======= +# 76101 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 76102 "parsing/parser.ml" +||||||| 04da777f7 +# 76093 "parsing/parser.ml" +======= +# 76107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 75466 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 75472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76112 "parsing/parser.ml" +||||||| 04da777f7 +# 76103 "parsing/parser.ml" +======= +# 76117 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76118 "parsing/parser.ml" +||||||| 04da777f7 +# 76109 "parsing/parser.ml" +======= +# 76123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 75479 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76125 "parsing/parser.ml" +||||||| 04da777f7 +# 76116 "parsing/parser.ml" +======= +# 76130 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 75486 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76132 "parsing/parser.ml" +||||||| 04da777f7 +# 76123 "parsing/parser.ml" +======= +# 76137 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75495 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76141 "parsing/parser.ml" +||||||| 04da777f7 +# 76132 "parsing/parser.ml" +======= +# 76146 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 75502 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 75507 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 76148 "parsing/parser.ml" +||||||| 04da777f7 +# 76139 "parsing/parser.ml" +======= +# 76153 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76153 "parsing/parser.ml" +||||||| 04da777f7 +# 76144 "parsing/parser.ml" +======= +# 76158 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 75517 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76163 "parsing/parser.ml" +||||||| 04da777f7 +# 76154 "parsing/parser.ml" +======= +# 76168 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 75527 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 75533 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76173 "parsing/parser.ml" +||||||| 04da777f7 +# 76164 "parsing/parser.ml" +======= +# 76178 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76179 "parsing/parser.ml" +||||||| 04da777f7 +# 76170 "parsing/parser.ml" +======= +# 76184 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined1 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 75618 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 75623 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 76264 "parsing/parser.ml" +||||||| 04da777f7 +# 76255 "parsing/parser.ml" +======= +# 76269 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76269 "parsing/parser.ml" +||||||| 04da777f7 +# 76260 "parsing/parser.ml" +======= +# 76274 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75632 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76278 "parsing/parser.ml" +||||||| 04da777f7 +# 76269 "parsing/parser.ml" +======= +# 76283 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 75639 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76285 "parsing/parser.ml" +||||||| 04da777f7 +# 76276 "parsing/parser.ml" +======= +# 76290 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 75650 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76296 "parsing/parser.ml" +||||||| 04da777f7 +# 76287 "parsing/parser.ml" +======= +# 76301 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 75655 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 75661 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 75667 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76301 "parsing/parser.ml" +||||||| 04da777f7 +# 76292 "parsing/parser.ml" +======= +# 76306 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76307 "parsing/parser.ml" +||||||| 04da777f7 +# 76298 "parsing/parser.ml" +======= +# 76312 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 76313 "parsing/parser.ml" +||||||| 04da777f7 +# 76304 "parsing/parser.ml" +======= +# 76318 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 75677 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 75683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76323 "parsing/parser.ml" +||||||| 04da777f7 +# 76314 "parsing/parser.ml" +======= +# 76328 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76329 "parsing/parser.ml" +||||||| 04da777f7 +# 76320 "parsing/parser.ml" +======= +# 76334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 75690 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76336 "parsing/parser.ml" +||||||| 04da777f7 +# 76327 "parsing/parser.ml" +======= +# 76341 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 75697 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76343 "parsing/parser.ml" +||||||| 04da777f7 +# 76334 "parsing/parser.ml" +======= +# 76348 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75706 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76352 "parsing/parser.ml" +||||||| 04da777f7 +# 76343 "parsing/parser.ml" +======= +# 76357 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 75713 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 75718 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 76359 "parsing/parser.ml" +||||||| 04da777f7 +# 76350 "parsing/parser.ml" +======= +# 76364 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76364 "parsing/parser.ml" +||||||| 04da777f7 +# 76355 "parsing/parser.ml" +======= +# 76369 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 75728 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76374 "parsing/parser.ml" +||||||| 04da777f7 +# 76365 "parsing/parser.ml" +======= +# 76379 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 75738 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 75744 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76384 "parsing/parser.ml" +||||||| 04da777f7 +# 76375 "parsing/parser.ml" +======= +# 76389 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76390 "parsing/parser.ml" +||||||| 04da777f7 +# 76381 "parsing/parser.ml" +======= +# 76395 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 75829 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76475 "parsing/parser.ml" +||||||| 04da777f7 +# 76466 "parsing/parser.ml" +======= +# 76480 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 75839 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 75845 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 76485 "parsing/parser.ml" +||||||| 04da777f7 +# 76476 "parsing/parser.ml" +======= +# 76490 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 76491 "parsing/parser.ml" +||||||| 04da777f7 +# 76482 "parsing/parser.ml" +======= +# 76496 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76501 "parsing/parser.ml" +||||||| 04da777f7 +# 76492 "parsing/parser.ml" +======= +# 76506 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 75862 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76508 "parsing/parser.ml" +||||||| 04da777f7 +# 76499 "parsing/parser.ml" +======= +# 76513 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 75873 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76519 "parsing/parser.ml" +||||||| 04da777f7 +# 76510 "parsing/parser.ml" +======= +# 76524 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 75878 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 75884 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 75890 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76524 "parsing/parser.ml" +||||||| 04da777f7 +# 76515 "parsing/parser.ml" +======= +# 76529 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76530 "parsing/parser.ml" +||||||| 04da777f7 +# 76521 "parsing/parser.ml" +======= +# 76535 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 76536 "parsing/parser.ml" +||||||| 04da777f7 +# 76527 "parsing/parser.ml" +======= +# 76541 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 75900 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 75906 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76546 "parsing/parser.ml" +||||||| 04da777f7 +# 76537 "parsing/parser.ml" +======= +# 76551 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76552 "parsing/parser.ml" +||||||| 04da777f7 +# 76543 "parsing/parser.ml" +======= +# 76557 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 75913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76559 "parsing/parser.ml" +||||||| 04da777f7 +# 76550 "parsing/parser.ml" +======= +# 76564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 75920 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76566 "parsing/parser.ml" +||||||| 04da777f7 +# 76557 "parsing/parser.ml" +======= +# 76571 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 75929 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76575 "parsing/parser.ml" +||||||| 04da777f7 +# 76566 "parsing/parser.ml" +======= +# 76580 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 75936 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 75941 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 76582 "parsing/parser.ml" +||||||| 04da777f7 +# 76573 "parsing/parser.ml" +======= +# 76587 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76587 "parsing/parser.ml" +||||||| 04da777f7 +# 76578 "parsing/parser.ml" +======= +# 76592 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 75951 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76597 "parsing/parser.ml" +||||||| 04da777f7 +# 76588 "parsing/parser.ml" +======= +# 76602 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 75961 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 75967 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76607 "parsing/parser.ml" +||||||| 04da777f7 +# 76598 "parsing/parser.ml" +======= +# 76612 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76613 "parsing/parser.ml" +||||||| 04da777f7 +# 76604 "parsing/parser.ml" +======= +# 76618 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 76061 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 76707 "parsing/parser.ml" +||||||| 04da777f7 +# 76698 "parsing/parser.ml" +======= +# 76712 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 76072 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 76078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 76718 "parsing/parser.ml" +||||||| 04da777f7 +# 76709 "parsing/parser.ml" +======= +# 76723 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 76724 "parsing/parser.ml" +||||||| 04da777f7 +# 76715 "parsing/parser.ml" +======= +# 76729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76088 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76734 "parsing/parser.ml" +||||||| 04da777f7 +# 76725 "parsing/parser.ml" +======= +# 76739 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 76095 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76741 "parsing/parser.ml" +||||||| 04da777f7 +# 76732 "parsing/parser.ml" +======= +# 76746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 76106 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76752 "parsing/parser.ml" +||||||| 04da777f7 +# 76743 "parsing/parser.ml" +======= +# 76757 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 76111 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 76117 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 76123 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76757 "parsing/parser.ml" +||||||| 04da777f7 +# 76748 "parsing/parser.ml" +======= +# 76762 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76763 "parsing/parser.ml" +||||||| 04da777f7 +# 76754 "parsing/parser.ml" +======= +# 76768 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 76769 "parsing/parser.ml" +||||||| 04da777f7 +# 76760 "parsing/parser.ml" +======= +# 76774 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 76133 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 76139 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76779 "parsing/parser.ml" +||||||| 04da777f7 +# 76770 "parsing/parser.ml" +======= +# 76784 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76785 "parsing/parser.ml" +||||||| 04da777f7 +# 76776 "parsing/parser.ml" +======= +# 76790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 76146 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76792 "parsing/parser.ml" +||||||| 04da777f7 +# 76783 "parsing/parser.ml" +======= +# 76797 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 76153 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76799 "parsing/parser.ml" +||||||| 04da777f7 +# 76790 "parsing/parser.ml" +======= +# 76804 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76162 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76808 "parsing/parser.ml" +||||||| 04da777f7 +# 76799 "parsing/parser.ml" +======= +# 76813 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 76169 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 76174 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 76815 "parsing/parser.ml" +||||||| 04da777f7 +# 76806 "parsing/parser.ml" +======= +# 76820 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76820 "parsing/parser.ml" +||||||| 04da777f7 +# 76811 "parsing/parser.ml" +======= +# 76825 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 76184 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76830 "parsing/parser.ml" +||||||| 04da777f7 +# 76821 "parsing/parser.ml" +======= +# 76835 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 76194 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 76200 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76840 "parsing/parser.ml" +||||||| 04da777f7 +# 76831 "parsing/parser.ml" +======= +# 76845 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76846 "parsing/parser.ml" +||||||| 04da777f7 +# 76837 "parsing/parser.ml" +======= +# 76851 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 76284 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 76289 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76930 "parsing/parser.ml" +||||||| 04da777f7 +# 76921 "parsing/parser.ml" +======= +# 76935 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 76935 "parsing/parser.ml" +||||||| 04da777f7 +# 76926 "parsing/parser.ml" +======= +# 76940 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76298 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76944 "parsing/parser.ml" +||||||| 04da777f7 +# 76935 "parsing/parser.ml" +======= +# 76949 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 76307 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 76953 "parsing/parser.ml" +||||||| 04da777f7 +# 76944 "parsing/parser.ml" +======= +# 76958 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 76319 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76965 "parsing/parser.ml" +||||||| 04da777f7 +# 76956 "parsing/parser.ml" +======= +# 76970 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 76324 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 76330 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 76336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76970 "parsing/parser.ml" +||||||| 04da777f7 +# 76961 "parsing/parser.ml" +======= +# 76975 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76976 "parsing/parser.ml" +||||||| 04da777f7 +# 76967 "parsing/parser.ml" +======= +# 76981 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 76982 "parsing/parser.ml" +||||||| 04da777f7 +# 76973 "parsing/parser.ml" +======= +# 76987 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 76346 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 76352 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 76992 "parsing/parser.ml" +||||||| 04da777f7 +# 76983 "parsing/parser.ml" +======= +# 76997 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 76998 "parsing/parser.ml" +||||||| 04da777f7 +# 76989 "parsing/parser.ml" +======= +# 77003 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 76359 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77005 "parsing/parser.ml" +||||||| 04da777f7 +# 76996 "parsing/parser.ml" +======= +# 77010 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 76366 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77012 "parsing/parser.ml" +||||||| 04da777f7 +# 77003 "parsing/parser.ml" +======= +# 77017 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76375 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77021 "parsing/parser.ml" +||||||| 04da777f7 +# 77012 "parsing/parser.ml" +======= +# 77026 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 76382 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 76387 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 77028 "parsing/parser.ml" +||||||| 04da777f7 +# 77019 "parsing/parser.ml" +======= +# 77033 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77033 "parsing/parser.ml" +||||||| 04da777f7 +# 77024 "parsing/parser.ml" +======= +# 77038 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 76397 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77043 "parsing/parser.ml" +||||||| 04da777f7 +# 77034 "parsing/parser.ml" +======= +# 77048 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 76407 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 76413 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77053 "parsing/parser.ml" +||||||| 04da777f7 +# 77044 "parsing/parser.ml" +======= +# 77058 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77059 "parsing/parser.ml" +||||||| 04da777f7 +# 77050 "parsing/parser.ml" +======= +# 77064 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined2 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 76505 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 76510 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77151 "parsing/parser.ml" +||||||| 04da777f7 +# 77142 "parsing/parser.ml" +======= +# 77156 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77156 "parsing/parser.ml" +||||||| 04da777f7 +# 77147 "parsing/parser.ml" +======= +# 77161 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76519 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77165 "parsing/parser.ml" +||||||| 04da777f7 +# 77156 "parsing/parser.ml" +======= +# 77170 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 76528 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77174 "parsing/parser.ml" +||||||| 04da777f7 +# 77165 "parsing/parser.ml" +======= +# 77179 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 76540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77186 "parsing/parser.ml" +||||||| 04da777f7 +# 77177 "parsing/parser.ml" +======= +# 77191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 76545 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 76551 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 76557 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77191 "parsing/parser.ml" +||||||| 04da777f7 +# 77182 "parsing/parser.ml" +======= +# 77196 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77197 "parsing/parser.ml" +||||||| 04da777f7 +# 77188 "parsing/parser.ml" +======= +# 77202 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 77203 "parsing/parser.ml" +||||||| 04da777f7 +# 77194 "parsing/parser.ml" +======= +# 77208 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 76567 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 76573 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77213 "parsing/parser.ml" +||||||| 04da777f7 +# 77204 "parsing/parser.ml" +======= +# 77218 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77219 "parsing/parser.ml" +||||||| 04da777f7 +# 77210 "parsing/parser.ml" +======= +# 77224 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 76580 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77226 "parsing/parser.ml" +||||||| 04da777f7 +# 77217 "parsing/parser.ml" +======= +# 77231 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 76587 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77233 "parsing/parser.ml" +||||||| 04da777f7 +# 77224 "parsing/parser.ml" +======= +# 77238 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76596 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77242 "parsing/parser.ml" +||||||| 04da777f7 +# 77233 "parsing/parser.ml" +======= +# 77247 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 76603 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 76608 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 77249 "parsing/parser.ml" +||||||| 04da777f7 +# 77240 "parsing/parser.ml" +======= +# 77254 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77254 "parsing/parser.ml" +||||||| 04da777f7 +# 77245 "parsing/parser.ml" +======= +# 77259 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 76618 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77264 "parsing/parser.ml" +||||||| 04da777f7 +# 77255 "parsing/parser.ml" +======= +# 77269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 76628 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 76634 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77274 "parsing/parser.ml" +||||||| 04da777f7 +# 77265 "parsing/parser.ml" +======= +# 77279 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77280 "parsing/parser.ml" +||||||| 04da777f7 +# 77271 "parsing/parser.ml" +======= +# 77285 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 76726 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77372 "parsing/parser.ml" +||||||| 04da777f7 +# 77363 "parsing/parser.ml" +======= +# 77377 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 76736 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 76742 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 77382 "parsing/parser.ml" +||||||| 04da777f7 +# 77373 "parsing/parser.ml" +======= +# 77387 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77388 "parsing/parser.ml" +||||||| 04da777f7 +# 77379 "parsing/parser.ml" +======= +# 77393 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76752 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77398 "parsing/parser.ml" +||||||| 04da777f7 +# 77389 "parsing/parser.ml" +======= +# 77403 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 76761 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77407 "parsing/parser.ml" +||||||| 04da777f7 +# 77398 "parsing/parser.ml" +======= +# 77412 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 76773 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77419 "parsing/parser.ml" +||||||| 04da777f7 +# 77410 "parsing/parser.ml" +======= +# 77424 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 76778 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 76784 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 76790 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77424 "parsing/parser.ml" +||||||| 04da777f7 +# 77415 "parsing/parser.ml" +======= +# 77429 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77430 "parsing/parser.ml" +||||||| 04da777f7 +# 77421 "parsing/parser.ml" +======= +# 77435 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 77436 "parsing/parser.ml" +||||||| 04da777f7 +# 77427 "parsing/parser.ml" +======= +# 77441 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 76800 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 76806 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77446 "parsing/parser.ml" +||||||| 04da777f7 +# 77437 "parsing/parser.ml" +======= +# 77451 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77452 "parsing/parser.ml" +||||||| 04da777f7 +# 77443 "parsing/parser.ml" +======= +# 77457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 76813 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77459 "parsing/parser.ml" +||||||| 04da777f7 +# 77450 "parsing/parser.ml" +======= +# 77464 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 76820 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77466 "parsing/parser.ml" +||||||| 04da777f7 +# 77457 "parsing/parser.ml" +======= +# 77471 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76829 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77475 "parsing/parser.ml" +||||||| 04da777f7 +# 77466 "parsing/parser.ml" +======= +# 77480 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 76836 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 76841 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 77482 "parsing/parser.ml" +||||||| 04da777f7 +# 77473 "parsing/parser.ml" +======= +# 77487 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77487 "parsing/parser.ml" +||||||| 04da777f7 +# 77478 "parsing/parser.ml" +======= +# 77492 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 76851 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77497 "parsing/parser.ml" +||||||| 04da777f7 +# 77488 "parsing/parser.ml" +======= +# 77502 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 76861 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 76867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77507 "parsing/parser.ml" +||||||| 04da777f7 +# 77498 "parsing/parser.ml" +======= +# 77512 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77513 "parsing/parser.ml" +||||||| 04da777f7 +# 77504 "parsing/parser.ml" +======= +# 77518 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 76968 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77614 "parsing/parser.ml" +||||||| 04da777f7 +# 77605 "parsing/parser.ml" +======= +# 77619 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 76979 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 76985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 77625 "parsing/parser.ml" +||||||| 04da777f7 +# 77616 "parsing/parser.ml" +======= +# 77630 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77631 "parsing/parser.ml" +||||||| 04da777f7 +# 77622 "parsing/parser.ml" +======= +# 77636 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 76995 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77641 "parsing/parser.ml" +||||||| 04da777f7 +# 77632 "parsing/parser.ml" +======= +# 77646 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 77004 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77650 "parsing/parser.ml" +||||||| 04da777f7 +# 77641 "parsing/parser.ml" +======= +# 77655 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 77016 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77662 "parsing/parser.ml" +||||||| 04da777f7 +# 77653 "parsing/parser.ml" +======= +# 77667 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 77021 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 77027 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 77033 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77667 "parsing/parser.ml" +||||||| 04da777f7 +# 77658 "parsing/parser.ml" +======= +# 77672 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77673 "parsing/parser.ml" +||||||| 04da777f7 +# 77664 "parsing/parser.ml" +======= +# 77678 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 77679 "parsing/parser.ml" +||||||| 04da777f7 +# 77670 "parsing/parser.ml" +======= +# 77684 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 77043 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 77049 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77689 "parsing/parser.ml" +||||||| 04da777f7 +# 77680 "parsing/parser.ml" +======= +# 77694 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77695 "parsing/parser.ml" +||||||| 04da777f7 +# 77686 "parsing/parser.ml" +======= +# 77700 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 77056 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77702 "parsing/parser.ml" +||||||| 04da777f7 +# 77693 "parsing/parser.ml" +======= +# 77707 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77063 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77709 "parsing/parser.ml" +||||||| 04da777f7 +# 77700 "parsing/parser.ml" +======= +# 77714 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77072 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77718 "parsing/parser.ml" +||||||| 04da777f7 +# 77709 "parsing/parser.ml" +======= +# 77723 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 77079 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 77084 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 77725 "parsing/parser.ml" +||||||| 04da777f7 +# 77716 "parsing/parser.ml" +======= +# 77730 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77730 "parsing/parser.ml" +||||||| 04da777f7 +# 77721 "parsing/parser.ml" +======= +# 77735 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 77094 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77740 "parsing/parser.ml" +||||||| 04da777f7 +# 77731 "parsing/parser.ml" +======= +# 77745 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 77104 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 77110 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77750 "parsing/parser.ml" +||||||| 04da777f7 +# 77741 "parsing/parser.ml" +======= +# 77755 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77756 "parsing/parser.ml" +||||||| 04da777f7 +# 77747 "parsing/parser.ml" +======= +# 77761 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 77160 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77165 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77806 "parsing/parser.ml" +||||||| 04da777f7 +# 77797 "parsing/parser.ml" +======= +# 77811 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77811 "parsing/parser.ml" +||||||| 04da777f7 +# 77802 "parsing/parser.ml" +======= +# 77816 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77174 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77820 "parsing/parser.ml" +||||||| 04da777f7 +# 77811 "parsing/parser.ml" +======= +# 77825 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 77181 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 77187 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77827 "parsing/parser.ml" +||||||| 04da777f7 +# 77818 "parsing/parser.ml" +======= +# 77832 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 77833 "parsing/parser.ml" +||||||| 04da777f7 +# 77824 "parsing/parser.ml" +======= +# 77838 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 77193 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77199 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 77839 "parsing/parser.ml" +||||||| 04da777f7 +# 77830 "parsing/parser.ml" +======= +# 77844 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77845 "parsing/parser.ml" +||||||| 04da777f7 +# 77836 "parsing/parser.ml" +======= +# 77850 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77208 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77854 "parsing/parser.ml" +||||||| 04da777f7 +# 77845 "parsing/parser.ml" +======= +# 77859 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 77215 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 77220 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 77861 "parsing/parser.ml" +||||||| 04da777f7 +# 77852 "parsing/parser.ml" +======= +# 77866 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77866 "parsing/parser.ml" +||||||| 04da777f7 +# 77857 "parsing/parser.ml" +======= +# 77871 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 77230 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77876 "parsing/parser.ml" +||||||| 04da777f7 +# 77867 "parsing/parser.ml" +======= +# 77881 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 77240 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 77246 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77886 "parsing/parser.ml" +||||||| 04da777f7 +# 77877 "parsing/parser.ml" +======= +# 77891 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 77892 "parsing/parser.ml" +||||||| 04da777f7 +# 77883 "parsing/parser.ml" +======= +# 77897 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1 : (Mode.t) = Obj.magic _1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 77303 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77308 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 77949 "parsing/parser.ml" +||||||| 04da777f7 +# 77940 "parsing/parser.ml" +======= +# 77954 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77954 "parsing/parser.ml" +||||||| 04da777f7 +# 77945 "parsing/parser.ml" +======= +# 77959 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77317 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77963 "parsing/parser.ml" +||||||| 04da777f7 +# 77954 "parsing/parser.ml" +======= +# 77968 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 77324 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 77330 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77970 "parsing/parser.ml" +||||||| 04da777f7 +# 77961 "parsing/parser.ml" +======= +# 77975 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 77976 "parsing/parser.ml" +||||||| 04da777f7 +# 77967 "parsing/parser.ml" +======= +# 77981 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 77336 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77342 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 77982 "parsing/parser.ml" +||||||| 04da777f7 +# 77973 "parsing/parser.ml" +======= +# 77987 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 77988 "parsing/parser.ml" +||||||| 04da777f7 +# 77979 "parsing/parser.ml" +======= +# 77993 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77351 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 77997 "parsing/parser.ml" +||||||| 04da777f7 +# 77988 "parsing/parser.ml" +======= +# 78002 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 77358 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 77363 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 78004 "parsing/parser.ml" +||||||| 04da777f7 +# 77995 "parsing/parser.ml" +======= +# 78009 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78009 "parsing/parser.ml" +||||||| 04da777f7 +# 78000 "parsing/parser.ml" +======= +# 78014 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 77373 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78019 "parsing/parser.ml" +||||||| 04da777f7 +# 78010 "parsing/parser.ml" +======= +# 78024 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__1_ = _startpos_label_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 77383 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 77389 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78029 "parsing/parser.ml" +||||||| 04da777f7 +# 78020 "parsing/parser.ml" +======= +# 78034 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78035 "parsing/parser.ml" +||||||| 04da777f7 +# 78026 "parsing/parser.ml" +======= +# 78040 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 77446 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78092 "parsing/parser.ml" +||||||| 04da777f7 +# 78083 "parsing/parser.ml" +======= +# 78097 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 77456 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 77462 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 78102 "parsing/parser.ml" +||||||| 04da777f7 +# 78093 "parsing/parser.ml" +======= +# 78107 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78108 "parsing/parser.ml" +||||||| 04da777f7 +# 78099 "parsing/parser.ml" +======= +# 78113 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78118 "parsing/parser.ml" +||||||| 04da777f7 +# 78109 "parsing/parser.ml" +======= +# 78123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 77479 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 77485 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78125 "parsing/parser.ml" +||||||| 04da777f7 +# 78116 "parsing/parser.ml" +======= +# 78130 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 78131 "parsing/parser.ml" +||||||| 04da777f7 +# 78122 "parsing/parser.ml" +======= +# 78136 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 77491 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77497 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 78137 "parsing/parser.ml" +||||||| 04da777f7 +# 78128 "parsing/parser.ml" +======= +# 78142 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78143 "parsing/parser.ml" +||||||| 04da777f7 +# 78134 "parsing/parser.ml" +======= +# 78148 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77506 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78152 "parsing/parser.ml" +||||||| 04da777f7 +# 78143 "parsing/parser.ml" +======= +# 78157 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 77513 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 77518 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 78159 "parsing/parser.ml" +||||||| 04da777f7 +# 78150 "parsing/parser.ml" +======= +# 78164 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78164 "parsing/parser.ml" +||||||| 04da777f7 +# 78155 "parsing/parser.ml" +======= +# 78169 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 77528 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78174 "parsing/parser.ml" +||||||| 04da777f7 +# 78165 "parsing/parser.ml" +======= +# 78179 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 77538 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 77544 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78184 "parsing/parser.ml" +||||||| 04da777f7 +# 78175 "parsing/parser.ml" +======= +# 78189 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78190 "parsing/parser.ml" +||||||| 04da777f7 +# 78181 "parsing/parser.ml" +======= +# 78195 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 77610 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78256 "parsing/parser.ml" +||||||| 04da777f7 +# 78247 "parsing/parser.ml" +======= +# 78261 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 77621 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 77627 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 78267 "parsing/parser.ml" +||||||| 04da777f7 +# 78258 "parsing/parser.ml" +======= +# 78272 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78273 "parsing/parser.ml" +||||||| 04da777f7 +# 78264 "parsing/parser.ml" +======= +# 78278 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77637 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78283 "parsing/parser.ml" +||||||| 04da777f7 +# 78274 "parsing/parser.ml" +======= +# 78288 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 77644 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 77650 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78290 "parsing/parser.ml" +||||||| 04da777f7 +# 78281 "parsing/parser.ml" +======= +# 78295 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 78296 "parsing/parser.ml" +||||||| 04da777f7 +# 78287 "parsing/parser.ml" +======= +# 78301 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 77656 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77662 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 78302 "parsing/parser.ml" +||||||| 04da777f7 +# 78293 "parsing/parser.ml" +======= +# 78307 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78308 "parsing/parser.ml" +||||||| 04da777f7 +# 78299 "parsing/parser.ml" +======= +# 78313 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77671 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78317 "parsing/parser.ml" +||||||| 04da777f7 +# 78308 "parsing/parser.ml" +======= +# 78322 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 77678 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 77683 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 78324 "parsing/parser.ml" +||||||| 04da777f7 +# 78315 "parsing/parser.ml" +======= +# 78329 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78329 "parsing/parser.ml" +||||||| 04da777f7 +# 78320 "parsing/parser.ml" +======= +# 78334 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 77693 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78339 "parsing/parser.ml" +||||||| 04da777f7 +# 78330 "parsing/parser.ml" +======= +# 78344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 77703 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 77709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78349 "parsing/parser.ml" +||||||| 04da777f7 +# 78340 "parsing/parser.ml" +======= +# 78354 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78355 "parsing/parser.ml" +||||||| 04da777f7 +# 78346 "parsing/parser.ml" +======= +# 78360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 77766 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77771 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78412 "parsing/parser.ml" +||||||| 04da777f7 +# 78403 "parsing/parser.ml" +======= +# 78417 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78417 "parsing/parser.ml" +||||||| 04da777f7 +# 78408 "parsing/parser.ml" +======= +# 78422 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77780 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78426 "parsing/parser.ml" +||||||| 04da777f7 +# 78417 "parsing/parser.ml" +======= +# 78431 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 77787 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 77793 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78433 "parsing/parser.ml" +||||||| 04da777f7 +# 78424 "parsing/parser.ml" +======= +# 78438 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 78439 "parsing/parser.ml" +||||||| 04da777f7 +# 78430 "parsing/parser.ml" +======= +# 78444 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 77799 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77805 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 78445 "parsing/parser.ml" +||||||| 04da777f7 +# 78436 "parsing/parser.ml" +======= +# 78450 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78451 "parsing/parser.ml" +||||||| 04da777f7 +# 78442 "parsing/parser.ml" +======= +# 78456 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77814 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78460 "parsing/parser.ml" +||||||| 04da777f7 +# 78451 "parsing/parser.ml" +======= +# 78465 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 77821 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 77826 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 78467 "parsing/parser.ml" +||||||| 04da777f7 +# 78458 "parsing/parser.ml" +======= +# 78472 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78472 "parsing/parser.ml" +||||||| 04da777f7 +# 78463 "parsing/parser.ml" +======= +# 78477 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 77836 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78482 "parsing/parser.ml" +||||||| 04da777f7 +# 78473 "parsing/parser.ml" +======= +# 78487 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 77846 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 77852 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78492 "parsing/parser.ml" +||||||| 04da777f7 +# 78483 "parsing/parser.ml" +======= +# 78497 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78498 "parsing/parser.ml" +||||||| 04da777f7 +# 78489 "parsing/parser.ml" +======= +# 78503 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 77916 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77921 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78562 "parsing/parser.ml" +||||||| 04da777f7 +# 78553 "parsing/parser.ml" +======= +# 78567 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78567 "parsing/parser.ml" +||||||| 04da777f7 +# 78558 "parsing/parser.ml" +======= +# 78572 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77930 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78576 "parsing/parser.ml" +||||||| 04da777f7 +# 78567 "parsing/parser.ml" +======= +# 78581 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 77937 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 77943 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78583 "parsing/parser.ml" +||||||| 04da777f7 +# 78574 "parsing/parser.ml" +======= +# 78588 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 78589 "parsing/parser.ml" +||||||| 04da777f7 +# 78580 "parsing/parser.ml" +======= +# 78594 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 77949 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 77955 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 78595 "parsing/parser.ml" +||||||| 04da777f7 +# 78586 "parsing/parser.ml" +======= +# 78600 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78601 "parsing/parser.ml" +||||||| 04da777f7 +# 78592 "parsing/parser.ml" +======= +# 78606 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 77964 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78610 "parsing/parser.ml" +||||||| 04da777f7 +# 78601 "parsing/parser.ml" +======= +# 78615 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 77971 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 77976 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 78617 "parsing/parser.ml" +||||||| 04da777f7 +# 78608 "parsing/parser.ml" +======= +# 78622 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78622 "parsing/parser.ml" +||||||| 04da777f7 +# 78613 "parsing/parser.ml" +======= +# 78627 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 77986 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78632 "parsing/parser.ml" +||||||| 04da777f7 +# 78623 "parsing/parser.ml" +======= +# 78637 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 77996 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 78002 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78642 "parsing/parser.ml" +||||||| 04da777f7 +# 78633 "parsing/parser.ml" +======= +# 78647 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78648 "parsing/parser.ml" +||||||| 04da777f7 +# 78639 "parsing/parser.ml" +======= +# 78653 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 78066 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78712 "parsing/parser.ml" +||||||| 04da777f7 +# 78703 "parsing/parser.ml" +======= +# 78717 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 78076 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 78082 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 78722 "parsing/parser.ml" +||||||| 04da777f7 +# 78713 "parsing/parser.ml" +======= +# 78727 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78728 "parsing/parser.ml" +||||||| 04da777f7 +# 78719 "parsing/parser.ml" +======= +# 78733 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78092 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78738 "parsing/parser.ml" +||||||| 04da777f7 +# 78729 "parsing/parser.ml" +======= +# 78743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 78099 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 78105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78745 "parsing/parser.ml" +||||||| 04da777f7 +# 78736 "parsing/parser.ml" +======= +# 78750 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 78751 "parsing/parser.ml" +||||||| 04da777f7 +# 78742 "parsing/parser.ml" +======= +# 78756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 78111 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 78117 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 78757 "parsing/parser.ml" +||||||| 04da777f7 +# 78748 "parsing/parser.ml" +======= +# 78762 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78763 "parsing/parser.ml" +||||||| 04da777f7 +# 78754 "parsing/parser.ml" +======= +# 78768 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78126 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78772 "parsing/parser.ml" +||||||| 04da777f7 +# 78763 "parsing/parser.ml" +======= +# 78777 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 78133 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 78138 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 78779 "parsing/parser.ml" +||||||| 04da777f7 +# 78770 "parsing/parser.ml" +======= +# 78784 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78784 "parsing/parser.ml" +||||||| 04da777f7 +# 78775 "parsing/parser.ml" +======= +# 78789 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 78148 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78794 "parsing/parser.ml" +||||||| 04da777f7 +# 78785 "parsing/parser.ml" +======= +# 78799 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 78158 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 78164 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78804 "parsing/parser.ml" +||||||| 04da777f7 +# 78795 "parsing/parser.ml" +======= +# 78809 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78810 "parsing/parser.ml" +||||||| 04da777f7 +# 78801 "parsing/parser.ml" +======= +# 78815 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 78237 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78883 "parsing/parser.ml" +||||||| 04da777f7 +# 78874 "parsing/parser.ml" +======= +# 78888 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 78248 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 78254 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 78894 "parsing/parser.ml" +||||||| 04da777f7 +# 78885 "parsing/parser.ml" +======= +# 78899 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78900 "parsing/parser.ml" +||||||| 04da777f7 +# 78891 "parsing/parser.ml" +======= +# 78905 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78264 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78910 "parsing/parser.ml" +||||||| 04da777f7 +# 78901 "parsing/parser.ml" +======= +# 78915 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 78271 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 78277 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 78917 "parsing/parser.ml" +||||||| 04da777f7 +# 78908 "parsing/parser.ml" +======= +# 78922 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 78923 "parsing/parser.ml" +||||||| 04da777f7 +# 78914 "parsing/parser.ml" +======= +# 78928 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 78283 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 78289 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 78929 "parsing/parser.ml" +||||||| 04da777f7 +# 78920 "parsing/parser.ml" +======= +# 78934 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 78935 "parsing/parser.ml" +||||||| 04da777f7 +# 78926 "parsing/parser.ml" +======= +# 78940 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78298 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78944 "parsing/parser.ml" +||||||| 04da777f7 +# 78935 "parsing/parser.ml" +======= +# 78949 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 78305 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 78310 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 78951 "parsing/parser.ml" +||||||| 04da777f7 +# 78942 "parsing/parser.ml" +======= +# 78956 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78956 "parsing/parser.ml" +||||||| 04da777f7 +# 78947 "parsing/parser.ml" +======= +# 78961 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 78320 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78966 "parsing/parser.ml" +||||||| 04da777f7 +# 78957 "parsing/parser.ml" +======= +# 78971 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 78330 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 78336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 78976 "parsing/parser.ml" +||||||| 04da777f7 +# 78967 "parsing/parser.ml" +======= +# 78981 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 78982 "parsing/parser.ml" +||||||| 04da777f7 +# 78973 "parsing/parser.ml" +======= +# 78987 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 78420 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 78425 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79066 "parsing/parser.ml" +||||||| 04da777f7 +# 79057 "parsing/parser.ml" +======= +# 79071 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79071 "parsing/parser.ml" +||||||| 04da777f7 +# 79062 "parsing/parser.ml" +======= +# 79076 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78434 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79080 "parsing/parser.ml" +||||||| 04da777f7 +# 79071 "parsing/parser.ml" +======= +# 79085 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 78441 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79087 "parsing/parser.ml" +||||||| 04da777f7 +# 79078 "parsing/parser.ml" +======= +# 79092 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 78453 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79099 "parsing/parser.ml" +||||||| 04da777f7 +# 79090 "parsing/parser.ml" +======= +# 79104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 78458 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 78464 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 78470 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79104 "parsing/parser.ml" +||||||| 04da777f7 +# 79095 "parsing/parser.ml" +======= +# 79109 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79110 "parsing/parser.ml" +||||||| 04da777f7 +# 79101 "parsing/parser.ml" +======= +# 79115 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 79116 "parsing/parser.ml" +||||||| 04da777f7 +# 79107 "parsing/parser.ml" +======= +# 79121 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 78480 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 78486 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79126 "parsing/parser.ml" +||||||| 04da777f7 +# 79117 "parsing/parser.ml" +======= +# 79131 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79132 "parsing/parser.ml" +||||||| 04da777f7 +# 79123 "parsing/parser.ml" +======= +# 79137 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 78493 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79139 "parsing/parser.ml" +||||||| 04da777f7 +# 79130 "parsing/parser.ml" +======= +# 79144 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 78505 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 78511 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 79151 "parsing/parser.ml" +||||||| 04da777f7 +# 79142 "parsing/parser.ml" +======= +# 79156 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79157 "parsing/parser.ml" +||||||| 04da777f7 +# 79148 "parsing/parser.ml" +======= +# 79162 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78521 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79167 "parsing/parser.ml" +||||||| 04da777f7 +# 79158 "parsing/parser.ml" +======= +# 79172 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 78528 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 78533 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 79174 "parsing/parser.ml" +||||||| 04da777f7 +# 79165 "parsing/parser.ml" +======= +# 79179 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79179 "parsing/parser.ml" +||||||| 04da777f7 +# 79170 "parsing/parser.ml" +======= +# 79184 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 78543 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79189 "parsing/parser.ml" +||||||| 04da777f7 +# 79180 "parsing/parser.ml" +======= +# 79194 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 78553 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 78559 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79199 "parsing/parser.ml" +||||||| 04da777f7 +# 79190 "parsing/parser.ml" +======= +# 79204 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79205 "parsing/parser.ml" +||||||| 04da777f7 +# 79196 "parsing/parser.ml" +======= +# 79210 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined2 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 78651 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 78656 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79297 "parsing/parser.ml" +||||||| 04da777f7 +# 79288 "parsing/parser.ml" +======= +# 79302 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79302 "parsing/parser.ml" +||||||| 04da777f7 +# 79293 "parsing/parser.ml" +======= +# 79307 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78665 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79311 "parsing/parser.ml" +||||||| 04da777f7 +# 79302 "parsing/parser.ml" +======= +# 79316 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 78672 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79318 "parsing/parser.ml" +||||||| 04da777f7 +# 79309 "parsing/parser.ml" +======= +# 79323 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 78684 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79330 "parsing/parser.ml" +||||||| 04da777f7 +# 79321 "parsing/parser.ml" +======= +# 79335 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 78689 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 78695 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 78701 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79335 "parsing/parser.ml" +||||||| 04da777f7 +# 79326 "parsing/parser.ml" +======= +# 79340 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79341 "parsing/parser.ml" +||||||| 04da777f7 +# 79332 "parsing/parser.ml" +======= +# 79346 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 79347 "parsing/parser.ml" +||||||| 04da777f7 +# 79338 "parsing/parser.ml" +======= +# 79352 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 78711 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 78717 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79357 "parsing/parser.ml" +||||||| 04da777f7 +# 79348 "parsing/parser.ml" +======= +# 79362 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79363 "parsing/parser.ml" +||||||| 04da777f7 +# 79354 "parsing/parser.ml" +======= +# 79368 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 78724 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79370 "parsing/parser.ml" +||||||| 04da777f7 +# 79361 "parsing/parser.ml" +======= +# 79375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 78736 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 78742 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 79382 "parsing/parser.ml" +||||||| 04da777f7 +# 79373 "parsing/parser.ml" +======= +# 79387 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79388 "parsing/parser.ml" +||||||| 04da777f7 +# 79379 "parsing/parser.ml" +======= +# 79393 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78752 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79398 "parsing/parser.ml" +||||||| 04da777f7 +# 79389 "parsing/parser.ml" +======= +# 79403 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 78759 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 78764 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 79405 "parsing/parser.ml" +||||||| 04da777f7 +# 79396 "parsing/parser.ml" +======= +# 79410 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79410 "parsing/parser.ml" +||||||| 04da777f7 +# 79401 "parsing/parser.ml" +======= +# 79415 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 78774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79420 "parsing/parser.ml" +||||||| 04da777f7 +# 79411 "parsing/parser.ml" +======= +# 79425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 78784 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 78790 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79430 "parsing/parser.ml" +||||||| 04da777f7 +# 79421 "parsing/parser.ml" +======= +# 79435 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79436 "parsing/parser.ml" +||||||| 04da777f7 +# 79427 "parsing/parser.ml" +======= +# 79441 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 78882 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79528 "parsing/parser.ml" +||||||| 04da777f7 +# 79519 "parsing/parser.ml" +======= +# 79533 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 78892 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 78898 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 79538 "parsing/parser.ml" +||||||| 04da777f7 +# 79529 "parsing/parser.ml" +======= +# 79543 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79544 "parsing/parser.ml" +||||||| 04da777f7 +# 79535 "parsing/parser.ml" +======= +# 79549 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78908 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79554 "parsing/parser.ml" +||||||| 04da777f7 +# 79545 "parsing/parser.ml" +======= +# 79559 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 78915 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79561 "parsing/parser.ml" +||||||| 04da777f7 +# 79552 "parsing/parser.ml" +======= +# 79566 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 78927 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79573 "parsing/parser.ml" +||||||| 04da777f7 +# 79564 "parsing/parser.ml" +======= +# 79578 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 78932 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 78938 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 78944 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79578 "parsing/parser.ml" +||||||| 04da777f7 +# 79569 "parsing/parser.ml" +======= +# 79583 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79584 "parsing/parser.ml" +||||||| 04da777f7 +# 79575 "parsing/parser.ml" +======= +# 79589 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 79590 "parsing/parser.ml" +||||||| 04da777f7 +# 79581 "parsing/parser.ml" +======= +# 79595 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 78954 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 78960 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79600 "parsing/parser.ml" +||||||| 04da777f7 +# 79591 "parsing/parser.ml" +======= +# 79605 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79606 "parsing/parser.ml" +||||||| 04da777f7 +# 79597 "parsing/parser.ml" +======= +# 79611 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 78967 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79613 "parsing/parser.ml" +||||||| 04da777f7 +# 79604 "parsing/parser.ml" +======= +# 79618 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 78979 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 78985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 79625 "parsing/parser.ml" +||||||| 04da777f7 +# 79616 "parsing/parser.ml" +======= +# 79630 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79631 "parsing/parser.ml" +||||||| 04da777f7 +# 79622 "parsing/parser.ml" +======= +# 79636 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 78995 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79641 "parsing/parser.ml" +||||||| 04da777f7 +# 79632 "parsing/parser.ml" +======= +# 79646 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 79002 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 79007 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 79648 "parsing/parser.ml" +||||||| 04da777f7 +# 79639 "parsing/parser.ml" +======= +# 79653 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79653 "parsing/parser.ml" +||||||| 04da777f7 +# 79644 "parsing/parser.ml" +======= +# 79658 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 79017 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79663 "parsing/parser.ml" +||||||| 04da777f7 +# 79654 "parsing/parser.ml" +======= +# 79668 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 79027 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 79033 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79673 "parsing/parser.ml" +||||||| 04da777f7 +# 79664 "parsing/parser.ml" +======= +# 79678 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79679 "parsing/parser.ml" +||||||| 04da777f7 +# 79670 "parsing/parser.ml" +======= +# 79684 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 79134 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79780 "parsing/parser.ml" +||||||| 04da777f7 +# 79771 "parsing/parser.ml" +======= +# 79785 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 79145 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 79151 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 79791 "parsing/parser.ml" +||||||| 04da777f7 +# 79782 "parsing/parser.ml" +======= +# 79796 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79797 "parsing/parser.ml" +||||||| 04da777f7 +# 79788 "parsing/parser.ml" +======= +# 79802 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79161 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79807 "parsing/parser.ml" +||||||| 04da777f7 +# 79798 "parsing/parser.ml" +======= +# 79812 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 79168 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 79814 "parsing/parser.ml" +||||||| 04da777f7 +# 79805 "parsing/parser.ml" +======= +# 79819 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 79180 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79826 "parsing/parser.ml" +||||||| 04da777f7 +# 79817 "parsing/parser.ml" +======= +# 79831 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 79185 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 79191 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 79197 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79831 "parsing/parser.ml" +||||||| 04da777f7 +# 79822 "parsing/parser.ml" +======= +# 79836 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79837 "parsing/parser.ml" +||||||| 04da777f7 +# 79828 "parsing/parser.ml" +======= +# 79842 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 79843 "parsing/parser.ml" +||||||| 04da777f7 +# 79834 "parsing/parser.ml" +======= +# 79848 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 79207 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 79213 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79853 "parsing/parser.ml" +||||||| 04da777f7 +# 79844 "parsing/parser.ml" +======= +# 79858 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79859 "parsing/parser.ml" +||||||| 04da777f7 +# 79850 "parsing/parser.ml" +======= +# 79864 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 79220 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79866 "parsing/parser.ml" +||||||| 04da777f7 +# 79857 "parsing/parser.ml" +======= +# 79871 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 79232 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 79238 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 79878 "parsing/parser.ml" +||||||| 04da777f7 +# 79869 "parsing/parser.ml" +======= +# 79883 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 79884 "parsing/parser.ml" +||||||| 04da777f7 +# 79875 "parsing/parser.ml" +======= +# 79889 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79248 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79894 "parsing/parser.ml" +||||||| 04da777f7 +# 79885 "parsing/parser.ml" +======= +# 79899 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 79255 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 79260 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 79901 "parsing/parser.ml" +||||||| 04da777f7 +# 79892 "parsing/parser.ml" +======= +# 79906 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79906 "parsing/parser.ml" +||||||| 04da777f7 +# 79897 "parsing/parser.ml" +======= +# 79911 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 79270 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79916 "parsing/parser.ml" +||||||| 04da777f7 +# 79907 "parsing/parser.ml" +======= +# 79921 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 79280 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 79286 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 79926 "parsing/parser.ml" +||||||| 04da777f7 +# 79917 "parsing/parser.ml" +======= +# 79931 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 79932 "parsing/parser.ml" +||||||| 04da777f7 +# 79923 "parsing/parser.ml" +======= +# 79937 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 79377 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 79382 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 80023 "parsing/parser.ml" +||||||| 04da777f7 +# 80014 "parsing/parser.ml" +======= +# 80028 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 80028 "parsing/parser.ml" +||||||| 04da777f7 +# 80019 "parsing/parser.ml" +======= +# 80033 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79391 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80037 "parsing/parser.ml" +||||||| 04da777f7 +# 80028 "parsing/parser.ml" +======= +# 80042 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 79400 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80046 "parsing/parser.ml" +||||||| 04da777f7 +# 80037 "parsing/parser.ml" +======= +# 80051 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 79413 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80059 "parsing/parser.ml" +||||||| 04da777f7 +# 80050 "parsing/parser.ml" +======= +# 80064 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 79418 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 79424 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 79430 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80064 "parsing/parser.ml" +||||||| 04da777f7 +# 80055 "parsing/parser.ml" +======= +# 80069 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80070 "parsing/parser.ml" +||||||| 04da777f7 +# 80061 "parsing/parser.ml" +======= +# 80075 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 80076 "parsing/parser.ml" +||||||| 04da777f7 +# 80067 "parsing/parser.ml" +======= +# 80081 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 79440 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 79446 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80086 "parsing/parser.ml" +||||||| 04da777f7 +# 80077 "parsing/parser.ml" +======= +# 80091 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80092 "parsing/parser.ml" +||||||| 04da777f7 +# 80083 "parsing/parser.ml" +======= +# 80097 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 79453 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80099 "parsing/parser.ml" +||||||| 04da777f7 +# 80090 "parsing/parser.ml" +======= +# 80104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 79465 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 79471 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 80111 "parsing/parser.ml" +||||||| 04da777f7 +# 80102 "parsing/parser.ml" +======= +# 80116 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80117 "parsing/parser.ml" +||||||| 04da777f7 +# 80108 "parsing/parser.ml" +======= +# 80122 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79481 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80127 "parsing/parser.ml" +||||||| 04da777f7 +# 80118 "parsing/parser.ml" +======= +# 80132 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 79488 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 79493 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 80134 "parsing/parser.ml" +||||||| 04da777f7 +# 80125 "parsing/parser.ml" +======= +# 80139 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80139 "parsing/parser.ml" +||||||| 04da777f7 +# 80130 "parsing/parser.ml" +======= +# 80144 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 79503 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80149 "parsing/parser.ml" +||||||| 04da777f7 +# 80140 "parsing/parser.ml" +======= +# 80154 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 79513 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 79519 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80159 "parsing/parser.ml" +||||||| 04da777f7 +# 80150 "parsing/parser.ml" +======= +# 80164 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80165 "parsing/parser.ml" +||||||| 04da777f7 +# 80156 "parsing/parser.ml" +======= +# 80170 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined3 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 79618 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 79623 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80264 "parsing/parser.ml" +||||||| 04da777f7 +# 80255 "parsing/parser.ml" +======= +# 80269 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 80269 "parsing/parser.ml" +||||||| 04da777f7 +# 80260 "parsing/parser.ml" +======= +# 80274 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79632 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80278 "parsing/parser.ml" +||||||| 04da777f7 +# 80269 "parsing/parser.ml" +======= +# 80283 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 79641 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80287 "parsing/parser.ml" +||||||| 04da777f7 +# 80278 "parsing/parser.ml" +======= +# 80292 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 79654 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80300 "parsing/parser.ml" +||||||| 04da777f7 +# 80291 "parsing/parser.ml" +======= +# 80305 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 79659 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 79665 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 79671 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80305 "parsing/parser.ml" +||||||| 04da777f7 +# 80296 "parsing/parser.ml" +======= +# 80310 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80311 "parsing/parser.ml" +||||||| 04da777f7 +# 80302 "parsing/parser.ml" +======= +# 80316 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 80317 "parsing/parser.ml" +||||||| 04da777f7 +# 80308 "parsing/parser.ml" +======= +# 80322 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 79681 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 79687 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80327 "parsing/parser.ml" +||||||| 04da777f7 +# 80318 "parsing/parser.ml" +======= +# 80332 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80333 "parsing/parser.ml" +||||||| 04da777f7 +# 80324 "parsing/parser.ml" +======= +# 80338 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 79694 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80340 "parsing/parser.ml" +||||||| 04da777f7 +# 80331 "parsing/parser.ml" +======= +# 80345 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 79706 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 79712 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 80352 "parsing/parser.ml" +||||||| 04da777f7 +# 80343 "parsing/parser.ml" +======= +# 80357 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80358 "parsing/parser.ml" +||||||| 04da777f7 +# 80349 "parsing/parser.ml" +======= +# 80363 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79722 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80368 "parsing/parser.ml" +||||||| 04da777f7 +# 80359 "parsing/parser.ml" +======= +# 80373 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 79729 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 79734 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 80375 "parsing/parser.ml" +||||||| 04da777f7 +# 80366 "parsing/parser.ml" +======= +# 80380 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80380 "parsing/parser.ml" +||||||| 04da777f7 +# 80371 "parsing/parser.ml" +======= +# 80385 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 79744 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80390 "parsing/parser.ml" +||||||| 04da777f7 +# 80381 "parsing/parser.ml" +======= +# 80395 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 79754 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 79760 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80400 "parsing/parser.ml" +||||||| 04da777f7 +# 80391 "parsing/parser.ml" +======= +# 80405 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80406 "parsing/parser.ml" +||||||| 04da777f7 +# 80397 "parsing/parser.ml" +======= +# 80411 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined3 : (Mode.Const.t list) = Obj.magic _1_inlined3 in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 79859 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 80505 "parsing/parser.ml" +||||||| 04da777f7 +# 80496 "parsing/parser.ml" +======= +# 80510 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 79869 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 79875 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 80515 "parsing/parser.ml" +||||||| 04da777f7 +# 80506 "parsing/parser.ml" +======= +# 80520 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80521 "parsing/parser.ml" +||||||| 04da777f7 +# 80512 "parsing/parser.ml" +======= +# 80526 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79885 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80531 "parsing/parser.ml" +||||||| 04da777f7 +# 80522 "parsing/parser.ml" +======= +# 80536 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 79894 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80540 "parsing/parser.ml" +||||||| 04da777f7 +# 80531 "parsing/parser.ml" +======= +# 80545 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 79907 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80553 "parsing/parser.ml" +||||||| 04da777f7 +# 80544 "parsing/parser.ml" +======= +# 80558 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 79912 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 79918 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 79924 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80558 "parsing/parser.ml" +||||||| 04da777f7 +# 80549 "parsing/parser.ml" +======= +# 80563 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80564 "parsing/parser.ml" +||||||| 04da777f7 +# 80555 "parsing/parser.ml" +======= +# 80569 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 80570 "parsing/parser.ml" +||||||| 04da777f7 +# 80561 "parsing/parser.ml" +======= +# 80575 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 79934 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 79940 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80580 "parsing/parser.ml" +||||||| 04da777f7 +# 80571 "parsing/parser.ml" +======= +# 80585 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80586 "parsing/parser.ml" +||||||| 04da777f7 +# 80577 "parsing/parser.ml" +======= +# 80591 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 79947 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80593 "parsing/parser.ml" +||||||| 04da777f7 +# 80584 "parsing/parser.ml" +======= +# 80598 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 79959 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 79965 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 80605 "parsing/parser.ml" +||||||| 04da777f7 +# 80596 "parsing/parser.ml" +======= +# 80610 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80611 "parsing/parser.ml" +||||||| 04da777f7 +# 80602 "parsing/parser.ml" +======= +# 80616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 79975 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80621 "parsing/parser.ml" +||||||| 04da777f7 +# 80612 "parsing/parser.ml" +======= +# 80626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 79982 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 79987 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 80628 "parsing/parser.ml" +||||||| 04da777f7 +# 80619 "parsing/parser.ml" +======= +# 80633 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80633 "parsing/parser.ml" +||||||| 04da777f7 +# 80624 "parsing/parser.ml" +======= +# 80638 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 79997 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80643 "parsing/parser.ml" +||||||| 04da777f7 +# 80634 "parsing/parser.ml" +======= +# 80648 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 80007 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 80013 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80653 "parsing/parser.ml" +||||||| 04da777f7 +# 80644 "parsing/parser.ml" +======= +# 80658 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80659 "parsing/parser.ml" +||||||| 04da777f7 +# 80650 "parsing/parser.ml" +======= +# 80664 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Mode.t) = Obj.magic _1_inlined4 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined3 : (Mode.Const.t list) = Obj.magic _1_inlined3 in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined4, _1_inlined3) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 80121 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80767 "parsing/parser.ml" +||||||| 04da777f7 +# 80758 "parsing/parser.ml" +======= +# 80772 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80132 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80138 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 80778 "parsing/parser.ml" +||||||| 04da777f7 +# 80769 "parsing/parser.ml" +======= +# 80783 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80784 "parsing/parser.ml" +||||||| 04da777f7 +# 80775 "parsing/parser.ml" +======= +# 80789 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80148 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80794 "parsing/parser.ml" +||||||| 04da777f7 +# 80785 "parsing/parser.ml" +======= +# 80799 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 80157 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80803 "parsing/parser.ml" +||||||| 04da777f7 +# 80794 "parsing/parser.ml" +======= +# 80808 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 80170 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80816 "parsing/parser.ml" +||||||| 04da777f7 +# 80807 "parsing/parser.ml" +======= +# 80821 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 80175 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 80181 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 80187 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80821 "parsing/parser.ml" +||||||| 04da777f7 +# 80812 "parsing/parser.ml" +======= +# 80826 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80827 "parsing/parser.ml" +||||||| 04da777f7 +# 80818 "parsing/parser.ml" +======= +# 80832 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 80833 "parsing/parser.ml" +||||||| 04da777f7 +# 80824 "parsing/parser.ml" +======= +# 80838 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 80197 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 80203 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80843 "parsing/parser.ml" +||||||| 04da777f7 +# 80834 "parsing/parser.ml" +======= +# 80848 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80849 "parsing/parser.ml" +||||||| 04da777f7 +# 80840 "parsing/parser.ml" +======= +# 80854 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 80210 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80856 "parsing/parser.ml" +||||||| 04da777f7 +# 80847 "parsing/parser.ml" +======= +# 80861 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80222 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80228 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 80868 "parsing/parser.ml" +||||||| 04da777f7 +# 80859 "parsing/parser.ml" +======= +# 80873 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 80874 "parsing/parser.ml" +||||||| 04da777f7 +# 80865 "parsing/parser.ml" +======= +# 80879 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80238 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80884 "parsing/parser.ml" +||||||| 04da777f7 +# 80875 "parsing/parser.ml" +======= +# 80889 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 80245 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 80250 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 80891 "parsing/parser.ml" +||||||| 04da777f7 +# 80882 "parsing/parser.ml" +======= +# 80896 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80896 "parsing/parser.ml" +||||||| 04da777f7 +# 80887 "parsing/parser.ml" +======= +# 80901 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 80260 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80906 "parsing/parser.ml" +||||||| 04da777f7 +# 80897 "parsing/parser.ml" +======= +# 80911 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined4_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 80270 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 80276 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80916 "parsing/parser.ml" +||||||| 04da777f7 +# 80907 "parsing/parser.ml" +======= +# 80921 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 80922 "parsing/parser.ml" +||||||| 04da777f7 +# 80913 "parsing/parser.ml" +======= +# 80927 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 80333 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 80338 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 80979 "parsing/parser.ml" +||||||| 04da777f7 +# 80970 "parsing/parser.ml" +======= +# 80984 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 80984 "parsing/parser.ml" +||||||| 04da777f7 +# 80975 "parsing/parser.ml" +======= +# 80989 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80347 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 80993 "parsing/parser.ml" +||||||| 04da777f7 +# 80984 "parsing/parser.ml" +======= +# 80998 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 80354 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 80360 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81000 "parsing/parser.ml" +||||||| 04da777f7 +# 80991 "parsing/parser.ml" +======= +# 81005 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 81006 "parsing/parser.ml" +||||||| 04da777f7 +# 80997 "parsing/parser.ml" +======= +# 81011 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 80366 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81012 "parsing/parser.ml" +||||||| 04da777f7 +# 81003 "parsing/parser.ml" +======= +# 81017 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80377 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80383 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81023 "parsing/parser.ml" +||||||| 04da777f7 +# 81014 "parsing/parser.ml" +======= +# 81028 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81029 "parsing/parser.ml" +||||||| 04da777f7 +# 81020 "parsing/parser.ml" +======= +# 81034 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80393 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81039 "parsing/parser.ml" +||||||| 04da777f7 +# 81030 "parsing/parser.ml" +======= +# 81044 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 80400 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 80405 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 81046 "parsing/parser.ml" +||||||| 04da777f7 +# 81037 "parsing/parser.ml" +======= +# 81051 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81051 "parsing/parser.ml" +||||||| 04da777f7 +# 81042 "parsing/parser.ml" +======= +# 81056 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 80415 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81061 "parsing/parser.ml" +||||||| 04da777f7 +# 81052 "parsing/parser.ml" +======= +# 81066 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 80425 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 80431 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81071 "parsing/parser.ml" +||||||| 04da777f7 +# 81062 "parsing/parser.ml" +======= +# 81076 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81077 "parsing/parser.ml" +||||||| 04da777f7 +# 81068 "parsing/parser.ml" +======= +# 81082 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 80495 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 80500 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81141 "parsing/parser.ml" +||||||| 04da777f7 +# 81132 "parsing/parser.ml" +======= +# 81146 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81146 "parsing/parser.ml" +||||||| 04da777f7 +# 81137 "parsing/parser.ml" +======= +# 81151 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80509 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81155 "parsing/parser.ml" +||||||| 04da777f7 +# 81146 "parsing/parser.ml" +======= +# 81160 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 80516 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 80522 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81162 "parsing/parser.ml" +||||||| 04da777f7 +# 81153 "parsing/parser.ml" +======= +# 81167 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 81168 "parsing/parser.ml" +||||||| 04da777f7 +# 81159 "parsing/parser.ml" +======= +# 81173 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 80528 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81174 "parsing/parser.ml" +||||||| 04da777f7 +# 81165 "parsing/parser.ml" +======= +# 81179 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80539 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80545 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81185 "parsing/parser.ml" +||||||| 04da777f7 +# 81176 "parsing/parser.ml" +======= +# 81190 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81191 "parsing/parser.ml" +||||||| 04da777f7 +# 81182 "parsing/parser.ml" +======= +# 81196 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80555 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81201 "parsing/parser.ml" +||||||| 04da777f7 +# 81192 "parsing/parser.ml" +======= +# 81206 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 80562 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 80567 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 81208 "parsing/parser.ml" +||||||| 04da777f7 +# 81199 "parsing/parser.ml" +======= +# 81213 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81213 "parsing/parser.ml" +||||||| 04da777f7 +# 81204 "parsing/parser.ml" +======= +# 81218 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 80577 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81223 "parsing/parser.ml" +||||||| 04da777f7 +# 81214 "parsing/parser.ml" +======= +# 81228 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 80587 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 80593 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81233 "parsing/parser.ml" +||||||| 04da777f7 +# 81224 "parsing/parser.ml" +======= +# 81238 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81239 "parsing/parser.ml" +||||||| 04da777f7 +# 81230 "parsing/parser.ml" +======= +# 81244 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 80657 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81303 "parsing/parser.ml" +||||||| 04da777f7 +# 81294 "parsing/parser.ml" +======= +# 81308 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80667 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81313 "parsing/parser.ml" +||||||| 04da777f7 +# 81304 "parsing/parser.ml" +======= +# 81318 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81319 "parsing/parser.ml" +||||||| 04da777f7 +# 81310 "parsing/parser.ml" +======= +# 81324 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81329 "parsing/parser.ml" +||||||| 04da777f7 +# 81320 "parsing/parser.ml" +======= +# 81334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 80690 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 80696 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81336 "parsing/parser.ml" +||||||| 04da777f7 +# 81327 "parsing/parser.ml" +======= +# 81341 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 81342 "parsing/parser.ml" +||||||| 04da777f7 +# 81333 "parsing/parser.ml" +======= +# 81347 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 80702 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81348 "parsing/parser.ml" +||||||| 04da777f7 +# 81339 "parsing/parser.ml" +======= +# 81353 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80713 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80719 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81359 "parsing/parser.ml" +||||||| 04da777f7 +# 81350 "parsing/parser.ml" +======= +# 81364 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81365 "parsing/parser.ml" +||||||| 04da777f7 +# 81356 "parsing/parser.ml" +======= +# 81370 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80729 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81375 "parsing/parser.ml" +||||||| 04da777f7 +# 81366 "parsing/parser.ml" +======= +# 81380 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 80736 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 80741 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 81382 "parsing/parser.ml" +||||||| 04da777f7 +# 81373 "parsing/parser.ml" +======= +# 81387 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81387 "parsing/parser.ml" +||||||| 04da777f7 +# 81378 "parsing/parser.ml" +======= +# 81392 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 80751 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81397 "parsing/parser.ml" +||||||| 04da777f7 +# 81388 "parsing/parser.ml" +======= +# 81402 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 80761 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 80767 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81407 "parsing/parser.ml" +||||||| 04da777f7 +# 81398 "parsing/parser.ml" +======= +# 81412 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81413 "parsing/parser.ml" +||||||| 04da777f7 +# 81404 "parsing/parser.ml" +======= +# 81418 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 80840 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81486 "parsing/parser.ml" +||||||| 04da777f7 +# 81477 "parsing/parser.ml" +======= +# 81491 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80851 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81497 "parsing/parser.ml" +||||||| 04da777f7 +# 81488 "parsing/parser.ml" +======= +# 81502 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81503 "parsing/parser.ml" +||||||| 04da777f7 +# 81494 "parsing/parser.ml" +======= +# 81508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81513 "parsing/parser.ml" +||||||| 04da777f7 +# 81504 "parsing/parser.ml" +======= +# 81518 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 80874 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 80880 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81520 "parsing/parser.ml" +||||||| 04da777f7 +# 81511 "parsing/parser.ml" +======= +# 81525 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 81526 "parsing/parser.ml" +||||||| 04da777f7 +# 81517 "parsing/parser.ml" +======= +# 81531 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 80886 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81532 "parsing/parser.ml" +||||||| 04da777f7 +# 81523 "parsing/parser.ml" +======= +# 81537 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 80897 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 80903 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81543 "parsing/parser.ml" +||||||| 04da777f7 +# 81534 "parsing/parser.ml" +======= +# 81548 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81549 "parsing/parser.ml" +||||||| 04da777f7 +# 81540 "parsing/parser.ml" +======= +# 81554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 80913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81559 "parsing/parser.ml" +||||||| 04da777f7 +# 81550 "parsing/parser.ml" +======= +# 81564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 80920 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 80925 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 81566 "parsing/parser.ml" +||||||| 04da777f7 +# 81557 "parsing/parser.ml" +======= +# 81571 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81571 "parsing/parser.ml" +||||||| 04da777f7 +# 81562 "parsing/parser.ml" +======= +# 81576 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 80935 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81581 "parsing/parser.ml" +||||||| 04da777f7 +# 81572 "parsing/parser.ml" +======= +# 81586 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 80945 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 80951 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81591 "parsing/parser.ml" +||||||| 04da777f7 +# 81582 "parsing/parser.ml" +======= +# 81596 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81597 "parsing/parser.ml" +||||||| 04da777f7 +# 81588 "parsing/parser.ml" +======= +# 81602 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 81015 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 81020 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81661 "parsing/parser.ml" +||||||| 04da777f7 +# 81652 "parsing/parser.ml" +======= +# 81666 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81666 "parsing/parser.ml" +||||||| 04da777f7 +# 81657 "parsing/parser.ml" +======= +# 81671 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81029 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81675 "parsing/parser.ml" +||||||| 04da777f7 +# 81666 "parsing/parser.ml" +======= +# 81680 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 81038 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81684 "parsing/parser.ml" +||||||| 04da777f7 +# 81675 "parsing/parser.ml" +======= +# 81689 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 81045 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 81691 "parsing/parser.ml" +||||||| 04da777f7 +# 81682 "parsing/parser.ml" +======= +# 81696 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 81051 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81697 "parsing/parser.ml" +||||||| 04da777f7 +# 81688 "parsing/parser.ml" +======= +# 81702 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 81062 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 81068 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81708 "parsing/parser.ml" +||||||| 04da777f7 +# 81699 "parsing/parser.ml" +======= +# 81713 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81714 "parsing/parser.ml" +||||||| 04da777f7 +# 81705 "parsing/parser.ml" +======= +# 81719 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81724 "parsing/parser.ml" +||||||| 04da777f7 +# 81715 "parsing/parser.ml" +======= +# 81729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 81085 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 81090 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 81731 "parsing/parser.ml" +||||||| 04da777f7 +# 81722 "parsing/parser.ml" +======= +# 81736 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81736 "parsing/parser.ml" +||||||| 04da777f7 +# 81727 "parsing/parser.ml" +======= +# 81741 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 81100 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81746 "parsing/parser.ml" +||||||| 04da777f7 +# 81737 "parsing/parser.ml" +======= +# 81751 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 81110 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 81116 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81756 "parsing/parser.ml" +||||||| 04da777f7 +# 81747 "parsing/parser.ml" +======= +# 81761 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81762 "parsing/parser.ml" +||||||| 04da777f7 +# 81753 "parsing/parser.ml" +======= +# 81767 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined2, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 81187 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 81192 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81833 "parsing/parser.ml" +||||||| 04da777f7 +# 81824 "parsing/parser.ml" +======= +# 81838 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 81838 "parsing/parser.ml" +||||||| 04da777f7 +# 81829 "parsing/parser.ml" +======= +# 81843 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81201 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81847 "parsing/parser.ml" +||||||| 04da777f7 +# 81838 "parsing/parser.ml" +======= +# 81852 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 81210 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81856 "parsing/parser.ml" +||||||| 04da777f7 +# 81847 "parsing/parser.ml" +======= +# 81861 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 81217 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 81863 "parsing/parser.ml" +||||||| 04da777f7 +# 81854 "parsing/parser.ml" +======= +# 81868 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 81223 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81869 "parsing/parser.ml" +||||||| 04da777f7 +# 81860 "parsing/parser.ml" +======= +# 81874 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 81234 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 81240 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 81880 "parsing/parser.ml" +||||||| 04da777f7 +# 81871 "parsing/parser.ml" +======= +# 81885 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 81886 "parsing/parser.ml" +||||||| 04da777f7 +# 81877 "parsing/parser.ml" +======= +# 81891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81250 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81896 "parsing/parser.ml" +||||||| 04da777f7 +# 81887 "parsing/parser.ml" +======= +# 81901 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 81257 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 81262 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 81903 "parsing/parser.ml" +||||||| 04da777f7 +# 81894 "parsing/parser.ml" +======= +# 81908 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81908 "parsing/parser.ml" +||||||| 04da777f7 +# 81899 "parsing/parser.ml" +======= +# 81913 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 81272 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81918 "parsing/parser.ml" +||||||| 04da777f7 +# 81909 "parsing/parser.ml" +======= +# 81923 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 81282 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 81288 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 81928 "parsing/parser.ml" +||||||| 04da777f7 +# 81919 "parsing/parser.ml" +======= +# 81933 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 81934 "parsing/parser.ml" +||||||| 04da777f7 +# 81925 "parsing/parser.ml" +======= +# 81939 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, ty_inlined1, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 81359 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82005 "parsing/parser.ml" +||||||| 04da777f7 +# 81996 "parsing/parser.ml" +======= +# 82010 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 81369 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 81375 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 82015 "parsing/parser.ml" +||||||| 04da777f7 +# 82006 "parsing/parser.ml" +======= +# 82020 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82021 "parsing/parser.ml" +||||||| 04da777f7 +# 82012 "parsing/parser.ml" +======= +# 82026 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81385 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82031 "parsing/parser.ml" +||||||| 04da777f7 +# 82022 "parsing/parser.ml" +======= +# 82036 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 81394 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82040 "parsing/parser.ml" +||||||| 04da777f7 +# 82031 "parsing/parser.ml" +======= +# 82045 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 81401 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 82047 "parsing/parser.ml" +||||||| 04da777f7 +# 82038 "parsing/parser.ml" +======= +# 82052 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 81407 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82053 "parsing/parser.ml" +||||||| 04da777f7 +# 82044 "parsing/parser.ml" +======= +# 82058 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 81418 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 81424 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 82064 "parsing/parser.ml" +||||||| 04da777f7 +# 82055 "parsing/parser.ml" +======= +# 82069 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82070 "parsing/parser.ml" +||||||| 04da777f7 +# 82061 "parsing/parser.ml" +======= +# 82075 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81434 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82080 "parsing/parser.ml" +||||||| 04da777f7 +# 82071 "parsing/parser.ml" +======= +# 82085 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 81441 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 81446 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 82087 "parsing/parser.ml" +||||||| 04da777f7 +# 82078 "parsing/parser.ml" +======= +# 82092 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82092 "parsing/parser.ml" +||||||| 04da777f7 +# 82083 "parsing/parser.ml" +======= +# 82097 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 81456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82102 "parsing/parser.ml" +||||||| 04da777f7 +# 82093 "parsing/parser.ml" +======= +# 82107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 81466 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 81472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82112 "parsing/parser.ml" +||||||| 04da777f7 +# 82103 "parsing/parser.ml" +======= +# 82117 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82118 "parsing/parser.ml" +||||||| 04da777f7 +# 82109 "parsing/parser.ml" +======= +# 82123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, ty_inlined1, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 81552 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82198 "parsing/parser.ml" +||||||| 04da777f7 +# 82189 "parsing/parser.ml" +======= +# 82203 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 81563 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 81569 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 82209 "parsing/parser.ml" +||||||| 04da777f7 +# 82200 "parsing/parser.ml" +======= +# 82214 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82215 "parsing/parser.ml" +||||||| 04da777f7 +# 82206 "parsing/parser.ml" +======= +# 82220 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81579 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82225 "parsing/parser.ml" +||||||| 04da777f7 +# 82216 "parsing/parser.ml" +======= +# 82230 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 81588 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82234 "parsing/parser.ml" +||||||| 04da777f7 +# 82225 "parsing/parser.ml" +======= +# 82239 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 81595 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 82241 "parsing/parser.ml" +||||||| 04da777f7 +# 82232 "parsing/parser.ml" +======= +# 82246 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 81601 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82247 "parsing/parser.ml" +||||||| 04da777f7 +# 82238 "parsing/parser.ml" +======= +# 82252 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 81612 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 81618 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 82258 "parsing/parser.ml" +||||||| 04da777f7 +# 82249 "parsing/parser.ml" +======= +# 82263 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82264 "parsing/parser.ml" +||||||| 04da777f7 +# 82255 "parsing/parser.ml" +======= +# 82269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81628 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82274 "parsing/parser.ml" +||||||| 04da777f7 +# 82265 "parsing/parser.ml" +======= +# 82279 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4340 "parsing/parser.mly" + ( Optional label ) +# 81635 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 81640 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4359 "parsing/parser.mly" +||||||| 04da777f7 +# 4352 "parsing/parser.mly" +======= +# 4343 "parsing/parser.mly" +>>>>>>> origin/main + ( Optional label ) +<<<<<<< HEAD +# 82281 "parsing/parser.ml" +||||||| 04da777f7 +# 82272 "parsing/parser.ml" +======= +# 82286 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82286 "parsing/parser.ml" +||||||| 04da777f7 +# 82277 "parsing/parser.ml" +======= +# 82291 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 81650 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82296 "parsing/parser.ml" +||||||| 04da777f7 +# 82287 "parsing/parser.ml" +======= +# 82301 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 81660 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 81666 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82306 "parsing/parser.ml" +||||||| 04da777f7 +# 82297 "parsing/parser.ml" +======= +# 82311 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82312 "parsing/parser.ml" +||||||| 04da777f7 +# 82303 "parsing/parser.ml" +======= +# 82317 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 81743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82389 "parsing/parser.ml" +||||||| 04da777f7 +# 82380 "parsing/parser.ml" +======= +# 82394 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 81754 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 81759 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82400 "parsing/parser.ml" +||||||| 04da777f7 +# 82391 "parsing/parser.ml" +======= +# 82405 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82405 "parsing/parser.ml" +||||||| 04da777f7 +# 82396 "parsing/parser.ml" +======= +# 82410 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81768 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82414 "parsing/parser.ml" +||||||| 04da777f7 +# 82405 "parsing/parser.ml" +======= +# 82419 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 81775 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82421 "parsing/parser.ml" +||||||| 04da777f7 +# 82412 "parsing/parser.ml" +======= +# 82426 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 81786 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82432 "parsing/parser.ml" +||||||| 04da777f7 +# 82423 "parsing/parser.ml" +======= +# 82437 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 81791 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 81797 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 81803 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82437 "parsing/parser.ml" +||||||| 04da777f7 +# 82428 "parsing/parser.ml" +======= +# 82442 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82443 "parsing/parser.ml" +||||||| 04da777f7 +# 82434 "parsing/parser.ml" +======= +# 82448 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 82449 "parsing/parser.ml" +||||||| 04da777f7 +# 82440 "parsing/parser.ml" +======= +# 82454 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 81813 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 81819 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82459 "parsing/parser.ml" +||||||| 04da777f7 +# 82450 "parsing/parser.ml" +======= +# 82464 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82465 "parsing/parser.ml" +||||||| 04da777f7 +# 82456 "parsing/parser.ml" +======= +# 82470 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 81826 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82472 "parsing/parser.ml" +||||||| 04da777f7 +# 82463 "parsing/parser.ml" +======= +# 82477 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 81833 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82479 "parsing/parser.ml" +||||||| 04da777f7 +# 82470 "parsing/parser.ml" +======= +# 82484 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81842 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82488 "parsing/parser.ml" +||||||| 04da777f7 +# 82479 "parsing/parser.ml" +======= +# 82493 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 81849 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 81854 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 82495 "parsing/parser.ml" +||||||| 04da777f7 +# 82486 "parsing/parser.ml" +======= +# 82500 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82500 "parsing/parser.ml" +||||||| 04da777f7 +# 82491 "parsing/parser.ml" +======= +# 82505 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 81864 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82510 "parsing/parser.ml" +||||||| 04da777f7 +# 82501 "parsing/parser.ml" +======= +# 82515 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 81874 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 81880 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82520 "parsing/parser.ml" +||||||| 04da777f7 +# 82511 "parsing/parser.ml" +======= +# 82525 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82526 "parsing/parser.ml" +||||||| 04da777f7 +# 82517 "parsing/parser.ml" +======= +# 82531 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 81964 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82610 "parsing/parser.ml" +||||||| 04da777f7 +# 82601 "parsing/parser.ml" +======= +# 82615 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined1 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 81976 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 81981 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82622 "parsing/parser.ml" +||||||| 04da777f7 +# 82613 "parsing/parser.ml" +======= +# 82627 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82627 "parsing/parser.ml" +||||||| 04da777f7 +# 82618 "parsing/parser.ml" +======= +# 82632 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 81990 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82636 "parsing/parser.ml" +||||||| 04da777f7 +# 82627 "parsing/parser.ml" +======= +# 82641 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 81997 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82643 "parsing/parser.ml" +||||||| 04da777f7 +# 82634 "parsing/parser.ml" +======= +# 82648 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 82008 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82654 "parsing/parser.ml" +||||||| 04da777f7 +# 82645 "parsing/parser.ml" +======= +# 82659 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 82013 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 82019 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 82025 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82659 "parsing/parser.ml" +||||||| 04da777f7 +# 82650 "parsing/parser.ml" +======= +# 82664 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82665 "parsing/parser.ml" +||||||| 04da777f7 +# 82656 "parsing/parser.ml" +======= +# 82670 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 82671 "parsing/parser.ml" +||||||| 04da777f7 +# 82662 "parsing/parser.ml" +======= +# 82676 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 82035 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 82041 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82681 "parsing/parser.ml" +||||||| 04da777f7 +# 82672 "parsing/parser.ml" +======= +# 82686 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82687 "parsing/parser.ml" +||||||| 04da777f7 +# 82678 "parsing/parser.ml" +======= +# 82692 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 82048 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82694 "parsing/parser.ml" +||||||| 04da777f7 +# 82685 "parsing/parser.ml" +======= +# 82699 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 82055 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82701 "parsing/parser.ml" +||||||| 04da777f7 +# 82692 "parsing/parser.ml" +======= +# 82706 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82064 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82710 "parsing/parser.ml" +||||||| 04da777f7 +# 82701 "parsing/parser.ml" +======= +# 82715 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 82071 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 82076 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 82717 "parsing/parser.ml" +||||||| 04da777f7 +# 82708 "parsing/parser.ml" +======= +# 82722 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82722 "parsing/parser.ml" +||||||| 04da777f7 +# 82713 "parsing/parser.ml" +======= +# 82727 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 82086 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82732 "parsing/parser.ml" +||||||| 04da777f7 +# 82723 "parsing/parser.ml" +======= +# 82737 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 82096 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 82102 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82742 "parsing/parser.ml" +||||||| 04da777f7 +# 82733 "parsing/parser.ml" +======= +# 82747 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82748 "parsing/parser.ml" +||||||| 04da777f7 +# 82739 "parsing/parser.ml" +======= +# 82753 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 82186 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82832 "parsing/parser.ml" +||||||| 04da777f7 +# 82823 "parsing/parser.ml" +======= +# 82837 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 82198 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82844 "parsing/parser.ml" +||||||| 04da777f7 +# 82835 "parsing/parser.ml" +======= +# 82849 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 82208 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 82214 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 82854 "parsing/parser.ml" +||||||| 04da777f7 +# 82845 "parsing/parser.ml" +======= +# 82859 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 82860 "parsing/parser.ml" +||||||| 04da777f7 +# 82851 "parsing/parser.ml" +======= +# 82865 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82224 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82870 "parsing/parser.ml" +||||||| 04da777f7 +# 82861 "parsing/parser.ml" +======= +# 82875 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 82231 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82877 "parsing/parser.ml" +||||||| 04da777f7 +# 82868 "parsing/parser.ml" +======= +# 82882 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 82242 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82888 "parsing/parser.ml" +||||||| 04da777f7 +# 82879 "parsing/parser.ml" +======= +# 82893 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 82247 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 82253 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 82259 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82893 "parsing/parser.ml" +||||||| 04da777f7 +# 82884 "parsing/parser.ml" +======= +# 82898 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82899 "parsing/parser.ml" +||||||| 04da777f7 +# 82890 "parsing/parser.ml" +======= +# 82904 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 82905 "parsing/parser.ml" +||||||| 04da777f7 +# 82896 "parsing/parser.ml" +======= +# 82910 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 82269 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 82275 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82915 "parsing/parser.ml" +||||||| 04da777f7 +# 82906 "parsing/parser.ml" +======= +# 82920 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82921 "parsing/parser.ml" +||||||| 04da777f7 +# 82912 "parsing/parser.ml" +======= +# 82926 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 82282 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82928 "parsing/parser.ml" +||||||| 04da777f7 +# 82919 "parsing/parser.ml" +======= +# 82933 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 82289 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 82935 "parsing/parser.ml" +||||||| 04da777f7 +# 82926 "parsing/parser.ml" +======= +# 82940 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82298 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82944 "parsing/parser.ml" +||||||| 04da777f7 +# 82935 "parsing/parser.ml" +======= +# 82949 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 82305 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 82310 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 82951 "parsing/parser.ml" +||||||| 04da777f7 +# 82942 "parsing/parser.ml" +======= +# 82956 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82956 "parsing/parser.ml" +||||||| 04da777f7 +# 82947 "parsing/parser.ml" +======= +# 82961 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 82320 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82966 "parsing/parser.ml" +||||||| 04da777f7 +# 82957 "parsing/parser.ml" +======= +# 82971 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 82330 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 82336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 82976 "parsing/parser.ml" +||||||| 04da777f7 +# 82967 "parsing/parser.ml" +======= +# 82981 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 82982 "parsing/parser.ml" +||||||| 04da777f7 +# 82973 "parsing/parser.ml" +======= +# 82987 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 82427 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83073 "parsing/parser.ml" +||||||| 04da777f7 +# 83064 "parsing/parser.ml" +======= +# 83078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 82441 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 83087 "parsing/parser.ml" +||||||| 04da777f7 +# 83078 "parsing/parser.ml" +======= +# 83092 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 82452 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 82458 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 83098 "parsing/parser.ml" +||||||| 04da777f7 +# 83089 "parsing/parser.ml" +======= +# 83103 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 83104 "parsing/parser.ml" +||||||| 04da777f7 +# 83095 "parsing/parser.ml" +======= +# 83109 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82468 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83114 "parsing/parser.ml" +||||||| 04da777f7 +# 83105 "parsing/parser.ml" +======= +# 83119 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 82475 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83121 "parsing/parser.ml" +||||||| 04da777f7 +# 83112 "parsing/parser.ml" +======= +# 83126 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 82486 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83132 "parsing/parser.ml" +||||||| 04da777f7 +# 83123 "parsing/parser.ml" +======= +# 83137 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 82491 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 82497 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 82503 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83137 "parsing/parser.ml" +||||||| 04da777f7 +# 83128 "parsing/parser.ml" +======= +# 83142 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83143 "parsing/parser.ml" +||||||| 04da777f7 +# 83134 "parsing/parser.ml" +======= +# 83148 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 83149 "parsing/parser.ml" +||||||| 04da777f7 +# 83140 "parsing/parser.ml" +======= +# 83154 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 82513 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 82519 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83159 "parsing/parser.ml" +||||||| 04da777f7 +# 83150 "parsing/parser.ml" +======= +# 83164 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83165 "parsing/parser.ml" +||||||| 04da777f7 +# 83156 "parsing/parser.ml" +======= +# 83170 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 82526 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83172 "parsing/parser.ml" +||||||| 04da777f7 +# 83163 "parsing/parser.ml" +======= +# 83177 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 82533 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83179 "parsing/parser.ml" +||||||| 04da777f7 +# 83170 "parsing/parser.ml" +======= +# 83184 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82542 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83188 "parsing/parser.ml" +||||||| 04da777f7 +# 83179 "parsing/parser.ml" +======= +# 83193 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 82549 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 82554 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 83195 "parsing/parser.ml" +||||||| 04da777f7 +# 83186 "parsing/parser.ml" +======= +# 83200 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83200 "parsing/parser.ml" +||||||| 04da777f7 +# 83191 "parsing/parser.ml" +======= +# 83205 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 82564 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83210 "parsing/parser.ml" +||||||| 04da777f7 +# 83201 "parsing/parser.ml" +======= +# 83215 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 82574 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 82580 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83220 "parsing/parser.ml" +||||||| 04da777f7 +# 83211 "parsing/parser.ml" +======= +# 83225 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83226 "parsing/parser.ml" +||||||| 04da777f7 +# 83217 "parsing/parser.ml" +======= +# 83231 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 82664 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83310 "parsing/parser.ml" +||||||| 04da777f7 +# 83301 "parsing/parser.ml" +======= +# 83315 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 82675 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 82680 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83321 "parsing/parser.ml" +||||||| 04da777f7 +# 83312 "parsing/parser.ml" +======= +# 83326 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83326 "parsing/parser.ml" +||||||| 04da777f7 +# 83317 "parsing/parser.ml" +======= +# 83331 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82689 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83335 "parsing/parser.ml" +||||||| 04da777f7 +# 83326 "parsing/parser.ml" +======= +# 83340 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 82698 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 83344 "parsing/parser.ml" +||||||| 04da777f7 +# 83335 "parsing/parser.ml" +======= +# 83349 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 82710 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83356 "parsing/parser.ml" +||||||| 04da777f7 +# 83347 "parsing/parser.ml" +======= +# 83361 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 82715 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 82721 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 82727 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83361 "parsing/parser.ml" +||||||| 04da777f7 +# 83352 "parsing/parser.ml" +======= +# 83366 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83367 "parsing/parser.ml" +||||||| 04da777f7 +# 83358 "parsing/parser.ml" +======= +# 83372 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 83373 "parsing/parser.ml" +||||||| 04da777f7 +# 83364 "parsing/parser.ml" +======= +# 83378 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 82737 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 82743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83383 "parsing/parser.ml" +||||||| 04da777f7 +# 83374 "parsing/parser.ml" +======= +# 83388 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83389 "parsing/parser.ml" +||||||| 04da777f7 +# 83380 "parsing/parser.ml" +======= +# 83394 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 82750 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83396 "parsing/parser.ml" +||||||| 04da777f7 +# 83387 "parsing/parser.ml" +======= +# 83401 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 82757 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83403 "parsing/parser.ml" +||||||| 04da777f7 +# 83394 "parsing/parser.ml" +======= +# 83408 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83412 "parsing/parser.ml" +||||||| 04da777f7 +# 83403 "parsing/parser.ml" +======= +# 83417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 82773 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 82778 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 83419 "parsing/parser.ml" +||||||| 04da777f7 +# 83410 "parsing/parser.ml" +======= +# 83424 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83424 "parsing/parser.ml" +||||||| 04da777f7 +# 83415 "parsing/parser.ml" +======= +# 83429 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 82788 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83434 "parsing/parser.ml" +||||||| 04da777f7 +# 83425 "parsing/parser.ml" +======= +# 83439 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 82798 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 82804 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83444 "parsing/parser.ml" +||||||| 04da777f7 +# 83435 "parsing/parser.ml" +======= +# 83449 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83450 "parsing/parser.ml" +||||||| 04da777f7 +# 83441 "parsing/parser.ml" +======= +# 83455 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 82895 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83541 "parsing/parser.ml" +||||||| 04da777f7 +# 83532 "parsing/parser.ml" +======= +# 83546 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined2 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 82907 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 82912 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 83553 "parsing/parser.ml" +||||||| 04da777f7 +# 83544 "parsing/parser.ml" +======= +# 83558 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83558 "parsing/parser.ml" +||||||| 04da777f7 +# 83549 "parsing/parser.ml" +======= +# 83563 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82921 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83567 "parsing/parser.ml" +||||||| 04da777f7 +# 83558 "parsing/parser.ml" +======= +# 83572 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 82930 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 83576 "parsing/parser.ml" +||||||| 04da777f7 +# 83567 "parsing/parser.ml" +======= +# 83581 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 82942 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83588 "parsing/parser.ml" +||||||| 04da777f7 +# 83579 "parsing/parser.ml" +======= +# 83593 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 82947 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 82953 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 82959 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83593 "parsing/parser.ml" +||||||| 04da777f7 +# 83584 "parsing/parser.ml" +======= +# 83598 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83599 "parsing/parser.ml" +||||||| 04da777f7 +# 83590 "parsing/parser.ml" +======= +# 83604 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 83605 "parsing/parser.ml" +||||||| 04da777f7 +# 83596 "parsing/parser.ml" +======= +# 83610 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 82969 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 82975 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83615 "parsing/parser.ml" +||||||| 04da777f7 +# 83606 "parsing/parser.ml" +======= +# 83620 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83621 "parsing/parser.ml" +||||||| 04da777f7 +# 83612 "parsing/parser.ml" +======= +# 83626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 82982 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83628 "parsing/parser.ml" +||||||| 04da777f7 +# 83619 "parsing/parser.ml" +======= +# 83633 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 82989 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83635 "parsing/parser.ml" +||||||| 04da777f7 +# 83626 "parsing/parser.ml" +======= +# 83640 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 82998 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83644 "parsing/parser.ml" +||||||| 04da777f7 +# 83635 "parsing/parser.ml" +======= +# 83649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 83005 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 83010 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 83651 "parsing/parser.ml" +||||||| 04da777f7 +# 83642 "parsing/parser.ml" +======= +# 83656 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83656 "parsing/parser.ml" +||||||| 04da777f7 +# 83647 "parsing/parser.ml" +======= +# 83661 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 83020 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83666 "parsing/parser.ml" +||||||| 04da777f7 +# 83657 "parsing/parser.ml" +======= +# 83671 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 83030 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 83036 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83676 "parsing/parser.ml" +||||||| 04da777f7 +# 83667 "parsing/parser.ml" +======= +# 83681 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83682 "parsing/parser.ml" +||||||| 04da777f7 +# 83673 "parsing/parser.ml" +======= +# 83687 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 83127 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83773 "parsing/parser.ml" +||||||| 04da777f7 +# 83764 "parsing/parser.ml" +======= +# 83778 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 83139 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83785 "parsing/parser.ml" +||||||| 04da777f7 +# 83776 "parsing/parser.ml" +======= +# 83790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 83149 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 83155 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 83795 "parsing/parser.ml" +||||||| 04da777f7 +# 83786 "parsing/parser.ml" +======= +# 83800 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 83801 "parsing/parser.ml" +||||||| 04da777f7 +# 83792 "parsing/parser.ml" +======= +# 83806 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83165 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83811 "parsing/parser.ml" +||||||| 04da777f7 +# 83802 "parsing/parser.ml" +======= +# 83816 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 83174 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 83820 "parsing/parser.ml" +||||||| 04da777f7 +# 83811 "parsing/parser.ml" +======= +# 83825 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 83186 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83832 "parsing/parser.ml" +||||||| 04da777f7 +# 83823 "parsing/parser.ml" +======= +# 83837 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 83191 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 83197 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 83203 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83837 "parsing/parser.ml" +||||||| 04da777f7 +# 83828 "parsing/parser.ml" +======= +# 83842 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83843 "parsing/parser.ml" +||||||| 04da777f7 +# 83834 "parsing/parser.ml" +======= +# 83848 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 83849 "parsing/parser.ml" +||||||| 04da777f7 +# 83840 "parsing/parser.ml" +======= +# 83854 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 83213 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 83219 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83859 "parsing/parser.ml" +||||||| 04da777f7 +# 83850 "parsing/parser.ml" +======= +# 83864 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83865 "parsing/parser.ml" +||||||| 04da777f7 +# 83856 "parsing/parser.ml" +======= +# 83870 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 83226 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83872 "parsing/parser.ml" +||||||| 04da777f7 +# 83863 "parsing/parser.ml" +======= +# 83877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 83233 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 83879 "parsing/parser.ml" +||||||| 04da777f7 +# 83870 "parsing/parser.ml" +======= +# 83884 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83242 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83888 "parsing/parser.ml" +||||||| 04da777f7 +# 83879 "parsing/parser.ml" +======= +# 83893 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 83249 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 83254 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 83895 "parsing/parser.ml" +||||||| 04da777f7 +# 83886 "parsing/parser.ml" +======= +# 83900 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83900 "parsing/parser.ml" +||||||| 04da777f7 +# 83891 "parsing/parser.ml" +======= +# 83905 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 83264 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83910 "parsing/parser.ml" +||||||| 04da777f7 +# 83901 "parsing/parser.ml" +======= +# 83915 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 83274 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 83280 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 83920 "parsing/parser.ml" +||||||| 04da777f7 +# 83911 "parsing/parser.ml" +======= +# 83925 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 83926 "parsing/parser.ml" +||||||| 04da777f7 +# 83917 "parsing/parser.ml" +======= +# 83931 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 83378 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84024 "parsing/parser.ml" +||||||| 04da777f7 +# 84015 "parsing/parser.ml" +======= +# 84029 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 83392 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84038 "parsing/parser.ml" +||||||| 04da777f7 +# 84029 "parsing/parser.ml" +======= +# 84043 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 83403 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 83409 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 84049 "parsing/parser.ml" +||||||| 04da777f7 +# 84040 "parsing/parser.ml" +======= +# 84054 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84055 "parsing/parser.ml" +||||||| 04da777f7 +# 84046 "parsing/parser.ml" +======= +# 84060 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83419 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84065 "parsing/parser.ml" +||||||| 04da777f7 +# 84056 "parsing/parser.ml" +======= +# 84070 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 83428 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84074 "parsing/parser.ml" +||||||| 04da777f7 +# 84065 "parsing/parser.ml" +======= +# 84079 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 83440 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84086 "parsing/parser.ml" +||||||| 04da777f7 +# 84077 "parsing/parser.ml" +======= +# 84091 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 83445 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 83451 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 83457 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84091 "parsing/parser.ml" +||||||| 04da777f7 +# 84082 "parsing/parser.ml" +======= +# 84096 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84097 "parsing/parser.ml" +||||||| 04da777f7 +# 84088 "parsing/parser.ml" +======= +# 84102 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 84103 "parsing/parser.ml" +||||||| 04da777f7 +# 84094 "parsing/parser.ml" +======= +# 84108 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 83467 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 83473 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84113 "parsing/parser.ml" +||||||| 04da777f7 +# 84104 "parsing/parser.ml" +======= +# 84118 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84119 "parsing/parser.ml" +||||||| 04da777f7 +# 84110 "parsing/parser.ml" +======= +# 84124 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 83480 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84126 "parsing/parser.ml" +||||||| 04da777f7 +# 84117 "parsing/parser.ml" +======= +# 84131 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 83487 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84133 "parsing/parser.ml" +||||||| 04da777f7 +# 84124 "parsing/parser.ml" +======= +# 84138 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83496 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84142 "parsing/parser.ml" +||||||| 04da777f7 +# 84133 "parsing/parser.ml" +======= +# 84147 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 83503 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 83508 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 84149 "parsing/parser.ml" +||||||| 04da777f7 +# 84140 "parsing/parser.ml" +======= +# 84154 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84154 "parsing/parser.ml" +||||||| 04da777f7 +# 84145 "parsing/parser.ml" +======= +# 84159 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 83518 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84164 "parsing/parser.ml" +||||||| 04da777f7 +# 84155 "parsing/parser.ml" +======= +# 84169 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 83528 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 83534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84174 "parsing/parser.ml" +||||||| 04da777f7 +# 84165 "parsing/parser.ml" +======= +# 84179 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84180 "parsing/parser.ml" +||||||| 04da777f7 +# 84171 "parsing/parser.ml" +======= +# 84185 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 83583 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84229 "parsing/parser.ml" +||||||| 04da777f7 +# 84220 "parsing/parser.ml" +======= +# 84234 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 83595 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 83600 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84241 "parsing/parser.ml" +||||||| 04da777f7 +# 84232 "parsing/parser.ml" +======= +# 84246 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84246 "parsing/parser.ml" +||||||| 04da777f7 +# 84237 "parsing/parser.ml" +======= +# 84251 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83609 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84255 "parsing/parser.ml" +||||||| 04da777f7 +# 84246 "parsing/parser.ml" +======= +# 84260 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 83616 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 83622 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84262 "parsing/parser.ml" +||||||| 04da777f7 +# 84253 "parsing/parser.ml" +======= +# 84267 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 84268 "parsing/parser.ml" +||||||| 04da777f7 +# 84259 "parsing/parser.ml" +======= +# 84273 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 83628 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 83634 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 84274 "parsing/parser.ml" +||||||| 04da777f7 +# 84265 "parsing/parser.ml" +======= +# 84279 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84280 "parsing/parser.ml" +||||||| 04da777f7 +# 84271 "parsing/parser.ml" +======= +# 84285 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83643 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84289 "parsing/parser.ml" +||||||| 04da777f7 +# 84280 "parsing/parser.ml" +======= +# 84294 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 83650 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 83655 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 84296 "parsing/parser.ml" +||||||| 04da777f7 +# 84287 "parsing/parser.ml" +======= +# 84301 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84301 "parsing/parser.ml" +||||||| 04da777f7 +# 84292 "parsing/parser.ml" +======= +# 84306 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 83665 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84311 "parsing/parser.ml" +||||||| 04da777f7 +# 84302 "parsing/parser.ml" +======= +# 84316 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 83675 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 83681 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84321 "parsing/parser.ml" +||||||| 04da777f7 +# 84312 "parsing/parser.ml" +======= +# 84326 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84327 "parsing/parser.ml" +||||||| 04da777f7 +# 84318 "parsing/parser.ml" +======= +# 84332 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1 : (Mode.t) = Obj.magic _1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 83737 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84383 "parsing/parser.ml" +||||||| 04da777f7 +# 84374 "parsing/parser.ml" +======= +# 84388 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 83749 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 83754 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84395 "parsing/parser.ml" +||||||| 04da777f7 +# 84386 "parsing/parser.ml" +======= +# 84400 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84400 "parsing/parser.ml" +||||||| 04da777f7 +# 84391 "parsing/parser.ml" +======= +# 84405 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83763 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84409 "parsing/parser.ml" +||||||| 04da777f7 +# 84400 "parsing/parser.ml" +======= +# 84414 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 83770 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 83776 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84416 "parsing/parser.ml" +||||||| 04da777f7 +# 84407 "parsing/parser.ml" +======= +# 84421 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 84422 "parsing/parser.ml" +||||||| 04da777f7 +# 84413 "parsing/parser.ml" +======= +# 84427 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 83782 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 83788 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 84428 "parsing/parser.ml" +||||||| 04da777f7 +# 84419 "parsing/parser.ml" +======= +# 84433 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84434 "parsing/parser.ml" +||||||| 04da777f7 +# 84425 "parsing/parser.ml" +======= +# 84439 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83797 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84443 "parsing/parser.ml" +||||||| 04da777f7 +# 84434 "parsing/parser.ml" +======= +# 84448 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 83804 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 83809 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 84450 "parsing/parser.ml" +||||||| 04da777f7 +# 84441 "parsing/parser.ml" +======= +# 84455 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84455 "parsing/parser.ml" +||||||| 04da777f7 +# 84446 "parsing/parser.ml" +======= +# 84460 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 83819 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84465 "parsing/parser.ml" +||||||| 04da777f7 +# 84456 "parsing/parser.ml" +======= +# 84470 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__1_ = _startpos_label_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 83829 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 83835 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84475 "parsing/parser.ml" +||||||| 04da777f7 +# 84466 "parsing/parser.ml" +======= +# 84480 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84481 "parsing/parser.ml" +||||||| 04da777f7 +# 84472 "parsing/parser.ml" +======= +# 84486 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 83891 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84537 "parsing/parser.ml" +||||||| 04da777f7 +# 84528 "parsing/parser.ml" +======= +# 84542 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 83903 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84549 "parsing/parser.ml" +||||||| 04da777f7 +# 84540 "parsing/parser.ml" +======= +# 84554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 83913 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 83919 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 84559 "parsing/parser.ml" +||||||| 04da777f7 +# 84550 "parsing/parser.ml" +======= +# 84564 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84565 "parsing/parser.ml" +||||||| 04da777f7 +# 84556 "parsing/parser.ml" +======= +# 84570 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83929 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84575 "parsing/parser.ml" +||||||| 04da777f7 +# 84566 "parsing/parser.ml" +======= +# 84580 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 83936 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 83942 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84582 "parsing/parser.ml" +||||||| 04da777f7 +# 84573 "parsing/parser.ml" +======= +# 84587 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 84588 "parsing/parser.ml" +||||||| 04da777f7 +# 84579 "parsing/parser.ml" +======= +# 84593 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 83948 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 83954 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 84594 "parsing/parser.ml" +||||||| 04da777f7 +# 84585 "parsing/parser.ml" +======= +# 84599 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84600 "parsing/parser.ml" +||||||| 04da777f7 +# 84591 "parsing/parser.ml" +======= +# 84605 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 83963 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84609 "parsing/parser.ml" +||||||| 04da777f7 +# 84600 "parsing/parser.ml" +======= +# 84614 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 83970 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 83975 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 84616 "parsing/parser.ml" +||||||| 04da777f7 +# 84607 "parsing/parser.ml" +======= +# 84621 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84621 "parsing/parser.ml" +||||||| 04da777f7 +# 84612 "parsing/parser.ml" +======= +# 84626 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 83985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84631 "parsing/parser.ml" +||||||| 04da777f7 +# 84622 "parsing/parser.ml" +======= +# 84636 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 83995 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 84001 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84641 "parsing/parser.ml" +||||||| 04da777f7 +# 84632 "parsing/parser.ml" +======= +# 84646 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84647 "parsing/parser.ml" +||||||| 04da777f7 +# 84638 "parsing/parser.ml" +======= +# 84652 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 84064 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84710 "parsing/parser.ml" +||||||| 04da777f7 +# 84701 "parsing/parser.ml" +======= +# 84715 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 84078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84724 "parsing/parser.ml" +||||||| 04da777f7 +# 84715 "parsing/parser.ml" +======= +# 84729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 84089 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 84095 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 84735 "parsing/parser.ml" +||||||| 04da777f7 +# 84726 "parsing/parser.ml" +======= +# 84740 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84741 "parsing/parser.ml" +||||||| 04da777f7 +# 84732 "parsing/parser.ml" +======= +# 84746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84751 "parsing/parser.ml" +||||||| 04da777f7 +# 84742 "parsing/parser.ml" +======= +# 84756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 84112 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 84118 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84758 "parsing/parser.ml" +||||||| 04da777f7 +# 84749 "parsing/parser.ml" +======= +# 84763 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 84764 "parsing/parser.ml" +||||||| 04da777f7 +# 84755 "parsing/parser.ml" +======= +# 84769 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 84124 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84130 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 84770 "parsing/parser.ml" +||||||| 04da777f7 +# 84761 "parsing/parser.ml" +======= +# 84775 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84776 "parsing/parser.ml" +||||||| 04da777f7 +# 84767 "parsing/parser.ml" +======= +# 84781 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84139 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84785 "parsing/parser.ml" +||||||| 04da777f7 +# 84776 "parsing/parser.ml" +======= +# 84790 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 84146 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 84151 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 84792 "parsing/parser.ml" +||||||| 04da777f7 +# 84783 "parsing/parser.ml" +======= +# 84797 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84797 "parsing/parser.ml" +||||||| 04da777f7 +# 84788 "parsing/parser.ml" +======= +# 84802 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 84161 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84807 "parsing/parser.ml" +||||||| 04da777f7 +# 84798 "parsing/parser.ml" +======= +# 84812 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 84171 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 84177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84817 "parsing/parser.ml" +||||||| 04da777f7 +# 84808 "parsing/parser.ml" +======= +# 84822 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84823 "parsing/parser.ml" +||||||| 04da777f7 +# 84814 "parsing/parser.ml" +======= +# 84828 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 84233 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84879 "parsing/parser.ml" +||||||| 04da777f7 +# 84870 "parsing/parser.ml" +======= +# 84884 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 84245 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84250 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84891 "parsing/parser.ml" +||||||| 04da777f7 +# 84882 "parsing/parser.ml" +======= +# 84896 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84896 "parsing/parser.ml" +||||||| 04da777f7 +# 84887 "parsing/parser.ml" +======= +# 84901 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84259 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84905 "parsing/parser.ml" +||||||| 04da777f7 +# 84896 "parsing/parser.ml" +======= +# 84910 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 84266 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 84272 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 84912 "parsing/parser.ml" +||||||| 04da777f7 +# 84903 "parsing/parser.ml" +======= +# 84917 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 84918 "parsing/parser.ml" +||||||| 04da777f7 +# 84909 "parsing/parser.ml" +======= +# 84923 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 84278 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84284 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 84924 "parsing/parser.ml" +||||||| 04da777f7 +# 84915 "parsing/parser.ml" +======= +# 84929 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 84930 "parsing/parser.ml" +||||||| 04da777f7 +# 84921 "parsing/parser.ml" +======= +# 84935 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84293 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84939 "parsing/parser.ml" +||||||| 04da777f7 +# 84930 "parsing/parser.ml" +======= +# 84944 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 84300 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 84305 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 84946 "parsing/parser.ml" +||||||| 04da777f7 +# 84937 "parsing/parser.ml" +======= +# 84951 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84951 "parsing/parser.ml" +||||||| 04da777f7 +# 84942 "parsing/parser.ml" +======= +# 84956 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 84315 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84961 "parsing/parser.ml" +||||||| 04da777f7 +# 84952 "parsing/parser.ml" +======= +# 84966 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 84325 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 84331 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 84971 "parsing/parser.ml" +||||||| 04da777f7 +# 84962 "parsing/parser.ml" +======= +# 84976 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 84977 "parsing/parser.ml" +||||||| 04da777f7 +# 84968 "parsing/parser.ml" +======= +# 84982 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 84394 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85040 "parsing/parser.ml" +||||||| 04da777f7 +# 85031 "parsing/parser.ml" +======= +# 85045 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 84406 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84411 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85052 "parsing/parser.ml" +||||||| 04da777f7 +# 85043 "parsing/parser.ml" +======= +# 85057 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85057 "parsing/parser.ml" +||||||| 04da777f7 +# 85048 "parsing/parser.ml" +======= +# 85062 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84420 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85066 "parsing/parser.ml" +||||||| 04da777f7 +# 85057 "parsing/parser.ml" +======= +# 85071 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 84427 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 84433 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85073 "parsing/parser.ml" +||||||| 04da777f7 +# 85064 "parsing/parser.ml" +======= +# 85078 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 85079 "parsing/parser.ml" +||||||| 04da777f7 +# 85070 "parsing/parser.ml" +======= +# 85084 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 84439 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84445 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 85085 "parsing/parser.ml" +||||||| 04da777f7 +# 85076 "parsing/parser.ml" +======= +# 85090 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85091 "parsing/parser.ml" +||||||| 04da777f7 +# 85082 "parsing/parser.ml" +======= +# 85096 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84454 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85100 "parsing/parser.ml" +||||||| 04da777f7 +# 85091 "parsing/parser.ml" +======= +# 85105 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 84461 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 84466 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 85107 "parsing/parser.ml" +||||||| 04da777f7 +# 85098 "parsing/parser.ml" +======= +# 85112 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85112 "parsing/parser.ml" +||||||| 04da777f7 +# 85103 "parsing/parser.ml" +======= +# 85117 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 84476 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85122 "parsing/parser.ml" +||||||| 04da777f7 +# 85113 "parsing/parser.ml" +======= +# 85127 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 84486 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 84492 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85132 "parsing/parser.ml" +||||||| 04da777f7 +# 85123 "parsing/parser.ml" +======= +# 85137 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85138 "parsing/parser.ml" +||||||| 04da777f7 +# 85129 "parsing/parser.ml" +======= +# 85143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 84555 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85201 "parsing/parser.ml" +||||||| 04da777f7 +# 85192 "parsing/parser.ml" +======= +# 85206 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 84567 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85213 "parsing/parser.ml" +||||||| 04da777f7 +# 85204 "parsing/parser.ml" +======= +# 85218 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 84577 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 84583 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 85223 "parsing/parser.ml" +||||||| 04da777f7 +# 85214 "parsing/parser.ml" +======= +# 85228 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85229 "parsing/parser.ml" +||||||| 04da777f7 +# 85220 "parsing/parser.ml" +======= +# 85234 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84593 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85239 "parsing/parser.ml" +||||||| 04da777f7 +# 85230 "parsing/parser.ml" +======= +# 85244 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 84600 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 84606 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85246 "parsing/parser.ml" +||||||| 04da777f7 +# 85237 "parsing/parser.ml" +======= +# 85251 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 85252 "parsing/parser.ml" +||||||| 04da777f7 +# 85243 "parsing/parser.ml" +======= +# 85257 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 84612 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84618 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 85258 "parsing/parser.ml" +||||||| 04da777f7 +# 85249 "parsing/parser.ml" +======= +# 85263 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85264 "parsing/parser.ml" +||||||| 04da777f7 +# 85255 "parsing/parser.ml" +======= +# 85269 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84627 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85273 "parsing/parser.ml" +||||||| 04da777f7 +# 85264 "parsing/parser.ml" +======= +# 85278 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 84634 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 84639 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 85280 "parsing/parser.ml" +||||||| 04da777f7 +# 85271 "parsing/parser.ml" +======= +# 85285 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85285 "parsing/parser.ml" +||||||| 04da777f7 +# 85276 "parsing/parser.ml" +======= +# 85290 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 84649 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85295 "parsing/parser.ml" +||||||| 04da777f7 +# 85286 "parsing/parser.ml" +======= +# 85300 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 84659 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 84665 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85305 "parsing/parser.ml" +||||||| 04da777f7 +# 85296 "parsing/parser.ml" +======= +# 85310 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85311 "parsing/parser.ml" +||||||| 04da777f7 +# 85302 "parsing/parser.ml" +======= +# 85316 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 84735 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85381 "parsing/parser.ml" +||||||| 04da777f7 +# 85372 "parsing/parser.ml" +======= +# 85386 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 84749 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85395 "parsing/parser.ml" +||||||| 04da777f7 +# 85386 "parsing/parser.ml" +======= +# 85400 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 84760 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 84766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 85406 "parsing/parser.ml" +||||||| 04da777f7 +# 85397 "parsing/parser.ml" +======= +# 85411 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85412 "parsing/parser.ml" +||||||| 04da777f7 +# 85403 "parsing/parser.ml" +======= +# 85417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84776 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85422 "parsing/parser.ml" +||||||| 04da777f7 +# 85413 "parsing/parser.ml" +======= +# 85427 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 84783 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 84789 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85429 "parsing/parser.ml" +||||||| 04da777f7 +# 85420 "parsing/parser.ml" +======= +# 85434 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 85435 "parsing/parser.ml" +||||||| 04da777f7 +# 85426 "parsing/parser.ml" +======= +# 85440 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 84795 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84801 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 85441 "parsing/parser.ml" +||||||| 04da777f7 +# 85432 "parsing/parser.ml" +======= +# 85446 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85447 "parsing/parser.ml" +||||||| 04da777f7 +# 85438 "parsing/parser.ml" +======= +# 85452 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84810 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85456 "parsing/parser.ml" +||||||| 04da777f7 +# 85447 "parsing/parser.ml" +======= +# 85461 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 84817 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 84822 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 85463 "parsing/parser.ml" +||||||| 04da777f7 +# 85454 "parsing/parser.ml" +======= +# 85468 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85468 "parsing/parser.ml" +||||||| 04da777f7 +# 85459 "parsing/parser.ml" +======= +# 85473 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 84832 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85478 "parsing/parser.ml" +||||||| 04da777f7 +# 85469 "parsing/parser.ml" +======= +# 85483 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 84842 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 84848 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85488 "parsing/parser.ml" +||||||| 04da777f7 +# 85479 "parsing/parser.ml" +======= +# 85493 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85494 "parsing/parser.ml" +||||||| 04da777f7 +# 85485 "parsing/parser.ml" +======= +# 85499 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 84932 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85578 "parsing/parser.ml" +||||||| 04da777f7 +# 85569 "parsing/parser.ml" +======= +# 85583 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 84943 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 84948 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85589 "parsing/parser.ml" +||||||| 04da777f7 +# 85580 "parsing/parser.ml" +======= +# 85594 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85594 "parsing/parser.ml" +||||||| 04da777f7 +# 85585 "parsing/parser.ml" +======= +# 85599 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 84957 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85603 "parsing/parser.ml" +||||||| 04da777f7 +# 85594 "parsing/parser.ml" +======= +# 85608 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 84964 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85610 "parsing/parser.ml" +||||||| 04da777f7 +# 85601 "parsing/parser.ml" +======= +# 85615 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 84976 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85622 "parsing/parser.ml" +||||||| 04da777f7 +# 85613 "parsing/parser.ml" +======= +# 85627 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 84981 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 84987 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 84993 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85627 "parsing/parser.ml" +||||||| 04da777f7 +# 85618 "parsing/parser.ml" +======= +# 85632 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85633 "parsing/parser.ml" +||||||| 04da777f7 +# 85624 "parsing/parser.ml" +======= +# 85638 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 85639 "parsing/parser.ml" +||||||| 04da777f7 +# 85630 "parsing/parser.ml" +======= +# 85644 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 85003 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 85009 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85649 "parsing/parser.ml" +||||||| 04da777f7 +# 85640 "parsing/parser.ml" +======= +# 85654 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85655 "parsing/parser.ml" +||||||| 04da777f7 +# 85646 "parsing/parser.ml" +======= +# 85660 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 85016 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85662 "parsing/parser.ml" +||||||| 04da777f7 +# 85653 "parsing/parser.ml" +======= +# 85667 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 85028 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 85034 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 85674 "parsing/parser.ml" +||||||| 04da777f7 +# 85665 "parsing/parser.ml" +======= +# 85679 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85680 "parsing/parser.ml" +||||||| 04da777f7 +# 85671 "parsing/parser.ml" +======= +# 85685 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85044 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85690 "parsing/parser.ml" +||||||| 04da777f7 +# 85681 "parsing/parser.ml" +======= +# 85695 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 85051 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 85056 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 85697 "parsing/parser.ml" +||||||| 04da777f7 +# 85688 "parsing/parser.ml" +======= +# 85702 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85702 "parsing/parser.ml" +||||||| 04da777f7 +# 85693 "parsing/parser.ml" +======= +# 85707 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 85066 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85712 "parsing/parser.ml" +||||||| 04da777f7 +# 85703 "parsing/parser.ml" +======= +# 85717 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 85076 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 85082 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85722 "parsing/parser.ml" +||||||| 04da777f7 +# 85713 "parsing/parser.ml" +======= +# 85727 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85728 "parsing/parser.ml" +||||||| 04da777f7 +# 85719 "parsing/parser.ml" +======= +# 85733 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 85173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85819 "parsing/parser.ml" +||||||| 04da777f7 +# 85810 "parsing/parser.ml" +======= +# 85824 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined2 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 85185 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 85190 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85831 "parsing/parser.ml" +||||||| 04da777f7 +# 85822 "parsing/parser.ml" +======= +# 85836 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85836 "parsing/parser.ml" +||||||| 04da777f7 +# 85827 "parsing/parser.ml" +======= +# 85841 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85199 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85845 "parsing/parser.ml" +||||||| 04da777f7 +# 85836 "parsing/parser.ml" +======= +# 85850 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 85206 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 85852 "parsing/parser.ml" +||||||| 04da777f7 +# 85843 "parsing/parser.ml" +======= +# 85857 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 85218 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85864 "parsing/parser.ml" +||||||| 04da777f7 +# 85855 "parsing/parser.ml" +======= +# 85869 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 85223 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 85229 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 85235 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85869 "parsing/parser.ml" +||||||| 04da777f7 +# 85860 "parsing/parser.ml" +======= +# 85874 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85875 "parsing/parser.ml" +||||||| 04da777f7 +# 85866 "parsing/parser.ml" +======= +# 85880 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 85881 "parsing/parser.ml" +||||||| 04da777f7 +# 85872 "parsing/parser.ml" +======= +# 85886 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 85245 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 85251 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85891 "parsing/parser.ml" +||||||| 04da777f7 +# 85882 "parsing/parser.ml" +======= +# 85896 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85897 "parsing/parser.ml" +||||||| 04da777f7 +# 85888 "parsing/parser.ml" +======= +# 85902 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 85258 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85904 "parsing/parser.ml" +||||||| 04da777f7 +# 85895 "parsing/parser.ml" +======= +# 85909 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 85270 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 85276 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 85916 "parsing/parser.ml" +||||||| 04da777f7 +# 85907 "parsing/parser.ml" +======= +# 85921 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 85922 "parsing/parser.ml" +||||||| 04da777f7 +# 85913 "parsing/parser.ml" +======= +# 85927 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85286 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85932 "parsing/parser.ml" +||||||| 04da777f7 +# 85923 "parsing/parser.ml" +======= +# 85937 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 85293 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 85298 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 85939 "parsing/parser.ml" +||||||| 04da777f7 +# 85930 "parsing/parser.ml" +======= +# 85944 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85944 "parsing/parser.ml" +||||||| 04da777f7 +# 85935 "parsing/parser.ml" +======= +# 85949 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 85308 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85954 "parsing/parser.ml" +||||||| 04da777f7 +# 85945 "parsing/parser.ml" +======= +# 85959 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 85318 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 85324 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 85964 "parsing/parser.ml" +||||||| 04da777f7 +# 85955 "parsing/parser.ml" +======= +# 85969 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 85970 "parsing/parser.ml" +||||||| 04da777f7 +# 85961 "parsing/parser.ml" +======= +# 85975 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 85415 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86061 "parsing/parser.ml" +||||||| 04da777f7 +# 86052 "parsing/parser.ml" +======= +# 86066 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 85427 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 86073 "parsing/parser.ml" +||||||| 04da777f7 +# 86064 "parsing/parser.ml" +======= +# 86078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 85437 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 85443 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 86083 "parsing/parser.ml" +||||||| 04da777f7 +# 86074 "parsing/parser.ml" +======= +# 86088 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86089 "parsing/parser.ml" +||||||| 04da777f7 +# 86080 "parsing/parser.ml" +======= +# 86094 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85453 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86099 "parsing/parser.ml" +||||||| 04da777f7 +# 86090 "parsing/parser.ml" +======= +# 86104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 85460 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 86106 "parsing/parser.ml" +||||||| 04da777f7 +# 86097 "parsing/parser.ml" +======= +# 86111 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 85472 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86118 "parsing/parser.ml" +||||||| 04da777f7 +# 86109 "parsing/parser.ml" +======= +# 86123 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 85477 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 85483 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 85489 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86123 "parsing/parser.ml" +||||||| 04da777f7 +# 86114 "parsing/parser.ml" +======= +# 86128 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86129 "parsing/parser.ml" +||||||| 04da777f7 +# 86120 "parsing/parser.ml" +======= +# 86134 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 86135 "parsing/parser.ml" +||||||| 04da777f7 +# 86126 "parsing/parser.ml" +======= +# 86140 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 85499 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 85505 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86145 "parsing/parser.ml" +||||||| 04da777f7 +# 86136 "parsing/parser.ml" +======= +# 86150 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86151 "parsing/parser.ml" +||||||| 04da777f7 +# 86142 "parsing/parser.ml" +======= +# 86156 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 85512 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86158 "parsing/parser.ml" +||||||| 04da777f7 +# 86149 "parsing/parser.ml" +======= +# 86163 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 85524 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 85530 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 86170 "parsing/parser.ml" +||||||| 04da777f7 +# 86161 "parsing/parser.ml" +======= +# 86175 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86176 "parsing/parser.ml" +||||||| 04da777f7 +# 86167 "parsing/parser.ml" +======= +# 86181 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86186 "parsing/parser.ml" +||||||| 04da777f7 +# 86177 "parsing/parser.ml" +======= +# 86191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 85547 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 85552 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 86193 "parsing/parser.ml" +||||||| 04da777f7 +# 86184 "parsing/parser.ml" +======= +# 86198 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86198 "parsing/parser.ml" +||||||| 04da777f7 +# 86189 "parsing/parser.ml" +======= +# 86203 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 85562 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86208 "parsing/parser.ml" +||||||| 04da777f7 +# 86199 "parsing/parser.ml" +======= +# 86213 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 85572 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 85578 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86218 "parsing/parser.ml" +||||||| 04da777f7 +# 86209 "parsing/parser.ml" +======= +# 86223 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86224 "parsing/parser.ml" +||||||| 04da777f7 +# 86215 "parsing/parser.ml" +======= +# 86229 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 85676 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86322 "parsing/parser.ml" +||||||| 04da777f7 +# 86313 "parsing/parser.ml" +======= +# 86327 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 85690 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86336 "parsing/parser.ml" +||||||| 04da777f7 +# 86327 "parsing/parser.ml" +======= +# 86341 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 85701 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 85707 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 86347 "parsing/parser.ml" +||||||| 04da777f7 +# 86338 "parsing/parser.ml" +======= +# 86352 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86353 "parsing/parser.ml" +||||||| 04da777f7 +# 86344 "parsing/parser.ml" +======= +# 86358 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85717 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86363 "parsing/parser.ml" +||||||| 04da777f7 +# 86354 "parsing/parser.ml" +======= +# 86368 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 85724 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 86370 "parsing/parser.ml" +||||||| 04da777f7 +# 86361 "parsing/parser.ml" +======= +# 86375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 85736 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86382 "parsing/parser.ml" +||||||| 04da777f7 +# 86373 "parsing/parser.ml" +======= +# 86387 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 85741 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 85747 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 85753 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86387 "parsing/parser.ml" +||||||| 04da777f7 +# 86378 "parsing/parser.ml" +======= +# 86392 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86393 "parsing/parser.ml" +||||||| 04da777f7 +# 86384 "parsing/parser.ml" +======= +# 86398 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 86399 "parsing/parser.ml" +||||||| 04da777f7 +# 86390 "parsing/parser.ml" +======= +# 86404 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 85763 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 85769 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86409 "parsing/parser.ml" +||||||| 04da777f7 +# 86400 "parsing/parser.ml" +======= +# 86414 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86415 "parsing/parser.ml" +||||||| 04da777f7 +# 86406 "parsing/parser.ml" +======= +# 86420 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 85776 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86422 "parsing/parser.ml" +||||||| 04da777f7 +# 86413 "parsing/parser.ml" +======= +# 86427 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 85788 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 85794 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 86434 "parsing/parser.ml" +||||||| 04da777f7 +# 86425 "parsing/parser.ml" +======= +# 86439 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86440 "parsing/parser.ml" +||||||| 04da777f7 +# 86431 "parsing/parser.ml" +======= +# 86445 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85804 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86450 "parsing/parser.ml" +||||||| 04da777f7 +# 86441 "parsing/parser.ml" +======= +# 86455 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 85811 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 85816 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 86457 "parsing/parser.ml" +||||||| 04da777f7 +# 86448 "parsing/parser.ml" +======= +# 86462 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86462 "parsing/parser.ml" +||||||| 04da777f7 +# 86453 "parsing/parser.ml" +======= +# 86467 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 85826 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86472 "parsing/parser.ml" +||||||| 04da777f7 +# 86463 "parsing/parser.ml" +======= +# 86477 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 85836 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 85842 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86482 "parsing/parser.ml" +||||||| 04da777f7 +# 86473 "parsing/parser.ml" +======= +# 86487 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86488 "parsing/parser.ml" +||||||| 04da777f7 +# 86479 "parsing/parser.ml" +======= +# 86493 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 85933 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86579 "parsing/parser.ml" +||||||| 04da777f7 +# 86570 "parsing/parser.ml" +======= +# 86584 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 85944 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 85949 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 86590 "parsing/parser.ml" +||||||| 04da777f7 +# 86581 "parsing/parser.ml" +======= +# 86595 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 86595 "parsing/parser.ml" +||||||| 04da777f7 +# 86586 "parsing/parser.ml" +======= +# 86600 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 85958 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86604 "parsing/parser.ml" +||||||| 04da777f7 +# 86595 "parsing/parser.ml" +======= +# 86609 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 85967 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86613 "parsing/parser.ml" +||||||| 04da777f7 +# 86604 "parsing/parser.ml" +======= +# 86618 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 85980 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86626 "parsing/parser.ml" +||||||| 04da777f7 +# 86617 "parsing/parser.ml" +======= +# 86631 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 85985 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 85991 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 85997 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86631 "parsing/parser.ml" +||||||| 04da777f7 +# 86622 "parsing/parser.ml" +======= +# 86636 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86637 "parsing/parser.ml" +||||||| 04da777f7 +# 86628 "parsing/parser.ml" +======= +# 86642 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 86643 "parsing/parser.ml" +||||||| 04da777f7 +# 86634 "parsing/parser.ml" +======= +# 86648 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 86007 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 86013 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86653 "parsing/parser.ml" +||||||| 04da777f7 +# 86644 "parsing/parser.ml" +======= +# 86658 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86659 "parsing/parser.ml" +||||||| 04da777f7 +# 86650 "parsing/parser.ml" +======= +# 86664 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 86020 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86666 "parsing/parser.ml" +||||||| 04da777f7 +# 86657 "parsing/parser.ml" +======= +# 86671 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 86032 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 86038 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 86678 "parsing/parser.ml" +||||||| 04da777f7 +# 86669 "parsing/parser.ml" +======= +# 86683 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86684 "parsing/parser.ml" +||||||| 04da777f7 +# 86675 "parsing/parser.ml" +======= +# 86689 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86048 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86694 "parsing/parser.ml" +||||||| 04da777f7 +# 86685 "parsing/parser.ml" +======= +# 86699 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 86055 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 86060 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 86701 "parsing/parser.ml" +||||||| 04da777f7 +# 86692 "parsing/parser.ml" +======= +# 86706 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86706 "parsing/parser.ml" +||||||| 04da777f7 +# 86697 "parsing/parser.ml" +======= +# 86711 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 86070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86716 "parsing/parser.ml" +||||||| 04da777f7 +# 86707 "parsing/parser.ml" +======= +# 86721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 86080 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 86086 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86726 "parsing/parser.ml" +||||||| 04da777f7 +# 86717 "parsing/parser.ml" +======= +# 86731 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86732 "parsing/parser.ml" +||||||| 04da777f7 +# 86723 "parsing/parser.ml" +======= +# 86737 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 86184 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86830 "parsing/parser.ml" +||||||| 04da777f7 +# 86821 "parsing/parser.ml" +======= +# 86835 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined3 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 86196 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 86201 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86842 "parsing/parser.ml" +||||||| 04da777f7 +# 86833 "parsing/parser.ml" +======= +# 86847 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 86847 "parsing/parser.ml" +||||||| 04da777f7 +# 86838 "parsing/parser.ml" +======= +# 86852 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86210 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86856 "parsing/parser.ml" +||||||| 04da777f7 +# 86847 "parsing/parser.ml" +======= +# 86861 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 86219 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86865 "parsing/parser.ml" +||||||| 04da777f7 +# 86856 "parsing/parser.ml" +======= +# 86870 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 86232 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86878 "parsing/parser.ml" +||||||| 04da777f7 +# 86869 "parsing/parser.ml" +======= +# 86883 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 86237 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 86243 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 86249 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86883 "parsing/parser.ml" +||||||| 04da777f7 +# 86874 "parsing/parser.ml" +======= +# 86888 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86889 "parsing/parser.ml" +||||||| 04da777f7 +# 86880 "parsing/parser.ml" +======= +# 86894 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 86895 "parsing/parser.ml" +||||||| 04da777f7 +# 86886 "parsing/parser.ml" +======= +# 86900 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 86259 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 86265 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86905 "parsing/parser.ml" +||||||| 04da777f7 +# 86896 "parsing/parser.ml" +======= +# 86910 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86911 "parsing/parser.ml" +||||||| 04da777f7 +# 86902 "parsing/parser.ml" +======= +# 86916 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 86272 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86918 "parsing/parser.ml" +||||||| 04da777f7 +# 86909 "parsing/parser.ml" +======= +# 86923 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 86284 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 86290 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 86930 "parsing/parser.ml" +||||||| 04da777f7 +# 86921 "parsing/parser.ml" +======= +# 86935 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 86936 "parsing/parser.ml" +||||||| 04da777f7 +# 86927 "parsing/parser.ml" +======= +# 86941 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86300 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86946 "parsing/parser.ml" +||||||| 04da777f7 +# 86937 "parsing/parser.ml" +======= +# 86951 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 86307 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 86312 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 86953 "parsing/parser.ml" +||||||| 04da777f7 +# 86944 "parsing/parser.ml" +======= +# 86958 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86958 "parsing/parser.ml" +||||||| 04da777f7 +# 86949 "parsing/parser.ml" +======= +# 86963 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 86322 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86968 "parsing/parser.ml" +||||||| 04da777f7 +# 86959 "parsing/parser.ml" +======= +# 86973 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 86332 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 86338 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 86978 "parsing/parser.ml" +||||||| 04da777f7 +# 86969 "parsing/parser.ml" +======= +# 86983 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 86984 "parsing/parser.ml" +||||||| 04da777f7 +# 86975 "parsing/parser.ml" +======= +# 86989 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined3 : (Mode.Const.t list) = Obj.magic _1_inlined3 in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 86436 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87082 "parsing/parser.ml" +||||||| 04da777f7 +# 87073 "parsing/parser.ml" +======= +# 87087 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 86448 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87094 "parsing/parser.ml" +||||||| 04da777f7 +# 87085 "parsing/parser.ml" +======= +# 87099 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 86458 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 86464 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87104 "parsing/parser.ml" +||||||| 04da777f7 +# 87095 "parsing/parser.ml" +======= +# 87109 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87110 "parsing/parser.ml" +||||||| 04da777f7 +# 87101 "parsing/parser.ml" +======= +# 87115 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86474 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87120 "parsing/parser.ml" +||||||| 04da777f7 +# 87111 "parsing/parser.ml" +======= +# 87125 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 86483 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87129 "parsing/parser.ml" +||||||| 04da777f7 +# 87120 "parsing/parser.ml" +======= +# 87134 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 86496 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87142 "parsing/parser.ml" +||||||| 04da777f7 +# 87133 "parsing/parser.ml" +======= +# 87147 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 86501 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 86507 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 86513 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87147 "parsing/parser.ml" +||||||| 04da777f7 +# 87138 "parsing/parser.ml" +======= +# 87152 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87153 "parsing/parser.ml" +||||||| 04da777f7 +# 87144 "parsing/parser.ml" +======= +# 87158 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 87159 "parsing/parser.ml" +||||||| 04da777f7 +# 87150 "parsing/parser.ml" +======= +# 87164 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 86523 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 86529 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87169 "parsing/parser.ml" +||||||| 04da777f7 +# 87160 "parsing/parser.ml" +======= +# 87174 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87175 "parsing/parser.ml" +||||||| 04da777f7 +# 87166 "parsing/parser.ml" +======= +# 87180 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 86536 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87182 "parsing/parser.ml" +||||||| 04da777f7 +# 87173 "parsing/parser.ml" +======= +# 87187 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 86548 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 86554 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87194 "parsing/parser.ml" +||||||| 04da777f7 +# 87185 "parsing/parser.ml" +======= +# 87199 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87200 "parsing/parser.ml" +||||||| 04da777f7 +# 87191 "parsing/parser.ml" +======= +# 87205 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86564 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87210 "parsing/parser.ml" +||||||| 04da777f7 +# 87201 "parsing/parser.ml" +======= +# 87215 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 86571 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 86576 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 87217 "parsing/parser.ml" +||||||| 04da777f7 +# 87208 "parsing/parser.ml" +======= +# 87222 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87222 "parsing/parser.ml" +||||||| 04da777f7 +# 87213 "parsing/parser.ml" +======= +# 87227 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 86586 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87232 "parsing/parser.ml" +||||||| 04da777f7 +# 87223 "parsing/parser.ml" +======= +# 87237 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 86596 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 86602 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87242 "parsing/parser.ml" +||||||| 04da777f7 +# 87233 "parsing/parser.ml" +======= +# 87247 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87248 "parsing/parser.ml" +||||||| 04da777f7 +# 87239 "parsing/parser.ml" +======= +# 87253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Mode.t) = Obj.magic _1_inlined4 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined3 : (Mode.Const.t list) = Obj.magic _1_inlined3 in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 86707 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87353 "parsing/parser.ml" +||||||| 04da777f7 +# 87344 "parsing/parser.ml" +======= +# 87358 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined4, _1_inlined3) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 86721 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87367 "parsing/parser.ml" +||||||| 04da777f7 +# 87358 "parsing/parser.ml" +======= +# 87372 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 86732 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 86738 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87378 "parsing/parser.ml" +||||||| 04da777f7 +# 87369 "parsing/parser.ml" +======= +# 87383 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87384 "parsing/parser.ml" +||||||| 04da777f7 +# 87375 "parsing/parser.ml" +======= +# 87389 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86748 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87394 "parsing/parser.ml" +||||||| 04da777f7 +# 87385 "parsing/parser.ml" +======= +# 87399 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 86757 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87403 "parsing/parser.ml" +||||||| 04da777f7 +# 87394 "parsing/parser.ml" +======= +# 87408 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 86770 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87416 "parsing/parser.ml" +||||||| 04da777f7 +# 87407 "parsing/parser.ml" +======= +# 87421 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 86775 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 86781 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 86787 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87421 "parsing/parser.ml" +||||||| 04da777f7 +# 87412 "parsing/parser.ml" +======= +# 87426 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87427 "parsing/parser.ml" +||||||| 04da777f7 +# 87418 "parsing/parser.ml" +======= +# 87432 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 87433 "parsing/parser.ml" +||||||| 04da777f7 +# 87424 "parsing/parser.ml" +======= +# 87438 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 86797 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 86803 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87443 "parsing/parser.ml" +||||||| 04da777f7 +# 87434 "parsing/parser.ml" +======= +# 87448 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87449 "parsing/parser.ml" +||||||| 04da777f7 +# 87440 "parsing/parser.ml" +======= +# 87454 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 86810 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87456 "parsing/parser.ml" +||||||| 04da777f7 +# 87447 "parsing/parser.ml" +======= +# 87461 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 86822 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 86828 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87468 "parsing/parser.ml" +||||||| 04da777f7 +# 87459 "parsing/parser.ml" +======= +# 87473 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87474 "parsing/parser.ml" +||||||| 04da777f7 +# 87465 "parsing/parser.ml" +======= +# 87479 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86838 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87484 "parsing/parser.ml" +||||||| 04da777f7 +# 87475 "parsing/parser.ml" +======= +# 87489 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 86845 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 86850 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 87491 "parsing/parser.ml" +||||||| 04da777f7 +# 87482 "parsing/parser.ml" +======= +# 87496 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87496 "parsing/parser.ml" +||||||| 04da777f7 +# 87487 "parsing/parser.ml" +======= +# 87501 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 86860 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87506 "parsing/parser.ml" +||||||| 04da777f7 +# 87497 "parsing/parser.ml" +======= +# 87511 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined4_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 86870 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 86876 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87516 "parsing/parser.ml" +||||||| 04da777f7 +# 87507 "parsing/parser.ml" +======= +# 87521 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87522 "parsing/parser.ml" +||||||| 04da777f7 +# 87513 "parsing/parser.ml" +======= +# 87527 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 86932 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87578 "parsing/parser.ml" +||||||| 04da777f7 +# 87569 "parsing/parser.ml" +======= +# 87583 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 86944 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 86949 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87590 "parsing/parser.ml" +||||||| 04da777f7 +# 87581 "parsing/parser.ml" +======= +# 87595 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87595 "parsing/parser.ml" +||||||| 04da777f7 +# 87586 "parsing/parser.ml" +======= +# 87600 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 86958 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87604 "parsing/parser.ml" +||||||| 04da777f7 +# 87595 "parsing/parser.ml" +======= +# 87609 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 86965 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 86971 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87611 "parsing/parser.ml" +||||||| 04da777f7 +# 87602 "parsing/parser.ml" +======= +# 87616 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 87617 "parsing/parser.ml" +||||||| 04da777f7 +# 87608 "parsing/parser.ml" +======= +# 87622 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 86977 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87623 "parsing/parser.ml" +||||||| 04da777f7 +# 87614 "parsing/parser.ml" +======= +# 87628 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 86988 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 86994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87634 "parsing/parser.ml" +||||||| 04da777f7 +# 87625 "parsing/parser.ml" +======= +# 87639 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87640 "parsing/parser.ml" +||||||| 04da777f7 +# 87631 "parsing/parser.ml" +======= +# 87645 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87004 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87650 "parsing/parser.ml" +||||||| 04da777f7 +# 87641 "parsing/parser.ml" +======= +# 87655 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 87011 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 87016 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 87657 "parsing/parser.ml" +||||||| 04da777f7 +# 87648 "parsing/parser.ml" +======= +# 87662 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87662 "parsing/parser.ml" +||||||| 04da777f7 +# 87653 "parsing/parser.ml" +======= +# 87667 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 87026 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87672 "parsing/parser.ml" +||||||| 04da777f7 +# 87663 "parsing/parser.ml" +======= +# 87677 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 87036 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 87042 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87682 "parsing/parser.ml" +||||||| 04da777f7 +# 87673 "parsing/parser.ml" +======= +# 87687 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87688 "parsing/parser.ml" +||||||| 04da777f7 +# 87679 "parsing/parser.ml" +======= +# 87693 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 87105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87751 "parsing/parser.ml" +||||||| 04da777f7 +# 87742 "parsing/parser.ml" +======= +# 87756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 87117 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 87122 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87763 "parsing/parser.ml" +||||||| 04da777f7 +# 87754 "parsing/parser.ml" +======= +# 87768 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87768 "parsing/parser.ml" +||||||| 04da777f7 +# 87759 "parsing/parser.ml" +======= +# 87773 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87131 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87777 "parsing/parser.ml" +||||||| 04da777f7 +# 87768 "parsing/parser.ml" +======= +# 87782 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 87138 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 87144 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87784 "parsing/parser.ml" +||||||| 04da777f7 +# 87775 "parsing/parser.ml" +======= +# 87789 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 87790 "parsing/parser.ml" +||||||| 04da777f7 +# 87781 "parsing/parser.ml" +======= +# 87795 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 87150 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87796 "parsing/parser.ml" +||||||| 04da777f7 +# 87787 "parsing/parser.ml" +======= +# 87801 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 87161 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 87167 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87807 "parsing/parser.ml" +||||||| 04da777f7 +# 87798 "parsing/parser.ml" +======= +# 87812 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87813 "parsing/parser.ml" +||||||| 04da777f7 +# 87804 "parsing/parser.ml" +======= +# 87818 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87823 "parsing/parser.ml" +||||||| 04da777f7 +# 87814 "parsing/parser.ml" +======= +# 87828 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 87184 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 87189 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 87830 "parsing/parser.ml" +||||||| 04da777f7 +# 87821 "parsing/parser.ml" +======= +# 87835 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87835 "parsing/parser.ml" +||||||| 04da777f7 +# 87826 "parsing/parser.ml" +======= +# 87840 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 87199 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87845 "parsing/parser.ml" +||||||| 04da777f7 +# 87836 "parsing/parser.ml" +======= +# 87850 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 87209 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 87215 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87855 "parsing/parser.ml" +||||||| 04da777f7 +# 87846 "parsing/parser.ml" +======= +# 87860 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 87861 "parsing/parser.ml" +||||||| 04da777f7 +# 87852 "parsing/parser.ml" +======= +# 87866 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 87278 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87924 "parsing/parser.ml" +||||||| 04da777f7 +# 87915 "parsing/parser.ml" +======= +# 87929 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 87290 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87936 "parsing/parser.ml" +||||||| 04da777f7 +# 87927 "parsing/parser.ml" +======= +# 87941 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 87300 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 87306 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87946 "parsing/parser.ml" +||||||| 04da777f7 +# 87937 "parsing/parser.ml" +======= +# 87951 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87952 "parsing/parser.ml" +||||||| 04da777f7 +# 87943 "parsing/parser.ml" +======= +# 87957 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87962 "parsing/parser.ml" +||||||| 04da777f7 +# 87953 "parsing/parser.ml" +======= +# 87967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 87323 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 87329 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 87969 "parsing/parser.ml" +||||||| 04da777f7 +# 87960 "parsing/parser.ml" +======= +# 87974 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 87975 "parsing/parser.ml" +||||||| 04da777f7 +# 87966 "parsing/parser.ml" +======= +# 87980 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 87335 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 87981 "parsing/parser.ml" +||||||| 04da777f7 +# 87972 "parsing/parser.ml" +======= +# 87986 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 87346 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 87352 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 87992 "parsing/parser.ml" +||||||| 04da777f7 +# 87983 "parsing/parser.ml" +======= +# 87997 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 87998 "parsing/parser.ml" +||||||| 04da777f7 +# 87989 "parsing/parser.ml" +======= +# 88003 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87362 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88008 "parsing/parser.ml" +||||||| 04da777f7 +# 87999 "parsing/parser.ml" +======= +# 88013 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 87369 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 87374 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 88015 "parsing/parser.ml" +||||||| 04da777f7 +# 88006 "parsing/parser.ml" +======= +# 88020 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88020 "parsing/parser.ml" +||||||| 04da777f7 +# 88011 "parsing/parser.ml" +======= +# 88025 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 87384 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88030 "parsing/parser.ml" +||||||| 04da777f7 +# 88021 "parsing/parser.ml" +======= +# 88035 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 87394 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 87400 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88040 "parsing/parser.ml" +||||||| 04da777f7 +# 88031 "parsing/parser.ml" +======= +# 88045 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88046 "parsing/parser.ml" +||||||| 04da777f7 +# 88037 "parsing/parser.ml" +======= +# 88051 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 87470 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88116 "parsing/parser.ml" +||||||| 04da777f7 +# 88107 "parsing/parser.ml" +======= +# 88121 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 87484 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88130 "parsing/parser.ml" +||||||| 04da777f7 +# 88121 "parsing/parser.ml" +======= +# 88135 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 87495 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 87501 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88141 "parsing/parser.ml" +||||||| 04da777f7 +# 88132 "parsing/parser.ml" +======= +# 88146 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88147 "parsing/parser.ml" +||||||| 04da777f7 +# 88138 "parsing/parser.ml" +======= +# 88152 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87511 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88157 "parsing/parser.ml" +||||||| 04da777f7 +# 88148 "parsing/parser.ml" +======= +# 88162 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 87518 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 87524 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 88164 "parsing/parser.ml" +||||||| 04da777f7 +# 88155 "parsing/parser.ml" +======= +# 88169 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 88170 "parsing/parser.ml" +||||||| 04da777f7 +# 88161 "parsing/parser.ml" +======= +# 88175 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 87530 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88176 "parsing/parser.ml" +||||||| 04da777f7 +# 88167 "parsing/parser.ml" +======= +# 88181 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 87541 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 87547 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88187 "parsing/parser.ml" +||||||| 04da777f7 +# 88178 "parsing/parser.ml" +======= +# 88192 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88193 "parsing/parser.ml" +||||||| 04da777f7 +# 88184 "parsing/parser.ml" +======= +# 88198 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87557 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88203 "parsing/parser.ml" +||||||| 04da777f7 +# 88194 "parsing/parser.ml" +======= +# 88208 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 87564 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 87569 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 88210 "parsing/parser.ml" +||||||| 04da777f7 +# 88201 "parsing/parser.ml" +======= +# 88215 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88215 "parsing/parser.ml" +||||||| 04da777f7 +# 88206 "parsing/parser.ml" +======= +# 88220 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 87579 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88225 "parsing/parser.ml" +||||||| 04da777f7 +# 88216 "parsing/parser.ml" +======= +# 88230 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 87589 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 87595 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88235 "parsing/parser.ml" +||||||| 04da777f7 +# 88226 "parsing/parser.ml" +======= +# 88240 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88241 "parsing/parser.ml" +||||||| 04da777f7 +# 88232 "parsing/parser.ml" +======= +# 88246 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 87658 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88304 "parsing/parser.ml" +||||||| 04da777f7 +# 88295 "parsing/parser.ml" +======= +# 88309 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 87670 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 87675 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 88316 "parsing/parser.ml" +||||||| 04da777f7 +# 88307 "parsing/parser.ml" +======= +# 88321 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 88321 "parsing/parser.ml" +||||||| 04da777f7 +# 88312 "parsing/parser.ml" +======= +# 88326 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87684 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88330 "parsing/parser.ml" +||||||| 04da777f7 +# 88321 "parsing/parser.ml" +======= +# 88335 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 87693 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88339 "parsing/parser.ml" +||||||| 04da777f7 +# 88330 "parsing/parser.ml" +======= +# 88344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 87700 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 88346 "parsing/parser.ml" +||||||| 04da777f7 +# 88337 "parsing/parser.ml" +======= +# 88351 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 87706 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88352 "parsing/parser.ml" +||||||| 04da777f7 +# 88343 "parsing/parser.ml" +======= +# 88357 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 87717 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 87723 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88363 "parsing/parser.ml" +||||||| 04da777f7 +# 88354 "parsing/parser.ml" +======= +# 88368 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88369 "parsing/parser.ml" +||||||| 04da777f7 +# 88360 "parsing/parser.ml" +======= +# 88374 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87733 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88379 "parsing/parser.ml" +||||||| 04da777f7 +# 88370 "parsing/parser.ml" +======= +# 88384 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 87740 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 87745 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 88386 "parsing/parser.ml" +||||||| 04da777f7 +# 88377 "parsing/parser.ml" +======= +# 88391 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88391 "parsing/parser.ml" +||||||| 04da777f7 +# 88382 "parsing/parser.ml" +======= +# 88396 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 87755 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88401 "parsing/parser.ml" +||||||| 04da777f7 +# 88392 "parsing/parser.ml" +======= +# 88406 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 87765 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 87771 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88411 "parsing/parser.ml" +||||||| 04da777f7 +# 88402 "parsing/parser.ml" +======= +# 88416 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88417 "parsing/parser.ml" +||||||| 04da777f7 +# 88408 "parsing/parser.ml" +======= +# 88422 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 87841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88487 "parsing/parser.ml" +||||||| 04da777f7 +# 88478 "parsing/parser.ml" +======= +# 88492 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined2, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 87853 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 87858 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88499 "parsing/parser.ml" +||||||| 04da777f7 +# 88490 "parsing/parser.ml" +======= +# 88504 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 88504 "parsing/parser.ml" +||||||| 04da777f7 +# 88495 "parsing/parser.ml" +======= +# 88509 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88513 "parsing/parser.ml" +||||||| 04da777f7 +# 88504 "parsing/parser.ml" +======= +# 88518 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 87876 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88522 "parsing/parser.ml" +||||||| 04da777f7 +# 88513 "parsing/parser.ml" +======= +# 88527 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 87883 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 88529 "parsing/parser.ml" +||||||| 04da777f7 +# 88520 "parsing/parser.ml" +======= +# 88534 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 87889 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88535 "parsing/parser.ml" +||||||| 04da777f7 +# 88526 "parsing/parser.ml" +======= +# 88540 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 87900 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 87906 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88546 "parsing/parser.ml" +||||||| 04da777f7 +# 88537 "parsing/parser.ml" +======= +# 88551 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88552 "parsing/parser.ml" +||||||| 04da777f7 +# 88543 "parsing/parser.ml" +======= +# 88557 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 87916 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88562 "parsing/parser.ml" +||||||| 04da777f7 +# 88553 "parsing/parser.ml" +======= +# 88567 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 87923 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 87928 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 88569 "parsing/parser.ml" +||||||| 04da777f7 +# 88560 "parsing/parser.ml" +======= +# 88574 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88574 "parsing/parser.ml" +||||||| 04da777f7 +# 88565 "parsing/parser.ml" +======= +# 88579 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 87938 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88584 "parsing/parser.ml" +||||||| 04da777f7 +# 88575 "parsing/parser.ml" +======= +# 88589 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 87948 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 87954 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88594 "parsing/parser.ml" +||||||| 04da777f7 +# 88585 "parsing/parser.ml" +======= +# 88599 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88600 "parsing/parser.ml" +||||||| 04da777f7 +# 88591 "parsing/parser.ml" +======= +# 88605 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 88024 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88670 "parsing/parser.ml" +||||||| 04da777f7 +# 88661 "parsing/parser.ml" +======= +# 88675 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, ty_inlined1, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 88036 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 88682 "parsing/parser.ml" +||||||| 04da777f7 +# 88673 "parsing/parser.ml" +======= +# 88687 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 88046 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 88052 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88692 "parsing/parser.ml" +||||||| 04da777f7 +# 88683 "parsing/parser.ml" +======= +# 88697 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88698 "parsing/parser.ml" +||||||| 04da777f7 +# 88689 "parsing/parser.ml" +======= +# 88703 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88062 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88708 "parsing/parser.ml" +||||||| 04da777f7 +# 88699 "parsing/parser.ml" +======= +# 88713 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 88071 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88717 "parsing/parser.ml" +||||||| 04da777f7 +# 88708 "parsing/parser.ml" +======= +# 88722 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 88078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 88724 "parsing/parser.ml" +||||||| 04da777f7 +# 88715 "parsing/parser.ml" +======= +# 88729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 88084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88730 "parsing/parser.ml" +||||||| 04da777f7 +# 88721 "parsing/parser.ml" +======= +# 88735 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 88095 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 88101 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88741 "parsing/parser.ml" +||||||| 04da777f7 +# 88732 "parsing/parser.ml" +======= +# 88746 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88747 "parsing/parser.ml" +||||||| 04da777f7 +# 88738 "parsing/parser.ml" +======= +# 88752 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88111 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88757 "parsing/parser.ml" +||||||| 04da777f7 +# 88748 "parsing/parser.ml" +======= +# 88762 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 88118 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 88123 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 88764 "parsing/parser.ml" +||||||| 04da777f7 +# 88755 "parsing/parser.ml" +======= +# 88769 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88769 "parsing/parser.ml" +||||||| 04da777f7 +# 88760 "parsing/parser.ml" +======= +# 88774 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 88133 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88779 "parsing/parser.ml" +||||||| 04da777f7 +# 88770 "parsing/parser.ml" +======= +# 88784 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 88143 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 88149 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88789 "parsing/parser.ml" +||||||| 04da777f7 +# 88780 "parsing/parser.ml" +======= +# 88794 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88795 "parsing/parser.ml" +||||||| 04da777f7 +# 88786 "parsing/parser.ml" +======= +# 88800 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 88226 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88872 "parsing/parser.ml" +||||||| 04da777f7 +# 88863 "parsing/parser.ml" +======= +# 88877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, ty_inlined1, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 88240 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88886 "parsing/parser.ml" +||||||| 04da777f7 +# 88877 "parsing/parser.ml" +======= +# 88891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 88251 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 88257 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88897 "parsing/parser.ml" +||||||| 04da777f7 +# 88888 "parsing/parser.ml" +======= +# 88902 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88903 "parsing/parser.ml" +||||||| 04da777f7 +# 88894 "parsing/parser.ml" +======= +# 88908 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88267 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88913 "parsing/parser.ml" +||||||| 04da777f7 +# 88904 "parsing/parser.ml" +======= +# 88918 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 88276 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88922 "parsing/parser.ml" +||||||| 04da777f7 +# 88913 "parsing/parser.ml" +======= +# 88927 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 88283 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 88929 "parsing/parser.ml" +||||||| 04da777f7 +# 88920 "parsing/parser.ml" +======= +# 88934 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 88289 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88935 "parsing/parser.ml" +||||||| 04da777f7 +# 88926 "parsing/parser.ml" +======= +# 88940 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 88300 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 88306 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 88946 "parsing/parser.ml" +||||||| 04da777f7 +# 88937 "parsing/parser.ml" +======= +# 88951 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 88952 "parsing/parser.ml" +||||||| 04da777f7 +# 88943 "parsing/parser.ml" +======= +# 88957 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88962 "parsing/parser.ml" +||||||| 04da777f7 +# 88953 "parsing/parser.ml" +======= +# 88967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let label = + let _1 = +<<<<<<< HEAD +# 4342 "parsing/parser.mly" + ( Labelled label ) +# 88323 "parsing/parser.ml" + in + +# 4347 "parsing/parser.mly" + ( _1 ) +# 88328 "parsing/parser.ml" + + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4361 "parsing/parser.mly" +||||||| 04da777f7 +# 4354 "parsing/parser.mly" +======= +# 4345 "parsing/parser.mly" +>>>>>>> origin/main + ( Labelled label ) +<<<<<<< HEAD +# 88969 "parsing/parser.ml" +||||||| 04da777f7 +# 88960 "parsing/parser.ml" +======= +# 88974 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4366 "parsing/parser.mly" +||||||| 04da777f7 +# 4359 "parsing/parser.mly" +======= +# 4350 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 88974 "parsing/parser.ml" +||||||| 04da777f7 +# 88965 "parsing/parser.ml" +======= +# 88979 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 88338 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88984 "parsing/parser.ml" +||||||| 04da777f7 +# 88975 "parsing/parser.ml" +======= +# 88989 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 88348 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 88354 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 88994 "parsing/parser.ml" +||||||| 04da777f7 +# 88985 "parsing/parser.ml" +======= +# 88999 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89000 "parsing/parser.ml" +||||||| 04da777f7 +# 88991 "parsing/parser.ml" +======= +# 89005 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 88424 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 88429 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89070 "parsing/parser.ml" +||||||| 04da777f7 +# 89061 "parsing/parser.ml" +======= +# 89075 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89075 "parsing/parser.ml" +||||||| 04da777f7 +# 89066 "parsing/parser.ml" +======= +# 89080 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88438 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89084 "parsing/parser.ml" +||||||| 04da777f7 +# 89075 "parsing/parser.ml" +======= +# 89089 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 88445 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89091 "parsing/parser.ml" +||||||| 04da777f7 +# 89082 "parsing/parser.ml" +======= +# 89096 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 88456 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89102 "parsing/parser.ml" +||||||| 04da777f7 +# 89093 "parsing/parser.ml" +======= +# 89107 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 88461 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 88467 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 88473 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89107 "parsing/parser.ml" +||||||| 04da777f7 +# 89098 "parsing/parser.ml" +======= +# 89112 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89113 "parsing/parser.ml" +||||||| 04da777f7 +# 89104 "parsing/parser.ml" +======= +# 89118 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 89119 "parsing/parser.ml" +||||||| 04da777f7 +# 89110 "parsing/parser.ml" +======= +# 89124 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 88483 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 88489 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89129 "parsing/parser.ml" +||||||| 04da777f7 +# 89120 "parsing/parser.ml" +======= +# 89134 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89135 "parsing/parser.ml" +||||||| 04da777f7 +# 89126 "parsing/parser.ml" +======= +# 89140 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 88496 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89142 "parsing/parser.ml" +||||||| 04da777f7 +# 89133 "parsing/parser.ml" +======= +# 89147 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 88503 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89149 "parsing/parser.ml" +||||||| 04da777f7 +# 89140 "parsing/parser.ml" +======= +# 89154 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88512 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 88518 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 89158 "parsing/parser.ml" +||||||| 04da777f7 +# 89149 "parsing/parser.ml" +======= +# 89163 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 89164 "parsing/parser.ml" +||||||| 04da777f7 +# 89155 "parsing/parser.ml" +======= +# 89169 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 88527 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89173 "parsing/parser.ml" +||||||| 04da777f7 +# 89164 "parsing/parser.ml" +======= +# 89178 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 88537 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 88543 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89183 "parsing/parser.ml" +||||||| 04da777f7 +# 89174 "parsing/parser.ml" +======= +# 89188 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89189 "parsing/parser.ml" +||||||| 04da777f7 +# 89180 "parsing/parser.ml" +======= +# 89194 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined1 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 88621 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 88626 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 89267 "parsing/parser.ml" +||||||| 04da777f7 +# 89258 "parsing/parser.ml" +======= +# 89272 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89272 "parsing/parser.ml" +||||||| 04da777f7 +# 89263 "parsing/parser.ml" +======= +# 89277 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88635 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89281 "parsing/parser.ml" +||||||| 04da777f7 +# 89272 "parsing/parser.ml" +======= +# 89286 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 88642 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89288 "parsing/parser.ml" +||||||| 04da777f7 +# 89279 "parsing/parser.ml" +======= +# 89293 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 88653 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89299 "parsing/parser.ml" +||||||| 04da777f7 +# 89290 "parsing/parser.ml" +======= +# 89304 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 88658 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 88664 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 88670 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89304 "parsing/parser.ml" +||||||| 04da777f7 +# 89295 "parsing/parser.ml" +======= +# 89309 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89310 "parsing/parser.ml" +||||||| 04da777f7 +# 89301 "parsing/parser.ml" +======= +# 89315 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 89316 "parsing/parser.ml" +||||||| 04da777f7 +# 89307 "parsing/parser.ml" +======= +# 89321 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 88680 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 88686 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89326 "parsing/parser.ml" +||||||| 04da777f7 +# 89317 "parsing/parser.ml" +======= +# 89331 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89332 "parsing/parser.ml" +||||||| 04da777f7 +# 89323 "parsing/parser.ml" +======= +# 89337 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 88693 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89339 "parsing/parser.ml" +||||||| 04da777f7 +# 89330 "parsing/parser.ml" +======= +# 89344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 88700 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89346 "parsing/parser.ml" +||||||| 04da777f7 +# 89337 "parsing/parser.ml" +======= +# 89351 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88709 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 88715 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 89355 "parsing/parser.ml" +||||||| 04da777f7 +# 89346 "parsing/parser.ml" +======= +# 89360 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 89361 "parsing/parser.ml" +||||||| 04da777f7 +# 89352 "parsing/parser.ml" +======= +# 89366 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 88724 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89370 "parsing/parser.ml" +||||||| 04da777f7 +# 89361 "parsing/parser.ml" +======= +# 89375 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 88734 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 88740 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89380 "parsing/parser.ml" +||||||| 04da777f7 +# 89371 "parsing/parser.ml" +======= +# 89385 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89386 "parsing/parser.ml" +||||||| 04da777f7 +# 89377 "parsing/parser.ml" +======= +# 89391 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 88818 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89464 "parsing/parser.ml" +||||||| 04da777f7 +# 89455 "parsing/parser.ml" +======= +# 89469 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 88828 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 88834 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 89474 "parsing/parser.ml" +||||||| 04da777f7 +# 89465 "parsing/parser.ml" +======= +# 89479 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 89480 "parsing/parser.ml" +||||||| 04da777f7 +# 89471 "parsing/parser.ml" +======= +# 89485 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88844 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89490 "parsing/parser.ml" +||||||| 04da777f7 +# 89481 "parsing/parser.ml" +======= +# 89495 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 88851 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89497 "parsing/parser.ml" +||||||| 04da777f7 +# 89488 "parsing/parser.ml" +======= +# 89502 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 88862 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89508 "parsing/parser.ml" +||||||| 04da777f7 +# 89499 "parsing/parser.ml" +======= +# 89513 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 88867 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 88873 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 88879 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89513 "parsing/parser.ml" +||||||| 04da777f7 +# 89504 "parsing/parser.ml" +======= +# 89518 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89519 "parsing/parser.ml" +||||||| 04da777f7 +# 89510 "parsing/parser.ml" +======= +# 89524 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 89525 "parsing/parser.ml" +||||||| 04da777f7 +# 89516 "parsing/parser.ml" +======= +# 89530 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 88889 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 88895 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89535 "parsing/parser.ml" +||||||| 04da777f7 +# 89526 "parsing/parser.ml" +======= +# 89540 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89541 "parsing/parser.ml" +||||||| 04da777f7 +# 89532 "parsing/parser.ml" +======= +# 89546 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 88902 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89548 "parsing/parser.ml" +||||||| 04da777f7 +# 89539 "parsing/parser.ml" +======= +# 89553 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 88909 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89555 "parsing/parser.ml" +||||||| 04da777f7 +# 89546 "parsing/parser.ml" +======= +# 89560 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 88918 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 88924 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 89564 "parsing/parser.ml" +||||||| 04da777f7 +# 89555 "parsing/parser.ml" +======= +# 89569 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 89570 "parsing/parser.ml" +||||||| 04da777f7 +# 89561 "parsing/parser.ml" +======= +# 89575 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 88933 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89579 "parsing/parser.ml" +||||||| 04da777f7 +# 89570 "parsing/parser.ml" +======= +# 89584 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 88943 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 88949 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89589 "parsing/parser.ml" +||||||| 04da777f7 +# 89580 "parsing/parser.ml" +======= +# 89594 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89595 "parsing/parser.ml" +||||||| 04da777f7 +# 89586 "parsing/parser.ml" +======= +# 89600 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 89036 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 89682 "parsing/parser.ml" +||||||| 04da777f7 +# 89673 "parsing/parser.ml" +======= +# 89687 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 89047 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 89053 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 89693 "parsing/parser.ml" +||||||| 04da777f7 +# 89684 "parsing/parser.ml" +======= +# 89698 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 89699 "parsing/parser.ml" +||||||| 04da777f7 +# 89690 "parsing/parser.ml" +======= +# 89704 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89063 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89709 "parsing/parser.ml" +||||||| 04da777f7 +# 89700 "parsing/parser.ml" +======= +# 89714 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 89070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89716 "parsing/parser.ml" +||||||| 04da777f7 +# 89707 "parsing/parser.ml" +======= +# 89721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 89081 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89727 "parsing/parser.ml" +||||||| 04da777f7 +# 89718 "parsing/parser.ml" +======= +# 89732 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 89086 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 89092 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 89098 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89732 "parsing/parser.ml" +||||||| 04da777f7 +# 89723 "parsing/parser.ml" +======= +# 89737 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89738 "parsing/parser.ml" +||||||| 04da777f7 +# 89729 "parsing/parser.ml" +======= +# 89743 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 89744 "parsing/parser.ml" +||||||| 04da777f7 +# 89735 "parsing/parser.ml" +======= +# 89749 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 89108 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 89114 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89754 "parsing/parser.ml" +||||||| 04da777f7 +# 89745 "parsing/parser.ml" +======= +# 89759 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89760 "parsing/parser.ml" +||||||| 04da777f7 +# 89751 "parsing/parser.ml" +======= +# 89765 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 89121 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89767 "parsing/parser.ml" +||||||| 04da777f7 +# 89758 "parsing/parser.ml" +======= +# 89772 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 89128 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89774 "parsing/parser.ml" +||||||| 04da777f7 +# 89765 "parsing/parser.ml" +======= +# 89779 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89137 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 89143 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 89783 "parsing/parser.ml" +||||||| 04da777f7 +# 89774 "parsing/parser.ml" +======= +# 89788 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 89789 "parsing/parser.ml" +||||||| 04da777f7 +# 89780 "parsing/parser.ml" +======= +# 89794 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 89152 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89798 "parsing/parser.ml" +||||||| 04da777f7 +# 89789 "parsing/parser.ml" +======= +# 89803 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 89162 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 89168 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89808 "parsing/parser.ml" +||||||| 04da777f7 +# 89799 "parsing/parser.ml" +======= +# 89813 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89814 "parsing/parser.ml" +||||||| 04da777f7 +# 89805 "parsing/parser.ml" +======= +# 89819 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 89245 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 89250 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89891 "parsing/parser.ml" +||||||| 04da777f7 +# 89882 "parsing/parser.ml" +======= +# 89896 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89896 "parsing/parser.ml" +||||||| 04da777f7 +# 89887 "parsing/parser.ml" +======= +# 89901 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89259 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89905 "parsing/parser.ml" +||||||| 04da777f7 +# 89896 "parsing/parser.ml" +======= +# 89910 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 89268 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 89914 "parsing/parser.ml" +||||||| 04da777f7 +# 89905 "parsing/parser.ml" +======= +# 89919 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 89280 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89926 "parsing/parser.ml" +||||||| 04da777f7 +# 89917 "parsing/parser.ml" +======= +# 89931 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 89285 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 89291 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 89297 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89931 "parsing/parser.ml" +||||||| 04da777f7 +# 89922 "parsing/parser.ml" +======= +# 89936 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89937 "parsing/parser.ml" +||||||| 04da777f7 +# 89928 "parsing/parser.ml" +======= +# 89942 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 89943 "parsing/parser.ml" +||||||| 04da777f7 +# 89934 "parsing/parser.ml" +======= +# 89948 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 89307 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 89313 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89953 "parsing/parser.ml" +||||||| 04da777f7 +# 89944 "parsing/parser.ml" +======= +# 89958 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 89959 "parsing/parser.ml" +||||||| 04da777f7 +# 89950 "parsing/parser.ml" +======= +# 89964 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 89320 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89966 "parsing/parser.ml" +||||||| 04da777f7 +# 89957 "parsing/parser.ml" +======= +# 89971 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 89327 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 89973 "parsing/parser.ml" +||||||| 04da777f7 +# 89964 "parsing/parser.ml" +======= +# 89978 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89336 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 89342 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 89982 "parsing/parser.ml" +||||||| 04da777f7 +# 89973 "parsing/parser.ml" +======= +# 89987 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 89988 "parsing/parser.ml" +||||||| 04da777f7 +# 89979 "parsing/parser.ml" +======= +# 89993 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 89351 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 89997 "parsing/parser.ml" +||||||| 04da777f7 +# 89988 "parsing/parser.ml" +======= +# 90002 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 89361 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 89367 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90007 "parsing/parser.ml" +||||||| 04da777f7 +# 89998 "parsing/parser.ml" +======= +# 90012 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90013 "parsing/parser.ml" +||||||| 04da777f7 +# 90004 "parsing/parser.ml" +======= +# 90018 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined2 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 89452 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 89457 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90098 "parsing/parser.ml" +||||||| 04da777f7 +# 90089 "parsing/parser.ml" +======= +# 90103 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90103 "parsing/parser.ml" +||||||| 04da777f7 +# 90094 "parsing/parser.ml" +======= +# 90108 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89466 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90112 "parsing/parser.ml" +||||||| 04da777f7 +# 90103 "parsing/parser.ml" +======= +# 90117 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 89475 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90121 "parsing/parser.ml" +||||||| 04da777f7 +# 90112 "parsing/parser.ml" +======= +# 90126 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 89487 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90133 "parsing/parser.ml" +||||||| 04da777f7 +# 90124 "parsing/parser.ml" +======= +# 90138 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 89492 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 89498 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 89504 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90138 "parsing/parser.ml" +||||||| 04da777f7 +# 90129 "parsing/parser.ml" +======= +# 90143 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90144 "parsing/parser.ml" +||||||| 04da777f7 +# 90135 "parsing/parser.ml" +======= +# 90149 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 90150 "parsing/parser.ml" +||||||| 04da777f7 +# 90141 "parsing/parser.ml" +======= +# 90155 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 89514 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 89520 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90160 "parsing/parser.ml" +||||||| 04da777f7 +# 90151 "parsing/parser.ml" +======= +# 90165 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90166 "parsing/parser.ml" +||||||| 04da777f7 +# 90157 "parsing/parser.ml" +======= +# 90171 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 89527 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90173 "parsing/parser.ml" +||||||| 04da777f7 +# 90164 "parsing/parser.ml" +======= +# 90178 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 89534 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90180 "parsing/parser.ml" +||||||| 04da777f7 +# 90171 "parsing/parser.ml" +======= +# 90185 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89543 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 89549 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 90189 "parsing/parser.ml" +||||||| 04da777f7 +# 90180 "parsing/parser.ml" +======= +# 90194 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 90195 "parsing/parser.ml" +||||||| 04da777f7 +# 90186 "parsing/parser.ml" +======= +# 90200 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 89558 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90204 "parsing/parser.ml" +||||||| 04da777f7 +# 90195 "parsing/parser.ml" +======= +# 90209 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 89568 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 89574 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90214 "parsing/parser.ml" +||||||| 04da777f7 +# 90205 "parsing/parser.ml" +======= +# 90219 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90220 "parsing/parser.ml" +||||||| 04da777f7 +# 90211 "parsing/parser.ml" +======= +# 90225 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 89659 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90305 "parsing/parser.ml" +||||||| 04da777f7 +# 90296 "parsing/parser.ml" +======= +# 90310 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 89669 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 89675 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 90315 "parsing/parser.ml" +||||||| 04da777f7 +# 90306 "parsing/parser.ml" +======= +# 90320 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90321 "parsing/parser.ml" +||||||| 04da777f7 +# 90312 "parsing/parser.ml" +======= +# 90326 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89685 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90331 "parsing/parser.ml" +||||||| 04da777f7 +# 90322 "parsing/parser.ml" +======= +# 90336 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 89694 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90340 "parsing/parser.ml" +||||||| 04da777f7 +# 90331 "parsing/parser.ml" +======= +# 90345 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 89706 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90352 "parsing/parser.ml" +||||||| 04da777f7 +# 90343 "parsing/parser.ml" +======= +# 90357 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 89711 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 89717 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 89723 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90357 "parsing/parser.ml" +||||||| 04da777f7 +# 90348 "parsing/parser.ml" +======= +# 90362 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90363 "parsing/parser.ml" +||||||| 04da777f7 +# 90354 "parsing/parser.ml" +======= +# 90368 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 90369 "parsing/parser.ml" +||||||| 04da777f7 +# 90360 "parsing/parser.ml" +======= +# 90374 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 89733 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 89739 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90379 "parsing/parser.ml" +||||||| 04da777f7 +# 90370 "parsing/parser.ml" +======= +# 90384 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90385 "parsing/parser.ml" +||||||| 04da777f7 +# 90376 "parsing/parser.ml" +======= +# 90390 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 89746 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90392 "parsing/parser.ml" +||||||| 04da777f7 +# 90383 "parsing/parser.ml" +======= +# 90397 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 89753 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90399 "parsing/parser.ml" +||||||| 04da777f7 +# 90390 "parsing/parser.ml" +======= +# 90404 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89762 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 89768 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 90408 "parsing/parser.ml" +||||||| 04da777f7 +# 90399 "parsing/parser.ml" +======= +# 90413 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 90414 "parsing/parser.ml" +||||||| 04da777f7 +# 90405 "parsing/parser.ml" +======= +# 90419 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 89777 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90423 "parsing/parser.ml" +||||||| 04da777f7 +# 90414 "parsing/parser.ml" +======= +# 90428 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 89787 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 89793 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90433 "parsing/parser.ml" +||||||| 04da777f7 +# 90424 "parsing/parser.ml" +======= +# 90438 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90439 "parsing/parser.ml" +||||||| 04da777f7 +# 90430 "parsing/parser.ml" +======= +# 90444 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 89887 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90533 "parsing/parser.ml" +||||||| 04da777f7 +# 90524 "parsing/parser.ml" +======= +# 90538 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 89898 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 89904 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 90544 "parsing/parser.ml" +||||||| 04da777f7 +# 90535 "parsing/parser.ml" +======= +# 90549 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90550 "parsing/parser.ml" +||||||| 04da777f7 +# 90541 "parsing/parser.ml" +======= +# 90555 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89914 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90560 "parsing/parser.ml" +||||||| 04da777f7 +# 90551 "parsing/parser.ml" +======= +# 90565 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 89923 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90569 "parsing/parser.ml" +||||||| 04da777f7 +# 90560 "parsing/parser.ml" +======= +# 90574 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 89935 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90581 "parsing/parser.ml" +||||||| 04da777f7 +# 90572 "parsing/parser.ml" +======= +# 90586 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 89940 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 89946 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 89952 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90586 "parsing/parser.ml" +||||||| 04da777f7 +# 90577 "parsing/parser.ml" +======= +# 90591 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90592 "parsing/parser.ml" +||||||| 04da777f7 +# 90583 "parsing/parser.ml" +======= +# 90597 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 90598 "parsing/parser.ml" +||||||| 04da777f7 +# 90589 "parsing/parser.ml" +======= +# 90603 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 89962 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 89968 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90608 "parsing/parser.ml" +||||||| 04da777f7 +# 90599 "parsing/parser.ml" +======= +# 90613 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90614 "parsing/parser.ml" +||||||| 04da777f7 +# 90605 "parsing/parser.ml" +======= +# 90619 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 89975 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90621 "parsing/parser.ml" +||||||| 04da777f7 +# 90612 "parsing/parser.ml" +======= +# 90626 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_) in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 89982 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90628 "parsing/parser.ml" +||||||| 04da777f7 +# 90619 "parsing/parser.ml" +======= +# 90633 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 89991 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 89997 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 90637 "parsing/parser.ml" +||||||| 04da777f7 +# 90628 "parsing/parser.ml" +======= +# 90642 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 90643 "parsing/parser.ml" +||||||| 04da777f7 +# 90634 "parsing/parser.ml" +======= +# 90648 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90006 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90652 "parsing/parser.ml" +||||||| 04da777f7 +# 90643 "parsing/parser.ml" +======= +# 90657 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90016 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90022 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90662 "parsing/parser.ml" +||||||| 04da777f7 +# 90653 "parsing/parser.ml" +======= +# 90667 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90668 "parsing/parser.ml" +||||||| 04da777f7 +# 90659 "parsing/parser.ml" +======= +# 90673 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90065 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90070 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90711 "parsing/parser.ml" +||||||| 04da777f7 +# 90702 "parsing/parser.ml" +======= +# 90716 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90716 "parsing/parser.ml" +||||||| 04da777f7 +# 90707 "parsing/parser.ml" +======= +# 90721 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90079 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90725 "parsing/parser.ml" +||||||| 04da777f7 +# 90716 "parsing/parser.ml" +======= +# 90730 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90086 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 90092 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90732 "parsing/parser.ml" +||||||| 04da777f7 +# 90723 "parsing/parser.ml" +======= +# 90737 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 90738 "parsing/parser.ml" +||||||| 04da777f7 +# 90729 "parsing/parser.ml" +======= +# 90743 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 90098 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90104 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 90744 "parsing/parser.ml" +||||||| 04da777f7 +# 90735 "parsing/parser.ml" +======= +# 90749 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90750 "parsing/parser.ml" +||||||| 04da777f7 +# 90741 "parsing/parser.ml" +======= +# 90755 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90113 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 90119 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 90759 "parsing/parser.ml" +||||||| 04da777f7 +# 90750 "parsing/parser.ml" +======= +# 90764 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 90765 "parsing/parser.ml" +||||||| 04da777f7 +# 90756 "parsing/parser.ml" +======= +# 90770 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90128 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90774 "parsing/parser.ml" +||||||| 04da777f7 +# 90765 "parsing/parser.ml" +======= +# 90779 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90138 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90144 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90784 "parsing/parser.ml" +||||||| 04da777f7 +# 90775 "parsing/parser.ml" +======= +# 90789 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90790 "parsing/parser.ml" +||||||| 04da777f7 +# 90781 "parsing/parser.ml" +======= +# 90795 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _1 : (Mode.t) = Obj.magic _1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 90194 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90199 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90840 "parsing/parser.ml" +||||||| 04da777f7 +# 90831 "parsing/parser.ml" +======= +# 90845 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90845 "parsing/parser.ml" +||||||| 04da777f7 +# 90836 "parsing/parser.ml" +======= +# 90850 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90208 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90854 "parsing/parser.ml" +||||||| 04da777f7 +# 90845 "parsing/parser.ml" +======= +# 90859 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90215 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 90221 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90861 "parsing/parser.ml" +||||||| 04da777f7 +# 90852 "parsing/parser.ml" +======= +# 90866 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 90867 "parsing/parser.ml" +||||||| 04da777f7 +# 90858 "parsing/parser.ml" +======= +# 90872 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 90227 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90233 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 90873 "parsing/parser.ml" +||||||| 04da777f7 +# 90864 "parsing/parser.ml" +======= +# 90878 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90879 "parsing/parser.ml" +||||||| 04da777f7 +# 90870 "parsing/parser.ml" +======= +# 90884 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90242 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 90248 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 90888 "parsing/parser.ml" +||||||| 04da777f7 +# 90879 "parsing/parser.ml" +======= +# 90893 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 90894 "parsing/parser.ml" +||||||| 04da777f7 +# 90885 "parsing/parser.ml" +======= +# 90899 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90257 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90903 "parsing/parser.ml" +||||||| 04da777f7 +# 90894 "parsing/parser.ml" +======= +# 90908 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _startpos__1_ = _startpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90267 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90273 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90913 "parsing/parser.ml" +||||||| 04da777f7 +# 90904 "parsing/parser.ml" +======= +# 90918 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 90919 "parsing/parser.ml" +||||||| 04da777f7 +# 90910 "parsing/parser.ml" +======= +# 90924 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90323 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 90969 "parsing/parser.ml" +||||||| 04da777f7 +# 90960 "parsing/parser.ml" +======= +# 90974 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 90333 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 90339 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 90979 "parsing/parser.ml" +||||||| 04da777f7 +# 90970 "parsing/parser.ml" +======= +# 90984 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 90985 "parsing/parser.ml" +||||||| 04da777f7 +# 90976 "parsing/parser.ml" +======= +# 90990 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90349 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 90995 "parsing/parser.ml" +||||||| 04da777f7 +# 90986 "parsing/parser.ml" +======= +# 91000 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90356 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 90362 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91002 "parsing/parser.ml" +||||||| 04da777f7 +# 90993 "parsing/parser.ml" +======= +# 91007 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 91008 "parsing/parser.ml" +||||||| 04da777f7 +# 90999 "parsing/parser.ml" +======= +# 91013 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 90368 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90374 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91014 "parsing/parser.ml" +||||||| 04da777f7 +# 91005 "parsing/parser.ml" +======= +# 91019 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91020 "parsing/parser.ml" +||||||| 04da777f7 +# 91011 "parsing/parser.ml" +======= +# 91025 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90383 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 90389 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91029 "parsing/parser.ml" +||||||| 04da777f7 +# 91020 "parsing/parser.ml" +======= +# 91034 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 91035 "parsing/parser.ml" +||||||| 04da777f7 +# 91026 "parsing/parser.ml" +======= +# 91040 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90398 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91044 "parsing/parser.ml" +||||||| 04da777f7 +# 91035 "parsing/parser.ml" +======= +# 91049 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90408 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90414 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91054 "parsing/parser.ml" +||||||| 04da777f7 +# 91045 "parsing/parser.ml" +======= +# 91059 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91060 "parsing/parser.ml" +||||||| 04da777f7 +# 91051 "parsing/parser.ml" +======= +# 91065 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 90473 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91119 "parsing/parser.ml" +||||||| 04da777f7 +# 91110 "parsing/parser.ml" +======= +# 91124 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 90484 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 90490 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 91130 "parsing/parser.ml" +||||||| 04da777f7 +# 91121 "parsing/parser.ml" +======= +# 91135 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91136 "parsing/parser.ml" +||||||| 04da777f7 +# 91127 "parsing/parser.ml" +======= +# 91141 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90500 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91146 "parsing/parser.ml" +||||||| 04da777f7 +# 91137 "parsing/parser.ml" +======= +# 91151 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90507 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 90513 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91153 "parsing/parser.ml" +||||||| 04da777f7 +# 91144 "parsing/parser.ml" +======= +# 91158 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 91159 "parsing/parser.ml" +||||||| 04da777f7 +# 91150 "parsing/parser.ml" +======= +# 91164 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 90519 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90525 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91165 "parsing/parser.ml" +||||||| 04da777f7 +# 91156 "parsing/parser.ml" +======= +# 91170 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91171 "parsing/parser.ml" +||||||| 04da777f7 +# 91162 "parsing/parser.ml" +======= +# 91176 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90534 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 90540 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91180 "parsing/parser.ml" +||||||| 04da777f7 +# 91171 "parsing/parser.ml" +======= +# 91185 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 91186 "parsing/parser.ml" +||||||| 04da777f7 +# 91177 "parsing/parser.ml" +======= +# 91191 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90549 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91195 "parsing/parser.ml" +||||||| 04da777f7 +# 91186 "parsing/parser.ml" +======= +# 91200 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90559 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90565 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91205 "parsing/parser.ml" +||||||| 04da777f7 +# 91196 "parsing/parser.ml" +======= +# 91210 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91211 "parsing/parser.ml" +||||||| 04da777f7 +# 91202 "parsing/parser.ml" +======= +# 91216 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90615 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90620 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91261 "parsing/parser.ml" +||||||| 04da777f7 +# 91252 "parsing/parser.ml" +======= +# 91266 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91266 "parsing/parser.ml" +||||||| 04da777f7 +# 91257 "parsing/parser.ml" +======= +# 91271 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90629 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91275 "parsing/parser.ml" +||||||| 04da777f7 +# 91266 "parsing/parser.ml" +======= +# 91280 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 90636 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 90642 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91282 "parsing/parser.ml" +||||||| 04da777f7 +# 91273 "parsing/parser.ml" +======= +# 91287 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 91288 "parsing/parser.ml" +||||||| 04da777f7 +# 91279 "parsing/parser.ml" +======= +# 91293 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 90648 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90654 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91294 "parsing/parser.ml" +||||||| 04da777f7 +# 91285 "parsing/parser.ml" +======= +# 91299 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91300 "parsing/parser.ml" +||||||| 04da777f7 +# 91291 "parsing/parser.ml" +======= +# 91305 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90663 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 90669 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91309 "parsing/parser.ml" +||||||| 04da777f7 +# 91300 "parsing/parser.ml" +======= +# 91314 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 91315 "parsing/parser.ml" +||||||| 04da777f7 +# 91306 "parsing/parser.ml" +======= +# 91320 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90678 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91324 "parsing/parser.ml" +||||||| 04da777f7 +# 91315 "parsing/parser.ml" +======= +# 91329 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90688 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90694 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91334 "parsing/parser.ml" +||||||| 04da777f7 +# 91325 "parsing/parser.ml" +======= +# 91339 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91340 "parsing/parser.ml" +||||||| 04da777f7 +# 91331 "parsing/parser.ml" +======= +# 91345 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 90751 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90756 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91397 "parsing/parser.ml" +||||||| 04da777f7 +# 91388 "parsing/parser.ml" +======= +# 91402 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91402 "parsing/parser.ml" +||||||| 04da777f7 +# 91393 "parsing/parser.ml" +======= +# 91407 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90765 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91411 "parsing/parser.ml" +||||||| 04da777f7 +# 91402 "parsing/parser.ml" +======= +# 91416 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 90772 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 90778 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91418 "parsing/parser.ml" +||||||| 04da777f7 +# 91409 "parsing/parser.ml" +======= +# 91423 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 91424 "parsing/parser.ml" +||||||| 04da777f7 +# 91415 "parsing/parser.ml" +======= +# 91429 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 90784 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90790 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91430 "parsing/parser.ml" +||||||| 04da777f7 +# 91421 "parsing/parser.ml" +======= +# 91435 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91436 "parsing/parser.ml" +||||||| 04da777f7 +# 91427 "parsing/parser.ml" +======= +# 91441 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90799 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 90805 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91445 "parsing/parser.ml" +||||||| 04da777f7 +# 91436 "parsing/parser.ml" +======= +# 91450 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 91451 "parsing/parser.ml" +||||||| 04da777f7 +# 91442 "parsing/parser.ml" +======= +# 91456 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90814 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91460 "parsing/parser.ml" +||||||| 04da777f7 +# 91451 "parsing/parser.ml" +======= +# 91465 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90824 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91470 "parsing/parser.ml" +||||||| 04da777f7 +# 91461 "parsing/parser.ml" +======= +# 91475 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91476 "parsing/parser.ml" +||||||| 04da777f7 +# 91467 "parsing/parser.ml" +======= +# 91481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 90887 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91533 "parsing/parser.ml" +||||||| 04da777f7 +# 91524 "parsing/parser.ml" +======= +# 91538 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 90897 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 90903 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 91543 "parsing/parser.ml" +||||||| 04da777f7 +# 91534 "parsing/parser.ml" +======= +# 91548 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91549 "parsing/parser.ml" +||||||| 04da777f7 +# 91540 "parsing/parser.ml" +======= +# 91554 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91559 "parsing/parser.ml" +||||||| 04da777f7 +# 91550 "parsing/parser.ml" +======= +# 91564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 90920 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 90926 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91566 "parsing/parser.ml" +||||||| 04da777f7 +# 91557 "parsing/parser.ml" +======= +# 91571 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 91572 "parsing/parser.ml" +||||||| 04da777f7 +# 91563 "parsing/parser.ml" +======= +# 91577 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 90932 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 90938 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91578 "parsing/parser.ml" +||||||| 04da777f7 +# 91569 "parsing/parser.ml" +======= +# 91583 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91584 "parsing/parser.ml" +||||||| 04da777f7 +# 91575 "parsing/parser.ml" +======= +# 91589 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 90947 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 90953 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91593 "parsing/parser.ml" +||||||| 04da777f7 +# 91584 "parsing/parser.ml" +======= +# 91598 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 91599 "parsing/parser.ml" +||||||| 04da777f7 +# 91590 "parsing/parser.ml" +======= +# 91604 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 90962 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91608 "parsing/parser.ml" +||||||| 04da777f7 +# 91599 "parsing/parser.ml" +======= +# 91613 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 90972 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 90978 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91618 "parsing/parser.ml" +||||||| 04da777f7 +# 91609 "parsing/parser.ml" +======= +# 91623 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91624 "parsing/parser.ml" +||||||| 04da777f7 +# 91615 "parsing/parser.ml" +======= +# 91629 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1 : (Mode.t) = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 91044 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91690 "parsing/parser.ml" +||||||| 04da777f7 +# 91681 "parsing/parser.ml" +======= +# 91695 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 91055 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 91061 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 91701 "parsing/parser.ml" +||||||| 04da777f7 +# 91692 "parsing/parser.ml" +======= +# 91706 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91707 "parsing/parser.ml" +||||||| 04da777f7 +# 91698 "parsing/parser.ml" +======= +# 91712 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91071 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91717 "parsing/parser.ml" +||||||| 04da777f7 +# 91708 "parsing/parser.ml" +======= +# 91722 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 91078 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 91084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91724 "parsing/parser.ml" +||||||| 04da777f7 +# 91715 "parsing/parser.ml" +======= +# 91729 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 91730 "parsing/parser.ml" +||||||| 04da777f7 +# 91721 "parsing/parser.ml" +======= +# 91735 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 91090 "parsing/parser.ml" + + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 91096 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91736 "parsing/parser.ml" +||||||| 04da777f7 +# 91727 "parsing/parser.ml" +======= +# 91741 "parsing/parser.ml" +>>>>>>> origin/main + + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91742 "parsing/parser.ml" +||||||| 04da777f7 +# 91733 "parsing/parser.ml" +======= +# 91747 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91105 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 91111 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91751 "parsing/parser.ml" +||||||| 04da777f7 +# 91742 "parsing/parser.ml" +======= +# 91756 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 91757 "parsing/parser.ml" +||||||| 04da777f7 +# 91748 "parsing/parser.ml" +======= +# 91762 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 91120 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91766 "parsing/parser.ml" +||||||| 04da777f7 +# 91757 "parsing/parser.ml" +======= +# 91771 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 91130 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 91136 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91776 "parsing/parser.ml" +||||||| 04da777f7 +# 91767 "parsing/parser.ml" +======= +# 91781 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91782 "parsing/parser.ml" +||||||| 04da777f7 +# 91773 "parsing/parser.ml" +======= +# 91787 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 91213 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 91218 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91859 "parsing/parser.ml" +||||||| 04da777f7 +# 91850 "parsing/parser.ml" +======= +# 91864 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91864 "parsing/parser.ml" +||||||| 04da777f7 +# 91855 "parsing/parser.ml" +======= +# 91869 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91227 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91873 "parsing/parser.ml" +||||||| 04da777f7 +# 91864 "parsing/parser.ml" +======= +# 91878 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 91234 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 91880 "parsing/parser.ml" +||||||| 04da777f7 +# 91871 "parsing/parser.ml" +======= +# 91885 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 91246 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91892 "parsing/parser.ml" +||||||| 04da777f7 +# 91883 "parsing/parser.ml" +======= +# 91897 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 91251 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 91257 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 91263 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91897 "parsing/parser.ml" +||||||| 04da777f7 +# 91888 "parsing/parser.ml" +======= +# 91902 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91903 "parsing/parser.ml" +||||||| 04da777f7 +# 91894 "parsing/parser.ml" +======= +# 91908 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 91909 "parsing/parser.ml" +||||||| 04da777f7 +# 91900 "parsing/parser.ml" +======= +# 91914 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 91273 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 91279 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91919 "parsing/parser.ml" +||||||| 04da777f7 +# 91910 "parsing/parser.ml" +======= +# 91924 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91925 "parsing/parser.ml" +||||||| 04da777f7 +# 91916 "parsing/parser.ml" +======= +# 91930 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 91286 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91932 "parsing/parser.ml" +||||||| 04da777f7 +# 91923 "parsing/parser.ml" +======= +# 91937 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 91298 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 91304 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 91944 "parsing/parser.ml" +||||||| 04da777f7 +# 91935 "parsing/parser.ml" +======= +# 91949 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 91950 "parsing/parser.ml" +||||||| 04da777f7 +# 91941 "parsing/parser.ml" +======= +# 91955 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91314 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 91320 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 91960 "parsing/parser.ml" +||||||| 04da777f7 +# 91951 "parsing/parser.ml" +======= +# 91965 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 91966 "parsing/parser.ml" +||||||| 04da777f7 +# 91957 "parsing/parser.ml" +======= +# 91971 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 91329 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91975 "parsing/parser.ml" +||||||| 04da777f7 +# 91966 "parsing/parser.ml" +======= +# 91980 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 91339 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 91345 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 91985 "parsing/parser.ml" +||||||| 04da777f7 +# 91976 "parsing/parser.ml" +======= +# 91990 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 91991 "parsing/parser.ml" +||||||| 04da777f7 +# 91982 "parsing/parser.ml" +======= +# 91996 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined2 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 91430 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 91435 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92076 "parsing/parser.ml" +||||||| 04da777f7 +# 92067 "parsing/parser.ml" +======= +# 92081 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92081 "parsing/parser.ml" +||||||| 04da777f7 +# 92072 "parsing/parser.ml" +======= +# 92086 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91444 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92090 "parsing/parser.ml" +||||||| 04da777f7 +# 92081 "parsing/parser.ml" +======= +# 92095 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 91451 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92097 "parsing/parser.ml" +||||||| 04da777f7 +# 92088 "parsing/parser.ml" +======= +# 92102 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 91463 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92109 "parsing/parser.ml" +||||||| 04da777f7 +# 92100 "parsing/parser.ml" +======= +# 92114 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 91468 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 91474 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 91480 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92114 "parsing/parser.ml" +||||||| 04da777f7 +# 92105 "parsing/parser.ml" +======= +# 92119 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92120 "parsing/parser.ml" +||||||| 04da777f7 +# 92111 "parsing/parser.ml" +======= +# 92125 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 92126 "parsing/parser.ml" +||||||| 04da777f7 +# 92117 "parsing/parser.ml" +======= +# 92131 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 91490 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 91496 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92136 "parsing/parser.ml" +||||||| 04da777f7 +# 92127 "parsing/parser.ml" +======= +# 92141 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92142 "parsing/parser.ml" +||||||| 04da777f7 +# 92133 "parsing/parser.ml" +======= +# 92147 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 91503 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92149 "parsing/parser.ml" +||||||| 04da777f7 +# 92140 "parsing/parser.ml" +======= +# 92154 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 91515 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 91521 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 92161 "parsing/parser.ml" +||||||| 04da777f7 +# 92152 "parsing/parser.ml" +======= +# 92166 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92167 "parsing/parser.ml" +||||||| 04da777f7 +# 92158 "parsing/parser.ml" +======= +# 92172 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91531 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 91537 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 92177 "parsing/parser.ml" +||||||| 04da777f7 +# 92168 "parsing/parser.ml" +======= +# 92182 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 92183 "parsing/parser.ml" +||||||| 04da777f7 +# 92174 "parsing/parser.ml" +======= +# 92188 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 91546 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92192 "parsing/parser.ml" +||||||| 04da777f7 +# 92183 "parsing/parser.ml" +======= +# 92197 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 91556 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 91562 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92202 "parsing/parser.ml" +||||||| 04da777f7 +# 92193 "parsing/parser.ml" +======= +# 92207 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92208 "parsing/parser.ml" +||||||| 04da777f7 +# 92199 "parsing/parser.ml" +======= +# 92213 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 91647 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92293 "parsing/parser.ml" +||||||| 04da777f7 +# 92284 "parsing/parser.ml" +======= +# 92298 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 91657 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 91663 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 92303 "parsing/parser.ml" +||||||| 04da777f7 +# 92294 "parsing/parser.ml" +======= +# 92308 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92309 "parsing/parser.ml" +||||||| 04da777f7 +# 92300 "parsing/parser.ml" +======= +# 92314 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92319 "parsing/parser.ml" +||||||| 04da777f7 +# 92310 "parsing/parser.ml" +======= +# 92324 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 91680 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92326 "parsing/parser.ml" +||||||| 04da777f7 +# 92317 "parsing/parser.ml" +======= +# 92331 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 91692 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92338 "parsing/parser.ml" +||||||| 04da777f7 +# 92329 "parsing/parser.ml" +======= +# 92343 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 91697 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 91703 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 91709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92343 "parsing/parser.ml" +||||||| 04da777f7 +# 92334 "parsing/parser.ml" +======= +# 92348 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92349 "parsing/parser.ml" +||||||| 04da777f7 +# 92340 "parsing/parser.ml" +======= +# 92354 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 92355 "parsing/parser.ml" +||||||| 04da777f7 +# 92346 "parsing/parser.ml" +======= +# 92360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 91719 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 91725 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92365 "parsing/parser.ml" +||||||| 04da777f7 +# 92356 "parsing/parser.ml" +======= +# 92370 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92371 "parsing/parser.ml" +||||||| 04da777f7 +# 92362 "parsing/parser.ml" +======= +# 92376 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 91732 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92378 "parsing/parser.ml" +||||||| 04da777f7 +# 92369 "parsing/parser.ml" +======= +# 92383 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 91744 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 91750 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 92390 "parsing/parser.ml" +||||||| 04da777f7 +# 92381 "parsing/parser.ml" +======= +# 92395 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92396 "parsing/parser.ml" +||||||| 04da777f7 +# 92387 "parsing/parser.ml" +======= +# 92401 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91760 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 91766 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 92406 "parsing/parser.ml" +||||||| 04da777f7 +# 92397 "parsing/parser.ml" +======= +# 92411 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 92412 "parsing/parser.ml" +||||||| 04da777f7 +# 92403 "parsing/parser.ml" +======= +# 92417 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 91775 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92421 "parsing/parser.ml" +||||||| 04da777f7 +# 92412 "parsing/parser.ml" +======= +# 92426 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 91785 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 91791 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92431 "parsing/parser.ml" +||||||| 04da777f7 +# 92422 "parsing/parser.ml" +======= +# 92436 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92437 "parsing/parser.ml" +||||||| 04da777f7 +# 92428 "parsing/parser.ml" +======= +# 92442 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 91885 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92531 "parsing/parser.ml" +||||||| 04da777f7 +# 92522 "parsing/parser.ml" +======= +# 92536 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 91896 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 91902 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 92542 "parsing/parser.ml" +||||||| 04da777f7 +# 92533 "parsing/parser.ml" +======= +# 92547 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92548 "parsing/parser.ml" +||||||| 04da777f7 +# 92539 "parsing/parser.ml" +======= +# 92553 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91912 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92558 "parsing/parser.ml" +||||||| 04da777f7 +# 92549 "parsing/parser.ml" +======= +# 92563 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 91919 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92565 "parsing/parser.ml" +||||||| 04da777f7 +# 92556 "parsing/parser.ml" +======= +# 92570 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 91931 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92577 "parsing/parser.ml" +||||||| 04da777f7 +# 92568 "parsing/parser.ml" +======= +# 92582 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 91936 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 91942 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 91948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92582 "parsing/parser.ml" +||||||| 04da777f7 +# 92573 "parsing/parser.ml" +======= +# 92587 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92588 "parsing/parser.ml" +||||||| 04da777f7 +# 92579 "parsing/parser.ml" +======= +# 92593 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 92594 "parsing/parser.ml" +||||||| 04da777f7 +# 92585 "parsing/parser.ml" +======= +# 92599 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 91958 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 91964 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92604 "parsing/parser.ml" +||||||| 04da777f7 +# 92595 "parsing/parser.ml" +======= +# 92609 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92610 "parsing/parser.ml" +||||||| 04da777f7 +# 92601 "parsing/parser.ml" +======= +# 92615 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 91971 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92617 "parsing/parser.ml" +||||||| 04da777f7 +# 92608 "parsing/parser.ml" +======= +# 92622 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 91983 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 91989 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 92629 "parsing/parser.ml" +||||||| 04da777f7 +# 92620 "parsing/parser.ml" +======= +# 92634 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92635 "parsing/parser.ml" +||||||| 04da777f7 +# 92626 "parsing/parser.ml" +======= +# 92640 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 91999 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 92005 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 92645 "parsing/parser.ml" +||||||| 04da777f7 +# 92636 "parsing/parser.ml" +======= +# 92650 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 92651 "parsing/parser.ml" +||||||| 04da777f7 +# 92642 "parsing/parser.ml" +======= +# 92656 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 92014 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92660 "parsing/parser.ml" +||||||| 04da777f7 +# 92651 "parsing/parser.ml" +======= +# 92665 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 92024 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 92030 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92670 "parsing/parser.ml" +||||||| 04da777f7 +# 92661 "parsing/parser.ml" +======= +# 92675 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92676 "parsing/parser.ml" +||||||| 04da777f7 +# 92667 "parsing/parser.ml" +======= +# 92681 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 92114 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 92119 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92760 "parsing/parser.ml" +||||||| 04da777f7 +# 92751 "parsing/parser.ml" +======= +# 92765 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92765 "parsing/parser.ml" +||||||| 04da777f7 +# 92756 "parsing/parser.ml" +======= +# 92770 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92128 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92774 "parsing/parser.ml" +||||||| 04da777f7 +# 92765 "parsing/parser.ml" +======= +# 92779 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 92137 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92783 "parsing/parser.ml" +||||||| 04da777f7 +# 92774 "parsing/parser.ml" +======= +# 92788 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 92150 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92796 "parsing/parser.ml" +||||||| 04da777f7 +# 92787 "parsing/parser.ml" +======= +# 92801 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 92155 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 92161 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 92167 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92801 "parsing/parser.ml" +||||||| 04da777f7 +# 92792 "parsing/parser.ml" +======= +# 92806 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92807 "parsing/parser.ml" +||||||| 04da777f7 +# 92798 "parsing/parser.ml" +======= +# 92812 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 92813 "parsing/parser.ml" +||||||| 04da777f7 +# 92804 "parsing/parser.ml" +======= +# 92818 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 92177 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 92183 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92823 "parsing/parser.ml" +||||||| 04da777f7 +# 92814 "parsing/parser.ml" +======= +# 92828 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92829 "parsing/parser.ml" +||||||| 04da777f7 +# 92820 "parsing/parser.ml" +======= +# 92834 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 92190 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92836 "parsing/parser.ml" +||||||| 04da777f7 +# 92827 "parsing/parser.ml" +======= +# 92841 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 92202 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 92208 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 92848 "parsing/parser.ml" +||||||| 04da777f7 +# 92839 "parsing/parser.ml" +======= +# 92853 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92854 "parsing/parser.ml" +||||||| 04da777f7 +# 92845 "parsing/parser.ml" +======= +# 92859 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92218 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 92224 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 92864 "parsing/parser.ml" +||||||| 04da777f7 +# 92855 "parsing/parser.ml" +======= +# 92869 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 92870 "parsing/parser.ml" +||||||| 04da777f7 +# 92861 "parsing/parser.ml" +======= +# 92875 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 92233 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92879 "parsing/parser.ml" +||||||| 04da777f7 +# 92870 "parsing/parser.ml" +======= +# 92884 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 92243 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 92249 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 92889 "parsing/parser.ml" +||||||| 04da777f7 +# 92880 "parsing/parser.ml" +======= +# 92894 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 92895 "parsing/parser.ml" +||||||| 04da777f7 +# 92886 "parsing/parser.ml" +======= +# 92900 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let _1 = _1_inlined3 in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 92341 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 92346 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 92987 "parsing/parser.ml" +||||||| 04da777f7 +# 92978 "parsing/parser.ml" +======= +# 92992 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 92992 "parsing/parser.ml" +||||||| 04da777f7 +# 92983 "parsing/parser.ml" +======= +# 92997 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92355 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93001 "parsing/parser.ml" +||||||| 04da777f7 +# 92992 "parsing/parser.ml" +======= +# 93006 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 92364 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93010 "parsing/parser.ml" +||||||| 04da777f7 +# 93001 "parsing/parser.ml" +======= +# 93015 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 92377 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93023 "parsing/parser.ml" +||||||| 04da777f7 +# 93014 "parsing/parser.ml" +======= +# 93028 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 92382 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 92388 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 92394 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93028 "parsing/parser.ml" +||||||| 04da777f7 +# 93019 "parsing/parser.ml" +======= +# 93033 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93034 "parsing/parser.ml" +||||||| 04da777f7 +# 93025 "parsing/parser.ml" +======= +# 93039 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 93040 "parsing/parser.ml" +||||||| 04da777f7 +# 93031 "parsing/parser.ml" +======= +# 93045 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 92404 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 92410 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93050 "parsing/parser.ml" +||||||| 04da777f7 +# 93041 "parsing/parser.ml" +======= +# 93055 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93056 "parsing/parser.ml" +||||||| 04da777f7 +# 93047 "parsing/parser.ml" +======= +# 93061 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 92417 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93063 "parsing/parser.ml" +||||||| 04da777f7 +# 93054 "parsing/parser.ml" +======= +# 93068 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 92429 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 92435 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93075 "parsing/parser.ml" +||||||| 04da777f7 +# 93066 "parsing/parser.ml" +======= +# 93080 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93081 "parsing/parser.ml" +||||||| 04da777f7 +# 93072 "parsing/parser.ml" +======= +# 93086 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92445 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 92451 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 93091 "parsing/parser.ml" +||||||| 04da777f7 +# 93082 "parsing/parser.ml" +======= +# 93096 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 93097 "parsing/parser.ml" +||||||| 04da777f7 +# 93088 "parsing/parser.ml" +======= +# 93102 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 92460 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93106 "parsing/parser.ml" +||||||| 04da777f7 +# 93097 "parsing/parser.ml" +======= +# 93111 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 92470 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 92476 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93116 "parsing/parser.ml" +||||||| 04da777f7 +# 93107 "parsing/parser.ml" +======= +# 93121 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93122 "parsing/parser.ml" +||||||| 04da777f7 +# 93113 "parsing/parser.ml" +======= +# 93127 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined3 : (Mode.Const.t list) = Obj.magic _1_inlined3 in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 92568 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93214 "parsing/parser.ml" +||||||| 04da777f7 +# 93205 "parsing/parser.ml" +======= +# 93219 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 92578 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 92584 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93224 "parsing/parser.ml" +||||||| 04da777f7 +# 93215 "parsing/parser.ml" +======= +# 93229 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93230 "parsing/parser.ml" +||||||| 04da777f7 +# 93221 "parsing/parser.ml" +======= +# 93235 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92594 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93240 "parsing/parser.ml" +||||||| 04da777f7 +# 93231 "parsing/parser.ml" +======= +# 93245 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 92603 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93249 "parsing/parser.ml" +||||||| 04da777f7 +# 93240 "parsing/parser.ml" +======= +# 93254 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 92616 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93262 "parsing/parser.ml" +||||||| 04da777f7 +# 93253 "parsing/parser.ml" +======= +# 93267 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 92621 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 92627 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 92633 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93267 "parsing/parser.ml" +||||||| 04da777f7 +# 93258 "parsing/parser.ml" +======= +# 93272 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93273 "parsing/parser.ml" +||||||| 04da777f7 +# 93264 "parsing/parser.ml" +======= +# 93278 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 93279 "parsing/parser.ml" +||||||| 04da777f7 +# 93270 "parsing/parser.ml" +======= +# 93284 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 92643 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 92649 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93289 "parsing/parser.ml" +||||||| 04da777f7 +# 93280 "parsing/parser.ml" +======= +# 93294 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93295 "parsing/parser.ml" +||||||| 04da777f7 +# 93286 "parsing/parser.ml" +======= +# 93300 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 92656 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93302 "parsing/parser.ml" +||||||| 04da777f7 +# 93293 "parsing/parser.ml" +======= +# 93307 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 92668 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 92674 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93314 "parsing/parser.ml" +||||||| 04da777f7 +# 93305 "parsing/parser.ml" +======= +# 93319 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93320 "parsing/parser.ml" +||||||| 04da777f7 +# 93311 "parsing/parser.ml" +======= +# 93325 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92684 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 92690 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 93330 "parsing/parser.ml" +||||||| 04da777f7 +# 93321 "parsing/parser.ml" +======= +# 93335 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 93336 "parsing/parser.ml" +||||||| 04da777f7 +# 93327 "parsing/parser.ml" +======= +# 93341 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 92699 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93345 "parsing/parser.ml" +||||||| 04da777f7 +# 93336 "parsing/parser.ml" +======= +# 93350 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 92709 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 92715 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93355 "parsing/parser.ml" +||||||| 04da777f7 +# 93346 "parsing/parser.ml" +======= +# 93360 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93361 "parsing/parser.ml" +||||||| 04da777f7 +# 93352 "parsing/parser.ml" +======= +# 93366 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = inner_type; + MenhirLib.EngineTypes.startp = _startpos_inner_type_; + MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3_inlined1; + MenhirLib.EngineTypes.startp = _startpos__3_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__3_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Mode.t) = Obj.magic _1_inlined4 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined3 : (Mode.Const.t list) = Obj.magic _1_inlined3 in + let _3 : unit = Obj.magic _3 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let _3_inlined1 : unit = Obj.magic _3_inlined1 in + let xs : ((Asttypes.label Asttypes.loc * Jane_syntax.Jkind.annotation option) list) = Obj.magic xs in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos__1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined4, _1_inlined3) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 92816 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93462 "parsing/parser.ml" +||||||| 04da777f7 +# 93453 "parsing/parser.ml" +======= +# 93467 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 92827 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 92833 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93473 "parsing/parser.ml" +||||||| 04da777f7 +# 93464 "parsing/parser.ml" +======= +# 93478 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93479 "parsing/parser.ml" +||||||| 04da777f7 +# 93470 "parsing/parser.ml" +======= +# 93484 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92843 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93489 "parsing/parser.ml" +||||||| 04da777f7 +# 93480 "parsing/parser.ml" +======= +# 93494 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined2 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 92852 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93498 "parsing/parser.ml" +||||||| 04da777f7 +# 93489 "parsing/parser.ml" +======= +# 93503 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _startpos__1_ = _startpos__1_inlined1_ in + let _1 = + let _1 = + let _1 = + let bound_vars = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 92865 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93511 "parsing/parser.ml" +||||||| 04da777f7 +# 93502 "parsing/parser.ml" +======= +# 93516 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1300 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 92870 "parsing/parser.ml" + + in + +# 4185 "parsing/parser.mly" + ( _1 ) +# 92876 "parsing/parser.ml" + + in + +# 4427 "parsing/parser.mly" + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +# 92882 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93516 "parsing/parser.ml" +||||||| 04da777f7 +# 93507 "parsing/parser.ml" +======= +# 93521 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4204 "parsing/parser.mly" +||||||| 04da777f7 +# 4197 "parsing/parser.mly" +======= +# 4188 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93522 "parsing/parser.ml" +||||||| 04da777f7 +# 93513 "parsing/parser.ml" +======= +# 93527 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4431 "parsing/parser.mly" +||||||| 04da777f7 +# 4424 "parsing/parser.mly" +======= +# 4415 "parsing/parser.mly" +>>>>>>> origin/main + ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) +<<<<<<< HEAD +# 93528 "parsing/parser.ml" +||||||| 04da777f7 +# 93519 "parsing/parser.ml" +======= +# 93533 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1259 "parsing/parser.mly" + ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) +<<<<<<< HEAD +# 92892 "parsing/parser.ml" + + in + +# 4429 "parsing/parser.mly" + ( _1 ) +# 92898 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93538 "parsing/parser.ml" +||||||| 04da777f7 +# 93529 "parsing/parser.ml" +======= +# 93543 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4433 "parsing/parser.mly" +||||||| 04da777f7 +# 4426 "parsing/parser.mly" +======= +# 4417 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93544 "parsing/parser.ml" +||||||| 04da777f7 +# 93535 "parsing/parser.ml" +======= +# 93549 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__5_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 92905 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93551 "parsing/parser.ml" +||||||| 04da777f7 +# 93542 "parsing/parser.ml" +======= +# 93556 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos_ty_, _startpos_ty_) = (_endpos__5_, _startpos__1_inlined1_) in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 92917 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 92923 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93563 "parsing/parser.ml" +||||||| 04da777f7 +# 93554 "parsing/parser.ml" +======= +# 93568 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93569 "parsing/parser.ml" +||||||| 04da777f7 +# 93560 "parsing/parser.ml" +======= +# 93574 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 92933 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 92939 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 93579 "parsing/parser.ml" +||||||| 04da777f7 +# 93570 "parsing/parser.ml" +======= +# 93584 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 93585 "parsing/parser.ml" +||||||| 04da777f7 +# 93576 "parsing/parser.ml" +======= +# 93590 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 92948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93594 "parsing/parser.ml" +||||||| 04da777f7 +# 93585 "parsing/parser.ml" +======= +# 93599 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined4_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 92958 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 92964 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93604 "parsing/parser.ml" +||||||| 04da777f7 +# 93595 "parsing/parser.ml" +======= +# 93609 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93610 "parsing/parser.ml" +||||||| 04da777f7 +# 93601 "parsing/parser.ml" +======= +# 93615 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60499,20 +181829,358 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4695 "parsing/parser.mly" - ( "when" ) -# 60516 "parsing/parser.ml" + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93014 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 93019 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93660 "parsing/parser.ml" +||||||| 04da777f7 +# 93651 "parsing/parser.ml" +======= +# 93665 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93665 "parsing/parser.ml" +||||||| 04da777f7 +# 93656 "parsing/parser.ml" +======= +# 93670 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93028 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93674 "parsing/parser.ml" +||||||| 04da777f7 +# 93665 "parsing/parser.ml" +======= +# 93679 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93035 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 93041 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93681 "parsing/parser.ml" +||||||| 04da777f7 +# 93672 "parsing/parser.ml" +======= +# 93686 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 93687 "parsing/parser.ml" +||||||| 04da777f7 +# 93678 "parsing/parser.ml" +======= +# 93692 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 93047 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93693 "parsing/parser.ml" +||||||| 04da777f7 +# 93684 "parsing/parser.ml" +======= +# 93698 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93058 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93064 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93704 "parsing/parser.ml" +||||||| 04da777f7 +# 93695 "parsing/parser.ml" +======= +# 93709 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93710 "parsing/parser.ml" +||||||| 04da777f7 +# 93701 "parsing/parser.ml" +======= +# 93715 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93074 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 93080 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 93720 "parsing/parser.ml" +||||||| 04da777f7 +# 93711 "parsing/parser.ml" +======= +# 93725 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 93726 "parsing/parser.ml" +||||||| 04da777f7 +# 93717 "parsing/parser.ml" +======= +# 93731 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 93089 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93735 "parsing/parser.ml" +||||||| 04da777f7 +# 93726 "parsing/parser.ml" +======= +# 93740 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 93099 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 93105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93745 "parsing/parser.ml" +||||||| 04da777f7 +# 93736 "parsing/parser.ml" +======= +# 93750 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93751 "parsing/parser.ml" +||||||| 04da777f7 +# 93742 "parsing/parser.ml" +======= +# 93756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60524,20 +182192,365 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4696 "parsing/parser.mly" - ( "while" ) -# 60541 "parsing/parser.ml" + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 93162 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 93167 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93808 "parsing/parser.ml" +||||||| 04da777f7 +# 93799 "parsing/parser.ml" +======= +# 93813 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93813 "parsing/parser.ml" +||||||| 04da777f7 +# 93804 "parsing/parser.ml" +======= +# 93818 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93176 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93822 "parsing/parser.ml" +||||||| 04da777f7 +# 93813 "parsing/parser.ml" +======= +# 93827 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93183 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 93189 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93829 "parsing/parser.ml" +||||||| 04da777f7 +# 93820 "parsing/parser.ml" +======= +# 93834 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 93835 "parsing/parser.ml" +||||||| 04da777f7 +# 93826 "parsing/parser.ml" +======= +# 93840 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 93195 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93841 "parsing/parser.ml" +||||||| 04da777f7 +# 93832 "parsing/parser.ml" +======= +# 93846 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93206 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93212 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93852 "parsing/parser.ml" +||||||| 04da777f7 +# 93843 "parsing/parser.ml" +======= +# 93857 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93858 "parsing/parser.ml" +||||||| 04da777f7 +# 93849 "parsing/parser.ml" +======= +# 93863 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93222 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 93228 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 93868 "parsing/parser.ml" +||||||| 04da777f7 +# 93859 "parsing/parser.ml" +======= +# 93873 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 93874 "parsing/parser.ml" +||||||| 04da777f7 +# 93865 "parsing/parser.ml" +======= +# 93879 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 93237 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93883 "parsing/parser.ml" +||||||| 04da777f7 +# 93874 "parsing/parser.ml" +======= +# 93888 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 93247 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 93253 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93893 "parsing/parser.ml" +||||||| 04da777f7 +# 93884 "parsing/parser.ml" +======= +# 93898 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 93899 "parsing/parser.ml" +||||||| 04da777f7 +# 93890 "parsing/parser.ml" +======= +# 93904 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60549,20 +182562,396 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4697 "parsing/parser.mly" - ( "with" ) -# 60566 "parsing/parser.ml" + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93310 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93956 "parsing/parser.ml" +||||||| 04da777f7 +# 93947 "parsing/parser.ml" +======= +# 93961 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93320 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93326 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 93966 "parsing/parser.ml" +||||||| 04da777f7 +# 93957 "parsing/parser.ml" +======= +# 93971 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 93972 "parsing/parser.ml" +||||||| 04da777f7 +# 93963 "parsing/parser.ml" +======= +# 93977 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93336 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 93982 "parsing/parser.ml" +||||||| 04da777f7 +# 93973 "parsing/parser.ml" +======= +# 93987 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93343 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 93349 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 93989 "parsing/parser.ml" +||||||| 04da777f7 +# 93980 "parsing/parser.ml" +======= +# 93994 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 93995 "parsing/parser.ml" +||||||| 04da777f7 +# 93986 "parsing/parser.ml" +======= +# 94000 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 93355 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94001 "parsing/parser.ml" +||||||| 04da777f7 +# 93992 "parsing/parser.ml" +======= +# 94006 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93366 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93372 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94012 "parsing/parser.ml" +||||||| 04da777f7 +# 94003 "parsing/parser.ml" +======= +# 94017 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94018 "parsing/parser.ml" +||||||| 04da777f7 +# 94009 "parsing/parser.ml" +======= +# 94023 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93382 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 93388 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 94028 "parsing/parser.ml" +||||||| 04da777f7 +# 94019 "parsing/parser.ml" +======= +# 94033 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 94034 "parsing/parser.ml" +||||||| 04da777f7 +# 94025 "parsing/parser.ml" +======= +# 94039 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 93397 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94043 "parsing/parser.ml" +||||||| 04da777f7 +# 94034 "parsing/parser.ml" +======= +# 94048 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 93407 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 93413 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94053 "parsing/parser.ml" +||||||| 04da777f7 +# 94044 "parsing/parser.ml" +======= +# 94058 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 94059 "parsing/parser.ml" +||||||| 04da777f7 +# 94050 "parsing/parser.ml" +======= +# 94064 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60574,20 +182963,406 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.type_exception * string Location.loc option) = Obj.magic _1 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.type_exception * string Location.loc option) = -# 3845 "parsing/parser.mly" + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 93479 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94125 "parsing/parser.ml" +||||||| 04da777f7 +# 94116 "parsing/parser.ml" +======= +# 94130 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93490 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93496 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94136 "parsing/parser.ml" +||||||| 04da777f7 +# 94127 "parsing/parser.ml" +======= +# 94141 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94142 "parsing/parser.ml" +||||||| 04da777f7 +# 94133 "parsing/parser.ml" +======= +# 94147 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93506 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94152 "parsing/parser.ml" +||||||| 04da777f7 +# 94143 "parsing/parser.ml" +======= +# 94157 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93513 "parsing/parser.ml" + in + let ty = + let _1 = +# 4431 "parsing/parser.mly" + ( ty ) +# 93519 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 94159 "parsing/parser.ml" +||||||| 04da777f7 +# 94150 "parsing/parser.ml" +======= +# 94164 "parsing/parser.ml" +>>>>>>> origin/main + in + let ty = + let _1 = +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 94165 "parsing/parser.ml" +||||||| 04da777f7 +# 94156 "parsing/parser.ml" +======= +# 94170 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 93525 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94171 "parsing/parser.ml" +||||||| 04da777f7 +# 94162 "parsing/parser.ml" +======= +# 94176 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93536 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93542 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94182 "parsing/parser.ml" +||||||| 04da777f7 +# 94173 "parsing/parser.ml" +======= +# 94187 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94188 "parsing/parser.ml" +||||||| 04da777f7 +# 94179 "parsing/parser.ml" +======= +# 94193 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93552 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 93558 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 94198 "parsing/parser.ml" +||||||| 04da777f7 +# 94189 "parsing/parser.ml" +======= +# 94203 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 94204 "parsing/parser.ml" +||||||| 04da777f7 +# 94195 "parsing/parser.ml" +======= +# 94209 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 93567 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94213 "parsing/parser.ml" +||||||| 04da777f7 +# 94204 "parsing/parser.ml" +======= +# 94218 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 93577 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 93583 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94223 "parsing/parser.ml" +||||||| 04da777f7 +# 94214 "parsing/parser.ml" +======= +# 94228 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 60591 "parsing/parser.ml" +<<<<<<< HEAD +# 94229 "parsing/parser.ml" +||||||| 04da777f7 +# 94220 "parsing/parser.ml" +======= +# 94234 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60600,155 +183375,367 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (string) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined5_ in - let _v : (Parsetree.type_exception * string Location.loc option) = let attrs = - let _1 = _1_inlined5 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 60667 "parsing/parser.ml" - - in - let _endpos_attrs_ = _endpos__1_inlined5_ in - let attrs2 = - let _1 = _1_inlined4 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 60676 "parsing/parser.ml" - - in - let lid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 60687 "parsing/parser.ml" - - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos_ty_inlined1_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93640 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 93645 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 94286 "parsing/parser.ml" +||||||| 04da777f7 +# 94277 "parsing/parser.ml" +======= +# 94291 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 94291 "parsing/parser.ml" +||||||| 04da777f7 +# 94282 "parsing/parser.ml" +======= +# 94296 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93654 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94300 "parsing/parser.ml" +||||||| 04da777f7 +# 94291 "parsing/parser.ml" +======= +# 94305 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 93663 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94309 "parsing/parser.ml" +||||||| 04da777f7 +# 94300 "parsing/parser.ml" +======= +# 94314 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 93670 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 94316 "parsing/parser.ml" +||||||| 04da777f7 +# 94307 "parsing/parser.ml" +======= +# 94321 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 93676 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94322 "parsing/parser.ml" +||||||| 04da777f7 +# 94313 "parsing/parser.ml" +======= +# 94327 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93687 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93693 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94333 "parsing/parser.ml" +||||||| 04da777f7 +# 94324 "parsing/parser.ml" +======= +# 94338 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94339 "parsing/parser.ml" +||||||| 04da777f7 +# 94330 "parsing/parser.ml" +======= +# 94344 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93703 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 93709 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 94349 "parsing/parser.ml" +||||||| 04da777f7 +# 94340 "parsing/parser.ml" +======= +# 94354 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 94355 "parsing/parser.ml" +||||||| 04da777f7 +# 94346 "parsing/parser.ml" +======= +# 94360 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 93718 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94364 "parsing/parser.ml" +||||||| 04da777f7 +# 94355 "parsing/parser.ml" +======= +# 94369 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos_ty_inlined1_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 60698 "parsing/parser.ml" +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 93728 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" + +# 4287 "parsing/parser.mly" ( _1 ) -# 60706 "parsing/parser.ml" +# 93734 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94374 "parsing/parser.ml" +||||||| 04da777f7 +# 94365 "parsing/parser.ml" +======= +# 94379 "parsing/parser.ml" +>>>>>>> origin/main in - let _endpos = _endpos_attrs_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3854 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Te.mk_exception ~attrs - (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) - , ext ) -# 60719 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list -> - Parsetree.expression) = -# 3241 "parsing/parser.mly" - ( fun _ -> _2 ) -# 60752 "parsing/parser.ml" +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 94380 "parsing/parser.ml" +||||||| 04da777f7 +# 94371 "parsing/parser.ml" +======= +# 94385 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60761,57 +183748,374 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let _4 : (N_ary.function_body) = Obj.magic _4 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _3 : unit = Obj.magic _3 in - let _2 : (N_ary.type_constraint option) = Obj.magic _2 in - let _1 : (N_ary.function_param list) = Obj.magic _1 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : ((mode_annotation * (Lexing.position * Lexing.position)) list -> - Parsetree.expression) = let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3243 "parsing/parser.mly" - ( fun mode_annotations -> - let mode_annotations = - List.map - (fun (mode, loc) -> mkloc mode (make_loc loc)) - mode_annotations + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined2, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 93798 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 93803 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94444 "parsing/parser.ml" +||||||| 04da777f7 +# 94435 "parsing/parser.ml" +======= +# 94449 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 94449 "parsing/parser.ml" +||||||| 04da777f7 +# 94440 "parsing/parser.ml" +======= +# 94454 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93812 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94458 "parsing/parser.ml" +||||||| 04da777f7 +# 94449 "parsing/parser.ml" +======= +# 94463 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 93821 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94467 "parsing/parser.ml" +||||||| 04da777f7 +# 94458 "parsing/parser.ml" +======= +# 94472 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 93828 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 94474 "parsing/parser.ml" +||||||| 04da777f7 +# 94465 "parsing/parser.ml" +======= +# 94479 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 93834 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94480 "parsing/parser.ml" +||||||| 04da777f7 +# 94471 "parsing/parser.ml" +======= +# 94485 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93845 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 93851 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94491 "parsing/parser.ml" +||||||| 04da777f7 +# 94482 "parsing/parser.ml" +======= +# 94496 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94497 "parsing/parser.ml" +||||||| 04da777f7 +# 94488 "parsing/parser.ml" +======= +# 94502 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93861 "parsing/parser.ml" + + in + let label = +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 93867 "parsing/parser.ml" + in + +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 94507 "parsing/parser.ml" +||||||| 04da777f7 +# 94498 "parsing/parser.ml" +======= +# 94512 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 94513 "parsing/parser.ml" +||||||| 04da777f7 +# 94504 "parsing/parser.ml" +======= +# 94518 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 93876 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94522 "parsing/parser.ml" +||||||| 04da777f7 +# 94513 "parsing/parser.ml" +======= +# 94527 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__1_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1232 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +<<<<<<< HEAD +# 93886 "parsing/parser.ml" + in - let constraint_ : N_ary.function_constraint option = - match _2 with - | None -> None - | Some type_constraint -> Some { type_constraint; mode_annotations } + +# 4287 "parsing/parser.mly" + ( _1 ) +# 93892 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94532 "parsing/parser.ml" +||||||| 04da777f7 +# 94523 "parsing/parser.ml" +======= +# 94537 "parsing/parser.ml" +>>>>>>> origin/main + in - let exp = mkfunction _1 constraint_ _4 ~loc:_sloc ~attrs:(None, []) in - { exp with pexp_loc = { exp.pexp_loc with loc_ghost = true } } - ) -# 60815 "parsing/parser.ml" + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 94538 "parsing/parser.ml" +||||||| 04da777f7 +# 94529 "parsing/parser.ml" +======= +# 94543 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60824,155 +184128,405 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let label : (string) = Obj.magic label in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, ty_inlined1, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 93956 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 94602 "parsing/parser.ml" +||||||| 04da777f7 +# 94593 "parsing/parser.ml" +======= +# 94607 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 60897 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 60902 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 60908 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 60914 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 60924 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 93966 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 60930 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 93972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94612 "parsing/parser.ml" +||||||| 04da777f7 +# 94603 "parsing/parser.ml" +======= +# 94617 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94618 "parsing/parser.ml" +||||||| 04da777f7 +# 94609 "parsing/parser.ml" +======= +# 94623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 60937 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 93982 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94628 "parsing/parser.ml" +||||||| 04da777f7 +# 94619 "parsing/parser.ml" +======= +# 94633 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 60944 "parsing/parser.ml" - in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 93991 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94637 "parsing/parser.ml" +||||||| 04da777f7 +# 94628 "parsing/parser.ml" +======= +# 94642 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 93998 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 94644 "parsing/parser.ml" +||||||| 04da777f7 +# 94635 "parsing/parser.ml" +======= +# 94649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 94004 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94650 "parsing/parser.ml" +||||||| 04da777f7 +# 94641 "parsing/parser.ml" +======= +# 94655 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 94015 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 94021 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94661 "parsing/parser.ml" +||||||| 04da777f7 +# 94652 "parsing/parser.ml" +======= +# 94666 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94667 "parsing/parser.ml" +||||||| 04da777f7 +# 94658 "parsing/parser.ml" +======= +# 94672 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 60949 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94031 "parsing/parser.ml" in let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 60955 "parsing/parser.ml" +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 94037 "parsing/parser.ml" in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 60960 "parsing/parser.ml" +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 94677 "parsing/parser.ml" +||||||| 04da777f7 +# 94668 "parsing/parser.ml" +======= +# 94682 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 94683 "parsing/parser.ml" +||||||| 04da777f7 +# 94674 "parsing/parser.ml" +======= +# 94688 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 94046 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94692 "parsing/parser.ml" +||||||| 04da777f7 +# 94683 "parsing/parser.ml" +======= +# 94697 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos__1_ = _endpos_ty_inlined1_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 60970 "parsing/parser.ml" +<<<<<<< HEAD +# 94056 "parsing/parser.ml" in -# 4132 "parsing/parser.mly" +# 4287 "parsing/parser.mly" ( _1 ) -# 60976 "parsing/parser.ml" +# 94062 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94702 "parsing/parser.ml" +||||||| 04da777f7 +# 94693 "parsing/parser.ml" +======= +# 94707 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 94708 "parsing/parser.ml" +||||||| 04da777f7 +# 94699 "parsing/parser.ml" +======= +# 94713 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -60985,88 +184539,415 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in - let label : (string) = Obj.magic label in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 61025 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, ty_inlined1, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 94135 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94781 "parsing/parser.ml" +||||||| 04da777f7 +# 94772 "parsing/parser.ml" +======= +# 94786 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 94146 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 94152 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94792 "parsing/parser.ml" +||||||| 04da777f7 +# 94783 "parsing/parser.ml" +======= +# 94797 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94798 "parsing/parser.ml" +||||||| 04da777f7 +# 94789 "parsing/parser.ml" +======= +# 94803 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 61031 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94162 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94808 "parsing/parser.ml" +||||||| 04da777f7 +# 94799 "parsing/parser.ml" +======= +# 94813 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 61038 "parsing/parser.ml" - in + let domain_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 94171 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94817 "parsing/parser.ml" +||||||| 04da777f7 +# 94808 "parsing/parser.ml" +======= +# 94822 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let _1 = +<<<<<<< HEAD +# 4431 "parsing/parser.mly" + ( ty ) +# 94178 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4435 "parsing/parser.mly" +||||||| 04da777f7 +# 4428 "parsing/parser.mly" +======= +# 4419 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 94824 "parsing/parser.ml" +||||||| 04da777f7 +# 94815 "parsing/parser.ml" +======= +# 94829 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos__1_ = _endpos_ty_ in + +# 1193 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +<<<<<<< HEAD +# 94184 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94830 "parsing/parser.ml" +||||||| 04da777f7 +# 94821 "parsing/parser.ml" +======= +# 94835 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 94195 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 94201 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 94841 "parsing/parser.ml" +||||||| 04da777f7 +# 94832 "parsing/parser.ml" +======= +# 94846 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 94847 "parsing/parser.ml" +||||||| 04da777f7 +# 94838 "parsing/parser.ml" +======= +# 94852 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 61043 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94211 "parsing/parser.ml" in let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 61049 "parsing/parser.ml" +# 4349 "parsing/parser.mly" + ( Nolabel ) +# 94217 "parsing/parser.ml" in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 61054 "parsing/parser.ml" +# 4281 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 94857 "parsing/parser.ml" +||||||| 04da777f7 +# 94848 "parsing/parser.ml" +======= +# 94862 "parsing/parser.ml" +>>>>>>> origin/main + + in + let label = +<<<<<<< HEAD +# 4368 "parsing/parser.mly" +||||||| 04da777f7 +# 4361 "parsing/parser.mly" +======= +# 4352 "parsing/parser.mly" +>>>>>>> origin/main + ( Nolabel ) +<<<<<<< HEAD +# 94863 "parsing/parser.ml" +||||||| 04da777f7 +# 94854 "parsing/parser.ml" +======= +# 94868 "parsing/parser.ml" +>>>>>>> origin/main + in + +<<<<<<< HEAD +# 4300 "parsing/parser.mly" +||||||| 04da777f7 +# 4293 "parsing/parser.mly" +======= +# 4284 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) ) +<<<<<<< HEAD +# 94226 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94872 "parsing/parser.ml" +||||||| 04da777f7 +# 94863 "parsing/parser.ml" +======= +# 94877 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos__1_ = _endpos__1_inlined3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 61064 "parsing/parser.ml" +<<<<<<< HEAD +# 94236 "parsing/parser.ml" + + in + +# 4287 "parsing/parser.mly" + ( _1 ) +# 94242 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94882 "parsing/parser.ml" +||||||| 04da777f7 +# 94873 "parsing/parser.ml" +======= +# 94887 "parsing/parser.ml" +>>>>>>> origin/main in -# 4132 "parsing/parser.mly" +<<<<<<< HEAD +# 4306 "parsing/parser.mly" +||||||| 04da777f7 +# 4299 "parsing/parser.mly" +======= +# 4290 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 61070 "parsing/parser.ml" +<<<<<<< HEAD +# 94888 "parsing/parser.ml" +||||||| 04da777f7 +# 94879 "parsing/parser.ml" +======= +# 94893 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -61089,42 +184970,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -61134,91 +185003,195 @@ module Tables = struct } = _menhir_stack in let codomain : (Parsetree.core_type) = Obj.magic codomain in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let label : (string) = Obj.magic label in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 94305 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94951 "parsing/parser.ml" +||||||| 04da777f7 +# 94942 "parsing/parser.ml" +======= +# 94956 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in let _endpos = _endpos_codomain_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 94316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 94962 "parsing/parser.ml" +||||||| 04da777f7 +# 94953 "parsing/parser.ml" +======= +# 94967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 61159 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 94323 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94969 "parsing/parser.ml" +||||||| 04da777f7 +# 94960 "parsing/parser.ml" +======= +# 94974 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 61164 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 61170 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 61176 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +<<<<<<< HEAD +# 94328 "parsing/parser.ml" -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 61186 "parsing/parser.ml" + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 94334 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 94974 "parsing/parser.ml" +||||||| 04da777f7 +# 94965 "parsing/parser.ml" +======= +# 94979 "parsing/parser.ml" +>>>>>>> origin/main in -# 4172 "parsing/parser.mly" - ( _1 ) -# 61192 "parsing/parser.ml" +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 94980 "parsing/parser.ml" +||||||| 04da777f7 +# 94971 "parsing/parser.ml" +======= +# 94985 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 61199 "parsing/parser.ml" + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 94341 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in - in - let unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 61206 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 94987 "parsing/parser.ml" +||||||| 04da777f7 +# 94978 "parsing/parser.ml" +======= +# 94992 "parsing/parser.ml" +>>>>>>> origin/main in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 61211 "parsing/parser.ml" +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94350 "parsing/parser.ml" in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 61217 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 61222 "parsing/parser.ml" +# 4305 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 94996 "parsing/parser.ml" +||||||| 04da777f7 +# 94987 "parsing/parser.ml" +======= +# 95001 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4324 "parsing/parser.mly" +||||||| 04da777f7 +# 4317 "parsing/parser.mly" +======= +# 4308 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 94362 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95008 "parsing/parser.ml" +||||||| 04da777f7 +# 94999 "parsing/parser.ml" +======= +# 95013 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -61226,15 +185199,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 61232 "parsing/parser.ml" +<<<<<<< HEAD +# 94372 "parsing/parser.ml" in -# 4132 "parsing/parser.mly" +# 4313 "parsing/parser.mly" ( _1 ) -# 61238 "parsing/parser.ml" +# 94378 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95018 "parsing/parser.ml" +||||||| 04da777f7 +# 95009 "parsing/parser.ml" +======= +# 95023 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4332 "parsing/parser.mly" +||||||| 04da777f7 +# 4325 "parsing/parser.mly" +======= +# 4316 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 95024 "parsing/parser.ml" +||||||| 04da777f7 +# 95015 "parsing/parser.ml" +======= +# 95029 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -61257,20 +185258,38 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; @@ -61278,48 +185297,196 @@ module Tables = struct } = _menhir_stack in let codomain : (Parsetree.core_type) = Obj.magic codomain in let _4 : unit = Obj.magic _4 in + let _1 : (Mode.t) = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let label : (string) = Obj.magic label in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 94448 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95094 "parsing/parser.ml" +||||||| 04da777f7 +# 95085 "parsing/parser.ml" +======= +# 95099 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in let _endpos = _endpos_codomain_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 61294 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 94459 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 95105 "parsing/parser.ml" +||||||| 04da777f7 +# 95096 "parsing/parser.ml" +======= +# 95110 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 61300 "parsing/parser.ml" + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 94466 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95112 "parsing/parser.ml" +||||||| 04da777f7 +# 95103 "parsing/parser.ml" +======= +# 95117 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 94471 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 94477 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95117 "parsing/parser.ml" +||||||| 04da777f7 +# 95108 "parsing/parser.ml" +======= +# 95122 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 95123 "parsing/parser.ml" +||||||| 04da777f7 +# 95114 "parsing/parser.ml" +======= +# 95128 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 94484 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in - in - let unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 61307 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95130 "parsing/parser.ml" +||||||| 04da777f7 +# 95121 "parsing/parser.ml" +======= +# 95135 "parsing/parser.ml" +>>>>>>> origin/main in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 61312 "parsing/parser.ml" +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94493 "parsing/parser.ml" in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 61318 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 61323 "parsing/parser.ml" +# 4305 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 95139 "parsing/parser.ml" +||||||| 04da777f7 +# 95130 "parsing/parser.ml" +======= +# 95144 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4324 "parsing/parser.mly" +||||||| 04da777f7 +# 4317 "parsing/parser.mly" +======= +# 4308 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 94505 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95151 "parsing/parser.ml" +||||||| 04da777f7 +# 95142 "parsing/parser.ml" +======= +# 95156 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -61327,15 +185494,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 61333 "parsing/parser.ml" +<<<<<<< HEAD +# 94515 "parsing/parser.ml" + + in + +# 4313 "parsing/parser.mly" + ( _1 ) +# 94521 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95161 "parsing/parser.ml" +||||||| 04da777f7 +# 95152 "parsing/parser.ml" +======= +# 95166 "parsing/parser.ml" +>>>>>>> origin/main in -# 4132 "parsing/parser.mly" +<<<<<<< HEAD +# 4332 "parsing/parser.mly" +||||||| 04da777f7 +# 4325 "parsing/parser.mly" +======= +# 4316 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 61339 "parsing/parser.ml" +<<<<<<< HEAD +# 95167 "parsing/parser.ml" +||||||| 04da777f7 +# 95158 "parsing/parser.ml" +======= +# 95172 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -61358,41 +185553,35 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -61403,95 +185592,226 @@ module Tables = struct } = _menhir_stack in let codomain : (Parsetree.core_type) = Obj.magic codomain in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 61416 "parsing/parser.ml" +<<<<<<< HEAD +# 94591 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95237 "parsing/parser.ml" +||||||| 04da777f7 +# 95228 "parsing/parser.ml" +======= +# 95242 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in let _endpos = _endpos_codomain_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 94602 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95248 "parsing/parser.ml" +||||||| 04da777f7 +# 95239 "parsing/parser.ml" +======= +# 95253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 61432 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 94609 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95255 "parsing/parser.ml" +||||||| 04da777f7 +# 95246 "parsing/parser.ml" +======= +# 95260 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 61437 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 61443 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 61449 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in +<<<<<<< HEAD +# 94614 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 94620 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95260 "parsing/parser.ml" +||||||| 04da777f7 +# 95251 "parsing/parser.ml" +======= +# 95265 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 95266 "parsing/parser.ml" +||||||| 04da777f7 +# 95257 "parsing/parser.ml" +======= +# 95271 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 61459 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 94632 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 61465 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 94638 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 95278 "parsing/parser.ml" +||||||| 04da777f7 +# 95269 "parsing/parser.ml" +======= +# 95283 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 95284 "parsing/parser.ml" +||||||| 04da777f7 +# 95275 "parsing/parser.ml" +======= +# 95289 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 61472 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94648 "parsing/parser.ml" in - let unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 61479 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 61484 "parsing/parser.ml" + +# 4305 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 95294 "parsing/parser.ml" +||||||| 04da777f7 +# 95285 "parsing/parser.ml" +======= +# 95299 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 61490 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 61495 "parsing/parser.ml" +<<<<<<< HEAD +# 4324 "parsing/parser.mly" +||||||| 04da777f7 +# 4317 "parsing/parser.mly" +======= +# 4308 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 94660 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95306 "parsing/parser.ml" +||||||| 04da777f7 +# 95297 "parsing/parser.ml" +======= +# 95311 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -61499,15 +185819,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 61505 "parsing/parser.ml" +<<<<<<< HEAD +# 94670 "parsing/parser.ml" in -# 4132 "parsing/parser.mly" +# 4313 "parsing/parser.mly" ( _1 ) -# 61511 "parsing/parser.ml" +# 94676 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95316 "parsing/parser.ml" +||||||| 04da777f7 +# 95307 "parsing/parser.ml" +======= +# 95321 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4332 "parsing/parser.mly" +||||||| 04da777f7 +# 4325 "parsing/parser.mly" +======= +# 4316 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 95322 "parsing/parser.ml" +||||||| 04da777f7 +# 95313 "parsing/parser.ml" +======= +# 95327 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -61530,20 +185878,44 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; @@ -61551,52 +185923,230 @@ module Tables = struct } = _menhir_stack in let codomain : (Parsetree.core_type) = Obj.magic codomain in let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 61560 "parsing/parser.ml" +<<<<<<< HEAD +# 94753 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95399 "parsing/parser.ml" +||||||| 04da777f7 +# 95390 "parsing/parser.ml" +======= +# 95404 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 61571 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let tuple_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 94766 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 95412 "parsing/parser.ml" +||||||| 04da777f7 +# 95403 "parsing/parser.ml" +======= +# 95417 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 94774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95420 "parsing/parser.ml" +||||||| 04da777f7 +# 95411 "parsing/parser.ml" +======= +# 95425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 94779 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 94785 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95425 "parsing/parser.ml" +||||||| 04da777f7 +# 95416 "parsing/parser.ml" +======= +# 95430 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 95431 "parsing/parser.ml" +||||||| 04da777f7 +# 95422 "parsing/parser.ml" +======= +# 95436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 94797 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 94803 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 95443 "parsing/parser.ml" +||||||| 04da777f7 +# 95434 "parsing/parser.ml" +======= +# 95448 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 95449 "parsing/parser.ml" +||||||| 04da777f7 +# 95440 "parsing/parser.ml" +======= +# 95454 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 61577 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94813 "parsing/parser.ml" in - let unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 61584 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 61589 "parsing/parser.ml" + +# 4305 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 95459 "parsing/parser.ml" +||||||| 04da777f7 +# 95450 "parsing/parser.ml" +======= +# 95464 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 61595 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 61600 "parsing/parser.ml" +<<<<<<< HEAD +# 4324 "parsing/parser.mly" +||||||| 04da777f7 +# 4317 "parsing/parser.mly" +======= +# 4308 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) ) +<<<<<<< HEAD +# 94825 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95471 "parsing/parser.ml" +||||||| 04da777f7 +# 95462 "parsing/parser.ml" +======= +# 95476 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -61604,15 +186154,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 61610 "parsing/parser.ml" +<<<<<<< HEAD +# 94835 "parsing/parser.ml" in -# 4132 "parsing/parser.mly" +# 4313 "parsing/parser.mly" ( _1 ) -# 61616 "parsing/parser.ml" +# 94841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95481 "parsing/parser.ml" +||||||| 04da777f7 +# 95472 "parsing/parser.ml" +======= +# 95486 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4332 "parsing/parser.mly" +||||||| 04da777f7 +# 4325 "parsing/parser.mly" +======= +# 4316 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 95487 "parsing/parser.ml" +||||||| 04da777f7 +# 95478 "parsing/parser.ml" +======= +# 95492 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -61625,9 +186203,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -61635,48 +186213,30 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -61684,114 +186244,321 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 61700 "parsing/parser.ml" +<<<<<<< HEAD +# 94904 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95550 "parsing/parser.ml" +||||||| 04da777f7 +# 95541 "parsing/parser.ml" +======= +# 95555 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 94916 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 94921 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95562 "parsing/parser.ml" +||||||| 04da777f7 +# 95553 "parsing/parser.ml" +======= +# 95567 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95567 "parsing/parser.ml" +||||||| 04da777f7 +# 95558 "parsing/parser.ml" +======= +# 95572 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94930 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95576 "parsing/parser.ml" +||||||| 04da777f7 +# 95567 "parsing/parser.ml" +======= +# 95581 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 94937 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95583 "parsing/parser.ml" +||||||| 04da777f7 +# 95574 "parsing/parser.ml" +======= +# 95588 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 61716 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 94944 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95590 "parsing/parser.ml" +||||||| 04da777f7 +# 95581 "parsing/parser.ml" +======= +# 95595 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 61721 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 61727 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 61733 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +<<<<<<< HEAD +# 94949 "parsing/parser.ml" -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 61743 "parsing/parser.ml" + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 94955 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95595 "parsing/parser.ml" +||||||| 04da777f7 +# 95586 "parsing/parser.ml" +======= +# 95600 "parsing/parser.ml" +>>>>>>> origin/main in -# 4172 "parsing/parser.mly" - ( _1 ) -# 61749 "parsing/parser.ml" +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 95601 "parsing/parser.ml" +||||||| 04da777f7 +# 95592 "parsing/parser.ml" +======= +# 95606 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 61756 "parsing/parser.ml" + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 94962 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in - in - let unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 61763 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95608 "parsing/parser.ml" +||||||| 04da777f7 +# 95599 "parsing/parser.ml" +======= +# 95613 "parsing/parser.ml" +>>>>>>> origin/main in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 61768 "parsing/parser.ml" +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 94971 "parsing/parser.ml" in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 61774 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 61779 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 95617 "parsing/parser.ml" +||||||| 04da777f7 +# 95608 "parsing/parser.ml" +======= +# 95622 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 94986 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95632 "parsing/parser.ml" +||||||| 04da777f7 +# 95623 "parsing/parser.ml" +======= +# 95637 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 61789 "parsing/parser.ml" +<<<<<<< HEAD +# 94996 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 95002 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95642 "parsing/parser.ml" +||||||| 04da777f7 +# 95633 "parsing/parser.ml" +======= +# 95647 "parsing/parser.ml" +>>>>>>> origin/main in -# 4132 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 61795 "parsing/parser.ml" +<<<<<<< HEAD +# 95648 "parsing/parser.ml" +||||||| 04da777f7 +# 95639 "parsing/parser.ml" +======= +# 95653 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -61804,106 +186571,369 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1 : (Mode.t) = Obj.magic _1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 61851 "parsing/parser.ml" +<<<<<<< HEAD +# 95072 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95718 "parsing/parser.ml" +||||||| 04da777f7 +# 95709 "parsing/parser.ml" +======= +# 95723 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 61862 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 95084 "parsing/parser.ml" in - let _endpos__1_ = _endpos_ty_ in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95089 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 61868 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 95730 "parsing/parser.ml" +||||||| 04da777f7 +# 95721 "parsing/parser.ml" +======= +# 95735 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95735 "parsing/parser.ml" +||||||| 04da777f7 +# 95726 "parsing/parser.ml" +======= +# 95740 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95098 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95744 "parsing/parser.ml" +||||||| 04da777f7 +# 95735 "parsing/parser.ml" +======= +# 95749 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 61875 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 95105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95751 "parsing/parser.ml" +||||||| 04da777f7 +# 95742 "parsing/parser.ml" +======= +# 95756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 95112 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95758 "parsing/parser.ml" +||||||| 04da777f7 +# 95749 "parsing/parser.ml" +======= +# 95763 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 95117 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 95123 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95763 "parsing/parser.ml" +||||||| 04da777f7 +# 95754 "parsing/parser.ml" +======= +# 95768 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 95769 "parsing/parser.ml" +||||||| 04da777f7 +# 95760 "parsing/parser.ml" +======= +# 95774 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95130 "parsing/parser.ml" in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 61880 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95776 "parsing/parser.ml" +||||||| 04da777f7 +# 95767 "parsing/parser.ml" +======= +# 95781 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95139 "parsing/parser.ml" in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 61886 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 61891 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 95785 "parsing/parser.ml" +||||||| 04da777f7 +# 95776 "parsing/parser.ml" +======= +# 95790 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 95154 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95800 "parsing/parser.ml" +||||||| 04da777f7 +# 95791 "parsing/parser.ml" +======= +# 95805 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _startpos__1_ = _startpos_label_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 61901 "parsing/parser.ml" +<<<<<<< HEAD +# 95164 "parsing/parser.ml" in -# 4132 "parsing/parser.mly" +# 4331 "parsing/parser.mly" ( _1 ) -# 61907 "parsing/parser.ml" +# 95170 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95810 "parsing/parser.ml" +||||||| 04da777f7 +# 95801 "parsing/parser.ml" +======= +# 95815 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 95816 "parsing/parser.ml" +||||||| 04da777f7 +# 95807 "parsing/parser.ml" +======= +# 95821 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -61916,40 +186946,46 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -61957,107 +186993,353 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 95240 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95886 "parsing/parser.ml" +||||||| 04da777f7 +# 95877 "parsing/parser.ml" +======= +# 95891 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_codomain_ in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 95252 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95898 "parsing/parser.ml" +||||||| 04da777f7 +# 95889 "parsing/parser.ml" +======= +# 95903 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let m0 = let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 61982 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 61987 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 61993 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 61999 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 62009 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 95262 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 62015 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 95268 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 95908 "parsing/parser.ml" +||||||| 04da777f7 +# 95899 "parsing/parser.ml" +======= +# 95913 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 95914 "parsing/parser.ml" +||||||| 04da777f7 +# 95905 "parsing/parser.ml" +======= +# 95919 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62022 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95278 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95924 "parsing/parser.ml" +||||||| 04da777f7 +# 95915 "parsing/parser.ml" +======= +# 95929 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62029 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 95285 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95931 "parsing/parser.ml" +||||||| 04da777f7 +# 95922 "parsing/parser.ml" +======= +# 95936 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 95292 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95938 "parsing/parser.ml" +||||||| 04da777f7 +# 95929 "parsing/parser.ml" +======= +# 95943 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 95297 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 95303 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95943 "parsing/parser.ml" +||||||| 04da777f7 +# 95934 "parsing/parser.ml" +======= +# 95948 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 95949 "parsing/parser.ml" +||||||| 04da777f7 +# 95940 "parsing/parser.ml" +======= +# 95954 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95310 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62034 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 95956 "parsing/parser.ml" +||||||| 04da777f7 +# 95947 "parsing/parser.ml" +======= +# 95961 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95319 "parsing/parser.ml" in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 62040 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 62045 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 95965 "parsing/parser.ml" +||||||| 04da777f7 +# 95956 "parsing/parser.ml" +======= +# 95970 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 95334 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95980 "parsing/parser.ml" +||||||| 04da777f7 +# 95971 "parsing/parser.ml" +======= +# 95985 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos_codomain_ in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62055 "parsing/parser.ml" +<<<<<<< HEAD +# 95344 "parsing/parser.ml" in -# 4132 "parsing/parser.mly" +# 4331 "parsing/parser.mly" ( _1 ) -# 62061 "parsing/parser.ml" +# 95350 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 95990 "parsing/parser.ml" +||||||| 04da777f7 +# 95981 "parsing/parser.ml" +======= +# 95995 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 95996 "parsing/parser.ml" +||||||| 04da777f7 +# 95987 "parsing/parser.ml" +======= +# 96001 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62070,81 +187352,410 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _4 : unit = Obj.magic _4 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 95427 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96073 "parsing/parser.ml" +||||||| 04da777f7 +# 96064 "parsing/parser.ml" +======= +# 96078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_codomain_ in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 62103 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 95441 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96087 "parsing/parser.ml" +||||||| 04da777f7 +# 96078 "parsing/parser.ml" +======= +# 96092 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 95452 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 95458 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 96098 "parsing/parser.ml" +||||||| 04da777f7 +# 96089 "parsing/parser.ml" +======= +# 96103 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96104 "parsing/parser.ml" +||||||| 04da777f7 +# 96095 "parsing/parser.ml" +======= +# 96109 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62109 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95468 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96114 "parsing/parser.ml" +||||||| 04da777f7 +# 96105 "parsing/parser.ml" +======= +# 96119 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62116 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 95475 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96121 "parsing/parser.ml" +||||||| 04da777f7 +# 96112 "parsing/parser.ml" +======= +# 96126 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 95482 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96128 "parsing/parser.ml" +||||||| 04da777f7 +# 96119 "parsing/parser.ml" +======= +# 96133 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 95487 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 95493 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96133 "parsing/parser.ml" +||||||| 04da777f7 +# 96124 "parsing/parser.ml" +======= +# 96138 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 96139 "parsing/parser.ml" +||||||| 04da777f7 +# 96130 "parsing/parser.ml" +======= +# 96144 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95500 "parsing/parser.ml" in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62121 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96146 "parsing/parser.ml" +||||||| 04da777f7 +# 96137 "parsing/parser.ml" +======= +# 96151 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95509 "parsing/parser.ml" in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 62127 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 62132 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 96155 "parsing/parser.ml" +||||||| 04da777f7 +# 96146 "parsing/parser.ml" +======= +# 96160 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 95524 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96170 "parsing/parser.ml" +||||||| 04da777f7 +# 96161 "parsing/parser.ml" +======= +# 96175 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_ty_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62142 "parsing/parser.ml" +<<<<<<< HEAD +# 95534 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 95540 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96180 "parsing/parser.ml" +||||||| 04da777f7 +# 96171 "parsing/parser.ml" +======= +# 96185 "parsing/parser.ml" +>>>>>>> origin/main in -# 4132 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 62148 "parsing/parser.ml" +<<<<<<< HEAD +# 96186 "parsing/parser.ml" +||||||| 04da777f7 +# 96177 "parsing/parser.ml" +======= +# 96191 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62157,9 +187768,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -62167,34 +187778,34 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -62204,108 +187815,322 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let _1 : (Mode.t) = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 95610 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96256 "parsing/parser.ml" +||||||| 04da777f7 +# 96247 "parsing/parser.ml" +======= +# 96261 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_codomain_ in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 95622 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95627 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96268 "parsing/parser.ml" +||||||| 04da777f7 +# 96259 "parsing/parser.ml" +======= +# 96273 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96273 "parsing/parser.ml" +||||||| 04da777f7 +# 96264 "parsing/parser.ml" +======= +# 96278 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95636 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96282 "parsing/parser.ml" +||||||| 04da777f7 +# 96273 "parsing/parser.ml" +======= +# 96287 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 95643 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96289 "parsing/parser.ml" +||||||| 04da777f7 +# 96280 "parsing/parser.ml" +======= +# 96294 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 62230 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 95650 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96296 "parsing/parser.ml" +||||||| 04da777f7 +# 96287 "parsing/parser.ml" +======= +# 96301 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 62235 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 62241 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 62247 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +<<<<<<< HEAD +# 95655 "parsing/parser.ml" -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 62257 "parsing/parser.ml" + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 95661 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96301 "parsing/parser.ml" +||||||| 04da777f7 +# 96292 "parsing/parser.ml" +======= +# 96306 "parsing/parser.ml" +>>>>>>> origin/main in -# 4172 "parsing/parser.mly" - ( _1 ) -# 62263 "parsing/parser.ml" +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 96307 "parsing/parser.ml" +||||||| 04da777f7 +# 96298 "parsing/parser.ml" +======= +# 96312 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62270 "parsing/parser.ml" + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95668 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in - in - let unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 62277 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96314 "parsing/parser.ml" +||||||| 04da777f7 +# 96305 "parsing/parser.ml" +======= +# 96319 "parsing/parser.ml" +>>>>>>> origin/main in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62282 "parsing/parser.ml" +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95677 "parsing/parser.ml" in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 62288 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 62293 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 96323 "parsing/parser.ml" +||||||| 04da777f7 +# 96314 "parsing/parser.ml" +======= +# 96328 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 95692 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96338 "parsing/parser.ml" +||||||| 04da777f7 +# 96329 "parsing/parser.ml" +======= +# 96343 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_x_) in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62303 "parsing/parser.ml" +<<<<<<< HEAD +# 95702 "parsing/parser.ml" in -# 4132 "parsing/parser.mly" +# 4331 "parsing/parser.mly" ( _1 ) -# 62309 "parsing/parser.ml" +# 95708 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96348 "parsing/parser.ml" +||||||| 04da777f7 +# 96339 "parsing/parser.ml" +======= +# 96353 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 96354 "parsing/parser.ml" +||||||| 04da777f7 +# 96345 "parsing/parser.ml" +======= +# 96359 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62318,88 +188143,376 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in + let _1 : (Mode.t) = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 95785 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96431 "parsing/parser.ml" +||||||| 04da777f7 +# 96422 "parsing/parser.ml" +======= +# 96436 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_codomain_ in + let _startpos = _startpos_label_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 62358 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 95797 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95802 "parsing/parser.ml" in - let _endpos__1_ = _endpos_ty_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62364 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96443 "parsing/parser.ml" +||||||| 04da777f7 +# 96434 "parsing/parser.ml" +======= +# 96448 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96448 "parsing/parser.ml" +||||||| 04da777f7 +# 96439 "parsing/parser.ml" +======= +# 96453 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95811 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96457 "parsing/parser.ml" +||||||| 04da777f7 +# 96448 "parsing/parser.ml" +======= +# 96462 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 62371 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 95818 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96464 "parsing/parser.ml" +||||||| 04da777f7 +# 96455 "parsing/parser.ml" +======= +# 96469 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 95825 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96471 "parsing/parser.ml" +||||||| 04da777f7 +# 96462 "parsing/parser.ml" +======= +# 96476 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 95830 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 95836 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96476 "parsing/parser.ml" +||||||| 04da777f7 +# 96467 "parsing/parser.ml" +======= +# 96481 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 96482 "parsing/parser.ml" +||||||| 04da777f7 +# 96473 "parsing/parser.ml" +======= +# 96487 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 95843 "parsing/parser.ml" in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62376 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96489 "parsing/parser.ml" +||||||| 04da777f7 +# 96480 "parsing/parser.ml" +======= +# 96494 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95852 "parsing/parser.ml" in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 62382 "parsing/parser.ml" - in -# 4130 "parsing/parser.mly" - ( Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) ) -# 62387 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 96498 "parsing/parser.ml" +||||||| 04da777f7 +# 96489 "parsing/parser.ml" +======= +# 96503 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 95867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96513 "parsing/parser.ml" +||||||| 04da777f7 +# 96504 "parsing/parser.ml" +======= +# 96518 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_x_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62397 "parsing/parser.ml" +<<<<<<< HEAD +# 95877 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 95883 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96523 "parsing/parser.ml" +||||||| 04da777f7 +# 96514 "parsing/parser.ml" +======= +# 96528 "parsing/parser.ml" +>>>>>>> origin/main in -# 4132 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 62403 "parsing/parser.ml" +<<<<<<< HEAD +# 96529 "parsing/parser.ml" +||||||| 04da777f7 +# 96520 "parsing/parser.ml" +======= +# 96534 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62412,45 +188525,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -62459,123 +188578,354 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let label : (string) = Obj.magic label in + let _1 : (Mode.t) = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 95960 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96606 "parsing/parser.ml" +||||||| 04da777f7 +# 96597 "parsing/parser.ml" +======= +# 96611 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62480 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 95972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96618 "parsing/parser.ml" +||||||| 04da777f7 +# 96609 "parsing/parser.ml" +======= +# 96623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - -# 4165 "parsing/parser.mly" - ( flags ) -# 62485 "parsing/parser.ml" - - in - let domain = - let _1 = + let m0 = let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 62497 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 62502 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 62508 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 62514 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 62524 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 95982 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 62530 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 95988 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 96628 "parsing/parser.ml" +||||||| 04da777f7 +# 96619 "parsing/parser.ml" +======= +# 96633 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96634 "parsing/parser.ml" +||||||| 04da777f7 +# 96625 "parsing/parser.ml" +======= +# 96639 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62537 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 95998 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96644 "parsing/parser.ml" +||||||| 04da777f7 +# 96635 "parsing/parser.ml" +======= +# 96649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62544 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 96005 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96651 "parsing/parser.ml" +||||||| 04da777f7 +# 96642 "parsing/parser.ml" +======= +# 96656 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 96012 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96658 "parsing/parser.ml" +||||||| 04da777f7 +# 96649 "parsing/parser.ml" +======= +# 96663 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 96017 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 96023 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96663 "parsing/parser.ml" +||||||| 04da777f7 +# 96654 "parsing/parser.ml" +======= +# 96668 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 96669 "parsing/parser.ml" +||||||| 04da777f7 +# 96660 "parsing/parser.ml" +======= +# 96674 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 96030 "parsing/parser.ml" in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62549 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96676 "parsing/parser.ml" +||||||| 04da777f7 +# 96667 "parsing/parser.ml" +======= +# 96681 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96039 "parsing/parser.ml" + + in + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 96685 "parsing/parser.ml" +||||||| 04da777f7 +# 96676 "parsing/parser.ml" +======= +# 96690 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 62555 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 62563 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 96054 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96700 "parsing/parser.ml" +||||||| 04da777f7 +# 96691 "parsing/parser.ml" +======= +# 96705 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62573 "parsing/parser.ml" +<<<<<<< HEAD +# 96064 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 96070 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96710 "parsing/parser.ml" +||||||| 04da777f7 +# 96701 "parsing/parser.ml" +======= +# 96715 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 62579 "parsing/parser.ml" +<<<<<<< HEAD +# 96716 "parsing/parser.ml" +||||||| 04da777f7 +# 96707 "parsing/parser.ml" +======= +# 96721 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62588,50 +188938,56 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -62641,124 +188997,358 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let label : (string) = Obj.magic label in + let _1 : (Mode.t) = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 96154 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96800 "parsing/parser.ml" +||||||| 04da777f7 +# 96791 "parsing/parser.ml" +======= +# 96805 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 62663 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 62668 "parsing/parser.ml" - - in - let domain = - let _1 = + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 96168 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96814 "parsing/parser.ml" +||||||| 04da777f7 +# 96805 "parsing/parser.ml" +======= +# 96819 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 62680 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 62685 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 62691 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 62697 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 62707 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 96179 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 62713 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 96185 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 96825 "parsing/parser.ml" +||||||| 04da777f7 +# 96816 "parsing/parser.ml" +======= +# 96830 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96831 "parsing/parser.ml" +||||||| 04da777f7 +# 96822 "parsing/parser.ml" +======= +# 96836 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62720 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96195 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96841 "parsing/parser.ml" +||||||| 04da777f7 +# 96832 "parsing/parser.ml" +======= +# 96846 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62727 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 96202 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 96848 "parsing/parser.ml" +||||||| 04da777f7 +# 96839 "parsing/parser.ml" +======= +# 96853 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 96209 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96855 "parsing/parser.ml" +||||||| 04da777f7 +# 96846 "parsing/parser.ml" +======= +# 96860 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 96214 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 96220 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96860 "parsing/parser.ml" +||||||| 04da777f7 +# 96851 "parsing/parser.ml" +======= +# 96865 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 96866 "parsing/parser.ml" +||||||| 04da777f7 +# 96857 "parsing/parser.ml" +======= +# 96871 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = +<<<<<<< HEAD +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 96227 "parsing/parser.ml" in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62732 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96873 "parsing/parser.ml" +||||||| 04da777f7 +# 96864 "parsing/parser.ml" +======= +# 96878 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96236 "parsing/parser.ml" + + in + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 96882 "parsing/parser.ml" +||||||| 04da777f7 +# 96873 "parsing/parser.ml" +======= +# 96887 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 62738 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 62746 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 96251 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96897 "parsing/parser.ml" +||||||| 04da777f7 +# 96888 "parsing/parser.ml" +======= +# 96902 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62756 "parsing/parser.ml" +<<<<<<< HEAD +# 96261 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 96267 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96907 "parsing/parser.ml" +||||||| 04da777f7 +# 96898 "parsing/parser.ml" +======= +# 96912 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 62762 "parsing/parser.ml" +<<<<<<< HEAD +# 96913 "parsing/parser.ml" +||||||| 04da777f7 +# 96904 "parsing/parser.ml" +======= +# 96918 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62771,9 +189361,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -62781,93 +189371,389 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in - let label : (string) = Obj.magic label in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 96337 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 96983 "parsing/parser.ml" +||||||| 04da777f7 +# 96974 "parsing/parser.ml" +======= +# 96988 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62811 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 96349 "parsing/parser.ml" in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 96354 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62816 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 62823 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 96995 "parsing/parser.ml" +||||||| 04da777f7 +# 96986 "parsing/parser.ml" +======= +# 97000 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97000 "parsing/parser.ml" +||||||| 04da777f7 +# 96991 "parsing/parser.ml" +======= +# 97005 "parsing/parser.ml" +>>>>>>> origin/main in - let _endpos__1_ = _endpos_ty_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62829 "parsing/parser.ml" +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96363 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97009 "parsing/parser.ml" +||||||| 04da777f7 +# 97000 "parsing/parser.ml" +======= +# 97014 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62836 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 96370 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97016 "parsing/parser.ml" +||||||| 04da777f7 +# 97007 "parsing/parser.ml" +======= +# 97021 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 96377 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97023 "parsing/parser.ml" +||||||| 04da777f7 +# 97014 "parsing/parser.ml" +======= +# 97028 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 96382 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 96388 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97028 "parsing/parser.ml" +||||||| 04da777f7 +# 97019 "parsing/parser.ml" +======= +# 97033 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 97034 "parsing/parser.ml" +||||||| 04da777f7 +# 97025 "parsing/parser.ml" +======= +# 97039 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 96400 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 96406 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 97046 "parsing/parser.ml" +||||||| 04da777f7 +# 97037 "parsing/parser.ml" +======= +# 97051 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97052 "parsing/parser.ml" +||||||| 04da777f7 +# 97043 "parsing/parser.ml" +======= +# 97057 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62841 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96416 "parsing/parser.ml" in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 62847 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 62855 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 97062 "parsing/parser.ml" +||||||| 04da777f7 +# 97053 "parsing/parser.ml" +======= +# 97067 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 96431 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97077 "parsing/parser.ml" +||||||| 04da777f7 +# 97068 "parsing/parser.ml" +======= +# 97082 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62865 "parsing/parser.ml" +<<<<<<< HEAD +# 96441 "parsing/parser.ml" in -# 4145 "parsing/parser.mly" +# 4331 "parsing/parser.mly" ( _1 ) -# 62871 "parsing/parser.ml" +# 96447 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97087 "parsing/parser.ml" +||||||| 04da777f7 +# 97078 "parsing/parser.ml" +======= +# 97092 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 97093 "parsing/parser.ml" +||||||| 04da777f7 +# 97084 "parsing/parser.ml" +======= +# 97098 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62880,14 +189766,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -62895,95 +189781,391 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in - let label : (string) = Obj.magic label in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 96524 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97170 "parsing/parser.ml" +||||||| 04da777f7 +# 97161 "parsing/parser.ml" +======= +# 97175 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos__1_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 62927 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined1, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 96536 "parsing/parser.ml" in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 96541 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62932 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 62939 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97182 "parsing/parser.ml" +||||||| 04da777f7 +# 97173 "parsing/parser.ml" +======= +# 97187 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97187 "parsing/parser.ml" +||||||| 04da777f7 +# 97178 "parsing/parser.ml" +======= +# 97192 "parsing/parser.ml" +>>>>>>> origin/main in - let _endpos__1_ = _endpos_ty_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 62945 "parsing/parser.ml" +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96550 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97196 "parsing/parser.ml" +||||||| 04da777f7 +# 97187 "parsing/parser.ml" +======= +# 97201 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 62952 "parsing/parser.ml" + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 96557 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97203 "parsing/parser.ml" +||||||| 04da777f7 +# 97194 "parsing/parser.ml" +======= +# 97208 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 96564 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97210 "parsing/parser.ml" +||||||| 04da777f7 +# 97201 "parsing/parser.ml" +======= +# 97215 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 96569 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 96575 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97215 "parsing/parser.ml" +||||||| 04da777f7 +# 97206 "parsing/parser.ml" +======= +# 97220 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 97221 "parsing/parser.ml" +||||||| 04da777f7 +# 97212 "parsing/parser.ml" +======= +# 97226 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 96587 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 96593 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 97233 "parsing/parser.ml" +||||||| 04da777f7 +# 97224 "parsing/parser.ml" +======= +# 97238 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97239 "parsing/parser.ml" +||||||| 04da777f7 +# 97230 "parsing/parser.ml" +======= +# 97244 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 62957 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96603 "parsing/parser.ml" + + in + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 97249 "parsing/parser.ml" +||||||| 04da777f7 +# 97240 "parsing/parser.ml" +======= +# 97254 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 62963 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 62971 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 96618 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97264 "parsing/parser.ml" +||||||| 04da777f7 +# 97255 "parsing/parser.ml" +======= +# 97269 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 62981 "parsing/parser.ml" +<<<<<<< HEAD +# 96628 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 96634 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97274 "parsing/parser.ml" +||||||| 04da777f7 +# 97265 "parsing/parser.ml" +======= +# 97279 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 62987 "parsing/parser.ml" +<<<<<<< HEAD +# 97280 "parsing/parser.ml" +||||||| 04da777f7 +# 97271 "parsing/parser.ml" +======= +# 97285 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -62996,34 +190178,34 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; @@ -63031,9 +190213,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = label; @@ -63049,124 +190231,384 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let label : (string) = Obj.magic label in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 96711 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97357 "parsing/parser.ml" +||||||| 04da777f7 +# 97348 "parsing/parser.ml" +======= +# 97362 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 63071 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, ty_inlined1, _1_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 96723 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97369 "parsing/parser.ml" +||||||| 04da777f7 +# 97360 "parsing/parser.ml" +======= +# 97374 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 96733 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 96739 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 97379 "parsing/parser.ml" +||||||| 04da777f7 +# 97370 "parsing/parser.ml" +======= +# 97384 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97385 "parsing/parser.ml" +||||||| 04da777f7 +# 97376 "parsing/parser.ml" +======= +# 97390 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 63076 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96749 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97395 "parsing/parser.ml" +||||||| 04da777f7 +# 97386 "parsing/parser.ml" +======= +# 97400 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 96756 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97402 "parsing/parser.ml" +||||||| 04da777f7 +# 97393 "parsing/parser.ml" +======= +# 97407 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 63088 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 96763 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97409 "parsing/parser.ml" +||||||| 04da777f7 +# 97400 "parsing/parser.ml" +======= +# 97414 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 63093 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 63099 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 63105 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in +<<<<<<< HEAD +# 96768 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 96774 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97414 "parsing/parser.ml" +||||||| 04da777f7 +# 97405 "parsing/parser.ml" +======= +# 97419 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 97420 "parsing/parser.ml" +||||||| 04da777f7 +# 97411 "parsing/parser.ml" +======= +# 97425 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 63115 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 96786 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 63121 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 96792 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 97432 "parsing/parser.ml" +||||||| 04da777f7 +# 97423 "parsing/parser.ml" +======= +# 97437 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97438 "parsing/parser.ml" +||||||| 04da777f7 +# 97429 "parsing/parser.ml" +======= +# 97443 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 63128 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96802 "parsing/parser.ml" in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 63135 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 63140 "parsing/parser.ml" + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 97448 "parsing/parser.ml" +||||||| 04da777f7 +# 97439 "parsing/parser.ml" +======= +# 97453 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 63146 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 63154 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 96817 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97463 "parsing/parser.ml" +||||||| 04da777f7 +# 97454 "parsing/parser.ml" +======= +# 97468 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 63164 "parsing/parser.ml" +<<<<<<< HEAD +# 96827 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 96833 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97473 "parsing/parser.ml" +||||||| 04da777f7 +# 97464 "parsing/parser.ml" +======= +# 97478 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 63170 "parsing/parser.ml" +<<<<<<< HEAD +# 97479 "parsing/parser.ml" +||||||| 04da777f7 +# 97470 "parsing/parser.ml" +======= +# 97484 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -63179,39 +190621,39 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; @@ -63219,9 +190661,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = label; @@ -63238,242 +190680,388 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x_inlined1 in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined1 : (Mode.Const.t list) = Obj.magic _1_inlined1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let label : (string) = Obj.magic label in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 96917 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97563 "parsing/parser.ml" +||||||| 04da777f7 +# 97554 "parsing/parser.ml" +======= +# 97568 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let x = x_inlined1 in - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 63262 "parsing/parser.ml" - in + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined2, ty_inlined1, _1_inlined1) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 96931 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97577 "parsing/parser.ml" +||||||| 04da777f7 +# 97568 "parsing/parser.ml" +======= +# 97582 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 96942 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 96948 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 97588 "parsing/parser.ml" +||||||| 04da777f7 +# 97579 "parsing/parser.ml" +======= +# 97593 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97594 "parsing/parser.ml" +||||||| 04da777f7 +# 97585 "parsing/parser.ml" +======= +# 97599 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 63267 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 96958 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97604 "parsing/parser.ml" +||||||| 04da777f7 +# 97595 "parsing/parser.ml" +======= +# 97609 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let tuple_with_modes = + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 96965 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97611 "parsing/parser.ml" +||||||| 04da777f7 +# 97602 "parsing/parser.ml" +======= +# 97616 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 63279 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 96972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97618 "parsing/parser.ml" +||||||| 04da777f7 +# 97609 "parsing/parser.ml" +======= +# 97623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 63284 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 63290 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 63296 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in +<<<<<<< HEAD +# 96977 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 96983 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97623 "parsing/parser.ml" +||||||| 04da777f7 +# 97614 "parsing/parser.ml" +======= +# 97628 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 97629 "parsing/parser.ml" +||||||| 04da777f7 +# 97620 "parsing/parser.ml" +======= +# 97634 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 63306 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 96995 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 63312 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 97001 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 97641 "parsing/parser.ml" +||||||| 04da777f7 +# 97632 "parsing/parser.ml" +======= +# 97646 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97647 "parsing/parser.ml" +||||||| 04da777f7 +# 97638 "parsing/parser.ml" +======= +# 97652 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 63319 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97011 "parsing/parser.ml" in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 63326 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 63331 "parsing/parser.ml" + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 97657 "parsing/parser.ml" +||||||| 04da777f7 +# 97648 "parsing/parser.ml" +======= +# 97662 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 63337 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 63345 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 97026 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97672 "parsing/parser.ml" +||||||| 04da777f7 +# 97663 "parsing/parser.ml" +======= +# 97677 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 63355 "parsing/parser.ml" +<<<<<<< HEAD +# 97036 "parsing/parser.ml" in -# 4145 "parsing/parser.mly" +# 4331 "parsing/parser.mly" ( _1 ) -# 63361 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in - let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let label : (string) = Obj.magic label in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 63417 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 63422 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 63429 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 63435 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 63442 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 63447 "parsing/parser.ml" - - in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 63453 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in - -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 63461 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 63471 "parsing/parser.ml" +# 97042 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97682 "parsing/parser.ml" +||||||| 04da777f7 +# 97673 "parsing/parser.ml" +======= +# 97687 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 63477 "parsing/parser.ml" +<<<<<<< HEAD +# 97688 "parsing/parser.ml" +||||||| 04da777f7 +# 97679 "parsing/parser.ml" +======= +# 97693 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -63486,118 +191074,409 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x_inlined1 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let label : (string) = Obj.magic label in + let _1 : (Mode.Const.t list) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 97119 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97765 "parsing/parser.ml" +||||||| 04da777f7 +# 97756 "parsing/parser.ml" +======= +# 97770 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let x = x_inlined1 in - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 63541 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 97131 "parsing/parser.ml" in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 97136 "parsing/parser.ml" + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 63546 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 63553 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97777 "parsing/parser.ml" +||||||| 04da777f7 +# 97768 "parsing/parser.ml" +======= +# 97782 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97782 "parsing/parser.ml" +||||||| 04da777f7 +# 97773 "parsing/parser.ml" +======= +# 97787 "parsing/parser.ml" +>>>>>>> origin/main in - let _endpos__1_ = _endpos_ty_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 63559 "parsing/parser.ml" +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97145 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97791 "parsing/parser.ml" +||||||| 04da777f7 +# 97782 "parsing/parser.ml" +======= +# 97796 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 63566 "parsing/parser.ml" - in + let tuple_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 97154 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97800 "parsing/parser.ml" +||||||| 04da777f7 +# 97791 "parsing/parser.ml" +======= +# 97805 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 97162 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97808 "parsing/parser.ml" +||||||| 04da777f7 +# 97799 "parsing/parser.ml" +======= +# 97813 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 97167 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 97173 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97813 "parsing/parser.ml" +||||||| 04da777f7 +# 97804 "parsing/parser.ml" +======= +# 97818 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 97819 "parsing/parser.ml" +||||||| 04da777f7 +# 97810 "parsing/parser.ml" +======= +# 97824 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 97185 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 97191 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 97831 "parsing/parser.ml" +||||||| 04da777f7 +# 97822 "parsing/parser.ml" +======= +# 97836 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97837 "parsing/parser.ml" +||||||| 04da777f7 +# 97828 "parsing/parser.ml" +======= +# 97842 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 63571 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97201 "parsing/parser.ml" in - let label = -# 4149 "parsing/parser.mly" - ( Optional label ) -# 63577 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 63585 "parsing/parser.ml" +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 97847 "parsing/parser.ml" +||||||| 04da777f7 +# 97838 "parsing/parser.ml" +======= +# 97852 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 97216 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97862 "parsing/parser.ml" +||||||| 04da777f7 +# 97853 "parsing/parser.ml" +======= +# 97867 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 63595 "parsing/parser.ml" +<<<<<<< HEAD +# 97226 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 97232 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97872 "parsing/parser.ml" +||||||| 04da777f7 +# 97863 "parsing/parser.ml" +======= +# 97877 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 63601 "parsing/parser.ml" +<<<<<<< HEAD +# 97878 "parsing/parser.ml" +||||||| 04da777f7 +# 97869 "parsing/parser.ml" +======= +# 97883 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -63610,50 +191489,56 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -63663,128 +191548,357 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined2 : (Mode.t) = Obj.magic _1_inlined2 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 63678 "parsing/parser.ml" +<<<<<<< HEAD +# 97316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97962 "parsing/parser.ml" +||||||| 04da777f7 +# 97953 "parsing/parser.ml" +======= +# 97967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 63689 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _1, ty) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _1_inlined2, ty_inlined1) in + let m1 = +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 97328 "parsing/parser.ml" + in + let m0 = +# 4367 "parsing/parser.mly" + ( Mode.empty ) +# 97333 "parsing/parser.ml" in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 63694 "parsing/parser.ml" +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97974 "parsing/parser.ml" +||||||| 04da777f7 +# 97965 "parsing/parser.ml" +======= +# 97979 "parsing/parser.ml" +>>>>>>> origin/main + in + let m0 = +<<<<<<< HEAD +# 4386 "parsing/parser.mly" +||||||| 04da777f7 +# 4379 "parsing/parser.mly" +======= +# 4370 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 97979 "parsing/parser.ml" +||||||| 04da777f7 +# 97970 "parsing/parser.ml" +======= +# 97984 "parsing/parser.ml" +>>>>>>> origin/main + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in + +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97342 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 97988 "parsing/parser.ml" +||||||| 04da777f7 +# 97979 "parsing/parser.ml" +======= +# 97993 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let tuple_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 97351 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 97997 "parsing/parser.ml" +||||||| 04da777f7 +# 97988 "parsing/parser.ml" +======= +# 98002 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 63706 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 97359 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98005 "parsing/parser.ml" +||||||| 04da777f7 +# 97996 "parsing/parser.ml" +======= +# 98010 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 63711 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 63717 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 63723 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in +<<<<<<< HEAD +# 97364 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 97370 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98010 "parsing/parser.ml" +||||||| 04da777f7 +# 98001 "parsing/parser.ml" +======= +# 98015 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 98016 "parsing/parser.ml" +||||||| 04da777f7 +# 98007 "parsing/parser.ml" +======= +# 98021 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 63733 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 97382 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 63739 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 97388 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 98028 "parsing/parser.ml" +||||||| 04da777f7 +# 98019 "parsing/parser.ml" +======= +# 98033 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98034 "parsing/parser.ml" +||||||| 04da777f7 +# 98025 "parsing/parser.ml" +======= +# 98039 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 63746 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97398 "parsing/parser.ml" in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 63753 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 63758 "parsing/parser.ml" + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 98044 "parsing/parser.ml" +||||||| 04da777f7 +# 98035 "parsing/parser.ml" +======= +# 98049 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 63764 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 63772 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 97413 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98059 "parsing/parser.ml" +||||||| 04da777f7 +# 98050 "parsing/parser.ml" +======= +# 98064 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 63782 "parsing/parser.ml" +<<<<<<< HEAD +# 97423 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 97429 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98069 "parsing/parser.ml" +||||||| 04da777f7 +# 98060 "parsing/parser.ml" +======= +# 98074 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 63788 "parsing/parser.ml" +<<<<<<< HEAD +# 98075 "parsing/parser.ml" +||||||| 04da777f7 +# 98066 "parsing/parser.ml" +======= +# 98080 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -63797,14 +191911,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -63812,24 +191926,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; @@ -63856,129 +191970,388 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 63872 "parsing/parser.ml" +<<<<<<< HEAD +# 97513 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98159 "parsing/parser.ml" +||||||| 04da777f7 +# 98150 "parsing/parser.ml" +======= +# 98164 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos_ty_inlined1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 63883 "parsing/parser.ml" + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, ty_inlined1, _1_inlined2) in + let m1 = +<<<<<<< HEAD +# 4388 "parsing/parser.mly" + ( Mode.empty ) +# 97525 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4407 "parsing/parser.mly" +||||||| 04da777f7 +# 4400 "parsing/parser.mly" +======= +# 4391 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 98171 "parsing/parser.ml" +||||||| 04da777f7 +# 98162 "parsing/parser.ml" +======= +# 98176 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 97535 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 97541 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 98181 "parsing/parser.ml" +||||||| 04da777f7 +# 98172 "parsing/parser.ml" +======= +# 98186 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98187 "parsing/parser.ml" +||||||| 04da777f7 +# 98178 "parsing/parser.ml" +======= +# 98192 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 63888 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97551 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98197 "parsing/parser.ml" +||||||| 04da777f7 +# 98188 "parsing/parser.ml" +======= +# 98202 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = + let tuple_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 97560 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98206 "parsing/parser.ml" +||||||| 04da777f7 +# 98197 "parsing/parser.ml" +======= +# 98211 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 63900 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" +<<<<<<< HEAD +# 97568 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98214 "parsing/parser.ml" +||||||| 04da777f7 +# 98205 "parsing/parser.ml" +======= +# 98219 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" ( xs ) -# 63905 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 63911 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 63917 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in +<<<<<<< HEAD +# 97573 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 97579 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98219 "parsing/parser.ml" +||||||| 04da777f7 +# 98210 "parsing/parser.ml" +======= +# 98224 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 98225 "parsing/parser.ml" +||||||| 04da777f7 +# 98216 "parsing/parser.ml" +======= +# 98230 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 63927 "parsing/parser.ml" +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 97591 "parsing/parser.ml" in -# 4172 "parsing/parser.mly" - ( _1 ) -# 63933 "parsing/parser.ml" +# 4368 "parsing/parser.mly" + (_1) +# 97597 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 98237 "parsing/parser.ml" +||||||| 04da777f7 +# 98228 "parsing/parser.ml" +======= +# 98242 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98243 "parsing/parser.ml" +||||||| 04da777f7 +# 98234 "parsing/parser.ml" +======= +# 98248 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 63940 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97607 "parsing/parser.ml" in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 63947 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 63952 "parsing/parser.ml" + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 98253 "parsing/parser.ml" +||||||| 04da777f7 +# 98244 "parsing/parser.ml" +======= +# 98258 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 63958 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 63966 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 97622 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98268 "parsing/parser.ml" +||||||| 04da777f7 +# 98259 "parsing/parser.ml" +======= +# 98273 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_ty_inlined1_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 63976 "parsing/parser.ml" +<<<<<<< HEAD +# 97632 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 97638 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98278 "parsing/parser.ml" +||||||| 04da777f7 +# 98269 "parsing/parser.ml" +======= +# 98283 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 63982 "parsing/parser.ml" +<<<<<<< HEAD +# 98284 "parsing/parser.ml" +||||||| 04da777f7 +# 98275 "parsing/parser.ml" +======= +# 98289 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -63991,114 +192364,457 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_ty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_ty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty_inlined1 : (Parsetree.core_type) = Obj.magic ty_inlined1 in + let _1_inlined2 : (Mode.Const.t list) = Obj.magic _1_inlined2 in let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Mode.t) = Obj.magic _1_inlined1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Mode.Const.t list) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 64031 "parsing/parser.ml" +<<<<<<< HEAD +# 97729 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98375 "parsing/parser.ml" +||||||| 04da777f7 +# 98366 "parsing/parser.ml" +======= +# 98380 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in + let _endpos = _endpos__1_inlined3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 64042 "parsing/parser.ml" - in + let codomain_with_modes = + let (_endpos_ty_, _startpos_ty_, _endpos__1_, _startpos__1_, _1_inlined1, ty, _1) = (_endpos_ty_inlined1_, _startpos_ty_inlined1_, _endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined3, ty_inlined1, _1_inlined2) in + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 97743 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98389 "parsing/parser.ml" +||||||| 04da777f7 +# 98380 "parsing/parser.ml" +======= +# 98394 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 97754 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 97760 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 98400 "parsing/parser.ml" +||||||| 04da777f7 +# 98391 "parsing/parser.ml" +======= +# 98405 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98406 "parsing/parser.ml" +||||||| 04da777f7 +# 98397 "parsing/parser.ml" +======= +# 98411 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 4165 "parsing/parser.mly" - ( flags ) -# 64047 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97770 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98416 "parsing/parser.ml" +||||||| 04da777f7 +# 98407 "parsing/parser.ml" +======= +# 98421 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 64054 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in + let tuple_with_modes = + let m1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 4389 "parsing/parser.mly" + (_1) +# 97779 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4408 "parsing/parser.mly" +||||||| 04da777f7 +# 4401 "parsing/parser.mly" +======= +# 4392 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98425 "parsing/parser.ml" +||||||| 04da777f7 +# 98416 "parsing/parser.ml" +======= +# 98430 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let ty = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 97787 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98433 "parsing/parser.ml" +||||||| 04da777f7 +# 98424 "parsing/parser.ml" +======= +# 98438 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 97792 "parsing/parser.ml" + + in + +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 97798 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98438 "parsing/parser.ml" +||||||| 04da777f7 +# 98429 "parsing/parser.ml" +======= +# 98443 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 98444 "parsing/parser.ml" +||||||| 04da777f7 +# 98435 "parsing/parser.ml" +======= +# 98449 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_ty_ = _endpos_xs_ in + let m0 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 4363 "parsing/parser.mly" + (mkloc _1 (make_loc _sloc)) +# 97810 "parsing/parser.ml" + + in + +# 4368 "parsing/parser.mly" + (_1) +# 97816 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4382 "parsing/parser.mly" +||||||| 04da777f7 +# 4375 "parsing/parser.mly" +======= +# 4366 "parsing/parser.mly" +>>>>>>> origin/main + (mkloc _1 (make_loc _sloc)) +<<<<<<< HEAD +# 98456 "parsing/parser.ml" +||||||| 04da777f7 +# 98447 "parsing/parser.ml" +======= +# 98461 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4387 "parsing/parser.mly" +||||||| 04da777f7 +# 4380 "parsing/parser.mly" +======= +# 4371 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 98462 "parsing/parser.ml" +||||||| 04da777f7 +# 98453 "parsing/parser.ml" +======= +# 98467 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _loc_ty_ = (_startpos_ty_, _endpos_ty_) in -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 64060 "parsing/parser.ml" +<<<<<<< HEAD +# 4393 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4412 "parsing/parser.mly" +||||||| 04da777f7 +# 4405 "parsing/parser.mly" +======= +# 4396 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( + let m = Mode.concat m0 m1 in + (ty, _loc_ty_), m + ) +<<<<<<< HEAD +# 97826 "parsing/parser.ml" in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 64067 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64072 "parsing/parser.ml" + +# 4320 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 98472 "parsing/parser.ml" +||||||| 04da777f7 +# 98463 "parsing/parser.ml" +======= +# 98477 "parsing/parser.ml" +>>>>>>> origin/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 64078 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 64086 "parsing/parser.ml" +<<<<<<< HEAD +# 4339 "parsing/parser.mly" +||||||| 04da777f7 +# 4332 "parsing/parser.mly" +======= +# 4323 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + ) +<<<<<<< HEAD +# 97841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98487 "parsing/parser.ml" +||||||| 04da777f7 +# 98478 "parsing/parser.ml" +======= +# 98492 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined3_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 64096 "parsing/parser.ml" +<<<<<<< HEAD +# 97851 "parsing/parser.ml" + + in + +# 4331 "parsing/parser.mly" + ( _1 ) +# 97857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98497 "parsing/parser.ml" +||||||| 04da777f7 +# 98488 "parsing/parser.ml" +======= +# 98502 "parsing/parser.ml" +>>>>>>> origin/main in -# 4145 "parsing/parser.mly" +<<<<<<< HEAD +# 4350 "parsing/parser.mly" +||||||| 04da777f7 +# 4343 "parsing/parser.mly" +======= +# 4334 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 64102 "parsing/parser.ml" +<<<<<<< HEAD +# 98503 "parsing/parser.ml" +||||||| 04da777f7 +# 98494 "parsing/parser.ml" +======= +# 98508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -64111,315 +192827,263 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _4 : unit = Obj.magic _4 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let ty : (Parsetree.core_type) = Obj.magic ty in let _2 : unit = Obj.magic _2 in let label : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 64158 "parsing/parser.ml" +<<<<<<< HEAD +# 97906 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98552 "parsing/parser.ml" +||||||| 04da777f7 +# 98543 "parsing/parser.ml" +======= +# 98557 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let ret_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 64169 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64174 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 64181 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 64187 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 64194 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64199 "parsing/parser.ml" - - in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 64205 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v : (Parsetree.core_type) = let _3 = + let ltys = + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 97916 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98562 "parsing/parser.ml" +||||||| 04da777f7 +# 98553 "parsing/parser.ml" +======= +# 98567 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 64213 "parsing/parser.ml" +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 97921 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 64223 "parsing/parser.ml" +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 97927 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98567 "parsing/parser.ml" +||||||| 04da777f7 +# 98558 "parsing/parser.ml" +======= +# 98572 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 98573 "parsing/parser.ml" +||||||| 04da777f7 +# 98564 "parsing/parser.ml" +======= +# 98578 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos__3_ = _endpos_xs_ in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4145 "parsing/parser.mly" - ( _1 ) -# 64229 "parsing/parser.ml" +<<<<<<< HEAD +# 4333 "parsing/parser.mly" + ( let ty, ltys = _3 in + ptyp_ltuple _sloc ((Some label, ty) :: ltys) + ) +# 97939 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4352 "parsing/parser.mly" +||||||| 04da777f7 +# 4345 "parsing/parser.mly" +======= +# 4336 "parsing/parser.mly" +>>>>>>> origin/main + ( let ty, ltys = _3 in + ptyp_ltuple _sloc ((Some label, ty) :: ltys) + ) +<<<<<<< HEAD +# 98585 "parsing/parser.ml" +||||||| 04da777f7 +# 98576 "parsing/parser.ml" +======= +# 98590 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; MenhirLib.EngineTypes.startp = _startpos; MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let label : ( -# 1094 "parsing/parser.mly" - (string) -# 64313 "parsing/parser.ml" - ) = Obj.magic label in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 64324 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64329 "parsing/parser.ml" - - in - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 64341 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 64346 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 64352 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 64358 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 64368 "parsing/parser.ml" - - in - -# 4172 "parsing/parser.mly" - ( _1 ) -# 64374 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 64381 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 64388 "parsing/parser.ml" + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xss; + MenhirLib.EngineTypes.startp = _startpos_xss_; + MenhirLib.EngineTypes.endp = _endpos_xss_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let xss : (Parsetree.structure_item list list) = Obj.magic xss in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xss_ in + let _endpos = _endpos_xss_ in + let _v : (Parsetree.structure) = let _1 = + let _1 = + let ys = +# 260 "" + ( List.flatten xss ) +<<<<<<< HEAD +# 97966 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98612 "parsing/parser.ml" +||||||| 04da777f7 +# 98603 "parsing/parser.ml" +======= +# 98617 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let xs = + let items = +# 1268 "parsing/parser.mly" + ( [] ) +<<<<<<< HEAD +# 97972 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98618 "parsing/parser.ml" +||||||| 04da777f7 +# 98609 "parsing/parser.ml" +======= +# 98623 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4165 "parsing/parser.mly" - ( flags ) -# 64393 "parsing/parser.ml" +# 1718 "parsing/parser.mly" + ( items ) +<<<<<<< HEAD +# 97977 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98623 "parsing/parser.ml" +||||||| 04da777f7 +# 98614 "parsing/parser.ml" +======= +# 98628 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 64399 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 64407 "parsing/parser.ml" +# 267 "" + ( xs @ ys ) +<<<<<<< HEAD +# 97983 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98629 "parsing/parser.ml" +||||||| 04da777f7 +# 98620 "parsing/parser.ml" +======= +# 98634 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos__1_ in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 64417 "parsing/parser.ml" +# 1187 "parsing/parser.mly" + ( extra_str _startpos _endpos _1 ) +<<<<<<< HEAD +# 97992 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98638 "parsing/parser.ml" +||||||| 04da777f7 +# 98629 "parsing/parser.ml" +======= +# 98643 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" - ( _1 ) -# 64423 "parsing/parser.ml" +# 1711 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 97998 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98644 "parsing/parser.ml" +||||||| 04da777f7 +# 98635 "parsing/parser.ml" +======= +# 98649 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -64432,196 +193096,247 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = xss; + MenhirLib.EngineTypes.startp = _startpos_xss_; + MenhirLib.EngineTypes.endp = _endpos_xss_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = e; + MenhirLib.EngineTypes.startp = _startpos_e_; + MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x_inlined1 in - let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let label : ( -# 1094 "parsing/parser.mly" - (string) -# 64514 "parsing/parser.ml" - ) = Obj.magic label in + let xss : (Parsetree.structure_item list list) = Obj.magic xss in + let _1 : (Parsetree.attributes) = Obj.magic _1 in + let e : (Parsetree.expression) = Obj.magic e in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _startpos = _startpos_e_ in + let _endpos = _endpos_xss_ in + let _v : (Parsetree.structure) = let _1 = let _1 = - let ret_unique_local = - let x = x_inlined1 in - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 64526 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64531 "parsing/parser.ml" - - in - let domain = - let _1 = - let _1 = + let ys = +# 260 "" + ( List.flatten xss ) +<<<<<<< HEAD +# 98039 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98685 "parsing/parser.ml" +||||||| 04da777f7 +# 98676 "parsing/parser.ml" +======= +# 98690 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let xs = + let items = + let x = let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 64543 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 64548 "parsing/parser.ml" - - in + let _1 = + let attrs = +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 98049 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 98695 "parsing/parser.ml" +||||||| 04da777f7 +# 98686 "parsing/parser.ml" +======= +# 98700 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 4043 "parsing/parser.mly" - ( _1 ) -# 64554 "parsing/parser.ml" +# 1725 "parsing/parser.mly" + ( mkstrexp e attrs ) +<<<<<<< HEAD +# 98054 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98700 "parsing/parser.ml" +||||||| 04da777f7 +# 98691 "parsing/parser.ml" +======= +# 98705 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _startpos__1_ = _startpos_e_ in + let _startpos = _startpos__1_ in -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 64560 "parsing/parser.ml" +# 1199 "parsing/parser.mly" + ( text_str _startpos @ [_1] ) +<<<<<<< HEAD +# 98062 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98708 "parsing/parser.ml" +||||||| 04da777f7 +# 98699 "parsing/parser.ml" +======= +# 98713 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in + let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos__1_ in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 64570 "parsing/parser.ml" +# 1218 "parsing/parser.mly" + ( mark_rhs_docs _startpos _endpos; + _1 ) +<<<<<<< HEAD +# 98072 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98718 "parsing/parser.ml" +||||||| 04da777f7 +# 98709 "parsing/parser.ml" +======= +# 98723 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4172 "parsing/parser.mly" - ( _1 ) -# 64576 "parsing/parser.ml" +# 1270 "parsing/parser.mly" + ( x ) +<<<<<<< HEAD +# 98078 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98724 "parsing/parser.ml" +||||||| 04da777f7 +# 98715 "parsing/parser.ml" +======= +# 98729 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 64583 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 64590 "parsing/parser.ml" - in -# 4165 "parsing/parser.mly" - ( flags ) -# 64595 "parsing/parser.ml" +# 1718 "parsing/parser.mly" + ( items ) +<<<<<<< HEAD +# 98084 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98730 "parsing/parser.ml" +||||||| 04da777f7 +# 98721 "parsing/parser.ml" +======= +# 98735 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 64601 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 64609 "parsing/parser.ml" +# 267 "" + ( xs @ ys ) +<<<<<<< HEAD +# 98090 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98736 "parsing/parser.ml" +||||||| 04da777f7 +# 98727 "parsing/parser.ml" +======= +# 98741 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _startpos = _startpos__1_ in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 64619 "parsing/parser.ml" +# 1187 "parsing/parser.mly" + ( extra_str _startpos _endpos _1 ) +<<<<<<< HEAD +# 98099 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98745 "parsing/parser.ml" +||||||| 04da777f7 +# 98736 "parsing/parser.ml" +======= +# 98750 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" - ( _1 ) -# 64625 "parsing/parser.ml" +# 1711 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 98105 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98751 "parsing/parser.ml" +||||||| 04da777f7 +# 98742 "parsing/parser.ml" +======= +# 98756 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (let_bindings) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1740 "parsing/parser.mly" + ( val_of_let_bindings ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98133 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98779 "parsing/parser.ml" +||||||| 04da777f7 +# 98770 "parsing/parser.ml" +======= +# 98784 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -64634,121 +193349,339 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in - let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let label : ( -# 1094 "parsing/parser.mly" - (string) -# 64681 "parsing/parser.ml" - ) = Obj.magic label in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : (Parsetree.extension) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.structure_item) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 64692 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64697 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 64704 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 64710 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 64717 "parsing/parser.ml" - in + let _2 = + let _1 = _1_inlined1 in -# 4165 "parsing/parser.mly" - ( flags ) -# 64722 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 98169 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 98815 "parsing/parser.ml" +||||||| 04da777f7 +# 98806 "parsing/parser.ml" +======= +# 98820 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 64728 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in + let _endpos__2_ = _endpos__1_inlined1_ in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 64736 "parsing/parser.ml" +# 1743 "parsing/parser.mly" + ( let docs = symbol_docs _sloc in + Pstr_extension (_1, add_docs_attrs docs _2) ) +<<<<<<< HEAD +# 98180 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98826 "parsing/parser.ml" +||||||| 04da777f7 +# 98817 "parsing/parser.ml" +======= +# 98831 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos__1_ = _endpos__1_inlined1_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 64746 "parsing/parser.ml" +# 1234 "parsing/parser.mly" + ( mkstr ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98190 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98836 "parsing/parser.ml" +||||||| 04da777f7 +# 98827 "parsing/parser.ml" +======= +# 98841 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1772 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 98196 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98842 "parsing/parser.ml" +||||||| 04da777f7 +# 98833 "parsing/parser.ml" +======= +# 98847 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.attribute) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _1 = + let _1 = +# 1746 "parsing/parser.mly" + ( Pstr_attribute _1 ) +<<<<<<< HEAD +# 98222 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98868 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1244 "parsing/parser.mly" + ( mkstr ~loc:_sloc _1 ) +# 98876 "parsing/parser.ml" + + in + +# 1782 "parsing/parser.mly" + ( _1 ) +# 98882 "parsing/parser.ml" +||||||| 04da777f7 +# 98859 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1244 "parsing/parser.mly" + ( mkstr ~loc:_sloc _1 ) +# 98867 "parsing/parser.ml" + + in + +# 1782 "parsing/parser.mly" + ( _1 ) +# 98873 "parsing/parser.ml" +======= +# 98873 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1234 "parsing/parser.mly" + ( mkstr ~loc:_sloc _1 ) +# 98230 "parsing/parser.ml" + + in + +# 1772 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 98236 "parsing/parser.ml" +======= +# 98887 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.value_description * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _1 = + let _1 = +# 1750 "parsing/parser.mly" + ( pstr_primitive _1 ) +<<<<<<< HEAD +# 98262 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98908 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1261 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +# 98916 "parsing/parser.ml" + + in + +# 1782 "parsing/parser.mly" + ( _1 ) +# 98922 "parsing/parser.ml" +||||||| 04da777f7 +# 98899 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1261 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +# 98907 "parsing/parser.ml" + + in + +# 1782 "parsing/parser.mly" + ( _1 ) +# 98913 "parsing/parser.ml" +======= +# 98913 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +# 98270 "parsing/parser.ml" + + in + +# 1772 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 98276 "parsing/parser.ml" +======= +# 98927 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.value_description * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _1 = + let _1 = +# 1752 "parsing/parser.mly" + ( pstr_primitive _1 ) +<<<<<<< HEAD +# 98302 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98948 "parsing/parser.ml" +||||||| 04da777f7 +# 98939 "parsing/parser.ml" +======= +# 98953 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98310 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98956 "parsing/parser.ml" +||||||| 04da777f7 +# 98947 "parsing/parser.ml" +======= +# 98961 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 64752 "parsing/parser.ml" +<<<<<<< HEAD +# 98316 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98962 "parsing/parser.ml" +||||||| 04da777f7 +# 98953 "parsing/parser.ml" +======= +# 98967 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -64761,129 +193694,136 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = bs; + MenhirLib.EngineTypes.startp = _startpos_bs_; + MenhirLib.EngineTypes.endp = _endpos_bs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x_inlined1 in - let _4 : unit = Obj.magic _4 in - let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let label : ( -# 1094 "parsing/parser.mly" - (string) -# 64815 "parsing/parser.ml" - ) = Obj.magic label in + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = a; + MenhirLib.EngineTypes.startp = _startpos_a_; + MenhirLib.EngineTypes.endp = _endpos_a_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let bs : (Parsetree.type_declaration list) = Obj.magic bs in + let a : ((Asttypes.rec_flag * string Asttypes.loc option) * + Parsetree.type_declaration) = Obj.magic a in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _startpos = _startpos_a_ in + let _endpos = _endpos_bs_ in + let _v : (Parsetree.structure_item) = let _1 = let _1 = - let ret_unique_local = - let x = x_inlined1 in - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 64827 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64832 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 64839 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 64845 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 64852 "parsing/parser.ml" - in + let _1 = + let _1 = + let _1 = +# 1449 "parsing/parser.mly" + ( let (x, b) = a in x, b :: bs ) +<<<<<<< HEAD +# 98353 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 98999 "parsing/parser.ml" +||||||| 04da777f7 +# 98990 "parsing/parser.ml" +======= +# 99004 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 3778 "parsing/parser.mly" +||||||| 04da777f7 +# 3776 "parsing/parser.mly" +======= +# 3767 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 98358 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99004 "parsing/parser.ml" +||||||| 04da777f7 +# 98995 "parsing/parser.ml" +======= +# 99009 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4165 "parsing/parser.mly" - ( flags ) -# 64857 "parsing/parser.ml" +<<<<<<< HEAD +# 3761 "parsing/parser.mly" +||||||| 04da777f7 +# 3759 "parsing/parser.mly" +======= +# 3750 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 98364 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99010 "parsing/parser.ml" +||||||| 04da777f7 +# 99001 "parsing/parser.ml" +======= +# 99015 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4151 "parsing/parser.mly" - ( Labelled label ) -# 64863 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 64871 "parsing/parser.ml" +# 1754 "parsing/parser.mly" + ( pstr_type _1 ) +<<<<<<< HEAD +# 98370 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99016 "parsing/parser.ml" +||||||| 04da777f7 +# 99007 "parsing/parser.ml" +======= +# 99021 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 64881 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98380 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99026 "parsing/parser.ml" +||||||| 04da777f7 +# 99017 "parsing/parser.ml" +======= +# 99031 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 64887 "parsing/parser.ml" +<<<<<<< HEAD +# 98386 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99032 "parsing/parser.ml" +||||||| 04da777f7 +# 99023 "parsing/parser.ml" +======= +# 99037 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -64896,40 +193836,52 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = priv; + MenhirLib.EngineTypes.startp = _startpos_priv_; + MenhirLib.EngineTypes.endp = _endpos_priv_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -64937,122 +193889,240 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let priv : (Asttypes.private_flag) = Obj.magic priv in + let _7 : unit = Obj.magic _7 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.structure_item) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 64957 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 64962 "parsing/parser.ml" - - in - let domain = + let _1 = let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 98473 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99119 "parsing/parser.ml" +||||||| 04da777f7 +# 99110 "parsing/parser.ml" +======= +# 99124 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let cs = +# 1441 "parsing/parser.mly" ( List.rev xs ) -# 64974 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 64979 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 64985 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 64991 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in +<<<<<<< HEAD +# 98480 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99126 "parsing/parser.ml" +||||||| 04da777f7 +# 99117 "parsing/parser.ml" +======= +# 99131 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let tid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 65001 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 98490 "parsing/parser.ml" + + in + let _4 = +# 4837 "parsing/parser.mly" + ( Recursive ) +# 98496 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99136 "parsing/parser.ml" +||||||| 04da777f7 +# 99127 "parsing/parser.ml" +======= +# 99141 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _4 = +<<<<<<< HEAD +# 4841 "parsing/parser.mly" +||||||| 04da777f7 +# 4834 "parsing/parser.mly" +======= +# 4825 "parsing/parser.mly" +>>>>>>> origin/main + ( Recursive ) +<<<<<<< HEAD +# 99142 "parsing/parser.ml" +||||||| 04da777f7 +# 99133 "parsing/parser.ml" +======= +# 99147 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 98503 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99149 "parsing/parser.ml" +||||||| 04da777f7 +# 99140 "parsing/parser.ml" +======= +# 99154 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4172 "parsing/parser.mly" - ( _1 ) -# 65007 "parsing/parser.ml" +<<<<<<< HEAD +# 4105 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4124 "parsing/parser.mly" +||||||| 04da777f7 +# 4117 "parsing/parser.mly" +======= +# 4108 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + Te.mk tid cs ~params ~priv ~attrs ~docs, + ext ) +<<<<<<< HEAD +# 98515 "parsing/parser.ml" in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65014 "parsing/parser.ml" - in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 65021 "parsing/parser.ml" - in +# 4088 "parsing/parser.mly" + ( _1 ) +# 98521 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99161 "parsing/parser.ml" +||||||| 04da777f7 +# 99152 "parsing/parser.ml" +======= +# 99166 "parsing/parser.ml" +>>>>>>> origin/main + + in -# 4165 "parsing/parser.mly" - ( flags ) -# 65026 "parsing/parser.ml" +<<<<<<< HEAD +# 4107 "parsing/parser.mly" +||||||| 04da777f7 +# 4100 "parsing/parser.mly" +======= +# 4091 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99167 "parsing/parser.ml" +||||||| 04da777f7 +# 99158 "parsing/parser.ml" +======= +# 99172 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 65032 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 65040 "parsing/parser.ml" +# 1756 "parsing/parser.mly" + ( pstr_typext _1 ) +<<<<<<< HEAD +# 98527 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99173 "parsing/parser.ml" +||||||| 04da777f7 +# 99164 "parsing/parser.ml" +======= +# 99178 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos_codomain_ in + let _endpos__1_ = _endpos__1_inlined3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 65050 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98537 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99183 "parsing/parser.ml" +||||||| 04da777f7 +# 99174 "parsing/parser.ml" +======= +# 99188 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 65056 "parsing/parser.ml" +<<<<<<< HEAD +# 98543 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99189 "parsing/parser.ml" +||||||| 04da777f7 +# 99180 "parsing/parser.ml" +======= +# 99194 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -65065,45 +194135,57 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = priv; + MenhirLib.EngineTypes.startp = _startpos_priv_; + MenhirLib.EngineTypes.endp = _endpos_priv_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -65112,123 +194194,247 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let priv : (Asttypes.private_flag) = Obj.magic priv in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.structure_item) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65133 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65138 "parsing/parser.ml" - - in - let domain = + let _1 = let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" + let attrs2 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 98637 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99283 "parsing/parser.ml" +||||||| 04da777f7 +# 99274 "parsing/parser.ml" +======= +# 99288 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let cs = +# 1441 "parsing/parser.mly" ( List.rev xs ) -# 65150 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 65155 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 65161 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 65167 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in +<<<<<<< HEAD +# 98644 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99290 "parsing/parser.ml" +||||||| 04da777f7 +# 99281 "parsing/parser.ml" +======= +# 99295 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let tid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 65177 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 98654 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99300 "parsing/parser.ml" +||||||| 04da777f7 +# 99291 "parsing/parser.ml" +======= +# 99305 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _4 = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +<<<<<<< HEAD +# 4839 "parsing/parser.mly" + ( not_expecting _loc "nonrec flag" ) +# 98665 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4843 "parsing/parser.mly" +||||||| 04da777f7 +# 4836 "parsing/parser.mly" +======= +# 4827 "parsing/parser.mly" +>>>>>>> origin/main + ( not_expecting _loc "nonrec flag" ) +<<<<<<< HEAD +# 99311 "parsing/parser.ml" +||||||| 04da777f7 +# 99302 "parsing/parser.ml" +======= +# 99316 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 98673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99319 "parsing/parser.ml" +||||||| 04da777f7 +# 99310 "parsing/parser.ml" +======= +# 99324 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4172 "parsing/parser.mly" - ( _1 ) -# 65183 "parsing/parser.ml" +<<<<<<< HEAD +# 4105 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4124 "parsing/parser.mly" +||||||| 04da777f7 +# 4117 "parsing/parser.mly" +======= +# 4108 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main + ( let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + Te.mk tid cs ~params ~priv ~attrs ~docs, + ext ) +<<<<<<< HEAD +# 98685 "parsing/parser.ml" in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65190 "parsing/parser.ml" - in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 65197 "parsing/parser.ml" - in +# 4088 "parsing/parser.mly" + ( _1 ) +# 98691 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99331 "parsing/parser.ml" +||||||| 04da777f7 +# 99322 "parsing/parser.ml" +======= +# 99336 "parsing/parser.ml" +>>>>>>> origin/main + + in -# 4165 "parsing/parser.mly" - ( flags ) -# 65202 "parsing/parser.ml" +<<<<<<< HEAD +# 4107 "parsing/parser.mly" +||||||| 04da777f7 +# 4100 "parsing/parser.mly" +======= +# 4091 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99337 "parsing/parser.ml" +||||||| 04da777f7 +# 99328 "parsing/parser.ml" +======= +# 99342 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 65208 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 65216 "parsing/parser.ml" +# 1756 "parsing/parser.mly" + ( pstr_typext _1 ) +<<<<<<< HEAD +# 98697 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99343 "parsing/parser.ml" +||||||| 04da777f7 +# 99334 "parsing/parser.ml" +======= +# 99348 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos_codomain_ in + let _endpos__1_ = _endpos__1_inlined4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 65226 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98707 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99353 "parsing/parser.ml" +||||||| 04da777f7 +# 99344 "parsing/parser.ml" +======= +# 99358 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 65232 "parsing/parser.ml" +<<<<<<< HEAD +# 98713 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99359 "parsing/parser.ml" +||||||| 04da777f7 +# 99350 "parsing/parser.ml" +======= +# 99364 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -65240,97 +194446,65 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : (Parsetree.type_exception * string Asttypes.loc option) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 65274 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65279 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 65286 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65292 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 65299 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65304 "parsing/parser.ml" - - in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 65310 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in - -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 65318 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_ty_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _1 = + let _1 = +# 1758 "parsing/parser.mly" + ( pstr_exception _1 ) +<<<<<<< HEAD +# 98739 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99385 "parsing/parser.ml" +||||||| 04da777f7 +# 99376 "parsing/parser.ml" +======= +# 99390 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 65328 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98747 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99393 "parsing/parser.ml" +||||||| 04da777f7 +# 99384 "parsing/parser.ml" +======= +# 99398 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 65334 "parsing/parser.ml" +<<<<<<< HEAD +# 98753 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99399 "parsing/parser.ml" +||||||| 04da777f7 +# 99390 "parsing/parser.ml" +======= +# 99404 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -65343,103 +194517,206 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in - let _4 : unit = Obj.magic _4 in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.module_expr) = Obj.magic body in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.structure_item) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65383 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65388 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 65395 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65401 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 65408 "parsing/parser.ml" - in + let _1 = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 98818 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99464 "parsing/parser.ml" +||||||| 04da777f7 +# 99455 "parsing/parser.ml" +======= +# 99469 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 98830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99476 "parsing/parser.ml" +||||||| 04da777f7 +# 99467 "parsing/parser.ml" +======= +# 99481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 98838 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99484 "parsing/parser.ml" +||||||| 04da777f7 +# 99475 "parsing/parser.ml" +======= +# 99489 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4165 "parsing/parser.mly" - ( flags ) -# 65413 "parsing/parser.ml" +<<<<<<< HEAD +# 1810 "parsing/parser.mly" +||||||| 04da777f7 +# 1809 "parsing/parser.mly" +======= +# 1799 "parsing/parser.mly" +>>>>>>> origin/main + ( let docs = symbol_docs _sloc in + let loc = make_loc _sloc in + let attrs = attrs1 @ attrs2 in + let body = Mb.mk name body ~attrs ~loc ~docs in + Pstr_module body, ext ) +<<<<<<< HEAD +# 98851 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99497 "parsing/parser.ml" +||||||| 04da777f7 +# 99488 "parsing/parser.ml" +======= +# 99502 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 65419 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 65427 "parsing/parser.ml" +# 1760 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 98857 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99503 "parsing/parser.ml" +||||||| 04da777f7 +# 99494 "parsing/parser.ml" +======= +# 99508 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_ty_) in + let _endpos__1_ = _endpos__1_inlined3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 65437 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 98867 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99513 "parsing/parser.ml" +||||||| 04da777f7 +# 99504 "parsing/parser.ml" +======= +# 99518 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 65443 "parsing/parser.ml" +<<<<<<< HEAD +# 98873 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99519 "parsing/parser.ml" +||||||| 04da777f7 +# 99510 "parsing/parser.ml" +======= +# 99524 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -65452,44 +194729,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = bs; + MenhirLib.EngineTypes.startp = _startpos_bs_; + MenhirLib.EngineTypes.endp = _endpos_bs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -65499,123 +194776,215 @@ module Tables = struct }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let bs : (Parsetree.module_binding list) = Obj.magic bs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.module_expr) = Obj.magic body in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _startpos = _startpos__1_ in + let _endpos = _endpos_bs_ in + let _v : (Parsetree.structure_item) = let _1 = let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 65520 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65525 "parsing/parser.ml" - - in - let domain = + let _1 = let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 65537 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 65542 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 65548 "parsing/parser.ml" - - in + let a = + let attrs2 = + let _1 = _1_inlined3 in -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 65554 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 98954 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99600 "parsing/parser.ml" +||||||| 04da777f7 +# 99591 "parsing/parser.ml" +======= +# 99605 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 98966 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99612 "parsing/parser.ml" +||||||| 04da777f7 +# 99603 "parsing/parser.ml" +======= +# 99617 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 98974 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99620 "parsing/parser.ml" +||||||| 04da777f7 +# 99611 "parsing/parser.ml" +======= +# 99625 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 65564 "parsing/parser.ml" +<<<<<<< HEAD +# 1847 "parsing/parser.mly" +||||||| 04da777f7 +# 1846 "parsing/parser.mly" +======= +# 1836 "parsing/parser.mly" +>>>>>>> origin/main + ( + let loc = make_loc _sloc in + let attrs = attrs1 @ attrs2 in + let docs = symbol_docs _sloc in + ext, + Mb.mk name body ~attrs ~loc ~docs + ) +<<<<<<< HEAD +# 98989 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99635 "parsing/parser.ml" +||||||| 04da777f7 +# 99626 "parsing/parser.ml" +======= +# 99640 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4172 "parsing/parser.mly" - ( _1 ) -# 65570 "parsing/parser.ml" +# 1449 "parsing/parser.mly" + ( let (x, b) = a in x, b :: bs ) +<<<<<<< HEAD +# 98995 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99641 "parsing/parser.ml" +||||||| 04da777f7 +# 99632 "parsing/parser.ml" +======= +# 99646 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65577 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65584 "parsing/parser.ml" - in -# 4165 "parsing/parser.mly" - ( flags ) -# 65589 "parsing/parser.ml" +<<<<<<< HEAD +# 1835 "parsing/parser.mly" +||||||| 04da777f7 +# 1834 "parsing/parser.mly" +======= +# 1824 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99001 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99647 "parsing/parser.ml" +||||||| 04da777f7 +# 99638 "parsing/parser.ml" +======= +# 99652 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 65595 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 65603 "parsing/parser.ml" +# 1762 "parsing/parser.mly" + ( pstr_recmodule _1 ) +<<<<<<< HEAD +# 99007 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99653 "parsing/parser.ml" +||||||| 04da777f7 +# 99644 "parsing/parser.ml" +======= +# 99658 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_x_) in + let _endpos__1_ = _endpos_bs_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 65613 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 99017 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99663 "parsing/parser.ml" +||||||| 04da777f7 +# 99654 "parsing/parser.ml" +======= +# 99668 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 65619 "parsing/parser.ml" +<<<<<<< HEAD +# 99023 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99669 "parsing/parser.ml" +||||||| 04da777f7 +# 99660 "parsing/parser.ml" +======= +# 99674 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -65627,179 +194996,65 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = inner_type; - MenhirLib.EngineTypes.startp = _startpos_inner_type_; - MenhirLib.EngineTypes.endp = _endpos_inner_type_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x_inlined1 in - let _4 : unit = Obj.magic _4 in - let _5 : unit = Obj.magic _5 in - let inner_type : (Parsetree.core_type) = Obj.magic inner_type in - let _3 : unit = Obj.magic _3 in - let xs : ((string Location.loc * Jane_asttypes.jkind_annotation option) list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let _1 : (Parsetree.module_type_declaration * string Asttypes.loc option) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let ret_unique_local = - let x = x_inlined1 in - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65704 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65709 "parsing/parser.ml" - - in - let domain = - let _1 = - let _1 = - let _1 = - let bound_vars = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 65721 "parsing/parser.ml" - in - -# 1387 "parsing/parser.mly" - ( xs ) -# 65726 "parsing/parser.ml" - - in - -# 4043 "parsing/parser.mly" - ( _1 ) -# 65732 "parsing/parser.ml" - - in - -# 4170 "parsing/parser.mly" - ( Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } ) -# 65738 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1346 "parsing/parser.mly" - ( Jane_syntax.Layouts.type_of ~loc:(make_loc _sloc) _1 ) -# 65748 "parsing/parser.ml" - - in - -# 4172 "parsing/parser.mly" - ( _1 ) -# 65754 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__5_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65761 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65768 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65773 "parsing/parser.ml" - - in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 65779 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in - -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 65787 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_x_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _1 = + let _1 = +# 1764 "parsing/parser.mly" + ( let (body, ext) = _1 in (Pstr_modtype body, ext) ) +<<<<<<< HEAD +# 99049 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99695 "parsing/parser.ml" +||||||| 04da777f7 +# 99686 "parsing/parser.ml" +======= +# 99700 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 65797 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 99057 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99703 "parsing/parser.ml" +||||||| 04da777f7 +# 99694 "parsing/parser.ml" +======= +# 99708 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 65803 "parsing/parser.ml" +<<<<<<< HEAD +# 99063 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99709 "parsing/parser.ml" +||||||| 04da777f7 +# 99700 "parsing/parser.ml" +======= +# 99714 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -65811,104 +195066,65 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _4 : unit = Obj.magic _4 in - let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let _1 : (Parsetree.open_declaration * string Asttypes.loc option) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let ret_unique_local = - let flags = -# 1355 "parsing/parser.mly" - ( [] ) -# 65852 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65857 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 65864 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65870 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65877 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65882 "parsing/parser.ml" - - in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 65888 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in - -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 65896 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_x_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _1 = + let _1 = +# 1766 "parsing/parser.mly" + ( let (body, ext) = _1 in (Pstr_open body, ext) ) +<<<<<<< HEAD +# 99089 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99735 "parsing/parser.ml" +||||||| 04da777f7 +# 99726 "parsing/parser.ml" +======= +# 99740 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 65906 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 99097 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99743 "parsing/parser.ml" +||||||| 04da777f7 +# 99734 "parsing/parser.ml" +======= +# 99748 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 65912 "parsing/parser.ml" +<<<<<<< HEAD +# 99103 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99749 "parsing/parser.ml" +||||||| 04da777f7 +# 99740 "parsing/parser.ml" +======= +# 99754 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -65921,111 +195137,283 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = bs; + MenhirLib.EngineTypes.startp = _startpos_bs_; + MenhirLib.EngineTypes.endp = _endpos_bs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x_inlined1; - MenhirLib.EngineTypes.startp = _startpos_x_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_x_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let x_inlined1 : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x_inlined1 in - let _4 : unit = Obj.magic _4 in - let ty : (Parsetree.core_type) = Obj.magic ty in - let x : ((mode_annotation * (Lexing.position * Lexing.position)) list) = Obj.magic x in + let bs : (Parsetree.class_declaration list) = Obj.magic bs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.class_expr) = Obj.magic body in + let _1_inlined2 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 99175 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99821 "parsing/parser.ml" +||||||| 04da777f7 +# 99812 "parsing/parser.ml" +======= +# 99826 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = + let _startpos = _startpos__1_ in + let _endpos = _endpos_bs_ in + let _v : (Parsetree.structure_item) = let _1 = let _1 = - let ret_unique_local = - let x = x_inlined1 in - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65969 "parsing/parser.ml" - in - -# 4165 "parsing/parser.mly" - ( flags ) -# 65974 "parsing/parser.ml" - - in - let domain = - let _1 = -# 4174 "parsing/parser.mly" - ( ty ) -# 65981 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_ty_ in - -# 1280 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 65987 "parsing/parser.ml" - - in - let arg_unique_local = - let flags = -# 1357 "parsing/parser.mly" - ( x ) -# 65994 "parsing/parser.ml" - in + let _1 = + let _1 = + let a = + let attrs2 = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 99195 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99841 "parsing/parser.ml" +||||||| 04da777f7 +# 99832 "parsing/parser.ml" +======= +# 99846 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 99207 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99853 "parsing/parser.ml" +||||||| 04da777f7 +# 99844 "parsing/parser.ml" +======= +# 99858 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 99215 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99861 "parsing/parser.ml" +||||||| 04da777f7 +# 99852 "parsing/parser.ml" +======= +# 99866 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 2217 "parsing/parser.mly" +||||||| 04da777f7 +# 2215 "parsing/parser.mly" +======= +# 2205 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + ext, + Ci.mk id body ~virt ~params ~attrs ~loc ~docs + ) +<<<<<<< HEAD +# 99230 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99876 "parsing/parser.ml" +||||||| 04da777f7 +# 99867 "parsing/parser.ml" +======= +# 99881 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 1449 "parsing/parser.mly" + ( let (x, b) = a in x, b :: bs ) +<<<<<<< HEAD +# 99236 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99882 "parsing/parser.ml" +||||||| 04da777f7 +# 99873 "parsing/parser.ml" +======= +# 99887 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in -# 4165 "parsing/parser.mly" - ( flags ) -# 65999 "parsing/parser.ml" +<<<<<<< HEAD +# 2206 "parsing/parser.mly" +||||||| 04da777f7 +# 2204 "parsing/parser.mly" +======= +# 2194 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 99242 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99888 "parsing/parser.ml" +||||||| 04da777f7 +# 99879 "parsing/parser.ml" +======= +# 99893 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let label = -# 4153 "parsing/parser.mly" - ( Nolabel ) -# 66005 "parsing/parser.ml" - in - let _loc_codomain_ = (_startpos_codomain_, _endpos_codomain_) in -# 4141 "parsing/parser.mly" - ( Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain _loc_codomain_)) ) -# 66013 "parsing/parser.ml" +# 1768 "parsing/parser.mly" + ( let (ext, l) = _1 in (Pstr_class l, ext) ) +<<<<<<< HEAD +# 99248 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99894 "parsing/parser.ml" +||||||| 04da777f7 +# 99885 "parsing/parser.ml" +======= +# 99899 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_x_) in + let _endpos__1_ = _endpos_bs_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 66023 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 99258 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99904 "parsing/parser.ml" +||||||| 04da777f7 +# 99895 "parsing/parser.ml" +======= +# 99909 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 4145 "parsing/parser.mly" +# 1772 "parsing/parser.mly" ( _1 ) -# 66029 "parsing/parser.ml" +<<<<<<< HEAD +# 99264 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99910 "parsing/parser.ml" +||||||| 04da777f7 +# 99901 "parsing/parser.ml" +======= +# 99915 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66038,53 +195426,64 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xss; - MenhirLib.EngineTypes.startp = _startpos_xss_; - MenhirLib.EngineTypes.endp = _endpos_xss_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let xss : (Parsetree.structure_item list list) = Obj.magic xss in + let _1 : (string Asttypes.loc option * Parsetree.class_type_declaration list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xss_ in - let _endpos = _endpos_xss_ in - let _v : (Parsetree.structure) = let _1 = - let _1 = - let ys = -# 260 "" - ( List.flatten xss ) -# 66056 "parsing/parser.ml" - in - let xs = - let items = -# 1355 "parsing/parser.mly" - ( [] ) -# 66062 "parsing/parser.ml" - in - -# 1805 "parsing/parser.mly" - ( items ) -# 66067 "parsing/parser.ml" - - in - -# 267 "" - ( xs @ ys ) -# 66073 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.structure_item) = let _1 = + let _1 = +# 1770 "parsing/parser.mly" + ( let (ext, l) = _1 in (Pstr_class_type l, ext) ) +<<<<<<< HEAD +# 99290 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99936 "parsing/parser.ml" +||||||| 04da777f7 +# 99927 "parsing/parser.ml" +======= +# 99941 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1274 "parsing/parser.mly" - ( extra_str _startpos _endpos _1 ) -# 66082 "parsing/parser.ml" +# 1251 "parsing/parser.mly" + ( wrap_mkstr_ext ~loc:_sloc _1 ) +<<<<<<< HEAD +# 99298 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99944 "parsing/parser.ml" +||||||| 04da777f7 +# 99935 "parsing/parser.ml" +======= +# 99949 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1798 "parsing/parser.mly" - ( _1 ) -# 66088 "parsing/parser.ml" +# 1772 "parsing/parser.mly" + ( _1 ) +<<<<<<< HEAD +# 99304 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 99950 "parsing/parser.ml" +||||||| 04da777f7 +# 99941 "parsing/parser.ml" +======= +# 99955 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66097,101 +195496,151 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xss; - MenhirLib.EngineTypes.startp = _startpos_xss_; - MenhirLib.EngineTypes.endp = _endpos_xss_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = thing; + MenhirLib.EngineTypes.startp = _startpos_thing_; + MenhirLib.EngineTypes.endp = _endpos_thing_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = e; - MenhirLib.EngineTypes.startp = _startpos_e_; - MenhirLib.EngineTypes.endp = _endpos_e_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = is_functor; + MenhirLib.EngineTypes.startp = _startpos_is_functor_; + MenhirLib.EngineTypes.endp = _endpos_is_functor_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let xss : (Parsetree.structure_item list list) = Obj.magic xss in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let thing : (Parsetree.module_expr) = Obj.magic thing in let _1 : (Parsetree.attributes) = Obj.magic _1 in - let e : (Parsetree.expression) = Obj.magic e in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let is_functor : (bool) = Obj.magic is_functor in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_e_ in - let _endpos = _endpos_xss_ in - let _v : (Parsetree.structure) = let _1 = - let _1 = - let ys = -# 260 "" - ( List.flatten xss ) -# 66129 "parsing/parser.ml" - in - let xs = - let items = - let x = - let _1 = - let _1 = - let attrs = -# 4722 "parsing/parser.mly" - ( _1 ) -# 66139 "parsing/parser.ml" - in - -# 1812 "parsing/parser.mly" - ( mkstrexp e attrs ) -# 66144 "parsing/parser.ml" - - in - let _startpos__1_ = _startpos_e_ in - let _startpos = _startpos__1_ in - -# 1286 "parsing/parser.mly" - ( text_str _startpos @ [_1] ) -# 66152 "parsing/parser.ml" - - in - let _startpos__1_ = _startpos_e_ in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - -# 1305 "parsing/parser.mly" - ( mark_rhs_docs _startpos _endpos; - _1 ) -# 66162 "parsing/parser.ml" - - in - -# 1357 "parsing/parser.mly" - ( x ) -# 66168 "parsing/parser.ml" - - in - -# 1805 "parsing/parser.mly" - ( items ) -# 66174 "parsing/parser.ml" - - in + let _startpos = _startpos_is_functor_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.structure_item) = let _1 = + let attrs2 = + let _1 = _1_inlined1 in -# 267 "" - ( xs @ ys ) -# 66180 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 99360 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 100006 "parsing/parser.ml" +||||||| 04da777f7 +# 99997 "parsing/parser.ml" +======= +# 100011 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in - let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in + let _endpos_attrs2_ = _endpos__1_inlined1_ in + let attrs1 = +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 99367 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 100013 "parsing/parser.ml" +||||||| 04da777f7 +# 100004 "parsing/parser.ml" +======= +# 100018 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos_is_functor_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1274 "parsing/parser.mly" - ( extra_str _startpos _endpos _1 ) -# 66189 "parsing/parser.ml" +<<<<<<< HEAD +# 1891 "parsing/parser.mly" +||||||| 04da777f7 +# 1890 "parsing/parser.mly" +======= +# 1880 "parsing/parser.mly" +>>>>>>> origin/main + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let incl = Incl.mk thing ~attrs ~loc ~docs in + is_functor, incl, ext + ) +<<<<<<< HEAD +# 99381 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100027 "parsing/parser.ml" +||||||| 04da777f7 +# 100018 "parsing/parser.ml" +======= +# 100032 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_is_functor_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1798 "parsing/parser.mly" - ( _1 ) -# 66195 "parsing/parser.ml" +# 1774 "parsing/parser.mly" + ( let is_functor, incl, ext = _1 in + let item = + if is_functor + then Jane_syntax.Include_functor.str_item_of ~loc:(make_loc _sloc) + (Ifstr_include_functor incl) + else mkstr ~loc:_sloc (Pstr_include incl) + in + wrap_str_ext ~loc:_sloc item ext + ) +<<<<<<< HEAD +# 99399 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100045 "parsing/parser.ml" +||||||| 04da777f7 +# 100036 "parsing/parser.ml" +======= +# 100050 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66209,17 +195658,126 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (let_bindings) = Obj.magic _1 in + let _1 : (string Asttypes.loc * Jane_syntax.Jkind.annotation) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in +<<<<<<< HEAD let _v : (Parsetree.structure_item) = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1827 "parsing/parser.mly" - ( val_of_let_bindings ~loc:_sloc _1 ) -# 66223 "parsing/parser.ml" +# 1794 "parsing/parser.mly" +||||||| 04da777f7 + let _v : (Parsetree.structure_item) = +# 1794 "parsing/parser.mly" +======= + let _v : (Parsetree.structure_item) = +# 1784 "parsing/parser.mly" +>>>>>>> origin/main + ( + let name, jkind = _1 in + Jane_syntax.Layouts.(str_item_of + ~loc:(make_loc _sloc) + (Lstr_kind_abbrev (name, jkind))) + ) +<<<<<<< HEAD +# 99428 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100078 "parsing/parser.ml" +||||||| 04da777f7 +# 100065 "parsing/parser.ml" +======= +# 100079 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +<<<<<<< HEAD +# 4914 "parsing/parser.mly" + ( "-" ) +# 99453 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4918 "parsing/parser.mly" +||||||| 04da777f7 +# 4911 "parsing/parser.mly" +======= +# 4902 "parsing/parser.mly" +>>>>>>> origin/main + ( "-" ) +<<<<<<< HEAD +# 100103 "parsing/parser.ml" +||||||| 04da777f7 +# 100090 "parsing/parser.ml" +======= +# 100104 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +<<<<<<< HEAD +# 4915 "parsing/parser.mly" + ( "-." ) +# 99478 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4919 "parsing/parser.mly" +||||||| 04da777f7 +# 4912 "parsing/parser.mly" +======= +# 4903 "parsing/parser.mly" +>>>>>>> origin/main + ( "-." ) +<<<<<<< HEAD +# 100128 "parsing/parser.ml" +||||||| 04da777f7 +# 100115 "parsing/parser.ml" +======= +# 100129 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66236,53 +195794,172 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : (Parsetree.extension) = Obj.magic _1 in + let xs : (Parsetree.core_type list) = Obj.magic xs in + let _3 : (bool) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.structure_item) = let _1 = + let _v : (Parsetree.row_field) = let _5 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 99533 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 100183 "parsing/parser.ml" +||||||| 04da777f7 +# 100170 "parsing/parser.ml" +======= +# 100184 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__5_ = _endpos__1_inlined1_ in + let _4 = let _1 = - let _2 = - let _1 = _1_inlined1 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 66259 "parsing/parser.ml" - - in - let _endpos__2_ = _endpos__1_inlined1_ in - let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let xs = +# 253 "" + ( List.rev xs ) +<<<<<<< HEAD +# 99542 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100192 "parsing/parser.ml" +||||||| 04da777f7 +# 100179 "parsing/parser.ml" +======= +# 100193 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 1830 "parsing/parser.mly" - ( let docs = symbol_docs _sloc in - Pstr_extension (_1, add_docs_attrs docs _2) ) -# 66270 "parsing/parser.ml" +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 99547 "parsing/parser.ml" in - let _endpos__1_ = _endpos__1_inlined1_ in + +# 4576 "parsing/parser.mly" + ( _1 ) +# 99553 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100197 "parsing/parser.ml" +||||||| 04da777f7 +# 100184 "parsing/parser.ml" +======= +# 100198 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4580 "parsing/parser.mly" +||||||| 04da777f7 +# 4573 "parsing/parser.mly" +======= +# 4564 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 100203 "parsing/parser.ml" +||||||| 04da777f7 +# 100190 "parsing/parser.ml" +======= +# 100204 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1321 "parsing/parser.mly" - ( mkstr ~loc:_sloc _1 ) -# 66280 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 99563 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100213 "parsing/parser.ml" +||||||| 04da777f7 +# 100200 "parsing/parser.ml" +======= +# 100214 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 66286 "parsing/parser.ml" +<<<<<<< HEAD +# 4562 "parsing/parser.mly" + ( let info = symbol_info _endpos in + let attrs = add_info_attrs info _5 in + Rf.tag ~loc:(make_loc _sloc) ~attrs _1 _3 _4 ) +# 99574 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4566 "parsing/parser.mly" +||||||| 04da777f7 +# 4559 "parsing/parser.mly" +======= +# 4550 "parsing/parser.mly" +>>>>>>> origin/main + ( let info = symbol_info _endpos in + let attrs = add_info_attrs info _5 in + Rf.tag ~loc:(make_loc _sloc) ~attrs _1 _3 _4 ) +<<<<<<< HEAD +# 100224 "parsing/parser.ml" +||||||| 04da777f7 +# 100211 "parsing/parser.ml" +======= +# 100225 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66294,35 +195971,99 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Parsetree.attribute) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = -# 1833 "parsing/parser.mly" - ( Pstr_attribute _1 ) -# 66312 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.row_field) = let _2 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 99608 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 100258 "parsing/parser.ml" +||||||| 04da777f7 +# 100245 "parsing/parser.ml" +======= +# 100259 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos__2_ = _endpos__1_inlined1_ in + let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1321 "parsing/parser.mly" - ( mkstr ~loc:_sloc _1 ) -# 66320 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 99619 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100269 "parsing/parser.ml" +||||||| 04da777f7 +# 100256 "parsing/parser.ml" +======= +# 100270 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 66326 "parsing/parser.ml" +<<<<<<< HEAD +# 4566 "parsing/parser.mly" + ( let info = symbol_info _endpos in + let attrs = add_info_attrs info _2 in + Rf.tag ~loc:(make_loc _sloc) ~attrs _1 true [] ) +# 99630 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4570 "parsing/parser.mly" +||||||| 04da777f7 +# 4563 "parsing/parser.mly" +======= +# 4554 "parsing/parser.mly" +>>>>>>> origin/main + ( let info = symbol_info _endpos in + let attrs = add_info_attrs info _2 in + Rf.tag ~loc:(make_loc _sloc) ~attrs _1 true [] ) +<<<<<<< HEAD +# 100280 "parsing/parser.ml" +||||||| 04da777f7 +# 100267 "parsing/parser.ml" +======= +# 100281 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66334,35 +196075,294 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.toplevel_phrase) = let arg = +# 124 "" + ( None ) +<<<<<<< HEAD +# 99662 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100312 "parsing/parser.ml" +||||||| 04da777f7 +# 100299 "parsing/parser.ml" +======= +# 100313 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos_arg_ = _endpos__1_inlined1_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 99673 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100323 "parsing/parser.ml" + + in + let _1 = +# 2975 "parsing/parser.mly" + ( () ) +# 100329 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4804 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100337 "parsing/parser.ml" +||||||| 04da777f7 +# 100310 "parsing/parser.ml" + + in + let _1 = +# 2973 "parsing/parser.mly" + ( () ) +# 100316 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4797 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100324 "parsing/parser.ml" +======= +# 100324 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _1 = +# 2963 "parsing/parser.mly" + ( () ) +# 99679 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +<<<<<<< HEAD +# 99687 "parsing/parser.ml" +======= +# 100338 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.value_description * string Location.loc option) = Obj.magic _1 in + let _1_inlined2 : ( +# 1048 "parsing/parser.mly" + (string * Location.t * string option) +<<<<<<< HEAD +# 99720 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100370 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = -# 1837 "parsing/parser.mly" - ( pstr_primitive _1 ) -# 66352 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4808 "parsing/parser.mly" + ( let (s, _, _) = _1 in Pdir_string s ) +# 100383 "parsing/parser.ml" +||||||| 04da777f7 +# 100357 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4801 "parsing/parser.mly" + ( let (s, _, _) = _1 in Pdir_string s ) +# 100370 "parsing/parser.ml" +======= +# 100371 "parsing/parser.ml" +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4804 "parsing/parser.mly" + ( let (s, _, _) = _1 in Pdir_string s ) +<<<<<<< HEAD +# 99733 "parsing/parser.ml" +======= +# 100384 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +<<<<<<< HEAD +# 99741 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100391 "parsing/parser.ml" +||||||| 04da777f7 +# 100378 "parsing/parser.ml" +======= +# 100392 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +# 126 "" + ( Some x ) +<<<<<<< HEAD +# 99747 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100397 "parsing/parser.ml" +||||||| 04da777f7 +# 100384 "parsing/parser.ml" +======= +# 100398 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 66360 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 99759 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100409 "parsing/parser.ml" +||||||| 04da777f7 +# 100396 "parsing/parser.ml" +======= +# 100410 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in + let _1 = +<<<<<<< HEAD +# 2975 "parsing/parser.mly" +||||||| 04da777f7 +# 2973 "parsing/parser.mly" +======= +# 2963 "parsing/parser.mly" +>>>>>>> origin/main + ( () ) +<<<<<<< HEAD +# 99765 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100415 "parsing/parser.ml" +||||||| 04da777f7 +# 100402 "parsing/parser.ml" +======= +# 100416 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 66366 "parsing/parser.ml" +<<<<<<< HEAD +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 99773 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4804 "parsing/parser.mly" +||||||| 04da777f7 +# 4797 "parsing/parser.mly" +======= +# 4788 "parsing/parser.mly" +>>>>>>> origin/main + ( mk_directive ~loc:_sloc dir arg ) +<<<<<<< HEAD +# 100423 "parsing/parser.ml" +||||||| 04da777f7 +# 100410 "parsing/parser.ml" +======= +# 100424 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66374,35 +196374,136 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.value_description * string Location.loc option) = Obj.magic _1 in + let _1_inlined2 : ( +# 988 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 99806 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100456 "parsing/parser.ml" +||||||| 04da777f7 +# 100443 "parsing/parser.ml" +======= +# 100457 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = -# 1839 "parsing/parser.mly" - ( pstr_primitive _1 ) -# 66392 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +<<<<<<< HEAD +# 4805 "parsing/parser.mly" + ( let (n, m) = _1 in Pdir_int (n ,m) ) +# 99819 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4809 "parsing/parser.mly" +||||||| 04da777f7 +# 4802 "parsing/parser.mly" +======= +# 4793 "parsing/parser.mly" +>>>>>>> origin/main + ( let (n, m) = _1 in Pdir_int (n ,m) ) +<<<<<<< HEAD +# 100469 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100477 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 100483 "parsing/parser.ml" +||||||| 04da777f7 +# 100456 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100464 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 100470 "parsing/parser.ml" +======= +# 100470 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 99827 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 99833 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 66400 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 99845 "parsing/parser.ml" in + let _1 = +# 2963 "parsing/parser.mly" + ( () ) +# 99851 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 66406 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 99859 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66415,64 +196516,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bs; - MenhirLib.EngineTypes.startp = _startpos_bs_; - MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = a; - MenhirLib.EngineTypes.startp = _startpos_a_; - MenhirLib.EngineTypes.endp = _endpos_a_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let bs : (Parsetree.type_declaration list) = Obj.magic bs in - let a : ((Asttypes.rec_flag * string Location.loc option) * - Parsetree.type_declaration) = Obj.magic a in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_a_ in - let _endpos = _endpos_bs_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = - let _1 = - let _1 = - let _1 = -# 1536 "parsing/parser.mly" - ( let (x, b) = a in x, b :: bs ) -# 66443 "parsing/parser.ml" - in - -# 3641 "parsing/parser.mly" - ( _1 ) -# 66448 "parsing/parser.ml" - - in - -# 3624 "parsing/parser.mly" - ( _1 ) -# 66454 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4806 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 99901 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1841 "parsing/parser.mly" - ( pstr_type _1 ) -# 66460 "parsing/parser.ml" +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 99909 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in + +# 126 "" + ( Some x ) +# 99915 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 66470 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 99927 "parsing/parser.ml" in + let _1 = +# 2963 "parsing/parser.mly" + ( () ) +# 99933 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 66476 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 99941 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66485,151 +196598,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = priv; - MenhirLib.EngineTypes.startp = _startpos_priv_; - MenhirLib.EngineTypes.endp = _endpos_priv_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in - let priv : (Asttypes.private_flag) = Obj.magic priv in - let _7 : unit = Obj.magic _7 in let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = - let _1 = - let _1 = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 66563 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let cs = -# 1528 "parsing/parser.mly" - ( List.rev xs ) -# 66570 "parsing/parser.ml" - in - let tid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 66580 "parsing/parser.ml" - - in - let _4 = -# 4557 "parsing/parser.mly" - ( Recursive ) -# 66586 "parsing/parser.ml" - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 66593 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3963 "parsing/parser.mly" - ( let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, - ext ) -# 66605 "parsing/parser.ml" - - in - -# 3946 "parsing/parser.mly" - ( _1 ) -# 66611 "parsing/parser.ml" - - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4807 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 99983 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1843 "parsing/parser.mly" - ( pstr_typext _1 ) -# 66617 "parsing/parser.ml" +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 99991 "parsing/parser.ml" in - let _endpos__1_ = _endpos__1_inlined3_ in + +# 126 "" + ( Some x ) +# 99997 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 66627 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100009 "parsing/parser.ml" in + let _1 = +# 2963 "parsing/parser.mly" + ( () ) +# 100015 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 66633 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100023 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66642,204 +196680,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = priv; - MenhirLib.EngineTypes.startp = _startpos_priv_; - MenhirLib.EngineTypes.endp = _endpos_priv_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in - let priv : (Asttypes.private_flag) = Obj.magic priv in - let _7 : unit = Obj.magic _7 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = - let _1 = - let _1 = - let attrs2 = - let _1 = _1_inlined4 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 66727 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let cs = -# 1528 "parsing/parser.mly" - ( List.rev xs ) -# 66734 "parsing/parser.ml" - in - let tid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 66744 "parsing/parser.ml" - - in - let _4 = - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in - -# 4559 "parsing/parser.mly" - ( not_expecting _loc "nonrec flag" ) -# 66755 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 66763 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3963 "parsing/parser.mly" - ( let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, - ext ) -# 66775 "parsing/parser.ml" - - in - -# 3946 "parsing/parser.mly" - ( _1 ) -# 66781 "parsing/parser.ml" - - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let x = + let _1 = +# 4808 "parsing/parser.mly" + ( Pdir_bool false ) +# 100065 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1843 "parsing/parser.mly" - ( pstr_typext _1 ) -# 66787 "parsing/parser.ml" +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100073 "parsing/parser.ml" in - let _endpos__1_ = _endpos__1_inlined4_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 66797 "parsing/parser.ml" +# 126 "" + ( Some x ) +# 100079 "parsing/parser.ml" in - -# 1859 "parsing/parser.mly" - ( _1 ) -# 66803 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.type_exception * string Location.loc option) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = -# 1845 "parsing/parser.mly" - ( pstr_exception _1 ) -# 66829 "parsing/parser.ml" - in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 66837 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100091 "parsing/parser.ml" in - -# 1859 "parsing/parser.mly" - ( _1 ) -# 66843 "parsing/parser.ml" + let _1 = +# 2963 "parsing/parser.mly" + ( () ) +# 100097 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100105 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66852,114 +196762,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.module_expr) = Obj.magic body in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = - let _1 = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 66908 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 66920 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 66928 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1880 "parsing/parser.mly" - ( let docs = symbol_docs _sloc in - let loc = make_loc _sloc in - let attrs = attrs1 @ attrs2 in - let body = Mb.mk name body ~attrs ~loc ~docs in - Pstr_module body, ext ) -# 66941 "parsing/parser.ml" - - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let x = + let _1 = +# 4809 "parsing/parser.mly" + ( Pdir_bool true ) +# 100147 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1847 "parsing/parser.mly" - ( _1 ) -# 66947 "parsing/parser.ml" +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100155 "parsing/parser.ml" in - let _endpos__1_ = _endpos__1_inlined3_ in + +# 126 "" + ( Some x ) +# 100161 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 66957 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100173 "parsing/parser.ml" in + let _1 = +# 2963 "parsing/parser.mly" + ( () ) +# 100179 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 66963 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100187 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -66972,144 +196844,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bs; - MenhirLib.EngineTypes.startp = _startpos_bs_; - MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let bs : (Parsetree.module_binding list) = Obj.magic bs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.module_expr) = Obj.magic body in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _4 : unit = Obj.magic _4 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_bs_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = - let _1 = - let _1 = - let a = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 67044 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 67056 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 67064 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1917 "parsing/parser.mly" - ( - let loc = make_loc _sloc in - let attrs = attrs1 @ attrs2 in - let docs = symbol_docs _sloc in - ext, - Mb.mk name body ~attrs ~loc ~docs - ) -# 67079 "parsing/parser.ml" - - in - -# 1536 "parsing/parser.mly" - ( let (x, b) = a in x, b :: bs ) -# 67085 "parsing/parser.ml" - - in - -# 1905 "parsing/parser.mly" - ( _1 ) -# 67091 "parsing/parser.ml" - - in - -# 1849 "parsing/parser.mly" - ( pstr_recmodule _1 ) -# 67097 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos_bs_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.toplevel_phrase) = let arg = +# 124 "" + ( None ) +# 100219 "parsing/parser.ml" + in + let _endpos_arg_ = _endpos__1_inlined1_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 67107 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100230 "parsing/parser.ml" in + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 100236 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 67113 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100244 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67121,35 +196900,81 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.module_type_declaration * string Location.loc option) = Obj.magic _1 in + let _1_inlined2 : ( +# 1048 "parsing/parser.mly" + (string * Location.t * string option) +# 100277 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = -# 1851 "parsing/parser.mly" - ( let (body, ext) = _1 in (Pstr_modtype body, ext) ) -# 67139 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4804 "parsing/parser.mly" + ( let (s, _, _) = _1 in Pdir_string s ) +# 100290 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100298 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 100304 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 67147 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100316 "parsing/parser.ml" in + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 100322 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 67153 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100330 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67161,35 +196986,81 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.open_declaration * string Location.loc option) = Obj.magic _1 in + let _1_inlined2 : ( +# 988 "parsing/parser.mly" + (string * char option) +# 100363 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = -# 1853 "parsing/parser.mly" - ( let (body, ext) = _1 in (Pstr_open body, ext) ) -# 67179 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4805 "parsing/parser.mly" + ( let (n, m) = _1 in Pdir_int (n ,m) ) +# 100376 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100384 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 100390 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 67187 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100402 "parsing/parser.ml" in + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 100408 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 67193 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100416 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67202,155 +197073,92 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = bs; - MenhirLib.EngineTypes.startp = _startpos_bs_; - MenhirLib.EngineTypes.endp = _endpos_bs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let bs : (Parsetree.class_declaration list) = Obj.magic bs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.class_expr) = Obj.magic body in - let _1_inlined2 : ( -# 1094 "parsing/parser.mly" - (string) -# 67265 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_bs_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = - let _1 = - let _1 = - let a = - let attrs2 = - let _1 = _1_inlined3 in - -# 4722 "parsing/parser.mly" - ( _1 ) -# 67285 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 67297 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 67305 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2280 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - ext, - Ci.mk id body ~virt ~params ~attrs ~loc ~docs - ) -# 67320 "parsing/parser.ml" - - in - -# 1536 "parsing/parser.mly" - ( let (x, b) = a in x, b :: bs ) -# 67326 "parsing/parser.ml" - - in - -# 2269 "parsing/parser.mly" - ( _1 ) -# 67332 "parsing/parser.ml" - - in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4806 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 100458 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1855 "parsing/parser.mly" - ( let (ext, l) = _1 in (Pstr_class l, ext) ) -# 67338 "parsing/parser.ml" +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100466 "parsing/parser.ml" in - let _endpos__1_ = _endpos_bs_ in + +# 126 "" + ( Some x ) +# 100472 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 67348 "parsing/parser.ml" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100484 "parsing/parser.ml" +>>>>>>> origin/main + + in +<<<<<<< HEAD +======= + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 100495 "parsing/parser.ml" in + let _1 = +# 2975 "parsing/parser.mly" + ( () ) +# 100501 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 67354 "parsing/parser.ml" +# 4804 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100509 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67362,35 +197170,51 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : (string Location.loc option * Parsetree.class_type_declaration list) = Obj.magic _1 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.structure_item) = let _1 = - let _1 = -# 1857 "parsing/parser.mly" - ( let (ext, l) = _1 in (Pstr_class_type l, ext) ) -# 67380 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1338 "parsing/parser.mly" - ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 67388 "parsing/parser.ml" + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4810 "parsing/parser.mly" +||||||| 04da777f7 +# 100482 "parsing/parser.ml" in + let _1 = +# 2973 "parsing/parser.mly" + ( () ) +# 100488 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" - ( _1 ) -# 67394 "parsing/parser.ml" +# 4797 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100496 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67403,89 +197227,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = thing; - MenhirLib.EngineTypes.startp = _startpos_thing_; - MenhirLib.EngineTypes.endp = _endpos_thing_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = is_functor; - MenhirLib.EngineTypes.startp = _startpos_is_functor_; - MenhirLib.EngineTypes.endp = _endpos_is_functor_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let thing : (Parsetree.module_expr) = Obj.magic thing in - let _1 : (Parsetree.attributes) = Obj.magic _1 in - let ext : (string Location.loc option) = Obj.magic ext in - let is_functor : (bool) = Obj.magic is_functor in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_is_functor_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.structure_item) = let _1 = - let attrs2 = - let _1 = _1_inlined1 in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4803 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 100538 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4722 "parsing/parser.mly" - ( _1 ) -# 67450 "parsing/parser.ml" +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100546 "parsing/parser.ml" in - let _endpos_attrs2_ = _endpos__1_inlined1_ in - let attrs1 = -# 4726 "parsing/parser.mly" - ( _1 ) -# 67457 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos_is_functor_ in + +# 126 "" + ( Some x ) +# 100552 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1961 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let incl = Incl.mk thing ~attrs ~loc ~docs in - is_functor, incl, ext - ) -# 67471 "parsing/parser.ml" +# 1205 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 100564 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_is_functor_) in - let _endpos = _endpos__1_ in + let _1 = +# 2973 "parsing/parser.mly" + ( () ) +# 100570 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1861 "parsing/parser.mly" - ( let is_functor, incl, ext = _1 in - let item = - if is_functor - then Jane_syntax.Include_functor.str_item_of ~loc:(make_loc _sloc) - (Ifstr_include_functor incl) - else mkstr ~loc:_sloc (Pstr_include incl) - in - wrap_str_ext ~loc:_sloc item ext - ) -# 67489 "parsing/parser.ml" +# 4797 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100578 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67497,45 +197308,52 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4631 "parsing/parser.mly" - ( "-" ) -# 67514 "parsing/parser.ml" + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4804 "parsing/parser.mly" +======= +# 100496 "parsing/parser.ml" + + in +>>>>>>> upstream/main + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 100490 "parsing/parser.ml" in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4632 "parsing/parser.mly" - ( "-." ) -# 67539 "parsing/parser.ml" + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100498 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67548,90 +197366,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let xs : (Parsetree.core_type list) = Obj.magic xs in - let _3 : (bool) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (string) = Obj.magic _1 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.row_field) = let _5 = - let _1 = _1_inlined1 in - -# 4726 "parsing/parser.mly" - ( _1 ) -# 67594 "parsing/parser.ml" - - in - let _endpos__5_ = _endpos__1_inlined1_ in - let _4 = - let _1 = - let xs = -# 253 "" - ( List.rev xs ) -# 67603 "parsing/parser.ml" + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4807 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 100540 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1439 "parsing/parser.mly" - ( xs ) -# 67608 "parsing/parser.ml" +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100548 "parsing/parser.ml" in -# 4312 "parsing/parser.mly" - ( _1 ) -# 67614 "parsing/parser.ml" +# 126 "" + ( Some x ) +# 100554 "parsing/parser.ml" in - let _1 = + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 67624 "parsing/parser.ml" +# 100566 "parsing/parser.ml" in - let _endpos = _endpos__5_ in + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 100572 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4298 "parsing/parser.mly" - ( let info = symbol_info _endpos in - let attrs = add_info_attrs info _5 in - Rf.tag ~loc:(make_loc _sloc) ~attrs _1 _3 _4 ) -# 67635 "parsing/parser.ml" +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100580 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67644,50 +197448,132 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : (string) = Obj.magic _1 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.row_field) = let _2 = - let _1 = _1_inlined1 in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let x = + let _1 = +<<<<<<< HEAD +# 4808 "parsing/parser.mly" + ( Pdir_bool false ) +# 100622 "parsing/parser.ml" +======= +# 4795 "parsing/parser.mly" +>>>>>>> origin/main + ( Pdir_ident _1 ) +<<<<<<< HEAD +# 100551 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100559 "parsing/parser.ml" + + in -# 4726 "parsing/parser.mly" - ( _1 ) -# 67669 "parsing/parser.ml" +# 126 "" + ( Some x ) +# 100565 "parsing/parser.ml" +||||||| 04da777f7 +# 100620 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100628 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 100634 "parsing/parser.ml" +======= +# 100634 "parsing/parser.ml" +>>>>>>> upstream/main + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100630 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 100636 "parsing/parser.ml" in - let _endpos__2_ = _endpos__1_inlined1_ in - let _1 = + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 67680 "parsing/parser.ml" +# 100648 "parsing/parser.ml" +>>>>>>> origin/main in - let _endpos = _endpos__2_ in +<<<<<<< HEAD +======= + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 100577 "parsing/parser.ml" + + in + let _1 = +# 2975 "parsing/parser.mly" + ( () ) +# 100583 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4302 "parsing/parser.mly" - ( let info = symbol_info _endpos in - let attrs = add_info_attrs info _2 in - Rf.tag ~loc:(make_loc _sloc) ~attrs _1 true [] ) -# 67691 "parsing/parser.ml" +# 4804 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100591 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67700,51 +197586,114 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.toplevel_phrase) = let arg = -# 124 "" - ( None ) -# 67723 "parsing/parser.ml" - in - let _endpos_arg_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4811 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 100633 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 100641 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 100647 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in let dir = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1205 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 67734 "parsing/parser.ml" +# 100659 "parsing/parser.ml" in let _1 = -# 3018 "parsing/parser.mly" +# 2975 "parsing/parser.mly" ( () ) -# 67740 "parsing/parser.ml" +# 100665 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4804 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100673 "parsing/parser.ml" +||||||| 04da777f7 +# 100646 "parsing/parser.ml" + + in + let _1 = +# 2973 "parsing/parser.mly" + ( () ) +# 100652 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4797 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 67748 "parsing/parser.ml" +# 100660 "parsing/parser.ml" +======= +# 100660 "parsing/parser.ml" + + in +>>>>>>> upstream/main + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 100654 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +<<<<<<< HEAD +# 100662 "parsing/parser.ml" +======= +# 100674 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67774,37 +197723,62 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : ( -# 1135 "parsing/parser.mly" - (string * Location.t * string option) -# 67781 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.toplevel_phrase) = let arg = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 4524 "parsing/parser.mly" - ( let (s, _, _) = _1 in Pdir_string s ) -# 67794 "parsing/parser.ml" +<<<<<<< HEAD +# 4809 "parsing/parser.mly" + ( Pdir_bool true ) +# 100704 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4812 "parsing/parser.mly" +||||||| 04da777f7 +# 4805 "parsing/parser.mly" +======= +# 4796 "parsing/parser.mly" +>>>>>>> origin/main + ( Pdir_bool false ) +<<<<<<< HEAD +# 100715 "parsing/parser.ml" +||||||| 04da777f7 +# 100702 "parsing/parser.ml" +======= +# 100716 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1256 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 67802 "parsing/parser.ml" +<<<<<<< HEAD +# 100712 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 100723 "parsing/parser.ml" +||||||| 04da777f7 +# 100710 "parsing/parser.ml" +======= +# 100724 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in # 126 "" ( Some x ) -# 67808 "parsing/parser.ml" +<<<<<<< HEAD +# 100718 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -67814,23 +197788,75 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +======= +<<<<<<< HEAD +# 100729 "parsing/parser.ml" +||||||| 04da777f7 +# 100716 "parsing/parser.ml" +======= +>>>>>>> upstream/main +# 100730 "parsing/parser.ml" +>>>>>>> origin/main + + in +<<<<<<< HEAD +======= + let _endpos_arg_ = _endpos__1_inlined2_ in + let dir = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 67820 "parsing/parser.ml" +<<<<<<< HEAD +# 100741 "parsing/parser.ml" +||||||| 04da777f7 +# 100728 "parsing/parser.ml" +======= +# 100742 "parsing/parser.ml" +>>>>>>> origin/main in let _1 = -# 3018 "parsing/parser.mly" +<<<<<<< HEAD +# 2975 "parsing/parser.mly" +||||||| 04da777f7 +# 2973 "parsing/parser.mly" +======= +# 2963 "parsing/parser.mly" +>>>>>>> origin/main ( () ) -# 67826 "parsing/parser.ml" +<<<<<<< HEAD +# 100747 "parsing/parser.ml" +||||||| 04da777f7 +# 100734 "parsing/parser.ml" +======= +# 100748 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +<<<<<<< HEAD +# 4804 "parsing/parser.mly" +||||||| 04da777f7 +# 4797 "parsing/parser.mly" +======= +# 4788 "parsing/parser.mly" +>>>>>>> origin/main ( mk_directive ~loc:_sloc dir arg ) -# 67834 "parsing/parser.ml" +<<<<<<< HEAD +# 100755 "parsing/parser.ml" +||||||| 04da777f7 +# 100742 "parsing/parser.ml" +======= +# 100756 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67860,37 +197886,57 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : ( -# 1078 "parsing/parser.mly" - (string * char option) -# 67867 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.toplevel_phrase) = let arg = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 4525 "parsing/parser.mly" - ( let (n, m) = _1 in Pdir_int (n ,m) ) -# 67880 "parsing/parser.ml" +<<<<<<< HEAD +# 4813 "parsing/parser.mly" +||||||| 04da777f7 +# 4806 "parsing/parser.mly" +======= +# 4797 "parsing/parser.mly" +>>>>>>> origin/main + ( Pdir_bool true ) +<<<<<<< HEAD +# 100797 "parsing/parser.ml" +||||||| 04da777f7 +# 100784 "parsing/parser.ml" +======= +# 100798 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1256 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 67888 "parsing/parser.ml" +<<<<<<< HEAD +# 100805 "parsing/parser.ml" +||||||| 04da777f7 +# 100792 "parsing/parser.ml" +======= +# 100806 "parsing/parser.ml" +>>>>>>> origin/main in # 126 "" ( Some x ) -# 67894 "parsing/parser.ml" +<<<<<<< HEAD +# 100811 "parsing/parser.ml" +||||||| 04da777f7 +# 100798 "parsing/parser.ml" +======= +# 100812 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -67900,23 +197946,53 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 67906 "parsing/parser.ml" +<<<<<<< HEAD +# 100823 "parsing/parser.ml" +||||||| 04da777f7 +# 100810 "parsing/parser.ml" +======= +# 100824 "parsing/parser.ml" +>>>>>>> origin/main in let _1 = -# 3018 "parsing/parser.mly" +<<<<<<< HEAD +# 2975 "parsing/parser.mly" +||||||| 04da777f7 +# 2973 "parsing/parser.mly" +======= +# 2963 "parsing/parser.mly" +>>>>>>> origin/main ( () ) -# 67912 "parsing/parser.ml" +<<<<<<< HEAD +# 100829 "parsing/parser.ml" +||||||| 04da777f7 +# 100816 "parsing/parser.ml" +======= +# 100830 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +<<<<<<< HEAD +# 4804 "parsing/parser.mly" +||||||| 04da777f7 +# 4797 "parsing/parser.mly" +======= +# 4788 "parsing/parser.mly" +>>>>>>> origin/main ( mk_directive ~loc:_sloc dir arg ) -# 67920 "parsing/parser.ml" +<<<<<<< HEAD +# 100837 "parsing/parser.ml" +||||||| 04da777f7 +# 100824 "parsing/parser.ml" +======= +# 100838 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -67929,76 +198005,95 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in - let _v : (Parsetree.toplevel_phrase) = let arg = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let x = - let _1 = -# 4526 "parsing/parser.mly" - ( Pdir_ident _1 ) -# 67962 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1343 "parsing/parser.mly" - ( mk_directive_arg ~loc:_sloc _1 ) -# 67970 "parsing/parser.ml" - - in - -# 126 "" - ( Some x ) -# 67976 "parsing/parser.ml" - - in - let _endpos_arg_ = _endpos__1_inlined2_ in + let _endpos = _endpos__1_inlined1_ in + let _v : (Parsetree.toplevel_phrase) = let arg = +# 124 "" + ( None ) +<<<<<<< HEAD +# 100869 "parsing/parser.ml" +||||||| 04da777f7 +# 100856 "parsing/parser.ml" +======= +# 100870 "parsing/parser.ml" +>>>>>>> origin/main + in + let _endpos_arg_ = _endpos__1_inlined1_ in let dir = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 67988 "parsing/parser.ml" +<<<<<<< HEAD +# 100880 "parsing/parser.ml" in let _1 = -# 3018 "parsing/parser.mly" - ( () ) -# 67994 "parsing/parser.ml" +# 2976 "parsing/parser.mly" + ( () ) +# 100886 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4804 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68002 "parsing/parser.ml" +# 100894 "parsing/parser.ml" +||||||| 04da777f7 +# 100867 "parsing/parser.ml" + + in + let _1 = +# 2974 "parsing/parser.mly" + ( () ) +# 100873 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4797 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 100881 "parsing/parser.ml" +======= +# 100881 "parsing/parser.ml" + + in +>>>>>>> upstream/main + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 100736 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4800 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +<<<<<<< HEAD +# 100744 "parsing/parser.ml" +======= +# 100895 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68028,8 +198123,18 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : ( +# 1048 "parsing/parser.mly" + (string * Location.t * string option) +<<<<<<< HEAD +# 100927 "parsing/parser.ml" +||||||| 04da777f7 +# 100914 "parsing/parser.ml" +======= +# 100928 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -68038,23 +198143,47 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 4527 "parsing/parser.mly" - ( Pdir_ident _1 ) -# 68044 "parsing/parser.ml" +<<<<<<< HEAD +# 4808 "parsing/parser.mly" +||||||| 04da777f7 +# 4801 "parsing/parser.mly" +======= +# 4792 "parsing/parser.mly" +>>>>>>> origin/main + ( let (s, _, _) = _1 in Pdir_string s ) +<<<<<<< HEAD +# 100940 "parsing/parser.ml" +||||||| 04da777f7 +# 100927 "parsing/parser.ml" +======= +# 100941 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1256 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 68052 "parsing/parser.ml" +<<<<<<< HEAD +# 100948 "parsing/parser.ml" +||||||| 04da777f7 +# 100935 "parsing/parser.ml" +======= +# 100949 "parsing/parser.ml" +>>>>>>> origin/main in # 126 "" ( Some x ) -# 68058 "parsing/parser.ml" +<<<<<<< HEAD +# 100954 "parsing/parser.ml" +||||||| 04da777f7 +# 100941 "parsing/parser.ml" +======= +# 100955 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -68064,23 +198193,53 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68070 "parsing/parser.ml" +<<<<<<< HEAD +# 100966 "parsing/parser.ml" +||||||| 04da777f7 +# 100953 "parsing/parser.ml" +======= +# 100967 "parsing/parser.ml" +>>>>>>> origin/main in let _1 = -# 3018 "parsing/parser.mly" - ( () ) -# 68076 "parsing/parser.ml" +<<<<<<< HEAD +# 2976 "parsing/parser.mly" +||||||| 04da777f7 +# 2974 "parsing/parser.mly" +======= +# 2964 "parsing/parser.mly" +>>>>>>> origin/main + ( () ) +<<<<<<< HEAD +# 100972 "parsing/parser.ml" +||||||| 04da777f7 +# 100959 "parsing/parser.ml" +======= +# 100973 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +<<<<<<< HEAD +# 4804 "parsing/parser.mly" +||||||| 04da777f7 +# 4797 "parsing/parser.mly" +======= +# 4788 "parsing/parser.mly" +>>>>>>> origin/main ( mk_directive ~loc:_sloc dir arg ) -# 68084 "parsing/parser.ml" +<<<<<<< HEAD +# 100980 "parsing/parser.ml" +||||||| 04da777f7 +# 100967 "parsing/parser.ml" +======= +# 100981 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68110,33 +198269,83 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : ( +# 988 "parsing/parser.mly" + (string * char option) +<<<<<<< HEAD +# 101013 "parsing/parser.ml" +||||||| 04da777f7 +# 101000 "parsing/parser.ml" +======= +# 101014 "parsing/parser.ml" +>>>>>>> origin/main + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.toplevel_phrase) = let arg = - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 4528 "parsing/parser.mly" - ( Pdir_bool false ) -# 68126 "parsing/parser.ml" +<<<<<<< HEAD +# 4809 "parsing/parser.mly" +||||||| 04da777f7 +# 4802 "parsing/parser.mly" +======= +# 4793 "parsing/parser.mly" +>>>>>>> origin/main + ( let (n, m) = _1 in Pdir_int (n ,m) ) +<<<<<<< HEAD +# 101026 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1266 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 68134 "parsing/parser.ml" +# 101034 "parsing/parser.ml" in # 126 "" ( Some x ) -# 68140 "parsing/parser.ml" +# 101040 "parsing/parser.ml" +||||||| 04da777f7 +# 101013 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 101021 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 101027 "parsing/parser.ml" +======= +# 101027 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 101035 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 101041 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -68146,23 +198355,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68152 "parsing/parser.ml" +<<<<<<< HEAD +# 101052 "parsing/parser.ml" in let _1 = -# 3018 "parsing/parser.mly" - ( () ) -# 68158 "parsing/parser.ml" +# 2976 "parsing/parser.mly" + ( () ) +# 101058 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4804 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68166 "parsing/parser.ml" +# 101066 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68192,59 +198402,33 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined2_ in let _v : (Parsetree.toplevel_phrase) = let arg = - let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 4529 "parsing/parser.mly" - ( Pdir_bool true ) -# 68208 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1343 "parsing/parser.mly" - ( mk_directive_arg ~loc:_sloc _1 ) -# 68216 "parsing/parser.ml" - - in - -# 126 "" - ( Some x ) -# 68222 "parsing/parser.ml" - - in - let _endpos_arg_ = _endpos__1_inlined2_ in - let dir = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 68234 "parsing/parser.ml" +# 4810 "parsing/parser.mly" +||||||| 04da777f7 +# 101039 "parsing/parser.ml" in let _1 = -# 3018 "parsing/parser.mly" - ( () ) -# 68240 "parsing/parser.ml" +# 2974 "parsing/parser.mly" + ( () ) +# 101045 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4797 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68248 "parsing/parser.ml" +# 101053 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68257,51 +198441,76 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v : (Parsetree.toplevel_phrase) = let arg = -# 124 "" - ( None ) -# 68280 "parsing/parser.ml" - in - let _endpos_arg_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_inlined2_ in + let _v : (Parsetree.toplevel_phrase) = let arg = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let x = + let _1 = +# 4803 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 101095 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 101103 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 101109 "parsing/parser.ml" + + in + let _endpos_arg_ = _endpos__1_inlined2_ in let dir = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1205 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68291 "parsing/parser.ml" +# 101121 "parsing/parser.ml" in let _1 = -# 3019 "parsing/parser.mly" +# 2974 "parsing/parser.mly" ( () ) -# 68297 "parsing/parser.ml" +# 101127 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4797 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68305 "parsing/parser.ml" +# 101135 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68331,12 +198540,8 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : ( -# 1135 "parsing/parser.mly" - (string * Location.t * string option) -# 68338 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -68345,49 +198550,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 4524 "parsing/parser.mly" - ( let (s, _, _) = _1 in Pdir_string s ) -# 68351 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1343 "parsing/parser.mly" - ( mk_directive_arg ~loc:_sloc _1 ) -# 68359 "parsing/parser.ml" - - in - -# 126 "" - ( Some x ) -# 68365 "parsing/parser.ml" - - in - let _endpos_arg_ = _endpos__1_inlined2_ in - let dir = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1282 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 68377 "parsing/parser.ml" +# 4804 "parsing/parser.mly" +======= +# 101053 "parsing/parser.ml" in let _1 = -# 3019 "parsing/parser.mly" +# 2964 "parsing/parser.mly" ( () ) -# 68383 "parsing/parser.ml" +# 101059 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4788 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68391 "parsing/parser.ml" +# 101067 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68417,12 +198596,8 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : ( -# 1078 "parsing/parser.mly" - (string * char option) -# 68424 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -68431,23 +198606,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 4525 "parsing/parser.mly" - ( let (n, m) = _1 in Pdir_int (n ,m) ) -# 68437 "parsing/parser.ml" +# 4794 "parsing/parser.mly" + ( Pdir_ident _1 ) +# 101109 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1256 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 68445 "parsing/parser.ml" +# 101117 "parsing/parser.ml" in # 126 "" ( Some x ) -# 68451 "parsing/parser.ml" +# 101123 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -68457,23 +198632,23 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68463 "parsing/parser.ml" +# 101135 "parsing/parser.ml" in let _1 = -# 3019 "parsing/parser.mly" +# 2964 "parsing/parser.mly" ( () ) -# 68469 "parsing/parser.ml" +# 101141 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4788 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68477 "parsing/parser.ml" +# 101149 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68504,7 +198679,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -68513,23 +198688,58 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 4526 "parsing/parser.mly" +# 4795 "parsing/parser.mly" +>>>>>>> origin/main ( Pdir_ident _1 ) -# 68519 "parsing/parser.ml" +<<<<<<< HEAD +# 101108 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1266 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 68527 "parsing/parser.ml" +# 101116 "parsing/parser.ml" in # 126 "" ( Some x ) -# 68533 "parsing/parser.ml" +# 101122 "parsing/parser.ml" +||||||| 04da777f7 +# 101177 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1266 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 101185 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 101191 "parsing/parser.ml" +======= +# 101191 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1256 "parsing/parser.mly" + ( mk_directive_arg ~loc:_sloc _1 ) +# 101199 "parsing/parser.ml" + + in + +# 126 "" + ( Some x ) +# 101205 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -68539,23 +198749,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68545 "parsing/parser.ml" +<<<<<<< HEAD +# 101134 "parsing/parser.ml" in let _1 = -# 3019 "parsing/parser.mly" +# 2976 "parsing/parser.mly" ( () ) -# 68551 "parsing/parser.ml" +# 101140 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4804 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68559 "parsing/parser.ml" +# 101148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68586,7 +198797,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -68595,23 +198806,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 4527 "parsing/parser.mly" +# 4811 "parsing/parser.mly" ( Pdir_ident _1 ) -# 68601 "parsing/parser.ml" +# 101190 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1266 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 68609 "parsing/parser.ml" +# 101198 "parsing/parser.ml" in # 126 "" ( Some x ) -# 68615 "parsing/parser.ml" +# 101204 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -68621,23 +198832,56 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1205 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68627 "parsing/parser.ml" +# 101216 "parsing/parser.ml" in let _1 = -# 3019 "parsing/parser.mly" +# 2976 "parsing/parser.mly" ( () ) -# 68633 "parsing/parser.ml" +# 101222 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +# 4804 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 68641 "parsing/parser.ml" +# 101230 "parsing/parser.ml" +||||||| 04da777f7 +# 101203 "parsing/parser.ml" + + in + let _1 = +# 2974 "parsing/parser.mly" + ( () ) +# 101209 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4797 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 101217 "parsing/parser.ml" +======= +# 101217 "parsing/parser.ml" + + in + let _1 = +# 2964 "parsing/parser.mly" + ( () ) +# 101223 "parsing/parser.ml" + in + let _endpos = _endpos_arg_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4788 "parsing/parser.mly" + ( mk_directive ~loc:_sloc dir arg ) +# 101231 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68668,7 +198912,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -68677,23 +198921,47 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 4528 "parsing/parser.mly" +<<<<<<< HEAD +# 4812 "parsing/parser.mly" +||||||| 04da777f7 +# 4805 "parsing/parser.mly" +======= +# 4796 "parsing/parser.mly" +>>>>>>> origin/main ( Pdir_bool false ) -# 68683 "parsing/parser.ml" +<<<<<<< HEAD +# 101272 "parsing/parser.ml" +||||||| 04da777f7 +# 101259 "parsing/parser.ml" +======= +# 101273 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1256 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 68691 "parsing/parser.ml" +<<<<<<< HEAD +# 101280 "parsing/parser.ml" +||||||| 04da777f7 +# 101267 "parsing/parser.ml" +======= +# 101281 "parsing/parser.ml" +>>>>>>> origin/main in # 126 "" ( Some x ) -# 68697 "parsing/parser.ml" +<<<<<<< HEAD +# 101286 "parsing/parser.ml" +||||||| 04da777f7 +# 101273 "parsing/parser.ml" +======= +# 101287 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -68703,23 +198971,53 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68709 "parsing/parser.ml" +<<<<<<< HEAD +# 101298 "parsing/parser.ml" +||||||| 04da777f7 +# 101285 "parsing/parser.ml" +======= +# 101299 "parsing/parser.ml" +>>>>>>> origin/main in let _1 = -# 3019 "parsing/parser.mly" +<<<<<<< HEAD +# 2976 "parsing/parser.mly" +||||||| 04da777f7 +# 2974 "parsing/parser.mly" +======= +# 2964 "parsing/parser.mly" +>>>>>>> origin/main ( () ) -# 68715 "parsing/parser.ml" +<<<<<<< HEAD +# 101304 "parsing/parser.ml" +||||||| 04da777f7 +# 101291 "parsing/parser.ml" +======= +# 101305 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +<<<<<<< HEAD +# 4804 "parsing/parser.mly" +||||||| 04da777f7 +# 4797 "parsing/parser.mly" +======= +# 4788 "parsing/parser.mly" +>>>>>>> origin/main ( mk_directive ~loc:_sloc dir arg ) -# 68723 "parsing/parser.ml" +<<<<<<< HEAD +# 101312 "parsing/parser.ml" +||||||| 04da777f7 +# 101299 "parsing/parser.ml" +======= +# 101313 "parsing/parser.ml" +>>>>>>> origin/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68750,7 +199048,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (string) = Obj.magic _1_inlined1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -68759,23 +199057,47 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 4529 "parsing/parser.mly" +<<<<<<< HEAD +# 4813 "parsing/parser.mly" +||||||| 04da777f7 +# 4806 "parsing/parser.mly" +======= +# 4797 "parsing/parser.mly" +>>>>>>> origin/main ( Pdir_bool true ) -# 68765 "parsing/parser.ml" +<<<<<<< HEAD +# 101354 "parsing/parser.ml" +||||||| 04da777f7 +# 101341 "parsing/parser.ml" +======= +# 101355 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1343 "parsing/parser.mly" +# 1256 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 68773 "parsing/parser.ml" +<<<<<<< HEAD +# 101362 "parsing/parser.ml" +||||||| 04da777f7 +# 101349 "parsing/parser.ml" +======= +# 101363 "parsing/parser.ml" +>>>>>>> origin/main in # 126 "" ( Some x ) -# 68779 "parsing/parser.ml" +<<<<<<< HEAD +# 101368 "parsing/parser.ml" +||||||| 04da777f7 +# 101355 "parsing/parser.ml" +======= +# 101369 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -68785,23 +199107,54 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 68791 "parsing/parser.ml" +<<<<<<< HEAD +# 101380 "parsing/parser.ml" +||||||| 04da777f7 +# 101367 "parsing/parser.ml" +======= +# 101381 "parsing/parser.ml" +>>>>>>> origin/main in let _1 = -# 3019 "parsing/parser.mly" +<<<<<<< HEAD +# 2976 "parsing/parser.mly" +||||||| 04da777f7 +# 2974 "parsing/parser.mly" +======= +# 2964 "parsing/parser.mly" +>>>>>>> origin/main ( () ) -# 68797 "parsing/parser.ml" +<<<<<<< HEAD +# 101386 "parsing/parser.ml" +||||||| 04da777f7 +# 101373 "parsing/parser.ml" +======= +# 101387 "parsing/parser.ml" +>>>>>>> origin/main in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4520 "parsing/parser.mly" +<<<<<<< HEAD +# 4804 "parsing/parser.mly" +||||||| 04da777f7 +# 4797 "parsing/parser.mly" +======= +# 4788 "parsing/parser.mly" +>>>>>>> origin/main ( mk_directive ~loc:_sloc dir arg ) -# 68805 "parsing/parser.ml" +<<<<<<< HEAD +# 101394 "parsing/parser.ml" +||||||| 04da777f7 +# 101381 "parsing/parser.ml" +======= +# 101395 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68841,37 +199194,95 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4722 "parsing/parser.mly" - ( _1 ) -# 68847 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 100786 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 101436 "parsing/parser.ml" +||||||| 04da777f7 +# 101423 "parsing/parser.ml" +======= +# 101437 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1812 "parsing/parser.mly" +# 1725 "parsing/parser.mly" ( mkstrexp e attrs ) -# 68852 "parsing/parser.ml" +<<<<<<< HEAD +# 100791 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101441 "parsing/parser.ml" +||||||| 04da777f7 +# 101428 "parsing/parser.ml" +======= +# 101442 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 1286 "parsing/parser.mly" +# 1199 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 68860 "parsing/parser.ml" +<<<<<<< HEAD +# 100799 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101449 "parsing/parser.ml" +||||||| 04da777f7 +# 101436 "parsing/parser.ml" +======= +# 101450 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1274 "parsing/parser.mly" +# 1187 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 68869 "parsing/parser.ml" +<<<<<<< HEAD +# 100808 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101458 "parsing/parser.ml" +||||||| 04da777f7 +# 101445 "parsing/parser.ml" +======= +# 101459 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1576 "parsing/parser.mly" +# 1489 "parsing/parser.mly" ( Ptop_def _1 ) -# 68875 "parsing/parser.ml" +<<<<<<< HEAD +# 100814 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101464 "parsing/parser.ml" +||||||| 04da777f7 +# 101451 "parsing/parser.ml" +======= +# 101465 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68904,21 +199315,51 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 68908 "parsing/parser.ml" +<<<<<<< HEAD +# 100847 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101497 "parsing/parser.ml" +||||||| 04da777f7 +# 101484 "parsing/parser.ml" +======= +# 101498 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1274 "parsing/parser.mly" +# 1187 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 68916 "parsing/parser.ml" +<<<<<<< HEAD +# 100855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101505 "parsing/parser.ml" +||||||| 04da777f7 +# 101492 "parsing/parser.ml" +======= +# 101506 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1580 "parsing/parser.mly" +# 1493 "parsing/parser.mly" ( Ptop_def _1 ) -# 68922 "parsing/parser.ml" +<<<<<<< HEAD +# 100861 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101511 "parsing/parser.ml" +||||||| 04da777f7 +# 101498 "parsing/parser.ml" +======= +# 101512 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68948,9 +199389,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.toplevel_phrase) = -# 1584 "parsing/parser.mly" +# 1497 "parsing/parser.mly" ( _1 ) -# 68954 "parsing/parser.ml" +<<<<<<< HEAD +# 100893 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101543 "parsing/parser.ml" +||||||| 04da777f7 +# 101530 "parsing/parser.ml" +======= +# 101544 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68973,9 +199424,19 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.toplevel_phrase) = -# 1587 "parsing/parser.mly" +# 1500 "parsing/parser.mly" ( raise End_of_file ) -# 68979 "parsing/parser.ml" +<<<<<<< HEAD +# 100918 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101568 "parsing/parser.ml" +||||||| 04da777f7 +# 101555 "parsing/parser.ml" +======= +# 101569 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -68998,9 +199459,27 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 4184 "parsing/parser.mly" +<<<<<<< HEAD +# 4449 "parsing/parser.mly" ( ty ) -# 69004 "parsing/parser.ml" +# 100943 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4453 "parsing/parser.mly" +||||||| 04da777f7 +# 4446 "parsing/parser.mly" +======= +# 4437 "parsing/parser.mly" +>>>>>>> origin/main + ( ty ) +<<<<<<< HEAD +# 101593 "parsing/parser.ml" +||||||| 04da777f7 +# 101580 "parsing/parser.ml" +======= +# 101594 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69012,50 +199491,117 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = xs; MenhirLib.EngineTypes.startp = _startpos_xs_; MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let xs : (Parsetree.core_type list) = Obj.magic xs in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in + let _startpos = _startpos_ty_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.core_type) = let _1 = - let _1 = - let tys = - let xs = + let ltys = + let xs = # 253 "" ( List.rev xs ) -# 69032 "parsing/parser.ml" - in - -# 1467 "parsing/parser.mly" - ( xs ) -# 69037 "parsing/parser.ml" - - in +<<<<<<< HEAD +# 100984 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101634 "parsing/parser.ml" +||||||| 04da777f7 +# 101621 "parsing/parser.ml" +======= +# 101635 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in -# 4187 "parsing/parser.mly" - ( Ptyp_tuple tys ) -# 69043 "parsing/parser.ml" +# 1352 "parsing/parser.mly" + ( xs ) +<<<<<<< HEAD +# 100989 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 69053 "parsing/parser.ml" +# 4460 "parsing/parser.mly" + ( ty, ltys ) +# 100995 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101639 "parsing/parser.ml" +||||||| 04da777f7 +# 101626 "parsing/parser.ml" +======= +# 101640 "parsing/parser.ml" +>>>>>>> origin/main + + in - in +<<<<<<< HEAD +# 4464 "parsing/parser.mly" +||||||| 04da777f7 +# 4457 "parsing/parser.mly" +======= +# 4448 "parsing/parser.mly" +>>>>>>> origin/main + ( ty, ltys ) +<<<<<<< HEAD +# 101645 "parsing/parser.ml" +||||||| 04da777f7 +# 101632 "parsing/parser.ml" +======= +# 101646 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4189 "parsing/parser.mly" - ( _1 ) -# 69059 "parsing/parser.ml" +<<<<<<< HEAD +# 4451 "parsing/parser.mly" + ( let ty, ltys = _1 in + ptyp_ltuple _sloc ((None, ty) :: ltys) + ) +# 101007 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4455 "parsing/parser.mly" +||||||| 04da777f7 +# 4448 "parsing/parser.mly" +======= +# 4439 "parsing/parser.mly" +>>>>>>> origin/main + ( let ty, ltys = _1 in + ptyp_ltuple _sloc ((None, ty) :: ltys) + ) +<<<<<<< HEAD +# 101657 "parsing/parser.ml" +||||||| 04da777f7 +# 101644 "parsing/parser.ml" +======= +# 101658 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69085,9 +199631,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (N_ary.type_constraint) = -# 3366 "parsing/parser.mly" +<<<<<<< HEAD +# 3432 "parsing/parser.mly" +||||||| 04da777f7 +# 3430 "parsing/parser.mly" +======= +# 3420 "parsing/parser.mly" +>>>>>>> origin/main ( N_ary.Pconstraint _2 ) -# 69091 "parsing/parser.ml" +<<<<<<< HEAD +# 101039 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101689 "parsing/parser.ml" +||||||| 04da777f7 +# 101676 "parsing/parser.ml" +======= +# 101690 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69131,9 +199693,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (N_ary.type_constraint) = -# 3367 "parsing/parser.mly" +<<<<<<< HEAD +# 3433 "parsing/parser.mly" +||||||| 04da777f7 +# 3431 "parsing/parser.mly" +======= +# 3421 "parsing/parser.mly" +>>>>>>> origin/main ( N_ary.Pcoerce (Some _2, _4) ) -# 69137 "parsing/parser.ml" +<<<<<<< HEAD +# 101085 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101735 "parsing/parser.ml" +||||||| 04da777f7 +# 101722 "parsing/parser.ml" +======= +# 101736 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69163,9 +199741,10 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (N_ary.type_constraint) = -# 3368 "parsing/parser.mly" +<<<<<<< HEAD +# 3434 "parsing/parser.mly" ( N_ary.Pcoerce (None, _2) ) -# 69169 "parsing/parser.ml" +# 101767 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69195,9 +199774,43 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (N_ary.type_constraint) = -# 3369 "parsing/parser.mly" +# 3435 "parsing/parser.mly" +||||||| 04da777f7 +# 3432 "parsing/parser.mly" + ( N_ary.Pcoerce (None, _2) ) +# 101754 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (N_ary.type_constraint) = +# 3433 "parsing/parser.mly" ( syntax_error() ) -# 69201 "parsing/parser.ml" +# 101786 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69227,9 +199840,118 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (N_ary.type_constraint) = -# 3370 "parsing/parser.mly" +# 3434 "parsing/parser.mly" +======= +# 3422 "parsing/parser.mly" + ( N_ary.Pcoerce (None, _2) ) +# 101117 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (N_ary.type_constraint) = +# 3423 "parsing/parser.mly" ( syntax_error() ) -# 69233 "parsing/parser.ml" +# 101149 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (N_ary.type_constraint) = +# 3424 "parsing/parser.mly" +>>>>>>> origin/main + ( syntax_error() ) +<<<<<<< HEAD +# 101181 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101799 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (N_ary.type_constraint) = +# 3436 "parsing/parser.mly" + ( syntax_error() ) +# 101831 "parsing/parser.ml" +||||||| 04da777f7 +# 101818 "parsing/parser.ml" +======= +# 101832 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69245,9 +199967,25 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 3717 "parsing/parser.mly" +<<<<<<< HEAD +# 3856 "parsing/parser.mly" +||||||| 04da777f7 +# 3854 "parsing/parser.mly" +======= +# 3845 "parsing/parser.mly" +>>>>>>> origin/main ( (Ptype_abstract, Public, None) ) -# 69251 "parsing/parser.ml" +<<<<<<< HEAD +# 101199 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101849 "parsing/parser.ml" +||||||| 04da777f7 +# 101836 "parsing/parser.ml" +======= +# 101850 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69277,9 +200015,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 3719 "parsing/parser.mly" +<<<<<<< HEAD +# 3858 "parsing/parser.mly" +||||||| 04da777f7 +# 3856 "parsing/parser.mly" +======= +# 3847 "parsing/parser.mly" +>>>>>>> origin/main ( _2 ) -# 69283 "parsing/parser.ml" +<<<<<<< HEAD +# 101231 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101881 "parsing/parser.ml" +||||||| 04da777f7 +# 101868 "parsing/parser.ml" +======= +# 101882 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69302,9 +200056,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4480 "parsing/parser.mly" - ( _1 ) -# 69308 "parsing/parser.ml" +<<<<<<< HEAD +# 4757 "parsing/parser.mly" + ( _1 ) +# 101256 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4761 "parsing/parser.mly" +||||||| 04da777f7 +# 4754 "parsing/parser.mly" +======= +# 4745 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 101906 "parsing/parser.ml" +||||||| 04da777f7 +# 101893 "parsing/parser.ml" +======= +# 101907 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69341,7 +200113,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let tyvar : (string) = Obj.magic tyvar in + let tyvar : (Asttypes.label) = Obj.magic tyvar in let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (Asttypes.variance * Asttypes.injectivity) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -69350,39 +200122,115 @@ module Tables = struct let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = let _3 = let _1 = _1_inlined2 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 69356 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 101304 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 101954 "parsing/parser.ml" +||||||| 04da777f7 +# 101941 "parsing/parser.ml" +======= +# 101955 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _2 = let _startpos__1_ = _startpos__1_inlined1_ in let _1 = let _1 = -# 3777 "parsing/parser.mly" +<<<<<<< HEAD +# 3937 "parsing/parser.mly" +||||||| 04da777f7 +# 3930 "parsing/parser.mly" +======= +# 3921 "parsing/parser.mly" +>>>>>>> origin/main ( Ptyp_var tyvar ) -# 69365 "parsing/parser.ml" +<<<<<<< HEAD +# 101313 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101963 "parsing/parser.ml" +||||||| 04da777f7 +# 101950 "parsing/parser.ml" +======= +# 101964 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos__1_ = _endpos_tyvar_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 69374 "parsing/parser.ml" +<<<<<<< HEAD +# 101322 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101972 "parsing/parser.ml" +||||||| 04da777f7 +# 101959 "parsing/parser.ml" +======= +# 101973 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3780 "parsing/parser.mly" - ( _1 ) -# 69380 "parsing/parser.ml" - - in - -# 3771 "parsing/parser.mly" +<<<<<<< HEAD +# 3940 "parsing/parser.mly" +||||||| 04da777f7 +# 3933 "parsing/parser.mly" +======= +# 3924 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 101328 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101978 "parsing/parser.ml" +||||||| 04da777f7 +# 101965 "parsing/parser.ml" +======= +# 101979 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3931 "parsing/parser.mly" +||||||| 04da777f7 +# 3924 "parsing/parser.mly" +======= +# 3915 "parsing/parser.mly" +>>>>>>> origin/main ( {_2 with ptyp_attributes = _3}, _1 ) -# 69386 "parsing/parser.ml" +<<<<<<< HEAD +# 101334 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 101984 "parsing/parser.ml" +||||||| 04da777f7 +# 101971 "parsing/parser.ml" +======= +# 101985 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69421,38 +200269,114 @@ module Tables = struct let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = let _3 = let _1 = _1_inlined2 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 69427 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 101375 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 102025 "parsing/parser.ml" +||||||| 04da777f7 +# 102012 "parsing/parser.ml" +======= +# 102026 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _2 = let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = let _1 = -# 3779 "parsing/parser.mly" +<<<<<<< HEAD +# 3939 "parsing/parser.mly" +||||||| 04da777f7 +# 3932 "parsing/parser.mly" +======= +# 3923 "parsing/parser.mly" +>>>>>>> origin/main ( Ptyp_any ) -# 69436 "parsing/parser.ml" +<<<<<<< HEAD +# 101384 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102034 "parsing/parser.ml" +||||||| 04da777f7 +# 102021 "parsing/parser.ml" +======= +# 102035 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1319 "parsing/parser.mly" +# 1232 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 69444 "parsing/parser.ml" +<<<<<<< HEAD +# 101392 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102042 "parsing/parser.ml" +||||||| 04da777f7 +# 102029 "parsing/parser.ml" +======= +# 102043 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3780 "parsing/parser.mly" - ( _1 ) -# 69450 "parsing/parser.ml" - - in - -# 3771 "parsing/parser.mly" +<<<<<<< HEAD +# 3940 "parsing/parser.mly" +||||||| 04da777f7 +# 3933 "parsing/parser.mly" +======= +# 3924 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 101398 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102048 "parsing/parser.ml" +||||||| 04da777f7 +# 102035 "parsing/parser.ml" +======= +# 102049 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3931 "parsing/parser.mly" +||||||| 04da777f7 +# 3924 "parsing/parser.mly" +======= +# 3915 "parsing/parser.mly" +>>>>>>> origin/main ( {_2 with ptyp_attributes = _3}, _1 ) -# 69456 "parsing/parser.ml" +<<<<<<< HEAD +# 101404 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102054 "parsing/parser.ml" +||||||| 04da777f7 +# 102041 "parsing/parser.ml" +======= +# 102055 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69468,9 +200392,25 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 3727 "parsing/parser.mly" +<<<<<<< HEAD +# 3866 "parsing/parser.mly" +||||||| 04da777f7 +# 3864 "parsing/parser.mly" +======= +# 3855 "parsing/parser.mly" +>>>>>>> origin/main ( [] ) -# 69474 "parsing/parser.ml" +<<<<<<< HEAD +# 101422 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102072 "parsing/parser.ml" +||||||| 04da777f7 +# 102059 "parsing/parser.ml" +======= +# 102073 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69493,9 +200433,25 @@ module Tables = struct let _startpos = _startpos_p_ in let _endpos = _endpos_p_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 3729 "parsing/parser.mly" +<<<<<<< HEAD +# 3868 "parsing/parser.mly" +||||||| 04da777f7 +# 3866 "parsing/parser.mly" +======= +# 3857 "parsing/parser.mly" +>>>>>>> origin/main ( [p] ) -# 69499 "parsing/parser.ml" +<<<<<<< HEAD +# 101447 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102097 "parsing/parser.ml" +||||||| 04da777f7 +# 102084 "parsing/parser.ml" +======= +# 102098 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69535,18 +200491,218 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 69539 "parsing/parser.ml" +<<<<<<< HEAD +# 101487 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102137 "parsing/parser.ml" +||||||| 04da777f7 +# 102124 "parsing/parser.ml" +======= +# 102138 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1439 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( xs ) -# 69544 "parsing/parser.ml" - - in - -# 3733 "parsing/parser.mly" +<<<<<<< HEAD +# 101492 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102142 "parsing/parser.ml" +||||||| 04da777f7 +# 102129 "parsing/parser.ml" +======= +# 102143 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + +<<<<<<< HEAD +# 3872 "parsing/parser.mly" +||||||| 04da777f7 +# 3870 "parsing/parser.mly" +======= +# 3861 "parsing/parser.mly" +>>>>>>> origin/main ( ps ) -# 69550 "parsing/parser.ml" +<<<<<<< HEAD +# 101498 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102148 "parsing/parser.ml" +||||||| 04da777f7 +# 102135 "parsing/parser.ml" +======= +# 102149 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 101526 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102176 "parsing/parser.ml" +||||||| 04da777f7 +# 102163 "parsing/parser.ml" +======= +# 102177 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (string) = +<<<<<<< HEAD +# 4754 "parsing/parser.mly" + ( _1 ^ "#" ) +# 101534 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4758 "parsing/parser.mly" +||||||| 04da777f7 +# 4751 "parsing/parser.mly" +======= +# 4742 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ^ "#" ) +<<<<<<< HEAD +# 102184 "parsing/parser.ml" +||||||| 04da777f7 +# 102171 "parsing/parser.ml" +======= +# 102185 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 1006 "parsing/parser.mly" + (string) +<<<<<<< HEAD +# 101555 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102205 "parsing/parser.ml" +||||||| 04da777f7 +# 102192 "parsing/parser.ml" +======= +# 102206 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +<<<<<<< HEAD +# 4751 "parsing/parser.mly" + ( _1 ) +# 101563 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4755 "parsing/parser.mly" +||||||| 04da777f7 +# 4748 "parsing/parser.mly" +======= +# 4739 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 102213 "parsing/parser.ml" +||||||| 04da777f7 +# 102200 "parsing/parser.ml" +======= +# 102214 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +<<<<<<< HEAD +# 4760 "parsing/parser.mly" + ( _1 ) +# 101588 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4764 "parsing/parser.mly" +||||||| 04da777f7 +# 4757 "parsing/parser.mly" +======= +# 4748 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 102238 "parsing/parser.ml" +||||||| 04da777f7 +# 102225 "parsing/parser.ml" +======= +# 102239 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69562,9 +200718,25 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3791 "parsing/parser.mly" +<<<<<<< HEAD +# 3951 "parsing/parser.mly" +||||||| 04da777f7 +# 3944 "parsing/parser.mly" +======= +# 3935 "parsing/parser.mly" +>>>>>>> origin/main ( NoVariance, NoInjectivity ) -# 69568 "parsing/parser.ml" +<<<<<<< HEAD +# 101606 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102256 "parsing/parser.ml" +||||||| 04da777f7 +# 102243 "parsing/parser.ml" +======= +# 102257 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69587,9 +200759,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3792 "parsing/parser.mly" +<<<<<<< HEAD +# 3952 "parsing/parser.mly" +||||||| 04da777f7 +# 3945 "parsing/parser.mly" +======= +# 3936 "parsing/parser.mly" +>>>>>>> origin/main ( Covariant, NoInjectivity ) -# 69593 "parsing/parser.ml" +<<<<<<< HEAD +# 101631 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102281 "parsing/parser.ml" +||||||| 04da777f7 +# 102268 "parsing/parser.ml" +======= +# 102282 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69612,9 +200800,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3793 "parsing/parser.mly" +<<<<<<< HEAD +# 3953 "parsing/parser.mly" +||||||| 04da777f7 +# 3946 "parsing/parser.mly" +======= +# 3937 "parsing/parser.mly" +>>>>>>> origin/main ( Contravariant, NoInjectivity ) -# 69618 "parsing/parser.ml" +<<<<<<< HEAD +# 101656 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102306 "parsing/parser.ml" +||||||| 04da777f7 +# 102293 "parsing/parser.ml" +======= +# 102307 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69637,9 +200841,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3794 "parsing/parser.mly" +<<<<<<< HEAD +# 3954 "parsing/parser.mly" +||||||| 04da777f7 +# 3947 "parsing/parser.mly" +======= +# 3938 "parsing/parser.mly" +>>>>>>> origin/main ( NoVariance, Injective ) -# 69643 "parsing/parser.ml" +<<<<<<< HEAD +# 101681 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102331 "parsing/parser.ml" +||||||| 04da777f7 +# 102318 "parsing/parser.ml" +======= +# 102332 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69669,9 +200889,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3795 "parsing/parser.mly" +<<<<<<< HEAD +# 3955 "parsing/parser.mly" +||||||| 04da777f7 +# 3948 "parsing/parser.mly" +======= +# 3939 "parsing/parser.mly" +>>>>>>> origin/main ( Covariant, Injective ) -# 69675 "parsing/parser.ml" +<<<<<<< HEAD +# 101713 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102363 "parsing/parser.ml" +||||||| 04da777f7 +# 102350 "parsing/parser.ml" +======= +# 102364 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69701,9 +200937,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3795 "parsing/parser.mly" +<<<<<<< HEAD +# 3955 "parsing/parser.mly" +||||||| 04da777f7 +# 3948 "parsing/parser.mly" +======= +# 3939 "parsing/parser.mly" +>>>>>>> origin/main ( Covariant, Injective ) -# 69707 "parsing/parser.ml" +<<<<<<< HEAD +# 101745 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102395 "parsing/parser.ml" +||||||| 04da777f7 +# 102382 "parsing/parser.ml" +======= +# 102396 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69733,9 +200985,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3796 "parsing/parser.mly" +<<<<<<< HEAD +# 3956 "parsing/parser.mly" +||||||| 04da777f7 +# 3949 "parsing/parser.mly" +======= +# 3940 "parsing/parser.mly" +>>>>>>> origin/main ( Contravariant, Injective ) -# 69739 "parsing/parser.ml" +<<<<<<< HEAD +# 101777 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102427 "parsing/parser.ml" +||||||| 04da777f7 +# 102414 "parsing/parser.ml" +======= +# 102428 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69765,9 +201033,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3796 "parsing/parser.mly" +<<<<<<< HEAD +# 3956 "parsing/parser.mly" +||||||| 04da777f7 +# 3949 "parsing/parser.mly" +======= +# 3940 "parsing/parser.mly" +>>>>>>> origin/main ( Contravariant, Injective ) -# 69771 "parsing/parser.ml" +<<<<<<< HEAD +# 101809 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102459 "parsing/parser.ml" +||||||| 04da777f7 +# 102446 "parsing/parser.ml" +======= +# 102460 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69786,20 +201070,46 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1070 "parsing/parser.mly" +# 980 "parsing/parser.mly" (string) -# 69792 "parsing/parser.ml" +<<<<<<< HEAD +# 101830 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102480 "parsing/parser.ml" +||||||| 04da777f7 +# 102467 "parsing/parser.ml" +======= +# 102481 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3798 "parsing/parser.mly" +<<<<<<< HEAD +# 3958 "parsing/parser.mly" +||||||| 04da777f7 +# 3951 "parsing/parser.mly" +======= +# 3942 "parsing/parser.mly" +>>>>>>> origin/main ( if _1 = "+!" then Covariant, Injective else if _1 = "-!" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 69803 "parsing/parser.ml" +<<<<<<< HEAD +# 101841 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102491 "parsing/parser.ml" +||||||| 04da777f7 +# 102478 "parsing/parser.ml" +======= +# 102492 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69818,20 +201128,46 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1120 "parsing/parser.mly" +# 1033 "parsing/parser.mly" (string) -# 69824 "parsing/parser.ml" +<<<<<<< HEAD +# 101862 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102512 "parsing/parser.ml" +||||||| 04da777f7 +# 102499 "parsing/parser.ml" +======= +# 102513 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3802 "parsing/parser.mly" +<<<<<<< HEAD +# 3962 "parsing/parser.mly" +||||||| 04da777f7 +# 3955 "parsing/parser.mly" +======= +# 3946 "parsing/parser.mly" +>>>>>>> origin/main ( if _1 = "!+" then Covariant, Injective else if _1 = "!-" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 69835 "parsing/parser.ml" +<<<<<<< HEAD +# 101873 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102523 "parsing/parser.ml" +||||||| 04da777f7 +# 102510 "parsing/parser.ml" +======= +# 102524 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69850,9 +201186,19 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1079 "parsing/parser.mly" +# 989 "parsing/parser.mly" (string * char option) -# 69856 "parsing/parser.ml" +<<<<<<< HEAD +# 101894 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102544 "parsing/parser.ml" +||||||| 04da777f7 +# 102531 "parsing/parser.ml" +======= +# 102545 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -69861,9 +201207,27 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4369 "parsing/parser.mly" +<<<<<<< HEAD +# 4633 "parsing/parser.mly" + ( unboxed_int _sloc _sloc Positive _1 ) +# 101905 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4637 "parsing/parser.mly" +||||||| 04da777f7 +# 4630 "parsing/parser.mly" +======= +# 4621 "parsing/parser.mly" +>>>>>>> origin/main ( unboxed_int _sloc _sloc Positive _1 ) -# 69867 "parsing/parser.ml" +<<<<<<< HEAD +# 102555 "parsing/parser.ml" +||||||| 04da777f7 +# 102542 "parsing/parser.ml" +======= +# 102556 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69882,20 +201246,49 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1056 "parsing/parser.mly" +# 964 "parsing/parser.mly" (string * char option) -# 69888 "parsing/parser.ml" +<<<<<<< HEAD +# 101926 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102576 "parsing/parser.ml" +||||||| 04da777f7 +# 102563 "parsing/parser.ml" +======= +# 102577 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in +<<<<<<< HEAD let _v : (Constant.t) = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4370 "parsing/parser.mly" +# 4638 "parsing/parser.mly" + ( unboxed_float _sloc Positive _1 ) +# 102587 "parsing/parser.ml" +||||||| 04da777f7 + let _v : (Constant.t) = let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 4631 "parsing/parser.mly" ( unboxed_float _sloc Positive _1 ) -# 69899 "parsing/parser.ml" +# 102574 "parsing/parser.ml" +======= + let _v : (Constant.t) = +# 4634 "parsing/parser.mly" + ( unboxed_float Positive _1 ) +<<<<<<< HEAD +# 101934 "parsing/parser.ml" +======= +# 102585 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -69929,39 +201322,99 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 69933 "parsing/parser.ml" +<<<<<<< HEAD +# 101968 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102621 "parsing/parser.ml" +||||||| 04da777f7 +# 102608 "parsing/parser.ml" +======= +# 102619 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let xs = let _1 = -# 1355 "parsing/parser.mly" +# 1268 "parsing/parser.mly" ( [] ) -# 69939 "parsing/parser.ml" +<<<<<<< HEAD +# 101974 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102627 "parsing/parser.ml" +||||||| 04da777f7 +# 102614 "parsing/parser.ml" +======= +# 102625 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1607 "parsing/parser.mly" +# 1520 "parsing/parser.mly" ( _1 ) -# 69944 "parsing/parser.ml" +<<<<<<< HEAD +# 101979 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102632 "parsing/parser.ml" +||||||| 04da777f7 +# 102619 "parsing/parser.ml" +======= +# 102630 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in # 267 "" ( xs @ ys ) -# 69950 "parsing/parser.ml" +<<<<<<< HEAD +# 101985 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102638 "parsing/parser.ml" +||||||| 04da777f7 +# 102625 "parsing/parser.ml" +======= +# 102636 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1278 "parsing/parser.mly" +# 1191 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 69959 "parsing/parser.ml" +<<<<<<< HEAD +# 101994 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102647 "parsing/parser.ml" +||||||| 04da777f7 +# 102634 "parsing/parser.ml" +======= +# 102645 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1600 "parsing/parser.mly" +# 1513 "parsing/parser.mly" ( _1 ) -# 69965 "parsing/parser.ml" +<<<<<<< HEAD +# 102000 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102653 "parsing/parser.ml" +||||||| 04da777f7 +# 102640 "parsing/parser.ml" +======= +# 102651 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70009,7 +201462,17 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 70013 "parsing/parser.ml" +<<<<<<< HEAD +# 102048 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102701 "parsing/parser.ml" +||||||| 04da777f7 +# 102688 "parsing/parser.ml" +======= +# 102699 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let xs = let _1 = @@ -70017,61 +201480,159 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4722 "parsing/parser.mly" - ( _1 ) -# 70023 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 102058 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 102711 "parsing/parser.ml" +||||||| 04da777f7 +# 102698 "parsing/parser.ml" +======= +# 102709 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1812 "parsing/parser.mly" +# 1725 "parsing/parser.mly" ( mkstrexp e attrs ) -# 70028 "parsing/parser.ml" +<<<<<<< HEAD +# 102063 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102716 "parsing/parser.ml" +||||||| 04da777f7 +# 102703 "parsing/parser.ml" +======= +# 102714 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1296 "parsing/parser.mly" +# 1209 "parsing/parser.mly" ( Ptop_def [_1] ) -# 70034 "parsing/parser.ml" +<<<<<<< HEAD +# 102069 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102722 "parsing/parser.ml" +||||||| 04da777f7 +# 102709 "parsing/parser.ml" +======= +# 102720 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 1294 "parsing/parser.mly" +# 1207 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 70042 "parsing/parser.ml" +<<<<<<< HEAD +# 102077 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102730 "parsing/parser.ml" +||||||| 04da777f7 +# 102717 "parsing/parser.ml" +======= +# 102728 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1357 "parsing/parser.mly" +# 1270 "parsing/parser.mly" ( x ) -# 70048 "parsing/parser.ml" +<<<<<<< HEAD +# 102083 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102736 "parsing/parser.ml" +||||||| 04da777f7 +# 102723 "parsing/parser.ml" +======= +# 102734 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1607 "parsing/parser.mly" +# 1520 "parsing/parser.mly" ( _1 ) -# 70054 "parsing/parser.ml" +<<<<<<< HEAD +# 102089 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102742 "parsing/parser.ml" +||||||| 04da777f7 +# 102729 "parsing/parser.ml" +======= +# 102740 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in # 267 "" ( xs @ ys ) -# 70060 "parsing/parser.ml" +<<<<<<< HEAD +# 102095 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102748 "parsing/parser.ml" +||||||| 04da777f7 +# 102735 "parsing/parser.ml" +======= +# 102746 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1278 "parsing/parser.mly" +# 1191 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 70069 "parsing/parser.ml" +<<<<<<< HEAD +# 102104 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102757 "parsing/parser.ml" +||||||| 04da777f7 +# 102744 "parsing/parser.ml" +======= +# 102755 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1600 "parsing/parser.mly" +# 1513 "parsing/parser.mly" ( _1 ) -# 70075 "parsing/parser.ml" +<<<<<<< HEAD +# 102110 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102763 "parsing/parser.ml" +||||||| 04da777f7 +# 102750 "parsing/parser.ml" +======= +# 102761 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70102,15 +201663,33 @@ module Tables = struct }; } = _menhir_stack in let _3 : unit = Obj.magic _3 in - let _2 : (string) = Obj.magic _2 in + let _2 : (Asttypes.label) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (string) = -# 4399 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4663 "parsing/parser.mly" + ( _2 ) +# 102149 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4667 "parsing/parser.mly" +||||||| 04da777f7 +# 4660 "parsing/parser.mly" +======= +# 4651 "parsing/parser.mly" +>>>>>>> origin/main ( _2 ) -# 70114 "parsing/parser.ml" +<<<<<<< HEAD +# 102802 "parsing/parser.ml" +||||||| 04da777f7 +# 102789 "parsing/parser.ml" +======= +# 102800 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70141,17 +201720,35 @@ module Tables = struct }; } = _menhir_stack in let _3 : unit = Obj.magic _3 in - let _2 : (string) = Obj.magic _2 in + let _2 : (Asttypes.label) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (string) = let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 4400 "parsing/parser.mly" +<<<<<<< HEAD +# 4664 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__3_ ) +# 102190 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4668 "parsing/parser.mly" +||||||| 04da777f7 +# 4661 "parsing/parser.mly" +======= +# 4652 "parsing/parser.mly" +>>>>>>> origin/main ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 70155 "parsing/parser.ml" +<<<<<<< HEAD +# 102843 "parsing/parser.ml" +||||||| 04da777f7 +# 102830 "parsing/parser.ml" +======= +# 102841 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70180,11 +201777,29 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (string) = let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _v : (Asttypes.label) = let _loc__2_ = (_startpos__2_, _endpos__2_) in -# 4401 "parsing/parser.mly" +<<<<<<< HEAD +# 4665 "parsing/parser.mly" ( expecting _loc__2_ "operator" ) -# 70188 "parsing/parser.ml" +# 102223 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4669 "parsing/parser.mly" +||||||| 04da777f7 +# 4662 "parsing/parser.mly" +======= +# 4653 "parsing/parser.mly" +>>>>>>> origin/main + ( expecting _loc__2_ "operator" ) +<<<<<<< HEAD +# 102876 "parsing/parser.ml" +||||||| 04da777f7 +# 102863 "parsing/parser.ml" +======= +# 102874 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70220,11 +201835,29 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (string) = let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 4402 "parsing/parser.mly" +<<<<<<< HEAD +# 4666 "parsing/parser.mly" + ( expecting _loc__3_ "module-expr" ) +# 102263 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4670 "parsing/parser.mly" +||||||| 04da777f7 +# 4663 "parsing/parser.mly" +======= +# 4654 "parsing/parser.mly" +>>>>>>> origin/main ( expecting _loc__3_ "module-expr" ) -# 70228 "parsing/parser.ml" +<<<<<<< HEAD +# 102916 "parsing/parser.ml" +||||||| 04da777f7 +# 102903 "parsing/parser.ml" +======= +# 102914 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70243,17 +201876,45 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 70249 "parsing/parser.ml" +<<<<<<< HEAD +# 102284 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 102937 "parsing/parser.ml" +||||||| 04da777f7 +# 102924 "parsing/parser.ml" +======= +# 102935 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4405 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4669 "parsing/parser.mly" ( _1 ) -# 70257 "parsing/parser.ml" +# 102292 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4673 "parsing/parser.mly" +||||||| 04da777f7 +# 4666 "parsing/parser.mly" +======= +# 4657 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 102945 "parsing/parser.ml" +||||||| 04da777f7 +# 102932 "parsing/parser.ml" +======= +# 102943 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70271,14 +201932,32 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (string) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (string) = -# 4406 "parsing/parser.mly" + let _v : (Asttypes.label) = +<<<<<<< HEAD +# 4670 "parsing/parser.mly" + ( _1 ) +# 102317 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4674 "parsing/parser.mly" +||||||| 04da777f7 +# 4667 "parsing/parser.mly" +======= +# 4658 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 70282 "parsing/parser.ml" +<<<<<<< HEAD +# 102970 "parsing/parser.ml" +||||||| 04da777f7 +# 102957 "parsing/parser.ml" +======= +# 102968 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70301,9 +201980,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 4474 "parsing/parser.mly" +<<<<<<< HEAD +# 4745 "parsing/parser.mly" + ( _1 ) +# 102342 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4749 "parsing/parser.mly" +||||||| 04da777f7 +# 4742 "parsing/parser.mly" +======= +# 4733 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 70307 "parsing/parser.ml" +<<<<<<< HEAD +# 102995 "parsing/parser.ml" +||||||| 04da777f7 +# 102982 "parsing/parser.ml" +======= +# 102993 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70348,46 +202045,136 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 70354 "parsing/parser.ml" +<<<<<<< HEAD +# 102389 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103042 "parsing/parser.ml" +||||||| 04da777f7 +# 103029 "parsing/parser.ml" +======= +# 103040 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1_inlined1 in let mutable_ : (Asttypes.mutable_flag) = Obj.magic mutable_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos_ty_ in - let _v : ((string Location.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * + let _v : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * + Parsetree.class_field_kind) * Parsetree.attributes) = let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 4356 "parsing/parser.mly" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 102403 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 70367 "parsing/parser.ml" +<<<<<<< HEAD +# 103056 "parsing/parser.ml" +||||||| 04da777f7 +# 103043 "parsing/parser.ml" +======= +# 103054 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 70375 "parsing/parser.ml" +<<<<<<< HEAD +# 102411 "parsing/parser.ml" in let attrs = -# 4726 "parsing/parser.mly" +# 5009 "parsing/parser.mly" ( _1 ) -# 70381 "parsing/parser.ml" +# 102417 "parsing/parser.ml" in let _1 = -# 4624 "parsing/parser.mly" +# 4907 "parsing/parser.mly" ( Fresh ) -# 70386 "parsing/parser.ml" +# 102422 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103064 "parsing/parser.ml" +||||||| 04da777f7 +# 103051 "parsing/parser.ml" +======= +# 103062 "parsing/parser.ml" +>>>>>>> origin/main + + in + let attrs = +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103070 "parsing/parser.ml" +||||||| 04da777f7 +# 103057 "parsing/parser.ml" +======= +# 103068 "parsing/parser.ml" +>>>>>>> origin/main in - -# 2420 "parsing/parser.mly" + let _1 = +<<<<<<< HEAD +# 4911 "parsing/parser.mly" +||||||| 04da777f7 +# 4904 "parsing/parser.mly" +======= +# 4895 "parsing/parser.mly" +>>>>>>> origin/main + ( Fresh ) +<<<<<<< HEAD +# 103075 "parsing/parser.ml" +||||||| 04da777f7 +# 103062 "parsing/parser.ml" +======= +# 103073 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + +<<<<<<< HEAD +# 2357 "parsing/parser.mly" +||||||| 04da777f7 +# 2355 "parsing/parser.mly" +======= +# 2345 "parsing/parser.mly" +>>>>>>> origin/main ( (label, mutable_, Cfk_virtual ty), attrs ) -# 70391 "parsing/parser.ml" +<<<<<<< HEAD +# 102427 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103080 "parsing/parser.ml" +||||||| 04da777f7 +# 103067 "parsing/parser.ml" +======= +# 103078 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70432,46 +202219,136 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 70438 "parsing/parser.ml" +<<<<<<< HEAD +# 102474 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103127 "parsing/parser.ml" +||||||| 04da777f7 +# 103114 "parsing/parser.ml" +======= +# 103125 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__6_ in - let _v : ((string Location.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * + let _v : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * + Parsetree.class_field_kind) * Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 4356 "parsing/parser.mly" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 102488 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 70451 "parsing/parser.ml" +<<<<<<< HEAD +# 103141 "parsing/parser.ml" +||||||| 04da777f7 +# 103128 "parsing/parser.ml" +======= +# 103139 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 70459 "parsing/parser.ml" +<<<<<<< HEAD +# 102496 "parsing/parser.ml" in let _2 = -# 4726 "parsing/parser.mly" +# 5009 "parsing/parser.mly" ( _1 ) -# 70465 "parsing/parser.ml" +# 102502 "parsing/parser.ml" in let _1 = -# 4627 "parsing/parser.mly" +# 4910 "parsing/parser.mly" ( Fresh ) -# 70470 "parsing/parser.ml" +# 102507 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103149 "parsing/parser.ml" +||||||| 04da777f7 +# 103136 "parsing/parser.ml" +======= +# 103147 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _2 = +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103155 "parsing/parser.ml" +||||||| 04da777f7 +# 103142 "parsing/parser.ml" +======= +# 103153 "parsing/parser.ml" +>>>>>>> origin/main + in + let _1 = +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main + ( Fresh ) +<<<<<<< HEAD +# 103160 "parsing/parser.ml" +||||||| 04da777f7 +# 103147 "parsing/parser.ml" +======= +# 103158 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2422 "parsing/parser.mly" +<<<<<<< HEAD +# 2359 "parsing/parser.mly" +||||||| 04da777f7 +# 2357 "parsing/parser.mly" +======= +# 2347 "parsing/parser.mly" +>>>>>>> origin/main ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 70475 "parsing/parser.ml" +<<<<<<< HEAD +# 102512 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103165 "parsing/parser.ml" +||||||| 04da777f7 +# 103152 "parsing/parser.ml" +======= +# 103163 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70522,9 +202399,19 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 70528 "parsing/parser.ml" +<<<<<<< HEAD +# 102565 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103218 "parsing/parser.ml" +||||||| 04da777f7 +# 103205 "parsing/parser.ml" +======= +# 103216 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -70532,40 +202419,121 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__6_ in - let _v : ((string Location.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * + let _v : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * + Parsetree.class_field_kind) * Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 4356 "parsing/parser.mly" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 102580 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 70542 "parsing/parser.ml" +<<<<<<< HEAD +# 103233 "parsing/parser.ml" +||||||| 04da777f7 +# 103220 "parsing/parser.ml" +======= +# 103231 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 70550 "parsing/parser.ml" +<<<<<<< HEAD +# 102588 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103241 "parsing/parser.ml" +||||||| 04da777f7 +# 103228 "parsing/parser.ml" +======= +# 103239 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 70558 "parsing/parser.ml" +# 102596 "parsing/parser.ml" in let _1 = -# 4628 "parsing/parser.mly" +# 4911 "parsing/parser.mly" + ( Override ) +# 102602 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103249 "parsing/parser.ml" +||||||| 04da777f7 +# 103236 "parsing/parser.ml" +======= +# 103247 "parsing/parser.ml" +>>>>>>> origin/main + + in + let _1 = +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main ( Override ) -# 70564 "parsing/parser.ml" +<<<<<<< HEAD +# 103255 "parsing/parser.ml" +||||||| 04da777f7 +# 103242 "parsing/parser.ml" +======= +# 103253 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 2422 "parsing/parser.mly" +<<<<<<< HEAD +# 2359 "parsing/parser.mly" +||||||| 04da777f7 +# 2357 "parsing/parser.mly" +======= +# 2347 "parsing/parser.mly" +>>>>>>> origin/main ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 70569 "parsing/parser.ml" +<<<<<<< HEAD +# 102607 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103260 "parsing/parser.ml" +||||||| 04da777f7 +# 103247 "parsing/parser.ml" +======= +# 103258 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70617,43 +202585,118 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (N_ary.type_constraint) = Obj.magic _5 in let _1_inlined1 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 70623 "parsing/parser.ml" +<<<<<<< HEAD +# 102661 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103314 "parsing/parser.ml" +||||||| 04da777f7 +# 103301 "parsing/parser.ml" +======= +# 103312 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in - let _v : ((string Location.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * + let _v : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * + Parsetree.class_field_kind) * Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 4356 "parsing/parser.mly" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" ( _1 ) -# 70636 "parsing/parser.ml" +# 102675 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103328 "parsing/parser.ml" +||||||| 04da777f7 +# 103315 "parsing/parser.ml" +======= +# 103326 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 70644 "parsing/parser.ml" +<<<<<<< HEAD +# 102683 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103336 "parsing/parser.ml" +||||||| 04da777f7 +# 103323 "parsing/parser.ml" +======= +# 103334 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 4726 "parsing/parser.mly" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" ( _1 ) -# 70651 "parsing/parser.ml" +# 102690 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 4627 "parsing/parser.mly" +# 4910 "parsing/parser.mly" + ( Fresh ) +# 102696 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103343 "parsing/parser.ml" +||||||| 04da777f7 +# 103330 "parsing/parser.ml" +======= +# 103341 "parsing/parser.ml" +>>>>>>> origin/main + in + let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in + let _1 = +<<<<<<< HEAD +# 4914 "parsing/parser.mly" +||||||| 04da777f7 +# 4907 "parsing/parser.mly" +======= +# 4898 "parsing/parser.mly" +>>>>>>> origin/main ( Fresh ) -# 70657 "parsing/parser.ml" +<<<<<<< HEAD +# 103349 "parsing/parser.ml" +||||||| 04da777f7 +# 103336 "parsing/parser.ml" +======= +# 103347 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__7_ in @@ -70669,11 +202712,27 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 2425 "parsing/parser.mly" - ( let e = mkexp_constraint ~loc:_sloc _7 _5 in +<<<<<<< HEAD +# 2362 "parsing/parser.mly" +||||||| 04da777f7 +# 2360 "parsing/parser.mly" +======= +# 2350 "parsing/parser.mly" +>>>>>>> origin/main + ( let e = mkexp_type_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 70677 "parsing/parser.ml" +<<<<<<< HEAD +# 102716 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103369 "parsing/parser.ml" +||||||| 04da777f7 +# 103356 "parsing/parser.ml" +======= +# 103367 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70731,9 +202790,19 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (N_ary.type_constraint) = Obj.magic _5 in let _1_inlined2 : ( -# 1094 "parsing/parser.mly" +# 1006 "parsing/parser.mly" (string) -# 70737 "parsing/parser.ml" +<<<<<<< HEAD +# 102776 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103429 "parsing/parser.ml" +||||||| 04da777f7 +# 103416 "parsing/parser.ml" +======= +# 103427 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -70741,37 +202810,102 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in - let _v : ((string Location.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * + let _v : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * + Parsetree.class_field_kind) * Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 4356 "parsing/parser.mly" +<<<<<<< HEAD +# 4620 "parsing/parser.mly" + ( _1 ) +# 102791 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4624 "parsing/parser.mly" +||||||| 04da777f7 +# 4617 "parsing/parser.mly" +======= +# 4608 "parsing/parser.mly" +>>>>>>> origin/main ( _1 ) -# 70751 "parsing/parser.ml" +<<<<<<< HEAD +# 103444 "parsing/parser.ml" +||||||| 04da777f7 +# 103431 "parsing/parser.ml" +======= +# 103442 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 70759 "parsing/parser.ml" +<<<<<<< HEAD +# 102799 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103452 "parsing/parser.ml" +||||||| 04da777f7 +# 103439 "parsing/parser.ml" +======= +# 103450 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 70768 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 102808 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103461 "parsing/parser.ml" +||||||| 04da777f7 +# 103448 "parsing/parser.ml" +======= +# 103459 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 4628 "parsing/parser.mly" +<<<<<<< HEAD +# 4911 "parsing/parser.mly" + ( Override ) +# 102815 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4915 "parsing/parser.mly" +||||||| 04da777f7 +# 4908 "parsing/parser.mly" +======= +# 4899 "parsing/parser.mly" +>>>>>>> origin/main ( Override ) -# 70775 "parsing/parser.ml" +<<<<<<< HEAD +# 103468 "parsing/parser.ml" +||||||| 04da777f7 +# 103455 "parsing/parser.ml" +======= +# 103466 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__7_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -70786,11 +202920,27 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 2425 "parsing/parser.mly" - ( let e = mkexp_constraint ~loc:_sloc _7 _5 in +<<<<<<< HEAD +# 2362 "parsing/parser.mly" +||||||| 04da777f7 +# 2360 "parsing/parser.mly" +======= +# 2350 "parsing/parser.mly" +>>>>>>> origin/main + ( let e = mkexp_type_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 70794 "parsing/parser.ml" +<<<<<<< HEAD +# 102834 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103487 "parsing/parser.ml" +||||||| 04da777f7 +# 103474 "parsing/parser.ml" +======= +# 103485 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70809,17 +202959,45 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1078 "parsing/parser.mly" +# 988 "parsing/parser.mly" (string * char option) -# 70815 "parsing/parser.ml" +<<<<<<< HEAD +# 102855 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103508 "parsing/parser.ml" +||||||| 04da777f7 +# 103495 "parsing/parser.ml" +======= +# 103506 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 4362 "parsing/parser.mly" +<<<<<<< HEAD +# 4626 "parsing/parser.mly" ( let (n, m) = _1 in Pconst_integer (n, m) ) -# 70823 "parsing/parser.ml" +# 102863 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4630 "parsing/parser.mly" +||||||| 04da777f7 +# 4623 "parsing/parser.mly" +======= +# 4614 "parsing/parser.mly" +>>>>>>> origin/main + ( let (n, m) = _1 in Pconst_integer (n, m) ) +<<<<<<< HEAD +# 103516 "parsing/parser.ml" +||||||| 04da777f7 +# 103503 "parsing/parser.ml" +======= +# 103514 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70838,17 +203016,45 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1033 "parsing/parser.mly" +# 941 "parsing/parser.mly" (char) -# 70844 "parsing/parser.ml" +<<<<<<< HEAD +# 102884 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103537 "parsing/parser.ml" +||||||| 04da777f7 +# 103524 "parsing/parser.ml" +======= +# 103535 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 4363 "parsing/parser.mly" +<<<<<<< HEAD +# 4627 "parsing/parser.mly" + ( Pconst_char _1 ) +# 102892 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4631 "parsing/parser.mly" +||||||| 04da777f7 +# 4624 "parsing/parser.mly" +======= +# 4615 "parsing/parser.mly" +>>>>>>> origin/main ( Pconst_char _1 ) -# 70852 "parsing/parser.ml" +<<<<<<< HEAD +# 103545 "parsing/parser.ml" +||||||| 04da777f7 +# 103532 "parsing/parser.ml" +======= +# 103543 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70867,18 +203073,47 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1135 "parsing/parser.mly" +# 1048 "parsing/parser.mly" (string * Location.t * string option) -# 70873 "parsing/parser.ml" +<<<<<<< HEAD +# 102913 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103566 "parsing/parser.ml" +||||||| 04da777f7 +# 103553 "parsing/parser.ml" +======= +# 103564 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 4364 "parsing/parser.mly" +<<<<<<< HEAD +# 4628 "parsing/parser.mly" + ( let (s, strloc, d) = _1 in + Pconst_string (s, strloc, d) ) +# 102922 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4632 "parsing/parser.mly" +||||||| 04da777f7 +# 4625 "parsing/parser.mly" +======= +# 4616 "parsing/parser.mly" +>>>>>>> origin/main ( let (s, strloc, d) = _1 in Pconst_string (s, strloc, d) ) -# 70882 "parsing/parser.ml" +<<<<<<< HEAD +# 103575 "parsing/parser.ml" +||||||| 04da777f7 +# 103562 "parsing/parser.ml" +======= +# 103573 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70897,17 +203132,45 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 1055 "parsing/parser.mly" +# 963 "parsing/parser.mly" (string * char option) -# 70903 "parsing/parser.ml" +<<<<<<< HEAD +# 102943 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103596 "parsing/parser.ml" +||||||| 04da777f7 +# 103583 "parsing/parser.ml" +======= +# 103594 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 4366 "parsing/parser.mly" +<<<<<<< HEAD +# 4630 "parsing/parser.mly" + ( let (f, m) = _1 in Pconst_float (f, m) ) +# 102951 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4634 "parsing/parser.mly" +||||||| 04da777f7 +# 4627 "parsing/parser.mly" +======= +# 4618 "parsing/parser.mly" +>>>>>>> origin/main ( let (f, m) = _1 in Pconst_float (f, m) ) -# 70911 "parsing/parser.ml" +<<<<<<< HEAD +# 103604 "parsing/parser.ml" +||||||| 04da777f7 +# 103591 "parsing/parser.ml" +======= +# 103602 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -70964,52 +203227,336 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let ty : (Parsetree.core_type) = Obj.magic ty in let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (string) = Obj.magic _1_inlined2 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Location.loc option) = Obj.magic ext in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined3_ in - let _v : (Parsetree.value_description * string Location.loc option) = let attrs2 = + let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4722 "parsing/parser.mly" - ( _1 ) -# 70980 "parsing/parser.ml" +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 103020 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103673 "parsing/parser.ml" +||||||| 04da777f7 +# 103660 "parsing/parser.ml" +======= +# 103671 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos_attrs2_ = _endpos__1_inlined3_ in + let modes = +<<<<<<< HEAD +# 4405 "parsing/parser.mly" + ( Mode.empty ) +# 103027 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4424 "parsing/parser.mly" +||||||| 04da777f7 +# 4417 "parsing/parser.mly" +======= +# 4408 "parsing/parser.mly" +>>>>>>> origin/main + ( Mode.empty ) +<<<<<<< HEAD +# 103680 "parsing/parser.ml" +||||||| 04da777f7 +# 103667 "parsing/parser.ml" +======= +# 103678 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 70992 "parsing/parser.ml" +<<<<<<< HEAD +# 103037 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103690 "parsing/parser.ml" +||||||| 04da777f7 +# 103677 "parsing/parser.ml" +======= +# 103688 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let attrs1 = let _1 = _1_inlined1 in -# 4726 "parsing/parser.mly" - ( _1 ) -# 71000 "parsing/parser.ml" +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 103045 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103698 "parsing/parser.ml" +||||||| 04da777f7 +# 103685 "parsing/parser.ml" +======= +# 103696 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3586 "parsing/parser.mly" +<<<<<<< HEAD +# 3722 "parsing/parser.mly" +||||||| 04da777f7 +# 3720 "parsing/parser.mly" +======= +# 3711 "parsing/parser.mly" +>>>>>>> origin/main ( let attrs = attrs1 @ attrs2 in + let ty = mktyp_with_modes modes ty in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~attrs ~loc ~docs, ext ) -# 71013 "parsing/parser.ml" +<<<<<<< HEAD +# 103059 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103712 "parsing/parser.ml" +||||||| 04da777f7 +# 103699 "parsing/parser.ml" +======= +# 103710 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Mode.t) = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined4_ in + let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined4 in + +<<<<<<< HEAD +# 5005 "parsing/parser.mly" + ( _1 ) +# 103135 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5009 "parsing/parser.mly" +||||||| 04da777f7 +# 5002 "parsing/parser.mly" +======= +# 4993 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103788 "parsing/parser.ml" +||||||| 04da777f7 +# 103775 "parsing/parser.ml" +======= +# 103786 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let modes = + let _1 = _1_inlined3 in + +<<<<<<< HEAD +# 4406 "parsing/parser.mly" + (_1) +# 103144 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4425 "parsing/parser.mly" +||||||| 04da777f7 +# 4418 "parsing/parser.mly" +======= +# 4409 "parsing/parser.mly" +>>>>>>> origin/main + (_1) +<<<<<<< HEAD +# 103797 "parsing/parser.ml" +||||||| 04da777f7 +# 103784 "parsing/parser.ml" +======= +# 103795 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +<<<<<<< HEAD +# 103155 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103808 "parsing/parser.ml" +||||||| 04da777f7 +# 103795 "parsing/parser.ml" +======= +# 103806 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let attrs1 = + let _1 = _1_inlined1 in + +<<<<<<< HEAD +# 5009 "parsing/parser.mly" + ( _1 ) +# 103163 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5013 "parsing/parser.mly" +||||||| 04da777f7 +# 5006 "parsing/parser.mly" +======= +# 4997 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103816 "parsing/parser.ml" +||||||| 04da777f7 +# 103803 "parsing/parser.ml" +======= +# 103814 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +<<<<<<< HEAD +# 3722 "parsing/parser.mly" +||||||| 04da777f7 +# 3720 "parsing/parser.mly" +======= +# 3711 "parsing/parser.mly" +>>>>>>> origin/main + ( let attrs = attrs1 @ attrs2 in + let ty = mktyp_with_modes modes ty in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Val.mk id ty ~attrs ~loc ~docs, + ext ) +<<<<<<< HEAD +# 103177 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 103830 "parsing/parser.ml" +||||||| 04da777f7 +# 103817 "parsing/parser.ml" +======= +# 103828 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71025,9 +203572,27 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.virtual_flag) = -# 4588 "parsing/parser.mly" +<<<<<<< HEAD +# 4871 "parsing/parser.mly" ( Concrete ) -# 71031 "parsing/parser.ml" +# 103195 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4875 "parsing/parser.mly" +||||||| 04da777f7 +# 4868 "parsing/parser.mly" +======= +# 4859 "parsing/parser.mly" +>>>>>>> origin/main + ( Concrete ) +<<<<<<< HEAD +# 103848 "parsing/parser.ml" +||||||| 04da777f7 +# 103835 "parsing/parser.ml" +======= +# 103846 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71050,9 +203615,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.virtual_flag) = -# 4589 "parsing/parser.mly" +<<<<<<< HEAD +# 4872 "parsing/parser.mly" + ( Virtual ) +# 103220 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4876 "parsing/parser.mly" +||||||| 04da777f7 +# 4869 "parsing/parser.mly" +======= +# 4860 "parsing/parser.mly" +>>>>>>> origin/main ( Virtual ) -# 71056 "parsing/parser.ml" +<<<<<<< HEAD +# 103873 "parsing/parser.ml" +||||||| 04da777f7 +# 103860 "parsing/parser.ml" +======= +# 103871 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71075,9 +203658,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 4612 "parsing/parser.mly" +<<<<<<< HEAD +# 4895 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4899 "parsing/parser.mly" ( Immutable ) -# 71081 "parsing/parser.ml" +# 103898 "parsing/parser.ml" +||||||| 04da777f7 +# 4892 "parsing/parser.mly" + ( Immutable ) +# 103885 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71107,9 +203698,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 4613 "parsing/parser.mly" +# 4893 "parsing/parser.mly" ( Mutable ) -# 71113 "parsing/parser.ml" +# 103917 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71139,9 +203730,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 4614 "parsing/parser.mly" +# 4894 "parsing/parser.mly" ( Mutable ) -# 71145 "parsing/parser.ml" +# 103949 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71164,9 +203755,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 4619 "parsing/parser.mly" +# 4899 "parsing/parser.mly" ( Public ) -# 71170 "parsing/parser.ml" +# 103974 "parsing/parser.ml" +======= +# 4883 "parsing/parser.mly" +>>>>>>> upstream/main + ( Immutable ) +# 103245 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71195,10 +203791,177 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in + let _v : (Asttypes.mutable_flag) = +# 4896 "parsing/parser.mly" + ( Mutable ) +# 103277 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.mutable_flag) = +# 4897 "parsing/parser.mly" + ( Mutable ) +# 103309 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 4620 "parsing/parser.mly" +# 4902 "parsing/parser.mly" + ( Public ) +<<<<<<< HEAD +# 103334 "parsing/parser.ml" +======= +# 103985 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in +<<<<<<< HEAD + let _v : (Asttypes.mutable_flag) = +# 4900 "parsing/parser.mly" + ( Mutable ) +# 103930 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.mutable_flag) = +# 4901 "parsing/parser.mly" + ( Mutable ) +# 103962 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.private_flag) = +# 4906 "parsing/parser.mly" + ( Public ) +# 103987 "parsing/parser.ml" +||||||| 04da777f7 + let _v : (Asttypes.private_flag) = +# 4900 "parsing/parser.mly" ( Private ) -# 71202 "parsing/parser.ml" +# 104006 "parsing/parser.ml" +======= + let _v : (Asttypes.private_flag) = +# 4903 "parsing/parser.mly" + ( Private ) +<<<<<<< HEAD +# 103366 "parsing/parser.ml" +======= +# 104017 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71228,9 +203991,59 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 4621 "parsing/parser.mly" +<<<<<<< HEAD +# 4904 "parsing/parser.mly" + ( Private ) +# 103398 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4907 "parsing/parser.mly" +||||||| 04da777f7 +# 4901 "parsing/parser.mly" +======= +# 4892 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 104019 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.private_flag) = +# 4908 "parsing/parser.mly" ( Private ) -# 71234 "parsing/parser.ml" +# 104051 "parsing/parser.ml" +||||||| 04da777f7 +# 104038 "parsing/parser.ml" +======= +# 104049 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71278,7 +204091,7 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : ((Parsetree.core_type * Parsetree.core_type * Warnings.loc) list) = Obj.magic xs in + let xs : ((Parsetree.core_type * Parsetree.core_type * Location.t) list) = Obj.magic xs in let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _4 : (Asttypes.private_flag) = Obj.magic _4 in let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in @@ -71292,27 +204105,81 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 71296 "parsing/parser.ml" +<<<<<<< HEAD +# 103460 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104113 "parsing/parser.ml" +||||||| 04da777f7 +# 104100 "parsing/parser.ml" +======= +# 104111 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 1369 "parsing/parser.mly" +# 1282 "parsing/parser.mly" ( xs ) -# 71301 "parsing/parser.ml" +<<<<<<< HEAD +# 103465 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104118 "parsing/parser.ml" +||||||| 04da777f7 +# 104105 "parsing/parser.ml" +======= +# 104116 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in -# 3688 "parsing/parser.mly" - ( _1 ) -# 71307 "parsing/parser.ml" +<<<<<<< HEAD +# 3827 "parsing/parser.mly" +||||||| 04da777f7 +# 3825 "parsing/parser.mly" +======= +# 3816 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 103471 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104124 "parsing/parser.ml" +||||||| 04da777f7 +# 104111 "parsing/parser.ml" +======= +# 104122 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos__6_ = _endpos_xs_ in let _5 = let _1 = _1_inlined2 in -# 4084 "parsing/parser.mly" +<<<<<<< HEAD +# 4226 "parsing/parser.mly" ( _1 ) -# 71316 "parsing/parser.ml" +# 103480 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4245 "parsing/parser.mly" +||||||| 04da777f7 +# 4238 "parsing/parser.mly" +======= +# 4229 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 104133 "parsing/parser.ml" +||||||| 04da777f7 +# 104120 "parsing/parser.ml" +======= +# 104131 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _3 = @@ -71321,16 +204188,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71327 "parsing/parser.ml" +<<<<<<< HEAD +# 103491 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104144 "parsing/parser.ml" +||||||| 04da777f7 +# 104131 "parsing/parser.ml" +======= +# 104142 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3998 "parsing/parser.mly" +<<<<<<< HEAD +# 4140 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4159 "parsing/parser.mly" +||||||| 04da777f7 +# 4152 "parsing/parser.mly" +======= +# 4143 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( let lident = loc_last _3 in Pwith_type (_3, @@ -71340,7 +204227,17 @@ module Tables = struct ~manifest:_5 ~priv:_4 ~loc:(make_loc _sloc))) ) -# 71344 "parsing/parser.ml" +<<<<<<< HEAD +# 103508 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104161 "parsing/parser.ml" +||||||| 04da777f7 +# 104148 "parsing/parser.ml" +======= +# 104159 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71393,9 +204290,27 @@ module Tables = struct let _v : (Parsetree.with_constraint) = let _5 = let _1 = _1_inlined2 in -# 4084 "parsing/parser.mly" +<<<<<<< HEAD +# 4226 "parsing/parser.mly" ( _1 ) -# 71399 "parsing/parser.ml" +# 103563 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4245 "parsing/parser.mly" +||||||| 04da777f7 +# 4238 "parsing/parser.mly" +======= +# 4229 "parsing/parser.mly" +>>>>>>> origin/main + ( _1 ) +<<<<<<< HEAD +# 104216 "parsing/parser.ml" +||||||| 04da777f7 +# 104203 "parsing/parser.ml" +======= +# 104214 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos__5_ = _endpos__1_inlined2_ in @@ -71405,16 +204320,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71411 "parsing/parser.ml" +<<<<<<< HEAD +# 103575 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104228 "parsing/parser.ml" +||||||| 04da777f7 +# 104215 "parsing/parser.ml" +======= +# 104226 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4011 "parsing/parser.mly" +<<<<<<< HEAD +# 4153 "parsing/parser.mly" +======= +<<<<<<< HEAD +# 4172 "parsing/parser.mly" +||||||| 04da777f7 +# 4165 "parsing/parser.mly" +======= +# 4156 "parsing/parser.mly" +>>>>>>> origin/main +>>>>>>> upstream/main ( let lident = loc_last _3 in Pwith_typesubst (_3, @@ -71422,7 +204357,17 @@ module Tables = struct ~params:_2 ~manifest:_5 ~loc:(make_loc _sloc))) ) -# 71426 "parsing/parser.ml" +<<<<<<< HEAD +# 103590 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104243 "parsing/parser.ml" +||||||| 04da777f7 +# 104230 "parsing/parser.ml" +======= +# 104241 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71471,9 +204416,13 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +<<<<<<< HEAD +# 1205 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71477 "parsing/parser.ml" +<<<<<<< HEAD +# 103641 "parsing/parser.ml" +======= +# 104294 "parsing/parser.ml" in let _2 = @@ -71482,15 +204431,61 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1205 "parsing/parser.mly" +||||||| 04da777f7 +# 1205 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71488 "parsing/parser.ml" +# 104281 "parsing/parser.ml" + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1205 "parsing/parser.mly" +======= +# 1195 "parsing/parser.mly" +>>>>>>> origin/main + ( mkrhs _1 _sloc ) +# 104305 "parsing/parser.ml" +>>>>>>> upstream/main + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1195 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 103652 "parsing/parser.ml" in -# 4019 "parsing/parser.mly" +<<<<<<< HEAD +# 4161 "parsing/parser.mly" ( Pwith_module (_2, _4) ) -# 71494 "parsing/parser.ml" +# 103658 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4180 "parsing/parser.mly" +||||||| 04da777f7 +# 4173 "parsing/parser.mly" +======= +# 4164 "parsing/parser.mly" +>>>>>>> origin/main + ( Pwith_module (_2, _4) ) +<<<<<<< HEAD +# 104311 "parsing/parser.ml" +||||||| 04da777f7 +# 104298 "parsing/parser.ml" +======= +# 104309 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71539,9 +204534,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71545 "parsing/parser.ml" +<<<<<<< HEAD +# 103709 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104362 "parsing/parser.ml" +||||||| 04da777f7 +# 104349 "parsing/parser.ml" +======= +# 104360 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in let _2 = @@ -71550,15 +204555,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71556 "parsing/parser.ml" +<<<<<<< HEAD +# 103720 "parsing/parser.ml" in -# 4021 "parsing/parser.mly" +# 4163 "parsing/parser.mly" + ( Pwith_modsubst (_2, _4) ) +# 103726 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104373 "parsing/parser.ml" +||||||| 04da777f7 +# 104360 "parsing/parser.ml" +======= +# 104371 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4182 "parsing/parser.mly" +||||||| 04da777f7 +# 4175 "parsing/parser.mly" +======= +# 4166 "parsing/parser.mly" +>>>>>>> origin/main ( Pwith_modsubst (_2, _4) ) -# 71562 "parsing/parser.ml" +<<<<<<< HEAD +# 104379 "parsing/parser.ml" +||||||| 04da777f7 +# 104366 "parsing/parser.ml" +======= +# 104377 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71614,15 +204647,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71620 "parsing/parser.ml" +<<<<<<< HEAD +# 103784 "parsing/parser.ml" in -# 4023 "parsing/parser.mly" +# 4165 "parsing/parser.mly" ( Pwith_modtype (l, rhs) ) -# 71626 "parsing/parser.ml" +# 103790 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104437 "parsing/parser.ml" +||||||| 04da777f7 +# 104424 "parsing/parser.ml" +======= +# 104435 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4184 "parsing/parser.mly" +||||||| 04da777f7 +# 4177 "parsing/parser.mly" +======= +# 4168 "parsing/parser.mly" +>>>>>>> origin/main + ( Pwith_modtype (l, rhs) ) +<<<<<<< HEAD +# 104443 "parsing/parser.ml" +||||||| 04da777f7 +# 104430 "parsing/parser.ml" +======= +# 104441 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71678,15 +204739,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1282 "parsing/parser.mly" +# 1195 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 71684 "parsing/parser.ml" +<<<<<<< HEAD +# 103848 "parsing/parser.ml" in -# 4025 "parsing/parser.mly" +# 4167 "parsing/parser.mly" ( Pwith_modtypesubst (l, rhs) ) -# 71690 "parsing/parser.ml" +# 103854 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104501 "parsing/parser.ml" +||||||| 04da777f7 +# 104488 "parsing/parser.ml" +======= +# 104499 "parsing/parser.ml" +>>>>>>> origin/main + + in + +<<<<<<< HEAD +# 4186 "parsing/parser.mly" +||||||| 04da777f7 +# 4179 "parsing/parser.mly" +======= +# 4170 "parsing/parser.mly" +>>>>>>> origin/main + ( Pwith_modtypesubst (l, rhs) ) +<<<<<<< HEAD +# 104507 "parsing/parser.ml" +||||||| 04da777f7 +# 104494 "parsing/parser.ml" +======= +# 104505 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71709,9 +204798,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 4028 "parsing/parser.mly" +<<<<<<< HEAD +# 4170 "parsing/parser.mly" + ( Public ) +# 103879 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4189 "parsing/parser.mly" +||||||| 04da777f7 +# 4182 "parsing/parser.mly" +======= +# 4173 "parsing/parser.mly" +>>>>>>> origin/main ( Public ) -# 71715 "parsing/parser.ml" +<<<<<<< HEAD +# 104532 "parsing/parser.ml" +||||||| 04da777f7 +# 104519 "parsing/parser.ml" +======= +# 104530 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71741,9 +204848,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 4029 "parsing/parser.mly" +<<<<<<< HEAD +# 4171 "parsing/parser.mly" ( Private ) -# 71747 "parsing/parser.ml" +# 103911 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 4190 "parsing/parser.mly" +||||||| 04da777f7 +# 4183 "parsing/parser.mly" +======= +# 4174 "parsing/parser.mly" +>>>>>>> origin/main + ( Private ) +<<<<<<< HEAD +# 104564 "parsing/parser.ml" +||||||| 04da777f7 +# 104551 "parsing/parser.ml" +======= +# 104562 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main in { MenhirLib.EngineTypes.state = _menhir_s; @@ -71771,59 +204896,59 @@ end let use_file = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2439 lexer lexbuf) : (Parsetree.toplevel_phrase list)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2941 lexer lexbuf) : (Parsetree.toplevel_phrase list)) and toplevel_phrase = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2411 lexer lexbuf) : (Parsetree.toplevel_phrase)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2913 lexer lexbuf) : (Parsetree.toplevel_phrase)) and parse_val_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2405 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2907 lexer lexbuf) : (Longident.t)) and parse_pattern = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2401 lexer lexbuf) : (Parsetree.pattern)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2903 lexer lexbuf) : (Parsetree.pattern)) and parse_mty_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2397 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2899 lexer lexbuf) : (Longident.t)) and parse_module_type = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2393 lexer lexbuf) : (Parsetree.module_type)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2895 lexer lexbuf) : (Parsetree.module_type)) and parse_module_expr = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2389 lexer lexbuf) : (Parsetree.module_expr)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2891 lexer lexbuf) : (Parsetree.module_expr)) and parse_mod_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2385 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2887 lexer lexbuf) : (Longident.t)) and parse_mod_ext_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2381 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2883 lexer lexbuf) : (Longident.t)) and parse_expression = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2377 lexer lexbuf) : (Parsetree.expression)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2879 lexer lexbuf) : (Parsetree.expression)) and parse_core_type = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2373 lexer lexbuf) : (Parsetree.core_type)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2875 lexer lexbuf) : (Parsetree.core_type)) and parse_constr_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2369 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2871 lexer lexbuf) : (Longident.t)) and parse_any_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2351 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2853 lexer lexbuf) : (Longident.t)) and interface = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2347 lexer lexbuf) : (Parsetree.signature)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2849 lexer lexbuf) : (Parsetree.signature)) and implementation = fun lexer lexbuf -> @@ -71833,59 +204958,59 @@ module Incremental = struct let use_file = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2439 initial_position) : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2941 initial_position) : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint) and toplevel_phrase = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2411 initial_position) : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2913 initial_position) : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint) and parse_val_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2405 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2907 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_pattern = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2401 initial_position) : (Parsetree.pattern) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2903 initial_position) : (Parsetree.pattern) MenhirInterpreter.checkpoint) and parse_mty_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2397 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2899 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_module_type = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2393 initial_position) : (Parsetree.module_type) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2895 initial_position) : (Parsetree.module_type) MenhirInterpreter.checkpoint) and parse_module_expr = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2389 initial_position) : (Parsetree.module_expr) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2891 initial_position) : (Parsetree.module_expr) MenhirInterpreter.checkpoint) and parse_mod_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2385 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2887 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_mod_ext_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2381 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2883 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_expression = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2377 initial_position) : (Parsetree.expression) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2879 initial_position) : (Parsetree.expression) MenhirInterpreter.checkpoint) and parse_core_type = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2373 initial_position) : (Parsetree.core_type) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2875 initial_position) : (Parsetree.core_type) MenhirInterpreter.checkpoint) and parse_constr_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2369 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2871 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_any_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2351 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2853 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and interface = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2347 initial_position) : (Parsetree.signature) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2849 initial_position) : (Parsetree.signature) MenhirInterpreter.checkpoint) and implementation = fun initial_position -> @@ -71893,12 +205018,41 @@ module Incremental = struct end -# 4764 "parsing/parser.mly" +<<<<<<< HEAD +# 5047 "parsing/parser.mly" + + +# 104064 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 5051 "parsing/parser.mly" +||||||| 04da777f7 +# 5044 "parsing/parser.mly" +======= +# 5035 "parsing/parser.mly" +>>>>>>> origin/main -# 71900 "parsing/parser.ml" +<<<<<<< HEAD +# 104717 "parsing/parser.ml" +||||||| 04da777f7 +# 104704 "parsing/parser.ml" +======= +# 104715 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main # 269 "" -# 71905 "parsing/parser.ml" +<<<<<<< HEAD +# 104069 "parsing/parser.ml" +======= +<<<<<<< HEAD +# 104722 "parsing/parser.ml" +||||||| 04da777f7 +# 104709 "parsing/parser.ml" +======= +# 104720 "parsing/parser.ml" +>>>>>>> origin/main +>>>>>>> upstream/main diff --git a/boot/menhir/parser.mli b/boot/menhir/parser.mli index a8131c304cf..0ebda9a5ce6 100644 --- a/boot/menhir/parser.mli +++ b/boot/menhir/parser.mli @@ -46,6 +46,7 @@ type token = | NEW | MUTABLE | MODULE + | MOD | MINUSGREATER | MINUSDOT | MINUS @@ -72,6 +73,8 @@ type token = | LBRACE | LAZY | LABEL of (string) + | KIND_OF + | KIND_ABBREV | INT of (string * char option) | INITIALIZER | INHERIT @@ -129,6 +132,8 @@ type token = | BAR | BANG | BACKQUOTE + | ATAT + | AT | ASSERT | AS | ANDOP of (string) diff --git a/boot/ocamlc b/boot/ocamlc index a985930b313..4801c0f4b44 100755 Binary files a/boot/ocamlc and b/boot/ocamlc differ diff --git a/boot/ocamllex b/boot/ocamllex index ba4dd62a955..57a8e2876bc 100755 Binary files a/boot/ocamllex and b/boot/ocamllex differ diff --git a/build-aux/ocaml_version.m4 b/build-aux/ocaml_version.m4 index 5c26fabbef5..d7dfbbf3910 100644 --- a/build-aux/ocaml_version.m4 +++ b/build-aux/ocaml_version.m4 @@ -36,7 +36,7 @@ m4_define([OCAML__VERSION_MINOR], [1]) m4_define([OCAML__VERSION_PATCHLEVEL], [1]) # Note that the OCAML__VERSION_EXTRA string defined below is always empty # for officially-released versions of OCaml. -m4_define([OCAML__VERSION_EXTRA], [jst-runtime4]) +m4_define([OCAML__VERSION_EXTRA], [jst]) # The OCAML__VERSION_EXTRA_PREFIX macro defined below should be a # single character: diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index 98e8ecf6840..bbb6f7dc736 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -18,7 +18,6 @@ open Misc open Asttypes open Primitive -open Types open Lambda open Switch open Instruct @@ -111,41 +110,59 @@ let rec is_tailcall = function let preserve_tailcall_for_prim = function Popaque _ | Psequor | Psequand | Pobj_magic _ - | Prunstack | Pperform | Presume | Preperform -> + | Prunstack | Pperform | Presume | Preperform + | Pbox_float (_, _) | Punbox_float _ + | Pbox_int _ | Punbox_int _ -> true | Pbytes_to_string | Pbytes_of_string | Parray_to_iarray | Parray_of_iarray | Pget_header _ | Pignore | Pgetglobal _ | Psetglobal _ | Pgetpredef _ - | Pmakeblock _ | Pmakefloatblock _ | Pmakeufloatblock _ + | Pmakeblock _ | Pmakefloatblock _ | Pmakeufloatblock _ | Pmakemixedblock _ | Pfield _ | Pfield_computed _ | Psetfield _ | Psetfield_computed _ | Pfloatfield _ | Psetfloatfield _ | Pduprecord _ - | Pufloatfield _ | Psetufloatfield _ + | Pufloatfield _ | Psetufloatfield _ | Pmixedfield _ | Psetmixedfield _ | Pmake_unboxed_product _ | Punboxed_product_field _ | Pccall _ | Praise _ | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pdivint _ | Pmodint _ | Pandint | Porint | Pxorint | Plslint | Plsrint - | Pasrint | Pintcomp _ | Poffsetint _ | Poffsetref _ | Pintoffloat - | Pfloatofint _ | Pnegfloat _ | Pabsfloat _ | Paddfloat _ | Psubfloat _ | Pmulfloat _ - | Punbox_float | Pbox_float _ | Punbox_int _ | Pbox_int _ - | Pdivfloat _ | Pfloatcomp _ | Pstringlength | Pstringrefu | Pstringrefs - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ + | Pasrint | Pintcomp _ | Poffsetint _ | Poffsetref _ | Pintoffloat _ + | Pfloatofint (_, _) | Pfloatoffloat32 _ | Pfloat32offloat _ + | Pnegfloat (_, _) | Pabsfloat (_, _) + | Paddfloat (_, _) | Psubfloat (_, _) | Pmulfloat (_, _) + | Pdivfloat (_, _) | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) + | Pstringlength | Pstringrefu | Pstringrefs + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets | Pmakearray _ | Pduparray _ | Parraylength _ | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ | Pisint _ | Pisout | Pbintofint _ | Pintofbint _ | Pcvtbint _ | Pnegbint _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ - | Pasrbint _ | Pbintcomp _ | Pbigarrayref _ | Pbigarrayset _ | Pbigarraydim _ - | Pstring_load_16 _ | Pstring_load_32 _ | Pstring_load_64 _ | Pstring_load_128 _ - | Pbytes_load_16 _ | Pbytes_load_32 _ | Pbytes_load_64 _ | Pbytes_load_128 _ - | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_64 _ | Pbytes_set_128 _ - | Pbigstring_load_16 _ | Pbigstring_load_32 _ | Pbigstring_load_64 _ - | Pbigstring_load_128 _ | Pbigstring_set_16 _ | Pbigstring_set_32 _ + | Pasrbint _ | Pbintcomp _ | Punboxed_int_comp _ + | Pbigarrayref _ | Pbigarrayset _ | Pbigarraydim _ + | Pstring_load_16 _ | Pstring_load_32 _ | Pstring_load_f32 _ + | Pstring_load_64 _ | Pstring_load_128 _ + | Pbytes_load_16 _ | Pbytes_load_32 _ | Pbytes_load_f32 _ + | Pbytes_load_64 _ | Pbytes_load_128 _ + | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_f32 _ + | Pbytes_set_64 _ | Pbytes_set_128 _ + | Pbigstring_load_16 _ | Pbigstring_load_32 _ | Pbigstring_load_f32 _ + | Pbigstring_load_64 _ | Pbigstring_load_128 _ + | Pbigstring_set_16 _ | Pbigstring_set_32 _ | Pbigstring_set_f32 _ + | Pfloatarray_load_128 _ | Pfloat_array_load_128 _ | Pint_array_load_128 _ + | Punboxed_float_array_load_128 _ | Punboxed_float32_array_load_128 _ + | Punboxed_int32_array_load_128 _ | Punboxed_int64_array_load_128 _ + | Punboxed_nativeint_array_load_128 _ + | Pfloatarray_set_128 _ | Pfloat_array_set_128 _ | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _ | Punboxed_float32_array_set_128 _ + | Punboxed_int32_array_set_128 _ | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ | Pbigstring_set_64 _ | Pbigstring_set_128 _ | Pprobe_is_enabled _ | Pobj_dup | Pctconst _ | Pbswap16 | Pbbswap _ | Pint_as_pointer _ | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Patomic_load _ - | Pdls_get -> + | Pdls_get | Preinterpret_tagged_int63_as_unboxed_int64 + | Preinterpret_unboxed_int64_as_tagged_int63 -> false (* Add a Kpop N instruction in front of a continuation *) @@ -169,81 +186,6 @@ let rec push_dummies n k = match n with | _ -> Kconst const_unit::Kpush::push_dummies (n-1) k -(**** Auxiliary for compiling "let rec" ****) - -type rhs_kind = - | RHS_block of int - | RHS_infix of { blocksize : int; offset : int } - | RHS_floatblock of int - | RHS_nonrec - | RHS_function of int * int - -let rec check_recordwith_updates id e = - match e with - | Lsequence (Lprim ((Psetfield _ | Psetfloatfield _), [Lvar id2; _], _), cont) - -> id2 = id && check_recordwith_updates id cont - | Lvar id2 -> id2 = id - | _ -> false - -let rec size_of_lambda env = function - | Lvar id -> - begin try Ident.find_same id env with Not_found -> RHS_nonrec end - | Lfunction{params} as funct -> - RHS_function (2 + Ident.Set.cardinal(free_variables funct), - List.length params) - | Llet (Strict, _k, id, Lprim (Pduprecord (kind, size), _, _), body) - when check_recordwith_updates id body -> - begin match kind with - | Record_boxed _ | Record_inlined (_, Variant_boxed _) -> RHS_block size - | Record_unboxed | Record_inlined (_, Variant_unboxed) -> assert false - | Record_float | Record_ufloat -> RHS_floatblock size - | Record_inlined (_, Variant_extensible) -> RHS_block (size + 1) - end - | Llet(_str, _k, id, arg, body) -> - size_of_lambda (Ident.add id (size_of_lambda env arg) env) body - (* See the Lletrec case of comp_expr *) - | Lletrec(bindings, body) when - List.for_all (function (_, Lfunction _) -> true | _ -> false) bindings -> - (* let rec of functions *) - let fv = - Ident.Set.elements (free_variables (Lletrec(bindings, lambda_unit))) in - (* See Instruct(CLOSUREREC) in interp.c *) - let blocksize = List.length bindings * 3 - 1 + List.length fv in - let offsets = List.mapi (fun i (id, _e) -> (id, i * 3)) bindings in - let env = List.fold_right (fun (id, offset) env -> - Ident.add id (RHS_infix { blocksize; offset }) env) offsets env in - size_of_lambda env body - | Lletrec(bindings, body) -> - let env = List.fold_right - (fun (id, e) env -> Ident.add id (size_of_lambda env e) env) - bindings env - in - size_of_lambda env body - | Lprim(Pmakeblock _, args, _) -> RHS_block (List.length args) - | Lprim (Pmakearray ((Paddrarray|Pintarray), _, _), args, _) -> - RHS_block (List.length args) - | Lprim (Pmakearray (Pfloatarray, _, _), args, _) - | Lprim (Pmakefloatblock _, args, _) -> - RHS_floatblock (List.length args) - | Lprim (Pmakearray (Pgenarray, _, _), _, _) -> - (* Pgenarray is excluded from recursive bindings by the - check in Translcore.check_recursive_lambda *) - RHS_nonrec - | Lprim (Pduprecord ((Record_boxed _ | Record_inlined (_, Variant_boxed _)), - size), _, _) -> - RHS_block size - | Lprim (Pduprecord ((Record_unboxed - | Record_inlined (_, Variant_unboxed)), - _), _, _) -> - assert false - | Lprim (Pduprecord (Record_inlined (_, Variant_extensible), size), _, _) -> - RHS_block (size + 1) - | Lprim (Pduprecord (Record_float, size), _, _) -> RHS_floatblock size - | Levent (lam, _) -> size_of_lambda env lam - | Lsequence (_lam, lam') -> size_of_lambda env lam' - | Lregion (lam, _) -> size_of_lambda env lam - | _ -> RHS_nonrec - (**** Merging consecutive events ****) let copy_event ev kind info repr = @@ -415,6 +357,16 @@ let comp_bint_primitive bi suff args = | Pint64 -> "caml_int64_" in Kccall(pref ^ suff, List.length args) +let array_primitive (index_kind : Lambda.array_index_kind) prefix = + let suffix = + match index_kind with + | Ptagged_int_index -> "" + | Punboxed_int_index Pint64 -> "_indexed_by_int64" + | Punboxed_int_index Pint32 -> "_indexed_by_int32" + | Punboxed_int_index Pnativeint -> "_indexed_by_nativeint" + in + prefix ^ suffix + let comp_primitive stack_info p sz args = check_stack stack_info sz; match p with @@ -425,7 +377,8 @@ let comp_primitive stack_info p sz args = | Pgetpredef id -> Kgetglobal id | Pintcomp cmp -> Kintcomp cmp | Pcompare_ints -> Kccall("caml_int_compare", 2) - | Pcompare_floats -> Kccall("caml_float_compare", 2) + | Pcompare_floats Pfloat64 -> Kccall("caml_float_compare", 2) + | Pcompare_floats Pfloat32 -> Kccall("caml_float32_compare", 2) | Pcompare_bints bi -> comp_bint_primitive bi "compare" args | Pfield (n, _ptr, _sem) -> Kgetfield n | Pfield_computed _sem -> Kgetvectitem @@ -437,6 +390,17 @@ let comp_primitive stack_info p sz args = instructions for the ufloat primitives. *) | Pufloatfield (n, _sem) -> Kgetfloatfield n | Psetufloatfield (n, _init) -> Ksetfloatfield n + | Pmixedfield (n, _, _, _sem) -> + (* CR layouts: This will need reworking if we ever want bytecode + to unbox fields that are written with unboxed types in the source + language. *) + (* Note, non-value mixed fields are always boxed in bytecode; they + aren't stored flat like they are in native code. + *) + Kgetfield n + | Psetmixedfield (n, _, _shape, _init) -> + (* See the comment in the [Pmixedfield] case. *) + Ksetfield n | Pduprecord _ -> Kccall("caml_obj_dup", 1) | Pccall p -> Kccall(p.prim_name, p.prim_arity) | Pperform -> @@ -456,14 +420,24 @@ let comp_primitive stack_info p sz args = | Pasrint -> Kasrint | Poffsetint n -> Koffsetint n | Poffsetref n -> Koffsetref n - | Pintoffloat -> Kccall("caml_int_of_float", 1) - | Pfloatofint _ -> Kccall("caml_float_of_int", 1) - | Pnegfloat _ -> Kccall("caml_neg_float", 1) - | Pabsfloat _ -> Kccall("caml_abs_float", 1) - | Paddfloat _ -> Kccall("caml_add_float", 2) - | Psubfloat _ -> Kccall("caml_sub_float", 2) - | Pmulfloat _ -> Kccall("caml_mul_float", 2) - | Pdivfloat _ -> Kccall("caml_div_float", 2) + | Pintoffloat Pfloat64 -> Kccall("caml_int_of_float", 1) + | Pfloatofint (Pfloat64, _) -> Kccall("caml_float_of_int", 1) + | Pfloatoffloat32 _ -> Kccall("caml_float_of_float32", 1) + | Pfloat32offloat _ -> Kccall("caml_float32_of_float", 1) + | Pnegfloat (Pfloat64, _) -> Kccall("caml_neg_float", 1) + | Pabsfloat (Pfloat64, _) -> Kccall("caml_abs_float", 1) + | Paddfloat (Pfloat64, _) -> Kccall("caml_add_float", 2) + | Psubfloat (Pfloat64, _) -> Kccall("caml_sub_float", 2) + | Pmulfloat (Pfloat64, _) -> Kccall("caml_mul_float", 2) + | Pdivfloat (Pfloat64, _) -> Kccall("caml_div_float", 2) + | Pintoffloat Pfloat32 -> Kccall("caml_int_of_float32", 1) + | Pfloatofint (Pfloat32, _) -> Kccall("caml_float32_of_int", 1) + | Pnegfloat (Pfloat32, _) -> Kccall("caml_neg_float32", 1) + | Pabsfloat (Pfloat32, _) -> Kccall("caml_abs_float32", 1) + | Paddfloat (Pfloat32, _) -> Kccall("caml_add_float32", 2) + | Psubfloat (Pfloat32, _) -> Kccall("caml_sub_float32", 2) + | Pmulfloat (Pfloat32, _) -> Kccall("caml_mul_float32", 2) + | Pdivfloat (Pfloat32, _) -> Kccall("caml_div_float32", 2) | Pstringlength -> Kccall("caml_ml_string_length", 1) | Pbyteslength -> Kccall("caml_ml_bytes_length", 1) | Pstringrefs -> Kccall("caml_string_get", 2) @@ -474,31 +448,59 @@ let comp_primitive stack_info p sz args = | Pbytessetu -> Ksetbyteschar | Pstring_load_16(_) -> Kccall("caml_string_get16", 2) | Pstring_load_32(_) -> Kccall("caml_string_get32", 2) + | Pstring_load_f32(_) -> Kccall("caml_string_getf32", 2) | Pstring_load_64(_) -> Kccall("caml_string_get64", 2) | Pbytes_set_16(_) -> Kccall("caml_bytes_set16", 3) | Pbytes_set_32(_) -> Kccall("caml_bytes_set32", 3) + | Pbytes_set_f32(_) -> Kccall("caml_bytes_setf32", 3) | Pbytes_set_64(_) -> Kccall("caml_bytes_set64", 3) | Pbytes_load_16(_) -> Kccall("caml_bytes_get16", 2) | Pbytes_load_32(_) -> Kccall("caml_bytes_get32", 2) + | Pbytes_load_f32(_) -> Kccall("caml_bytes_getf32", 2) | Pbytes_load_64(_) -> Kccall("caml_bytes_get64", 2) | Parraylength _ -> Kvectlength (* In bytecode, nothing is ever actually stack-allocated, so we ignore the array modes (allocation for [Parrayref{s,u}], modification for [Parrayset{s,u}]). *) - | Parrayrefs (Pgenarray_ref _) -> Kccall("caml_array_get", 2) - | Parrayrefs (Pfloatarray_ref _) -> Kccall("caml_floatarray_get", 2) - | Parrayrefs (Paddrarray_ref | Pintarray_ref) -> + | Parrayrefs (Pgenarray_ref _, index_kind) + | Parrayrefs ((Paddrarray_ref | Pintarray_ref | Pfloatarray_ref _ + | Punboxedfloatarray_ref (Pfloat64 | Pfloat32) | Punboxedintarray_ref _), + (Punboxed_int_index _ as index_kind)) -> + Kccall(array_primitive index_kind "caml_array_get", 2) + | Parrayrefs ((Punboxedfloatarray_ref Pfloat64 | Pfloatarray_ref _), Ptagged_int_index) -> + Kccall("caml_floatarray_get", 2) + | Parrayrefs ((Punboxedfloatarray_ref Pfloat32 | Punboxedintarray_ref _ + | Paddrarray_ref | Pintarray_ref), Ptagged_int_index) -> Kccall("caml_array_get_addr", 2) - | Parraysets (Pgenarray_set _) -> Kccall("caml_array_set", 3) - | Parraysets Pfloatarray_set -> Kccall("caml_floatarray_set", 3) - | Parraysets (Paddrarray_set _ | Pintarray_set) -> - Kccall("caml_array_set_addr", 3) - | Parrayrefu (Pgenarray_ref _) -> Kccall("caml_array_unsafe_get", 2) - | Parrayrefu (Pfloatarray_ref _) -> Kccall("caml_floatarray_unsafe_get", 2) - | Parrayrefu (Paddrarray_ref | Pintarray_ref) -> Kgetvectitem - | Parraysetu (Pgenarray_set _) -> Kccall("caml_array_unsafe_set", 3) - | Parraysetu Pfloatarray_set -> Kccall("caml_floatarray_unsafe_set", 3) - | Parraysetu (Paddrarray_set _ | Pintarray_set) -> Ksetvectitem + | Parraysets (Pgenarray_set _, index_kind) + | Parraysets ((Paddrarray_set _ | Pintarray_set | Pfloatarray_set + | Punboxedfloatarray_set (Pfloat64 | Pfloat32) | Punboxedintarray_set _), + (Punboxed_int_index _ as index_kind)) -> + Kccall(array_primitive index_kind "caml_array_set", 3) + | Parraysets ((Punboxedfloatarray_set Pfloat64 | Pfloatarray_set), + Ptagged_int_index) -> + Kccall("caml_floatarray_set", 3) + | Parraysets ((Punboxedfloatarray_set Pfloat32 | Punboxedintarray_set _ + | Paddrarray_set _ | Pintarray_set), Ptagged_int_index) -> + Kccall("caml_array_set_addr", 3) + | Parrayrefu (Pgenarray_ref _, index_kind) + | Parrayrefu ((Paddrarray_ref | Pintarray_ref | Pfloatarray_ref _ + | Punboxedfloatarray_ref (Pfloat64 | Pfloat32) | Punboxedintarray_ref _), + (Punboxed_int_index _ as index_kind)) -> + Kccall(array_primitive index_kind "caml_array_unsafe_get", 2) + | Parrayrefu ((Punboxedfloatarray_ref Pfloat64 | Pfloatarray_ref _), Ptagged_int_index) -> + Kccall("caml_floatarray_unsafe_get", 2) + | Parrayrefu ((Punboxedfloatarray_ref Pfloat32 | Punboxedintarray_ref _ + | Paddrarray_ref | Pintarray_ref), Ptagged_int_index) -> Kgetvectitem + | Parraysetu (Pgenarray_set _, index_kind) + | Parraysetu ((Paddrarray_set _ | Pintarray_set | Pfloatarray_set + | Punboxedfloatarray_set (Pfloat64 | Pfloat32) | Punboxedintarray_set _), + (Punboxed_int_index _ as index_kind)) -> + Kccall(array_primitive index_kind "caml_array_unsafe_set", 3) + | Parraysetu ((Punboxedfloatarray_set Pfloat64 | Pfloatarray_set), Ptagged_int_index) -> + Kccall("caml_floatarray_unsafe_set", 3) + | Parraysetu ((Punboxedfloatarray_set Pfloat32 | Punboxedintarray_set _ + | Paddrarray_set _ | Pintarray_set), Ptagged_int_index) -> Ksetvectitem | Pctconst c -> let const_name = match c with | Big_endian -> "big_endian" @@ -508,7 +510,8 @@ let comp_primitive stack_info p sz args = | Ostype_unix -> "ostype_unix" | Ostype_win32 -> "ostype_win32" | Ostype_cygwin -> "ostype_cygwin" - | Backend_type -> "backend_type" in + | Backend_type -> "backend_type" + | Runtime5 -> "runtime5" in Kccall(Printf.sprintf "caml_sys_const_%s" const_name, 1) | Pisint _ -> Kisint | Pisout -> Kisout @@ -537,20 +540,24 @@ let comp_primitive stack_info p sz args = | Plslbint(bi,_) -> comp_bint_primitive bi "shift_left" args | Plsrbint(bi,_) -> comp_bint_primitive bi "shift_right_unsigned" args | Pasrbint(bi,_) -> comp_bint_primitive bi "shift_right" args - | Pbintcomp(_, Ceq) -> Kccall("caml_equal", 2) - | Pbintcomp(_, Cne) -> Kccall("caml_notequal", 2) - | Pbintcomp(_, Clt) -> Kccall("caml_lessthan", 2) - | Pbintcomp(_, Cgt) -> Kccall("caml_greaterthan", 2) - | Pbintcomp(_, Cle) -> Kccall("caml_lessequal", 2) - | Pbintcomp(_, Cge) -> Kccall("caml_greaterequal", 2) + | Pbintcomp(_, Ceq) | Punboxed_int_comp(_, Ceq) -> Kccall("caml_equal", 2) + | Pbintcomp(_, Cne) | Punboxed_int_comp(_, Cne) -> Kccall("caml_notequal", 2) + | Pbintcomp(_, Clt) | Punboxed_int_comp(_, Clt) -> Kccall("caml_lessthan", 2) + | Pbintcomp(_, Cgt) | Punboxed_int_comp(_, Cgt) -> Kccall("caml_greaterthan", 2) + | Pbintcomp(_, Cle) | Punboxed_int_comp(_, Cle) -> Kccall("caml_lessequal", 2) + | Pbintcomp(_, Cge) | Punboxed_int_comp(_, Cge) -> Kccall("caml_greaterequal", 2) + | Pbigarrayref(_, n, Pbigarray_float32_t, _) -> Kccall("caml_ba_float32_get_" ^ Int.to_string n, n + 1) + | Pbigarrayset(_, n, Pbigarray_float32_t, _) -> Kccall("caml_ba_float32_set_" ^ Int.to_string n, n + 2) | Pbigarrayref(_, n, _, _) -> Kccall("caml_ba_get_" ^ Int.to_string n, n + 1) | Pbigarrayset(_, n, _, _) -> Kccall("caml_ba_set_" ^ Int.to_string n, n + 2) | Pbigarraydim(n) -> Kccall("caml_ba_dim_" ^ Int.to_string n, 1) | Pbigstring_load_16(_) -> Kccall("caml_ba_uint8_get16", 2) | Pbigstring_load_32(_) -> Kccall("caml_ba_uint8_get32", 2) + | Pbigstring_load_f32(_) -> Kccall("caml_ba_uint8_getf32", 2) | Pbigstring_load_64(_) -> Kccall("caml_ba_uint8_get64", 2) | Pbigstring_set_16(_) -> Kccall("caml_ba_uint8_set16", 3) | Pbigstring_set_32(_) -> Kccall("caml_ba_uint8_set32", 3) + | Pbigstring_set_f32(_) -> Kccall("caml_ba_uint8_setf32", 3) | Pbigstring_set_64(_) -> Kccall("caml_ba_uint8_set64", 3) | Pbswap16 -> Kccall("caml_bswap16", 1) | Pbbswap(bi,_) -> comp_bint_primitive bi "bswap" args @@ -567,8 +574,30 @@ let comp_primitive stack_info p sz args = | Patomic_fetch_add -> Kccall("caml_atomic_fetch_add", 2) | Pdls_get -> Kccall("caml_domain_dls_get", 1) | Pstring_load_128 _ | Pbytes_load_128 _ | Pbytes_set_128 _ - | Pbigstring_load_128 _ | Pbigstring_set_128 _ -> + | Pbigstring_load_128 _ | Pbigstring_set_128 _ + | Pfloatarray_load_128 _ | Pfloat_array_load_128 _ | Pint_array_load_128 _ + | Punboxed_float_array_load_128 _ | Punboxed_float32_array_load_128 _ + | Punboxed_int32_array_load_128 _ | Punboxed_int64_array_load_128 _ + | Punboxed_nativeint_array_load_128 _ + | Pfloatarray_set_128 _ | Pfloat_array_set_128 _ | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _ | Punboxed_float32_array_set_128 _ + | Punboxed_int32_array_set_128 _ | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ -> fatal_error "128-bit load/store is not supported in bytecode mode." + | Preinterpret_tagged_int63_as_unboxed_int64 -> + if not (Target_system.is_64_bit ()) + then + Misc.fatal_error + "Preinterpret_tagged_int63_as_unboxed_int64 can only be used on 64-bit \ + targets"; + Kccall("caml_reinterpret_tagged_int63_as_unboxed_int64", 1) + | Preinterpret_unboxed_int64_as_tagged_int63 -> + if not (Target_system.is_64_bit ()) + then + Misc.fatal_error + "Preinterpret_unboxed_int64_as_tagged_int63 can only be used on 64-bit \ + targets"; + Kccall("caml_reinterpret_unboxed_int64_as_tagged_int63", 1) (* The cases below are handled in [comp_expr] before the [comp_primitive] call (in the order in which they appear below), so they should never be reached in this function. *) @@ -577,12 +606,13 @@ let comp_primitive stack_info p sz args = | Pnot | Psequand | Psequor | Praise _ | Pmakearray _ | Pduparray _ - | Pfloatcomp _ + | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) | Pmakeblock _ | Pmakefloatblock _ | Pmakeufloatblock _ + | Pmakemixedblock _ | Pprobe_is_enabled _ - | Punbox_float | Pbox_float _ | Punbox_int _ | Pbox_int _ + | Punbox_float _ | Pbox_float (_, _) | Punbox_int _ | Pbox_int _ | Pmake_unboxed_product _ | Punboxed_product_field _ -> fatal_error "Bytegen.comp_primitive" @@ -685,83 +715,30 @@ let rec comp_expr stack_info env exp sz cont = (add_pop 1 cont)) | Lletrec(decl, body) -> let ndecl = List.length decl in - if List.for_all (function (_, Lfunction _) -> true | _ -> false) - decl then begin - (* let rec of functions *) - let fv = - Ident.Set.elements (free_variables (Lletrec(decl, lambda_unit))) in - let rec_idents = List.map (fun (id, _lam) -> id) decl in - let rec comp_fun pos = function - [] -> [] - | (_id, Lfunction{params; body}) :: rem -> - let lbl = new_label() in - let to_compile = - { params = List.map (fun p -> p.name) params; body = body; label = lbl; - free_vars = fv; num_defs = ndecl; rec_vars = rec_idents; - rec_pos = pos} in - Stack.push to_compile functions_to_compile; - lbl :: comp_fun (pos + 1) rem - | _ -> assert false in - let lbls = comp_fun 0 decl in - comp_args stack_info env (List.map (fun n -> Lvar n) fv) sz - (Kclosurerec(lbls, List.length fv) :: - (comp_expr stack_info - (add_vars rec_idents (sz+1) env) body (sz + ndecl) - (add_pop ndecl cont))) - end else begin - let decl_size = - List.map (fun (id, exp) -> (id, exp, size_of_lambda Ident.empty exp)) - decl in - let rec comp_init new_env sz = function - | [] -> comp_nonrec new_env sz ndecl decl_size - | (id, _exp, RHS_floatblock blocksize) :: rem -> - Kconst(Const_base(Const_int blocksize)) :: - Kccall("caml_alloc_dummy_float", 1) :: Kpush :: - comp_init (add_var id (sz+1) new_env) (sz+1) rem - | (id, _exp, RHS_block blocksize) :: rem -> - Kconst(Const_base(Const_int blocksize)) :: - Kccall("caml_alloc_dummy", 1) :: Kpush :: - comp_init (add_var id (sz+1) new_env) (sz+1) rem - | (id, _exp, RHS_infix { blocksize; offset }) :: rem -> - Kconst(Const_base(Const_int offset)) :: - Kpush :: - Kconst(Const_base(Const_int blocksize)) :: - Kccall("caml_alloc_dummy_infix", 2) :: Kpush :: - comp_init (add_var id (sz+1) new_env) (sz+1) rem - | (id, _exp, RHS_function (blocksize,arity)) :: rem -> - Kconst(Const_base(Const_int arity)) :: - Kpush :: - Kconst(Const_base(Const_int blocksize)) :: - Kccall("caml_alloc_dummy_function", 2) :: Kpush :: - comp_init (add_var id (sz+1) new_env) (sz+1) rem - | (id, _exp, RHS_nonrec) :: rem -> - Kconst(Const_base(Const_int 0)) :: Kpush :: - comp_init (add_var id (sz+1) new_env) (sz+1) rem - and comp_nonrec new_env sz i = function - | [] -> comp_rec new_env sz ndecl decl_size - | (_id, _exp, (RHS_block _ | RHS_infix _ | - RHS_floatblock _ | RHS_function _)) - :: rem -> - comp_nonrec new_env sz (i-1) rem - | (_id, exp, RHS_nonrec) :: rem -> - comp_expr stack_info new_env exp sz - (Kassign (i-1) :: comp_nonrec new_env sz (i-1) rem) - and comp_rec new_env sz i = function - | [] -> comp_expr stack_info new_env body sz (add_pop ndecl cont) - | (_id, exp, (RHS_block _ | RHS_infix _ | - RHS_floatblock _ | RHS_function _)) - :: rem -> - comp_expr stack_info new_env exp sz - (Kpush :: Kacc i :: Kccall("caml_update_dummy", 2) :: - comp_rec new_env sz (i-1) rem) - | (_id, _exp, RHS_nonrec) :: rem -> - comp_rec new_env sz (i-1) rem - in - comp_init env sz decl_size - end + let fv = + Ident.Set.elements (free_variables (Lletrec(decl, lambda_unit))) in + let rec_idents = List.map (fun { id } -> id) decl in + let rec comp_fun pos = function + [] -> [] + | { def = {params; body} } :: rem -> + let lbl = new_label() in + let to_compile = + { params = List.map (fun p -> p.name) params; body = body; label = lbl; + free_vars = fv; num_defs = ndecl; rec_vars = rec_idents; + rec_pos = pos} in + Stack.push to_compile functions_to_compile; + lbl :: comp_fun (pos + 1) rem + in + let lbls = comp_fun 0 decl in + comp_args stack_info env (List.map (fun n -> Lvar n) fv) sz + (Kclosurerec(lbls, List.length fv) :: + (comp_expr stack_info + (add_vars rec_idents (sz+1) env) body (sz + ndecl) + (add_pop ndecl cont))) | Lprim((Popaque _ | Pobj_magic _), [arg], _) -> comp_expr stack_info env arg sz cont - | Lprim((Pbox_float _ | Punbox_float), [arg], _) -> + | Lprim((Pbox_float ((Pfloat64 | Pfloat32), _) + | Punbox_float (Pfloat64 | Pfloat32)), [arg], _) -> comp_expr stack_info env arg sz cont | Lprim((Pbox_int _ | Punbox_int _), [arg], _) -> comp_expr stack_info env arg sz cont @@ -822,13 +799,26 @@ let rec comp_expr stack_info env exp sz cont = let cont = add_pseudo_event loc !compunit_name cont in comp_args stack_info env args sz (Kmakefloatblock (List.length args) :: cont) + | Lprim(Pmakemixedblock (tag, _, shape, _), args, loc) -> + (* There is no notion of a mixed block at runtime in bytecode. Further, + source-level unboxed types are represented as boxed in bytecode, so + no ceremony is needed to box values before inserting them into + the (normal, unmixed) block. + *) + let total_len = shape.value_prefix_len + Array.length shape.flat_suffix in + let cont = add_pseudo_event loc !compunit_name cont in + comp_args stack_info env args sz + (Kmake_faux_mixedblock (total_len, tag) :: cont) | Lprim(Pmakearray (kind, _, _), args, loc) -> let cont = add_pseudo_event loc !compunit_name cont in begin match kind with - Pintarray | Paddrarray -> + (* arrays of unboxed types have the same representation + as the boxed ones on bytecode *) + | Pintarray | Paddrarray | Punboxedintarray _ + | Punboxedfloatarray Pfloat32 -> comp_args stack_info env args sz (Kmakeblock(List.length args, 0) :: cont) - | Pfloatarray -> + | Pfloatarray | Punboxedfloatarray Pfloat64 -> comp_args stack_info env args sz (Kmakefloatblock(List.length args) :: cont) | Pgenarray -> @@ -864,7 +854,7 @@ let rec comp_expr stack_info env exp sz cont = (Lprim (Pmakearray (kind, mutability, m), args, loc)) sz cont | Lprim (Pduparray _, [arg], loc) -> let prim_obj_dup = - Primitive.simple_on_values ~name:"caml_obj_dup" ~arity:1 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_obj_dup" ~arity:1 ~alloc:true in comp_expr stack_info env (Lprim (Pccall prim_obj_dup, [arg], loc)) sz cont | Lprim (Pduparray _, _, _) -> @@ -876,7 +866,7 @@ let rec comp_expr stack_info env exp sz cont = let nargs = List.length args - 1 in comp_args stack_info env args sz (comp_primitive stack_info p (sz + nargs - 1) args :: cont) - | Lprim (Pfloatcomp cmp, args, _) -> + | Lprim (Pfloatcomp (Pfloat64, cmp), args, _) | Lprim (Punboxed_float_comp (Pfloat64, cmp), args, _) -> let cont = match cmp with | CFeq -> Kccall("caml_eq_float", 2) :: cont @@ -891,6 +881,21 @@ let rec comp_expr stack_info env exp sz cont = | CFnge -> Kccall("caml_ge_float", 2) :: Kboolnot :: cont in comp_args stack_info env args sz cont + | Lprim (Pfloatcomp (Pfloat32, cmp), args, _) | Lprim (Punboxed_float_comp (Pfloat32, cmp), args, _) -> + let cont = + match cmp with + | CFeq -> Kccall("caml_eq_float32", 2) :: cont + | CFneq -> Kccall("caml_neq_float32", 2) :: cont + | CFlt -> Kccall("caml_lt_float32", 2) :: cont + | CFnlt -> Kccall("caml_lt_float32", 2) :: Kboolnot :: cont + | CFgt -> Kccall("caml_gt_float32", 2) :: cont + | CFngt -> Kccall("caml_gt_float32", 2) :: Kboolnot :: cont + | CFle -> Kccall("caml_le_float32", 2) :: cont + | CFnle -> Kccall("caml_le_float32", 2) :: Kboolnot :: cont + | CFge -> Kccall("caml_ge_float32", 2) :: cont + | CFnge -> Kccall("caml_ge_float32", 2) :: Kboolnot :: cont + in + comp_args stack_info env args sz cont | Lprim(Pmakeblock(tag, _mut, _, _), args, loc) -> let cont = add_pseudo_event loc !compunit_name cont in comp_args stack_info env args sz @@ -902,7 +907,7 @@ let rec comp_expr stack_info env exp sz cont = let nargs = List.length args - 1 in comp_args stack_info env args sz (comp_primitive stack_info p (sz + nargs - 1) args :: cont) - | Lstaticcatch (body, (i, vars) , handler, _) -> + | Lstaticcatch (body, (i, vars) , handler, _, _) -> let vars = List.map fst vars in let nvars = List.length vars in let branch1, cont1 = make_branch cont in @@ -1232,3 +1237,4 @@ let compile_phrase expr = let init_code = comp_block empty_env expr 1 [Kreturn 1] in let fun_code = comp_remainder [] in (init_code, fun_code)) + diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 09c7a7ebe3e..aeb54199fb3 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -184,7 +184,7 @@ let scan_file obj_name tolink = (* Consistency check between interfaces *) -module Consistbl = Consistbl.Make (CU.Name) (Compilation_unit) +module Consistbl = Consistbl.Make (CU.Name) (Import_info.Intf.Nonalias.Kind) let crc_interfaces = Consistbl.create () let interfaces = ref ([] : CU.Name.t list) @@ -200,12 +200,12 @@ let check_consistency file_name cu = Array.iter (fun import -> let name = Import_info.name import in - let crco = Import_info.crc_with_unit import in + let info = Import_info.Intf.info import in interfaces := name :: !interfaces; - match crco with + match info with None -> () - | Some (full_name, crc) -> - Consistbl.check crc_interfaces name full_name crc file_name) + | Some (kind, crc) -> + Consistbl.check crc_interfaces name kind crc file_name) cu.cu_imports with Consistbl.Inconsistency { unit_name = name; @@ -220,7 +220,7 @@ let check_consistency file_name cu = let extract_crc_interfaces () = Consistbl.extract !interfaces crc_interfaces |> List.map (fun (name, crc_with_unit) -> - Import_info.create name ~crc_with_unit) + Import_info.Intf.create name crc_with_unit) let clear_crc_interfaces () = Consistbl.clear crc_interfaces; @@ -376,7 +376,7 @@ let link_bytecode ?final_name tolink exec_name standalone = if check_dlls then begin (* Initialize the DLL machinery *) Dll.init_compile !Clflags.no_std_include; - Dll.add_path (Load_path.get_paths ()); + Dll.add_path (Load_path.get_path_list ()); try Dll.open_dlls Dll.For_checking sharedobjs with Failure reason -> raise(Error(Cannot_open_dll reason)) end; diff --git a/bytecomp/dll.ml b/bytecomp/dll.ml index 019805d2f97..d7ada8fc89c 100644 --- a/bytecomp/dll.ml +++ b/bytecomp/dll.ml @@ -19,11 +19,7 @@ type dll_handle type dll_address type dll_mode = For_checking | For_execution -(* BACKPORT BEGIN -external dll_open: string -> dll_handle = "caml_dynlink_open_lib" -*) external dll_open: dll_mode -> string -> dll_handle = "caml_dynlink_open_lib" -(* BACKPORT END *) external dll_close: dll_handle -> unit = "caml_dynlink_close_lib" external dll_sym: dll_handle -> string -> dll_address = "caml_dynlink_lookup_symbol" @@ -85,11 +81,7 @@ let open_dll mode name = failwith (fullname ^ ": " ^ Binutils.error_to_string err) end | (None | Some (Checking _) as current), For_execution -> -(* BACKPORT BEGIN - begin match dll_open fullname with -*) begin match dll_open For_execution fullname with -(* BACKPORT END *) | dll -> let opened = match current with | None -> List.remove_assoc fullname !opened_dlls diff --git a/bytecomp/dune b/bytecomp/dune index 6a689c33306..c49ce942cf7 100644 --- a/bytecomp/dune +++ b/bytecomp/dune @@ -15,7 +15,7 @@ (rule (targets opcodes.ml) (mode fallback) - (deps (:instr (file ../runtime4/caml/instruct.h))) + (deps (:instr (file ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml/instruct.h))) (action (bash "%{dep:../tools/make_opcodes.exe} -opcodes < %{instr} > %{targets}"))) diff --git a/bytecomp/emitcode.ml b/bytecomp/emitcode.ml index 622b8f0c4ca..a4dac8c1b2e 100644 --- a/bytecomp/emitcode.ml +++ b/bytecomp/emitcode.ml @@ -17,7 +17,6 @@ open Config open Misc -open Asttypes open Lambda open Instruct open Opcodes @@ -206,6 +205,10 @@ and emit_branch_comp = function | Clt -> out opBLTINT | Cle -> out opBLEINT | Cgt -> out opBGTINT | Cge -> out opBGEINT +let runtime5_only () = + if not Config.runtime5 then + Misc.fatal_error "Effect primitives are only supported on runtime5" + let emit_instr = function Klabel lbl -> define_label lbl | Kacc n -> @@ -258,6 +261,9 @@ let emit_instr = function if t = 0 then out opATOM0 else (out opATOM; out_int t) else if n < 4 then (out(opMAKEBLOCK1 + n - 1); out_int t) else (out opMAKEBLOCK; out_int n; out_int t) + | Kmake_faux_mixedblock(n, t) -> + assert (n > 0); + out opMAKE_FAUX_MIXEDBLOCK; out_int n; out_int t | Kgetfield n -> if n < 4 then out(opGETFIELD0 + n) else (out opGETFIELD; out_int n) | Ksetfield n -> @@ -309,17 +315,11 @@ let emit_instr = function | Kgetpubmet tag -> out opGETPUBMET; out_int tag; out_int 0 | Kgetdynmet -> out opGETDYNMET | Kevent ev -> record_event ev - (* CR mshinwell: enable for effects support - | Kperform -> out opPERFORM - | Kresume -> out opRESUME - | Kresumeterm n -> out opRESUMETERM; out_int n - | Kreperformterm n -> out opREPERFORMTERM; out_int n - | Kstop -> out opSTOP *) - | Kperform - | Kresume - | Kresumeterm _ - | Kreperformterm _ - | Kstop -> Misc.fatal_error "No effects support provided yet" + | Kperform -> runtime5_only (); out opPERFORM + | Kresume -> runtime5_only (); out opRESUME + | Kresumeterm n -> runtime5_only (); out opRESUMETERM; out_int n + | Kreperformterm n -> runtime5_only (); out opREPERFORMTERM; out_int n + | Kstop -> out opSTOP (* Emission of a list of instructions. Include some peephole optimization. *) @@ -422,7 +422,8 @@ let to_file outchan unit_name objfile ~required_globals code = (Filename.dirname (Location.absolute_path objfile)) !debug_dirs; let p = pos_out outchan in - (* CR mshinwell: Compression not supported in the OCaml 4 runtime + (* CR ocaml 5 compressed-marshal mshinwell: + Compression not supported in the OCaml 4 runtime Marshal.(to_channel outchan !events [Compression]); Marshal.(to_channel outchan (String.Set.elements !debug_dirs) [Compression]); diff --git a/bytecomp/instruct.ml b/bytecomp/instruct.ml index 0770a9dfc4f..45467230075 100644 --- a/bytecomp/instruct.ml +++ b/bytecomp/instruct.ml @@ -70,6 +70,7 @@ type instruction = | Ksetglobal of Ident.t | Kconst of structured_constant | Kmakeblock of int * int (* size, tag *) + | Kmake_faux_mixedblock of int * int (* size, tag *) | Kmakefloatblock of int | Kgetfield of int | Ksetfield of int diff --git a/bytecomp/instruct.mli b/bytecomp/instruct.mli index 2a7bc5e60cf..9ea9dc106b3 100644 --- a/bytecomp/instruct.mli +++ b/bytecomp/instruct.mli @@ -78,6 +78,12 @@ type instruction = | Ksetglobal of Ident.t | Kconst of structured_constant | Kmakeblock of int * int (* size, tag *) + | Kmake_faux_mixedblock of int * int (* size, tag *) + (* A "faux" mixed block is not actually represented as a mixed block at + runtime. It just has the top header byte sent to a sentinel value so + bytecode knows that the block can't be marshaled to native code, where + mixed records are represented as true mixed blocks. + *) | Kmakefloatblock of int | Kgetfield of int | Ksetfield of int diff --git a/bytecomp/printinstr.ml b/bytecomp/printinstr.ml index 564252373c8..4685ebcfd8f 100644 --- a/bytecomp/printinstr.ml +++ b/bytecomp/printinstr.ml @@ -46,6 +46,8 @@ let instruction ppf = function fprintf ppf "@[<10>\tconst@ %a@]" Printlambda.structured_constant cst | Kmakeblock(n, m) -> fprintf ppf "\tmakeblock %i, %i" n m + | Kmake_faux_mixedblock(n, m) -> + fprintf ppf "\tmake_faux_mixedblock %i, %i" n m | Kmakefloatblock(n) -> fprintf ppf "\tmakefloatblock %i" n | Kgetfield n -> fprintf ppf "\tgetfield %i" n diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index 8577eb4743f..805191623bb 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -18,7 +18,6 @@ (* To assign numbers to globals and primitives *) open Misc -open Asttypes open Lambda open Cmo_format @@ -145,14 +144,24 @@ let output_primitive_table outchan = (* Translate structured constants *) +(* We cannot use the [float32] type in the compiler, so we represent it as an + opaque [Obj.t]. This is sufficient for interfacing with the runtime. *) +external float32_of_string : string -> Obj.t = "caml_float32_of_string" + let rec transl_const = function Const_base(Const_int i) -> Obj.repr i | Const_base(Const_char c) -> Obj.repr c | Const_base(Const_string (s, _, _)) -> Obj.repr s - | Const_base(Const_float f) -> Obj.repr (float_of_string f) - | Const_base(Const_int32 i) -> Obj.repr i - | Const_base(Const_int64 i) -> Obj.repr i - | Const_base(Const_nativeint i) -> Obj.repr i + | Const_base(Const_float32 f) + | Const_base(Const_unboxed_float32 f) -> float32_of_string f + | Const_base(Const_float f) + | Const_base(Const_unboxed_float f) -> Obj.repr (float_of_string f) + | Const_base(Const_int32 i) + | Const_base(Const_unboxed_int32 i) -> Obj.repr i + | Const_base(Const_int64 i) + | Const_base(Const_unboxed_int64 i) -> Obj.repr i + | Const_base(Const_nativeint i) + | Const_base(Const_unboxed_nativeint i) -> Obj.repr i | Const_immstring s -> Obj.repr s | Const_block(tag, fields) -> let block = Obj.new_block tag (List.length fields) in @@ -161,6 +170,12 @@ let rec transl_const = function in List.iteri transl_field fields; block + | Const_mixed_block _ -> + (* CR layouts v5.9: Support constant mixed blocks in bytecode, either by + dynamically allocating them once at top-level, or by supporting + marshaling into the cmo format for mixed blocks in bytecode. + *) + Misc.fatal_error "[Const_mixed_block] not supported in bytecode." | Const_float_block fields | Const_float_array fields -> let res = Array.Floatarray.create (List.length fields) in List.iteri (fun i f -> Array.Floatarray.set res i (float_of_string f)) diff --git a/compilerlibs/Makefile.compilerlibs b/compilerlibs/Makefile.compilerlibs index b9d59740bd6..f1c725881c9 100644 --- a/compilerlibs/Makefile.compilerlibs +++ b/compilerlibs/Makefile.compilerlibs @@ -25,6 +25,7 @@ # that they are consistent with the interface digests in the archives. UTILS = \ + utils/runtimetags.cmo \ utils/config.cmo \ utils/build_path_prefix_map.cmo \ utils/misc.cmo \ @@ -32,8 +33,9 @@ UTILS = \ utils/numbers.cmo \ utils/arg_helper.cmo \ utils/local_store.cmo \ - utils/load_path.cmo \ + utils/zero_alloc_annotations.cmo \ utils/clflags.cmo \ + utils/load_path.cmo \ utils/debug.cmo \ utils/language_extension_kernel.cmo \ utils/language_extension.cmo \ @@ -52,6 +54,7 @@ UTILS = \ utils/compilation_unit.cmo utils/linkage_name.cmo utils/symbol.cmo \ utils/import_info.cmo \ utils/lazy_backtrack.cmo \ + utils/zero_alloc_utils.cmo \ utils/diffing.cmo \ utils/diffing_with_keys.cmo UTILS_CMI = \ @@ -77,24 +80,27 @@ PARSING = \ parsing/depend.cmo PARSING_CMI = \ parsing/asttypes.cmi \ - parsing/jane_asttypes.cmi \ parsing/parsetree.cmi TYPING = \ + typing/solver.cmo \ typing/path.cmo \ - typing/jkind.cmo \ + typing/mode.cmo \ + typing/jkind_types.cmo \ typing/primitive.cmo \ typing/shape.cmo \ - typing/mode.cmo \ + typing/zero_alloc.cmo \ typing/types.cmo \ typing/btype.cmo \ typing/oprint.cmo \ + typing/jkind.cmo \ typing/subst.cmo \ typing/predef.cmo \ typing/datarepr.cmo \ file_formats/cmi_format.cmo \ typing/persistent_env.cmo \ typing/env.cmo \ + typing/shape_reduce.cmo \ typing/errortrace.cmo \ typing/typedtree.cmo \ typing/signature_group.cmo \ @@ -114,6 +120,7 @@ TYPING = \ typing/untypeast.cmo \ typing/includemod.cmo \ typing/includemod_errorprinter.cmo \ + typing/typemode.cmo \ typing/typetexp.cmo \ typing/printpat.cmo \ typing/patterns.cmo \ @@ -125,18 +132,20 @@ TYPING = \ typing/typedecl.cmo \ typing/typeopt.cmo \ typing/uniqueness_analysis.cmo \ - typing/rec_check.cmo \ + typing/value_rec_check.cmo \ typing/typecore.cmo \ typing/typeclass.cmo \ typing/typemod.cmo TYPING_CMI = \ typing/annot.cmi \ + typing/value_rec_types.cmi \ typing/outcometree.cmi LAMBDA = \ lambda/printlambda.cmo \ lambda/switch.cmo \ lambda/matching.cmo \ + lambda/value_rec_compiler.cmo \ lambda/translmode.cmo \ lambda/transl_comprehension_utils.cmo \ lambda/transl_array_comprehension.cmo \ @@ -432,7 +441,7 @@ beforedepend:: utils/config_main.mli utils/config_boot.mli $(addprefix compilerlibs/,\ ocamlcommon.cma ocamlbytecomp.cma ocamloptcomp.cma ocamlmiddleend.cma \ ocamltoplevel.cma): \ - CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims runtime/primitives + CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims $(RUNTIME_DIR)/primitives compilerlibs/ocamlcommon.cma: $(COMMON_CMI) $(ALL_CONFIG_CMO) $(COMMON) $(V_LINKC)$(CAMLC) -a -linkall -o $@ $(COMMON) diff --git a/configure b/configure index 365e099f826..c9f6968474a 100755 --- a/configure +++ b/configure @@ -1,11 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for OCaml 5.1.1+jst-runtime4. +# Generated by GNU Autoconf 2.72 for OCaml 5.1.1+jst. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # @@ -17,7 +17,6 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -26,12 +25,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop - case `(set -o) 2>/dev/null` in #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -103,7 +103,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -133,15 +133,14 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. +# out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="as_nop=: -if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 + as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: @@ -149,12 +148,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else \$as_nop - case \`(set -o) 2>/dev/null\` in #( +else case e in #( + e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi " @@ -172,8 +172,9 @@ as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : -else \$as_nop - exitcode=1; echo positional parameters were not saved. +else case e in #( + e) exitcode=1; echo positional parameters were not saved. ;; +esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) @@ -195,14 +196,15 @@ test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes -else $as_nop - as_have_required=no +else case e in #( + e) as_have_required=no ;; +esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do @@ -235,12 +237,13 @@ IFS=$as_save_IFS if $as_found then : -else $as_nop - if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +else case e in #( + e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes -fi +fi ;; +esac fi @@ -262,7 +265,7 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. +# out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi @@ -282,7 +285,8 @@ $0: manually run the script under such a shell if you do $0: have one." fi exit 1 -fi +fi ;; +esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} @@ -321,14 +325,6 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -397,11 +393,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -415,21 +412,14 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac fi # as_fn_arith -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -503,6 +493,8 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits /[$]LINENO/= ' <$as_myself | sed ' + t clear + :clear s/[$]LINENO.*/&-/ t lineno b @@ -551,7 +543,6 @@ esac as_echo='printf %s\n' as_echo_n='printf %s' - rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -563,9 +554,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -590,10 +581,12 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated SHELL=${CONFIG_SHELL-/bin/sh} @@ -621,8 +614,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='OCaml' PACKAGE_TARNAME='ocaml' -PACKAGE_VERSION='5.1.1+jst-runtime4' -PACKAGE_STRING='OCaml 5.1.1+jst-runtime4' +PACKAGE_VERSION='5.1.1+jst' +PACKAGE_STRING='OCaml 5.1.1+jst' PACKAGE_BUGREPORT='caml-list@inria.fr' PACKAGE_URL='http://www.ocaml.org' @@ -751,6 +744,10 @@ flambda2 flambda cpp_mangling frame_pointers +no_partial_inlining_cflags +custom_ops_struct_size +profinfo_width +profinfo reserved_header_bits install_ocamlnat install_source_artifacts @@ -783,6 +780,7 @@ ocamltest_unix_impl ocamltest_libunix ocamltest_CPP lib_unix +lib_systhreads_path lib_systhreads lib_str lib_runtime_events @@ -857,6 +855,9 @@ VERSION default_build_target native_compiler CONFIGURE_ARGS +enable_stack_checks +runtime_suffix +enable_runtime5 target_alias host_alias build_alias @@ -899,6 +900,8 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_runtime5 +enable_stack_checks with_dune enable_debug_runtime enable_debugger @@ -929,7 +932,6 @@ enable_flambda_invariants enable_flambda2 enable_cmm_invariants with_target_bindir -enable_reserved_header_bits enable_stdlib_manpages enable_warn_error enable_force_safe_string @@ -1074,7 +1076,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1100,7 +1102,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1313,7 +1315,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1329,7 +1331,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1359,8 +1361,8 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" + -*) as_fn_error $? "unrecognized option: '$ac_option' +Try '$0 --help' for more information" ;; *=*) @@ -1368,7 +1370,7 @@ Try \`$0 --help' for more information" # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1418,7 +1420,7 @@ do as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done -# There might be people who depend on the old broken behavior: `$host' +# There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias @@ -1486,7 +1488,7 @@ if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` @@ -1514,7 +1516,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures OCaml 5.1.1+jst-runtime4 to adapt to many kinds of systems. +'configure' configures OCaml 5.1.1+jst to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1528,11 +1530,11 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages + -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' + -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] + --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @@ -1540,10 +1542,10 @@ Installation directories: --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. +By default, 'make install' will install all the files in +'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify +an installation prefix other than '$ac_default_prefix' using '--prefix', +for instance '--prefix=\$HOME'. For better control, use the options below. @@ -1581,7 +1583,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of OCaml 5.1.1+jst-runtime4:";; + short | recursive ) echo "Configuration of OCaml 5.1.1+jst:";; esac cat <<\_ACEOF @@ -1589,6 +1591,8 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-runtime5 Use the OCaml 5 runtime + --enable-stack_checks Enable stack checks --disable-debug-runtime do not build runtime with debugging support --enable-debugger build the debugger [default=auto] --disable-dependency-generation @@ -1623,12 +1627,9 @@ Optional Features: enable invariants checks in flambda --enable-flambda2 enable the Flambda 2 middle end --enable-cmm-invariants enable invariants checks in Cmm - --enable-reserved-header-bits=BITS - reserve BITS (between 0 and 31) bits in block - headers --disable-stdlib-manpages do not build or install the library man pages - --enable-warn-error treat C compiler warnings as errors + --disable-warn-error do not treat C compiler warnings as errors --disable-flat-float-array do not use flat float arrays --disable-function-sections @@ -1683,7 +1684,7 @@ Some influential environment variables: User-defined run-time library search path. CPP C preprocessor -Use these variables to override the choices made by `configure' or to help +Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . @@ -1751,10 +1752,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -OCaml configure 5.1.1+jst-runtime4 -generated by GNU Autoconf 2.71 +OCaml configure 5.1.1+jst +generated by GNU Autoconf 2.72 -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1793,11 +1794,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } && test -s conftest.$ac_objext then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1835,11 +1837,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would @@ -1863,8 +1866,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> @@ -1872,10 +1875,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1895,15 +1900,15 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. */ + which can conflict with char $2 (void); below. */ #include #undef $2 @@ -1914,7 +1919,7 @@ else $as_nop #ifdef __cplusplus extern "C" #endif -char $2 (); +char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ @@ -1933,11 +1938,13 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1973,11 +1980,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -2014,12 +2022,13 @@ printf "%s\n" "$ac_try_echo"; } >&5 test $ac_status = 0; }; } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: program exited with status $ac_status" >&5 +else case e in #( + e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=$ac_status + ac_retval=$ac_status ;; +esac fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno @@ -2039,8 +2048,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @@ -2070,12 +2079,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - eval "$3=yes" +else case e in #( + e) eval "$3=yes" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -2129,18 +2140,19 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid; break -else $as_nop - as_fn_arith $ac_mid + 1 && ac_lo=$as_val +else case e in #( + e) as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int @@ -2175,20 +2187,23 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=$ac_mid; break -else $as_nop - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val +else case e in #( + e) as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else $as_nop - ac_lo= ac_hi= +else case e in #( + e) ac_lo= ac_hi= ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. @@ -2211,8 +2226,9 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid -else $as_nop - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +else case e in #( + e) as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done @@ -2260,8 +2276,9 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : echo >>conftest.val; read $3 &6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` +else case e in #( + e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` eval ac_save_FLAGS=\$$6 as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2311,12 +2328,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS - + ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -2337,8 +2356,8 @@ printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -2354,8 +2373,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -2371,12 +2390,15 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - eval "$4=no" +else case e in #( + e) eval "$4=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$4 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -2408,8 +2430,8 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by OCaml $as_me 5.1.1+jst-runtime4, which was -generated by GNU Autoconf 2.71. Invocation command line was +It was created by OCaml $as_me 5.1.1+jst, which was +generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -2655,10 +2677,10 @@ esac printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi done @@ -2694,9 +2716,7 @@ struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; +static char *e (char **p, int i) { return p[i]; } @@ -2710,6 +2730,21 @@ static char *f (char * (*g) (char **, int), char **p, ...) return s; } +/* C89 style stringification. */ +#define noexpand_stringify(a) #a +const char *stringified = noexpand_stringify(arbitrary+token=sequence); + +/* C89 style token pasting. Exercises some of the corner cases that + e.g. old MSVC gets wrong, but not very hard. */ +#define noexpand_concat(a,b) a##b +#define expand_concat(a,b) noexpand_concat(a,b) +extern int vA; +extern int vbee; +#define aye A +#define bee B +int *pvA = &expand_concat(v,aye); +int *pvbee = &noexpand_concat(v,bee); + /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated @@ -2737,16 +2772,19 @@ ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' -// Does the compiler advertise C99 conformance? +/* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif +// See if C++-style comments work. + #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); +extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare @@ -2796,7 +2834,6 @@ typedef const char *ccp; static inline int test_restrict (ccp restrict text) { - // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) @@ -2862,6 +2899,8 @@ ac_c_conftest_c99_main=' ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; + // Work around memory leak warnings. + free (ia); // Check named initializers. struct named_init ni = { @@ -2883,7 +2922,7 @@ ac_c_conftest_c99_main=' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' -// Does the compiler advertise C11 conformance? +/* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif @@ -3075,8 +3114,9 @@ IFS=$as_save_IFS if $as_found then : -else $as_nop - as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +else case e in #( + e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; +esac fi @@ -3104,12 +3144,12 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -3118,18 +3158,18 @@ printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. @@ -3145,11 +3185,11 @@ printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## @@ -3164,8 +3204,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 5.1.1+jst-runtime4" >&5 -printf "%s\n" "$as_me: Configuring OCaml version 5.1.1+jst-runtime4" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 5.1.1+jst" >&5 +printf "%s\n" "$as_me: Configuring OCaml version 5.1.1+jst" >&6;} # Configuration variables @@ -3203,7 +3243,10 @@ CSCFLAGS="" ostype="Unix" SO="so" toolchain="cc" -reserved_header_bits=0 +reserved_header_bits=8 +profinfo=true +profinfo_width=8 +custom_ops_struct_size=64 instrumented_runtime=false instrumented_runtime_libs="" bootstrapping_flexdll=false @@ -3211,6 +3254,7 @@ flexdll_dir= lib_dynlink=false lib_str=false lib_systhreads=false +lib_systhreads_path="" lib_unix=false ocamltest_libunix=None ocamltest_unix_impl="dummy" @@ -3226,16 +3270,42 @@ ocamltest_unix_include="" ## Directory containing auxiliary scripts used during build +# Runtime selection + +# Check whether --enable-runtime5 was given. +if test ${enable_runtime5+y} +then : + enableval=$enable_runtime5; +fi + +if test x"$enable_runtime5" = xyes +then : + runtime_suffix= +else case e in #( + e) runtime_suffix=4 ;; +esac +fi + +# Check whether --enable-stack_checks was given. +if test ${enable_stack_checks+y} +then : + enableval=$enable_stack_checks; +fi + + ## Output variables -VERSION=5.1.1+jst-runtime4 + + + +VERSION=5.1.1+jst OCAML_DEVELOPMENT_VERSION=false -OCAML_RELEASE_EXTRA='Some (Plus, "jst-runtime4")' +OCAML_RELEASE_EXTRA='Some (Plus, "jst")' OCAML_VERSION_MAJOR=5 @@ -3243,7 +3313,7 @@ OCAML_VERSION_MINOR=1 OCAML_VERSION_PATCHLEVEL=1 -OCAML_VERSION_EXTRA=jst-runtime4 +OCAML_VERSION_EXTRA=jst OCAML_VERSION_SHORT=5.1 @@ -3320,6 +3390,7 @@ OCAML_VERSION_SHORT=5.1 + # TODO: rename this variable @@ -3370,6 +3441,10 @@ OCAML_VERSION_SHORT=5.1 + + + + @@ -3393,18 +3468,26 @@ ac_config_files="$ac_config_files utils/config.generated.ml" ac_config_files="$ac_config_files tools/eventlog_metadata" -ac_config_headers="$ac_config_headers runtime/caml/m.h" +if test "x$enable_runtime5" = "xyes" +then : + ac_config_headers="$ac_config_headers runtime/caml/m.h" + + ac_config_headers="$ac_config_headers runtime/caml/s.h" -ac_config_headers="$ac_config_headers runtime/caml/s.h" + ac_config_headers="$ac_config_headers runtime/caml/version.h" -ac_config_headers="$ac_config_headers runtime/caml/version.h" -ac_config_headers="$ac_config_headers runtime4/caml/m.h" +else case e in #( + e) ac_config_headers="$ac_config_headers runtime4/caml/m.h" -ac_config_headers="$ac_config_headers runtime4/caml/s.h" + ac_config_headers="$ac_config_headers runtime4/caml/s.h" -ac_config_headers="$ac_config_headers runtime4/caml/version.h" + ac_config_headers="$ac_config_headers runtime4/caml/version.h" + + ;; +esac +fi ac_config_files="$ac_config_files compilerlibs/META" ac_config_files="$ac_config_files otherlibs/dynlink/META" @@ -3421,13 +3504,13 @@ printf "%s\n" "#define OCAML_VERSION_MINOR 1" >>confdefs.h printf "%s\n" "#define OCAML_VERSION_PATCHLEVEL 1" >>confdefs.h -printf "%s\n" "#define OCAML_VERSION_ADDITIONAL \"jst-runtime4\"" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION_ADDITIONAL \"jst\"" >>confdefs.h - printf "%s\n" "#define OCAML_VERSION_EXTRA \"jst-runtime4\"" >>confdefs.h + printf "%s\n" "#define OCAML_VERSION_EXTRA \"jst\"" >>confdefs.h printf "%s\n" "#define OCAML_VERSION 50101" >>confdefs.h -printf "%s\n" "#define OCAML_VERSION_STRING \"5.1.1+jst-runtime4\"" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION_STRING \"5.1.1+jst\"" >>confdefs.h # Works out how many "o"s are needed in quoted strings @@ -3447,15 +3530,16 @@ printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_build_alias=$build_alias +else case e in #( + e) ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } @@ -3482,14 +3566,15 @@ printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 -else $as_nop - if test "x$host_alias" = x; then +else case e in #( + e) if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } @@ -3516,14 +3601,15 @@ printf %s "checking target system type... " >&6; } if test ${ac_cv_target+y} then : printf %s "(cached) " >&6 -else $as_nop - if test "x$target_alias" = x; then +else case e in #( + e) if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5 fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 printf "%s\n" "$ac_cv_target" >&6; } @@ -3612,8 +3698,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_dune+y} then : printf %s "(cached) " >&6 -else $as_nop - case $dune in +else case e in #( + e) case $dune in [\\/]* | ?:[\\/]*) ac_cv_path_dune="$dune" # Let the user override the test with a path. ;; @@ -3638,6 +3724,7 @@ done IFS=$as_save_IFS ;; +esac ;; esac fi dune=$ac_cv_path_dune @@ -3669,8 +3756,9 @@ fi if test ${enable_debugger+y} then : enableval=$enable_debugger; -else $as_nop - enable_debugger=auto +else case e in #( + e) enable_debugger=auto ;; +esac fi @@ -3678,8 +3766,9 @@ fi if test ${enable_dependency_generation+y} then : enableval=$enable_dependency_generation; -else $as_nop - enable_dependency_generation=auto +else case e in #( + e) enable_dependency_generation=auto ;; +esac fi @@ -3689,8 +3778,9 @@ fi if test ${enable_instrumented_runtime+y} then : enableval=$enable_instrumented_runtime; -else $as_nop - enable_instrumented_runtime=auto +else case e in #( + e) enable_instrumented_runtime=auto ;; +esac fi @@ -3749,8 +3839,9 @@ fi if test ${enable_ocamldoc+y} then : enableval=$enable_ocamldoc; -else $as_nop - ocamldoc=auto +else case e in #( + e) ocamldoc=auto ;; +esac fi @@ -3888,18 +3979,6 @@ then : fi -# Check whether --enable-reserved-header-bits was given. -if test ${enable_reserved_header_bits+y} -then : - enableval=$enable_reserved_header_bits; case $enable_reserved_header_bits in #( - [0-9]|[1-2][0-9]|3[0-1]) : - reserved_header_bits=$enable_reserved_header_bits ;; #( - *) : - as_fn_error $? "invalid argument to --enable-reserved-header-bits" "$LINENO" 5 ;; -esac -fi - - # Check whether --enable-stdlib-manpages was given. if test ${enable_stdlib_manpages+y} then : @@ -3943,8 +4022,9 @@ fi if test ${enable_function_sections+y} then : enableval=$enable_function_sections; -else $as_nop - enable_function_sections=auto +else case e in #( + e) enable_function_sections=auto ;; +esac fi @@ -4001,8 +4081,9 @@ then : if test x"$enable_debugger" = "xyes" then : as_fn_error $? "replay debugger requires the unix library" "$LINENO" 5 -else $as_nop - enable_debugger="no" +else case e in #( + e) enable_debugger="no" ;; +esac fi fi @@ -4011,12 +4092,14 @@ then : if test x"$enable_ocamldoc" = "xyes" then : as_fn_error $? "ocamldoc requires the unix and str libraries" "$LINENO" 5 -else $as_nop - enable_ocamldoc="no" - build_ocamltex=false +else case e in #( + e) enable_ocamldoc="no" + build_ocamltex=false ;; +esac fi -else $as_nop - build_ocamltex=true +else case e in #( + e) build_ocamltex=true ;; +esac fi # Initialization of libtool @@ -4032,8 +4115,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$LD"; then +else case e in #( + e) if test -n "$LD"; then ac_cv_prog_LD="$LD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4055,7 +4138,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi LD=$ac_cv_prog_LD if test -n "$LD"; then @@ -4081,8 +4165,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_LD"; then +else case e in #( + e) if test -n "$ac_ct_LD"; then ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4104,7 +4188,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_LD=$ac_cv_prog_ac_ct_LD if test -n "$ac_ct_LD"; then @@ -4260,8 +4345,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4283,7 +4368,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4305,8 +4391,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4328,7 +4414,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4363,8 +4450,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4386,7 +4473,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4408,8 +4496,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -4448,7 +4536,8 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4472,8 +4561,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4495,7 +4584,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4521,8 +4611,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4544,7 +4634,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4582,8 +4673,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4605,7 +4696,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4627,8 +4719,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4650,7 +4742,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4679,10 +4772,10 @@ fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -4754,8 +4847,8 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' + # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. +# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. @@ -4775,7 +4868,7 @@ do ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' + # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. @@ -4786,8 +4879,9 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else $as_nop - ac_file='' +else case e in #( + e) ac_file='' ;; +esac fi if test -z "$ac_file" then : @@ -4796,13 +4890,14 @@ printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } +See 'config.log' for more details" "$LINENO" 5; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } @@ -4826,10 +4921,10 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. + # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) +# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will +# work properly (i.e., refer to 'conftest.exe'), while it won't with +# 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in @@ -4839,11 +4934,12 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -4859,6 +4955,8 @@ int main (void) { FILE *f = fopen ("conftest.out", "w"); + if (!f) + return 1; return ferror (f) || fclose (f) != 0; ; @@ -4898,26 +4996,27 @@ printf "%s\n" "$ac_try_echo"; } >&5 if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } +If you meant to cross compile, use '--host'. +See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +rm -f conftest.$ac_ext conftest$ac_cv_exeext \ + conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4949,16 +5048,18 @@ then : break;; esac done -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext +rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } @@ -4969,8 +5070,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4987,12 +5088,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else $as_nop - ac_compiler_gnu=no +else case e in #( + e) ac_compiler_gnu=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } @@ -5010,8 +5113,8 @@ printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_save_c_werror_flag=$ac_c_werror_flag +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -5029,8 +5132,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else $as_nop - CFLAGS="" +else case e in #( + e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5045,8 +5148,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - ac_c_werror_flag=$ac_save_c_werror_flag +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5063,12 +5166,15 @@ if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } @@ -5095,8 +5201,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c11=no +else case e in #( + e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5113,25 +5219,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c11" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" + CC="$CC $ac_cv_prog_cc_c11" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 + ac_prog_cc_stdc=c11 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -5141,8 +5250,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c99=no +else case e in #( + e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5159,25 +5268,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c99" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" + CC="$CC $ac_cv_prog_cc_c99" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 + ac_prog_cc_stdc=c99 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -5187,8 +5299,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c89=no +else case e in #( + e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5205,25 +5317,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c89" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" + CC="$CC $ac_cv_prog_cc_c89" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 + ac_prog_cc_stdc=c89 ;; +esac fi fi @@ -5238,8 +5353,8 @@ printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ +else case e in #( + e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done @@ -5264,9 +5379,10 @@ do as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in +case `"$ac_path_SED" --version 2>&1` in #( *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5301,7 +5417,8 @@ IFS=$as_save_IFS else ac_cv_path_SED=$SED fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } @@ -5326,8 +5443,8 @@ printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$GREP"; then +else case e in #( + e) if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5346,9 +5463,10 @@ do as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in +case `"$ac_path_GREP" --version 2>&1` in #( *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5383,7 +5501,8 @@ IFS=$as_save_IFS else ac_cv_path_GREP=$GREP fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } @@ -5395,8 +5514,8 @@ printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +else case e in #( + e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then @@ -5418,9 +5537,10 @@ do as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in +case `"$ac_path_EGREP" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5456,20 +5576,23 @@ else ac_cv_path_EGREP=$EGREP fi - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" + EGREP_TRADITIONAL=$EGREP + ac_cv_path_EGREP_TRADITIONAL=$EGREP { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 +else case e in #( + e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then @@ -5491,9 +5614,10 @@ do as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in +case `"$ac_path_FGREP" --version 2>&1` in #( *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5529,7 +5653,8 @@ else ac_cv_path_FGREP=$FGREP fi - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } @@ -5560,8 +5685,9 @@ test -z "$GREP" && GREP=grep if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else $as_nop - with_gnu_ld=no +else case e in #( + e) with_gnu_ld=no ;; +esac fi ac_prog=ld @@ -5606,8 +5732,8 @@ fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$LD"; then +else case e in #( + e) if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs @@ -5630,7 +5756,8 @@ else $as_nop IFS=$lt_save_ifs else lt_cv_path_LD=$LD # Let the user override the test with a path. -fi +fi ;; +esac fi LD=$lt_cv_path_LD @@ -5647,8 +5774,8 @@ printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 -else $as_nop - # I'd rather use --version here, but apparently some GNU lds only accept -v. +else case e in #( + e) # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 @@ -5675,8 +5803,8 @@ printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$NM"; then +else case e in #( + e) if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else @@ -5723,7 +5851,8 @@ else IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } @@ -5744,8 +5873,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DUMPBIN"; then +else case e in #( + e) if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5767,7 +5896,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then @@ -5793,8 +5923,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DUMPBIN"; then +else case e in #( + e) if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5816,7 +5946,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then @@ -5870,8 +6001,8 @@ printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_nm_interface="BSD nm" +else case e in #( + e) lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) @@ -5884,7 +6015,8 @@ else $as_nop if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi - rm -f conftest* + rm -f conftest* ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } @@ -5906,8 +6038,8 @@ printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 -else $as_nop - i=0 +else case e in #( + e) i=0 teststring=ABCD case $build_os in @@ -6029,7 +6161,8 @@ else $as_nop fi ;; esac - + ;; +esac fi if test -n "$lt_cv_sys_max_cmd_len"; then @@ -6086,8 +6219,8 @@ printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - case $host in +else case e in #( + e) case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys @@ -6118,7 +6251,8 @@ else $as_nop lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac - + ;; +esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd @@ -6134,8 +6268,8 @@ printf %s "checking how to convert $build file names to toolchain format... " >& if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - #assume ordinary cross tools, or native build. +else case e in #( + e) #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) @@ -6146,7 +6280,8 @@ case $host in esac ;; esac - + ;; +esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd @@ -6162,8 +6297,9 @@ printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_reload_flag='-r' +else case e in #( + e) lt_cv_ld_reload_flag='-r' ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } @@ -6204,8 +6340,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OBJDUMP"; then +else case e in #( + e) if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6227,7 +6363,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then @@ -6249,8 +6386,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OBJDUMP"; then +else case e in #( + e) if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6272,7 +6409,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then @@ -6313,8 +6451,8 @@ printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_file_magic_cmd='$MAGIC_CMD' +else case e in #( + e) lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support @@ -6507,7 +6645,8 @@ os2*) lt_cv_deplibs_check_method=pass_all ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } @@ -6559,8 +6698,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DLLTOOL"; then +else case e in #( + e) if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6582,7 +6721,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then @@ -6604,8 +6744,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DLLTOOL"; then +else case e in #( + e) if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6627,7 +6767,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then @@ -6669,8 +6810,8 @@ printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_sharedlib_from_linklib_cmd='unknown' +else case e in #( + e) lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) @@ -6690,7 +6831,8 @@ cygwin* | mingw* | pw32* | cegcc*) lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } @@ -6714,8 +6856,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$AR"; then +else case e in #( + e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6737,7 +6879,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then @@ -6763,8 +6906,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_AR"; then +else case e in #( + e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6786,7 +6929,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then @@ -6832,8 +6976,8 @@ printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ar_at_file=no +else case e in #( + e) lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -6870,7 +7014,8 @@ then : fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } @@ -6895,8 +7040,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$STRIP"; then +else case e in #( + e) if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6918,7 +7063,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then @@ -6940,8 +7086,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_STRIP"; then +else case e in #( + e) if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6963,7 +7109,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then @@ -7004,8 +7151,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$RANLIB"; then +else case e in #( + e) if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7027,7 +7174,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then @@ -7049,8 +7197,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_RANLIB"; then +else case e in #( + e) if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7072,7 +7220,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then @@ -7158,8 +7307,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$AWK"; then +else case e in #( + e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7181,7 +7330,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then @@ -7230,8 +7380,8 @@ printf %s "checking command to parse $NM output from $compiler object... " >&6; if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 -else $as_nop - +else case e in #( + e) # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -7486,7 +7636,8 @@ _LT_EOF lt_cv_sys_global_symbol_pipe= fi done - + ;; +esac fi if test -z "$lt_cv_sys_global_symbol_pipe"; then @@ -7550,8 +7701,9 @@ printf %s "checking for sysroot... " >&6; } if test ${with_sysroot+y} then : withval=$with_sysroot; -else $as_nop - with_sysroot=no +else case e in #( + e) with_sysroot=no ;; +esac fi @@ -7586,8 +7738,8 @@ printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 -else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then @@ -7623,7 +7775,8 @@ else ac_cv_path_lt_DD=$lt_DD fi -rm -f conftest.i conftest2.i conftest.out +rm -f conftest.i conftest2.i conftest.out ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } @@ -7634,8 +7787,8 @@ printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 -else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then @@ -7643,7 +7796,8 @@ if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; the && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out -test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -7853,8 +8007,8 @@ printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_ext=c +else case e in #( + e) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -7874,8 +8028,9 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes -else $as_nop - lt_cv_cc_needs_belf=no +else case e in #( + e) lt_cv_cc_needs_belf=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -7884,7 +8039,8 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } @@ -7942,8 +8098,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$MANIFEST_TOOL"; then +else case e in #( + e) if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7965,7 +8121,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then @@ -7987,8 +8144,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_MANIFEST_TOOL"; then +else case e in #( + e) if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8010,7 +8167,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then @@ -8042,15 +8200,16 @@ printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_path_mainfest_tool=no +else case e in #( + e) lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi - rm -f conftest* + rm -f conftest* ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } @@ -8073,8 +8232,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DSYMUTIL"; then +else case e in #( + e) if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8096,7 +8255,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then @@ -8118,8 +8278,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DSYMUTIL"; then +else case e in #( + e) if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8141,7 +8301,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then @@ -8175,8 +8336,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$NMEDIT"; then +else case e in #( + e) if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8198,7 +8359,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then @@ -8220,8 +8382,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_NMEDIT"; then +else case e in #( + e) if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8243,7 +8405,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then @@ -8277,8 +8440,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$LIPO"; then +else case e in #( + e) if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8300,7 +8463,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then @@ -8322,8 +8486,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_LIPO"; then +else case e in #( + e) if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8345,7 +8509,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then @@ -8379,8 +8544,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL"; then +else case e in #( + e) if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8402,7 +8567,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then @@ -8424,8 +8590,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL"; then +else case e in #( + e) if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8447,7 +8613,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then @@ -8481,8 +8648,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL64"; then +else case e in #( + e) if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8504,7 +8671,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then @@ -8526,8 +8694,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL64"; then +else case e in #( + e) if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8549,7 +8717,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then @@ -8606,8 +8775,8 @@ printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_apple_cc_single_mod=no +else case e in #( + e) lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE @@ -8633,7 +8802,8 @@ else $as_nop fi rm -rf libconftest.dylib* rm -f conftest.* - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } @@ -8643,8 +8813,8 @@ printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_exported_symbols_list=no +else case e in #( + e) lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" @@ -8662,13 +8832,15 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes -else $as_nop - lt_cv_ld_exported_symbols_list=no +else case e in #( + e) lt_cv_ld_exported_symbols_list=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } @@ -8678,8 +8850,8 @@ printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_force_load=no +else case e in #( + e) lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF @@ -8704,7 +8876,8 @@ _LT_EOF fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } @@ -8849,8 +9022,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_shared=yes +else case e in #( + e) enable_shared=yes ;; +esac fi @@ -8881,8 +9055,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_static=yes +else case e in #( + e) enable_static=yes ;; +esac fi @@ -8913,8 +9088,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - pic_mode=default +else case e in #( + e) pic_mode=default ;; +esac fi @@ -8944,8 +9120,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_fast_install=yes +else case e in #( + e) enable_fast_install=yes ;; +esac fi @@ -8972,15 +9149,17 @@ then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else $as_nop - if test ${lt_cv_with_aix_soname+y} +else case e in #( + e) if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_with_aix_soname=aix +else case e in #( + e) lt_cv_with_aix_soname=aix ;; +esac fi - with_aix_soname=$lt_cv_with_aix_soname + with_aix_soname=$lt_cv_with_aix_soname ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 @@ -9071,8 +9250,8 @@ printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 -else $as_nop - rm -f .libs 2>/dev/null +else case e in #( + e) rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs @@ -9080,7 +9259,8 @@ else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi -rmdir .libs 2>/dev/null +rmdir .libs 2>/dev/null ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } @@ -9141,8 +9321,8 @@ printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else $as_nop - case $MAGIC_CMD in +else case e in #( + e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -9185,6 +9365,7 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; +esac ;; esac fi @@ -9208,8 +9389,8 @@ printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else $as_nop - case $MAGIC_CMD in +else case e in #( + e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -9252,6 +9433,7 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; +esac ;; esac fi @@ -9351,8 +9533,8 @@ printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_rtti_exceptions=no +else case e in #( + e) lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment @@ -9380,7 +9562,8 @@ else $as_nop fi fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } @@ -9745,8 +9928,9 @@ printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +else case e in #( + e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } @@ -9761,8 +9945,8 @@ printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic_works=no +else case e in #( + e) lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment @@ -9790,7 +9974,8 @@ else $as_nop fi fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } @@ -9826,8 +10011,8 @@ printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_static_works=no +else case e in #( + e) lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -9848,7 +10033,8 @@ else $as_nop fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } @@ -9870,8 +10056,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no +else case e in #( + e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9911,7 +10097,8 @@ else $as_nop cd .. $RM -r conftest $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -9926,8 +10113,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no +else case e in #( + e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9967,7 +10154,8 @@ else $as_nop cd .. $RM -r conftest $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -10564,8 +10752,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10597,7 +10785,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - + ;; +esac fi aix_libpath=$lt_cv_aix_libpath_ @@ -10619,8 +10808,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10652,7 +10841,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - + ;; +esac fi aix_libpath=$lt_cv_aix_libpath_ @@ -10903,8 +11093,8 @@ printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler__b=no +else case e in #( + e) lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -10925,7 +11115,8 @@ else $as_nop fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } @@ -10973,8 +11164,8 @@ printf %s "checking whether the $host_os linker accepts -exported_symbol... " >& if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 -else $as_nop - save_LDFLAGS=$LDFLAGS +else case e in #( + e) save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -10983,12 +11174,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes -else $as_nop - lt_cv_irix_exported_symbol=no +else case e in #( + e) lt_cv_irix_exported_symbol=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS + LDFLAGS=$save_LDFLAGS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } @@ -11314,8 +11507,8 @@ printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 -else $as_nop - $RM conftest* +else case e in #( + e) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 @@ -11351,7 +11544,8 @@ else $as_nop cat conftest.err 1>&5 fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } @@ -12078,8 +12272,8 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_shlibpath_overrides_runpath=no +else case e in #( + e) lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ @@ -12106,7 +12300,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir - + ;; +esac fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath @@ -12543,16 +12738,22 @@ printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12564,24 +12765,27 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - +else case e in #( + e) lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes - + ;; +esac fi ;; @@ -12599,22 +12803,28 @@ fi if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char shl_load (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (void); int main (void) { @@ -12626,39 +12836,47 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes -else $as_nop - ac_cv_lib_dld_shl_load=no +else case e in #( + e) ac_cv_lib_dld_shl_load=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else $as_nop - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +else case e in #( + e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12670,34 +12888,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12709,34 +12935,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes -else $as_nop - ac_cv_lib_svld_dlopen=no +else case e in #( + e) ac_cv_lib_svld_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dld_link (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (void); int main (void) { @@ -12748,12 +12982,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes -else $as_nop - ac_cv_lib_dld_dld_link=no +else case e in #( + e) ac_cv_lib_dld_dld_link=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } @@ -12762,19 +12998,24 @@ then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi ;; @@ -12802,8 +13043,8 @@ printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : +else case e in #( + e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -12897,7 +13138,8 @@ _LT_EOF fi rm -fr conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } @@ -12909,8 +13151,8 @@ printf %s "checking whether a statically linked program can dlopen itself... " > if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : +else case e in #( + e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -13004,7 +13246,8 @@ _LT_EOF fi rm -fr conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } @@ -13176,8 +13419,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DEP_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DEP_CC"; then +else case e in #( + e) if test -n "$DEP_CC"; then ac_cv_prog_DEP_CC="$DEP_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13199,7 +13442,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DEP_CC=$ac_cv_prog_DEP_CC if test -n "$DEP_CC"; then @@ -13225,8 +13469,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DEP_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DEP_CC"; then +else case e in #( + e) if test -n "$ac_ct_DEP_CC"; then ac_cv_prog_ac_ct_DEP_CC="$ac_ct_DEP_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13248,7 +13492,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DEP_CC=$ac_cv_prog_ac_ct_DEP_CC if test -n "$ac_ct_DEP_CC"; then @@ -13285,8 +13530,9 @@ case $enable_dependency_generation in #( if test "$DEP_CC" = "false" then : as_fn_error $? "The MSVC ports cannot generate dependency information. Install gcc (or another CC-like compiler)" "$LINENO" 5 -else $as_nop - compute_deps=true +else case e in #( + e) compute_deps=true ;; +esac fi ;; #( no) : compute_deps=false ;; #( @@ -13296,11 +13542,13 @@ then : if test "$DEP_CC" = "false" then : compute_deps=false -else $as_nop - compute_deps=true +else case e in #( + e) compute_deps=true ;; +esac fi -else $as_nop - compute_deps=false +else case e in #( + e) compute_deps=false ;; +esac fi ;; esac @@ -13319,8 +13567,9 @@ case $host in #( if test "$host_cpu" = "x86_64" then : machine="-machine:AMD64 " -else $as_nop - machine="" +else case e in #( + e) machine="" ;; +esac fi mklib="link -lib -nologo $machine /out:\$(1) \$(2)" ;; #( @@ -13346,8 +13595,8 @@ if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 -else $as_nop - # Double quotes because $CC needs to be expanded +else case e in #( + e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false @@ -13365,9 +13614,10 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else $as_nop - # Broken: fails on valid input. -continue +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -13381,15 +13631,16 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else $as_nop - # Passes both tests. +else case e in #( + e) # Passes both tests. ac_preproc_ok=: -break +break ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : @@ -13398,7 +13649,8 @@ fi done ac_cv_prog_CPP=$CPP - + ;; +esac fi CPP=$ac_cv_prog_CPP else @@ -13421,9 +13673,10 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else $as_nop - # Broken: fails on valid input. -continue +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -13437,24 +13690,26 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else $as_nop - # Passes both tests. +else case e in #( + e) # Passes both tests. ac_preproc_ok=: -break +break ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi ac_ext=c @@ -13494,16 +13749,18 @@ then : if test ${ocaml_cv_cc_vendor+y} then : printf %s "(cached) " >&6 -else $as_nop - ocaml_cv_cc_vendor=`grep '^[a-z]' conftest.i | tr -s ' ' '-' \ - | tr -d '\r'` +else case e in #( + e) ocaml_cv_cc_vendor=`grep '^[a-z]' conftest.i | tr -s ' ' '-' \ + | tr -d '\r'` ;; +esac fi -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "unexpected preprocessor failure -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ocaml_cv_cc_vendor" >&5 @@ -13522,8 +13779,8 @@ then : # autoconf displays a warning if this parameter is missing, but # cross-compilation mode was disabled above. assert=false -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) {return 0;} _ACEOF @@ -13532,13 +13789,15 @@ then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } host_runnable=true -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } - host_runnable=false + host_runnable=false ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi cross_compiling="$old_cross_compiling" @@ -13619,6 +13878,14 @@ case $host in #( esac otherlibraries="dynlink" +lib_dynlink=true + +if test x"$enable_runtime5" = x"yes" +then : + otherlibraries="$otherlibraries runtime_events" + lib_runtime_events=true +fi + if test x"$enable_unix_lib" != "xno" then : enable_unix_lib=yes @@ -13630,8 +13897,9 @@ then : ocamltest_unix_name="unix" ocamltest_unix_path='$(ROOTDIR)/otherlibs/unix' ocamltest_unix_include='-I $(ROOTDIR)/otherlibs/unix ' -else $as_nop - ocamltest_libunix="None" +else case e in #( + e) ocamltest_libunix="None" ;; +esac fi if test x"$enable_str_lib" != "xno" @@ -13651,8 +13919,8 @@ printf %s "checking whether #! works in shell scripts... " >&6; } if test ${ac_cv_sys_interpreter+y} then : printf %s "(cached) " >&6 -else $as_nop - echo '#! /bin/cat +else case e in #( + e) echo '#! /bin/cat exit 69 ' >conftest chmod u+x conftest @@ -13662,7 +13930,8 @@ if test $? -ne 69; then else ac_cv_sys_interpreter=no fi -rm -f conftest +rm -f conftest ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 printf "%s\n" "$ac_cv_sys_interpreter" >&6; } @@ -13693,9 +13962,10 @@ fi ;; esac -else $as_nop - shebangscripts=false - +else case e in #( + e) shebangscripts=false + ;; +esac fi # Are we building a cross-compiler @@ -13703,8 +13973,9 @@ fi if test x"$host" = x"$target" then : cross_compiler=false -else $as_nop - cross_compiler=true +else case e in #( + e) cross_compiler=true ;; +esac fi # Checks for programs @@ -13732,12 +14003,14 @@ case $ocaml_cv_cc_vendor in #( *) : outputobj='-o ' warn_error_flag='-Werror' - cc_warnings="-Wall -Wint-conversion -Wstrict-prototypes \ + cc_warnings="-Wall -Wno-pragmas -Wint-conversion -Wstrict-prototypes \ -Wold-style-definition" ;; esac -case $enable_warn_error,false in #( - yes,*|,true) : +case $enable_warn_error in #( + no) : + ;; #( + *) : cc_warnings="$cc_warnings $warn_error_flag" ;; #( *) : ;; @@ -13802,10 +14075,11 @@ then : cl_has_volatile_metadata=true { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - cl_has_volatile_metadata=false +else case e in #( + e) cl_has_volatile_metadata=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" @@ -13864,8 +14138,9 @@ then : *) : ;; esac -else $as_nop - supports_shared_libraries=true +else case e in #( + e) supports_shared_libraries=true ;; +esac fi # Define flexlink chain and flags correctly for the different Windows ports @@ -13905,8 +14180,8 @@ then : flexdir='' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 printf "%s\n" "disabled" >&6; } -else $as_nop - flexmsg='' +else case e in #( + e) flexmsg='' case $target in #( *-*-cygwin*|*-w64-mingw32*|*-pc-windows) : if test x"$with_flexdll" = 'x' || test x"$with_flexdll" = 'xflexdll' @@ -13916,16 +14191,17 @@ then : flexdir=flexdll iflexdir='$(ROOTDIR)/flexdll' with_flexdll="$iflexdir" -else $as_nop - if test x"$with_flexdll" != 'x' +else case e in #( + e) if test x"$with_flexdll" != 'x' then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 printf "%s\n" "requested but not available" >&6; } as_fn_error $? "exiting" "$LINENO" 5 +fi ;; +esac fi -fi -else $as_nop - rm -rf flexdll-sources +else case e in #( + e) rm -rf flexdll-sources if test -f "$with_flexdll/flexdll.h" then : mkdir -p flexdll-sources @@ -13933,23 +14209,26 @@ then : flexdir='flexdll-sources' iflexdir='$(ROOTDIR)/flexdll-sources' flexmsg=" (from $with_flexdll)" -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 printf "%s\n" "requested but not available" >&6; } - as_fn_error $? "exiting" "$LINENO" 5 -fi + as_fn_error $? "exiting" "$LINENO" 5 ;; +esac +fi ;; +esac fi if test x"$flexdir" = 'x' then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iflexdir$flexmsg" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iflexdir$flexmsg" >&5 printf "%s\n" "$iflexdir$flexmsg" >&6; } bootstrapping_flexdll=true flexdll_dir=\"+flexdll\" # The submodule should be searched *before* any other -I paths - internal_cppflags="-I $iflexdir $internal_cppflags" + internal_cppflags="-I $iflexdir $internal_cppflags" ;; +esac fi ;; #( *) : if test x"$with_flexdll" != 'x' @@ -13958,6 +14237,7 @@ then : printf "%s\n" "requested but not supported" >&6; } as_fn_error $? "exiting" "$LINENO" 5 fi ;; +esac ;; esac fi @@ -13968,8 +14248,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_flexlink+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$flexlink"; then +else case e in #( + e) if test -n "$flexlink"; then ac_cv_prog_flexlink="$flexlink" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13991,7 +14271,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi flexlink=$ac_cv_prog_flexlink if test -n "$flexlink"; then @@ -14053,17 +14334,19 @@ if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } - as_fn_error $? "$flexlink does not work" "$LINENO" 5 + as_fn_error $? "$flexlink does not work" "$LINENO" 5 ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unexpected compile error" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unexpected compile error" >&5 printf "%s\n" "unexpected compile error" >&6; } - as_fn_error $? "error calling the C compiler" "$LINENO" 5 + as_fn_error $? "error calling the C compiler" "$LINENO" 5 ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -14116,8 +14399,9 @@ fi if test "x$ac_cv_header_flexdll_h" = xyes then : have_flexdll_h=yes -else $as_nop - have_flexdll_h=no +else case e in #( + e) have_flexdll_h=no ;; +esac fi if test x"$have_flexdll_h" = 'xno' @@ -14173,9 +14457,10 @@ then : have_flexdll_h=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; +esac fi @@ -14226,8 +14511,9 @@ if $bootstrapping_flexdll then : flexlink_cmd=\ '$(ROOTDIR)/boot/ocamlruns.exe $(ROOTDIR)/boot/flexlink.byte.exe' -else $as_nop - flexlink_cmd=flexlink +else case e in #( + e) flexlink_cmd=flexlink ;; +esac fi case $cc_basename,$host in #( @@ -14246,10 +14532,11 @@ then : mkexe_cmd="${flexlink_cmd} -exe -chain ${flexdll_chain} ${flexlink_flags}" mkexe_cflags='' mkexe_ldflags_prefix='-link ' -else $as_nop - mkexe_extra_flags='' +else case e in #( + e) mkexe_extra_flags='' oc_ldflags='-Wl,--stack,16777216' - + ;; +esac fi ostype="Cygwin" ;; #( *,*-*-mingw32*) : @@ -14314,8 +14601,8 @@ if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -14369,7 +14656,8 @@ esac IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir - + ;; +esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install @@ -14401,15 +14689,21 @@ printf %s "checking for library containing cos... " >&6; } if test ${ac_cv_search_cos+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char cos (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char cos (void); int main (void) { @@ -14440,11 +14734,13 @@ done if test ${ac_cv_search_cos+y} then : -else $as_nop - ac_cv_search_cos=no +else case e in #( + e) ac_cv_search_cos=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cos" >&5 printf "%s\n" "$ac_cv_search_cos" >&6; } @@ -14537,10 +14833,11 @@ ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes then : -else $as_nop - +else case e in #( + e) printf "%s\n" "#define off_t long int" >>confdefs.h - + ;; +esac fi @@ -14550,28 +14847,30 @@ fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 printf %s "checking size of int... " >&6; } if test ${ac_cv_sizeof_int+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default" +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default" then : -else $as_nop - if test "$ac_cv_type_int" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_int" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 printf "%s\n" "$ac_cv_sizeof_int" >&6; } @@ -14583,28 +14882,30 @@ printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 printf %s "checking size of long... " >&6; } if test ${ac_cv_sizeof_long+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default" +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default" then : -else $as_nop - if test "$ac_cv_type_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_long" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 printf "%s\n" "$ac_cv_sizeof_long" >&6; } @@ -14616,28 +14917,30 @@ printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long *" >&5 printf %s "checking size of long *... " >&6; } if test ${ac_cv_sizeof_long_p+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long *))" "ac_cv_sizeof_long_p" "$ac_includes_default" +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long *))" "ac_cv_sizeof_long_p" "$ac_includes_default" then : -else $as_nop - if test "$ac_cv_type_long_p" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_long_p" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long *) -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_p=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_p" >&5 printf "%s\n" "$ac_cv_sizeof_long_p" >&6; } @@ -14649,28 +14952,30 @@ printf "%s\n" "#define SIZEOF_LONG_P $ac_cv_sizeof_long_p" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 printf %s "checking size of short... " >&6; } if test ${ac_cv_sizeof_short+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default" +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default" then : -else $as_nop - if test "$ac_cv_type_short" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_short" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 printf "%s\n" "$ac_cv_sizeof_short" >&6; } @@ -14682,28 +14987,30 @@ printf "%s\n" "#define SIZEOF_SHORT $ac_cv_sizeof_short" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 printf %s "checking size of long long... " >&6; } if test ${ac_cv_sizeof_long_long+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default" +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default" then : -else $as_nop - if test "$ac_cv_type_long_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_long_long" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 printf "%s\n" "$ac_cv_sizeof_long_long" >&6; } @@ -14722,9 +15029,10 @@ then : bits=64; arch64=true printf "%s\n" "#define ARCH_SIXTYFOUR 1" >>confdefs.h -else $as_nop - as_fn_error $? "Neither 32 nor 64 bits architecture." "$LINENO" 5 - +else case e in #( + e) as_fn_error $? "Neither 32 nor 64 bits architecture." "$LINENO" 5 + ;; +esac fi if test "x$ac_cv_sizeof_int" != "x4" && test "x$ac_cv_sizeof_long" != "x4" \ @@ -14754,8 +15062,8 @@ printf %s "checking whether byte ordering is bigendian... " >&6; } if test ${ac_cv_c_bigendian+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_c_bigendian=unknown +else case e in #( + e) ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14801,8 +15109,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext int main (void) { -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\ && LITTLE_ENDIAN) bogus endian macros #endif @@ -14833,8 +15141,9 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes -else $as_nop - ac_cv_c_bigendian=no +else case e in #( + e) ac_cv_c_bigendian=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -14878,8 +15187,9 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes -else $as_nop - ac_cv_c_bigendian=no +else case e in #( + e) ac_cv_c_bigendian=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -14906,22 +15216,23 @@ unsigned short int ascii_mm[] = int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } - extern int foo; - -int -main (void) -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} + int + main (int argc, char **argv) + { + /* Intimidate the compiler so that it does not + optimize the arrays away. */ + char *p = argv[0]; + ascii_mm[1] = *p++; ebcdic_mm[1] = *p++; + ascii_ii[1] = *p++; ebcdic_ii[1] = *p++; + return use_ascii (argc) == use_ebcdic (*p); + } _ACEOF -if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_link "$LINENO" then : - if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + if grep BIGenDianSyS conftest$ac_exeext >/dev/null; then ac_cv_c_bigendian=yes fi - if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if grep LiTTleEnDian conftest$ac_exeext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else @@ -14930,9 +15241,10 @@ then : fi fi fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int @@ -14955,14 +15267,17 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_c_bigendian=no -else $as_nop - ac_cv_c_bigendian=yes +else case e in #( + e) ac_cv_c_bigendian=yes ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 printf "%s\n" "$ac_cv_c_bigendian" >&6; } @@ -14991,22 +15306,24 @@ printf %s "checking alignment of double... " >&6; } if test ${ac_cv_alignof_double+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_double" "$ac_includes_default +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_double" "$ac_includes_default typedef struct { char x; double y; } ac__type_alignof_;" then : -else $as_nop - if test "$ac_cv_type_double" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_double" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of double -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_double=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_double" >&5 printf "%s\n" "$ac_cv_alignof_double" >&6; } @@ -15023,22 +15340,24 @@ printf %s "checking alignment of long... " >&6; } if test ${ac_cv_alignof_long+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long" "$ac_includes_default +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long" "$ac_includes_default typedef struct { char x; long y; } ac__type_alignof_;" then : -else $as_nop - if test "$ac_cv_type_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_long" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of long -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_long=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long" >&5 printf "%s\n" "$ac_cv_alignof_long" >&6; } @@ -15055,22 +15374,24 @@ printf %s "checking alignment of long long... " >&6; } if test ${ac_cv_alignof_long_long+y} then : printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long_long" "$ac_includes_default +else case e in #( + e) if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long_long" "$ac_includes_default typedef struct { char x; long long y; } ac__type_alignof_;" then : -else $as_nop - if test "$ac_cv_type_long_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) if test "$ac_cv_type_long_long" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of long long -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_long_long=0 - fi + fi ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long_long" >&5 printf "%s\n" "$ac_cv_alignof_long_long" >&6; } @@ -15097,13 +15418,14 @@ fi then : printf "%s\n" "#define ARCH_ALIGN_INT64 1" >>confdefs.h -else $as_nop - if test "x$ac_cv_sizeof_long_long" = "x8" && +else case e in #( + e) if test "x$ac_cv_sizeof_long_long" = "x8" && test "$ac_cv_alignof_long_long" -gt 4 then : printf "%s\n" "#define ARCH_ALIGN_INT64 1" >>confdefs.h -fi +fi ;; +esac fi ;; esac @@ -15149,10 +15471,11 @@ then : cc_supports_atomic=true { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - cc_supports_atomic=false +else case e in #( + e) cc_supports_atomic=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -15160,10 +15483,10 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if ! $cc_supports_atomic then : - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C11 atomic support is required, use another C compiler -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi # Full support for C11 __thread variables @@ -15369,10 +15692,11 @@ then : cc_has_fno_tree_vrp=true { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - cc_has_fno_tree_vrp=false +else case e in #( + e) cc_has_fno_tree_vrp=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" @@ -15398,9 +15722,10 @@ then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -15423,9 +15748,10 @@ then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" @@ -15461,8 +15787,9 @@ case $host in #( arch=power; if $arch64 then : model=ppc64 -else $as_nop - model=ppc +else case e in #( + e) model=ppc ;; +esac fi; system=elf ;; #( s390x*-*-linux*) : has_native_backend=yes; arch=s390x; model=z10; system=elf ;; #( @@ -15527,8 +15854,9 @@ fi; system=elf ;; #( if $arch64 then : has_native_backend=yes; arch=arm64; system=linux -else $as_nop - arch=arm; model=armv8; system=linux +else case e in #( + e) arch=arm; model=armv8; system=linux ;; +esac fi ;; #( aarch64-*-freebsd*) : has_native_backend=yes; arch=arm64; system=freebsd ;; #( @@ -15545,6 +15873,21 @@ fi ;; #( ;; esac +# Disabling of stack checks is only supported on amd64. +if test x"$enable_stack_checks" = xyes +then : + printf "%s\n" "#define STACK_CHECKS_ENABLED 1" >>confdefs.h + +else case e in #( + e) if test x"$arch" != xamd64 +then : + enable_stack_checks=yes + printf "%s\n" "#define STACK_CHECKS_ENABLED 1" >>confdefs.h + +fi ;; +esac +fi + native_cflags='' native_cppflags="-DTARGET_${arch} -DMODEL_${model} -DSYS_${system}" @@ -15575,8 +15918,9 @@ esac if $native_compiler then : default_build_target=world.opt -else $as_nop - default_build_target=world +else case e in #( + e) default_build_target=world ;; +esac fi if ! $native_compiler @@ -15587,14 +15931,16 @@ fi if $natdynlink then : cmxs="cmxs" -else $as_nop - cmxs="cmx" +else case e in #( + e) cmxs="cmx" ;; +esac fi if $natdynlink then : natdynlink_archive="dynlink.cmxa" -else $as_nop - natdynlink_archive="" +else case e in #( + e) natdynlink_archive="" ;; +esac fi printf "%s\n" "#define OCAML_OS_TYPE \"$ostype\"" >>confdefs.h @@ -15608,8 +15954,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DIRECT_LD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DIRECT_LD"; then +else case e in #( + e) if test -n "$DIRECT_LD"; then ac_cv_prog_DIRECT_LD="$DIRECT_LD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15631,7 +15977,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DIRECT_LD=$ac_cv_prog_DIRECT_LD if test -n "$DIRECT_LD"; then @@ -15653,8 +16000,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DIRECT_LD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DIRECT_LD"; then +else case e in #( + e) if test -n "$ac_ct_DIRECT_LD"; then ac_cv_prog_ac_ct_DIRECT_LD="$ac_ct_DIRECT_LD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15676,7 +16023,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DIRECT_LD=$ac_cv_prog_ac_ct_DIRECT_LD if test -n "$ac_ct_DIRECT_LD"; then @@ -15713,8 +16061,9 @@ then : if $arch64 then : PACKLD_FLAGS=' -m elf64ppc' -else $as_nop - PACKLD_FLAGS=' -m elf32ppclinux' +else case e in #( + e) PACKLD_FLAGS=' -m elf32ppclinux' ;; +esac fi ;; #( *) : PACKLD_FLAGS='' ;; @@ -15728,11 +16077,13 @@ then : # For the Microsoft C compiler there must be no space at the end of the # string. PACKLD="link -lib -nologo $machine -out:" -else $as_nop - PACKLD="$DIRECT_LD -r$PACKLD_FLAGS -o " +else case e in #( + e) PACKLD="$DIRECT_LD -r$PACKLD_FLAGS -o " ;; +esac fi -else $as_nop - PACKLD="$PARTIALLD -o " +else case e in #( + e) PACKLD="$PARTIALLD -o " ;; +esac fi # Disable PIE at link time when ocamlopt does not produce position-independent @@ -15773,8 +16124,8 @@ printf %s "checking whether C compiler accepts -Wa,-mbranches-within-32B-boundar if test ${ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries+y} then : printf %s "(cached) " >&6 -else $as_nop - +else case e in #( + e) ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS -Wa,-mbranches-within-32B-boundaries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15791,19 +16142,22 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries=yes -else $as_nop - ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries=no +else case e in #( + e) ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$ax_check_save_flags + CFLAGS=$ax_check_save_flags ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&5 printf "%s\n" "$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&6; } if test "x$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" = xyes then : intel_jcc_bug_cflags=-Wa,-mbranches-within-32B-boundaries -else $as_nop - : +else case e in #( + e) : ;; +esac fi ;; #( *) : @@ -15817,17 +16171,19 @@ then : toolpref="${target_alias}-" as_target="$target" as_cpu="$target_cpu" -else $as_nop - if test -n "$host_alias" +else case e in #( + e) if test -n "$host_alias" then : toolpref="${host_alias}-" as_target="$host" as_cpu="$host_cpu" -else $as_nop - toolpref="" +else case e in #( + e) toolpref="" as_target="$build" - as_cpu="$build_cpu" -fi + as_cpu="$build_cpu" ;; +esac +fi ;; +esac fi # Finding the assembler @@ -15871,8 +16227,9 @@ then : internal_cflags="$internal_cflags $sharedlib_cflags" default_aspp="$default_aspp $sharedlib_cflags" -else $as_nop - fpic=false +else case e in #( + e) fpic=false ;; +esac fi if test -z "$AS" @@ -15893,8 +16250,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_rlwrap+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$rlwrap"; then +else case e in #( + e) if test -n "$rlwrap"; then ac_cv_prog_rlwrap="$rlwrap" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15916,7 +16273,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi rlwrap=$ac_cv_prog_rlwrap if test -n "$rlwrap"; then @@ -15947,16 +16305,18 @@ printf "%s\n" "$as_me: checking semantics of signal handlers" >&6;} if test "x$ac_cv_func_sigaction" = xyes then : has_sigaction=true -else $as_nop - has_sigaction=false +else case e in #( + e) has_sigaction=false ;; +esac fi ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask" if test "x$ac_cv_func_sigprocmask" = xyes then : has_sigprocmask=true -else $as_nop - has_sigprocmask=false +else case e in #( + e) has_sigprocmask=false ;; +esac fi if $has_sigaction && $has_sigprocmask @@ -15965,11 +16325,12 @@ then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: POSIX signal handling found." >&5 printf "%s\n" "$as_me: POSIX signal handling found." >&6;} -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: assuming signals have the System V semantics." >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: assuming signals have the System V semantics." >&5 printf "%s\n" "$as_me: assuming signals have the System V semantics." >&6;} - + ;; +esac fi @@ -15979,16 +16340,17 @@ has_c99_float_ops=true for ac_func in expm1 log1p hypot fma exp2 log2 cbrt acosh asinh atanh erf erfc trunc round copysign do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes" then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1 _ACEOF -else $as_nop - has_c99_float_ops=false +else case e in #( + e) has_c99_float_ops=false ;; +esac fi done @@ -16019,8 +16381,8 @@ printf "%s\n" "cross-compiling; assume yes" >&6; } printf "%s\n" "#define HAS_WORKING_ROUND 1" >>confdefs.h ;; esac -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -16036,8 +16398,8 @@ then : printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAS_WORKING_ROUND 1" >>confdefs.h -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } case $enable_imprecise_c99_float_ops,$target in #( no,*) : @@ -16052,13 +16414,16 @@ esac if test x"$hard_error" = "xtrue" then : as_fn_error $? "round does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: round does not work; emulation enabled" >&5 -printf "%s\n" "$as_me: WARNING: round does not work; emulation enabled" >&2;} -fi +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: round does not work; emulation enabled" >&5 +printf "%s\n" "$as_me: WARNING: round does not work; emulation enabled" >&2;} ;; +esac +fi ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi cross_compiling="$old_cross_compiling" @@ -16087,8 +16452,8 @@ printf "%s\n" "cross-compiling; assume yes" >&6; } printf "%s\n" "#define HAS_WORKING_FMA 1" >>confdefs.h ;; esac -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -16126,8 +16491,8 @@ then : printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAS_WORKING_FMA 1" >>confdefs.h -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } case $enable_imprecise_c99_float_ops,$target in #( no,*) : @@ -16142,8 +16507,9 @@ printf "%s\n" "no" >&6; } if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1920 then : hard_error=false -else $as_nop - hard_error=true +else case e in #( + e) hard_error=true ;; +esac fi ;; #( *) : hard_error=true ;; @@ -16152,20 +16518,23 @@ esac if test x"$hard_error" = "xtrue" then : as_fn_error $? "fma does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: fma does not work; emulation enabled" >&5 -printf "%s\n" "$as_me: WARNING: fma does not work; emulation enabled" >&2;} -fi +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: fma does not work; emulation enabled" >&5 +printf "%s\n" "$as_me: WARNING: fma does not work; emulation enabled" >&2;} ;; +esac +fi ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi cross_compiling="$old_cross_compiling" -else $as_nop - if test x"$enable_imprecise_c99_float_ops" != "xyes" +else case e in #( + e) if test x"$enable_imprecise_c99_float_ops" != "xyes" then : case $enable_imprecise_c99_float_ops,$ocaml_cv_cc_vendor in #( no,*) : @@ -16174,8 +16543,9 @@ then : if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1800 then : hard_error=false -else $as_nop - hard_error=true +else case e in #( + e) hard_error=true ;; +esac fi ;; #( *) : hard_error=true ;; @@ -16183,11 +16553,13 @@ esac if test x"$hard_error" = 'xtrue' then : as_fn_error $? "C99 float ops unavailable, enable replacements with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&5 -printf "%s\n" "$as_me: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&2;} -fi +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&5 +printf "%s\n" "$as_me: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&2;} ;; +esac fi +fi ;; +esac fi ## getentropy @@ -16196,8 +16568,8 @@ printf %s "checking for $CC options needed to detect all undeclared functions... if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_save_CFLAGS=$CFLAGS +else case e in #( + e) ac_save_CFLAGS=$CFLAGS ac_cv_c_undeclared_builtin_options='cannot detect' for ac_arg in '' -fno-builtin; do CFLAGS="$ac_save_CFLAGS $ac_arg" @@ -16216,8 +16588,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - # This test program should compile successfully. +else case e in #( + e) # This test program should compile successfully. # No library function is consistently available on # freestanding implementations, so test against a dummy # declaration. Include always-available headers on the @@ -16245,26 +16617,29 @@ then : if test x"$ac_arg" = x then : ac_cv_c_undeclared_builtin_options='none needed' -else $as_nop - ac_cv_c_undeclared_builtin_options=$ac_arg +else case e in #( + e) ac_cv_c_undeclared_builtin_options=$ac_arg ;; +esac fi break fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } case $ac_cv_c_undeclared_builtin_options in #( 'cannot detect') : - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot make $CC report undeclared builtins -See \`config.log' for more details" "$LINENO" 5; } ;; #( +See 'config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : @@ -16312,14 +16687,15 @@ if test "x$ac_cv_func_secure_getenv" = xyes then : printf "%s\n" "#define HAS_SECURE_GETENV 1" >>confdefs.h -else $as_nop - ac_fn_c_check_func "$LINENO" "__secure_getenv" "ac_cv_func___secure_getenv" +else case e in #( + e) ac_fn_c_check_func "$LINENO" "__secure_getenv" "ac_cv_func___secure_getenv" if test "x$ac_cv_func___secure_getenv" = xyes then : printf "%s\n" "#define HAS___SECURE_GETENV 1" >>confdefs.h fi - + ;; +esac fi @@ -16350,20 +16726,21 @@ case $host in #( for ac_func in mach_timebase_info mach_absolute_time do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes" then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1 _ACEOF has_monotonic_clock=true printf "%s\n" "#define HAS_MACH_ABSOLUTE_TIME 1" >>confdefs.h -else $as_nop - has_monotonic_clock=false +else case e in #( + e) has_monotonic_clock=false ;; +esac fi done ;; #( @@ -16390,8 +16767,9 @@ then : printf "%s\n" "#define HAS_POSIX_MONOTONIC_CLOCK 1" >>confdefs.h -else $as_nop - has_monotonic_clock=false +else case e in #( + e) has_monotonic_clock=false ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -16432,15 +16810,21 @@ printf %s "checking for library containing clock_gettime... " >&6; } if test ${ac_cv_search_clock_gettime+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char clock_gettime (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (void); int main (void) { @@ -16471,11 +16855,13 @@ done if test ${ac_cv_search_clock_gettime+y} then : -else $as_nop - ac_cv_search_clock_gettime=no +else case e in #( + e) ac_cv_search_clock_gettime=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } @@ -16484,8 +16870,9 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" has_clock_gettime=true -else $as_nop - has_clock_gettime=false +else case e in #( + e) has_clock_gettime=false ;; +esac fi case $enable_instrumented_runtime,$has_clock_gettime,$has_monotonic_clock in #( @@ -16499,9 +16886,10 @@ fi if test "x$ac_cv_search_clock_gettime" = "xnone required" then : instrumented_runtime_libs="" -else $as_nop - instrumented_runtime_libs=$ac_cv_search_clock_gettime - +else case e in #( + e) instrumented_runtime_libs=$ac_cv_search_clock_gettime + ;; +esac fi ;; #( yes,false,*) : @@ -16537,15 +16925,21 @@ printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char socket (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char socket (void); int main (void) { @@ -16576,11 +16970,13 @@ done if test ${ac_cv_search_socket+y} then : -else $as_nop - ac_cv_search_socket=no +else case e in #( + e) ac_cv_search_socket=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } @@ -16605,15 +17001,21 @@ printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char socket (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char socket (void); int main (void) { @@ -16644,11 +17046,13 @@ done if test ${ac_cv_search_socket+y} then : -else $as_nop - ac_cv_search_socket=no +else case e in #( + e) ac_cv_search_socket=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } @@ -16673,15 +17077,21 @@ printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char socket (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char socket (void); int main (void) { @@ -16712,11 +17122,13 @@ done if test ${ac_cv_search_socket+y} then : -else $as_nop - ac_cv_search_socket=no +else case e in #( + e) ac_cv_search_socket=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } @@ -16734,15 +17146,21 @@ printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char socket (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char socket (void); int main (void) { @@ -16773,11 +17191,13 @@ done if test ${ac_cv_search_socket+y} then : -else $as_nop - ac_cv_search_socket=no +else case e in #( + e) ac_cv_search_socket=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } @@ -16793,15 +17213,21 @@ printf %s "checking for library containing inet_ntop... " >&6; } if test ${ac_cv_search_inet_ntop+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char inet_ntop (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char inet_ntop (void); int main (void) { @@ -16832,11 +17258,13 @@ done if test ${ac_cv_search_inet_ntop+y} then : -else $as_nop - ac_cv_search_inet_ntop=no +else case e in #( + e) ac_cv_search_inet_ntop=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 printf "%s\n" "$ac_cv_search_inet_ntop" >&6; } @@ -16852,16 +17280,17 @@ fi for ac_func in socket socketpair bind listen accept connect do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes" then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1 _ACEOF -else $as_nop - sockets=false +else case e in #( + e) sockets=false ;; +esac fi done @@ -16937,8 +17366,9 @@ case $host in #( if test "x$ac_cv_type_struct_sockaddr_in6" = xyes then : -else $as_nop - ipv6=false +else case e in #( + e) ipv6=false ;; +esac fi ;; #( *) : @@ -16952,8 +17382,9 @@ fi if test "x$ac_cv_type_struct_sockaddr_in6" = xyes then : -else $as_nop - ipv6=false +else case e in #( + e) ipv6=false ;; +esac fi ;; @@ -16965,8 +17396,9 @@ then : if test "x$ac_cv_func_getaddrinfo" = xyes then : -else $as_nop - ipv6=false +else case e in #( + e) ipv6=false ;; +esac fi fi @@ -16977,8 +17409,9 @@ then : if test "x$ac_cv_func_getnameinfo" = xyes then : -else $as_nop - ipv6=false +else case e in #( + e) ipv6=false ;; +esac fi fi @@ -16989,8 +17422,9 @@ then : if test "x$ac_cv_func_inet_pton" = xyes then : -else $as_nop - ipv6=false +else case e in #( + e) ipv6=false ;; +esac fi fi @@ -17122,8 +17556,9 @@ then : printf "%s\n" "#define HAS_SELECT 1" >>confdefs.h select=true -else $as_nop - select=false +else case e in #( + e) select=false ;; +esac fi fi @@ -17172,8 +17607,9 @@ then : printf "%s\n" "#define HAS_WAITPID 1" >>confdefs.h -else $as_nop - wait=false +else case e in #( + e) wait=false ;; +esac fi @@ -17260,8 +17696,9 @@ then : printf "%s\n" "#define HAS_SETITIMER 1" >>confdefs.h -else $as_nop - setitimer=false +else case e in #( + e) setitimer=false ;; +esac fi @@ -17307,8 +17744,9 @@ then : printf "%s\n" "#define HAS_GETTIMEOFDAY 1" >>confdefs.h -else $as_nop - gettimeofday=false +else case e in #( + e) gettimeofday=false ;; +esac fi @@ -17445,22 +17883,28 @@ then : if test "x$ac_cv_func_dlopen" = xyes then : supports_shared_libraries=true DLLIBS="" -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -17472,27 +17916,32 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : supports_shared_libraries=true DLLIBS="-ldl $DLLIBS" -else $as_nop - supports_shared_libraries=false +else case e in #( + e) supports_shared_libraries=false ;; +esac fi - + ;; +esac fi ;; esac -else $as_nop - supports_shared_libraries=false +else case e in #( + e) supports_shared_libraries=false ;; +esac fi if $supports_shared_libraries @@ -17501,9 +17950,10 @@ then : printf "%s\n" "$as_me: Dynamic loading of shared libraries is supported." >&6;} printf "%s\n" "#define SUPPORT_DYNAMIC_LINKING 1" >>confdefs.h -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is not supported." >&5 -printf "%s\n" "$as_me: Dynamic loading of shared libraries is not supported." >&6;} +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is not supported." >&5 +printf "%s\n" "$as_me: Dynamic loading of shared libraries is not supported." >&6;} ;; +esac fi ## mmap @@ -17561,10 +18011,11 @@ then : cc_has_debug_prefix_map=true { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - cc_has_debug_prefix_map=false +else case e in #( + e) cc_has_debug_prefix_map=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" @@ -17625,9 +18076,10 @@ if $stat_has_ns_precision then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: stat supports nanosecond precision" >&5 printf "%s\n" "$as_me: stat supports nanosecond precision" >&6;} -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: stat does not support nanosecond precision" >&5 -printf "%s\n" "$as_me: stat does not support nanosecond precision" >&6;} +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: stat does not support nanosecond precision" >&5 +printf "%s\n" "$as_me: stat does not support nanosecond precision" >&6;} ;; +esac fi # Number of arguments of gethostbyname_r @@ -17646,8 +18098,8 @@ printf %s "checking how many arguments gethostbyname_r() takes... " >&6; } if test ${ac_cv_func_which_gethostbyname_r+y} then : printf %s "(cached) " >&6 -else $as_nop - +else case e in #( + e) ################################################################ @@ -17781,7 +18233,8 @@ fi ################################################################ - + ;; +esac fi case "$ac_cv_func_which_gethostbyname_r" in @@ -17871,8 +18324,8 @@ printf %s "checking how many arguments gethostbyaddr_r() takes... " >&6; } if test ${ac_cv_func_which_gethostbyaddr_r+y} then : printf %s "(cached) " >&6 -else $as_nop - +else case e in #( + e) ################################################################ @@ -17977,7 +18430,8 @@ fi ################################################################ - + ;; +esac fi case "$ac_cv_func_which_gethostbyaddr_r" in @@ -18190,8 +18644,8 @@ then : printf "%s\n" "gnu" >&6; } printf "%s\n" "#define HAS_GNU_GETAFFINITY_NP 1" >>confdefs.h -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -18214,12 +18668,14 @@ then : printf "%s\n" "BSD" >&6; } printf "%s\n" "#define HAS_BSD_GETAFFINITY_NP 1" >>confdefs.h -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: pthread_getaffinity_np not found" >&5 -printf "%s\n" "pthread_getaffinity_np not found" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: pthread_getaffinity_np not found" >&5 +printf "%s\n" "pthread_getaffinity_np not found" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -18232,8 +18688,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else $as_nop - case $PKG_CONFIG in +else case e in #( + e) case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; @@ -18258,6 +18714,7 @@ done IFS=$as_save_IFS ;; +esac ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG @@ -18280,8 +18737,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else $as_nop - case $ac_pt_PKG_CONFIG in +else case e in #( + e) case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; @@ -18306,6 +18763,7 @@ done IFS=$as_save_IFS ;; +esac ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG @@ -18347,27 +18805,34 @@ then : zstd_libs=`${PKG_CONFIG} --libs libzstd` zstd_flags=`${PKG_CONFIG} --cflags libzstd` zstd_status="ok" -else $as_nop - zstd_status="zstd library too old: version 1.4 or later is needed" +else case e in #( + e) zstd_status="zstd library too old: version 1.4 or later is needed" ;; +esac fi -else $as_nop - # Otherwise, try to find zstd the old way, +else case e in #( + e) # Otherwise, try to find zstd the old way, # assuming it is installed in default places { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ZSTD_createCCtx in -lzstd" >&5 printf %s "checking for ZSTD_createCCtx in -lzstd... " >&6; } if test ${ac_cv_lib_zstd_ZSTD_createCCtx+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-lzstd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char ZSTD_createCCtx (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char ZSTD_createCCtx (void); int main (void) { @@ -18379,12 +18844,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_zstd_ZSTD_createCCtx=yes -else $as_nop - ac_cv_lib_zstd_ZSTD_createCCtx=no +else case e in #( + e) ac_cv_lib_zstd_ZSTD_createCCtx=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_createCCtx" >&5 printf "%s\n" "$ac_cv_lib_zstd_ZSTD_createCCtx" >&6; } @@ -18397,13 +18864,16 @@ then : zstd_libs="-lzstd" zstd_flags="" zstd_status="ok" -else $as_nop - zstd_status="zstd library too old: version 1.4 or later is needed" +else case e in #( + e) zstd_status="zstd library too old: version 1.4 or later is needed" ;; +esac fi -else $as_nop - zstd_status="zstd library not found" +else case e in #( + e) zstd_status="zstd library not found" ;; +esac fi - + ;; +esac fi fi @@ -18415,8 +18885,8 @@ printf "%s\n" "$as_me: compressed marshaling supported" >&6;} internal_cppflags="$internal_cppflags $zstd_flags" printf "%s\n" "#define HAS_ZSTD 1" >>confdefs.h -else $as_nop - case "$with_zstd" in #( +else case e in #( + e) case "$with_zstd" in #( no) : ;; #( yes) : @@ -18426,6 +18896,7 @@ else $as_nop printf "%s\n" "$as_me: WARNING: $zstd_status" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: compressed marshaling not supported" >&5 printf "%s\n" "$as_me: WARNING: compressed marshaling not supported" >&2;} ;; +esac ;; esac fi @@ -18444,11 +18915,12 @@ then : build_ocamldebug=true { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger supported" >&5 printf "%s\n" "$as_me: replay debugger supported" >&6;} -else $as_nop - with_debugger="" +else case e in #( + e) with_debugger="" build_ocamldebug=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger not supported" >&5 -printf "%s\n" "$as_me: replay debugger not supported" >&6;} +printf "%s\n" "$as_me: replay debugger not supported" >&6;} ;; +esac fi ;; esac @@ -18480,11 +18952,147 @@ esac ## Determine how to link with the POSIX threads library +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 +printf %s "checking for egrep -e... " >&6; } +if test ${ac_cv_path_EGREP_TRADITIONAL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + : + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + + if test "$ac_cv_path_EGREP_TRADITIONAL" +then : + ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + ;; +esac +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 +printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } + EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL + case $host in #( *-*-mingw32*) : PTHREAD_LIBS="-l:libpthread.a -lgcc_eh" ;; #( *-pc-windows) : PTHREAD_LIBS="-l:libpthread.lib" ;; #( + *-apple-darwin*) : + PTHREAD_LIBS="-pthread" ;; #( *) : @@ -18526,8 +19134,14 @@ printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char pthread_join (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (void); int main (void) { @@ -18621,7 +19235,7 @@ case $host_os in _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 + $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} @@ -18651,8 +19265,8 @@ printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG=no +else case e in #( + e) ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18664,14 +19278,15 @@ else $as_nop _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 + $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } @@ -18721,8 +19336,9 @@ esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 -else $as_nop - ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +else case e in #( + e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; +esac fi @@ -18756,8 +19372,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ax_pthread_config+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ax_pthread_config"; then +else case e in #( + e) if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -18780,7 +19396,8 @@ done IFS=$as_save_IFS test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" -fi +fi ;; +esac fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then @@ -18913,8 +19530,8 @@ printf %s "checking whether Clang needs flag to prevent \"argument unused\" warn if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown +else case e in #( + e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second @@ -18960,7 +19577,8 @@ then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } @@ -18987,8 +19605,8 @@ printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_JOINABLE_ATTR=unknown +else case e in #( + e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19008,7 +19626,8 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } @@ -19028,14 +19647,15 @@ printf %s "checking whether more special flags are required for pthreads... " >& if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_SPECIAL_FLAGS=no +else case e in #( + e) ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } @@ -19051,8 +19671,8 @@ printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -19067,12 +19687,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes -else $as_nop - ax_cv_PTHREAD_PRIO_INHERIT=no +else case e in #( + e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } @@ -19122,8 +19744,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CC"; then +else case e in #( + e) if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -19145,7 +19767,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then @@ -19172,8 +19795,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CXX+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CXX"; then +else case e in #( + e) if test -n "$PTHREAD_CXX"; then ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -19195,7 +19818,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX if test -n "$PTHREAD_CXX"; then @@ -19264,6 +19888,14 @@ esac ## Activate the systhread library +if test x"$enable_runtime5" = x"yes" +then : + runtime_suffix= +else case e in #( + e) runtime_suffix=4 ;; +esac +fi + case $enable_systhreads,$enable_unix_lib in #( yes,no) : systhread_support=false @@ -19276,8 +19908,11 @@ printf "%s\n" "$as_me: the threads library is disabled" >&6;} ;; #( systhread_support=true ac_config_files="$ac_config_files otherlibs/systhreads/META" - otherlibraries="$otherlibraries systhreads" + ac_config_files="$ac_config_files otherlibs/systhreads4/META" + + otherlibraries="$otherlibraries systhreads${runtime_suffix}" lib_systhreads=true + lib_systhreads_path="systhreads${runtime_suffix}" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the threads library is supported" >&5 printf "%s\n" "$as_me: the threads library is supported" >&6;} ;; esac @@ -19328,10 +19963,11 @@ then : as_has_debug_prefix_map=true { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - ashas_debug_prefix_map=false +else case e in #( + e) ashas_debug_prefix_map=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -19354,8 +19990,8 @@ printf %s "checking whether the assembler supports CFI directives... " >&6; } then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 printf "%s\n" "disabled" >&6; } -else $as_nop - +else case e in #( + e) saved_CC="$CC" saved_CFLAGS="$CFLAGS" saved_CPPFLAGS="$CPPFLAGS" @@ -19389,16 +20025,17 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : aspp_ok=true -else $as_nop - aspp_ok=false +else case e in #( + e) aspp_ok=false ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test "$AS" = "$ASPP" then : as_ok="$aspp_ok" -else $as_nop - CC="$AS" +else case e in #( + e) CC="$AS" ac_compile='$CC $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19414,10 +20051,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : as_ok=true -else $as_nop - as_ok=false +else case e in #( + e) as_ok=false ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi @@ -19438,20 +20077,23 @@ then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - if test x"$enable_cfi" = "xyes" +else case e in #( + e) if test x"$enable_cfi" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available as_fn_error $? "exiting" "$LINENO" 5" >&5 printf "%s\n" "requested but not available as_fn_error $? "exiting" "$LINENO" 5" >&6; } -else $as_nop - asm_cfi_supported=false +else case e in #( + e) asm_cfi_supported=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi +printf "%s\n" "no" >&6; } ;; +esac +fi ;; +esac fi - + ;; +esac fi ;; esac fi @@ -19472,10 +20114,11 @@ printf "%s\n" "$as_me: using frame pointers" >&6;} ;; #( as_fn_error $? "frame pointers not supported on this platform" "$LINENO" 5 ;; esac -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not using frame pointers" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not using frame pointers" >&5 printf "%s\n" "$as_me: not using frame pointers" >&6;} - frame_pointers=false + frame_pointers=false ;; +esac fi ## CPP mangling @@ -19485,8 +20128,9 @@ then : cpp_mangling=true printf "%s\n" "#define WITH_CPP_MANGLING 1" >>confdefs.h -else $as_nop - cpp_mangling=false +else case e in #( + e) cpp_mangling=false ;; +esac fi ## No naked pointers @@ -19496,8 +20140,9 @@ then : naked_pointers=false printf "%s\n" "#define NO_NAKED_POINTERS 1" >>confdefs.h -else $as_nop - naked_pointers=true +else case e in #( + e) naked_pointers=true ;; +esac fi if test x"$enable_naked_pointers_checker" = "xyes" @@ -19520,8 +20165,9 @@ fi *) : ;; esac -else $as_nop - naked_pointers_checker=false +else case e in #( + e) naked_pointers_checker=false ;; +esac fi ## Check for mmap support for huge pages and contiguous heap @@ -19532,8 +20178,8 @@ printf %s "checking whether mmap supports huge pages... " >&6; } then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no assumed" >&5 printf "%s\n" "no assumed" >&6; } -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -19582,42 +20228,67 @@ then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi +# Unconditionally reserve 8 header bits in both runtime 4 and +# runtime 5, which is required for mixed block support. printf "%s\n" "#define HEADER_RESERVED_BITS $reserved_header_bits" >>confdefs.h +printf "%s\n" "#define PROFINFO_WIDTH $profinfo_width" >>confdefs.h + +if $profinfo +then : + printf "%s\n" "#define WITH_PROFINFO 1" >>confdefs.h + +fi + +# Only gcc supports -fno-partial-inlining +case $ocaml_cv_cc_vendor in #( + gcc-*) : + no_partial_inlining_cflags="-fno-partial-inlining" ;; #( + *) : + no_partial_inlining_cflags="" ;; +esac + +printf "%s\n" "#define CUSTOM_OPS_STRUCT_SIZE $custom_ops_struct_size" >>confdefs.h + if test x"$enable_installing_bytecode_programs" = "xno" then : install_bytecode_programs=false -else $as_nop - install_bytecode_programs=true +else case e in #( + e) install_bytecode_programs=true ;; +esac fi if test x"$enable_installing_source_artifacts" = "xno" then : install_source_artifacts=false -else $as_nop - install_source_artifacts=true +else case e in #( + e) install_source_artifacts=true ;; +esac fi if test x"$enable_ocamldoc" = "xno" then : ocamldoc="" build_ocamldoc=false -else $as_nop - ocamldoc=ocamldoc +else case e in #( + e) ocamldoc=ocamldoc build_ocamldoc=true ac_config_files="$ac_config_files ocamldoc/META" - + ;; +esac fi documentation_tool_cmd='' @@ -19634,8 +20305,9 @@ then : documentation_tool_cmd="$withval" documentation_tool='odoc' ;; esac -else $as_nop - documentation_tool='ocamldoc' +else case e in #( + e) documentation_tool='ocamldoc' ;; +esac fi if test "x$documentation_tool_cmd" = 'x' @@ -19664,8 +20336,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DIFF+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DIFF"; then +else case e in #( + e) if test -n "$DIFF"; then ac_cv_prog_DIFF="$DIFF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -19687,7 +20359,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DIFF=$ac_cv_prog_DIFF if test -n "$DIFF"; then @@ -19721,9 +20394,10 @@ then : DIFF_FLAGS="$DIFF_FLAGS $flag" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; +esac fi done fi @@ -19736,46 +20410,52 @@ then : then : as_fn_error $? "please enable only one of Flambda 1 and Flambda 2" "$LINENO" 5 fi -else $as_nop - flambda=false +else case e in #( + e) flambda=false ;; +esac fi if test x"$enable_flambda2" = "xyes" then : flambda2=true flambda=false -else $as_nop - flambda2=false +else case e in #( + e) flambda2=false ;; +esac fi if test x"$enable_flambda_invariants" = "xyes" then : flambda_invariants=true -else $as_nop - flambda_invariants=false +else case e in #( + e) flambda_invariants=false ;; +esac fi if test x"$enable_cmm_invariants" = "xyes" then : cmm_invariants=true -else $as_nop - cmm_invariants=false +else case e in #( + e) cmm_invariants=false ;; +esac fi if test x"$enable_cmm_invariants" = "xyes" then : cmm_invariants=true -else $as_nop - cmm_invariants=false +else case e in #( + e) cmm_invariants=false ;; +esac fi if test x"$enable_flat_float_array" = "xno" then : flat_float_array=false -else $as_nop - printf "%s\n" "#define FLAT_FLOAT_ARRAY 1" >>confdefs.h +else case e in #( + e) printf "%s\n" "#define FLAT_FLOAT_ARRAY 1" >>confdefs.h - flat_float_array=true + flat_float_array=true ;; +esac fi @@ -19785,8 +20465,8 @@ printf %s "checking whether mmap supports MAP_STACK... " >&6; } then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no assumed" >&5 printf "%s\n" "no assumed" >&6; } -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -19809,12 +20489,14 @@ then : has_mmap_map_stack=true { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi @@ -19832,12 +20514,13 @@ then : *) : ;; esac -else $as_nop - as_fn_error $? "mmap MAP_STACK requested but not found on $target" "$LINENO" 5 +else case e in #( + e) as_fn_error $? "mmap MAP_STACK requested but not found on $target" "$LINENO" 5 ;; +esac fi -else $as_nop - case $target in #( +else case e in #( + e) case $target in #( *-openbsd*) : with_mmap_map_stack=true; printf "%s\n" "#define USE_MMAP_MAP_STACK 1" >>confdefs.h @@ -19849,7 +20532,8 @@ printf "%s\n" "$as_me: using MAP_STACK on OpenBSD due to stack checking" >&6;} ; *) : ;; esac - + ;; +esac fi oc_native_compflags='' @@ -19857,8 +20541,8 @@ oc_native_compflags='' if test x"$enable_function_sections" = "xno" then : function_sections=false -else $as_nop - case $arch in #( +else case e in #( + e) case $arch in #( amd64|arm64) : # not supported on arm32, see issue #9124. case $target in #( @@ -19906,11 +20590,13 @@ then : if test x"$enable_function_sections" = "xyes" then : as_fn_error $? "Function sections are not supported." "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling function sections." >&5 -printf "%s\n" "$as_me: Disabling function sections." >&6;} -fi +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling function sections." >&5 +printf "%s\n" "$as_me: Disabling function sections." >&6;} ;; +esac fi +fi ;; +esac fi case $arch in #( @@ -19938,8 +20624,9 @@ fi if test x"$with_afl" = "xyes" then : afl=true -else $as_nop - afl=false +else case e in #( + e) afl=false ;; +esac fi # Enable debugging support @@ -19953,16 +20640,18 @@ fi if test x"$enable_stack_allocation" = "xno" then : stack_allocation=false -else $as_nop - if $arch64 +else case e in #( + e) if $arch64 then : printf "%s\n" "#define STACK_ALLOCATION 1" >>confdefs.h stack_allocation=true -else $as_nop - as_fn_error $? "Stack allocation is only supported on 64-bit platforms. \ -Please pass '--enable-stack-allocation=no'." "$LINENO" 5 -fi +else case e in #( + e) as_fn_error $? "Stack allocation is only supported on 64-bit platforms. \ +Please pass '--enable-stack-allocation=no'." "$LINENO" 5 ;; +esac +fi ;; +esac fi if test x"$enable_poll_insertion" = "xyes" @@ -19970,8 +20659,9 @@ then : printf "%s\n" "#define POLL_INSERTION 1" >>confdefs.h poll_insertion=true -else $as_nop - poll_insertion=false +else case e in #( + e) poll_insertion=false ;; +esac fi oc_cflags="$common_cflags $internal_cflags" @@ -20031,8 +20721,8 @@ then : *) : ;; esac -else $as_nop - if test x"$unix_or_win32" = "xwin32" \ +else case e in #( + e) if test x"$unix_or_win32" = "xwin32" \ && test "$host_vendor-$host_os" != "$build_vendor-$build_os" then : case $build in #( @@ -20041,7 +20731,8 @@ then : *) : ;; esac -fi +fi ;; +esac fi # Define a few macros that were defined in config/m-nt.h @@ -20078,8 +20769,9 @@ esac if test x"$enable_stdlib_manpages" != "xno" then : stdlib_manpages=true -else $as_nop - stdlib_manpages=false +else case e in #( + e) stdlib_manpages=false ;; +esac fi # Do not permanently cache the result of flexdll.h @@ -20110,8 +20802,8 @@ cat >confcache <<\_ACEOF # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the +# 'ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF @@ -20141,14 +20833,14 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote + # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) - # `set' quotes correctly as required by POSIX, so do not add quotes. + # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | @@ -20302,8 +20994,8 @@ fi mkdll_ldflags="\$(addprefix ${mkexe_ldflags_prefix},\$(OC_DLL_LDFLAGS)) \ ${mkdll_ldflags}" -else $as_nop - +else case e in #( + e) mkdll_ldflags='$(OC_DLL_LDFLAGS) $(LDFLAGS)' mkdll_ldflags_exp="${oc_dll_ldflags}" if test -n ${LDFLAGS} @@ -20312,7 +21004,8 @@ then : fi mkexe_ldflags="\$(OC_LDFLAGS) \$(LDFLAGS)" mkexe_ldflags_exp="${oc_ldflags} ${LDFLAGS}" - + ;; +esac fi mkexe="$mkexe $mkexe_ldflags" mkexe_exp="$mkexe_exp $mkexe_ldflags_exp" @@ -20327,19 +21020,21 @@ then : mkexe_via_cc_ldflags=\ "\$(addprefix ${mkexe_via_cc_ldflags_prefix},\$(OC_LDFLAGS) \$(LDFLAGS))" -else $as_nop - +else case e in #( + e) mkexe_via_cc_ldflags='$(OC_LDFLAGS) $(LDFLAGS)' - + ;; +esac fi # cl requires linker flags after the objects. if test "$ccomptype" = 'msvc' then : mkexe_via_cc_ldflags=\ "\$(OUTPUTEXE)\$(1) \$(2) $mkexe_via_cc_ldflags" -else $as_nop - mkexe_via_cc_ldflags=\ -"$mkexe_via_cc_ldflags \$(OUTPUTEXE)\$(1) \$(2)" +else case e in #( + e) mkexe_via_cc_ldflags=\ +"$mkexe_via_cc_ldflags \$(OUTPUTEXE)\$(1) \$(2)" ;; +esac fi if test -n "$mkexe_via_cc_extra_cmd" then : @@ -20375,7 +21070,6 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -20384,12 +21078,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop - case `(set -o) 2>/dev/null` in #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -20461,7 +21156,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -20490,7 +21185,6 @@ as_fn_error () } # as_fn_error - # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -20530,11 +21224,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -20548,11 +21243,12 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac fi # as_fn_arith @@ -20635,9 +21331,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -20718,10 +21414,12 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 @@ -20736,8 +21434,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by OCaml $as_me 5.1.1+jst-runtime4, which was -generated by GNU Autoconf 2.71. Invocation command line was +This file was extended by OCaml $as_me 5.1.1+jst, which was +generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -20769,7 +21467,7 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions +'$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. @@ -20805,11 +21503,11 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -OCaml config.status 5.1.1+jst-runtime4 -configured by $0, generated by GNU Autoconf 2.71, +OCaml config.status 5.1.1+jst +configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -20870,8 +21568,8 @@ do ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + as_fn_error $? "ambiguous option: '$1' +Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -20879,8 +21577,8 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) as_fn_error $? "unrecognized option: '$1' +Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; @@ -21237,9 +21935,10 @@ do "otherlibs/unix/META") CONFIG_FILES="$CONFIG_FILES otherlibs/unix/META" ;; "otherlibs/str/META") CONFIG_FILES="$CONFIG_FILES otherlibs/str/META" ;; "otherlibs/systhreads/META") CONFIG_FILES="$CONFIG_FILES otherlibs/systhreads/META" ;; + "otherlibs/systhreads4/META") CONFIG_FILES="$CONFIG_FILES otherlibs/systhreads4/META" ;; "ocamldoc/META") CONFIG_FILES="$CONFIG_FILES ocamldoc/META" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done @@ -21259,7 +21958,7 @@ fi # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. +# after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= @@ -21283,7 +21982,7 @@ ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. +# This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then @@ -21441,13 +22140,13 @@ fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. +# This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF -# Transform confdefs.h into an awk script `defines.awk', embedded as +# Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. @@ -21557,7 +22256,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -21579,19 +22278,19 @@ do -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. + # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done - # Let's still pretend it is `configure' which instantiates (i.e., don't + # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` @@ -21719,7 +22418,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 esac _ACEOF -# Neutralize VPATH when `$srcdir' = `.'. +# Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -21749,9 +22448,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" diff --git a/configure.ac b/configure.ac index ad754ae5d0b..d1224de9ba4 100644 --- a/configure.ac +++ b/configure.ac @@ -61,7 +61,10 @@ CSCFLAGS="" ostype="Unix" SO="so" toolchain="cc" -reserved_header_bits=0 +reserved_header_bits=8 +profinfo=true +profinfo_width=8 +custom_ops_struct_size=64 instrumented_runtime=false instrumented_runtime_libs="" bootstrapping_flexdll=false @@ -69,6 +72,7 @@ flexdll_dir= lib_dynlink=false lib_str=false lib_systhreads=false +lib_systhreads_path="" lib_unix=false ocamltest_libunix=None ocamltest_unix_impl="dummy" @@ -84,8 +88,24 @@ AC_CONFIG_SRCDIR([runtime/interp.c]) ## Directory containing auxiliary scripts used during build AC_CONFIG_AUX_DIR([build-aux]) +# Runtime selection + +AC_ARG_ENABLE([runtime5], + [AS_HELP_STRING([--enable-runtime5], + [Use the OCaml 5 runtime])]) +AS_IF([test x"$enable_runtime5" = xyes], + [runtime_suffix=], + [runtime_suffix=4]) + +AC_ARG_ENABLE([stack_checks], + [AS_HELP_STRING([--enable-stack_checks], + [Enable stack checks])]) + ## Output variables +AC_SUBST([enable_runtime5]) +AC_SUBST([runtime_suffix]) +AC_SUBST([enable_stack_checks]) AC_SUBST([CONFIGURE_ARGS]) AC_SUBST([native_compiler]) AC_SUBST([default_build_target]) @@ -163,6 +183,7 @@ AC_SUBST([lib_dynlink]) AC_SUBST([lib_runtime_events]) AC_SUBST([lib_str]) AC_SUBST([lib_systhreads]) +AC_SUBST([lib_systhreads_path]) AC_SUBST([lib_unix]) AC_SUBST([ocamltest_CPP]) AC_SUBST([ocamltest_libunix]) @@ -195,6 +216,10 @@ AC_SUBST([install_bytecode_programs]) AC_SUBST([install_source_artifacts]) AC_SUBST([install_ocamlnat]) AC_SUBST([reserved_header_bits]) +AC_SUBST([profinfo]) +AC_SUBST([profinfo_width]) +AC_SUBST([custom_ops_struct_size]) +AC_SUBST([no_partial_inlining_cflags]) AC_SUBST([frame_pointers]) AC_SUBST([cpp_mangling]) AC_SUBST([flambda]) @@ -235,12 +260,16 @@ AC_CONFIG_FILES([manual/src/html_processing/src/common.ml]) AC_CONFIG_FILES([ocamltest/ocamltest_config.ml]) AC_CONFIG_FILES([utils/config.generated.ml]) AC_CONFIG_FILES([tools/eventlog_metadata]) -AC_CONFIG_HEADERS([runtime/caml/m.h]) -AC_CONFIG_HEADERS([runtime/caml/s.h]) -AC_CONFIG_HEADERS([runtime/caml/version.h]) -AC_CONFIG_HEADERS([runtime4/caml/m.h]) -AC_CONFIG_HEADERS([runtime4/caml/s.h]) -AC_CONFIG_HEADERS([runtime4/caml/version.h]) +AS_IF([test "x$enable_runtime5" = "xyes"], + [ AC_CONFIG_HEADERS([runtime/caml/m.h]) + AC_CONFIG_HEADERS([runtime/caml/s.h]) + AC_CONFIG_HEADERS([runtime/caml/version.h]) + ], + [ AC_CONFIG_HEADERS([runtime4/caml/m.h]) + AC_CONFIG_HEADERS([runtime4/caml/s.h]) + AC_CONFIG_HEADERS([runtime4/caml/version.h]) + ] +) AC_CONFIG_FILES([compilerlibs/META]) AC_CONFIG_FILES([otherlibs/dynlink/META]) AC_CONFIG_FILES([otherlibs/runtime_events/META]) @@ -448,21 +477,13 @@ AC_ARG_WITH([target-bindir], [AS_HELP_STRING([--with-target-bindir], [location of binary programs on target system])]) -AC_ARG_ENABLE([reserved-header-bits], - [AS_HELP_STRING([--enable-reserved-header-bits=BITS], - [reserve BITS (between 0 and 31) bits in block headers])], - [AS_CASE([$enable_reserved_header_bits], - [[[0-9]]|[[1-2]][[0-9]]|3[[0-1]]], - [ reserved_header_bits=$enable_reserved_header_bits], - [AC_MSG_ERROR([invalid argument to --enable-reserved-header-bits])])]) - AC_ARG_ENABLE([stdlib-manpages], [AS_HELP_STRING([--disable-stdlib-manpages], [do not build or install the library man pages])]) AC_ARG_ENABLE([warn-error], - [AS_HELP_STRING([--enable-warn-error], - [treat C compiler warnings as errors])]) + [AS_HELP_STRING([--disable-warn-error], + [do not treat C compiler warnings as errors])]) AC_ARG_VAR([WINDOWS_UNICODE_MODE], [how to handle Unicode under Windows: ansi, compatible]) @@ -654,12 +675,15 @@ AS_CASE([$host], [exeext=".exe"], [exeext='']) -dnl CR ocaml 5 runtime: -dnl otherlibraries="dynlink runtime_events" otherlibraries="dynlink" lib_dynlink=true -dnl CR ocaml 5 runtime: -dnl lib_runtime_events = true + +AS_IF( + [test x"$enable_runtime5" = x"yes"], + [otherlibraries="$otherlibraries runtime_events" + lib_runtime_events=true], + []) + AS_IF([test x"$enable_unix_lib" != "xno"], [enable_unix_lib=yes AC_CONFIG_FILES([otherlibs/unix/META]) @@ -731,11 +755,12 @@ AS_CASE([$ocaml_cv_cc_vendor], cc_warnings=''], [outputobj='-o ' warn_error_flag='-Werror' - cc_warnings="-Wall -Wint-conversion -Wstrict-prototypes \ + cc_warnings="-Wall -Wno-pragmas -Wint-conversion -Wstrict-prototypes \ -Wold-style-definition"]) -AS_CASE([$enable_warn_error,OCAML__DEVELOPMENT_VERSION], - [yes,*|,true], +AS_CASE([$enable_warn_error], + [no], [], + [*], [cc_warnings="$cc_warnings $warn_error_flag"]) # We select high optimization levels, provided we can turn off: @@ -1325,6 +1350,14 @@ AS_CASE([$host], [has_native_backend=yes; arch=riscv; model=riscv64; system=linux] ) +# Disabling of stack checks is only supported on amd64. +AS_IF([test x"$enable_stack_checks" = xyes], + [AC_DEFINE([STACK_CHECKS_ENABLED])], + [AS_IF([test x"$arch" != xamd64], + [enable_stack_checks=yes + AC_DEFINE([STACK_CHECKS_ENABLED])], + [])]) + native_cflags='' native_cppflags="-DTARGET_${arch} -DMODEL_${model} -DSYS_${system}" @@ -2091,6 +2124,8 @@ AS_CASE([$host], [PTHREAD_LIBS="-l:libpthread.a -lgcc_eh"], [*-pc-windows], [PTHREAD_LIBS="-l:libpthread.lib"], + [*-apple-darwin*], + [PTHREAD_LIBS="-pthread"], [AX_PTHREAD( [common_cflags="$common_cflags $PTHREAD_CFLAGS" saved_CFLAGS="$CFLAGS" @@ -2105,6 +2140,11 @@ AS_CASE([$host], ## Activate the systhread library +AS_IF( + [test x"$enable_runtime5" = x"yes"], + [runtime_suffix=], + [runtime_suffix=4]) + AS_CASE([$enable_systhreads,$enable_unix_lib], [yes,no], [systhread_support=false @@ -2114,8 +2154,10 @@ AS_CASE([$enable_systhreads,$enable_unix_lib], AC_MSG_NOTICE([the threads library is disabled])], [systhread_support=true AC_CONFIG_FILES([otherlibs/systhreads/META]) - otherlibraries="$otherlibraries systhreads" + AC_CONFIG_FILES([otherlibs/systhreads4/META]) + otherlibraries="$otherlibraries systhreads${runtime_suffix}" lib_systhreads=true + lib_systhreads_path="systhreads${runtime_suffix}" AC_MSG_NOTICE([the threads library is supported])]) ## Does the assembler support debug prefix map and CFI directives @@ -2175,7 +2217,19 @@ AS_IF([test x"$enable_naked_pointers_checker" = "xyes" ], ## Check for mmap support for huge pages and contiguous heap OCAML_MMAP_SUPPORTS_HUGE_PAGES +# Unconditionally reserve 8 header bits in both runtime 4 and +# runtime 5, which is required for mixed block support. AC_DEFINE_UNQUOTED([HEADER_RESERVED_BITS], [$reserved_header_bits]) +AC_DEFINE_UNQUOTED([PROFINFO_WIDTH], [$profinfo_width]) +AS_IF([$profinfo], [AC_DEFINE([WITH_PROFINFO])]) + +# Only gcc supports -fno-partial-inlining +AS_CASE([$ocaml_cv_cc_vendor], + [gcc-*], + [no_partial_inlining_cflags="-fno-partial-inlining"], + [no_partial_inlining_cflags=""]) + +AC_DEFINE_UNQUOTED([CUSTOM_OPS_STRUCT_SIZE], [$custom_ops_struct_size]) AS_IF([test x"$enable_installing_bytecode_programs" = "xno"], [install_bytecode_programs=false], diff --git a/debugger/.depend b/debugger/.depend index 4bba9203d7b..72397544b68 100644 --- a/debugger/.depend +++ b/debugger/.depend @@ -182,7 +182,6 @@ eval.cmo : \ ../typing/env.cmi \ debugcom.cmi \ ../typing/ctype.cmi \ - ../utils/compilation_unit.cmi \ ../typing/btype.cmi \ eval.cmi eval.cmx : \ @@ -203,7 +202,6 @@ eval.cmx : \ ../typing/env.cmx \ debugcom.cmx \ ../typing/ctype.cmx \ - ../utils/compilation_unit.cmx \ ../typing/btype.cmx \ eval.cmi eval.cmi : \ @@ -286,12 +284,10 @@ loadprinter.cmo : \ ../utils/misc.cmi \ ../parsing/longident.cmi \ ../utils/load_path.cmi \ - ../typing/jkind.cmi \ ../typing/ident.cmi \ ../typing/env.cmi \ ../otherlibs/dynlink/dynlink.cmi \ ../typing/ctype.cmi \ - ../utils/compilation_unit.cmi \ loadprinter.cmi loadprinter.cmx : \ ../typing/types.cmx \ @@ -303,12 +299,10 @@ loadprinter.cmx : \ ../utils/misc.cmx \ ../parsing/longident.cmx \ ../utils/load_path.cmx \ - ../typing/jkind.cmx \ ../typing/ident.cmx \ ../typing/env.cmx \ - ../otherlibs/dynlink/dynlink.cmx \ + ../otherlibs/dynlink/dynlink.cmi \ ../typing/ctype.cmx \ - ../utils/compilation_unit.cmx \ loadprinter.cmi loadprinter.cmi : \ ../parsing/longident.cmi \ @@ -407,7 +401,6 @@ printval.cmo : \ ../toplevel/genprintval.cmi \ ../typing/env.cmi \ debugcom.cmi \ - ../utils/compilation_unit.cmi \ printval.cmi printval.cmx : \ ../typing/types.cmx \ @@ -419,7 +412,6 @@ printval.cmx : \ ../toplevel/genprintval.cmx \ ../typing/env.cmx \ debugcom.cmx \ - ../utils/compilation_unit.cmx \ printval.cmi printval.cmi : \ ../typing/types.cmi \ diff --git a/debugger/command_line.ml b/debugger/command_line.ml index f311295bbc1..43f4a95f402 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -262,7 +262,8 @@ let instr_dir ppf lexbuf = let new_directory = argument_list_eol argument lexbuf in if new_directory = [] then begin if yes_or_no "Reinitialize directory list" then begin - Load_path.init ~auto_include:Compmisc.auto_include !default_load_path; + Load_path.init ~auto_include:Compmisc.auto_include + ~visible:!default_load_path ~hidden:[]; Envaux.reset_cache ~preserve_persistent_env:false; Hashtbl.clear Debugger_config.load_path_for; flush_buffer_list () @@ -278,7 +279,8 @@ let instr_dir ppf lexbuf = List.iter (function x -> add_path (expand_path x)) new_directory' end; let print_dirs ppf l = List.iter (function x -> fprintf ppf "@ %s" x) l in - fprintf ppf "@[<2>Directories: %a@]@." print_dirs (Load_path.get_paths ()); + fprintf ppf "@[<2>Directories: %a@]@." print_dirs + (Load_path.get_path_list ()); Hashtbl.iter (fun mdl dirs -> fprintf ppf "@[<2>Source directories for %s: %a@]@." mdl print_dirs diff --git a/debugger/debugcom.ml b/debugger/debugcom.ml index e852b3bb97c..5705cd73dbb 100644 --- a/debugger/debugcom.ml +++ b/debugger/debugcom.ml @@ -52,7 +52,6 @@ type pc = module Sp = struct (* Position in the debuggee's stack. *) -(* BACKPORT BEGIN type t = { block : int; offset : int; @@ -66,13 +65,6 @@ module Sp = struct match Stdlib.compare sp1.block sp2.block with | 0 -> Stdlib.compare sp1.offset sp2.offset | x -> x -*) - type t = int - - let null = 0 - let base _ _ = assert false - let compare = Int.compare -(* BACKPORT END *) end @@ -80,11 +72,7 @@ end Numbering starts at 1 and the runtime registers 2 fragments before the main program: one for uncaught exceptions and one for callbacks. *) -(* BACKPOR BEGIN let main_frag = 3 -*) -let main_frag = 0 -(* BACKPORT END *) let set_event {frag; pos} = output_char !conn.io_out 'e'; @@ -149,21 +137,13 @@ let do_go_smallint n = | c -> Misc.fatal_error (Printf.sprintf "Debugcom.do_go %c" c) in let event_counter = input_binary_int !conn.io_in in -(* BACKPORT BEGIN let block = input_binary_int !conn.io_in in let offset = input_binary_int !conn.io_in in -*) - let rep_stack_pointer = input_binary_int !conn.io_in in -(* BACKPORT END *) let frag = input_binary_int !conn.io_in in let pos = input_binary_int !conn.io_in in { rep_type = summary; rep_event_count = Int64.of_int event_counter; -(* BACKPORT BEGIN rep_stack_pointer = Sp.{block; offset}; -*) - rep_stack_pointer; -(* BACKPORT END *) rep_program_pointer = {frag; pos} }) let rec do_go n = @@ -212,19 +192,11 @@ let wait_child chan = let initial_frame () = output_char !conn.io_out '0'; flush !conn.io_out; -(* BACKPORT BEGIN let block = input_binary_int !conn.io_in in let offset = input_binary_int !conn.io_in in -*) - let stack_pos = input_binary_int !conn.io_in in -(* BACKPORT END *) let frag = input_binary_int !conn.io_in in let pos = input_binary_int !conn.io_in in -(* BACKPORT BEGIN (Sp.{block; offset}, {frag; pos}) -*) - (stack_pos, {frag; pos}) -(* BACKPOR END *) let set_initial_frame () = ignore(initial_frame ()) @@ -237,14 +209,9 @@ let up_frame stacksize = output_char !conn.io_out 'U'; output_binary_int !conn.io_out stacksize; flush !conn.io_out; -(* BACKPORT BEGIN let block = input_binary_int !conn.io_in in let offset = input_binary_int !conn.io_in in -*) - let stack_pos = input_binary_int !conn.io_in in -(* BACKPORT END *) let frag, pos = -(* BACKPORT BEGIN if block = -1 then begin assert (offset = -1); @@ -254,56 +221,31 @@ let up_frame stacksize = let pos = input_binary_int !conn.io_in in frag, pos end -*) - if stack_pos = -1 - then 0, 0 - else let frag = input_binary_int !conn.io_in in - let pos = input_binary_int !conn.io_in in - frag, pos -(* BACKPORT END *) in -(* BACKPORT BEGIN (Sp.{block; offset}, { frag; pos }) -*) - (stack_pos, { frag; pos }) -(* BACKPORT END *) (* Get and set the current frame position *) let get_frame () = output_char !conn.io_out 'f'; flush !conn.io_out; - let stack_pos = input_binary_int !conn.io_in in -(* let block = input_binary_int !conn.io_in in let offset = input_binary_int !conn.io_in in -*) let frag = input_binary_int !conn.io_in in let pos = input_binary_int !conn.io_in in -(* (Sp.{block; offset}, {frag; pos}) -*) - (stack_pos, {frag; pos}) let set_frame stack_pos = output_char !conn.io_out 'S'; -(* BACKPORT BEGIN output_binary_int !conn.io_out stack_pos.Sp.block; output_binary_int !conn.io_out stack_pos.Sp.offset -*) - output_binary_int !conn.io_out stack_pos -(* BACKPORT END *) (* Set the trap barrier to given stack position. *) let set_trap_barrier pos = output_char !conn.io_out 'b'; -(* BACKPORT BEGIN output_binary_int !conn.io_out pos.Sp.block; output_binary_int !conn.io_out pos.Sp.offset -*) - output_binary_int !conn.io_out pos -(* BACKPORT END *) (* Handling of remote values *) diff --git a/debugger/debugcom.mli b/debugger/debugcom.mli index e9d19edae1f..4e022dbf101 100644 --- a/debugger/debugcom.mli +++ b/debugger/debugcom.mli @@ -17,11 +17,7 @@ (* Low-level communication with the debuggee *) module Sp : sig -(* BACKPORT BEGIN type t -*) - type t = int -(* BACKPORT END *) val null : t val base : t -> int -> t val compare : t -> t -> int diff --git a/debugger/dune b/debugger/dune index 8e0a61738ca..a4f3e772284 100644 --- a/debugger/dune +++ b/debugger/dune @@ -17,7 +17,6 @@ (library (name ocamldebug) - (flags (:standard -principal -w -9)) (modules (:standard \ ocamldebug_entry)) (modules_without_implementation parser_aux) (libraries ocamlcommon ocamltoplevel unix dynlink_internal)) diff --git a/debugger/eval.ml b/debugger/eval.ml index 7ae3464b4ec..4656e47bc8b 100644 --- a/debugger/eval.ml +++ b/debugger/eval.ml @@ -39,7 +39,6 @@ exception Error of error let abstract_type = Btype.newgenty (Tconstr (Pident (Ident.create_local ""), [], ref Mnil)) - let get_global_or_predef id = try Debugcom.Remote_value.global (Symtable.get_global_position id) @@ -120,7 +119,10 @@ let rec expression event env = function Ttuple ty_list -> if n < 1 || n > List.length ty_list then raise(Error(Tuple_index(ty, List.length ty_list, n))) - else (Debugcom.Remote_value.field v (n-1), List.nth ty_list (n-1)) + (* CR labeled tuples: handle labels in debugger (also see "E_field" + case) *) + else (Debugcom.Remote_value.field v (n-1), + snd (List.nth ty_list (n-1))) | Tconstr(path, [ty_arg], _) when Path.same path Predef.path_array -> let size = Debugcom.Remote_value.size v in if n >= size diff --git a/debugger/frames.ml b/debugger/frames.ml index 364fa4ca71d..d590367d6d6 100644 --- a/debugger/frames.ml +++ b/debugger/frames.ml @@ -53,11 +53,7 @@ let selected_event_is_before () = let rec move_up frame_count event = if frame_count <= 0 then event else begin let (sp, pc) = up_frame event.ev_ev.ev_stacksize in -(* BACKPORT BEGIN if sp = Sp.null then raise Not_found; -*) - if sp < Sp.null then raise Not_found; -(* BACKPORT END *) move_up (frame_count - 1) (any_event_at_pc pc) end @@ -117,11 +113,7 @@ let do_backtrace action = begin try while action (Some !event) do let (sp, pc) = up_frame !event.ev_ev.ev_stacksize in -(* BACKPORT BEGIN if sp = Sp.null then raise Exit; -*) - if sp < Sp.null then raise Exit; -(* BACKPORT END *) event := any_event_at_pc pc done with Exit -> () diff --git a/debugger/loadprinter.ml b/debugger/loadprinter.ml index 558cb2c116d..0b7161515d4 100644 --- a/debugger/loadprinter.ml +++ b/debugger/loadprinter.ml @@ -40,8 +40,8 @@ let rec loadfiles ppf name = Dynlink.loadfile filename; let d = Filename.dirname name in if d <> Filename.current_dir_name then begin - if not (List.mem d (Load_path.get_paths ())) then - Load_path.add_dir d; + if not (List.mem d (Load_path.get_path_list ())) then + Load_path.add_dir ~hidden:false d; end; fprintf ppf "File %s loaded@." (if d <> Filename.current_dir_name then @@ -93,7 +93,7 @@ let eval_value_path env path = let match_printer_type desc make_printer_type = Ctype.with_local_level ~post:Ctype.generalize begin fun () -> - let ty_arg = Ctype.newvar Jkind.(value ~why:Debug_printer_argument) in + let ty_arg = Ctype.newvar (Jkind.Primitive.value ~why:Debug_printer_argument) in Ctype.unify (Lazy.force Env.initial) (make_printer_type ty_arg) (Ctype.instance desc.val_type); diff --git a/debugger/main.ml b/debugger/main.ml index b504ebeee61..006e8fd5bb7 100644 --- a/debugger/main.ml +++ b/debugger/main.ml @@ -224,7 +224,8 @@ let main () = end; if !Parameters.version then printf "\tOCaml Debugger version %s@.@." Config.version; - Load_path.init ~auto_include:Compmisc.auto_include !default_load_path; + Load_path.init ~auto_include:Compmisc.auto_include + ~visible:!default_load_path ~hidden:[]; Clflags.recursive_types := true; (* Allow recursive types. *) toplevel_loop (); (* Toplevel. *) kill_program (); diff --git a/debugger/parameters.ml b/debugger/parameters.ml index e7b84c8e295..42fc89cd68d 100644 --- a/debugger/parameters.ml +++ b/debugger/parameters.ml @@ -31,7 +31,7 @@ let time = ref true let version = ref true let add_path dir = - Load_path.add_dir dir; + Load_path.add_dir ~hidden:false dir; Envaux.reset_cache ~preserve_persistent_env:false let add_path_for mdl dir = diff --git a/debugger/program_management.ml b/debugger/program_management.ml index b4a2f2d1ec1..8f6d62bf8e4 100644 --- a/debugger/program_management.ml +++ b/debugger/program_management.ml @@ -128,8 +128,9 @@ let initialize_loading () = end; Symbols.clear_symbols (); Symbols.read_symbols Debugcom.main_frag !program_name; - let dirs = Load_path.get_paths () @ !Symbols.program_source_dirs in - Load_path.init ~auto_include:Compmisc.auto_include dirs; + let Load_path.{visible; hidden} = Load_path.get_paths () in + let visible = visible @ !Symbols.program_source_dirs in + Load_path.init ~auto_include:Compmisc.auto_include ~visible ~hidden; Envaux.reset_cache ~preserve_persistent_env:false; if !debug_loading then prerr_endline "Opening a socket..."; diff --git a/debugger/source.ml b/debugger/source.ml index b1f9b2ea767..d2045cf61b6 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -40,7 +40,7 @@ let source_of_module pos mdle = else acc) Debugger_config.load_path_for - (Load_path.get_paths ()) in + (Load_path.get_path_list ()) in let fname = pos.Lexing.pos_fname in if fname = "" then let innermost_module = diff --git a/debugger/time_travel.ml b/debugger/time_travel.ml index 7a2665d3051..b05d05767b7 100644 --- a/debugger/time_travel.ml +++ b/debugger/time_travel.ml @@ -555,11 +555,7 @@ let finish () = | Some {ev_ev={ev_stacksize}} -> set_initial_frame(); let (frame, pc) = up_frame ev_stacksize in -(* BACKPORT BEGIN if frame = Sp.null then begin -*) - if frame < Sp.null then begin -(* BACKPORT END *) prerr_endline "`finish' not meaningful in outermost frame."; raise Toplevel end; @@ -602,14 +598,9 @@ let next_1 () = | Some {ev_ev={ev_stacksize=ev_stacksize2}} -> let (frame2, _pc2) = initial_frame() in (* Call `finish' if we've entered a function. *) -(* BACKPORT BEGIN if frame1 <> Sp.null && frame2 <> Sp.null && Sp.(compare (base frame2 ev_stacksize2) (base frame1 ev_stacksize1)) > 0 -*) - if frame1 >= 0 && frame2 >= 0 && - frame2 - ev_stacksize2 > frame1 - ev_stacksize1 -(* BACKPORT END *) then finish() end @@ -632,11 +623,7 @@ let start () = | Some {ev_ev={ev_stacksize}} -> let (frame, _) = initial_frame() in let (frame', pc) = up_frame ev_stacksize in -(* BACKPORT BEGIN if frame' = Sp.null then begin -*) - if frame' < Sp.null then begin -(* BACKPORT END *) prerr_endline "`start not meaningful in outermost frame."; raise Toplevel end; @@ -658,11 +645,7 @@ let start () = step _minus1; (not !interrupted) && -(* BACKPORT BEGIN Sp.(compare (base frame' nargs) (base frame ev_stacksize)) > 0 -*) - (frame' - nargs > frame - ev_stacksize) -(* BACKPORT END *) | _ -> false do @@ -684,14 +667,9 @@ let previous_1 () = | Some {ev_ev={ev_stacksize=ev_stacksize2}} -> let (frame2, _pc2) = initial_frame() in (* Call `start' if we've entered a function. *) -(* BACKPORT BEGIN if frame1 <> Sp.null && frame2 <> Sp.null && Sp.(compare (base frame2 ev_stacksize2) (base frame1 ev_stacksize1)) > 0 -*) - if frame1 >= 0 && frame2 >= 0 && - frame2 - ev_stacksize2 > frame1 - ev_stacksize1 -(* BACKPORT END *) then start() end diff --git a/debugger4/.depend b/debugger4/.depend new file mode 100644 index 00000000000..02cebf0b018 --- /dev/null +++ b/debugger4/.depend @@ -0,0 +1,646 @@ +breakpoints.cmo : \ + symbols.cmi \ + pos.cmi \ + parameters.cmi \ + ../utils/misc.cmi \ + ../bytecomp/instruct.cmi \ + exec.cmi \ + events.cmi \ + debugger_config.cmi \ + debugcom.cmi \ + checkpoints.cmi \ + breakpoints.cmi +breakpoints.cmx : \ + symbols.cmx \ + pos.cmx \ + parameters.cmx \ + ../utils/misc.cmx \ + ../bytecomp/instruct.cmx \ + exec.cmx \ + events.cmx \ + debugger_config.cmx \ + debugcom.cmx \ + checkpoints.cmx \ + breakpoints.cmi +breakpoints.cmi : \ + events.cmi \ + debugcom.cmi +checkpoints.cmo : \ + primitives.cmi \ + int64ops.cmi \ + debugcom.cmi \ + checkpoints.cmi +checkpoints.cmx : \ + primitives.cmx \ + int64ops.cmx \ + debugcom.cmx \ + checkpoints.cmi +checkpoints.cmi : \ + primitives.cmi \ + debugcom.cmi +command_line.cmo : \ + unix_tools.cmi \ + ../otherlibs/unix/unix.cmi \ + ../typing/types.cmi \ + time_travel.cmi \ + symbols.cmi \ + source.cmi \ + show_source.cmi \ + show_information.cmi \ + question.cmi \ + program_management.cmi \ + program_loading.cmi \ + printval.cmi \ + primitives.cmi \ + pos.cmi \ + parser_aux.cmi \ + parameters.cmi \ + ../parsing/longident.cmi \ + ../parsing/location.cmi \ + loadprinter.cmi \ + ../utils/load_path.cmi \ + int64ops.cmi \ + ../bytecomp/instruct.cmi \ + input_handling.cmi \ + history.cmi \ + frames.cmi \ + events.cmi \ + eval.cmi \ + ../typing/envaux.cmi \ + ../typing/env.cmi \ + debugger_parser.cmi \ + debugger_lexer.cmi \ + debugger_config.cmi \ + debugcom.cmi \ + ../driver/compmisc.cmi \ + checkpoints.cmi \ + breakpoints.cmi \ + command_line.cmi +command_line.cmx : \ + unix_tools.cmx \ + ../otherlibs/unix/unix.cmx \ + ../typing/types.cmx \ + time_travel.cmx \ + symbols.cmx \ + source.cmx \ + show_source.cmx \ + show_information.cmx \ + question.cmx \ + program_management.cmx \ + program_loading.cmx \ + printval.cmx \ + primitives.cmx \ + pos.cmx \ + parser_aux.cmi \ + parameters.cmx \ + ../parsing/longident.cmx \ + ../parsing/location.cmx \ + loadprinter.cmx \ + ../utils/load_path.cmx \ + int64ops.cmx \ + ../bytecomp/instruct.cmx \ + input_handling.cmx \ + history.cmx \ + frames.cmx \ + events.cmx \ + eval.cmx \ + ../typing/envaux.cmx \ + ../typing/env.cmx \ + debugger_parser.cmx \ + debugger_lexer.cmx \ + debugger_config.cmx \ + debugcom.cmx \ + ../driver/compmisc.cmx \ + checkpoints.cmx \ + breakpoints.cmx \ + command_line.cmi +command_line.cmi : +debugcom.cmo : \ + primitives.cmi \ + ../utils/misc.cmi \ + int64ops.cmi \ + ../bytecomp/instruct.cmi \ + input_handling.cmi \ + debugcom.cmi +debugcom.cmx : \ + primitives.cmx \ + ../utils/misc.cmx \ + int64ops.cmx \ + ../bytecomp/instruct.cmx \ + input_handling.cmx \ + debugcom.cmi +debugcom.cmi : \ + primitives.cmi \ + ../bytecomp/instruct.cmi +debugger_config.cmo : \ + int64ops.cmi \ + debugger_config.cmi +debugger_config.cmx : \ + int64ops.cmx \ + debugger_config.cmi +debugger_config.cmi : +debugger_lexer.cmo : \ + debugger_parser.cmi \ + debugger_lexer.cmi +debugger_lexer.cmx : \ + debugger_parser.cmx \ + debugger_lexer.cmi +debugger_lexer.cmi : \ + debugger_parser.cmi +debugger_parser.cmo : \ + parser_aux.cmi \ + ../parsing/longident.cmi \ + int64ops.cmi \ + input_handling.cmi \ + debugcom.cmi \ + debugger_parser.cmi +debugger_parser.cmx : \ + parser_aux.cmi \ + ../parsing/longident.cmx \ + int64ops.cmx \ + input_handling.cmx \ + debugcom.cmx \ + debugger_parser.cmi +debugger_parser.cmi : \ + parser_aux.cmi \ + ../parsing/longident.cmi +eval.cmo : \ + ../typing/types.cmi \ + ../bytecomp/symtable.cmi \ + ../typing/subst.cmi \ + printval.cmi \ + ../typing/printtyp.cmi \ + ../typing/predef.cmi \ + ../typing/path.cmi \ + parser_aux.cmi \ + ../utils/misc.cmi \ + ../parsing/longident.cmi \ + ../bytecomp/instruct.cmi \ + ../typing/ident.cmi \ + frames.cmi \ + events.cmi \ + ../typing/env.cmi \ + debugcom.cmi \ + ../typing/ctype.cmi \ + ../utils/compilation_unit.cmi \ + ../typing/btype.cmi \ + eval.cmi +eval.cmx : \ + ../typing/types.cmx \ + ../bytecomp/symtable.cmx \ + ../typing/subst.cmx \ + printval.cmx \ + ../typing/printtyp.cmx \ + ../typing/predef.cmx \ + ../typing/path.cmx \ + parser_aux.cmi \ + ../utils/misc.cmx \ + ../parsing/longident.cmx \ + ../bytecomp/instruct.cmx \ + ../typing/ident.cmx \ + frames.cmx \ + events.cmx \ + ../typing/env.cmx \ + debugcom.cmx \ + ../typing/ctype.cmx \ + ../utils/compilation_unit.cmx \ + ../typing/btype.cmx \ + eval.cmi +eval.cmi : \ + ../typing/types.cmi \ + ../typing/path.cmi \ + parser_aux.cmi \ + ../parsing/longident.cmi \ + ../typing/ident.cmi \ + events.cmi \ + ../typing/env.cmi \ + debugcom.cmi +events.cmo : \ + ../parsing/location.cmi \ + ../bytecomp/instruct.cmi \ + events.cmi +events.cmx : \ + ../parsing/location.cmx \ + ../bytecomp/instruct.cmx \ + events.cmi +events.cmi : \ + ../bytecomp/instruct.cmi +exec.cmo : \ + exec.cmi +exec.cmx : \ + exec.cmi +exec.cmi : +frames.cmo : \ + symbols.cmi \ + ../utils/misc.cmi \ + ../bytecomp/instruct.cmi \ + events.cmi \ + debugcom.cmi \ + frames.cmi +frames.cmx : \ + symbols.cmx \ + ../utils/misc.cmx \ + ../bytecomp/instruct.cmx \ + events.cmx \ + debugcom.cmx \ + frames.cmi +frames.cmi : \ + events.cmi +history.cmo : \ + primitives.cmi \ + int64ops.cmi \ + debugger_config.cmi \ + checkpoints.cmi \ + history.cmi +history.cmx : \ + primitives.cmx \ + int64ops.cmx \ + debugger_config.cmx \ + checkpoints.cmx \ + history.cmi +history.cmi : +input_handling.cmo : \ + ../otherlibs/unix/unix.cmi \ + primitives.cmi \ + parameters.cmi \ + input_handling.cmi +input_handling.cmx : \ + ../otherlibs/unix/unix.cmx \ + primitives.cmx \ + parameters.cmx \ + input_handling.cmi +input_handling.cmi : \ + primitives.cmi +int64ops.cmo : \ + int64ops.cmi +int64ops.cmx : \ + int64ops.cmi +int64ops.cmi : +loadprinter.cmo : \ + ../typing/types.cmi \ + ../toplevel/topprinters.cmi \ + ../bytecomp/symtable.cmi \ + printval.cmi \ + ../typing/printtyp.cmi \ + ../typing/path.cmi \ + ../utils/misc.cmi \ + ../parsing/longident.cmi \ + ../utils/load_path.cmi \ + ../typing/jkind.cmi \ + ../typing/jkind_types.cmi \ + ../typing/ident.cmi \ + ../typing/env.cmi \ + ../otherlibs/dynlink/dynlink.cmi \ + ../typing/ctype.cmi \ + ../utils/compilation_unit.cmi \ + loadprinter.cmi +loadprinter.cmx : \ + ../typing/types.cmx \ + ../toplevel/topprinters.cmx \ + ../bytecomp/symtable.cmx \ + printval.cmx \ + ../typing/printtyp.cmx \ + ../typing/path.cmx \ + ../utils/misc.cmx \ + ../parsing/longident.cmx \ + ../utils/load_path.cmx \ + ../typing/jkind.cmx \ + ../typing/jkind_types.cmx \ + ../typing/ident.cmx \ + ../typing/env.cmx \ + ../otherlibs/dynlink/dynlink.cmx \ + ../typing/ctype.cmx \ + ../utils/compilation_unit.cmx \ + loadprinter.cmi +loadprinter.cmi : \ + ../parsing/longident.cmi \ + ../otherlibs/dynlink/dynlink.cmi +main.cmo : \ + unix_tools.cmi \ + ../otherlibs/unix/unix.cmi \ + time_travel.cmi \ + show_information.cmi \ + question.cmi \ + program_management.cmi \ + primitives.cmi \ + ../typing/persistent_env.cmi \ + parameters.cmi \ + ../utils/misc.cmi \ + ../utils/load_path.cmi \ + input_handling.cmi \ + frames.cmi \ + exec.cmi \ + debugger_config.cmi \ + ../utils/config.cmi \ + ../driver/compmisc.cmi \ + command_line.cmi \ + ../file_formats/cmi_format.cmi \ + ../utils/clflags.cmi \ + checkpoints.cmi +main.cmx : \ + unix_tools.cmx \ + ../otherlibs/unix/unix.cmx \ + time_travel.cmx \ + show_information.cmx \ + question.cmx \ + program_management.cmx \ + primitives.cmx \ + ../typing/persistent_env.cmx \ + parameters.cmx \ + ../utils/misc.cmx \ + ../utils/load_path.cmx \ + input_handling.cmx \ + frames.cmx \ + exec.cmx \ + debugger_config.cmx \ + ../utils/config.cmx \ + ../driver/compmisc.cmx \ + command_line.cmx \ + ../file_formats/cmi_format.cmx \ + ../utils/clflags.cmx \ + checkpoints.cmx +ocamldebug_entry.cmo : \ + ../otherlibs/unix/unix.cmi +ocamldebug_entry.cmx : \ + ../otherlibs/unix/unix.cmx +parameters.cmo : \ + ../utils/load_path.cmi \ + ../typing/envaux.cmi \ + debugger_config.cmi \ + ../utils/config.cmi \ + parameters.cmi +parameters.cmx : \ + ../utils/load_path.cmx \ + ../typing/envaux.cmx \ + debugger_config.cmx \ + ../utils/config.cmx \ + parameters.cmi +parameters.cmi : +parser_aux.cmi : \ + ../parsing/longident.cmi \ + debugcom.cmi +pos.cmo : \ + ../parsing/location.cmi \ + ../bytecomp/instruct.cmi \ + events.cmi \ + pos.cmi +pos.cmx : \ + ../parsing/location.cmx \ + ../bytecomp/instruct.cmx \ + events.cmx \ + pos.cmi +pos.cmi : \ + events.cmi +primitives.cmo : \ + ../otherlibs/unix/unix.cmi \ + primitives.cmi +primitives.cmx : \ + ../otherlibs/unix/unix.cmx \ + primitives.cmi +primitives.cmi : \ + ../otherlibs/unix/unix.cmi +printval.cmo : \ + ../typing/types.cmi \ + ../bytecomp/symtable.cmi \ + ../typing/printtyp.cmi \ + parser_aux.cmi \ + ../typing/outcometree.cmi \ + ../typing/oprint.cmi \ + ../toplevel/genprintval.cmi \ + ../typing/env.cmi \ + debugcom.cmi \ + ../utils/compilation_unit.cmi \ + printval.cmi +printval.cmx : \ + ../typing/types.cmx \ + ../bytecomp/symtable.cmx \ + ../typing/printtyp.cmx \ + parser_aux.cmi \ + ../typing/outcometree.cmi \ + ../typing/oprint.cmx \ + ../toplevel/genprintval.cmx \ + ../typing/env.cmx \ + debugcom.cmx \ + ../utils/compilation_unit.cmx \ + printval.cmi +printval.cmi : \ + ../typing/types.cmi \ + ../typing/path.cmi \ + parser_aux.cmi \ + ../typing/env.cmi \ + debugcom.cmi +program_loading.cmo : \ + unix_tools.cmi \ + ../otherlibs/unix/unix.cmi \ + primitives.cmi \ + parameters.cmi \ + input_handling.cmi \ + debugger_config.cmi \ + program_loading.cmi +program_loading.cmx : \ + unix_tools.cmx \ + ../otherlibs/unix/unix.cmx \ + primitives.cmx \ + parameters.cmx \ + input_handling.cmx \ + debugger_config.cmx \ + program_loading.cmi +program_loading.cmi : \ + primitives.cmi +program_management.cmo : \ + unix_tools.cmi \ + ../otherlibs/unix/unix.cmi \ + time_travel.cmi \ + symbols.cmi \ + question.cmi \ + program_loading.cmi \ + primitives.cmi \ + parameters.cmi \ + ../utils/load_path.cmi \ + int64ops.cmi \ + input_handling.cmi \ + history.cmi \ + ../typing/envaux.cmi \ + debugger_config.cmi \ + debugcom.cmi \ + ../driver/compmisc.cmi \ + breakpoints.cmi \ + program_management.cmi +program_management.cmx : \ + unix_tools.cmx \ + ../otherlibs/unix/unix.cmx \ + time_travel.cmx \ + symbols.cmx \ + question.cmx \ + program_loading.cmx \ + primitives.cmx \ + parameters.cmx \ + ../utils/load_path.cmx \ + int64ops.cmx \ + input_handling.cmx \ + history.cmx \ + ../typing/envaux.cmx \ + debugger_config.cmx \ + debugcom.cmx \ + ../driver/compmisc.cmx \ + breakpoints.cmx \ + program_management.cmi +program_management.cmi : +question.cmo : \ + primitives.cmi \ + input_handling.cmi \ + debugger_lexer.cmi \ + question.cmi +question.cmx : \ + primitives.cmx \ + input_handling.cmx \ + debugger_lexer.cmx \ + question.cmi +question.cmi : +show_information.cmo : \ + symbols.cmi \ + source.cmi \ + show_source.cmi \ + printval.cmi \ + parameters.cmi \ + ../utils/misc.cmi \ + ../bytecomp/instruct.cmi \ + frames.cmi \ + events.cmi \ + debugcom.cmi \ + checkpoints.cmi \ + breakpoints.cmi \ + show_information.cmi +show_information.cmx : \ + symbols.cmx \ + source.cmx \ + show_source.cmx \ + printval.cmx \ + parameters.cmx \ + ../utils/misc.cmx \ + ../bytecomp/instruct.cmx \ + frames.cmx \ + events.cmx \ + debugcom.cmx \ + checkpoints.cmx \ + breakpoints.cmx \ + show_information.cmi +show_information.cmi : \ + events.cmi +show_source.cmo : \ + source.cmi \ + primitives.cmi \ + parameters.cmi \ + ../parsing/location.cmi \ + ../bytecomp/instruct.cmi \ + events.cmi \ + debugger_config.cmi \ + show_source.cmi +show_source.cmx : \ + source.cmx \ + primitives.cmx \ + parameters.cmx \ + ../parsing/location.cmx \ + ../bytecomp/instruct.cmx \ + events.cmx \ + debugger_config.cmx \ + show_source.cmi +show_source.cmi : \ + ../bytecomp/instruct.cmi +source.cmo : \ + primitives.cmi \ + ../utils/misc.cmi \ + ../utils/load_path.cmi \ + debugger_config.cmi \ + source.cmi +source.cmx : \ + primitives.cmx \ + ../utils/misc.cmx \ + ../utils/load_path.cmx \ + debugger_config.cmx \ + source.cmi +source.cmi : +symbols.cmo : \ + ../bytecomp/symtable.cmi \ + program_loading.cmi \ + ../utils/misc.cmi \ + ../bytecomp/instruct.cmi \ + events.cmi \ + debugger_config.cmi \ + debugcom.cmi \ + checkpoints.cmi \ + ../bytecomp/bytesections.cmi \ + symbols.cmi +symbols.cmx : \ + ../bytecomp/symtable.cmx \ + program_loading.cmx \ + ../utils/misc.cmx \ + ../bytecomp/instruct.cmx \ + events.cmx \ + debugger_config.cmx \ + debugcom.cmx \ + checkpoints.cmx \ + ../bytecomp/bytesections.cmx \ + symbols.cmi +symbols.cmi : \ + ../bytecomp/instruct.cmi \ + events.cmi \ + debugcom.cmi +time_travel.cmo : \ + trap_barrier.cmi \ + symbols.cmi \ + question.cmi \ + program_loading.cmi \ + primitives.cmi \ + ../utils/misc.cmi \ + int64ops.cmi \ + ../bytecomp/instruct.cmi \ + input_handling.cmi \ + exec.cmi \ + events.cmi \ + debugger_config.cmi \ + debugcom.cmi \ + checkpoints.cmi \ + breakpoints.cmi \ + time_travel.cmi +time_travel.cmx : \ + trap_barrier.cmx \ + symbols.cmx \ + question.cmx \ + program_loading.cmx \ + primitives.cmx \ + ../utils/misc.cmx \ + int64ops.cmx \ + ../bytecomp/instruct.cmx \ + input_handling.cmx \ + exec.cmx \ + events.cmx \ + debugger_config.cmx \ + debugcom.cmx \ + checkpoints.cmx \ + breakpoints.cmx \ + time_travel.cmi +time_travel.cmi : \ + primitives.cmi +trap_barrier.cmo : \ + exec.cmi \ + debugcom.cmi \ + checkpoints.cmi \ + trap_barrier.cmi +trap_barrier.cmx : \ + exec.cmx \ + debugcom.cmx \ + checkpoints.cmx \ + trap_barrier.cmi +trap_barrier.cmi : \ + debugcom.cmi +unix_tools.cmo : \ + ../otherlibs/unix/unix.cmi \ + ../utils/misc.cmi \ + unix_tools.cmi +unix_tools.cmx : \ + ../otherlibs/unix/unix.cmx \ + ../utils/misc.cmx \ + unix_tools.cmi +unix_tools.cmi : \ + ../otherlibs/unix/unix.cmi diff --git a/debugger4/Makefile b/debugger4/Makefile new file mode 100644 index 00000000000..0b2b877b47e --- /dev/null +++ b/debugger4/Makefile @@ -0,0 +1,92 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Xavier Leroy, projet Cristal, INRIA Rocquencourt * +#* * +#* Copyright 1999 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. * +#* * +#************************************************************************** + +ROOTDIR = .. + +include $(ROOTDIR)/Makefile.common +include $(ROOTDIR)/Makefile.best_binaries + +DYNLINKDIR=$(ROOTDIR)/otherlibs/dynlink +UNIXDIR=$(ROOTDIR)/otherlibs/unix + +CAMLC=$(BEST_OCAMLC) $(STDLIBFLAGS) +COMPFLAGS=$(INCLUDES) -absname -w +a-4-9-41-42-44-45-48-70 -warn-error +A \ + -strict-sequence -strict-formats +LINKFLAGS=-linkall -I $(UNIXDIR) -I $(DYNLINKDIR) +OC_OCAMLDEPDIRS = $(DIRECTORIES) + +DIRECTORIES=$(UNIXDIR) $(DYNLINKDIR) $(addprefix $(ROOTDIR)/,\ + utils parsing typing bytecomp toplevel driver file_formats lambda) + +INCLUDES=$(addprefix -I ,$(DIRECTORIES)) + +compiler_modules := $(addprefix $(ROOTDIR)/toplevel/,\ + genprintval topprinters) + +debugger_modules := \ + int64ops primitives unix_tools debugger_config parameters debugger_lexer \ + input_handling question debugcom exec source pos checkpoints events \ + program_loading symbols breakpoints trap_barrier history printval \ + show_source time_travel program_management frames eval \ + show_information loadprinter debugger_parser command_line main + +compiler_objects := $(addsuffix .cmo,$(compiler_modules)) + +debugger_objects := $(addsuffix .cmo,$(debugger_modules)) + +libraries = $(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(UNIXDIR)/unix.cma $(DYNLINKDIR)/dynlink.cma + +all: ocamldebug$(EXE) + +ocamldebug.cmo: $(debugger_objects) + $(V_OCAMLC)$(CAMLC) -pack $(COMPFLAGS) -o $@ $^ + +ocamldebug$(EXE): $(libraries) $(compiler_objects) ocamldebug.cmo \ + ocamldebug_entry.cmo + $(V_LINKC)$(CAMLC) $(LINKFLAGS) -o $@ -linkall $^ + +install: + $(INSTALL_PROG) ocamldebug$(EXE) "$(INSTALL_BINDIR)" + +.PHONY: clean +clean:: + rm -f ocamldebug ocamldebug.exe + rm -f *.cmo *.cmi + +.PHONY: distclean +distclean: clean + +ocamldebug_entry.cmo: ocamldebug_entry.ml ocamldebug.cmo + $(V_OCAMLC)$(CAMLC) -c $(COMPFLAGS) $< + +%.cmo: %.ml + $(V_OCAMLC)$(CAMLC) -c $(COMPFLAGS) -for-pack ocamldebug $< + +%.cmi: %.mli + $(V_OCAMLC)$(CAMLC) -c $(COMPFLAGS) -for-pack ocamldebug $< + +depend: beforedepend + $(V_OCAMLDEP)$(OCAMLDEP_CMD) *.mli *.ml > .depend + +clean:: + rm -f debugger_lexer.ml +beforedepend:: debugger_lexer.ml + +clean:: + rm -f $(addprefix debugger_parser.,ml mli output) +beforedepend:: debugger_parser.ml debugger_parser.mli + +include .depend diff --git a/debugger4/breakpoints.ml b/debugger4/breakpoints.ml new file mode 100644 index 00000000000..60059fcdbd1 --- /dev/null +++ b/debugger4/breakpoints.ml @@ -0,0 +1,209 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(******************************* Breakpoints ***************************) + +open Checkpoints +open Debugcom +open Instruct +open Events +open Printf + +(*** Debugging. ***) +let debug_breakpoints = ref false + +(*** Data. ***) + +(* Number of the last added breakpoint. *) +let breakpoint_number = ref 0 + +(* Breakpoint number -> event. *) +type breakpoint_id = int +let breakpoints = ref ([] : (breakpoint_id * code_event) list) + +(* Program counter -> breakpoint count. *) +let positions = ref ([] : (pc * int ref) list) + +(* Versions of the breakpoint list. *) +let current_version = ref 0 +let max_version = ref 0 + +(*** Miscellaneous. ***) + +(* Mark breakpoints as installed in current checkpoint. *) +let copy_breakpoints () = + !current_checkpoint.c_breakpoints <- !positions; + !current_checkpoint.c_breakpoint_version <- !current_version + +(* Announce a new version of the breakpoint list. *) +let new_version () = + incr max_version; + current_version := !max_version + +(*** Information about breakpoints. ***) + +let breakpoints_count () = + List.length !breakpoints + +(* List of breakpoints at `pc'. *) +let rec breakpoints_at_pc pc = + begin match Symbols.event_at_pc pc with + | {ev_frag = frag; ev_ev = {ev_repr = Event_child {contents = pos}}} -> + breakpoints_at_pc {frag; pos} + | _ -> [] + | exception Not_found -> [] + end + @ + List.map fst (List.filter + (function (_, {ev_frag = frag; ev_ev = {ev_pos = pos}}) -> + {frag; pos} = pc) + !breakpoints) + +(* Is there a breakpoint at `pc' ? *) +let breakpoint_at_pc pc = + breakpoints_at_pc pc <> [] + +(*** Set and remove breakpoints ***) + +let print_pc out {frag;pos} = fprintf out "%d:%d" frag pos + +(* Remove all breakpoints. *) +let remove_breakpoints pcs = + if !debug_breakpoints then + printf "Removing breakpoints...\n%!"; + List.iter + (function (pc, _) -> + if !debug_breakpoints then printf "%a\n%!" print_pc pc; + reset_instr pc; + Symbols.set_event_at_pc pc) + pcs + +(* Set all breakpoints. *) +let set_breakpoints pcs = + if !debug_breakpoints then + printf "Setting breakpoints...\n%!"; + List.iter + (function (pc, _) -> + if !debug_breakpoints then printf "%a\n%!" print_pc pc; + set_breakpoint pc) + pcs + +(* Ensure the current version is installed in current checkpoint. *) +let update_breakpoints () = + if !debug_breakpoints then begin + prerr_string "Updating breakpoints... "; + prerr_int !current_checkpoint.c_breakpoint_version; + prerr_string " "; + prerr_int !current_version; + prerr_endline "" + end; + if !current_checkpoint.c_breakpoint_version <> !current_version then + Exec.protect + (function () -> + remove_breakpoints !current_checkpoint.c_breakpoints; + set_breakpoints !positions; + copy_breakpoints ()) + +(* Execute given function with no breakpoint in current checkpoint. *) +(* --- `goto' runs faster this way (does not stop on each breakpoint). *) +let execute_without_breakpoints f = + Misc.protect_refs [Misc.R (Debugger_config.break_on_load, false); + Misc.R (current_version, 0); + Misc.R (positions, []); + Misc.R (breakpoints, []); + Misc.R (breakpoint_number, 0)] + f + +(* Add a position in the position list. *) +(* Change version if necessary. *) +let insert_position pos = + try + incr (List.assoc pos !positions) + with + Not_found -> + positions := (pos, ref 1) :: !positions; + new_version () + +(* Remove a position in the position list. *) +(* Change version if necessary. *) +let remove_position pos = + let count = List.assoc pos !positions in + decr count; + if !count = 0 then begin + positions := List.remove_assoc pos !positions; + new_version () + end + +(* Insert a new breakpoint in lists. *) +let rec new_breakpoint event = + match event with + {ev_frag=frag; ev_ev={ev_repr=Event_child pos}} -> + new_breakpoint (Symbols.any_event_at_pc {frag; pos=(!pos)}) + | {ev_frag=frag; ev_ev={ev_pos=pos}} -> + let pc = {frag; pos} in + Exec.protect + (function () -> + incr breakpoint_number; + insert_position pc; + breakpoints := (!breakpoint_number, event) :: !breakpoints); + if !Parameters.breakpoint then + printf "Breakpoint %d at %a: %s\n%!" !breakpoint_number print_pc pc + (Pos.get_desc event) + +(* Remove a breakpoint from lists. *) +let remove_breakpoint number = + try + let ev = List.assoc number !breakpoints in + let pc = {frag = ev.ev_frag; pos=ev.ev_ev.ev_pos} in + Exec.protect + (function () -> + breakpoints := List.remove_assoc number !breakpoints; + remove_position pc; + if !Parameters.breakpoint then + printf "Removed breakpoint %d at %a: %s\n%!" number print_pc pc + (Pos.get_desc ev)) + with + Not_found -> + prerr_endline ("No breakpoint number " ^ (Int.to_string number) ^ "."); + raise Not_found + +let remove_all_breakpoints () = + List.iter (function (number, _) -> remove_breakpoint number) !breakpoints + +(*** Temporary breakpoints. ***) + +(* Temporary breakpoint position. *) +let temporary_breakpoint_position = ref (None : pc option) + +(* Execute `funct' with a breakpoint added at `pc'. *) +(* --- Used by `finish'. *) +let exec_with_temporary_breakpoint pc funct = + let previous_version = !current_version in + let remove () = + temporary_breakpoint_position := None; + current_version := previous_version; + let count = List.assoc pc !positions in + decr count; + if !count = 0 then begin + positions := List.remove_assoc pc !positions; + reset_instr pc; + Symbols.set_event_at_pc pc + end + + in + Exec.protect (function () -> insert_position pc); + temporary_breakpoint_position := Some pc; + Fun.protect ~finally:(fun () -> Exec.protect remove) funct diff --git a/debugger4/breakpoints.mli b/debugger4/breakpoints.mli new file mode 100644 index 00000000000..d26d9b241f7 --- /dev/null +++ b/debugger4/breakpoints.mli @@ -0,0 +1,60 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(******************************* Breakpoints ***************************) + +(*** Debugging. ***) +val debug_breakpoints : bool ref + +(*** Information about breakpoints. ***) + +val breakpoints_count : unit -> int + +(* Breakpoint number -> code_event. *) +type breakpoint_id = int +val breakpoints : (breakpoint_id * Events.code_event) list ref + +(* Is there a breakpoint at `pc' ? *) +val breakpoint_at_pc : Debugcom.pc -> bool + +(* List of breakpoints at `pc'. *) +val breakpoints_at_pc : Debugcom.pc -> breakpoint_id list + +(*** Set and remove breakpoints ***) + +(* Ensure the current version is installed in current checkpoint. *) +val update_breakpoints : unit -> unit + +(* Execute given function with no breakpoint in current checkpoint. *) +(* --- `goto' run faster so (does not stop on each breakpoint). *) +val execute_without_breakpoints : (unit -> unit) -> unit + +(* Insert a new breakpoint in lists. *) +val new_breakpoint : Events.code_event -> unit + +(* Remove a breakpoint from lists. *) +val remove_breakpoint : breakpoint_id -> unit + +val remove_all_breakpoints : unit -> unit + +(*** Temporary breakpoints. ***) + +(* Temporary breakpoint position. *) +val temporary_breakpoint_position : Debugcom.pc option ref + +(* Execute `funct' with a breakpoint added at `pc'. *) +(* --- Used by `finish'. *) +val exec_with_temporary_breakpoint : Debugcom.pc -> (unit -> unit) -> unit diff --git a/debugger4/checkpoints.ml b/debugger4/checkpoints.ml new file mode 100644 index 00000000000..5b72d8c6b59 --- /dev/null +++ b/debugger4/checkpoints.ml @@ -0,0 +1,90 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(*************************** Checkpoints *******************************) + +open Int64ops +open Debugcom +open Primitives + +(*** A type for checkpoints. ***) + +type checkpoint_state = + C_stopped + | C_running of int64 + +(* `c_valid' is true if and only if the corresponding + * process is connected to the debugger. + * `c_parent' is the checkpoint whose process is parent + * of the checkpoint one (`root' if no parent). + * c_pid = -2 for root pseudo-checkpoint. + * c_pid = 0 for ghost checkpoints. + * c_pid = -1 for kill checkpoints. + *) +type checkpoint = { + mutable c_time : int64; + mutable c_pid : int; + mutable c_fd : io_channel; + mutable c_valid : bool; + mutable c_report : report option; + mutable c_state : checkpoint_state; + mutable c_parent : checkpoint; + mutable c_breakpoint_version : int; + mutable c_breakpoints : (pc * int ref) list; + mutable c_trap_barrier : Sp.t; + mutable c_code_fragments : int list + } + +(*** Pseudo-checkpoint `root'. ***) +(* --- Parents of all checkpoints which have no parent. *) +let rec root = { + c_time = _0; + c_pid = -2; + c_fd = std_io; + c_valid = false; + c_report = None; + c_state = C_stopped; + c_parent = root; + c_breakpoint_version = 0; + c_breakpoints = []; + c_trap_barrier = Sp.null; + c_code_fragments = [main_frag] + } + +(*** Current state ***) +let checkpoints = + ref ([] : checkpoint list) + +let current_checkpoint = + ref root + +let current_time () = + !current_checkpoint.c_time + +let current_report () = + !current_checkpoint.c_report + +let current_pc_sp () = + (* This pattern matching mimics the test used in debugger.c for + deciding whether or not PC/SP should be sent with the report. + See debugger.c, the [if] statement above the [command_loop] + label. *) + match current_report () with + | Some {rep_type = Event | Breakpoint; + rep_program_pointer = pc; rep_stack_pointer = sp } -> Some (pc, sp) + | _ -> None + +let current_pc () = Option.map fst (current_pc_sp ()) diff --git a/debugger4/checkpoints.mli b/debugger4/checkpoints.mli new file mode 100644 index 00000000000..81b0e055850 --- /dev/null +++ b/debugger4/checkpoints.mli @@ -0,0 +1,60 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(***************************** Checkpoints *****************************) + +open Primitives +open Debugcom + +(*** A type for checkpoints. ***) + +type checkpoint_state = + C_stopped + | C_running of int64 + +(* `c_valid' is true if and only if the corresponding + * process is connected to the debugger. + * `c_parent' is the checkpoint whose process is parent + * of the checkpoint one (`root' if no parent). + * c_pid = 2 for root pseudo-checkpoint. + * c_pid = 0 for ghost checkpoints. + * c_pid = -1 for kill checkpoints. + *) +type checkpoint = + {mutable c_time : int64; + mutable c_pid : int; + mutable c_fd : io_channel; + mutable c_valid : bool; + mutable c_report : report option; + mutable c_state : checkpoint_state; + mutable c_parent : checkpoint; + mutable c_breakpoint_version : int; + mutable c_breakpoints : (pc * int ref) list; + mutable c_trap_barrier : Sp.t; + mutable c_code_fragments : int list} + +(*** Pseudo-checkpoint `root'. ***) +(* --- Parents of all checkpoints which have no parent. *) +val root : checkpoint + +(*** Current state ***) +val checkpoints : checkpoint list ref +val current_checkpoint : checkpoint ref + +val current_time : unit -> int64 +val current_report : unit -> report option +val current_pc : unit -> pc option +val current_pc_sp : unit -> (pc * Sp.t) option diff --git a/debugger4/command_line.ml b/debugger4/command_line.ml new file mode 100644 index 00000000000..43f4a95f402 --- /dev/null +++ b/debugger4/command_line.ml @@ -0,0 +1,1243 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(************************ Reading and executing commands ***************) + +open Int64ops +open Format +open Instruct +open Unix +open Debugger_config +open Types +open Primitives +open Unix_tools +open Debugger_parser +open Parser_aux +open Debugger_lexer +open Input_handling +open Question +open Debugcom +open Program_loading +open Program_management +open Lexing +open Parameters +open Show_source +open Show_information +open Time_travel +open Events +open Symbols +open Source +open Breakpoints +open Checkpoints +open Frames +open Printval + +module Lexer = Debugger_lexer + +(** Instructions, variables and infos lists. **) +type dbg_instruction = + { instr_name: string; (* Name of command *) + instr_prio: bool; (* Has priority *) + instr_action: formatter -> lexbuf -> unit; + (* What to do *) + instr_repeat: bool; (* Can be repeated *) + instr_help: string } (* Help message *) + +let instruction_list = ref ([] : dbg_instruction list) + +type dbg_variable = + { var_name: string; (* Name of variable *) + var_action: (lexbuf -> unit) * (formatter -> unit); + (* Reading, writing fns *) + var_help: string } (* Help message *) + +let variable_list = ref ([] : dbg_variable list) + +type dbg_info = + { info_name: string; (* Name of info *) + info_action: lexbuf -> unit; (* What to do *) + info_help: string } (* Help message *) + +let info_list = ref ([] : dbg_info list) + +(** Utilities. **) +let error text = + eprintf "%s@." text; + raise Toplevel + +let check_not_windows feature = + match Sys.os_type with + | "Win32" -> + error ("\'"^feature^"\' feature not supported on Windows") + | _ -> + () + +let eol = + end_of_line Lexer.lexeme + +let matching_elements list name instr = + List.filter (function a -> isprefix instr (name a)) !list + +let all_matching_instructions = + matching_elements instruction_list (fun i -> i.instr_name) + +(* itz 04-21-96 don't do priority completion in emacs mode *) +(* XL 25-02-97 why? I find it very confusing. *) + +let matching_instructions instr = + let all = all_matching_instructions instr in + let prio = List.filter (fun i -> i.instr_prio) all in + if prio = [] then all else prio + +let matching_variables = + matching_elements variable_list (fun v -> v.var_name) + +let matching_infos = + matching_elements info_list (fun i -> i.info_name) + +let find_ident name matcher action alternative ppf lexbuf = + match identifier_or_eol Lexer.lexeme lexbuf with + | None -> alternative ppf + | Some ident -> + match matcher ident with + | [] -> error ("Unknown " ^ name ^ ".") + | [a] -> action a ppf lexbuf + | _ -> error ("Ambiguous " ^ name ^ ".") + +let find_variable action alternative ppf lexbuf = + find_ident "variable name" matching_variables action alternative ppf lexbuf + +let find_info action alternative ppf lexbuf = + find_ident "info command" matching_infos action alternative ppf lexbuf + +let add_breakpoint_at_pc pc = + try + new_breakpoint (any_event_at_pc pc) + with + | Not_found -> + eprintf "Can\'t add breakpoint at pc %i:%i: no event there.@." + pc.frag pc.pos; + raise Toplevel + +let add_breakpoint_after_pc pc = + let rec try_add n = + if n < 3 then begin + try + new_breakpoint (any_event_at_pc {pc with pos = pc.pos + n * 4}) + with + | Not_found -> + try_add (n+1) + end else begin + error + "Can\'t add breakpoint at beginning of function: no event there" + end + in try_add 0 + +let module_of_longident id = + match id with + | Some x -> Some (String.concat "." (Longident.flatten x)) + | None -> None + +let convert_module mdle = + match mdle with + | Some m -> + (* Strip .ml extension if any, and capitalize *) + String.capitalize_ascii(if Filename.check_suffix m ".ml" + then Filename.chop_suffix m ".ml" + else m) + | None -> + try (get_current_event ()).ev_ev.ev_module + with Not_found -> error "Not in a module." + +(** Toplevel. **) +let current_line = ref "" + +let interprete_line ppf line = + current_line := line; + let lexbuf = Lexing.from_string line in + try + match identifier_or_eol Lexer.lexeme lexbuf with + | Some x -> + begin match matching_instructions x with + | [] -> + error "Unknown command." + | [i] -> + i.instr_action ppf lexbuf; + resume_user_input (); + i.instr_repeat + | _ -> + error "Ambiguous command." + end + | None -> + resume_user_input (); + false + with + | Parsing.Parse_error -> + error "Syntax error." + | Lexer.Int_overflow -> + error "Integer overflow" + +let line_loop ppf line_buffer = + resume_user_input (); + let previous_line = ref "" in + try + while true do + if !loaded then + History.add_current_time (); + let new_line = string_trim (line line_buffer) in + let line = + if new_line <> "" then + new_line + else + !previous_line + in + previous_line := ""; + if interprete_line ppf line && !interactif then + previous_line := line + done + with + | Exit -> + () +(* | Sys_error s -> + error ("System error: " ^ s) *) + +(** Instructions. **) +let instr_cd _ppf lexbuf = + let dir = argument_eol argument lexbuf in + if ask_kill_program () then + try + Sys.chdir (expand_path dir) + with + | Sys_error s -> + error s + +let instr_shell _ppf lexbuf = + let cmdarg = argument_list_eol argument lexbuf in + let cmd = String.concat " " cmdarg in + (* perhaps we should use $SHELL -c ? *) + let err = Sys.command cmd in + if (err != 0) then + eprintf "Shell command %S failed with exit code %d\n%!" cmd err + +let instr_env _ppf lexbuf = + let cmdarg = argument_list_eol argument lexbuf in + let cmdarg = string_trim (String.concat " " cmdarg) in + if cmdarg <> "" then + if ask_kill_program () then begin + try + let eqpos = String.index cmdarg '=' in + if eqpos = 0 then raise Not_found; + let name = String.sub cmdarg 0 eqpos in + let value = + String.sub cmdarg (eqpos + 1) (String.length cmdarg - eqpos - 1) + in + Debugger_config.environment := + (name, value) :: List.remove_assoc name !Debugger_config.environment + with Not_found -> + eprintf "Environment variable must be in name=value format\n%!" + end + else + List.iter + (fun (vvar, vval) -> printf "%s=%s\n%!" vvar vval) + (List.rev !Debugger_config.environment) + +let instr_pwd ppf lexbuf = + eol lexbuf; + fprintf ppf "%s@." (Sys.getcwd ()) + +let instr_dir ppf lexbuf = + let new_directory = argument_list_eol argument lexbuf in + if new_directory = [] then begin + if yes_or_no "Reinitialize directory list" then begin + Load_path.init ~auto_include:Compmisc.auto_include + ~visible:!default_load_path ~hidden:[]; + Envaux.reset_cache ~preserve_persistent_env:false; + Hashtbl.clear Debugger_config.load_path_for; + flush_buffer_list () + end + end + else begin + let new_directory' = List.rev new_directory in + match new_directory' with + | mdl :: for_keyw :: tl + when String.lowercase_ascii for_keyw = "for" && List.length tl > 0 -> + List.iter (function x -> add_path_for mdl (expand_path x)) tl + | _ -> + List.iter (function x -> add_path (expand_path x)) new_directory' + end; + let print_dirs ppf l = List.iter (function x -> fprintf ppf "@ %s" x) l in + fprintf ppf "@[<2>Directories: %a@]@." print_dirs + (Load_path.get_path_list ()); + Hashtbl.iter + (fun mdl dirs -> + fprintf ppf "@[<2>Source directories for %s: %a@]@." mdl print_dirs + dirs) + Debugger_config.load_path_for + +let instr_kill _ppf lexbuf = + eol lexbuf; + if not !loaded then error "The program is not being run."; + if (yes_or_no "Kill the program being debugged") then begin + kill_program (); + show_no_point() + end + +let instr_pid ppf lexbuf = + eol lexbuf; + if not !loaded then error "The program is not being run."; + fprintf ppf "@[%d@]@." !current_checkpoint.c_pid + +let instr_run ppf lexbuf = + eol lexbuf; + ensure_loaded (); + reset_named_values (); + run (); + show_current_event ppf + +let instr_reverse ppf lexbuf = + eol lexbuf; + check_not_windows "reverse"; + ensure_loaded (); + reset_named_values(); + back_run (); + show_current_event ppf + +let instr_step ppf lexbuf = + let step_count = + match opt_signed_int64_eol Lexer.lexeme lexbuf with + | None -> _1 + | Some x -> x + in + ensure_loaded (); + reset_named_values(); + step step_count; + show_current_event ppf + +let instr_back ppf lexbuf = + let step_count = + match opt_signed_int64_eol Lexer.lexeme lexbuf with + | None -> _1 + | Some x -> x + in + check_not_windows "backstep"; + ensure_loaded (); + reset_named_values(); + step (_0 -- step_count); + show_current_event ppf + +let instr_finish ppf lexbuf = + eol lexbuf; + ensure_loaded (); + reset_named_values(); + finish (); + show_current_event ppf + +let instr_next ppf lexbuf = + let step_count = + match opt_integer_eol Lexer.lexeme lexbuf with + | None -> 1 + | Some x -> x + in + ensure_loaded (); + reset_named_values(); + next step_count; + show_current_event ppf + +let instr_start ppf lexbuf = + eol lexbuf; + check_not_windows "start"; + ensure_loaded (); + reset_named_values(); + start (); + show_current_event ppf + +let instr_previous ppf lexbuf = + let step_count = + match opt_integer_eol Lexer.lexeme lexbuf with + | None -> 1 + | Some x -> x + in + check_not_windows "previous"; + ensure_loaded (); + reset_named_values(); + previous step_count; + show_current_event ppf + +let instr_goto ppf lexbuf = + let time = int64_eol Lexer.lexeme lexbuf in + ensure_loaded (); + reset_named_values(); + go_to time; + show_current_event ppf + +let instr_quit _ = + raise Exit + +let print_variable_list ppf = + let pr_vars ppf = List.iter (fun v -> fprintf ppf "%s@ " v.var_name) in + fprintf ppf "List of variables: %a@." pr_vars !variable_list + +let print_info_list ppf = + let pr_infos ppf = List.iter (fun i -> fprintf ppf "%s@ " i.info_name) in + fprintf ppf "List of info commands: %a@." pr_infos !info_list + +let instr_complete _ppf lexbuf = + let ppf = Format.err_formatter in + let rec print_list l = + try + eol lexbuf; + List.iter (function i -> fprintf ppf "%s@." i) l + with _ -> + remove_file !user_channel + and match_list lexbuf = + match identifier_or_eol Lexer.lexeme lexbuf with + | None -> + List.map (fun i -> i.instr_name) !instruction_list + | Some x -> + match matching_instructions x with + | [ {instr_name = ("set" | "show" as i_full)} ] -> + if x = i_full then begin + match identifier_or_eol Lexer.lexeme lexbuf with + | Some ident -> + begin match matching_variables ident with + | [v] -> if v.var_name = ident then [] else [v.var_name] + | l -> List.map (fun v -> v.var_name) l + end + | None -> + List.map (fun v -> v.var_name) !variable_list + end + else [i_full] + | [ {instr_name = "info"} ] -> + if x = "info" then begin + match identifier_or_eol Lexer.lexeme lexbuf with + | Some ident -> + begin match matching_infos ident with + | [i] -> if i.info_name = ident then [] else [i.info_name] + | l -> List.map (fun i -> i.info_name) l + end + | None -> + List.map (fun i -> i.info_name) !info_list + end + else ["info"] + | [ {instr_name = "help"} ] -> + if x = "help" then match_list lexbuf else ["help"] + | [ i ] -> + if x = i.instr_name then [] else [i.instr_name] + | l -> + List.map (fun i -> i.instr_name) l + in + print_list(match_list lexbuf) + +let instr_help ppf lexbuf = + let pr_instrs ppf = + List.iter (fun i -> fprintf ppf "%s@ " i.instr_name) in + match identifier_or_eol Lexer.lexeme lexbuf with + | Some x -> + let print_help nm hlp = + eol lexbuf; + fprintf ppf "%s: %s@." nm hlp in + begin match matching_instructions x with + | [] -> + eol lexbuf; + fprintf ppf "No matching command.@." + | [ {instr_name = "set"} ] -> + find_variable + (fun v _ _ -> + print_help ("set " ^ v.var_name) ("set " ^ v.var_help)) + (fun ppf -> + print_help "set" "set debugger variable."; + print_variable_list ppf) + ppf + lexbuf + | [ {instr_name = "show"} ] -> + find_variable + (fun v _ _ -> + print_help ("show " ^ v.var_name) ("show " ^ v.var_help)) + (fun _v -> + print_help "show" "display debugger variable."; + print_variable_list ppf) + ppf + lexbuf + | [ {instr_name = "info"} ] -> + find_info + (fun i _ _ -> print_help ("info " ^ i.info_name) i.info_help) + (fun ppf -> + print_help "info" + "display infos about the program being debugged."; + print_info_list ppf) + ppf + lexbuf + | [i] -> + print_help i.instr_name i.instr_help + | l -> + eol lexbuf; + fprintf ppf "Ambiguous command \"%s\": %a@." x pr_instrs l + end + | None -> + fprintf ppf "List of commands: %a@." pr_instrs !instruction_list + +(* Printing values *) + +let print_expr depth ev env ppf expr = + try + let (v, ty) = Eval.expression ev env expr in + print_named_value depth expr env v ppf ty + with + | Eval.Error msg -> + Eval.report_error ppf msg; + raise Toplevel + +let env_of_event = + function + None -> Env.empty + | Some ev -> + Envaux.env_from_summary ev.ev_ev.ev_typenv ev.ev_ev.ev_typsubst + +let print_command depth ppf lexbuf = + let exprs = expression_list_eol Lexer.lexeme lexbuf in + ensure_loaded (); + let env = + try + env_of_event !selected_event + with + | Envaux.Error msg -> + Envaux.report_error ppf msg; + raise Toplevel + in + List.iter (print_expr depth !selected_event env ppf) exprs + +let instr_print ppf lexbuf = print_command !max_printer_depth ppf lexbuf + +let instr_display ppf lexbuf = print_command 1 ppf lexbuf + +let instr_address ppf lexbuf = + let exprs = expression_list_eol Lexer.lexeme lexbuf in + ensure_loaded (); + let env = + try + env_of_event !selected_event + with + | Envaux.Error msg -> + Envaux.report_error ppf msg; + raise Toplevel + in + let print_addr expr = + let (v, _ty) = + try Eval.expression !selected_event env expr + with Eval.Error msg -> + Eval.report_error ppf msg; + raise Toplevel + in + match Remote_value.pointer v with + | "" -> fprintf ppf "[not a remote value]@." + | s -> fprintf ppf "0x%s@." s + in + List.iter print_addr exprs + +(* Loading of command files *) + +let extract_filename arg = + (* Allow enclosing filename in quotes *) + let l = String.length arg in + let pos1 = if l > 0 && arg.[0] = '\"' then 1 else 0 in + let pos2 = if l > 0 && arg.[l-1] = '\"' then l-1 else l in + String.sub arg pos1 (pos2 - pos1) + +let instr_source ppf lexbuf = + let file = extract_filename(argument_eol argument lexbuf) + and old_state = !interactif + and old_channel = !user_channel in + let io_chan = + try + io_channel_of_descr + (openfile (Load_path.find (expand_path file)) + [O_RDONLY] 0) + with + | Not_found -> error "Source file not found." + | (Unix_error _) as x -> Unix_tools.report_error x; raise Toplevel + in + interactif := false; + user_channel := io_chan; + let loop () = + line_loop ppf (Lexing.from_function read_user_input) + and finally () = + stop_user_input (); + close_io io_chan; + interactif := old_state; + user_channel := old_channel + in + Fun.protect ~finally loop + +let instr_set = + find_variable + (fun {var_action = (funct, _)} _ppf lexbuf -> funct lexbuf) + (function _ppf -> error "Argument required.") + +let instr_show = + find_variable + (fun {var_action = (_, funct)} ppf lexbuf -> eol lexbuf; funct ppf) + (function ppf -> + List.iter + (function {var_name = nm; var_action = (_, funct)} -> + fprintf ppf "%s: " nm; + funct ppf) + !variable_list) + +let instr_info = + find_info + (fun i _ppf lexbuf -> i.info_action lexbuf) + (function _ppf -> + error "\"info\" must be followed by the name of an info command.") + +let instr_break ppf lexbuf = + let argument = break_argument_eol Lexer.lexeme lexbuf in + ensure_loaded (); + match argument with + | BA_none -> (* break *) + (match !selected_event with + | Some ev -> + new_breakpoint ev + | None -> + error "Can\'t add breakpoint at this point.") + | BA_pc {frag; pos} -> (* break PC *) + add_breakpoint_at_pc {frag; pos} + | BA_function expr -> (* break FUNCTION *) + let env = + try + env_of_event !selected_event + with + | Envaux.Error msg -> + Envaux.report_error ppf msg; + raise Toplevel + in + begin try + let (v, ty) = Eval.expression !selected_event env expr in + match get_desc ty with + | Tarrow _ -> + add_breakpoint_after_pc (Remote_value.closure_code v) + | _ -> + eprintf "Not a function.@."; + raise Toplevel + with + | Eval.Error msg -> + Eval.report_error ppf msg; + raise Toplevel + end + | BA_pos1 (mdle, line, column) -> (* break @ [MODULE] LINE [COL] *) + let module_name = convert_module (module_of_longident mdle) in + new_breakpoint + (try + let ev = event_at_pos module_name 0 in + let ev_pos = + {Lexing.dummy_pos with + pos_fname = (Events.get_pos ev.ev_ev).pos_fname} in + let buffer = + try get_buffer ev_pos module_name with + | Not_found -> + eprintf "No source file for %s.@." module_name; + raise Toplevel + in + match column with + | None -> + event_at_pos module_name (fst (pos_of_line buffer line)) + | Some col -> + event_near_pos module_name (point_of_coord buffer line col) + with + | Not_found -> (* event_at_pos / event_near pos *) + eprintf "Can\'t find any event there.@."; + raise Toplevel + | Out_of_range -> (* pos_of_line / point_of_coord *) + eprintf "Position out of range.@."; + raise Toplevel) + | BA_pos2 (mdle, position) -> (* break @ [MODULE] # POSITION *) + try + new_breakpoint + (event_near_pos (convert_module (module_of_longident mdle)) + position) + with + | Not_found -> + eprintf "Can\'t find any event there.@." + +let instr_delete _ppf lexbuf = + match integer_list_eol Lexer.lexeme lexbuf with + | [] -> + if breakpoints_count () <> 0 && yes_or_no "Delete all breakpoints" + then remove_all_breakpoints () + | breakpoints -> + List.iter + (function x -> try remove_breakpoint x with | Not_found -> ()) + breakpoints + +let instr_frame ppf lexbuf = + let frame_number = + match opt_integer_eol Lexer.lexeme lexbuf with + | None -> !current_frame + | Some x -> x + in + ensure_loaded (); + try + select_frame frame_number; + show_current_frame ppf true + with + | Not_found -> + error ("No frame number " ^ Int.to_string frame_number ^ ".") + +let instr_backtrace ppf lexbuf = + let number = + match opt_signed_integer_eol Lexer.lexeme lexbuf with + | None -> 0 + | Some x -> x in + ensure_loaded (); + match current_report() with + | None | Some {rep_type = Exited | Uncaught_exc | Code_loaded _} -> () + | Some _ -> + let frame_counter = ref 0 in + let print_frame first_frame last_frame = function + | None -> + fprintf ppf + "(Encountered a function with no debugging information)@."; + false + | Some event -> + if !frame_counter >= first_frame then + show_one_frame !frame_counter ppf event; + incr frame_counter; + if !frame_counter >= last_frame then begin + fprintf ppf "(More frames follow)@." + end; + !frame_counter < last_frame in + fprintf ppf "Backtrace:@."; + if number = 0 then + do_backtrace (print_frame 0 max_int) + else if number > 0 then + do_backtrace (print_frame 0 number) + else begin + let num_frames = stack_depth() in + if num_frames < 0 then + fprintf ppf + "(Encountered a function with no debugging information)@." + else + do_backtrace (print_frame (num_frames + number) max_int) + end + +let instr_up ppf lexbuf = + let offset = + match opt_signed_integer_eol Lexer.lexeme lexbuf with + | None -> 1 + | Some x -> x + in + ensure_loaded (); + try + select_frame (!current_frame + offset); + show_current_frame ppf true + with + | Not_found -> error "No such frame." + +let instr_down ppf lexbuf = + let offset = + match opt_signed_integer_eol Lexer.lexeme lexbuf with + | None -> 1 + | Some x -> x + in + ensure_loaded (); + try + select_frame (!current_frame - offset); + show_current_frame ppf true + with + | Not_found -> error "No such frame." + +let instr_last ppf lexbuf = + let count = + match opt_signed_int64_eol Lexer.lexeme lexbuf with + | None -> _1 + | Some x -> x + in + check_not_windows "last"; + reset_named_values(); + go_to (History.previous_time count); + show_current_event ppf + +let instr_list _ppf lexbuf = + let (mo, beg, e) = list_arguments_eol Lexer.lexeme lexbuf in + let (curr_mod, line, column) = + try + selected_point () + with + | Not_found -> + ("", -1, -1) + in + let mdle = + match mo with + | None -> curr_mod + | _ -> convert_module (module_of_longident mo) + in + let pos = Lexing.dummy_pos in + let buffer = + try get_buffer pos mdle with + | Not_found -> error ("No source file for " ^ mdle ^ ".") in + let point = + if column <> -1 then + try + (point_of_coord buffer line 1) + column + with Out_of_range -> + -1 + else + -1 in + let beginning = + match beg with + | None when (mo <> None) || (line = -1) -> + 1 + | None -> + begin try + Int.max 1 (line - 10) + with Out_of_range -> + 1 + end + | Some x -> x + in + let en = + match e with + | None -> beginning + 20 + | Some x -> x + in + if mdle = curr_mod then + show_listing pos mdle beginning en point + (current_event_is_before ()) + else + show_listing pos mdle beginning en (-1) true + +(** Variables. **) +let raw_variable kill name = + (function lexbuf -> + let argument = argument_eol argument lexbuf in + if (not kill) || ask_kill_program () then name := argument), + function ppf -> fprintf ppf "%s@." !name + +let raw_line_variable kill name = + (function lexbuf -> + let argument = argument_eol line_argument lexbuf in + if (not kill) || ask_kill_program () then name := argument), + function ppf -> fprintf ppf "%s@." !name + +let integer_variable kill min msg name = + (function lexbuf -> + let argument = integer_eol Lexer.lexeme lexbuf in + if argument < min then print_endline msg + else if (not kill) || ask_kill_program () then name := argument), + function ppf -> fprintf ppf "%i@." !name + +let int64_variable kill min msg name = + (function lexbuf -> + let argument = int64_eol Lexer.lexeme lexbuf in + if argument < min then print_endline msg + else if (not kill) || ask_kill_program () then name := argument), + function ppf -> fprintf ppf "%Li@." !name + +let boolean_variable kill name = + (function lexbuf -> + let argument = + match identifier_eol Lexer.lexeme lexbuf with + | "on" -> true + | "of" | "off" -> false + | _ -> error "Syntax error." + in + if (not kill) || ask_kill_program () then name := argument), + function ppf -> fprintf ppf "%s@." (if !name then "on" else "off") + +let path_variable kill name = + (function lexbuf -> + let argument = argument_eol argument lexbuf in + if (not kill) || ask_kill_program () then + name := make_absolute (expand_path argument)), + function ppf -> fprintf ppf "%s@." !name + +let loading_mode_variable ppf = + (find_ident + "loading mode" + (matching_elements (ref loading_modes) fst) + (fun (_, mode) _ppf lexbuf -> + eol lexbuf; set_launching_function mode) + (function _ppf -> error "Syntax error.") + ppf), + function ppf -> + let rec find = function + | [] -> () + | (name, funct) :: l -> + if funct == !launching_func then fprintf ppf "%s" name else find l + in + find loading_modes; + fprintf ppf "@." + +let follow_fork_variable = + (function lexbuf -> + let mode = + match identifier_eol Lexer.lexeme lexbuf with + | "child" -> Fork_child + | "parent" -> Fork_parent + | _ -> error "Syntax error." + in + fork_mode := mode; + if !loaded then update_follow_fork_mode ()), + function ppf -> + fprintf ppf "%s@." + (match !fork_mode with + Fork_child -> "child" + | Fork_parent -> "parent") + +(** Infos. **) + +let pr_modules ppf mods = + let pr_mods ppf = List.iter (function x -> fprintf ppf "%s@ " x) in + fprintf ppf "Used modules: @.%a@?" pr_mods mods + +let info_modules ppf lexbuf = + eol lexbuf; + ensure_loaded (); + pr_modules ppf !modules +(******** + print_endline "Opened modules: "; + if !opened_modules_names = [] then + print_endline "(no module opened)." + else + (List.iter (function x -> print_string x;print_space) !opened_modules_names; + print_newline ()) +*********) + +let info_checkpoints ppf lexbuf = + eol lexbuf; + if !checkpoints = [] then fprintf ppf "No checkpoint.@." + else + (if !debug_breakpoints then + (prerr_endline " Time Pid Version"; + List.iter + (function + {c_time = time; c_pid = pid; c_breakpoint_version = version} -> + Printf.printf "%19Ld %5d %d\n" time pid version) + !checkpoints) + else + (print_endline " Time Pid"; + List.iter + (function + {c_time = time; c_pid = pid} -> + Printf.printf "%19Ld %5d\n" time pid) + !checkpoints)) + +let info_one_breakpoint ppf (num, ev) = + fprintf ppf "%3d %d:%10d %s@." num ev.ev_frag ev.ev_ev.ev_pos + (Pos.get_desc ev) + +let info_breakpoints ppf lexbuf = + eol lexbuf; + if !breakpoints = [] then fprintf ppf "No breakpoints.@." + else begin + fprintf ppf "Num Address Where@."; + List.iter (info_one_breakpoint ppf) (List.rev !breakpoints); + end + + +let info_events _ppf lexbuf = + ensure_loaded (); + let mdle = + convert_module (module_of_longident (opt_longident_eol Lexer.lexeme lexbuf)) + in + print_endline ("Module: " ^ mdle); + print_endline " Address Characters Kind Repr."; + let frag, events = events_in_module mdle in + List.iter + (function ev -> + let start_char, end_char = + try + let buffer = get_buffer (Events.get_pos ev) ev.ev_module in + (snd (start_and_cnum buffer ev.ev_loc.Location.loc_start)), + (snd (start_and_cnum buffer ev.ev_loc.Location.loc_end)) + with _ -> + ev.ev_loc.Location.loc_start.Lexing.pos_cnum, + ev.ev_loc.Location.loc_end.Lexing.pos_cnum in + Printf.printf + "%d:%10d %6d-%-6d %10s %10s\n" + frag + ev.ev_pos + start_char + end_char + ((match ev.ev_kind with + Event_before -> "before" + | Event_after _ -> "after" + | Event_pseudo -> "pseudo") + ^ + (match ev.ev_info with + Event_function -> "/fun" + | Event_return _ -> "/ret" + | Event_other -> "")) + (match ev.ev_repr with + Event_none -> "" + | Event_parent _ -> "(repr)" + | Event_child repr -> Int.to_string !repr)) + events + +(** User-defined printers **) + +let instr_load_printer ppf lexbuf = + let filename = extract_filename(argument_eol argument lexbuf) in + try + Loadprinter.loadfile ppf filename + with Loadprinter.Error e -> + Loadprinter.report_error ppf e; raise Toplevel + +let instr_install_printer ppf lexbuf = + let lid = longident_eol Lexer.lexeme lexbuf in + try + Loadprinter.install_printer ppf lid + with Loadprinter.Error e -> + Loadprinter.report_error ppf e; raise Toplevel + +let instr_remove_printer ppf lexbuf = + let lid = longident_eol Lexer.lexeme lexbuf in + try + Loadprinter.remove_printer lid + with Loadprinter.Error e -> + Loadprinter.report_error ppf e; raise Toplevel + +(** Initialization. **) +let init ppf = + instruction_list := [ + { instr_name = "cd"; instr_prio = false; + instr_action = instr_cd; instr_repeat = true; instr_help = +"set working directory to DIR for debugger and program being debugged." }; + { instr_name = "complete"; instr_prio = false; + instr_action = instr_complete; instr_repeat = false; instr_help = +"complete word at cursor according to context. Useful for Emacs." }; + { instr_name = "pwd"; instr_prio = false; + instr_action = instr_pwd; instr_repeat = true; instr_help = +"print working directory." }; + { instr_name = "directory"; instr_prio = false; + instr_action = instr_dir; instr_repeat = false; instr_help = +"add directory DIR to beginning of search path for source and\n\ +interface files.\n\ +Forget cached info on source file locations and line positions.\n\ +With no argument, reset the search path." }; + { instr_name = "kill"; instr_prio = false; + instr_action = instr_kill; instr_repeat = true; instr_help = +"kill the program being debugged." }; + { instr_name = "pid"; instr_prio = false; + instr_action = instr_pid; instr_repeat = true; instr_help = +"print the process ID of the current active process." }; + { instr_name = "address"; instr_prio = false; + instr_action = instr_address; instr_repeat = true; instr_help = +"print the raw address of a value." }; + { instr_name = "help"; instr_prio = false; + instr_action = instr_help; instr_repeat = true; instr_help = +"print list of commands." }; + { instr_name = "quit"; instr_prio = false; + instr_action = instr_quit; instr_repeat = false; instr_help = +"exit the debugger." }; + { instr_name = "shell"; instr_prio = false; + instr_action = instr_shell; instr_repeat = true; instr_help = +"Execute a given COMMAND through the system shell." }; + { instr_name = "environment"; instr_prio = false; + instr_action = instr_env; instr_repeat = false; instr_help = +"environment variable to give to program being debugged when it is started." }; + (* Displacements *) + { instr_name = "run"; instr_prio = true; + instr_action = instr_run; instr_repeat = true; instr_help = +"run the program from current position." }; + { instr_name = "reverse"; instr_prio = false; + instr_action = instr_reverse; instr_repeat = true; instr_help = +"run the program backward from current position." }; + { instr_name = "step"; instr_prio = true; + instr_action = instr_step; instr_repeat = true; instr_help = +"step program until it reaches the next event.\n\ +Argument N means do this N times (or till program stops for another reason)." }; + { instr_name = "backstep"; instr_prio = true; + instr_action = instr_back; instr_repeat = true; instr_help = +"step program backward until it reaches the previous event.\n\ +Argument N means do this N times (or till program stops for another reason)." }; + { instr_name = "goto"; instr_prio = false; + instr_action = instr_goto; instr_repeat = true; instr_help = +"go to the given time." }; + { instr_name = "finish"; instr_prio = true; + instr_action = instr_finish; instr_repeat = true; instr_help = +"execute until topmost stack frame returns." }; + { instr_name = "next"; instr_prio = true; + instr_action = instr_next; instr_repeat = true; instr_help = +"step program until it reaches the next event.\n\ +Skip over function calls.\n\ +Argument N means do this N times (or till program stops for another reason)." }; + { instr_name = "start"; instr_prio = false; + instr_action = instr_start; instr_repeat = true; instr_help = +"execute backward until the current function is exited." }; + { instr_name = "previous"; instr_prio = false; + instr_action = instr_previous; instr_repeat = true; instr_help = +"step program until it reaches the previous event.\n\ +Skip over function calls.\n\ +Argument N means do this N times (or till program stops for another reason)." }; + { instr_name = "print"; instr_prio = true; + instr_action = instr_print; instr_repeat = true; instr_help = +"print value of expressions (deep printing)." }; + { instr_name = "display"; instr_prio = true; + instr_action = instr_display; instr_repeat = true; instr_help = +"print value of expressions (shallow printing)." }; + { instr_name = "source"; instr_prio = false; + instr_action = instr_source; instr_repeat = true; instr_help = +"read command from file FILE." }; + (* Breakpoints *) + { instr_name = "break"; instr_prio = false; + instr_action = instr_break; instr_repeat = false; instr_help = +"Set breakpoint.\ +\nSyntax: break\ +\n break function-name\ +\n break @ [module] linenum\ +\n break @ [module] linenum columnnum\ +\n break @ [module] # characternum\ +\n break frag:pc\ +\n break pc" }; + { instr_name = "delete"; instr_prio = false; + instr_action = instr_delete; instr_repeat = false; instr_help = +"delete some breakpoints.\n\ +Arguments are breakpoint numbers with spaces in between.\n\ +To delete all breakpoints, give no argument." }; + { instr_name = "set"; instr_prio = false; + instr_action = instr_set; instr_repeat = false; instr_help = +"--unused--" }; + { instr_name = "show"; instr_prio = false; + instr_action = instr_show; instr_repeat = true; instr_help = +"--unused--" }; + { instr_name = "info"; instr_prio = false; + instr_action = instr_info; instr_repeat = true; instr_help = +"--unused--" }; + (* Frames *) + { instr_name = "frame"; instr_prio = false; + instr_action = instr_frame; instr_repeat = true; instr_help = +"select and print a stack frame.\n\ +With no argument, print the selected stack frame.\n\ +An argument specifies the frame to select." }; + { instr_name = "backtrace"; instr_prio = false; + instr_action = instr_backtrace; instr_repeat = true; instr_help = +"print backtrace of all stack frames, or innermost COUNT frames.\n\ +With a negative argument, print outermost -COUNT frames." }; + { instr_name = "bt"; instr_prio = false; + instr_action = instr_backtrace; instr_repeat = true; instr_help = +"print backtrace of all stack frames, or innermost COUNT frames.\n\ +With a negative argument, print outermost -COUNT frames." }; + { instr_name = "up"; instr_prio = false; + instr_action = instr_up; instr_repeat = true; instr_help = +"select and print stack frame that called this one.\n\ +An argument says how many frames up to go." }; + { instr_name = "down"; instr_prio = false; + instr_action = instr_down; instr_repeat = true; instr_help = +"select and print stack frame called by this one.\n\ +An argument says how many frames down to go." }; + { instr_name = "last"; instr_prio = true; + instr_action = instr_last; instr_repeat = true; instr_help = +"go back to previous time." }; + { instr_name = "list"; instr_prio = false; + instr_action = instr_list; instr_repeat = true; instr_help = +"list the source code." }; + (* User-defined printers *) + { instr_name = "load_printer"; instr_prio = false; + instr_action = instr_load_printer; instr_repeat = false; instr_help = +"load in the debugger a .cmo or .cma file containing printing functions." }; + { instr_name = "install_printer"; instr_prio = false; + instr_action = instr_install_printer; instr_repeat = false; instr_help = +"use the given function for printing values of its input type.\n\ +The code for the function must have previously been loaded in the debugger\n\ +using \"load_printer\"." }; + { instr_name = "remove_printer"; instr_prio = false; + instr_action = instr_remove_printer; instr_repeat = false; instr_help = +"stop using the given function for printing values of its input type." } +]; + variable_list := [ + (* variable name, (writing, reading), help reading, help writing *) + { var_name = "arguments"; + var_action = raw_line_variable true arguments; + var_help = +"arguments to give program being debugged when it is started." }; + { var_name = "program"; + var_action = path_variable true program_name; + var_help = +"name of program to be debugged." }; + { var_name = "loadingmode"; + var_action = loading_mode_variable ppf; + var_help = +"mode of loading.\n\ +It can be either:\n\ + direct: the program is directly called by the debugger.\n\ + runtime: the debugger execute `ocamlrun programname arguments\'.\n\ + manual: the program is not launched by the debugger,\n\ + but manually by the user." }; + { var_name = "processcount"; + var_action = integer_variable false 1 "Must be >= 1." + checkpoint_max_count; + var_help = +"maximum number of process to keep." }; + { var_name = "checkpoints"; + var_action = boolean_variable false make_checkpoints; + var_help = +"whether to make checkpoints or not." }; + { var_name = "bigstep"; + var_action = int64_variable false _1 "Must be >= 1." + checkpoint_big_step; + var_help = +"step between checkpoints during long displacements." }; + { var_name = "smallstep"; + var_action = int64_variable false _1 "Must be >= 1." + checkpoint_small_step; + var_help = +"step between checkpoints during small displacements." }; + { var_name = "socket"; + var_action = raw_variable true socket_name; + var_help = +"name of the socket used by communications debugger-runtime." }; + { var_name = "history"; + var_action = integer_variable false 0 "" history_size; + var_help = +"history size." }; + { var_name = "print_depth"; + var_action = integer_variable false 1 "Must be at least 1" + max_printer_depth; + var_help = +"maximal depth for printing of values." }; + { var_name = "print_length"; + var_action = integer_variable false 1 "Must be at least 1" + max_printer_steps; + var_help = +"maximal number of value nodes printed." }; + { var_name = "follow_fork_mode"; + var_action = follow_fork_variable; + var_help = +"process to follow after forking.\n\ +It can be either :\n\ + child: the newly created process.\n\ + parent: the process that called fork.\n" }; + { var_name = "break_on_load"; + var_action = boolean_variable false break_on_load; + var_help = +"whether to stop after loading new code (e.g. with Dynlink)." }]; + + info_list := + (* info name, function, help *) + [{ info_name = "modules"; + info_action = info_modules ppf; + info_help = "list opened modules." }; + { info_name = "checkpoints"; + info_action = info_checkpoints ppf; + info_help = "list checkpoints." }; + { info_name = "breakpoints"; + info_action = info_breakpoints ppf; + info_help = "list breakpoints." }; + { info_name = "events"; + info_action = info_events ppf; + info_help = "list events in MODULE (default is current module)." }] + +let _ = init std_formatter diff --git a/debugger4/command_line.mli b/debugger4/command_line.mli new file mode 100644 index 00000000000..adba635627b --- /dev/null +++ b/debugger4/command_line.mli @@ -0,0 +1,23 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(************************ Reading and executing commands ***************) + +open Lexing +open Format + +val interprete_line : formatter -> string -> bool +val line_loop : formatter -> lexbuf -> unit diff --git a/debugger4/debugcom.ml b/debugger4/debugcom.ml new file mode 100644 index 00000000000..e852b3bb97c --- /dev/null +++ b/debugger4/debugcom.ml @@ -0,0 +1,452 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Low-level communication with the debuggee *) + +open Int64ops +open Primitives + +(* The current connection with the debuggee *) + +let conn = ref Primitives.std_io + +(* Set which process the debugger follows on fork. *) + +type follow_fork_mode = + Fork_child + | Fork_parent + +let fork_mode = ref Fork_parent + +let update_follow_fork_mode () = + let a = match !fork_mode with Fork_child -> 0 | Fork_parent -> 1 in + output_char !conn.io_out 'K'; + output_binary_int !conn.io_out a + +(* Set the current connection, and update the fork mode in case it has + * changed. *) + +let set_current_connection io_chan = + conn := io_chan; + update_follow_fork_mode () + +(* Modify the program code *) + +type pc = + { frag : int; + pos : int; } + +module Sp = struct + + (* Position in the debuggee's stack. *) +(* BACKPORT BEGIN + type t = { + block : int; + offset : int; + } + + let null = { block = -1; offset = -1} + + let base sp n = {sp with offset = sp.offset - n} + + let compare sp1 sp2 = + match Stdlib.compare sp1.block sp2.block with + | 0 -> Stdlib.compare sp1.offset sp2.offset + | x -> x +*) + type t = int + + let null = 0 + let base _ _ = assert false + let compare = Int.compare +(* BACKPORT END *) + +end + +(* Identifier of the code fragment for the main program. + Numbering starts at 1 and the runtime registers 2 fragments before + the main program: one for uncaught exceptions and one for callbacks. +*) +(* BACKPOR BEGIN +let main_frag = 3 +*) +let main_frag = 0 +(* BACKPORT END *) + +let set_event {frag; pos} = + output_char !conn.io_out 'e'; + output_binary_int !conn.io_out frag; + output_binary_int !conn.io_out pos + +let set_breakpoint {frag; pos} = + output_char !conn.io_out 'B'; + output_binary_int !conn.io_out frag; + output_binary_int !conn.io_out pos + +let reset_instr {frag; pos} = + output_char !conn.io_out 'i'; + output_binary_int !conn.io_out frag; + output_binary_int !conn.io_out pos + +(* Basic commands for flow control *) + +type execution_summary = + Event + | Breakpoint + | Exited + | Trap_barrier + | Uncaught_exc + | Debug_info of Instruct.debug_event list array + | Code_loaded of int + | Code_unloaded of int + +type report = { + rep_type : execution_summary; + rep_event_count : int64; + rep_stack_pointer : Sp.t; + rep_program_pointer : pc +} + +type checkpoint_report = + Checkpoint_done of int + | Checkpoint_failed + +(* Run the debuggee for N events *) + +let do_go_smallint n = + output_char !conn.io_out 'g'; + output_binary_int !conn.io_out n; + flush !conn.io_out; + Input_handling.execute_with_other_controller + Input_handling.exit_main_loop + !conn + (function () -> + Input_handling.main_loop (); + let summary = + match input_char !conn.io_in with + 'e' -> Event + | 'b' -> Breakpoint + | 'x' -> Exited + | 's' -> Trap_barrier + | 'u' -> Uncaught_exc + | 'D' -> Debug_info (input_value !conn.io_in : + Instruct.debug_event list array) + | 'L' -> Code_loaded (input_binary_int !conn.io_in) + | 'U' -> Code_unloaded (input_binary_int !conn.io_in) + | c -> Misc.fatal_error (Printf.sprintf "Debugcom.do_go %c" c) + in + let event_counter = input_binary_int !conn.io_in in +(* BACKPORT BEGIN + let block = input_binary_int !conn.io_in in + let offset = input_binary_int !conn.io_in in +*) + let rep_stack_pointer = input_binary_int !conn.io_in in +(* BACKPORT END *) + let frag = input_binary_int !conn.io_in in + let pos = input_binary_int !conn.io_in in + { rep_type = summary; + rep_event_count = Int64.of_int event_counter; +(* BACKPORT BEGIN + rep_stack_pointer = Sp.{block; offset}; +*) + rep_stack_pointer; +(* BACKPORT END *) + rep_program_pointer = {frag; pos} }) + +let rec do_go n = + assert (n >= _0); + if n > max_small_int then + begin match do_go_smallint max_int with + | { rep_type = Event } -> + do_go (n -- max_small_int) + | report -> + { report with + rep_event_count = report.rep_event_count ++ (n -- max_small_int) } + end + else + do_go_smallint (Int64.to_int n) + +(* Perform a checkpoint *) + +let do_checkpoint () = + match Sys.os_type with + "Win32" -> failwith "do_checkpoint" + | _ -> + output_char !conn.io_out 'c'; + flush !conn.io_out; + let pid = input_binary_int !conn.io_in in + if pid = -1 then Checkpoint_failed else Checkpoint_done pid + +(* Kill the given process. *) +let stop chan = + try + output_char chan.io_out 's'; + flush chan.io_out + with + Sys_error _ | End_of_file -> () + +(* Ask a process to wait for its child which has been killed. *) +(* (so as to eliminate zombies). *) +let wait_child chan = + try + output_char chan.io_out 'w' + with + Sys_error _ | End_of_file -> () + +(* Move to initial frame (that of current function). *) +(* Return stack position and current pc *) + +let initial_frame () = + output_char !conn.io_out '0'; + flush !conn.io_out; +(* BACKPORT BEGIN + let block = input_binary_int !conn.io_in in + let offset = input_binary_int !conn.io_in in +*) + let stack_pos = input_binary_int !conn.io_in in +(* BACKPORT END *) + let frag = input_binary_int !conn.io_in in + let pos = input_binary_int !conn.io_in in +(* BACKPORT BEGIN + (Sp.{block; offset}, {frag; pos}) +*) + (stack_pos, {frag; pos}) +(* BACKPOR END *) + +let set_initial_frame () = + ignore(initial_frame ()) + +(* Move up one frame *) +(* Return stack position and current pc. + If there's no frame above, return (-1, 0). *) + +let up_frame stacksize = + output_char !conn.io_out 'U'; + output_binary_int !conn.io_out stacksize; + flush !conn.io_out; +(* BACKPORT BEGIN + let block = input_binary_int !conn.io_in in + let offset = input_binary_int !conn.io_in in +*) + let stack_pos = input_binary_int !conn.io_in in +(* BACKPORT END *) + let frag, pos = +(* BACKPORT BEGIN + if block = -1 then + begin + assert (offset = -1); + 0, 0 + end else begin + let frag = input_binary_int !conn.io_in in + let pos = input_binary_int !conn.io_in in + frag, pos + end +*) + if stack_pos = -1 + then 0, 0 + else let frag = input_binary_int !conn.io_in in + let pos = input_binary_int !conn.io_in in + frag, pos +(* BACKPORT END *) + in +(* BACKPORT BEGIN + (Sp.{block; offset}, { frag; pos }) +*) + (stack_pos, { frag; pos }) +(* BACKPORT END *) + +(* Get and set the current frame position *) + +let get_frame () = + output_char !conn.io_out 'f'; + flush !conn.io_out; + let stack_pos = input_binary_int !conn.io_in in +(* + let block = input_binary_int !conn.io_in in + let offset = input_binary_int !conn.io_in in +*) + let frag = input_binary_int !conn.io_in in + let pos = input_binary_int !conn.io_in in +(* + (Sp.{block; offset}, {frag; pos}) +*) + (stack_pos, {frag; pos}) + +let set_frame stack_pos = + output_char !conn.io_out 'S'; +(* BACKPORT BEGIN + output_binary_int !conn.io_out stack_pos.Sp.block; + output_binary_int !conn.io_out stack_pos.Sp.offset +*) + output_binary_int !conn.io_out stack_pos +(* BACKPORT END *) + +(* Set the trap barrier to given stack position. *) + +let set_trap_barrier pos = + output_char !conn.io_out 'b'; +(* BACKPORT BEGIN + output_binary_int !conn.io_out pos.Sp.block; + output_binary_int !conn.io_out pos.Sp.offset +*) + output_binary_int !conn.io_out pos +(* BACKPORT END *) + +(* Handling of remote values *) + +let value_size = if 1 lsl 31 = 0 then 4 else 8 + +let input_remote_value ic = + really_input_string ic value_size + +let output_remote_value ic v = + output_substring ic v 0 value_size + +exception Marshalling_error + +module Remote_value = + struct + type t = Remote of string | Local of Obj.t + + let repr x = Local (Obj.repr x) + + let obj = function + | Local obj -> Obj.obj obj + | Remote v -> + output_char !conn.io_out 'M'; + output_remote_value !conn.io_out v; + flush !conn.io_out; + try + input_value !conn.io_in + with End_of_file | Failure _ -> + raise Marshalling_error + + let is_block = function + | Local obj -> Obj.is_block obj + | Remote v -> Obj.is_block (Array.unsafe_get (Obj.magic v : Obj.t array) 0) + + let tag obj = + if not (is_block obj) then Obj.int_tag + else match obj with + | Local obj -> Obj.tag obj + | Remote v -> + output_char !conn.io_out 'H'; + output_remote_value !conn.io_out v; + flush !conn.io_out; + let header = input_binary_int !conn.io_in in + header land 0xFF + + let size = function + | Local obj -> Obj.size obj + | Remote v -> + output_char !conn.io_out 'H'; + output_remote_value !conn.io_out v; + flush !conn.io_out; + let header = input_binary_int !conn.io_in in + if header land 0xFF = Obj.double_array_tag && Sys.word_size = 32 + then header lsr 11 + else header lsr 10 + + let field v n = + match v with + | Local obj -> Local(Obj.field obj n) + | Remote v -> + output_char !conn.io_out 'F'; + output_remote_value !conn.io_out v; + output_binary_int !conn.io_out n; + flush !conn.io_out; + if input_byte !conn.io_in = 0 then + Remote(input_remote_value !conn.io_in) + else begin + let buf = really_input_string !conn.io_in 8 in + let floatbuf = float n (* force allocation of a new float *) in + String.unsafe_blit buf 0 (Obj.magic floatbuf) 0 8; + Local(Obj.repr floatbuf) + end + + let double_field v n = + match v with + | Local obj -> Obj.double_field obj n + | Remote v -> + output_char !conn.io_out 'F'; + output_remote_value !conn.io_out v; + output_binary_int !conn.io_out n; + flush !conn.io_out; + if input_byte !conn.io_in = 0 then + raise Marshalling_error + else begin + let buf = really_input_string !conn.io_in 8 in + let floatbuf = float n (* force allocation of a new float *) in + String.unsafe_blit buf 0 (Obj.magic floatbuf) 0 8; + floatbuf + end + + let double_array_tag = Obj.double_array_tag + + let of_int n = + Local(Obj.repr n) + + let local pos = + output_char !conn.io_out 'L'; + output_binary_int !conn.io_out pos; + flush !conn.io_out; + Remote(input_remote_value !conn.io_in) + + let from_environment pos = + output_char !conn.io_out 'E'; + output_binary_int !conn.io_out pos; + flush !conn.io_out; + Remote(input_remote_value !conn.io_in) + + let global pos = + output_char !conn.io_out 'G'; + output_binary_int !conn.io_out pos; + flush !conn.io_out; + Remote(input_remote_value !conn.io_in) + + let accu () = + output_char !conn.io_out 'A'; + flush !conn.io_out; + Remote(input_remote_value !conn.io_in) + + let closure_code = function + | Local _ -> assert false + | Remote v -> + output_char !conn.io_out 'C'; + output_remote_value !conn.io_out v; + flush !conn.io_out; + let frag = input_binary_int !conn.io_in in + let pos = input_binary_int !conn.io_in in + {frag;pos} + + let same rv1 rv2 = + match (rv1, rv2) with + (Local obj1, Local obj2) -> obj1 == obj2 + | (Remote v1, Remote v2) -> v1 = v2 + (* string equality -> equality of remote pointers *) + | (_, _) -> false + + let pointer rv = + match rv with + | Remote v -> + let bytes = ref [] in + String.iter (fun c -> bytes := c :: !bytes) v; + let obytes = if Sys.big_endian then List.rev !bytes else !bytes in + let to_hex c = Printf.sprintf "%02x" (Char.code c) in + String.concat "" (List.map to_hex obytes) + | Local _ -> "" + + end diff --git a/debugger4/debugcom.mli b/debugger4/debugcom.mli new file mode 100644 index 00000000000..e9d19edae1f --- /dev/null +++ b/debugger4/debugcom.mli @@ -0,0 +1,139 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Low-level communication with the debuggee *) + +module Sp : sig +(* BACKPORT BEGIN + type t +*) + type t = int +(* BACKPORT END *) + val null : t + val base : t -> int -> t + val compare : t -> t -> int +end + +type pc = + { frag : int; + pos : int; } + +val main_frag : int + +type execution_summary = + Event + | Breakpoint + | Exited + | Trap_barrier + | Uncaught_exc + | Debug_info of Instruct.debug_event list array + | Code_loaded of int + | Code_unloaded of int + +type report = + { rep_type : execution_summary; + rep_event_count : int64; + rep_stack_pointer : Sp.t; + rep_program_pointer : pc } + +type checkpoint_report = + Checkpoint_done of int + | Checkpoint_failed + +type follow_fork_mode = + Fork_child + | Fork_parent + +(* Set the current connection with the debuggee *) +val set_current_connection : Primitives.io_channel -> unit + +(* Put an event at given pc *) +val set_event : pc -> unit + +(* Put a breakpoint at given pc *) +val set_breakpoint : pc -> unit + +(* Remove breakpoint or event at given pc *) +val reset_instr : pc -> unit + +(* Create a new checkpoint (the current process forks). *) +val do_checkpoint : unit -> checkpoint_report + +(* Step N events. *) +val do_go : int64 -> report + +(* Tell given process to terminate *) +val stop : Primitives.io_channel -> unit + +(* Tell given process to wait for its children *) +val wait_child : Primitives.io_channel -> unit + +(* Move to initial frame (that of current function). *) +(* Return stack position and current pc *) +val initial_frame : unit -> Sp.t * pc +val set_initial_frame : unit -> unit + +(* Get the current frame position *) +(* Return stack position and current pc *) +val get_frame : unit -> Sp.t * pc + +(* Set the current frame *) +val set_frame : Sp.t -> unit + +(* Move up one frame *) +(* Return stack position and current pc. + If there's no frame above, return (null_sp, _). + The argument is the size of the current frame. + *) +val up_frame : int -> Sp.t * pc + +(* Set the trap barrier to given stack position. *) +val set_trap_barrier : Sp.t -> unit + +(* Set whether the debugger follow the child or the parent process on fork *) +val fork_mode : follow_fork_mode ref +val update_follow_fork_mode : unit -> unit + +(* Handling of remote values *) + +exception Marshalling_error + +module Remote_value : + sig + type t + + val repr : 'a -> t + val obj : t -> 'a + val is_block : t -> bool + val tag : t -> int + val size : t -> int + val field : t -> int -> t + val double_field : t -> int -> float + val double_array_tag : int + val same : t -> t -> bool + + val of_int : int -> t + + val local : int -> t + val from_environment : int -> t + val global : int -> t + val accu : unit -> t + val closure_code : t -> pc + + (* Returns a hexadecimal representation of the remote address, + or [""] if the value is local. *) + val pointer : t -> string + end diff --git a/debugger4/debugger_config.ml b/debugger4/debugger_config.ml new file mode 100644 index 00000000000..9677bb0c514 --- /dev/null +++ b/debugger4/debugger_config.ml @@ -0,0 +1,90 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(**************************** Configuration file ***********************) + +open Int64ops + +exception Toplevel + +(*** Miscellaneous parameters. ***) + +(*ISO 6429 color sequences +00 to restore default color +01 for brighter colors +04 for underlined text +05 for flashing text +30 for black foreground +31 for red foreground +32 for green foreground +33 for yellow (or brown) foreground +34 for blue foreground +35 for purple foreground +36 for cyan foreground +37 for white (or gray) foreground +40 for black background +41 for red background +42 for green background +43 for yellow (or brown) background +44 for blue background +45 for purple background +46 for cyan background +47 for white (or gray) background +let debugger_prompt = "\027[1;04m(ocd)\027[0m " +and event_mark_before = "\027[1;31m$\027[0m" +and event_mark_after = "\027[1;34m$\027[0m" +*) +let debugger_prompt = "(ocd) " +let event_mark_before = "<|b|>" +let event_mark_after = "<|a|>" + +(* Name of shell used to launch the debuggee *) +let shell = + match Sys.os_type with + "Win32" -> "cmd" + | _ -> "/bin/sh" + +(* Name of the OCaml runtime. *) +let runtime_program = "ocamlrun" + +(* Time history size (for `last') *) +let history_size = ref 30 + +let load_path_for = Hashtbl.create 7 + +(*** Time travel parameters. ***) + +(* Step between checkpoints for long displacements.*) +let checkpoint_big_step = ref (~~ "10000") + +(* Idem for small ones. *) +let checkpoint_small_step = ref (~~ "1000") + +(* Maximum number of checkpoints. *) +let checkpoint_max_count = ref 15 + +(* Whether to keep checkpoints or not. *) +let make_checkpoints = ref + (match Sys.os_type with + "Win32" -> false + | _ -> true) + +(* Whether to break when new code is loaded. *) +let break_on_load = ref true + +(*** Environment variables for debuggee. ***) + +let environment = ref [] diff --git a/debugger4/debugger_config.mli b/debugger4/debugger_config.mli new file mode 100644 index 00000000000..9db86e93300 --- /dev/null +++ b/debugger4/debugger_config.mli @@ -0,0 +1,41 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(********************** Configuration file *****************************) + +exception Toplevel + +(*** Miscellaneous parameters. ***) + +val debugger_prompt : string +val event_mark_before : string +val event_mark_after : string +val shell : string +val runtime_program : string +val history_size : int ref +val load_path_for : (string, string list) Hashtbl.t + +(*** Time travel parameters. ***) + +val checkpoint_big_step : int64 ref +val checkpoint_small_step : int64 ref +val checkpoint_max_count : int ref +val make_checkpoints : bool ref +val break_on_load : bool ref + +(*** Environment variables for debuggee. ***) + +val environment : (string * string) list ref diff --git a/debugger4/debugger_lexer.mli b/debugger4/debugger_lexer.mli new file mode 100644 index 00000000000..0c364d687b9 --- /dev/null +++ b/debugger4/debugger_lexer.mli @@ -0,0 +1,22 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +exception Int_overflow + +val line: Lexing.lexbuf -> string +val lexeme: Lexing.lexbuf -> Debugger_parser.token +val argument: Lexing.lexbuf -> Debugger_parser.token +val line_argument: Lexing.lexbuf -> Debugger_parser.token diff --git a/debugger4/debugger_lexer.mll b/debugger4/debugger_lexer.mll new file mode 100644 index 00000000000..a180427225c --- /dev/null +++ b/debugger4/debugger_lexer.mll @@ -0,0 +1,104 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +{ + +open Debugger_parser + +exception Int_overflow + +} + +rule line = (* Read a whole line *) + parse + ([ ^ '\n' '\r' ]* as s) ('\n' | '\r' | "\r\n") + { s } + | [ ^ '\n' '\r' ]* + { Lexing.lexeme lexbuf } + | eof + { raise Exit } + +and argument = (* Read a raw argument *) + parse + [ ^ ' ' '\t' ]+ + { ARGUMENT (Lexing.lexeme lexbuf) } + | [' ' '\t']+ + { argument lexbuf } + | eof + { EOL } + | _ + { raise Parsing.Parse_error } + +and line_argument = + parse + _ * + { ARGUMENT (Lexing.lexeme lexbuf) } + | eof + { EOL } + +and lexeme = (* Read a lexeme *) + parse + [' ' '\t'] + + { lexeme lexbuf } + | ['a'-'z' '\223'-'\246' '\248'-'\255' '_'] + (['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' + '\'' '0'-'9' ]) * + { LIDENT(Lexing.lexeme lexbuf) } + | ['A'-'Z' '\192'-'\214' '\216'-'\222' ] + (['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' + '\'' '0'-'9' ]) * + { UIDENT(Lexing.lexeme lexbuf) } + | '"' [^ '"']* "\"" + { let s = Lexing.lexeme lexbuf in + LIDENT(String.sub s 1 (String.length s - 2)) } + | ['0'-'9']+ + | '0' ['x' 'X'] ['0'-'9' 'A'-'F' 'a'-'f']+ + | '0' ['o' 'O'] ['0'-'7']+ + | '0' ['b' 'B'] ['0'-'1']+ + { try INTEGER (Int64.of_string (Lexing.lexeme lexbuf)) + with Failure _ -> raise Int_overflow + } + | '*' + { STAR } + | "-" + { MINUS } + | "." + { DOT } + | "#" + { HASH } + | "@" + { AT } + | "$" + { DOLLAR } + | ":" + { COLON } + | "!" + { BANG } + | "(" + { LPAREN } + | ")" + { RPAREN } + | "[" + { LBRACKET } + | "]" + { RBRACKET } + | ['!' '?' '~' '=' '<' '>' '|' '&' '$' '@' '^' '+' '-' '*' '/' '%'] + ['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] * + { OPERATOR (Lexing.lexeme lexbuf) } + | eof + { EOL } + | _ + { raise Parsing.Parse_error } diff --git a/debugger4/debugger_parser.mly b/debugger4/debugger_parser.mly new file mode 100644 index 00000000000..973b761983e --- /dev/null +++ b/debugger4/debugger_parser.mly @@ -0,0 +1,261 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Jerome Vouillon, projet Cristal, INRIA Rocquencourt */ +/* OCaml port by John Malecki and Xavier Leroy */ +/* */ +/* 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. */ +/* */ +/**************************************************************************/ + +%{ + +open Int64ops +open Input_handling +open Longident +open Parser_aux +open Debugcom + +%} + +%token ARGUMENT +%token LIDENT +%token UIDENT +%token OPERATOR +%token INTEGER +%token STAR /* * */ +%token MINUS /* - */ +%token DOT /* . */ +%token COLON /* : */ +%token HASH /* # */ +%token AT /* @ */ +%token DOLLAR /* $ */ +%token BANG /* ! */ +%token LPAREN /* ( */ +%token RPAREN /* ) */ +%token LBRACKET /* [ */ +%token RBRACKET /* ] */ +%token EOL + +%right DOT +%right BANG + +%start argument_list_eol +%type argument_list_eol + +%start argument_eol +%type argument_eol + +%start integer_list_eol +%type integer_list_eol + +%start integer_eol +%type integer_eol + +%start int64_eol +%type int64_eol + +%start integer +%type integer + +%start opt_integer_eol +%type opt_integer_eol + +%start opt_signed_integer_eol +%type opt_signed_integer_eol + +%start opt_signed_int64_eol +%type opt_signed_int64_eol + +%start identifier +%type identifier + +%start identifier_eol +%type identifier_eol + +%start identifier_or_eol +%type identifier_or_eol + +%start opt_identifier +%type opt_identifier + +%start opt_identifier_eol +%type opt_identifier_eol + +%start expression_list_eol +%type expression_list_eol + +%start break_argument_eol +%type break_argument_eol + +%start list_arguments_eol +%type list_arguments_eol + +%start end_of_line +%type end_of_line + +%start longident_eol +%type longident_eol + +%start opt_longident +%type opt_longident + +%start opt_longident_eol +%type opt_longident_eol + +%% + +/* Raw arguments */ + +argument_list_eol : + ARGUMENT argument_list_eol + { $1::$2 } + | end_of_line + { [] }; + +argument_eol : + ARGUMENT end_of_line + { $1 }; + +/* Integer */ + +integer_list_eol : + INTEGER integer_list_eol + { (to_int $1) :: $2 } + | end_of_line + { [] }; + +integer_eol : + INTEGER end_of_line + { to_int $1 }; + +int64_eol : + INTEGER end_of_line + { $1 }; + +integer : + INTEGER + { to_int $1 }; + +opt_integer_eol : + INTEGER end_of_line + { Some (to_int $1) } + | end_of_line + { None }; + +opt_int64_eol : + INTEGER end_of_line + { Some $1 } + | end_of_line + { None }; + +opt_signed_integer_eol : + MINUS integer_eol + { Some (- $2) } + | opt_integer_eol + { $1 }; + +opt_signed_int64_eol : + MINUS int64_eol + { Some (Int64.neg $2) } + | opt_int64_eol + { $1 }; + +/* Identifiers and long identifiers */ + +longident : + LIDENT { Lident $1 } + | module_path DOT LIDENT { Ldot($1, $3) } + | OPERATOR { Lident $1 } + | module_path DOT OPERATOR { Ldot($1, $3) } + | module_path DOT LPAREN OPERATOR RPAREN { Ldot($1, $4) } +; + +module_path : + UIDENT { Lident $1 } + | module_path DOT UIDENT { Ldot($1, $3) } +; + +longident_eol : + longident end_of_line { $1 }; + +opt_longident : + UIDENT { Some (Lident $1) } + | LIDENT { Some (Lident $1) } + | module_path DOT UIDENT { Some (Ldot($1, $3)) } + | { None }; + +opt_longident_eol : + opt_longident end_of_line { $1 }; + +identifier : + LIDENT { $1 } + | UIDENT { $1 }; + +identifier_eol : + identifier end_of_line { $1 }; + +identifier_or_eol : + identifier { Some $1 } + | end_of_line { None }; + +opt_identifier : + identifier { Some $1 } + | { None }; + +opt_identifier_eol : + opt_identifier end_of_line { $1 }; + +/* Expressions */ + +expression: + longident { E_ident $1 } + | STAR { E_result } + | DOLLAR INTEGER { E_name (to_int $2) } + | expression DOT INTEGER { E_item($1, (to_int $3)) } + | expression DOT LBRACKET INTEGER RBRACKET { E_item($1, (to_int $4)) } + | expression DOT LPAREN INTEGER RPAREN { E_item($1, (to_int $4)) } + | expression DOT LIDENT { E_field($1, $3) } + | BANG expression { E_field($2, "contents") } + | LPAREN expression RPAREN { $2 } +; + +/* Lists of expressions */ + +expression_list_eol : + expression expression_list_eol { $1::$2 } + | end_of_line { [] } +; + +/* Arguments for breakpoint */ + +break_argument_eol : + end_of_line { BA_none } + | integer_eol { BA_pc {frag = main_frag; + pos = $1} } + | INTEGER COLON integer_eol { BA_pc {frag = to_int $1; + pos = $3} } + | expression end_of_line { BA_function $1 } + | AT opt_longident INTEGER opt_integer_eol { BA_pos1 ($2, (to_int $3), $4)} + | AT opt_longident HASH integer_eol { BA_pos2 ($2, $4) } +; + +/* Arguments for list */ + +list_arguments_eol : + opt_longident integer opt_integer_eol + { ($1, Some $2, $3) } + | opt_longident_eol + { ($1, None, None) }; + +/* End of line */ + +end_of_line : + EOL { stop_user_input () } +; diff --git a/debugger4/dune b/debugger4/dune new file mode 100644 index 00000000000..a4f3e772284 --- /dev/null +++ b/debugger4/dune @@ -0,0 +1,33 @@ +;************************************************************************** +;* * +;* OCaml * +;* * +;* Thomas Refis, Jane Street Europe * +;* * +;* Copyright 2018 Jane Street Group LLC * +;* * +;* 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. * +;* * +;************************************************************************** + +(ocamllex debugger_lexer) +(ocamlyacc debugger_parser) + +(library + (name ocamldebug) + (modules (:standard \ ocamldebug_entry)) + (modules_without_implementation parser_aux) + (libraries ocamlcommon ocamltoplevel unix dynlink_internal)) + +(executable + (name ocamldebug_entry) + (modes byte) + (modules ocamldebug_entry) + (libraries unix ocamldebug)) + +(install + (files (ocamldebug_entry.bc as ocamldebug)) + (section bin) + (package ocaml)) diff --git a/debugger4/eval.ml b/debugger4/eval.ml new file mode 100644 index 00000000000..02a506acf89 --- /dev/null +++ b/debugger4/eval.ml @@ -0,0 +1,225 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Misc +open Path +open Instruct +open Types +open Parser_aux +open Events + +type error = + Unbound_identifier of Ident.t + | Not_initialized_yet of Path.t + | Unbound_long_identifier of Longident.t + | Unknown_name of int + | Tuple_index of type_expr * int * int + | Array_index of int * int + | List_index of int * int + | String_index of string * int * int + | Wrong_item_type of type_expr * int + | Wrong_label of type_expr * string + | Not_a_record of type_expr + | No_result + +exception Error of error + +let abstract_type = + Btype.newgenty (Tconstr (Pident (Ident.create_local ""), [], ref Mnil)) + +let get_global_or_predef id = + try + Debugcom.Remote_value.global (Symtable.get_global_position id) + with Symtable.Error _ -> raise(Error(Unbound_identifier id)) + +let rec address path event = function + | Env.Aunit cu -> + get_global_or_predef (cu |> Compilation_unit.to_global_ident_for_bytecode) + | Env.Alocal id -> + if Ident.is_predef id then get_global_or_predef id + else + begin match event with + Some {ev_ev = ev} -> + begin try + let pos = Ident.find_same id ev.ev_compenv.ce_stack in + Debugcom.Remote_value.local (ev.ev_stacksize - pos) + with Not_found -> + try + let pos = Ident.find_same id ev.ev_compenv.ce_heap in + Debugcom.Remote_value.from_environment pos + with Not_found -> + raise(Error(Unbound_identifier id)) + end + | None -> + raise(Error(Unbound_identifier id)) + end + | Env.Adot(root, pos) -> + let v = address path event root in + if not (Debugcom.Remote_value.is_block v) then + raise(Error(Not_initialized_yet path)); + Debugcom.Remote_value.field v pos + +let value_path event env path = + match Env.find_value_address path env with + | addr -> address path event addr + | exception Not_found -> + fatal_error ("Cannot find address for: " ^ (Path.name path)) + +let rec expression event env = function + | E_ident lid -> begin + match Env.find_value_by_name lid env with + | (p, valdesc) -> + let v = + match valdesc.val_kind with + | Val_ivar (_, cl_num) -> + let (p0, _) = + Env.find_value_by_name + (Longident.Lident ("self-" ^ cl_num)) env + in + let v = value_path event env p0 in + let i = value_path event env p in + Debugcom.Remote_value.field v (Debugcom.Remote_value.obj i) + | _ -> + value_path event env p + in + let typ = Ctype.correct_levels valdesc.val_type in + v, typ + | exception Not_found -> + raise(Error(Unbound_long_identifier lid)) + end + | E_result -> + begin match event with + Some {ev_ev = {ev_kind = Event_after ty; ev_typsubst = subst}} + when !Frames.current_frame = 0 -> + (Debugcom.Remote_value.accu(), Subst.type_expr subst ty) + | _ -> + raise(Error(No_result)) + end + | E_name n -> + begin try + Printval.find_named_value n + with Not_found -> + raise(Error(Unknown_name n)) + end + | E_item(arg, n) -> + let (v, ty) = expression event env arg in + begin match get_desc (Ctype.expand_head_opt env ty) with + Ttuple ty_list -> + if n < 1 || n > List.length ty_list + then raise(Error(Tuple_index(ty, List.length ty_list, n))) + (* CR labeled tuples: handle labels in debugger (also see "E_field" + case) *) + else (Debugcom.Remote_value.field v (n-1), + snd (List.nth ty_list (n-1))) + | Tconstr(path, [ty_arg], _) when Path.same path Predef.path_array -> + let size = Debugcom.Remote_value.size v in + if n >= size + then raise(Error(Array_index(size, n))) + else (Debugcom.Remote_value.field v n, ty_arg) + | Tconstr(path, [ty_arg], _) when Path.same path Predef.path_list -> + let rec nth pos v = + if not (Debugcom.Remote_value.is_block v) then + raise(Error(List_index(pos, n))) + else if pos = n then + (Debugcom.Remote_value.field v 0, ty_arg) + else + nth (pos + 1) (Debugcom.Remote_value.field v 1) + in nth 0 v + | Tconstr(path, [], _) when Path.same path Predef.path_string -> + let s = (Debugcom.Remote_value.obj v : string) in + if n >= String.length s + then raise(Error(String_index(s, String.length s, n))) + else (Debugcom.Remote_value.of_int(Char.code s.[n]), + Predef.type_char) + | _ -> + raise(Error(Wrong_item_type(ty, n))) + end + | E_field(arg, lbl) -> + let (v, ty) = expression event env arg in + begin match get_desc (Ctype.expand_head_opt env ty) with + Tconstr(path, _, _) -> + let tydesc = Env.find_type path env in + begin match tydesc.type_kind with + Type_record(lbl_list, _repr) -> + let (pos, ty_res) = + find_label lbl env ty path tydesc 0 lbl_list in + (Debugcom.Remote_value.field v pos, ty_res) + | _ -> raise(Error(Not_a_record ty)) + end + | _ -> raise(Error(Not_a_record ty)) + end + +and find_label lbl env ty path tydesc pos = function + [] -> + raise(Error(Wrong_label(ty, lbl))) + | {ld_id; ld_type} :: rem -> + if Ident.name ld_id = lbl then begin + let ty_res = + Btype.newgenty(Tconstr(path, tydesc.type_params, ref Mnil)) + in + (pos, + try Ctype.apply env [ty_res] ld_type [ty] with Ctype.Cannot_apply -> + abstract_type) + end else + find_label lbl env ty path tydesc (pos + 1) rem + +(* Error report *) + +open Format + +let report_error ppf = function + | Unbound_identifier id -> + fprintf ppf "@[Unbound identifier %s@]@." (Ident.name id) + | Not_initialized_yet path -> + fprintf ppf + "@[The module path %a is not yet initialized.@ \ + Please run program forward@ \ + until its initialization code is executed.@]@." + Printtyp.path path + | Unbound_long_identifier lid -> + fprintf ppf "@[Unbound identifier %a@]@." Printtyp.longident lid + | Unknown_name n -> + fprintf ppf "@[Unknown value name $%i@]@." n + | Tuple_index(ty, len, pos) -> + fprintf ppf + "@[Cannot extract field number %i from a %i-tuple of type@ %a@]@." + pos len Printtyp.type_expr ty + | Array_index(len, pos) -> + fprintf ppf + "@[Cannot extract element number %i from an array of length %i@]@." + pos len + | List_index(len, pos) -> + fprintf ppf + "@[Cannot extract element number %i from a list of length %i@]@." + pos len + | String_index(s, len, pos) -> + fprintf ppf + "@[Cannot extract character number %i@ \ + from the following string of length %i:@ %S@]@." + pos len s + | Wrong_item_type(ty, pos) -> + fprintf ppf + "@[Cannot extract item number %i from a value of type@ %a@]@." + pos Printtyp.type_expr ty + | Wrong_label(ty, lbl) -> + fprintf ppf + "@[The record type@ %a@ has no label named %s@]@." + Printtyp.type_expr ty lbl + | Not_a_record ty -> + fprintf ppf + "@[The type@ %a@ is not a record type@]@." Printtyp.type_expr ty + | No_result -> + fprintf ppf "@[No result available at current program event@]@." diff --git a/debugger4/eval.mli b/debugger4/eval.mli new file mode 100644 index 00000000000..6aa8cb1ff43 --- /dev/null +++ b/debugger4/eval.mli @@ -0,0 +1,41 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Types +open Parser_aux +open Format + +val expression : + Events.code_event option -> Env.t -> expression -> + Debugcom.Remote_value.t * type_expr + +type error = + | Unbound_identifier of Ident.t + | Not_initialized_yet of Path.t + | Unbound_long_identifier of Longident.t + | Unknown_name of int + | Tuple_index of type_expr * int * int + | Array_index of int * int + | List_index of int * int + | String_index of string * int * int + | Wrong_item_type of type_expr * int + | Wrong_label of type_expr * string + | Not_a_record of type_expr + | No_result + +exception Error of error + +val report_error: formatter -> error -> unit diff --git a/debugger4/events.ml b/debugger4/events.ml new file mode 100644 index 00000000000..411ae2e7681 --- /dev/null +++ b/debugger4/events.ml @@ -0,0 +1,52 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(********************************* Events ******************************) + +open Instruct + +type code_event = + { ev_frag : int; + ev_ev : Instruct.debug_event } + +let get_pos ev = + match ev.ev_kind with + | Event_before -> ev.ev_loc.Location.loc_start + | Event_after _ -> ev.ev_loc.Location.loc_end + | _ -> ev.ev_loc.Location.loc_start + + +(*** Current events. ***) + +(* Event at current position *) +let current_event = + ref (None : code_event option) + +(* Current position in source. *) +(* Raise `Not_found' if not on an event (beginning or end of program). *) +let get_current_event () = + match !current_event with + | None -> raise Not_found + | Some ev -> ev + +let current_event_is_before () = + match !current_event with + None -> + raise Not_found + | Some {ev_ev = {ev_kind = Event_before}} -> + true + | _ -> + false diff --git a/debugger4/events.mli b/debugger4/events.mli new file mode 100644 index 00000000000..3d3f190aec3 --- /dev/null +++ b/debugger4/events.mli @@ -0,0 +1,35 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Instruct + +(* A debug event associated with a code fragment. *) +type code_event = + { ev_frag : int; + ev_ev : Instruct.debug_event } + +val get_pos : debug_event -> Lexing.position + +(** Current events. **) + +(* The event at current position. *) +val current_event : code_event option ref + +(* Current position in source. *) +(* Raise `Not_found' if not on an event (beginning or end of program). *) +val get_current_event : unit -> code_event + +val current_event_is_before : unit -> bool diff --git a/debugger4/exec.ml b/debugger4/exec.ml new file mode 100644 index 00000000000..df940165e5d --- /dev/null +++ b/debugger4/exec.ml @@ -0,0 +1,54 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Handling of keyboard interrupts *) + +let interrupted = ref false + +let is_protected = ref false + +let break _signum = + if !is_protected + then interrupted := true + else raise Sys.Break + +let _ = + match Sys.os_type with + "Win32" -> () + | _ -> + Sys.set_signal Sys.sigint (Sys.Signal_handle break); + Sys.set_signal Sys.sigpipe (Sys.Signal_handle(fun _ -> raise End_of_file)) + +let protect f = + if !is_protected then + f () + else begin + is_protected := true; + if not !interrupted then + f (); + is_protected := false; + if !interrupted then begin interrupted := false; raise Sys.Break end + end + +let unprotect f = + if not !is_protected then + f () + else begin + is_protected := false; + if !interrupted then begin interrupted := false; raise Sys.Break end; + f (); + is_protected := true + end diff --git a/otherlibs/systhreads/mutex.ml b/debugger4/exec.mli similarity index 74% rename from otherlibs/systhreads/mutex.ml rename to debugger4/exec.mli index 836109e761b..05e2e5f8d4c 100644 --- a/otherlibs/systhreads/mutex.ml +++ b/debugger4/exec.mli @@ -2,9 +2,10 @@ (* *) (* OCaml *) (* *) -(* Xavier Leroy and Pascal Cuoq, INRIA Rocquencourt *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) (* *) -(* Copyright 1995 Institut National de Recherche en Informatique et *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. *) (* *) (* All rights reserved. This file is distributed under the terms of *) @@ -13,8 +14,7 @@ (* *) (**************************************************************************) -type t -external create: unit -> t = "caml_mutex_new" -external lock: t -> unit = "caml_mutex_lock" -external try_lock: t -> bool = "caml_mutex_try_lock" -external unlock: t -> unit = "caml_mutex_unlock" +(* Handling of keyboard interrupts *) + +val protect : (unit -> unit) -> unit +val unprotect : (unit -> unit) -> unit diff --git a/debugger4/frames.ml b/debugger4/frames.ml new file mode 100644 index 00000000000..364fa4ca71d --- /dev/null +++ b/debugger4/frames.ml @@ -0,0 +1,138 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(***************************** Frames **********************************) + +open Instruct +open Debugcom +open Events +open Symbols + +(* Current frame number *) +let current_frame = ref 0 + +(* Event at selected position *) +let selected_event = ref (None : code_event option) + +(* Selected position in source. *) +(* Raise `Not_found' if not on an event. *) +let selected_point () = + match !selected_event with + None -> + raise Not_found + | Some {ev_ev=ev} -> + (ev.ev_module, + (Events.get_pos ev).Lexing.pos_lnum, + (Events.get_pos ev).Lexing.pos_cnum - (Events.get_pos ev).Lexing.pos_bol) + +let selected_event_is_before () = + match !selected_event with + None -> + raise Not_found + | Some {ev_ev={ev_kind = Event_before}} -> + true + | _ -> + false + +(* Move up `frame_count' frames, assuming current frame pointer + corresponds to event `event'. Return event of final frame. *) + +let rec move_up frame_count event = + if frame_count <= 0 then event else begin + let (sp, pc) = up_frame event.ev_ev.ev_stacksize in +(* BACKPORT BEGIN + if sp = Sp.null then raise Not_found; +*) + if sp < Sp.null then raise Not_found; +(* BACKPORT END *) + move_up (frame_count - 1) (any_event_at_pc pc) + end + +(* Select a frame. *) +(* Raise `Not_found' if no such frame. *) +(* --- Assume the current events have already been updated. *) +let select_frame frame_number = + if frame_number < 0 then raise Not_found; + let (initial_sp, _) = get_frame() in + try + match !current_event with + None -> + raise Not_found + | Some curr_event -> + match !selected_event with + Some sel_event when frame_number >= !current_frame -> + selected_event := + Some(move_up (frame_number - !current_frame) sel_event); + current_frame := frame_number + | _ -> + set_initial_frame(); + selected_event := Some(move_up frame_number curr_event); + current_frame := frame_number + with Not_found -> + set_frame initial_sp; + raise Not_found + +(* Select a frame. *) +(* Same as `select_frame' but raise no exception if the frame is not found. *) +(* --- Assume the currents events have already been updated. *) +let try_select_frame frame_number = + try + select_frame frame_number + with + Not_found -> + () + +(* Return to default frame (frame 0). *) +let reset_frame () = + set_initial_frame(); + selected_event := !current_event; + current_frame := 0 + +(* Perform a stack backtrace. + Call the given function with the events for each stack frame, + or None if we've encountered a stack frame with no debugging info + attached. Stop when the function returns false, or frame with no + debugging info reached, or top of stack reached. *) + +let do_backtrace action = + match !current_event with + None -> Misc.fatal_error "Frames.do_backtrace" + | Some ev -> + let (initial_sp, _) = get_frame() in + set_initial_frame(); + let event = ref ev in + begin try + while action (Some !event) do + let (sp, pc) = up_frame !event.ev_ev.ev_stacksize in +(* BACKPORT BEGIN + if sp = Sp.null then raise Exit; +*) + if sp < Sp.null then raise Exit; +(* BACKPORT END *) + event := any_event_at_pc pc + done + with Exit -> () + | Not_found -> ignore (action None) + end; + set_frame initial_sp + +(* Return the number of frames in the stack *) + +let stack_depth () = + let num_frames = ref 0 in + do_backtrace (function Some _ev -> incr num_frames; true + | None -> num_frames := -1; false); + !num_frames diff --git a/debugger4/frames.mli b/debugger4/frames.mli new file mode 100644 index 00000000000..08fd326cc8d --- /dev/null +++ b/debugger4/frames.mli @@ -0,0 +1,55 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(****************************** Frames *********************************) + +open Events + +(* Current frame number *) +val current_frame : int ref + +(* Fragment and event at selected position. *) +val selected_event : code_event option ref + +(* Selected position in source (module, line, column). *) +(* Raise `Not_found' if not on an event. *) +val selected_point : unit -> string * int * int + +val selected_event_is_before : unit -> bool + +(* Select a frame. *) +(* Raise `Not_found' if no such frame. *) +(* --- Assume the currents events have already been updated. *) +val select_frame : int -> unit + +(* Select a frame. *) +(* Same as `select_frame' but raise no exception if the frame is not found. *) +(* --- Assume the currents events have already been updated. *) +val try_select_frame : int -> unit + +(* Return to default frame (frame 0). *) +val reset_frame : unit -> unit + +(* Perform a stack backtrace. + Call the given function with the events for each stack frame, + or None if we've encountered a stack frame with no debugging info + attached. Stop when the function returns false, or frame with no + debugging info reached, or top of stack reached. *) +val do_backtrace : (code_event option -> bool) -> unit + +(* Return the number of frames in the stack, or (-1) if it can't be + determined because some frames have no debugging info. *) +val stack_depth : unit -> int diff --git a/debugger4/history.ml b/debugger4/history.ml new file mode 100644 index 00000000000..0ece812b3ee --- /dev/null +++ b/debugger4/history.ml @@ -0,0 +1,44 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Int64ops +open Checkpoints +open Primitives +open Debugger_config + +let history = ref ([] : int64 list) + +let empty_history () = + history := [] + +let add_current_time () = + let time = current_time () in + if !history = [] then + history := [time] + else if time <> List.hd !history then + history := list_truncate !history_size (time::!history) + +let previous_time_1 () = + match !history with + _::((time::_) as hist) -> + history := hist; time + | _ -> + prerr_endline "No more information."; raise Toplevel + +let rec previous_time n = + if n = _1 + then previous_time_1() + else begin ignore(previous_time_1()); previous_time(pre64 n) end diff --git a/debugger4/history.mli b/debugger4/history.mli new file mode 100644 index 00000000000..a184e7b99bf --- /dev/null +++ b/debugger4/history.mli @@ -0,0 +1,21 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +val empty_history : unit -> unit + +val add_current_time : unit -> unit + +val previous_time : int64 -> int64 diff --git a/debugger4/input_handling.ml b/debugger4/input_handling.ml new file mode 100644 index 00000000000..5b43ba96151 --- /dev/null +++ b/debugger4/input_handling.ml @@ -0,0 +1,108 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(**************************** Input control ****************************) + +open Unix +open Primitives + +(*** Actives files. ***) + +(* List of the actives files. *) +let active_files = + ref ([] : (file_descr * ((io_channel -> unit) * io_channel)) list) + +(* Add a file to the list of actives files. *) +let add_file file controller = + active_files := (file.io_fd, (controller, file))::!active_files + +(* Remove a file from the list of actives files. *) +let remove_file file = + active_files := List.remove_assoc file.io_fd !active_files + +(* Change the controller for the given file. *) +let change_controller file controller = + remove_file file; add_file file controller + +(* Return the controller currently attached to the given file. *) +let current_controller file = + fst (List.assoc file.io_fd !active_files) + +(* Execute a function with `controller' attached to `file'. *) +(* ### controller file funct *) +let execute_with_other_controller controller file funct = + let old_controller = current_controller file in + change_controller file controller; + let finally () = change_controller file old_controller in + Fun.protect ~finally funct + +(*** The "Main Loop" ***) + +let continue_main_loop = + ref true + +let exit_main_loop _ = + continue_main_loop := false + +(* Handle active files until `continue_main_loop' is false. *) +let main_loop () = + let finally = + let old_state = !continue_main_loop in + fun () -> continue_main_loop := old_state + in + Fun.protect ~finally @@ fun () -> + continue_main_loop := true; + while !continue_main_loop do + try + let (input, _, _) = + select (List.map fst !active_files) [] [] (-1.) + in + List.iter + (function fd -> + let (funct, iochan) = (List.assoc fd !active_files) in + funct iochan) + input + with + Unix_error (EINTR, _, _) -> () + done + +(*** Managing user inputs ***) + +(* Are we in interactive mode ? *) +let interactif = ref true + +let current_prompt = ref "" + +(* Where the user input come from. *) +let user_channel = ref std_io + +let read_user_input buffer length = + main_loop (); + input !user_channel.io_in buffer 0 length + +(* Stop reading user input. *) +let stop_user_input () = + remove_file !user_channel + +(* Resume reading user input. *) +let resume_user_input () = + if not (List.mem_assoc !user_channel.io_fd !active_files) then begin + if !interactif && !Parameters.prompt then begin + print_string !current_prompt; + flush Stdlib.stdout + end; + add_file !user_channel exit_main_loop + end diff --git a/debugger4/input_handling.mli b/debugger4/input_handling.mli new file mode 100644 index 00000000000..e333c785d76 --- /dev/null +++ b/debugger4/input_handling.mli @@ -0,0 +1,61 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(***************************** Input control ***************************) + +open Primitives + +(*** Actives files. ***) + +(* Add a file to the list of active files. *) +val add_file : io_channel -> (io_channel -> unit) -> unit + +(* Remove a file from the list of actives files. *) +val remove_file : io_channel -> unit + +(* Return the controller currently attached to the given file. *) +val current_controller : io_channel -> (io_channel -> unit) + +(* Execute a function with `controller' attached to `file'. *) +(* ### controller file funct *) +val execute_with_other_controller : + (io_channel -> unit) -> io_channel -> (unit -> 'a) -> 'a + +(*** The "Main Loop" ***) + +(* Call this function for exiting the main loop. *) +val exit_main_loop : 'a -> unit + +(* Handle active files until `continue_main_loop' is false. *) +val main_loop : unit -> unit + +(*** Managing user inputs ***) + +(* Are we in interactive mode ? *) +val interactif : bool ref + +val current_prompt : string ref + +(* Where the user input come from. *) +val user_channel : io_channel ref + +val read_user_input : bytes -> int -> int + +(* Stop reading user input. *) +val stop_user_input : unit -> unit + +(* Resume reading user input. *) +val resume_user_input : unit -> unit diff --git a/debugger4/int64ops.ml b/debugger4/int64ops.ml new file mode 100644 index 00000000000..64b6e843ee5 --- /dev/null +++ b/debugger4/int64ops.ml @@ -0,0 +1,27 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, projet Moscova, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(**************************************************************************) + +(****************** arithmetic operators for Int64 *********************) + +let ( ++ ) = Int64.add +let ( -- ) = Int64.sub +let suc64 = Int64.succ +let pre64 = Int64.pred +let _0 = Int64.zero +let _1 = Int64.one +let _minus1 = Int64.minus_one +let ( ~~ ) = Int64.of_string +let max_small_int = Int64.of_int max_int +let to_int = Int64.to_int diff --git a/debugger4/int64ops.mli b/debugger4/int64ops.mli new file mode 100644 index 00000000000..e085a295b97 --- /dev/null +++ b/debugger4/int64ops.mli @@ -0,0 +1,27 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, projet Moscova, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(**************************************************************************) + +(****************** arithmetic operators for Int64 *********************) + +val ( ++ ) : int64 -> int64 -> int64 +val ( -- ) : int64 -> int64 -> int64 +val suc64 : int64 -> int64 +val pre64 : int64 -> int64 +val _0 : int64 +val _1 : int64 +val _minus1 : int64 +val ( ~~ ) : string -> int64 +val max_small_int : int64 +val to_int : int64 -> int diff --git a/debugger4/loadprinter.ml b/debugger4/loadprinter.ml new file mode 100644 index 00000000000..7ebbd8ebac1 --- /dev/null +++ b/debugger4/loadprinter.ml @@ -0,0 +1,159 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1997 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. *) +(* *) +(**************************************************************************) + +(* Loading and installation of user-defined printer functions *) + +open Misc +open Types + +(* Error report *) + +type error = + | Load_failure of Dynlink.error + | Unbound_identifier of Longident.t + | Unavailable_module of string * Longident.t + | Wrong_type of Longident.t + | No_active_printer of Longident.t + +exception Error of error + +(* Load a .cmo or .cma file *) + +open Format + +let rec loadfiles ppf name = + try + let filename = Load_path.find name in + Dynlink.allow_unsafe_modules true; + Dynlink.loadfile filename; + let d = Filename.dirname name in + if d <> Filename.current_dir_name then begin + if not (List.mem d (Load_path.get_path_list ())) then + Load_path.add_dir ~hidden:false d; + end; + fprintf ppf "File %s loaded@." + (if d <> Filename.current_dir_name then + filename + else + Filename.basename filename); + true + with + | Dynlink.Error (Dynlink.Unavailable_unit unit) -> + loadfiles ppf (String.uncapitalize_ascii unit ^ ".cmo") + && + loadfiles ppf name + | Not_found -> + fprintf ppf "Cannot find file %s@." name; + false + | Sys_error msg -> + fprintf ppf "%s: %s@." name msg; + false + | Dynlink.Error e -> + raise(Error(Load_failure e)) + +let loadfile ppf name = + ignore(loadfiles ppf name) + +(* Return the value referred to by a path (as in toplevel/topdirs) *) +(* Note: evaluation proceeds in the debugger memory space, not in + the debuggee. *) + +let rec eval_address = function + | Env.Aunit cu -> + let bytecode_or_asm_symbol = + Ident.name (cu |> Compilation_unit.to_global_ident_for_bytecode) + in + begin match Dynlink.unsafe_get_global_value ~bytecode_or_asm_symbol with + | None -> + raise (Symtable.Error (Symtable.Undefined_global bytecode_or_asm_symbol)) + | Some obj -> obj + end + | Env.Alocal _ -> assert false + | Env.Adot(addr, pos) -> Obj.field (eval_address addr) pos + +let eval_value_path env path = + match Env.find_value_address path env with + | addr -> eval_address addr + | exception Not_found -> + fatal_error ("Cannot find address for: " ^ (Path.name path)) + +(* Install, remove a printer (as in toplevel/topdirs) *) + +let match_printer_type desc make_printer_type = + Ctype.with_local_level ~post:Ctype.generalize begin fun () -> + let ty_arg = Ctype.newvar Jkind.Primitive.(value ~why:Debug_printer_argument) in + Ctype.unify (Lazy.force Env.initial) + (make_printer_type ty_arg) + (Ctype.instance desc.val_type); + ty_arg + end + +let find_printer_type lid = + match Env.find_value_by_name lid Env.empty with + | (path, desc) -> begin + match match_printer_type desc Topprinters.printer_type_new with + | ty_arg -> (ty_arg, path, false) + | exception Ctype.Unify _ -> begin + match match_printer_type desc Topprinters.printer_type_old with + | ty_arg -> (ty_arg, path, true) + | exception Ctype.Unify _ -> raise(Error(Wrong_type lid)) + end + end + | exception Not_found -> + raise(Error(Unbound_identifier lid)) + +let install_printer ppf lid = + let (ty_arg, path, is_old_style) = find_printer_type lid in + let v = + try + eval_value_path Env.empty path + with Symtable.Error(Symtable.Undefined_global s) -> + raise(Error(Unavailable_module(s, lid))) in + let print_function = + if is_old_style then + (fun _formatter repr -> Obj.obj v (Obj.obj repr)) + else + (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) in + Printval.install_printer path ty_arg ppf print_function + +let remove_printer lid = + let (_ty_arg, path, _is_old_style) = find_printer_type lid in + try + Printval.remove_printer path + with Not_found -> + raise(Error(No_active_printer lid)) + +(* Error report *) + +open Format + +let report_error ppf = function + | Load_failure e -> + fprintf ppf "@[Error during code loading: %s@]@." + (Dynlink.error_message e) + | Unbound_identifier lid -> + fprintf ppf "@[Unbound identifier %a@]@." + Printtyp.longident lid + | Unavailable_module(md, lid) -> + fprintf ppf + "@[The debugger does not contain the code for@ %a.@ \ + Please load an implementation of %s first.@]@." + Printtyp.longident lid md + | Wrong_type lid -> + fprintf ppf "@[%a has the wrong type for a printing function.@]@." + Printtyp.longident lid + | No_active_printer lid -> + fprintf ppf "@[%a is not currently active as a printing function.@]@." + Printtyp.longident lid diff --git a/debugger4/loadprinter.mli b/debugger4/loadprinter.mli new file mode 100644 index 00000000000..8fc6f7a6da6 --- /dev/null +++ b/debugger4/loadprinter.mli @@ -0,0 +1,35 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1997 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. *) +(* *) +(**************************************************************************) + +(* Loading and installation of user-defined printer functions *) + +open Format + +val loadfile : formatter -> string -> unit +val install_printer : formatter -> Longident.t -> unit +val remove_printer : Longident.t -> unit + +(* Error report *) + +type error = + | Load_failure of Dynlink.error + | Unbound_identifier of Longident.t + | Unavailable_module of string * Longident.t + | Wrong_type of Longident.t + | No_active_printer of Longident.t + +exception Error of error + +val report_error: formatter -> error -> unit diff --git a/debugger4/main.ml b/debugger4/main.ml new file mode 100644 index 00000000000..006e8fd5bb7 --- /dev/null +++ b/debugger4/main.ml @@ -0,0 +1,241 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Input_handling +open Question +open Command_line +open Debugger_config +open Checkpoints +open Time_travel +open Parameters +open Program_management +open Frames +open Show_information +open Format +open Primitives + +let line_buffer = Lexing.from_function read_user_input + +let loop ppf = line_loop ppf line_buffer; stop_user_input () + +let current_duration = ref (-1L) + +let rec protect ppf restart loop = + try + loop ppf + with + | End_of_file -> + protect ppf restart (function ppf -> + forget_process + !current_checkpoint.c_fd + !current_checkpoint.c_pid; + pp_print_flush ppf (); + stop_user_input (); + restart ppf) + | Toplevel -> + protect ppf restart (function ppf -> + pp_print_flush ppf (); + stop_user_input (); + restart ppf) + | Sys.Break -> + protect ppf restart (function ppf -> + fprintf ppf "Interrupted.@."; + Exec.protect (function () -> + stop_user_input (); + if !loaded then begin + try_select_frame 0; + show_current_event ppf; + end); + restart ppf) + | Current_checkpoint_lost -> + protect ppf restart (function ppf -> + fprintf ppf "Trying to recover...@."; + stop_user_input (); + recover (); + try_select_frame 0; + show_current_event ppf; + restart ppf) + | Current_checkpoint_lost_start_at (time, init_duration) -> + protect ppf restart (function ppf -> + let b = + if !current_duration = -1L then begin + let msg = sprintf "Restart from time %Ld and try to get \ + closer of the problem" time in + stop_user_input (); + if yes_or_no msg then + (current_duration := init_duration; true) + else + false + end + else + true in + if b then + begin + go_to time; + current_duration := Int64.div !current_duration 10L; + if !current_duration > 0L then + while true do + step !current_duration + done + else begin + current_duration := -1L; + stop_user_input (); + show_current_event ppf; + restart ppf; + end + end + else + begin + recover (); + show_current_event ppf; + restart ppf + end) + | x -> + cleanup x kill_program + +let execute_file_if_any () = + let buffer = Buffer.create 128 in + begin + try + let base = ".ocamldebug" in + let file = + if Sys.file_exists base then + base + else + Filename.concat (Sys.getenv "HOME") base in + let ch = open_in file in + fprintf Format.std_formatter "Executing file %s@." file; + while true do + let line = string_trim (input_line ch) in + if line <> "" && line.[0] <> '#' then begin + Buffer.add_string buffer line; + Buffer.add_char buffer '\n' + end + done; + with _ -> () + end; + let len = Buffer.length buffer in + if len > 0 then + let commands = Buffer.sub buffer 0 (pred len) in + line_loop Format.std_formatter (Lexing.from_string commands); + stop_user_input () + +let toplevel_loop () = + interactif := false; + current_prompt := ""; + execute_file_if_any (); + interactif := true; + current_prompt := debugger_prompt; + protect Format.std_formatter loop loop + +(* Parsing of command-line arguments *) + +exception Found_program_name + +let anonymous s = + program_name := Unix_tools.make_absolute s; raise Found_program_name +let add_include d = + default_load_path := + Misc.expand_directory Config.standard_library d :: !default_load_path +let set_socket s = + socket_name := s +let set_checkpoints n = + checkpoint_max_count := n +let set_directory dir = + Sys.chdir dir +let print_version () = + printf "The OCaml debugger, version %s@." Sys.ocaml_version; + exit 0 + +let print_version_num () = + printf "%s@." Sys.ocaml_version; + exit 0 + +let speclist = [ + "-c", Arg.Int set_checkpoints, + " Set max number of checkpoints kept"; + "-cd", Arg.String set_directory, + " Change working directory"; + "-emacs", Arg.Tuple [Arg.Set emacs; Arg.Set machine_readable], + "For running the debugger under emacs; implies -machine-readable"; + "-I", Arg.String add_include, + " Add to the list of include directories"; + "-machine-readable", Arg.Set machine_readable, + "Print information in a format more suitable for machines"; + "-s", Arg.String set_socket, + " Set the name of the communication socket"; + "-version", Arg.Unit print_version, + " Print version and exit"; + "-vnum", Arg.Unit print_version_num, + " Print version number and exit"; + "-no-version", Arg.Clear Parameters.version, + " Do not print version at startup"; + "-no-prompt", Arg.Clear Parameters.prompt, + " Suppress all prompts"; + "-no-time", Arg.Clear Parameters.time, + " Do not print times"; + "-no-breakpoint-message", Arg.Clear Parameters.breakpoint, + " Do not print message at breakpoint setup and removal"; + ] + +let function_placeholder () = + failwith "custom printer tried to invoke a function from the debuggee" + +let report report_error error = + eprintf "Debugger [version %s] environment error:@ @[@;%a@]@.;" + Config.version report_error error + +let main () = + Callback.register "Debugger.function_placeholder" function_placeholder; + try + socket_name := + (match Sys.os_type with + "Win32" -> + (Unix.string_of_inet_addr Unix.inet_addr_loopback)^ + ":"^ + (Int.to_string (10000 + ((Unix.getpid ()) mod 10000))) + | _ -> Filename.concat (Filename.get_temp_dir_name ()) + ("camldebug" ^ (Int.to_string (Unix.getpid ()))) + ); + begin try + Arg.parse speclist anonymous ""; + Arg.usage speclist + "No program name specified\n\ + Usage: ocamldebug [options] [arguments]\n\ + Options are:"; + exit 2 + with Found_program_name -> + for j = !Arg.current + 1 to Array.length Sys.argv - 1 do + arguments := !arguments ^ " " ^ (Filename.quote Sys.argv.(j)) + done + end; + if !Parameters.version + then printf "\tOCaml Debugger version %s@.@." Config.version; + Load_path.init ~auto_include:Compmisc.auto_include + ~visible:!default_load_path ~hidden:[]; + Clflags.recursive_types := true; (* Allow recursive types. *) + toplevel_loop (); (* Toplevel. *) + kill_program (); + exit 0 + with + | Toplevel -> + exit 2 + | Persistent_env.Error e -> + report Persistent_env.report_error e; + exit 2 + | Cmi_format.Error e -> + report Cmi_format.report_error e; + exit 2 diff --git a/debugger4/ocamldebug_entry.ml b/debugger4/ocamldebug_entry.ml new file mode 100644 index 00000000000..94e41e6f87e --- /dev/null +++ b/debugger4/ocamldebug_entry.ml @@ -0,0 +1,2 @@ +let _ = + Unix.handle_unix_error Ocamldebug.Main.main () diff --git a/debugger4/parameters.ml b/debugger4/parameters.ml new file mode 100644 index 00000000000..42fc89cd68d --- /dev/null +++ b/debugger4/parameters.ml @@ -0,0 +1,44 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Miscellaneous parameters *) + +open Debugger_config + +let program_name = ref "" +let socket_name = ref "" +let arguments = ref "" + +let default_load_path = + ref [ Filename.current_dir_name; Config.standard_library ] + +let breakpoint = ref true +let prompt = ref true +let time = ref true +let version = ref true + +let add_path dir = + Load_path.add_dir ~hidden:false dir; + Envaux.reset_cache ~preserve_persistent_env:false + +let add_path_for mdl dir = + let old = try Hashtbl.find load_path_for mdl with Not_found -> [] in + Hashtbl.replace load_path_for mdl (dir :: old) + +(* Used by emacs ? *) +let emacs = ref false + +let machine_readable = ref false diff --git a/debugger4/parameters.mli b/debugger4/parameters.mli new file mode 100644 index 00000000000..a0b9d084e47 --- /dev/null +++ b/debugger4/parameters.mli @@ -0,0 +1,34 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Miscellaneous parameters *) + +val program_name : string ref +val socket_name : string ref +val arguments : string ref +val default_load_path : string list ref +val breakpoint : bool ref +val prompt : bool ref +val time : bool ref +val version : bool ref + +val add_path : string -> unit +val add_path_for : string -> string -> unit + +(* Used by emacs ? *) +val emacs : bool ref + +val machine_readable : bool ref diff --git a/debugger4/parser_aux.mli b/debugger4/parser_aux.mli new file mode 100644 index 00000000000..36c383e0c2a --- /dev/null +++ b/debugger4/parser_aux.mli @@ -0,0 +1,30 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +type expression = + E_ident of Longident.t (* x or Mod.x *) + | E_name of int (* $xxx *) + | E_item of expression * int (* x.1 x.[2] x.(3) *) + | E_field of expression * string (* x.lbl !x *) + | E_result + +type break_arg = + BA_none (* break *) + | BA_pc of Debugcom.pc (* break FRAG PC *) + | BA_function of expression (* break FUNCTION *) + | BA_pos1 of Longident.t option * int * int option + (* break @ [MODULE] LINE [POS] *) + | BA_pos2 of Longident.t option * int (* break @ [MODULE] # OFFSET *) diff --git a/debugger4/pos.ml b/debugger4/pos.ml new file mode 100644 index 00000000000..2b5b0e2e278 --- /dev/null +++ b/debugger4/pos.ml @@ -0,0 +1,26 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, projet Moscova, INRIA Rocquencourt *) +(* *) +(* Copyright 2003 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. *) +(* *) +(**************************************************************************) + +open Instruct +open Lexing +open Location +open Events + +let get_desc ev = + let loc = ev.ev_ev.ev_loc in + Printf.sprintf "file %s, line %d, characters %d-%d" + loc.loc_start.pos_fname loc.loc_start.pos_lnum + (loc.loc_start.pos_cnum - loc.loc_start.pos_bol + 1) + (loc.loc_end.pos_cnum - loc.loc_start.pos_bol + 1) diff --git a/debugger4/pos.mli b/debugger4/pos.mli new file mode 100644 index 00000000000..55999526aeb --- /dev/null +++ b/debugger4/pos.mli @@ -0,0 +1,16 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, projet Moscova, INRIA Rocquencourt *) +(* *) +(* Copyright 2003 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. *) +(* *) +(**************************************************************************) + +val get_desc : Events.code_event -> string diff --git a/debugger4/primitives.ml b/debugger4/primitives.ml new file mode 100644 index 00000000000..c6bb233813e --- /dev/null +++ b/debugger4/primitives.ml @@ -0,0 +1,126 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(*********************** Basic functions and types *********************) + +(*** Miscellaneous ***) +exception Out_of_range + +let cleanup e f = + let bt = Printexc.get_raw_backtrace () in + let () = f () in + Printexc.raise_with_backtrace e bt + +let nothing _ = () + +(*** Operations on lists. ***) + +(* Remove an element from a list *) +let except e l = + let rec except_e = function + [] -> [] + | elem::l -> if e = elem then l else elem::except_e l + in except_e l + +(* Position of an element in a list. Head of list has position 0. *) +let index a l = + let rec index_rec i = function + [] -> raise Not_found + | b::l -> if a = b then i else index_rec (i + 1) l + in index_rec 0 l + +(* Return the `n' first elements of `l' *) +(* ### n l -> l' *) +let rec list_truncate = + fun + p0 p1 -> match (p0,p1) with (0, _) -> [] + | (_, []) -> [] + | (n, (a::l)) -> a::(list_truncate (n - 1) l) + +(* Separate the `n' first elements of `l' and the others *) +(* ### n list -> (first, last) *) +let rec list_truncate2 = + fun + p0 p1 -> match (p0,p1) with (0, l) -> + ([], l) + | (_, []) -> + ([], []) + | (n, (a::l)) -> + let (first, last) = (list_truncate2 (n - 1) l) in + (a::first, last) + +(* Replace x by y in list l *) +(* ### x y l -> l' *) +let list_replace x y = + let rec repl = + function + [] -> [] + | a::l -> + if a == x then y::l + else a::(repl l) + in repl + +(*** Operations on strings. ***) + +(* Remove blanks (spaces and tabs) at beginning and end of a string. *) +let is_space = function + | ' ' | '\t' -> true | _ -> false + +let string_trim s = + let l = String.length s and i = ref 0 in + while + !i < l && is_space (String.get s !i) + do + incr i + done; + let j = ref (l - 1) in + while + !j >= !i && is_space (String.get s !j) + do + decr j + done; + String.sub s !i (!j - !i + 1) + +(* isprefix s1 s2 returns true if s1 is a prefix of s2. *) + +let isprefix s1 s2 = + let l1 = String.length s1 and l2 = String.length s2 in + (l1 = l2 && s1 = s2) || (l1 < l2 && s1 = String.sub s2 0 l1) + + +(*** I/O channels ***) + +type io_channel = { + io_in : in_channel; + io_out : out_channel; + io_fd : Unix.file_descr + } + +let io_channel_of_descr fd = { + io_in = Unix.in_channel_of_descr fd; + io_out = Unix.out_channel_of_descr fd; + io_fd = fd + } + +let close_io io_channel = + close_out_noerr io_channel.io_out; + close_in_noerr io_channel.io_in + +let std_io = { + io_in = stdin; + io_out = stdout; + io_fd = Unix.stdin + } diff --git a/debugger4/primitives.mli b/debugger4/primitives.mli new file mode 100644 index 00000000000..8b03d8d2da2 --- /dev/null +++ b/debugger4/primitives.mli @@ -0,0 +1,67 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(********************* Basic functions and types ***********************) + +(*** Miscellaneous ***) +val nothing : 'a -> unit + +(*** Types and exceptions. ***) +exception Out_of_range + +(* [cleanup e f x] runs evaluates [f x] and reraises [e] with its original + backtrace. If [f x] raises, then [e] is not raised. *) +val cleanup : exn -> (unit -> unit) -> 'a + +(*** Operations on lists. ***) + +(* Remove an element from a list *) +val except : 'a -> 'a list -> 'a list + +(* Position of an element in a list. Head of list has position 0. *) +val index : 'a -> 'a list -> int + +(* Return the `n' first elements of `l'. *) +(* ### n l -> l' *) +val list_truncate : int -> 'a list -> 'a list + +(* Separate the `n' first elements of `l' and the others. *) +(* ### n list -> (first, last) *) +val list_truncate2 : int -> 'a list -> 'a list * 'a list + +(* Replace x by y in list l *) +(* ### x y l -> l' *) +val list_replace : 'a -> 'a -> 'a list -> 'a list + +(*** Operations on strings. ***) + +(* Remove blanks (spaces and tabs) at beginning and end of a string. *) +val string_trim : string -> string + +(* isprefix s1 s2 returns true if s1 is a prefix of s2. *) +val isprefix : string -> string -> bool + +(*** I/O channels ***) + +type io_channel = { + io_in : in_channel; + io_out : out_channel; + io_fd : Unix.file_descr + } + +val io_channel_of_descr : Unix.file_descr -> io_channel +val close_io : io_channel -> unit +val std_io : io_channel diff --git a/debugger4/printval.ml b/debugger4/printval.ml new file mode 100644 index 00000000000..ef9978471c7 --- /dev/null +++ b/debugger4/printval.ml @@ -0,0 +1,108 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* To print values *) + +open Format +open Parser_aux +open Types + +(* To name printed and ellipsed values *) + +let named_values = + (Hashtbl.create 29 : (int, Debugcom.Remote_value.t * type_expr) Hashtbl.t) +let next_name = ref 1 + +let reset_named_values () = + Hashtbl.clear named_values; + next_name := 1 + +let name_value v ty = + let name = !next_name in + incr next_name; + Hashtbl.add named_values name (v, ty); + name + +let find_named_value name = + Hashtbl.find named_values name + +let check_depth depth obj ty = + if depth <= 0 then begin + let n = name_value obj ty in + Some (Outcometree.Oval_stuff ("$" ^ Int.to_string n)) + end else None + +module EvalPath = + struct + type valu = Debugcom.Remote_value.t + exception Error + + let eval_id id = + try + Debugcom.Remote_value.global (Symtable.get_global_position id) + with Symtable.Error _ -> + raise Error + + let rec eval_address = function + | Env.Aunit cu -> eval_id (cu |> Compilation_unit.to_global_ident_for_bytecode) + | Env.Alocal id -> eval_id id + | Env.Adot(root, pos) -> + let v = eval_address root in + if not (Debugcom.Remote_value.is_block v) + then raise Error + else Debugcom.Remote_value.field v pos + let same_value = Debugcom.Remote_value.same + end + +module Printer = Genprintval.Make(Debugcom.Remote_value)(EvalPath) + +let install_printer path ty _ppf fn = + Printer.install_printer path ty + (fun ppf remote_val -> + try + fn ppf (Obj.repr (Debugcom.Remote_value.obj remote_val)) + with + Debugcom.Marshalling_error -> + fprintf ppf "") + +let remove_printer = Printer.remove_printer + +let max_printer_depth = ref 20 +let max_printer_steps = ref 300 + +let print_exception ppf obj = + let t = Printer.outval_of_untyped_exception obj in + !Oprint.out_value ppf t + +let print_value max_depth env obj (ppf : Format.formatter) ty = + let t = + Printer.outval_of_value !max_printer_steps max_depth + check_depth env obj ty in + !Oprint.out_value ppf t + +let print_named_value max_depth exp env obj ppf ty = + let print_value_name ppf = function + | E_ident lid -> + Printtyp.longident ppf lid + | E_name n -> + fprintf ppf "$%i" n + | _ -> + let n = name_value obj ty in + fprintf ppf "$%i" n in + fprintf ppf "@[<2>%a:@ %a@ =@ %a@]@." + print_value_name exp + Printtyp.type_expr ty + (print_value max_depth env obj) ty diff --git a/debugger4/printval.mli b/debugger4/printval.mli new file mode 100644 index 00000000000..53c0ee4e417 --- /dev/null +++ b/debugger4/printval.mli @@ -0,0 +1,34 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Format + +val max_printer_depth : int ref +val max_printer_steps : int ref + +val print_exception: formatter -> Debugcom.Remote_value.t -> unit +val print_named_value : + int -> Parser_aux.expression -> Env.t -> + Debugcom.Remote_value.t -> formatter -> Types.type_expr -> + unit + +val reset_named_values : unit -> unit +val find_named_value : int -> Debugcom.Remote_value.t * Types.type_expr + +val install_printer : + Path.t -> Types.type_expr -> formatter -> + (formatter -> Obj.t -> unit) -> unit +val remove_printer : Path.t -> unit diff --git a/debugger4/program_loading.ml b/debugger4/program_loading.ml new file mode 100644 index 00000000000..cd757dacb80 --- /dev/null +++ b/debugger4/program_loading.ml @@ -0,0 +1,188 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Program loading *) + +open Unix +open Debugger_config +open Parameters +open Input_handling + +(*** Debugging. ***) + +let debug_loading = ref false + +(*** Load a program. ***) + +(* Function used for launching the program. *) +let launching_func = ref (function () -> ()) + +let load_program () = + !launching_func (); + main_loop () + +(*** Launching functions. ***) + +(* Returns a command line prefix to set environment for the debuggee *) +let get_unix_environment () = + let f (vname, vvalue) = + Printf.sprintf "%s=%s " vname (Filename.quote vvalue) + in + String.concat "" (List.map f !Debugger_config.environment) + +(* Notes: + 1. This quoting is not the same as [Filename.quote] because the "set" + command is a shell built-in and its quoting rules are different + from regular commands. + 2. Microsoft's documentation omits the double-quote from the list + of characters that need quoting, but that is a mistake (unquoted + quotes are included in the value, but they alter the quoting of + characters between them). + Reference: http://msdn.microsoft.com/en-us/library/bb490954.aspx + *) +let quote_for_windows_shell s = + let b = Buffer.create (20 + String.length s) in + for i = 0 to String.length s - 1 do + begin match s.[i] with + | '<' | '>' | '|' | '&' | '^' | '\"' -> + Buffer.add_char b '^'; + | _ -> () + end; + Buffer.add_char b s.[i]; + done; + Buffer.contents b + +(* Returns a command line prefix to set environment for the debuggee *) +let get_win32_environment () = + (* Note: no space before the & or Windows will add it to the value *) + let f (vname, vvalue) = + Printf.sprintf "set %s=%s&" vname (quote_for_windows_shell vvalue) + in + String.concat "" (List.map f !Debugger_config.environment) + +(* A generic function for launching the program *) +let generic_exec_unix cmdline = function () -> + if !debug_loading then + prerr_endline "Launching program..."; + let child = + try + fork () + with x -> + Unix_tools.report_error x; + raise Toplevel in + match child with + 0 -> + begin try + match fork () with + 0 -> (* Try to detach the process from the controlling terminal, + so that it does not receive SIGINT on ctrl-C. *) + begin try ignore(setsid()) with Invalid_argument _ -> () end; + execv shell [| shell; "-c"; cmdline() |] + | _ -> exit 0 + with x -> + Unix_tools.report_error x; + exit 1 + end + | _ -> + match wait () with + (_, WEXITED 0) -> () + | _ -> raise Toplevel + +let generic_exec_win cmdline = function () -> + if !debug_loading then + prerr_endline "Launching program..."; + try ignore(create_process "cmd.exe" [| "/C"; cmdline() |] stdin stdout stderr) + with x -> + Unix_tools.report_error x; + raise Toplevel + +let generic_exec = + match Sys.os_type with + "Win32" -> generic_exec_win + | _ -> generic_exec_unix + +(* Execute the program by calling the runtime explicitly *) +let exec_with_runtime = + generic_exec + (function () -> + match Sys.os_type with + "Win32" -> + (* This would fail on a file name with spaces + but quoting is even worse because Unix.create_process + thinks each command line parameter is a file. + So no good solution so far *) + Printf.sprintf "%sset CAML_DEBUG_SOCKET=%s& %s %s %s" + (get_win32_environment ()) + !socket_name + runtime_program + !program_name + !arguments + | _ -> + Printf.sprintf "%sCAML_DEBUG_SOCKET=%s %s %s %s" + (get_unix_environment ()) + !socket_name + (Filename.quote runtime_program) + (Filename.quote !program_name) + !arguments) + +(* Execute the program directly *) +let exec_direct = + generic_exec + (function () -> + match Sys.os_type with + "Win32" -> + (* See the comment above *) + Printf.sprintf "%sset CAML_DEBUG_SOCKET=%s& %s %s" + (get_win32_environment ()) + !socket_name + !program_name + !arguments + | _ -> + Printf.sprintf "%sCAML_DEBUG_SOCKET=%s %s %s" + (get_unix_environment ()) + !socket_name + (Filename.quote !program_name) + !arguments) + +(* Ask the user. *) +let exec_manual = + function () -> + print_newline (); + print_string "Waiting for connection..."; + print_string ("(the socket is " ^ !socket_name ^ ")"); + print_newline () + +(*** Selection of the launching function. ***) + +type launching_function = (unit -> unit) + +let loading_modes = + ["direct", exec_direct; + "runtime", exec_with_runtime; + "manual", exec_manual] + +let set_launching_function func = + launching_func := func + +(* Initialization *) + +let _ = + set_launching_function exec_direct + +(*** Connection. ***) + +let connection = ref Primitives.std_io +let connection_opened = ref false diff --git a/debugger4/program_loading.mli b/debugger4/program_loading.mli new file mode 100644 index 00000000000..cb4c2161589 --- /dev/null +++ b/debugger4/program_loading.mli @@ -0,0 +1,35 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(*** Debugging. ***) + +val debug_loading : bool ref + +(*** Load program ***) + +(* Function used for launching the program. *) +val launching_func : (unit -> unit) ref + +val load_program : unit -> unit + +type launching_function = (unit -> unit) + +val loading_modes : (string * launching_function) list +val set_launching_function : launching_function -> unit + +(** Connection **) +val connection : Primitives.io_channel ref +val connection_opened : bool ref diff --git a/debugger4/program_management.ml b/debugger4/program_management.ml new file mode 100644 index 00000000000..8f6d62bf8e4 --- /dev/null +++ b/debugger4/program_management.ml @@ -0,0 +1,163 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Manage the loading of the program *) + +open Int64ops +open Unix +open Unix_tools +open Debugger_config +open Primitives +open Parameters +open Input_handling +open Question +open Program_loading +open Time_travel + +(*** Connection opening and control. ***) + +(* Name of the file if the socket is in the unix domain.*) +let file_name = ref (None : string option) + +(* Default connection handler. *) +let buffer = Bytes.create 1024 +let control_connection pid fd = + if (read fd.io_fd buffer 0 1024) = 0 then + forget_process fd pid + else begin + prerr_string "Garbage data from process "; + prerr_int pid; + prerr_endline "" + end + +(* Accept a connection from another process. *) +let accept_connection continue fd = + let (sock, _) = accept fd.io_fd in + let io_chan = io_channel_of_descr sock in + let pid = input_binary_int io_chan.io_in in + if pid = -1 then begin + let pid' = input_binary_int io_chan.io_in in + new_checkpoint pid' io_chan; + Input_handling.add_file io_chan (control_connection pid'); + continue () + end + else begin + if set_file_descriptor pid io_chan then + Input_handling.add_file io_chan (control_connection pid) + end + +(* Initialize the socket. *) +let open_connection address continue = + try + let (sock_domain, sock_address) = convert_address address in + file_name := + (match sock_address with + ADDR_UNIX file -> + Some file + | _ -> + None); + let sock = socket sock_domain SOCK_STREAM 0 in + (try + bind sock sock_address; + setsockopt sock SO_REUSEADDR true; + listen sock 3; + connection := io_channel_of_descr sock; + Input_handling.add_file !connection (accept_connection continue); + connection_opened := true + with x -> cleanup x @@ fun () -> close sock) + with + Failure _ -> raise Toplevel + | (Unix_error _) as err -> report_error err; raise Toplevel + +(* Close the socket. *) +let close_connection () = + if !connection_opened then begin + connection_opened := false; + Input_handling.remove_file !connection; + close_io !connection; + match !file_name with + Some file -> + unlink file + | None -> + () + end + +(*** Kill program. ***) +let loaded = ref false + +let kill_program () = + Breakpoints.remove_all_breakpoints (); + History.empty_history (); + kill_all_checkpoints (); + loaded := false; + close_connection () + +let ask_kill_program () = + if not !loaded then + true + else + let answer = yes_or_no "A program is being debugged already. Kill it" in + if answer then + kill_program (); + answer + +(*** Program loading and initializations. ***) + +let initialize_loading () = + if !debug_loading then begin + prerr_endline "Loading debugging information..."; + Printf.fprintf Stdlib.stderr "\tProgram: [%s]\n%!" !program_name; + end; + begin try access !program_name [F_OK] + with Unix_error _ -> + prerr_endline "Program not found."; + raise Toplevel; + end; + Symbols.clear_symbols (); + Symbols.read_symbols Debugcom.main_frag !program_name; + let Load_path.{visible; hidden} = Load_path.get_paths () in + let visible = visible @ !Symbols.program_source_dirs in + Load_path.init ~auto_include:Compmisc.auto_include ~visible ~hidden; + Envaux.reset_cache ~preserve_persistent_env:false; + if !debug_loading then + prerr_endline "Opening a socket..."; + open_connection !socket_name + (function () -> + go_to _0; + Symbols.set_all_events Debugcom.main_frag; + exit_main_loop ()) + +(* Ensure the program is already loaded. *) +let ensure_loaded () = + if not !loaded then begin + print_string "Loading program... "; + flush Stdlib.stdout; + if !program_name = "" then begin + prerr_endline "No program specified."; + raise Toplevel + end; + try + initialize_loading(); + !launching_func (); + if !debug_loading then + prerr_endline "Waiting for connection..."; + main_loop (); + loaded := true; + prerr_endline "done." + with + x -> + cleanup x kill_program + end diff --git a/debugger4/program_management.mli b/debugger4/program_management.mli new file mode 100644 index 00000000000..384067832ef --- /dev/null +++ b/debugger4/program_management.mli @@ -0,0 +1,28 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(*** Program loading and initializations. ***) + +val loaded : bool ref +val ensure_loaded : unit -> unit + +(*** Kill program. ***) +val kill_program : unit -> unit + +(* Ask whether to kill the program or not. *) +(* If yes, kill it. *) +(* Return true iff the program has been killed. *) +val ask_kill_program : unit -> bool diff --git a/debugger4/question.ml b/debugger4/question.ml new file mode 100644 index 00000000000..ed294beacbc --- /dev/null +++ b/debugger4/question.ml @@ -0,0 +1,48 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Nicolas Pouillard, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2006 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. *) +(* *) +(**************************************************************************) + +open Input_handling +open Primitives +module Lexer = Debugger_lexer + +(* Ask user a yes or no question. *) +let yes_or_no message = + if !interactif then + let finally = + let old_prompt = !current_prompt in + fun () -> stop_user_input (); current_prompt := old_prompt + in + Fun.protect ~finally @@ fun () -> + current_prompt := message ^ " ? (y or n) "; + let answer = + let rec ask () = + resume_user_input (); + let line = + string_trim (Lexer.line (Lexing.from_function read_user_input)) + in + match (if String.length line > 0 then line.[0] else ' ') with + 'y' -> true + | 'n' -> false + | _ -> + stop_user_input (); + print_string "Please answer y or n."; + print_newline (); + ask () + in + ask () + in + answer + else + false diff --git a/debugger4/question.mli b/debugger4/question.mli new file mode 100644 index 00000000000..75f22555daf --- /dev/null +++ b/debugger4/question.mli @@ -0,0 +1,17 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Nicolas Pouillard, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2006 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. *) +(* *) +(**************************************************************************) + +(* Ask user a yes or no question. *) +val yes_or_no : string -> bool diff --git a/debugger4/show_information.ml b/debugger4/show_information.ml new file mode 100644 index 00000000000..27cdf5f6c19 --- /dev/null +++ b/debugger4/show_information.ml @@ -0,0 +1,121 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Instruct +open Format +open Debugcom +open Checkpoints +open Events +open Symbols +open Frames +open Source +open Show_source +open Breakpoints +open Parameters + +(* Display information about the current event. *) +let show_current_event ppf = + if !Parameters.time then begin + fprintf ppf "Time: %Li" (current_time ()); + (match current_pc () with + | Some pc -> + fprintf ppf " - pc: %i:%i" pc.frag pc.pos + | _ -> ()); + end; + update_current_event (); + reset_frame (); + match current_report () with + | None -> + if !Parameters.time then fprintf ppf "@."; + fprintf ppf "Beginning of program.@."; + show_no_point () + | Some {rep_type = (Event | Breakpoint); rep_program_pointer = pc} -> + let ev = (get_current_event ()).ev_ev in + if !Parameters.time then fprintf ppf " - module %s@." ev.ev_module; + (match breakpoints_at_pc pc with + | [] -> + () + | [breakpoint] -> + fprintf ppf "Breakpoint: %i@." breakpoint + | breakpoints -> + fprintf ppf "Breakpoints: %a@." + (fun ppf l -> + List.iter + (function x -> fprintf ppf "%i " x) l) + (List.sort compare breakpoints)); + show_point ev true + | Some {rep_type = Exited} -> + if !Parameters.time then fprintf ppf "@."; + fprintf ppf "Program exit.@."; + show_no_point () + | Some {rep_type = Uncaught_exc} -> + if !Parameters.time then fprintf ppf "@."; + fprintf ppf + "Program end.@.\ + @[Uncaught exception:@ %a@]@." + Printval.print_exception (Debugcom.Remote_value.accu ()); + show_no_point () + | Some {rep_type = Code_loaded frag} -> + let mds = String.concat ", " (Symbols.modules_in_code_fragment frag) in + fprintf ppf "@.Module(s) %s loaded.@." mds; + show_no_point () + | Some {rep_type = Trap_barrier} + | Some {rep_type = Debug_info _} + | Some {rep_type = Code_unloaded _} -> + (* Not visible outside *) + (* of module `time_travel'. *) + if !Parameters.time then fprintf ppf "@."; + Misc.fatal_error "Show_information.show_current_event" + +(* Display short information about one frame. *) + +let show_one_frame framenum ppf ev = + let pos = Events.get_pos ev.ev_ev in + let cnum = + try + let buffer = get_buffer pos ev.ev_ev.ev_module in + snd (start_and_cnum buffer pos) + with _ -> pos.Lexing.pos_cnum in + if !machine_readable then + fprintf ppf "#%i Pc: %i:%i %s char %i@." + framenum ev.ev_frag ev.ev_ev.ev_pos ev.ev_ev.ev_module + cnum + else + fprintf ppf "#%i %s %s:%i:%i@." + framenum ev.ev_ev.ev_module + pos.Lexing.pos_fname pos.Lexing.pos_lnum + (pos.Lexing.pos_cnum - pos.Lexing.pos_bol + 1) + +(* Display information about the current frame. *) +(* --- `select frame' must have succeeded before calling this function. *) +let show_current_frame ppf selected = + match !selected_event with + | None -> + fprintf ppf "@.No frame selected.@." + | Some sel_ev -> + show_one_frame !current_frame ppf sel_ev; + begin match breakpoints_at_pc + {frag=sel_ev.ev_frag; pos = sel_ev.ev_ev.ev_pos} with + | [] -> () + | [breakpoint] -> + fprintf ppf "Breakpoint: %i@." breakpoint + | breakpoints -> + fprintf ppf "Breakpoints: %a@." + (fun ppf l -> + List.iter (function x -> fprintf ppf "%i " x) l) + (List.sort compare breakpoints); + end; + show_point sel_ev.ev_ev selected diff --git a/debugger4/show_information.mli b/debugger4/show_information.mli new file mode 100644 index 00000000000..bc5df9d9e67 --- /dev/null +++ b/debugger4/show_information.mli @@ -0,0 +1,27 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Format + +(* Display information about the current event. *) +val show_current_event : formatter -> unit + +(* Display information about the current frame. *) +(* --- `select frame' must have succeeded before calling this function. *) +val show_current_frame : formatter -> bool -> unit + +(* Display short information about one frame. *) +val show_one_frame : int -> formatter -> Events.code_event -> unit diff --git a/debugger4/show_source.ml b/debugger4/show_source.ml new file mode 100644 index 00000000000..357132da727 --- /dev/null +++ b/debugger4/show_source.ml @@ -0,0 +1,94 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Debugger_config +open Instruct +open Parameters +open Primitives +open Printf +open Source + +(* Print a line; return the beginning of the next line *) +let print_line buffer line_number start point before = + let linefeed = next_linefeed buffer start + and content = buffer_content buffer + in + printf "%i " line_number; + let line_end = + if linefeed > 0 && content.[linefeed - 1] = '\r' then + linefeed - 1 + else + linefeed in + if point <= line_end && point >= start then + (print_string (String.sub content start (point - start)); + print_string (if before then event_mark_before else event_mark_after); + print_string (String.sub content point (line_end - point))) + else + print_string (String.sub content start (line_end - start)); + print_newline (); + linefeed + +(* Tell Emacs we are nowhere in the source. *) +let show_no_point () = + if !emacs then printf "\026\026H\n" + +(* Print the line containing the point *) +let show_point ev selected = + let mdle = ev.ev_module in + let before = (ev.ev_kind = Event_before) in + if !emacs && selected then + begin try + let buffer = get_buffer (Events.get_pos ev) mdle in + let source = source_of_module ev.ev_loc.Location.loc_start mdle in + printf "\026\026M%s:%i:%i" source + (snd (start_and_cnum buffer ev.ev_loc.Location.loc_start)) + (snd (start_and_cnum buffer ev.ev_loc.Location.loc_end)); + printf "%s\n" (if before then ":before" else ":after") + with + Out_of_range -> (* point_of_coord *) + prerr_endline "Position out of range." + | Not_found -> (* Events.get_pos || get_buffer *) + prerr_endline ("No source file for " ^ mdle ^ "."); + show_no_point () + end + else + begin try + let pos = Events.get_pos ev in + let buffer = get_buffer pos mdle in + let start, point = start_and_cnum buffer pos in + ignore(print_line buffer pos.Lexing.pos_lnum start point before) + with + Out_of_range -> (* point_of_coord *) + prerr_endline "Position out of range." + | Not_found -> (* Events.get_pos || get_buffer *) + prerr_endline ("No source file for " ^ mdle ^ ".") + end + +(* Display part of the source. *) +let show_listing pos mdle start stop point before = + try + let buffer = get_buffer pos mdle in + let rec aff (line_start, line_number) = + if line_number <= stop then + aff (print_line buffer line_number line_start point before + 1, + line_number + 1) + in + aff (pos_of_line buffer start) + with + Out_of_range -> (* pos_of_line *) + prerr_endline "Position out of range." + | Not_found -> (* get_buffer *) + prerr_endline ("No source file for " ^ mdle ^ ".") diff --git a/debugger4/show_source.mli b/debugger4/show_source.mli new file mode 100644 index 00000000000..570a6d491cf --- /dev/null +++ b/debugger4/show_source.mli @@ -0,0 +1,25 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Print the line containing the point *) +val show_point : Instruct.debug_event -> bool -> unit + +(* Tell Emacs we are nowhere in the source. *) +val show_no_point : unit -> unit + +(* Display part of the source. *) +val show_listing : + Lexing.position -> string -> int -> int -> int -> bool -> unit diff --git a/debugger4/source.ml b/debugger4/source.ml new file mode 100644 index 00000000000..d2045cf61b6 --- /dev/null +++ b/debugger4/source.ml @@ -0,0 +1,191 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(************************ Source management ****************************) + +open Misc +open Primitives + +let source_extensions = [".ml"] + +(*** Conversion function. ***) + +let source_of_module pos mdle = + let pos_fname = pos.Lexing.pos_fname in + if Sys.file_exists pos_fname then pos_fname else + let is_submodule m m' = + let len' = String.length m' in + try + (String.sub m 0 len') = m' && (String.get m len') = '.' + with + Invalid_argument _ -> false in + let path = + Hashtbl.fold + (fun mdl dirs acc -> + if is_submodule mdle mdl then + dirs + else + acc) + Debugger_config.load_path_for + (Load_path.get_path_list ()) in + let fname = pos.Lexing.pos_fname in + if fname = "" then + let innermost_module = + try + let dot_index = String.rindex mdle '.' in + String.sub mdle (succ dot_index) (pred (String.length mdle - dot_index)) + with Not_found -> mdle in + let rec loop = + function + | [] -> raise Not_found + | ext :: exts -> + try find_in_path_uncap path (innermost_module ^ ext) + with Not_found -> loop exts + in loop source_extensions + else if Filename.is_relative fname then + find_in_path_rel path fname + else if Sys.file_exists fname then fname + else raise Not_found + +(*** Buffer cache ***) + +(* Buffer and cache (to associate lines and positions in the buffer). *) +type buffer = string * (int * int) list ref + +let buffer_max_count = ref 10 + +let buffer_list = + ref ([] : (string * buffer) list) + +let flush_buffer_list () = + buffer_list := [] + +let get_buffer pos mdle = + try List.assoc mdle !buffer_list with + Not_found -> + let inchan = open_in_bin (source_of_module pos mdle) in + let content = really_input_string inchan (in_channel_length inchan) in + let buffer = (content, ref []) in + buffer_list := + (list_truncate !buffer_max_count ((mdle, buffer)::!buffer_list)); + buffer + +let buffer_content = + (fst : buffer -> string) + +let buffer_length x = + String.length (buffer_content x) + +(*** Position conversions. ***) + +type position = int * int + +(* Insert a new pair (position, line) in the cache of the given buffer. *) +let insert_pos buffer ((position, line) as pair) = + let rec new_list = + function + [] -> + [(position, line)] + | ((_pos, lin) as a::l) as l' -> + if lin < line then + pair::l' + else if lin = line then + l' + else + a::(new_list l) + in + let buffer_cache = snd buffer in + buffer_cache := new_list !buffer_cache + +(* Position of the next linefeed after `pos'. *) +(* Position just after the buffer end if no linefeed found. *) +(* Raise `Out_of_range' if already there. *) +let next_linefeed (buffer, _) pos = + let len = String.length buffer in + if pos >= len then + raise Out_of_range + else + let rec search p = + if p = len || String.get buffer p = '\n' then + p + else + search (succ p) + in + search pos + +(* Go to next line. *) +let next_line buffer (pos, line) = + (next_linefeed buffer pos + 1, line + 1) + +(* Convert a position in the buffer to a line number. *) +let line_of_pos buffer position = + let rec find = + function + | [] -> + if position < 0 then + raise Out_of_range + else + (0, 1) + | ((pos, _line) as pair)::l -> + if pos > position then + find l + else + pair + and find_line previous = + let (pos, _line) as next = next_line buffer previous in + if pos <= position then + find_line next + else + previous + in + let result = find_line (find !(snd buffer)) in + insert_pos buffer result; + result + +(* Convert a line number to a position. *) +let pos_of_line buffer line = + let rec find = + function + [] -> + if line <= 0 then + raise Out_of_range + else + (0, 1) + | ((_pos, lin) as pair)::l -> + if lin > line then + find l + else + pair + and find_pos previous = + let (_, lin) as next = next_line buffer previous in + if lin <= line then + find_pos next + else + previous + in + let result = find_pos (find !(snd buffer)) in + insert_pos buffer result; + result + +(* Convert a coordinate (line / column) into a position. *) +(* --- The first line and column are line 1 and column 1. *) +let point_of_coord buffer line column = + fst (pos_of_line buffer line) + (pred column) + +let start_and_cnum buffer pos = + let line_number = pos.Lexing.pos_lnum in + let start = point_of_coord buffer line_number 1 in + start, start + (pos.Lexing.pos_cnum - pos.Lexing.pos_bol) diff --git a/debugger4/source.mli b/debugger4/source.mli new file mode 100644 index 00000000000..119d6704a72 --- /dev/null +++ b/debugger4/source.mli @@ -0,0 +1,62 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(************************ Source management ****************************) + +(*** Conversion function. ***) + +val source_of_module: Lexing.position -> string -> string + +(*** buffer cache ***) + +type buffer + +val buffer_max_count : int ref + +val flush_buffer_list : unit -> unit + +val get_buffer : Lexing.position -> string -> buffer + +val buffer_content : buffer -> string +val buffer_length : buffer -> int + +(*** Position conversions. ***) + +(* Pair (position, line) where `position' is the position in character of *) +(* the beginning of the line (first character is 0) and `line' is its *) +(* number (first line number is 1). *) +type position = int * int + +(* Position of the next linefeed after `pos'. *) +(* Position just after the buffer end if no linefeed found. *) +(* Raise `Out_of_range' if already there. *) +val next_linefeed : buffer -> int -> int + +(* Go to next line. *) +val next_line : buffer -> position -> position + +(* Convert a position in the buffer to a line number. *) +val line_of_pos : buffer -> int -> position + +(* Convert a line number to a position. *) +val pos_of_line : buffer -> int -> position + +(* Convert a coordinate (line / column) into a position. *) +(* --- The first line and column are line 1 and column 1. *) +val point_of_coord : buffer -> int -> int -> int + +(* Return the offsets of both line start and cnum for the passed position. *) +val start_and_cnum : buffer -> Lexing.position -> (int * int) diff --git a/debugger4/symbols.ml b/debugger4/symbols.ml new file mode 100644 index 00000000000..36f8f874eb0 --- /dev/null +++ b/debugger4/symbols.ml @@ -0,0 +1,259 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Handling of symbol tables (globals and events) *) + +open Instruct +open Debugger_config (* Toplevel *) +open Program_loading +open Debugcom +open Events +module String = Misc.Stdlib.String + +let modules = + ref ([] : string list) + +let program_source_dirs = + ref ([] : string list) + +let events_by_pc = + (Hashtbl.create 257 : (pc, debug_event) Hashtbl.t) +let events_by_module = + (Hashtbl.create 17 : (string, int * debug_event array) Hashtbl.t) +let all_events_by_module = + (Hashtbl.create 17 : (string, int * debug_event list) Hashtbl.t) + +let partition_modules evl = + let rec partition_modules' ev evl = + match evl with + [] -> [ev],[] + | ev'::evl -> + let evl,evll = partition_modules' ev' evl in + if ev.ev_module = ev'.ev_module then ev::evl,evll else [ev],evl::evll + in + match evl with + [] -> [] + | ev::evl -> let evl,evll = partition_modules' ev evl in evl::evll + +let relocate_event orig ev = + ev.ev_pos <- orig + ev.ev_pos; + match ev.ev_repr with + Event_parent repr -> repr := ev.ev_pos + | _ -> () + +let read_symbols' bytecode_file = + let ic = open_in_bin bytecode_file in + let toc = + try + let toc = Bytesections.read_toc ic in + ignore(Bytesections.seek_section toc ic Bytesections.Name.SYMB); + toc + with Bytesections.Bad_magic_number | Not_found -> + prerr_string bytecode_file; prerr_endline " is not a bytecode file."; + raise Toplevel + in + Symtable.restore_state (input_value ic); + begin try + ignore (Bytesections.seek_section toc ic Bytesections.Name.DBUG) + with Not_found -> + prerr_string bytecode_file; prerr_endline " has no debugging info."; + raise Toplevel + end; + let num_eventlists = input_binary_int ic in + let dirs = ref String.Set.empty in + let eventlists = ref [] in + for _i = 1 to num_eventlists do + let orig = input_binary_int ic in + let evl = (input_value ic : debug_event list) in + (* Relocate events in event list *) + List.iter (relocate_event orig) evl; + let evll = partition_modules evl in + eventlists := evll @ !eventlists; + dirs := + List.fold_left (fun s e -> String.Set.add e s) !dirs (input_value ic) + done; + begin try + ignore (Bytesections.seek_section toc ic Bytesections.Name.CODE) + with Not_found -> + (* The file contains only debugging info, + loading mode is forced to "manual" *) + set_launching_function (List.assoc "manual" loading_modes) + end; + close_in_noerr ic; + !eventlists, !dirs + +let clear_symbols () = + modules := []; + program_source_dirs := []; + Hashtbl.clear events_by_pc; Hashtbl.clear events_by_module; + Hashtbl.clear all_events_by_module + +let add_symbols frag all_events = + List.iter + (fun evl -> + List.iter + (fun ev -> + Hashtbl.add events_by_pc {frag; pos = ev.ev_pos} ev) + evl) + all_events; + + List.iter + (function + [] -> () + | ev :: _ as evl -> + let md = ev.ev_module in + let cmp ev1 ev2 = compare (Events.get_pos ev1).Lexing.pos_cnum + (Events.get_pos ev2).Lexing.pos_cnum + in + let sorted_evl = List.sort cmp evl in + modules := md :: !modules; + Hashtbl.add all_events_by_module md (frag, sorted_evl); + let real_evl = + List.filter + (function + {ev_kind = Event_pseudo} -> false + | _ -> true) + sorted_evl + in + Hashtbl.add events_by_module md (frag, Array.of_list real_evl)) + all_events + +let read_symbols frag bytecode_file = + let all_events, all_dirs = read_symbols' bytecode_file in + program_source_dirs := !program_source_dirs @ (String.Set.elements all_dirs); + add_symbols frag all_events + +let erase_symbols frag = + let pcs = Hashtbl.fold (fun pc _ pcs -> + if pc.frag = frag then pc :: pcs else pcs) + events_by_pc [] + in + List.iter (Hashtbl.remove events_by_pc) pcs; + + let mds = Hashtbl.fold (fun md (frag', _) mds -> + if frag' = frag then md :: mds else mds) + events_by_module [] + in + List.iter (Hashtbl.remove events_by_module) mds; + List.iter (Hashtbl.remove all_events_by_module) mds; + modules := List.filter (fun md -> not (List.mem md mds)) !modules + +let code_fragments () = + let frags = + Hashtbl.fold + (fun _ (frag, _) l -> frag :: l) + all_events_by_module [] + in + List.sort_uniq compare frags + +let modules_in_code_fragment frag' = + Hashtbl.fold (fun md (frag, _) l -> + if frag' = frag then md :: l else l) + all_events_by_module [] + +let any_event_at_pc pc = + { ev_frag = pc.frag; ev_ev = Hashtbl.find events_by_pc pc } + +let event_at_pc pc = + match any_event_at_pc pc with + { ev_ev = { ev_kind = Event_pseudo } } -> raise Not_found + | ev -> ev + +let set_event_at_pc pc = + try ignore(event_at_pc pc); set_event pc + with Not_found -> () + +(* List all events in module *) +let events_in_module mdle = + try + Hashtbl.find all_events_by_module mdle + with Not_found -> + 0, [] + +(* Binary search of event at or just after char *) +let find_event ev char = + let rec bsearch lo hi = + if lo >= hi then begin + if (Events.get_pos ev.(hi)).Lexing.pos_cnum < char + then raise Not_found + else hi + end else begin + let pivot = (lo + hi) / 2 in + let e = ev.(pivot) in + if char <= (Events.get_pos e).Lexing.pos_cnum + then bsearch lo pivot + else bsearch (pivot + 1) hi + end + in + if Array.length ev = 0 then + raise Not_found + else + bsearch 0 (Array.length ev - 1) + +(* Return first event after the given position. *) +(* Raise [Not_found] if module is unknown or no event is found. *) +let event_at_pos md char = + let ev_frag, ev = Hashtbl.find events_by_module md in + { ev_frag; ev_ev = ev.(find_event ev char) } + +(* Return event closest to given position *) +(* Raise [Not_found] if module is unknown or no event is found. *) +let event_near_pos md char = + let ev_frag, ev = Hashtbl.find events_by_module md in + try + let pos = find_event ev char in + (* Desired event is either ev.(pos) or ev.(pos - 1), + whichever is closest *) + if pos > 0 && char - (Events.get_pos ev.(pos - 1)).Lexing.pos_cnum + <= (Events.get_pos ev.(pos)).Lexing.pos_cnum - char + then { ev_frag; ev_ev = ev.(pos - 1) } + else { ev_frag; ev_ev = ev.(pos) } + with Not_found -> + let pos = Array.length ev - 1 in + if pos < 0 then raise Not_found; + { ev_frag; ev_ev = ev.(pos) } + +(* Flip "event" bit on all instructions *) +let set_all_events frag = + Hashtbl.iter + (fun pc ev -> + match ev.ev_kind with + Event_pseudo -> () + | _ when pc.frag = frag -> set_event pc + | _ -> ()) + events_by_pc + +(* Previous `pc'. *) +(* Save time if `update_current_event' is called *) +(* several times at the same point. *) +let old_pc = ref (None : pc option) + +(* Recompute the current event *) +let update_current_event () = + match Checkpoints.current_pc () with + None -> + Events.current_event := None; + old_pc := None + | (Some pc) as opt_pc when opt_pc <> !old_pc -> + Events.current_event := + begin try + Some (event_at_pc pc) + with Not_found -> + None + end; + old_pc := opt_pc + | _ -> + () diff --git a/debugger4/symbols.mli b/debugger4/symbols.mli new file mode 100644 index 00000000000..30728f5585d --- /dev/null +++ b/debugger4/symbols.mli @@ -0,0 +1,71 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Events + +(* Modules used by the program. *) +val modules : string list ref + +(* Absolute directories containing source code on machine where source was + * compiled *) +val program_source_dirs : string list ref + +(* Clear loaded symbols *) +val clear_symbols : unit -> unit + +(* Read debugging info from executable or dynlinkable file + and associate with given code fragment *) +val read_symbols : int -> string -> unit + +(* Add debugging info from memory and associate with given + code fragment *) +val add_symbols : int -> Instruct.debug_event list list -> unit + +(* Erase debugging info associated with given code fragment *) +val erase_symbols : int -> unit + +(* Return the list of all code fragments that have debug info associated *) +val code_fragments : unit -> int list + +(* Flip "event" bit on all instructions in given fragment *) +val set_all_events : int -> unit + +(* Return event at given PC, or raise Not_found *) +(* Can also return pseudo-event at beginning of functions *) +val any_event_at_pc : Debugcom.pc -> code_event + +(* Return event at given PC, or raise Not_found *) +val event_at_pc : Debugcom.pc -> code_event + +(* Set event at given PC *) +val set_event_at_pc : Debugcom.pc -> unit + +(* List the events in `module'. *) +val events_in_module : string -> int * Instruct.debug_event list + +(* List the modules in given code fragment. *) +val modules_in_code_fragment : int -> string list + +(* First event after the given position. *) +(* --- Raise `Not_found' if no such event. *) +val event_at_pos : string -> int -> code_event + +(* Closest event from given position. *) +(* --- Raise `Not_found' if no such event. *) +val event_near_pos : string -> int -> code_event + +(* Recompute the current event *) +val update_current_event : unit -> unit diff --git a/debugger4/time_travel.ml b/debugger4/time_travel.ml new file mode 100644 index 00000000000..7a2665d3051 --- /dev/null +++ b/debugger4/time_travel.ml @@ -0,0 +1,705 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(**************************** Time travel ******************************) + +open Int64ops +open Instruct +open Events +open Debugcom +open Primitives +open Checkpoints +open Breakpoints +open Trap_barrier +open Input_handling +open Debugger_config +open Program_loading +open Question + +exception Current_checkpoint_lost +exception Current_checkpoint_lost_start_at of int64 * int64 + +let remove_1st key list = + let rec remove = + function + [] -> [] + | a::l -> if a == key then l else a::(remove l) + in + remove list + +(*** Debugging. ***) + +let debug_time_travel = ref false + +(*** Internal utilities. ***) + +(* Insert a checkpoint in the checkpoint list. + * Raise `Exit' if there is already a checkpoint at the same time. + *) +let insert_checkpoint ({c_time = time} as checkpoint) = + let rec traverse = + function + [] -> [checkpoint] + | (({c_time = t} as a)::l) as l' -> + if t > time then + a::(traverse l) + else if t = time then + raise Exit + else + checkpoint::l' + in + checkpoints := traverse !checkpoints + +(* Remove a checkpoint from the checkpoint list. + * --- No error if not found. + *) +let remove_checkpoint checkpoint = + checkpoints := remove_1st checkpoint !checkpoints + +(* Wait for the process used by `checkpoint' to connect. + * --- Usually not called (the process is already connected). + *) +let wait_for_connection checkpoint = + try + Exec.unprotect + (function () -> + let old_controller = Input_handling.current_controller !connection in + execute_with_other_controller + (function + fd -> + old_controller fd; + if checkpoint.c_valid = true then + exit_main_loop ()) + !connection + main_loop) + with + Sys.Break -> + checkpoint.c_parent <- root; + remove_checkpoint checkpoint; + checkpoint.c_pid <- -1; + raise Sys.Break + +(* Select a checkpoint as current. *) +let set_current_checkpoint checkpoint = + if !debug_time_travel then + prerr_endline ("Select: " ^ (Int.to_string checkpoint.c_pid)); + if not checkpoint.c_valid then + wait_for_connection checkpoint; + current_checkpoint := checkpoint; + let dead_frags = List.filter (fun frag -> + not (List.mem frag checkpoint.c_code_fragments)) + (Symbols.code_fragments ()) + in + List.iter Symbols.erase_symbols dead_frags; + set_current_connection checkpoint.c_fd + +(* Kill `checkpoint'. *) +let kill_checkpoint checkpoint = + if !debug_time_travel then + prerr_endline ("Kill: " ^ (Int.to_string checkpoint.c_pid)); + if checkpoint.c_pid > 0 then (* Ghosts don't have to be killed ! *) + (if not checkpoint.c_valid then + wait_for_connection checkpoint; + stop checkpoint.c_fd; + if checkpoint.c_parent.c_pid > 0 then + wait_child checkpoint.c_parent.c_fd; + checkpoint.c_parent <- root; + close_io checkpoint.c_fd; + remove_file checkpoint.c_fd; + remove_checkpoint checkpoint); + checkpoint.c_pid <- -1 (* Don't exist anymore *) + +(*** Cleaning the checkpoint list. ***) + +(* Separate checkpoints before (<=) and after (>) `t'. *) +(* ### t checkpoints -> (after, before) *) +let cut t = + let rec cut_t = + function + [] -> ([], []) + | ({c_time = t'} as a::l) as l' -> + if t' <= t then + ([], l') + else + let (b, e) = cut_t l in + (a::b, e) + in + cut_t + +(* Partition the checkpoints list. *) +let cut2 t0 t l = + let rec cut2_t0 t = + function + [] -> [] + | l -> + let (after, before) = cut (t0 -- t -- _1) l in + let l = cut2_t0 (t ++ t) before in + after::l + in + let (after, before) = cut (t0 -- _1) l in + after::(cut2_t0 t before) + +(* Separate first elements and last element of a list of checkpoints. *) +let chk_merge2 cont = + let rec chk_merge2_cont = + function + [] -> cont + | [a] -> + let (accepted, rejected) = cont in + (a::accepted, rejected) + | a::l -> + let (accepted, rejected) = chk_merge2_cont l in + (accepted, a::rejected) + in chk_merge2_cont + +(* Separate the checkpoint list. *) +(* ### list -> accepted * rejected *) +let rec chk_merge = + function + [] -> ([], []) + | l::tail -> + chk_merge2 (chk_merge tail) l + +let new_checkpoint_list checkpoint_count accepted rejected = + if List.length accepted >= checkpoint_count then + let (k, l) = list_truncate2 checkpoint_count accepted in + (k, l @ rejected) + else + let (k, l) = + list_truncate2 (checkpoint_count - List.length accepted) rejected + in + (List.merge (fun t1 t2 -> compare t2.c_time t1.c_time) accepted k, + l) + +(* Clean the checkpoint list. *) +(* Reference time is `time'. *) +let clean_checkpoints time checkpoint_count = + let (after, before) = cut time !checkpoints in + let (accepted, rejected) = + chk_merge (cut2 time !checkpoint_small_step before) + in + let (kept, lost) = + new_checkpoint_list checkpoint_count accepted after + in + List.iter kill_checkpoint (lost @ rejected); + checkpoints := kept + +(*** Internal functions for moving. ***) + +(* Find the first checkpoint before (or at) `time'. + * Ask for reloading the program if necessary. + *) +let find_checkpoint_before time = + let rec find = + function + [] -> + print_string "Can't go that far in the past !"; print_newline (); + if yes_or_no "Reload program" then begin + load_program (); + find !checkpoints + end + else + raise Toplevel + | { c_time = t } as a::l -> + if t > time then + find l + else + a + in find !checkpoints + +(* Make a copy of the current checkpoint and clean the checkpoint list. *) +(* --- The new checkpoint is not put in the list. *) +let duplicate_current_checkpoint () = + let checkpoint = !current_checkpoint in + if not checkpoint.c_valid then + wait_for_connection checkpoint; + let new_checkpoint = (* Ghost *) + {c_time = checkpoint.c_time; + c_pid = 0; + c_fd = checkpoint.c_fd; + c_valid = false; + c_report = checkpoint.c_report; + c_state = C_stopped; + c_parent = checkpoint; + c_breakpoint_version = checkpoint.c_breakpoint_version; + c_breakpoints = checkpoint.c_breakpoints; + c_trap_barrier = checkpoint.c_trap_barrier; + c_code_fragments = checkpoint.c_code_fragments} + in + checkpoints := list_replace checkpoint new_checkpoint !checkpoints; + set_current_checkpoint checkpoint; + clean_checkpoints (checkpoint.c_time ++ _1) (!checkpoint_max_count - 1); + if new_checkpoint.c_pid = 0 then (* The ghost has not been killed *) + (match do_checkpoint () with (* Duplicate checkpoint *) + Checkpoint_done pid -> + (new_checkpoint.c_pid <- pid; + if !debug_time_travel then + prerr_endline ("Waiting for connection: " ^ Int.to_string pid)) + | Checkpoint_failed -> + prerr_endline + "A fork failed. Reducing maximum number of checkpoints."; + checkpoint_max_count := List.length !checkpoints - 1; + remove_checkpoint new_checkpoint) + +(* Was the movement interrupted ? *) +(* --- An exception could have been used instead, *) +(* --- but it is not clear where it should be caught. *) +(* --- For instance, it should not be caught in `step' *) +(* --- (as `step' is used in `next_1'). *) +(* --- On the other side, other modules does not need to know *) +(* --- about this exception. *) +let interrupted = ref false + +(* Information about last breakpoint encountered *) +let last_breakpoint = ref None + +(* Last debug info loaded *) +let last_debug_info = ref None + +let rec do_go_dynlink steps = + match do_go steps with + | { rep_type = Code_loaded frag; rep_event_count = steps } as report -> + begin match !last_debug_info with + | Some di -> + Symbols.add_symbols frag di; + Symbols.set_all_events frag; + last_debug_info := None + | None -> assert false + end; + if !break_on_load then report + else do_go_dynlink steps + | { rep_type = Code_unloaded frag; rep_event_count = steps } -> + Symbols.erase_symbols frag; + do_go_dynlink steps + | { rep_type = Debug_info di; rep_event_count = steps } -> + last_debug_info := Some (Array.to_list di); + do_go_dynlink steps + | report -> report + +(* Ensure we stop on an event. *) +let rec stop_on_event report = + match report with + {rep_type = Breakpoint; rep_program_pointer = pc; + rep_stack_pointer = sp} -> + last_breakpoint := Some (pc, sp); + Symbols.update_current_event (); + begin match !current_event with + None -> find_event () + | Some _ -> () + end + | {rep_type = Trap_barrier} -> + (* No event at current position. *) + find_event () + | _ -> + () + +and find_event () = + if !debug_time_travel then begin + print_string "Searching next event..."; + print_newline () + end; + let report = do_go_dynlink _1 in + !current_checkpoint.c_report <- Some report; + stop_on_event report + +(* Internal function for running debugged program. + * Requires `duration > 0'. + *) +let internal_step duration = + match current_report () with + Some {rep_type = Exited | Uncaught_exc} -> () + | _ -> + Exec.protect + (function () -> + if !make_checkpoints then + duplicate_current_checkpoint () + else + remove_checkpoint !current_checkpoint; + update_breakpoints (); + update_trap_barrier (); + !current_checkpoint.c_state <- C_running duration; + let report = do_go_dynlink duration in + !current_checkpoint.c_report <- Some report; + !current_checkpoint.c_state <- C_stopped; + !current_checkpoint.c_code_fragments <- Symbols.code_fragments (); + if report.rep_type = Event then begin + !current_checkpoint.c_time <- + !current_checkpoint.c_time ++ duration; + interrupted := false; + last_breakpoint := None + end + else begin + !current_checkpoint.c_time <- + !current_checkpoint.c_time ++ duration + -- report.rep_event_count ++ _1; + interrupted := true; + last_breakpoint := None; + stop_on_event report + end; + (try + insert_checkpoint !current_checkpoint + with + Exit -> + kill_checkpoint !current_checkpoint; + set_current_checkpoint + (find_checkpoint_before (current_time ())))); + if !debug_time_travel then begin + print_string "Checkpoints: pid(time)"; print_newline (); + List.iter + (function {c_time = time; c_pid = pid; c_valid = valid} -> + Printf.printf "%d(%Ld)%s " pid time + (if valid then "" else "(invalid)")) + !checkpoints; + print_newline () + end + +(*** Miscellaneous functions (exported). ***) + +(* Create a checkpoint at time 0 (new program). *) +let new_checkpoint pid fd = + let new_checkpoint = + {c_time = _0; + c_pid = pid; + c_fd = fd; + c_valid = true; + c_report = None; + c_state = C_stopped; + c_parent = root; + c_breakpoint_version = 0; + c_breakpoints = []; + c_trap_barrier = Sp.null; + c_code_fragments = [main_frag]} + in + insert_checkpoint new_checkpoint + +(* Set the file descriptor of a checkpoint *) +(* (a new process has connected with the debugger). *) +(* --- Return `true' on success (close the connection otherwise). *) +let set_file_descriptor pid fd = + let rec find = + function + [] -> + prerr_endline "Unexpected connection"; + close_io fd; + false + | ({c_pid = pid'} as checkpoint)::l -> + if pid <> pid' then + find l + else + (checkpoint.c_fd <- fd; + checkpoint.c_valid <- true; + true) + in + if !debug_time_travel then + prerr_endline ("New connection: " ^(Int.to_string pid)); + find (!current_checkpoint::!checkpoints) + +(* Kill all the checkpoints. *) +let kill_all_checkpoints () = + List.iter kill_checkpoint (!current_checkpoint::!checkpoints) + +(* Kill a checkpoint without killing the process. *) +(* (used when connection with the process is lost). *) +(* --- Assume that the checkpoint is valid. *) +let forget_process fd pid = + let checkpoint = + List.find (function c -> c.c_pid = pid) (!current_checkpoint::!checkpoints) + in + if pid > 0 then begin + Printf.eprintf "Lost connection with process %d" pid; + let kont = + if checkpoint == !current_checkpoint then begin + Printf.eprintf " (active process)\n"; + match !current_checkpoint.c_state with + C_stopped -> + Printf.eprintf "at time %Ld" !current_checkpoint.c_time; + fun () -> raise Current_checkpoint_lost + | C_running duration -> + Printf.eprintf "between time %Ld and time %Ld" + !current_checkpoint.c_time + (!current_checkpoint.c_time ++ duration); + fun () -> raise (Current_checkpoint_lost_start_at + (!current_checkpoint.c_time, duration)) + end + else ignore in + Printf.eprintf "\n"; flush stderr; + Input_handling.remove_file fd; + close_io checkpoint.c_fd; + remove_file checkpoint.c_fd; + remove_checkpoint checkpoint; + checkpoint.c_pid <- -1; (* Don't exist anymore *) + if checkpoint.c_parent.c_pid > 0 then + wait_child checkpoint.c_parent.c_fd; + kont () + end + +(* Try to recover when the current checkpoint is lost. *) +let recover () = + set_current_checkpoint + (find_checkpoint_before (current_time ())) + +(*** Simple movements. ***) + +(* Forward stepping. Requires `duration >= 0'. *) +let rec step_forward duration = + if duration > !checkpoint_small_step then begin + let first_step = + if duration > !checkpoint_big_step then + !checkpoint_big_step + else + !checkpoint_small_step + in + internal_step first_step; + if not !interrupted then + step_forward (duration -- first_step) + end + else if duration != _0 then + internal_step duration + +(* Go to time `time' from current checkpoint (internal). *) +let internal_go_to time = + let duration = time -- (current_time ()) in + if duration > _0 then + execute_without_breakpoints (function () -> step_forward duration) + +(* Move to a given time. *) +let go_to time = + let checkpoint = find_checkpoint_before time in + set_current_checkpoint checkpoint; + internal_go_to time + +(* Return the time of the last breakpoint *) +(* between current time and `max_time'. *) +let find_last_breakpoint max_time = + let rec find break = + let time = current_time () in + step_forward (max_time -- time); + match !last_breakpoint, !temporary_breakpoint_position with + (Some _, _) when current_time () < max_time -> + find !last_breakpoint + | (Some (pc, _), Some pc') when pc = pc' -> + (max_time, !last_breakpoint) + | _ -> + (time, break) + in + find + (match current_pc_sp () with + (Some (pc, _)) as state when breakpoint_at_pc pc -> state + | _ -> None) + +(* Run from `time_max' back to `time'. *) +(* --- Assume 0 <= time < time_max *) +let rec back_to time time_max = + let + {c_time = t} = find_checkpoint_before (pre64 time_max) + in + go_to (Int64.max time t); + let (new_time, break) = find_last_breakpoint time_max in + if break <> None || (new_time <= time) then begin + go_to new_time; + interrupted := break <> None; + last_breakpoint := break + end else + back_to time new_time + +(* Backward stepping. *) +(* --- Assume duration > 1 *) +let step_backward duration = + let time = current_time () in + if time > _0 then + back_to (Int64.max _0 (time -- duration)) time + +(* Run the program from current time. *) +(* Stop at the first breakpoint, or at the end of the program. *) +let rec run () = + internal_step !checkpoint_big_step; + if not !interrupted then + run () + +(* Run the program backward from current time. *) +(* Stop at the first breakpoint, or at the beginning of the program. *) +let back_run () = + if current_time () > _0 then + back_to _0 (current_time ()) + +(* Step in any direction. *) +(* Stop at the first breakpoint, or after `duration' steps. *) +let step duration = + if duration >= _0 then + step_forward duration + else + step_backward (_0 -- duration) + +(*** Next, finish. ***) + +(* Finish current function. *) +let finish () = + Symbols.update_current_event (); + match !current_event with + None -> + prerr_endline "`finish' not meaningful in outermost frame."; + raise Toplevel + | Some {ev_ev={ev_stacksize}} -> + set_initial_frame(); + let (frame, pc) = up_frame ev_stacksize in +(* BACKPORT BEGIN + if frame = Sp.null then begin +*) + if frame < Sp.null then begin +(* BACKPORT END *) + prerr_endline "`finish' not meaningful in outermost frame."; + raise Toplevel + end; + begin + try ignore(Symbols.any_event_at_pc pc) + with Not_found -> + prerr_endline "Calling function has no debugging information."; + raise Toplevel + end; + exec_with_trap_barrier + frame + (fun () -> + exec_with_temporary_breakpoint + pc + (fun () -> + while + run (); + match !last_breakpoint with + Some (pc', frame') when pc = pc' -> + interrupted := false; + frame <> frame' + | _ -> + false + do + () + done)) + +let next_1 () = + Symbols.update_current_event (); + match !current_event with + None -> (* Beginning of the program. *) + step _1 + | Some {ev_ev={ev_stacksize=ev_stacksize1}} -> + let (frame1, _pc1) = initial_frame() in + step _1; + if not !interrupted then begin + Symbols.update_current_event (); + match !current_event with + None -> () + | Some {ev_ev={ev_stacksize=ev_stacksize2}} -> + let (frame2, _pc2) = initial_frame() in + (* Call `finish' if we've entered a function. *) +(* BACKPORT BEGIN + if frame1 <> Sp.null && frame2 <> Sp.null && + Sp.(compare (base frame2 ev_stacksize2) + (base frame1 ev_stacksize1)) > 0 +*) + if frame1 >= 0 && frame2 >= 0 && + frame2 - ev_stacksize2 > frame1 - ev_stacksize1 +(* BACKPORT END *) + then finish() + end + +(* Same as `step' (forward) but skip over function calls. *) +let rec next = + function + 0 -> () + | n -> + next_1 (); + if not !interrupted then + next (n - 1) + +(* Run backward until just before current function. *) +let start () = + Symbols.update_current_event (); + match !current_event with + None -> + prerr_endline "`start not meaningful in outermost frame."; + raise Toplevel + | Some {ev_ev={ev_stacksize}} -> + let (frame, _) = initial_frame() in + let (frame', pc) = up_frame ev_stacksize in +(* BACKPORT BEGIN + if frame' = Sp.null then begin +*) + if frame' < Sp.null then begin +(* BACKPORT END *) + prerr_endline "`start not meaningful in outermost frame."; + raise Toplevel + end; + let nargs = + match + try Symbols.any_event_at_pc pc with Not_found -> + prerr_endline "Calling function has no debugging information."; + raise Toplevel + with + {ev_ev = {ev_info = Event_return nargs}} -> nargs + | _ -> Misc.fatal_error "Time_travel.start" + in + let offset = if nargs < 4 then 1 else 2 in + let pc = { pc with pos = pc.pos - 4 * offset } in + while + exec_with_temporary_breakpoint pc back_run; + match !last_breakpoint with + Some (pc', frame') when pc = pc' -> + step _minus1; + (not !interrupted) + && +(* BACKPORT BEGIN + Sp.(compare (base frame' nargs) (base frame ev_stacksize)) > 0 +*) + (frame' - nargs > frame - ev_stacksize) +(* BACKPORT END *) + | _ -> + false + do + () + done + +let previous_1 () = + Symbols.update_current_event (); + match !current_event with + None -> (* End of the program. *) + step _minus1 + | Some {ev_ev={ev_stacksize=ev_stacksize1}} -> + let (frame1, _pc1) = initial_frame() in + step _minus1; + if not !interrupted then begin + Symbols.update_current_event (); + match !current_event with + None -> () + | Some {ev_ev={ev_stacksize=ev_stacksize2}} -> + let (frame2, _pc2) = initial_frame() in + (* Call `start' if we've entered a function. *) +(* BACKPORT BEGIN + if frame1 <> Sp.null && frame2 <> Sp.null && + Sp.(compare (base frame2 ev_stacksize2) + (base frame1 ev_stacksize1)) > 0 +*) + if frame1 >= 0 && frame2 >= 0 && + frame2 - ev_stacksize2 > frame1 - ev_stacksize1 +(* BACKPORT END *) + then start() + end + +(* Same as `step' (backward) but skip over function calls. *) +let rec previous = + function + 0 -> () + | n -> + previous_1 (); + if not !interrupted then + previous (n - 1) diff --git a/debugger4/time_travel.mli b/debugger4/time_travel.mli new file mode 100644 index 00000000000..e25bad9fcc7 --- /dev/null +++ b/debugger4/time_travel.mli @@ -0,0 +1,38 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(**************************** Time travel ******************************) + +open Primitives + +exception Current_checkpoint_lost +exception Current_checkpoint_lost_start_at of int64 * int64 + +val new_checkpoint : int -> io_channel -> unit +val set_file_descriptor : int -> io_channel -> bool +val kill_all_checkpoints : unit -> unit +val forget_process : io_channel -> int -> unit +val recover : unit -> unit + +val go_to : int64 -> unit + +val run : unit -> unit +val back_run : unit -> unit +val step : int64 -> unit +val finish : unit -> unit +val next : int -> unit +val start : unit -> unit +val previous : int -> unit diff --git a/debugger4/trap_barrier.ml b/debugger4/trap_barrier.ml new file mode 100644 index 00000000000..861b7f24228 --- /dev/null +++ b/debugger4/trap_barrier.ml @@ -0,0 +1,42 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(************************** Trap barrier *******************************) + +open Debugcom +open Checkpoints + +let current_trap_barrier = ref Sp.null + +let install_trap_barrier pos = + current_trap_barrier := pos + +let remove_trap_barrier () = + current_trap_barrier := Sp.null + +(* Ensure the trap barrier state is up to date in current checkpoint. *) +let update_trap_barrier () = + if !current_checkpoint.c_trap_barrier <> !current_trap_barrier then + Exec.protect + (function () -> + set_trap_barrier !current_trap_barrier; + !current_checkpoint.c_trap_barrier <- !current_trap_barrier) + +(* Execute `funct' with a trap barrier. *) +(* --- Used by `finish'. *) +let exec_with_trap_barrier trap_barrier funct = + install_trap_barrier trap_barrier; + Fun.protect ~finally:remove_trap_barrier funct diff --git a/debugger4/trap_barrier.mli b/debugger4/trap_barrier.mli new file mode 100644 index 00000000000..7d26c8627d1 --- /dev/null +++ b/debugger4/trap_barrier.mli @@ -0,0 +1,28 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(************************* Trap barrier ********************************) + +val install_trap_barrier : Debugcom.Sp.t -> unit + +val remove_trap_barrier : unit -> unit + +(* Ensure the trap barrier state is up to date in current checkpoint. *) +val update_trap_barrier : unit -> unit + +(* Execute `funct' with a trap barrier. *) +(* --- Used by `finish'. *) +val exec_with_trap_barrier : Debugcom.Sp.t -> (unit -> unit) -> unit diff --git a/debugger4/unix_tools.ml b/debugger4/unix_tools.ml new file mode 100644 index 00000000000..f61ac913357 --- /dev/null +++ b/debugger4/unix_tools.ml @@ -0,0 +1,144 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(****************** Tools for Unix *************************************) + +module Real_stdlib = Stdlib +open Misc +open Unix + +(*** Convert a socket name into a socket address. ***) +let convert_address address = + try + let n = String.index address ':' in + let host = String.sub address 0 n + and port = String.sub address (n + 1) (String.length address - n - 1) + in + (PF_INET, + ADDR_INET + ((try inet_addr_of_string host with Failure _ -> + try (gethostbyname host).h_addr_list.(0) with Not_found -> + prerr_endline ("Unknown host: " ^ host); + failwith "Can't convert address"), + (try int_of_string port with Failure _ -> + prerr_endline "The port number should be an integer"; + failwith "Can't convert address"))) + with Not_found -> + match Sys.os_type with + "Win32" -> failwith "Unix sockets not supported" + | _ -> (PF_UNIX, ADDR_UNIX address) + +(*** Report a unix error. ***) +let report_error = function + | Unix_error (err, fun_name, arg) -> + prerr_string "Unix error: '"; + prerr_string fun_name; + prerr_string "' failed"; + if String.length arg > 0 then + (prerr_string " on '"; + prerr_string arg; + prerr_string "'"); + prerr_string ": "; + prerr_endline (error_message err) + | _ -> fatal_error "report_error: not a Unix error" + +(* Find program `name' in `PATH'. *) +(* Return the full path if found. *) +(* Raise `Not_found' otherwise. *) +let search_in_path name = + Printf.fprintf Real_stdlib.stderr "search_in_path [%s]\n%!" name; + let check name = + try access name [X_OK]; name with Unix_error _ -> raise Not_found + in + if not (Filename.is_implicit name) then + check name + else + let path = Sys.getenv "PATH" in + let length = String.length path in + let rec traverse pointer = + if (pointer >= length) || (path.[pointer] = ':') then + pointer + else + traverse (pointer + 1) + in + let rec find pos = + let pos2 = traverse pos in + let directory = (String.sub path pos (pos2 - pos)) in + let fullname = + if directory = "" then name else directory ^ "/" ^ name + in + try check fullname with + | Not_found -> + if pos2 < length then find (pos2 + 1) + else raise Not_found + in + find 0 + +(* Expand a path. *) +(* ### path -> path' *) +let rec expand_path ch = + let rec subst_variable ch = + try + let pos = String.index ch '$' in + if (pos + 1 < String.length ch) && (ch.[pos + 1] = '$') then + (String.sub ch 0 (pos + 1)) + ^ (subst_variable + (String.sub ch (pos + 2) (String.length ch - pos - 2))) + else + (String.sub ch 0 pos) + ^ (subst2 (String.sub ch (pos + 1) (String.length ch - pos - 1))) + with Not_found -> + ch + and subst2 ch = + let suiv = + let i = ref 0 in + while !i < String.length ch && + (let c = ch.[!i] in (c >= 'a' && c <= 'z') + || (c >= 'A' && c <= 'Z') + || (c >= '0' && c <= '9') + || c = '_') + do incr i done; + !i + in (Sys.getenv (String.sub ch 0 suiv)) + ^ (subst_variable (String.sub ch suiv (String.length ch - suiv))) + in + let ch = subst_variable ch in + let concat_root nom ch2 = + try Filename.concat (getpwnam nom).pw_dir ch2 + with Not_found -> + "~" ^ nom + in + if ch.[0] = '~' then + try + match String.index ch '/' with + 1 -> + (let tail = String.sub ch 2 (String.length ch - 2) + in + try Filename.concat (Sys.getenv "HOME") tail + with Not_found -> + concat_root (Sys.getenv "LOGNAME") tail) + | n -> concat_root + (String.sub ch 1 (n - 1)) + (String.sub ch (n + 1) (String.length ch - n - 1)) + with + Not_found -> + expand_path (ch ^ "/") + else ch + +let make_absolute name = + if Filename.is_relative name + then Filename.concat (getcwd ()) name + else name diff --git a/debugger4/unix_tools.mli b/debugger4/unix_tools.mli new file mode 100644 index 00000000000..db3af072cc6 --- /dev/null +++ b/debugger4/unix_tools.mli @@ -0,0 +1,35 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* OCaml port by John Malecki and Xavier Leroy *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(**************************** Tools for Unix ***************************) + +open Unix + +(* Convert a socket name into a socket address. *) +val convert_address : string -> socket_domain * sockaddr + +(* Report an unix error. *) +val report_error : exn -> unit + +(* Find program `name' in `PATH'. *) +(* Return the full path if found. *) +(* Raise `Not_found' otherwise. *) +val search_in_path : string -> string + +(* Path expansion. *) +val expand_path : string -> string + +val make_absolute : string -> string diff --git a/driver/compenv.ml b/driver/compenv.ml index 1b6fb58b3e2..fb1d8ba2a1b 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -270,6 +270,7 @@ let read_one_param ppf position name v = | "noassert" -> set "noassert" [ noassert ] v | "noautolink" -> set "noautolink" [ no_auto_link ] v | "nostdlib" -> set "nostdlib" [ no_std_include ] v + | "no-auto-include-otherlibs" -> set "nostdlib" [ no_auto_include_otherlibs ] v | "nocwd" -> set "nocwd" [ no_cwd ] v | "linkall" -> set "linkall" [ link_everything ] v | "nolabels" -> set "nolabels" [ classic ] v @@ -503,7 +504,8 @@ let read_one_param ppf position name v = | "extension" -> Language_extension.enable_of_string_exn v | "disable-all-extensions" -> - if check_bool ppf name v then Language_extension.disallow_extensions () + if check_bool ppf name v then + Language_extension.set_universe_and_enable_all No_extensions | _ -> if !warnings_for_discarded_params && diff --git a/driver/compile.ml b/driver/compile.ml index ca543507846..14518e09a40 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -36,6 +36,7 @@ let to_bytecode i Typedtree.{structure; coercion; _} = (Translmod.transl_implementation i.module_name ~style:Set_global_to_block) |> Profile.(record ~accumulate:true generate) (fun { Lambda.code = lambda; required_globals } -> + Builtin_attributes.warn_unused (); lambda |> print_if i.ppf_dump Clflags.dump_rawlambda Printlambda.lambda |> Simplif.simplify_lambda diff --git a/driver/compile_common.ml b/driver/compile_common.ml index bdd89f0019e..8b115ceb4f6 100644 --- a/driver/compile_common.ml +++ b/driver/compile_common.ml @@ -63,7 +63,8 @@ let typecheck_intf info ast = Profile.(record_call typing) @@ fun () -> let tsg = ast - |> Typemod.type_interface info.env + |> Typemod.type_interface + ~sourcefile:info.source_file info.module_name info.env |> print_if info.ppf_dump Clflags.dump_typedtree Printtyped.interface in let sg = tsg.Typedtree.sig_type in @@ -80,9 +81,22 @@ let typecheck_intf info ast = let emit_signature info ast tsg = let sg = + let name = Compilation_unit.name info.module_name in + let kind : Cmi_format.kind = + if !Clflags.as_parameter then + Parameter + else begin + let cmi_arg_for = + match !Clflags.as_argument_for with + | Some arg_type -> Some (Compilation_unit.Name.of_string arg_type) + | None -> None + in + Normal { cmi_impl = info.module_name; cmi_arg_for } + end + in let alerts = Builtin_attributes.alerts_of_sig ast in Env.save_signature ~alerts tsg.Typedtree.sig_type - info.module_name (info.output_prefix ^ ".cmi") + name kind (info.output_prefix ^ ".cmi") in Typemod.save_signature info.module_name tsg info.output_prefix info.source_file info.env sg @@ -111,7 +125,7 @@ let typecheck_impl i parsetree = parsetree |> Profile.(record typing) (Typemod.type_implementation - i.source_file i.output_prefix i.module_name i.env) + ~sourcefile:i.source_file i.output_prefix i.module_name i.env) |> print_if i.ppf_dump Clflags.dump_typedtree Printtyped.implementation_with_coercion |> print_if i.ppf_dump Clflags.dump_shape @@ -130,9 +144,10 @@ let implementation ~hook_parse_tree ~hook_typed_tree info ~backend = let typed = typecheck_impl info parsed in hook_typed_tree typed; if Clflags.(should_stop_after Compiler_pass.Typing) then () else begin - backend info typed + backend info typed; end; end; - Builtin_attributes.warn_unused (); + if not (Clflags.(should_stop_after Compiler_pass.Selection)) then + Builtin_attributes.warn_unchecked_zero_alloc_attribute (); Warnings.check_fatal (); ) diff --git a/driver/compmisc.ml b/driver/compmisc.ml index f15c7fb9d56..c0e2a0c57e3 100644 --- a/driver/compmisc.ml +++ b/driver/compmisc.ml @@ -14,7 +14,7 @@ (**************************************************************************) let auto_include find_in_dir fn = - if !Clflags.no_std_include then + if !Clflags.no_auto_include_otherlibs || !Clflags.no_std_include then raise Not_found else let alert = Location.auto_include_alert in @@ -23,28 +23,36 @@ let auto_include find_in_dir fn = (* Initialize the search path. [dir] (default: the current directory) is always searched first unless -nocwd is specified, - then the directories specified with the -I option (in command-line order), - then the standard library directory (unless the -nostdlib option is given). + then the directories specified with the -I option (in command line order), + then the standard library directory (unless the -nostdlib option is given), + then the directories specified with the -H option (in command line order). *) let init_path ?(auto_include=auto_include) ?(dir="") () = - let dirs = + let visible = if !Clflags.use_threads then "+threads" :: !Clflags.include_dirs else !Clflags.include_dirs in - let dirs = - !Compenv.last_include_dirs @ dirs @ Config.flexdll_dirs @ - !Compenv.first_include_dirs + let visible = + List.concat + [!Compenv.last_include_dirs; + visible; + Config.flexdll_dirs; + !Compenv.first_include_dirs] in - let exp_dirs = - List.map (Misc.expand_directory Config.standard_library) dirs + let visible = + List.map (Misc.expand_directory Config.standard_library) visible in - let dirs = + let visible = (if !Clflags.no_cwd then [] else [dir]) - @ List.rev_append exp_dirs (Clflags.std_include_dir ()) + @ List.rev_append visible (Clflags.std_include_dir ()) in - Load_path.init ~auto_include dirs; + let hidden = + List.rev_map (Misc.expand_directory Config.standard_library) + !Clflags.hidden_include_dirs + in + Load_path.init ~auto_include ~visible ~hidden; Env.reset_cache ~preserve_persistent_env:false (* Return the initial environment in which compilation proceeds. *) diff --git a/driver/main_args.ml b/driver/main_args.ml index feaf9dbe216..142f0d65bf2 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -45,6 +45,13 @@ let mk_binannot_cms f = "-bin-annot-cms", Arg.Unit f, " Save shapes in .cms" ;; +let mk_binannot_occurrences f = + "-bin-annot-occurrences", Arg.Unit f, + " Store every occurrence of a bound name in the .cmt file.\n\ + This information can be used by external tools to provide\n\ + features such as project-wide occurrences. This flag has\n\ + no effect in the absence of '-bin-annot'." + let mk_c f = "-c", Arg.Unit f, " Compile only (do not link)" @@ -153,6 +160,25 @@ let mk_i f = let mk_I f = "-I", Arg.String f, " Add to the list of include directories" +let mk_H f = + "-H", Arg.String f, + " Add to the list of \"hidden\" include directories\n\ + \ (Like -I, but the program can not directly reference these dependencies)" + +let mk_libloc f = + "-libloc", Arg.String f, ":: Add .libloc directory configuration.\n\ + \ .libloc directory is alternative (to -I and -H flags) way of telling\n\ + \ compiler where to find files. Each `.libloc` directory should have a\n\ + \ structure of `.libloc//cmi-cmx`, where `` is a library name\n\ + \ and `cmi-cmx` is a file where each line is of format ` `\n\ + \ telling compiler that for library is accessible\n\ + \ at . If is relative, then it is relative to a parent directory\n\ + \ of a `.libloc` directory.\n\ + \ and are comma-separated lists of libraries, to let\n\ + \ compiler know which libraries should be accessible via this `.libloc`\n\ + \ directory. Difference between and is the same as\n\ + \ the difference between -I and -H flags" + let mk_impl f = "-impl", Arg.String f, " Compile as a .ml file" @@ -291,7 +317,6 @@ let mk_no_probes f = "-no-probes", Arg.Unit f, " Ignore [%%probe ..]" ;; - let mk_labels f = "-labels", Arg.Unit f, " Use commuting label mode" @@ -331,6 +356,9 @@ let mk_app_funct f = let mk_no_app_funct f = "-no-app-funct", Arg.Unit f, " Deactivate applicative functors" +let mk_directory f = + "-directory", Arg.String f, " Directory to use for debug reporting like source code location reporting" + let mk_no_check_prims f = "-no-check-prims", Arg.Unit f, " Do not check runtime for primitives" @@ -371,6 +399,13 @@ let mk_nostdlib f = "-nostdlib", Arg.Unit f, " Do not add default directory to the list of include directories" +let mk_no_auto_include_otherlibs f = + "-no-auto-include-otherlibs", Arg.Unit f, + "Add only stdlib to the list of include directories (unless -nostdlib is \ + specified). Do not add subdirectories of other libraries distributed with \ + the compiler (such as unix, str, dynlink). Do not alert when \ + they are missing." + let mk_nocwd f = "-nocwd", Arg.Unit f, " Do not implicitly add the current directory to the load path" @@ -619,6 +654,21 @@ let mk_match_context_rows f = Printf.sprintf " (advanced, see manual section %d.%d.)" chapter section +let mk_parameter f = + "-parameter", Arg.String f, + " Compile the module with as a parameter." +;; + +let mk_as_parameter f = + "-as-parameter", Arg.Unit f, + " Compile the interface as a parameter module." +;; + +let mk_as_argument_for f = + "-as-argument-for", Arg.String f, + " Compile the module as an argument for the named parameter." +;; + let mk_use_prims f = "-use-prims", Arg.String f, " (undocumented)" @@ -644,7 +694,8 @@ let mk_no_extension f = let mk_disable_all_extensions f = "-disable-all-extensions", Arg.Unit f, - " Disable all extensions, wherever they have been specified; this\n\ + " Legacy, use [-extension-universe no_extensions].\n\ + \ Disable all extensions, wherever they have been specified; this\n\ \ flag overrides prior uses of the -extension flag, disables any\n\ \ extensions that are enabled by default, and causes future uses of\n\ \ the -extension flag to raise an error." @@ -659,7 +710,8 @@ let mk_only_erasable_extensions f = String.concat ", " in "-only-erasable-extensions", Arg.Unit f, - " Disable all extensions that cannot be \"erased\" to attributes,\n\ + " Legacy, use [-extension-universe upstream_compatible].\n\ + \ Disable all extensions that cannot be \"erased\" to attributes,\n\ \ wherever they have been specified; this flag overrides prior\n\ \ contradictory uses of the -extension flag, raises an error on\n\ \ future such uses, and disables any such extensions that are\n\ @@ -667,6 +719,19 @@ let mk_only_erasable_extensions f = \ (Erasable extensions: " ^ erasable_extensions ^ ")" ;; +let mk_extension_universe f = + let available_extension_universes = + Language_extension.Universe.(List.map to_string all) +in +"-extension-universe", Arg.Symbol (available_extension_universes, f), + " Set the extension universe and enable all extensions in it. Each universe\n\ + \ allows a set of extensions, and every successive universe includes \n\ + \ the previous one." + +let mk_allow_illegal_crossing f = + "-allow-illegal-crossing", Arg.Unit f, + "Type declarations will not be checked along the portability or contention axes" + let mk_dump_dir f = "-dump-dir", Arg.String f, " dump output like -dlambda into /.dump" @@ -704,6 +769,10 @@ let mk_dsource f = let mk_dlambda f = "-dlambda", Arg.Unit f, " (undocumented)" +let mk_dletreclambda f = + "-dletreclambda", Arg.Unit f, + " Dump Lambda terms going into Value_rec_compiler" + let mk_drawclambda f = "-drawclambda", Arg.Unit f, " (undocumented)" @@ -842,18 +911,24 @@ module type Common_options = sig val _no_absname : unit -> unit val _alert : string -> unit val _I : string -> unit + val _H : string -> unit + val _libloc : string -> unit val _labels : unit -> unit val _alias_deps : unit -> unit val _no_alias_deps : unit -> unit val _app_funct : unit -> unit val _no_app_funct : unit -> unit + val _directory : string -> unit val _disable_all_extensions : unit -> unit val _only_erasable_extensions : unit -> unit val _extension : string -> unit val _no_extension : string -> unit + val _extension_universe : string -> unit + val _allow_illegal_crossing : unit -> unit val _noassert : unit -> unit val _nolabels : unit -> unit val _nostdlib : unit -> unit + val _no_auto_include_otherlibs : unit -> unit val _nocwd : unit -> unit val _open : string -> unit val _ppx : string -> unit @@ -898,14 +973,18 @@ module type Core_options = sig val _dshape : unit -> unit val _drawlambda : unit -> unit val _dlambda : unit -> unit + val _dletreclambda : unit -> unit end module type Compiler_options = sig val _a : unit -> unit val _annot : unit -> unit + val _as_argument_for : string -> unit + val _as_parameter : unit -> unit val _binannot : unit -> unit val _binannot_cms : unit -> unit + val _binannot_occurrences : unit -> unit val _c : unit -> unit val _cc : string -> unit val _cclib : string -> unit @@ -932,6 +1011,7 @@ module type Compiler_options = sig val _output_obj : unit -> unit val _output_complete_obj : unit -> unit val _pack : unit -> unit + val _parameter : string -> unit val _plugin : string -> unit val _pp : string -> unit val _principal : unit -> unit @@ -1102,8 +1182,11 @@ struct mk_absname F._absname; mk_no_absname F._no_absname; mk_annot F._annot; + mk_as_argument_for F._as_argument_for; + mk_as_parameter F._as_parameter; mk_binannot F._binannot; mk_binannot_cms F._binannot_cms; + mk_binannot_occurrences F._binannot_occurrences; mk_c F._c; mk_cc F._cc; mk_cclib F._cclib; @@ -1122,12 +1205,16 @@ struct mk_dtypes F._annot; mk_extension F._extension; mk_no_extension F._no_extension; + mk_extension_universe F._extension_universe; + mk_allow_illegal_crossing F._allow_illegal_crossing; mk_for_pack_byt F._for_pack; mk_g_byt F._g; mk_no_g F._no_g; mk_stop_after ~native:false F._stop_after; mk_i F._i; mk_I F._I; + mk_H F._H; + mk_libloc F._libloc; mk_impl F._impl; mk_intf F._intf; mk_intf_suffix F._intf_suffix; @@ -1145,11 +1232,13 @@ struct mk_no_alias_deps F._no_alias_deps; mk_app_funct F._app_funct; mk_no_app_funct F._no_app_funct; + mk_directory F._directory; mk_no_check_prims F._no_check_prims; mk_noassert F._noassert; mk_noautolink_byt F._noautolink; mk_nolabels F._nolabels; mk_nostdlib F._nostdlib; + mk_no_auto_include_otherlibs F._no_auto_include_otherlibs; mk_nocwd F._nocwd; mk_nopervasives F._nopervasives; mk_o F._o; @@ -1159,6 +1248,7 @@ struct mk_output_complete_obj F._output_complete_obj; mk_output_complete_exe F._output_complete_exe; mk_pack_byt F._pack; + mk_parameter F._parameter; mk_pp F._pp; mk_ppx F._ppx; mk_plugin F._plugin; @@ -1208,6 +1298,7 @@ struct mk_dshape F._dshape; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; + mk_dletreclambda F._dletreclambda; mk_dinstr F._dinstr; mk_dcamlprimc F._dcamlprimc; mk_dtimings F._dtimings; @@ -1229,22 +1320,28 @@ struct mk_no_absname F._no_absname; mk_alert F._alert; mk_I F._I; + mk_H F._H; + mk_libloc F._libloc; mk_init F._init; mk_labels F._labels; mk_alias_deps F._alias_deps; mk_no_alias_deps F._no_alias_deps; mk_app_funct F._app_funct; mk_no_app_funct F._no_app_funct; + mk_directory F._directory; mk_disable_all_extensions F._disable_all_extensions; mk_only_erasable_extensions F._only_erasable_extensions; mk_extension F._extension; mk_no_extension F._no_extension; + mk_extension_universe F._extension_universe; + mk_allow_illegal_crossing F._allow_illegal_crossing; mk_noassert F._noassert; mk_noinit F._noinit; mk_nolabels F._nolabels; mk_noprompt F._noprompt; mk_nopromptcont F._nopromptcont; mk_nostdlib F._nostdlib; + mk_no_auto_include_otherlibs F._no_auto_include_otherlibs; mk_nocwd F._nocwd; mk_nopervasives F._nopervasives; mk_open F._open; @@ -1287,6 +1384,7 @@ struct mk_dshape F._dshape; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; + mk_dletreclambda F._dletreclambda; mk_dinstr F._dinstr; mk_debug_ocaml F._debug_ocaml; @@ -1306,8 +1404,11 @@ struct mk_afl_instrument F._afl_instrument; mk_afl_inst_ratio F._afl_inst_ratio; mk_annot F._annot; + mk_as_argument_for F._as_argument_for; + mk_as_parameter F._as_parameter; mk_binannot F._binannot; mk_binannot_cms F._binannot_cms; + mk_binannot_occurrences F._binannot_occurrences; mk_inline_branch_factor F._inline_branch_factor; mk_c F._c; mk_cc F._cc; @@ -1326,6 +1427,8 @@ struct mk_only_erasable_extensions F._only_erasable_extensions; mk_extension F._extension; mk_no_extension F._no_extension; + mk_extension_universe F._extension_universe; + mk_allow_illegal_crossing F._allow_illegal_crossing; mk_for_pack_opt F._for_pack; mk_g_opt F._g; mk_no_g F._no_g; @@ -1336,6 +1439,8 @@ struct mk_no_probes F._no_probes; mk_i F._i; mk_I F._I; + mk_H F._H; + mk_libloc F._libloc; mk_impl F._impl; mk_inline F._inline; mk_inline_toplevel F._inline_toplevel; @@ -1361,6 +1466,7 @@ struct mk_linscan F._linscan; mk_app_funct F._app_funct; mk_no_app_funct F._no_app_funct; + mk_directory F._directory; mk_no_float_const_prop F._no_float_const_prop; mk_noassert F._noassert; mk_noautolink_opt F._noautolink; @@ -1368,6 +1474,7 @@ struct mk_no_insn_sched F._no_insn_sched; mk_nolabels F._nolabels; mk_nostdlib F._nostdlib; + mk_no_auto_include_otherlibs F._no_auto_include_otherlibs; mk_nocwd F._nocwd; mk_nopervasives F._nopervasives; mk_no_unbox_free_vars_of_closures F._no_unbox_free_vars_of_closures; @@ -1381,6 +1488,7 @@ struct mk_output_complete_obj F._output_complete_obj; mk_p F._p; mk_pack_opt F._pack; + mk_parameter F._parameter; mk_plugin F._plugin; mk_pp F._pp; mk_ppx F._ppx; @@ -1433,6 +1541,7 @@ struct mk_dshape F._dshape; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; + mk_dletreclambda F._dletreclambda; mk_drawclambda F._drawclambda; mk_dclambda F._dclambda; mk_dcmm_invariants F._dcmm_invariants; @@ -1478,6 +1587,8 @@ module Make_opttop_options (F : Opttop_options) = struct mk_alert F._alert; mk_compact F._compact; mk_I F._I; + mk_H F._H; + mk_libloc F._libloc; mk_init F._init; mk_inline F._inline; mk_inline_toplevel F._inline_toplevel; @@ -1498,10 +1609,13 @@ module Make_opttop_options (F : Opttop_options) = struct mk_linscan F._linscan; mk_app_funct F._app_funct; mk_no_app_funct F._no_app_funct; + mk_directory F._directory; mk_disable_all_extensions F._disable_all_extensions; mk_only_erasable_extensions F._only_erasable_extensions; mk_extension F._extension; mk_no_extension F._no_extension; + mk_extension_universe F._extension_universe; + mk_allow_illegal_crossing F._allow_illegal_crossing; mk_no_float_const_prop F._no_float_const_prop; mk_noassert F._noassert; mk_noinit F._noinit; @@ -1509,6 +1623,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_noprompt F._noprompt; mk_nopromptcont F._nopromptcont; mk_nostdlib F._nostdlib; + mk_no_auto_include_otherlibs F._no_auto_include_otherlibs; mk_nocwd F._nocwd; mk_nopervasives F._nopervasives; mk_no_unbox_free_vars_of_closures F._no_unbox_free_vars_of_closures; @@ -1556,6 +1671,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_dshape F._dshape; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; + mk_dletreclambda F._dletreclambda; mk_drawclambda F._drawclambda; mk_dclambda F._dclambda; mk_dcmm_invariants F._dcmm_invariants; @@ -1590,6 +1706,8 @@ struct mk_no_absname F._no_absname; mk_alert F._alert; mk_I F._I; + mk_H F._H; + mk_libloc F._libloc; mk_impl F._impl; mk_intf F._intf; mk_intf_suffix F._intf_suffix; @@ -1604,9 +1722,12 @@ struct mk_only_erasable_extensions F._only_erasable_extensions; mk_extension F._extension; mk_no_extension F._no_extension; + mk_extension_universe F._extension_universe; + mk_allow_illegal_crossing F._allow_illegal_crossing; mk_noassert F._noassert; mk_nolabels F._nolabels; mk_nostdlib F._nostdlib; + mk_no_auto_include_otherlibs F._no_auto_include_otherlibs; mk_nocwd F._nocwd; mk_open F._open; mk_pp F._pp; @@ -1697,20 +1818,28 @@ module Default = struct let _no_absname = clear Clflags.absname let _no_alias_deps = set transparent_modules let _no_app_funct = clear applicative_functors + let _directory d = Clflags.directory := Some d let _no_principal = clear principal let _no_rectypes = clear recursive_types let _no_strict_formats = clear strict_formats let _no_strict_sequence = clear strict_sequence let _no_unboxed_types = clear unboxed_types let _no_verbose_types = clear verbose_types - let _disable_all_extensions = Language_extension.disallow_extensions + let _disable_all_extensions = + Language_extension.(fun () -> + set_universe_and_enable_all No_extensions) let _only_erasable_extensions = - Language_extension.restrict_to_erasable_extensions + Language_extension.(fun () -> + set_universe_and_enable_all Upstream_compatible) let _extension s = Language_extension.(enable_of_string_exn s) let _no_extension s = Language_extension.(disable_of_string_exn s) + let _extension_universe s = + Language_extension.(set_universe_and_enable_all_of_string_exn s) + let _allow_illegal_crossing = set Clflags.allow_illegal_crossing let _noassert = set noassert let _nolabels = set classic let _nostdlib = set no_std_include + let _no_auto_include_otherlibs = set no_auto_include_otherlibs let _nocwd = set no_cwd let _open s = open_modules := (s :: (!open_modules)) let _principal = set principal @@ -1731,9 +1860,23 @@ module Default = struct module Core = struct include Common - let _I dir = include_dirs := (dir :: (!include_dirs)) + let _I dir = include_dirs := dir :: (!include_dirs) + let _H dir = hidden_include_dirs := dir :: (!hidden_include_dirs) + let _libloc s = + match String.split_on_char ':' s with + | [ path; libs; hidden_libs ] -> + let split libs = + match libs |> String.split_on_char ',' with + | [ "" ] -> [] + | libs -> libs + in + let libs = split libs in + let hidden_libs = split hidden_libs in + libloc := { Libloc.path; libs; hidden_libs } :: !libloc + | _ -> Compenv.fatal "Incorrect -libloc format, expected: :,,...:,,..." let _color = Misc.set_or_ignore color_reader.parse color let _dlambda = set dump_lambda + let _dletreclambda = set dump_letreclambda let _dparsetree = set dump_parsetree let _drawlambda = set dump_rawlambda let _dsource = set dump_source @@ -1854,8 +1997,11 @@ module Default = struct let _annot = set annotations let _args = Arg.read_arg let _args0 = Arg.read_arg0 + let _as_argument_for s = as_argument_for := Some s + let _as_parameter = set as_parameter let _binannot = set binary_annotations let _binannot_cms = set binary_annotations_cms + let _binannot_occurrences = set store_occurrences let _c = set compile_only let _cc s = c_compiler := (Some s) let _cclib s = Compenv.defer (ProcessObjects (Misc.rev_split_words s)) @@ -1885,6 +2031,7 @@ module Default = struct let _o s = output_name := (Some s) let _opaque = set opaque let _pack = set make_package + let _parameter s = parameters := !parameters @ [ s ] let _plugin _p = plugin := true let _pp s = preprocessor := (Some s) let _runtime_variant s = runtime_variant := s @@ -1980,6 +2127,12 @@ module Default = struct (* placeholder: Odoc_global.include_dirs := (s :: (!Odoc_global.include_dirs)) *) () + let _H(_:string) = + (* placeholder: + Odoc_global.hidden_include_dirs := + (s :: (!Odoc_global.hidden_include_dirs)) + *) () + let _libloc(_:string) = () let _impl (_:string) = (* placeholder: Odoc_global.files := ((!Odoc_global.files) @ [Odoc_global.Impl_file s]) diff --git a/driver/main_args.mli b/driver/main_args.mli index 4cb79dfb0fd..992ef1f392a 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -21,18 +21,24 @@ module type Common_options = sig val _no_absname : unit -> unit val _alert : string -> unit val _I : string -> unit + val _H : string -> unit + val _libloc : string -> unit val _labels : unit -> unit val _alias_deps : unit -> unit val _no_alias_deps : unit -> unit val _app_funct : unit -> unit val _no_app_funct : unit -> unit + val _directory : string -> unit val _disable_all_extensions : unit -> unit val _only_erasable_extensions : unit -> unit val _extension : string -> unit val _no_extension : string -> unit + val _extension_universe : string -> unit + val _allow_illegal_crossing : unit -> unit val _noassert : unit -> unit val _nolabels : unit -> unit val _nostdlib : unit -> unit + val _no_auto_include_otherlibs : unit -> unit val _nocwd : unit -> unit val _open : string -> unit val _ppx : string -> unit @@ -76,14 +82,18 @@ module type Core_options = sig val _dshape : unit -> unit val _drawlambda : unit -> unit val _dlambda : unit -> unit + val _dletreclambda : unit -> unit end module type Compiler_options = sig val _a : unit -> unit val _annot : unit -> unit + val _as_argument_for : string -> unit + val _as_parameter : unit -> unit val _binannot : unit -> unit val _binannot_cms : unit -> unit + val _binannot_occurrences : unit -> unit val _c : unit -> unit val _cc : string -> unit val _cclib : string -> unit @@ -110,6 +120,7 @@ module type Compiler_options = sig val _output_obj : unit -> unit val _output_complete_obj : unit -> unit val _pack : unit -> unit + val _parameter : string -> unit val _plugin : string -> unit val _pp : string -> unit val _principal : unit -> unit diff --git a/driver/maindriver.ml b/driver/maindriver.ml index 50bf04dc81a..5412d8f4b07 100644 --- a/driver/maindriver.ml +++ b/driver/maindriver.ml @@ -19,6 +19,7 @@ open Clflags module Options = Main_args.Make_bytecomp_options (Main_args.Default.Main) let main argv ppf = + Symbol.this_is_ocamlc (); let program = "ocamlc" in Clflags.add_arguments __LOC__ Options.list; Clflags.add_arguments __LOC__ @@ -66,7 +67,7 @@ let main argv ppf = are incompatible with -pack, -a, -output-obj" (String.concat "|" (P.available_pass_names ~filter:(fun _ -> true) ~native:false)) - | Some (P.Scheduling | P.Simplify_cfg | P.Emit | P.Selection) -> + | Some (P.Middle_end | P.Scheduling | P.Simplify_cfg | P.Emit | P.Selection) -> assert false (* native only *) end; if !make_archive then begin @@ -112,7 +113,7 @@ let main argv ppf = n | exception Continue | () -> - Compmisc.with_ppf_dump ~file_prefix:"profile" + Compmisc.with_ppf_dump ~stdout:() ~file_prefix:"profile" (fun ppf -> Profile.print ppf !Clflags.profile_columns ~timings_precision:!Clflags.timings_precision); 0 diff --git a/driver/makedepend.ml b/driver/makedepend.ml index b0bc4b56205..5c378161691 100644 --- a/driver/makedepend.ml +++ b/driver/makedepend.ml @@ -100,14 +100,38 @@ let add_to_synonym_list synonyms suffix = (* Find file 'name' (capitalized) in search path *) let find_module_in_load_path name = let names = List.map (fun ext -> name ^ ext) (!mli_synonyms @ !ml_synonyms) in + let uname = String.uncapitalize_ascii name in let unames = - let uname = String.uncapitalize_ascii name in List.map (fun ext -> uname ^ ext) (!mli_synonyms @ !ml_synonyms) in + let stdlib_unames = + (* Jane Street: This is a hack to deal with the fact that we refer to our + custom stdlib modules with names like [Stdlib__Int32_u] from within the + stdlib. + + Dependencies are calculated by looking at all modules mentioned by the + code in question and checking to see if there is a corresponding ml file. + But in our case there is no corresponding ml file, because the references + look like `Stdlib__Int32_u.foo` and the ml file's name is just + `int32_u.ml`. This is unlike normal stdlib modules, which are exposed + with names that match their ml files. So, the code here just teaches + make depend to optionally ignore a `Stdlib__` prefix for the purposes of + checking for a matching ml file. *) + let stdlib_prefix = "stdlib__" in + if String.starts_with ~prefix:stdlib_prefix uname then + let plen = String.length stdlib_prefix in + let uname = + String.sub name plen (String.length name - plen) + in + let uname = String.uncapitalize_ascii uname in + List.map (fun ext -> uname ^ ext) (!mli_synonyms @ !ml_synonyms) + else + [] + in let rec find_in_array a pos = if pos >= Array.length a then None else begin let s = a.(pos) in - if List.mem s names || List.mem s unames then + if List.mem s names || List.mem s unames || List.mem s stdlib_unames then Some s else find_in_array a (pos + 1) @@ -408,7 +432,8 @@ let process_file_as process_fun def source_file = load_path := []; let cwd = if !nocwd then [] else [Filename.current_dir_name] in List.iter add_to_load_path ( - (!Compenv.last_include_dirs @ + (!Clflags.hidden_include_dirs @ + !Compenv.last_include_dirs @ !Clflags.include_dirs @ !Compenv.first_include_dirs @ cwd @@ -609,6 +634,8 @@ let run_main argv = " Dump the delayed dependency map for each map file"; "-I", Arg.String (add_to_list Clflags.include_dirs), " Add to the list of include directories"; + "-H", Arg.String (add_to_list Clflags.hidden_include_dirs), + " Add to the list of include directories"; "-nocwd", Arg.Set nocwd, " Do not add current working directory to \ the list of include directories"; @@ -662,7 +689,8 @@ let run_main argv = let program = Filename.basename Sys.argv.(0) in Compenv.parse_arguments (ref argv) (add_dep_arg (fun f -> Src (f, None))) program; - Language_extension.enable_maximal (); + Language_extension.set_universe_and_enable_all + Language_extension.Universe.maximal; process_dep_args (List.rev !dep_args_rev); Compenv.readenv ppf Before_link; if !sort_files then sort_files_by_dependencies !files diff --git a/driver/optcompile.ml b/driver/optcompile.ml index d033996395e..f3731ae30f8 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -40,6 +40,7 @@ let compile i ~backend ~middle_end ~transl_style |> print_if i.ppf_dump Clflags.dump_rawlambda Printlambda.program |> Profile.(record generate) (fun program -> + Builtin_attributes.warn_unused (); let code = Simplif.simplify_lambda program.Lambda.code in { program with Lambda.code } |> print_if i.ppf_dump Clflags.dump_lambda Printlambda.program diff --git a/driver/optmaindriver.ml b/driver/optmaindriver.ml index 9a0f8f47233..140576c5c31 100644 --- a/driver/optmaindriver.ml +++ b/driver/optmaindriver.ml @@ -72,7 +72,7 @@ let main argv ppf = | None -> Compenv.fatal "Please specify at most one of -pack, -a, -shared, -c, \ -output-obj"; - | Some ((P.Parsing | P.Typing | P.Lambda | P.Scheduling + | Some ((P.Parsing | P.Typing | P.Lambda | P.Middle_end | P.Scheduling | P.Simplify_cfg | P.Emit | P.Selection) as p) -> assert (P.is_compilation_pass p); Printf.ksprintf Compenv.fatal diff --git a/dune b/dune index 0ae8eec4ee8..c01eb070979 100644 --- a/dune +++ b/dune @@ -15,18 +15,16 @@ ; set warning as error in release profile (env - (release (flags (:standard -w +a-4-9-40-41-42-44-45-48-66-67-70))) + (release (flags (:standard -principal -w +a-4-9-40-41-42-44-45-48-66-67-70))) (main (flags - (:standard -warn-error +A))) + (:standard -principal -warn-error +A -w +a-4-9-40-41-42-44-45-48-66-67-70))) (dev (flags - (:standard -w +a-4-9-40-41-42-44-45-48-66-67-70 -warn-error +A)))) + (:standard -principal -w +a-4-9-40-41-42-44-45-48-66-67-70 -warn-error +A)))) -; Disable the runtime/ directory for now -; (We're currently using runtime4/ instead) -(dirs (:standard \ runtime)) +(include dune.runtime_selection) (copy_files# utils/*.ml{,i}) (copy_files# parsing/*.ml{,i}) @@ -55,8 +53,9 @@ (name ocamlcommon) (wrapped false) (flags ( - -strict-sequence -principal -w +a-4-9-40-41-42-44-45-48-66-70 - -warn-error A -bin-annot -safe-string -strict-formats + :standard + -strict-sequence + -bin-annot -safe-string -strict-formats -w -67 ; remove -w -67 by adding the camlinternalMenhirLib hack like the Makefile )) @@ -69,8 +68,9 @@ (run cat %{input-file}))) parser))) (library_flags -linkall) + (libraries flambda2_floats) (modules_without_implementation - annot asttypes jane_asttypes cmo_format outcometree parsetree debug_event) + annot value_rec_types asttypes cmo_format outcometree parsetree debug_event solver_intf mode_intf) (modules ;; UTILS config build_path_prefix_map misc identifiable numbers arg_helper clflags @@ -79,28 +79,31 @@ local_store target_system compilation_unit import_info linkage_name symbol lazy_backtrack diffing diffing_with_keys language_extension_kernel language_extension + zero_alloc_utils zero_alloc_annotations ;; PARSING location longident docstrings printast syntaxerr ast_helper camlinternalMenhirLib ast_iterator parser lexer parse pprintast ast_mapper attr_helper builtin_attributes ast_invariants depend jane_syntax_parsing - jane_syntax ; manual update: mli only files asttypes jane_asttypes parsetree + jane_syntax ; manual update: mli only files asttypes parsetree ;; TYPING - ident path jkind primitive shape types btype oprint subst predef datarepr - cmi_format persistent_env env errortrace mode + ident path jkind primitive shape shape_reduce zero_alloc types btype oprint subst + predef datarepr + global_module cmi_format persistent_env env errortrace mode jkind_types jkind_intf typedtree printtyped ctype printtyp includeclass mtype envaux includecore tast_iterator tast_mapper signature_group cmt_format cms_format untypeast includemod includemod_errorprinter - typetexp patterns printpat parmatch stypes typedecl typeopt rec_check - typecore mode uniqueness_analysis + typemode typetexp patterns printpat parmatch stypes typedecl typeopt + value_rec_check typecore solver_intf solver mode_intf mode uniqueness_analysis typeclass typemod typedecl_variance typedecl_properties typedecl_separability cmt2annot ; manual update: mli only files annot outcometree ;; lambda/ - debuginfo lambda matching printlambda runtimedef tmc simplif switch + debuginfo lambda matching printlambda runtimedef runtimetags tmc simplif switch + value_rec_compiler translmode transl_comprehension_utils transl_array_comprehension transl_list_comprehension @@ -112,15 +115,16 @@ ;; some of COMP pparse main_args compenv compmisc makedepend compile_common ; manual update: mli only files - annot asttypes jane_asttypes cmo_format outcometree parsetree debug_event + annot value_rec_types asttypes cmo_format outcometree parsetree debug_event )) (library (name ocamlbytecomp) (wrapped false) (flags ( - -strict-sequence -principal -w +a-4-9-40-41-42-44-45-48-66-70 - -warn-error A -bin-annot -safe-string -strict-formats + :standard + -strict-sequence -w +67 + -bin-annot -safe-string -strict-formats )) (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) (libraries ocamlcommon) @@ -137,8 +141,9 @@ (name main) (modes byte) (flags ( - -strict-sequence -principal -w +a-4-9-40-41-42-44-45-48-66-70 - -warn-error A -bin-annot -safe-string -strict-formats + :standard + -strict-sequence -w +67 + -bin-annot -safe-string -strict-formats )) (libraries ocamlbytecomp ocamlcommon) (modules main)) @@ -147,8 +152,9 @@ (name main_native) (modes native) (flags ( - -strict-sequence -principal -w +a-4-9-40-41-42-44-45-48-66-70 - -warn-error A -bin-annot -safe-string -strict-formats + :standard + -strict-sequence -w +67 + -bin-annot -safe-string -strict-formats )) (libraries ocamlbytecomp ocamlcommon) (modules main_native)) @@ -249,6 +255,7 @@ (identifiable.mli as compiler-libs/identifiable.mli) (numbers.mli as compiler-libs/numbers.mli) (arg_helper.mli as compiler-libs/arg_helper.mli) + (zero_alloc_annotations.mli as compiler-libs/zero_alloc_annotations.mli) (clflags.mli as compiler-libs/clflags.mli) (language_extension.mli as compiler-libs/language_extension.mli) (profile.mli as compiler-libs/profile.mli) @@ -264,13 +271,13 @@ (location.mli as compiler-libs/location.mli) (longident.mli as compiler-libs/longident.mli) (docstrings.mli as compiler-libs/docstrings.mli) - (printast.mli as compiler-libs/printast.mli) (syntaxerr.mli as compiler-libs/syntaxerr.mli) (ast_helper.mli as compiler-libs/ast_helper.mli) (camlinternalMenhirLib.mli as compiler-libs/camlinternalMenhirLib.mli) (parser.mli as compiler-libs/parser.mli) (lexer.mli as compiler-libs/lexer.mli) (parse.mli as compiler-libs/parse.mli) + (printast.mli as compiler-libs/printast.mli) (pprintast.mli as compiler-libs/pprintast.mli) (ast_mapper.mli as compiler-libs/ast_mapper.mli) (ast_iterator.mli as compiler-libs/ast_iterator.mli) @@ -279,12 +286,13 @@ (ast_invariants.mli as compiler-libs/ast_invariants.mli) (depend.mli as compiler-libs/depend.mli) (asttypes.mli as compiler-libs/asttypes.mli) - (jane_asttypes.mli as compiler-libs/jane_asttypes.mli) (parsetree.mli as compiler-libs/parsetree.mli) (ident.mli as compiler-libs/ident.mli) (path.mli as compiler-libs/path.mli) (jkind.mli as compiler-libs/jkind.mli) + (jkind_types.mli as compiler-libs/jkind_types.mli) (primitive.mli as compiler-libs/primitive.mli) + (zero_alloc.mli as compiler-libs/zero_alloc.mli) (types.mli as compiler-libs/types.mli) (btype.mli as compiler-libs/btype.mli) (binutils.mli as compiler-libs/binutils.mli) @@ -311,14 +319,16 @@ (cms_format.mli as compiler-libs/cms_format.mli) (untypeast.mli as compiler-libs/untypeast.mli) (includemod.mli as compiler-libs/includemod.mli) + (typemode.mli as compiler-libs/typemode.mli) (typetexp.mli as compiler-libs/typetexp.mli) (printpat.mli as compiler-libs/printpat.mli) (parmatch.mli as compiler-libs/parmatch.mli) (stypes.mli as compiler-libs/stypes.mli) (typedecl.mli as compiler-libs/typedecl.mli) (typeopt.mli as compiler-libs/typeopt.mli) - (rec_check.mli as compiler-libs/rec_check.mli) + (value_rec_check.mli as compiler-libs/value_rec_check.mli) (typecore.mli as compiler-libs/typecore.mli) + (solver.mli as compiler-libs/solver.mli) (mode.mli as compiler-libs/mode.mli) (uniqueness_analysis.mli as compiler-libs/uniqueness_analysis.mli) (typeclass.mli as compiler-libs/typeclass.mli) @@ -333,6 +343,8 @@ (matching.mli as compiler-libs/matching.mli) (printlambda.mli as compiler-libs/printlambda.mli) (runtimedef.mli as compiler-libs/runtimedef.mli) + (runtimetags.mli as compiler-libs/runtimetags.mli) + (value_rec_compiler.mli as compiler-libs/value_rec_compiler.mli) (simplif.mli as compiler-libs/simplif.mli) (switch.mli as compiler-libs/switch.mli) (translmode.mli as compiler-libs/translmode.mli) @@ -358,5 +370,6 @@ (compilation_unit.mli as compiler-libs/compilation_unit.mli) (linkage_name.mli as compiler-libs/linkage_name.mli) (symbol.mli as compiler-libs/symbol.mli) + (zero_alloc_utils.mli as compiler-libs/zero_alloc_utils.mli) )) diff --git a/file_formats/cmi_format.ml b/file_formats/cmi_format.ml index 621b4fd1853..abb13aa61ed 100644 --- a/file_formats/cmi_format.ml +++ b/file_formats/cmi_format.ml @@ -20,6 +20,13 @@ type pers_flags = | Alerts of alerts | Opaque +type kind = + | Normal of { + cmi_impl : Compilation_unit.t; + cmi_arg_for : Compilation_unit.Name.t option; + } + | Parameter + type error = | Not_an_interface of filepath | Wrong_version_interface of filepath * string @@ -53,11 +60,18 @@ module Serialized = Types.Make_wrapped(struct type 'a t = int end) input_value and output_value usage. *) type crcs = Import_info.t array (* smaller on disk than using a list *) type flags = pers_flags list -type header = Compilation_unit.t * Serialized.signature +type header = { + header_name : Compilation_unit.Name.t; + header_kind : kind; + header_sign : Serialized.signature; + header_params : Compilation_unit.Name.t list; +} type 'sg cmi_infos_generic = { - cmi_name : Compilation_unit.t; + cmi_name : Compilation_unit.Name.t; + cmi_kind : kind; cmi_sign : 'sg; + cmi_params : Compilation_unit.Name.t list; cmi_crcs : crcs; cmi_flags : flags; } @@ -108,12 +122,19 @@ let input_cmi_lazy ic = in let data_len = Bytes.get_int64_ne (read_bytes 8) 0 |> Int64.to_int in let data = read_bytes data_len in - let (name, sign) = (input_value ic : header) in + let { + header_name = name; + header_kind = kind; + header_sign = sign; + header_params = params; + } = (input_value ic : header) in let crcs = (input_value ic : crcs) in let flags = (input_value ic : flags) in { cmi_name = name; + cmi_kind = kind; cmi_sign = deserialize data sign; + cmi_params = params; cmi_crcs = crcs; cmi_flags = flags; } @@ -167,15 +188,26 @@ let output_cmi filename oc cmi = output_int64 oc len; Out_channel.seek oc val_pos; (* BACKPORT BEGIN *) - (* mshinwell: upstream uses [Compression] here *) - output_value oc ((cmi.cmi_name, sign) : header); + (* CR ocaml 5 compressed-marshal mshinwell: + upstream uses [Compression] here *) + output_value oc + { + header_name = cmi.cmi_name; + header_kind = cmi.cmi_kind; + header_sign = sign; + header_params = cmi.cmi_params; + }; (* BACKPORT END *) flush oc; let crc = Digest.file filename in - let crcs = - Array.append [| Import_info.create_normal cmi.cmi_name ~crc:(Some crc) |] - cmi.cmi_crcs + let my_info = + match cmi.cmi_kind with + | Normal { cmi_impl } -> + Import_info.Intf.create_normal cmi.cmi_name cmi_impl ~crc + | Parameter -> + Import_info.Intf.create_parameter cmi.cmi_name ~crc in + let crcs = Array.append [| my_info |] cmi.cmi_crcs in output_value oc (crcs : crcs); output_value oc (cmi.cmi_flags : flags); crc diff --git a/file_formats/cmi_format.mli b/file_formats/cmi_format.mli index 137b235021b..7ccebc56501 100644 --- a/file_formats/cmi_format.mli +++ b/file_formats/cmi_format.mli @@ -20,9 +20,20 @@ type pers_flags = | Alerts of alerts | Opaque +type kind = + | Normal of { + cmi_impl : Compilation_unit.t; + (* If this module takes parameters, [cmi_impl] will be the functor that + generates instances *) + cmi_arg_for : Compilation_unit.Name.t option; + } + | Parameter + type 'sg cmi_infos_generic = { - cmi_name : Compilation_unit.t; + cmi_name : Compilation_unit.Name.t; + cmi_kind : kind; cmi_sign : 'sg; + cmi_params : Compilation_unit.Name.t list; cmi_crcs : Import_info.t array; cmi_flags : pers_flags list; } diff --git a/file_formats/cms_format.ml b/file_formats/cms_format.ml index 9b29e2c5726..9dcd3d2e653 100644 --- a/file_formats/cms_format.ml +++ b/file_formats/cms_format.ml @@ -30,6 +30,8 @@ type cms_infos = { cms_uid_to_loc : Location.t Shape.Uid.Tbl.t; cms_uid_to_attributes : Parsetree.attributes Shape.Uid.Tbl.t; cms_impl_shape : Shape.t option; (* None for mli *) + cms_ident_occurrences : + (Longident.t Location.loc * Shape_reduce.result) array } type error = @@ -55,23 +57,69 @@ let read filename = raise (Error (Not_a_shape filename)) ) -let save_cms filename modname sourcefile shape = +let toplevel_attributes = ref [] + +let register_toplevel_attributes uid ~attributes ~loc = + toplevel_attributes := (uid, loc, attributes) :: !toplevel_attributes + +let uid_tables_of_binary_annots binary_annots = + let cms_uid_to_loc = Types.Uid.Tbl.create 42 in + let cms_uid_to_attributes = Types.Uid.Tbl.create 42 in + List.iter (fun (uid, loc, attrs) -> + Types.Uid.Tbl.add cms_uid_to_loc uid loc; + Types.Uid.Tbl.add cms_uid_to_attributes uid attrs) + !toplevel_attributes; + Cmt_format.iter_declarations binary_annots + ~f:(fun uid decl -> + let loc, attrs = + match decl with + | Value v -> v.val_loc, v.val_attributes + | Value_binding v -> v.vb_loc, v.vb_attributes + | Type v -> v.typ_loc, v.typ_attributes + | Constructor v -> v.cd_loc, v.cd_attributes + | Extension_constructor v -> v.ext_loc, v.ext_attributes + | Label v -> v.ld_loc, v.ld_attributes + | Module v -> v.md_loc, v.md_attributes + | Module_substitution v -> v.ms_loc, v.ms_attributes + | Module_binding v -> v.mb_loc, v.mb_attributes + | Module_type v -> v.mtd_loc, v.mtd_attributes + | Class v -> v.ci_loc, v.ci_attributes + | Class_type v -> v.ci_loc, v.ci_attributes + in + Types.Uid.Tbl.add cms_uid_to_loc uid loc; + Types.Uid.Tbl.add cms_uid_to_attributes uid attrs + ); + cms_uid_to_loc, cms_uid_to_attributes + +let save_cms filename modname binary_annots sourcefile shape = if (!Clflags.binary_annotations_cms && not !Clflags.print_types) then begin Misc.output_to_file_via_temporary ~mode:[Open_binary] filename (fun _temp_file_name oc -> - let source_digest = Option.map Digest.file sourcefile in - let cms = { - cms_modname = modname; - cms_comments = Lexer.comments (); - cms_sourcefile = sourcefile; - cms_builddir = Location.rewrite_absolute_path (Sys.getcwd ()); - cms_source_digest = source_digest; - cms_uid_to_loc = Env.get_uid_to_loc_tbl (); - cms_uid_to_attributes = Env.get_uid_to_attributes_tbl (); - cms_impl_shape = shape; - } in - output_cms oc cms) + let source_digest = Option.map Digest.file sourcefile in + let cms_ident_occurrences = + if !Clflags.store_occurrences then + Cmt_format.index_occurrences binary_annots + else + [| |] + in + let cms_uid_to_loc, cms_uid_to_attributes = + uid_tables_of_binary_annots binary_annots + in + let cms = + { + cms_modname = modname; + cms_comments = Lexer.comments (); + cms_sourcefile = sourcefile; + cms_builddir = Location.rewrite_absolute_path (Sys.getcwd ()); + cms_source_digest = source_digest; + cms_uid_to_loc; + cms_uid_to_attributes; + cms_impl_shape = shape; + cms_ident_occurrences + } + in + output_cms oc cms) end let clear () = () diff --git a/file_formats/cms_format.mli b/file_formats/cms_format.mli index 7d219b1cbdc..e4d17c7a4b8 100644 --- a/file_formats/cms_format.mli +++ b/file_formats/cms_format.mli @@ -26,6 +26,8 @@ type cms_infos = { cms_uid_to_loc : Location.t Shape.Uid.Tbl.t; cms_uid_to_attributes : Parsetree.attributes Shape.Uid.Tbl.t; cms_impl_shape : Shape.t option; (* None for mli *) + cms_ident_occurrences : + (Longident.t Location.loc * Shape_reduce.result) array } type error = @@ -43,10 +45,17 @@ val read : string -> cms_infos val save_cms : string -> (* filename.cms to generate *) Compilation_unit.t -> (* module name *) + Cmt_format.binary_annots -> string option -> (* source file *) Shape.t option -> unit +val register_toplevel_attributes : + Shape.Uid.t -> + attributes:Parsetree.attribute list -> + loc:Location.t -> + unit + (* Miscellaneous functions *) val read_magic_number : in_channel -> string diff --git a/file_formats/cmt_format.ml b/file_formats/cmt_format.ml index 1a82c5131a6..d35877168fe 100644 --- a/file_formats/cmt_format.ml +++ b/file_formats/cmt_format.ml @@ -36,14 +36,14 @@ type binary_annots = | Partial_interface of binary_part array and binary_part = -| Partial_structure of structure -| Partial_structure_item of structure_item -| Partial_expression of expression -| Partial_pattern : 'k pattern_category * 'k general_pattern -> binary_part -| Partial_class_expr of class_expr -| Partial_signature of signature -| Partial_signature_item of signature_item -| Partial_module_type of module_type + | Partial_structure of structure + | Partial_structure_item of structure_item + | Partial_expression of expression + | Partial_pattern : 'k pattern_category * 'k general_pattern -> binary_part + | Partial_class_expr of class_expr + | Partial_signature of signature + | Partial_signature_item of signature_item + | Partial_module_type of module_type type cmt_infos = { cmt_modname : Compilation_unit.t; @@ -54,27 +54,68 @@ type cmt_infos = { cmt_args : string array; cmt_sourcefile : string option; cmt_builddir : string; - cmt_loadpath : string list; + cmt_loadpath : Load_path.paths; cmt_source_digest : Digest.t option; cmt_initial_env : Env.t; cmt_imports : Import_info.t array; cmt_interface_digest : Digest.t option; cmt_use_summaries : bool; - cmt_uid_to_loc : Location.t Shape.Uid.Tbl.t; + cmt_uid_to_decl : item_declaration Shape.Uid.Tbl.t; cmt_impl_shape : Shape.t option; (* None for mli *) + cmt_ident_occurrences : + (Longident.t Location.loc * Shape_reduce.result) array } type error = Not_a_typedtree of string +let iter_on_parts (it : Tast_iterator.iterator) = function + | Partial_structure s -> it.structure it s + | Partial_structure_item s -> it.structure_item it s + | Partial_expression e -> it.expr it e + | Partial_pattern (_category, p) -> it.pat it p + | Partial_class_expr ce -> it.class_expr it ce + | Partial_signature s -> it.signature it s + | Partial_signature_item s -> it.signature_item it s + | Partial_module_type s -> it.module_type it s + +let iter_on_annots (it : Tast_iterator.iterator) = function + | Implementation s -> it.structure it s + | Interface s -> it.signature it s + | Packed _ -> () + | Partial_implementation array -> Array.iter (iter_on_parts it) array + | Partial_interface array -> Array.iter (iter_on_parts it) array + +let iter_on_declaration f decl = + match decl with + | Value vd -> f vd.val_val.val_uid decl; + | Value_binding vb -> + let bound_idents = let_bound_idents_full [vb] in + List.iter (fun (_, _, _, uid) -> f uid decl) bound_idents + | Type td -> + if not (Btype.is_row_name (Ident.name td.typ_id)) then + f td.typ_type.type_uid (Type td) + | Constructor cd -> f cd.cd_uid decl + | Extension_constructor ec -> f ec.ext_type.ext_uid decl; + | Label ld -> f ld.ld_uid decl + | Module md -> f md.md_uid decl + | Module_type mtd -> f mtd.mtd_uid decl + | Module_substitution ms -> f ms.ms_uid decl + | Module_binding mb -> f mb.mb_uid decl + | Class cd -> f cd.ci_decl.cty_uid decl + | Class_type ct -> f ct.ci_decl.cty_uid decl + +let iter_on_declarations ~(f: Shape.Uid.t -> item_declaration -> unit) = { + Tast_iterator.default_iterator with + item_declaration = (fun _sub decl -> iter_on_declaration f decl); +} + let need_to_clear_env = try ignore (Sys.getenv "OCAML_BINANNOT_WITHENV"); false with Not_found -> true let keep_only_summary = Env.keep_only_summary -open Tast_mapper - let cenv = {Tast_mapper.default with env = fun _sub env -> keep_only_summary env} @@ -103,6 +144,244 @@ let clear_env binary_annots = else binary_annots +(* Every typedtree node with a located longident corresponding to user-facing + syntax should be indexed. *) +let iter_on_occurrences + ~(f : namespace:Shape.Sig_component_kind.t -> + Env.t -> Path.t -> Longident.t Location.loc -> + unit) = + let path_in_type typ name = + match Types.get_desc typ with + | Tconstr (type_path, _, _) -> + Some (Path.Pdot (type_path, name)) + | _ -> None + in + let add_constructor_description env lid = + function + | { Types.cstr_tag = Extension (path, _); _ } -> + f ~namespace:Extension_constructor env path lid + | { Types.cstr_uid = Predef name; _} -> + let id = List.assoc name Predef.builtin_idents in + f ~namespace:Constructor env (Pident id) lid + | { Types.cstr_res; cstr_name; _ } -> + let path = path_in_type cstr_res cstr_name in + Option.iter (fun path -> f ~namespace:Constructor env path lid) path + in + let add_label env lid { Types.lbl_name; lbl_res; _ } = + let path = path_in_type lbl_res lbl_name in + Option.iter (fun path -> f ~namespace:Label env path lid) path + in + let with_constraint ~env (_path, _lid, with_constraint) = + match with_constraint with + | Twith_module (path', lid') | Twith_modsubst (path', lid') -> + f ~namespace:Module env path' lid' + | _ -> () + in + Tast_iterator.{ default_iterator with + + expr = (fun sub ({ exp_desc; exp_env; _ } as e) -> + (match exp_desc with + | Texp_ident (path, lid, _, _, _) -> + f ~namespace:Value exp_env path lid + | Texp_construct (lid, constr_desc, _, _) -> + add_constructor_description exp_env lid constr_desc + | Texp_field (_, lid, label_desc, _) + | Texp_setfield (_, _, lid, label_desc, _) -> + add_label exp_env lid label_desc + | Texp_new (path, lid, _, _) -> + f ~namespace:Class exp_env path lid + | Texp_record { fields; _ } -> + Array.iter (fun (label_descr, record_label_definition) -> + match record_label_definition with + | Overridden ( + { Location.txt; loc}, + {exp_loc; _}) + when not exp_loc.loc_ghost + && loc.loc_start = exp_loc.loc_start + && loc.loc_end = exp_loc.loc_end -> + (* In the presence of punning we want to index the label + even if it is ghosted *) + let lid = { Location.txt; loc = {loc with loc_ghost = false} } in + add_label exp_env lid label_descr + | Overridden (lid, _) -> add_label exp_env lid label_descr + | Kept _ -> ()) fields + | Texp_instvar (_self_path, path, name) -> + let lid = { name with txt = Longident.Lident name.txt } in + f ~namespace:Value exp_env path lid + | Texp_setinstvar (_self_path, path, name, _) -> + let lid = { name with txt = Longident.Lident name.txt } in + f ~namespace:Value exp_env path lid + | Texp_override (_self_path, modifs) -> + List.iter (fun (id, (name : string Location.loc), _exp) -> + let lid = { name with txt = Longident.Lident name.txt } in + f ~namespace:Value exp_env (Path.Pident id) lid) + modifs + | Texp_extension_constructor (lid, path) -> + f ~namespace:Extension_constructor exp_env path lid + | Texp_constant _ | Texp_let _ | Texp_function _ | Texp_apply _ + | Texp_match _ | Texp_try _ | Texp_tuple _ | Texp_variant _ | Texp_array _ + | Texp_ifthenelse _ | Texp_sequence _ | Texp_while _ | Texp_for _ + | Texp_send _ + | Texp_letmodule _ | Texp_letexception _ | Texp_assert _ | Texp_lazy _ + | Texp_object _ | Texp_pack _ | Texp_letop _ | Texp_unreachable + | Texp_list_comprehension _ | Texp_array_comprehension _ | Texp_probe _ + | Texp_probe_is_enabled _ | Texp_exclave _ + | Texp_open _ | Texp_src_pos -> ()); + default_iterator.expr sub e); + + (* Remark: some types get iterated over twice due to how constraints are + encoded in the typedtree. For example, in [let x : t = 42], [t] is + present in both a [Tpat_constraint] and a [Texp_constraint] node) *) + typ = + (fun sub ({ ctyp_desc; ctyp_env; _ } as ct) -> + (match ctyp_desc with + | Ttyp_constr (path, lid, _ctyps) -> + f ~namespace:Type ctyp_env path lid + | Ttyp_package {pack_path; pack_txt} -> + f ~namespace:Module_type ctyp_env pack_path pack_txt + | Ttyp_class (path, lid, _typs) -> + (* Deprecated syntax to extend a polymorphic variant *) + f ~namespace:Type ctyp_env path lid + | Ttyp_var _ | Ttyp_arrow _ | Ttyp_tuple _ | Ttyp_object _ + | Ttyp_alias _ | Ttyp_variant _ | Ttyp_poly _ + | Ttyp_call_pos -> ()); + default_iterator.typ sub ct); + + pat = + (fun (type a) sub + ({ pat_desc; pat_extra; pat_env; _ } as pat : a general_pattern) -> + (match pat_desc with + | Tpat_construct (lid, constr_desc, _, _) -> + add_constructor_description pat_env lid constr_desc + | Tpat_record (fields, _) -> + List.iter (fun (lid, label_descr, pat) -> + let lid = + let open Location in + (* In the presence of punning we want to index the label + even if it is ghosted *) + if (not pat.pat_loc.loc_ghost + && lid.loc.loc_start = pat.pat_loc.loc_start + && lid.loc.loc_end = pat.pat_loc.loc_end) + then {lid with loc = {lid.loc with loc_ghost = false}} + else lid + in + add_label pat_env lid label_descr) + fields + | Tpat_any | Tpat_var _ | Tpat_alias _ | Tpat_constant _ | Tpat_tuple _ + | Tpat_variant _ | Tpat_array _ | Tpat_lazy _ | Tpat_value _ + | Tpat_exception _ | Tpat_or _ -> ()); + List.iter (fun (pat_extra, _, _) -> + match pat_extra with + | Tpat_open (path, lid, _) -> + f ~namespace:Module pat_env path lid + | Tpat_type (path, lid) -> + f ~namespace:Type pat_env path lid + | Tpat_constraint _ | Tpat_unpack -> ()) + pat_extra; + default_iterator.pat sub pat); + + binding_op = (fun sub ({bop_op_path; bop_op_name; bop_exp; _} as bop) -> + let lid = { bop_op_name with txt = Longident.Lident bop_op_name.txt } in + f ~namespace:Value bop_exp.exp_env bop_op_path lid; + default_iterator.binding_op sub bop); + + module_expr = + (fun sub ({ mod_desc; mod_env; _ } as me) -> + (match mod_desc with + | Tmod_ident (path, lid) -> f ~namespace:Module mod_env path lid + | Tmod_structure _ | Tmod_functor _ | Tmod_apply _ | Tmod_apply_unit _ + | Tmod_constraint _ | Tmod_unpack _ -> ()); + default_iterator.module_expr sub me); + + open_description = + (fun sub ({ open_expr = (path, lid); open_env; _ } as od) -> + f ~namespace:Module open_env path lid; + default_iterator.open_description sub od); + + module_type = + (fun sub ({ mty_desc; mty_env; _ } as mty) -> + (match mty_desc with + | Tmty_ident (path, lid) -> + f ~namespace:Module_type mty_env path lid + | Tmty_with (_mty, l) -> + List.iter (with_constraint ~env:mty_env) l + | Tmty_alias (path, lid) -> + f ~namespace:Module mty_env path lid + | Tmty_signature _ | Tmty_functor _ | Tmty_typeof _ | Tmty_strengthen _ -> ()); + default_iterator.module_type sub mty); + + class_expr = + (fun sub ({ cl_desc; cl_env; _} as ce) -> + (match cl_desc with + | Tcl_ident (path, lid, _) -> f ~namespace:Class cl_env path lid + | Tcl_structure _ | Tcl_fun _ | Tcl_apply _ | Tcl_let _ + | Tcl_constraint _ | Tcl_open _ -> ()); + default_iterator.class_expr sub ce); + + class_type = + (fun sub ({ cltyp_desc; cltyp_env; _} as ct) -> + (match cltyp_desc with + | Tcty_constr (path, lid, _) -> f ~namespace:Class_type cltyp_env path lid + | Tcty_signature _ | Tcty_arrow _ | Tcty_open _ -> ()); + default_iterator.class_type sub ct); + + signature_item = + (fun sub ({ sig_desc; sig_env; _ } as sig_item) -> + (match sig_desc with + | Tsig_exception { + tyexn_constructor = { ext_kind = Text_rebind (path, lid)}} -> + f ~namespace:Extension_constructor sig_env path lid + | Tsig_modsubst { ms_manifest; ms_txt } -> + f ~namespace:Module sig_env ms_manifest ms_txt + | Tsig_typext { tyext_path; tyext_txt } -> + f ~namespace:Type sig_env tyext_path tyext_txt + | Tsig_value _ | Tsig_type _ | Tsig_typesubst _ | Tsig_exception _ + | Tsig_module _ | Tsig_recmodule _ | Tsig_modtype _ | Tsig_modtypesubst _ + | Tsig_open _ | Tsig_include _ | Tsig_class _ | Tsig_class_type _ + | Tsig_attribute _ -> ()); + default_iterator.signature_item sub sig_item); + + structure_item = + (fun sub ({ str_desc; str_env; _ } as str_item) -> + (match str_desc with + | Tstr_exception { + tyexn_constructor = { ext_kind = Text_rebind (path, lid)}} -> + f ~namespace:Extension_constructor str_env path lid + | Tstr_typext { tyext_path; tyext_txt } -> + f ~namespace:Type str_env tyext_path tyext_txt + | Tstr_eval _ | Tstr_value _ | Tstr_primitive _ | Tstr_type _ + | Tstr_exception _ | Tstr_module _ | Tstr_recmodule _ + | Tstr_modtype _ | Tstr_open _ | Tstr_class _ | Tstr_class_type _ + | Tstr_include _ | Tstr_attribute _ -> ()); + default_iterator.structure_item sub str_item) +} + +let iter_declarations binary_annots ~f = + iter_on_annots (iter_on_declarations ~f) binary_annots + +let index_declarations binary_annots = + let index : item_declaration Types.Uid.Tbl.t = Types.Uid.Tbl.create 16 in + let f uid fragment = Types.Uid.Tbl.add index uid fragment in + iter_declarations binary_annots ~f; + index + +let index_occurrences binary_annots = + let index : (Longident.t Location.loc * Shape_reduce.result) list ref = + ref [] + in + let f ~namespace env path lid = + let not_ghost { Location.loc = { loc_ghost; _ }; _ } = not loc_ghost in + if not_ghost lid then + match Env.shape_of_path ~namespace env path with + | exception Not_found -> () + | { uid = Some (Predef _); _ } -> () + | path_shape -> + let result = Shape_reduce.local_reduce_for_uid env path_shape in + index := (lid, result) :: !index + in + iter_on_annots (iter_on_occurrences ~f) binary_annots; + Array.of_list !index + exception Error of error let input_cmt ic = (input_value ic : cmt_infos) @@ -110,7 +389,8 @@ let input_cmt ic = (input_value ic : cmt_infos) let output_cmt oc cmt = output_string oc Config.cmt_magic_number; (* BACKPORT BEGIN *) - (* mshinwell: upstream uses [Compression] here *) + (* CR ocaml 5 compressed-marshal mshinwell: + upstream uses [Compression] here *) Marshal.(to_channel oc (cmt : cmt_infos) []) (* BACKPORT END *) @@ -188,9 +468,17 @@ let save_cmt filename modname binary_annots sourcefile initial_env cmi shape = Array.sort compare_imports imports; imports in + let cmt_ident_occurrences = + if !Clflags.store_occurrences then + index_occurrences binary_annots + else + Array.of_list [] + in + let cmt_annots = clear_env binary_annots in + let cmt_uid_to_decl = index_declarations cmt_annots in let cmt = { cmt_modname = modname; - cmt_annots = clear_env binary_annots; + cmt_annots; cmt_value_dependencies = !value_deps; cmt_comments = Lexer.comments (); cmt_args = Sys.argv; @@ -203,8 +491,9 @@ let save_cmt filename modname binary_annots sourcefile initial_env cmi shape = cmt_imports = get_imports (); cmt_interface_digest = this_crc; cmt_use_summaries = need_to_clear_env; - cmt_uid_to_loc = Env.get_uid_to_loc_tbl (); + cmt_uid_to_decl; cmt_impl_shape = shape; + cmt_ident_occurrences; } in output_cmt oc cmt) end; diff --git a/file_formats/cmt_format.mli b/file_formats/cmt_format.mli index e1b233fa684..c2b41b799a3 100644 --- a/file_formats/cmt_format.mli +++ b/file_formats/cmt_format.mli @@ -57,14 +57,16 @@ type cmt_infos = { cmt_args : string array; cmt_sourcefile : string option; cmt_builddir : string; - cmt_loadpath : string list; + cmt_loadpath : Load_path.paths; cmt_source_digest : string option; cmt_initial_env : Env.t; cmt_imports : Import_info.t array; cmt_interface_digest : Digest.t option; cmt_use_summaries : bool; - cmt_uid_to_loc : Location.t Shape.Uid.Tbl.t; + cmt_uid_to_decl : item_declaration Shape.Uid.Tbl.t; cmt_impl_shape : Shape.t option; (* None for mli *) + cmt_ident_occurrences : + (Longident.t Location.loc * Shape_reduce.result) array } type error = @@ -110,6 +112,13 @@ val set_saved_types : binary_part list -> unit val record_value_dependency: Types.value_description -> Types.value_description -> unit +val index_occurrences : + binary_annots -> (Longident.t Location.loc * Shape_reduce.result) array + +val iter_declarations + : binary_annots + -> f:(Shape.Uid.t -> Typedtree.item_declaration -> unit) + -> unit (* diff --git a/jane/build-resolved-files-for-ci b/jane/build-resolved-files-for-ci index 0d56827bc61..00b96d31175 100755 --- a/jane/build-resolved-files-for-ci +++ b/jane/build-resolved-files-for-ci @@ -88,6 +88,7 @@ typing_mls=( includecore includemod jkind + jkind_types mtype oprint parmatch diff --git a/jane/doc/extensions/comprehensions/details.md b/jane/doc/extensions/comprehensions/details.md new file mode 100644 index 00000000000..c8bc967d918 --- /dev/null +++ b/jane/doc/extensions/comprehensions/details.md @@ -0,0 +1,279 @@ +# Comprehension details + +This file covers how comprehensions work in more detail than is +necessary on a day-to-day level; for a higher-level view, see the [introduction to comprehensions](intro.md). + +## Syntax + +The BNF for comprehensions, in a form suitable for being added to the [grammar of +OCaml](https://v2.ocaml.org/manual/expr.html), is + +``` +expr +::= + | `[` comprehension `]` + | `[|` comprehension `|]` + +comprehension ::= + expr { comprehension_clause }+ + +comprehension_clause ::= + | `for` comprehension_iterator { `and` comprehension_iterator }* + | `when` expr + +comprehension_iterator ::= + | pattern `in` expr + | value-name `=` expr ( `to` | `downto` ) expr +``` + +## Evaluation Order + +Evaluating a comprehension happens in the following order: + +1. Clauses are evaluated from left to right. Clauses further to the right will + be evaluated once for each of the values from the surrounding iterators. + * To evaluate a `for ... and ...` clause, first the sources of values for + each iterator are evaluated, and then the iterators are iterated over + from left to right. + 1. Before performing any iteration, each iterator’s source of values is + evaluated exactly once, in order from left to right. + * For a `PAT in SEQ` iterator, the expression `SEQ` is evaluated. + * For a `VAR = START to/downto STOP` iterator, the expression + `START` is evaluated before the expression `STOP`. + 2. Then, the iterators are iterated over, from left to right; the + iterators further to the right “vary faster”. Each time a value is + drawn from an iterator, the next iterator will be iterated over in + its entirety before the “outer” (more leftwards) iterator moves onto + the next value. + * To evaluate a `when COND` clause, the expression `COND` is evaluated; if + it evaluates to `false`, the current iteration is terminated and the + innermost surrounding iterator advances to its next value. No clauses + further to the right are evaluated, and nor is the body. +2. At each iteration step, once of all the clauses have been evaluated (and all + the `when` clauses have evaluated to `true`), the body is evaluated, and the + result is the next element of the resulting sequence. + +## Desugaring + +List and array comprehensions are compiled completely differently; the former +are compiled in terms of some internal pre-provided functions, and the latter +are compiled as a series of nested loops. + +### Compiling list comprehensions + +List comprehensions are compiled in terms of reversed difference lists. A +difference list in general is a function from lists to lists; by "reversed", +we mean that these lists are stored backwards, and need to be reversed at +the end. We make both these choices for the usual efficiency reasons: +difference lists allow for efficient concatenation; they can also be viewed +as based on passing around accumulators, which allows us to make our +functions tail-recursive, at the cost of building our lists up backwards. +An additional choice we make is to build all these intermediate data +structures on the stack (i.e., make them `local_`); again, this is for +efficiency, as it means we don't need to get the structure of these +difference lists involved with the garbage collector. Since we can +currently only generate global lists with list comprehensions, we need a +type that is spine-local but element-global; we thus define a custom type of +such snoc[^fn:snoc] lists and define our difference lists in terms of that (in the +internal module `CamlinternalComprehension`): +```ocaml + type 'a rev_list = + | Nil + | Snoc of { init : 'a rev_list; global_ last : 'a } + + type 'a rev_dlist = local_ 'a rev_list -> local_ 'a rev_list +``` +We then work exclusively in terms of `local_ 'a rev_dlist` values, reversing +them into a global `list` only at the very end. + +[^fn:snoc]: I.e., the reverse of cons (`::`). + +We desugar each iterator of a list comprehension into the application of a +tail-recursive higher-order function analogous to `concat_map`, whose type +is of the following form: +```ocaml + ...iterator arguments... -> + local_ ('elt -> local_ 'res rev_dlist) -> + local_ 'res rev_dlist +``` +Here, the `...iterator arguments...` define the sequence of values to be +iterated over (the `seq` of a `for pat in seq` iterator, or the `start` and +`end` of a `for x = start to/downto end` iterator); the function argument is +then to be called once for each item. What goes in the function? It will be +the next iterator, desugared in the same way. At any time, a `when` clause +might intervene, which is simply desugared into a conditional that gates +entering the next phase of the translation. + +Eventually, we reach the body, which is placed into the body of the innermost +translated function; it produces the single-item reversed difference list +(alternatively, snocs its generated value onto the accumulator). Because each +function is analogous to `concat_map`, this builds up the correct list in the +end. The whole thing is then passed into a reversal function, building the +final list. + +For example, consider the following list comprehension: +```ocaml +[x+y for x = 1 to 3 when x <> 2 for y in [10*x; 100*x]] +(* = [11; 101; 33; 303] *) +``` +This translates to the (Lambda equivalent of the) following: +```ocaml +(* Convert the result to a normal list *) +CamlinternalComprehension.rev_list_to_list ( + (* for x = 1 to 3 *) + let start = 1 in + let stop = 3 in + CamlinternalComprehension.rev_dlist_concat_iterate_up + start stop + (fun x acc_x -> local_ + (* when x <> 2 *) + if x <> 2 + then + (* for y in [10*x; 100*x] *) + let iter_list = [10*x; 100*x] in + CamlinternalComprehension.rev_dlist_concat_map + iter_list + (fun y acc_y -> local_ + (* The body: x+y *) + Snoc { init = acc_y; last = x*y }) + acc_x + else + acc_x) + Nil) +``` + +### Compiling array comprehensions + +Array comprehensions are compiled completely differently from list +comprehensions: they turn into a nested series of loops that mutably update an +array. This is simple to say, but slightly tricky to do. One complexity is +that we want to apply an optimization to certain array comprehensions: if an +array comprehension contains exactly one clause, and it’s a `for ... and ...` +clause, then we can allocate an array of exactly the right size up front +(instead of having to grow the generated array dynamically, as we usually do). +We call this the *fixed-size array comprehension optimization*. We cannot do +this with nested `for`s, as the sizes of iterators further to the right could +depend on the values generated by those on the left; indeed, this is one of the +reasons we have `for ... and ...` instead of just allowing the user to nest +`for`s. + +In the general case, the structure is: we allocate an array and a mutable index +counter that starts at `0`; each iterator becomes a loop; `when` clauses become +an `if` expression, same as with lists; and in the body, every time we generate +an array element, we set it and increment the index counter by one. If we’re +not in the fixed-size array case, then we also need the array to be growable. +This is the first source of extra complexity: we keep track of the array size, +and if we would ever exceed it, we double the size of the array. This means +that at the end, we have to use a subarray operation to cut it down to the right +size. + +The second source of extra complexity is the fixed-size array case. In this +case, we have to first compute the size of every iterator and multiply them +together; for both of these operations, we have to check for overflow, in which +case we simply fail. We also check to see if any of the iterators would be +empty (have size `0`), in which case we can shortcut this whole process and +simply return an empty array. Once we do that, though, the loop body is simpler +as there’s no need to double the array size, and we don’t need to cut the list +down to size at the end. + +To see some examples of what this translation looks like, consider the following +array comprehension, the same as the list comprehension we had before: +```ocaml +[| x+y for x = 1 to 3 when x <> 2 for y in [| 10*x; 100*x |] |] +(* = [| 11; 101; 33; 303 |] *) +``` +This translates to (the Lambda equivalent of) the following: +```ocaml +(* Allocate the (resizable) array *) +let array_size = ref 8 in +let array = ref [|0; 0; 0; 0; 0; 0; 0; 0|] in +(* Next element to be generated *) +let index = ref 0 in +(* for x = 1 to 3 *) +let start = 1 in +let stop = 3 in +for x = start to stop do + (* when x <> 2 *) + if x <> 2 then + (* for y in [|10*x; 100*x|] *) + let iter_arr = [|10*x; 100*x|] in + for iter_ix = 0 to Array.length iter_arr - 1 do + let y = iter_arr.(iter_ix) in + (* Resize the array if necessary *) + if not (!index < !array_size) then begin + array_size := 2 * !array_size; + array := Array.append !array !array + end; + (* The body: x + y *) + !array.(!index) <- x + y; + index := !index + 1 + done +done; +(* Cut the array back down to size *) +Array.sub !array 0 !index +``` +On the other hand, consider this array comprehension, which is subject to the +fixed-size array comprehension optimization: +```ocaml +[|x*y for x = 1 to 3 and y = 10 downto 8|] +(* = [|10; 9; 8; 20; 18; 16; 30; 27; 24|] *) +``` +This translates to (the Lambda equivalent of) the following rather different OCaml: +```ocaml +(* ... = 1 to 3 *) +let start_x = 1 in +let stop_x = 3 in +(* ... = 10 downto 8 *) +let start_y = 10 in +let stop_y = 8 in +(* Check if any iterators are empty *) +if start_x > stop_x || start_y < stop_y +then + (* If so, return the empty array *) + [||] +else + (* Precompute the array size *) + let array_size = + (* Compute the size of the range [1 to 3], failing on overflow (the case + where the range is correctly size 0 is handled by the emptiness check) *) + let x_size = + let range_size = (stop_x - start_x) + 1 in + if range_size > 0 + then range_size + else raise (Invalid_argument "integer overflow when precomputing \ + the size of an array comprehension") + in + (* Compute the size of the range [10 downto 8], failing on overflow (the + case where the range is correctly size 0 is handled by the emptiness + check) *) + let y_size = + let range_size = (start_y - stop_y) + 1 in + if range_size > 0 + then range_size + else raise (Invalid_argument "integer overflow when precomputing \ + the size of an array comprehension") + in + (* Multiplication that checks for overflow ([y_size] can't be [0] because we + checked that above *) + let product = x_size * y_size in + if product / y_size = x_size + then product + else raise (Invalid_argument "integer overflow when precomputing \ + the size of an array comprehension") + in + (* Allocate the (nonresizable) array *) + let array = Array.make array_size 0 in + (* Next element to be generated *) + let index = ref 0 in + (* for x = 1 to 3 *) + for x = start_x to stop_x do + (* for y = 10 downto 8 *) + for y = start_y downto stop_y do + (* The body: x*y *) + array.(!index) <- x*y; + index := !index + 1 + done + done; + array +``` +You can see that the loop body is tighter, but there’s more up-front size +checking work to be done. \ No newline at end of file diff --git a/jane/doc/extensions/comprehensions/intro.md b/jane/doc/extensions/comprehensions/intro.md new file mode 100644 index 00000000000..938fb72b628 --- /dev/null +++ b/jane/doc/extensions/comprehensions/intro.md @@ -0,0 +1,149 @@ +# The `comprehensions` extension + +This page introduces comprehensions and gives a high-level, user-oriented +overview. +For more technical details, see [the detailed documentation](details.md). + +# List and array comprehensions + +List and array comprehensions, as also seen in languages such as Python or +Haskell, are a syntactic form for cleanly building lists and arrays (hereinafter +referred to collectively as sequences), based on mathematical set-builder +notation. Here are some examples: + +```ocaml +# open Core;; +# (* Pythagorean triples with components from 1 to 10, no duplicate triples *) + [ a, b, c for a = 1 to 10 for b = a to 10 for c = b to 10 when a * a + b * b = c * c ];; +- : (int * int * int) list = [(3, 4, 5); (6, 8, 10)] + +# (* Let's describe some objects *) + [| sprintf "a %s %s" adjective noun + for noun in [| "light"; "pepper" |] + and adjective in [| "red"; "yellow"; "green" |] + |];; +- : string array = +[|"a red light"; "a yellow light"; "a green light"; "a red pepper"; + "a yellow pepper"; "a green pepper"|] + +# (* Compute a list of reciprocals in increasing order *) + [ 1. /. Float.of_int x for x = 5 downto 0 when x <> 0 ];; +- : float list = [0.2; 0.25; 0.333333333333333315; 0.5; 1.] + +# (* Flatten a nested array *) + let sentences = + [| [| "hello"; "world" |] + ; [| "how"; "are"; "you"; "doing" |] + ; [| "please"; "enjoy"; "these"; "comprehensions" |] + |] + in + [| word for sentence in sentences for word in sentence |];; +- : string array = +[|"hello"; "world"; "how"; "are"; "you"; "doing"; "please"; "enjoy"; "these"; + "comprehensions"|] + +# (* We could use comprehensions to reimplement map... *) + let map' ~f l = [ f x for x in l ];; +val map' : f:('a -> 'b) -> 'a list -> 'b list = + +# (* ...and filter *) + let filter' ~f l = [| x for x in l when f x |];; +val filter' : f:('a -> bool) -> 'a array -> 'a array = +``` + +## Syntax and semantics + +The general form of a (list) comprehension is + +```ocaml +[ BODY + for PAT in SEQ and ... and VAR = LOW to HIGH and ... and VAR = HIGH downto LOW and ... + ... + when COND + ... + for ... + ... + when ... + ... ] +``` + +(Array comprehensions differ only in being surrounded by `[| ... |]` instead of +`[ ... ]`.) Breaking this down: + +* The body is an expression that computes the values of the resulting sequence. + Examples above include `a,b,c` and `sprintf "a %s %s" adjective noun`. + +* The various things that can come after a `for` or an `and` are called + *iterators*, and they generate values and bind them to patterns. Any + variables bound by these patterns are in scope to the right of the whole `for + ... and ...` clause, as well as in the body of the comprehension. Examples + above include (a) `adjective in [| "red"; "yellow"; "green" |]`, (b) `a = 1 to + 10`, and (c) `x = 5 downto 0`. + + The `PAT in SEQ` form (example (a)) iterates over a sequence, and matches + each value in that sequence against the specified pattern. (Partial + patterns will currently throw an exception if the match fails; e.g., + `Some _ in [ None ]` will throw an exception. This may + change in future versions.) List comprehensions iterate over lists and + array comprehensions iterate over arrays; the two cannot be mixed. + + + The `VAR = LOW to HIGH` and `VAR = HIGH downto LOW` forms (examples (b) + and (c), respectively) iterate over inclusive ranges of `int`s, just as + they do in `for` loops; the `to` form counts up from `LOW` to `HIGH`, and + the `downto` form counts down from `HIGH` to `LOW`. If `LOW > HIGH`, + these iterators are empty and will never produce any values. + +* The `when` clauses specify conditions on the values being iterated over; the + body, as well as any clauses to the right of a `when`, are only evaluated on + iterations when the condition, a `bool`, is `true`. Examples above include + `when a * a + b * b = c * c` and `when x <> 0`. + +The result of the comprehension is a sequence consisting of the value of the +body expression evaluated with the iterator patterns bound to every possible +combination of values from the iterators (the Cartesian product) such that all +the conditions hold. The order of the result is given by evaluating the clauses +(`for ... and ...` and `when` alike) in order from left to right; they may be +thought of as nested loops/conditionals. + +## A special-case optimization for simple (fixed-size) array comprehensions + +One somewhat unusual design choice is the decision to allow multiple iterators +in a single clause, via `for ITERATOR_1 and ITERATOR_2 and ... and ITERATOR_N`, +rather than just having the user write `for ITERATOR_1 for ITERATOR_2 ... for +ITERATOR_N`. The semantics of the two are almost the same, but not quite. The +key difference is that `and` does parallel assignment, while nested `for`s do +sequential assignment. This difference has two consequences. The first +consequence is about variable scoping: nested `for`s allow you to use an earlier +variable in a later iterator, while `and` does not. This is just like the +difference between `let BINDING_1 in let BINDING_2 in BODY` (two `for`s) +vs. `let BINDING_1 and BINDING_2 in BODY` (`for`-`and`). The second consequence +is about evaluation order and frequency: the right-hand side of every iterator +in a single `for`-`and` clause is evaluated all at once before iteration begins, +but nested `for` clauses cause the inner clause's iterator to be repeatedly +re-evaluated on every iteration of the outer clause. + +The parallel semantics of `and` offers us an optimization opportunity for array +comprehensions: if an array comprehension contains exactly one clause, and it’s +a `for ... and ...` clause, then we can allocate an array of exactly the right +size up front (instead of having to grow the generated array dynamically, as we +usually do). We call this the *fixed-size array comprehension optimization*. +We cannot do this with nested `for`s, as the sizes of iterators further to the +right could depend on the values generated by those on the left. Thus, the +second example above (“Let’s describe some objects”) would preallocate an array +of 6 strings and loop through it, whereas the fourth example (“Flatten a nested +array”) would have to start with a smaller array and grow it as necessary. +(Of course, this optimization does not apply to lists. The only thing we can do with a +list is iterate over it, and the only way we can produce a list is by building it up piece +by piece.) + +## Evaluation order + +The clauses (`for ... and ...` and `when`) of a comprehension are guaranteed to +be evaluated from left to right, and all the sources of values for iterators in +a single `for ... and ...` clause are guaranteed to be evaluated exactly once +per surrounding iteration before any of them begin to iterate. + +## More details + +This should be enough to use comprehensions on a day-to-day basis; if you have +more questions, or are simply curious about how things work on the inside, see +the [details page](details.md). \ No newline at end of file diff --git a/jane/doc/extensions/iarray.md b/jane/doc/extensions/iarray.md new file mode 100644 index 00000000000..bbc6d4f1ceb --- /dev/null +++ b/jane/doc/extensions/iarray.md @@ -0,0 +1,30 @@ +# The `immutable_arrays` extension + +Immutable arrays are just like regular arrays, but they can't be +mutated: there's no `iarr.(0) <- new_value`, no `Iarray.blit`, etc. +The syntax is the same as existing mutable arrays, but using `:` instead +of `|`: + +```ocaml +open Iarray.O + +let immutable_array : string iarray = + [: "zero"; "one"; "two"; "three" :] +;; + +let zero : string = + immutable_array.:(0) +;; +``` + +Because `iarray`s do not allow mutation, it is possible for the contents of an +`iarray` to be stack allocated. See the `Iarray.Local` module in the stdlib +library. + +Another difference is that `iarray` is covariant: if the type `sub` is a subtype of the +type `super`, then `sub iarray` is a subtype of `super iarray`, as though you had `type ++'a iarray = ...`. (Put another way, this means that you can cast through `iarray`s: +`(iarr : sub iarray :> super iarray)` is always valid when `(x : sub :> super)` is.) + +You can also have *immutable array comprehensions*: `[: x, y for x = 1 +to 3 and y in [: "some"; "thing" :] :]`. \ No newline at end of file diff --git a/jane/doc/extensions/include-functor.md b/jane/doc/extensions/include-functor.md new file mode 100644 index 00000000000..a1feae634eb --- /dev/null +++ b/jane/doc/extensions/include-functor.md @@ -0,0 +1,96 @@ +# The `include functor` extension + +The `include functor` extension eliminates a common source of boilerplate when +defining modules that include the results of functors. It adds the module item +form `include functor F`, where `F` must be a functor whose parameter can be +"filled in" with the previous contents of the module. For example, you can now +write this: + +```ocaml +module M = struct + type t = ... + [@@deriving compare, sexp] + + include functor Comparable.Make +end +``` + +Traditionally, this would have required defining an inner structure `T` just to +have something the functor can be applied to: + +```ocaml +module M = struct + module T = struct + type t = ... + [@@deriving compare, sexp] + end + + include T + include Comparable.Make(T) +end +``` + +These two code fragments behave identically, except that in the first case the +module `M` won't have a submodule `T`. + +The feature can also be used in signatures: + +```ocaml +module type F = functor (T : sig ... end) -> Comparable.S with type t = T.t + +module type S = sig + type t + [@@deriving compare, sexp] + + include functor F +end +``` + +This behaves as if we had written: + +```ocaml +module type S = sig + type t + [@@deriving compare, sexp] + + include Comparable.S with type t := t +end +``` + +Currently it's uncommon to define functor module types like `F` (there's no such +module type in `Comparable`, for example). However, you can get the module type +of a functor directly with `module type of`, so the previous signature could +equivalently be written: + +```ocaml +module type S = sig + type t + [@@deriving compare, sexp] + + include functor module type of Comparable.Make +end +``` + +## Details and Limitations + +This extension is not available in the upstream compiler, so publicly +released code should not use it. We plan to upstream it in the +future. + +To include a functor `F`, it must have a module type of the form: + +```ocaml + F : S1 -> S2 +``` + +or + +```ocaml + F : S1 -> () -> S2 +``` + +where `S1` and `S2` are signatures. + +Currently, `include functor` cannot be used in the signatures of recursive +modules. It may be possible to lift this restriction in the future, if there is +sufficient demand. \ No newline at end of file diff --git a/jane/doc/extensions/labeled-tuples/reference.md b/jane/doc/extensions/labeled-tuples/reference.md new file mode 100644 index 00000000000..d9ac55c1985 --- /dev/null +++ b/jane/doc/extensions/labeled-tuples/reference.md @@ -0,0 +1,127 @@ +# Labeled tuples + +The *labeled tuples* extension allows you to label tuple elements. It is +conceptually dual to labeled function arguments, allowing you to give a helpful +name to constructed values where labeled function arguments permit giving a +helpful name to parameters. + +Here is a motivating example +where we want to compute two values from a list and be careful +not to mix them up: + +```ocaml +let sum_and_product ints = + let init = ~sum:0, ~product:1 in + List.fold_left ints ~init ~f:(fun (~sum, ~product) elem -> + let sum = elem + sum in + let product = elem * product in + ~sum, ~product) +``` + +This example shows the use of labeled tuples in types and patterns. They may be +punned like record elements / function arguments. + +In types, tuple labels are written similarly to function argument labels. For +example, the function `f` in the previous example has the type: + +```ocaml +(sum:int * product:int) -> int -> sum:int * product:int +``` + +Labeled tuples are useful anytime you want to use names to explain or +disambiguate the elements of a tuple, but declaring a new record feels too +heavy. As another example, consider this function from `Core_unix` which +creates a pipe with descriptors for reading and writing: + +```ocaml +val pipe : ?close_on_exec:bool -> unit -> File_descr.t * File_descr.t +``` + +Which is which? While it's possible declaring a new record might be best in +this case, we can now use labeled tuples: + +```ocaml +val pipe : ?close_on_exec:bool -> unit -> read:File_descr.t * write:File_descr.t +``` + +Tuples may be partially labeled, which can be useful when some elements of the +tuple share a type and need disambiguation, but others don't. For example: +```ocaml +type min_max_avg = min:int * max:int * float +``` + +## Reordering and partial patterns + +Like records, labeled tuple patterns may be reordered or partial. The compiler +only supports reordering / partial matching when it knows the type of the +pattern from its context. + +So, for example, we can write: +```ocaml +# let lt = ~x:0, ~y:42;; +val lt : x:int * y:int = (~x:0, ~y:42) + +# let twice_y = let ~y, .. = lt in y * 2;; +val twice_y : int = 84 +``` + +When the type is not known (in the same sense that we require a type to be known +to disambiguate among constructors), the compiler will reject a partial pattern. For +example, this program + +```ocaml +let get_y t = + let ~y, .. = t in + y +``` + +is rejected with this error: + +``` +File "foo.ml", line 2, characters 8-14: +2 | let ~y, .. = t in + ^^^^^^ +Error: Could not determine the type of this partial tuple pattern. +``` + +This example could be fixed by adding a type annotation to the function's +parameter. + +Labels may also be repeated in a tuple, and unlabeled elements can be thought of +as all sharing the same unique label. When matching on such a tuple, the first +occurence of a label in the pattern is bound to the first corresponding label in +the value, and so on. As a result, it's also now possible to partially match on +an unlabeled tuple to retrieve the first few elements. + +## Limitations + +Parentheses are necessary to disambiguate functions types with labeled arguments +from function types with labeled tuple arguments when the first element of the +tuple has a label. `ocamlformat` will handle this for you. + +Unlike records, reordering is not supported in labeled tuple expressions, even +when the type is known. This is like how the function definition for a function +with labeled arguments must bind the arguments in the same order as the type. + +Labeled tuples do not support projection (extracting an element of the tuple +by label). + +Structure-level let bindings do not allow reordering / partial matching as +flexibly as expression-level let bindings. For example, this program does not +typecheck: + +```ocaml +module M = struct + let lt = ~x:0, ~y:42 + let ~y, .. = lt +end +``` + +It results in the error: + +``` +File "foo.ml", line 3, characters 6-12: +3 | let ~y, .. = lt + ^^^^^^ +Error: Could not determine the type of this partial tuple pattern. +``` \ No newline at end of file diff --git a/jane/doc/local-intro.md b/jane/doc/extensions/local/intro.md similarity index 74% rename from jane/doc/local-intro.md rename to jane/doc/extensions/local/intro.md index b2fb8d4fe2c..2e86136fa69 100644 --- a/jane/doc/local-intro.md +++ b/jane/doc/extensions/local/intro.md @@ -1,29 +1,30 @@ # Introduction to Local Allocations +See also the full feature [reference](reference.md) and [common pitfalls](pitfalls.md). Instead of allocating values normally on the GC heap, local allocations allow you to stack-allocate values using the new `local_` keyword: - let local_ x = { foo; bar } in - ... +```ocaml +let local_ x = { foo; bar } in +... +``` or equivalently, by putting the keyword on the expression itself: - let x = local_ { foo; bar } in - ... - -To enable this feature, you need to pass the `-extension local` flag -to the compiler. Without this flag, `local_` is not recognized as a -keyword, and no local allocations will be performed. +```ocaml +let x = local_ { foo; bar } in +... +``` These values live on a separate stack, and are popped off at the end of the _region_. Generally, the region ends when the surrounding -function returns, although read [the reference](local-reference.md) for more +function returns, although read [the reference](reference.md) for more details. This helps performance in a couple of ways: first, the same few hot -cachelines are constantly reused, so the cache footprint is lower than +cache lines are constantly reused, so the cache footprint is lower than usual. More importantly, local allocations will never trigger a GC, and so they're safe to use in low-latency code that must currently be zero-alloc. @@ -31,13 +32,14 @@ zero-alloc. However, for this to be safe, local allocations must genuinely be local. Since the memory they occupy is reused quickly, we must ensure that no dangling references to them escape. This is checked by the -typechecker, and you'll see new error messages if local values leak: - - # let local_ thing = { foo; bar } in - some_global := thing;; - ^^^^^ - Error: This value escapes its region +type-checker, and you'll see new error messages if local values leak: +```ocaml +# let local_ thing = { foo; bar } in + some_global := thing;; + ^^^^^ +Error: This value escapes its region +``` Most of the types of allocation that OCaml does can be locally allocated: tuples, records, variants, closures, boxed numbers, @@ -57,16 +59,21 @@ them in globals, etc. This is a problem when trying to pass around locally-allocated values, since we need to guarantee they do not escape. -The remedy is that we allow the `local_` keyword to also appear on function parameters: +The remedy is that we allow the `local_` keyword to also appear on +function parameters: - let f (local_ x) = ... +```ocaml +let f (local_ x) = ... +``` A local parameter is a promise by a function not to let a particular argument escape its region. In the body of f, you'll get a type error if x escapes, but when calling f you can freely pass local values as the argument. This promise is visible in the type of f: - val f : local_ 'a -> ... +```ocaml +val f : local_ 'a -> ... +``` The function f may be equally be called with locally-allocated or GC-heap values: the `local_` annotation places obligations only on the @@ -77,12 +84,14 @@ parameters are a useful new tool for structuring APIs. For instance, consider a function that accepts a callback, to which it passes some mutable value: - let uses_callback ~f = - let tbl = Foo.Table.create () in - fill_table tbl; - let result = f tbl in - add_table_to_global_registry tbl; - result +```ocaml +let uses_callback ~f = + let tbl = Foo.Table.create () in + fill_table tbl; + let result = f tbl in + add_table_to_global_registry tbl; + result +``` Part of the contract of `uses_callback` is that it expects `f` not to capture its argument: unexpected results could ensue if `f` stored a @@ -91,15 +100,15 @@ after it was added to the global registry. Using `local_` annotations allows this constraint to be made explicit and checked at compile time, by giving `uses_callback` the signature: - val uses_callback : f:(local_ int Foo.Table.t -> 'a) -> 'a - +```ocaml +val uses_callback : f:(local_ int Foo.Table.t -> 'a) -> 'a +``` ## Inference -The examples above use the local_ keyword to mark local -allocations. In fact, this is not necessary, and the compiler will -use local allocations by default where possible, as long as the -`-extension local` flag is enabled. +The examples above use the `local_` keyword to mark local +allocations. In fact, this is not necessary, and the compiler will use +local allocations by default where possible. The only effect of the keyword on e.g. a let binding is to change the behavior for escaping values: if the bound value looks like it escapes @@ -108,7 +117,7 @@ the compiler will allocate this value on the GC heap as usual, while with the keyword it will instead report an error. Inference can even determine whether parameters are local, which is -useful for helper functions. It's less useful for toplevel functions, +useful for helper functions. It's less useful for top-level functions, though, as whether their parameters are local is generally forced by their signature in the mli file, where no inference is performed. @@ -116,40 +125,37 @@ Inference does not work across files: if you want e.g. to pass a local argument to a function in another module, you'll need to explicitly mark the local parameter in the other module's mli. - - - ## More control There are a number of other features that allow more precise control over which values are locally allocated, including: - - **Local closures**: - - ``` + - **Local closures** + + ```ocaml let local_ f a b c = ... ``` - + defines a function `f` whose closure is itself locally allocated. - + - **Local-returning functions** - - ``` - let f a b c = local_ + + ```ocaml + let f a = exclave_ ... ``` - + defines a function `f` which returns local allocations into its caller's region. - + - **Global fields** - - ``` + + ```ocaml type 'a t = { global_ g : 'a } ``` - + defines a record type `t` whose `g` field is always known to be on - the GC heap (and may therfore freely escape regions), even though + the GC heap (and may therefore freely escape regions), even though the record itself may be locally allocated. -For more details, read [the reference](./local-reference.md). +For more details, read [the reference](./reference.md). diff --git a/jane/doc/local-pitfalls.md b/jane/doc/extensions/local/pitfalls.md similarity index 66% rename from jane/doc/local-pitfalls.md rename to jane/doc/extensions/local/pitfalls.md index b51bbc1f989..d833556d810 100644 --- a/jane/doc/local-pitfalls.md +++ b/jane/doc/extensions/local/pitfalls.md @@ -1,11 +1,12 @@ -# Some Pitfalls of Local Allocations +# Some Pitfalls of Local Allocations This document outlines some common pitfalls that may come up when -trying out local allocations in a new codebase, as well as some +trying out local allocations in a new code base, as well as some suggested workarounds. Over time, this list may grow (as experience discovers new things that go wrong) or shrink (as we deploy new compiler versions that ameliorate some issues). +If you want an introduction to local allocations, see the [introduction](intro.md). ## Tail calls @@ -13,31 +14,44 @@ Many OCaml functions just happen to end in a tail call, even those that are not intentionally tail-recursive. To preserve the constant-space property of tail calls, the compiler applies special rules around local allocations in tail calls (see [the -reference](./local-reference.md)). +reference](./reference.md)). If this causes a problem for calls that just happen to be in tail position, the easiest workaround is to prevent them from being treated as tail calls by moving them, replacing: - func arg1 arg2 +```ocaml +func arg1 arg2 +``` with - let res = func arg1 arg2 in res +```ocaml +let res = func arg1 arg2 in res +``` -With this version, local values used in `fun arg1 arg2` will be freed +or by annotating them with `[@nontail]`: + +```ocaml +func arg1 arg2 [@nontail] +``` + +With this version, local values used in `func arg1 arg2` will be freed after `func` returns. ## Partial applications with local parameters To enable the use of local allocations with higher-order functions, a necessary step is to add local annotations to function types, -particularly those of higher-order functions. For instance, an `iter` -function may become: +particularly those of higher-order functions. For instance, an +unlabeled `iter` function may become: - val iter : 'a list -> f:local_ ('a -> unit) -> unit +```ocaml +val iter : local_ ('a -> unit) -> 'a t -> unit +``` -thus allowing locally-allocated closures `f` to be used. +thus allowing locally-allocated closures to be used as the first +parameter. However, this is unfortunately not an entirely backwards-compatible change. The problem is that partial applications of `iter` functions @@ -45,12 +59,28 @@ with the new type are themselves locally allocated, because they close over the possibly-local `f`. This means in particular that partial applications will no longer be accepted as module-level definitions: - let print_each_foo = iter ~f:(print_foo) +```ocaml +let print_each_foo = iter print_foo +``` The fix in these cases is to expand the partial application to a full application by introducing extra arguments: - let print_each_foo x = iter ~f:(print_foo) x +```ocaml +let print_each_foo x = iter print_foo x +``` + +Note that this pitfall does not apply to the final parameter of a +function. So a labeled `iter` function with a type like: +```ocaml +val iter : 'a t -> f:local_ ('a -> unit) -> unit +``` +can be partially-applied without issue: +```ocaml +let print_each_foo = iter ~f:print_foo +``` +This is another reason to prefer putting `~f` parameters as the final +parameter of functions. ## Typing of (@@) and (|>) diff --git a/jane/doc/local-reference.md b/jane/doc/extensions/local/reference.md similarity index 63% rename from jane/doc/local-reference.md rename to jane/doc/extensions/local/reference.md index 37ef1952032..3d568ffc06a 100644 --- a/jane/doc/local-reference.md +++ b/jane/doc/extensions/local/reference.md @@ -2,15 +2,16 @@ The goal of this document is to be a reasonably complete reference to local allocations in OCaml. For a gentler introduction, see [the -introduction](local-intro.md). +introduction](intro.md). -When local allocations are enabled with the `-extension local` flag, the -compiler may locally allocate some values, placing them on a stack rather than -the garbage collected heap. Instead of waiting for the next GC, the memory used -by locally allocated values is reclaimed when their _region_ (see below) ends, and -can be immediately reused. Whether the compiler locally allocates certain values -is controlled using a new keyword currently spelled `local_`, whose effects in -expressions, patterns and types are explained below. +The local allocations language extension allows the compiler to +locally allocate some values, placing them on a stack rather than the +garbage collected heap. Instead of waiting for the next GC, the memory +used by locally allocated values is reclaimed when their _region_ (see +below) ends, and can be immediately reused. Whether the compiler +locally allocates certain values is controlled using a new keyword +currently spelled `local_`, whose effects in expressions, patterns and +types are explained below. ## Local expressions and allocation @@ -18,16 +19,20 @@ expressions, patterns and types are explained below. The `local_` keyword may be placed on an expression to indicate that allocations in that expression should be locally allocated: - let abc = local_ [a; b; c] in - ... +```ocaml +let abc = local_ [a; b; c] in +... +``` Here, the three cons cells of the list `[a; b; c]` will all be locally allocated. Equivalently, the keyword `local_` may precede the pattern in a `let`: - let local_ abc = [a; b; c] in - ... +```ocaml +let local_ abc = [a; b; c] in +... +``` Locally allocated values may reference global (that is, GC-allocated or constant) values, but global values may not reference local ones. In the @@ -38,8 +43,10 @@ It is valid for an expression annotated `local_` to still yield a global value. For instance, if there is a global `x : int list` in scope, then this is allowed: - let l = local_ if n > 0 then n :: x else x in - ... +```ocaml +let l = local_ if n > 0 then n :: x else x in +... +``` Here, if `n > 0`, then `l` will be a locally-allocated cons cell. However, if `n <= 0`, then `l` will be `x`, which is global. In other words, the `local_` @@ -54,24 +61,25 @@ including: - Modules (including first-class modules) - Exceptions - (Technically, values of type `exn` can be locally allocated, but only global ones may be raised) + (Technically, values of type `exn` can be locally allocated, but only global + ones may be raised) - Classes and objects In addition, any value that is to be put into a mutable field (for example inside a `ref`, an `array` or a mutable record) cannot be locally allocated. - +Should you need to put a locally allocated value into one of these places, +you may want to check out [`ppx_globalize`](https://github.com/janestreet/ppx_globalize). ## Inference In fact, the allocations of the examples above will be locally -allocated even without the `local_` keyword, if it is safe to do so -(and the `-extension local` flag is enabled). The presence of the -keyword on an expression only affects what happens if the value -escapes (e.g. is stored into a global hashtable) and therefore cannot -be locally allocated. With the keyword, an error will be reported, -while without the keyword the allocations will occur on the GC heap as -usual. +allocated even without the `local_` keyword, if it is safe to do +so. The presence of the keyword on an expression only affects what +happens if the value escapes (e.g. is stored into a global hash table) +and therefore cannot be locally allocated. With the keyword, an error +will be reported, while without the keyword the allocations will occur +on the GC heap as usual. Inference does not cross file boundaries. If local annotations subject to inference appear in the type of a module (e.g. since they can appear in @@ -97,10 +105,11 @@ let f2 x = f1 ~foo:(Some x) (* [Some x] is stack allocated *) in the flambda-backend Git repo. The ensuing paragraph is related to that note; we can remove this comment when the note is resolved. --> -However, a missing mli *does* affect inference within the ml. As a conservative rule of thumb, -function arguments in an mli-less file will be heap-allocated unless the function parameter or argument -is annotated with `local_`. This is due to an implementation detail of the type-checker and -is not fundamental, but for now, it's yet another reason to prefer writing mlis. +However, a missing mli *does* affect inference within the ml. As a conservative +rule of thumb, function arguments in an mli-less file will be heap-allocated +unless the function parameter or argument is annotated with `local_`. This is +due to an implementation detail of the type-checker and is not fundamental, but +for now, it's yet another reason to prefer writing mlis. ```ocaml (* in a.ml; a.mli is missing *) @@ -118,40 +127,42 @@ Regions may nest, for instance when one function calls another. Local allocations always occur in the innermost (most recent) region. We say that a value _escapes_ a region if it is still referenced beyond the end -of that region. The job of the typechecker is to ensure that locally allocated +of that region. The job of the type-checker is to ensure that locally allocated values do not escape the region they were allocated in. "Region" is a wider concept than "scope", and locally-allocated variables can outlive their scope. For example: - let f () = - let local_ counter = - let local_ r = ref 42 in - incr r; - r - in - ... +```ocaml +let f () = + let local_ counter = + let local_ r = ref 42 in + incr r; + r + in + ... +``` The locally-allocated reference `r` is allocated inside the definition of `counter`. This value outlives the scope of `r` (it is bound to the variable `counter` and may later be used in the code marked `...`). However, the -typechecker ensures that it does not outlive the region in which it is +type-checker ensures that it does not outlive the region in which it is allocated, which is the entire body of `f`. As well as function bodies, a region is also placed around: - Loop bodies (`while` and `for`) - Lazy expressions (`lazy ...`) - - Module bindings (`let x = ...` at module level, including in submodules) + - Module bindings (`let x = ...` at module level, including in sub-modules) Module bindings are wrapped in regions to enforce the rule (as mentioned above) that modules never contain locally-allocated values. -Additionally, it is possible to write functions that do *not* have -a region around their body, which is useful to write functions that -return locally-allocated values. See "Local-returning functions" below. +Additionally, it is possible to write functions that do *not* have a region +around their body, which is useful to write functions that return +locally-allocated values. See "Use exclave_ to return a local value" below. -### Runtime behaviour +### Runtime behavior At runtime, local allocations do not allocate on the C stack, but on a separately-allocated stack that follows the same layout as the OCaml @@ -162,7 +173,6 @@ The beginning of a region records the stack pointer of this local stack, and the end of the region resets the stack pointer to this value. - ### Variables and regions To spot escaping local allocations, the type checker internally tracks whether @@ -175,25 +185,27 @@ each variable is: from crossing region boundaries. As described above, whether a given variable is global or local is inferred by -the typechecker, although the `local_` keyword may be used to specify it. +the type-checker, although the `local_` keyword may be used to specify it. Additionally, local variables are further subdivided into two cases: - - **Outer-region local**: may be a locally-allocated value, but only from an outer - region and not from the current one. + - **Outer-region local**: may be a locally-allocated value, but only from an + outer region and not from the current one. - **Any-region local**: may be a locally-allocated value, even one allocated during the current region. For instance: - let f () = - let local_ outer = ref 42 in - let g () = - let local_ inner = ref 42 in - ?? - in - ... +```ocaml +let f () = + let local_ outer = ref 42 in + let g () = + let local_ inner = ref 42 in + ?? + in + ... +``` At the point marked `??` inside `g`, both `outer` and `inner` are locally-allocated values. However, only `inner` is any-region local, having been @@ -238,21 +250,25 @@ value. A function with a local argument can be defined by annotating the argument as `local_`: - let f (local_ x) = ... +```ocaml +let f (local_ x) = ... +``` Inside the definition of `f`, the argument `x` is outer-region local: that is, while it may be locally allocated, it is known not to have been allocated during `f` itself, and thus may safely be returned from `f`. For example: - # let f1 (local_ x : int list) = [1; 2; 3] - val f1 : local_ int list -> int list +```ocaml +# let f1 (local_ x : int list) = [1; 2; 3] +val f1 : local_ int list -> int list - # let f2 (local_ x : int list) = x - val f2 : local_ int list -> local_ int list +# let f2 (local_ x : int list) = x +val f2 : local_ int list -> local_ int list - # let f3 (local_ x : int list) = (42 :: x) - ^ - Error: This value escapes its region +# let f3 (local_ x : int list) = (42 :: x) + ^ +Error: This value escapes its region +``` In the above, `f1` returns a global `int list`, while `f2` returns a local one. `f2` is allowed to return the local value `x` despite the ending of the @@ -264,10 +280,9 @@ it refers to a local value `x`), and it is locally allocated from within the region of `f3`. When this region ends, the any-region local value `42 :: x` is not allowed to escape it. -It is possible to write functions like `f3` that return -locally-allocated values, but this requires explicit annotation, as it -would otherwise be easy to do by mistake. See "Local-returning -functions" below. +It is possible to write functions like `f3` that return locally-allocated +values, but this requires explicit annotation, as it would otherwise be easy to +do by mistake. See "Use exclave_ to return a local value" below. Like local variables, inference can determine whether function arguments are local. However, note that for arguments of exported functions to be local, the @@ -284,13 +299,15 @@ allocated. Consider again the example from "Variables and regions" above: - let f () = - let local_ outer = ref 42 in - let g () = - let local_ inner = ref 42 in - outer - in - ... +```ocaml +let f () = + let local_ outer = ref 42 in + let g () = + let local_ inner = ref 42 in + outer + in + ... +``` Here, since `g` refers to the local value `outer`, the closure `g` must itself be locally allocated. (As always, this is deduced by inference, and an explicit @@ -305,20 +322,26 @@ Higher-order functions should usually mark their function arguments as `local_`, to allow local closures to be passed in. For instance, consider the following function for computing the length of a list: - let length xs = - let local_ count = ref 0 in - List.iter xs ~f:(fun () -> incr count); - !count +```ocaml +let length xs = + let local_ count = ref 0 in + List.iter xs ~f:(fun () -> incr count); + !count +``` With the standard type of `List.iter`, this results in a type error: - List.iter xs ~f:(fun () -> incr count); - ^^^^^ - Error: The value count is local, so cannot be used inside a closure that might escape +```ocaml + List.iter xs ~f:(fun () -> incr count); + ^^^^^ +Error: The value count is local, so cannot be used inside a closure that might escape +``` The standard type of `List.iter` is as follows: - val iter : 'a list -> f:('a -> unit) -> unit +```ocaml +val iter : 'a list -> f:('a -> unit) -> unit +``` This type places no restrictions on the use of `f`, allowing `iter` to capture or otherwise leak its argument `f`. It is therefore not safe to pass a local @@ -326,7 +349,9 @@ closure to such a function, hence the error. Instead, `List.iter` and similar functions should be given the following type: - val iter : 'a list -> f:local_ ('a -> unit) -> unit +```ocaml +val iter : 'a list -> f:local_ ('a -> unit) -> unit +``` This type carries the additional promise that `iter` does not capture its `f` argument, allowing local closures to be passed. With this type, the above @@ -337,7 +362,9 @@ and there are no restrictions on what may be done with the list elements themselves. To specify that `f` may _not_ capture its argument, the type of iter would have to be: - val iter : 'a list -> f:local_ (local_ 'a -> unit) -> unit +```ocaml +val iter : 'a list -> f:local_ (local_ 'a -> unit) -> unit +``` The two occurrences of `local_` are independent: the first is a promise by `iter` not to capture `f`, while the second is a requirement by @@ -360,37 +387,56 @@ Therefore, when a function ends in a tail call, that function's region ends: - but before control is transferred to the callee. This early ending of the region introduces some restrictions, as values used in -tail calls then count as escaping the region. In particular, any-region local values -may not be passed to tail calls: +tail calls then count as escaping the region. In particular, any-region local +values may not be passed to tail calls: - let f1 () = - let local_ r = ref 42 in - some_func r - ^ - Error: This local value escapes its region - Hint: This argument cannot be local, because this is a tail call +```ocaml +let f1 () = + let local_ r = ref 42 in + some_func r + ^ +Error: This local value escapes its region + Hint: This argument cannot be local, because this is a tail call +``` and any-region local closures may not be tail-called: - let f2 () = - let local_ g () = 42 in - g () - ^ - Error: This local value escapes its region - Hint: This function cannot be local, because this is a tail call +```ocaml +let f2 () = + let local_ g () = 42 in + g () + ^ +Error: This local value escapes its region + Hint: This function cannot be local, because this is a tail call +``` In both cases, if tail recursion is not necessary, then the issue can be resolved by moving the call so that it is not syntactically a tail call: - let f1 () = - let local_ r = ref 42 in - let res = some_func r in - res +```ocaml +let f1 () = + let local_ r = ref 42 in + let res = some_func r in + res + +let f2 () = + let local_ g () = 42 in + let res = g () in + res +``` + +or by annotating the call with the `[@nontail]` attribute, that +prevents it from being a tail call: + +```ocaml +let f1 () = + let local_ r = ref 42 in + some_func r [@nontail] - let f2 () = - let local_ g () = 42 in - let res = g () in - res +let f2 () = + let local_ g () = 42 in + g () [@nontail] +``` This change means that the locally allocated values (`r` and `g`) will not be freed until after the call has returned. @@ -399,187 +445,182 @@ Note that values which are outer-region local rather than any-region local (that is, local values that were passed into this region from outside) may be used in tail calls, as the early closing of the region does not affect them: - let f3 (local_ x) = - some_func x +```ocaml +let f3 (local_ x) = + some_func x +``` Here, even though the region of `f3` ends before the call to `some_func`, the value `x` remains available. - - -## Local-returning functions +## Use `exclave_` to return a local value The region around the body of a function prevents local allocations inside that function from escaping. Occasionally, it is useful to write a function that -allows local allocations to escape, which can be done by explicitly marking -such functions. +allocates and returns a value in the caller's region. For instance, consider +this code that uses an `int ref` as a counter: -This is useful particularly for constructor functions of abstract types. For -instance, consider this code that uses an `int ref` as a counter: - - let f () = - let counter = ref 0 in - ... - let n = !counter in - incr counter; - ... +```ocaml +let f () = + let counter = ref 0 in + ... + let n = !counter in + incr counter; + ... +``` Here, inference will detect that `counter` does not escape and will allocate the reference locally. However, this changes if we try to abstract out `counter` to its own module: - module Counter = struct - type t = int ref - - let make () = - ref 0 - - let next c = - let x = !c in - incr c; - x - end - - let f () = - let counter = Counter.make () in - ... - let n = Counter.next counter in - ... +```ocaml +module Counter = struct + type t = int ref + + let make () = + ref 0 + + let next c = + let x = !c in + incr c; + x +end + +let f () = + let counter = Counter.make () in + ... + let n = Counter.next counter in + ... +``` In this code, the counter will *not* be allocated locally. The reason is the `Counter.make` function: the allocation of `ref 0` escapes the region of `Counter.make`, and the compiler will therefore not allow it to be locally -allocated. This remains the case no matter how many local_ annotations we write -inside `f`: the issue is the definition of `make`, not its uses. +allocated. This remains the case no matter how many `local_` annotations we +write inside `f`: the issue is the definition of `make`, not its uses. -To allow the counter to be locally allocated, we need to specify that -`Counter.make` may return local allocations. This can be done by wrapping the -entire body of `make` with the `local_` keyword: +To allow the counter to be locally allocated, we need to make `Counter.make` end +its region early so that it can allocate its return value in the caller's +region. This can be done with `exclave_`: - let make () = local_ - ref 0 - -The `local_` keyword around a function body like this specifies not only that -the allocation of the `ref` should be local, but more importantly that the -function `make` *should not have its own region*. +```ocaml +let make () = exclave_ + ref 0 +``` -Instead, local allocations during `make` are considered part of `f`s region, -and will only be cleaned up when that region ends. Local allocations are -allocated as always in the nearest enclosing region. However if the current -function is a local-returning function, then the nearest enclosing region will -be the caller's (or that of the caller's caller, etc., if the caller is also -local-returning). +The keyword `exclave_` terminates the current region and executes the subsequent +code in the outer region. Therefore, `ref 0` is executed in `f`'s region, which +allows its local allocation. The allocation will only be cleaned up when the +region of `f` ends. -## Exclave -In the previous section, we discussed that a function can return local values -without having its own region. Consequently, it operates within the caller's -region. This approach, however, has certain disadvantages. Consider the -following example: +## Delaying exclaves +In the previous section, the example function exits its own region immediately, +which allows allocating and returning in the caller's region. This approach, +however, has certain disadvantages. Consider the following example: -``` -let f (local_ x) = local_ +```ocaml +let f (local_ x) = exclave_ let local_ y = (complex computation on x) in - if y then local_ None - else local_ (Some x) + if y then None + else (Some x) ``` - The function `f` allocates memory within the caller's region to store intermediate and temporary data for the complex computation. This allocation remains in the region even after `f` returns and is released only when the program exits the caller's region. To allow temporary allocations to be released -upon the function's return, we can rewrite the example as follows: +upon the function's return, we delay `exclave_` as follows: - -``` +```ocaml let f (local_ x) = let local_ y = (complex computation on x) in - if y then [%exclave] (local_ None) - else [%exclave] (local_ (Some x)) + if y then exclave_ None + else exclave_ Some x ``` -The new primitive `[%exclave]` terminates the current region early and executes -the subsequent code in the outer region. In this example, the function `f` -retains its own region where the allocation for the complex computation occurs. -This region is terminated by `[%exclave]`, releasing all temporary allocations. -Both `local_ None` and `local_ (Some x)` are considered "local" relative to the -outer region and are allowed to escape. In summary, we have temporary -allocations on the stack that are promptly released and result allocations on -the stack that can escape. - +In this example, the function `f` has a region where the allocation for the +complex computation occurs. This region is terminated by `exclave_`, releasing +all temporary allocations. Both `None` and `Some x` are considered "local" +relative to the outer region and are allowed to be returned. In summary, the +temporary allocations in the `f`'s region are promptly released, and the result +allocation in the caller's region is returned. Here is another example in which the stack usage can be improved asymptotically -by applying `[%exclave]`: - - -``` -let rec maybe_length p l = local_ +by delaying `exclave_`: +```ocaml +let rec maybe_length p l = exclave_ match l with - | [] -> Ok { res = 0 } + | [] -> Some 0 | x :: xs -> - match p x with - | false -> None - | true -> - match count_result f xs with - | None as r -> r - | Some { res = count } -> - Some { res = count + 1 } + if p x then None + else begin + match maybe_length p xs with + | None -> None + | Some count -> + Some (count + 1) + end ``` +This function is intended to have the type: -The function is intended to have the type: - -``` +```ocaml val maybe_length : ('a -> bool) -> 'a list -> local_ int option ``` +It is designed not to allocate heap memory by using the stack for all `Some` +allocations. However, it will currently use O(N) stack space because all +allocations occur in the original caller's stack frame. To improve its space +usage, we delay the `exclave_` annotation until returning the result: +```ocaml +let rec maybe_length p l = + match l with + | [] -> Some 0 + | x :: xs -> + if p x then None + else begin + match maybe_length p xs with + | None -> None + | Some count -> + exclave_ Some (count + 1) + end +``` +Now the function uses O(1) stack space. -This function computes the length of the list. The predicate can return `false`, -in which case the result of the entire function would be `None`. It is designed -not to allocate heap memory, instead using the stack for all `Some` allocations. -However, it will currently use O(N) stack space because all allocations occur in -the original caller's stack frame. To improve its space usage, we remove the -`local_` annotation (so the function has its own region), and wrap `Some {res = -count + 1}` inside `[%exclave]` to release the region before the allocation. -After the revision, the function should use O(1) stack space. - - -`[%exclave]` terminates the current region, so local values from that region -cannot be used inside `[%exclave]`. For example, the following code produces an +`exclave_` terminates the current region, so local values from that region +cannot be used inside `exclave_`. For example, the following code produces an error because `x` would escape its region: - - -``` +```ocaml let local_ x = "hello" in - [%exclave] ( + exclave_ ( let local_ y = "world" in local_ (x ^ y) ) ``` -Similarly, `[%exclave]` can only appear at the tail position of a region since -one cannot re-enter a terminated region. The following code is an error for this +Similarly, `exclave_` can only appear at the tail position of a region since one +cannot re-enter a terminated region. The following code is an error for this reason: - - -``` +```ocaml let local_ x = "hello" in - [%exclave] ( + exclave_ ( let local_ y = "world" in () ); local_ (x ^ "world") ``` + ## Records and mutability -For any given variable, the typechecker checks only whether that variable is +For any given variable, the type-checker checks only whether that variable is local or global, and generally does not separately track parts of the variable. For instance, the following code yields an error, even though `x` and `y` are both global: - let f () = - let local_ packed = (x, y) in - let x', y' = packed in - x' +```ocaml +let f () = + let local_ packed = (x, y) in + let x', y' = packed in + x' +``` -Here, the `packed` values is treated as local, and the typechecker then +Here, the `packed` values is treated as local, and the type-checker then conservatively assumes that `x'` and `y'` may also be local (since they are extracted from `packed`), and so cannot safely be returned. @@ -587,15 +628,17 @@ Similarly, a variable `local_ x` of type `string list` means a local list of local strings, and none of these strings can be safely returned from a function like `f`. -This can be overriden for record types, by annotating some fields with +This can be overridden for record types, by annotating some fields with `global_`: - type ('a, 'b) t = { global_ foo : 'a; bar: 'b } +```ocaml +type ('a, 'b) t = { global_ foo : 'a; bar: 'b } - let f () = - let local_ packed = {foo=x; bar=y} in - let {foo; bar} = packed in - foo +let f () = + let local_ packed = {foo=x; bar=y} in + let {foo; bar} = packed in + foo +``` Here, the `foo` field of any value of type `_ t` is always known to be global, and so can be returned from a function. When constructing such a record, the @@ -605,21 +648,25 @@ itself local. In particular, by defining: - type 'a glob = { global_ contents: 'a } [@@unboxed] +```ocaml +type 'a t = { global_ global : 'a } [@@unboxed] +``` -then a variable `local_ x` of type `string glob list` is a local list -of global strings, and while the list itself cannot be returned out of -a region, the `contents` field of any of its elements can. +then a variable `local_ x` of type `string t list` is a local list of global +strings, and while the list itself cannot be returned out of a region, the +`global` field of any of its elements can. For convenience, `base` provides +this as the type `Modes.Global.t`. The same overriding can be used on constructor arguments. To imitate the example for record fields: +```ocaml +type ('a, 'b) t = Foo of global_ 'a * 'b - type ('a, 'b) t = Foo of global_ 'a * 'b - - let f () = - let local_ packed = Foo (x, y) in - match packed with - | Foo (foo, bar) -> foo +let f () = + let local_ packed = Foo (x, y) in + match packed with + | Foo (foo, bar) -> foo +``` ### Mutability @@ -637,8 +684,10 @@ value when the younger one's region ends. The function type constructor in OCaml is right-associative, so that these are equal types: - string -> string -> string - string -> (string -> string) +```ocaml +string -> string -> string +string -> (string -> string) +``` These both describe a two-argument function which is curried, and therefore may be partially applied to the first argument, yielding a closure that accepts the @@ -647,8 +696,10 @@ second. The situation is more complicated when `local_` is involved. The following two types are *not* equivalent: - local_ string -> string -> string - local_ string -> (string -> string) +```ocaml +local_ string -> string -> string +local_ string -> (string -> string) +``` The former is a two-argument function which accepts as its first argument a local string. Like all two-argument functions, it may be partially applied to @@ -657,9 +708,11 @@ this closure closes over the first local argument, it must necessarily be local itself. Thus, if applied to a single argument, this function in fact returns a _local_ closure, making its type equal to the following: - local_ string -> local_ (string -> string) +```ocaml +local_ string -> local_ (string -> string) +``` -By constrast, the type `local_ string -> (string -> string)` means a function +By contrast, the type `local_ string -> (string -> string)` means a function that accepts a local string but returns a global function. Necessarily, this global function cannot refer to the local string that was passed, so this cannot be an ordinary two-argument function. (It could be something like `fun @@ -667,21 +720,29 @@ s -> print s; fun x -> x`, however) In general, in a curried function type `... -> ... -> ...` (without parentheses), then after the first use of `local_`, all arrow types except the -last will implictly be given `local_` return types, enabling the expected -partial application behaviour. +last will implicitly be given `local_` return types, enabling the expected +partial application behavior. Finally, this transformation applies also to types marked with the `local_` keyword. For instance, the following type: - local_ (a -> b -> c -> d) -> e -> f -> g +```ocaml +local_ (a -> b -> c -> d) -> e -> f -> g +``` is read as: - local_ (a -> local_ (b -> local_ (c -> d))) -> local_ (e -> local_ (f -> g)) +```ocaml +local_ (a -> local_ (b -> local_ (c -> d))) -> local_ (e -> local_ (f -> g)) +``` Note the implicit `local_` both in the returned `e -> f` closure (as described -above), and also in the type of the `b -> c` argument. - +above), and also in the type of the `b -> c` argument. The propagation of +`local_` into the function argument is necessary to allow a locally-allocated +function (which would have type `a -> local_ (b -> local_ (c -> d))`) to be +passed as an argument. Functions are different than other types in that, because +of currying, a locally-allocated function has a different type than a +globally-allocated one. ### Currying of local closures @@ -690,19 +751,22 @@ a local value `counter` of type `int ref`. Then of the following two seemingly-identical definitions, the first is accepted and the second is rejected: +```ocaml +let local_ f : int -> int -> int = fun a b -> a + b + !counter in +... - let local_ f : int -> int -> int = fun a b -> a + b + !counter in - ... - - let f : int -> int -> int = local_ fun a b -> a + b + !counter in - ... +let f : int -> int -> int = local_ fun a b -> a + b + !counter in +... +``` Both define a closure which accepts two integers and returns an integer. The closure must be local, since it refers to the local value `counter`. In the former definition, the type of the function appears under the `local_` keyword, as as described above is interpreted as: - int -> local_ (int -> int) +```ocaml +int -> local_ (int -> int) +``` This is the correct type for this function: if we partially apply it to a single argument, the resulting closure will still be local, as it refers to @@ -710,29 +774,32 @@ the original function which refers to `counter`. By contrast, in the latter definition the type of the function is outside the `local_` keyword as is interpreted as normal as: - int -> (int -> int) +```ocaml +int -> (int -> int) +``` This is not the correct type for this function: it states that partially applying it to a single argument will yield a global closure, which is not the case here. For this reason, this version is rejected. It would be accepted if written as follows: - let f : int -> local_ (int -> int) = local_ fun a b -> a + b + !counter in - ... - +```ocaml +let f : int -> local_ (int -> int) = local_ fun a b -> a + b + !counter in +... +``` ## Special case typing of tuple matching -As mentioned above, the typechecker generally does not separately track +As mentioned above, the type-checker generally does not separately track the local or global status of parts of a value, but rather tracks this only once per variable or expression. There is one exception to this rule, as follows. In OCaml, it is possible to simultaneously match on multiple values: -``` - match x, y, z with - | p, q, r -> ... +```ocaml +match x, y, z with +| p, q, r -> ... ``` There is in fact no special syntax for this: as parentheses are @@ -743,23 +810,23 @@ r)`. Applying the usual rule that an expression is either treated as entirely local or entirely global would mean that `p`, `q` and `r` would all be local if any of `x`, `y` and `z` are. This is -counterintuitive, as the syntax above is usually thought of as a +counter-intuitive, as the syntax above is usually thought of as a multiple-value match, rather than a match on a single tuple value. For -this reason, the typechecker indendently tracks whether the parts of +this reason, the type-checker independently tracks whether the parts of this tuple are local or global. The same logic applies to simultaneous binding of multiple values: -``` - let a, b, c = - ... - x, y, z +```ocaml +let a, b, c = + ... + x, y, z ``` Again, there is no actual syntax for this in OCaml: that's a binding of the single value `(x, y, z)` against the single pattern `(a, b, c)`. Since it's usually thought of as the simultaneous binding of -several variables, the typechecker treats it as such rather than +several variables, the type-checker treats it as such rather than making all of `a`,`b` and `c` local if any of `x`, `y` and `z` are. @@ -773,4 +840,24 @@ local and global allocations, which is why `ref` worked for both local and global in various examples above. In the interface for the stdlib (and as re-exported by Base), this feature is -enabled by use of the `[@local_opt]` annotation on `external` declarations. +enabled by use of the `[@local_opt]` annotation on `external` declarations. For +example, we have the following: + +```ocaml +external id : ('a[@local_opt]) -> ('a[@local_opt]) = "%identity" +``` + +This declaration means that `id` can have either of the following types: + +```ocaml +id : local_ 'a -> local_ a +id : 'a -> 'a +``` + +Notice that the two `[@local_opt]`s act in unison: either both `local_`s are +present or neither is. This allows for a limited form of mode-polymorphism for +`external`s (only). Nothing checks that the locality ascriptions are sound, +though, so use this feature with much caution. In the case of `id`, all is well, +but if the two `[@local_opt]`s did not act in unison (that is, they varied +independently), it would not be: `id : local_ 'a -> 'a` allows a local value to +escape. diff --git a/jane/doc/extensions/module-strengthening.md b/jane/doc/extensions/module-strengthening.md new file mode 100644 index 00000000000..2beb7586500 --- /dev/null +++ b/jane/doc/extensions/module-strengthening.md @@ -0,0 +1,24 @@ +# The `module strengthening` extension + +What is the type of module `M` in this tiny program? + +```ocaml +module type S = sig type t end + +module M : S +``` + +If you said `S` then you are only partially correct: we also need to keep track +of the fact that all type declarations inside it (just `t` in this example) come +from `M`. So the type that the compiler infers is actually stronger: + +```ocaml +sig type t = M.t end +``` + +We call this type "`S` strengthened with `M`". It can be written out explicitly +as above and this is, in fact, the only way to write it without `-extension +module_strengthening`. The new extension allows this type to be written as `S +with M`. + +The main motivation for this work are compiler performance improvements. \ No newline at end of file diff --git a/jane/doc/polymorphic-parameters.md b/jane/doc/extensions/polymorphic-parameters/reference.md similarity index 99% rename from jane/doc/polymorphic-parameters.md rename to jane/doc/extensions/polymorphic-parameters/reference.md index e9f3d76156c..7e4596ffa51 100644 --- a/jane/doc/polymorphic-parameters.md +++ b/jane/doc/extensions/polymorphic-parameters/reference.md @@ -1,4 +1,4 @@ -## Polymorphic parameters +# Polymorphic parameters The *polymorphic parameters* extension allows you to have function parameters with polymorphic types. For example, a function could @@ -132,4 +132,4 @@ polymorphic parameters. Given a type like: type 'a t = int ``` the type `('a. 'a t) -> string` is completely equivalent to `int -> -string`. +string`. \ No newline at end of file diff --git a/jane/doc/extensions/unboxed-types/index.md b/jane/doc/extensions/unboxed-types/index.md new file mode 100644 index 00000000000..cb5a72e66de --- /dev/null +++ b/jane/doc/extensions/unboxed-types/index.md @@ -0,0 +1,500 @@ +# Unboxed types (implemented) + +[unboxed types proposal]: ../../proposals/unboxed-types/index.md +[kind annotation]: ../../proposals/unboxed-types/syntax.md#kind-annotations + +This page documents the fragment of the [unboxed types +proposal][] that is implemented. Watch this page +for updates on what's available. + +This page is intended to be a brief overview; the details are in the [unboxed types +proposal][]. + +**Warning:** This is all early days for unboxed types. Expect plenty of papercuts. That +said, we have confidence that these features are safe to use. Annoying, but safe. + +# Layouts + +Every type is now classified by a *layout*, much like how every expression is classified +by a *type*. There is a small fixed set of layouts: + +* `value` is the layout occupied by almost every OCaml type. Every type you have ever + conceived of before reading this description is a `value`. +* `immediate` is a sublayout of `value`, describing those values that are represented + without a pointer. That is, `int : immediate`, as well as `private` and `[@@unboxed]` + wrappers around `int`. `immediate` is a sublayout of `value`, and so you can use an + `immediate` type wherever a `value` is expected, without any explicit conversion + necessary. Types declared with `[@@immediate]` have layout `immediate`. +* `immediate64` is a variant of `immediate` that is like `immediate` on 64-bit platforms + and like `value` on all other platforms (like JavaScript). In the sublayout relation, + `immediate < immediate64 < value`. Types declared with `[@@immediate64]` have layout + `immediate64`. +* `float64` is the layout of the `float#` unboxed float type. +* `bits32` is the layout of the `int32#` unboxed int32 type. +* `bits64` is the layout of the `int64#` unboxed int64 type. +* `word` is the layout of the `nativeint#` unboxed nativeint type. +* `any` is a layout that is the superlayout of all other layouts. It doesn't correspond + to a specific runtime representation. More information [below](#the-any-layout). + +* `value_or_null` is a superlayout of `value` including normal OCaml values + and null pointers. Unless `-extension-universe alpha` is set, it is displayed + as `value` and can't be used in jkind annotations. +* `any_non_null` is a sublayout of `any` forbidding null pointers. Unless + `-extension-universe alpha` is set, it is displayed as `any`. + Additionally, `any` jkind annotations are interpreted as `any_non_null` for + backwards compatibility for definitions using arrays. + +Over time, we'll be adding more layouts here. + +# Layout annotation + +You can annotate type variables of type declarations with a layout, like this: + +```ocaml +type ('a : immediate) t1 +type ('a : float64) t2 +type ('a : immediate, 'b : bits32) t3 +``` + +If you do not annotate a type variable, we use layout inference to figure out the layout, +though we know layout inference is incomplete in certain complicated scenarios with +mutually recursive type definitions. If layout inference does not work, you will get an +error asking you to write a layout annotation; we will never infer an incorrect layout. If +layout inference does not fix the layout of a type variable, it is defaulted to have +layout `value`. + +You can also mark types as non-`value`s using the following syntax: + +```ocaml +type t4 : float64 +type t5 : value (* redundant, but you can do it if you like *) +type t6 : bits64 = int64# (* redundant since the layout can be deduced from the rhs *) +``` + +A type declared with no `=` signs (often in a signature) and +no layout information defaults to layout `value`. Types with `=` signs deduce their layout +from their right-hand sides. + +Annotations can also be used within type expressions: + +```ocaml +module type S = sig + (* An annotation at binding sites sets the layout of the universal variable. + Unannotated variables have layout `value`. *) + val f1 : ('a : float64) ('b : immediate) 'c. 'a -> 'b -> 'c + + (* As shown here, annotation can't be placed directly on arbitrary types. + [(int : immediate)] would be invalid syntax. The same can be achieved with + [(int as (_ : immediate))]. *) + val f2 : (int as ('a : immediate)) -> ('a : value) -> 'a +end + +(* Note that annotations are always treated as upper bounds. + The following is valid: *) +type ('a : immediate) t +type ('a : value) t2 = 'a t +(* ^ This will get typed as [type ('a : immediate) t2 = 'a t] *) + +(* Here are a few more places where you can write annotations *) +let f3 (type a : immediate): a -> a = fun x -> x +let f4 (type (a : immediate) (b : float64) c) (x : a) (y: b) (z: c) = x +let f5 x = (x : (_ : immediate)) +let f6: type (a: bits32). a -> a = fun x -> x +``` + +Reference [the relevant section of the design proposal][kind annotation] for the full syntax. +The complete annotation design is not yet implemented and the syntax should be read +with `kind ::= layout-name` for now. It also provides reasoning around some design +decisions and contains additional examples. + +# Unboxed numbers + +We now have `float#`, `int32#`, `int64#`, and `nativeint#` types. +They are the types for unboxed numbers. These all are stored +without pointers; working with them does not cause any allocation. +Each unboxed numeric type has its own layout: `float# : float64`, `int32# : bits32`, +`int64# : bits64`, and `nativeint# : word`. + +Using layouts, you can usefully make a synonym of `float#` (or any of +the other unboxed types) that has layout +`float64`, for example with `module M : sig type t : float64 ... end = struct type t = +float# ... end`. + +Each numeric type has its own library for working with it: `float_u`, +`int32_u`, `int64_u`, and `nativeint_u`. (Outside of Jane Street, these will be +modules in the `janestreet_shims` library.) + +* Unboxed constants are written with a prepended `#`. + Examples include: + + * `#3.14 (* : float# *)` + * `-#0.5 (* : float# *)` + * `#1e9 (* : float# *)` + * `#123l (* : int32# *)` + * `-#456L (* : int64# *)` + * `#789n (* : nativeint# *)` + +* Unboxed numbers can be stored in local variables, passed to functions, returned from + functions, and have limited support in records (details below). + +* Unboxed numbers may *not* appear... + * ... top-level in a module (e.g. you cannot have `val pi : float#`) + * ... in a tuple (e.g. you cannot have `int32# * int32#`) + * ... as a field of a constructor (e.g. you cannot have `| K of int64#` or `| K of { + x : nativeint# }`) + * ... as a field of a polymorphic variant constructor (e.g. you cannot have ``[ `K of + float# ]``) + * ... anywhere near the class system (no `int64#` methods or class variables or even + parameters in constructors) + +* You can make records containing all `float#`s. (This applies only to `float#`s, not + other unboxed numbers.) Every field must be a `float#` (or + actually have layout `float64`). No exceptions. This does *not* work for inline or + `[@@unboxed]` records. + +* With a few specific exceptions (documented below), existing types all expect + `value` arguments. Thus for basically any `t`, you cannot write `float# t` or + `int64# t`. This includes obvious candidates like `float# + option`. + +* Existing ppxs expect to work with `value` types. Accordingly, using `deriving` with + types that involve unboxed numbers will lead to inscrutable type errors, and other ppxs + (such as e.g. `match%optional`) will fall over when given unboxed numbers. These + failures will lead to hard-to-understand errors from the compiler, never unsafe code. + +# The `any` layout + +If all we know about a type is that its layout is +`any`, we cannot execute code using that type. + +For example, it's fine to write this function type: + +```ocaml +val f : ('a : any). 'a -> 'a (* valid as a type signature *) +``` +> (See the [previous section](#layout-annotation) to learn more about the layout annotation used here) + +But it's not possible to implement a function of that type: + +```ocaml +let f (type a : any) (x : a) = x (* rejected by the compiler *) +``` + +This is because the compiler doesn't know how to work with data of a type +(calling convention, etc.) without knowing its concrete layout: + +``` +Error: This pattern matches values of type a + but a pattern was expected which matches values of type + ('a : '_representable_layout_1) + The layout of a is any, because + of the annotation on the abstract type declaration for a. + But the layout of a must be representable, because + it's the type of a function argument. +``` + +The main use case for layout `any` in its current form is with module +types. For example: + +```ocaml +module type S = sig + type t : any + + val add : t -> t -> t + val one : unit -> t + val print : t -> unit +end + +module M1 : S with type t = float# = struct + type t = float# + + let add x y = Float_u.add x y + let one () = #1. + let print t = Printf.printf "%f" (Float_u.to_float t) +end + +module M2 : S with type t = int = struct + type t = int + + let add x y = x + y + let one () = 1 + let print t = Printf.printf "%d" t +end +``` + +Here by defining module type `S` with layout `any` and using `with` constraints, we can +reason about modules with similar shapes but that operate on different layouts. This removes code +duplication and can aid ppxs in supporting unboxed types. + + +# `[@layout_poly]` attribute + +The attribute enables support for **limited layout polymorphism on external +`%`-primitives**. This is possible because these primitives are always inlined at every +use site. We can thus specialize the function implementation based on the layout +information at each site. + +With a `[@layout_poly]` external declaration like this: + +```ocaml +external[@layout_poly] opaque_identity : ('a : any). 'a -> 'a = "%opaque" +``` + +It means that `opaque_identity` can operate on any concrete layout and have all of these +types: + +```ocaml +opaque_identity : ('a : float64). 'a -> 'a +opaque_identity : ('a : value). 'a -> 'a +opaque_identity : ('a : bits64). 'a -> 'a +... +``` + +The attribute changes the meaning of the layout annotation `(_ : any)` and turns `'a` into +a layout polymorphic type variable. + +As a consequence of the specialization happening at every use site, this limited layout +polymorphic behavior does not propagate: + +```ocaml +let f = opaque_identity +``` + +Here `f` can have one and only one of the types listed above: + +```ocaml +let _ = f #1. +(* or *) +let _ = f 100 +(* but NOT BOTH *) +``` + +The current implementation also restricts all layout polymorphic type variables to have +the same layout: + +```ocaml +external[@layout_poly] magic : ('a : any) ('b : any). 'a -> 'b = "%obj_magic" + +let f1 : int32# -> int32# = magic;; (* ok *) +let f2 : float# -> float# = magic;; (* ok *) +let f3 : float# -> int32# = magic;; (* error *) +``` + +This feature is conceptually similar to `[@local_opt]` for modes and is useful for +array access primitives. + +Here's the list of primitives that currently support `[@layout_poly]`: + +* `%identity` +* `%opaque` +* `%obj_magic` +* `%ignore` +* `%revapply` +* `%apply` +* `%array_safe_get` +* `%array_safe_set` +* `%array_unsafe_get` +* `%array_unsafe_set` +* `%array_size` + +# Arrays of unboxed elements + +Arrays can store elements of any layout. You can think of `array` as having been declared as: + +```ocaml +type ('a : any) array = (* ... *) +``` + +Array elements are packed according to their width. For example, arrays of +elements whose layout is `bits32` store two elements per word. + +You can use normal array syntax for constructing such an array: + +```ocaml +let array = [| #2l |] +``` + +Array primitives must be declared with `[@layout_poly]` to be usable with arrays of unboxed elements. + +```ocaml +module Array = struct + external[@layout_poly] get : ('a : any). 'a array -> int -> 'a = "%array_safe_get" +end + +let first_elem () = array.(0) +``` + +(The above relies on the fact that array projection syntax desugars to a call to whatever `Array.get` is in scope.) + +A limited set of primitives may be bound as `[@layout_poly]`; +[see the earlier section](#layout_poly-attribute) for more information. + +## Runtime representation + +| Array | Tag | Layout of data | +|----------------------------------|--------------------|-------------------------------------------------------------| +| `float# array` | `Double_array_tag` | 64 bits per element | +| `int64# array` | `Custom_tag` | reserved custom block word, followed by 64 bits per element | +| `float32# array`, `int32# array` | `Custom_tag` | reserved custom block word, followed by 32 bits per element | + +The above table is written about concrete types like `float#` and `int64#`, but +actually holds for all types of the relevant layout. + +The reserved custom block word is the standard custom block field that stores a +pointer to the record of custom operations, like polymorphic equality and +comparison. For unboxed 32-bit element types, like `int32#` and `float32#`, the +custom operations pointer is different for odd-length arrays and even-length +arrays. + +Odd-length arrays of 32-bit element type have 32 bits of padding at the end. +The contents of this padding is unspecified, and it is not guaranteed that +the padding value will be preserved by the generated code or the runtime. + +# Using unboxed types in structures + +Unboxed types can usually be put in structures, though there are some restrictions. + +These structures may contain unboxed types, but have some restrictions on field +orders: + + * Records + * Constructors + +Unboxed numbers can't be put in these structures: + + * Constructors with inline record fields + * Exceptions + * Extensible variant constructors + * Top-level fields of modules + * Tuples + +There aren't fundamental issues with the structures that lack support. They will +just take some work to implement. + +Here's an example of a record with an unboxed field. We call such a record +a "mixed record". + +```ocaml +type t = + { str : string; + i : int; + f : float#; + } +``` + +## Restrictions on field ordering + +The below is written about record fields but equally applies to constructor +arguments. + +Suppose a record contains any unboxed field `fld` whose layout is not `value`[^or-combination-of-values]. Then, the following restriction applies: All +fields occurring after `fld` in the record must be "flat", i.e. the GC can +skip looking at them. The only options for flat fields are immediates (i.e. things +represented as ints at runtime) and other unboxed numbers. + +[^or-combination-of-values]: Technically, there are some non-value layouts that don't hit this restriction, like unboxed products and unboxed sums consisting only of values. + +The following definition is rejected, as the boxed field `s : string` appears +after the unboxed float field `f`: + +```ocaml +type t_rejected = + { f : float#; + s : string; + } + (* Error: Expected all flat fields after non-value field, f, + but found boxed field, s. *) +``` + +The only relaxation of the above restriction is for records that consist +solely of `float` and `float#` fields. Any ordering of `float` and `float#` +fields is permitted. The "flat float record optimization" applies to any +such record—all of the fields are stored flat, even the `float` ones +that will require boxing upon projection. The ordering restriction is relaxed +in this case to provide a better migration story for all-`float` records +to which the flat float record optimization currently applies. + +```ocaml +type t_flat_float = + { x1 : float; + x2 : float#; + x3 : float; + } +``` + +The ordering restriction has to do with the "mixed block" runtime +representation. Read on for more detail about that. + +## Generic operations aren't supported + +Some operations built in to the OCaml runtime aren't supported for structures +containing unboxed types. + +These operations aren't supported: + + * polymorphic comparison and equality + * polymorphic hash + * marshaling + +These operations raise an exception at runtime, similar to how polymorphic +comparison raises when called on a function. + +You should use ppx-derived versions of these operations instead. + +## Runtime representation: mixed blocks + +As a general principle: The compiler should not change the user-specified +field ordering when deciding the runtime representation. + +Abiding by this principle allows you to write C bindings and +predict hardware cache performance. + +A structure containing unboxed types is represented at runtime as a "mixed +block". A mixed block always consists of fields the GC can-or-must scan followed by +fields the GC can-or-must skip[^can-or-must]. The garbage collector must be kept +informed of which fields of the block it should scan. A portion of the header +word is reserved to track the length of the prefix of the block that should be +scanned by the garbage collector. + +[^can-or-must]: "Can-or-must" is a bit of a mouthful, but it captures the right nuance. Pointer values *must* be scanned, unboxed number fields *must* be skipped, and immediate values *can* be scanned or skipped. + +The ordering constraint on structure fields is a reflection of the same +ordering restriction in the runtime representation. + +## C bindings for mixed blocks + +The implementation of field layout in a mixed block is not finalized. For example, we'd like for int32 fields to be packed efficiently (two to a word) on 64 bit platforms. Currently that's not the case: each one takes up a word. + +Users who write C bindings might want to be notified when we change this layout. To ensure that your code will need to be updated when the layout changes, use the `Assert_mixed_block_layout_v#` family of macros. For example, + +``` +Assert_mixed_block_layout_v1; +``` + +Write the above in statement context, i.e. either at the top-level of a file or +within a function. + +Here's a full example. Say you're writing C bindings against this OCaml type: + +```ocaml +(** foo.ml *) +type t = + { x : int32#; + y : int32#; + } +``` + +Here is the recommend way to access fields: + +```c +Assert_mixed_block_layout_v1; +#define Foo_t_x(foo) (*(int32_t*)&Field(foo, 0)) +#define Foo_t_y(foo) (*(int32_t*)&Field(foo, 1)) +``` + +We would bump the version number in either of these cases, which would prompt you to think about the code: + + * We change what word half the int32 is stored in + * We start packing int32s more efficiently diff --git a/jane/doc/implicit_source_code_positions/readme.md b/jane/doc/implicit_source_code_positions/readme.md new file mode 100644 index 00000000000..34000d26758 --- /dev/null +++ b/jane/doc/implicit_source_code_positions/readme.md @@ -0,0 +1,121 @@ +# Implicit Source Code Positions [%call_pos] - Who is calling my function? + +
+
+let f ~(here : [%call_pos]) () = ... +
+
+`[%call_pos]` is similar to `[%here]`. It allows a function to know the location of its +callers ___without___ the callers providing the location. +
+
+ +You may have seen functions with types like: + +```ocaml +val require_does_raise : Source_code_position.t -> (unit -> 'a) -> unit +``` + +that callers then provide the location with something like: + +```ocaml +require_does_raise [%here] (fun () -> ...) +``` + +With `[%call_pos]`, callers do not need to provide the location argument as the compiler +will automatically supply it for your callers. + +You can define a function with an implicit source code position argument by annotating +a labelled argument with `[%call_pos]`: + +```ocaml +let require_does_raise ~(here : [%call_pos]) (f : unit -> 'a) = ... + +(* Note that [%call_pos] appears in the signature - different from [Source_code_position.t] *) +val require_does_raise : here:[%call_pos] -> (unit -> 'a) -> unit +``` + +Your callers can then call your function without needing to provide `[%here]`: + +```ocaml +require_does_raise (fun () -> ...) +``` + +Alternatively, if (say) you are building a helper around `require_does_raise` for your tests, +but would like `require_does_raise` to get the position of the callers of your helper, you +can still send in in the location: + +```ocaml +let require_does_raise_helper ~(outer_call_pos : [%call_pos]) f = + require_does_raise ~here:outer_call_pos f +``` + +Type checking / how does this work? +----------------------------------- +You can think of `[%call_pos]` as an optional parameter. It is type checked and behaves in +a very similar way: + +- When an __optional__ argument is not applied, its "default" value / `None` is applied. + +- When an __implicit source code position__ (`[%call_pos]`) argument is not applied, its + "caller's location" is applied. + +This does mean that you need at least one "positional" (unlabelled) argument after your `[%call_pos]` +argument as otherwise you will get an unerasable argument warning - similar to optional +arguments. + +[%src_pos] +---------- +`[%src_pos]` is the same as ppx_here's `[%here]` except that it is implemented directly on +the compiler. + + \ No newline at end of file diff --git a/jane/doc/proposals/data-race-freedom.md b/jane/doc/proposals/modes/data-race-freedom.md similarity index 87% rename from jane/doc/proposals/data-race-freedom.md rename to jane/doc/proposals/modes/data-race-freedom.md index ba062e60adc..b208969eb19 100644 --- a/jane/doc/proposals/data-race-freedom.md +++ b/jane/doc/proposals/modes/data-race-freedom.md @@ -1,4 +1,4 @@ -# Data races are bad +# Data race freedom We would like to provide a programming model for shared-memory parallelism in OCaml that is less terrifying than the free-for-all you @@ -94,13 +94,13 @@ annotation. As a preview, we are going to describing 5 mode axes in this document, which have the following modes ordered by increasing strictness. -| Locality | Sync | Uniqueness | Linearity | Readonly | -| -------- | ------ | ---------- | ---------- | --------- | -| Local | Unsync | Shared | Once | Readonly | -| Global | Sync | Exclusive | Separate | Readwrite | -| | | Unique | Many | | +| Locality | Portability | Uniqueness | Linearity | Readonly | +| -------- | ------------- | ---------- | ---------- | --------- | +| Local | Nonportable | Aliased | Once | Readonly | +| Global | Portable | Exclusive | Separate | Readwrite | +| | | Unique | Many | | -The *locality* axis tracks which values can leave regions. The *sync* +The *locality* axis tracks which values can leave regions. The *portability* axis tracks which values are allowed to be shared with other threads. The *uniqueness* axis tracks which values have aliases. The *linearity* axis tracks functions that can only be run at most once. The @@ -230,59 +230,59 @@ don't expect there to be any fundamental difficulties. The root cause of potential data races in OCaml is mutability. In particular, `mutable` record fields and mutable arrays. To prevent data races we need to place restrictions on this mutable data. To do -this we add a new `sync` mode. A value is `sync` if **it can be passed +this we add a new `portable` mode. A value is `portable` if **it can be passed between threads without risking introducing data races**. Values that -are not `sync` are at mode `unsync`. An array or record with mutable -fields is always `unsync`. +are not `portable` are at mode `nonportable`. An array or record with mutable +fields is always `nonportable`. -Naturally `sync` can be relaxed into `unsync`: one can always forget +Naturally `portable` can be relaxed into `nonportable`: one can always forget that a value can be safely passed between threads. -A function is `sync` if it only closes over other `sync` values. This +A function is `portable` if it only closes over other `portable` values. This ensures that it can be safely sent to another thread. Note that a -`sync` function can still receive `unsync` values via parameters and -return them as results. For example, `Array.concat` is a `sync` +`portable` function can still receive `nonportable` values via parameters and +return them as results. For example, `Array.concat` is a `portable` function even though it manipulates mutable data: since it doesn't -close over `unsync` values it is safe for it to be called in two +close over `nonportable` values it is safe for it to be called in two threads simultaneously. -We use `sync` to ensure that two threads never share raw mutable +We use `portable` to ensure that two threads never share raw mutable state. When spawning a new thread, we require the thread body to be -`sync`, so that no `unsync` value is passed from the spawning thread +`portable`, so that no `nonportable` value is passed from the spawning thread to the spawned thread: ```ocaml val spawn : (unit -> 'a) -> 'a t - @ sync (. -> .) -> . + @ portable (. -> .) -> . val join : 'a t -> 'a @ . -> . ``` Similarly, any mechanism for communicating between threads, -e.g. channels, requires the transferred data to be `sync`: +e.g. channels, requires the transferred data to be `portable`: ```ocaml val send : 'a channel -> 'a -> unit - @ . -> sync -> . + @ . -> portable -> . val recv : 'a channel -> 'a - @ . -> sync + @ . -> portable ``` -Note that any deeply immutable type is of kind `always(sync)` allowing +Note that any deeply immutable type is of kind `always(portable)` allowing any value of such types to be passed between threads. -We allow a `sync` modality on record fields so that the fields will be -`sync` even if the record is `unsync`. We obviously cannot allow a -`unsync` modality, because a record with `unsync` fields cannot itself -be `sync`. +We allow a `portable` modality on record fields so that the fields will be +`portable` even if the record is `nonportable`. We obviously cannot allow a +`nonportable` modality, because a record with `nonportable` fields cannot itself +be `portable`. -The majority of toplevel functions will already be `sync` since people -try to avoid using global mutable state. Most others will become `sync` +The majority of toplevel functions will already be `portable` since people +try to avoid using global mutable state. Most others will become `portable` by the addition of e.g. locking to allow them to be called from multiple -threads. As such, it would be better in the long run to have `sync` be +threads. As such, it would be better in the long run to have `portable` be the default mode for things in modules and require people to specify -which functions are `unsync`. Since this would be a backward +which functions are `nonportable`. Since this would be a backward incompatible change, and only affects the meaning of the default syntax, we'll let the user choose the default via a command-line flag, with the aim being to make the new state the default and eventually deprecate the @@ -319,7 +319,7 @@ e == f is always `false` if the expression `e` returns a unique value. Note that in the expression `x == x`, `x` cannot be given the unique mode because it is used twice. Values which aren't `unique` are at mode -`shared`. +`aliased`. Only values at mode `unique` can be used with in-place record update. Consider the following example: @@ -339,7 +339,7 @@ Line 3, characters 3-4: 3 | r ^ ``` -There are two occurrences of `r`, so `r` will be a `shared` value at +There are two occurrences of `r`, so `r` will be a `aliased` value at these occurrences. As a result, `r` cannot be used with in-place record update. It would be unsafe in the sense that `r.x` is observed to be mutated while being an immutable field. @@ -405,12 +405,12 @@ Line 1, characters 21-22: |}] ``` -A `shared` modality can be applied to record fields, so that the field -will be `shared` regardless of the mode of the record. One particular -application is the following, where `'a shrd` would represent some -`shared` `'a` regardless of the mode of the `'a shrd`. +An `aliased` modality can be applied to record fields, so that the field +will be `aliased` regardless of the mode of the record. One particular +application is the following, where `'a aliased` would represent some +`aliased` `'a` regardless of the mode of the `'a aliased`. ```ocaml -type 'a shrd = {shared foo : 'a } [@@unboxed] +type 'a aliased = {aliased foo : 'a } [@@unboxed] ``` Note that a `unique` modality on record fields is not permitted as it @@ -418,11 +418,11 @@ breaches mode safety. The result of reading from such a field could not be unique because the value would still be aliased in the shared record from which it was read. -`unique` is more strict than `shared` as it restricts the number of +`unique` is more strict than `aliased` as it restricts the number of aliases. One can always forget this extra bit of information about a -value, and relax a value of `unique` into a value of `shared`. In the -following, `x` is `unique` but relaxed to `shared` which allows it to -be aliased twice (by the tuple); the resulting tuple is `shared` as +value, and relax a value of `unique` into a value of `aliased`. In the +following, `x` is `unique` but relaxed to `aliased` which allows it to +be aliased twice (by the tuple); the resulting tuple is `aliased` as well of course. ```ocaml let dup (unique x) = (x, x) @@ -430,7 +430,7 @@ let dup (unique x) = (x, x) # Borrowing -One might wish to use a `unique` value as `shared` for a short +One might wish to use a `unique` value as `aliased` for a short duration. For example, ```ocaml type point = { x : float; y : float } @@ -446,7 +446,7 @@ occurrence requires that it be unique. However, it is clear that by the time of the second occurrence `p` will in fact be unique again. To support such code we introduce *borrowing*. Borrowing allows -`unique` values to be `shared` for the duration of a region, and +`unique` values to be `aliased` for the duration of a region, and recovers them to `unique` afterwards. To borrow the variable `x` you use the syntax `&x`. So that `averagize` becomes: ```ocaml @@ -455,7 +455,7 @@ let averagize p = { overwrite p with x = avg; y = avg } ``` -The `&x` syntax creates an implicit region and treats `&x` as `shared` +The `&x` syntax creates an implicit region and treats `&x` as `aliased` and `local` for the duration of this region. The `local` mode prevents the value from escaping the region, which allows `x` to be considered `unique` again after the region has ended. @@ -486,10 +486,10 @@ let foo x y = unique y ``` -Since a borrowed value is `shared`, there may be multiple borrows +Since a borrowed value is `aliased`, there may be multiple borrows within the same (implicit) region. In the following example, `x` is borrowed twice in the same region, both of which would be used as -`shared` by `bar`. +`aliased` by `bar`. ```ocaml let foo x = let y = {bar &x &x} in @@ -558,7 +558,7 @@ x.a <- "hello" ``` but only if the value being mutated (`x`) is *exclusive*. Unlike ordinary `mutable` fields, records with `exclusively mutable` fields can -be `sync`. +be `portable`. The `exclusive` mode is closely related to the `unique` mode. They both restrict how values can be used to limit how they can be aliased. The @@ -925,7 +925,7 @@ let bad t = # Keys and locks Uniqueness and exclusivity provide forms of mutation that cannot race, -allowing the data that is mutated to be safely shared between +allowing the data that is mutated to be safely aliased between threads. However, they require the user to carefully manage aliases to all the mutated data and to convey that information to the type checker. This could quickly become cumbersome as one needs to @@ -958,7 +958,7 @@ The core of these APIs is the `Key.t` type: ```ocaml module Key : sig - type 'k t : void & always(sync) + type 'k t : void & always(portable) type packed = Key : 'k t -> packed [@@unboxed] @@ -974,11 +974,11 @@ means that each call to `create` returns a key for a fresh `k` type. A *key* is a form of capability. For a given `k`, there can be only one `k Key.t` at `exclusive` mode at any point in time. If there is a `k -Key.t` at `shared` mode then there are no `k Key.t`s at mode `exclusive` +Key.t` at `aliased` mode then there are no `k Key.t`s at mode `exclusive` simultaneously. `'k t` is of the `void` layout, which means it consumes no space and -contains no information at run-time. It is also `always(sync)` so can +contains no information at run-time. It is also `always(portable)` so can always be safely passed to another thread. ## Safe boxes @@ -992,16 +992,16 @@ The core of its API is as follows: ```ocaml module Safe_box : sig - type ('a, 'k) t : always(sync) + type ('a, 'k) t : always(portable) val create : 'a -> ('a, 'k) t - @ sync -> . + @ portable -> . val read : ('a, 'k) t -> 'k Key.t -> 'a - @ . -> local -> sync + @ . -> local -> portable val write : ('a, 'k) t -> 'k Key.t -> 'a -> unit - @ . -> local exclusive -> sync -> . + @ . -> local exclusive -> portable -> . end ``` @@ -1035,13 +1035,13 @@ values: ```ocaml module Unique_safebox : sig - type ('a, 'k) t : always(sync) + type ('a, 'k) t : always(portable) val create : 'a -> ('a, 'k) t - @ unique sync -> . + @ unique portable -> . val exchange : ('a, 'k) t -> 'k Key.t -> 'a -> 'a - @ . -> local exclusive -> unique sync -> unique sync + @ . -> local exclusive -> unique portable -> unique portable end ``` @@ -1054,19 +1054,19 @@ protects the safebox. ## Unique atomic OCaml comes with an atomic reference type `Atomic.t`. This type will -be considered `sync` since racing on an atomic reference is not +be considered `portable` since racing on an atomic reference is not considered a data-race. We can additionally add a `Unique_atomic.t` that holds unique values: ```ocaml module Unique_atomic : sig - type 'a t : always(sync) + type 'a t : always(portable) val make : 'a -> 'a t - @ sync unique -> . + @ portable unique -> . val exchange : 'a t -> 'a -> 'a - @ . -> sync unique -> sync unique + @ . -> portable unique -> portable unique end ``` @@ -1147,17 +1147,17 @@ val with_ : 'k t -> ('k Key.t -> 'a) -> 'a ``` # Capsules -The requirement that values shared between threads be `sync` essentially -forbids threads from sharing mutable (i.e. `unsync`) values. This improves +The requirement that values shared between threads be `portable` essentially +forbids threads from sharing mutable (i.e. `nonportable`) values. This improves safety at the cost of expressivity. To restore the expressivity of shared mutable values but in a safe manner, we introduce capsules. -A *capsule* is a container holding some, possibly `unsync`, data. Only -`sync` data is allowed to pass into or out of a capsule. This ensures -that any `unsync` data within the capsule is entirely isolated from the +A *capsule* is a container holding some, possibly `nonportable`, data. Only +`portable` data is allowed to pass into or out of a capsule. This ensures +that any `nonportable` data within the capsule is entirely isolated from the world outside the capsule. There is one capsule associated with each key, and access to the capsule is guarded by that key. This ensures that -any `unsync` data inside the capsule can only be accessed while holding +any `nonportable` data inside the capsule can only be accessed while holding that key . That means it is safe to pass capsules between threads without risking data-races. @@ -1166,16 +1166,16 @@ from the outside world. They have the following interface: ```ocaml module Capsule : sig - type (+'a, 'k) t : always(sync) + type (+'a, 'k) t : always(portable) val pure : 'a -> ('a, 'k) t - @ sync -> . + @ portable -> . val apply : 'k Key.t -> ('a -> 'b, 'k) t -> ('a, 'k) t -> ('b, 'k) t @ local exclusive -> . -> . -> . val extract : 'k Key.t -> ('a, 'k) t -> ('a -> 'b) -> 'b - @ local exclusive -> . -> local once sync (. -> sync) -> sync + @ local exclusive -> . -> local once portable (. -> portable) -> portable val destroy : 'k Key.t -> ('a, 'k) t -> 'a @ unique -> . -> . @@ -1183,7 +1183,7 @@ module Capsule : sig end ``` -`sync` data can move freely between capsules, so all `sync` data can be +`portable` data can move freely between capsules, so all `portable` data can be thought of as being in all capsules simultaneously. `pure` makes such data available as a `Capsule.t`. @@ -1191,10 +1191,10 @@ end pointing to a value within the same capsule and runs the function on that value returning a `Capsule.t` pointing to the result. -`extract` takes a `sync` function that returns a `sync` value, and a +`extract` takes a `portable` function that returns a `portable` value, and a `Capsule.t` pointing to some data, and runs the function on the data and -returns the result. Since the result must be `sync` it does not need to -be wrapped in a `Capsule.t`. This allows the user take `sync` data out +returns the result. Since the result must be `portable` it does not need to +be wrapped in a `Capsule.t`. This allows the user take `portable` data out of a capsule. `destroy` consumes a `key`, destroying the associated capsule. A @@ -1219,22 +1219,22 @@ let iter k f x = with signatures: ```ocaml val map : 'k Key.t -> ('a -> 'b) -> ('a, 'k) t -> ('b, 'k) t - @ local exclusive -> sync -> . -> . + @ local exclusive -> portable -> . -> . val inject : 'k Key.t -> ('a -> 'b) -> 'a -> ('b, 'k) t - @ local exclusive -> sync -> sync -> . + @ local exclusive -> portable -> portable -> . val iter : 'k Key.t -> ('a -> unit) -> ('a, 'k) t -> unit - @ local exclusive -> sync -> . -> . + @ local exclusive -> portable -> . -> . ``` As an example, below we encapsulate a mutable `Hashtbl.t`. The resulting -`'k Capsule_table.t` is `sync` so can be passed between threads. +`'k Capsule_table.t` is `portable` so can be passed between threads. ```ocaml module Capsule_table : sig - type 'k t : always(sync) + type 'k t : always(portable) val create : 'k Key.t -> 'k t @ local exclusive -> . @@ -1291,16 +1291,16 @@ end # Read-only capsule access -Capsules allow us to wrap mutable data and ensure that it is only +Capsules allow us to wrap nonportable mutable data and ensure that it is only accessed by one thread at a time. However, this is stricter than is necessary to avoid data races. Multiple threads can safely read from the -mutable state in a capsule as long as no thread can be simultaneously -writing to it. +nonportable mutable state in a capsule as long as no thread can be +simultaneously writing to it. -To support this kind of access we add another mode: `readonly`. A `readonly` -value can contain mutable state, but that state cannot be written to. A -value that is not `readonly` is at mode `readwrite`. `readwrite` is more -strict than `readonly`. +To support this kind of access we add another mode: `readonly`. A +`readonly` value can contain nonportable mutable state, but that state cannot +be written to. A value that is not `readonly` is at mode +`readwrite`. `readwrite` is more strict than `readonly`. There are two restrictions on `readonly` values: @@ -1323,19 +1323,19 @@ Error: Cannot mutate readonly value ``` There is a `readonly` modality that allows `readwrite` data to point to -`readonly` data. Since `sync` values contain no mutable data, the `sync` -modality on record fields also gives `readwrite` values even if the -record is `readonly`. Similarly, `always(sync)` implies +`readonly` data. Since `portable` values contain no nonportable mutable data, the +`portable` modality on record fields also gives `readwrite` values even if +the record is `readonly`. Similarly, `always(portable)` implies `always(readwrite)`. With this mode we can add the following additional operations to the `Capsule` API: ```ocaml val map_readonly : 'k Key.t -> ('a -> 'b) -> ('a, 'k) t -> ('b, 'k) t - @ local -> sync (readonly -> .) -> . -> . + @ local -> portable (readonly -> .) -> . -> . val read : 'k Key.t -> ('a, 'k) t -> ('a -> 'b) -> 'b - @ local -> . -> sync (readonly -> sync) -> sync + @ local -> . -> portable (readonly -> portable) -> portable val freeze : 'k Key.t -> ('a, 'k) t -> 'a @ . -> . -> readonly diff --git a/jane/doc/proposals/unboxed-types/abstract.md b/jane/doc/proposals/unboxed-types/abstract.md new file mode 100644 index 00000000000..f9c461559d6 --- /dev/null +++ b/jane/doc/proposals/unboxed-types/abstract.md @@ -0,0 +1,63 @@ +# Abstract layouts + +It may sometimes be convenient to declare *abstract layouts*. For example, +we might want to have a module signature capable of describing an interface +that works over many different layouts. Here might be an interface that +works to define arithmetic types: + +```ocaml +module type Arith = sig + layout y + type t : y + val (+) : t -> t -> t + val (*) : t -> t -> t +end +``` + +We can then define modules with this signature: + +```ocaml +module Uint64 : Arith with layout y <: bits64 = struct + layout y = bits64 + type t = #int64 + let ( + ) x y = ... + let ( * ) x y = ... +end + +module Ufloat : Arith with layout y <: float64 = struct + layout y = float64 + type t = #float + let ( + ) x y = ... + let ( * ) x y = ... +end +``` + +It is important to put the `with` constraint on the module signature. +Without this `with` constraint, it would not be possible to bind variables +of type `Uint64.t` or `Ufloat.t` because their layouts would remain +abstract and unrepresentable. + +## Details + +We add the following BNF productions: + +```ocaml +(* signature item *) +specification +::= `layout` layout-name [ `<:` layout ] + +(* structure item *) +definition +::= `layout` layout-name `=` layout + +(* with constraint *) +mod-constraint +::= `layout` layout-name `<:` layout + | `layout` layout-name `:=` layout +``` + +On the page on [kinds](kinds.md), we also see that we can write +kind abbreviations in both signatures and structures; these can +augment an abstract layout with mode-crossing information. + +## Open questions + +Is it worth allowing e.g. `layout lay = value` in signatures? I can't +think of a reason this would be helpful. \ No newline at end of file diff --git a/jane/doc/proposals/unboxed-types/extensions.md b/jane/doc/proposals/unboxed-types/extensions.md new file mode 100644 index 00000000000..cec00bed1fa --- /dev/null +++ b/jane/doc/proposals/unboxed-types/extensions.md @@ -0,0 +1,568 @@ +# Extensions for unboxed types + +This builds on the [main proposal for unboxed types](index.md), which should be +read first. + +# Extensions and other addenda + +## Alternative idea: `#` as an operator + +One alternative idea we considered was to make `#` a (partial) +operator on the type algebra, computing an unboxed version of +a type, given its declaration. This ran aground fairly quickly, +though. + +One problem is that OCaml doesn't have the ability to extract +a type argument from a composite type (like to get the `int` +from `int list`). So viewing `#` as the inverse of `box` doesn't +quite work. (Richard thought for a little bit that +`type 'a unlist = 'b constraint 'a = 'b list` did this unwrapping, +but it doesn't: it just requires that the argument to `unlist` be +statically a `list` type; this is not powerful enough for our needs, +because it would reject `'a. ... # 'a ...`, which would be part +of this more general operator's purview.) + +Another problem is that `#` would have to have an elaborate type: +it would need to be something like `# : Pi (t : value) -> t layout_of_unboxed_version_of`, +necessitating the definition of `layout_of_unboxed_version_of`. +This is a dependent type. Dependent types are cool and all, but +unboxed types seem like a poor motivation for them. + +## Extension: More `immediate`s + +Today, if the user writes + +```ocaml +type t = A | B | C | D +``` + +the type `t` will be inferred to be `immediate`, because it is an enumeration +and can comfortably fit within the untagged portion of a word. It will not +be an immediate if any of the constructors have fields, because such a variant +is sometimes a pointer. + +However, with the addition of unboxed types, we can imagine more variants than +just enumerations to be immediate. Here are some examples: + +```ocaml +type t1 = A | B | C (* this is immediate today *) +type t2 = D of #t1 | E of #t1 | F (* inlining t1 makes this an enumeration *) +type t3 = G of #int8 | H of #int16 (* this easily fits in a word *) +type t4 = I of #int16 | J of #int16 (* this also fits, reusing space *) +type t5 = { x : #int8; y : #int16 } (* still fits *) +``` + +Note that we're discussing whether the *boxed* versions of these types are +immediate, not the *unboxed* versions (which will *not* be). In thinking +about this, we want to make sure that any immediates fit within 31 bits. That's +because we want the type system to be the same on 32-bit and 64-bit processors. +However, we might imagine further that some types are `immediate64`s, giving +them more room. + +One challenge in moving in this direction is that recognizing some of these +as `immediate` bakes in some assumptions about how these are stored. For +example, take `t2` above. We could say that it has 7 constructors and thus +could be represented in bits 1-3 of a word. But this means that checking to +see whether a value is made with the `E` constructor requires a range check. +Instead, we might imagine using bits 1 and 2 to store the constructor choice, +and then bits 3 and 4 to store the payload of each constructor. This takes +more room, but might be faster for checking which constructor has been used. +In this case, all possibilities can fit into an `immediate`, but we can see +that it is possible to spill into the 32nd bit here. Marking types as +`immediate` means giving the programmer some perspective on our encoding +strategy, which is bad. + +So it's not clear what we should do here. We could say that enumerations +are `immediate` (as now), and that the choice of further immediates is +implementation-dependent, unspecified, and subject to change. This allows +the implementation to optimize the representation and handling of some of +these types. But there is a risk that a user relies on this optimization and +then is surprised if the compiler changes packing strategy and changes the +inferred layouts of some of their types. One way around this is a new +layout `weak_immediate <= immediate` that gets inferred for +implementation-dependent `immediate`s, and then we could issue a warning +whenever we have to check whether `weak_immediate <= immediate`. (On the other +hand, checking `weak_immediate <= value` is always fine.) But is this worth +yet another layout? It's not clear. + +## Extension: Restrictions around unexpected copy operations + +Today, OCaml users expect a line like `let x = y` to be quick, copying a word of +data and requiring ~1 instruction. However, if `y` is a wide unboxed record, +this assignment might take many individual copy operations and be unexpectedly +slow. The same problem exists when an unboxed record is passed as a function +argument. Perhaps worse, this kind of copy can happen invisibly, as part of +closure capture. Example: + +```ocaml +type t = { a : int; b : int; c : int; d : int; e : int } + +let f (t : #t) = + let g n = frob (n+1) t in + ... +``` + +Building the closure for `g` requires copying the five fields of `t`. + +We could imagine a restriction in the language stopping such copies from +happening, or requiring extra syntax to signal them. However, we hope that there +will not be too many wide unboxed records, and copying a few fields really isn't +so slow. So, on balance, we do not think this is necessary. + +## Extension: limited layout polymorphism. + +We can imagine an extension where +the layout of `(p, q) r` could in general depend on +the layouts of `p` and `q`. For instance: + +```ocaml +type ('a : value) id = 'a +``` + +Since `'a : value`, we know that `'a id` is always of layout `value`, +but if `'a = int` it may also have the more specific layout +`immediate`. + +For each type constructor `(_, _) r` in the environment, we store +along with it a layout `K` which is an upper bound for the layout of +any instance of `r`. (For `'a id` above, this is `value`). When +checking `(p, q) r : L`, we compare `L` and `K`. If `K` is a subtype +of `L`, then the check passes. However, if the check fails and `r` is +an alias, we must expand `r` and try again. We only report a +unification failure once the check fails on a type which is not an +alias. + +For example, suppose we have the unification variables `'a : value` +and `'b : immediate`, and we're trying to unify `'a id = 'b`. We need +to check `'a id : immediate`, but the environment tells us that the +layout of `_ id` is `value`. So, we expand `'a id` to `'a` and retry +unification, which succeeds after unifying `'a` and `'b` (the +resulting type variable has layout `immediate`). The effect here is +that after unifying `'a id` with `'b`, we leave `'a` as an +uninstantiated unification variable, but its layout is restricted to +`immediate`, to match `'b`. + +## Extension: more layout inference + +The current design describes that we require users to tell us the +layout of rigid variables but that we will infer the layout of +flexible variables. However, it is possible to do better, inferring +the layouts even of rigid variables. For example: + +```ocaml +let f1 : ('a : float). 'a -> 'a = fun x -> x +let f2 : 'a. 'a -> 'a = fun y -> f1 y (* 'a inferred to be a float *) + +module type T = sig + type ('a : float) t1 + type t2 + type t3 = t2 t1 (* this forces t2 : float *) +end +``` + +This can be done simply by using unification variables for the layouts +of even rigid type variables; if we don't learn anything interesting +about the layout within the top-level definition, we default to +`value`, as elsewhere. + +## Extension: more equalities for `box` + +It would be nice to add this rule to the `box` magic: + +* If `ty : value`, then `ty box = ty`. There is no reason to box something +already boxed. Note that this equality depends only on the *layout* of +`ty`, not the `ty` itself. For a given layout of the argument, `box` is +parametric: it treats two types of the same layout identically. + +This is hard, because at the time we see `ty box`, it might be the case +that we haven't yet figured out the layout for `ty`, meaning we'd have +to continue inference, perhaps figure out the layout, and then return +to `ty box` and perhaps simplify it to `ty`. This is possible (GHC +does it), but it would be breaking new ground for OCaml, and so should +be strongly motivated. So we hold off for now, noting that adding this +feature later will be backward compatible. + +## Extension: disabling magic for `box` + +The main proposal describes that a declaration like + +```ocaml +type t = { x : int; y : float } +``` + +would really be shorthand for + +```ocaml +type #t = #{ x : int; y : float } +type t = #t box +``` + +and that the expression e.g. `{ x = 5; y = 3.14 }` is shorthand +for `box #{ x = 5; y = 3.14 }`, along with similar shorthand for +record projection and variants. + +However, we could have a flag, say `-strict-boxes`, that removes +the auto-boxing and auto-unboxing magic. This would make record-construction +syntax like `{ x = 5; y = 3.14 }` an error, requiring a manual call +to `box` to package up an unboxed record. The advantage to this +is that programmers who want to be aware of allocations get more +compiler support. A downside (other than the verbosity) is that `-strict-boxes` +would still not prevent all allocation: any feature that doesn't go +via `box` might still allocate, including closures. + +## Extension: `immediate <= word` + +Semantically, `immediate <= word` makes good sense. To see why, +we start by observing we can collapse the `value_rep` and `word_rep` +representations: after all, both `value`s and `word`s take up the +same space in memory. (Their relationship to the garbage collector +is different, but we track that separately, not in the representation.) +We can +see this in the following table: + +``` + | representation | gc_friendly | gc_ignorable + ----------+----------------+-------------+------------- + immediate | word_rep | true | true + value | word_rep | true | false + word | word_rep | false | true +``` + +Just as `immediate <= value` works, `immediate <= word` works: +`immediate` is really the combination of `value` (with its +gc-friendliness) and `word` (with its gc-ignorableness). + +However, we hold off on adding `immediate <= word` to our type +system for now, because it adds complication without anyone +asking for it. + +Here are some complications introduced: + +* It is very convenient to reduce computing +`la ⊓ lb` to a constraint `rep(la) = rep(lb)`. In order to support `value ⊓ word += immediate`, we would thus drop the `value_rep` representation, setting +`rep(value) = word_rep`. + +* The `upper_bound` function we use in type inference then becomes impossible to +define: neither `value` nor `word` is an upper bound for the other, and so +`upper_bound(word_rep)` has no definition. We thus have to design a different +type inference algorithm than the one described above, likely tracking +representation, gc-friendliness, and gc-ignorability separately. This would not +be all that hard, but it's definitely more complicated than the algorithm +proposed here. + +* We sometimes might infer `immediate` even when no function +nearby has anything of layout `immediate`: + + ```ocaml + val f1 : ('a : value). 'a -> ... + val f2 : ('a : word). 'a -> ... + + let f3 x = (f1 x, f2 x) + ``` + + Here, we need to infer that the `x` in `f3` has layout + `immediate`, even though neither `f1` nor `f2` mentions + `immediate`. This might be unexpected by users. + +## Further discussion: mutability within unboxed records + +This proposal forbids mutability within an unboxed record (unless that +record is itself contained within a boxed record). This decision is made to +reduce the possibility of confusion and bugs, not because mutability within +unboxed records is unsound. Here, we consider some reasons that push against the +decision above and include some examples illustrating the challenges. + +Reasons we might want mutability within unboxed types: + +* The designer of a type may choose to have some fields be mutable while + other fields would not be. For example, our `#mut_point` type allows the + location of the point to change, while the identity of the point must + remain the same. + +* OCaml programmers expect to be able to update their mutable fields, and it + may cause confusion if a programmer cannot, say, update the `x` field of a + `#mut_point`. + +The reason we decided not to allow mutability within unboxed types is because of +examples like this: + +```ocaml +type mut_point = { mutable x : #int32; mutable y : #int32; identity : int } +let () = + let p : #mut_point = #{ x = #4l; y = #5l; identity = 0 } in + let foo () = print_uint32 p.x in + foo (); + p.x <- #10l; + foo () +``` + +Because the closure for `foo` captures that unboxed record `p` (by copying `p`), +this code prints 4 twice, rather confusingly. Yet the current design does not +fully rule such a confusion out, as we see here: + +```ocaml +type point = { x : int; y : int } +type t = { mutable pt : #point } + +let () = + let t : t = { pt = #{ x = 5; y = 6 } } in + let pt = t.pt in + let foo () = print_int pt.x in + foo (); + t.(.pt.x) <- 7; + foo () +``` + +This will print 5 twice, because the unboxed `t.pt` is copied into the local +variable `pt`. Yet the boxed version of this (with a `mutable x` and no hash +marks) prints 5 and then 7. This is a key motivation for putting the parentheses +in the `t.(.pt.x)` syntax: it forces the programmer to think about the fact that +they are mutating `pt.x`, not just `x`. Accordingly, they should expect `pt` not +to be changed (even if `pt` were an alias -- which it's not). Without the +parentheses there, a user might think they're mutating `x` and be surprised. + +Here's yet another example: + +```ocaml +type t2 = { x : #int32; y : #int32 } +type t1 = { mutable t2 : #t2; other : int } + +fun (t1 : t1) -> + let other_t1 : t1 = {t1 with other = 5} in + t1.(.t2.x) <- #10l; + other_t1.t2.x = t1.t2.x +``` + +Assuming `t1.t2.x` doesn't start as `#10l`, this will return `false`. But this +should not come as a surprise: `t1.t2` is copied as part of the functional +record update, and thus mutating `t1.t2` (as part of `t1.(.t2.x) <- #10l`) changes +it. If, on the other hand, we did not have the parentheses, users might expect +`other_t1`'s `x` to be changed when `t1`'s `x` gets changed. + +## Alternative: polymorphism, not subtyping + +The current design uses a subtyping mechanism (or "sublayouting") to +navigate among related layouts. This allows us to use e.g. an `immediate` +as a `value` and is necessary in order to support functions polymorphic +over values (such as `map : ('a -> 'b) -> 'a list -> 'b list`) to work +with `int`s. An alternative approach would be to use polymorphism +without subtyping. + +Instead of `any`, an unknown layout would just be a variable `'y`. (`'l` +is hard to read, and `'a` looks like a type.) To handle the relationship +between `value` and `immediate`, we could have `immediate value` and `pointer +value`. Then we would have `val map : ('a : 'i1 value) ('b : 'i2 value). ('a -> +'b) -> 'a list -> 'b list`. This works because an `'i value` can be compiled +even if we don't know `'i`. Non-value layouts would be unparameterized, +because there is only one way to be e.g. `bits64`. + +Using polymorphism instead of subtyping would help these scenarios: + +1. We want `or_null` to work with both values and immediates. Furthermore, +we want to remember that e.g. `int or_null` is still an immediate (and +is gc-ignorable). The current design is to say that the layout-check "looks +through" `or_null`: if the argument type `t` is a `non_null_immediate`, then +`t or_null` is `immediate`. This works OK, but it cannot be abstracted over, +as the "looking through" must be implemented specially for `or_null`. With +polymorphism instead, we could say `type ('a : 'i non_null_value) or_null : 'i +value`, which says exactly what we want. + +2. Generalizing the point above, any time we have an unboxed record of +several components, we might want a richer layout than we currently can +offer. For example: + + ```ocaml + type ('a : 'y1, 'b : 'y2) t : 'y1 * 'y2 = #{ x : 'a; y : 'b } + ``` + + Without polymorphism, the best we can do is + + ```ocaml + type ('a : any, 'b : any) t = #{ x : 'a; y : 'b } + ``` + + This works fine, but just like `or_null`, it can't be abstracted over. + + In practice, though, it would be hard to abstract over this `t` even with + polymorphism, because all functions that operate on `t`s have to work with + concrete layouts anyway. In essence, the fact that one `t` is shared among + many different layouts is not very useful: it saves repeating the type + declaration, but that's it. + + Though not covered (yet) in this design, we do imagine adding abstract + layouts to the module system, where something like this will be possible: + + ```ocaml + module type Two_layouts = sig + layout lay1 + layout lay2 + end + + module Abs_t (L : Two_layouts) : sig + type ('a : L.lay1, 'b : L.lay2) abs_t : L.lay1 * L.lay2 + end = struct + type ('a : L.lay1, 'b : L.lay2) abs_t = ('a, 'b) t + end + ``` + + Then we could have the abstract e.g. `Abs_t(struct layout lay1 = value + layout lay2 = bits32 end).abs_t`. Note that the `Abs_t` module above + could also include actual functions, too. + +3. Polymorphism is useful when a variable is used both co- and contra-variantly. +Put another way, polymorphism is useful when we want to link the type of an +input to the type of an output. The same is true of layouts. The challenge is +that OCaml doesn't allow us to return types from functions; the only way we can +usefully do so is by passing types to a polymorphic parameter. Here is a (contrived) +example: + + ```ocaml + let wrap : 'i ('a : 'i value) ('b : 'i value) 'r. + 'a -> 'b -> (('c : 'i value). 'c -> ('c, 'c) Either.t) -> + ('a, 'a) Either.t * ('b, 'b) Either.t = + fun a b f -> f a, f b + ``` + + A caller might pass two `int`s; in this case, the continuation can + still take advantage of the immediacy of its operand. This is because + the layout of the argument `'c` to the continuation will be known to + the same as the layouts of the arguments. + + If we didn't have restrictions on what could be compiled to executable + code, it would be easier to come up with examples of how we might want + polymorphic parameters to connect to the layouts of other parameters. + However, it does seem this would come into play only with layouts that + are currently subtypes of `value`. + +4. Polymorphism allows us to express homogeneous equality, while subtyping +does not. Consider the equality GADT: + + ```ocaml + type (_, _) eq = Refl : ('a, 'a) eq + ``` + + What layouts should the arguments have? If we want to have `eq` work + across multiple layouts, then we'd need to have both arguments have + layout `any`. (Even if we don't do this, we still have a problem because + of `value` and its sublayouts.) So we would have + + ```ocaml + type (_ : any, _ : any) eq = Refl : ('a, 'a) eq + ``` + + But this makes `(int, #float) eq` well formed. Such a type is empty, + but it's still well formed. This means that we might imagine + + ```ocaml + let f : (int, #float) eq -> int -> #float = function + | Refl -> fun x -> x + ``` + + but I have no idea how that would actually be compiled; I would expect + some kind of small (compile-time) disaster. + + On the other hand, polymorphism allows us to say what we mean: + + ```ocaml + type (_ : l, _ : l) eq = Refl : ('a, 'a) eq + ``` + +5. Similarly to the problem immediately above, subtyping prevents us from +giving a sensible type to `Obj.magic`. The type for `Obj.magic`, with +subtyping, is this: + + ```ocaml + val magic : ('a : any) ('b : any). 'a -> 'b + ``` + + But this allows us to cast an `int` to a `#float`, which is worse + than usual for `Obj.magic`. On the other hand, if we could assert + that `'a` and `'b` had the same layout, via polymorphism, than we + would have a safer type for `Obj.magic`. + + (Prior art: Haskell has two different functions, `unsafeCoerce` + and `unsafeCoerce#`. The former is representation-monomorphic; + the latter is not, for those extra-special occasions.) + +6. If we define `type loopy = { x : loopy } [@@unboxed]`, what is `loopy`'s +layout? Any layout is acceptable. The current plan, as described in the +"Defaults" section of the [inference page](inference.md), is to choose +`non_null_value`. With polymorphism, however, we could choose `'y`, for a +universally quantified `'y`. Then, we could effectively choose `loopy` to +have any layout at all, which is appropriate. This is more expressive. + +7. With the `unique` mode, we have an opportunity to support strong update. +For example: + + ```ocaml + type 'a list = + | Nil + | Cons of { shared hd : 'a; tl : 'a list } + + let rec map : 'a 'b. ('a -> 'b) -> unique 'a list -> unique 'b list = + fun f -> function + | Nil -> Nil + | Cons ({ hd; tl } as stuff) -> + { unique stuff with { hd = f hd; tl = map f tl } } + ``` + + This reuses the existing memory for the list. + + The key question here: what are the layouts of `'a` and `'b`? In the + example above, without annotations, they would default to `value`. But + actually any layout is good for `'a` and `'b` -- *as long as they are the + same*. That is, we could consider this type for `map`: + + ```ocaml + let rec map : ('a : 'y) ('b : 'y). ... + ``` + + Here, `'y` is a layout variable. Compiling this function would require + support for layout polymorphism (likely by compile-time specialization), + but it does seem that the ability to use a layout variable twice is helpful + in describing the function. + +## Bad idea: width subtyping + +We wondered at one point whether we could support `int8 <= int64` in +the subtyping relation. After all, a function expecting an `int64` +argument can indeed deal with an `int8` one. The problem would be +collections. That is, if we have an `#int8 array` (for a magical +`array` type that can deal with multiple layouts, like `box`), how +would we index into it? Is it a `#int8`-as-64-bits or a plain `#int8` +in there? The way to tell is to have a second argument to `array` +that denotes the layout. Richard thinks this could work out in the +end, but probably would still be a bad idea. + +## Bad idea: splitting `box` + +The mixed-block restriction tells us that there are really two forms of `box`: +one for gc-friendly boxes and one for gc-ignorable boxes. We briefly thought +about having two different primitives `box_gc` and `box_non_gc` (and no `box` +function), where users would choose the one they wanted. The type system would +ensure that the layout of the argument is appropriate for the type of box +created. + +This plan would be good because it would simplify inference: currently, every +use of `box` imposes a requirement that the layout of the argument is *either* +gc-friendly or gc-ignorable. But "or" requirements are annoying: we can't +simplify or usefully propagate the requirement until we know which branch of the +"or" we wish to take. If the user specified which kind of box they want, then +we don't have the "or" any more. + +However, this plan doesn't work very well, because of auto-boxing. That is, if +we have something like + +```ocaml +let x = ... in +let y = ... in +x, y +``` + +what kind of box should we use when constructing the tuple? It depends on the +type of `x` and `y` -- or rather on the layouts of those types. At the point +where our boxing magic inserts the call to `box`, we haven't yet completed type +inference, and so we can't know which kind of `box` to insert. In the end, we've +just re-created the challenge with "or" described above. So there seems to be +little incentive to have the two different boxes explicitly anywhere. \ No newline at end of file diff --git a/jane/doc/proposals/unboxed-types/flexibility.md b/jane/doc/proposals/unboxed-types/flexibility.md new file mode 100644 index 00000000000..1c8d291f2d8 --- /dev/null +++ b/jane/doc/proposals/unboxed-types/flexibility.md @@ -0,0 +1,67 @@ +# Layout flexibility + +The design for unboxed types allows easy access to unboxed records and variants, +meaning that programmers will be using types at a large number of different layouts. +Each layout requires its own calling convention and memory allocation behavior; +accordingly, the fact that OCaml compilation erases types (and layouts) means that +an ordinary polymorphic function cannot work over types of different layouts. +Put another way, we can be polymorphic over *types* but not *layouts*. + +However, changing the layout of a type does not change anything about the source +code for a function. For example, we can imagine the following functions for +extracting the first element of an unboxed pair: + +```ocaml +module Fsts : sig + val fst_value_value : ('a : value) ('b : value). #( 'a * 'b ) -> 'a + val fst_int64_float64 : ('a : int64) ('b : float64). #( 'a * 'b ) -> 'a + val fst_float64_int64 : ('a : float64) ('b : int64). #( 'a * 'b ) -> 'a +end = struct + let fst_value_value #(x, _) = x + let fst_int64_float64 #(x, _) = x + let fst_float64_int64 #(x, _) = x +end +``` + +This gets boring quickly -- and note that the function definitions for all of the +different varieties are identical. + +We thus sketch out the design for *layout flexibility*, as described in this document. +With layout flexibility, we can write just this: + +```ocaml +module Fst : sig + val fst : ('a : any) ('b : any). #( 'a * 'b ) -> 'a +end = struct + let fst (x, _) = x +end +``` + +This `fst` function cannot be compiled to machine code: it would have no way of +accepting arguments or returning a result. However, it usefully serves as a template +for concrete instantiations that can indeed be compiled. + +We call a function like `fst` *layout flexible*. We reserve "layout polymorphic" to +describe a feature (neither designed nor planned) that would allow locally quantified +layout variables. Instead, layout flexibility is all about having types with layout +`any`. + +There are two thorny aspects of this design: tweaks to the type system and the implementation +strategy. The type system changes are necessary in order to restrict how layout-flexible +functions are used, so that we can look up the template implementation for instantiation. +The implementation strategy describes how the template is used to mint concrete versions +of the function. + +## Type system + +Details forthcoming, but they are foreshadowed in the [extended abstract for +Layout +Polymorphism](https://icfp23.sigplan.org/details/mlworkshop-2023/3/Layout-Polymorphism-Using-static-computation-to-allow-efficient-polymorphism-over-va) +(see the "file attachement"). + +## Implementation strategy + +Details forthcoming, but they are foreshadowed in the [extended abstract for +Layout +Polymorphism](https://icfp23.sigplan.org/details/mlworkshop-2023/3/Layout-Polymorphism-Using-static-computation-to-allow-efficient-polymorphism-over-va) +(see the "file attachement"). \ No newline at end of file diff --git a/jane/doc/proposals/unboxed-types/index.md b/jane/doc/proposals/unboxed-types/index.md new file mode 100644 index 00000000000..b19a32bcf4c --- /dev/null +++ b/jane/doc/proposals/unboxed-types/index.md @@ -0,0 +1,1428 @@ +# Unboxed types + +## Preamble + +This document describes an upcoming feature we (the compilers team) are +planning. This is all subject to change as we gain experience during +implementation. The features described here will become available incrementally; +this proposal paints only the final picture. We are still working out a more +detailed implementation plan, which will be posted and linked in due course. + +This document presents the core parts of the proposal; other aspects are +discussed in these companion documents. Read this main proposal +first. + +* [Kinds](kinds.md) +* [Abstract layouts](abstract.md) +* [Surface syntax of unboxed types](syntax.md) +* [Adding null to types](null.md) +* [Type inference concerns](inference.md) +* [Extensions, alternatives, and bad ideas](extensions.md) + +Parts of this proposal have been upstreamed to be discussed by the wider OCaml community, +as an [OCaml RFC](https://github.com/ocaml/RFCs/pull/34). + +OCaml currently has two attributes that this proposal may easily be confused +with: + +* We can mark arguments to external calls as `[@unboxed]`, as [documented in the + manual](https://v2.ocaml.org/manual/intfc.html#s%3AC-cheaper-call). This + proposal essentially takes this idea and expands it to be usable within OCaml + itself, instead of just at the foreign function interface boundary. +* We can mark some types as `[@@unboxed]`, as briefly described in a bullet + point in [this manual + section](https://v2.ocaml.org/manual/attributes.html#ss:builtin-attributes). + This attribute, applicable to a type holding one field of payload (either a + one-field record or a one-constructor variant with one field), means that no + extra box is allocated when building values of that type. Declaring an + `[@@unboxed]` type is equivalent to declaring an unboxed record or variant + with one field. See the sections on unboxed records and variants, below. + +## Motivation + +Suppose you define this type in OCaml: + +```ocaml +type t = { x : Int32.t; y : Int32.t } +``` + +Values of this type carry 8 bytes of actual data. However, in OCaml, +values of this type are represented as: + + - an 8-byte pointer + + - to a 24-byte block + (8B header + 2x 8B fields) + + - pointing at two more 24-byte blocks + (8B header + 8B `caml_int32_ops` + 4B data + 4B padding) + +There are some efficiency gains to be had here. + +## Principles + +In this design, we are guided by the following high-level principles. +These principles are not incontrovertible, but any design that fails +to uphold these principles should be considered carefully. + +**Backward compatibility**: The extension does not change the +correctness or performance of existing programs. + +**Availability**: Unboxed types should be easy to use. That is, +it should not take much change to code to use unboxed types and +values. + +## Unboxed primitives + +This is a proposed extension to OCaml to allow the layout of data +types to be controlled by the programmer. This proposal won't affect +the type defined above, but will allow you to define better layouts. +With unboxed types, we can write the following: + +```ocaml +type t = { x : int32#; y : int32# } +``` + +Here, the `x` and `y` fields have the unboxed type `int32#`, which +consumes only 4 bytes. Values of type `t` are still boxed: they are +represented as 8-byte pointers to a 16-byte block, consisting of an +8-byte header and two 4-byte fields. Despite containing unboxed +fields, the type t is an ordinary OCaml type: it can be passed to +normal functions, stored in normal data structures, and so on. + +On the other hand, the new type `int32#` is unboxed. This means that +it can't be used to instantiate ordinary type parameters. For +example, `fun (x : int32#) -> Fn.id x` will not work: `Fn.id` doesn't +work on types that are not represented by exactly one word. Similarly, +you can't have a `int32# list`, because a list expects its contents to +be represented by exactly one word. Getting this right is important +for, e.g., the garbage collector, which expects values in memory to +have a certain format. + +Unboxed types, thus, require a trade-off: they are more compact, +but do not work as smoothly as normal boxed types. + +The following types will be available in the initial environment, given with +example literals of that type: + +```ocaml +#() : unit# +#42b : int8# +#42s : int16# +#42l : int32# +#42L : int64# +#42n : nativeint# +#42. : float# +``` + +## Layouts + +So, unboxed types mean that polymorphic definitions need to be +polymorphic over only a subset of the possible types (say, the boxed +ones). We do this by introducing *layouts*, which classify types in +the way that types classify values. (A layout is actually just +one component of a *kind*, which is more fully explored in the +[page on kinds](kinds.md).) The layout of a type determines +how many bytes of memory values of that type consume, how many and +what kind of registers are needed to pass such values to functions, +and whether locations holding such values need to be registered with +the GC. + +Once we have layouts, the type of, say, `dup : 'a -> 'a * 'a` is a short form +of: + +```ocaml +val dup : ('a : value). 'a -> 'a * 'a +``` + +The layout `value` is the layout of ordinary OCaml values (boxed or +immediate). This means that trying to use diag at type `int32# -> +int32# * int32#` causes a compilation error, as `int32#` is not of +layout `value`. + +The following layouts are available, given with example types of that layout: + +```ocaml +(* representable ones *) +string : value +int : immediate +int32 : immediate64 (* immediate on 64-bit machines only *) +nativeint# : word +int8# : bits8 +int16# : bits16 +int32# : bits32 +int64# : bits64 +unit# : void +float# : float64 + +(* unrepresentable one *) +any +``` + +* The key aspect of `value` is that values of `value` types can be scanned by + the garbage collector. We thus say that `value` types are *scannable*. + +* An `immediate` is a `value` that is represented directly, without indirection. + Thus, an `immediate` is scannable, but because there is no indirection, we are + not obliged to scan it. An `immediate` type is thus our first example of an + *external* type -- one that is external to our garbage-collected heap. + +* An `immediate64` is a type that is an `immediate` on 64-bit platforms, but is + just an ordinary `value` on other platforms. + +* A `word` takes up the same amount of space as a `value`, but a `word` is not + known to be scannable (and thus must not be scanned by the GC). However, a + `word` is always external; it is thus necessary *not* to scan `word` values. + +* The `bits` layouts describe external, non-scannable values. On a 64-bit + platform, `word` and `bits64` are the same, but we do not wish to bake + this fact into the type system, and so the layouts remain separate. + +* The `void` layout takes up 0 bits at runtime. It is useful to classify + one-constructor, no-field types (including both `unit` and types like + `('a, 'b) eq`). Accordingly, it is both scannable and external. + +As well as the above primitive layouts, layouts may be combined using +the `*` and `+` operators. The +following are all equivalent at runtime (but not equivalent to the type checker): + +``` +(value * value) * value +value * (value * value) +value * value * value +``` + +There is a (transitive) subtyping relation between these layouts, as pictured +here: + +``` + ----any--------------------------- + / | | | \ + value void word float64 bits_8..64 + | + immediate64 + | + immediate +``` + +(It would be safe to add `immediate <= word`, as well, but we don't for now. See +[extensions](extensions.md).) The subtyping relationship +between product and sum layouts is pointwise, and only between products/sums of +the same length. All products/sums are subtypes of `any`, which exists to serve +as the top of our sublayout lattice. + +We might imagine that we could make, e.g. `(value * value) * value` +a subtype of `value * (value * value)` (and vice versa), but this +would play poorly with type inference. For example, if we had +`'l1 * 'l2 = value * value * value` (where `'l1` and `'l2` are unification +variables), how could we know how to proceed? Perhaps we could make +a subtyping relationship here, but only when there is an explicit check; +we leave this off the design for now. + +Names used in layouts (both the alphanumeric names listed above and the infix +binary operators) live in a new layout namespace (distinct from all existing +namespaces) and are in scope in the initial environment. Layouts can be declared +to be abbreviations or abstract in modules, as described in +[abstract layouts](abstract.md). + +Beyond the layouts introduced here, the ["adding null"](null.md) companion +proposal includes layouts `non_null_value` and `non_null_immediate`, and the +"Mutation" section below describes a layout former `*w`. + +## Layout inference + +As detailed in the [surface syntax](syntax.md) page, users may assign layouts to +types. The design in this document adheres to the following two principles +guiding layout inference: + +1. Layout annotations on concrete types or flexible type variables declare upper bounds. +2. Layout annotations on abstract types (including `private` ones) are precise. + +These principles are meant to extend current treatment of flexible variables +throughout language design. In particular, they agree with the treatment of +variance annotations, which are checked (but not necessarily precise) for types +with definitions but precise for fully abstract types. + +For example, if we write + +```ocaml +type ('a : immediate) is_immediate + +type myint : value = int +``` + +then `myint is_immediate` is still accepted -- despite the `: value` +annotation. That is because `myint` is concrete: we know it is `int`. +So the `: value` annotation checks whether `int` is a `value` (it is) but is +otherwise ignored. Put another way, when checking `myint is_immediate`, we look +through the synonym `myint = int` to see that `int : immediate`, and all is +well. + +The situation is similar with the annotation on `'a`. The `: immediate` puts an +upper bound on the layout for `'a`. Since nothing else constrains `'a`'s layout, +that becomes its layout, and then `is_immediate` requires its argument to have +an `immediate` layout. + +By contrast, if we have + +```ocaml +module M : sig + type myint : value +end = struct + type myint = int +end +``` + +then `M.myint is_immediate` will result in an error. The `myint` type here is +abstract, and thus its `: value` annotation is authoritative: `myint`'s best +layout is `value`. This similarly applies in e.g. `fun (type (a : immediate)) +... ->` syntax and in `let f : ('a : immediate). 'a -> ...` syntax. + +## Unboxed types and records with unboxed fields + +All of the currently-existing types in OCaml have layout `value`. Some +also have layout `immediate`, such as `int` or `unit`. We're planning +to add unboxed versions of a few builtin types, such as `int32#` and +`float#`. This gives: + +```ocaml +type float : value +type int32 : immediate64 +type int : immediate +type float# : float64 +type int32# : bits32 +``` + +All of these can be passed and returned from functions, but only the +`value` types (including `immediate` ones) can be stored in, say, +lists. Note that the existing `+.`, etc. primitives won't work on +`float#`, because they have the wrong type. New ones for `float#` will +be made available. (Same for `int32#`, etc.) + +Unboxed types will be allowed in record fields: + +``` +type t = { + foo : int; + bar : float#; + ... +} +``` + +The OCaml runtime forbids mixing safe-for-GC fields and unsafe-for-GC +fields in a single block. See the mixed-block restriction, below. + +## Layout flexibility + +A key aspect of the design of unboxed types is that we must know +the representation of a type before we can ever manipulate a value +of that type. For example, check out `hard` here: + +```ocaml +let hard : ('a : any). 'a -> 'a = fun x -> x +``` + +This function is impossible to compile to native code. +The reason is that the compiled `hard` function must +take an argument somehow and then return it somehow. Yet, if we don't +know the representation of that argument, we cannot do this! Does the +argument fit in one register or two? Is it a pointer (that the GC would +have to be aware of) or not? We cannot know: the argument's layout is +`any`. + +Nevertheless, we have learned time and time again that polytypic programming +is important. We thus offer [layout flexibility](flexibility.md), +described on another page. However, as that page describes, there are +(compile-time) costs to using `any` layouts; these costs trigger in two +scenarios: + +1. when a bound variable's type has layout `any` +2. when an argument passed to a function has a type with layout `any` + +More details in the page about [layout flexibility](flexibility.md). + +These problems do not come up, however, in using `any` layouts in type +declarations. For example, the following declaration is fine: + +```ocaml +type ('a : any) pair = { first : 'a; second : 'a } +``` + +The above restrictions imply that any construction of `pair` or pattern-match on +`pair` would work only for instantiations that have known representations, but +we can suffice with just one, flexible type declaration. + +## Adding a box + +Because of the restrictions around the usage of unboxed types +(both that they cannot work with standard polymorphism and the +restriction just above about mixing representations in record +types), we sometimes want to box an unboxed type. The types +we have seen so far have obvious boxed cousins, but we will soon +see the ability to make custom unboxed types. We thus introduce + +``` +type ('a : any) box + +val box : ('a : any). 'a -> 'a box +val unbox : ('a : any). 'a box -> 'a +``` + +These definitions are magical in a number of ways: + +* It is best to think of the type `box` as describing an infinite +family of types, where the member of the family is chosen +by the layout of the boxed type. (The family is infinite because of +the `*` and `+` layouts, which can be used to create new layouts.) + +* It would be impossible to define the `box` function without magic, because +it runs afoul of the restriction around function arguments. +A consequence of this design is that the `box` function cannot +be abstracted over: a definition like `let mybox (x : ('a : any)) = box x` +runs into trouble, because it binds a variable of a type whose layout +is unknown. + +* Because the function `box` is really a family of functions, keyed +by the layout of its argument, it is not allowed to use `box` without +choosing a layout. The simplest way to explain this is to say that `box` +must always appear fully applied. In this way, it might be helpful to +think of `box` more as a keyword than a function. But we could, in theory, +allow something like `let box_float : ('a : float64). 'a -> 'a box = box`, +where `box` is unapplied (but specialized). However, there is little +advantage to doing so, and it's harder to explain to users, so let's +not: just say `box` must always appear applied. (Note: GHC has a similar +restriction around similar constructs.) + +* There is additional magic around various forms of unboxed types, +as described below. + +## Arrays + +Going beyond storing just one unboxed value in a memory box, we also +want to be able to store many unboxed values in an array. Accordingly, +we extend the existing `array` to take a type argument of `any`, +as if `array` were declared with + +```ocaml +type ('a : any) array +``` + +Just like we need magical value-level primitives `box` and `unbox` to deal +with `box`, we will also need similar primitives to deal with arrays +of unboxed values. This proposal does not spell out the entire API for this +feature, but we will work it out during the implementation. Regardless +of the API details, the `array` type must have a similar layout-indexed +magic as `box`, though `array` could conceivably use a different memory +layout as `box` does. In particular, the memory format of a boxed variant +(as described below in the section on "Unboxed variants") has a variable length, +making it impossible to pack into an `array`. Thus `array` may choose to use +a different memory format as `box` in order to allow for indexing. + +Note that extraction of an element from an array of unboxed values (e.g. +with `get`) requires +copying the element. There are two ways a user might want to get an +unboxed value, via the following hypothetical API: + + get : 'a array -> int -> 'a + get_boxed : 'a array -> int -> 'a box + +If the type `'a` is unboxed, the `get` function copies the value from +the memory allocated as part of the array into registers (or other +destination). To avoid this copying, one might imagine `get_boxed`, intended +to return a pointer to the existing allocated memory within the array. +However, `get_boxed` cannot do this: an `'a box` is expected to be a pointer +to a block with a header, and an element within an array lacks this header. +Instead, we might imagine + +```ocaml +get_element : 'a array -> int -> 'a element +``` + +where `element` is a new type that represents a 1-element slice of an +allocated array. The `get_element` function would indeed just return +a pointer, but it requires yet another magical type `element`, represented +by a pointer to the middle of a block (really, a pointer to the beginning +of the block and an offset). + +We do not explore this aspect of the design further in this document. +Instead, this consideration of `get_boxed` and `get_element` serves to +explain why there is no loss of run-time efficiency if the memory format used +by `box` and the memory format used by `array` are completely different. + +## Unboxed tuples + +In addition to new primitive types, like `int32#`, this proposal also +includes user-defined unboxed +types. The simplest of these is unboxed tuples: + +```ocaml +#( int * float * string ) +``` + +This is an unboxed tuple, and is passed around as three separate +values. Passing it to a function requires three registers. +The layout of an unboxed tuple is the product of the layout of its +components. In particular, the layout of `#( string * string )` is +`value * value`, not `value`, and so it cannot be stored in, say, a +list. + +Constructing and pattern-matching against an unboxed tuple requires +a `#`: `let ubx : #(int * float#) = #(5, #4.)`. Note that parentheses +are required for construction and pattern-matching unboxed tuples. + +Naturally, boxing an unboxed tuple yields a boxed tuple. We thus add +the following rules: + +* For all unboxed tuples `#(ty1 * ty2 * ...)`, +`#(ty1 * ty2 * ...) box = (ty1 * ty2 * ...)`. The `...` is meant to +denote that this works for any arity, including 0. (Left undetermined: +what to do about unary unboxed tuples.) + +* The syntax `(e1, e2, ...)` continues to work for boxed tuples. + +### The mixed-block restriction + +The current OCaml runtime has the following restriction: + +* For every block of memory, one of the following must hold: + + 1. All words in the block (other than the header) may be scanned + by the garbage collector. That is, every word in the block is either + a pointer to GC-managed memory or has its bottom bit tagged. This is a + scannable block. + + 2. No words in the block are pointers to GC-managed memory. This is an + external block. + +This is also described at in [Real World OCaml](https://dev.realworldocaml.org/runtime-memory-layout.html). + +We call this rule the *mixed-block restriction*, and we call types +whose memory layout is mixed as *mixed-block types*. We imagine that +we will be able to lift this restriction in a future release of the +runtime, but we do not expect to do this as part of our initial rollout +of unboxed types. We thus refer to this restriction in several places +in this specification so that readers might imagine a future improvement. + +We can test for the mixed-block restriction by examining a type's layout. +All primitive layouts obey the mixed-block restriction: each is either +scannable or external. A composite layout (that is, formed with `*` and +`+`) is scannable if all of its +components are scannable, and it is external if all of its components +are external. Then, any layout that is either scannable or external +meets the mixed-block restriction. + +The first consequence of the mixed-block restriction is already apparent: +we cannot store, say, an unboxed tuple `#(string * float#)` in a memory +block, as that block would be mixed. Its layout is value * float64, which +is neither scannable nor external. + +We thus have the following restriction on mixed-block types: `box` may +never be called on a mixed-block type. Equivalently, the layout of the argument +to `box` must be either scannable or external. +(This is the essense of +the mixed-block restriction.) However, because `box` is implicitly +used by constructors of boxed types -- such as a boxed tuple -- this +restriction applies more widely than code literally calling `box`. For +example, the following would be rejected: + +```ocaml +let bad : (string * float#) = "hi", #4. +``` + +The problem is the implicit call to `box` in the definition, which would +expand to + +```ocaml +box #("hi", #4.) +``` + +Note that the mixed-block restriction never requires looking directly at +*types*; instead, a mixed-block type can be identified by looking only at +its *layout*. This is in keeping with our understanding of `box` as a +family of functions, indexed by layout. The members of the family corresponding +to mixed-block types simply do not exist. + +## Unboxed records + +Unboxed records are in theory just as straightforward as unboxed tuples, but +have some extra complexity just to handle the various ways that types are +defined and used. Suppose you write: + +```ocaml +type t = { x : int32#; y : int32# } +``` + +Sometimes we want to refer to `t` as a boxed type, to store it in +lists and other standard data structures. Sometimes we want to refer +to `t` as an unboxed type, to avoid extra allocations (in particular, +to inline it into other records). The language never infers which is +which (boxing and allocation is always explicit in this design), so we +need different syntax for both. + +To make this all work, we consider a declaration like the one for +`t` above to actually declare *two* types. To wit, we desugar the +above syntax to these declarations: + +```ocaml +type t# = #{ x : int32#; y : int32# } +type t = t# box +``` + +That is, we have a primitive notion of an unboxed record, called +`t#`, and then we define `t` just as `t# box`. (The `#{` syntax is +also available to users, if they want to just directly declare an +unboxed record.) + +The layout of an unboxed record, like `t#`, is the product of the layouts +of the fields. So, for our example, the layout of `t#` will be `bits32 * bits32`, +because the layout of `int32#` is `bits32`. The tuple is ordered according +to the order of fields as listed in the declaration, even though the order of +such fields usually does not matter. + +To make this backward compatible (and at all pleasant to program in), +we add a little more magic to `box`: + +* In the syntax `e.x` (where `e` is an arbitrary expression and `x` +is a path), if `e` has type `ty box` (for some `ty`), then we treat +the expression as if it were projecting from `ty` after unboxing. + +* Along similar lines, we allow record-creation and pattern-matching +syntax `{ ... }` to create and match against `box`. + +We might imagine an alternative design without automatically creating +unboxed record definitions in this way, but that design does not uphold +the **Availability** principle as well as the current design. + +### Construction + +We use a `#` in the syntax for creating unboxed records: + +```ocaml +type q = #{ x : int; y : int32# } +let g : q -> q = fun #{ x; y } as r -> #{ x = x + r.x; y } +``` + +(If we didn't have the special treatment for `box`, we wouldn't need to +differentiate construction syntax, as we can infer that the record is unboxed +from the field labels, as we do for other record types. We could also +release a first version that requires `#{` and then see if users want to +be able to avoid the `#`. If we drop the `#` requirement, we could simply +default to boxed, unless the type system disambiguation mechanism specifically +selects for unboxed.) + +Type aliases do not automatically bind an unboxed version; rather +it is a property of the record type declaration that creates the +extra unboxed definition. However, if you create a transparent alias +like + +```ocaml +type u = t = { x : int32; y : int32 } +``` + +then we translate this to become + +```ocaml +type u# = t# = #{ x : int32; y : int32 } +type u = u# box (* equivalent to type u = t# box *) +``` + +Naturally, you can also directly alias an unboxed type: + +```ocaml +type u = t# +``` + +Similarly, an abstract type abstracts only the boxed type: + +```ocaml +module M : sig + type t +end = struct + type t = { x : int32; y : int32 } +end +``` + +defines `M.t` but not `M.t#`. If you want to export both +an unboxed and boxed version of an abstract type, you can with + +```ocaml +module M : sig + type unboxed_t : value * value + type t = unboxed_t box +end = struct + type t = { x : int32; y : int32 } + type unboxed_t = t# +end +``` + +We might imagine allowing module signatures to include `type t#` +when they also include `type t`, but as we see here, this feature +is not strictly necessary. + +### `[@@unboxed]` records + +The declaration + +```ocaml +type t = { field : ty } [@@unboxed] +``` + +is equivalent to writing + +```ocaml +type t = #{ field : ty } +``` + +with the exception that construction and pattern-matching +do not require the `#` prefix. Accordingly, the layout of +the newly declared type (`t` in the example) is always the +same as the layout of the field type. + +### Recursion + +Because the layout of an unboxed record comprises the layouts of +its fields, unboxed records cannot normally be recursive. For example, +this would be rejected: + +```ocaml +type t = #{ f1 : int; f2 : t } +``` + +because its layout would be infinite. Unboxed types *may* be mutually +recursive with boxed records, though, as this breaks the cycle (boxed +records are `value`s). + +An exception is made for a record with one field, like this: + +```ocaml +type t = #{ f : t } +``` + +This declaration is useless -- no values have this type -- but the layout +is at least finite. If nothing constrains the layout of the type, it is +defaulted to `value`. + +### Field names and disambiguation + +If we have a + +```ocaml +type t = { x : int; y : int } +``` + +and write a function + +```ocaml +let f t = t.x + t.y +``` + +what type do we infer for `f`? Of course, we want to infer `t -> int`, but in +the presence of unboxed types, we might imagine inferring `t# -> int`, as `t.x` +is a valid way of projecting out the `x` field of both `t` and `t#`. Yet +inferring `t# -> int` would be terribly non-backward-compatible. + +We thus effectively have the boxed projection shadow the unboxed one. That is, +when we spot `t.x` (for a `t` of as-yet-unknown type), we assume that the +projection is from the boxed type `t`, not the unboxed type `t#`. If a user +wants to project from the unboxed type, they can disambiguate using a prefix +`#`, like `t.#x`. Thus, if we have + +```ocaml +let g t = t.#x + t.y +``` + +we infer `g : t# -> int`, though inference is non-principal. Users could also +naturally write + +```ocaml +let g t = t.#x + t.#y +``` + +which supports principled type inference. + +To be clear, the `#` mark is just used for disambiguation. The following also +works: + +```ocaml +let g (t : t#) = t.x + t.y +``` + +There is no ambiguity here, and thus the `#` mark is not needed on record +projections. + +Although this section discusses only record projections, the same idea applies +to record construction and pattern matches: the field of the boxed record +shadows the field of the unboxed record, though the latter can be written with a +`#` prefix (or can be discovered by type-directed disambiguation). + +### Mutation + +There are several concerns that arise when thinking about mutable fields and +unboxed types; this section lays out the scenarios and how they are treated. +We assume the following declarations: + +```ocaml +type point = { x : int32#; y : int32# } +type mut_point = { mutable x : int32#; mutable y : int32#; identity : int } +``` + +1. **Mutable unboxed field in a boxed record**. Example: + + ```ocaml + type t = { radius : int32#; mutable center : point# } + ``` + + A mutable unboxed field can be updated with `<-`, analogously to a mutable + boxed field. However, updating an unboxed field might take multiple separate + writes to memory. Accordingly, there is the possibility of data races when + doing so: one thread might be writing to a field word-by-word while another + thread is reading it, and the reading thread might witness an inconsistent + state. (For records with existential variables and unboxed sums, this + inconsistent state might lead to a segmentation fault; for other types, the + problem might arise only as an unexpected result.) We call this undesirable + action *tearing*. + + To help the programmer avoid tears, an update of a mutable + unboxed field is sometimes disallowed. We surely want to disallow such an + update if it is not type safe. We also want to disallow such an update if it + could violate abstraction: perhaps some abstract record type internally + maintains an invariant, and a torn record might not support the invariant. + + Some cases are easy: we definitely want to support mutation of `float#`s, and + we definitely want to disallow mutation of wide unboxed variants (where we + might update the tag and the fields in separate writes). What about wide + unboxed records? It depends. Consider the type `t` in this section, and + imagine `type s = { mutable circle : t# }`. Should we allow + `s.circle <- ...`? Our answer, in essence: if a type is concrete, then allow + the update. After all, a concrete type cannot be maintaining any invariants + (or if it is, the programmer is responsible). So, if we have the definition + of `t#`, then `s.circle <- ...` is allowed. However, if we do not have the + definition of `t#`, then `s.circle <- ...` is disallowed. + + Yet this design -- based on the concreteness of a type -- is disappointing, + as it bases the choice of allowing mutable updates on whether or not an + interface exposes a representation. Instead, we would want to be able to + write an abstract type yet which allows a potentially-tearing update. + + We thus introduce a new layout `*w` (the "w" stands for "writable"). (We + will use `*w` in our notation here, but the surface syntax is different and + defined below.) `*w` is like `*` (and `l1 *w l2 <= l1' * l2'` iff `l1 <= + l1'` and `l2 <= l2'`), but a product built with `*w` is allowed in a mutable + update, even if it is potentially non-atomic. The inferred layout of a most + (see below) product types (like `t#`) will be built with `*w`, not `*`. Yet + if a type is exported abstractly from a module, the module signature will + have to specify the layout of that type; most users will write a layout + using `*`, thus protecting values of that type from getting torn. + + If a user wants to write a layout with `*w`, they can do so like this: + + ```ocaml + type t : bits32 * (bits32 * bits32) [@writable] + ``` + + The `[@writable]` attribute transforms all `*`s in a layout to be `*w`s. + + Despite most product types being inferred to have a `*w` layout, product + types with existential variables are inferred to have a `*` layout, as + tearing an existential could be type-unsafe. Here is an example: + + ```ocaml + type ex_int = K : 'a * ('a -> int) -> ex_int + ``` + + The layout of `#ex_int` is `value * value` (the first components is `value` + because there is no annotation on `'a` suggesting otherwise), with the + non-writable `*`. + + Putting this all together, we define the following predicate to test for + writeability: + + ``` + writable : concrete_layout -> bool + writable(l1 * l2) = false + writable(l1 + l2) = false + writable(l1 *w l2) = writable(l1) && writable(l2) + writable(_) = true + ``` + + The update of a mutable field is thus allowed if *either*: + + 1. The layout of the field fits in a 64-bit word, *or* + 2. The layout of the field satisfies the `writable` predicate above. + + The first possibility -- for word-sized layouts -- is because a type whose + values fit in a 64-bit word have no threat of getting torn, and thus + can be updated safely. We choose *64-bit* words (not 32-bit ones) because + 32-bit OCaml does not support multicore, and so no possibility of tearing + exists. + + The restriction described here is called the *tearing restriction*. + + The tearing restriction allows updates of our `mutable center` field, + for two reasons: the type `point#` is concrete and thus has layout + `bits32 *w bits32`, with `*w`, and a `point#` fits in a 64-bit word. + + A user who wishes to update a non-atomic mutable field (with their own plan + for synchronization between threads) may do so with the `[@non_atomic]` + attribute, like so: + + ```ocaml + type point = { x : int32#; y : int32# } + module Circle : sig + type t : bits32 * (bits32 * bits32) + end = struct + type t = #{ radius : int32#; mutable center : point# } + end + + type t = { mutable circle : Circle.t#; color : Color.t } + let f (t : t) = t.circle <- #{ ... } [@non_atomic] + ``` + + The design in this section upholds the following principle: + + * Even in the presence of data races, a programmer can never observe an + intermediate state of a single assignment (unless they write `[@non_atomic]`). + + **Optional.** It may be convenient for users to get a warning when they + declare a mutable field that falls afoul of the tearing restriction and + thus requires `[@non_atomic]` on *every* update. + +2. **Mutable field in an unboxed record**. Example: + + ```ocaml + fun (pt : mut_point#) -> (pt.x <- pt.x + #1l); pt + ``` + + Mutation within an unboxed record would be unusual, because unboxed values have no + real notion of identity. That is, an update-in-place appears to be + indistinguishable from a functional update (that is, `{pt with x = pt.x + + #1l}`). By its unboxed nature, an unboxed value cannot be aliased, and so the + mutation will not propagate. + + Here is an example: + + ```ocaml + fun (pt : mut_point#) -> + let boxed = box pt in + pt.x <- pt.x + #1l; + (unbox boxed).x = pt.x + ``` + + This function would always return `false`, because the point stored in the + box is a *copy* of `pt`, not a reference to `pt`. In other words, unboxed + values are passed by *value*, not by *reference*. Accordingly, every time an + unboxed value is passed to or returned from a function, it is copied. + + Because of the potential for bugs around mutability within unboxed records, + this proposal disallows it: in an unboxed record, any `mutable` keywords are + ignored. Accordingly, the example above is rejected: `pt.x <- ...` is + disallowed, because `pt` is an unboxed record. + + This section can be summarized easily: + + * Fields of unboxed records are never mutable. + +3. **Fields within a mutable unboxed record within a boxed record.** Example: + if we have `t : t` (where the type `t` is from mutation case 1, above), then + `t.center.x` is a field within a mutable unboxed record within a boxed + record. + + The case of such a field is interesting in that an unboxed record placed + within a boxed record *does* have a notion of identity: it lives at a + particular place in the heap, and the surrounding boxed record might indeed + be aliased. Thus mutation in this nested case does make good sense, and we + surely want to support it. + + We thus introduce a new syntax for updates of individual fields of a + mutable unboxed record: We write e.g. `t.(.center.x) <- ...`. Note the + parentheses: they denote that we're updating the `x` sub-field within the + mutable `center`. The parentheses are required here, as is the leading + `.`. (The leading `.` within the parentheses disambiguates the syntax with + array access.) + + The rule is this: Consider the list of field accesses in a parenthesized + field assignment. The first field must be mutable, and all fields in the + list must be unboxed. + + By the first field being mutable, we know that the record directly before + the open-parenthesis is boxed, because unboxed records do not have mutable + fields. + + This allows `t.(.center.x) <- #3l` even though `x` is not + declared as `mutable`. This does not break abstraction: the type of `center` + must already be concrete in order to write this, and so a user can always + write `t.center <- {t.center with x = #3l}` instead (modulo the + tearing restriction). In effect, `t.(.center.x) <- #3l` can be seen as + syntactic sugar for `t.center <- #{ t.center with x = #3l }`, but allowed + even if `t.center` is too wide for the tearing restriction. + + Beyond just mutable fields in boxed records, this new syntax form extends to + elements of mutable arrays. So if we have a `#pt array` named `arr`, users + could write `arr.(.(3).x) <- #4l` to update one field of an element of the + array. + +### Nesting + +According to the descriptions above, the `#` prefix on types is +*not* recursive. That is, the contents of a `t#` are the same as +the contents of a `t` -- it's just that the `t#` is laid out in +memory differently. Let's explore the consequences of this aspect +of the design by example: + +Consider the definitions (let's assume a 64-bit machine) + +```ocaml +type t0 = { x : int32; y : int16 } +type t1 = { x : int32#; y : int16# } +type t2 = { t1 : t1; z : int16# } +type t3 = { t1 : t1#; z : int16# } +type t4 = #{ t1 : t1#; z : int16# } +``` + +The points below suggest a calling convention around passing arguments +in registers. These comments are meant to apply both to passing arguments +and returning values, and are up to discussion with back-end folks. + +1. A value of type `t0` will be a pointer to a block of memory with 3 words: a +header, a pointer to a boxed `int32` for `x`, and a word-sized immediate for +`y`. It is passed in one register (the pointer). + +2. A value of type `#t0` will comprise two words of memory: a pointer for `x`, +and an immediate for `y`; it is passed in two registers to a function. + +3. A value of type `t1` will be a pointer to a block of memory with 2 words: +a header and a word containing `x` and `y` packed together (precise layout +within the word to be determined later, and likely machine-dependent). +It is passed in one register (the pointer). + +4. A value of type `t1#` will comprise one word of memory, containing +`x` and `y` packed together. When passed to a function, it will be +passed as *two* registers, one for each component. + +5. A value of type `t2` does not exist: it would be pointer to a *mixed* block, +containing a pointer to a `t1` structure and a non-GC word for `z`. + + **Alternative:** (We do not plan to do this.) A value of type `t2` is a +pointer to a block of memory with three words: a header, a pointer to a `t1` +structure (as described above), and a tagged immediate word, 16 bits of which +store `z`. (In this design, a `z : int64#` would be rejected because there is no +room for the tag.) + +6. A value of type `t2#` comprises two words: one is a pointer to a `t1` +structure, and one contains `z`. (The `z` word does *not* need to be tagged, +as the GC will know not to look at it.) It may *not* be stored in +memory; it is passed in two registers. + +7. A value of type `t3` is a pointer to a block of memory with 2 words: +a header and one packed word containing 48 bits of `t1` and 16 bits of +`z`. It is passed in one register. + +8. A value of type `t3#` comprises one packed word in memory, containing +all of `x`, `y`, and `z`, with no tag bit. It is passed in three registers, +one each for `x`, `y`, and `z`. + +9. The type `t4` is utterly identical to the type `t3#`. + +10. The type `t4#` does not exist; it is an error, as the name `t4#` is +unbound. + +The key takeaway here is that if a programmer wants tight packing, they have to +specify the `#` in the definition of their types. Note that there is no way to +get from the definition of `t0` or `t2` to a tightly packed representation; use +`t1` or `t3` instead! + +A separate takeaway here is that memory layout in our design is *associative*: +the memory layout does not depend on how the type definitions are +structured. This is in contrast to C `struct`s, where each sub-`struct` must be +appropriately aligned and padded. For example, the C translation of this example +is + +```c +struct t3 { + struct t1 { int32 x; int16 y; } t1; + int16 z; +}; +``` + +Yet this would take 2 words in memory, as `t1` would be padded in order to be +32-bit aligned. + +### Further memory-layout concerns + +We wish for unboxed records (and tuples, to which this discussion equally +applies) to be packed as tightly as possible when stored in memory. (This dense +packing does not apply when an unboxed record is stored in local variables, as +it may be more efficient to store components in separate registers.) + +This section of the proposal describes a possible approach to tight memory +packing that supports reordering. This section is more hypothetical than others, +and we type theorists defer to back-end experts if they disagree here. The +section ends with a few user-facing design conclusions. + +The key example is + +```ocaml +type t5 = { t1 : t1#; a : int; z : int16# } +``` + +Note that now, we have an `a` between the `t1#` and the `int16#`. + +A bad idea would be to tightly pack the `int` against the `t1#`, like this (not +to scale): + + 63 31 0 63 31 0 + xxxxxxxxxyyyyyaaaaaa aaaaaaaaaaaaaaazzzz + +Note that the 64 bits of `a` are spread across *two* words. This would make +operations on `a` very expensive. Just say "no"! + +Instead, we insist that `a` is word-aligned. We might thus imagine + + 63 31 0 63 31 0 63 31 0 + xxxxxxxxxyyyyy000000 aaaaaaaaaaaaaaaaaaa zzzzz0000000000000000 + +where `0` denotes padding. That works, but it's wasteful. Instead, we do + + 63 31 0 63 31 0 + xxxxxxxxxyyyyyzzzzzz aaaaaaaaaaaaaaaaaaa + +Everything is aligned nicely, and there's no waste. The only drawback is that +we have *reordered*. + +In general, we reserve the right to reorder components in an unboxed tuple or +record in order to reduce padding. With demand, we could imagine introducing +a way for programmers to request that we do not reorder. (An unboxed type that +does not participate in reordering would have a different layout from one that +does participate in reordering, meaning essentially a new layout former, such +as `&`, analogous to `*`.) + +However, the reordering is *not* encoded in the layout system. Imagine now + +```ocaml +type t6 = { t1 : t1#; z : int16#; a : int } +``` + +This `t6` is the same as `t5`, but with fields in a different order. We have + +```ocaml +t5 : (bits32 * bits16) * immediate * bits16 +t6 : (bits32 * bits16) * bits16 * immediate +``` + +Accordingly, a type variable that ranges over `t5` would not also be able to +range over `t6`: the two have *different* layouts. We could imagine a very +fancy layout equivalence relation that would detect the reordering here and +say that `t5`'s layout equals `t6`'s; we choose not to do this, for several +reasons: + +* Encoding reordering in the layout system potentially constrains us in the + future, in case we wish to do fewer reorderings. +* This significantly complicates layouts, for little perceived benefit. +* Different architectures may benefit from different reorderings; we do not want + the type system to depend on the architecture. + +Accordingly, the reordering of physical layout is mostly undetectable by users: +they just get a more compact running program. The way to detect the reordering +is by either inspecting memory manually (of course) or by sending unboxed +records through a foreign function. In order to support foreign functions, we +will add an interaction with `ocamlc` that produces a C header that offers +functions that extract and set the various fields of an unboxed tuple. Foreign +code could then use this header to be sure that it interacts with our reordering +algorithm correctly. + +#### Backward compatibility + +Existing OCaml programs may have foreign interfaces that rely on a certain +ordering of record fields. The reordering story need not disrupt this. To wit, +we promise that, as we work out the details of reordering, we *never* reorder +fields in records (or tuples) where all fields have layout `value`. (This +includes *all* types expressible before our change.) + +Going further, and imagining possibly lifting the mixed-block restriction, we +can imagine the following rule: + +* (Hypothetical) In any record or tuple type, its fields are ordered in memory + with all `value`s first, in the order given in the declaration, followed by + non-`value`s, in an implementation-defined order. + +This rule actually contradicts the layout of `t5` above, which would put `a` (a +`value`, because `immediate`s are `value`s) first. However, we make no promises +about the hypothetical rule and include it here just as a possible way forward. + +## Unboxed variants + +Unboxed variants pose a particular challenge, because the boxed +representation is quite different than the unboxed representation. + +Consider + +```ocaml +type t = K1 of int * bool | K2 of float# * int32# | K3 of int32# | K4 +``` + +An unboxed representation of this would have to essentially be like a C +union with a tag. This particular `t#` would use registers as follows for +argument passing: + +```ocaml +bits2 (* tag information *) +immediate (* for the int *) +immediate (* for the bool *) +float64 (* for the float# *) +bits32 (* for both int32#s, shared across constructors *) +``` + +No matter which variant is chosen, this register format works. This is important +because the layout of an unboxed type must describe its register +requirements, regardless of what constructor is used. We thus use a new +layout former to describe unboxed variants, `+`. That is, the layout of `t` would +be `(immediate * immediate) + (float64 * bits32) + bits32 + void`. +By specifying only the +layouts of the variants' fields -- not the actual register format itself -- we leave +abstract the actual algorithm for determining the register format. +(See "Aside" below for discussion on this point.) + +One challenge in working with unboxed variants is that it may be hard for the +programmer to predict the size of the unboxed variant. That is, a programmer +might have a variant `v` and then think that `#v` will be more performant than +`v`. However, `#v` might be wider than even the widest single variant of `v` and +thus actually be *less* efficient. (Of course, this is always true: we should +always test before assuming that e.g. unboxing improves performance.) As we +implement, we should keep in mind producing a mechanism where programmers can +discover the memory layout of an unboxed variant, so they can make an informed +decision as to its usage. + +### Boxing + +In contrast to the fixed register format above, a boxed variant needs only +enough memory to store the fields for one particular constructor. That's because +boxed variants get allocated specifically for one constructor -- there is no +requirement that all variants have the same size and layout. + +Despite the challenges here, `box` can still work to convert an unboxed variant +to a boxed one: `box` simply understands the `+` layout form to mean +alternatives, +just as variants have always worked. + +We thus extend the treatment of unboxed records to work analogously +for unboxed variants. That is, we treat a definition of a boxed variant + +```ocaml +type t = K1 of ty1 | K2 of ty2 | ... +``` + +to really mean + +```ocaml +type t# = #( K1 of ty1 | K2 of ty2 | ... ) +type t = t# box +``` + +Just like with records, the layout of an unboxed variant like `t#` comprises +the layouts of the constructors, but combined with `+`, not `*`. The handling +of recursion is the same as with records: most uses of recursion will lead to +infinite layouts, which are rejected. If the layout is finite but unconstrained, +it is defaulted to `value`. + +We then additionally add magic to `box` to make this change transparent to users: + +* A boxed unboxed variant may be constructed and pattern-matched against as +if the box were not there. Following our example, `K1` and `K2` could construct +values of type `t`, and values of type `t` could be matched against constructors +`K1` and `K2`. + +Depending on how an unboxed variant ends up in memory, it has one of three possible +representations: + +* If an unboxed variant is `box`ed, then it has the same representation as + today's variants: a block including a tag and the fields of + the particular constructor (only). + +* If an unboxed variant is part of a boxed product (i.e. record, tuple, or array), + then it takes up exactly as much space as needed to store the tag and the + widest constructor. Here is the example: + + ```ocaml + type t = K1 of int * string * string | K2 of bool * bool | K3 of string + type t2 = { f1 : float; f2 : t#; f3 : string } + ``` + + A value of type `t2` will be a pointer to a block arranged as follows: + + ``` + word 0: header + word 1: f1, a pointer to a boxed float + word 2: tag for f2 + word 3: K1's int (immediate) or K2's bool (immediate) or K3's string (pointer) + word 4: K1's string (pointer) or K2's bool (immediate) + word 5: K1's string (pointer) + word 6: f3, a pointer to a string + ``` + + Note that the `t#` takes up 4 words, regardless of the choice of + constructor. This fixed-width representation is needed in order to give `f3` + a fixed offset from the beginning of the record, which makes accesses of + `f3` more efficient. Imagining a variable-width encoding requires examining + the tag of the variant in order to address later fields; this becomes + untenable if a record has multiple inlined variants. (We can think of `t#` + here more as an inlined variant than an unboxed one.) + +* If an unboxed variant is part of an outer variant, we essentially inline the + inner unboxed variant. The section on "Nesting", below, covers this case. + +### Constructor names and disambiguation + +Just as we have done for record fields, we consider the constructor for the +boxed variant to shadow the constructor for the unboxed one. That is, writing +`K1 blah` will construct a `t`. However, if we already know that the expected +type of `K1 blah` is `t#`, then we use type-directed disambiguation to discover +that the `K1` is meant to refer to the unboxed variant, not the boxed +one. Echoing the design for record fields, we can use a `#` prefix to +disambiguate manually: `#K1 blah` unambiguously creates a `t#`. + +### `[@@unboxed]` variants + +Just like with records, an `[@@unboxed]` variant is equivalent to a normal +unboxed variant. For example, the declaration + +```ocaml +type t = K of ty [@@unboxed] +``` + +is equivalent to + +```ocaml +type t = #( K of ty ) +``` + +Accordingly, the layout of the newly declared type (e.g. `t`) is the same +as the layout of the field of the constructor. The same holds true if the +constructor has an inlined record. + +### Nesting + +We can naturally nest unboxed variants, just like we did with unboxed records. +Just as before, the `#` mark is *not* recursive. Also just as before, we can +gain extra efficiency by cleverly packing one variant inside of another. Let's +explore an example: + +```ocaml +type t = K1 of int * bool | K2 of float# * int32# | K3 of int32# | K4 + (* as above *) +type t2 = K2_1 of int32# | K2_2 of float# * float# | K2_3 of t# +``` + +The `t` is unedited from above, but the `t2` definition contains a `t#`. + +We imagine the following register format for `t2`: + +```ocaml +bits3 (* for the combined tag *) +immediate (* for K1's int *) +immediate (* for K1's bool *) +float64 (* for K2's float# and K2_2's first float# *) +float64 (* for K2_2's second float# *) +bits32 (* for K2's, K3's, and K2_1's int32#s *) +``` + +A few observations to note about this format: + +* There is no part of this arrangement that matches the arrangement for `t`; +indeed, it is not necessary to efficiently get from a `t2` to a `t`: when the +user asked to unbox `t` in the definition of `t2`, they gave up on this +possibility. +* If the `t#` component of `K2_3` is, say, passed to another function, its + components will have to be copied into new registers, so that the function can + extract the pieces it needs. +* If the `t#` component of `K2_3` is, say, matched against, the matcher can + simply remember an offset when looking at the tag. In our case, we might + imagine that tags `0` and `1` correspond to `K2_1` and `K2_2`, with tags `2` + through `5` corresponding to the constructors of `t`. Then, a match on `t` + would simply subtract 2 from the tag before comparing against `t`'s + constructors. + +Note that the description above around boxing applies to nested variants, too, +because the layout of `t2#` is + +```ocaml +bits32 + (float64 * float64) + (immediate * immediate) + + (float64 * bits32) + bits32 + void + ``` + +. Each summand is interpreted as a variant by `box`, and thus the in-memory +representation does not need to take any extra space. Spelling this out, a +`t2# box` would be either be the tagged immediate for `0` (representing +`K2_3 K4`) or a pointer to a block containing a header and the following fields + + tag | fields | represents + =================================================== + 0 | bits32 | K2_1 x + 1 | float64 ; float64 | K2_2 (x, y) + 2 | immediate ; immediate | K2_3 (K1 (x, y)) + 3 | float64 ; bits32 | K2_3 (K2 (x, y)) + 4 | bits32 | K2_3 (K3 x) + +As in the discussions above about low-level details: it's all +subject to change. The key observation here is that unboxing a variant +effectively inlines it within another variant. Put another way, we want the +concrete use of memory and registers for a type to be unaffected by the choice +of how the type is structured (that is, ignore the associativity choices of `+`, +much like we have ignored the associativity choices of `*`). + +### Aside: Why we have a fresh layout for unboxed variants + +The section above describes a fresh layout constructor `+` for unboxed +variants. However, in memory, an unboxed variant is laid out just like +an unboxed tuple, so we could, in theory, use the same layout constructor +for both. Under this idea, the `t` example above would have layout +`immediate * immediate * float * int32 * int2`. + +However, we do not adopt this design for (at least) these reasons: + +1. Encoding the unboxed-variant layout algorithm in the type system +seems fragile in the face of possible future improvements/changes. Maybe +we can come up with a better way of packing certain fields in the future, +and it would thus be a shame if such a change broke layout checking. + +2. An unboxed product type of that kind can reasonably be the +type of a mutable record field. However, the variant case +can't. That's because racing writes of an unboxed variant type +risk memory safety -- the fields from one constructor might +win the race, whilst the tag from the other constructor wins. + +3. The most natural representation for including an +unboxed sum type within a boxed sum type is actually to add +aditional constructors to the boxed sum type -- dual to how +unboxing a product into a product adds additional fields. In +other words, we would store the tag of the nested unboxed sum +type as part of the tag of the enclosing boxed sum type. + +That representation also gives an additional excuse for not +allowing mutable unboxed variant fields. + +Note that the kind of representation described above is still +available using GADTs to make the tag fields explicit. For example: + +```ocaml +type foo = { a : int; + unused1 : unit; + unused2 : unit; } + +type bar = { b : float; + c : string; + unused : unit; } + +type baz = { d : string; + e : string; + f : string; } + +type ('a : value * value * value) tag = + | Foo : foo# tag + | Bar : bar# tag + | Baz : baz# tag + +type t = + T : { g : float; + tag : 'a tag + data : 'a } -> t +``` \ No newline at end of file diff --git a/jane/doc/proposals/unboxed-types/inference.md b/jane/doc/proposals/unboxed-types/inference.md new file mode 100644 index 00000000000..57bf008cf57 --- /dev/null +++ b/jane/doc/proposals/unboxed-types/inference.md @@ -0,0 +1,137 @@ +# Type inference for unboxed types + +This page describes type inference concerns when working with unboxed types and +kinds. This document assumes the reader is familiar with the [main +unboxed-types proposal](index.md), the extension for [adding null](null.md), +and how layouts are components of [kinds](kinds.md). + +# Polymorphism, abstraction and type inference for unboxed types + +The design notes below here are about the details of making unboxed +types play nicely with the rest of the type system. + +The key problem is that we must now somehow figure out the kinds +of all type variables, including those in type declarations and +in value descriptions. The **Availability** principle suggests that +we should infer kinds as far as is possible. Yet the **Backward +compatibility** principle tells us that we should prefer the +`value` kind over other kinds when there is a choice. + +We thus operate with the following general design: + +* The kind of a *rigid* variable is itself rigid: it must be supplied +at the type variable's binding site. + +* The kind of a *flexible* (unification) variable is itself flexible: +it can be inferred from usage sites. +If we still do not know the kind of a variable when we have finished +processing a compilation unit, we default it to `value`. + +(Why wait for the whole compilation unit? Because we might get critical +information in an mli file, seen only at the very end of an entire file.) + +We retain principal *types*, but we don't have principal *kinds*: +for any expression, there's a best type for any given kind, but +there's no best kind (or at least, the best kind isn't always +compilable, because we cannot compile functions that operate over +values of types of layout `any`). + +Programmers may also specify a kind, using the familiar `:` syntax +for type ascriptions. A kind may be given wherever a type appears. +For example, these declarations are accepted: + +```ocaml +type ('a : value, 'b : immediate) t = Foo of 'a * 'b +val fn : ('a : immediate) . 'a ref -> 'a -> unit +val fn2 : 'a ref -> ('a : immediate) -> unit (* not on declaration of 'a *) +val fn3 : unit as (_ : immediate) -> unit (* awkward syntax for an ascription on type, not variable *) +type ('a : bits32 * bits32) t2 = #{ x : #float; stuff : 'a } +val fn4 : 'a t2 -> 'a t2 (* kind of 'a is inferred *) + +type t5 : bits32 (* kind ascription on an abstract type *) + +val fn5 : 'a -> 'a (* 'a is assumed to have layout `value` *) +``` + +It may seem a little weird here to allow abstraction over types of +kind `bits32`. After all, there's only one such type (`#int32`). +However, this ability becomes valuable when combined with abstract +types: two different modules can expose two different abstract types +`M.id`, `N.id`, both representing opaque 32-bit identifiers. By +exposing them as abstract types of layout `#int32`, these modules can +advertise the fact that the types are represented in four bytes +(allowing clients of these modules to store them in a memory-efficient +way), yet still prevent clients from mixing up IDs from different +modules or doing arithmetic on IDs. + +## Defaults + +When inferring the kind of a type, we must consider what we use as the +default layout. In general, we want make a choice low in the lattice for +covariant positions and high in the lattice for contravariant positions, as +these defaults will allow for more expressiveness. That is, if we say +`type 'a t` (with no `=`), a low-in-the-lattice layout for `t` means that `t` +can be used in more contexts, while a high-in-the-lattice layout for `'a` means +that `t` can be applied to more types. With this in mind, we will use the +following defaults: + +```ocaml +type t : <> (* default: non_null_value *) +type ('a : <>) t (* default: non_null_value *) +fun (type (a : <>)) -> ... (* default: value *) +let f : ('a : <>). ... (* default: value *) +``` + +Abstract types `t` should have a default layout of `non_null_value`, as this is +both low in the lattice and also the layout of any type declared with record, +variant, extensible variant, or object type definition. It thus seems likely +that the default will work with both usages of `t` and the definition of `t`. + +A parameter to an abstract type `'a` in `type 'a t` (ditto the type variables in +`type ('a, 'b) t`) also defaults to have layout `non_null_value` -- even though +this choice is low in our lattice. The reason we must do this is to maintain +backwards compatibility. Consider the following module: + +```ocaml +module M : sig + type 'a t +end = struct + type 'a t = 'a +end +``` + +If the default for `'a` were anything different from the default for `t`, this +definition would not be accepted. This is unfortunate, because our other +principle of availability is sacrificed in order to maintain backward +compatibility here: defaulting `'a : non_null_value` means that e.g. `string +or_null Widget.t` is disallowed for a `Widget` module declared with no kind +annotations. (This particular choice of default is hard, and may be revisited; +defaulting `'a : any` is much more compelling here, but we would lose the +ability to write `M` here without annotations.) + +In rigid type variables introduced in function types, we default to `value`, as +doing so seems like a happy compromise. Going higher in the lattice (i.e. `any`) +makes functions too hard to define (e.g. `let id : 'a. 'a -> 'a = fun x -> x` is +rejected), and going lower (i.e. `non_null_value`) makes functions too hard to +call. This, too, may end up revisited in the light of experience. + +### Recursive unboxed types + +The default above for type declarations applies only to fully abstract types; +if the type has a manifest or a kind (that is, if the declaration has +at least one `=`), then we can learn the layout from the type's definition. +There is one exception to this rule, however: recursive `[@@unboxed]` types. +For example: + +```ocaml +type loopy = { field : loopy } [@@unboxed] +``` + +Here, any layout would be correct. (We can imagine more complex cases, +including with mutual recursion.) In this case, we default to `non_null_value`, +just like we do with an abstract type. This has the advantage of being +fully backward compatible. We considered the possibility of requiring a layout +annotation here, but that would break some existing code. We also considered +the possibility of assigning `any` to this type (we can't build one at runtime, +after all), but then e.g. `loopy list` would be newly rejected, and so this +this choice is also not backward compatible. \ No newline at end of file diff --git a/jane/doc/proposals/unboxed-types/kinds.md b/jane/doc/proposals/unboxed-types/kinds.md new file mode 100644 index 00000000000..85dac6bb13e --- /dev/null +++ b/jane/doc/proposals/unboxed-types/kinds.md @@ -0,0 +1,392 @@ +# Kinds + +This page describes a kind system for OCaml. Kinds are used to control +both runtime layout and the ability for certain values to *mode-cross*. +To learn more about layouts, see the [introduction to layouts](index.md). +This page assumes a passing familiarity with layouts, although it is not +necessary to read all of the details from the other page. + +## Motivation: mode crossing + +In a language without modes (such as [`local`](../../extensions/local/intro.md) +or [`sync`](../modes/data-race-freedom.md)), classifying a type by its [layout](index.md) would +be enough. However, our experience with local types suggest that users will +enjoy the ability to control whether types can mode-cross, and kinds are +a natural fit for expressing this property of a type. + +As an example, let's consider locals. Every expression is either `local` or `global`. +Though actually, it's slightly subtler: because `global` is a submode of `local` +(written `global <: local`), every expression is `local`, while some are additionally +`global`. A `global` expression has an advantage in that it is allowed to escape +from functions and be stored in the heap. On the other hand, expressions that +are `local` only lack these abilities. Such expressions can be allocated on a +stack instead of on the usual heap. We can consider all expressions to be `local` +because we can always safely forget that an expression is allowed to escape. + +However, for some types, it is safe to say that any expression of that type is +actually `global`. The most natural example is `int`. Because `int`s are stored +directly -- an `int` is never allocated on the heap -- we can say that all +`int` expressions are `global`. This allows us to return `local` `int`s from +a non-`local` function, because `int`s are really always global. + +At the time of writing (May 2023), *all* immediate types are always global. +We say that all immediate types *mode-cross* along the locality axis. However, +this is sometimes undesirable. For example, we might want a declaration like + +```ocaml +val with_file : filename -> (local_ handle -> 'r) -> 'r +``` + +The `with_file` function opens a file, passes the file's handle to a continuation +function, and then closes the file when the called function is done. However, +it would be an error if that function stored the file handle somewhere for later +access -- the file would be closed by then. So the author of this function puts +a `local_` annotation to say that the `handle` should not be allowed to escape. + +Yet the designer of this API may want to use an `int` as the underlying representation +of a `handle`. If no extra information is necessary to store, then we don't want +to have to allocate a `handle`; we want it to be immediate. And yet we do *not* +want it to mode-cross. + +We thus wish to separate out the notion of "this is not a pointer" from +"this is allowed to mode-cross on the locality axis". This page describes +a mechanism to do this by allowing a type's kind to give its mode-crossing +information, along with its memory representation information. To wit, the +API above might include + +```ocaml +type handle : value & always external = private int +``` + +This declaration says that `handle` has the `value` layout, is always +external (in other words, can mode-cross along the externality axis), but +says nothing about mode-crossing along the locality axis. Accordingly, +a `handle` cannot mode-cross from `local` to `global`. + +One might wonder where `external` came from there. In the framework here, +the interesting quality of `immediate` is that it is `external`: it does not +need to be scanned by the garbage collector. Thus any `external` expression +can be optimized just like `immediate`s are today. Accordingly, the actual +definition of `immediate` is + +```ocaml +kind immediate = + value & always external & always global & always unique & always many +``` + +This describes types that are stored like `value`s, never need to be scanned +by the GC, and can mode-cross across the locality, uniqueness, and linearity +modes. + +Possible addition (not to be implemented for now): An alternative way +of writing the above could be + +```ocaml +type handle : immediate with always local = private int +``` + +This approach takes an existing kind -- `immediate` -- and modifies it to drop the `always +global` descriptor. Using `always local` is a bit silly because everything is always +local, but we think the syntax works nicely as a counterpoint to `always global`. + +Note that `with` here is meant to evoke record-update syntax (which +replaces a value), not module-type-update syntax (which adds +constraints to a type). + +## A kind is a set of descriptors + +We now describe more formally how this all works. + +A *kind* is a set of *descriptors*, where each descriptor specifies some +aspect of a type. A descriptor is one of the following: + +* a layout +* a modality + +For now, all modalities can be phrased as upper bounds on modes; they +are written as the keyword `always` followed by a mode. + +Because there are many mode axes (such as locality and externality), there +can be many descriptors forming a kind. + +All mode axes have a submode relation with a top mode. (All other modes in the +same axis are submodes of the top mode.) If a mode upper bound is omitted, we +assume the upper bound is the top mode for that axis. + +A kind is written as a `&`-separated list of descriptors. Order does not +matter. It is an error if a kind specifies +more than one choice for a given *descriptor category*, where a descriptor +category is either *layout* or one of the mode axes. The layout of a kind +may never be omitted. + +An optional alternative syntax allows `kind with descriptors`, where +the descriptors given override those in the kind. + +According to this description, all layouts are automatically kinds (with +no mode upper bounds). + +We also allow the use of a kind abbreviation in place of a descriptor; it +is expanded to mean the set of descriptors it abbreviates. + +Here is the BNF syntax: + +``` +kind ::= descriptors + | kind `with` descriptors (* optional extension; not for now *) + +descriptors ::= descriptor + | descriptor '&' descriptors + +descriptor ::= layout + | `always` mode + | [ module-path '.' ] kind-name + +kind-name ::= lowercase-ident + +mode ::= `local` + | `global` + | `internal` + | `external` + | `external64` +``` + +The BNF for layouts is defined in the [syntax](syntax.md) page. +We expect more modes to be introduced over time. + +Because layouts can be used as kinds, layouts and kinds share a +namespace. It is thus an error for a structure to include a layout +and a kind of the same name. + +## The externality mode axis + +The [locality mode axis is well +described](../../extensions/local/intro.md). However, this page newly introduces +the *externality* axis. It is arranged like this: + +``` +external < external64 < internal +``` + +An *internal* value is one that the garbage collector must scan: it +may contain managed pointers. An *external* value is one that must not +contain managed pointers. An *external64* value must not contain managed +pointers on 64-bit machines, but is allowed to contain managed pointers +on other platforms. + +The submoding relationship above works because a value either contains +managed pointers or not, and it is always safe to forget a restriction +on a value. + +The compiler uses the externality axis to perform certain +optimizations, such as choosing not to scan external values. This is +the key property of immediates needed for efficient +optimization. (That is, without this notion of externality, the +compiler would not have a reason to track immediacy.) An important +part of this design is to separate out the locality mode-crossing +feature of `immediate` from the `external`-based optimization. + +## Subkinding + +Kinds enjoy a subkinding relation which is simply the pointwise subsumption +relation on all descriptors. We can thus write `any` as the top kind, because +using a layout as a kind assumes no non-trivial upper bounds for any mode axis. + +## Kind abbreviations + +Because kinds can be complex, we introduce the ability to define kind abbreviations. +These can appear in both signatures and structures, and look like this: + +``` +specification +::= `kind` kind-name `=` kind + +definition +::= `kind` kind-name `=` kind +``` + +Note that kind abbreviations may *not* be abstract; you must supply +the expansion in both the signature and the structure. + +Because users can define kind abbreviations, it is thus allowed to +shadow the pre-defined kinds. + +## Pre-defined kinds + +The [introduction to layouts](index.md) defines a number of pre-defined +layouts. Here, we add some nuance to these definitions. Specifically, +we redefine `immediate` and `immediate64` as refinments on `value`: + +```ocaml +kind immediate = value & always global & always external +kind immediate64 = value & always external64 +``` + +## Kinds of user-defined types + +Every user-defined type is assigned a kind, according to the following +algorithm. If a case does not describe the handling of a kind annotation in +the declaration (e.g. the `k` in type `t : k = ...`), then it is checked as +an upper bound of the kind given by the algorithm here. + +There are two classes of modality: *inferred* modalities and *requested* +modalities. Inferred modalities are ones aggressively inferred on type +declarations whenever possible. Requested ones are added to new type declarations +only by request (except on non-`private` abbreviations, which are expanded during +type-checking). Right now, we have this breakdown: + +* Inferred modalities: `always external`, `always external64` +* Requested modalities: `always global` + +The logic here is that externality is really about powering an optimization. +Users generally don't really care whether a type is external; they just want +the compiler to perform the optimization when it is safe to do so. On the other +hand, locality can affect the correctness properties of an API (for example, around +scoped file handles). Accordingly, if a user wants a new type to be `always global`, +they must ask for it. + +This is slightly backward-incompatible with the treatment that preceded modal kinds: in +the initial implementation of locals, `type t = private int` has an upper bound of +`global` along the locality axis, whereas the design described here assigns no upper bound +(that is, `always local`). + +(Looking forward, we expect `always sync` to be inferred while `always many` and +`always unique` will be requested.) + +Recall here that all layouts can also be treated as kinds, but with no mode +upper bounds. + +* A fully abstract type (a definition with no `=` signs) is assigned the +kind written in a kind annotation. If there is no kind annotation, the abstract +type gets kind `value`. + +* A boxed record type gets the kind `value`. + + * If all fields are `always global`, the record can be annotated with `always global`. + (Otherwise, doing so is an error.) + + * If all fields have layout `void`, the record will be inferred to be `always external`. + +* A record type declared with `#{ ... }` gets the kind +`lay1 * ... * lay_n`, where `lay1 ... lay_n` are +the layouts of the types of the fields of the record, in the order of appearance +in the declaration. In addition, if all the fields' types are `always m` (for any +mode `m`), then the record may also be `always m` (either inferred or requested by annotation). + +* A record declared with `[@@unboxed]` gets the same layout as its field. It inherits +all inferred modalities and may be annotated with requested modalities, according to +the modalities on its field. + +* A variant type with all constant constructors gets the kind `value & always external`. +A constructor is constant if all of its fields have layout `void`. (This statement +is also true of constructors with no fields.) It may also be annotated `always global` +to get that modality by request. + +* A variant type with any non-constant constructors gets the kind `value`. + +* A variant type declared with `#( ... )` gets the kind +`lay1 + ... + lay_n`, where `lay_i` is the product +of the layouts of the fields of the `i`th constructor. +In addition, if all the constructors' fields' types are `always m` (for any +mode `m`), then the variant may also be `always m` (either inferred or requested +by annotation). + +* An extensible variant has kind `value`. + +* Regardless of the shape of the type declaration, any type variables +get their kinds inferred from usage sites. An unconstrained layout +on a variable defaults to `value`, while an unconstrained mode descriptor +defaults to be the appropriate top mode. + +## Kinds of types in the type algebra + +Types formed from the type algebra are also assigned kinds, according to +the following algorithm. + +* All type variables have a kind. As described more on the [inference page](inference.md), +flexible type variables infer their kinds, while rigid type variables must be assigned +a kind when they are brought into scope. A rigid type variable brought into scope +without a kind annotation defaults to kind `value`. + +* A function type `ty1 -> ty2` has kind `value` without constraining the kinds of +either `ty1` or `ty2`. + +* A tuple `ty1 * ... * tyn` (where n >= 2) has kind `value` without constraining the +kinds of any of the `tyi`. + +* An unboxed tuple `#( ty1 * ... * tyn )` (where n >= 2) has a layout `lay1 * ... * lay_n`, +where each `lay_i` is the layout of type `tyi`. Furthermore, for any mode `m`, if all of +the `tyi` are `always m`, then the unboxed tuple is `always m` as well. This is the same +as the rule for unboxed records. + +* An applied type constructor `(ty1, ..., tyn) t` (where n >= 0) has the kind assigned to `t` at its +declaration. Each of the `tyi` is constrained to be a subkind of the kind on the corresponding +type parameter to `t`. + +* An object type `< f1 : ty1; ...; fn : tyn >` has kind `value`. Each `tyi` is constrained to +have a kind that is a subkind of `value`. + +* A polymorphic variant type ``[ `K1 of tys1 | ... | `Kn of tysn ]``, where all +constructors are constant constructors, has kind `immediate`. As above, a constant +constructor is one where all of its fields have layout `void`. A polymorphic variant +with at least one non-constant constructor has kind `value`. No constraint is put on +the kinds of any of the types. + +* A polymorphic type `'a. ty` has the kind of the inner `ty`. + +* A first-class module type `(module S)` has kind `value`. + +* `ref`, `array` and `lazy_t` are all primitive types. They have kind `value`. +Their type arguments have kind `value` for now, but we expect this to relax +as we develop more features. + +## Kind checking + +We must make sure that types are well-kinded. This is straightforward: +we require that each type variable is instantiated with a type whose kind +is a subkind of the kind of the type variable, and that each type abbreviation's +right-hand side is a subkinds of the kind declared on the abbreviation. + +When computing whether one module type is a subtype of another, we use +the subkinding relation on user-defined types. For now, we require that +the kind on each type parameter to a user-defined type to equal the +corresponding kind in the other signature, but this may be relaxed to allow +contravariance of type parameters (which should be sound). + +Inference of kinds is described on the page on [inference](inference.md). + +## Open questions + +Should we allow `value; always global; always external` or should we require +`value with always global; always external`? That is, we could say that the +descriptors can only be after a `with`. This makes is more canonical, but makes +it slightly awkward if we ever want to update the layout descriptor of a kind +(because most people will think that only modes can go after the `with`). + +## Design notes + +Simple cases must be simple. +Do we need abstract modes? Maybe. But not today. +We probably will with mode polymorphism. +So the design should be extensible to abstract modes. +This will mean we have to name the axes. In a new "mode axis" namespace. Urgh. +No abstract mode axes! You can't even rename them. They are utterly fixed. +We need `with` syntax. +We definitely want abstract layouts. +Do we want abstract / redefinable kinds? I'm sure we do. +Kinds and layouts will share a namespace + So you can say blah : value or blah : bits32 * bits32. +Or equivalently: each layout is also a kind, where all the modal fields + are boring. +Is * an operator on kinds, or on layouts? I think: layouts. +Actually, maybe we allow only kind abbreviations for now, while + we allow proper abstract layouts. That seems like a reasonable first step. +We have `k with ...` syntax to update bits of a kind. + +Of the initial layouts we've imagined: +* value is still a layout: the GC treats values differently from other layouts. +* immediate64 is now a kind: immediate64 = value; always external64 +* immediate is now a kind: immediate = value; always global; always external. +* the others are all still layouts + +Use ; or ,? It's kind-of a tuple, but it's unordered. And it uses `with` +syntax. It really should be ;. + +Use braces? Nah. \ No newline at end of file diff --git a/jane/doc/proposals/unboxed-types/null.md b/jane/doc/proposals/unboxed-types/null.md new file mode 100644 index 00000000000..1bc20961ae3 --- /dev/null +++ b/jane/doc/proposals/unboxed-types/null.md @@ -0,0 +1,144 @@ +# Adding null to types + +This document proposes a way we can add a null value to types, thus granting a +non-allocating version of `option`. This proposal builds on the *layouts* +system described in the [main proposal for unboxed types](index.md). Before +reading this document, you may wish to read up through the +[layouts](index.md#layouts) section of the main proposal. + +# Adding null + +Now that layouts provide a way to segment the world of types, we can +leverage this feature to provide an `option` type -- dubbed `or_null` +-- that requires no allocation. This section describes how it all +works. + +## The `non_null_value` layout + +The key observation powering `or_null` is that ordinary OCaml values are +never equal to the word 0. A pointer will always be non-null (and thus different +from 0), and a tagged integer always has its bottom bit set. Because 0 can +never be a valid pointer, we can safely update the garbage collector not to +traverse null pointers. + +We thus want `t or_null` to be just like `t`, except now with a meaning +for 0. There is still a small problem, though: we cannot ever have `t or_null +or_null`, as that gives *two* meanings for 0. We thus say that the argument +to `or_null` must be a *non-null type*; that is, it has room for 0. However, `t +or_null` is a *with-null type*; that is, it uses 0 in its representation. + +Here is the layout structure: + +``` + any + | + value + | + non_null_value +``` + +Note that `value` is above `non_null_value`. This is because anything +that can be done with a with-null type can be done with a non-null one, but +non-null types have an extra capability (they can be the argument to `or_null`); +this is thus the usual case where a subtype has an extra capability over the +supertype. + +Supporting non-null immediates follows naturally: as explained more fully in the +page on [kinds](kinds.md), `immediate` is just `value` with the ability to +mode-cross, and so the little layout lattice above powers a kind like + +``` +kind non_null_immediate = + non_null_value & always global & always external & always unique & always many +``` + +Indeed, this definition will be part of the initial environment. + +The layout `non_null_value` is *concrete*: we can compile +a function that manipulates `non_null_value`s. + +Along with the kind-system changes above, the following type will be in the initial +environment: + +```ocaml +type ('a : non_null_value) or_null : value +``` + +In addition, we will allow `'a or_null` to mode-cross the same way that +`'a` does -- effectively allowing `or_null` to work nicely with `immediate`s. +This can be implemented by "looking through" the +`or_null` type constructor during mode-cross-checking. (The alternative would be to +have some degree of kind polymorphism, where we have +`type ('a : non_null_value & 'modes) or_null : value & 'modes` +or similar, but looking through +`or_null` is easy enough so that we can avoid this extra complexity.) +This permits, e.g. `int or_null` to still be subject to +optimizations around immediates. + +The `or_null` type has constructors `Some` and `None` (usable for both +construction and pattern-matching), subject to the usual type-based +disambiguation. + +## The choice of meaning of `value`. + +In the diagram above, the `value` layout includes types that contain null, +whereas the `non_null_value` layout is the one that includes all of today's +types. This choice -- to make a *new* layout have the short name -- derives +from our expectation that most annotations will prefer to denote the superlayout, +not the sublayout. Here is an example: + +```ocaml +type ('element : value, 'index : immediate) flexible_array +``` + +where `flexible_array` can work with a non-`int` index type. Such a storage +structure likely does not care whether its elements support 0 or not. Yet, if we +used `value` to mean the layout without null, then it would be impossible to store +a `widget or_null` in the `flexible_array`. We thus believe that `or_null` will +be easier to use if users' `value` accepts null -- even +though our proposed `value` is distinct from the layout of legacy types. + +Users can always write the `non_null` +versions if they choose to. Note that because of the way layout inference works, +the choice between these layouts matters only for abstract types. For example, +the following still works fine: + +```ocaml +type ('a : value) pair_with_default = { contents : 'a or_null; default : 'a } +``` + +It works because the `: value` annotation gives only the upper bound, and thus +we actually infer `'a : non_null_value`, even though the user did not write that. + +## Sub-typing + +Because any valid `t` is also a valid `t or_null`, we have a natural sub-typing +relationship: `t` is a sub-type of `t or_null` for all `t` (such that `t +or_null` is well formed). Note that this relationship is entirely notionally +separate from the sub-layout relationships described above. Here, we're talking +about term-level conversions such as in + +```ocaml +let f (x : int) = (x :> int or_null) +``` + +## Examples + +### A safe, non-allocating `hd` + +```ocaml +(* in list.mli *) +val hd' : 'a t -> 'a or_null + (* we'll infer that ['a] has layout [non_null_value] *) + +(* somewhere else *) +let f xs default = match List.hd' xs with +| None -> default +| Some x -> x + (* we'll infer [f : ('a : non_null_value). 'a List.t -> 'a -> 'a] *) +``` + +Note that nothing changes about `List.t` itself here. This means that +a data structure can be designed to hold `value`s (that might be null) but that +individual functions over that structure can be specialized to work with +`non_null_value`s. \ No newline at end of file diff --git a/jane/doc/proposals/unboxed-types/syntax.md b/jane/doc/proposals/unboxed-types/syntax.md new file mode 100644 index 00000000000..eba3e31a362 --- /dev/null +++ b/jane/doc/proposals/unboxed-types/syntax.md @@ -0,0 +1,268 @@ +# Surface syntax for unboxed types + +This document describes surface syntax for working with unboxed types, +part of the broader [unboxed types](index.md) proposal, which you may +wish to read first. + +# Surface syntax + +Everything here is based on a +starting point from the [OCaml manual](https://v2.ocaml.org/manual/) and uses +the [notation +conventions](https://v2.ocaml.org/manual/language.html#ss:notations) used in the +manual, with two additions: + +1. When presented in a rule, literals are written in +backticks `` ` ``. (The manual uses a font-change for this distinction.) + +2. We write `+::=` to denote adding a production to an existing non-terminal. +When we write a plain `::=`, this text includes all such productions. + +## Additions to existing syntax + +### Types + +We now accept type names suffixed with a `#`, by adding extra logic to the +lexer. No space is allowed between the type name and the `#`. We previously +considered putting the `#` in prefix, but this conflicts with an existing +notation used with class types. + +In addition to new unboxed type constants, we also have unboxed tuples, +as are easily added: + +``` +typexpr +::= `#` `(` typexpr { `*` typexpr }+ `)` +``` + +We also add new syntax to allow users to declare unboxed types explicitly, such +as the following examples: + +* `type t1 = #{ f1 : int; f2 : int32# }` +* `type t2 = #( | K1 | K2 of int )` +* `type t2' = #( K1 | K2 of int )` + +There are no ambiguities here, and so we just straightforwardly add these +productions: + +``` +record-decl +::= `#` `{` field-decl {`;` field-decl} [`;`] `}` +type-representation +::= `=` `#` `(` [`|`] constr-decl {`|` constr-decl} `)` +``` + +Of course, rather than explicitly declaring unboxed types, users may simply +refer to the unboxed version of boxed types. That is, rather than declaring +`t1` as above, one could declare the boxed type: + +``` +type t1 = { f1 : int; f2 : int32# } +``` + +And use `t1#` where the unboxed type is desired. + +### Expressions + +We wish to add support for the following example expressions: + +* `#K`, where `K` is a constructor (to disambiguate) +* `#{ field1 = expr; field2 }` for unboxed record construction +* `#{ e with field = expr }` for unboxed record update +* `#( expr1, expr2 )` for unboxed tuple construction +* `e.#field` for unboxed field projection (to disambiguate) +* `e.#field <- e2` for unboxed field update (to disambiguate) +* `e.(.f1.f2) <- e2` for deep field update + +There is no conflict with the existing `object#method` syntax, because the first +four examples above have something other than a lowercase letter following the +`#`. The other examples are structurally distinct from `object#method`. + +We thus add the following productions: + +``` +constant +::= `#` constr + | `#` integer-literal + | `#` float-literal + | `#` `(` `)` + +expr +::= `#` `{` ... `}` (* copy the existing syntax for record construction *) + | `#` `{` ... `}` (* copy the existing syntax for record update *) + | `#` `(` expr { `,` expr }+ `)` + | expr `.` field-projection (* replaces existing expr.field *) + | expr `.` field-projection `<-` expr (* replaces existing field update *) + | expr `.(` { `.` field-projection }+ `)` `<-` expr + +field-projection ::= field + | `#` field +``` + +The `#K(e1, e2)` syntax is covered by the addition to `constant`. + +One might worry about the lexing of the `.#` in `e.#field`, but this is OK: an +infix symbol cannot begin with `.#`, and so the `.` and `#` will be lexed separately. + +### Patterns + +We wish to add support for the following example patterns: + +* `#K`, where `K` is a constructor +* `#{ field1 = pattern; field2 }` against unboxed records +* `#( pat1, pat2 )` against unboxed tuples +* `#3L` against unboxed literals + +Only the first causes any potential trouble, because of the conflict with +the existing `#typeconstr` pattern. But this trouble is easily resolved, as +types begin with a lowercase letter and constructors begin with an uppercase +letter. The others can be straightforwardly added: + +``` +pattern +::= `#` constr pattern + | `#` `{` ... `}` (* copy the existing syntax for record patterns *) + | `#` `(` pattern { `,` pattern }+ `)` +``` + +Note also the additions to `constant`, above. + +### Kind annotations + +We also add the ability to write annotations on type declarations and +type variables, describing their kind. The BNF for `kind` is in +the [kinds](kinds.md) document. + +``` +layout-name ::= lowercase-ident (* new non-terminal *) + +(* new non-terminal *) +layout ::= [ module-path `.` ] layout-name + | `(` layout `)` + | layout `*` layout + | layout `+` layout + | layout attribute + +(* `kind` defined elsewhere *) + +(* allow annotations on type variables *) +typexpr +::= `(` `'` ident `:` kind `)` + | typexpr `as` `(` `'` ident `:` kind `)` + | typexpr `as` `(` `_` `:` kind `)` + +(* allow annotations on type declarations *) +typedef ::= [type-params] typeconstr-name [`:` kind] type-information + +(* allow annotations when binding type variables to the left of a `.` *) +type-binder ::= `'` ident (* new non-terminal *) + | `(` `'` ident [`:` kind] `)` + +poly-typexpr ::= typexpr + | {type-binder}+ `.` typexpr (* modified *) + +type-param ::= [ext-variance] type-binder (* modified *) + +(* allow annotations when binding locally abstract types *) +abstract-type-binder ::= typeconstr-name (* new non-terminal *) + | `(` typeconstr-name [`:` kind] `)` + +(* the following replace additions in Chapter 10.4 *) +parameter +::= `(` `type` {abstract-type-binder}+ `)` + | `(` `type` typeconstr-name `:` kind `)` +let-binding +::= value-name `:` type {abstract-type-binder}+ `.` typexpr `=` expr +class-field +::= `method` [`private`] method-name `:` `type` {abstract-type-binder}+ `.` typexpr `=` expr + | `method!` [`private`] method-name `:` `type` {abstract-type-binder}+ `.` typexpr `=` expr +``` + +The two productions for `parameter` allow e.g. `fun (type a : immediate) (x : a) +-> ...` without extra parentheses around the `a : immediate`. + +A kind annotation on a type variable (the `typexpr` productions) imposes a +constraint on the type: `'a : kind` is accepted if the layout of +`'a` is a subkind of the `kind`. The annotations on the declaration +forms declare the kind of the variable. Accordingly, if we have + +```ocaml +let f : ('a : immediate). 'a -> 'a = ... +``` + +the type variable `'a` will have kind `immediate`. Here is another example: + +```ocaml +type ('a : immediate) t +let f : ('a : value). 'a t -> 'a t (* rejected *) +``` + +This last example would be rejected: the universal type variable `'a` is +declared to have kind `value`, and `value` is not a subkind of the +`immediate` required to be a parameter to `t`. + +However, recall that type variables in type declarations are unification +variables, not universal variables. Thus, reusing the same `t`, the following +would be accepted: + +```ocaml +type ('a : value) t2 = 'a t +``` + +Effectively, the `'a` unifies with a fresh type variable that has kind +`immediate`. With this declaration, usage sites of `t2` would still require +a type argument of kind `immediate`, *not* `value`. This is similar to how +types with `constraint`s work, where a type variable might be refined as we +interpret the type definition. + +#### Kind annotations on arbitrary types + +The grammar above does *not* allow kind annotations on arbitrary types: + +```ocaml +type t = (int : immediate) (* not allowed *) +``` + +Instead, it just allows kind annotations on type variables, including type +variables introduced with `as`. There are two reasons for this restriction: + +* When reading a type annotation like `let f : (t:value ...`, we have a parsing + challenge: are we parenthesizing the beginning of a function type whose + argument is labeled `t` and has type `value`? or do we have a type `t` whose + kind is `value`? Reading the remainder of the type will always disambiguate, + based on whether the next token is a `)` or a `->`, but the potential + confusion is still there. Here is a telling example: + + ```ocaml + type t + type t2 + type value + let f1 : (t:value) -> t2 + let f2 : t:value -> t2 + ``` + + Here, `f1` is a function from a `t` (which has kind `value`) to a `t2`. + On the other hand, `f2` is a function from a `value` (with label `t`) to + a `t2`. The parses are unambiguous. Yet human programmers may be easily + confused. + +* Kind annotations on non-type-variables are rarely useful. Non-type-variables + have an ingrained kind, assigned when the type is declared (or by the type + system, for built-in type formers). The one case where such an annotation + might be useful is this: + + ```ocaml + (* in some library *) + type t = A | B | C + + (* in your code *) + let performant_function : (t : immediate) -> ... + ``` + + With the type declaration for `t`, `t` is an enumeration and will have + an `immediate` kind. Yet perhaps the library author decides to add + `D of string` to `t`. Now your function, expecting to operate on an + `immediate` loses performance. The `: immediate` annotation allows you + to get an error if the library author ever decides to do this. + + This situation does actually seem like a real use-case, but even without + the `(t : immediate)` syntax, we can handle this: + + ```ocaml + let performant_function : t as (_ : immediate) -> ... + ``` + + It's a bit ugly, but seems better than the alternative, and should remain + relatively rare. + +If this restriction proves onerous, we can lift it. \ No newline at end of file diff --git a/jane/doc/variance-annotations.md b/jane/doc/variance-annotations.md new file mode 100644 index 00000000000..7107f093a49 --- /dev/null +++ b/jane/doc/variance-annotations.md @@ -0,0 +1,133 @@ +# Variance Annotations in OCaml + +(This was originally published to the Jane Street [Tech +Blog](https://blog.janestreet.com/a-and-a/)) + +OCaml has subtyping, which is a binary relation on types that says +roughly, if type `t1` is a subtype of type `t2`, then any value of +type `t1` can be used anywhere a value of type `t2` was expected. In +OCaml, subtyping arises from polymorphic variants. For example, ``[ +`Foo ]`` is a subtype of ``[ `Foo | `Bar ]``. Why? Because if you +have a piece of code that knows how to deal with `` `Foo`` and `` +`Bar``, well then surely it can deal with just `` `Foo``. + +You can ask OCaml to check subtyping using the syntax `(e : t1 :> +t2)`. E.g.: + + let f x = (x : [ `Foo ] :> [ `Foo | `Bar ]) + +This syntax actually does two things: + +- it verifies that ``[ `Foo ]`` is a subtype of ``[ `Foo | `Bar ]`` +- it causes the type of the entire `:>` expression to be ``[ `Foo | + `Bar ]``. + +Just as the OCaml typechecker has rules for deciding when a let +expression or a function call typechecks, it has rules for deciding +when `(e : t1 :> t2)` typechecks. The subtyping rule for polymorphic +variant types is clear -- one polymorphic variant `t1` is a subtype of +another polymorphic variant `t2` if every constructor in `t1` also +appears in `t2` (and with the same type argument). OCaml then has +rules to extend the subtyping relation to more complex types. +E.g. for tuples, the rule is: + + if t1 :> t1' and t2 :> t2' + then (t1, t2) :> (t1', t2') + +For example: + + let f x = + (x : [ `Foo ] [ `Baz ] + :> [ `Foo | `Bar ] * [ `Baz | `Bap ]) + +The rule for subtyping on tuples makes intuitive sense if you think +about what code could do with a tuple -- it can take apart the pieces +and look at them. So, if a tuple has fewer kinds of values in both +its first and second components, then code dealing with the tuple +would still be fine. + +For arrow types, the subtyping rule is: + + if ta' :> ta and tr :> tr' + then ta -> tr :> ta' -> tr' + +For example: + + let f x = + (x : [ `Foo | `Bar ] -> [ `Baz ] + :> [ `Foo ] -> [ `Baz | `Bap ]) + +Again, the rule makes sense if you think about what code can do with a +function that it has. It can feed the function arguments, and observe +the results. So, if a function can accept more kinds of inputs or +returns fewer kinds of outputs, then the code dealing with the +function would still be fine. + +For types in OCaml like tuple and arrow, you can use variance +annotations, `+` and `-`, to state the essence of the subtyping rule +for the type -- namely the direction of subtyping needed on the +component types in order to deduce subtyping on the compound type. +For tuple and arrow types, you can write: + + type (+'a, +'b) t = 'a * 'b + type (-'a, +'b) t = 'a -> 'b + +If you don't write the `+` and `-`, OCaml will infer them for you. +So, why do you need to write them at all? Because module interfaces +are designed to express the contract between implementor and user of a +module, and because the variance of a type affects which programs +using that type are type correct. For example, suppose you have the +following: + + module M : sig + type ('a, 'b) t + end = struct + type ('a, 'b) t = 'a * 'b + end + +Should the following typecheck or not? + + let f x = + (x : ([ `Foo ], [ `Baz ]) M.t + :> ([ `Foo | `Bar ], [ `Baz | `Bap ]) M.t) + +If you know that `('a, 'b) M.t = 'a * 'b`, then yes, it should type +check. But the whole point of an interface is that a user only knows +what the interface says. And it does not say that `('a, 'b) M.t = +'a * 'b`. So in fact it does not type check. + +Variance annotations allow you to expose the subtyping properties of +your type in an interface, without exposing the representation. For +example, you can say: + + module M : sig + type (+'a, +'b) t + end = struct + type ('a, 'b) t = 'a * 'b + end + +This will give enough information to the OCaml type checker to +typecheck uses of `M.t` for subtyping so that the following will type +check. + + let f x = + (x : ([ `Foo ], [ `Baz ]) M.t + :> ([ `Foo | `Bar ], [ `Baz | `Bap ]) M.t) + +When you use variance annotations in an interface, OCaml will check +that the implementation matches the interface, as always. For example +the following will fail to typecheck: + + module M : sig + type (+'a, +'b) t + end = struct + type ('a, 'b) t = 'a -> 'b + end + +Whereas the following will typecheck: + + module M : sig + type (-'a, +'b) t + end = struct + type ('a, 'b) t = 'a -> 'b + end \ No newline at end of file diff --git a/jst.dune b/jst.dune index 8515f90d0b1..ca9975aa319 100644 --- a/jst.dune +++ b/jst.dune @@ -7,7 +7,6 @@ ; (library ; (name ocamlmiddleend) ; (wrapped false) -; (flags (:standard -principal)) ; (libraries ocamlcommon) ; (modules_without_implementation ; cmx_format cmxs_format backend_intf inlining_decision_intf @@ -19,7 +18,6 @@ (library (name ocamloptcomp) (wrapped false) - (flags (:standard -principal)) (libraries ocamlcommon) (modules_without_implementation x86_ast emitenv cmx_format cmxs_format backend_intf inlining_decision_intf @@ -85,8 +83,9 @@ (name optmain_native) (modes byte native) (flags ( - -strict-sequence -principal -absname -w +a-4-9-40-41-42-44-45-48-66-70 - -warn-error A -bin-annot -safe-string -strict-formats + :standard + -strict-sequence -absname -w +67 + -bin-annot -safe-string -strict-formats )) (libraries ocamloptcomp ocamlcommon) (modules optmain_native)) diff --git a/lambda/.ocamlformat b/lambda/.ocamlformat index e7acdb9b845..3c4cb177b69 100644 --- a/lambda/.ocamlformat +++ b/lambda/.ocamlformat @@ -1,5 +1,21 @@ -profile=conventional -if-then-else=k-r -indicate-multiline-delimiters=closing-on-separate-line -break-cases=all +# Please make a pull request to change this file. disable=true +# There is an .ocamlformat-enable file in this directory. +# Keep the remainder of this file in sync with other .ocamlformat files in this repo. +assignment-operator=begin-line +cases-exp-indent=2 +doc-comments=before +dock-collection-brackets=false +if-then-else=keyword-first +module-item-spacing=sparse +parens-tuple=multi-line-only +sequence-blank-line=compact +space-around-lists=false +space-around-variants=false +type-decl=sparse +version=0.24.1 + +# The existing comments are hand-formatted and lose a lot of readability +# if we wrap them. We should either convert the comments we care about to +# doc comments, or make this same setting change everywhere. +wrap-comments=false diff --git a/lambda/.ocamlformat-enable b/lambda/.ocamlformat-enable new file mode 100644 index 00000000000..81be0ad3f0a --- /dev/null +++ b/lambda/.ocamlformat-enable @@ -0,0 +1,10 @@ +assume_info.ml +assume_info.mli +transl_array_comprehension.ml +transl_array_comprehension.mli +transl_comprehension_utils.ml +transl_comprehension_utils.mli +transl_list_comprehension.ml +transl_list_comprehension.mli +translmode.ml +translmode.mli diff --git a/lambda/debuginfo.ml b/lambda/debuginfo.ml index 8cb6d283d49..ab94555dc49 100644 --- a/lambda/debuginfo.ml +++ b/lambda/debuginfo.ml @@ -17,6 +17,8 @@ open! Int_replace_polymorphic_compare open Lexing open Location +module ZA = Zero_alloc_utils + module Scoped_location = struct type scope_item = | Sc_anonymous_function @@ -27,10 +29,23 @@ module Scoped_location = struct | Sc_partial_or_eta_wrapper | Sc_lazy + let equal_scope_item si1 si2 = + match si1, si2 with + | Sc_anonymous_function, Sc_anonymous_function + | Sc_value_definition, Sc_value_definition + | Sc_module_definition, Sc_module_definition + | Sc_class_definition, Sc_class_definition + | Sc_method_definition, Sc_method_definition + | Sc_partial_or_eta_wrapper, Sc_partial_or_eta_wrapper + | Sc_lazy, Sc_lazy -> true + | (Sc_anonymous_function | Sc_value_definition | Sc_module_definition + | Sc_class_definition | Sc_method_definition | Sc_partial_or_eta_wrapper + | Sc_lazy), _ -> false + type scopes = | Empty | Cons of {item: scope_item; str: string; str_fun: string; name : string; prev: scopes; - assume_zero_alloc: bool} + assume_zero_alloc: ZA.Assume_info.t} let str = function | Empty -> "" @@ -75,15 +90,15 @@ module Scoped_location = struct let enter_compilation_unit ~scopes cu = let name = Compilation_unit.name_as_string cu in cons scopes Sc_module_definition (dot scopes name) name - ~assume_zero_alloc:false + ~assume_zero_alloc:ZA.Assume_info.none let enter_module_definition ~scopes id = cons scopes Sc_module_definition (dot scopes (Ident.name id)) (Ident.name id) - ~assume_zero_alloc:false + ~assume_zero_alloc:ZA.Assume_info.none let enter_class_definition ~scopes id = cons scopes Sc_class_definition (dot scopes (Ident.name id)) (Ident.name id) - ~assume_zero_alloc:false + ~assume_zero_alloc:ZA.Assume_info.none let enter_method_definition ~scopes (s : Asttypes.label) = let str = @@ -91,32 +106,37 @@ module Scoped_location = struct | Cons {item = Sc_class_definition; _} -> dot ~sep:"#" scopes s | _ -> dot scopes s in - cons scopes Sc_method_definition str s ~assume_zero_alloc:false + cons scopes Sc_method_definition str s + ~assume_zero_alloc:ZA.Assume_info.none let enter_lazy ~scopes = cons scopes Sc_lazy (str scopes) "" - ~assume_zero_alloc:false + ~assume_zero_alloc:ZA.Assume_info.none let enter_partial_or_eta_wrapper ~scopes = cons scopes Sc_partial_or_eta_wrapper (dot ~no_parens:() scopes "(partial)") "" - ~assume_zero_alloc:false + ~assume_zero_alloc:ZA.Assume_info.none - let set_assume_zero_alloc ~scopes = + let update_assume_zero_alloc ~scopes ~assume_zero_alloc = match scopes with | Empty -> Empty - | Cons { assume_zero_alloc = true } -> scopes - | Cons { item; str; str_fun; name; prev; assume_zero_alloc = false; } -> - Cons { item; str; str_fun; name; prev; assume_zero_alloc = true; } + | Cons r -> + if ZA.Assume_info.equal r.assume_zero_alloc assume_zero_alloc + then scopes + else + let assume_zero_alloc = + ZA.Assume_info.meet r.assume_zero_alloc assume_zero_alloc + in + Cons { r with assume_zero_alloc } let get_assume_zero_alloc ~scopes = match scopes with - | Empty -> false + | Empty -> ZA.Assume_info.none | Cons { assume_zero_alloc; _ } -> assume_zero_alloc let string_of_scopes = function | Empty -> "" | Cons {str; assume_zero_alloc; _} -> - if assume_zero_alloc then str^"(assume zero_alloc)" - else str + str^(ZA.Assume_info.to_string assume_zero_alloc) let string_of_scopes = let module StringSet = Set.Make (String) in @@ -129,6 +149,23 @@ module Scoped_location = struct repr := StringSet.add res !repr; res + let rec outermost_scope scopes = + match scopes with + | Empty -> None + | Cons { prev = Empty; _ } -> Some scopes + | Cons { prev } -> outermost_scope prev + + let compilation_unit scopes = + match outermost_scope scopes with + | None -> None + | Some scopes -> + (* CR mshinwell: this won't work with -pack, but it isn't clear how + to fix it easily, and we're not using packs anyway these days. *) + match scopes with + | Cons { item = Sc_module_definition; str; _ } -> + Some (Compilation_unit.of_string str) + | _ -> None + type t = | Loc_unknown | Loc_known of @@ -164,8 +201,13 @@ type item = { dinfo_end_bol: int; dinfo_end_line: int; dinfo_scopes: Scoped_location.scopes; + dinfo_uid: string option; + dinfo_function_symbol: string option; } +let item_with_uid_and_function_symbol item ~dinfo_uid ~dinfo_function_symbol = + { item with dinfo_uid; dinfo_function_symbol } + module Dbg = struct type t = item list @@ -227,18 +269,28 @@ module Dbg = struct end -type t = { dbg : Dbg.t; assume_zero_alloc : bool } +type t = { dbg : Dbg.t; assume_zero_alloc : ZA.Assume_info.t } type alloc_dbginfo_item = { alloc_words : int; alloc_dbg : t } type alloc_dbginfo = alloc_dbginfo_item list -let none = { dbg = []; assume_zero_alloc = false } +let none = { dbg = []; assume_zero_alloc = ZA.Assume_info.none } + +let of_items items = { dbg = items; assume_zero_alloc = ZA.Assume_info.none } + +let mapi_items { dbg; assume_zero_alloc } ~f = + { dbg = List.mapi f dbg; + assume_zero_alloc + } + +let to_items t = t.dbg let to_string { dbg; assume_zero_alloc; } = let s = Dbg.to_string dbg in - if assume_zero_alloc then s^"(assume zero_alloc)" else s + let a = ZA.Assume_info.to_string assume_zero_alloc in + s^a let item_from_location ~scopes loc = let valid_endpos = @@ -257,11 +309,14 @@ let item_from_location ~scopes loc = dinfo_end_line = if valid_endpos then loc.loc_end.pos_lnum else loc.loc_start.pos_lnum; - dinfo_scopes = scopes + dinfo_scopes = scopes; + dinfo_uid = None; + dinfo_function_symbol = None; } let from_location = function - | Scoped_location.Loc_unknown -> { dbg = []; assume_zero_alloc = false; } + | Scoped_location.Loc_unknown -> + { dbg = []; assume_zero_alloc = ZA.Assume_info.none; } | Scoped_location.Loc_known {scopes; loc} -> assert (not (Location.is_none loc)); let assume_zero_alloc = Scoped_location.get_assume_zero_alloc ~scopes in @@ -287,24 +342,44 @@ let to_location { dbg; assume_zero_alloc=_ } = let inline { dbg = dbg1; assume_zero_alloc = a1; } { dbg = dbg2; assume_zero_alloc = a2; } = - { dbg = dbg1 @ dbg2; assume_zero_alloc = a1 || a2; } + { dbg = dbg1 @ dbg2; assume_zero_alloc = ZA.Assume_info.meet a1 a2; } let is_none { dbg; assume_zero_alloc } = - (not assume_zero_alloc) && Dbg.is_none dbg + ZA.Assume_info.is_none assume_zero_alloc && Dbg.is_none dbg let compare { dbg = dbg1; assume_zero_alloc = a1; } { dbg = dbg2; assume_zero_alloc = a2; } = let res = Dbg.compare dbg1 dbg2 in - if res <> 0 then res else Bool.compare a1 a2 + if res <> 0 then res else ZA.Assume_info.compare a1 a2 + +let print_item ppf item = + Format.fprintf ppf "%a:%i" + Location.print_filename item.dinfo_file + item.dinfo_line; + if item.dinfo_char_start >= 0 then begin + Format.fprintf ppf ",%i--%i" item.dinfo_char_start item.dinfo_char_end + end let rec print_compact ppf t = + match t with + | [] -> () + | [item] -> print_item ppf item + | item::t -> + print_item ppf item; + Format.fprintf ppf ";"; + print_compact ppf t + +let print_compact ppf { dbg; } = print_compact ppf dbg + +let rec print_compact_extended ppf t = let print_item item = - Format.fprintf ppf "%a:%i" - Location.print_filename item.dinfo_file - item.dinfo_line; - if item.dinfo_char_start >= 0 then begin - Format.fprintf ppf ",%i--%i" item.dinfo_char_start item.dinfo_char_end - end + print_item ppf item; + (match item.dinfo_uid with + | None -> () + | Some uid -> Format.fprintf ppf "[%s]" uid); + (match item.dinfo_function_symbol with + | None -> () + | Some function_symbol -> Format.fprintf ppf "[FS=%s]" function_symbol) in match t with | [] -> () @@ -312,9 +387,9 @@ let rec print_compact ppf t = | item::t -> print_item item; Format.fprintf ppf ";"; - print_compact ppf t + print_compact_extended ppf t -let print_compact ppf { dbg; } = print_compact ppf dbg +let print_compact_extended ppf { dbg; } = print_compact_extended ppf dbg let merge ~into:{ dbg = dbg1; assume_zero_alloc = a1; } { dbg = dbg2; assume_zero_alloc = a2 } = @@ -322,8 +397,13 @@ let merge ~into:{ dbg = dbg1; assume_zero_alloc = a1; } When assume_zero_alloc is only on one of the inputs but not both, keep [dbg] from the other. *) - { dbg = if a1 && not a2 then dbg2 else dbg1; - assume_zero_alloc = a1 && a2 + let dbg = + match ZA.Assume_info.is_none a1, ZA.Assume_info.is_none a2 with + | false, true -> dbg2 + | _, _ -> dbg1 + in + { dbg; + assume_zero_alloc = ZA.Assume_info.join a1 a2 } let assume_zero_alloc t = t.assume_zero_alloc diff --git a/lambda/debuginfo.mli b/lambda/debuginfo.mli index 921c23b9d4a..33ca686310d 100644 --- a/lambda/debuginfo.mli +++ b/lambda/debuginfo.mli @@ -13,6 +13,8 @@ (* *) (**************************************************************************) +module ZA = Zero_alloc_utils + module Scoped_location : sig type scope_item = private | Sc_anonymous_function @@ -23,24 +25,31 @@ module Scoped_location : sig | Sc_partial_or_eta_wrapper | Sc_lazy + val equal_scope_item : scope_item -> scope_item -> bool + type scopes = private | Empty | Cons of {item: scope_item; str: string; str_fun: string; name : string; prev: scopes; - assume_zero_alloc: bool} + assume_zero_alloc: ZA.Assume_info.t} val string_of_scopes : scopes -> string + val compilation_unit : scopes -> Compilation_unit.t option + val empty_scopes : scopes - val enter_anonymous_function : scopes:scopes -> assume_zero_alloc:bool -> scopes - val enter_value_definition : scopes:scopes -> assume_zero_alloc:bool -> Ident.t -> scopes + val enter_anonymous_function : + scopes:scopes -> assume_zero_alloc:ZA.Assume_info.t -> scopes + val enter_value_definition : + scopes:scopes -> assume_zero_alloc:ZA.Assume_info.t -> Ident.t -> scopes val enter_compilation_unit : scopes:scopes -> Compilation_unit.t -> scopes val enter_module_definition : scopes:scopes -> Ident.t -> scopes val enter_class_definition : scopes:scopes -> Ident.t -> scopes val enter_method_definition : scopes:scopes -> Asttypes.label -> scopes val enter_lazy : scopes:scopes -> scopes val enter_partial_or_eta_wrapper : scopes:scopes -> scopes - val set_assume_zero_alloc : scopes:scopes -> scopes - val get_assume_zero_alloc : scopes:scopes -> bool + val update_assume_zero_alloc : + scopes:scopes -> assume_zero_alloc:ZA.Assume_info.t -> scopes + val get_assume_zero_alloc : scopes:scopes -> ZA.Assume_info.t type t = | Loc_unknown @@ -64,8 +73,17 @@ type item = private { dinfo_end_bol: int; dinfo_end_line: int; dinfo_scopes: Scoped_location.scopes; + (** See the [Inlined_debuginfo] module in Flambda 2 for an explanation + of the uid and function symbol fields. (They are used for generation + of DWARF inlined frame information.) These fields should only be + set to [Some] by Flambda 2. *) + dinfo_uid: string option; + dinfo_function_symbol: string option; } +val item_with_uid_and_function_symbol : item -> dinfo_uid:string option + -> dinfo_function_symbol:string option -> item + type t type alloc_dbginfo_item = @@ -83,6 +101,12 @@ val none : t val is_none : t -> bool +val of_items : item list -> t + +val mapi_items : t -> f:(int -> item -> item) -> t + +val to_items : t -> item list + val to_string : t -> string val from_location : Scoped_location.t -> t @@ -95,9 +119,12 @@ val compare : t -> t -> int val print_compact : Format.formatter -> t -> unit +(** Like [print_compact] but also prints uid and function symbol info. *) +val print_compact_extended : Format.formatter -> t -> unit + val merge : into:t -> t -> t -val assume_zero_alloc : t -> bool +val assume_zero_alloc : t -> ZA.Assume_info.t module Dbg : sig type t diff --git a/lambda/dune b/lambda/dune index d5e09a2eeae..b6ba2fee8f2 100644 --- a/lambda/dune +++ b/lambda/dune @@ -15,7 +15,7 @@ (rule (targets runtimedef.ml) (mode fallback) - (deps (:fail (file ../runtime4/caml/fail.h)) - (:prim (file ../runtime4/primitives))) + (deps (:fail (file ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml/fail.h)) + (:prim (file ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/primitives))) (action (with-stdout-to %{targets} (run ./generate_runtimedef.sh %{fail} %{prim})))) diff --git a/lambda/lambda.ml b/lambda/lambda.ml index 1cf5bbe45e4..a071fbd6286 100644 --- a/lambda/lambda.ml +++ b/lambda/lambda.ml @@ -16,6 +16,8 @@ open Misc open Asttypes +type constant = Typedtree.constant + type mutable_flag = Immutable | Immutable_unique | Mutable type compile_time_constant = @@ -27,6 +29,7 @@ type compile_time_constant = | Ostype_win32 | Ostype_cygwin | Backend_type + | Runtime5 type immediate_or_pointer = | Immediate @@ -69,6 +72,11 @@ include (struct if Config.stack_allocation then Modify_maybe_stack else Modify_heap + let equal_alloc_mode mode1 mode2 = + match mode1, mode2 with + | Alloc_local, Alloc_local | Alloc_heap, Alloc_heap -> true + | (Alloc_local | Alloc_heap), _ -> false + end : sig type locality_mode = private @@ -91,6 +99,7 @@ end : sig val join_mode : alloc_mode -> alloc_mode -> alloc_mode + val equal_alloc_mode : alloc_mode -> alloc_mode -> bool end) let is_local_mode = function @@ -136,14 +145,19 @@ type primitive = | Pmakeblock of int * mutable_flag * block_shape * alloc_mode | Pmakefloatblock of mutable_flag * alloc_mode | Pmakeufloatblock of mutable_flag * alloc_mode + | Pmakemixedblock of int * mutable_flag * mixed_block_shape * alloc_mode | Pfield of int * immediate_or_pointer * field_read_semantics | Pfield_computed of field_read_semantics | Psetfield of int * immediate_or_pointer * initialization_or_assignment | Psetfield_computed of immediate_or_pointer * initialization_or_assignment | Pfloatfield of int * field_read_semantics * alloc_mode | Pufloatfield of int * field_read_semantics + | Pmixedfield of + int * mixed_block_read * mixed_block_shape * field_read_semantics | Psetfloatfield of int * initialization_or_assignment | Psetufloatfield of int * initialization_or_assignment + | Psetmixedfield of + int * mixed_block_write * mixed_block_shape * initialization_or_assignment | Pduprecord of Types.record_representation * int (* Unboxed products *) | Pmake_unboxed_product of layout list @@ -154,7 +168,7 @@ type primitive = | Presume | Preperform (* External call *) - | Pccall of Primitive.description + | Pccall of external_call_description (* Exceptions *) | Praise of raise_kind (* Boolean operations *) @@ -165,15 +179,24 @@ type primitive = | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintcomp of integer_comparison - | Pcompare_ints | Pcompare_floats | Pcompare_bints of boxed_integer + | Pcompare_ints + | Pcompare_floats of boxed_float + | Pcompare_bints of boxed_integer | Poffsetint of int | Poffsetref of int (* Float operations *) - | Pintoffloat | Pfloatofint of alloc_mode - | Pnegfloat of alloc_mode | Pabsfloat of alloc_mode - | Paddfloat of alloc_mode | Psubfloat of alloc_mode - | Pmulfloat of alloc_mode | Pdivfloat of alloc_mode - | Pfloatcomp of float_comparison + | Pfloatoffloat32 of alloc_mode + | Pfloat32offloat of alloc_mode + | Pintoffloat of boxed_float + | Pfloatofint of boxed_float * alloc_mode + | Pnegfloat of boxed_float * alloc_mode + | Pabsfloat of boxed_float * alloc_mode + | Paddfloat of boxed_float * alloc_mode + | Psubfloat of boxed_float * alloc_mode + | Pmulfloat of boxed_float * alloc_mode + | Pdivfloat of boxed_float * alloc_mode + | Pfloatcomp of boxed_float * float_comparison + | Punboxed_float_comp of boxed_float * float_comparison (* String operations *) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets @@ -181,10 +204,10 @@ type primitive = | Pmakearray of array_kind * mutable_flag * alloc_mode | Pduparray of array_kind * mutable_flag | Parraylength of array_kind - | Parrayrefu of array_ref_kind - | Parraysetu of array_set_kind - | Parrayrefs of array_ref_kind - | Parraysets of array_set_kind + | Parrayrefu of array_ref_kind * array_index_kind + | Parraysetu of array_set_kind * array_index_kind + | Parrayrefs of array_ref_kind * array_index_kind + | Parraysets of array_set_kind * array_index_kind (* Test if the argument is a block or an immediate integer *) | Pisint of { variant_only : bool } (* Test if the (integer) argument is outside an interval *) @@ -207,6 +230,7 @@ type primitive = | Plsrbint of boxed_integer * alloc_mode | Pasrbint of boxed_integer * alloc_mode | Pbintcomp of boxed_integer * integer_comparison + | Punboxed_int_comp of unboxed_integer * integer_comparison (* Operations on Bigarrays: (unsafe, #dimensions, kind, layout) *) | Pbigarrayref of bool * int * bigarray_kind * bigarray_layout | Pbigarrayset of bool * int * bigarray_kind * bigarray_layout @@ -215,26 +239,49 @@ type primitive = (* load/set 16,32,64,128 bits from a string: (unsafe)*) | Pstring_load_16 of bool | Pstring_load_32 of bool * alloc_mode + | Pstring_load_f32 of bool * alloc_mode | Pstring_load_64 of bool * alloc_mode | Pstring_load_128 of { unsafe : bool; mode: alloc_mode } | Pbytes_load_16 of bool | Pbytes_load_32 of bool * alloc_mode + | Pbytes_load_f32 of bool * alloc_mode | Pbytes_load_64 of bool * alloc_mode | Pbytes_load_128 of { unsafe : bool; mode: alloc_mode } | Pbytes_set_16 of bool | Pbytes_set_32 of bool + | Pbytes_set_f32 of bool | Pbytes_set_64 of bool | Pbytes_set_128 of { unsafe : bool } (* load/set 16,32,64,128 bits from a (char, int8_unsigned_elt, c_layout) Bigarray.Array1.t : (unsafe) *) - | Pbigstring_load_16 of bool - | Pbigstring_load_32 of bool * alloc_mode - | Pbigstring_load_64 of bool * alloc_mode - | Pbigstring_load_128 of { aligned : bool; unsafe : bool; mode: alloc_mode } - | Pbigstring_set_16 of bool - | Pbigstring_set_32 of bool - | Pbigstring_set_64 of bool - | Pbigstring_set_128 of { aligned : bool; unsafe : bool } + | Pbigstring_load_16 of { unsafe : bool } + | Pbigstring_load_32 of { unsafe : bool; mode: alloc_mode; boxed : bool } + | Pbigstring_load_f32 of { unsafe : bool; mode: alloc_mode; boxed : bool } + | Pbigstring_load_64 of { unsafe : bool; mode: alloc_mode; boxed : bool } + | Pbigstring_load_128 of { aligned : bool; unsafe : bool; mode: alloc_mode; + boxed : bool } + | Pbigstring_set_16 of { unsafe : bool } + | Pbigstring_set_32 of { unsafe : bool; boxed : bool } + | Pbigstring_set_f32 of { unsafe : bool; boxed : bool } + | Pbigstring_set_64 of { unsafe : bool; boxed : bool } + | Pbigstring_set_128 of { aligned : bool; unsafe : bool; boxed : bool } + (* load/set SIMD vectors in GC-managed arrays *) + | Pfloatarray_load_128 of { unsafe : bool; mode : alloc_mode } + | Pfloat_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Pint_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_float_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_float32_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_int32_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_int64_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_nativeint_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Pfloatarray_set_128 of { unsafe : bool } + | Pfloat_array_set_128 of { unsafe : bool } + | Pint_array_set_128 of { unsafe : bool } + | Punboxed_float_array_set_128 of { unsafe : bool } + | Punboxed_float32_array_set_128 of { unsafe : bool } + | Punboxed_int32_array_set_128 of { unsafe : bool } + | Punboxed_int64_array_set_128 of { unsafe : bool } + | Punboxed_nativeint_array_set_128 of { unsafe : bool } (* Compile time constants *) | Pctconst of compile_time_constant (* byte swap *) @@ -254,10 +301,12 @@ type primitive = (* Primitives for [Obj] *) | Pobj_dup | Pobj_magic of layout - | Punbox_float - | Pbox_float of alloc_mode + | Punbox_float of boxed_float + | Pbox_float of boxed_float * alloc_mode | Punbox_int of boxed_integer | Pbox_int of boxed_integer * alloc_mode + | Preinterpret_unboxed_int64_as_tagged_int63 + | Preinterpret_tagged_int63_as_unboxed_int64 (* Jane Street extensions *) | Parray_to_iarray | Parray_of_iarray @@ -265,6 +314,15 @@ type primitive = (* Fetching domain-local state *) | Pdls_get +and extern_repr = + | Same_as_ocaml_repr of Jkind.Sort.const + | Unboxed_float of boxed_float + | Unboxed_vector of Primitive.boxed_vector + | Unboxed_integer of Primitive.boxed_integer + | Untagged_int + +and external_call_description = extern_repr Primitive.description_gen + and integer_comparison = Ceq | Cne | Clt | Cgt | Cle | Cge @@ -272,10 +330,13 @@ and float_comparison = CFeq | CFneq | CFlt | CFnlt | CFgt | CFngt | CFle | CFnle | CFge | CFnge and value_kind = - Pgenval | Pfloatval | Pboxedintval of boxed_integer | Pintval + | Pgenval + | Pintval + | Pboxedfloatval of boxed_float + | Pboxedintval of boxed_integer | Pvariant of { consts : int list; - non_consts : (int * value_kind list) list; + non_consts : (int * constructor_shape) list; } | Parrayval of array_kind | Pboxedvectorval of boxed_vector @@ -283,7 +344,7 @@ and value_kind = and layout = | Ptop | Pvalue of value_kind - | Punboxed_float + | Punboxed_float of boxed_float | Punboxed_int of boxed_integer | Punboxed_vector of boxed_vector | Punboxed_product of layout list @@ -292,24 +353,73 @@ and layout = and block_shape = value_kind list option +and flat_element = Types.flat_element = + | Imm + | Float_boxed + | Float64 + | Float32 + | Bits32 + | Bits64 + | Word + +and flat_element_read = + | Flat_read of flat_element (* invariant: not [Float] *) + | Flat_read_float_boxed of alloc_mode +and mixed_block_read = + | Mread_value_prefix of immediate_or_pointer + | Mread_flat_suffix of flat_element_read +and mixed_block_write = + | Mwrite_value_prefix of immediate_or_pointer + | Mwrite_flat_suffix of flat_element + +and mixed_block_shape = Types.mixed_product_shape = + { value_prefix_len : int; + flat_suffix : flat_element array; + } + +and constructor_shape = + | Constructor_uniform of value_kind list + | Constructor_mixed of + { value_prefix : value_kind list; + flat_suffix : flat_element list; + } + and array_kind = Pgenarray | Paddrarray | Pintarray | Pfloatarray + | Punboxedfloatarray of unboxed_float + | Punboxedintarray of unboxed_integer and array_ref_kind = | Pgenarray_ref of alloc_mode | Paddrarray_ref | Pintarray_ref | Pfloatarray_ref of alloc_mode + | Punboxedfloatarray_ref of unboxed_float + | Punboxedintarray_ref of unboxed_integer and array_set_kind = | Pgenarray_set of modify_mode | Paddrarray_set of modify_mode | Pintarray_set | Pfloatarray_set + | Punboxedfloatarray_set of unboxed_float + | Punboxedintarray_set of unboxed_integer + +and array_index_kind = + | Ptagged_int_index + | Punboxed_int_index of unboxed_integer + +and boxed_float = Primitive.boxed_float = + | Pfloat64 + | Pfloat32 and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and unboxed_float = boxed_float + +and unboxed_integer = boxed_integer + and vec128_type = | Unknown128 | Int8x16 @@ -324,7 +434,8 @@ and boxed_vector = and bigarray_kind = Pbigarray_unknown - | Pbigarray_float32 | Pbigarray_float64 + | Pbigarray_float32 | Pbigarray_float32_t + | Pbigarray_float64 | Pbigarray_sint8 | Pbigarray_uint8 | Pbigarray_sint16 | Pbigarray_uint16 | Pbigarray_int32 | Pbigarray_int64 @@ -352,10 +463,18 @@ let vec128_name = function let equal_boxed_integer = Primitive.equal_boxed_integer +let equal_boxed_float = Primitive.equal_boxed_float + let equal_boxed_vector_size v1 v2 = match v1, v2 with | Pvec128 _, Pvec128 _ -> true +let compare_boxed_vector = Stdlib.compare + +let print_boxed_vector ppf t = + match t with + | Pvec128 v -> Format.pp_print_string ppf (vec128_name v) + let join_vec128_types v1 v2 = match v1, v2 with | Unknown128, _ | _, Unknown128 -> Unknown128 @@ -375,7 +494,7 @@ let join_boxed_vector_layout v1 v2 = let rec equal_value_kind x y = match x, y with | Pgenval, Pgenval -> true - | Pfloatval, Pfloatval -> true + | Pboxedfloatval f1, Pboxedfloatval f2 -> equal_boxed_float f1 f2 | Pboxedintval bi1, Pboxedintval bi2 -> equal_boxed_integer bi1 bi2 | Pboxedvectorval bi1, Pboxedvectorval bi2 -> equal_boxed_vector_size bi1 bi2 @@ -389,14 +508,26 @@ let rec equal_value_kind x y = let non_consts1 = List.sort compare_by_tag non_consts1 in let non_consts2 = List.sort compare_by_tag non_consts2 in List.equal Int.equal consts1 consts2 - && List.equal (fun (tag1, fields1) (tag2, fields2) -> + && List.equal (fun (tag1, cstr1) (tag2, cstr2) -> Int.equal tag1 tag2 - && List.length fields1 = List.length fields2 - && List.for_all2 equal_value_kind fields1 fields2) + && equal_constructor_shape cstr1 cstr2) non_consts1 non_consts2 - | (Pgenval | Pfloatval | Pboxedintval _ | Pintval | Pvariant _ + | (Pgenval | Pboxedfloatval _ | Pboxedintval _ | Pintval | Pvariant _ | Parrayval _ | Pboxedvectorval _), _ -> false +and equal_constructor_shape x y = + match x, y with + | Constructor_uniform fields1, Constructor_uniform fields2 -> + List.length fields1 = List.length fields2 + && List.for_all2 equal_value_kind fields1 fields2 + | Constructor_mixed { value_prefix = p1; flat_suffix = s1 }, + Constructor_mixed { value_prefix = p2; flat_suffix = s2 } -> + List.length p1 = List.length p2 + && List.for_all2 equal_value_kind p1 p2 + && List.length s1 = List.length s2 + && List.for_all2 Types.equal_flat_element s1 s2 + | (Constructor_uniform _ | Constructor_mixed _), _ -> false + let equal_layout x y = match x, y with | Pvalue x, Pvalue y -> equal_value_kind x y @@ -409,7 +540,7 @@ let rec compatible_layout x y = | Pbottom, _ | _, Pbottom -> true | Pvalue _, Pvalue _ -> true - | Punboxed_float, Punboxed_float -> true + | Punboxed_float f1, Punboxed_float f2 -> equal_boxed_float f1 f2 | Punboxed_int bi1, Punboxed_int bi2 -> equal_boxed_integer bi1 bi2 | Punboxed_vector bi1, Punboxed_vector bi2 -> equal_boxed_vector_size bi1 bi2 @@ -418,7 +549,8 @@ let rec compatible_layout x y = && List.for_all2 compatible_layout layouts1 layouts2 | Ptop, Ptop -> true | Ptop, _ | _, Ptop -> false - | (Pvalue _ | Punboxed_float | Punboxed_int _ | Punboxed_vector _ | Punboxed_product _), _ -> + | (Pvalue _ | Punboxed_float _ | Punboxed_int _ | Punboxed_vector _ | + Punboxed_product _), _ -> false let must_be_value layout = @@ -434,6 +566,7 @@ let must_be_value layout = type structured_constant = Const_base of constant | Const_block of int * structured_constant list + | Const_mixed_block of int * mixed_block_shape * structured_constant list | Const_float_array of string list | Const_immstring of string | Const_float_block of string list @@ -508,25 +641,19 @@ type local_attribute = | Never_local (* [@local never] *) | Default_local (* [@local maybe] or no [@local] attribute *) -type property = - | Zero_alloc - type poll_attribute = | Error_poll (* [@poll error] *) | Default_poll (* no [@poll] attribute *) -type check_attribute = - | Default_check - | Ignore_assert_all of property - | Check of { property: property; - strict: bool; - opt: bool; +type zero_alloc_attribute = + | Default_zero_alloc + | Check of { strict: bool; loc: Location.t; } - | Assume of { property: property; - strict: bool; - loc: Location.t; + | Assume of { strict: bool; never_returns_normally: bool; + never_raises: bool; + loc: Location.t; } type loop_attribute = @@ -534,7 +661,9 @@ type loop_attribute = | Never_loop (* [@loop never] *) | Default_loop (* no [@loop] attribute *) -type function_kind = Curried of {nlocal: int} | Tupled +type curried_function_kind = { nlocal : int } [@@unboxed] + +type function_kind = Curried of curried_function_kind | Tupled type let_kind = Strict | Alias | StrictOpt @@ -555,17 +684,22 @@ type function_attribute = { inline : inline_attribute; specialise : specialise_attribute; local: local_attribute; - check : check_attribute; + zero_alloc : zero_alloc_attribute; poll: poll_attribute; loop: loop_attribute; is_a_functor: bool; + is_opaque: bool; stub: bool; tmc_candidate: bool; + may_fuse_arity: bool; + unbox_return: bool; } type scoped_location = Debuginfo.Scoped_location.t -type parameter_attribute = No_attributes +type parameter_attribute = { + unbox_param: bool; +} type lparam = { name : Ident.t; @@ -574,6 +708,10 @@ type lparam = { mode : alloc_mode } +type pop_region = + | Popped_region + | Same_region + type lambda = Lvar of Ident.t | Lmutvar of Ident.t @@ -582,13 +720,15 @@ type lambda = | Lfunction of lfunction | Llet of let_kind * layout * Ident.t * lambda * lambda | Lmutlet of layout * Ident.t * lambda * lambda - | Lletrec of (Ident.t * lambda) list * lambda + | Lletrec of rec_binding list * lambda | Lprim of primitive * lambda list * scoped_location | Lswitch of lambda * lambda_switch * scoped_location * layout | Lstringswitch of lambda * (string * lambda) list * lambda option * scoped_location * layout | Lstaticraise of static_label * lambda list - | Lstaticcatch of lambda * (static_label * (Ident.t * layout) list) * lambda * layout + | Lstaticcatch of + lambda * (static_label * (Ident.t * layout) list) * lambda + * pop_region * layout | Ltrywith of lambda * Ident.t * lambda * layout | Lifthenelse of lambda * lambda * lambda * layout | Lsequence of lambda * lambda @@ -603,6 +743,11 @@ type lambda = | Lregion of lambda * layout | Lexclave of lambda +and rec_binding = { + id : Ident.t; + def : lfunction; +} + and lfunction = { kind: function_kind; params: lparam list; @@ -611,6 +756,7 @@ and lfunction = attr: function_attribute; (* specified with [@inline] attribute *) loc: scoped_location; mode: alloc_mode; + ret_mode: alloc_mode; region: bool; } and lambda_while = @@ -669,12 +815,14 @@ let const_int n = Const_base (Const_int n) let const_unit = const_int 0 +let dummy_constant = Lconst (const_int (0xBBBB / 2)) + let max_arity () = if !Clflags.native_code then 126 else max_int (* 126 = 127 (the maximal number of parameters supported in C--) - 1 (the hidden parameter containing the environment) *) -let lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~region = +let lfunction' ~kind ~params ~return ~body ~attr ~loc ~mode ~ret_mode ~region = assert (List.length params <= max_arity ()); (* A curried function type with n parameters has n arrows. Of these, the first [n-nlocal] have return mode Heap, while the remainder @@ -697,7 +845,11 @@ let lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~region = if not region then assert (nlocal >= 1); if is_local_mode mode then assert (nlocal = nparams) end; - Lfunction { kind; params; return; body; attr; loc; mode; region } + { kind; params; return; body; attr; loc; mode; ret_mode; region } + +let lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~ret_mode ~region = + Lfunction + (lfunction' ~kind ~params ~return ~body ~attr ~loc ~mode ~ret_mode ~region) let lambda_unit = Lconst const_unit @@ -706,8 +858,13 @@ let layout_int = Pvalue Pintval let layout_array kind = Pvalue (Parrayval kind) let layout_block = Pvalue Pgenval let layout_list = - Pvalue (Pvariant { consts = [0] ; non_consts = [0, [Pgenval; Pgenval]] }) -let layout_field = Pvalue Pgenval + Pvalue (Pvariant { consts = [0] ; + non_consts = [0, Constructor_uniform [Pgenval; Pgenval]] }) +let layout_tuple_element = Pvalue Pgenval +let layout_value_field = Pvalue Pgenval +let layout_tmc_field = Pvalue Pgenval +let layout_optional_arg = Pvalue Pgenval +let layout_variant_arg = Pvalue Pgenval let layout_exception = Pvalue Pgenval let layout_function = Pvalue Pgenval let layout_object = Pvalue Pgenval @@ -715,11 +872,24 @@ let layout_class = Pvalue Pgenval let layout_module = Pvalue Pgenval let layout_module_field = Pvalue Pgenval let layout_functor = Pvalue Pgenval -let layout_boxed_float = Pvalue Pfloatval -let layout_unboxed_float = Punboxed_float +let layout_boxed_float f = Pvalue (Pboxedfloatval f) +let layout_unboxed_float f = Punboxed_float f +let layout_unboxed_nativeint = Punboxed_int Pnativeint +let layout_unboxed_int32 = Punboxed_int Pint32 +let layout_unboxed_int64 = Punboxed_int Pint64 let layout_string = Pvalue Pgenval +let layout_unboxed_int ubi = Punboxed_int ubi let layout_boxedint bi = Pvalue (Pboxedintval bi) +let layout_unboxed_vector (v : Primitive.boxed_vector) = + match v with + | Pvec128 Int8x16 -> Punboxed_vector (Pvec128 Int8x16) + | Pvec128 Int16x8 -> Punboxed_vector (Pvec128 Int16x8) + | Pvec128 Int32x4 -> Punboxed_vector (Pvec128 Int32x4) + | Pvec128 Int64x2 -> Punboxed_vector (Pvec128 Int64x2) + | Pvec128 Float32x4 -> Punboxed_vector (Pvec128 Float32x4) + | Pvec128 Float64x2 -> Punboxed_vector (Pvec128 Float64x2) + let layout_boxed_vector : Primitive.boxed_vector -> layout = function | Pvec128 Int8x16 -> Pvalue (Pboxedvectorval (Pvec128 Int8x16)) | Pvec128 Int16x8 -> Pvalue (Pboxedvectorval (Pvec128 Int16x8)) @@ -743,18 +913,28 @@ let default_function_attribute = { inline = Default_inline; specialise = Default_specialise; local = Default_local; - check = Default_check ; + zero_alloc = Default_zero_alloc ; poll = Default_poll; loop = Default_loop; is_a_functor = false; + is_opaque = false; stub = false; tmc_candidate = false; + (* Plain functions ([fun] and [function]) set [may_fuse_arity] to [false] so + that runtime arity matches syntactic arity in more situations. + Many things compile to functions without having a notion of syntactic arity + that survives typechecking, e.g. functors. Multi-arg functors are compiled + as nested unary functions, and rely on the arity fusion in simplif to make + them multi-argument. So, we keep arity fusion turned on by default for now. + *) + may_fuse_arity = true; + unbox_return = false; } let default_stub_attribute = - { default_function_attribute with stub = true; check = Ignore_assert_all Zero_alloc } + { default_function_attribute with stub = true; zero_alloc = Default_zero_alloc } -let default_param_attribute = No_attributes +let default_param_attribute = { unbox_param = false } (* Build sharing keys *) (* @@ -813,8 +993,8 @@ let make_key e = Loc_unknown,kind) | Lstaticraise (i,es) -> Lstaticraise (i,tr_recs env es) - | Lstaticcatch (e1,xs,e2, kind) -> - Lstaticcatch (tr_rec env e1,xs,tr_rec env e2, kind) + | Lstaticcatch (e1,xs,e2, r, kind) -> + Lstaticcatch (tr_rec env e1,xs,tr_rec env e2, r, kind) | Ltrywith (e1,x,e2,kind) -> Ltrywith (tr_rec env e1,x,tr_rec env e2,kind) | Lifthenelse (cond,ifso,ifnot,kind) -> @@ -888,7 +1068,7 @@ let shallow_iter ~tail ~non_tail:f = function f arg; tail body | Lletrec(decl, body) -> tail body; - List.iter (fun (_id, exp) -> f exp) decl + List.iter (fun { def } -> f (Lfunction def)) decl | Lprim (Psequand, [l1; l2], _) | Lprim (Psequor, [l1; l2], _) -> f l1; @@ -906,7 +1086,7 @@ let shallow_iter ~tail ~non_tail:f = function iter_opt tail default | Lstaticraise (_,args) -> List.iter f args - | Lstaticcatch(e1, _, e2, _kind) -> + | Lstaticcatch(e1, _, e2, _, _kind) -> tail e1; tail e2 | Ltrywith(e1, _, e2,_) -> f e1; tail e2 @@ -949,8 +1129,12 @@ let rec free_variables = function (free_variables arg) (Ident.Set.remove id (free_variables body)) | Lletrec(decl, body) -> - let set = free_variables_list (free_variables body) (List.map snd decl) in - Ident.Set.diff set (Ident.Set.of_list (List.map fst decl)) + let set = + free_variables_list (free_variables body) + (List.map (fun { def } -> Lfunction def) decl) + in + Ident.Set.diff set + (Ident.Set.of_list (List.map (fun { id } -> id) decl)) | Lprim(_p, args, _loc) -> free_variables_list Ident.Set.empty args | Lswitch(arg, sw,_,_) -> @@ -975,7 +1159,7 @@ let rec free_variables = function end | Lstaticraise (_,args) -> free_variables_list Ident.Set.empty args - | Lstaticcatch(body, (_, params), handler, _kind) -> + | Lstaticcatch(body, (_, params), handler, _, _kind) -> Ident.Set.union (Ident.Set.diff (free_variables handler) @@ -1085,6 +1269,23 @@ let transl_prim mod_name name = | exception Not_found -> fatal_error ("Primitive " ^ name ^ " not found.") +let transl_mixed_product_shape : Types.mixed_product_shape -> mixed_block_shape = + fun x -> x + +type mixed_block_element = Types.mixed_product_element = + | Value_prefix + | Flat_suffix of flat_element + +let get_mixed_block_element = Types.get_mixed_product_element + +let flat_read_non_float flat_element = + match flat_element with + | Float_boxed -> Misc.fatal_error "flat_element_read_non_float Float_boxed" + | Imm | Float64 | Float32 | Bits32 | Bits64 | Word as flat_element -> + Flat_read flat_element + +let flat_read_float_boxed alloc_mode = Flat_read_float_boxed alloc_mode + (* Compile a sequence of expressions *) let rec make_sequence fn = function @@ -1097,12 +1298,17 @@ let rec make_sequence fn = function Assumes that the image of the substitution is out of reach of the bound variables of the lambda-term (no capture). *) -let subst update_env ?(freshen_bound_variables = false) s input_lam = +type substitution_functions = { + subst_lambda : lambda -> lambda; + subst_lfunction : lfunction -> lfunction; +} + +let build_substs update_env ?(freshen_bound_variables = false) s = (* [s] contains a partial substitution for the free variables of the - input term [input_lam]. + input term. During our traversal of the term we maintain a second environment - [l] with all the bound variables of [input_lam] in the current + [l] with all the bound variables of the input term in the current scope, mapped to either themselves or freshened versions of themselves when [freshen_bound_variables] is set. *) let bind id l = @@ -1121,6 +1327,12 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = ({ p with name = name' } :: params' , l) ) params ([], l) in + let bind_rec ids l = + List.fold_right (fun rb (ids', l) -> + let id', l = bind rb.id l in + ({ rb with id = id' } :: ids' , l) + ) ids ([], l) + in let rec subst s l lam = match lam with | Lvar id as lam -> @@ -1145,8 +1357,7 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = Lapply{ap with ap_func = subst s l ap.ap_func; ap_args = subst_list s l ap.ap_args} | Lfunction lf -> - let params, l' = bind_params lf.params l in - Lfunction {lf with params; body = subst s l' lf.body} + Lfunction (subst_lfun s l lf) | Llet(str, k, id, arg, body) -> let id, l' = bind id l in Llet(str, k, id, subst s l arg, subst s l' body) @@ -1154,7 +1365,7 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = let id, l' = bind id l in Lmutlet(k, id, subst s l arg, subst s l' body) | Lletrec(decl, body) -> - let decl, l' = bind_many decl l in + let decl, l' = bind_rec decl l in Lletrec(List.map (subst_decl s l') decl, subst s l' body) | Lprim(p, args, loc) -> Lprim(p, subst_list s l args, loc) | Lswitch(arg, sw, loc,kind) -> @@ -1170,10 +1381,10 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = subst_opt s l default, loc,kind) | Lstaticraise (i,args) -> Lstaticraise (i, subst_list s l args) - | Lstaticcatch(body, (id, params), handler, kind) -> + | Lstaticcatch(body, (id, params), handler, r, kind) -> let params, l' = bind_many params l in Lstaticcatch(subst s l body, (id, params), - subst s l' handler, kind) + subst s l' handler, r, kind) | Ltrywith(body, exn, handler,kind) -> let exn, l' = bind exn l in Ltrywith(subst s l body, exn, subst s l' handler,kind) @@ -1198,16 +1409,26 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = | Levent (lam, evt) -> let old_env = evt.lev_env in let env_updates = - let find_in_old id = Env.find_value (Path.Pident id) old_env in + let find_in_old id = + (* Looking up [id] might encounter locks, which we shouldn't apply + as we are not using the values. But adding the value to [new_env] + with the unlocked mode is just wrong. Therefore, we set the mode + to be [max] for conservative soundness. [new_env] is only used + for printing in debugger. *) + let vd = Env.find_value (Path.Pident id) old_env in + let vd = {vd with val_modalities = Mode.Modality.Value.id} in + let mode = Mode.Value.max |> Mode.Value.disallow_right in + (vd, mode) + in let rebind id id' new_env = match find_in_old id with | exception Not_found -> new_env - | vd -> Env.add_value_lazy id' vd new_env + | (vd, mode) -> Env.add_value_lazy ~mode id' vd new_env in let update_free id new_env = match find_in_old id with | exception Not_found -> new_env - | vd -> update_env id vd new_env + | vd_mode -> update_env id vd_mode new_env in Ident.Map.merge (fun id bound free -> match bound, free with @@ -1229,29 +1450,41 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = | Lexclave e -> Lexclave (subst s l e) and subst_list s l li = List.map (subst s l) li - and subst_decl s l (id, exp) = (id, subst s l exp) + and subst_decl s l decl = { decl with def = subst_lfun s l decl.def } + and subst_lfun s l lf = + let params, l' = bind_params lf.params l in + { lf with params; body = subst s l' lf.body } and subst_case s l (key, case) = (key, subst s l case) and subst_strcase s l (key, case) = (key, subst s l case) and subst_opt s l = function | None -> None | Some e -> Some (subst s l e) in - subst s Ident.Map.empty input_lam + { subst_lambda = (fun lam -> subst s Ident.Map.empty lam); + subst_lfunction = (fun lfun -> subst_lfun s Ident.Map.empty lfun); + } + +let subst update_env ?freshen_bound_variables s = + (build_substs update_env ?freshen_bound_variables s).subst_lambda let rename idmap lam = - let update_env oldid vd env = + let update_env oldid (vd, mode) env = let newid = Ident.Map.find oldid idmap in - Env.add_value_lazy newid vd env + Env.add_value_lazy ~mode newid vd env in let s = Ident.Map.map (fun new_id -> Lvar new_id) idmap in subst update_env s lam -let duplicate lam = - subst - (fun _ _ env -> env) - ~freshen_bound_variables:true - Ident.Map.empty - lam +let duplicate_function = + (build_substs + (fun _ _ env -> env) + ~freshen_bound_variables:true + Ident.Map.empty).subst_lfunction + +let map_lfunction f { kind; params; return; body; attr; loc; + mode; ret_mode; region } = + let body = f body in + { kind; params; return; body; attr; loc; mode; ret_mode; region } let shallow_map ~tail ~non_tail:f = function | Lvar _ @@ -1271,15 +1504,18 @@ let shallow_map ~tail ~non_tail:f = function ap_specialised; ap_probe; } - | Lfunction { kind; params; return; body; attr; loc; mode; region } -> - Lfunction { kind; params; return; body = f body; attr; loc; - mode; region } + | Lfunction lfun -> + Lfunction (map_lfunction f lfun) | Llet (str, layout, v, e1, e2) -> Llet (str, layout, v, f e1, tail e2) | Lmutlet (layout, v, e1, e2) -> Lmutlet (layout, v, f e1, tail e2) | Lletrec (idel, e2) -> - Lletrec (List.map (fun (v, e) -> (v, f e)) idel, tail e2) + Lletrec + (List.map (fun rb -> + { rb with def = map_lfunction f rb.def }) + idel, + tail e2) | Lprim (Psequand as p, [l1; l2], loc) | Lprim (Psequor as p, [l1; l2], loc) -> Lprim(p, [f l1; tail l2], loc) @@ -1302,8 +1538,8 @@ let shallow_map ~tail ~non_tail:f = function loc, layout) | Lstaticraise (i, args) -> Lstaticraise (i, List.map f args) - | Lstaticcatch (body, id, handler, layout) -> - Lstaticcatch (tail body, id, tail handler, layout) + | Lstaticcatch (body, id, handler, r, layout) -> + Lstaticcatch (tail body, id, tail handler, r, layout) | Ltrywith (e1, v, e2, layout) -> Ltrywith (f e1, v, tail e2, layout) | Lifthenelse (e1, e2, e3, layout) -> @@ -1427,6 +1663,28 @@ let mod_field ?(read_semantics=Reads_agree) pos = let mod_setfield pos = Psetfield (pos, Pointer, Root_initialization) +let alloc_mode_of_primitive_description (p : external_call_description) = + if not Config.stack_allocation then + if p.prim_alloc then Some alloc_heap else None + else + match p.prim_native_repr_res with + | Prim_local, _ -> + (* For primitives that might allocate locally, [p.prim_alloc] just says + whether [caml_c_call] is required, without telling us anything + about local allocation. (However if [p.prim_alloc = false] we + do actually know that the primitive does not allocate on the heap.) *) + Some alloc_local + | (Prim_global | Prim_poly), _ -> + (* For primitives that definitely do not allocate locally, + [p.prim_alloc = false] actually tells us that the primitive does + not allocate at all. + + No external call that is [Prim_poly] may allocate locally. + *) + if p.prim_alloc then Some alloc_heap else None + +(* Changes to this function may also require changes in Flambda 2 (e.g. + closure_conversion.ml). *) let primitive_may_allocate : primitive -> alloc_mode option = function | Pbytes_to_string | Pbytes_of_string | Parray_to_iarray | Parray_of_iarray @@ -1435,19 +1693,22 @@ let primitive_may_allocate : primitive -> alloc_mode option = function | Pmakeblock (_, _, _, m) -> Some m | Pmakefloatblock (_, m) -> Some m | Pmakeufloatblock (_, m) -> Some m + | Pmakemixedblock (_, _, _, m) -> Some m | Pfield _ | Pfield_computed _ | Psetfield _ | Psetfield_computed _ -> None | Pfloatfield (_, _, m) -> Some m | Pufloatfield _ -> None + | Pmixedfield (_, read, _, _) -> begin + match read with + | Mread_value_prefix _ -> None + | Mread_flat_suffix (Flat_read_float_boxed m) -> Some m + | Mread_flat_suffix (Flat_read _) -> None + end | Psetfloatfield _ -> None | Psetufloatfield _ -> None + | Psetmixedfield _ -> None | Pduprecord _ -> Some alloc_heap | Pmake_unboxed_product _ | Punboxed_product_field _ -> None - | Pccall p -> - if not p.prim_alloc then None - else begin match p.prim_native_repr_res with - | (Prim_local|Prim_poly), _ -> Some alloc_local - | Prim_global, _ -> Some alloc_heap - end + | Pccall p -> alloc_mode_of_primitive_description p | Praise _ -> None | Psequor | Psequand | Pnot | Pnegint | Paddint | Psubint | Pmulint @@ -1455,25 +1716,29 @@ let primitive_may_allocate : primitive -> alloc_mode option = function | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintcomp _ - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ | Poffsetint _ | Poffsetref _ -> None - | Pintoffloat -> None - | Pfloatofint m -> Some m - | Pnegfloat m | Pabsfloat m - | Paddfloat m | Psubfloat m - | Pmulfloat m | Pdivfloat m -> Some m - | Pfloatcomp _ -> None + | Pintoffloat _ -> None + | Pfloatofint (_, m) -> Some m + | Pfloatoffloat32 m -> Some m + | Pfloat32offloat m -> Some m + | Pnegfloat (_, m) | Pabsfloat (_, m) + | Paddfloat (_, m) | Psubfloat (_, m) + | Pmulfloat (_, m) | Pdivfloat (_, m) -> Some m + | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) -> None | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets -> None | Pmakearray (_, _, m) -> Some m | Pduparray _ -> Some alloc_heap | Parraylength _ -> None | Parraysetu _ | Parraysets _ - | Parrayrefu (Paddrarray_ref | Pintarray_ref) - | Parrayrefs (Paddrarray_ref | Pintarray_ref) -> None - | Parrayrefu (Pgenarray_ref m | Pfloatarray_ref m) - | Parrayrefs (Pgenarray_ref m | Pfloatarray_ref m) -> Some m + | Parrayrefu ((Paddrarray_ref | Pintarray_ref + | Punboxedfloatarray_ref _ | Punboxedintarray_ref _), _) + | Parrayrefs ((Paddrarray_ref | Pintarray_ref + | Punboxedfloatarray_ref _ | Punboxedintarray_ref _), _) -> None + | Parrayrefu ((Pgenarray_ref m | Pfloatarray_ref m), _) + | Parrayrefs ((Pgenarray_ref m | Pfloatarray_ref m), _) -> Some m | Pisint _ | Pisout -> None | Pintofbint _ -> None | Pbintofint (_,m) @@ -1490,22 +1755,42 @@ let primitive_may_allocate : primitive -> alloc_mode option = function | Plslbint (_, m) | Plsrbint (_, m) | Pasrbint (_, m) -> Some m - | Pbintcomp _ -> None + | Pbintcomp _ | Punboxed_int_comp _ -> None | Pbigarrayset _ | Pbigarraydim _ -> None | Pbigarrayref (_, _, _, _) -> (* Boxes arising from Bigarray access are always Alloc_heap *) Some alloc_heap | Pstring_load_16 _ | Pbytes_load_16 _ -> None | Pstring_load_32 (_, m) | Pbytes_load_32 (_, m) + | Pstring_load_f32 (_, m) | Pbytes_load_f32 (_, m) | Pstring_load_64 (_, m) | Pbytes_load_64 (_, m) | Pstring_load_128 { mode = m; _ } | Pbytes_load_128 { mode = m; _ } + | Pfloatarray_load_128 { mode = m; _ } + | Pfloat_array_load_128 { mode = m; _ } + | Pint_array_load_128 { mode = m; _ } + | Punboxed_float_array_load_128 { mode = m; _ } + | Punboxed_float32_array_load_128 { mode = m; _ } + | Punboxed_int32_array_load_128 { mode = m; _ } + | Punboxed_int64_array_load_128 { mode = m; _ } + | Punboxed_nativeint_array_load_128 { mode = m; _ } | Pget_header m -> Some m - | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_64 _ | Pbytes_set_128 _ -> None + | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_f32 _ + | Pbytes_set_64 _ | Pbytes_set_128 _ -> None | Pbigstring_load_16 _ -> None - | Pbigstring_load_32 (_,m) | Pbigstring_load_64 (_,m) - | Pbigstring_load_128 { mode = m; _ } -> Some m - | Pbigstring_set_16 _ | Pbigstring_set_32 _ - | Pbigstring_set_64 _ | Pbigstring_set_128 _ -> None + | Pbigstring_load_32 { mode = m; boxed = true; _ } + | Pbigstring_load_f32 { mode = m; boxed = true; _ } + | Pbigstring_load_64 { mode = m; boxed = true; _ } + | Pbigstring_load_128 { mode = m; boxed = true; _ } -> Some m + | Pbigstring_load_32 { boxed = false; _ } + | Pbigstring_load_f32 { boxed = false; _ } + | Pbigstring_load_64 { boxed = false; _ } + | Pbigstring_load_128 { boxed = false; _ } -> None + | Pbigstring_set_16 _ | Pbigstring_set_32 _ | Pbigstring_set_f32 _ + | Pbigstring_set_64 _ | Pbigstring_set_128 _ + | Pfloatarray_set_128 _ | Pfloat_array_set_128 _ | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _ | Punboxed_float32_array_set_128 _ + | Punboxed_int32_array_set_128 _ | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ -> None | Pctconst _ -> None | Pbswap16 -> None | Pbbswap (_, m) -> Some m @@ -1514,45 +1799,84 @@ let primitive_may_allocate : primitive -> alloc_mode option = function | Pprobe_is_enabled _ -> None | Pobj_dup -> Some alloc_heap | Pobj_magic _ -> None - | Punbox_float | Punbox_int _ -> None - | Pbox_float m | Pbox_int (_, m) -> Some m + | Punbox_float _ | Punbox_int _ -> None + | Pbox_float (_, m) | Pbox_int (_, m) -> Some m | Prunstack | Presume | Pperform | Preperform -> - Misc.fatal_error "Effects-related primitives are not yet supported" + (* CR mshinwell: check *) + Some alloc_heap | Patomic_load _ | Patomic_exchange | Patomic_cas | Patomic_fetch_add - | Pdls_get -> None - -let constant_layout = function + | Pdls_get + | Preinterpret_unboxed_int64_as_tagged_int63 -> None + | Preinterpret_tagged_int63_as_unboxed_int64 -> + if !Clflags.native_code then None + else + (* We don't provide a locally-allocating version of this primitive + since it would only apply to bytecode, and code requiring performance + at a level where these primitives are necessary is very likely going + to be native. *) + Some alloc_heap + +let constant_layout: constant -> layout = function | Const_int _ | Const_char _ -> Pvalue Pintval | Const_string _ -> Pvalue Pgenval | Const_int32 _ -> Pvalue (Pboxedintval Pint32) | Const_int64 _ -> Pvalue (Pboxedintval Pint64) | Const_nativeint _ -> Pvalue (Pboxedintval Pnativeint) - | Const_float _ -> Pvalue Pfloatval + | Const_unboxed_int32 _ -> Punboxed_int Pint32 + | Const_unboxed_int64 _ -> Punboxed_int Pint64 + | Const_unboxed_nativeint _ -> Punboxed_int Pnativeint + | Const_float _ -> Pvalue (Pboxedfloatval Pfloat64) + | Const_float32 _ -> Pvalue (Pboxedfloatval Pfloat32) + | Const_unboxed_float _ -> Punboxed_float Pfloat64 + | Const_unboxed_float32 _ -> Punboxed_float Pfloat32 let structured_constant_layout = function | Const_base const -> constant_layout const - | Const_block _ | Const_immstring _ -> Pvalue Pgenval + | Const_mixed_block _ | Const_block _ | Const_immstring _ -> Pvalue Pgenval | Const_float_array _ | Const_float_block _ -> Pvalue (Parrayval Pfloatarray) -let layout_of_native_repr : Primitive.native_repr -> _ = function +let layout_of_extern_repr : extern_repr -> _ = function | Untagged_int -> layout_int | Unboxed_vector v -> layout_boxed_vector v - | Unboxed_float -> layout_boxed_float + | Unboxed_float bf -> layout_boxed_float bf | Unboxed_integer bi -> layout_boxedint bi | Same_as_ocaml_repr s -> begin match s with | Value -> layout_any_value - | Float64 -> layout_unboxed_float + | Float64 -> layout_unboxed_float Pfloat64 + | Float32 -> layout_unboxed_float Pfloat32 + | Word -> layout_unboxed_nativeint + | Bits32 -> layout_unboxed_int32 + | Bits64 -> layout_unboxed_int64 | Void -> assert false end let array_ref_kind_result_layout = function | Pintarray_ref -> layout_int - | Pfloatarray_ref _ -> layout_boxed_float - | Pgenarray_ref _ | Paddrarray_ref -> layout_field + | Pfloatarray_ref _ -> layout_boxed_float Pfloat64 + | Punboxedfloatarray_ref bf -> layout_unboxed_float bf + | Pgenarray_ref _ | Paddrarray_ref -> layout_value_field + | Punboxedintarray_ref Pint32 -> layout_unboxed_int32 + | Punboxedintarray_ref Pint64 -> layout_unboxed_int64 + | Punboxedintarray_ref Pnativeint -> layout_unboxed_nativeint + +let layout_of_mixed_field (kind : mixed_block_read) = + match kind with + | Mread_value_prefix _ -> layout_value_field + | Mread_flat_suffix (Flat_read_float_boxed (_ : alloc_mode)) -> + layout_boxed_float Pfloat64 + | Mread_flat_suffix (Flat_read proj) -> + match proj with + | Imm -> layout_int + | Float64 -> layout_unboxed_float Pfloat64 + | Float32 -> layout_unboxed_float Pfloat32 + | Bits32 -> layout_unboxed_int32 + | Bits64 -> layout_unboxed_int64 + | Word -> layout_unboxed_nativeint + | Float_boxed -> layout_boxed_float Pfloat64 let primitive_result_layout (p : primitive) = assert !Clflags.native_code; @@ -1560,23 +1884,33 @@ let primitive_result_layout (p : primitive) = | Popaque layout | Pobj_magic layout -> layout | Pbytes_to_string | Pbytes_of_string -> layout_string | Pignore | Psetfield _ | Psetfield_computed _ | Psetfloatfield _ | Poffsetref _ - | Psetufloatfield _ + | Psetufloatfield _ | Psetmixedfield _ | Pbytessetu | Pbytessets | Parraysetu _ | Parraysets _ | Pbigarrayset _ - | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_64 _ | Pbytes_set_128 _ - | Pbigstring_set_16 _ | Pbigstring_set_32 _ | Pbigstring_set_64 _ | Pbigstring_set_128 _ + | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_f32 _ | Pbytes_set_64 _ + | Pbytes_set_128 _ | Pbigstring_set_16 _ | Pbigstring_set_32 _ | Pbigstring_set_f32 _ + | Pbigstring_set_64 _ | Pbigstring_set_128 _ + | Pfloatarray_set_128 _ | Pfloat_array_set_128 _ | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _ | Punboxed_float32_array_set_128 _ + | Punboxed_int32_array_set_128 _ | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ -> layout_unit | Pgetglobal _ | Psetglobal _ | Pgetpredef _ -> layout_module_field | Pmakeblock _ | Pmakefloatblock _ | Pmakearray _ | Pduprecord _ - | Pmakeufloatblock _ + | Pmakeufloatblock _ | Pmakemixedblock _ | Pduparray _ | Pbigarraydim _ | Pobj_dup -> layout_block - | Pfield _ | Pfield_computed _ -> layout_field + | Pfield _ | Pfield_computed _ -> layout_value_field | Punboxed_product_field (field, layouts) -> (Array.of_list layouts).(field) | Pmake_unboxed_product layouts -> layout_unboxed_product layouts - | Pfloatfield _ | Pfloatofint _ | Pnegfloat _ | Pabsfloat _ - | Paddfloat _ | Psubfloat _ | Pmulfloat _ | Pdivfloat _ - | Pbox_float _ -> layout_boxed_float - | Pufloatfield _ | Punbox_float -> Punboxed_float - | Pccall { prim_native_repr_res = _, repr_res } -> layout_of_native_repr repr_res + | Pfloatfield _ -> layout_boxed_float Pfloat64 + | Pfloatoffloat32 _ -> layout_boxed_float Pfloat64 + | Pfloat32offloat _ -> layout_boxed_float Pfloat32 + | Pfloatofint (f, _) | Pnegfloat (f, _) | Pabsfloat (f, _) + | Paddfloat (f, _) | Psubfloat (f, _) | Pmulfloat (f, _) | Pdivfloat (f, _) + | Pbox_float (f, _) -> layout_boxed_float f + | Pufloatfield _ -> Punboxed_float Pfloat64 + | Punbox_float float_kind -> Punboxed_float float_kind + | Pmixedfield (_, kind, _, _) -> layout_of_mixed_field kind + | Pccall { prim_native_repr_res = _, repr_res } -> layout_of_extern_repr repr_res | Praise _ -> layout_bottom | Psequor | Psequand | Pnot | Pnegint | Paddint | Psubint | Pmulint @@ -1584,16 +1918,17 @@ let primitive_result_layout (p : primitive) = | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintcomp _ - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ - | Poffsetint _ | Pintoffloat | Pfloatcomp _ + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ + | Poffsetint _ | Pintoffloat _ + | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytesrefs | Parraylength _ | Pisint _ | Pisout | Pintofbint _ - | Pbintcomp _ + | Pbintcomp _ | Punboxed_int_comp _ | Pstring_load_16 _ | Pbytes_load_16 _ | Pbigstring_load_16 _ | Pprobe_is_enabled _ | Pbswap16 -> layout_int - | Parrayrefu array_ref_kind | Parrayrefs array_ref_kind -> + | Parrayrefu (array_ref_kind, _) | Parrayrefs (array_ref_kind, _) -> array_ref_kind_result_layout array_ref_kind | Pbintofint (bi, _) | Pcvtbint (_,bi,_) | Pnegbint (bi, _) | Paddbint (bi, _) | Psubbint (bi, _) @@ -1603,16 +1938,43 @@ let primitive_result_layout (p : primitive) = | Pbbswap (bi, _) | Pbox_int (bi, _) -> layout_boxedint bi | Punbox_int bi -> Punboxed_int bi - | Pstring_load_32 _ | Pbytes_load_32 _ | Pbigstring_load_32 _ -> + | Pstring_load_32 _ | Pbytes_load_32 _ + | Pbigstring_load_32 { boxed = true; _ } -> layout_boxedint Pint32 - | Pstring_load_64 _ | Pbytes_load_64 _ | Pbigstring_load_64 _ -> + | Pstring_load_f32 _ | Pbytes_load_f32 _ + | Pbigstring_load_f32 { boxed = true; _ } -> + layout_boxed_float Pfloat32 + | Pstring_load_64 _ | Pbytes_load_64 _ + | Pbigstring_load_64 { boxed = true; _ } -> layout_boxedint Pint64 - | Pstring_load_128 _ | Pbytes_load_128 _ | Pbigstring_load_128 _ -> + | Pstring_load_128 _ | Pbytes_load_128 _ + | Pbigstring_load_128 { boxed = true; _ } -> layout_boxed_vector (Pvec128 Int8x16) + | Pbigstring_load_32 { boxed = false; _ } -> layout_unboxed_int Pint32 + | Pbigstring_load_f32 { boxed = false; _ } -> layout_unboxed_float Pfloat32 + | Pbigstring_load_64 { boxed = false; _ } -> layout_unboxed_int Pint64 + | Pbigstring_load_128 { boxed = false; _ } -> + layout_unboxed_vector (Pvec128 Int8x16) + | Pfloatarray_load_128 _ | Pfloat_array_load_128 _ + | Punboxed_float_array_load_128 _ -> + layout_boxed_vector (Pvec128 Float64x2) + | Punboxed_float32_array_load_128 _ -> + layout_boxed_vector (Pvec128 Float32x4) + | Pint_array_load_128 _ | Punboxed_int64_array_load_128 _ + | Punboxed_nativeint_array_load_128 _ -> + (* 128-bit types are only supported in the x86_64 backend, so we may + assume that nativeint is 64 bits. *) + layout_boxed_vector (Pvec128 Int64x2) + | Punboxed_int32_array_load_128 _ -> + layout_boxed_vector (Pvec128 Int32x4) | Pbigarrayref (_, _, kind, _) -> begin match kind with | Pbigarray_unknown -> layout_any_value - | Pbigarray_float32 | Pbigarray_float64 -> layout_boxed_float + | Pbigarray_float32 -> + (* float32 bigarrays return 64-bit floats for backward compatibility. *) + layout_boxed_float Pfloat64 + | Pbigarray_float32_t -> layout_boxed_float Pfloat32 + | Pbigarray_float64 -> layout_boxed_float Pfloat64 | Pbigarray_sint8 | Pbigarray_uint8 | Pbigarray_sint16 | Pbigarray_uint16 | Pbigarray_caml_int -> layout_int @@ -1624,7 +1986,7 @@ let primitive_result_layout (p : primitive) = end | Pctconst ( Big_endian | Word_size | Int_size | Max_wosize - | Ostype_unix | Ostype_cygwin | Ostype_win32 | Backend_type + | Ostype_unix | Ostype_cygwin | Ostype_win32 | Backend_type | Runtime5 ) -> (* Compile-time constants only ever return ints for now, enumerate them all to be sure to modify this if it becomes wrong. *) @@ -1634,15 +1996,15 @@ let primitive_result_layout (p : primitive) = layout_any_value | (Parray_to_iarray | Parray_of_iarray) -> layout_any_value | Pget_header _ -> layout_boxedint Pnativeint - | Prunstack | Presume | Pperform | Preperform -> - (* CR mshinwell/ncourant: to be thought about later *) - Misc.fatal_error "Effects-related primitives are not yet supported" + | Prunstack | Presume | Pperform | Preperform -> layout_any_value | Patomic_load { immediate_or_pointer = Immediate } -> layout_int | Patomic_load { immediate_or_pointer = Pointer } -> layout_any_value | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Pdls_get -> layout_any_value + | Preinterpret_tagged_int63_as_unboxed_int64 -> layout_unboxed_int64 + | Preinterpret_unboxed_int64_as_tagged_int63 -> layout_int let compute_expr_layout free_vars_kind lam = let rec compute_expr_layout kinds = function @@ -1662,14 +2024,14 @@ let compute_expr_layout free_vars_kind lam = compute_expr_layout (Ident.Map.add id kind kinds) body | Lletrec(defs, body) -> let kinds = - List.fold_left (fun kinds (id, _) -> Ident.Map.add id layout_letrec kinds) + List.fold_left (fun kinds { id } -> Ident.Map.add id layout_letrec kinds) kinds defs in compute_expr_layout kinds body | Lprim(p, _, _) -> primitive_result_layout p | Lswitch(_, _, _, kind) | Lstringswitch(_, _, _, _, kind) - | Lstaticcatch(_, _, _, kind) | Ltrywith(_, _, _, kind) + | Lstaticcatch(_, _, _, _, kind) | Ltrywith(_, _, _, kind) | Lifthenelse(_, _, _, kind) | Lregion (_, kind) -> kind | Lstaticraise (_, _) -> @@ -1687,18 +2049,72 @@ let array_ref_kind mode = function | Paddrarray -> Paddrarray_ref | Pintarray -> Pintarray_ref | Pfloatarray -> Pfloatarray_ref mode + | Punboxedintarray int_kind -> Punboxedintarray_ref int_kind + | Punboxedfloatarray float_kind -> Punboxedfloatarray_ref float_kind let array_set_kind mode = function | Pgenarray -> Pgenarray_set mode | Paddrarray -> Paddrarray_set mode | Pintarray -> Pintarray_set | Pfloatarray -> Pfloatarray_set - -let is_check_enabled ~opt property = - match property with - | Zero_alloc -> - match !Clflags.zero_alloc_check with - | No_check -> false - | Check_all -> true - | Check_default -> not opt - | Check_opt_only -> opt + | Punboxedintarray int_kind -> Punboxedintarray_set int_kind + | Punboxedfloatarray float_kind -> Punboxedfloatarray_set float_kind + +let may_allocate_in_region lam = + (* loop_region raises, if the lambda might allocate in parent region *) + let rec loop_region lam = + shallow_iter ~tail:(function + | Lexclave body -> loop body + | lam -> loop_region lam + ) ~non_tail:(fun lam -> loop_region lam) lam + and loop = function + | Lvar _ | Lmutvar _ | Lconst _ -> () + + | Lfunction {mode=Alloc_heap} -> () + | Lfunction {mode=Alloc_local} -> raise Exit + + | Lapply {ap_mode=Alloc_local} + | Lsend (_,_,_,_,_,Alloc_local,_,_) -> raise Exit + + | Lprim (prim, args, _) -> + begin match primitive_may_allocate prim with + | Some Alloc_local -> raise Exit + | None | Some Alloc_heap -> + List.iter loop args + end + | Lregion (body, _layout) -> + (* [body] might allocate in the parent region because of exclave, and thus + [Lregion body] might allocate in the current region *) + loop_region body + | Lexclave _body -> + (* [_body] might do local allocations, but not in the current region; + rather, it's in the parent region *) + () + | Lwhile {wh_cond; wh_body} -> loop wh_cond; loop wh_body + | Lfor {for_from; for_to; for_body} -> loop for_from; loop for_to; loop for_body + | ( Lapply _ | Llet _ | Lmutlet _ | Lletrec _ | Lswitch _ | Lstringswitch _ + | Lstaticraise _ | Lstaticcatch _ | Ltrywith _ + | Lifthenelse _ | Lsequence _ | Lassign _ | Lsend _ + | Levent _ | Lifused _) as lam -> + iter_head_constructor loop lam + in + if not Config.stack_allocation then false + else begin + match loop lam with + | () -> false + | exception Exit -> true + end + +let simple_prim_on_values ~name ~arity ~alloc = + Primitive.make + ~name + ~alloc + ~c_builtin:false + ~effects:Arbitrary_effects + ~coeffects:Has_coeffects + ~native_name:"" + ~native_repr_args: + (Primitive.make_prim_repr_args arity + (Primitive.Prim_global,Same_as_ocaml_repr Jkind.Sort.Value)) + ~native_repr_res:(Prim_global, Same_as_ocaml_repr Jkind.Sort.Value) + ~is_layout_poly:false diff --git a/lambda/lambda.mli b/lambda/lambda.mli index 0a2d13a99c2..0af7436aaad 100644 --- a/lambda/lambda.mli +++ b/lambda/lambda.mli @@ -17,6 +17,8 @@ open Asttypes +type constant = Typedtree.constant + (* Overriding Asttypes.mutable_flag *) type mutable_flag = Immutable | Immutable_unique | Mutable @@ -29,6 +31,7 @@ type compile_time_constant = | Ostype_win32 | Ostype_cygwin | Backend_type + | Runtime5 type immediate_or_pointer = | Immediate @@ -55,6 +58,8 @@ val modify_heap : modify_mode val modify_maybe_stack : modify_mode +val equal_alloc_mode : alloc_mode -> alloc_mode -> bool + type initialization_or_assignment = (* [Assignment Alloc_local] is a mutation of a block that may be heap or local. [Assignment Alloc_heap] is a mutation of a block that's definitely heap. *) @@ -81,6 +86,26 @@ type region_close = | Rc_nontail (* do not close region, must not TCO *) | Rc_close_at_apply (* close region and tail call *) +(** Notes about applytail (as emitted by Printlambda) a.k.a. Rc_close_at_apply: + + applytail / Rc_close_at_apply means that a call occurs in tail position of + the nearest enclosing region, and should be compiled by closing that region + (and only that region) just before control is transferred to the call. + + In the raw lambda generated by Translcore, this can occur only in tail + position of a function, so these do happen to be tail calls. But after + inlining (by Simplif or otherwise), this may no longer be the case. + + In particular, this code pattern: + + (function (region (.... (region ... (applytail f))))) + + means that the applytail is in tail position of the inner region and closes + that one. It just so happens to be at the end of the outer function as well, + but it does not mean that it's a tail call of that function. (It's not a + tail call because the outer region needs to end there.) +*) + (* CR layouts v5: When we add more blocks of non-scannable values, consider whether some of the primitives specific to ufloat records ([Pmakeufloatblock], [Pufloatfield], and [Psetufloatfield]) can/should be @@ -97,14 +122,22 @@ type primitive = | Pmakeblock of int * mutable_flag * block_shape * alloc_mode | Pmakefloatblock of mutable_flag * alloc_mode | Pmakeufloatblock of mutable_flag * alloc_mode + | Pmakemixedblock of int * mutable_flag * mixed_block_shape * alloc_mode | Pfield of int * immediate_or_pointer * field_read_semantics | Pfield_computed of field_read_semantics | Psetfield of int * immediate_or_pointer * initialization_or_assignment | Psetfield_computed of immediate_or_pointer * initialization_or_assignment | Pfloatfield of int * field_read_semantics * alloc_mode | Pufloatfield of int * field_read_semantics + | Pmixedfield of + int * mixed_block_read * mixed_block_shape * field_read_semantics + (* [Pmixedfield] is an access to either the flat suffix or value prefix of a + mixed record. + *) | Psetfloatfield of int * initialization_or_assignment | Psetufloatfield of int * initialization_or_assignment + | Psetmixedfield of + int * mixed_block_write * mixed_block_shape * initialization_or_assignment | Pduprecord of Types.record_representation * int (* Unboxed products *) | Pmake_unboxed_product of layout list @@ -116,7 +149,7 @@ type primitive = | Presume | Preperform (* External call *) - | Pccall of Primitive.description + | Pccall of external_call_description (* Exceptions *) | Praise of raise_kind (* Boolean operations *) @@ -128,15 +161,24 @@ type primitive = | Plslint | Plsrint | Pasrint | Pintcomp of integer_comparison (* Comparisons that return int (not bool like above) for ordering *) - | Pcompare_ints | Pcompare_floats | Pcompare_bints of boxed_integer + | Pcompare_ints + | Pcompare_floats of boxed_float + | Pcompare_bints of boxed_integer | Poffsetint of int | Poffsetref of int (* Float operations *) - | Pintoffloat | Pfloatofint of alloc_mode - | Pnegfloat of alloc_mode | Pabsfloat of alloc_mode - | Paddfloat of alloc_mode | Psubfloat of alloc_mode - | Pmulfloat of alloc_mode | Pdivfloat of alloc_mode - | Pfloatcomp of float_comparison + | Pfloatoffloat32 of alloc_mode + | Pfloat32offloat of alloc_mode + | Pintoffloat of boxed_float + | Pfloatofint of boxed_float * alloc_mode + | Pnegfloat of boxed_float * alloc_mode + | Pabsfloat of boxed_float * alloc_mode + | Paddfloat of boxed_float * alloc_mode + | Psubfloat of boxed_float * alloc_mode + | Pmulfloat of boxed_float * alloc_mode + | Pdivfloat of boxed_float * alloc_mode + | Pfloatcomp of boxed_float * float_comparison + | Punboxed_float_comp of boxed_float * float_comparison (* String operations *) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets @@ -147,10 +189,10 @@ type primitive = The arguments of [Pduparray] give the kind and mutability of the array being *produced* by the duplication. *) | Parraylength of array_kind - | Parrayrefu of array_ref_kind - | Parraysetu of array_set_kind - | Parrayrefs of array_ref_kind - | Parraysets of array_set_kind + | Parrayrefu of array_ref_kind * array_index_kind + | Parraysetu of array_set_kind * array_index_kind + | Parrayrefs of array_ref_kind * array_index_kind + | Parraysets of array_set_kind * array_index_kind (* Test if the argument is a block or an immediate integer *) | Pisint of { variant_only : bool } (* Test if the (integer) argument is outside an interval *) @@ -173,6 +215,7 @@ type primitive = | Plsrbint of boxed_integer * alloc_mode | Pasrbint of boxed_integer * alloc_mode | Pbintcomp of boxed_integer * integer_comparison + | Punboxed_int_comp of unboxed_integer * integer_comparison (* Operations on Bigarrays: (unsafe, #dimensions, kind, layout) *) | Pbigarrayref of bool * int * bigarray_kind * bigarray_layout | Pbigarrayset of bool * int * bigarray_kind * bigarray_layout @@ -181,26 +224,49 @@ type primitive = (* load/set 16,32,64,128 bits from a string: (unsafe)*) | Pstring_load_16 of bool | Pstring_load_32 of bool * alloc_mode + | Pstring_load_f32 of bool * alloc_mode | Pstring_load_64 of bool * alloc_mode | Pstring_load_128 of { unsafe : bool; mode: alloc_mode } | Pbytes_load_16 of bool | Pbytes_load_32 of bool * alloc_mode + | Pbytes_load_f32 of bool * alloc_mode | Pbytes_load_64 of bool * alloc_mode | Pbytes_load_128 of { unsafe : bool; mode: alloc_mode } | Pbytes_set_16 of bool | Pbytes_set_32 of bool + | Pbytes_set_f32 of bool | Pbytes_set_64 of bool | Pbytes_set_128 of { unsafe : bool } (* load/set 16,32,64,128 bits from a (char, int8_unsigned_elt, c_layout) Bigarray.Array1.t : (unsafe) *) - | Pbigstring_load_16 of bool - | Pbigstring_load_32 of bool * alloc_mode - | Pbigstring_load_64 of bool * alloc_mode - | Pbigstring_load_128 of { aligned : bool; unsafe : bool; mode: alloc_mode } - | Pbigstring_set_16 of bool - | Pbigstring_set_32 of bool - | Pbigstring_set_64 of bool - | Pbigstring_set_128 of { aligned : bool; unsafe : bool } + | Pbigstring_load_16 of { unsafe : bool } + | Pbigstring_load_32 of { unsafe : bool; mode: alloc_mode; boxed : bool } + | Pbigstring_load_f32 of { unsafe : bool; mode: alloc_mode; boxed : bool } + | Pbigstring_load_64 of { unsafe : bool; mode: alloc_mode; boxed : bool } + | Pbigstring_load_128 of { aligned : bool; unsafe : bool; mode: alloc_mode; + boxed : bool } + | Pbigstring_set_16 of { unsafe : bool } + | Pbigstring_set_32 of { unsafe : bool; boxed : bool } + | Pbigstring_set_f32 of { unsafe : bool; boxed : bool } + | Pbigstring_set_64 of { unsafe : bool; boxed : bool } + | Pbigstring_set_128 of { aligned : bool; unsafe : bool; boxed : bool } + (* load/set SIMD vectors in GC-managed arrays *) + | Pfloatarray_load_128 of { unsafe : bool; mode : alloc_mode } + | Pfloat_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Pint_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_float_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_float32_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_int32_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_int64_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Punboxed_nativeint_array_load_128 of { unsafe : bool; mode : alloc_mode } + | Pfloatarray_set_128 of { unsafe : bool } + | Pfloat_array_set_128 of { unsafe : bool } + | Pint_array_set_128 of { unsafe : bool } + | Punboxed_float_array_set_128 of { unsafe : bool } + | Punboxed_float32_array_set_128 of { unsafe : bool } + | Punboxed_int32_array_set_128 of { unsafe : bool } + | Punboxed_int64_array_set_128 of { unsafe : bool } + | Punboxed_nativeint_array_set_128 of { unsafe : bool } (* Compile time constants *) | Pctconst of compile_time_constant (* byte swap *) @@ -220,10 +286,21 @@ type primitive = (* Primitives for [Obj] *) | Pobj_dup | Pobj_magic of layout - | Punbox_float - | Pbox_float of alloc_mode + | Punbox_float of boxed_float + | Pbox_float of boxed_float * alloc_mode | Punbox_int of boxed_integer | Pbox_int of boxed_integer * alloc_mode + | Preinterpret_unboxed_int64_as_tagged_int63 + | Preinterpret_tagged_int63_as_unboxed_int64 + (** At present [Preinterpret_unboxed_int64_as_tagged_int63] and + [Preinterpret_tagged_int63_as_unboxed_int64] will cause a fatal error + if the target system is 32-bit bytecode. + + The [Preinterpret_tagged_int63_as_unboxed_int64] primitive is the + identity on machine words. The + [Preinterpret_unboxed_int64_as_tagged_int63] compiles to logical OR + with 1 on machine words, to ensure that the tag bit is always set in + the result, just in case it was not in the incoming unboxed int64. *) (* Jane Street extensions *) | Parray_to_iarray (* Unsafely reinterpret a mutable array as an immutable one; O(1) *) @@ -237,6 +314,17 @@ type primitive = (* Fetching domain-local state *) | Pdls_get +(** This is the same as [Primitive.native_repr] but with [Repr_poly] + compiled away. *) +and extern_repr = + | Same_as_ocaml_repr of Jkind.Sort.const + | Unboxed_float of boxed_float + | Unboxed_vector of Primitive.boxed_vector + | Unboxed_integer of Primitive.boxed_integer + | Untagged_int + +and external_call_description = extern_repr Primitive.description_gen + and integer_comparison = Ceq | Cne | Clt | Cgt | Cle | Cge @@ -245,6 +333,8 @@ and float_comparison = and array_kind = Pgenarray | Paddrarray | Pintarray | Pfloatarray + | Punboxedfloatarray of unboxed_float + | Punboxedintarray of unboxed_integer (** When accessing a flat float array, we need to know the mode which we should box the resulting float at. *) @@ -253,6 +343,8 @@ and array_ref_kind = | Paddrarray_ref | Pintarray_ref | Pfloatarray_ref of alloc_mode + | Punboxedfloatarray_ref of unboxed_float + | Punboxedintarray_ref of unboxed_integer (** When updating an array that might contain pointers, we need to know what mode they're at; otherwise, access is uniform. *) @@ -261,12 +353,21 @@ and array_set_kind = | Paddrarray_set of modify_mode | Pintarray_set | Pfloatarray_set + | Punboxedfloatarray_set of unboxed_float + | Punboxedintarray_set of unboxed_integer + +and array_index_kind = + | Ptagged_int_index + | Punboxed_int_index of unboxed_integer and value_kind = - Pgenval | Pfloatval | Pboxedintval of boxed_integer | Pintval + | Pgenval + | Pintval + | Pboxedfloatval of boxed_float + | Pboxedintval of boxed_integer | Pvariant of { consts : int list; - non_consts : (int * value_kind list) list; + non_consts : (int * constructor_shape) list; (** [non_consts] must be non-empty. For constant variants [Pintval] must be used. This causes a small loss of precision but it is not expected to be significant. *) @@ -279,7 +380,7 @@ and value_kind = and layout = | Ptop | Pvalue of value_kind - | Punboxed_float + | Punboxed_float of boxed_float | Punboxed_int of boxed_integer | Punboxed_vector of boxed_vector | Punboxed_product of layout list @@ -288,9 +389,49 @@ and layout = and block_shape = value_kind list option +and flat_element = Types.flat_element = + | Imm + | Float_boxed + | Float64 + | Float32 + | Bits32 + | Bits64 + | Word + +and flat_element_read = private + | Flat_read of flat_element (* invariant: not [Float] *) + | Flat_read_float_boxed of alloc_mode +and mixed_block_read = + | Mread_value_prefix of immediate_or_pointer + | Mread_flat_suffix of flat_element_read +and mixed_block_write = + | Mwrite_value_prefix of immediate_or_pointer + | Mwrite_flat_suffix of flat_element + +and mixed_block_shape = + { value_prefix_len : int; + (* We use an array just so we can index into the middle. *) + flat_suffix : flat_element array; + } + +and constructor_shape = + | Constructor_uniform of value_kind list + | Constructor_mixed of + { value_prefix : value_kind list; + flat_suffix : flat_element list; + } + +and boxed_float = Primitive.boxed_float = + | Pfloat64 + | Pfloat32 + and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and unboxed_float = boxed_float + +and unboxed_integer = boxed_integer + and vec128_type = | Unknown128 | Int8x16 @@ -305,7 +446,8 @@ and boxed_vector = and bigarray_kind = Pbigarray_unknown - | Pbigarray_float32 | Pbigarray_float64 + | Pbigarray_float32 | Pbigarray_float32_t + | Pbigarray_float64 | Pbigarray_sint8 | Pbigarray_uint8 | Pbigarray_sint16 | Pbigarray_uint16 | Pbigarray_int32 | Pbigarray_int64 @@ -332,23 +474,30 @@ val equal_layout : layout -> layout -> bool val compatible_layout : layout -> layout -> bool +val equal_boxed_float : boxed_float -> boxed_float -> bool + val equal_boxed_integer : boxed_integer -> boxed_integer -> bool val equal_boxed_vector_size : boxed_vector -> boxed_vector -> bool +val compare_boxed_vector : boxed_vector -> boxed_vector -> int + +val print_boxed_vector : Format.formatter -> boxed_vector -> unit + val must_be_value : layout -> value_kind (* This is the layout of ocaml values used as arguments to or returned from - primitives for this [native_repr]. So the legacy [Unboxed_float] - which is + primitives for this [extern_repr]. So the legacy [Unboxed_float] - which is a float that is unboxed before being passed to a C function - is mapped to [layout_any_value], while [Same_as_ocaml_repr Float64] is mapped to [layout_unboxed_float]. *) -val layout_of_native_repr : Primitive.native_repr -> layout +val layout_of_extern_repr : extern_repr -> layout type structured_constant = Const_base of constant | Const_block of int * structured_constant list + | Const_mixed_block of int * mixed_block_shape * structured_constant list | Const_float_array of string list | Const_immstring of string | Const_float_block of string list @@ -396,30 +545,24 @@ type local_attribute = | Never_local (* [@local never] *) | Default_local (* [@local maybe] or no [@local] attribute *) -type property = - | Zero_alloc - type poll_attribute = | Error_poll (* [@poll error] *) | Default_poll (* no [@poll] attribute *) -type check_attribute = - | Default_check - | Ignore_assert_all of property - | Check of { property: property; - strict: bool; +type zero_alloc_attribute = + | Default_zero_alloc + | Check of { strict: bool; (* [strict=true] property holds on all paths. [strict=false] if the function returns normally, then the property holds (but property violations on exceptional returns or divering loops are ignored). This definition may not be applicable to new properties. *) - opt: bool; loc: Location.t; } - | Assume of { property: property; - strict: bool; - loc: Location.t; + | Assume of { strict: bool; never_returns_normally: bool; + never_raises: bool; + loc: Location.t; } type loop_attribute = @@ -427,10 +570,12 @@ type loop_attribute = | Never_loop (* [@loop never] *) | Default_loop (* no [@loop] attribute *) -type function_kind = Curried of {nlocal: int} | Tupled +type curried_function_kind = { nlocal: int } [@@unboxed] (* [nlocal] determines how many arguments may be partially applied - before the resulting closure must be locally allocated. - See [lfunction] for details *) + before the resulting closure must be locally allocated. + See [lfunction] for details *) + +type function_kind = Curried of curried_function_kind | Tupled type let_kind = Strict | Alias | StrictOpt (* Meaning of kinds for let x = e in e': @@ -455,15 +600,22 @@ type function_attribute = { inline : inline_attribute; specialise : specialise_attribute; local: local_attribute; - check : check_attribute; + zero_alloc : zero_alloc_attribute; poll: poll_attribute; loop: loop_attribute; is_a_functor: bool; + is_opaque: bool; stub: bool; tmc_candidate: bool; + (* [may_fuse_arity] is true if [simplif.ml] is permitted to fuse arity, i.e., + to perform the rewrite [fun x -> fun y -> e] to [fun x y -> e] *) + may_fuse_arity: bool; + unbox_return: bool; } -type parameter_attribute = No_attributes +type parameter_attribute = { + unbox_param: bool; +} type lparam = { name : Ident.t; @@ -474,6 +626,10 @@ type lparam = { type scoped_location = Debuginfo.Scoped_location.t +type pop_region = + | Popped_region + | Same_region + type lambda = Lvar of Ident.t | Lmutvar of Ident.t @@ -482,7 +638,7 @@ type lambda = | Lfunction of lfunction | Llet of let_kind * layout * Ident.t * lambda * lambda | Lmutlet of layout * Ident.t * lambda * lambda - | Lletrec of (Ident.t * lambda) list * lambda + | Lletrec of rec_binding list * lambda | Lprim of primitive * lambda list * scoped_location | Lswitch of lambda * lambda_switch * scoped_location * layout (* switch on strings, clauses are sorted by string order, @@ -490,7 +646,21 @@ type lambda = | Lstringswitch of lambda * (string * lambda) list * lambda option * scoped_location * layout | Lstaticraise of static_label * lambda list - | Lstaticcatch of lambda * (static_label * (Ident.t * layout) list) * lambda * layout + (* Concerning [Lstaticcatch], the regions that are open in the handler must be + a subset of those open at the point of the [Lstaticraise] that jumps to it, + as we can't reopen closed regions. All regions that were open at the point of + the [Lstaticraise] but not in the handler will be closed just before the [Lstaticraise]. + + However, to be able to express the fact + that the [Lstaticraise] might be under a [Lexclave], the [pop_region] flag + is used to specify what regions are considered open in the handler. If it + is [Same_region], it means that the same regions as those existing at the + point of the [Lstaticraise] are considered open in the handler; if it is [Popped_region], + it means that we consider the top region at the point of the [Lstaticcatch] to not be + considered open inside the handler. *) + | Lstaticcatch of + lambda * (static_label * (Ident.t * layout) list) * lambda + * pop_region * layout | Ltrywith of lambda * Ident.t * lambda * layout (* Lifthenelse (e, t, f, layout) evaluates t if e evaluates to 0, and evaluates f if e evaluates to any other value; layout must be the layout of [t] and [f] *) @@ -504,8 +674,18 @@ type lambda = | Levent of lambda * lambda_event | Lifused of Ident.t * lambda | Lregion of lambda * layout + (* [Lexclave] closes the newest region opened. + Note that [Lexclave] nesting is currently unsupported. *) | Lexclave of lambda +and rec_binding = { + id : Ident.t; + def : lfunction; + (* Generic recursive bindings have been removed from Lambda in 5.2. + [Value_rec_compiler.compile_letrec] deals with transforming generic + definitions into basic Lambda code. *) +} + and lfunction = private { kind: function_kind; params: lparam list; @@ -514,6 +694,7 @@ and lfunction = private attr: function_attribute; (* specified with [@inline] attribute *) loc : scoped_location; mode : alloc_mode; (* alloc mode of the closure itself *) + ret_mode: alloc_mode; region : bool; (* false if this function may locally allocate in the caller's region *) } @@ -603,12 +784,21 @@ val layout_module : layout val layout_functor : layout val layout_module_field : layout val layout_string : layout -val layout_boxed_float : layout -val layout_unboxed_float : layout +val layout_boxed_float : boxed_float -> layout +val layout_unboxed_float : boxed_float -> layout val layout_boxedint : boxed_integer -> layout val layout_boxed_vector : Primitive.boxed_vector -> layout -(* A layout that is Pgenval because it is the field of a block *) -val layout_field : layout +(* A layout that is Pgenval because it is the field of a tuple *) +val layout_tuple_element : layout +(* A layout that is Pgenval because it is the arg of a polymorphic variant *) +val layout_variant_arg : layout +(* A layout that is Pgenval because it is the field of a block being considered + for the tmc transformation +*) +val layout_tmc_field : layout +(* A layout that is Pgenval because it is an optional argument *) +val layout_optional_arg : layout +val layout_value_field : layout val layout_lazy : layout val layout_lazy_contents : layout (* A layout that is Pgenval because we are missing layout polymorphism *) @@ -623,6 +813,10 @@ val layout_unboxed_product : layout list -> layout val layout_top : layout val layout_bottom : layout + +(** [dummy_constant] produces a placeholder value with a recognizable + bit pattern (currently 0xBBBB in its tagged form) *) +val dummy_constant: lambda val name_lambda: let_kind -> lambda -> layout -> (Ident.t -> lambda) -> lambda val name_lambda_list: (lambda * layout) list -> (lambda list -> lambda) -> lambda @@ -634,9 +828,22 @@ val lfunction : attr:function_attribute -> (* specified with [@inline] attribute *) loc:scoped_location -> mode:alloc_mode -> + ret_mode:alloc_mode -> region:bool -> lambda +val lfunction' : + kind:function_kind -> + params:lparam list -> + return:layout -> + body:lambda -> + attr:function_attribute -> (* specified with [@inline] attribute *) + loc:scoped_location -> + mode:alloc_mode -> + ret_mode:alloc_mode -> + region:bool -> + lfunction + val iter_head_constructor: (lambda -> unit) -> lambda -> unit (** [iter_head_constructor f lam] apply [f] to only the first level of @@ -666,10 +873,23 @@ val transl_value_path: scoped_location -> Env.t -> Path.t -> lambda val transl_extension_path: scoped_location -> Env.t -> Path.t -> lambda val transl_class_path: scoped_location -> Env.t -> Path.t -> lambda +val transl_mixed_product_shape: Types.mixed_product_shape -> mixed_block_shape + +type mixed_block_element = + | Value_prefix + | Flat_suffix of flat_element + +(** Raises if the int is out of bounds. *) +val get_mixed_block_element : mixed_block_shape -> int -> mixed_block_element + +(** Raises if [flat_element] is [Float_boxed]. *) +val flat_read_non_float : flat_element -> flat_element_read +val flat_read_float_boxed : alloc_mode -> flat_element_read + val make_sequence: ('a -> lambda) -> 'a list -> lambda val subst: - (Ident.t -> Subst.Lazy.value_description -> Env.t -> Env.t) -> + (Ident.t -> Subst.Lazy.value_description * Mode.Value.l -> Env.t -> Env.t) -> ?freshen_bound_variables:bool -> lambda Ident.Map.t -> lambda -> lambda (** [subst update_env ?freshen_bound_variables s lt] @@ -689,13 +909,16 @@ val rename : Ident.t Ident.Map.t -> lambda -> lambda (** A version of [subst] specialized for the case where we're just renaming idents. *) -val duplicate : lambda -> lambda +val duplicate_function : lfunction -> lfunction (** Duplicate a term, freshening all locally-bound identifiers. *) val map : (lambda -> lambda) -> lambda -> lambda (** Bottom-up rewriting, applying the function on each node from the leaves to the root. *) +val map_lfunction : (lambda -> lambda) -> lfunction -> lfunction + (** Apply the given transformation on the function's body *) + val shallow_map : tail:(lambda -> lambda) -> non_tail:(lambda -> lambda) -> @@ -743,6 +966,10 @@ val primitive_may_allocate : primitive -> alloc_mode option revised. *) +val alloc_mode_of_primitive_description : + external_call_description -> alloc_mode option + (** Like [primitive_may_allocate], for [external] calls. *) + (***********************) (* For static failures *) (***********************) @@ -785,4 +1012,14 @@ val array_ref_kind : alloc_mode -> array_kind -> array_ref_kind (** The mode will be discarded if unnecessary for the given [array_kind] *) val array_set_kind : modify_mode -> array_kind -> array_set_kind -val is_check_enabled : opt:bool -> property -> bool + +(* Returns true if the given lambda can allocate on the local stack *) +val may_allocate_in_region : lambda -> bool + +(* Returns [external_call_description] for [Pccall] assuming arguments + and result all have layout [value] *) +val simple_prim_on_values +: name:string +-> arity:int +-> alloc:bool +-> external_call_description diff --git a/lambda/matching.ml b/lambda/matching.ml index 40feaceb6ba..edb6fd87f0b 100644 --- a/lambda/matching.ml +++ b/lambda/matching.ml @@ -99,31 +99,19 @@ open Printpat module Scoped_location = Debuginfo.Scoped_location type error = - Non_value_layout of Jkind.Violation.t - | Illegal_record_field of Jkind.const + | Void_layout exception Error of Location.t * error let dbg = false -(* CR layouts v5: When we're ready to allow non-values, these can be deleted or - changed to check for void. *) -let jkind_layout_must_be_value loc jkind = - match Jkind.(sub jkind (value ~why:V1_safety_check)) with - | Ok _ -> () - | Error e -> raise (Error (loc, Non_value_layout e)) - -(* CR layouts v5: This function is only used for sanity checking the - typechecker. When we allow arbitrary layouts in structures, it will have - outlived its usefulness and should be deleted. *) -let check_record_field_jkind lbl = - match Jkind.(get_default_value lbl.lbl_jkind), lbl.lbl_repres with - | (Value | Immediate | Immediate64), _ -> () - | Float64, Record_ufloat -> () - | Float64, (Record_boxed _ | Record_inlined _ - | Record_unboxed | Record_float) -> - raise (Error (lbl.lbl_loc, Illegal_record_field Float64)) - | (Any | Void) as c, _ -> raise (Error (lbl.lbl_loc, Illegal_record_field c)) +let jkind_layout_default_to_value_and_check_not_void loc jkind = + let const = Jkind.default_to_value_and_get jkind in + let layout = Jkind.Const.get_layout const in + match layout with + | Sort Void -> raise (Error (loc, Void_layout)) + | _ -> () +;; (* Compatibility predicate that considers potential rebindings of constructors @@ -309,7 +297,8 @@ end = struct match p.pat_desc with | `Any -> `Any | `Constant cst -> `Constant cst - | `Tuple ps -> `Tuple (List.map (alpha_pat env) ps) + | `Tuple ps -> + `Tuple (List.map (fun (label, p) -> label, alpha_pat env p) ps) | `Construct (cstr, cst_descr, args) -> `Construct (cstr, cst_descr, List.map (alpha_pat env) args) | `Variant (cstr, argo, row_desc) -> @@ -317,7 +306,7 @@ end = struct | `Record (fields, closed) -> let alpha_field env (lid, l, p) = (lid, l, alpha_pat env p) in `Record (List.map (alpha_field env) fields, closed) - | `Array (am, ps) -> `Array (am, List.map (alpha_pat env) ps) + | `Array (am, arg_sort, ps) -> `Array (am, arg_sort, List.map (alpha_pat env) ps) | `Lazy p -> `Lazy (alpha_pat env p) in { p with pat_desc } @@ -468,7 +457,7 @@ let matcher discr (p : Simple.pattern) rem = | Variant _, (Constant _ | Construct _ | Lazy | Array _ | Record _ | Tuple _) -> no () - | Array (am1, n1), Array (am2, n2) -> yesif (am1 = am2 && n1 = n2) + | Array (am1, _, n1), Array (am2, _, n2) -> yesif (am1 = am2 && n1 = n2) | Array _, (Constant _ | Construct _ | Variant _ | Lazy | Record _ | Tuple _) -> no () @@ -642,7 +631,7 @@ end let rec flatten_pat_line size p k = match p.pat_desc with | Tpat_any | Tpat_var _ -> Patterns.omegas size :: k - | Tpat_tuple args -> args :: k + | Tpat_tuple args -> (List.map snd args) :: k | Tpat_or (p1, p2, _) -> flatten_pat_line size p1 (flatten_pat_line size p2 k) | Tpat_alias (p, _, _, _, _) -> @@ -1067,7 +1056,7 @@ let make_catch kind d k = | Lstaticraise (_, []) -> k d | _ -> let e = next_raise_count () in - Lstaticcatch (k (make_exit e), (e, []), d, kind) + Lstaticcatch (k (make_exit e), (e, []), d, Same_region, kind) (* Introduce a catch, if worth it, delayed version *) let rec as_simple_exit = function @@ -1091,7 +1080,7 @@ let make_catch_delayed kind handler = handler else body - | _ -> Lstaticcatch (body, (i, []), handler, kind) ) + | _ -> Lstaticcatch (body, (i, []), handler, Same_region, kind) ) ) let raw_action l = @@ -1171,9 +1160,15 @@ let can_group discr pat = | Constant (Const_char _), Constant (Const_char _) | Constant (Const_string _), Constant (Const_string _) | Constant (Const_float _), Constant (Const_float _) + | Constant (Const_float32 _), Constant (Const_float32 _) + | Constant (Const_unboxed_float _), Constant (Const_unboxed_float _) + | Constant (Const_unboxed_float32 _), Constant (Const_unboxed_float32 _) | Constant (Const_int32 _), Constant (Const_int32 _) | Constant (Const_int64 _), Constant (Const_int64 _) - | Constant (Const_nativeint _), Constant (Const_nativeint _) -> + | Constant (Const_nativeint _), Constant (Const_nativeint _) + | Constant (Const_unboxed_int32 _), Constant (Const_unboxed_int32 _) + | Constant (Const_unboxed_int64 _), Constant (Const_unboxed_int64 _) + | Constant (Const_unboxed_nativeint _), Constant (Const_unboxed_nativeint _)-> true | Construct { cstr_tag = Extension _ as discr_tag }, Construct pat_cstr -> @@ -1194,7 +1189,10 @@ let can_group discr pat = ( Any | Constant ( Const_int _ | Const_char _ | Const_string _ | Const_float _ - | Const_int32 _ | Const_int64 _ | Const_nativeint _ ) + | Const_float32 _ | Const_unboxed_float _ | Const_unboxed_float32 _ + | Const_int32 _ | Const_int64 _ | Const_nativeint _ + | Const_unboxed_int32 _ | Const_unboxed_int64 _ + | Const_unboxed_nativeint _ ) | Construct _ | Tuple _ | Record _ | Array _ | Variant _ | Lazy ) ) -> false @@ -1602,8 +1600,8 @@ and precompile_or ~arg ~arg_sort (cls : Simple.clause list) ors args def k = (* variables bound in the or-pattern that are used in the orpm actions *) Typedtree.pat_bound_idents_full arg_sort orp - |> List.filter (fun (id, _, _, _) -> Ident.Set.mem id pm_fv) - |> List.map (fun (id, _, ty, id_sort) -> + |> List.filter (fun (id, _, _, _, _) -> Ident.Set.mem id pm_fv) + |> List.map (fun (id, _, ty, _, id_sort) -> (id, Typeopt.layout orp.pat_env orp.pat_loc id_sort ty)) in let or_num = next_raise_count () in @@ -1783,7 +1781,9 @@ let get_pat_args_constr p rem = match p with | { pat_desc = Tpat_construct (_, {cstr_arg_jkinds}, args, _) } -> List.iteri - (fun i arg -> jkind_layout_must_be_value arg.pat_loc cstr_arg_jkinds.(i)) + (fun i arg -> + jkind_layout_default_to_value_and_check_not_void + arg.pat_loc cstr_arg_jkinds.(i)) args; (* CR layouts v5: This sanity check will have to go (or be replaced with a void-specific check) when we have other non-value sorts *) @@ -1799,27 +1799,49 @@ let get_expr_args_constr ~scopes head (arg, _mut, sort, layout) rem = let loc = head_loc ~scopes head in (* CR layouts v5: This sanity check should be removed or changed to specifically check for void when we add other non-value sorts. *) - Array.iter (fun jkind -> jkind_layout_must_be_value head.pat_loc jkind) + Array.iter (fun jkind -> + jkind_layout_default_to_value_and_check_not_void head.pat_loc jkind) cstr.cstr_arg_jkinds; - let make_field_accesses binding_kind first_pos last_pos argl = - let rec make_args pos = - if pos > last_pos then - argl - else - (Lprim (Pfield (pos, Pointer, Reads_agree), [ arg ], loc), binding_kind, - Jkind.Sort.for_constructor_arg, layout_field) - :: make_args (pos + 1) + let make_field_access binding_kind ~field ~pos = + let prim = + match cstr.cstr_shape with + | Constructor_uniform_value -> Pfield (pos, Pointer, Reads_agree) + | Constructor_mixed shape -> + let read = + match Types.get_mixed_product_element shape field with + | Value_prefix -> Mread_value_prefix Pointer + | Flat_suffix flat -> + let flat_read = + match flat with + | Float_boxed -> + Misc.fatal_error + "unexpected flat float of layout value in \ + constructor field" + | non_float -> flat_read_non_float non_float + in + Mread_flat_suffix flat_read + in + let shape = Lambda.transl_mixed_product_shape shape in + Pmixedfield (pos, read, shape, Reads_agree) in - make_args first_pos + let jkind = cstr.cstr_arg_jkinds.(field) in + let sort = Jkind.sort_of_jkind jkind in + let layout = Typeopt.layout_of_sort head.pat_loc sort in + (Lprim (prim, [ arg ], loc), binding_kind, sort, layout) in if cstr.cstr_inlined <> None then (arg, Alias, sort, layout) :: rem else match cstr.cstr_repr with | Variant_boxed _ -> - make_field_accesses Alias 0 (cstr.cstr_arity - 1) rem + List.init cstr.cstr_arity + (fun i -> make_field_access Alias ~field:i ~pos:i) + @ rem | Variant_unboxed -> (arg, Alias, sort, layout) :: rem - | Variant_extensible -> make_field_accesses Alias 1 cstr.cstr_arity rem + | Variant_extensible -> + List.init cstr.cstr_arity + (fun i -> make_field_access Alias ~field:i ~pos:(i+1)) + @ rem let divide_constructor ~scopes ctx pm = divide @@ -1840,8 +1862,8 @@ let get_expr_args_variant_nonconst ~scopes head (arg, _mut, _sort, _layout) rem = let loc = head_loc ~scopes head in let field_prim = nonconstant_variant_field 1 in - (Lprim (field_prim, [ arg ], loc), Alias, Jkind.Sort.for_constructor_arg, - layout_field) + (Lprim (field_prim, [ arg ], loc), Alias, Jkind.Sort.for_variant_arg, + layout_variant_arg) :: rem let divide_variant ~scopes row ctx { cases = cl; args; default = def } = @@ -1905,7 +1927,7 @@ let get_pat_args_lazy p rem = *) let prim_obj_tag = - Primitive.simple_on_values ~name:"caml_obj_tag" ~arity:1 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_obj_tag" ~arity:1 ~alloc:false let get_mod_field modname field = lazy @@ -1924,9 +1946,6 @@ let get_mod_field modname field = | path, _ -> transl_value_path Loc_unknown env path )) -(* BACKPORT BEGIN - This is the OCaml 5 lazy implementation merged into ocaml-jst. - let code_force_lazy_block = get_mod_field "CamlinternalLazy" "force_lazy_block" let code_force_lazy = get_mod_field "CamlinternalLazy" "force_gen" @@ -1990,7 +2009,7 @@ let inline_lazy_force_cond arg pos loc = Lazy.force varg else ... *) Lprim (Psequor, - [test_tag Obj.lazy_tag; test_tag Obj.forcing_tag], loc), + [test_tag Runtimetags.lazy_tag; test_tag Runtimetags.forcing_tag], loc), (* nroberts: We probably don't need [Never_inlined] anymore now that [ap_args] is opaque. *) call_force_lazy_block ~inlined:Never_inlined varg loc ~pos, @@ -2015,10 +2034,10 @@ let inline_lazy_force_switch arg pos loc = sw_numconsts = 256; (* PR#6033 - tag ranges from 0 to 255 *) sw_consts = - [ (Obj.forward_tag, Lprim (Pfield(0, Pointer, Reads_vary), + [ (Runtimetags.forward_tag, Lprim (Pfield(0, Pointer, Reads_vary), [ varg ], loc)); - (Obj.lazy_tag, call_force_lazy_block varg loc ~pos); - (Obj.forcing_tag, call_force_lazy_block varg loc ~pos) + (Runtimetags.lazy_tag, call_force_lazy_block varg loc ~pos); + (Runtimetags.forcing_tag, call_force_lazy_block varg loc ~pos) ]; sw_failaction = Some varg }, @@ -2059,141 +2078,6 @@ let inline_lazy_force arg pos loc = (* generating bytecode: Lswitch would generate too many rather big tables (~ 250 elts); conditionals are better *) inline_lazy_force_cond arg pos loc -*) -(* BACKPORT END *) - -(* This is the OCaml 4 implementation of lazy with a tweak to the - Pfield occurrence in lazy_forward_field (to add "Pointer"). *) - -let code_force_lazy_block = get_mod_field "CamlinternalLazy" "force_lazy_block" - -let code_force_lazy = get_mod_field "CamlinternalLazy" "force" - -(* inline_lazy_force inlines the beginning of the code of Lazy.force. When - the value argument is tagged as: - - forward, take field 0 - - lazy, call the primitive that forces (without testing again the tag) - - anything else, return it - - Using Lswitch below relies on the fact that the GC does not shortcut - Forward(val_out_of_heap). -*) - -let lazy_forward_field = Lambda.Pfield (0, Pointer, Reads_vary) - -let inline_lazy_force_cond arg pos loc = - let idarg = Ident.create_local "lzarg" in - let varg = Lvar idarg in - let tag = Ident.create_local "tag" in - let tag_var = Lvar tag in - let force_fun = Lazy.force code_force_lazy_block in - Llet - ( Strict, - Lambda.layout_lazy, - idarg, - arg, - Llet - ( Alias, - Lambda.layout_int, - tag, - Lprim (Pccall prim_obj_tag, [ varg ], loc), - Lifthenelse - (* if (tag == Obj.forward_tag) then varg.(0) else ... *) - ( Lprim - ( Pintcomp Ceq, - [ tag_var; Lconst (Const_base (Const_int Obj.forward_tag)) ], - loc ), - Lprim (lazy_forward_field, [ varg ], loc), - Lifthenelse - (* if (tag == Obj.lazy_tag) then Lazy.force varg else ... *) - ( Lprim - ( Pintcomp Ceq, - [ tag_var; Lconst (Const_base (Const_int Obj.lazy_tag)) ], - loc ), - Lapply - { ap_tailcall = Default_tailcall; - ap_loc = loc; - ap_func = force_fun; - ap_args = [ varg ]; - ap_result_layout = Lambda.layout_lazy_contents; - ap_region_close = pos; - ap_mode = alloc_heap; - ap_inlined = Never_inlined; - ap_specialised = Default_specialise; - ap_probe=None - }, - (* ... arg *) - varg, Lambda.layout_lazy_contents), Lambda.layout_lazy_contents) ) ) - -let inline_lazy_force_switch arg pos loc = - let idarg = Ident.create_local "lzarg" in - let varg = Lvar idarg in - let force_fun = Lazy.force code_force_lazy_block in - Llet - ( Strict, - Lambda.layout_lazy, - idarg, - arg, - Lifthenelse - ( Lprim (Pisint { variant_only = false }, [ varg ], loc), - varg, - Lswitch - ( varg, - { sw_numconsts = 0; - sw_consts = []; - sw_numblocks = 256; - (* PR#6033 - tag ranges from 0 to 255 *) - sw_blocks = - [ ( Obj.forward_tag, - Lprim (lazy_forward_field, [ varg ], loc) ); - ( Obj.lazy_tag, - Lapply - { ap_tailcall = Default_tailcall; - ap_loc = loc; - ap_func = force_fun; - ap_args = [ varg ]; - ap_result_layout = Lambda.layout_lazy_contents; - ap_region_close = pos; - ap_mode = alloc_heap; - ap_inlined = Default_inlined; - ap_specialised = Default_specialise; - ap_probe=None; - } ) - ]; - sw_failaction = Some varg - }, - loc, Lambda.layout_lazy_contents), Lambda.layout_lazy_contents) ) - -let inline_lazy_force arg pos loc = - if !Clflags.afl_instrument then - (* Disable inlining optimisation if AFL instrumentation active, - so that the GC forwarding optimisation is not visible in the - instrumentation output. - (see https://github.com/stedolan/crowbar/issues/14) *) - Lapply - { ap_tailcall = Default_tailcall; - ap_loc = loc; - ap_func = Lazy.force code_force_lazy; - ap_args = [ arg ]; - ap_result_layout = Lambda.layout_lazy_contents; - ap_region_close = pos; - ap_mode = alloc_heap; - ap_inlined = Never_inlined; - ap_specialised = Default_specialise; - ap_probe=None; - } - else if !Clflags.native_code && not (Clflags.is_flambda2 ()) then - (* CR vlaviron: Find a way for Flambda 2 to avoid both the call to - caml_obj_tag and the switch on arbitrary tags *) - (* Lswitch generates compact and efficient native code *) - inline_lazy_force_switch arg pos loc - else - (* generating bytecode: Lswitch would generate too many rather big - tables (~ 250 elts); conditionals are better *) - inline_lazy_force_cond arg pos loc - - -(* End of lazy implementations. *) let get_expr_args_lazy ~scopes head (arg, _mut, _sort, _layout) rem = let loc = head_loc ~scopes head in @@ -2211,7 +2095,7 @@ let divide_lazy ~scopes head ctx pm = let get_pat_args_tuple arity p rem = match p with | { pat_desc = Tpat_any } -> Patterns.omegas arity @ rem - | { pat_desc = Tpat_tuple args } -> args @ rem + | { pat_desc = Tpat_tuple args } -> (List.map snd args) @ rem | _ -> assert false let get_expr_args_tuple ~scopes head (arg, _mut, _sort, _layout) rem = @@ -2222,7 +2106,7 @@ let get_expr_args_tuple ~scopes head (arg, _mut, _sort, _layout) rem = rem else (Lprim (Pfield (pos, Pointer, Reads_agree), [ arg ], loc), Alias, - Jkind.Sort.for_tuple_element, layout_field) + Jkind.Sort.for_tuple_element, layout_tuple_element) :: make_args (pos + 1) in make_args 0 @@ -2241,7 +2125,7 @@ let record_matching_line num_fields lbl_pat_list = List.iter (fun (_, lbl, pat) -> (* CR layouts v5: This void sanity check can be removed when we add proper void support (or whenever we remove `lbl_pos_void`) *) - check_record_field_jkind lbl; + jkind_layout_default_to_value_and_check_not_void pat.pat_loc lbl.lbl_jkind; patv.(lbl.lbl_pos) <- pat) lbl_pat_list; Array.to_list patv @@ -2268,23 +2152,22 @@ let get_expr_args_record ~scopes head (arg, _mut, sort, layout) rem = rem else let lbl = all_labels.(pos) in - check_record_field_jkind lbl; + jkind_layout_default_to_value_and_check_not_void + head.pat_loc lbl.lbl_jkind; let ptr = Typeopt.maybe_pointer_type head.pat_env lbl.lbl_arg in let lbl_sort = Jkind.sort_of_jkind lbl.lbl_jkind in let lbl_layout = Typeopt.layout_of_sort lbl.lbl_loc lbl_sort in let sem = - match lbl.lbl_mut with - | Immutable -> Reads_agree - | Mutable -> Reads_vary + if Types.is_mutable lbl.lbl_mut then Reads_vary else Reads_agree in let access, sort, layout = match lbl.lbl_repres with | Record_boxed _ - | Record_inlined (_, Variant_boxed _) -> + | Record_inlined (_, Constructor_uniform_value, Variant_boxed _) -> Lprim (Pfield (lbl.lbl_pos, ptr, sem), [ arg ], loc), lbl_sort, lbl_layout | Record_unboxed - | Record_inlined (_, Variant_unboxed) -> arg, sort, layout + | Record_inlined (_, _, Variant_unboxed) -> arg, sort, layout | Record_float -> (* TODO: could optimise to Alloc_local sometimes *) Lprim (Pfloatfield (lbl.lbl_pos, sem, alloc_heap), [ arg ], loc), @@ -2294,15 +2177,38 @@ let get_expr_args_record ~scopes head (arg, _mut, sort, layout) rem = Lprim (Pufloatfield (lbl.lbl_pos, sem), [ arg ], loc), (* Here we are projecting an unboxed float from a float record. *) lbl_sort, lbl_layout - | Record_inlined (_, Variant_extensible) -> + | Record_inlined (_, Constructor_uniform_value, Variant_extensible) -> Lprim (Pfield (lbl.lbl_pos + 1, ptr, sem), [ arg ], loc), lbl_sort, lbl_layout + | Record_inlined (_, Constructor_mixed _, Variant_extensible) -> + (* CR layouts v5.9: support this *) + fatal_error + "Mixed inlined records not supported for extensible variants" + | Record_inlined (_, Constructor_mixed shape, Variant_boxed _) + | Record_mixed shape -> + let ({ value_prefix_len; flat_suffix } : mixed_product_shape) = + shape + in + let read = + if pos < value_prefix_len then Mread_value_prefix ptr + else + let read = + match flat_suffix.(pos - value_prefix_len) with + | Imm | Float64 | Float32 | Bits32 | Bits64 | Word as non_float -> + flat_read_non_float non_float + | Float_boxed -> + (* TODO: could optimise to Alloc_local sometimes *) + flat_read_float_boxed alloc_heap + in + Mread_flat_suffix read + in + let shape : Lambda.mixed_block_shape = + { value_prefix_len; flat_suffix } + in + Lprim (Pmixedfield (lbl.lbl_pos, read, shape, sem), [ arg ], loc), + lbl_sort, lbl_layout in - let str = - match lbl.lbl_mut with - | Immutable -> Alias - | Mutable -> StrictOpt - in + let str = if Types.is_mutable lbl.lbl_mut then StrictOpt else Alias in (access, str, sort, layout) :: make_args (pos + 1) in make_args 0 @@ -2322,19 +2228,19 @@ let divide_record all_labels ~scopes head ctx pm = (* Matching against an array pattern *) let get_key_array = function - | { pat_desc = Tpat_array (_, patl) } -> List.length patl + | { pat_desc = Tpat_array (_, _, patl) } -> List.length patl | _ -> assert false let get_pat_args_array p rem = match p with - | { pat_desc = Tpat_array (_, patl) } -> patl @ rem + | { pat_desc = Tpat_array (_, _, patl) } -> patl @ rem | _ -> assert false let get_expr_args_array ~scopes kind head (arg, _mut, _sort, _layout) rem = - let am, len = + let am, arg_sort, len = let open Patterns.Head in match head.pat_desc with - | Array (am, len) -> am, len + | Array (am, arg_sort, len) -> am, arg_sort, len | _ -> assert false in let loc = head_loc ~scopes head in @@ -2347,13 +2253,11 @@ let get_expr_args_array ~scopes kind head (arg, _mut, _sort, _layout) rem = let ref_kind = Lambda.(array_ref_kind alloc_heap kind) in let result_layout = array_ref_kind_result_layout ref_kind in ( Lprim - (Parrayrefu ref_kind, + (Parrayrefu (ref_kind, Ptagged_int_index), [ arg; Lconst (Const_base (Const_int pos)) ], loc), - (match am with - | Mutable -> StrictOpt - | Immutable -> Alias), - Jkind.Sort.for_array_get_result, + (if Types.is_mutable am then StrictOpt else Alias), + arg_sort, result_layout) :: make_args (pos + 1) in @@ -2383,11 +2287,11 @@ let divide_array ~scopes kind ctx pm = let strings_test_threshold = 8 let prim_string_notequal = - Pccall (Primitive.simple_on_values ~name:"caml_string_notequal" ~arity:2 + Pccall (Lambda.simple_prim_on_values ~name:"caml_string_notequal" ~arity:2 ~alloc:false) let prim_string_compare = - Pccall (Primitive.simple_on_values ~name:"caml_string_compare" ~arity:2 + Pccall (Lambda.simple_prim_on_values ~name:"caml_string_compare" ~arity:2 ~alloc:false) let bind_sw arg layout k = @@ -3000,9 +2904,17 @@ let combine_constant value_kind loc arg cst partial ctx def let hs, sw, fail = share_actions_tree value_kind sw fail in hs (Lstringswitch (arg, sw, fail, loc, value_kind)) | Const_float _ -> - make_test_sequence value_kind loc fail (Pfloatcomp CFneq) - (Pfloatcomp CFlt) arg + make_test_sequence value_kind loc fail (Pfloatcomp (Pfloat64, CFneq)) + (Pfloatcomp (Pfloat64, CFlt)) arg const_lambda_list + | Const_float32 _ | Const_unboxed_float32 _ -> + (* Should be caught in do_compile_matching. *) + Misc.fatal_error "Found unexpected float32 literal pattern." + | Const_unboxed_float _ -> + make_test_sequence value_kind loc fail + (Punboxed_float_comp (Pfloat64, CFneq)) + (Punboxed_float_comp (Pfloat64, CFlt)) + arg const_lambda_list | Const_int32 _ -> make_test_sequence value_kind loc fail (Pbintcomp (Pint32, Cne)) @@ -3018,6 +2930,21 @@ let combine_constant value_kind loc arg cst partial ctx def (Pbintcomp (Pnativeint, Cne)) (Pbintcomp (Pnativeint, Clt)) arg const_lambda_list + | Const_unboxed_int32 _ -> + make_test_sequence value_kind loc fail + (Punboxed_int_comp (Pint32, Cne)) + (Punboxed_int_comp (Pint32, Clt)) + arg const_lambda_list + | Const_unboxed_int64 _ -> + make_test_sequence value_kind loc fail + (Punboxed_int_comp (Pint64, Cne)) + (Punboxed_int_comp (Pint64, Clt)) + arg const_lambda_list + | Const_unboxed_nativeint _ -> + make_test_sequence value_kind loc fail + (Punboxed_int_comp (Pnativeint, Cne)) + (Punboxed_int_comp (Pnativeint, Clt)) + arg const_lambda_list in (lambda1, Jumps.union local_jumps total) @@ -3060,6 +2987,18 @@ let split_extension_cases tag_lambda_list = | _, Ordinary _ -> assert false) tag_lambda_list +let transl_match_on_option value_kind arg loc ~if_some ~if_none = + (* This case is very frequent, it corresponds to + options and lists. *) + (* Keeping the Pisint test would make the bytecode + slightly worse, but it lets the native compiler generate + better code -- see #10681. *) + if !Clflags.native_code then + Lifthenelse(Lprim (Pisint { variant_only = true }, [ arg ], loc), + if_none, if_some, value_kind) + else + Lifthenelse(arg, if_some, if_none, value_kind) + let combine_constructor value_kind loc arg pat_env cstr partial ctx def (descr_lambda_list, total1, pats) = match cstr.cstr_tag with @@ -3152,16 +3091,8 @@ let combine_constructor value_kind loc arg pat_env cstr partial ctx def with | 1, 1, [ (0, act1) ], [ (0, act2) ] when not (Clflags.is_flambda2 ()) -> - (* This case is very frequent, it corresponds to - options and lists. *) - (* Keeping the Pisint test would make the bytecode - slightly worse, but it lets the native compiler generate - better code -- see #10681. *) - if !Clflags.native_code then - Lifthenelse(Lprim (Pisint { variant_only = true }, [ arg ], loc), - act1, act2, value_kind) - else - Lifthenelse(arg, act2, act1, value_kind) + transl_match_on_option value_kind arg loc + ~if_none:act1 ~if_some:act2 | n, 0, _, [] -> (* The matched type defines constant constructors only. (typically the constant cases are dense, so @@ -3385,7 +3316,9 @@ let compile_orhandlers value_kind compile_fun lambda1 total1 ctx to_catch = (* Whilst the handler is [lambda_unit] it is actually unused and only added to produce well-formed code. In reality this expression returns a [value_kind]. *) - do_rec (Lstaticcatch (r, (i, vars), lambda_unit, value_kind)) total_r rem + do_rec + (Lstaticcatch (r, (i, vars), lambda_unit, Same_region, value_kind)) + total_r rem | handler_i, total_i -> begin match raw_action r with | Lstaticraise (j, args) -> @@ -3398,7 +3331,8 @@ let compile_orhandlers value_kind compile_fun lambda1 total1 ctx to_catch = do_rec r total_r rem | _ -> do_rec - (Lstaticcatch (r, (i, vars), handler_i, value_kind)) + (Lstaticcatch + (r, (i, vars), handler_i, Same_region, value_kind)) (Jumps.union (Jumps.remove i total_r) (Jumps.map (Context.rshift_num (ncols mat)) total_i)) rem @@ -3492,7 +3426,7 @@ let rec comp_match_handlers value_kind comp_fun partial ctx first_match next_mat match comp_fun partial ctx_i pm with | li, total_i -> c_rec - (Lstaticcatch (body, (i, []), li, value_kind)) + (Lstaticcatch (body, (i, []), li, Same_region, value_kind)) (Jumps.union total_i total_rem) rem | exception Unused -> @@ -3500,7 +3434,8 @@ let rec comp_match_handlers value_kind comp_fun partial ctx first_match next_mat to produce well-formed code. In reality this expression returns a [value_kind]. *) c_rec - (Lstaticcatch (body, (i, []), lambda_unit, value_kind)) + (Lstaticcatch + (body, (i, []), lambda_unit, Same_region, value_kind)) total_rem rem end ) @@ -3652,6 +3587,8 @@ and do_compile_matching ~scopes value_kind repr partial ctx pmh = compile_no_test ~scopes value_kind (divide_record ~scopes lbl.lbl_all ph) Context.combine repr partial ctx pm + | Constant (Const_float32 _ | Const_unboxed_float32 _) -> + Parmatch.raise_matched_float32 () | Constant cst -> compile_test (compile_match ~scopes value_kind repr partial) @@ -3664,8 +3601,8 @@ and do_compile_matching ~scopes value_kind repr partial ctx pmh = partial (divide_constructor ~scopes) (combine_constructor value_kind ploc arg ph.pat_env cstr partial) ctx pm - | Array _ -> - let kind = Typeopt.array_pattern_kind pomega in + | Array (_, elt_sort, _) -> + let kind = Typeopt.array_pattern_kind pomega elt_sort in compile_test (compile_match ~scopes value_kind repr partial) partial (divide_array ~scopes kind) @@ -3740,10 +3677,7 @@ let is_record_with_mutable_field p = match p.pat_desc with | Tpat_record (lps, _) -> List.exists - (fun (_, lbl, _) -> - match lbl.Types.lbl_mut with - | Mutable -> true - | Immutable -> false) + (fun (_, lbl, _) -> Types.is_mutable lbl.lbl_mut) lps | Tpat_alias _ | Tpat_variant _ @@ -3825,7 +3759,8 @@ let check_total ~scopes value_kind loc ~failer total lambda i = lambda else Lstaticcatch (lambda, (i, []), - failure_handler ~scopes loc ~failer (), value_kind) + failure_handler ~scopes loc ~failer (), + Same_region, value_kind) let toplevel_handler ~scopes ~return_layout loc ~failer partial args cases compile_fun = match partial with @@ -3938,8 +3873,8 @@ let rec map_return f = function | Lsequence (l1, l2) -> Lsequence (l1, map_return f l2) | Levent (l, ev) -> Levent (map_return f l, ev) | Ltrywith (l1, id, l2, k) -> Ltrywith (map_return f l1, id, map_return f l2, k) - | Lstaticcatch (l1, b, l2, k) -> - Lstaticcatch (map_return f l1, b, map_return f l2, k) + | Lstaticcatch (l1, b, l2, r, k) -> + Lstaticcatch (map_return f l1, b, map_return f l2, r, k) | Lswitch (s, sw, loc, k) -> let map_cases cases = List.map (fun (i, l) -> (i, map_return f l)) cases @@ -3985,10 +3920,13 @@ let assign_pat ~scopes body_layout opt nraise catch_ids loc pat pat_sort lam = match (pat.pat_desc, lam) with | Tpat_tuple patl, Lprim (Pmakeblock _, lams, _) -> opt := true; - List.fold_left2 (collect Jkind.Sort.for_tuple_element) acc patl lams + List.fold_left2 + (fun acc (_, pat) lam -> + collect Jkind.Sort.for_tuple_element acc pat lam) + acc patl lams | Tpat_tuple patl, Lconst (Const_block (_, scl)) -> opt := true; - let collect_const acc pat sc = + let collect_const acc (_, pat) sc = collect Jkind.Sort.for_tuple_element acc pat (Lconst sc) in List.fold_left2 collect_const acc patl scl @@ -4035,18 +3973,19 @@ let for_let ~scopes ~arg_sort ~return_layout loc param pat body = let catch_ids = pat_bound_idents_full arg_sort pat in let ids_with_kinds = List.map - (fun (id, _, typ, sort) -> + (fun (id, _, typ, _, sort) -> (id, Typeopt.layout pat.pat_env pat.pat_loc sort typ)) catch_ids in - let ids = List.map (fun (id, _, _, _) -> id) catch_ids in + let ids = List.map (fun (id, _, _, _, _) -> id) catch_ids in let bind = map_return (assign_pat ~scopes return_layout opt nraise ids loc pat arg_sort) param in if !opt then - Lstaticcatch (bind, (nraise, ids_with_kinds), body, return_layout) + Lstaticcatch + (bind, (nraise, ids_with_kinds), body, Same_region,return_layout) else simple_for_let ~scopes ~arg_sort ~return_layout loc param pat body @@ -4055,9 +3994,11 @@ let for_let ~scopes ~arg_sort ~return_layout loc param pat body = (* Easy case since variables are available *) let for_tupled_function ~scopes ~return_layout loc paraml pats_act_list partial = let partial = check_partial_list pats_act_list partial in - (* The arguments of a tupled function are always values since they must be fields *) + (* The arguments of a tupled function are always values since they must be + tuple elements *) let args = - List.map (fun id -> (Lvar id, Strict, Jkind.Sort.for_tuple_element, layout_field)) + List.map (fun id -> (Lvar id, Strict, Jkind.Sort.for_tuple_element, + layout_tuple_element)) paraml in let handler = @@ -4070,13 +4011,13 @@ let for_tupled_function ~scopes ~return_layout loc paraml pats_act_list partial let flatten_pattern size p = match p.pat_desc with - | Tpat_tuple args -> args + | Tpat_tuple args -> List.map snd args | Tpat_any -> Patterns.omegas size | _ -> raise Cannot_flatten let flatten_simple_pattern size (p : Simple.pattern) = match p.pat_desc with - | `Tuple args -> args + | `Tuple args -> (List.map snd args) | `Any -> Patterns.omegas size | `Array _ | `Variant _ @@ -4216,6 +4157,33 @@ let for_multiple_match ~scopes ~return_layout loc paraml mode pat_act_list parti (do_for_multiple_match ~scopes ~return_layout loc paraml mode pat_act_list partial) +let for_optional_arg_default + ~scopes loc pat ~param ~default_arg ~default_arg_sort ~return_layout body + : lambda + = + (* CR layouts v1.5: It's sad to compute [default_arg_layout] here as we + immediately go and do it again in [for_let]. We should rework [for_let] + so it can take a precomputed layout. + *) + let default_arg_layout = + Typeopt.layout pat.pat_env pat.pat_loc default_arg_sort pat.pat_type + in + let supplied_or_default = + transl_match_on_option + default_arg_layout + (Lvar param) + Loc_unknown + ~if_none:default_arg + ~if_some: + (Lprim + (* CR ncik-roberts: Check whether we need something better here. *) + (Pfield (0, Pointer, Reads_agree), + [ Lvar param ], + Loc_unknown)) + in + for_let ~scopes ~arg_sort:default_arg_sort ~return_layout + loc supplied_or_default pat body + (* Error report *) (* CR layouts v5: This file didn't use to have the report_error infrastructure - I added it only for the void sanity checking in this module, which I'm not @@ -4223,16 +4191,10 @@ let for_multiple_match ~scopes ~return_layout loc paraml mode pat_act_list parti open Format let report_error ppf = function - | Non_value_layout err -> - fprintf ppf - "Non-value detected in translation:@ Please report this error to \ - the Jane Street compilers team.@ %a" - (Jkind.Violation.report_with_name ~name:"This expression") err - | Illegal_record_field c -> + | Void_layout -> fprintf ppf - "Sort %s detected where value was expected in a record field:@ Please \ - report this error to the Jane Street compilers team." - (Jkind.string_of_const c) + "Void layout detected in translation:@ Please report this error to \ + the Jane Street compilers team." let () = Location.register_error_of_exn diff --git a/lambda/matching.mli b/lambda/matching.mli index a45239d207e..04fc298cceb 100644 --- a/lambda/matching.mli +++ b/lambda/matching.mli @@ -45,6 +45,21 @@ val for_tupled_function: Ident.t list -> (pattern list * lambda) list -> partial -> lambda +(** [for_optional_arg_default pat body ~default_arg ~param] is: + {[ + let $pat = + match $param with + | Some x -> x + | None -> $default_arg + in + $body + ]} +*) +val for_optional_arg_default: + scopes:scopes -> Location.t -> pattern -> param:Ident.t -> + default_arg:lambda -> default_arg_sort:Jkind.sort -> + return_layout:layout -> lambda -> lambda + exception Cannot_flatten val flatten_pattern: int -> pattern -> pattern list diff --git a/lambda/printlambda.ml b/lambda/printlambda.ml index e358271d458..c4ee4172749 100644 --- a/lambda/printlambda.ml +++ b/lambda/printlambda.ml @@ -19,22 +19,34 @@ open Primitive open Types open Lambda - let rec struct_const ppf = function | Const_base(Const_int n) -> fprintf ppf "%i" n | Const_base(Const_char c) -> fprintf ppf "%C" c | Const_base(Const_string (s, _, _)) -> fprintf ppf "%S" s | Const_immstring s -> fprintf ppf "#%S" s | Const_base(Const_float f) -> fprintf ppf "%s" f + | Const_base(Const_float32 f) -> fprintf ppf "%ss" f + | Const_base(Const_unboxed_float f) -> + fprintf ppf "%s" (Misc.format_as_unboxed_literal f) + | Const_base(Const_unboxed_float32 f) -> + fprintf ppf "%ss" (Misc.format_as_unboxed_literal f) | Const_base(Const_int32 n) -> fprintf ppf "%lil" n | Const_base(Const_int64 n) -> fprintf ppf "%LiL" n | Const_base(Const_nativeint n) -> fprintf ppf "%nin" n + | Const_base(Const_unboxed_int32 i) -> + fprintf ppf "%sl" (Misc.format_as_unboxed_literal (Int32.to_string i)) + | Const_base(Const_unboxed_int64 i) -> + fprintf ppf "%sL" (Misc.format_as_unboxed_literal (Int64.to_string i)) + | Const_base(Const_unboxed_nativeint i) -> + fprintf ppf "%sn" (Misc.format_as_unboxed_literal (Nativeint.to_string i)) | Const_block(tag, []) -> fprintf ppf "[%i]" tag - | Const_block(tag, sc1::scl) -> - let sconsts ppf scl = - List.iter (fun sc -> fprintf ppf "@ %a" struct_const sc) scl in - fprintf ppf "@[<1>[%i:@ @[%a%a@]]@]" tag struct_const sc1 sconsts scl + | Const_block(tag, hd::tl) -> + fprintf ppf "@[<1>[%i:@ @[%a@]]@]" tag struct_consts (hd, tl) + | Const_mixed_block(_, _, []) -> Misc.fatal_error "empty mixed block" + | Const_mixed_block(tag, shape, hd::tl) -> + fprintf ppf "@[<1>[%i mixed(%i):@ @[%a@]]@]" tag shape.value_prefix_len + struct_consts (hd, tl) | Const_float_block [] -> fprintf ppf "[|b |]" | Const_float_block (f1 :: fl) -> @@ -48,11 +60,22 @@ let rec struct_const ppf = function List.iter (fun f -> fprintf ppf "@ %s" f) fl in fprintf ppf "@[<1>[|@[%s%a@]|]@]" f1 floats fl +and struct_consts ppf (hd, tl) = + let sconsts ppf scl = + List.iter (fun sc -> fprintf ppf "@ %a" struct_const sc) scl + in + fprintf ppf "%a%a" struct_const hd sconsts tl + let array_kind = function | Pgenarray -> "gen" | Paddrarray -> "addr" | Pintarray -> "int" | Pfloatarray -> "float" + | Punboxedfloatarray Pfloat64 -> "unboxed_float" + | Punboxedfloatarray Pfloat32 -> "unboxed_float32" + | Punboxedintarray Pint32 -> "unboxed_int32" + | Punboxedintarray Pint64 -> "unboxed_int64" + | Punboxedintarray Pnativeint -> "unboxed_nativeint" let array_ref_kind ppf k = let pp_mode ppf = function @@ -64,6 +87,18 @@ let array_ref_kind ppf k = | Paddrarray_ref -> fprintf ppf "addr" | Pintarray_ref -> fprintf ppf "int" | Pfloatarray_ref mode -> fprintf ppf "float%a" pp_mode mode + | Punboxedfloatarray_ref Pfloat64 -> fprintf ppf "unboxed_float" + | Punboxedfloatarray_ref Pfloat32 -> fprintf ppf "unboxed_float32" + | Punboxedintarray_ref Pint32 -> fprintf ppf "unboxed_int32" + | Punboxedintarray_ref Pint64 -> fprintf ppf "unboxed_int64" + | Punboxedintarray_ref Pnativeint -> fprintf ppf "unboxed_nativeint" + +let array_index_kind ppf k = + match k with + | Ptagged_int_index -> fprintf ppf "int" + | Punboxed_int_index Pint32 -> fprintf ppf "unboxed_int32" + | Punboxed_int_index Pint64 -> fprintf ppf "unboxed_int64" + | Punboxed_int_index Pnativeint -> fprintf ppf "unboxed_nativeint" let array_set_kind ppf k = let pp_mode ppf = function @@ -75,34 +110,70 @@ let array_set_kind ppf k = | Paddrarray_set mode -> fprintf ppf "addr%a" pp_mode mode | Pintarray_set -> fprintf ppf "int" | Pfloatarray_set -> fprintf ppf "float" + | Punboxedfloatarray_set Pfloat64 -> fprintf ppf "unboxed_float" + | Punboxedfloatarray_set Pfloat32 -> fprintf ppf "unboxed_float32" + | Punboxedintarray_set Pint32 -> fprintf ppf "unboxed_int32" + | Punboxedintarray_set Pint64 -> fprintf ppf "unboxed_int64" + | Punboxedintarray_set Pnativeint -> fprintf ppf "unboxed_nativeint" -let alloc_mode = function +let alloc_mode_if_local = function | Alloc_heap -> "" | Alloc_local -> "local" +let alloc_mode ppf alloc_mode = + match alloc_mode with + | Alloc_heap -> fprintf ppf "heap" + | Alloc_local -> fprintf ppf "local" + let boxed_integer_name = function | Pnativeint -> "nativeint" | Pint32 -> "int32" | Pint64 -> "int64" -let variant_kind print_contents ppf ~consts ~non_consts = +let boxed_float_name = function + | Pfloat64 -> "float" + | Pfloat32 -> "float32" + +let constructor_shape print_value_kind ppf shape = + let value_fields, flat_fields = + match shape with + | Constructor_uniform fields -> fields, [] + | Constructor_mixed { value_prefix; flat_suffix } -> + value_prefix, flat_suffix + in + fprintf ppf "%a%t" + (Format.pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") + print_value_kind) + value_fields + (fun ppf -> + match flat_fields with + | [] -> () + | _ :: _ -> + fprintf ppf ";@%a" + (Format.pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ",@") + (fun ppf flat_element -> + fprintf ppf "[%s]" + (Types.flat_element_to_lowercase_string flat_element))) + flat_fields) + +let tag_and_constructor_shape print_value_kind ppf (tag, shape) = + fprintf ppf "@[[%d:@ %a]@]" + tag + (constructor_shape print_value_kind) + shape + +let variant_kind print_value_kind ppf ~consts ~non_consts = fprintf ppf "@[[(consts (%a))@ (non_consts (%a))]@]" (Format.pp_print_list ~pp_sep:Format.pp_print_space Format.pp_print_int) consts (Format.pp_print_list ~pp_sep:Format.pp_print_space - (fun ppf (tag, fields) -> - fprintf ppf "@[[%d:@ %a]@]" - tag - (Format.pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") - print_contents) - fields - )) + (tag_and_constructor_shape print_value_kind)) non_consts let rec value_kind ppf = function | Pgenval -> () | Pintval -> fprintf ppf "[int]" - | Pfloatval -> fprintf ppf "[float]" + | Pboxedfloatval bf -> fprintf ppf "[%s]" (boxed_float_name bf) | Parrayval elt_kind -> fprintf ppf "[%sarray]" (array_kind elt_kind) | Pboxedintval bi -> fprintf ppf "[%s]" (boxed_integer_name bi) | Pboxedvectorval (Pvec128 v) -> fprintf ppf "[%s]" (vec128_name v) @@ -112,35 +183,36 @@ let rec value_kind ppf = function and value_kind' ppf = function | Pgenval -> fprintf ppf "*" | Pintval -> fprintf ppf "[int]" - | Pfloatval -> fprintf ppf "[float]" + | Pboxedfloatval bf -> fprintf ppf "[%s]" (boxed_float_name bf) | Parrayval elt_kind -> fprintf ppf "[%sarray]" (array_kind elt_kind) | Pboxedintval bi -> fprintf ppf "[%s]" (boxed_integer_name bi) | Pboxedvectorval (Pvec128 v) -> fprintf ppf "[%s]" (vec128_name v) | Pvariant { consts; non_consts; } -> variant_kind value_kind' ppf ~consts ~non_consts -let rec layout is_top ppf layout_ = +let rec layout' is_top ppf layout_ = match layout_ with | Pvalue k -> (if is_top then value_kind else value_kind') ppf k | Ptop -> fprintf ppf "[top]" | Pbottom -> fprintf ppf "[bottom]" - | Punboxed_float -> fprintf ppf "[unboxed_float]" + | Punboxed_float bf -> fprintf ppf "[unboxed_%s]" (boxed_float_name bf) | Punboxed_int bi -> fprintf ppf "[unboxed_%s]" (boxed_integer_name bi) | Punboxed_vector (Pvec128 v) -> fprintf ppf "[unboxed_%s]" (vec128_name v) | Punboxed_product layouts -> - fprintf ppf "@[[%a]@]" - (pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") (layout false)) + fprintf ppf "@[#(%a)@]" + (pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") (layout' false)) layouts -let layout ppf layout_ = layout true ppf layout_ +let layout ppf layout_ = layout' true ppf layout_ let return_kind ppf (mode, kind) = - let smode = alloc_mode mode in + let smode = alloc_mode_if_local mode in match kind with | Pvalue Pgenval when is_heap_mode mode -> () | Pvalue Pgenval -> fprintf ppf ": %s@ " smode | Pvalue Pintval -> fprintf ppf ": int@ " - | Pvalue Pfloatval -> fprintf ppf ": %sfloat@ " smode + | Pvalue (Pboxedfloatval bf) -> + fprintf ppf ": %s%s@ " smode (boxed_float_name bf) | Pvalue (Parrayval elt_kind) -> fprintf ppf ": %s%sarray@ " smode (array_kind elt_kind) | Pvalue (Pboxedintval bi) -> fprintf ppf ": %s%s@ " smode (boxed_integer_name bi) @@ -148,7 +220,7 @@ let return_kind ppf (mode, kind) = fprintf ppf ": %s%s@ " smode (vec128_name v) | Pvalue (Pvariant { consts; non_consts; }) -> variant_kind value_kind' ppf ~consts ~non_consts - | Punboxed_float -> fprintf ppf ": unboxed_float@ " + | Punboxed_float bf -> fprintf ppf ": unboxed_%s@ " (boxed_float_name bf) | Punboxed_int bi -> fprintf ppf ": unboxed_%s@ " (boxed_integer_name bi) | Punboxed_vector (Pvec128 v) -> fprintf ppf ": unboxed_%s@ " (vec128_name v) | Punboxed_product _ -> fprintf ppf ": %a" layout kind @@ -158,7 +230,7 @@ let return_kind ppf (mode, kind) = let field_kind ppf = function | Pgenval -> pp_print_string ppf "*" | Pintval -> pp_print_string ppf "int" - | Pfloatval -> pp_print_string ppf "float" + | Pboxedfloatval bf -> pp_print_string ppf (boxed_float_name bf) | Parrayval elt_kind -> fprintf ppf "%s-array" (array_kind elt_kind) | Pboxedintval bi -> pp_print_string ppf (boxed_integer_name bi) | Pboxedvectorval (Pvec128 v) -> pp_print_string ppf (vec128_name v) @@ -167,12 +239,7 @@ let field_kind ppf = function (Format.pp_print_list ~pp_sep:Format.pp_print_space Format.pp_print_int) consts (Format.pp_print_list ~pp_sep:Format.pp_print_space - (fun ppf (tag, fields) -> - fprintf ppf "@[[%d:@ %a]@]" - tag - (Format.pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") - value_kind') fields - )) + (tag_and_constructor_shape value_kind')) non_consts let alloc_kind = function @@ -192,12 +259,38 @@ let boxed_integer_mark name bi m = let print_boxed_integer name ppf bi m = fprintf ppf "%s" (boxed_integer_mark name bi m);; +let unboxed_integer_mark name bi m = + match bi with + | Pnativeint -> Printf.sprintf "Nativeint_u.%s%s" name (alloc_kind m) + | Pint32 -> Printf.sprintf "Int32_u.%s%s" name (alloc_kind m) + | Pint64 -> Printf.sprintf "Int64_u.%s%s" name (alloc_kind m) + +let print_unboxed_integer name ppf bi m = + fprintf ppf "%s" (unboxed_integer_mark name bi m);; + +let boxed_float_mark name bf m = + match bf with + | Pfloat64 -> Printf.sprintf "Float.%s%s" name (alloc_kind m) + | Pfloat32 -> Printf.sprintf "Float32.%s%s" name (alloc_kind m) + +let print_boxed_float name ppf bf m = + fprintf ppf "%s" (boxed_float_mark name bf m);; + +let unboxed_float_mark name bf m = + match bf with + | Pfloat64 -> Printf.sprintf "Float_u.%s%s" name (alloc_kind m) + | Pfloat32 -> Printf.sprintf "Float32_u.%s%s" name (alloc_kind m) + +let print_unboxed_float name ppf bf m = + fprintf ppf "%s" (unboxed_float_mark name bf m);; + let print_bigarray name unsafe kind ppf layout = fprintf ppf "Bigarray.%s[%s,%s]" (if unsafe then "unsafe_"^ name else name) (match kind with | Pbigarray_unknown -> "generic" | Pbigarray_float32 -> "float32" + | Pbigarray_float32_t -> "float32_t" | Pbigarray_float64 -> "float64" | Pbigarray_sint8 -> "sint8" | Pbigarray_uint8 -> "uint8" @@ -220,6 +313,7 @@ let record_rep ppf r = match r with | Record_inlined _ -> fprintf ppf "inlined" | Record_float -> fprintf ppf "float" | Record_ufloat -> fprintf ppf "ufloat" + | Record_mixed _ -> fprintf ppf "mixed" let block_shape ppf shape = match shape with | None | Some [] -> () @@ -233,6 +327,43 @@ let block_shape ppf shape = match shape with t; Format.fprintf ppf ")" +let flat_element ppf : flat_element -> unit = fun x -> + pp_print_string ppf (Types.flat_element_to_lowercase_string x) + +let flat_element_read ppf : flat_element_read -> unit = function + | Flat_read flat -> + pp_print_string ppf (Types.flat_element_to_lowercase_string flat) + | Flat_read_float_boxed m -> fprintf ppf "float[%a]" alloc_mode m + +let mixed_block_read ppf : mixed_block_read -> unit = function + | Mread_value_prefix Immediate -> pp_print_string ppf "value_int" + | Mread_value_prefix Pointer -> pp_print_string ppf "value" + | Mread_flat_suffix flat -> flat_element_read ppf flat + +let mixed_block_write ppf : mixed_block_write -> unit = function + | Mwrite_value_prefix Immediate -> pp_print_string ppf "value_int" + | Mwrite_value_prefix Pointer -> pp_print_string ppf "value" + | Mwrite_flat_suffix flat -> flat_element ppf flat + +let mixed_block_shape ppf { value_prefix_len; flat_suffix } = + begin match value_prefix_len with + | 0 -> () + | n -> fprintf ppf " (prefix=%d)" n + end; + match Array.length flat_suffix with + | 0 -> () + | 1 -> + fprintf ppf " (%a)" flat_element (flat_suffix.(0)) + | _ -> begin + Array.iteri (fun i elt -> + if i = 0 then + fprintf ppf " (%a" flat_element elt + else + fprintf ppf ",%a" flat_element elt) + flat_suffix; + fprintf ppf ")" + end + let integer_comparison ppf = function | Ceq -> fprintf ppf "==" | Cne -> fprintf ppf "!=" @@ -241,17 +372,17 @@ let integer_comparison ppf = function | Cgt -> fprintf ppf ">" | Cge -> fprintf ppf ">=" -let float_comparison ppf = function - | CFeq -> fprintf ppf "==." - | CFneq -> fprintf ppf "!=." - | CFlt -> fprintf ppf "<." - | CFnlt -> fprintf ppf "!<." - | CFle -> fprintf ppf "<=." - | CFnle -> fprintf ppf "!<=." - | CFgt -> fprintf ppf ">." - | CFngt -> fprintf ppf "!>." - | CFge -> fprintf ppf ">=." - | CFnge -> fprintf ppf "!>=." +let float_comparison = function + | CFeq -> "==" + | CFneq -> "!=" + | CFlt -> "<" + | CFnlt -> "!<" + | CFle -> "<=" + | CFnle -> "!<=" + | CFgt -> ">" + | CFngt -> "!>" + | CFge -> ">=" + | CFnge -> "!>=" let field_read_semantics ppf sem = match sem with @@ -267,31 +398,40 @@ let primitive ppf = function | Pgetpredef id -> fprintf ppf "getpredef %a!" Ident.print id | Pmakeblock(tag, Immutable, shape, mode) -> fprintf ppf "make%sblock %i%a" - (alloc_mode mode) tag block_shape shape + (alloc_mode_if_local mode) tag block_shape shape | Pmakeblock(tag, Immutable_unique, shape, mode) -> fprintf ppf "make%sblock_unique %i%a" - (alloc_mode mode) tag block_shape shape + (alloc_mode_if_local mode) tag block_shape shape | Pmakeblock(tag, Mutable, shape, mode) -> fprintf ppf "make%smutable %i%a" - (alloc_mode mode) tag block_shape shape + (alloc_mode_if_local mode) tag block_shape shape | Pmakefloatblock (Immutable, mode) -> fprintf ppf "make%sfloatblock Immutable" - (alloc_mode mode) + (alloc_mode_if_local mode) | Pmakefloatblock (Immutable_unique, mode) -> fprintf ppf "make%sfloatblock Immutable_unique" - (alloc_mode mode) + (alloc_mode_if_local mode) | Pmakefloatblock (Mutable, mode) -> fprintf ppf "make%sfloatblock Mutable" - (alloc_mode mode) + (alloc_mode_if_local mode) | Pmakeufloatblock (Immutable, mode) -> fprintf ppf "make%sufloatblock Immutable" - (alloc_mode mode) + (alloc_mode_if_local mode) | Pmakeufloatblock (Immutable_unique, mode) -> fprintf ppf "make%sufloatblock Immutable_unique" - (alloc_mode mode) + (alloc_mode_if_local mode) | Pmakeufloatblock (Mutable, mode) -> fprintf ppf "make%sufloatblock Mutable" - (alloc_mode mode) + (alloc_mode_if_local mode) + | Pmakemixedblock (tag, Immutable, abs, mode) -> + fprintf ppf "make%amixedblock %i Immutable%a" + alloc_mode mode tag mixed_block_shape abs + | Pmakemixedblock (tag, Immutable_unique, abs, mode) -> + fprintf ppf "make%amixedblock %i Immutable_unique%a" + alloc_mode mode tag mixed_block_shape abs + | Pmakemixedblock (tag, Mutable, abs, mode) -> + fprintf ppf "make%amixedblock %i Mutable%a" + alloc_mode mode tag mixed_block_shape abs | Pfield (n, ptr, sem) -> let instr = match ptr, sem with @@ -332,10 +472,13 @@ let primitive ppf = function fprintf ppf "setfield_%s%s_computed" instr init | Pfloatfield (n, sem, mode) -> fprintf ppf "floatfield%a%s %i" - field_read_semantics sem (alloc_mode mode) n + field_read_semantics sem (alloc_mode_if_local mode) n | Pufloatfield (n, sem) -> fprintf ppf "ufloatfield%a %i" field_read_semantics sem n + | Pmixedfield (n, read, _shape, sem) -> + fprintf ppf "mixedfield%a %i %a" + field_read_semantics sem n mixed_block_read read | Psetfloatfield (n, init) -> let init = match init with @@ -354,17 +497,29 @@ let primitive ppf = function | Assignment Modify_maybe_stack -> "(maybe-stack)" in fprintf ppf "setufloatfield%s %i" init n + | Psetmixedfield (n, write, _shape, init) -> + let init = + match init with + | Heap_initialization -> "(heap-init)" + | Root_initialization -> "(root-init)" + | Assignment Modify_heap -> "" + | Assignment Modify_maybe_stack -> "(maybe-stack)" + in + fprintf ppf "setmixedfield%s %i %a" + init n mixed_block_write write | Pduprecord (rep, size) -> fprintf ppf "duprecord %a %i" record_rep rep size | Prunstack -> fprintf ppf "runstack" | Pperform -> fprintf ppf "perform" | Presume -> fprintf ppf "resume" | Preperform -> fprintf ppf "reperform" | Pmake_unboxed_product layouts -> - fprintf ppf "make_unboxed_product [%a]" - (pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ", ") layout) layouts + fprintf ppf "make_unboxed_product #(%a)" + (pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ", ") (layout' false)) + layouts | Punboxed_product_field (n, layouts) -> - fprintf ppf "unboxed_product_field %d [%a]" n - (pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ", ") layout) layouts + fprintf ppf "unboxed_product_field %d #(%a)" n + (pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ", ") (layout' false)) + layouts | Pccall p -> fprintf ppf "%s" p.prim_name | Praise k -> fprintf ppf "%s" (Lambda.raise_kind k) | Psequand -> fprintf ppf "&&" @@ -386,19 +541,25 @@ let primitive ppf = function | Pasrint -> fprintf ppf "asr" | Pintcomp(cmp) -> integer_comparison ppf cmp | Pcompare_ints -> fprintf ppf "compare_ints" - | Pcompare_floats -> fprintf ppf "compare_floats" + | Pcompare_floats bf -> fprintf ppf "compare_floats %s" (boxed_float_name bf) | Pcompare_bints bi -> fprintf ppf "compare_bints %s" (boxed_integer_name bi) | Poffsetint n -> fprintf ppf "%i+" n | Poffsetref n -> fprintf ppf "+:=%i"n - | Pintoffloat -> fprintf ppf "int_of_float" - | Pfloatofint m -> fprintf ppf "float_of_int%s" (alloc_kind m) - | Pnegfloat m -> fprintf ppf "~.%s" (alloc_kind m) - | Pabsfloat m -> fprintf ppf "abs.%s" (alloc_kind m) - | Paddfloat m -> fprintf ppf "+.%s" (alloc_kind m) - | Psubfloat m -> fprintf ppf "-.%s" (alloc_kind m) - | Pmulfloat m -> fprintf ppf "*.%s" (alloc_kind m) - | Pdivfloat m -> fprintf ppf "/.%s" (alloc_kind m) - | Pfloatcomp(cmp) -> float_comparison ppf cmp + | Pfloatoffloat32 m -> print_boxed_float "float_of_float32" ppf Pfloat32 m + | Pfloat32offloat m -> print_boxed_float "float32_of_float" ppf Pfloat64 m + | Pintoffloat bf -> fprintf ppf "int_of_%s" (boxed_float_name bf) + | Pfloatofint (bf,m) -> + fprintf ppf "%s_of_int%s" (boxed_float_name bf) (alloc_kind m) + | Pabsfloat (bf,m) -> print_boxed_float "abs" ppf bf m + | Pnegfloat (bf,m) -> print_boxed_float "neg" ppf bf m + | Paddfloat (bf,m) -> print_boxed_float "add" ppf bf m + | Psubfloat (bf,m) -> print_boxed_float "sub" ppf bf m + | Pmulfloat (bf,m) -> print_boxed_float "mul" ppf bf m + | Pdivfloat (bf,m) -> print_boxed_float "div" ppf bf m + | Pfloatcomp (bf,cmp) -> + print_boxed_float (float_comparison cmp) ppf bf alloc_heap + | Punboxed_float_comp (bf,cmp) -> + print_unboxed_float (float_comparison cmp) ppf bf alloc_heap | Pstringlength -> fprintf ppf "string.length" | Pstringrefu -> fprintf ppf "string.unsafe_get" | Pstringrefs -> fprintf ppf "string.get" @@ -410,19 +571,28 @@ let primitive ppf = function | Parraylength k -> fprintf ppf "array.length[%s]" (array_kind k) | Pmakearray (k, Mutable, mode) -> - fprintf ppf "make%sarray[%s]" (alloc_mode mode) (array_kind k) + fprintf ppf "make%sarray[%s]" (alloc_mode_if_local mode) (array_kind k) | Pmakearray (k, Immutable, mode) -> - fprintf ppf "make%sarray_imm[%s]" (alloc_mode mode) (array_kind k) + fprintf ppf "make%sarray_imm[%s]" (alloc_mode_if_local mode) (array_kind k) | Pmakearray (k, Immutable_unique, mode) -> - fprintf ppf "make%sarray_unique[%s]" (alloc_mode mode) (array_kind k) + fprintf ppf "make%sarray_unique[%s]" (alloc_mode_if_local mode) + (array_kind k) | Pduparray (k, Mutable) -> fprintf ppf "duparray[%s]" (array_kind k) | Pduparray (k, Immutable) -> fprintf ppf "duparray_imm[%s]" (array_kind k) | Pduparray (k, Immutable_unique) -> fprintf ppf "duparray_unique[%s]" (array_kind k) - | Parrayrefu rk -> fprintf ppf "array.unsafe_get[%a]" array_ref_kind rk - | Parraysetu sk -> fprintf ppf "array.unsafe_set[%a]" array_set_kind sk - | Parrayrefs rk -> fprintf ppf "array.get[%a]" array_ref_kind rk - | Parraysets sk -> fprintf ppf "array.set[%a]" array_set_kind sk + | Parrayrefu (rk, idx) -> fprintf ppf "array.unsafe_get[%a indexed by %a]" + array_ref_kind rk + array_index_kind idx + | Parraysetu (sk, idx) -> fprintf ppf "array.unsafe_set[%a indexed by %a]" + array_set_kind sk + array_index_kind idx + | Parrayrefs (rk, idx) -> fprintf ppf "array.get[%a indexed by %a]" + array_ref_kind rk + array_index_kind idx + | Parraysets (sk, idx) -> fprintf ppf "array.set[%a indexed by %a]" + array_set_kind sk + array_index_kind idx | Pctconst c -> let const_name = match c with | Big_endian -> "big_endian" @@ -432,7 +602,8 @@ let primitive ppf = function | Ostype_unix -> "ostype_unix" | Ostype_win32 -> "ostype_win32" | Ostype_cygwin -> "ostype_cygwin" - | Backend_type -> "backend_type" in + | Backend_type -> "backend_type" + | Runtime5 -> "runtime5" in fprintf ppf "sys.constant_%s" const_name | Pisint { variant_only } -> fprintf ppf (if variant_only then "isint" else "obj_is_int") @@ -464,6 +635,12 @@ let primitive ppf = function | Pbintcomp(bi, Cgt) -> print_boxed_integer ">" ppf bi alloc_heap | Pbintcomp(bi, Cle) -> print_boxed_integer "<=" ppf bi alloc_heap | Pbintcomp(bi, Cge) -> print_boxed_integer ">=" ppf bi alloc_heap + | Punboxed_int_comp(bi, Ceq) -> print_unboxed_integer "==" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cne) -> print_unboxed_integer "!=" ppf bi alloc_heap + | Punboxed_int_comp(bi, Clt) -> print_unboxed_integer "<" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cgt) -> print_unboxed_integer ">" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cle) -> print_unboxed_integer "<=" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cge) -> print_unboxed_integer ">=" ppf bi alloc_heap | Pbigarrayref(unsafe, _n, kind, layout) -> print_bigarray "get" unsafe kind ppf layout | Pbigarrayset(unsafe, _n, kind, layout) -> @@ -475,6 +652,9 @@ let primitive ppf = function | Pstring_load_32(unsafe, m) -> if unsafe then fprintf ppf "string.unsafe_get32%s" (alloc_kind m) else fprintf ppf "string.get32%s" (alloc_kind m) + | Pstring_load_f32(unsafe, m) -> + if unsafe then fprintf ppf "string.unsafe_getf32%s" (alloc_kind m) + else fprintf ppf "string.getf32%s" (alloc_kind m) | Pstring_load_64(unsafe, m) -> if unsafe then fprintf ppf "string.unsafe_get64%s" (alloc_kind m) else fprintf ppf "string.get64%s" (alloc_kind m) @@ -488,6 +668,9 @@ let primitive ppf = function | Pbytes_load_32(unsafe,m) -> if unsafe then fprintf ppf "bytes.unsafe_get32%s" (alloc_kind m) else fprintf ppf "bytes.get32%s" (alloc_kind m) + | Pbytes_load_f32(unsafe,m) -> + if unsafe then fprintf ppf "bytes.unsafe_getf32%s" (alloc_kind m) + else fprintf ppf "bytes.getf32%s" (alloc_kind m) | Pbytes_load_64(unsafe,m) -> if unsafe then fprintf ppf "bytes.unsafe_get64%s" (alloc_kind m) else fprintf ppf "bytes.get64%s" (alloc_kind m) @@ -501,6 +684,9 @@ let primitive ppf = function | Pbytes_set_32(unsafe) -> if unsafe then fprintf ppf "bytes.unsafe_set32" else fprintf ppf "bytes.set32" + | Pbytes_set_f32(unsafe) -> + if unsafe then fprintf ppf "bytes.unsafe_setf32" + else fprintf ppf "bytes.setf32" | Pbytes_set_64(unsafe) -> if unsafe then fprintf ppf "bytes.unsafe_set64" else fprintf ppf "bytes.set64" @@ -508,13 +694,16 @@ let primitive ppf = function fprintf ppf "bytes.unsafe_unaligned_set128" | Pbytes_set_128 {unsafe = false} -> fprintf ppf "bytes.unaligned_set128" - | Pbigstring_load_16(unsafe) -> + | Pbigstring_load_16 { unsafe } -> if unsafe then fprintf ppf "bigarray.array1.unsafe_get16" else fprintf ppf "bigarray.array1.get16" - | Pbigstring_load_32(unsafe,m) -> + | Pbigstring_load_32 { unsafe; mode = m } -> if unsafe then fprintf ppf "bigarray.array1.unsafe_get32%s" (alloc_kind m) else fprintf ppf "bigarray.array1.get32%s" (alloc_kind m) - | Pbigstring_load_64(unsafe,m) -> + | Pbigstring_load_f32 { unsafe; mode = m } -> + if unsafe then fprintf ppf "bigarray.array1.unsafe_getf32%s" (alloc_kind m) + else fprintf ppf "bigarray.array1.getf32%s" (alloc_kind m) + | Pbigstring_load_64 { unsafe; mode = m } -> if unsafe then fprintf ppf "bigarray.array1.unsafe_get64%s" (alloc_kind m) else fprintf ppf "bigarray.array1.get64%s" (alloc_kind m) | Pbigstring_load_128 {unsafe = true; aligned = false; mode} -> @@ -525,13 +714,16 @@ let primitive ppf = function fprintf ppf "bigarray.array1.unsafe_aligned_get128%s" (alloc_kind mode) | Pbigstring_load_128 {unsafe = false; aligned = true; mode} -> fprintf ppf "bigarray.array1.aligned_get128%s" (alloc_kind mode) - | Pbigstring_set_16(unsafe) -> + | Pbigstring_set_16 { unsafe } -> if unsafe then fprintf ppf "bigarray.array1.unsafe_set16" else fprintf ppf "bigarray.array1.set16" - | Pbigstring_set_32(unsafe) -> + | Pbigstring_set_32 { unsafe } -> if unsafe then fprintf ppf "bigarray.array1.unsafe_set32" else fprintf ppf "bigarray.array1.set32" - | Pbigstring_set_64(unsafe) -> + | Pbigstring_set_f32 { unsafe } -> + if unsafe then fprintf ppf "bigarray.array1.unsafe_setf32" + else fprintf ppf "bigarray.array1.setf32" + | Pbigstring_set_64 { unsafe } -> if unsafe then fprintf ppf "bigarray.array1.unsafe_set64" else fprintf ppf "bigarray.array1.set64" | Pbigstring_set_128 {unsafe = true; aligned = false} -> @@ -542,6 +734,54 @@ let primitive ppf = function fprintf ppf "bigarray.array1.unaligned_set128" | Pbigstring_set_128 {unsafe = false; aligned = true} -> fprintf ppf "bigarray.array1.aligned_set128" + | Pfloatarray_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "floatarray.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "floatarray.get128%s" (alloc_kind mode) + | Pfloat_array_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "float_array.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "float_array.get128%s" (alloc_kind mode) + | Pint_array_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "int_array.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "int_array.get128%s" (alloc_kind mode) + | Punboxed_float_array_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "unboxed_float_array.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "unboxed_float_array.get128%s" (alloc_kind mode) + | Punboxed_float32_array_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "unboxed_float32_array.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "unboxed_float32_array.get128%s" (alloc_kind mode) + | Punboxed_int32_array_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "unboxed_int32_array.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "unboxed_int32_array.get128%s" (alloc_kind mode) + | Punboxed_int64_array_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "unboxed_int64_array.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "unboxed_int64_array.get128%s" (alloc_kind mode) + | Punboxed_nativeint_array_load_128 {unsafe; mode} -> + if unsafe then fprintf ppf "unboxed_nativeint_array.unsafe_get128%s" (alloc_kind mode) + else fprintf ppf "unboxed_nativeint_array.get128%s" (alloc_kind mode) + | Pfloatarray_set_128 {unsafe} -> + if unsafe then fprintf ppf "floatarray.unsafe_set128" + else fprintf ppf "floatarray.set128" + | Pfloat_array_set_128 {unsafe} -> + if unsafe then fprintf ppf "float_array.unsafe_set128" + else fprintf ppf "float_array.set128" + | Pint_array_set_128 {unsafe} -> + if unsafe then fprintf ppf "int_array.unsafe_set128" + else fprintf ppf "int_array.set128" + | Punboxed_float_array_set_128 {unsafe} -> + if unsafe then fprintf ppf "unboxed_float_array.unsafe_set128" + else fprintf ppf "unboxed_float_array.set128" + | Punboxed_float32_array_set_128 {unsafe} -> + if unsafe then fprintf ppf "unboxed_float32_array.unsafe_set128" + else fprintf ppf "unboxed_float32_array.set128" + | Punboxed_int32_array_set_128 {unsafe} -> + if unsafe then fprintf ppf "unboxed_int32_array.unsafe_set128" + else fprintf ppf "unboxed_int32_array.set128" + | Punboxed_int64_array_set_128 {unsafe} -> + if unsafe then fprintf ppf "unboxed_int64_array.unsafe_set128" + else fprintf ppf "unboxed_int64_array.set128" + | Punboxed_nativeint_array_set_128 {unsafe} -> + if unsafe then fprintf ppf "unboxed_nativeint_array.unsafe_set128" + else fprintf ppf "unboxed_nativeint_array.set128" | Pbswap16 -> fprintf ppf "bswap16" | Pbbswap(bi,m) -> print_boxed_integer "bswap" ppf bi m | Pint_as_pointer m -> fprintf ppf "int_as_pointer%s" (alloc_kind m) @@ -557,8 +797,9 @@ let primitive ppf = function | Pprobe_is_enabled {name} -> fprintf ppf "probe_is_enabled[%s]" name | Pobj_dup -> fprintf ppf "obj_dup" | Pobj_magic _ -> fprintf ppf "obj_magic" - | Punbox_float -> fprintf ppf "unbox_float" - | Pbox_float m -> fprintf ppf "box_float%s" (alloc_kind m) + | Punbox_float bf -> fprintf ppf "unbox_%s" (boxed_float_name bf) + | Pbox_float (bf,m) -> + fprintf ppf "box_%s%s" (boxed_float_name bf) (alloc_kind m) | Punbox_int bi -> fprintf ppf "unbox_%s" (boxed_integer_name bi) | Pbox_int (bi, m) -> fprintf ppf "box_%s%s" (boxed_integer_name bi) (alloc_kind m) @@ -566,6 +807,10 @@ let primitive ppf = function | Parray_to_iarray -> fprintf ppf "array_to_iarray" | Parray_of_iarray -> fprintf ppf "array_of_iarray" | Pget_header m -> fprintf ppf "get_header%s" (alloc_kind m) + | Preinterpret_tagged_int63_as_unboxed_int64 -> + fprintf ppf "reinterpret_tagged_int63_as_unboxed_int64" + | Preinterpret_unboxed_int64_as_tagged_int63 -> + fprintf ppf "reinterpret_unboxed_int64_as_tagged_int63" let name_of_primitive = function | Pbytes_of_string -> "Pbytes_of_string" @@ -577,6 +822,7 @@ let name_of_primitive = function | Pmakeblock _ -> "Pmakeblock" | Pmakefloatblock _ -> "Pmakefloatblock" | Pmakeufloatblock _ -> "Pmakeufloatblock" + | Pmakemixedblock _ -> "Pmakemixedblock" | Pfield _ -> "Pfield" | Pfield_computed _ -> "Pfield_computed" | Psetfield _ -> "Psetfield" @@ -585,6 +831,8 @@ let name_of_primitive = function | Psetfloatfield _ -> "Psetfloatfield" | Pufloatfield _ -> "Pufloatfield" | Psetufloatfield _ -> "Psetufloatfield" + | Pmixedfield _ -> "Pmixedfield" + | Psetmixedfield _ -> "Psetmixedfield" | Pduprecord _ -> "Pduprecord" | Pmake_unboxed_product _ -> "Pmake_unboxed_product" | Punboxed_product_field _ -> "Punboxed_product_field" @@ -607,19 +855,22 @@ let name_of_primitive = function | Pasrint -> "Pasrint" | Pintcomp _ -> "Pintcomp" | Pcompare_ints -> "Pcompare_ints" - | Pcompare_floats -> "Pcompare_floats" + | Pcompare_floats _ -> "Pcompare_floats" | Pcompare_bints _ -> "Pcompare" | Poffsetint _ -> "Poffsetint" | Poffsetref _ -> "Poffsetref" - | Pintoffloat -> "Pintoffloat" - | Pfloatofint _ -> "Pfloatofint" - | Pnegfloat _ -> "Pnegfloat" - | Pabsfloat _ -> "Pabsfloat" - | Paddfloat _ -> "Paddfloat" - | Psubfloat _ -> "Psubfloat" - | Pmulfloat _ -> "Pmulfloat" - | Pdivfloat _ -> "Pdivfloat" - | Pfloatcomp _ -> "Pfloatcomp" + | Pfloatoffloat32 _ -> "Pfloatoffloat32" + | Pfloat32offloat _ -> "Pfloat32offloat" + | Pintoffloat _ -> "Pintoffloat" + | Pfloatofint (_, _) -> "Pfloatofint" + | Pnegfloat (_, _) -> "Pnegfloat" + | Pabsfloat (_, _) -> "Pabsfloat" + | Paddfloat (_, _) -> "Paddfloat" + | Psubfloat (_, _) -> "Psubfloat" + | Pmulfloat (_, _) -> "Pmulfloat" + | Pdivfloat (_, _) -> "Pdivfloat" + | Pfloatcomp (_, _) -> "Pfloatcomp" + | Punboxed_float_comp (_, _) -> "Punboxed_float_comp" | Pstringlength -> "Pstringlength" | Pstringrefu -> "Pstringrefu" | Pstringrefs -> "Pstringrefs" @@ -654,29 +905,51 @@ let name_of_primitive = function | Plsrbint _ -> "Plsrbint" | Pasrbint _ -> "Pasrbint" | Pbintcomp _ -> "Pbintcomp" + | Punboxed_int_comp _ -> "Punboxed_int_comp" | Pbigarrayref _ -> "Pbigarrayref" | Pbigarrayset _ -> "Pbigarrayset" | Pbigarraydim _ -> "Pbigarraydim" | Pstring_load_16 _ -> "Pstring_load_16" | Pstring_load_32 _ -> "Pstring_load_32" + | Pstring_load_f32 _ -> "Pstring_load_f32" | Pstring_load_64 _ -> "Pstring_load_64" | Pstring_load_128 _ -> "Pstring_load_128" | Pbytes_load_16 _ -> "Pbytes_load_16" | Pbytes_load_32 _ -> "Pbytes_load_32" + | Pbytes_load_f32 _ -> "Pbytes_load_f32" | Pbytes_load_64 _ -> "Pbytes_load_64" | Pbytes_load_128 _ -> "Pbytes_load_128" | Pbytes_set_16 _ -> "Pbytes_set_16" | Pbytes_set_32 _ -> "Pbytes_set_32" + | Pbytes_set_f32 _ -> "Pbytes_set_f32" | Pbytes_set_64 _ -> "Pbytes_set_64" | Pbytes_set_128 _ -> "Pbytes_set_128" | Pbigstring_load_16 _ -> "Pbigstring_load_16" | Pbigstring_load_32 _ -> "Pbigstring_load_32" + | Pbigstring_load_f32 _ -> "Pbigstring_load_f32" | Pbigstring_load_64 _ -> "Pbigstring_load_64" | Pbigstring_load_128 _ -> "Pbigstring_load_128" | Pbigstring_set_16 _ -> "Pbigstring_set_16" | Pbigstring_set_32 _ -> "Pbigstring_set_32" + | Pbigstring_set_f32 _ -> "Pbigstring_set_f32" | Pbigstring_set_64 _ -> "Pbigstring_set_64" | Pbigstring_set_128 _ -> "Pbigstring_set_128" + | Pfloatarray_load_128 _ -> "Pfloatarray_load_128" + | Pfloat_array_load_128 _ -> "Pfloat_array_load_128" + | Pint_array_load_128 _ -> "Pint_array_load_128" + | Punboxed_float_array_load_128 _ -> "Punboxed_float_array_load_128" + | Punboxed_float32_array_load_128 _ -> "Punboxed_float32_array_load_128" + | Punboxed_int32_array_load_128 _ -> "Punboxed_int32_array_load_128" + | Punboxed_int64_array_load_128 _ -> "Punboxed_int64_array_load_128" + | Punboxed_nativeint_array_load_128 _ -> "Punboxed_nativeint_array_load_128" + | Pfloatarray_set_128 _ -> "Pfloatarray_set_128" + | Pfloat_array_set_128 _ -> "Pfloat_array_set_128" + | Pint_array_set_128 _ -> "Pint_array_set_128" + | Punboxed_float_array_set_128 _ -> "Punboxed_float_array_set_128" + | Punboxed_float32_array_set_128 _ -> "Punboxed_float32_array_set_128" + | Punboxed_int32_array_set_128 _ -> "Punboxed_int32_array_set_128" + | Punboxed_int64_array_set_128 _ -> "Punboxed_int64_array_set_128" + | Punboxed_nativeint_array_set_128 _ -> "Punboxed_nativeint_array_set_128" | Pbswap16 -> "Pbswap16" | Pbbswap _ -> "Pbbswap" | Pint_as_pointer _ -> "Pint_as_pointer" @@ -696,30 +969,27 @@ let name_of_primitive = function | Pprobe_is_enabled _ -> "Pprobe_is_enabled" | Pobj_dup -> "Pobj_dup" | Pobj_magic _ -> "Pobj_magic" - | Punbox_float -> "Punbox_float" - | Pbox_float _ -> "Pbox_float" + | Punbox_float _ -> "Punbox_float" + | Pbox_float (_, _) -> "Pbox_float" | Punbox_int _ -> "Punbox_int" | Pbox_int _ -> "Pbox_int" | Parray_of_iarray -> "Parray_of_iarray" | Parray_to_iarray -> "Parray_to_iarray" | Pget_header _ -> "Pget_header" + | Preinterpret_tagged_int63_as_unboxed_int64 -> + "Preinterpret_tagged_int63_as_unboxed_int64" + | Preinterpret_unboxed_int64_as_tagged_int63 -> + "Preinterpret_unboxed_int64_as_tagged_int63" -let check_attribute ppf check = - let check_property = function - | Zero_alloc -> "zero_alloc" - in +let zero_alloc_attribute ppf check = match check with - | Default_check -> () - | Ignore_assert_all p -> - fprintf ppf "ignore assert all %s@ " (check_property p) - | Assume {property=p; strict; never_returns_normally; loc = _} -> - fprintf ppf "assume_%s%s%s@ " - (check_property p) + | Default_zero_alloc -> () + | Assume {strict; never_returns_normally; loc = _} -> + fprintf ppf "assume_zero_alloc%s%s@ " (if strict then "_strict" else "") (if never_returns_normally then "_never_returns_normally" else "") - | Check {property=p; strict; loc = _; opt} -> - fprintf ppf "assert_%s%s%s@ " - (check_property p) (if opt then "_opt" else "") + | Check {strict; loc = _; } -> + fprintf ppf "assert_zero_alloc%s@ " (if strict then "_strict" else "") let function_attribute ppf t = @@ -744,7 +1014,7 @@ let function_attribute ppf t = | Always_local -> fprintf ppf "always_local@ " | Never_local -> fprintf ppf "never_local@ " end; - check_attribute ppf t.check; + zero_alloc_attribute ppf t.zero_alloc; if t.tmc_candidate then fprintf ppf "tail_mod_cons@ "; begin match t.loop with @@ -806,33 +1076,8 @@ let rec lam ppf = function apply_inlined_attribute ap.ap_inlined apply_specialised_attribute ap.ap_specialised apply_probe ap.ap_probe - | Lfunction{kind; params; return; body; attr; mode; region} -> - let pr_params ppf params = - match kind with - | Curried {nlocal} -> - fprintf ppf "@ {nlocal = %d}" nlocal; - List.iter (fun (p : Lambda.lparam) -> - (* Make sure we change this once there are attributes *) - let No_attributes = p.attributes in - fprintf ppf "@ %a%s%a" - Ident.print p.name (alloc_kind p.mode) layout p.layout) params - | Tupled -> - fprintf ppf " ("; - let first = ref true in - List.iter - (fun (p : Lambda.lparam) -> - (* Make sure we change this once there are attributes *) - let No_attributes = p.attributes in - if !first then first := false else fprintf ppf ",@ "; - Ident.print ppf p.name; - Format.fprintf ppf "%s" (alloc_kind p.mode); - layout ppf p.layout) - params; - fprintf ppf ")" in - let rmode = if region then alloc_heap else alloc_local in - fprintf ppf "@[<2>(function%s%a@ %a%a%a)@]" - (alloc_kind mode) pr_params params - function_attribute attr return_kind (rmode, return) lam body + | Lfunction lfun -> + lfunction ppf lfun | Llet _ | Lmutlet _ as expr -> let let_kind = begin function | Llet(str,_,_,_,_) -> @@ -858,9 +1103,9 @@ let rec lam ppf = function let bindings ppf id_arg_list = let spc = ref false in List.iter - (fun (id, l) -> + (fun { id; def } -> if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[<2>%a@ %a@]" Ident.print id lam l) + fprintf ppf "@[<2>%a@ %a@]" Ident.print id lfunction def) id_arg_list in fprintf ppf "@[<2>(letrec@ (@[%a@])@ %a)@]" bindings id_arg_list lam body @@ -911,8 +1156,13 @@ let rec lam ppf = function let lams ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in fprintf ppf "@[<2>(exit@ %d%a)@]" i lams ls; - | Lstaticcatch(lbody, (i, vars), lhandler, _kind) -> - fprintf ppf "@[<2>(catch@ %a@;<1 -1>with (%d%a)@ %a)@]" + | Lstaticcatch(lbody, (i, vars), lhandler, r, _kind) -> + let excl = + match r with + | Popped_region -> " exclave" + | Same_region -> "" + in + fprintf ppf "@[<2>(catch@ %a@;<1 -1>with (%d%a)%s@ %a)@]" lam lbody i (fun ppf vars -> List.iter @@ -920,7 +1170,7 @@ let rec lam ppf = function vars ) vars - lam lhandler + excl lam lhandler | Ltrywith(lbody, param, lhandler, _kind) -> fprintf ppf "@[<2>(try@ %a@;<1 -1>with %a@ %a)@]" lam lbody Ident.print param lam lhandler @@ -984,6 +1234,36 @@ and sequence ppf = function | l -> lam ppf l +and lfunction ppf {kind; params; return; body; attr; ret_mode; mode} = + let pr_params ppf params = + match kind with + | Curried {nlocal} -> + fprintf ppf "@ {nlocal = %d}" nlocal; + List.iter (fun (p : Lambda.lparam) -> + let { unbox_param } = p.attributes in + fprintf ppf "@ %a%s%a%s" + Ident.print p.name (alloc_kind p.mode) layout p.layout + (if unbox_param then "[@unboxable]" else "") + ) params + | Tupled -> + fprintf ppf " ("; + let first = ref true in + List.iter + (fun (p : Lambda.lparam) -> + let { unbox_param } = p.attributes in + if !first then first := false else fprintf ppf ",@ "; + Ident.print ppf p.name; + Format.fprintf ppf "%s" (alloc_kind p.mode); + layout ppf p.layout; + if unbox_param then Format.fprintf ppf "[@unboxable]" + ) + params; + fprintf ppf ")" in + fprintf ppf "@[<2>(function%s%a@ %a%a%a)@]" + (alloc_kind mode) pr_params params + function_attribute attr return_kind (ret_mode, return) lam body + + let structured_constant = struct_const let lambda = lam diff --git a/lambda/printlambda.mli b/lambda/printlambda.mli index 9f56afb32ff..f6996b2b1ee 100644 --- a/lambda/printlambda.mli +++ b/lambda/printlambda.mli @@ -18,21 +18,33 @@ open Lambda open Format val integer_comparison: formatter -> integer_comparison -> unit -val float_comparison: formatter -> float_comparison -> unit +val float_comparison: float_comparison -> string val structured_constant: formatter -> structured_constant -> unit val lambda: formatter -> lambda -> unit +val lfunction : formatter -> lfunction -> unit val program: formatter -> program -> unit val primitive: formatter -> primitive -> unit val name_of_primitive : primitive -> string val variant_kind : (formatter -> value_kind -> unit) -> - formatter -> consts:int list -> non_consts:(int * value_kind list) list -> + formatter -> consts:int list -> non_consts:(int * constructor_shape) list -> unit val value_kind : formatter -> value_kind -> unit val value_kind' : formatter -> value_kind -> unit val layout : formatter -> layout -> unit val block_shape : formatter -> value_kind list option -> unit +val flat_element : formatter -> flat_element -> unit +val flat_element_read : formatter -> flat_element_read -> unit +val mixed_block_read : formatter -> mixed_block_read -> unit +val mixed_block_write : formatter -> mixed_block_write -> unit +val mixed_block_shape : formatter -> mixed_block_shape -> unit val record_rep : formatter -> Types.record_representation -> unit val print_bigarray : string -> bool -> Lambda.bigarray_kind -> formatter -> Lambda.bigarray_layout -> unit -val check_attribute : formatter -> check_attribute -> unit +val zero_alloc_attribute : formatter -> zero_alloc_attribute -> unit +val alloc_mode : formatter -> alloc_mode -> unit +val array_kind : array_kind -> string + +val tag_and_constructor_shape : + (formatter -> value_kind -> unit) -> + formatter -> int * constructor_shape -> unit diff --git a/lambda/simplif.ml b/lambda/simplif.ml index be250b5d0a6..3877d30e150 100644 --- a/lambda/simplif.ml +++ b/lambda/simplif.ml @@ -16,7 +16,6 @@ (* Elimination of useless Llet(Alias) bindings. Also transform let-bound references into variables. *) -open Asttypes open Lambda open Debuginfo.Scoped_location @@ -24,6 +23,13 @@ open Debuginfo.Scoped_location exception Real_reference +let check_function_escape id lfun = + (* Check that the identifier is not one of the parameters *) + let param_is_id { name; _ } = Ident.same id name in + assert (not (List.exists param_is_id lfun.params)); + if Ident.Set.mem id (Lambda.free_variables lfun.body) then + raise Real_reference + let rec eliminate_ref id = function Lvar v as lam -> if Ident.same v id then raise Real_reference else lam @@ -31,17 +37,16 @@ let rec eliminate_ref id = function | Lapply ap -> Lapply{ap with ap_func = eliminate_ref id ap.ap_func; ap_args = List.map (eliminate_ref id) ap.ap_args} - | Lfunction _ as lam -> - if Ident.Set.mem id (free_variables lam) - then raise Real_reference - else lam + | Lfunction lfun as lam -> + check_function_escape id lfun; + lam | Llet(str, kind, v, e1, e2) -> Llet(str, kind, v, eliminate_ref id e1, eliminate_ref id e2) | Lmutlet(kind, v, e1, e2) -> Lmutlet(kind, v, eliminate_ref id e1, eliminate_ref id e2) | Lletrec(idel, e2) -> - Lletrec(List.map (fun (v, e) -> (v, eliminate_ref id e)) idel, - eliminate_ref id e2) + List.iter (fun rb -> check_function_escape id rb.def) idel; + Lletrec(idel, eliminate_ref id e2) | Lprim(Pfield (0, _, _), [Lvar v], _) when Ident.same v id -> Lmutvar id | Lprim(Psetfield(0, _, _), [Lvar v; e], _) when Ident.same v id -> @@ -69,8 +74,8 @@ let rec eliminate_ref id = function Option.map (eliminate_ref id) default, loc, kind) | Lstaticraise (i,args) -> Lstaticraise (i,List.map (eliminate_ref id) args) - | Lstaticcatch(e1, i, e2, kind) -> - Lstaticcatch(eliminate_ref id e1, i, eliminate_ref id e2, kind) + | Lstaticcatch(e1, i, e2, r, kind) -> + Lstaticcatch(eliminate_ref id e1, i, eliminate_ref id e2, r, kind) | Ltrywith(e1, v, e2, kind) -> Ltrywith(eliminate_ref id e1, v, eliminate_ref id e2, kind) | Lifthenelse(e1, e2, e3, kind) -> @@ -136,7 +141,7 @@ let simplify_exits lam = | Lmutlet(_kind, _v, l1, l2) -> count ~try_depth l2; count ~try_depth l1 | Lletrec(bindings, body) -> - List.iter (fun (_v, l) -> count ~try_depth l) bindings; + List.iter (fun { def = { body } } -> count ~try_depth body) bindings; count ~try_depth body | Lprim(_p, ll, _) -> List.iter (count ~try_depth) ll | Lswitch(l, sw, _loc, _kind) -> @@ -157,18 +162,24 @@ let simplify_exits lam = | Lstaticraise (i,ls) -> incr_exit i 1 try_depth; List.iter (count ~try_depth) ls - | Lstaticcatch (l1,(i,[]),Lstaticraise (j,[]), _) -> + | Lstaticcatch (l1,(i,[]),Lstaticraise (j,[]), _, _) -> (* i will be replaced by j in l1, so each occurrence of i in l1 increases j's ref count *) count ~try_depth l1 ; let ic = get_exit i in incr_exit j ic.count (Misc.Stdlib.Int.max try_depth ic.max_depth) - | Lstaticcatch(l1, (i,_), l2, _) -> + | Lstaticcatch(l1, (i,_), l2, r, _) -> count ~try_depth l1; (* If l1 does not contain (exit i), l2 will be removed, so don't count its exits *) - if (get_exit i).count > 0 then + if (get_exit i).count > 0 then begin + let try_depth = + match r with + | Popped_region -> try_depth - 1 + | Same_region -> try_depth + in count ~try_depth l2 + end | Ltrywith(l1, _v, l2, _kind) -> count ~try_depth:(try_depth+1) l1; count ~try_depth l2; @@ -233,16 +244,25 @@ let simplify_exits lam = | Lapply ap -> Lapply{ap with ap_func = simplif ~layout:None ~try_depth ap.ap_func; ap_args = List.map (simplif ~layout:None ~try_depth) ap.ap_args} - | Lfunction{kind; params; return; mode; region; body = l; attr; loc} -> - lfunction ~kind ~params ~return ~mode ~region - ~body:(simplif ~layout:None ~try_depth l) ~attr ~loc + | Lfunction lfun -> + Lfunction (map_lfunction (simplif ~layout:None ~try_depth) lfun) | Llet(str, kind, v, l1, l2) -> Llet(str, kind, v, simplif ~layout:None ~try_depth l1, simplif ~layout ~try_depth l2) | Lmutlet(kind, v, l1, l2) -> Lmutlet(kind, v, simplif ~layout:None ~try_depth l1, simplif ~layout ~try_depth l2) | Lletrec(bindings, body) -> - Lletrec(List.map (fun (v, l) -> (v, simplif ~layout:None ~try_depth l)) bindings, - simplif ~layout ~try_depth body) + let bindings = + List.map (fun ({ def = {kind; params; return; body = l; attr; loc; + mode; ret_mode; region} } + as rb) -> + let def = + lfunction' ~kind ~params ~return ~mode ~ret_mode ~region + ~body:(simplif ~layout:None ~try_depth l) ~attr ~loc + in + { rb with def }) + bindings + in + Lletrec(bindings, simplif ~layout ~try_depth body) | Lprim(p, ll, loc) -> begin let ll = List.map (simplif ~layout:None ~try_depth) ll in match p, ll with @@ -306,10 +326,15 @@ let simplify_exits lam = with | Not_found -> Lstaticraise (i,ls) end - | Lstaticcatch (l1,(i,[]),(Lstaticraise (_j,[]) as l2),_) -> + | Lstaticcatch (l1,(i,[]),(Lstaticraise (_j,[]) as l2),_,_) -> Hashtbl.add subst i ([],simplif ~layout ~try_depth l2) ; simplif ~layout ~try_depth l1 - | Lstaticcatch (l1,(i,xs),l2,kind) -> + | Lstaticcatch (l1,(i,xs),l2,r,kind) -> + let try_depth = + match r with + | Popped_region -> try_depth - 1 + | Same_region -> try_depth + in let {count; max_depth} = get_exit i in if count = 0 then (* Discard staticcatch: not matching exit *) @@ -326,6 +351,7 @@ let simplify_exits lam = simplif ~layout ~try_depth l1, (i,xs), simplif ~layout ~try_depth l2, + r, result_layout kind) | Ltrywith(l1, v, l2, kind) -> let l1 = simplif ~layout ~try_depth:(try_depth + 1) l1 in @@ -454,7 +480,7 @@ let simplify_lets lam = count bv l1; count bv l2 | Lletrec(bindings, body) -> - List.iter (fun (_v, l) -> count bv l) bindings; + List.iter (fun { def } -> count bv def.body) bindings; count bv body | Lprim(_p, ll, _) -> List.iter (count bv) ll | Lswitch(l, sw, _loc, _kind) -> @@ -474,7 +500,7 @@ let simplify_lets lam = | None -> () end | Lstaticraise (_i,ls) -> List.iter (count bv) ls - | Lstaticcatch(l1, _, l2, _) -> count bv l1; count bv l2 + | Lstaticcatch(l1, _, l2, Same_region, _) -> count bv l1; count bv l2 | Ltrywith(l1, _v, l2, _kind) -> count bv l1; count bv l2 | Lifthenelse(l1, l2, l3, _kind) -> count bv l1; count bv l2; count bv l3 | Lsequence(l1, l2) -> count bv l1; count bv l2 @@ -497,6 +523,11 @@ let simplify_lets lam = single-use optimizations by treating them the same as lambdas and loops *) count Ident.Map.empty l + | Lstaticcatch(l1, _, l2, Popped_region, _) -> + count bv l1; + (* Don't move code into an exclave *) + count Ident.Map.empty l2 + and count_default bv sw = match sw.sw_failaction with | None -> () @@ -556,13 +587,14 @@ let simplify_lets lam = | _ -> no_opt () end | Lfunction{kind=outer_kind; params; return=outer_return; body = l; - attr; loc; mode; region=outer_region} -> + attr=attr1; loc; ret_mode; mode; region=outer_region} -> begin match outer_kind, outer_region, simplif l with Curried {nlocal=0}, true, Lfunction{kind=Curried _ as kind; params=params'; return=return2; - body; attr; loc; mode=inner_mode; region} + body; attr=attr2; loc; mode=inner_mode; ret_mode; region} when optimize && + attr1.may_fuse_arity && attr2.may_fuse_arity && List.length params + List.length params' <= Lambda.max_arity() -> (* The returned function's mode should match the outer return mode *) assert (is_heap_mode inner_mode); @@ -571,9 +603,9 @@ let simplify_lets lam = type of the merged function taking [params @ params'] as parameters is the type returned after applying [params']. *) let return = return2 in - lfunction ~kind ~params:(params @ params') ~return ~body ~attr ~loc ~mode ~region + lfunction ~kind ~params:(params @ params') ~return ~body ~attr:attr1 ~loc ~mode ~ret_mode ~region | kind, region, body -> - lfunction ~kind ~params ~return:outer_return ~body ~attr ~loc ~mode ~region + lfunction ~kind ~params ~return:outer_return ~body ~attr:attr1 ~loc ~mode ~ret_mode ~region end | Llet(_str, _k, v, Lvar w, l2) when optimize -> Hashtbl.add subst v (simplif (Lvar w)); @@ -586,7 +618,9 @@ let simplify_lets lam = let slbody = simplif lbody in begin try let kind = match kind_ref with - | None -> Lambda.layout_field + | None -> + (* This is a [Pmakeblock] so the fields are all values *) + Lambda.layout_value_field | Some [field_kind] -> Pvalue field_kind | Some _ -> assert false in @@ -608,7 +642,12 @@ let simplify_lets lam = | Llet(str, kind, v, l1, l2) -> mklet str kind v (simplif l1) (simplif l2) | Lmutlet(kind, v, l1, l2) -> mkmutlet kind v (simplif l1) (simplif l2) | Lletrec(bindings, body) -> - Lletrec(List.map (fun (v, l) -> (v, simplif l)) bindings, simplif body) + let bindings = + List.map (fun rb -> + { rb with def = map_lfunction simplif rb.def } + ) bindings + in + Lletrec(bindings, simplif body) | Lprim(p, ll, loc) -> Lprim(p, List.map simplif ll, loc) | Lswitch(l, sw, loc, kind) -> let new_l = simplif l @@ -626,8 +665,8 @@ let simplify_lets lam = Option.map simplif d,loc, kind) | Lstaticraise (i,ls) -> Lstaticraise (i, List.map simplif ls) - | Lstaticcatch(l1, (i,args), l2, kind) -> - Lstaticcatch (simplif l1, (i,args), simplif l2, kind) + | Lstaticcatch(l1, (i,args), l2, r, kind) -> + Lstaticcatch (simplif l1, (i,args), simplif l2, r, kind) | Ltrywith(l1, v, l2, kind) -> Ltrywith(simplif l1, v, simplif l2, kind) | Lifthenelse(l1, l2, l3, kind) -> Lifthenelse(simplif l1, simplif l2, simplif l3, kind) | Lsequence(Lifused(v, l1), l2) -> @@ -678,14 +717,14 @@ let rec emit_tail_infos is_tail lambda = end; emit_tail_infos false ap.ap_func; list_emit_tail_infos false ap.ap_args - | Lfunction {body = lam} -> - emit_tail_infos true lam + | Lfunction lfun -> + emit_tail_infos_lfunction is_tail lfun | Llet (_, _k, _, lam, body) | Lmutlet (_k, _, lam, body) -> emit_tail_infos false lam; emit_tail_infos is_tail body | Lletrec (bindings, body) -> - List.iter (fun (_, lam) -> emit_tail_infos false lam) bindings; + List.iter (fun { def } -> emit_tail_infos_lfunction is_tail def) bindings; emit_tail_infos is_tail body | Lprim ((Pbytes_to_string | Pbytes_of_string | Parray_to_iarray | Parray_of_iarray), @@ -711,7 +750,7 @@ let rec emit_tail_infos is_tail lambda = Option.iter (emit_tail_infos is_tail) d | Lstaticraise (_, l) -> list_emit_tail_infos false l - | Lstaticcatch (body, _, handler, _kind) -> + | Lstaticcatch (body, _, handler, _, _kind) -> emit_tail_infos is_tail body; emit_tail_infos is_tail handler | Ltrywith (body, _, handler, _k) -> @@ -749,6 +788,10 @@ and list_emit_tail_infos_fun f is_tail = List.iter (fun x -> emit_tail_infos is_tail (f x)) and list_emit_tail_infos is_tail = List.iter (emit_tail_infos is_tail) +and emit_tail_infos_lfunction _is_tail lfun = + (* Tail call annotations are only meaningful with respect to the + current function; so entering a function resets the [is_tail] flag *) + emit_tail_infos true lfun.body (* Split a function with default parameters into a wrapper and an inner function. The wrapper fills in missing optional parameters @@ -759,7 +802,7 @@ and list_emit_tail_infos is_tail = function's body. *) let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body - ~attr ~loc ~mode ~region:orig_region = + ~attr ~loc ~mode ~ret_mode ~region:orig_region = let rec aux map add_region = function (* When compiling [fun ?(x=expr) -> body], this is first translated to: @@ -785,7 +828,11 @@ let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body -> let wrapper_body, inner = aux ((optparam, id) :: map) add_region rest in Llet(Strict, k, id, def, wrapper_body), inner - | Lregion (rest, _) -> aux map true rest + | Lregion (rest, ret) -> + let wrapper_body, inner = aux map true rest in + if may_allocate_in_region wrapper_body then + Lregion (wrapper_body, ret), inner + else wrapper_body, inner | Lexclave rest -> aux map true rest | _ when map = [] -> raise Exit | body -> @@ -797,10 +844,9 @@ let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body let inner_id = Ident.create_local (Ident.name fun_id ^ "_inner") in let map_param (p : Lambda.lparam) = try - (* If the param is optional, then it must be a value *) { name = List.assoc p.name map; - layout = Lambda.layout_field; + layout = Lambda.layout_optional_arg; attributes = Lambda.default_param_attribute; mode = p.mode } @@ -813,7 +859,7 @@ let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body ap_func = Lvar inner_id; ap_args = args; ap_result_layout = return; - ap_loc = Loc_unknown; + ap_loc = loc; ap_region_close = Rc_normal; ap_mode = alloc_heap; ap_tailcall = Default_tailcall; @@ -834,11 +880,11 @@ let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body let body = Lambda.rename subst body in let body = if add_region then Lregion (body, return) else body in let inner_fun = - lfunction ~kind:(Curried {nlocal=0}) + lfunction' ~kind:(Curried {nlocal=0}) ~params:new_ids - ~return ~body ~attr ~loc ~mode ~region:true + ~return ~body ~attr ~loc ~mode ~ret_mode ~region:true in - (wrapper_body, (inner_id, inner_fun)) + (wrapper_body, { id = inner_id; def = inner_fun }) in try (* TODO: enable this optimisation even in the presence of local returns *) @@ -848,10 +894,15 @@ let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body | _ -> assert orig_region end; let body, inner = aux [] false body in - let attr = { default_stub_attribute with check = attr.check } in - [(fun_id, lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~region:true); inner] + let attr = { default_stub_attribute with zero_alloc = attr.zero_alloc } in + [{ id = fun_id; + def = lfunction' ~kind ~params ~return ~body ~attr ~loc + ~mode ~ret_mode ~region:true }; + inner] with Exit -> - [(fun_id, lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~region:orig_region)] + [{ id = fun_id; + def = lfunction' ~kind ~params ~return ~body ~attr ~loc + ~mode ~ret_mode ~region:orig_region }] (* Simplify local let-bound functions: if all occurrences are fully-applied function calls in the same "tail scope", replace the @@ -866,8 +917,14 @@ type slot = func: lfunction; function_scope: lambda; mutable scope: lambda option; + mutable closed_region: lambda option; } +type exclave_status = + | No_exclave + | Exclave + | Within_exclave + module LamTbl = Hashtbl.Make(struct type t = lambda let equal = (==) @@ -912,21 +969,27 @@ let simplify_local_functions lam = let r = { func = lf; function_scope = !current_function_scope; - scope = None } + scope = None; + closed_region = None } in Hashtbl.add slots id r; tail cont; begin match Hashtbl.find_opt slots id with - | Some {scope = Some scope; _} -> + | Some {scope = Some scope; closed_region; _} -> let st = next_raise_count () in - let sc = + let sc, exclave = (* Do not move higher than current lambda *) - if scope == !current_scope - || is_current_region_scope scope then cont - else scope + if scope == !current_scope then cont, No_exclave + else if is_current_region_scope scope then begin + match closed_region with + | Some region when region == !current_scope -> + cont, Exclave + | _ -> + cont, Within_exclave + end else scope, No_exclave in Hashtbl.add static_id id st; - LamTbl.add static sc (st, lf); + LamTbl.add static sc (st, lf, exclave); (* The body of the function will become an handler in that "scope". *) with_scope ~scope lf.body @@ -936,10 +999,11 @@ let simplify_local_functions lam = function_definition lf end | Lapply {ap_func = Lvar id; ap_args; ap_region_close; _} -> - let curr_scope = + let curr_scope, closed_region = match ap_region_close with - | Rc_normal | Rc_nontail -> !current_scope - | Rc_close_at_apply -> Option.get !current_region_scope + | Rc_normal | Rc_nontail -> !current_scope, None + | Rc_close_at_apply -> + Option.get !current_region_scope, Some !current_scope in begin match Hashtbl.find_opt slots id with | Some {func; _} @@ -955,9 +1019,15 @@ let simplify_local_functions lam = Hashtbl.remove slots id | Some ({scope = None; _} as slot) -> (* First use of the function: remember the current tail scope *) - slot.scope <- Some curr_scope - | _ -> - () + slot.scope <- Some curr_scope; + slot.closed_region <- closed_region + | Some ({closed_region = Some old_closed_region} as slot) -> begin + match closed_region with + | Some closed_region when closed_region == old_closed_region -> + () + | _ -> slot.closed_region <- None + end + | _ -> () end; List.iter non_tail ap_args | Lvar id -> @@ -1023,8 +1093,15 @@ let simplify_local_functions lam = (fun p -> (p.name, p.layout)) lf.params in List.fold_right - (fun (st, lf) lam -> - Lstaticcatch (lam, (st, new_params lf), rewrite lf.body, lf.return) + (fun (st, lf, exclave) lam -> + let body = rewrite lf.body in + let body, r = + match exclave with + | No_exclave -> body, Same_region + | Exclave -> Lexclave body, Same_region + | Within_exclave -> body, Popped_region + in + Lstaticcatch (lam, (st, new_params lf), body, r, lf.return) ) (LamTbl.find_all static lam0) lam diff --git a/lambda/simplif.mli b/lambda/simplif.mli index 2bcacfed5dd..0cb106032a1 100644 --- a/lambda/simplif.mli +++ b/lambda/simplif.mli @@ -38,5 +38,6 @@ val split_default_wrapper -> attr:function_attribute -> loc:Lambda.scoped_location -> mode:Lambda.alloc_mode + -> ret_mode:Lambda.alloc_mode -> region:bool - -> (Ident.t * lambda) list + -> rec_binding list diff --git a/lambda/tmc.ml b/lambda/tmc.ml index 58280f392fc..d70afafa6d0 100644 --- a/lambda/tmc.ml +++ b/lambda/tmc.ml @@ -130,7 +130,7 @@ end = struct let tmc_placeholder = (* we choose a placeholder whose tagged representation will be reconizable. *) - Lconst (Const_base (Const_int (0xBBBB / 2))) + Lambda.dummy_constant let with_placeholder constr (body : offset destination -> lambda) = let k_with_placeholder = @@ -169,7 +169,7 @@ end = struct List.fold_right (fun binding body -> match binding with | None -> body - | Some (v, lam) -> Llet(Strict, Lambda.layout_field, v, lam, body) + | Some (v, lam) -> Llet(Strict, Lambda.layout_tmc_field, v, lam, body) ) bindings body in fun ~block_id constr body -> bind_list ~block_id ~arg_offset:0 constr.before @@ fun vbefore -> @@ -657,12 +657,12 @@ let rec choice ctx t = let l1 = traverse ctx l1 in let+ l2 = choice ctx ~tail l2 in Ltrywith (l1, id, l2, kind) - | Lstaticcatch (l1, ids, l2, kind) -> + | Lstaticcatch (l1, ids, l2, r, kind) -> (* In [static-catch l1 with ids -> l2], the term [l1] is in fact in tail-position *) let+ l1 = choice ctx ~tail l1 and+ l2 = choice ctx ~tail l2 in - Lstaticcatch (l1, ids, l2, kind) + Lstaticcatch (l1, ids, l2, r, kind) | Levent (lam, lev) -> let+ lam = choice ctx ~tail lam in Levent (lam, lev) @@ -879,31 +879,36 @@ let rec choice ctx t = | Psetfield _ | Psetfield_computed _ | Pfloatfield _ | Psetfloatfield _ | Pufloatfield _ | Psetufloatfield _ + | Pmixedfield _ | Psetmixedfield _ | Pccall _ | Praise _ | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pdivint _ | Pmodint _ | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint - | Pintcomp _ + | Pintcomp _ | Punboxed_int_comp _ | Poffsetint _ | Poffsetref _ - | Pintoffloat | Pfloatofint _ - | Pnegfloat _ | Pabsfloat _ - | Paddfloat _ | Psubfloat _ | Pmulfloat _ | Pdivfloat _ - | Pfloatcomp _ + | Pintoffloat _ | Pfloatofint (_, _) + | Pfloatoffloat32 _ | Pfloat32offloat _ + | Pnegfloat (_, _) | Pabsfloat (_, _) + | Paddfloat (_, _) | Psubfloat (_, _) + | Pmulfloat (_, _) | Pdivfloat (_, _) + | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets | Parraylength _ | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ | Pisint _ | Pisout | Pignore - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ + | Preinterpret_tagged_int63_as_unboxed_int64 + | Preinterpret_unboxed_int64_as_tagged_int63 (* we don't handle effect or DLS primitives *) | Prunstack | Pperform | Presume | Preperform | Pdls_get (* we don't handle atomic primitives *) | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Patomic_load _ - | Punbox_float | Pbox_float _ + | Punbox_float _ | Pbox_float (_, _) | Punbox_int _ | Pbox_int _ (* we don't handle array indices as destinations yet *) @@ -912,9 +917,12 @@ let rec choice ctx t = (* we don't handle { foo with x = ...; y = recursive-call } *) | Pduprecord _ - (* we don't handle all-float records *) + (* we don't handle all-float records or mixed blocks. If we + did, we'd need to remove references to Lambda.layout_tmc_field + *) | Pmakefloatblock _ | Pmakeufloatblock _ + | Pmakemixedblock _ (* nor unboxed products *) | Pmake_unboxed_product _ | Punboxed_product_field _ @@ -935,12 +943,32 @@ let rec choice ctx t = (* more common cases... *) | Pbigarrayref _ | Pbigarrayset _ | Pbigarraydim _ - | Pstring_load_16 _ | Pstring_load_32 _ | Pstring_load_64 _ | Pstring_load_128 _ - | Pbytes_load_16 _ | Pbytes_load_32 _ | Pbytes_load_64 _ | Pbytes_load_128 _ - | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_64 _ | Pbytes_set_128 _ - | Pbigstring_load_16 _ | Pbigstring_load_32 _ | Pbigstring_load_64 _ - | Pbigstring_load_128 _ | Pbigstring_set_16 _ | Pbigstring_set_32 _ + | Pstring_load_16 _ | Pstring_load_32 _ | Pstring_load_f32 _ + | Pstring_load_64 _ | Pstring_load_128 _ + | Pbytes_load_16 _ | Pbytes_load_32 _ | Pbytes_load_f32 _ + | Pbytes_load_64 _ | Pbytes_load_128 _ + | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_f32 _ + | Pbytes_set_64 _ | Pbytes_set_128 _ + | Pbigstring_load_16 _ | Pbigstring_load_32 _ | Pbigstring_load_f32 _ + | Pbigstring_load_64 _ | Pbigstring_load_128 _ + | Pbigstring_set_16 _ | Pbigstring_set_32 _ | Pbigstring_set_f32 _ | Pbigstring_set_64 _ | Pbigstring_set_128 _ + | Pfloatarray_load_128 _ + | Pfloat_array_load_128 _ + | Pint_array_load_128 _ + | Punboxed_float_array_load_128 _ + | Punboxed_float32_array_load_128 _ + | Punboxed_int32_array_load_128 _ + | Punboxed_int64_array_load_128 _ + | Punboxed_nativeint_array_load_128 _ + | Pfloatarray_set_128 _ + | Pfloat_array_set_128 _ + | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _ + | Punboxed_float32_array_set_128 _ + | Punboxed_int32_array_set_128 _ + | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ | Pget_header _ | Pctconst _ | Pbswap16 @@ -970,20 +998,43 @@ and traverse ctx = function | lam -> shallow_map ~tail:(traverse ctx) ~non_tail:(traverse ctx) lam +and traverse_lfunction ctx lfun = + map_lfunction (traverse ctx) lfun + and traverse_let outer_ctx var def = let inner_ctx = declare_binding outer_ctx (var, def) in - let bindings = traverse_binding outer_ctx inner_ctx (var, def) in + let bindings = + traverse_let_binding outer_ctx inner_ctx var def + in inner_ctx, bindings and traverse_letrec ctx bindings = - let ctx = List.fold_left declare_binding ctx bindings in - let bindings = List.concat_map (traverse_binding ctx ctx) bindings in + let ctx = + List.fold_left (fun ctx { id; def } -> + declare_binding ctx (id, Lfunction def) + ) ctx bindings + in + let bindings = + List.concat_map (traverse_letrec_binding ctx) bindings + in ctx, bindings -and traverse_binding outer_ctx inner_ctx (var, def) = +and traverse_let_binding outer_ctx inner_ctx var def = match find_candidate def with - | None -> [(var, traverse outer_ctx def)] + | None -> [ var, traverse outer_ctx def ] | Some lfun -> + let functions = make_dps_variant var inner_ctx outer_ctx lfun in + List.map (fun (var, lfun) -> var, Lfunction lfun) functions + +and traverse_letrec_binding ctx { id; def } = + if def.attr.tmc_candidate + then + let functions = make_dps_variant id ctx ctx def in + List.map (fun (id, def) -> { id; def }) functions + else + [ { id; def = traverse_lfunction ctx def } ] + +and make_dps_variant var inner_ctx outer_ctx (lfun : lfunction) = let special = Ident.Map.find var inner_ctx.specialized in let fun_choice = choice outer_ctx ~tail:true lfun.body in if fun_choice.Choice.tmc_calls = [] then @@ -991,9 +1042,9 @@ and traverse_binding outer_ctx inner_ctx (var, def) = (Debuginfo.Scoped_location.to_location lfun.loc) Warnings.Unused_tmc_attribute; let direct = - let { kind; params; return; body = _; attr; loc; mode; region } = lfun in + let { kind; params; return; body = _; attr; loc; mode; ret_mode; region } = lfun in let body = Choice.direct fun_choice in - lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~region in + lfunction' ~kind ~params ~return ~body ~attr ~loc ~mode ~ret_mode ~region in let dps = let dst_param = { var = Ident.create_local "dst"; @@ -1006,14 +1057,14 @@ and traverse_binding outer_ctx inner_ctx (var, def) = match lfun.mode, lfun.kind with | Alloc_heap, Tupled -> (* Support of Tupled function: see [choice_apply]. *) - Curried {nlocal=0} + Curried {nlocal=0} | Alloc_local, (Tupled | Curried _) -> - Curried {nlocal=List.length params} + Curried {nlocal=List.length params} | Alloc_heap, (Curried _ as k) -> (* Prepending arguments does not affect nlocal *) k in - Lambda.duplicate @@ lfunction + Lambda.duplicate_function @@ lfunction' ~kind ~params ~return:lfun.return @@ -1021,10 +1072,11 @@ and traverse_binding outer_ctx inner_ctx (var, def) = ~attr:lfun.attr ~loc:lfun.loc ~mode:lfun.mode + ~ret_mode:lfun.ret_mode ~region:true in let dps_var = special.dps_id in - [(var, direct); (dps_var, dps)] + [var, direct; dps_var, dps] and traverse_list ctx terms = List.map (traverse ctx) terms diff --git a/lambda/transl_array_comprehension.ml b/lambda/transl_array_comprehension.ml index 785aa31cf07..2eec81015f6 100644 --- a/lambda/transl_array_comprehension.ml +++ b/lambda/transl_array_comprehension.ml @@ -207,9 +207,7 @@ end = struct let raise_overflow_exn ~loc = let loc' = Debuginfo.Scoped_location.to_location loc in let slot = - transl_extension_path - loc - (Lazy.force Env.initial) + transl_extension_path loc (Lazy.force Env.initial) Predef.path_invalid_argument in (* CR-someday aspectorzabusky: We might want to raise an event here for @@ -217,15 +215,16 @@ end = struct [Translprim.event_after]), but it's not clear what event that would be, and this isn't a feature we expect to use. We can add it when it seems important, or when we upstream this change. *) - Lprim(Praise Raise_regular, - [Lprim(Pmakeblock(0, Immutable, None, alloc_heap), - [ slot - ; string - ~loc:loc' - "integer overflow when precomputing the size of an array \ - comprehension" ], - loc)], - loc) + Lprim + ( Praise Raise_regular, + [ Lprim + ( Pmakeblock (0, Immutable, None, alloc_heap), + [ slot; + string ~loc:loc' + "integer overflow when precomputing the size of an array \ + comprehension" ], + loc ) ], + loc ) (** [safe_mul_pos_vals ~loc x y] generates the lambda expression that computes the product [x * y] of two strictly positive (nonzero!) integers and fails @@ -241,10 +240,11 @@ end = struct multiplication: [(x * y)/y = x]. We assume the inputs are values, so we don't have to bind them first to avoid extra computation. *) Let_binding.let_one product - (Lifthenelse(product.var / y = x, - product.var, - raise_overflow_exn ~loc, - Pvalue Pintval)) + (Lifthenelse + ( product.var / y = x, + product.var, + raise_overflow_exn ~loc, + Pvalue Pintval )) (** [safe_product_pos_vals ~loc xs] generates the lambda expression that computes the product of all the lambda values in [xs] assuming they are @@ -255,17 +255,18 @@ end = struct (* This operation is associative, so the fact that [List.fold_left] brackets as [(((one * two) * three) * four)] shouldn't matter *) | x :: xs -> List.fold_left (safe_mul_pos_vals ~loc) x.Let_binding.var xs - | [] -> int 1 - (* The empty list case can't happen with comprehensions; we could raise an - error here instead of returning 1 *) + | [] -> int 1 + (* The empty list case can't happen with comprehensions; we could raise an + error here instead of returning 1 *) (* The inputs are *not* required to be values, as we save them in variables. We could avoid making let-bindings for lambda-terms that are already variables, but we assume the optimizer can deal with that case nicely. *) let safe_product_pos ?(variable_name = "x") ~loc factors = let factors = - List.map (Let_binding.make (Immutable Strict) (Pvalue Pintval) - variable_name) factors + List.map + (Let_binding.make (Immutable Strict) (Pvalue Pintval) variable_name) + factors in Let_binding.let_all factors (safe_product_pos_vals ~loc factors) end @@ -291,23 +292,25 @@ module Iterator_bindings = struct right-hand side of an [in] iterator; this last binding is also always referenced multiple times.) *) type t = - | Range of { start : Let_binding.t (* Always bound *) - ; stop : Let_binding.t (* Always bound *) - ; direction : direction_flag } - (** The translation of [Typedtree.Texp_comp_range], an integer iterator + | Range of + { start : Let_binding.t; (* Always bound *) + stop : Let_binding.t; (* Always bound *) + direction : direction_flag + } + (** The translation of [Typedtree.Texp_comp_range], an integer iterator ([... = ... (down)to ...]) *) - | Array of { iter_arr : Let_binding.t (* Always bound *) - ; iter_len : Let_binding.t } - (** The translation of [Typedtree.Texp_comp_in], an array iterator + | Array of + { iter_arr : Let_binding.t; (* Always bound *) + iter_len : Let_binding.t + } + (** The translation of [Typedtree.Texp_comp_in], an array iterator ([... in ...]). Note that we always remember the array ([iter_arr]), as it's indexed repeatedly no matter what. *) (** Get the [Let_binding.t]s out of a translated iterator *) let let_bindings = function - | Range { start; stop; direction = _ } -> - [start; stop] - | Array { iter_arr; iter_len } -> - [iter_arr; iter_len] + | Range { start; stop; direction = _ } -> [start; stop] + | Array { iter_arr; iter_len } -> [iter_arr; iter_len] (** Get the [Let_binding.t]s out of a list of translated iterators; this is the information we need to translate a full [for] comprehension clause @@ -321,15 +324,11 @@ module Iterator_bindings = struct let is_empty ~loc t = let open (val Lambda_utils.int_ops ~loc) in match t with - | Range { start; stop; direction} -> begin - let start = start.var in - let stop = stop.var in - match direction with - | Upto -> start > stop - | Downto -> start < stop - end - | Array { iter_arr = _; iter_len } -> - iter_len.var = l0 + | Range { start; stop; direction } -> ( + let start = start.var in + let stop = stop.var in + match direction with Upto -> start > stop | Downto -> start < stop) + | Array { iter_arr = _; iter_len } -> iter_len.var = l0 (** Check if any of the translated iterators are empty; that is, check if any of these iterators will iterate over zero things, and thus check if @@ -341,13 +340,13 @@ module Iterator_bindings = struct let open (val Lambda_utils.int_ops ~loc) in match List.map (is_empty ~loc) ts with | is_empty :: are_empty -> - (* ( || ) is associative, so the fact that [List.fold_left] brackets - as [(((one || two) || three) || four)] shouldn't matter *) - List.fold_left ( || ) is_empty are_empty - | [] -> - l0 (* false *) - (* The empty list case can't happen with comprehensions; we could - raise an error here instead *) + (* ( || ) is associative, so the fact that [List.fold_left] brackets + as [(((one || two) || three) || four)] shouldn't matter *) + List.fold_left ( || ) is_empty are_empty + | [] -> l0 + (* false *) + (* The empty list case can't happen with comprehensions; we could + raise an error here instead *) (** Compute the size of a single nonempty array iterator. This is either the size of a range, which itself is either [stop - start + 1] or @@ -360,28 +359,27 @@ module Iterator_bindings = struct this. *) let size_nonempty ~loc = function | Range { start; stop; direction } -> - let open (val Lambda_utils.int_ops ~loc) in - let start = start.var in - let stop = stop.var in - let low, high = match direction with - | Upto -> start, stop - | Downto -> stop, start - in - (* We can assume that the range is nonempty, but computing its size - still might overflow *) - let range_size = - Let_binding.make (Immutable Alias) (Pvalue Pintval) - "range_size" (high - low + l1) - in - Let_binding.let_one range_size - (* If the computed size of the range is positive, there was no - overflow; if it was zero or negative, then there was overflow *) - (Lifthenelse(range_size.var > l0, - range_size.var, - Precompute_array_size.raise_overflow_exn ~loc, - Pvalue Pintval)) - | Array { iter_arr = _; iter_len } -> - iter_len.var + let open (val Lambda_utils.int_ops ~loc) in + let start = start.var in + let stop = stop.var in + let low, high = + match direction with Upto -> start, stop | Downto -> stop, start + in + (* We can assume that the range is nonempty, but computing its size + still might overflow *) + let range_size = + Let_binding.make (Immutable Alias) (Pvalue Pintval) "range_size" + (high - low + l1) + in + Let_binding.let_one range_size + (* If the computed size of the range is positive, there was no + overflow; if it was zero or negative, then there was overflow *) + (Lifthenelse + ( range_size.var > l0, + range_size.var, + Precompute_array_size.raise_overflow_exn ~loc, + Pvalue Pintval )) + | Array { iter_arr = _; iter_len } -> iter_len.var (** Compute the total size of an array built out of a list of translated iterators, as long as all the iterators are nonempty; since this forms a @@ -391,9 +389,7 @@ module Iterator_bindings = struct a nonempty fixed-size array; check against [are_any_empty] first to address the case of fixedly-empty array. *) let total_size_nonempty ~loc iterators = - Precompute_array_size.safe_product_pos - ~variable_name:"iterator_size" - ~loc + Precompute_array_size.safe_product_pos ~variable_name:"iterator_size" ~loc (List.map (size_nonempty ~loc) iterators) end end @@ -421,9 +417,10 @@ module Resizable_array = struct default value and sometimes it will be the first element of the comprehension. *) let make ~loc array_kind elt = - Lprim(Pmakearray(array_kind, Mutable, alloc_heap), - Misc.replicate_list elt starting_size, - loc) + Lprim + ( Pmakearray (array_kind, Mutable, alloc_heap), + Misc.replicate_list elt starting_size, + loc ) (** Create a new array that's twice the size of the old one. The first half of the array contains the same elements, and the latter half's contents @@ -444,65 +441,70 @@ end This function returns both a pair of said CPSed Lambda term and the let bindings generated by this term (as an [Iterator_bindings.t], which see). *) -let iterator ~transl_exp ~scopes ~loc - : comprehension_iterator -> (lambda -> lambda) * Iterator_bindings.t - = function +let iterator ~transl_exp ~scopes ~loc : + comprehension_iterator -> (lambda -> lambda) * Iterator_bindings.t = + function | Texp_comp_range { ident; pattern = _; start; stop; direction } -> - let bound name value = - Let_binding.make (Immutable Strict) (Pvalue Pintval) - name (transl_exp ~scopes Jkind.Sort.for_predef_value value) - in - let start = bound "start" start in - let stop = bound "stop" stop in - let mk_iterator body = - Lfor { for_id = ident - ; for_loc = loc - ; for_from = start.var - ; for_to = stop.var - ; for_dir = direction - ; for_body = body } - in - mk_iterator, Range { start - ; stop - ; direction } + let bound name value = + Let_binding.make (Immutable Strict) (Pvalue Pintval) name + (transl_exp ~scopes Jkind.Sort.for_predef_value value) + in + let start = bound "start" start in + let stop = bound "stop" stop in + let mk_iterator body = + Lfor + { for_id = ident; + for_loc = loc; + for_from = start.var; + for_to = stop.var; + for_dir = direction; + for_body = body + } + in + mk_iterator, Range { start; stop; direction } | Texp_comp_in { pattern; sequence = iter_arr_exp } -> - let iter_arr = - Let_binding.make (Immutable Strict) (Pvalue Pgenval) - "iter_arr" (transl_exp ~scopes Jkind.Sort.for_predef_value iter_arr_exp) - in - let iter_arr_kind = Typeopt.array_kind iter_arr_exp in - let iter_len = - (* Extra let-binding if we're not in the fixed-size array case; the - middle-end will simplify this for us *) - Let_binding.make (Immutable Alias) (Pvalue Pintval) - "iter_len" - (Lprim(Parraylength iter_arr_kind, [iter_arr.var], loc)) - in - let iter_ix = Ident.create_local "iter_ix" in - let mk_iterator body = - let open (val Lambda_utils.int_ops ~loc) in - (* for iter_ix = 0 to Array.length iter_arr - 1 ... *) - (* CR layouts v4: will need updating when we allow non-values in arrays. *) - Lfor { for_id = iter_ix - ; for_loc = loc - ; for_from = l0 - ; for_to = iter_len.var - l1 - ; for_dir = Upto - ; for_body = - Matching.for_let - ~scopes - ~arg_sort:Jkind.Sort.for_array_element - ~return_layout:(Pvalue Pintval) - pattern.pat_loc - (Lprim(Parrayrefu - Lambda.(array_ref_kind alloc_heap iter_arr_kind), - [iter_arr.var; Lvar iter_ix], - loc)) - pattern - body - } - in - mk_iterator, Array { iter_arr; iter_len } + let iter_arr = + Let_binding.make (Immutable Strict) (Pvalue Pgenval) "iter_arr" + (transl_exp ~scopes Jkind.Sort.for_predef_value iter_arr_exp) + in + let iter_arr_kind = + (* CR layouts v4: [~elt_sort:None] here is not ideal and + should be fixed. To do that, we will need to store a sort + on [Texp_comp_in]. *) + Typeopt.array_type_kind ~elt_sort:None iter_arr_exp.exp_env + iter_arr_exp.exp_loc iter_arr_exp.exp_type + in + let iter_len = + (* Extra let-binding if we're not in the fixed-size array case; the + middle-end will simplify this for us *) + Let_binding.make (Immutable Alias) (Pvalue Pintval) "iter_len" + (Lprim (Parraylength iter_arr_kind, [iter_arr.var], loc)) + in + let iter_ix = Ident.create_local "iter_ix" in + let mk_iterator body = + let open (val Lambda_utils.int_ops ~loc) in + (* for iter_ix = 0 to Array.length iter_arr - 1 ... *) + (* CR layouts v4: will need updating when we allow non-values in arrays. *) + Lfor + { for_id = iter_ix; + for_loc = loc; + for_from = l0; + for_to = iter_len.var - l1; + for_dir = Upto; + for_body = + Matching.for_let ~scopes + ~arg_sort:Jkind.Sort.for_array_comprehension_element + ~return_layout:(Pvalue Pintval) pattern.pat_loc + (Lprim + ( Parrayrefu + ( Lambda.(array_ref_kind alloc_heap iter_arr_kind), + Ptagged_int_index ), + [iter_arr.var; Lvar iter_ix], + loc )) + pattern body + } + in + mk_iterator, Array { iter_arr; iter_len } (** Translates an array comprehension binding ([Typedtree.comprehension_clause_binding]) into Lambda. At parse time, @@ -511,11 +513,8 @@ let iterator ~transl_exp ~scopes ~loc range iterators can just have an [Ident.t], for translation into for loops), so bindings are just like iterators with a possible annotation. As a result, this function is essentially the same as [iterator], which see. *) -let binding - ~transl_exp - ~scopes - ~loc - { comp_cb_iterator; comp_cb_attributes = _ } = +let binding ~transl_exp ~scopes ~loc + { comp_cb_iterator; comp_cb_attributes = _ } = (* No attributes are meaningful here; see the definition of [comp_cb_attributes]. *) iterator ~transl_exp ~loc ~scopes comp_cb_iterator @@ -540,17 +539,20 @@ let for_and_clause ~transl_exp ~scopes ~loc = [clauses] and [for_and_clause] for more details. *) let clause ~transl_exp ~scopes ~loc = function | Texp_comp_for bindings -> - let make_clause, var_bindings = - for_and_clause ~transl_exp ~loc ~scopes bindings - in - fun body -> Let_binding.let_all - (Iterator_bindings.all_let_bindings var_bindings) - (make_clause body) + let make_clause, var_bindings = + for_and_clause ~transl_exp ~loc ~scopes bindings + in + fun body -> + Let_binding.let_all + (Iterator_bindings.all_let_bindings var_bindings) + (make_clause body) | Texp_comp_when cond -> - fun body -> Lifthenelse(transl_exp ~scopes Jkind.Sort.for_predef_value cond, - body, - lambda_unit, - (Pvalue Pintval) (* [unit] is immediate *)) + fun body -> + Lifthenelse + ( transl_exp ~scopes Jkind.Sort.for_predef_value cond, + body, + lambda_unit, + Pvalue Pintval (* [unit] is immediate *) ) (** The [array_sizing] type describes whether an array comprehension has been translated using the fixed-size array optimization ([Fixed_size]), or it has @@ -565,6 +567,7 @@ let clause ~transl_exp ~scopes ~loc = function ([Fixed_size]); otherwise, we cannot ([Dynamic_size]), and we have to dynamically grow the array as we iterate and shrink it to size at the end. *) + type array_sizing = | Fixed_size | Dynamic_size @@ -575,31 +578,31 @@ type array_sizing = create pieces, which can operate only knowing the [array_sizing]. *) type array_sizing_info = | Fixed_size_info of Iterator_bindings.t list - (** In the fixed-size case, we need to collect the lengths of the iterators + (** In the fixed-size case, we need to collect the lengths of the iterators being iterated over, which determine the size of the array; thus, the iterator bindings need to be available early, before we even allocate the array. *) | Dynamic_size_info - (** In the dynamic-size case, we don't need to collect any other + (** In the dynamic-size case, we don't need to collect any other information. *) (** The result of translating the clauses portion of an array comprehension (everything but the body) *) type translated_clauses = - { array_sizing_info : array_sizing_info - (** Whether the array is of a fixed size or must be grown dynamically, along + { array_sizing_info : array_sizing_info; + (** Whether the array is of a fixed size or must be grown dynamically, along with supporting information; see the [array_sizing] and [array_sizing_info] types for more details. *) - ; array_size : Let_binding.t - (** The binding that defines the array size; comes in between any extra + array_size : Let_binding.t; + (** The binding that defines the array size; comes in between any extra information from [array_sizing_info] and the definition of the array. In the case where the array has been translated with the fixed-size array optimization (when [array_sizing_info] is [Fixed_size _]), the variable holding the size is immutable; in the usual dynamically-sized array case (when [array_sizing_info] is [Dynamic_size_info]), the variable holding the size is mutable so that the array size can be grown.*) - ; make_comprehension : lambda -> lambda - (** The translation of the comprehension's iterators, awaiting the translation + make_comprehension : lambda -> lambda + (** The translation of the comprehension's iterators, awaiting the translation of the comprehension's body. All that remains to be done after this function is called is the creation and disposal of the array that is being constructed; the extra information from [array_sizing_info] must also be @@ -618,30 +621,27 @@ type translated_clauses = array size as a binding. *) let clauses ~transl_exp ~scopes ~loc = function | [Texp_comp_for bindings] -> - let make_comprehension, var_bindings = - for_and_clause ~transl_exp ~loc ~scopes bindings - in - let array_size = - Let_binding.make (Immutable Alias) (Pvalue Pintval) - "array_size" - (Iterator_bindings.Fixed_size_array.total_size_nonempty - ~loc var_bindings) - in - { array_sizing_info = Fixed_size_info var_bindings - ; array_size - ; make_comprehension - } + let make_comprehension, var_bindings = + for_and_clause ~transl_exp ~loc ~scopes bindings + in + let array_size = + Let_binding.make (Immutable Alias) (Pvalue Pintval) "array_size" + (Iterator_bindings.Fixed_size_array.total_size_nonempty ~loc + var_bindings) + in + { array_sizing_info = Fixed_size_info var_bindings; + array_size; + make_comprehension + } | clauses -> - let array_size = - Let_binding.make Mutable (Pvalue Pintval) - "array_size" (int Resizable_array.starting_size) - in - let make_comprehension = - Cps_utils.compose_map (clause ~transl_exp ~loc ~scopes) clauses - in - { array_sizing_info = Dynamic_size_info - ; array_size - ; make_comprehension } + let array_size = + Let_binding.make Mutable (Pvalue Pintval) "array_size" + (int Resizable_array.starting_size) + in + let make_comprehension = + Cps_utils.compose_map (clause ~transl_exp ~loc ~scopes) clauses + in + { array_sizing_info = Dynamic_size_info; array_size; make_comprehension } (** Create the initial array that will be filled by an array comprehension, returning both its identifier and the let binding that binds it. The logic @@ -690,19 +690,40 @@ let initial_array ~loc ~array_kind ~array_size ~array_sizing = match array_sizing, array_kind with (* Case 1: Float array optimization difficulties *) | (Fixed_size | Dynamic_size), Pgenarray -> - Mutable, - Lprim(Pmakearray(Pgenarray, Immutable, Lambda.alloc_heap), [], loc) + ( Mutable, + Lprim (Pmakearray (Pgenarray, Immutable, Lambda.alloc_heap), [], loc) ) (* Case 2: Fixed size, known array kind *) | Fixed_size, (Pintarray | Paddrarray) -> - Immutable StrictOpt, - make_vect ~loc ~length:array_size.var ~init:(int 0) - | Fixed_size, Pfloatarray -> - Immutable StrictOpt, make_float_vect ~loc array_size.var + Immutable StrictOpt, make_vect ~loc ~length:array_size.var ~init:(int 0) + | Fixed_size, (Pfloatarray | Punboxedfloatarray Pfloat64) -> + (* The representations of these two are the same, it's only + accesses that differ. *) + Immutable StrictOpt, make_float_vect ~loc array_size.var + | Fixed_size, Punboxedfloatarray Pfloat32 -> + Immutable StrictOpt, make_unboxed_float32_vect ~loc array_size.var + | Fixed_size, Punboxedintarray Pint32 -> + Immutable StrictOpt, make_unboxed_int32_vect ~loc array_size.var + | Fixed_size, Punboxedintarray Pint64 -> + Immutable StrictOpt, make_unboxed_int64_vect ~loc array_size.var + | Fixed_size, Punboxedintarray Pnativeint -> + Immutable StrictOpt, make_unboxed_nativeint_vect ~loc array_size.var (* Case 3: Unknown size, known array kind *) | Dynamic_size, (Pintarray | Paddrarray) -> - Mutable, Resizable_array.make ~loc array_kind (int 0) + Mutable, Resizable_array.make ~loc array_kind (int 0) | Dynamic_size, Pfloatarray -> - Mutable, Resizable_array.make ~loc array_kind (float 0.) + Mutable, Resizable_array.make ~loc array_kind (float 0.) + | Dynamic_size, Punboxedfloatarray Pfloat64 -> + Mutable, Resizable_array.make ~loc array_kind (unboxed_float 0.) + | Dynamic_size, Punboxedfloatarray Pfloat32 -> + Mutable, Resizable_array.make ~loc array_kind (unboxed_float32 0.) + | Dynamic_size, Punboxedintarray Pint32 -> + Mutable, Resizable_array.make ~loc array_kind (unboxed_int32 0l) + | Dynamic_size, Punboxedintarray Pint64 -> + Mutable, Resizable_array.make ~loc array_kind (unboxed_int64 0L) + | Dynamic_size, Punboxedintarray Pnativeint -> + ( Mutable, + Resizable_array.make ~loc array_kind (unboxed_nativeint Targetint.zero) + ) in Let_binding.make array_let_kind (Pvalue Pgenval) "array" array_value @@ -714,15 +735,7 @@ let initial_array ~loc ~array_kind ~array_size ~array_sizing = optimization or not and whether we are in the fixed size array case or not, so the correctness depends on getting the correct bindings from [initial_array] and [clauses]. *) -let body - ~loc - ~array_kind - ~array_size - ~array_sizing - ~array - ~index - ~body - = +let body ~loc ~array_kind ~array_size ~array_sizing ~array ~index ~body = (* The body of an array comprehension has three jobs: 1. Compute the next element 2. Assign it (mutably) to the next element of the array @@ -755,106 +768,116 @@ let body let open Let_binding in let set_element_raw elt = (* array.(index) <- elt *) - Lprim(Parraysetu Lambda.(array_set_kind modify_heap array_kind), - [array.var; index.var; elt], - loc) + Lprim + ( Parraysetu + (Lambda.(array_set_kind modify_heap array_kind), Ptagged_int_index), + [array.var; index.var; elt], + loc ) in - let set_element_in_bounds elt = match array_sizing with - | Fixed_size -> - set_element_raw elt + let set_element_in_bounds elt = + match array_sizing with + | Fixed_size -> set_element_raw elt | Dynamic_size -> - Lsequence( - (* Double the size of the array if it's time... *) - Lifthenelse(index.var < array_size.var, - lambda_unit, - Lsequence( - Lassign(array_size.id, i 2 * array_size.var), - Lassign(array.id, - Resizable_array.double ~loc array.var)), - (Pvalue Pintval) (* [unit] is immediate *)), + Lsequence + ( (* Double the size of the array if it's time... *) + Lifthenelse + ( index.var < array_size.var, + lambda_unit, + Lsequence + ( Lassign (array_size.id, i 2 * array_size.var), + Lassign (array.id, Resizable_array.double ~loc array.var) ), + Pvalue Pintval (* [unit] is immediate *) ), (* ...and then set the element now that the array is big enough *) - set_element_raw elt) + set_element_raw elt ) in - let set_element_known_kind_in_bounds = match array_kind with + let set_element_known_kind_in_bounds = + match array_kind with | Pgenarray -> - let is_first_iteration = (index.var = l0) in - let elt = Let_binding.make (Immutable Strict) (Pvalue Pgenval) "elt" body in - let make_array = match array_sizing with - | Fixed_size -> - make_vect ~loc ~length:array_size.var ~init:elt.var - | Dynamic_size -> - Resizable_array.make ~loc Pgenarray elt.var - in - Let_binding.let_one elt - (Lifthenelse(is_first_iteration, - Lassign(array.id, make_array), - set_element_in_bounds elt.var, - (Pvalue Pintval) (* [unit] is immediate *))) - | Pintarray | Paddrarray | Pfloatarray -> - set_element_in_bounds body + let is_first_iteration = index.var = l0 in + let elt = + Let_binding.make (Immutable Strict) (Pvalue Pgenval) "elt" body + in + let make_array = + match array_sizing with + | Fixed_size -> make_vect ~loc ~length:array_size.var ~init:elt.var + | Dynamic_size -> Resizable_array.make ~loc Pgenarray elt.var + in + Let_binding.let_one elt + (Lifthenelse + ( is_first_iteration, + Lassign (array.id, make_array), + set_element_in_bounds elt.var, + Pvalue Pintval (* [unit] is immediate *) )) + | Pintarray | Paddrarray | Pfloatarray + | Punboxedfloatarray (Pfloat64 | Pfloat32) + | Punboxedintarray _ -> + set_element_in_bounds body in - Lsequence( - set_element_known_kind_in_bounds, - Lassign(index.id, index.var + l1)) - -let comprehension - ~transl_exp ~scopes ~loc ~array_kind { comp_body; comp_clauses } = + Lsequence + (set_element_known_kind_in_bounds, Lassign (index.id, index.var + l1)) + +let comprehension ~transl_exp ~scopes ~loc ~(array_kind : Lambda.array_kind) + { comp_body; comp_clauses } = + (match array_kind with + | Pgenarray | Paddrarray | Pintarray | Pfloatarray -> () + | Punboxedfloatarray _ | Punboxedintarray _ -> + if not !Clflags.native_code + then + Misc.fatal_errorf + "Array comprehensions for kind %s are not allowed in bytecode" + (Printlambda.array_kind array_kind); + if Targetint.size <> 64 + then + Misc.fatal_errorf + "Array comprehensions for kind %s can only be compiled for 64-bit \ + native targets" + (Printlambda.array_kind array_kind)); let { array_sizing_info; array_size; make_comprehension } = clauses ~transl_exp ~scopes ~loc comp_clauses in - let array_sizing = match array_sizing_info with + let array_sizing = + match array_sizing_info with | Fixed_size_info _ -> Fixed_size | Dynamic_size_info -> Dynamic_size in - let array = - initial_array ~loc ~array_kind ~array_size ~array_sizing - in + let array = initial_array ~loc ~array_kind ~array_size ~array_sizing in let index = Let_binding.make Mutable (Pvalue Pintval) "index" (int 0) in (* The core of the comprehension: the array, the index, and the iteration that fills everything in. The translation of the clauses will produce a check to see if we can avoid doing the hard work of growing the array, which is the case when the array is known to be empty after the fixed-size array - optimization; we also have to check again when we're done. *) + optimization; we also have to check again when we're done. *) let comprehension = - Let_binding.let_all - [array_size; array; index] - (Lsequence( - (* Create the array *) - make_comprehension - (body - ~loc - ~array_kind - ~array_size - ~array_sizing - ~array - ~index - (* CR layouts v4: Ensure that the [transl_exp] here can cope - with non-values. *) - ~body:(transl_exp ~scopes Jkind.Sort.for_array_element comp_body)), - (* If it was dynamically grown, cut it down to size *) - match array_sizing with - | Fixed_size -> array.var - | Dynamic_size -> - array_sub ~loc array.var ~offset:(int 0) - ~length:index.var)) + Let_binding.let_all [array_size; array; index] + (Lsequence + ( (* Create the array *) + make_comprehension + (body ~loc ~array_kind ~array_size ~array_sizing ~array + ~index + (* CR layouts v4: Ensure that the [transl_exp] here can cope + with non-values. *) + ~body: + (transl_exp ~scopes Jkind.Sort.for_array_comprehension_element + comp_body)), + (* If it was dynamically grown, cut it down to size *) + match array_sizing with + | Fixed_size -> array.var + | Dynamic_size -> + array_sub ~loc array.var ~offset:(int 0) ~length:index.var )) in (* If we're in the fixed-size array case, do the extra setup necessary. *) match array_sizing_info with | Fixed_size_info var_bindings -> - Let_binding.let_all - (Iterator_bindings.all_let_bindings var_bindings) - (Lifthenelse(Iterator_bindings.Fixed_size_array.are_any_empty - ~loc var_bindings, + Let_binding.let_all + (Iterator_bindings.all_let_bindings var_bindings) + (Lifthenelse + ( Iterator_bindings.Fixed_size_array.are_any_empty ~loc var_bindings, (* If the array is known to be empty, we short-circuit and return the empty array; all empty arrays are identical, so we don't care about its kind or mutability *) - Lprim( - Pmakearray(Pgenarray, Immutable, Lambda.alloc_heap), - [], - loc), + Lprim (Pmakearray (Pgenarray, Immutable, Lambda.alloc_heap), [], loc), (* Otherwise, we translate it normally *) comprehension, (* (And the result has the [value_kind] of the array) *) - (Pvalue (Parrayval array_kind)))) - | Dynamic_size_info -> - comprehension + Pvalue (Parrayval array_kind) )) + | Dynamic_size_info -> comprehension diff --git a/lambda/transl_array_comprehension.mli b/lambda/transl_array_comprehension.mli index 69bf890c861..2caeddc2f1d 100644 --- a/lambda/transl_array_comprehension.mli +++ b/lambda/transl_array_comprehension.mli @@ -21,10 +21,10 @@ open Debuginfo.Scoped_location This function needs to translate expressions from Typedtree into Lambda, and so is parameterized by [Translcore.transl_exp], its [scopes] argument, and the [loc]ation. *) -val comprehension - : transl_exp:(scopes:scopes -> Jkind.sort -> expression -> lambda) - -> scopes:scopes - -> loc:scoped_location - -> array_kind:array_kind - -> comprehension - -> lambda +val comprehension : + transl_exp:(scopes:scopes -> Jkind.sort -> expression -> lambda) -> + scopes:scopes -> + loc:scoped_location -> + array_kind:array_kind -> + comprehension -> + lambda diff --git a/lambda/transl_comprehension_utils.ml b/lambda/transl_comprehension_utils.ml index 381ff6b3c60..92e63e0f36c 100644 --- a/lambda/transl_comprehension_utils.ml +++ b/lambda/transl_comprehension_utils.ml @@ -8,24 +8,24 @@ module Let_binding = struct end type t = - { let_kind : Let_kind.t - ; layout : layout - ; id : Ident.t - ; init : lambda - ; var : lambda } + { let_kind : Let_kind.t; + layout : layout; + id : Ident.t; + init : lambda; + var : lambda + } let make (let_kind : Let_kind.t) layout name init = let id = Ident.create_local name in - let var = match let_kind with - | Mutable -> Lmutvar id - | Immutable _ -> Lvar id + let var = + match let_kind with Mutable -> Lmutvar id | Immutable _ -> Lvar id in - {let_kind; layout; id; init; var} + { let_kind; layout; id; init; var } - let let_one {let_kind; layout; id; init} body = + let let_one { let_kind; layout; id; init } body = match let_kind with - | Immutable let_kind -> Llet(let_kind, layout, id, init, body) - | Mutable -> Lmutlet(layout, id, init, body) + | Immutable let_kind -> Llet (let_kind, layout, id, init, body) + | Mutable -> Lmutlet (layout, id, init, body) let let_all = List.fold_right let_one end @@ -36,103 +36,138 @@ module Lambda_utils = struct let float f = Lconst (Const_base (Const_float (Float.to_string f))) - let string ~loc s = Lconst (Const_base (Const_string(s, loc, None))) + let unboxed_float f = + Lconst (Const_base (Const_unboxed_float (Float.to_string f))) + + let unboxed_float32 f = + Lconst (Const_base (Const_unboxed_float32 (Float.to_string f))) + + let unboxed_int32 i = Lconst (Const_base (Const_unboxed_int32 i)) + + let unboxed_int64 i = Lconst (Const_base (Const_unboxed_int64 i)) + + let unboxed_nativeint i = + (* See CR in typedtree.mli *) + let i = i |> Targetint.to_int64 |> Int64.to_nativeint in + Lconst (Const_base (Const_unboxed_nativeint i)) + + let string ~loc s = Lconst (Const_base (Const_string (s, loc, None))) end - let apply - ~loc - ~mode - func - args - ~result_layout - = + let apply ~loc ~mode func args ~result_layout = (* These defaultscould be promoted to optional arguments if they were more widely used *) let region_close = Rc_normal in - let tailcall = Default_tailcall in - let inlined = Default_inlined in - let specialised = Default_specialise in + let tailcall = Default_tailcall in + let inlined = Default_inlined in + let specialised = Default_specialise in let probe = None in - Lapply { ap_loc = loc - ; ap_func = func - ; ap_args = args - ; ap_region_close = region_close - ; ap_mode = mode - ; ap_tailcall = tailcall - ; ap_inlined = inlined - ; ap_specialised = specialised - ; ap_probe = probe - ; ap_result_layout = result_layout - } + Lapply + { ap_loc = loc; + ap_func = func; + ap_args = args; + ap_region_close = region_close; + ap_mode = mode; + ap_tailcall = tailcall; + ap_inlined = inlined; + ap_specialised = specialised; + ap_probe = probe; + ap_result_layout = result_layout + } module type Int_ops = sig (* We want to expose all the operators so we don't have to think about which ones to add and remove as we change the rest of the file *) val ( + ) : lambda -> lambda -> lambda + val ( - ) : lambda -> lambda -> lambda + val ( * ) : lambda -> lambda -> lambda + val ( / ) : lambda -> lambda -> lambda - val ( = ) : lambda -> lambda -> lambda + val ( = ) : lambda -> lambda -> lambda + val ( <> ) : lambda -> lambda -> lambda - val ( < ) : lambda -> lambda -> lambda - val ( > ) : lambda -> lambda -> lambda + + val ( < ) : lambda -> lambda -> lambda + + val ( > ) : lambda -> lambda -> lambda + val ( <= ) : lambda -> lambda -> lambda + val ( >= ) : lambda -> lambda -> lambda val ( && ) : lambda -> lambda -> lambda + val ( || ) : lambda -> lambda -> lambda val l0 : lambda + val l1 : lambda - val i : int -> lambda + + val i : int -> lambda end - let int_ops ~loc : (module Int_ops) = (module struct - let binop prim l r = Lprim(prim, [l; r], loc) - - let ( + ) = binop Paddint - let ( - ) = binop Psubint - let ( * ) = binop Pmulint - let ( / ) = binop (Pdivint Unsafe) - let ( = ) = binop (Pintcomp Ceq) - let ( <> ) = binop (Pintcomp Cne) - let ( < ) = binop (Pintcomp Clt) - let ( > ) = binop (Pintcomp Cgt) - let ( <= ) = binop (Pintcomp Cle) - let ( >= ) = binop (Pintcomp Cge) - let ( && ) = binop Psequor - let ( || ) = binop Psequor - - let i = Constants.int - let l0 = i 0 - let l1 = i 1 - end) + let int_ops ~loc : (module Int_ops) = + (module struct + let binop prim l r = Lprim (prim, [l; r], loc) + + let ( + ) = binop Paddint + + let ( - ) = binop Psubint + + let ( * ) = binop Pmulint + + let ( / ) = binop (Pdivint Unsafe) + + let ( = ) = binop (Pintcomp Ceq) + + let ( <> ) = binop (Pintcomp Cne) + + let ( < ) = binop (Pintcomp Clt) + + let ( > ) = binop (Pintcomp Cgt) + + let ( <= ) = binop (Pintcomp Cle) + + let ( >= ) = binop (Pintcomp Cge) + + let ( && ) = binop Psequor + + let ( || ) = binop Psequor + + let i = Constants.int + + let l0 = i 0 + + let l1 = i 1 + end) module Primitive = struct - (** The Lambda primitive for calling a simple C primitive *) (* CR layouts v4: To change when non-values are allowed in arrays. *) + (** The Lambda primitive for calling a simple C primitive *) let c_prim name arity = - Pccall (Primitive.simple_on_values ~name ~arity ~alloc:true) + Pccall (Lambda.simple_prim_on_values ~name ~arity ~alloc:true) (** Create a function that produces the Lambda representation for a one-argument C primitive when provided with a Lambda argument *) let unary name = let prim = c_prim name 1 in - fun ~loc x -> Lprim(prim, [x], loc) + fun ~loc x -> Lprim (prim, [x], loc) (** Create a function that produces the Lambda representation for a two-argument C primitive when provided with two Lambda arguments *) let binary name = let prim = c_prim name 2 in - fun ~loc x y -> Lprim(prim, [x; y], loc) + fun ~loc x y -> Lprim (prim, [x; y], loc) (** Create a function that produces the Lambda representation for a three-argument C primitive when provided with three Lambda arguments *) let ternary name = let prim = c_prim name 3 in - fun ~loc x y z -> Lprim(prim, [x; y; z], loc) + fun ~loc x y z -> Lprim (prim, [x; y; z], loc) let make_vect = let make_vect = binary "caml_make_vect" in @@ -140,6 +175,14 @@ module Lambda_utils = struct let make_float_vect = unary "caml_make_float_vect" + let make_unboxed_float32_vect = unary "caml_make_unboxed_float32_vect" + + let make_unboxed_int32_vect = unary "caml_make_unboxed_int32_vect" + + let make_unboxed_int64_vect = unary "caml_make_unboxed_int64_vect" + + let make_unboxed_nativeint_vect = unary "caml_make_unboxed_nativeint_vect" + let array_append = binary "caml_array_append" let array_sub = @@ -155,8 +198,7 @@ module Cps_utils = struct (** Apply a function to the first part of a tuple *) let first f (x, y) = f x, y - let compose_map f = - List.fold_left (fun k x -> compose k (f x)) Fun.id + let compose_map f = List.fold_left (fun k x -> compose k (f x)) Fun.id let compose_map_acc f = List.fold_left_map (fun k x -> first (compose k) (f x)) Fun.id diff --git a/lambda/transl_comprehension_utils.mli b/lambda/transl_comprehension_utils.mli index 3606d0cf789..eaa7f1cbec7 100644 --- a/lambda/transl_comprehension_utils.mli +++ b/lambda/transl_comprehension_utils.mli @@ -18,19 +18,18 @@ module Let_binding : sig (** What sort of variable are we binding? *) type t = | Immutable of let_kind - (** Bind an immutable variable of the specified [let_kind]; corresponds to + (** Bind an immutable variable of the specified [let_kind]; corresponds to [Llet]. *) - | Mutable - (** Bind a mutable variable; corresponds to [Lmutlet]. *) + | Mutable (** Bind a mutable variable; corresponds to [Lmutlet]. *) end (** The first-class (in OCaml) type of let bindings. *) type t = private - { let_kind : Let_kind.t - ; layout : layout - ; id : Ident.t - ; init : lambda (* initial value *) - ; var : lambda (* occurrence of this variable *) + { let_kind : Let_kind.t; + layout : layout; + id : Ident.t; + init : lambda; (* initial value *) + var : lambda (* occurrence of this variable *) } (** Create a fresh local identifier (with name as given by the string @@ -51,11 +50,22 @@ module Lambda_utils : sig (** Creating AST fragments for constants from OCaml values *) module Constants : sig (** Lambda integer literals *) - val int : int -> lambda + val int : int -> lambda (** Lambda float literals; be careful with unusual values, as this calls [Float.to_string] *) - val float : float -> lambda + val float : float -> lambda + + (** Unboxed floats and ints *) + val unboxed_float : float -> lambda + + val unboxed_float32 : float -> lambda + + val unboxed_int32 : Int32.t -> lambda + + val unboxed_int64 : Int64.t -> lambda + + val unboxed_nativeint : Targetint.t -> lambda (** Lambda string literals; these require a location, and are constructed as "quoted strings", not {fancy|delimited strings|fancy}. *) @@ -65,8 +75,12 @@ module Lambda_utils : sig (** Apply a Lambda function to some Lambda values, at a location; all the other information needed by [Lapply] is set to some default value. *) val apply : - loc:scoped_location -> mode:alloc_mode -> lambda -> lambda list -> - result_layout:layout -> lambda + loc:scoped_location -> + mode:alloc_mode -> + lambda -> + lambda list -> + result_layout:layout -> + lambda (** Nicer OCaml syntax for constructing Lambda ASTs that operate on integers; created by [int_ops], which includes the necessary location in all the @@ -75,29 +89,40 @@ module Lambda_utils : sig (** Integer arithmetic *) val ( + ) : lambda -> lambda -> lambda + val ( - ) : lambda -> lambda -> lambda + val ( * ) : lambda -> lambda -> lambda + val ( / ) : lambda -> lambda -> lambda (** Integer comparisons *) - val ( = ) : lambda -> lambda -> lambda + val ( = ) : lambda -> lambda -> lambda + val ( <> ) : lambda -> lambda -> lambda - val ( < ) : lambda -> lambda -> lambda - val ( > ) : lambda -> lambda -> lambda + + val ( < ) : lambda -> lambda -> lambda + + val ( > ) : lambda -> lambda -> lambda + val ( <= ) : lambda -> lambda -> lambda + val ( >= ) : lambda -> lambda -> lambda (** Boolean logical operators *) val ( && ) : lambda -> lambda -> lambda + val ( || ) : lambda -> lambda -> lambda (** Integer literals *) val l0 : lambda + val l1 : lambda - val i : int -> lambda + + val i : int -> lambda end (** Construct an [Int_ops] module at the given location *) @@ -118,6 +143,18 @@ module Lambda_utils : sig uninitialized *) val make_float_vect : loc:scoped_location -> lambda -> lambda + (** Like [make_float_vect] but for unboxed float32 arrays. *) + val make_unboxed_float32_vect : loc:scoped_location -> lambda -> lambda + + (** Like [make_float_vect] but for unboxed int32 arrays. *) + val make_unboxed_int32_vect : loc:scoped_location -> lambda -> lambda + + (** Like [make_float_vect] but for unboxed int64 arrays. *) + val make_unboxed_int64_vect : loc:scoped_location -> lambda -> lambda + + (** Like [make_float_vect] but for unboxed nativeint arrays. *) + val make_unboxed_nativeint_vect : loc:scoped_location -> lambda -> lambda + (** [array_append a1 a2] calls the [caml_array_append] C primitive, which creates a new array by appending [a1] and [a2] *) val array_append : loc:scoped_location -> lambda -> lambda -> lambda diff --git a/lambda/transl_list_comprehension.ml b/lambda/transl_list_comprehension.ml index d497c4ccf79..bf72dfe2ead 100644 --- a/lambda/transl_list_comprehension.ml +++ b/lambda/transl_list_comprehension.ml @@ -97,25 +97,23 @@ open Lambda_utils.Constants see the documentation for [CamlinternalComprehension] for more details. Because these are being looked up in the environment, we need to wait to create them until that exists, hence [lazy]. *) -let ( rev_list_to_list - , rev_dlist_concat_map - , rev_dlist_concat_iterate_up - , rev_dlist_concat_iterate_down ) - = +let ( rev_list_to_list, + rev_dlist_concat_map, + rev_dlist_concat_iterate_up, + rev_dlist_concat_iterate_down ) = let transl name = lazy (Lambda.transl_prim "CamlinternalComprehension" name) in - ( transl "rev_list_to_list" - , transl "rev_dlist_concat_map" - , transl "rev_dlist_concat_iterate_up" - , transl "rev_dlist_concat_iterate_down" ) -;; + ( transl "rev_list_to_list", + transl "rev_dlist_concat_map", + transl "rev_dlist_concat_iterate_up", + transl "rev_dlist_concat_iterate_down" ) (** The [local_] form of the [CamlinternalComprehension.Snoc] constructor, for building the intermediate restults of list comprehensions; see the documentation for [CamlinternalComprehension.rev_list] for more details. *) let rev_list_snoc_local ~loc ~init ~last = - Lprim(Pmakeblock(0, Immutable, None, alloc_local), [init; last], loc) + Lprim (Pmakeblock (0, Immutable, None, alloc_local), [init; last], loc) (** The [CamlinternalComprehension.Nil] constructor, for building the intermediate restults of list comprehensions; see the documentation for @@ -125,8 +123,8 @@ let rev_list_nil = int 0 (** The information needed to translate a single iterator from a [for ... and ...] clause (i.e., [x = e1 (down)to e2] or [for pat in xs]). *) type translated_iterator = - { builder : lambda Lazy.t - (** The function that does the appropriate iteration (counting up, counting + { builder : lambda Lazy.t; + (** The function that does the appropriate iteration (counting up, counting down, or iterating over a list). As discussed at the start of this file, this function is expected to have a type of the following form: {[ @@ -139,22 +137,22 @@ type translated_iterator = the body of the iterator (the final function argument). Lazy because it holds a reference to a primitive, which has to be constructed lazily (see above). *) - ; arg_lets : Let_binding.t list - (** The first-class let bindings that bind the arguments to the [builder] + arg_lets : Let_binding.t list; + (** The first-class let bindings that bind the arguments to the [builder] function that actually does the iteration. These let bindings need to be collected separately so that they can all be bound at once before the whole [for ... and ...] clause, so that iterators in such a clause don't have their side effects performed multiple times in relation to each other. Every variable bound by one of these let bindings will be passed to [builder], filling in the [...iterator arguments...] in its type. *) - ; element : Ident.t - (** The name given to the values we're iterating over; needs to be a fresh + element : Ident.t; + (** The name given to the values we're iterating over; needs to be a fresh name for [for]-[in] iterators in case the user specifies a complex pattern. *) - ; element_kind : layout - (** The [layout] of the values we're iterating over. *) - ; add_bindings : lambda -> lambda - (** Any extra bindings that should be present in the body of this iterator, + element_kind : layout; + (** The [layout] of the values we're iterating over. *) + add_bindings : lambda -> lambda + (** Any extra bindings that should be present in the body of this iterator, for use by nested pieces of the translation; used if the user specifies a complex pattern in a [for]-[in] iterator. *) } @@ -167,43 +165,41 @@ type translated_iterator = until the rest of the translations have been done. *) let iterator ~transl_exp ~scopes = function | Texp_comp_range { ident; pattern = _; start; stop; direction } -> - (* We have to let-bind [start] and [stop] so that they're evaluated in the - correct (i.e., left-to-right) order *) - let transl_bound var bound = - Let_binding.make - (Immutable Strict) (Pvalue Pintval) - var (transl_exp ~scopes Jkind.Sort.for_predef_value bound) - in - let start = transl_bound "start" start in - let stop = transl_bound "stop" stop in - { builder = (match direction with - | Upto -> rev_dlist_concat_iterate_up - | Downto -> rev_dlist_concat_iterate_down) - ; arg_lets = [start; stop] - ; element = ident - ; element_kind = Pvalue Pintval - ; add_bindings = Fun.id - } + (* We have to let-bind [start] and [stop] so that they're evaluated in the + correct (i.e., left-to-right) order *) + let transl_bound var bound = + Let_binding.make (Immutable Strict) (Pvalue Pintval) var + (transl_exp ~scopes Jkind.Sort.for_predef_value bound) + in + let start = transl_bound "start" start in + let stop = transl_bound "stop" stop in + { builder = + (match direction with + | Upto -> rev_dlist_concat_iterate_up + | Downto -> rev_dlist_concat_iterate_down); + arg_lets = [start; stop]; + element = ident; + element_kind = Pvalue Pintval; + add_bindings = Fun.id + } | Texp_comp_in { pattern; sequence } -> - let iter_list = - Let_binding.make (Immutable Strict) (Pvalue Pgenval) - "iter_list" (transl_exp ~scopes Jkind.Sort.for_predef_value sequence) - in - (* Create a fresh variable to use as the function argument *) - let element = Ident.create_local "element" in - { builder = rev_dlist_concat_map - ; arg_lets = [iter_list] - ; element - ; element_kind = - Typeopt.layout pattern.pat_env pattern.pat_loc - Jkind.Sort.for_list_element pattern.pat_type - ; add_bindings = - (* CR layouts: to change when we allow non-values in sequences *) - Matching.for_let - ~scopes ~arg_sort:Jkind.Sort.for_list_element - ~return_layout:(Pvalue Pgenval) pattern.pat_loc (Lvar element) - pattern - } + let iter_list = + Let_binding.make (Immutable Strict) (Pvalue Pgenval) "iter_list" + (transl_exp ~scopes Jkind.Sort.for_predef_value sequence) + in + (* Create a fresh variable to use as the function argument *) + let element = Ident.create_local "element" in + { builder = rev_dlist_concat_map; + arg_lets = [iter_list]; + element; + element_kind = + Typeopt.layout pattern.pat_env pattern.pat_loc + Jkind.Sort.for_list_element pattern.pat_type; + add_bindings = + (* CR layouts: to change when we allow non-values in sequences *) + Matching.for_let ~scopes ~arg_sort:Jkind.Sort.for_list_element + ~return_layout:(Pvalue Pgenval) pattern.pat_loc (Lvar element) pattern + } (** Translates a list comprehension binding ([Typedtree.comprehension_clause_binding]) into Lambda. At parse time, @@ -227,53 +223,46 @@ let binding ~transl_exp ~scopes { comp_cb_iterator; comp_cb_attributes = _ } = ([accumulator], which changes at every recursive step). It folds together all the [translated_iterator]s by connecting their [body_func]tions to each other, and bottoms out at the [inner_body]. *) -let rec translate_bindings - ~transl_exp ~scopes ~loc ~inner_body ~accumulator = function +let rec translate_bindings ~transl_exp ~scopes ~loc ~inner_body ~accumulator = + function | cur_binding :: bindings -> - let { builder; arg_lets; element; element_kind; add_bindings } = - binding ~transl_exp ~scopes cur_binding - in - let inner_acc = Ident.create_local "accumulator" in - let body_arg_lets, body = - translate_bindings - ~transl_exp ~scopes ~loc - ~inner_body ~accumulator:(Lvar inner_acc) bindings - in - let body_func = - Lambda.lfunction - ~kind:(Curried { nlocal = 2 }) + let { builder; arg_lets; element; element_kind; add_bindings } = + binding ~transl_exp ~scopes cur_binding + in + let inner_acc = Ident.create_local "accumulator" in + let body_arg_lets, body = + translate_bindings ~transl_exp ~scopes ~loc ~inner_body + ~accumulator:(Lvar inner_acc) bindings + in + let body_func = + Lambda.lfunction + ~kind:(Curried { nlocal = 2 }) (* Only the accumulator is local, but since the function itself is local, [nlocal] has to be equal to the number of parameters *) - ~params:[ - {name = element; - layout = element_kind; - attributes = Lambda.default_param_attribute; - (* CR ncourant: check *) - mode = alloc_heap}; - {name = inner_acc; - layout = Pvalue Pgenval; - attributes = Lambda.default_param_attribute; - mode = alloc_local} - ] - ~return:(Pvalue Pgenval) - ~attr:default_function_attribute - ~loc - ~mode:alloc_local - ~region:true (* One region per iterator, like for loops *) - ~body:(add_bindings body) - in - let result = - Lambda_utils.apply - ~loc - ~mode:alloc_local - (Lazy.force builder) - (List.map (fun Let_binding.{id; _} -> Lvar id) arg_lets @ - [body_func; accumulator]) - ~result_layout:(Pvalue Pgenval) - in - arg_lets @ body_arg_lets, result - | [] -> - [], inner_body ~accumulator + ~params: + [ { name = element; + layout = element_kind; + attributes = Lambda.default_param_attribute; + (* CR ncourant: check *) + mode = alloc_heap + }; + { name = inner_acc; + layout = Pvalue Pgenval; + attributes = Lambda.default_param_attribute; + mode = alloc_local + } ] + ~return:(Pvalue Pgenval) ~attr:default_function_attribute ~loc + ~mode:alloc_local ~ret_mode:alloc_local ~region:false + ~body:(add_bindings body) + in + let result = + Lambda_utils.apply ~loc ~mode:alloc_local (Lazy.force builder) + (List.map (fun Let_binding.{ id; _ } -> Lvar id) arg_lets + @ [body_func; accumulator]) + ~result_layout:(Pvalue Pgenval) + in + arg_lets @ body_arg_lets, result + | [] -> [], inner_body ~accumulator (** Translate a single clause, either [for ... and ...] or [when ...] ([Typedtree.comprehension_clause]), into a single Lambda term of type @@ -282,43 +271,36 @@ let rec translate_bindings most nested accumulator as a labeled argument which will produce the body of the iterations) and have a name for the accumulator of the current [rev_dlist] ([accumulator], which changes at every recursive step). *) -let rec translate_clauses - ~transl_exp ~scopes ~loc ~comprehension_body ~accumulator = function - | clause :: clauses -> - let body ~accumulator = - translate_clauses ~transl_exp ~scopes ~loc - ~comprehension_body ~accumulator clauses - in begin - match clause with - | Texp_comp_for bindings -> - let arg_lets, bindings = - translate_bindings - ~transl_exp ~scopes ~loc ~inner_body:body ~accumulator bindings - in - Let_binding.let_all arg_lets bindings - | Texp_comp_when cond -> - Lifthenelse(transl_exp ~scopes Jkind.Sort.for_predef_value cond, - body ~accumulator, - accumulator, - (Pvalue Pgenval) (* [list]s have the standard representation *)) - end - | [] -> - comprehension_body ~accumulator +let rec translate_clauses ~transl_exp ~scopes ~loc ~comprehension_body + ~accumulator = function + | clause :: clauses -> ( + let body ~accumulator = + translate_clauses ~transl_exp ~scopes ~loc ~comprehension_body + ~accumulator clauses + in + match clause with + | Texp_comp_for bindings -> + let arg_lets, bindings = + translate_bindings ~transl_exp ~scopes ~loc ~inner_body:body + ~accumulator bindings + in + Let_binding.let_all arg_lets bindings + | Texp_comp_when cond -> + Lifthenelse + ( transl_exp ~scopes Jkind.Sort.for_predef_value cond, + body ~accumulator, + accumulator, + Pvalue Pgenval (* [list]s have the standard representation *) )) + | [] -> comprehension_body ~accumulator let comprehension ~transl_exp ~scopes ~loc { comp_body; comp_clauses } = let rev_comprehension = translate_clauses ~transl_exp ~scopes ~loc ~comprehension_body:(fun ~accumulator -> - rev_list_snoc_local - ~loc - ~init:accumulator + rev_list_snoc_local ~loc ~init:accumulator ~last:(transl_exp ~scopes Jkind.Sort.for_list_element comp_body)) - ~accumulator:rev_list_nil - comp_clauses + ~accumulator:rev_list_nil comp_clauses in - Lambda_utils.apply - ~loc - ~mode:alloc_heap + Lambda_utils.apply ~loc ~mode:alloc_heap (Lazy.force rev_list_to_list) - [rev_comprehension] - ~result_layout:(Pvalue Pgenval) + [rev_comprehension] ~result_layout:(Pvalue Pgenval) diff --git a/lambda/transl_list_comprehension.mli b/lambda/transl_list_comprehension.mli index f7b85a8d78b..65ec6208328 100644 --- a/lambda/transl_list_comprehension.mli +++ b/lambda/transl_list_comprehension.mli @@ -14,9 +14,9 @@ open Debuginfo.Scoped_location This function needs to translate expressions from Typedtree into Lambda, and so is parameterized by [Translcore.transl_exp], its [scopes] argument, and the [loc]ation. *) -val comprehension - : transl_exp:(scopes:scopes -> Jkind.sort -> expression -> lambda) - -> scopes:scopes - -> loc:scoped_location - -> comprehension - -> lambda +val comprehension : + transl_exp:(scopes:scopes -> Jkind.sort -> expression -> lambda) -> + scopes:scopes -> + loc:scoped_location -> + comprehension -> + lambda diff --git a/lambda/translattribute.ml b/lambda/translattribute.ml index 2f06ba5a6cf..6dfc1813e77 100644 --- a/lambda/translattribute.ml +++ b/lambda/translattribute.ml @@ -17,7 +17,6 @@ open Typedtree open Lambda open Location - let is_inline_attribute = [ ["inline"; "ocaml.inline"],true ] @@ -38,9 +37,6 @@ let is_local_attribute = let is_tailcall_attribute = [ ["tailcall"; "ocaml.tailcall"], true ] -let is_property_attribute = function - | Zero_alloc -> [ ["zero_alloc"; "ocaml.zero_alloc"], true ] - let is_tmc_attribute = [ ["tail_mod_cons"; "ocaml.tail_mod_cons"], true ] @@ -50,127 +46,23 @@ let is_poll_attribute = let is_loop_attribute = [ ["loop"; "ocaml.loop"], true ] -let find_attribute p attributes = - let inline_attribute = - Builtin_attributes.filter_attributes - (Builtin_attributes.Attributes_filter.create p) - attributes - in - let attr = - match inline_attribute with - | [] -> None - | [attr] -> Some attr - | attr :: {Parsetree.attr_name = {txt;loc}; _} :: _ -> - Location.prerr_warning loc (Warnings.Duplicated_attribute txt); - Some attr - in - attr +let is_opaque_attribute = + [ ["opaque"; "ocaml.opaque"], true ] + +let is_unboxable_attribute = + [ ["unboxable"; "ocaml.unboxable"], true ] let is_unrolled = function | {txt="unrolled"|"ocaml.unrolled"} -> true | {txt="inline"|"ocaml.inline"|"inlined"|"ocaml.inlined"} -> false | _ -> assert false -let get_payload get_from_exp = - let open Parsetree in - function - | PStr [{pstr_desc = Pstr_eval (exp, [])}] -> get_from_exp exp - | _ -> Result.Error () - -let get_optional_payload get_from_exp = - let open Parsetree in - function - | PStr [] -> Result.Ok None - | other -> Result.map Option.some (get_payload get_from_exp other) - -let get_id_from_exp = - let open Parsetree in - function - | { pexp_desc = Pexp_ident { txt = Longident.Lident id } } -> Result.Ok id - | _ -> Result.Error () - -let get_int_from_exp = - let open Parsetree in - function - | { pexp_desc = Pexp_constant (Pconst_integer(s, None)) } -> - begin match Misc.Int_literal_converter.int s with - | n -> Result.Ok n - | exception (Failure _) -> Result.Error () - end - | _ -> Result.Error () - -let get_construct_from_exp = - let open Parsetree in - function - | { pexp_desc = - Pexp_construct ({ txt = Longident.Lident constr }, None) } -> - Result.Ok constr - | _ -> Result.Error () - -let get_bool_from_exp exp = - Result.bind (get_construct_from_exp exp) - (function - | "true" -> Result.Ok true - | "false" -> Result.Ok false - | _ -> Result.Error ()) - -let get_ids_from_exp exp = - let open Parsetree in - (match exp with - | { pexp_desc = Pexp_apply (exp, args) } -> - get_id_from_exp exp :: - List.map (function - | (Asttypes.Nolabel, arg) -> get_id_from_exp arg - | (_, _) -> Result.Error ()) - args - | _ -> [get_id_from_exp exp]) - |> List.fold_left (fun acc r -> - match acc, r with - | Result.Ok ids, Ok id -> Result.Ok (id::ids) - | (Result.Error _ | Ok _), _ -> Result.Error ()) - (Ok []) - |> Result.map List.rev - - -let parse_ids_payload txt loc ~default ~empty cases payload = - let[@local] warn () = - let ( %> ) f g x = g (f x) in - let msg = - cases - |> List.map (fst %> String.concat " " %> Printf.sprintf "'%s'") - |> String.concat ", " - |> Printf.sprintf "It must be either %s or empty" - in - Location.prerr_warning loc (Warnings.Attribute_payload (txt, msg)); - default - in - match get_optional_payload get_ids_from_exp payload with - | Error () -> warn () - | Ok None -> empty - | Ok (Some ids) -> - match List.assoc_opt (List.sort String.compare ids) cases with - | Some r -> r - | None -> warn () - -let parse_id_payload txt loc ~default ~empty cases payload = - let[@local] warn () = - let ( %> ) f g x = g (f x) in - let msg = - cases - |> List.map (fst %> Printf.sprintf "'%s'") - |> String.concat ", " - |> Printf.sprintf "It must be either %s or empty" - in - Location.prerr_warning loc (Warnings.Attribute_payload (txt, msg)); - default - in - match get_optional_payload get_id_from_exp payload with - | Error () -> warn () - | Ok None -> empty - | Ok (Some id) -> - match List.assoc_opt id cases with - | Some r -> r - | None -> warn () +let parse_id_payload txt loc options ~default ~empty payload = + match + Builtin_attributes.parse_optional_id_payload txt loc options ~empty payload + with + | Ok a -> a + | Error () -> default let parse_inline_attribute attr : inline_attribute = match attr with @@ -181,7 +73,7 @@ let parse_inline_attribute attr : inline_attribute = let warning txt = Warnings.Attribute_payload (txt, "It must be an integer literal") in - match get_payload get_int_from_exp payload with + match Builtin_attributes.get_int_payload payload with | Ok n -> Unroll n | Error () -> Location.prerr_warning loc (warning txt); @@ -206,7 +98,7 @@ let parse_inlined_attribute attr : inlined_attribute = let warning txt = Warnings.Attribute_payload (txt, "It must be an integer literal") in - match get_payload get_int_from_exp payload with + match Builtin_attributes.get_int_payload payload with | Ok n -> Unroll n | Error () -> Location.prerr_warning loc (warning txt); @@ -249,29 +141,6 @@ let parse_local_attribute attr = ] payload -let parse_property_attribute attr property = - match attr with - | None -> Default_check - | Some {Parsetree.attr_name = {txt; loc}; attr_payload = payload}-> - parse_ids_payload txt loc - ~default:Default_check - ~empty:(Check { property; strict = false; opt = false; loc; } ) - [ - ["assume"], - Assume { property; strict = false; never_returns_normally = false; loc; }; - ["strict"], Check { property; strict = true; opt = false; loc; }; - ["opt"], Check { property; strict = false; opt = true; loc; }; - ["opt"; "strict"; ], Check { property; strict = true; opt = true; loc; }; - ["assume"; "strict"], - Assume { property; strict = true; never_returns_normally = false; loc; }; - ["assume"; "never_returns_normally"], - Assume { property; strict = false; never_returns_normally = true; loc; }; - ["assume"; "strict"; "never_returns_normally"], - Assume { property; strict = true; never_returns_normally = true; loc; }; - ["ignore"], Ignore_assert_all property - ] - payload - let parse_poll_attribute attr = match attr with | None -> Default_poll @@ -297,6 +166,19 @@ let parse_loop_attribute attr = ] payload +let parse_opaque_attribute attr = + match attr with + | None -> false + | Some {Parsetree.attr_name = {txt; loc}; attr_payload = payload} -> + parse_id_payload txt loc + ~default:false + ~empty:true + [] + payload + +let find_attribute p l = + Builtin_attributes.(find_attribute (Attributes_filter.create p) l) + let get_inline_attribute l = let attr = find_attribute is_inline_attribute l in parse_inline_attribute attr @@ -309,22 +191,9 @@ let get_local_attribute l = let attr = find_attribute is_local_attribute l in parse_local_attribute attr -let get_property_attribute l p = - let attr = find_attribute (is_property_attribute p) l in - let res = parse_property_attribute attr p in - (match attr, res with - | None, Default_check -> () - | _, Default_check -> () - | None, (Check _ | Assume _ | Ignore_assert_all _) -> assert false - | Some _, Ignore_assert_all _ -> () - | Some _, Assume _ -> () - | Some attr, Check { opt; _ } -> - if Lambda.is_check_enabled ~opt p && !Clflags.native_code then - (* The warning for unchecked functions will not trigger if the check is requested - through the [@@@zero_alloc all] top-level annotation rather than through the - function annotation [@zero_alloc]. *) - Builtin_attributes.register_property attr.attr_name); - res +let get_opaque_attribute l = + let attr = find_attribute is_opaque_attribute l in + parse_opaque_attribute attr let get_poll_attribute l = let attr = find_attribute is_poll_attribute l in @@ -360,9 +229,28 @@ let check_poll_local loc attr = | _ -> () +let check_opaque_inline loc attr = + match attr.is_opaque, attr.inline with + | true, (Always_inline | Available_inline | Unroll _) -> + Location.prerr_warning loc + (Warnings.Inlining_impossible + "[@opaque] is incompatible with inlining") + | _ -> + () + +let check_opaque_local loc attr = + match attr.is_opaque, attr.local with + | true, Always_local -> + Location.prerr_warning loc + (Warnings.Inlining_impossible + "[@opaque] is incompatible with local function optimization") + | _ -> + () + + let lfunction_with_attr ~attr - { kind; params; return; body; attr=_; loc; mode; region } = - lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~region + { kind; params; return; body; attr=_; loc; mode; ret_mode; region } = + lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~ret_mode ~region let add_inline_attribute expr loc attributes = match expr with @@ -420,59 +308,6 @@ let add_local_attribute expr loc attributes = end | _ -> expr -let assume_zero_alloc attributes = - let p = Zero_alloc in - let attr = find_attribute (is_property_attribute p) attributes in - match parse_property_attribute attr p with - | Default_check -> false - | Ignore_assert_all _ -> false - | Assume { property = Zero_alloc; _ } -> true - | Check { property = Zero_alloc; _ } -> false - -let assume_zero_alloc attributes = - (* This function is used for "look-ahead" to find attributes - that affect [Scoped_location] settings before translation - of expressions in that scope. - Warnings will be produced by [add_check_attribute]. *) - Warnings.without_warnings (fun () -> assume_zero_alloc attributes) - -let add_check_attribute expr loc attributes = - let to_string = function - | Zero_alloc -> "zero_alloc" - in - let to_string = function - | Check { property; strict; loc = _} -> - Printf.sprintf "assert %s%s" - (to_string property) - (if strict then " strict" else "") - | Assume { property; strict; loc = _} -> - Printf.sprintf "assume %s%s" - (to_string property) - (if strict then " strict" else "") - | Ignore_assert_all property -> - Printf.sprintf "ignore %s" (to_string property) - | Default_check -> assert false - in - match expr with - | Lfunction({ attr = { stub = false } as attr; } as funct) -> - begin match get_property_attribute attributes Zero_alloc with - | Default_check -> expr - | (Ignore_assert_all p | Check { property = p; _ } | Assume { property = p; _ }) - as check -> - begin match attr.check with - | Default_check -> () - | Ignore_assert_all p' - | Assume { property = p'; strict = _; loc = _; } - | Check { property = p'; strict = _; loc = _; } -> - if p = p' then - Location.prerr_warning loc - (Warnings.Duplicated_attribute (to_string check)); - end; - let attr = { attr with check } in - lfunction_with_attr ~attr funct - end - | expr -> expr - let add_loop_attribute expr loc attributes = match expr with | Lfunction({ attr = { stub = false } as attr } as funct) -> @@ -525,6 +360,39 @@ let add_poll_attribute expr loc attributes = end | expr -> expr +let add_opaque_attribute expr loc attributes = + match expr with + | Lfunction({ attr } as funct) -> + if not (get_opaque_attribute attributes) then + expr + else begin + if attr.is_opaque then + Location.prerr_warning loc + (Warnings.Duplicated_attribute "opaque"); + let attr = { attr with is_opaque = true } in + check_opaque_inline loc attr; + check_opaque_local loc attr; + let attr = { attr with inline = Never_inline; local = Never_local } in + lfunction_with_attr ~attr funct + end + | _ -> expr + +let add_unbox_return_attribute expr loc attributes = + match expr with + | Lfunction funct -> + let attr = find_attribute is_unboxable_attribute attributes in + begin match attr with + | None -> expr + | Some _ -> + if funct.attr.unbox_return then + Location.prerr_warning loc + (Warnings.Duplicated_attribute "unboxable"); + let attr = { funct.attr with unbox_return = true } in + lfunction_with_attr ~attr funct + end + | _ -> expr + + (* Get the [@inlined] attribute payload (or default if not present). *) let get_inlined_attribute e = let attr = find_attribute is_inlined_attribute e.exp_attributes in @@ -557,7 +425,7 @@ let get_tailcall_attribute e = match attr with | None -> Default_tailcall | Some {Parsetree.attr_name = {txt; loc}; attr_payload = payload} -> - match get_optional_payload get_bool_from_exp payload with + match Builtin_attributes.get_optional_bool_payload payload with | Ok (None | Some true) -> Tailcall_expectation true | Ok (Some false) -> Tailcall_expectation false | Error () -> @@ -575,9 +443,6 @@ let add_function_attributes lam loc attr = let lam = add_local_attribute lam loc attr in - let lam = - add_check_attribute lam loc attr - in let lam = add_loop_attribute lam loc attr in @@ -585,7 +450,20 @@ let add_function_attributes lam loc attr = add_tmc_attribute lam loc attr in let lam = - (* last because poll overrides inline and local *) + add_unbox_return_attribute lam loc attr + in + (* last because poll and opaque overrides inline and local *) + let lam = add_poll_attribute lam loc attr in + let lam = + add_opaque_attribute lam loc attr + in lam + +let transl_param_attributes pat = + let attrs = pat.pat_attributes in + let unbox_param = + Option.is_some (find_attribute is_unboxable_attribute attrs) + in + { unbox_param } diff --git a/lambda/translattribute.mli b/lambda/translattribute.mli index d553e2ad11e..e43b2070444 100644 --- a/lambda/translattribute.mli +++ b/lambda/translattribute.mli @@ -65,4 +65,6 @@ val add_function_attributes -> Parsetree.attributes -> Lambda.lambda -val assume_zero_alloc : Parsetree.attributes -> bool +val transl_param_attributes + : Typedtree.pattern + -> Lambda.parameter_attribute diff --git a/lambda/translclass.ml b/lambda/translclass.ml index 10f430931cd..f857180908c 100644 --- a/lambda/translclass.ml +++ b/lambda/translclass.ml @@ -37,12 +37,12 @@ let layout_meth = layout_any_value let layout_tables = Lambda.Pvalue Pgenval -let lfunction ?(kind=Curried {nlocal=0}) ?(region=true) return_layout params body = +let lfunction ?(kind=Curried {nlocal=0}) ?(region=true) ?(ret_mode=alloc_heap) return_layout params body = if params = [] then body else match kind, body with | Curried {nlocal=0}, Lfunction {kind = Curried _ as kind; params = params'; - body = body'; attr; loc} + body = body'; attr; loc; mode = Alloc_heap; ret_mode; region} when List.length params + List.length params' <= Lambda.max_arity() -> lfunction ~kind ~params:(params @ params') ~return:return_layout @@ -50,6 +50,7 @@ let lfunction ?(kind=Curried {nlocal=0}) ?(region=true) return_layout params bod ~attr ~loc ~mode:alloc_heap + ~ret_mode ~region | _ -> lfunction ~kind ~params ~return:return_layout @@ -57,6 +58,7 @@ let lfunction ?(kind=Curried {nlocal=0}) ?(region=true) return_layout params bod ~attr:default_function_attribute ~loc:Loc_unknown ~mode:alloc_heap + ~ret_mode ~region let lapply ap = @@ -226,6 +228,7 @@ let rec build_object_init ~scopes cl_table obj params inh_init obj_init cl = ~loc:(of_location ~scopes pat.pat_loc) ~body ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true in begin match obj_init with @@ -460,11 +463,12 @@ let rec build_class_lets ~scopes cl = match cl.cl_desc with Tcl_let (rec_flag, defs, _vals, cl') -> let env, wrap = build_class_lets ~scopes cl' in - (env, fun return_layout x -> - Translcore.transl_let ~scopes ~return_layout rec_flag defs - (wrap return_layout x)) + (env, fun return_layout lam_and_kind -> + let lam, rkind = wrap return_layout lam_and_kind in + Translcore.transl_let ~scopes ~return_layout rec_flag defs lam, + rkind) | _ -> - (cl.cl_env, fun _ x -> x) + (cl.cl_env, fun _ lam_and_kind -> lam_and_kind) let rec get_class_meths cl = match cl.cl_desc with @@ -514,6 +518,7 @@ let rec transl_class_rebind ~scopes obj_init cl vf = ~loc:(of_location ~scopes pat.pat_loc) ~body ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true in (path, path_lam, @@ -739,8 +744,8 @@ let free_methods l = | Lmutlet(_k, id, _arg, _body) -> fv := Ident.Set.remove id !fv | Lletrec(decl, _body) -> - List.iter (fun (id, _exp) -> fv := Ident.Set.remove id !fv) decl - | Lstaticcatch(_e1, (_,vars), _e2, _kind) -> + List.iter (fun { id } -> fv := Ident.Set.remove id !fv) decl + | Lstaticcatch(_e1, (_,vars), _e2, _, _kind) -> List.iter (fun (id, _) -> fv := Ident.Set.remove id !fv) vars | Ltrywith(_e1, exn, _e2, _k) -> fv := Ident.Set.remove exn !fv @@ -754,9 +759,10 @@ let free_methods l = in free l; !fv let transl_class ~scopes ids cl_id pub_meths cl vflag = + let open Value_rec_types in (* First check if it is not only a rebind *) let rebind = transl_class_rebind ~scopes cl vflag in - if rebind <> lambda_unit then rebind else + if rebind <> lambda_unit then rebind, Dynamic else (* Prepare for heavy environment handling *) let scopes = enter_class_definition ~scopes cl_id in @@ -792,7 +798,7 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = let new_ids_meths = ref [] in let no_env_update _ _ env = env in let msubst arr = function - Lfunction {kind = Curried _ as kind; region; + Lfunction {kind = Curried _ as kind; region; ret_mode; params = self :: args; return; body} -> let env = Ident.create_local "env" in let body' = @@ -804,7 +810,7 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = if not arr || !Clflags.debug then raise Not_found; builtin_meths [self.name] env env2 (lfunction return args body') with Not_found -> - [lfunction ~kind ~region return (self :: args) + [lfunction ~kind ~region ~ret_mode return (self :: args) (if not (Ident.Set.mem env (free_variables body')) then body' else Llet(Alias, layout_block, env, Lprim(Pfield_computed Reads_vary, @@ -865,23 +871,31 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = mkappl (Lvar obj_init, [lambda_unit], layout_function))) in (* Simplest case: an object defined at toplevel (ids=[]) *) - if top && ids = [] then llets layout_table (ltable cla (ldirect obj_init)) else + if top && ids = [] then llets layout_table (ltable cla (ldirect obj_init), Dynamic) else let concrete = (vflag = Concrete) - and lclass lam = - let cl_init = llets layout_function (Lambda.lfunction - ~kind:(Curried {nlocal=0}) - ~attr:default_function_attribute - ~loc:Loc_unknown - ~return:layout_function - ~mode:alloc_heap - ~region:true - ~params:[lparam cla layout_table] ~body:cl_init) in - Llet(Strict, layout_function, class_init, cl_init, lam (free_variables cl_init)) + and lclass mk_lam_and_kind = + let cl_init, _ = + llets layout_function + (Lambda.lfunction + ~kind:(Curried {nlocal=0}) + ~attr:default_function_attribute + ~loc:Loc_unknown + ~return:layout_function + ~mode:alloc_heap + ~ret_mode:alloc_heap + ~region:true + ~params:[lparam cla layout_table] + ~body:cl_init, + Dynamic (* Placeholder, real kind is computed in [lbody] below *)) + in + let lam, rkind = mk_lam_and_kind (free_variables cl_init) in + Llet(Strict, layout_function, class_init, cl_init, lam), rkind and lbody fv = if List.for_all (fun id -> not (Ident.Set.mem id fv)) ids then mkappl (oo_prim "make_class",[transl_meth_list pub_meths; - Lvar class_init], layout_block) + Lvar class_init], layout_block), + Dynamic else ltable table ( Llet( @@ -891,7 +905,8 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = Lprim(Pmakeblock(0, Immutable, None, alloc_heap), [mkappl (Lvar env_init, [lambda_unit], layout_obj); Lvar class_init; Lvar env_init; lambda_unit], - Loc_unknown)))) + Loc_unknown)))), + Static and lbody_virt lenvs = Lprim(Pmakeblock(0, Immutable, None, alloc_heap), [lambda_unit; Lambda.lfunction @@ -900,10 +915,12 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = ~loc:Loc_unknown ~return:layout_function ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true ~params:[lparam cla layout_table] ~body:cl_init; lambda_unit; lenvs], - Loc_unknown) + Loc_unknown), + Static in (* Still easy: a class defined at toplevel *) if top && concrete then lclass lbody else @@ -931,12 +948,13 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = (fun (_, path_lam, _) -> Lprim(class_field 3, [path_lam], Loc_unknown)) (List.rev inh_init) in - let make_envs lam = + let make_envs (lam, rkind) = Llet(StrictOpt, layout_block, envs, (if linh_envs = [] then lenv else Lprim(Pmakeblock(0, Immutable, None, alloc_heap), lenv :: linh_envs, Loc_unknown)), - lam) + lam), + rkind and def_ids cla lam = Llet(StrictOpt, layout_int, env2, mkappl (oo_prim "new_variable", [Lvar cla; transl_label ""], layout_int), @@ -960,15 +978,9 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = ~attr:default_function_attribute ~loc:Loc_unknown ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true ~body:(def_ids cla cl_init), lam) - and lcache lam = - if inh_keys = [] then Llet(Alias, layout_tables, cached, Lvar tables, lam) else - Llet(Strict, layout_tables, cached, - mkappl (oo_prim "lookup_tables", - [Lvar tables; Lprim(Pmakearray(Paddrarray, Immutable, alloc_heap), - inh_keys, Loc_unknown)], layout_tables), - lam) and lset cached i lam = Lprim(Psetfield(i, Pointer, Assignment modify_heap), [Lvar cached; lam], Loc_unknown) @@ -985,6 +997,7 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = ~attr:default_function_attribute ~loc:Loc_unknown ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true ~return:layout_function ~params:[lparam cla layout_table] @@ -1004,12 +1017,27 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = lupdate_cache else Lifthenelse(lfield cached 0, lambda_unit, lupdate_cache, layout_unit) in + let lcache (lam, rkind) = + let lam = Lsequence (lcheck_cache, lam) in + let lam = + if inh_keys = [] + then Llet(Alias, layout_tables, cached, Lvar tables, lam) + else + Llet(Strict, layout_tables, cached, + mkappl (oo_prim "lookup_tables", + [Lvar tables; Lprim(Pmakearray(Paddrarray, Immutable, alloc_heap), + inh_keys, Loc_unknown)], layout_tables), + lam) + in + lam, rkind + in llets layout_block ( lcache ( - Lsequence(lcheck_cache, make_envs ( - if ids = [] then mkappl (lfield cached 0, [lenvs], layout_obj) else - Lprim(Pmakeblock(0, Immutable, None, alloc_heap), + if ids = [] + then mkappl (lfield cached 0, [lenvs], layout_obj), Dynamic + else + Lprim(Pmakeblock(0, Immutable, None, alloc_heap), (if concrete then [mkappl (lfield cached 0, [lenvs], layout_obj); lfield cached 1; @@ -1017,7 +1045,8 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = lenvs] else [lambda_unit; lfield cached 0; lambda_unit; lenvs]), Loc_unknown - ))))) + ), + Static))) (* Wrapper for class compilation *) (* @@ -1030,11 +1059,12 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = *) let transl_class ~scopes ids id pub_meths cl vf = - oo_wrap cl.cl_env false (transl_class ~scopes ids id pub_meths cl) vf + oo_wrap_gen cl.cl_env false (transl_class ~scopes ids id pub_meths cl) vf let () = transl_object := (fun ~scopes id meths cl -> - transl_class ~scopes [] id meths cl Concrete) + let lam, _rkind = transl_class ~scopes [] id meths cl Concrete in + lam) (* Error report *) diff --git a/lambda/translclass.mli b/lambda/translclass.mli index 848e99d0056..89eb8f556e6 100644 --- a/lambda/translclass.mli +++ b/lambda/translclass.mli @@ -19,7 +19,8 @@ open Debuginfo.Scoped_location val transl_class : scopes:scopes -> Ident.t list -> Ident.t -> - string list -> class_expr -> Asttypes.virtual_flag -> lambda + string list -> class_expr -> Asttypes.virtual_flag -> + lambda * Value_rec_types.recursive_binding_kind type error = Tags of string * string diff --git a/lambda/translcore.ml b/lambda/translcore.ml index 6a84c44d9e8..49c0f22977f 100644 --- a/lambda/translcore.ml +++ b/lambda/translcore.ml @@ -30,7 +30,7 @@ type error = Free_super_var | Unreachable_reached | Bad_probe_layout of Ident.t - | Illegal_record_field of Jkind.Sort.const + | Illegal_void_record_field | Void_sort of type_expr exception Error of Location.t * error @@ -51,28 +51,12 @@ let sort_must_not_be_void loc ty sort = if Jkind.Sort.is_void_defaulting sort then raise (Error (loc, Void_sort ty)) let layout_exp sort e = layout e.exp_env e.exp_loc sort e.exp_type +let layout_pat sort p = layout p.pat_env p.pat_loc sort p.pat_type -(* This is `Lambda.must_be_value` for the special case of record fields, where - we allow the unboxed float layout. Its result is never actually used in that - case - it would be fine to return garbage. -*) -let record_field_kind l = - match l with - | Punboxed_float -> Pfloatval - | _ -> must_be_value l - -(* CR layouts v5: This function is only used for sanity checking the - typechecker. When we allow arbitrary layouts in structures, it will have - outlived its usefulness and should be deleted. *) -let check_record_field_sort loc sort repres = - match Jkind.Sort.get_default_value sort, repres with - | Value, _ -> () - | Float64, Record_ufloat -> () - | Float64, (Record_boxed _ | Record_inlined _ - | Record_unboxed | Record_float) -> - raise (Error (loc, Illegal_record_field Float64)) - | Void, _ -> - raise (Error (loc, Illegal_record_field Void)) +let check_record_field_sort loc sort = + match Jkind.Sort.default_to_value_and_get sort with + | Value | Float64 | Float32 | Bits32 | Bits64 | Word -> () + | Void -> raise (Error (loc, Illegal_void_record_field)) (* Forward declaration -- to be filled in by Translmod.transl_module *) let transl_module = @@ -98,7 +82,7 @@ let declare_probe_handlers lam = let prim_fresh_oo_id = Pccall - (Primitive.simple_on_values ~name:"caml_fresh_oo_id" ~arity:1 ~alloc:false) + (Lambda.simple_prim_on_values ~name:"caml_fresh_oo_id" ~arity:1 ~alloc:false) let transl_extension_constructor ~scopes env path ext = let path = @@ -143,51 +127,6 @@ let transl_apply_position position = if Config.stack_allocation then Rc_close_at_apply else Rc_normal -let may_allocate_in_region lam = - (* loop_region raises, if the lambda might allocate in parent region *) - let rec loop_region lam = - shallow_iter ~tail:(function - | Lexclave body -> loop body - | lam -> loop_region lam - ) ~non_tail:(fun lam -> loop_region lam) lam - and loop = function - | Lvar _ | Lmutvar _ | Lconst _ -> () - - | Lfunction {mode=Alloc_heap} -> () - | Lfunction {mode=Alloc_local} -> raise Exit - - | Lapply {ap_mode=Alloc_local} - | Lsend (_,_,_,_,_,Alloc_local,_,_) -> raise Exit - - | Lprim (prim, args, _) -> - begin match Lambda.primitive_may_allocate prim with - | Some Alloc_local -> raise Exit - | None | Some Alloc_heap -> - List.iter loop args - end - | Lregion (body, _layout) -> - (* [body] might allocate in the parent region because of exclave, and thus - [Lregion body] might allocate in the current region *) - loop_region body - | Lexclave _body -> - (* [_body] might do local allocations, but not in the current region; - rather, it's in the parent region *) - () - | Lwhile {wh_cond; wh_body} -> loop wh_cond; loop wh_body - | Lfor {for_from; for_to; for_body} -> loop for_from; loop for_to; loop for_body - | ( Lapply _ | Llet _ | Lmutlet _ | Lletrec _ | Lswitch _ | Lstringswitch _ - | Lstaticraise _ | Lstaticcatch _ | Ltrywith _ - | Lifthenelse _ | Lsequence _ | Lassign _ | Lsend _ - | Levent _ | Lifused _) as lam -> - Lambda.iter_head_constructor loop lam - in - if not Config.stack_allocation then false - else begin - match loop lam with - | () -> false - | exception Exit -> true - end - let maybe_region get_layout lam = let rec remove_tail_markers_and_exclave = function | Lapply ({ap_region_close = Rc_close_at_apply} as ap) -> @@ -209,86 +148,78 @@ let maybe_region_layout layout lam = let maybe_region_exp sort exp lam = maybe_region (fun () -> layout_exp sort exp) lam -(* Push the default values under the functional abstractions *) - -let wrap_bindings bindings exp = - List.fold_left - (fun exp binds -> - {exp with exp_desc = Texp_let(Nonrecursive, binds, exp)}) - exp bindings - -let rec trivial_pat pat = - match pat.pat_desc with - Tpat_var _ - | Tpat_any -> true - | Tpat_alias (p, _, _, _, _) -> - trivial_pat p - | Tpat_construct (_, cd, [], _) -> - not cd.cstr_generalized && cd.cstr_consts = 1 && cd.cstr_nonconsts = 0 - | Tpat_tuple patl -> - List.for_all trivial_pat patl - | _ -> false - -let rec push_defaults loc bindings use_lhs arg_mode arg_sort cases - partial warnings = - match cases with - [{c_lhs=pat; c_guard=None; - c_rhs={exp_desc = Texp_function { arg_label; param; cases; partial; - region; curry; warnings; arg_mode; - arg_sort; ret_sort; alloc_mode } } - as exp}] when bindings = [] || trivial_pat pat -> - let cases = - push_defaults exp.exp_loc bindings false arg_mode arg_sort cases partial - warnings - in - [{c_lhs=pat; c_guard=None; - c_rhs={exp with exp_desc = - Texp_function { arg_label; param; cases; partial; - region; curry; warnings; arg_mode; - arg_sort; ret_sort; alloc_mode }}}] - | [{c_lhs=pat; c_guard=None; - c_rhs={exp_attributes=[{Parsetree.attr_name = {txt="#default"};_}]; - exp_desc = Texp_let - (Nonrecursive, binds, - ({exp_desc = Texp_function _} as e2))}}] -> - push_defaults loc (binds :: bindings) true - arg_mode arg_sort [{c_lhs=pat;c_guard=None;c_rhs=e2}] - partial warnings - | [{c_lhs=pat; c_guard=None; c_rhs=exp} as case] - when use_lhs || trivial_pat pat && exp.exp_desc <> Texp_unreachable -> - [{case with c_rhs = wrap_bindings bindings exp}] - | {c_lhs=pat; c_rhs=exp; c_guard=_} :: _ when bindings <> [] -> - let mode = Mode.Value.of_alloc arg_mode in - let param = Typecore.name_cases "param" cases in - let desc = - {val_type = pat.pat_type; val_kind = Val_reg; - val_attributes = []; Types.val_loc = Location.none; - val_uid = Types.Uid.internal_not_actually_unique; } - in - let env = Env.add_value ~mode param desc exp.exp_env in - let name = Ident.name param in - let exp = - let cases = - let pure_case ({c_lhs; _} as case) = - {case with c_lhs = as_computation_pattern c_lhs} in - List.map pure_case cases in - { exp with exp_loc = loc; exp_env = env; exp_desc = - Texp_match - ({exp with exp_type = pat.pat_type; exp_env = env; exp_desc = - Texp_ident - (Path.Pident param, mknoloc (Longident.Lident name), - desc, Id_value, - (Mode.Value.uniqueness mode, Mode.Value.linearity mode))}, - arg_sort, - cases, partial) } - in - [{c_lhs = {pat with - pat_desc = Tpat_var (param, mknoloc name, desc.val_uid, mode)}; - c_guard = None; c_rhs= wrap_bindings bindings exp}] - | _ -> - cases - -let push_defaults loc = push_defaults loc [] false +let is_alloc_heap = function Alloc_heap -> true | Alloc_local -> false + +(* In cases where we're careful to preserve syntactic arity, we disable + the arity fusion attempted by simplif.ml *) +let function_attribute_disallowing_arity_fusion = + { default_function_attribute with may_fuse_arity = false } + +(** A well-formed function parameter list is of the form + [G @ L @ [ Final_arg ]], + where the values of G and L are of the form [More_args { partial_mode }], + where [partial_mode] has locality Global in G and locality Local in L. + + [curried_function_kind p] checks the well-formedness of the list and returns + the corresponding [curried_function_kind]. [nlocal] is populated as follows: + - if {v |L| > 0 v}, then {v nlocal = |L| + 1 v}. + - if {v |L| = 0 v}, + * if the function returns at mode local, the final arg has mode local, + or the function itself is allocated locally, then {v nlocal = 1 v}. + * otherwise, {v nlocal = 0 v}. +*) +(* CR-someday: Now that some functions' arity won't be changed downstream of + lambda (see [may_fuse_arity = false]), we could change [nlocal] to be + more expressive. I suggest the variant: + + {[ + type partial_application_is_local_when = + | Applied_up_to_nth_argument_from_end of int + | Never + ]} + + I believe this will allow us to get rid of the complicated logic for + |L| = 0, and help clarify how clients use this type. I plan on doing + this in a follow-on PR. +*) +let curried_function_kind + : (function_curry * Mode.Alloc.l) list + -> return_mode:alloc_mode + -> alloc_mode:alloc_mode + -> curried_function_kind + = + let rec loop params ~return_mode ~alloc_mode ~running_count + ~found_local_already + = + match params with + | [] -> Misc.fatal_error "Expected to find [Final_arg] at end of list" + | [ Final_arg, final_arg_mode ] -> + let nlocal = + if running_count = 0 + && is_alloc_heap return_mode + && is_alloc_heap alloc_mode + && is_alloc_heap (transl_alloc_mode_l final_arg_mode) + then 0 + else running_count + 1 + in + { nlocal } + | (Final_arg, _) :: _ -> Misc.fatal_error "Found [Final_arg] too early" + | (More_args { partial_mode }, _) :: params -> + match transl_alloc_mode_l partial_mode with + | Alloc_heap when not found_local_already -> + loop params ~return_mode ~alloc_mode + ~running_count:0 ~found_local_already + | Alloc_local -> + loop params ~return_mode ~alloc_mode + ~running_count:(running_count + 1) ~found_local_already:true + | Alloc_heap -> + Misc.fatal_error + "A function argument with a Global partial_mode unexpectedly \ + found following a function argument with a Local partial_mode" + in + fun params ~return_mode ~alloc_mode -> + loop params ~return_mode ~alloc_mode ~running_count:0 + ~found_local_already:false (* Insertion of debugging events *) @@ -329,6 +260,59 @@ let assert_failed loc ~scopes exp = Const_base(Const_int line); Const_base(Const_int char)]))], loc))], loc) +type fusable_function = + { params : function_param list + ; body : function_body + ; return_sort : Jkind.sort + ; return_mode : alloc_mode + ; region : bool + } + +(* [fuse_method_arity] is what ensures that a n-ary method is compiled as a + (n+1)-ary function, where the first parameter is self. It fuses together the + self and method parameters. + + Input: fun self -> fun method_param_1 ... method_param_n -> body + Output: fun self method_param_1 ... method_param_n -> body + + It detects whether the AST is a method by the presence of [Texp_poly] on the + inner function. This is only ever added to methods. +*) +let fuse_method_arity (parent : fusable_function) : fusable_function = + match parent with + | { params = [ self_param ]; + return_mode = Alloc_heap; + body = + Tfunction_body { exp_desc = Texp_function method_; exp_extra; } + } + when + List.exists + (function (Texp_poly _, _, _) -> true | _ -> false) + exp_extra + -> + begin match transl_alloc_mode_r method_.alloc_mode with + | Alloc_heap -> () + | Alloc_local -> + (* If we support locally-allocated objects, we'll also have to + pass the new mode back to the caller. + *) + Misc.fatal_error "Locally-allocated method body!" + end; + let self_param = + { self_param + with fp_curry = More_args + { partial_mode = + Mode.Alloc.disallow_right Mode.Alloc.legacy } + } + in + { params = self_param :: method_.params; + body = method_.body; + return_mode = transl_alloc_mode_l method_.ret_mode; + return_sort = method_.ret_sort; + region = method_.region; + } + | _ -> parent + (* Translation of expressions *) let rec iter_exn_names f pat = @@ -341,8 +325,8 @@ let rec iter_exn_names f pat = let transl_ident loc env ty path desc kind = match desc.val_kind, kind with - | Val_prim p, Id_prim poly_mode -> - Translprim.transl_primitive loc p env ty ~poly_mode (Some path) + | Val_prim p, Id_prim (poly_mode, poly_sort) -> + Translprim.transl_primitive loc p env ty ~poly_mode ~poly_sort (Some path) | Val_anc _, Id_value -> raise(Error(to_location loc, Free_super_var)) | (Val_reg | Val_self _), Id_value -> @@ -362,17 +346,51 @@ let can_apply_primitive p pmode pos args = else if pos <> Typedtree.Tail then true else begin let return_mode = Ctype.prim_mode pmode p.prim_native_repr_res in - is_heap_mode (transl_locality_mode return_mode) + is_heap_mode (transl_locality_mode_l return_mode) end end +let zero_alloc_of_application + ~num_args (annotation : Zero_alloc.assume option) funct = + match annotation, funct.exp_desc with + | Some assume, _ -> + (* The user wrote a zero_alloc attribute on the application - keep it. *) + Builtin_attributes.assume_zero_alloc assume + | None, Texp_ident (_, _, { val_zero_alloc; _ }, _, _) -> + (* We assume the call is zero_alloc if the function is known to be + zero_alloc. If the function is zero_alloc opt, then we need to be sure + that the opt checks were run to license this assumption. We judge + whether the opt checks were run based on the argument to the + [-zero-alloc-check] command line flag. *) + let use_opt = + match !Clflags.zero_alloc_check with + | Check_default | No_check -> false + | Check_all | Check_opt_only -> true + in + begin match Zero_alloc.get val_zero_alloc with + | Check c when c.arity = num_args && (use_opt || not c.opt) -> + let assume : Zero_alloc.assume = + { strict = c.strict; + never_returns_normally = false; + never_raises = false; + arity = c.arity; + loc = c.loc } + in + Builtin_attributes.assume_zero_alloc assume + | Check _ | Default_zero_alloc | Ignore_assert_all | Assume _ -> + Zero_alloc_utils.Assume_info.none + end + | None, _ -> Zero_alloc_utils.Assume_info.none + let rec transl_exp ~scopes sort e = transl_exp1 ~scopes ~in_new_scope:false sort e (* ~in_new_scope tracks whether we just opened a new scope. - We go to some trouble to avoid introducing many new anonymous function - scopes, as `let f a b = ...` is desugared to several Pexp_fun. + When we just opened a new scope, we avoid introducing an extraneous anonymous + function scope and instead inherit the new scope. E.g., [let f x = ...] is + parsed as a let-bound Pexp_function node [let f = fun x -> ...]. + We give it f's scope. *) and transl_exp1 ~scopes ~in_new_scope sort e = let eval_once = @@ -389,19 +407,19 @@ and transl_exp0 ~in_new_scope ~scopes sort e = | Texp_ident(path, _, desc, kind, _) -> transl_ident (of_location ~scopes e.exp_loc) e.exp_env e.exp_type path desc kind - | Texp_constant cst -> - Lconst(Const_base cst) + | Texp_constant cst -> Lconst (Const_base cst) | Texp_let(rec_flag, pat_expr_list, body) -> let return_layout = layout_exp sort body in transl_let ~scopes ~return_layout rec_flag pat_expr_list (event_before ~scopes body (transl_exp ~scopes sort body)) - | Texp_function { arg_label = _; param; cases; partial; region; curry; - warnings; arg_mode; arg_sort; ret_sort; alloc_mode } -> - transl_function ~in_new_scope ~scopes e alloc_mode param arg_mode arg_sort ret_sort - cases partial warnings region curry + | Texp_function { params; body; region; ret_sort; ret_mode; alloc_mode; + zero_alloc } -> + transl_function ~in_new_scope ~scopes e params body + ~alloc_mode ~ret_mode ~ret_sort ~region ~zero_alloc | Texp_apply({ exp_desc = Texp_ident(path, _, {val_kind = Val_prim p}, - Id_prim pmode, _); - exp_type = prim_type; } as funct, oargs, pos, ap_mode) + Id_prim (pmode, psort), _); + exp_type = prim_type; } as funct, + oargs, pos, ap_mode, zero_alloc) when can_apply_primitive p pmode pos oargs -> let rec cut_args prim_repr oargs = match prim_repr, oargs with @@ -409,7 +427,10 @@ and transl_exp0 ~in_new_scope ~scopes sort e = | _, [] -> failwith "Translcore cut_args" | ((_, arg_repr) :: prim_repr), ((_, Arg (x, _)) :: oargs) -> let arg_exps, extra_args = cut_args prim_repr oargs in - let arg_sort = Jkind.Sort.of_const (sort_of_native_repr arg_repr) in + let arg_sort = + Jkind.Sort.of_const + (Translprim.sort_of_native_repr arg_repr ~poly_sort:psort) + in (x, arg_sort) :: arg_exps, extra_args | _, ((_, Omitted _) :: _) -> assert false in @@ -420,9 +441,19 @@ and transl_exp0 ~in_new_scope ~scopes sort e = if extra_args = [] then transl_apply_position pos else Rc_normal in + let assume_zero_alloc = + match zero_alloc with + | None -> Zero_alloc_utils.Assume_info.none + | Some assume -> Builtin_attributes.assume_zero_alloc assume + in let lam = + let loc = + map_scopes (update_assume_zero_alloc ~assume_zero_alloc) + (of_location ~scopes e.exp_loc) + in Translprim.transl_primitive_application - (of_location ~scopes e.exp_loc) p e.exp_env prim_type pmode + loc p e.exp_env prim_type + ~poly_mode:pmode ~poly_sort:psort path prim_exp args (List.map fst arg_exps) position in if extra_args = [] then lam @@ -431,21 +462,29 @@ and transl_exp0 ~in_new_scope ~scopes sort e = let inlined = Translattribute.get_inlined_attribute funct in let specialised = Translattribute.get_specialised_attribute funct in let position = transl_apply_position pos in - let mode = transl_locality_mode ap_mode in + let mode = transl_locality_mode_l ap_mode in let result_layout = layout_exp sort e in event_after ~scopes e - (transl_apply ~scopes ~tailcall ~inlined ~specialised ~position ~mode + (transl_apply ~scopes ~tailcall ~inlined ~specialised + ~assume_zero_alloc + ~position ~mode ~result_layout lam extra_args (of_location ~scopes e.exp_loc)) end - | Texp_apply(funct, oargs, position, ap_mode) -> + | Texp_apply(funct, oargs, position, ap_mode, zero_alloc) + -> let tailcall = Translattribute.get_tailcall_attribute funct in let inlined = Translattribute.get_inlined_attribute funct in let specialised = Translattribute.get_specialised_attribute funct in let result_layout = layout_exp sort e in let position = transl_apply_position position in - let mode = transl_locality_mode ap_mode in + let mode = transl_locality_mode_l ap_mode in + let assume_zero_alloc = + zero_alloc_of_application ~num_args:(List.length oargs) zero_alloc funct + in event_after ~scopes e - (transl_apply ~scopes ~tailcall ~inlined ~specialised ~result_layout + (transl_apply ~scopes ~tailcall ~inlined ~specialised + ~assume_zero_alloc + ~result_layout ~position ~mode (transl_exp ~scopes Jkind.Sort.for_function funct) oargs (of_location ~scopes e.exp_loc)) | Texp_match(arg, arg_sort, pat_expr_list, partial) -> @@ -460,53 +499,104 @@ and transl_exp0 ~in_new_scope ~scopes sort e = return_layout) | Texp_tuple (el, alloc_mode) -> let ll, shape = - transl_list_with_shape ~scopes - (List.map (fun a -> (a, Jkind.Sort.for_tuple_element)) el) + transl_value_list_with_shape ~scopes + (List.map (fun (_, a) -> (a, Jkind.Sort.for_tuple_element)) el) in begin try Lconst(Const_block(0, List.map extract_constant ll)) with Not_constant -> Lprim(Pmakeblock(0, Immutable, Some shape, - transl_alloc_mode alloc_mode), + transl_alloc_mode_r alloc_mode), ll, (of_location ~scopes e.exp_loc)) end | Texp_construct(_, cstr, args, alloc_mode) -> - let ll, shape = - transl_list_with_shape ~scopes - (List.map (fun a -> (a, Jkind.Sort.for_constructor_arg)) args) + let args_with_sorts = + List.mapi (fun i e -> + let sort = Jkind.sort_of_jkind cstr.cstr_arg_jkinds.(i) in + e, sort) + args + in + let ll = + List.map (fun (e, sort) -> transl_exp ~scopes sort e) args_with_sorts in if cstr.cstr_inlined <> None then begin match ll with | [x] -> x | _ -> assert false end else begin match cstr.cstr_tag, cstr.cstr_repr with | Ordinary {runtime_tag}, _ when cstr.cstr_constant -> + assert (args_with_sorts = []); (* CR layouts v5: This could have void args, but for now we've ruled - that out with the jkind check in transl_list_with_shape *) + that out by checking that the sort list is empty *) Lconst(const_int runtime_tag) | Ordinary _, Variant_unboxed -> (match ll with [v] -> v | _ -> assert false) | Ordinary {runtime_tag}, Variant_boxed _ -> - begin try - Lconst(Const_block(runtime_tag, List.map extract_constant ll)) - with Not_constant -> - Lprim(Pmakeblock(runtime_tag, Immutable, Some shape, - transl_alloc_mode (Option.get alloc_mode)), - ll, - of_location ~scopes e.exp_loc) + let constant = + match List.map extract_constant ll with + | exception Not_constant -> None + | constants -> ( + match cstr.cstr_shape with + | Constructor_mixed shape -> + if !Clflags.native_code then + let shape = transl_mixed_product_shape shape in + Some (Const_mixed_block(runtime_tag, shape, constants)) + else + (* CR layouts v5.9: Structured constants for mixed blocks should + be supported in bytecode. See symtable.ml for the difficulty. + *) + None + | Constructor_uniform_value -> + Some (Const_block(runtime_tag, constants))) + in + begin match constant with + | Some constant -> Lconst constant + | None -> + let alloc_mode = transl_alloc_mode_r (Option.get alloc_mode) in + let makeblock = + match cstr.cstr_shape with + | Constructor_uniform_value -> + let shape = + List.map (fun (e, sort) -> + Lambda.must_be_value (layout_exp sort e)) + args_with_sorts + in + Pmakeblock(runtime_tag, Immutable, Some shape, alloc_mode) + | Constructor_mixed shape -> + let shape = Lambda.transl_mixed_product_shape shape in + Pmakemixedblock(runtime_tag, Immutable, shape, alloc_mode) + in + Lprim (makeblock, ll, of_location ~scopes e.exp_loc) end | Extension (path, _), Variant_extensible -> let lam = transl_extension_path (of_location ~scopes e.exp_loc) e.exp_env path in if cstr.cstr_constant - then + then ( + assert (args_with_sorts = []); (* CR layouts v5: This could have void args, but for now we've ruled - that out with the jkind check in transl_list_with_shape. *) - lam + that out by checking that the sort list is empty *) + lam) else - Lprim(Pmakeblock(0, Immutable, Some (Pgenval :: shape), - transl_alloc_mode (Option.get alloc_mode)), - lam :: ll, of_location ~scopes e.exp_loc) + let alloc_mode = transl_alloc_mode_r (Option.get alloc_mode) in + let makeblock = + match cstr.cstr_shape with + | Constructor_uniform_value -> + let shape = + List.map (fun (e, sort) -> + Lambda.must_be_value (layout_exp sort e)) + args_with_sorts + in + Pmakeblock(0, Immutable, Some (Pgenval :: shape), + alloc_mode) + | Constructor_mixed shape -> + let shape = Lambda.transl_mixed_product_shape shape in + let shape = + { shape with value_prefix_len = shape.value_prefix_len + 1 } + in + Pmakemixedblock(0, Immutable, shape, alloc_mode) + in + Lprim (makeblock, lam :: ll, of_location ~scopes e.exp_loc) | Extension _, (Variant_boxed _ | Variant_unboxed) | Ordinary _, Variant_extensible -> assert false end @@ -523,38 +613,74 @@ and transl_exp0 ~in_new_scope ~scopes sort e = extract_constant lam])) with Not_constant -> Lprim(Pmakeblock(0, Immutable, None, - transl_alloc_mode alloc_mode), + transl_alloc_mode_r alloc_mode), [Lconst(const_int tag); lam], of_location ~scopes e.exp_loc) end | Texp_record {fields; representation; extended_expression; alloc_mode} -> transl_record ~scopes e.exp_loc e.exp_env - (Option.map transl_alloc_mode alloc_mode) + (Option.map transl_alloc_mode_r alloc_mode) fields representation extended_expression - | Texp_field(arg, id, lbl, _, alloc_mode) -> + | Texp_field(arg, id, lbl, float) -> let targ = transl_exp ~scopes Jkind.Sort.for_record arg in let sem = - match lbl.lbl_mut with - | Immutable -> Reads_agree - | Mutable -> Reads_vary + if Types.is_mutable lbl.lbl_mut then Reads_vary else Reads_agree in let lbl_sort = Jkind.sort_of_jkind lbl.lbl_jkind in - check_record_field_sort id.loc lbl_sort lbl.lbl_repres; + check_record_field_sort id.loc lbl_sort; begin match lbl.lbl_repres with - Record_boxed _ | Record_inlined (_, Variant_boxed _) -> + Record_boxed _ + | Record_inlined (_, Constructor_uniform_value, Variant_boxed _) -> Lprim (Pfield (lbl.lbl_pos, maybe_pointer e, sem), [targ], of_location ~scopes e.exp_loc) - | Record_unboxed | Record_inlined (_, Variant_unboxed) -> targ + | Record_unboxed | Record_inlined (_, _, Variant_unboxed) -> targ | Record_float -> - let mode = transl_alloc_mode (Option.get alloc_mode) in + let alloc_mode = + match float with + | Boxing (alloc_mode, _) -> alloc_mode + | Non_boxing _ -> assert false + in + let mode = transl_alloc_mode_r alloc_mode in Lprim (Pfloatfield (lbl.lbl_pos, sem, mode), [targ], of_location ~scopes e.exp_loc) | Record_ufloat -> Lprim (Pufloatfield (lbl.lbl_pos, sem), [targ], of_location ~scopes e.exp_loc) - | Record_inlined (_, Variant_extensible) -> + | Record_inlined (_, Constructor_uniform_value, Variant_extensible) -> Lprim (Pfield (lbl.lbl_pos + 1, maybe_pointer e, sem), [targ], of_location ~scopes e.exp_loc) + | Record_inlined (_, Constructor_mixed _, Variant_extensible) -> + (* CR layouts v5.9: support this *) + fatal_error + "Mixed inlined records not supported for extensible variants" + | Record_inlined (_, Constructor_mixed shape, Variant_boxed _) + | Record_mixed shape -> + let ({ value_prefix_len; flat_suffix } : mixed_product_shape) = + shape + in + let read = + if lbl.lbl_num < value_prefix_len then + Mread_value_prefix (maybe_pointer e) + else + let flat_read = + match flat_suffix.(lbl.lbl_num - value_prefix_len) with + | Float_boxed -> + (match float with + | Boxing (mode, _) -> + flat_read_float_boxed (transl_alloc_mode_r mode) + | Non_boxing _ -> + Misc.fatal_error + "expected typechecking to make [float] boxing mode\ + \ present for float field read") + | non_float -> flat_read_non_float non_float + in + Mread_flat_suffix flat_read + in + let shape : Lambda.mixed_block_shape = + { value_prefix_len; flat_suffix } + in + Lprim (Pmixedfield (lbl.lbl_pos, read, shape, sem), [targ], + of_location ~scopes e.exp_loc) end | Texp_setfield(arg, arg_mode, id, lbl, newval) -> (* CR layouts v2.5: When we allow `any` in record fields and check @@ -562,31 +688,52 @@ and transl_exp0 ~in_new_scope ~scopes sort e = Probably we should add a sort to `Texp_setfield` in the typed tree, then. *) let lbl_sort = Jkind.sort_of_jkind lbl.lbl_jkind in - check_record_field_sort id.loc lbl_sort lbl.lbl_repres; + check_record_field_sort id.loc lbl_sort; let mode = Assignment (transl_modify_mode arg_mode) in let access = match lbl.lbl_repres with Record_boxed _ - | Record_inlined (_, Variant_boxed _) -> + | Record_inlined (_, Constructor_uniform_value, Variant_boxed _) -> Psetfield(lbl.lbl_pos, maybe_pointer newval, mode) - | Record_unboxed | Record_inlined (_, Variant_unboxed) -> + | Record_unboxed | Record_inlined (_, _, Variant_unboxed) -> assert false | Record_float -> Psetfloatfield (lbl.lbl_pos, mode) | Record_ufloat -> Psetufloatfield (lbl.lbl_pos, mode) - | Record_inlined (_, Variant_extensible) -> + | Record_inlined (_, Constructor_uniform_value, Variant_extensible) -> Psetfield (lbl.lbl_pos + 1, maybe_pointer newval, mode) + | Record_inlined (_, Constructor_mixed _, Variant_extensible) -> + (* CR layouts v5.9: support this *) + fatal_error + "Mixed inlined records not supported for extensible variants" + | Record_inlined (_, Constructor_mixed shape, Variant_boxed _) + | Record_mixed shape -> begin + let ({ value_prefix_len; flat_suffix } : mixed_product_shape) = + shape + in + let write = + if lbl.lbl_num < value_prefix_len then + Mwrite_value_prefix (maybe_pointer newval) + else + let flat_element = flat_suffix.(lbl.lbl_num - value_prefix_len) in + Mwrite_flat_suffix flat_element + in + let shape : Lambda.mixed_block_shape = + { value_prefix_len; flat_suffix } + in + Psetmixedfield(lbl.lbl_pos, write, shape, mode) + end in Lprim(access, [transl_exp ~scopes Jkind.Sort.for_record arg; transl_exp ~scopes lbl_sort newval], of_location ~scopes e.exp_loc) - | Texp_array (amut, expr_list, alloc_mode) -> - let mode = transl_alloc_mode alloc_mode in - let kind = array_kind e in + | Texp_array (amut, element_sort, expr_list, alloc_mode) -> + let mode = transl_alloc_mode_r alloc_mode in + let kind = array_kind e element_sort in let ll = transl_list ~scopes - (List.map (fun e -> (e, Jkind.Sort.for_array_element)) expr_list) + (List.map (fun e -> (e, element_sort)) expr_list) in let loc = of_location ~scopes e.exp_loc in let makearray mutability = @@ -597,16 +744,14 @@ and transl_exp0 ~in_new_scope ~scopes sort e = in let imm_array = makearray Immutable in let lambda_arr_mut : Lambda.mutable_flag = - match (amut : Asttypes.mutable_flag) with - | Mutable -> Mutable - | Immutable -> Immutable + if Types.is_mutable amut then Mutable else Immutable in begin try (* For native code the decision as to which compilation strategy to use is made later. This enables the Flambda passes to lift certain kinds of array definitions to symbols. *) (* Deactivate constant optimization if array is small enough *) - if amut = Asttypes.Mutable && + if Types.is_mutable amut && List.length ll <= use_dup_for_constant_mutable_arrays_bigger_than then begin raise Not_constant @@ -615,7 +760,7 @@ and transl_exp0 ~in_new_scope ~scopes sort e = if is_local_mode mode then raise Not_constant; begin match List.map extract_constant ll with | exception Not_constant - when kind = Pfloatarray && amut = Asttypes.Mutable -> + when kind = Pfloatarray && Types.is_mutable amut -> (* We cannot currently lift mutable [Pintarray] arrays safely in Flambda because [caml_modify] might be called upon them (e.g. from code operating on polymorphic arrays, or functions @@ -641,10 +786,10 @@ and transl_exp0 ~in_new_scope ~scopes sort e = Lconst(Const_float_array(List.map extract_float cl)) | Pgenarray -> raise Not_constant (* can this really happen? *) + | Punboxedfloatarray _ | Punboxedintarray _ -> + Misc.fatal_error "Use flambda2 for unboxed arrays" in - match amut with - | Mutable -> duparray_to_mutable const - | Immutable -> const + if Types.is_mutable amut then duparray_to_mutable const else const end with Not_constant -> makearray lambda_arr_mut @@ -653,12 +798,12 @@ and transl_exp0 ~in_new_scope ~scopes sort e = let loc = of_location ~scopes e.exp_loc in Transl_list_comprehension.comprehension ~transl_exp ~scopes ~loc comp - | Texp_array_comprehension (_amut, comp) -> + | Texp_array_comprehension (_amut, elt_sort, comp) -> (* We can ignore mutability here since we've already checked in in the type checker; both mutable and immutable arrays are created the same way *) let loc = of_location ~scopes e.exp_loc in - let array_kind = Typeopt.array_kind e in + let array_kind = Typeopt.array_kind e elt_sort in Transl_array_comprehension.comprehension ~transl_exp ~scopes ~loc ~array_kind comp | Texp_ifthenelse(cond, ifso, Some ifnot) -> @@ -848,9 +993,10 @@ and transl_exp0 ~in_new_scope ~scopes sort e = attributes = Lambda.default_param_attribute; mode = alloc_heap}] ~return:Lambda.layout_lazy_contents - ~attr:default_function_attribute + ~attr:function_attribute_disallowing_arity_fusion ~loc:(of_location ~scopes e.exp_loc) ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true ~body:(maybe_region_layout Lambda.layout_lazy_contents @@ -869,11 +1015,10 @@ and transl_exp0 ~in_new_scope ~scopes sort e = cl_env = e.exp_env; cl_attributes = []; } - | Texp_letop{let_; ands; param; param_sort; body; body_sort; partial; - warnings} -> + | Texp_letop{let_; ands; param; param_sort; body; body_sort; partial} -> event_after ~scopes e (transl_letop ~scopes e.exp_loc e.exp_env let_ ands - param param_sort body body_sort partial warnings) + param param_sort body body_sort partial) | Texp_unreachable -> raise (Error (e.exp_loc, Unreachable_reached)) | Texp_open (od, e) -> @@ -938,7 +1083,7 @@ and transl_exp0 ~in_new_scope ~scopes sort e = match Ctype.check_type_jkind e.exp_env (Ctype.correct_levels val_type) - (Jkind.value ~why:Probe) + (Jkind.Primitive.value ~why:Probe) with | Ok _ -> () | Error _ -> raise (Error (e.exp_loc, Bad_probe_layout id)) @@ -952,12 +1097,15 @@ and transl_exp0 ~in_new_scope ~scopes sort e = { inline = Never_inline; specialise = Always_specialise; local = Never_local; - check = Default_check; + zero_alloc = Default_zero_alloc; loop = Never_loop; is_a_functor = false; + is_opaque = false; stub = false; poll = Default_poll; tmc_candidate = false; + unbox_return = false; + may_fuse_arity = false; } in let funcid = Ident.create_local ("probe_handler_" ^ name) in let return_layout = layout_unit (* Probe bodies have type unit. *) in @@ -970,10 +1118,11 @@ and transl_exp0 ~in_new_scope ~scopes sort e = probes. *) ~params:(List.map (fun name -> { name; layout = layout_probe_arg; attributes = Lambda.default_param_attribute; mode = alloc_heap }) param_idents) ~return:return_layout - ~body + ~body:(maybe_region_layout return_layout body) ~loc:(of_location ~scopes exp.exp_loc) ~attr ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true in let app = @@ -1013,6 +1162,23 @@ and transl_exp0 ~in_new_scope ~scopes sort e = let l = transl_exp ~scopes sort e in if Config.stack_allocation then Lexclave l else l + | Texp_src_pos -> + let pos = e.exp_loc.loc_start in + let pos = + match !Clflags.directory with + | None -> pos + | Some directory -> + let pos_fname = directory ^ "/" ^ pos.pos_fname in + { pos with pos_fname } + in + let cl = + [ Const_base (Const_string (pos.pos_fname, e.exp_loc, None)) + ; Const_base (Const_int pos.pos_lnum) + ; Const_base (Const_int pos.pos_bol) + ; Const_base (Const_int pos.pos_cnum) + ] + in + Lconst(Const_block(0, cl)) and pure_module m = match m.mod_desc with @@ -1030,7 +1196,7 @@ and transl_list_with_layout ~scopes expr_list = expr_list (* Will raise if a list element has a non-value layout. *) -and transl_list_with_shape ~scopes expr_list = +and transl_value_list_with_shape ~scopes expr_list = let transl_with_shape (e, sort) = let shape = Lambda.must_be_value (layout_exp sort e) in transl_exp ~scopes sort e, shape @@ -1080,6 +1246,7 @@ and transl_apply ~scopes ?(tailcall=Default_tailcall) ?(inlined = Default_inlined) ?(specialised = Default_specialise) + ?(assume_zero_alloc = Zero_alloc_utils.Assume_info.none) ?(position=Rc_normal) ?(mode=alloc_heap) ~result_layout @@ -1110,6 +1277,14 @@ and transl_apply ~scopes {ap with ap_args = ap.ap_args @ args; ap_loc = loc; ap_region_close = pos; ap_mode = mode; ap_result_layout = result_layout } | lexp, _ -> + (* [assume_zero_alloc] is not used in the cases above but + Misplaced_attribute won't be reported for it. + Same for [@inlined] [@specialized] and tailcall. + It's fine for [Lsend] cases because [assume_zero_alloc] is + always false currently for them. *) + let loc = + map_scopes (update_assume_zero_alloc ~assume_zero_alloc) loc + in Lapply { ap_loc=loc; ap_func=lexp; @@ -1153,9 +1328,9 @@ and transl_apply ~scopes let id_arg = Ident.create_local "param" in let body = let loc = map_scopes enter_partial_or_eta_wrapper loc in - let mode = transl_alloc_mode mode_closure in - let arg_mode = transl_alloc_mode mode_arg in - let ret_mode = transl_alloc_mode mode_ret in + let mode = transl_alloc_mode_r mode_closure in + let arg_mode = transl_alloc_mode_l mode_arg in + let ret_mode = transl_alloc_mode_l mode_ret in let body = build_apply handle [Lvar id_arg] loc Rc_normal ret_mode l in let nlocal = match join_mode mode (join_mode arg_mode ret_mode) with @@ -1175,8 +1350,8 @@ and transl_apply ~scopes mode = arg_mode }] in lfunction ~kind:(Curried {nlocal}) ~params - ~return:result_layout ~body ~mode ~region - ~attr:default_stub_attribute ~loc + ~return:result_layout ~body ~mode ~ret_mode ~region + ~attr:{ default_stub_attribute with may_fuse_arity = false } ~loc in List.fold_right (fun (id, layout, lam) body -> Llet(Strict, layout, id, lam, body)) @@ -1195,95 +1370,64 @@ and transl_apply ~scopes in build_apply lam [] loc position mode args -and transl_curried_function - ~scopes ~arg_sort ~arg_layout ~arg_mode ~return_sort ~return_layout loc repr ~region - ~curry partial warnings (param:Ident.t) cases = - let max_arity = Lambda.max_arity () in - let rec loop ~scopes ~arg_sort ~arg_layout ~return_sort ~return_layout loc - ~arity ~region ~curry ~arg_mode partial warnings (param:Ident.t) cases = - match curry, cases with - More_args {partial_mode}, - [{c_lhs=pat; c_guard=None; - c_rhs={exp_desc = - Texp_function - { arg_label = _; param = param'; cases = cases'; - partial = partial'; region = region'; - curry = curry'; - warnings = warnings'; arg_mode = arg_mode'; arg_sort; ret_sort }; - exp_env; exp_type; exp_loc }}] - when arity < max_arity -> - (* Lfunctions must have local returns after the first local arg/ret *) - if Parmatch.inactive ~partial pat - then - let partial_mode = transl_alloc_mode partial_mode in - let ((fnkind, params, return_layout, region), body) = - let return_layout = - function_return_layout exp_env exp_loc ret_sort exp_type - in - let arg_layout = - function_arg_layout exp_env exp_loc arg_sort exp_type - in - loop ~scopes ~arg_sort ~arg_layout ~arg_mode:arg_mode' ~return_sort:ret_sort - ~return_layout exp_loc ~arity:(arity + 1) ~region:region' - ~curry:curry' partial' warnings' param' cases' - in - let fnkind = - match partial_mode, fnkind with - | _, Tupled -> - (* arity > 1 prevents this *) - assert false - | Alloc_heap, (Curried _ as c) -> c - | Alloc_local, Curried {nlocal} -> - (* all subsequent curried arrows should be local *) - assert (nlocal = List.length params); - Curried {nlocal = nlocal + 1} - in - let arg_mode = transl_alloc_mode arg_mode in - let params = { - name = param ; - layout = arg_layout ; - attributes = Lambda.default_param_attribute ; - mode = arg_mode - } :: params - in - ((fnkind, params, return_layout, region), - Matching.for_function ~scopes ~arg_sort ~arg_layout ~return_layout loc - None (Lvar param) [pat, body] partial) - else begin - begin match partial with - | Total -> - let prev = Warnings.backup () in - Warnings.restore warnings; - Location.prerr_warning pat.pat_loc - Match_on_mutable_state_prevent_uncurry; - Warnings.restore prev - | Partial -> () - end; - transl_tupled_function ~scopes ~arg_sort ~arg_layout ~arg_mode - ~return_sort:ret_sort ~return_layout ~arity ~region ~curry loc repr - partial param cases - end - | curry, cases -> - transl_tupled_function ~scopes ~arg_sort ~arg_layout ~arg_mode ~return_sort - ~return_layout ~arity ~region ~curry loc repr partial param cases +(* There are two cases in function translation: + - [Tupled]. It takes a tupled argument, and we can flatten it. + - [Curried]. It takes each argument individually. + + We first try treating the function as taking a flattened tupled argument (in + [trans_tupled_function]) and, if that doesn't work, we fall back to treating + the function as taking each argument individually (in + [trans_curried_function]). +*) +and transl_function_without_attributes + ~scopes ~return_sort ~return_mode ~mode ~region loc repr params body = + let return_layout = + match body with + | Tfunction_body exp -> + layout_exp return_sort exp + | Tfunction_cases cases -> + layout cases.fc_env cases.fc_loc return_sort cases.fc_ret_type + in - loop ~scopes ~arg_sort ~arg_layout ~arg_mode ~return_sort ~return_layout loc ~arity:1 - ~region ~curry partial warnings param cases + match + transl_tupled_function ~scopes loc params body + ~return_sort ~return_mode ~return_layout ~mode ~region + with + | Some result -> result + | None -> + transl_curried_function ~scopes loc repr params body + ~return_sort ~return_mode ~return_layout ~mode ~region and transl_tupled_function - ~scopes ~arg_layout ~arg_sort ~arg_mode ~return_sort ~return_layout ~arity ~region - ~curry loc repr partial (param:Ident.t) cases = - let partial_mode = - match curry with - | More_args {partial_mode} | Final_arg {partial_mode} -> - transl_alloc_mode partial_mode + ~scopes ~return_sort ~return_mode ~return_layout ~mode ~region loc params body + = + let eligible_cases = + match params, body with + | [], + Tfunction_cases + { fc_cases = { c_lhs; _ } :: _ as cases; + fc_partial; fc_arg_mode; fc_arg_sort } -> + Some (cases, fc_partial, c_lhs, fc_arg_mode, fc_arg_sort) + | [{ fp_kind = Tparam_pat pat; fp_partial; fp_mode; fp_sort }], + Tfunction_body body -> + let case = { c_lhs = pat; c_guard = None; c_rhs = body } in + Some ([ case ], fp_partial, pat, fp_mode, fp_sort) + | _ -> None in - match partial_mode, cases with - | Alloc_heap, {c_lhs={pat_desc = Tpat_tuple pl }} :: _ - when !Clflags.native_code - && arity = 1 + (* Cases can be eligible for flattening if they belong to the only param + (whose alloc mode must be global) and the function itself is global. It may + actually be sound to tuplify locally-allocated functions, but we haven't + thought it through. *) + match eligible_cases with + | Some + (cases, partial, + ({ pat_desc = Tpat_tuple pl } as arg_pat), arg_mode, arg_sort) + when is_alloc_heap mode + && is_alloc_heap (transl_alloc_mode_l arg_mode) + && !Clflags.native_code && List.length pl <= (Lambda.max_arity ()) -> begin try + let arg_layout = layout_pat arg_sort arg_pat in let size = List.length pl in let pats_expr_list = List.map @@ -1292,7 +1436,8 @@ and transl_tupled_function cases in let kinds = match arg_layout with - | Pvalue (Pvariant { consts = []; non_consts = [0, kinds] }) -> + | Pvalue (Pvariant { consts = []; + non_consts = [0, Constructor_uniform kinds] }) -> (* CR layouts v5: to change when we have non-value tuple elements. *) List.map (fun vk -> Pvalue vk) kinds @@ -1315,79 +1460,241 @@ and transl_tupled_function (transl_tupled_cases ~scopes return_sort pats_expr_list) partial in let region = region || not (may_allocate_in_region body) in - ((Tupled, tparams, return_layout, region), body) - with Matching.Cannot_flatten -> - transl_function0 ~scopes ~arg_sort ~arg_layout ~arg_mode ~return_sort ~return_layout - loc ~region ~partial_mode repr partial param cases + Some + ((Tupled, tparams, return_layout, region, return_mode), body) + with Matching.Cannot_flatten -> None end - | _ -> transl_function0 ~scopes ~arg_sort ~arg_layout ~arg_mode ~return_sort - ~return_layout loc ~region ~partial_mode repr partial param cases - -and transl_function0 - ~scopes ~arg_sort ~arg_layout ~arg_mode ~return_sort ~return_layout loc ~region - ~partial_mode repr partial (param:Ident.t) cases = - let body = - Matching.for_function ~scopes ~arg_sort ~arg_layout ~return_layout loc - repr (Lvar param) (transl_cases ~scopes return_sort cases) partial - in - let region = region || not (may_allocate_in_region body) in - let nlocal = - if not region then 1 - else match partial_mode with - | Alloc_local -> 1 - | Alloc_heap -> 0 + | _ -> None + +and transl_curried_function ~scopes loc repr params body + ~return_sort ~return_layout ~return_mode ~region ~mode + = + let { nlocal } = + let param_curries = List.map (fun fp -> fp.fp_curry, fp.fp_mode) params in + curried_function_kind + ~return_mode + ~alloc_mode:mode + (match body with + | Tfunction_body _ -> param_curries + | Tfunction_cases fc -> param_curries @ [ Final_arg, fc.fc_arg_mode ]) + in + let cases_param, body = + match body with + | Tfunction_body body -> + None, event_before ~scopes body (transl_exp ~scopes return_sort body) + | Tfunction_cases + { fc_cases; fc_partial; fc_param; fc_loc; fc_arg_sort; fc_arg_mode } + -> + let arg_layout = + match fc_cases with + | { c_lhs } :: _ -> layout_pat fc_arg_sort c_lhs + | [] -> + (* ppxes can generate empty function cases, which compiles to + a function that always raises Match_failure. We try less + hard to calculate a detailed layout that the middle-end can + use for optimizations. *) + layout_of_sort fc_loc fc_arg_sort + in + let arg_mode = transl_alloc_mode_l fc_arg_mode in + let attributes = + match fc_cases with + | [ { c_lhs }] -> Translattribute.transl_param_attributes c_lhs + | [] | _ :: _ :: _ -> Lambda.default_param_attribute + in + let param = + { name = fc_param; + layout = arg_layout; + attributes; + mode = arg_mode; + } + in + let body = + Matching.for_function ~scopes fc_loc repr (Lvar fc_param) + ~arg_sort:fc_arg_sort ~arg_layout ~return_layout + (transl_cases ~scopes return_sort fc_cases) fc_partial + in + Some param, body + in + let body, params = + List.fold_right + (fun fp (body, params) -> + let { fp_param; fp_kind; fp_mode; fp_sort; fp_partial; fp_loc } = fp in + let arg_env, arg_type, attributes = + match fp_kind with + | Tparam_pat pat -> + pat.pat_env, pat.pat_type, Translattribute.transl_param_attributes pat + | Tparam_optional_default (pat, expr, _) -> + expr.exp_env, Predef.type_option expr.exp_type, Translattribute.transl_param_attributes pat + in + let arg_layout = layout arg_env fp_loc fp_sort arg_type in + let arg_mode = transl_alloc_mode_l fp_mode in + let param = + { name = fp_param; + layout = arg_layout; + attributes; + mode = arg_mode; + } + in + let body = + match fp_kind with + | Tparam_pat pat -> + Matching.for_function ~scopes fp_loc None (Lvar fp_param) + [ pat, body ] + fp_partial + ~arg_sort:fp_sort ~arg_layout + ~return_layout + | Tparam_optional_default (pat, default_arg, default_arg_sort) -> + let default_arg = + event_before ~scopes default_arg + (transl_exp ~scopes default_arg_sort default_arg) + in + Matching.for_optional_arg_default ~return_layout + ~scopes fp_loc pat body ~default_arg ~default_arg_sort + ~param:fp_param + in + body, param :: params) + params + (body, Option.to_list cases_param) in - let arg_mode = transl_alloc_mode arg_mode in - ((Curried {nlocal}, - [{ name = param; - layout = arg_layout; - attributes = Lambda.default_param_attribute; - mode = arg_mode}], - return_layout, region), body) - -and transl_function ~in_new_scope ~scopes e alloc_mode param arg_mode arg_sort return_sort - cases partial warnings region curry = - let mode = transl_alloc_mode alloc_mode in - let attrs = - (* Collect attributes from the Pexp_newtype node for locally abstract types. - Otherwise we'd ignore the attribute in, e.g.; - fun [@inline] (type a) x -> ... + (* chunk params according to Lambda.max_arity. If Lambda.max_arity = n and + N>n, then the translation of an N-ary typedtree function is an n-ary lambda + function returning the translation of an (N-n)-ary typedtree function. *) - List.fold_left - (fun attrs (extra_exp, _, extra_attrs) -> - match extra_exp with - | Texp_newtype _ -> extra_attrs @ attrs - | (Texp_constraint _ | Texp_coerce _ | Texp_poly _) -> attrs) - e.exp_attributes e.exp_extra + let module Chunk = struct + (* An [acc] is defined in respect to a "chunk" of params. This chunk + of params together with the [body] field form a function. + *) + type acc = + { body : lambda; (* The function body of those params *) + return_layout : layout; (* The layout of [body] *) + return_mode : alloc_mode; (* The mode of [body]. *) + region : bool; (* Whether the function has its own region *) + nlocal : int; + (* An upper bound on the [nlocal] field for the function. If [nlocal] + exceeds the length of the chunk of params, the difference will + become the nlocal field with respect to the *enclosing* chunk + of params. + *) + } + + (* Meant to be used with a [fold_right]. The returned [acc] is in + respect to the enclosing chunk. + *) + let process_inner_chunk + chunk { body; return_layout; return_mode; nlocal; region } + = + let chunk_length = List.length chunk in + let loc = of_location ~scopes loc in + (* The current function is locally-allocated (and thus its + enclosing chunk doesn't have a region) when nlocal isn't + yet exhausted in the current chunk. + *) + let current_nlocal, current_mode, enclosing_region = + if nlocal > chunk_length + then chunk_length, alloc_local, false + else nlocal, mode, true + in + let enclosing_nlocal = nlocal - current_nlocal in + let body = + if region then maybe_region_layout return_layout body else body + in + let body = + lfunction + ~kind: + (Curried { nlocal=current_nlocal }) + ~params:chunk ~mode:current_mode + ~return:return_layout ~ret_mode:return_mode ~body + ~attr:function_attribute_disallowing_arity_fusion + ~loc ~region + in + (* we return Pgenval (for a function) after the rightmost chunk *) + { body; + return_layout = Pvalue Pgenval; + return_mode = (if enclosing_region then alloc_heap else alloc_local); + nlocal = enclosing_nlocal; + region = enclosing_region; + } + end + in + (* The Chunk.acc is in respect to the [params] chunk. *) + let params, + ({ body; return_layout; return_mode; region; nlocal } : Chunk.acc) = + match Misc.Stdlib.List.chunks_of (Lambda.max_arity ()) params with + | [] -> + Misc.fatal_error + "attempted to translate a function with zero arguments" + | first_chunk :: rest_of_chunks -> + let region = region || not (may_allocate_in_region body) in + let acc = + List.fold_right + Chunk.process_inner_chunk + rest_of_chunks + ({ body; return_layout; return_mode; nlocal; region } : Chunk.acc) + in + first_chunk, acc + in + ((Curried { nlocal }, params, return_layout, region, return_mode ), body) + +and transl_function ~in_new_scope ~scopes e params body + ~alloc_mode ~ret_mode:sreturn_mode ~ret_sort:sreturn_sort ~region:sregion + ~zero_alloc = + let attrs = e.exp_attributes in + let mode = transl_alloc_mode_r alloc_mode in + let zero_alloc = Zero_alloc.get zero_alloc in + let assume_zero_alloc = + match zero_alloc with + | Default_zero_alloc | Check _ | Ignore_assert_all -> + Zero_alloc_utils.Assume_info.none + | Assume assume -> + Builtin_attributes.assume_zero_alloc assume in - let assume_zero_alloc = Translattribute.assume_zero_alloc attrs in let scopes = - if in_new_scope then begin - if assume_zero_alloc then set_assume_zero_alloc ~scopes - else scopes - end + if in_new_scope then + update_assume_zero_alloc ~scopes ~assume_zero_alloc else enter_anonymous_function ~scopes ~assume_zero_alloc in - let arg_layout = - function_arg_layout e.exp_env e.exp_loc arg_sort e.exp_type + let sreturn_mode = transl_alloc_mode_l sreturn_mode in + let { params; body; return_sort; return_mode; region } = + fuse_method_arity + { params; body; + return_sort = sreturn_sort; + return_mode = sreturn_mode; + region = sregion; + } in - let ((kind, params, return, region), body) = + (* [ret_mode] may differ from [sreturn_mode] if: + - [e] is a method. (See [fuse_method_arity].) + - [e] is a function whose arity exceeds [Lambda.max_arity]. + (See the chunking code in [transl_curried_function].) + *) + let ((kind, params, return, region, ret_mode), body) = event_function ~scopes e (function repr -> - let pl = - push_defaults e.exp_loc arg_mode arg_sort cases partial warnings - in - let return_layout = - function_return_layout e.exp_env e.exp_loc return_sort e.exp_type - in - transl_curried_function ~arg_sort ~arg_layout ~arg_mode ~return_sort - ~return_layout ~scopes e.exp_loc repr ~region ~curry partial warnings - param pl) + transl_function_without_attributes + ~mode ~return_sort ~return_mode + ~scopes e.exp_loc repr ~region params body) + in + let zero_alloc : Lambda.zero_alloc_attribute = + match (zero_alloc : Builtin_attributes.zero_alloc_attribute) with + | Default_zero_alloc -> + if !Clflags.zero_alloc_check_assert_all && + Builtin_attributes.is_zero_alloc_check_enabled ~opt:false + then Check { strict = false; loc = e.exp_loc } + else Default_zero_alloc + | Check { strict; opt; arity = _; loc } -> + if Builtin_attributes.is_zero_alloc_check_enabled ~opt + then Check { strict; loc } + else Default_zero_alloc + | Assume { strict; never_returns_normally; never_raises; loc; arity = _; } -> + Assume { strict; never_returns_normally; never_raises; loc } + | Ignore_assert_all -> Default_zero_alloc + in + let attr = + { function_attribute_disallowing_arity_fusion with zero_alloc } in - let attr = default_function_attribute in let loc = of_location ~scopes e.exp_loc in let body = if region then maybe_region_layout return body else body in - let lam = lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~region in + let lam = lfunction ~kind ~params ~return ~body ~attr ~loc ~mode ~ret_mode ~region in Translattribute.add_function_attributes lam e.exp_loc attrs (* Like transl_exp, but used when a new scope was just introduced. *) @@ -1404,7 +1711,9 @@ and transl_bound_exp ~scopes ~in_structure pat sort expr loc attrs = let lam = match pat_bound_idents pat with | (id :: _) when should_introduce_scope -> - let assume_zero_alloc = Translattribute.assume_zero_alloc attrs in + let assume_zero_alloc = Zero_alloc_utils.Assume_info.none in + (* If this is a let-binding of a function, the scope will be updated + with zero_alloc info in [transl_function]. *) let scopes = enter_value_definition ~scopes ~assume_zero_alloc id in transl_scoped_exp ~scopes sort expr | _ -> transl_exp ~scopes sort expr @@ -1424,7 +1733,7 @@ and transl_let ~scopes ~return_layout ?(add_regions=false) ?(in_structure=false) let rec transl = function [] -> fun body -> body - | {vb_pat=pat; vb_expr=expr; vb_sort=sort; vb_attributes; vb_loc} + | {vb_pat=pat; vb_expr=expr; vb_sort=sort; vb_rec_kind=_; vb_attributes; vb_loc} :: rem -> let lam = transl_bound_exp ~scopes ~in_structure pat sort expr vb_loc vb_attributes @@ -1446,16 +1755,17 @@ and transl_let ~scopes ~return_layout ?(add_regions=false) ?(in_structure=false) | _ -> assert false) pat_expr_list in let transl_case - {vb_expr=expr; vb_sort; vb_attributes; vb_loc; vb_pat} id = - let lam = + {vb_expr=expr; vb_sort; vb_attributes; vb_rec_kind = rkind; + vb_loc; vb_pat} id = + let def = transl_bound_exp ~scopes ~in_structure vb_pat vb_sort expr vb_loc vb_attributes in - let lam = - if add_regions then maybe_region_exp vb_sort expr lam else lam + let def = + if add_regions then maybe_region_exp vb_sort expr def else def in - (id, lam) in + ( id, rkind, def ) in let lam_bds = List.map2 transl_case pat_expr_list idlist in - fun body -> Lletrec(lam_bds, body) + fun body -> Value_rec_compiler.compile_letrec lam_bds body and transl_setinstvar ~scopes loc self var expr = Lprim(Psetfield_computed (maybe_pointer expr, Assignment modify_heap), @@ -1487,39 +1797,64 @@ and transl_record ~scopes loc env mode fields repres opt_init_expr = let lbl_sort = Jkind.sort_of_jkind lbl.lbl_jkind in match definition with | Kept (typ, mut, _) -> - let field_kind = - record_field_kind (layout env lbl.lbl_loc lbl_sort typ) - in + let field_layout = layout env lbl.lbl_loc lbl_sort typ in let sem = - match mut with - | Immutable -> Reads_agree - | Mutable -> Reads_vary + if Types.is_mutable mut then Reads_vary else Reads_agree in let access = match repres with - Record_boxed _ | Record_inlined (_, Variant_boxed _) -> + Record_boxed _ + | Record_inlined (_, Constructor_uniform_value, Variant_boxed _) -> Pfield (i, maybe_pointer_type env typ, sem) - | Record_unboxed | Record_inlined (_, Variant_unboxed) -> + | Record_unboxed | Record_inlined (_, _, Variant_unboxed) -> assert false - | Record_inlined (_, Variant_extensible) -> + | Record_inlined (_, Constructor_uniform_value, Variant_extensible) -> Pfield (i + 1, maybe_pointer_type env typ, sem) + | Record_inlined (_, Constructor_mixed _, Variant_extensible) -> + (* CR layouts v5.9: support this *) + fatal_error + "Mixed inlined records not supported for extensible variants" | Record_float -> (* This allocation is always deleted, so it's simpler to leave it Alloc_heap *) Pfloatfield (i, sem, alloc_heap) | Record_ufloat -> Pufloatfield (i, sem) + | Record_inlined (_, Constructor_mixed shape, Variant_boxed _) + | Record_mixed shape -> + let { value_prefix_len; flat_suffix } : mixed_product_shape = + shape + in + let read = + if lbl.lbl_num < value_prefix_len then + Mread_value_prefix (maybe_pointer_type env typ) + else + let read = + match flat_suffix.(lbl.lbl_num - value_prefix_len) with + | Float_boxed -> + (* See the handling of [Record_float] above for + why we choose Alloc_heap. + *) + flat_read_float_boxed alloc_heap + | non_float -> flat_read_non_float non_float + in + Mread_flat_suffix read + in + let shape : Lambda.mixed_block_shape = + { value_prefix_len; flat_suffix } + in + Pmixedfield (i, read, shape, sem) in Lprim(access, [Lvar init_id], of_location ~scopes loc), - field_kind + field_layout | Overridden (_lid, expr) -> - let field_kind = record_field_kind (layout_exp lbl_sort expr) in - transl_exp ~scopes lbl_sort expr, field_kind) + let field_layout = layout_exp lbl_sort expr in + transl_exp ~scopes lbl_sort expr, field_layout) fields in let ll, shape = List.split (Array.to_list lv) in let mut : Lambda.mutable_flag = - if Array.exists (fun (lbl, _) -> lbl.lbl_mut = Asttypes.Mutable) fields + if Array.exists (fun (lbl, _) -> Types.is_mutable lbl.lbl_mut) fields then Mutable else Immutable in let lam = @@ -1528,42 +1863,70 @@ and transl_record ~scopes loc env mode fields repres opt_init_expr = let cl = List.map extract_constant ll in match repres with | Record_boxed _ -> Lconst(Const_block(0, cl)) - | Record_inlined (Ordinary {runtime_tag}, Variant_boxed _) -> + | Record_inlined (Ordinary {runtime_tag}, + Constructor_uniform_value, Variant_boxed _) -> Lconst(Const_block(runtime_tag, cl)) - | Record_unboxed | Record_inlined (_, Variant_unboxed) -> + | Record_unboxed | Record_inlined (_, _, Variant_unboxed) -> Lconst(match cl with [v] -> v | _ -> assert false) | Record_float -> Lconst(Const_float_block(List.map extract_float cl)) + | Record_mixed shape -> + if !Clflags.native_code then + let shape = transl_mixed_product_shape shape in + Lconst(Const_mixed_block(0, shape, cl)) + else + (* CR layouts v5.9: Structured constants for mixed blocks should + be supported in bytecode. See symtable.ml for the difficulty. + *) + raise Not_constant + | Record_inlined (_, Constructor_mixed _, Variant_boxed _) | Record_ufloat -> - (* CR layouts v2.5: When we add unboxed float literals, we may need - to do something here. (Currrently this case isn't reachable for - `float#` records because `extact_constant` will have raised - `Not_constant`.) *) + (* CR layouts v5.1: We should support structured constants for + blocks containing unboxed float literals. + *) raise Not_constant - | Record_inlined (_, Variant_extensible) - | Record_inlined (Extension _, _) -> + | Record_inlined (_, _, Variant_extensible) + | Record_inlined (Extension _, _, _) -> raise Not_constant with Not_constant -> let loc = of_location ~scopes loc in match repres with Record_boxed _ -> + let shape = List.map must_be_value shape in Lprim(Pmakeblock(0, mut, Some shape, Option.get mode), ll, loc) - | Record_inlined (Ordinary {runtime_tag}, Variant_boxed _) -> + | Record_inlined (Ordinary {runtime_tag}, + Constructor_uniform_value, Variant_boxed _) -> + let shape = List.map must_be_value shape in Lprim(Pmakeblock(runtime_tag, mut, Some shape, Option.get mode), ll, loc) - | Record_unboxed | Record_inlined (Ordinary _, Variant_unboxed) -> + | Record_unboxed | Record_inlined (Ordinary _, _, Variant_unboxed) -> (match ll with [v] -> v | _ -> assert false) | Record_float -> Lprim(Pmakefloatblock (mut, Option.get mode), ll, loc) | Record_ufloat -> Lprim(Pmakeufloatblock (mut, Option.get mode), ll, loc) - | Record_inlined (Extension (path, _), Variant_extensible) -> + | Record_inlined (Extension _, + Constructor_mixed _, Variant_extensible) -> + (* CR layouts v5.9: support this *) + fatal_error + "Mixed inlined records not supported for extensible variants" + | Record_inlined (Extension (path, _), + Constructor_uniform_value, Variant_extensible) -> + let shape = List.map must_be_value shape in let slot = transl_extension_path loc env path in Lprim(Pmakeblock(0, mut, Some (Pgenval :: shape), Option.get mode), slot :: ll, loc) - | Record_inlined (Extension _, (Variant_unboxed | Variant_boxed _)) - | Record_inlined (Ordinary _, Variant_extensible) -> + | Record_inlined (Extension _, _, (Variant_unboxed | Variant_boxed _)) + | Record_inlined (Ordinary _, _, Variant_extensible) -> assert false + | Record_mixed shape -> + let shape = transl_mixed_product_shape shape in + Lprim (Pmakemixedblock (0, mut, shape, Option.get mode), ll, loc) + | Record_inlined (Ordinary { runtime_tag }, + Constructor_mixed shape, Variant_boxed _) -> + let shape = transl_mixed_product_shape shape in + Lprim (Pmakemixedblock (runtime_tag, mut, shape, Option.get mode), + ll, loc) in begin match opt_init_expr with None -> lam @@ -1577,25 +1940,51 @@ and transl_record ~scopes loc env mode fields repres opt_init_expr = let update_field cont (lbl, definition) = (* CR layouts v5: allow more unboxed types here. *) let lbl_sort = Jkind.sort_of_jkind lbl.lbl_jkind in - check_record_field_sort lbl.lbl_loc lbl_sort lbl.lbl_repres; + check_record_field_sort lbl.lbl_loc lbl_sort; match definition with | Kept _ -> cont | Overridden (_lid, expr) -> let upd = match repres with - Record_boxed _ | Record_inlined (_, Variant_boxed _) -> + Record_boxed _ + | Record_inlined (_, Constructor_uniform_value, Variant_boxed _) -> let ptr = maybe_pointer expr in Psetfield(lbl.lbl_pos, ptr, Assignment modify_heap) - | Record_unboxed | Record_inlined (_, Variant_unboxed) -> + | Record_unboxed | Record_inlined (_, _, Variant_unboxed) -> assert false | Record_float -> Psetfloatfield (lbl.lbl_pos, Assignment modify_heap) | Record_ufloat -> Psetufloatfield (lbl.lbl_pos, Assignment modify_heap) - | Record_inlined (_, Variant_extensible) -> + | Record_inlined (_, Constructor_uniform_value, Variant_extensible) -> let pos = lbl.lbl_pos + 1 in let ptr = maybe_pointer expr in Psetfield(pos, ptr, Assignment modify_heap) + | Record_inlined (_, Constructor_mixed _, Variant_extensible) -> + (* CR layouts v5.9: support this *) + fatal_error + "Mixed inlined records not supported for extensible variants" + | Record_inlined (_, Constructor_mixed shape, Variant_boxed _) + | Record_mixed shape -> begin + let { value_prefix_len; flat_suffix } : mixed_product_shape = + shape + in + let write = + if lbl.lbl_num < value_prefix_len then + let ptr = maybe_pointer expr in + Mwrite_value_prefix ptr + else + let flat_element = + flat_suffix.(lbl.lbl_num - value_prefix_len) + in + Mwrite_flat_suffix flat_element + in + let shape : Lambda.mixed_block_shape = + { value_prefix_len; flat_suffix } + in + Psetmixedfield + (lbl.lbl_pos, write, shape, Assignment modify_heap) + end in Lsequence(Lprim(upd, [Lvar copy_id; transl_exp ~scopes lbl_sort expr], @@ -1641,9 +2030,9 @@ and transl_match ~scopes ~arg_sort ~return_sort e arg pat_expr_list partial = (* Simplif doesn't like it if binders are not uniq, so we make sure to use different names in the value and the exception branches. *) let ids_full = Typedtree.pat_bound_idents_full arg_sort pv in - let ids = List.map (fun (id, _, _, _) -> id) ids_full in + let ids = List.map (fun (id, _, _, _, _) -> id) ids_full in let ids_kinds = - List.map (fun (id, {Location.loc; _}, ty, s) -> + List.map (fun (id, {Location.loc; _}, ty, _, s) -> id, Typeopt.layout pv.pat_env loc s ty) ids_full in @@ -1693,18 +2082,22 @@ and transl_match ~scopes ~arg_sort ~return_sort e arg pat_expr_list partial = return_layout), (static_exception_id, val_ids), handler, - return_layout) + Same_region, return_layout) in let classic = match arg, exn_cases with | {exp_desc = Texp_tuple (argl, alloc_mode)}, [] -> assert (static_handlers = []); - let mode = transl_alloc_mode alloc_mode in - let argl = List.map (fun a -> (a, Jkind.Sort.for_tuple_element)) argl in + let mode = transl_alloc_mode_r alloc_mode in + let argl = + List.map (fun (_, a) -> (a, Jkind.Sort.for_tuple_element)) argl + in Matching.for_multiple_match ~scopes ~return_layout e.exp_loc (transl_list_with_layout ~scopes argl) mode val_cases partial | {exp_desc = Texp_tuple (argl, alloc_mode)}, _ :: _ -> - let argl = List.map (fun a -> (a, Jkind.Sort.for_tuple_element)) argl in + let argl = + List.map (fun (_, a) -> (a, Jkind.Sort.for_tuple_element)) argl + in let val_ids, lvars = List.map (fun (arg,s) -> @@ -1714,7 +2107,7 @@ and transl_match ~scopes ~arg_sort ~return_sort e arg pat_expr_list partial = argl |> List.split in - let mode = transl_alloc_mode alloc_mode in + let mode = transl_alloc_mode_r alloc_mode in static_catch (transl_list ~scopes argl) val_ids (Matching.for_multiple_match ~scopes ~return_layout e.exp_loc lvars mode val_cases partial) @@ -1731,11 +2124,13 @@ and transl_match ~scopes ~arg_sort ~return_sort e arg pat_expr_list partial = e.exp_loc None (Lvar val_id) val_cases partial) in List.fold_left (fun body (static_exception_id, val_ids, handler) -> - Lstaticcatch (body, (static_exception_id, val_ids), handler, return_layout) + Lstaticcatch + (body, (static_exception_id, val_ids), + handler, Same_region, return_layout) ) classic static_handlers and transl_letop ~scopes loc env let_ ands param param_sort case case_sort - partial warnings = + partial = let rec loop prev_layout prev_lam = function | [] -> prev_lam | and_ :: rest -> @@ -1777,33 +2172,28 @@ and transl_letop ~scopes loc env let_ ands param param_sort case case_sort (transl_exp ~scopes let_.bop_exp_sort let_.bop_exp) ands in let func = - let arg_layout = - match Typeopt.is_function_type env let_.bop_op_type with - | None -> - Misc.fatal_error - "Translcore.transl_letop: letop should be a function" - | Some (_, rhs) -> - match Typeopt.is_function_type env rhs with - | None -> - Misc.fatal_error - "Translcore.transl_letop: letop should have at least two arguments" - | Some (lhs, _) -> Typeopt.function_arg_layout env loc param_sort lhs - in - let return_layout = layout_exp case_sort case.c_rhs in - let curry = More_args { partial_mode = Mode.Alloc.legacy } in - let (kind, params, return, _region), body = + let return_mode = alloc_heap (* XXX fixme: use result of is_function_type *) in + let (kind, params, return, _region, ret_mode), body = event_function ~scopes case.c_rhs (function repr -> - transl_curried_function ~scopes ~arg_sort:param_sort ~arg_layout - ~arg_mode:Mode.Alloc.legacy ~return_sort:case_sort - ~return_layout case.c_rhs.exp_loc repr ~region:true ~curry partial - warnings param [case]) + let loc = case.c_rhs.exp_loc in + let ghost_loc = { loc with loc_ghost = true } in + transl_function_without_attributes ~scopes ~region:true + ~return_sort:case_sort ~mode:alloc_heap ~return_mode + loc repr [] + (Tfunction_cases + { fc_cases = [case]; fc_param = param; fc_partial = partial; + fc_loc = ghost_loc; fc_exp_extra = None; fc_attributes = []; + fc_arg_mode = Mode.Alloc.disallow_right Mode.Alloc.legacy; + fc_arg_sort = param_sort; fc_env = env; + fc_ret_type = case.c_rhs.exp_type; + })) in - let attr = default_function_attribute in + let attr = function_attribute_disallowing_arity_fusion in let loc = of_location ~scopes case.c_rhs.exp_loc in let body = maybe_region_layout return body in lfunction ~kind ~params ~return ~body ~attr ~loc - ~mode:alloc_heap ~region:true + ~mode:alloc_heap ~ret_mode ~region:true in Lapply{ ap_loc = of_location ~scopes loc; @@ -1834,9 +2224,13 @@ let transl_scoped_exp ~scopes sort exp = maybe_region_exp sort exp (transl_scoped_exp ~scopes sort exp) let transl_apply - ~scopes ?tailcall ?inlined ?specialised ?position ?mode ~result_layout fn args loc = - maybe_region_layout result_layout (transl_apply - ~scopes ?tailcall ?inlined ?specialised ?position ?mode ~result_layout fn args loc) + ~scopes ?tailcall ?inlined ?specialised ?position ?mode ~result_layout fn + args loc = + maybe_region_layout result_layout + (transl_apply + ~scopes ?tailcall ?inlined ?specialised + ~assume_zero_alloc:Zero_alloc_utils.Assume_info.none ?position ?mode + ~result_layout fn args loc) (* Error report *) @@ -1851,11 +2245,10 @@ let report_error ppf = function | Bad_probe_layout id -> fprintf ppf "Variables in probe handlers must have jkind value, \ but %s in this handler does not." (Ident.name id) - | Illegal_record_field c -> + | Illegal_void_record_field -> fprintf ppf - "Sort %a detected where value was expected in a record field:@ Please \ + "Void sort detected where value was expected in a record field:@ Please \ report this error to the Jane Street compilers team." - Jkind.Sort.format (Jkind.Sort.of_const c) | Void_sort ty -> fprintf ppf "Void detected in translation for type %a:@ Please report this error \ diff --git a/lambda/translcore.mli b/lambda/translcore.mli index 4971b26c171..ebe5190f714 100644 --- a/lambda/translcore.mli +++ b/lambda/translcore.mli @@ -48,7 +48,7 @@ type error = Free_super_var | Unreachable_reached | Bad_probe_layout of Ident.t - | Illegal_record_field of Jkind.Sort.const + | Illegal_void_record_field | Void_sort of Types.type_expr exception Error of Location.t * error diff --git a/lambda/translmod.ml b/lambda/translmod.ml index 398308b5d10..4a76ce8e331 100644 --- a/lambda/translmod.ml +++ b/lambda/translmod.ml @@ -31,6 +31,7 @@ type unsafe_component = | Unsafe_functor | Unsafe_non_function | Unsafe_typext + | Unsafe_non_value_arg type unsafe_info = | Unsafe of { reason:unsafe_component; loc:Location.t; subid:Ident.t } @@ -128,8 +129,11 @@ let rec apply_coercion loc strict restr arg = [{name = param; layout = Lambda.layout_module; attributes = Lambda.default_param_attribute; mode = alloc_heap}] [carg] cc_res - | Tcoerce_primitive { pc_desc; pc_env; pc_type; pc_poly_mode } -> - Translprim.transl_primitive loc pc_desc pc_env pc_type ~poly_mode:pc_poly_mode None + | Tcoerce_primitive { pc_desc; pc_env; pc_type; pc_poly_mode; pc_poly_sort } -> + Translprim.transl_primitive loc pc_desc pc_env pc_type + ~poly_mode:pc_poly_mode + ~poly_sort:pc_poly_sort + None | Tcoerce_alias (env, path, cc) -> let lam = transl_module_path loc env path in name_lambda strict arg Lambda.layout_module @@ -158,10 +162,11 @@ and apply_coercion_result loc strict funct params args cc_res = ~return:Lambda.layout_module ~attr:{ default_function_attribute with is_a_functor = true; - check = Ignore_assert_all Zero_alloc; + zero_alloc = Default_zero_alloc; stub = true; } ~loc ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true ~body:(apply_coercion loc Strict cc_res @@ -259,35 +264,6 @@ let record_primitive = function primitive_declarations := p :: !primitive_declarations | _ -> () -(* Helper for compiling value "let rec". This is only used for Flambda 2 - at present, which uses the new [Dissect_letrec] module, planned to be - upstreamed. At that point this helper can move into that module. *) - -let preallocate_letrec ~bindings ~body = - assert (Clflags.is_flambda2 ()); - let caml_update_dummy_prim = - Primitive.simple_on_values ~name:"caml_update_dummy" ~arity:2 ~alloc:true - in - let update_dummy var expr = - Lprim (Pccall caml_update_dummy_prim, [Lvar var; expr], Loc_unknown) - in - let bindings = List.rev bindings in - let body_with_initialization = - List.fold_left - (fun body (id, def, _size) -> Lsequence (update_dummy id def, body)) - body bindings - in - List.fold_left - (fun body (id, _def, size) -> - let desc = - Primitive.simple_on_values ~name:"caml_alloc_dummy" ~arity:1 - ~alloc:true - in - let size : lambda = Lconst (Const_base (Const_int size)) in - Llet (Strict, Lambda.layout_block, id, - Lprim (Pccall desc, [size], Loc_unknown), body)) - body_with_initialization bindings - (* Utilities for compiling "module rec" definitions *) let mod_prim = Lambda.transl_prim "CamlinternalMod" @@ -321,8 +297,17 @@ let init_shape id modl = | Sig_value(subid, {val_kind=Val_reg; val_type=ty; val_loc=loc},_) :: rem -> let init_v = match get_desc (Ctype.expand_head env ty) with - Tarrow(_,_,_,_) -> - const_int 0 (* camlinternalMod.Function *) + Tarrow(_,ty_arg,_,_) -> begin + (* CR layouts: We should allow any representable layout here. It + will require reworking [camlinternalMod.init_mod]. *) + let jkind = Jkind.Primitive.value ~why:Recmod_fun_arg in + let ty_arg = Ctype.correct_levels ty_arg in + match Ctype.check_type_jkind env ty_arg jkind with + | Ok _ -> const_int 0 (* camlinternalMod.Function *) + | Error _ -> + let unsafe = Unsafe {reason=Unsafe_non_value_arg; loc; subid} in + raise (Initialization_failure unsafe) + end | Tconstr(p, _, _) when Path.same p Predef.path_lazy_t -> const_int 1 (* camlinternalMod.Lazy *) | _ -> @@ -502,14 +487,13 @@ let compile_recmodule ~scopes compile_rhs bindings cont = (* Code to translate class entries in a structure *) -let class_block_size = 4 - let transl_class_bindings ~scopes cl_list = let ids = List.map (fun (ci, _) -> ci.ci_id_class) cl_list in (ids, List.map (fun ({ci_id_class=id; ci_expr=cl; ci_virt=vf}, meths) -> - (id, transl_class ~scopes ids id meths cl vf, class_block_size)) + let def, rkind = transl_class ~scopes ids id meths cl vf in + (id, rkind, def)) cl_list) (* Compile one or more functors, merging curried functors to produce @@ -587,12 +571,16 @@ let rec compile_functor ~scopes mexp coercion root_path loc = poll = Default_poll; loop = Never_loop; is_a_functor = true; - check = Ignore_assert_all Zero_alloc; + is_opaque = false; + zero_alloc = Default_zero_alloc; stub = false; tmc_candidate = false; + may_fuse_arity = true; + unbox_return = false; } ~loc ~mode:alloc_heap + ~ret_mode:alloc_heap ~region:true ~body @@ -672,7 +660,10 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function | Tcoerce_primitive p -> let loc = of_location ~scopes p.pc_loc in Translprim.transl_primitive - loc p.pc_desc p.pc_env p.pc_type ~poly_mode:p.pc_poly_mode None + loc p.pc_desc p.pc_env p.pc_type + ~poly_mode:p.pc_poly_mode + ~poly_sort:p.pc_poly_sort + None | _ -> apply_coercion loc Strict cc (get_field pos)) pos_cc_list, loc) and id_pos_list = @@ -795,13 +786,7 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function transl_structure ~scopes loc (List.rev_append ids fields) cc rootpath final_env rem in - if Clflags.is_flambda2 () then - preallocate_letrec ~bindings:class_bindings ~body, size - else - let class_bindings = - List.map (fun (id, lam, _) -> id, lam) class_bindings - in - Lletrec(class_bindings, body), size + Value_rec_compiler.compile_letrec class_bindings body, size | Tstr_include incl -> let ids = bound_value_identifiers incl.incl_type in let modl = incl.incl_mod in @@ -1119,8 +1104,11 @@ let field_of_str loc str = let ids = Array.of_list (defined_idents str.str_items) in fun (pos, cc) -> match cc with - | Tcoerce_primitive { pc_desc; pc_env; pc_type; pc_poly_mode } -> - Translprim.transl_primitive loc pc_desc pc_env pc_type ~poly_mode:pc_poly_mode None + | Tcoerce_primitive { pc_desc; pc_env; pc_type; pc_poly_mode; pc_poly_sort } -> + Translprim.transl_primitive loc pc_desc pc_env pc_type + ~poly_mode:pc_poly_mode + ~poly_sort:pc_poly_sort + None | Tcoerce_alias (env, path, cc) -> let lam = transl_module_path loc env path in apply_coercion loc Alias cc lam @@ -1286,15 +1274,7 @@ let transl_store_structure ~scopes glob map prims aliases str = let (ids, class_bindings) = transl_class_bindings ~scopes cl_list in let body = store_idents Loc_unknown ids in let lam = - if Clflags.is_flambda2 () then - preallocate_letrec - ~bindings:class_bindings - ~body - else - let class_bindings = - List.map (fun (id, lam, _) -> id, lam) class_bindings - in - Lletrec(class_bindings, body) + Value_rec_compiler.compile_letrec class_bindings body in Lsequence(Lambda.subst no_env_update subst lam, transl_store ~scopes rootpath (add_idents false ids subst) @@ -1456,7 +1436,10 @@ let transl_store_structure ~scopes glob map prims aliases str = Lsequence(Lprim(mod_setfield pos, [Lprim(Pgetglobal glob, [], Loc_unknown); Translprim.transl_primitive Loc_unknown - prim.pc_desc prim.pc_env prim.pc_type ~poly_mode:prim.pc_poly_mode None], + prim.pc_desc prim.pc_env prim.pc_type + ~poly_mode:prim.pc_poly_mode + ~poly_sort:prim.pc_poly_sort + None], Loc_unknown), cont) @@ -1564,12 +1547,41 @@ let transl_implementation_set_fields compilation_unit (str, restr) = compilation_unit; required_globals = required_globals ~flambda:true code } -let transl_implementation compilation_unit impl ~style = +let transl_implementation0 compilation_unit impl ~style = match style with | Plain_block -> transl_implementation_plain_block compilation_unit impl | Set_global_to_block -> transl_implementation_set_global compilation_unit impl | Set_individual_fields -> transl_implementation_set_fields compilation_unit impl +let stub_out_runtime_parameters compilation_unit code = + let runtime_parameters = Env.runtime_parameters () in + match runtime_parameters with + | [] -> code + | _ -> + (* Raise [Invalid_argument "-parameter not yet implemented"] at top level. This + makes the module unusable (which is to say, safe) but well-formed so that + compilation goes through. *) + let scopes = enter_compilation_unit ~scopes:empty_scopes compilation_unit in + let loc = of_location ~scopes Location.none in + let slot = + transl_extension_path + loc + (Lazy.force Env.initial) + Predef.path_invalid_argument + in + let message = + Lconst (Const_base (Const_string("-parameter not yet implemented", + Location.none, None))) + in + Lprim (Praise Raise_regular, + [Lprim(Pmakeblock(0, Immutable, None, alloc_heap), [ slot; message ], loc)], + loc) + +let transl_implementation compilation_unit impl ~style = + let program = transl_implementation0 compilation_unit impl ~style in + let code = stub_out_runtime_parameters compilation_unit program.code in + { program with code } + (* Compile a toplevel phrase *) let toploop_unit = Compilation_unit.of_string "Toploop" @@ -1689,13 +1701,7 @@ let transl_toplevel_item ~scopes item = let (ids, class_bindings) = transl_class_bindings ~scopes cl_list in List.iter set_toplevel_unique_name ids; let body = make_sequence toploop_setvalue_id ids in - if Clflags.is_flambda2 () then - preallocate_letrec ~bindings:class_bindings ~body - else - let class_bindings = - List.map (fun (id, lam, _) -> id, lam) class_bindings - in - Lletrec(class_bindings, body) + Value_rec_compiler.compile_letrec class_bindings body | Tstr_include incl -> let ids = bound_value_identifiers incl.incl_type in let loc = of_location ~scopes incl.incl_loc in @@ -1888,6 +1894,9 @@ let explanation_submsg (id, unsafe_info) = | Unsafe_typext -> print "Module %s defines an unsafe extension constructor, %s ." | Unsafe_non_function -> print "Module %s defines an unsafe value, %s ." + | Unsafe_non_value_arg -> + print "Module %s defines a function whose first argument \ + is not a value, %s ." let report_error loc = function | Circular_dependency cycle -> diff --git a/lambda/translmod.mli b/lambda/translmod.mli index 87c758da27e..8e34a779d41 100644 --- a/lambda/translmod.mli +++ b/lambda/translmod.mli @@ -45,6 +45,7 @@ type unsafe_component = | Unsafe_functor | Unsafe_non_function | Unsafe_typext + | Unsafe_non_value_arg type unsafe_info = | Unsafe of { reason:unsafe_component; loc:Location.t; subid:Ident.t } diff --git a/lambda/translmode.ml b/lambda/translmode.ml index 7188ca0f626..b2ed9c9b47a 100644 --- a/lambda/translmode.ml +++ b/lambda/translmode.ml @@ -1,16 +1,41 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Zesen Qian, Jane Street, London *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + open Lambda open Mode -let transl_locality_mode locality = - match Locality.constrain_lower locality with - | Global -> alloc_heap - | Local -> alloc_local +let transl_locality_mode = function + | Locality.Const.Global -> alloc_heap + | Locality.Const.Local -> alloc_local + +let transl_locality_mode_l locality = + Locality.zap_to_floor locality |> transl_locality_mode + +let transl_locality_mode_r locality = + (* r mode are for allocations; [optimise_allocations] should have pushed it + to ceil and determined; here we push it again just to get the constant. *) + Locality.zap_to_ceil locality |> transl_locality_mode + +let transl_alloc_mode_l mode = + (* we only take the locality axis *) + Alloc.proj (Comonadic Areality) mode |> transl_locality_mode_l -let transl_alloc_mode mode = -(* we only take the locality axis *) - transl_locality_mode (Alloc.locality mode) +let transl_alloc_mode_r mode = + (* we only take the locality axis *) + Alloc.proj (Comonadic Areality) mode |> transl_locality_mode_r let transl_modify_mode locality = - match Locality.constrain_lower locality with + match Locality.zap_to_floor locality with | Global -> modify_heap - | Local -> modify_maybe_stack \ No newline at end of file + | Local -> modify_maybe_stack diff --git a/lambda/translmode.mli b/lambda/translmode.mli index 29843b6a95d..26716096aa9 100644 --- a/lambda/translmode.mli +++ b/lambda/translmode.mli @@ -1,7 +1,23 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Zesen Qian, Jane Street, London *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + open Mode -val transl_locality_mode : Locality.t -> Lambda.locality_mode +val transl_locality_mode_l : (allowed * 'r) Locality.t -> Lambda.locality_mode + +val transl_alloc_mode_l : (allowed * 'r) Alloc.t -> Lambda.alloc_mode -val transl_alloc_mode : Alloc.t -> Lambda.alloc_mode +val transl_alloc_mode_r : ('l * allowed) Alloc.t -> Lambda.alloc_mode -val transl_modify_mode : Locality.t -> Lambda.modify_mode +val transl_modify_mode : (allowed * 'r) Locality.t -> Lambda.modify_mode diff --git a/lambda/translobj.ml b/lambda/translobj.ml index 21133434ecb..348730fe9f4 100644 --- a/lambda/translobj.ml +++ b/lambda/translobj.ml @@ -13,7 +13,6 @@ (* *) (**************************************************************************) -open Asttypes open Lambda (* Get oo primitives identifiers *) @@ -85,7 +84,7 @@ let int n = Lconst (Const_base (Const_int n)) (* CR layouts v5: To change when we have arrays of other sorts *) let prim_makearray = - Primitive.simple_on_values ~name:"caml_make_vect" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_make_vect" ~arity:2 ~alloc:true (* Also use it for required globals *) let transl_label_init_general f = @@ -171,7 +170,7 @@ let oo_add_class id = classes := id :: !classes; (!top_env, !cache_required) -let oo_wrap env req f x = +let oo_wrap_gen env req f x = if !wrapping then if !cache_required then f x else Misc.protect_refs [Misc.R (cache_required, true)] (fun () -> @@ -183,7 +182,7 @@ let oo_wrap env req f x = cache_required := req; classes := []; method_ids := Ident.Set.empty; - let lambda = f x in + let lambda, other = f x in let lambda = List.fold_left (fun lambda id -> @@ -197,9 +196,13 @@ let oo_wrap env req f x = lambda)) lambda !classes in - lambda + lambda, other ) +let oo_wrap env req f x = + let lam, () = oo_wrap_gen env req (fun x -> f x, ()) x in + lam + let reset () = Hashtbl.clear consts; cache_required := false; diff --git a/lambda/translobj.mli b/lambda/translobj.mli index cbe9ac81119..f85c2b80edf 100644 --- a/lambda/translobj.mli +++ b/lambda/translobj.mli @@ -28,6 +28,7 @@ val transl_store_label_init: val method_ids: Ident.Set.t ref (* reset when starting a new wrapper *) val oo_wrap: Env.t -> bool -> ('a -> lambda) -> 'a -> lambda +val oo_wrap_gen: Env.t -> bool -> ('a -> lambda * 'b) -> 'a -> lambda * 'b val oo_add_class: Ident.t -> Env.t * bool val reset: unit -> unit diff --git a/lambda/translprim.ml b/lambda/translprim.ml index 40208243fbc..4dd9f547e29 100644 --- a/lambda/translprim.ml +++ b/lambda/translprim.ml @@ -15,7 +15,6 @@ (* Translation of primitives *) -open Asttypes open Primitive open Types open Typedtree @@ -27,6 +26,7 @@ open Translmode type error = | Unknown_builtin_primitive of string | Wrong_arity_builtin_primitive of string + | Invalid_floatarray_glb exception Error of Location.t * error @@ -63,6 +63,7 @@ type comparison_kind = | Compare_generic | Compare_ints | Compare_floats + | Compare_float32s | Compare_strings | Compare_bytes | Compare_nativeints @@ -79,7 +80,7 @@ type loc_kind = type prim = | Primitive of Lambda.primitive * int - | External of Primitive.description + | External of Lambda.external_call_description | Sys_argv | Comparison of comparison * comparison_kind | Raise of Lambda.raise_kind @@ -93,6 +94,7 @@ type prim = | Identity | Apply of Lambda.region_close * Lambda.layout | Revapply of Lambda.region_close * Lambda.layout + | Unsupported of Lambda.primitive let units_with_used_primitives = Hashtbl.create 7 let add_used_primitive loc env path = @@ -121,7 +123,7 @@ let gen_array_set_kind mode = if Config.flat_float_array then Pgenarray_set mode else Paddrarray_set mode let prim_sys_argv = - Primitive.simple_on_values ~name:"caml_sys_argv" ~arity:1 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_sys_argv" ~arity:1 ~alloc:true let to_locality ~poly = function | Prim_global, _ -> alloc_heap @@ -129,7 +131,7 @@ let to_locality ~poly = function | Prim_poly, _ -> match poly with | None -> assert false - | Some locality -> transl_locality_mode locality + | Some locality -> transl_locality_mode_l locality let to_modify_mode ~poly = function | Prim_global, _ -> modify_heap @@ -139,9 +141,51 @@ let to_modify_mode ~poly = function | None -> assert false | Some mode -> transl_modify_mode mode -let lookup_primitive loc poly pos p = - let mode = to_locality ~poly p.prim_native_repr_res in - let arg_modes = List.map (to_modify_mode ~poly) p.prim_native_repr_args in +let extern_repr_of_native_repr: + poly_sort:Jkind.Sort.t option -> Primitive.native_repr -> Lambda.extern_repr + = fun ~poly_sort r -> match r, poly_sort with + | Repr_poly, Some s -> Same_as_ocaml_repr (Jkind.Sort.default_to_value_and_get s) + | Repr_poly, None -> Misc.fatal_error "Unexpected Repr_poly" + | Same_as_ocaml_repr s, _ -> Same_as_ocaml_repr s + | Unboxed_float f, _ -> Unboxed_float f + | Unboxed_integer i, _ -> Unboxed_integer i + | Unboxed_vector i, _ -> Unboxed_vector i + | Untagged_int, _ -> Untagged_int + +let sort_of_native_repr ~poly_sort repr = + match extern_repr_of_native_repr ~poly_sort repr with + | Same_as_ocaml_repr s -> s + | (Unboxed_float _ | Unboxed_integer _ | Untagged_int | + Unboxed_vector _) -> + Jkind.Sort.Value + +let to_lambda_prim prim ~poly_sort = + let native_repr_args = + List.map + (fun (m, r) -> m, extern_repr_of_native_repr ~poly_sort r) + prim.prim_native_repr_args + in + let native_repr_res = + let (m, r) = prim.prim_native_repr_res in + m, extern_repr_of_native_repr ~poly_sort r + in + Primitive.make + ~name:prim.prim_name + ~alloc:prim.prim_alloc + ~c_builtin:prim.prim_c_builtin + ~effects:prim.prim_effects + ~coeffects:prim.prim_coeffects + ~native_name:prim.prim_native_name + ~native_repr_args + ~native_repr_res + ~is_layout_poly:prim.prim_is_layout_poly + +let lookup_primitive loc ~poly_mode ~poly_sort pos p = + let runtime5 = Config.runtime5 in + let mode = to_locality ~poly:poly_mode p.prim_native_repr_res in + let arg_modes = + List.map (to_modify_mode ~poly:poly_mode) p.prim_native_repr_args + in let get_first_arg_mode () = match arg_modes with | mode :: _ -> mode @@ -149,13 +193,28 @@ let lookup_primitive loc poly pos p = Misc.fatal_errorf "Primitive \"%s\" unexpectedly had zero arguments" p.prim_name in + let lambda_prim = to_lambda_prim p ~poly_sort in + let layout = + (* Extract the result layout of the primitive. This can be a non-value + layout even without the use of [@layout_poly]. For example: + + {[ external id : float# -> float# = "%opaque" ]} + + We don't allow non-value layouts for most primitives. This is checked by + [prim_has_valid_reprs] in [typing/primitive.ml]. + + We don't extract the argument layouts just because it is not needed by + the middle-end. *) + let (_, repr) = lambda_prim.prim_native_repr_res in + Lambda.layout_of_extern_repr repr + in let prim = match p.prim_name with | "%identity" -> Identity | "%bytes_to_string" -> Primitive (Pbytes_to_string, 1) | "%bytes_of_string" -> Primitive (Pbytes_of_string, 1) | "%ignore" -> Primitive (Pignore, 1) - | "%revapply" -> Revapply (pos, Lambda.layout_any_value) - | "%apply" -> Apply (pos, Lambda.layout_any_value) + | "%revapply" -> Revapply (pos, layout) + | "%apply" -> Apply (pos, layout) | "%loc_LOC" -> Loc Loc_LOC | "%loc_FILE" -> Loc Loc_FILE | "%loc_LINE" -> Loc Loc_LINE @@ -186,6 +245,7 @@ let lookup_primitive loc poly pos p = | "%ostype_unix" -> Primitive ((Pctconst Ostype_unix), 1) | "%ostype_win32" -> Primitive ((Pctconst Ostype_win32), 1) | "%ostype_cygwin" -> Primitive ((Pctconst Ostype_cygwin), 1) + | "%runtime5" -> Primitive ((Pctconst Runtime5), 1) | "%frame_pointers" -> Frame_pointers | "%negint" -> Primitive (Pnegint, 1) | "%succint" -> Primitive ((Poffsetint 1), 1) @@ -209,20 +269,36 @@ let lookup_primitive loc poly pos p = | "%geint" -> Primitive ((Pintcomp Cge), 2) | "%incr" -> Primitive ((Poffsetref(1)), 1) | "%decr" -> Primitive ((Poffsetref(-1)), 1) - | "%intoffloat" -> Primitive (Pintoffloat, 1) - | "%floatofint" -> Primitive (Pfloatofint mode, 1) - | "%negfloat" -> Primitive (Pnegfloat mode, 1) - | "%absfloat" -> Primitive (Pabsfloat mode, 1) - | "%addfloat" -> Primitive (Paddfloat mode, 2) - | "%subfloat" -> Primitive (Psubfloat mode, 2) - | "%mulfloat" -> Primitive (Pmulfloat mode, 2) - | "%divfloat" -> Primitive (Pdivfloat mode, 2) - | "%eqfloat" -> Primitive ((Pfloatcomp CFeq), 2) - | "%noteqfloat" -> Primitive ((Pfloatcomp CFneq), 2) - | "%ltfloat" -> Primitive ((Pfloatcomp CFlt), 2) - | "%lefloat" -> Primitive ((Pfloatcomp CFle), 2) - | "%gtfloat" -> Primitive ((Pfloatcomp CFgt), 2) - | "%gefloat" -> Primitive ((Pfloatcomp CFge), 2) + | "%floatoffloat32" -> Primitive (Pfloatoffloat32 mode, 1) + | "%float32offloat" -> Primitive (Pfloat32offloat mode, 1) + | "%intoffloat32" -> Primitive (Pintoffloat Pfloat32, 1) + | "%float32ofint" -> Primitive (Pfloatofint (Pfloat32, mode), 1) + | "%negfloat32" -> Primitive (Pnegfloat (Pfloat32, mode), 1) + | "%absfloat32" -> Primitive (Pabsfloat (Pfloat32, mode), 1) + | "%addfloat32" -> Primitive (Paddfloat (Pfloat32, mode), 2) + | "%subfloat32" -> Primitive (Psubfloat (Pfloat32, mode), 2) + | "%mulfloat32" -> Primitive (Pmulfloat (Pfloat32, mode), 2) + | "%divfloat32" -> Primitive (Pdivfloat (Pfloat32, mode), 2) + | "%eqfloat32" -> Primitive ((Pfloatcomp (Pfloat32, CFeq)), 2) + | "%noteqfloat32" -> Primitive ((Pfloatcomp (Pfloat32, CFneq)), 2) + | "%ltfloat32" -> Primitive ((Pfloatcomp (Pfloat32, CFlt)), 2) + | "%lefloat32" -> Primitive ((Pfloatcomp (Pfloat32, CFle)), 2) + | "%gtfloat32" -> Primitive ((Pfloatcomp (Pfloat32, CFgt)), 2) + | "%gefloat32" -> Primitive ((Pfloatcomp (Pfloat32, CFge)), 2) + | "%intoffloat" -> Primitive (Pintoffloat Pfloat64, 1) + | "%floatofint" -> Primitive (Pfloatofint (Pfloat64, mode), 1) + | "%negfloat" -> Primitive (Pnegfloat (Pfloat64, mode), 1) + | "%absfloat" -> Primitive (Pabsfloat (Pfloat64, mode), 1) + | "%addfloat" -> Primitive (Paddfloat (Pfloat64, mode), 2) + | "%subfloat" -> Primitive (Psubfloat (Pfloat64, mode), 2) + | "%mulfloat" -> Primitive (Pmulfloat (Pfloat64, mode), 2) + | "%divfloat" -> Primitive (Pdivfloat (Pfloat64, mode), 2) + | "%eqfloat" -> Primitive ((Pfloatcomp (Pfloat64, CFeq)), 2) + | "%noteqfloat" -> Primitive ((Pfloatcomp (Pfloat64, CFneq)), 2) + | "%ltfloat" -> Primitive ((Pfloatcomp (Pfloat64, CFlt)), 2) + | "%lefloat" -> Primitive ((Pfloatcomp (Pfloat64, CFle)), 2) + | "%gtfloat" -> Primitive ((Pfloatcomp (Pfloat64, CFgt)), 2) + | "%gefloat" -> Primitive ((Pfloatcomp (Pfloat64, CFge)), 2) | "%string_length" -> Primitive (Pstringlength, 1) | "%string_safe_get" -> Primitive (Pstringrefs, 2) | "%string_safe_set" -> Primitive (Pbytessets, 3) @@ -234,23 +310,82 @@ let lookup_primitive loc poly pos p = | "%bytes_unsafe_get" -> Primitive (Pbytesrefu, 2) | "%bytes_unsafe_set" -> Primitive (Pbytessetu, 3) | "%array_length" -> Primitive ((Parraylength gen_array_kind), 1) - | "%array_safe_get" -> Primitive ((Parrayrefs (gen_array_ref_kind mode)), 2) + | "%array_safe_get" -> + Primitive + ((Parrayrefs (gen_array_ref_kind mode, Ptagged_int_index)), 2) | "%array_safe_set" -> - Primitive (Parraysets (gen_array_set_kind (get_first_arg_mode ())), 3) - | "%array_unsafe_get" -> Primitive (Parrayrefu (gen_array_ref_kind mode), 2) + Primitive + (Parraysets (gen_array_set_kind (get_first_arg_mode ()), Ptagged_int_index), + 3) + | "%array_unsafe_get" -> + Primitive + (Parrayrefu (gen_array_ref_kind mode, Ptagged_int_index), 2) | "%array_unsafe_set" -> - Primitive ((Parraysetu (gen_array_set_kind (get_first_arg_mode ()))), 3) + Primitive + ((Parraysetu (gen_array_set_kind (get_first_arg_mode ()), Ptagged_int_index)), + 3) + | "%array_safe_get_indexed_by_int64#" -> + Primitive + ((Parrayrefs (gen_array_ref_kind mode, Punboxed_int_index Pint64)), 2) + | "%array_safe_set_indexed_by_int64#" -> + Primitive + (Parraysets + (gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint64), + 3) + | "%array_unsafe_get_indexed_by_int64#" -> + Primitive + (Parrayrefu (gen_array_ref_kind mode, Punboxed_int_index Pint64), 2) + | "%array_unsafe_set_indexed_by_int64#" -> + Primitive + ((Parraysetu + (gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint64)), + 3) + | "%array_safe_get_indexed_by_int32#" -> + Primitive + ((Parrayrefs (gen_array_ref_kind mode, Punboxed_int_index Pint32)), 2) + | "%array_safe_set_indexed_by_int32#" -> + Primitive + (Parraysets + (gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint32), + 3) + | "%array_unsafe_get_indexed_by_int32#" -> + Primitive + (Parrayrefu (gen_array_ref_kind mode, Punboxed_int_index Pint32), 2) + | "%array_unsafe_set_indexed_by_int32#" -> + Primitive + ((Parraysetu + (gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint32)), + 3) + | "%array_safe_get_indexed_by_nativeint#" -> + Primitive + ((Parrayrefs (gen_array_ref_kind mode, Punboxed_int_index Pnativeint)), 2) + | "%array_safe_set_indexed_by_nativeint#" -> + Primitive + (Parraysets + (gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pnativeint), + 3) + | "%array_unsafe_get_indexed_by_nativeint#" -> + Primitive + (Parrayrefu (gen_array_ref_kind mode, Punboxed_int_index Pnativeint), 2) + | "%array_unsafe_set_indexed_by_nativeint#" -> + Primitive + ((Parraysetu + (gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pnativeint)), + 3) | "%obj_size" -> Primitive ((Parraylength Pgenarray), 1) - | "%obj_field" -> Primitive ((Parrayrefu (Pgenarray_ref mode)), 2) + | "%obj_field" -> Primitive ((Parrayrefu (Pgenarray_ref mode, Ptagged_int_index)), 2) | "%obj_set_field" -> - Primitive ((Parraysetu (Pgenarray_set (get_first_arg_mode ()))), 3) + Primitive + ((Parraysetu (Pgenarray_set (get_first_arg_mode ()), Ptagged_int_index)), 3) | "%floatarray_length" -> Primitive ((Parraylength Pfloatarray), 1) | "%floatarray_safe_get" -> - Primitive ((Parrayrefs (Pfloatarray_ref mode)), 2) - | "%floatarray_safe_set" -> Primitive (Parraysets Pfloatarray_set, 3) + Primitive ((Parrayrefs (Pfloatarray_ref mode, Ptagged_int_index)), 2) + | "%floatarray_safe_set" -> + Primitive (Parraysets (Pfloatarray_set, Ptagged_int_index), 3) | "%floatarray_unsafe_get" -> - Primitive ((Parrayrefu (Pfloatarray_ref mode)), 2) - | "%floatarray_unsafe_set" -> Primitive ((Parraysetu Pfloatarray_set), 3) + Primitive ((Parrayrefu (Pfloatarray_ref mode, Ptagged_int_index)), 2) + | "%floatarray_unsafe_set" -> + Primitive ((Parraysetu (Pfloatarray_set, Ptagged_int_index)), 3) | "%obj_is_int" -> Primitive (Pisint { variant_only = false }, 1) | "%lazy_force" -> Lazy_force pos | "%nativeint_of_int" -> Primitive ((Pbintofint (Pnativeint, mode)), 1) @@ -355,6 +490,54 @@ let lookup_primitive loc poly pos p = Primitive ((Pbigarrayset(true, 3, Pbigarray_unknown, Pbigarray_unknown_layout)), 5); + | "%caml_ba_float32_ref_1" -> + Primitive + ((Pbigarrayref(false, 1, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 2); + | "%caml_ba_float32_ref_2" -> + Primitive + ((Pbigarrayref(false, 2, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 3); + | "%caml_ba_float32_ref_3" -> + Primitive + ((Pbigarrayref(false, 3, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 4); + | "%caml_ba_float32_set_1" -> + Primitive + ((Pbigarrayset(false, 1, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 3); + | "%caml_ba_float32_set_2" -> + Primitive + ((Pbigarrayset(false, 2, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 4); + | "%caml_ba_float32_set_3" -> + Primitive + ((Pbigarrayset(false, 3, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 5); + | "%caml_ba_float32_unsafe_ref_1" -> + Primitive + ((Pbigarrayref(true, 1, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 2); + | "%caml_ba_float32_unsafe_ref_2" -> + Primitive + ((Pbigarrayref(true, 2, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 3); + | "%caml_ba_float32_unsafe_ref_3" -> + Primitive + ((Pbigarrayref(true, 3, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 4); + | "%caml_ba_float32_unsafe_set_1" -> + Primitive + ((Pbigarrayset(true, 1, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 3); + | "%caml_ba_float32_unsafe_set_2" -> + Primitive + ((Pbigarrayset(true, 2, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 4); + | "%caml_ba_float32_unsafe_set_3" -> + Primitive + ((Pbigarrayset(true, 3, Pbigarray_float32_t, Pbigarray_unknown_layout)), + 5); | "%caml_ba_dim_1" -> Primitive ((Pbigarraydim(1)), 1) | "%caml_ba_dim_2" -> Primitive ((Pbigarraydim(2)), 1) | "%caml_ba_dim_3" -> Primitive ((Pbigarraydim(3)), 1) @@ -362,6 +545,8 @@ let lookup_primitive loc poly pos p = | "%caml_string_get16u" -> Primitive ((Pstring_load_16(true)), 2) | "%caml_string_get32" -> Primitive ((Pstring_load_32(false, mode)), 2) | "%caml_string_get32u" -> Primitive ((Pstring_load_32(true, mode)), 2) + | "%caml_string_getf32" -> Primitive ((Pstring_load_f32(false, mode)), 2) + | "%caml_string_getf32u" -> Primitive ((Pstring_load_f32(true, mode)), 2) | "%caml_string_get64" -> Primitive ((Pstring_load_64(false, mode)), 2) | "%caml_string_get64u" -> Primitive ((Pstring_load_64(true, mode)), 2) | "%caml_string_getu128" -> @@ -372,6 +557,8 @@ let lookup_primitive loc poly pos p = | "%caml_string_set16u" -> Primitive ((Pbytes_set_16(true)), 3) | "%caml_string_set32" -> Primitive ((Pbytes_set_32(false)), 3) | "%caml_string_set32u" -> Primitive ((Pbytes_set_32(true)), 3) + | "%caml_string_setf32" -> Primitive ((Pbytes_set_f32(false)), 3) + | "%caml_string_setf32u" -> Primitive ((Pbytes_set_f32(true)), 3) | "%caml_string_set64" -> Primitive ((Pbytes_set_64(false)), 3) | "%caml_string_set64u" -> Primitive ((Pbytes_set_64(true)), 3) | "%caml_string_setu128" -> @@ -382,6 +569,8 @@ let lookup_primitive loc poly pos p = | "%caml_bytes_get16u" -> Primitive ((Pbytes_load_16(true)), 2) | "%caml_bytes_get32" -> Primitive ((Pbytes_load_32(false, mode)), 2) | "%caml_bytes_get32u" -> Primitive ((Pbytes_load_32(true, mode)), 2) + | "%caml_bytes_getf32" -> Primitive ((Pbytes_load_f32(false, mode)), 2) + | "%caml_bytes_getf32u" -> Primitive ((Pbytes_load_f32(true, mode)), 2) | "%caml_bytes_get64" -> Primitive ((Pbytes_load_64(false, mode)), 2) | "%caml_bytes_get64u" -> Primitive ((Pbytes_load_64(true, mode)), 2) | "%caml_bytes_getu128" -> @@ -392,50 +581,198 @@ let lookup_primitive loc poly pos p = | "%caml_bytes_set16u" -> Primitive ((Pbytes_set_16(true)), 3) | "%caml_bytes_set32" -> Primitive ((Pbytes_set_32(false)), 3) | "%caml_bytes_set32u" -> Primitive ((Pbytes_set_32(true)), 3) + | "%caml_bytes_setf32" -> Primitive ((Pbytes_set_f32(false)), 3) + | "%caml_bytes_setf32u" -> Primitive ((Pbytes_set_f32(true)), 3) | "%caml_bytes_set64" -> Primitive ((Pbytes_set_64(false)), 3) | "%caml_bytes_set64u" -> Primitive ((Pbytes_set_64(true)), 3) | "%caml_bytes_setu128" -> Primitive ((Pbytes_set_128 {unsafe = false}), 3) | "%caml_bytes_setu128u" -> Primitive ((Pbytes_set_128 {unsafe = true}), 3) - | "%caml_bigstring_get16" -> Primitive ((Pbigstring_load_16(false)), 2) - | "%caml_bigstring_get16u" -> Primitive ((Pbigstring_load_16(true)), 2) - | "%caml_bigstring_get32" -> Primitive ((Pbigstring_load_32(false, mode)), 2) - | "%caml_bigstring_get32u" -> Primitive ((Pbigstring_load_32(true, mode)), 2) - | "%caml_bigstring_get64" -> Primitive ((Pbigstring_load_64(false, mode)), 2) - | "%caml_bigstring_get64u" -> Primitive ((Pbigstring_load_64(true, mode)), 2) + | "%caml_bigstring_get16" -> + Primitive ((Pbigstring_load_16 { unsafe = false }), 2) + | "%caml_bigstring_get16u" -> + Primitive ((Pbigstring_load_16 { unsafe = true }), 2) + | "%caml_bigstring_get32" -> + Primitive ((Pbigstring_load_32 { unsafe = false; mode; boxed = true }), 2) + | "%caml_bigstring_get32u" -> + Primitive ((Pbigstring_load_32 { unsafe = true; mode; boxed = true }), 2) + | "%caml_bigstring_getf32" -> + Primitive ((Pbigstring_load_f32 { unsafe = false; mode; boxed = true }), 2) + | "%caml_bigstring_getf32u" -> + Primitive ((Pbigstring_load_f32 { unsafe = true; mode; boxed = true }), 2) + | "%caml_bigstring_get64" -> + Primitive ((Pbigstring_load_64 { unsafe = false; mode; boxed = true }), 2) + | "%caml_bigstring_get64u" -> + Primitive ((Pbigstring_load_64 { unsafe = true; mode; boxed = true }), 2) | "%caml_bigstring_getu128" -> - Primitive ((Pbigstring_load_128 {aligned = false; unsafe = false; mode}), 2) + Primitive ((Pbigstring_load_128 {aligned = false; unsafe = false; mode; + boxed = true }), 2) | "%caml_bigstring_getu128u" -> - Primitive ((Pbigstring_load_128 {aligned = false; unsafe = true; mode}), 2) + Primitive ((Pbigstring_load_128 {aligned = false; unsafe = true; mode; + boxed = true }), 2) | "%caml_bigstring_geta128" -> - Primitive ((Pbigstring_load_128 {aligned = true; unsafe = false; mode}), 2) + Primitive ((Pbigstring_load_128 {aligned = true; unsafe = false; mode; + boxed = true }), 2) | "%caml_bigstring_geta128u" -> - Primitive ((Pbigstring_load_128 {aligned = true; unsafe = true; mode}), 2) - | "%caml_bigstring_set16" -> Primitive ((Pbigstring_set_16(false)), 3) - | "%caml_bigstring_set16u" -> Primitive ((Pbigstring_set_16(true)), 3) - | "%caml_bigstring_set32" -> Primitive ((Pbigstring_set_32(false)), 3) - | "%caml_bigstring_set32u" -> Primitive ((Pbigstring_set_32(true)), 3) - | "%caml_bigstring_set64" -> Primitive ((Pbigstring_set_64(false)), 3) - | "%caml_bigstring_set64u" -> Primitive ((Pbigstring_set_64(true)), 3) + Primitive ((Pbigstring_load_128 {aligned = true; unsafe = true; mode; + boxed = true }), 2) + | "%caml_bigstring_set16" -> + Primitive ((Pbigstring_set_16 { unsafe = false }), 3) + | "%caml_bigstring_set16u" -> + Primitive ((Pbigstring_set_16 { unsafe = true }), 3) + | "%caml_bigstring_set32" -> + Primitive ((Pbigstring_set_32 { unsafe = false; boxed = true }), 3) + | "%caml_bigstring_set32u" -> + Primitive ((Pbigstring_set_32 { unsafe = true; boxed = true }), 3) + | "%caml_bigstring_setf32" -> + Primitive ((Pbigstring_set_f32 { unsafe = false; boxed = true }), 3) + | "%caml_bigstring_setf32u" -> + Primitive ((Pbigstring_set_f32 { unsafe = true; boxed = true }), 3) + | "%caml_bigstring_set64" -> + Primitive ((Pbigstring_set_64 { unsafe = false; boxed = true }), 3) + | "%caml_bigstring_set64u" -> + Primitive ((Pbigstring_set_64 { unsafe = true; boxed = true }), 3) | "%caml_bigstring_setu128" -> - Primitive ((Pbigstring_set_128 {aligned = false; unsafe = false}), 3) + Primitive ((Pbigstring_set_128 {aligned = false; unsafe = false; + boxed = true}), 3) | "%caml_bigstring_setu128u" -> - Primitive ((Pbigstring_set_128 {aligned = false; unsafe = true}), 3) + Primitive ((Pbigstring_set_128 {aligned = false; unsafe = true; + boxed = true}), 3) | "%caml_bigstring_seta128" -> - Primitive ((Pbigstring_set_128 {aligned = true; unsafe = false}), 3) + Primitive ((Pbigstring_set_128 {aligned = true; unsafe = false; + boxed = true}), 3) | "%caml_bigstring_seta128u" -> - Primitive ((Pbigstring_set_128 {aligned = true; unsafe = true}), 3) + Primitive ((Pbigstring_set_128 {aligned = true; unsafe = true; + boxed = true}), 3) + | "%caml_bigstring_get32#" -> + Primitive ((Pbigstring_load_32 { unsafe = false; mode; boxed = false }), + 2) + | "%caml_bigstring_get32u#" -> + Primitive ((Pbigstring_load_32 { unsafe = true; mode; boxed = false }), + 2) + | "%caml_bigstring_getf32#" -> + Primitive ((Pbigstring_load_f32 { unsafe = false; mode; boxed = false }), + 2) + | "%caml_bigstring_getf32u#" -> + Primitive ((Pbigstring_load_f32 { unsafe = true; mode; boxed = false }), + 2) + | "%caml_bigstring_get64#" -> + Primitive ((Pbigstring_load_64 { unsafe = false; mode; boxed = false }), + 2) + | "%caml_bigstring_get64u#" -> + Primitive ((Pbigstring_load_64 { unsafe = true; mode; boxed = false }), + 2) + | "%caml_bigstring_getu128#" -> + Primitive ((Pbigstring_load_128 {aligned = false; unsafe = false; mode; + boxed = false }), 2) + | "%caml_bigstring_getu128u#" -> + Primitive ((Pbigstring_load_128 {aligned = false; unsafe = true; mode; + boxed = false }), 2) + | "%caml_bigstring_geta128#" -> + Primitive ((Pbigstring_load_128 {aligned = true; unsafe = false; mode; + boxed = false }), 2) + | "%caml_bigstring_geta128u#" -> + Primitive ((Pbigstring_load_128 {aligned = true; unsafe = true; mode; + boxed = false }), 2) + | "%caml_bigstring_set32#" -> + Primitive ((Pbigstring_set_32 { unsafe = false; boxed = false }), 3) + | "%caml_bigstring_set32u#" -> + Primitive ((Pbigstring_set_32 { unsafe = true; boxed = false }), 3) + | "%caml_bigstring_setf32#" -> + Primitive ((Pbigstring_set_f32 { unsafe = false; boxed = false }), 3) + | "%caml_bigstring_setf32u#" -> + Primitive ((Pbigstring_set_f32 { unsafe = true; boxed = false }), 3) + | "%caml_bigstring_set64#" -> + Primitive ((Pbigstring_set_64 { unsafe = false; boxed = false }), 3) + | "%caml_bigstring_set64u#" -> + Primitive ((Pbigstring_set_64 { unsafe = true; boxed = false }), 3) + | "%caml_bigstring_setu128#" -> + Primitive ((Pbigstring_set_128 {aligned = false; unsafe = false; + boxed = false}), 3) + | "%caml_bigstring_setu128u#" -> + Primitive ((Pbigstring_set_128 {aligned = false; unsafe = true; + boxed = false}), 3) + | "%caml_bigstring_seta128#" -> + Primitive ((Pbigstring_set_128 {aligned = true; unsafe = false; + boxed = false}), 3) + | "%caml_bigstring_seta128u#" -> + Primitive ((Pbigstring_set_128 {aligned = true; unsafe = true; + boxed = false}), 3) + | "%caml_float_array_get128" -> + Primitive ((Pfloat_array_load_128 {unsafe = false; mode}), 2) + | "%caml_float_array_get128u" -> + Primitive ((Pfloat_array_load_128 {unsafe = true; mode}), 2) + | "%caml_floatarray_get128" -> + Primitive ((Pfloatarray_load_128 {unsafe = false; mode}), 2) + | "%caml_floatarray_get128u" -> + Primitive ((Pfloatarray_load_128 {unsafe = true; mode}), 2) + | "%caml_unboxed_float_array_get128" -> + Primitive ((Punboxed_float_array_load_128 {unsafe = false; mode}), 2) + | "%caml_unboxed_float_array_get128u" -> + Primitive ((Punboxed_float_array_load_128 {unsafe = true; mode}), 2) + | "%caml_unboxed_float32_array_get128" -> + Primitive ((Punboxed_float32_array_load_128 {unsafe = false; mode}), 2) + | "%caml_unboxed_float32_array_get128u" -> + Primitive ((Punboxed_float32_array_load_128 {unsafe = true; mode}), 2) + | "%caml_int_array_get128" -> + Primitive ((Pint_array_load_128 {unsafe = false; mode}), 2) + | "%caml_int_array_get128u" -> + Primitive ((Pint_array_load_128 {unsafe = true; mode}), 2) + | "%caml_unboxed_int64_array_get128" -> + Primitive ((Punboxed_int64_array_load_128 {unsafe = false; mode}), 2) + | "%caml_unboxed_int64_array_get128u" -> + Primitive ((Punboxed_int64_array_load_128 {unsafe = true; mode}), 2) + | "%caml_unboxed_int32_array_get128" -> + Primitive ((Punboxed_int32_array_load_128 {unsafe = false; mode}), 2) + | "%caml_unboxed_int32_array_get128u" -> + Primitive ((Punboxed_int32_array_load_128 {unsafe = true; mode}), 2) + | "%caml_unboxed_nativeint_array_get128" -> + Primitive ((Punboxed_nativeint_array_load_128 {unsafe = false; mode}), 2) + | "%caml_unboxed_nativeint_array_get128u" -> + Primitive ((Punboxed_nativeint_array_load_128 {unsafe = true; mode}), 2) + | "%caml_float_array_set128" -> + Primitive ((Pfloat_array_set_128 {unsafe = false}), 3) + | "%caml_float_array_set128u" -> + Primitive ((Pfloat_array_set_128 {unsafe = true}), 3) + | "%caml_floatarray_set128" -> + Primitive ((Pfloatarray_set_128 {unsafe = false}), 3) + | "%caml_floatarray_set128u" -> + Primitive ((Pfloatarray_set_128 {unsafe = true}), 3) + | "%caml_unboxed_float_array_set128" -> + Primitive ((Punboxed_float_array_set_128 {unsafe = false}), 3) + | "%caml_unboxed_float_array_set128u" -> + Primitive ((Punboxed_float_array_set_128 {unsafe = true}), 3) + | "%caml_unboxed_float32_array_set128" -> + Primitive ((Punboxed_float32_array_set_128 {unsafe = false}), 3) + | "%caml_unboxed_float32_array_set128u" -> + Primitive ((Punboxed_float32_array_set_128 {unsafe = true}), 3) + | "%caml_int_array_set128" -> + Primitive ((Pint_array_set_128 {unsafe = false}), 3) + | "%caml_int_array_set128u" -> + Primitive ((Pint_array_set_128 {unsafe = true}), 3) + | "%caml_unboxed_int64_array_set128" -> + Primitive ((Punboxed_int64_array_set_128 {unsafe = false}), 3) + | "%caml_unboxed_int64_array_set128u" -> + Primitive ((Punboxed_int64_array_set_128 {unsafe = true}), 3) + | "%caml_unboxed_int32_array_set128" -> + Primitive ((Punboxed_int32_array_set_128 {unsafe = false}), 3) + | "%caml_unboxed_int32_array_set128u" -> + Primitive ((Punboxed_int32_array_set_128 {unsafe = true}), 3) + | "%caml_unboxed_nativeint_array_set128" -> + Primitive ((Punboxed_nativeint_array_set_128 {unsafe = false}), 3) + | "%caml_unboxed_nativeint_array_set128u" -> + Primitive ((Punboxed_nativeint_array_set_128 {unsafe = true}), 3) | "%bswap16" -> Primitive (Pbswap16, 1) | "%bswap_int32" -> Primitive ((Pbbswap(Pint32, mode)), 1) | "%bswap_int64" -> Primitive ((Pbbswap(Pint64, mode)), 1) | "%bswap_native" -> Primitive ((Pbbswap(Pnativeint, mode)), 1) | "%int_as_pointer" -> Primitive (Pint_as_pointer mode, 1) - | "%opaque" -> Primitive (Popaque Lambda.layout_any_value, 1) + | "%opaque" -> Primitive (Popaque layout, 1) | "%sys_argv" -> Sys_argv - | "%send" -> Send (pos, Lambda.layout_any_value) - | "%sendself" -> Send_self (pos, Lambda.layout_any_value) - | "%sendcache" -> Send_cache (pos, Lambda.layout_any_value) + | "%send" -> Send (pos, layout) + | "%sendself" -> Send_self (pos, layout) + | "%sendcache" -> Send_cache (pos, layout) | "%equal" -> Comparison(Equal, Compare_generic) | "%notequal" -> Comparison(Not_equal, Compare_generic) | "%lessequal" -> Comparison(Less_equal, Compare_generic) @@ -444,30 +781,46 @@ let lookup_primitive loc poly pos p = | "%greaterthan" -> Comparison(Greater_than, Compare_generic) | "%compare" -> Comparison(Compare, Compare_generic) | "%obj_dup" -> Primitive(Pobj_dup, 1) - | "%obj_magic" -> Primitive(Pobj_magic Lambda.layout_any_value, 1) + | "%obj_magic" -> Primitive(Pobj_magic layout, 1) | "%array_to_iarray" -> Primitive (Parray_to_iarray, 1) | "%array_of_iarray" -> Primitive (Parray_of_iarray, 1) - | "%unbox_float" -> Primitive(Punbox_float, 1) - | "%box_float" -> Primitive(Pbox_float mode, 1) + | "%unbox_float" -> Primitive(Punbox_float Pfloat64, 1) + | "%box_float" -> Primitive(Pbox_float (Pfloat64, mode), 1) + | "%unbox_float32" -> Primitive(Punbox_float Pfloat32, 1) + | "%box_float32" -> Primitive(Pbox_float (Pfloat32, mode), 1) | "%get_header" -> Primitive (Pget_header mode, 1) | "%atomic_load" -> Primitive ((Patomic_load {immediate_or_pointer=Pointer}), 1) | "%atomic_exchange" -> Primitive (Patomic_exchange, 2) | "%atomic_cas" -> Primitive (Patomic_cas, 3) | "%atomic_fetch_add" -> Primitive (Patomic_fetch_add, 2) - | "%runstack" -> Primitive (Prunstack, 3) - | "%reperform" -> Primitive (Preperform, 3) - | "%perform" -> Primitive (Pperform, 1) - | "%resume" -> Primitive (Presume, 3) + | "%runstack" -> + if runtime5 then Primitive (Prunstack, 3) else Unsupported Prunstack + | "%reperform" -> + if runtime5 then Primitive (Preperform, 3) else Unsupported Preperform + | "%perform" -> + if runtime5 then Primitive (Pperform, 1) else Unsupported Pperform + | "%resume" -> + if runtime5 then Primitive (Presume, 3) else Unsupported Presume | "%dls_get" -> Primitive (Pdls_get, 1) + | "%unbox_nativeint" -> Primitive(Punbox_int Pnativeint, 1) + | "%box_nativeint" -> Primitive(Pbox_int (Pnativeint, mode), 1) + | "%unbox_int32" -> Primitive(Punbox_int Pint32, 1) + | "%box_int32" -> Primitive(Pbox_int (Pint32, mode), 1) + | "%unbox_int64" -> Primitive(Punbox_int Pint64, 1) + | "%box_int64" -> Primitive(Pbox_int (Pint64, mode), 1) + | "%reinterpret_tagged_int63_as_unboxed_int64" -> + Primitive(Preinterpret_tagged_int63_as_unboxed_int64, 1) + | "%reinterpret_unboxed_int64_as_tagged_int63" -> + Primitive(Preinterpret_unboxed_int64_as_tagged_int63, 1) | s when String.length s > 0 && s.[0] = '%' -> raise(Error(loc, Unknown_builtin_primitive s)) - | _ -> External p + | _ -> External lambda_prim in prim -let lookup_primitive_and_mark_used loc mode pos p env path = - match lookup_primitive loc mode pos p with +let lookup_primitive_and_mark_used loc ~poly_mode ~poly_sort pos p env path = + match lookup_primitive loc ~poly_mode ~poly_sort pos p with | External _ as e -> add_used_primitive loc env path; e | x -> x @@ -480,20 +833,49 @@ let simplify_constant_constructor = function | Greater_than -> false | Compare -> false -(* The following function computes the greatest lower bound in the - semilattice of array kinds: - gen - / \ - addr float - | - int - Note that the GLB is not guaranteed to exist, in which case we return +(* The following function computes the greatest lower bound of array kinds: + + gen unboxed-float unboxed-int32 unboxed-int64 unboxed-nativeint + | + /------\ + | | + addr float + | + int + Note that the GLB is not guaranteed to exist. + In case of array kinds working with layout value, we return our first argument instead of raising a fatal error because, although it cannot happen in a well-typed program, (ab)use of Obj.magic can - probably trigger it. + probably trigger it. For other layouts, we raise an error. *) -let glb_array_type t1 t2 = +let glb_array_type loc t1 t2 = + match t1, t2 with + (* Handle unboxed array kinds which should only match with themselves. + + However, a cheat is added just for [Pgenarray] to allow the [%array_*] + primitives to work with unboxed types. + + WARNING: This trick will stop working when [Config.flat_float_array] + becomes [false].*) + | Pfloatarray, (Punboxedfloatarray _ | Punboxedintarray _) -> + (* Have a nice error message for a case reachable. *) + raise(Error(loc, Invalid_floatarray_glb)) + | (Pgenarray | Punboxedfloatarray Pfloat64), Punboxedfloatarray Pfloat64 -> + Punboxedfloatarray Pfloat64 + | (Pgenarray | Punboxedfloatarray Pfloat32), Punboxedfloatarray Pfloat32 -> + Punboxedfloatarray Pfloat32 + | Punboxedfloatarray _, _ | _, Punboxedfloatarray _ -> + Misc.fatal_error "unexpected array kind in glb" + | (Pgenarray | Punboxedintarray Pint32), Punboxedintarray Pint32 -> + Punboxedintarray Pint32 + | (Pgenarray | Punboxedintarray Pint64), Punboxedintarray Pint64 -> + Punboxedintarray Pint64 + | (Pgenarray | Punboxedintarray Pnativeint), Punboxedintarray Pnativeint -> + Punboxedintarray Pnativeint + | Punboxedintarray _, _ | _, Punboxedintarray _ -> + Misc.fatal_error "unexpected array kind in glb" + (* No GLB; only used in the [Obj.magic] case *) | Pfloatarray, (Paddrarray | Pintarray) | (Paddrarray | Pintarray), Pfloatarray -> t1 @@ -504,8 +886,34 @@ let glb_array_type t1 t2 = | Pintarray, Pintarray -> Pintarray | Pfloatarray, Pfloatarray -> Pfloatarray -let glb_array_ref_type t1 t2 = +let glb_array_ref_type loc t1 t2 = match t1, t2 with + (* Handle unboxed array kinds which should only match with themselves. + + However, a cheat is added just for [Pgenarray_ref] to allow the [%array_*] + primitives to work with unboxed types. + + WARNING: This trick will stop working when [Config.flat_float_array] + becomes [false].*) + | Pfloatarray_ref _, (Punboxedfloatarray _ | Punboxedintarray _) -> + (* Have a nice error message for a case reachable. *) + raise(Error(loc, Invalid_floatarray_glb)) + | (Pgenarray_ref _ | Punboxedfloatarray_ref Pfloat64), Punboxedfloatarray Pfloat64 -> + Punboxedfloatarray_ref Pfloat64 + | (Pgenarray_ref _ | Punboxedfloatarray_ref Pfloat32), Punboxedfloatarray Pfloat32 -> + Punboxedfloatarray_ref Pfloat32 + | Punboxedfloatarray_ref _, _ + | _, Punboxedfloatarray _ -> + Misc.fatal_error "unexpected array kind in glb" + | (Pgenarray_ref _ | Punboxedintarray_ref Pint32), Punboxedintarray Pint32 -> + Punboxedintarray_ref Pint32 + | (Pgenarray_ref _ | Punboxedintarray_ref Pint64), Punboxedintarray Pint64 -> + Punboxedintarray_ref Pint64 + | (Pgenarray_ref _ | Punboxedintarray_ref Pnativeint), Punboxedintarray Pnativeint -> + Punboxedintarray_ref Pnativeint + | Punboxedintarray_ref _, _ | _, Punboxedintarray _ -> + Misc.fatal_error "unexpected array kind in glb" + (* No GLB; only used in the [Obj.magic] case *) | Pfloatarray_ref _, (Paddrarray | Pintarray) | (Paddrarray_ref | Pintarray_ref), Pfloatarray -> t1 @@ -530,8 +938,34 @@ let glb_array_ref_type t1 t2 = (* Pfloatarray is a minimum *) | (Pfloatarray_ref _ as x), Pfloatarray -> x -let glb_array_set_type t1 t2 = +let glb_array_set_type loc t1 t2 = match t1, t2 with + (* Handle unboxed array kinds which can only match with themselves. + + However, a cheat is added just for [Pgenarray_set] to allow the [%array_*] + primitives to work with unboxed types. + + WARNING: This trick will stop working when [Config.flat_float_array] + becomes [false].*) + | Pfloatarray_set, (Punboxedfloatarray _ | Punboxedintarray _) -> + (* Have a nice error message for a case reachable. *) + raise(Error(loc, Invalid_floatarray_glb)) + | (Pgenarray_set _ | Punboxedfloatarray_set Pfloat64), Punboxedfloatarray Pfloat64 -> + Punboxedfloatarray_set Pfloat64 + | (Pgenarray_set _ | Punboxedfloatarray_set Pfloat32), Punboxedfloatarray Pfloat32 -> + Punboxedfloatarray_set Pfloat32 + | Punboxedfloatarray_set _, _ + | _, Punboxedfloatarray _ -> + Misc.fatal_error "unexpected array kind in glb" + | (Pgenarray_set _ | Punboxedintarray_set Pint32), Punboxedintarray Pint32 -> + Punboxedintarray_set Pint32 + | (Pgenarray_set _ | Punboxedintarray_set Pint64), Punboxedintarray Pint64 -> + Punboxedintarray_set Pint64 + | (Pgenarray_set _ | Punboxedintarray_set Pnativeint), Punboxedintarray Pnativeint -> + Punboxedintarray_set Pnativeint + | Punboxedintarray_set _, _ | _, Punboxedintarray _ -> + Misc.fatal_error "unexpected array kind in glb" + (* No GLB; only used in the [Obj.magic] case *) | Pfloatarray_set, (Paddrarray | Pintarray) | (Paddrarray_set _ | Pintarray_set), Pfloatarray -> t1 @@ -581,30 +1015,47 @@ let specialize_primitive env loc ty ~has_constant_constructor prim = | Some (_p1, rhs) -> maybe_pointer_type env rhs in Some (Primitive (Pfield (n, is_int, mut), arity)) | Primitive (Parraylength t, arity), [p] -> begin - let array_type = glb_array_type t (array_type_kind env p) in + let loc = to_location loc in + (* CR layouts: [~elt_sort:None] here is not ideal and should be + fixed. To do that, we will need more checking of primitives + in the front end. *) + let array_type = + glb_array_type loc t (array_type_kind ~elt_sort:None env loc p) + in if t = array_type then None else Some (Primitive (Parraylength array_type, arity)) end - | Primitive (Parrayrefu rt, arity), p1 :: _ -> begin - let array_ref_type = glb_array_ref_type rt (array_type_kind env p1) + | Primitive (Parrayrefu (rt, index_kind), arity), p1 :: _ -> begin + let loc = to_location loc in + let array_ref_type = + glb_array_ref_type loc rt (array_type_kind ~elt_sort:None env loc p1) in if rt = array_ref_type then None - else Some (Primitive (Parrayrefu array_ref_type, arity)) + else Some (Primitive (Parrayrefu (array_ref_type, index_kind), arity)) end - | Primitive (Parraysetu st, arity), p1 :: _ -> begin - let array_set_type = glb_array_set_type st (array_type_kind env p1) in + | Primitive (Parraysetu (st, index_kind), arity), p1 :: _ -> begin + let loc = to_location loc in + let array_set_type = + glb_array_set_type loc st (array_type_kind ~elt_sort:None env loc p1) + in if st = array_set_type then None - else Some (Primitive (Parraysetu array_set_type, arity)) + else Some (Primitive (Parraysetu (array_set_type, index_kind), arity)) end - | Primitive (Parrayrefs rt, arity), p1 :: _ -> begin - let array_ref_type = glb_array_ref_type rt (array_type_kind env p1) in + | Primitive (Parrayrefs (rt, index_kind), arity), p1 :: _ -> begin + let loc = to_location loc in + let array_ref_type = + glb_array_ref_type loc rt (array_type_kind ~elt_sort:None env loc p1) + in if rt = array_ref_type then None - else Some (Primitive (Parrayrefs array_ref_type, arity)) + else Some (Primitive (Parrayrefs (array_ref_type, index_kind), arity)) end - | Primitive (Parraysets st, arity), p1 :: _ -> begin - let array_set_type = glb_array_set_type st (array_type_kind env p1) in + | Primitive (Parraysets (st, index_kind), arity), p1 :: _ -> begin + let loc = to_location loc in + let array_set_type = + glb_array_set_type loc st (array_type_kind ~elt_sort:None env loc p1) + in if st = array_set_type then None - else Some (Primitive (Parraysets array_set_type, arity)) + else Some (Primitive (Parraysets (array_set_type, index_kind), arity)) end | Primitive (Pbigarrayref(unsafe, n, Pbigarray_unknown, Pbigarray_unknown_layout), arity), p1 :: _ -> begin @@ -649,6 +1100,8 @@ let specialize_primitive env loc ty ~has_constant_constructor prim = Some (Comparison(comp, Compare_ints)) end else if is_base_type env p1 Predef.path_float then begin Some (Comparison(comp, Compare_floats)) + end else if is_base_type env p1 Predef.path_float32 then begin + Some (Comparison(comp, Compare_float32s)) end else if is_base_type env p1 Predef.path_string then begin Some (Comparison(comp, Compare_strings)) end else if is_base_type env p1 Predef.path_bytes then begin @@ -665,57 +1118,58 @@ let specialize_primitive env loc ty ~has_constant_constructor prim = | _ -> None let caml_equal = - Primitive.simple_on_values ~name:"caml_equal" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_equal" ~arity:2 ~alloc:true let caml_string_equal = - Primitive.simple_on_values ~name:"caml_string_equal" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_string_equal" ~arity:2 ~alloc:false let caml_bytes_equal = - Primitive.simple_on_values ~name:"caml_bytes_equal" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_bytes_equal" ~arity:2 ~alloc:false let caml_notequal = - Primitive.simple_on_values ~name:"caml_notequal" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_notequal" ~arity:2 ~alloc:true let caml_string_notequal = - Primitive.simple_on_values ~name:"caml_string_notequal" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_string_notequal" ~arity:2 ~alloc:false let caml_bytes_notequal = - Primitive.simple_on_values ~name:"caml_bytes_notequal" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_bytes_notequal" ~arity:2 ~alloc:false let caml_lessequal = - Primitive.simple_on_values ~name:"caml_lessequal" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_lessequal" ~arity:2 ~alloc:true let caml_string_lessequal = - Primitive.simple_on_values ~name:"caml_string_lessequal" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_string_lessequal" ~arity:2 ~alloc:false let caml_bytes_lessequal = - Primitive.simple_on_values ~name:"caml_bytes_lessequal" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_bytes_lessequal" ~arity:2 ~alloc:false let caml_lessthan = - Primitive.simple_on_values ~name:"caml_lessthan" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_lessthan" ~arity:2 ~alloc:true let caml_string_lessthan = - Primitive.simple_on_values ~name:"caml_string_lessthan" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_string_lessthan" ~arity:2 ~alloc:false let caml_bytes_lessthan = - Primitive.simple_on_values ~name:"caml_bytes_lessthan" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_bytes_lessthan" ~arity:2 ~alloc:false let caml_greaterequal = - Primitive.simple_on_values ~name:"caml_greaterequal" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_greaterequal" ~arity:2 ~alloc:true let caml_string_greaterequal = - Primitive.simple_on_values ~name:"caml_string_greaterequal" ~arity:2 + Lambda.simple_prim_on_values ~name:"caml_string_greaterequal" ~arity:2 ~alloc:false let caml_bytes_greaterequal = - Primitive.simple_on_values ~name:"caml_bytes_greaterequal" ~arity:2 + Lambda.simple_prim_on_values ~name:"caml_bytes_greaterequal" ~arity:2 ~alloc:false let caml_greaterthan = - Primitive.simple_on_values ~name:"caml_greaterthan" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_greaterthan" ~arity:2 ~alloc:true let caml_string_greaterthan = - Primitive.simple_on_values ~name:"caml_string_greaterthan" ~arity:2 + Lambda.simple_prim_on_values ~name:"caml_string_greaterthan" ~arity:2 ~alloc:false let caml_bytes_greaterthan = - Primitive.simple_on_values ~name:"caml_bytes_greaterthan" ~arity:2 + Lambda.simple_prim_on_values ~name:"caml_bytes_greaterthan" ~arity:2 ~alloc:false let caml_compare = - Primitive.simple_on_values ~name:"caml_compare" ~arity:2 ~alloc:true + Lambda.simple_prim_on_values ~name:"caml_compare" ~arity:2 ~alloc:true let caml_string_compare = - Primitive.simple_on_values ~name:"caml_string_compare" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_string_compare" ~arity:2 ~alloc:false let caml_bytes_compare = - Primitive.simple_on_values ~name:"caml_bytes_compare" ~arity:2 ~alloc:false + Lambda.simple_prim_on_values ~name:"caml_bytes_compare" ~arity:2 ~alloc:false let comparison_primitive comparison comparison_kind = match comparison, comparison_kind with | Equal, Compare_generic -> Pccall caml_equal | Equal, Compare_ints -> Pintcomp Ceq - | Equal, Compare_floats -> Pfloatcomp CFeq + | Equal, Compare_floats -> Pfloatcomp (Pfloat64, CFeq) + | Equal, Compare_float32s -> Pfloatcomp (Pfloat32, CFeq) | Equal, Compare_strings -> Pccall caml_string_equal | Equal, Compare_bytes -> Pccall caml_bytes_equal | Equal, Compare_nativeints -> Pbintcomp(Pnativeint, Ceq) @@ -723,7 +1177,8 @@ let comparison_primitive comparison comparison_kind = | Equal, Compare_int64s -> Pbintcomp(Pint64, Ceq) | Not_equal, Compare_generic -> Pccall caml_notequal | Not_equal, Compare_ints -> Pintcomp Cne - | Not_equal, Compare_floats -> Pfloatcomp CFneq + | Not_equal, Compare_floats -> Pfloatcomp (Pfloat64, CFneq) + | Not_equal, Compare_float32s -> Pfloatcomp (Pfloat32, CFneq) | Not_equal, Compare_strings -> Pccall caml_string_notequal | Not_equal, Compare_bytes -> Pccall caml_bytes_notequal | Not_equal, Compare_nativeints -> Pbintcomp(Pnativeint, Cne) @@ -731,7 +1186,8 @@ let comparison_primitive comparison comparison_kind = | Not_equal, Compare_int64s -> Pbintcomp(Pint64, Cne) | Less_equal, Compare_generic -> Pccall caml_lessequal | Less_equal, Compare_ints -> Pintcomp Cle - | Less_equal, Compare_floats -> Pfloatcomp CFle + | Less_equal, Compare_floats -> Pfloatcomp (Pfloat64, CFle) + | Less_equal, Compare_float32s -> Pfloatcomp (Pfloat32, CFle) | Less_equal, Compare_strings -> Pccall caml_string_lessequal | Less_equal, Compare_bytes -> Pccall caml_bytes_lessequal | Less_equal, Compare_nativeints -> Pbintcomp(Pnativeint, Cle) @@ -739,7 +1195,8 @@ let comparison_primitive comparison comparison_kind = | Less_equal, Compare_int64s -> Pbintcomp(Pint64, Cle) | Less_than, Compare_generic -> Pccall caml_lessthan | Less_than, Compare_ints -> Pintcomp Clt - | Less_than, Compare_floats -> Pfloatcomp CFlt + | Less_than, Compare_floats -> Pfloatcomp (Pfloat64, CFlt) + | Less_than, Compare_float32s -> Pfloatcomp (Pfloat32, CFlt) | Less_than, Compare_strings -> Pccall caml_string_lessthan | Less_than, Compare_bytes -> Pccall caml_bytes_lessthan | Less_than, Compare_nativeints -> Pbintcomp(Pnativeint, Clt) @@ -747,7 +1204,8 @@ let comparison_primitive comparison comparison_kind = | Less_than, Compare_int64s -> Pbintcomp(Pint64, Clt) | Greater_equal, Compare_generic -> Pccall caml_greaterequal | Greater_equal, Compare_ints -> Pintcomp Cge - | Greater_equal, Compare_floats -> Pfloatcomp CFge + | Greater_equal, Compare_floats -> Pfloatcomp (Pfloat64, CFge) + | Greater_equal, Compare_float32s -> Pfloatcomp (Pfloat32, CFge) | Greater_equal, Compare_strings -> Pccall caml_string_greaterequal | Greater_equal, Compare_bytes -> Pccall caml_bytes_greaterequal | Greater_equal, Compare_nativeints -> Pbintcomp(Pnativeint, Cge) @@ -755,7 +1213,8 @@ let comparison_primitive comparison comparison_kind = | Greater_equal, Compare_int64s -> Pbintcomp(Pint64, Cge) | Greater_than, Compare_generic -> Pccall caml_greaterthan | Greater_than, Compare_ints -> Pintcomp Cgt - | Greater_than, Compare_floats -> Pfloatcomp CFgt + | Greater_than, Compare_floats -> Pfloatcomp (Pfloat64, CFgt) + | Greater_than, Compare_float32s -> Pfloatcomp (Pfloat32, CFgt) | Greater_than, Compare_strings -> Pccall caml_string_greaterthan | Greater_than, Compare_bytes -> Pccall caml_bytes_greaterthan | Greater_than, Compare_nativeints -> Pbintcomp(Pnativeint, Cgt) @@ -763,7 +1222,8 @@ let comparison_primitive comparison comparison_kind = | Greater_than, Compare_int64s -> Pbintcomp(Pint64, Cgt) | Compare, Compare_generic -> Pccall caml_compare | Compare, Compare_ints -> Pcompare_ints - | Compare, Compare_floats -> Pcompare_floats + | Compare, Compare_floats -> Pcompare_floats Pfloat64 + | Compare, Compare_float32s -> Pcompare_floats Pfloat32 | Compare, Compare_strings -> Pccall caml_string_compare | Compare, Compare_bytes -> Pccall caml_bytes_compare | Compare, Compare_nativeints -> Pcompare_bints Pnativeint @@ -810,7 +1270,7 @@ let lambda_of_loc kind sloc = Lconst (Const_immstring scope_name) let caml_restore_raw_backtrace = - Primitive.simple_on_values ~name:"caml_restore_raw_backtrace" ~arity:2 + Lambda.simple_prim_on_values ~name:"caml_restore_raw_backtrace" ~arity:2 ~alloc:false let try_ids = Hashtbl.create 8 @@ -900,6 +1360,21 @@ let lambda_of_prim prim_name prim loc args arg_exps = ap_region_close = pos; ap_mode = alloc_heap; } + | Unsupported prim, _ -> + let exn = + transl_extension_path loc (Lazy.force Env.initial) + Predef.path_invalid_argument + in + let msg = + Format.asprintf "Unsupported primitive %a" Printlambda.primitive prim + in + Lprim ( + Praise Raise_regular, + [Lprim ( + Pmakeblock (0, Immutable, None, alloc_heap), + [exn; Lconst (Const_immstring msg)], + loc)], + loc) | (Raise _ | Raise_with_backtrace | Lazy_force _ | Loc _ | Primitive _ | Sys_argv | Comparison _ | Send _ | Send_self _ | Send_cache _ | Frame_pointers | Identity @@ -909,10 +1384,19 @@ let lambda_of_prim prim_name prim loc args arg_exps = let check_primitive_arity loc p = let mode = match p.prim_native_repr_res with - | Prim_global, _ | Prim_poly, _ -> Some Mode.Locality.global + | Prim_global, _ | Prim_poly, _ -> + (* We assume all primitives are compiled to have the same arity for + different modes and types, so just pick one of the modes in the + [Prim_poly] case. *) + Some Mode.Locality.global | Prim_local, _ -> Some Mode.Locality.local in - let prim = lookup_primitive loc mode Rc_normal p in + (* By a similar assumption, the sort shouldn't change the arity. So it's ok + to lie here. *) + let sort = Some (Jkind.Sort.of_const Value) in + let prim = + lookup_primitive loc ~poly_mode:mode ~poly_sort:sort Rc_normal p + in let ok = match prim with | Primitive (_,arity) -> arity = p.prim_arity @@ -928,15 +1412,16 @@ let check_primitive_arity loc p = | Frame_pointers -> p.prim_arity = 0 | Identity -> p.prim_arity = 1 | Apply _ | Revapply _ -> p.prim_arity = 2 + | Unsupported _ -> true in if not ok then raise(Error(loc, Wrong_arity_builtin_primitive p.prim_name)) (* Eta-expand a primitive *) -let transl_primitive loc p env ty ~poly_mode path = +let transl_primitive loc p env ty ~poly_mode ~poly_sort path = let prim = lookup_primitive_and_mark_used - (to_location loc) poly_mode Rc_normal p env path + (to_location loc) ~poly_mode ~poly_sort Rc_normal p env path in let has_constant_constructor = false in let prim = @@ -948,17 +1433,21 @@ let transl_primitive loc p env ty ~poly_mode path = let rec make_params ty repr_args repr_res = match repr_args, repr_res with | [], (_, res_repr) -> - let res_sort = sort_of_native_repr res_repr in - [], Typeopt.layout env (to_location loc) (Jkind.Sort.of_const res_sort) ty + let res_sort = + Jkind.Sort.of_const (sort_of_native_repr res_repr ~poly_sort) + in + [], Typeopt.layout env (to_location loc) res_sort ty | (((_, arg_repr) as arg) :: repr_args), _ -> match Typeopt.is_function_type env ty with | None -> Misc.fatal_errorf "Primitive %s type does not correspond to arity" (Primitive.byte_name p) | Some (arg_ty, ret_ty) -> - let arg_sort = sort_of_native_repr arg_repr in + let arg_sort = + Jkind.Sort.of_const (sort_of_native_repr arg_repr ~poly_sort) + in let arg_layout = - Typeopt.layout env (to_location loc) (Jkind.Sort.of_const arg_sort) arg_ty + Typeopt.layout env (to_location loc) arg_sort arg_ty in let arg_mode = to_locality arg in let params, return = make_params ret_ty repr_args repr_res in @@ -981,8 +1470,42 @@ let transl_primitive loc p env ty ~poly_mode path = loc in let body = lambda_of_prim p.prim_name prim loc args None in + let alloc_mode = to_locality p.prim_native_repr_res in + let () = + (* CR mshinwell: Write a version of [primitive_may_allocate] that + works on the [prim] type. *) + match body with + | Lprim (prim, _, _) -> + (match Lambda.primitive_may_allocate prim with + | None -> + (* We don't check anything in this case; if the primitive doesn't + allocate, then after [Lambda] it will be translated to a term + not involving any region variables, meaning there would be + no concern about potentially unbound region variables. *) + () + | Some lambda_alloc_mode -> + (* In this case we add a check to ensure the middle end has + the correct information as to whether a region was inserted + at this point. *) + match alloc_mode, lambda_alloc_mode with + | Alloc_heap, Alloc_heap + | Alloc_local, Alloc_local -> () + | Alloc_local, Alloc_heap -> + (* This case is ok: the Lambda-derived information is more + precise. A region will be inserted, likely unused, and + deleted by the middle end. *) + () + | Alloc_heap, Alloc_local -> + Misc.fatal_errorf "Alloc mode incompatibility for:@ %a@ \ + (from to_locality, %a; from primitive_may_allocate, %a)" + Printlambda.lambda body + Printlambda.alloc_mode alloc_mode + Printlambda.alloc_mode lambda_alloc_mode + ) + | _ -> () + in let region = - match to_locality p.prim_native_repr_res with + match alloc_mode with | Alloc_heap -> true | Alloc_local -> false in @@ -1001,51 +1524,77 @@ let transl_primitive loc p env ty ~poly_mode path = ~loc ~body ~mode:alloc_heap + ~ret_mode:(to_locality p.prim_native_repr_res) ~region let lambda_primitive_needs_event_after = function (* We add an event after any primitive resulting in a C call that may raise an exception or allocate. These are places where we may collect the call stack. *) - | Pduprecord _ | Pccall _ | Pfloatofint _ | Pnegfloat _ | Pabsfloat _ - | Paddfloat _ | Psubfloat _ | Pmulfloat _ | Pdivfloat _ | Pstringrefs | Pbytesrefs - | Pbox_float _ | Pbox_int _ + | Pduprecord _ | Pccall _ + | Pfloatofint (_, _) + | Pfloatoffloat32 _ + | Pfloat32offloat _ + | Pnegfloat (_, _) | Pabsfloat (_, _) + | Paddfloat (_, _) | Psubfloat (_, _) + | Pmulfloat (_, _) | Pdivfloat (_, _) + | Pstringrefs | Pbytesrefs | Pbytessets | Pmakearray (Pgenarray, _, _) | Pduparray _ - | Parrayrefu (Pgenarray_ref _ | Pfloatarray_ref _) + | Parrayrefu ((Pgenarray_ref _ | Pfloatarray_ref _), _) | Parrayrefs _ | Parraysets _ | Pbintofint _ | Pcvtbint _ | Pnegbint _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ - | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp _ - | Pcompare_bints _ + | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ + | Pbintcomp _ | Punboxed_int_comp _ | Pcompare_bints _ | Pbigarrayref _ | Pbigarrayset _ | Pbigarraydim _ | Pstring_load_16 _ - | Pstring_load_32 _ | Pstring_load_64 _ | Pstring_load_128 _ | Pbytes_load_16 _ - | Pbytes_load_32 _ | Pbytes_load_64 _ | Pbytes_load_128 _ | Pbytes_set_16 _ - | Pbytes_set_32 _ | Pbytes_set_64 _ | Pbytes_set_128 _ | Pbigstring_load_16 _ - | Pbigstring_load_32 _ | Pbigstring_load_64 _ | Pbigstring_load_128 _ - | Pbigstring_set_16 _ | Pbigstring_set_32 _ | Pbigstring_set_64 _ | Pbigstring_set_128 _ + | Pstring_load_32 _ | Pstring_load_f32 _ | Pstring_load_64 _ | Pstring_load_128 _ + | Pbytes_load_16 _ | Pbytes_load_32 _ | Pbytes_load_f32 _ | Pbytes_load_64 _ + | Pbytes_load_128 _ | Pbytes_set_16 _ | Pbytes_set_32 _ | Pbytes_set_f32 _ + | Pbytes_set_64 _ | Pbytes_set_128 _ | Pbigstring_load_16 _ + | Pbigstring_load_32 _ | Pbigstring_load_f32 _ | Pbigstring_load_64 _ + | Pbigstring_load_128 _ | Pbigstring_set_16 _ | Pbigstring_set_32 _ + | Pbigstring_set_f32 _ | Pbigstring_set_64 _ | Pbigstring_set_128 _ + | Pfloatarray_load_128 _ | Pfloat_array_load_128 _ | Pint_array_load_128 _ + | Punboxed_float_array_load_128 _| Punboxed_float32_array_load_128 _ + | Punboxed_int32_array_load_128 _ | Punboxed_int64_array_load_128 _ + | Punboxed_nativeint_array_load_128 _ + | Pfloatarray_set_128 _ | Pfloat_array_set_128 _ | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _| Punboxed_float32_array_set_128 _ + | Punboxed_int32_array_set_128 _ | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ | Prunstack | Pperform | Preperform | Presume | Pbbswap _ | Pobj_dup | Pget_header _ -> true + (* [Preinterpret_tagged_int63_as_unboxed_int64] has to allocate in + bytecode, because int64# is actually represented as a boxed value. *) + | Preinterpret_tagged_int63_as_unboxed_int64 -> true | Pbytes_to_string | Pbytes_of_string | Parray_to_iarray | Parray_of_iarray | Pignore | Psetglobal _ | Pgetglobal _ | Pgetpredef _ | Pmakeblock _ | Pmakefloatblock _ - | Pmakeufloatblock _ + | Pmakeufloatblock _ | Pmakemixedblock _ | Pmake_unboxed_product _ | Punboxed_product_field _ | Pfield _ | Pfield_computed _ | Psetfield _ | Psetfield_computed _ | Pfloatfield _ | Psetfloatfield _ | Praise _ - | Pufloatfield _ | Psetufloatfield _ + | Pufloatfield _ | Psetufloatfield _ | Pmixedfield _ | Psetmixedfield _ | Psequor | Psequand | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pdivint _ | Pmodint _ | Pandint | Porint | Pxorint | Plslint | Plsrint - | Pasrint | Pintcomp _ | Poffsetint _ | Poffsetref _ | Pintoffloat - | Pcompare_ints | Pcompare_floats - | Pfloatcomp _ | Pstringlength | Pstringrefu | Pbyteslength | Pbytesrefu - | Pbytessetu | Pmakearray ((Pintarray | Paddrarray | Pfloatarray), _, _) + | Pasrint | Pintcomp _ | Poffsetint _ | Poffsetref _ | Pintoffloat _ + | Pcompare_ints | Pcompare_floats _ + | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) + | Pstringlength | Pstringrefu | Pbyteslength | Pbytesrefu + | Pbytessetu + | Pmakearray ((Pintarray | Paddrarray | Pfloatarray | Punboxedfloatarray _ + | Punboxedintarray _), _, _) | Parraylength _ | Parrayrefu _ | Parraysetu _ | Pisint _ | Pisout | Pprobe_is_enabled _ | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Patomic_load _ | Pintofbint _ | Pctconst _ | Pbswap16 | Pint_as_pointer _ | Popaque _ | Pdls_get - | Pobj_magic _ | Punbox_float | Punbox_int _ -> false + | Pobj_magic _ | Punbox_float _ | Punbox_int _ + | Preinterpret_unboxed_int64_as_tagged_int63 + (* These don't allocate in bytecode; they're just identity functions: *) + | Pbox_float (_, _) | Pbox_int _ + -> false (* Determine if a primitive should be surrounded by an "after" debug event *) let primitive_needs_event_after = function @@ -1055,12 +1604,14 @@ let primitive_needs_event_after = function lambda_primitive_needs_event_after (comparison_primitive comp knd) | Lazy_force _ | Send _ | Send_self _ | Send_cache _ | Apply _ | Revapply _ -> true - | Raise _ | Raise_with_backtrace | Loc _ | Frame_pointers | Identity -> false + | Raise _ | Raise_with_backtrace | Loc _ | Frame_pointers | Identity + | Unsupported _ -> false -let transl_primitive_application loc p env ty mode path exp args arg_exps pos = +let transl_primitive_application loc p env ty ~poly_mode ~poly_sort + path exp args arg_exps pos = let prim = lookup_primitive_and_mark_used - (to_location loc) mode pos p env (Some path) + (to_location loc) ~poly_mode ~poly_sort pos p env (Some path) in let has_constant_constructor = match arg_exps with @@ -1096,7 +1647,10 @@ let report_error ppf = function fprintf ppf "Unknown builtin primitive \"%s\"" prim_name | Wrong_arity_builtin_primitive prim_name -> fprintf ppf "Wrong arity for builtin primitive \"%s\"" prim_name - + | Invalid_floatarray_glb -> + fprintf ppf + "@[Floatarray primitives can't be used on arrays containing@ \ + unboxed types.@]" let () = Location.register_error_of_exn (function diff --git a/lambda/translprim.mli b/lambda/translprim.mli index 33d7597d11f..e4b3c5a81f7 100644 --- a/lambda/translprim.mli +++ b/lambda/translprim.mli @@ -35,22 +35,35 @@ val check_primitive_arity : val transl_primitive : Lambda.scoped_location -> Primitive.description -> Env.t -> Types.type_expr -> - poly_mode:Mode.Locality.t option -> + poly_mode:Mode.Locality.l option -> + poly_sort:Jkind.Sort.t option -> Path.t option -> Lambda.lambda val transl_primitive_application : Lambda.scoped_location -> Primitive.description -> Env.t -> - Types.type_expr -> Mode.Locality.t option -> Path.t -> + Types.type_expr -> + poly_mode:Mode.Locality.l option -> + poly_sort:Jkind.Sort.t option -> Path.t -> Typedtree.expression option -> Lambda.lambda list -> Typedtree.expression list -> Lambda.region_close -> Lambda.lambda +(** [sort_of_native_repr] returns the sort expected after typechecking (which + may be different than the sort used in the external interface). + + [poly_sort] must be [Some sort] when [Repr_poly] is given. It will produce + fatal error if it's [None]. *) +val sort_of_native_repr : + poly_sort:Jkind.Sort.t option -> + Primitive.native_repr -> Jkind.Sort.const + (* Errors *) type error = | Unknown_builtin_primitive of string | Wrong_arity_builtin_primitive of string + | Invalid_floatarray_glb exception Error of Location.t * error diff --git a/lambda/value_rec_compiler.ml b/lambda/value_rec_compiler.ml new file mode 100644 index 00000000000..e955fd84de2 --- /dev/null +++ b/lambda/value_rec_compiler.ml @@ -0,0 +1,936 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Vincent Laviron, OCamlPro *) +(* *) +(* Copyright 2023 OCamlPro SAS *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(** Compilation of generic recursive definitions *) + +(** The surface language allows a wide range of recursive definitions, but + Lambda only allows syntactic functions in recursive bindings. + This file implements the translation from generic definitions to Lambda. + + The first step occurs during typechecking, in [Value_rec_check]: + [Dynamic] bindings need to be compiled as normal let bindings. This file + mostly deals with the [Static] bindings. + + The three phases in this module are the following: + + - Sizing: we first classify the definitions by their size, which determines + the compilation strategy for each binding. + + - Function lifting: we then apply a transformation from general function + definitions to syntactic functions accepted by [Lletrec]. + Examples: + {[ + let rec f x = f x (* Syntactic *) + let rec f = fun x -> f x (* Syntactic *) + let rec f = let g x = f x in g (* Not syntactic *) + let rec f = let a = ... in (fun x -> f x) (* Not syntactic *) + ]} + + - Compilation: we finally combine all of this to produce a Lambda term + for the recursive bindings. +*) + +open Lambda + +(** {1. Sizing} *) + +(* Simple blocks *) +type block_size = + | Regular_block of int + | Float_record of int + (* CR vlaviron: I think we should compute sizes from the shape, + not from the arguments. + The previous dissect-letrec code used arguments though, copying that for now. *) + | Mixed_record of int * Lambda.mixed_block_shape + +type size = + | Unreachable + (** Non-returning expressions, like [raise exn]. + In [Value_rec_check], they would be classified as [Dynamic], + but some of those appear during translation to Lambda. + For example, in [let rec f = let [| x |] = ... in fun y -> x + y] + the inner let binding gets translated to code that raises + [Match_failure] for non-matching branches. + Tracking [Unreachable] explicitly allows us to recover the size + of the only non-raising branch. *) + | Constant + (** Constant values. + Can be either an integer-like constant ([0], ['a'], [None], + the empty list or the unit constructor), or a structured constant + (["hello"], [Some 1], ...). + + Integer constants cannot be pre-allocated, so need their own + classification and compilation scheme (See {!Compilation} below). + Structured constants could fit into the [Block] category, but we + choose to reuse the [constant] classification to avoid sorting + through the [Lconst] definitions. + It also generates slightly better code. *) + | Function of Lambda.lfunction + (** Function definitions. + This includes more than just obvious, syntactic function definitions; + see {!Function Lifting} for details. + Note that to be able to eta-expand variables bound to functions, + we need a bunch of metadata such as the arity so we store the actual + definition to be sure we can recover all we need. *) + | Block of block_size + (** Allocated values of a fixed size. + This corresponds to expressions ending in a single obvious allocation, + but also some more complex expressions where the block is bound to + an intermediate variable before being returned. + *) + +type binding_size = (lambda_with_env, size) Lazy_backtrack.t +and lambda_with_env = { + lambda : lambda; + env : binding_size Ident.Map.t; +} + +let dynamic_size lam = + Misc.fatal_errorf "letrec: No size found for Static binding:@ %a" + Printlambda.lambda lam + +(* [join_sizes] is used to compute the size of an expression with multiple + branches. Such expressions are normally classified as [Dynamic] by + [Value_rec_check], so the default behaviour is a compile-time failure. + However, for partial pattern-matching (typically in let bindings) + the compiler will later add a branch for the failing cases, and this + is handled here with the [Unreachable] case. + Note that the current compilation scheme would work if we allowed the + [Constant] and [Block] cases to be joined, but [Function] needs to be + a single function. *) +let join_sizes lam size1 size2 = + match size1, size2 with + | Unreachable, size | size, Unreachable -> size + | _, _ -> dynamic_size lam + +let compute_static_size lam = + let rec compute_expression_size env lam = + match lam with + | Lvar v -> + begin match Ident.Map.find_opt v env with + | None -> + dynamic_size lam + | Some binding_size -> + Lazy_backtrack.force + (fun { lambda; env } -> compute_expression_size env lambda) + binding_size + end + | Lmutvar _ -> dynamic_size lam + | Lconst _ -> Constant + | Lapply _ -> dynamic_size lam + | Lfunction lfun -> Function lfun + | Llet (_, _, id, def, body) -> + let env = + Ident.Map.add id (Lazy_backtrack.create { lambda = def; env }) env + in + compute_expression_size env body + | Lmutlet(_, _, _, body) -> + compute_expression_size env body + | Lletrec (bindings, body) -> + let env = + List.fold_left (fun env_acc { id; def } -> + Ident.Map.add id (Lazy_backtrack.create_forced (Function def)) env_acc) + env bindings + in + compute_expression_size env body + | Lprim (p, args, _) -> + size_of_primitive env p args + | Lswitch (_, sw, _, _) -> + let fail_case = + match sw.sw_failaction with + | None -> [] + | Some fail -> [0 (* ignored *), fail] + in + compute_and_join_sizes_switch env [sw.sw_consts; sw.sw_blocks; fail_case] + | Lstringswitch (_, cases, fail, _, _) -> + let fail_case = + match fail with + | None -> [] + | Some fail -> ["" (* ignored *), fail] + in + compute_and_join_sizes_switch env [cases; fail_case] + | Lstaticraise _ -> Unreachable + | Lstaticcatch (body, _, handler, _, _) + | Ltrywith (body, _, handler, _) -> + compute_and_join_sizes env [body; handler] + | Lifthenelse (_cond, ifso, ifnot, _) -> + compute_and_join_sizes env [ifso; ifnot] + | Lsequence (_, e) -> + compute_expression_size env e + | Lwhile _ + | Lfor _ + | Lassign _ -> Constant + | Lsend _ -> dynamic_size lam + | Levent (e, _) -> + compute_expression_size env e + | Lifused _ -> Constant + | Lregion (e, _) -> + compute_expression_size env e + | Lexclave _ -> + (* Lexclave should only occur in tail position of a function. + Since we only compute sizes for let-bound definitions, we should never + reach this case. + This justifies using [assert false] instead of [dynamic_size lam], + the latter meaning that [Value_rec_check] should have forbidden that case. + *) + assert false + and compute_and_join_sizes env branches = + List.fold_left (fun size branch -> + join_sizes branch size (compute_expression_size env branch)) + Unreachable branches + and compute_and_join_sizes_switch : + type a. binding_size Ident.Map.t -> (a * lambda) list list -> size = + fun env all_cases -> + List.fold_left (fun size cases -> + List.fold_left (fun size (_key, action) -> + join_sizes action size (compute_expression_size env action)) + size cases) + Unreachable all_cases + and size_of_primitive env p args = + match p with + | Pignore + | Psetfield _ + | Psetfield_computed _ + | Psetfloatfield _ + | Psetmixedfield _ + | Poffsetint _ + | Poffsetref _ + | Pbytessetu + | Pbytessets + | Parraysetu _ + | Parraysets _ + | Pbigarrayset _ + | Pbytes_set_16 _ + | Pbytes_set_32 _ + | Pbytes_set_f32 _ + | Pbytes_set_64 _ + | Pbigstring_set_16 _ + | Pbigstring_set_32 _ + | Pbigstring_set_f32 _ + | Pbigstring_set_64 _ -> + (* Unit-returning primitives. Most of these are only generated from + external declarations and not special-cased by [Value_rec_check], + but it doesn't hurt to be consistent. *) + Constant + + | Pduprecord (repres, size) -> + begin match repres with + | Record_boxed _ + | Record_inlined (_, Constructor_uniform_value, + (Variant_boxed _ | Variant_extensible)) -> + Block (Regular_block size) + | Record_float -> + Block (Float_record size) + | Record_inlined (_, Constructor_mixed shape, + (Variant_boxed _ | Variant_extensible)) + | Record_mixed shape -> + Block (Mixed_record (size, Lambda.transl_mixed_product_shape shape)) + | Record_unboxed | Record_ufloat | Record_inlined (_, _, Variant_unboxed) -> + Misc.fatal_error "size_of_primitive" + end + | Pmakeblock _ -> + (* The block shape is unfortunately an option, so we rely on the + number of arguments instead. + Note that flat float arrays/records use Pmakearray, so we don't need + to check the tag here. *) + Block (Regular_block (List.length args)) + | Pmakemixedblock (_, _, shape, _) -> + Block (Mixed_record (List.length args, shape)) + | Pmakearray (kind, _, _) -> + let size = List.length args in + begin match kind with + | Pgenarray | Paddrarray | Pintarray -> + Block (Regular_block size) + | Pfloatarray -> + Block (Float_record size) + | Punboxedfloatarray _ | Punboxedintarray _ -> + Misc.fatal_error "size_of_primitive" + end + | Pduparray _ -> + (* The size has to be recovered from the size of the argument *) + begin match args with + | [arg] -> + compute_expression_size env arg + | [] | _ :: _ :: _ -> + Misc.fatal_error "size_of_primitive" + end + + | Praise _ -> + Unreachable + + | Pctconst _ -> + (* These primitives are not special-cased by [Value_rec_check], + so we should never end up here; but these are constants anyway. *) + Constant + + | Pbytes_to_string + | Pbytes_of_string + | Pgetglobal _ + | Psetglobal _ + | Pfield _ + | Pfield_computed _ + | Pfloatfield _ + | Pmixedfield _ + | Prunstack + | Pperform + | Presume + | Preperform + | Pccall _ + | Psequand | Psequor | Pnot + | Pnegint | Paddint | Psubint | Pmulint + | Pdivint _ | Pmodint _ + | Pandint | Porint | Pxorint + | Plslint | Plsrint | Pasrint + | Pintcomp _ + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ + | Pintoffloat _ | Pfloatofint _ + | Pnegfloat _ | Pabsfloat _ + | Paddfloat _ | Psubfloat _ | Pmulfloat _ | Pdivfloat _ + | Pfloatcomp _ + | Pstringlength | Pstringrefu | Pstringrefs + | Pbyteslength | Pbytesrefu | Pbytesrefs + | Parraylength _ + | Parrayrefu _ + | Parrayrefs _ + | Pisint _ + | Pisout + | Pbintofint _ + | Pintofbint _ + | Pcvtbint _ + | Pnegbint _ + | Paddbint _ + | Psubbint _ + | Pmulbint _ + | Pdivbint _ + | Pmodbint _ + | Pandbint _ + | Porbint _ + | Pxorbint _ + | Plslbint _ + | Plsrbint _ + | Pasrbint _ + | Pbintcomp _ + | Pbigarrayref _ + | Pbigarraydim _ + | Pstring_load_16 _ + | Pstring_load_32 _ + | Pstring_load_f32 _ + | Pstring_load_64 _ + | Pbytes_load_16 _ + | Pbytes_load_32 _ + | Pbytes_load_f32 _ + | Pbytes_load_64 _ + | Pbigstring_load_16 _ + | Pbigstring_load_32 _ + | Pbigstring_load_f32 _ + | Pbigstring_load_64 _ + | Pbswap16 + | Pbbswap _ + | Pint_as_pointer _ + | Patomic_load _ + | Patomic_exchange + | Patomic_cas + | Patomic_fetch_add + | Popaque _ + | Pdls_get -> + dynamic_size lam + + (* Primitives specific to flambda-backend *) + | Pmakefloatblock (_, _) -> + let size = List.length args in + Block (Float_record size) + + | Psetufloatfield (_, _) + | Pbytes_set_128 _ + | Pbigstring_set_128 _ + | Pfloatarray_set_128 _ + | Pfloat_array_set_128 _ + | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _ + | Punboxed_float32_array_set_128 _ + | Punboxed_int32_array_set_128 _ + | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ -> + Constant + + | Pmakeufloatblock (_, _) + | Pmake_unboxed_product _ -> + dynamic_size lam (* Not allowed *) + + | Pobj_dup + | Parray_to_iarray + | Parray_of_iarray + | Pgetpredef _ + | Pufloatfield (_, _) + | Punboxed_product_field (_, _) + | Punboxed_float_comp (_, _) + | Punboxed_int_comp (_, _) + | Pstring_load_128 _ + | Pbytes_load_128 _ + | Pbigstring_load_128 _ + | Pfloatarray_load_128 _ + | Pfloat_array_load_128 _ + | Pint_array_load_128 _ + | Punboxed_float_array_load_128 _ + | Punboxed_float32_array_load_128 _ + | Punboxed_int32_array_load_128 _ + | Punboxed_int64_array_load_128 _ + | Punboxed_nativeint_array_load_128 _ + | Pprobe_is_enabled _ + | Pobj_magic _ + | Punbox_float _ + | Pbox_float (_, _) + | Punbox_int _ + | Pbox_int (_, _) + | Pfloatoffloat32 _ + | Pfloat32offloat _ + | Pget_header _ + | Preinterpret_tagged_int63_as_unboxed_int64 + | Preinterpret_unboxed_int64_as_tagged_int63 -> + dynamic_size lam + in + compute_expression_size Ident.Map.empty lam + +let lfunction_with_body { kind; params; return; body = _; attr; loc; + mode; ret_mode; region } body = + lfunction' ~kind ~params ~return ~body ~attr ~loc ~mode ~ret_mode ~region + +(** {1. Function Lifting} *) + +(* The compiler allows recursive definitions of functions that are not + syntactic functions: + {[ + let rec f_syntactic_function = fun x -> + f_syntactic_function x + + let rec g_needs_lift = + let () = ... in + (fun x -> g_needs_lift (foo x)) + + let rec h_needs_lift_and_closure = + let v = ref 0 in + (fun x -> incr v; h_needs_lift_and_closure (bar x)) + + let rec i_needs_lift_and_eta = + let aux x = i_needs_lift_and_eta (baz x) in + aux + ]} + + We need to translate those using only syntactic functions or blocks. + For some functions, we only need to lift a syntactic function in tail + position from its surrounding context: + {[ + let rec g_context = + let () = ... in + () + and g_lifted = fun x -> + g_lifted (foo x) + ]} + + In general the function may refer to local variables, so we perform + a local closure conversion before lifting: + {[ + let rec h_context = + let v = ref 0 in + { v } + and h_lifted = fun x -> + incr h_context.v; + h_lifted (bar x) + ]} + Note that the closure environment computed from the context is passed as a + mutually recursive definition, that is, a free variable, and not as an + additional function parameter (which is customary for closure conversion). + + Finally, when the tail expression is a variable, we perform an eta-expansion + to get a syntactic function, that we can then close and lift: + {[ + let rec i_context = + let aux x = i_lifted (baz x) in + { aux } + and i_lifted = fun x -> i_context.aux x + ]} +*) + +type lifted_function = + { lfun : Lambda.lfunction; + free_vars_block_size : int; + } + +type 'a split_result = + | Unreachable + | Reachable of lifted_function * 'a + +let ( let+ ) res f = + match res with + | Unreachable -> Unreachable + | Reachable (func, lam) -> Reachable (func, f lam) + +(* The closure blocks are immutable. + (Note: It is usually safe to declare immutable blocks as mutable, + but in this case the blocks might be empty and declaring them as Mutable + would cause errors later.) *) +let lifted_block_mut : Lambda.mutable_flag = Immutable +let lifted_block_read_sem : Lambda.field_read_semantics = Reads_agree + +let no_loc = Debuginfo.Scoped_location.Loc_unknown + +let rec split_static_function lfun block_var local_idents lam : + Lambda.lambda split_result = + match lam with + | Lvar v -> + (* Eta-expand *) + let params = + List.map (fun (p : Lambda.lparam) -> + { p with name = Ident.rename p.name }) + lfun.params + in + let ap_func = + Lprim (Pfield (0, Pointer, lifted_block_read_sem), [Lvar block_var], no_loc) + in + let body = + Lapply { + ap_func; + ap_args = List.map (fun p -> Lvar (p.name)) params; + ap_loc = no_loc; + ap_tailcall = Default_tailcall; + ap_inlined = Default_inlined; + ap_specialised = Default_specialise; + ap_result_layout = lfun.return; + ap_region_close = Rc_normal; + ap_mode = lfun.ret_mode; + ap_probe = None; + } + in + let wrapper = + lfunction' + ~kind:lfun.kind + ~params + ~return:lfun.return + ~body + ~attr:default_stub_attribute + ~loc:no_loc + ~mode:lfun.mode + ~ret_mode:lfun.ret_mode + ~region:lfun.region + in + let lifted = { lfun = wrapper; free_vars_block_size = 1 } in + Reachable (lifted, + Lprim (Pmakeblock (0, lifted_block_mut, None, Lambda.alloc_heap), + [Lvar v], no_loc)) + | Lfunction lfun -> + let free_vars = Lambda.free_variables lfun.body in + let local_free_vars = Ident.Set.inter free_vars local_idents in + let free_vars_block_size, subst, block_fields_rev = + Ident.Set.fold (fun var (i, subst, fields) -> + let access = + Lprim (Pfield (i, Pointer, lifted_block_read_sem), + [Lvar block_var], + no_loc) + in + (succ i, Ident.Map.add var access subst, Lvar var :: fields)) + local_free_vars (0, Ident.Map.empty, []) + in + (* Note: When there are no local free variables, we don't need the + substitution and we don't need to generate code for pre-allocating + and backpatching a block of size 0. + However, the general scheme also works and it's unlikely to be + noticeably worse, so we use it for simplicity. *) + let new_fun = + lfunction_with_body lfun + (Lambda.subst (fun _ _ env -> env) subst lfun.body) + in + let lifted = { lfun = new_fun; free_vars_block_size } in + let block = + Lprim (Pmakeblock (0, lifted_block_mut, None, Lambda.alloc_heap), + List.rev block_fields_rev, + no_loc) + in + Reachable (lifted, block) + | Llet (lkind, vkind, var, def, body) -> + let+ body = + split_static_function lfun block_var (Ident.Set.add var local_idents) body + in + Llet (lkind, vkind, var, def, body) + | Lmutlet (vkind, var, def, body) -> + let+ body = + split_static_function lfun block_var (Ident.Set.add var local_idents) body + in + Lmutlet (vkind, var, def, body) + | Lletrec (bindings, body) -> + let local_idents = + List.fold_left (fun ids { id } -> Ident.Set.add id ids) + local_idents bindings + in + let+ body = + split_static_function lfun block_var local_idents body + in + Lletrec (bindings, body) + | Lprim (Praise _, _, _) -> Unreachable + | Lstaticraise _ -> Unreachable + | Lswitch (arg, sw, loc, layout) -> + let sw_consts_res = rebuild_arms lfun block_var local_idents sw.sw_consts in + let sw_blocks_res = rebuild_arms lfun block_var local_idents sw.sw_blocks in + let sw_failaction_res = + Option.map (split_static_function lfun block_var local_idents) sw.sw_failaction + in + begin match sw_consts_res, sw_blocks_res, sw_failaction_res with + | Unreachable, Unreachable, (None | Some Unreachable) -> Unreachable + | Reachable (lfun, sw_consts), Unreachable, (None | Some Unreachable) -> + Reachable (lfun, Lswitch (arg, { sw with sw_consts }, loc, layout)) + | Unreachable, Reachable (lfun, sw_blocks), (None | Some Unreachable) -> + Reachable (lfun, Lswitch (arg, { sw with sw_blocks }, loc, layout)) + | Unreachable, Unreachable, Some (Reachable (lfun, failaction)) -> + let switch = + Lswitch (arg, { sw with sw_failaction = Some failaction }, loc, layout) + in + Reachable (lfun, switch) + | Reachable _, Reachable _, _ | Reachable _, _, Some (Reachable _) + | _, Reachable _, Some (Reachable _) -> + Misc.fatal_errorf "letrec: multiple functions:@ lfun=%a@ lam=%a" + Printlambda.lfunction lfun + Printlambda.lambda lam + end + | Lstringswitch (arg, arms, failaction, loc, layout) -> + let arms_res = rebuild_arms lfun block_var local_idents arms in + let failaction_res = + Option.map (split_static_function lfun block_var local_idents) failaction + in + begin match arms_res, failaction_res with + | Unreachable, (None | Some Unreachable) -> Unreachable + | Reachable (lfun, arms), (None | Some Unreachable) -> + Reachable (lfun, Lstringswitch (arg, arms, failaction, loc, layout)) + | Unreachable, Some (Reachable (lfun, failaction)) -> + Reachable (lfun, Lstringswitch (arg, arms, Some failaction, loc, layout)) + | Reachable _, Some (Reachable _) -> + Misc.fatal_errorf "letrec: multiple functions:@ lfun=%a@ lam=%a" + Printlambda.lfunction lfun + Printlambda.lambda lam + end + | Lstaticcatch (body, (nfail, params), handler, r, layout) -> + let body_res = split_static_function lfun block_var local_idents body in + let handler_res = + let local_idents = + List.fold_left (fun vars (var, _) -> Ident.Set.add var vars) + local_idents params + in + split_static_function lfun block_var local_idents handler + in + begin match body_res, handler_res with + | Unreachable, Unreachable -> Unreachable + | Reachable (lfun, body), Unreachable -> + Reachable (lfun, Lstaticcatch (body, (nfail, params), handler, r, layout)) + | Unreachable, Reachable (lfun, handler) -> + Reachable (lfun, Lstaticcatch (body, (nfail, params), handler, r, layout)) + | Reachable _, Reachable _ -> + Misc.fatal_errorf "letrec: multiple functions:@ lfun=%a@ lam=%a" + Printlambda.lfunction lfun + Printlambda.lambda lam + end + | Ltrywith (body, exn_var, handler, layout) -> + let body_res = split_static_function lfun block_var local_idents body in + let handler_res = + split_static_function lfun block_var + (Ident.Set.add exn_var local_idents) handler + in + begin match body_res, handler_res with + | Unreachable, Unreachable -> Unreachable + | Reachable (lfun, body), Unreachable -> + Reachable (lfun, Ltrywith (body, exn_var, handler, layout)) + | Unreachable, Reachable (lfun, handler) -> + Reachable (lfun, Ltrywith (body, exn_var, handler, layout)) + | Reachable _, Reachable _ -> + Misc.fatal_errorf "letrec: multiple functions:@ lfun=%a@ lam=%a" + Printlambda.lfunction lfun + Printlambda.lambda lam + end + | Lifthenelse (cond, ifso, ifnot, layout) -> + let ifso_res = split_static_function lfun block_var local_idents ifso in + let ifnot_res = split_static_function lfun block_var local_idents ifnot in + begin match ifso_res, ifnot_res with + | Unreachable, Unreachable -> Unreachable + | Reachable (lfun, ifso), Unreachable -> + Reachable (lfun, Lifthenelse (cond, ifso, ifnot, layout)) + | Unreachable, Reachable (lfun, ifnot) -> + Reachable (lfun, Lifthenelse (cond, ifso, ifnot, layout)) + | Reachable _, Reachable _ -> + Misc.fatal_errorf "letrec: multiple functions:@ lfun=%a@ lam=%a" + Printlambda.lfunction lfun + Printlambda.lambda lam + end + | Lsequence (e1, e2) -> + let+ e2 = split_static_function lfun block_var local_idents e2 in + Lsequence (e1, e2) + | Levent (lam, lev) -> + let+ lam = split_static_function lfun block_var local_idents lam in + Levent (lam, lev) + | Lregion (lam, layout_fun) -> + (* The type-checker forbids recursive values from being allocated on the + stack, so this region is only here to collect temporary allocations. + In particular the function itself does not capture any stack-allocated + variables, so we can lift it out of the region. *) + let+ lam = split_static_function lfun block_var local_idents lam in + (* The new expression returns the closure block instead of the function *) + ignore layout_fun; + Lregion (lam, layout_block) + | Lmutvar _ + | Lconst _ + | Lapply _ + | Lprim _ + | Lwhile _ + | Lfor _ + | Lassign _ + | Lsend _ + | Lifused _ + | Lexclave _ -> + Misc.fatal_errorf + "letrec binding is not a static function:@ lfun=%a@ lam=%a" + Printlambda.lfunction lfun + Printlambda.lambda lam +and rebuild_arms : + type a. _ -> _ -> _ -> (a * Lambda.lambda) list -> + (a * Lambda.lambda) list split_result = + fun lfun block_var local_idents arms -> + match arms with + | [] -> Unreachable + | (i, lam) :: arms -> + let res = rebuild_arms lfun block_var local_idents arms in + let lam_res = split_static_function lfun block_var local_idents lam in + match lam_res, res with + | Unreachable, Unreachable -> Unreachable + | Reachable (lfun, lam), Unreachable -> + Reachable (lfun, (i, lam) :: arms) + | Unreachable, Reachable (lfun, arms) -> + Reachable (lfun, (i, lam) :: arms) + | Reachable _, Reachable _ -> + Misc.fatal_errorf "letrec: multiple functions:@ lfun=%a@ lam=%a" + Printlambda.lfunction lfun + Printlambda.lambda lam + +(** {1. Compilation} *) + +(** The bindings are split into three categories. + Static bindings are the ones that we can pre-allocate and backpatch later. + Function bindings are syntactic functions. + Dynamic bindings are non-recursive expressions. + + The evaluation order is as follows: + - Evaluate all dynamic bindings + - Pre-allocate all static bindings + - Define all functions + - Backpatch all static bindings + + Constants (and unreachable expressions) end up in the dynamic category, + because we substitute all occurrences of recursive variables in their + definition by a dummy expression, making them non-recursive. + + This is correct because: + - [Value_rec_check] ensured that they never dereference the value of + those recursive variables + - their final value cannot depend on them either. + + Functions that are not already in syntactic form also generate an additional + binding for the context. This binding fits into the static category. + + Example input: + {[ + let rec a x = + (* syntactic function *) + b x + and b = + (* non-syntactic function *) + let tbl = Hashtbl.make 17 in + fun x -> ... (tbl, c, a) ... + and c = + (* block *) + Some (d, default) + and d = + (* 'dynamic' value (not recursive *) + Array.make 5 0 + and default = + (* constant, with (spurious) use + of a recursive neighbor *) + let _ = a in + 42 + ]} + + Example output: + {[ + (* Dynamic bindings *) + let d = Array.make 5 0 + let default = + let _ = *dummy_rec_value* in + 42 + + (* Pre-allocations *) + let c = caml_alloc_dummy 2 + let b_context = caml_alloc_dummy 1 + + (* Functions *) + let rec a x = b x + and b = + fun x -> ... (b_context.tbl, c, a) ... + + (* Backpatching *) + let () = + caml_update_dummy c (Some (d, default)); + caml_update_dummy b_context + (let tbl = Hashtbl.make 17 in + { tbl }) + ]} + + Note on performance for non-syntactic functions: + The compiler would previously pre-allocate and backpatch function + closures. The new approach is designed to avoid back-patching + closures -- besides, we could not pre-allocate at this point in the + compiler pipeline, as the closure size will only be determined later. + + For non-syntactic functions with local free variables, we now store the + local free variables in a block, which incurs an additional indirection + whenever a local variable is accessed by the function. On the other hand, + we generate regular function definitions, so the rest of the compiler + can either inline them or generate direct calls, and use the compact + representation for mutually recursive closures. + *) + +type rec_bindings = + { static : (Ident.t * block_size * Lambda.lambda) list; + functions : (Ident.t * Lambda.lfunction) list; + dynamic : (Ident.t * Lambda.lambda) list; + } + +let empty_bindings = + { static = []; + functions = []; + dynamic = []; + } + +(** Allocation and backpatching primitives *) + +let alloc_prim = + Lambda.simple_prim_on_values ~name:"caml_alloc_dummy" ~arity:1 ~alloc:true + +let alloc_float_record_prim = + Lambda.simple_prim_on_values ~name:"caml_alloc_dummy_float" ~arity:1 ~alloc:true + +let alloc_mixed_record_prim = + Lambda.simple_prim_on_values ~name:"caml_alloc_dummy_mixed" ~arity:2 ~alloc:true + +let update_prim = + (* Note: [alloc] could be false, but it probably doesn't matter *) + Lambda.simple_prim_on_values ~name:"caml_update_dummy" ~arity:2 ~alloc:true + +(** Compilation function *) + +let compile_letrec input_bindings body = + if !Clflags.dump_letreclambda then ( + Format.eprintf "Value_rec_compiler input bindings:\n"; + List.iter (fun (id, _, def) -> + Format.eprintf " %a = %a\n%!" Ident.print id Printlambda.lambda def) + input_bindings; + Format.eprintf "Value_rec_compiler body:@ %a\n%!" Printlambda.lambda body + ); + let subst_for_constants = + List.fold_left (fun subst (id, _, _) -> + Ident.Map.add id Lambda.dummy_constant subst) + Ident.Map.empty input_bindings + in + let all_bindings_rev = + List.fold_left (fun rev_bindings (id, rkind, def) -> + match (rkind : Value_rec_types.recursive_binding_kind) with + | Dynamic -> + { rev_bindings with dynamic = (id, def) :: rev_bindings.dynamic } + | Static -> + let size = compute_static_size def in + begin match size with + | Constant | Unreachable -> + (* The result never escapes any recursive variables, so as we know + it doesn't inspect them either we can just bind the recursive + variables to dummy values and evaluate the definition normally. + *) + let def = + Lambda.subst (fun _ _ env -> env) subst_for_constants def + in + { rev_bindings with dynamic = (id, def) :: rev_bindings.dynamic } + | Block size -> + { rev_bindings with + static = (id, size, def) :: rev_bindings.static } + | Function lfun -> + begin match def with + | Lfunction lfun -> + { rev_bindings with + functions = (id, lfun) :: rev_bindings.functions + } + | _ -> + let ctx_id = Ident.create_local "letrec_function_context" in + begin match + split_static_function lfun ctx_id Ident.Set.empty def + with + | Unreachable -> + Misc.fatal_errorf + "letrec: no function for binding:@ def=%a@ lfun=%a" + Printlambda.lambda def Printlambda.lfunction lfun + | Reachable ({ lfun; free_vars_block_size }, lam) -> + let functions = (id, lfun) :: rev_bindings.functions in + let static = + (ctx_id, Regular_block free_vars_block_size, lam) :: + rev_bindings.static + in + { rev_bindings with functions; static } + end + end + end) + empty_bindings input_bindings + in + let body_with_patches = + List.fold_left (fun body (id, _size, lam) -> + let update = + Lprim (Pccall update_prim, [Lvar id; lam], no_loc) + in + Lsequence (update, body)) + body (all_bindings_rev.static) + in + let body_with_functions = + match all_bindings_rev.functions with + | [] -> body_with_patches + | bindings_rev -> + let function_bindings = + List.rev_map (fun (id, lfun) -> + { id; def = lfun }) + bindings_rev + in + Lletrec (function_bindings, body_with_patches) + in + let body_with_dynamic_values = + List.fold_left (fun body (id, lam) -> + Llet(Strict, Lambda.layout_letrec, id, lam, body)) + body_with_functions all_bindings_rev.dynamic + in + let body_with_pre_allocations = + List.fold_left (fun body (id, size, _lam) -> + let alloc_prim, const_args = + match size with + | Regular_block size -> alloc_prim, [size] + | Float_record size -> alloc_float_record_prim, [size] + | Mixed_record (size, shape) -> + alloc_mixed_record_prim, [size; shape.value_prefix_len] + in + let alloc = + Lprim (Pccall alloc_prim, + List.map (fun n -> Lconst (Lambda.const_int n)) const_args, + no_loc) + in + Llet(Strict, Lambda.layout_letrec, id, alloc, body)) + body_with_dynamic_values all_bindings_rev.static + in + body_with_pre_allocations diff --git a/lambda/value_rec_compiler.mli b/lambda/value_rec_compiler.mli new file mode 100644 index 00000000000..fd4d1c338fb --- /dev/null +++ b/lambda/value_rec_compiler.mli @@ -0,0 +1,18 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Vincent Laviron, OCamlPro *) +(* *) +(* Copyright 2023 OCamlPro SAS *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +val compile_letrec : + (Ident.t * Value_rec_types.recursive_binding_kind * Lambda.lambda) list -> + Lambda.lambda -> + Lambda.lambda diff --git a/lex/dune b/lex/dune index 3d5d5ba03ce..5e9f168c175 100644 --- a/lex/dune +++ b/lex/dune @@ -15,7 +15,6 @@ (name ocamllex_lib) (wrapped false) (modes byte native) - (flags (:standard -principal)) (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) (modules common @@ -32,7 +31,6 @@ (executable (name main) (modes byte) - (flags (:standard -principal)) (libraries ocamllex_lib) (modules main)) @@ -43,7 +41,6 @@ (executable (name main_native) (modes native) - (flags (:standard -principal)) (libraries ocamllex_lib) (modules main_native)) diff --git a/manual/src/Makefile b/manual/src/Makefile index 12849462c9a..0d67ce45a4b 100644 --- a/manual/src/Makefile +++ b/manual/src/Makefile @@ -1,7 +1,7 @@ ROOTDIR = ../.. include $(ROOTDIR)/Makefile.common -TEXQUOTE = $(ROOTDIR)/runtime/ocamlrun ../tools/texquote2 +TEXQUOTE = $(ROOTDIR)/runtime4/ocamlrun ../tools/texquote2 DIRS = infoman texstuff textman diff --git a/manual/src/cmds/ocamldep.etex b/manual/src/cmds/ocamldep.etex index 93d6741d02b..1213cb9b1b2 100644 --- a/manual/src/cmds/ocamldep.etex +++ b/manual/src/cmds/ocamldep.etex @@ -65,6 +65,12 @@ and no dependencies are generated. For programs that span multiple directories, it is recommended to pass "ocamldep" the same "-I" options that are passed to the compiler. +\item["-H" \var{directory}] +Behaves identically to "-I", except that the "-H" directories are searched +last. This flag is included to make it easier to invoke "ocamldep" with +the same options as the compiler, where "-H" is used for transitive +dependencies that the program should not directly mention. + \item["-nocwd"] Do not add current working directory to the list of include directories. diff --git a/manual/src/cmds/ocamldoc.etex b/manual/src/cmds/ocamldoc.etex index e2488f6f0a3..51022fd571c 100644 --- a/manual/src/cmds/ocamldoc.etex +++ b/manual/src/cmds/ocamldoc.etex @@ -207,6 +207,10 @@ They have the same meaning as for the "ocamlc" and "ocamlopt" commands. Add \var{directory} to the list of directories search for compiled interface files (".cmi" files). +\item["-H" \var{directory}] +Like "-I", but the "-H" directories are searched last and the program may +not directly refer to the modules added to the search path this way. + \item["-nolabels"] Ignore non-optional labels in types. diff --git a/manual/src/cmds/unified-options.etex b/manual/src/cmds/unified-options.etex index b855ba4a2bf..429b2f5bc81 100644 --- a/manual/src/cmds/unified-options.etex +++ b/manual/src/cmds/unified-options.etex @@ -300,6 +300,16 @@ the toplevel is running with the "#directory" directive (section~\ref{s:toplevel-directives}). }%top +\notop{% +\item["-H" \var{directory}] +Behaves identically to "-I", except that (a) programs may not directly refer to +modules added to the search path this way, and (b) these directories are +searched after any "-I" directories. This makes it possible to provide the +compiler with compiled interface and object code files for the current program's +transitive dependencies (the dependencies of its dependencies) without allowing +them to silently become direct dependencies. +}%notop + \top{% \item["-init" \var{file}] Load the given file instead of the default initialization file. @@ -886,18 +896,20 @@ either with the same or a different language extension; is idempotent. Disable the specified \var{language-extension}. Can be specified more than once, either with the same or a different language extension; is idempotent. -\item[(JST) "-only-erasable-extensions"] -Restricts the "-extension" option to work only with so-called ``erasable'' -extensions: ones that can be rewritten into attributes while still preserving -the program's runtime input/output behavior. Turns off currently-enabled -non-erasable extensions when specified. After this flag, specifying a -non-erasable extension (even to disable it) will fail with an error. This flag -cannot be reversed, but it can be strengthened (by "-disable-all-extensions"). - -\item[(JST) "-disable-all-extensions"] -Disallow all language extensions moving forward, and turn off currently-enabled -ones. This makes "-extension" raise errors moving forwards. This flag cannot -be reversed. +\item[(JST) "-extension-universe" \var{universe}] +Set the extension universe and enable all extensions in it. Each universe +allows a set of extensions, and every successive universe includes +the previous one. Following universes exist: + +\begin{options} +\item[no_extensions] No extensions. +\item[upstream_compatible] Extensions compatible with upstream OCaml, +or erasable extensions. +\item[stable] All stable extensions. +\item[beta] All beta extensions. +\item[alpha] All alpha extensions. +\end{options} + \end{options} % diff --git a/manual/src/library/Makefile b/manual/src/library/Makefile index c968534907c..dbc0ae460f4 100644 --- a/manual/src/library/Makefile +++ b/manual/src/library/Makefile @@ -1,7 +1,7 @@ ROOTDIR = ../../.. include $(ROOTDIR)/Makefile.common -TEXQUOTE = $(ROOTDIR)/runtime/ocamlrun ../../tools/texquote2 +TEXQUOTE = $(ROOTDIR)/runtime4/ocamlrun ../../tools/texquote2 LD_PATH = $(ROOTDIR)/otherlibs/str $(ROOTDIR)/otherlibs/unix CAMLLATEX = $(OCAMLRUN) $(addprefix -I ,$(LD_PATH)) \ $(ROOTDIR)/tools/ocamltex -repo-root $(ROOTDIR) -n 80 -v false diff --git a/middle_end/clambda.ml b/middle_end/clambda.ml index 39ddb424930..6ae10493abf 100644 --- a/middle_end/clambda.ml +++ b/middle_end/clambda.ml @@ -66,7 +66,6 @@ and ulambda = * ulambda * ulambda | Uphantom_let of Backend_var.With_provenance.t * uphantom_defining_expr option * ulambda - | Uletrec of (Backend_var.With_provenance.t * ulambda) list * ulambda | Uprim of Clambda_primitives.primitive * ulambda list * Debuginfo.t | Uswitch of ulambda * ulambda_switch * Debuginfo.t * layout | Ustringswitch of diff --git a/middle_end/clambda.mli b/middle_end/clambda.mli index ed7254d40da..7546b9604b6 100644 --- a/middle_end/clambda.mli +++ b/middle_end/clambda.mli @@ -77,7 +77,6 @@ and ulambda = * ulambda * ulambda | Uphantom_let of Backend_var.With_provenance.t * uphantom_defining_expr option * ulambda - | Uletrec of (Backend_var.With_provenance.t * ulambda) list * ulambda | Uprim of Clambda_primitives.primitive * ulambda list * Debuginfo.t | Uswitch of ulambda * ulambda_switch * Debuginfo.t * Lambda.layout | Ustringswitch of diff --git a/middle_end/clambda_primitives.ml b/middle_end/clambda_primitives.ml index e5aafabf775..91e01d656ca 100644 --- a/middle_end/clambda_primitives.ml +++ b/middle_end/clambda_primitives.ml @@ -39,6 +39,7 @@ type primitive = (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape * alloc_mode | Pmakeufloatblock of mutable_flag * alloc_mode + | Pmakemixedblock of int * mutable_flag * Lambda.mixed_block_shape * alloc_mode | Pfield of int * layout * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment @@ -47,6 +48,8 @@ type primitive = | Psetfloatfield of int * initialization_or_assignment | Pufloatfield of int | Psetufloatfield of int * initialization_or_assignment + | Pmixedfield of int * Lambda.mixed_block_read + | Psetmixedfield of int * Lambda.mixed_block_write * initialization_or_assignment | Pduprecord of Types.record_representation * int (* Context switches *) | Prunstack @@ -54,7 +57,7 @@ type primitive = | Presume | Preperform (* External call *) - | Pccall of Primitive.description + | Pccall of Lambda.external_call_description (* Exceptions *) | Praise of raise_kind (* Boolean operations *) @@ -65,15 +68,22 @@ type primitive = | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintcomp of integer_comparison - | Pcompare_ints | Pcompare_floats | Pcompare_bints of boxed_integer + | Pcompare_ints + | Pcompare_floats of boxed_float + | Pcompare_bints of boxed_integer | Poffsetint of int | Poffsetref of int (* Float operations *) - | Pintoffloat | Pfloatofint of alloc_mode - | Pnegfloat of alloc_mode | Pabsfloat of alloc_mode - | Paddfloat of alloc_mode | Psubfloat of alloc_mode - | Pmulfloat of alloc_mode | Pdivfloat of alloc_mode - | Pfloatcomp of float_comparison + | Pintoffloat of boxed_float + | Pfloatofint of boxed_float * alloc_mode + | Pnegfloat of boxed_float * alloc_mode + | Pabsfloat of boxed_float * alloc_mode + | Paddfloat of boxed_float * alloc_mode + | Psubfloat of boxed_float * alloc_mode + | Pmulfloat of boxed_float * alloc_mode + | Pdivfloat of boxed_float * alloc_mode + | Pfloatcomp of boxed_float * float_comparison + | Punboxed_float_comp of boxed_float * float_comparison (* String operations *) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets @@ -110,6 +120,7 @@ type primitive = | Plsrbint of boxed_integer * alloc_mode | Pasrbint of boxed_integer * alloc_mode | Pbintcomp of boxed_integer * integer_comparison + | Punboxed_int_comp of unboxed_integer * integer_comparison (* Operations on big arrays: (unsafe, #dimensions, kind, layout) *) | Pbigarrayref of bool * int * bigarray_kind * bigarray_layout | Pbigarrayset of bool * int * bigarray_kind * bigarray_layout @@ -137,8 +148,8 @@ type primitive = | Popaque (* Probes *) | Pprobe_is_enabled of { name : string } - | Punbox_float - | Pbox_float of alloc_mode + | Punbox_float of boxed_float + | Pbox_float of boxed_float * alloc_mode | Punbox_int of boxed_integer | Pbox_int of boxed_integer * alloc_mode | Pget_header of alloc_mode @@ -153,25 +164,33 @@ and float_comparison = Lambda.float_comparison = and array_kind = Lambda.array_kind = Pgenarray | Paddrarray | Pintarray | Pfloatarray + | Punboxedfloatarray of unboxed_float + | Punboxedintarray of unboxed_integer and array_ref_kind = Lambda.array_ref_kind = | Pgenarray_ref of alloc_mode | Paddrarray_ref | Pintarray_ref | Pfloatarray_ref of alloc_mode + | Punboxedfloatarray_ref of unboxed_float + | Punboxedintarray_ref of unboxed_integer and array_set_kind = Lambda.array_set_kind = | Pgenarray_set of modify_mode | Paddrarray_set of modify_mode | Pintarray_set | Pfloatarray_set + | Punboxedfloatarray_set of unboxed_float + | Punboxedintarray_set of unboxed_integer and value_kind = Lambda.value_kind = - (* CR mshinwell: Pfloatval should be renamed to Pboxedfloatval *) - Pgenval | Pfloatval | Pboxedintval of boxed_integer | Pintval + | Pgenval + | Pintval + | Pboxedfloatval of boxed_float + | Pboxedintval of boxed_integer | Pvariant of { consts : int list; - non_consts : (int * value_kind list) list; + non_consts : (int * Lambda.constructor_shape) list; } | Parrayval of array_kind | Pboxedvectorval of boxed_vector @@ -179,7 +198,7 @@ and value_kind = Lambda.value_kind = and layout = Lambda.layout = | Ptop | Pvalue of value_kind - | Punboxed_float + | Punboxed_float of boxed_float | Punboxed_int of boxed_integer | Punboxed_vector of boxed_vector | Punboxed_product of layout list @@ -187,9 +206,17 @@ and layout = Lambda.layout = and block_shape = Lambda.block_shape +and boxed_float = Lambda.boxed_float = + | Pfloat64 + | Pfloat32 + and boxed_integer = Lambda.boxed_integer = Pnativeint | Pint32 | Pint64 +and unboxed_float = boxed_float + +and unboxed_integer = boxed_integer + and vec128_type = Lambda.vec128_type = | Unknown128 | Int8x16 @@ -225,29 +252,84 @@ let equal (x: primitive) (y: primitive) = x = y let result_layout (p : primitive) = match p with - | Punbox_float -> Lambda.Punboxed_float - | Punbox_int bi -> Lambda.Punboxed_int bi - | Pccall {prim_native_repr_res = (_, repr_res); _} -> - Lambda.layout_of_native_repr repr_res - | Pufloatfield _ -> Lambda.Punboxed_float - | Pread_symbol _ | Pmakeblock _ | Pmakeufloatblock _ | Pfield _ - | Pfield_computed | Psetfield _ | Psetfield_computed _ | Pfloatfield _ - | Psetfloatfield _ | Psetufloatfield _ | Pduprecord _ | Praise _ - | Psequand | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint - | Pdivint _ | Pmodint _ | Pandint | Porint | Pxorint | Plslint | Plsrint - | Pasrint | Pintcomp _ | Pcompare_ints | Pcompare_floats | Pcompare_bints _ - | Poffsetint _ | Poffsetref _ | Pintoffloat | Pfloatofint _ | Pnegfloat _ - | Pabsfloat _ | Paddfloat _ | Psubfloat _ | Pmulfloat _ | Pdivfloat _ - | Pfloatcomp _ | Pstringlength | Pstringrefu | Pstringrefs - | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets - | Pmakearray _ | Pduparray _ | Parraylength _ | Parrayrefu _ | Parraysetu _ - | Parrayrefs _ | Parraysets _ | Pisint | Pisout | Pbintofint _ | Pintofbint _ - | Pcvtbint _ | Pnegbint _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ - | Pmodbint _ | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ - | Pasrbint _ | Pbintcomp _ | Pbigarrayref _ | Pbigarrayset _ | Pbigarraydim _ + | Psetfield _ | Psetfield_computed _ | Psetfloatfield _ | Poffsetref _ + | Psetufloatfield _ | Psetmixedfield _ + | Pbytessetu | Pbytessets | Parraysetu _ | Parraysets _ | Pbigarrayset _ + -> Lambda.layout_unit + | Pmakeblock _ | Pmakearray _ | Pduprecord _ + | Pmakeufloatblock _ | Pmakemixedblock _ + | Pduparray _ | Pbigarraydim _ -> Lambda.layout_block + | Pfield _ | Pfield_computed | Pmixedfield (_, Mread_value_prefix _) -> + Lambda.layout_value_field + | Pfloatfield _ -> Lambda.layout_boxed_float Pfloat64 + | Pfloatofint (bf, _) + | Pnegfloat (bf, _) | Pabsfloat (bf, _) + | Paddfloat (bf, _) | Psubfloat (bf, _) + | Pmulfloat (bf, _) | Pdivfloat (bf, _) + | Pbox_float (bf, _) -> Lambda.layout_boxed_float bf + | Pufloatfield _ -> Punboxed_float Pfloat64 + | Punbox_float bf -> Punboxed_float bf + | Pmixedfield (_, Mread_flat_suffix shape) -> begin + match shape with + | Flat_read Imm -> Lambda.layout_int + | Flat_read Float | Flat_read_float _ -> Lambda.layout_any_value + | Flat_read Float64 -> Lambda.layout_unboxed_float Pfloat64 + | Flat_read Bits32 -> Lambda.Punboxed_int Pint32 + | Flat_read Bits64 -> Lambda.Punboxed_int Pint64 + | Flat_read Word -> Lambda.Punboxed_int Pnativeint + end + | Pccall { prim_native_repr_res = _, repr_res } -> Lambda.layout_of_extern_repr repr_res + | Praise _ -> Lambda.layout_bottom + | Psequor | Psequand | Pnot + | Pnegint | Paddint | Psubint | Pmulint + | Pdivint _ | Pmodint _ + | Pandint | Porint | Pxorint + | Plslint | Plsrint | Pasrint + | Pintcomp _ + | Pcompare_ints | Pcompare_floats _| Pcompare_bints _ + | Poffsetint _ | Pintoffloat _ + | Pfloatcomp (_, _) | Punboxed_float_comp (_, _) + | Pstringlength | Pstringrefu | Pstringrefs + | Pbyteslength | Pbytesrefu | Pbytesrefs + | Parraylength _ | Pisint | Pisout | Pintofbint _ + | Pbintcomp _ | Punboxed_int_comp _ + | Pprobe_is_enabled _ | Pbswap16 + -> Lambda.layout_int + | Parrayrefu array_ref_kind | Parrayrefs array_ref_kind -> + Lambda.array_ref_kind_result_layout array_ref_kind + | Pbintofint (bi, _) | Pcvtbint (_,bi,_) + | Pnegbint (bi, _) | Paddbint (bi, _) | Psubbint (bi, _) + | Pmulbint (bi, _) | Pdivbint {size = bi} | Pmodbint {size = bi} + | Pandbint (bi, _) | Porbint (bi, _) | Pxorbint (bi, _) + | Plslbint (bi, _) | Plsrbint (bi, _) | Pasrbint (bi, _) + | Pbbswap (bi, _) | Pbox_int (bi, _) -> + Lambda.layout_boxedint bi + | Punbox_int bi -> Punboxed_int bi + | Pbigarrayref (_, _, kind, _) -> + begin match kind with + | Pbigarray_unknown -> Lambda.layout_any_value + | Pbigarray_float32 | Pbigarray_float64 -> Lambda.layout_boxed_float Pfloat64 + | Pbigarray_sint8 | Pbigarray_uint8 + | Pbigarray_sint16 | Pbigarray_uint16 + | Pbigarray_caml_int -> Lambda.layout_int + | Pbigarray_int32 -> Lambda.layout_boxedint Pint32 + | Pbigarray_int64 -> Lambda.layout_boxedint Pint64 + | Pbigarray_native_int -> Lambda.layout_boxedint Pnativeint + | Pbigarray_complex32 | Pbigarray_complex64 -> + Lambda.layout_block + end + | Pint_as_pointer _ -> + (* CR ncourant: use an unboxed int64 here when it exists *) + Lambda.layout_any_value + | Pget_header _ -> Lambda.layout_boxedint Pnativeint + | Prunstack | Presume | Pperform | Preperform -> + Lambda.layout_any_value + | Patomic_load { immediate_or_pointer = Immediate } -> Lambda.layout_int + | Patomic_load { immediate_or_pointer = Pointer } -> Lambda.layout_any_value + | Patomic_exchange + | Patomic_cas + | Patomic_fetch_add + | Pdls_get + | Popaque | Pread_symbol _ | Pstring_load _ | Pbytes_load _ | Pbytes_set _ | Pbigstring_load _ - | Pbigstring_set _ | Pbswap16 | Pbbswap _ | Pint_as_pointer _ | Popaque - | Pprobe_is_enabled _ | Pbox_float _ | Pbox_int _ | Pget_header _ - | Prunstack | Pperform | Presume | Preperform | Patomic_exchange - | Patomic_cas | Patomic_fetch_add | Pdls_get | Patomic_load _ - -> Lambda.layout_any_value + | Pbigstring_set _ -> Lambda.layout_any_value diff --git a/middle_end/clambda_primitives.mli b/middle_end/clambda_primitives.mli index 871041d534d..f96bba8be4d 100644 --- a/middle_end/clambda_primitives.mli +++ b/middle_end/clambda_primitives.mli @@ -39,6 +39,7 @@ type primitive = (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape * alloc_mode | Pmakeufloatblock of mutable_flag * alloc_mode + | Pmakemixedblock of int * mutable_flag * Lambda.mixed_block_shape * alloc_mode | Pfield of int * layout * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment @@ -47,6 +48,8 @@ type primitive = | Psetfloatfield of int * initialization_or_assignment | Pufloatfield of int | Psetufloatfield of int * initialization_or_assignment + | Pmixedfield of int * Lambda.mixed_block_read + | Psetmixedfield of int * Lambda.mixed_block_write * initialization_or_assignment | Pduprecord of Types.record_representation * int (* Context switches *) | Prunstack @@ -54,7 +57,7 @@ type primitive = | Presume | Preperform (* External call *) - | Pccall of Primitive.description + | Pccall of Lambda.external_call_description (* Exceptions *) | Praise of raise_kind (* Boolean operations *) @@ -65,15 +68,22 @@ type primitive = | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintcomp of integer_comparison - | Pcompare_ints | Pcompare_floats | Pcompare_bints of boxed_integer + | Pcompare_ints + | Pcompare_floats of boxed_float + | Pcompare_bints of boxed_integer | Poffsetint of int | Poffsetref of int (* Float operations *) - | Pintoffloat | Pfloatofint of alloc_mode - | Pnegfloat of alloc_mode | Pabsfloat of alloc_mode - | Paddfloat of alloc_mode | Psubfloat of alloc_mode - | Pmulfloat of alloc_mode | Pdivfloat of alloc_mode - | Pfloatcomp of float_comparison + | Pintoffloat of boxed_float + | Pfloatofint of boxed_float * alloc_mode + | Pnegfloat of boxed_float * alloc_mode + | Pabsfloat of boxed_float * alloc_mode + | Paddfloat of boxed_float * alloc_mode + | Psubfloat of boxed_float * alloc_mode + | Pmulfloat of boxed_float * alloc_mode + | Pdivfloat of boxed_float * alloc_mode + | Pfloatcomp of boxed_float * float_comparison + | Punboxed_float_comp of boxed_float * float_comparison (* String operations *) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets @@ -113,6 +123,7 @@ type primitive = | Plsrbint of boxed_integer * alloc_mode | Pasrbint of boxed_integer * alloc_mode | Pbintcomp of boxed_integer * integer_comparison + | Punboxed_int_comp of unboxed_integer * integer_comparison (* Operations on big arrays: (unsafe, #dimensions, kind, layout) *) | Pbigarrayref of bool * int * bigarray_kind * bigarray_layout | Pbigarrayset of bool * int * bigarray_kind * bigarray_layout @@ -140,8 +151,8 @@ type primitive = | Popaque (* Probes *) | Pprobe_is_enabled of { name : string } - | Punbox_float - | Pbox_float of alloc_mode + | Punbox_float of boxed_float + | Pbox_float of boxed_float * alloc_mode | Punbox_int of boxed_integer | Pbox_int of boxed_integer * alloc_mode | Pget_header of alloc_mode @@ -157,25 +168,33 @@ and float_comparison = Lambda.float_comparison = and array_kind = Lambda.array_kind = Pgenarray | Paddrarray | Pintarray | Pfloatarray + | Punboxedfloatarray of unboxed_float + | Punboxedintarray of unboxed_integer and array_ref_kind = Lambda.array_ref_kind = | Pgenarray_ref of alloc_mode | Paddrarray_ref | Pintarray_ref | Pfloatarray_ref of alloc_mode + | Punboxedfloatarray_ref of unboxed_float + | Punboxedintarray_ref of unboxed_integer and array_set_kind = Lambda.array_set_kind = | Pgenarray_set of modify_mode | Paddrarray_set of modify_mode | Pintarray_set | Pfloatarray_set + | Punboxedfloatarray_set of unboxed_float + | Punboxedintarray_set of unboxed_integer and value_kind = Lambda.value_kind = - (* CR mshinwell: Pfloatval should be renamed to Pboxedfloatval *) - Pgenval | Pfloatval | Pboxedintval of boxed_integer | Pintval + | Pgenval + | Pintval + | Pboxedfloatval of boxed_float + | Pboxedintval of boxed_integer | Pvariant of { consts : int list; - non_consts : (int * value_kind list) list; + non_consts : (int * Lambda.constructor_shape) list; } | Parrayval of array_kind | Pboxedvectorval of boxed_vector @@ -183,7 +202,7 @@ and value_kind = Lambda.value_kind = and layout = Lambda.layout = | Ptop | Pvalue of value_kind - | Punboxed_float + | Punboxed_float of boxed_float | Punboxed_int of boxed_integer | Punboxed_vector of boxed_vector | Punboxed_product of layout list @@ -191,9 +210,17 @@ and layout = Lambda.layout = and block_shape = Lambda.block_shape +and boxed_float = Lambda.boxed_float = + | Pfloat64 + | Pfloat32 + and boxed_integer = Lambda.boxed_integer = Pnativeint | Pint32 | Pint64 +and unboxed_float = boxed_float + +and unboxed_integer = boxed_integer + and vec128_type = Lambda.vec128_type = | Unknown128 | Int8x16 diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index e8126f4a3ad..6dae723c587 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -16,7 +16,6 @@ (* Introduction of closures, uncurrying, recognition of direct calls *) open Misc -open Asttypes open Primitive open Lambda open Switch @@ -62,12 +61,12 @@ let is_gc_ignorable kind = match kind with | Ptop -> Misc.fatal_error "[Ptop] can't be stored in a closure." | Pbottom -> Misc.fatal_error "[Pbottom] should not be stored in a closure." - | Punboxed_float -> true + | Punboxed_float _ -> true | Punboxed_int _ -> true | Punboxed_vector _ -> true | Pvalue Pintval -> true - | Pvalue (Pgenval | Pfloatval | Pboxedintval _ | Pvariant _ | Parrayval _ | - Pboxedvectorval _) -> false + | Pvalue (Pgenval | Pboxedfloatval _ | Pboxedintval _ | Pvariant _ | + Parrayval _ | Pboxedvectorval _) -> false | Punboxed_product _ -> Misc.fatal_error "TODO" let split_closure_fv kinds fv = @@ -125,8 +124,6 @@ let occurs_var var u = | Uoffset(u, _ofs) -> occurs u | Ulet(_str, _kind, _id, def, body) -> occurs def || occurs body | Uphantom_let _ -> no_phantom_lets () - | Uletrec(decls, body) -> - List.exists (fun (_id, u) -> occurs u) decls || occurs body | Uprim(_p, args, _) -> List.exists occurs args | Uswitch(arg, s, _dbg, _kind) -> occurs arg || @@ -220,8 +217,6 @@ let lambda_smaller lam threshold = | Ulet(_str, _kind, _id, lam, body) -> lambda_size lam; lambda_size body | Uphantom_let _ -> no_phantom_lets () - | Uletrec _ -> - raise Exit (* usually too large *) | Uprim(prim, args, _) -> size := !size + prim_size prim args; lambda_list_size args @@ -346,7 +341,7 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | Pnot -> make_const_bool (n1 = 0) | Pnegint -> make_const_int (- n1) | Poffsetint n -> make_const_int (n + n1) - | Pfloatofint _ when fpc -> make_const_float (float_of_int n1) + | Pfloatofint (Pfloat64, _) when fpc -> make_const_float (float_of_int n1) | Pbintofint (Pnativeint,_) -> make_const_natint (Nativeint.of_int n1) | Pbintofint (Pint32,_) -> make_const_int32 (Int32.of_int n1) | Pbintofint (Pint64,_) -> make_const_int64 (Int64.of_int n1) @@ -380,20 +375,20 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = (* float *) | [Value_const(Uconst_ref(_, Some (Uconst_float n1)))] when fpc -> begin match p with - | Pintoffloat -> make_const_int (int_of_float n1) - | Pnegfloat _ -> make_const_float (-. n1) - | Pabsfloat _ -> make_const_float (abs_float n1) + | Pintoffloat Pfloat64 -> make_const_int (int_of_float n1) + | Pnegfloat (Pfloat64, _) -> make_const_float (-. n1) + | Pabsfloat (Pfloat64, _) -> make_const_float (abs_float n1) | _ -> default end (* float, float *) | [Value_const(Uconst_ref(_, Some (Uconst_float n1))); Value_const(Uconst_ref(_, Some (Uconst_float n2)))] when fpc -> begin match p with - | Paddfloat _ -> make_const_float (n1 +. n2) - | Psubfloat _ -> make_const_float (n1 -. n2) - | Pmulfloat _ -> make_const_float (n1 *. n2) - | Pdivfloat _ -> make_const_float (n1 /. n2) - | Pfloatcomp c -> make_float_comparison c n1 n2 + | Paddfloat (Pfloat64, _) -> make_const_float (n1 +. n2) + | Psubfloat (Pfloat64, _) -> make_const_float (n1 -. n2) + | Pmulfloat (Pfloat64, _) -> make_const_float (n1 *. n2) + | Pdivfloat (Pfloat64, _) -> make_const_float (n1 /. n2) + | Pfloatcomp (Pfloat64, c) -> make_float_comparison c n1 n2 | _ -> default end (* nativeint *) @@ -650,21 +645,6 @@ let rec substitute loc ((backend, fpc) as st) sb rn ulam = substitute loc st (V.Map.add (VP.var id) (Uvar (VP.var id')) sb) rn u2) | Uphantom_let _ -> no_phantom_lets () - | Uletrec(bindings, body) -> - let bindings1 = - List.map (fun (id, rhs) -> - (VP.var id, VP.rename id, rhs)) bindings - in - let sb' = - List.fold_right (fun (id, id', _) s -> - V.Map.add id (Uvar (VP.var id')) s) - bindings1 sb - in - Uletrec( - List.map - (fun (_id, id', rhs) -> (id', substitute loc st sb' rn rhs)) - bindings1, - substitute loc st sb' rn body) | Uprim(p, args, dbg) -> let sargs = List.map (substitute loc st sb rn) args in let dbg = subst_debuginfo loc dbg in @@ -843,7 +823,7 @@ let bind_params { backend; mutable_vars; _ } loc fdesc params args funct body = primitive (see [simplif_prim_pure]) *) a, Uprim(P.Pmakeblock(0, Immutable, kind, mode), [Uvar (VP.var p1')], dbg), - Lambda.layout_field + Lambda.layout_value_field | _ -> a1, Uvar (VP.var p1'), layout1 in @@ -1028,12 +1008,18 @@ let rec close ({ backend; fenv; cenv ; mutable_vars; kinds; catch_env } as env) | Const_base (Const_string (s, _, _)) -> str (Uconst_string s) | Const_base(Const_float x) -> str (Uconst_float (float_of_string x)) + | Const_base(Const_float32 _ | Const_unboxed_float32 _) -> + Misc.fatal_error "float32 is not supported in closure. Consider using flambda2." + | Const_base (Const_unboxed_float _ | Const_unboxed_int32 _ + | Const_unboxed_int64 _ | Const_unboxed_nativeint _) -> + (* CR alanechang: implement unboxed constants in closure *) + Misc.fatal_error "Unboxed constants are not supported in closure. Consider using flambda2." | Const_base(Const_int32 x) -> str (Uconst_int32 x) | Const_base(Const_int64 x) -> str (Uconst_int64 x) | Const_base(Const_nativeint x) -> str (Uconst_nativeint x) in make_const (transl cst) - | Lfunction _ as funct -> + | Lfunction funct -> close_one_function env (Ident.create_local "fun") funct (* We convert [f a] to [let a' = a in let f' = f in fun b c -> f' a' b c] @@ -1143,6 +1129,8 @@ let rec close ({ backend; fenv; cenv ; mutable_vars; kinds; catch_env } as env) }) ~loc ~mode:new_clos_mode + ~ret_mode + (* CR ncourant: this is incorrect, but the mode will not be used for anything *) ~region:fundesc.fun_region ~attr:default_function_attribute) in @@ -1239,59 +1227,37 @@ let rec close ({ backend; fenv; cenv ; mutable_vars; kinds; catch_env } as env) let (ubody, abody) = close { env with kinds } body in (Ulet(Mutable, kind, VP.create id, ulam, ubody), abody) | Lletrec(defs, body) -> - if List.for_all - (function (_id, Lfunction _) -> true | _ -> false) - defs - then begin - (* Simple case: only function definitions *) - let (clos, infos) = close_functions env defs in - let clos_ident = V.create_local "clos" in - let fenv_body = - List.fold_right - (fun (id, _pos, approx) fenv -> V.Map.add id approx fenv) - infos fenv in - let kinds_body = - List.fold_right - (fun (id, _pos, _approx) kinds -> V.Map.add id Lambda.layout_function kinds) - infos (V.Map.add clos_ident Lambda.layout_function kinds) - in - let (ubody, approx) = - close - { backend; - fenv = fenv_body; - cenv; - mutable_vars; - kinds = kinds_body; - catch_env - } - body - in - let sb = - List.fold_right - (fun (id, pos, _approx) sb -> - V.Map.add id (Uoffset(Uvar clos_ident, pos)) sb) - infos V.Map.empty in - (Ulet(Immutable, Lambda.layout_function, VP.create clos_ident, clos, - substitute Debuginfo.none (backend, !Clflags.float_const_prop) sb - None ubody), - approx) - end else begin - (* General case: recursive definition of values *) - let kinds = - List.fold_left (fun kinds (id, _) -> V.Map.add id Lambda.layout_letrec kinds) - kinds defs - in - let rec clos_defs = function - [] -> ([], fenv) - | (id, lam) :: rem -> - let (udefs, fenv_body) = clos_defs rem in - let (ulam, approx) = close_named { env with kinds } id lam in - ((VP.create id, ulam) :: udefs, V.Map.add id approx fenv_body) in - let (udefs, fenv_body) = clos_defs defs in - let (ubody, approx) = - close { backend; fenv = fenv_body; cenv; mutable_vars; kinds; catch_env } body in - (Uletrec(udefs, ubody), approx) - end + let (clos, infos) = close_functions env defs in + let clos_ident = V.create_local "clos" in + let fenv_body = + List.fold_right + (fun (id, _pos, approx) fenv -> V.Map.add id approx fenv) + infos fenv in + let kinds_body = + List.fold_right + (fun (id, _pos, _approx) kinds -> V.Map.add id Lambda.layout_function kinds) + infos (V.Map.add clos_ident Lambda.layout_function kinds) + in + let (ubody, approx) = + close + { backend; + fenv = fenv_body; + cenv; + mutable_vars; + kinds = kinds_body; + catch_env + } + body + in + let sb = + List.fold_right + (fun (id, pos, _approx) sb -> + V.Map.add id (Uoffset(Uvar clos_ident, pos)) sb) + infos V.Map.empty in + (Ulet(Immutable, Lambda.layout_function, VP.create clos_ident, clos, + substitute Debuginfo.none (backend, !Clflags.float_const_prop) sb + None ubody), + approx) (* Compile-time constants *) | Lprim(Pctconst c, [arg], _loc) -> let cst, approx = @@ -1305,6 +1271,7 @@ let rec close ({ backend; fenv; cenv ; mutable_vars; kinds; catch_env } as env) | Ostype_cygwin -> make_const_bool (Sys.os_type = "Cygwin") | Backend_type -> make_const_int 0 (* tag 0 is the same as Native here *) + | Runtime5 -> make_const_bool Config.runtime5 in let arg, _approx = close env arg in let id = Ident.create_local "dummy" in @@ -1479,7 +1446,7 @@ and close_list_approx env = function (ulam :: ulams, approx :: approxs) and close_named env id = function - Lfunction _ as funct -> + Lfunction funct -> close_one_function env id funct | lam -> close env lam @@ -1490,17 +1457,16 @@ and close_functions { backend; fenv; cenv; mutable_vars; kinds; catch_env } fun_ let fun_defs = List.flatten (List.map - (function - | (id, Lfunction{kind; params; return; body; attr; - loc; mode; region}) -> - Simplif.split_default_wrapper ~id ~kind ~params ~mode ~region + (fun { id; + def = {kind; params; return; body; attr; + loc; mode; ret_mode; region} } -> + Simplif.split_default_wrapper ~id ~kind ~params ~mode ~ret_mode ~region ~body ~attr ~loc ~return - | _ -> assert false ) fun_defs) in let inline_attribute = match fun_defs with - | [_, Lfunction{attr = { inline; }}] -> inline + | [{ def = {attr = { inline; }}}] -> inline | _ -> Default_inline (* recursive functions can't be inlined *) in (* Update and check nesting depth *) @@ -1517,29 +1483,28 @@ and close_functions { backend; fenv; cenv; mutable_vars; kinds; catch_env } fun_ parameter. *) let uncurried_defs = List.map - (function - (id, Lfunction {kind; params; return; body; loc; mode; region; attr}) -> - let label = - Symbol.for_local_ident id - |> Symbol.linkage_name - |> Linkage_name.to_string - in - let fundesc = - {fun_label = label; - fun_arity = { - function_kind = kind ; - params_layout = List.map (fun p -> p.layout) params ; - return_layout = return - }; - fun_closed = initially_closed; - fun_inline = None; - fun_float_const_prop = !Clflags.float_const_prop; - fun_region = region; - fun_poll = attr.poll } in - let dbg = Debuginfo.from_location loc in - (id, List.map (fun (p : Lambda.lparam) -> let No_attributes = p.attributes in (p.name, p.layout, p.mode)) params, - return, body, mode, fundesc, dbg) - | (_, _) -> fatal_error "Closure.close_functions") + (fun { id; + def = {kind; params; return; body; loc; mode; region; attr} } -> + let label = + Symbol.for_local_ident id + |> Symbol.linkage_name + |> Linkage_name.to_string + in + let fundesc = + {fun_label = label; + fun_arity = { + function_kind = kind ; + params_layout = List.map (fun p -> p.layout) params ; + return_layout = return + }; + fun_closed = initially_closed; + fun_inline = None; + fun_float_const_prop = !Clflags.float_const_prop; + fun_region = region; + fun_poll = attr.poll } in + let dbg = Debuginfo.from_location loc in + (id, List.map (fun (p : Lambda.lparam) -> (p.name, p.layout, p.mode)) params, + return, body, mode, fundesc, dbg)) fun_defs in (* Build an approximate fenv for compiling the functions *) let fenv_rec = @@ -1686,7 +1651,7 @@ and close_functions { backend; fenv; cenv; mutable_vars; kinds; catch_env } fun_ (* Same, for one non-recursive function *) and close_one_function env id funct = - match close_functions env [id, funct] with + match close_functions env [{ id; def = funct }] with | (clos, (i, _, approx) :: _) when id = i -> (clos, approx) | _ -> fatal_error "Closure.close_one_function" @@ -1778,7 +1743,6 @@ let collect_exported_structured_constants a = | Uoffset(u, _) -> ulam u | Ulet (_str, _kind, _, u1, u2) -> ulam u1; ulam u2 | Uphantom_let _ -> no_phantom_lets () - | Uletrec (l, u) -> List.iter (fun (_, u) -> ulam u) l; ulam u | Uprim (_, ul, _) -> List.iter ulam ul | Uswitch (u, sl, _dbg, _kind) -> ulam u; diff --git a/middle_end/convert_primitives.ml b/middle_end/convert_primitives.ml index dc1073b47a3..44d364faf8e 100644 --- a/middle_end/convert_primitives.ml +++ b/middle_end/convert_primitives.ml @@ -30,6 +30,8 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = Pmakearray (Pfloatarray, mutability, mode) | Pmakeufloatblock (mutability, mode) -> Pmakeufloatblock (mutability, mode) + | Pmakemixedblock (tag, mutability, abs, mode) -> + Pmakemixedblock (tag, mutability, abs, mode) | Pfield (field, imm_or_pointer, sem) -> let sem : Lambda.mutable_flag = match sem with @@ -48,6 +50,10 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pufloatfield (field, _sem) -> Pufloatfield field | Psetufloatfield (field, init_or_assign) -> Psetufloatfield (field, init_or_assign) + | Pmixedfield (field, shape, _sem) -> + Pmixedfield (field, shape) + | Psetmixedfield (field, shape, init_or_assign) -> + Psetmixedfield (field, shape, init_or_assign) | Pduprecord (repr, size) -> Pduprecord (repr, size) | Pmake_unboxed_product _ | Punboxed_product_field _ -> Misc.fatal_error "TODO" @@ -74,19 +80,20 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pasrint -> Pasrint | Pintcomp comp -> Pintcomp comp | Pcompare_ints -> Pcompare_ints - | Pcompare_floats -> Pcompare_floats + | Pcompare_floats bf -> Pcompare_floats bf | Pcompare_bints bi -> Pcompare_bints bi | Poffsetint offset -> Poffsetint offset | Poffsetref offset -> Poffsetref offset - | Pintoffloat -> Pintoffloat - | Pfloatofint m -> Pfloatofint m - | Pnegfloat m -> Pnegfloat m - | Pabsfloat m -> Pabsfloat m - | Paddfloat m -> Paddfloat m - | Psubfloat m -> Psubfloat m - | Pmulfloat m -> Pmulfloat m - | Pdivfloat m -> Pdivfloat m - | Pfloatcomp comp -> Pfloatcomp comp + | Pintoffloat bf -> Pintoffloat bf + | Pfloatofint (bf,m) -> Pfloatofint (bf,m) + | Pnegfloat (bf,m) -> Pnegfloat (bf,m) + | Pabsfloat (bf,m) -> Pabsfloat (bf,m) + | Paddfloat (bf,m) -> Paddfloat (bf,m) + | Psubfloat (bf,m) -> Psubfloat (bf,m) + | Pmulfloat (bf,m) -> Pmulfloat (bf,m) + | Pdivfloat (bf,m) -> Pdivfloat (bf,m) + | Pfloatcomp (bf,comp) -> Pfloatcomp (bf,comp) + | Punboxed_float_comp (bf,comp) -> Punboxed_float_comp (bf,comp) | Pstringlength -> Pstringlength | Pstringrefu -> Pstringrefu | Pstringrefs -> Pstringrefs @@ -98,10 +105,10 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pmakearray (kind, mutability, mode) -> Pmakearray (kind, mutability, mode) | Pduparray (kind, mutability) -> Pduparray (kind, mutability) | Parraylength kind -> Parraylength kind - | Parrayrefu rkind -> Parrayrefu rkind - | Parraysetu skind -> Parraysetu skind - | Parrayrefs rkind -> Parrayrefs rkind - | Parraysets skind -> Parraysets skind + | Parrayrefu (rkind, Ptagged_int_index) -> Parrayrefu rkind + | Parraysetu (skind, Ptagged_int_index) -> Parraysetu skind + | Parrayrefs (rkind, Ptagged_int_index) -> Parrayrefs rkind + | Parraysets (skind, Ptagged_int_index) -> Parraysets skind | Pisint _ -> Pisint | Pisout -> Pisout | Pcvtbint (src, dest, m) -> Pcvtbint (src, dest, m) @@ -121,6 +128,7 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pdivbint { size; is_safe; mode } -> Pdivbint { size; is_safe; mode } | Pmodbint { size; is_safe; mode } -> Pmodbint { size; is_safe; mode } | Pbintcomp (bi, comp) -> Pbintcomp (bi, comp) + | Punboxed_int_comp (bi, comp) -> Punboxed_int_comp (bi, comp) | Pbigarrayref (safe, dims, kind, layout) -> Pbigarrayref (safe, dims, kind, layout) | Pbigarrayset (safe, dims, kind, layout) -> @@ -143,17 +151,17 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = Pbytes_set (Thirty_two, convert_unsafety is_unsafe) | Pbytes_set_64 is_unsafe -> Pbytes_set (Sixty_four, convert_unsafety is_unsafe) - | Pbigstring_load_16 is_unsafe -> + | Pbigstring_load_16 { unsafe = is_unsafe } -> Pbigstring_load (Sixteen, convert_unsafety is_unsafe, Lambda.alloc_heap) - | Pbigstring_load_32 (is_unsafe, m) -> + | Pbigstring_load_32 { unsafe = is_unsafe; mode = m; boxed = true } -> Pbigstring_load (Thirty_two, convert_unsafety is_unsafe, m) - | Pbigstring_load_64 (is_unsafe, m) -> + | Pbigstring_load_64 { unsafe = is_unsafe; mode = m; boxed = true } -> Pbigstring_load (Sixty_four, convert_unsafety is_unsafe, m) - | Pbigstring_set_16 is_unsafe -> + | Pbigstring_set_16 { unsafe = is_unsafe } -> Pbigstring_set (Sixteen, convert_unsafety is_unsafe) - | Pbigstring_set_32 is_unsafe -> + | Pbigstring_set_32 { unsafe = is_unsafe; boxed = true } -> Pbigstring_set (Thirty_two, convert_unsafety is_unsafe) - | Pbigstring_set_64 is_unsafe -> + | Pbigstring_set_64 { unsafe = is_unsafe; boxed = true } -> Pbigstring_set (Sixty_four, convert_unsafety is_unsafe) | Pbigarraydim dim -> Pbigarraydim dim | Pbswap16 -> Pbswap16 @@ -167,6 +175,7 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pprobe_is_enabled {name} -> Pprobe_is_enabled {name} | Pobj_dup -> let module P = Primitive in + let module L = Lambda in Pccall (Primitive.make ~name:"caml_obj_dup" ~alloc:true @@ -174,14 +183,17 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = ~effects:Only_generative_effects ~coeffects:Has_coeffects ~native_name:"caml_obj_dup" - ~native_repr_args:[P.Prim_global, P.Same_as_ocaml_repr Jkind.Sort.Value] - ~native_repr_res:(P.Prim_global, P.Same_as_ocaml_repr Jkind.Sort.Value)) - | Punbox_float -> Punbox_float - | Pbox_float m -> Pbox_float m + ~native_repr_args:[P.Prim_global, L.Same_as_ocaml_repr Jkind.Sort.Value] + ~native_repr_res:(P.Prim_global, L.Same_as_ocaml_repr Jkind.Sort.Value) + ~is_layout_poly:false) + | Punbox_float bf -> Punbox_float bf + | Pbox_float (bf,m) -> Pbox_float (bf,m) | Punbox_int bi -> Punbox_int bi | Pbox_int (bi, m) -> Pbox_int (bi, m) | Pget_header m -> Pget_header m | Pdls_get -> Pdls_get + | Pfloat32offloat _ + | Pfloatoffloat32 _ | Pobj_magic _ | Pbytes_to_string | Pbytes_of_string @@ -192,11 +204,33 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pgetpredef _ | Parray_to_iarray | Parray_of_iarray + | Pbigstring_load_32 _ + | Pbigstring_set_32 _ + | Pbigstring_load_64 _ + | Pbigstring_set_64 _ | Pbigstring_load_128 _ | Pbigstring_set_128 _ | Pstring_load_128 _ | Pbytes_load_128 _ | Pbytes_set_128 _ + | Pfloatarray_load_128 _ + | Pfloat_array_load_128 _ + | Pint_array_load_128 _ + | Punboxed_float_array_load_128 _ + | Punboxed_int32_array_load_128 _ + | Punboxed_int64_array_load_128 _ + | Punboxed_nativeint_array_load_128 _ + | Pfloatarray_set_128 _ + | Pfloat_array_set_128 _ + | Pint_array_set_128 _ + | Punboxed_float_array_set_128 _ + | Punboxed_int32_array_set_128 _ + | Punboxed_int64_array_set_128 _ + | Punboxed_nativeint_array_set_128 _ + | Parrayrefu (_, Punboxed_int_index _) + | Parraysetu (_, Punboxed_int_index _) + | Parrayrefs (_, Punboxed_int_index _) + | Parraysets (_, Punboxed_int_index _) -> Misc.fatal_errorf "lambda primitive %a can't be converted to \ clambda primitive" diff --git a/middle_end/flambda/build_export_info.ml b/middle_end/flambda/build_export_info.ml index 53925a96b13..8be702d1e4b 100644 --- a/middle_end/flambda/build_export_info.ml +++ b/middle_end/flambda/build_export_info.ml @@ -238,14 +238,6 @@ let rec approx_of_expr (env : Env.t) (flam : Flambda.t) : Export_info.approx = approx_of_expr env body | Let_mutable { body } -> approx_of_expr env body - | Let_rec (defs, body) -> - let env = - List.fold_left (fun env (var, defining_expr) -> - let approx = descr_of_named env defining_expr in - Env.add_approx env var approx) - env defs - in - approx_of_expr env body | Apply { func; kind; _ } -> begin match kind with | Indirect -> Value_unknown diff --git a/middle_end/flambda/closure_conversion.ml b/middle_end/flambda/closure_conversion.ml index 69063b85cc0..43a3dd50490 100644 --- a/middle_end/flambda/closure_conversion.ml +++ b/middle_end/flambda/closure_conversion.ml @@ -33,39 +33,35 @@ type t = { } let add_default_argument_wrappers lam = - let defs_are_all_functions (defs : (_ * Lambda.lambda) list) = - List.for_all (function (_, Lambda.Lfunction _) -> true | _ -> false) defs - in let f (lam : Lambda.lambda) : Lambda.lambda = match lam with | Llet (( Strict | Alias | StrictOpt), _k, id, Lfunction {kind; params; body = fbody; attr; loc; - mode; region; return }, body) -> + ret_mode; mode; region; return }, body) -> begin match Simplif.split_default_wrapper ~id ~kind ~params - ~body:fbody ~return ~attr ~loc ~mode ~region + ~body:fbody ~return ~attr ~loc ~ret_mode ~mode ~region with - | [fun_id, def] -> Llet (Alias, Lambda.layout_function, fun_id, def, body) - | [fun_id, def; inner_fun_id, def_inner] -> - Llet (Alias, Lambda.layout_function, inner_fun_id, def_inner, - Llet (Alias, Lambda.layout_function, fun_id, def, body)) + | [{ id = fun_id; def }] -> + Llet (Alias, Lambda.layout_function, fun_id, Lfunction def, body) + | [{ id = fun_id; def }; + { id = inner_fun_id; def = def_inner }] -> + Llet (Alias, Lambda.layout_function, inner_fun_id, Lfunction def_inner, + Llet (Alias, Lambda.layout_function, fun_id, Lfunction def, body)) | _ -> assert false end - | Lletrec (defs, body) as lam -> - if defs_are_all_functions defs then + | Lletrec (defs, body) -> let defs = List.flatten (List.map - (function - | (id, Lambda.Lfunction {kind; params; body; attr; loc; - mode; region; return }) -> + (fun Lambda.{ id; + def = {kind; params; body; attr; loc; + ret_mode; mode; region; return} } -> Simplif.split_default_wrapper ~id ~kind ~params ~body - ~return ~attr ~loc ~mode ~region - | _ -> assert false) + ~return ~attr ~loc ~ret_mode ~mode ~region) defs) in Lletrec (defs, body) - else lam | lam -> lam in Lambda.map f lam @@ -123,6 +119,10 @@ let rec declare_const t (const : Lambda.structured_constant) match const with | Const_base (Const_int c) -> (Const (Int c), Names.const_int) | Const_base (Const_char c) -> (Const (Char c), Names.const_char) + | Const_base (Const_unboxed_float _ | Const_unboxed_int32 _ + | Const_unboxed_int64 _ | Const_unboxed_nativeint _) -> + (* CR alanechang: implement unboxed constants in flambda *) + Misc.fatal_error "Unboxed constants are not supported in flambda. Consider using flambda2." | Const_base (Const_string (s, _, _)) -> let const, name = (Flambda.Allocated_const (Immutable_string s), @@ -133,6 +133,8 @@ let rec declare_const t (const : Lambda.structured_constant) register_const t (Allocated_const (Float (float_of_string c))) Names.const_float + | Const_base (Const_float32 _ | Const_unboxed_float32 _) -> + Misc.fatal_error "float32 is not supported in flambda. Consider using flambda2." | Const_base (Const_int32 c) -> register_const t (Allocated_const (Int32 c)) Names.const_int32 @@ -219,7 +221,7 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = (* CR-soon mshinwell: some of this is now very similar to the let rec case below *) let set_of_closures_var = Variable.create Names.set_of_closures in - let params = List.map (fun (p : Lambda.lparam) -> let No_attributes = p.attributes in (p.name, p.layout)) params in + let params = List.map (fun (p : Lambda.lparam) -> (p.name, p.layout)) params in let set_of_closures = let decl = Function_decl.create ~let_rec_ident:None ~closure_bound_var ~kind ~mode @@ -258,74 +260,45 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = | Lletrec (defs, body) -> let env = - List.fold_right (fun (id, _) env -> + List.fold_right (fun { Lambda.id } env -> Env.add_var env id (Variable.create_with_same_name_as_ident id) Lambda.layout_letrec) defs env in let function_declarations = - (* Identify any bindings in the [let rec] that are functions. These - will be named after the corresponding identifier in the [let rec]. *) - List.map (function - | (let_rec_ident, - Lambda.Lfunction { kind; params; return; body; attr; loc; mode; region }) -> + (* Name functions *) + List.map (fun Lambda.{ id = let_rec_ident; + def = { kind; params; return; body; attr; loc; mode; region } } -> let closure_bound_var = Variable.create_with_same_name_as_ident let_rec_ident in - let params = List.map (fun (p : Lambda.lparam) -> let No_attributes = p.attributes in (p.name, p.layout)) params in - let function_declaration = - Function_decl.create ~let_rec_ident:(Some let_rec_ident) - ~closure_bound_var ~kind ~mode ~region - ~params ~body ~attr ~loc ~return_layout:return - in - Some function_declaration - | _ -> None) + let params = List.map (fun (p : Lambda.lparam) -> (p.name, p.layout)) params in + Function_decl.create ~let_rec_ident:(Some let_rec_ident) + ~closure_bound_var ~kind ~mode ~region + ~params ~body ~attr ~loc ~return_layout:return) defs in - begin match - Misc.Stdlib.List.some_if_all_elements_are_some function_declarations - with - | Some function_declarations -> - (* When all the bindings are (syntactically) functions, we can - eliminate the [let rec] construction, instead producing a normal - [Let] that binds a set of closures containing all of the functions. - *) - (* CR-someday lwhite: This is a very syntactic criteria. Adding an - unused value to a set of recursive bindings changes how - functions are represented at runtime. *) - let set_of_closures_var = Variable.create (Names.set_of_closures) in - let set_of_closures = - close_functions t env (Function_decls.create function_declarations) - in - let body = - List.fold_left (fun body decl -> - let let_rec_ident = Function_decl.let_rec_ident decl in - let closure_bound_var = Function_decl.closure_bound_var decl in - let let_bound_var, _kind = Env.find_var env let_rec_ident in - (* Inside the body of the [let], each function is referred to by - a [Project_closure] expression, which projects from the set of - closures. *) - (Flambda.create_let let_bound_var - (Project_closure { - set_of_closures = set_of_closures_var; - closure_id = Closure_id.wrap closure_bound_var; - }) - body)) - (close t env body) function_declarations - in - Flambda.create_let set_of_closures_var set_of_closures body - | None -> - (* If the condition above is not satisfied, we build a [Let_rec] - expression; any functions bound by it will have their own - individual closures. *) - let defs = - List.map (fun (id, def) -> - let var, _kind = Env.find_var env id in - var, close_let_bound_expression t ~let_rec_ident:id var env def) - defs - in - Let_rec (defs, close t env body) - end + let set_of_closures_var = Variable.create (Names.set_of_closures) in + let set_of_closures = + close_functions t env (Function_decls.create function_declarations) + in + let body = + List.fold_left (fun body decl -> + let let_rec_ident = Function_decl.let_rec_ident decl in + let closure_bound_var = Function_decl.closure_bound_var decl in + let let_bound_var, _kind = Env.find_var env let_rec_ident in + (* Inside the body of the [let], each function is referred to by + a [Project_closure] expression, which projects from the set of + closures. *) + (Flambda.create_let let_bound_var + (Project_closure { + set_of_closures = set_of_closures_var; + closure_id = Closure_id.wrap closure_bound_var; + }) + body)) + (close t env body) function_declarations + in + Flambda.create_let set_of_closures_var set_of_closures body | Lsend (kind, meth, obj, args, reg_close, mode, loc, result_layout) -> let meth_var = Variable.create Names.meth in let obj_var = Variable.create Names.obj in @@ -451,6 +424,7 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = | Ostype_cygwin -> lambda_const_bool (String.equal Sys.os_type "Cygwin") | Backend_type -> Lambda.const_int 0 (* tag 0 is the same as Native *) + | Runtime5 -> lambda_const_bool Config.runtime5 end in close t env @@ -691,7 +665,7 @@ and close_let_bound_expression t ?let_rec_ident let_bound_var env (* Ensure that [let] and [let rec]-bound functions have appropriate names. *) let closure_bound_var = Variable.rename let_bound_var in - let params = List.map (fun (p : Lambda.lparam) -> let No_attributes = p.attributes in (p.name, p.layout)) params in + let params = List.map (fun (p : Lambda.lparam) -> (p.name, p.layout)) params in let decl = Function_decl.create ~let_rec_ident ~closure_bound_var ~kind ~mode ~region ~params ~body ~attr ~loc ~return_layout:return diff --git a/middle_end/flambda/closure_offsets.ml b/middle_end/flambda/closure_offsets.ml index f2f67611789..aec52c0ec6d 100644 --- a/middle_end/flambda/closure_offsets.ml +++ b/middle_end/flambda/closure_offsets.ml @@ -77,7 +77,7 @@ let add_closure_offsets Misc.fatal_error "[Pbottom] should have been eliminated as dead code \ and not stored in a closure." - | Punboxed_float -> true + | Punboxed_float _ -> true | Punboxed_int _ -> true | Punboxed_vector _ -> true | Pvalue Pintval -> true diff --git a/middle_end/flambda/effect_analysis.ml b/middle_end/flambda/effect_analysis.ml index 3ccfcdd4c73..e7b0ff368bd 100644 --- a/middle_end/flambda/effect_analysis.ml +++ b/middle_end/flambda/effect_analysis.ml @@ -29,9 +29,6 @@ let rec no_effects (flam : Flambda.t) = | Let { defining_expr; body; _ } -> no_effects_named defining_expr && no_effects body | Let_mutable { body } -> no_effects body - | Let_rec (defs, body) -> - no_effects body - && List.for_all (fun (_, def) -> no_effects_named def) defs | If_then_else (_, ifso, ifnot, _) -> no_effects ifso && no_effects ifnot | Switch (_, sw) -> let aux (_, flam) = no_effects flam in diff --git a/middle_end/flambda/extract_projections.ml b/middle_end/flambda/extract_projections.ml index 4a6add1253c..0feb3bd385a 100644 --- a/middle_end/flambda/extract_projections.ml +++ b/middle_end/flambda/extract_projections.ml @@ -106,7 +106,7 @@ let rec analyse_expr ~which_variables expr = | For { from_value; to_value; _ } -> check_free_variable from_value; check_free_variable to_value - | Let _ | Let_rec _ | Static_catch _ | While _ | Try_with _ + | Let _ | Static_catch _ | While _ | Try_with _ | Region _ | Exclave _ | Proved_unreachable -> () in diff --git a/middle_end/flambda/flambda.ml b/middle_end/flambda/flambda.ml index a43846e164b..66cf423af26 100644 --- a/middle_end/flambda/flambda.ml +++ b/middle_end/flambda/flambda.ml @@ -68,7 +68,6 @@ type t = | Var of Variable.t | Let of let_expr | Let_mutable of let_mutable - | Let_rec of (Variable.t * named) list * t | Apply of apply | Send of send | Assign of assign @@ -277,16 +276,6 @@ let rec lam ppf (flam : t) = Mutable_variable.print mut_var Variable.print var lam body - | Let_rec(id_arg_list, body) -> - let bindings ppf id_arg_list = - let spc = ref false in - List.iter - (fun (id, l) -> - if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[<2>%a@ %a@]" Variable.print id print_named l) - id_arg_list in - fprintf ppf - "@[<2>(letrec@ (@[%a@])@ %a)@]" bindings id_arg_list lam body | Switch(larg, sw) -> let switch ppf (sw : switch) = let spc = ref false in @@ -588,14 +577,6 @@ let rec variables_usage ?ignore_uses_as_callee ?ignore_uses_as_argument | Let_mutable { initial_value = var; body; _ } -> free_variable var; aux body - | Let_rec (bindings, body) -> - List.iter (fun (var, defining_expr) -> - bound_variable var; - free_variables - (variables_usage_named ?ignore_uses_in_project_var - ~all_used_variables defining_expr)) - bindings; - aux body | Switch (scrutinee, switch) -> free_variable scrutinee; List.iter (fun (_, e) -> aux e) switch.consts; @@ -817,9 +798,6 @@ let iter_general ~toplevel f f_named maybe_named = | Let _ -> assert false | Let_mutable { body; _ } -> aux body - | Let_rec (defs, body) -> - List.iter (fun (_,l) -> aux_named l) defs; - aux body | Try_with (f1,_,f2, _) | While (f1,f2) | Static_catch (_,_,f1,f2, _) -> diff --git a/middle_end/flambda/flambda.mli b/middle_end/flambda/flambda.mli index 03133a8473c..31178c1fa17 100644 --- a/middle_end/flambda/flambda.mli +++ b/middle_end/flambda/flambda.mli @@ -102,8 +102,6 @@ type t = | Var of Variable.t | Let of let_expr | Let_mutable of let_mutable - | Let_rec of (Variable.t * named) list * t - (** CR-someday lwhite: give Let_rec the same fields as Let. *) | Apply of apply | Send of send | Assign of assign diff --git a/middle_end/flambda/flambda_invariants.ml b/middle_end/flambda/flambda_invariants.ml index 37520f2e7f2..85383ae0e05 100644 --- a/middle_end/flambda/flambda_invariants.ml +++ b/middle_end/flambda/flambda_invariants.ml @@ -29,8 +29,6 @@ type flambda_kind = *) (* CR-someday pchambart: for sum types, we should probably add an exhaustive pattern in ignores functions to be reminded if a type change *) -let already_added_bound_variable_to_env (_ : Variable.t) = () -let will_traverse_named_expression_later (_ : Flambda.named) = () let ignore_variable (_ : Variable.t) = () let ignore_call_kind (_ : Flambda.call_kind) = () let ignore_debuginfo (_ : Debuginfo.t) = () @@ -161,17 +159,6 @@ let variable_and_symbol_invariants (program : Flambda.program) = ignore_layout contents_kind; check_variable_is_bound env var; loop (add_mutable_binding_occurrence env mut_var) body - | Let_rec (defs, body) -> - let env = - List.fold_left (fun env (var, def) -> - will_traverse_named_expression_later def; - add_binding_occurrence env var) - env defs - in - List.iter (fun (var, def) -> - already_added_bound_variable_to_env var; - loop_named env def) defs; - loop env body | For { bound_var; from_value; to_value; direction; body; } -> ignore_direction_flag direction; check_variable_is_bound env from_value; diff --git a/middle_end/flambda/flambda_iterators.ml b/middle_end/flambda/flambda_iterators.ml index 2731b1650cd..f975dcbdfca 100644 --- a/middle_end/flambda/flambda_iterators.ml +++ b/middle_end/flambda/flambda_iterators.ml @@ -26,9 +26,6 @@ let apply_on_subexpressions f f_named (flam : Flambda.t) = f body | Let_mutable { body; _ } -> f body - | Let_rec (defs, body) -> - List.iter (fun (_,l) -> f_named l) defs; - f body | Switch (_, sw) -> List.iter (fun (_,l) -> f l) sw.consts; List.iter (fun (_,l) -> f l) sw.blocks; @@ -87,15 +84,6 @@ let map_subexpressions f f_named (tree:Flambda.t) : Flambda.t = tree else Flambda.create_let var new_named new_body - | Let_rec (defs, body) -> - let new_defs = - list_map_sharing (map_snd_sharing f_named) defs - in - let new_body = f body in - if new_defs == defs && new_body == body then - tree - else - Let_rec (new_defs, new_body) | Let_mutable mutable_let -> let new_body = f mutable_let.body in if new_body == mutable_let.body then @@ -190,18 +178,16 @@ let iter_toplevel f f_named t = let iter_named_toplevel f f_named named = iter_general ~toplevel:true f f_named (Is_named named) -let iter_all_immutable_let_and_let_rec_bindings t ~f = +let iter_all_immutable_let_bindings t ~f = iter_expr (function | Let { var; defining_expr; _ } -> f var defining_expr - | Let_rec (defs, _) -> List.iter (fun (var, named) -> f var named) defs | _ -> ()) t -let iter_all_toplevel_immutable_let_and_let_rec_bindings t ~f = +let iter_all_toplevel_immutable_let_bindings t ~f = iter_general ~toplevel:true (function | Let { var; defining_expr; _ } -> f var defining_expr - | Let_rec (defs, _) -> List.iter (fun (var, named) -> f var named) defs | _ -> ()) (fun _ -> ()) (Is_expr t) @@ -313,18 +299,6 @@ let map_general ~toplevel f f_named tree = tree else Let_mutable { mutable_let with body = new_body } - | Let_rec (defs, body) -> - let done_something = ref false in - let defs = - List.map (fun (id, lam) -> - id, aux_named_done_something id lam done_something) - defs - in - let body = aux_done_something body done_something in - if not !done_something then - tree - else - Let_rec (defs, body) | Switch (arg, sw) -> let done_something = ref false in let sw = @@ -459,12 +433,6 @@ let map_general ~toplevel f f_named tree = else Expr new_expr in f_named id named - and aux_named_done_something id named done_something = - let new_named = aux_named id named in - if not (new_named == named) then begin - done_something := true - end; - new_named in aux tree diff --git a/middle_end/flambda/flambda_iterators.mli b/middle_end/flambda/flambda_iterators.mli index 02fe6850979..93168ecf071 100644 --- a/middle_end/flambda/flambda_iterators.mli +++ b/middle_end/flambda/flambda_iterators.mli @@ -95,12 +95,12 @@ val iter_on_set_of_closures_of_program -> f:(constant:bool -> Flambda.set_of_closures -> unit) -> unit -val iter_all_immutable_let_and_let_rec_bindings +val iter_all_immutable_let_bindings : Flambda.t -> f:(Variable.t -> Flambda.named -> unit) -> unit -val iter_all_toplevel_immutable_let_and_let_rec_bindings +val iter_all_toplevel_immutable_let_bindings : Flambda.t -> f:(Variable.t -> Flambda.named -> unit) -> unit diff --git a/middle_end/flambda/flambda_to_clambda.ml b/middle_end/flambda/flambda_to_clambda.ml index 39e02a4bcb1..523a9914531 100644 --- a/middle_end/flambda/flambda_to_clambda.ml +++ b/middle_end/flambda/flambda_to_clambda.ml @@ -79,7 +79,7 @@ let check_closure t ulam named : Clambda.ulambda = if not !Clflags.clambda_checks then ulam else let desc = - Primitive.simple_on_values ~name:"caml_check_value_is_closure" + Lambda.simple_prim_on_values ~name:"caml_check_value_is_closure" ~arity:2 ~alloc:false in let str = Format.asprintf "%a" Flambda.print_named named in @@ -108,7 +108,7 @@ let check_field t ulam pos named_opt : Clambda.ulambda = if not !Clflags.clambda_checks then ulam else let desc = - Primitive.simple_on_values ~name:"caml_check_field_access" + Lambda.simple_prim_on_values ~name:"caml_check_field_access" ~arity:3 ~alloc:false in let str = @@ -258,22 +258,6 @@ let rec to_clambda t env (flam : Flambda.t) : Clambda.ulambda * Lambda.layout = assert(Lambda.compatible_layout def_layout contents_kind); let body, body_layout = to_clambda t env_body body in Ulet (Mutable, contents_kind, VP.create id, def, body), body_layout - | Let_rec (defs, body) -> - let env, defs = - List.fold_right (fun (var, def) (env, defs) -> - let id, env = Env.add_fresh_ident env var Lambda.layout_letrec in - env, (id, var, def) :: defs) - defs (env, []) - in - let defs = - List.map (fun (id, var, def) -> - let def, def_layout = to_clambda_named t env var def in - assert(Lambda.compatible_layout def_layout Lambda.layout_letrec); - VP.create id, def) - defs - in - let body, body_layout = to_clambda t env body in - Uletrec (defs, body), body_layout | Apply { func; args; kind = Direct direct_func; probe; dbg; reg_close; mode; result_layout } -> (* The closure _parameter_ of the function is added by cmmgen. At the call site, for a direct call, the closure argument must be @@ -518,7 +502,7 @@ and to_clambda_named t env var (named : Flambda.named) : Clambda.ulambda * Lambd let block, _block_layout = subst_var env block in Uprim (Pfield (index, layout, ptr, mut), [check_field t block index None], dbg), - Lambda.layout_field + Lambda.layout_value_field | Prim (Psetfield (index, maybe_ptr, init), [block; new_value], dbg) -> let block, _block_layout = subst_var env block in let new_value, _new_value_layout = subst_var env new_value in @@ -710,7 +694,7 @@ and to_clambda_set_of_closures t env Misc.fatal_error "[Pbottom] should have been eliminated as dead code \ and not stored in a closure." - | Punboxed_float -> true + | Punboxed_float _ -> true | Punboxed_int _ -> true | Punboxed_vector _ -> true | Pvalue Pintval -> true diff --git a/middle_end/flambda/flambda_utils.ml b/middle_end/flambda/flambda_utils.ml index d92e832e4a0..2d7cf011f63 100644 --- a/middle_end/flambda/flambda_utils.ml +++ b/middle_end/flambda/flambda_utils.ml @@ -68,7 +68,6 @@ let description_of_toplevel_node (expr : Flambda.t) = | Proved_unreachable -> "unreachable" | Let { var; _ } -> Format.asprintf "let %a" Variable.print var | Let_mutable _ -> "let_mutable" - | Let_rec _ -> "letrec" | If_then_else _ -> "if" | Switch _ -> "switch" | String_switch _ -> "stringswitch" @@ -112,9 +111,6 @@ let rec same (l1 : Flambda.t) (l2 : Flambda.t) = && Lambda.equal_layout ck1 ck2 && same b1 b2 | Let_mutable _, _ | _, Let_mutable _ -> false - | Let_rec (bl1, a1), Let_rec (bl2, a2) -> - Misc.Stdlib.List.equal samebinding bl1 bl2 && same a1 a2 - | Let_rec _, _ | _, Let_rec _ -> false | Switch (a1, s1), Switch (a2, s2) -> Variable.equal a1 a2 && sameswitch s1 s2 | Switch _, _ | _, Switch _ -> false @@ -235,9 +231,6 @@ and same_move_within_set_of_closures (m1 : Flambda.move_within_set_of_closures) && Closure_id.equal m1.start_from m2.start_from && Closure_id.equal m1.move_to m2.move_to -and samebinding (v1, n1) (v2, n2) = - Variable.equal v1 v2 && same_named n1 n2 - and sameswitch (fs1 : Flambda.switch) (fs2 : Flambda.switch) = let samecase (n1, a1) (n2, a2) = n1 = n2 && same a1 a2 in Numbers.Int.Set.equal fs1.numconsts fs2.numconsts @@ -292,7 +285,7 @@ let toplevel_substitution sb tree = let args = List.map sb args in Static_raise (static_exn, args) | Static_catch _ | Try_with _ | While _ | Region _ | Exclave _ - | Let _ | Let_rec _ | Proved_unreachable -> flam + | Let _ | Proved_unreachable -> flam in let aux_named (named : Flambda.named) : Flambda.named = match named with @@ -658,35 +651,6 @@ let substitute_read_symbol_field_for_variables (Let_mutable { let_mutable with initial_value = fresh }) | Let_mutable _ -> expr - | Let_rec (defs, body) -> - let free_variables_of_defs = - List.fold_left (fun set (_, named) -> - Variable.Set.union set (Flambda.free_variables_named named)) - Variable.Set.empty defs - in - let to_substitute = - Variable.Set.filter - (fun v -> Variable.Map.mem v substitution) - free_variables_of_defs - in - if Variable.Set.is_empty to_substitute then - expr - else begin - let bindings = - Variable.Map.of_set (fun var -> Variable.rename var) to_substitute - in - let defs = - List.map (fun (var, named) -> - var, substitute_named bindings named) - defs - in - let expr = - Flambda.Let_rec (defs, body) - in - Variable.Map.fold (fun to_substitute fresh expr -> - bind to_substitute fresh expr) - bindings expr - end | If_then_else (cond, ifso, ifnot, kind) when Variable.Map.mem cond substitution -> let fresh = Variable.rename cond in diff --git a/middle_end/flambda/freshening.ml b/middle_end/flambda/freshening.ml index e8c1105c1c7..a53bc660da3 100644 --- a/middle_end/flambda/freshening.ml +++ b/middle_end/flambda/freshening.ml @@ -158,6 +158,11 @@ let add_variables t defs = let id', t = add_variable t id in (id', data) :: defs, t) defs ([], t) +let add_variables3 t defs = + List.fold_right (fun (id, data1, data2) (defs, t) -> + let id', t = add_variable t id in + (id', data1, data2) :: defs, t) defs ([], t) + let add_variables' t ids = List.fold_right (fun id (ids, t) -> let id', t = add_variable t id in diff --git a/middle_end/flambda/freshening.mli b/middle_end/flambda/freshening.mli index 9ccde4f2120..ddaf8966e71 100644 --- a/middle_end/flambda/freshening.mli +++ b/middle_end/flambda/freshening.mli @@ -62,6 +62,13 @@ val add_variables -> (Variable.t * 'a) list -> (Variable.t * 'a) list * t +(** Like [add_variables'], but passes through the other components of the + input list unchanged. *) +val add_variables3 + : t + -> (Variable.t * 'a * 'b) list + -> (Variable.t * 'a * 'b) list * t + (** Like [add_variable], but for mutable variables. *) val add_mutable_variable : t -> Mutable_variable.t -> Mutable_variable.t * t diff --git a/middle_end/flambda/inconstant_idents.ml b/middle_end/flambda/inconstant_idents.ml index 204ea6aa823..de48ebbcc1b 100644 --- a/middle_end/flambda/inconstant_idents.ml +++ b/middle_end/flambda/inconstant_idents.ml @@ -235,13 +235,6 @@ module Inconstants (P:Param) (Backend:Backend_intf.S) = struct | Let_mutable { initial_value = var; body } -> mark_var var curr; mark_loop ~toplevel curr body - | Let_rec(defs, body) -> - List.iter (fun (var, def) -> - mark_named ~toplevel [Var var] def; - (* adds 'var in NC => curr in NC' same remark as let case *) - mark_var var curr) - defs; - mark_loop ~toplevel curr body | Var var -> mark_var var curr (* Not constant cases: we mark directly 'curr in NC' and mark bound variables as in NC also *) diff --git a/middle_end/flambda/inline_and_simplify.ml b/middle_end/flambda/inline_and_simplify.ml index aa35f26d0f3..42e3b006c69 100644 --- a/middle_end/flambda/inline_and_simplify.ml +++ b/middle_end/flambda/inline_and_simplify.ml @@ -1118,6 +1118,8 @@ and simplify_named env r (tree : Flambda.named) : Flambda.named * R.t = Misc.fatal_errorf "Assignment of a float to a specialised \ non-float array: %a" Flambda.print_named tree + | Punboxedfloatarray_set _ | Punboxedintarray_set _ -> + Misc.fatal_errorf "Unboxed arrays not supported" in match A.descr block_approx, A.descr value_approx with | (Value_float_array _, _) -> check (); Lambda.Pfloatarray_set @@ -1215,24 +1217,6 @@ and simplify env r (tree : Flambda.t) : Flambda.t * R.t = body; contents_kind }, r) - | Let_rec (defs, body) -> - let defs, sb = Freshening.add_variables (E.freshening env) defs in - let env = E.set_freshening env sb in - let def_env = - List.fold_left (fun env_acc (id, _lam) -> - E.add env_acc id (A.value_unknown Other)) - env defs - in - let defs, body_env, r = - List.fold_right (fun (id, lam) (defs, env_acc, r) -> - let lam, r = simplify_named def_env r lam in - let defs = (id, lam) :: defs in - let env_acc = E.add env_acc id (R.approx r) in - defs, env_acc, r) - defs ([], env, r) - in - let body, r = simplify body_env r body in - Let_rec (defs, body), r | Static_raise (i, args) -> let i = Freshening.apply_static_exception (E.freshening env) i in simplify_free_variables env args ~f:(fun _env args _args_approxs -> diff --git a/middle_end/flambda/inlining_cost.ml b/middle_end/flambda/inlining_cost.ml index 7957aa41a0c..5ebee65aaeb 100644 --- a/middle_end/flambda/inlining_cost.ml +++ b/middle_end/flambda/inlining_cost.ml @@ -90,9 +90,6 @@ let lambda_smaller' lam ~than:threshold = lambda_named_size defining_expr; lambda_size body | Let_mutable { body } -> lambda_size body - | Let_rec (bindings, body) -> - List.iter (fun (_, lam) -> lambda_named_size lam) bindings; - lambda_size body | Switch (_, sw) -> let cost cases = let size = List.length cases in @@ -275,7 +272,7 @@ module Benefit = struct | Switch _ | String_switch _ | Static_raise _ | Try_with _ | If_then_else _ | While _ | For _ -> b := remove_branch !b | Apply _ | Send _ -> b := remove_call !b - | Let _ | Let_mutable _ | Let_rec _ | Proved_unreachable | Var _ + | Let _ | Let_mutable _ | Proved_unreachable | Var _ | Region _ | Exclave _ | Static_catch _ -> () let remove_code_helper_named b (named : Flambda.named) = diff --git a/middle_end/flambda/invariant_params.ml b/middle_end/flambda/invariant_params.ml index 890f65b6c3b..a126d25caab 100644 --- a/middle_end/flambda/invariant_params.ml +++ b/middle_end/flambda/invariant_params.ml @@ -136,7 +136,7 @@ let function_variable_alias in let fun_var_bindings = ref Variable.Map.empty in Variable.Map.iter (fun _ ( function_decl : Flambda.function_declaration ) -> - Flambda_iterators.iter_all_toplevel_immutable_let_and_let_rec_bindings + Flambda_iterators.iter_all_toplevel_immutable_let_bindings ~f:(fun var named -> (* CR-soon mshinwell: consider having the body passed to this function and using fv calculation instead of used_variables. diff --git a/middle_end/flambda/lift_code.ml b/middle_end/flambda/lift_code.ml index cd56a4c2185..785c2ae9cf1 100644 --- a/middle_end/flambda/lift_code.ml +++ b/middle_end/flambda/lift_code.ml @@ -118,41 +118,7 @@ and lift_lets_named _var (named:Flambda.named) ~toplevel : Flambda.named = | Project_var _ | Prim _ | Set_of_closures _ -> named -module Sort_lets = Strongly_connected_components.Make (Variable) - -let rebuild_let_rec (defs:(Variable.t * Flambda.named) list) body = - let map = Variable.Map.of_list defs in - let graph = - Variable.Map.map - (fun named -> - Variable.Set.filter (fun v -> Variable.Map.mem v map) - (Flambda.free_variables_named named)) - map - in - let components = - Sort_lets.connected_components_sorted_from_roots_to_leaf graph - in - Array.fold_left (fun body (component:Sort_lets.component) -> - match component with - | No_loop v -> - let def = Variable.Map.find v map in - Flambda.create_let v def body - | Has_loop l -> - Flambda.Let_rec - (List.map (fun v -> v, Variable.Map.find v map) l, - body)) - body components - -let lift_let_rec program = - Flambda_iterators.map_exprs_at_toplevel_of_program program - ~f:(Flambda_iterators.map_expr - (fun expr -> match expr with - | Let_rec (defs, body) -> - rebuild_let_rec defs body - | expr -> expr)) - let lift_lets program = - let program = lift_let_rec program in Flambda_iterators.map_exprs_at_toplevel_of_program program ~f:(lift_lets_expr ~toplevel:false) diff --git a/middle_end/flambda/lift_constants.ml b/middle_end/flambda/lift_constants.ml index 0c4e2cb52cd..8abdd366f68 100644 --- a/middle_end/flambda/lift_constants.ml +++ b/middle_end/flambda/lift_constants.ml @@ -20,7 +20,6 @@ open! Int_replace_polymorphic_compare (* CR-someday mshinwell: move to Flambda_utils *) let rec tail_variable : Flambda.t -> Variable.t option = function | Var v -> Some v - | Let_rec (_, e) | Let_mutable { body = e } | Let { body = e; _ } -> tail_variable e | _ -> None @@ -112,7 +111,7 @@ let assign_symbols_and_collect_constant_definitions end in let assign_symbol_program expr = - Flambda_iterators.iter_all_immutable_let_and_let_rec_bindings expr + Flambda_iterators.iter_all_immutable_let_bindings expr ~f:assign_symbol in Flambda_iterators.iter_exprs_at_toplevel_of_program program diff --git a/middle_end/flambda/lift_let_to_initialize_symbol.ml b/middle_end/flambda/lift_let_to_initialize_symbol.ml index 77c4a07ffd9..a6c416a34c8 100644 --- a/middle_end/flambda/lift_let_to_initialize_symbol.ml +++ b/middle_end/flambda/lift_let_to_initialize_symbol.ml @@ -28,7 +28,6 @@ let should_copy (named:Flambda.named) = type extracted = | Expr of Variable.t * Flambda.t - | Exprs of Variable.t list * Flambda.t | Block of Variable.t * Tag.t * Variable.t list type accumulated = { @@ -40,26 +39,12 @@ type accumulated = { let rec accumulate ~substitution ~copied_lets ~extracted_lets (expr : Flambda.t) = match expr with - | Let { var; body = Var var'; _ } | Let_rec ([var, _], Var var') + | Let { var; body = Var var'; _ } when Variable.equal var var' -> { copied_lets; extracted_lets; terminator = Flambda_utils.toplevel_substitution substitution expr; } - (* If the pattern is what lifting let_rec generates, prevent it from being - lifted again. *) - | Let_rec (defs, - Let { var; body = Var var'; - defining_expr = Prim (Pmakeblock _, fields, _); }) - when - Variable.equal var var' - && List.for_all (fun field -> - List.exists (fun (def_var, _) -> Variable.equal def_var field) defs) - fields -> - { copied_lets; extracted_lets; - terminator = Flambda_utils.toplevel_substitution substitution expr; - } - | Let { var; defining_expr = Expr (Var alias); body; _ } - | Let_rec ([var, Expr (Var alias)], body) -> + | Let { var; defining_expr = Expr (Var alias); body; _ } -> let alias = match Variable.Map.find alias substitution with | exception Not_found -> alias @@ -71,7 +56,6 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets ~extracted_lets body | Let { var; defining_expr = named; body; _ } - | Let_rec ([var, named], body) when should_copy named -> accumulate body ~substitution @@ -103,43 +87,6 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets ~substitution ~copied_lets ~extracted_lets:(extracted::extracted_lets) - | Let_rec ([var, named], body) -> - let renamed = Variable.rename var in - let def_substitution = Variable.Map.add var renamed substitution in - let expr = - Flambda_utils.toplevel_substitution def_substitution - (Let_rec ([renamed, named], Var renamed)) - in - let extracted = Expr (var, expr) in - accumulate body - ~substitution - ~copied_lets - ~extracted_lets:(extracted::extracted_lets) - | Let_rec (defs, body) -> - let renamed_defs, def_substitution = - List.fold_right (fun (var, def) (acc, substitution) -> - let new_var = Variable.rename var in - (new_var, def) :: acc, - Variable.Map.add var new_var substitution) - defs ([], substitution) - in - let extracted = - let expr = - let name = Internal_variable_names.lifted_let_rec_block in - Flambda_utils.toplevel_substitution def_substitution - (Let_rec (renamed_defs, - Flambda_utils.name_expr ~name - (Prim (Pmakeblock (0, Immutable, None, - Lambda.alloc_heap), - List.map fst renamed_defs, - Debuginfo.none)))) - in - Exprs (List.map fst defs, expr) - in - accumulate body - ~substitution - ~copied_lets - ~extracted_lets:(extracted::extracted_lets) | _ -> { copied_lets; extracted_lets; @@ -177,11 +124,7 @@ let rebuild (used_variables:Variable.Set.t) (accumulated:accumulated) = List.map (fun decl -> match decl with | Block (var, _, _) | Expr (var, _) -> - Symbol_utils.Flambda.for_variable (Variable.rename var), decl - | Exprs _ -> - let name = Internal_variable_names.lifted_let_rec_block in - let var = Variable.create name in - Symbol_utils.Flambda.for_variable var, decl) + Symbol_utils.Flambda.for_variable (Variable.rename var), decl) accumulated.extracted_lets in let extracted_definitions = @@ -201,15 +144,7 @@ let rebuild (used_variables:Variable.Set.t) (accumulated:accumulated) = | Block (var, _tag, _fields) -> Variable.Map.add var (symbol, []) map | Expr (var, _expr) -> - Variable.Map.add var (symbol, [0]) map - | Exprs (vars, _expr) -> - let map, _ = - List.fold_left (fun (map, field) var -> - Variable.Map.add var (symbol, [field; 0]) map, - field + 1) - (map, 0) vars - in - map) + Variable.Map.add var (symbol, [0]) map) Variable.Map.empty accumulated_extracted_lets in let extracted = @@ -227,12 +162,6 @@ let rebuild (used_variables:Variable.Set.t) (accumulated:accumulated) = [expr]) else Effect expr - | Exprs (_vars, decl) -> - let expr = - rebuild_expr ~extracted_definitions ~copied_definitions - ~substitute:true decl - in - Initialisation (symbol, Tag.create_exn 0, [expr]) | Block (_var, tag, fields) -> let fields = List.map (fun var -> diff --git a/middle_end/flambda/ref_to_variables.ml b/middle_end/flambda/ref_to_variables.ml index 25d67eef1b1..1c6c538c40d 100644 --- a/middle_end/flambda/ref_to_variables.ml +++ b/middle_end/flambda/ref_to_variables.ml @@ -44,9 +44,6 @@ let variables_not_used_as_local_reference (tree:Flambda.t) = | Let { defining_expr; body; _ } -> loop_named defining_expr; loop body - | Let_rec (defs, body) -> - List.iter (fun (_var, named) -> loop_named named) defs; - loop body | Var v -> set := Variable.Set.add v !set | Let_mutable { initial_value = v; body } -> @@ -152,7 +149,7 @@ let eliminate_ref_of_expr flam = expr | Let _ | Let_mutable _ | Assign _ | Var _ | Apply _ - | Let_rec _ | Switch _ | String_switch _ + | Switch _ | String_switch _ | Static_raise _ | Static_catch _ | Try_with _ | If_then_else _ | While _ | For _ | Region _ | Exclave _ | Send _ | Proved_unreachable -> diff --git a/middle_end/flambda/simple_value_approx.ml b/middle_end/flambda/simple_value_approx.ml index 45b6e039917..70c2efa13db 100644 --- a/middle_end/flambda/simple_value_approx.ml +++ b/middle_end/flambda/simple_value_approx.ml @@ -253,7 +253,7 @@ let replace_description t descr = { t with descr } let augment_with_kind t (kind:Lambda.value_kind) = match kind with | Pgenval -> t - | Pfloatval -> + | Pboxedfloatval Pfloat64 -> begin match t.descr with | Value_float _ -> t @@ -278,7 +278,7 @@ let augment_with_kind t (kind:Lambda.value_kind) = let augment_kind_with_approx t (kind:Lambda.value_kind) : Lambda.value_kind = match t.descr with - | Value_float _ -> Pfloatval + | Value_float _ -> Pboxedfloatval Pfloat64 | Value_int _ -> Pintval | Value_boxed_int (Int32, _) -> Pboxedintval Pint32 | Value_boxed_int (Int64, _) -> Pboxedintval Pint64 @@ -375,7 +375,7 @@ let value_mutable_float_array ~size = let value_immutable_float_array (contents:t array) = let size = Array.length contents in let contents = - Array.map (fun t -> augment_with_kind t Pfloatval) contents + Array.map (fun t -> augment_with_kind t (Pboxedfloatval Pfloat64)) contents in approx (Value_float_array { contents = Contents contents; size; } ) diff --git a/middle_end/flambda/simplify_primitives.ml b/middle_end/flambda/simplify_primitives.ml index 31e711d08a1..d6d3e973e24 100644 --- a/middle_end/flambda/simplify_primitives.ml +++ b/middle_end/flambda/simplify_primitives.ml @@ -174,7 +174,8 @@ let primitive (p : Clambda_primitives.primitive) (args, approxs) | Pbswap16 -> S.const_int_expr expr (S.swap16 x) | Pisint -> S.const_bool_expr expr true | Poffsetint y -> S.const_int_expr expr (x + y) - | Pfloatofint _ when fpc -> S.const_float_expr expr (float_of_int x) + | Pfloatofint (Pfloat64, _) when fpc -> + S.const_float_expr expr (float_of_int x) | Pbintofint (Pnativeint,_) -> S.const_boxed_int_expr expr Nativeint (Nativeint.of_int x) | Pbintofint (Pint32,_) -> S.const_boxed_int_expr expr Int32 (Int32.of_int x) @@ -208,19 +209,19 @@ let primitive (p : Clambda_primitives.primitive) (args, approxs) end | [Value_float (Some x)] when fpc -> begin match p with - | Pintoffloat -> S.const_int_expr expr (int_of_float x) - | Pnegfloat _ -> S.const_float_expr expr (-. x) - | Pabsfloat _ -> S.const_float_expr expr (abs_float x) + | Pintoffloat Pfloat64 -> S.const_int_expr expr (int_of_float x) + | Pnegfloat (Pfloat64, _) -> S.const_float_expr expr (-. x) + | Pabsfloat (Pfloat64, _) -> S.const_float_expr expr (abs_float x) | _ -> expr, A.value_unknown Other, C.Benefit.zero end | [Value_float (Some n1); Value_float (Some n2)] when fpc -> begin match p with - | Paddfloat _ -> S.const_float_expr expr (n1 +. n2) - | Psubfloat _ -> S.const_float_expr expr (n1 -. n2) - | Pmulfloat _ -> S.const_float_expr expr (n1 *. n2) - | Pdivfloat _ -> S.const_float_expr expr (n1 /. n2) - | Pfloatcomp c -> S.const_float_comparison_expr expr c n1 n2 - | Pcompare_floats -> S.const_int_expr expr (Float.compare n1 n2) + | Paddfloat (Pfloat64, _) -> S.const_float_expr expr (n1 +. n2) + | Psubfloat (Pfloat64, _) -> S.const_float_expr expr (n1 -. n2) + | Pmulfloat (Pfloat64, _) -> S.const_float_expr expr (n1 *. n2) + | Pdivfloat (Pfloat64, _) -> S.const_float_expr expr (n1 /. n2) + | Pfloatcomp (Pfloat64, c) -> S.const_float_comparison_expr expr c n1 n2 + | Pcompare_floats Pfloat64 -> S.const_int_expr expr (Float.compare n1 n2) | _ -> expr, A.value_unknown Other, C.Benefit.zero end | [A.Value_boxed_int(A.Nativeint, n)] -> diff --git a/middle_end/flambda/un_anf.ml b/middle_end/flambda/un_anf.ml index 7bfc7a46cc6..1b8e0ffbef1 100644 --- a/middle_end/flambda/un_anf.ml +++ b/middle_end/flambda/un_anf.ml @@ -175,12 +175,6 @@ let make_var_info (clam : Clambda.ulambda) : var_info = ignore_var_with_provenance var; ignore_uphantom_defining_expr_option defining_expr_opt; loop ~depth body - | Uletrec (defs, body) -> - List.iter (fun (var, def) -> - ignore_var_with_provenance var; - loop ~depth def) - defs; - loop ~depth body | Uprim (prim, args, dbg) -> ignore_primitive prim; List.iter (loop ~depth) args; @@ -369,16 +363,6 @@ let let_bound_vars_that_can_be_moved var_info (clam : Clambda.ulambda) = | Uphantom_let (var, _defining_expr, body) -> ignore_var_with_provenance var; loop body - | Uletrec (defs, body) -> - (* Evaluation order for [defs] is not defined, and this case - probably isn't important for [Cmmgen] anyway. *) - let_stack := []; - List.iter (fun (var, def) -> - ignore_var_with_provenance var; - loop def; - let_stack := []) - defs; - loop body | Uprim (prim, args, dbg) -> ignore_primitive prim; examine_argument_list args; @@ -554,14 +538,6 @@ let rec substitute_let_moveable is_let_moveable env (clam : Clambda.ulambda) | Uphantom_let (var, defining_expr, body) -> let body = substitute_let_moveable is_let_moveable env body in Uphantom_let (var, defining_expr, body) - | Uletrec (defs, body) -> - let defs = - List.map (fun (var, def) -> - var, substitute_let_moveable is_let_moveable env def) - defs - in - let body = substitute_let_moveable is_let_moveable env body in - Uletrec (defs, body) | Uprim (prim, args, dbg) -> let args = substitute_let_moveable_list is_let_moveable env args in Uprim (prim, args, dbg) @@ -785,12 +761,6 @@ let rec un_anf_and_moveable var_info env (clam : Clambda.ulambda) | Uphantom_let (var, defining_expr, body) -> let body, body_moveable = un_anf_and_moveable var_info env body in Uphantom_let (var, defining_expr, body), body_moveable - | Uletrec (defs, body) -> - let defs = - List.map (fun (var, def) -> var, un_anf var_info env def) defs - in - let body = un_anf var_info env body in - Uletrec (defs, body), Fixed | Uprim (prim, args, dbg) -> let args, args_moveable = un_anf_list_and_moveable var_info env args in let moveable = diff --git a/middle_end/internal_variable_names.ml b/middle_end/internal_variable_names.ml index b3e54931e58..22d47ef00b7 100644 --- a/middle_end/internal_variable_names.ml +++ b/middle_end/internal_variable_names.ml @@ -91,6 +91,7 @@ let pbigstring_set_32 = "Pbigstring_set_32" let pbigstring_set_64 = "Pbigstring_set_64" let pbigstring_set_128 = "Pbigstring_set_128" let pbintcomp = "Pbintcomp" +let punboxed_int_comp = "Punboxed_int_comp" let pbintofint = "Pbintofint" let pbswap16 = "Pbswap16" let pbytes_of_string = "Pbytes_of_string" @@ -119,9 +120,13 @@ let pduprecord = "Pduprecord" let pfield = "Pfield" let pfield_computed = "Pfield_computed" let pfloatcomp = "Pfloatcomp" +let punboxed_float_comp = "Punboxed_float_comp" let pfloatfield = "Pfloatfield" let pufloatfield = "Pufloatfield" +let pmixedfield = "Pmixedfield" let pfloatofint = "Pfloatofint" +let pfloat32offloat = "Pfloat32offloat" +let pfloatoffloat32 = "Pfloatoffloat32" let pgetglobal = "Pgetglobal" let pgetpredef = "Pgetpredef" let pignore = "Pignore" @@ -144,6 +149,7 @@ let pmakearray = "Pmakearray" let pmakeblock = "Pmakeblock" let pmakefloatblock = "Pmakefloatblock" let pmakeufloatblock = "Pmakeufloatblock" +let pmakemixedblock = "Pmakemixedblock" let pmodbint = "Pmodbint" let pmodint = "Pmodint" let pmulbint = "Pmulbint" @@ -168,6 +174,7 @@ let psetfield = "Psetfield" let psetfield_computed = "Psetfield_computed" let psetfloatfield = "Psetfloatfield" let psetufloatfield = "Psetufloatfield" +let psetmixedfield = "Psetmixedfield" let psetglobal = "Psetglobal" let pstring_load_16 = "Pstring_load_16" let pstring_load_32 = "Pstring_load_32" @@ -222,6 +229,7 @@ let pbigstring_set_32_arg = "Pbigstring_set_32_arg" let pbigstring_set_64_arg = "Pbigstring_set_64_arg" let pbigstring_set_128_arg = "Pbigstring_set_128_arg" let pbintcomp_arg = "Pbintcomp_arg" +let punboxed_int_comp_arg = "Punboxed_int_comp_arg" let pbintofint_arg = "Pbintofint_arg" let pbswap16_arg = "Pbswap16_arg" let pbytes_of_string_arg = "Pbytes_of_string_arg" @@ -242,9 +250,13 @@ let pduprecord_arg = "Pduprecord_arg" let pfield_arg = "Pfield_arg" let pfield_computed_arg = "Pfield_computed_arg" let pfloatcomp_arg = "Pfloatcomp_arg" +let punboxed_float_comp_arg = "Punboxed_float_comp_arg" let pfloatfield_arg = "Pfloatfield_arg" let pufloatfield_arg = "Pufloatfield_arg" +let pmixedfield_arg = "Pmixedfield_arg" let pfloatofint_arg = "Pfloatofint_arg" +let pfloatoffloat32_arg = "Pfloatoffloat32_arg" +let pfloat32offloat_arg = "Pfloat32offloat_arg" let pgetglobal_arg = "Pgetglobal_arg" let pgetpredef_arg = "Pgetpredef_arg" let pobj_dup_arg = "Pobj_dup_arg" @@ -267,6 +279,7 @@ let pmakearray_arg = "Pmakearray_arg" let pmakeblock_arg = "Pmakeblock_arg" let pmakefloatblock_arg = "Pmakefloatblock_arg" let pmakeufloatblock_arg = "Pmakeufloatblock_arg" +let pmakemixedblock_arg = "Pmakemixedblock_arg" let pmodbint_arg = "Pmodbint_arg" let pmodint_arg = "Pmodint_arg" let pmulbint_arg = "Pmulbint_arg" @@ -288,6 +301,7 @@ let psetfield_arg = "Psetfield_arg" let psetfield_computed_arg = "Psetfield_computed_arg" let psetfloatfield_arg = "Psetfloatfield_arg" let psetufloatfield_arg = "Psetufloatfield_arg" +let psetmixedfield_arg = "Psetmixedfield_arg" let psetglobal_arg = "Psetglobal_arg" let pstring_load_16_arg = "Pstring_load_16_arg" let pstring_load_32_arg = "Pstring_load_32_arg" @@ -323,6 +337,35 @@ let presume_arg = "Presume_arg" let preperform_arg = "Preperform_arg" let pdls_get_arg = "Pdls_get_arg" +let pfloatarray_load_128 = "Pfloatarray_load_128" +let pfloat_array_load_128 = "Pfloat_array_load_128" +let pint_array_load_128 = "Pint_array_load_128" +let punboxed_float_array_load_128 = "Punboxed_float_array_load_128" +let punboxed_int32_array_load_128 = "Punboxed_int32_array_load_128" +let punboxed_int64_array_load_128 = "Punboxed_int64_array_load_128" +let punboxed_nativeint_array_load_128 = "Punboxed_nativeint_array_load_128" +let pfloatarray_set_128 = "Pfloatarray_set_128" +let pfloat_array_set_128 = "Pfloat_array_set_128" +let pint_array_set_128 = "Pint_array_set_128" +let punboxed_float_array_set_128 = "Punboxed_float_array_set_128" +let punboxed_int32_array_set_128 = "Punboxed_int32_array_set_128" +let punboxed_int64_array_set_128 = "Punboxed_int64_array_set_128" +let punboxed_nativeint_array_set_128 = "Punboxed_nativeint_array_set_128" +let pfloatarray_load_128_arg = "Pfloatarray_load_128_arg" +let pfloat_array_load_128_arg = "Pfloat_array_load_128_arg" +let pint_array_load_128_arg = "Pint_array_load_128_arg" +let punboxed_float_array_load_128_arg = "Punboxed_float_array_load_128_arg" +let punboxed_int32_array_load_128_arg = "Punboxed_int32_array_load_128_arg" +let punboxed_int64_array_load_128_arg = "Punboxed_int64_array_load_128_arg" +let punboxed_nativeint_array_load_128_arg = "Punboxed_nativeint_array_load_128_arg" +let pfloatarray_set_128_arg = "Pfloatarray_set_128_arg" +let pfloat_array_set_128_arg = "Pfloat_array_set_128_arg" +let pint_array_set_128_arg = "Pint_array_set_128_arg" +let punboxed_float_array_set_128_arg = "Punboxed_float_array_set_128_arg" +let punboxed_int32_array_set_128_arg = "Punboxed_int32_array_set_128_arg" +let punboxed_int64_array_set_128_arg = "Punboxed_int64_array_set_128_arg" +let punboxed_nativeint_array_set_128_arg = "Punboxed_nativeint_array_set_128_arg" + let raise = "raise" let raise_arg = "raise_arg" let read_mutable = "read_mutable" @@ -378,6 +421,7 @@ let of_primitive : Lambda.primitive -> string = function | Pmakeblock _ -> pmakeblock | Pmakefloatblock _ -> pmakefloatblock | Pmakeufloatblock _ -> pmakeufloatblock + | Pmakemixedblock _ -> pmakemixedblock | Pfield _ -> pfield | Pfield_computed _ -> pfield_computed | Psetfield _ -> psetfield @@ -386,6 +430,8 @@ let of_primitive : Lambda.primitive -> string = function | Psetfloatfield _ -> psetfloatfield | Pufloatfield _ -> pufloatfield | Psetufloatfield _ -> psetufloatfield + | Pmixedfield _ -> pmixedfield + | Psetmixedfield _ -> psetmixedfield | Pduprecord _ -> pduprecord | Pccall _ -> pccall | Praise _ -> praise @@ -406,19 +452,22 @@ let of_primitive : Lambda.primitive -> string = function | Pasrint -> pasrint | Pintcomp _ -> pintcomp | Pcompare_ints -> pcompare_ints - | Pcompare_floats -> pcompare_floats + | Pcompare_floats _ -> pcompare_floats | Pcompare_bints _ -> pcompare_bints | Poffsetint _ -> poffsetint | Poffsetref _ -> poffsetref - | Pintoffloat -> pintoffloat - | Pfloatofint _ -> pfloatofint - | Pnegfloat _ -> pnegfloat - | Pabsfloat _ -> pabsfloat - | Paddfloat _ -> paddfloat - | Psubfloat _ -> psubfloat - | Pmulfloat _ -> pmulfloat - | Pdivfloat _ -> pdivfloat - | Pfloatcomp _ -> pfloatcomp + | Pintoffloat _ -> pintoffloat + | Pfloatofint (_, _) -> pfloatofint + | Pfloatoffloat32 _ -> pfloatoffloat32 + | Pfloat32offloat _ -> pfloat32offloat + | Pnegfloat (_, _) -> pnegfloat + | Pabsfloat (_, _) -> pabsfloat + | Paddfloat (_, _) -> paddfloat + | Psubfloat (_, _) -> psubfloat + | Pmulfloat (_, _) -> pmulfloat + | Pdivfloat (_, _) -> pdivfloat + | Pfloatcomp (_, _) -> pfloatcomp + | Punboxed_float_comp (_, _) -> punboxed_float_comp | Pstringlength -> pstringlength | Pstringrefu -> pstringrefu | Pstringrefs -> pstringrefs @@ -453,6 +502,7 @@ let of_primitive : Lambda.primitive -> string = function | Plsrbint _ -> plsrbint | Pasrbint _ -> pasrbint | Pbintcomp _ -> pbintcomp + | Punboxed_int_comp _ -> punboxed_int_comp | Pbigarrayref _ -> pbigarrayref | Pbigarrayset _ -> pbigarrayset | Pbigarraydim _ -> pbigarraydim @@ -476,6 +526,20 @@ let of_primitive : Lambda.primitive -> string = function | Pbigstring_set_32 _ -> pbigstring_set_32 | Pbigstring_set_64 _ -> pbigstring_set_64 | Pbigstring_set_128 _ -> pbigstring_set_128 + | Pfloatarray_load_128 _ -> pfloatarray_load_128 + | Pfloat_array_load_128 _ -> pfloat_array_load_128 + | Pint_array_load_128 _ -> pint_array_load_128 + | Punboxed_float_array_load_128 _ -> punboxed_float_array_load_128 + | Punboxed_int32_array_load_128 _ -> punboxed_int32_array_load_128 + | Punboxed_int64_array_load_128 _ -> punboxed_int64_array_load_128 + | Punboxed_nativeint_array_load_128 _ -> punboxed_nativeint_array_load_128 + | Pfloatarray_set_128 _ -> pfloatarray_set_128 + | Pfloat_array_set_128 _ -> pfloat_array_set_128 + | Pint_array_set_128 _ -> pint_array_set_128 + | Punboxed_float_array_set_128 _ -> punboxed_float_array_set_128 + | Punboxed_int32_array_set_128 _ -> punboxed_int32_array_set_128 + | Punboxed_int64_array_set_128 _ -> punboxed_int64_array_set_128 + | Punboxed_nativeint_array_set_128 _ -> punboxed_nativeint_array_set_128 | Pbswap16 -> pbswap16 | Pbbswap _ -> pbbswap | Pint_as_pointer _ -> pint_as_pointer @@ -483,8 +547,8 @@ let of_primitive : Lambda.primitive -> string = function | Pprobe_is_enabled _ -> pprobe_is_enabled | Pobj_dup -> pobj_dup | Pobj_magic _ -> pobj_magic - | Punbox_float -> punbox_float - | Pbox_float _ -> pbox_float + | Punbox_float _ -> punbox_float + | Pbox_float (_, _) -> pbox_float | Punbox_int _ -> punbox_int | Pbox_int _ -> pbox_int | Parray_of_iarray -> parray_of_iarray @@ -512,6 +576,7 @@ let of_primitive_arg : Lambda.primitive -> string = function | Pmakeblock _ -> pmakeblock_arg | Pmakefloatblock _ -> pmakefloatblock_arg | Pmakeufloatblock _ -> pmakeufloatblock_arg + | Pmakemixedblock _ -> pmakemixedblock_arg | Pfield _ -> pfield_arg | Pfield_computed _ -> pfield_computed_arg | Psetfield _ -> psetfield_arg @@ -520,6 +585,8 @@ let of_primitive_arg : Lambda.primitive -> string = function | Psetfloatfield _ -> psetfloatfield_arg | Pufloatfield _ -> pufloatfield_arg | Psetufloatfield _ -> psetufloatfield_arg + | Pmixedfield _ -> pmixedfield_arg + | Psetmixedfield _ -> psetmixedfield_arg | Pduprecord _ -> pduprecord_arg | Pccall _ -> pccall_arg | Praise _ -> praise_arg @@ -540,19 +607,22 @@ let of_primitive_arg : Lambda.primitive -> string = function | Pasrint -> pasrint_arg | Pintcomp _ -> pintcomp_arg | Pcompare_ints -> pcompare_ints_arg - | Pcompare_floats -> pcompare_floats_arg + | Pcompare_floats _ -> pcompare_floats_arg | Pcompare_bints _ -> pcompare_bints_arg | Poffsetint _ -> poffsetint_arg | Poffsetref _ -> poffsetref_arg - | Pintoffloat -> pintoffloat_arg - | Pfloatofint _ -> pfloatofint_arg - | Pnegfloat _ -> pnegfloat_arg - | Pabsfloat _ -> pabsfloat_arg - | Paddfloat _ -> paddfloat_arg - | Psubfloat _ -> psubfloat_arg - | Pmulfloat _ -> pmulfloat_arg - | Pdivfloat _ -> pdivfloat_arg - | Pfloatcomp _ -> pfloatcomp_arg + | Pintoffloat _ -> pintoffloat_arg + | Pfloatofint (_, _) -> pfloatofint_arg + | Pfloatoffloat32 _ -> pfloatoffloat32_arg + | Pfloat32offloat _ -> pfloat32offloat_arg + | Pnegfloat (_, _) -> pnegfloat_arg + | Pabsfloat (_, _) -> pabsfloat_arg + | Paddfloat (_, _) -> paddfloat_arg + | Psubfloat (_, _) -> psubfloat_arg + | Pmulfloat (_, _) -> pmulfloat_arg + | Pdivfloat (_, _) -> pdivfloat_arg + | Pfloatcomp (_, _) -> pfloatcomp_arg + | Punboxed_float_comp (_, _) -> punboxed_float_comp_arg | Pstringlength -> pstringlength_arg | Pstringrefu -> pstringrefu_arg | Pstringrefs -> pstringrefs_arg @@ -587,6 +657,7 @@ let of_primitive_arg : Lambda.primitive -> string = function | Plsrbint _ -> plsrbint_arg | Pasrbint _ -> pasrbint_arg | Pbintcomp _ -> pbintcomp_arg + | Punboxed_int_comp _ -> punboxed_int_comp_arg | Pbigarrayref _ -> pbigarrayref_arg | Pbigarrayset _ -> pbigarrayset_arg | Pbigarraydim _ -> pbigarraydim_arg @@ -610,6 +681,20 @@ let of_primitive_arg : Lambda.primitive -> string = function | Pbigstring_set_32 _ -> pbigstring_set_32_arg | Pbigstring_set_64 _ -> pbigstring_set_64_arg | Pbigstring_set_128 _ -> pbigstring_set_128_arg + | Pfloatarray_load_128 _ -> pfloatarray_load_128_arg + | Pfloat_array_load_128 _ -> pfloat_array_load_128_arg + | Pint_array_load_128 _ -> pint_array_load_128_arg + | Punboxed_float_array_load_128 _ -> punboxed_float_array_load_128_arg + | Punboxed_int32_array_load_128 _ -> punboxed_int32_array_load_128_arg + | Punboxed_int64_array_load_128 _ -> punboxed_int64_array_load_128_arg + | Punboxed_nativeint_array_load_128 _ -> punboxed_nativeint_array_load_128_arg + | Pfloatarray_set_128 _ -> pfloatarray_set_128_arg + | Pfloat_array_set_128 _ -> pfloat_array_set_128_arg + | Pint_array_set_128 _ -> pint_array_set_128_arg + | Punboxed_float_array_set_128 _ -> punboxed_float_array_set_128_arg + | Punboxed_int32_array_set_128 _ -> punboxed_int32_array_set_128_arg + | Punboxed_int64_array_set_128 _ -> punboxed_int64_array_set_128_arg + | Punboxed_nativeint_array_set_128 _ -> punboxed_nativeint_array_set_128_arg | Pbswap16 -> pbswap16_arg | Pbbswap _ -> pbbswap_arg | Pint_as_pointer _ -> pint_as_pointer_arg @@ -617,8 +702,8 @@ let of_primitive_arg : Lambda.primitive -> string = function | Pprobe_is_enabled _ -> pprobe_is_enabled_arg | Pobj_dup -> pobj_dup_arg | Pobj_magic _ -> pobj_magic_arg - | Punbox_float -> punbox_float_arg - | Pbox_float _ -> pbox_float_arg + | Punbox_float _ -> punbox_float_arg + | Pbox_float (_, _) -> pbox_float_arg | Punbox_int _ -> punbox_int_arg | Pbox_int _ -> pbox_int_arg | Parray_of_iarray -> parray_of_iarray_arg diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index d85d52d601b..15a3bf6aa4f 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -29,11 +29,17 @@ let rec value_kind0 ppf kind = match kind with | Pgenval -> Format.pp_print_string ppf "" | Pintval -> Format.pp_print_string ppf ":int" - | Pfloatval -> Format.pp_print_string ppf ":float" + | Pboxedfloatval Pfloat64 -> Format.pp_print_string ppf ":float" + | Pboxedfloatval Pfloat32 -> Format.pp_print_string ppf ":float32" | Parrayval Pgenarray -> Format.pp_print_string ppf ":genarray" | Parrayval Pintarray -> Format.pp_print_string ppf ":intarray" | Parrayval Pfloatarray -> Format.pp_print_string ppf ":floatarray" | Parrayval Paddrarray -> Format.pp_print_string ppf ":addrarray" + | Parrayval Punboxedfloatarray Pfloat64 -> Format.pp_print_string ppf ":unboxedfloatarray" + | Parrayval Punboxedfloatarray Pfloat32 -> Format.pp_print_string ppf ":unboxedfloat32array" + | Parrayval Punboxedintarray Pint32 -> Format.pp_print_string ppf "unboxedint32array" + | Parrayval Punboxedintarray Pint64 -> Format.pp_print_string ppf "unboxedint64array" + | Parrayval Punboxedintarray Pnativeint -> Format.pp_print_string ppf "unboxednativeintarray" | Pboxedintval Pnativeint -> Format.pp_print_string ppf ":nativeint" | Pboxedintval Pint32 -> Format.pp_print_string ppf ":int32" | Pboxedintval Pint64 -> Format.pp_print_string ppf ":int64" @@ -44,12 +50,7 @@ let rec value_kind0 ppf kind = (Format.pp_print_list ~pp_sep:Format.pp_print_space Format.pp_print_int) consts (Format.pp_print_list ~pp_sep:Format.pp_print_space - (fun ppf (tag, fields) -> - fprintf ppf "@[[%d:@ %a]@]" tag - (Format.pp_print_list - ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") - value_kind0) - fields)) + (Printlambda.tag_and_constructor_shape value_kind0)) non_consts let value_kind kind = Format.asprintf "%a" value_kind0 kind @@ -58,7 +59,8 @@ let layout (layout : Lambda.layout) = | Pvalue kind -> value_kind kind | Ptop -> ":top" | Pbottom -> ":bottom" - | Punboxed_float -> ":unboxed_float" + | Punboxed_float Pfloat64 -> ":unboxed_float" + | Punboxed_float Pfloat32 -> ":unboxed_float32" | Punboxed_int Pint32 -> ":unboxed_int32" | Punboxed_int Pint64 -> ":unboxed_int64" | Punboxed_int Pnativeint -> ":unboxed_nativeint" @@ -192,18 +194,6 @@ and lam ppf = function phantom_defining_expr_opt defining_expr; let expr = letbody body in fprintf ppf ")@]@ %a)@]" lam expr - | Uletrec(id_arg_list, body) -> - let bindings ppf id_arg_list = - let spc = ref false in - List.iter - (fun (id, l) -> - if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[<2>%a@ %a@]" - VP.print id - lam l) - id_arg_list in - fprintf ppf - "@[<2>(letrec@ (@[%a@])@ %a)@]" bindings id_arg_list lam body | Uprim(prim, largs, _) -> let lams ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in diff --git a/middle_end/printclambda_primitives.ml b/middle_end/printclambda_primitives.ml index 77c7486e253..250d7ad2f74 100644 --- a/middle_end/printclambda_primitives.ml +++ b/middle_end/printclambda_primitives.ml @@ -21,6 +21,10 @@ let boxed_integer_name = function | Lambda.Pint32 -> "int32" | Lambda.Pint64 -> "int64" +let boxed_float_name = function + | Lambda.Pfloat64 -> "float" + | Lambda.Pfloat32 -> "float32" + let boxed_integer_mark name = function | Lambda.Pnativeint -> Printf.sprintf "Nativeint.%s" name | Lambda.Pint32 -> Printf.sprintf "Int32.%s" name @@ -30,9 +34,46 @@ let alloc_kind = function | Lambda.Alloc_heap -> "" | Lambda.Alloc_local -> "[L]" +let float_comparison = function + | Lambda.CFeq -> "==" + | Lambda.CFneq -> "!=" + | Lambda.CFlt -> "<" + | Lambda.CFnlt -> "!<" + | Lambda.CFle -> "<=" + | Lambda.CFnle -> "!<=" + | Lambda.CFgt -> ">" + | Lambda.CFngt -> "!>" + | Lambda.CFge -> ">=" + | Lambda.CFnge -> "!>=" + let print_boxed_integer name ppf bi m = fprintf ppf "%s%s" (boxed_integer_mark name bi) (alloc_kind m) +let unboxed_integer_mark name bi m = + match bi with + | Lambda.Pnativeint -> Printf.sprintf "Nativeint_u.%s%s" name (alloc_kind m) + | Lambda.Pint32 -> Printf.sprintf "Int32_u.%s%s" name (alloc_kind m) + | Lambda.Pint64 -> Printf.sprintf "Int64_u.%s%s" name (alloc_kind m) + +let print_unboxed_integer name ppf bi m = + fprintf ppf "%s" (unboxed_integer_mark name bi m);; + +let boxed_float_mark name bf m = + match bf with + | Lambda.Pfloat64 -> Printf.sprintf "Float.%s%s" name (alloc_kind m) + | Lambda.Pfloat32 -> Printf.sprintf "Float32.%s%s" name (alloc_kind m) + +let print_boxed_float name ppf bf m = + fprintf ppf "%s" (boxed_float_mark name bf m);; + +let unboxed_float_mark name bf m = + match bf with + | Lambda.Pfloat64 -> Printf.sprintf "Float_u.%s%s" name (alloc_kind m) + | Lambda.Pfloat32 -> Printf.sprintf "Float32_u.%s%s" name (alloc_kind m) + +let print_unboxed_float name ppf bf m = + fprintf ppf "%s" (unboxed_float_mark name bf m);; + let array_kind array_kind = let open Lambda in match array_kind with @@ -40,6 +81,11 @@ let array_kind array_kind = | Paddrarray -> "addr" | Pintarray -> "int" | Pfloatarray -> "float" + | Punboxedfloatarray Pfloat64 -> "unboxed_float" + | Punboxedfloatarray Pfloat32 -> "unboxed_float32" + | Punboxedintarray Pint32 -> "unboxed_int32" + | Punboxedintarray Pint64 -> "unboxed_int64" + | Punboxedintarray Pnativeint -> "unboxed_nativeint" let pp_array_ref_kind ppf k = let open Lambda in @@ -52,6 +98,11 @@ let pp_array_ref_kind ppf k = | Paddrarray_ref -> fprintf ppf "addr" | Pintarray_ref -> fprintf ppf "int" | Pfloatarray_ref mode -> fprintf ppf "float%a" pp_mode mode + | Punboxedfloatarray_ref Pfloat64 -> fprintf ppf "unboxed_float" + | Punboxedfloatarray_ref Pfloat32 -> fprintf ppf "unboxed_float32" + | Punboxedintarray_ref Pint32 -> fprintf ppf "unboxed_int32" + | Punboxedintarray_ref Pint64 -> fprintf ppf "unboxed_int64" + | Punboxedintarray_ref Pnativeint -> fprintf ppf "unboxed_nativeint" let pp_array_set_kind ppf k = let open Lambda in @@ -64,6 +115,11 @@ let pp_array_set_kind ppf k = | Paddrarray_set mode -> fprintf ppf "addr%a" pp_mode mode | Pintarray_set -> fprintf ppf "int" | Pfloatarray_set -> fprintf ppf "float" + | Punboxedfloatarray_set Pfloat64 -> fprintf ppf "unboxed_float" + | Punboxedfloatarray_set Pfloat32 -> fprintf ppf "unboxed_float32" + | Punboxedintarray_set Pint32 -> fprintf ppf "unboxed_int32" + | Punboxedintarray_set Pint64 -> fprintf ppf "unboxed_int64" + | Punboxedintarray_set Pnativeint -> fprintf ppf "unboxed_nativeint" let access_size size = let open Clambda_primitives in @@ -81,33 +137,33 @@ let access_safety safety = let primitive ppf (prim:Clambda_primitives.primitive) = let open Lambda in let open Clambda_primitives in + let mode_to_string = function + | Alloc_heap -> "" + | Alloc_local -> "local" + in + let mut_to_string = function + | Immutable -> "block" + | Immutable_unique -> "block_unique" + | Mutable -> "mutable" + in match prim with | Pread_symbol sym -> fprintf ppf "read_symbol %s" sym | Pmakeblock(tag, mut, shape, mode) -> - let mode = match mode with - | Alloc_heap -> "" - | Alloc_local -> "local" - in - let mut = match mut with - | Immutable -> "block" - | Immutable_unique -> "block_unique" - | Mutable -> "mutable" - in + let mode = mode_to_string mode in + let mut = mut_to_string mut in let name = "make" ^ mode ^ mut in fprintf ppf "%s %i%a" name tag Printlambda.block_shape shape | Pmakeufloatblock(mut, mode) -> - let mode = match mode with - | Alloc_heap -> "" - | Alloc_local -> "local" - in - let mut = match mut with - | Immutable -> "block" - | Immutable_unique -> "block_unique" - | Mutable -> "mutable" - in + let mode = mode_to_string mode in + let mut = mut_to_string mut in let name = "make" ^ mode ^ "ufloat" ^ mut in fprintf ppf "%s" name + | Pmakemixedblock(tag, mut, shape, mode) -> + let mode = mode_to_string mode in + let mut = mut_to_string mut in + let name = "make" ^ mode ^ "ufloat" ^ mut in + fprintf ppf "%s %i%a" name tag Printlambda.mixed_block_shape shape | Pfield (n, layout, ptr, mut) -> let instr = match ptr, mut with @@ -149,6 +205,9 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Pfloatfield (n, Alloc_heap) -> fprintf ppf "floatfield %i" n | Pfloatfield (n, Alloc_local) -> fprintf ppf "floatfieldlocal %i" n | Pufloatfield n -> fprintf ppf "ufloatfield %i" n + | Pmixedfield (n, shape) -> + fprintf ppf "mixedfield %i %a" + n Printlambda.mixed_block_read shape | Psetfloatfield (n, init) -> let init = match init with @@ -167,6 +226,16 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Assignment Modify_maybe_stack -> "(maybe-stack)" in fprintf ppf "setufloatfield%s %i" init n + | Psetmixedfield (n, shape, init) -> + let init = + match init with + | Heap_initialization -> "(heap-init)" + | Root_initialization -> "(root-init)" + | Assignment Modify_heap -> "" + | Assignment Modify_maybe_stack -> "(maybe-stack)" + in + fprintf ppf "setufloatfield%s %i %a" + init n Printlambda.mixed_block_write shape | Pduprecord (rep, size) -> fprintf ppf "duprecord %a %i" Printlambda.record_rep rep size | Prunstack -> fprintf ppf "runstack" @@ -194,19 +263,23 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Pasrint -> fprintf ppf "asr" | Pintcomp(cmp) -> Printlambda.integer_comparison ppf cmp | Pcompare_ints -> fprintf ppf "compare_ints" - | Pcompare_floats -> fprintf ppf "compare_floats" + | Pcompare_floats bf -> fprintf ppf "compare_floats %s" (boxed_float_name bf) | Pcompare_bints bi -> fprintf ppf "compare_bints %s" (boxed_integer_name bi) | Poffsetint n -> fprintf ppf "%i+" n | Poffsetref n -> fprintf ppf "+:=%i"n - | Pintoffloat -> fprintf ppf "int_of_float" - | Pfloatofint m -> fprintf ppf "float_of_int%s" (alloc_kind m) - | Pnegfloat m -> fprintf ppf "~.%s" (alloc_kind m) - | Pabsfloat m -> fprintf ppf "abs.%s" (alloc_kind m) - | Paddfloat m -> fprintf ppf "+.%s" (alloc_kind m) - | Psubfloat m -> fprintf ppf "-.%s" (alloc_kind m) - | Pmulfloat m -> fprintf ppf "*.%s" (alloc_kind m) - | Pdivfloat m -> fprintf ppf "/.%s" (alloc_kind m) - | Pfloatcomp(cmp) -> Printlambda.float_comparison ppf cmp + | Pintoffloat bf -> fprintf ppf "int_of_%s" (boxed_float_name bf) + | Pfloatofint (bf,m) -> + fprintf ppf "%s_of_int%s" (boxed_float_name bf) (alloc_kind m) + | Pabsfloat (bf,m) -> print_boxed_float "abs" ppf bf m + | Pnegfloat (bf,m) -> print_boxed_float "neg" ppf bf m + | Paddfloat (bf,m) -> print_boxed_float "add" ppf bf m + | Psubfloat (bf,m) -> print_boxed_float "sub" ppf bf m + | Pmulfloat (bf,m) -> print_boxed_float "mul" ppf bf m + | Pdivfloat (bf,m) -> print_boxed_float "div" ppf bf m + | Pfloatcomp (bf,cmp) -> + print_boxed_float (float_comparison cmp) ppf bf alloc_heap + | Punboxed_float_comp (bf,cmp) -> + print_unboxed_float (float_comparison cmp) ppf bf alloc_heap | Pstringlength -> fprintf ppf "string.length" | Pstringrefu -> fprintf ppf "string.unsafe_get" | Pstringrefs -> fprintf ppf "string.get" @@ -264,6 +337,12 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Pbintcomp(bi, Cgt) -> print_boxed_integer ">" ppf bi alloc_heap | Pbintcomp(bi, Cle) -> print_boxed_integer "<=" ppf bi alloc_heap | Pbintcomp(bi, Cge) -> print_boxed_integer ">=" ppf bi alloc_heap + | Punboxed_int_comp(bi, Ceq) -> print_unboxed_integer "==" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cne) -> print_unboxed_integer "!=" ppf bi alloc_heap + | Punboxed_int_comp(bi, Clt) -> print_unboxed_integer "<" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cgt) -> print_unboxed_integer ">" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cle) -> print_unboxed_integer "<=" ppf bi alloc_heap + | Punboxed_int_comp(bi, Cge) -> print_unboxed_integer ">=" ppf bi alloc_heap | Pbigarrayref(unsafe, _n, kind, layout) -> Printlambda.print_bigarray "get" unsafe kind ppf layout | Pbigarrayset(unsafe, _n, kind, layout) -> @@ -295,8 +374,9 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Patomic_fetch_add -> fprintf ppf "atomic_fetch_add" | Popaque -> fprintf ppf "opaque" | Pprobe_is_enabled {name} -> fprintf ppf "probe_is_enabled[%s]" name - | Pbox_float m -> fprintf ppf "box_float.%s" (alloc_kind m) - | Punbox_float -> fprintf ppf "unbox_float" + | Pbox_float (bf,m) -> + fprintf ppf "box_%s.%s" (boxed_float_name bf) (alloc_kind m) + | Punbox_float bf -> fprintf ppf "unbox_%s" (boxed_float_name bf) | Pbox_int (bi, m) -> fprintf ppf "box_%s.%s" (boxed_integer_name bi) (alloc_kind m) | Punbox_int bi -> fprintf ppf "unbox_%s" (boxed_integer_name bi) diff --git a/middle_end/semantics_of_primitives.ml b/middle_end/semantics_of_primitives.ml index 7826c7d7a98..27b2be24db7 100644 --- a/middle_end/semantics_of_primitives.ml +++ b/middle_end/semantics_of_primitives.ml @@ -30,6 +30,7 @@ let for_primitive (prim : Clambda_primitives.primitive) = match prim with | Pmakeblock (_, _, _, m) | Pmakeufloatblock (_, m) + | Pmakemixedblock (_, _, _, m) | Pmakearray (_, Mutable, m) -> Only_generative_effects, coeffects_of m | Pmakearray (_, (Immutable | Immutable_unique), m) -> No_effects, coeffects_of m @@ -58,8 +59,9 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Plslint | Plsrint | Pasrint - | Pintcomp _ -> No_effects, No_coeffects - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ + | Pintcomp _ + | Punboxed_int_comp _ -> No_effects, No_coeffects + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ -> No_effects, No_coeffects | Pdivbint { is_safe = Unsafe } | Pmodbint { is_safe = Unsafe } @@ -73,17 +75,18 @@ let for_primitive (prim : Clambda_primitives.primitive) = Arbitrary_effects, No_coeffects | Poffsetint _ -> No_effects, No_coeffects | Poffsetref _ -> Arbitrary_effects, Has_coeffects - | Punbox_float | Punbox_int _ - | Pintoffloat - | Pfloatcomp _ -> No_effects, No_coeffects - | Pbox_float m | Pbox_int (_, m) - | Pfloatofint m - | Pnegfloat m - | Pabsfloat m - | Paddfloat m - | Psubfloat m - | Pmulfloat m - | Pdivfloat m -> No_effects, coeffects_of m + | Punbox_float _ | Punbox_int _ + | Pintoffloat _ + | Pfloatcomp (_, _) + | Punboxed_float_comp (_, _) -> No_effects, No_coeffects + | Pbox_float (_, m) | Pbox_int (_, m) + | Pfloatofint (_, m) + | Pnegfloat (_, m) + | Pabsfloat (_, m) + | Paddfloat (_, m) + | Psubfloat (_, m) + | Pmulfloat (_, m) + | Pdivfloat (_, m) -> No_effects, coeffects_of m | Pstringlength | Pbyteslength | Parraylength _ -> No_effects, No_coeffects | Pisint @@ -109,6 +112,7 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Pfield_computed | Pfloatfield _ | Pufloatfield _ + | Pmixedfield _ | Parrayrefu _ | Pstringrefu | Pbytesrefu @@ -130,6 +134,7 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Psetfield_computed _ | Psetfloatfield _ | Psetufloatfield _ + | Psetmixedfield _ | Patomic_load _ | Patomic_exchange | Patomic_cas @@ -155,7 +160,7 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Pget_header _ -> No_effects, No_coeffects | Pdls_get -> (* only read *) - No_effects, No_coeffects + No_effects, Has_coeffects type return_type = | Float @@ -163,13 +168,13 @@ type return_type = let return_type_of_primitive (prim:Clambda_primitives.primitive) = match prim with - | Pfloatofint _ - | Pnegfloat _ - | Pabsfloat _ - | Paddfloat _ - | Psubfloat _ - | Pmulfloat _ - | Pdivfloat _ + | Pfloatofint (Pfloat64, _) + | Pnegfloat (Pfloat64, _) + | Pabsfloat (Pfloat64, _) + | Paddfloat (Pfloat64, _) + | Psubfloat (Pfloat64, _) + | Pmulfloat (Pfloat64, _) + | Pdivfloat (Pfloat64, _) | Pfloatfield _ | Parrayrefu (Pfloatarray_ref _) | Parrayrefs (Pfloatarray_ref _) -> @@ -185,6 +190,7 @@ let may_locally_allocate (prim:Clambda_primitives.primitive) : bool = match prim with | Pmakeblock (_, _, _, m) | Pmakeufloatblock (_, m) + | Pmakemixedblock (_, _, _, m) | Pmakearray (_, _, m) -> is_local_alloc m | Pduparray (_, _) | Pduprecord (_,_) -> false @@ -209,27 +215,29 @@ let may_locally_allocate (prim:Clambda_primitives.primitive) : bool = | Plsrint | Pasrint | Pintcomp _ -> false - | Pcompare_ints | Pcompare_floats | Pcompare_bints _ + | Pcompare_ints | Pcompare_floats _ | Pcompare_bints _ -> false | Poffsetint _ -> false | Poffsetref _ -> false - | Punbox_float | Punbox_int _ - | Pintoffloat - | Pfloatcomp _ -> false - | Pbox_float m | Pbox_int (_, m) - | Pfloatofint m - | Pnegfloat m - | Pabsfloat m - | Paddfloat m - | Psubfloat m - | Pmulfloat m - | Pdivfloat m -> is_local_alloc m + | Punbox_float _ | Punbox_int _ + | Pintoffloat _ + | Pfloatcomp (_, _) + | Punboxed_float_comp (_, _) -> false + | Pbox_float (_, m) | Pbox_int (_, m) + | Pfloatofint (_, m) + | Pnegfloat (_, m) + | Pabsfloat (_, m) + | Paddfloat (_, m) + | Psubfloat (_, m) + | Pmulfloat (_, m) + | Pdivfloat (_, m) -> is_local_alloc m | Pstringlength | Pbyteslength | Parraylength _ -> false | Pisint | Pisout | Pintofbint _ - | Pbintcomp _ -> false + | Pbintcomp _ + | Punboxed_int_comp _ -> false | Pdivbint { mode = m } | Pmodbint { mode = m } | Pbintofint (_,m) @@ -248,6 +256,7 @@ let may_locally_allocate (prim:Clambda_primitives.primitive) : bool = | Pread_symbol _ | Pfield _ | Pfield_computed + | Pmixedfield (_, Mread_value_prefix _) | Parrayrefu _ | Pstringrefu | Pbytesrefu @@ -258,6 +267,11 @@ let may_locally_allocate (prim:Clambda_primitives.primitive) : bool = false | Pfloatfield (_, m) -> is_local_alloc m | Pufloatfield _ -> false + | Pmixedfield (_, Mread_flat_suffix shape) -> begin + match shape with + | Flat_read _ -> false + | Flat_read_float m -> is_local_alloc m + end | Pstring_load (_, Safe, m) | Pbytes_load (_, Safe, m) | Pbigstring_load (_, Safe, m) -> is_local_alloc m @@ -269,6 +283,7 @@ let may_locally_allocate (prim:Clambda_primitives.primitive) : bool = | Psetfield_computed _ | Psetfloatfield _ | Psetufloatfield _ + | Psetmixedfield _ | Parraysetu _ | Parraysets _ | Pbytessetu diff --git a/ocamldoc/.depend b/ocamldoc/.depend index ec90819a4d4..20ed5424cba 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -480,8 +480,7 @@ odoc_info.cmi : \ odoc_extension.cmi \ odoc_exception.cmi \ odoc_class.cmi \ - ../parsing/location.cmi \ - ../parsing/asttypes.cmi + ../parsing/location.cmi odoc_latex.cmo : \ odoc_to_text.cmi \ odoc_messages.cmi \ @@ -594,8 +593,7 @@ odoc_misc.cmx : \ odoc_misc.cmi : \ ../typing/types.cmi \ odoc_types.cmi \ - ../parsing/longident.cmi \ - ../parsing/asttypes.cmi + ../parsing/longident.cmi odoc_module.cmo : \ ../typing/types.cmi \ odoc_value.cmi \ @@ -743,6 +741,7 @@ odoc_see_lexer.cmx : \ odoc_see_lexer.cmi : \ odoc_parser.cmi odoc_sig.cmo : \ + ../typing/typetexp.cmi \ ../typing/types.cmi \ ../typing/typedtree.cmi \ ../parsing/parsetree.cmi \ @@ -762,6 +761,7 @@ odoc_sig.cmo : \ ../parsing/longident.cmi \ ../parsing/location.cmi \ ../typing/jkind.cmi \ + ../typing/jkind_types.cmi \ ../parsing/jane_syntax.cmi \ ../typing/ident.cmi \ ../typing/ctype.cmi \ @@ -769,6 +769,7 @@ odoc_sig.cmo : \ ../parsing/asttypes.cmi \ odoc_sig.cmi odoc_sig.cmx : \ + ../typing/typetexp.cmx \ ../typing/types.cmx \ ../typing/typedtree.cmx \ ../parsing/parsetree.cmi \ @@ -788,6 +789,7 @@ odoc_sig.cmx : \ ../parsing/longident.cmx \ ../parsing/location.cmx \ ../typing/jkind.cmx \ + ../typing/jkind_types.cmx \ ../parsing/jane_syntax.cmx \ ../typing/ident.cmx \ ../typing/ctype.cmx \ @@ -950,7 +952,6 @@ odoc_value.cmo : \ odoc_parameter.cmi \ odoc_name.cmi \ odoc_misc.cmi \ - ../parsing/asttypes.cmi \ odoc_value.cmi odoc_value.cmx : \ ../typing/types.cmx \ @@ -958,7 +959,6 @@ odoc_value.cmx : \ odoc_parameter.cmx \ odoc_name.cmx \ odoc_misc.cmx \ - ../parsing/asttypes.cmi \ odoc_value.cmi odoc_value.cmi : \ ../typing/types.cmi \ diff --git a/ocamldoc/odoc.ml b/ocamldoc/odoc.ml index 08696faa99d..4acb054c665 100644 --- a/ocamldoc/odoc.ml +++ b/ocamldoc/odoc.ml @@ -18,7 +18,8 @@ module M = Odoc_messages -let () = Language_extension.enable_maximal () +let () = Language_extension.set_universe_and_enable_all + Language_extension.Universe.maximal (* we check if we must load a module given on the command line *) let arg_list = Array.to_list Sys.argv diff --git a/ocamldoc/odoc_analyse.ml b/ocamldoc/odoc_analyse.ml index 826eee6d4bc..82d92ab0267 100644 --- a/ocamldoc/odoc_analyse.ml +++ b/ocamldoc/odoc_analyse.ml @@ -88,7 +88,7 @@ let process_implementation_file sourcefile = in let typedtree = Typemod.type_implementation - sourcefile prefixname compilation_unit env parsetree + ~sourcefile prefixname compilation_unit env parsetree in (Some (parsetree, typedtree), inputfile) with @@ -122,7 +122,9 @@ let process_interface_file sourcefile = Pparse.file ~tool_name inputfile (no_docstring Parse.interface) Pparse.Signature in - let sg = Typemod.type_interface (initial_env()) ast in + let sg = + Typemod.type_interface ~sourcefile compilation_unit (initial_env()) ast + in Warnings.check_fatal (); (ast, sg, inputfile) diff --git a/ocamldoc/odoc_args.ml b/ocamldoc/odoc_args.ml index cad9ae4a13e..8d61505931d 100644 --- a/ocamldoc/odoc_args.ml +++ b/ocamldoc/odoc_args.ml @@ -187,6 +187,7 @@ let anonymous f = module Options = Main_args.Make_ocamldoc_options(struct include Main_args.Default.Odoc_args let _I s = Odoc_global.include_dirs := s :: !Odoc_global.include_dirs + let _H s = Odoc_global.hidden_include_dirs := s :: !Odoc_global.hidden_include_dirs let _impl s = Odoc_global.files := !Odoc_global.files @ [Odoc_global.Impl_file s] let _intf s = Odoc_global.files := !Odoc_global.files @ [Odoc_global.Intf_file s] end) diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index b985dc11113..0429d99c920 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -262,7 +262,7 @@ module Analyser = | Typedtree.Tpat_tuple patlist -> Tuple - (List.map iter_pattern patlist, + (List.map (fun (_, p) -> iter_pattern p) patlist, Odoc_env.subst_type env pat.pat_type) | Typedtree.Tpat_construct (_, cons_desc, _, _) when @@ -286,60 +286,46 @@ module Analyser = (** Analysis of the parameter of a function. Return a list of t_parameter created from the (pattern, expression) structures encountered. *) - let rec tt_analyse_function_parameters env current_comment_opt pat_exp_list = - match pat_exp_list with - [] -> - (* This case means we have a 'function' without pattern, that's impossible *) - raise (Failure "tt_analyse_function_parameters: 'function' without pattern") - - | {c_lhs=pattern_param} :: _second_ele :: _ -> - (* implicit pattern matching -> anonymous parameter and no more parameter *) - (* FIXME : label ? *) - let parameter = Odoc_parameter.Tuple ([], Odoc_env.subst_type env pattern_param.pat_type) in - [ parameter ] - - | {c_lhs=pattern_param; c_rhs=func_body} :: [] -> - let parameter = + let rec tt_analyse_function_parameters env current_comment_opt params body = + let params = + List.map + (fun param -> + let pat = + match param.fp_kind with + | Tparam_pat pat -> pat + | Tparam_optional_default (pat, _, _) -> pat + in tt_param_info_from_pattern env (Odoc_parameter.desc_from_info_opt current_comment_opt) - pattern_param - - in - (* For optional parameters with a default value, a special treatment is required *) - (* we look if the name of the parameter we just add starts with "*opt*", which means - that there is a let param_name = ... in ... just right now *) - let (p, next_exp) = - match parameter with - Simple_name { sn_name } - when String.starts_with ~prefix:"*opt*" sn_name -> - ( - ( - match func_body.exp_desc with - Typedtree.Texp_let (_, {vb_pat={pat_desc = Typedtree.Tpat_var (id, _, _, _) }; - vb_expr=exp} :: _, func_body2) -> - let name = Name.from_ident id in - let new_param = Simple_name - { sn_name = name ; - sn_text = Odoc_parameter.desc_from_info_opt current_comment_opt name ; - sn_type = Odoc_env.subst_type env exp.exp_type - } - in - (new_param, func_body2) - | _ -> - (parameter, func_body) - ) - ) - | _ -> - (parameter, func_body) - in - (* continue if the body is still a function *) - match next_exp.exp_desc with - Texp_function { cases = pat_exp_list ; _ } -> - p :: (tt_analyse_function_parameters env current_comment_opt pat_exp_list) - | _ -> - (* something else ; no more parameter *) - [ p ] + pat) + params + in + let params_from_body = + match body with + | Tfunction_body { exp_desc = Texp_function { params; body } } -> + (* We keep this case for two reasons: + 1. so odoc continues to gather together all arguments for + functions written as [fun x -> fun y -> fun z -> ...]. + 2. so we can call [tt_analyse_function_parameters] as a + subroutine of [tt_analyse_method_expression]. Methods + nest all arguments after [self] as a separate [Texp_function] + node. + *) + tt_analyse_function_parameters env current_comment_opt params body + | Tfunction_body _ -> [] + | Tfunction_cases { fc_cases = [] } -> + (* FIXME: ppxes/camlp4 can generate this case. *) + [] + | Tfunction_cases { fc_cases = { c_lhs = pattern_param } :: _ } -> + (* implicit pattern matching -> anonymous parameter and no more parameter *) + (* FIXME : label ? *) + let parameter : Odoc_parameter.param_info = + Tuple ([], Odoc_env.subst_type env pattern_param.pat_type) + in + [ parameter ] + in + params @ params_from_body (** Analysis of a Tstr_value from the typedtree. Create and return a list of [t_value]. @raise Failure if an error occurs.*) @@ -347,7 +333,7 @@ module Analyser = let (pat, exp) = pat_exp in let comment_opt = Odoc_sig.analyze_alerts comment_opt attrs in match (pat.pat_desc, exp.exp_desc) with - (Typedtree.Tpat_var (ident, _, _, _), Typedtree.Texp_function { cases = pat_exp_list2; _ }) -> + (Tpat_var (ident, _, _, _), Texp_function { params; body; _ }) -> (* a new function is defined *) let name_pre = Name.from_ident ident in let name = Name.parens_if_infix name_pre in @@ -365,7 +351,7 @@ module Analyser = val_info = comment_opt ; val_type = Odoc_env.subst_type env pat.Typedtree.pat_type ; val_recursive = rec_flag = Asttypes.Recursive ; - val_parameters = tt_analyse_function_parameters env comment_opt pat_exp_list2 ; + val_parameters = tt_analyse_function_parameters env comment_opt params body ; val_code = code ; val_loc = { loc_impl = Some loc ; loc_inter = None } ; } @@ -429,77 +415,20 @@ module Analyser = *) | _ -> Odoc_messages.object_end - (** Analysis of a method expression to get the method parameters. - @param first indicates if we're analysing the method for - the first time ; in that case we must not keep the first parameter, - which is "self-*", the object itself. - *) - let rec tt_analyse_method_expression env current_method_name comment_opt ?(first=true) exp = + (** Analysis of a method expression to get the method parameters. *) + let tt_analyse_method_expression env current_method_name comment_opt exp = match exp.Typedtree.exp_desc with - Typedtree.Texp_function { cases = pat_exp_list; _ } -> - ( - match pat_exp_list with - [] -> - (* it is not a function since there are no parameters *) - (* we can't get here normally *) - raise (Failure (Odoc_messages.bad_tree^" "^(Odoc_messages.method_without_param current_method_name))) - | l -> - match l with - [] -> - (* impossible case, it has already been filtered *) - assert false - | {c_lhs=pattern_param} :: _second_ele :: _ -> - (* implicit pattern matching -> anonymous parameter *) - (* Note : We can't match this pattern if it is the first call to the function. *) - let new_param = Simple_name - { sn_name = "??" ; sn_text = None; - sn_type = Odoc_env.subst_type env pattern_param.Typedtree.pat_type } - in - [ new_param ] - - | {c_lhs=pattern_param; c_rhs=body} :: [] -> - (* if this is the first call to the function, this is the first parameter and we skip it *) - if not first then - ( - let parameter = - tt_param_info_from_pattern - env - (Odoc_parameter.desc_from_info_opt comment_opt) - pattern_param - in - (* For optional parameters with a default value, a special treatment is required. *) - (* We look if the name of the parameter we just add starts with "*opt*", which means - that there is a let param_name = ... in ... just right now. *) - let (current_param, next_exp) = - match parameter with - Simple_name { sn_name } - when String.starts_with ~prefix:"*opt*" sn_name -> - ( - ( - match body.exp_desc with - Typedtree.Texp_let (_, {vb_pat={pat_desc = Typedtree.Tpat_var (id, _, _, _) }; - vb_expr=exp} :: _, body2) -> - let name = Name.from_ident id in - let new_param = Simple_name - { sn_name = name ; - sn_text = Odoc_parameter.desc_from_info_opt comment_opt name ; - sn_type = Odoc_env.subst_type env exp.Typedtree.exp_type ; - } - in - (new_param, body2) - | _ -> - (parameter, body) - ) - ) - | _ -> - (* no *opt* parameter, we add the parameter then continue *) - (parameter, body) - in - current_param :: (tt_analyse_method_expression env current_method_name comment_opt ~first: false next_exp) - ) - else - tt_analyse_method_expression env current_method_name comment_opt ~first: false body - ) + Typedtree.Texp_function { params; body } -> + let params = + tt_analyse_function_parameters env comment_opt params body + in + begin match params with + | _self :: rest -> rest + | [] -> + (* it is not a function since there are no parameters *) + (* we can't get here normally *) + raise (Failure (Odoc_messages.bad_tree^" "^(Odoc_messages.method_without_param current_method_name))) + end | _ -> (* no more parameter *) [] @@ -1090,6 +1019,8 @@ module Analyser = | Ifstr_include_functor incl -> analyse_structure_item_include ~env ~comment_opt incl end + | Jstr_layout (Lstr_kind_abbrev _) -> + Misc.fatal_error "Lstr_kind_abbrev" (** Analysis of a parse tree structure item to obtain a new environment and a list of elements.*) and analyse_structure_item env current_module_name loc pos_limit comment_opt parsetree_item_desc _typedtree diff --git a/ocamldoc/odoc_global.ml b/ocamldoc/odoc_global.ml index 3bb1a67cd4a..221745438a0 100644 --- a/ocamldoc/odoc_global.ml +++ b/ocamldoc/odoc_global.ml @@ -24,6 +24,7 @@ type source_file = | Text_file of string let include_dirs = Clflags.include_dirs +let hidden_include_dirs = Clflags.hidden_include_dirs let errors = ref 0 diff --git a/ocamldoc/odoc_global.mli b/ocamldoc/odoc_global.mli index c85b453453b..1e3df3ec2ae 100644 --- a/ocamldoc/odoc_global.mli +++ b/ocamldoc/odoc_global.mli @@ -24,6 +24,9 @@ type source_file = (** The include_dirs in the OCaml compiler. *) val include_dirs : string list ref +(** The hidden_include_dirs in the OCaml compiler. *) +val hidden_include_dirs : string list ref + (** The merge options to be used. *) val merge_options : Odoc_types.merge_option list ref diff --git a/ocamldoc/odoc_info.ml b/ocamldoc/odoc_info.ml index d4a73fe1ed9..8a80224452f 100644 --- a/ocamldoc/odoc_info.ml +++ b/ocamldoc/odoc_info.ml @@ -111,6 +111,7 @@ module Module = Odoc_module let analyse_files ?(merge_options=([] : Odoc_types.merge_option list)) ?(include_dirs=([] : string list)) + ?(hidden_include_dirs=([] : string list)) ?(labels=false) ?(sort_modules=false) ?(no_stop=false) @@ -118,6 +119,7 @@ let analyse_files files = Odoc_global.merge_options := merge_options; Odoc_global.include_dirs := include_dirs; + Odoc_global.hidden_include_dirs := hidden_include_dirs; Odoc_global.classic := not labels; Odoc_global.sort_modules := sort_modules; Odoc_global.no_stop := no_stop; diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index da53554f892..adfea96a292 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -797,11 +797,11 @@ val create_index_lists : 'a list -> ('a -> string) -> 'a list list val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : Asttypes.arg_label -> bool +val is_optional : Types.arg_label -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : Asttypes.arg_label -> string +val label_name : Types.arg_label -> string (** Return the given name where the module name or part of it was removed, according to the list of modules @@ -1082,12 +1082,13 @@ end val analyse_files : ?merge_options:Odoc_types.merge_option list -> ?include_dirs:string list -> - ?labels:bool -> - ?sort_modules:bool -> - ?no_stop:bool -> - ?init: Odoc_module.t_module list -> - Odoc_global.source_file list -> - Module.t_module list + ?hidden_include_dirs:string list -> + ?labels:bool -> + ?sort_modules:bool -> + ?no_stop:bool -> + ?init: Odoc_module.t_module list -> + Odoc_global.source_file list -> + Module.t_module list (** Dump of a list of modules into a file. @raise Failure if an error occurs.*) diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli index 86db543940d..5e164602334 100644 --- a/ocamldoc/odoc_misc.mli +++ b/ocamldoc/odoc_misc.mli @@ -115,8 +115,8 @@ val search_string_backward : pat: string -> s: string -> int val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : Asttypes.arg_label -> bool +val is_optional : Types.arg_label -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : Asttypes.arg_label -> string +val label_name : Types.arg_label -> string diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 2b3a84ec717..156db06b22d 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -440,7 +440,7 @@ module Analyser = let comment_opt = analyze_alerts comment_opt ld_attributes in { rf_name = field_name ; - rf_mutable = mutable_flag = Mutable ; + rf_mutable = Types.is_mutable mutable_flag; rf_type = Odoc_env.subst_type env type_expr ; rf_text = comment_opt } @@ -461,7 +461,7 @@ module Analyser = let comment_opt = analyze_alerts comment_opt cd_attributes in let vc_args = match cd_args with - | Cstr_tuple l -> Cstr_tuple (List.map (fun (ty, _) -> Odoc_env.subst_type env ty) l) + | Cstr_tuple l -> Cstr_tuple (List.map (fun {ca_type=ty; _} -> Odoc_env.subst_type env ty) l) | Cstr_record l -> Cstr_record (List.map (get_field env name_comment_list) l) in @@ -492,14 +492,14 @@ module Analyser = let record comments { Typedtree.ld_id; ld_mutable; ld_type; ld_loc; ld_attributes } = get_field env comments @@ - {Types.ld_id; ld_mutable; ld_global = Unrestricted; - ld_jkind=Jkind.any ~why:Dummy_jkind (* ignored *); + {Types.ld_id; ld_mutable; ld_modalities = Mode.Modality.Value.Const.id; + ld_jkind=Jkind.Primitive.any ~why:Dummy_jkind (* ignored *); ld_type=ld_type.Typedtree.ctyp_type; ld_loc; ld_attributes; ld_uid=Types.Uid.internal_not_actually_unique} in let open Typedtree in function | Cstr_tuple l -> - Odoc_type.Cstr_tuple (List.map (fun (ty, _) -> tuple ty) l) + Odoc_type.Cstr_tuple (List.map (fun {ca_type=ty; _} -> tuple ty) l) | Cstr_record l -> let comments = Record.(doc typedtree) pos_end l in Odoc_type.Cstr_record (List.map (record comments) l) @@ -559,6 +559,8 @@ module Analyser = let filter_out_erased_item_from_signature_jst _erased acc : Jane_syntax.Signature_item.t -> _ = function | Jsig_include_functor (Ifsig_include_functor _) -> acc + | Jsig_layout (Lsig_kind_abbrev _) -> + Misc.fatal_error "Lsig_kind_abbrev" let filter_out_erased_items_from_signature erased signature = if Name.Map.is_empty erased then signature @@ -890,6 +892,8 @@ module Analyser = | Ifsig_include_functor incl -> analyse_signature_item_desc_include ~env ~comment_opt incl end + | Jsig_layout (Lsig_kind_abbrev _) -> + Misc.fatal_error "Lsig_kind_abbrev" (** Analyse the given signature_item_desc to create the corresponding module element (with the given attached comment).*) @@ -976,7 +980,7 @@ module Analyser = let xt_args = match types_ext.ext_args with | Cstr_tuple l -> - Cstr_tuple (List.map (fun (ty, _) -> Odoc_env.subst_type new_env ty) l) + Cstr_tuple (List.map (fun {ca_type=ty; _} -> Odoc_env.subst_type new_env ty) l) | Cstr_record l -> let docs = Record.(doc types ext_loc_end) l in Cstr_record (List.map (get_field new_env docs) l) @@ -1022,7 +1026,7 @@ module Analyser = let ex_args = let pos_end = Loc.end_ types_ext.ext_loc in match types_ext.ext_args with - | Cstr_tuple l -> Cstr_tuple (List.map (fun (ty, _) -> Odoc_env.subst_type env ty) l) + | Cstr_tuple l -> Cstr_tuple (List.map (fun {ca_type=ty; _} -> Odoc_env.subst_type env ty) l) | Cstr_record l -> let docs = Record.(doc types) pos_end l in Cstr_record (List.map (get_field env docs) l) @@ -1847,10 +1851,10 @@ module Analyser = in ([], Class_structure (inher_l, ele)) - | (Parsetree.Pcty_arrow (parse_label, _, pclass_type), Types.Cty_arrow (label, type_expr, class_type)) -> + | (Parsetree.Pcty_arrow (parse_label, type_, pclass_type), Types.Cty_arrow (label, type_expr, class_type)) -> (* label = string. In signature, there is no parameter names inside tuples *) (* if label = "", no label . Here we have the information to determine if a label is explicit or not. *) - if parse_label = label then + if (Typetexp.transl_label parse_label (Some type_)) = label then ( let new_param = Simple_name { diff --git a/ocamldoc/odoc_str.ml b/ocamldoc/odoc_str.ml index 3d6cf8a57a9..5c413dab796 100644 --- a/ocamldoc/odoc_str.ml +++ b/ocamldoc/odoc_str.ml @@ -135,7 +135,7 @@ let string_of_class_params c = Printf.bprintf b "%s%s%s%s -> " ( match label with - Asttypes.Nolabel -> "" + Types.Nolabel -> "" | s -> Printtyp.string_of_label s ^":" ) (if parent then "(" else "") diff --git a/ocamldoc/odoc_value.ml b/ocamldoc/odoc_value.ml index f457684e1b4..dbfcd265500 100644 --- a/ocamldoc/odoc_value.ml +++ b/ocamldoc/odoc_value.ml @@ -88,10 +88,9 @@ let dummy_parameter_list typ = let rec iter (label, t) = match Types.get_desc t with | Types.Ttuple l -> - let open Asttypes in - if label = Nolabel then + if label = Types.Nolabel then Odoc_parameter.Tuple - (List.map (fun t2 -> iter (Nolabel, t2)) l, t) + (List.map (fun t2 -> iter (Types.Nolabel, t2)) (List.map snd l), t) else (* if there is a label, then we don't want to decompose the tuple *) Odoc_parameter.Simple_name diff --git a/ocamltest/.depend b/ocamltest/.depend index 9026be75ef5..061a71ecad2 100644 --- a/ocamltest/.depend +++ b/ocamltest/.depend @@ -94,6 +94,7 @@ main.cmo : \ tsl_semantics.cmi \ tsl_parser.cmi \ tsl_lexer.cmi \ + translate.cmi \ tests.cmi \ result.cmi \ options.cmi \ @@ -107,6 +108,7 @@ main.cmx : \ tsl_semantics.cmx \ tsl_parser.cmx \ tsl_lexer.cmx \ + translate.cmx \ tests.cmx \ result.cmx \ options.cmx \ @@ -260,12 +262,14 @@ ocaml_flags.cmi : \ environments.cmi ocaml_modifiers.cmo : \ ocamltest_stdlib.cmi \ + ocamltest_config.cmi \ ocaml_variables.cmi \ ocaml_directories.cmi \ environments.cmi \ ocaml_modifiers.cmi ocaml_modifiers.cmx : \ ocamltest_stdlib.cmx \ + ocamltest_config.cmx \ ocaml_variables.cmx \ ocaml_directories.cmx \ environments.cmx \ @@ -364,15 +368,18 @@ ocamltest_unix.cmx : \ ocamltest_unix.cmi : options.cmo : \ variables.cmi \ + translate.cmi \ tests.cmi \ actions.cmi \ options.cmi options.cmx : \ variables.cmx \ + translate.cmx \ tests.cmx \ actions.cmx \ options.cmi -options.cmi : +options.cmi : \ + translate.cmi result.cmo : \ result.cmi result.cmx : \ @@ -405,6 +412,19 @@ tests.cmi : \ result.cmi \ environments.cmi \ actions.cmi +translate.cmo : \ + tsl_semantics.cmi \ + tsl_parser.cmi \ + tsl_lexer.cmi \ + tsl_ast.cmi \ + translate.cmi +translate.cmx : \ + tsl_semantics.cmx \ + tsl_parser.cmx \ + tsl_lexer.cmx \ + tsl_ast.cmx \ + translate.cmi +translate.cmi : tsl_ast.cmo : \ tsl_ast.cmi tsl_ast.cmx : \ diff --git a/ocamltest/Makefile b/ocamltest/Makefile index 831abe7fa24..950a775941c 100644 --- a/ocamltest/Makefile +++ b/ocamltest/Makefile @@ -46,7 +46,8 @@ core := \ tsl_semantics.mli tsl_semantics.ml \ builtin_variables.mli builtin_variables.ml \ actions_helpers.mli actions_helpers.ml \ - builtin_actions.mli builtin_actions.ml + builtin_actions.mli builtin_actions.ml \ + translate.mli translate.ml ocaml_plugin := \ ocaml_backends.mli ocaml_backends.ml \ @@ -151,7 +152,7 @@ ocamltest.opt$(EXE): $(deps_opt) $(native_modules) %.cmi: %.mli $(deps_byte) $(V_OCAMLC)$(ocamlc) -c $< -ocamltest_unix.ml: ocamltest_unix_$(ocamltest_unix_impl).ml +ocamltest_unix.ml: ocamltest_unix.$(ocamltest_unix_impl).ml $(V_GEN)echo '# 1 "$<"' > $@ && \ cat $< >> $@ diff --git a/ocamltest/actions.ml b/ocamltest/actions.ml index bac4a7ca902..42b0fa53218 100644 --- a/ocamltest/actions.ml +++ b/ocamltest/actions.ml @@ -21,6 +21,7 @@ type t = { name : string; action_description : string; body : code; + does_something : bool; mutable hook : code option } @@ -28,10 +29,13 @@ let name a = a.name let description a = a.action_description +let does_something t = t.does_something + let action_name = Variables.make ("action_name", "Name of the current action") -let make ~name ~description body = - { name; body; action_description = description; hook = None } +let make ~name ~description ~does_something body = + { name; body; action_description = description; hook = None; + does_something } let update action code = { action with body = code } diff --git a/ocamltest/actions.mli b/ocamltest/actions.mli index fa49728e83b..13ea33861ec 100644 --- a/ocamltest/actions.mli +++ b/ocamltest/actions.mli @@ -27,7 +27,8 @@ val action_name : Variables.t val update : t -> code -> t -val make : name:string -> description:string -> code -> t +val make : name:string -> description:string -> + does_something:bool -> code -> t val compare : t -> t -> int @@ -43,4 +44,6 @@ val clear_all_hooks : unit -> unit val run : out_channel -> Environments.t -> t -> Result.t * Environments.t +val does_something : t -> bool + module ActionSet : Set.S with type elt = t diff --git a/ocamltest/actions_helpers.ml b/ocamltest/actions_helpers.ml index 0e00f8868fd..55fbb3630cc 100644 --- a/ocamltest/actions_helpers.ml +++ b/ocamltest/actions_helpers.ml @@ -17,19 +17,33 @@ open Ocamltest_stdlib +let fail_with_reason reason = + let code _log env = + let result = Result.fail_with_reason reason in + (result, env) + in + Actions.make ~name:"fail" ~description:"Make the test fail" + ~does_something:true + code + let skip_with_reason reason = let code _log env = let result = Result.skip_with_reason reason in (result, env) in - Actions.make ~name:"skip" ~description:"Skip the test" code + Actions.make ~name:"skip" ~description:"Skip the test" + ~does_something:true + code -let pass_or_skip test pass_reason skip_reason _log env = +let predicate test pass_reason _skip_reason _log env = let open Result in let result = + (* We always use the [pass_reason]. If we used the [skip_reason] in the + failure case, there would be a double negation, and the error message + printed would be wrong. *) if test - then pass_with_reason pass_reason - else skip_with_reason skip_reason in + then predicate_satisfied_with_reason pass_reason + else predicate_not_satisfied_with_reason pass_reason in (result, env) let mkreason what commandline exitcode = diff --git a/ocamltest/actions_helpers.mli b/ocamltest/actions_helpers.mli index 3db31205a14..e6251489fbc 100644 --- a/ocamltest/actions_helpers.mli +++ b/ocamltest/actions_helpers.mli @@ -15,9 +15,11 @@ (* Helper functions when writing actions *) +val fail_with_reason : string -> Actions.t + val skip_with_reason : string -> Actions.t -val pass_or_skip +val predicate : bool -> string -> string -> out_channel -> Environments.t -> Result.t * Environments.t diff --git a/ocamltest/builtin_actions.ml b/ocamltest/builtin_actions.ml index 427c005f03b..ebe03c5c1c8 100644 --- a/ocamltest/builtin_actions.ml +++ b/ocamltest/builtin_actions.ml @@ -26,6 +26,7 @@ let reason_with_fallback env fallback = let pass = make ~name:"pass" ~description:"Always succeed" + ~does_something:true (fun _log env -> let reason = reason_with_fallback env "the pass action always succeeds" in let result = Result.pass_with_reason reason in @@ -34,14 +35,16 @@ let pass = make let skip = make ~name:"skip" ~description:"Always skip the test" + ~does_something:true (fun _log env -> - let reason = reason_with_fallback env "the skip action always skips" in + let reason = reason_with_fallback env "explicit 'skip' in the test" in let result = Result.skip_with_reason reason in (result, env)) let fail = make ~name:"fail" ~description:"Always fail" + ~does_something:true (fun _log env -> let reason = reason_with_fallback env "the fail action always fails" in let result = Result.fail_with_reason reason in @@ -50,6 +53,9 @@ let fail = make let cd = make ~name:"cd" ~description:"Change working directory" + ~does_something:true + (* CR mshinwell: This should be [does_something:false], but see + tests/lib-dynlink-pr4839/test.ml *) (fun _log env -> let cwd = Environments.safe_lookup Builtin_variables.cwd env in begin @@ -64,41 +70,47 @@ let cd = make let dumpenv = make ~name:"dumpenv" ~description:"Dump the environment" + ~does_something:false (fun log env -> Environments.dump log env; (Result.pass, env)) let hasunix = make ~name:"hasunix" ~description:"Pass if the unix library is available" - (Actions_helpers.pass_or_skip (Ocamltest_config.libunix <> None) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.libunix <> None) "unix library available" "unix library not available") let libunix = make ~name:"libunix" ~description:"Pass if libunix is available" - (Actions_helpers.pass_or_skip (Ocamltest_config.libunix = Some true) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.libunix = Some true) "libunix available" "libunix not available") let libwin32unix = make ~name:"libwin32unix" ~description:"Pass if the win32 variant of the unix library is available" - (Actions_helpers.pass_or_skip (Ocamltest_config.libunix = Some false) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.libunix = Some false) "win32 variant of the unix library available" "win32 variant of the unix library not available") let hassysthreads = make ~name:"hassysthreads" ~description:"Pass if the systhreads library is available" - (Actions_helpers.pass_or_skip Ocamltest_config.systhreads + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.systhreads "systhreads library available" "systhreads library not available") let hasstr = make ~name:"hasstr" ~description:"Pass if the str library is available" - (Actions_helpers.pass_or_skip Ocamltest_config.str + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.str "str library available" "str library not available") @@ -109,14 +121,16 @@ let get_OS () = Sys.safe_getenv "OS" let windows = make ~name:"windows" ~description:"Pass if running on Windows" - (Actions_helpers.pass_or_skip (get_OS () = windows_OS) + ~does_something:false + (Actions_helpers.predicate (get_OS () = windows_OS) "running on Windows" "not running on Windows") let not_windows = make ~name:"not-windows" ~description:"Pass if not running on Windows" - (Actions_helpers.pass_or_skip (get_OS () <> windows_OS) + ~does_something:false + (Actions_helpers.predicate (get_OS () <> windows_OS) "not running on Windows" "running on Windows") @@ -128,14 +142,16 @@ let is_bsd_system s = let bsd = make ~name:"bsd" ~description:"Pass if running on a BSD system" - (Actions_helpers.pass_or_skip (is_bsd_system Ocamltest_config.system) + ~does_something:false + (Actions_helpers.predicate (is_bsd_system Ocamltest_config.system) "on a BSD system" "not on a BSD system") let not_bsd = make ~name:"not-bsd" ~description:"Pass if not running on a BSD system" - (Actions_helpers.pass_or_skip (not (is_bsd_system Ocamltest_config.system)) + ~does_something:false + (Actions_helpers.predicate (not (is_bsd_system Ocamltest_config.system)) "not on a BSD system" "on a BSD system") @@ -144,125 +160,144 @@ let macos_system = "macosx" let macos = make ~name:"macos" ~description:"Pass if running on a MacOS system" - (Actions_helpers.pass_or_skip (Ocamltest_config.system = macos_system) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.system = macos_system) "on a MacOS system" "not on a MacOS system") let not_macos = make ~name:"not-macos" ~description:"Pass if not running on a MacOS system" - (Actions_helpers.pass_or_skip (not (Ocamltest_config.system = macos_system)) + ~does_something:false + (Actions_helpers.predicate (not (Ocamltest_config.system = macos_system)) "not on a MacOS system" "on a MacOS system") let arch32 = make ~name:"arch32" ~description:"Pass if running on a 32-bit architecture" - (Actions_helpers.pass_or_skip (Sys.word_size = 32) + ~does_something:false + (Actions_helpers.predicate (Sys.word_size = 32) "32-bit architecture" "non-32-bit architecture") let arch64 = make ~name:"arch64" ~description:"Pass if running on a 64-bit architecture" - (Actions_helpers.pass_or_skip (Sys.word_size = 64) + ~does_something:false + (Actions_helpers.predicate (Sys.word_size = 64) "64-bit architecture" "non-64-bit architecture") let arch_arm = make ~name:"arch_arm" ~description:"Pass if target is an ARM architecture" - (Actions_helpers.pass_or_skip (String.equal Ocamltest_config.arch "arm") + ~does_something:false + (Actions_helpers.predicate (String.equal Ocamltest_config.arch "arm") "Target is ARM architecture" "Target is not ARM architecture") let arch_arm64 = make ~name:"arch_arm64" ~description:"Pass if target is an ARM64 architecture" - (Actions_helpers.pass_or_skip (String.equal Ocamltest_config.arch "arm64") + ~does_something:false + (Actions_helpers.predicate (String.equal Ocamltest_config.arch "arm64") "Target is ARM64 architecture" "Target is not ARM64 architecture") let arch_amd64 = make ~name:"arch_amd64" ~description:"Pass if target is an AMD64 architecture" - (Actions_helpers.pass_or_skip (String.equal Ocamltest_config.arch "amd64") + ~does_something:false + (Actions_helpers.predicate (String.equal Ocamltest_config.arch "amd64") "Target is AMD64 architecture" "Target is not AMD64 architecture") let arch_i386 = make ~name:"arch_i386" ~description:"Pass if target is an i386 architecture" - (Actions_helpers.pass_or_skip (String.equal Ocamltest_config.arch "i386") + ~does_something:false + (Actions_helpers.predicate (String.equal Ocamltest_config.arch "i386") "Target is i386 architecture" "Target is not i386 architecture") let arch_power = make ~name:"arch_power" ~description:"Pass if target is a POWER architecture" - (Actions_helpers.pass_or_skip (String.equal Ocamltest_config.arch "power") + ~does_something:false + (Actions_helpers.predicate (String.equal Ocamltest_config.arch "power") "Target is POWER architecture" "Target is not POWER architecture") let function_sections = make ~name:"function_sections" ~description:"Pass if target supports function sections" - (Actions_helpers.pass_or_skip (Ocamltest_config.function_sections) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.function_sections) "Target supports function sections" "Target does not support function sections") let frame_pointers = make ~name:"frame_pointers" ~description:"Pass if frame pointers are available" - (Actions_helpers.pass_or_skip (Ocamltest_config.frame_pointers) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.frame_pointers) "frame-pointers available" "frame-pointers not available") let probes = make ~name:"probes" ~description:"Pass if probes are available" - (Actions_helpers.pass_or_skip (Ocamltest_config.probes) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.probes) "Target supports probes" "Target does not support probes") let naked_pointers = make ~name:"naked_pointers" ~description:"[BACKPORT] Pass if the runtime system supports naked pointers" - (Actions_helpers.pass_or_skip (Ocamltest_config.naked_pointers) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.naked_pointers) "Runtime system supports naked pointers" "Runtime system does not support naked pointers") let has_symlink = make ~name:"has_symlink" ~description:"Pass if symbolic links are available" - (Actions_helpers.pass_or_skip (Unix.has_symlink () ) + ~does_something:false + (Actions_helpers.predicate (Unix.has_symlink () ) "symlinks available" "symlinks not available") let setup_build_env = make ~name:"setup-build-env" ~description:"Create a dedicated directory for the test and populates it" + ~does_something:false (Actions_helpers.setup_build_env true []) let setup_simple_build_env = make ~name:"setup-simple-build-env" ~description:"Do not create a dedicated directory, but only sets the \ test_build_directory variable" + ~does_something:false (Actions_helpers.setup_simple_build_env true []) let run = make ~name:"run" ~description:"Run the program" + ~does_something:true Actions_helpers.run_program let script = make ~name:"script" ~description:"Run the script specified by the script variable" + ~does_something:true Actions_helpers.run_script let check_program_output = make ~name:"check-program-output" ~description:"Compare the output of the program with its reference" + ~does_something:true (Actions_helpers.check_output "program" Builtin_variables.output Builtin_variables.reference) @@ -292,6 +327,7 @@ let file_exists = make ~name:"file-exists" ~description:"Pass if there is a file at the path contained in variable \ `file`" + ~does_something:true file_exists_action let copy_action log env = @@ -320,7 +356,9 @@ let copy_action log env = List.iter f (String.words src); (Result.pass, env) -let copy = make ~name:"copy" ~description:"Copy a file" copy_action +let copy = + make ~name:"copy" ~description:"Copy a file" + ~does_something:false copy_action let initialize_test_exit_status_variables _log env = Environments.add_bindings diff --git a/ocamltest/dune b/ocamltest/dune index d586c0ee523..dc60ed3b415 100644 --- a/ocamltest/dune +++ b/ocamltest/dune @@ -29,7 +29,7 @@ ; -linkall so we don't fail to include e.g. ocaml_modifiers.ml, which only ; has top-level side effects. (flags - (:standard -linkall)) + (:standard -linkall -w +a-40-41-42-44-70)) (libraries ocamlcommon (select @@ -50,7 +50,7 @@ (rule (targets empty.ml) (deps - (source_tree ../runtime4/caml)) + (source_tree ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml)) (action (write-file %{targets} "(* hack *)"))) @@ -58,7 +58,11 @@ (name main) (modes byte) (flags - (:standard -principal -cclib "-I../runtime4")) + (:standard + -w + +a-40-41-42-44-70 + -cclib + "-I../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}")) (modules options main) (libraries ocamltest_core_and_plugin)) diff --git a/ocamltest/main.ml b/ocamltest/main.ml index dccbb426fcf..158754e4b36 100644 --- a/ocamltest/main.ml +++ b/ocamltest/main.ml @@ -22,22 +22,6 @@ type behavior = | Skip_all_tests | Run of Environments.t -(* -let first_token filename = - let input_channel = open_in filename in - let lexbuf = Lexing.from_channel input_channel in - Location.init lexbuf filename; - let token = - try Tsl_lexer.token lexbuf with e -> close_in input_channel; raise e - in close_in input_channel; token - -let is_test filename = - match first_token filename with - | exception _ -> false - | Tsl_parser.TSL_BEGIN_C_STYLE | TSL_BEGIN_OCAML_STYLE -> true - | _ -> false -*) - (* this primitive announce should be used for tests that were aborted on system error before ocamltest could parse them *) @@ -45,23 +29,29 @@ let announce_test_error test_filename error = Printf.printf " ... testing '%s' => unexpected error (%s)\n%!" (Filename.basename test_filename) error -let tsl_block_of_file test_filename = +exception Syntax_error of Lexing.position + +let tsl_parse_file test_filename = let input_channel = open_in test_filename in let lexbuf = Lexing.from_channel input_channel in Location.init lexbuf test_filename; - match Tsl_parser.tsl_block Tsl_lexer.token lexbuf with + match Tsl_parser.tsl_script Tsl_lexer.token lexbuf with + | exception Parsing.Parse_error -> + raise (Syntax_error lexbuf.Lexing.lex_start_p) | exception e -> close_in input_channel; raise e | _ as tsl_block -> close_in input_channel; tsl_block -let tsl_block_of_file_safe test_filename = - try tsl_block_of_file test_filename with +let tsl_parse_file_safe test_filename = + try tsl_parse_file test_filename with | Sys_error message -> Printf.eprintf "%s\n%!" message; announce_test_error test_filename message; exit 1 - | Parsing.Parse_error -> - Printf.eprintf "Could not read test block in %s\n%!" test_filename; - announce_test_error test_filename "could not read test block"; + | Syntax_error p -> + let open Lexing in + Printf.eprintf "%s:%d.%d: syntax error in test script\n%!" + test_filename p.pos_lnum (p.pos_cnum - p.pos_bol); + announce_test_error test_filename "could not read test script"; exit 1 let print_usage () = @@ -72,22 +62,31 @@ let join_result summary result = let open Result in match result.status, summary with | Fail, _ - | _, Some_failure -> Some_failure - | Skip, All_skipped -> All_skipped - | _ -> No_failure + | (Pass | Skip | Predicate _), Some_failure -> Some_failure + | (Skip | Predicate false), All_skipped -> All_skipped + | Pass, All_skipped -> No_failure + | Predicate true, All_skipped -> No_failure + | (Pass | Skip | Predicate _), No_failure -> No_failure let join_summaries sa sb = match sa, sb with - | Some_failure, _ - | _, Some_failure -> Some_failure + | Some_failure, (No_failure | Some_failure | All_skipped) + | (No_failure | All_skipped), Some_failure -> Some_failure | All_skipped, All_skipped -> All_skipped - | _ -> No_failure + | No_failure, (No_failure | All_skipped) + | All_skipped, No_failure -> No_failure let rec run_test log common_prefix path behavior = function Node (testenvspec, test, env_modifiers, subtrees) -> - Printf.printf "%s %s (%s) %!" common_prefix path test.Tests.test_name; + let skip_all = + match behavior with + | Skip_all_tests -> true + | Run _ -> false + in + if not skip_all then + Printf.printf "%s %s (%s) %!" common_prefix path test.Tests.test_name; let (msg, children_behavior, result) = match behavior with - | Skip_all_tests -> "=> n/a", Skip_all_tests, Result.skip + | Skip_all_tests -> "", Skip_all_tests, Result.skip | Run env -> let testenv0 = interpret_environment_statements env testenvspec in let testenv = List.fold_left apply_modifiers testenv0 env_modifiers in @@ -96,7 +95,7 @@ let rec run_test log common_prefix path behavior = function let children_behavior = if Result.is_pass result then Run newenv else Skip_all_tests in (msg, children_behavior, result) in - Printf.printf "%s\n%!" msg; + if not skip_all then Printf.printf "%s\n%!" msg; join_result (run_test_trees log common_prefix path children_behavior subtrees) result @@ -131,8 +130,8 @@ let init_tests_to_skip () = let test_file test_filename = let start = if Options.show_timings then Unix.gettimeofday () else 0.0 in let skip_test = List.mem test_filename !tests_to_skip in - let tsl_block = tsl_block_of_file_safe test_filename in - let (rootenv_statements, test_trees) = test_trees_of_tsl_block tsl_block in + let tsl_ast = tsl_parse_file_safe test_filename in + let (rootenv_statements, test_trees) = test_trees_of_tsl_ast tsl_ast in let test_trees = match test_trees with | [] -> let default_tests = Tests.default_tests() in @@ -221,10 +220,12 @@ let test_file test_filename = Printf.eprintf "Wall clock: %s took %.02fs\n%!" test_filename wall_clock_duration -let is_test s = - match tsl_block_of_file s with - | _ -> true - | exception _ -> false +let is_test filename = + let input_channel = open_in filename in + let lexbuf = Lexing.from_channel input_channel in + Fun.protect ~finally:(fun () -> close_in input_channel) begin fun () -> + Tsl_lexer.is_test lexbuf + end let ignored s = s = "" || s.[0] = '_' || s.[0] = '.' @@ -277,6 +278,12 @@ let () = let doit f x = work_done := true; f x in List.iter (doit find_test_dirs) Options.find_test_dirs; List.iter (doit list_tests) Options.list_tests; - List.iter (doit test_file) Options.files_to_test; + let do_file = + if Options.translate then + Translate.file ~style:Options.style ~compact:Options.compact + else + test_file + in + List.iter (doit do_file) Options.files_to_test; if not !work_done then print_usage(); if !failed || not !work_done then exit 1 diff --git a/ocamltest/ocaml_actions.ml b/ocamltest/ocaml_actions.ml index b8f6f97c6ca..f63b9510873 100644 --- a/ocamltest/ocaml_actions.ml +++ b/ocamltest/ocaml_actions.ml @@ -245,7 +245,7 @@ let compile_program (compiler : Ocaml_compilers.compiler) log env = match cmas_need_dynamic_loading with | Some (Error reason) -> (Result.fail_with_reason reason, env) - | _ -> + | Some (Ok _) | None -> let bytecode_links_c_code = (cmas_need_dynamic_loading = Some (Ok ())) in let commandline = [ @@ -333,7 +333,7 @@ let module_has_interface directory module_name = Sys.file_exists interface_fullpath let add_module_interface directory module_description = - match module_description with + match[@ocaml.warning "-fragile-match"] module_description with | (filename, Ocaml_filetypes.Implementation) when module_has_interface directory filename -> [(filename, Ocaml_filetypes.Interface); module_description] @@ -425,11 +425,13 @@ let setup_toplevel_build_env (toplevel : Ocaml_toplevels.toplevel) log env = let mk_compiler_env_setup name (compiler : Ocaml_compilers.compiler) = Actions.make ~name ~description:(Printf.sprintf "Setup build env (%s)" name) + ~does_something:false (setup_compiler_build_env compiler) let mk_toplevel_env_setup name (toplevel : Ocaml_toplevels.toplevel) = Actions.make ~name ~description:(Printf.sprintf "Setup toplevel env (%s)" name) + ~does_something:false (setup_toplevel_build_env toplevel) let setup_ocamlc_byte_build_env = @@ -503,6 +505,7 @@ let ocamlc_byte = Actions.make ~name:"ocamlc.byte" ~description:"Compile the program using ocamlc.byte" + ~does_something:true (compile Ocaml_compilers.ocamlc_byte) let ocamlc_opt = @@ -510,6 +513,7 @@ let ocamlc_opt = (Actions.make ~name:"ocamlc.opt" ~description:"Compile the program using ocamlc.opt" + ~does_something:true (compile Ocaml_compilers.ocamlc_opt)) let ocamlopt_byte = @@ -517,6 +521,7 @@ let ocamlopt_byte = (Actions.make ~name:"ocamlopt.byte" ~description:"Compile the program using ocamlopt.byte" + ~does_something:true (compile Ocaml_compilers.ocamlopt_byte)) let ocamlopt_opt = @@ -524,6 +529,7 @@ let ocamlopt_opt = (Actions.make ~name:"ocamlopt.opt" ~description:"Compile the program using ocamlopt.opt" + ~does_something:true (compile Ocaml_compilers.ocamlopt_opt)) let env_with_lib_unix env = @@ -570,6 +576,7 @@ let debug log env = let ocamldebug = Actions.make ~name:"ocamldebug" ~description:"Run ocamldebug on the program" + ~does_something:true debug let objinfo log env = @@ -612,7 +619,9 @@ let objinfo log env = let ocamlobjinfo = Actions.make ~name:"ocamlobjinfo" - ~description:"Run ocamlobjinfo on the program" objinfo + ~description:"Run ocamlobjinfo on the program" + ~does_something:true + objinfo let mklib log env = let program = Environments.safe_lookup Builtin_variables.program env in @@ -650,7 +659,9 @@ let mklib log env = let ocamlmklib = Actions.make ~name:"ocamlmklib" - ~description:"Run ocamlmklib to produce the program" mklib + ~description:"Run ocamlmklib to produce the program" + ~does_something:false + mklib let finalise_codegen_cc test_basename _log env = let test_module = @@ -754,6 +765,7 @@ let run_codegen log env = let codegen = Actions.make ~name:"codegen" ~description:"Run codegen on the test file" + ~does_something:true run_codegen let run_cc log env = @@ -790,21 +802,27 @@ let run_cc log env = let cc = Actions.make ~name:"cc" ~description:"Run C compiler to build the program" + ~does_something:true run_cc let run_expect_once input_file principal log env = let expect_flags = Sys.safe_getenv "EXPECT_FLAGS" in - let repo_root = "-repo-root " ^ Ocaml_directories.srcdir in let principal_flag = if principal then "-principal" else "" in let commandline = [ Ocaml_commands.ocamlrun_expect_test; expect_flags; + Ocaml_flags.toplevel_default_flags; + Ocaml_flags.stdlib; + directory_flags env; + Ocaml_flags.include_toplevel_directory; flags env; - repo_root; principal_flag; + libraries Bytecode env; + binary_modules Bytecode env; input_file - ] in + ] + in let exit_status = Actions_helpers.run_cmd ~environment:default_ocaml_env log env commandline in @@ -838,11 +856,14 @@ let run_expect log env = run_expect_twice input_file log env let run_expect = - Actions.make ~name:"run-expect" ~description:"Run expect test" run_expect + Actions.make ~name:"run-expect" ~description:"Run expect test" + ~does_something:true + run_expect let make_check_tool_output name tool = Actions.make ~name ~description:(Printf.sprintf "Check tool output (%s)" name) + ~does_something:true (Actions_helpers.check_output tool#family tool#output_variable @@ -923,6 +944,7 @@ let compare_bytecode_programs = ~name:"compare-bytecode-programs" ~description:"Compare the bytecode programs generated by ocamlc.byte and \ ocamlc.opt" + ~does_something:true compare_bytecode_programs_code) let compare_binary_files = @@ -931,6 +953,7 @@ let compare_binary_files = ~name:"compare-binary-files" ~description:"Compare the native programs generated by ocamlopt.byte and \ ocamlopt.opt" + ~does_something:true (compare_programs Ocaml_backends.Native native_programs_comparison_tool)) let compile_module compiler compilername compileroutput log env @@ -973,7 +996,7 @@ let compile_module compiler compilername compileroutput log env what (String.concat " " commandline) exit_status) in (Result.fail_with_reason reason, env) end in - match module_filetype with + match[@ocaml.warning "-fragile-match"] module_filetype with | Ocaml_filetypes.Interface -> let interface_name = Ocaml_filetypes.make_filename @@ -1027,7 +1050,7 @@ let run_test_program_in_toplevel (toplevel : Ocaml_toplevels.toplevel) log env = (Result.fail_with_reason reason, env) | Some (Ok ()) when not toplevel_supports_dynamic_loading -> (Result.skip, env) - | _ -> + | Some (Ok ()) | None -> let testfile = Actions_helpers.testfile env in let expected_exit_status = Ocaml_tools.expected_exit_status env (toplevel :> Ocaml_tools.tool) in @@ -1097,6 +1120,7 @@ let run_test_program_in_toplevel (toplevel : Ocaml_toplevels.toplevel) log env = let ocaml = Actions.make ~name:"ocaml" ~description:"Run the test program in the toplevel" + ~does_something:true (run_test_program_in_toplevel Ocaml_toplevels.ocaml) let ocamlnat = @@ -1104,6 +1128,7 @@ let ocamlnat = (Actions.make ~name:"ocamlnat" ~description:"Run the test program in the native toplevel ocamlnat" + ~does_something:true (run_test_program_in_toplevel Ocaml_toplevels.ocamlnat)) let check_ocaml_output = make_check_tool_output @@ -1144,13 +1169,16 @@ let config_variables _log env = Ocaml_variables.ocamlrunparam, Sys.safe_getenv "OCAMLRUNPARAM"; Ocaml_variables.ocamlsrcdir, Ocaml_directories.srcdir; Ocaml_variables.os_type, Sys.os_type; + Ocaml_variables.runtime_dir, + if Config.runtime5 then "runtime" else "runtime4" ] env let flat_float_array = Actions.make ~name:"flat-float-array" ~description:"Passes if the compiler is configured with \ --enable-flat-float-array" - (Actions_helpers.pass_or_skip Ocamltest_config.flat_float_array + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.flat_float_array "compiler configured with --enable-flat-float-array" "compiler configured with --disable-flat-float-array") @@ -1158,14 +1186,16 @@ let no_flat_float_array = make ~name:"no-flat-float-array" ~description:"Passes if the compiler is configured with \ --disable-flat-float-array" - (Actions_helpers.pass_or_skip (not Ocamltest_config.flat_float_array) + ~does_something:false + (Actions_helpers.predicate (not Ocamltest_config.flat_float_array) "compiler configured with --disable-flat-float-array" - "compiler configured with --enable-flat-float") + "compiler configured with --enable-flat-float-array") let flambda = Actions.make ~name:"flambda" ~description:"Passes if the compiler is configured with flambda or flambda2 enabled" - (Actions_helpers.pass_or_skip + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.flambda || Ocamltest_config.flambda2) "support for flambda enabled" "support for flambda disabled") @@ -1173,109 +1203,155 @@ let flambda = Actions.make let no_flambda = make ~name:"no-flambda" ~description:"Passes if the compiler is NOT configured with flambda or flambda2 enabled" - (Actions_helpers.pass_or_skip + ~does_something:false + (Actions_helpers.predicate (not (Ocamltest_config.flambda || Ocamltest_config.flambda2)) "support for flambda disabled" "support for flambda enabled") +let flambda2 = Actions.make + ~name:"flambda2" + ~description:"Passes if the compiler is configured with flambda2 enabled" + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.flambda2) + "support for flambda2 enabled" + "support for flambda2 disabled") + +let no_flambda2 = make + ~name:"no-flambda2" + ~description:"Passes if the compiler is NOT configured with flambda2 enabled" + ~does_something:false + (Actions_helpers.predicate (not (Ocamltest_config.flambda2)) + "support for flambda2 disabled" + "support for flambda2 enabled") + let shared_libraries = Actions.make ~name:"shared-libraries" ~description:"Passes if shared libraries are supported" - (Actions_helpers.pass_or_skip Ocamltest_config.shared_libraries + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.shared_libraries "Shared libraries are supported." "Shared libraries are not supported.") let no_shared_libraries = Actions.make ~name:"no-shared-libraries" ~description:"Passes if shared libraries are NOT supported" - (Actions_helpers.pass_or_skip (not Ocamltest_config.shared_libraries) + ~does_something:false + (Actions_helpers.predicate (not Ocamltest_config.shared_libraries) "Shared libraries are not supported." "Shared libraries are supported.") let native_compiler = Actions.make ~name:"native-compiler" ~description:"Passes if the native compiler is available" - (Actions_helpers.pass_or_skip Ocamltest_config.native_compiler + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.native_compiler "native compiler available" "native compiler not available") let native_dynlink = Actions.make ~name:"native-dynlink" ~description:"Passes if native dynlink support is available" - (Actions_helpers.pass_or_skip (Ocamltest_config.native_dynlink) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.native_dynlink) "native dynlink support available" "native dynlink support not available") let debugger = Actions.make ~name:"debugger" ~description:"Passes if the debugger is available" - (Actions_helpers.pass_or_skip Ocamltest_config.ocamldebug + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.ocamldebug "debugger available" "debugger not available") let instrumented_runtime = make ~name:"instrumented-runtime" ~description:"Passes if the instrumented runtime is available" - (Actions_helpers.pass_or_skip (Ocamltest_config.instrumented_runtime) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.instrumented_runtime) "instrumented runtime available" "instrumented runtime not available") let csharp_compiler = Actions.make ~name:"csharp-compiler" ~description:"Passes if the C# compiler is available" - (Actions_helpers.pass_or_skip (Ocamltest_config.csc<>"") + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.csc<>"") "C# compiler available" "C# compiler not available") let windows_unicode = Actions.make ~name:"windows-unicode" ~description:"Passes if Windows unicode support is available" - (Actions_helpers.pass_or_skip (Ocamltest_config.windows_unicode ) + ~does_something:false + (Actions_helpers.predicate (Ocamltest_config.windows_unicode ) "Windows Unicode support available" "Windows Unicode support not available") let afl_instrument = Actions.make ~name:"afl-instrument" ~description:"Passes if AFL instrumentation is enabled" - (Actions_helpers.pass_or_skip Ocamltest_config.afl_instrument + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.afl_instrument "AFL instrumentation enabled" "AFL instrumentation disabled") let no_afl_instrument = Actions.make ~name:"no-afl-instrument" ~description:"Passes if AFL instrumentation is NOT enabled" - (Actions_helpers.pass_or_skip (not Ocamltest_config.afl_instrument) + ~does_something:false + (Actions_helpers.predicate (not Ocamltest_config.afl_instrument) "AFL instrumentation disabled" "AFL instrumentation enabled") let stack_allocation = Actions.make ~name:"stack-allocation" ~description:"Passes if stack allocation is enabled" - (Actions_helpers.pass_or_skip Ocamltest_config.stack_allocation + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.stack_allocation "Stack allocation enabled" "Stack allocation disabled") let no_stack_allocation = Actions.make ~name:"no-stack-allocation" ~description:"Passes if stack allocation is disabled" - (Actions_helpers.pass_or_skip (not Ocamltest_config.stack_allocation) + ~does_something:false + (Actions_helpers.predicate (not Ocamltest_config.stack_allocation) "Stack allocation disabled" "Stack allocation enabled") let poll_insertion = Actions.make ~name:"poll-insertion" ~description:"Passes if poll insertion is enabled" - (Actions_helpers.pass_or_skip Ocamltest_config.poll_insertion + ~does_something:false + (Actions_helpers.predicate Ocamltest_config.poll_insertion "Poll insertion enabled" "Poll insertion disabled") let no_poll_insertion = Actions.make ~name:"no-poll-insertion" ~description:"Passes if poll insertion is disabled" - (Actions_helpers.pass_or_skip (not Ocamltest_config.poll_insertion) - "Stack allocation disabled" - "Stack allocation enabled") - + ~does_something:false + (Actions_helpers.predicate (not Ocamltest_config.poll_insertion) + "Poll insertion disabled" + "Poll insertion enabled") + +let runtime4 = Actions.make + ~name:"runtime4" + ~description:"Passes if the OCaml 4.x runtime is being used" + ~does_something:false + (Actions_helpers.predicate (not Config.runtime5) + "4.x runtime being used" + "5.x runtime being used") + +let runtime5 = Actions.make + ~name:"runtime5" + ~description:"Passes if the OCaml 5.x runtime is being used" + ~does_something:false + (Actions_helpers.predicate Config.runtime5 + "5.x runtime being used" + "4.x runtime being used") let ocamldoc = Ocaml_tools.ocamldoc let ocamldoc_output_file env prefix = @@ -1354,7 +1430,9 @@ let rec ocamldoc_compile_all log env = function let setup_ocamldoc_build_env = Actions.make ~name:"setup_ocamldoc_build_env" - ~description:"Setup ocamldoc build environment" @@ fun log env -> + ~description:"Setup ocamldoc build environment" + ~does_something:false + @@ fun log env -> let (r,env) = setup_tool_build_env ocamldoc log env in if not (Result.is_pass r) then (r,env) else let source_directory = Actions_helpers.test_source_directory env in @@ -1386,7 +1464,9 @@ let ocamldoc_o_flag env = | _ -> output let run_ocamldoc = - Actions.make ~name:"ocamldoc" ~description:"Run ocamldoc on the test file" @@ + Actions.make ~name:"ocamldoc" ~description:"Run ocamldoc on the test file" + ~does_something:true + @@ fun log env -> (* modules corresponds to secondaries modules of which the documentation and cmi files need to be build before the main @@ -1463,6 +1543,8 @@ let _ = no_flat_float_array; flambda; no_flambda; + flambda2; + no_flambda2; shared_libraries; no_shared_libraries; native_compiler; @@ -1484,5 +1566,7 @@ let _ = ocamlmklib; codegen; cc; - ocamlobjinfo + ocamlobjinfo; + runtime4; + runtime5 ] diff --git a/ocamltest/ocaml_directories.ml b/ocamltest/ocaml_directories.ml index 9ff08d70c9a..2db89eaea21 100644 --- a/ocamltest/ocaml_directories.ml +++ b/ocamltest/ocaml_directories.ml @@ -30,7 +30,8 @@ let toplevel = Filename.make_path [srcdir; "toplevel"] let runtime = - Filename.make_path [srcdir; "runtime"] + let suffix = if Config.runtime5 then "" else "4" in + Filename.make_path [srcdir; "runtime" ^ suffix] let tools = Filename.make_path [srcdir; "tools"] diff --git a/ocamltest/ocaml_files.ml b/ocamltest/ocaml_files.ml index 1e3c7dfa139..29deca40fe0 100644 --- a/ocamltest/ocaml_files.ml +++ b/ocamltest/ocaml_files.ml @@ -28,13 +28,16 @@ let runtime_variant() = else if use_runtime="i" then Instrumented else Normal +let runtime_suffix = if Config.runtime5 then "" else "4" + let ocamlrun = let runtime = match runtime_variant () with | Normal -> "ocamlrun" | Debug -> "ocamlrund" | Instrumented -> "ocamlruni" in let ocamlrunfile = Filename.mkexe runtime in - Filename.make_path [Ocaml_directories.srcdir; "runtime"; ocamlrunfile] + Filename.make_path [Ocaml_directories.srcdir; "runtime" ^ runtime_suffix; + ocamlrunfile] let ocamlc = Filename.make_path [Ocaml_directories.srcdir; Filename.mkexe "ocamlc"] @@ -77,7 +80,8 @@ let ocamldoc = let ocamldebug = Filename.make_path - [Ocaml_directories.srcdir; "debugger"; Filename.mkexe "ocamldebug"] + [Ocaml_directories.srcdir; "debugger" ^ runtime_suffix; + Filename.mkexe "ocamldebug"] let ocamlobjinfo = Filename.make_path diff --git a/ocamltest/ocaml_filetypes.ml b/ocamltest/ocaml_filetypes.ml index c399cf7cfd1..6ada82461d6 100644 --- a/ocamltest/ocaml_filetypes.ml +++ b/ocamltest/ocaml_filetypes.ml @@ -107,7 +107,7 @@ let make_filename (basename, filetype) = let extension = extension_of_filetype filetype in basename ^ "." ^ extension -let action_of_filetype = function +let[@ocaml.warning "-fragile-match"] action_of_filetype = function | Implementation -> "Compiling implementation" | Interface -> "Compiling interface" | C -> "Compiling C source file" diff --git a/ocamltest/ocaml_modifiers.ml b/ocamltest/ocaml_modifiers.ml index af4ebc0684c..e738c016e8f 100644 --- a/ocamltest/ocaml_modifiers.ml +++ b/ocamltest/ocaml_modifiers.ml @@ -96,7 +96,7 @@ let str = make_library_modifier let systhreads = unix @ (make_library_modifier - "threads" [compiler_subdir ["otherlibs"; "systhreads"]]) + "threads" [compiler_subdir ["otherlibs"; Ocamltest_config.systhreads_path]]) let runtime_events = make_library_modifier @@ -124,7 +124,12 @@ let compilerlibs_archive archive = append Ocaml_variables.libraries [archive] :: List.map add_compiler_subdir compilerlibs_subdirs -let debugger = [add_compiler_subdir "debugger"] +let runtime_suffix = if Config.runtime5 then "" else "4" + +let debugger = [add_compiler_subdir ("debugger" ^ runtime_suffix)] + +let extension_universe_lib name = + make_library_modifier name [compiler_subdir ["otherlibs"; name]] let _ = register_modifiers "principal" principal; @@ -133,6 +138,14 @@ let _ = register_modifiers "unix" unix; register_modifiers "dynlink" dynlink; register_modifiers "str" str; + List.iter + (fun name -> register_modifiers name (extension_universe_lib name)) + [ + "stdlib_upstream_compatible"; + "stdlib_stable"; + "stdlib_beta"; + "stdlib_alpha"; + ]; List.iter (fun archive -> register_modifiers archive (compilerlibs_archive archive)) [ diff --git a/ocamltest/ocaml_variables.ml b/ocamltest/ocaml_variables.ml index 1f98b6326e3..6cb561b8a97 100644 --- a/ocamltest/ocaml_variables.ml +++ b/ocamltest/ocaml_variables.ml @@ -226,6 +226,9 @@ let ocaml_script_as_argument = let plugins = Variables.make ( "plugins", "plugins for ocamldoc" ) +let runtime_dir = + Variables.make ( "runtime_dir", "leafname of the runtime directory" ) + let shared_library_cflags = Variables.make ("shared_library_cflags", "Flags used to compile C files for inclusion in shared libraries") @@ -296,6 +299,7 @@ let _ = List.iter register_variable ocaml_script_as_argument; os_type; plugins; + runtime_dir; shared_library_cflags; sharedobjext; use_runtime; diff --git a/ocamltest/ocaml_variables.mli b/ocamltest/ocaml_variables.mli index 8bd31b4fc7e..7cdd19ee5d7 100644 --- a/ocamltest/ocaml_variables.mli +++ b/ocamltest/ocaml_variables.mli @@ -129,6 +129,8 @@ val ocaml_script_as_argument : Variables.t val plugins : Variables.t +val runtime_dir : Variables.t + val shared_library_cflags : Variables.t val sharedobjext : Variables.t diff --git a/ocamltest/ocamltest.org b/ocamltest/ocamltest.org index bcee038b1db..f547a0f2c81 100644 --- a/ocamltest/ocamltest.org +++ b/ocamltest/ocamltest.org @@ -28,7 +28,7 @@ should be written. It may indeed seem odd to write a test-driver for a compiler in the language it compiles, since the compiler itself is yet untested and thus not trustworthy. -It can however be observed that the OCaml compiler is /bootstraped/, +It can however be observed that the OCaml compiler is /bootstrapped/, meaning that it is itself written in OCaml. A newer version of the compiler can thus be produced from an existing one and the (OCaml) source code of that newer version. Practically, this means that the @@ -50,7 +50,7 @@ For example, the reason why ocamltest has no support for running unit tests is that there were no such tests in the OCaml compiler's test suite. Indeed, the OCaml compiler's test suite is composed mainly of complete -programs. In this context, the most current meaning of "testing" a program +programs. In this context, the most usual meaning of "testing" a program is that the program needs to be compiled and executed. The test will be considered successful if the program compiles as expected and, when run, returns the expected value. @@ -61,7 +61,7 @@ importance to make writing tests of this form as simple as possible. However, not all tests fall into the previously described category, so it is also necessary to support not only variations on the previous scenario (compile but do not run, compile with certain options, etc.) but also -completely different tests, such as top-level tests, debugger tests, +completely different tests, such as REPL tests, debugger tests, etc. To fulfill these requirements and make it as easy as possible to turn a @@ -75,7 +75,7 @@ should be performed. The next chapter explains through examples how to write simple tests. We then introduce the key concepts used by ocamltest to provide a better understanding of how it works and can be used to write more complex -tests. The two last chapters give an in-depth description of the +tests. The last two chapters give an in-depth description of the built-in tests and actions and of the tests and actions that are specific to the OCaml compiler. @@ -96,7 +96,7 @@ with a few other useful tests. Writing tests requires that the sources of the OCaml compiler for which one wants to write them are downloaded and compiled. The compiler -does not need to be installed, though. +does not need to be installed. The sources can be downloaded either as an archive, or directly cloned through git, which seems more appropriate in the context of writing ones @@ -289,7 +289,7 @@ quite similar): output, we compare it to the one produced in action 2. Such a check may seem strange, because what it requires is that =ocamlc.byte= and =ocamlc.opt= produce exactly the same binary and not two binaries - than perform similarly when they are run, but it has proven useful in + that perform similarly when they are run, but it has proven useful in the past and has permitted to detect a subtle bug in the compiler. ** Customizing the default tests @@ -327,13 +327,13 @@ required steps to achieve this: 1. We slightly modify the test block in =hello.ml=, as follows: #+begin_src (* TEST - flags = "-w +33" + flags = "-w +33"; *) #+end_src 2. Since we now expect a non-empty output for the compilers, we need to - store the expected output in a file, namely =hello.compilers.output= - besides to =hello.ml= and =hello.reference=. To figure out what + store the expected output in a file, namely =hello.compilers.reference= + beside =hello.ml= and =hello.reference=. To figure out what this file shall contain, we can run ocamltest even before it has been created. Of course, the action that checks compiler output will fail, but in this way we will get the compiler's output @@ -365,7 +365,7 @@ named appropriately. It will indeed first lookup the test source directory for a compiler-specific reference file, e.g. =hello.ocamlc.byte.reference=. If no such file exists, a back-end-specific reference file is searched, e.g. -=hello.ocamlc.reference= for a compiler common to both =ocamlc.byte= and +=hello.ocamlc.reference= for a reference common to both =ocamlc.byte= and =ocamlc.opt=. If this file does not exist either, ocamltest falls back to looking for =hello.compilers.reference= as we have seen in this example, the absence of which meaning that the compiler's output is @@ -390,7 +390,7 @@ Our =hello.ml= test program can then be rewritten as follows: #+begin_src (* TEST -modules = "greet.ml" + modules = "greet.ml"; *) let _ = Greet.greet "world" @@ -398,7 +398,7 @@ let _ = Greet.greet "world" Provided that the =hello.compilers.reference= file previously used to test warnings is deleted, running ocamltest on =hello.ml= should work. It -will also be worth looking at the two first lines of the log file generated +will also be worth looking at the first two lines of the log file generated while running the test. It says: #+begin_src @@ -453,8 +453,8 @@ it becomes a test: #+begin_src (* TEST -directories += " ${ocamlsrcdir}/otherlibs/str " -libraries += " str " + directories += " ${ocamlsrcdir}/otherlibs/str "; + libraries += " str "; *) #+end_src @@ -500,7 +500,7 @@ test block is actually written as follows: #+begin_src (* TEST -include str + include str; *) #+end_src @@ -519,80 +519,90 @@ that it is run only on Unix platforms: #+begin_src (* TEST -:* unix -:** bytecode -:** native + unix; + { + bytecode; + } + { + native; + } *) #+end_src -As can be understood from this example, lines starting with an asterisk -describe which tests should be executed. In addition, the number of -asterisks allows to specify the nesting level of each test or action. +As can be understood from this example, tests are organised in a tree +nested blocks. Each block begins with a brace and a list of tests and +environment statements that are executed in sequence. Then the block +contains a set of sub-blocks that are executed independently of each +other (i.e. their environments are independent and they are run +regardless of the success or failure of their siblings). Here for instance, =bytecode= and =native= are sub-tests that will be run only if the =unix= test passes and will not be started if it fails or skips. -This way of describing the dependencies between tests has been inspired -by the syntax of org-mode. Each line starting with asterisks (thus lines -specifying which tests to run) can also be seen as a title. The whole -set of lines is like the outline of the test scenario. - With this information in mind, it can be seen that the smallest test block : (* TEST *) is actually equivalent to #+begin_src (* TEST -:* bytecode -:* native + { + bytecode; + } + { + native; + } *) #+end_src One common error when designing tests is to believe that a block like #+begin_src (* TEST -:* unix + unix; *) #+end_src means to execute the =unix= test that verifies that the OS is indeed Unix and then to execute the default tests. This is actually not the case. The only situation in which the default tests are considered is -when the test block contains absolutely no line starting with an -asterisk. As soon as there is a line starting with an asterisk, the +when the test block contains absolutely no test statement. +As soon as there is a test statement, the default tests are ignored completely and one needs to be totally explicit about which tests to run. So the correct way to write the erroneous block above is the use shown at the beginning of this section, namely: #+begin_src (* TEST -:* unix -:** bytecode -:** native + unix; + { + bytecode; + } + { + native; + } *) #+end_src -The fact that the language is inspired by org-mode should also be -helpful in understanding the scope of variable assignments. Roughly -speaking: - -1. Variables defined at the root level are visible by all the tests and - sub-tests that follow their assignment. - -2. If a variable is defined just below a test line, then it is visible - by that test and all its sub-tests (unless its definition is - overridden) but not by tests at a nesting level whose depth is less or - equal than the one of the test in which the variable is defined. +The braces make explicit the scope of variable assignments: an +assignement modifies a variable for the rest of its block and for all +sub-blocks (unless overridden at some point). -For instance, given the following block: +For instance, given the following blocks: #+begin_src (* TEST -foo = "abc" -:* test1 -bar = "def" -:** subtest1 -baz = "hij" -:** subtest2 -:* test2 + foo = "abc"; + { + bar = "def"; + test1; + { + baz = "hij"; + subtest1; + } + { + subtest2; + } + } + { + test2; + } *) #+end_src - The definition of =foo= is visible in all the tests @@ -618,13 +628,13 @@ but they are different in the way one specifies the expected output and also in what they can test. The =toplevel= test behaves in a spirit similar to the compiler tests described above, meaning that the expected output has to be stored in its own, separate file. Since this test -invokes the real OCaml top-level, it is useful to test advanced features -like the behavior of the top-level when its input is a file rather than +invokes the real OCaml toplevel, it is useful to test advanced features +like the behavior of the toplevel when its input is a file rather than a terminal, or similar things. In the expect test, on the contrary, the input and the output it is expected to produce can be written in the same file, close to each other. However, this test uses the OCaml -top-level as a library, rather than calling it as an external program. -So this test is actually not testing the complete real OCaml top-level, +toplevel as a library, rather than calling it as an external program. +So this test is actually not testing the complete real OCaml toplevel, but for testing language features it remains perfectly valid and is actually what is needed in most of the cases. We thus give below an example of an expect test and will describe the =toplevel= test in @@ -634,7 +644,7 @@ So, here is a toy example of an =expect= test: #+begin_src (* TEST -:* expect + expect; *) type point = { x : int; y : int };; @@ -668,8 +678,8 @@ follows: #+begin_src (* TEST -script = "${test_source_directory}/faketest.sh" -:* script + script = "${test_source_directory}/faketest.sh"; + script; *) let _ = print_endline "Hello, world!" @@ -721,14 +731,14 @@ The list of builtin variables can be obtained by running =ocamltest Environment variables for a test can be set using: #+begin_src -set VARIABLE_NAME="value" +set VARIABLE_NAME="value"; #+end_src in the test header (the quotes are mandatory). On the contrary, you can ensure that an environment variable is not set when the test runs with: #+begin_src -unset VARIABLE_NAME +unset VARIABLE_NAME; #+end_src * Built-in actions and tests @@ -747,7 +757,6 @@ running =ocamltest -show-actions=. # Things to document (requested by Leo on caml-devel) # - the syntax of the DSL -# - the precise meaning of the stars # - a clear definition of what "test" means in the context of the DSL # - a list of the builtin "actions" # - a list of which "actions" depend on which "variables" diff --git a/ocamltest/ocamltest_config.ml.in b/ocamltest/ocamltest_config.ml.in index 47b890edc54..d414d227ab1 100644 --- a/ocamltest/ocamltest_config.ml.in +++ b/ocamltest/ocamltest_config.ml.in @@ -38,6 +38,8 @@ let libunix = @ocamltest_libunix@ let systhreads = @lib_systhreads@ +let systhreads_path = {@QS@|@lib_systhreads_path@|@QS@} + let str = @lib_str@ let objext = {@QS@|@OBJEXT@|@QS@} diff --git a/ocamltest/ocamltest_config.mli b/ocamltest/ocamltest_config.mli index 1643a8163e4..54bf3d43c7f 100644 --- a/ocamltest/ocamltest_config.mli +++ b/ocamltest/ocamltest_config.mli @@ -49,6 +49,9 @@ val libunix : bool option val systhreads : bool (** Indicates whether systhreads is available. *) +val systhreads_path : string +(** Indicates where the systhreads library is installed under otherlibs/. *) + val str : bool (** Indicates whether str is available. *) diff --git a/ocamltest/ocamltest_stdlib.ml b/ocamltest/ocamltest_stdlib.ml index d52ee997ff5..9d8e5746aac 100644 --- a/ocamltest/ocamltest_stdlib.ml +++ b/ocamltest/ocamltest_stdlib.ml @@ -227,7 +227,7 @@ module Seq = struct include Seq let rec equal s1 s2 = - match s1 (), s2 () with + match[@ocaml.warning "-fragile-match"] s1 (), s2 () with | Nil, Nil -> true | Cons(e1, s1), Cons(e2, s2) -> e1 = e2 && equal s1 s2 | _, _ -> false diff --git a/ocamltest/options.ml b/ocamltest/options.ml index 342d2ff9545..d85f5b1e7b1 100644 --- a/ocamltest/options.ml +++ b/ocamltest/options.ml @@ -61,6 +61,11 @@ let list_tests = ref [] let show_timings = ref false +let translate = ref false +let style = ref Translate.Plain +let compact = ref false + + let add_to_list r x = r := !r @ [x] @@ -85,6 +90,14 @@ let commandline_options = " List tests in given directory."); ("-keep-test-dir-on-success", Arg.Set keep_test_dir_on_success, " Keep the test directory (with the generated test artefacts) on success."); + ("-translate", Arg.Set translate, + " Translate the test script from old to new syntax"); + ("-compact", Arg.Set compact, + " If translating, output the new script in compact mode."); + ("-keep-lines", Arg.Unit (fun () -> style := Translate.Lines), + " If translating, preserve line numbers in the output."); + ("-keep-chars", Arg.Unit (fun () -> style := Translate.Chars), + " If translating, preserve char offsets in the output."); ] let files_to_test = ref [] @@ -102,3 +115,6 @@ let find_test_dirs = !find_test_dirs let list_tests = !list_tests let keep_test_dir_on_success = !keep_test_dir_on_success let show_timings = !show_timings +let translate = !translate +let style = !style +let compact = !compact diff --git a/ocamltest/options.mli b/ocamltest/options.mli index 7b7c5943a48..4d98eec7cfb 100644 --- a/ocamltest/options.mli +++ b/ocamltest/options.mli @@ -32,3 +32,7 @@ val list_tests : string list val keep_test_dir_on_success : bool val show_timings : bool + +val translate : bool +val style : Translate.style +val compact : bool diff --git a/ocamltest/result.ml b/ocamltest/result.ml index 6d9fe042ce0..3ac65d78d2e 100644 --- a/ocamltest/result.ml +++ b/ocamltest/result.ml @@ -15,7 +15,9 @@ (* Definition of test-result related types and functions *) -type status = Pass | Skip | Fail +type status = Pass | Skip | Fail | Predicate of bool +(* CR xclerc/mshinwell: maybe [Predicate] should be split and put under + [Pass] and [Skip]? *) type t = { status : status; @@ -38,20 +40,52 @@ let skip_with_reason r = result_with_reason Skip r let fail_with_reason r = result_with_reason Fail r +let predicate_satisfied_with_reason r = + result_with_reason (Predicate true) r + +let predicate_not_satisfied_with_reason r = + result_with_reason (Predicate false) r + let string_of_status = function | Pass -> "=> passed" | Skip -> "=> skipped" | Fail -> "=> failed" + | Predicate true -> "=> predicate is true" + | Predicate false -> "=> predicate is false" let string_of_reason = function | None -> "" | Some reason -> (" (" ^ reason ^ ")") let string_of_result r = - (string_of_status r.status) ^ (string_of_reason r.reason) - -let is_pass r = r.status = Pass - -let is_skip r = r.status = Skip - -let is_fail r = r.status = Fail + match r.status with + | Pass + | Skip + | Fail -> + (string_of_status r.status) ^ (string_of_reason r.reason) + | Predicate b -> + Printf.sprintf "=> predicate \"%s\" is %s" + (Option.value r.reason ~default:"") + (if b then "satisfied" else "not satisfied") + +let is_pass r = + match r.status with + | Pass | Predicate true -> true + | Skip + | Fail + | Predicate false -> false + +let is_skip r = + match r.status with + | Skip | Predicate false -> true + | Pass + | Fail + | Predicate true -> false + +let is_fail r = + match r.status with + | Fail -> true + | Pass + | Skip + | Predicate true + | Predicate false -> false diff --git a/ocamltest/result.mli b/ocamltest/result.mli index 2369e5f6fe6..4aba7a975da 100644 --- a/ocamltest/result.mli +++ b/ocamltest/result.mli @@ -15,7 +15,7 @@ (* Definition of test-result related types and functions *) -type status = Pass | Skip | Fail +type status = private Pass | Skip | Fail | Predicate of bool type t = { status : status; @@ -30,6 +30,9 @@ val fail : t val pass_with_reason : string -> t +val predicate_satisfied_with_reason : string -> t +val predicate_not_satisfied_with_reason : string -> t + val skip_with_reason : string -> t val fail_with_reason : string -> t diff --git a/ocamltest/run_stubs.c b/ocamltest/run_stubs.c index b22731db8f6..e1ead17c227 100644 --- a/ocamltest/run_stubs.c +++ b/ocamltest/run_stubs.c @@ -17,7 +17,9 @@ #define _GNU_SOURCE +#ifndef CAML_INTERNALS #define CAML_INTERNALS +#endif #include #include diff --git a/ocamltest/run_unix.c b/ocamltest/run_unix.c index f8f264f471a..44444811c0f 100644 --- a/ocamltest/run_unix.c +++ b/ocamltest/run_unix.c @@ -15,7 +15,9 @@ /* Run programs with rediretions and timeouts under Unix */ +#ifndef CAML_INTERNALS #define CAML_INTERNALS +#endif #include #include diff --git a/ocamltest/tests.ml b/ocamltest/tests.ml index b6cf378c1d3..b5660100045 100644 --- a/ocamltest/tests.ml +++ b/ocamltest/tests.ml @@ -22,6 +22,20 @@ type t = { test_description : string } +let null = { + test_name = "*pass*"; + test_run_by_default = false; + test_actions = []; + test_description = "dummy test inserted by parser; always pass" +} + +let does_nothing = { + test_name = "test does nothing"; + test_run_by_default = false; + test_actions = [Actions_helpers.fail_with_reason "test does nothing"]; + test_description = "inserted when a test does not do any substantive action" +} + let compare t1 t2 = String.compare t1.test_name t2.test_name let (tests: (string, t) Hashtbl.t) = Hashtbl.create 20 @@ -63,7 +77,12 @@ let run_actions log testenv actions = action_number total (Actions.name action) (Result.string_of_result result); if Result.is_pass result - then run_actions_aux (action_number+1) env' remaining_actions + then ( + (* Avoid clobbering [Predicate true] results *) + match remaining_actions with + | [] -> result, env' + | _::_ -> run_actions_aux (action_number+1) env' remaining_actions + ) else (result, env') end in run_actions_aux 1 testenv actions diff --git a/ocamltest/tests.mli b/ocamltest/tests.mli index 71ef2ac06e2..9ecf535e41b 100644 --- a/ocamltest/tests.mli +++ b/ocamltest/tests.mli @@ -22,6 +22,10 @@ type t = { test_description : string } +val null : t + +val does_nothing : t + val compare : t -> t -> int val register : t -> unit diff --git a/ocamltest/translate.ml b/ocamltest/translate.ml new file mode 100644 index 00000000000..5c49698bffa --- /dev/null +++ b/ocamltest/translate.ml @@ -0,0 +1,138 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, projet Cambium, INRIA Paris *) +(* *) +(* Copyright 2023 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. *) +(* *) +(**************************************************************************) + +(* Translate a test file from old to new syntax. *) + +open Stdlib +open Printf + +let copy ic oc up_to = + try + while pos_in ic < up_to do + output_char oc (input_char ic) + done + with End_of_file -> () + +let text = + "Filler_text_added_to_preserve_locations_while_translating_from_old_syntax__" +let len = String.length text +let index = ref (-1) +let lorem () = incr index; text.[!index mod len] + +type mode = +| Keep_chars of int (* how many chars to skip before keeping chars *) +| Keep_lines + +let copy_newlines ~mode ic oc up_to = + let skip, insert = + match mode with + | Keep_lines -> + ref max_int, ref "(* Blank lines added here to preserve locations. *)" + | Keep_chars n -> ref n, ref "" + in + try + while pos_in ic < up_to do + let c = input_char ic in + if c = '\n' || c = '\r' then begin + output_char oc c; + output_string oc !insert; + insert := ""; + end else if !skip <= 0 then + output_char oc (lorem ()) + else + decr skip + done + with End_of_file -> () + +let tsl_block_of_file test_filename = + let input_channel = open_in test_filename in + let lexbuf = Lexing.from_channel input_channel in + Location.init lexbuf test_filename; + try + let block = Tsl_parser.tsl_block Tsl_lexer.token lexbuf in + close_in input_channel; + if !Tsl_lexer.has_comments then + eprintf "%s:1.0: warning: test script has comments\n" test_filename; + block + with + | Parsing.Parse_error -> + let open Lexing in + let p = lexbuf.lex_start_p in + Printf.eprintf "%s:%d.%d: syntax error in test script\n%!" + test_filename p.pos_lnum (p.pos_cnum - p.pos_bol); + raise Parsing.Parse_error + +(* In what style to output the translated test file *) +type style = +| Plain +| Lines +| Chars + +(* What kind of comments are used in the test file *) +type kind = { opening : string; closing : string } +let c_kind = { opening = "/*"; closing = "*/" } +let ocaml_kind = { opening = "(*"; closing = "*)" } + +let file ~style ~compact f = + let tsl_block = tsl_block_of_file f in + let (rootenv_statements, test_trees) = + Tsl_semantics.test_trees_of_tsl_block tsl_block + in + let ast = + Tsl_semantics.tsl_ast_of_test_trees (rootenv_statements, test_trees) + in + let lex_ic = open_in f in + let copy_ic = open_in f in + let lexbuf = Lexing.from_channel lex_ic in + Location.init lexbuf f; + let rec seek_to_begin () = + match[@ocaml.warning "-fragile-match"] Tsl_lexer.token lexbuf with + | Tsl_parser.TSL_BEGIN_C_STYLE position -> (c_kind, position) + | Tsl_parser.TSL_BEGIN_OCAML_STYLE position -> (ocaml_kind, position) + | _ -> seek_to_begin () + in + let rec seek_to_end () = + match[@ocaml.warning "-fragile-match"] Tsl_lexer.token lexbuf with + | Tsl_parser.TSL_END_C_STYLE -> () + | Tsl_parser.TSL_END_OCAML_STYLE -> () + | _ -> seek_to_end () + in + let (kind, position) = seek_to_begin () in + copy copy_ic stdout Lexing.(lexbuf.lex_curr_p.pos_cnum); + if position = `Below || style = Plain then begin + print_string (if ast = Tsl_ast.Ast ([], []) then " " else "\n"); + Tsl_semantics.print_tsl_ast ~compact stdout ast; + seek_to_end (); + seek_in copy_ic Lexing.(lexbuf.lex_start_p.pos_cnum); + copy copy_ic stdout max_int; + end else begin + printf "_BELOW"; + seek_to_end (); + let limit = Lexing.(lexbuf.lex_start_p.pos_cnum) in + let mode = + match style with + | Lines -> Keep_lines + | Chars -> Keep_chars 6 + | Plain -> assert false + in + copy_newlines ~mode copy_ic stdout limit; + copy copy_ic stdout max_int; + printf "\n%s TEST\n" kind.opening; + Tsl_semantics.print_tsl_ast ~compact stdout ast; + printf "%s\n" kind.closing; + end; + flush stdout; + close_in lex_ic; + close_in copy_ic; diff --git a/ocamltest/translate.mli b/ocamltest/translate.mli new file mode 100644 index 00000000000..24b02e320eb --- /dev/null +++ b/ocamltest/translate.mli @@ -0,0 +1,23 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, projet Cambium, INRIA Paris *) +(* *) +(* Copyright 2023 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. *) +(* *) +(**************************************************************************) + +(* Translate a test file from old to new syntax. *) + +type style = +| Plain +| Lines +| Chars + +val file : style:style -> compact:bool -> string -> unit diff --git a/ocamltest/tsl_ast.ml b/ocamltest/tsl_ast.ml index 0564019c121..a3082828651 100644 --- a/ocamltest/tsl_ast.ml +++ b/ocamltest/tsl_ast.ml @@ -35,6 +35,8 @@ type tsl_item = type tsl_block = tsl_item list +type t = Ast of tsl_item list * t list + let make ?(loc = Location.none) foo = { node = foo; loc = loc } let make_identifier = make diff --git a/ocamltest/tsl_ast.mli b/ocamltest/tsl_ast.mli index f8355044083..9b77255309e 100644 --- a/ocamltest/tsl_ast.mli +++ b/ocamltest/tsl_ast.mli @@ -26,6 +26,7 @@ type environment_statement = | Include of string located (* include named environment *) | Unset of string located (* clear environment variable *) +(* old syntax *) type tsl_item = | Environment_statement of environment_statement located | Test of @@ -35,6 +36,9 @@ type tsl_item = type tsl_block = tsl_item list +(* New syntax *) +type t = Ast of tsl_item list * t list + val make_identifier : ?loc:Location.t -> string -> string located val make_string : ?loc:Location.t -> string -> string located val make_environment_statement : diff --git a/ocamltest/tsl_lexer.mli b/ocamltest/tsl_lexer.mli index b25e9f85650..ec1688a403d 100644 --- a/ocamltest/tsl_lexer.mli +++ b/ocamltest/tsl_lexer.mli @@ -16,5 +16,8 @@ (* Interface to the Tsl_lexer module *) val token : Lexing.lexbuf -> Tsl_parser.token +val is_test : Lexing.lexbuf -> bool val modifier : Lexing.lexbuf -> string * [`Remove | `Add of string | `Append of string] + +val has_comments : bool ref diff --git a/ocamltest/tsl_lexer.mll b/ocamltest/tsl_lexer.mll index 8ec1674a26c..b643509eca5 100644 --- a/ocamltest/tsl_lexer.mll +++ b/ocamltest/tsl_lexer.mll @@ -20,6 +20,7 @@ open Tsl_parser let comment_start_pos = ref [] +let has_comments = ref false let lexer_error message = failwith (Printf.sprintf "Tsl lexer: %s" message) @@ -30,14 +31,32 @@ let blank = [' ' '\009' '\012'] let identchar = ['A'-'Z' 'a'-'z' '_' '.' '-' '\'' '0'-'9'] let num = ['0'-'9'] -rule token = parse +rule is_test = parse + | blank * { is_test lexbuf } + | newline { Lexing.new_line lexbuf; is_test lexbuf } + | "/*" blank* "TEST" { true } + | "/*" blank* "TEST_BELOW" { true } + | "(*" blank* "TEST" { true } + | "(*" blank* "TEST_BELOW" { true } + | _ { false } + | eof { false } + +and token = parse | blank * { token lexbuf } | newline { Lexing.new_line lexbuf; token lexbuf } - | "/*" blank* "TEST" { TSL_BEGIN_C_STYLE } - | "/*" blank* "TEST_BELOW" _ * "/*" blank* "TEST" { TSL_BEGIN_C_STYLE } + | "/*" blank* "TEST" { TSL_BEGIN_C_STYLE `Above } + | "/*" blank* "TEST_BELOW" _ * "/*" blank* "TEST" { + let s = Lexing.lexeme lexbuf in + String.iter (fun c -> if c = '\n' then Lexing.new_line lexbuf) s; + TSL_BEGIN_C_STYLE `Below + } | "*/" { TSL_END_C_STYLE } - | "(*" blank* "TEST" { TSL_BEGIN_OCAML_STYLE } - | "(*" blank* "TEST_BELOW" _ * "(*" blank* "TEST" { TSL_BEGIN_OCAML_STYLE } + | "(*" blank* "TEST" { TSL_BEGIN_OCAML_STYLE `Above } + | "(*" blank* "TEST_BELOW" _ * "(*" blank* "TEST" { + let s = Lexing.lexeme lexbuf in + String.iter (fun c -> if c = '\n' then Lexing.new_line lexbuf) s; + TSL_BEGIN_OCAML_STYLE `Below + } | "*)" { TSL_END_OCAML_STYLE } | "," { COMMA } | '*'+ { TEST_DEPTH (String.length (Lexing.lexeme lexbuf)) } @@ -53,9 +72,13 @@ rule token = parse | "with" -> WITH | _ -> IDENTIFIER s } + | "{" { LEFT_BRACE } + | "}" { RIGHT_BRACE } + | ";" { SEMI } | "(*" { comment_start_pos := [Lexing.lexeme_start_p lexbuf]; + has_comments := true; comment lexbuf } | '"' diff --git a/ocamltest/tsl_parser.mly b/ocamltest/tsl_parser.mly index e6a875a8867..c8d52ab72bb 100644 --- a/ocamltest/tsl_parser.mly +++ b/ocamltest/tsl_parser.mly @@ -31,9 +31,11 @@ let mkenvstmt envstmt = %} -%token TSL_BEGIN_C_STYLE TSL_END_C_STYLE -%token TSL_BEGIN_OCAML_STYLE TSL_END_OCAML_STYLE -%token COMMA +%token <[`Above | `Below]> TSL_BEGIN_C_STYLE +%token TSL_END_C_STYLE +%token <[`Above | `Below]> TSL_BEGIN_OCAML_STYLE +%token TSL_END_OCAML_STYLE +%token COMMA LEFT_BRACE RIGHT_BRACE SEMI %token TEST_DEPTH %token EQUAL PLUSEQUAL /* %token COLON */ @@ -41,11 +43,34 @@ let mkenvstmt envstmt = %token IDENTIFIER %token STRING -%start tsl_block +%start tsl_block tsl_script %type tsl_block +%type tsl_script %% +node: +| statement_list tree_list { Ast ($1, $2) } + +tree_list: +| { [] } +| tree tree_list { $1 :: $2 } + +tree: +| LEFT_BRACE node RIGHT_BRACE { $2 } + +statement_list: +| { [] } +| statement statement_list { $1 :: $2 } + +statement: +| env_item SEMI { $1 } +| identifier with_environment_modifiers SEMI { Test (0, $1, $2) } + +tsl_script: +| TSL_BEGIN_C_STYLE node TSL_END_C_STYLE { $2 } +| TSL_BEGIN_OCAML_STYLE node TSL_END_OCAML_STYLE { $2 } + tsl_block: | TSL_BEGIN_C_STYLE tsl_items TSL_END_C_STYLE { $2 } | TSL_BEGIN_OCAML_STYLE tsl_items TSL_END_OCAML_STYLE { $2 } diff --git a/ocamltest/tsl_semantics.ml b/ocamltest/tsl_semantics.ml index 09fb8f99170..6167622f249 100644 --- a/ocamltest/tsl_semantics.ml +++ b/ocamltest/tsl_semantics.ml @@ -92,6 +92,19 @@ type test_tree = string located list * (test_tree list) +let tests_do_something (tests : Tests.t) = + List.exists Actions.does_something tests.test_actions + +(* CR mshinwell/xclerc: maybe sequences of actions that "do something" and + then have further actions that do not "do something" should be + flagged *) +let rec test_tree_does_something_on_all_branches tree = + match tree with + | Node (_, tests, _, []) -> tests_do_something tests + | Node (_, tests, _, children) -> + tests_do_something tests + || List.for_all test_tree_does_something_on_all_branches children + let too_deep testname max_level real_level = Printf.eprintf "Test %s should have depth atmost %d but has depth %d\n%!" testname max_level real_level; @@ -107,8 +120,19 @@ let no_such_test_or_action t = Printf.eprintf "%s\nNo such test or action: %s\n%!" locstr t.node; exit 2 +let lookup_test located_name = + let name = located_name.node in + match Tests.lookup name with + | None -> + begin match Actions.lookup name with + | None -> no_such_test_or_action located_name + | Some action -> + Tests.test_of_action action + end + | Some test -> test + let test_trees_of_tsl_block tsl_block = - let rec env_of_lines = function + let rec env_of_lines = function [@ocaml.warning "-fragile-match"] | [] -> ([], []) | Environment_statement s :: lines -> let (env', remaining_lines) = env_of_lines lines in @@ -127,16 +151,8 @@ let test_trees_of_tsl_block tsl_block = else let (env, rem) = env_of_lines remaining_lines in let (trees, rem) = trees_of_lines (depth+1) rem in - match Tests.lookup name with - | None -> - begin match Actions.lookup name with - | None -> no_such_test_or_action located_name - | Some action -> - let test = Tests.test_of_action action in - (Some (Node (env, test, env_modifiers, trees)), rem) - end - | Some test -> - (Some (Node (env, test, env_modifiers, trees)), rem) + let test = lookup_test located_name in + (Some (Node (env, test, env_modifiers, trees)), rem) end end and trees_of_lines depth lines = @@ -153,7 +169,7 @@ let test_trees_of_tsl_block tsl_block = (List.rev !trees, !remaining_lines) in let (env, rem) = env_of_lines tsl_block in let (trees, rem) = trees_of_lines 1 rem in - match rem with + match[@ocaml.warning "-fragile-match"] rem with | [] -> (env, trees) | (Environment_statement s)::_ -> unexpected_environment_statement s | _ -> assert false @@ -175,3 +191,108 @@ let actions_in_tests tests = let f test action_set = Actions.ActionSet.union (actions_in_test test) action_set in Tests.TestSet.fold f tests Actions.ActionSet.empty + +let rec split_env l = + match[@ocaml.warning "-fragile-match"] l with + | Environment_statement env :: tl -> + let (env2, rest) = split_env tl in (env :: env2, rest) + | _ -> ([], l) + +let rec test_trees_of_tsl_ast (Ast (seq, subs)) = + let (env, rest) = split_env seq in + let trees = + match rest with + | [] -> List.map test_tree_of_tsl_ast subs + | [ Test (_, name, mods) ] -> + [Node ([], lookup_test name, mods, List.map test_tree_of_tsl_ast subs)] + | Test (_, name, mods) :: seq1 -> + let sub = test_tree_of_tsl_ast (Ast (seq1, subs)) in + [Node ([], lookup_test name, mods, [sub])] + | Environment_statement _ :: _ -> assert false + in (env, trees) + +and test_tree_of_tsl_ast ast = + match[@ocaml.warning "-fragile-match"] test_trees_of_tsl_ast ast with + | (env, [Node (env1, t, m, s)]) -> Node (env @ env1, t, m, s) + | (env, trees) -> Node (env, Tests.null, [], trees) + +let test_trees_of_tsl_ast ast = + let (env, trees) = test_trees_of_tsl_ast ast in + let does_something = + List.for_all test_tree_does_something_on_all_branches trees + in + if does_something then env, trees + else + let tree = + match trees with + | [] -> [] + | Node (_, _, name, _) :: _ -> + [Node ([], Tests.does_nothing, name, [])] + in + env, tree + +let rec ast_of_tree (Node (env, test, mods, subs)) = + let tst = [Test (0, Tsl_ast.make_identifier test.Tests.test_name, mods)] in + ast_of_tree_aux env tst subs + +and ast_of_tree_aux env tst subs = + let env = List.map (fun x -> Environment_statement x) env in + match[@ocaml.warning "-fragile-match"] List.map ast_of_tree subs with + | [ Ast (stmts, subs) ] -> Ast (env @ tst @ stmts, subs) + | asts -> Ast (env @ tst, asts) + +let tsl_ast_of_test_trees (env, trees) = ast_of_tree_aux env [] trees + +open Printf + +let print_tsl_ast ~compact oc ast = + let pr fmt (*args*) = fprintf oc fmt (*args*) in + + let rec print_ast indent (Ast (stmts, subs)) = + print_statements indent stmts; + print_forest indent subs; + + and print_sub indent ast = + pr "{\n"; + print_ast (indent ^ " ") ast; + pr "%s}" indent; + + and print_statements indent stmts = + match stmts with + | Test (_, name, mods) :: tl -> + pr "%s%s" indent name.node; + begin match mods with + | m :: tl -> + pr " with %s" m.node; + List.iter (fun m -> pr ", %s" m.node) tl; + | [] -> () + end; + pr ";\n"; + if tl <> [] && not compact then pr "\n"; + print_statements indent tl; + | Environment_statement env :: tl-> + print_env indent env; + print_statements indent tl; + | [] -> () + + and print_forest indent subs = + if subs <> [] then begin + pr "%s" indent; + List.iter (print_sub indent) subs; + pr "\n"; + end + + and print_env indent e = + match e.node with + | Assignment (set, variable, value) -> + pr "%s" indent; + if set then pr "set "; + pr "%s = \"%s\";\n" variable.node value.node; + | Append (variable, value) -> + pr "%s%s += \"%s\";\n" indent variable.node value.node; + | Include ls -> + pr "%sinclude %s;\n" indent ls.node; + | Unset ls -> + pr "%sunset %s;\n" indent ls.node; + in + print_ast " " ast; diff --git a/ocamltest/tsl_semantics.mli b/ocamltest/tsl_semantics.mli index cbb017e6817..385692f0a7f 100644 --- a/ocamltest/tsl_semantics.mli +++ b/ocamltest/tsl_semantics.mli @@ -35,9 +35,17 @@ type test_tree = (test_tree list) val test_trees_of_tsl_block : - Tsl_ast.tsl_block -> + Tsl_ast.tsl_item list -> Tsl_ast.environment_statement located list * test_tree list +val test_trees_of_tsl_ast : + Tsl_ast.t -> + Tsl_ast.environment_statement located list * test_tree list + +val tsl_ast_of_test_trees : + Tsl_ast.environment_statement located list * test_tree list -> + Tsl_ast.t + val tests_in_tree : test_tree -> Tests.TestSet.t val tests_in_trees : test_tree list -> Tests.TestSet.t @@ -45,3 +53,6 @@ val tests_in_trees : test_tree list -> Tests.TestSet.t val actions_in_test : Tests.t -> Actions.ActionSet.t val actions_in_tests : Tests.TestSet.t -> Actions.ActionSet.t + + +val print_tsl_ast : compact:bool -> out_channel -> Tsl_ast.t -> unit diff --git a/otherlibs/Makefile b/otherlibs/Makefile index 5fe2d750cdf..8c8d34f8db5 100644 --- a/otherlibs/Makefile +++ b/otherlibs/Makefile @@ -21,7 +21,7 @@ include $(ROOTDIR)/Makefile.common # at the moment, the clean targets depend on this variable but # when they are invoked ../Makefile.config is not included, so that # OTHERLIBRARIES would be empty and the clean targets would thus not work. -OTHERLIBRARIES ?= dynlink str systhreads unix runtime_events +OTHERLIBRARIES ?= dynlink str systhreads$(RUNTIME_SUFFIX) unix runtime_events # $1: target name to dispatch to all otherlibs/*/Makefile define dispatch_ diff --git a/otherlibs/dynlink/.depend b/otherlibs/dynlink/.depend index d63d8da9e01..2a6b0ffc99a 100644 --- a/otherlibs/dynlink/.depend +++ b/otherlibs/dynlink/.depend @@ -1,19 +1,19 @@ -dynlink.cmo : \ +byte/dynlink.cmo : \ dynlink_types.cmi \ - dynlink_compilerlibs.cmi \ + byte/dynlink_compilerlibs.cmi \ dynlink_common.cmi \ + byte/dynlink.cmi +dynlink.cmo : \ + dynlink_types.cmi \ dynlink.cmi dynlink.cmi : dynlink_common.cmo : \ dynlink_types.cmi \ dynlink_platform_intf.cmi \ - dynlink_compilerlibs.cmi \ + byte/dynlink_compilerlibs.cmi \ dynlink_common.cmi dynlink_common.cmi : \ dynlink_platform_intf.cmi -dynlink_compilerlibs.cmo : \ - dynlink_compilerlibs.cmi -dynlink_compilerlibs.cmi : dynlink_platform_intf.cmo : \ dynlink_types.cmi \ dynlink_platform_intf.cmi @@ -24,18 +24,19 @@ dynlink_types.cmo : \ dynlink_types.cmi : dynlink.cmx : \ dynlink_types.cmx \ - dynlink_compilerlibs.cmx \ - dynlink_common.cmx \ dynlink.cmi dynlink_common.cmx : \ dynlink_types.cmx \ dynlink_platform_intf.cmx \ - dynlink_compilerlibs.cmx \ + native/dynlink_compilerlibs.cmx \ dynlink_common.cmi -dynlink_compilerlibs.cmx : \ - dynlink_compilerlibs.cmi dynlink_platform_intf.cmx : \ dynlink_types.cmx \ dynlink_platform_intf.cmi dynlink_types.cmx : \ dynlink_types.cmi +native/dynlink.cmx : \ + dynlink_types.cmx \ + native/dynlink_compilerlibs.cmx \ + dynlink_common.cmx \ + native/dynlink.cmi diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index 65e6484a0cf..ad5833d942b 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -1,4 +1,3 @@ - #************************************************************************** #* * #* OCaml * @@ -36,13 +35,16 @@ ifeq "$(FLAMBDA)" "true" OPTCOMPFLAGS += -O3 endif +COMPFLAGS += -I byte +OPTCOMPFLAGS += -I native + LOCAL_SRC=dynlink_compilerlibs -OBJS=dynlink_compilerlibs.cmo dynlink_types.cmo \ - dynlink_platform_intf.cmo dynlink_common.cmo dynlink.cmo +OBJS=byte/dynlink_compilerlibs.cmo dynlink_types.cmo \ + dynlink_platform_intf.cmo dynlink_common.cmo byte/dynlink.cmo -NATOBJS=dynlink_compilerlibs.cmx dynlink_types.cmx \ - dynlink_platform_intf.cmx dynlink_common.cmx dynlink.cmx +NATOBJS=native/dynlink_compilerlibs.cmx dynlink_types.cmx \ + dynlink_platform_intf.cmx dynlink_common.cmx native/dynlink.cmx # We need/desire access to compilerlibs for various reasons: # - The bytecode dynamic linker is in compilerlibs and has many dependencies @@ -62,15 +64,18 @@ NATOBJS=dynlink_compilerlibs.cmx dynlink_types.cmx \ # .mli files from compilerlibs that don't have a corresponding .ml file. COMPILERLIBS_INTFS=\ parsing/asttypes.mli \ - parsing/jane_asttypes.mli \ parsing/parsetree.mli \ + typing/solver_intf.mli \ + typing/mode_intf.mli \ typing/outcometree.mli \ + typing/value_rec_types.mli \ file_formats/cmo_format.mli \ file_formats/cmxs_format.mli \ bytecomp/debug_event.mli # .ml files from compilerlibs that have corresponding .mli files. COMPILERLIBS_SOURCES=\ + utils/runtimetags.ml \ utils/binutils.ml \ utils/config.ml \ utils/build_path_prefix_map.ml \ @@ -79,8 +84,9 @@ COMPILERLIBS_SOURCES=\ utils/numbers.ml \ utils/arg_helper.ml \ utils/local_store.ml \ - utils/load_path.ml \ utils/clflags.ml \ + utils/load_path.ml \ + utils/zero_alloc_annotations.ml \ utils/debug.ml \ utils/language_extension_kernel.ml \ utils/language_extension.ml \ @@ -95,6 +101,7 @@ COMPILERLIBS_SOURCES=\ utils/linkage_name.ml \ utils/symbol.ml \ utils/lazy_backtrack.ml \ + utils/zero_alloc_utils.ml \ parsing/location.ml \ parsing/longident.ml \ parsing/docstrings.ml \ @@ -108,13 +115,17 @@ COMPILERLIBS_SOURCES=\ parsing/ast_mapper.ml \ parsing/attr_helper.ml \ parsing/pprintast.ml \ + typing/solver.ml \ typing/mode.ml \ typing/path.ml \ typing/shape.ml \ - typing/jkind.ml \ + typing/jkind_types.ml \ typing/primitive.ml \ - typing/shape.ml \ + typing/zero_alloc.ml \ typing/types.ml \ + typing/oprint.ml \ + typing/jkind.ml \ + typing/typedtree.ml \ typing/btype.ml \ typing/subst.ml \ typing/predef.ml \ @@ -122,6 +133,7 @@ COMPILERLIBS_SOURCES=\ file_formats/cmi_format.ml \ typing/persistent_env.ml \ typing/env.ml \ + typing/shape_reduce.ml \ lambda/debuginfo.ml \ lambda/lambda.ml \ lambda/runtimedef.ml \ @@ -205,22 +217,27 @@ $(LOCAL_SRC)/%.cmx: $(LOCAL_SRC)/%.ml # Rules for building the [Dynlink_compilerlibs] bytecode and native packs # from their components. -# The dynlink_compilerlibs.cmi file is unfortunately written by both the ocamlc -# and ocamlopt invocations. The resulting files are different, probably because -# of sharing differences. Writing an .mli file would be problematic. Instead -# we allow the compiler to generate the inferred .cmi upon the ocamlc -# invocation, then trick it (by touching dynlink_compilerlibs.mli) upon the -# ocamlopt invocation, which causes it to use the ocamlc-generated .cmi. -dynlink_compilerlibs.cmi: $(COMPILERLIBS_CMO) - rm -f dynlink_compilerlibs.mli - $(V_OCAMLC)$(OCAMLC) $(COMPFLAGS) -pack -o dynlink_compilerlibs.cmo $(COMPILERLIBS_CMO) - -dynlink_compilerlibs.cmo: dynlink_compilerlibs.cmi - -dynlink_compilerlibs.cmx: $(COMPILERLIBS_CMX) dynlink_compilerlibs.cmi - touch dynlink_compilerlibs.mli + +# A multi-target pattern rule can tell GNU make that the recipe simultaneously +# produces both the cmo and cmi file for Dynlink_compilerlibs. GNU make 4.3+ +# would be required to do the same thing with a static rule (with its grouped +# targets feature). +byt%/dynlink_compilerlibs.cmo byt%/dynlink_compilerlibs.cmi: $(COMPILERLIBS_CMO) + @$(if $(filter-out e,$*),\ + $(error Should only build byte/dynlink_compilerlibs.cmo!)) + $(V_OCAMLC)$(OCAMLC) $(COMPFLAGS) -pack -o byte/dynlink_compilerlibs.cmo $^ + +native/dynlink_compilerlibs.cmx: $(COMPILERLIBS_CMX) $(V_OCAMLOPT)$(OCAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -pack -o $@ $(COMPILERLIBS_CMX) +%/dynlink.cmi: dynlink.cmi dynlink.mli + cp $^ $*/ + +# Rules for building the interface of the [Dynlink_compilerlibs] packs. +# To avoid falling foul of the problem described below, the .cmo and .cmx +# files for the dynlink-specific compilerlibs packs generated here---and in +# particular the corresponding .cmi files -- are kept in separate directories. + # The main dynlink rules start here. all: dynlink.cma @@ -228,10 +245,17 @@ all: dynlink.cma allopt: dynlink.cmxa dynlink.cma: $(OBJS) - $(V_LINKC)$(OCAMLC) $(COMPFLAGS) -ccopt "$(NATDYNLINKOPTS)" -a -o $@ $^ + $(V_LINKC)$(OCAMLC) $(COMPFLAGS) -ccopt "$(NATDYNLINKOPTS)" -a -I byte -o $@ $^ dynlink.cmxa: $(NATOBJS) - $(V_LINKOPT)$(OCAMLOPT) $(COMPFLAGS) -ccopt "$(NATDYNLINKOPTS)" -a -o $@ $^ + $(V_LINKOPT)$(OCAMLOPT) $(COMPFLAGS) -ccopt "$(NATDYNLINKOPTS)" -a -I native \ + -o $@ $^ +# As for all other .cmxa files, ensure that the .cmx files are in the same +# directory. If this were omitted, ocamldoc in particular will fail to build +# with a -opaque warning. Note that installopt refers to $(NATOBJS) so doesn't +# require this file to exist, hence its inclusion in the recipe for dynlink.cmxa +# rather than as a dependency elsewhere. + cp native/dynlink.cmx dynlink.cmx # Since there is no .mli for [Dynlink_platform_intf], we need to be # careful that compilation of the .cmx file does not write the .cmi file again, @@ -267,14 +291,15 @@ endif partialclean: rm -f *.cm[ioaxt] *.cmti *.cmxa \ - *.cm[iotx] *.cmti *.o *.obj \ + byte/*.cm[iot] byte/*.cmti \ + native/*.cm[ixt] native/*.cmti native/*.o native/*.obj \ $(LOCAL_SRC)/*.cm[ioaxt] $(LOCAL_SRC)/*.cmti \ $(LOCAL_SRC)/*.o $(LOCAL_SRC)/*.obj clean: partialclean rm -f *.a *.lib *.o *.obj *.so *.dll dynlink_platform_intf.mli \ $(LOCAL_SRC)/*.ml $(LOCAL_SRC)/*.mli $(LOCAL_SRC)/Makefile \ - $(LOCAL_SRC)/.depend + $(LOCAL_SRC)/.depend byte/dynlink.mli native/dynlink.mli .PHONY: distclean distclean: clean @@ -285,15 +310,17 @@ beforedepend: dynlink_platform_intf.mli .PHONY: depend DEPEND_DUMMY_FILES=\ - dynlink_compilerlibs.ml \ - dynlink_compilerlibs.mli + native/dynlink_compilerlibs.ml \ + byte/dynlink_compilerlibs.mli \ + byte/dynlink.mli \ + native/dynlink.mli depend: beforedepend $(V_GEN)touch $(DEPEND_DUMMY_FILES) && \ $(OCAMLRUN) $(ROOTDIR)/boot/ocamlc -depend -slash \ - -bytecode *.mli *.ml byte/dynlink.ml > .depend && \ + -I byte -bytecode *.mli *.ml byte/dynlink.ml > .depend && \ $(OCAMLRUN) $(ROOTDIR)/boot/ocamlc -depend -slash \ - -native *.ml native/dynlink.ml >> .depend && \ + -I native -native *.ml native/dynlink.ml >> .depend && \ rm -f $(DEPEND_DUMMY_FILES) include .depend diff --git a/otherlibs/dynlink/byte/dynlink.ml b/otherlibs/dynlink/byte/dynlink.ml new file mode 100644 index 00000000000..cfbdbbecca8 --- /dev/null +++ b/otherlibs/dynlink/byte/dynlink.ml @@ -0,0 +1,251 @@ +#2 "otherlibs/dynlink/dynlink.ml" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell and Leo White, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2017--2018 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +[@@@ocaml.warning "+a-4-30-40-41-42"] + +open! Dynlink_compilerlibs + +module DC = Dynlink_common +module DT = Dynlink_types + +let convert_cmi_import import = + let name = Import_info.name import |> Compilation_unit.Name.to_string in + let crc = Import_info.crc import in + name, crc + +module Bytecode = struct + type filename = string + + module Unit_header = struct + type t = Cmo_format.compilation_unit_descr + + let name (t : t) = Compilation_unit.full_path_as_string t.cu_name + let crc _t = None + + let interface_imports (t : t) = + List.map convert_cmi_import (Array.to_list t.cu_imports) + + let implementation_imports (t : t) = + let required_from_unit = + t.cu_required_globals + |> List.map Compilation_unit.to_global_ident_for_bytecode + in + let required = + required_from_unit + @ Symtable.required_globals t.cu_reloc + in + let required = + List.filter + (fun id -> + not (Ident.is_predef id) + && not (String.contains (Ident.name id) '.')) + required + in + List.map + (fun ident -> Ident.name ident, None) + required + + let defined_symbols (t : t) = + List.map (fun ident -> Ident.name ident) + (Symtable.defined_globals t.cu_reloc) + + let unsafe_module (t : t) = t.cu_primitives <> [] + end + + type handle = Stdlib.in_channel * filename * Digest.t + + let default_crcs = ref [| |] + let default_global_map = ref Symtable.empty_global_map + + let init () = + if !Sys.interactive then begin (* PR#6802 *) + invalid_arg "The dynlink.cma library cannot be used \ + inside the OCaml toplevel" + end; + default_crcs := Symtable.init_toplevel (); + default_global_map := Symtable.current_state () + + let is_native = false + let adapt_filename f = f + + let num_globals_inited () = + Misc.fatal_error "Should never be called for bytecode dynlink" + + let assume_no_prefix modname = + Compilation_unit.create Compilation_unit.Prefix.empty modname + + let fold_initial_units ~init ~f = + Array.fold_left (fun acc import -> + let modname = Import_info.name import in + let crc = Import_info.crc import in + let id = + Compilation_unit.to_global_ident_for_bytecode + (assume_no_prefix modname) + in + let defined = + Symtable.is_defined_in_global_map !default_global_map id + in + let implementation = + if defined then Some (None, DT.Loaded) + else None + in + let defined_symbols = + if defined then [Ident.name id] + else [] + in + let comp_unit = modname |> Compilation_unit.Name.to_string in + f acc ~comp_unit ~interface:crc ~implementation ~defined_symbols) + init + !default_crcs + + let run_shared_startup _ = () + + let with_lock lock f = + match lock with + | None -> f () + | Some lock -> + Mutex.lock lock; + Fun.protect f + ~finally:(fun () -> Mutex.unlock lock) + + let run lock (ic, file_name, file_digest) ~unit_header ~priv = + let open Misc in + let clos = with_lock lock (fun () -> + let old_state = Symtable.current_state () in + let compunit : Cmo_format.compilation_unit_descr = unit_header in + seek_in ic compunit.cu_pos; + let code_size = compunit.cu_codesize + 8 in + let code = LongString.create code_size in + LongString.input_bytes_into code ic compunit.cu_codesize; + LongString.set code compunit.cu_codesize (Char.chr Opcodes.opRETURN); + LongString.blit_string "\000\000\000\001\000\000\000" 0 + code (compunit.cu_codesize + 1) 7; + begin try + Symtable.patch_object code compunit.cu_reloc; + Symtable.check_global_initialized compunit.cu_reloc; + Symtable.update_global_table () + with Symtable.Error error -> + let new_error : DT.linking_error = + match error with + | Symtable.Undefined_global s -> Undefined_global s + | Symtable.Unavailable_primitive s -> Unavailable_primitive s + | Symtable.Uninitialized_global s -> Uninitialized_global s + | Symtable.Wrong_vm _ -> assert false + in + raise (DT.Error (Linking_error (file_name, new_error))) + end; + (* PR#5215: identify this code fragment by + digest of file contents + unit name. + Unit name is needed for .cma files, which produce several code + fragments. *) + let digest = + Digest.string + (file_digest ^ Compilation_unit.full_path_as_string compunit.cu_name) + in + let events = + if compunit.cu_debug = 0 then [| |] + else begin + seek_in ic compunit.cu_debug; + [| input_value ic |] + end in + if priv then Symtable.hide_additions old_state; + let _, clos = Meta.reify_bytecode code events (Some digest) in + clos + ) + in + (* We need to release the dynlink lock here to let the module initialization + code dynlinks plugins too. + *) + try ignore ((clos ()) : Obj.t); + with exn -> + Printexc.raise_with_backtrace + (DT.Error (Library's_module_initializers_failed exn)) + (Printexc.get_raw_backtrace ()) + + let load ~filename:file_name ~priv:_ = + let ic = open_in_bin file_name in + let file_digest = Digest.channel ic (-1) in + seek_in ic 0; + try + let buffer = + try really_input_string ic (String.length Config.cmo_magic_number) + with End_of_file -> raise (DT.Error (Not_a_bytecode_file file_name)) + in + let handle = ic, file_name, file_digest in + if buffer = Config.cmo_magic_number then begin + let compunit_pos = input_binary_int ic in (* Go to descriptor *) + seek_in ic compunit_pos; + let cu = (input_value ic : Cmo_format.compilation_unit_descr) in + handle, [cu] + end else + if buffer = Config.cma_magic_number then begin + let toc_pos = input_binary_int ic in (* Go to table of contents *) + seek_in ic toc_pos; + let lib = (input_value ic : Cmo_format.library) in + begin try + Dll.open_dlls Dll.For_execution + (List.map Dll.extract_dll_name lib.lib_dllibs) + with exn -> + raise (DT.Error (Cannot_open_dynamic_library exn)) + end; + handle, lib.lib_units + end else begin + raise (DT.Error (Not_a_bytecode_file file_name)) + end + with exc -> + close_in ic; + raise exc + + let register _handle _header ~priv:_ ~filename:_ = () + + let unsafe_get_global_value ~bytecode_or_asm_symbol = + let id = Ident.create_persistent bytecode_or_asm_symbol in + match Symtable.get_global_value id with + | exception _ -> None + | obj -> Some obj + + let does_symbol_exist ~bytecode_or_asm_symbol = + Option.is_some (unsafe_get_global_value ~bytecode_or_asm_symbol) + + let finish (ic, _filename, _digest) = + close_in ic +end + +include DC.Make (Bytecode) + +type linking_error = DT.linking_error = + | Undefined_global of string + | Unavailable_primitive of string + | Uninitialized_global of string + +type error = DT.error = + | Not_a_bytecode_file of string + | Inconsistent_import of string + | Unavailable_unit of string + | Unsafe_file + | Linking_error of string * linking_error + | Corrupted_interface of string + | Cannot_open_dynamic_library of exn + | Library's_module_initializers_failed of exn + | Inconsistent_implementation of string + | Module_already_loaded of string + | Private_library_cannot_implement_interface of string + | Library_file_already_loaded_privately of { filename : string; } + +exception Error = DT.Error +let error_message = DT.error_message diff --git a/otherlibs/dynlink/dune b/otherlibs/dynlink/dune index 095505ec12b..73919ddb674 100644 --- a/otherlibs/dynlink/dune +++ b/otherlibs/dynlink/dune @@ -12,14 +12,43 @@ ;* * ;************************************************************************** +(rule + (targets dynlink_internal_byte.ml) + (deps byte/dynlink.ml) + (action (copy %{deps} %{targets}))) + +(library + (name dynlink_internal_byte) + (wrapped false) + (modes byte native) + (modules dynlink_internal_byte) + (libraries dynlink_compilerlibs dynlink_internal_common)) + +(rule + (targets dynlink_internal_native.ml) + (deps native/dynlink.ml) + (action (copy %{deps} %{targets}))) + +(library + (name dynlink_internal_native) + (wrapped false) + (modes byte native) + (modules dynlink_internal_native) + (libraries dynlink_compilerlibs dynlink_internal_common)) + (library (name dynlink_compilerlibs) (wrapped true) (modes byte native) - (flags ( - -strict-sequence -principal -absname -w +a-4-9-40-41-42-44-45-48-66-70 - -warn-error A -bin-annot -safe-string -strict-formats - )) + (flags + (:standard + -strict-sequence + -absname + -w + +67 + -bin-annot + -safe-string + -strict-formats)) (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) (modules binutils @@ -30,6 +59,7 @@ identifiable numbers arg_helper + zero_alloc_annotations clflags debug language_extension_kernel @@ -44,6 +74,7 @@ longident docstrings printast + pprintast syntaxerr jane_syntax_parsing jane_syntax @@ -55,12 +86,22 @@ ident path shape - jkind - primitive + shape_reduce + solver_intf + solver + mode_intf mode + jkind_intf + jkind_types + primitive + zero_alloc types + oprint + jkind + value_rec_types btype lazy_backtrack + zero_alloc_utils subst predef datarepr @@ -70,6 +111,7 @@ debuginfo lambda runtimedef + runtimetags instruct opcodes bytesections @@ -77,8 +119,8 @@ meta symtable asttypes - jane_asttypes parsetree + typedtree outcometree cmo_format cmxs_format @@ -89,12 +131,15 @@ linkage_name) (modules_without_implementation asttypes - jane_asttypes parsetree outcometree cmo_format cmxs_format - debug_event)) + debug_event + solver_intf + mode_intf + value_rec_types + )) ;(install ; (files @@ -106,6 +151,7 @@ ; (package ocaml)) ;; .ml: +(copy_files ../../utils/runtimetags.ml) (copy_files ../../utils/binutils.ml) (copy_files ../../utils/local_store.ml) (copy_files ../../utils/config.ml) @@ -114,6 +160,7 @@ (copy_files ../../utils/identifiable.ml) (copy_files ../../utils/numbers.ml) (copy_files ../../utils/arg_helper.ml) +(copy_files ../../utils/zero_alloc_annotations.ml) (copy_files ../../utils/clflags.ml) (copy_files ../../utils/debug.ml) (copy_files ../../utils/language_extension_kernel.ml) @@ -129,10 +176,12 @@ (copy_files ../../utils/symbol.ml) (copy_files ../../utils/linkage_name.ml) (copy_files ../../utils/lazy_backtrack.ml) +(copy_files ../../utils/zero_alloc_utils.ml) (copy_files ../../parsing/location.ml) (copy_files ../../parsing/longident.ml) (copy_files ../../parsing/docstrings.ml) (copy_files ../../parsing/printast.ml) +(copy_files ../../parsing/pprintast.ml) (copy_files ../../parsing/syntaxerr.ml) (copy_files ../../parsing/jane_syntax_parsing.ml) (copy_files ../../parsing/jane_syntax.ml) @@ -144,14 +193,21 @@ (copy_files ../../typing/ident.ml) (copy_files ../../typing/path.ml) (copy_files ../../typing/jkind.ml) +(copy_files ../../typing/jkind_intf.ml) +(copy_files ../../typing/jkind_types.ml) +(copy_files ../../typing/oprint.ml) (copy_files ../../typing/primitive.ml) (copy_files ../../typing/shape.ml) +(copy_files ../../typing/solver.ml) +(copy_files ../../typing/shape_reduce.ml) (copy_files ../../typing/mode.ml) +(copy_files ../../typing/zero_alloc.ml) (copy_files ../../typing/types.ml) (copy_files ../../typing/btype.ml) (copy_files ../../typing/subst.ml) (copy_files ../../typing/predef.ml) (copy_files ../../typing/datarepr.ml) +(copy_files ../../typing/typedtree.ml) (copy_files ../../file_formats/cmi_format.ml) (copy_files ../../typing/persistent_env.ml) (copy_files ../../typing/env.ml) @@ -166,6 +222,7 @@ (copy_files ../../bytecomp/symtable.ml) ;; .mli: +(copy_files ../../utils/runtimetags.mli) (copy_files ../../utils/binutils.mli) (copy_files ../../utils/local_store.mli) (copy_files ../../utils/config.mli) @@ -174,6 +231,7 @@ (copy_files ../../utils/identifiable.mli) (copy_files ../../utils/numbers.mli) (copy_files ../../utils/arg_helper.mli) +(copy_files ../../utils/zero_alloc_annotations.mli) (copy_files ../../utils/clflags.mli) (copy_files ../../utils/debug.mli) (copy_files ../../utils/language_extension_kernel.mli) @@ -189,10 +247,12 @@ (copy_files ../../utils/symbol.mli) (copy_files ../../utils/linkage_name.mli) (copy_files ../../utils/lazy_backtrack.mli) +(copy_files ../../utils/zero_alloc_utils.mli) (copy_files ../../parsing/location.mli) (copy_files ../../parsing/longident.mli) (copy_files ../../parsing/docstrings.mli) (copy_files ../../parsing/printast.mli) +(copy_files ../../parsing/pprintast.mli) (copy_files ../../parsing/syntaxerr.mli) (copy_files ../../parsing/jane_syntax_parsing.mli) (copy_files ../../parsing/jane_syntax.mli) @@ -204,14 +264,22 @@ (copy_files ../../typing/ident.mli) (copy_files ../../typing/path.mli) (copy_files ../../typing/jkind.mli) +(copy_files ../../typing/jkind_intf.mli) +(copy_files ../../typing/jkind_types.mli) +(copy_files ../../typing/oprint.mli) (copy_files ../../typing/primitive.mli) (copy_files ../../typing/shape.mli) +(copy_files ../../typing/solver.mli) +(copy_files ../../typing/shape_reduce.mli) (copy_files ../../typing/mode.mli) +(copy_files ../../typing/zero_alloc.mli) (copy_files ../../typing/types.mli) (copy_files ../../typing/btype.mli) (copy_files ../../typing/subst.mli) (copy_files ../../typing/predef.mli) (copy_files ../../typing/datarepr.mli) +(copy_files ../../typing/typedtree.mli) +(copy_files ../../typing/value_rec_types.mli) (copy_files ../../file_formats/cmi_format.mli) (copy_files ../../typing/persistent_env.mli) (copy_files ../../typing/env.mli) @@ -228,8 +296,9 @@ ; .mli-only: (copy_files ../../parsing/asttypes.mli) -(copy_files ../../parsing/jane_asttypes.mli) (copy_files ../../parsing/parsetree.mli) +(copy_files ../../typing/solver_intf.mli) +(copy_files ../../typing/mode_intf.mli) (copy_files ../../typing/outcometree.mli) (copy_files ../../file_formats/cmo_format.mli) (copy_files ../../file_formats/cmxs_format.mli) @@ -241,13 +310,21 @@ ; at the moment, apparently Buenzli is working on this). ; We use a workaround for the moment. +(library + (name dynlink_internal_common) + (wrapped false) + (modes byte native) + (modules dynlink_common dynlink_types dynlink_platform_intf) + (libraries dynlink_compilerlibs)) + ; Deps within the compiler tree must be on dynlink_internal not dynlink. (library (name dynlink_internal) (wrapped false) (modes byte native) - (modules dynlink dynlink_common dynlink_types dynlink_platform_intf) - (libraries dynlink_compilerlibs)) + (modules dynlink) + (libraries dynlink_compilerlibs dynlink_internal_byte + dynlink_internal_native dynlink_internal_common)) ; The non-installed version of dynlink.cmi is needed to build other parts ; of the tree. @@ -266,6 +343,7 @@ %{deps})) (deps ; NOTE: Be sure to keep these arguments in dependency order! + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Runtimetags.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Int_replace_polymorphic_compare.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Binutils.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Local_store.cmo @@ -294,16 +372,25 @@ .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Printast.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Syntaxerr.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Lazy_backtrack.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Zero_alloc_utils.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Ast_helper.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Jane_syntax_parsing.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Jane_syntax.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Pprintast.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Ast_iterator.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Builtin_attributes.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Load_path.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Ast_mapper.cmo - .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Jkind.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Solver.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Mode.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Jkind_intf.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Jkind_types.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Zero_alloc.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Types.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Attr_helper.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Primitive.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Oprint.cmo + .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Jkind.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Btype.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Subst.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Bytesections.cmo @@ -313,8 +400,6 @@ .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Shape.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Datarepr.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Persistent_env.cmo - .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Attr_helper.cmo - .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Primitive.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Predef.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Env.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Lambda.cmo @@ -324,9 +409,11 @@ .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Runtimedef.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Symtable.cmo .dynlink_compilerlibs.objs/byte/dynlink_compilerlibs__Opcodes.cmo - .dynlink_internal.objs/byte/dynlink_types.cmo - .dynlink_internal.objs/byte/dynlink_platform_intf.cmo - .dynlink_internal.objs/byte/dynlink_common.cmo + .dynlink_internal_common.objs/byte/dynlink_types.cmo + .dynlink_internal_common.objs/byte/dynlink_platform_intf.cmo + .dynlink_internal_common.objs/byte/dynlink_common.cmo + .dynlink_internal_byte.objs/byte/dynlink_internal_byte.cmo + .dynlink_internal_native.objs/byte/dynlink_internal_native.cmo .dynlink_internal.objs/byte/dynlink.cmo ) ) @@ -341,6 +428,7 @@ %{deps})) (deps ; NOTE: Be sure to keep these arguments in dependency order! + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Runtimetags.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Int_replace_polymorphic_compare.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Binutils.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Local_store.cmx @@ -366,19 +454,28 @@ .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Symbol.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Path.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Lazy_backtrack.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Zero_alloc_utils.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Docstrings.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Printast.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Syntaxerr.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Ast_helper.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Jane_syntax_parsing.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Jane_syntax.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Pprintast.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Load_path.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Ast_iterator.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Builtin_attributes.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Ast_mapper.cmx - .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Jkind.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Solver.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Mode.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Jkind_intf.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Jkind_types.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Zero_alloc.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Types.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Attr_helper.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Primitive.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Oprint.cmx + .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Jkind.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Btype.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Subst.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Bytesections.cmx @@ -388,8 +485,6 @@ .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Shape.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Datarepr.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Persistent_env.cmx - .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Attr_helper.cmx - .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Primitive.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Predef.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Env.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Lambda.cmx @@ -399,29 +494,46 @@ .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Runtimedef.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Symtable.cmx .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Opcodes.cmx - .dynlink_internal.objs/native/dynlink_types.cmx - .dynlink_internal.objs/native/dynlink_platform_intf.cmx - .dynlink_internal.objs/native/dynlink_common.cmx + .dynlink_internal_common.objs/native/dynlink_types.cmx + .dynlink_internal_common.objs/native/dynlink_platform_intf.cmx + .dynlink_internal_common.objs/native/dynlink_common.cmx + .dynlink_internal_byte.objs/native/dynlink_internal_byte.cmx + .dynlink_internal_native.objs/native/dynlink_internal_native.cmx .dynlink_internal.objs/native/dynlink.cmx ) ) (install (files - (.dynlink_internal.objs/native/dynlink_common.cmx as dynlink/dynlink_common.cmx) - (.dynlink_internal.objs/native/dynlink_platform_intf.cmx as dynlink/dynlink_platform_intf.cmx) - (.dynlink_internal.objs/native/dynlink_types.cmx as dynlink/dynlink_types.cmx) + (.dynlink_internal.objs/byte/dynlink.cmti as dynlink/dynlink.cmti) + (.dynlink_internal.objs/byte/dynlink.cmt as dynlink/dynlink.cmt) + (.dynlink_internal_common.objs/native/dynlink_common.cmx + as + dynlink/dynlink_common.cmx) + (.dynlink_internal_common.objs/native/dynlink_platform_intf.cmx + as + dynlink/dynlink_platform_intf.cmx) + (.dynlink_internal_common.objs/native/dynlink_types.cmx + as + dynlink/dynlink_types.cmx) (.dynlink_internal.objs/native/dynlink.cmx as dynlink/dynlink.cmx) + (.dynlink_internal_byte.objs/native/dynlink_internal_byte.cmx + as + dynlink/dynlink_internal_byte.cmx) + (.dynlink_internal_native.objs/native/dynlink_internal_native.cmx + as + dynlink/dynlink_internal_native.cmx) + (dynlink.cma as dynlink/dynlink.cma) (dynlink.cmxa as dynlink/dynlink.cmxa) (dynlink.a as dynlink/dynlink.a) ; (dynlink.cmxs as dynlink/dynlink.cmxs) (dynlink.mli as dynlink/dynlink.mli) (dynlink.cmi as dynlink/dynlink.cmi) - (.dynlink_internal.objs/byte/dynlink.cmt as dynlink/dynlink.cmt) - (.dynlink_internal.objs/byte/dynlink.cmti as dynlink/dynlink.cmti) .dynlink_compilerlibs.objs/native/dynlink_compilerlibs__Misc.cmx + + (META as dynlink/META) ) (section lib) (package ocaml)) diff --git a/otherlibs/dynlink/dynlink.ml b/otherlibs/dynlink/dynlink.ml index 084b667cbeb..337acb7758f 100644 --- a/otherlibs/dynlink/dynlink.ml +++ b/otherlibs/dynlink/dynlink.ml @@ -18,319 +18,10 @@ [@@@ocaml.warning "+a-4-30-40-41-42"] -open! Dynlink_compilerlibs - -module DC = Dynlink_common module DT = Dynlink_types -let convert_cmi_import import = - let name = Import_info.name import |> Compilation_unit.Name.to_string in - let crc = Import_info.crc import in - name, crc - -module Bytecode = struct - type filename = string - - module Unit_header = struct - type t = Cmo_format.compilation_unit_descr - - let name (t : t) = Compilation_unit.full_path_as_string t.cu_name - let crc _t = None - - let interface_imports (t : t) = - List.map convert_cmi_import (Array.to_list t.cu_imports) - - let implementation_imports (t : t) = - let required_from_unit = - t.cu_required_globals - |> List.map Compilation_unit.to_global_ident_for_bytecode - in - let required = - required_from_unit - @ Symtable.required_globals t.cu_reloc - in - let required = - List.filter - (fun id -> - not (Ident.is_predef id) - && not (String.contains (Ident.name id) '.')) - required - in - List.map - (fun ident -> Ident.name ident, None) - required - - let defined_symbols (t : t) = - List.map (fun ident -> Ident.name ident) - (Symtable.defined_globals t.cu_reloc) - - let unsafe_module (t : t) = t.cu_primitives <> [] - end - - type handle = Stdlib.in_channel * filename * Digest.t - - let default_crcs = ref [| |] - let default_global_map = ref Symtable.empty_global_map - - let init () = - if !Sys.interactive then begin (* PR#6802 *) - invalid_arg "The dynlink.cma library cannot be used \ - inside the OCaml toplevel" - end; - default_crcs := Symtable.init_toplevel (); - default_global_map := Symtable.current_state () - - let is_native = false - let adapt_filename f = f - - let num_globals_inited () = - Misc.fatal_error "Should never be called for bytecode dynlink" - - let assume_no_prefix modname = - Compilation_unit.create Compilation_unit.Prefix.empty modname - - let fold_initial_units ~init ~f = - Array.fold_left (fun acc import -> - let modname = Import_info.name import in - let crc = Import_info.crc import in - let id = - Compilation_unit.to_global_ident_for_bytecode - (assume_no_prefix modname) - in - let defined = - Symtable.is_defined_in_global_map !default_global_map id - in - let implementation = - if defined then Some (None, DT.Loaded) - else None - in - let defined_symbols = - if defined then [Ident.name id] - else [] - in - let comp_unit = modname |> Compilation_unit.Name.to_string in - f acc ~comp_unit ~interface:crc ~implementation ~defined_symbols) - init - !default_crcs - - let run_shared_startup _ ~filename:_ ~priv:_ = () - - let run (ic, file_name, file_digest) ~filename:_ ~unit_header ~priv = - let open Misc in - let old_state = Symtable.current_state () in - let compunit : Cmo_format.compilation_unit_descr = unit_header in - seek_in ic compunit.cu_pos; - let code_size = compunit.cu_codesize + 8 in - let code = LongString.create code_size in - LongString.input_bytes_into code ic compunit.cu_codesize; - LongString.set code compunit.cu_codesize (Char.chr Opcodes.opRETURN); - LongString.blit_string "\000\000\000\001\000\000\000" 0 - code (compunit.cu_codesize + 1) 7; - begin try - Symtable.patch_object code compunit.cu_reloc; - Symtable.check_global_initialized compunit.cu_reloc; - Symtable.update_global_table () - with Symtable.Error error -> - let new_error : DT.linking_error = - match error with - | Symtable.Undefined_global s -> Undefined_global s - | Symtable.Unavailable_primitive s -> Unavailable_primitive s - | Symtable.Uninitialized_global s -> Uninitialized_global s - | Symtable.Wrong_vm _ -> assert false - in - raise (DT.Error (Linking_error (file_name, new_error))) - end; - (* PR#5215: identify this code fragment by - digest of file contents + unit name. - Unit name is needed for .cma files, which produce several code - fragments. *) - let digest = - Digest.string - (file_digest ^ Compilation_unit.full_path_as_string compunit.cu_name) - in - let events = - if compunit.cu_debug = 0 then [| |] - else begin - seek_in ic compunit.cu_debug; - [| input_value ic |] - end in - if priv then Symtable.hide_additions old_state; - let _, clos = Meta.reify_bytecode code events (Some digest) in - try ignore ((clos ()) : Obj.t) - with exn -> - Printexc.raise_with_backtrace - (DT.Error (Library's_module_initializers_failed exn)) - (Printexc.get_raw_backtrace ()) - - let load ~filename:file_name ~priv:_ = - let ic = open_in_bin file_name in - let file_digest = Digest.channel ic (-1) in - seek_in ic 0; - try - let buffer = - try really_input_string ic (String.length Config.cmo_magic_number) - with End_of_file -> raise (DT.Error (Not_a_bytecode_file file_name)) - in - let handle = ic, file_name, file_digest in - if buffer = Config.cmo_magic_number then begin - let compunit_pos = input_binary_int ic in (* Go to descriptor *) - seek_in ic compunit_pos; - let cu = (input_value ic : Cmo_format.compilation_unit_descr) in - handle, [cu] - end else - if buffer = Config.cma_magic_number then begin - let toc_pos = input_binary_int ic in (* Go to table of contents *) - seek_in ic toc_pos; - let lib = (input_value ic : Cmo_format.library) in - begin try - Dll.open_dlls Dll.For_execution - (List.map Dll.extract_dll_name lib.lib_dllibs) - with exn -> - raise (DT.Error (Cannot_open_dynamic_library exn)) - end; - handle, lib.lib_units - end else begin - raise (DT.Error (Not_a_bytecode_file file_name)) - end - with exc -> - close_in ic; - raise exc - - let unsafe_get_global_value ~bytecode_or_asm_symbol = - let id = Ident.create_persistent bytecode_or_asm_symbol in - match Symtable.get_global_value id with - | exception _ -> None - | obj -> Some obj - - let finish (ic, _filename, _digest) = - close_in ic -end - -module B = DC.Make (Bytecode) - -type global_map = { - name : Compilation_unit.t; - crc_intf : Digest.t option; - crc_impl : Digest.t option; - syms : Symbol.t list; -} - -module Native = struct - type handle - - (* mshinwell: We need something better than caml_sys_exit *) - external ndl_open : string -> bool -> handle * Cmxs_format.dynheader - = "caml_sys_exit" "caml_natdynlink_open" - external ndl_run : handle -> string -> unit - = "caml_sys_exit" "caml_natdynlink_run" - external ndl_getmap : unit -> global_map list - = "caml_sys_exit" "caml_natdynlink_getmap" - external ndl_globals_inited : unit -> int - = "caml_sys_exit" "caml_natdynlink_globals_inited" - external ndl_loadsym : string -> Obj.t - = "caml_sys_exit" "caml_natdynlink_loadsym" - - module Unit_header = struct - type t = Cmxs_format.dynunit - - let name (t : t) = t.dynu_name |> Compilation_unit.name_as_string - let crc (t : t) = Some t.dynu_crc - - let convert_cmx_import import = - let cu = Import_info.cu import |> Compilation_unit.name_as_string in - let crc = Import_info.crc import in - cu, crc - - let interface_imports (t : t) = - List.map convert_cmi_import (Array.to_list t.dynu_imports_cmi) - let implementation_imports (t : t) = - List.map convert_cmx_import (Array.to_list t.dynu_imports_cmx) - - let defined_symbols (t : t) = - List.map (fun comp_unit -> - Symbol.for_compilation_unit comp_unit - |> Symbol.linkage_name - |> Linkage_name.to_string) - t.dynu_defines - - let unsafe_module _t = false - end - - let init () = () - - let is_native = true - let adapt_filename f = Filename.chop_extension f ^ ".cmxs" - - let num_globals_inited () = ndl_globals_inited () - - let fold_initial_units ~init ~f = - let rank = ref 0 in - List.fold_left (fun acc { name; crc_intf; crc_impl; syms; } -> - let name = Compilation_unit.full_path_as_string name in - let syms = - List.map - (fun sym -> Symbol.linkage_name sym |> Linkage_name.to_string) - syms - in - rank := !rank + List.length syms; - let implementation = - match crc_impl with - | None -> None - | Some _ as crco -> Some (crco, DT.Check_inited !rank) - in - f acc ~comp_unit:name ~interface:crc_intf - ~implementation ~defined_symbols:syms) - init - (ndl_getmap ()) - - exception Register_dyn_global_duplicate - let () = - Callback.register "Register_dyn_global_duplicate" - Register_dyn_global_duplicate - - let ndl_run handle cu ~filename ~priv = - try ndl_run handle cu - with - | Register_dyn_global_duplicate -> - if not priv then - failwith (Printf.sprintf "Attempt to register duplicate dynamic \ - GC roots for non-privately-loaded library `%s'; this is a bug in \ - [Dynlink]" filename) - else - Printexc.raise_with_backtrace - (DT.Error (Library_file_already_loaded_privately { filename })) - (Printexc.get_raw_backtrace ()) - | exn -> - Printexc.raise_with_backtrace - (DT.Error (Library's_module_initializers_failed exn)) - (Printexc.get_raw_backtrace ()) - - let run_shared_startup handle ~filename ~priv = - ndl_run handle "caml_shared_startup" ~filename ~priv - - let run handle ~filename ~unit_header ~priv = - List.iter (fun cu -> ndl_run handle cu ~filename ~priv) - (Unit_header.defined_symbols unit_header) - - let load ~filename ~priv = - let handle, header = - try ndl_open filename (not priv) - with exn -> raise (DT.Error (Cannot_open_dynamic_library exn)) - in - if header.dynu_magic <> Config.cmxs_magic_number then begin - raise (DT.Error (Not_a_bytecode_file filename)) - end; - handle, header.dynu_units - - let unsafe_get_global_value ~bytecode_or_asm_symbol = - match ndl_loadsym bytecode_or_asm_symbol with - | exception _ -> None - | obj -> Some obj - - let finish _handle = () -end - -module N = DC.Make (Native) +module B = Dynlink_internal_byte +module N = Dynlink_internal_native type linking_error = DT.linking_error = | Undefined_global of string @@ -371,6 +62,10 @@ let unsafe_get_global_value ~bytecode_or_asm_symbol = if is_native then N.unsafe_get_global_value ~bytecode_or_asm_symbol else B.unsafe_get_global_value ~bytecode_or_asm_symbol +let does_symbol_exist ~bytecode_or_asm_symbol = + if is_native then N.does_symbol_exist ~bytecode_or_asm_symbol + else B.does_symbol_exist ~bytecode_or_asm_symbol + let adapt_filename file = if is_native then N.adapt_filename file else B.adapt_filename file diff --git a/otherlibs/dynlink/dynlink.mli b/otherlibs/dynlink/dynlink.mli index 74a70a9aa7e..121b95f7aa2 100644 --- a/otherlibs/dynlink/dynlink.mli +++ b/otherlibs/dynlink/dynlink.mli @@ -166,6 +166,10 @@ val unsafe_get_global_value : bytecode_or_asm_symbol:string -> Obj.t option The accessible values are those in the main program and those provided by previous calls to [loadfile]. + ** This function may only be used to retrieve the addresses of symbols + that are valid OCaml values. It cannot be used to retrieve e.g. code + pointers. ** + This function is deemed "unsafe" as there is no type safety provided. When executing in bytecode, this function uses [Symtable]. As a cautionary @@ -178,3 +182,8 @@ val unsafe_get_global_value : bytecode_or_asm_symbol:string -> Obj.t option client's version of [Symtable]). This is why we can't use [Dynlink] from the toplevel interactive loop, in particular. *) + +(** Like [unsafe_get_global_value], but only tests whether the given symbol + exists, and in native code may be used for any symbol (whether or not such + symbol points at a valid OCaml value). *) +val does_symbol_exist : bytecode_or_asm_symbol:string -> bool diff --git a/otherlibs/dynlink/dynlink_common.ml b/otherlibs/dynlink/dynlink_common.ml index 8555268c1e8..fab1a95d069 100644 --- a/otherlibs/dynlink/dynlink_common.ml +++ b/otherlibs/dynlink/dynlink_common.ml @@ -79,11 +79,18 @@ module Make (P : Dynlink_platform_intf.S) = struct mutable inited:bool; mutable unsafe_allowed:bool; } - (* val lock: Mutex.t *) + val lock: Mutex.t option val with_lock: (t->'a) -> 'a end = struct - (* let lock = Mutex.create () *) + external runtime5 : unit -> bool = "%runtime5" + + let lock = + (* We cannot call [Mutex.create] on runtime4 without making the dynlink + library depend on the threads library. *) + if runtime5 () then Some (Mutex.create ()) + else None + type t = { mutable state:State.t; mutable inited:bool; @@ -93,16 +100,16 @@ module Make (P : Dynlink_platform_intf.S) = struct state = State.empty; inited = false; unsafe_allowed = false; - } - (* CR ocaml 5 runtime *) - (* let with_lock0 f = - Mutex.lock lock; - Fun.protect f - ~finally:(fun () -> Mutex.unlock lock) *) + let with_lock0 f = + match lock with + | None -> f () + | Some lock -> + Mutex.lock lock; + Fun.protect f + ~finally:(fun () -> Mutex.unlock lock) - let with_lock0 f = f () let with_lock f = with_lock0 (fun () -> f state) end open Global @@ -358,13 +365,24 @@ module Make (P : Dynlink_platform_intf.S) = struct global.state <- check filename units global.state ~unsafe_allowed ~priv; - P.run_shared_startup handle ~filename ~priv; + (* [register] must be called after [check]: + 1. so as not to leave outdated entries in the frame table + list (etc) after a failure of [check]; + 2. so that the duplicate dyn-globals test only triggers in + public-loading mode in the event of a bug in [Dynlink], + matching the 4.x semantics. *) + P.register handle units ~priv ~filename; + (* [run_shared_startup] doesn't take [lock] because a lock isn't + needed for the native implementation (neither for [run]) and + the bytecode implementation, where [run] does need a lock, + has [run_shared_startup] as a no-op. *) + P.run_shared_startup handle; ); List.iter (fun unit_header -> (* Linked modules might call Dynlink themselves, we need to release the lock *) - P.run (* Global.lock *) handle ~filename ~unit_header ~priv; + P.run Global.lock handle ~unit_header ~priv; if not priv then with_lock (fun global -> global.state <- set_loaded filename unit_header global.state ) @@ -384,6 +402,12 @@ module Make (P : Dynlink_platform_intf.S) = struct P.unsafe_get_global_value ~bytecode_or_asm_symbol ) + let does_symbol_exist ~bytecode_or_asm_symbol = + with_lock (fun _ -> + (* The bytecode implementation reads the global symtable *) + P.does_symbol_exist ~bytecode_or_asm_symbol + ) + let is_native = P.is_native let adapt_filename = P.adapt_filename end diff --git a/otherlibs/dynlink/dynlink_common.mli b/otherlibs/dynlink/dynlink_common.mli index c6f92d05cd1..20e3d9c9c7a 100644 --- a/otherlibs/dynlink/dynlink_common.mli +++ b/otherlibs/dynlink/dynlink_common.mli @@ -24,6 +24,7 @@ module Make (_ : Dynlink_platform_intf.S) : sig val loadfile : string -> unit val loadfile_private : string -> unit val unsafe_get_global_value : bytecode_or_asm_symbol:string -> Obj.t option + val does_symbol_exist : bytecode_or_asm_symbol:string -> bool val adapt_filename : string -> string val set_allowed_units : string list -> unit val allow_only: string list -> unit diff --git a/otherlibs/dynlink/dynlink_platform_intf.ml b/otherlibs/dynlink/dynlink_platform_intf.ml index 36eb7cba12e..70037d9ab5b 100644 --- a/otherlibs/dynlink/dynlink_platform_intf.ml +++ b/otherlibs/dynlink/dynlink_platform_intf.ml @@ -60,18 +60,25 @@ module type S = sig -> priv:bool -> handle * (Unit_header.t list) - val run_shared_startup : handle -> filename:string -> priv:bool -> unit + val register + : handle + -> Unit_header.t list + -> priv:bool + -> filename:string + -> unit + + val run_shared_startup : handle -> unit val run - : (* CR ocaml 5 runtime: The first argument upstream is a mutex. *) - (* Mutex.t -> *) - handle - -> filename:string + : Mutex.t option + -> handle -> unit_header:Unit_header.t -> priv:bool -> unit val unsafe_get_global_value : bytecode_or_asm_symbol:string -> Obj.t option + val does_symbol_exist : bytecode_or_asm_symbol:string -> bool + val finish : handle -> unit end diff --git a/otherlibs/dynlink/native/dynlink.ml b/otherlibs/dynlink/native/dynlink.ml new file mode 100644 index 00000000000..bf3fd40a174 --- /dev/null +++ b/otherlibs/dynlink/native/dynlink.ml @@ -0,0 +1,195 @@ +#2 "otherlibs/dynlink/dynlink.ml" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell and Leo White, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2017--2018 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* Dynamic loading of .cmx files *) + +[@@@ocaml.warning "+a-4-30-40-41-42"] + +open! Dynlink_compilerlibs + +module DC = Dynlink_common +module DT = Dynlink_types + +let convert_cmi_import import = + let name = Import_info.name import |> Compilation_unit.Name.to_string in + let crc = Import_info.crc import in + name, crc + +type global_map = { + name : Compilation_unit.t; + crc_intf : Digest.t option; + crc_impl : Digest.t option; + syms : Symbol.t list; +} + +module Native = struct + type handle + + (* mshinwell: We need something better than caml_sys_exit *) + external ndl_open : string -> bool -> handle * Cmxs_format.dynheader + = "caml_sys_exit" "caml_natdynlink_open" + external ndl_register : handle -> string array -> unit + = "caml_sys_exit" "caml_natdynlink_register" + external ndl_run : handle -> string -> unit + = "caml_sys_exit" "caml_natdynlink_run" + external ndl_getmap : unit -> global_map list + = "caml_sys_exit" "caml_natdynlink_getmap" + external ndl_globals_inited : unit -> int + = "caml_sys_exit" "caml_natdynlink_globals_inited" + external ndl_loadsym : string -> Obj.t + = "caml_sys_exit" "caml_natdynlink_loadsym" + external ndl_existssym : string -> bool + = "caml_sys_exit" "caml_natdynlink_existssym" + [@@noalloc] + + module Unit_header = struct + type t = Cmxs_format.dynunit + + let name (t : t) = t.dynu_name |> Compilation_unit.name_as_string + let crc (t : t) = Some t.dynu_crc + + let convert_cmx_import import = + let cu = Import_info.cu import |> Compilation_unit.name_as_string in + let crc = Import_info.crc import in + cu, crc + + let interface_imports (t : t) = + List.map convert_cmi_import (Array.to_list t.dynu_imports_cmi) + let implementation_imports (t : t) = + List.map convert_cmx_import (Array.to_list t.dynu_imports_cmx) + + let defined_symbols (t : t) = + List.map (fun comp_unit -> + Symbol.for_compilation_unit comp_unit + |> Symbol.linkage_name + |> Linkage_name.to_string) + t.dynu_defines + + let unsafe_module _t = false + end + + let init () = () + + let is_native = true + let adapt_filename f = Filename.chop_extension f ^ ".cmxs" + + let num_globals_inited () = ndl_globals_inited () + + let fold_initial_units ~init ~f = + let rank = ref 0 in + List.fold_left (fun acc { name; crc_intf; crc_impl; syms; } -> + let name = Compilation_unit.full_path_as_string name in + let syms = + List.map + (fun sym -> Symbol.linkage_name sym |> Linkage_name.to_string) + syms + in + rank := !rank + List.length syms; + let implementation = + match crc_impl with + | None -> None + | Some _ as crco -> Some (crco, DT.Check_inited !rank) + in + f acc ~comp_unit:name ~interface:crc_intf + ~implementation ~defined_symbols:syms) + init + (ndl_getmap ()) + + let run_shared_startup handle = + ndl_run handle "caml_shared_startup" + + let run _lock handle ~unit_header ~priv:_ = + List.iter (fun cu -> + try ndl_run handle cu + with exn -> + Printexc.raise_with_backtrace + (DT.Error (Library's_module_initializers_failed exn)) + (Printexc.get_raw_backtrace ())) + (Unit_header.defined_symbols unit_header) + + exception Register_dyn_global_duplicate + let () = + Callback.register "Register_dyn_global_duplicate" + Register_dyn_global_duplicate + + let load ~filename ~priv = + let handle, header = + try ndl_open filename (not priv) + with exn -> raise (DT.Error (Cannot_open_dynamic_library exn)) + in + if header.dynu_magic <> Config.cmxs_magic_number then begin + raise (DT.Error (Not_a_bytecode_file filename)) + end; + handle, header.dynu_units + + let register handle dynu_units ~priv ~filename = + let syms = + "caml_shared_startup" :: + List.concat_map Unit_header.defined_symbols dynu_units + in + try + ndl_register handle (Array.of_list syms) + with + | Register_dyn_global_duplicate -> + if not priv then + failwith (Printf.sprintf "Attempt to register duplicate dynamic \ + GC roots for non-privately-loaded library `%s'; this is a bug in \ + [Dynlink]" filename) + else + Printexc.raise_with_backtrace + (DT.Error (Library_file_already_loaded_privately { filename })) + (Printexc.get_raw_backtrace ()) + | exn -> + Printexc.raise_with_backtrace + (DT.Error (Library's_module_initializers_failed exn)) + (Printexc.get_raw_backtrace ()) + + let unsafe_get_global_value ~bytecode_or_asm_symbol = + match ndl_loadsym bytecode_or_asm_symbol with + | exception _ -> None + | obj -> Some obj + + let does_symbol_exist ~bytecode_or_asm_symbol = + ndl_existssym bytecode_or_asm_symbol + + let finish _handle = () +end + +include DC.Make (Native) + +type linking_error = DT.linking_error = + | Undefined_global of string + | Unavailable_primitive of string + | Uninitialized_global of string + +type error = DT.error = + | Not_a_bytecode_file of string + | Inconsistent_import of string + | Unavailable_unit of string + | Unsafe_file + | Linking_error of string * linking_error + | Corrupted_interface of string + | Cannot_open_dynamic_library of exn + | Library's_module_initializers_failed of exn + | Inconsistent_implementation of string + | Module_already_loaded of string + | Private_library_cannot_implement_interface of string + | Library_file_already_loaded_privately of { filename : string; } + +exception Error = DT.Error +let error_message = DT.error_message diff --git a/otherlibs/runtime_events/dune b/otherlibs/runtime_events/dune new file mode 100644 index 00000000000..e20d96421b8 --- /dev/null +++ b/otherlibs/runtime_events/dune @@ -0,0 +1,51 @@ +;************************************************************************** +;* * +;* OCaml * +;* * +;* Zesen Qian, Jane Street Europe * +;* * +;* Copyright 2023 Jane Street Group LLC * +;* * +;* 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. * +;* * +;************************************************************************** + +(library + (name runtime_events) + (wrapped false) + (modes byte native) + (flags + (:standard + -strict-sequence + -absname + -bin-annot + -safe-string + -strict-formats)) + (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) + (library_flags (:standard -linkall)) + (foreign_stubs (language c) (names runtime_events_consumer) + (flags ((:include %{project_root}/oc_cflags.sexp) + (:include %{project_root}/sharedlib_cflags.sexp) + (:include %{project_root}/oc_cppflags.sexp))))) + +(install + (files + (.runtime_events.objs/native/runtime_events.cmx as runtime_events/runtime_events.cmx) + (libruntime_events_stubs.a as runtime_events/libruntime_events_stubs.a) + (libruntime_events_stubs.a as libruntime_events_stubs_native.a) ; for special_dune compat + (dllruntime_events_stubs.so as stublibs/dllruntime_events_stubs.so) + (runtime_events.cmxa as runtime_events/runtime_events.cmxa) + (runtime_events.a as runtime_events/runtime_events.a) + (runtime_events.cmxs as runtime_events/runtime_events.cmxs) + (runtime_events.cma as runtime_events/runtime_events.cma) + (runtime_events.mli as runtime_events/runtime_events.mli) + (.runtime_events.objs/byte/runtime_events.cmi as runtime_events/runtime_events.cmi) + (.runtime_events.objs/byte/runtime_events.cmt as runtime_events/runtime_events.cmt) + (.runtime_events.objs/byte/runtime_events.cmti as runtime_events/runtime_events.cmti) + (runtime_events_consumer.h as caml/runtime_events_consumer.h) + (META as runtime_events/META) + ) + (section lib) + (package ocaml)) diff --git a/otherlibs/runtime_events/runtime_events.ml b/otherlibs/runtime_events/runtime_events.ml index b07b0c206ff..6e4c3946280 100644 --- a/otherlibs/runtime_events/runtime_events.ml +++ b/otherlibs/runtime_events/runtime_events.ml @@ -41,9 +41,12 @@ type runtime_phase = | EV_MAJOR | EV_MAJOR_SWEEP | EV_MAJOR_MARK_ROOTS +| EV_MAJOR_MEMPROF_ROOTS | EV_MAJOR_MARK | EV_MINOR | EV_MINOR_LOCAL_ROOTS +| EV_MINOR_MEMPROF_ROOTS +| EV_MINOR_MEMPROF_CLEAN | EV_MINOR_FINALIZED | EV_EXPLICIT_GC_MAJOR_SLICE | EV_FINALISE_UPDATE_FIRST @@ -66,12 +69,17 @@ type runtime_phase = | EV_STW_HANDLER | EV_STW_LEADER | EV_MAJOR_FINISH_SWEEPING +| EV_MAJOR_MEMPROF_CLEAN | EV_MINOR_FINALIZERS_ADMIN | EV_MINOR_REMEMBERED_SET | EV_MINOR_REMEMBERED_SET_PROMOTE | EV_MINOR_LOCAL_ROOTS_PROMOTE | EV_DOMAIN_CONDITION_WAIT | EV_DOMAIN_RESIZE_HEAP_RESERVATION +| EV_COMPACT +| EV_COMPACT_EVACUATE +| EV_COMPACT_FORWARD +| EV_COMPACT_RELEASE type lifecycle = EV_RING_START @@ -122,9 +130,12 @@ let runtime_phase_name phase = | EV_MAJOR -> "major" | EV_MAJOR_SWEEP -> "major_sweep" | EV_MAJOR_MARK_ROOTS -> "major_mark_roots" + | EV_MAJOR_MEMPROF_ROOTS -> "major_memprof_roots" | EV_MAJOR_MARK -> "major_mark" | EV_MINOR -> "minor" | EV_MINOR_LOCAL_ROOTS -> "minor_local_roots" + | EV_MINOR_MEMPROF_ROOTS -> "minor_memprof_roots" + | EV_MINOR_MEMPROF_CLEAN -> "minor_memprof_clean" | EV_MINOR_FINALIZED -> "minor_finalized" | EV_EXPLICIT_GC_MAJOR_SLICE -> "explicit_gc_major_slice" | EV_FINALISE_UPDATE_FIRST -> "finalise_update_first" @@ -146,6 +157,7 @@ let runtime_phase_name phase = | EV_STW_HANDLER -> "stw_handler" | EV_STW_LEADER -> "stw_leader" | EV_MAJOR_FINISH_SWEEPING -> "major_finish_sweeping" + | EV_MAJOR_MEMPROF_CLEAN -> "major_memprof_clean" | EV_MINOR_FINALIZERS_ADMIN -> "minor_finalizers_admin" | EV_MINOR_REMEMBERED_SET -> "minor_remembered_set" | EV_MINOR_REMEMBERED_SET_PROMOTE -> "minor_remembered_set_promote" @@ -153,6 +165,10 @@ let runtime_phase_name phase = | EV_DOMAIN_CONDITION_WAIT -> "domain_condition_wait" | EV_MAJOR_FINISH_CYCLE -> "major_finish_cycle" | EV_DOMAIN_RESIZE_HEAP_RESERVATION -> "domain_resize_heap_reservation" + | EV_COMPACT -> "compaction" + | EV_COMPACT_EVACUATE -> "compaction_evacuate" + | EV_COMPACT_FORWARD -> "compaction_forward" + | EV_COMPACT_RELEASE -> "compaction_release" let lifecycle_name lifecycle = match lifecycle with diff --git a/otherlibs/runtime_events/runtime_events.mli b/otherlibs/runtime_events/runtime_events.mli index dc13257907e..a5f67f7fdee 100644 --- a/otherlibs/runtime_events/runtime_events.mli +++ b/otherlibs/runtime_events/runtime_events.mli @@ -99,9 +99,12 @@ type runtime_phase = | EV_MAJOR | EV_MAJOR_SWEEP | EV_MAJOR_MARK_ROOTS +| EV_MAJOR_MEMPROF_ROOTS | EV_MAJOR_MARK | EV_MINOR | EV_MINOR_LOCAL_ROOTS +| EV_MINOR_MEMPROF_ROOTS +| EV_MINOR_MEMPROF_CLEAN | EV_MINOR_FINALIZED | EV_EXPLICIT_GC_MAJOR_SLICE | EV_FINALISE_UPDATE_FIRST @@ -124,12 +127,17 @@ type runtime_phase = | EV_STW_HANDLER | EV_STW_LEADER | EV_MAJOR_FINISH_SWEEPING +| EV_MAJOR_MEMPROF_CLEAN | EV_MINOR_FINALIZERS_ADMIN | EV_MINOR_REMEMBERED_SET | EV_MINOR_REMEMBERED_SET_PROMOTE | EV_MINOR_LOCAL_ROOTS_PROMOTE | EV_DOMAIN_CONDITION_WAIT | EV_DOMAIN_RESIZE_HEAP_RESERVATION +| EV_COMPACT +| EV_COMPACT_EVACUATE +| EV_COMPACT_FORWARD +| EV_COMPACT_RELEASE (** Lifecycle events for the ring itself *) type lifecycle = diff --git a/otherlibs/stdlib_alpha/.ocamlformat-enable b/otherlibs/stdlib_alpha/.ocamlformat-enable new file mode 100644 index 00000000000..8c13a97bd74 --- /dev/null +++ b/otherlibs/stdlib_alpha/.ocamlformat-enable @@ -0,0 +1,2 @@ +alpha.mli +alpha.ml diff --git a/otherlibs/stdlib_alpha/dune b/otherlibs/stdlib_alpha/dune new file mode 100644 index 00000000000..58267f70121 --- /dev/null +++ b/otherlibs/stdlib_alpha/dune @@ -0,0 +1,40 @@ +;************************************************************************** +;* * +;* OCaml * +;* * +;* Diana Kalinichenko, Jane Street, New York * +;* * +;* Copyright 2024 Jane Street Group LLC * +;* * +;* 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. * +;* * +;************************************************************************** + +(library + (name stdlib_alpha) + (public_name ocaml.stdlib_alpha) + (modes byte native) + (flags + (:standard + -strict-sequence + -absname + -bin-annot + -safe-string + -strict-formats + -extension-universe + alpha)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (library_flags + (:standard -linkall))) + +(rule + (deps + (:first-dep ../to_install.sh) + (source_tree .)) + (action + (with-stdout-to + to_install.sexp + (run "%{first-dep}" "stdlib_alpha")))) diff --git a/otherlibs/stdlib_alpha/stdlib_alpha.ml b/otherlibs/stdlib_alpha/stdlib_alpha.ml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/otherlibs/stdlib_alpha/stdlib_alpha.mli b/otherlibs/stdlib_alpha/stdlib_alpha.mli new file mode 100644 index 00000000000..e69de29bb2d diff --git a/otherlibs/stdlib_beta/.ocamlformat-enable b/otherlibs/stdlib_beta/.ocamlformat-enable new file mode 100644 index 00000000000..ec2c82f98ac --- /dev/null +++ b/otherlibs/stdlib_beta/.ocamlformat-enable @@ -0,0 +1,3 @@ +stdlib_beta.mli +stdlib_beta.ml + diff --git a/otherlibs/stdlib_beta/dune b/otherlibs/stdlib_beta/dune new file mode 100644 index 00000000000..39c50952a99 --- /dev/null +++ b/otherlibs/stdlib_beta/dune @@ -0,0 +1,42 @@ +;************************************************************************** +;* * +;* OCaml * +;* * +;* Diana Kalinichenko, Jane Street, New York * +;* * +;* Copyright 2024 Jane Street Group LLC * +;* * +;* 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. * +;* * +;************************************************************************** + +(library + (name stdlib_beta) + (public_name ocaml.stdlib_beta) + (modes byte native) + (enabled_if + (= %{architecture} "amd64")) + (flags + (:standard + -strict-sequence + -absname + -bin-annot + -safe-string + -strict-formats + -extension-universe + beta)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (library_flags + (:standard -linkall))) + +(rule + (deps + (:first-dep ../to_install.sh) + (source_tree .)) + (action + (with-stdout-to + to_install.sexp + (run "%{first-dep}" "stdlib_beta")))) diff --git a/otherlibs/stdlib_beta/stdlib_beta.ml b/otherlibs/stdlib_beta/stdlib_beta.ml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/otherlibs/stdlib_beta/stdlib_beta.mli b/otherlibs/stdlib_beta/stdlib_beta.mli new file mode 100644 index 00000000000..e69de29bb2d diff --git a/otherlibs/stdlib_stable/.ocamlformat-enable b/otherlibs/stdlib_stable/.ocamlformat-enable new file mode 100644 index 00000000000..e8d9f5286cf --- /dev/null +++ b/otherlibs/stdlib_stable/.ocamlformat-enable @@ -0,0 +1,4 @@ +stdlib_stable.mli +stdlib_stable.ml +float32.mli +float32.ml \ No newline at end of file diff --git a/otherlibs/stdlib_stable/dune b/otherlibs/stdlib_stable/dune new file mode 100644 index 00000000000..8a9482eb387 --- /dev/null +++ b/otherlibs/stdlib_stable/dune @@ -0,0 +1,40 @@ +;************************************************************************** +;* * +;* OCaml * +;* * +;* Diana Kalinichenko, Jane Street, New York * +;* * +;* Copyright 2024 Jane Street Group LLC * +;* * +;* 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. * +;* * +;************************************************************************** + +(library + (name stdlib_stable) + (public_name ocaml.stdlib_stable) + (modes byte native) + (flags + (:standard + -strict-sequence + -absname + -bin-annot + -safe-string + -strict-formats + -extension-universe + stable)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (library_flags + (:standard -linkall))) + +(rule + (deps + (:first-dep ../to_install.sh) + (source_tree .)) + (action + (with-stdout-to + to_install.sexp + (run "%{first-dep}" "stdlib_stable")))) diff --git a/otherlibs/stdlib_stable/float32.ml b/otherlibs/stdlib_stable/float32.ml new file mode 100644 index 00000000000..33f069e9c37 --- /dev/null +++ b/otherlibs/stdlib_stable/float32.ml @@ -0,0 +1,383 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Nicolas Ojeda Bar, LexiFi *) +(* *) +(* Copyright 2018 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. *) +(* *) +(**************************************************************************) + +[@@@ocaml.flambda_o3] + +type t = float32 + +external float32_of_bits : int32 -> t + = "caml_float32_of_bits_bytecode" "caml_float32_of_bits" + [@@unboxed] [@@noalloc] + +external neg : (t[@local_opt]) -> (t[@local_opt]) = "%negfloat32" + +external add : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%addfloat32" + +external sub : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%subfloat32" + +external mul : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%mulfloat32" + +external div : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%divfloat32" + +external pow : t -> t -> t = "caml_power_float32_bytecode" "powf" + [@@unboxed] [@@noalloc] + +module Operators = struct + external ( ~-. ) : (t[@local_opt]) -> (t[@local_opt]) = "%negfloat32" + + external ( +. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%addfloat32" + + external ( -. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%subfloat32" + + external ( *. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%mulfloat32" + + external ( /. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%divfloat32" + + external ( ** ) : t -> t -> t = "caml_power_float32_bytecode" "powf" + [@@unboxed] [@@noalloc] +end + +external fma : t -> t -> t -> t = "caml_fma_float32_bytecode" "fmaf" + [@@unboxed] [@@noalloc] + +external rem : t -> t -> t = "caml_fmod_float32_bytecode" "fmodf" + [@@unboxed] [@@noalloc] + +external abs : (t[@local_opt]) -> (t[@local_opt]) = "%absfloat32" + +let zero = 0.s +let one = 1.s +let minus_one = -1.s +let infinity = float32_of_bits 0x7f800000l +let neg_infinity = float32_of_bits 0xff800000l +let quiet_nan = float32_of_bits 0x7fc00001l +let signaling_nan = float32_of_bits 0x7f800001l +let nan = quiet_nan +let is_finite (x : t) = sub x x = 0.s +let is_infinite (x : t) = div 1.s x = 0.s +let is_nan (x : t) = x <> x +let pi = 0x1.921fb6p+1s +let max_float = float32_of_bits 0x7f7fffffl +let min_float = float32_of_bits 0x00800000l +let epsilon = float32_of_bits 0x34000000l + +external of_int : int -> t = "%float32ofint" +external to_int : (t[@local_opt]) -> int = "%intoffloat32" +external of_float : (float[@local_opt]) -> t = "%float32offloat" +external to_float : (t[@local_opt]) -> float = "%floatoffloat32" + +external of_int64 : (int64[@local_opt]) -> t + = "caml_float32_of_int64_bytecode" "caml_float32_of_int64" + [@@unboxed] [@@noalloc] [@@builtin] + +external to_int64 : (t[@local_opt]) -> int64 + = "caml_float32_to_int64_bytecode" "caml_float32_to_int64" + [@@unboxed] [@@noalloc] [@@builtin] + +external of_bits : (int32[@local_opt]) -> t + = "caml_float32_of_bits_bytecode" "caml_float32_of_bits" + [@@unboxed] [@@noalloc] [@@builtin] + +external to_bits : (t[@local_opt]) -> int32 + = "caml_float32_to_bits_bytecode" "caml_float32_to_bits" + [@@unboxed] [@@noalloc] [@@builtin] + +external of_string : string -> t = "caml_float32_of_string" + +let of_string_opt s = try Some (of_string s) with Failure _ -> None + +external format : string -> t -> string = "caml_format_float32" + +let to_string f = Stdlib.valid_float_lexem (format "%.9g" f) + +type fpclass = Stdlib.fpclass = + | FP_normal + | FP_subnormal + | FP_zero + | FP_infinite + | FP_nan + +external classify_float : (t[@unboxed]) -> fpclass + = "caml_classify_float32_bytecode" "caml_classify_float32" + [@@noalloc] + +external sqrt : t -> t = "caml_sqrt_float32_bytecode" "sqrtf" + [@@unboxed] [@@noalloc] [@@builtin] + +external cbrt : t -> t = "caml_cbrt_float32_bytecode" "cbrtf" + [@@unboxed] [@@noalloc] + +external exp : t -> t = "caml_exp_float32_bytecode" "expf" + [@@unboxed] [@@noalloc] + +external exp2 : t -> t = "caml_exp2_float32_bytecode" "exp2f" + [@@unboxed] [@@noalloc] + +external log : t -> t = "caml_log_float32_bytecode" "logf" + [@@unboxed] [@@noalloc] + +external log10 : t -> t = "caml_log10_float32_bytecode" "log10f" + [@@unboxed] [@@noalloc] + +external log2 : t -> t = "caml_log2_float32_bytecode" "log2f" + [@@unboxed] [@@noalloc] + +external expm1 : t -> t = "caml_expm1_float32_bytecode" "expm1f" + [@@unboxed] [@@noalloc] + +external log1p : t -> t = "caml_log1p_float32_bytecode" "log1pf" + [@@unboxed] [@@noalloc] + +external cos : t -> t = "caml_cos_float32_bytecode" "cosf" + [@@unboxed] [@@noalloc] + +external sin : t -> t = "caml_sin_float32_bytecode" "sinf" + [@@unboxed] [@@noalloc] + +external tan : t -> t = "caml_tan_float32_bytecode" "tanf" + [@@unboxed] [@@noalloc] + +external acos : t -> t = "caml_acos_float32_bytecode" "acosf" + [@@unboxed] [@@noalloc] + +external asin : t -> t = "caml_asin_float32_bytecode" "asinf" + [@@unboxed] [@@noalloc] + +external atan : t -> t = "caml_atan_float32_bytecode" "atanf" + [@@unboxed] [@@noalloc] + +external atan2 : t -> t -> t = "caml_atan2_float32_bytecode" "atan2f" + [@@unboxed] [@@noalloc] + +external hypot : t -> t -> t = "caml_hypot_float32_bytecode" "hypotf" + [@@unboxed] [@@noalloc] + +external cosh : t -> t = "caml_cosh_float32_bytecode" "coshf" + [@@unboxed] [@@noalloc] + +external sinh : t -> t = "caml_sinh_float32_bytecode" "sinhf" + [@@unboxed] [@@noalloc] + +external tanh : t -> t = "caml_tanh_float32_bytecode" "tanhf" + [@@unboxed] [@@noalloc] + +external acosh : t -> t = "caml_acosh_float32_bytecode" "acoshf" + [@@unboxed] [@@noalloc] + +external asinh : t -> t = "caml_asinh_float32_bytecode" "asinhf" + [@@unboxed] [@@noalloc] + +external atanh : t -> t = "caml_atanh_float32_bytecode" "atanhf" + [@@unboxed] [@@noalloc] + +external erf : t -> t = "caml_erf_float32_bytecode" "erff" + [@@unboxed] [@@noalloc] + +external erfc : t -> t = "caml_erfc_float32_bytecode" "erfcf" + [@@unboxed] [@@noalloc] + +external trunc : t -> t = "caml_trunc_float32_bytecode" "truncf" + [@@unboxed] [@@noalloc] + +external round : t -> t = "caml_round_float32_bytecode" "roundf" + [@@unboxed] [@@noalloc] + +external ceil : t -> t = "caml_ceil_float32_bytecode" "ceilf" + [@@unboxed] [@@noalloc] + +external floor : t -> t = "caml_floor_float32_bytecode" "floorf" + [@@unboxed] [@@noalloc] + +let is_integer x = x = trunc x && is_finite x + +external next_after : t -> t -> t + = "caml_nextafter_float32_bytecode" "nextafterf" + [@@unboxed] [@@noalloc] + +let succ x = next_after x infinity +let pred x = next_after x neg_infinity + +external copy_sign : t -> t -> t = "caml_copysign_float32_bytecode" "copysignf" + [@@unboxed] [@@noalloc] + +external sign_bit : (t[@unboxed]) -> bool + = "caml_signbit_float32_bytecode" "caml_signbit_float32" + [@@noalloc] + +external frexp : t -> t * int = "caml_frexp_float32" + +external ldexp : (t[@unboxed]) -> (int[@untagged]) -> (t[@unboxed]) + = "caml_ldexp_float32_bytecode" "caml_ldexp_float32" + [@@noalloc] + +external modf : t -> t * t = "caml_modf_float32" +external compare : t -> t -> int = "%compare" + +let equal x y = compare x y = 0 + +let[@inline] min (x : t) (y : t) = + if y > x || ((not (sign_bit y)) && sign_bit x) then if is_nan y then y else x + else if is_nan x then x + else y + +let[@inline] max (x : t) (y : t) = + if y > x || ((not (sign_bit y)) && sign_bit x) then if is_nan x then x else y + else if is_nan y then y + else x + +module With_weird_nan_behavior = struct + external min : t -> t -> t + = "caml_sse_float32_min_bytecode" "caml_sse_float32_min" + [@@noalloc] [@@unboxed] [@@builtin] + + external max : t -> t -> t + = "caml_sse_float32_max_bytecode" "caml_sse_float32_max" + [@@noalloc] [@@unboxed] [@@builtin] +end + +let[@inline] min_max (x : t) (y : t) = + if is_nan x || is_nan y then (nan, nan) + else if y > x || ((not (sign_bit y)) && sign_bit x) then (x, y) + else (y, x) + +let[@inline] min_num (x : t) (y : t) = + if y > x || ((not (sign_bit y)) && sign_bit x) then if is_nan x then y else x + else if is_nan y then x + else y + +let[@inline] max_num (x : t) (y : t) = + if y > x || ((not (sign_bit y)) && sign_bit x) then if is_nan y then x else y + else if is_nan x then y + else x + +let[@inline] min_max_num (x : t) (y : t) = + if is_nan x then (y, y) + else if is_nan y then (x, x) + else if y > x || ((not (sign_bit y)) && sign_bit x) then (x, y) + else (y, x) + +external iround_half_to_even : t -> int64 + = "caml_sse_cast_float32_int64_bytecode" "caml_sse_cast_float32_int64" + [@@noalloc] [@@unboxed] [@@builtin] + +external round_intrinsic : (int[@untagged]) -> (t[@unboxed]) -> (t[@unboxed]) + = "caml_sse41_float32_round_bytecode" "caml_sse41_float32_round" + [@@noalloc] [@@builtin] + +(* On amd64, these constants also imply _MM_FROUND_NO_EXC (suppress exceptions). *) +let round_neg_inf = 0x9 +let round_pos_inf = 0xA +let round_zero = 0xB +let round_current_mode = 0xC +let[@inline] round_half_to_even x = round_intrinsic round_current_mode x +let[@inline] round_down x = round_intrinsic round_neg_inf x +let[@inline] round_up x = round_intrinsic round_pos_inf x +let[@inline] round_towards_zero x = round_intrinsic round_zero x + +external seeded_hash_param : int -> int -> int -> 'a -> int = "caml_hash_exn" + [@@noalloc] + +let seeded_hash seed x = seeded_hash_param 10 100 seed x +let hash x = seeded_hash_param 10 100 0 x + +module Bytes = struct + external get : bytes -> pos:int -> float32 = "%caml_bytes_getf32" + external unsafe_get : bytes -> pos:int -> float32 = "%caml_bytes_getf32u" + external set : bytes -> pos:int -> float32 -> unit = "%caml_bytes_setf32" + + external unsafe_set : bytes -> pos:int -> float32 -> unit + = "%caml_bytes_setf32u" +end + +module String = struct + external get : string -> pos:int -> float32 = "%caml_string_getf32" + external unsafe_get : string -> pos:int -> float32 = "%caml_string_getf32u" +end + +module Bigstring = struct + open Bigarray + + type t = (char, int8_unsigned_elt, c_layout) Array1.t + + external get : t -> pos:int -> float32 = "%caml_bigstring_getf32" + external unsafe_get : t -> pos:int -> float32 = "%caml_bigstring_getf32u" + external set : t -> pos:int -> float32 -> unit = "%caml_bigstring_setf32" + + external unsafe_set : t -> pos:int -> float32 -> unit + = "%caml_bigstring_setf32u" +end + +module Bigarray = struct + open Bigarray + + module Array1 = struct + external get : ('a, float32_elt, 'c) Array1.t -> int -> float32 + = "%caml_ba_float32_ref_1" + + external set : ('a, float32_elt, 'c) Array1.t -> int -> float32 -> unit + = "%caml_ba_float32_set_1" + + external unsafe_get : ('a, float32_elt, 'c) Array1.t -> int -> float32 + = "%caml_ba_float32_unsafe_ref_1" + + external unsafe_set : + ('a, float32_elt, 'c) Array1.t -> int -> float32 -> unit + = "%caml_ba_float32_unsafe_set_1" + end + + module Array2 = struct + external get : ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 + = "%caml_ba_float32_ref_2" + + external set : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 -> unit + = "%caml_ba_float32_set_2" + + external unsafe_get : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 + = "%caml_ba_float32_unsafe_ref_2" + + external unsafe_set : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 -> unit + = "%caml_ba_float32_unsafe_set_2" + end + + module Array3 = struct + external get : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 + = "%caml_ba_float32_ref_3" + + external set : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 -> unit + = "%caml_ba_float32_set_3" + + external unsafe_get : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 + = "%caml_ba_float32_unsafe_ref_3" + + external unsafe_set : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 -> unit + = "%caml_ba_float32_unsafe_set_3" + end +end diff --git a/otherlibs/stdlib_stable/float32.mli b/otherlibs/stdlib_stable/float32.mli new file mode 100644 index 00000000000..8c5078f48cd --- /dev/null +++ b/otherlibs/stdlib_stable/float32.mli @@ -0,0 +1,694 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Nicolas Ojeda Bar, LexiFi *) +(* *) +(* Copyright 2018 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. *) +(* *) +(**************************************************************************) + +(** Floating-point arithmetic. + + OCaml's floating-point numbers follow the + IEEE 754 standard, using single precision (32 bits) numbers. + Floating-point operations never raise an exception on overflow, + underflow, division by zero, etc. Instead, special IEEE numbers + are returned as appropriate, such as [infinity] for [1.0s /. 0.0s], + [neg_infinity] for [-1.0s /. 0.0s], and [nan] ('not a number') + for [0.0s /. 0.0s]. These special numbers then propagate through + floating-point computations as expected: for instance, + [1.0s /. infinity] is [0.0s], basic arithmetic operations + ([+.], [-.], [*.], [/.]) with [nan] as an argument return [nan], ... +*) + +type t = float32 +(** An alias for the type of 32-bit floating-point numbers. *) + +val zero : t +(** The floating point 0.s *) + +val one : t +(** The floating-point 1.s *) + +val minus_one : t +(** The floating-point -1.s *) + +external neg : (t[@local_opt]) -> (t[@local_opt]) = "%negfloat32" +(** Unary negation. *) + +external add : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%addfloat32" +(** Floating-point addition. *) + +external sub : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%subfloat32" +(** Floating-point subtraction. *) + +external mul : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%mulfloat32" +(** Floating-point multiplication. *) + +external div : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%divfloat32" +(** Floating-point division. *) + +external pow : t -> t -> t = "caml_power_float32_bytecode" "powf" + [@@unboxed] [@@noalloc] +(** Exponentiation. *) + +(** Floating-point arithmetic operator overloads. *) +module Operators : sig + external ( ~-. ) : (t[@local_opt]) -> (t[@local_opt]) = "%negfloat32" + (** Unary negation. *) + + external ( +. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%addfloat32" + (** Floating-point addition. *) + + external ( -. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%subfloat32" + (** Floating-point subtraction. *) + + external ( *. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%mulfloat32" + (** Floating-point multiplication. *) + + external ( /. ) : (t[@local_opt]) -> (t[@local_opt]) -> (t[@local_opt]) + = "%divfloat32" + (** Floating-point division. *) + + external ( ** ) : t -> t -> t = "caml_power_float32_bytecode" "powf" + [@@unboxed] [@@noalloc] + (** Exponentiation. *) +end + +external fma : t -> t -> t -> t = "caml_fma_float32_bytecode" "fmaf" + [@@unboxed] [@@noalloc] +(** [fma x y z] returns [x * y + z], with a best effort for computing + this expression with a single rounding, using either hardware + instructions (providing full IEEE compliance) or a software + emulation. *) + +external rem : t -> t -> t = "caml_fmod_float32_bytecode" "fmodf" + [@@unboxed] [@@noalloc] +(** [rem a b] returns the remainder of [a] with respect to [b]. The returned + value is [a -. n *. b], where [n] is the quotient [a /. b] rounded towards + zero to an integer. *) + +val succ : t -> t +(** [succ x] returns the floating point number right after [x] i.e., + the smallest floating-point number greater than [x]. See also + {!next_after}. *) + +val pred : t -> t +(** [pred x] returns the floating-point number right before [x] i.e., + the greatest floating-point number smaller than [x]. See also + {!next_after}. *) + +external abs : (t[@local_opt]) -> (t[@local_opt]) = "%absfloat32" +(** [abs f] returns the absolute value of [f]. *) + +val infinity : t +(** Positive infinity. *) + +val neg_infinity : t +(** Negative infinity. *) + +val nan : t +(** A special floating-point value denoting the result of an + undefined operation such as [0.0s /. 0.0s]. Stands for + 'not a number'. Any floating-point operation with [nan] as + argument returns [nan] as result, unless otherwise specified in + IEEE 754 standard. As for floating-point comparisons, + [=], [<], [<=], [>] and [>=] return [false] and [<>] returns [true] + if one or both of their arguments is [nan]. + + Equivalent to [quiet_nan]. *) + +val signaling_nan : t +(** Signaling NaN. The corresponding signals do not raise OCaml exception, + but the value can be useful for interoperability with C libraries. *) + +val quiet_nan : t +(** Quiet NaN. *) + +val pi : t +(** The constant pi. *) + +val max_float : t +(** The largest positive finite value of type [float32]. *) + +val min_float : t +(** The smallest positive, non-zero, non-denormalized value of type [float32]. *) + +val epsilon : t +(** The difference between [1.0s] and the smallest exactly representable + floating-point number greater than [1.0s]. *) + +val is_finite : t -> bool +(** [is_finite x] is [true] if and only if [x] is finite i.e., not infinite and + not {!nan}. *) + +val is_infinite : t -> bool +(** [is_infinite x] is [true] if and only if [x] is {!infinity} or + {!neg_infinity}. *) + +val is_nan : t -> bool +(** [is_nan x] is [true] if and only if [x] is not a number (see {!nan}). *) + +val is_integer : t -> bool +(** [is_integer x] is [true] if and only if [x] is an integer. *) + +external of_float : (float[@local_opt]) -> t = "%float32offloat" +(** Convert a 64-bit float to the nearest representable 32-bit float. *) + +external to_float : (t[@local_opt]) -> float = "%floatoffloat32" +(** Convert a 32-bit float to a 64-bit float. *) + +external of_int : int -> t = "%float32ofint" +(** Convert an integer to floating-point. *) + +external to_int : (t[@local_opt]) -> int = "%intoffloat32" +(** Truncate the given floating-point number to an integer. + The result is unspecified if the argument is [nan] or falls outside the + range of representable integers. *) + +external of_int64 : (int64[@local_opt]) -> t + = "caml_float32_of_int64_bytecode" "caml_float32_of_int64" + [@@unboxed] [@@noalloc] [@@builtin] +(** Convert the given 64-bit integer to the nearest representable 32-bit float. + The amd64 flambda-backend compiler translates this call to CVTSI2SS. *) + +external to_int64 : (t[@local_opt]) -> int64 + = "caml_float32_to_int64_bytecode" "caml_float32_to_int64" + [@@unboxed] [@@noalloc] [@@builtin] +(** Convert the given 32-bit float to a 64-bit integer, + discarding the fractional part (truncate towards 0). + If the truncated floating-point number is outside the range + \[{!Int64.min_int}, {!Int64.max_int}\], no exception is raised, and + an unspecified, platform-dependent integer is returned. + The amd64 flambda-backend compiler translates this call to CVTTSS2SI. *) + +external of_bits : (int32[@local_opt]) -> t + = "caml_float32_of_bits_bytecode" "caml_float32_of_bits" + [@@unboxed] [@@noalloc] [@@builtin] +(** Convert a 32-bit float to a 32-bit integer, preserving the value's + bit pattern. + The amd64 flambda-backend compiler translates this call to MOVD. *) + +external to_bits : (t[@local_opt]) -> int32 + = "caml_float32_to_bits_bytecode" "caml_float32_to_bits" + [@@unboxed] [@@noalloc] [@@builtin] +(** Convert a 32-bit integer to a 32-bit float, preserving the value's + bit pattern. + The amd64 flambda-backend compiler translates this call to MOVD. *) + +external of_string : string -> t = "caml_float32_of_string" +(** Convert the given string to a float. The string is read in decimal + (by default) or in hexadecimal (marked by [0x] or [0X]). + The format of decimal floating-point numbers is + [ [-] dd.ddd (e|E) [+|-] dd ], where [d] stands for a decimal digit. + The format of hexadecimal floating-point numbers is + [ [-] 0(x|X) hh.hhh (p|P) [+|-] dd ], where [h] stands for an + hexadecimal digit and [d] for a decimal digit. + In both cases, at least one of the integer and fractional parts must be + given; the exponent part is optional. + The [_] (underscore) character can appear anywhere in the string + and is ignored. + Depending on the execution platforms, other representations of + floating-point numbers can be accepted, but should not be relied upon. + @raise Failure if the given string is not a valid + representation of a float32. *) + +val of_string_opt : string -> t option +(** Same as [of_string], but returns [None] instead of raising. *) + +val to_string : t -> string +(** Return a string representation of a floating-point number. + + This conversion does not involve a loss of precision. *) + +(** The five classes of floating-point numbers, as determined by + the {!classify_float} function. *) +type fpclass = Stdlib.fpclass = + | FP_normal (** Normal number, none of the below *) + | FP_subnormal (** Number very close to 0.0s, has reduced precision *) + | FP_zero (** Number is 0.0s or -0.0s *) + | FP_infinite (** Number is positive or negative infinity *) + | FP_nan (** Not a number: result of an undefined operation *) + +external classify_float : (t[@unboxed]) -> fpclass + = "caml_classify_float32_bytecode" "caml_classify_float32" + [@@noalloc] +(** Return the class of the given floating-point number: + normal, subnormal, zero, infinite, or not a number. *) + +external sqrt : t -> t = "caml_sqrt_float32_bytecode" "sqrtf" + [@@unboxed] [@@noalloc] [@@builtin] +(** Square root. + The amd64 flambda-backend compiler translates this call to SQRTSS. *) + +external cbrt : t -> t = "caml_cbrt_float32_bytecode" "cbrtf" + [@@unboxed] [@@noalloc] +(** Cube root. *) + +external exp : t -> t = "caml_exp_float32_bytecode" "expf" + [@@unboxed] [@@noalloc] +(** Exponential. *) + +external exp2 : t -> t = "caml_exp2_float32_bytecode" "exp2f" + [@@unboxed] [@@noalloc] +(** Base 2 exponential function. *) + +external log : t -> t = "caml_log_float32_bytecode" "logf" + [@@unboxed] [@@noalloc] +(** Natural logarithm. *) + +external log10 : t -> t = "caml_log10_float32_bytecode" "log10f" + [@@unboxed] [@@noalloc] +(** Base 10 logarithm. *) + +external log2 : t -> t = "caml_log2_float32_bytecode" "log2f" + [@@unboxed] [@@noalloc] +(** Base 2 logarithm. *) + +external expm1 : t -> t = "caml_expm1_float32_bytecode" "expm1f" + [@@unboxed] [@@noalloc] +(** [expm1 x] computes [exp x -. 1.0], giving numerically-accurate results + even if [x] is close to [0.0]. *) + +external log1p : t -> t = "caml_log1p_float32_bytecode" "log1pf" + [@@unboxed] [@@noalloc] +(** [log1p x] computes [log(1.0 +. x)] (natural logarithm), + giving numerically-accurate results even if [x] is close to [0.0]. *) + +external cos : t -> t = "caml_cos_float32_bytecode" "cosf" + [@@unboxed] [@@noalloc] +(** Cosine. Argument is in radians. *) + +external sin : t -> t = "caml_sin_float32_bytecode" "sinf" + [@@unboxed] [@@noalloc] +(** Sine. Argument is in radians. *) + +external tan : t -> t = "caml_tan_float32_bytecode" "tanf" + [@@unboxed] [@@noalloc] +(** Tangent. Argument is in radians. *) + +external acos : t -> t = "caml_acos_float32_bytecode" "acosf" + [@@unboxed] [@@noalloc] +(** Arc cosine. The argument must fall within the range [[-1.0, 1.0]]. + Result is in radians and is between [0.0] and [pi]. *) + +external asin : t -> t = "caml_asin_float32_bytecode" "asinf" + [@@unboxed] [@@noalloc] +(** Arc sine. The argument must fall within the range [[-1.0, 1.0]]. + Result is in radians and is between [-pi/2] and [pi/2]. *) + +external atan : t -> t = "caml_atan_float32_bytecode" "atanf" + [@@unboxed] [@@noalloc] +(** Arc tangent. + Result is in radians and is between [-pi/2] and [pi/2]. *) + +external atan2 : t -> t -> t = "caml_atan2_float32_bytecode" "atan2f" + [@@unboxed] [@@noalloc] +(** [atan2 y x] returns the arc tangent of [y /. x]. The signs of [x] + and [y] are used to determine the quadrant of the result. + Result is in radians and is between [-pi] and [pi]. *) + +external hypot : t -> t -> t = "caml_hypot_float32_bytecode" "hypotf" + [@@unboxed] [@@noalloc] +(** [hypot x y] returns [sqrt(x *. x +. y *. y)], that is, the length + of the hypotenuse of a right-angled triangle with sides of length + [x] and [y], or, equivalently, the distance of the point [(x,y)] + to origin. If one of [x] or [y] is infinite, returns [infinity] + even if the other is [nan]. *) + +external cosh : t -> t = "caml_cosh_float32_bytecode" "coshf" + [@@unboxed] [@@noalloc] +(** Hyperbolic cosine. Argument is in radians. *) + +external sinh : t -> t = "caml_sinh_float32_bytecode" "sinhf" + [@@unboxed] [@@noalloc] +(** Hyperbolic sine. Argument is in radians. *) + +external tanh : t -> t = "caml_tanh_float32_bytecode" "tanhf" + [@@unboxed] [@@noalloc] +(** Hyperbolic tangent. Argument is in radians. *) + +external acosh : t -> t = "caml_acosh_float32_bytecode" "acoshf" + [@@unboxed] [@@noalloc] +(** Hyperbolic arc cosine. The argument must fall within the range + [[1.0, inf]]. + Result is in radians and is between [0.0] and [inf]. *) + +external asinh : t -> t = "caml_asinh_float32_bytecode" "asinhf" + [@@unboxed] [@@noalloc] +(** Hyperbolic arc sine. The argument and result range over the entire + real line. + Result is in radians. *) + +external atanh : t -> t = "caml_atanh_float32_bytecode" "atanhf" + [@@unboxed] [@@noalloc] +(** Hyperbolic arc tangent. The argument must fall within the range + [[-1.0, 1.0]]. + Result is in radians and ranges over the entire real line. *) + +external erf : t -> t = "caml_erf_float32_bytecode" "erff" + [@@unboxed] [@@noalloc] +(** Error function. The argument ranges over the entire real line. + The result is always within [[-1.0, 1.0]]. *) + +external erfc : t -> t = "caml_erfc_float32_bytecode" "erfcf" + [@@unboxed] [@@noalloc] +(** Complementary error function ([erfc x = 1 - erf x]). + The argument ranges over the entire real line. + The result is always within [[-1.0, 1.0]]. *) + +external trunc : t -> t = "caml_trunc_float32_bytecode" "truncf" + [@@unboxed] [@@noalloc] +(** [trunc x] rounds [x] to the nearest integer whose absolute value is + less than or equal to [x]. *) + +external round : t -> t = "caml_round_float32_bytecode" "roundf" + [@@unboxed] [@@noalloc] +(** [round x] rounds [x] to the nearest integer with ties (fractional + values of 0.5s) rounded away from zero, regardless of the current + rounding direction. If [x] is an integer, [+0.s], [-0.s], [nan], or + infinite, [x] itself is returned. *) + +external ceil : t -> t = "caml_ceil_float32_bytecode" "ceilf" + [@@unboxed] [@@noalloc] +(** Round above to an integer value. + [ceil f] returns the least integer value greater than or equal to [f]. + The result is returned as a float32. *) + +external floor : t -> t = "caml_floor_float32_bytecode" "floorf" + [@@unboxed] [@@noalloc] +(** Round below to an integer value. + [floor f] returns the greatest integer value less than or + equal to [f]. + The result is returned as a float32. *) + +external next_after : t -> t -> t + = "caml_nextafter_float32_bytecode" "nextafterf" + [@@unboxed] [@@noalloc] +(** [next_after x y] returns the next representable floating-point + value following [x] in the direction of [y]. More precisely, if + [y] is greater (resp. less) than [x], it returns the smallest + (resp. largest) representable number greater (resp. less) than [x]. + If [x] equals [y], the function returns [y]. If [x] or [y] is + [nan], a [nan] is returned. + Note that [next_after max_float infinity = infinity] and that + [next_after 0.s infinity] is the smallest denormalized positive number. + If [x] is the smallest denormalized positive number, + [next_after x 0.s = 0.s] *) + +external copy_sign : t -> t -> t = "caml_copysign_float32_bytecode" "copysignf" + [@@unboxed] [@@noalloc] +(** [copy_sign x y] returns a float whose absolute value is that of [x] + and whose sign is that of [y]. If [x] is [nan], returns [nan]. + If [y] is [nan], returns either [x] or [-. x], but it is not + specified which. *) + +external sign_bit : (t[@unboxed]) -> bool + = "caml_signbit_float32_bytecode" "caml_signbit_float32" + [@@noalloc] +(** [sign_bit x] is [true] if and only if the sign bit of [x] is set. + For example [sign_bit 1.] and [signbit 0.] are [false] while + [sign_bit (-1.)] and [sign_bit (-0.)] are [true]. *) + +external frexp : t -> t * int = "caml_frexp_float32" +(** [frexp f] returns the pair of the significant + and the exponent of [f]. When [f] is zero, the + significant [x] and the exponent [n] of [f] are equal to + zero. When [f] is non-zero, they are defined by + [f = x *. 2 ** n] and [0.5 <= x < 1.0]. *) + +external ldexp : (t[@unboxed]) -> (int[@untagged]) -> (t[@unboxed]) + = "caml_ldexp_float32_bytecode" "caml_ldexp_float32" + [@@noalloc] +(** [ldexp x n] returns [x *. 2 ** n]. *) + +external modf : t -> t * t = "caml_modf_float32" +(** [modf f] returns the pair of the fractional and integral + part of [f]. *) + +external compare : t -> t -> int = "%compare" +(** [compare x y] returns [0] if [x] is equal to [y], a negative integer if [x] + is less than [y], and a positive integer if [x] is greater than + [y]. [compare] treats [nan] as equal to itself and less than any other float + value. This treatment of [nan] ensures that [compare] defines a total + ordering relation. *) + +val equal : t -> t -> bool +(** The equal function for floating-point numbers, compared using {!compare}. *) + +val min : t -> t -> t +(** [min x y] returns the minimum of [x] and [y]. It returns [nan] + when [x] or [y] is [nan]. Moreover [min (-0.s) (+0.s) = -0.s] *) + +val max : t -> t -> t +(** [max x y] returns the maximum of [x] and [y]. It returns [nan] + when [x] or [y] is [nan]. Moreover [max (-0.s) (+0.s) = +0.s] *) + +module With_weird_nan_behavior : sig + external min : t -> t -> t + = "caml_sse_float32_min_bytecode" "caml_sse_float32_min" + [@@noalloc] [@@unboxed] [@@builtin] + (** [min x y] returns the minimum of [x] and [y]. + If either [x] or [y] is [nan], [y] is returned. + If both [x] and [y] equal zero, [y] is returned. + The amd64 flambda-backend compiler translates this call to MINSS. *) + + external max : t -> t -> t + = "caml_sse_float32_max_bytecode" "caml_sse_float32_max" + [@@noalloc] [@@unboxed] [@@builtin] + (** [max x y] returns the maximum of [x] and [y]. + If either [x] or [y] is [nan], [y] is returned. + If both [x] and [y] equal zero, [y] is returned. + The amd64 flambda-backend compiler translates this call to MAXSS. *) +end + +val min_max : t -> t -> t * t +(** [min_max x y] is [(min x y, max x y)], just more efficient. *) + +val min_num : t -> t -> t +(** [min_num x y] returns the minimum of [x] and [y] treating [nan] as + missing values. If both [x] and [y] are [nan], [nan] is returned. + Moreover [min_num (-0.s) (+0.s) = -0.s] *) + +val max_num : t -> t -> t +(** [max_num x y] returns the maximum of [x] and [y] treating [nan] as + missing values. If both [x] and [y] are [nan] [nan] is returned. + Moreover [max_num (-0.s) (+0.s) = +0.s] *) + +val min_max_num : t -> t -> t * t +(** [min_max_num x y] is [(min_num x y, max_num x y)], just more + efficient. Note that in particular [min_max_num x nan = (x, x)] + and [min_max_num nan y = (y, y)]. *) + +external iround_half_to_even : t -> int64 + = "caml_sse_cast_float32_int64_bytecode" "caml_sse_cast_float32_int64" + [@@noalloc] [@@unboxed] [@@builtin] +(** Rounds a [float32] to an [int64] using the current rounding mode. The default + rounding mode is "round half to even", and we expect that no program will + change the rounding mode. + If the argument is NaN or infinite or if the rounded value cannot be + represented, then the result is unspecified. + The amd64 flambda-backend compiler translates this call to CVTSS2SI. *) + +val round_half_to_even : t -> t +(** Rounds a [float32] to an integer [float32] using the current rounding + mode. The default rounding mode is "round half to even", and we + expect that no program will change the rounding mode. + The amd64 flambda-backend compiler translates this call to ROUNDSS. *) + +val round_down : t -> t +(** Rounds a [float32] down to the next integer [float32] toward negative infinity. + The amd64 flambda-backend compiler translates this call to ROUNDSS.*) + +val round_up : t -> t +(** Rounds a [float32] up to the next integer [float32] toward positive infinity. + The amd64 flambda-backend compiler translates this call to ROUNDSS.*) + +val round_towards_zero : t -> t +(** Rounds a [float32] to the next integer [float32] toward zero. + The amd64 flambda-backend compiler translates this call to ROUNDSS.*) + +val seeded_hash : int -> t -> int +(** A seeded hash function for floats, with the same output value as + {!Hashtbl.seeded_hash}. This function allows this module to be passed as + argument to the functor {!Hashtbl.MakeSeeded}. *) + +val hash : t -> int +(** An unseeded hash function for floats, with the same output value as + {!Hashtbl.hash}. This function allows this module to be passed as argument + to the functor {!Hashtbl.Make}. *) + +module Bytes : sig + external get : bytes -> pos:int -> float32 = "%caml_bytes_getf32" + (** [get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + external unsafe_get : bytes -> pos:int -> float32 = "%caml_bytes_getf32u" + (** [unsafe_get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) + + external set : bytes -> pos:int -> float32 -> unit = "%caml_bytes_setf32" + (** [set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + external unsafe_set : bytes -> pos:int -> float32 -> unit + = "%caml_bytes_setf32u" + (** [unsafe_set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) +end + +module String : sig + external get : string -> pos:int -> float32 = "%caml_string_getf32" + (** [get s ~pos] loads a float32 from [s] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length s - 4]. *) + + external unsafe_get : string -> pos:int -> float32 = "%caml_string_getf32u" + (** [unsafe_get s ~pos] loads a float32 from [s] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) +end + +module Bigstring : sig + open Bigarray + + type t = (char, int8_unsigned_elt, c_layout) Array1.t + + external get : t -> pos:int -> float32 = "%caml_bigstring_getf32" + (** [get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + external unsafe_get : t -> pos:int -> float32 = "%caml_bigstring_getf32u" + (** [unsafe_get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) + + external set : t -> pos:int -> float32 -> unit = "%caml_bigstring_setf32" + (** [set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + external unsafe_set : t -> pos:int -> float32 -> unit + = "%caml_bigstring_setf32u" + (** [unsafe_set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) +end + +module Bigarray : sig + open Bigarray + + module Array1 : sig + external get : ('a, float32_elt, 'c) Array1.t -> int -> float32 + = "%caml_ba_float32_ref_1" + (** [Array1.get a x], or alternatively [a.{x}], + returns the element of [a] at index [x]. + [x] must be greater or equal than [0] and strictly less than + [Array1.dim a] if [a] has C layout. If [a] has Fortran layout, + [x] must be greater or equal than [1] and less or equal than + [Array1.dim a]. Otherwise, [Invalid_argument] is raised. *) + + external set : ('a, float32_elt, 'c) Array1.t -> int -> float32 -> unit + = "%caml_ba_float32_set_1" + (** [Array1.set a x v], also written [a.{x} <- v], + stores the value [v] at index [x] in [a]. + [x] must be inside the bounds of [a] as described in + {!Bigarray.Array1.get}; + otherwise, [Invalid_argument] is raised. *) + + external unsafe_get : ('a, float32_elt, 'c) Array1.t -> int -> float32 + = "%caml_ba_float32_unsafe_ref_1" + (** Like {!Bigarray.Array1.get}, but bounds checking is not always performed. + Use with caution and only when the program logic guarantees that + the access is within bounds. *) + + external unsafe_set : + ('a, float32_elt, 'c) Array1.t -> int -> float32 -> unit + = "%caml_ba_float32_unsafe_set_1" + (** Like {!Bigarray.Array1.set}, but bounds checking is not always performed. + Use with caution and only when the program logic guarantees that + the access is within bounds. *) + end + + module Array2 : sig + external get : ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 + = "%caml_ba_float32_ref_2" + (** [Array2.get a x y], also written [a.{x,y}], + returns the element of [a] at coordinates ([x], [y]). + [x] and [y] must be within the bounds + of [a], as described for {!Bigarray.Genarray.get}; + otherwise, [Invalid_argument] is raised. *) + + external set : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 -> unit + = "%caml_ba_float32_set_2" + (** [Array2.set a x y v], or alternatively [a.{x,y} <- v], + stores the value [v] at coordinates ([x], [y]) in [a]. + [x] and [y] must be within the bounds of [a], + as described for {!Bigarray.Genarray.set}; + otherwise, [Invalid_argument] is raised. *) + + external unsafe_get : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 + = "%caml_ba_float32_unsafe_ref_2" + (** Like {!Bigarray.Array2.get}, but bounds checking is not always + performed. *) + + external unsafe_set : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32 -> unit + = "%caml_ba_float32_unsafe_set_2" + (** Like {!Bigarray.Array2.set}, but bounds checking is not always + performed. *) + end + + module Array3 : sig + external get : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 + = "%caml_ba_float32_ref_3" + (** [Array3.get a x y z], also written [a.{x,y,z}], + returns the element of [a] at coordinates ([x], [y], [z]). + [x], [y] and [z] must be within the bounds of [a], + as described for {!Bigarray.Genarray.get}; + otherwise, [Invalid_argument] is raised. *) + + external set : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 -> unit + = "%caml_ba_float32_set_3" + (** [Array3.set a x y v], or alternatively [a.{x,y,z} <- v], + stores the value [v] at coordinates ([x], [y], [z]) in [a]. + [x], [y] and [z] must be within the bounds of [a], + as described for {!Bigarray.Genarray.set}; + otherwise, [Invalid_argument] is raised. *) + + external unsafe_get : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 + = "%caml_ba_float32_unsafe_ref_3" + (** Like {!Bigarray.Array3.get}, but bounds checking is not always + performed. *) + + external unsafe_set : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32 -> unit + = "%caml_ba_float32_unsafe_set_3" + (** Like {!Bigarray.Array3.set}, but bounds checking is not always + performed. *) + end +end diff --git a/otherlibs/stdlib_stable/float32_u.ml b/otherlibs/stdlib_stable/float32_u.ml new file mode 100644 index 00000000000..2c514a690ae --- /dev/null +++ b/otherlibs/stdlib_stable/float32_u.ml @@ -0,0 +1,251 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Chris Casinghino, Jane Street, New York *) +(* *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +[@@@ocaml.flambda_o3] + +type t = float32# + +external box_float : float# -> (float[@local_opt]) = "%box_float" + +external unbox_float : (float[@local_opt]) -> float# = "%unbox_float" + +external box_int32 : int32# -> (int32[@local_opt]) = "%box_int32" + +external unbox_int32 : (int32[@local_opt]) -> int32# = "%unbox_int32" + +external box_int64 : int64# -> (int64[@local_opt]) = "%box_int64" + +external unbox_int64 : (int64[@local_opt]) -> int64# = "%unbox_int64" + +external to_float32 : t -> (float32[@local_opt]) = "%box_float32" + +external of_float32 : (float32[@local_opt]) -> t = "%unbox_float32" + +(* CR layouts: Investigate whether it's worth making these things externals. + Are there situations where the middle-end won't inline them and remove the + boxing/unboxing? *) + +let[@inline always] neg x = of_float32 (Float32.neg (to_float32 x)) + +let[@inline always] add x y = of_float32 (Float32.add (to_float32 x) (to_float32 y)) + +let[@inline always] sub x y = of_float32 (Float32.sub (to_float32 x) (to_float32 y)) + +let[@inline always] mul x y = of_float32 (Float32.mul (to_float32 x) (to_float32 y)) + +let[@inline always] div x y = of_float32 (Float32.div (to_float32 x) (to_float32 y)) + +let[@inline always] pow x y = of_float32 (Float32.pow (to_float32 x) (to_float32 y)) + +module Operators = struct + let[@inline always] ( ~-. ) x = of_float32 (Float32.neg (to_float32 x)) + + let[@inline always] ( +. ) x y = of_float32 (Float32.add (to_float32 x) (to_float32 y)) + + let[@inline always] ( -. ) x y = of_float32 (Float32.sub (to_float32 x) (to_float32 y)) + + let[@inline always] ( *. ) x y = of_float32 (Float32.mul (to_float32 x) (to_float32 y)) + + let[@inline always] ( /. ) x y = of_float32 (Float32.div (to_float32 x) (to_float32 y)) + + let[@inline always] ( ** ) x y = of_float32 (Float32.pow (to_float32 x) (to_float32 y)) +end + +let[@inline always] fma x y z = of_float32 (Float32.fma (to_float32 x) (to_float32 y) (to_float32 z)) + +let[@inline always] rem x y = of_float32 (Float32.rem (to_float32 x) (to_float32 y)) + +let[@inline always] succ x = of_float32 (Float32.succ (to_float32 x)) + +let[@inline always] pred x = of_float32 (Float32.pred (to_float32 x)) + +let[@inline always] abs x = of_float32 (Float32.abs (to_float32 x)) + +let[@inline always] is_finite x = Float32.is_finite (to_float32 x) + +let[@inline always] is_infinite x = Float32.is_infinite (to_float32 x) + +let[@inline always] is_nan x = Float32.is_nan (to_float32 x) + +let[@inline always] is_integer x = Float32.is_integer (to_float32 x) + +let[@inline always] of_int x = of_float32 (Float32.of_int x) + +let[@inline always] to_int x = Float32.to_int (to_float32 x) + +let[@inline always] of_int64 x = of_float32 (Float32.of_int64 (box_int64 x)) + +let[@inline always] to_int64 x = unbox_int64 (Float32.to_int64 (to_float32 x)) +let[@inline always] of_float x = of_float32 (Float32.of_float (box_float x)) + +let[@inline always] to_float x = unbox_float (Float32.to_float (to_float32 x)) + +let[@inline always] of_bits x = of_float32 (Float32.of_bits (box_int32 x)) + +let[@inline always] to_bits x = unbox_int32 (Float32.to_bits (to_float32 x)) + +let[@inline always] of_string x = of_float32 (Float32.of_string x) + +let[@inline always] to_string x = Float32.to_string (to_float32 x) + +type fpclass = Stdlib.fpclass = + FP_normal + | FP_subnormal + | FP_zero + | FP_infinite + | FP_nan + +let[@inline always] classify_float x = Float32.classify_float (to_float32 x) + +let[@inline always] sqrt x = of_float32 (Float32.sqrt (to_float32 x)) + +let[@inline always] cbrt x = of_float32 (Float32.cbrt (to_float32 x)) + +let[@inline always] exp x = of_float32 (Float32.exp (to_float32 x)) + +let[@inline always] exp2 x = of_float32 (Float32.exp2 (to_float32 x)) + +let[@inline always] log x = of_float32 (Float32.log (to_float32 x)) + +let[@inline always] log10 x = of_float32 (Float32.log10 (to_float32 x)) + +let[@inline always] log2 x = of_float32 (Float32.log2 (to_float32 x)) + +let[@inline always] expm1 x = of_float32 (Float32.expm1 (to_float32 x)) + +let[@inline always] log1p x = of_float32 (Float32.log1p (to_float32 x)) + +let[@inline always] cos x = of_float32 (Float32.cos (to_float32 x)) + +let[@inline always] sin x = of_float32 (Float32.sin (to_float32 x)) + +let[@inline always] tan x = of_float32 (Float32.tan (to_float32 x)) + +let[@inline always] acos x = of_float32 (Float32.acos (to_float32 x)) + +let[@inline always] asin x = of_float32 (Float32.asin (to_float32 x)) + +let[@inline always] atan x = of_float32 (Float32.atan (to_float32 x)) + +let[@inline always] atan2 x y = of_float32 (Float32.atan2 (to_float32 x) (to_float32 y)) + +let[@inline always] hypot x y = of_float32 (Float32.hypot (to_float32 x) (to_float32 y)) + +let[@inline always] cosh x = of_float32 (Float32.cosh (to_float32 x)) + +let[@inline always] sinh x = of_float32 (Float32.sinh (to_float32 x)) + +let[@inline always] tanh x = of_float32 (Float32.tanh (to_float32 x)) + +let[@inline always] acosh x = of_float32 (Float32.acosh (to_float32 x)) + +let[@inline always] asinh x = of_float32 (Float32.asinh (to_float32 x)) + +let[@inline always] atanh x = of_float32 (Float32.atanh (to_float32 x)) + +let[@inline always] erf x = of_float32 (Float32.erf (to_float32 x)) + +let[@inline always] erfc x = of_float32 (Float32.erfc (to_float32 x)) + +let[@inline always] trunc x = of_float32 (Float32.trunc (to_float32 x)) + +let[@inline always] round x = of_float32 (Float32.round (to_float32 x)) + +let[@inline always] ceil x = of_float32 (Float32.ceil (to_float32 x)) + +let[@inline always] floor x = of_float32 (Float32.floor (to_float32 x)) + +let[@inline always] next_after x y = of_float32 (Float32.next_after (to_float32 x) (to_float32 y)) + +let[@inline always] copy_sign x y = of_float32 (Float32.copy_sign (to_float32 x) (to_float32 y)) + +let[@inline always] sign_bit x = Float32.sign_bit (to_float32 x) + +let[@inline always] ldexp x i = of_float32 (Float32.ldexp (to_float32 x) i) + +let[@inline always] compare x y = Float32.compare (to_float32 x) (to_float32 y) + +let[@inline always] equal x y = Float32.equal (to_float32 x) (to_float32 y) + +let[@inline always] min x y = of_float32 (Float32.min (to_float32 x) (to_float32 y)) + +let[@inline always] max x y = of_float32 (Float32.max (to_float32 x) (to_float32 y)) + +module With_weird_nan_behavior = struct + let[@inline always] min x y = of_float32 (Float32.With_weird_nan_behavior.min (to_float32 x) (to_float32 y)) + + let[@inline always] max x y = of_float32 (Float32.With_weird_nan_behavior.max (to_float32 x) (to_float32 y)) +end + +let[@inline always] min_num x y = of_float32 (Float32.min_num (to_float32 x) (to_float32 y)) + +let[@inline always] max_num x y = of_float32 (Float32.max_num (to_float32 x) (to_float32 y)) + +let iround_half_to_even x = unbox_int64 (Float32.iround_half_to_even (to_float32 x)) + +let round_half_to_even x = of_float32 (Float32.round_half_to_even (to_float32 x)) + +let round_down x = of_float32 (Float32.round_down (to_float32 x)) + +let round_up x = of_float32 (Float32.round_up (to_float32 x)) + +let round_towards_zero x = of_float32 (Float32.round_towards_zero (to_float32 x)) + +module Bytes = struct + let get bytes ~pos = of_float32 (Float32.Bytes.get bytes ~pos) + let unsafe_get bytes ~pos = of_float32 (Float32.Bytes.unsafe_get bytes ~pos) + let set bytes ~pos x = Float32.Bytes.set bytes ~pos (to_float32 x) + let unsafe_set bytes ~pos x = Float32.Bytes.unsafe_set bytes ~pos (to_float32 x) +end + +module String = struct + let get string ~pos = of_float32 (Float32.String.get string ~pos) + let unsafe_get string ~pos = of_float32 (Float32.String.unsafe_get string ~pos) +end + +module Bigstring = struct + open Bigarray + + type t = (char, int8_unsigned_elt, c_layout) Array1.t + + external get : t -> pos:int -> float32# = "%caml_bigstring_getf32#" + external unsafe_get : t -> pos:int -> float32# = "%caml_bigstring_getf32u#" + external set : t -> pos:int -> float32# -> unit = "%caml_bigstring_setf32#" + external unsafe_set : t -> pos:int -> float32# -> unit = "%caml_bigstring_setf32u#" +end + +module Bigarray = struct + module Array1 = struct + let get ba ix = of_float32 (Float32.Bigarray.Array1.get ba ix) + let set ba ix x = Float32.Bigarray.Array1.set ba ix (to_float32 x) + let unsafe_get ba ix = of_float32 (Float32.Bigarray.Array1.unsafe_get ba ix) + let unsafe_set ba ix x = Float32.Bigarray.Array1.unsafe_set ba ix (to_float32 x) + end + + module Array2 = struct + let get ba ix iy = of_float32 (Float32.Bigarray.Array2.get ba ix iy) + let set ba ix iy x = Float32.Bigarray.Array2.set ba ix iy (to_float32 x) + let unsafe_get ba ix iy = of_float32 (Float32.Bigarray.Array2.unsafe_get ba ix iy) + let unsafe_set ba ix iy x = Float32.Bigarray.Array2.unsafe_set ba ix iy (to_float32 x) + end + + module Array3 = struct + let get ba ix iy iz = of_float32 (Float32.Bigarray.Array3.get ba ix iy iz) + let set ba ix iy iz x = Float32.Bigarray.Array3.set ba ix iy iz (to_float32 x) + let unsafe_get ba ix iy iz = of_float32 (Float32.Bigarray.Array3.unsafe_get ba ix iy iz) + let unsafe_set ba ix iy iz x = Float32.Bigarray.Array3.unsafe_set ba ix iy iz (to_float32 x) + end +end diff --git a/otherlibs/stdlib_stable/float32_u.mli b/otherlibs/stdlib_stable/float32_u.mli new file mode 100644 index 00000000000..69e40050944 --- /dev/null +++ b/otherlibs/stdlib_stable/float32_u.mli @@ -0,0 +1,565 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Nicolas Ojeda Bar, LexiFi *) +(* Chris Casinghino, Jane Street, New York *) +(* *) +(* Copyright 2018 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +(** Unboxed 32-bit floating-point arithmetic. This file primarily duplicates + functionality from the [Float32] module, but for [float32#]. + + OCaml's 32-bit floating-point numbers follow the + IEEE 754 standard, using single precision (32 bits) numbers. + Floating-point operations never raise an exception on overflow, + underflow, division by zero, etc. Instead, special IEEE numbers + are returned as appropriate, such as [infinity] for [#1.0s /. #0.0s], + [neg_infinity] for [#-1.0s /. #0.0s], and [nan] ('not a number') + for [#0.0s /. #0.0s]. These special numbers then propagate through + floating-point computations as expected: for instance, + [#1.0s /. infinity] is [#0.0s], basic arithmetic operations + ([+.], [-.], [*.], [/.]) with [nan] as an argument return [nan], ... +*) + +type t = float32# +(** An alias for the type of unboxed 32-bit floating-point numbers. *) + +(* CR layouts v5: add back all the constants in this module (e.g., [zero] and + [infinity]) when we we support [float32]s in structures. *) + +(* Unboxed-specific stuff at the top. *) +external to_float32 : t -> (float32[@local_opt]) = "%box_float32" +(** Box a [float32#] *) + +external of_float32 : (float32[@local_opt]) -> t = "%unbox_float32" +(** Unbox a boxed [float32] *) + +(* Below here, everything also appears in [Float32], though most things are + externals in that module. *) + +val neg : t -> t +(** Unary negation. *) + +val add : t -> t -> t +(** Floating-point addition. *) + +val sub : t -> t -> t +(** Floating-point subtraction. *) + +val mul : t -> t -> t +(** Floating-point multiplication. *) + +val div : t -> t -> t +(** Floating-point division. *) + +val pow : t -> t -> t +(** Exponentiation. *) + +(** Floating-point arithmetic operator overloads. *) +module Operators : sig + val ( ~-. ) : t -> t + (** Unary negation. *) + + val ( +. ) : t -> t -> t + (** Floating-point addition. *) + + val ( -. ) : t -> t -> t + (** Floating-point subtraction. *) + + val ( *. ) : t -> t -> t + (** Floating-point multiplication. *) + + val ( /. ) : t -> t -> t + (** Floating-point division. *) + + val ( ** ) : t -> t -> t + (** Exponentiation. *) +end + +val fma : t -> t -> t -> t +(** [fma x y z] returns [x * y + z], with a best effort for computing + this expression with a single rounding, using either hardware + instructions (providing full IEEE compliance) or a software + emulation. *) + +val rem : t -> t -> t +(** [rem a b] returns the remainder of [a] with respect to [b]. The returned + value is [a -. n *. b], where [n] is the quotient [a /. b] rounded towards + zero to an integer. *) + +val succ : t -> t +(** [succ x] returns the floating point number right after [x] i.e., + the smallest floating-point number greater than [x]. See also + {!next_after}. *) + +val pred : t -> t +(** [pred x] returns the floating-point number right before [x] i.e., + the greatest floating-point number smaller than [x]. See also + {!next_after}. *) + +val abs : t -> t +(** [abs f] returns the absolute value of [f]. *) + +val is_finite : t -> bool +(** [is_finite x] is [true] if and only if [x] is finite i.e., not infinite and + not {!nan}. *) + +val is_infinite : t -> bool +(** [is_infinite x] is [true] if and only if [x] is {!infinity} or + {!neg_infinity}. *) + +val is_nan : t -> bool +(** [is_nan x] is [true] if and only if [x] is not a number (see {!nan}). *) + +val is_integer : t -> bool +(** [is_integer x] is [true] if and only if [x] is an integer. *) + +val of_int : int -> t +(** Convert an integer to floating-point. *) + +val to_int : t -> int +(** Truncate the given floating-point number to an integer. + The result is unspecified if the argument is [nan] or falls outside the + range of representable integers. *) + +val of_int64 : int64# -> t +(** Convert the given 64-bit integer to the nearest representable 32-bit float. *) + +val to_int64 : t -> int64# +(** Convert the given 32-bit float to a 64-bit integer, + discarding the fractional part (truncate towards 0). + If the truncated floating-point number is outside the range + \[{!Int64.min_int}, {!Int64.max_int}\], no exception is raised, and + an unspecified, platform-dependent integer is returned. *) + +val of_float : float# -> t +(** Convert a 64-bit float to the nearest 32-bit float. *) + +val to_float : t -> float# +(** Convert a 32-bit float to a 64-bit float. *) + +val of_bits : int32# -> t +(** Convert a 32-bit float to a 32-bit integer, preserving the value's + bit pattern. *) + +val to_bits : t -> int32# +(** Convert a 32-bit integer to a 32-bit float, preserving the value's + bit pattern. *) + +val of_string : string -> t +(** Convert the given string to a float. The string is read in decimal + (by default) or in hexadecimal (marked by [0x] or [0X]). + The format of decimal floating-point numbers is + [ [-] dd.ddd (e|E) [+|-] dd ], where [d] stands for a decimal digit. + The format of hexadecimal floating-point numbers is + [ [-] 0(x|X) hh.hhh (p|P) [+|-] dd ], where [h] stands for an + hexadecimal digit and [d] for a decimal digit. + In both cases, at least one of the integer and fractional parts must be + given; the exponent part is optional. + The [_] (underscore) character can appear anywhere in the string + and is ignored. + Depending on the execution platforms, other representations of + floating-point numbers can be accepted, but should not be relied upon. + @raise Failure if the given string is not a valid + representation of a float. *) + +(* CR layouts v5: Add [of_string_opt] when we allow float32s in structures. *) + +val to_string : t -> string +(** Return a string representation of a floating-point number. + + This conversion can involve a loss of precision. For greater control over + the manner in which the number is printed, see {!Printf}. + + This function is an alias for {!Stdlib.string_of_float}. *) + +type fpclass = Stdlib.fpclass = + FP_normal (** Normal number, none of the below *) + | FP_subnormal (** Number very close to 0.0s, has reduced precision *) + | FP_zero (** Number is 0.0s or -0.0s *) + | FP_infinite (** Number is positive or negative infinity *) + | FP_nan (** Not a number: result of an undefined operation *) +(** The five classes of floating-point numbers, as determined by + the {!classify_float} function. *) + +val classify_float : t -> fpclass +(** Return the class of the given floating-point number: + normal, subnormal, zero, infinite, or not a number. *) + +val sqrt : t -> t +(** Square root. *) + +val cbrt : t -> t +(** Cube root. *) + +val exp : t -> t +(** Exponential. *) + +val exp2 : t -> t +(** Base 2 exponential function. *) + +val log : t -> t +(** Natural logarithm. *) + +val log10 : t -> t +(** Base 10 logarithm. *) + +val log2 : t -> t +(** Base 2 logarithm. *) + +val expm1 : t -> t +(** [expm1 x] computes [exp x -. #1.0s], giving numerically-accurate results + even if [x] is close to [#0.0s]. *) + +val log1p : t -> t +(** [log1p x] computes [log(#1.0s +. x)] (natural logarithm), + giving numerically-accurate results even if [x] is close to [#0.0s]. *) + +val cos : t -> t +(** Cosine. Argument is in radians. *) + +val sin : t -> t +(** Sine. Argument is in radians. *) + +val tan : t -> t +(** Tangent. Argument is in radians. *) + +val acos : t -> t +(** Arc cosine. The argument must fall within the range [[-1.0s, 1.0s]]. + Result is in radians and is between [0.0s] and [pi]. *) + +val asin : t -> t +(** Arc sine. The argument must fall within the range [[-1.0s, 1.0s]]. + Result is in radians and is between [-pi/2] and [pi/2]. *) + +val atan : t -> t +(** Arc tangent. + Result is in radians and is between [-pi/2] and [pi/2]. *) + +val atan2 : t -> t -> t +(** [atan2 y x] returns the arc tangent of [y /. x]. The signs of [x] + and [y] are used to determine the quadrant of the result. + Result is in radians and is between [-pi] and [pi]. *) + +val hypot : t -> t -> t +(** [hypot x y] returns [sqrt(x *. x + y *. y)], that is, the length + of the hypotenuse of a right-angled triangle with sides of length + [x] and [y], or, equivalently, the distance of the point [(x,y)] + to origin. If one of [x] or [y] is infinite, returns [infinity] + even if the other is [nan]. *) + +val cosh : t -> t +(** Hyperbolic cosine. Argument is in radians. *) + +val sinh : t -> t +(** Hyperbolic sine. Argument is in radians. *) + +val tanh : t -> t +(** Hyperbolic tangent. Argument is in radians. *) + +val acosh : t -> t +(** Hyperbolic arc cosine. The argument must fall within the range + [[1.0s, inf]]. + Result is in radians and is between [0.0s] and [inf]. *) + +val asinh : t -> t +(** Hyperbolic arc sine. The argument and result range over the entire + real line. + Result is in radians. *) + +val atanh : t -> t +(** Hyperbolic arc tangent. The argument must fall within the range + [[-1.0s, 1.0s]]. + Result is in radians and ranges over the entire real line. *) + +val erf : t -> t +(** Error function. The argument ranges over the entire real line. + The result is always within [[-1.0s, 1.0s]]. *) + +val erfc : t -> t +(** Complementary error function ([erfc x = 1 - erf x]). + The argument ranges over the entire real line. + The result is always within [[-1.0s, 1.0s]]. *) + +val trunc : t -> t +(** [trunc x] rounds [x] to the nearest integer whose absolute value is + less than or equal to [x]. *) + +val round : t -> t +(** [round x] rounds [x] to the nearest integer with ties (fractional + values of 0.5) rounded away from zero, regardless of the current + rounding direction. If [x] is an integer, [#+0.s], [#-0.s], [nan], or + infinite, [x] itself is returned. + + On 64-bit mingw-w64, this function may be emulated owing to a bug in the + C runtime library (CRT) on this platform. *) + +val ceil : t -> t +(** Round above to an integer value. + [ceil f] returns the least integer value greater than or equal to [f]. + The result is returned as a float. *) + +val floor : t -> t +(** Round below to an integer value. + [floor f] returns the greatest integer value less than or + equal to [f]. + The result is returned as a float. *) + +val next_after : t -> t -> t +(** [next_after x y] returns the next representable floating-point + value following [x] in the direction of [y]. More precisely, if + [y] is greater (resp. less) than [x], it returns the smallest + (resp. largest) representable number greater (resp. less) than [x]. + If [x] equals [y], the function returns [y]. If [x] or [y] is + [nan], a [nan] is returned. + Note that [next_after max_float infinity = infinity] and that + [next_after #0. infinity] is the smallest denormalized positive number. + If [x] is the smallest denormalized positive number, + [next_after x #0. = #0.] *) + +val copy_sign : t -> t -> t +(** [copy_sign x y] returns a float whose absolute value is that of [x] + and whose sign is that of [y]. If [x] is [nan], returns [nan]. + If [y] is [nan], returns either [x] or [-. x], but it is not + specified which. *) + +val sign_bit : t -> bool +(** [sign_bit x] is [true] if and only if the sign bit of [x] is set. + For example [sign_bit #1.] and [signbit #0.] are [false] while + [sign_bit #-1.] and [sign_bit #-0.] are [true]. *) + +(* CR layouts v5: add back [frexp], [modf], [min_max] and [min_max_num] when we + have float32s in structures. *) + +val ldexp : t -> int -> t +(** [ldexp x n] returns [x *. #2 ** n]. *) + +val compare: t -> t -> int +(** [compare x y] returns [0] if [x] is equal to [y], a negative integer if [x] + is less than [y], and a positive integer if [x] is greater than + [y]. [compare] treats [nan] as equal to itself and less than any other float + value. This treatment of [nan] ensures that [compare] defines a total + ordering relation. *) + +val equal: t -> t -> bool +(** The equal function for floating-point numbers, compared using {!compare}. *) + +val min : t -> t -> t +(** [min x y] returns the minimum of [x] and [y]. It returns [nan] + when [x] or [y] is [nan]. Moreover [min #-0.s #+0.s = #-0.s] *) + +val max : t -> t -> t +(** [max x y] returns the maximum of [x] and [y]. It returns [nan] + when [x] or [y] is [nan]. Moreover [max #-0.s #+0.s = #+0.s] *) + +module With_weird_nan_behavior : sig + val min : t -> t -> t + (** [min x y] returns the minimum of [x] and [y]. + If either [x] or [y] is [nan], [y] is returned. + If both [x] and [y] equal zero, [y] is returned. + The amd64 flambda-backend compiler translates this call to MINSS. *) + + val max : t -> t -> t + (** [max x y] returns the maximum of [x] and [y]. + If either [x] or [y] is [nan], [y] is returned. + If both [x] and [y] equal zero, [y] is returned. + The amd64 flambda-backend compiler translates this call to MAXSS. *) +end + +val min_num : t -> t -> t +(** [min_num x y] returns the minimum of [x] and [y] treating [nan] as + missing values. If both [x] and [y] are [nan], [nan] is returned. + Moreover [min_num #-0.s #+0.s = #-0.s] *) + +val max_num : t -> t -> t +(** [max_num x y] returns the maximum of [x] and [y] treating [nan] as + missing values. If both [x] and [y] are [nan] [nan] is returned. + Moreover [max_num #-0.s #+0.s = #+0.s] *) + +val iround_half_to_even : t -> int64# +(** Rounds a [float32#] to an [int64#] using the current rounding mode. The default + rounding mode is "round half to even", and we expect that no program will + change the rounding mode. + If the argument is NaN or infinite or if the rounded value cannot be + represented, then the result is unspecified. + The amd64 flambda-backend compiler translates this call to CVTSS2SI. *) + +val round_half_to_even : t -> t +(** Rounds a [float32#] to an integer [float32#] using the current rounding + mode. The default rounding mode is "round half to even", and we + expect that no program will change the rounding mode. + The amd64 flambda-backend compiler translates this call to ROUNDSS. *) + +val round_down : t -> t +(** Rounds a [float32#] down to the next integer [float32#] toward negative infinity. + The amd64 flambda-backend compiler translates this call to ROUNDSS.*) + +val round_up : t -> t +(** Rounds a [float32#] up to the next integer [float32#] toward positive infinity. + The amd64 flambda-backend compiler translates this call to ROUNDSS.*) + +val round_towards_zero : t -> t +(** Rounds a [float32#] to the next integer [float32#] toward zero. + The amd64 flambda-backend compiler translates this call to ROUNDSS.*) + +(* CR layouts v5: add back hash when we deal with the ad-hoc polymorphic + functions. *) + +module Bytes : sig + val get : bytes -> pos:int -> float32# + (** [get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + val unsafe_get : bytes -> pos:int -> float32# + (** [unsafe_get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) + + val set : bytes -> pos:int -> float32# -> unit + (** [set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + val unsafe_set : bytes -> pos:int -> float32# -> unit + (** [unsafe_set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) +end + +module String : sig + val get : string -> pos:int -> float32# + (** [get s ~pos] loads a float32 from [s] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length s - 4]. *) + + val unsafe_get : string -> pos:int -> float32# + (** [unsafe_get s ~pos] loads a float32 from [s] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) +end + +module Bigstring : sig + open Bigarray + + type t = (char, int8_unsigned_elt, c_layout) Array1.t + + external get : t -> pos:int -> float32# = "%caml_bigstring_getf32#" + (** [get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + external unsafe_get : t -> pos:int -> float32# = "%caml_bigstring_getf32u#" + (** [unsafe_get b ~pos] loads a float32 from [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) + + external set : t -> pos:int -> float32# -> unit = "%caml_bigstring_setf32#" + (** [set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + + @raise Invalid_argument + if [pos] is outside the range 0 to [length b - 4]. *) + + external unsafe_set : t -> pos:int -> float32# -> unit = "%caml_bigstring_setf32u#" + (** [unsafe_set b ~pos f] stores a float32 to [b] at an offset of [pos] bytes. + Does not check that [pos] is a valid offset. *) +end + +module Bigarray : sig + open Bigarray + + module Array1 : sig + val get : ('a, float32_elt, 'c) Array1.t -> int -> float32# + (** [Array1.get a x], or alternatively [a.{x}], + returns the element of [a] at index [x]. + [x] must be greater or equal than [0] and strictly less than + [Array1.dim a] if [a] has C layout. If [a] has Fortran layout, + [x] must be greater or equal than [1] and less or equal than + [Array1.dim a]. Otherwise, [Invalid_argument] is raised. *) + + val set : ('a, float32_elt, 'c) Array1.t -> int -> float32# -> unit + (** [Array1.set a x v], also written [a.{x} <- v], + stores the value [v] at index [x] in [a]. + [x] must be inside the bounds of [a] as described in + {!Bigarray.Array1.get}; + otherwise, [Invalid_argument] is raised. *) + + val unsafe_get : ('a, float32_elt, 'c) Array1.t -> int -> float32# + (** Like {!Bigarray.Array1.get}, but bounds checking is not always performed. + Use with caution and only when the program logic guarantees that + the access is within bounds. *) + + val unsafe_set : + ('a, float32_elt, 'c) Array1.t -> int -> float32# -> unit + (** Like {!Bigarray.Array1.set}, but bounds checking is not always performed. + Use with caution and only when the program logic guarantees that + the access is within bounds. *) + end + + module Array2 : sig + val get : ('a, float32_elt, 'c) Array2.t -> int -> int -> float32# + (** [Array2.get a x y], also written [a.{x,y}], + returns the element of [a] at coordinates ([x], [y]). + [x] and [y] must be within the bounds + of [a], as described for {!Bigarray.Genarray.get}; + otherwise, [Invalid_argument] is raised. *) + + val set : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32# -> unit + (** [Array2.set a x y v], or alternatively [a.{x,y} <- v], + stores the value [v] at coordinates ([x], [y]) in [a]. + [x] and [y] must be within the bounds of [a], + as described for {!Bigarray.Genarray.set}; + otherwise, [Invalid_argument] is raised. *) + + val unsafe_get : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32# + (** Like {!Bigarray.Array2.get}, but bounds checking is not always + performed. *) + + val unsafe_set : + ('a, float32_elt, 'c) Array2.t -> int -> int -> float32# -> unit + (** Like {!Bigarray.Array2.set}, but bounds checking is not always + performed. *) + end + + module Array3 : sig + val get : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32# + (** [Array3.get a x y z], also written [a.{x,y,z}], + returns the element of [a] at coordinates ([x], [y], [z]). + [x], [y] and [z] must be within the bounds of [a], + as described for {!Bigarray.Genarray.get}; + otherwise, [Invalid_argument] is raised. *) + + val set : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32# -> unit + (** [Array3.set a x y v], or alternatively [a.{x,y,z} <- v], + stores the value [v] at coordinates ([x], [y], [z]) in [a]. + [x], [y] and [z] must be within the bounds of [a], + as described for {!Bigarray.Genarray.set}; + otherwise, [Invalid_argument] is raised. *) + + val unsafe_get : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32# + (** Like {!Bigarray.Array3.get}, but bounds checking is not always + performed. *) + + val unsafe_set : + ('a, float32_elt, 'c) Array3.t -> int -> int -> int -> float32# -> unit + (** Like {!Bigarray.Array3.set}, but bounds checking is not always + performed. *) + end +end \ No newline at end of file diff --git a/stdlib/iarray.ml b/otherlibs/stdlib_stable/iarray.ml similarity index 100% rename from stdlib/iarray.ml rename to otherlibs/stdlib_stable/iarray.ml diff --git a/stdlib/iarray.mli b/otherlibs/stdlib_stable/iarray.mli similarity index 100% rename from stdlib/iarray.mli rename to otherlibs/stdlib_stable/iarray.mli diff --git a/stdlib/iarrayLabels.ml b/otherlibs/stdlib_stable/iarrayLabels.ml similarity index 100% rename from stdlib/iarrayLabels.ml rename to otherlibs/stdlib_stable/iarrayLabels.ml diff --git a/stdlib/iarrayLabels.mli b/otherlibs/stdlib_stable/iarrayLabels.mli similarity index 100% rename from stdlib/iarrayLabels.mli rename to otherlibs/stdlib_stable/iarrayLabels.mli diff --git a/otherlibs/stdlib_stable/stdlib_stable.ml b/otherlibs/stdlib_stable/stdlib_stable.ml new file mode 100644 index 00000000000..7b2cc7c50ab --- /dev/null +++ b/otherlibs/stdlib_stable/stdlib_stable.ml @@ -0,0 +1,4 @@ +module Iarray = Iarray +module IarrayLabels = IarrayLabels +module Float32 = Float32 +module Float32_u = Float32_u diff --git a/otherlibs/stdlib_stable/stdlib_stable.mli b/otherlibs/stdlib_stable/stdlib_stable.mli new file mode 100644 index 00000000000..7b2cc7c50ab --- /dev/null +++ b/otherlibs/stdlib_stable/stdlib_stable.mli @@ -0,0 +1,4 @@ +module Iarray = Iarray +module IarrayLabels = IarrayLabels +module Float32 = Float32 +module Float32_u = Float32_u diff --git a/otherlibs/stdlib_upstream_compatible/.ocamlformat-enable b/otherlibs/stdlib_upstream_compatible/.ocamlformat-enable new file mode 100644 index 00000000000..25173a0e5bf --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/.ocamlformat-enable @@ -0,0 +1,2 @@ +stdlib_upstream_compatible.mli +stdlib_upstream_compatible.ml diff --git a/otherlibs/stdlib_upstream_compatible/dune b/otherlibs/stdlib_upstream_compatible/dune new file mode 100644 index 00000000000..a4170736ec7 --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/dune @@ -0,0 +1,40 @@ +;************************************************************************** +;* * +;* OCaml * +;* * +;* Diana Kalinichenko, Jane Street, New York * +;* * +;* Copyright 2024 Jane Street Group LLC * +;* * +;* 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. * +;* * +;************************************************************************** + +(library + (name stdlib_upstream_compatible) + (public_name ocaml.stdlib_upstream_compatible) + (modes byte native) + (flags + (:standard + -strict-sequence + -absname + -bin-annot + -safe-string + -strict-formats + -extension-universe + upstream_compatible)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (library_flags + (:standard -linkall))) + +(rule + (deps + (:first-dep ../to_install.sh) + (source_tree .)) + (action + (with-stdout-to + to_install.sexp + (run "%{first-dep}" "stdlib_upstream_compatible")))) diff --git a/stdlib/float_u.ml b/otherlibs/stdlib_upstream_compatible/float_u.ml similarity index 92% rename from stdlib/float_u.ml rename to otherlibs/stdlib_upstream_compatible/float_u.ml index 34ddc178547..a7048b151f5 100644 --- a/stdlib/float_u.ml +++ b/otherlibs/stdlib_upstream_compatible/float_u.ml @@ -1,13 +1,11 @@ -# 1 "float_u.ml" +# 2 "float_u.ml" (**************************************************************************) (* *) (* OCaml *) (* *) -(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) -(* Nicolas Ojeda Bar, LexiFi *) +(* Chris Casinghino, Jane Street, New York *) (* *) -(* Copyright 2018 Institut National de Recherche en Informatique et *) -(* en Automatique. *) +(* Copyright 2023 Jane Street Group LLC *) (* *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Lesser General Public License version 2.1, with the *) @@ -19,10 +17,11 @@ open! Stdlib [@@@ocaml.flambda_o3] +type t = float# -external to_float : float# -> (float[@local_opt]) = "%box_float" +external to_float : t -> (float[@local_opt]) = "%box_float" [@@warning "-187"] -external of_float : (float[@local_opt]) -> float# = "%unbox_float" +external of_float : (float[@local_opt]) -> t = "%unbox_float" [@@warning "-187"] (* CR layouts: Investigate whether it's worth making these things externals. Are there situations where the middle-end won't inline them and remove the @@ -141,8 +140,6 @@ let[@inline always] sign_bit x = Float.sign_bit (to_float x) let[@inline always] ldexp x i = of_float (Float.ldexp (to_float x) i) -type t = float# - let[@inline always] compare x y = Float.compare (to_float x) (to_float y) let[@inline always] equal x y = Float.equal (to_float x) (to_float y) diff --git a/stdlib/float_u.mli b/otherlibs/stdlib_upstream_compatible/float_u.mli similarity index 79% rename from stdlib/float_u.mli rename to otherlibs/stdlib_upstream_compatible/float_u.mli index 6eaf8f74d6f..02d5fc13677 100644 --- a/stdlib/float_u.mli +++ b/otherlibs/stdlib_upstream_compatible/float_u.mli @@ -1,13 +1,15 @@ -# 1 "float_u.mli" +# 2 "float_u.mli" (**************************************************************************) (* *) (* OCaml *) (* *) (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* Nicolas Ojeda Bar, LexiFi *) +(* Chris Casinghino, Jane Street, New York *) (* *) (* Copyright 2018 Institut National de Recherche en Informatique et *) (* en Automatique. *) +(* Copyright 2023 Jane Street Group LLC *) (* *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Lesser General Public License version 2.1, with the *) @@ -34,43 +36,46 @@ open! Stdlib IEEE 754 standard, using double precision (64 bits) numbers. Floating-point operations never raise an exception on overflow, underflow, division by zero, etc. Instead, special IEEE numbers - are returned as appropriate, such as [infinity] for [1.0 /. 0.0], - [neg_infinity] for [-1.0 /. 0.0], and [nan] ('not a number') - for [0.0 /. 0.0]. These special numbers then propagate through + are returned as appropriate, such as [infinity] for [#1.0 /. #0.0], + [neg_infinity] for [#-1.0 /. #0.0], and [nan] ('not a number') + for [#0.0 /. #0.0]. These special numbers then propagate through floating-point computations as expected: for instance, - [1.0 /. infinity] is [0.0], basic arithmetic operations + [#1.0 /. infinity] is [#0.0], basic arithmetic operations ([+.], [-.], [*.], [/.]) with [nan] as an argument return [nan], ... *) +type t = float# +(** An alias for the type of unboxed floating-point numbers. *) + (* CR layouts v5: add back all the constants in this module (e.g., [zero] and [infinity]) when we we support [float64]s in structures. *) (* Unboxed-specific stuff at the top. *) -external to_float : float# -> (float[@local_opt]) = "%box_float" +external to_float : t -> (float[@local_opt]) = "%box_float" [@@warning "-187"] (** Box a [float#] *) -external of_float : (float[@local_opt]) -> float# = "%unbox_float" +external of_float : (float[@local_opt]) -> t = "%unbox_float" [@@warning "-187"] (** Unbox a boxed [float] *) (* Below here, everything also appears in [Float], though most things are externals in that module. *) -val neg : float# -> float# +val neg : t -> t (** Unary negation. *) -val add : float# -> float# -> float# +val add : t -> t -> t (** Floating-point addition. *) -val sub : float# -> float# -> float# +val sub : t -> t -> t (** Floating-point subtraction. *) -val mul : float# -> float# -> float# +val mul : t -> t -> t (** Floating-point multiplication. *) -val div : float# -> float# -> float# +val div : t -> t -> t (** Floating-point division. *) -val fma : float# -> float# -> float# -> float# +val fma : t -> t -> t -> t (** [fma x y z] returns [x * y + z], with a best effort for computing this expression with a single rounding, using either hardware instructions (providing full IEEE compliance) or a software @@ -81,49 +86,49 @@ val fma : float# -> float# -> float# -> float# Note: since software emulation of the fma is costly, make sure that you are using hardware fma support if performance matters. *) -val rem : float# -> float# -> float# +val rem : t -> t -> t (** [rem a b] returns the remainder of [a] with respect to [b]. The returned value is [a -. n *. b], where [n] is the quotient [a /. b] rounded towards zero to an integer. *) -val succ : float# -> float# +val succ : t -> t (** [succ x] returns the floating point number right after [x] i.e., the smallest floating-point number greater than [x]. See also {!next_after}. *) -val pred : float# -> float# +val pred : t -> t (** [pred x] returns the floating-point number right before [x] i.e., the greatest floating-point number smaller than [x]. See also {!next_after}. *) -val abs : float# -> float# +val abs : t -> t (** [abs f] returns the absolute value of [f]. *) -val is_finite : float# -> bool +val is_finite : t -> bool (** [is_finite x] is [true] if and only if [x] is finite i.e., not infinite and not {!nan}. *) -val is_infinite : float# -> bool +val is_infinite : t -> bool (** [is_infinite x] is [true] if and only if [x] is {!infinity} or {!neg_infinity}. *) -val is_nan : float# -> bool +val is_nan : t -> bool (** [is_nan x] is [true] if and only if [x] is not a number (see {!nan}). *) -val is_integer : float# -> bool +val is_integer : t -> bool (** [is_integer x] is [true] if and only if [x] is an integer. *) -val of_int : int -> float# +val of_int : int -> t (** Convert an integer to floating-point. *) -val to_int : float# -> int +val to_int : t -> int (** Truncate the given floating-point number to an integer. The result is unspecified if the argument is [nan] or falls outside the range of representable integers. *) -val of_string : string -> float# +val of_string : string -> t (** Convert the given string to a float. The string is read in decimal (by default) or in hexadecimal (marked by [0x] or [0X]). The format of decimal floating-point numbers is @@ -142,7 +147,7 @@ val of_string : string -> float# (* CR layouts v5: Add [of_string_opt] when we allow float64s in structures. *) -val to_string : float# -> string +val to_string : t -> string (** Return a string representation of a floating-point number. This conversion can involve a loss of precision. For greater control over @@ -159,133 +164,133 @@ type fpclass = Stdlib.fpclass = (** The five classes of floating-point numbers, as determined by the {!classify_float} function. *) -val classify_float : float# -> fpclass +val classify_float : t -> fpclass (** Return the class of the given floating-point number: normal, subnormal, zero, infinite, or not a number. *) -val pow : float# -> float# -> float# +val pow : t -> t -> t (** Exponentiation. *) -val sqrt : float# -> float# +val sqrt : t -> t (** Square root. *) -val cbrt : float# -> float# +val cbrt : t -> t (** Cube root. *) -val exp : float# -> float# +val exp : t -> t (** Exponential. *) -val exp2 : float# -> float# +val exp2 : t -> t (** Base 2 exponential function. *) -val log : float# -> float# +val log : t -> t (** Natural logarithm. *) -val log10 : float# -> float# +val log10 : t -> t (** Base 10 logarithm. *) -val log2 : float# -> float# +val log2 : t -> t (** Base 2 logarithm. *) -val expm1 : float# -> float# -(** [expm1 x] computes [exp x -. 1.0], giving numerically-accurate results - even if [x] is close to [0.0]. *) +val expm1 : t -> t +(** [expm1 x] computes [exp x -. #1.0], giving numerically-accurate results + even if [x] is close to [#0.0]. *) -val log1p : float# -> float# -(** [log1p x] computes [log(1.0 +. x)] (natural logarithm), - giving numerically-accurate results even if [x] is close to [0.0]. *) +val log1p : t -> t +(** [log1p x] computes [log(#1.0 +. x)] (natural logarithm), + giving numerically-accurate results even if [x] is close to [#0.0]. *) -val cos : float# -> float# +val cos : t -> t (** Cosine. Argument is in radians. *) -val sin : float# -> float# +val sin : t -> t (** Sine. Argument is in radians. *) -val tan : float# -> float# +val tan : t -> t (** Tangent. Argument is in radians. *) -val acos : float# -> float# +val acos : t -> t (** Arc cosine. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and is between [0.0] and [pi]. *) -val asin : float# -> float# +val asin : t -> t (** Arc sine. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and is between [-pi/2] and [pi/2]. *) -val atan : float# -> float# +val atan : t -> t (** Arc tangent. Result is in radians and is between [-pi/2] and [pi/2]. *) -val atan2 : float# -> float# -> float# +val atan2 : t -> t -> t (** [atan2 y x] returns the arc tangent of [y /. x]. The signs of [x] and [y] are used to determine the quadrant of the result. Result is in radians and is between [-pi] and [pi]. *) -val hypot : float# -> float# -> float# +val hypot : t -> t -> t (** [hypot x y] returns [sqrt(x *. x + y *. y)], that is, the length of the hypotenuse of a right-angled triangle with sides of length [x] and [y], or, equivalently, the distance of the point [(x,y)] to origin. If one of [x] or [y] is infinite, returns [infinity] even if the other is [nan]. *) -val cosh : float# -> float# +val cosh : t -> t (** Hyperbolic cosine. Argument is in radians. *) -val sinh : float# -> float# +val sinh : t -> t (** Hyperbolic sine. Argument is in radians. *) -val tanh : float# -> float# +val tanh : t -> t (** Hyperbolic tangent. Argument is in radians. *) -val acosh : float# -> float# +val acosh : t -> t (** Hyperbolic arc cosine. The argument must fall within the range [[1.0, inf]]. Result is in radians and is between [0.0] and [inf]. *) -val asinh : float# -> float# +val asinh : t -> t (** Hyperbolic arc sine. The argument and result range over the entire real line. Result is in radians. *) -val atanh : float# -> float# +val atanh : t -> t (** Hyperbolic arc tangent. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and ranges over the entire real line. *) -val erf : float# -> float# +val erf : t -> t (** Error function. The argument ranges over the entire real line. The result is always within [[-1.0, 1.0]]. *) -val erfc : float# -> float# +val erfc : t -> t (** Complementary error function ([erfc x = 1 - erf x]). The argument ranges over the entire real line. The result is always within [[-1.0, 1.0]]. *) -val trunc : float# -> float# +val trunc : t -> t (** [trunc x] rounds [x] to the nearest integer whose absolute value is less than or equal to [x]. *) -val round : float# -> float# +val round : t -> t (** [round x] rounds [x] to the nearest integer with ties (fractional values of 0.5) rounded away from zero, regardless of the current - rounding direction. If [x] is an integer, [+0.], [-0.], [nan], or + rounding direction. If [x] is an integer, [#+0.], [#-0.], [nan], or infinite, [x] itself is returned. On 64-bit mingw-w64, this function may be emulated owing to a bug in the C runtime library (CRT) on this platform. *) -val ceil : float# -> float# +val ceil : t -> t (** Round above to an integer value. [ceil f] returns the least integer value greater than or equal to [f]. The result is returned as a float. *) -val floor : float# -> float# +val floor : t -> t (** Round below to an integer value. [floor f] returns the greatest integer value less than or equal to [f]. The result is returned as a float. *) -val next_after : float# -> float# -> float# +val next_after : t -> t -> t (** [next_after x y] returns the next representable floating-point value following [x] in the direction of [y]. More precisely, if [y] is greater (resp. less) than [x], it returns the smallest @@ -293,29 +298,26 @@ val next_after : float# -> float# -> float# If [x] equals [y], the function returns [y]. If [x] or [y] is [nan], a [nan] is returned. Note that [next_after max_float infinity = infinity] and that - [next_after 0. infinity] is the smallest denormalized positive number. + [next_after #0. infinity] is the smallest denormalized positive number. If [x] is the smallest denormalized positive number, - [next_after x 0. = 0.] *) + [next_after x #0. = #0.] *) -val copy_sign : float# -> float# -> float# +val copy_sign : t -> t -> t (** [copy_sign x y] returns a float whose absolute value is that of [x] and whose sign is that of [y]. If [x] is [nan], returns [nan]. If [y] is [nan], returns either [x] or [-. x], but it is not specified which. *) -val sign_bit : float# -> bool +val sign_bit : t -> bool (** [sign_bit x] is [true] if and only if the sign bit of [x] is set. - For example [sign_bit 1.] and [signbit 0.] are [false] while - [sign_bit (-1.)] and [sign_bit (-0.)] are [true]. *) + For example [sign_bit #1.] and [signbit #0.] are [false] while + [sign_bit #-1.] and [sign_bit #-0.] are [true]. *) (* CR layouts v5: add back [frexp], [modf], [min_max] and [min_max_num] when we have floats in structures. *) -val ldexp : float# -> int -> float# -(** [ldexp x n] returns [x *. 2 ** n]. *) - -type t = float# -(** An alias for the type of floating-point numbers. *) +val ldexp : t -> int -> t +(** [ldexp x n] returns [x *. #2 ** n]. *) val compare: t -> t -> int (** [compare x y] returns [0] if [x] is equal to [y], a negative integer if [x] @@ -329,21 +331,21 @@ val equal: t -> t -> bool val min : t -> t -> t (** [min x y] returns the minimum of [x] and [y]. It returns [nan] - when [x] or [y] is [nan]. Moreover [min (-0.) (+0.) = -0.] *) + when [x] or [y] is [nan]. Moreover [min #-0. #+0. = #-0.] *) -val max : float# -> float# -> float# +val max : t -> t -> t (** [max x y] returns the maximum of [x] and [y]. It returns [nan] - when [x] or [y] is [nan]. Moreover [max (-0.) (+0.) = +0.] *) + when [x] or [y] is [nan]. Moreover [max #-0. #+0. = #+0.] *) val min_num : t -> t -> t (** [min_num x y] returns the minimum of [x] and [y] treating [nan] as missing values. If both [x] and [y] are [nan], [nan] is returned. - Moreover [min_num (-0.) (+0.) = -0.] *) + Moreover [min_num #-0. #+0. = #-0.] *) val max_num : t -> t -> t (** [max_num x y] returns the maximum of [x] and [y] treating [nan] as missing values. If both [x] and [y] are [nan] [nan] is returned. - Moreover [max_num (-0.) (+0.) = +0.] *) + Moreover [max_num #-0. #+0. = #+0.] *) (* CR layouts v5: add back hash when we deal with the ad-hoc polymorphic functions. *) diff --git a/otherlibs/stdlib_upstream_compatible/int32_u.ml b/otherlibs/stdlib_upstream_compatible/int32_u.ml new file mode 100644 index 00000000000..c73f428d8ad --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/int32_u.ml @@ -0,0 +1,100 @@ +# 2 "int32_u.ml" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +[@@@ocaml.flambda_o3] + +type t = int32# + +external to_int32 : t -> (int32[@local_opt]) = "%box_int32" [@@warning "-187"] + +external of_int32 : (int32[@local_opt]) -> t = "%unbox_int32" [@@warning "-187"] + +let[@inline always] neg x = of_int32 (Int32.neg (to_int32 x)) + +let[@inline always] add x y = of_int32 (Int32.add (to_int32 x) (to_int32 y)) + +let[@inline always] sub x y = of_int32 (Int32.sub (to_int32 x) (to_int32 y)) + +let[@inline always] mul x y = of_int32 (Int32.mul (to_int32 x) (to_int32 y)) + +let[@inline always] div x y = of_int32 (Int32.div (to_int32 x) (to_int32 y)) + +let[@inline always] unsigned_div x y = + of_int32 ((Int32.unsigned_div[@inlined]) (to_int32 x) (to_int32 y)) + +let[@inline always] rem x y = of_int32 (Int32.rem (to_int32 x) (to_int32 y)) + +let[@inline always] unsigned_rem x y = + of_int32 ((Int32.unsigned_rem[@inlined]) (to_int32 x) (to_int32 y)) + +let[@inline always] succ x = of_int32 ((Int32.succ[@inlined]) (to_int32 x)) + +let[@inline always] pred x = of_int32 ((Int32.pred[@inlined]) (to_int32 x)) + +let[@inline always] abs x = of_int32 ((Int32.abs[@inlined]) (to_int32 x)) + +let[@inline always] logand x y = + of_int32 (Int32.logand (to_int32 x) (to_int32 y)) + +let[@inline always] logor x y = of_int32 (Int32.logor (to_int32 x) (to_int32 y)) + +let[@inline always] logxor x y = + of_int32 (Int32.logxor (to_int32 x) (to_int32 y)) + +let[@inline always] lognot x = of_int32 ((Int32.lognot[@inlined]) (to_int32 x)) + +let[@inline always] shift_left x y = of_int32 (Int32.shift_left (to_int32 x) y) + +let[@inline always] shift_right x y = + of_int32 (Int32.shift_right (to_int32 x) y) + +let[@inline always] shift_right_logical x y = + of_int32 (Int32.shift_right_logical (to_int32 x) y) + +let[@inline always] of_int x = of_int32 (Int32.of_int x) + +let[@inline always] to_int x = Int32.to_int (to_int32 x) + +let[@inline always] unsigned_to_int x = + (Int32.unsigned_to_int[@inlined]) (to_int32 x) + +let[@inline always] of_float x = of_int32 (Int32.of_float x) + +let[@inline always] to_float x = Int32.to_float (to_int32 x) + +let[@inline always] bits_of_float x = of_int32 (Int32.bits_of_float x) + +let[@inline always] float_of_bits x = Int32.float_of_bits (to_int32 x) + +let[@inline always] of_string x = of_int32 (Int32.of_string x) + +let[@inline always] to_string x = (Int32.to_string[@inlined]) (to_int32 x) + +let[@inline always] compare x y = + (Int32.compare[@inlined]) (to_int32 x) (to_int32 y) + +let[@inline always] unsigned_compare x y = + (Int32.unsigned_compare[@inlined]) (to_int32 x) (to_int32 y) + +let[@inline always] equal x y = + (Int32.equal[@inlined]) (to_int32 x) (to_int32 y) + +let[@inline always] min x y = + of_int32 ((Int32.min[@inlined]) (to_int32 x) (to_int32 y)) + +let[@inline always] max x y = + of_int32 ((Int32.max[@inlined]) (to_int32 x) (to_int32 y)) diff --git a/otherlibs/stdlib_upstream_compatible/int32_u.mli b/otherlibs/stdlib_upstream_compatible/int32_u.mli new file mode 100644 index 00000000000..2d932430c7c --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/int32_u.mli @@ -0,0 +1,231 @@ +# 2 "int32_u.mli" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +(** Unboxed 32-bit integers. This file primarily duplicates + functionality from the [Int32] module, but for [int32#]. + + This module provides operations on the type [int32#] + of unboxed signed 32-bit integers. Unlike the built-in [int] type, + the type [int32#] is guaranteed to be exactly 32-bits wide on all + platforms. All arithmetic operations over [int32#] are wrapping, not + truncating. +*) + +type t = int32# +(** An alias for the type of unboxed 32-bit integers. *) + +(* CR layouts v2.1: add back this comment to the above when we support + literals. + + Literals for unboxed 32-bit integers are prefixed by # and suffixed by l: + {[ + let zero: int32# = #0l + let one: int32# = #1l + let m_one: int32# = #-1l + ]} +*) + +(* Unboxed-specific stuff at the top. *) +external to_int32 : t -> (int32[@local_opt]) = "%box_int32" [@@warning "-187"] +(** Box a [int32#] *) + +external of_int32 : (int32[@local_opt]) -> t = "%unbox_int32" [@@warning "-187"] +(** Unbox a boxed [int32] *) + +(* Below here, everything also appears in [Int32], though most things are + externals in that module. *) + +(* CR layouts v5: add back all the commented-out values in this module when we + support [bits32]s in structures. This includes constants (e.g., [zero] and + [one]) and functions that return things like [int32#] (e.g., + [of_string_opt]). *) + +(* val zero : int32# + * (** The unboxed 32-bit integer 0.*) + * + * val one : int32# + * (** The unboxed 32-bit integer 1.*) + * + * val minus_one : int32# + * (** The unboxed 32-bit integer -1.*) *) + +val neg : t -> t +(** Unary negation. *) + +val add : t -> t -> t +(** Addition. *) + +val sub : t -> t -> t +(** Subtraction. *) + +val mul : t -> t -> t +(** Multiplication. *) + +val div : t -> t -> t +(** Integer division. This division rounds the real quotient of + its arguments towards zero, as specified for {!Stdlib.(/)}. + + @raise Division_by_zero if the second + argument is zero. *) + +val unsigned_div : t -> t -> t +(** Same as {!div}, except that arguments and result are interpreted as {e + unsigned} unboxed 32-bit integers. *) + +val rem : t -> t -> t +(** Integer remainder. If [y] is not zero, the result + of [Int32_u.rem x y] satisfies the following property: + [x = Int32_u.add (Int32_u.mul (Int32_u.div x y) y) (Int32_u.rem x y)]. + If [y = 0], [Int32_u.rem x y] raises [Division_by_zero]. *) + +val unsigned_rem : t -> t -> t +(** Same as {!rem}, except that arguments and result are interpreted as {e + unsigned} unboxed 32-bit integers. *) + +val succ : t -> t +(** Successor. + [Int32_u.succ x] is [Int32_u.add x Int32_u.one]. *) + +val pred : t -> t +(** Predecessor. + [Int32_u.pred x] is [Int32_u.sub x Int32_u.one]. *) + +val abs : t -> t +(** Return the absolute value of its argument. *) + +(* val max_int : int32# + * (** The greatest representable unboxed 32-bit integer, 2{^31} - 1. *) + * + * val min_int : int32# + * (** The smallest representable unboxed 32-bit integer, -2{^31}. *) + *) + +val logand : t -> t -> t +(** Bitwise logical and. *) + +val logor : t -> t -> t +(** Bitwise logical or. *) + +val logxor : t -> t -> t +(** Bitwise logical exclusive or. *) + +val lognot : t -> t +(** Bitwise logical negation. *) + +val shift_left : t -> int -> t +(** [Int32_u.shift_left x y] shifts [x] to the left by [y] bits. + The result is unspecified if [y < 0] or [y >= 32]. *) + +val shift_right : t -> int -> t +(** [Int32_u.shift_right x y] shifts [x] to the right by [y] bits. + This is an arithmetic shift: the sign bit of [x] is replicated + and inserted in the vacated bits. + The result is unspecified if [y < 0] or [y >= 32]. *) + +val shift_right_logical : t -> int -> t +(** [Int32_u.shift_right_logical x y] shifts [x] to the right + by [y] bits. + This is a logical shift: zeroes are inserted in the vacated bits + regardless of the sign of [x]. + The result is unspecified if [y < 0] or [y >= 32]. *) + +val of_int : int -> t +(** Convert the given integer (type [int]) to an unboxed 32-bit integer + (type [int32#]). On 64-bit platforms, the argument is taken + modulo 2{^32}. *) + +val to_int : t -> int +(** Convert the given unboxed 32-bit integer (type [int32#]) to an + integer (type [int]). On 32-bit platforms, the 32-bit integer + is taken modulo 2{^31}, i.e. the high-order bit is lost + during the conversion. On 64-bit platforms, the conversion + is exact. *) + +val unsigned_to_int : t -> int option +(** Same as {!to_int}, but interprets the argument as an {e unsigned} integer. + Returns [None] if the unsigned value of the argument cannot fit into an + [int]. *) + +val of_float : float -> t +(** Convert the given floating-point number to an unboxed 32-bit integer, + discarding the fractional part (truncate towards 0). + If the truncated floating-point number is outside the range + \[{!Int32_u.min_int}, {!Int32_u.max_int}\], no exception is raised, + and an unspecified, platform-dependent integer is returned. *) + +val to_float : t -> float +(** Convert the given unboxed 32-bit integer to a floating-point number. *) + +val of_string : string -> t +(** Convert the given string to an unboxed 32-bit integer. + The string is read in decimal (by default, or if the string + begins with [0u]) or in hexadecimal, octal or binary if the + string begins with [0x], [0o] or [0b] respectively. + + The [0u] prefix reads the input as an unsigned integer in the range + [[0, 2*Int32_u.max_int+1]]. If the input exceeds {!Int32_u.max_int} + it is converted to the signed integer + [Int32.min_int + input - Int32_u.max_int - 1]. + + The [_] (underscore) character can appear anywhere in the string + and is ignored. + @raise Failure if the given string is not + a valid representation of an integer, or if the integer represented + exceeds the range of integers representable in type [int32]. *) + +(* val of_string_opt: string -> t option + * (** Same as [of_string], but return [None] instead of raising. *) *) + +val to_string : t -> string +(** Return the string representation of its argument, in signed decimal. *) + +val bits_of_float : float -> t +(** Return the internal representation of the given float according + to the IEEE 754 floating-point 'single format' bit layout. + Bit 31 of the result represents the sign of the float; + bits 30 to 23 represent the (biased) exponent; bits 22 to 0 + represent the mantissa. *) + +val float_of_bits : t -> float +(** Return the floating-point number whose internal representation, + according to the IEEE 754 floating-point 'single format' bit layout, + is the given [int32#]. *) + +val compare: t -> t -> int +(** The comparison function for unboxed 32-bit integers, with the same + specification as {!Stdlib.compare}. *) +(* CR layouts v2.1: Restore the below comment when we have an appropriate + functor *) +(* Along with the type [t], this function [compare] + allows the module [Int32_u] to be passed as argument to the functors + {!Set.Make} and {!Map.Make}. *) + +val unsigned_compare: t -> t -> int +(** Same as {!compare}, except that arguments are interpreted as {e unsigned} + unboxed 32-bit integers. *) + +val equal: t -> t -> bool +(** The equal function for unboxed 32-bit ints. *) + +val min: t -> t -> t +(** Return the smaller of the two arguments. *) + +val max: t -> t -> t +(** Return the greater of the two arguments. *) diff --git a/otherlibs/stdlib_upstream_compatible/int64_u.ml b/otherlibs/stdlib_upstream_compatible/int64_u.ml new file mode 100644 index 00000000000..6d38e78eb3a --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/int64_u.ml @@ -0,0 +1,114 @@ +# 2 "int64_u.ml" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +[@@@ocaml.flambda_o3] + +type t = int64# + +external to_int64 : t -> (int64[@local_opt]) = "%box_int64" [@@warning "-187"] + +external of_int64 : (int64[@local_opt]) -> t = "%unbox_int64" [@@warning "-187"] + +let[@inline always] neg x = of_int64 (Int64.neg (to_int64 x)) + +let[@inline always] add x y = of_int64 (Int64.add (to_int64 x) (to_int64 y)) + +let[@inline always] sub x y = of_int64 (Int64.sub (to_int64 x) (to_int64 y)) + +let[@inline always] mul x y = of_int64 (Int64.mul (to_int64 x) (to_int64 y)) + +let[@inline always] div x y = of_int64 (Int64.div (to_int64 x) (to_int64 y)) + +let[@inline always] unsigned_div x y = + of_int64 ((Int64.unsigned_div[@inlined]) (to_int64 x) (to_int64 y)) + +let[@inline always] rem x y = of_int64 (Int64.rem (to_int64 x) (to_int64 y)) + +let[@inline always] unsigned_rem x y = + of_int64 ((Int64.unsigned_rem[@inlined]) (to_int64 x) (to_int64 y)) + +let[@inline always] succ x = of_int64 ((Int64.succ[@inlined]) (to_int64 x)) + +let[@inline always] pred x = of_int64 ((Int64.pred[@inlined]) (to_int64 x)) + +let[@inline always] abs x = of_int64 ((Int64.abs[@inlined]) (to_int64 x)) + +let[@inline always] logand x y = + of_int64 (Int64.logand (to_int64 x) (to_int64 y)) + +let[@inline always] logor x y = of_int64 (Int64.logor (to_int64 x) (to_int64 y)) + +let[@inline always] logxor x y = + of_int64 (Int64.logxor (to_int64 x) (to_int64 y)) + +let[@inline always] lognot x = of_int64 ((Int64.lognot[@inlined]) (to_int64 x)) + +let[@inline always] shift_left x y = of_int64 (Int64.shift_left (to_int64 x) y) + +let[@inline always] shift_right x y = + of_int64 (Int64.shift_right (to_int64 x) y) + +let[@inline always] shift_right_logical x y = + of_int64 (Int64.shift_right_logical (to_int64 x) y) + +let[@inline always] of_int x = of_int64 (Int64.of_int x) + +let[@inline always] to_int x = Int64.to_int (to_int64 x) + +let[@inline always] unsigned_to_int x = + (Int64.unsigned_to_int[@inlined]) (to_int64 x) + +let[@inline always] of_float x = of_int64 (Int64.of_float x) + +let[@inline always] to_float x = Int64.to_float (to_int64 x) + +let[@inline always] of_int32 x = of_int64 (Int64.of_int32 x) + +let[@inline always] to_int32 x = Int64.to_int32 (to_int64 x) + +let[@inline always] of_nativeint x = of_int64 (Int64.of_nativeint x) + +let[@inline always] to_nativeint x = Int64.to_nativeint (to_int64 x) + +let[@inline always] of_int32_u x = of_int64 (Int64.of_int32 (Int32_u.to_int32 x)) + +let[@inline always] to_int32_u x = Int32_u.of_int32 (Int64.to_int32 (to_int64 x)) + +let[@inline always] of_nativeint_u x = + of_int64 (Int64.of_nativeint (Nativeint_u.to_nativeint x)) + +let[@inline always] to_nativeint_u x = + Nativeint_u.of_nativeint (Int64.to_nativeint (to_int64 x)) + +let[@inline always] bits_of_float x = of_int64 (Int64.bits_of_float x) + +let[@inline always] float_of_bits x = Int64.float_of_bits (to_int64 x) + +let[@inline always] of_string x = of_int64 (Int64.of_string x) + +let[@inline always] to_string x = (Int64.to_string[@inlined]) (to_int64 x) + +let[@inline always] compare x y = Int64.compare (to_int64 x) (to_int64 y) + +let[@inline always] unsigned_compare x y = + Int64.unsigned_compare (to_int64 x) (to_int64 y) + +let[@inline always] equal x y = Int64.equal (to_int64 x) (to_int64 y) + +let[@inline always] min x y = of_int64 (Int64.min (to_int64 x) (to_int64 y)) + +let[@inline always] max x y = of_int64 (Int64.max (to_int64 x) (to_int64 y)) diff --git a/otherlibs/stdlib_upstream_compatible/int64_u.mli b/otherlibs/stdlib_upstream_compatible/int64_u.mli new file mode 100644 index 00000000000..f0b19b3c0bd --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/int64_u.mli @@ -0,0 +1,271 @@ +# 2 "int64_u.mli" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +(** Unboxed 64-bit integers. This file primarily duplicates + functionality from the [Int64] module, but for [int64#]. + + This module provides operations on the type [int64#] of + unboxed signed 64-bit integers. Unlike the built-in [int] type, + the type [int64#] is guaranteed to be exactly 64-bit wide on all + platforms. All arithmetic operations over [int64#] are wrapping, not + truncating. +*) + +type t = int64# +(** An alias for the type of unboxed 64-bit integers. *) + +(* CR layouts v2.1: add back this comment to the above when we support + literals. + + Literals for unboxed 64-bit integers are prefixed by # and suffixed by L: + {[ + let zero: int64# = #0L + let one: int64# = #1L + let m_one: int64# = #-1L + ]} +*) + +(* Unboxed-specific stuff at the top. *) +external to_int64 : t -> (int64[@local_opt]) = "%box_int64" [@@warning "-187"] +(** Box a [int64#] *) + +external of_int64 : (int64[@local_opt]) -> t = "%unbox_int64" [@@warning "-187"] +(** Unbox a boxed [int64] *) + +(* Below here, everything also appears in [Int64], though most things are + externals in that module. *) + +(* CR layouts v5: add back all the commented-out values in this module when we + support [bits64]s in structures. This includes constants (e.g., [zero] and + [one]) and functions that return things like [int64#] (e.g., + [of_string_opt]). *) + +(* val zero : int64# + * (** The unboxed 64-bit integer 0.*) + * + * val one : int64# + * (** The unboxed 64-bit integer 1.*) + * + * val minus_one : int64# + * (** The unboxed 64-bit integer -1.*) *) + +val neg : t -> t +(** Unary negation. *) + +val add : t -> t -> t +(** Addition. *) + +val sub : t -> t -> t +(** Subtraction. *) + +val mul : t -> t -> t +(** Multiplication. *) + +val div : t -> t -> t +(** Integer division. This division rounds the real quotient of + its arguments towards zero, as specified for {!Stdlib.(/)}. + + @raise Division_by_zero if the second + argument is zero. *) + +val unsigned_div : t -> t -> t +(** Same as {!div}, except that arguments and result are interpreted as {e + unsigned} unboxed 64-bit integers. *) + +val rem : t -> t -> t +(** Integer remainder. If [y] is not zero, the result + of [Int64_u.rem x y] satisfies the following property: + [x = Int64_u.add (Int64_u.mul (Int64_u.div x y) y) (Int64_u.rem x y)]. + If [y = 0], [Int64_u.rem x y] raises [Division_by_zero]. *) + +val unsigned_rem : t -> t -> t +(** Same as {!rem}, except that arguments and result are interpreted as {e + unsigned} unboxed 64-bit integers. *) + +val succ : t -> t +(** Successor. + [Int64_u.succ x] is [Int64_u.add x Int64_u.one]. *) + +val pred : t -> t +(** Predecessor. + [Int64_u.pred x] is [Int64_u.sub x Int64_u.one]. *) + +val abs : t -> t +(** Return the absolute value of its argument. *) + +(* val max_int : int64# + * (** The greatest representable unboxed 64-bit integer, 2{^63} - 1. *) + * + * val min_int : int64# + * (** The smallest representable unboxed 64-bit integer, -2{^63}. *) + *) + +val logand : t -> t -> t +(** Bitwise logical and. *) + +val logor : t -> t -> t +(** Bitwise logical or. *) + +val logxor : t -> t -> t +(** Bitwise logical exclusive or. *) + +val lognot : t -> t +(** Bitwise logical negation. *) + +val shift_left : t -> int -> t +(** [Int64_u.shift_left x y] shifts [x] to the left by [y] bits. + The result is unspecified if [y < 0] or [y >= 64]. *) + +val shift_right : t -> int -> t +(** [Int64_u.shift_right x y] shifts [x] to the right by [y] bits. + This is an arithmetic shift: the sign bit of [x] is replicated + and inserted in the vacated bits. + The result is unspecified if [y < 0] or [y >= 64]. *) + +val shift_right_logical : t -> int -> t +(** [Int64_u.shift_right_logical x y] shifts [x] to the right + by [y] bits. + This is a logical shift: zeroes are inserted in the vacated bits + regardless of the sign of [x]. + The result is unspecified if [y < 0] or [y >= 64]. *) + +val of_int : int -> t +(** Convert the given integer (type [int]) to an unboxed 64-bit integer + (type [int64#]). *) + +val to_int : t -> int +(** Convert the given unboxed 64-bit integer (type [int64#]) to an + integer (type [int]). On 64-bit platforms, the 64-bit integer + is taken modulo 2{^63}, i.e. the high-order bit is lost + during the conversion. On 32-bit platforms, the 64-bit integer + is taken modulo 2{^31}, i.e. the top 33 bits are lost + during the conversion. *) + +val unsigned_to_int : t -> int option +(** Same as {!to_int}, but interprets the argument as an {e unsigned} integer. + Returns [None] if the unsigned value of the argument cannot fit into an + [int]. *) + +val of_float : float -> t +(** Convert the given floating-point number to an unboxed 64-bit integer, + discarding the fractional part (truncate towards 0). + If the truncated floating-point number is outside the range + \[{!Int64_u.min_int}, {!Int64_u.max_int}\], no exception is raised, + and an unspecified, platform-dependent integer is returned. *) + +val to_float : t -> float +(** Convert the given unboxed 64-bit integer to a floating-point number. *) + +val of_int32 : int32 -> t +(** Convert the given 32-bit integer (type [int32]) + to an unboxed 64-bit integer (type [int64]). *) + +val to_int32 : t -> int32 +(** Convert the given unboxed 64-bit integer (type [int64]) to a + 32-bit integer (type [int32]). The 64-bit integer + is taken modulo 2{^32}, i.e. the top 32 bits are lost + during the conversion. *) + +val of_nativeint : nativeint -> t +(** Convert the given native integer (type [nativeint]) + to an unboxed 64-bit integer (type [int64#]). *) + +val to_nativeint : t -> nativeint +(** Convert the given unboxed 64-bit integer (type [int64#]) to a + native integer. On 32-bit platforms, the 64-bit integer + is taken modulo 2{^32}. On 64-bit platforms, + the conversion is exact. *) + +val of_int32_u : int32# -> t +(** Convert the given unboxed 32-bit integer (type [int32]) + to an unboxed 64-bit integer (type [int64]). *) + +val to_int32_u : t -> int32# +(** Convert the given unboxed 64-bit integer (type [int64]) to an + unboxed 32-bit integer (type [int32]). The 64-bit integer + is taken modulo 2{^32}, i.e. the top 32 bits are lost + during the conversion. *) + +val of_nativeint_u : nativeint# -> t +(** Convert the given unboxed native integer (type [nativeint]) + to an unboxed 64-bit integer (type [int64#]). *) + +val to_nativeint_u : t -> nativeint# +(** Convert the given unboxed 64-bit integer (type [int64#]) to an + unboxed native integer. On 32-bit platforms, the 64-bit integer + is taken modulo 2{^32}. On 64-bit platforms, + the conversion is exact. *) + +val of_string : string -> t +(** Convert the given string to an unboxed 64-bit integer. + The string is read in decimal (by default, or if the string + begins with [0u]) or in hexadecimal, octal or binary if the + string begins with [0x], [0o] or [0b] respectively. + + The [0u] prefix reads the input as an unsigned integer in the range + [[0, 2*Int64_u.max_int+1]]. If the input exceeds {!Int64_u.max_int} + it is converted to the signed integer + [Int64.min_int + input - Int64_u.max_int - 1]. + + The [_] (underscore) character can appear anywhere in the string + and is ignored. + @raise Failure if the given string is not + a valid representation of an integer, or if the integer represented + exceeds the range of integers representable in type [int64]. *) + +(* val of_string_opt: string -> t option + * (** Same as [of_string], but return [None] instead of raising. *) *) + +val to_string : t -> string +(** Return the string representation of its argument, in decimal. *) + +val bits_of_float : float -> t +(** Return the internal representation of the given float according + to the IEEE 754 floating-point 'double format' bit layout. + Bit 63 of the result represents the sign of the float; + bits 62 to 52 represent the (biased) exponent; bits 51 to 0 + represent the mantissa. *) + +val float_of_bits : t -> float +(** Return the floating-point number whose internal representation, + according to the IEEE 754 floating-point 'double format' bit layout, + is the given [int64#]. *) + +val compare: t -> t -> int +(** The comparison function for unboxed 64-bit integers, with the same + specification as {!Stdlib.compare}. *) +(* CR layouts v2.1: Restore the below comment when we have an appropriate + functor *) +(* Along with the type [t], this function [compare] + allows the module [Int64_u] to be passed as argument to the functors + {!Set.Make} and {!Map.Make}. *) + +val unsigned_compare: t -> t -> int +(** Same as {!compare}, except that arguments are interpreted as {e unsigned} + unboxed 64-bit integers. *) + +val equal: t -> t -> bool +(** The equal function for unboxed 64-bit ints. *) + +val min: t -> t -> t +(** Return the smaller of the two arguments. *) + +val max: t -> t -> t +(** Return the greater of the two arguments. *) diff --git a/otherlibs/stdlib_upstream_compatible/nativeint_u.ml b/otherlibs/stdlib_upstream_compatible/nativeint_u.ml new file mode 100644 index 00000000000..40c99aa486a --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/nativeint_u.ml @@ -0,0 +1,123 @@ +# 2 "nativeint_u.ml" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +[@@@ocaml.flambda_o3] + +type t = nativeint# + +external to_nativeint : t -> (nativeint[@local_opt]) = "%box_nativeint" [@@warning "-187"] + +external of_nativeint : (nativeint[@local_opt]) -> t = + "%unbox_nativeint" [@@warning "-187"] + +let[@inline always] neg x = of_nativeint (Nativeint.neg (to_nativeint x)) + +let[@inline always] add x y = + of_nativeint (Nativeint.add (to_nativeint x) (to_nativeint y)) + +let[@inline always] sub x y = + of_nativeint (Nativeint.sub (to_nativeint x) (to_nativeint y)) + +let[@inline always] mul x y = + of_nativeint (Nativeint.mul (to_nativeint x) (to_nativeint y)) + +let[@inline always] div x y = + of_nativeint (Nativeint.div (to_nativeint x) (to_nativeint y)) + +let[@inline always] unsigned_div x y = + of_nativeint + ((Nativeint.unsigned_div[@inlined]) (to_nativeint x) (to_nativeint y)) + +let[@inline always] rem x y = + of_nativeint (Nativeint.rem (to_nativeint x) (to_nativeint y)) + +let[@inline always] unsigned_rem x y = + of_nativeint + ((Nativeint.unsigned_rem[@inlined]) (to_nativeint x) (to_nativeint y)) + +let[@inline always] succ x = + of_nativeint ((Nativeint.succ[@inlined]) (to_nativeint x)) + +let[@inline always] pred x = + of_nativeint ((Nativeint.pred[@inlined]) (to_nativeint x)) + +let[@inline always] abs x = + of_nativeint ((Nativeint.abs[@inlined]) (to_nativeint x)) + +let size = Nativeint.size + +let[@inline always] logand x y = + of_nativeint (Nativeint.logand (to_nativeint x) (to_nativeint y)) + +let[@inline always] logor x y = + of_nativeint (Nativeint.logor (to_nativeint x) (to_nativeint y)) + +let[@inline always] logxor x y = + of_nativeint (Nativeint.logxor (to_nativeint x) (to_nativeint y)) + +let[@inline always] lognot x = + of_nativeint ((Nativeint.lognot[@inlined]) (to_nativeint x)) + +let[@inline always] shift_left x y = + of_nativeint (Nativeint.shift_left (to_nativeint x) y) + +let[@inline always] shift_right x y = + of_nativeint (Nativeint.shift_right (to_nativeint x) y) + +let[@inline always] shift_right_logical x y = + of_nativeint (Nativeint.shift_right_logical (to_nativeint x) y) + +let[@inline always] of_int x = of_nativeint (Nativeint.of_int x) + +let[@inline always] to_int x = Nativeint.to_int (to_nativeint x) + +let[@inline always] unsigned_to_int x = + (Nativeint.unsigned_to_int[@inlined]) (to_nativeint x) + +let[@inline always] of_float x = of_nativeint (Nativeint.of_float x) + +let[@inline always] to_float x = Nativeint.to_float (to_nativeint x) + +let[@inline always] of_int32 x = of_nativeint (Nativeint.of_int32 x) + +let[@inline always] to_int32 x = Nativeint.to_int32 (to_nativeint x) + +let[@inline always] of_int32_u x = + of_nativeint (Nativeint.of_int32 (Int32_u.to_int32 x)) + +let[@inline always] to_int32_u x = + Int32_u.of_int32 (Nativeint.to_int32 (to_nativeint x)) + +let[@inline always] of_string x = of_nativeint (Nativeint.of_string x) + +let[@inline always] to_string x = + (Nativeint.to_string[@inlined]) (to_nativeint x) + +let[@inline always] compare x y = + (Nativeint.compare[@inlined]) (to_nativeint x) (to_nativeint y) + +let[@inline always] unsigned_compare x y = + (Nativeint.unsigned_compare[@inlined]) (to_nativeint x) (to_nativeint y) + +let[@inline always] equal x y = + (Nativeint.equal[@inlined]) (to_nativeint x) (to_nativeint y) + +let[@inline always] min x y = + of_nativeint ((Nativeint.min[@inlined]) (to_nativeint x) (to_nativeint y)) + +let[@inline always] max x y = + of_nativeint ((Nativeint.max[@inlined]) (to_nativeint x) (to_nativeint y)) diff --git a/otherlibs/stdlib_upstream_compatible/nativeint_u.mli b/otherlibs/stdlib_upstream_compatible/nativeint_u.mli new file mode 100644 index 00000000000..ffb2cf01e15 --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/nativeint_u.mli @@ -0,0 +1,250 @@ +# 2 "nativeint_u.mli" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +(** Unboxed processor-native integers. This file primarily duplicates + functionality from the [Nativeint] module, but for [nativeint#]. + + This module provides operations on the type [nativeint#] of + unboxed signed 32-bit integers (on 32-bit platforms) or + unboxed signed 64-bit integers (on 64-bit platforms). + This integer type has exactly the same width as that of a + pointer type in the C compiler. All arithmetic operations over + [nativeint#] are wrapping, not truncating. +*) + +type t = nativeint# +(** An alias for the type of unboxed native integers. *) + +(* CR layouts v2.1: add back this comment to the above when we support + literals. + + Literals for unboxed native integers are prefixed by # and suffixed by n: + {[ + let zero: nativeint# = #0n + let one: nativeint# = #1n + let m_one: nativeint# = #-1n + ]} +*) + +(* Unboxed-specific stuff at the top. *) +external to_nativeint : t -> (nativeint[@local_opt]) = "%box_nativeint" [@@warning "-187"] +(** Box a [nativeint#] *) + +external of_nativeint : (nativeint[@local_opt]) -> t = + "%unbox_nativeint" [@@warning "-187"] +(** Unbox a boxed [nativeint] *) + +(* Below here, everything also appears in [Nativeint], though most things are + externals in that module. *) + +(* CR layouts v5: add back all the commented-out values in this module when we + support [word]s in structures. This includes constants (e.g., [zero] and + [one]) and functions that return things like [nativeint#] (e.g., + [of_string_opt]). *) + +(* val zero : nativeint# + * (** The unboxed native integer 0.*) + * + * val one : nativeint# + * (** The unboxed native integer 1.*) + * + * val minus_one : nativeint# + * (** The unboxed native integer -1.*) *) + +val neg : t -> t +(** Unary negation. *) + +val add : t -> t -> t +(** Addition. *) + +val sub : t -> t -> t +(** Subtraction. *) + +val mul : t -> t -> t +(** Multiplication. *) + +val div : t -> t -> t +(** Integer division. This division rounds the real quotient of + its arguments towards zero, as specified for {!Stdlib.(/)}. + + @raise Division_by_zero if the second + argument is zero. *) + +val unsigned_div : t -> t -> t +(** Same as {!div}, except that arguments and result are interpreted as {e + unsigned} unboxed native integers. *) + +val rem : t -> t -> t +(** Integer remainder. If [y] is not zero, the result + of [Nativeint_u.rem x y] satisfies the following properties: + [Nativeint_u.zero <= Nativeint_u.rem x y < Nativeint_u.abs y] and + [x = Nativeint_u.add (Nativeint_u.mul (Nativeint_u.div x y) y) + (Nativeint_u.rem x y)]. + If [y = 0], [Nativeint_u.rem x y] raises [Division_by_zero]. *) + +val unsigned_rem : t -> t -> t +(** Same as {!rem}, except that arguments and result are interpreted as {e + unsigned} unboxed native integers. *) + +val succ : t -> t +(** Successor. + [Nativeint_u.succ x] is [Nativeint_u.add x Nativeint_u.one]. *) + +val pred : t -> t +(** Predecessor. + [Nativeint_u.pred x] is [Nativeint_u.sub x Nativeint_u.one]. *) + +val abs : t -> t +(** Return the absolute value of its argument. *) + +val size : int +(** The size in bits of an unboxed native integer. This is equal to [32] + on a 32-bit platform and to [64] on a 64-bit platform. *) + +(* val max_int : nativeint# + * (** The greatest representable unboxed native integer, + * either 2{^31} - 1 on a 32-bit platform, + * or 2{^63} - 1 on a 64-bit platform. *) + * + * val min_int : nativeint# + * (** The smallest representable unboxed native integer, + * either -2{^31} on a 32-bit platform, + * or -2{^63} on a 64-bit platform. *) *) + +val logand : t -> t -> t +(** Bitwise logical and. *) + +val logor : t -> t -> t +(** Bitwise logical or. *) + +val logxor : t -> t -> t +(** Bitwise logical exclusive or. *) + +val lognot : t -> t +(** Bitwise logical negation. *) + +val shift_left : t -> int -> t +(** [Nativeint_u.shift_left x y] shifts [x] to the left by [y] bits. + The result is unspecified if [y < 0] or [y >= bitsize], + where [bitsize] is [#32] on a 32-bit platform and + [#64] on a 64-bit platform. *) + +val shift_right : t -> int -> t +(** [Nativeint_u.shift_right x y] shifts [x] to the right by [y] bits. + This is an arithmetic shift: the sign bit of [x] is replicated + and inserted in the vacated bits. + The result is unspecified if [y < 0] or [y >= bitsize]. *) + +val shift_right_logical : t -> int -> t +(** [Nativeint_u.shift_right_logical x y] shifts [x] to the right + by [y] bits. + This is a logical shift: zeroes are inserted in the vacated bits + regardless of the sign of [x]. + The result is unspecified if [y < 0] or [y >= bitsize]. *) + + +val of_int : int -> t +(** Convert the given integer (type [int]) to an unboxed native integer + (type [nativeint#]). *) + +val to_int : t -> int +(** Convert the given unboxed native integer (type [nativeint#]) to an + integer (type [int]). The high-order bit is lost during + the conversion. *) + +val unsigned_to_int : t -> int option +(** Same as {!to_int}, but interprets the argument as an {e unsigned} integer. + Returns [None] if the unsigned value of the argument cannot fit into an + [int]. *) + +val of_float : float -> t +(** Convert the given floating-point number to an unboxed native integer, + discarding the fractional part (truncate towards 0). + If the truncated floating-point number is outside the range + \[{!Nativeint_u.min_int}, {!Nativeint_u.max_int}\], no exception is raised, + and an unspecified, platform-dependent integer is returned. *) + +val to_float : t -> float +(** Convert the given unboxed native integer to a floating-point number. *) + +val of_int32 : int32 -> t +(** Convert the given 32-bit integer (type [int32]) + to an unboxed native integer. *) + +val to_int32 : t -> int32 +(** Convert the given unboxed native integer to a + 32-bit integer (type [int32]). On 64-bit platforms, + the 64-bit unboxed native integer is taken modulo 2{^32}, + i.e. the top 32 bits are lost. On 32-bit platforms, + the conversion is exact. *) + +val of_int32_u : int32# -> t +(** Convert the given unboxed 32-bit integer (type [int32]) + to an unboxed native integer. *) + +val to_int32_u : t -> int32# +(** Convert the given unboxed native integer to an unboxed + 32-bit integer (type [int32]). On 64-bit platforms, + the 64-bit unboxed native integer is taken modulo 2{^32}, + i.e. the top 32 bits are lost. On 32-bit platforms, + the conversion is exact. *) + +val of_string : string -> t +(** Convert the given string to an unboxed native integer. + The string is read in decimal (by default, or if the string + begins with [0u]) or in hexadecimal, octal or binary if the + string begins with [0x], [0o] or [0b] respectively. + + The [0u] prefix reads the input as an unsigned integer in the range + [[0, 2*Nativeint_u.max_int+1]]. If the input exceeds {!Nativeint_u.max_int} + it is converted to the signed integer + [Int64.min_int + input - Nativeint_u.max_int - 1]. + + @raise Failure if the given string is not + a valid representation of an integer, or if the integer represented + exceeds the range of integers representable in type [nativeint]. *) + +(* val of_string_opt: string -> t option + * (** Same as [of_string], but return [None] instead of raising. *) *) + +val to_string : t -> string +(** Return the string representation of its argument, in decimal. *) + +val compare: t -> t -> int +(** The comparison function for unboxed native integers, with the same + specification as {!Stdlib.compare}. *) +(* CR layouts v2.1: Restore the below comment when we have an appropriate + functor *) +(* Along with the type [t], this function [compare] + allows the module [Nativeint_u] to be passed as argument to the functors + {!Set.Make} and {!Map.Make}. *) + +val unsigned_compare: t -> t -> int +(** Same as {!compare}, except that arguments are interpreted as {e unsigned} + unboxed native integers. *) + +val equal: t -> t -> bool +(** The equal function for unboxed native ints. *) + +val min: t -> t -> t +(** Return the smaller of the two arguments. *) + +val max: t -> t -> t +(** Return the greater of the two arguments. *) diff --git a/otherlibs/stdlib_upstream_compatible/stdlib_upstream_compatible.ml b/otherlibs/stdlib_upstream_compatible/stdlib_upstream_compatible.ml new file mode 100644 index 00000000000..928bda4cf85 --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/stdlib_upstream_compatible.ml @@ -0,0 +1,4 @@ +module Float_u = Float_u +module Int32_u = Int32_u +module Int64_u = Int64_u +module Nativeint_u = Nativeint_u diff --git a/otherlibs/stdlib_upstream_compatible/stdlib_upstream_compatible.mli b/otherlibs/stdlib_upstream_compatible/stdlib_upstream_compatible.mli new file mode 100644 index 00000000000..928bda4cf85 --- /dev/null +++ b/otherlibs/stdlib_upstream_compatible/stdlib_upstream_compatible.mli @@ -0,0 +1,4 @@ +module Float_u = Float_u +module Int32_u = Int32_u +module Int64_u = Int64_u +module Nativeint_u = Nativeint_u diff --git a/otherlibs/str/dune b/otherlibs/str/dune index 611645b99d2..b046bc39cae 100644 --- a/otherlibs/str/dune +++ b/otherlibs/str/dune @@ -17,8 +17,9 @@ (wrapped false) (modes byte native) (flags ( - -strict-sequence -principal -absname -w +a-4-9-40-41-42-44-45-48-66 - -warn-error A -bin-annot -safe-string -strict-formats + :standard + -strict-sequence -absname -w +67+70 + -bin-annot -safe-string -strict-formats )) (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) (library_flags (:standard -linkall)) @@ -41,6 +42,7 @@ (.str.objs/byte/str.cmi as str/str.cmi) (.str.objs/byte/str.cmt as str/str.cmt) (.str.objs/byte/str.cmti as str/str.cmti) + (META as str/META) ) (section lib) (package ocaml)) diff --git a/otherlibs/str/str.ml b/otherlibs/str/str.ml index ffe0a3a04c6..67b862ad1ad 100644 --- a/otherlibs/str/str.ml +++ b/otherlibs/str/str.ml @@ -610,7 +610,7 @@ external re_search_backward: regexp -> string -> int -> int array module Domain = struct module DLS = struct - (* CR ocaml 5 runtime: Remove this proxy and use the real Domain.DLS *) + (* CR ocaml 5 domains: Remove this proxy and use the real Domain.DLS *) let[@inline always] new_key f = ref (f ()) let[@inline always] set k s = k := s let[@inline always] get k = !k diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index 661d3575dec..11b76f90bb7 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -1,34 +1,8 @@ -condition.cmo : \ - mutex.cmi \ - condition.cmi -condition.cmx : \ - mutex.cmx \ - condition.cmi -condition.cmi : \ - mutex.cmi event.cmo : \ - mutex.cmi \ - condition.cmi \ event.cmi event.cmx : \ - mutex.cmx \ - condition.cmx \ event.cmi event.cmi : -mutex.cmo : \ - mutex.cmi -mutex.cmx : \ - mutex.cmi -mutex.cmi : -semaphore.cmo : \ - mutex.cmi \ - condition.cmi \ - semaphore.cmi -semaphore.cmx : \ - mutex.cmx \ - condition.cmx \ - semaphore.cmi -semaphore.cmi : thread.cmo : \ thread.cmi thread.cmx : \ diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index b8902eba923..a098f0bafdb 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -22,7 +22,7 @@ ifneq "$(CCOMPTYPE)" "msvc" OC_CFLAGS += -g endif -OC_CFLAGS += $(SHAREDLIB_CFLAGS) $(PTHREAD_CFLAGS) +OC_CFLAGS += $(SHAREDLIB_CFLAGS) LIBS = $(STDLIBFLAGS) -I $(ROOTDIR)/otherlibs/unix @@ -45,12 +45,12 @@ LIBNAME=threads BYTECODE_C_OBJS=st_stubs.b.$(O) NATIVECODE_C_OBJS=st_stubs.n.$(O) -THREADS_SOURCES = thread.ml mutex.ml condition.ml event.ml semaphore.ml +THREADS_SOURCES = thread.ml event.ml THREADS_BCOBJS = $(THREADS_SOURCES:.ml=.cmo) THREADS_NCOBJS = $(THREADS_SOURCES:.ml=.cmx) -MLIFILES=thread.mli mutex.mli condition.mli event.mli semaphore.mli +MLIFILES=thread.mli event.mli CMIFILES=$(MLIFILES:.mli=.cmi) diff --git a/otherlibs/systhreads/byte/dune b/otherlibs/systhreads/byte/dune index a3f0a5c0ecd..d3d0904d281 100644 --- a/otherlibs/systhreads/byte/dune +++ b/otherlibs/systhreads/byte/dune @@ -1,17 +1,23 @@ (copy_files# ../*.{c,h,ml,mli}) +(copy_files# ../../../runtime/sync_posix.h) + (library - (name threads) - (modes byte) - (wrapped false) - (flags -w +33..39 -warn-error A -g -bin-annot -safe-string) - (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) - (libraries unix) - (library_flags -linkall) - (c_library_flags -lpthread) - (foreign_stubs - (language c) - (names st_stubs) - (flags ((:include %{project_root}/oc_cflags.sexp) - (:include %{project_root}/sharedlib_cflags.sexp) - (:include %{project_root}/oc_cppflags.sexp))))) + (name threads) + (modes byte) + (wrapped false) + ; FIXME Fix warning 27 and -no-strict-sequence + (flags + (:standard -no-strict-sequence -g -bin-annot -w -27)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (libraries unix) + (library_flags -linkall) + (c_library_flags -lpthread) + (foreign_stubs + (language c) + (names st_stubs) + (flags + ((:include %{project_root}/oc_cflags.sexp) + (:include %{project_root}/sharedlib_cflags.sexp) + (:include %{project_root}/oc_cppflags.sexp))))) diff --git a/otherlibs/systhreads/condition.mli b/otherlibs/systhreads/condition.mli deleted file mode 100644 index 36c71fc818b..00000000000 --- a/otherlibs/systhreads/condition.mli +++ /dev/null @@ -1,53 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Xavier Leroy and Damien Doligez, 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. *) -(* *) -(**************************************************************************) - -(** Condition variables to synchronize between threads. - - Condition variables are used when one thread wants to wait until another - thread has finished doing something: the former thread 'waits' on the - condition variable, the latter thread 'signals' the condition when it - is done. Condition variables should always be protected by a mutex. - The typical use is (if [D] is a shared data structure, [m] its mutex, - and [c] is a condition variable): - {[ - Mutex.lock m; - while (* some predicate P over D is not satisfied *) do - Condition.wait c m - done; - (* Modify D *) - if (* the predicate P over D is now satisfied *) then Condition.signal c; - Mutex.unlock m - ]} -*) - -type t -(** The type of condition variables. *) - -val create : unit -> t -(** Return a new condition variable. *) - -val wait : t -> Mutex.t -> unit -(** [wait c m] atomically unlocks the mutex [m] and suspends the - calling process on the condition variable [c]. The process will - restart after the condition variable [c] has been signalled. - The mutex [m] is locked again before [wait] returns. *) - -val signal : t -> unit -(** [signal c] restarts one of the processes waiting on the - condition variable [c]. *) - -val broadcast : t -> unit -(** [broadcast c] restarts all processes waiting on the - condition variable [c]. *) diff --git a/otherlibs/systhreads/dune b/otherlibs/systhreads/dune index 5c9f889f564..4639a4d596e 100644 --- a/otherlibs/systhreads/dune +++ b/otherlibs/systhreads/dune @@ -12,47 +12,27 @@ ;* * ;************************************************************************** - ; For some reason the C header files aren't being found if this library ; is given a public name, so we do the installation manually. -(install - (files - (byte/threads.cma as threads/threads.cma) - (native/threadsnat.cmxa as threads/threads.cmxa) - (native/threadsnat.a as threads/threads.a) - - (byte/libthreads_stubs.a as libthreads_stubs.a) - (byte/dllthreads_stubs.so as stublibs/dllthreads_stubs.so) - (native/libthreadsnat_stubs.a as libthreadsnat_stubs.a) - (native/libthreadsnat_stubs.a as libthreadsnat_stubs_native.a) ; for special_dune compat - - - (thread.mli as threads/thread.mli) - (condition.mli as threads/condition.mli) - (event.mli as threads/event.mli) - (mutex.mli as threads/mutex.mli) - (semaphore.mli as threads/semaphore.mli) - - (threads.h as caml/threads.h) - - (native/.threadsnat.objs/native/condition.cmx as threads/condition.cmx) - (native/.threadsnat.objs/native/event.cmx as threads/event.cmx) - (native/.threadsnat.objs/native/mutex.cmx as threads/mutex.cmx) - (native/.threadsnat.objs/native/semaphore.cmx as threads/semaphore.cmx) - (native/.threadsnat.objs/native/thread.cmx as threads/thread.cmx) - - (byte/.threads.objs/byte/condition.cmi as threads/condition.cmi) - (byte/.threads.objs/byte/condition.cmti as threads/condition.cmti) - (byte/.threads.objs/byte/event.cmi as threads/event.cmi) - (byte/.threads.objs/byte/event.cmti as threads/event.cmti) - (byte/.threads.objs/byte/mutex.cmi as threads/mutex.cmi) - (byte/.threads.objs/byte/mutex.cmti as threads/mutex.cmti) - (byte/.threads.objs/byte/semaphore.cmi as threads/semaphore.cmi) - (byte/.threads.objs/byte/semaphore.cmti as threads/semaphore.cmti) - (byte/.threads.objs/byte/thread.cmi as threads/thread.cmi) - (byte/.threads.objs/byte/thread.cmti as threads/thread.cmti) - ) - (section lib) - (package ocaml)) - +(install + (files + (byte/threads.cma as threads/threads.cma) + (native/threadsnat.cmxa as threads/threads.cmxa) + (native/threadsnat.a as threads/threads.a) + (byte/libthreads_stubs.a as libthreads_stubs.a) + (byte/dllthreads_stubs.so as stublibs/dllthreads_stubs.so) + (native/libthreadsnat_stubs.a as libthreadsnat_stubs.a) + (native/libthreadsnat_stubs.a as libthreadsnat_stubs_native.a) ; for special_dune compat + (thread.mli as threads/thread.mli) + (event.mli as threads/event.mli) + (threads.h as caml/threads.h) + (native/.threadsnat.objs/native/event.cmx as threads/event.cmx) + (native/.threadsnat.objs/native/thread.cmx as threads/thread.cmx) + (byte/.threads.objs/byte/event.cmi as threads/event.cmi) + (byte/.threads.objs/byte/event.cmti as threads/event.cmti) + (byte/.threads.objs/byte/thread.cmi as threads/thread.cmi) + (byte/.threads.objs/byte/thread.cmti as threads/thread.cmti) + (META as threads/META)) + (section lib) + (package ocaml)) diff --git a/otherlibs/systhreads/event.ml b/otherlibs/systhreads/event.ml index fc8a65b042f..f5fc9785fcb 100644 --- a/otherlibs/systhreads/event.ml +++ b/otherlibs/systhreads/event.ml @@ -13,8 +13,6 @@ (* *) (**************************************************************************) -[@@@ocaml.flambda_o3] - (* Events *) type 'a basic_event = { poll: unit -> bool; diff --git a/otherlibs/systhreads/native/dune b/otherlibs/systhreads/native/dune index e8f4e17f5b6..268900a6be8 100644 --- a/otherlibs/systhreads/native/dune +++ b/otherlibs/systhreads/native/dune @@ -1,18 +1,24 @@ (copy_files# ../*.{c,h,ml,mli}) +(copy_files# ../../../runtime/sync_posix.h) + (library - (name threadsnat) - (modes native) - (wrapped false) - (flags -w +33..39 -warn-error A -g -bin-annot -safe-string) - (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) - (libraries unix) - (library_flags -linkall) - (c_library_flags -lpthread) - (foreign_stubs - (language c) - (names st_stubs) - (flags ((-DNATIVE_CODE) - (:include %{project_root}/oc_cflags.sexp) - (:include %{project_root}/sharedlib_cflags.sexp) - (:include %{project_root}/oc_cppflags.sexp))))) + (name threadsnat) + (modes native) + (wrapped false) + ; FIXME Fix warning 27 and -no-strict-sequence + (flags + (:standard -no-strict-sequence -g -bin-annot -w -27)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (libraries unix) + (library_flags -linkall) + (c_library_flags -lpthread) + (foreign_stubs + (language c) + (names st_stubs) + (flags + ((-DNATIVE_CODE) + (:include %{project_root}/oc_cflags.sexp) + (:include %{project_root}/sharedlib_cflags.sexp) + (:include %{project_root}/oc_cppflags.sexp))))) diff --git a/otherlibs/systhreads/st_posix.h b/otherlibs/systhreads/st_posix.h index a43c78fbc92..1ed25fdef35 100644 --- a/otherlibs/systhreads/st_posix.h +++ b/otherlibs/systhreads/st_posix.h @@ -15,487 +15,26 @@ /* POSIX thread implementation of the "st" interface */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __linux__ -#include -#include -#include -#include -#include +#ifdef HAS_SYS_SELECT_H +#include #endif -typedef int st_retcode; - -#define SIGPREEMPTION SIGVTALRM - -/* OS-specific initialization */ - -static int st_initialize(void) -{ - caml_sigmask_hook = pthread_sigmask; - return 0; -} - -/* Thread creation. Created in detached mode if [res] is NULL. */ - -typedef pthread_t st_thread_id; - -static int st_thread_create(st_thread_id * res, - void * (*fn)(void *), void * arg) -{ - pthread_t thr; - pthread_attr_t attr; - int rc; - - pthread_attr_init(&attr); - if (res == NULL) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - rc = pthread_create(&thr, &attr, fn, arg); - if (res != NULL) *res = thr; - return rc; -} - -#define ST_THREAD_FUNCTION void * - -/* Cleanup at thread exit */ - -Caml_inline void st_thread_cleanup(void) -{ - return; -} - -/* Thread termination */ - -CAMLnoreturn_start -static void st_thread_exit(void) -CAMLnoreturn_end; - -static void st_thread_exit(void) -{ - pthread_exit(NULL); -} - -static void st_thread_join(st_thread_id thr) -{ - pthread_join(thr, NULL); - /* best effort: ignore errors */ -} - -/* Thread-specific state */ - -typedef pthread_key_t st_tlskey; - -static int st_tls_newkey(st_tlskey * res) -{ - return pthread_key_create(res, NULL); -} - -Caml_inline void * st_tls_get(st_tlskey k) -{ - return pthread_getspecific(k); -} - -Caml_inline void st_tls_set(st_tlskey k, void * v) -{ - pthread_setspecific(k, v); -} - -/* Windows-specific hook. */ -Caml_inline void st_thread_set_id(intnat id) -{ - return; -} - -/* If we're using glibc, use a custom condition variable implementation to - avoid this bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25847 - - For now we only have this on linux because it directly uses the linux futex - syscalls. */ -#if defined(__linux__) && defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) -typedef struct { - volatile unsigned counter; -} custom_condvar; - -static int custom_condvar_init(custom_condvar * cv) -{ - cv->counter = 0; - return 0; -} - -static int custom_condvar_destroy(custom_condvar * cv) -{ - return 0; -} - -static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) -{ - unsigned old_count = cv->counter; - pthread_mutex_unlock(mutex); - syscall(SYS_futex, &cv->counter, FUTEX_WAIT_PRIVATE, old_count, NULL, NULL, 0); - pthread_mutex_lock(mutex); - return 0; -} - -static int custom_condvar_signal(custom_condvar * cv) -{ - __sync_add_and_fetch(&cv->counter, 1); - syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, 1, NULL, NULL, 0); - return 0; -} - -static int custom_condvar_broadcast(custom_condvar * cv) -{ - __sync_add_and_fetch(&cv->counter, 1); - syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, INT_MAX, NULL, NULL, 0); - return 0; -} -#else -typedef pthread_cond_t custom_condvar; - -static int custom_condvar_init(custom_condvar * cv) -{ - return pthread_cond_init(cv, NULL); -} - -static int custom_condvar_destroy(custom_condvar * cv) -{ - return pthread_cond_destroy(cv); -} - -static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) -{ - return pthread_cond_wait(cv, mutex); -} - -static int custom_condvar_signal(custom_condvar * cv) -{ - return pthread_cond_signal(cv); -} - -static int custom_condvar_broadcast(custom_condvar * cv) -{ - return pthread_cond_broadcast(cv); -} -#endif - -/* The master lock. This is a mutex that is held most of the time, - so we implement it in a slightly convoluted way to avoid - all risks of busy-waiting. Also, we count the number of waiting - threads. */ - -typedef struct { - pthread_mutex_t lock; /* to protect contents */ - int busy; /* 0 = free, 1 = taken */ - volatile int waiters; /* number of threads waiting on master lock */ - custom_condvar is_free; /* signaled when free */ -} st_masterlock; - -static void st_masterlock_init(st_masterlock * m) -{ - pthread_mutex_init(&m->lock, NULL); - custom_condvar_init(&m->is_free); - m->busy = 1; - m->waiters = 0; -} - -static void st_masterlock_acquire(st_masterlock * m) -{ - pthread_mutex_lock(&m->lock); - while (m->busy) { - m->waiters ++; - custom_condvar_wait(&m->is_free, &m->lock); - m->waiters --; - } - m->busy = 1; - pthread_mutex_unlock(&m->lock); -} - -static void st_masterlock_release(st_masterlock * m) +Caml_inline void st_msleep(int msec) { - pthread_mutex_lock(&m->lock); - m->busy = 0; - pthread_mutex_unlock(&m->lock); - custom_condvar_signal(&m->is_free); + struct timeval timeout = {0, msec * 1000}; + select(0, NULL, NULL, NULL, &timeout); } -CAMLno_tsan /* This can be called for reading [waiters] without locking. */ -Caml_inline int st_masterlock_waiters(st_masterlock * m) -{ - return m->waiters; -} - -/* Scheduling hints */ - -/* This is mostly equivalent to release(); acquire(), but better. In particular, - release(); acquire(); leaves both us and the waiter we signal() racing to - acquire the lock. Calling yield or sleep helps there but does not solve the - problem. Sleeping ourselves is much more reliable--and since we're handing - off the lock to a waiter we know exists, it's safe, as they'll certainly - re-wake us later. -*/ -Caml_inline void st_thread_yield(st_masterlock * m) -{ - pthread_mutex_lock(&m->lock); - /* We must hold the lock to call this. */ - assert(m->busy); - - /* We already checked this without the lock, but we might have raced--if - there's no waiter, there's nothing to do and no one to wake us if we did - wait, so just keep going. */ - if (m->waiters == 0) { - pthread_mutex_unlock(&m->lock); - return; - } - - m->busy = 0; - custom_condvar_signal(&m->is_free); - m->waiters++; - do { - /* Note: the POSIX spec prevents the above signal from pairing with this - wait, which is good: we'll reliably continue waiting until the next - yield() or enter_blocking_section() call (or we see a spurious condvar - wakeup, which are rare at best.) */ - custom_condvar_wait(&m->is_free, &m->lock); - } while (m->busy); - m->busy = 1; - m->waiters--; - pthread_mutex_unlock(&m->lock); -} - -/* Mutexes */ - -typedef pthread_mutex_t * st_mutex; - -static int st_mutex_create(st_mutex * res) -{ - int rc; - pthread_mutexattr_t attr; - st_mutex m; - - rc = pthread_mutexattr_init(&attr); - if (rc != 0) goto error1; - rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); - if (rc != 0) goto error2; - m = caml_stat_alloc_noexc(sizeof(pthread_mutex_t)); - if (m == NULL) { rc = ENOMEM; goto error2; } - rc = pthread_mutex_init(m, &attr); - if (rc != 0) goto error3; - pthread_mutexattr_destroy(&attr); - *res = m; - return 0; -error3: - caml_stat_free(m); -error2: - pthread_mutexattr_destroy(&attr); -error1: - return rc; -} - -static int st_mutex_destroy(st_mutex m) -{ - int rc; - rc = pthread_mutex_destroy(m); - caml_stat_free(m); - return rc; -} - -#define MUTEX_DEADLOCK EDEADLK - -Caml_inline int st_mutex_lock(st_mutex m) -{ - return pthread_mutex_lock(m); -} - -#define MUTEX_PREVIOUSLY_UNLOCKED 0 -#define MUTEX_ALREADY_LOCKED EBUSY - -Caml_inline int st_mutex_trylock(st_mutex m) -{ - return pthread_mutex_trylock(m); -} - -#define MUTEX_NOT_OWNED EPERM - -Caml_inline int st_mutex_unlock(st_mutex m) -{ - return pthread_mutex_unlock(m); -} - -/* Condition variables */ - -typedef custom_condvar * st_condvar; - -static int st_condvar_create(st_condvar * res) -{ - int rc; - st_condvar c = caml_stat_alloc_noexc(sizeof(custom_condvar)); - if (c == NULL) return ENOMEM; - rc = custom_condvar_init(c); - if (rc != 0) { caml_stat_free(c); return rc; } - *res = c; - return 0; -} - -static int st_condvar_destroy(st_condvar c) -{ - int rc; - rc = custom_condvar_destroy(c); - caml_stat_free(c); - return rc; -} - -Caml_inline int st_condvar_signal(st_condvar c) -{ - return custom_condvar_signal(c); -} - -Caml_inline int st_condvar_broadcast(st_condvar c) -{ - return custom_condvar_broadcast(c); -} - -Caml_inline int st_condvar_wait(st_condvar c, st_mutex m) -{ - return custom_condvar_wait(c, m); -} - -/* Triggered events */ - -typedef struct st_event_struct { - pthread_mutex_t lock; /* to protect contents */ - int status; /* 0 = not triggered, 1 = triggered */ - custom_condvar triggered; /* signaled when triggered */ -} * st_event; - -static int st_event_create(st_event * res) -{ - int rc; - st_event e = caml_stat_alloc_noexc(sizeof(struct st_event_struct)); - if (e == NULL) return ENOMEM; - rc = pthread_mutex_init(&e->lock, NULL); - if (rc != 0) { caml_stat_free(e); return rc; } - rc = custom_condvar_init(&e->triggered); - if (rc != 0) - { pthread_mutex_destroy(&e->lock); caml_stat_free(e); return rc; } - e->status = 0; - *res = e; - return 0; -} - -static int st_event_destroy(st_event e) -{ - int rc1, rc2; - rc1 = pthread_mutex_destroy(&e->lock); - rc2 = custom_condvar_destroy(&e->triggered); - caml_stat_free(e); - return rc1 != 0 ? rc1 : rc2; -} - -static int st_event_trigger(st_event e) -{ - int rc; - rc = pthread_mutex_lock(&e->lock); - if (rc != 0) return rc; - e->status = 1; - rc = pthread_mutex_unlock(&e->lock); - if (rc != 0) return rc; - rc = custom_condvar_broadcast(&e->triggered); - return rc; -} - -static int st_event_wait(st_event e) -{ - int rc; - rc = pthread_mutex_lock(&e->lock); - if (rc != 0) return rc; - while(e->status == 0) { - rc = custom_condvar_wait(&e->triggered, &e->lock); - if (rc != 0) return rc; - } - rc = pthread_mutex_unlock(&e->lock); - return rc; -} - -/* Reporting errors */ - -static void st_check_error(int retcode, char * msg) -{ - char * err; - int errlen, msglen; - value str; - - if (retcode == 0) return; - if (retcode == ENOMEM) caml_raise_out_of_memory(); - err = strerror(retcode); - msglen = strlen(msg); - errlen = strlen(err); - str = caml_alloc_string(msglen + 2 + errlen); - memmove (&Byte(str, 0), msg, msglen); - memmove (&Byte(str, msglen), ": ", 2); - memmove (&Byte(str, msglen + 2), err, errlen); - caml_raise_sys_error(str); -} - -/* Variable used to stop the "tick" thread */ -static volatile int caml_tick_thread_stop = 0; - -/* The tick thread: posts a SIGPREEMPTION signal periodically */ - -static void * caml_thread_tick(void * arg) -{ - struct timeval timeout; - sigset_t mask; - - /* Block all signals so that we don't try to execute an OCaml signal handler*/ - sigfillset(&mask); - pthread_sigmask(SIG_BLOCK, &mask, NULL); - while(! caml_tick_thread_stop) { - /* select() seems to be the most efficient way to suspend the - thread for sub-second intervals */ - timeout.tv_sec = 0; - timeout.tv_usec = Thread_timeout * 1000; - select(0, NULL, NULL, NULL, &timeout); - /* The preemption signal should never cause a callback, so don't - go through caml_handle_signal(), just record signal delivery via - caml_record_signal(). */ - caml_record_signal(SIGPREEMPTION); - } - return NULL; -} - -/* "At fork" processing */ - -#if defined(__ANDROID__) -/* Android's libc does not include declaration of pthread_atfork; - however, it implements it since API level 10 (Gingerbread). - The reason for the omission is that Android (GUI) applications - are not supposed to fork at all, however this workaround is still - included in case OCaml is used for an Android CLI utility. */ -int pthread_atfork(void (*prepare)(void), void (*parent)(void), - void (*child)(void)); -#endif - -static int st_atfork(void (*fn)(void)) -{ - return pthread_atfork(NULL, NULL, fn); -} +#include "st_pthreads.h" /* Signal handling */ static void st_decode_sigset(value vset, sigset_t * set) { sigemptyset(set); - while (vset != Val_int(0)) { + for (/*nothing*/; vset != Val_emptylist; vset = Field(vset, 1)) { int sig = caml_convert_signal_number(Int_val(Field(vset, 0))); sigaddset(set, sig); - vset = Field(vset, 1); } } @@ -505,24 +44,23 @@ static void st_decode_sigset(value vset, sigset_t * set) static value st_encode_sigset(sigset_t * set) { - value res = Val_int(0); + CAMLparam0(); + CAMLlocal1(res); int i; - Begin_root(res) - for (i = 1; i < NSIG; i++) - if (sigismember(set, i) > 0) { - value newcons = caml_alloc_small(2, 0); - Field(newcons, 0) = Val_int(caml_rev_convert_signal_number(i)); - Field(newcons, 1) = res; - res = newcons; - } - End_roots(); - return res; + res = Val_emptylist; + + for (i = 1; i < NSIG; i++) + if (sigismember(set, i) > 0) { + res = caml_alloc_2(Tag_cons, + Val_int(caml_rev_convert_signal_number(i)), res); + } + CAMLreturn(res); } static int sigmask_cmd[3] = { SIG_SETMASK, SIG_BLOCK, SIG_UNBLOCK }; -value caml_thread_sigmask(value cmd, value sigs) /* ML */ +value caml_thread_sigmask(value cmd, value sigs) { int how; sigset_t set, oldset; @@ -533,13 +71,13 @@ value caml_thread_sigmask(value cmd, value sigs) /* ML */ caml_enter_blocking_section(); retcode = pthread_sigmask(how, &set, &oldset); caml_leave_blocking_section(); - st_check_error(retcode, "Thread.sigmask"); + sync_check_error(retcode, "Thread.sigmask"); /* Run any handlers for just-unmasked pending signals */ caml_process_pending_actions(); return st_encode_sigset(&oldset); } -value caml_wait_signal(value sigs) /* ML */ +value caml_wait_signal(value sigs) { #ifdef HAS_SIGWAIT sigset_t set; @@ -549,7 +87,7 @@ value caml_wait_signal(value sigs) /* ML */ caml_enter_blocking_section(); retcode = sigwait(&set, &signo); caml_leave_blocking_section(); - st_check_error(retcode, "Thread.wait_signal"); + sync_check_error(retcode, "Thread.wait_signal"); return Val_int(caml_rev_convert_signal_number(signo)); #else caml_invalid_argument("Thread.wait_signal not implemented"); diff --git a/otherlibs/systhreads/st_pthreads.h b/otherlibs/systhreads/st_pthreads.h index 26e32caba5e..5fe8964774f 100644 --- a/otherlibs/systhreads/st_pthreads.h +++ b/otherlibs/systhreads/st_pthreads.h @@ -13,12 +13,6 @@ /* */ /**************************************************************************/ -/* CR ocaml 5 runtime: When we update the OCaml 5 runtime, we'll need to - update this library as well. The base of - https://github.com/ocaml-flambda/ocaml-jst/pull/222 may be a good starting - point. - */ - /* POSIX thread implementation of the "st" interface */ #include @@ -29,13 +23,9 @@ #include #include #include -#include #ifdef HAS_UNISTD #include #endif -#include -#include -#include typedef int st_retcode; @@ -99,78 +89,6 @@ Caml_inline void st_tls_set(st_tlskey k, void * v) pthread_setspecific(k, v); } -/* If we're using glibc, use a custom condition variable implementation to - avoid this bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25847 - - For now we only have this on linux because it directly uses the linux futex - syscalls. */ -#if defined(__linux__) && defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) -typedef struct { - volatile unsigned counter; -} custom_condvar; - -static int custom_condvar_init(custom_condvar * cv) -{ - cv->counter = 0; - return 0; -} - -static int custom_condvar_destroy(custom_condvar * cv) -{ - return 0; -} - -static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) -{ - unsigned old_count = cv->counter; - pthread_mutex_unlock(mutex); - syscall(SYS_futex, &cv->counter, FUTEX_WAIT_PRIVATE, old_count, NULL, NULL, 0); - pthread_mutex_lock(mutex); - return 0; -} - -static int custom_condvar_signal(custom_condvar * cv) -{ - __sync_add_and_fetch(&cv->counter, 1); - syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, 1, NULL, NULL, 0); - return 0; -} - -static int custom_condvar_broadcast(custom_condvar * cv) -{ - __sync_add_and_fetch(&cv->counter, 1); - syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, INT_MAX, NULL, NULL, 0); - return 0; -} -#else -typedef pthread_cond_t custom_condvar; - -static int custom_condvar_init(custom_condvar * cv) -{ - return pthread_cond_init(cv, NULL); -} - -static int custom_condvar_destroy(custom_condvar * cv) -{ - return pthread_cond_destroy(cv); -} - -static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) -{ - return pthread_cond_wait(cv, mutex); -} - -static int custom_condvar_signal(custom_condvar * cv) -{ - return pthread_cond_signal(cv); -} - -static int custom_condvar_broadcast(custom_condvar * cv) -{ - return pthread_cond_broadcast(cv); -} -#endif - /* The master lock. This is a mutex that is held most of the time, so we implement it in a slightly convoluted way to avoid all risks of busy-waiting. Also, we count the number of waiting @@ -242,7 +160,8 @@ static void st_masterlock_acquire(st_masterlock *m) atomic_fetch_add(&m->waiters, -1); } m->busy = 1; - st_bt_lock_acquire(m); + // CR ocaml 5 domains: we assume no backup thread + // st_bt_lock_acquire(m); pthread_mutex_unlock(&m->lock); return; @@ -252,9 +171,10 @@ static void st_masterlock_release(st_masterlock * m) { pthread_mutex_lock(&m->lock); m->busy = 0; - st_bt_lock_release(m); - custom_condvar_signal(&m->is_free); + // CR ocaml 5 domains: we assume no backup thread + // st_bt_lock_release(m); pthread_mutex_unlock(&m->lock); + custom_condvar_signal(&m->is_free); return; } @@ -290,7 +210,8 @@ Caml_inline void st_thread_yield(st_masterlock * m) messaging the bt should not be required because yield assumes that a thread will resume execution (be it the yielding thread or a waiting thread */ - caml_release_domain_lock(); + // CR ocaml 5 domains + // caml_release_domain_lock(); do { /* Note: the POSIX spec prevents the above signal from pairing with this @@ -303,7 +224,8 @@ Caml_inline void st_thread_yield(st_masterlock * m) m->busy = 1; atomic_fetch_add(&m->waiters, -1); - caml_acquire_domain_lock(); + // CR ocaml 5 domains + // caml_acquire_domain_lock(); pthread_mutex_unlock(&m->lock); diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c index 8f78032b86a..beca32173bc 100644 --- a/otherlibs/systhreads/st_stubs.c +++ b/otherlibs/systhreads/st_stubs.c @@ -13,23 +13,28 @@ /* */ /**************************************************************************/ -// CR ocaml 5 runtime: We will need to pull in changes from the same file in -// [tip-5] tag in ocaml-jst. We're considering this file to be part of the -// runtime. - #define CAML_INTERNALS -#define CAML_NAME_SPACE -#include "caml/compatibility.h" -#undef CAML_NAME_SPACE +#if defined(_WIN32) && !defined(NATIVE_CODE) +/* Ensure that pthread.h marks symbols __declspec(dllimport) so that they can be + picked up from the runtime (which will have linked winpthreads statically). + mingw-w64 11.0.0 introduced WINPTHREADS_USE_DLLIMPORT to do this explicitly; + prior versions co-opted this on the internal DLL_EXPORT, but this is ignored + in 11.0 and later unless IN_WINPTHREAD is also defined, so we can safely + define both to support both versions. */ +#define WINPTHREADS_USE_DLLIMPORT +#define DLL_EXPORT +#endif #include "caml/alloc.h" #include "caml/backtrace.h" +#include "caml/backtrace_prim.h" #include "caml/callback.h" #include "caml/custom.h" #include "caml/debugger.h" #include "caml/domain.h" #include "caml/fail.h" +#include "caml/fiber.h" #include "caml/io.h" #include "caml/memory.h" #include "caml/misc.h" @@ -37,22 +42,15 @@ #include "caml/printexc.h" #include "caml/roots.h" #include "caml/signals.h" -#ifdef NATIVE_CODE -#include "caml/stack.h" -#else -#include "caml/stacks.h" -#endif +#include "caml/sync.h" #include "caml/sys.h" #include "caml/memprof.h" +#include "../../runtime/sync_posix.h" + #define CAMLextern_libthreads #include "threads.h" -#ifndef NATIVE_CODE -/* Initial size of bytecode stack when a thread is created (4 Ko) */ -#define Thread_stack_size (Stack_size / 4) -#endif - /* Max computation time before rescheduling, in milliseconds */ #define Thread_timeout 50 @@ -79,114 +77,77 @@ #include #endif - /* The ML value describing a thread (heap-allocated) */ -struct caml_thread_descr { - value ident; /* Unique integer ID */ - value start_closure; /* The closure to start this thread */ - value terminated; /* Triggered event for thread termination */ -}; - -#define Ident(v) (((struct caml_thread_descr *)(v))->ident) -#define Start_closure(v) (((struct caml_thread_descr *)(v))->start_closure) -#define Terminated(v) (((struct caml_thread_descr *)(v))->terminated) +#define Ident(v) Field(v, 0) +#define Start_closure(v) Field(v, 1) +#define Terminated(v) Field(v, 2) /* The infos on threads (allocated via caml_stat_alloc()) */ struct caml_thread_struct { + value descr; /* The heap-allocated descriptor (root) */ - struct caml_thread_struct * next; /* Double linking of running threads */ + struct caml_thread_struct * next; /* Doubly-linked list of running threads */ struct caml_thread_struct * prev; -#ifdef NATIVE_CODE - char * top_of_stack; /* Top of stack for this thread (approx.) */ - char * bottom_of_stack; /* Saved value of Caml_state->_bottom_of_stack */ - uintnat last_retaddr; /* Saved value of Caml_state->_last_return_address */ - value * gc_regs; /* Saved value of Caml_state->_gc_regs */ - char * exception_pointer; /* Saved value of Caml_state->_exception_pointer */ - char * async_exception_pointer; - /* Saved value of Caml_state->_async_exception_pointer */ - struct caml__roots_block * local_roots; /* Saved value of local_roots */ - struct caml_local_arenas * local_arenas; - struct longjmp_buffer * exit_buf; /* For thread exit */ -#else - value * stack_low; /* The execution stack for this thread */ - value * stack_high; - value * stack_threshold; - value * sp; /* Saved value of Caml_state->_extern_sp for this thread */ - value * trapsp; /* Saved value of Caml_state->_trapsp for this thread */ - /* Saved value of Caml_state->_local_roots */ - struct caml__roots_block * local_roots; - struct longjmp_buffer * external_raise; /* Saved Caml_state->_external_raise */ - struct longjmp_buffer * external_raise_async; - /* Saved Caml_state->_external_raise_async */ -#endif - int backtrace_pos; /* Saved Caml_state->_backtrace_pos */ - backtrace_slot * backtrace_buffer; /* Saved Caml_state->_backtrace_buffer */ - value backtrace_last_exn; /* Saved Caml_state->_backtrace_last_exn (root) */ - struct caml_memprof_th_ctx *memprof_ctx; -}; - -typedef struct caml_thread_struct * caml_thread_t; - -/* The "head" of the circular list of thread descriptors */ -static caml_thread_t all_threads = NULL; + int domain_id; /* The id of the domain to which this thread belongs */ + struct stack_info* current_stack; /* saved Caml_state->current_stack */ + struct c_stack_link* c_stack; /* saved Caml_state->c_stack */ + /* Note: we do not save Caml_state->stack_cache, because it can + safely be shared between all threads on the same domain. */ + struct caml__roots_block *local_roots; /* saved value of local_roots */ + struct caml_local_arenas *local_arenas; + int backtrace_pos; /* saved value of Caml_state->backtrace_pos */ + backtrace_slot * backtrace_buffer; + /* saved value of Caml_state->backtrace_buffer */ + value backtrace_last_exn; + /* saved value of Caml_state->backtrace_last_exn (root) */ + value * gc_regs; /* saved value of Caml_state->gc_regs */ + value * gc_regs_buckets; /* saved value of Caml_state->gc_regs_buckets */ + void * exn_handler; /* saved value of Caml_state->exn_handler */ + char * async_exn_handler; /* saved value of Caml_state->async_exn_handler */ + memprof_thread_t memprof; /* memprof's internal thread data structure */ -/* The descriptor for the currently executing thread */ -static caml_thread_t curr_thread = NULL; - -/* The master lock protecting the OCaml runtime system */ -static struct caml_locking_scheme* _Atomic caml_locking_scheme; - -/* Whether the "tick" thread is already running */ -static int caml_tick_thread_running = 0; - -/* Whether the "tick" thread is enabled */ -static int caml_tick_thread_enabled = 1; - -/* The thread identifier of the "tick" thread */ -static st_thread_id caml_tick_thread_id; +#ifndef NATIVE_CODE + intnat trap_sp_off; /* saved value of Caml_state->trap_sp_off */ + intnat trap_barrier_off; /* saved value of Caml_state->trap_barrier_off */ + struct caml_exception_context* external_raise; + /* saved value of Caml_state->external_raise */ + struct caml_exception_context* external_raise_async; + /* saved value of Caml_state->external_raise_async */ +#endif -/* The key used for storing the thread descriptor in the specific data - of the corresponding system thread. */ -static st_tlskey thread_descriptor_key; +#ifdef POSIX_SIGNALS + sigset_t init_mask; +#endif +}; -/* The key used for unlocking I/O channels on exceptions */ -static st_tlskey last_channel_locked_key; +typedef struct caml_thread_struct* caml_thread_t; -/* Identifier for next thread creation */ -static intnat thread_next_ident = 0; +/* Thread-local key for accessing the current thread's [caml_thread_t] */ +st_tlskey caml_thread_key; -/* Forward declarations */ -static value caml_threadstatus_new (void); -static void caml_threadstatus_terminate (value); -static st_retcode caml_threadstatus_wait (value); +#define This_thread ((caml_thread_t) st_tls_get(caml_thread_key)) -/* Imports from the native-code runtime system */ -#ifdef NATIVE_CODE -extern struct longjmp_buffer caml_termination_jmpbuf; -extern void (*caml_termination_hook)(void); -#endif +/* overall table for threads across domains */ +struct caml_thread_table { + caml_thread_t active_thread; + struct caml_locking_scheme * _Atomic locking_scheme; + st_masterlock default_lock; + struct caml_locking_scheme default_locking_scheme; + int tick_thread_running; + int tick_thread_disabled; + st_thread_id tick_thread_id; +}; -/* The default locking scheme */ -static st_masterlock default_master_lock; +/* thread_table instance, up to Max_domains */ +static struct caml_thread_table thread_table[Max_domains]; -static int default_can_skip_yield(void* m) -{ - return st_masterlock_waiters(m) == 0; -} +#define Locking_scheme(dom_id) (thread_table[dom_id].locking_scheme) +#define Default_lock(dom_id) (&thread_table[dom_id].default_lock) +#define Default_locking_scheme(dom_id) (&thread_table[dom_id].default_locking_scheme) -struct caml_locking_scheme caml_default_locking_scheme = - { &default_master_lock, - (void (*)(void*))&st_masterlock_acquire, - (void (*)(void*))&st_masterlock_release, - NULL, - NULL, - (void (*)(void*))&st_masterlock_init, - default_can_skip_yield, - (void (*)(void*))&st_thread_yield }; - -static void acquire_runtime_lock() +static void thread_lock_acquire(int dom_id) { struct caml_locking_scheme* s; @@ -196,233 +157,214 @@ static void acquire_runtime_lock() right scheme. */ retry: - s = atomic_load(&caml_locking_scheme); + s = atomic_load(&Locking_scheme(dom_id)); s->lock(s->context); - if (atomic_load(&caml_locking_scheme) != s) { + if (atomic_load(&Locking_scheme(dom_id)) != s) { /* This is no longer the right scheme. Unlock and try again */ s->unlock(s->context); goto retry; } } -static void release_runtime_lock() +static void thread_lock_release(int dom_id) { /* There is no tricky case here like in acquire, as only the holder of the lock can change it. (Here, that's us) */ - struct caml_locking_scheme* s; - s = atomic_load(&caml_locking_scheme); + struct caml_locking_scheme *s; + s = atomic_load(&Locking_scheme(dom_id)); s->unlock(s->context); } -/* Hook for scanning the stacks of the other threads */ +/* The remaining fields are accessed while holding the domain lock */ + +/* The descriptor for the currently executing thread for this domain; + also the head of a circular list of thread descriptors for this + domain. Invariant: at every safe point, either Active_thread is + NULL, or Caml_state is setup for Active_thread. */ +#define Active_thread thread_table[Caml_state->id].active_thread + +/* Whether the "tick" thread is already running for this domain */ +#define Tick_thread_running thread_table[Caml_state->id].tick_thread_running -static void (*prev_scan_roots_hook) (scanning_action); +/* Whether the "tick" thread is disabled for this domain */ +#define Tick_thread_disabled thread_table[Caml_state->id].tick_thread_disabled -static void caml_thread_scan_roots(scanning_action action) +/* The thread identifier of the "tick" thread for this domain */ +#define Tick_thread_id thread_table[Caml_state->id].tick_thread_id + +/* Identifier for next thread creation */ +static atomic_uintnat thread_next_id = 0; + +/* Forward declarations */ +static value caml_threadstatus_new (void); +static void caml_threadstatus_terminate (value); +static st_retcode caml_threadstatus_wait (value); + +static int default_can_skip_yield(st_masterlock *m) { - caml_thread_t th = curr_thread; - do { - (*action)(th->descr, &th->descr); - (*action)(th->backtrace_last_exn, &th->backtrace_last_exn); - /* Don't rescan the stack of the current thread, it was done already */ - if (th != curr_thread) { -#ifdef NATIVE_CODE - if (th->bottom_of_stack != NULL) - caml_do_local_roots(action, action, th->bottom_of_stack, th->last_retaddr, - th->gc_regs, th->local_roots, th->local_arenas); -#else - caml_do_local_roots(action, th->sp, th->stack_high, th->local_roots); -#endif - } - th = th->next; - } while (th != curr_thread); - /* Hook */ - if (prev_scan_roots_hook != NULL) (*prev_scan_roots_hook)(action); + return st_masterlock_waiters(m) == 0; } -/* Hook for iterating over Memprof's entries arrays */ - -static void memprof_ctx_iter(th_ctx_action f, void* data) +static void default_reinitialize_after_fork(st_masterlock *m) { - caml_thread_t th = curr_thread; - do { - f(th->memprof_ctx, data); - th = th->next; - } while (th != curr_thread); + m->init = 0; /* force initialization */ + st_masterlock_init(m); } -static void thread_save_runtime_state(void) +/* Hook for scanning the stacks of the other threads */ + +static scan_roots_hook prev_scan_roots_hook; + +static void caml_thread_scan_roots( + scanning_action action, scanning_action_flags fflags, void *fdata, + caml_domain_state *domain_state) { - if (Caml_state->_in_minor_collection) - caml_fatal_error("Thread switch from inside minor GC"); -#ifdef NATIVE_CODE - curr_thread->top_of_stack = Caml_state->_top_of_stack; - curr_thread->bottom_of_stack = Caml_state->_bottom_of_stack; - curr_thread->last_retaddr = Caml_state->_last_return_address; - curr_thread->gc_regs = Caml_state->_gc_regs; - curr_thread->exception_pointer = Caml_state->_exception_pointer; - curr_thread->async_exception_pointer = Caml_state->_async_exception_pointer; - curr_thread->local_arenas = caml_get_local_arenas(); -#else - curr_thread->stack_low = Caml_state->_stack_low; - curr_thread->stack_high = Caml_state->_stack_high; - curr_thread->stack_threshold = Caml_state->_stack_threshold; - curr_thread->sp = Caml_state->_extern_sp; - curr_thread->trapsp = Caml_state->_trapsp; - curr_thread->external_raise = Caml_state->_external_raise; - curr_thread->external_raise_async = Caml_state->_external_raise_async; + caml_thread_t th; + + th = Active_thread; + + /* GC could be triggered before [Active_thread] is initialized */ + if (th != NULL) { + do { + (*action)(fdata, th->descr, &th->descr); + (*action)(fdata, th->backtrace_last_exn, &th->backtrace_last_exn); + if (th != Active_thread) { + if (th->current_stack != NULL) + caml_do_local_roots(action, fflags, fdata, + th->local_roots, th->current_stack, th->gc_regs, + th->local_arenas); + } + th = th->next; + } while (th != Active_thread); + + }; + + if (prev_scan_roots_hook != NULL) + (*prev_scan_roots_hook)(action, fflags, fdata, domain_state); + + return; +} + +static void save_runtime_state(void) +{ + CAMLassert(Active_thread == This_thread); + caml_thread_t th = Active_thread; + CAMLassert(th != NULL); + th->current_stack = Caml_state->current_stack; + th->c_stack = Caml_state->c_stack; + th->gc_regs = Caml_state->gc_regs; + th->gc_regs_buckets = Caml_state->gc_regs_buckets; + th->exn_handler = Caml_state->exn_handler; + th->async_exn_handler = Caml_state->async_exn_handler; + th->local_roots = Caml_state->local_roots; + th->local_arenas = caml_get_local_arenas(Caml_state); + th->backtrace_pos = Caml_state->backtrace_pos; + th->backtrace_buffer = Caml_state->backtrace_buffer; + th->backtrace_last_exn = Caml_state->backtrace_last_exn; +#ifndef NATIVE_CODE + th->trap_sp_off = Caml_state->trap_sp_off; + th->trap_barrier_off = Caml_state->trap_barrier_off; + th->external_raise = Caml_state->external_raise; + th->external_raise_async = Caml_state->external_raise_async; #endif - curr_thread->local_roots = Caml_state->_local_roots; - curr_thread->backtrace_pos = Caml_state->_backtrace_pos; - curr_thread->backtrace_buffer = Caml_state->_backtrace_buffer; - curr_thread->backtrace_last_exn = Caml_state->_backtrace_last_exn; - caml_memprof_leave_thread(); } -static void thread_restore_runtime_state(void) +CAMLexport void caml_thread_save_runtime_state(void) { -#ifdef NATIVE_CODE - Caml_state->_top_of_stack = curr_thread->top_of_stack; - Caml_state->_bottom_of_stack= curr_thread->bottom_of_stack; - Caml_state->_last_return_address = curr_thread->last_retaddr; - Caml_state->_gc_regs = curr_thread->gc_regs; - Caml_state->_exception_pointer = curr_thread->exception_pointer; - Caml_state->_async_exception_pointer = curr_thread->async_exception_pointer; - caml_set_local_arenas(curr_thread->local_arenas); -#else - Caml_state->_stack_low = curr_thread->stack_low; - Caml_state->_stack_high = curr_thread->stack_high; - Caml_state->_stack_threshold = curr_thread->stack_threshold; - Caml_state->_extern_sp = curr_thread->sp; - Caml_state->_trapsp = curr_thread->trapsp; - Caml_state->_external_raise = curr_thread->external_raise; - Caml_state->_external_raise_async = curr_thread->external_raise_async; + save_runtime_state(); +} + +static void restore_runtime_state(caml_thread_t th) +{ + CAMLassert(th != NULL); + Active_thread = th; + Caml_state->current_stack = th->current_stack; + Caml_state->c_stack = th->c_stack; + Caml_state->gc_regs = th->gc_regs; + Caml_state->gc_regs_buckets = th->gc_regs_buckets; + Caml_state->exn_handler = th->exn_handler; + Caml_state->async_exn_handler = th->async_exn_handler; + Caml_state->local_roots = th->local_roots; + caml_set_local_arenas(Caml_state, th->local_arenas); + Caml_state->backtrace_pos = th->backtrace_pos; + Caml_state->backtrace_buffer = th->backtrace_buffer; + caml_modify_generational_global_root + (&Caml_state->backtrace_last_exn, th->backtrace_last_exn); +#ifndef NATIVE_CODE + Caml_state->trap_sp_off = th->trap_sp_off; + Caml_state->trap_barrier_off = th->trap_barrier_off; + Caml_state->external_raise = th->external_raise; + Caml_state->external_raise_async = th->external_raise_async; #endif - Caml_state->_local_roots = curr_thread->local_roots; - Caml_state->_backtrace_pos = curr_thread->backtrace_pos; - Caml_state->_backtrace_buffer = curr_thread->backtrace_buffer; - Caml_state->_backtrace_last_exn = curr_thread->backtrace_last_exn; - caml_memprof_enter_thread(curr_thread->memprof_ctx); + caml_memprof_enter_thread(th->memprof); } -CAMLexport void caml_thread_switch_runtime_state(void) +CAMLexport void caml_thread_restore_runtime_state(void) { - caml_thread_t new_thread = st_tls_get(thread_descriptor_key); - if (new_thread == curr_thread) return; - thread_save_runtime_state(); - curr_thread = new_thread; - thread_restore_runtime_state(); + restore_runtime_state(This_thread); } + CAMLexport void caml_switch_runtime_locking_scheme(struct caml_locking_scheme* new) { struct caml_locking_scheme* old; - - old = atomic_exchange(&caml_locking_scheme, new); + int dom_id = Caml_state->id; + save_runtime_state(); + old = atomic_exchange(&Locking_scheme(dom_id), new); /* We hold 'old', but it is no longer the runtime lock */ old->unlock(old->context); - acquire_runtime_lock(); - caml_thread_switch_runtime_state(); + thread_lock_acquire(dom_id); + restore_runtime_state(This_thread); } - -/* Hooks for caml_enter_blocking_section and caml_leave_blocking_section */ - - -static void caml_thread_enter_blocking_section(void) +CAMLexport struct caml_locking_scheme* caml_get_default_locking_scheme(void) { - /* Tell other threads that the runtime is free */ - release_runtime_lock(); + return Default_locking_scheme(Caml_state->id); } -static void caml_thread_leave_blocking_section(void) -{ -#ifdef _WIN32 - /* TlsGetValue calls SetLastError which will mask any error which occurred - prior to the caml_thread_leave_blocking_section call. EnterCriticalSection - does not do this. */ - DWORD error = GetLastError(); -#endif - /* Wait until the runtime is free */ - acquire_runtime_lock(); - caml_thread_switch_runtime_state(); -#ifdef _WIN32 - SetLastError(error); -#endif -} +CAMLprim value caml_thread_cleanup(value unit); -/* Hooks for I/O locking */ - -static void caml_io_mutex_free(struct channel *chan) +static void reset_active(void) { - st_mutex mutex = chan->mutex; - if (mutex != NULL) { - st_mutex_destroy(mutex); - chan->mutex = NULL; - } + Active_thread = NULL; + /* If no other OCaml thread remains, ask the tick thread to stop + so that it does not prevent the whole process from exiting (#9971) */ + caml_thread_cleanup(Val_unit); } -static void caml_io_mutex_lock(struct channel *chan) -{ - st_mutex mutex = chan->mutex; - - if (mutex == NULL) { - st_check_error(st_mutex_create(&mutex), "channel locking"); /*PR#7038*/ - chan->mutex = mutex; - } - /* PR#4351: first try to acquire mutex without releasing the master lock */ - if (st_mutex_trylock(mutex) == MUTEX_PREVIOUSLY_UNLOCKED) { - st_tls_set(last_channel_locked_key, (void *) chan); - return; - } - /* If unsuccessful, block on mutex */ - caml_enter_blocking_section(); - st_mutex_lock(mutex); - /* Problem: if a signal occurs at this point, - and the signal handler raises an exception, we will not - unlock the mutex. The alternative (doing the setspecific - before locking the mutex is also incorrect, since we could - then unlock a mutex that is unlocked or locked by someone else. */ - st_tls_set(last_channel_locked_key, (void *) chan); - caml_leave_blocking_section(); -} +/* Hooks for caml_enter_blocking_section and caml_leave_blocking_section */ -static void caml_io_mutex_unlock(struct channel *chan) +static void caml_thread_enter_blocking_section(void) { - st_mutex_unlock(chan->mutex); - st_tls_set(last_channel_locked_key, NULL); + /* Save the current runtime state in the thread descriptor + of the current thread */ + save_runtime_state(); + /* Tell other threads that the runtime is free */ + thread_lock_release(Caml_state->id); } -static void caml_io_mutex_unlock_exn(void) +static void caml_thread_leave_blocking_section(void) { - struct channel * chan = st_tls_get(last_channel_locked_key); - if (chan != NULL) caml_io_mutex_unlock(chan); + caml_thread_t th = This_thread; + /* Wait until the runtime is free */ + thread_lock_acquire(th->domain_id); + /* Update Active_thread to point to the thread descriptor + corresponding to the thread currently executing and restore the + runtime state */ + restore_runtime_state(th); } -/* Hook for estimating stack usage */ - -static uintnat (*prev_stack_usage_hook)(void); - -static uintnat caml_thread_stack_usage(void) +static int get_pthreads_stack_size(void) { - uintnat sz; - caml_thread_t th; - - /* Don't add stack for current thread, this is done elsewhere */ - for (sz = 0, th = curr_thread->next; - th != curr_thread; - th = th->next) { -#ifdef NATIVE_CODE - if(th->top_of_stack != NULL && th->bottom_of_stack != NULL && - th->top_of_stack > th->bottom_of_stack) - sz += (value *) th->top_of_stack - (value *) th->bottom_of_stack; -#else - sz += th->stack_high - th->sp; -#endif + pthread_attr_t attr; + size_t res = + // default value, retrieved from a recent system (May 2024) + 8388608; + if (pthread_attr_init(&attr) == 0) { + pthread_attr_getstacksize(&attr, &res); } - if (prev_stack_usage_hook != NULL) - sz += prev_stack_usage_hook(); - return sz; + pthread_attr_destroy(&attr); + return res; } /* Create and setup a new thread info block. @@ -432,277 +374,398 @@ static uintnat caml_thread_stack_usage(void) static caml_thread_t caml_thread_new_info(void) { caml_thread_t th; - th = (caml_thread_t) caml_stat_alloc_noexc(sizeof(struct caml_thread_struct)); + caml_domain_state *domain_state; + uintnat stack_wsize = caml_get_init_stack_wsize(get_pthreads_stack_size()); + + domain_state = Caml_state; + th = NULL; + th = (caml_thread_t)caml_stat_alloc_noexc(sizeof(struct caml_thread_struct)); if (th == NULL) return NULL; - th->descr = Val_unit; /* filled later */ -#ifdef NATIVE_CODE - th->bottom_of_stack = NULL; - th->top_of_stack = NULL; - th->last_retaddr = 1; - th->exception_pointer = NULL; - th->async_exception_pointer = NULL; + th->descr = Val_unit; + th->next = NULL; + th->prev = NULL; + th->domain_id = domain_state->id; + th->current_stack = caml_alloc_main_stack(stack_wsize); + if (th->current_stack == NULL) { + caml_stat_free(th); + return NULL; + } + th->c_stack = NULL; th->local_roots = NULL; th->local_arenas = NULL; - th->exit_buf = NULL; -#else - /* Allocate the stacks */ - th->stack_low = (value *) caml_stat_alloc(Thread_stack_size); - th->stack_high = th->stack_low + Thread_stack_size / sizeof(value); - th->stack_threshold = th->stack_low + Stack_threshold / sizeof(value); - th->sp = th->stack_high; - th->trapsp = th->stack_high; - th->local_roots = NULL; - th->external_raise = NULL; - th->external_raise_async = NULL; -#endif th->backtrace_pos = 0; th->backtrace_buffer = NULL; th->backtrace_last_exn = Val_unit; - th->memprof_ctx = caml_memprof_new_th_ctx(); + th->gc_regs = NULL; + th->gc_regs_buckets = NULL; + th->exn_handler = NULL; + th->async_exn_handler = NULL; + +#ifndef NATIVE_CODE + th->trap_sp_off = 1; + th->trap_barrier_off = 2; + th->external_raise = NULL; + th->external_raise_async = NULL; +#endif + + th->memprof = caml_memprof_new_thread(domain_state); return th; } +/* Free the resources held by a thread. */ +void caml_thread_free_info(caml_thread_t th) +{ + /* the following fields do not need any specific cleanup: + descr: heap-allocated + c_stack: stack-allocated + local_roots: stack-allocated + backtrace_last_exn: heap-allocated + gc_regs: + must be empty for a terminated thread + (we assume that the C call stack must be empty at + thread-termination point, so there are no gc_regs buckets in + use in this variable nor on the stack) + exn_handler: stack-allocated + external_raise: stack-allocated + async_exn_handler: stack-allocated + external_raise_async: stack-allocated + init_mask: stack-allocated + */ + caml_free_stack(th->current_stack); + caml_free_backtrace_buffer(th->backtrace_buffer); + + // CR sdolan: free local arenas + + /* Remark: we could share gc_regs_buckets between threads on a same + domain, but this might break the invariant that it is always + non-empty at the point where we switch from OCaml to C, so we + would need to do something more complex when activating a thread + to restore this invariant. */ + caml_free_gc_regs_buckets(th->gc_regs_buckets); + + caml_stat_free(th); +} + /* Allocate a thread descriptor block. */ static value caml_thread_new_descriptor(value clos) { - value mu = Val_unit; + CAMLparam1(clos); + CAMLlocal1(mu); value descr; - Begin_roots2 (clos, mu) - /* Create and initialize the termination semaphore */ - mu = caml_threadstatus_new(); - /* Create a descriptor for the new thread */ - descr = caml_alloc_small(3, 0); - Ident(descr) = Val_long(thread_next_ident); - Start_closure(descr) = clos; - Terminated(descr) = mu; - thread_next_ident++; - End_roots(); - return descr; + /* Create and initialize the termination semaphore */ + mu = caml_threadstatus_new(); + /* Create a descriptor for the new thread */ + descr = caml_alloc_3(0, Val_long(atomic_fetch_add(&thread_next_id, +1)), + clos, mu); + CAMLreturn(descr); } -/* Remove a thread info block from the list of threads. - Free it and its stack resources. */ - -static void caml_thread_remove_info(caml_thread_t th) +/* Remove a thread info block from the list of threads + and free its resources. */ +static void caml_thread_remove_and_free(caml_thread_t th) { if (th->next == th) - all_threads = NULL; /* last OCaml thread exiting */ - else if (all_threads == th) - all_threads = th->next; /* PR#5295 */ + reset_active(); /* last OCaml thread exiting */ + else if (Active_thread == th) + restore_runtime_state(th->next); /* PR#5295 */ th->next->prev = th->prev; th->prev->next = th->next; -#ifndef NATIVE_CODE - caml_stat_free(th->stack_low); -#endif - if (th->backtrace_buffer != NULL) caml_stat_free(th->backtrace_buffer); - caml_stat_free(th); + + caml_thread_free_info(th); + return; } /* Reinitialize the thread machinery after a fork() (PR#4577) */ +/* TODO(engil): more work on the multicore fork machinery. */ static void caml_thread_reinitialize(void) { struct channel * chan; - struct caml_locking_scheme* s; - - /* Remove all other threads (now nonexistent) - from the doubly-linked list of threads */ - while (curr_thread->next != curr_thread) { - caml_memprof_delete_th_ctx(curr_thread->next->memprof_ctx); - caml_thread_remove_info(curr_thread->next); + caml_thread_t th, next; + + th = Active_thread->next; + while (th != Active_thread) { + next = th->next; + caml_memprof_delete_thread(th->memprof); + caml_thread_free_info(th); + th = next; } - - /* Reinitialize the master lock machinery, - just in case the fork happened while other threads were doing - caml_leave_blocking_section */ - s = atomic_load(&caml_locking_scheme); + Active_thread->next = Active_thread; + Active_thread->prev = Active_thread; + + // CR ocaml 5 domains: systhreads doesn't maintain domain lock + /* Within the child, the domain_lock needs to be reset and acquired. */ + // caml_reset_domain_lock(); + // caml_acquire_domain_lock(); + + /* The lock needs to be initialized again. This process will also be + the effective owner of the lock. So there is no need to run + s->lock (busy = 1) */ + struct caml_locking_scheme *s = atomic_load(&Locking_scheme(Caml_state->id)); s->reinitialize_after_fork(s->context); - /* Tick thread is not currently running in child process, will be - re-created at next Thread.create */ - caml_tick_thread_running = 0; - /* Destroy all IO mutexes; will be reinitialized on demand */ + + /* Reinitialize IO mutexes, in case the fork happened while another thread + had locked the channel. If so, we're likely in an inconsistent state, + but we may be able to proceed anyway. */ + caml_plat_mutex_init(&caml_all_opened_channels_mutex); for (chan = caml_all_opened_channels; chan != NULL; chan = chan->next) { - if (chan->mutex != NULL) { - st_mutex_destroy(chan->mutex); - chan->mutex = NULL; - } + caml_plat_mutex_init(&chan->mutex); } } -/* Initialize the thread machinery */ +CAMLprim value caml_thread_join(value th); + +/* This hook is run when a domain shuts down (see domains.c). + + When a domain shuts down, the state must be cleared to allow proper reuse of + the domain slot the next time a domain is started on this slot. If a program + is single-domain, we mimic OCaml 4's behavior and do not care about ongoing + thread: the program will exit. */ +static void caml_thread_domain_stop_hook(void) { + /* If the program runs multiple domains, we should not let systhreads to hang + around when a domain exit. If the domain is not the last one (and the last + one will always be domain 0) we force the domain to join on every thread + on its chain before wrapping up. */ + if (!caml_domain_alone()) { + + while (Active_thread->next != Active_thread) { + caml_thread_join(Active_thread->next->descr); + } -CAMLprim value caml_thread_initialize(value unit) /* ML */ + /* another domain thread may be joining on this domain's descriptor */ + caml_threadstatus_terminate(Terminated(Active_thread->descr)); + /* Shut down the tick thread */ + reset_active(); + /* We free the thread info but not its resources: they are owned + by Caml_state at this point, and will be cleaned-up later. */ + caml_stat_free(This_thread); + }; +} + +static void caml_thread_domain_initialize_hook(void) { - /* Protect against repeated initialization (PR#3532) */ - if (curr_thread != NULL) return Val_unit; + + caml_thread_t new_thread; + /* OS-specific initialization */ st_initialize(); - /* Initialize and acquire the master lock */ - st_masterlock_init(&default_master_lock); - caml_locking_scheme = &caml_default_locking_scheme; - /* Initialize the keys */ - st_tls_newkey(&thread_descriptor_key); - st_tls_newkey(&last_channel_locked_key); - /* Set up a thread info block for the current thread */ - curr_thread = + + st_masterlock *default_lock = Default_lock(Caml_state->id); + st_masterlock_init(default_lock); + struct caml_locking_scheme *ls = Default_locking_scheme(Caml_state->id); + ls->context = default_lock; + ls->lock = (void (*)(void*))&st_masterlock_acquire; + ls->unlock = (void (*)(void*))&st_masterlock_release; + ls->thread_start = NULL; + ls->thread_stop = NULL; + ls->reinitialize_after_fork = (void (*)(void*))&default_reinitialize_after_fork; + ls->can_skip_yield = (int (*)(void*))&default_can_skip_yield; + ls->yield = (void (*)(void*))&st_thread_yield; + + Locking_scheme(Caml_state->id) = ls; + + new_thread = (caml_thread_t) caml_stat_alloc(sizeof(struct caml_thread_struct)); - curr_thread->descr = caml_thread_new_descriptor(Val_unit); - curr_thread->next = curr_thread; - curr_thread->prev = curr_thread; - all_threads = curr_thread; - curr_thread->backtrace_last_exn = Val_unit; -#ifdef NATIVE_CODE - curr_thread->exit_buf = &caml_termination_jmpbuf; -#endif - curr_thread->memprof_ctx = &caml_memprof_main_ctx; - /* The stack-related fields will be filled in at the next - caml_enter_blocking_section */ - /* Associate the thread descriptor with the thread */ - st_tls_set(thread_descriptor_key, (void *) curr_thread); - st_thread_set_id(Ident(curr_thread->descr)); - /* Set up the hooks */ - prev_scan_roots_hook = caml_scan_roots_hook; - caml_scan_roots_hook = caml_thread_scan_roots; - caml_enter_blocking_section_hook = caml_thread_enter_blocking_section; - caml_leave_blocking_section_hook = caml_thread_leave_blocking_section; -#ifdef NATIVE_CODE - caml_termination_hook = st_thread_exit; -#endif - caml_channel_mutex_free = caml_io_mutex_free; - caml_channel_mutex_lock = caml_io_mutex_lock; - caml_channel_mutex_unlock = caml_io_mutex_unlock; - caml_channel_mutex_unlock_exn = caml_io_mutex_unlock_exn; - prev_stack_usage_hook = caml_stack_usage_hook; - caml_stack_usage_hook = caml_thread_stack_usage; - caml_memprof_th_ctx_iter_hook = memprof_ctx_iter; - /* Set up fork() to reinitialize the thread machinery in the child - (PR#4577) */ - st_atfork(caml_thread_reinitialize); - return Val_unit; -} -/* Start tick thread, if not already running */ -static st_retcode start_tick_thread() -{ - st_retcode err; - if (caml_tick_thread_running) return 0; - err = st_thread_create(&caml_tick_thread_id, caml_thread_tick, NULL); - if (err == 0) caml_tick_thread_running = 1; - return err; + new_thread->domain_id = Caml_state->id; + new_thread->descr = caml_thread_new_descriptor(Val_unit); + new_thread->next = new_thread; + new_thread->prev = new_thread; + new_thread->backtrace_last_exn = Val_unit; + new_thread->memprof = caml_memprof_main_thread(Caml_state); + + st_tls_set(caml_thread_key, new_thread); + + Active_thread = new_thread; + caml_memprof_enter_thread(new_thread->memprof); } -/* Stop tick thread, if currently running */ -static void stop_tick_thread() +CAMLprim value caml_thread_yield(value unit); + +void caml_thread_interrupt_hook(void) { - if (!caml_tick_thread_running) return; - caml_tick_thread_stop = 1; - st_thread_join(caml_tick_thread_id); - caml_tick_thread_stop = 0; - caml_tick_thread_running = 0; + /* Do not attempt to yield from the backup thread */ + if (caml_bt_is_self()) return; + + uintnat is_on = 1; + atomic_uintnat* req_external_interrupt = + &Caml_state->requested_external_interrupt; + + if (atomic_compare_exchange_strong(req_external_interrupt, &is_on, 0)) { + caml_thread_yield(Val_unit); + } + + return; } -CAMLprim value caml_enable_tick_thread(value v_enable) +/* [caml_thread_initialize] initialises the systhreads infrastructure. This + function first sets up the chain for systhreads on this domain, then setup + the global variables and hooks for systhreads to cooperate with the runtime + system. */ +CAMLprim value caml_thread_initialize(value unit) { - int enable = Long_val(v_enable) ? 1 : 0; + /* Protect against repeated initialization (PR#3532) */ + if (Active_thread != NULL) return Val_unit; - if (enable) { - st_retcode err = start_tick_thread(); - st_check_error(err, "caml_enable_tick_thread"); - } else { - stop_tick_thread(); - } + if (!caml_domain_alone()) + caml_failwith("caml_thread_initialize: cannot initialize Thread " + "while several domains are running."); + + /* Initialize the key to the [caml_thread_t] structure */ + st_tls_newkey(&caml_thread_key); + + /* First initialise the systhread chain on this domain */ + caml_thread_domain_initialize_hook(); + + prev_scan_roots_hook = atomic_exchange(&caml_scan_roots_hook, + caml_thread_scan_roots); + caml_enter_blocking_section_hook = caml_thread_enter_blocking_section; + caml_leave_blocking_section_hook = caml_thread_leave_blocking_section; + caml_domain_external_interrupt_hook = caml_thread_interrupt_hook; + caml_domain_initialize_hook = caml_thread_domain_initialize_hook; + caml_domain_stop_hook = caml_thread_domain_stop_hook; + caml_atfork_hook = caml_thread_reinitialize; - caml_tick_thread_enabled = enable; return Val_unit; } -/* Cleanup the thread machinery when the runtime is shut down. Joining the tick - thread take 25ms on average / 50ms in the worst case, so we don't do it on - program exit. */ +static void stop_tick_thread(void) +{ + if (!Tick_thread_running) return; + atomic_store_release(&Tick_thread_stop, 1); + st_thread_join(Tick_thread_id); + atomic_store_release(&Tick_thread_stop, 0); + Tick_thread_running = 0; +} -CAMLprim value caml_thread_cleanup(value unit) /* ML */ +CAMLprim value caml_thread_cleanup(value unit) { stop_tick_thread(); return Val_unit; } -/* Thread cleanup at termination */ - static void caml_thread_stop(void) { /* PR#5188, PR#7220: some of the global runtime state may have changed as the thread was running, so we save it in the - curr_thread data to make sure that the cleanup logic + This_thread data to make sure that the cleanup logic below uses accurate information. */ - thread_save_runtime_state(); - /* Tell memprof that this thread is terminating. */ - caml_memprof_delete_th_ctx(curr_thread->memprof_ctx); + save_runtime_state(); + + /* The main domain thread does not go through [caml_thread_stop]. There is + always one more thread in the chain at this point in time. */ + CAMLassert(Active_thread->next != Active_thread); + + /* Tell memprof that this thread is terminating */ + caml_memprof_delete_thread(Active_thread->memprof); + /* Signal that the thread has terminated */ - caml_threadstatus_terminate(Terminated(curr_thread->descr)); - /* Remove th from the doubly-linked list of threads and free its info block */ - caml_thread_remove_info(curr_thread); - /* If no other OCaml thread remains, ask the tick thread to stop - so that it does not prevent the whole process from exiting (#9971) */ - if (all_threads == NULL) caml_thread_cleanup(Val_unit); - /* OS-specific cleanups */ - st_thread_cleanup(); - /* Release the runtime system */ - release_runtime_lock(); + caml_threadstatus_terminate(Terminated(Active_thread->descr)); + + /* The following also sets Active_thread to a sane value in case the + backup thread does a GC before the domain lock is acquired + again. */ + caml_thread_remove_and_free(Active_thread); + thread_lock_release(Caml_state->id); } /* Create a thread */ -static ST_THREAD_FUNCTION caml_thread_start(void * arg) +/* the thread lock is not held when entering */ +static void * caml_thread_start(void * v) { - caml_thread_t th = (caml_thread_t) arg; + caml_thread_t th = (caml_thread_t) v; + int dom_id = th->domain_id; value clos; void * signal_stack; - struct caml_locking_scheme* sch; -#ifdef NATIVE_CODE - struct longjmp_buffer termination_buf; - char tos; - /* Record top of stack (approximative) */ - th->top_of_stack = &tos; + + caml_init_domain_self(dom_id); + + st_tls_set(caml_thread_key, th); + struct caml_locking_scheme *s = atomic_load(&Locking_scheme(dom_id)); + if (s -> thread_start != NULL) + s->thread_start(s->context, Thread_type_caml); + + thread_lock_acquire(dom_id); + restore_runtime_state(th); + signal_stack = caml_init_signal_stack(); + +#ifdef POSIX_SIGNALS + /* restore the signal mask from the spawning thread, now it is safe for the + signal handler to run (as Caml_state is initialised) */ + pthread_sigmask(SIG_SETMASK, &th->init_mask, NULL); #endif - /* Associate the thread descriptor with the thread */ - st_tls_set(thread_descriptor_key, (void *) th); - st_thread_set_id(Ident(th->descr)); - sch = atomic_load(&caml_locking_scheme); - if (sch->thread_start != NULL) - sch->thread_start(sch->context, Thread_type_caml); - /* Acquire the global mutex */ - caml_leave_blocking_section(); - st_thread_set_id(Ident(th->descr)); - signal_stack = caml_setup_stack_overflow_detection(); -#ifdef NATIVE_CODE - /* Setup termination handler (for caml_thread_exit) */ - if (sigsetjmp(termination_buf.buf, 0) == 0) { - th->exit_buf = &termination_buf; + clos = Start_closure(Active_thread->descr); + caml_modify(&(Start_closure(Active_thread->descr)), Val_unit); + caml_callback_exn(clos, Val_unit); + caml_thread_stop(); + s = atomic_load(&Locking_scheme(dom_id)); + if (s->thread_stop != NULL) + s->thread_stop(s->context, Thread_type_caml); + caml_free_signal_stack(signal_stack); + return 0; +} + +static int create_tick_thread(void) +{ + int err; +#ifdef POSIX_SIGNALS + sigset_t mask, old_mask; + + /* Block all signals so that we don't try to execute an OCaml signal + handler in the new tick thread */ + sigfillset(&mask); + pthread_sigmask(SIG_BLOCK, &mask, &old_mask); #endif - /* Callback the closure */ - clos = Start_closure(th->descr); - caml_modify(&(Start_closure(th->descr)), Val_unit); - caml_callback_exn(clos, Val_unit); - caml_thread_stop(); - sch = atomic_load(&caml_locking_scheme); - if (sch->thread_stop != NULL) - sch->thread_stop(sch->context, Thread_type_caml); -#ifdef NATIVE_CODE - } + + err = st_thread_create(&Tick_thread_id, caml_thread_tick, + (void *) &Caml_state->id); + +#ifdef POSIX_SIGNALS + pthread_sigmask(SIG_SETMASK, &old_mask, NULL); #endif - caml_stop_stack_overflow_detection(signal_stack); - /* The thread now stops running */ - return 0; + + return err; +} + +static st_retcode start_tick_thread(void) +{ + if (Tick_thread_running) return 0; + st_retcode err = create_tick_thread(); + if (err == 0) Tick_thread_running = 1; + return err; +} + +CAMLprim value caml_enable_tick_thread(value v_enable) +{ + int enable = Long_val(v_enable) ? 1 : 0; + + if (enable) { + st_retcode err = start_tick_thread(); + sync_check_error(err, "caml_enable_tick_thread"); + } else { + stop_tick_thread(); + } + + Tick_thread_disabled = !enable; + return Val_unit; } -CAMLprim value caml_thread_new(value clos) /* ML */ +CAMLprim value caml_thread_new(value clos) { + CAMLparam1(clos); caml_thread_t th; st_retcode err; +#ifdef POSIX_SIGNALS + sigset_t mask, old_mask; + + sigfillset(&mask); + pthread_sigmask(SIG_BLOCK, &mask, &old_mask); +#endif #ifndef NATIVE_CODE if (caml_debugger_in_use) @@ -710,175 +773,160 @@ CAMLprim value caml_thread_new(value clos) /* ML */ #endif /* Create a thread info block */ th = caml_thread_new_info(); - if (th == NULL) caml_raise_out_of_memory(); - /* Equip it with a thread descriptor */ + + if (th == NULL) + caml_raise_out_of_memory(); + th->descr = caml_thread_new_descriptor(clos); - /* Add thread info block to the list of threads */ - th->next = curr_thread->next; - th->prev = curr_thread; - curr_thread->next->prev = th; - curr_thread->next = th; - /* Create the new thread */ + +#ifdef POSIX_SIGNALS + th->init_mask = old_mask; +#endif + + th->next = Active_thread->next; + th->prev = Active_thread; + + Active_thread->next->prev = th; + Active_thread->next = th; + err = st_thread_create(NULL, caml_thread_start, (void *) th); + +#ifdef POSIX_SIGNALS + /* regardless of error, return our sigmask to the original state */ + pthread_sigmask(SIG_SETMASK, &old_mask, NULL); +#endif + if (err != 0) { /* Creation failed, remove thread info block from list of threads */ - caml_thread_remove_info(th); - st_check_error(err, "Thread.create"); + caml_thread_remove_and_free(th); + sync_check_error(err, "Thread.create"); } - /* Create the tick thread if not already done. - Because of PR#4666, we start the tick thread late, only when we create - the first additional thread in the current process*/ - if (caml_tick_thread_enabled) { + + if (!Tick_thread_disabled) { err = start_tick_thread(); - st_check_error(err, "Thread.create"); + sync_check_error(err, "Thread.create"); } - return th->descr; + CAMLreturn(th->descr); } /* Register a thread already created from C */ +#define Dom_c_threads 0 + +/* the thread lock is not held when entering */ CAMLexport int caml_c_thread_register(void) { - caml_thread_t th; - struct caml_locking_scheme* sch; -#ifdef NATIVE_CODE - st_retcode err; -#endif + /* Already registered? */ + if (This_thread != NULL) return 0; - sch = atomic_load(&caml_locking_scheme); - if (sch->thread_start != NULL) - sch->thread_start(sch->context, Thread_type_c_registered); + struct caml_locking_scheme *s = atomic_load(&Locking_scheme(Dom_c_threads)); + if (s->thread_start != NULL) + s->thread_start(s->context, Thread_type_c_registered); - /* Already registered? */ - if (st_tls_get(thread_descriptor_key) != NULL) return 0; + CAMLassert(Caml_state_opt == NULL); + caml_init_domain_self(Dom_c_threads); + + /* Take master lock to protect access to the runtime */ + thread_lock_acquire(Dom_c_threads); /* Create a thread info block */ - th = caml_thread_new_info(); - if (th == NULL) return 0; -#ifdef NATIVE_CODE - th->top_of_stack = (char *) &err; -#endif - /* Take master lock to protect access to the chaining of threads */ - acquire_runtime_lock(); + caml_thread_t th = caml_thread_new_info(); + /* If it fails, we release the lock and return an error. */ + if (th == NULL) { + thread_lock_release(Dom_c_threads); + return 0; + } /* Add thread info block to the list of threads */ - if (all_threads == NULL) { + if (Active_thread == NULL) { th->next = th; th->prev = th; - all_threads = th; + Active_thread = th; } else { - th->next = all_threads->next; - th->prev = all_threads; - all_threads->next->prev = th; - all_threads->next = th; + th->next = Active_thread->next; + th->prev = Active_thread; + Active_thread->next->prev = th; + Active_thread->next = th; } /* Associate the thread descriptor with the thread */ - st_tls_set(thread_descriptor_key, (void *) th); - /* Release the master lock */ - release_runtime_lock(); - /* Now we can re-enter the run-time system and heap-allocate the descriptor */ - caml_leave_blocking_section(); + st_tls_set(caml_thread_key, (void *) th); + + /* Prepare Caml_state for allocation etc., so its various members correspond + to those for the newly-registered thread */ + restore_runtime_state(th); + + /* Allocate the thread descriptor on the heap */ th->descr = caml_thread_new_descriptor(Val_unit); /* no closure */ - st_thread_set_id(Ident(th->descr)); - /* Create the tick thread if not already done. */ - if (caml_tick_thread_enabled) start_tick_thread(); - /* Exit the run-time system */ - caml_enter_blocking_section(); + + if (!Tick_thread_disabled) { + st_retcode err = start_tick_thread(); + sync_check_error(err, "caml_register_c_thread"); + } + + /* Save any modifications to Caml_state back to the thread descriptor */ + save_runtime_state(); + + /* Release the master lock */ + thread_lock_release(Dom_c_threads); return 1; } /* Unregister a thread that was created from C and registered with the function above */ +/* the thread lock is not held when entering */ CAMLexport int caml_c_thread_unregister(void) { - struct caml_locking_scheme* sch; - caml_thread_t th = st_tls_get(thread_descriptor_key); - /* Not registered? */ + caml_thread_t th = This_thread; + + /* If this thread is not set, then it was not registered */ if (th == NULL) return 0; /* Wait until the runtime is available */ - acquire_runtime_lock(); - /* Forget the thread descriptor */ - st_tls_set(thread_descriptor_key, NULL); + thread_lock_acquire(Dom_c_threads); + /* Forget the thread descriptor */ + st_tls_set(caml_thread_key, NULL); /* Remove thread info block from list of threads, and free it */ - caml_thread_remove_info(th); - /* If no other OCaml thread remains, ask the tick thread to stop - so that it does not prevent the whole process from exiting (#9971) */ - if (all_threads == NULL) caml_thread_cleanup(Val_unit); + caml_thread_remove_and_free(th); /* Release the runtime */ - release_runtime_lock(); - sch = atomic_load(&caml_locking_scheme); - if (sch->thread_stop != NULL) - sch->thread_stop(sch->context, Thread_type_c_registered); + thread_lock_release(Dom_c_threads); + struct caml_locking_scheme *s = atomic_load(&Locking_scheme(Dom_c_threads)); + if (s->thread_stop != NULL) + s->thread_stop(s->context, Thread_type_c_registered); return 1; } /* Return the current thread */ -CAMLprim value caml_thread_self(value unit) /* ML */ +CAMLprim value caml_thread_self(value unit) { - if (curr_thread == NULL) - caml_invalid_argument("Thread.self: not initialized"); - return curr_thread->descr; + return Active_thread->descr; } /* Return the identifier of a thread */ -CAMLprim value caml_thread_id(value th) /* ML */ +CAMLprim value caml_thread_id(value th) { return Ident(th); } /* Print uncaught exception and backtrace */ -CAMLprim value caml_thread_uncaught_exception(value exn) /* ML */ +CAMLprim value caml_thread_uncaught_exception(value exn) { char * msg = caml_format_exception(exn); fprintf(stderr, "Thread %d killed on uncaught exception %s\n", - Int_val(Ident(curr_thread->descr)), msg); + Int_val(Ident(Active_thread->descr)), msg); caml_stat_free(msg); - if (Caml_state->_backtrace_active) caml_print_exception_backtrace(); + if (Caml_state->backtrace_active) caml_print_exception_backtrace(); fflush(stderr); return Val_unit; } -/* Terminate current thread */ - -CAMLprim value caml_thread_exit(value unit) /* ML */ -{ - struct longjmp_buffer * exit_buf = NULL; - - if (curr_thread == NULL) - caml_invalid_argument("Thread.exit: not initialized"); - - /* In native code, we cannot call pthread_exit here because on some - systems this raises a C++ exception, and ocamlopt-generated stack - frames cannot be unwound. Instead, we longjmp to the thread - creation point (in caml_thread_start) or to the point in - caml_main where caml_termination_hook will be called. - Note that threads created in C then registered do not have - a creation point (exit_buf == NULL). - */ -#ifdef NATIVE_CODE - exit_buf = curr_thread->exit_buf; -#endif - caml_thread_stop(); - if (exit_buf != NULL) { - /* Native-code and (main thread or thread created by OCaml) */ - siglongjmp(exit_buf->buf, 1); - } else { - /* Bytecode, or thread created from C */ - st_thread_exit(); - } - return Val_unit; /* not reached */ -} - /* Allow re-scheduling */ -CAMLprim value caml_thread_yield(value unit) /* ML */ +CAMLprim value caml_thread_yield(value unit) { - struct caml_locking_scheme* s; - - s = atomic_load(&caml_locking_scheme); - if (s->can_skip_yield != NULL && s->can_skip_yield(s->context)) + struct caml_locking_scheme *s; + s = atomic_load(&Locking_scheme(Caml_state->id)); + if (s->can_skip_yield != NULL && s -> can_skip_yield(s->context)) return Val_unit; /* Do all the parts of a blocking section enter/leave except lock @@ -886,181 +934,30 @@ CAMLprim value caml_thread_yield(value unit) /* ML */ our blocking section doesn't contain anything interesting, don't bother with saving errno.) */ - caml_raise_async_if_exception(caml_process_pending_signals_exn(), - "signal handler"); - /* caml_locking_scheme may have changed in caml_process_pending_signals_exn */ - s = atomic_load(&caml_locking_scheme); + + (void) caml_raise_async_if_exception(caml_process_pending_signals_exn (), ""); + + // s may have changed in caml_process_pending_signals_exn + s = atomic_load(&Locking_scheme(Caml_state->id)); + save_runtime_state(); s->yield(s->context); - if (atomic_load(&caml_locking_scheme) != s) { - /* The lock we have is no longer the runtime lock */ + if (atomic_load(&Locking_scheme(Caml_state->id)) != s) { + // The lock we own is no longer the runtime lock s->unlock(s->context); - acquire_runtime_lock(); + thread_lock_acquire(Caml_state->id); } - caml_thread_switch_runtime_state(); - caml_raise_async_if_exception(caml_process_pending_signals_exn(), - "signal handler"); + restore_runtime_state(This_thread); + (void) caml_raise_async_if_exception(caml_process_pending_signals_exn (), ""); return Val_unit; } /* Suspend the current thread until another thread terminates */ -CAMLprim value caml_thread_join(value th) /* ML */ +CAMLprim value caml_thread_join(value th) { st_retcode rc = caml_threadstatus_wait(Terminated(th)); - st_check_error(rc, "Thread.join"); - return Val_unit; -} - -/* Mutex operations */ - -#define Mutex_val(v) (* ((st_mutex *) Data_custom_val(v))) - -static void caml_mutex_finalize(value wrapper) -{ - st_mutex_destroy(Mutex_val(wrapper)); -} - -static int caml_mutex_compare(value wrapper1, value wrapper2) -{ - st_mutex mut1 = Mutex_val(wrapper1); - st_mutex mut2 = Mutex_val(wrapper2); - return mut1 == mut2 ? 0 : mut1 < mut2 ? -1 : 1; -} - -static intnat caml_mutex_hash(value wrapper) -{ - return (intnat) (Mutex_val(wrapper)); -} - -static struct custom_operations caml_mutex_ops = { - "_mutex", - caml_mutex_finalize, - caml_mutex_compare, - caml_mutex_hash, - custom_serialize_default, - custom_deserialize_default, - custom_compare_ext_default, - custom_fixed_length_default -}; - -CAMLprim value caml_mutex_new(value unit) /* ML */ -{ - st_mutex mut = NULL; /* suppress warning */ - value wrapper; - st_check_error(st_mutex_create(&mut), "Mutex.create"); - wrapper = caml_alloc_custom(&caml_mutex_ops, sizeof(st_mutex *), - 0, 1); - Mutex_val(wrapper) = mut; - return wrapper; -} - -CAMLprim value caml_mutex_lock(value wrapper) /* ML */ -{ - st_mutex mut = Mutex_val(wrapper); - st_retcode retcode; - - /* PR#4351: first try to acquire mutex without releasing the master lock */ - if (st_mutex_trylock(mut) == MUTEX_PREVIOUSLY_UNLOCKED) return Val_unit; - /* If unsuccessful, block on mutex */ - Begin_root(wrapper) /* prevent the deallocation of mutex */ - caml_enter_blocking_section(); - retcode = st_mutex_lock(mut); - caml_leave_blocking_section(); - End_roots(); - st_check_error(retcode, "Mutex.lock"); - return Val_unit; -} - -CAMLprim value caml_mutex_unlock(value wrapper) /* ML */ -{ - st_mutex mut = Mutex_val(wrapper); - st_retcode retcode; - /* PR#4351: no need to release and reacquire master lock */ - retcode = st_mutex_unlock(mut); - st_check_error(retcode, "Mutex.unlock"); - return Val_unit; -} - -CAMLprim value caml_mutex_try_lock(value wrapper) /* ML */ -{ - st_mutex mut = Mutex_val(wrapper); - st_retcode retcode; - retcode = st_mutex_trylock(mut); - if (retcode == MUTEX_ALREADY_LOCKED) return Val_false; - st_check_error(retcode, "Mutex.try_lock"); - return Val_true; -} - -/* Conditions operations */ - -#define Condition_val(v) (* (st_condvar *) Data_custom_val(v)) - -static void caml_condition_finalize(value wrapper) -{ - st_condvar_destroy(Condition_val(wrapper)); -} - -static int caml_condition_compare(value wrapper1, value wrapper2) -{ - st_condvar cond1 = Condition_val(wrapper1); - st_condvar cond2 = Condition_val(wrapper2); - return cond1 == cond2 ? 0 : cond1 < cond2 ? -1 : 1; -} - -static intnat caml_condition_hash(value wrapper) -{ - return (intnat) (Condition_val(wrapper)); -} - -static struct custom_operations caml_condition_ops = { - "_condition", - caml_condition_finalize, - caml_condition_compare, - caml_condition_hash, - custom_serialize_default, - custom_deserialize_default, - custom_compare_ext_default, - custom_fixed_length_default -}; - -CAMLprim value caml_condition_new(value unit) /* ML */ -{ - st_condvar cond = NULL; /* suppress warning */ - value wrapper; - st_check_error(st_condvar_create(&cond), "Condition.create"); - wrapper = caml_alloc_custom(&caml_condition_ops, sizeof(st_condvar *), - 0, 1); - Condition_val(wrapper) = cond; - return wrapper; -} - -CAMLprim value caml_condition_wait(value wcond, value wmut) /* ML */ -{ - st_condvar cond = Condition_val(wcond); - st_mutex mut = Mutex_val(wmut); - st_retcode retcode; - - Begin_roots2(wcond, wmut) /* prevent deallocation of cond and mutex */ - caml_enter_blocking_section(); - retcode = st_condvar_wait(cond, mut); - caml_leave_blocking_section(); - End_roots(); - st_check_error(retcode, "Condition.wait"); - return Val_unit; -} - -CAMLprim value caml_condition_signal(value wrapper) /* ML */ -{ - st_check_error(st_condvar_signal(Condition_val(wrapper)), - "Condition.signal"); - return Val_unit; -} - -CAMLprim value caml_condition_broadcast(value wrapper) /* ML */ -{ - st_check_error(st_condvar_broadcast(Condition_val(wrapper)), - "Condition.broadcast"); + sync_check_error(rc, "Thread.join"); return Val_unit; } @@ -1095,8 +992,9 @@ static value caml_threadstatus_new (void) { st_event ts = NULL; /* suppress warning */ value wrapper; - st_check_error(st_event_create(&ts), "Thread.create"); - wrapper = caml_alloc_custom(&caml_threadstatus_ops, sizeof(st_event *), + sync_check_error(st_event_create(&ts), "Thread.create"); + wrapper = caml_alloc_custom(&caml_threadstatus_ops, + sizeof(st_event *), 0, 1); Threadstatus_val(wrapper) = ts; return wrapper; @@ -1109,13 +1007,13 @@ static void caml_threadstatus_terminate (value wrapper) static st_retcode caml_threadstatus_wait (value wrapper) { + CAMLparam1(wrapper); /* prevent deallocation of ts */ st_event ts = Threadstatus_val(wrapper); st_retcode retcode; - Begin_roots1(wrapper) /* prevent deallocation of ts */ - caml_enter_blocking_section(); - retcode = st_event_wait(ts); - caml_leave_blocking_section(); - End_roots(); - return retcode; + caml_enter_blocking_section(); + retcode = st_event_wait(ts); + caml_leave_blocking_section(); + + CAMLreturnT(st_retcode, retcode); } diff --git a/otherlibs/systhreads/st_win32.h b/otherlibs/systhreads/st_win32.h index 3f598a715de..5092134db09 100644 --- a/otherlibs/systhreads/st_win32.h +++ b/otherlibs/systhreads/st_win32.h @@ -18,520 +18,23 @@ #undef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #include -#include -#include -#include -#include - -#if 1 -#define TRACE(x) -#define TRACE1(x,y) -#else -#include -#define TRACE(x) printf("%d: %s\n", GetCurrentThreadId(), x); fflush(stdout) -#define TRACE1(x,y) printf("%d: %s %p\n", GetCurrentThreadId(), x, (void *)y); \ - fflush(stdout) -#endif - -typedef DWORD st_retcode; - -#define SIGPREEMPTION SIGTERM - -/* Unique thread identifiers and atomic operations over them */ -#ifdef ARCH_SIXTYFOUR -typedef LONG64 st_tid; -#define Tid_Atomic_Exchange InterlockedExchange64 -#define Tid_Atomic_Compare_Exchange InterlockedCompareExchange64 -#else -typedef LONG st_tid; -#define Tid_Atomic_Exchange InterlockedExchange -#define Tid_Atomic_Compare_Exchange InterlockedCompareExchange -#endif - -/* Thread-local storage associating a Win32 event to every thread. */ -static DWORD st_thread_sem_key; - -/* Thread-local storage for the OCaml thread ID. */ -static DWORD st_thread_id_key; - -/* OS-specific initialization */ - -static DWORD st_initialize(void) -{ - DWORD result = 0; - st_thread_sem_key = TlsAlloc(); - if (st_thread_sem_key == TLS_OUT_OF_INDEXES) - return GetLastError(); - st_thread_id_key = TlsAlloc(); - if (st_thread_id_key == TLS_OUT_OF_INDEXES) { - result = GetLastError(); - TlsFree(st_thread_sem_key); - } - return result; -} - -/* Thread creation. Created in detached mode if [res] is NULL. */ - -typedef HANDLE st_thread_id; - -static DWORD st_thread_create(st_thread_id * res, - LPTHREAD_START_ROUTINE fn, void * arg) -{ - HANDLE h = CreateThread(NULL, 0, fn, arg, 0, NULL); - TRACE1("st_thread_create", h); - if (h == NULL) return GetLastError(); - if (res == NULL) - CloseHandle(h); - else - *res = h; - return 0; -} - -#define ST_THREAD_FUNCTION DWORD WINAPI - -/* Cleanup at thread exit */ - -static void st_thread_cleanup(void) -{ - HANDLE ev = (HANDLE) TlsGetValue(st_thread_sem_key); - if (ev != NULL) CloseHandle(ev); -} - -/* Thread termination */ - -CAMLnoreturn_start -static void st_thread_exit(void) -CAMLnoreturn_end; - -static void st_thread_exit(void) -{ - TRACE("st_thread_exit"); - ExitThread(0); -} - -static void st_thread_join(st_thread_id thr) -{ - TRACE1("st_thread_join", h); - WaitForSingleObject(thr, INFINITE); -} - -/* Thread-specific state */ - -typedef DWORD st_tlskey; - -static DWORD st_tls_newkey(st_tlskey * res) -{ - *res = TlsAlloc(); - if (*res == TLS_OUT_OF_INDEXES) - return GetLastError(); - else - return 0; -} - -Caml_inline void * st_tls_get(st_tlskey k) -{ - return TlsGetValue(k); -} - -Caml_inline void st_tls_set(st_tlskey k, void * v) -{ - TlsSetValue(k, v); -} - -/* OS-specific handling of the OCaml thread ID (must be called with the runtime - lock). */ -Caml_inline void st_thread_set_id(intnat id) -{ - CAMLassert(id != 0); - st_tls_set(st_thread_id_key, (void *)id); -} - -/* Return the identifier for the current thread. The 0 value is reserved. */ -Caml_inline intnat st_current_thread_id(void) -{ - intnat id = (intnat)st_tls_get(st_thread_id_key); - CAMLassert(id != 0); - return id; -} - -/* The master lock. */ - -typedef CRITICAL_SECTION st_masterlock; - -static void st_masterlock_init(st_masterlock * m) -{ - TRACE("st_masterlock_init"); - InitializeCriticalSection(m); - EnterCriticalSection(m); -} - -Caml_inline void st_masterlock_acquire(st_masterlock * m) -{ - TRACE("st_masterlock_acquire"); - EnterCriticalSection(m); - TRACE("st_masterlock_acquire (done)"); -} - -Caml_inline void st_masterlock_release(st_masterlock * m) -{ - LeaveCriticalSection(m); - TRACE("st_masterlock_released"); -} - -Caml_inline int st_masterlock_waiters(st_masterlock * m) -{ - return 1; /* info not maintained */ -} - -/* Scheduling hints */ - -Caml_inline void st_thread_yield(st_masterlock * m) -{ - LeaveCriticalSection(m); - Sleep(0); - EnterCriticalSection(m); -} - -/* Mutexes */ - -struct st_mutex_ { - CRITICAL_SECTION crit; - volatile st_tid owner; /* 0 if unlocked */ - /* The "owner" field is not always protected by "crit"; it is also - accessed without holding "crit", using the Interlocked API for - atomic accesses */ -}; - -typedef struct st_mutex_ * st_mutex; - -static DWORD st_mutex_create(st_mutex * res) -{ - st_mutex m = caml_stat_alloc_noexc(sizeof(struct st_mutex_)); - if (m == NULL) return ERROR_NOT_ENOUGH_MEMORY; - InitializeCriticalSection(&m->crit); - m->owner = 0; - *res = m; - return 0; -} - -static DWORD st_mutex_destroy(st_mutex m) +Caml_inline void st_msleep(int msec) { - DeleteCriticalSection(&m->crit); - caml_stat_free(m); - return 0; + Sleep(msec); } -/* Error codes with the 29th bit set are reserved for the application */ - -#define MUTEX_DEADLOCK (1<<29 | 1) -#define MUTEX_PREVIOUSLY_UNLOCKED 0 -#define MUTEX_ALREADY_LOCKED (1 << 29) -#define MUTEX_NOT_OWNED (1<<29 | 2) - -Caml_inline DWORD st_mutex_lock(st_mutex m) -{ - st_tid self, prev; - TRACE1("st_mutex_lock", m); - self = st_current_thread_id(); - /* Critical sections are recursive locks, so this will succeed - if we already own the lock */ - EnterCriticalSection(&m->crit); - /* Record that we are the owner of the lock */ - prev = Tid_Atomic_Exchange(&m->owner, self); - if (prev != 0) { - /* The mutex was already locked by ourselves. - Cancel the EnterCriticalSection above and return an error. */ - TRACE1("st_mutex_lock (deadlock)", m); - LeaveCriticalSection(&m->crit); - return MUTEX_DEADLOCK; - } - TRACE1("st_mutex_lock (done)", m); - return 0; -} - -Caml_inline DWORD st_mutex_trylock(st_mutex m) -{ - st_tid self, prev; - TRACE1("st_mutex_trylock", m); - self = st_current_thread_id(); - if (! TryEnterCriticalSection(&m->crit)) { - TRACE1("st_mutex_trylock (failure)", m); - return MUTEX_ALREADY_LOCKED; - } - /* Record that we are the owner of the lock */ - prev = Tid_Atomic_Exchange(&m->owner, self); - if (prev != 0) { - /* The mutex was already locked by ourselves. - Cancel the EnterCriticalSection above and return "already locked". */ - TRACE1("st_mutex_trylock (already locked by self)", m); - LeaveCriticalSection(&m->crit); - return MUTEX_ALREADY_LOCKED; - } - TRACE1("st_mutex_trylock (done)", m); - return MUTEX_PREVIOUSLY_UNLOCKED; -} - -Caml_inline DWORD st_mutex_unlock(st_mutex m) -{ - st_tid self, prev; - /* If the calling thread holds the lock, m->owner is stable and equal - to st_current_thread_id(). - Otherwise, the value of m->owner can be 0 (if the mutex is unlocked) - or some other thread ID (if the mutex is held by another thread), - but is never equal to st_current_thread_id(). */ - self = st_current_thread_id(); - prev = Tid_Atomic_Compare_Exchange(&m->owner, 0, self); - if (prev != self) { - /* The value of m->owner is unchanged */ - TRACE1("st_mutex_unlock (error)", m); - return MUTEX_NOT_OWNED; - } - TRACE1("st_mutex_unlock", m); - LeaveCriticalSection(&m->crit); - return 0; -} - -/* Condition variables */ - -/* A condition variable is just a list of threads currently - waiting on this c.v. Each thread is represented by its - associated event. */ - -struct st_wait_list { - HANDLE event; /* event of the first waiting thread */ - struct st_wait_list * next; -}; - -typedef struct st_condvar_struct { - CRITICAL_SECTION lock; /* protect the data structure */ - struct st_wait_list * waiters; /* list of threads waiting */ -} * st_condvar; - -static DWORD st_condvar_create(st_condvar * res) -{ - st_condvar c = caml_stat_alloc_noexc(sizeof(struct st_condvar_struct)); - if (c == NULL) return ERROR_NOT_ENOUGH_MEMORY; - InitializeCriticalSection(&c->lock); - c->waiters = NULL; - *res = c; - return 0; -} - -static DWORD st_condvar_destroy(st_condvar c) -{ - TRACE1("st_condvar_destroy", c); - DeleteCriticalSection(&c->lock); - caml_stat_free(c); - return 0; -} - -static DWORD st_condvar_signal(st_condvar c) -{ - DWORD rc = 0; - struct st_wait_list * curr, * next; - - TRACE1("st_condvar_signal", c); - EnterCriticalSection(&c->lock); - curr = c->waiters; - if (curr != NULL) { - next = curr->next; - /* Wake up the first waiting thread */ - TRACE1("st_condvar_signal: waking up", curr->event); - if (! SetEvent(curr->event)) rc = GetLastError(); - /* Remove it from the waiting list */ - c->waiters = next; - } - LeaveCriticalSection(&c->lock); - return rc; -} - -static DWORD st_condvar_broadcast(st_condvar c) -{ - DWORD rc = 0; - struct st_wait_list * curr, * next; - - TRACE1("st_condvar_broadcast", c); - EnterCriticalSection(&c->lock); - /* Wake up all waiting threads */ - curr = c->waiters; - while (curr != NULL) { - next = curr->next; - TRACE1("st_condvar_signal: waking up", curr->event); - if (! SetEvent(curr->event)) rc = GetLastError(); - curr = next; - } - /* Remove them all from the waiting list */ - c->waiters = NULL; - LeaveCriticalSection(&c->lock); - return rc; -} - -static DWORD st_condvar_wait(st_condvar c, st_mutex m) -{ - HANDLE ev; - struct st_wait_list wait; - DWORD rc; - st_tid self, prev; - - TRACE1("st_condvar_wait", c); - /* Recover (or create) the event associated with the calling thread */ - ev = (HANDLE) TlsGetValue(st_thread_sem_key); - if (ev == 0) { - ev = CreateEvent(NULL, - FALSE /*auto reset*/, - FALSE /*initially unset*/, - NULL); - if (ev == NULL) return GetLastError(); - TlsSetValue(st_thread_sem_key, (void *) ev); - } - /* Get ready to release the mutex */ - self = st_current_thread_id(); - prev = Tid_Atomic_Compare_Exchange(&m->owner, 0, self); - if (prev != self) { - /* The value of m->owner is unchanged */ - TRACE1("st_condvar_wait: error: mutex not held", m); - return MUTEX_NOT_OWNED; - } - /* Insert the current thread in the waiting list (atomically) */ - EnterCriticalSection(&c->lock); - wait.event = ev; - wait.next = c->waiters; - c->waiters = &wait; - LeaveCriticalSection(&c->lock); - /* Finish releasing the mutex m (like st_mutex_unlock does, minus - the error checking, which we've already done above). */ - LeaveCriticalSection(&m->crit); - /* Wait for our event to be signaled. There is no risk of lost - wakeup, since we inserted ourselves on the waiting list of c - before releasing m */ - TRACE1("st_condvar_wait: blocking on event", ev); - if (WaitForSingleObject(ev, INFINITE) == WAIT_FAILED) - return GetLastError(); - /* Reacquire the mutex m */ - TRACE1("st_condvar_wait: restarted, acquiring mutex", c); - rc = st_mutex_lock(m); - if (rc != 0) return rc; - TRACE1("st_condvar_wait: acquired mutex", c); - return 0; -} - -/* Triggered events */ - -typedef HANDLE st_event; - -static DWORD st_event_create(st_event * res) -{ - st_event m = - CreateEvent(NULL, TRUE/*manual reset*/, FALSE/*initially unset*/, NULL); - TRACE1("st_event_create", m); - if (m == NULL) return GetLastError(); - *res = m; - return 0; -} - -static DWORD st_event_destroy(st_event e) -{ - TRACE1("st_event_destroy", e); - if (CloseHandle(e)) - return 0; - else - return GetLastError(); -} - -static DWORD st_event_trigger(st_event e) -{ - TRACE1("st_event_trigger", e); - if (SetEvent(e)) - return 0; - else - return GetLastError(); -} - -static DWORD st_event_wait(st_event e) -{ - TRACE1("st_event_wait", e); - if (WaitForSingleObject(e, INFINITE) == WAIT_FAILED) - return GetLastError(); - else - return 0; -} - -/* Reporting errors */ - -static void st_check_error(DWORD retcode, char * msg) -{ - wchar_t err[1024]; - int errlen, msglen, ret; - value str; - - if (retcode == 0) return; - if (retcode == ERROR_NOT_ENOUGH_MEMORY) caml_raise_out_of_memory(); - switch (retcode) { - case MUTEX_DEADLOCK: - ret = swprintf(err, sizeof(err)/sizeof(wchar_t), - L"Mutex is already locked by calling thread"); - break; - case MUTEX_NOT_OWNED: - ret = swprintf(err, sizeof(err)/sizeof(wchar_t), - L"Mutex is not locked by calling thread"); - break; - default: - ret = FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - retcode, - 0, - err, - sizeof(err)/sizeof(wchar_t), - NULL); - if (! ret) { - ret = - swprintf(err, sizeof(err)/sizeof(wchar_t), L"error code %lx", retcode); - } - } - msglen = strlen(msg); - errlen = win_wide_char_to_multi_byte(err, ret, NULL, 0); - str = caml_alloc_string(msglen + 2 + errlen); - memmove (&Byte(str, 0), msg, msglen); - memmove (&Byte(str, msglen), ": ", 2); - win_wide_char_to_multi_byte(err, ret, &Byte(str, msglen + 2), errlen); - caml_raise_sys_error(str); -} - -/* Variable used to stop the "tick" thread */ -static volatile int caml_tick_thread_stop = 0; - -/* The tick thread: posts a SIGPREEMPTION signal periodically */ - -static DWORD WINAPI caml_thread_tick(void * arg) -{ - while(! caml_tick_thread_stop) { - Sleep(Thread_timeout); - /* The preemption signal should never cause a callback, so don't - go through caml_handle_signal(), just record signal delivery via - caml_record_signal(). */ - caml_record_signal(SIGPREEMPTION); - } - return 0; -} - -/* "At fork" processing -- none under Win32 */ - -static DWORD st_atfork(void (*fn)(void)) -{ - return 0; -} +#include "st_pthreads.h" /* Signal handling -- none under Win32 */ -value caml_thread_sigmask(value cmd, value sigs) /* ML */ +value caml_thread_sigmask(value cmd, value sigs) { caml_invalid_argument("Thread.sigmask not implemented"); return Val_int(0); /* not reached */ } -value caml_wait_signal(value sigs) /* ML */ +value caml_wait_signal(value sigs) { caml_invalid_argument("Thread.wait_signal not implemented"); return Val_int(0); /* not reached */ diff --git a/otherlibs/systhreads/thread.ml b/otherlibs/systhreads/thread.ml index a021d3223a4..ab6414777af 100644 --- a/otherlibs/systhreads/thread.ml +++ b/otherlibs/systhreads/thread.ml @@ -1,4 +1,5 @@ -# 1 "thread.ml" +# 2 "thread.ml" + (**************************************************************************) (* *) (* OCaml *) @@ -30,7 +31,6 @@ external yield : unit -> unit = "caml_thread_yield" external self : unit -> t = "caml_thread_self" [@@noalloc] external id : t -> int = "caml_thread_id" [@@noalloc] external join : t -> unit = "caml_thread_join" -external exit_stub : unit -> unit = "caml_thread_exit" (* For new, make sure the function passed to thread_new never raises an exception. *) @@ -73,17 +73,7 @@ let create fn arg = flush stderr) let exit () = - ignore (Sys.opaque_identity (check_memprof_cb ())); - exit_stub () - -let exit () = - ignore (Sys.opaque_identity (check_memprof_cb ())); - exit_stub () - -(* Thread.kill is currently not implemented due to problems with - cleanup handlers on several platforms *) - -let kill th = invalid_arg "Thread.kill: not implemented" + raise Exit (* Preemption *) @@ -97,8 +87,9 @@ let preempt_signal = | _ -> Sys.sigvtalrm let () = - Sys.set_signal preempt_signal (Sys.Signal_handle preempt); thread_initialize (); + Sys.set_signal preempt_signal (Sys.Signal_handle preempt); + (* Callback in [caml_shutdown], when the last domain exits. *) Callback.register "Thread.at_shutdown" (fun () -> thread_cleanup(); (* In case of DLL-embedded OCaml the preempt_signal handler @@ -112,9 +103,6 @@ let () = let delay = Unix.sleepf -let wait_read fd = () -let wait_write fd = () - let wait_timed_read fd d = match Unix.select [fd] [] [] d with ([], _, _) -> false | (_, _, _) -> true let wait_timed_write fd d = diff --git a/otherlibs/systhreads/thread.mli b/otherlibs/systhreads/thread.mli index 8f9013dd796..b2cf78a5cdc 100644 --- a/otherlibs/systhreads/thread.mli +++ b/otherlibs/systhreads/thread.mli @@ -23,7 +23,7 @@ type t val create : ('a -> 'b) -> 'a -> t (** [Thread.create funct arg] creates a new thread of control, in which the function application [funct arg] - is executed concurrently with the other threads of the program. + is executed concurrently with the other threads of the domain. The application of [Thread.create] returns the handle of the newly created thread. The new thread terminates when the application [funct arg] @@ -32,7 +32,10 @@ val create : ('a -> 'b) -> 'a -> t In the last case, the uncaught exception is printed on standard error, but not propagated back to the parent thread. Similarly, the result of the application [funct arg] is discarded and not - directly accessible to the parent thread. *) + directly accessible to the parent thread. + + See also {!Domain.spawn} if you want parallel execution instead. + *) val self : unit -> t (** Return the handle for the thread currently executing. *) @@ -43,25 +46,30 @@ val id : t -> int It can be used to build data structures indexed by threads. *) exception Exit -(** Exception that can be raised by user code to initiate termination - of the current thread. - Compared to calling the {!Thread.exit} function, raising the - {!Thread.Exit} exception will trigger {!Fun.finally} finalizers - and catch-all exception handlers. - It is the recommended way to terminate threads prematurely. - - @since 4.14.0 -*) +(** Exception raised by user code to initiate termination of the + current thread. + In a thread created by {!Thread.create} [funct] [arg], if the + {!Thread.Exit} exception reaches the top of the application + [funct arg], it has the effect of terminating the current thread + silently. In other contexts, there is no implicit handling of the + {!Thread.Exit} exception. *) val exit : unit -> unit -(** Terminate prematurely the currently executing thread. *) - -val kill : t -> unit - [@@ocaml.deprecated "Not implemented, do not use"] -(** This function was supposed to terminate prematurely the thread - whose handle is given. It is not currently implemented due to - problems with cleanup handlers on many POSIX 1003.1c implementations. - It always raises the [Invalid_argument] exception. *) +[@@ocaml.deprecated "Use 'raise Thread.Exit' instead."] +(** Raise the {!Thread.Exit} exception. + In a thread created by {!Thread.create}, this will cause the thread + to terminate prematurely, unless the thread function handles the + exception itself. {!Fun.protect} finalizers and catch-all + exception handlers will be executed. + + To make it clear that an exception is raised and will trigger + finalizers and catch-all exception handlers, it is recommended + to write [raise Thread.Exit] instead of [Thread.exit ()]. + + @before 5.0 A different implementation was used, not based on raising + an exception, and not running finalizers and catch-all handlers. + The previous implementation had a different behavior when called + outside of a thread created by {!Thread.create}. *) (** {1 Suspending threads} *) @@ -87,20 +95,12 @@ val yield : unit -> unit a more general and more standard-conformant manner. It is recommended to use {!Unix} functions directly. *) -val wait_read : Unix.file_descr -> unit - [@@ocaml.deprecated "This function no longer does anything"] -(** This function does nothing in the current implementation of the threading - library and can be removed from all user programs. *) - -val wait_write : Unix.file_descr -> unit - [@@ocaml.deprecated "This function no longer does anything"] -(** This function does nothing in the current implementation of the threading - library and can be removed from all user programs. *) - val wait_timed_read : Unix.file_descr -> float -> bool +[@@ocaml.deprecated "Use Unix.select instead."] (** See {!Thread.wait_timed_write}.*) val wait_timed_write : Unix.file_descr -> float -> bool +[@@ocaml.deprecated "Use Unix.select instead."] (** Suspend the execution of the calling thread until at least one character or EOF is available for reading ([wait_timed_read]) or one character can be written without blocking ([wait_timed_write]) @@ -115,6 +115,7 @@ val select : Unix.file_descr list -> Unix.file_descr list -> Unix.file_descr list -> float -> Unix.file_descr list * Unix.file_descr list * Unix.file_descr list +[@@ocaml.deprecated "Use Unix.select instead."] (** Same function as {!Unix.select}. Suspend the execution of the calling thread until input/output becomes possible on the given Unix file descriptors. @@ -122,6 +123,7 @@ val select : {!Unix.select}. *) val wait_pid : int -> int * Unix.process_status +[@@ocaml.deprecated "Use Unix.waitpid instead."] (** Same function as {!Unix.waitpid}. [wait_pid p] suspends the execution of the calling thread until the process specified by the process identifier [p] diff --git a/otherlibs/systhreads/threads.h b/otherlibs/systhreads/threads.h index f4b8ee1a749..625c7d039e4 100644 --- a/otherlibs/systhreads/threads.h +++ b/otherlibs/systhreads/threads.h @@ -25,19 +25,19 @@ CAMLextern void caml_leave_blocking_section (void); #define caml_acquire_runtime_system caml_leave_blocking_section #define caml_release_runtime_system caml_enter_blocking_section -/* Manage the master lock around the OCaml run-time system. +/* Manage the domain lock around the OCaml run-time system. Only one thread at a time can execute OCaml compiled code or - OCaml run-time system functions. + OCaml run-time system functions within a domain. - When OCaml calls a C function, the current thread holds the master - lock. The C function can release it by calling + When OCaml calls a C function, the current thread holds the domain lock. + The C function can release it by calling [caml_release_runtime_system]. Then, another thread can execute OCaml code. However, the calling thread must not access any OCaml data, nor call any runtime system function, nor call back into OCaml. Before returning to its OCaml caller, or accessing OCaml data, or call runtime system functions, the current thread must - re-acquire the master lock by calling [caml_acquire_runtime_system]. + re-acquire the domain lock by calling [caml_acquire_runtime_system]. Symmetrically, if a C function (not called from OCaml) wishes to call back into OCaml code, it should invoke [caml_acquire_runtime_system] @@ -60,9 +60,12 @@ CAMLextern_libthreads int caml_c_thread_unregister(void); /* If a thread is created by C code (instead of by OCaml itself), it must be registered with the OCaml runtime system before being able to call back into OCaml code or use other runtime system - functions. Just call [caml_c_thread_register] once. - Before the thread finishes, it must call [caml_c_thread_unregister]. + functions. Just call [caml_c_thread_register] once. The domain lock + is not held when [caml_c_thread_register] returns. + Before the thread finishes, it must call [caml_c_thread_unregister] + (without holding the domain lock). Both functions return 1 on success, 0 on error. + Note that threads registered by C code belong to the domain 0. */ enum caml_thread_type { Thread_type_caml, Thread_type_c_registered }; @@ -88,8 +91,6 @@ struct caml_locking_scheme { void (*yield)(void*); }; -extern struct caml_locking_scheme caml_default_locking_scheme; - /* Switch to a new runtime locking scheme. The old runtime lock must be held (i.e. not in a blocking section), @@ -101,14 +102,18 @@ extern struct caml_locking_scheme caml_default_locking_scheme; CAMLextern_libthreads void caml_switch_runtime_locking_scheme(struct caml_locking_scheme*); +/* Returns the default scheme; caller must hold the lock */ +CAMLextern_libthreads +struct caml_locking_scheme *caml_get_default_locking_scheme(void); + +/* Save runtime state of the active thread; caller must hold the lock */ +CAMLextern_libthreads +void caml_thread_save_runtime_state(void); + +/* Restore the runtime state of the current thread; caller must hold the lock */ CAMLextern_libthreads -void caml_thread_switch_runtime_state(void); +void caml_thread_restore_runtime_state(void); -/* A prior version of this API used save/restore rather than a single switch. - For compatibility, aliases are defined for the old API. - (These will be removed when the lone user of this API is updated) */ -#define caml_thread_save_runtime_state() -#define caml_thread_restore_runtime_state caml_thread_switch_runtime_state #ifdef __cplusplus } diff --git a/otherlibs/systhreads4/.depend b/otherlibs/systhreads4/.depend new file mode 100644 index 00000000000..11b76f90bb7 --- /dev/null +++ b/otherlibs/systhreads4/.depend @@ -0,0 +1,10 @@ +event.cmo : \ + event.cmi +event.cmx : \ + event.cmi +event.cmi : +thread.cmo : \ + thread.cmi +thread.cmx : \ + thread.cmi +thread.cmi : diff --git a/otherlibs/systhreads4/META.in b/otherlibs/systhreads4/META.in new file mode 100644 index 00000000000..07d301f116a --- /dev/null +++ b/otherlibs/systhreads4/META.in @@ -0,0 +1,13 @@ +# @configure_input@ + +version = "@VERSION@" +description = "Multi-threading" +requires = "unix" +archive(byte) = "threads.cma" +archive(native) = "threads.cmxa" +type_of_threads = "posix" + +package "posix" ( + requires = "threads" + version = "[internal]" +) diff --git a/otherlibs/systhreads4/Makefile b/otherlibs/systhreads4/Makefile new file mode 100644 index 00000000000..ecabaf6e675 --- /dev/null +++ b/otherlibs/systhreads4/Makefile @@ -0,0 +1,170 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Xavier Leroy, projet Cristal, INRIA Rocquencourt * +#* * +#* Copyright 1999 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. * +#* * +#************************************************************************** + +ROOTDIR=../.. + +include $(ROOTDIR)/Makefile.common +include $(ROOTDIR)/Makefile.best_binaries + +ifneq "$(CCOMPTYPE)" "msvc" +OC_CFLAGS += -g +endif + +OC_CFLAGS += $(SHAREDLIB_CFLAGS) $(PTHREAD_CFLAGS) + +LIBS = $(STDLIBFLAGS) -I $(ROOTDIR)/otherlibs/unix + +CAMLC=$(BEST_OCAMLC) $(LIBS) +CAMLOPT=$(BEST_OCAMLOPT) $(LIBS) + +MKLIB=$(OCAMLRUN) $(ROOTDIR)/tools/ocamlmklib$(EXE) +COMPFLAGS=-w +33..39 -warn-error +A -g -bin-annot +ifeq "$(FLAMBDA)" "true" +OPTCOMPFLAGS += -O3 +endif + +LIBNAME=threads + +# Note: the header on which object files produced from st_stubs.c +# should actually depend is known for sure only at compile-time. +# That's why this dependency is handled in the Makefile directly +# and removed from the output of the C compiler during make depend + +BYTECODE_C_OBJS=st_stubs.b.$(O) +NATIVECODE_C_OBJS=st_stubs.n.$(O) + +THREADS_SOURCES = thread.ml event.ml + +THREADS_BCOBJS = $(THREADS_SOURCES:.ml=.cmo) +THREADS_NCOBJS = $(THREADS_SOURCES:.ml=.cmx) + +MLIFILES=thread.mli event.mli + +CMIFILES=$(MLIFILES:.mli=.cmi) + +all: lib$(LIBNAME).$(A) $(LIBNAME).cma $(CMIFILES) + +allopt: lib$(LIBNAME)nat.$(A) $(LIBNAME).cmxa $(CMIFILES) + +lib$(LIBNAME).$(A): $(BYTECODE_C_OBJS) + $(V_OCAMLMKLIB)$(MKLIB_CMD) -o $(LIBNAME) $(BYTECODE_C_OBJS) + +lib$(LIBNAME)nat.$(A): OC_CFLAGS += $(OC_NATIVE_CFLAGS) -DNATIVE_CODE + +lib$(LIBNAME)nat.$(A): $(NATIVECODE_C_OBJS) + $(V_OCAMLMKLIB)$(MKLIB_CMD) -o $(LIBNAME)nat $^ + +$(LIBNAME).cma: $(THREADS_BCOBJS) +ifeq "$(UNIX_OR_WIN32)" "unix" + $(V_OCAMLMKLIB)$(MKLIB) -o $(LIBNAME) -ocamlc '$(CAMLC)' -cclib -lunixbyt -linkall $^ +# TODO: Figure out why -cclib -lunix is used here. +# It may be because of the threadsUnix module which is deprecated. +# It may hence be good to figure out whether this module shouldn't be +# removed, and then -cclib -lunix arguments. +else # Windows + $(V_OCAMLMKLIB)$(MKLIB) -o $(LIBNAME) -ocamlc "$(CAMLC)" -linkall $^ +endif + +# See remark above: force static linking of libthreadsnat.a +$(LIBNAME).cmxa: $(THREADS_NCOBJS) + $(V_LINKOPT)$(CAMLOPT) -linkall -a -cclib -lthreadsnat -o $@ $^ + +# Note: I removed "-cclib -lunix" from the line above. +# Indeed, if we link threads.cmxa, then we must also link unix.cmxa, +# which itself will pass -lunix to the C linker. It seems more +# modular to me this way. -- Alain + +# The following lines produce two object files st_stubs.b.$(O) and +# st_stubs.n.$(O) from the same source file st_stubs.c (it is compiled +# twice, each time with different options). + +ifeq "$(COMPUTE_DEPS)" "true" +st_stubs.%.$(O): st_stubs.c +else +st_stubs.%.$(O): st_stubs.c $(RUNTIME_HEADERS) $(wildcard *.h) +endif + $(V_CC)$(CC) -c $(OC_CFLAGS) $(CFLAGS) $(OC_CPPFLAGS) $(CPPFLAGS) \ + $(OUTPUTOBJ)$@ $< + +.PHONY: partialclean +partialclean: + rm -f *.cm* + +.PHONY: clean +clean: partialclean + rm -f dllthreads*.so dllthreads*.dll *.a *.lib *.o *.obj + rm -rf $(DEPDIR) + +.PHONY: distclean +distclean: clean + rm -f META + +INSTALL_THREADSLIBDIR=$(INSTALL_LIBDIR)/$(LIBNAME) + +install: + if test -f dllthreads$(EXT_DLL); then \ + $(INSTALL_PROG) dllthreads$(EXT_DLL) "$(INSTALL_STUBLIBDIR)"; \ + fi + $(INSTALL_DATA) libthreads.$(A) "$(INSTALL_LIBDIR)" + $(MKDIR) "$(INSTALL_THREADSLIBDIR)" + $(INSTALL_DATA) \ + $(CMIFILES) threads.cma META \ + "$(INSTALL_THREADSLIBDIR)" +ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" + $(INSTALL_DATA) \ + $(CMIFILES:.cmi=.cmti) \ + "$(INSTALL_THREADSLIBDIR)" + $(INSTALL_DATA) $(MLIFILES) "$(INSTALL_THREADSLIBDIR)" +endif + $(INSTALL_DATA) threads.h "$(INSTALL_INCDIR)" + +installopt: + $(INSTALL_DATA) libthreadsnat.$(A) "$(INSTALL_LIBDIR)" + $(INSTALL_DATA) \ + $(THREADS_NCOBJS) threads.cmxa threads.$(A) \ + "$(INSTALL_THREADSLIBDIR)" + +%.cmi: %.mli + $(V_OCAMLC)$(CAMLC) -c $(COMPFLAGS) $< + +%.cmo: %.ml + $(V_OCAMLC)$(CAMLC) -c $(COMPFLAGS) $< + +%.cmx: %.ml + $(V_OCAMLOPT)$(CAMLOPT) -c $(COMPFLAGS) $(OPTCOMPFLAGS) $< + +DEP_FILES := st_stubs.b.$(D) +ifeq "$(NATIVE_COMPILER)" "true" +DEP_FILES += st_stubs.n.$(D) +endif + +ifeq "$(COMPUTE_DEPS)" "true" +include $(addprefix $(DEPDIR)/, $(DEP_FILES)) +endif + +%.n.$(D): OC_CPPFLAGS += $(OC_NATIVE_CPPFLAGS) + +define GEN_RULE +$(DEPDIR)/%.$(1).$(D): %.c | $(DEPDIR) + $$(V_CCDEPS)$$(DEP_CC) $$(OC_CPPFLAGS) $$(CPPFLAGS) $$< -MT '$$*.$(1).$(O)' -MF $$@ +endef + +$(foreach object_type, b n, $(eval $(call GEN_RULE,$(object_type)))) + +.PHONY: depend +depend: + $(V_GEN)$(OCAMLRUN) $(ROOTDIR)/boot/ocamlc -depend -slash *.mli *.ml > .depend + +include .depend diff --git a/otherlibs/systhreads4/byte/dune b/otherlibs/systhreads4/byte/dune new file mode 100644 index 00000000000..58c7667da2f --- /dev/null +++ b/otherlibs/systhreads4/byte/dune @@ -0,0 +1,21 @@ +(copy_files# ../*.{c,h,ml,mli}) + +(library + (name threads) + (modes byte) + (wrapped false) + ; FIXME Fix warning 27 and -no-strict-sequence + (flags + (:standard -no-strict-sequence -g -bin-annot -safe-string -w -27)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (libraries unix) + (library_flags -linkall) + (c_library_flags -lpthread) + (foreign_stubs + (language c) + (names st_stubs) + (flags + ((:include %{project_root}/oc_cflags.sexp) + (:include %{project_root}/sharedlib_cflags.sexp) + (:include %{project_root}/oc_cppflags.sexp))))) diff --git a/otherlibs/systhreads4/dune b/otherlibs/systhreads4/dune new file mode 100644 index 00000000000..d93131462ba --- /dev/null +++ b/otherlibs/systhreads4/dune @@ -0,0 +1,48 @@ +;************************************************************************** +;* * +;* OCaml * +;* * +;* Mark Shinwell, Jane Street Europe * +;* * +;* Copyright 2020 Jane Street Group LLC * +;* * +;* 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. * +;* * +;************************************************************************** + + +; For some reason the C header files aren't being found if this library +; is given a public name, so we do the installation manually. +(install + (files + (byte/threads.cma as threads/threads.cma) + (native/threadsnat.cmxa as threads/threads.cmxa) + (native/threadsnat.a as threads/threads.a) + + (byte/libthreads_stubs.a as libthreads_stubs.a) + (byte/dllthreads_stubs.so as stublibs/dllthreads_stubs.so) + (native/libthreadsnat_stubs.a as libthreadsnat_stubs.a) + (native/libthreadsnat_stubs.a as libthreadsnat_stubs_native.a) ; for special_dune compat + + + (thread.mli as threads/thread.mli) + (event.mli as threads/event.mli) + + (threads.h as caml/threads.h) + + (native/.threadsnat.objs/native/event.cmx as threads/event.cmx) + (native/.threadsnat.objs/native/thread.cmx as threads/thread.cmx) + + (byte/.threads.objs/byte/event.cmi as threads/event.cmi) + (byte/.threads.objs/byte/event.cmti as threads/event.cmti) + (byte/.threads.objs/byte/thread.cmi as threads/thread.cmi) + (byte/.threads.objs/byte/thread.cmti as threads/thread.cmti) + + (META as threads/META) + ) + (section lib) + (package ocaml)) + + diff --git a/otherlibs/systhreads4/event.ml b/otherlibs/systhreads4/event.ml new file mode 100644 index 00000000000..fc8a65b042f --- /dev/null +++ b/otherlibs/systhreads4/event.ml @@ -0,0 +1,278 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* David Nowak and 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. *) +(* *) +(**************************************************************************) + +[@@@ocaml.flambda_o3] + +(* Events *) +type 'a basic_event = + { poll: unit -> bool; + (* If communication can take place immediately, return true. *) + suspend: unit -> unit; + (* Offer the communication on the channel and get ready + to suspend current process. *) + result: unit -> 'a } + (* Return the result of the communication *) + +type 'a behavior = int ref -> Condition.t -> int -> 'a basic_event + +type 'a event = + Communication of 'a behavior + | Choose of 'a event list + | WrapAbort of 'a event * (unit -> unit) + | Guard of (unit -> 'a event) + +(* Communication channels *) +type 'a channel = + { mutable writes_pending: 'a communication Queue.t; + (* All offers to write on it *) + mutable reads_pending: 'a communication Queue.t } + (* All offers to read from it *) + +(* Communication offered *) +and 'a communication = + { performed: int ref; (* -1 if not performed yet, set to the number *) + (* of the matching communication after rendez-vous. *) + condition: Condition.t; (* To restart the blocked thread. *) + mutable data: 'a option; (* The data sent or received. *) + event_number: int } (* Event number in select *) + +(* Create a channel *) + +let new_channel () = + { writes_pending = Queue.create(); + reads_pending = Queue.create() } + +(* Basic synchronization function *) + +let masterlock = Mutex.create() + +let do_aborts abort_env genev performed = + if abort_env <> [] then begin + if performed >= 0 then begin + let ids_done = snd genev.(performed) in + List.iter + (fun (id,f) -> if not (List.mem id ids_done) then f ()) + abort_env + end else begin + List.iter (fun (_,f) -> f ()) abort_env + end + end + +let basic_sync abort_env genev = + let performed = ref (-1) in + let condition = Condition.create() in + let bev = Array.make (Array.length genev) + (fst (genev.(0)) performed condition 0) in + for i = 1 to Array.length genev - 1 do + bev.(i) <- (fst genev.(i)) performed condition i + done; + (* See if any of the events is already activable *) + let rec poll_events i = + if i >= Array.length bev + then false + else bev.(i).poll() || poll_events (i+1) in + Mutex.lock masterlock; + if not (poll_events 0) then begin + (* Suspend on all events *) + for i = 0 to Array.length bev - 1 do bev.(i).suspend() done; + (* Wait until the condition is signalled *) + Condition.wait condition masterlock; + (* PR#7013: protect against spurious wake-up *) + while !performed < 0 do Condition.wait condition masterlock done + end; + Mutex.unlock masterlock; + (* Extract the result *) + if abort_env = [] then + (* Preserve tail recursion *) + bev.(!performed).result() + else begin + let num = !performed in + let result = bev.(num).result() in + (* Handle the aborts and return the result *) + do_aborts abort_env genev num; + result + end + +(* Apply a random permutation on an array *) + +let scramble_array a = + let len = Array.length a in + if len = 0 then invalid_arg "Event.choose"; + for i = len - 1 downto 1 do + let j = Random.int (i + 1) in + let temp = a.(i) in a.(i) <- a.(j); a.(j) <- temp + done; + a + +(* Main synchronization function *) + +let gensym = let count = ref 0 in fun () -> incr count; !count + +let rec flatten_event + (abort_list : int list) + (accu : ('a behavior * int list) list) + (accu_abort : (int * (unit -> unit)) list) + ev = + match ev with + Communication bev -> ((bev,abort_list) :: accu) , accu_abort + | WrapAbort (ev,fn) -> + let id = gensym () in + flatten_event (id :: abort_list) accu ((id,fn)::accu_abort) ev + | Choose evl -> + let rec flatten_list accu' accu_abort'= function + ev :: l -> + let (accu'',accu_abort'') = + flatten_event abort_list accu' accu_abort' ev in + flatten_list accu'' accu_abort'' l + | [] -> (accu',accu_abort') in + flatten_list accu accu_abort evl + | Guard fn -> flatten_event abort_list accu accu_abort (fn ()) + +let sync ev = + let (evl,abort_env) = flatten_event [] [] [] ev in + basic_sync abort_env (scramble_array(Array.of_list evl)) + +(* Event polling -- like sync, but non-blocking *) + +let basic_poll abort_env genev = + let performed = ref (-1) in + let condition = Condition.create() in + let bev = Array.make(Array.length genev) + (fst genev.(0) performed condition 0) in + for i = 1 to Array.length genev - 1 do + bev.(i) <- fst genev.(i) performed condition i + done; + (* See if any of the events is already activable *) + let rec poll_events i = + if i >= Array.length bev + then false + else bev.(i).poll() || poll_events (i+1) in + Mutex.lock masterlock; + let ready = poll_events 0 in + if ready then begin + (* Extract the result *) + Mutex.unlock masterlock; + let result = Some(bev.(!performed).result()) in + do_aborts abort_env genev !performed; result + end else begin + (* Cancel the communication offers *) + performed := 0; + Mutex.unlock masterlock; + do_aborts abort_env genev (-1); + None + end + +let poll ev = + let (evl,abort_env) = flatten_event [] [] [] ev in + basic_poll abort_env (scramble_array(Array.of_list evl)) + +(* Remove all communication opportunities already synchronized *) + +let cleanup_queue q = + let q' = Queue.create() in + Queue.iter (fun c -> if !(c.performed) = -1 then Queue.add c q') q; + q' + +(* Event construction *) + +let always data = + Communication(fun performed condition evnum -> + { poll = (fun () -> performed := evnum; true); + suspend = (fun () -> ()); + result = (fun () -> data) }) + +let send channel data = + Communication(fun performed condition evnum -> + let wcomm = + { performed = performed; + condition = condition; + data = Some data; + event_number = evnum } in + { poll = (fun () -> + let rec poll () = + let rcomm = Queue.take channel.reads_pending in + if !(rcomm.performed) >= 0 then + poll () + else begin + rcomm.data <- wcomm.data; + performed := evnum; + rcomm.performed := rcomm.event_number; + Condition.signal rcomm.condition + end in + try + poll(); + true + with Queue.Empty -> + false); + suspend = (fun () -> + channel.writes_pending <- cleanup_queue channel.writes_pending; + Queue.add wcomm channel.writes_pending); + result = (fun () -> ()) }) + +let receive channel = + Communication(fun performed condition evnum -> + let rcomm = + { performed = performed; + condition = condition; + data = None; + event_number = evnum } in + { poll = (fun () -> + let rec poll () = + let wcomm = Queue.take channel.writes_pending in + if !(wcomm.performed) >= 0 then + poll () + else begin + rcomm.data <- wcomm.data; + performed := evnum; + wcomm.performed := wcomm.event_number; + Condition.signal wcomm.condition + end in + try + poll(); + true + with Queue.Empty -> + false); + suspend = (fun () -> + channel.reads_pending <- cleanup_queue channel.reads_pending; + Queue.add rcomm channel.reads_pending); + result = (fun () -> + match rcomm.data with + None -> invalid_arg "Event.receive" + | Some res -> res) }) + +let choose evl = Choose evl + +let wrap_abort ev fn = WrapAbort(ev,fn) + +let guard fn = Guard fn + +let rec wrap ev fn = + match ev with + Communication genev -> + Communication(fun performed condition evnum -> + let bev = genev performed condition evnum in + { poll = bev.poll; + suspend = bev.suspend; + result = (fun () -> fn(bev.result())) }) + | Choose evl -> + Choose(List.map (fun ev -> wrap ev fn) evl) + | WrapAbort (ev, f') -> + WrapAbort (wrap ev fn, f') + | Guard gu -> + Guard(fun () -> wrap (gu()) fn) + +(* Convenience functions *) + +let select evl = sync(Choose evl) diff --git a/otherlibs/systhreads4/event.mli b/otherlibs/systhreads4/event.mli new file mode 100644 index 00000000000..fd452652c69 --- /dev/null +++ b/otherlibs/systhreads4/event.mli @@ -0,0 +1,81 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* David Nowak and 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. *) +(* *) +(**************************************************************************) + +(** First-class synchronous communication. + + This module implements synchronous inter-thread communications over + channels. As in John Reppy's Concurrent ML system, the communication + events are first-class values: they can be built and combined + independently before being offered for communication. +*) + +type 'a channel +(** The type of communication channels carrying values of type ['a]. *) + +val new_channel : unit -> 'a channel +(** Return a new channel. *) + +type +'a event +(** The type of communication events returning a result of type ['a]. *) + +(** [send ch v] returns the event consisting in sending the value [v] + over the channel [ch]. The result value of this event is [()]. *) +val send : 'a channel -> 'a -> unit event + +(** [receive ch] returns the event consisting in receiving a value + from the channel [ch]. The result value of this event is the + value received. *) +val receive : 'a channel -> 'a event + +val always : 'a -> 'a event +(** [always v] returns an event that is always ready for + synchronization. The result value of this event is [v]. *) + +val choose : 'a event list -> 'a event +(** [choose evl] returns the event that is the alternative of + all the events in the list [evl]. *) + +val wrap : 'a event -> ('a -> 'b) -> 'b event +(** [wrap ev fn] returns the event that performs the same communications + as [ev], then applies the post-processing function [fn] + on the return value. *) + +val wrap_abort : 'a event -> (unit -> unit) -> 'a event +(** [wrap_abort ev fn] returns the event that performs + the same communications as [ev], but if it is not selected + the function [fn] is called after the synchronization. *) + +val guard : (unit -> 'a event) -> 'a event +(** [guard fn] returns the event that, when synchronized, computes + [fn()] and behaves as the resulting event. This enables + computing events with side-effects at the time of the synchronization + operation. *) + +val sync : 'a event -> 'a +(** 'Synchronize' on an event: offer all the communication + possibilities specified in the event to the outside world, + and block until one of the communications succeed. The result + value of that communication is returned. *) + +val select : 'a event list -> 'a +(** 'Synchronize' on an alternative of events. + [select evl] is shorthand for [sync(choose evl)]. *) + +val poll : 'a event -> 'a option +(** Non-blocking version of {!Event.sync}: offer all the communication + possibilities specified in the event to the outside world, + and if one can take place immediately, perform it and return + [Some r] where [r] is the result value of that communication. + Otherwise, return [None] without blocking. *) diff --git a/otherlibs/systhreads4/native/dune b/otherlibs/systhreads4/native/dune new file mode 100644 index 00000000000..59c507ee812 --- /dev/null +++ b/otherlibs/systhreads4/native/dune @@ -0,0 +1,22 @@ +(copy_files# ../*.{c,h,ml,mli}) + +(library + (name threadsnat) + (modes native) + (wrapped false) + ; FIXME Fix warning 27 and -no-strict-sequence + (flags + (:standard -no-strict-sequence -g -bin-annot -safe-string -w -27)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) + (libraries unix) + (library_flags -linkall) + (c_library_flags -lpthread) + (foreign_stubs + (language c) + (names st_stubs) + (flags + ((-DNATIVE_CODE) + (:include %{project_root}/oc_cflags.sexp) + (:include %{project_root}/sharedlib_cflags.sexp) + (:include %{project_root}/oc_cppflags.sexp))))) diff --git a/otherlibs/systhreads4/st_posix.h b/otherlibs/systhreads4/st_posix.h new file mode 100644 index 00000000000..a43c78fbc92 --- /dev/null +++ b/otherlibs/systhreads4/st_posix.h @@ -0,0 +1,558 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 2009 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. */ +/* */ +/**************************************************************************/ + +/* POSIX thread implementation of the "st" interface */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __linux__ +#include +#include +#include +#include +#include +#endif + +typedef int st_retcode; + +#define SIGPREEMPTION SIGVTALRM + +/* OS-specific initialization */ + +static int st_initialize(void) +{ + caml_sigmask_hook = pthread_sigmask; + return 0; +} + +/* Thread creation. Created in detached mode if [res] is NULL. */ + +typedef pthread_t st_thread_id; + +static int st_thread_create(st_thread_id * res, + void * (*fn)(void *), void * arg) +{ + pthread_t thr; + pthread_attr_t attr; + int rc; + + pthread_attr_init(&attr); + if (res == NULL) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + rc = pthread_create(&thr, &attr, fn, arg); + if (res != NULL) *res = thr; + return rc; +} + +#define ST_THREAD_FUNCTION void * + +/* Cleanup at thread exit */ + +Caml_inline void st_thread_cleanup(void) +{ + return; +} + +/* Thread termination */ + +CAMLnoreturn_start +static void st_thread_exit(void) +CAMLnoreturn_end; + +static void st_thread_exit(void) +{ + pthread_exit(NULL); +} + +static void st_thread_join(st_thread_id thr) +{ + pthread_join(thr, NULL); + /* best effort: ignore errors */ +} + +/* Thread-specific state */ + +typedef pthread_key_t st_tlskey; + +static int st_tls_newkey(st_tlskey * res) +{ + return pthread_key_create(res, NULL); +} + +Caml_inline void * st_tls_get(st_tlskey k) +{ + return pthread_getspecific(k); +} + +Caml_inline void st_tls_set(st_tlskey k, void * v) +{ + pthread_setspecific(k, v); +} + +/* Windows-specific hook. */ +Caml_inline void st_thread_set_id(intnat id) +{ + return; +} + +/* If we're using glibc, use a custom condition variable implementation to + avoid this bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25847 + + For now we only have this on linux because it directly uses the linux futex + syscalls. */ +#if defined(__linux__) && defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) +typedef struct { + volatile unsigned counter; +} custom_condvar; + +static int custom_condvar_init(custom_condvar * cv) +{ + cv->counter = 0; + return 0; +} + +static int custom_condvar_destroy(custom_condvar * cv) +{ + return 0; +} + +static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) +{ + unsigned old_count = cv->counter; + pthread_mutex_unlock(mutex); + syscall(SYS_futex, &cv->counter, FUTEX_WAIT_PRIVATE, old_count, NULL, NULL, 0); + pthread_mutex_lock(mutex); + return 0; +} + +static int custom_condvar_signal(custom_condvar * cv) +{ + __sync_add_and_fetch(&cv->counter, 1); + syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, 1, NULL, NULL, 0); + return 0; +} + +static int custom_condvar_broadcast(custom_condvar * cv) +{ + __sync_add_and_fetch(&cv->counter, 1); + syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, INT_MAX, NULL, NULL, 0); + return 0; +} +#else +typedef pthread_cond_t custom_condvar; + +static int custom_condvar_init(custom_condvar * cv) +{ + return pthread_cond_init(cv, NULL); +} + +static int custom_condvar_destroy(custom_condvar * cv) +{ + return pthread_cond_destroy(cv); +} + +static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) +{ + return pthread_cond_wait(cv, mutex); +} + +static int custom_condvar_signal(custom_condvar * cv) +{ + return pthread_cond_signal(cv); +} + +static int custom_condvar_broadcast(custom_condvar * cv) +{ + return pthread_cond_broadcast(cv); +} +#endif + +/* The master lock. This is a mutex that is held most of the time, + so we implement it in a slightly convoluted way to avoid + all risks of busy-waiting. Also, we count the number of waiting + threads. */ + +typedef struct { + pthread_mutex_t lock; /* to protect contents */ + int busy; /* 0 = free, 1 = taken */ + volatile int waiters; /* number of threads waiting on master lock */ + custom_condvar is_free; /* signaled when free */ +} st_masterlock; + +static void st_masterlock_init(st_masterlock * m) +{ + pthread_mutex_init(&m->lock, NULL); + custom_condvar_init(&m->is_free); + m->busy = 1; + m->waiters = 0; +} + +static void st_masterlock_acquire(st_masterlock * m) +{ + pthread_mutex_lock(&m->lock); + while (m->busy) { + m->waiters ++; + custom_condvar_wait(&m->is_free, &m->lock); + m->waiters --; + } + m->busy = 1; + pthread_mutex_unlock(&m->lock); +} + +static void st_masterlock_release(st_masterlock * m) +{ + pthread_mutex_lock(&m->lock); + m->busy = 0; + pthread_mutex_unlock(&m->lock); + custom_condvar_signal(&m->is_free); +} + +CAMLno_tsan /* This can be called for reading [waiters] without locking. */ +Caml_inline int st_masterlock_waiters(st_masterlock * m) +{ + return m->waiters; +} + +/* Scheduling hints */ + +/* This is mostly equivalent to release(); acquire(), but better. In particular, + release(); acquire(); leaves both us and the waiter we signal() racing to + acquire the lock. Calling yield or sleep helps there but does not solve the + problem. Sleeping ourselves is much more reliable--and since we're handing + off the lock to a waiter we know exists, it's safe, as they'll certainly + re-wake us later. +*/ +Caml_inline void st_thread_yield(st_masterlock * m) +{ + pthread_mutex_lock(&m->lock); + /* We must hold the lock to call this. */ + assert(m->busy); + + /* We already checked this without the lock, but we might have raced--if + there's no waiter, there's nothing to do and no one to wake us if we did + wait, so just keep going. */ + if (m->waiters == 0) { + pthread_mutex_unlock(&m->lock); + return; + } + + m->busy = 0; + custom_condvar_signal(&m->is_free); + m->waiters++; + do { + /* Note: the POSIX spec prevents the above signal from pairing with this + wait, which is good: we'll reliably continue waiting until the next + yield() or enter_blocking_section() call (or we see a spurious condvar + wakeup, which are rare at best.) */ + custom_condvar_wait(&m->is_free, &m->lock); + } while (m->busy); + m->busy = 1; + m->waiters--; + pthread_mutex_unlock(&m->lock); +} + +/* Mutexes */ + +typedef pthread_mutex_t * st_mutex; + +static int st_mutex_create(st_mutex * res) +{ + int rc; + pthread_mutexattr_t attr; + st_mutex m; + + rc = pthread_mutexattr_init(&attr); + if (rc != 0) goto error1; + rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); + if (rc != 0) goto error2; + m = caml_stat_alloc_noexc(sizeof(pthread_mutex_t)); + if (m == NULL) { rc = ENOMEM; goto error2; } + rc = pthread_mutex_init(m, &attr); + if (rc != 0) goto error3; + pthread_mutexattr_destroy(&attr); + *res = m; + return 0; +error3: + caml_stat_free(m); +error2: + pthread_mutexattr_destroy(&attr); +error1: + return rc; +} + +static int st_mutex_destroy(st_mutex m) +{ + int rc; + rc = pthread_mutex_destroy(m); + caml_stat_free(m); + return rc; +} + +#define MUTEX_DEADLOCK EDEADLK + +Caml_inline int st_mutex_lock(st_mutex m) +{ + return pthread_mutex_lock(m); +} + +#define MUTEX_PREVIOUSLY_UNLOCKED 0 +#define MUTEX_ALREADY_LOCKED EBUSY + +Caml_inline int st_mutex_trylock(st_mutex m) +{ + return pthread_mutex_trylock(m); +} + +#define MUTEX_NOT_OWNED EPERM + +Caml_inline int st_mutex_unlock(st_mutex m) +{ + return pthread_mutex_unlock(m); +} + +/* Condition variables */ + +typedef custom_condvar * st_condvar; + +static int st_condvar_create(st_condvar * res) +{ + int rc; + st_condvar c = caml_stat_alloc_noexc(sizeof(custom_condvar)); + if (c == NULL) return ENOMEM; + rc = custom_condvar_init(c); + if (rc != 0) { caml_stat_free(c); return rc; } + *res = c; + return 0; +} + +static int st_condvar_destroy(st_condvar c) +{ + int rc; + rc = custom_condvar_destroy(c); + caml_stat_free(c); + return rc; +} + +Caml_inline int st_condvar_signal(st_condvar c) +{ + return custom_condvar_signal(c); +} + +Caml_inline int st_condvar_broadcast(st_condvar c) +{ + return custom_condvar_broadcast(c); +} + +Caml_inline int st_condvar_wait(st_condvar c, st_mutex m) +{ + return custom_condvar_wait(c, m); +} + +/* Triggered events */ + +typedef struct st_event_struct { + pthread_mutex_t lock; /* to protect contents */ + int status; /* 0 = not triggered, 1 = triggered */ + custom_condvar triggered; /* signaled when triggered */ +} * st_event; + +static int st_event_create(st_event * res) +{ + int rc; + st_event e = caml_stat_alloc_noexc(sizeof(struct st_event_struct)); + if (e == NULL) return ENOMEM; + rc = pthread_mutex_init(&e->lock, NULL); + if (rc != 0) { caml_stat_free(e); return rc; } + rc = custom_condvar_init(&e->triggered); + if (rc != 0) + { pthread_mutex_destroy(&e->lock); caml_stat_free(e); return rc; } + e->status = 0; + *res = e; + return 0; +} + +static int st_event_destroy(st_event e) +{ + int rc1, rc2; + rc1 = pthread_mutex_destroy(&e->lock); + rc2 = custom_condvar_destroy(&e->triggered); + caml_stat_free(e); + return rc1 != 0 ? rc1 : rc2; +} + +static int st_event_trigger(st_event e) +{ + int rc; + rc = pthread_mutex_lock(&e->lock); + if (rc != 0) return rc; + e->status = 1; + rc = pthread_mutex_unlock(&e->lock); + if (rc != 0) return rc; + rc = custom_condvar_broadcast(&e->triggered); + return rc; +} + +static int st_event_wait(st_event e) +{ + int rc; + rc = pthread_mutex_lock(&e->lock); + if (rc != 0) return rc; + while(e->status == 0) { + rc = custom_condvar_wait(&e->triggered, &e->lock); + if (rc != 0) return rc; + } + rc = pthread_mutex_unlock(&e->lock); + return rc; +} + +/* Reporting errors */ + +static void st_check_error(int retcode, char * msg) +{ + char * err; + int errlen, msglen; + value str; + + if (retcode == 0) return; + if (retcode == ENOMEM) caml_raise_out_of_memory(); + err = strerror(retcode); + msglen = strlen(msg); + errlen = strlen(err); + str = caml_alloc_string(msglen + 2 + errlen); + memmove (&Byte(str, 0), msg, msglen); + memmove (&Byte(str, msglen), ": ", 2); + memmove (&Byte(str, msglen + 2), err, errlen); + caml_raise_sys_error(str); +} + +/* Variable used to stop the "tick" thread */ +static volatile int caml_tick_thread_stop = 0; + +/* The tick thread: posts a SIGPREEMPTION signal periodically */ + +static void * caml_thread_tick(void * arg) +{ + struct timeval timeout; + sigset_t mask; + + /* Block all signals so that we don't try to execute an OCaml signal handler*/ + sigfillset(&mask); + pthread_sigmask(SIG_BLOCK, &mask, NULL); + while(! caml_tick_thread_stop) { + /* select() seems to be the most efficient way to suspend the + thread for sub-second intervals */ + timeout.tv_sec = 0; + timeout.tv_usec = Thread_timeout * 1000; + select(0, NULL, NULL, NULL, &timeout); + /* The preemption signal should never cause a callback, so don't + go through caml_handle_signal(), just record signal delivery via + caml_record_signal(). */ + caml_record_signal(SIGPREEMPTION); + } + return NULL; +} + +/* "At fork" processing */ + +#if defined(__ANDROID__) +/* Android's libc does not include declaration of pthread_atfork; + however, it implements it since API level 10 (Gingerbread). + The reason for the omission is that Android (GUI) applications + are not supposed to fork at all, however this workaround is still + included in case OCaml is used for an Android CLI utility. */ +int pthread_atfork(void (*prepare)(void), void (*parent)(void), + void (*child)(void)); +#endif + +static int st_atfork(void (*fn)(void)) +{ + return pthread_atfork(NULL, NULL, fn); +} + +/* Signal handling */ + +static void st_decode_sigset(value vset, sigset_t * set) +{ + sigemptyset(set); + while (vset != Val_int(0)) { + int sig = caml_convert_signal_number(Int_val(Field(vset, 0))); + sigaddset(set, sig); + vset = Field(vset, 1); + } +} + +#ifndef NSIG +#define NSIG 64 +#endif + +static value st_encode_sigset(sigset_t * set) +{ + value res = Val_int(0); + int i; + + Begin_root(res) + for (i = 1; i < NSIG; i++) + if (sigismember(set, i) > 0) { + value newcons = caml_alloc_small(2, 0); + Field(newcons, 0) = Val_int(caml_rev_convert_signal_number(i)); + Field(newcons, 1) = res; + res = newcons; + } + End_roots(); + return res; +} + +static int sigmask_cmd[3] = { SIG_SETMASK, SIG_BLOCK, SIG_UNBLOCK }; + +value caml_thread_sigmask(value cmd, value sigs) /* ML */ +{ + int how; + sigset_t set, oldset; + int retcode; + + how = sigmask_cmd[Int_val(cmd)]; + st_decode_sigset(sigs, &set); + caml_enter_blocking_section(); + retcode = pthread_sigmask(how, &set, &oldset); + caml_leave_blocking_section(); + st_check_error(retcode, "Thread.sigmask"); + /* Run any handlers for just-unmasked pending signals */ + caml_process_pending_actions(); + return st_encode_sigset(&oldset); +} + +value caml_wait_signal(value sigs) /* ML */ +{ +#ifdef HAS_SIGWAIT + sigset_t set; + int retcode, signo; + + st_decode_sigset(sigs, &set); + caml_enter_blocking_section(); + retcode = sigwait(&set, &signo); + caml_leave_blocking_section(); + st_check_error(retcode, "Thread.wait_signal"); + return Val_int(caml_rev_convert_signal_number(signo)); +#else + caml_invalid_argument("Thread.wait_signal not implemented"); + return Val_int(0); /* not reached */ +#endif +} diff --git a/otherlibs/systhreads4/st_stubs.c b/otherlibs/systhreads4/st_stubs.c new file mode 100644 index 00000000000..476ceb6c184 --- /dev/null +++ b/otherlibs/systhreads4/st_stubs.c @@ -0,0 +1,1151 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 1995 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. */ +/* */ +/**************************************************************************/ + +#define CAML_INTERNALS + +#define CAML_NAME_SPACE +#include "caml/compatibility.h" +#undef CAML_NAME_SPACE + +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/custom.h" +#include "caml/debugger.h" +#include "caml/domain.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/roots.h" +#include "caml/signals.h" +#ifdef NATIVE_CODE +#include "caml/stack.h" +#else +#include "caml/stacks.h" +#endif +#include "caml/sys.h" +#include "caml/memprof.h" + +#define CAMLextern_libthreads +#include "threads.h" + +#ifndef NATIVE_CODE +/* Initial size of bytecode stack when a thread is created (4 Ko) */ +#define Thread_stack_size (Stack_size / 4) +#endif + +/* Max computation time before rescheduling, in milliseconds */ +#define Thread_timeout 50 + +/* OS-specific code */ +#ifdef _WIN32 +#include "st_win32.h" +#else +#include "st_posix.h" +#endif + +/* Atomics */ +#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 8 + /* GCC 4.8 shipped with a working implementation of atomics, but no + stdatomic.h header, so we need to use GCC-specific intrinsics. */ + + #define _Atomic /* GCC intrinsics work on normal variables */ + #define atomic_store(v, x) \ + __atomic_store_n((v), (x), __ATOMIC_SEQ_CST) + #define atomic_load(v) \ + __atomic_load_n((v), __ATOMIC_SEQ_CST) + #define atomic_exchange(v, x) \ + __atomic_exchange_n((v), (x), __ATOMIC_SEQ_CST) +#else + #include +#endif + + +/* The ML value describing a thread (heap-allocated) */ + +struct caml_thread_descr { + value ident; /* Unique integer ID */ + value start_closure; /* The closure to start this thread */ + value terminated; /* Triggered event for thread termination */ +}; + +#define Ident(v) (((struct caml_thread_descr *)(v))->ident) +#define Start_closure(v) (((struct caml_thread_descr *)(v))->start_closure) +#define Terminated(v) (((struct caml_thread_descr *)(v))->terminated) + +/* The infos on threads (allocated via caml_stat_alloc()) */ + +struct caml_thread_struct { + value descr; /* The heap-allocated descriptor (root) */ + struct caml_thread_struct * next; /* Double linking of running threads */ + struct caml_thread_struct * prev; +#ifdef NATIVE_CODE + char * top_of_stack; /* Top of stack for this thread (approx.) */ + char * bottom_of_stack; /* Saved value of Caml_state->_bottom_of_stack */ + uintnat last_retaddr; /* Saved value of Caml_state->_last_return_address */ + value * gc_regs; /* Saved value of Caml_state->_gc_regs */ + char * exn_handler; /* Saved value of Caml_state->_exn_handler */ + char * async_exception_pointer; + /* Saved value of Caml_state->_async_exception_pointer */ + struct caml__roots_block * local_roots; /* Saved value of local_roots */ + struct caml_local_arenas * local_arenas; + struct longjmp_buffer * exit_buf; /* For thread exit */ +#else + value * stack_low; /* The execution stack for this thread */ + value * stack_high; + value * stack_threshold; + value * sp; /* Saved value of Caml_state->_extern_sp for this thread */ + value * trapsp; /* Saved value of Caml_state->_trapsp for this thread */ + /* Saved value of Caml_state->_local_roots */ + struct caml__roots_block * local_roots; + struct longjmp_buffer * external_raise; /* Saved Caml_state->_external_raise */ + struct longjmp_buffer * external_raise_async; + /* Saved Caml_state->_external_raise_async */ +#endif + int backtrace_pos; /* Saved Caml_state->_backtrace_pos */ + backtrace_slot * backtrace_buffer; /* Saved Caml_state->_backtrace_buffer */ + value backtrace_last_exn; /* Saved Caml_state->_backtrace_last_exn (root) */ + struct caml_memprof_th_ctx *memprof_ctx; +}; + +typedef struct caml_thread_struct * caml_thread_t; + +/* The "head" of the circular list of thread descriptors */ +static caml_thread_t all_threads = NULL; + +/* The descriptor for the currently executing thread */ +static caml_thread_t curr_thread = NULL; + +/* The master lock protecting the OCaml runtime system */ +static struct caml_locking_scheme* _Atomic caml_locking_scheme; + +/* Whether the "tick" thread is already running */ +static int caml_tick_thread_running = 0; + +/* Whether the "tick" thread is enabled */ +static int caml_tick_thread_enabled = 1; + +/* The thread identifier of the "tick" thread */ +static st_thread_id caml_tick_thread_id; + +/* The key used for storing the thread descriptor in the specific data + of the corresponding system thread. */ +static st_tlskey thread_descriptor_key; + +/* The key used for unlocking I/O channels on exceptions */ +static st_tlskey last_channel_locked_key; + +/* Identifier for next thread creation */ +static intnat thread_next_ident = 0; + +/* Forward declarations */ +static value caml_threadstatus_new (void); +static void caml_threadstatus_terminate (value); +static st_retcode caml_threadstatus_wait (value); + +/* Imports from the native-code runtime system */ +#ifdef NATIVE_CODE +extern struct longjmp_buffer caml_termination_jmpbuf; +extern void (*caml_termination_hook)(void); +#endif + +/* The default locking scheme */ +static st_masterlock default_master_lock; + +static int default_can_skip_yield(void* m) +{ + return st_masterlock_waiters(m) == 0; +} + +struct caml_locking_scheme caml_default_locking_scheme = + { &default_master_lock, + (void (*)(void*))&st_masterlock_acquire, + (void (*)(void*))&st_masterlock_release, + NULL, + NULL, + (void (*)(void*))&st_masterlock_init, + default_can_skip_yield, + (void (*)(void*))&st_thread_yield }; + +CAMLexport struct caml_locking_scheme *caml_get_default_locking_scheme(void) +{ + return &caml_default_locking_scheme; +} + +static void acquire_runtime_lock(void) +{ + struct caml_locking_scheme* s; + + /* The locking scheme may be changed by the thread that currently + holds it. This means that it may change while we're waiting to + acquire it, so by the time we acquire it it may no longer be the + right scheme. */ + + retry: + s = atomic_load(&caml_locking_scheme); + s->lock(s->context); + if (atomic_load(&caml_locking_scheme) != s) { + /* This is no longer the right scheme. Unlock and try again */ + s->unlock(s->context); + goto retry; + } +} + +static void release_runtime_lock(void) +{ + /* There is no tricky case here like in acquire, as only the holder + of the lock can change it. (Here, that's us) */ + struct caml_locking_scheme* s; + s = atomic_load(&caml_locking_scheme); + s->unlock(s->context); +} + +/* Hook for scanning the stacks of the other threads */ + +static void (*prev_scan_roots_hook) (scanning_action); + +static void caml_thread_scan_roots(scanning_action action) +{ + caml_thread_t th = curr_thread; + do { + (*action)(th->descr, &th->descr); + (*action)(th->backtrace_last_exn, &th->backtrace_last_exn); + /* Don't rescan the stack of the current thread, it was done already */ + if (th != curr_thread) { +#ifdef NATIVE_CODE + if (th->bottom_of_stack != NULL) + caml_do_local_roots(action, action, th->bottom_of_stack, th->last_retaddr, + th->gc_regs, th->local_roots, th->local_arenas); +#else + caml_do_local_roots(action, th->sp, th->stack_high, th->local_roots); +#endif + } + th = th->next; + } while (th != curr_thread); + /* Hook */ + if (prev_scan_roots_hook != NULL) (*prev_scan_roots_hook)(action); +} + +/* Hook for iterating over Memprof's entries arrays */ + +static void memprof_ctx_iter(th_ctx_action f, void* data) +{ + caml_thread_t th = curr_thread; + do { + f(th->memprof_ctx, data); + th = th->next; + } while (th != curr_thread); +} + +/* Saving and restoring runtime state in curr_thread */ + +CAMLexport void caml_thread_save_runtime_state(void) +{ +#ifdef NATIVE_CODE + curr_thread->top_of_stack = Caml_state->_top_of_stack; + curr_thread->bottom_of_stack = Caml_state->_bottom_of_stack; + curr_thread->last_retaddr = Caml_state->_last_return_address; + curr_thread->gc_regs = Caml_state->_gc_regs; + curr_thread->exn_handler = Caml_state->_exn_handler; + curr_thread->async_exception_pointer = Caml_state->_async_exception_pointer; + curr_thread->local_arenas = caml_get_local_arenas(); +#else + curr_thread->stack_low = Caml_state->_stack_low; + curr_thread->stack_high = Caml_state->_stack_high; + curr_thread->stack_threshold = Caml_state->_stack_threshold; + curr_thread->sp = Caml_state->_extern_sp; + curr_thread->trapsp = Caml_state->_trapsp; + curr_thread->external_raise = Caml_state->_external_raise; + curr_thread->external_raise_async = Caml_state->_external_raise_async; +#endif + curr_thread->local_roots = Caml_state->_local_roots; + curr_thread->backtrace_pos = Caml_state->_backtrace_pos; + curr_thread->backtrace_buffer = Caml_state->_backtrace_buffer; + curr_thread->backtrace_last_exn = Caml_state->_backtrace_last_exn; + caml_memprof_leave_thread(); +} + +CAMLexport void caml_thread_restore_runtime_state(void) +{ + /* Update curr_thread to point to the thread descriptor corresponding + to the thread currently executing */ + curr_thread = st_tls_get(thread_descriptor_key); + +#ifdef NATIVE_CODE + Caml_state->_top_of_stack = curr_thread->top_of_stack; + Caml_state->_bottom_of_stack= curr_thread->bottom_of_stack; + Caml_state->_last_return_address = curr_thread->last_retaddr; + Caml_state->_gc_regs = curr_thread->gc_regs; + Caml_state->_exn_handler = curr_thread->exn_handler; + Caml_state->_async_exception_pointer = curr_thread->async_exception_pointer; + caml_set_local_arenas(curr_thread->local_arenas); +#else + Caml_state->_stack_low = curr_thread->stack_low; + Caml_state->_stack_high = curr_thread->stack_high; + Caml_state->_stack_threshold = curr_thread->stack_threshold; + Caml_state->_extern_sp = curr_thread->sp; + Caml_state->_trapsp = curr_thread->trapsp; + Caml_state->_external_raise = curr_thread->external_raise; + Caml_state->_external_raise_async = curr_thread->external_raise_async; +#endif + Caml_state->_local_roots = curr_thread->local_roots; + Caml_state->_backtrace_pos = curr_thread->backtrace_pos; + Caml_state->_backtrace_buffer = curr_thread->backtrace_buffer; + Caml_state->_backtrace_last_exn = curr_thread->backtrace_last_exn; + caml_memprof_enter_thread(curr_thread->memprof_ctx); +} + +CAMLexport void caml_switch_runtime_locking_scheme(struct caml_locking_scheme* new) +{ + struct caml_locking_scheme* old; + + caml_thread_save_runtime_state(); + old = atomic_exchange(&caml_locking_scheme, new); + /* We hold 'old', but it is no longer the runtime lock */ + old->unlock(old->context); + acquire_runtime_lock(); + caml_thread_restore_runtime_state(); +} + + +/* Hooks for caml_enter_blocking_section and caml_leave_blocking_section */ + + +static void caml_thread_enter_blocking_section(void) +{ + /* Save the current runtime state in the thread descriptor + of the current thread */ + caml_thread_save_runtime_state(); + /* Tell other threads that the runtime is free */ + release_runtime_lock(); +} + +static void caml_thread_leave_blocking_section(void) +{ +#ifdef _WIN32 + /* TlsGetValue calls SetLastError which will mask any error which occurred + prior to the caml_thread_leave_blocking_section call. EnterCriticalSection + does not do this. */ + DWORD error = GetLastError(); +#endif + /* Wait until the runtime is free */ + acquire_runtime_lock(); + caml_thread_restore_runtime_state(); +#ifdef _WIN32 + SetLastError(error); +#endif +} + +/* Hooks for I/O locking */ + +static void caml_io_mutex_free(struct channel *chan) +{ + st_mutex mutex = chan->mutex; + if (mutex != NULL) { + st_mutex_destroy(mutex); + chan->mutex = NULL; + } +} + +static void caml_io_mutex_lock(struct channel *chan) +{ + st_mutex mutex = chan->mutex; + + if (mutex == NULL) { + st_check_error(st_mutex_create(&mutex), "channel locking"); /*PR#7038*/ + chan->mutex = mutex; + } + /* PR#4351: first try to acquire mutex without releasing the master lock */ + if (st_mutex_trylock(mutex) == MUTEX_PREVIOUSLY_UNLOCKED) { + st_tls_set(last_channel_locked_key, (void *) chan); + return; + } + /* If unsuccessful, block on mutex */ + caml_enter_blocking_section(); + st_mutex_lock(mutex); + /* Problem: if a signal occurs at this point, + and the signal handler raises an exception, we will not + unlock the mutex. The alternative (doing the setspecific + before locking the mutex is also incorrect, since we could + then unlock a mutex that is unlocked or locked by someone else. */ + st_tls_set(last_channel_locked_key, (void *) chan); + caml_leave_blocking_section(); +} + +static void caml_io_mutex_unlock(struct channel *chan) +{ + st_mutex_unlock(chan->mutex); + st_tls_set(last_channel_locked_key, NULL); +} + +static void caml_io_mutex_unlock_exn(void) +{ + struct channel * chan = st_tls_get(last_channel_locked_key); + if (chan != NULL) caml_io_mutex_unlock(chan); +} + +/* Hook for estimating stack usage */ + +static uintnat (*prev_stack_usage_hook)(void); + +static uintnat caml_thread_stack_usage(void) +{ + uintnat sz; + caml_thread_t th; + + /* Don't add stack for current thread, this is done elsewhere */ + for (sz = 0, th = curr_thread->next; + th != curr_thread; + th = th->next) { +#ifdef NATIVE_CODE + if(th->top_of_stack != NULL && th->bottom_of_stack != NULL && + th->top_of_stack > th->bottom_of_stack) + sz += (value *) th->top_of_stack - (value *) th->bottom_of_stack; +#else + sz += th->stack_high - th->sp; +#endif + } + if (prev_stack_usage_hook != NULL) + sz += prev_stack_usage_hook(); + return sz; +} + +/* Create and setup a new thread info block. + This block has no associated thread descriptor and + is not inserted in the list of threads. */ + +static caml_thread_t caml_thread_new_info(void) +{ + caml_thread_t th; + th = (caml_thread_t) caml_stat_alloc_noexc(sizeof(struct caml_thread_struct)); + if (th == NULL) return NULL; + th->descr = Val_unit; /* filled later */ +#ifdef NATIVE_CODE + th->bottom_of_stack = NULL; + th->top_of_stack = NULL; + th->last_retaddr = 1; + th->exn_handler = NULL; + th->async_exception_pointer = NULL; + th->local_roots = NULL; + th->local_arenas = NULL; + th->exit_buf = NULL; +#else + /* Allocate the stacks */ + th->stack_low = (value *) caml_stat_alloc(Thread_stack_size); + th->stack_high = th->stack_low + Thread_stack_size / sizeof(value); + th->stack_threshold = th->stack_low + Stack_threshold / sizeof(value); + th->sp = th->stack_high; + th->trapsp = th->stack_high; + th->local_roots = NULL; + th->external_raise = NULL; + th->external_raise_async = NULL; +#endif + th->backtrace_pos = 0; + th->backtrace_buffer = NULL; + th->backtrace_last_exn = Val_unit; + th->memprof_ctx = caml_memprof_new_th_ctx(); + return th; +} + +/* Allocate a thread descriptor block. */ + +static value caml_thread_new_descriptor(value clos) +{ + value mu = Val_unit; + value descr; + Begin_roots2 (clos, mu) + /* Create and initialize the termination semaphore */ + mu = caml_threadstatus_new(); + /* Create a descriptor for the new thread */ + descr = caml_alloc_small(3, 0); + Ident(descr) = Val_long(thread_next_ident); + Start_closure(descr) = clos; + Terminated(descr) = mu; + thread_next_ident++; + End_roots(); + return descr; +} + +/* Remove a thread info block from the list of threads. + Free it and its stack resources. */ + +static void caml_thread_remove_info(caml_thread_t th) +{ + if (th->next == th) + all_threads = NULL; /* last OCaml thread exiting */ + else if (all_threads == th) + all_threads = th->next; /* PR#5295 */ + th->next->prev = th->prev; + th->prev->next = th->next; +#ifndef NATIVE_CODE + caml_stat_free(th->stack_low); +#endif + if (th->backtrace_buffer != NULL) caml_stat_free(th->backtrace_buffer); + caml_stat_free(th); +} + +/* Reinitialize the thread machinery after a fork() (PR#4577) */ + +static void caml_thread_reinitialize(void) +{ + struct channel * chan; + struct caml_locking_scheme* s; + + /* Remove all other threads (now nonexistent) + from the doubly-linked list of threads */ + while (curr_thread->next != curr_thread) { + caml_memprof_delete_th_ctx(curr_thread->next->memprof_ctx); + caml_thread_remove_info(curr_thread->next); + } + + /* Reinitialize the master lock machinery, + just in case the fork happened while other threads were doing + caml_leave_blocking_section */ + s = atomic_load(&caml_locking_scheme); + s->reinitialize_after_fork(s->context); + /* Tick thread is not currently running in child process, will be + re-created at next Thread.create */ + caml_tick_thread_running = 0; + /* Destroy all IO mutexes; will be reinitialized on demand */ + for (chan = caml_all_opened_channels; + chan != NULL; + chan = chan->next) { + if (chan->mutex != NULL) { + st_mutex_destroy(chan->mutex); + chan->mutex = NULL; + } + } +} + +/* Installation of hooks for OCaml 5 stdlib compatibility. + See runtime4/domain.{c,h}. + Another approach would have been to use weak symbols, to override + dummy implementations in domain.c, but unfortunately that doesn't work + with the bytecode interpreter. + */ + +value caml_mutex_new(value unit); +value caml_mutex_lock(value wrapper); +value caml_mutex_unlock(value wrapper); +value caml_mutex_try_lock(value wrapper); +value caml_condition_new(value unit); +value caml_condition_wait(value wcond, value wmut); +value caml_condition_signal(value wrapper); +value caml_condition_broadcast(value wrapper); + +static void install_ocaml_5_compatibility_hooks(void) +{ + caml_hook_mutex_new = &caml_mutex_new; + caml_hook_mutex_lock = &caml_mutex_lock; + caml_hook_mutex_try_lock = &caml_mutex_try_lock; + caml_hook_mutex_unlock = &caml_mutex_unlock; + caml_hook_condition_new = &caml_condition_new; + caml_hook_condition_wait = &caml_condition_wait; + caml_hook_condition_signal = &caml_condition_signal; + caml_hook_condition_broadcast = &caml_condition_broadcast; +} + +/* Initialize the thread machinery */ + +CAMLprim value caml_thread_initialize(value unit) /* ML */ +{ + /* Protect against repeated initialization (PR#3532) */ + if (curr_thread != NULL) return Val_unit; + /* OCaml 5 compatibility */ + install_ocaml_5_compatibility_hooks(); + /* OS-specific initialization */ + st_initialize(); + /* Initialize and acquire the master lock */ + st_masterlock_init(&default_master_lock); + caml_locking_scheme = &caml_default_locking_scheme; + /* Initialize the keys */ + st_tls_newkey(&thread_descriptor_key); + st_tls_newkey(&last_channel_locked_key); + /* Set up a thread info block for the current thread */ + curr_thread = + (caml_thread_t) caml_stat_alloc(sizeof(struct caml_thread_struct)); + curr_thread->descr = caml_thread_new_descriptor(Val_unit); + curr_thread->next = curr_thread; + curr_thread->prev = curr_thread; + all_threads = curr_thread; + curr_thread->backtrace_last_exn = Val_unit; +#ifdef NATIVE_CODE + curr_thread->exit_buf = &caml_termination_jmpbuf; +#endif + curr_thread->memprof_ctx = &caml_memprof_main_ctx; + /* The stack-related fields will be filled in at the next + caml_enter_blocking_section */ + /* Associate the thread descriptor with the thread */ + st_tls_set(thread_descriptor_key, (void *) curr_thread); + st_thread_set_id(Ident(curr_thread->descr)); + /* Set up the hooks */ + prev_scan_roots_hook = caml_scan_roots_hook; + caml_scan_roots_hook = caml_thread_scan_roots; + caml_enter_blocking_section_hook = caml_thread_enter_blocking_section; + caml_leave_blocking_section_hook = caml_thread_leave_blocking_section; +#ifdef NATIVE_CODE + caml_termination_hook = st_thread_exit; +#endif + caml_channel_mutex_free = caml_io_mutex_free; + caml_channel_mutex_lock = caml_io_mutex_lock; + caml_channel_mutex_unlock = caml_io_mutex_unlock; + caml_channel_mutex_unlock_exn = caml_io_mutex_unlock_exn; + prev_stack_usage_hook = caml_stack_usage_hook; + caml_stack_usage_hook = caml_thread_stack_usage; + caml_memprof_th_ctx_iter_hook = memprof_ctx_iter; + /* Set up fork() to reinitialize the thread machinery in the child + (PR#4577) */ + st_atfork(caml_thread_reinitialize); + return Val_unit; +} + +/* Start tick thread, if not already running */ +static st_retcode start_tick_thread(void) +{ + st_retcode err; + if (caml_tick_thread_running) return 0; + err = st_thread_create(&caml_tick_thread_id, caml_thread_tick, NULL); + if (err == 0) caml_tick_thread_running = 1; + return err; +} + +/* Stop tick thread, if currently running */ +static void stop_tick_thread(void) +{ + if (!caml_tick_thread_running) return; + caml_tick_thread_stop = 1; + st_thread_join(caml_tick_thread_id); + caml_tick_thread_stop = 0; + caml_tick_thread_running = 0; +} + +CAMLprim value caml_enable_tick_thread(value v_enable) +{ + int enable = Long_val(v_enable) ? 1 : 0; + + if (enable) { + st_retcode err = start_tick_thread(); + st_check_error(err, "caml_enable_tick_thread"); + } else { + stop_tick_thread(); + } + + caml_tick_thread_enabled = enable; + return Val_unit; +} + +/* Cleanup the thread machinery when the runtime is shut down. Joining the tick + thread take 25ms on average / 50ms in the worst case, so we don't do it on + program exit. */ + +CAMLprim value caml_thread_cleanup(value unit) /* ML */ +{ + stop_tick_thread(); + return Val_unit; +} + +/* Thread cleanup at termination */ + +static void caml_thread_stop(void) +{ + /* PR#5188, PR#7220: some of the global runtime state may have + changed as the thread was running, so we save it in the + curr_thread data to make sure that the cleanup logic + below uses accurate information. */ + caml_thread_save_runtime_state(); + /* Tell memprof that this thread is terminating. */ + caml_memprof_delete_th_ctx(curr_thread->memprof_ctx); + /* Signal that the thread has terminated */ + caml_threadstatus_terminate(Terminated(curr_thread->descr)); + /* Remove th from the doubly-linked list of threads and free its info block */ + caml_thread_remove_info(curr_thread); + /* If no other OCaml thread remains, ask the tick thread to stop + so that it does not prevent the whole process from exiting (#9971) */ + if (all_threads == NULL) caml_thread_cleanup(Val_unit); + /* OS-specific cleanups */ + st_thread_cleanup(); + /* Release the runtime system */ + release_runtime_lock(); +} + +/* Create a thread */ + +static ST_THREAD_FUNCTION caml_thread_start(void * arg) +{ + caml_thread_t th = (caml_thread_t) arg; + value clos; + void * signal_stack; + struct caml_locking_scheme* sch; +#ifdef NATIVE_CODE + struct longjmp_buffer termination_buf; + char tos; + /* Record top of stack (approximative) */ + th->top_of_stack = &tos; +#endif + + /* Associate the thread descriptor with the thread */ + st_tls_set(thread_descriptor_key, (void *) th); + sch = atomic_load(&caml_locking_scheme); + if (sch->thread_start != NULL) + sch->thread_start(sch->context, Thread_type_caml); + /* Acquire the global mutex */ + caml_leave_blocking_section(); + st_thread_set_id(Ident(th->descr)); + signal_stack = caml_setup_stack_overflow_detection(); +#ifdef NATIVE_CODE + /* Setup termination handler (for caml_thread_exit) */ + if (sigsetjmp(termination_buf.buf, 0) == 0) { + th->exit_buf = &termination_buf; +#endif + /* Callback the closure */ + clos = Start_closure(th->descr); + caml_modify(&(Start_closure(th->descr)), Val_unit); + caml_callback_exn(clos, Val_unit); + caml_thread_stop(); + sch = atomic_load(&caml_locking_scheme); + if (sch->thread_stop != NULL) + sch->thread_stop(sch->context, Thread_type_caml); +#ifdef NATIVE_CODE + } +#endif + caml_stop_stack_overflow_detection(signal_stack); + /* The thread now stops running */ + return 0; +} + +CAMLprim value caml_thread_new(value clos) /* ML */ +{ + caml_thread_t th; + st_retcode err; + +#ifndef NATIVE_CODE + if (caml_debugger_in_use) + caml_fatal_error("ocamldebug does not support multithreaded programs"); +#endif + /* Create a thread info block */ + th = caml_thread_new_info(); + if (th == NULL) caml_raise_out_of_memory(); + /* Equip it with a thread descriptor */ + th->descr = caml_thread_new_descriptor(clos); + /* Add thread info block to the list of threads */ + th->next = curr_thread->next; + th->prev = curr_thread; + curr_thread->next->prev = th; + curr_thread->next = th; + /* Create the new thread */ + err = st_thread_create(NULL, caml_thread_start, (void *) th); + if (err != 0) { + /* Creation failed, remove thread info block from list of threads */ + caml_thread_remove_info(th); + st_check_error(err, "Thread.create"); + } + /* Create the tick thread if not already done. + Because of PR#4666, we start the tick thread late, only when we create + the first additional thread in the current process*/ + if (caml_tick_thread_enabled) { + err = start_tick_thread(); + st_check_error(err, "Thread.create"); + } + return th->descr; +} + +/* Register a thread already created from C */ + +CAMLexport int caml_c_thread_register(void) +{ + caml_thread_t th; + struct caml_locking_scheme* sch; +#ifdef NATIVE_CODE + st_retcode err; +#endif + + sch = atomic_load(&caml_locking_scheme); + if (sch->thread_start != NULL) + sch->thread_start(sch->context, Thread_type_c_registered); + + /* Already registered? */ + if (st_tls_get(thread_descriptor_key) != NULL) return 0; + /* Create a thread info block */ + th = caml_thread_new_info(); + if (th == NULL) return 0; +#ifdef NATIVE_CODE + th->top_of_stack = (char *) &err; +#endif + /* Take master lock to protect access to the chaining of threads */ + acquire_runtime_lock(); + /* Add thread info block to the list of threads */ + if (all_threads == NULL) { + th->next = th; + th->prev = th; + all_threads = th; + } else { + th->next = all_threads->next; + th->prev = all_threads; + all_threads->next->prev = th; + all_threads->next = th; + } + /* Associate the thread descriptor with the thread */ + st_tls_set(thread_descriptor_key, (void *) th); + /* Release the master lock */ + release_runtime_lock(); + /* Now we can re-enter the run-time system and heap-allocate the descriptor */ + caml_leave_blocking_section(); + th->descr = caml_thread_new_descriptor(Val_unit); /* no closure */ + st_thread_set_id(Ident(th->descr)); + /* Create the tick thread if not already done. */ + if (caml_tick_thread_enabled) start_tick_thread(); + /* Exit the run-time system */ + caml_enter_blocking_section(); + return 1; +} + +/* Unregister a thread that was created from C and registered with + the function above */ + +CAMLexport int caml_c_thread_unregister(void) +{ + struct caml_locking_scheme* sch; + caml_thread_t th = st_tls_get(thread_descriptor_key); + /* Not registered? */ + if (th == NULL) return 0; + /* Wait until the runtime is available */ + acquire_runtime_lock(); + /* Forget the thread descriptor */ + st_tls_set(thread_descriptor_key, NULL); + /* Remove thread info block from list of threads, and free it */ + caml_thread_remove_info(th); + /* If no other OCaml thread remains, ask the tick thread to stop + so that it does not prevent the whole process from exiting (#9971) */ + if (all_threads == NULL) caml_thread_cleanup(Val_unit); + /* Release the runtime */ + release_runtime_lock(); + sch = atomic_load(&caml_locking_scheme); + if (sch->thread_stop != NULL) + sch->thread_stop(sch->context, Thread_type_c_registered); + return 1; +} + +/* Return the current thread */ + +CAMLprim value caml_thread_self(value unit) /* ML */ +{ + if (curr_thread == NULL) + caml_invalid_argument("Thread.self: not initialized"); + return curr_thread->descr; +} + +/* Return the identifier of a thread */ + +CAMLprim value caml_thread_id(value th) /* ML */ +{ + return Ident(th); +} + +/* Print uncaught exception and backtrace */ + +CAMLprim value caml_thread_uncaught_exception(value exn) /* ML */ +{ + char * msg = caml_format_exception(exn); + fprintf(stderr, "Thread %d killed on uncaught exception %s\n", + Int_val(Ident(curr_thread->descr)), msg); + caml_stat_free(msg); + if (Caml_state->_backtrace_active) caml_print_exception_backtrace(); + fflush(stderr); + return Val_unit; +} + +/* Terminate current thread */ + +CAMLprim value caml_thread_exit(value unit) /* ML */ +{ + struct longjmp_buffer * exit_buf = NULL; + + if (curr_thread == NULL) + caml_invalid_argument("Thread.exit: not initialized"); + + /* In native code, we cannot call pthread_exit here because on some + systems this raises a C++ exception, and ocamlopt-generated stack + frames cannot be unwound. Instead, we longjmp to the thread + creation point (in caml_thread_start) or to the point in + caml_main where caml_termination_hook will be called. + Note that threads created in C then registered do not have + a creation point (exit_buf == NULL). + */ +#ifdef NATIVE_CODE + exit_buf = curr_thread->exit_buf; +#endif + caml_thread_stop(); + if (exit_buf != NULL) { + /* Native-code and (main thread or thread created by OCaml) */ + siglongjmp(exit_buf->buf, 1); + } else { + /* Bytecode, or thread created from C */ + st_thread_exit(); + } + return Val_unit; /* not reached */ +} + +/* Allow re-scheduling */ + +CAMLprim value caml_thread_yield(value unit) /* ML */ +{ + struct caml_locking_scheme* s; + + s = atomic_load(&caml_locking_scheme); + if (s->can_skip_yield != NULL && s->can_skip_yield(s->context)) + return Val_unit; + + /* Do all the parts of a blocking section enter/leave except lock + manipulation, which we'll do more efficiently in st_thread_yield. (Since + our blocking section doesn't contain anything interesting, don't bother + with saving errno.) + */ + caml_raise_async_if_exception(caml_process_pending_signals_exn(), + "signal handler"); + caml_thread_save_runtime_state(); + /* caml_locking_scheme may have changed in caml_process_pending_signals_exn */ + s = atomic_load(&caml_locking_scheme); + s->yield(s->context); + if (atomic_load(&caml_locking_scheme) != s) { + /* The lock we have is no longer the runtime lock */ + s->unlock(s->context); + acquire_runtime_lock(); + } + caml_thread_restore_runtime_state(); + caml_raise_async_if_exception(caml_process_pending_signals_exn(), + "signal handler"); + + return Val_unit; +} + +/* Suspend the current thread until another thread terminates */ + +CAMLprim value caml_thread_join(value th) /* ML */ +{ + st_retcode rc = caml_threadstatus_wait(Terminated(th)); + st_check_error(rc, "Thread.join"); + return Val_unit; +} + +/* Mutex operations */ + +#define Mutex_val(v) (* ((st_mutex *) Data_custom_val(v))) + +static void caml_mutex_finalize(value wrapper) +{ + st_mutex_destroy(Mutex_val(wrapper)); +} + +static int caml_mutex_compare(value wrapper1, value wrapper2) +{ + st_mutex mut1 = Mutex_val(wrapper1); + st_mutex mut2 = Mutex_val(wrapper2); + return mut1 == mut2 ? 0 : mut1 < mut2 ? -1 : 1; +} + +static intnat caml_mutex_hash(value wrapper) +{ + return (intnat) (Mutex_val(wrapper)); +} + +static struct custom_operations caml_mutex_ops = { + "_mutex", + caml_mutex_finalize, + caml_mutex_compare, + caml_mutex_hash, + custom_serialize_default, + custom_deserialize_default, + custom_compare_ext_default, + custom_fixed_length_default +}; + +CAMLprim value caml_mutex_new(value unit) /* ML */ +{ + st_mutex mut = NULL; /* suppress warning */ + value wrapper; + st_check_error(st_mutex_create(&mut), "Mutex.create"); + wrapper = caml_alloc_custom(&caml_mutex_ops, sizeof(st_mutex *), + 0, 1); + Mutex_val(wrapper) = mut; + return wrapper; +} + +CAMLprim value caml_mutex_lock(value wrapper) /* ML */ +{ + st_mutex mut = Mutex_val(wrapper); + st_retcode retcode; + + /* PR#4351: first try to acquire mutex without releasing the master lock */ + if (st_mutex_trylock(mut) == MUTEX_PREVIOUSLY_UNLOCKED) return Val_unit; + /* If unsuccessful, block on mutex */ + Begin_root(wrapper) /* prevent the deallocation of mutex */ + caml_enter_blocking_section(); + retcode = st_mutex_lock(mut); + caml_leave_blocking_section(); + End_roots(); + st_check_error(retcode, "Mutex.lock"); + return Val_unit; +} + +CAMLprim value caml_mutex_unlock(value wrapper) /* ML */ +{ + st_mutex mut = Mutex_val(wrapper); + st_retcode retcode; + /* PR#4351: no need to release and reacquire master lock */ + retcode = st_mutex_unlock(mut); + st_check_error(retcode, "Mutex.unlock"); + return Val_unit; +} + +CAMLprim value caml_mutex_try_lock(value wrapper) /* ML */ +{ + st_mutex mut = Mutex_val(wrapper); + st_retcode retcode; + retcode = st_mutex_trylock(mut); + if (retcode == MUTEX_ALREADY_LOCKED) return Val_false; + st_check_error(retcode, "Mutex.try_lock"); + return Val_true; +} + +/* Conditions operations */ + +#define Condition_val(v) (* (st_condvar *) Data_custom_val(v)) + +static void caml_condition_finalize(value wrapper) +{ + st_condvar_destroy(Condition_val(wrapper)); +} + +static int caml_condition_compare(value wrapper1, value wrapper2) +{ + st_condvar cond1 = Condition_val(wrapper1); + st_condvar cond2 = Condition_val(wrapper2); + return cond1 == cond2 ? 0 : cond1 < cond2 ? -1 : 1; +} + +static intnat caml_condition_hash(value wrapper) +{ + return (intnat) (Condition_val(wrapper)); +} + +static struct custom_operations caml_condition_ops = { + "_condition", + caml_condition_finalize, + caml_condition_compare, + caml_condition_hash, + custom_serialize_default, + custom_deserialize_default, + custom_compare_ext_default, + custom_fixed_length_default +}; + +CAMLprim value caml_condition_new(value unit) /* ML */ +{ + st_condvar cond = NULL; /* suppress warning */ + value wrapper; + st_check_error(st_condvar_create(&cond), "Condition.create"); + wrapper = caml_alloc_custom(&caml_condition_ops, sizeof(st_condvar *), + 0, 1); + Condition_val(wrapper) = cond; + return wrapper; +} + +CAMLprim value caml_condition_wait(value wcond, value wmut) /* ML */ +{ + st_condvar cond = Condition_val(wcond); + st_mutex mut = Mutex_val(wmut); + st_retcode retcode; + + Begin_roots2(wcond, wmut) /* prevent deallocation of cond and mutex */ + caml_enter_blocking_section(); + retcode = st_condvar_wait(cond, mut); + caml_leave_blocking_section(); + End_roots(); + st_check_error(retcode, "Condition.wait"); + return Val_unit; +} + +CAMLprim value caml_condition_signal(value wrapper) /* ML */ +{ + st_check_error(st_condvar_signal(Condition_val(wrapper)), + "Condition.signal"); + return Val_unit; +} + +CAMLprim value caml_condition_broadcast(value wrapper) /* ML */ +{ + st_check_error(st_condvar_broadcast(Condition_val(wrapper)), + "Condition.broadcast"); + return Val_unit; +} + +/* Thread status blocks */ + +#define Threadstatus_val(v) (* ((st_event *) Data_custom_val(v))) + +static void caml_threadstatus_finalize(value wrapper) +{ + st_event_destroy(Threadstatus_val(wrapper)); +} + +static int caml_threadstatus_compare(value wrapper1, value wrapper2) +{ + st_event ts1 = Threadstatus_val(wrapper1); + st_event ts2 = Threadstatus_val(wrapper2); + return ts1 == ts2 ? 0 : ts1 < ts2 ? -1 : 1; +} + +static struct custom_operations caml_threadstatus_ops = { + "_threadstatus", + caml_threadstatus_finalize, + caml_threadstatus_compare, + custom_hash_default, + custom_serialize_default, + custom_deserialize_default, + custom_compare_ext_default, + custom_fixed_length_default +}; + +static value caml_threadstatus_new (void) +{ + st_event ts = NULL; /* suppress warning */ + value wrapper; + st_check_error(st_event_create(&ts), "Thread.create"); + wrapper = caml_alloc_custom(&caml_threadstatus_ops, sizeof(st_event *), + 0, 1); + Threadstatus_val(wrapper) = ts; + return wrapper; +} + +static void caml_threadstatus_terminate (value wrapper) +{ + st_event_trigger(Threadstatus_val(wrapper)); +} + +static st_retcode caml_threadstatus_wait (value wrapper) +{ + st_event ts = Threadstatus_val(wrapper); + st_retcode retcode; + + Begin_roots1(wrapper) /* prevent deallocation of ts */ + caml_enter_blocking_section(); + retcode = st_event_wait(ts); + caml_leave_blocking_section(); + End_roots(); + return retcode; +} diff --git a/otherlibs/systhreads4/st_win32.h b/otherlibs/systhreads4/st_win32.h new file mode 100644 index 00000000000..3f598a715de --- /dev/null +++ b/otherlibs/systhreads4/st_win32.h @@ -0,0 +1,538 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 2009 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. */ +/* */ +/**************************************************************************/ + +/* Win32 implementation of the "st" interface */ + +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0400 +#include +#include +#include +#include + +#include + +#if 1 +#define TRACE(x) +#define TRACE1(x,y) +#else +#include +#define TRACE(x) printf("%d: %s\n", GetCurrentThreadId(), x); fflush(stdout) +#define TRACE1(x,y) printf("%d: %s %p\n", GetCurrentThreadId(), x, (void *)y); \ + fflush(stdout) +#endif + +typedef DWORD st_retcode; + +#define SIGPREEMPTION SIGTERM + +/* Unique thread identifiers and atomic operations over them */ +#ifdef ARCH_SIXTYFOUR +typedef LONG64 st_tid; +#define Tid_Atomic_Exchange InterlockedExchange64 +#define Tid_Atomic_Compare_Exchange InterlockedCompareExchange64 +#else +typedef LONG st_tid; +#define Tid_Atomic_Exchange InterlockedExchange +#define Tid_Atomic_Compare_Exchange InterlockedCompareExchange +#endif + +/* Thread-local storage associating a Win32 event to every thread. */ +static DWORD st_thread_sem_key; + +/* Thread-local storage for the OCaml thread ID. */ +static DWORD st_thread_id_key; + +/* OS-specific initialization */ + +static DWORD st_initialize(void) +{ + DWORD result = 0; + st_thread_sem_key = TlsAlloc(); + if (st_thread_sem_key == TLS_OUT_OF_INDEXES) + return GetLastError(); + st_thread_id_key = TlsAlloc(); + if (st_thread_id_key == TLS_OUT_OF_INDEXES) { + result = GetLastError(); + TlsFree(st_thread_sem_key); + } + return result; +} + +/* Thread creation. Created in detached mode if [res] is NULL. */ + +typedef HANDLE st_thread_id; + +static DWORD st_thread_create(st_thread_id * res, + LPTHREAD_START_ROUTINE fn, void * arg) +{ + HANDLE h = CreateThread(NULL, 0, fn, arg, 0, NULL); + TRACE1("st_thread_create", h); + if (h == NULL) return GetLastError(); + if (res == NULL) + CloseHandle(h); + else + *res = h; + return 0; +} + +#define ST_THREAD_FUNCTION DWORD WINAPI + +/* Cleanup at thread exit */ + +static void st_thread_cleanup(void) +{ + HANDLE ev = (HANDLE) TlsGetValue(st_thread_sem_key); + if (ev != NULL) CloseHandle(ev); +} + +/* Thread termination */ + +CAMLnoreturn_start +static void st_thread_exit(void) +CAMLnoreturn_end; + +static void st_thread_exit(void) +{ + TRACE("st_thread_exit"); + ExitThread(0); +} + +static void st_thread_join(st_thread_id thr) +{ + TRACE1("st_thread_join", h); + WaitForSingleObject(thr, INFINITE); +} + +/* Thread-specific state */ + +typedef DWORD st_tlskey; + +static DWORD st_tls_newkey(st_tlskey * res) +{ + *res = TlsAlloc(); + if (*res == TLS_OUT_OF_INDEXES) + return GetLastError(); + else + return 0; +} + +Caml_inline void * st_tls_get(st_tlskey k) +{ + return TlsGetValue(k); +} + +Caml_inline void st_tls_set(st_tlskey k, void * v) +{ + TlsSetValue(k, v); +} + +/* OS-specific handling of the OCaml thread ID (must be called with the runtime + lock). */ +Caml_inline void st_thread_set_id(intnat id) +{ + CAMLassert(id != 0); + st_tls_set(st_thread_id_key, (void *)id); +} + +/* Return the identifier for the current thread. The 0 value is reserved. */ +Caml_inline intnat st_current_thread_id(void) +{ + intnat id = (intnat)st_tls_get(st_thread_id_key); + CAMLassert(id != 0); + return id; +} + +/* The master lock. */ + +typedef CRITICAL_SECTION st_masterlock; + +static void st_masterlock_init(st_masterlock * m) +{ + TRACE("st_masterlock_init"); + InitializeCriticalSection(m); + EnterCriticalSection(m); +} + +Caml_inline void st_masterlock_acquire(st_masterlock * m) +{ + TRACE("st_masterlock_acquire"); + EnterCriticalSection(m); + TRACE("st_masterlock_acquire (done)"); +} + +Caml_inline void st_masterlock_release(st_masterlock * m) +{ + LeaveCriticalSection(m); + TRACE("st_masterlock_released"); +} + +Caml_inline int st_masterlock_waiters(st_masterlock * m) +{ + return 1; /* info not maintained */ +} + +/* Scheduling hints */ + +Caml_inline void st_thread_yield(st_masterlock * m) +{ + LeaveCriticalSection(m); + Sleep(0); + EnterCriticalSection(m); +} + +/* Mutexes */ + +struct st_mutex_ { + CRITICAL_SECTION crit; + volatile st_tid owner; /* 0 if unlocked */ + /* The "owner" field is not always protected by "crit"; it is also + accessed without holding "crit", using the Interlocked API for + atomic accesses */ +}; + +typedef struct st_mutex_ * st_mutex; + +static DWORD st_mutex_create(st_mutex * res) +{ + st_mutex m = caml_stat_alloc_noexc(sizeof(struct st_mutex_)); + if (m == NULL) return ERROR_NOT_ENOUGH_MEMORY; + InitializeCriticalSection(&m->crit); + m->owner = 0; + *res = m; + return 0; +} + +static DWORD st_mutex_destroy(st_mutex m) +{ + DeleteCriticalSection(&m->crit); + caml_stat_free(m); + return 0; +} + +/* Error codes with the 29th bit set are reserved for the application */ + +#define MUTEX_DEADLOCK (1<<29 | 1) +#define MUTEX_PREVIOUSLY_UNLOCKED 0 +#define MUTEX_ALREADY_LOCKED (1 << 29) +#define MUTEX_NOT_OWNED (1<<29 | 2) + +Caml_inline DWORD st_mutex_lock(st_mutex m) +{ + st_tid self, prev; + TRACE1("st_mutex_lock", m); + self = st_current_thread_id(); + /* Critical sections are recursive locks, so this will succeed + if we already own the lock */ + EnterCriticalSection(&m->crit); + /* Record that we are the owner of the lock */ + prev = Tid_Atomic_Exchange(&m->owner, self); + if (prev != 0) { + /* The mutex was already locked by ourselves. + Cancel the EnterCriticalSection above and return an error. */ + TRACE1("st_mutex_lock (deadlock)", m); + LeaveCriticalSection(&m->crit); + return MUTEX_DEADLOCK; + } + TRACE1("st_mutex_lock (done)", m); + return 0; +} + +Caml_inline DWORD st_mutex_trylock(st_mutex m) +{ + st_tid self, prev; + TRACE1("st_mutex_trylock", m); + self = st_current_thread_id(); + if (! TryEnterCriticalSection(&m->crit)) { + TRACE1("st_mutex_trylock (failure)", m); + return MUTEX_ALREADY_LOCKED; + } + /* Record that we are the owner of the lock */ + prev = Tid_Atomic_Exchange(&m->owner, self); + if (prev != 0) { + /* The mutex was already locked by ourselves. + Cancel the EnterCriticalSection above and return "already locked". */ + TRACE1("st_mutex_trylock (already locked by self)", m); + LeaveCriticalSection(&m->crit); + return MUTEX_ALREADY_LOCKED; + } + TRACE1("st_mutex_trylock (done)", m); + return MUTEX_PREVIOUSLY_UNLOCKED; +} + +Caml_inline DWORD st_mutex_unlock(st_mutex m) +{ + st_tid self, prev; + /* If the calling thread holds the lock, m->owner is stable and equal + to st_current_thread_id(). + Otherwise, the value of m->owner can be 0 (if the mutex is unlocked) + or some other thread ID (if the mutex is held by another thread), + but is never equal to st_current_thread_id(). */ + self = st_current_thread_id(); + prev = Tid_Atomic_Compare_Exchange(&m->owner, 0, self); + if (prev != self) { + /* The value of m->owner is unchanged */ + TRACE1("st_mutex_unlock (error)", m); + return MUTEX_NOT_OWNED; + } + TRACE1("st_mutex_unlock", m); + LeaveCriticalSection(&m->crit); + return 0; +} + +/* Condition variables */ + +/* A condition variable is just a list of threads currently + waiting on this c.v. Each thread is represented by its + associated event. */ + +struct st_wait_list { + HANDLE event; /* event of the first waiting thread */ + struct st_wait_list * next; +}; + +typedef struct st_condvar_struct { + CRITICAL_SECTION lock; /* protect the data structure */ + struct st_wait_list * waiters; /* list of threads waiting */ +} * st_condvar; + +static DWORD st_condvar_create(st_condvar * res) +{ + st_condvar c = caml_stat_alloc_noexc(sizeof(struct st_condvar_struct)); + if (c == NULL) return ERROR_NOT_ENOUGH_MEMORY; + InitializeCriticalSection(&c->lock); + c->waiters = NULL; + *res = c; + return 0; +} + +static DWORD st_condvar_destroy(st_condvar c) +{ + TRACE1("st_condvar_destroy", c); + DeleteCriticalSection(&c->lock); + caml_stat_free(c); + return 0; +} + +static DWORD st_condvar_signal(st_condvar c) +{ + DWORD rc = 0; + struct st_wait_list * curr, * next; + + TRACE1("st_condvar_signal", c); + EnterCriticalSection(&c->lock); + curr = c->waiters; + if (curr != NULL) { + next = curr->next; + /* Wake up the first waiting thread */ + TRACE1("st_condvar_signal: waking up", curr->event); + if (! SetEvent(curr->event)) rc = GetLastError(); + /* Remove it from the waiting list */ + c->waiters = next; + } + LeaveCriticalSection(&c->lock); + return rc; +} + +static DWORD st_condvar_broadcast(st_condvar c) +{ + DWORD rc = 0; + struct st_wait_list * curr, * next; + + TRACE1("st_condvar_broadcast", c); + EnterCriticalSection(&c->lock); + /* Wake up all waiting threads */ + curr = c->waiters; + while (curr != NULL) { + next = curr->next; + TRACE1("st_condvar_signal: waking up", curr->event); + if (! SetEvent(curr->event)) rc = GetLastError(); + curr = next; + } + /* Remove them all from the waiting list */ + c->waiters = NULL; + LeaveCriticalSection(&c->lock); + return rc; +} + +static DWORD st_condvar_wait(st_condvar c, st_mutex m) +{ + HANDLE ev; + struct st_wait_list wait; + DWORD rc; + st_tid self, prev; + + TRACE1("st_condvar_wait", c); + /* Recover (or create) the event associated with the calling thread */ + ev = (HANDLE) TlsGetValue(st_thread_sem_key); + if (ev == 0) { + ev = CreateEvent(NULL, + FALSE /*auto reset*/, + FALSE /*initially unset*/, + NULL); + if (ev == NULL) return GetLastError(); + TlsSetValue(st_thread_sem_key, (void *) ev); + } + /* Get ready to release the mutex */ + self = st_current_thread_id(); + prev = Tid_Atomic_Compare_Exchange(&m->owner, 0, self); + if (prev != self) { + /* The value of m->owner is unchanged */ + TRACE1("st_condvar_wait: error: mutex not held", m); + return MUTEX_NOT_OWNED; + } + /* Insert the current thread in the waiting list (atomically) */ + EnterCriticalSection(&c->lock); + wait.event = ev; + wait.next = c->waiters; + c->waiters = &wait; + LeaveCriticalSection(&c->lock); + /* Finish releasing the mutex m (like st_mutex_unlock does, minus + the error checking, which we've already done above). */ + LeaveCriticalSection(&m->crit); + /* Wait for our event to be signaled. There is no risk of lost + wakeup, since we inserted ourselves on the waiting list of c + before releasing m */ + TRACE1("st_condvar_wait: blocking on event", ev); + if (WaitForSingleObject(ev, INFINITE) == WAIT_FAILED) + return GetLastError(); + /* Reacquire the mutex m */ + TRACE1("st_condvar_wait: restarted, acquiring mutex", c); + rc = st_mutex_lock(m); + if (rc != 0) return rc; + TRACE1("st_condvar_wait: acquired mutex", c); + return 0; +} + +/* Triggered events */ + +typedef HANDLE st_event; + +static DWORD st_event_create(st_event * res) +{ + st_event m = + CreateEvent(NULL, TRUE/*manual reset*/, FALSE/*initially unset*/, NULL); + TRACE1("st_event_create", m); + if (m == NULL) return GetLastError(); + *res = m; + return 0; +} + +static DWORD st_event_destroy(st_event e) +{ + TRACE1("st_event_destroy", e); + if (CloseHandle(e)) + return 0; + else + return GetLastError(); +} + +static DWORD st_event_trigger(st_event e) +{ + TRACE1("st_event_trigger", e); + if (SetEvent(e)) + return 0; + else + return GetLastError(); +} + +static DWORD st_event_wait(st_event e) +{ + TRACE1("st_event_wait", e); + if (WaitForSingleObject(e, INFINITE) == WAIT_FAILED) + return GetLastError(); + else + return 0; +} + +/* Reporting errors */ + +static void st_check_error(DWORD retcode, char * msg) +{ + wchar_t err[1024]; + int errlen, msglen, ret; + value str; + + if (retcode == 0) return; + if (retcode == ERROR_NOT_ENOUGH_MEMORY) caml_raise_out_of_memory(); + switch (retcode) { + case MUTEX_DEADLOCK: + ret = swprintf(err, sizeof(err)/sizeof(wchar_t), + L"Mutex is already locked by calling thread"); + break; + case MUTEX_NOT_OWNED: + ret = swprintf(err, sizeof(err)/sizeof(wchar_t), + L"Mutex is not locked by calling thread"); + break; + default: + ret = FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + retcode, + 0, + err, + sizeof(err)/sizeof(wchar_t), + NULL); + if (! ret) { + ret = + swprintf(err, sizeof(err)/sizeof(wchar_t), L"error code %lx", retcode); + } + } + msglen = strlen(msg); + errlen = win_wide_char_to_multi_byte(err, ret, NULL, 0); + str = caml_alloc_string(msglen + 2 + errlen); + memmove (&Byte(str, 0), msg, msglen); + memmove (&Byte(str, msglen), ": ", 2); + win_wide_char_to_multi_byte(err, ret, &Byte(str, msglen + 2), errlen); + caml_raise_sys_error(str); +} + +/* Variable used to stop the "tick" thread */ +static volatile int caml_tick_thread_stop = 0; + +/* The tick thread: posts a SIGPREEMPTION signal periodically */ + +static DWORD WINAPI caml_thread_tick(void * arg) +{ + while(! caml_tick_thread_stop) { + Sleep(Thread_timeout); + /* The preemption signal should never cause a callback, so don't + go through caml_handle_signal(), just record signal delivery via + caml_record_signal(). */ + caml_record_signal(SIGPREEMPTION); + } + return 0; +} + +/* "At fork" processing -- none under Win32 */ + +static DWORD st_atfork(void (*fn)(void)) +{ + return 0; +} + +/* Signal handling -- none under Win32 */ + +value caml_thread_sigmask(value cmd, value sigs) /* ML */ +{ + caml_invalid_argument("Thread.sigmask not implemented"); + return Val_int(0); /* not reached */ +} + +value caml_wait_signal(value sigs) /* ML */ +{ + caml_invalid_argument("Thread.wait_signal not implemented"); + return Val_int(0); /* not reached */ +} diff --git a/otherlibs/systhreads4/thread.ml b/otherlibs/systhreads4/thread.ml new file mode 100644 index 00000000000..0e3fd2b08d8 --- /dev/null +++ b/otherlibs/systhreads4/thread.ml @@ -0,0 +1,124 @@ +# 2 "thread.ml" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy and Pascal Cuoq, 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. *) +(* *) +(**************************************************************************) + +(* User-level threads *) + +[@@@ocaml.flambda_o3] + +type t + +external thread_initialize : unit -> unit = "caml_thread_initialize" +external thread_cleanup : unit -> unit = "caml_thread_cleanup" +external thread_new : (unit -> unit) -> t = "caml_thread_new" +external thread_uncaught_exception : exn -> unit = + "caml_thread_uncaught_exception" + +external yield : unit -> unit = "caml_thread_yield" +external self : unit -> t = "caml_thread_self" [@@noalloc] +external id : t -> int = "caml_thread_id" [@@noalloc] +external join : t -> unit = "caml_thread_join" +external exit_stub : unit -> unit = "caml_thread_exit" + +(* For new, make sure the function passed to thread_new never + raises an exception. *) + +let[@inline never] check_memprof_cb () = ref () + +let default_uncaught_exception_handler = thread_uncaught_exception + +let uncaught_exception_handler = ref default_uncaught_exception_handler + +let set_uncaught_exception_handler fn = uncaught_exception_handler := fn + +exception Exit + +let create fn arg = + thread_new + (fun () -> + try + fn arg; + ignore (Sys.opaque_identity (check_memprof_cb ())) + with + | Exit -> + ignore (Sys.opaque_identity (check_memprof_cb ())) + | exn -> + let raw_backtrace = Printexc.get_raw_backtrace () in + flush stdout; flush stderr; + try + !uncaught_exception_handler exn + with + | Exit -> () + | exn' -> + Printf.eprintf + "Thread %d killed on uncaught exception %s\n" + (id (self ())) (Printexc.to_string exn); + Printexc.print_raw_backtrace stderr raw_backtrace; + Printf.eprintf + "Thread %d uncaught exception handler raised %s\n" + (id (self ())) (Printexc.to_string exn'); + Printexc.print_backtrace stdout; + flush stderr) + +let exit () = + ignore (Sys.opaque_identity (check_memprof_cb ())); + exit_stub () + +(* Thread.kill is currently not implemented due to problems with + cleanup handlers on several platforms *) + +let kill th = invalid_arg "Thread.kill: not implemented" + +(* Preemption *) + +let preempt signal = yield() + +(* Initialization of the scheduler *) + +let preempt_signal = + match Sys.os_type with + | "Win32" -> Sys.sigterm + | _ -> Sys.sigvtalrm + +let () = + Sys.set_signal preempt_signal (Sys.Signal_handle preempt); + thread_initialize (); + Callback.register "Thread.at_shutdown" (fun () -> + thread_cleanup(); + (* In case of DLL-embedded OCaml the preempt_signal handler + will point to nowhere after DLL unloading and an accidental + preempt_signal will crash the main program. So restore the + default handler. *) + Sys.set_signal preempt_signal Sys.Signal_default + ) + +(* Wait functions *) + +let delay = Unix.sleepf + +let wait_read fd = () +let wait_write fd = () + +let wait_timed_read fd d = + match Unix.select [fd] [] [] d with ([], _, _) -> false | (_, _, _) -> true +let wait_timed_write fd d = + match Unix.select [] [fd] [] d with (_, [], _) -> false | (_, _, _) -> true +let select = Unix.select + +let wait_pid p = Unix.waitpid [] p + +external sigmask : Unix.sigprocmask_command -> int list -> int list + = "caml_thread_sigmask" +external wait_signal : int list -> int = "caml_wait_signal" diff --git a/otherlibs/systhreads4/thread.mli b/otherlibs/systhreads4/thread.mli new file mode 100644 index 00000000000..2822f8717fb --- /dev/null +++ b/otherlibs/systhreads4/thread.mli @@ -0,0 +1,173 @@ +# 2 "thread.mli" +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy and Pascal Cuoq, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1995 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. *) +(* *) +(**************************************************************************) + +(** Lightweight threads for Posix [1003.1c] and Win32. *) + +type t +(** The type of thread handles. *) + +(** {1 Thread creation and termination} *) + +val create : ('a -> 'b) -> 'a -> t +(** [Thread.create funct arg] creates a new thread of control, + in which the function application [funct arg] + is executed concurrently with the other threads of the program. + The application of [Thread.create] + returns the handle of the newly created thread. + The new thread terminates when the application [funct arg] + returns, either normally or by raising the {!Thread.Exit} exception + or by raising any other uncaught exception. + In the last case, the uncaught exception is printed on standard error, + but not propagated back to the parent thread. Similarly, the + result of the application [funct arg] is discarded and not + directly accessible to the parent thread. *) + +val self : unit -> t +(** Return the handle for the thread currently executing. *) + +val id : t -> int +(** Return the identifier of the given thread. A thread identifier + is an integer that identifies uniquely the thread. + It can be used to build data structures indexed by threads. *) + +exception Exit +(** Exception that can be raised by user code to initiate termination + of the current thread. + Compared to calling the {!Thread.exit} function, raising the + {!Thread.Exit} exception will trigger {!Fun.finally} finalizers + and catch-all exception handlers. + It is the recommended way to terminate threads prematurely. + + @since 4.14.0 +*) + +val exit : unit -> unit +(** Terminate prematurely the currently executing thread. *) + +val kill : t -> unit + [@@ocaml.deprecated "Not implemented, do not use"] +(** This function was supposed to terminate prematurely the thread + whose handle is given. It is not currently implemented due to + problems with cleanup handlers on many POSIX 1003.1c implementations. + It always raises the [Invalid_argument] exception. *) + +(** {1 Suspending threads} *) + +val delay: float -> unit +(** [delay d] suspends the execution of the calling thread for + [d] seconds. The other program threads continue to run during + this time. *) + +val join : t -> unit +(** [join th] suspends the execution of the calling thread + until the thread [th] has terminated. *) + +val yield : unit -> unit +(** Re-schedule the calling thread without suspending it. + This function can be used to give scheduling hints, + telling the scheduler that now is a good time to + switch to other threads. *) + +(** {1 Waiting for file descriptors or processes} *) + +(** The functions below are leftovers from an earlier, VM-based threading + system. The {!Unix} module provides equivalent functionality, in + a more general and more standard-conformant manner. It is recommended + to use {!Unix} functions directly. *) + +val wait_read : Unix.file_descr -> unit + [@@ocaml.deprecated "This function no longer does anything"] +(** This function does nothing in the current implementation of the threading + library and can be removed from all user programs. *) + +val wait_write : Unix.file_descr -> unit + [@@ocaml.deprecated "This function no longer does anything"] +(** This function does nothing in the current implementation of the threading + library and can be removed from all user programs. *) + +val wait_timed_read : Unix.file_descr -> float -> bool +(** See {!Thread.wait_timed_write}.*) + +val wait_timed_write : Unix.file_descr -> float -> bool +(** Suspend the execution of the calling thread until at least + one character or EOF is available for reading ([wait_timed_read]) or + one character can be written without blocking ([wait_timed_write]) + on the given Unix file descriptor. Wait for at most + the amount of time given as second argument (in seconds). + Return [true] if the file descriptor is ready for input/output + and [false] if the timeout expired. + The same functionality can be achieved with {!Unix.select}. +*) + +val select : + Unix.file_descr list -> Unix.file_descr list -> + Unix.file_descr list -> float -> + Unix.file_descr list * Unix.file_descr list * Unix.file_descr list +(** Same function as {!Unix.select}. + Suspend the execution of the calling thread until input/output + becomes possible on the given Unix file descriptors. + The arguments and results have the same meaning as for + {!Unix.select}. *) + +val wait_pid : int -> int * Unix.process_status +(** Same function as {!Unix.waitpid}. + [wait_pid p] suspends the execution of the calling thread + until the process specified by the process identifier [p] + terminates. Returns the pid of the child caught and + its termination status, as per {!Unix.wait}. *) + +(** {1 Management of signals} *) + +(** Signal handling follows the POSIX thread model: signals generated + by a thread are delivered to that thread; signals generated externally + are delivered to one of the threads that does not block it. + Each thread possesses a set of blocked signals, which can be modified + using {!Thread.sigmask}. This set is inherited at thread creation time. + Per-thread signal masks are supported only by the system thread library + under Unix, but not under Win32, nor by the VM thread library. *) + +val sigmask : Unix.sigprocmask_command -> int list -> int list +(** [sigmask cmd sigs] changes the set of blocked signals for the + calling thread. + If [cmd] is [SIG_SETMASK], blocked signals are set to those in + the list [sigs]. + If [cmd] is [SIG_BLOCK], the signals in [sigs] are added to + the set of blocked signals. + If [cmd] is [SIG_UNBLOCK], the signals in [sigs] are removed + from the set of blocked signals. + [sigmask] returns the set of previously blocked signals for the thread. *) + + +val wait_signal : int list -> int +(** [wait_signal sigs] suspends the execution of the calling thread + until the process receives one of the signals specified in the + list [sigs]. It then returns the number of the signal received. + Signal handlers attached to the signals in [sigs] will not + be invoked. The signals [sigs] are expected to be blocked before + calling [wait_signal]. *) + +(** {1 Uncaught exceptions} *) + +val default_uncaught_exception_handler : exn -> unit +(** [Thread.default_uncaught_exception_handler] will print the thread's id, + exception and backtrace (if available). *) + +val set_uncaught_exception_handler : (exn -> unit) -> unit +(** [Thread.set_uncaught_exception_handler fn] registers [fn] as the handler + for uncaught exceptions. + + If the newly set uncaught exception handler raise an exception, + {!default_uncaught_exception_handler} will be called. *) diff --git a/otherlibs/systhreads4/threads.h b/otherlibs/systhreads4/threads.h new file mode 100644 index 00000000000..2c421e01ef3 --- /dev/null +++ b/otherlibs/systhreads4/threads.h @@ -0,0 +1,116 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 1995 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. */ +/* */ +/**************************************************************************/ + +#ifndef CAML_THREADS_H +#define CAML_THREADS_H + +#ifdef __cplusplus +extern "C" { +#endif + +CAMLextern void caml_enter_blocking_section (void); +CAMLextern void caml_leave_blocking_section (void); +#define caml_acquire_runtime_system caml_leave_blocking_section +#define caml_release_runtime_system caml_enter_blocking_section + +/* Manage the master lock around the OCaml run-time system. + Only one thread at a time can execute OCaml compiled code or + OCaml run-time system functions. + + When OCaml calls a C function, the current thread holds the master + lock. The C function can release it by calling + [caml_release_runtime_system]. Then, another thread can execute OCaml + code. However, the calling thread must not access any OCaml data, + nor call any runtime system function, nor call back into OCaml. + + Before returning to its OCaml caller, or accessing OCaml data, + or call runtime system functions, the current thread must + re-acquire the master lock by calling [caml_acquire_runtime_system]. + + Symmetrically, if a C function (not called from OCaml) wishes to + call back into OCaml code, it should invoke [caml_acquire_runtime_system] + first, then do the callback, then invoke [caml_release_runtime_system]. + + For historical reasons, alternate names can be used: + [caml_enter_blocking_section] instead of [caml_release_runtime_system] + [caml_leave_blocking_section] instead of [caml_acquire_runtime_system] + Intuition: a ``blocking section'' is a piece of C code that does not + use the runtime system (typically, a blocking I/O operation). +*/ + +/* These functions are defined in the threads library, not the runtime */ +#ifndef CAMLextern_libthreads +#define CAMLextern_libthreads CAMLextern +#endif +CAMLextern_libthreads int caml_c_thread_register(void); +CAMLextern_libthreads int caml_c_thread_unregister(void); + +/* If a thread is created by C code (instead of by OCaml itself), + it must be registered with the OCaml runtime system before + being able to call back into OCaml code or use other runtime system + functions. Just call [caml_c_thread_register] once. + Before the thread finishes, it must call [caml_c_thread_unregister]. + Both functions return 1 on success, 0 on error. +*/ + +enum caml_thread_type { Thread_type_caml, Thread_type_c_registered }; +struct caml_locking_scheme { + void* context; + void (*lock)(void*); + void (*unlock)(void*); + + /* If non-NULL, these functions are called when threads start and stop. + For threads created by OCaml, that's at creation and termination. + For threads created by C, that's at caml_c_thread_register/unregister. + The lock is not held when these functions are called. */ + void (*thread_start)(void*, enum caml_thread_type); + void (*thread_stop)(void*, enum caml_thread_type); + + /* Called after fork(). + The lock should be held after this function returns. */ + void (*reinitialize_after_fork)(void*); + + /* can_skip_yield and yield are both called with the lock held, + and expect it held on return */ + int (*can_skip_yield)(void*); + void (*yield)(void*); +}; + +CAMLextern_libthreads +struct caml_locking_scheme *caml_get_default_locking_scheme(void); + +/* Switch to a new runtime locking scheme. + + The old runtime lock must be held (i.e. not in a blocking section), + and the new runtime lock must not be held. After this function + returns, the old lock is released and the new one is held. + + There is a period during this function when neither lock is held, + so context-switches may occur. */ +CAMLextern_libthreads +void caml_switch_runtime_locking_scheme(struct caml_locking_scheme*); + +CAMLextern_libthreads +void caml_thread_save_runtime_state(void); + +CAMLextern_libthreads +void caml_thread_restore_runtime_state(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_THREADS_H */ diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile index 8fb3fef8b0f..13170ae1001 100644 --- a/otherlibs/unix/Makefile +++ b/otherlibs/unix/Makefile @@ -29,7 +29,7 @@ EXTRACAMLFLAGS=-nolabels # This flag is used to disable compatibility definitions in header files to # ensure that they're not accidentally used in the library itself. -OC_CPPFLAGS += -DCAML_BUILDING_UNIX +OC_CPPFLAGS += -DCAML_BUILDING_UNIX -Wno-implicit-function-declaration unixLabels.cmi: \ EXTRACAMLFLAGS += -pp "$(AWK) -f $(ROOTDIR)/stdlib/expand_module_aliases.awk" diff --git a/otherlibs/unix/dune b/otherlibs/unix/dune index 180fa767921..f7a7b2b5612 100644 --- a/otherlibs/unix/dune +++ b/otherlibs/unix/dune @@ -21,11 +21,16 @@ (name unix) (wrapped false) (modes byte native) - (flags ( - -absname -w +a-4-9-41-42-44-45-48 -warn-error A -bin-annot - -g -safe-string -strict-sequence -strict-formats - -nolabels ; for UnixLabels - )) + (flags + (:standard + -absname + -bin-annot + -g + -safe-string + -strict-sequence + -strict-formats + -nolabels ; for UnixLabels + )) (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) (library_flags (:standard -linkall)) (modules unix unixLabels) @@ -158,7 +163,7 @@ (dllunix_stubs.so as stublibs/dllunix_stubs.so) (socketaddr.h as caml/socketaddr.h) (unixsupport.h as caml/unixsupport.h) + (META as unix/META) ) (section lib) (package ocaml)) - diff --git a/otherlibs/unix/errmsg_unix.c b/otherlibs/unix/errmsg_unix.c index 596abad9f60..9dac4c4becd 100644 --- a/otherlibs/unix/errmsg_unix.c +++ b/otherlibs/unix/errmsg_unix.c @@ -21,6 +21,17 @@ #include #include "unixsupport.h" +#ifdef CAML_RUNTIME_5 + +CAMLprim value caml_unix_error_message(value err) +{ + char buf[1024]; + int errnum = caml_unix_code_of_unix_error(err); + return caml_copy_string(caml_strerror(errnum, buf, sizeof(buf))); +} + +#else + CAMLprim value caml_unix_error_message(value err) { char buf[1024]; @@ -32,3 +43,5 @@ CAMLprim value caml_unix_error_message(value err) */ buf); } + +#endif diff --git a/otherlibs/unix/fork.c b/otherlibs/unix/fork.c index 5c72f04a2ea..7242fd5e223 100644 --- a/otherlibs/unix/fork.c +++ b/otherlibs/unix/fork.c @@ -17,16 +17,16 @@ #include #include -#if 0 /* BACKPORT BEGIN */ +#ifdef CAML_RUNTIME_5 #include -#endif +#else #include -/* BACKPORT END */ +#endif #include "unixsupport.h" #include #include -#if 0 /* BACKPORT */ +#ifdef CAML_RUNTIME_5 /* Post-fork tasks to be carried out in the parent */ void caml_atfork_parent(pid_t child_pid) { CAML_EV_LIFECYCLE(EV_FORK_PARENT, child_pid); @@ -42,22 +42,21 @@ void caml_atfork_child(void) { CAMLprim value caml_unix_fork(value unit) { int ret; - /* BACKPORT + +#ifdef CAML_RUNTIME_5 if (caml_domain_is_multicore()) { caml_failwith ("Unix.fork may not be called while other domains were created"); } -*/ - -/* BACKPORT BEGIN */ +#else CAML_EV_FLUSH(); -/* BACKPORT END */ +#endif ret = fork(); if (ret == -1) caml_uerror("fork", Nothing); -#if 0 /* BACKPORT BEGIN */ +#ifdef CAML_RUNTIME_5 if (ret == 0) { caml_atfork_child(); /* the following hook can be redefined in other places */ @@ -65,12 +64,12 @@ CAMLprim value caml_unix_fork(value unit) } else { caml_atfork_parent(ret); } -#endif +#else CAML_EVENTLOG_DO({ if (ret == 0) caml_eventlog_disable(); }); -/* BACKPORT END */ +#endif if (caml_debugger_in_use) if ((caml_debugger_fork_mode && ret == 0) || diff --git a/otherlibs/unix/signals.c b/otherlibs/unix/signals.c index 2060959b9ae..eb9b6544bf0 100644 --- a/otherlibs/unix/signals.c +++ b/otherlibs/unix/signals.c @@ -13,9 +13,10 @@ /* */ /**************************************************************************/ -/* CR ocaml 5 runtime: This file is the 4.x version together with +/* CR ocaml 5 domains: This file is the 4.x version together with adjustments to the names of exported functions ("unix_" -> "caml_unix"). - (mshinwell/xclerc) + (mshinwell/xclerc). + For multi-domain support we'll need to revisit this. */ #define CAML_INTERNALS @@ -74,11 +75,18 @@ CAMLprim value caml_unix_sigprocmask(value vaction, value vset) how = sigprocmask_cmd[Int_val(vaction)]; decode_sigset(vset, &set); caml_enter_blocking_section(); +#ifdef CAML_RUNTIME_5 + // Differs from upstream at the point we branched, but this PR + // changes the behaviour to what we have here: + // https://github.com/ocaml/ocaml/pull/12743 + retcode = pthread_sigmask(how, &set, &oldset); +#else retcode = caml_sigmask_hook(how, &set, &oldset); +#endif caml_leave_blocking_section(); /* Run any handlers for just-unmasked pending signals */ caml_process_pending_actions(); - if (retcode != 0) unix_error(retcode, "sigprocmask", Nothing); + if (retcode != 0) caml_unix_error(retcode, "sigprocmask", Nothing); return encode_sigset(&oldset); } @@ -86,7 +94,7 @@ CAMLprim value caml_unix_sigpending(value unit) { sigset_t pending; int i; - if (sigpending(&pending) == -1) uerror("sigpending", Nothing); + if (sigpending(&pending) == -1) caml_uerror("sigpending", Nothing); for (i = 1; i < NSIG; i++) if(caml_pending_signals[i]) sigaddset(&pending, i); @@ -101,7 +109,7 @@ CAMLprim value caml_unix_sigsuspend(value vset) caml_enter_blocking_section(); retcode = sigsuspend(&set); caml_leave_blocking_section(); - if (retcode == -1 && errno != EINTR) uerror("sigsuspend", Nothing); + if (retcode == -1 && errno != EINTR) caml_uerror("sigsuspend", Nothing); return Val_unit; } diff --git a/otherlibs/unix/unixsupport_unix.c b/otherlibs/unix/unixsupport_unix.c index feb231c4332..35a03d8b2e3 100644 --- a/otherlibs/unix/unixsupport_unix.c +++ b/otherlibs/unix/unixsupport_unix.c @@ -20,9 +20,9 @@ #include #include #include -/* BACKPORT +#ifdef CAML_RUNTIME_5 #include -*/ +#endif #include "unixsupport.h" #include "cst2constr.h" #include @@ -291,6 +291,37 @@ int caml_unix_code_of_unix_error (value error) static const value * _Atomic caml_unix_error_exn = NULL; +#ifdef CAML_RUNTIME_5 + +void caml_unix_error(int errcode, const char *cmdname, value cmdarg) +{ + CAMLparam0(); + CAMLlocal3(name, err, arg); + value res; + const value * exn; + + exn = atomic_load_acquire(&caml_unix_error_exn); + if (exn == NULL) { + exn = caml_named_value("Unix.Unix_error"); + if (exn == NULL) + caml_invalid_argument("Exception Unix.Unix_error not initialized," + " please link unix.cma"); + atomic_store(&caml_unix_error_exn, exn); + } + arg = cmdarg == Nothing ? caml_copy_string("") : cmdarg; + name = caml_copy_string(cmdname); + err = caml_unix_error_of_code (errcode); + res = caml_alloc_small(4, 0); + Field(res, 0) = *exn; + Field(res, 1) = err; + Field(res, 2) = name; + Field(res, 3) = arg; + caml_raise(res); + CAMLnoreturn; +} + +#else + void caml_unix_error(int errcode, const char *cmdname, value cmdarg) { CAMLparam0(); @@ -326,6 +357,8 @@ void caml_unix_error(int errcode, const char *cmdname, value cmdarg) CAMLnoreturn; } +#endif + void caml_uerror(const char *cmdname, value cmdarg) { caml_unix_error(errno, cmdname, cmdarg); diff --git a/parsing/.ocamlformat-enable b/parsing/.ocamlformat-enable index c6a11de429d..ce0c8e389a9 100644 --- a/parsing/.ocamlformat-enable +++ b/parsing/.ocamlformat-enable @@ -2,4 +2,5 @@ jane_syntax.ml jane_syntax.mli jane_syntax_parsing.ml jane_syntax_parsing.mli +jane_asttypes.ml jane_asttypes.mli diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 8d5ab0b90df..74880600f5e 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -412,11 +412,12 @@ end module Val = struct let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) - ?(prim = []) name typ = + ?(prim = []) ?(modalities=[]) name typ = { pval_name = name; pval_type = typ; pval_attributes = add_docs_attrs docs attrs; + pval_modalities = modalities; pval_loc = loc; pval_prim = prim; } @@ -523,13 +524,11 @@ module Type = struct let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) ?(text = []) ?(params = []) - ?jkind ?(cstrs = []) ?(kind = Ptype_abstract) ?(priv = Public) ?manifest name = - let jkind_attrs = Option.to_list jkind in { ptype_name = name; ptype_params = params; @@ -537,8 +536,7 @@ module Type = struct ptype_kind = kind; ptype_private = priv; ptype_manifest = manifest; - ptype_attributes = - jkind_attrs @ add_text_attrs text (add_docs_attrs docs attrs); + ptype_attributes = add_text_attrs text (add_docs_attrs docs attrs); ptype_loc = loc; } @@ -553,11 +551,19 @@ module Type = struct pcd_attributes = add_info_attrs info attrs; } + let constructor_arg ?(loc = !default_loc) ?(modalities = []) typ = + { + pca_modalities = modalities; + pca_type = typ; + pca_loc = loc; + } + let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info) - ?(mut = Immutable) name typ = + ?(mut = Immutable) ?(modalities = []) name typ = { pld_name = name; pld_mutable = mut; + pld_modalities = modalities; pld_type = typ; pld_loc = loc; pld_attributes = add_info_attrs info attrs; diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 79210dc5ba6..2d5b4a1536c 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -209,8 +209,8 @@ module Exp: (** Value declarations *) module Val: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> - ?prim:string list -> str -> core_type -> value_description + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?prim:string list -> + ?modalities:modality with_loc list -> str -> core_type -> value_description end (** Type declarations *) @@ -218,7 +218,6 @@ module Type: sig val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> ?params:(core_type * (variance * injectivity)) list -> - ?jkind:attribute -> ?cstrs:(core_type * core_type * loc) list -> ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str -> type_declaration @@ -227,8 +226,13 @@ module Type: ?vars:str list -> ?args:constructor_arguments -> ?res:core_type -> str -> constructor_declaration + + val constructor_arg: ?loc:loc -> ?modalities:modality with_loc list -> core_type -> + constructor_argument + val field: ?loc:loc -> ?attrs:attrs -> ?info:info -> - ?mut:mutable_flag -> str -> core_type -> label_declaration + ?mut:mutable_flag -> ?modalities:modality with_loc list -> str -> core_type -> + label_declaration end (** Type extensions *) diff --git a/parsing/ast_invariants.ml b/parsing/ast_invariants.ml index b68731e53c3..2172fac7b8c 100644 --- a/parsing/ast_invariants.ml +++ b/parsing/ast_invariants.ml @@ -20,6 +20,17 @@ let err = Syntaxerr.ill_formed_ast let empty_record loc = err loc "Records cannot be empty." let invalid_tuple loc = err loc "Tuples must have at least 2 components." +let unlabeled_labeled_tuple_typ loc = + err loc "Labeled tuple types must have at least one labeled component." +let unlabeled_labeled_tuple_exp loc = + err loc "Labeled tuples must have at least one labeled component." +let unlabeled_labeled_tuple_pat loc = + err loc + "Closed labeled tuple patterns must have at least one labeled component." +let empty_open_labeled_tuple_pat loc = + err loc "Open labeled tuple patterns must have at least one component." +let short_closed_labeled_tuple_pat loc = + err loc "Closed labeled tuple patterns must have at least 2 components." let no_args loc = err loc "Function application with no argument." let empty_let loc = err loc "Let with no bindings." let empty_type loc = err loc "Type declarations cannot be empty." @@ -32,9 +43,6 @@ let no_val_params loc = err loc "Functions must have a value parameter." let non_jane_syntax_function loc = err loc "Functions must be constructed using Jane Street syntax." -(* We will enable this check after we finish migrating to n-ary functions. *) -let () = ignore non_jane_syntax_function - let simple_longident id = let rec is_simple = function | Longident.Lident _ -> true @@ -43,6 +51,9 @@ let simple_longident id = in if not (is_simple id.txt) then complex_id id.loc +let labeled_tuple_without_label lt = + List.for_all (fun (lbl,_) -> Option.is_none lbl) lt + let iterator = let super = Ast_iterator.default_iterator in let type_declaration self td = @@ -52,15 +63,39 @@ let iterator = | Ptype_record [] -> empty_record loc | _ -> () in + let jtyp _self loc (jtyp : Jane_syntax.Core_type.t) = + match jtyp with + | Jtyp_layout (Ltyp_var _ | Ltyp_poly _ | Ltyp_alias _) -> () + | Jtyp_tuple ([] | [_]) -> invalid_tuple loc + | Jtyp_tuple l -> + if labeled_tuple_without_label l then unlabeled_labeled_tuple_typ loc + in let typ self ty = super.typ self ty; let loc = ty.ptyp_loc in + match Jane_syntax.Core_type.of_ast ty with + | Some (jtyp_, _attrs) -> jtyp self ty.ptyp_loc jtyp_ + | None -> match ty.ptyp_desc with | Ptyp_tuple ([] | [_]) -> invalid_tuple loc | Ptyp_package (_, cstrs) -> List.iter (fun (id, _) -> simple_longident id) cstrs | _ -> () in + let jpat _self loc (jpat : Jane_syntax.Pattern.t) = + match jpat with + | Jpat_immutable_array (Iapat_immutable_array _)-> () + | Jpat_layout (Lpat_constant _) -> () + | Jpat_tuple lt -> begin + match lt with + | ([], Open) -> empty_open_labeled_tuple_pat loc + | (([] | [_]), Closed) -> + short_closed_labeled_tuple_pat loc + | (l, Closed) -> + if labeled_tuple_without_label l then unlabeled_labeled_tuple_pat loc + | (_ :: _, Open) -> () + end + in let pat self pat = begin match pat.ppat_desc with | Ppat_construct (_, Some (_, ({ppat_desc = Ppat_tuple _} as p))) @@ -70,6 +105,9 @@ let iterator = super.pat self pat end; let loc = pat.ppat_loc in + match Jane_syntax.Pattern.of_ast pat with + | Some (jpat_, _attrs) -> jpat self pat.ppat_loc jpat_ + | None -> match pat.ppat_desc with | Ppat_tuple ([] | [_]) -> invalid_tuple loc | Ppat_record ([], _) -> empty_record loc @@ -100,9 +138,16 @@ let iterator = | Cexp_array_comprehension (_, {clauses = []; body = _}) ) -> empty_comprehension loc + | Jexp_tuple lt -> begin + match lt with + | [] | [_] -> invalid_tuple loc + | l -> + if labeled_tuple_without_label l then unlabeled_labeled_tuple_exp loc + end | Jexp_comprehension _ | Jexp_immutable_array _ | Jexp_layout _ + | Jexp_modes _ -> () in let expr self exp = @@ -129,6 +174,7 @@ let iterator = | Pexp_new id -> simple_longident id | Pexp_record (fields, _) -> List.iter (fun (id, _) -> simple_longident id) fields + | Pexp_fun _ | Pexp_function _ -> non_jane_syntax_function loc | _ -> () in let extension_constructor self ec = diff --git a/parsing/ast_iterator.ml b/parsing/ast_iterator.ml index c80bf173a7a..aaf602ec05e 100644 --- a/parsing/ast_iterator.ml +++ b/parsing/ast_iterator.ml @@ -27,6 +27,7 @@ open Location type iterator = { attribute: iterator -> attribute -> unit; attributes: iterator -> attribute list -> unit; + modes : iterator -> Jane_syntax.Mode_expr.t -> unit; binding_op: iterator -> binding_op -> unit; case: iterator -> case -> unit; cases: iterator -> case list -> unit; @@ -46,7 +47,7 @@ type iterator = { extension_constructor: iterator -> extension_constructor -> unit; include_declaration: iterator -> include_declaration -> unit; include_description: iterator -> include_description -> unit; - jkind_annotation:iterator -> Jane_asttypes.const_jkind -> unit; + jkind_annotation:iterator -> Jane_syntax.Jkind.t -> unit; label_declaration: iterator -> label_declaration -> unit; location: iterator -> Location.t -> unit; module_binding: iterator -> module_binding -> unit; @@ -60,6 +61,7 @@ type iterator = { open_description: iterator -> open_description -> unit; pat: iterator -> pattern -> unit; pat_jane_syntax: iterator -> Jane_syntax.Pattern.t -> unit; + pat_mode_syntax : iterator -> Jane_syntax.Mode_expr.t -> pattern -> unit; payload: iterator -> payload -> unit; signature: iterator -> signature -> unit; signature_item: iterator -> signature_item -> unit; @@ -69,6 +71,7 @@ type iterator = { structure_item_jane_syntax: iterator -> Jane_syntax.Structure_item.t -> unit; typ: iterator -> core_type -> unit; typ_jane_syntax: iterator -> Jane_syntax.Core_type.t -> unit; + typ_mode_syntax : iterator -> Jane_syntax.Mode_expr.t -> core_type -> unit; row_field: iterator -> row_field -> unit; object_field: iterator -> object_field -> unit; type_declaration: iterator -> type_declaration -> unit; @@ -76,6 +79,7 @@ type iterator = { type_exception: iterator -> type_exception -> unit; type_kind: iterator -> type_kind -> unit; value_binding: iterator -> value_binding -> unit; + value_binding_mode_syntax: iterator -> Jane_syntax.Mode_expr.t -> value_binding -> unit; value_description: iterator -> value_description -> unit; with_constraint: iterator -> with_constraint -> unit; } @@ -95,9 +99,14 @@ let iter_loc_txt sub f { loc; txt } = sub.location sub loc; f sub txt +let iter_modalities sub modalities = + List.iter (iter_loc sub) modalities + module T = struct (* Type expressions for the core language *) + module LT = Jane_syntax.Labeled_tuples + let row_field sub { prf_desc; prf_loc; @@ -137,12 +146,26 @@ module T = struct sub.typ sub aliased_type; iter_loc_txt sub sub.jkind_annotation jkind + let iter_jst_labeled_tuple sub : LT.core_type -> _ = function + | tl -> List.iter (iter_snd (sub.typ sub)) tl + let iter_jst sub : Jane_syntax.Core_type.t -> _ = function | Jtyp_layout typ -> iter_jst_layout sub typ + | Jtyp_tuple lt_typ -> iter_jst_labeled_tuple sub lt_typ + + let iter_mode sub modes typ = + sub.modes sub modes; + sub.typ sub typ let iter sub ({ptyp_desc = desc; ptyp_loc = loc; ptyp_attributes = attrs} as typ) = sub.location sub loc; + let modes, ptyp_attributes = Jane_syntax.Mode_expr.maybe_of_attrs attrs in + match modes with + | Some modes -> + let typ = {typ with ptyp_attributes} in + sub.typ_mode_syntax sub modes typ + | None -> match Jane_syntax.Core_type.of_ast typ with | Some (jtyp, attrs) -> sub.attributes sub attrs; @@ -172,12 +195,19 @@ module T = struct | Ptyp_extension x -> sub.extension sub x let iter_type_declaration sub - {ptype_name; ptype_params; ptype_cstrs; + ({ptype_name; ptype_params; ptype_cstrs; ptype_kind; ptype_private = _; ptype_manifest; ptype_attributes; - ptype_loc} = + ptype_loc} as ty_decl) = + let ptype_attributes = + match Jane_syntax.Layouts.of_type_declaration ty_decl with + | Some (jkind, attrs) -> + iter_loc_txt sub sub.jkind_annotation jkind; + attrs + | None -> ptype_attributes + in iter_loc sub ptype_name; List.iter (iter_fst (sub.typ sub)) ptype_params; List.iter @@ -195,8 +225,13 @@ module T = struct | Ptype_record l -> List.iter (sub.label_declaration sub) l | Ptype_open -> () + let iter_constructor_argument sub {pca_type; pca_loc; pca_modalities} = + sub.typ sub pca_type; + sub.location sub pca_loc; + iter_modalities sub pca_modalities + let iter_constructor_arguments sub = function - | Pcstr_tuple l -> List.iter (sub.typ sub) l + | Pcstr_tuple l -> List.iter (iter_constructor_argument sub) l | Pcstr_record l -> List.iter (sub.label_declaration sub) l @@ -333,9 +368,16 @@ module MT = struct : Jane_syntax.Include_functor.signature_item -> unit = function | Ifsig_include_functor incl -> sub.include_description sub incl + let iter_sig_layout sub + : Jane_syntax.Layouts.signature_item -> unit = function + | Lsig_kind_abbrev (name, jkind) -> + iter_loc sub name; + iter_loc_txt sub sub.jkind_annotation jkind + let iter_signature_item_jst sub : Jane_syntax.Signature_item.t -> unit = function | Jsig_include_functor ifincl -> iter_sig_include_functor sub ifincl + | Jsig_layout sigi -> iter_sig_layout sub sigi let iter_signature_item sub ({psig_desc = desc; psig_loc = loc} as sigi) = sub.location sub loc; @@ -397,9 +439,16 @@ module M = struct : Jane_syntax.Include_functor.structure_item -> unit = function | Ifstr_include_functor incl -> sub.include_declaration sub incl + let iter_str_layout sub + : Jane_syntax.Layouts.structure_item -> unit = function + | Lstr_kind_abbrev (name, jkind) -> + iter_loc sub name; + iter_loc_txt sub sub.jkind_annotation jkind + let iter_structure_item_jst sub : Jane_syntax.Structure_item.t -> unit = function | Jstr_include_functor ifincl -> iter_str_include_functor sub ifincl + | Jstr_layout stri -> iter_str_layout sub stri let iter_structure_item sub ({pstr_loc = loc; pstr_desc = desc} as stri) = sub.location sub loc; @@ -438,6 +487,8 @@ module E = struct module IA = Jane_syntax.Immutable_arrays module L = Jane_syntax.Layouts module N_ary = Jane_syntax.N_ary_functions + module LT = Jane_syntax.Labeled_tuples + module Modes = Jane_syntax.Modes let iter_iterator sub : C.iterator -> _ = function | Range { start; stop; direction = _ } -> @@ -489,7 +540,8 @@ module E = struct let iter_function_constraint sub : N_ary.function_constraint -> _ = (* Enable warning 9 to ensure that the record pattern doesn't miss any field. *) - fun[@ocaml.warning "+9"] { mode_annotations = _; type_constraint } -> + fun[@ocaml.warning "+9"] { mode_annotations; type_constraint } -> + sub.modes sub mode_annotations; match type_constraint with | Pconstraint ty -> sub.typ sub ty @@ -511,11 +563,21 @@ module E = struct Option.iter (iter_function_constraint sub) constraint_; iter_function_body sub body + let iter_labeled_tuple sub : LT.expression -> _ = function + | el -> List.iter (iter_snd (sub.expr sub)) el + + let iter_modes_exp sub : Modes.expression -> _ = function + | Coerce (modes, expr) -> + sub.modes sub modes; + sub.expr sub expr + let iter_jst sub : Jane_syntax.Expression.t -> _ = function | Jexp_comprehension comp_exp -> iter_comp_exp sub comp_exp | Jexp_immutable_array iarr_exp -> iter_iarr_exp sub iarr_exp | Jexp_layout layout_exp -> iter_layout_exp sub layout_exp | Jexp_n_ary_function n_ary_exp -> iter_n_ary_function sub n_ary_exp + | Jexp_tuple lt_exp -> iter_labeled_tuple sub lt_exp + | Jexp_modes mode_exp -> iter_modes_exp sub mode_exp let iter sub ({pexp_loc = loc; pexp_desc = desc; pexp_attributes = attrs} as expr)= @@ -611,18 +673,34 @@ module P = struct (* Patterns *) module IA = Jane_syntax.Immutable_arrays + module LT = Jane_syntax.Labeled_tuples let iter_iapat sub : IA.pattern -> _ = function | Iapat_immutable_array elts -> List.iter (sub.pat sub) elts + let iter_labeled_tuple sub : LT.pattern -> _ = function + | (pl, _) -> + List.iter (iter_snd (sub.pat sub)) pl + let iter_jst sub : Jane_syntax.Pattern.t -> _ = function | Jpat_immutable_array iapat -> iter_iapat sub iapat | Jpat_layout (Lpat_constant _) -> iter_constant + | Jpat_tuple ltpat -> iter_labeled_tuple sub ltpat + + let iter_mode sub modes pat = + sub.modes sub modes; + sub.pat sub pat let iter sub ({ppat_desc = desc; ppat_loc = loc; ppat_attributes = attrs} as pat) = sub.location sub loc; + let modes, ppat_attributes = Jane_syntax.Mode_expr.maybe_of_attrs attrs in + match modes with + | Some modes -> + let pat = {pat with ppat_attributes} in + sub.pat_mode_syntax sub modes pat + | None -> match Jane_syntax.Pattern.of_ast pat with | Some (jpat, attrs) -> sub.attributes sub attrs; @@ -750,22 +828,25 @@ let default_iterator = type_kind = T.iter_type_kind; typ = T.iter; typ_jane_syntax = T.iter_jst; + typ_mode_syntax = T.iter_mode; row_field = T.row_field; object_field = T.object_field; type_extension = T.iter_type_extension; type_exception = T.iter_type_exception; extension_constructor = T.iter_extension_constructor; value_description = - (fun this {pval_name; pval_type; pval_prim = _; pval_loc; + (fun this {pval_name; pval_type; pval_modalities; pval_prim = _; pval_loc; pval_attributes} -> iter_loc this pval_name; this.typ this pval_type; + iter_modalities this pval_modalities; this.location this pval_loc; this.attributes this pval_attributes; ); pat = P.iter; pat_jane_syntax = P.iter_jst; + pat_mode_syntax = P.iter_mode; expr = E.iter; expr_jane_syntax = E.iter_jst; binding_op = E.iter_binding_op; @@ -832,7 +913,15 @@ let default_iterator = value_binding = - (fun this {pvb_pat; pvb_expr; pvb_attributes; pvb_loc; pvb_constraint} -> + (fun this ({pvb_pat; pvb_expr; pvb_attributes; pvb_loc; pvb_constraint} as pvb) -> + let modes, pvb_attributes = + Jane_syntax.Mode_expr.maybe_of_attrs pvb_attributes + in + match modes with + | Some modes -> + let pvb = {pvb with pvb_attributes} in + this.value_binding_mode_syntax this modes pvb + | None -> this.pat this pvb_pat; this.expr this pvb_expr; Option.iter (function @@ -847,6 +936,11 @@ let default_iterator = this.attributes this pvb_attributes ); + value_binding_mode_syntax = + (fun this modes pvb -> + this.modes this modes; + this.value_binding this pvb + ); constructor_declaration = (fun this ({pcd_name; pcd_vars; pcd_args; @@ -868,11 +962,12 @@ let default_iterator = ); label_declaration = - (fun this {pld_name; pld_type; pld_loc; pld_mutable = _; pld_attributes}-> + (fun this {pld_name; pld_type; pld_loc; pld_mutable = _; pld_modalities; pld_attributes}-> iter_loc this pld_name; this.typ this pld_type; this.location this pld_loc; - this.attributes this pld_attributes + this.attributes this pld_attributes; + iter_modalities this pld_modalities ); cases = (fun this l -> List.iter (this.case this) l); @@ -892,6 +987,13 @@ let default_iterator = this.location this a.attr_loc ); attributes = (fun this l -> List.iter (this.attribute this) l); + (* Location inside a mode expression needs to be traversed. *) + modes = (fun this m -> + let open Jane_syntax.Mode_expr in + let iter_const sub : Const.t -> _ = + fun m -> iter_loc sub (m : Const.t :> _ Location.loc) + in + iter_loc_txt this (fun sub -> List.iter (iter_const sub)) m); payload = (fun this -> function | PStr x -> this.structure this x @@ -900,5 +1002,16 @@ let default_iterator = | PPat (x, g) -> this.pat this x; iter_opt (this.expr this) g ); - jkind_annotation = (fun _this _l -> ()); + jkind_annotation = + (fun this -> function + | Default -> () + | Abbreviation s -> + iter_loc this (s : Jane_syntax.Jkind.Const.t :> _ loc) + | Mod (t, mode_list) -> + this.jkind_annotation this t; + this.modes this mode_list + | With (t, ty) -> + this.jkind_annotation this t; + this.typ this ty + | Kind_of ty -> this.typ this ty); } diff --git a/parsing/ast_iterator.mli b/parsing/ast_iterator.mli index df2df9d6ba1..6b923a8c43e 100644 --- a/parsing/ast_iterator.mli +++ b/parsing/ast_iterator.mli @@ -30,6 +30,7 @@ open Parsetree type iterator = { attribute: iterator -> attribute -> unit; attributes: iterator -> attribute list -> unit; + modes : iterator -> Jane_syntax.Mode_expr.t -> unit; binding_op: iterator -> binding_op -> unit; case: iterator -> case -> unit; cases: iterator -> case list -> unit; @@ -49,7 +50,7 @@ type iterator = { extension_constructor: iterator -> extension_constructor -> unit; include_declaration: iterator -> include_declaration -> unit; include_description: iterator -> include_description -> unit; - jkind_annotation: iterator -> Jane_asttypes.const_jkind -> unit; + jkind_annotation: iterator -> Jane_syntax.Jkind.t -> unit; label_declaration: iterator -> label_declaration -> unit; location: iterator -> Location.t -> unit; module_binding: iterator -> module_binding -> unit; @@ -63,6 +64,7 @@ type iterator = { open_description: iterator -> open_description -> unit; pat: iterator -> pattern -> unit; pat_jane_syntax: iterator -> Jane_syntax.Pattern.t -> unit; + pat_mode_syntax : iterator -> Jane_syntax.Mode_expr.t -> pattern -> unit; payload: iterator -> payload -> unit; signature: iterator -> signature -> unit; signature_item: iterator -> signature_item -> unit; @@ -72,6 +74,7 @@ type iterator = { structure_item_jane_syntax: iterator -> Jane_syntax.Structure_item.t -> unit; typ: iterator -> core_type -> unit; typ_jane_syntax: iterator -> Jane_syntax.Core_type.t -> unit; + typ_mode_syntax : iterator -> Jane_syntax.Mode_expr.t -> core_type -> unit; row_field: iterator -> row_field -> unit; object_field: iterator -> object_field -> unit; type_declaration: iterator -> type_declaration -> unit; @@ -79,6 +82,7 @@ type iterator = { type_exception: iterator -> type_exception -> unit; type_kind: iterator -> type_kind -> unit; value_binding: iterator -> value_binding -> unit; + value_binding_mode_syntax: iterator -> Jane_syntax.Mode_expr.t -> value_binding -> unit; value_description: iterator -> value_description -> unit; with_constraint: iterator -> with_constraint -> unit; } diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 70754ed0d36..6d24ee8d183 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -52,7 +52,7 @@ type mapper = { include_declaration: mapper -> include_declaration -> include_declaration; include_description: mapper -> include_description -> include_description; jkind_annotation: - mapper -> Jane_asttypes.const_jkind -> Jane_asttypes.const_jkind; + mapper -> Jane_syntax.Jkind.t -> Jane_syntax.Jkind.t; label_declaration: mapper -> label_declaration -> label_declaration; location: mapper -> Location.t -> Location.t; module_binding: mapper -> module_binding -> module_binding; @@ -93,6 +93,7 @@ type mapper = { Jane_syntax.Structure_item.t -> Jane_syntax.Structure_item.t; typ_jane_syntax: mapper -> Jane_syntax.Core_type.t -> Jane_syntax.Core_type.t; + modes : mapper -> Jane_syntax.Mode_expr.t -> Jane_syntax.Mode_expr.t; } let map_fst f (x, y) = (f x, y) @@ -105,6 +106,20 @@ let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt} let map_loc_txt sub f {loc; txt} = {loc = sub.location sub loc; txt = f sub txt} +let map_modalities sub modalities = + List.map (map_loc sub) modalities + +let map_mode_and_attributes sub attrs = + let open Jane_syntax.Mode_expr in + let modes, attrs = maybe_of_attrs attrs in + let mode_attr = + match modes with + | Some modes -> + Option.to_list (sub.modes sub modes |> attr_of) + | None -> [] + in + mode_attr @ sub.attributes sub attrs + module C = struct (* Constants *) @@ -121,6 +136,8 @@ end module T = struct (* Type expressions for the core language *) + module LT = Jane_syntax.Labeled_tuples + let row_field sub { prf_desc; prf_loc; @@ -171,9 +188,14 @@ module T = struct let jkind = map_loc_txt sub sub.jkind_annotation jkind in Ltyp_alias { aliased_type; name; jkind } + let map_jst_labeled_tuple sub : LT.core_type -> LT.core_type = function + (* CR labeled tuples: Eventually mappers may want to see the labels. *) + | tl -> List.map (map_snd (sub.typ sub)) tl + let map_jst sub : Jane_syntax.Core_type.t -> Jane_syntax.Core_type.t = function | Jtyp_layout typ -> Jtyp_layout (map_jst_layouts sub typ) + | Jtyp_tuple x -> Jtyp_tuple (map_jst_labeled_tuple sub x) let map sub ({ptyp_desc = desc; ptyp_loc = loc; ptyp_attributes = attrs} as typ) = @@ -181,12 +203,12 @@ module T = struct let loc = sub.location sub loc in match Jane_syntax.Core_type.of_ast typ with | Some (jtyp, attrs) -> begin - let attrs = sub.attributes sub attrs in + let attrs = map_mode_and_attributes sub attrs in let jtyp = sub.typ_jane_syntax sub jtyp in Jane_syntax.Core_type.core_type_of jtyp ~loc ~attrs end | None -> - let attrs = sub.attributes sub attrs in + let attrs = map_mode_and_attributes sub attrs in match desc with | Ptyp_any -> any ~loc ~attrs () | Ptyp_var s -> var ~loc ~attrs s @@ -210,22 +232,32 @@ module T = struct | Ptyp_extension x -> extension ~loc ~attrs (sub.extension sub x) let map_type_declaration sub - {ptype_name; ptype_params; ptype_cstrs; + ({ptype_name; ptype_params; ptype_cstrs; ptype_kind; ptype_private; ptype_manifest; ptype_attributes; - ptype_loc} = + ptype_loc} as tyd) = let loc = sub.location sub ptype_loc in + let jkind, ptype_attributes = + match Jane_syntax.Layouts.of_type_declaration tyd with + | None -> None, ptype_attributes + | Some (jkind, attributes) -> + let jkind = map_loc_txt sub sub.jkind_annotation jkind in + Some jkind, attributes + in let attrs = sub.attributes sub ptype_attributes in - Type.mk ~loc ~attrs (map_loc sub ptype_name) + Jane_syntax.Layouts.type_declaration_of ~loc ~attrs (map_loc sub ptype_name) ~params:(List.map (map_fst (sub.typ sub)) ptype_params) ~priv:ptype_private ~cstrs:(List.map (map_tuple3 (sub.typ sub) (sub.typ sub) (sub.location sub)) ptype_cstrs) ~kind:(sub.type_kind sub ptype_kind) - ?manifest:(map_opt (sub.typ sub) ptype_manifest) + ~manifest:(map_opt (sub.typ sub) ptype_manifest) + ~jkind + ~docs:Docstrings.empty_docs + ~text:None let map_type_kind sub = function | Ptype_abstract -> Ptype_abstract @@ -234,8 +266,14 @@ module T = struct | Ptype_record l -> Ptype_record (List.map (sub.label_declaration sub) l) | Ptype_open -> Ptype_open + let map_constructor_argument sub x = + let pca_type = sub.typ sub x.pca_type in + let pca_loc = sub.location sub x.pca_loc in + let pca_modalities = map_modalities sub x.pca_modalities in + { pca_type; pca_loc; pca_modalities } + let map_constructor_arguments sub = function - | Pcstr_tuple l -> Pcstr_tuple (List.map (sub.typ sub) l) + | Pcstr_tuple l -> Pcstr_tuple (List.map (map_constructor_argument sub) l) | Pcstr_record l -> Pcstr_record (List.map (sub.label_declaration sub) l) @@ -391,11 +429,23 @@ module MT = struct | Ifsig_include_functor incl -> Ifsig_include_functor (sub.include_description sub incl) + module L = Jane_syntax.Layouts + + let map_sig_layout sub : L.signature_item -> L.signature_item = + function + | Lsig_kind_abbrev (name, jkind) -> + Lsig_kind_abbrev ( + map_loc sub name, + map_loc_txt sub sub.jkind_annotation jkind + ) + let map_signature_item_jst sub : Jane_syntax.Signature_item.t -> Jane_syntax.Signature_item.t = function | Jsig_include_functor ifincl -> Jsig_include_functor (map_sig_include_functor sub ifincl) + | Jsig_layout sigi -> + Jsig_layout (map_sig_layout sub sigi) let map_signature_item sub ({psig_desc = desc; psig_loc = loc} as sigi) = let open Sig in @@ -405,6 +455,8 @@ module MT = struct match sub.signature_item_jane_syntax sub jsigi with | Jsig_include_functor incl -> Jane_syntax.Include_functor.sig_item_of ~loc incl + | Jsig_layout sigi -> + Jane_syntax.Layouts.sig_item_of ~loc sigi end | None -> match desc with @@ -472,11 +524,23 @@ module M = struct | Ifstr_include_functor incl -> Ifstr_include_functor (sub.include_declaration sub incl) + module L = Jane_syntax.Layouts + + let map_str_layout sub : L.structure_item -> L.structure_item = + function + | Lstr_kind_abbrev (name, jkind) -> + Lstr_kind_abbrev ( + map_loc sub name, + map_loc_txt sub sub.jkind_annotation jkind + ) + let map_structure_item_jst sub : Jane_syntax.Structure_item.t -> Jane_syntax.Structure_item.t = function | Jstr_include_functor ifincl -> Jstr_include_functor (map_str_include_functor sub ifincl) + | Jstr_layout stri -> + Jstr_layout (map_str_layout sub stri) let map_structure_item sub ({pstr_loc = loc; pstr_desc = desc} as stri) = let open Str in @@ -486,6 +550,8 @@ module M = struct match sub.structure_item_jane_syntax sub jstri with | Jstr_include_functor incl -> Jane_syntax.Include_functor.str_item_of ~loc incl + | Jstr_layout stri -> + Jane_syntax.Layouts.str_item_of ~loc stri end | None -> match desc with @@ -518,6 +584,8 @@ module E = struct module IA = Jane_syntax.Immutable_arrays module L = Jane_syntax.Layouts module N_ary = Jane_syntax.N_ary_functions + module LT = Jane_syntax.Labeled_tuples + module Modes = Jane_syntax.Modes let map_iterator sub : C.iterator -> C.iterator = function | Range { start; stop; direction } -> @@ -589,7 +657,7 @@ module E = struct : N_ary.function_constraint -> N_ary.function_constraint = function | { mode_annotations; type_constraint } -> - { mode_annotations; + { mode_annotations = sub.modes sub mode_annotations; type_constraint = map_type_constraint sub type_constraint; } @@ -607,12 +675,22 @@ module E = struct let body = map_function_body sub body in params, constraint_, body + let map_ltexp sub : LT.expression -> LT.expression = function + (* CR labeled tuples: Eventually mappers may want to see the labels. *) + | el -> List.map (map_snd (sub.expr sub)) el + + let map_modes_exp sub : Modes.expression -> Modes.expression = function + | Coerce (modes, exp) -> + Coerce (sub.modes sub modes, sub.expr sub exp) + let map_jst sub : Jane_syntax.Expression.t -> Jane_syntax.Expression.t = function | Jexp_comprehension x -> Jexp_comprehension (map_cexp sub x) | Jexp_immutable_array x -> Jexp_immutable_array (map_iaexp sub x) | Jexp_layout x -> Jexp_layout (map_layout_exp sub x) | Jexp_n_ary_function x -> Jexp_n_ary_function (map_n_ary_exp sub x) + | Jexp_tuple ltexp -> Jexp_tuple (map_ltexp sub ltexp) + | Jexp_modes mode_exp -> Jexp_modes (map_modes_exp sub mode_exp) let map sub ({pexp_loc = loc; pexp_desc = desc; pexp_attributes = attrs} as exp) = @@ -718,6 +796,7 @@ module P = struct module IA = Jane_syntax.Immutable_arrays module L = Jane_syntax.Layouts + module LT = Jane_syntax.Labeled_tuples let map_iapat sub : IA.pattern -> IA.pattern = function | Iapat_immutable_array elts -> @@ -729,10 +808,16 @@ module P = struct *) | Float _ | Integer _ as x -> x + let map_ltpat sub : LT.pattern -> LT.pattern = function + (* CR labeled tuples: Eventually mappers may want to see the labels. *) + | (pl, closed) -> + (List.map (map_snd (sub.pat sub)) pl, closed) + let map_jst sub : Jane_syntax.Pattern.t -> Jane_syntax.Pattern.t = function | Jpat_immutable_array x -> Jpat_immutable_array (map_iapat sub x) | Jpat_layout (Lpat_constant x) -> Jpat_layout (Lpat_constant (map_unboxed_constant_pat sub x)) + | Jpat_tuple ltpat -> Jpat_tuple (map_ltpat sub ltpat) let map sub ({ppat_desc = desc; ppat_loc = loc; ppat_attributes = attrs} as pat) = @@ -740,11 +825,11 @@ module P = struct let loc = sub.location sub loc in match Jane_syntax.Pattern.of_ast pat with | Some (jpat, attrs) -> begin - let attrs = sub.attributes sub attrs in + let attrs = map_mode_and_attributes sub attrs in Jane_syntax.Pattern.pat_of ~loc ~attrs (sub.pat_jane_syntax sub jpat) end | None -> - let attrs = sub.attributes sub attrs in + let attrs = map_mode_and_attributes sub attrs in match desc with | Ppat_any -> any ~loc ~attrs () | Ppat_var s -> var ~loc ~attrs (map_loc sub s) @@ -874,11 +959,12 @@ let default_mapper = type_exception = T.map_type_exception; extension_constructor = T.map_extension_constructor; value_description = - (fun this {pval_name; pval_type; pval_prim; pval_loc; + (fun this {pval_name; pval_type; pval_modalities; pval_prim; pval_loc; pval_attributes} -> Val.mk (map_loc this pval_name) (this.typ this pval_type) + ~modalities:(map_modalities this pval_modalities) ~attrs:(this.attributes this pval_attributes) ~loc:(this.location this pval_loc) ~prim:pval_prim @@ -973,7 +1059,7 @@ let default_mapper = (this.expr this pvb_expr) ?value_constraint:(Option.map map_ct pvb_constraint) ~loc:(this.location this pvb_loc) - ~attrs:(this.attributes this pvb_attributes) + ~attrs:(map_mode_and_attributes this pvb_attributes) ); @@ -998,11 +1084,12 @@ let default_mapper = ); label_declaration = - (fun this {pld_name; pld_type; pld_loc; pld_mutable; pld_attributes} -> + (fun this {pld_name; pld_type; pld_loc; pld_mutable; pld_modalities; pld_attributes} -> Type.field (map_loc this pld_name) (this.typ this pld_type) ~mut:pld_mutable + ~modalities:(map_modalities this pld_modalities) ~loc:(this.location this pld_loc) ~attrs:(this.attributes this pld_attributes) ); @@ -1030,6 +1117,7 @@ let default_mapper = } ); attributes = (fun this l -> List.map (this.attribute this) l); + payload = (fun this -> function | PStr x -> PStr (this.structure this x) @@ -1038,7 +1126,20 @@ let default_mapper = | PPat (x, g) -> PPat (this.pat this x, map_opt (this.expr this) g) ); - jkind_annotation = (fun _this l -> l); + jkind_annotation = (fun this -> + let open Jane_syntax in + function + | Default -> Default + | Abbreviation s -> + let {txt; loc} = + map_loc this (s : Jkind.Const.t :> _ loc) + in + Abbreviation (Jkind.Const.mk txt loc) + | Mod (t, mode_list) -> + Mod (this.jkind_annotation this t, this.modes this mode_list) + | With (t, ty) -> + With (this.jkind_annotation this t, this.typ this ty) + | Kind_of ty -> Kind_of (this.typ this ty)); expr_jane_syntax = E.map_jst; extension_constructor_jane_syntax = T.map_extension_constructor_jst; @@ -1047,6 +1148,17 @@ let default_mapper = signature_item_jane_syntax = MT.map_signature_item_jst; structure_item_jane_syntax = M.map_structure_item_jst; typ_jane_syntax = T.map_jst; + + modes = (fun this m -> + let open Jane_syntax.Mode_expr in + let map_const sub : Const.t -> Const.t = + fun m -> + let {txt; loc} = + map_loc sub (m : Const.t :> _ Location.loc) + in + Const.mk txt loc + in + map_loc_txt this (fun sub -> List.map (map_const sub)) m); } let extension_of_error {kind; main; sub} = @@ -1124,11 +1236,16 @@ module PpxContext = struct } let make ~tool_name () = + let Load_path.{ visible; hidden } = Load_path.get_paths () in let fields = [ lid "tool_name", make_string tool_name; - lid "include_dirs", make_list make_string !Clflags.include_dirs; - lid "load_path", make_list make_string (Load_path.get_paths ()); + lid "include_dirs", make_list make_string (!Clflags.include_dirs); + lid "hidden_include_dirs", + make_list make_string (!Clflags.hidden_include_dirs); + lid "load_path", + make_pair (make_list make_string) (make_list make_string) + (visible, hidden); lid "open_modules", make_list make_string !Clflags.open_modules; lid "for_package", make_option make_string !Clflags.for_package; lid "debug", make_bool !Clflags.debug; @@ -1197,17 +1314,22 @@ module PpxContext = struct tool_name_ref := get_string payload | "include_dirs" -> Clflags.include_dirs := get_list get_string payload + | "hidden_include_dirs" -> + Clflags.hidden_include_dirs := get_list get_string payload | "load_path" -> (* Duplicates Compmisc.auto_include, since we can't reference Compmisc from this module. *) let auto_include find_in_dir fn = - if !Clflags.no_std_include then + if !Clflags.no_auto_include_otherlibs || !Clflags.no_std_include then raise Not_found else let alert = Location.auto_include_alert in Load_path.auto_include_otherlibs alert find_in_dir fn in - Load_path.init ~auto_include (get_list get_string payload) + let visible, hidden = + get_pair (get_list get_string) (get_list get_string) payload + in + Load_path.init ~auto_include ~visible ~hidden | "open_modules" -> Clflags.open_modules := get_list get_string payload | "for_package" -> diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 25965b63792..501bcfeef5c 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -90,7 +90,7 @@ type mapper = { type *) jkind_annotation: - mapper -> Jane_asttypes.const_jkind -> Jane_asttypes.const_jkind; + mapper -> Jane_syntax.Jkind.t -> Jane_syntax.Jkind.t; label_declaration: mapper -> label_declaration -> label_declaration; location: mapper -> Location.t -> Location.t; module_binding: mapper -> module_binding -> module_binding; @@ -131,6 +131,7 @@ type mapper = { Jane_syntax.Structure_item.t -> Jane_syntax.Structure_item.t; typ_jane_syntax: mapper -> Jane_syntax.Core_type.t -> Jane_syntax.Core_type.t; + modes : mapper -> Jane_syntax.Mode_expr.t -> Jane_syntax.Mode_expr.t; } (** A mapper record implements one "method" per syntactic category, using an open recursion style: each method takes as its first @@ -148,8 +149,8 @@ val tool_name: unit -> string ["ocaml"], ... Some global variables that reflect command-line options are automatically synchronized between the calling tool and the ppx preprocessor: {!Clflags.include_dirs}, - {!Load_path}, {!Clflags.open_modules}, {!Clflags.for_package}, - {!Clflags.debug}. *) + {!Clflags.hidden_include_dirs}, {!Load_path}, {!Clflags.open_modules}, + {!Clflags.for_package}, {!Clflags.debug}. *) val apply: source:string -> target:string -> mapper -> unit diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index 163c51e94ed..d4d7b10f62c 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -20,10 +20,8 @@ *) -(** (Jane Street specific; delete when upstreaming.) - Don't add new types to this file; add them to [jane_asttypes.mli] instead. - This file is considered part of the parse tree, which we can't modify. *) - +(* Do not add to this type; it is no longer used in the compiler but is + required by ppxlib. *) type constant = Const_int of int | Const_char of char @@ -50,6 +48,7 @@ type closed_flag = Closed | Open type label = string +(** This is used only in the Parsetree. *) type arg_label = Nolabel | Labelled of string (** [label:T -> ...] *) diff --git a/parsing/builtin_attributes.ml b/parsing/builtin_attributes.ml index 6eddfd6371e..e5b3aea43eb 100644 --- a/parsing/builtin_attributes.ml +++ b/parsing/builtin_attributes.ml @@ -14,7 +14,6 @@ (**************************************************************************) open Asttypes -open Jane_asttypes open Parsetree open Ast_helper @@ -33,16 +32,20 @@ let mark_used t = Attribute_table.remove unused_attrs t *) let attr_order a1 a2 = Location.compare a1.loc a2.loc -let unchecked_properties = Attribute_table.create 1 -let mark_property_checked txt loc = - Attribute_table.remove unchecked_properties { txt; loc } -let register_property attr = - Attribute_table.replace unchecked_properties attr () -let warn_unchecked_property () = - let keys = List.of_seq (Attribute_table.to_seq_keys unchecked_properties) in +let unchecked_zero_alloc_attributes = Attribute_table.create 1 +let mark_zero_alloc_attribute_checked txt loc = + Attribute_table.remove unchecked_zero_alloc_attributes { txt; loc } +let register_zero_alloc_attribute attr = + Attribute_table.replace unchecked_zero_alloc_attributes attr () +let warn_unchecked_zero_alloc_attribute () = + (* When using -i, attributes will not have been translated, so we can't + warn about missing ones. *) + if !Clflags.print_types then () + else + let keys = List.of_seq (Attribute_table.to_seq_keys unchecked_zero_alloc_attributes) in let keys = List.sort attr_order keys in List.iter (fun sloc -> - Location.prerr_warning sloc.loc (Warnings.Unchecked_property_attribute sloc.txt)) + Location.prerr_warning sloc.loc (Warnings.Unchecked_zero_alloc_attribute)) keys let warn_unused () = @@ -51,7 +54,6 @@ let warn_unused () = if !Clflags.print_types then () else begin - warn_unchecked_property (); let keys = List.of_seq (Attribute_table.to_seq_keys unused_attrs) in let keys = List.sort attr_order keys in List.iter (fun sloc -> @@ -77,12 +79,8 @@ let builtin_attrs = ; "ppwarning"; "ocaml.ppwarning" ; "explicit_arity"; "ocaml.explicit_arity" ; "warn_on_literal_pattern"; "ocaml.warn_on_literal_pattern" - ; "float64"; "ocaml.float64" ; "immediate"; "ocaml.immediate" ; "immediate64"; "ocaml.immediate64" - ; "void"; "ocaml.void" - ; "value"; "ocaml.value" - ; "any"; "ocaml.any" ; "boxed"; "ocaml.boxed" ; "unboxed"; "ocaml.unboxed" ; "principal"; "ocaml.principal" @@ -93,6 +91,7 @@ let builtin_attrs = ; "afl_inst_ratio"; "ocaml.afl_inst_ratio" ; "local_opt"; "ocaml.local_opt" ; "curry"; "ocaml.curry"; "extension.curry" + (* [local] and [global] are never used and always trigger warning 53 *) ; "global"; "ocaml.global"; "extension.global" ; "local"; "ocaml.local"; "extension.local" ; "nontail"; "ocaml.nontail"; "extension.nontail" @@ -107,7 +106,10 @@ let builtin_attrs = ; "builtin"; "ocaml.builtin" ; "no_effects"; "ocaml.no_effects" ; "no_coeffects"; "ocaml.no_coeffects" - ; "only_generative_effects"; "ocaml.only_generative_effects"; + ; "only_generative_effects"; "ocaml.only_generative_effects" + ; "error_message"; "ocaml.error_message" + ; "layout_poly"; "ocaml.layout_poly" + ; "no_mutable_implied_modalities"; "ocaml.no_mutable_implied_modalities" ] (* nroberts: When we upstream the builtin-attribute whitelisting, we shouldn't @@ -218,6 +220,8 @@ let error_of_extension ext = | _ -> Location.errorf ~loc "Invalid syntax for extension '%s'." txt end + | ({txt = "call_pos"; loc}, _) -> + Location.errorf ~loc "[%%call_pos] can only exist as the type of a labelled argument" | ({txt; loc}, _) -> Location.errorf ~loc "Uninterpreted extension '%s'." txt @@ -437,15 +441,29 @@ module Attributes_filter = struct let create (t : t) = t end -let filter_attributes (nms_and_conds : Attributes_filter.t) attrs = +let filter_attributes ?(mark=true) (nms_and_conds : Attributes_filter.t) attrs = List.filter (fun a -> List.exists (fun (nms, cond) -> if List.mem a.attr_name.txt nms - then (mark_used a.attr_name; cond) + then (if mark then mark_used a.attr_name; cond) else false) nms_and_conds ) attrs +let find_attribute ?mark_used p attributes = + let inline_attribute = + filter_attributes ?mark:mark_used p attributes + in + let attr = + match inline_attribute with + | [] -> None + | [attr] -> Some attr + | attr :: {Parsetree.attr_name = {txt;loc}; _} :: _ -> + Location.prerr_warning loc (Warnings.Duplicated_attribute txt); + Some attr + in + attr + let when_attribute_is nms attr ~f = if List.mem attr.attr_name.txt nms then begin mark_used attr.attr_name; @@ -459,39 +477,33 @@ let warn_on_literal_pattern attrs = let explicit_arity attrs = has_attribute ["ocaml.explicit_arity"; "explicit_arity"] attrs -let jkind ~legacy_immediate attrs = +type jkind_attribute = + | Immediate64 + | Immediate + +let jkind_attribute_of_string = function + | "ocaml.immediate64" | "immediate64" -> Some Immediate64 + | "ocaml.immediate" | "immediate" -> Some Immediate + | _ -> None + +let jkind_attribute_to_string = function + | Immediate64 -> "immediate64" + | Immediate -> "immediate" + +let jkind attrs = let jkind = List.find_map (fun a -> - match a.attr_name.txt with - | "ocaml.void"|"void" -> Some (a, Void) - | "ocaml.value"|"value" -> Some (a, Value) - | "ocaml.any"|"any" -> Some (a, Any) - | "ocaml.immediate"|"immediate" -> Some (a, Immediate) - | "ocaml.immediate64"|"immediate64" -> Some (a, Immediate64) - | "ocaml.float64"|"float64" -> Some (a, Float64) - | _ -> None - ) attrs + match jkind_attribute_of_string a.attr_name.txt with + | Some attr -> Some (a, attr) + | None -> None + ) attrs in match jkind with - | None -> Ok None + | None -> None | Some (a, l) -> mark_used a.attr_name; - let l_loc = Location.mkloc l a.attr_loc in - let check b = - if b - then Ok (Some l_loc) - else Error l_loc - in - match l with - | Value -> check true - | Immediate | Immediate64 -> - check (legacy_immediate - || Language_extension.(is_at_least Layouts Beta)) - | Any | Float64 -> - check Language_extension.(is_at_least Layouts Beta) - | Void -> - check Language_extension.(is_at_least Layouts Alpha) + Some (Location.mkloc l a.attr_loc) (* The "ocaml.boxed (default)" and "ocaml.unboxed (default)" attributes cannot be input by the user, they are added by the @@ -592,12 +604,15 @@ let parse_attribute_with_ident_payload attr ~name ~f = let zero_alloc_attribute (attr : Parsetree.attribute) = parse_attribute_with_ident_payload attr ~name:"zero_alloc" ~f:(function - | "check" -> Clflags.zero_alloc_check := Clflags.Annotations.Check_default + | "check" -> Clflags.zero_alloc_check := Zero_alloc_annotations.Check_default + | "check_opt" -> Clflags.zero_alloc_check := Zero_alloc_annotations.Check_opt_only + | "check_all" -> Clflags.zero_alloc_check := Zero_alloc_annotations.Check_all + | "check_none" -> Clflags.zero_alloc_check := Zero_alloc_annotations.No_check | "all" -> Clflags.zero_alloc_check_assert_all := true | _ -> warn_payload attr.attr_loc attr.attr_name.txt - "Only 'check' and 'all' are supported") + "Only 'all', 'check', 'check_opt', 'check_all', and 'check_none' are supported") let afl_inst_ratio_attribute attr = clflags_attribute_with_int_payload attr @@ -620,69 +635,18 @@ let parse_standard_implementation_attributes attr = flambda_oclassic_attribute attr; zero_alloc_attribute attr +let has_no_mutable_implied_modalities attrs = + has_attribute ["ocaml.no_mutable_implied_modalities";"no_mutable_implied_modalities"] attrs + let has_local_opt attrs = has_attribute ["ocaml.local_opt"; "local_opt"] attrs -let has_curry attrs = - has_attribute ["extension.curry"; "ocaml.curry"; "curry"] attrs +let has_layout_poly attrs = + has_attribute ["ocaml.layout_poly"; "layout_poly"] attrs -(* Mode annotation attributes are handled fairly uniformly, so we have - a dedicated submodule for them. -*) -module Mode_annotation_attribute = struct - - (* When you add a constructor here, be sure to add it to [all]. *) - type t = - | Local - | Global - | Unique - | Once - - let all = [ Local; Global; Unique; Once; ] - - (* extension.* is generated by the parser and not usually written directly, - so does not have a short form. An error is reported if it is seen when - the extension is disabled *) - let name = function - | Local -> "extension.local" - | Global -> "extension.global" - | Unique -> "extension.unique" - | Once -> "extension.once" - - let extra_user_written_names = function - | Local -> [ "ocaml.local"; "local" ] - | Global -> [ "ocaml.global"; "global" ] - | Unique -> [ "ocaml.unique"; "unique" ] - | Once -> [ "ocaml.once"; "once" ] - - let is_language_extension_enabled = function - | Local | Global -> Language_extension.is_enabled Local - | Unique | Once -> Language_extension.is_enabled Unique - - let check t attr = - if has_attribute [ name t ] attr then - if not (is_language_extension_enabled t) then - Error () - else - Ok true - else - Ok (has_attribute (extra_user_written_names t) attr) -end - -let has_local attr = Mode_annotation_attribute.check Local attr -let has_global attr = Mode_annotation_attribute.check Global attr -let has_unique attr = Mode_annotation_attribute.check Unique attr -let has_once attr = Mode_annotation_attribute.check Once attr - -let mode_annotation_attributes_filter = - List.map - (fun attr -> - let names = - Mode_annotation_attribute.name attr - :: Mode_annotation_attribute.extra_user_written_names attr - in - names, true) - Mode_annotation_attribute.all +let has_curry attrs = + has_attribute + [Jane_syntax.Arrow_curry.curry_attr_name; "ocaml.curry"; "curry"] attrs let tailcall attr = let has_nontail = has_attribute ["ocaml.nontail"; "nontail"] attr in @@ -701,3 +665,331 @@ let tailcall attr = (Warnings.Attribute_payload (t.attr_name.txt, "Only 'hint' is supported")); Ok (Some `Tail_if_possible) + +let error_message_attr l = + let inner x = + match x.attr_name.txt with + | "ocaml.error_message"|"error_message" -> + begin match string_of_payload x.attr_payload with + | Some _ as r -> + mark_used x.attr_name; + r + | None -> warn_payload x.attr_loc x.attr_name.txt + "error_message attribute expects a string argument"; + None + end + | _ -> None in + List.find_map inner l + +type zero_alloc_check = + { strict: bool; + opt: bool; + arity: int; + loc: Location.t; + } + +type zero_alloc_assume = + { strict: bool; + never_returns_normally: bool; + never_raises: bool; + arity: int; + loc: Location.t; + } + +type zero_alloc_attribute = + | Default_zero_alloc + | Ignore_assert_all + | Check of zero_alloc_check + | Assume of zero_alloc_assume + +let is_zero_alloc_check_enabled ~opt = + match !Clflags.zero_alloc_check with + | No_check -> false + | Check_all -> true + | Check_default -> not opt + | Check_opt_only -> opt + +let is_zero_alloc_attribute = + [ ["zero_alloc"; "ocaml.zero_alloc"], true ] + +let get_payload get_from_exp = + let open Parsetree in + function + | PStr [{pstr_desc = Pstr_eval (exp, [])}] -> get_from_exp exp + | _ -> Result.Error () + +let get_optional_payload get_from_exp = + let open Parsetree in + function + | PStr [] -> Result.Ok None + | other -> Result.map Option.some (get_payload get_from_exp other) + +let get_int_from_exp = + let open Parsetree in + function + | { pexp_desc = Pexp_constant (Pconst_integer(s, None)) } -> + begin match Misc.Int_literal_converter.int s with + | n -> Result.Ok n + | exception (Failure _) -> Result.Error () + end + | _ -> Result.Error () + +let get_construct_from_exp = + let open Parsetree in + function + | { pexp_desc = + Pexp_construct ({ txt = Longident.Lident constr }, None) } -> + Result.Ok constr + | _ -> Result.Error () + +let get_bool_from_exp exp = + Result.bind (get_construct_from_exp exp) + (function + | "true" -> Result.Ok true + | "false" -> Result.Ok false + | _ -> Result.Error ()) + +let get_int_payload = get_payload get_int_from_exp +let get_optional_bool_payload = get_optional_payload get_bool_from_exp + +let get_id_from_exp = + let open Parsetree in + function + | { pexp_desc = Pexp_ident { txt = Longident.Lident id } } -> Result.Ok id + | _ -> Result.Error () + +let get_id_or_constant_from_exp = + let open Parsetree in + function + | { pexp_desc = Pexp_ident { txt = Longident.Lident id } } -> Result.Ok id + | { pexp_desc = Pexp_constant (Pconst_integer (s,None)) } -> Result.Ok s + | _ -> Result.Error () + +let get_ids_and_constants_from_exp exp = + let open Parsetree in + (match exp with + | { pexp_desc = Pexp_apply (exp, args) } -> + get_id_or_constant_from_exp exp :: + List.map (function + | (Asttypes.Nolabel, arg) -> get_id_or_constant_from_exp arg + | (_, _) -> Result.Error ()) + args + | _ -> [get_id_or_constant_from_exp exp]) + |> List.fold_left (fun acc r -> + match acc, r with + | Result.Ok ids, Ok id -> Result.Ok (id::ids) + | (Result.Error _ | Ok _), _ -> Result.Error ()) + (Ok []) + |> Result.map List.rev + +let parse_optional_id_payload txt loc ~empty cases payload = + let[@local] warn () = + let ( %> ) f g x = g (f x) in + let msg = + cases + |> List.map (fst %> Printf.sprintf "'%s'") + |> String.concat ", " + |> Printf.sprintf "It must be either %s or empty" + in + Location.prerr_warning loc (Warnings.Attribute_payload (txt, msg)); + Error () + in + match get_optional_payload get_id_from_exp payload with + | Error () -> warn () + | Ok None -> Ok empty + | Ok (Some id) -> + match List.assoc_opt id cases with + | Some r -> Ok r + | None -> warn () + +(* Looks for `arity n` in payload. If present, this returns `n` and an updated + payload with `arity n` removed. Note it may change the order of the payload, + which is fine because we sort it later. *) +let filter_arity payload = + let is_arity s1 s2 = + match s1 with + | "arity" -> int_of_string_opt s2 + | _ -> None + in + let rec find_arity acc payload = + match payload with + | [] | [_] -> None + | s1 :: ((s2 :: payload) as payload') -> + begin match is_arity s1 s2 with + | Some n -> Some (n, acc @ payload) + | None -> find_arity (s1 :: acc) payload' + end + in + find_arity [] payload + +let zero_alloc_lookup_table = + (* These are the possible payloads (sans arity) paired with a function that + returns the corresponding check_attribute, given the arity and the loc. *) + [ + (["assume"], + fun arity loc -> + Assume { strict = false; never_returns_normally = false; + never_raises = false; + arity; loc; }); + (["strict"], + fun arity loc -> + Check { strict = true; opt = false; arity; loc; }); + (["opt"], + fun arity loc -> + Check { strict = false; opt = true; arity; loc; }); + (["opt"; "strict"; ], + fun arity loc -> + Check { strict = true; opt = true; arity; loc; }); + (["assume"; "strict"], + fun arity loc -> + Assume { strict = true; never_returns_normally = false; + never_raises = false; + arity; loc; }); + (["assume"; "never_returns_normally"], + fun arity loc -> + Assume { strict = false; never_returns_normally = true; + never_raises = false; + arity; loc; }); + (["assume"; "never_returns_normally"; "strict"], + fun arity loc -> + Assume { strict = true; never_returns_normally = true; + never_raises = false; + arity; loc; }); + (["assume"; "error"], + fun arity loc -> + Assume { strict = true; never_returns_normally = true; + never_raises = true; + arity; loc; }); + (["ignore"], fun _ _ -> Ignore_assert_all) + ] + +let parse_zero_alloc_payload ~loc ~arity ~warn ~empty payload = + (* This parses the remainder of the payload after arity has been parsed + out. *) + match payload with + | [] -> empty + | _ :: _ -> + let payload = List.sort String.compare payload in + match List.assoc_opt payload zero_alloc_lookup_table with + | None -> warn (); Default_zero_alloc + | Some ca -> ca arity loc + +let parse_zero_alloc_attribute ~is_arity_allowed ~default_arity attr = + match attr with + | None -> Default_zero_alloc + | Some {Parsetree.attr_name = {txt; loc}; attr_payload = payload} -> + let warn () = + let ( %> ) f g x = g (f x) in + let msg = + zero_alloc_lookup_table + |> List.map (fst %> String.concat " " %> Printf.sprintf "'%s'") + |> String.concat ", " + |> Printf.sprintf "It must be either %s or empty" + in + Location.prerr_warning loc (Warnings.Attribute_payload (txt, msg)) + in + let empty arity = + Check { strict = false; opt = false; arity; loc; } + in + match get_optional_payload get_ids_and_constants_from_exp payload with + | Error () -> warn (); Default_zero_alloc + | Ok None -> empty default_arity + | Ok (Some payload) -> + let arity, payload = + match filter_arity payload with + | None -> default_arity, payload + | Some (user_arity, payload) -> + if is_arity_allowed then + user_arity, payload + else + (warn_payload loc txt + "The \"arity\" field is only supported on \"zero_alloc\" in \ + signatures"; + default_arity, payload) + in + parse_zero_alloc_payload ~loc ~arity ~warn ~empty:(empty arity) payload + +let get_zero_alloc_attribute ~in_signature ~default_arity l = + let attr = find_attribute is_zero_alloc_attribute l in + let res = + parse_zero_alloc_attribute ~is_arity_allowed:in_signature ~default_arity + attr + in + (match attr, res with + | None, Default_zero_alloc -> () + | _, Default_zero_alloc -> () + | None, (Check _ | Assume _ | Ignore_assert_all) -> assert false + | Some _, Ignore_assert_all -> () + | Some _, Assume _ -> () + | Some attr, Check { opt; _ } -> + if not in_signature && is_zero_alloc_check_enabled ~opt && !Clflags.native_code then + (* The warning for unchecked functions will not trigger if the check is + requested through the [@@@zero_alloc all] top-level annotation rather + than through the function annotation [@zero_alloc]. *) + register_zero_alloc_attribute attr.attr_name); + res + +let zero_alloc_attribute_only_assume_allowed za = + match za with + | Assume assume -> Some assume + | Default_zero_alloc | Ignore_assert_all -> None + | Check { loc; _ } -> + let name = "zero_alloc" in + let msg = "Only the following combinations are supported in this context: \ + 'zero_alloc assume', \ + `zero_alloc assume strict`, \ + `zero_alloc assume error`,\ + `zero_alloc assume never_returns_normally`,\ + `zero_alloc assume never_returns_normally strict`." + in + Location.prerr_warning loc (Warnings.Attribute_payload (name, msg)); + None + +let assume_zero_alloc assume : Zero_alloc_utils.Assume_info.t = + match assume with + | { strict; never_returns_normally; never_raises; } -> + Zero_alloc_utils.Assume_info.create ~strict ~never_returns_normally ~never_raises + +type tracing_probe = + { name : string; + name_loc : Location.t; + enabled_at_init : bool; + arg : Parsetree.expression; + } + +let get_tracing_probe_payload (payload : Parsetree.payload) = + let ( let* ) = Result.bind in + let* name, name_loc, args = + match payload with + | PStr + ([{ pstr_desc = + Pstr_eval + ({ pexp_desc = + (Pexp_apply + ({ pexp_desc= + (Pexp_constant (Pconst_string(name,_,None))); + pexp_loc = name_loc; + _ } + , args)) + ; _ } + , _)}]) -> Ok (name, name_loc, args) + | _ -> Error () + in + let bool_of_string = function + | "true" -> Ok true + | "false" -> Ok false + | _ -> Error () + in + let* arg, enabled_at_init = + match args with + | [Nolabel, arg] -> Ok (arg, false) + | [Labelled "enabled_at_init", + { pexp_desc = + Pexp_construct({ txt = Longident.Lident b; _ }, + None); _ }; + Nolabel, arg] -> + let* enabled_at_init = bool_of_string b in + Ok (arg, enabled_at_init) + | _ -> Error () + in + Ok { name; name_loc; enabled_at_init; arg } diff --git a/parsing/builtin_attributes.mli b/parsing/builtin_attributes.mli index 26d43d6a75b..34e13ae4f9a 100644 --- a/parsing/builtin_attributes.mli +++ b/parsing/builtin_attributes.mli @@ -70,12 +70,12 @@ val register_attr : attr_tracking_time -> string Location.loc -> unit val mark_alert_used : Parsetree.attribute -> unit val mark_alerts_used : Parsetree.attributes -> unit -(** Properties such as the zero_alloc attribute that are checked +(** Zero_alloc attributes are checked in late stages of compilation in the backend. Registering them helps detect code that is not checked, because it is optimized away by the middle-end. *) -val register_property : string Location.loc -> unit -val mark_property_checked : string -> Location.t -> unit +val register_zero_alloc_attribute : string Location.loc -> unit +val mark_zero_alloc_attribute_checked : string -> Location.t -> unit (** Marks "warn_on_literal_pattern" attributes used for the purposes of misplaced attribute warnings. Call this when moving things with alert @@ -92,6 +92,7 @@ val mark_payload_attrs_used : Parsetree.payload -> unit (** Issue misplaced attribute warnings for all attributes created with [mk_internal] but not yet marked used. *) val warn_unused : unit -> unit +val warn_unchecked_zero_alloc_attribute : unit -> unit val check_alerts: Location.t -> Parsetree.attributes -> string -> unit val check_alerts_inclusion: @@ -158,8 +159,16 @@ end count as misplaced if the compiler could use it in some configuration. *) val filter_attributes : + ?mark:bool -> Attributes_filter.t -> Parsetree.attributes -> Parsetree.attributes +(** [find_attribute] behaves like [filter_attribute], except that it returns at + most one matching attribute and issues a "duplicated attribute" warning if + there are multiple matches. *) +val find_attribute : + ?mark_used:bool -> Attributes_filter.t -> Parsetree.attributes -> + Parsetree.attribute option + val warn_on_literal_pattern: Parsetree.attributes -> bool val explicit_arity: Parsetree.attributes -> bool @@ -169,60 +178,128 @@ val has_boxed: Parsetree.attributes -> bool val parse_standard_interface_attributes : Parsetree.attribute -> unit val parse_standard_implementation_attributes : Parsetree.attribute -> unit +val has_no_mutable_implied_modalities: Parsetree.attributes -> bool val has_local_opt: Parsetree.attributes -> bool +val has_layout_poly: Parsetree.attributes -> bool val has_curry: Parsetree.attributes -> bool -(* These functions report Error if the builtin extension.* attributes - are present despite the extension being disabled *) -val has_local: Parsetree.attributes -> (bool,unit) result -val has_global: Parsetree.attributes -> (bool,unit) result val tailcall : Parsetree.attributes -> ([`Tail|`Nontail|`Tail_if_possible] option, [`Conflict]) result -val has_unique: Parsetree.attributes -> (bool,unit) result - -val has_once : Parsetree.attributes -> (bool, unit) result +(* CR layouts v1.5: Remove everything except for [Immediate64] and [Immediate] + after rerouting [@@immediate]. *) +type jkind_attribute = + | Immediate64 + | Immediate -(** This filter selects attributes corresponding to mode annotations on - let-bindings. +val jkind_attribute_to_string : jkind_attribute -> string +val jkind_attribute_of_string : string -> jkind_attribute option - This filter is used principally by the type-checker when it copies [local_], - [unique_], and [once_] mode annotation attributes from let-bindings to both - the let-bound expression and its pattern. +(* [jkind] gets the first jkind in the attributes if one is present. All such + attributes can be provided even in the absence of the layouts extension + as the attribute mechanism predates layouts. *) -val mode_annotation_attributes_filter : Attributes_filter.t - -(* [jkind] gets the jkind in the attributes if one is present. We always - allow the [value] annotation, even if the layouts extensions are disabled. - If [~legacy_immediate] is true, we allow [immediate] and [immediate64] - attributes even if the layouts extensions are disabled - this is used to - support the original immediacy attributes, which are now implemented in terms - of jkinds. - - The return value is [Error ] if a jkind attribute is present but - not allowed by the current set of extensions. Otherwise it is [Ok None] if - there is no jkind annotation and [Ok (Some jkind)] if there is one. - - - If no layout extensions are on and [~legacy_immediate] is false, this will - always return [Ok None], [Ok (Some Value)], or [Error ...]. - - If no layout extensions are on and [~legacy_immediate] is true, this will - error on [void], [float64], or [any], but allow [immediate], [immediate64], - and [value]. - - If the [Layouts_beta] extension is on, this behaves like the previous case - regardless of the value of [~legacy_immediate], except that it allows - [float64] and [any]. - - If the [Layouts_alpha] extension is on, this can return any jkind and - never errors. - - Currently, the [Layouts] extension is ignored - it's no different than - turning on no layout extensions. - - This is not the only place the layouts extension level is checked. If you're - changing what's allowed in a given level, you may also need to make changes - in the parser, Jkind.get_required_layouts_level, and Typeopt. +val jkind : Parsetree.attributes -> jkind_attribute Location.loc option + +(** Finds the first "error_message" attribute, marks it as used, and returns its + string payload. Returns [None] if no such attribute is present. + + There should be at most one "error_message" attribute, additional ones are sliently + ignored. **) +val error_message_attr : Parsetree.attributes -> string option + +(** [get_int_payload] is a helper for working with attribute payloads. + Given a payload that consist of a structure containing exactly + {[ + PStr [ + {pstr_desc = + Pstr_eval (Pexp_constant (Pconst_integer(i, None)), []) + } + ] + ]} + it returns [i]. + *) +val get_int_payload : Parsetree.payload -> (int, unit) Result.t + +(** [get_optional_bool_payload] is a helper for working with attribute payloads. + It behaves like [get_int_payload], except that it looks for a boolean + constant rather than an int constant, and returns [None] rather than [Error] + if the payload is empty. *) +val get_optional_bool_payload : + Parsetree.payload -> (bool option, unit) Result.t + +(** [parse_id_payload] is a helper for parsing information from an attribute + whose payload is an identifier. If the given payload consists of a single + identifier, that identifier is looked up in the association list. The result + is returned, if it exists. The [empty] value is returned if the payload is + empty. Otherwise, [Error ()] is returned and a warning is issued. *) +val parse_optional_id_payload : + string -> Location.t -> empty:'a -> (string * 'a) list -> + Parsetree.payload -> ('a,unit) Result.t + +(* Support for zero_alloc *) +type zero_alloc_check = + { strict: bool; + (* [strict=true] property holds on all paths. + [strict=false] if the function returns normally, + then the property holds (but property violations on + exceptional returns or diverging loops are ignored). + This definition may not be applicable to new properties. *) + opt: bool; + arity: int; + loc: Location.t; + } + +type zero_alloc_assume = + { strict: bool; + never_returns_normally: bool; + never_raises: bool; + (* [never_raises=true] the function never returns + via an exception. The function (directly or transitively) + may raise exceptions that do not escape, i.e., + handled before the function returns. *) + arity: int; + loc: Location.t; + } + +type zero_alloc_attribute = + | Default_zero_alloc + | Ignore_assert_all + | Check of zero_alloc_check + | Assume of zero_alloc_assume + +val is_zero_alloc_check_enabled : opt:bool -> bool + +(* Gets a zero_alloc attribute. [~in_signature] controls both whether the + "arity n" field is allowed, and whether we track this attribute for + warning 199. *) +val get_zero_alloc_attribute : + in_signature:bool -> default_arity:int -> Parsetree.attributes -> + zero_alloc_attribute + +(* This returns the [zero_alloc_assume] if the input is an assume. Otherwise, + it returns None. If the input attribute is [Check], this issues a warning. *) +val zero_alloc_attribute_only_assume_allowed : + zero_alloc_attribute -> zero_alloc_assume option + +val assume_zero_alloc : zero_alloc_assume -> Zero_alloc_utils.Assume_info.t + +type tracing_probe = + { name : string; + name_loc : Location.t; + enabled_at_init : bool; + arg : Parsetree.expression; + } + +(* Gets the payload of a [probe] extension node. Example syntax of a probe + that's disabled by default: + + [%probe "my_probe" arg] + + You can use [enabled_at_init] to control whether the probe is enabled + by default: + + [%probe "my_probe" ~enabled_at_init:true arg] *) -(* CR layouts: we should eventually be able to delete ~legacy_immediate (after we - turn on layouts by default). *) -val jkind : legacy_immediate:bool -> Parsetree.attributes -> - (Jane_asttypes.jkind_annotation option, - Jane_asttypes.jkind_annotation) result +val get_tracing_probe_payload : + Parsetree.payload -> (tracing_probe, unit) result diff --git a/parsing/depend.ml b/parsing/depend.ml index 232eb7f922c..dd5575d98f5 100644 --- a/parsing/depend.ml +++ b/parsing/depend.ml @@ -14,7 +14,6 @@ (**************************************************************************) open Asttypes -open Jane_asttypes open Location open Longident open Parsetree @@ -98,7 +97,7 @@ let handle_extension ext = (* CR layouts: Remember to add this when jkinds can have module prefixes. *) -let add_jkind _bv (_jkind : jkind_annotation) = () +let add_jkind _bv (_jkind : Jane_syntax.Jkind.annotation) = () let add_vars_jkinds bv vars_jkinds = let add_one (_, jkind) = Option.iter (add_jkind bv) jkind in @@ -133,6 +132,7 @@ let rec add_type bv ty = and add_type_jst bv : Jane_syntax.Core_type.t -> _ = function | Jtyp_layout typ -> add_type_jst_layouts bv typ + | Jtyp_tuple x -> add_type_jst_labeled_tuple bv x and add_type_jst_layouts bv : Jane_syntax.Layouts.core_type -> _ = function | Ltyp_var { name = _; jkind } -> @@ -144,6 +144,9 @@ and add_type_jst_layouts bv : Jane_syntax.Layouts.core_type -> _ = function add_type bv aliased_type; add_jkind bv jkind +and add_type_jst_labeled_tuple bv : Jane_syntax.Labeled_tuples.core_type -> _ = + fun tl -> List.iter (fun (_, ty) -> add_type bv ty) tl + and add_package_type bv (lid, l) = add bv lid; List.iter (add_type bv) (List.map (fun (_, e) -> e) l) @@ -153,7 +156,7 @@ let add_opt add_fn bv = function | Some x -> add_fn bv x let add_constructor_arguments bv = function - | Pcstr_tuple l -> List.iter (add_type bv) l + | Pcstr_tuple l -> List.iter (fun a -> add_type bv a.pca_type) l | Pcstr_record l -> List.iter (fun l -> add_type bv l.pld_type) l let add_constructor_decl bv pcd = @@ -238,6 +241,8 @@ and add_pattern_jane_syntax bv : Jane_syntax.Pattern.t -> _ = function | Jpat_immutable_array (Iapat_immutable_array pl) -> List.iter (add_pattern bv) pl | Jpat_layout (Lpat_constant _) -> add_constant + | Jpat_tuple (labeled_pl, _) -> + List.iter (fun (_, p) -> add_pattern bv p) labeled_pl let add_pattern bv pat = pattern_bv := bv; @@ -317,6 +322,11 @@ let rec add_expr bv exp = | Pstr_eval ({ pexp_desc = Pexp_construct (c, None) }, _) -> add bv c | _ -> handle_extension e end + | Pexp_extension (({ txt = ("probe"|"ocaml.probe"); _ }, payload) as e) -> + begin match Builtin_attributes.get_tracing_probe_payload payload with + | Error () -> handle_extension e + | Ok { arg; _ } -> add_expr bv arg + end | Pexp_extension e -> handle_extension e | Pexp_unreachable -> () @@ -325,6 +335,12 @@ and add_expr_jane_syntax bv : Jane_syntax.Expression.t -> _ = function | Jexp_immutable_array x -> add_immutable_array_expr bv x | Jexp_layout x -> add_layout_expr bv x | Jexp_n_ary_function n_ary -> add_n_ary_function bv n_ary + | Jexp_tuple x -> add_labeled_tuple_expr bv x + | Jexp_modes x -> add_modes_expr bv x + +and add_modes_expr bv : Jane_syntax.Modes.expression -> _ = + function + | Coerce (_modes, exp) -> add_expr bv exp and add_comprehension_expr bv : Jane_syntax.Comprehensions.expression -> _ = function @@ -402,6 +418,9 @@ and add_function_constraint bv add_opt add_type bv ty1; add_type bv ty2 +and add_labeled_tuple_expr bv : Jane_syntax.Labeled_tuples.expression -> _ = + function el -> List.iter (add_expr bv) (List.map snd el) + and add_cases bv cases = List.iter (add_case bv) cases @@ -516,11 +535,13 @@ and add_include_description (bv, m) incl = let add = String.Map.fold String.Map.add m' in (add bv, add m) -and add_sig_item_jst bvm : Jane_syntax.Signature_item.t -> _ = function +and add_sig_item_jst (bv, m) : Jane_syntax.Signature_item.t -> _ = function | Jsig_include_functor (Ifsig_include_functor incl) -> (* It seems to be correct to treat [include functor] the same as [include], but it's possible we could do something cleverer. *) - add_include_description bvm incl + add_include_description (bv, m) incl + | Jsig_layout (Lsig_kind_abbrev (_, jkind)) -> + add_jkind bv jkind; (bv, m) and add_sig_item (bv, m) item = match Jane_syntax.Signature_item.of_ast item with @@ -670,11 +691,13 @@ and add_include_declaration (bv, m) incl = let add = String.Map.fold String.Map.add m' in (add bv, add m) -and add_struct_item_jst bvm : Jane_syntax.Structure_item.t -> _ = function +and add_struct_item_jst (bv, m) : Jane_syntax.Structure_item.t -> _ = function | Jstr_include_functor (Ifstr_include_functor incl) -> (* It seems to be correct to treat [include functor] the same as [include], but it's possible we could do something cleverer. *) - add_include_declaration bvm incl + add_include_declaration (bv, m) incl + | Jstr_layout (Lstr_kind_abbrev (_name, jkind)) -> + add_jkind bv jkind; (bv, m) and add_struct_item (bv, m) item : _ String.Map.t * _ String.Map.t = match Jane_syntax.Structure_item.of_ast item with diff --git a/parsing/jane_syntax.ml b/parsing/jane_syntax.ml index 843c79794b7..949f04d7a6b 100644 --- a/parsing/jane_syntax.ml +++ b/parsing/jane_syntax.ml @@ -1,5 +1,4 @@ open Asttypes -open Jane_asttypes open Parsetree open Jane_syntax_parsing @@ -184,6 +183,20 @@ module type Payload_protocol = sig end end +module type Structure_item_encodable = sig + type t + + val of_structure_item : structure_item -> t loc option + + val to_structure_item : t loc -> structure_item + + (** For error messages: a name that can be used to identify the + [t] being converted to and from string, and its indefinite + article (either "a" or "an"). + *) + val indefinite_article_and_name : string * string +end + module type Stringable = sig type t @@ -198,34 +211,44 @@ module type Stringable = sig val indefinite_article_and_name : string * string end -module Make_payload_protocol_of_stringable (Stringable : Stringable) : - Payload_protocol with type t := Stringable.t = struct - module Encode = struct - let as_expr t_loc = - let string = Stringable.to_string t_loc.txt in +module Make_structure_item_encodable_of_stringable (Stringable : Stringable) : + Structure_item_encodable with type t = Stringable.t = struct + include Stringable + + let to_structure_item t_loc = + let string = Stringable.to_string t_loc.txt in + let expr = Ast_helper.Exp.ident (Location.mkloc (Longident.Lident string) t_loc.loc) + in + { pstr_desc = Pstr_eval (expr, []); pstr_loc = Location.none } - let structure_item_of_expr expr = - { pstr_desc = Pstr_eval (expr, []); pstr_loc = Location.none } + let of_structure_item = function + | { pstr_desc = Pstr_eval ({ pexp_desc = Pexp_ident payload_lid; _ }, _) } + -> ( + match Stringable.of_string (Longident.last payload_lid.txt) with + | Some t -> Some (Location.mkloc t payload_lid.loc) + | None -> None) + | _ -> None +end +module Make_payload_protocol_of_structure_item_encodable + (Encodable : Structure_item_encodable) : + Payload_protocol with type t := Encodable.t = struct + module Encode = struct let structure_item_of_none = { pstr_desc = Pstr_attribute - { attr_name = Location.mknoloc "none"; + { attr_name = Location.mknoloc "jane.none"; attr_payload = PStr []; attr_loc = Location.none }; pstr_loc = Location.none } - let as_payload t_loc = - let expr = as_expr t_loc in - PStr [structure_item_of_expr expr] + let as_payload t_loc = PStr [Encodable.to_structure_item t_loc] let list_as_payload t_locs = - let items = - List.map (fun t_loc -> structure_item_of_expr (as_expr t_loc)) t_locs - in + let items = List.map Encodable.to_structure_item t_locs in PStr items let option_list_as_payload t_locs = @@ -233,7 +256,7 @@ module Make_payload_protocol_of_stringable (Stringable : Stringable) : List.map (function | None -> structure_item_of_none - | Some t_loc -> structure_item_of_expr (as_expr t_loc)) + | Some t_loc -> Encodable.to_structure_item t_loc) t_locs in PStr items @@ -244,7 +267,7 @@ module Make_payload_protocol_of_stringable (Stringable : Stringable) : let report_error ~loc = function | Unknown_payload payload -> - let indefinite_article, name = Stringable.indefinite_article_and_name in + let indefinite_article, name = Encodable.indefinite_article_and_name in Location.errorf ~loc "Attribute payload does not name %s %s:@;%a" indefinite_article name (Printast.payload 0) payload @@ -263,34 +286,25 @@ module Make_payload_protocol_of_stringable (Stringable : Stringable) : open struct exception Unexpected - let from_expr = function - | { pexp_desc = Pexp_ident payload_lid; _ } -> - let t = - match Stringable.of_string (Longident.last payload_lid.txt) with - | None -> raise Unexpected - | Some t -> t - in - Location.mkloc t payload_lid.loc - | _ -> raise Unexpected - - let expr_of_structure_item = function - | { pstr_desc = Pstr_eval (expr, _) } -> expr - | _ -> raise Unexpected - let is_none_structure_item = function - | { pstr_desc = Pstr_attribute { attr_name = { txt = "none" } } } -> + | { pstr_desc = Pstr_attribute { attr_name = { txt = "jane.none" } } } + -> true | _ -> false + let from_structure_item item = + match Encodable.of_structure_item item with + | Some t_loc -> t_loc + | None -> raise Unexpected + let from_payload payload = match payload with - | PStr [item] -> from_expr (expr_of_structure_item item) + | PStr [item] -> from_structure_item item | _ -> raise Unexpected let list_from_payload payload = match payload with - | PStr items -> - List.map (fun item -> from_expr (expr_of_structure_item item)) items + | PStr items -> List.map (fun item -> from_structure_item item) items | _ -> raise Unexpected let option_list_from_payload payload = @@ -300,7 +314,7 @@ module Make_payload_protocol_of_stringable (Stringable : Stringable) : (fun item -> if is_none_structure_item item then None - else Some (from_expr (expr_of_structure_item item))) + else Some (from_structure_item item)) items | _ -> raise Unexpected end @@ -319,41 +333,298 @@ module Make_payload_protocol_of_stringable (Stringable : Stringable) : end end -module Stringable_const_jkind = struct - type t = const_jkind - - let indefinite_article_and_name = "a", "layout" - - let to_string = function - | Any -> "any" - | Value -> "value" - | Void -> "void" - | Immediate64 -> "immediate64" - | Immediate -> "immediate" - | Float64 -> "float64" - - (* CR layouts v1.5: revise when moving jkind recognition away from parser *) - let of_string = function - | "any" -> Some Any - | "value" -> Some Value - | "void" -> Some Void - | "immediate" -> Some Immediate - | "immediate64" -> Some Immediate64 - | "float64" -> Some Float64 - | _ -> None +module Make_payload_protocol_of_stringable (Stringable : Stringable) : + Payload_protocol with type t := Stringable.t = + Make_payload_protocol_of_structure_item_encodable + (Make_structure_item_encodable_of_stringable (Stringable)) + +module Arrow_curry = struct + let curry_attr_name = "extension.curry" + + let curry_attr loc = + Ast_helper.Attr.mk ~loc:Location.none + (Location.mkloc curry_attr_name loc) + (PStr []) +end + +module Mode_expr = struct + module Const : sig + type raw = string + + type t = private raw Location.loc + + val mk : string -> Location.t -> t + + val list_as_payload : t list -> payload + + val list_from_payload : loc:Location.t -> payload -> t list + + val ghostify : t -> t + end = struct + type raw = string + + module Protocol = Make_payload_protocol_of_stringable (struct + type t = raw + + let indefinite_article_and_name = "a", "mode" + + let to_string s = s + + let of_string' s = s + + let of_string s = Some (of_string' s) + end) + + let list_as_payload = Protocol.Encode.list_as_payload + + let list_from_payload = Protocol.Decode.list_from_payload + + type t = raw Location.loc + + let mk txt loc : t = { txt; loc } + + let ghostify { txt; loc } = + let loc = { loc with loc_ghost = true } in + { txt; loc } + end + + type t = Const.t list Location.loc + + let empty = Location.mknoloc [] + + let singleton const = + let const' = (const : Const.t :> _ Location.loc) in + Location.mkloc [const] const'.loc + + let concat mode0 mode1 = + let txt = mode0.txt @ mode1.txt in + Location.mknoloc txt + + let feature : Feature.t = Language_extension Mode + + let attribute_or_extension_name = + Embedded_name.of_feature feature [] |> Embedded_name.to_string + + let attribute_name = attribute_or_extension_name + + let payload_of { txt; _ } = + match txt with + | [] -> None + | _ :: _ as txt -> Some (Const.list_as_payload txt) + + let of_payload ~loc payload = + let l = Const.list_from_payload ~loc payload in + match l with + | [] -> Misc.fatal_error "Payload encoding empty mode expression" + | _ :: _ -> Location.mkloc l loc + + let extract_attr attrs = + let attrs, rest = + List.partition + (fun { attr_name; _ } -> attr_name.txt = attribute_name) + attrs + in + match attrs with + | [] -> None, rest + | [attr] -> Some attr, rest + | _ :: _ :: _ -> Misc.fatal_error "More than one mode attribute" + + let of_attr { attr_payload; attr_loc; _ } = + of_payload ~loc:attr_loc attr_payload + + let maybe_of_attrs attrs = + let attr, rest = extract_attr attrs in + let mode = Option.map of_attr attr in + mode, rest + + let of_attrs attrs = + let mode, rest = maybe_of_attrs attrs in + let mode = Option.value mode ~default:empty in + mode, rest + + let attr_of modes = + match payload_of modes with + | None -> None + | Some attr_payload -> + let attr_name = Location.mknoloc attribute_name in + let attr_loc = modes.loc in + Some { attr_name; attr_loc; attr_payload } + + let ghostify { txt; loc } = + let loc = { loc with loc_ghost = true } in + let txt = List.map Const.ghostify txt in + { loc; txt } end -module Jkinds_pprint = struct - let const_jkind fmt cl = - Format.pp_print_string fmt (Stringable_const_jkind.to_string cl) +(** Some mode-related constructs *) +module Modes = struct + let feature : Feature.t = Language_extension Mode + + type nonrec expression = Coerce of Mode_expr.t * expression + + let extension_name = Mode_expr.attribute_or_extension_name + + let of_expr ({ pexp_desc; pexp_attributes; _ } as expr) = + match pexp_desc with + | Pexp_apply + ( { pexp_desc = Pexp_extension ({ txt; _ }, payload); pexp_loc; _ }, + [(Nolabel, body)] ) + when txt = extension_name -> + let modes = Mode_expr.of_payload ~loc:pexp_loc payload in + Coerce (modes, body), pexp_attributes + | _ -> + Misc.fatal_errorf "Improperly encoded modes expression: %a" + (Printast.expression 0) expr + + let expr_of ~loc (Coerce (modes, body)) = + match Mode_expr.payload_of modes with + | None -> body + | Some payload -> + let ext = + Ast_helper.Exp.extension ~loc:modes.loc + (Location.mknoloc extension_name, payload) + in + Expression.make_entire_jane_syntax ~loc feature (fun () -> + Ast_helper.Exp.apply ~loc ext [Nolabel, body]) +end + +module Jkind = struct + module Const : sig + type raw = string + + type t = private raw loc + + val mk : string -> Location.t -> t + + val of_structure_item : structure_item -> t option + + val to_structure_item : t -> structure_item + end = struct + type raw = string + + module Protocol = Make_structure_item_encodable_of_stringable (struct + type t = raw + + let indefinite_article_and_name = "a", "primitive kind" + + let to_string t = t + + let of_string t = Some t + end) + + type t = raw loc + + let mk txt loc : t = { txt; loc } + + let of_structure_item = Protocol.of_structure_item + + let to_structure_item = Protocol.to_structure_item + end + + type t = + | Default + | Abbreviation of Const.t + | Mod of t * Mode_expr.t + | With of t * core_type + | Kind_of of core_type + + type annotation = t loc + + let indefinite_article_and_name = "a", "kind" + + let prefix = "jane.erasable.layouts." + + let struct_item_of_attr attr = + { pstr_desc = Pstr_attribute attr; pstr_loc = Location.none } + + let struct_item_to_attr item = + match item with + | { pstr_desc = Pstr_attribute attr; _ } -> Some attr + | _ -> None - let jkind_annotation fmt ann = const_jkind fmt ann.txt + let struct_item_of_type ty = + { pstr_desc = + Pstr_type + (Recursive, [Ast_helper.Type.mk ~manifest:ty (Location.mknoloc "t")]); + pstr_loc = Location.none + } + + let struct_item_to_type item = + match item with + | { pstr_desc = Pstr_type (Recursive, [decl]); _ } -> decl.ptype_manifest + | _ -> None + + let struct_item_of_list name list loc = + struct_item_of_attr + { attr_name = Location.mknoloc (prefix ^ name); + attr_payload = PStr list; + attr_loc = loc + } + + let struct_item_to_list item = + let strip_prefix s = + let prefix_len = String.length prefix in + String.sub s prefix_len (String.length s - prefix_len) + in + match item with + | { pstr_desc = + Pstr_attribute + { attr_name = name; attr_payload = PStr list; attr_loc = loc }; + _ + } + when String.starts_with ~prefix name.txt -> + Some (strip_prefix name.txt, list, loc) + | _ -> None + + let rec to_structure_item t_loc = + let to_structure_item t = to_structure_item (Location.mknoloc t) in + match t_loc.txt with + | Default -> struct_item_of_list "default" [] t_loc.loc + | Abbreviation c -> + struct_item_of_list "abbrev" [Const.to_structure_item c] t_loc.loc + | Mod (t, mode_list) -> + let mode_list_item = + struct_item_of_attr + { attr_name = Location.mknoloc (prefix ^ "mod"); + attr_payload = Mode_expr.Const.list_as_payload mode_list.txt; + attr_loc = mode_list.loc + } + in + struct_item_of_list "mod" [to_structure_item t; mode_list_item] t_loc.loc + | With (t, ty) -> + struct_item_of_list "with" + [to_structure_item t; struct_item_of_type ty] + t_loc.loc + | Kind_of ty -> + struct_item_of_list "kind_of" [struct_item_of_type ty] t_loc.loc + + let rec of_structure_item item = + let bind = Option.bind in + let ret loc v = Some (Location.mkloc v loc) in + match struct_item_to_list item with + | Some ("default", [], loc) -> ret loc Default + | Some ("mod", [item_of_t; item_of_mode_expr], loc) -> + bind (of_structure_item item_of_t) (fun { txt = t } -> + bind (struct_item_to_attr item_of_mode_expr) (fun attr -> + let mode_list = + Mode_expr.Const.list_from_payload ~loc attr.attr_payload + in + ret loc (Mod (t, { txt = mode_list; loc = attr.attr_loc })))) + | Some ("with", [item_of_t; item_of_ty], loc) -> + bind (of_structure_item item_of_t) (fun { txt = t } -> + bind (struct_item_to_type item_of_ty) (fun ty -> + ret loc (With (t, ty)))) + | Some ("kind_of", [item_of_ty], loc) -> + bind (struct_item_to_type item_of_ty) (fun ty -> ret loc (Kind_of ty)) + | Some ("abbrev", [item], loc) -> + bind (Const.of_structure_item item) (fun c -> ret loc (Abbreviation c)) + | Some _ | None -> None end (** Jkind annotations' encoding as attribute payload, used in both n-ary functions and jkinds. *) module Jkind_annotation : sig - include Payload_protocol with type t := const_jkind + include Payload_protocol with type t := Jkind.t module Decode : sig include module type of Decode @@ -362,10 +633,10 @@ module Jkind_annotation : sig loc:Location.t -> string Location.loc list -> payload -> - (string Location.loc * jkind_annotation option) list + (string Location.loc * Jkind.annotation option) list end end = struct - module Protocol = Make_payload_protocol_of_stringable (Stringable_const_jkind) + module Protocol = Make_payload_protocol_of_structure_item_encodable (Jkind) (*******************************************************) (* Conversions with a payload *) @@ -377,20 +648,12 @@ end = struct module Desugaring_error = struct type error = - | Wrong_number_of_jkinds of int * jkind_annotation option list + | Wrong_number_of_jkinds of int * Jkind.annotation option list let report_error ~loc = function - | Wrong_number_of_jkinds (n, jkinds) -> + | Wrong_number_of_jkinds (n, _jkinds) -> Location.errorf ~loc - "Wrong number of layouts in an layout attribute;@;\ - expecting %i but got this list:@;\ - %a" - n - (Format.pp_print_list - (Format.pp_print_option - ~none:(fun ppf () -> Format.fprintf ppf "None") - Jkinds_pprint.jkind_annotation)) - jkinds + "Wrong number of kinds in an kind attribute;@;expecting %i." n exception Error of Location.t * error @@ -413,30 +676,6 @@ end = struct end end -module Mode_annotation = struct - type t = - | Local - | Unique - | Once - - include Make_payload_protocol_of_stringable (struct - type nonrec t = t - - let indefinite_article_and_name = "a", "mode" - - let to_string = function - | Local -> "local" - | Unique -> "unique" - | Once -> "once" - - let of_string = function - | "local" -> Some Local - | "unique" -> Some Unique - | "once" -> Some Once - | _ -> None - end) -end - (** List and array comprehensions *) module Comprehensions = struct module Ext = struct @@ -695,24 +934,19 @@ module N_ary_functions = struct type function_param_desc = | Pparam_val of arg_label * expression option * pattern - | Pparam_newtype of string loc * jkind_annotation option + | Pparam_newtype of string loc * Jkind.annotation option type function_param = { pparam_desc : function_param_desc; pparam_loc : Location.t } - type mode_annotation = Mode_annotation.t = - | Local - | Unique - | Once - type type_constraint = | Pconstraint of core_type | Pcoerce of core_type option * core_type type function_constraint = - { mode_annotations : mode_annotation loc list; + { mode_annotations : Mode_expr.t; type_constraint : type_constraint } @@ -731,8 +965,8 @@ module N_ary_functions = struct type t = | Top_level | Fun_then of after_fun - | Mode_constraint of mode_annotation loc list - | Jkind_annotation of const_jkind loc + | Mode_constraint of Mode_expr.t + | Jkind_annotation of Jkind.annotation (* We return an [of_suffix_result] from [of_suffix] rather than having [of_suffix] interpret the payload for two reasons: @@ -755,9 +989,9 @@ module N_ary_functions = struct | Top_level -> [], None | Fun_then Cases -> ["cases"], None | Fun_then Constraint_then_cases -> ["constraint"; "cases"], None - | Mode_constraint mode_annotation -> - let payload = Mode_annotation.Encode.list_as_payload mode_annotation in - ["mode_constraint"], Some payload + | Mode_constraint modes -> + let payload = Mode_expr.payload_of modes in + ["mode_constraint"], payload | Jkind_annotation jkind_annotation -> let payload = Jkind_annotation.Encode.as_payload jkind_annotation in ["jkind_annotation"], Some payload @@ -770,18 +1004,8 @@ module N_ary_functions = struct | ["mode_constraint"] -> Payload (fun payload ~loc -> - let mode_annotations = - Mode_annotation.Decode.list_from_payload payload ~loc - in - List.iter - (fun mode_annotation -> - assert_extension_enabled ~loc - (match (mode_annotation.txt : mode_annotation) with - | Local -> Local - | Unique | Once -> Unique) - ()) - mode_annotations; - Mode_constraint mode_annotations) + let modes = Mode_expr.of_payload payload ~loc in + Mode_constraint modes) | ["jkind_annotation"] -> Payload (fun payload ~loc -> @@ -804,7 +1028,7 @@ module N_ary_functions = struct | Expected_constraint_or_coerce | Expected_function_cases of Attribute_node.t | Expected_fun_or_newtype of Attribute_node.t - | Expected_newtype_with_jkind_annotation of jkind_annotation + | Expected_newtype_with_jkind_annotation of Jkind.annotation | Parameterless_function let report_error ~loc = function @@ -919,10 +1143,10 @@ module N_ary_functions = struct | Pexp_function cases -> cases | _ -> Desugaring_error.raise expr (Expected_function_cases arity_attribute) - let constraint_modes expr : mode_annotation loc list = + let constraint_modes expr : Mode_expr.t = match expand_n_ary_expr expr with | Some (Mode_constraint modes, _) -> modes - | _ -> [] + | _ -> Mode_expr.empty let check_constraint expr = match expr.pexp_desc with @@ -1150,8 +1374,8 @@ module N_ary_functions = struct | Pconstraint ty -> Ast_helper.Exp.constraint_ body ty ~loc | Pcoerce (ty1, ty2) -> Ast_helper.Exp.coerce body ty1 ty2 ~loc in - match mode_annotations with - | _ :: _ as mode_annotations -> + match mode_annotations.txt with + | _ :: _ -> n_ary_function_expr (Mode_constraint mode_annotations) constrained_body | [] -> constrained_body) @@ -1174,6 +1398,169 @@ module N_ary_functions = struct List.fold_right add_param init_params body_with_last_param) end +(** Labeled tuples *) +module Labeled_tuples = struct + module Ext = struct + let feature : Feature.t = Language_extension Labeled_tuples + end + + module Of_ast = Of_ast (Ext) + include Ext + + type nonrec core_type = (string option * core_type) list + + type nonrec expression = (string option * expression) list + + type nonrec pattern = (string option * pattern) list * closed_flag + + let string_of_label = function None -> "" | Some lbl -> lbl + + let label_of_string = function "" -> None | s -> Some s + + let string_of_closed_flag = function Closed -> "closed" | Open -> "open" + + let closed_flag_of_string = function + | "closed" -> Closed + | "open" -> Open + | _ -> failwith "bad closed flag" + + module Desugaring_error = struct + type error = + | Malformed + | Has_payload of payload + + let report_error ~loc = function + | Malformed -> + Location.errorf ~loc "Malformed embedded labeled tuple term" + | Has_payload payload -> + Location.errorf ~loc + "Labeled tuples attribute has an unexpected payload:@;%a" + (Printast.payload 0) payload + + exception Error of Location.t * error + + let () = + Location.register_error_of_exn (function + | Error (loc, err) -> Some (report_error ~loc err) + | _ -> None) + + let raise loc err = raise (Error (loc, err)) + end + + let expand_labeled_tuple_extension loc attrs = + let names, payload, attrs = + Of_ast.unwrap_jane_syntax_attributes_exn ~loc attrs + in + match payload with + | PStr [] -> names, attrs + | _ -> Desugaring_error.raise loc (Has_payload payload) + + type 'a label_check_result = + | No_labels of 'a list + | At_least_one_label of (string option * 'a) list + + let check_for_any_label xs = + if List.for_all (fun (lbl, _x) -> Option.is_none lbl) xs + then No_labels (List.map snd xs) + else At_least_one_label xs + + let typ_of ~loc tl = + match check_for_any_label tl with + | No_labels tl -> Ast_helper.Typ.tuple ~loc tl + | At_least_one_label tl -> + (* See Note [Wrapping with make_entire_jane_syntax] *) + Core_type.make_entire_jane_syntax ~loc feature (fun () -> + let names = List.map (fun (label, _) -> string_of_label label) tl in + Core_type.make_jane_syntax feature names + @@ Ast_helper.Typ.tuple (List.map snd tl)) + + (* Returns remaining unconsumed attributes *) + let of_typ typ = + let labels, ptyp_attributes = + expand_labeled_tuple_extension typ.ptyp_loc typ.ptyp_attributes + in + match typ.ptyp_desc with + | Ptyp_tuple components -> + if List.length labels <> List.length components + then Desugaring_error.raise typ.ptyp_loc Malformed; + let labeled_components = + List.map2 (fun s t -> label_of_string s, t) labels components + in + labeled_components, ptyp_attributes + | _ -> Desugaring_error.raise typ.ptyp_loc Malformed + + (* We wrap labeled tuple expressions in an additional extension node + so that tools that inspect the OCaml syntax tree are less likely + to treat a labeled tuple as a regular tuple. + *) + let labeled_tuple_extension_node_name = + Embedded_name.of_feature feature [] |> Embedded_name.to_string + + let expr_of ~loc el = + match check_for_any_label el with + | No_labels el -> Ast_helper.Exp.tuple ~loc el + | At_least_one_label el -> + (* See Note [Wrapping with make_entire_jane_syntax] *) + Expression.make_entire_jane_syntax ~loc feature (fun () -> + let names = List.map (fun (label, _) -> string_of_label label) el in + Expression.make_jane_syntax feature names + @@ Ast_helper.Exp.apply + (Ast_helper.Exp.extension + (Location.mknoloc labeled_tuple_extension_node_name, PStr [])) + [Nolabel, Ast_helper.Exp.tuple (List.map snd el)]) + + (* Returns remaining unconsumed attributes *) + let of_expr expr = + let labels, pexp_attributes = + expand_labeled_tuple_extension expr.pexp_loc expr.pexp_attributes + in + match expr.pexp_desc with + | Pexp_apply + ( { pexp_desc = Pexp_extension (name, PStr []) }, + [(Nolabel, { pexp_desc = Pexp_tuple components; _ })] ) + when String.equal name.txt labeled_tuple_extension_node_name -> + if List.length labels <> List.length components + then Desugaring_error.raise expr.pexp_loc Malformed; + let labeled_components = + List.map2 (fun s e -> label_of_string s, e) labels components + in + labeled_components, pexp_attributes + | _ -> Desugaring_error.raise expr.pexp_loc Malformed + + let pat_of = + let make_jane_syntax ~loc pl closed = + (* See Note [Wrapping with make_entire_jane_syntax] *) + Pattern.make_entire_jane_syntax ~loc feature (fun () -> + let names = List.map (fun (label, _) -> string_of_label label) pl in + Pattern.make_jane_syntax feature + (string_of_closed_flag closed :: names) + @@ Ast_helper.Pat.tuple (List.map snd pl)) + in + fun ~loc (pl, closed) -> + match closed with + | Open -> make_jane_syntax ~loc pl closed + | Closed -> ( + match check_for_any_label pl with + | No_labels pl -> Ast_helper.Pat.tuple ~loc pl + | At_least_one_label pl -> make_jane_syntax ~loc pl closed) + + (* Returns remaining unconsumed attributes *) + let of_pat pat = + let labels, ppat_attributes = + expand_labeled_tuple_extension pat.ppat_loc pat.ppat_attributes + in + match labels, pat.ppat_desc with + | closed :: labels, Ppat_tuple components -> + if List.length labels <> List.length components + then Desugaring_error.raise pat.ppat_loc Malformed; + let closed = closed_flag_of_string closed in + let labeled_components = + List.map2 (fun s e -> label_of_string s, e) labels components + in + (labeled_components, closed), ppat_attributes + | _ -> Desugaring_error.raise pat.ppat_loc Malformed +end + (** [include functor] *) module Include_functor = struct type signature_item = Ifsig_include_functor of include_description @@ -1248,35 +1635,36 @@ module Layouts = struct type nonrec expression = | Lexp_constant of constant - | Lexp_newtype of string loc * jkind_annotation * expression + | Lexp_newtype of string loc * Jkind.annotation * expression type nonrec pattern = Lpat_constant of constant type nonrec core_type = | Ltyp_var of { name : string option; - jkind : jkind_annotation + jkind : Jkind.annotation } | Ltyp_poly of - { bound_vars : (string loc * jkind_annotation option) list; + { bound_vars : (string loc * Jkind.annotation option) list; inner_type : core_type } | Ltyp_alias of { aliased_type : core_type; name : string option; - jkind : jkind_annotation + jkind : Jkind.annotation } type nonrec extension_constructor = | Lext_decl of - (string Location.loc * jkind_annotation option) list + (string Location.loc * Jkind.annotation option) list * constructor_arguments * Parsetree.core_type option - (*******************************************************) - (* Pretty-printing *) + type signature_item = + | Lsig_kind_abbrev of string Location.loc * Jkind.annotation - module Pprint = Jkinds_pprint + type structure_item = + | Lstr_kind_abbrev of string Location.loc * Jkind.annotation (*******************************************************) (* Errors *) @@ -1580,6 +1968,100 @@ module Layouts = struct let of_constructor_declaration = Constructor_declaration.make_of_ast ~of_ast_internal:of_constructor_declaration_internal + + (*********************************************************) + (* Constructing a [type_declaration] with jkinds *) + + module Type_decl_of = Ast_of (Type_declaration) (Ext) + + let type_declaration_of ~loc ~attrs ~docs ~text ~params ~cstrs ~kind ~priv + ~manifest ~jkind name = + let type_decl = + Ast_helper.Type.mk ~loc ~docs ?text ~params ~cstrs ~kind ~priv ?manifest + name + in + let type_decl = + match jkind with + | None -> type_decl + | Some jkind -> + Type_declaration.make_entire_jane_syntax ~loc feature (fun () -> + let payload = Encode.as_payload jkind in + Type_decl_of.wrap_jane_syntax ["annot"] ~payload type_decl) + in + (* Performance hack: save an allocation if [attrs] is empty. *) + match attrs with + | [] -> type_decl + | _ :: _ as attrs -> + (* See Note [Outer attributes at end] *) + { type_decl with ptype_attributes = type_decl.ptype_attributes @ attrs } + + let of_type_declaration_internal (feat : Feature.t) type_decl = + match feat with + | Language_extension Layouts -> + let loc = type_decl.ptype_loc in + let names, payload, attributes = + Of_ast.unwrap_jane_syntax_attributes_exn ~loc type_decl.ptype_attributes + in + let jkind_annot = + match names with + | ["annot"] -> Decode.from_payload ~loc payload + | _ -> Desugaring_error.raise ~loc (Unexpected_attribute names) + in + Some (jkind_annot, attributes) + | _ -> None + + let of_type_declaration = + Type_declaration.make_of_ast ~of_ast_internal:of_type_declaration_internal + + (*********************************************************) + (* Constructing a [signature_item] for kind_abbrev *) + + let attr_name_of { txt = name; loc } = + let embed = Embedded_name.of_feature feature ["kind_abbrev"; name] in + Location.mkloc (Embedded_name.to_string embed) loc + + let of_attr_name { txt = attr_name; loc } = + let name = + match Embedded_name.of_string attr_name with + | Some (Ok embed) -> ( + match Embedded_name.components embed with + | _ :: ["kind_abbrev"; name] -> name + | _ -> failwith "Malformed [kind_abbrev] attribute") + | None | Some (Error _) -> failwith "Malformed [kind_abbrev] attribute" + in + Location.mkloc name loc + + let sig_item_of ~loc = function + | Lsig_kind_abbrev (name, jkind) -> + (* See Note [Wrapping with make_entire_jane_syntax] *) + Signature_item.make_entire_jane_syntax ~loc feature (fun () -> + let payload = Encode.as_payload jkind in + Ast_helper.Sig.attribute + (Ast_helper.Attr.mk (attr_name_of name) payload)) + + let of_sig_item sigi = + match sigi.psig_desc with + | Psig_attribute { attr_name; attr_payload; _ } -> + Lsig_kind_abbrev + ( of_attr_name attr_name, + Decode.from_payload ~loc:sigi.psig_loc attr_payload ) + | _ -> failwith "Malformed [kind_abbrev] in signature" + + let str_item_of ~loc = function + | Lstr_kind_abbrev (name, jkind) -> + (* See Note [Wrapping with make_entire_jane_syntax] *) + Structure_item.make_entire_jane_syntax ~loc feature (fun () -> + let payload = Encode.as_payload jkind in + Ast_helper.Str.attribute + (Ast_helper.Attr.mk (attr_name_of name) payload)) + + let of_str_item stri = + match stri.pstr_desc with + | Pstr_attribute { attr_name; attr_payload; _ } -> + Lstr_kind_abbrev + ( of_attr_name attr_name, + Decode.from_payload ~loc:stri.pstr_loc attr_payload ) + | _ -> failwith "Malformed [kind_abbrev] in structure" end (******************************************************************************) @@ -1594,19 +2076,28 @@ module type AST = sig end module Core_type = struct - type t = Jtyp_layout of Layouts.core_type + type t = + | Jtyp_layout of Layouts.core_type + | Jtyp_tuple of Labeled_tuples.core_type let of_ast_internal (feat : Feature.t) typ = match feat with | Language_extension Layouts -> let typ, attrs = Layouts.of_type typ in Some (Jtyp_layout typ, attrs) + | Language_extension Labeled_tuples -> + let typ, attrs = Labeled_tuples.of_typ typ in + Some (Jtyp_tuple typ, attrs) | _ -> None let of_ast = Core_type.make_of_ast ~of_ast_internal let core_type_of ~loc ~attrs t = - let core_type = match t with Jtyp_layout x -> Layouts.type_of ~loc x in + let core_type = + match t with + | Jtyp_layout x -> Layouts.type_of ~loc x + | Jtyp_tuple x -> Labeled_tuples.typ_of ~loc x + in (* Performance hack: save an allocation if [attrs] is empty. *) match attrs with | [] -> core_type @@ -1629,6 +2120,8 @@ module Expression = struct | Jexp_immutable_array of Immutable_arrays.expression | Jexp_layout of Layouts.expression | Jexp_n_ary_function of N_ary_functions.expression + | Jexp_tuple of Labeled_tuples.expression + | Jexp_modes of Modes.expression let of_ast_internal (feat : Feature.t) expr = match feat with @@ -1645,6 +2138,12 @@ module Expression = struct match N_ary_functions.of_expr expr with | Some (expr, attrs) -> Some (Jexp_n_ary_function expr, attrs) | None -> None) + | Language_extension Labeled_tuples -> + let expr, attrs = Labeled_tuples.of_expr expr in + Some (Jexp_tuple expr, attrs) + | Language_extension Mode -> + let expr, attrs = Modes.of_expr expr in + Some (Jexp_modes expr, attrs) | _ -> None let of_ast = Expression.make_of_ast ~of_ast_internal @@ -1656,6 +2155,8 @@ module Expression = struct | Jexp_immutable_array x -> Immutable_arrays.expr_of ~loc x | Jexp_layout x -> Layouts.expr_of ~loc x | Jexp_n_ary_function x -> N_ary_functions.expr_of ~loc x + | Jexp_tuple x -> Labeled_tuples.expr_of ~loc x + | Jexp_modes x -> Modes.expr_of ~loc x in (* Performance hack: save an allocation if [attrs] is empty. *) match attrs with @@ -1669,6 +2170,7 @@ module Pattern = struct type t = | Jpat_immutable_array of Immutable_arrays.pattern | Jpat_layout of Layouts.pattern + | Jpat_tuple of Labeled_tuples.pattern let of_ast_internal (feat : Feature.t) pat = match feat with @@ -1678,6 +2180,9 @@ module Pattern = struct | Language_extension Layouts -> let pat, attrs = Layouts.of_pat pat in Some (Jpat_layout pat, attrs) + | Language_extension Labeled_tuples -> + let expr, attrs = Labeled_tuples.of_pat pat in + Some (Jpat_tuple expr, attrs) | _ -> None let of_ast = Pattern.make_of_ast ~of_ast_internal @@ -1687,6 +2192,7 @@ module Pattern = struct match t with | Jpat_immutable_array x -> Immutable_arrays.pat_of ~loc x | Jpat_layout x -> Layouts.pat_of ~loc x + | Jpat_tuple x -> Labeled_tuples.pat_of ~loc x in (* Performance hack: save an allocation if [attrs] is empty. *) match attrs with @@ -1719,24 +2225,32 @@ module Module_type = struct end module Signature_item = struct - type t = Jsig_include_functor of Include_functor.signature_item + type t = + | Jsig_include_functor of Include_functor.signature_item + | Jsig_layout of Layouts.signature_item let of_ast_internal (feat : Feature.t) sigi = match feat with | Language_extension Include_functor -> Some (Jsig_include_functor (Include_functor.of_sig_item sigi)) + | Language_extension Layouts -> + Some (Jsig_layout (Layouts.of_sig_item sigi)) | _ -> None let of_ast = Signature_item.make_of_ast ~of_ast_internal end module Structure_item = struct - type t = Jstr_include_functor of Include_functor.structure_item + type t = + | Jstr_include_functor of Include_functor.structure_item + | Jstr_layout of Layouts.structure_item let of_ast_internal (feat : Feature.t) stri = match feat with | Language_extension Include_functor -> Some (Jstr_include_functor (Include_functor.of_str_item stri)) + | Language_extension Layouts -> + Some (Jstr_layout (Layouts.of_str_item stri)) | _ -> None let of_ast = Structure_item.make_of_ast ~of_ast_internal diff --git a/parsing/jane_syntax.mli b/parsing/jane_syntax.mli index 90d78106e04..b229d640d39 100644 --- a/parsing/jane_syntax.mli +++ b/parsing/jane_syntax.mli @@ -100,6 +100,124 @@ module Immutable_arrays : sig val pat_of : loc:Location.t -> pattern -> Parsetree.pattern end +(** The attribute placed on the inner [Ptyp_arrow] node in [x -> (y -> z)] + (meaning the [y -> z] node) to indicate parenthesization. This is relevant + for locals, as [local_ x -> (y -> z)] is different than + [local_ x -> y -> z]. +*) +module Arrow_curry : sig + val curry_attr_name : string + + val curry_attr : Location.t -> Parsetree.attribute +end + +module Mode_expr : sig + (** [Mode_expr] appears in several places: + - let local_ x = ... + - local_ exp + - local string -> string + + Note that in the first two cases, axes other than locality are not specified; + in the second case, other axes are defaulted to legacy. + + In the future the two annotations will be quite different, but for now they + are just lists of modes. [Typemode] has the two different + interpretations of the annotation. + + (TODO: in the future we will have mutable(...), which is similar to the second + occurrence above and should be covered by this module) + *) + + module Const : sig + (** Constant modes *) + + type raw = string + + (** Represent a user-written mode constant, containing a string and its + location *) + type t = private raw Location.loc + + (** Constructs a mode constant mode *) + val mk : string -> Location.t -> t + end + + type t = Const.t list Location.loc + + (** The empty mode expression. *) + val empty : t + + (** The mode expression containing a single mode constant. *) + val singleton : Const.t -> t + + (** Merging two mode expressions. This will be hard to define as mode + expressions gets complex. Currently it's for merging legacy and new syntax + *) + val concat : t -> t -> t + + (** Extract the mode attribute (if any) from a list of attributes; also + returns the rest of the attributes; Raises if multiple relevant attributes + are found *) + val extract_attr : + Parsetree.attributes -> Parsetree.attribute option * Parsetree.attributes + + (** Encode a mode expression into a [attribute]. If the expression is safe to + empty (and thus safe to ignore), returns [None]. *) + val attr_of : t -> Parsetree.attribute option + + (** Given a list of attributes, extracts the mode expression and returns the + rest of attributes. Raises if multiple relevant attributes are found. + Raises if attributes encodes empty mode expression *) + val maybe_of_attrs : Parsetree.attributes -> t option * Parsetree.attributes + + (* Similar to [maybe_of_attrs], but default to [empty] if no relevant + attribute is found. *) + val of_attrs : Parsetree.attributes -> t * Parsetree.attributes + + (** In some cases, a single mode expression appears twice in the parsetree; + one of them needs to be made ghost to make our internal tools happy. *) + val ghostify : t -> t +end + +(** A subset of the mode-related syntax extensions that is embedded + using full-blown Jane Syntax. By "full-blown" Jane Syntax, we + mean the [Expression], [Pattern], (etc.) modules below that + attempt to create a variant of all possible Jane Street syntax + for the syntactic form. + + We avoid full-blown Jane Syntax when it isn't very lightweight to fit the + new construct into the (somewhat opinionated) framework. Mode coercions are + lightweight to fit into full-blown Jane Syntax. +*) +module Modes : sig + type expression = Coerce of Mode_expr.t * Parsetree.expression + + val expr_of : loc:Location.t -> expression -> Parsetree.expression +end + +module Jkind : sig + module Const : sig + (** Constant jkind *) + + type raw = string + + (** Represent a user-written kind primitive/abbreviation, + containing a string and its location *) + type t = private raw Location.loc + + (** Constructs a jkind constant *) + val mk : string -> Location.t -> t + end + + type t = + | Default + | Abbreviation of Const.t + | Mod of t * Mode_expr.t + | With of t * Parsetree.core_type + | Kind_of of Parsetree.core_type + + type annotation = t Location.loc +end + module N_ary_functions : sig (** These types use the [P] prefix to match how they are represented in the upstream compiler *) @@ -134,8 +252,7 @@ module N_ary_functions : sig Note: If [E0] is provided, only {{!Asttypes.arg_label.Optional}[Optional]} is allowed. *) - | Pparam_newtype of - string Asttypes.loc * Jane_asttypes.jkind_annotation option + | Pparam_newtype of string Asttypes.loc * Jkind.annotation option (** [Pparam_newtype (x, jkind)] represents the parameter [(type x)]. [x] carries the location of the identifier, whereas [pparam_loc] is the location of the [(type x)] as a whole. @@ -169,13 +286,8 @@ module N_ary_functions : sig has a type constraint on the body, e.g. [let local_ f x : int -> int = ...]. *) - type mode_annotation = - | Local - | Unique - | Once - type function_constraint = - { mode_annotations : mode_annotation Location.loc list; + { mode_annotations : Mode_expr.t; type_constraint : type_constraint } @@ -199,6 +311,59 @@ module N_ary_functions : sig val expr_of : loc:Location.t -> expression -> Parsetree.expression end +(** The ASTs for labeled tuples. When we merge this upstream, we'll replace + existing [P{typ,exp,pat}_tuple] constructors with these. *) +module Labeled_tuples : sig + (** [tl] represents a product type: + - [T1 * ... * Tn] when [tl] is [(None,T1);...;(None,Tn)] + - [L1:T1 * ... * Ln:Tn] when [tl] is [(Some L1,T1);...;(Some Ln,Tn)] + - A mix, e.g. [L1:T1,T2] when [tl] is [(Some L1,T1);(None,T2)] + + Invariant: [n >= 2]. + *) + type core_type = (string option * Parsetree.core_type) list + + (** [el] represents + - [(E1, ..., En)] + when [el] is [(None, E1);...;(None, En)] + - [(~L1:E1, ..., ~Ln:En)] + when [el] is [(Some L1, E1);...;(Some Ln, En)] + - A mix, e.g.: + [(~L1:E1, E2)] when [el] is [(Some L1, E1); (None, E2)] + + Invariant: [n >= 2]. + *) + type expression = (string option * Parsetree.expression) list + + (** [(pl, Closed)] represents + - [(P1, ..., Pn)] when [pl] is [(None, P1);...;(None, Pn)] + - [(L1:P1, ..., Ln:Pn)] when [pl] is + [(Some L1, P1);...;(Some Ln, Pn)] + - A mix, e.g. [(L1:P1, P2)] when [pl] is [(Some L1, P1);(None, P2)] + - If pattern is open, then it also ends in a [..] + + Invariant: + - If Closed, [n >= 2]. + - If Open, [n >= 1]. + *) + type pattern = (string option * Parsetree.pattern) list * Asttypes.closed_flag + + (** Embeds the core type in Jane Syntax only if there are any labels. + Otherwise, returns a normal [Ptyp_tuple]. + *) + val typ_of : loc:Location.t -> core_type -> Parsetree.core_type + + (** Embeds the expression in Jane Syntax only if there are any labels. + Otherwise, returns a normal [Pexp_tuple]. + *) + val expr_of : loc:Location.t -> expression -> Parsetree.expression + + (** Embeds the pattern in Jane Syntax only if there are any labels or + if the pattern is open. Otherwise, returns a normal [Ppat_tuple]. + *) + val pat_of : loc:Location.t -> pattern -> Parsetree.pattern +end + (** The ASTs for [include functor]. When we merge this upstream, we'll merge these into the existing [P{sig,str}_include] constructors (similar to what we did with [T{sig,str}_include], but without depending on typechecking). *) @@ -235,9 +400,7 @@ module Layouts : sig (* [fun (type a : immediate) -> ...] *) (* This is represented as an attribute wrapping a [Pexp_newtype] node. *) | Lexp_newtype of - string Location.loc - * Jane_asttypes.jkind_annotation - * Parsetree.expression + string Location.loc * Jkind.annotation * Parsetree.expression type nonrec pattern = (* examples: [ #2.0 ] or [ #42L ] *) @@ -250,7 +413,7 @@ module Layouts : sig a [Ptyp_var] node. *) | Ltyp_var of { name : string option; - jkind : Jane_asttypes.jkind_annotation + jkind : Jkind.annotation } (* [('a : immediate) 'b 'c ('d : value). 'a -> 'b -> 'c -> 'd] *) (* This is represented by an attribute wrapping a [Ptyp_poly] node. *) @@ -260,8 +423,7 @@ module Layouts : sig parsed representation and guarantees that we don't accidentally try to require the layouts extension. *) | Ltyp_poly of - { bound_vars : - (string Location.loc * Jane_asttypes.jkind_annotation option) list; + { bound_vars : (string Location.loc * Jkind.annotation option) list; inner_type : Parsetree.core_type } (* [ty as ('a : immediate)] *) @@ -271,7 +433,7 @@ module Layouts : sig | Ltyp_alias of { aliased_type : Parsetree.core_type; name : string option; - jkind : Jane_asttypes.jkind_annotation + jkind : Jkind.annotation } type nonrec extension_constructor = @@ -280,16 +442,15 @@ module Layouts : sig (* Like [Ltyp_poly], this is used only when there is at least one jkind annotation. Otherwise, we will have a [Pext_decl]. *) | Lext_decl of - (string Location.loc * Jane_asttypes.jkind_annotation option) list + (string Location.loc * Jkind.annotation option) list * Parsetree.constructor_arguments * Parsetree.core_type option - module Pprint : sig - val const_jkind : Format.formatter -> Jane_asttypes.const_jkind -> unit + type signature_item = + | Lsig_kind_abbrev of string Location.loc * Jkind.annotation - val jkind_annotation : - Format.formatter -> Jane_asttypes.jkind_annotation -> unit - end + type structure_item = + | Lstr_kind_abbrev of string Location.loc * Jkind.annotation val expr_of : loc:Location.t -> expression -> Parsetree.expression @@ -306,13 +467,12 @@ module Layouts : sig Parsetree.extension_constructor (** See also [Ast_helper.Type.constructor], which is a direct inspiration for - the interface here. It's meant to be able to be a drop-in replacement. *) + the interface here. *) val constructor_declaration_of : loc:Location.t -> attrs:Parsetree.attributes -> info:Docstrings.info -> - vars_jkinds: - (string Location.loc * Jane_asttypes.jkind_annotation option) list -> + vars_jkinds:(string Location.loc * Jkind.annotation option) list -> args:Parsetree.constructor_arguments -> res:Parsetree.core_type option -> string Location.loc -> @@ -324,9 +484,39 @@ module Layouts : sig the remaining pieces of the original [constructor_declaration]. *) val of_constructor_declaration : Parsetree.constructor_declaration -> - ((string Location.loc * Jane_asttypes.jkind_annotation option) list + ((string Location.loc * Jkind.annotation option) list * Parsetree.attributes) option + + (** See also [Ast_helper.Type.mk], which is a direct inspiration for + the interface here. *) + val type_declaration_of : + loc:Location.t -> + attrs:Parsetree.attributes -> + docs:Docstrings.docs -> + text:Docstrings.text option -> + params: + (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list -> + cstrs:(Parsetree.core_type * Parsetree.core_type * Location.t) list -> + kind:Parsetree.type_kind -> + priv:Asttypes.private_flag -> + manifest:Parsetree.core_type option -> + jkind:Jkind.annotation option -> + string Location.loc -> + Parsetree.type_declaration + + val sig_item_of : loc:Location.t -> signature_item -> Parsetree.signature_item + + val str_item_of : loc:Location.t -> structure_item -> Parsetree.structure_item + + (** Extract the jkind annotation from a [type_declaration]; returns + leftover attributes. Similar to [of_constructor_declaration] in the + sense that users of this function will have to process the remaining + pieces of the original [type_declaration]. + *) + val of_type_declaration : + Parsetree.type_declaration -> + (Jkind.annotation * Parsetree.attributes) option end (******************************************) @@ -407,7 +597,9 @@ end (** Novel syntax in types *) module Core_type : sig - type t = Jtyp_layout of Layouts.core_type + type t = + | Jtyp_layout of Layouts.core_type + | Jtyp_tuple of Labeled_tuples.core_type include AST @@ -436,6 +628,8 @@ module Expression : sig | Jexp_immutable_array of Immutable_arrays.expression | Jexp_layout of Layouts.expression | Jexp_n_ary_function of N_ary_functions.expression + | Jexp_tuple of Labeled_tuples.expression + | Jexp_modes of Modes.expression include AST @@ -451,6 +645,7 @@ module Pattern : sig type t = | Jpat_immutable_array of Immutable_arrays.pattern | Jpat_layout of Layouts.pattern + | Jpat_tuple of Labeled_tuples.pattern include AST @@ -476,14 +671,18 @@ end (** Novel syntax in signature items *) module Signature_item : sig - type t = Jsig_include_functor of Include_functor.signature_item + type t = + | Jsig_include_functor of Include_functor.signature_item + | Jsig_layout of Layouts.signature_item include AST with type t := t and type ast := Parsetree.signature_item end (** Novel syntax in structure items *) module Structure_item : sig - type t = Jstr_include_functor of Include_functor.structure_item + type t = + | Jstr_include_functor of Include_functor.structure_item + | Jstr_layout of Layouts.structure_item include AST with type t := t and type ast := Parsetree.structure_item end diff --git a/parsing/jane_syntax_parsing.ml b/parsing/jane_syntax_parsing.ml index a2af5cc0e9e..cadbbe26c6e 100644 --- a/parsing/jane_syntax_parsing.ml +++ b/parsing/jane_syntax_parsing.ml @@ -243,9 +243,7 @@ module Embedded_name : sig val components : t -> components - (** Convert one of these Jane syntax names to the embedded string form used in - the OCaml AST as the name of an extension node or an attribute; not - exposed. *) + (** See the mli. *) val to_string : t -> string (** Parse a Jane syntax name from the OCaml AST, either as the name of an @@ -755,6 +753,21 @@ module Constructor_declaration0 = Make_with_attribute (struct let with_attributes pcd pcd_attributes = { pcd with pcd_attributes } end) +(** Type declarations; embedded with attributes. *) +module Type_declaration0 = Make_with_attribute (struct + type ast = Parsetree.type_declaration + + let plural = "type declarations" + + let location ptype = ptype.ptype_loc + + let with_location ptype loc = { ptype with ptype_loc = loc } + + let attributes ptype = ptype.ptype_attributes + + let with_attributes ptype ptype_attributes = { ptype with ptype_attributes } +end) + (******************************************************************************) (* Main exports *) @@ -771,6 +784,14 @@ module type AST = sig of_ast_internal:(Feature.t -> ast -> 'a option) -> ast -> 'a option end +(* Most of our features make full use of the Jane Syntax framework, which + encodes information in a specific way (e.g., payload left empty on purpose). + It is therefore nice to check that these conditions are met. This functions + returns [true] if the given feature needs these extra checks. *) +let needs_extra_checks = function + | Feature.Language_extension Mode -> false + | _ -> true + (* See Note [Hiding internal details] *) module Make_ast (AST : AST_internal) : AST with type ast = AST.ast = struct include AST @@ -800,18 +821,22 @@ module Make_ast (AST : AST_internal) : AST with type ast = AST.ast = struct syntax_loc, payload, ast ) -> ( - (match payload with - | PStr [] -> () - | _ -> - raise_error syntax_loc - (Introduction_has_payload - (AST.embedding_syntax, embedded_name, payload))); match Feature.of_component name with | Ok feat -> ( + (if needs_extra_checks feat + then + match payload with + | PStr [] -> () + | _ -> + raise_error syntax_loc + (Introduction_has_payload + (AST.embedding_syntax, embedded_name, payload))); match of_ast_internal feat ast with | Some ext_ast -> Some ext_ast | None -> - raise_error loc (Wrong_syntactic_category (feat, AST.plural))) + if needs_extra_checks feat + then raise_error loc (Wrong_syntactic_category (feat, AST.plural)) + else None) | Error err -> raise_error loc (match err with @@ -841,3 +866,4 @@ module Core_type = Make_ast (Core_type0) module Constructor_argument = Make_ast (Constructor_argument0) module Extension_constructor = Make_ast (Extension_constructor0) module Constructor_declaration = Make_ast (Constructor_declaration0) +module Type_declaration = Make_ast (Type_declaration0) diff --git a/parsing/jane_syntax_parsing.mli b/parsing/jane_syntax_parsing.mli index b67ba98864c..e2869df666f 100644 --- a/parsing/jane_syntax_parsing.mli +++ b/parsing/jane_syntax_parsing.mli @@ -103,6 +103,10 @@ module Feature : sig val extension_component : t -> string end +module Misnamed_embedding_error : sig + type t +end + (** An AST-style representation of the names used when generating extension nodes or attributes for modular syntax. We use this to abstract over the details of how they're encoded, so we have some flexibility in changing them @@ -131,6 +135,14 @@ module Embedded_name : sig val components : t -> components + (** Convert one of these Jane syntax names to the embedded string form used in + the OCaml AST as the name of an extension node or an attribute; exposed + for extensions that only uses [Embedded_name] instead of the whole + infrastructure in this module, such as the dummy argument extension *) + val to_string : t -> string + + val of_string : string -> (t, Misnamed_embedding_error.t) result option + (** Print out the embedded form of a Jane-syntax name, in quotes; for use in error messages. *) val pp_quoted_name : Format.formatter -> t -> unit @@ -206,6 +218,8 @@ module Extension_constructor : module Constructor_declaration : AST with type ast = Parsetree.constructor_declaration +module Type_declaration : AST with type ast = Parsetree.type_declaration + (** Require that an extension is enabled for at least the provided level, or else throw an exception (of an abstract type) at the provided location saying otherwise. This is intended to be used in [jane_syntax.ml] when a diff --git a/parsing/lexer.mll b/parsing/lexer.mll index 07070f0da19..fd5865724ac 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -63,11 +63,14 @@ let keyword_table = "include", INCLUDE; "inherit", INHERIT; "initializer", INITIALIZER; + "kind_abbrev_", KIND_ABBREV; + "kind_of_", KIND_OF; "lazy", LAZY; "let", LET; "local_", LOCAL; "match", MATCH; "method", METHOD; + "mod", MOD; "module", MODULE; "mutable", MUTABLE; "new", NEW; @@ -96,7 +99,6 @@ let keyword_table = "lor", INFIXOP3("lor"); (* Should be INFIXOP2 *) "lxor", INFIXOP3("lxor"); (* Should be INFIXOP2 *) - "mod", INFIXOP3("mod"); "land", INFIXOP3("land"); "lsl", INFIXOP4("lsl"); "lsr", INFIXOP4("lsr"); @@ -752,6 +754,8 @@ rule token = parse { PREFIXOP op } | ['=' '<' '>' '|' '&' '$'] symbolchar * as op { INFIXOP0 op } + | "@" { AT } + | "@@" { ATAT } | ['@' '^'] symbolchar * as op { INFIXOP1 op } | ['+' '-'] symbolchar * as op diff --git a/parsing/location.ml b/parsing/location.ml index 3a6f1f39741..12e185deb83 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -261,7 +261,7 @@ let print_filename ppf file = Some of the information (filename, line number or characters numbers) in the location might be invalid; in which case we do not print it. *) -let print_loc ppf loc = +let print_loc ~capitalize_first ppf loc = setup_colors (); let file_valid = function | "_none_" -> @@ -287,7 +287,8 @@ let print_loc ppf loc = let first = ref true in let capitalize s = - if !first then (first := false; String.capitalize_ascii s) + if !first then (first := false; + if capitalize_first then String.capitalize_ascii s else s) else s in let comma () = if !first then () else Format.fprintf ppf ", " in @@ -316,6 +317,9 @@ let print_loc ppf loc = Format.fprintf ppf "@}" +let print_loc_in_lowercase = print_loc ~capitalize_first:false +let print_loc = print_loc ~capitalize_first:true + (* Print a comma-separated list of locations *) let print_locs ppf locs = Format.pp_print_list ~pp_sep:(fun ppf () -> Format.fprintf ppf ",@ ") diff --git a/parsing/location.mli b/parsing/location.mli index 3b4ff49bf08..fa423484688 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -202,6 +202,7 @@ val show_filename: string -> string val print_filename: formatter -> string -> unit val print_loc: formatter -> t -> unit +val print_loc_in_lowercase: formatter -> t -> unit val print_locs: formatter -> t list -> unit diff --git a/parsing/parse.ml b/parsing/parse.ml index 2ba6a6f5b64..96dee02678e 100644 --- a/parsing/parse.ml +++ b/parsing/parse.ml @@ -104,3 +104,56 @@ let constr_ident= wrap Parser.parse_constr_longident let extended_module_path = wrap Parser.parse_mod_ext_longident let simple_module_path = wrap Parser.parse_mod_longident let type_ident = wrap Parser.parse_mty_longident + +(* Error reporting for Syntaxerr *) +(* The code has been moved here so that one can reuse Pprintast.tyvar *) + +let prepare_error err = + let open Syntaxerr in + match err with + | Unclosed(opening_loc, opening, closing_loc, closing) -> + Location.errorf + ~loc:closing_loc + ~sub:[ + Location.msg ~loc:opening_loc + "This '%s' might be unmatched" opening + ] + "Syntax error: '%s' expected" closing + + | Expecting (loc, nonterm) -> + Location.errorf ~loc "Syntax error: %s expected." nonterm + | Not_expecting (loc, nonterm) -> + Location.errorf ~loc "Syntax error: %s not expected." nonterm + | Applicative_path loc -> + Location.errorf ~loc + "Syntax error: applicative paths of the form F(X).t \ + are not supported when the option -no-app-func is set." + | Variable_in_scope (loc, var) -> + Location.errorf ~loc + "In this scoped type, variable %a \ + is reserved for the local type %s." + Pprintast.tyvar var var + | Other loc -> + Location.errorf ~loc "Syntax error" + | Ill_formed_ast (loc, s) -> + Location.errorf ~loc + "broken invariant in parsetree: %s" s + | Invalid_package_type (loc, s) -> + Location.errorf ~loc "invalid package type: %s" s + | Removed_string_set loc -> + Location.errorf ~loc + "Syntax error: strings are immutable, there is no assignment \ + syntax for them.\n\ + @{Hint@}: Mutable sequences of bytes are available in \ + the Bytes module.\n\ + @{Hint@}: Did you mean to use 'Bytes.set'?" + | Missing_unboxed_literal_suffix loc -> + Location.errorf ~loc + "Syntax error: Unboxed integer literals require width suffixes." + +let () = + Location.register_error_of_exn + (function + | Syntaxerr.Error err -> Some (prepare_error err) + | _ -> None + ) diff --git a/parsing/parser.mly b/parsing/parser.mly index 06ed83d4ab9..4e25247c7cb 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -25,13 +25,13 @@ %{ open Asttypes -open Jane_asttypes open Longident open Parsetree open Ast_helper open Docstrings open Docstrings.WithMenhir module N_ary = Jane_syntax.N_ary_functions +module Mode = Jane_syntax.Mode_expr let mkloc = Location.mkloc let mknoloc = Location.mknoloc @@ -121,6 +121,9 @@ let ghloc ~loc d = { txt = d; loc = ghost_loc loc } let ghstr ~loc d = Str.mk ~loc:(ghost_loc loc) d let ghsig ~loc d = Sig.mk ~loc:(ghost_loc loc) d +let ghexpvar ~loc name = + ghexp ~loc (Pexp_ident (ghrhs (Lident name) loc)) + let mkinfix arg1 op arg2 = Pexp_apply(op, [Nolabel, arg1; Nolabel, arg2]) @@ -150,117 +153,49 @@ let mk_attr ~loc name payload = Builtin_attributes.(register_attr Parser name); Attr.mk ~loc name payload -let local_ext_loc loc = mkloc "extension.local" loc -let unique_ext_loc loc = mkloc "extension.unique" loc -let once_ext_loc loc = mkloc "extension.once" loc +let mkexp_with_modes ?(ghost=false) ~loc modes exp = + let loc = + if ghost then ghost_loc loc else make_loc loc + in + Jane_syntax.Modes.expr_of ~loc (Coerce (modes, exp)) -let local_attr loc = - mk_attr ~loc (local_ext_loc loc) (PStr []) - -let unique_attr loc = - mk_attr ~loc (unique_ext_loc loc) (PStr []) - -let once_attr loc = - mk_attr ~loc (once_ext_loc loc) (PStr []) - -let local_extension loc = - Exp.mk (Pexp_extension(local_ext_loc loc, PStr [])) - -let unique_extension loc = - Exp.mk (Pexp_extension(unique_ext_loc loc, PStr [])) - -let once_extension loc = - Exp.mk (Pexp_extension(once_ext_loc loc, PStr [])) - -let mkexp_stack ~loc ~kwd_loc exp = - Exp.mk ~loc (Pexp_apply(local_extension kwd_loc, [Nolabel, exp])) - -let mkexp_unique ~loc ~kwd_loc exp = - Exp.mk ~loc (Pexp_apply(unique_extension kwd_loc, [Nolabel, exp])) - -let mkexp_once ~loc ~kwd_loc exp = - Exp.mk ~loc (Pexp_apply(once_extension kwd_loc, [Nolabel, exp])) - -let mkpat_stack pat loc = - {pat with - ppat_attributes = local_attr (make_loc loc) :: pat.ppat_attributes} - -let mkpat_unique pat loc = - {pat with - ppat_attributes = unique_attr (make_loc loc) :: pat.ppat_attributes} - -let mkpat_once pat loc = - {pat with - ppat_attributes = once_attr (make_loc loc) :: pat.ppat_attributes} - -let mktyp_stack typ loc = - {typ with - ptyp_attributes = local_attr (make_loc loc) :: typ.ptyp_attributes} - -let mktyp_unique typ loc = - {typ with - ptyp_attributes = unique_attr (make_loc loc) :: typ.ptyp_attributes} - -let mktyp_once typ loc = - {typ with - ptyp_attributes = once_attr (make_loc loc) :: typ.ptyp_attributes} - -type mode_annotation = N_ary.mode_annotation = - | Local - | Unique - | Once - -(** [loc] is the location to be used for the whole expression including the - extension node. The extension node will always have the location [kwd_loc]. *) -let exp_with_mode ~loc ~kwd_loc flag exp = - match flag with - | Local -> mkexp_stack exp ~loc ~kwd_loc - | Unique -> mkexp_unique exp ~loc ~kwd_loc - | Once -> mkexp_once exp ~loc ~kwd_loc - -let exp_with_modes loc modes exp = - List.fold_left - (fun exp mode -> exp_with_mode mode.txt exp ~loc ~kwd_loc:mode.loc) - exp modes - -let mkexp_with_mode loc (flag, kwd_loc) exp = - let loc = make_loc loc in - exp_with_mode ~loc ~kwd_loc:(make_loc kwd_loc) flag exp - -(** [loc] is a location covering all the modes and the expression, and will be - used as for all the nested expressions. It is imprecise and taken as ghost. *) -let ghexp_with_modes loc modes exp = - let loc = ghost_loc loc in - let modes = List.map (fun (mode, loc) -> mkloc mode (make_loc loc)) modes in - exp_with_modes loc modes exp - -let mkpat_with_mode = function - | Local -> mkpat_stack - | Unique -> mkpat_unique - | Once -> mkpat_once - -let mkpat_with_modes flags pat = - List.fold_left (fun pat (flag, loc) -> mkpat_with_mode flag pat loc) pat flags - -let mktyp_with_mode = function - | Local -> mktyp_stack - | Unique -> mktyp_unique - | Once -> mktyp_once - -let mktyp_with_modes flags typ = - List.fold_left (fun typ (flag, loc) -> mktyp_with_mode flag typ loc) typ flags - -let let_binding_mode_attrs mode_annots = - List.map - (fun (annot, loc) -> - let mk_attr = - match annot with - | Local -> local_attr - | Unique -> unique_attr - | Once -> once_attr - in - mk_attr (make_loc loc)) - mode_annots +(* For modes-related attributes, no need to call [register_attr] because they +result from native syntax which is only parsed at proper places that are +guaranteed to be used. *) + +let mkpat_with_modes modes pat = + (* Mark ghost to pass ppxlib well-nestedness check. *) + let modes = Mode.ghostify modes in + match Mode.attr_of modes with + | None -> pat + | Some attr -> + let ppat_desc = + match pat.ppat_desc with + | Ppat_constraint(pat, typ) -> + (* Example: let foo (local_ f : string -> string -> string) + We want to the user written type better interpreted under the + context of the mode. *) + let ptyp_attributes = attr :: typ.ptyp_attributes in + Ppat_constraint(pat, {typ with ptyp_attributes}) + | ppat_desc -> ppat_desc + in + {pat with + ppat_desc; + ppat_attributes = attr :: pat.ppat_attributes} + +let mktyp_with_modes modes typ = + (* Mark ghost to pass ppxlib well-nestedness check. *) + let modes = Mode.ghostify modes in + match Mode.attr_of modes with + | None -> typ + | Some attr -> + {typ with + ptyp_attributes = attr :: typ.ptyp_attributes} + +let let_binding_mode_attrs modes = + match Mode.attr_of modes with + | None -> [] + | Some attr -> [attr] let exclave_ext_loc loc = mkloc "extension.exclave" loc @@ -271,14 +206,12 @@ let exclave_extension loc = let mkexp_exclave ~loc ~kwd_loc exp = ghexp ~loc (Pexp_apply(exclave_extension (make_loc kwd_loc), [Nolabel, exp])) -let curry_attr loc = - mk_attr ~loc:Location.none (mkloc "extension.curry" loc) (PStr []) - let is_curry_attr attr = - attr.attr_name.txt = "extension.curry" + attr.attr_name.txt = Jane_syntax.Arrow_curry.curry_attr_name let mktyp_curry typ loc = - {typ with ptyp_attributes = curry_attr loc :: typ.ptyp_attributes} + {typ with ptyp_attributes = + Jane_syntax.Arrow_curry.curry_attr loc :: typ.ptyp_attributes} let maybe_curry_typ typ loc = match typ.ptyp_desc with @@ -287,27 +220,6 @@ let maybe_curry_typ typ loc = else mktyp_curry typ (make_loc loc) | _ -> typ -let global_loc loc = mkloc "extension.global" loc - -let global_attr loc = - mk_attr ~loc:loc (global_loc loc) (PStr []) - -let mkld_global ld loc = - { ld with pld_attributes = global_attr loc :: ld.pld_attributes } - -let mkld_global_maybe gbl ld loc = - match gbl with - | Global -> mkld_global ld loc - | Nothing -> ld - -let mkcty_global cty loc = - { cty with ptyp_attributes = global_attr loc :: cty.ptyp_attributes } - -let mkcty_global_maybe gbl cty loc = - match gbl with - | Global -> mkcty_global cty loc - | Nothing -> cty - (* TODO define an abstraction boundary between locations-as-pairs and locations-as-Location.t; it should be clear when we move from one world to the other *) @@ -350,17 +262,18 @@ let rec mktailpat nilloc = let open Location in function let mkstrexp e attrs = { pstr_desc = Pstr_eval (e, attrs); pstr_loc = e.pexp_loc } -let mkexp_desc_constraint e t = - match t with +let mkexp_type_constraint ?(ghost=false) ~loc e t = + let desc = + match t with | N_ary.Pconstraint t -> Pexp_constraint(e, t) | N_ary.Pcoerce(t1, t2) -> Pexp_coerce(e, t1, t2) + in + if ghost then ghexp ~loc desc + else mkexp ~loc desc -let mkexp_constraint ~loc e t = - mkexp ~loc (mkexp_desc_constraint e t) - -let mkexp_opt_constraint ~loc e = function +let mkexp_opt_type_constraint ~loc e = function | None -> e - | Some constraint_ -> mkexp_constraint ~loc e constraint_ + | Some c -> mkexp_type_constraint ~loc e c let mkpat_opt_constraint ~loc p = function | None -> p @@ -443,6 +356,21 @@ let expecting (loc : Lexing.position * Lexing.position) nonterm = let removed_string_set loc = raise(Syntaxerr.Error(Syntaxerr.Removed_string_set(make_loc loc))) +let ppat_ltuple loc elts closed = + Jane_syntax.Labeled_tuples.pat_of + ~loc:(make_loc loc) + (elts, closed) + +let ptyp_ltuple loc tl = + Jane_syntax.Labeled_tuples.typ_of + ~loc:(make_loc loc) + tl + +let pexp_ltuple loc args = + Jane_syntax.Labeled_tuples.expr_of + ~loc:(make_loc loc) + args + (* Using the function [not_expecting] in a semantic action means that this syntactic form is recognized by the parser but is in fact incorrect. This idiom is used in a few places to produce ad hoc syntax error messages. *) @@ -621,12 +549,14 @@ let pat_of_label lbl = let mk_newtypes ~loc newtypes exp = let mk_one (name, jkind) exp = match jkind with - | None -> mkexp ~loc (Pexp_newtype (name, exp)) + | None -> ghexp ~loc (Pexp_newtype (name, exp)) | Some jkind -> - Jane_syntax.Layouts.expr_of ~loc:(make_loc loc) + Jane_syntax.Layouts.expr_of ~loc:(ghost_loc loc) (Lexp_newtype (name, jkind, exp)) in - List.fold_right mk_one newtypes exp + let exp = List.fold_right mk_one newtypes exp in + (* outermost expression should have non-ghost location *) + { exp with pexp_loc = make_loc loc } (* The [typloc] argument is used to adjust a location for something we're parsing a bit differently than upstream. See comment about [Pvc_constraint] @@ -839,9 +769,10 @@ let mkghost_newtype_function_body newtypes body_constraint body ~loc = match body_constraint with | None -> body | Some { N_ary.type_constraint; mode_annotations } -> - let loc = { body.pexp_loc with loc_ghost = true } in - let body = Exp.mk (mkexp_desc_constraint body type_constraint) ~loc in - exp_with_modes loc mode_annotations body + let {Location.loc_start; loc_end} = body.pexp_loc in + let loc = loc_start, loc_end in + let body = mkexp_type_constraint ~ghost:true ~loc body type_constraint in + mkexp_with_modes ~ghost:true ~loc mode_annotations body in mk_newtypes ~loc newtypes wrapped_body @@ -914,16 +845,6 @@ let mk_directive ~loc name arg = pdir_loc = make_loc loc; } -let check_jkind ~loc id : const_jkind = - match id with - | "any" -> Any - | "value" -> Value - | "void" -> Void - | "immediate64" -> Immediate64 - | "immediate" -> Immediate - | "float64" -> Float64 - | _ -> expecting_loc loc "layout" - (* Unboxed literals *) (* CR layouts v2.5: The [unboxed_*] functions will both be improved and lose @@ -939,7 +860,7 @@ module Constant : sig type loc := Lexing.position * Lexing.position val value : Parsetree.constant -> t - val unboxed : loc:loc -> Jane_syntax.Layouts.constant -> t + val unboxed : Jane_syntax.Layouts.constant -> t val to_expression : loc:loc -> t -> expression val to_pattern : loc:loc -> t -> pattern end = struct @@ -949,13 +870,7 @@ end = struct let value x = Value x - let assert_unboxed_literals ~loc = - Language_extension.( - Jane_syntax_parsing.assert_extension_enabled ~loc Layouts Beta) - - let unboxed ~loc x = - assert_unboxed_literals ~loc:(make_loc loc); - Unboxed x + let unboxed x = Unboxed x let to_expression ~loc : t -> expression = function | Value const_value -> @@ -982,25 +897,21 @@ let with_sign sign num = let unboxed_int sloc int_loc sign (n, m) = match m with | Some m -> - Constant.unboxed ~loc:int_loc (Integer (with_sign sign n, m)) + Constant.unboxed (Integer (with_sign sign n, m)) | None -> if Language_extension.is_enabled unboxed_literals_extension then - expecting int_loc "unboxed integer literal with type-specifying suffix" + raise + Syntaxerr.(Error(Missing_unboxed_literal_suffix (make_loc int_loc))) else not_expecting sloc "line number directive" -let unboxed_float sloc sign (f, m) = - Constant.unboxed ~loc:sloc (Float (with_sign sign f, m)) - -(* Unboxed float type *) - -let assert_unboxed_float_type ~loc = - Language_extension.( - Jane_syntax_parsing.assert_extension_enabled ~loc Layouts Beta) +let unboxed_float sign (f, m) = + Constant.unboxed (Float (with_sign sign f, m)) -let unboxed_float_type sloc tys = - assert_unboxed_float_type ~loc:(make_loc sloc); - Ptyp_constr (mkloc (Lident "float#") (make_loc sloc), tys) +(* Invariant: [lident] must end with an [Lident] that ends with a ["#"]. *) +let unboxed_type sloc lident tys = + let loc = make_loc sloc in + Ptyp_constr (mkloc lident loc, tys) %} /* Tokens */ @@ -1061,7 +972,9 @@ let unboxed_float_type sloc tys = %token IN "in" %token INCLUDE "include" %token INFIXOP0 "!=" (* just an example *) -%token INFIXOP1 "@" (* just an example *) +%token AT "@" (* mode expression *) +%token ATAT "@@" (* mode expression *) +%token INFIXOP1 "^" (* just an example *) %token INFIXOP2 "+!" (* chosen with care; see above *) %token INFIXOP3 "land" (* just an example *) %token INFIXOP4 "**" (* just an example *) @@ -1072,6 +985,8 @@ let unboxed_float_type sloc tys = %token INITIALIZER "initializer" %token INT "42" (* just an example *) %token HASH_INT "#42l" (* just an example *) +%token KIND_ABBREV "kind_abbrev_" +%token KIND_OF "kind_of_" %token LABEL "~label:" (* just an example *) %token LAZY "lazy" %token LBRACE "{" @@ -1097,6 +1012,7 @@ let unboxed_float_type sloc tys = %token MINUS "-" %token MINUSDOT "-." %token MINUSGREATER "->" +%token MOD "mod" %token MODULE "module" %token MUTABLE "mutable" %token NEW "new" @@ -1190,7 +1106,7 @@ The precedences must be listed from low to high. %nonassoc AS %left BAR /* pattern (p|p|p) */ %nonassoc below_COMMA -%left COMMA /* expr/expr_comma_list (e,e,e) */ +%left COMMA /* expr/labeled_tuple (e,e,e) */ %nonassoc below_FUNCTOR /* include M */ %nonassoc FUNCTOR /* include functor M */ %right MINUSGREATER /* function_type (t -> t -> t) */ @@ -1198,12 +1114,12 @@ The precedences must be listed from low to high. %right AMPERSAND AMPERAMPER /* expr (e && e && e) */ %nonassoc below_EQUAL %left INFIXOP0 EQUAL LESS GREATER /* expr (e OP e OP e) */ -%right INFIXOP1 /* expr (e OP e OP e) */ +%right ATAT AT INFIXOP1 /* expr (e OP e OP e) */ %nonassoc below_LBRACKETAT %nonassoc LBRACKETAT %right COLONCOLON /* expr (e :: e :: e) */ %left INFIXOP2 PLUS PLUSDOT MINUS MINUSDOT PLUSEQ /* expr (e OP e OP e) */ -%left PERCENT INFIXOP3 STAR /* expr (e OP e OP e) */ +%left PERCENT INFIXOP3 MOD STAR /* expr (e OP e OP e) */ %right INFIXOP4 /* expr (e OP e OP e) */ %nonassoc prec_unary_minus prec_unary_plus /* unary - */ %nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */ @@ -1862,6 +1778,13 @@ structure_item: in wrap_str_ext ~loc:$sloc item ext } + | kind_abbreviation_decl + { + let name, jkind = $1 in + Jane_syntax.Layouts.(str_item_of + ~loc:(make_loc $sloc) + (Lstr_kind_abbrev (name, jkind))) + } ; @@ -2134,6 +2057,13 @@ signature_item: in wrap_sig_ext ~loc:$sloc item ext } + | kind_abbreviation_decl + { + let name, jkind = $1 in + Jane_syntax.Layouts.(sig_item_of + ~loc:(make_loc $sloc) + (Lsig_kind_abbrev (name, jkind))) + } (* A module declaration. *) %inline module_declaration: @@ -2417,7 +2347,7 @@ value: { ($4, $3, Cfk_concrete ($1, $6)), $2 } | override_flag attributes mutable_flag mkrhs(label) type_constraint EQUAL seq_expr - { let e = mkexp_constraint ~loc:$sloc $7 $5 in + { let e = mkexp_type_constraint ~loc:$sloc $7 $5 in ($4, $3, Cfk_concrete ($1, e)), $2 } ; @@ -2663,33 +2593,45 @@ seq_expr: | or_function(fun_seq_expr) { $1 } ; labeled_simple_pattern: - QUESTION LPAREN mode_flags label_let_pattern opt_default RPAREN - { (Optional (fst $4), $5, mkpat_with_modes $3 (snd $4) ) } + QUESTION LPAREN modes0=optional_mode_expr_legacy label_let_pattern opt_default RPAREN + { let lbl, pat, modes1 = $4 in + let modes = Mode.concat modes0 modes1 in + (Optional lbl, $5, mkpat_with_modes modes pat) } | QUESTION label_var { (Optional (fst $2), None, snd $2) } - | OPTLABEL LPAREN mode_flags let_pattern opt_default RPAREN - { (Optional $1, $5, mkpat_with_modes $3 $4) } + | OPTLABEL LPAREN modes0=optional_mode_expr_legacy let_pattern opt_default RPAREN + { let pat, modes1 = $4 in + let modes = Mode.concat modes0 modes1 in + (Optional $1, $5, mkpat_with_modes modes pat) } | OPTLABEL pattern_var { (Optional $1, None, $2) } - | TILDE LPAREN mode_flags label_let_pattern RPAREN - { (Labelled (fst $4), None, - mkpat_with_modes $3 (snd $4) ) } + | TILDE LPAREN modes0=optional_mode_expr_legacy label_let_pattern RPAREN + { let lbl, pat, modes1 = $4 in + let modes = Mode.concat modes0 modes1 in + (Labelled lbl, None, + mkpat_with_modes modes pat ) } | TILDE label_var { (Labelled (fst $2), None, snd $2) } | LABEL simple_pattern { (Labelled $1, None, $2) } - | LABEL LPAREN mode_flag+ pattern RPAREN + | LABEL LPAREN mode_expr_legacy pattern RPAREN { (Labelled $1, None, mkpat_with_modes $3 $4 ) } | simple_pattern { (Nolabel, None, $1) } - | LPAREN mode_flag+ let_pattern RPAREN - { (Nolabel, None, mkpat_with_modes $2 $3 ) } + | LPAREN modes0=mode_expr_legacy let_pattern RPAREN + { let pat, modes1 = $3 in + let modes = Mode.concat modes0 modes1 in + (Nolabel, None, mkpat_with_modes modes pat ) } | LABEL LPAREN poly_pattern RPAREN - { (Labelled $1, None, $3) } - | LABEL LPAREN mode_flag+ poly_pattern RPAREN - { (Labelled $1, None, mkpat_with_modes $3 $4) } + { let pat, modes = $3 in + (Labelled $1, None, mkpat_with_modes modes pat) } + | LABEL LPAREN modes0=mode_expr_legacy poly_pattern RPAREN + { let pat, modes1 = $4 in + let modes = Mode.concat modes0 modes1 in + (Labelled $1, None, mkpat_with_modes modes pat) } | LPAREN poly_pattern RPAREN - { (Nolabel, None, $2) } + { let pat, modes = $2 in + (Nolabel, None, mkpat_with_modes modes pat) } ; pattern_var: @@ -2704,31 +2646,38 @@ pattern_var: { $1 } ; label_let_pattern: - x = label_var - { x } - | x = label_var COLON cty = core_type + x = label_var modes = optional_at_mode_expr { let lab, pat = x in lab, - mkpat ~loc:$sloc (Ppat_constraint (pat, cty)) } + pat, + modes } + | x = label_var COLON cty = core_type modes = optional_atat_mode_expr + { let lab, pat = x in + lab, + mkpat ~loc:$sloc (Ppat_constraint (pat, cty)), + modes } | x = label_var COLON cty = mktyp_jane_syntax_ltyp (bound_vars = typevar_list DOT inner_type = core_type { Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } }) + modes = optional_atat_mode_expr { let lab, pat = x in lab, - mkpat ~loc:$sloc (Ppat_constraint (pat, cty)) } + mkpat ~loc:$sloc (Ppat_constraint (pat, cty)), + modes } ; %inline label_var: mkrhs(LIDENT) { ($1.Location.txt, mkpat ~loc:$sloc (Ppat_var $1)) } ; let_pattern: - pattern - { $1 } + pattern modes = optional_at_mode_expr + { ($1, modes) } | mkpat(pattern COLON core_type { Ppat_constraint($1, $3) }) - { $1 } + modes = optional_atat_mode_expr + { ($1, modes) } | poly_pattern { $1 } ; @@ -2741,7 +2690,8 @@ let_pattern: inner_type = core_type { Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } }) { Ppat_constraint(pat, cty) }) - { $1 } + modes = optional_atat_mode_expr + { ($1, modes) } ; %inline indexop_expr(dot, index, right): @@ -2777,13 +2727,13 @@ fun_expr: Option.map (fun x : N_ary.function_constraint -> { type_constraint = Pconstraint x - ; mode_annotations = [] + ; mode_annotations = Mode.empty }) $4 in mkfunction $3 body_constraint $6 ~loc:$sloc ~attrs:$2 } - | mkexp(expr_) + | expr_ { $1 } | let_bindings(ext) IN seq_expr { expr_of_let_bindings ~loc:$sloc $1 $3 } @@ -2809,8 +2759,8 @@ fun_expr: | UNDERSCORE { not_expecting $loc($1) "wildcard \"_\"" } /* END AVOID */ - | mode_flag seq_expr - { mkexp_with_mode $sloc $1 $2 } + | mode_legacy seq_expr + { mkexp_with_modes ~loc:$sloc (Mode.singleton $1) $2 } | EXCLAVE seq_expr { mkexp_exclave ~loc:$sloc ~kwd_loc:($loc($1)) $2 } ; @@ -2860,15 +2810,15 @@ fun_expr: ; %inline expr_: | simple_expr nonempty_llist(labeled_simple_expr) - { Pexp_apply($1, $2) } - | expr_comma_list %prec below_COMMA - { Pexp_tuple($1) } + { mkexp ~loc:$sloc (Pexp_apply($1, $2)) } + | labeled_tuple %prec below_COMMA + { pexp_ltuple $sloc $1 } | mkrhs(constr_longident) simple_expr %prec below_HASH - { Pexp_construct($1, Some $2) } + { mkexp ~loc:$sloc (Pexp_construct($1, Some $2)) } | name_tag simple_expr %prec below_HASH - { Pexp_variant($1, Some $2) } + { mkexp ~loc:$sloc (Pexp_variant($1, Some $2)) } | e1 = fun_expr op = op(infix_operator) e2 = expr - { mkinfix e1 op e2 } + { mkexp ~loc:$sloc (mkinfix e1 op e2) } ; simple_expr: @@ -2876,8 +2826,10 @@ simple_expr: { reloc_exp ~loc:$sloc $2 } | LPAREN seq_expr error { unclosed "(" $loc($1) ")" $loc($3) } - | LPAREN seq_expr type_constraint RPAREN - { mkexp_constraint ~loc:$sloc $2 $3 } + | LPAREN seq_expr type_constraint_with_modes RPAREN + { let (t, m) = $3 in + mkexp_with_modes ~ghost:false ~loc:$sloc m @@ + mkexp_type_constraint ~ghost:true ~loc:$sloc $2 t } | indexop_expr(DOT, seq_expr, { None }) { mk_indexop_expr builtin_indexing_operators ~loc:$sloc $1 } (* Immutable array indexing is a regular operator, so it doesn't need its own @@ -2943,10 +2895,8 @@ comprehension_clause_binding: want that [int] to be [local_]. But we can parse [[e for local_ x in xs]]. We have to have that as a separate rule here because it moves the [local_] over to the RHS of the binding, so we need everything to be visible. *) - | attributes LOCAL pattern IN expr - { let expr = - mkexp_stack $5 ~kwd_loc:(make_loc $loc($2)) ~loc:(ghost_loc $sloc) - in + | attributes mode_legacy pattern IN expr + { let expr = mkexp_with_modes ~loc:$sloc (Mode.singleton $2) $5 in Jane_syntax.Comprehensions. { pattern = $3 ; iterator = In expr @@ -3102,9 +3052,9 @@ labeled_simple_expr: | TILDE label = LIDENT { let loc = $loc(label) in (Labelled label, mkexpvar ~loc label) } - | TILDE LPAREN label = LIDENT ty = type_constraint RPAREN - { (Labelled label, mkexp_constraint ~loc:($startpos($2), $endpos) - (mkexpvar ~loc:$loc(label) label) ty) } + | TILDE LPAREN label = LIDENT c = type_constraint RPAREN + { (Labelled label, mkexp_type_constraint ~loc:($startpos($2), $endpos) + (mkexpvar ~loc:$loc(label) label) c) } | QUESTION label = LIDENT { let loc = $loc(label) in (Optional label, mkexpvar ~loc label) } @@ -3118,32 +3068,46 @@ labeled_simple_expr: %inline let_ident: val_ident { mkpatvar ~loc:$sloc $1 } ; +%inline pvc_modes: + | at_mode_expr {None, $1} + | COLON core_type optional_atat_mode_expr { + Some(Pvc_constraint { locally_abstract_univars=[]; typ=$2 }), $3 + } +; let_binding_body_no_punning: let_ident strict_binding { ($1, $2, None, []) } - | mode_flags let_ident type_constraint EQUAL seq_expr + | modes0 = optional_mode_expr_legacy let_ident constraint_ EQUAL seq_expr + (* CR zqian: modes are duplicated, and one of them needs to be made ghost + to make internal tools happy. We should try to avoid that. *) { let v = $2 in (* PR#7344 *) + let typ, modes1 = $3 in let t = - match $3 with + Option.map (function | N_ary.Pconstraint t -> Pvc_constraint { locally_abstract_univars = []; typ=t } | N_ary.Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + ) typ in - let exp = ghexp_with_modes $sloc $1 $5 in - (v, exp, Some t, let_binding_mode_attrs $1) + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:$sloc modes_ghost $5 in + (v, exp, t, let_binding_mode_attrs modes) } - | mode_flags let_ident COLON poly(core_type) EQUAL seq_expr + | modes0 = optional_mode_expr_legacy let_ident COLON poly(core_type) modes1 = optional_atat_mode_expr EQUAL seq_expr { let bound_vars, inner_type = $4 in let ltyp = Jane_syntax.Layouts.Ltyp_poly { bound_vars; inner_type } in let typ_loc = Location.ghostify (make_loc $loc($4)) in let typ = Jane_syntax.Layouts.type_of ~loc:typ_loc ltyp in - let exp = ghexp_with_modes $sloc $1 $6 in + let modes = Mode.concat modes0 modes1 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:$sloc modes_ghost $7 in ($2, exp, Some (Pvc_constraint { locally_abstract_univars = []; typ }), - let_binding_mode_attrs $1) + let_binding_mode_attrs modes) } - | let_ident COLON TYPE newtypes DOT core_type EQUAL seq_expr + | let_ident COLON TYPE newtypes DOT core_type modes=optional_atat_mode_expr EQUAL seq_expr (* The code upstream looks like: {[ let constraint' = @@ -3161,25 +3125,37 @@ let_binding_body_no_punning: version, even though we are creating a slightly different [core_type]. *) { let exp, poly = - wrap_type_annotation ~loc:$sloc ~typloc:$loc($6) $4 $6 $8 + wrap_type_annotation ~loc:$sloc ~typloc:$loc($6) $4 $6 $9 in let loc = ($startpos($1), $endpos($6)) in - (ghpat ~loc (Ppat_constraint($1, poly)), exp, None, []) + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:$sloc modes_ghost exp in + (ghpat ~loc (Ppat_constraint($1, poly)), exp, None, let_binding_mode_attrs modes) } | pattern_no_exn EQUAL seq_expr { ($1, $3, None, []) } - | simple_pattern_not_ident COLON core_type EQUAL seq_expr - { ($1, $5, Some(Pvc_constraint { locally_abstract_univars=[]; typ=$3 }), []) } - | mode_flag+ let_ident strict_binding_modes - { ($2, ghexp_with_modes $sloc $1 ($3 $1), None, - let_binding_mode_attrs $1) } + | simple_pattern_not_ident pvc_modes EQUAL seq_expr + { + let pvc, modes = $2 in + let modes_ghost = Mode.ghostify modes in + let exp = mkexp_with_modes ~ghost:true ~loc:$sloc modes_ghost $4 in + ($1, exp, pvc, let_binding_mode_attrs modes) + } + | modes=mode_expr_legacy let_ident strict_binding_modes + { let modes_ghost = Mode.ghostify modes in + ($2, mkexp_with_modes ~ghost:true ~loc:$sloc modes_ghost ($3 modes_ghost), None, + let_binding_mode_attrs modes) } + | LPAREN let_ident modes=at_mode_expr RPAREN strict_binding_modes + { let modes_ghost = Mode.ghostify modes in + ($2, mkexp_with_modes ~ghost:true ~loc:$sloc modes_ghost ($5 modes_ghost), None, + let_binding_mode_attrs modes) } ; let_binding_body: | let_binding_body_no_punning { let p,e,c,attrs = $1 in (p,e,c,false), attrs } /* BEGIN AVOID */ | val_ident %prec below_HASH - { (mkpatvar ~loc:$loc $1, mkexpvar ~loc:$loc $1, None, true), [] } + { (mkpatvar ~loc:$loc $1, ghexpvar ~loc:$loc $1, None, true), [] } (* The production that allows puns is marked so that [make list-parse-errors] does not attempt to exploit it. That would be problematic because it would then generate bindings such as [let x], which are rejected by the @@ -3221,7 +3197,8 @@ letop_binding_body: { (pat, exp) } | val_ident (* Let-punning *) - { (mkpatvar ~loc:$loc $1, mkexpvar ~loc:$loc $1) } + { (mkpatvar ~loc:$loc $1, ghexpvar ~loc:$loc $1) } + (* CR zqian: support mode annotation on letop. *) | pat = simple_pattern COLON typ = core_type EQUAL exp = seq_expr { let loc = ($startpos(pat), $endpos(typ)) in (ghpat ~loc (Ppat_constraint(pat, typ)), exp) } @@ -3243,12 +3220,9 @@ strict_binding_modes: EQUAL seq_expr { fun _ -> $2 } | fun_params type_constraint? EQUAL fun_body + (* CR zqian: The above [type_constraint] should be replaced by [constraint_] + to support mode annotation *) { fun mode_annotations -> - let mode_annotations = - List.map - (fun (mode, loc) -> mkloc mode (make_loc loc)) - mode_annotations - in let constraint_ : N_ary.function_constraint option = match $2 with | None -> None @@ -3260,7 +3234,7 @@ strict_binding_modes: ; %inline strict_binding: strict_binding_modes - {$1 []} + {$1 Mode.empty} ; fun_body: | FUNCTION ext_attributes match_cases @@ -3321,10 +3295,87 @@ fun_param_as_list: ; fun_params: | nonempty_concat(fun_param_as_list) { $1 } -%inline expr_comma_list: - es = separated_nontrivial_llist(COMMA, expr) - { es } ; + +(* Parsing labeled tuple expressions + + The grammar we want to parse is something like: + + labeled_tuple_element := expr | ~x:expr | ~x | ~(x:ty) + labeled_tuple := lt_element [, lt_element]+ + + (The last case of [labeled_tuple_element] is a punned label with a type + constraint, which is allowed for functions, so we allow it here). + + So you might think [labeled_tuple] could therefore just be: + + labeled_tuple : + separated_nontrivial_llist(COMMA, labeled_tuple_element) + + But this doesn't work: + + - If we don't mark [labeled_tuple_element] %inline, this causes many + reduce/reduce conflicts (basically just ambiguities) because + [labeled_tuple_element] trivially reduces to [expr]. + + - If we do mark [labeled_tuple_element] %inline, it is not allowed to have + %prec annotations. Menhir doesn't permit these on %inline non-terminals + that are used in non-tail position. + + To get around this, we do mark it inlined, and then because we can only use + it in tail position it is _manually_ inlined into the occurrences in + [separated_nontrivial_llist] where it doesn't appear in tail position. This + results in [labeled_tuple] and [reversed_labeled_tuple_body] below. So the + latter is just a list of comma-separated labeled tuple elements, with length + at least two, where the first element in the base case is inlined (resulting + in one base case for each case of [labeled_tuple_element]. *) +%inline labeled_tuple_element : + | expr + { None, $1 } + | LABEL simple_expr %prec below_HASH + { Some $1, $2 } + | TILDE label = LIDENT + { let loc = $loc(label) in + Some label, mkexpvar ~loc label } + | TILDE LPAREN label = LIDENT c = type_constraint RPAREN %prec below_HASH + { Some label, + mkexp_type_constraint + ~loc:($startpos($2), $endpos) (mkexpvar ~loc:$loc(label) label) c } +; +reversed_labeled_tuple_body: + (* > 2 elements *) + xs = reversed_labeled_tuple_body + COMMA + x = labeled_tuple_element + { x :: xs } + (* base cases (2 elements) *) +| x1 = expr + COMMA + x2 = labeled_tuple_element + { [ x2; None, x1 ] } +| l1 = LABEL x1 = simple_expr + COMMA + x2 = labeled_tuple_element + { [ x2; Some l1, x1 ] } +| TILDE l1 = LIDENT + COMMA + x2 = labeled_tuple_element + { let loc = $loc(l1) in + [ x2; Some l1, mkexpvar ~loc l1] } +| TILDE LPAREN l1 = LIDENT c = type_constraint RPAREN + COMMA + x2 = labeled_tuple_element + { let x1 = + mkexp_type_constraint + ~loc:($startpos($2), $endpos) (mkexpvar ~loc:$loc(l1) l1) c + in + [ x2; Some l1, x1] } +; +%inline labeled_tuple: + xs = rev(reversed_labeled_tuple_body) + { xs } +; + record_expr_content: eo = ioption(terminated(simple_expr, WITH)) fields = separated_or_terminated_nonempty_list(SEMI, record_expr_field) @@ -3342,7 +3393,7 @@ record_expr_content: | Some e -> ($startpos(c), $endpos), label, e in - label, mkexp_opt_constraint ~loc:constraint_loc e c } + label, mkexp_opt_type_constraint ~loc:constraint_loc e c } ; %inline object_expr_content: xs = separated_or_terminated_nonempty_list(SEMI, object_expr_field) @@ -3373,6 +3424,19 @@ type_constraint: | COLONGREATER error { syntax_error() } ; +%inline type_constraint_with_modes: + | type_constraint optional_atat_mode_expr + { $1, $2 } +; + +%inline constraint_: + | type_constraint_with_modes + { let ty, modes = $1 in + Some ty, modes } + | at_mode_expr + { None, $1 } +; + (* the thing between the [type] and the [.] in [let : type <>. 'a -> 'a = ...] *) newtypes: (* : (string with_loc * jkind_annotation option) list *) @@ -3429,8 +3493,6 @@ pattern_no_exn: { Ppat_alias($1, $3) } | self AS error { expecting $loc($3) "identifier" } - | pattern_comma_list(self) %prec below_COMMA - { Ppat_tuple(List.rev $1) } | self COLONCOLON error { expecting $loc($3) "pattern" } | self BAR pattern @@ -3438,8 +3500,69 @@ pattern_no_exn: | self BAR error { expecting $loc($3) "pattern" } ) { $1 } + | reversed_labeled_tuple_pattern(self) + { let closed, pats = $1 in + ppat_ltuple $sloc (List.rev pats) closed + } ; +(* Parsing labeled tuple patterns + + Here we play essentially the same game we did for expressions - see the + comment beginning "Parsing labeled tuple expressions". + + One difference is that we would need to manually inline the definition of + individual elements in two places: Once in the base case for lists 2 or more + elements, and once in the special case for open patterns with just one + element (e.g., [~x, ..]). Rather than manually inlining + [labeled_tuple_pat_element] twice, we simply define it twice: once with the + [%prec] annotations needed for its occurrences in tail position, and once + without them suitable for use in other locations. +*) +%inline labeled_tuple_pat_element(self): + | self { None, $1 } + | LABEL simple_pattern %prec COMMA + { Some $1, $2 } + | TILDE label = LIDENT + { let loc = $loc(label) in + Some label, mkpatvar ~loc label } + | TILDE LPAREN label = LIDENT COLON cty = core_type RPAREN %prec COMMA + { let lbl_loc = $loc(label) in + let pat_loc = $startpos($2), $endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) } + +(* If changing this, don't forget to change its copy just above. *) +%inline labeled_tuple_pat_element_noprec(self): + | self { None, $1 } + | LABEL simple_pattern + { Some $1, $2 } + | TILDE label = LIDENT + { let loc = $loc(label) in + Some label, mkpatvar ~loc label } + | TILDE LPAREN label = LIDENT COLON cty = core_type RPAREN + { let lbl_loc = $loc(label) in + let pat_loc = $startpos($2), $endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat_opt_constraint ~loc:pat_loc pat (Some cty) } + +labeled_tuple_pat_element_list(self): + | labeled_tuple_pat_element_list(self) COMMA labeled_tuple_pat_element(self) + { $3 :: $1 } + | labeled_tuple_pat_element_noprec(self) COMMA labeled_tuple_pat_element(self) + { [ $3; $1 ] } + | self COMMA error + { expecting $loc($3) "pattern" } +; + +reversed_labeled_tuple_pattern(self): + | labeled_tuple_pat_element_list(self) %prec below_COMMA + { Closed, $1 } + | labeled_tuple_pat_element_list(self) COMMA DOTDOT + { Open, $1 } + | labeled_tuple_pat_element_noprec(self) COMMA DOTDOT + { Open, [ $1 ] } + pattern_gen: simple_pattern { $1 } @@ -3473,12 +3596,13 @@ simple_pattern_not_ident: { mkpat_attrs ~loc:$sloc (Ppat_constraint(mkpat ~loc:$loc($4) (Ppat_unpack $4), $6)) $3 } - | mkpat(simple_pattern_not_ident_) + | simple_pattern_not_ident_ { $1 } | signed_constant { Constant.to_pattern $1 ~loc:$sloc } ; %inline simple_pattern_not_ident_: - | UNDERSCORE + mkpat( + UNDERSCORE { Ppat_any } | signed_value_constant DOTDOT signed_value_constant { Ppat_interval ($1, $3) } @@ -3502,8 +3626,6 @@ simple_pattern_not_ident: { expecting $loc($4) "pattern" } | LPAREN pattern error { unclosed "(" $loc($1) ")" $loc($3) } - | LPAREN pattern COLON core_type RPAREN - { Ppat_constraint($2, $4) } | LPAREN pattern COLON core_type error { unclosed "(" $loc($1) ")" $loc($5) } | LPAREN pattern COLON error @@ -3513,6 +3635,12 @@ simple_pattern_not_ident: { unclosed "(" $loc($1) ")" $loc($7) } | extension { Ppat_extension $1 } + ) { $1 } + | LPAREN pattern at_mode_expr RPAREN + { mkpat_with_modes $3 $2 } + | LPAREN pattern COLON core_type optional_atat_mode_expr RPAREN + { mkpat_with_modes $5 @@ + mkpat ~loc:$sloc (Ppat_constraint($2, $4)) } ; simple_delimited_pattern: @@ -3540,11 +3668,6 @@ simple_delimited_pattern: $1 } -pattern_comma_list(self): - pattern_comma_list(self) COMMA pattern { $3 :: $1 } - | self COMMA pattern { [$3; $1] } - | self COMMA error { expecting $loc($3) "pattern" } -; %inline pattern_semi_list: ps = separated_or_terminated_nonempty_list(SEMI, pattern) { ps } @@ -3585,11 +3708,12 @@ value_description: id = mkrhs(val_ident) COLON ty = possibly_poly(core_type) + modalities = optional_atat_modalities_expr attrs2 = post_item_attributes { let attrs = attrs1 @ attrs2 in let loc = make_loc $sloc in let docs = symbol_docs $sloc in - Val.mk id ty ~attrs ~loc ~docs, + Val.mk id ty ~attrs ~modalities ~loc ~docs, ext } ; @@ -3602,13 +3726,14 @@ primitive_declaration: id = mkrhs(val_ident) COLON ty = possibly_poly(core_type) + modalities = optional_atat_modalities_expr EQUAL prim = raw_string+ attrs2 = post_item_attributes { let attrs = attrs1 @ attrs2 in let loc = make_loc $sloc in let docs = symbol_docs $sloc in - Val.mk id ty ~prim ~attrs ~loc ~docs, + Val.mk id ty ~prim ~attrs ~modalities ~loc ~docs, ext } ; @@ -3655,7 +3780,7 @@ generic_type_declaration(flag, kind): flag = flag params = type_parameters id = mkrhs(LIDENT) - jkind = jkind_attr? + jkind = jkind_constraint? kind_priv_manifest = kind cstrs = constraints attrs2 = post_item_attributes @@ -3665,7 +3790,8 @@ generic_type_declaration(flag, kind): let attrs = attrs1 @ attrs2 in let loc = make_loc $sloc in (flag, ext), - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs + Jane_syntax.Layouts.type_declaration_of + id ~params ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:None ~jkind } ; %inline generic_and_type_declaration(kind): @@ -3673,7 +3799,7 @@ generic_type_declaration(flag, kind): attrs1 = attributes params = type_parameters id = mkrhs(LIDENT) - jkind = jkind_attr? + jkind = jkind_constraint? kind_priv_manifest = kind cstrs = constraints attrs2 = post_item_attributes @@ -3683,7 +3809,8 @@ generic_type_declaration(flag, kind): let attrs = attrs1 @ attrs2 in let loc = make_loc $sloc in let text = symbol_text $symbolstartpos in - Type.mk id ~params ?jkind ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text + Jane_syntax.Layouts.type_declaration_of + id ~params ~jkind ~cstrs ~kind ~priv ~manifest ~attrs ~loc ~docs ~text:(Some text) } ; %inline constraints: @@ -3736,22 +3863,42 @@ type_parameters: { ps } ; +jkind: + jkind MOD mkrhs(LIDENT)+ { (* LIDENTs here are for modes *) + let mode_list = + List.map + (fun {txt; loc} -> Jane_syntax.Mode_expr.Const.mk txt loc) + $3 + in + Jane_syntax.Jkind.Mod ($1, mkrhs mode_list $loc($3)) + } + | jkind WITH core_type { + Jane_syntax.Jkind.With ($1, $3) + } + | mkrhs(ident) { + let {txt; loc} = $1 in + Jane_syntax.Jkind.(Abbreviation (Const.mk txt loc)) + } + | KIND_OF ty=core_type { + Jane_syntax.Jkind.Kind_of ty + } + | UNDERSCORE { + Jane_syntax.Jkind.Default + } +; + jkind_annotation: (* : jkind_annotation *) - ident { let loc = make_loc $sloc in - mkloc (check_jkind ~loc $1) loc } + mkrhs(jkind) { $1 } ; -jkind_string: (* : string with_loc *) - (* the [check_jkind] just ensures this is the name of a jkind *) - ident { let loc = make_loc $sloc in - ignore (check_jkind ~loc $1 : const_jkind); - mkloc $1 loc } +jkind_constraint: + COLON jkind_annotation { $2 } ; -jkind_attr: - COLON - jkind=jkind_string - { Attr.mk ~loc:jkind.loc jkind (PStr []) } +kind_abbreviation_decl: + KIND_ABBREV abbrev=mkrhs(LIDENT) EQUAL jkind=jkind_annotation { + (abbrev, jkind) + } ; %inline type_param_with_jkind: @@ -3902,15 +4049,15 @@ generalized_constructor_arguments: { ($2,Pcstr_tuple [],Some $4) } ; -%inline atomic_type_gbl: - gbl = global_flag cty = atomic_type { - mkcty_global_maybe gbl cty (make_loc $loc(gbl)) -} +%inline constructor_argument: + gbl=global_flag cty=atomic_type m1=optional_atat_modalities_expr { + let modalities = gbl @ m1 in + Type.constructor_arg cty ~modalities ~loc:(make_loc $sloc) + } ; constructor_arguments: - | tys = inline_separated_nonempty_llist(STAR, atomic_type_gbl) - %prec below_HASH + | tys = inline_separated_nonempty_llist(STAR, constructor_argument) { Pcstr_tuple tys } | LBRACE label_declarations RBRACE { Pcstr_record $2 } @@ -3921,25 +4068,23 @@ label_declarations: | label_declaration_semi label_declarations { $1 :: $2 } ; label_declaration: - mutable_or_global_flag mkrhs(label) COLON poly_type_no_attr attributes + mutable_or_global_flag mkrhs(label) COLON poly_type_no_attr m1=optional_atat_modalities_expr attrs=attributes { let info = symbol_info $endpos in - let mut, gbl = $1 in - mkld_global_maybe gbl - (Type.field $2 $4 ~mut ~attrs:$5 ~loc:(make_loc $sloc) ~info) - (make_loc $loc($1)) } + let mut, m0 = $1 in + let modalities = m0 @ m1 in + Type.field $2 $4 ~mut ~modalities ~attrs ~loc:(make_loc $sloc) ~info} ; label_declaration_semi: - mutable_or_global_flag mkrhs(label) COLON poly_type_no_attr attributes - SEMI attributes + mutable_or_global_flag mkrhs(label) COLON poly_type_no_attr m1=optional_atat_modalities_expr attrs0=attributes + SEMI attrs1=attributes { let info = - match rhs_info $endpos($5) with + match rhs_info $endpos(attrs0) with | Some _ as info_before_semi -> info_before_semi | None -> symbol_info $endpos in - let mut, gbl = $1 in - mkld_global_maybe gbl - (Type.field $2 $4 ~mut ~attrs:($5 @ $7) ~loc:(make_loc $sloc) ~info) - (make_loc $loc($1)) } + let mut, m0 = $1 in + let modalities = m0 @ m1 in + Type.field $2 $4 ~mut ~modalities ~attrs:(attrs0 @ attrs1) ~loc:(make_loc $sloc) ~info} ; /* Type Extensions */ @@ -4119,54 +4264,169 @@ function_type: | ty = tuple_type %prec MINUSGREATER { ty } - | ty = strict_function_type + | ty = strict_function_or_labeled_tuple_type { ty } ; -strict_function_type: +strict_function_or_labeled_tuple_type: | mktyp( label = arg_label - unique_local = mode_flags - domain = extra_rhs(param_type) + domain_with_modes = with_optional_mode_expr(extra_rhs(param_type)) MINUSGREATER - codomain = strict_function_type - { Ptyp_arrow(label, mktyp_with_modes unique_local domain , codomain) } + codomain = strict_function_or_labeled_tuple_type + { let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) } ) { $1 } | mktyp( label = arg_label - arg_unique_local = mode_flags - domain = extra_rhs(param_type) + domain_with_modes = with_optional_mode_expr(extra_rhs(param_type)) MINUSGREATER - ret_unique_local = mode_flags - codomain = tuple_type + codomain_with_modes = with_optional_mode_expr(tuple_type) %prec MINUSGREATER - { Ptyp_arrow(label, - mktyp_with_modes arg_unique_local domain , - mktyp_with_modes ret_unique_local (maybe_curry_typ codomain $loc(codomain))) } + { let (domain, (_ : Lexing.position * Lexing.position)), arg_modes = domain_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) } + ) + { $1 } + (* These next three cases are for labled tuples - see comment on [tuple_type] + below. + + The first two cases are present just to resolve a shift reduce conflict + in a module type [S with t := x:t1 * t2 -> ...] which might be the + beginning of + [S with t := x:t1 * t2 -> S'] or [S with t := x:t1 * t2 -> t3] + They are the same as the previous two cases, but with [arg_label] replaced + with the more specific [LIDENT COLON] and [param_type] replaced with the + more specific [proper_tuple_type]. Apparently, this is sufficient for + menhir to be able to delay a decision about which of the above module type + cases we are in. *) + | mktyp( + label = LIDENT COLON + tuple_with_modes = with_optional_mode_expr(proper_tuple_type) + MINUSGREATER + codomain = strict_function_or_labeled_tuple_type + { + let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, mktyp_with_modes arg_modes domain , codomain) } ) { $1 } + | mktyp( + label = LIDENT COLON + tuple_with_modes = with_optional_mode_expr(proper_tuple_type) + MINUSGREATER + codomain_with_modes = with_optional_mode_expr(tuple_type) + %prec MINUSGREATER + { let (tuple, tuple_loc), arg_modes = tuple_with_modes in + let (codomain, codomain_loc), ret_modes = codomain_with_modes in + let ty, ltys = tuple in + let label = Labelled label in + let domain = ptyp_ltuple tuple_loc ((None, ty) :: ltys) in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(label, + mktyp_with_modes arg_modes domain , + mktyp_with_modes ret_modes (maybe_curry_typ codomain codomain_loc)) + } + ) + { $1 } + | label = LIDENT COLON proper_tuple_type %prec MINUSGREATER + { let ty, ltys = $3 in + ptyp_ltuple $sloc ((Some label, ty) :: ltys) + } ; -%inline arg_label: + +%inline strict_arg_label: | label = optlabel { Optional label } | label = LIDENT COLON { Labelled label } +; + +%inline arg_label: + | strict_arg_label + { $1 } | /* empty */ { Nolabel } ; -%inline mode_flag: +/* Legacy mode annotations */ +%inline mode_legacy: | LOCAL - { (Local, $sloc) } + { Mode.Const.mk "local" (make_loc $sloc) } | UNIQUE - { (Unique, $sloc) } + { Mode.Const.mk "unique" (make_loc $sloc) } | ONCE - { (Once, $sloc) } + { Mode.Const.mk "once" (make_loc $sloc) } +; + +%inline mode_expr_legacy: + | mode_legacy+ + {mkloc $1 (make_loc $sloc)} +; + +%inline optional_mode_expr_legacy: + | { Mode.empty } + | mode_expr_legacy {$1} +; + +/* New mode annotation, introduced by AT or ATAT */ +%inline mode: + | LIDENT { Mode.Const.mk $1 (make_loc $sloc) } +; + +%inline mode_expr: + | mode+ { + mkloc $1 (make_loc $sloc) + } +; + +at_mode_expr: + | AT mode_expr {$2} + | AT error { expecting $loc($2) "mode expression" } ; -%inline mode_flags: - | flags = iloption(mode_flag+) - { flags } + +%inline optional_at_mode_expr: + | { Mode.empty } + | at_mode_expr {$1} +; + +%inline with_optional_mode_expr(ty): + | m0=optional_mode_expr_legacy ty=ty m1=optional_at_mode_expr { + let m = Mode.concat m0 m1 in + (ty, $loc(ty)), m + } +; + +atat_mode_expr: + | ATAT mode_expr {$2} + | ATAT error { expecting $loc($2) "mode expression" } +; + +%inline optional_atat_mode_expr: + | { Mode.empty } + | atat_mode_expr {$1} +; + +/* Modalities */ + +%inline modality: + | LIDENT { mkloc (Modality $1) (make_loc $sloc) } + +%inline modalities: + | modality+ { $1 } + +optional_atat_modalities_expr: + | %prec below_HASH + { [] } + | ATAT modalities { $2 } + | ATAT error { expecting $loc($2) "modality expression" } ; + %inline param_type: | mktyp_jane_syntax_ltyp( LPAREN bound_vars = typevar_list DOT inner_type = core_type RPAREN @@ -4176,22 +4436,41 @@ strict_function_type: | ty = tuple_type { ty } ; + (* Tuple types include: - atomic types (see below); - proper tuple types: int * int * int list A proper tuple type is a star-separated list of at least two atomic types. - *) + Tuple components can also be labeled, as an [int * int list * y:bool]. + + However, the special case of labeled tuples where the first element has a + label is not parsed as a proper_tuple_type, but rather as a case of + strict_function_or_labled_tuple_type above. This helps in dealing with + ambiguities around [x:t1 * t2 -> t3] which must continue to parse as a + function with one labeled argument even in the presense of labled tuples. +*) tuple_type: | ty = atomic_type %prec below_HASH { ty } - | mktyp( - tys = separated_nontrivial_llist(STAR, atomic_type) - { Ptyp_tuple tys } - ) - { $1 } + | proper_tuple_type %prec below_FUNCTOR + { let ty, ltys = $1 in + ptyp_ltuple $sloc ((None, ty) :: ltys) + } ; +%inline proper_tuple_type: + | ty = atomic_type + STAR + ltys = separated_nonempty_llist(STAR, labeled_tuple_typ_element) + { ty, ltys } + +%inline labeled_tuple_typ_element : + | atomic_type %prec STAR + { None, $1 } + | label = LIDENT COLON ty = atomic_type %prec STAR + { Some label, ty } + (* Atomic types are the most basic level in the syntax of types. Atomic types include: - types between parentheses: (int -> int) @@ -4211,23 +4490,11 @@ atomic_type: | UNDERSCORE { Ptyp_any } | tys = actual_type_parameters - tid = mkrhs(type_longident) - HASH_SUFFIX - { match tid.txt with - | Lident "float" -> - let ident_start = fst $loc(tid) in - let hash_end = snd $loc($3) in - unboxed_float_type (ident_start, hash_end) tys - | _ -> - (* CR layouts v2.1: We should avoid [not_expecting] in long-lived - code. When we support unboxed types other than float, we should - consider moving this check into the typechecker. - *) - not_expecting $sloc "Unboxed type other than float#" - } + tid = mkrhs(type_unboxed_longident) + { unboxed_type $loc(tid) tid.txt tys } | tys = actual_type_parameters tid = mkrhs(type_longident) - { Ptyp_constr(tid, tys) } %prec below_HASH + { Ptyp_constr(tid, tys) } | LESS meth_list GREATER { let (f, c) = $2 in Ptyp_object (f, c) } | LESS GREATER @@ -4278,9 +4545,24 @@ atomic_type: { [] } | ty = atomic_type { [ty] } - | LPAREN tys = separated_nontrivial_llist(COMMA, core_type) RPAREN + | LPAREN + tys = separated_nontrivial_llist(COMMA, one_type_parameter_of_several) + RPAREN { tys } +(* Layout annotations on type expressions typically require parens, as in [('a : + float64)]. But this is unnecessary when the type expression is used as the + parameter of a tconstr with more than one argument, as in [(int, 'b : + float64) t]. *) +%inline one_type_parameter_of_several: + | core_type { $1 } + | QUOTE id=ident COLON jkind=jkind_annotation + { Jane_syntax.Layouts.type_of ~loc:(make_loc $sloc) @@ + Ltyp_var { name = Some id; jkind } } + | UNDERSCORE COLON jkind=jkind_annotation + { Jane_syntax.Layouts.type_of ~loc:(make_loc $sloc) @@ + Ltyp_var { name = None; jkind } } + %inline package_type: module_type { let (lid, cstrs, attrs) = package_type_of_module_type $1 in let descr = Ptyp_package (lid, cstrs) in @@ -4370,7 +4652,7 @@ value_constant: ; unboxed_constant: | HASH_INT { unboxed_int $sloc $sloc Positive $1 } - | HASH_FLOAT { unboxed_float $sloc Positive $1 } + | HASH_FLOAT { unboxed_float Positive $1 } ; constant: value_constant { Constant.value $1 } @@ -4387,9 +4669,9 @@ signed_constant: signed_value_constant { Constant.value $1 } | unboxed_constant { $1 } | MINUS HASH_INT { unboxed_int $sloc $loc($2) Negative $2 } - | MINUS HASH_FLOAT { unboxed_float $sloc Negative $2 } + | MINUS HASH_FLOAT { unboxed_float Negative $2 } | PLUS HASH_INT { unboxed_int $sloc $loc($2) Positive $2 } - | PLUS HASH_FLOAT { unboxed_float $sloc Positive $2 } + | PLUS HASH_FLOAT { unboxed_float Positive $2 } ; /* Identifiers and long identifiers */ @@ -4422,11 +4704,18 @@ operator: | BANG { "!" } | infix_operator { $1 } ; +%inline infixop3: + | op = INFIXOP3 { op } + | MOD { "mod" } +; %inline infix_operator: | op = INFIXOP0 { op } + /* Still support the two symbols as infix operators */ + | AT {"@"} + | ATAT {"@@"} | op = INFIXOP1 { op } | op = INFIXOP2 { op } - | op = INFIXOP3 { op } + | op = infixop3 { op } | op = INFIXOP4 { op } | PLUS {"+"} | PLUSDOT {"+."} @@ -4479,8 +4768,17 @@ val_longident: label_longident: mk_longident(mod_longident, LIDENT) { $1 } ; +type_trailing_no_hash: + LIDENT { $1 } %prec below_HASH +; +type_trailing_hash: + LIDENT HASH_SUFFIX { $1 ^ "#" } +; type_longident: - mk_longident(mod_ext_longident, LIDENT) { $1 } + mk_longident(mod_ext_longident, type_trailing_no_hash) { $1 } +; +type_unboxed_longident: + mk_longident(mod_ext_longident, type_trailing_hash) { $1 } ; mod_longident: @@ -4579,13 +4877,16 @@ mutable_flag: | MUTABLE { Mutable } ; mutable_or_global_flag: - /* empty */ { Immutable, Nothing } - | MUTABLE { Mutable, Nothing } - | GLOBAL { Immutable, Global } + /* empty */ + { Immutable, [] } + | MUTABLE + { Mutable, [] } + | GLOBAL + { Immutable, [ mkloc (Modality "global") (make_loc $sloc)] } ; %inline global_flag: - { Nothing } - | GLOBAL { Global } + { [] } + | GLOBAL { [ mkloc (Modality "global") (make_loc $sloc)] } ; virtual_flag: /* empty */ { Concrete } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 6ef3b360caf..f0e2d55bba1 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -45,6 +45,8 @@ type constant = type location_stack = Location.t list +type modality = | Modality of string [@@unboxed] + (** {1 Extension points} *) type attribute = { @@ -90,11 +92,11 @@ and core_type_desc = | Ptyp_arrow of arg_label * core_type * core_type (** [Ptyp_arrow(lbl, T1, T2)] represents: - [T1 -> T2] when [lbl] is - {{!Asttypes.arg_label.Nolabel}[Nolabel]}, + {{!arg_label.Nolabel}[Nolabel]}, - [~l:T1 -> T2] when [lbl] is - {{!Asttypes.arg_label.Labelled}[Labelled]}, + {{!arg_label.Labelled}[Labelled]}, - [?l:T1 -> T2] when [lbl] is - {{!Asttypes.arg_label.Optional}[Optional]}. + {{!arg_label.Optional}[Optional]}. *) | Ptyp_tuple of core_type list (** [Ptyp_tuple([T1 ; ... ; Tn])] @@ -168,6 +170,11 @@ and core_type_desc = | Ptyp_package of package_type (** [(module S)]. *) | Ptyp_extension of extension (** [[%id]]. *) +and arg_label = Asttypes.arg_label = + Nolabel + | Labelled of string + | Optional of string + and package_type = Longident.t loc * (Longident.t loc * core_type) list (** As {!package_type} typed values: - [(S, [])] represents [(module S)], @@ -314,34 +321,37 @@ and expression_desc = | Pexp_fun of arg_label * expression option * pattern * expression (** [Pexp_fun(lbl, exp0, P, E1)] represents: - [fun P -> E1] - when [lbl] is {{!Asttypes.arg_label.Nolabel}[Nolabel]} + when [lbl] is {{!arg_label.Nolabel}[Nolabel]} and [exp0] is [None] - [fun ~l:P -> E1] - when [lbl] is {{!Asttypes.arg_label.Labelled}[Labelled l]} + when [lbl] is {{!arg_label.Labelled}[Labelled l]} and [exp0] is [None] - [fun ?l:P -> E1] - when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]} + when [lbl] is {{!arg_label.Optional}[Optional l]} and [exp0] is [None] - [fun ?l:(P = E0) -> E1] - when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]} + when [lbl] is {{!arg_label.Optional}[Optional l]} and [exp0] is [Some E0] Notes: - If [E0] is provided, only - {{!Asttypes.arg_label.Optional}[Optional]} is allowed. + {{!arg_label.Optional}[Optional]} is allowed. - [fun P1 P2 .. Pn -> E1] is represented as nested {{!expression_desc.Pexp_fun}[Pexp_fun]}. - [let f P = E] is represented using {{!expression_desc.Pexp_fun}[Pexp_fun]}. + - While Position arguments ([lbl:[%call_pos] -> ...]) are parsed as + {{!Asttypes.arg_label.Labelled}[Labelled l]}, they are converted to + {{!Types.arg_label.Position}[Position l]} arguments for type-checking. *) | Pexp_apply of expression * (arg_label * expression) list (** [Pexp_apply(E0, [(l1, E1) ; ... ; (ln, En)])] represents [E0 ~l1:E1 ... ~ln:En] [li] can be - {{!Asttypes.arg_label.Nolabel}[Nolabel]} (non labeled argument), - {{!Asttypes.arg_label.Labelled}[Labelled]} (labelled arguments) or - {{!Asttypes.arg_label.Optional}[Optional]} (optional argument). + {{!arg_label.Nolabel}[Nolabel]} (non labeled argument), + {{!arg_label.Labelled}[Labelled]} (labelled arguments) or + {{!arg_label.Optional}[Optional]} (optional argument). Invariant: [n > 0] *) @@ -460,6 +470,7 @@ and value_description = { pval_name: string loc; pval_type: core_type; + pval_modalities : modality loc list; pval_prim: string list; pval_attributes: attributes; (** [... [\@\@id1] [\@\@id2]] *) pval_loc: Location.t; @@ -522,6 +533,7 @@ and label_declaration = { pld_name: string loc; pld_mutable: mutable_flag; + pld_modalities: modality loc list; pld_type: core_type; pld_loc: Location.t; pld_attributes: attributes; (** [l : T [\@id1] [\@id2]] *) @@ -547,8 +559,15 @@ and constructor_declaration = pcd_attributes: attributes; (** [C of ... [\@id1] [\@id2]] *) } +and constructor_argument = + { + pca_modalities: modality loc list; + pca_type: core_type; + pca_loc: Location.t; + } + and constructor_arguments = - | Pcstr_tuple of core_type list + | Pcstr_tuple of constructor_argument list | Pcstr_record of label_declaration list (** Values of type {!constructor_declaration} represents the constructor arguments of: @@ -636,11 +655,11 @@ and class_type_desc = | Pcty_arrow of arg_label * core_type * class_type (** [Pcty_arrow(lbl, T, CT)] represents: - [T -> CT] - when [lbl] is {{!Asttypes.arg_label.Nolabel}[Nolabel]}, + when [lbl] is {{!arg_label.Nolabel}[Nolabel]}, - [~l:T -> CT] - when [lbl] is {{!Asttypes.arg_label.Labelled}[Labelled l]}, + when [lbl] is {{!arg_label.Labelled}[Labelled l]}, - [?l:T -> CT] - when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]}. + when [lbl] is {{!arg_label.Optional}[Optional l]}. *) | Pcty_extension of extension (** [%id] *) | Pcty_open of open_description * class_type (** [let open M in CT] *) @@ -713,16 +732,16 @@ and class_expr_desc = | Pcl_fun of arg_label * expression option * pattern * class_expr (** [Pcl_fun(lbl, exp0, P, CE)] represents: - [fun P -> CE] - when [lbl] is {{!Asttypes.arg_label.Nolabel}[Nolabel]} + when [lbl] is {{!arg_label.Nolabel}[Nolabel]} and [exp0] is [None], - [fun ~l:P -> CE] - when [lbl] is {{!Asttypes.arg_label.Labelled}[Labelled l]} + when [lbl] is {{!arg_label.Labelled}[Labelled l]} and [exp0] is [None], - [fun ?l:P -> CE] - when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]} + when [lbl] is {{!arg_label.Optional}[Optional l]} and [exp0] is [None], - [fun ?l:(P = E0) -> CE] - when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]} + when [lbl] is {{!arg_label.Optional}[Optional l]} and [exp0] is [Some E0]. *) | Pcl_apply of class_expr * (arg_label * expression) list diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 568f2d15ee8..0d9d85a44f1 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -112,9 +112,7 @@ let protect_longident ppf print_longident longprefix txt = fprintf ppf format print_longident longprefix txt let is_curry_attr attr = - match attr.attr_name.txt with - | "extension.curry" -> true - | _ -> false + attr.attr_name.txt = Jane_syntax.Arrow_curry.curry_attr_name let filter_curry_attrs attrs = List.filter (fun attr -> not (is_curry_attr attr)) attrs @@ -122,14 +120,6 @@ let filter_curry_attrs attrs = let has_non_curry_attr attrs = List.exists (fun attr -> not (is_curry_attr attr)) attrs -let check_local_attr attrs = - match - List.partition (fun attr -> - attr.attr_name.txt = "extension.local") attrs - with - | [], _ -> attrs, false - | _::_, rest -> rest, true - type space_formatter = (unit, Format.formatter, unit) format let override = function @@ -288,29 +278,88 @@ let iter_loc f ctxt {txt; loc = _} = f ctxt txt let constant_string f s = pp f "%S" s -let tyvar = Printast.tyvar -let jkind_annotation = Jane_syntax.Layouts.Pprint.jkind_annotation - -let tyvar_jkind_loc ~print_quote f (str,jkind) = - let pptv = - if print_quote - then tyvar - else fun ppf s -> Format.fprintf ppf "%s" s - in - match jkind with - | None -> pptv f str.txt - | Some lay -> Format.fprintf f "(%a : %a)" pptv str.txt jkind_annotation lay +let tyvar ppf s = + if String.length s >= 2 && s.[1] = '\'' then + (* without the space, this would be parsed as + a character literal *) + Format.fprintf ppf "' %s" s + else + Format.fprintf ppf "'%s" s let tyvar_loc f str = tyvar f str.txt let string_quot f x = pp f "`%s" x -let maybe_local_type pty ctxt f c = - let cattrs, is_local = check_local_attr c.ptyp_attributes in - let c = { c with ptyp_attributes = cattrs } in - if is_local then - pp f "local_ %a" (pty ctxt) c - else - pty ctxt f c +let legacy_mode f m = + let {txt; _} = (m : Jane_syntax.Mode_expr.Const.t :> _ Location.loc) in + let s = + match txt with + | "local" -> "local_" + | "unique" -> "unique_" + | "once" -> "once_" + | s -> Misc.fatal_errorf "Unrecognized mode %s - should not parse" s + in + pp_print_string f s + +let legacy_modes f m = + pp_print_list ~pp_sep:(fun f () -> pp f " ") legacy_mode f m.txt + +let optional_legacy_modes f m = + match m with + | None -> () + | Some m -> + legacy_modes f m; + pp_print_space f () + +let space_modality f {txt = Modality m; _} = + pp_print_string f " "; + pp_print_string f m + +let legacy_modality f m = + let {txt; _} = (m : modality Location.loc) in + let s = + match txt with + | Modality "global" -> "global_" + | Modality s -> Misc.fatal_errorf "Unrecognized modality %s - should not parse" s + in + pp_print_string f s + +let legacy_modalities f m = + pp_print_list ~pp_sep:(fun f () -> pp f " ") legacy_modality f m + +let optional_legacy_modalities f m = + match m with + | [] -> () + | m -> + legacy_modalities f m; + pp_print_space f () + +let maybe_atat_modalities f m = + match m with + | [] -> () + | _ :: _ -> + pp_print_string f " @@"; + pp_print_list space_modality f m + +let mode f m = + let {txt; _} = (m : Jane_syntax.Mode_expr.Const.t :> _ Location.loc) in + pp_print_string f txt + +let maybe_modes_of_type c = + let m, cattrs = Jane_syntax.Mode_expr.maybe_of_attrs c.ptyp_attributes in + m, { c with ptyp_attributes = cattrs } + +let maybe_modes_type pty ctxt f c = + let m, c = maybe_modes_of_type c in + match m with + | Some m -> pp f "%a %a" legacy_modes m (pty ctxt) c + | None -> pty ctxt f c + +let modalities_type pty ctxt f pca = + match pca.pca_modalities with + | [] -> pty ctxt f pca.pca_type + | m -> + pp f "%a %a" legacy_modalities m (pty ctxt) pca.pca_type + (* c ['a,'b] *) let rec class_params_def ctxt f = function | [] -> () @@ -320,9 +369,37 @@ let rec class_params_def ctxt f = function and type_with_label ctxt f (label, c) = match label with - | Nolabel -> maybe_local_type core_type1 ctxt f c (* otherwise parenthesize *) - | Labelled s -> pp f "%s:%a" s (maybe_local_type core_type1 ctxt) c - | Optional s -> pp f "?%s:%a" s (maybe_local_type core_type1 ctxt) c + | Nolabel -> maybe_modes_type core_type1 ctxt f c (* otherwise parenthesize *) + | Labelled s -> pp f "%s:%a" s (maybe_modes_type core_type1 ctxt) c + | Optional s -> pp f "?%s:%a" s (maybe_modes_type core_type1 ctxt) c + +and jkind ctxt f k = match (k : Jane_syntax.Jkind.t) with + | Default -> pp f "_" + | Abbreviation s -> + pp f "%s" (s : Jane_syntax.Jkind.Const.t :> _ loc).txt + | Mod (t, { txt = mode_list }) -> + begin match mode_list with + | [] -> Misc.fatal_error "malformed jkind annotation" + | _ :: _ -> + pp f "%a mod %a" + (jkind ctxt) t + (pp_print_list ~pp_sep:pp_print_space mode) mode_list + end + | With (t, ty) -> + pp f "%a with %a" (jkind ctxt) t (core_type ctxt) ty + | Kind_of ty -> pp f "kind_of_ %a" (core_type ctxt) ty + +and jkind_annotation ctxt f annot = jkind ctxt f annot.txt + +and tyvar_jkind_loc ctxt ~print_quote f (str,jkind) = + let pptv = + if print_quote + then tyvar + else fun ppf s -> pp ppf "%s" s + in + match jkind with + | None -> pptv f str.txt + | Some lay -> pp f "(%a : %a)" pptv str.txt (jkind_annotation ctxt) lay and core_type ctxt f x = match Jane_syntax.Core_type.of_ast x with @@ -444,24 +521,51 @@ and core_type_jane_syntax ctxt attrs f (x : Jane_syntax.Core_type.t) = pp f "@[<2>%a@;as@;(%a :@ %a)@]" (core_type1 ctxt) aliased_type tyvar_option name - jkind_annotation jkind - | _ -> pp f "@[<2>%a@]" (core_type1_jane_syntax ctxt attrs) x + (jkind_annotation ctxt) jkind + | Jtyp_layout (Ltyp_poly {bound_vars = []; inner_type}) -> + core_type ctxt f inner_type + | Jtyp_layout (Ltyp_poly {bound_vars; inner_type}) -> + let jkind_poly_var f (name, jkind_opt) = + match jkind_opt with + | Some jkind -> pp f "(%a@;:@;%a)" tyvar_loc name (jkind_annotation ctxt) jkind + | None -> tyvar_loc f name + in + pp f "@[<2>%a@;.@;%a@]" + (list jkind_poly_var ~sep:"@;") bound_vars + (core_type ctxt) inner_type + | Jtyp_tuple _ | Jtyp_layout (Ltyp_var _) -> + pp f "@[<2>%a@]" (core_type1_jane_syntax ctxt attrs) x + and core_type1_jane_syntax ctxt attrs f (x : Jane_syntax.Core_type.t) = if has_non_curry_attr attrs then core_type_jane_syntax ctxt attrs f x else match x with | Jtyp_layout (Ltyp_var { name; jkind }) -> - pp f "(%a@;:@;%a)" tyvar_option name jkind_annotation jkind - | _ -> paren true (core_type_jane_syntax ctxt attrs) f x + pp f "(%a@;:@;%a)" tyvar_option name (jkind_annotation ctxt) jkind + | Jtyp_tuple x -> core_type1_labeled_tuple ctxt attrs f x + | Jtyp_layout (Ltyp_alias _ | Ltyp_poly _) -> + paren true (core_type_jane_syntax ctxt attrs) f x and tyvar_option f = function | None -> pp f "_" | Some name -> tyvar f name +and core_type1_labeled_tuple ctxt _attrs f + : Jane_syntax.Labeled_tuples.core_type -> _ = + fun tl -> + pp f "(%a)" (list (labeled_core_type1 ctxt) ~sep:"@;*@;") tl + +and labeled_core_type1 ctxt f (label, ty) = + begin match label with + | None -> () + | Some s -> pp f "%s:" s + end; + core_type1 ctxt f ty + and return_type ctxt f x = - if x.ptyp_attributes <> [] then maybe_local_type core_type1 ctxt f x - else maybe_local_type core_type ctxt f x + if x.ptyp_attributes <> [] then maybe_modes_type core_type1 ctxt f x + else maybe_modes_type core_type ctxt f x (********************pattern********************) (* be cautious when use [pattern], [pattern1] is preferred *) @@ -525,6 +629,20 @@ and pattern1 ctxt (f:Format.formatter) (x:pattern) : unit = | None -> pp f "%a" longident_loc li) | _ -> simple_pattern ctxt f x +and labeled_pattern1 ctxt (f:Format.formatter) (label, x) : unit = + let simple_name = match x with + | {ppat_desc = Ppat_var { txt=s; _ }; ppat_attributes = []; _} -> Some s + | _ -> None + in + match label, simple_name with + | None, _ -> + pattern1 ctxt f x + | Some lbl, Some simple_name when String.equal simple_name lbl -> + pp f "~%s" lbl + | Some lbl, _ -> + pp f "~%s:" lbl; + pattern1 ctxt f x + and simple_pattern ctxt (f:Format.formatter) (x:pattern) : unit = if x.ppat_attributes <> [] then pattern ctxt f x else match Jane_syntax.Pattern.of_ast x with @@ -578,6 +696,7 @@ and simple_pattern ctxt (f:Format.formatter) (x:pattern) : unit = | Some (jpat, _attrs) -> begin match jpat with | Jpat_immutable_array (Iapat_immutable_array _) -> false | Jpat_layout (Lpat_constant _) -> false + | Jpat_tuple (_, _) -> true end | None -> match p.ppat_desc with | Ppat_array _ | Ppat_record _ @@ -596,44 +715,53 @@ and pattern_jane_syntax ctxt attrs f (pat : Jane_syntax.Pattern.t) = | Jpat_immutable_array (Iapat_immutable_array l) -> pp f "@[<2>[:%a:]@]" (list (pattern1 ctxt) ~sep:";") l | Jpat_layout (Lpat_constant c) -> unboxed_constant ctxt f c + | Jpat_tuple (l, closed) -> + let closed_flag ppf = function + | Closed -> () + | Open -> pp ppf ",@;.." + in + pp f "@[<1>(%a%a)@]" + (list ~sep:",@;" (labeled_pattern1 ctxt)) l + closed_flag closed -and maybe_local_pat ctxt is_local f p = - if is_local then - pp f "(local_ %a)" (simple_pattern ctxt) p - else - pp f "%a" (simple_pattern ctxt) p +and maybe_modes_pat ctxt m f p = + match m with + | Some m -> pp f "(%a %a)" legacy_modes m (simple_pattern ctxt) p + | None -> pp f "%a" (simple_pattern ctxt) p and label_exp ctxt f (l,opt,p) = - let pattrs, is_local = check_local_attr p.ppat_attributes in + let m, pattrs = Jane_syntax.Mode_expr.maybe_of_attrs p.ppat_attributes in let p = { p with ppat_attributes = pattrs } in match l with | Nolabel -> (* single case pattern parens needed here *) - pp f "%a" (maybe_local_pat ctxt is_local) p + pp f "%a" (maybe_modes_pat ctxt m) p | Optional rest -> begin match p with | {ppat_desc = Ppat_var {txt;_}; ppat_attributes = []} - when txt = rest && not is_local -> + when txt = rest && Option.is_none m -> (match opt with | Some o -> pp f "?(%s=@;%a)" rest (expression ctxt) o | None -> pp f "?%s" rest) | _ -> (match opt with | Some o -> - pp f "?%s:(%s%a=@;%a)" + pp f "?%s:(%a%a=@;%a)" rest - (if is_local then "local_ " else "") + optional_legacy_modes m (pattern1 ctxt) p (expression ctxt) o - | None -> pp f "?%s:%a" rest (maybe_local_pat ctxt is_local) p) + | None -> pp f "?%s:%a" rest (maybe_modes_pat ctxt m) p) end | Labelled l -> match p with | {ppat_desc = Ppat_var {txt;_}; ppat_attributes = []} when txt = l -> - if is_local then - pp f "~(local_ %s)" l - else + (match m with + | Some m -> + pp f "~(%a %s)" legacy_modes m l + | None -> pp f "~%s" l - | _ -> pp f "~%s:%a" l (maybe_local_pat ctxt is_local) p + ) + | _ -> pp f "~%s:%a" l (maybe_modes_pat ctxt m) p and sugar_expr ctxt f e = if e.pexp_attributes <> [] then false @@ -761,9 +889,9 @@ and expression ?(jane_syntax_parens = false) ctxt f x = (bindings reset_ctxt) (rf,l) (expression ctxt) e | Pexp_apply - ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, + ({ pexp_desc = Pexp_extension({txt = "extension.exclave"}, PStr []) }, [Nolabel, sbody]) -> - pp f "@[<2>local_ %a@]" (expression ctxt) sbody + pp f "@[<2>exclave_ %a@]" (expression ctxt) sbody | Pexp_apply (e, l) -> begin if not (sugar_expr ctxt f x) then match view_fixity_of_exp e with @@ -965,7 +1093,8 @@ and floating_attribute ctxt f a = and value_description ctxt f x = (* note: value_description has an attribute field, but they're already printed by the callers this method *) - pp f "@[%a%a@]" (core_type ctxt) x.pval_type + pp f "@[%a%a%a@]" (core_type ctxt) x.pval_type + maybe_atat_modalities x.pval_modalities (fun f x -> if x.pval_prim <> [] then pp f "@ =@ %a" (list constant_string) x.pval_prim @@ -1171,6 +1300,11 @@ and include_ : 'a. ctxt -> formatter -> (contents ctxt) incl.pincl_mod (item_attributes ctxt) incl.pincl_attributes +and kind_abbrev ctxt f name jkind = + pp f "@[kind_abbrev_@ %a@ =@ %a@]" + string_loc name + (jkind_annotation ctxt) jkind + and module_type ctxt f x = if x.pmty_attributes <> [] then begin pp f "((%a)%a)" (module_type ctxt) {x with pmty_attributes=[]} @@ -1260,9 +1394,15 @@ and sig_include_functor ctxt f | Ifsig_include_functor incl -> include_ ctxt f ~functor_:true ~contents:module_type incl +and sig_layout ctxt f + : Jane_syntax.Layouts.signature_item -> _ = function + | Lsig_kind_abbrev (name, jkind) -> + kind_abbrev ctxt f name jkind + and signature_item_jane_syntax ctxt f : Jane_syntax.Signature_item.t -> _ = function | Jsig_include_functor ifincl -> sig_include_functor ctxt f ifincl + | Jsig_layout sigi -> sig_layout ctxt f sigi and signature_item ctxt f x : unit = match Jane_syntax.Signature_item.of_ast x with @@ -1410,9 +1550,6 @@ and payload ctxt f = function pp f " when "; expression ctxt f e and pp_print_pexp_function ctxt sep f x = - (* do not print [@extension.local] on expressions *) - let attrs, _ = check_local_attr x.pexp_attributes in - let x = { x with pexp_attributes = attrs } in (* We go to some trouble to print nested [Pexp_newtype]/[Lexp_newtype] as newtype parameters of the same "fun" (rather than printing several nested "fun (type a) -> ..."). This isn't necessary for round-tripping -- it just @@ -1423,7 +1560,7 @@ and pp_print_pexp_function ctxt sep f x = | Some (Jexp_layout (Lexp_newtype (str, lay, e)), []) -> pp f "@[(type@ %s :@ %a)@]@ %a" str.txt - jkind_annotation lay + (jkind_annotation ctxt) lay (pp_print_pexp_function ctxt sep) e | Some (jst, attrs) -> pp f "%s@;%a" sep (jane_syntax_expr ctxt attrs ~parens:false) jst @@ -1512,17 +1649,35 @@ and binding ctxt f {pvb_pat=p; pvb_expr=x; pvb_constraint = ct; _} = (* [in] is not printed *) and bindings ctxt f (rf,l) = let binding kwd rf f x = - let attrs, is_local = check_local_attr x.pvb_attributes in + let modes_on_binding, attrs = + Jane_syntax.Mode_expr.maybe_of_attrs x.pvb_attributes + in let x = - match is_local, x.pvb_expr.pexp_desc with - | true, Pexp_apply - ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, - [Nolabel, sbody]) -> - {x with pvb_expr = sbody} + (* For [let local_ x = e in ...] and [let x @ local = e in ...], + the parser puts attributes on both the let-binding and on e. + + The below code is meant to print the modes only in one place, + not both. (We print it on the let-binding, not the expression.) + *) + match modes_on_binding, Jane_syntax.Expression.of_ast x.pvb_expr with + | Some modes_on_binding, + Some (Jexp_modes (Coerce (modes_on_expr, sbody)), _) -> + (* Sanity check: only suppress the printing of one mode expression if + the mode expressions are in fact identical. + *) + let mode_names (modes : Jane_syntax.Mode_expr.t) = + List.map Location.get_txt (modes.txt :> string loc list) + in + if + List.equal String.equal + (mode_names modes_on_binding) + (mode_names modes_on_expr) + then {x with pvb_expr = sbody} + else x | _ -> x in - pp f "@[<2>%s %a%s%a@]%a" kwd rec_flag rf - (if is_local then "local_ " else "") + pp f "@[<2>%s %a%a%a@]%a" kwd rec_flag rf + optional_legacy_modes modes_on_binding (binding ctxt) x (item_attributes ctxt) attrs in match l with @@ -1548,9 +1703,15 @@ and str_include_functor ctxt f | Ifstr_include_functor incl -> include_ ctxt f ~functor_:true ~contents:module_expr incl +and str_layout ctxt f + : Jane_syntax.Layouts.structure_item -> _ = function + | Lstr_kind_abbrev (name, jkind) -> + kind_abbrev ctxt f name jkind + and structure_item_jane_syntax ctxt f : Jane_syntax.Structure_item.t -> _ = function | Jstr_include_functor ifincl -> str_include_functor ctxt f ifincl + | Jstr_layout stri -> str_layout ctxt f stri and structure_item ctxt f x = match Jane_syntax.Structure_item.of_ast x with @@ -1705,10 +1866,18 @@ and type_def_list ctxt f (rf, exported, l) = else if exported then " =" else " :=" in - pp f "@[<2>%s %a%a%s%s%a@]%a" kwd + let layout_annot, x = + match Jane_syntax.Layouts.of_type_declaration x with + | None -> Format.dprintf "", x + | Some (jkind, remaining_attributes) -> + Format.dprintf " : %a" + (jkind_annotation ctxt) jkind, + { x with ptype_attributes = remaining_attributes } + in + pp f "@[<2>%s %a%a%s%t%s%a@]%a" kwd nonrec_flag rf (type_params ctxt) x.ptype_params - x.ptype_name.txt eq + x.ptype_name.txt layout_annot eq (type_declaration ctxt) x (item_attributes ctxt) x.ptype_attributes in @@ -1720,25 +1889,13 @@ and type_def_list ctxt f (rf, exported, l) = (list ~sep:"@," (type_decl "and" Recursive)) xs and record_declaration ctxt f lbls = - let has_attr pld name = - List.exists (fun attr -> attr.attr_name.txt = name) pld.pld_attributes - in - let field_flag f pld = - pp f "%a" mutable_flag pld.pld_mutable; - if has_attr pld "extension.global" then pp f "global_ " - in let type_record_field f pld = - let pld_attributes = - List.filter (fun attr -> - match attr.attr_name.txt with - | "extension.global" -> false - | _ -> true) pld.pld_attributes - in - pp f "@[<2>%a%s:@;%a@;%a@]" - field_flag pld + pp f "@[<2>%a%a%s:@;%a@;%a@]" + mutable_flag pld.pld_mutable + optional_legacy_modalities pld.pld_modalities pld.pld_name.txt (core_type ctxt) pld.pld_type - (attributes ctxt) pld_attributes + (attributes ctxt) pld.pld_attributes in pp f "{@\n%a}" (list type_record_field ~sep:";@\n" ) lbls @@ -1819,7 +1976,7 @@ and constructor_declaration ctxt f (name, vars_jkinds, args, res, attrs) = let pp_vars f vls = match vls with | [] -> () - | _ -> pp f "%a@;.@;" (list (tyvar_jkind_loc ~print_quote:true) ~sep:"@;") + | _ -> pp f "%a@;.@;" (list (tyvar_jkind_loc ctxt ~print_quote:true) ~sep:"@;") vls in match res with @@ -1828,7 +1985,7 @@ and constructor_declaration ctxt f (name, vars_jkinds, args, res, attrs) = (fun f -> function | Pcstr_tuple [] -> () | Pcstr_tuple l -> - pp f "@;of@;%a" (list (core_type1 ctxt) ~sep:"@;*@;") l + pp f "@;of@;%a" (list (modalities_type core_type1 ctxt) ~sep:"@;*@;") l | Pcstr_record l -> pp f "@;of@;%a" (record_declaration ctxt) l ) args (attributes ctxt) attrs @@ -1838,7 +1995,7 @@ and constructor_declaration ctxt f (name, vars_jkinds, args, res, attrs) = (fun f -> function | Pcstr_tuple [] -> core_type1 ctxt f r | Pcstr_tuple l -> pp f "%a@;->@;%a" - (list (core_type1 ctxt) ~sep:"@;*@;") l + (list (modalities_type core_type1 ctxt) ~sep:"@;*@;") l (core_type1 ctxt) r | Pcstr_record l -> pp f "%a@;->@;%a" (record_declaration ctxt) l (core_type1 ctxt) r @@ -1892,6 +2049,19 @@ and label_x_expression_param ctxt f (l,e) = else pp f "~%s:%a" lbl (simple_expr ctxt) e +and tuple_component ctxt f (l,e) = + let simple_name = match e with + | {pexp_desc=Pexp_ident {txt=Lident l;_}; + pexp_attributes=[]} -> Some l + | _ -> None + in match (simple_name, l) with + (* Labeled component can be represented with pun *) + | Some simple_name, Some lbl when String.equal simple_name lbl -> pp f "~%s" lbl + (* Labeled component general case *) + | _, Some lbl -> pp f "~%s:%a" lbl (simple_expr ctxt) e + (* Unlabeled component *) + | _, None -> expression2 ctxt f e (* level 2*) + and directive_argument f x = match x.pdira_desc with | Pdir_string (s) -> pp f "@ %S" s @@ -1915,6 +2085,14 @@ and jane_syntax_expr ctxt attrs f (jexp : Jane_syntax.Expression.t) ~parens = | Jexp_n_ary_function x -> if parens then pp f "(%a)" (n_ary_function_expr reset_ctxt) x else n_ary_function_expr ctxt f x + | Jexp_tuple ltexp -> labeled_tuple_expr ctxt f ltexp + | Jexp_modes mexp -> + if parens then pp f "(%a)" (mode_expr ctxt) mexp + else mode_expr ctxt f mexp + +and mode_expr ctxt f (mexp : Jane_syntax.Modes.expression) = + match mexp with + | Coerce (m, body) -> pp f "@[<2>%a %a@]" legacy_modes m (expression ctxt) body and comprehension_expr ctxt f (cexp : Jane_syntax.Comprehensions.expression) = let punct, comp = match cexp with @@ -1977,14 +2155,18 @@ and layout_expr ctxt f (x : Jane_syntax.Layouts.expression) ~parens = | Lexp_newtype (lid, jkind, inner_expr) -> pp f "@[<2>fun@;(type@;%s :@;%a)@;%a@]" lid.txt - jkind_annotation jkind + (jkind_annotation ctxt) jkind (pp_print_pexp_function ctxt "->") inner_expr and unboxed_constant _ctxt f (x : Jane_syntax.Layouts.constant) = match x with - | Float (x, suffix) -> pp f "#%a" constant (Pconst_float (x, suffix)) - | Integer (x, suffix) -> pp f "#%a" constant (Pconst_integer (x, Some suffix)) + | Float (x, None) -> + paren (first_is '-' x) (fun f -> pp f "%s") f (Misc.format_as_unboxed_literal x) + | Float (x, Some suffix) + | Integer (x, suffix) -> + paren (first_is '-' x) (fun f (x, suffix) -> pp f "%s%c" x suffix) f + (Misc.format_as_unboxed_literal x, suffix) and function_param ctxt f ({ pparam_desc; pparam_loc = _ } : @@ -1994,7 +2176,7 @@ and function_param ctxt f | Pparam_val (a, b, c) -> label_exp ctxt f (a, b, c) | Pparam_newtype (ty, None) -> pp f "(type %s)" ty.txt | Pparam_newtype (ty, Some annot) -> - pp f "(type %s : %a)" ty.txt jkind_annotation annot + pp f "(type %s : %a)" ty.txt (jkind_annotation ctxt) annot and function_body ctxt f (x : Jane_syntax.N_ary_functions.function_body) = match x with @@ -2060,6 +2242,9 @@ and n_ary_function_expr function_params_then_body ctxt f params constraint_ body ~delimiter:"->") +and labeled_tuple_expr ctxt f (x : Jane_syntax.Labeled_tuples.expression) = + pp f "@[(%a)@]" (list (tuple_component ctxt) ~sep:",@;") x + (******************************************************************************) (* All exported functions must be defined or redefined below here and wrapped in [export_printer] in order to ensure they are invariant with respecto which @@ -2125,3 +2310,4 @@ let signature_item = print_reset_with_maximal_extensions signature_item let binding = print_reset_with_maximal_extensions binding let payload = print_reset_with_maximal_extensions payload let type_declaration = print_reset_with_maximal_extensions type_declaration +let jkind = print_reset_with_maximal_extensions jkind diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index 69d1c87199c..f32b9645eff 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -57,3 +57,6 @@ val tyvar: Format.formatter -> string -> unit (** Print a type variable name as a valid identifier, taking care of the special treatment required for the single quote character in second position, or for keywords by escaping them with \#. No-op on "_". *) + +val jkind : Format.formatter -> Jane_syntax.Jkind.t -> unit +val mode : Format.formatter -> Jane_syntax.Mode_expr.Const.t -> unit diff --git a/parsing/printast.ml b/parsing/printast.ml index 660ac155ab4..e82a38100b4 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -130,16 +130,10 @@ let arg_label i ppf = function | Optional s -> line i ppf "Optional \"%s\"\n" s | Labelled s -> line i ppf "Labelled \"%s\"\n" s -let tyvar ppf s = - if String.length s >= 2 && s.[1] = '\'' then - (* without the space, this would be parsed as - a character literal *) - Format.fprintf ppf "' %s" s - else - Format.fprintf ppf "'%s" s - let typevars ppf vs = - List.iter (fun x -> fprintf ppf " %a" tyvar x.txt) vs + List.iter (fun x -> fprintf ppf " '%s" x.txt) vs + (* Don't use Pprintast.tyvar, as that causes a dependency cycle with + Jane_syntax, which depends on this module for debugging. *) let rec core_type i ppf x = line i ppf "core_type %a\n" fmt_location x.ptyp_loc; @@ -396,6 +390,7 @@ and value_description i ppf x = x.pval_name fmt_location x.pval_loc; attributes i ppf x.pval_attributes; core_type (i+1) ppf x.pval_type; + modalities (i+1) ppf x.pval_modalities; list (i+1) string ppf x.pval_prim and type_parameter i ppf (x, _variance) = core_type i ppf x @@ -890,14 +885,25 @@ and constructor_decl i ppf constructor_arguments (i+1) ppf pcd_args; option (i+1) core_type ppf pcd_res +and modalities i ppf modalities = + list i string_loc ppf ( + List.map (Location.map (fun (Modality x) -> x)) modalities + ); + +and constructor_argument i ppf {pca_modalities; pca_type; pca_loc} = + line i ppf "%a\n" fmt_location pca_loc; + modalities (i+1) ppf pca_modalities; + core_type (i+1) ppf pca_type + and constructor_arguments i ppf = function - | Pcstr_tuple l -> list i core_type ppf l + | Pcstr_tuple l -> list i constructor_argument ppf l | Pcstr_record l -> list i label_decl ppf l -and label_decl i ppf {pld_name; pld_mutable; pld_type; pld_loc; pld_attributes}= +and label_decl i ppf {pld_name; pld_mutable; pld_modalities; pld_type; pld_loc; pld_attributes}= line i ppf "%a\n" fmt_location pld_loc; attributes i ppf pld_attributes; line (i+1) ppf "%a\n" fmt_mutable_flag pld_mutable; + modalities (i+1) ppf pld_modalities; line (i+1) ppf "%a" fmt_string_loc pld_name; core_type (i+1) ppf pld_type @@ -991,4 +997,3 @@ let implementation ppf x = list 0 structure_item ppf x let top_phrase ppf x = toplevel_phrase 0 ppf x let constant = fmt_constant - diff --git a/parsing/printast.mli b/parsing/printast.mli index 35cc98ab1ee..f4ddc8bfaee 100644 --- a/parsing/printast.mli +++ b/parsing/printast.mli @@ -35,6 +35,3 @@ val payload: int -> formatter -> payload -> unit val core_type: int -> formatter -> core_type -> unit val extension_constructor: int -> formatter -> extension_constructor -> unit -val tyvar: Format.formatter -> string -> unit - (** Print a type variable name, taking care of the special treatment - required for the single quote character in second position. *) diff --git a/parsing/syntaxerr.ml b/parsing/syntaxerr.ml index af3e0ce5f79..c172f2796c5 100644 --- a/parsing/syntaxerr.ml +++ b/parsing/syntaxerr.ml @@ -25,6 +25,7 @@ type error = | Ill_formed_ast of Location.t * string | Invalid_package_type of Location.t * string | Removed_string_set of Location.t + | Missing_unboxed_literal_suffix of Location.t exception Error of error exception Escape_error @@ -39,53 +40,8 @@ let location_of_error = function | Invalid_package_type (l, _) | Expecting (l, _) | Removed_string_set l -> l + | Missing_unboxed_literal_suffix l -> l let ill_formed_ast loc s = raise (Error (Ill_formed_ast (loc, s))) - -let prepare_error err = - match err with - | Unclosed(opening_loc, opening, closing_loc, closing) -> - Location.errorf - ~loc:closing_loc - ~sub:[ - Location.msg ~loc:opening_loc - "This '%s' might be unmatched" opening - ] - "Syntax error: '%s' expected" closing - - | Expecting (loc, nonterm) -> - Location.errorf ~loc "Syntax error: %s expected." nonterm - | Not_expecting (loc, nonterm) -> - Location.errorf ~loc "Syntax error: %s not expected." nonterm - | Applicative_path loc -> - Location.errorf ~loc - "Syntax error: applicative paths of the form F(X).t \ - are not supported when the option -no-app-func is set." - | Variable_in_scope (loc, var) -> - Location.errorf ~loc - "In this scoped type, variable %a \ - is reserved for the local type %s." - Printast.tyvar var var - | Other loc -> - Location.errorf ~loc "Syntax error" - | Ill_formed_ast (loc, s) -> - Location.errorf ~loc - "broken invariant in parsetree: %s" s - | Invalid_package_type (loc, s) -> - Location.errorf ~loc "invalid package type: %s" s - | Removed_string_set loc -> - Location.errorf ~loc - "Syntax error: strings are immutable, there is no assignment \ - syntax for them.\n\ - @{Hint@}: Mutable sequences of bytes are available in \ - the Bytes module.\n\ - @{Hint@}: Did you mean to use 'Bytes.set'?" - -let () = - Location.register_error_of_exn - (function - | Error err -> Some (prepare_error err) - | _ -> None - ) diff --git a/parsing/syntaxerr.mli b/parsing/syntaxerr.mli index 577d5360cdf..6614a017060 100644 --- a/parsing/syntaxerr.mli +++ b/parsing/syntaxerr.mli @@ -30,6 +30,7 @@ type error = | Ill_formed_ast of Location.t * string | Invalid_package_type of Location.t * string | Removed_string_set of Location.t + | Missing_unboxed_literal_suffix of Location.t exception Error of error exception Escape_error diff --git a/runtime/alloc.c b/runtime/alloc.c index 37e285ac107..02568749581 100644 --- a/runtime/alloc.c +++ b/runtime/alloc.c @@ -30,33 +30,42 @@ #include "caml/fiber.h" #include "caml/domain.h" -CAMLexport value caml_alloc (mlsize_t wosize, tag_t tag) +CAMLexport value caml_alloc_with_reserved (mlsize_t wosize, tag_t tag, + reserved_t reserved) { value result; mlsize_t i; - CAMLassert (tag < 256); + // Optimization: for mixed blocks, don't fill in non-scannable fields + mlsize_t scannable_wosize = Scannable_wosize_reserved(reserved, wosize); + + CAMLassert (tag < Num_tags); CAMLassert (tag != Infix_tag); if (wosize <= Max_young_wosize){ if (wosize == 0){ result = Atom (tag); }else{ Caml_check_caml_state(); - Alloc_small (result, wosize, tag, Alloc_small_enter_GC); + Alloc_small_with_reserved (result, wosize, tag, Alloc_small_enter_GC, + reserved); if (tag < No_scan_tag){ - for (i = 0; i < wosize; i++) Field (result, i) = Val_unit; + for (i = 0; i < scannable_wosize; i++) Field (result, i) = Val_unit; } } } else { - result = caml_alloc_shr (wosize, tag); + result = caml_alloc_shr_reserved (wosize, tag, reserved); if (tag < No_scan_tag) { - for (i = 0; i < wosize; i++) Field (result, i) = Val_unit; + for (i = 0; i < scannable_wosize; i++) Field (result, i) = Val_unit; } result = caml_check_urgent_gc (result); } return result; } +CAMLexport value caml_alloc (mlsize_t wosize, tag_t tag) { + return caml_alloc_with_reserved (wosize, tag, 0); +} + /* This is used by the native compiler for large block allocations. The resulting block can be filled with [caml_modify], or [caml_initialize], or direct writes for integer values and code pointers. @@ -65,14 +74,35 @@ CAMLexport value caml_alloc (mlsize_t wosize, tag_t tag) information (issue #11482). */ #ifdef NATIVE_CODE -CAMLexport value caml_alloc_shr_check_gc (mlsize_t wosize, tag_t tag) + +value caml_alloc_shr_reserved_check_gc (mlsize_t wosize, tag_t tag, + reserved_t reserved) { - CAMLassert(tag < No_scan_tag); + CAMLassert (tag < Num_tags); + CAMLassert (tag != Infix_tag); caml_check_urgent_gc (Val_unit); - value result = caml_alloc_shr (wosize, tag); - for (mlsize_t i = 0; i < wosize; i++) Field (result, i) = Val_unit; + value result = caml_alloc_shr_reserved (wosize, tag, reserved); + if (tag < No_scan_tag) { + mlsize_t scannable_wosize = Scannable_wosize_val(result); + for (mlsize_t i = 0; i < scannable_wosize; i++) { + Field (result, i) = Val_unit; + } + } return result; } + +CAMLexport value caml_alloc_shr_check_gc (mlsize_t wosize, tag_t tag) +{ + return caml_alloc_shr_reserved_check_gc(wosize, tag, 0); +} + +CAMLexport value caml_alloc_mixed_shr_check_gc (mlsize_t wosize, tag_t tag, + mlsize_t scannable_prefix_len) +{ + reserved_t reserved = + Reserved_mixed_block_scannable_wosize_native(scannable_prefix_len); + return caml_alloc_shr_reserved_check_gc(wosize, tag, reserved); +} #endif /* Copy the values to be preserved to a different array. @@ -155,7 +185,8 @@ CAMLexport value caml_alloc_9 (tag_t tag, value a, value b, value c, value d, Do_alloc_small(9, tag, a, b, c, d, e, f, g, h, i); } -CAMLexport value caml_alloc_small (mlsize_t wosize, tag_t tag) +CAMLexport value caml_alloc_small_with_reserved (mlsize_t wosize, tag_t tag, + reserved_t reserved) { value result; @@ -163,10 +194,16 @@ CAMLexport value caml_alloc_small (mlsize_t wosize, tag_t tag) CAMLassert (wosize <= Max_young_wosize); CAMLassert (tag < 256); CAMLassert (tag != Infix_tag); - Alloc_small (result, wosize, tag, Alloc_small_enter_GC); + Alloc_small_with_reserved (result, wosize, tag, Alloc_small_enter_GC, + reserved); return result; } +CAMLexport value caml_alloc_small (mlsize_t wosize, tag_t tag) +{ + return caml_alloc_small_with_reserved(wosize, tag, 0); +} + /* [n] is a number of words (fields) */ CAMLexport value caml_alloc_tuple(mlsize_t n) { @@ -193,6 +230,20 @@ CAMLexport value caml_alloc_string (mlsize_t len) return result; } +/* [len] is a number of bytes (chars) */ +CAMLexport value caml_alloc_local_string (mlsize_t len) +{ + mlsize_t offset_index; + mlsize_t wosize = (len + sizeof (value)) / sizeof (value); + value result; + + result = caml_alloc_local(wosize, String_tag); + Field (result, wosize - 1) = 0; + offset_index = Bsize_wsize (wosize) - 1; + Byte (result, offset_index) = offset_index - len; + return result; +} + /* [len] is a number of bytes (chars) */ CAMLexport value caml_alloc_initialized_string (mlsize_t len, const char *p) { @@ -303,6 +354,32 @@ CAMLprim value caml_alloc_dummy_float (value size) return caml_alloc (wosize, 0); } +/* [size] is a [value] representing the number of fields. + [scannable_size] is a [value] representing the length of the prefix of + fields that contains pointer values. +*/ +CAMLprim value caml_alloc_dummy_mixed (value size, value scannable_size) +{ + mlsize_t wosize = Long_val(size); +#ifdef NATIVE_CODE + mlsize_t scannable_wosize = Long_val(scannable_size); + /* The below code runs for bytecode and native code, and critically assumes + that a double record field can be stored in one word. That's true both for + 32-bit and 64-bit bytecode (as a double record field in a mixed record is + always boxed), and for 64-bit native code (as the double record field is + stored flat, taking up 1 word). + */ + CAML_STATIC_ASSERT(Double_wosize == 1); + reserved_t reserved = + Reserved_mixed_block_scannable_wosize_native(scannable_wosize); +#else + /* [scannable_size] can't be used meaningfully in bytecode */ + (void)scannable_size; + reserved_t reserved = Faux_mixed_block_sentinel; +#endif // NATIVE_CODE + return caml_alloc_with_reserved (wosize, 0, reserved); +} + CAMLprim value caml_alloc_dummy_infix(value vsize, value voffset) { mlsize_t wosize = Long_val(vsize), offset = Long_val(voffset); @@ -312,7 +389,7 @@ CAMLprim value caml_alloc_dummy_infix(value vsize, value voffset) block contains no pointers into the heap. However, the block cannot be marshaled or hashed, because not all closinfo fields and infix header fields are correctly initialized. */ - Closinfo_val(v) = Make_closinfo(0, wosize); + Closinfo_val(v) = Make_closinfo(0, wosize, 1); if (offset > 0) { v += Bsize_wsize(offset); (((header_t *) (v)) [-1]) = Make_header(offset, Infix_tag, 0); @@ -363,14 +440,25 @@ CAMLprim value caml_update_dummy(value dummy, value newval) } else { CAMLassert (tag < No_scan_tag); CAMLassert (Tag_val(dummy) != Infix_tag); + CAMLassert (Reserved_val(dummy) == Reserved_val(newval)); Unsafe_store_tag_val(dummy, tag); size = Wosize_val(newval); CAMLassert (size == Wosize_val(dummy)); + mlsize_t scannable_size = Scannable_wosize_val(newval); + CAMLassert (scannable_size == Scannable_wosize_val(dummy)); /* See comment above why this is safe even if [tag == Closure_tag] - and some of the "values" being copied are actually code pointers. */ - for (i = 0; i < size; i++){ + and some of the "values" being copied are actually code pointers. + + This reasoning does not apply to arbitrary flat fields, which might have + the same shape as pointers into the minor heap, so we need to handle the + non-scannable suffix of mixed blocks specially. + */ + for (i = 0; i < scannable_size; i++){ caml_modify (&Field(dummy, i), Field(newval, i)); } + for (i = scannable_size; i < size; i++) { + Field(dummy, i) = Field(newval, i); + } } return Val_unit; } @@ -382,3 +470,13 @@ CAMLexport value caml_alloc_some(value v) Field(some, 0) = v; CAMLreturn(some); } + +CAMLprim value caml_atomic_make_contended(value v) +{ + CAMLparam1(v); + const mlsize_t sz = Wosize_bhsize(Cache_line_bsize); + value res = caml_alloc_shr(sz, 0); + caml_initialize(&Field(res, 0), v); + for (mlsize_t i = 1; i < sz; i++) Field(res, i) = Val_unit; + CAMLreturn(res); +} diff --git a/runtime/amd64.S b/runtime/amd64.S index 8dc9f81ec68..8b64f89b07c 100644 --- a/runtime/amd64.S +++ b/runtime/amd64.S @@ -145,15 +145,19 @@ /* struct c_stack_link */ #if defined(SYS_mingw64) || defined (SYS_cygwin) -#define Cstack_stack 32 -#define Cstack_sp 40 -#define Cstack_prev 48 -#define SIZEOF_C_STACK_LINK 56 +#define Cstack_stack 32 +#define Cstack_sp 40 +#define Cstack_prev 48 +#define Cstack_async_exn_handler 56 +#define SIZEOF_C_STACK_LINK 64 +#error "Asynchronous exceptions support for Windows isn't finished" #else -#define Cstack_stack 0 -#define Cstack_sp 8 -#define Cstack_prev 16 -#define SIZEOF_C_STACK_LINK 24 +#define Cstack_stack 0 +#define Cstack_sp 8 +#define Cstack_prev 16 +#define Cstack_async_exn_handler 24 +/* 8 bytes are left empty to ensure the stack is 16-aligned */ +#define SIZEOF_C_STACK_LINK 40 #endif /******************************************************************************/ @@ -400,11 +404,15 @@ #if defined(FUNCTION_SECTIONS) TEXT_SECTION(caml_hot.code_begin) .globl G(caml_hot.code_begin) + .globl G(caml_hot__code_begin) G(caml_hot.code_begin): +G(caml_hot__code_begin): TEXT_SECTION(caml_hot.code_end) .globl G(caml_hot.code_end) + .globl G(caml_hot__code_end) G(caml_hot.code_end): +G(caml_hot__code_end): #endif /******************************************************************************/ @@ -445,22 +453,22 @@ G(caml_system__code_begin): movq %r10, 10*8(%r15); \ /* %r11 is at 11*8(%r15); */ \ movq %rbp, 12*8(%r15); \ - movsd %xmm0, (0+13)*8(%r15); \ - movsd %xmm1, (1+13)*8(%r15); \ - movsd %xmm2, (2+13)*8(%r15); \ - movsd %xmm3, (3+13)*8(%r15); \ - movsd %xmm4, (4+13)*8(%r15); \ - movsd %xmm5, (5+13)*8(%r15); \ - movsd %xmm6, (6+13)*8(%r15); \ - movsd %xmm7, (7+13)*8(%r15); \ - movsd %xmm8, (8+13)*8(%r15); \ - movsd %xmm9, (9+13)*8(%r15); \ - movsd %xmm10, (10+13)*8(%r15); \ - movsd %xmm11, (11+13)*8(%r15); \ - movsd %xmm12, (12+13)*8(%r15); \ - movsd %xmm13, (13+13)*8(%r15); \ - movsd %xmm14, (14+13)*8(%r15); \ - movsd %xmm15, (15+13)*8(%r15) + movupd %xmm0, (0*16 + 13*8)(%r15); \ + movupd %xmm1, (1*16 + 13*8)(%r15); \ + movupd %xmm2, (2*16 + 13*8)(%r15); \ + movupd %xmm3, (3*16 + 13*8)(%r15); \ + movupd %xmm4, (4*16 + 13*8)(%r15); \ + movupd %xmm5, (5*16 + 13*8)(%r15); \ + movupd %xmm6, (6*16 + 13*8)(%r15); \ + movupd %xmm7, (7*16 + 13*8)(%r15); \ + movupd %xmm8, (8*16 + 13*8)(%r15); \ + movupd %xmm9, (9*16 + 13*8)(%r15); \ + movupd %xmm10, (10*16 + 13*8)(%r15); \ + movupd %xmm11, (11*16 + 13*8)(%r15); \ + movupd %xmm12, (12*16 + 13*8)(%r15); \ + movupd %xmm13, (13*16 + 13*8)(%r15); \ + movupd %xmm14, (14*16 + 13*8)(%r15); \ + movupd %xmm15, (15*16 + 13*8)(%r15) /* Undo SAVE_ALL_REGS. Expects gc_regs bucket in %r15 */ #define RESTORE_ALL_REGS \ @@ -482,22 +490,22 @@ G(caml_system__code_begin): movq 10*8(%r15),%r10; \ movq 11*8(%r15),%r11; \ movq 12*8(%r15),%rbp; \ - movsd (0+13)*8(%r15),%xmm0; \ - movsd (1+13)*8(%r15),%xmm1; \ - movsd (2+13)*8(%r15),%xmm2; \ - movsd (3+13)*8(%r15),%xmm3; \ - movsd (4+13)*8(%r15),%xmm4; \ - movsd (5+13)*8(%r15),%xmm5; \ - movsd (6+13)*8(%r15),%xmm6; \ - movsd (7+13)*8(%r15),%xmm7; \ - movsd (8+13)*8(%r15),%xmm8; \ - movsd (9+13)*8(%r15),%xmm9; \ - movsd (10+13)*8(%r15),%xmm10; \ - movsd (11+13)*8(%r15),%xmm11; \ - movsd (12+13)*8(%r15),%xmm12; \ - movsd (13+13)*8(%r15),%xmm13; \ - movsd (14+13)*8(%r15),%xmm14; \ - movsd (15+13)*8(%r15),%xmm15; \ + movupd (0*16 + 13*8)(%r15),%xmm0; \ + movupd (1*16 + 13*8)(%r15),%xmm1; \ + movupd (2*16 + 13*8)(%r15),%xmm2; \ + movupd (3*16 + 13*8)(%r15),%xmm3; \ + movupd (4*16 + 13*8)(%r15),%xmm4; \ + movupd (5*16 + 13*8)(%r15),%xmm5; \ + movupd (6*16 + 13*8)(%r15),%xmm6; \ + movupd (7*16 + 13*8)(%r15),%xmm7; \ + movupd (8*16 + 13*8)(%r15),%xmm8; \ + movupd (9*16 + 13*8)(%r15),%xmm9; \ + movupd (10*16 + 13*8)(%r15),%xmm10; \ + movupd (11*16 + 13*8)(%r15),%xmm11; \ + movupd (12*16 + 13*8)(%r15),%xmm12; \ + movupd (13*16 + 13*8)(%r15),%xmm13; \ + movupd (14*16 + 13*8)(%r15),%xmm14; \ + movupd (15*16 + 13*8)(%r15),%xmm15; \ movq Caml_state(young_ptr), %r15 FUNCTION(G(caml_call_realloc_stack)) @@ -514,10 +522,9 @@ CFI_STARTPROC RESTORE_ALL_REGS LEAVE_FUNCTION ret -1: RESTORE_ALL_REGS - LEA_VAR(caml_exn_Stack_overflow, %rax) - add $16, %rsp /* pop argument, retaddr */ - jmp GCALL(caml_raise_exn) +1: SWITCH_OCAML_TO_C + LEA_VAR(caml_exn_Stack_overflow, %rdi) + C_call (GCALL(caml_raise_async)) CFI_ENDPROC ENDFUNCTION(G(caml_call_realloc_stack)) @@ -538,6 +545,22 @@ LBL(caml_call_gc): CFI_ENDPROC ENDFUNCTION(G(caml_call_gc)) +FUNCTION(G(caml_raise_stack_overflow_nat)) +CFI_STARTPROC + CFI_SIGNAL_FRAME + SAVE_ALL_REGS + movq %r15, Caml_state(gc_regs) + /* We assume that we are always on the OCaml stack at this point. + The SIGSEGV handler doesn't actually check that the faulting + address lies in OCaml code, so it seems theoretically possible + for the code here to be reached via a segfault from C, but + in practice this seems most unlikely. The current situation will + suffice as this patch is only a temporary measure in any case. */ + SWITCH_OCAML_TO_C + CHECK_STACK_ALIGNMENT; jmp GCALL(caml_raise_stack_overflow) +CFI_ENDPROC +ENDFUNCTION(G(caml_raise_stack_overflow_nat)) + FUNCTION(G(caml_alloc1)) CFI_STARTPROC ENTER_FUNCTION @@ -581,6 +604,20 @@ CFI_STARTPROC CFI_ENDPROC ENDFUNCTION(G(caml_allocN)) +FUNCTION(G(caml_call_local_realloc)) +CFI_STARTPROC + CFI_SIGNAL_FRAME + ENTER_FUNCTION + SAVE_ALL_REGS + SWITCH_OCAML_TO_C + C_call (GCALL(caml_local_realloc)) + SWITCH_C_TO_OCAML + RESTORE_ALL_REGS + LEAVE_FUNCTION + ret +CFI_ENDPROC +ENDFUNCTION(G(caml_call_local_realloc)) + /******************************************************************************/ /* Call a C function from OCaml */ /******************************************************************************/ @@ -686,6 +723,8 @@ LBL(caml_start_program): movq $0, Cstack_sp(%rsp) movq Caml_state(c_stack), %r10 movq %r10, Cstack_prev(%rsp) + movq Caml_state(async_exn_handler), %r10 + movq %r10, Cstack_async_exn_handler(%rsp) movq %rsp, Caml_state(c_stack) CHECK_STACK_ALIGNMENT /* Load the OCaml stack. */ @@ -705,6 +744,7 @@ LBL(caml_start_program): movq Caml_state(exn_handler), %r11 movq %r11, 0(%r10) movq %r10, Caml_state(exn_handler) + movq %r10, Caml_state(async_exn_handler) /* Switch stacks and call the OCaml code */ movq %r10, %rsp #ifdef ASM_CFI_SUPPORTED @@ -714,7 +754,7 @@ LBL(caml_start_program): /* %rsp + 16 contains the C_STACK_SP */ \ DW_OP_breg + DW_REG_rsp, 16 /* exn handler */, DW_OP_deref, \ DW_OP_plus_uconst, \ - 24 /* struct c_stack_link */ + \ + SIZEOF_C_STACK_LINK /* struct c_stack_link */ + \ 6*8 /* callee save regs */ + \ 8 /* ret addr */ #endif @@ -736,6 +776,8 @@ LBL(108): movq Caml_state(c_stack), %rsp CFI_RESTORE_STATE /* Pop the struct c_stack_link */ + movq Cstack_async_exn_handler(%rsp), %r10 + movq %r10, Caml_state(async_exn_handler) movq Cstack_prev(%rsp), %r10 movq %r10, Caml_state(c_stack) addq $SIZEOF_C_STACK_LINK, %rsp; CFI_ADJUST(-SIZEOF_C_STACK_LINK) @@ -774,22 +816,17 @@ LBL(117): movq %rax, %r12 /* Save exception bucket */ movq Caml_state(c_stack), %rsp movq %rax, C_ARG_1 /* arg 1: exception bucket */ -#ifdef WITH_FRAME_POINTERS - movq 8(%r10), C_ARG_2 /* arg 2: pc of raise */ - leaq 16(%r10), C_ARG_3 /* arg 3: sp at raise */ -#else - movq (%r10), C_ARG_2 /* arg 2: pc of raise */ - leaq 8(%r10), C_ARG_3 /* arg 3: sp at raise */ -#endif - movq Caml_state(exn_handler), C_ARG_4 - /* arg 4: sp of handler */ - C_call (GCALL(caml_stash_backtrace)) + movq %r10, C_ARG_2 /* arg 2: passed rsp */ + movq Caml_state(exn_handler), C_ARG_3 + /* arg 3: sp of handler */ + C_call (GCALL(caml_stash_backtrace_wrapper)) movq %r12, %rax /* Recover exception bucket */ RESTORE_EXN_HANDLER_OCAML ret CFI_ENDPROC ENDFUNCTION(G(caml_raise_exn)) + FUNCTION(G(caml_reraise_exn)) CFI_STARTPROC ENTER_FUNCTION @@ -1032,6 +1069,14 @@ CFI_STARTPROC CFI_ENDPROC ENDFUNCTION(G(caml_ml_array_bound_error)) +FUNCTION(G(caml_ml_array_align_error)) +CFI_STARTPROC + ENTER_FUNCTION + LEA_VAR(caml_array_align_error_asm, %rax) + jmp LBL(caml_c_call) +CFI_ENDPROC +ENDFUNCTION(G(caml_ml_array_align_error)) + FUNCTION(G(caml_assert_stack_invariants)) CFI_STARTPROC /* CHECK_STACK_ALIGNMENT */ @@ -1054,14 +1099,14 @@ G(caml_system__code_end): .globl G(caml_system.frametable) .align EIGHT_ALIGN G(caml_system.frametable): - .quad 2 /* two descriptors */ - .quad LBL(108) /* return address into callback */ - .value -1 /* negative frame size => use callback link */ - .value 0 /* no roots here */ + .quad 2 /* two descriptors */ + .4byte LBL(108) - . /* return address into callback */ + .value -1 /* negative frame size => use callback link */ + .value 0 /* no roots here */ .align EIGHT_ALIGN - .quad LBL(frame_runstack) /* return address into fiber_val_handler */ - .value -1 /* negative frame size => use callback link */ - .value 0 /* no roots here */ + .4byte LBL(frame_runstack) - . /* return address into fiber_val_handler */ + .value -1 /* negative frame size => use callback link */ + .value 0 /* no roots here */ #if defined(SYS_macosx) .literal16 @@ -1078,6 +1123,14 @@ G(caml_negf_mask): .align SIXTEEN_ALIGN G(caml_absf_mask): .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF + .globl G(caml_negf32_mask) + .align SIXTEEN_ALIGN +G(caml_negf32_mask): + .quad 0x80000000, 0 + .globl G(caml_absf32_mask) + .align SIXTEEN_ALIGN +G(caml_absf32_mask): + .quad 0xFFFFFFFF7FFFFFFFL, 0xFFFFFFFFFFFFFFFF #if defined(SYS_linux) /* Mark stack as non-executable, PR#4564 */ diff --git a/runtime/amd64nt.asm b/runtime/amd64nt.asm index fea922e8a98..67fdca99e2e 100644 --- a/runtime/amd64nt.asm +++ b/runtime/amd64nt.asm @@ -25,7 +25,8 @@ EXTRN caml_apply3: NEAR EXTRN caml_program: NEAR EXTRN caml_array_bound_error_asm: NEAR - EXTRN caml_stash_backtrace: NEAR + EXTRN caml_array_align_error: NEAR + EXTRN caml_stash_backtrace: NEAR INCLUDE domain_state64.inc @@ -69,45 +70,45 @@ caml_call_gc: push rax Store_gc_regs rsp ; Save floating-point registers - sub rsp, 16*8 - movsd QWORD PTR [rsp + 0*8], xmm0 - movsd QWORD PTR [rsp + 1*8], xmm1 - movsd QWORD PTR [rsp + 2*8], xmm2 - movsd QWORD PTR [rsp + 3*8], xmm3 - movsd QWORD PTR [rsp + 4*8], xmm4 - movsd QWORD PTR [rsp + 5*8], xmm5 - movsd QWORD PTR [rsp + 6*8], xmm6 - movsd QWORD PTR [rsp + 7*8], xmm7 - movsd QWORD PTR [rsp + 8*8], xmm8 - movsd QWORD PTR [rsp + 9*8], xmm9 - movsd QWORD PTR [rsp + 10*8], xmm10 - movsd QWORD PTR [rsp + 11*8], xmm11 - movsd QWORD PTR [rsp + 12*8], xmm12 - movsd QWORD PTR [rsp + 13*8], xmm13 - movsd QWORD PTR [rsp + 14*8], xmm14 - movsd QWORD PTR [rsp + 15*8], xmm15 + sub rsp, 16*16 + movupd QWORD PTR [rsp + 0*16], xmm0 + movupd QWORD PTR [rsp + 1*16], xmm1 + movupd QWORD PTR [rsp + 2*16], xmm2 + movupd QWORD PTR [rsp + 3*16], xmm3 + movupd QWORD PTR [rsp + 4*16], xmm4 + movupd QWORD PTR [rsp + 5*16], xmm5 + movupd QWORD PTR [rsp + 6*16], xmm6 + movupd QWORD PTR [rsp + 7*16], xmm7 + movupd QWORD PTR [rsp + 8*16], xmm8 + movupd QWORD PTR [rsp + 9*16], xmm9 + movupd QWORD PTR [rsp + 10*16], xmm10 + movupd QWORD PTR [rsp + 11*16], xmm11 + movupd QWORD PTR [rsp + 12*16], xmm12 + movupd QWORD PTR [rsp + 13*16], xmm13 + movupd QWORD PTR [rsp + 14*16], xmm14 + movupd QWORD PTR [rsp + 15*16], xmm15 ; Call the garbage collector sub rsp, 32 ; PR#5008: bottom 32 bytes are reserved for callee call caml_garbage_collection add rsp, 32 ; PR#5008 ; Restore all regs used by the code generator - movsd xmm0, QWORD PTR [rsp + 0*8] - movsd xmm1, QWORD PTR [rsp + 1*8] - movsd xmm2, QWORD PTR [rsp + 2*8] - movsd xmm3, QWORD PTR [rsp + 3*8] - movsd xmm4, QWORD PTR [rsp + 4*8] - movsd xmm5, QWORD PTR [rsp + 5*8] - movsd xmm6, QWORD PTR [rsp + 6*8] - movsd xmm7, QWORD PTR [rsp + 7*8] - movsd xmm8, QWORD PTR [rsp + 8*8] - movsd xmm9, QWORD PTR [rsp + 9*8] - movsd xmm10, QWORD PTR [rsp + 10*8] - movsd xmm11, QWORD PTR [rsp + 11*8] - movsd xmm12, QWORD PTR [rsp + 12*8] - movsd xmm13, QWORD PTR [rsp + 13*8] - movsd xmm14, QWORD PTR [rsp + 14*8] - movsd xmm15, QWORD PTR [rsp + 15*8] - add rsp, 16*8 + movupd xmm0, QWORD PTR [rsp + 0*16] + movupd xmm1, QWORD PTR [rsp + 1*16] + movupd xmm2, QWORD PTR [rsp + 2*16] + movupd xmm3, QWORD PTR [rsp + 3*16] + movupd xmm4, QWORD PTR [rsp + 4*16] + movupd xmm5, QWORD PTR [rsp + 5*16] + movupd xmm6, QWORD PTR [rsp + 6*16] + movupd xmm7, QWORD PTR [rsp + 7*16] + movupd xmm8, QWORD PTR [rsp + 8*16] + movupd xmm9, QWORD PTR [rsp + 9*16] + movupd xmm10, QWORD PTR [rsp + 10*16] + movupd xmm11, QWORD PTR [rsp + 11*16] + movupd xmm12, QWORD PTR [rsp + 12*16] + movupd xmm13, QWORD PTR [rsp + 13*16] + movupd xmm14, QWORD PTR [rsp + 14*16] + movupd xmm15, QWORD PTR [rsp + 15*16] + add rsp, 16*16 pop rax pop rbx pop rdi @@ -423,16 +424,22 @@ caml_ml_array_bound_error: lea rax, caml_array_bound_error_asm jmp caml_c_call + PUBLIC caml_ml_array_align_error + ALIGN 16 +caml_ml_array_align_error: + lea rax, caml_array_align_error_asm + jmp caml_c_call + PUBLIC caml_system__code_end caml_system__code_end: .DATA - PUBLIC caml_system__frametable -caml_system__frametable LABEL QWORD - QWORD 1 ; one descriptor - QWORD L107 ; return address into callback - WORD -1 ; negative frame size => use callback link - WORD 0 ; no roots here + PUBLIC caml_system.frametable +caml_system.frametable LABEL QWORD + QWORD 1 ; one descriptor + DWORD L107 - THIS BYTE ; return address into callback + WORD -1 ; negative frame size => use callback link + WORD 0 ; no roots here ALIGN 8 PUBLIC caml_negf_mask @@ -445,4 +452,14 @@ caml_negf_mask LABEL QWORD caml_absf_mask LABEL QWORD QWORD 7FFFFFFFFFFFFFFFH, 0FFFFFFFFFFFFFFFFH + PUBLIC caml_negf32_mask + ALIGN 16 +caml_negf32_mask LABEL QWORD + QWORD 80000000H, 0 + + PUBLIC caml_absf32_mask + ALIGN 16 +caml_absf32_mask LABEL QWORD + QWORD FFFFFFFF7FFFFFFFH, 0FFFFFFFFFFFFFFFFH + END diff --git a/runtime/arm64.S b/runtime/arm64.S index 361d56fb943..cfcb85b3803 100644 --- a/runtime/arm64.S +++ b/runtime/arm64.S @@ -137,11 +137,15 @@ #if defined(FUNCTION_SECTIONS) TEXT_SECTION(caml_hot.code_begin) .globl G(caml_hot.code_begin) + .globl G(caml_hot__code_begin) G(caml_hot.code_begin): +G(caml_hot__code_begin): TEXT_SECTION(caml_hot.code_end) .globl G(caml_hot.code_end) + .globl G(caml_hot__code_end) G(caml_hot.code_end): +G(caml_hot__code_end): #endif #if defined(SYS_macosx) @@ -199,6 +203,7 @@ G(name): #define Cstack_sp(reg) [reg, #8] #define Cstack_sp_offset 8 #define Cstack_prev(reg) [reg, #16] +#define Cstack_async_exn_handler(reg) [reg, #24] /* struct stack_handler */ #define Handler_value(reg) [reg] @@ -348,7 +353,7 @@ FUNCTION(caml_call_realloc_stack) ldp x29, x30, [sp], 16 add sp, sp, 16 /* pop argument */ ADDRGLOBAL(x0, caml_exn_Stack_overflow) - b G(caml_raise_exn) + b G(caml_raise_async) CFI_ENDPROC END_FUNCTION(caml_call_realloc_stack) @@ -414,6 +419,29 @@ FUNCTION(caml_allocN) CFI_ENDPROC END_FUNCTION(caml_allocN) +/* Reallocate the locals stack. This is like caml_call_gc, above. */ +FUNCTION(caml_call_local_realloc) + CFI_STARTPROC +L(caml_call_local_realloc): + /* Save return address and frame pointer */ + CFI_OFFSET(29, -16) + CFI_OFFSET(30, -8) + stp x29, x30, [sp, -16]! + CFI_ADJUST(16) + add x29, sp, #0 + /* Store all registers (including ALLOC_PTR & TRAP_PTR) */ + SAVE_ALL_REGS + SWITCH_OCAML_TO_C + /* Call the runtime to reallocate the local stack */ + bl G(caml_local_realloc) + SWITCH_C_TO_OCAML + RESTORE_ALL_REGS + /* Free stack space and return to caller */ + ldp x29, x30, [sp], 16 + ret + CFI_ENDPROC + END_FUNCTION(caml_call_gc) + /* Call a C function from OCaml */ /* Function to call is in ADDITIONAL_ARG */ @@ -516,7 +544,9 @@ L(jump_to_caml): ldr ALLOC_PTR, Caml_state(young_ptr) /* Build (16-byte aligned) struct c_stack_link on the C stack */ ldr x8, Caml_state(c_stack) - stp x8, xzr, [sp, -16]! /* C_stack_prev, pad */ + ldr x9, Caml_state(async_exn_handler) + stp x8, x9, [sp, -16]! + /* C_stack_prev, C_stack_async_exn_handler */ CFI_ADJUST(16) stp xzr, xzr, [sp, -16]! /* C_stack_stack, C_stack_sp */ CFI_ADJUST(16) @@ -536,6 +566,10 @@ L(jump_to_caml): adr x10, L(trap_handler) stp x9, x10, [x8, -16]! mov TRAP_PTR, x8 + /* Note that the async exception handler chain always goes through + Caml_state, unlike the normal exception handler chain, which goes + through the TRAP_PTR register. */ + str x8, Caml_state(async_exn_handler) /* Switch stacks and call the OCaml code */ mov sp, x8 #ifdef ASM_CFI_SUPPORTED @@ -571,6 +605,9 @@ L(return_result): ldr x9, Caml_state(c_stack) mov sp, x9 CFI_RESTORE_STATE + /* Restore saved async exception pointer */ + ldr x8, Cstack_async_exn_handler(sp) + str x8, Caml_state(async_exn_handler) /* Pop the struct c_stack_link */ ldr x8, Cstack_prev(sp) add sp, sp, 32 @@ -923,14 +960,14 @@ G(caml_system__code_end): /* GC roots for callback */ OBJECT(caml_system.frametable) - .quad 2 /* two descriptors */ - .quad L(caml_retaddr) /* return address into callback */ - .short -1 /* negative frame size => use callback link */ - .short 0 /* no roots */ + .quad 2 /* two descriptors */ + .4byte L(caml_retaddr) - . /* return address into callback */ + .short -1 /* negative frame size => use callback link */ + .short 0 /* no roots */ .align 3 - .quad L(frame_runstack) /* return address into fiber handler */ - .short -1 /* negative frame size => use callback link */ - .short 0 /* no roots here */ + .4byte L(frame_runstack) - . /* return address into fiber handler */ + .short -1 /* negative frame size => use callback link */ + .short 0 /* no roots here */ .align 3 END_OBJECT(caml_system.frametable) diff --git a/runtime/array.c b/runtime/array.c index 5a850b49442..0e5409b0eaf 100644 --- a/runtime/array.c +++ b/runtime/array.c @@ -24,9 +24,84 @@ #include "caml/mlvalues.h" #include "caml/signals.h" #include "caml/runtime_events.h" +#include "caml/custom.h" static const mlsize_t mlsize_t_max = -1; +#define Max_array_wosize (Max_wosize) +#define Max_custom_array_wosize (Max_wosize - 1) +#define Max_unboxed_float_array_wosize (Max_array_wosize / (sizeof(double) / sizeof(intnat))) +#define Max_unboxed_int64_array_wosize (Max_custom_array_wosize / (sizeof(int64_t) / sizeof(intnat))) +#define Max_unboxed_int32_array_wosize (Max_custom_array_wosize * (sizeof(intnat) / sizeof(int32_t))) +#define Max_unboxed_nativeint_array_wosize (Max_custom_array_wosize) + +/* Unboxed arrays */ + +CAMLprim int caml_unboxed_array_no_polymorphic_compare(value v1, value v2) +{ + caml_failwith("Polymorphic comparison is not permitted for unboxed arrays"); +} + +CAMLprim intnat caml_unboxed_array_no_polymorphic_hash(value v) +{ + caml_failwith("Polymorphic hash is not permitted for unboxed arrays"); +} + +CAMLprim void caml_unboxed_array_serialize(value v, uintnat* bsize_32, uintnat* bsize_64) +{ + caml_failwith("Marshalling is not yet implemented for unboxed arrays"); +} + +CAMLprim uintnat caml_unboxed_array_deserialize(void* dst) +{ + caml_failwith("Marshalling is not yet implemented for unboxed arrays"); +} + +// Note: if polymorphic comparison and/or hashing are implemented for +// the int32 unboxed arrays, care needs to be taken with the last word +// when the array is of odd length -- this is not currently initialized. + +CAMLexport struct custom_operations caml_unboxed_int32_array_ops[2] = { + { "_unboxed_int32_even_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, + { "_unboxed_int32_odd_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, +}; + +CAMLexport struct custom_operations caml_unboxed_int64_array_ops = { + "_unboxed_int64_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default +}; + +CAMLexport struct custom_operations caml_unboxed_nativeint_array_ops = { + "_unboxed_nativeint_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default +}; + /* returns number of elements (either fields or floats) */ /* [ 'a array -> int ] */ CAMLexport mlsize_t caml_array_length(value array) @@ -64,7 +139,11 @@ CAMLprim value caml_floatarray_get(value array, value index) double d; value res; - CAMLassert (Tag_val(array) == Double_array_tag); + // [caml_floatarray_get] may be called on a floatarray + // or a mixed block. + CAMLassert ( Tag_val(array) == Double_array_tag + || index > Scannable_wosize_val(array) ); + if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) caml_array_bound_error(); d = Double_flat_field(array, idx); @@ -73,6 +152,26 @@ CAMLprim value caml_floatarray_get(value array, value index) return res; } +/* [ floatarray -> int -> local_ float ] */ +CAMLprim value caml_floatarray_get_local(value array, value index) +{ + intnat idx = Long_val(index); + double d; + value res; + + // [caml_floatarray_get] may be called on a floatarray + // or a mixed block. + CAMLassert ( Tag_val(array) == Double_array_tag + || index > Scannable_wosize_val(array) ); + + if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) + caml_array_bound_error(); + d = Double_flat_field(array, idx); + res = caml_alloc_local(Double_wosize, Double_tag); + Store_double_val(res, d); + return res; +} + /* [ 'a array -> int -> 'a ] */ CAMLprim value caml_array_get(value array, value index) { @@ -85,6 +184,18 @@ CAMLprim value caml_array_get(value array, value index) return caml_array_get_addr(array, index); } +/* [ local_ 'a array -> int -> local_ 'a ] */ +CAMLprim value caml_array_get_local(value array, value index) +{ +#ifdef FLAT_FLOAT_ARRAY + if (Tag_val(array) == Double_array_tag) + return caml_floatarray_get_local(array, index); +#else + CAMLassert (Tag_val(array) != Double_array_tag); +#endif + return caml_array_get_addr(array, index); +} + /* [ 'a array -> int -> 'a -> unit ] where 'a != float */ CAMLprim value caml_array_set_addr(value array, value index, value newval) { @@ -94,7 +205,20 @@ CAMLprim value caml_array_set_addr(value array, value index, value newval) return Val_unit; } -/* [ floatarray -> int -> float -> unit ] */ +/* [ local_ 'a array -> int -> local_ 'a -> unit ] where 'a != float + + Must be used carefully, as it can violate the "no forward pointers" + restriction on the local stack. */ +CAMLprim value caml_array_set_addr_local(value array, value index, value newval) +{ + intnat idx = Long_val(index); + if (idx < 0 || idx >= Wosize_val(array)) caml_array_bound_error(); + caml_modify_local(array, idx, newval); + return Val_unit; +} + +/* [ floatarray -> int -> float -> unit ] + [ local_ floatarray -> int -> local_ float -> unit ] */ CAMLprim value caml_floatarray_set(value array, value index, value newval) { intnat idx = Long_val(index); @@ -118,6 +242,22 @@ CAMLprim value caml_array_set(value array, value index, value newval) return caml_array_set_addr(array, index, newval); } +/* [ local_ 'a array -> int -> local_ 'a -> unit ] + + Must be used carefully, as it can violate the "no forward pointers" + restriction on the local stack if the array contains pointers (vs. [int]s or + unboxed floats). */ +CAMLprim value caml_array_set_local(value array, value index, value newval) +{ +#ifdef FLAT_FLOAT_ARRAY + if (Tag_val(array) == Double_array_tag) + return caml_floatarray_set(array, index, newval); +#else + CAMLassert (Tag_val(array) != Double_array_tag); +#endif + return caml_array_set_addr_local(array, index, newval); +} + /* [ floatarray -> int -> float ] */ CAMLprim value caml_floatarray_unsafe_get(value array, value index) { @@ -132,6 +272,20 @@ CAMLprim value caml_floatarray_unsafe_get(value array, value index) return res; } +/* [ floatarray -> int -> local_ float ] */ +CAMLprim value caml_floatarray_unsafe_get_local(value array, value index) +{ + intnat idx = Long_val(index); + double d; + value res; + + CAMLassert (Tag_val(array) == Double_array_tag); + d = Double_flat_field(array, idx); + res = caml_alloc_local(Double_wosize, Double_tag); + Store_double_val(res, d); + return res; +} + /* [ 'a array -> int -> 'a ] */ CAMLprim value caml_array_unsafe_get(value array, value index) { @@ -144,6 +298,18 @@ CAMLprim value caml_array_unsafe_get(value array, value index) return Field(array, Long_val(index)); } +/* [ local_ 'a array -> int -> local_ 'a ] */ +CAMLprim value caml_array_unsafe_get_local(value array, value index) +{ +#ifdef FLAT_FLOAT_ARRAY + if (Tag_val(array) == Double_array_tag) + return caml_floatarray_unsafe_get_local(array, index); +#else + CAMLassert (Tag_val(array) != Double_array_tag); +#endif + return Field(array, Long_val(index)); +} + /* [ 'a array -> int -> 'a -> unit ] where 'a != float */ static value caml_array_unsafe_set_addr(value array, value index,value newval) { @@ -152,7 +318,20 @@ static value caml_array_unsafe_set_addr(value array, value index,value newval) return Val_unit; } -/* [ floatarray -> int -> float -> unit ] */ +/* [ local_ 'a array -> int -> local_ 'a -> unit ] where 'a != float + + Must be used carefully, as it can violate the "no forward pointers" + restriction on the local stack. */ +static value caml_array_unsafe_set_addr_local(value array, value index, + value newval) +{ + intnat idx = Long_val(index); + caml_modify_local(array, idx, newval); + return Val_unit; +} + +/* [ floatarray -> int -> float -> unit ] + [ local_ floatarray -> int -> local_ float -> unit ] */ /* [MM]: [caml_array_unsafe_set_addr] has a fence for enforcing the OCaml memory model through its use of [caml_modify]. [MM] [TODO]: [caml_floatarray_unsafe_set] will also need a similar fence in @@ -177,6 +356,23 @@ CAMLprim value caml_array_unsafe_set(value array, value index, value newval) return caml_array_unsafe_set_addr(array, index, newval); } +/* [ local_ 'a array -> int -> local_ 'a -> unit ] + + Must be used carefully, as it can violate the "no forward pointers" + restriction on the local stack if the array contains pointers (vs. [int]s or + unboxed floats). */ +CAMLprim value caml_array_unsafe_set_local(value array, value index, + value newval) +{ +#ifdef FLAT_FLOAT_ARRAY + if (Tag_val(array) == Double_array_tag) + return caml_floatarray_unsafe_set(array, index, newval); +#else + CAMLassert (Tag_val(array) != Double_array_tag); +#endif + return caml_array_unsafe_set_addr_local(array, index, newval); +} + /* [len] is a [value] representing number of floats. */ /* [ int -> floatarray ] */ CAMLprim value caml_floatarray_create(value len) @@ -188,7 +384,7 @@ CAMLprim value caml_floatarray_create(value len) return Atom(0); else Alloc_small (result, wosize, Double_array_tag, Alloc_small_enter_GC); - }else if (wosize > Max_wosize) + }else if (wosize > Max_unboxed_float_array_wosize) caml_invalid_argument("Float.Array.create"); else { result = caml_alloc_shr (wosize, Double_array_tag); @@ -197,8 +393,14 @@ CAMLprim value caml_floatarray_create(value len) return caml_process_pending_actions_with_root(result); } +CAMLprim value caml_floatarray_create_local(value len) +{ + mlsize_t wosize = Long_val(len) * Double_wosize; + return caml_alloc_local (wosize, Double_array_tag); +} + /* [len] is a [value] representing number of words or floats */ -CAMLprim value caml_make_vect(value len, value init) +static value make_vect_gen(value len, value init, int local) { CAMLparam2 (len, init); CAMLlocal1 (res); @@ -213,20 +415,24 @@ CAMLprim value caml_make_vect(value len, value init) mlsize_t wsize; double d; d = Double_val(init); + if (size > Max_unboxed_float_array_wosize) caml_invalid_argument("Array.make"); wsize = size * Double_wosize; - if (wsize > Max_wosize) caml_invalid_argument("Array.make"); - res = caml_alloc(wsize, Double_array_tag); + res = local ? + caml_alloc_local(wsize, Double_array_tag) : + caml_alloc(wsize, Double_array_tag); for (i = 0; i < size; i++) { Store_double_flat_field(res, i, d); } #endif } else { - if (size <= Max_young_wosize) { + if (size > Max_array_wosize) caml_invalid_argument("Array.make"); + else if (local) { + res = caml_alloc_local(size, 0); + for (i = 0; i < size; i++) Field(res, i) = init; + } else if (size <= Max_young_wosize) { res = caml_alloc_small(size, 0); for (i = 0; i < size; i++) Field(res, i) = init; - } - else if (size > Max_wosize) caml_invalid_argument("Array.make"); - else { + } else { if (Is_block(init) && Is_young(init)) { /* We don't want to create so many major-to-minor references, so [init] is moved to the major heap by doing a minor GC. */ @@ -241,10 +447,21 @@ CAMLprim value caml_make_vect(value len, value init) } } /* Give the GC a chance to run, and run memprof callbacks */ - caml_process_pending_actions (); + if (!local) caml_process_pending_actions (); CAMLreturn (res); } + +CAMLprim value caml_make_vect(value len, value init) +{ + return make_vect_gen(len, init, 0); +} + +CAMLprim value caml_make_local_vect(value len, value init) +{ + return make_vect_gen(len, init, 1); +} + /* [len] is a [value] representing number of floats */ /* [ int -> float array ] */ CAMLprim value caml_make_float_vect(value len) @@ -268,13 +485,64 @@ CAMLprim value caml_make_float_vect(value len) #endif } +CAMLprim value caml_make_unboxed_int32_vect(value len) +{ + /* This is only used on 64-bit targets. */ + + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_int32_array_wosize) caml_invalid_argument("Array.make"); + + /* [num_fields] does not include the custom operations field. */ + mlsize_t num_fields = num_elements / 2 + num_elements % 2; + + return caml_alloc_custom(&caml_unboxed_int32_array_ops[num_elements % 2], + num_fields * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_int32_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_int32(0)); +} + +CAMLprim value caml_make_unboxed_int64_vect(value len) +{ + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_int64_array_wosize) caml_invalid_argument("Array.make"); + + struct custom_operations* ops = &caml_unboxed_int64_array_ops; + + return caml_alloc_custom(ops, num_elements * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_int64_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_int64(0)); +} + +CAMLprim value caml_make_unboxed_nativeint_vect(value len) +{ + /* This is only used on 64-bit targets. */ + + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_nativeint_array_wosize) caml_invalid_argument("Array.make"); + + struct custom_operations* ops = &caml_unboxed_nativeint_array_ops; + + return caml_alloc_custom(ops, num_elements * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_nativeint_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_nativeint(0)); +} + /* This primitive is used internally by the compiler to compile explicit array expressions. For float arrays when FLAT_FLOAT_ARRAY is true, it takes an array of boxed floats and returns the corresponding flat-allocated [float array]. In all other cases, it just returns its argument unchanged. */ -CAMLprim value caml_make_array(value init) +static value make_array_gen(value init, int local) { #ifdef FLAT_FLOAT_ARRAY CAMLparam1 (init); @@ -291,7 +559,9 @@ CAMLprim value caml_make_array(value init) CAMLreturn (init); } else { wsize = size * Double_wosize; - if (wsize <= Max_young_wosize) { + if (local) { + res = caml_alloc_local(wsize, Double_array_tag); + } else if (wsize <= Max_young_wosize) { res = caml_alloc_small(wsize, Double_array_tag); } else { res = caml_alloc_shr(wsize, Double_array_tag); @@ -301,7 +571,8 @@ CAMLprim value caml_make_array(value init) Store_double_flat_field(res, i, d); } /* run memprof callbacks */ - caml_process_pending_actions(); + if (!local) + caml_process_pending_actions(); CAMLreturn (res); } } @@ -310,6 +581,16 @@ CAMLprim value caml_make_array(value init) #endif } +CAMLprim value caml_make_array(value init) +{ + return make_array_gen(init, 0); +} + +CAMLprim value caml_make_array_local(value init) +{ + return make_array_gen(init, 1); +} + /* Blitting */ /* [wo_memmove] copies [nvals] values from [src] to [dst]. If there is a single @@ -359,6 +640,42 @@ CAMLprim value caml_floatarray_blit(value a1, value ofs1, value a2, value ofs2, return Val_unit; } +CAMLprim value caml_unboxed_int32_vect_blit(value a1, value ofs1, value a2, + value ofs2, value n) +{ + /* See memory model [MM] notes in memory.c */ + atomic_thread_fence(memory_order_acquire); + // Need to skip the custom_operations field + memmove((int32_t *)((uintnat *)a2 + 1) + Long_val(ofs2), + (int32_t *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(int32_t)); + return Val_unit; +} + +CAMLprim value caml_unboxed_int64_vect_blit(value a1, value ofs1, value a2, value ofs2, + value n) +{ + /* See memory model [MM] notes in memory.c */ + atomic_thread_fence(memory_order_acquire); + // Need to skip the custom_operations field + memmove((int64_t *)((uintnat *)a2 + 1) + Long_val(ofs2), + (int64_t *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(int64_t)); + return Val_unit; +} + +CAMLprim value caml_unboxed_nativeint_vect_blit(value a1, value ofs1, value a2, + value ofs2, value n) +{ + /* See memory model [MM] notes in memory.c */ + atomic_thread_fence(memory_order_acquire); + // Need to skip the custom_operations field + memmove((uintnat *)((uintnat *)a2 + 1) + Long_val(ofs2), + (uintnat *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(uintnat)); + return Val_unit; +} + CAMLprim value caml_array_blit(value a1, value ofs1, value a2, value ofs2, value n) { @@ -370,8 +687,8 @@ CAMLprim value caml_array_blit(value a1, value ofs1, value a2, value ofs2, return caml_floatarray_blit(a1, ofs1, a2, ofs2, n); #endif CAMLassert (Tag_val(a2) != Double_array_tag); - if (Is_young(a2)) { - /* Arrays of values, destination is in young generation. + if (Is_young(a2) || caml_is_stack(a2)) { + /* Arrays of values, destination is local or in young generation. Here too we can do a direct copy since this cannot create old-to-young pointers, nor mess up with the incremental major GC. Again, wo_memmove takes care of overlap. */ @@ -410,7 +727,8 @@ CAMLprim value caml_array_blit(value a1, value ofs1, value a2, value ofs2, static value caml_array_gather(intnat num_arrays, value arrays[/*num_arrays*/], intnat offsets[/*num_arrays*/], - intnat lengths[/*num_arrays*/]) + intnat lengths[/*num_arrays*/], + int local) { CAMLparamN(arrays, num_arrays); value res; /* no need to register it as a root */ @@ -437,9 +755,11 @@ static value caml_array_gather(intnat num_arrays, #ifdef FLAT_FLOAT_ARRAY else if (isfloat) { /* This is an array of floats. We can use memcpy directly. */ - if (size > Max_wosize/Double_wosize) caml_invalid_argument("Array.concat"); + if (size > Max_unboxed_float_array_wosize) caml_invalid_argument("Array.concat"); wsize = size * Double_wosize; - res = caml_alloc(wsize, Double_array_tag); + res = local ? + caml_alloc_local(wsize, Double_array_tag) : + caml_alloc(wsize, Double_array_tag); for (i = 0, pos = 0; i < num_arrays; i++) { /* [res] is freshly allocated, and no other domain has a reference to it. Hence, a plain [memcpy] is sufficient. */ @@ -451,10 +771,15 @@ static value caml_array_gather(intnat num_arrays, CAMLassert(pos == size); } #endif - else if (size <= Max_young_wosize) { - /* Array of values, small enough to fit in young generation. + else if (size > Max_array_wosize) { + /* Array of values, too big. */ + caml_invalid_argument("Array.concat"); + } else if (size <= Max_young_wosize || local) { + /* Array of values, local or small enough to fit in young generation. We can use memcpy directly. */ - res = caml_alloc_small(size, 0); + res = local ? + caml_alloc_local(size, 0) : + caml_alloc_small(size, 0); for (i = 0, pos = 0; i < num_arrays; i++) { /* [res] is freshly allocated, and no other domain has a reference to it. Hence, a plain [memcpy] is sufficient. */ @@ -464,10 +789,6 @@ static value caml_array_gather(intnat num_arrays, pos += lengths[i]; } CAMLassert(pos == size); - } - else if (size > Max_wosize) { - /* Array of values, too big. */ - caml_invalid_argument("Array.concat"); } else { /* Array of values, must be allocated in old generation and filled using caml_initialize. */ @@ -494,7 +815,15 @@ CAMLprim value caml_array_sub(value a, value ofs, value len) value arrays[1] = { a }; intnat offsets[1] = { Long_val(ofs) }; intnat lengths[1] = { Long_val(len) }; - return caml_array_gather(1, arrays, offsets, lengths); + return caml_array_gather(1, arrays, offsets, lengths, 0); +} + +CAMLprim value caml_array_sub_local(value a, value ofs, value len) +{ + value arrays[1] = { a }; + intnat offsets[1] = { Long_val(ofs) }; + intnat lengths[1] = { Long_val(len) }; + return caml_array_gather(1, arrays, offsets, lengths, 1); } CAMLprim value caml_array_append(value a1, value a2) @@ -502,10 +831,18 @@ CAMLprim value caml_array_append(value a1, value a2) value arrays[2] = { a1, a2 }; intnat offsets[2] = { 0, 0 }; intnat lengths[2] = { caml_array_length(a1), caml_array_length(a2) }; - return caml_array_gather(2, arrays, offsets, lengths); + return caml_array_gather(2, arrays, offsets, lengths, 0); } -CAMLprim value caml_array_concat(value al) +CAMLprim value caml_array_append_local(value a1, value a2) +{ + value arrays[2] = { a1, a2 }; + intnat offsets[2] = { 0, 0 }; + intnat lengths[2] = { caml_array_length(a1), caml_array_length(a2) }; + return caml_array_gather(2, arrays, offsets, lengths, 1); +} + +static value array_concat_gen(value al, int local) { #define STATIC_SIZE 16 value static_arrays[STATIC_SIZE], * arrays; @@ -542,7 +879,7 @@ CAMLprim value caml_array_concat(value al) lengths[i] = caml_array_length(Field(l, 0)); } /* Do the concatenation */ - res = caml_array_gather(n, arrays, offsets, lengths); + res = caml_array_gather(n, arrays, offsets, lengths, local); /* Free the extra storage if needed */ if (n > STATIC_SIZE) { caml_stat_free(arrays); @@ -552,6 +889,16 @@ CAMLprim value caml_array_concat(value al) return res; } +CAMLprim value caml_array_concat(value al) +{ + return array_concat_gen(al, 0); +} + +CAMLprim value caml_array_concat_local(value al) +{ + return array_concat_gen(al, 1); +} + CAMLprim value caml_array_fill(value array, value v_ofs, value v_len, @@ -574,7 +921,7 @@ CAMLprim value caml_array_fill(value array, } #endif fp = &Field(array, ofs); - if (Is_young(array)) { + if (Is_young(array) || caml_is_stack(array)) { for (; len > 0; len--, fp++) *fp = val; } else { int is_val_young_block = Is_block(val) && Is_young(val); @@ -584,7 +931,8 @@ CAMLprim value caml_array_fill(value array, *fp = val; if (Is_block(old)) { if (Is_young(old)) continue; - caml_darken(Caml_state, old, NULL); + if (caml_marking_started()) + caml_darken(Caml_state, old, NULL); } if (is_val_young_block) Ref_table_add(&Caml_state->minor_tables->major_ref, fp); @@ -593,3 +941,60 @@ CAMLprim value caml_array_fill(value array, } return Val_unit; } + +CAMLprim value caml_iarray_of_array(value a) +{ + return a; +} + +CAMLprim value caml_array_of_iarray(value a) +{ + return a; +} + +/* We need these pre-declared for [gen_primitives.sh] to work. */ +CAMLprim value caml_array_get_indexed_by_int64(value, value); +CAMLprim value caml_array_unsafe_get_indexed_by_int64(value, value); +CAMLprim value caml_array_set_indexed_by_int64(value, value, value); +CAMLprim value caml_array_unsafe_set_indexed_by_int64(value, value, value); + +CAMLprim value caml_array_get_indexed_by_int32(value, value); +CAMLprim value caml_array_unsafe_get_indexed_by_int32(value, value); +CAMLprim value caml_array_set_indexed_by_int32(value, value, value); +CAMLprim value caml_array_unsafe_set_indexed_by_int32(value, value, value); + +CAMLprim value caml_array_get_indexed_by_nativeint(value, value); +CAMLprim value caml_array_unsafe_get_indexed_by_nativeint(value, value); +CAMLprim value caml_array_set_indexed_by_nativeint(value, value, value); +CAMLprim value caml_array_unsafe_set_indexed_by_nativeint(value, value, value); + +#define CAMLprim_indexed_by(name, index_type, val_func) \ + CAMLprim value caml_array_get_indexed_by_##name(value array, value index) \ + { \ + index_type idx = val_func(index); \ + if (idx != Long_val(Val_long(idx))) caml_array_bound_error(); \ + return caml_array_get(array, Val_long(idx)); \ + } \ + CAMLprim value caml_array_unsafe_get_indexed_by_##name(value array, \ + value index) \ + { \ + return caml_array_unsafe_get(array, Val_long(val_func(index))); \ + } \ + CAMLprim value caml_array_set_indexed_by_##name(value array, \ + value index, \ + value newval) \ + { \ + index_type idx = val_func(index); \ + if (idx != Long_val(Val_long(idx))) caml_array_bound_error(); \ + return caml_array_set(array, Val_long(idx), newval); \ + } \ + CAMLprim value caml_array_unsafe_set_indexed_by_##name(value array, \ + value index, \ + value newval) \ + { \ + return caml_array_unsafe_set(array, Val_long(val_func(index)), newval); \ + } + +CAMLprim_indexed_by(int64, int64_t, Int64_val) +CAMLprim_indexed_by(int32, int32_t, Int32_val) +CAMLprim_indexed_by(nativeint, intnat, Nativeint_val) diff --git a/runtime/backtrace.c b/runtime/backtrace.c index bd4c5902368..7e10344dc14 100644 --- a/runtime/backtrace.c +++ b/runtime/backtrace.c @@ -278,7 +278,9 @@ CAMLprim value caml_convert_raw_backtrace(value bt) if (!caml_debug_info_available()) caml_failwith("No debug information available"); - for (i = 0, index = 0; i < Wosize_val(bt); ++i) + mlsize_t bt_size = Wosize_val(bt); + + for (i = 0, index = 0; i < bt_size; ++i) { debuginfo dbg; for (dbg = caml_debuginfo_extract(Backtrace_slot_val(Field(bt, i))); @@ -289,7 +291,7 @@ CAMLprim value caml_convert_raw_backtrace(value bt) array = caml_alloc(index, 0); - for (i = 0, index = 0; i < Wosize_val(bt); ++i) + for (i = 0, index = 0; i < bt_size; ++i) { debuginfo dbg; for (dbg = caml_debuginfo_extract(Backtrace_slot_val(Field(bt, i))); @@ -359,8 +361,9 @@ CAMLprim value caml_get_exception_backtrace(value unit) } else { backtrace = caml_get_exception_raw_backtrace(Val_unit); - arr = caml_alloc(Wosize_val(backtrace), 0); - for (i = 0; i < Wosize_val(backtrace); i++) { + mlsize_t backtrace_size = Wosize_val(backtrace); + arr = caml_alloc(backtrace_size, 0); + for (i = 0; i < backtrace_size; i++) { backtrace_slot slot = Backtrace_slot_val(Field(backtrace, i)); debuginfo dbg = caml_debuginfo_extract(slot); Store_field(arr, i, caml_convert_debuginfo(dbg)); diff --git a/runtime/backtrace_byt.c b/runtime/backtrace_byt.c index 765cd41c38e..e9acdfe7251 100644 --- a/runtime/backtrace_byt.c +++ b/runtime/backtrace_byt.c @@ -312,94 +312,110 @@ code_t caml_next_frame_pointer(value* stack_high, value ** sp, return NULL; } -/* Stores upto [max_frames_value] frames of the current call stack to - return to the user. This is used not in an exception-raising context, but - only when the user requests to save the trace (hopefully less often). - Instead of using a bounded buffer as [Caml_state->stash_backtrace], we first - traverse the stack to compute the right size, then allocate space for the - trace. */ - -static void get_callstack(value* sp, intnat trap_spoff, - struct stack_info* stack, - intnat max_frames, - code_t** trace, intnat* trace_size) +/* minimum size to allocate a backtrace (in slots) */ +#define MIN_BACKTRACE_SIZE 16 + +/* Stores up to [max_slots] backtrace slots of the current call stack + to return to the user in [*backtrace_p] (with the allocated size in + [*alloc_size_p]). Returns the number of frames stored. Instead of + using a bounded buffer as [Caml_state->stash_backtrace], we + dynamically grow the allocated space as required. */ + +static size_t get_callstack(value* sp, intnat trap_spoff, + struct stack_info* stack, + intnat max_slots, + backtrace_slot **backtrace_p, + size_t *alloc_size_p) { + backtrace_slot *backtrace = *backtrace_p; + size_t alloc_size = *alloc_size_p; struct stack_info* parent = Stack_parent(stack); value *stack_high = Stack_high(stack); - value* saved_sp = sp; - intnat saved_trap_spoff = trap_spoff; - CAMLnoalloc; - /* first compute the size of the trace */ - { - *trace_size = 0; - while (*trace_size < max_frames) { - code_t p = caml_next_frame_pointer(stack_high, &sp, &trap_spoff); - if (p == NULL) { - if (parent == NULL) break; - sp = parent->sp; - trap_spoff = Long_val(sp[0]); - stack_high = Stack_high(parent); - parent = Stack_parent(parent); - } else { - ++*trace_size; + size_t slots = 0; + while (slots < max_slots) { + code_t p = caml_next_frame_pointer(stack_high, &sp, &trap_spoff); + if (!p) { + if (!parent) break; + sp = parent->sp; + trap_spoff = Long_val(sp[0]); + stack_high = Stack_high(parent); + parent = Stack_parent(parent); + } else { + if (slots == alloc_size) { + size_t new_size = alloc_size ? alloc_size * 2 : MIN_BACKTRACE_SIZE; + backtrace = caml_stat_resize_noexc(backtrace, + sizeof(backtrace_slot) * new_size); + + if (!backtrace) { /* allocation failed */ + *backtrace_p = NULL; + *alloc_size_p = 0; + return 0; + } + alloc_size = new_size; } - } - } - - *trace = caml_stat_alloc(sizeof(code_t*) * *trace_size); - - sp = saved_sp; - parent = Stack_parent(stack); - stack_high = Stack_high(stack); - trap_spoff = saved_trap_spoff; - /* then collect the trace */ - { - uintnat trace_pos = 0; - - while (trace_pos < *trace_size) { - code_t p = caml_next_frame_pointer(stack_high, &sp, &trap_spoff); - if (p == NULL) { - sp = parent->sp; - trap_spoff = Long_val(sp[0]); - stack_high = Stack_high(parent); - parent = Stack_parent(parent); - } else { - (*trace)[trace_pos] = p; - ++trace_pos; - } + backtrace[slots++] = p; } } + *backtrace_p = backtrace; + *alloc_size_p = alloc_size; + return slots; } -static value alloc_callstack(code_t* trace, intnat trace_len) +static value alloc_callstack(backtrace_slot *trace, size_t slots) { CAMLparam0(); CAMLlocal1(callstack); int i; - callstack = caml_alloc(trace_len, 0); - for (i = 0; i < trace_len; i++) + callstack = caml_alloc(slots, 0); + for (i = 0; i < slots; i++) Store_field(callstack, i, Val_backtrace_slot(trace[i])); caml_stat_free(trace); CAMLreturn(callstack); } +/* Obtain up to [max_slots] of the callstack of the current domain, + * including parent fibers. The callstack is written into [*buffer_p], + * current size [*alloc_size_p], which should be reallocated (on the C + * heap) if required. Returns the number of slots obtained. + * + * [alloc_idx] is ignored, and must be negative (this interface is + * also used by the native-code runtime, in which [alloc_idx] is + * meaningful. + */ + +size_t caml_get_callstack(size_t max_slots, + backtrace_slot **buffer_p, + size_t *alloc_size_p, + ssize_t alloc_idx) +{ + CAMLassert(alloc_idx < 1); /* allocation indexes not used in bytecode */ + return get_callstack(Caml_state->current_stack->sp, + Caml_state->trap_sp_off, + Caml_state->current_stack, + max_slots, + buffer_p, alloc_size_p); +} + CAMLprim value caml_get_current_callstack (value max_frames_value) { - code_t* trace; - intnat trace_len; - get_callstack(Caml_state->current_stack->sp, Caml_state->trap_sp_off, - Caml_state->current_stack, Long_val(max_frames_value), - &trace, &trace_len); - return alloc_callstack(trace, trace_len); + backtrace_slot *backtrace = NULL; + size_t trace_size = 0; + size_t slots = get_callstack(Caml_state->current_stack->sp, + Caml_state->trap_sp_off, + Caml_state->current_stack, + Long_val(max_frames_value), + &backtrace, &trace_size); + return alloc_callstack(backtrace, slots); } CAMLprim value caml_get_continuation_callstack (value cont, value max_frames) { - code_t* trace; - intnat trace_len; + backtrace_slot *backtrace = NULL; + size_t trace_size = 0; + size_t slots; struct stack_info *stack; value *sp; @@ -407,12 +423,13 @@ CAMLprim value caml_get_continuation_callstack (value cont, value max_frames) { CAMLnoalloc; /* GC must not see the stack outside the cont */ sp = stack->sp; - get_callstack(sp, Long_val(sp[0]), stack, Long_val(max_frames), - &trace, &trace_len); + slots = get_callstack(sp, Long_val(sp[0]), + stack, Long_val(max_frames), + &backtrace, &trace_size); caml_continuation_replace(cont, stack); } - return alloc_callstack(trace, trace_len); + return alloc_callstack(backtrace, slots); } diff --git a/runtime/backtrace_nat.c b/runtime/backtrace_nat.c index e02825cd88a..b015d60f3fa 100644 --- a/runtime/backtrace_nat.c +++ b/runtime/backtrace_nat.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "caml/alloc.h" #include "caml/backtrace.h" @@ -82,12 +83,25 @@ void caml_free_backtrace_buffer(backtrace_slot *backtrace_buffer) { caml_stat_free(backtrace_buffer); } +/* A backtrace_slot is either a debuginfo or a frame_descr* */ +#define Slot_is_debuginfo(s) ((uintnat)(s) & 2) +#define Debuginfo_slot(s) ((debuginfo)((uintnat)(s) - 2)) +#define Slot_debuginfo(d) ((backtrace_slot)((uintnat)(d) + 2)) +#define Frame_descr_slot(s) ((frame_descr*)(s)) +#define Slot_frame_descr(f) ((backtrace_slot)(f)) + +static debuginfo debuginfo_extract(frame_descr *d, ssize_t alloc_idx); + /* Stores the return addresses contained in the given stack fragment into the backtrace array ; this version is performance-sensitive as it is called at each [raise] in a program compiled with [-g], so we preserved the global, statically bounded buffer of the old implementation -- before the more flexible - [caml_get_current_callstack] was implemented. */ + [caml_get_current_callstack] was implemented. + + TODO: Consider rewriting this to use get_callstack, so we only have + one body of code capturing callstacks. +*/ void caml_stash_backtrace(value exn, uintnat pc, char * sp, char* trapsp) { caml_domain_state* domain_state = Caml_state; @@ -119,108 +133,169 @@ void caml_stash_backtrace(value exn, uintnat pc, char * sp, char* trapsp) } } -/* Stores upto [max_frames_value] frames of the current call stack to - return to the user. This is used not in an exception-raising - context, but only when the user requests to save the trace - (hopefully less often). Instead of using a bounded buffer as - [caml_stash_backtrace], we first traverse the stack to compute the - right size, then allocate space for the trace. */ -static void get_callstack(struct stack_info* orig_stack, intnat max_frames, - frame_descr*** trace, intnat* trace_size) +void caml_stash_backtrace_wrapper(value exn, char* rsp, char* trapsp) { - intnat trace_pos; +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) + /* If we get an rsp that lies in the guard page, just do nothing - using rsp + * would trigger another segfault, and we are probably in the process of + * raising the exception from a segfault. In any case this behaviour seems + * consistent with runtime4, where no backtrace appears to be available at + * this point. */ + struct stack_info *block = Caml_state->current_stack; + int page_size = getpagesize(); + char* protected_low = Protected_stack_page(block, page_size); + char* protected_high = protected_low + page_size; + if ((rsp >= protected_low) && (rsp < protected_high)) { + return; + } +#endif + char* pc; + char* sp; +#ifdef WITH_FRAME_POINTERS + pc = rsp + 8; + sp = rsp + 16; +#else + pc = rsp; + sp = rsp + 8; +#endif + caml_stash_backtrace(exn, *((uintnat*) pc), sp, trapsp); +} + +/* minimum size to allocate a backtrace (in slots) */ +#define MIN_BACKTRACE_SIZE 16 + +/* Stores up to [max_slots] backtrace slots of the current call stack to + return to the user in [*backtrace_p] (with the allocated size in + [*alloc_size_p]). Returns the number of frames stored. Instead of + using a bounded buffer as [caml_stash_backtrace], we dynamically + grow the allocated space as required. */ +static size_t get_callstack(struct stack_info* stack, intnat max_slots, + ssize_t alloc_idx, + backtrace_slot **backtrace_p, + size_t *alloc_size_p) +{ + backtrace_slot *backtrace = *backtrace_p; + size_t alloc_size = *alloc_size_p; + size_t slots = 0; char *sp; uintnat pc; - caml_frame_descrs fds; + caml_frame_descrs fds = caml_get_frame_descrs(); CAMLnoalloc; - fds = caml_get_frame_descrs(); + caml_get_stack_sp_pc(stack, &sp, &pc); - /* first compute the size of the trace */ - { - struct stack_info* stack = orig_stack; - caml_get_stack_sp_pc(stack, &sp, &pc); - trace_pos = 0; - - while(1) { - frame_descr *descr = caml_next_frame_descriptor(fds, &pc, &sp, stack); - if (trace_pos >= max_frames) break; - if (descr == NULL) { - stack = Stack_parent(stack); - if (stack == NULL) break; - caml_get_stack_sp_pc(stack, &sp, &pc); - } else { - ++trace_pos; + while (slots < max_slots) { + frame_descr *descr = caml_next_frame_descriptor(fds, &pc, &sp, stack); + if (!descr) { + stack = Stack_parent(stack); + if (!stack) break; + caml_get_stack_sp_pc(stack, &sp, &pc); + } else { + if (slots == alloc_size) { + size_t new_size = alloc_size ? alloc_size * 2 : MIN_BACKTRACE_SIZE; + backtrace = caml_stat_resize_noexc(backtrace, + sizeof(backtrace_slot) * new_size); + + if (!backtrace) { /* allocation failed */ + *backtrace_p = NULL; + *alloc_size_p = 0; + return 0; + } + alloc_size = new_size; } - } - } - - *trace_size = trace_pos; - *trace = caml_stat_alloc(sizeof(frame_descr*) * trace_pos); - /* then collect the trace */ - { - struct stack_info* stack = orig_stack; - caml_get_stack_sp_pc(stack, &sp, &pc); - trace_pos = 0; - - while(1) { - frame_descr *descr = caml_next_frame_descriptor(fds, &pc, &sp, stack); - if (trace_pos >= max_frames) break; - if (descr == NULL) { - stack = Stack_parent(stack); - if (stack == NULL) break; - caml_get_stack_sp_pc(stack, &sp, &pc); - } else { - (*trace)[trace_pos] = descr; - ++trace_pos; + backtrace_slot slot = Slot_frame_descr(descr); + if (alloc_idx >= 0) { + debuginfo info = debuginfo_extract(descr, alloc_idx); + if (info) { + CAMLassert(((uintnat)info & 3) == 0); /* so we can tag it */ + slot = Slot_debuginfo(info); + } + alloc_idx = -1; } + backtrace[slots++] = slot; } } + + *alloc_size_p = alloc_size; + *backtrace_p = backtrace; + return slots; } -static value alloc_callstack(frame_descr** trace, intnat trace_len) +/* Obtain up to [max_slots] of the callstack of the current domain, + * including parent fibers. The callstack is written into [*buffer_p], + * current size [*alloc_size_p], which should be reallocated (on the C + * heap) if required. Returns the number of slots obtained. + * + * If [alloc_idx] is non-negative, then the backtrace is of an + * allocation point and may therefore include an initial entry of the + * allocation point itself. + */ + +size_t caml_get_callstack(size_t max_slots, + backtrace_slot **buffer_p, + size_t *alloc_size_p, + ssize_t alloc_idx) +{ + return get_callstack(Caml_state->current_stack, max_slots, + alloc_idx, + buffer_p, alloc_size_p); +} + +static value alloc_callstack(backtrace_slot* trace, size_t slots) { CAMLparam0(); CAMLlocal1(callstack); int i; - callstack = caml_alloc(trace_len, 0); - for (i = 0; i < trace_len; i++) + callstack = caml_alloc(slots, 0); + for (i = 0; i < slots; i++) Store_field(callstack, i, Val_backtrace_slot(trace[i])); caml_stat_free(trace); CAMLreturn(callstack); } -CAMLprim value caml_get_current_callstack (value max_frames_value) { - frame_descr** trace; - intnat trace_len; - get_callstack(Caml_state->current_stack, Long_val(max_frames_value), - &trace, &trace_len); - return alloc_callstack(trace, trace_len); +/* Create and return a [Printexc.raw_backtrace] of the current + * callstack, of up to [max_frames_value] entries. Includes parent + * fibers. + */ + +CAMLprim value caml_get_current_callstack (value max_frames_value) +{ + backtrace_slot *trace = NULL; + size_t trace_size = 0; + size_t slots = get_callstack(Caml_state->current_stack, + Long_val(max_frames_value), + -1, &trace, &trace_size); + return alloc_callstack(trace, slots); } +/* Create and return a [Printexc.raw_backtrace] of the callstack of + * the continuation [cont], of up to [max_frames_value] + * entries. Includes parent fibers. + */ + CAMLprim value caml_get_continuation_callstack (value cont, value max_frames) { - frame_descr** trace; - intnat trace_len; + backtrace_slot *trace = NULL; + size_t trace_size = 0; + size_t slots; struct stack_info* stack; stack = Ptr_val(caml_continuation_use(cont)); { CAMLnoalloc; - get_callstack(stack, max_frames, - &trace, &trace_len); + slots = get_callstack(stack, max_frames, -1, + &trace, &trace_size); caml_continuation_replace(cont, stack); } - return alloc_callstack(trace, trace_len); + return alloc_callstack(trace, slots); } -debuginfo caml_debuginfo_extract(backtrace_slot slot) +static debuginfo debuginfo_extract(frame_descr *d, ssize_t alloc_idx) { unsigned char* infoptr; uint32_t debuginfo_offset; - frame_descr * d = (frame_descr *)slot; /* The special frames marking returns from Caml to C are never returned by caml_next_frame_descriptor, so should never reach @@ -231,26 +306,46 @@ debuginfo caml_debuginfo_extract(backtrace_slot slot) return NULL; } /* Recover debugging info */ - infoptr = (unsigned char*)&d->live_ofs[d->num_live]; + infoptr = frame_end_of_live_ofs(d); if (frame_has_allocs(d)) { /* skip alloc_lengths */ infoptr += *infoptr + 1; /* align to 32 bits */ infoptr = Align_to(infoptr, uint32_t); - /* we know there's at least one valid debuginfo, - but it may not be the one for the first alloc */ - while (*(uint32_t*)infoptr == 0) { - infoptr += sizeof(uint32_t); + /* find debug info for this allocation */ + if (alloc_idx >= 0) { + infoptr += alloc_idx * sizeof(uint32_t); + if (*(uint32_t*)infoptr == 0) { + /* No debug info for this particular allocation */ + return NULL; + } + } else { + /* we know there's at least one valid debuginfo, + but it may not be the one for the first alloc */ + while (*(uint32_t*)infoptr == 0) { + infoptr += sizeof(uint32_t); + } } } else { /* align to 32 bits */ infoptr = Align_to(infoptr, uint32_t); + CAMLassert(alloc_idx == -1); } /* read offset to debuginfo */ debuginfo_offset = *(uint32_t*)infoptr; return (debuginfo)(infoptr + debuginfo_offset); } +debuginfo caml_debuginfo_extract(backtrace_slot slot) +{ + if (Slot_is_debuginfo(slot)) { + /* already a decoded debuginfo */ + return Debuginfo_slot(slot); + } else { + return debuginfo_extract(Frame_descr_slot(slot), -1); + } +} + debuginfo caml_debuginfo_next(debuginfo dbg) { uint32_t * infoptr; diff --git a/runtime/bigarray.c b/runtime/bigarray.c index dc7553453a1..d36fbf94835 100644 --- a/runtime/bigarray.c +++ b/runtime/bigarray.c @@ -90,7 +90,7 @@ CAMLexport value caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim) { uintnat num_elts, asize, size; - int i, is_managed; + int i; value res; struct caml_ba_array * b; intnat dimcopy[CAML_BA_MAX_NUM_DIMS]; @@ -98,23 +98,23 @@ caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim) CAMLassert(num_dims >= 0 && num_dims <= CAML_BA_MAX_NUM_DIMS); CAMLassert((flags & CAML_BA_KIND_MASK) <= CAML_BA_CHAR); for (i = 0; i < num_dims; i++) dimcopy[i] = dim[i]; - num_elts = 1; - for (i = 0; i < num_dims; i++) { - if (caml_umul_overflow(num_elts, dimcopy[i], &num_elts)) - caml_raise_out_of_memory(); - } - if (caml_umul_overflow(num_elts, - caml_ba_element_size[flags & CAML_BA_KIND_MASK], - &size)) - caml_raise_out_of_memory(); + size = 0; if (data == NULL) { + num_elts = 1; + for (i = 0; i < num_dims; i++) { + if (caml_umul_overflow(num_elts, dimcopy[i], &num_elts)) + caml_raise_out_of_memory(); + } + if (caml_umul_overflow(num_elts, + caml_ba_element_size[flags & CAML_BA_KIND_MASK], + &size)) + caml_raise_out_of_memory(); data = malloc(size); if (data == NULL && size != 0) caml_raise_out_of_memory(); flags |= CAML_BA_MANAGED; } asize = SIZEOF_BA_ARRAY + num_dims * sizeof(intnat); - is_managed = ((flags & CAML_BA_MANAGED_MASK) == CAML_BA_MANAGED); - res = caml_alloc_custom_mem(&caml_ba_ops, asize, is_managed ? size : 0); + res = caml_alloc_custom_mem(&caml_ba_ops, asize, size); b = Caml_ba_array_val(res); b->data = data; b->num_dims = num_dims; @@ -525,7 +525,7 @@ CAMLprim value caml_ba_create(value vkind, value vlayout, value vdim) are within the bounds and return the offset of the corresponding array element in the data part of the array. */ -static intnat caml_ba_offset(struct caml_ba_array * b, intnat * index) +intnat caml_ba_offset(struct caml_ba_array * b, intnat * index) { intnat offset; int i; diff --git a/runtime/callback.c b/runtime/callback.c index 68df624aab8..e45599a2871 100644 --- a/runtime/callback.c +++ b/runtime/callback.c @@ -26,6 +26,7 @@ #include "caml/memory.h" #include "caml/mlvalues.h" #include "caml/platform.h" +#include "caml/signals.h" /* A note about callbacks and GC. For best performance, a callback such as [caml_callback_exn(value closure, value arg)] @@ -55,19 +56,37 @@ Caml_inline value alloc_and_clear_stack_parent(caml_domain_state* domain_state) { struct stack_info* parent_stack = Stack_parent(domain_state->current_stack); - value cont = caml_alloc_1(Cont_tag, Val_ptr(parent_stack)); - Stack_parent(domain_state->current_stack) = NULL; - return cont; + if (parent_stack == NULL) { + return Val_unit; + } else { + value cont = caml_alloc_1(Cont_tag, Val_ptr(parent_stack)); + Stack_parent(domain_state->current_stack) = NULL; + return cont; + } } Caml_inline void restore_stack_parent(caml_domain_state* domain_state, value cont) { - struct stack_info* parent_stack = Ptr_val(Op_val(cont)[0]); CAMLassert(Stack_parent(domain_state->current_stack) == NULL); - Stack_parent(domain_state->current_stack) = parent_stack; + if (Is_block(cont)) { + struct stack_info* parent_stack = Ptr_val(Op_val(cont)[0]); + Stack_parent(domain_state->current_stack) = parent_stack; + } } +static value raise_if_exception(value res) +{ + if (Is_exception_result(res)) { + if (Caml_state->raising_async_exn) { + Caml_state->raising_async_exn = 0; + caml_raise_async(Extract_exception(res)); + } else { + caml_raise(Extract_exception(res)); + } + } + return res; +} #ifndef NATIVE_CODE @@ -93,7 +112,9 @@ static void init_callback_code(void) callback_code_inited = 1; } -CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) +/* Functions that return all exceptions, including asynchronous ones */ + +static value caml_callbackN_exn0(value closure, int narg, value args[]) { CAMLparam0(); /* no need to register closure and args as roots, see below */ CAMLlocal1(cont); @@ -131,29 +152,75 @@ CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) CAMLreturn (res); } +CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) +{ + value res = caml_callbackN_exn0(closure, narg, args); + Caml_state->raising_async_exn = 0; + return res; +} + CAMLexport value caml_callback_exn(value closure, value arg1) { - value arg[1]; + value res, arg[1]; arg[0] = arg1; - return caml_callbackN_exn(closure, 1, arg); + res = caml_callbackN_exn0(closure, 1, arg); + Caml_state->raising_async_exn = 0; + return res; } CAMLexport value caml_callback2_exn(value closure, value arg1, value arg2) { - value arg[2]; + value res, arg[2]; arg[0] = arg1; arg[1] = arg2; - return caml_callbackN_exn(closure, 2, arg); + res = caml_callbackN_exn0(closure, 2, arg); + Caml_state->raising_async_exn = 0; + return res; } CAMLexport value caml_callback3_exn(value closure, - value arg1, value arg2, value arg3) + value arg1, value arg2, value arg3) +{ + value res, arg[3]; + arg[0] = arg1; + arg[1] = arg2; + arg[2] = arg3; + res = caml_callbackN_exn0(closure, 3, arg); + Caml_state->raising_async_exn = 0; + return res; +} + +/* Functions that propagate all exceptions, with any asynchronous exceptions + also being propagated asynchronously. */ + +CAMLexport value caml_callbackN(value closure, int narg, value args[]) +{ + return raise_if_exception(caml_callbackN_exn0(closure, narg, args)); +} + +CAMLexport value caml_callback(value closure, value arg1) +{ + value arg[1]; + arg[0] = arg1; + return caml_callbackN(closure, 1, arg); +} + +CAMLexport value caml_callback2(value closure, value arg1, value arg2) +{ + value arg[2]; + arg[0] = arg1; + arg[1] = arg2; + return caml_callbackN(closure, 2, arg); +} + +CAMLexport value caml_callback3(value closure, + value arg1, value arg2, value arg3) { value arg[3]; arg[0] = arg1; arg[1] = arg2; arg[2] = arg3; - return caml_callbackN_exn(closure, 3, arg); + return caml_callbackN(closure, 3, arg); } #else @@ -170,7 +237,7 @@ typedef value (callback_stub)(caml_domain_state* state, callback_stub caml_callback_asm, caml_callback2_asm, caml_callback3_asm; -CAMLexport value caml_callback_exn(value closure, value arg) +static value callback(value closure, value arg) { Caml_check_caml_state(); caml_domain_state* domain_state = Caml_state; @@ -198,12 +265,14 @@ CAMLexport value caml_callback_exn(value closure, value arg) } } -CAMLexport value caml_callback2_exn(value closure, value arg1, value arg2) +static value callback2(value closure, value arg1, value arg2) { Caml_check_caml_state(); caml_domain_state* domain_state = Caml_state; caml_maybe_expand_stack(); + CAMLassert(arg1 != 0); + if (Stack_parent(domain_state->current_stack)) { value cont, res; @@ -226,8 +295,7 @@ CAMLexport value caml_callback2_exn(value closure, value arg1, value arg2) } } -CAMLexport value caml_callback3_exn(value closure, - value arg1, value arg2, value arg3) +static value callback3(value closure, value arg1, value arg2, value arg3) { Caml_check_caml_state(); caml_domain_state* domain_state = Caml_state; @@ -255,7 +323,8 @@ CAMLexport value caml_callback3_exn(value closure, } } -CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) { +static value callbackN(value closure, int narg, value args[]) +{ while (narg >= 3) { /* We apply the first 3 arguments to get a new closure, and continue with the remaining arguments. */ @@ -266,7 +335,7 @@ CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) { in case a GC occurs during [caml_callback3_exn]. Arguments 0, 1 and 2 need not and should not be registered. */ Begin_roots_block(remaining_args, remaining_narg); - closure = caml_callback3_exn(closure, args[0], args[1], args[2]); + closure = callback3(closure, args[0], args[1], args[2]); End_roots(); if (Is_exception_result(closure)) return closure; @@ -278,37 +347,70 @@ CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) { case 0: return closure; case 1: - return caml_callback_exn(closure, args[0]); + return callback(closure, args[0]); default: /* case 2: */ - return caml_callback2_exn(closure, args[0], args[1]); + return callback2(closure, args[0], args[1]); } } -#endif +/* Functions that return all exceptions, including asynchronous ones */ + +CAMLexport value caml_callback_exn(value closure, value arg) +{ + value res = callback(closure, arg); + Caml_state->raising_async_exn = 0; + return res; +} + +CAMLexport value caml_callback2_exn(value closure, value arg1, value arg2) +{ + value res = callback2(closure, arg1, arg2); + Caml_state->raising_async_exn = 0; + return res; +} /* Exception-propagating variants of the above */ +CAMLexport value caml_callback3_exn(value closure, value arg1, value arg2, + value arg3) +{ + value res = callback3(closure, arg1, arg2, arg3); + Caml_state->raising_async_exn = 0; + return res; +} + +CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) +{ + value res = callbackN(closure, narg, args); + Caml_state->raising_async_exn = 0; + return res; +} + +/* Functions that propagate all exceptions, with any asynchronous exceptions + also being propagated asynchronously. */ CAMLexport value caml_callback (value closure, value arg) { - return caml_raise_if_exception(caml_callback_exn(closure, arg)); + return raise_if_exception(callback(closure, arg)); } CAMLexport value caml_callback2 (value closure, value arg1, value arg2) { - return caml_raise_if_exception(caml_callback2_exn(closure, arg1, arg2)); + return raise_if_exception(callback2(closure, arg1, arg2)); } CAMLexport value caml_callback3 (value closure, value arg1, value arg2, value arg3) { - return caml_raise_if_exception(caml_callback3_exn(closure, arg1, arg2, arg3)); + return raise_if_exception(callback3(closure, arg1, arg2, arg3)); } CAMLexport value caml_callbackN (value closure, int narg, value args[]) { - return caml_raise_if_exception(caml_callbackN_exn(closure, narg, args)); + return raise_if_exception(callbackN(closure, narg, args)); } +#endif + /* Naming of OCaml values */ struct named_value { @@ -392,3 +494,22 @@ CAMLexport void caml_iterate_named_values(caml_named_action f) } caml_plat_unlock(&named_value_lock); } + +CAMLprim value caml_with_async_exns(value body_callback) +{ + value res; + res = caml_callback_exn(body_callback, Val_unit); + + /* raised as a normal exn, even if it was asynchronous */ + if (Is_exception_result(res)) { + /* Drain the queue of pending actions. We may need to do + this several times if some raise */ + do { + res = Extract_exception(res); + res = caml_process_pending_actions_with_root_exn(res); + } while (Is_exception_result(res)); + caml_raise(res); + } + + return res; +} diff --git a/runtime/caml/alloc.h b/runtime/caml/alloc.h index 11339faf91f..550e72789e7 100644 --- a/runtime/caml/alloc.h +++ b/runtime/caml/alloc.h @@ -27,6 +27,7 @@ extern "C" { /* It is guaranteed that these allocation functions will not trigger any OCaml callback such as finalizers or signal handlers. */ +CAMLextern value caml_alloc_with_reserved (mlsize_t, tag_t, reserved_t); CAMLextern value caml_alloc (mlsize_t, tag_t); CAMLextern value caml_alloc_1(tag_t, value); CAMLextern value caml_alloc_2(tag_t, value, value); @@ -43,11 +44,15 @@ CAMLextern value caml_alloc_8(tag_t, value, value, value, value, CAMLextern value caml_alloc_9(tag_t, value, value, value, value, value, value, value, value, value); CAMLextern value caml_alloc_small (mlsize_t, tag_t); +CAMLextern value caml_alloc_small_with_reserved (mlsize_t, tag_t, reserved_t); CAMLextern value caml_alloc_shr_check_gc (mlsize_t, tag_t); +CAMLextern value caml_alloc_mixed_shr_check_gc (mlsize_t, tag_t, + mlsize_t scannable_wosize); CAMLextern value caml_alloc_tuple (mlsize_t); CAMLextern value caml_alloc_float_array (mlsize_t len); CAMLextern value caml_alloc_string (mlsize_t len); /* len in bytes (chars) */ CAMLextern value caml_alloc_initialized_string (mlsize_t len, const char *); +CAMLextern value caml_alloc_local_string (mlsize_t len); CAMLextern value caml_copy_string (char const *); CAMLextern value caml_copy_string_array (char const * const*); CAMLextern value caml_copy_double (double); diff --git a/runtime/caml/backtrace.h b/runtime/caml/backtrace.h index 00c3e92305d..9feefa09669 100644 --- a/runtime/caml/backtrace.h +++ b/runtime/caml/backtrace.h @@ -114,6 +114,21 @@ extern void caml_stash_backtrace(value exn, value * sp, int reraise); CAMLextern void caml_load_main_debug_info(void); #endif +/* Obtain up to [max_slots] of the callstack of the current domain, + * including parent fibers. The callstack is written into [*buffer_p], + * current size [*alloc_size_p], which should be reallocated (on the C + * heap) if required. Returns the number of slots obtained. + * + * If [alloc_idx] is non-negative, then the backtrace is of an + * allocation point and may therefore include an initial entry of the + * allocation point itself. + */ + +extern size_t caml_get_callstack(size_t max_slots, + backtrace_slot **buffer_p, + size_t *alloc_size_p, + ssize_t alloc_idx); + /* Default (C-level) printer for backtraces. It is called if an * exception causes a termination of the program or of a thread. diff --git a/runtime/caml/config.h b/runtime/caml/config.h index b9133096dbf..b290cde4650 100644 --- a/runtime/caml/config.h +++ b/runtime/caml/config.h @@ -16,6 +16,9 @@ #ifndef CAML_CONFIG_H #define CAML_CONFIG_H +/* CR ocaml 5 all-runtime5: remove this and all uses of it */ +#define CAML_RUNTIME_5 + /* CAML_NAME_SPACE was introduced in OCaml 3.08 to declare compatibility with the newly caml_-prefixed names of C runtime functions and to disable the definition of compatibility macros for the un-prefixed names. The @@ -227,7 +230,7 @@ typedef uint64_t uintnat; #define Minor_heap_min (Max_young_wosize + 1) /* Default size of the minor zone. (words) */ -#define Minor_heap_def 262144 +#define Minor_heap_def 1048576 /* Minimum size increment when growing the heap (words). Must be a multiple of [Page_size / sizeof (value)]. */ @@ -237,7 +240,7 @@ typedef uint64_t uintnat; /* Default speed setting for the major GC. The heap will grow until the dead objects and the free list represent this percentage of the total size of live objects. */ -#define Percent_free_def 120 +#define Percent_free_def 160 /* Default setting for the major GC slice smoothing window: 1 (i.e. no smoothing) @@ -269,4 +272,17 @@ typedef uint64_t uintnat; /* Default size of runtime_events ringbuffers, in words, in powers of two */ #define Default_runtime_events_log_wsize 16 +/* Assumed size of cache line. This value can be bigger than the actual L1 + cache line size. Atomics allocated with aligned constructor are + memory-aligned this value to avoid false sharing of cache line. */ +#if defined(TARGET_s390x) + #define Cache_line_bsize 256 +#elif defined(TARGET_arm64) || defined(TARGET_power) + #define Cache_line_bsize 128 +#elif defined(TARGET_amd64) || defined(TARGET_riscv) + #define Cache_line_bsize 64 +#elif (!defined(NATIVE_CODE)) + #define Cache_line_bsize 64 +#endif + #endif /* CAML_CONFIG_H */ diff --git a/runtime/caml/custom.h b/runtime/caml/custom.h index e4b162c9bd8..e801e081ed3 100644 --- a/runtime/caml/custom.h +++ b/runtime/caml/custom.h @@ -36,6 +36,7 @@ struct custom_operations { int (*compare_ext)(value v1, value v2); const struct custom_fixed_length* fixed_length; }; +CAML_STATIC_ASSERT(sizeof(struct custom_operations) == CUSTOM_OPS_STRUCT_SIZE); #define custom_finalize_default NULL #define custom_compare_default NULL @@ -78,6 +79,7 @@ extern const struct custom_operations caml_nativeint_ops; extern const struct custom_operations caml_int32_ops; extern const struct custom_operations caml_int64_ops; extern const struct custom_operations caml_ba_ops; +extern const struct custom_operations caml_float32_ops; #endif /* CAML_INTERNALS */ #ifdef __cplusplus diff --git a/runtime/caml/domain.h b/runtime/caml/domain.h index 2edfae09c00..0b6c96fe667 100644 --- a/runtime/caml/domain.h +++ b/runtime/caml/domain.h @@ -66,6 +66,7 @@ void caml_handle_gc_interrupt(void); void caml_handle_incoming_interrupts(void); CAMLextern void caml_interrupt_self(void); +void caml_interrupt_all_for_signal(void); void caml_reset_young_limit(caml_domain_state *); CAMLextern void caml_reset_domain_lock(void); diff --git a/runtime/caml/domain_state.tbl b/runtime/caml/domain_state.tbl index 3c1760fa3ac..c9857416576 100644 --- a/runtime/caml/domain_state.tbl +++ b/runtime/caml/domain_state.tbl @@ -15,9 +15,15 @@ /**************************************************************************/ DOMAIN_STATE(atomic_uintnat, young_limit) -/* Minor heap limit. Typically young_limit == young_start, but this field is set - * by other domains to signal this domain by causing a spurious allocation - * failure. */ + +/* Minor heap limit. Typically [young_start] <= [young_limit] <= + * [young_end], but this field can be set atomically to UINTNAT_MAX by + * another thread (typically from another domain), or by the memory + * profiler, in order to interrupt this domain (by causing an + * allocation failure). Setting [young_limit] to UINTNAT_MAX can be + * done safely at any time whatsoever by any thread. To avoid races, + * setting [young_limit] to anything else than UINTNAT_MAX should only + * be done via [caml_reset_young_limit] by the domain itself. */ DOMAIN_STATE(value*, young_ptr) /* Minor heap pointer */ @@ -37,6 +43,15 @@ DOMAIN_STATE(struct stack_info*, current_stack) DOMAIN_STATE(void*, exn_handler) /* Pointer into the current stack */ +DOMAIN_STATE(char*, async_exn_handler) +/* Async exception pointer that points into the current stack */ + +/* Local allocations */ +DOMAIN_STATE(struct caml_local_arenas*, local_arenas) +DOMAIN_STATE(intnat, local_sp) +DOMAIN_STATE(void*, local_top) +DOMAIN_STATE(intnat, local_limit) + DOMAIN_STATE(int, action_pending) /* Whether we are due to start the processing of delayable pending actions. See runtime/signal.c. */ @@ -81,6 +96,9 @@ DOMAIN_STATE(struct caml_final_info*, final_info) DOMAIN_STATE(intnat, backtrace_pos) +DOMAIN_STATE(intnat, raising_async_exn) +/* Set when an async exn is raised, cleared when caught */ + DOMAIN_STATE(intnat, backtrace_active) DOMAIN_STATE(backtrace_slot*, backtrace_buffer) @@ -103,6 +121,8 @@ DOMAIN_STATE(int, parser_trace) DOMAIN_STATE(asize_t, minor_heap_wsz) +DOMAIN_STATE(intnat, in_minor_collection) + DOMAIN_STATE(struct caml_heap_state*, shared_heap) DOMAIN_STATE(int, id) @@ -150,7 +170,11 @@ DOMAIN_STATE(intnat, trap_sp_off) DOMAIN_STATE(intnat, trap_barrier_off) DOMAIN_STATE(int64_t, trap_barrier_block) DOMAIN_STATE(struct caml_exception_context*, external_raise) +DOMAIN_STATE(struct caml_exception_context*, external_raise_async) /* Bytecode TLS vars, not used for native code */ +DOMAIN_STATE(struct memprof_domain_s *, memprof) +DOMAIN_STATE(value *, memprof_young_trigger) + DOMAIN_STATE(extra_params_area, extra_params) /* This member must occur last, because it is an array, not a scalar */ diff --git a/runtime/caml/dune b/runtime/caml/dune index 5b6c7cb20d6..574b2777f61 100644 --- a/runtime/caml/dune +++ b/runtime/caml/dune @@ -21,9 +21,93 @@ (bash "cat %{h} | tr -d '\\r' | \ sed -n -e '/^ /s/ \\([A-Z]\\)/ \\&\\&lbl_\\1/gp' -e '/^}/q'")))) +(rule + (targets opnames.h) + (deps instruct.h ../../Makefile + ../../Makefile.common + ../../Makefile.config + ../../Makefile.build_config + ../../Makefile.config_if_required + ) + (action (run make -s -C ../.. COMPUTE_DEPS=false runtime/caml/opnames.h))) + (rule (targets version.h) (mode fallback) (action (with-stdout-to %{targets} (run %{dep:../../tools/make-version-header.sh} %{dep:../../VERSION})))) + +(install + (files + (address_class.h as caml/address_class.h) + (addrmap.h as caml/addrmap.h) + (alloc.h as caml/alloc.h) + (atomic_refcount.h as caml/atomic_refcount.h) + (backtrace_prim.h as caml/backtrace_prim.h) + (backtrace.h as caml/backtrace.h) + (bigarray.h as caml/bigarray.h) + (callback.h as caml/callback.h) + (camlatomic.h as caml/camlatomic.h) + (codefrag.h as caml/codefrag.h) + (compare.h as caml/compare.h) + (config.h as caml/config.h) + (custom.h as caml/custom.h) + (debugger.h as caml/debugger.h) + (domain_state.h as caml/domain_state.h) + (domain_state.tbl as caml/domain_state.tbl) + (domain.h as caml/domain.h) + (dynlink.h as caml/dynlink.h) + (exec.h as caml/exec.h) + (fail.h as caml/fail.h) + (fiber.h as caml/fiber.h) + (finalise.h as caml/finalise.h) + (fix_code.h as caml/fix_code.h) + (frame_descriptors.h as caml/frame_descriptors.h) + (gc_ctrl.h as caml/gc_ctrl.h) + (gc_stats.h as caml/gc_stats.h) + (gc.h as caml/gc.h) + (globroots.h as caml/globroots.h) + (hash.h as caml/hash.h) + (hooks.h as caml/hooks.h) + (instrtrace.h as caml/instrtrace.h) + (instruct.h as caml/instruct.h) + (interp.h as caml/interp.h) + (intext.h as caml/intext.h) + (io.h as caml/io.h) + (lf_skiplist.h as caml/lf_skiplist.h) + (jumptbl.h as caml/jumptbl.h) + (m.h as caml/m.h) + (major_gc.h as caml/major_gc.h) + (md5.h as caml/md5.h) + (memory.h as caml/memory.h) + (memprof.h as caml/memprof.h) + (minor_gc.h as caml/minor_gc.h) + (misc.h as caml/misc.h) + (mlvalues.h as caml/mlvalues.h) + (opnames.h as caml/opnames.h) + (osdeps.h as caml/osdeps.h) + (platform.h as caml/platform.h) + (prims.h as caml/prims.h) + (printexc.h as caml/printexc.h) + (reverse.h as caml/reverse.h) + (roots.h as caml/roots.h) + (runtime_events.h as caml/runtime_events.h) + (s.h as caml/s.h) + (shared_heap.h as caml/shared_heap.h) + (signals.h as caml/signals.h) + (sizeclasses.h as caml/sizeclasses.h) + (skiplist.h as caml/skiplist.h) + (stack.h as caml/stack.h) + (startup_aux.h as caml/startup_aux.h) + (startup.h as caml/startup.h) + (sync.h as caml/sync.h) + (sys.h as caml/sys.h) + (simd.h as caml/simd.h) + (float32.h as caml/float32.h) + (version.h as caml/version.h) + (weak.h as caml/weak.h) + (winsupport.h as caml/winsupport.h) + ) + (section lib) + (package ocaml_runtime_stdlib)) diff --git a/runtime/caml/exec.h b/runtime/caml/exec.h index 6d5ed7d7858..1326cfb50e9 100644 --- a/runtime/caml/exec.h +++ b/runtime/caml/exec.h @@ -60,7 +60,7 @@ struct exec_trailer { /* Magic number for this release */ -#define EXEC_MAGIC "Caml1999X033" +#define EXEC_MAGIC "Caml1999X532" #endif /* CAML_INTERNALS */ diff --git a/runtime/caml/fail.h b/runtime/caml/fail.h index 795e8cc1c60..e97f78268d5 100644 --- a/runtime/caml/fail.h +++ b/runtime/caml/fail.h @@ -73,7 +73,11 @@ struct caml_exception_context { int caml_is_special_exception(value exn); -CAMLextern value caml_raise_if_exception(value res); +CAMLextern value caml_raise_async_if_exception(value res, const char* where); + +CAMLnoreturn_start +CAMLextern void caml_raise_async(value res) +CAMLnoreturn_end; #endif /* CAML_INTERNALS */ @@ -145,6 +149,10 @@ CAMLnoreturn_start CAMLextern void caml_array_bound_error (void) CAMLnoreturn_end; +CAMLnoreturn_start +CAMLextern void caml_array_align_error (void) +CAMLnoreturn_end; + CAMLnoreturn_start CAMLextern void caml_raise_sys_blocked_io (void) CAMLnoreturn_end; diff --git a/runtime/caml/fiber.h b/runtime/caml/fiber.h index 43038530242..b829a765983 100644 --- a/runtime/caml/fiber.h +++ b/runtime/caml/fiber.h @@ -115,6 +115,8 @@ struct c_stack_link { /* OCaml return address */ void* sp; struct c_stack_link* prev; + char* async_exn_handler; + void* padding; /* for stack alignment in caml_start_program */ }; /* `gc_regs` and `gc_regs_buckets`. @@ -247,14 +249,15 @@ CAMLextern struct stack_info* caml_alloc_main_stack (uintnat init_wsize); void caml_scan_stack( scanning_action f, scanning_action_flags fflags, void* fdata, - struct stack_info* stack, value* v_gc_regs); + struct stack_info* stack, value* v_gc_regs, + struct caml_local_arenas* locals); struct stack_info* caml_alloc_stack_noexc(mlsize_t wosize, value hval, value hexn, value heff, int64_t id); /* try to grow the stack until at least required_size words are available. returns nonzero on success */ CAMLextern int caml_try_realloc_stack (asize_t required_wsize); -CAMLextern uintnat caml_get_init_stack_wsize(void); +CAMLextern uintnat caml_get_init_stack_wsize(int thread_stack_wsz); void caml_change_max_stack_size (uintnat new_max_wsize); void caml_maybe_expand_stack(void); CAMLextern void caml_free_stack(struct stack_info* stk); @@ -267,7 +270,8 @@ void caml_get_stack_sp_pc (struct stack_info* stack, char** sp /* out */, uintnat* pc /* out */); void caml_rewrite_exception_stack(struct stack_info *old_stack, - value** exn_ptr, struct stack_info *new_stack); + value** exn_ptr, value** async_exn_ptr, + struct stack_info *new_stack); #endif value caml_continuation_use (value cont); @@ -288,6 +292,16 @@ CAMLnoreturn_end; value caml_make_unhandled_effect_exn (value effect); +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) +// mmap does not seem to guarantee it will always return a page-aligned +// address as per some man pages from a few years ago (more recent man +// pages seem to indicate the alignment is guaranteed), hence the last +// part of the expression below to add an offset guaranteeing alignment +#define Protected_stack_page(block, page_size) \ + (((char*) (block)) + (page_size) + (page_size) - \ + ((uintnat) ((char*) (block)) % (page_size))) +#endif + #endif /* CAML_INTERNALS */ #endif /* CAML_FIBER_H */ diff --git a/runtime/caml/compact.h b/runtime/caml/float32.h similarity index 65% rename from runtime/caml/compact.h rename to runtime/caml/float32.h index c2022c9020c..e2ad2fa17d9 100644 --- a/runtime/caml/compact.h +++ b/runtime/caml/float32.h @@ -2,7 +2,8 @@ /* */ /* OCaml */ /* */ -/* Damien Doligez, projet Para, INRIA Rocquencourt */ +/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ +/* Max Slater, Jane Street */ /* */ /* Copyright 1996 Institut National de Recherche en Informatique et */ /* en Automatique. */ @@ -13,24 +14,13 @@ /* */ /**************************************************************************/ -#ifndef CAML_COMPACT_H -#define CAML_COMPACT_H +#ifndef CAML_FLOAT32_H +#define CAML_FLOAT32_H -#ifdef CAML_INTERNALS - -#include "config.h" -#include "misc.h" #include "mlvalues.h" -/* [caml_compact_heap] compacts the heap and optionally changes the - allocation policy. - if [new_allocation_policy] is -1, the policy is not changed. -*/ -void caml_compact_heap (intnat new_allocation_policy); - -void caml_compact_heap_maybe (double previous_overhead); -void caml_invert_root (value v, value *p); +#define Float32_val(v) (*((float *)Data_custom_val(v))) -#endif /* CAML_INTERNALS */ +CAMLextern value caml_copy_float32(float); -#endif /* CAML_COMPACT_H */ +#endif /* CAML_FLOAT32_H */ diff --git a/runtime/caml/frame_descriptors.h b/runtime/caml/frame_descriptors.h index 71142a55504..24240333454 100644 --- a/runtime/caml/frame_descriptors.h +++ b/runtime/caml/frame_descriptors.h @@ -58,9 +58,10 @@ #define FRAME_DESCRIPTOR_ALLOC 2 #define FRAME_DESCRIPTOR_FLAGS 3 #define FRAME_RETURN_TO_C 0xFFFF +#define FRAME_LONG_MARKER 0x7FFF typedef struct { - uintnat retaddr; + int32_t retaddr_rel; /* offset of return address from &retaddr_rel */ uint16_t frame_data; /* frame size and various flags */ uint16_t num_live; uint16_t live_ofs[1 /* num_live */]; @@ -76,20 +77,67 @@ typedef struct { debug_info itself to a debuginfo structure. */ } frame_descr; +typedef struct { + int32_t retaddr_rel; /* offset of return address from &retaddr_rel */ + uint16_t marker; /* FRAME_LONG_MARKER */ + uint16_t _pad; /* Ensure frame_data is 4-byte aligned */ + uint32_t frame_data; /* frame size and various flags */ + uint32_t num_live; + uint32_t live_ofs[1 /* num_live */]; + /* + If frame_has_allocs(), alloc lengths follow: + uint8_t num_allocs; + uint8_t alloc[num_allocs]; + + If frame_has_debug(), debug info follows (32-bit aligned): + uint32_t debug_info[frame_has_allocs() ? num_allocs : 1]; + + Debug info is stored as a relative offset, in bytes, from the + debug_info itself to a debuginfo structure. */ +} frame_descr_long; + Caml_inline bool frame_return_to_C(frame_descr *d) { - return d->frame_data == 0xFFFF; + return d->frame_data == FRAME_RETURN_TO_C; +} + +Caml_inline bool frame_is_long(frame_descr *d) { + CAMLassert(d && !frame_return_to_C(d)); + return (d -> frame_data == FRAME_LONG_MARKER); +} + +Caml_inline frame_descr_long *frame_as_long(frame_descr *d) { + frame_descr_long *dl = (frame_descr_long *) d; + return dl; } -Caml_inline uint16_t frame_size(frame_descr *d) { - return d->frame_data &~ FRAME_DESCRIPTOR_FLAGS; +Caml_inline uint32_t frame_data(frame_descr *d) { + if (frame_is_long(d)) { + frame_descr_long *dl = frame_as_long(d); + return (dl -> frame_data); + } else { + return (d -> frame_data); + } +} + +Caml_inline unsigned char *frame_end_of_live_ofs(frame_descr *d) { + if (frame_is_long(d)) { + frame_descr_long *dl = frame_as_long(d); + return ((unsigned char *)&dl->live_ofs[dl->num_live]); + } else { + return ((unsigned char *)&d->live_ofs[d->num_live]); + } +} + +Caml_inline uint32_t frame_size(frame_descr *d) { + return frame_data(d) &~ FRAME_DESCRIPTOR_FLAGS; } Caml_inline bool frame_has_allocs(frame_descr *d) { - return (d->frame_data & FRAME_DESCRIPTOR_ALLOC) != 0; + return (frame_data(d) & FRAME_DESCRIPTOR_ALLOC) != 0; } Caml_inline bool frame_has_debug(frame_descr *d) { - return (d->frame_data & FRAME_DESCRIPTOR_DEBUG) != 0; + return (frame_data(d) & FRAME_DESCRIPTOR_DEBUG) != 0; } /* Allocation lengths are encoded reduced by one, so values 0-255 mean @@ -105,6 +153,10 @@ Caml_inline bool frame_has_debug(frame_descr *d) { #define Hash_retaddr(addr, mask) \ (((uintnat)(addr) >> 3) & (mask)) +#define Retaddr_frame(d) \ + ((uintnat)&(d)->retaddr_rel + \ + (uintnat)(intnat)((d)->retaddr_rel)) + void caml_init_frame_descriptors(void); void caml_register_frametables(void **tables, int ntables); @@ -149,7 +201,9 @@ caml_frame_descrs caml_get_frame_descrs(void); frame_descr* caml_find_frame_descr(caml_frame_descrs fds, uintnat pc); -frame_descr * caml_next_frame_descriptor +/* Returns the next frame descriptor (or NULL if none is available), + and updates *pc and *sp to point to the following one. */ +frame_descr *caml_next_frame_descriptor (caml_frame_descrs fds, uintnat * pc, char ** sp, struct stack_info* stack); #endif /* CAML_INTERNALS */ diff --git a/runtime/caml/gc.h b/runtime/caml/gc.h index 663b89e8368..1af26350a81 100644 --- a/runtime/caml/gc.h +++ b/runtime/caml/gc.h @@ -32,4 +32,36 @@ #define Make_header(wosize, tag, color) \ Make_header_with_reserved(wosize, tag, color, 0) +#ifdef CAML_INTERNALS + + +#define Init_local_arena_bsize 4096 + +/* We allow the local stack to quadruple 19 times, which is virtually infinite. + Hardware limit will probably hit first (either out of address space on 32bit + systems, or out of physical memory on 64bit) + + 19 is the biggest number without triggering some compiler errors about + integer overflow during shifting; I don't know if overflow would actually + happen if I make the number bigger, but 19 corresponds to 1024TB and should + be sufficient for a very long time. */ +#define Max_local_arenas 19 + +struct caml_local_arena { + char* base; + uintnat length; + void* alloc_block; +}; +typedef struct caml_local_arenas { + int count; + intnat saved_sp; + intnat next_length; + struct caml_local_arena arenas[Max_local_arenas]; +} caml_local_arenas; + +/* Neither a valid header nor value */ +#define Local_uninit_hd Make_header(0, 0x42, NOT_MARKABLE) + +#endif /* CAML_INTERNALS */ + #endif /* CAML_GC_H */ diff --git a/runtime/caml/instruct.h b/runtime/caml/instruct.h index 50ebef7acb8..8d963b79ff0 100644 --- a/runtime/caml/instruct.h +++ b/runtime/caml/instruct.h @@ -62,8 +62,18 @@ enum instructions { RERAISE, RAISE_NOTRACE, GETSTRINGCHAR, PERFORM, RESUME, RESUMETERM, REPERFORMTERM, + MAKE_FAUX_MIXEDBLOCK, FIRST_UNIMPLEMENTED_OP}; +// Think carefully before adding a new bytecode instruction. In general, +// this makes the flambda-backend compiler less compatible with the +// OCaml ecosystem. Projects may need to be patched to build with +// flambda-backend. +// +// We added the [MAKE_FAUX_MIXEDBLOCK] instruction without making this +// consideration and it has turned out OK, but we might want to reverse +// this decision if we run into difficulty in the future. + #endif /* CAML_INTERNALS */ #endif /* CAML_INSTRUCT_H */ diff --git a/runtime/caml/intext.h b/runtime/caml/intext.h index 53138aea660..d10ea0e1fb8 100644 --- a/runtime/caml/intext.h +++ b/runtime/caml/intext.h @@ -98,6 +98,7 @@ #define OLD_CODE_CUSTOM 0x12 // no longer supported #define CODE_CUSTOM_LEN 0x18 #define CODE_CUSTOM_FIXED 0x19 +#define CODE_UNBOXED_INT64 0x1a #if ARCH_FLOAT_ENDIANNESS == 0x76543210 #define CODE_DOUBLE_NATIVE CODE_DOUBLE_BIG diff --git a/runtime/caml/io.h b/runtime/caml/io.h index 5adfaeecc01..3358855d189 100644 --- a/runtime/caml/io.h +++ b/runtime/caml/io.h @@ -105,6 +105,7 @@ CAMLextern void (*caml_channel_mutex_unlock) (struct channel *); CAMLextern void (*caml_channel_mutex_unlock_exn) (void); CAMLextern struct channel * caml_all_opened_channels; +CAMLextern caml_plat_mutex caml_all_opened_channels_mutex; #define Lock(channel) \ if (caml_channel_mutex_lock != NULL) (*caml_channel_mutex_lock)(channel) diff --git a/runtime/caml/m.h.in b/runtime/caml/m.h.in index f38404676e0..37d253a9733 100644 --- a/runtime/caml/m.h.in +++ b/runtime/caml/m.h.in @@ -78,6 +78,8 @@ #undef HEADER_RESERVED_BITS +#undef CUSTOM_OPS_STRUCT_SIZE + #undef ASM_CFI_SUPPORTED #undef WITH_FRAME_POINTERS @@ -97,3 +99,7 @@ #undef SUPPORTS_TREE_VECTORIZE #undef USE_MMAP_MAP_STACK + +#undef STACK_ALLOCATION + +#undef STACK_CHECKS_ENABLED diff --git a/runtime/caml/major_gc.h b/runtime/caml/major_gc.h index dbcd42126b8..6972102cced 100644 --- a/runtime/caml/major_gc.h +++ b/runtime/caml/major_gc.h @@ -19,6 +19,7 @@ #ifdef CAML_INTERNALS typedef enum { + Phase_sweep_main, Phase_sweep_and_mark_main, Phase_mark_final, Phase_sweep_ephe @@ -27,6 +28,8 @@ extern gc_phase_t caml_gc_phase; Caml_inline char caml_gc_phase_char(gc_phase_t phase) { switch (phase) { + case Phase_sweep_main: + return 'S'; case Phase_sweep_and_mark_main: return 'M'; case Phase_mark_final: @@ -38,6 +41,10 @@ Caml_inline char caml_gc_phase_char(gc_phase_t phase) { } } +Caml_inline int caml_marking_started(void) { + return caml_gc_phase != Phase_sweep_main; +} + intnat caml_opportunistic_major_work_available (void); void caml_opportunistic_major_collection_slice (intnat); /* auto-triggered slice from within the GC */ @@ -53,8 +60,10 @@ void caml_darken(void*, value, volatile value* ignored); void caml_darken_cont(value); void caml_mark_root(value, value*); void caml_empty_mark_stack(void); -void caml_finish_major_cycle(void); - +void caml_finish_major_cycle(int force_compaction); +#ifdef DEBUG +int caml_mark_stack_is_empty(void); +#endif /* Ephemerons and finalisers */ void caml_orphan_allocated_words(void); void caml_add_to_orphaned_ephe_list(struct caml_ephe_info* ephe_info); diff --git a/runtime/caml/memory.h b/runtime/caml/memory.h index 92afc722239..2f0fafcd4eb 100644 --- a/runtime/caml/memory.h +++ b/runtime/caml/memory.h @@ -36,11 +36,13 @@ extern "C" { CAMLextern value caml_alloc_shr (mlsize_t wosize, tag_t); CAMLextern value caml_alloc_shr_noexc(mlsize_t wosize, tag_t); CAMLextern value caml_alloc_shr_reserved (mlsize_t, tag_t, reserved_t); +CAMLextern value caml_alloc_local(mlsize_t, tag_t); CAMLextern void caml_adjust_gc_speed (mlsize_t, mlsize_t); CAMLextern void caml_alloc_dependent_memory (mlsize_t bsz); CAMLextern void caml_free_dependent_memory (mlsize_t bsz); CAMLextern void caml_modify (volatile value *, value); +CAMLextern void caml_modify_local (value obj, intnat i, value val); CAMLextern void caml_initialize (volatile value *, value); CAMLextern int caml_atomic_cas_field (value, intnat, value, value); CAMLextern value caml_check_urgent_gc (value); @@ -164,6 +166,7 @@ CAMLextern caml_stat_string caml_stat_strconcat(int n, ...); CAMLextern wchar_t* caml_stat_wcsconcat(int n, ...); #endif +CAMLextern int caml_is_stack(value); /* void caml_shrink_heap (char *); Only used in compact.c */ @@ -199,6 +202,9 @@ enum caml_alloc_small_flags { #define Alloc_small_enter_GC(dom_st, wosize) \ Alloc_small_enter_GC_flags(CAML_DO_TRACK | CAML_FROM_C, dom_st, wosize) +#define Alloc_small_enter_GC_no_track(dom_st, wosize) \ + Alloc_small_enter_GC_flags(CAML_DONT_TRACK | CAML_FROM_C, dom_st, wosize) + #define Alloc_small_with_reserved(result, wosize, tag, GC, reserved) do{ \ CAMLassert ((wosize) >= 1); \ CAMLassert ((tag_t) (tag) < 256); \ @@ -217,6 +223,9 @@ enum caml_alloc_small_flags { #define Alloc_small(result, wosize, tag, GC) \ Alloc_small_with_reserved(result, wosize, tag, GC, (uintnat)0) +CAMLextern caml_local_arenas* caml_get_local_arenas(caml_domain_state*); +CAMLextern void caml_set_local_arenas(caml_domain_state*, caml_local_arenas* s); + #endif /* CAML_INTERNALS */ struct caml__roots_block { @@ -268,6 +277,7 @@ struct caml__roots_block { */ #define CAMLparam0() \ + int caml__missing_CAMLreturn = 0; \ struct caml__roots_block** caml_local_roots_ptr = \ (DO_CHECK_CAML_STATE ? Caml_check_caml_state() : (void)0, \ &CAML_LOCAL_ROOTS); \ @@ -402,6 +412,7 @@ struct caml__roots_block { } #define CAMLdrop do{ \ + (void)caml__missing_CAMLreturn; \ *caml_local_roots_ptr = caml__frame; \ }while (0) @@ -418,7 +429,7 @@ struct caml__roots_block { #define CAMLreturn(result) CAMLreturnT(value, result) -#define CAMLnoreturn ((void) caml__frame) +#define CAMLnoreturn ((void) caml__missing_CAMLreturn, (void) caml__frame) /* convenience macro */ diff --git a/runtime/caml/memprof.h b/runtime/caml/memprof.h index 57fd6fead6c..11434ff1f38 100644 --- a/runtime/caml/memprof.h +++ b/runtime/caml/memprof.h @@ -22,36 +22,132 @@ #include "mlvalues.h" #include "roots.h" -extern void caml_memprof_set_suspended(int); +/*** Sample allocations ***/ -extern value caml_memprof_handle_postponed_exn(void); +/* [Gc.Memprof.allocation_source] */ -extern void caml_memprof_track_alloc_shr(value block); -extern void caml_memprof_track_custom(value block, mlsize_t bytes); -extern void caml_memprof_track_young(uintnat wosize, int from_caml, - int nallocs, unsigned char* alloc_lens); -extern void caml_memprof_track_interned(header_t* block, header_t* blockend); +enum { CAML_MEMPROF_SRC_NORMAL = 0, + CAML_MEMPROF_SRC_MARSHAL = 1, /* interning */ + CAML_MEMPROF_SRC_CUSTOM = 2 /* custom memory */ }; -extern void caml_memprof_renew_minor_sample(void); -extern value* caml_memprof_young_trigger; +/* Respond to the allocation of any block. Does not call callbacks. + * `block` is the allocated block, to be tracked by memprof if + * sampled. `allocated_words` is the number of words allocated, to be + * passed to the allocation callback. `sampled_words` is the number of + * words to use when computing the number of samples (this will + * normally be one more than `allocated words` due to the header word, + * but may not be for out-of-heap memory). `source` is one of the + * `CAML_MEMPROF_SRC_* constants above. */ -extern void caml_memprof_oldify_young_roots(void); -extern void caml_memprof_minor_update(void); -extern void caml_memprof_do_roots(scanning_action f); -extern void caml_memprof_update_clean_phase(void); -extern void caml_memprof_invert_tracked(void); +void caml_memprof_sample_block(value block, size_t allocated_words, + size_t sampled_words, int source); -CAMLextern struct caml_memprof_th_ctx caml_memprof_main_ctx; +/* Sample a minor heap "Comballoc" (combined allocation). Called when + * the memprof trigger is hit (before the allocation is actually + * performed, which may require a GC). `allocs` and `alloc_lens` + * describe the combined allocation. Runs allocation callbacks. */ -CAMLextern struct caml_memprof_th_ctx* caml_memprof_new_th_ctx(void); -CAMLextern void caml_memprof_leave_thread(void); -CAMLextern void caml_memprof_enter_thread(struct caml_memprof_th_ctx*); -CAMLextern void caml_memprof_delete_th_ctx(struct caml_memprof_th_ctx*); +extern void caml_memprof_sample_young(uintnat wosize, int from_caml, + int allocs, unsigned char* alloc_lens); -typedef void (*th_ctx_action)(struct caml_memprof_th_ctx*, void*); +/* Suspend or unsuspend sampling (for the current thread). */ -/* This hook is not modified after other domains are spawned. */ -extern void (*caml_memprof_th_ctx_iter_hook)(th_ctx_action, void*); +extern void caml_memprof_update_suspended(_Bool); + + +/*** GC interface ***/ + +/* Apply `f(fdata, r, &r)` to each GC root `r` within memprof data + * structures for the domain `state`. + * + * `fflags` is used to decide whether to only scan roots which may + * point to minor heaps (the `SCANNING_ONLY_YOUNG_VALUES` flag). + * + * If `weak` is false then only scan strong roots. If `weak` + * is true then also scan weak roots. + * + * If `global` is false then only scan roots for `state`. If `global` + * is true then also scan roots shared between all domains. */ + +extern void caml_memprof_scan_roots(scanning_action f, + scanning_action_flags fflags, + void* fdata, + caml_domain_state *state, + _Bool weak, + _Bool global); + +/* Update memprof data structures for the domain `state`, to reflect + * survival and promotion, after a minor GC is completed. + * + * If `global` is false then only update structures for `state`. If + * `global` is true then also update structures shared between all + * domains. */ + +extern void caml_memprof_after_minor_gc(caml_domain_state *state, _Bool global); + +/* Update memprof data structures for the domain `state`, to reflect + * survival, after a minor GC is completed. + * + * If `global` is false then only update structures for `state`. If + * `global` is true then also update structures shared between all + * domains. */ + +extern void caml_memprof_after_major_gc(caml_domain_state *state, _Bool global); + +/* Freshly computes state->memprof_young_trigger. *Does not* set the + * young limit. */ + +extern void caml_memprof_set_trigger(caml_domain_state *state); + +/*** Callbacks ***/ + +/* Run any pending callbacks for the current domain (or adopted from a + * terminated domain). */ + +extern value caml_memprof_run_callbacks_exn(void); + + +/*** Multi-domain support. ***/ + +/* Notify memprof of the creation of a new domain `domain`. If there + * was an existing domain (from which to inherit profiling behaviour), + * it is passed in `parent`. Called before the new domain allocates + * anything, and before the parent domain continues. Also creates + * memprof thread state for the initial thread of the domain. */ + +extern void caml_memprof_new_domain(caml_domain_state *parent, + caml_domain_state *domain); + +/* Notify memprof that the domain `domain` is terminating. Called + * after the last allocation by the domain. */ + +extern void caml_memprof_delete_domain(caml_domain_state *domain); + + +/*** Multi-thread support ***/ + +/* Opaque type of memprof state for a single thread. */ + +typedef struct memprof_thread_s *memprof_thread_t; + +/* Notify memprof that a new thread is being created. Returns a + * pointer to memprof state for the new thread. */ + +CAMLextern memprof_thread_t caml_memprof_new_thread(caml_domain_state *domain); + +/* Obtain the memprof state for the initial thread of a domain. Called + * when there is only one such thread. */ + +CAMLextern memprof_thread_t caml_memprof_main_thread(caml_domain_state *domain); + +/* Notify memprof that the current domain is switching to the given + * thread. */ + +CAMLextern void caml_memprof_enter_thread(memprof_thread_t); + +/* Notify memprof that the given thread is being deleted. */ + +CAMLextern void caml_memprof_delete_thread(memprof_thread_t); #endif diff --git a/runtime/caml/minor_gc.h b/runtime/caml/minor_gc.h index 5c691b84671..1feceab0910 100644 --- a/runtime/caml/minor_gc.h +++ b/runtime/caml/minor_gc.h @@ -27,6 +27,7 @@ #define caml_young_alloc_start Caml_state->young_start #define caml_young_alloc_end Caml_state->young_end #define caml_minor_heap_wsz Caml_state->minor_heap_wsz +#define caml_in_minor_collection Caml_state->in_minor_collection #define CAML_TABLE_STRUCT(t) { \ diff --git a/runtime/caml/misc.h b/runtime/caml/misc.h index a9790d8a77f..962e63c4f84 100644 --- a/runtime/caml/misc.h +++ b/runtime/caml/misc.h @@ -306,6 +306,10 @@ CAMLextern void caml_fatal_error (char *, ...) #endif CAMLnoreturn_end; +CAMLnoreturn_start +CAMLextern void caml_fatal_out_of_memory (void) +CAMLnoreturn_end; + /* Detection of available C built-in functions, the Clang way. */ #ifdef __has_builtin @@ -531,9 +535,11 @@ int caml_runtime_warnings_active(void); #define Debug_free_shrink Debug_tag (0x03) #define Debug_free_truncate Debug_tag (0x04) /* obsolete */ #define Debug_free_unused Debug_tag (0x05) +#define Debug_free_local Debug_tag (0x06) #define Debug_uninit_minor Debug_tag (0x10) #define Debug_uninit_major Debug_tag (0x11) #define Debug_uninit_align Debug_tag (0x15) +#define Debug_uninit_local Debug_tag (0x16) #define Debug_filler_align Debug_tag (0x85) #define Debug_pool_magic Debug_tag (0x99) diff --git a/runtime/caml/mlvalues.h b/runtime/caml/mlvalues.h index 595a1fad87d..6cdcc0a2493 100644 --- a/runtime/caml/mlvalues.h +++ b/runtime/caml/mlvalues.h @@ -105,8 +105,10 @@ For 64-bit architectures: +----------+--------+-------+-----+ bits 63 64-R 63-R 10 9 8 7 0 -where 0 <= R <= 31 is HEADER_RESERVED_BITS, set with the ---enable-reserved-header-bits=R argument to configure. +where 0 <= R <= 31 is HEADER_RESERVED_BITS. R is always +set to 8 for the flambda-backend compiler in order to support +mixed blocks. In the upstream compiler, R is set with the +--enable-reserved-header-bits=R argument. */ @@ -128,7 +130,7 @@ where 0 <= R <= 31 is HEADER_RESERVED_BITS, set with the #define Tag_hd(hd) ((tag_t) ((hd) & HEADER_TAG_MASK)) #define Hd_with_tag(hd, tag) (((hd) &~ HEADER_TAG_MASK) | (tag)) -#define Wosize_hd(hd) ((mlsize_t) (((hd) & HEADER_WOSIZE_MASK) \ +#define Allocated_wosize_hd(hd) ((mlsize_t) (((hd) & HEADER_WOSIZE_MASK) \ >> HEADER_WOSIZE_SHIFT)) /* A "clean" header, without reserved or color bits. */ @@ -148,6 +150,85 @@ where 0 <= R <= 31 is HEADER_RESERVED_BITS, set with the #endif + +/* Header bits reserved for mixed blocks */ + +#define Is_mixed_block_reserved(res) (((reserved_t)(res)) > 0) + +/* Native code versions of mixed block macros. + + The scannable size of a block is how many fields are values as opposed + to flat floats/ints/etc. This is different than the (normal) size of a + block for mixed blocks. + + The runtime has several functions that traverse over the structure of + an OCaml value. (e.g. polymorphic comparison, GC marking/sweeping) + All of these traversals must be written to have one of the following + properties: + - it's known that the input can never be a mixed block, + - it raises an exception on mixed blocks, or + - it uses the scannable size (not the normal size) to figure out which + fields to recursively descend into. + + Otherwise, the traversal could attempt to recursively descend into + a flat field, which could segfault (or worse). +*/ + +#define Scannable_wosize_val_native(val) (Scannable_wosize_hd (Hd_val (val))) +#define Reserved_mixed_block_scannable_wosize_native(sz) (((mlsize_t)(sz)) + 1) +#define Mixed_block_scannable_wosize_reserved_native(res) \ + (((reserved_t)(res)) - 1) + +Caml_inline mlsize_t Scannable_wosize_reserved_native(reserved_t res, + mlsize_t sz) { + return + Is_mixed_block_reserved(res) + ? Mixed_block_scannable_wosize_reserved_native(res) + : sz; +} + +Caml_inline mlsize_t Scannable_wosize_hd_native(header_t hd) { + reserved_t res = Reserved_hd(hd); + return + Is_mixed_block_reserved(res) + ? Mixed_block_scannable_wosize_reserved_native(res) + : Allocated_wosize_hd(hd); +} + +/* Bytecode versions of mixed block macros. + + Bytecode always uses the size of the block as the scannable size. That's + because bytecode doesn't represent mixed records as mixed blocks. They're + "faux mixed blocks", which are regular blocks with a sentinel value set + in the header bits. +*/ + +#define Scannable_wosize_hd_byte(hd) (Allocated_wosize_hd (hd)) +#define Scannable_wosize_val_byte(val) (Allocated_wosize_hd (Hd_val (val))) +Caml_inline mlsize_t Scannable_wosize_reserved_byte(reserved_t res, + mlsize_t size) { + (void)res; + return size; +} + +/* Users should specify whether they want to use the bytecode or native + versions of these macros. Internally to the runtime, the NATIVE_CODE + macro lets us make that determination, so we can define suffixless + versions of the mixed block macros. +*/ +#ifdef CAML_INTERNALS +#ifdef NATIVE_CODE +#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_native(r, s) +#define Scannable_wosize_hd(hd) Scannable_wosize_hd_native(hd) +#define Scannable_wosize_val(val) Scannable_wosize_val_native(val) +#else +#define Faux_mixed_block_sentinel ((reserved_t) 0xff) +#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_byte(r, s) +#define Scannable_wosize_hd(hd) Scannable_wosize_hd_byte(hd) +#define Scannable_wosize_val(val) Scannable_wosize_val_byte(val) +#endif // NATIVE_CODE +#endif // CAML_INTERNALS + /* Color values are pre-shifted */ #define Color_hd(hd) ((hd) & HEADER_COLOR_MASK) @@ -171,10 +252,6 @@ where 0 <= R <= 31 is HEADER_RESERVED_BITS, set with the #define Num_tags (1ull << HEADER_TAG_BITS) #define Max_wosize ((1ull << HEADER_WOSIZE_BITS) - 1ull) -#define Wosize_val(val) (Wosize_hd (Hd_val (val))) -#define Wosize_op(op) (Wosize_val (op)) -#define Wosize_bp(bp) (Wosize_val (bp)) -#define Wosize_hp(hp) (Wosize_hd (Hd_hp (hp))) #define Whsize_wosize(sz) ((sz) + 1) #define Wosize_whsize(sz) ((sz) - 1) #define Wosize_bhsize(sz) ((sz) / sizeof (value) - 1) @@ -182,16 +259,54 @@ where 0 <= R <= 31 is HEADER_RESERVED_BITS, set with the #define Wsize_bsize(sz) ((sz) / sizeof (value)) #define Bhsize_wosize(sz) (Bsize_wsize (Whsize_wosize (sz))) #define Bhsize_bosize(sz) ((sz) + sizeof (header_t)) -#define Bosize_val(val) (Bsize_wsize (Wosize_val (val))) -#define Bosize_op(op) (Bosize_val (Val_op (op))) -#define Bosize_bp(bp) (Bosize_val (Val_bp (bp))) -#define Bosize_hd(hd) (Bsize_wsize (Wosize_hd (hd))) -#define Whsize_hp(hp) (Whsize_wosize (Wosize_hp (hp))) -#define Whsize_val(val) (Whsize_hp (Hp_val (val))) -#define Whsize_bp(bp) (Whsize_val (Val_bp (bp))) -#define Whsize_hd(hd) (Whsize_wosize (Wosize_hd (hd))) -#define Bhsize_hp(hp) (Bsize_wsize (Whsize_hp (hp))) -#define Bhsize_hd(hd) (Bsize_wsize (Whsize_hd (hd))) + +/* Note that Allocated_wosize_val and the other macros that read headers will not + be optimized by common subexpression elimination, because of the + atomic header loads. It is best to bind the results of such macros + to variables if they will be tested repeatedly, e.g. as the end condition + in a for-loop. +*/ + +/* flambda-backend: We rename the size macros to [Allocated_...] so that we're + forced to think about whether C code needs to updated for mixed blocks, which + have separate notions of scannable size and total size of an object, even for + scannable tags. We call an object's size (including possibly non-scannable + fields) its "allocated" size to document the fact that you shouldn't scan + fields on the basis of this size alone. + */ + +#define Allocated_wosize_val(val) (Allocated_wosize_hd (Hd_val (val))) +#define Allocated_wosize_op(op) (Allocated_wosize_val (op)) +#define Allocated_wosize_bp(bp) (Allocated_wosize_val (bp)) +#define Allocated_wosize_hp(hp) (Allocated_wosize_hd (Hd_hp (hp))) +#define Allocated_bosize_val(val) (Bsize_wsize (Allocated_wosize_val (val))) +#define Allocated_bosize_op(op) (Allocated_bosize_val (Val_op (op))) +#define Allocated_bosize_bp(bp) (Allocated_bosize_val (Val_bp (bp))) +#define Allocated_bosize_hd(hd) (Bsize_wsize (Allocated_wosize_hd (hd))) +#define Allocated_whsize_hp(hp) (Whsize_wosize (Allocated_wosize_hp (hp))) +#define Allocated_whsize_val(val) (Allocated_whsize_hp (Hp_val (val))) +#define Allocated_whsize_bp(bp) (Allocated_whsize_val (Val_bp (bp))) +#define Allocated_whsize_hd(hd) (Whsize_wosize (Allocated_wosize_hd (hd))) +#define Allocated_bhsize_hp(hp) (Bsize_wsize (Allocated_whsize_hp (hp))) +#define Allocated_bhsize_hd(hd) (Bsize_wsize (Allocated_whsize_hd (hd))) + +#ifndef Hide_upstream_size_macros +#define Wosize_hd(hd) Allocated_wosize_hd(hd) +#define Wosize_val(val) Allocated_wosize_val(val) +#define Wosize_op(op) Allocated_wosize_op(op) +#define Wosize_bp(bp) Allocated_wosize_bp(bp) +#define Wosize_hp(hp) Allocated_wosize_hp(hp) +#define Bosize_val(val) Allocated_bosize_val(val) +#define Bosize_op(op) Allocated_bosize_op(op) +#define Bosize_bp(bp) Allocated_bosize_bp(bp) +#define Bosize_hd(hd) Allocated_bosize_hd(hd) +#define Whsize_hp(hp) Allocated_whsize_hp(hp) +#define Whsize_val(val) Allocated_whsize_val(val) +#define Whsize_bp(bp) Allocated_whsize_bp(bp) +#define Whsize_hd(hd) Allocated_whsize_hd(hd) +#define Bhsize_hp(hp) Allocated_bhsize_hp(hp) +#define Bhsize_hd(hd) Allocated_bhsize_hd(hd) +#endif // Hide_upstream_size_macros #define Reserved_val(val) (Reserved_hd (Hd_val (val))) @@ -246,7 +361,7 @@ where 0 <= R <= 31 is HEADER_RESERVED_BITS, set with the with tag Closure_tag (see compact.c). */ #define Infix_tag 249 -#define Infix_offset_hd(hd) (Bosize_hd(hd)) +#define Infix_offset_hd(hd) (Allocated_bosize_hd(hd)) #define Infix_offset_val(v) Infix_offset_hd(Hd_val(v)) /* Another special case: objects */ @@ -276,20 +391,29 @@ Caml_inline void* Ptr_val(value val) #define Code_val(val) (((code_t *) (val)) [0]) /* Also an l-value. */ #define Closinfo_val(val) Field((val), 1) /* Arity and start env */ /* In the closure info field, the top 8 bits are the arity (signed). + The next least significant bit is set iff the current closure is the + last one to occur in the block. (This is used in the compactor.) The low bit is set to one, to look like an integer. - The remaining bits are the field number for the first word of the - environment, or, in other words, the offset (in words) from the closure - to the environment part. */ + The remaining bits are the field number for the first word of the scannable + part of the environment, or, in other words, the offset (in words) from the + closure to the scannable part of the environment. + The non-scannable part of the environment lives between the end of the + last closure and the start of the scannable environment within the block. */ +/* CR ncourant: it might be cleaner to use a packed struct here */ #ifdef ARCH_SIXTYFOUR #define Arity_closinfo(info) ((intnat)(info) >> 56) -#define Start_env_closinfo(info) (((uintnat)(info) << 8) >> 9) -#define Make_closinfo(arity,delta) \ - (((uintnat)(arity) << 56) + ((uintnat)(delta) << 1) + 1) +#define Start_env_closinfo(info) (((uintnat)(info) << 9) >> 10) +#define Is_last_closinfo(info) (((uintnat)(info) << 8) >> 63) +#define Make_closinfo(arity,delta,is_last) \ + (((uintnat)(arity) << 56) + ((uintnat)(is_last) << 55) \ + + ((uintnat)(delta) << 1) + 1) #else #define Arity_closinfo(info) ((intnat)(info) >> 24) -#define Start_env_closinfo(info) (((uintnat)(info) << 8) >> 9) -#define Make_closinfo(arity,delta) \ - (((uintnat)(arity) << 24) + ((uintnat)(delta) << 1) + 1) +#define Start_env_closinfo(info) (((uintnat)(info) << 9) >> 10) +#define Is_last_closinfo(info) (((uintnat)(info) << 8) >> 31) +#define Make_closinfo(arity,delta,is_last) \ + (((uintnat)(arity) << 24) + ((uintnat)(is_last) << 23) \ + + ((uintnat)(delta) << 1) + 1) #endif /* This tag is used (with Forcing_tag & Forward_tag) to implement lazy values. @@ -444,6 +568,22 @@ CAMLextern value caml_atom(tag_t); CAMLextern value caml_set_oo_id(value obj); +/* Users write this to assert that the ensuing C code is sensitive + to the current layout of mixed blocks in a way that's subject + to change in future compiler releases. We'll bump the version + number when we make a breaking change. For example, we currently + don't pack int32's efficiently, and we will want to someday. + + Users can write: + + Assert_mixed_block_layout_v1; + + (Hack: we define using _Static_assert rather than just an empty + definition so that users can write a semicolon, which is treated + better by C formatters.) + */ +#define Assert_mixed_block_layout_v1 _Static_assert(1, "") + /* Header for out-of-heap blocks. */ #define Caml_out_of_heap_header_with_reserved(wosize, tag, reserved) \ diff --git a/runtime/caml/osdeps.h b/runtime/caml/osdeps.h index c72ccf6ccb6..b916a62f149 100644 --- a/runtime/caml/osdeps.h +++ b/runtime/caml/osdeps.h @@ -103,9 +103,12 @@ extern char_os *caml_secure_getenv(char_os const *var); cannot be determined, return -1. */ extern int caml_num_rows_fd(int fd); +/* Print a timestamp for verbose GC logs */ +extern void caml_print_timestamp(FILE* channel, int formatted); + /* Memory management platform-specific operations */ -void *caml_plat_mem_map(uintnat, uintnat, int); +void *caml_plat_mem_map(uintnat, int); void *caml_plat_mem_commit(void *, uintnat); void caml_plat_mem_decommit(void *, uintnat); void caml_plat_mem_unmap(void *, uintnat); diff --git a/runtime/caml/platform.h b/runtime/caml/platform.h index 373419e3c9e..94b6c356b82 100644 --- a/runtime/caml/platform.h +++ b/runtime/caml/platform.h @@ -25,6 +25,7 @@ #include #include "config.h" #include "mlvalues.h" +#include "sync.h" #include "sys.h" #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) @@ -106,8 +107,8 @@ void caml_plat_assert_locked(caml_plat_mutex*); void caml_plat_assert_all_locks_unlocked(void); Caml_inline void caml_plat_unlock(caml_plat_mutex*); void caml_plat_mutex_free(caml_plat_mutex*); -typedef struct { pthread_cond_t cond; caml_plat_mutex* mutex; } caml_plat_cond; -#define CAML_PLAT_COND_INITIALIZER(m) { PTHREAD_COND_INITIALIZER, m } +typedef struct { custom_condvar cond; caml_plat_mutex* mutex; } caml_plat_cond; +#define CAML_PLAT_COND_INITIALIZER(m) { CUSTOM_COND_INITIALIZER, m } void caml_plat_cond_init(caml_plat_cond*, caml_plat_mutex*); void caml_plat_wait(caml_plat_cond*); /* like caml_plat_wait, but if nanoseconds surpasses the second parameter @@ -122,13 +123,8 @@ uintnat caml_mem_round_up_pages(uintnat size); /* The size given to caml_mem_map and caml_mem_commit must be a multiple of caml_plat_pagesize. The size given to caml_mem_unmap and caml_mem_decommit must match the size given to caml_mem_map/caml_mem_commit for mem. - - The Windows and Cygwin implementations do not support arbitrary alignment - and will fail for alignment values greater than caml_plat_mmap_alignment. - Luckily, this value is rather large on those platforms: 64KiB. This is enough - for all alignments used in the runtime system so far, the larger being the - major heap pools aligned on 32KiB boundaries. */ -void* caml_mem_map(uintnat size, uintnat alignment, int reserve_only); +*/ +void* caml_mem_map(uintnat size, int reserve_only); void* caml_mem_commit(void* mem, uintnat size); void caml_mem_decommit(void* mem, uintnat size); void caml_mem_unmap(void* mem, uintnat size); diff --git a/runtime/caml/printexc.h b/runtime/caml/printexc.h index 8ae788b139e..a7574058c48 100644 --- a/runtime/caml/printexc.h +++ b/runtime/caml/printexc.h @@ -28,6 +28,8 @@ extern "C" { CAMLextern char * caml_format_exception (value); #ifdef CAML_INTERNALS CAMLnoreturn_start void caml_fatal_uncaught_exception (value) CAMLnoreturn_end; +CAMLnoreturn_start void caml_fatal_uncaught_exception_with_message + (value, const char *) CAMLnoreturn_end; #endif /* CAML_INTERNALS */ #ifdef __cplusplus diff --git a/runtime/caml/roots.h b/runtime/caml/roots.h index 5435a145592..dac89c76cb9 100644 --- a/runtime/caml/roots.h +++ b/runtime/caml/roots.h @@ -42,7 +42,8 @@ CAMLextern void caml_do_local_roots( void* data, struct caml__roots_block* local_roots, struct stack_info *current_stack, - value * v_gc_regs); + value * v_gc_regs, + struct caml_local_arenas* locals); #endif /* CAML_INTERNALS */ diff --git a/runtime/caml/runtime_events.h b/runtime/caml/runtime_events.h index 0c591f57d6c..f6c64875933 100644 --- a/runtime/caml/runtime_events.h +++ b/runtime/caml/runtime_events.h @@ -80,9 +80,12 @@ typedef enum { EV_MAJOR, EV_MAJOR_SWEEP, EV_MAJOR_MARK_ROOTS, + EV_MAJOR_MEMPROF_ROOTS, EV_MAJOR_MARK, EV_MINOR, EV_MINOR_LOCAL_ROOTS, + EV_MINOR_MEMPROF_ROOTS, + EV_MINOR_MEMPROF_CLEAN, EV_MINOR_FINALIZED, EV_EXPLICIT_GC_MAJOR_SLICE, EV_FINALISE_UPDATE_FIRST, @@ -105,12 +108,17 @@ typedef enum { EV_STW_HANDLER, EV_STW_LEADER, EV_MAJOR_FINISH_SWEEPING, + EV_MAJOR_MEMPROF_CLEAN, EV_MINOR_FINALIZERS_ADMIN, EV_MINOR_REMEMBERED_SET, EV_MINOR_REMEMBERED_SET_PROMOTE, EV_MINOR_LOCAL_ROOTS_PROMOTE, EV_DOMAIN_CONDITION_WAIT, - EV_DOMAIN_RESIZE_HEAP_RESERVATION + EV_DOMAIN_RESIZE_HEAP_RESERVATION, + EV_COMPACT, + EV_COMPACT_EVACUATE, + EV_COMPACT_FORWARD, + EV_COMPACT_RELEASE } ev_runtime_phase; typedef enum { diff --git a/runtime/caml/shared_heap.h b/runtime/caml/shared_heap.h index 768415c586f..3e4abb3842a 100644 --- a/runtime/caml/shared_heap.h +++ b/runtime/caml/shared_heap.h @@ -23,6 +23,9 @@ #include "domain.h" #include "misc.h" #include "gc_stats.h" +#include "major_gc.h" + +CAMLextern atomic_uintnat caml_compactions_count; struct caml_heap_state; struct pool; @@ -31,7 +34,7 @@ struct caml_heap_state* caml_init_shared_heap(void); void caml_teardown_shared_heap(struct caml_heap_state* heap); value* caml_shared_try_alloc(struct caml_heap_state*, - mlsize_t, tag_t, reserved_t, int); + mlsize_t, tag_t, reserved_t); /* Copy the domain-local heap stats into a heap stats sample. */ void caml_collect_heap_stats_sample( @@ -45,7 +48,9 @@ uintnat caml_heap_size(struct caml_heap_state*); uintnat caml_top_heap_words(struct caml_heap_state*); uintnat caml_heap_blocks(struct caml_heap_state*); -struct pool* caml_pool_of_shared_block(value v); +void caml_compact_heap(caml_domain_state* domain_state, + int participating_count, + caml_domain_state** participants); void caml_shared_unpin(value v); @@ -84,6 +89,17 @@ Caml_inline int is_marked(value v) { return Has_status_val(v, caml_global_heap_state.MARKED); } +Caml_inline int is_not_markable(value v) { + return Has_status_val(v, NOT_MARKABLE); +} + +Caml_inline status caml_allocation_status(void) { + return + caml_marking_started() + ? caml_global_heap_state.MARKED + : caml_global_heap_state.UNMARKED; +} + void caml_redarken_pool(struct pool*, scanning_action, void*); intnat caml_sweep(struct caml_heap_state*, intnat); diff --git a/runtime/caml/signals.h b/runtime/caml/signals.h index b609a1226dc..5b0fe5f3339 100644 --- a/runtime/caml/signals.h +++ b/runtime/caml/signals.h @@ -27,6 +27,8 @@ extern "C" { #endif +CAMLextern void caml_init_nat_signals(void); + CAMLextern void caml_enter_blocking_section (void); CAMLextern void caml_enter_blocking_section_no_pending (void); CAMLextern void caml_leave_blocking_section (void); diff --git a/runtime/caml/simd.h b/runtime/caml/simd.h new file mode 100644 index 00000000000..72ad835ee87 --- /dev/null +++ b/runtime/caml/simd.h @@ -0,0 +1,46 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Max Slater, Jane Street */ +/* */ +/* Copyright 2023 Jane Street Group LLC */ +/* */ +/* 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. */ +/* */ +/**************************************************************************/ + +/* SIMD vector instruction support */ + +#ifndef CAML_SIMD_H +#define CAML_SIMD_H + +#include "mlvalues.h" + +#if defined(_M_IX86_FP) || defined(__SSE2__) || defined(__SSE3__) || \ + defined(__SSSE3__) || defined(__SSE4_1__) || defined(__SSE4_2__) +#define ARCH_SSE2 +#endif + +#if defined(__AVX__) || defined(__AVX2__) +#define ARCH_AVX +#endif + +#ifdef ARCH_SSE2 +#include + +#define Vec128_val(v) _mm_loadu_ps((const float*)Bp_val(v)) +#define Vec128_vald(v) _mm_loadu_pd((const double*)Bp_val(v)) +#define Vec128_vali(v) _mm_loadu_si128((const __m128i*)Bp_val(v)) +#define Store_vec128_val(v,x) _mm_storeu_ps((float*)Bp_val(v), x) +#define Store_vec128_vald(v,x) _mm_storeu_pd((double*)Bp_val(v), x) +#define Store_vec128_vali(v,x) _mm_storeu_si128((__m128i*)Bp_val(v), x) + +CAMLextern value caml_copy_vec128(__m128); +CAMLextern value caml_copy_vec128i(__m128i); +CAMLextern value caml_copy_vec128d(__m128d); +#endif + +#endif /* CAML_SIMD_H */ diff --git a/runtime/caml/sizeclasses.h b/runtime/caml/sizeclasses.h index 83d9ccf2f55..d26039217d3 100644 --- a/runtime/caml/sizeclasses.h +++ b/runtime/caml/sizeclasses.h @@ -3,15 +3,15 @@ #define POOL_HEADER_WSIZE 4 #define SIZECLASS_MAX 128 #define NUM_SIZECLASSES 32 -static const unsigned int wsize_sizeclass[NUM_SIZECLASSES] = -{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 23, 26, 29, 33, 37, 42, +static const unsigned int wsize_sizeclass[NUM_SIZECLASSES] = +{ 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 22, 25, 28, 32, 33, 37, 42, 47, 53, 59, 65, 73, 81, 89, 99, 108, 118, 128 }; -static const unsigned char wastage_sizeclass[NUM_SIZECLASSES] = -{ 0, 0, 0, 0, 2, 0, 4, 4, 6, 2, 0, 4, 12, 6, 12, 21, 10, 3, 0, 22, 18, 3, 11, +static const unsigned char wastage_sizeclass[NUM_SIZECLASSES] = +{ 0, 0, 0, 0, 2, 0, 4, 4, 2, 0, 4, 12, 12, 7, 0, 17, 4, 28, 0, 22, 18, 3, 11, 21, 62, 4, 42, 87, 33, 96, 80, 124 }; -static const unsigned char sizeclass_wsize[SIZECLASS_MAX + 1] = -{ 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, - 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, +static const unsigned char sizeclass_wsize[SIZECLASS_MAX + 1] = +{ 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, + 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, diff --git a/runtime/caml/stack.h b/runtime/caml/stack.h index d595abd0daf..ae6e4a64157 100644 --- a/runtime/caml/stack.h +++ b/runtime/caml/stack.h @@ -46,7 +46,8 @@ #ifdef TARGET_amd64 /* Size of the gc_regs structure, in words. See amd64.S and amd64/proc.ml for the indices */ -#define Wosize_gc_regs (13 /* int regs */ + 16 /* float regs */) +/* The "*2" is for SIMD */ +#define Wosize_gc_regs (13 /* int regs */ + (16 * 2) /* float regs */) #define Saved_return_address(sp) *((intnat *)((sp) - 8)) #ifdef WITH_FRAME_POINTERS #define Pop_frame_pointer(sp) (sp) += sizeof(value) @@ -58,6 +59,7 @@ #ifdef TARGET_arm64 /* Size of the gc_regs structure, in words. See arm64.S and arm64/proc.ml for the indices */ +/* CR-someday mshinwell: update for SIMD */ #define Wosize_gc_regs (2 + 24 /* int regs */ + 24 /* float regs */) #define Saved_return_address(sp) *((intnat *)((sp) - 8)) #define Pop_frame_pointer(sp) sp += sizeof(value) diff --git a/runtime/caml/startup_aux.h b/runtime/caml/startup_aux.h index 70660bb4566..f152a6d4d39 100644 --- a/runtime/caml/startup_aux.h +++ b/runtime/caml/startup_aux.h @@ -46,6 +46,8 @@ struct caml_params { uintnat init_custom_minor_ratio; uintnat init_custom_minor_max_bsz; + uintnat init_main_stack_wsz; + uintnat init_thread_stack_wsz; uintnat init_max_stack_wsz; uintnat backtrace_enabled; diff --git a/runtime/caml/sync.h b/runtime/caml/sync.h index d1a47afbe68..7f07a9566d2 100644 --- a/runtime/caml/sync.h +++ b/runtime/caml/sync.h @@ -29,6 +29,21 @@ typedef pthread_mutex_t * sync_mutex; CAMLextern int caml_mutex_lock(sync_mutex mut); CAMLextern int caml_mutex_unlock(sync_mutex mut); +/* If we're using glibc, use a custom condition variable implementation to + avoid this bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25847 + + For now we only have this on linux because it directly uses the linux futex + syscalls. */ +#if defined(__linux__) && defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) +typedef struct { + volatile unsigned counter; +} custom_condvar; +#define CUSTOM_COND_INITIALIZER {0} +#else +typedef pthread_cond_t custom_condvar; +#define CUSTOM_COND_INITIALIZER PTHREAD_COND_INITIALIZER +#endif + #endif /* CAML_INTERNALS */ #endif /* CAML_SYNC_H */ diff --git a/runtime/compare.c b/runtime/compare.c index eb48994ce41..d268e07f91f 100644 --- a/runtime/compare.c +++ b/runtime/compare.c @@ -207,6 +207,11 @@ static intnat do_compare_val(struct compare_stack* stk, if (t1 != t2) return (intnat)t1 - (intnat)t2; } + if ( Is_mixed_block_reserved(Reserved_val(v1)) + || Is_mixed_block_reserved(Reserved_val(v2))) { + compare_free_stack(stk); + caml_invalid_argument("compare: mixed block value"); + } switch(t1) { case Forward_tag: { v1 = Forward_val (v1); diff --git a/runtime/custom.c b/runtime/custom.c index 7204454dd7a..ebc58611af3 100644 --- a/runtime/custom.c +++ b/runtime/custom.c @@ -108,6 +108,8 @@ CAMLexport value caml_alloc_custom_mem(const struct custom_operations * ops, mlsize_t max_minor = Bsize_wsize (Caml_state->minor_heap_wsz) / 100 * caml_custom_minor_ratio; value v = alloc_custom_gen (ops, bsz, mem, max_major, mem_minor, max_minor); + size_t mem_words = (mem + sizeof(value) - 1) / sizeof(value); + caml_memprof_sample_block(v, mem_words, mem_words, CAML_MEMPROF_SRC_CUSTOM); return v; } @@ -178,4 +180,5 @@ void caml_init_custom_operations(void) caml_register_custom_operations(&caml_nativeint_ops); caml_register_custom_operations(&caml_int64_ops); caml_register_custom_operations(&caml_ba_ops); + caml_register_custom_operations(&caml_float32_ops); } diff --git a/runtime/debugger.c b/runtime/debugger.c index c840ac2b0bc..f222627c9c4 100644 --- a/runtime/debugger.c +++ b/runtime/debugger.c @@ -270,17 +270,21 @@ static void safe_output_value(struct channel *chan, value val) struct caml_exception_context exception_ctx = {&raise_buf, CAML_LOCAL_ROOTS, &raise_exn_bucket}; struct caml_exception_context* saved_external_raise; + struct caml_exception_context* saved_external_raise_async; /* Catch exceptions raised by [caml_output_val] */ saved_external_raise = Caml_state->external_raise; + saved_external_raise_async = Caml_state->external_raise_async; if (sigsetjmp(raise_buf.buf, 0) == 0) { Caml_state->external_raise = &exception_ctx; + Caml_state->external_raise_async = &exception_ctx; caml_output_val(chan, val, marshal_flags); } else { /* Send wrong magic number, will cause [caml_input_value] to fail */ caml_really_putblock(chan, "\000\000\000\000", 4); } Caml_state->external_raise = saved_external_raise; + Caml_state->external_raise_async = saved_external_raise_async; } static void save_instruction(code_t pc) diff --git a/runtime/domain.c b/runtime/domain.c index 115b72571c3..1e0b023eea0 100644 --- a/runtime/domain.c +++ b/runtime/domain.c @@ -54,6 +54,7 @@ typedef cpuset_t cpu_set_t; #include "caml/intext.h" #include "caml/major_gc.h" #include "caml/minor_gc.h" +#include "caml/memprof.h" #include "caml/misc.h" #include "caml/memory.h" #include "caml/osdeps.h" @@ -141,7 +142,10 @@ typedef cpuset_t cpu_set_t; /* control of STW interrupts */ struct interruptor { - atomic_uintnat* interrupt_word; + /* The outermost atomic is for synchronization with + caml_interrupt_all_for_signal. The innermost atomic is also for + cross-domain communication.*/ + _Atomic(atomic_uintnat *) interrupt_word; caml_plat_mutex lock; caml_plat_cond cond; @@ -205,7 +209,7 @@ static caml_plat_mutex all_domains_lock = CAML_PLAT_MUTEX_INITIALIZER; static caml_plat_cond all_domains_cond = CAML_PLAT_COND_INITIALIZER(&all_domains_lock); static atomic_uintnat /* dom_internal* */ stw_leader = 0; -static struct dom_internal all_domains[Max_domains]; +static dom_internal all_domains[Max_domains]; CAMLexport atomic_uintnat caml_num_domains_running; @@ -294,7 +298,8 @@ CAMLexport caml_domain_state* caml_get_domain_state(void) Caml_inline void interrupt_domain(struct interruptor* s) { - atomic_store_release(s->interrupt_word, (uintnat)(-1)); + atomic_uintnat * interrupt_word = atomic_load_relaxed(&s->interrupt_word); + atomic_store_release(interrupt_word, (uintnat)(-1)); } int caml_incoming_interrupts_queued(void) @@ -453,6 +458,7 @@ static void free_minor_heap(void) { domain_state->young_end = NULL; domain_state->young_ptr = NULL; domain_state->young_trigger = NULL; + domain_state->memprof_young_trigger = NULL; atomic_store_release(&domain_state->young_limit, (uintnat) domain_state->young_start); } @@ -495,6 +501,7 @@ static int allocate_minor_heap(asize_t wsize) { * major slice is scheduled. */ domain_state->young_trigger = domain_state->young_start + (domain_state->young_end - domain_state->young_start) / 2; + caml_memprof_set_trigger(domain_state); caml_reset_young_limit(domain_state); check_minor_heap(); @@ -532,11 +539,13 @@ static uintnat fresh_domain_unique_id(void) { } /* must be run on the domain's thread */ -static void domain_create(uintnat initial_minor_heap_wsize) { +static void domain_create(uintnat initial_minor_heap_wsize, + caml_domain_state *parent) +{ dom_internal* d = 0; caml_domain_state* domain_state; struct interruptor* s; - uintnat stack_wsize = caml_get_init_stack_wsize(); + uintnat stack_wsize = caml_get_init_stack_wsize(-1 /* main thread */); CAMLassert (domain_self == 0); @@ -560,8 +569,6 @@ static void domain_create(uintnat initial_minor_heap_wsize) { CAMLassert(!s->running); CAMLassert(!s->interrupt_pending); - domain_self = d; - /* If the chosen domain slot has not been previously used, allocate a fresh domain state. Otherwise, reuse it. @@ -583,18 +590,42 @@ static void domain_create(uintnat initial_minor_heap_wsize) { domain_state = d->state; } - caml_state = domain_state; - s->unique_id = fresh_domain_unique_id(); - s->interrupt_word = &domain_state->young_limit; s->running = 1; atomic_fetch_add(&caml_num_domains_running, 1); + /* Note: until we take d->domain_lock, the domain_state may still be + * shared with a domain which is terminating (see + * domain_terminate). */ + caml_plat_lock(&d->domain_lock); + /* Set domain_self if we have successfully allocated the + * caml_domain_state. Otherwise domain_self will be NULL and it's up + * to the caller to deal with that. */ + + domain_self = d; + caml_state = domain_state; + + domain_state->young_limit = 0; + /* Synchronized with [caml_interrupt_all_for_signal], so that the + initializing write of young_limit happens before any + interrupt. */ + atomic_store_explicit(&s->interrupt_word, &domain_state->young_limit, + memory_order_release); + domain_state->id = d->id; - domain_state->unique_id = d->interruptor.unique_id; - CAMLassert(!d->interruptor.interrupt_pending); + domain_state->unique_id = s->unique_id; + + /* Tell memprof system about the new domain before either (a) new + * domain can allocate anything or (b) parent domain can go away. */ + CAMLassert(domain_state->memprof == NULL); + caml_memprof_new_domain(parent, domain_state); + if (!domain_state->memprof) { + goto init_memprof_failure; + } + + CAMLassert(!s->interrupt_pending); domain_state->extra_heap_resources = 0.0; domain_state->extra_heap_resources_minor = 0.0; @@ -629,6 +660,8 @@ static void domain_create(uintnat initial_minor_heap_wsize) { goto reallocate_minor_heap_failure; } + domain_state->in_minor_collection = 0; + domain_state->dls_root = Val_unit; caml_register_generational_global_root(&domain_state->dls_root); @@ -649,6 +682,7 @@ static void domain_create(uintnat initial_minor_heap_wsize) { domain_state->c_stack = NULL; domain_state->exn_handler = NULL; + domain_state->async_exn_handler = NULL; domain_state->action_pending = 0; @@ -665,6 +699,11 @@ static void domain_create(uintnat initial_minor_heap_wsize) { domain_state->backtrace_active = 0; caml_register_generational_global_root(&domain_state->backtrace_last_exn); + domain_state->local_arenas = NULL; + domain_state->local_sp = 0; + domain_state->local_top = NULL; + domain_state->local_limit = 0; + domain_state->compare_unordered = 0; domain_state->oo_next_id_local = 0; @@ -679,14 +718,16 @@ static void domain_create(uintnat initial_minor_heap_wsize) { caml_record_backtraces(1); } + domain_state->raising_async_exn = 0; + #ifndef NATIVE_CODE domain_state->external_raise = NULL; + domain_state->external_raise_async = NULL; domain_state->trap_sp_off = 1; domain_state->trap_barrier_off = 0; domain_state->trap_barrier_block = -1; #endif - caml_reset_young_limit(domain_state); add_to_stw_domains(domain_self); goto domain_init_complete; @@ -701,6 +742,8 @@ static void domain_create(uintnat initial_minor_heap_wsize) { caml_free_minor_tables(domain_state->minor_tables); domain_state->minor_tables = NULL; alloc_minor_tables_failure: + caml_memprof_delete_domain(domain_state); +init_memprof_failure: domain_self = NULL; @@ -733,8 +776,7 @@ static void reserve_minor_heaps(void) { minor_heap_reservation_bsize = minor_heap_max_bsz * Max_domains; /* reserve memory space for minor heaps */ - heaps_base = caml_mem_map(minor_heap_reservation_bsize, caml_plat_pagesize, - 1 /* reserve_only */); + heaps_base = caml_mem_map(minor_heap_reservation_bsize, 1 /* reserve_only */); if (heaps_base == NULL) caml_fatal_error("Not enough heap memory to reserve minor heaps"); @@ -863,7 +905,7 @@ void caml_init_domains(uintnat minor_heap_wsz) { dom->id = i; - dom->interruptor.interrupt_word = 0; + dom->interruptor.interrupt_word = NULL; caml_plat_mutex_init(&dom->interruptor.lock); caml_plat_cond_init(&dom->interruptor.cond, &dom->interruptor.lock); @@ -878,7 +920,7 @@ void caml_init_domains(uintnat minor_heap_wsz) { dom->backup_thread_msg = BT_INIT; } - domain_create(minor_heap_wsz); + domain_create(minor_heap_wsz, NULL); if (!domain_self) caml_fatal_error("Failed to create main domain"); CAMLassert (domain_self->state->unique_id == 0); @@ -919,7 +961,7 @@ static void free_domain_ml_values(struct domain_ml_values* ml_values) { parameters returned to the parent by the child. */ struct domain_startup_params { - struct interruptor* parent; /* in */ + dom_internal *parent; /* in */ enum domain_status status; /* in+out: parent and child synchronize on this value. */ struct domain_ml_values* ml_values; /* in */ @@ -933,6 +975,8 @@ struct domain_startup_params { static void* backup_thread_func(void* v) { + // single-domain hack + caml_fatal_error("backup thread not allowed to run"); dom_internal* di = (dom_internal*)v; uintnat msg; struct interruptor* s = &di->interruptor; @@ -1071,20 +1115,25 @@ static void* domain_thread_func(void* v) } #endif - domain_create(caml_params->init_minor_heap_wsz); + domain_create(caml_params->init_minor_heap_wsz, p->parent->state); + + if (!domain_self) { + caml_fatal_error("Failed to create domain"); + } + /* this domain is now part of the STW participant set */ p->newdom = domain_self; /* handshake with the parent domain */ - caml_plat_lock(&p->parent->lock); + caml_plat_lock(&p->parent->interruptor.lock); if (domain_self) { p->status = Dom_started; p->unique_id = domain_self->interruptor.unique_id; } else { p->status = Dom_failed; } - caml_plat_broadcast(&p->parent->cond); - caml_plat_unlock(&p->parent->lock); + caml_plat_broadcast(&p->parent->interruptor.cond); + caml_plat_unlock(&p->parent->interruptor.lock); /* Cannot access p below here. */ if (domain_self) { @@ -1137,7 +1186,7 @@ CAMLprim value caml_domain_spawn(value callback, value mutex) if (caml_debugger_in_use) caml_fatal_error("ocamldebug does not support spawning multiple domains"); #endif - p.parent = &domain_self->interruptor; + p.parent = domain_self; p.status = Dom_starting; p.ml_values = @@ -1517,16 +1566,43 @@ int caml_try_run_on_all_domains_async( leader_setup, 0, 0); } -void caml_interrupt_self(void) { +void caml_interrupt_self(void) +{ interrupt_domain(&domain_self->interruptor); } +/* async-signal-safe */ +void caml_interrupt_all_for_signal(void) +{ + for (dom_internal *d = all_domains; d < &all_domains[Max_domains]; d++) { + /* [all_domains] is an array of values. So we can access + [interrupt_word] directly without synchronisation other than + with other people who access the same [interrupt_word].*/ + atomic_uintnat * interrupt_word = + atomic_load_explicit(&d->interruptor.interrupt_word, + memory_order_acquire); + /* Early exit: if the current domain was never initialized, then + neither have been any of the remaining ones. */ + if (interrupt_word == NULL) return; + interrupt_domain(&d->interruptor); + } +} + void caml_reset_young_limit(caml_domain_state * dom_st) { - CAMLassert ((uintnat)dom_st->young_ptr > (uintnat)dom_st->young_trigger); + /* An interrupt might have been queued in the meanwhile; the + atomic_exchange achieves the proper synchronisation with the + reads that follow (an atomic_store is not enough). */ + value *trigger = dom_st->young_trigger > dom_st->memprof_young_trigger ? + dom_st->young_trigger : dom_st->memprof_young_trigger; + CAMLassert ((uintnat)dom_st->young_ptr >= + (uintnat)dom_st->memprof_young_trigger); + CAMLassert ((uintnat)dom_st->young_ptr >= + (uintnat)dom_st->young_trigger); /* An interrupt might have been queued in the meanwhile; this achieves the proper synchronisation. */ - atomic_exchange(&dom_st->young_limit, (uintnat)dom_st->young_trigger); + atomic_exchange(&dom_st->young_limit, (uintnat)trigger); + dom_internal * d = &all_domains[dom_st->id]; if (atomic_load_relaxed(&d->interruptor.interrupt_pending) || dom_st->requested_minor_gc @@ -1641,10 +1717,12 @@ void caml_poll_gc_work(void) caml_poll_gc_work is called. */ } + caml_reset_young_limit(d); + if (atomic_load_acquire(&d->requested_external_interrupt)) { + /* This function might allocate (e.g. upon a systhreads yield). */ caml_domain_external_interrupt_hook(); } - caml_reset_young_limit(d); } void caml_handle_gc_interrupt(void) @@ -1742,11 +1820,12 @@ static void handover_finalisers(caml_domain_state* domain_state) if (f->todo_head != NULL || f->first.size != 0 || f->last.size != 0) { /* have some final structures */ - if (caml_gc_phase != Phase_sweep_and_mark_main) { + if (caml_gc_phase != Phase_sweep_main && + caml_gc_phase != Phase_sweep_and_mark_main) { /* Force a major GC cycle to simplify constraints for * handing over finalisers. */ - caml_finish_major_cycle(); - CAMLassert(caml_gc_phase == Phase_sweep_and_mark_main); + caml_finish_major_cycle(0); + CAMLassert(caml_gc_phase == Phase_sweep_main); } caml_add_orphaned_finalisers (f); /* Create a dummy final info */ @@ -1833,6 +1912,18 @@ static void domain_terminate (void) } caml_plat_unlock(&all_domains_lock); } + + /* domain_state may be re-used by a fresh domain here (now that we + * have done remove_from_stw_domains and released the + * all_domains_lock). However, domain_create() won't touch it until + * it has claimed the domain_lock, so we hang onto that while we are + * tearing down the state. */ + + /* Delete the domain state from statmemprof after any promotion + * (etc) done by this domain: any remaining memprof state will be + * handed over to surviving domains. */ + caml_memprof_delete_domain(domain_state); + /* We can not touch domain_self->interruptor after here because it may be reused */ caml_remove_generational_global_root(&domain_state->dls_root); @@ -1865,6 +1956,8 @@ static void domain_terminate (void) caml_free_backtrace_buffer(domain_state->backtrace_buffer); caml_free_gc_regs_buckets(domain_state->gc_regs_buckets); + // CR sdolan: free locals stack + /* signal the domain termination to the backup thread NB: for a program with no additional domains, the backup thread will not have been started */ diff --git a/runtime/dune b/runtime/dune index e83c6820d32..d8345e7aa47 100644 --- a/runtime/dune +++ b/runtime/dune @@ -16,56 +16,79 @@ (targets primitives) (mode fallback) (deps - ; matches the line structure of files in gen_primitives.sh - alloc.c array.c compare.c extern.c floats.c gc_ctrl.c hash.c intern.c - interp.c ints.c io.c - lexing.c md5.c meta.c memprof.c obj.c parsing.c signals.c str.c sys.c - callback.c weak.c - finalise.c dynlink.c backtrace_byt.c backtrace.c - afl.c - bigarray.c runtime_events.c) - (action (with-stdout-to %{targets} (run %{dep:gen_primitives.sh})))) + ; matches the line structure of files in gen_primitives.sh + alloc.c array.c compare.c extern.c floats.c gc_ctrl.c hash.c intern.c interp.c ints.c io.c + lexing.c md5.c meta.c memprof.c obj.c parsing.c signals.c str.c sys.c callback.c weak.c + finalise.c domain.c platform.c fiber.c memory.c startup_aux.c runtime_events.c sync.c + dynlink.c backtrace_byt.c backtrace.c afl.c float32.c + bigarray.c prng.c win32.c + ) + (action (with-stdout-to %{targets} + (chdir .. (run %{dep:gen_primitives.sh}))))) (rule - (targets libcamlrun.a) + (targets libasmrun.a libasmrund.a libasmruni.a libasmrun_pic.a + libasmrun_shared.so libcamlrun.a libcamlrund.a libcamlruni.a libcamlrun_pic.a + libcamlrun_shared.so ocamlrun ocamlrund ocamlruni ld.conf + sak) (mode fallback) (deps ../Makefile.config ../Makefile.build_config ../Makefile.config_if_required - ../Makefile.common Makefile + ../Makefile.common ../Makefile + ../compilerlibs/Makefile.compilerlibs + ../Makefile.menhir + ../.depend + ../.depend.menhir + ../config.status + ../stdlib/StdlibModules (glob_files caml/*.h) - ; matches the line structure of files in Makefile/BYTECODE_C_SOURCES - interp.c misc.c fix_code.c startup_aux.c startup_byt.c freelist.c - major_gc.c - minor_gc.c memory.c alloc.c roots_byt.c globroots.c fail_byt.c signals.c - signals_byt.c printexc.c backtrace_byt.c backtrace.c compare.c ints.c - floats.c str.c array.c io.c extern.c intern.c hash.c sys.c meta.c parsing.c - gc_ctrl.c md5.c obj.c - lexing.c callback.c debugger.c weak.c compact.c finalise.c custom.c dynlink.c - afl.c unix.c win32.c bigarray.c main.c memprof.c domain.c - skiplist.c codefrag.c + (glob_files *.h) + caml/domain_state.tbl + primitives + (glob_files *.S) + (glob_files *.c) ) (action + (no-infer (progn (bash "touch .depend") ; hack. - (run make %{targets} COMPUTE_DEPS=false) - (bash "rm .depend")))) + (bash "cd .. && make V=1 'SAK_LINK=cc -o $(1) $(2)' COMPUTE_DEPS=false runtime/sak") + (bash "cd .. && make V=1 -sj8 runtime/libasmrun.a runtime/libasmrund.a runtime/libasmruni.a runtime/libasmrun_pic.a \ + runtime/libasmrun_shared.so runtime/libcamlrun.a runtime/libcamlrund.a runtime/libcamlruni.a runtime/libcamlrun_pic.a \ + runtime/libcamlrun_shared.so runtime/ocamlrun runtime/ocamlrund runtime/ocamlruni runtime/ld.conf COMPUTE_DEPS=false") + (bash "rm .depend"))))) -;; HACK -(library - (name runtime) - (modes byte) - (wrapped false) - (modules runtime) - (flags (-nostdlib -nopervasives)) - (library_flags -cclib "-I runtime") - (self_build_stubs_archive (runtime))) +(install + (files + ocamlrun + ocamlrund + ocamlruni + ) + (section bin) + (package ocaml_runtime_stdlib)) -(rule - (targets libruntime_stubs.a) - (action (copy libcamlrun.a %{targets}))) +(install + (files + ld.conf -(rule - (targets runtime.ml) - (action (write-file %{targets} "let linkme = ()"))) + libcamlrun.a + libcamlrund.a + libcamlruni.a + libcamlrun_pic.a + libcamlrun_shared.so + ) + (section lib) + (package ocaml_runtime_stdlib)) + +(install + (files + libasmrun.a + libasmrund.a + libasmruni.a + libasmrun_pic.a + libasmrun_shared.so + ) + (section lib) + (package ocaml_runtime_stdlib)) diff --git a/runtime/dynlink.c b/runtime/dynlink.c index e259b445300..ef4891ade3e 100644 --- a/runtime/dynlink.c +++ b/runtime/dynlink.c @@ -235,7 +235,9 @@ void caml_free_shared_libs(void) #define Handle_val(v) (*((void **) (v))) -CAMLprim value caml_dynlink_open_lib(value filename) +/* The mode argument is here for compatibility with runtime4. */ +/* CR ocaml 5 all-runtime5: Remove [mode] when all-runtime5. */ +CAMLprim value caml_dynlink_open_lib(value mode, value filename) { void * handle; value result; diff --git a/runtime/dynlink_nat.c b/runtime/dynlink_nat.c index 54df6ff3484..64ee2dea7f6 100644 --- a/runtime/dynlink_nat.c +++ b/runtime/dynlink_nat.c @@ -47,7 +47,7 @@ static value Val_handle(void* handle) { } static void *getsym(void *handle, const char *module, const char *name){ - char *fullname = caml_stat_strconcat(4, "caml", module, ".", name); + char *fullname = caml_stat_strconcat(3, module, ".", name); void *sym; sym = caml_dlsym (handle, fullname); /* printf("%s => %lx\n", fullname, (uintnat) sym); */ @@ -110,25 +110,27 @@ CAMLprim value caml_natdynlink_register(value handle_v, value symbols) { for (i = 0; i < nsymbols; i++) { const char* unit = String_val(Field(symbols, i)); - table[i] = getsym(handle, unit, "frametable"); + table[i] = getsym(handle, unit, "gc_roots"); if (table[i] == NULL) { caml_stat_free(table); caml_invalid_argument_value( - caml_alloc_sprintf("Dynlink: Missing frametable for %s", unit)); + caml_alloc_sprintf("Dynlink: Missing gc_roots for %s", unit)); } } - caml_register_frametables(table, nsymbols); + caml_register_dyn_globals(table, nsymbols); + /* [caml_register_dyn_global] can raise, so do it prior to registering + frametables etc. */ for (i = 0; i < nsymbols; i++) { const char* unit = String_val(Field(symbols, i)); - table[i] = getsym(handle, unit, "gc_roots"); + table[i] = getsym(handle, unit, "frametable"); if (table[i] == NULL) { caml_stat_free(table); caml_invalid_argument_value( - caml_alloc_sprintf("Dynlink: Missing gc_roots for %s", unit)); + caml_alloc_sprintf("Dynlink: Missing frametable for %s", unit)); } } - caml_register_dyn_globals(table, nsymbols); + caml_register_frametables(table, nsymbols); for (i = 0; i < nsymbols; i++) { const char* unit = String_val(Field(symbols, i)); @@ -166,7 +168,7 @@ CAMLprim value caml_natdynlink_run(value handle_v, value symbol) { CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) { CAMLparam2 (filename, symbol); - CAMLlocal3 (res, v, handle_v); + CAMLlocal4 (res, v, handle_v, symbols); void *handle; char_os *p; @@ -184,10 +186,16 @@ CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) Store_field(res, 0, v); } else { handle_v = Val_handle(handle); + + symbols = caml_alloc_small(1, 0); + Field(symbols, 0) = symbol; + (void) caml_natdynlink_register(handle_v, symbols); + res = caml_alloc(1,0); v = caml_natdynlink_run(handle_v, symbol); Store_field(res, 0, v); } + CAMLreturn(res); } @@ -196,7 +204,16 @@ CAMLprim value caml_natdynlink_loadsym(value symbol) CAMLparam1 (symbol); CAMLlocal1 (sym); + /* Note that this can only be used for symbols which are valid OCaml + values, otherwise a naked pointer would be returned. */ + sym = (value) caml_globalsym(String_val(symbol)); if (!sym) caml_failwith(String_val(symbol)); CAMLreturn(sym); } + +CAMLprim value caml_natdynlink_existssym(value symbol) +{ + void* sym = caml_globalsym(String_val(symbol)); + return sym != NULL ? Val_true : Val_false; +} diff --git a/runtime/extern.c b/runtime/extern.c index 9d9746ecf3f..b0696f204b1 100644 --- a/runtime/extern.c +++ b/runtime/extern.c @@ -323,9 +323,9 @@ static void extern_resize_position_table(struct caml_extern_state *s) /* Determine whether the given object [obj] is in the hash table. If so, set [*pos_out] to its position in the output and return 1. - If not, set [*h_out] to the hash value appropriate for - [extern_record_location] and return 0. */ - + If not, return 0. + Either way, set [*h_out] to the hash value appropriate for + [extern_record_location]. */ Caml_inline int extern_lookup_position(struct caml_extern_state *s, value obj, uintnat * pos_out, uintnat * h_out) { @@ -336,6 +336,7 @@ Caml_inline int extern_lookup_position(struct caml_extern_state *s, value obj, return 0; } if (s->pos_table.entries[h].obj == obj) { + *h_out = h; *pos_out = s->pos_table.entries[h].pos; return 1; } @@ -343,22 +344,38 @@ Caml_inline int extern_lookup_position(struct caml_extern_state *s, value obj, } } -/* Record the output position for the given object [obj]. */ +/* Record the given object [obj] in the hashmap, associated to the specified data [data]. */ /* The [h] parameter is the index in the hash table where the object must be inserted. It was determined during lookup. */ - -static void extern_record_location(struct caml_extern_state* s, - value obj, uintnat h) +static void extern_record_location_with_data(struct caml_extern_state* s, + value obj, uintnat h, uintnat data) { if (s->extern_flags & NO_SHARING) return; bitvect_set(s->pos_table.present, h); s->pos_table.entries[h].obj = obj; - s->pos_table.entries[h].pos = s->obj_counter; + s->pos_table.entries[h].pos = data; s->obj_counter++; if (s->obj_counter >= s->pos_table.threshold) extern_resize_position_table(s); } +/* Record the output position for the given object [obj]. */ +/* The [h] parameter is the index in the hash table where the object + must be inserted. It was determined during lookup. */ +static void extern_record_location(struct caml_extern_state* s, + value obj, uintnat h) +{ + extern_record_location_with_data(s, obj, h, s->obj_counter); +} + +/* Update the data associated with the given object [obj]. */ +static void extern_update_location_with_data(struct caml_extern_state* s, + uintnat h, uintnat data) +{ + if (s->extern_flags & NO_SHARING) return; + s->pos_table.entries[h].pos = data; +} + /* To buffer the output */ static void init_extern_output(struct caml_extern_state* s) @@ -577,6 +594,15 @@ Caml_inline void extern_int(struct caml_extern_state* s, intnat n) } } +Caml_inline void extern_unboxed_int(struct caml_extern_state* s, intnat n) +{ + if (s->extern_flags & COMPAT_32) + extern_failwith(s, + "output_value: cannot marshal unboxed values on 32 bit"); + + writecode64(s, CODE_UNBOXED_INT64, n); +} + /* Marshaling references to previously-marshaled blocks */ Caml_inline void extern_shared_reference(struct caml_extern_state* s, @@ -733,7 +759,7 @@ static void extern_code_pointer(struct caml_extern_state* s, char * codeptr) } } -/* Marshaling the non-environment part of closures */ +/* Marshaling the non-scanned-environment part of closures */ Caml_inline mlsize_t extern_closure_up_to_env(struct caml_extern_state* s, value v) @@ -744,8 +770,15 @@ Caml_inline mlsize_t extern_closure_up_to_env(struct caml_extern_state* s, startenv = Start_env_closinfo(Closinfo_val(v)); i = 0; do { - /* The infix header */ - if (i > 0) extern_int(s, Long_val(Field(v, i++))); + if (i > 0) { + /* The padding before an infix header */ + while (Field(v, i) == Val_long(0)) { + extern_int(s, 0); + i++; + } + /* The infix header */ + extern_int(s, Long_val(Field(v, i++))); + } /* The default entry point */ extern_code_pointer(s, (char *) Field(v, i++)); /* The closure info. */ @@ -755,8 +788,12 @@ Caml_inline mlsize_t extern_closure_up_to_env(struct caml_extern_state* s, if (Arity_closinfo(info) != 0 && Arity_closinfo(info) != 1) { extern_code_pointer(s, (char *) Field(v, i++)); } - } while (i < startenv); - CAMLassert(i == startenv); + } while (!Is_last_closinfo(info)); + CAMLassert(i <= startenv); + /* The non-scanned part of the environment */ + while (i < startenv) { + extern_unboxed_int(s, Field(v, i++)); + } return startenv; } @@ -779,6 +816,11 @@ static void extern_rec(struct caml_extern_state* s, value v) header_t hd = Hd_val(v); tag_t tag = Tag_hd(hd); mlsize_t sz = Wosize_hd(hd); + reserved_t reserved = Reserved_hd(hd); + if (Is_mixed_block_reserved(reserved)) { + extern_invalid_argument(s, "output_value: mixed block"); + break; + } if (tag == Forward_tag) { value f = Forward_val (v); @@ -1334,56 +1376,147 @@ CAMLexport void caml_serialize_block_float_8(void * data, intnat len) #endif } -CAMLprim value caml_obj_reachable_words(value v) -{ - intnat size; - struct extern_item * sp; - uintnat h = 0; - uintnat pos = 0; - struct caml_extern_state *s = get_extern_state (); +enum reachable_words_node_state { + /* This node is reachable from at least two distinct roots, so it doesn't + * have a unique owner and will be ignored in all future traversals. */ + Shared = -1, + /* This node is one of the roots and has not been visited yet (i.e. the computation + * starting at that root still hasn't ran */ + RootUnprocessed = -2, + /* This node is one of the roots and the computation for that root has already ran */ + RootProcessed = -3, + /* Sentinel value for a state that should never be observed */ + Invalid = -4, + /* States that are non-negative integers indicate that a node has only been visited + * starting from a single root. The state is then equal to the identifier of the + * root that we reached it from */ +}; - s->obj_counter = 0; - s->extern_flags = 0; - extern_init_position_table(s); +/* CR ocaml 5 domains (mshinwell): think about what to do here */ +/* Not multicore-safe (the [volatile] just lets us use this with the [Field] macro) */ +static void add_to_long_value(volatile value *v, intnat x) { + *v = Val_long(Long_val(*v) + x); +} + +/* Performs traversal through the OCaml object reachability graph to deterime + how much memory an object has access to. + + Assumes that the position_table has already been initialized using + [reachable_words_init]. We can run this function multiple times + without clearing the position table to share data between runs starting + from different roots. Identifiers must be positive integers. + + For each value node visited, we record its traversal status in the [pos] field + of its entry in [position_table.entries]. The statuses are described in detail + in the [reachable_words_node_state] enum. + + Returns the total size of elements marked, that is ones that are reachable + from the current root and can be reached by at most one root from the ones + that already ran. + + [shared_size] is incremented by the total size of elements that were newly + marked [Shared], that is ones that we just found out are reachable from at least + two roots. + + If [sizes_by_root_id] is not [Val_unit], we expect it to be an OCaml array + with length equal to the number of roots. Then during the traversal we will + update the number of words uniquely reachable from each root. + That is, when we visit a node for the first time, we add its size to the + corresponding root identifier, and when we visit it for the second time, we + undo this addition. */ +intnat reachable_words_once(struct caml_extern_state *s, + value root, intnat identifier, value sizes_by_root_id, + intnat *shared_size) { + struct extern_item * sp; + intnat size; + uintnat mark = Invalid, new_mark; + value v = root; + uintnat h; + int previously_marked, should_traverse; sp = s->extern_stack; size = 0; + CAMLassert(identifier >= 0); + /* In Multicore OCaml, we don't distinguish between major heap blocks and * out-of-heap blocks, so we end up counting out-of-heap blocks too. */ while (1) { if (Is_long(v)) { /* Tagged integers contribute 0 to the size, nothing to do */ - } else if (extern_lookup_position(s, v, &pos, &h)) { - /* Already seen and counted, nothing to do */ } else { header_t hd = Hd_val(v); tag_t tag = Tag_hd(hd); mlsize_t sz = Wosize_hd(hd); + intnat sz_with_header = 1 + sz; /* Infix pointer: go back to containing closure */ if (tag == Infix_tag) { v = v - Infix_offset_hd(hd); continue; } - /* Remember that we've visited this block */ - extern_record_location(s, v, h); - /* The block contributes to the total size */ - size += 1 + sz; /* header word included */ - if (tag < No_scan_tag) { - /* i is the position of the first field to traverse recursively */ - uintnat i = - tag == Closure_tag ? Start_env_closinfo(Closinfo_val(v)) : 0; - if (i < sz) { - if (i < sz - 1) { - /* Remember that we need to count fields i + 1 ... sz - 1 */ - sp++; - if (sp >= s->extern_stack_limit) - sp = extern_resize_stack(s, sp); - sp->v = &Field(v, i + 1); - sp->count = sz - i - 1; + + previously_marked = extern_lookup_position(s, v, &mark, &h); + if (!previously_marked) { + /* All roots must have been marked by [reachable_words_mark_root] before + * calling this function so we can safely assign new_mark to + * identifier */ + CAMLassert(v != root); + should_traverse = 1; + new_mark = identifier; + } else if (mark == RootUnprocessed && v == root) { + should_traverse = 1; + new_mark = RootProcessed; + } else if (mark == Shared || mark == RootUnprocessed || mark == RootProcessed) { + should_traverse = 0; + } else if (mark == identifier) { + should_traverse = 0; + } else { + CAMLassert(mark != Invalid); + /* mark is some other root's identifier */ + should_traverse = 1; + new_mark = Shared; + } + + if (should_traverse) { + if (!previously_marked) { + extern_record_location_with_data(s, v, h, new_mark); + } else { + extern_update_location_with_data(s, h, new_mark); + } + + /* The block contributes to the total size */ + size += sz_with_header; /* header word included */ + if (sizes_by_root_id != Val_unit) { + if (new_mark == Shared) { + /* mark is identifier of some other root that we counted this node + * as contributing to. Since it is evidently not uniquely reachable, we + * undo this contribution */ + add_to_long_value(&Field(sizes_by_root_id, mark), -sz_with_header); + *shared_size += sz_with_header; + } else { + CAMLassert(new_mark == identifier || (v == root && new_mark == RootProcessed)); + add_to_long_value(&Field(sizes_by_root_id, identifier), sz_with_header); + } + } + if (tag < No_scan_tag) { + /* i is the position of the first field to traverse recursively, + and j is the position of the last such field. + */ + uintnat i = + tag == Closure_tag ? Start_env_closinfo(Closinfo_val(v)) : 0; + uintnat j = Scannable_wosize_hd(hd); + if (i < j) { + if (i < j - 1) { + /* Remember that we need to count fields i + 1 ... j - 1 */ + sp++; + if (sp >= s->extern_stack_limit) + sp = extern_resize_stack(s, sp); + sp->v = &Field(v, i + 1); + sp->count = j - i - 1; + } + /* Continue with field i */ + v = Field(v, i); + continue; } - /* Continue with field i */ - v = Field(v, i); - continue; } } } @@ -1392,7 +1525,72 @@ CAMLprim value caml_obj_reachable_words(value v) v = *((sp->v)++); if (--(sp->count) == 0) sp--; } + + return size; +} + +struct caml_extern_state* reachable_words_init(void) +{ + struct caml_extern_state *s = get_extern_state (); + s->obj_counter = 0; + s->extern_flags = 0; + extern_init_position_table(s); + return s; +} + +void reachable_words_mark_root(struct caml_extern_state *s, value v) +{ + uintnat h, mark; + extern_lookup_position(s, v, &mark, &h); + extern_record_location_with_data(s, v, h, RootUnprocessed); +} + +void reachable_words_cleanup(struct caml_extern_state *s) +{ extern_free_stack(s); extern_free_position_table(s); - return Val_long(size); +} + +CAMLprim value caml_obj_reachable_words(value v) +{ + struct caml_extern_state *s; + CAMLparam1(v); + CAMLlocal1(size); + + intnat shared_size = 0; + + s = reachable_words_init(); + reachable_words_mark_root(s, v); + size = Val_long(reachable_words_once(s, v, 0, Val_unit, &shared_size)); + reachable_words_cleanup(s); + + CAMLreturn(size); +} + +CAMLprim value caml_obj_uniquely_reachable_words(value v) +{ + struct caml_extern_state *s; + CAMLparam1(v); + CAMLlocal2(sizes_by_root_id, ret); + + intnat length, shared_size; + + length = Wosize_val(v); + sizes_by_root_id = caml_alloc(length, 0); + shared_size = 0; + + s = reachable_words_init(); + for (intnat i = 0; i < length; i++) { + reachable_words_mark_root(s, Field(v, i)); + Field(sizes_by_root_id, i) = Val_int(0); + } + for (intnat i = 0; i < length; i++) { + reachable_words_once(s, Field(v, i), i, sizes_by_root_id, &shared_size); + } + reachable_words_cleanup(s); + + ret = caml_alloc_small(2, 0); + Field(ret, 0) = sizes_by_root_id; + Field(ret, 1) = Val_long(shared_size); + CAMLreturn(ret); } diff --git a/runtime/fail_byt.c b/runtime/fail_byt.c index f0fa76b75c1..ad647d743f7 100644 --- a/runtime/fail_byt.c +++ b/runtime/fail_byt.c @@ -37,10 +37,7 @@ CAMLexport void caml_raise(value v) Unlock_exn(); CAMLassert(!Is_exception_result(v)); - // avoid calling caml_raise recursively - v = caml_process_pending_actions_with_root_exn(v); - if (Is_exception_result(v)) - v = Extract_exception(v); + v = caml_process_pending_actions_with_root(v); if (Caml_state->external_raise == NULL) { caml_terminate_signals(); @@ -53,6 +50,28 @@ CAMLexport void caml_raise(value v) siglongjmp(Caml_state->external_raise->jmp->buf, 1); } +CAMLexport void caml_raise_async(value v) +{ + Caml_check_caml_state(); + Unlock_exn(); + CAMLassert(!Is_exception_result(v)); + + if (Stack_parent(Caml_state->current_stack) != NULL) { + caml_fatal_error("Effects not supported in conjunction with async exns"); + } + + if (Caml_state->external_raise_async == NULL) { + caml_terminate_signals(); + caml_fatal_uncaught_exception(v); + } + *Caml_state->external_raise_async->exn_bucket = v; + + Caml_state->local_roots = Caml_state->external_raise_async->local_roots; + + Caml_state->raising_async_exn = 1; + siglongjmp(Caml_state->external_raise_async->jmp->buf, 1); +} + CAMLexport void caml_raise_constant(value tag) { caml_raise(tag); @@ -163,6 +182,11 @@ CAMLexport void caml_array_bound_error(void) caml_invalid_argument("index out of bounds"); } +CAMLexport void caml_array_align_error(void) +{ + caml_invalid_argument("address was misaligned"); +} + CAMLexport void caml_raise_out_of_memory(void) { check_global_data("Out_of_memory"); @@ -172,7 +196,7 @@ CAMLexport void caml_raise_out_of_memory(void) CAMLexport void caml_raise_stack_overflow(void) { check_global_data("Stack_overflow"); - caml_raise_constant(Field(caml_global_data, STACK_OVERFLOW_EXN)); + caml_raise_async(Field(caml_global_data, STACK_OVERFLOW_EXN)); } CAMLexport void caml_raise_sys_error(value msg) @@ -205,12 +229,6 @@ CAMLexport void caml_raise_sys_blocked_io(void) caml_raise_constant(Field(caml_global_data, SYS_BLOCKED_IO)); } -CAMLexport value caml_raise_if_exception(value res) -{ - if (Is_exception_result(res)) caml_raise(Extract_exception(res)); - return res; -} - int caml_is_special_exception(value exn) { /* this function is only used in caml_format_exception to produce a more readable textual representation of some exceptions. It is diff --git a/runtime/fail_nat.c b/runtime/fail_nat.c index bb891b940f3..03d2a26d1e4 100644 --- a/runtime/fail_nat.c +++ b/runtime/fail_nat.c @@ -20,7 +20,9 @@ #include #include #include "caml/alloc.h" +#include "caml/callback.h" #include "caml/fail.h" +#include "caml/fiber.h" #include "caml/io.h" #include "caml/gc.h" #include "caml/memory.h" @@ -56,37 +58,76 @@ CAMLnoreturn_start extern void caml_raise_exception (caml_domain_state* state, value bucket) CAMLnoreturn_end; +CAMLnoreturn_start + extern void caml_raise_async_exception (caml_domain_state* state, value bucket) +CAMLnoreturn_end; + +static void unwind_local_roots(char *limit_of_current_c_stack_chunk) +{ + while (Caml_state->local_roots != NULL && + (char *)Caml_state->local_roots < limit_of_current_c_stack_chunk) + { + Caml_state->local_roots = Caml_state->local_roots->next; + } +} + void caml_raise(value v) { Caml_check_caml_state(); - char* exception_pointer; + char* limit_of_current_c_stack_chunk; Unlock_exn(); CAMLassert(!Is_exception_result(v)); - // avoid calling caml_raise recursively - v = caml_process_pending_actions_with_root_exn(v); - if (Is_exception_result(v)) - v = Extract_exception(v); + /* Run callbacks here, so that a signal handler that arrived during + a blocking call has a chance to interrupt the raising of EINTR */ + v = caml_process_pending_actions_with_root(v); - exception_pointer = (char*)Caml_state->c_stack; + limit_of_current_c_stack_chunk = (char*)Caml_state->c_stack; - if (exception_pointer == NULL) { + if (limit_of_current_c_stack_chunk == NULL) { caml_terminate_signals(); caml_fatal_uncaught_exception(v); } - while (Caml_state->local_roots != NULL && - (char *) Caml_state->local_roots < exception_pointer) { - Caml_state->local_roots = Caml_state->local_roots->next; - } - + unwind_local_roots(limit_of_current_c_stack_chunk); caml_raise_exception(Caml_state, v); } /* Used by the stack overflow handler -> deactivate ASAN (see segv_handler in signals_nat.c). */ +CAMLno_asan void caml_raise_async(value v) +{ + Caml_check_caml_state(); + char* limit_of_current_c_stack_chunk; + + Unlock_exn(); + + CAMLassert(!Is_exception_result(v)); + + if (Stack_parent(Caml_state->current_stack) != NULL) { + /* CR ocaml 5 effects: implement async exns + effects */ + caml_fatal_error("Effects not supported in conjunction with async exns"); + } + + /* Do not run callbacks here: we are already raising an async exn, + so no need to check for another one, and avoiding polling here + removes the risk of recursion in caml_raise */ + + limit_of_current_c_stack_chunk = (char*)Caml_state->c_stack; + + if (limit_of_current_c_stack_chunk == NULL) { + caml_terminate_signals(); + caml_fatal_uncaught_exception(v); + } + + unwind_local_roots(limit_of_current_c_stack_chunk); + Caml_state->exn_handler = Caml_state->async_exn_handler; + Caml_state->raising_async_exn = 1; + caml_raise_exception(Caml_state, v); +} + CAMLno_asan void caml_raise_constant(value tag) { @@ -149,6 +190,7 @@ void caml_invalid_argument_value (value msg) void caml_raise_out_of_memory(void) { + /* Note that this is not an async exn. */ caml_raise_constant((value) caml_exn_Out_of_memory); } @@ -157,7 +199,7 @@ void caml_raise_out_of_memory(void) CAMLno_asan void caml_raise_stack_overflow(void) { - caml_raise_constant((value) caml_exn_Stack_overflow); + caml_raise_async((value) caml_exn_Stack_overflow); } void caml_raise_sys_error(value msg) @@ -185,12 +227,6 @@ void caml_raise_sys_blocked_io(void) caml_raise_constant((value) caml_exn_Sys_blocked_io); } -CAMLexport value caml_raise_if_exception(value res) -{ - if (Is_exception_result(res)) caml_raise(Extract_exception(res)); - return res; -} - /* We use a pre-allocated exception because we can't do a GC before the exception is raised (lack of stack descriptors for the ccall to [caml_array_bound_error]). */ @@ -222,6 +258,34 @@ void caml_array_bound_error_asm(void) caml_raise_exception(Caml_state, array_bound_exn()); } +static value array_align_exn(void) +{ + static atomic_uintnat exn_cache = ATOMIC_UINTNAT_INIT(0); + const value* exn = (const value*)atomic_load_acquire(&exn_cache); + if (!exn) { + exn = caml_named_value("Pervasives.array_align_error"); + if (!exn) { + fprintf(stderr, "Fatal error: exception " + "Invalid_argument(\"address was misaligned\")\n"); + exit(2); + } + atomic_store_release(&exn_cache, (uintnat)exn); + } + return *exn; +} + +void caml_array_align_error(void) +{ + caml_raise(array_align_exn()); +} + +void caml_array_align_error_asm(void) +{ + /* This exception is raised directly from ocamlopt-compiled OCaml, + not C, so we jump directly to the OCaml handler (and avoid GC) */ + caml_raise_exception(Caml_state, array_align_exn()); +} + int caml_is_special_exception(value exn) { return exn == (value) caml_exn_Match_failure || exn == (value) caml_exn_Assert_failure diff --git a/runtime/fiber.c b/runtime/fiber.c index d86daf91415..d0ae5dc4ee2 100644 --- a/runtime/fiber.c +++ b/runtime/fiber.c @@ -32,11 +32,12 @@ #include "caml/major_gc.h" #include "caml/memory.h" #include "caml/startup_aux.h" +#include "caml/shared_heap.h" #ifdef NATIVE_CODE #include "caml/stack.h" #include "caml/frame_descriptors.h" #endif -#ifdef USE_MMAP_MAP_STACK +#if defined(USE_MMAP_MAP_STACK) || !defined(STACK_CHECKS_ENABLED) #include #endif @@ -48,13 +49,22 @@ static _Atomic int64_t fiber_id = 0; -uintnat caml_get_init_stack_wsize (void) +uintnat caml_get_init_stack_wsize (int thread_stack_wsz) { - uintnat default_stack_wsize = Wsize_bsize(Stack_init_bsize); +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) + uintnat init_stack_wsize = + thread_stack_wsz < 0 + ? caml_params->init_main_stack_wsz + : caml_params->init_thread_stack_wsz > 0 + ? caml_params->init_thread_stack_wsz : thread_stack_wsz; +#else + (void) thread_stack_wsz; + uintnat init_stack_wsize = Wsize_bsize(Stack_init_bsize); +#endif uintnat stack_wsize; - if (default_stack_wsize < caml_max_stack_wsize) - stack_wsize = default_stack_wsize; + if (init_stack_wsize < caml_max_stack_wsize) + stack_wsize = init_stack_wsize; else stack_wsize = caml_max_stack_wsize; @@ -96,11 +106,11 @@ struct stack_info** caml_alloc_stack_cache (void) Caml_inline struct stack_info* alloc_for_stack (mlsize_t wosize) { +#ifdef USE_MMAP_MAP_STACK size_t len = sizeof(struct stack_info) + sizeof(value) * wosize + 8 /* for alignment to 16-bytes, needed for arm64 */ + sizeof(struct stack_handler); -#ifdef USE_MMAP_MAP_STACK struct stack_info* si; si = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE | MAP_STACK, -1, 0); @@ -110,7 +120,92 @@ Caml_inline struct stack_info* alloc_for_stack (mlsize_t wosize) si->size = len; return si; #else +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) + /* (We use the following strategy only in native code, because bytecode + * has its own way of dealing with stack checks.) + * + * We want to detect a stack overflow by triggering a segfault when a + * given part of the memory is accessed; in order to do so, we protect + * a page near the end of the stack to make it unreadable/unwritable. + * A signal handler for segfault will be installed, that will check if + * the invalid address is in the range we protect, and will raise a stack + * overflow exception accordingly. + * + * The sequence of steps to achieve that is loosely based on the glibc + * code (See nptl/allocatestack.c): + * - first, we mmap the memory for the stack, with PROT_NONE so that + * the allocated memory is not committed; + * - second, we madvise to not use huge pages for this memory chunk; + * - third, we restore the read/write permissions for the whole memory + * chunk; + * - finally, we disable the read/write permissions again, but only + * for the page that will act as the guard. + * + * The reasoning behind this convoluted process is that if we only + * mmap and then mprotect, we incur the risk of splitting a huge page + * and losing its benefits while causing more bookkeeping. + */ + size_t bsize = Bsize_wsize(wosize); + int page_size = getpagesize(); + int num_pages = (bsize + page_size - 1) / page_size; + + // If we were using this for arm64, another 8 bytes is needed before + // the struct stack_handler. + CAMLassert(sizeof(struct stack_info) + 8 + sizeof(struct stack_handler) + < page_size); + // We need two clear pages in order to be able to guarantee we can create + // a guard page which is page-aligned. + size_t len = (num_pages + 4) * page_size; + + // Stack layout (higher addresses are at the top): + // + // -------------------- + // struct stack_handler + // 8 bytes on arm64 + // -------------------- + // the stack itself + // -------------------- <- page-aligned + // guard page + // -------------------- <- page-aligned + // ... (for alignment) + // struct stack_info + // -------------------- <- block, possibly unaligned + + struct stack_info* block; + block = mmap(NULL, len, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, + -1, 0); + if (block == MAP_FAILED) { + return NULL; + } + if (madvise (block, len, MADV_NOHUGEPAGE)) { + munmap(block, len); + return NULL; + } + if (mprotect(block, len, PROT_READ | PROT_WRITE)) { + munmap(block, len); + return NULL; + } + + // Note that there is no assumption here on the alignment of the return + // value from [mmap]. See the definition of [Protected_stack_page]. + if (mprotect(Protected_stack_page(block, page_size), page_size, PROT_NONE)) { + munmap(block, len); + return NULL; + } + + // Assert that the guard page does not impinge on the actual stack area. + CAMLassert((char*) block + len - (sizeof(struct stack_handler) + 8 + bsize) + >= Protected_stack_page(block, page_size) + page_size); + + block->size = len; + return block; +#else + size_t len = sizeof(struct stack_info) + + sizeof(value) * wosize + + 8 /* for alignment to 16-bytes, needed for arm64 */ + + sizeof(struct stack_handler); return caml_stat_alloc_noexc(len); +#endif /* NATIVE_CODE */ #endif /* USE_MMAP_MAP_STACK */ } @@ -222,18 +317,180 @@ void caml_get_stack_sp_pc (struct stack_info* stack, *sp = p + sizeof(value); } + +/* Returns the arena number of a block, + or -1 if it is not in any local arena */ +static int get_local_ix(caml_local_arenas* loc, value v) +{ + int i; + CAMLassert(Is_block(v)); + /* Search local arenas, starting from the largest (last) */ + for (i = 0; i < loc->count; i++) { + struct caml_local_arena arena = loc->arenas[i]; + if (arena.base <= (char*)v && (char*)v < arena.base + arena.length) + return i; + } + return -1; +} + + +/* If it visits an unmarked local block, + returns the index of the containing arena + Otherwise returns -1. + Temporarily marks local blocks with colors.GARBAGE + (which is not otherwise the color of reachable blocks) */ +static int visit(scanning_action f, void* fdata, + struct caml_local_arenas* locals, + struct global_heap_state colors, + value* p) +{ + value v = *p, vblock = v; + header_t hd; + int ix; + if (!Is_block(v)) + return -1; + + if (Is_young(v)) { + f(fdata, v, p); + return -1; + } + + /* major or local or external */ + + hd = Hd_val(vblock); + if (Tag_hd(hd) == Infix_tag) { + vblock -= Infix_offset_val(v); + hd = Hd_val(vblock); + } + + if (Color_hd(hd) == colors.GARBAGE) { + /* Local, marked */ + return -1; + } else if (Color_hd(hd) == NOT_MARKABLE) { + /* Local (unmarked) or external */ + + if (locals == NULL) + /* external */ + return -1; + + ix = get_local_ix(locals, vblock); + + if (ix != -1) { + /* Mark this unmarked local */ + *Hp_val(vblock) = With_status_hd(hd, colors.GARBAGE); + } + + return ix; + } else { + /* Major heap */ + f(fdata, v, p); + return -1; + } +} + +static void scan_local_allocations(scanning_action f, void* fdata, + caml_local_arenas* loc) +{ + int arena_ix; + intnat sp; + struct caml_local_arena arena; + /* does not change during scanning */ + struct global_heap_state colors = caml_global_heap_state; + + if (loc == NULL) return; + CAMLassert(loc->count > 0); + sp = loc->saved_sp; + arena_ix = loc->count - 1; + arena = loc->arenas[arena_ix]; +#ifdef DEBUG + { header_t* hp; + for (hp = (header_t*)arena.base; + hp < (header_t*)(arena.base + arena.length + sp); + hp++) { + *hp = Debug_free_local; + } + } +#endif + + while (sp < 0) { + header_t* hp = (header_t*)(arena.base + arena.length + sp), hd = *hp; + intnat i; + + if (hd == Local_uninit_hd) { + CAMLassert(arena_ix > 0); + arena = loc->arenas[--arena_ix]; +#ifdef DEBUG + for (hp = (header_t*)arena.base; + hp < (header_t*)(arena.base + arena.length + sp); + hp++) { + *hp = Debug_free_local; + } +#endif + continue; + } + CAMLassert(Color_hd(hd) == NOT_MARKABLE || + Color_hd(hd) == colors.GARBAGE); + if (Color_hd(hd) == NOT_MARKABLE) { + /* Local allocation, not marked */ +#ifdef DEBUG + /* We don't check the reserved bits here because this is OK even for mixed + blocks. */ + for (i = 0; i < Wosize_hd(hd); i++) + Field(Val_hp(hp), i) = Debug_free_local; +#endif + sp += Bhsize_hd(hd); + continue; + } + /* reset mark */ + hd = With_status_hd(hd, NOT_MARKABLE); + *hp = hd; + CAMLassert(Tag_hd(hd) != Infix_tag); /* start of object, no infix */ + CAMLassert(Tag_hd(hd) != Cont_tag); /* no local continuations */ + if (Tag_hd(hd) >= No_scan_tag) { + sp += Bhsize_hd(hd); + continue; + } + i = 0; + if (Tag_hd(hd) == Closure_tag) + i = Start_env_closinfo(Closinfo_val(Val_hp(hp))); + + mlsize_t scannable_wosize = Scannable_wosize_hd(hd); + + for (; i < scannable_wosize; i++) { + value *p = Op_val(Val_hp(hp)) + i; + int marked_ix = visit(f, fdata, loc, colors, p); + if (marked_ix != -1) { + struct caml_local_arena a = loc->arenas[marked_ix]; + intnat newsp = (char*)*p - (a.base + a.length); + if (sp <= newsp) { + /* forwards pointer, common case */ + CAMLassert(marked_ix <= arena_ix); + } else { + /* If backwards pointers are ever supported (e.g. local recursive + values), then this should reset sp and iterate to a fixpoint */ + CAMLassert(marked_ix >= arena_ix); + caml_fatal_error("backwards local pointer"); + } + } + } + sp += Bhsize_hd(hd); + } +} + + Caml_inline void scan_stack_frames( scanning_action f, scanning_action_flags fflags, void* fdata, - struct stack_info* stack, value* gc_regs) + struct stack_info* stack, value* gc_regs, + struct caml_local_arenas* locals) { char * sp; uintnat retaddr; value * regs; frame_descr * d; - int n, ofs; - unsigned short * p; value *root; caml_frame_descrs fds = caml_get_frame_descrs(); + /* does not change during marking */ + struct global_heap_state colors = caml_global_heap_state; sp = (char*)stack->sp; regs = gc_regs; @@ -250,14 +507,31 @@ Caml_inline void scan_stack_frames( CAMLassert(d); if (!frame_return_to_C(d)) { /* Scan the roots in this frame */ - for (p = d->live_ofs, n = d->num_live; n > 0; n--, p++) { - ofs = *p; - if (ofs & 1) { - root = regs + (ofs >> 1); - } else { - root = (value *)(sp + ofs); + if (frame_is_long(d)) { + frame_descr_long *dl = frame_as_long(d); + uint32_t *p; + uint32_t n; + for (p = dl->live_ofs, n = dl->num_live; n > 0; n--, p++) { + uint32_t ofs = *p; + if (ofs & 1) { + root = regs + (ofs >> 1); + } else { + root = (value *)(sp + ofs); + } + visit (f, fdata, locals, colors, root); + } + } else { + uint16_t *p; + uint16_t n; + for (p = d->live_ofs, n = d->num_live; n > 0; n--, p++) { + uint16_t ofs = *p; + if (ofs & 1) { + root = regs + (ofs >> 1); + } else { + root = (value *)(sp + ofs); + } + visit (f, fdata, locals, colors, root); } - f (fdata, *root, root); } /* Move to next frame */ sp += frame_size(d); @@ -276,10 +550,11 @@ Caml_inline void scan_stack_frames( void caml_scan_stack( scanning_action f, scanning_action_flags fflags, void* fdata, - struct stack_info* stack, value* gc_regs) + struct stack_info* stack, value* gc_regs, + struct caml_local_arenas* locals) { while (stack != NULL) { - scan_stack_frames(f, fflags, fdata, stack, gc_regs); + scan_stack_frames(f, fflags, fdata, stack, gc_regs, locals); f(fdata, Stack_handle_value(stack), &Stack_handle_value(stack)); f(fdata, Stack_handle_exception(stack), &Stack_handle_exception(stack)); @@ -296,7 +571,8 @@ void caml_maybe_expand_stack (void) (value*)stk->sp - Stack_base(stk); uintnat stack_needed = Stack_threshold / sizeof(value) - + 8 /* for words pushed by caml_start_program */; + + 10 /* for words pushed by caml_start_program */; + /* XXX does this "8" need updating? Provisionally changed to 10 */ if (stack_available < stack_needed) if (!caml_try_realloc_stack (stack_needed)) @@ -362,7 +638,8 @@ CAMLprim value caml_ensure_stack_capacity(value required_space) void caml_scan_stack( scanning_action f, scanning_action_flags fflags, void* fdata, - struct stack_info* stack, value* v_gc_regs) + struct stack_info* stack, value* v_gc_regs, + struct caml_local_arenas* unused) { value *low, *high, *sp; @@ -391,6 +668,40 @@ void caml_scan_stack( #endif /* end BYTE_CODE */ +CAMLexport void caml_do_local_roots ( + scanning_action f, scanning_action_flags fflags, void* fdata, + struct caml__roots_block *local_roots, + struct stack_info *current_stack, + value * v_gc_regs, + struct caml_local_arenas* locals) +{ + struct caml__roots_block *lr; + int i, j; + value* sp; + + for (lr = local_roots; lr != NULL; lr = lr->next) { + for (i = 0; i < lr->ntables; i++){ + for (j = 0; j < lr->nitems; j++){ + sp = &(lr->tables[i][j]); + if (*sp != 0) { +#ifdef NATIVE_CODE + visit (f, fdata, locals, caml_global_heap_state, sp); +#else + f (fdata, *sp, sp); +#endif + } + } + } + } + caml_scan_stack(f, fflags, fdata, current_stack, v_gc_regs, locals); +#ifdef NATIVE_CODE + scan_local_allocations(f, fdata, locals); +#else + CAMLassert(locals == NULL); +#endif +} + + /* Stack management. @@ -400,20 +711,29 @@ void caml_scan_stack( #ifdef NATIVE_CODE /* Update absolute exception pointers for new stack*/ void caml_rewrite_exception_stack(struct stack_info *old_stack, - value** exn_ptr, struct stack_info *new_stack) + value** exn_ptr, value** async_exn_ptr, + struct stack_info *new_stack) { fiber_debug_log("Old [%p, %p]", Stack_base(old_stack), Stack_high(old_stack)); fiber_debug_log("New [%p, %p]", Stack_base(new_stack), Stack_high(new_stack)); if(exn_ptr) { + CAMLassert(async_exn_ptr != NULL); + fiber_debug_log ("*exn_ptr=%p", *exn_ptr); + fiber_debug_log ("*async_exn_ptr=%p", *async_exn_ptr); while (Stack_base(old_stack) < *exn_ptr && *exn_ptr <= Stack_high(old_stack)) { + int must_update_async_exn_ptr = *exn_ptr == *async_exn_ptr; #ifdef DEBUG value* old_val = *exn_ptr; #endif *exn_ptr = Stack_high(new_stack) - (Stack_high(old_stack) - *exn_ptr); + if (must_update_async_exn_ptr) *async_exn_ptr = *exn_ptr; + fiber_debug_log ("must_update_async_exn_ptr=%d", + must_update_async_exn_ptr); + fiber_debug_log ("Rewriting %p to %p", old_val, *exn_ptr); CAMLassert(Stack_base(new_stack) < *exn_ptr); @@ -424,10 +744,12 @@ void caml_rewrite_exception_stack(struct stack_info *old_stack, fiber_debug_log ("finished with *exn_ptr=%p", *exn_ptr); } else { fiber_debug_log ("exn_ptr is null"); + CAMLassert(async_exn_ptr == NULL); } } #ifdef WITH_FRAME_POINTERS +#if defined(STACK_CHECKS_ENABLED) /* Update absolute base pointers for new stack */ static void rewrite_frame_pointers(struct stack_info *old_stack, struct stack_info *new_stack) @@ -482,9 +804,14 @@ static void rewrite_frame_pointers(struct stack_info *old_stack, } #endif #endif +#endif int caml_try_realloc_stack(asize_t required_space) { +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) + (void) required_space; + abort(); +#else struct stack_info *old_stack, *new_stack; asize_t wsize; int stack_used; @@ -521,8 +848,13 @@ int caml_try_realloc_stack(asize_t required_space) new_stack->sp = Stack_high(new_stack) - stack_used; Stack_parent(new_stack) = Stack_parent(old_stack); #ifdef NATIVE_CODE + /* There's no need to do another pass rewriting from + Caml_state->async_exn_handler because every asynchronous exception trap + frame is also a normal exception trap frame. However + Caml_state->async_exn_handler itself must be updated. */ caml_rewrite_exception_stack(old_stack, (value**)&Caml_state->exn_handler, - new_stack); + (value**) &Caml_state->async_exn_handler, + new_stack); #ifdef WITH_FRAME_POINTERS rewrite_frame_pointers(old_stack, new_stack); #endif @@ -539,12 +871,27 @@ int caml_try_realloc_stack(asize_t required_space) link->sp = (void*)((char*)Stack_high(new_stack) - ((char*)Stack_high(old_stack) - (char*)link->sp)); } + if (link->async_exn_handler >= (char*) Stack_base(old_stack) + && link->async_exn_handler < (char*) Stack_high(old_stack)) { + /* The asynchronous exception trap frame pointed to by the current + c_stack_link lies on the OCaml stack being reallocated. Repoint the + trap frame to the new stack. */ + fiber_debug_log("Rewriting link->async_exn_handler %p...", + link->async_exn_handler); + link->async_exn_handler += + (char*) Stack_high(new_stack) - (char*) Stack_high(old_stack); + fiber_debug_log("...to %p", link->async_exn_handler); + } else { + fiber_debug_log("Not touching link->async_exn_handler %p", + link->async_exn_handler); + } } } caml_free_stack(old_stack); Caml_state->current_stack = new_stack; return 1; +#endif } struct stack_info* caml_alloc_main_stack (uintnat init_wsize) @@ -562,6 +909,16 @@ void caml_free_stack (struct stack_info* stack) CAMLassert(stack->magic == 42); CAMLassert(cache != NULL); + +#ifndef USE_MMAP_MAP_STACK +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) + int page_size = getpagesize(); + mprotect((void *) Protected_stack_page(stack, page_size), + page_size, + PROT_READ | PROT_WRITE); +#endif +#endif + if (stack->cache_bucket != -1) { stack->exception_ptr = (void*)(cache[stack->cache_bucket]); @@ -571,13 +928,17 @@ void caml_free_stack (struct stack_info* stack) (Stack_high(stack)-Stack_base(stack))*sizeof(value)); #endif } else { -#ifdef DEBUG +#if defined(DEBUG) && defined(STACK_CHECKS_ENABLED) memset(stack, 0x42, (char*)stack->handler - (char*)stack); #endif #ifdef USE_MMAP_MAP_STACK munmap(stack, stack->size); +#else +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) + munmap(stack, stack->size); #else caml_stat_free(stack); +#endif #endif } } @@ -604,9 +965,9 @@ CAMLprim value caml_continuation_use_noexc (value cont) /* this forms a barrier between execution and any other domains that might be marking this continuation */ - if (!Is_young(cont) ) caml_darken_cont(cont); + if (!Is_young(cont) && caml_marking_started()) + caml_darken_cont(cont); - /* at this stage the stack is assured to be marked */ v = Field(cont, 0); if (caml_domain_alone()) { diff --git a/runtime/fix_code.c b/runtime/fix_code.c index c84512baacd..b62747ac9a9 100644 --- a/runtime/fix_code.c +++ b/runtime/fix_code.c @@ -117,7 +117,7 @@ int* caml_init_opcode_nargs(void) /* Instructions with two operands */ l[APPTERM] = l[CLOSURE] = l[PUSHGETGLOBALFIELD] = - l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[C_CALLN] = + l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[MAKE_FAUX_MIXEDBLOCK] = l[C_CALLN] = l[BEQ] = l[BNEQ] = l[BLTINT] = l[BLEINT] = l[BGTINT] = l[BGEINT] = l[BULTINT] = l[BUGEINT] = l[GETPUBMET] = 2; diff --git a/runtime/float32.c b/runtime/float32.c new file mode 100644 index 00000000000..0819327dd91 --- /dev/null +++ b/runtime/float32.c @@ -0,0 +1,830 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ +/* Max Slater, Jane Street */ +/* */ +/* 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. */ +/* */ +/**************************************************************************/ + +#define CAML_INTERNALS + +/* Needed for uselocale */ +#define _XOPEN_SOURCE 700 + +/* Needed for strtof_l */ +#define _GNU_SOURCE + +#include +#include +#include +#include + +#include "caml/alloc.h" +#include "caml/bigarray.h" +#include "caml/fail.h" +#include "caml/custom.h" +#include "caml/float32.h" +#include "caml/memory.h" +#include "caml/intext.h" +#include "caml/mlvalues.h" + +#if defined(HAS_LOCALE) || defined(__MINGW32__) + +#if defined(HAS_LOCALE_H) || defined(__MINGW32__) +#include +#endif + +#if defined(HAS_XLOCALE_H) +#include +#endif + +#if defined(_MSC_VER) +#ifndef locale_t +#define locale_t _locale_t +#endif +#ifndef freelocale +#define freelocale _free_locale +#endif +#ifndef strtof_l +#define strtof_l _strtof_l +#endif +#endif + +#endif /* defined(HAS_LOCALE) */ + +CAML_STATIC_ASSERT(sizeof(float) == sizeof(int32_t)); + +#define Max_custom_array_wosize (Max_wosize - 1) +#define Max_unboxed_float32_array_wosize (Max_custom_array_wosize * (sizeof(intnat) / sizeof(float))) + +intnat caml_float32_compare_unboxed(float f, float g) +{ + /* If one or both of f and g is NaN, order according to the convention + NaN = NaN and NaN < x for all other floats x. */ + /* This branchless implementation is from GPR#164. + Note that [f == f] if and only if f is not NaN. + We expand each subresult of the expression to + avoid sign-extension on 64bit. GPR#2250. */ + intnat res = + (intnat)(f > g) - (intnat)(f < g) + (intnat)(f == f) - (intnat)(g == g); + return res; +} + +static int float32_cmp(value v1, value v2) +{ + return caml_float32_compare_unboxed(Float32_val(v1), Float32_val(v2)); +} + +static intnat float32_hash(value v) +{ + union { + float f; + uint32_t i; + } u; + uint32_t n; + u.f = Float32_val(v); n = u.i; + /* Normalize NaNs */ + if ((n & 0x7F800000) == 0x7F800000 && (n & 0x007FFFFF) != 0) { + n = 0x7F800001; + } + /* Normalize -0 into +0 */ + else if (n == 0x80000000) { + n = 0; + } + return n; +} + +static uintnat float32_deserialize(void *dst) +{ + *((float *)dst) = caml_deserialize_float_4(); + return 4; +} + +static void float32_serialize(value v, uintnat *bsize_32, + uintnat *bsize_64) +{ + caml_serialize_float_4(Float32_val(v)); + *bsize_32 = *bsize_64 = 4; +} + +static const struct custom_fixed_length float32_length = {4, 4}; + +CAMLexport const struct custom_operations caml_float32_ops = { + "_f32", + custom_finalize_default, + float32_cmp, + float32_hash, + float32_serialize, + float32_deserialize, + custom_compare_ext_default, + &float32_length +}; + +CAMLexport value caml_copy_float32(float f) +{ + value res = caml_alloc_custom(&caml_float32_ops, 4, 0, 1); + Float32_val(res) = f; + return res; +} + +CAMLprim value caml_float32_of_float(value d) +{ + return caml_copy_float32((float)Double_val(d)); +} + +CAMLprim value caml_float_of_float32(value f) +{ + return caml_copy_double((double)Float32_val(f)); +} + +CAMLprim value caml_int_of_float32(value f) +{ + return Val_long((intnat)Float32_val(f)); +} + +CAMLprim value caml_float32_of_int(value n) +{ + return caml_copy_float32((float)Long_val(n)); +} + +CAMLprim value caml_neg_float32(value f) +{ + return caml_copy_float32(-Float32_val(f)); +} + +CAMLprim value caml_abs_float32(value f) +{ + return caml_copy_float32(fabsf(Float32_val(f))); +} + +CAMLprim value caml_add_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) + Float32_val(g)); +} + +CAMLprim value caml_sub_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) - Float32_val(g)); +} + +CAMLprim value caml_mul_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) * Float32_val(g)); +} + +CAMLprim value caml_div_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) / Float32_val(g)); +} + +CAMLprim value caml_sqrt_float32(value f) +{ + return caml_copy_float32(sqrtf(Float32_val(f))); +} + +CAMLprim value caml_float32_compare(value vf, value vg) +{ + return Val_int(caml_float32_compare_unboxed(Float32_val(vf), Float32_val(vg))); +} + +#define DEFINE_NAN_CMP(op) \ + (value f, value g) \ + { \ + return Val_bool(Float32_val(f) op Float32_val(g)); \ + } + +CAMLprim value caml_eq_float32 DEFINE_NAN_CMP(==) +CAMLprim value caml_neq_float32 DEFINE_NAN_CMP(!=) +CAMLprim value caml_le_float32 DEFINE_NAN_CMP(<=) +CAMLprim value caml_lt_float32 DEFINE_NAN_CMP(<) +CAMLprim value caml_ge_float32 DEFINE_NAN_CMP(>=) +CAMLprim value caml_gt_float32 DEFINE_NAN_CMP(>) + +#define DEFINE_BYTE_UNOP(op) \ + (value f) \ + { \ + return caml_copy_float32(op(Float32_val(f))); \ + } + +CAMLprim value caml_sqrt_float32_bytecode DEFINE_BYTE_UNOP(sqrtf) +CAMLprim value caml_cbrt_float32_bytecode DEFINE_BYTE_UNOP(cbrtf) +CAMLprim value caml_exp_float32_bytecode DEFINE_BYTE_UNOP(expf) +CAMLprim value caml_exp2_float32_bytecode DEFINE_BYTE_UNOP(exp2f) +CAMLprim value caml_log_float32_bytecode DEFINE_BYTE_UNOP(logf) +CAMLprim value caml_log10_float32_bytecode DEFINE_BYTE_UNOP(log10f) +CAMLprim value caml_log2_float32_bytecode DEFINE_BYTE_UNOP(log2f) +CAMLprim value caml_expm1_float32_bytecode DEFINE_BYTE_UNOP(expm1f) +CAMLprim value caml_log1p_float32_bytecode DEFINE_BYTE_UNOP(log1pf) +CAMLprim value caml_cos_float32_bytecode DEFINE_BYTE_UNOP(cosf) +CAMLprim value caml_sin_float32_bytecode DEFINE_BYTE_UNOP(sinf) +CAMLprim value caml_tan_float32_bytecode DEFINE_BYTE_UNOP(tanf) +CAMLprim value caml_acos_float32_bytecode DEFINE_BYTE_UNOP(acosf) +CAMLprim value caml_asin_float32_bytecode DEFINE_BYTE_UNOP(asinf) +CAMLprim value caml_atan_float32_bytecode DEFINE_BYTE_UNOP(atanf) +CAMLprim value caml_cosh_float32_bytecode DEFINE_BYTE_UNOP(coshf) +CAMLprim value caml_sinh_float32_bytecode DEFINE_BYTE_UNOP(sinhf) +CAMLprim value caml_tanh_float32_bytecode DEFINE_BYTE_UNOP(tanhf) +CAMLprim value caml_acosh_float32_bytecode DEFINE_BYTE_UNOP(acoshf) +CAMLprim value caml_asinh_float32_bytecode DEFINE_BYTE_UNOP(asinhf) +CAMLprim value caml_atanh_float32_bytecode DEFINE_BYTE_UNOP(atanhf) +CAMLprim value caml_erf_float32_bytecode DEFINE_BYTE_UNOP(erff) +CAMLprim value caml_erfc_float32_bytecode DEFINE_BYTE_UNOP(erfcf) +CAMLprim value caml_trunc_float32_bytecode DEFINE_BYTE_UNOP(truncf) +CAMLprim value caml_round_float32_bytecode DEFINE_BYTE_UNOP(roundf) +CAMLprim value caml_ceil_float32_bytecode DEFINE_BYTE_UNOP(ceilf) +CAMLprim value caml_floor_float32_bytecode DEFINE_BYTE_UNOP(floorf) + +#define DEFINE_BYTE_BINOP(op) \ + (value f, value g) \ + { \ + return caml_copy_float32(op(Float32_val(f),Float32_val(g))); \ + } + +CAMLprim value caml_atan2_float32_bytecode DEFINE_BYTE_BINOP(atan2f) +CAMLprim value caml_hypot_float32_bytecode DEFINE_BYTE_BINOP(hypotf) +CAMLprim value caml_nextafter_float32_bytecode DEFINE_BYTE_BINOP(nextafterf) +CAMLprim value caml_copysign_float32_bytecode DEFINE_BYTE_BINOP(copysignf) +CAMLprim value caml_fmod_float32_bytecode DEFINE_BYTE_BINOP(fmodf) +CAMLprim value caml_power_float32_bytecode DEFINE_BYTE_BINOP(powf) + +CAMLprim value caml_fma_float32_bytecode(value f, value g, value h) +{ + return caml_copy_float32(fmaf(Float32_val(f), Float32_val(g), Float32_val(h))); +} + +float caml_float32_of_int64(int64_t i) { + return (float)i; +} + +CAMLprim value caml_float32_of_int64_bytecode(value i) { + return caml_copy_float32(caml_float32_of_int64(Int64_val(i))); +} + +int64_t caml_float32_to_int64(float f) { + return (int64_t)f; +} + +CAMLprim value caml_float32_to_int64_bytecode(value f) { + return caml_copy_int64(caml_float32_to_int64(Float32_val(f))); +} + +float caml_float32_of_bits(int32_t bits) +{ + union { float f; int32_t i; } u; + u.i = bits; + return u.f; +} + +CAMLprim value caml_float32_of_bits_bytecode(value bits) +{ + return caml_copy_float32(caml_float32_of_bits(Int32_val(bits))); +} + +int32_t caml_float32_to_bits(float f) +{ + union { float f; int32_t i; } u; + u.f = f; + return u.i; +} + +CAMLprim value caml_float32_to_bits_bytecode(value f) +{ + return caml_copy_int32(caml_float32_to_bits(Float32_val(f))); +} + +float caml_ldexp_float32(float f, intnat i) +{ + return ldexpf(f, (int)i); +} + +CAMLprim value caml_ldexp_float32_bytecode(value f, value i) +{ + return caml_copy_float32(caml_ldexp_float32(Float32_val(f), Int_val(i))); +} + +float caml_sse_float32_min(float x, float y) { + return x < y ? x : y; +} + +CAMLprim value caml_sse_float32_min_bytecode(value x, value y) { + return Float32_val(x) < Float32_val(y) ? x : y; +} + +float caml_sse_float32_max(float x, float y) { + return x > y ? x : y; +} + +CAMLprim value caml_sse_float32_max_bytecode(value x, value y) { + return Float32_val(x) > Float32_val(y) ? x : y; +} + +int64_t caml_sse_cast_float32_int64(float f) +{ + return llrintf(f); +} + +CAMLprim value caml_sse_cast_float32_int64_bytecode(value f) +{ + return caml_copy_int64(caml_sse_cast_float32_int64(Float32_val(f))); +} + +#define ROUND_NEG_INF 0x9 +#define ROUND_POS_INF 0xA +#define ROUND_ZERO 0xB +#define ROUND_CURRENT 0xC + +float caml_sse41_float32_round(int mode, float f) { + switch(mode) { + case ROUND_NEG_INF: return floorf(f); + case ROUND_POS_INF: return ceilf(f); + case ROUND_ZERO: return truncf(f); + case ROUND_CURRENT: return rintf(f); + default: caml_fatal_error("Unknown rounding mode."); + } +} + +CAMLprim value caml_sse41_float32_round_bytecode(value mode, value f) { + return caml_copy_float32(caml_sse41_float32_round(Int_val(mode), Float32_val(f))); +} + +enum { FP_normal, FP_subnormal, FP_zero, FP_infinite, FP_nan }; + +value caml_classify_float32(float vf) +{ + union { float f; uint32_t i; } u; + uint32_t n; + uint32_t e; + u.f = vf; + n = u.i << 1; /* shift sign bit off */ + if (n == 0) return Val_int(FP_zero); + e = n >> 24; /* extract exponent */ + if (e == 0) return Val_int(FP_subnormal); + if (e == 0xff) { + if (n << 8 == 0) /* shift exponent off */ + return Val_int(FP_infinite); + else + return Val_int(FP_nan); + } + return Val_int(FP_normal); +} + +CAMLprim value caml_classify_float32_bytecode(value f) +{ + return caml_classify_float32(Float32_val(f)); +} + +value caml_signbit_float32(float f) +{ + return Val_bool(signbit(f)); +} + +CAMLprim value caml_signbit_float32_bytecode(value f) +{ + return caml_signbit_float32(Float32_val(f)); +} + +CAMLprim value caml_frexp_float32(value f) +{ + CAMLparam0 (); + CAMLlocal1 (mantissa); + value res; + int exponent; + + mantissa = caml_copy_float32(frexpf(Float32_val(f), &exponent)); + res = caml_alloc_small(2, 0); + Field(res, 0) = mantissa; + Field(res, 1) = Val_int(exponent); + CAMLreturn (res); +} + +CAMLprim value caml_modf_float32(value f) +{ + CAMLparam0 (); + CAMLlocal2 (quo, rem); + value res; + float frem; + + quo = caml_copy_float32(modff(Float32_val(f), &frem)); + rem = caml_copy_float32(frem); + res = caml_alloc_small(2, 0); + Field(res, 0) = quo; + Field(res, 1) = rem; + CAMLreturn (res); +} + +/* The functions on bytes, strings, and bigstrings (ba_uint8) are only used + in bytecode builds. Otherwise, the flambda-backend compiler translates + the corresponding primitives directly to load/store instructions. */ + +CAMLprim value caml_string_getf32(value str, value index) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(index); + if (idx < 0 || idx + 3 >= caml_string_length(str)) caml_array_bound_error(); + float res = *(float*)&Byte_u(str, idx); + return caml_copy_float32(res); +#endif +} + +CAMLprim value caml_bytes_getf32(value str, value index) +{ + return caml_string_getf32(str, index); +} + +CAMLprim value caml_bytes_setf32(value str, value index, value newval) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(index); + if (idx < 0 || idx + 3 >= caml_string_length(str)) caml_array_bound_error(); + *(float*)&Byte_u(str, idx) = Float32_val(newval); + return Val_unit; +#endif +} + +CAMLprim value caml_ba_uint8_getf32(value vb, value vind) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(vind); + struct caml_ba_array * b = Caml_ba_array_val(vb); + if (idx < 0 || idx >= b->dim[0] - 3) caml_array_bound_error(); + float res = *(float*)&Byte_u(b->data, idx); + return caml_copy_float32(res); +#endif +} + +CAMLprim value caml_ba_uint8_setf32(value vb, value vind, value newval) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(vind); + struct caml_ba_array * b = Caml_ba_array_val(vb); + if (idx < 0 || idx >= b->dim[0] - 3) caml_array_bound_error(); + *(float*)&Byte_u(b->data, idx) = Float32_val(newval); + return Val_unit; +#endif +} + +/* Defined in bigarray.c */ +CAMLextern intnat caml_ba_offset(struct caml_ba_array * b, intnat * index); + +static value caml_ba_float32_get_aux(value vb, volatile value * vind, int nind) +{ + struct caml_ba_array * b = Caml_ba_array_val(vb); + intnat index[CAML_BA_MAX_NUM_DIMS]; + int i; + intnat offset; + + /* Check number of indices = number of dimensions of array + (maybe not necessary if ML typing guarantees this) */ + if (nind != b->num_dims) + caml_invalid_argument("Float32.Bigarray.get: wrong number of indices"); + /* Compute offset and check bounds */ + for (i = 0; i < b->num_dims; i++) index[i] = Long_val(vind[i]); + offset = caml_ba_offset(b, index); + /* Perform read */ + switch ((b->flags) & CAML_BA_KIND_MASK) { + case CAML_BA_FLOAT32: + return caml_copy_float32(((float *) b->data)[offset]); + default: + caml_invalid_argument("Float32.Bigarray.get: wrong kind"); + } +} + +CAMLprim value caml_ba_float32_get_1(value vb, value vind1) +{ + return caml_ba_float32_get_aux(vb, &vind1, 1); +} + +CAMLprim value caml_ba_float32_get_2(value vb, value vind1, value vind2) +{ + value vind[2]; + vind[0] = vind1; + vind[1] = vind2; + return caml_ba_float32_get_aux(vb, vind, 2); +} + +CAMLprim value caml_ba_float32_get_3(value vb, value vind1, value vind2, + value vind3) +{ + value vind[3]; + vind[0] = vind1; + vind[1] = vind2; + vind[2] = vind3; + return caml_ba_float32_get_aux(vb, vind, 3); +} + +static value caml_ba_float32_set_aux(value vb, volatile value * vind, + intnat nind, value newval) +{ + struct caml_ba_array * b = Caml_ba_array_val(vb); + intnat index[CAML_BA_MAX_NUM_DIMS]; + int i; + intnat offset; + + /* Check number of indices = number of dimensions of array + (maybe not necessary if ML typing guarantees this) */ + if (nind != b->num_dims) + caml_invalid_argument("Float32.Bigarray.set: wrong number of indices"); + /* Compute offset and check bounds */ + for (i = 0; i < b->num_dims; i++) index[i] = Long_val(vind[i]); + offset = caml_ba_offset(b, index); + /* Perform write */ + switch (b->flags & CAML_BA_KIND_MASK) { + case CAML_BA_FLOAT32: + ((float *) b->data)[offset] = Float32_val(newval); + break; + default: + caml_invalid_argument("Float32.Bigarray.get: wrong kind"); + } + return Val_unit; +} + +CAMLprim value caml_ba_float32_set_1(value vb, value vind1, value newval) +{ + return caml_ba_float32_set_aux(vb, &vind1, 1, newval); +} + +CAMLprim value caml_ba_float32_set_2(value vb, value vind1, value vind2, + value newval) +{ + value vind[2]; + vind[0] = vind1; + vind[1] = vind2; + return caml_ba_float32_set_aux(vb, vind, 2, newval); +} + +CAMLprim value caml_ba_float32_set_3(value vb, value vind1, value vind2, + value vind3, value newval) +{ + value vind[3]; + vind[0] = vind1; + vind[1] = vind2; + vind[2] = vind3; + return caml_ba_float32_set_aux(vb, vind, 3, newval); +} + +/* + OCaml runtime itself doesn't call setlocale, i.e. it is using + standard "C" locale by default, but it is possible that + third-party code loaded into process does. +*/ +#ifdef HAS_LOCALE +extern locale_t caml_locale; +#endif + +#if defined(_MSC_VER) || defined(__MINGW32__) +/* there is no analogue to uselocale in MSVC so just set locale for thread */ +#define USE_LOCALE setlocale(LC_NUMERIC,"C") +#define RESTORE_LOCALE do {} while(0) +#elif defined(HAS_LOCALE) +#define USE_LOCALE locale_t saved_locale = uselocale(caml_locale) +#define RESTORE_LOCALE uselocale(saved_locale) +#else +#define USE_LOCALE do {} while(0) +#define RESTORE_LOCALE do {} while(0) +#endif + +CAMLprim value caml_format_float32(value fmt, value arg) +{ + /* See caml_format_float */ + value res; + float f = Float32_val(arg); + +#ifdef HAS_BROKEN_PRINTF + if (isfinite(f)) { +#endif + USE_LOCALE; + res = caml_alloc_sprintf(String_val(fmt), f); + RESTORE_LOCALE; +#ifdef HAS_BROKEN_PRINTF + } else { + if (isnan(f)) { + res = caml_copy_string("nan"); + } else { + if (f > 0) + res = caml_copy_string("inf"); + else + res = caml_copy_string("-inf"); + } + } +#endif + return res; +} + +static int caml_float32_of_hex(const char * s, const char * end, float * res) +{ + /* See caml_float_of_hex */ + int64_t m = 0; /* the mantissa - top 60 bits at most */ + int n_bits = 0; /* total number of bits read */ + int m_bits = 0; /* number of bits in mantissa */ + int x_bits = 0; /* number of bits after mantissa */ + int dec_point = -1; /* bit count corresponding to decimal point */ + /* -1 if no decimal point seen */ + int exp = 0; /* exponent */ + char * p; /* for converting the exponent */ + float f; + + while (s < end) { + char c = *s++; + switch (c) { + case '.': + if (dec_point >= 0) return -1; /* multiple decimal points */ + dec_point = n_bits; + break; + case 'p': case 'P': { + long e; + if (*s == 0) return -1; /* nothing after exponent mark */ + e = strtol(s, &p, 10); + if (p != end) return -1; /* ill-formed exponent */ + /* Handle exponents larger than int by returning 0/infinity directly. + Mind that INT_MIN/INT_MAX are included in the test so as to capture + the overflow case of strtol on Win64 -- long and int have the same + size there. */ + if (e <= INT_MIN) { + *res = 0.f; + return 0; + } + else if (e >= INT_MAX) { + *res = m == 0 ? 0.f : HUGE_VALF; + return 0; + } + /* regular exponent value */ + exp = e; + s = p; /* stop at next loop iteration */ + break; + } + default: { /* Nonzero digit */ + int d; + if (c >= '0' && c <= '9') d = c - '0'; + else if (c >= 'A' && c <= 'F') d = c - 'A' + 10; + else if (c >= 'a' && c <= 'f') d = c - 'a' + 10; + else return -1; /* bad digit */ + n_bits += 4; + if (d == 0 && m == 0) break; /* leading zeros are skipped */ + if (m_bits < 60) { + /* There is still room in m. Add this digit to the mantissa. */ + m = (m << 4) + d; + m_bits += 4; + } else { + /* We've already collected 60 significant bits in m. + Now all we care about is whether there is a nonzero bit + after. In this case, round m to odd so that the later + rounding of m to FP produces the correct result. */ + if (d != 0) m |= 1; /* round to odd */ + x_bits += 4; + } + break; + } + } + } + if (n_bits == 0) return -1; + /* Convert mantissa to FP. We use a signed conversion because we can + (m has 60 bits at most) and because it is faster + on several architectures. */ + f = (float) (int64_t) m; + /* Adjust exponent to take decimal point and extra digits into account */ + { + int adj = x_bits; + if (dec_point >= 0) adj = adj + (dec_point - n_bits); + /* saturated addition exp + adj */ + if (adj > 0 && exp > INT_MAX - adj) + exp = INT_MAX; + else if (adj < 0 && exp < INT_MIN - adj) + exp = INT_MIN; + else + exp = exp + adj; + } + /* Apply exponent if needed */ + if (exp != 0) f = ldexpf(f, exp); + /* Done! */ + *res = f; + return 0; +} + +CAMLprim value caml_float32_of_string(value vs) +{ + /* See caml_float_of_string */ + char parse_buffer[64]; + char * buf, * dst, * end; + const char *src; + mlsize_t len; + int sign; + float f; + + /* Remove '_' characters before conversion */ + len = caml_string_length(vs); + buf = len < sizeof(parse_buffer) ? parse_buffer : caml_stat_alloc(len + 1); + src = String_val(vs); + dst = buf; + while (len--) { + char c = *src++; + if (c != '_') *dst++ = c; + } + *dst = 0; + if (dst == buf) goto error; + /* Check for hexadecimal FP constant */ + src = buf; + sign = 1; + if (*src == '-') { sign = -1; src++; } + else if (*src == '+') { src++; }; + if (src[0] == '0' && (src[1] == 'x' || src[1] == 'X')) { + /* Convert using our hexadecimal FP parser */ + if (caml_float32_of_hex(src + 2, dst, &f) == -1) goto error; + if (sign < 0) f = -f; + } else { + /* Convert using strtof, which is available when strtod is. */ +#if defined(HAS_STRTOD_L) && defined(HAS_LOCALE) + f = strtof_l((const char *) buf, &end, caml_locale); +#else + USE_LOCALE; + f = strtof((const char *) buf, &end); + RESTORE_LOCALE; +#endif /* HAS_STRTOD_L */ + if (end != dst) goto error; + } + if (buf != parse_buffer) caml_stat_free(buf); + return caml_copy_float32(f); + error: + if (buf != parse_buffer) caml_stat_free(buf); + caml_failwith("float32_of_string"); + return Val_unit; /* not reached */ +} + +/* Defined in array.c */ + +CAMLextern int caml_unboxed_array_no_polymorphic_compare(value v1, value v2); +CAMLextern intnat caml_unboxed_array_no_polymorphic_hash(value v); +CAMLextern void caml_unboxed_array_serialize(value v, uintnat* bsize_32, uintnat* bsize_64); +CAMLextern uintnat caml_unboxed_array_deserialize(void* dst); +CAMLextern value caml_make_vect(value len, value init); + +CAMLexport const struct custom_operations caml_unboxed_float32_array_ops[2] = { + { "_unboxed_float32_even_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, + { "_unboxed_float32_odd_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, +}; + +CAMLprim value caml_make_unboxed_float32_vect(value len) +{ + /* This is only used on 64-bit targets. */ + + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_float32_array_wosize) caml_invalid_argument("Array.make"); + + /* [num_fields] does not include the custom operations field. */ + mlsize_t num_fields = num_elements / 2 + num_elements % 2; + + return caml_alloc_custom(&caml_unboxed_float32_array_ops[num_elements % 2], + num_fields * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_float32_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_float32(0.0f)); +} + +/* [MM] [TODO]: Not consistent with the memory model. See the discussion in + https://github.com/ocaml-multicore/ocaml-multicore/pull/822. */ +CAMLprim value caml_unboxed_float32_vect_blit(value a1, value ofs1, value a2, + value ofs2, value n) +{ + /* See memory model [MM] notes in memory.c */ + atomic_thread_fence(memory_order_acquire); + // Need to skip the custom_operations field + memmove((float *)((uintnat *)a2 + 1) + Long_val(ofs2), + (float *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(float)); + return Val_unit; +} diff --git a/runtime/frame_descriptors.c b/runtime/frame_descriptors.c index 1c2169c0f44..b3f2622801a 100644 --- a/runtime/frame_descriptors.c +++ b/runtime/frame_descriptors.c @@ -35,10 +35,10 @@ extern intnat * caml_frametable[]; static frame_descr * next_frame_descr(frame_descr * d) { unsigned char num_allocs = 0, *p; - CAMLassert(d->retaddr >= 4096); + CAMLassert(Retaddr_frame(d) >= 4096); if (!frame_return_to_C(d)) { /* Skip to end of live_ofs */ - p = (unsigned char*)&d->live_ofs[d->num_live]; + p = frame_end_of_live_ofs(d); /* Skip alloc_lengths if present */ if (frame_has_allocs(d)) { num_allocs = *p; @@ -95,7 +95,7 @@ static void fill_hashtable( intnat len = *tbl; frame_descr * d = (frame_descr *)(tbl + 1); for (intnat j = 0; j < len; j++) { - uintnat h = Hash_retaddr(d->retaddr, table->mask); + uintnat h = Hash_retaddr(Retaddr_frame(d), table->mask); while (table->descriptors[h] != NULL) { h = (h+1) & table->mask; } @@ -224,7 +224,7 @@ frame_descr* caml_find_frame_descr(caml_frame_descrs fds, uintnat pc) while (1) { d = fds.descriptors[h]; if (d == 0) return NULL; /* can happen if some code compiled without -g */ - if (d->retaddr == pc) break; + if (Retaddr_frame(d) == pc) break; h = (h+1) & fds.mask; } return d; diff --git a/runtime/gc_ctrl.c b/runtime/gc_ctrl.c index 1b43aca8c86..8829e984b48 100644 --- a/runtime/gc_ctrl.c +++ b/runtime/gc_ctrl.c @@ -56,11 +56,12 @@ CAMLprim value caml_gc_quick_stat(value v) CAMLlocal1 (res); /* get a copy of these before allocating anything... */ - intnat majcoll, mincoll; + intnat majcoll, mincoll, compactions; struct gc_stats s; caml_compute_gc_stats(&s); majcoll = caml_major_cycles_completed; mincoll = atomic_load(&caml_minor_collections_count); + compactions = atomic_load(&caml_compactions_count); res = caml_alloc_tuple (17); Store_field (res, 0, caml_copy_double ((double)s.alloc_stats.minor_words)); @@ -81,7 +82,7 @@ CAMLprim value caml_gc_quick_stat(value v) Store_field (res, 10, Val_long (0)); Store_field (res, 11, Val_long (0)); Store_field (res, 12, Val_long (s.heap_stats.pool_frag_words)); - Store_field (res, 13, Val_long (0)); + Store_field (res, 13, Val_long (compactions)); Store_field (res, 14, Val_long ( s.heap_stats.pool_max_words + s.heap_stats.large_max_words)); Store_field (res, 15, Val_long (0)); @@ -109,8 +110,8 @@ CAMLprim value caml_gc_counters(value v) /* get a copy of these before allocating anything... */ double minwords = Caml_state->stat_minor_words - + ((double) Wsize_bsize ((uintnat)Caml_state->young_end - - (uintnat) Caml_state->young_ptr)) / sizeof(value); + + (double) Wsize_bsize ((uintnat)Caml_state->young_end - + (uintnat) Caml_state->young_ptr); double prowords = Caml_state->stat_promoted_words; double majwords = Caml_state->stat_major_words + (double) Caml_state->allocated_words; @@ -236,15 +237,15 @@ CAMLprim value caml_gc_minor(value v) caml_minor_collection (); value exn = caml_process_pending_actions_exn(); CAML_EV_END(EV_EXPLICIT_GC_MINOR); - return caml_raise_if_exception(exn); + return caml_raise_async_if_exception(exn, ""); } -static value gc_major_exn(void) +static value gc_major_exn(int force_compaction) { CAML_EV_BEGIN(EV_EXPLICIT_GC_MAJOR); caml_gc_log ("Major GC cycle requested"); caml_empty_minor_heaps_once(); - caml_finish_major_cycle(); + caml_finish_major_cycle(force_compaction); value exn = caml_process_pending_actions_exn(); CAML_EV_END(EV_EXPLICIT_GC_MAJOR); return exn; @@ -254,10 +255,10 @@ CAMLprim value caml_gc_major(value v) { Caml_check_caml_state(); CAMLassert (v == Val_unit); - return caml_raise_if_exception(gc_major_exn()); + return caml_raise_async_if_exception(gc_major_exn (0), ""); } -static value gc_full_major_exn(void) +static value gc_full_major_exn(int force_compaction) { int i; value exn = Val_unit; @@ -267,7 +268,7 @@ static value gc_full_major_exn(void) currently-unreachable object to be collected. */ for (i = 0; i < 3; i++) { caml_empty_minor_heaps_once(); - caml_finish_major_cycle(); + caml_finish_major_cycle(force_compaction && i == 2); exn = caml_process_pending_actions_exn(); if (Is_exception_result(exn)) break; } @@ -280,7 +281,7 @@ CAMLprim value caml_gc_full_major(value v) { Caml_check_caml_state(); CAMLassert (v == Val_unit); - return caml_raise_if_exception(gc_full_major_exn()); + return caml_raise_async_if_exception(gc_full_major_exn (0), ""); } CAMLprim value caml_gc_major_slice (value v) @@ -290,31 +291,29 @@ CAMLprim value caml_gc_major_slice (value v) caml_major_collection_slice(Long_val(v)); value exn = caml_process_pending_actions_exn(); CAML_EV_END(EV_EXPLICIT_GC_MAJOR_SLICE); - return caml_raise_if_exception(exn); + return caml_raise_async_if_exception(exn, ""); } CAMLprim value caml_gc_compaction(value v) { Caml_check_caml_state(); - value exn = Val_unit; CAML_EV_BEGIN(EV_EXPLICIT_GC_COMPACT); CAMLassert (v == Val_unit); - exn = gc_major_exn(); - ++ Caml_state->stat_forced_major_collections; + value exn = gc_full_major_exn(1); CAML_EV_END(EV_EXPLICIT_GC_COMPACT); - return exn; + return caml_raise_async_if_exception(exn, ""); } CAMLprim value caml_gc_stat(value v) { value res; CAML_EV_BEGIN(EV_EXPLICIT_GC_STAT); - res = gc_full_major_exn(); + res = gc_full_major_exn(0); if (Is_exception_result(res)) goto out; res = caml_gc_quick_stat(Val_unit); out: CAML_EV_END(EV_EXPLICIT_GC_STAT); - return caml_raise_if_exception(res); + return caml_raise_async_if_exception(res, ""); } CAMLprim value caml_get_minor_free (value v) diff --git a/runtime/gen_primitives.sh b/runtime/gen_primitives.sh index 109381d30ba..cb79c67d9cd 100755 --- a/runtime/gen_primitives.sh +++ b/runtime/gen_primitives.sh @@ -26,7 +26,7 @@ export LC_ALL=C lexing md5 meta memprof obj parsing signals str sys callback weak \ finalise domain platform fiber memory startup_aux runtime_events sync \ dynlink backtrace_byt backtrace afl \ - bigarray prng + bigarray prng float32 do sed -n -e 's/^CAMLprim value \([a-z0-9_][a-z0-9_]*\).*/\1/p' \ "runtime/$prim.c" diff --git a/runtime/globroots.c b/runtime/globroots.c index e55e23eface..4030a23f795 100644 --- a/runtime/globroots.c +++ b/runtime/globroots.c @@ -23,6 +23,8 @@ #include "caml/globroots.h" #include "caml/skiplist.h" #include "caml/stack.h" +#include "caml/callback.h" +#include "caml/fail.h" static caml_plat_mutex roots_mutex = CAML_PLAT_MUTEX_INITIALIZER; @@ -179,19 +181,73 @@ static link *cons(void *data, link *tl) { /* protected by roots_mutex */ static link * caml_dyn_globals = NULL; +static void caml_register_dyn_global(void *v) { + link *link = caml_dyn_globals; + while (link) { + if (link->data == v) { + const value *exn = caml_named_value("Register_dyn_global_duplicate"); + if (exn == NULL) { + fprintf(stderr, + "[ocaml] attempt to add duplicate in caml_dyn_globals: %p\n", v); + abort(); + } + caml_plat_unlock(&roots_mutex); + caml_raise(*exn); + } + link = link->next; + } + caml_dyn_globals = cons((void*) v,caml_dyn_globals); +} + void caml_register_dyn_globals(void **globals, int nglobals) { int i; caml_plat_lock(&roots_mutex); for (i = 0; i < nglobals; i++) - caml_dyn_globals = cons(globals[i],caml_dyn_globals); + caml_register_dyn_global(globals[i]); caml_plat_unlock(&roots_mutex); } +/* Logic to determine at which index within a global root to start and stop + scanning. [*glob_block], [*start], and [*stop] may be updated by this + function. */ +static void compute_index_for_global_root_scan(value* glob_block, int* start, + int* stop) +{ + *start = 0; + + CAMLassert (Is_block(*glob_block)); + + if (Tag_val(*glob_block) < No_scan_tag) { + /* Note: if a [Closure_tag] block is registered as a global root + (possibly containing one or more [Infix_tag] blocks), then only one + out of the combined set of the [Closure_tag] and [Infix_tag] blocks + may be registered as a global root. Multiple registrations can cause + the compactor to traverse the same fields of a block twice, which can + cause a failure. */ + if (Tag_val(*glob_block) == Infix_tag) + *glob_block -= Infix_offset_val(*glob_block); + + if (Tag_val(*glob_block) == Closure_tag) { + *start = Start_env_closinfo(Closinfo_val(*glob_block)); + *stop = Wosize_val(*glob_block); + } + else { + *stop = Scannable_wosize_val(*glob_block); + } + } + else { + /* Set the index such that none of the block's fields will be scanned. */ + *stop = 0; + } +} + static void scan_native_globals(scanning_action f, void* fdata) { int i, j; static link* dyn_globals; value* glob; + value glob_block; + int start, stop; link* lnk; caml_plat_lock(&roots_mutex); @@ -201,8 +257,10 @@ static void scan_native_globals(scanning_action f, void* fdata) /* The global roots */ for (i = 0; caml_globals[i] != 0; i++) { for(glob = caml_globals[i]; *glob != 0; glob++) { - for (j = 0; j < Wosize_val(*glob); j++){ - f(fdata, Field(*glob, j), &Field(*glob, j)); + glob_block = *glob; + compute_index_for_global_root_scan(&glob_block, &start, &stop); + for (j = start; j < stop; j++) { + f(fdata, Field(glob_block, j), &Field(glob_block, j)); } } } @@ -210,8 +268,10 @@ static void scan_native_globals(scanning_action f, void* fdata) /* Dynamic (natdynlink) global roots */ iter_list(dyn_globals, lnk) { for(glob = (value *) lnk->data; *glob != 0; glob++) { - for (j = 0; j < Wosize_val(*glob); j++){ - f(fdata, Field(*glob, j), &Field(*glob, j)); + glob_block = *glob; + compute_index_for_global_root_scan(&glob_block, &start, &stop); + for (j = start; j < stop; j++) { + f(fdata, Field(glob_block, j), &Field(glob_block, j)); } } } diff --git a/runtime/hash.c b/runtime/hash.c index 8567f27c19e..e09f890da32 100644 --- a/runtime/hash.c +++ b/runtime/hash.c @@ -24,6 +24,7 @@ #include "caml/custom.h" #include "caml/memory.h" #include "caml/hash.h" +#include "caml/fail.h" /* The implementation based on MurmurHash 3, https://github.com/aappleby/smhasher/ */ @@ -181,7 +182,14 @@ CAMLexport uint32_t caml_hash_mix_string(uint32_t h, value s) /* The generic hash function */ -CAMLprim value caml_hash(value count, value limit, value seed, value obj) +/* Internally to Jane Street, we have renamed [caml_hash] to [caml_hash_exn] + to suggest that calling it could raise. (E.g. it raises on mixed blocks.) + As such, we've removed [@@noalloc] from the OCaml [external] that references + this C binding, and would likewise need to remove [@@noalloc] from any + other [external] formerly bound to [caml_hash]. +*/ + +CAMLprim value caml_hash_exn(value count, value limit, value seed, value obj) { value queue[HASH_QUEUE_SIZE]; /* Queue of values to examine */ intnat rd; /* Position of first value in queue */ @@ -279,6 +287,9 @@ CAMLprim value caml_hash(value count, value limit, value seed, value obj) break; default: + if (Is_mixed_block_reserved(Reserved_val(v))) { + caml_invalid_argument("hash: mixed block value"); + } /* Mix in the tag and size, but do not count this towards [num] */ h = caml_hash_mix_uint32(h, Cleanhd_hd(Hd_val(v))); /* Copy fields into queue, not exceeding the total size [sz] */ diff --git a/runtime/instrtrace.c b/runtime/instrtrace.c index 44a17ad92fc..f0a3a41b3b4 100644 --- a/runtime/instrtrace.c +++ b/runtime/instrtrace.c @@ -85,7 +85,7 @@ void caml_disasm_instr(code_t pc) snprintf(buf, sizeof(buf), "%s %d\n", opbuf, pc[0]); break; /* Instructions with two operands */ case APPTERM: case CLOSURE: case CLOSUREREC: case PUSHGETGLOBALFIELD: - case GETGLOBALFIELD: case MAKEBLOCK: + case GETGLOBALFIELD: case MAKEBLOCK: case MAKE_FAUX_MIXEDBLOCK: case BEQ: case BNEQ: case BLTINT: case BLEINT: case BGTINT: case BGEINT: case BULTINT: case BUGEINT: snprintf(buf, sizeof(buf), "%s %d, %d\n", opbuf, pc[0], pc[1]); break; diff --git a/runtime/intern.c b/runtime/intern.c index ad28f61c5e4..84942ee97e8 100644 --- a/runtime/intern.c +++ b/runtime/intern.c @@ -368,7 +368,9 @@ static void intern_alloc_storage(struct caml_intern_state* s, mlsize_t whsize, wosize = Wosize_whsize(whsize); if (wosize <= Max_young_wosize && wosize != 0) { - v = caml_alloc_small (wosize, String_tag); + /* don't track bulk allocation in minor heap with statmemprof; + * individual block allocations are tracked instead */ + Alloc_small(v, wosize, String_tag, Alloc_small_enter_GC_no_track); s->intern_dest = (header_t *) Hp_val(v); } else { CAMLassert (s->intern_dest == NULL); @@ -398,17 +400,21 @@ static value intern_alloc_obj(struct caml_intern_state* s, caml_domain_state* d, (value*)s->intern_dest < d->young_end); p = s->intern_dest; *s->intern_dest = Make_header (wosize, tag, 0); + caml_memprof_sample_block(Val_hp(p), wosize, 1 + wosize, + CAML_MEMPROF_SRC_MARSHAL); s->intern_dest += 1 + wosize; } else { p = caml_shared_try_alloc(d->shared_heap, wosize, tag, - 0, /* no reserved bits */ - 0 /* not pinned */); + 0 /* no reserved bits */); d->allocated_words += Whsize_wosize(wosize); if (p == NULL) { intern_cleanup (s); caml_raise_out_of_memory(); } - Hd_hp(p) = Make_header (wosize, tag, caml_global_heap_state.MARKED); + Hd_hp(p) = Make_header (wosize, tag, caml_allocation_status()); + caml_memprof_sample_block(Val_hp(p), wosize, + Whsize_wosize(wosize), + CAML_MEMPROF_SRC_MARSHAL); } return Val_hp(p); } @@ -523,6 +529,15 @@ static void intern_rec(struct caml_intern_state* s, intern_cleanup(s); caml_failwith("input_value: integer too large"); break; +#endif + case CODE_UNBOXED_INT64: +#ifdef ARCH_SIXTYFOUR + v = (intnat) (read64u(s)); + break; +#else + intern_cleanup(); + caml_failwith("input_value: CODE_UNBOXED_INT64 not supported on 32 bit"); + break; #endif case CODE_SHARED8: ofs = read8u(s); diff --git a/runtime/interp.c b/runtime/interp.c index 92f6dd7d3eb..4d8c8e5efd0 100644 --- a/runtime/interp.c +++ b/runtime/interp.c @@ -265,14 +265,18 @@ value caml_interprete(code_t prog, asize_t prog_size) value env; intnat extra_args; struct caml_exception_context * initial_external_raise; + struct caml_exception_context * initial_external_raise_async; int initial_stack_words; intnat initial_trap_sp_off; volatile value raise_exn_bucket = Val_unit; - struct longjmp_buffer raise_buf; + volatile value raise_async_exn_bucket = Val_unit; + struct longjmp_buffer raise_buf, raise_async_buf; value resume_fn, resume_arg; caml_domain_state* domain_state = Caml_state; struct caml_exception_context exception_ctx = { &raise_buf, domain_state->local_roots, &raise_exn_bucket}; + struct caml_exception_context exception_ctx_async = + { &raise_async_buf, domain_state->local_roots, &raise_async_exn_bucket}; #ifndef THREADED_CODE opcode_t curr_instr; #endif @@ -300,7 +304,7 @@ value caml_interprete(code_t prog, asize_t prog_size) raise_unhandled_effect_closure = caml_alloc_small (2, Closure_tag); Code_val(raise_unhandled_effect_closure) = (code_t)raise_unhandled_effect_code; - Closinfo_val(raise_unhandled_effect_closure) = Make_closinfo(0, 2); + Closinfo_val(raise_unhandled_effect_closure) = Make_closinfo(0, 2, 1); raise_unhandled_effect = raise_unhandled_effect_closure; caml_register_generational_global_root(&raise_unhandled_effect); caml_global_data = Val_unit; @@ -316,6 +320,7 @@ value caml_interprete(code_t prog, asize_t prog_size) initial_stack_words = Stack_high(domain_state->current_stack) - domain_state->current_stack->sp; initial_external_raise = domain_state->external_raise; + initial_external_raise_async = domain_state->external_raise_async; if (sigsetjmp(raise_buf.buf, 0)) { /* no non-volatile local variables read here */ @@ -333,6 +338,41 @@ value caml_interprete(code_t prog, asize_t prog_size) } domain_state->external_raise = &exception_ctx; + if (sigsetjmp(raise_async_buf.buf, 0)) { + /* no non-volatile local variables read here */ + sp = domain_state->current_stack->sp; + accu = raise_async_exn_bucket; + + check_trap_barrier_for_exception (domain_state); + if (domain_state->backtrace_active) { + /* pc has already been pushed on the stack when calling the C + function that raised the exception. No need to push it again + here. */ + caml_stash_backtrace(accu, sp, 0); + } + + /* Skip any exception handlers installed by this invocation of + [caml_interprete]. This will cause the [raise_notrace] code below to + return asynchronous exceptions to the caller, typically in + [caml_callbackN_exn0]. When that function reraises such an exception + then [trap_sp_off] will correctly be pointing at the most recent prior + trap. */ + domain_state->trap_sp_off = 1; + + /* Effects not supported yet in conjunction with async exns + (see caml_raise_async) */ + if (Stack_parent(domain_state->current_stack) != NULL) + caml_fatal_error("Effects not supported in conjunction with async exns"); + + domain_state->external_raise = initial_external_raise; + domain_state->external_raise_async = initial_external_raise_async; + domain_state->trap_sp_off = initial_trap_sp_off; + domain_state->current_stack->sp = + Stack_high(domain_state->current_stack) - initial_stack_words ; + return Make_exception_result(accu); + } + domain_state->external_raise_async = &exception_ctx_async; + domain_state->trap_sp_off = 1; sp = domain_state->current_stack->sp; @@ -624,7 +664,7 @@ value caml_interprete(code_t prog, asize_t prog_size) Field(accu, 2) = env; for (i = 0; i < num_args; i++) Field(accu, i + 3) = sp[i]; Code_val(accu) = pc - 3; /* Point to the preceding RESTART instr. */ - Closinfo_val(accu) = Make_closinfo(0, 2); + Closinfo_val(accu) = Make_closinfo(0, 2, 1); sp += num_args; goto do_return; } @@ -648,7 +688,7 @@ value caml_interprete(code_t prog, asize_t prog_size) /* The code pointer is not in the heap, so no need to go through caml_initialize. */ Code_val(accu) = pc + *pc; - Closinfo_val(accu) = Make_closinfo(0, 2); + Closinfo_val(accu) = Make_closinfo(0, 2, 1); pc++; sp += nvars; Next; @@ -680,13 +720,14 @@ value caml_interprete(code_t prog, asize_t prog_size) *--sp = accu; p = &Field(accu, 0); *p++ = (value) (pc + pc[0]); - *p++ = Make_closinfo(0, envofs); + *p++ = Make_closinfo(0, envofs, nfuncs < 2); for (i = 1; i < nfuncs; i++) { *p++ = Make_header(i * 3, Infix_tag, 0); /* color irrelevant */ *--sp = (value) p; *p++ = (value) (pc + pc[i]); envofs -= 3; - *p++ = Make_closinfo(0, envofs); + CAMLassert(i <= nfuncs - 1); + *p++ = Make_closinfo(0, envofs, i == nfuncs - 1); } pc += nfuncs; Next; @@ -799,6 +840,25 @@ value caml_interprete(code_t prog, asize_t prog_size) accu = block; Next; } + Instruct(MAKE_FAUX_MIXEDBLOCK): { + mlsize_t wosize = *pc++; + tag_t tag = *pc++; + mlsize_t i; + value block; + if (wosize <= Max_young_wosize) { + Alloc_small_with_reserved(block, wosize, tag, Enter_gc, + Faux_mixed_block_sentinel); + Field(block, 0) = accu; + for (i = 1; i < wosize; i++) Field(block, i) = *sp++; + } else { + block = + caml_alloc_shr_reserved(wosize, tag, Faux_mixed_block_sentinel); + caml_initialize(&Field(block, 0), accu); + for (i = 1; i < wosize; i++) caml_initialize(&Field(block, i), *sp++); + } + accu = block; + Next; + } Instruct(MAKEFLOATBLOCK): { mlsize_t size = *pc++; mlsize_t i; @@ -972,6 +1032,7 @@ value caml_interprete(code_t prog, asize_t prog_size) if (domain_state->trap_sp_off > 0) { if (Stack_parent(domain_state->current_stack) == NULL) { domain_state->external_raise = initial_external_raise; + domain_state->external_raise_async = initial_external_raise_async; domain_state->trap_sp_off = initial_trap_sp_off; domain_state->current_stack->sp = Stack_high(domain_state->current_stack) - initial_stack_words ; @@ -1256,6 +1317,7 @@ value caml_interprete(code_t prog, asize_t prog_size) Instruct(STOP): domain_state->external_raise = initial_external_raise; + domain_state->external_raise_async = initial_external_raise_async; domain_state->trap_sp_off = initial_trap_sp_off; domain_state->current_stack->sp = sp; return accu; diff --git a/runtime/ints.c b/runtime/ints.c index 5c610abe666..5b594131572 100644 --- a/runtime/ints.c +++ b/runtime/ints.c @@ -334,9 +334,14 @@ CAMLprim value caml_int32_format(value fmt, value arg) return caml_alloc_sprintf(format_string, Int32_val(arg)); } +CAMLprim int32_t caml_int32_of_string_unboxed(value s) +{ + return (int32_t) parse_intnat(s, 32, INT32_ERRMSG); +} + CAMLprim value caml_int32_of_string(value s) { - return caml_copy_int32((int32_t) parse_intnat(s, 32, INT32_ERRMSG)); + return caml_copy_int32(caml_int32_of_string_unboxed(s)); } int32_t caml_int32_bits_of_float_unboxed(double d) @@ -582,7 +587,7 @@ CAMLprim value caml_int64_format(value fmt, value arg) return caml_alloc_sprintf(format_string, Int64_val(arg)); } -CAMLprim value caml_int64_of_string(value s) +CAMLprim int64_t caml_int64_of_string_unboxed(value s) { const char * p; uint64_t res, threshold; @@ -616,7 +621,12 @@ CAMLprim value caml_int64_of_string(value s) } } if (sign < 0) res = - res; - return caml_copy_int64(res); + return res; +} + +CAMLprim value caml_int64_of_string(value s) +{ + return caml_copy_int64(caml_int64_of_string_unboxed(s)); } int64_t caml_int64_bits_of_float_unboxed(double d) @@ -845,7 +855,33 @@ CAMLprim value caml_nativeint_format(value fmt, value arg) return caml_alloc_sprintf(format_string, Nativeint_val(arg)); } +CAMLprim intnat caml_nativeint_of_string_unboxed(value s) +{ + return parse_intnat(s, 8 * sizeof(value), INTNAT_ERRMSG); +} + CAMLprim value caml_nativeint_of_string(value s) { - return caml_copy_nativeint(parse_intnat(s, 8 * sizeof(value), INTNAT_ERRMSG)); + return caml_copy_nativeint(caml_nativeint_of_string_unboxed(s)); +} + +CAMLprim value caml_reinterpret_tagged_int63_as_unboxed_int64(value i) +{ + // This should only be called on 64-bit targets. + // This stub is only used for bytecode, so in fact the "unboxed_int64" + // is to be boxed. + CAMLassert(sizeof(value) == 8); + CAMLassert(Is_long(i)); + return caml_copy_int64((int64_t) i); +} + +CAMLprim value caml_reinterpret_unboxed_int64_as_tagged_int63(value i) +{ + // This should only be called on 64-bit targets. + // This stub is only used for bytecode, so in fact the "unboxed_int64" + // is boxed. + CAMLassert(sizeof(value) == 8); + CAMLassert(Is_block(i)); + CAMLassert(Tag_val(i) == Custom_tag); + return (value) (Int64_val(i) | 1L); } diff --git a/runtime/major_gc.c b/runtime/major_gc.c index 5c099105536..e91e590dc23 100644 --- a/runtime/major_gc.c +++ b/runtime/major_gc.c @@ -31,6 +31,7 @@ #include "caml/globroots.h" #include "caml/gc_stats.h" #include "caml/memory.h" +#include "caml/memprof.h" #include "caml/mlvalues.h" #include "caml/platform.h" #include "caml/roots.h" @@ -217,6 +218,9 @@ static void ephe_next_cycle (void) static void ephe_todo_list_emptied (void) { + /* If we haven't started marking, the todo list can grow (during ephemeron + allocation), so we should not yet announce that it has emptied */ + CAMLassert (caml_marking_started()); caml_plat_lock(&ephe_lock); /* Force next ephemeron marking cycle in order to avoid reasoning about @@ -263,7 +267,8 @@ static caml_plat_mutex orphaned_lock = CAML_PLAT_MUTEX_INITIALIZER; void caml_add_orphaned_finalisers (struct caml_final_info* f) { - CAMLassert (caml_gc_phase == Phase_sweep_and_mark_main); + CAMLassert (caml_gc_phase == Phase_sweep_main || + caml_gc_phase == Phase_sweep_and_mark_main); CAMLassert (!f->updated_first); CAMLassert (!f->updated_last); @@ -384,7 +389,7 @@ void caml_adopt_orphaned_work (void) CAMLassert (!f->updated_last); CAMLassert (!myf->updated_first); CAMLassert (!myf->updated_last); - CAMLassert (caml_gc_phase == Phase_sweep_and_mark_main); + CAMLassert (caml_gc_phase == Phase_sweep_main); if (f->todo_head) { if (myf->todo_tail == NULL) { CAMLassert(myf->todo_head == NULL); @@ -739,7 +744,7 @@ Caml_inline void mark_stack_push_range(struct mark_stack* stk, static intnat mark_stack_push_block(struct mark_stack* stk, value block) { int i, end; - uintnat block_wsz = Wosize_val(block), offset = 0; + uintnat block_scannable_wsz, offset = 0; if (Tag_val(block) == Closure_tag) { /* Skip the code pointers and integers at beginning of closure; @@ -756,9 +761,11 @@ static intnat mark_stack_push_block(struct mark_stack* stk, value block) CAMLassert(Tag_val(block) < No_scan_tag); CAMLassert(Tag_val(block) != Cont_tag); + block_scannable_wsz = Scannable_wosize_val(block); + /* Optimisation to avoid pushing small, unmarkable objects such as [Some 42] into the mark stack. */ - end = (block_wsz < 8 ? block_wsz : 8); + end = (block_scannable_wsz < 8 ? block_scannable_wsz : 8); for (i = offset; i < end; i++) { value v = Field(block, i); @@ -767,14 +774,14 @@ static intnat mark_stack_push_block(struct mark_stack* stk, value block) break; } - if (i == block_wsz){ + if (i == block_scannable_wsz){ /* nothing left to mark and credit header */ - return Whsize_wosize(block_wsz - offset); + return Whsize_wosize(block_scannable_wsz - offset); } mark_stack_push_range(stk, Op_val(block) + i, - Op_val(block) + block_wsz); + Op_val(block) + block_scannable_wsz); /* take credit for the work we skipped due to the optimisation. we will take credit for the header later as part of marking. */ @@ -909,7 +916,16 @@ Caml_noinline static intnat do_some_marking(struct mark_stack* stk, } me.start = Op_val(block); - me.end = me.start + Wosize_hd(hd); + + reserved_t reserved = Reserved_hd(hd); + if (Is_mixed_block_reserved(reserved)) { + uintnat scannable_wosize = + Scannable_wosize_reserved(reserved, Wosize_hd(hd)); + me.end = me.start + scannable_wosize; + budget -= Wosize_hd(hd) - scannable_wosize; /* unscannable suffix */ + } else { + me.end = me.start + Wosize_hd(hd); + } if (Tag_hd(hd) == Closure_tag) { uintnat env_offset = Start_env_closinfo(Closinfo_val(block)); @@ -1041,7 +1057,7 @@ void caml_darken_cont(value cont) value stk = Field(cont, 0); if (Ptr_val(stk) != NULL) caml_scan_stack(&caml_darken, darken_scanning_flags, Caml_state, - Ptr_val(stk), 0); + Ptr_val(stk), 0, NULL); atomic_store_release(Hp_atomic_val(cont), With_status_hd(hd, caml_global_heap_state.MARKED)); } @@ -1053,6 +1069,7 @@ void caml_darken(void* state, value v, volatile value* ignored) { header_t hd; if (!Is_markable (v)) return; /* foreign stack, at least */ + CAMLassert(caml_marking_started()); hd = Hd_val(v); if (Tag_hd(hd) == Infix_tag) { v -= Infix_offset_hd(hd); @@ -1089,6 +1106,7 @@ static intnat ephe_mark (intnat budget, uintnat for_cycle, int alive_data; intnat marked = 0, made_live = 0; + CAMLassert(caml_marking_started()); if (domain_state->ephe_info->cursor.cycle == for_cycle && !force_alive) { prev_linkp = domain_state->ephe_info->cursor.todop; @@ -1189,11 +1207,81 @@ static intnat ephe_sweep (caml_domain_state* domain_state, intnat budget) return budget; } -static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, - int participating_count, - caml_domain_state** participating) +static void start_marking (int participant_count, caml_domain_state** barrier_participants) +{ + caml_domain_state* domain = Caml_state; + /* Need to ensure the minor heap is empty before we snapshot the roots, + because the minor heap may currently point to UNMARKED major blocks */ + if (barrier_participants) { + caml_empty_minor_heap_no_major_slice_from_stw + (domain, (void*)0, participant_count, barrier_participants); + } else { + caml_empty_minor_heaps_once (); + } + + /* CR ocaml 5 domains (sdolan): + Either this transition needs to be synchronised between domains, + or a different write barrier needs to be used while some domains + have started marking and others have not. */ + CAMLassert(caml_domain_alone()); + caml_gc_phase = Phase_sweep_and_mark_main; + + CAML_EV_BEGIN(EV_MAJOR_MARK_ROOTS); + caml_do_roots (&caml_darken, darken_scanning_flags, domain, domain, 0); + { + uintnat work_unstarted = WORK_UNSTARTED; + if(atomic_compare_exchange_strong(&domain_global_roots_started, + &work_unstarted, + WORK_STARTED)){ + caml_scan_global_roots(&caml_darken, domain); + } + } + CAML_EV_END(EV_MAJOR_MARK_ROOTS); + + CAML_EV_BEGIN(EV_MAJOR_MEMPROF_ROOTS); + int is_main_domain = + barrier_participants == NULL || barrier_participants[0] == domain; + caml_memprof_scan_roots(caml_darken, darken_scanning_flags, domain, + domain, false, is_main_domain); + CAML_EV_END(EV_MAJOR_MEMPROF_ROOTS); + + caml_gc_log("Marking started, %ld entries on mark stack", + (long)domain->mark_stack->count); + + if (domain->mark_stack->count == 0 && + !caml_addrmap_iter_ok(&domain->mark_stack->compressed_stack, + domain->mark_stack->compressed_stack_iter) + ) { + atomic_fetch_add_verify_ge0(&num_domains_to_mark, -1); + domain->marking_done = 1; + } + + if (domain->ephe_info->todo == (value) NULL) + ephe_todo_list_emptied(); +} + +struct cycle_callback_params { + int force_compaction; +}; + +static void stw_cycle_all_domains(caml_domain_state* domain, void* args, + int participating_count, + caml_domain_state** participating) { uintnat num_domains_in_stw; + /* We copy params because the stw leader may leave early. No barrier needed + because there's one in the minor gc and after. */ + struct cycle_callback_params params = *((struct cycle_callback_params*)args); + + /* TODO: Not clear this memprof work is really part of the "cycle" + * operation. It's more like ephemeron-cleaning really. An earlier + * version had a separate callback for this, but resulted in + * failures because using caml_try_run_on_all_domains() on it would + * mysteriously put all domains back into mark/sweep. + */ + CAML_EV_BEGIN(EV_MAJOR_MEMPROF_CLEAN); + caml_memprof_after_major_gc(domain, domain == participating[0]); + CAML_EV_END(EV_MAJOR_MEMPROF_CLEAN); CAML_EV_BEGIN(EV_MAJOR_GC_CYCLE_DOMAINS); @@ -1279,7 +1367,7 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, atomic_store_release(&num_domains_to_sweep, num_domains_in_stw); atomic_store_release(&num_domains_to_mark, num_domains_in_stw); - caml_gc_phase = Phase_sweep_and_mark_main; + caml_gc_phase = Phase_sweep_main; atomic_store(&ephe_cycle_info.num_domains_todo, num_domains_in_stw); atomic_store(&ephe_cycle_info.ephe_cycle, 1); atomic_store(&ephe_cycle_info.num_domains_done, 0); @@ -1314,6 +1402,12 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, caml_cycle_heap(domain->shared_heap); + /* Compact here if requested (or, in some future version, if the heap overhead + is too high). */ + if (params.force_compaction) { + caml_compact_heap(domain, participating_count, participating); + } + /* Collect domain-local stats to emit to runtime events */ struct heap_stats local_stats; caml_collect_heap_stats_sample(Caml_state->shared_heap, &local_stats); @@ -1332,30 +1426,8 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, (uintnat)local_stats.large_blocks); domain->sweeping_done = 0; - - /* Mark roots for new cycle */ domain->marking_done = 0; - CAML_EV_BEGIN(EV_MAJOR_MARK_ROOTS); - caml_do_roots (&caml_darken, darken_scanning_flags, domain, domain, 0); - { - uintnat work_unstarted = WORK_UNSTARTED; - if(atomic_compare_exchange_strong(&domain_global_roots_started, - &work_unstarted, - WORK_STARTED)){ - caml_scan_global_roots(&caml_darken, domain); - } - } - CAML_EV_END(EV_MAJOR_MARK_ROOTS); - - if (domain->mark_stack->count == 0 && - !caml_addrmap_iter_ok(&domain->mark_stack->compressed_stack, - domain->mark_stack->compressed_stack_iter) - ) { - atomic_fetch_add_verify_ge0(&num_domains_to_mark, -1); - domain->marking_done = 1; - } - /* Ephemerons */ // Adopt orphaned work from domains that were spawned and terminated in // the previous cycle. @@ -1370,8 +1442,6 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, domain->ephe_info->cycle = 0; domain->ephe_info->cursor.todop = NULL; domain->ephe_info->cursor.cycle = 0; - if (domain->ephe_info->todo == (value) NULL) - ephe_todo_list_emptied(); /* Finalisers */ domain->final_info->updated_first = 0; @@ -1477,7 +1547,8 @@ static char collection_slice_mode_char(collection_slice_mode mode) static void major_collection_slice(intnat howmuch, int participant_count, caml_domain_state** barrier_participants, - collection_slice_mode mode) + collection_slice_mode mode, + int force_compaction) { caml_domain_state* domain_state = Caml_state; intnat sweep_work = 0, mark_work = 0; @@ -1525,8 +1596,17 @@ static void major_collection_slice(intnat howmuch, if (log_events) CAML_EV_END(EV_MAJOR_SWEEP); } + if (domain_state->sweeping_done && + caml_gc_phase == Phase_sweep_main && + get_major_slice_work(mode) > 0 && + mode != Slice_opportunistic) { + start_marking(participant_count, barrier_participants); + } + + mark_again: - if (!domain_state->marking_done && + if (caml_marking_started() && + !domain_state->marking_done && get_major_slice_work(mode) > 0) { if (log_events) CAML_EV_BEGIN(EV_MAJOR_MARK); @@ -1541,7 +1621,7 @@ static void major_collection_slice(intnat howmuch, if (log_events) CAML_EV_END(EV_MAJOR_MARK); } - if (mode != Slice_opportunistic) { + if (mode != Slice_opportunistic && caml_marking_started()) { /* Finalisers */ if (caml_gc_phase == Phase_mark_final && get_major_slice_work(mode) > 0 && @@ -1682,13 +1762,17 @@ static void major_collection_slice(intnat howmuch, cycle simultaneously, we loop until the current cycle has ended, ignoring whether caml_try_run_on_all_domains succeeds. */ + struct cycle_callback_params params; + params.force_compaction = force_compaction; while (saved_major_cycle == caml_major_cycles_completed) { if (barrier_participants) { - cycle_all_domains_callback - (domain_state, (void*)0, participant_count, barrier_participants); + stw_cycle_all_domains + (domain_state, (void*)¶ms, + participant_count, barrier_participants); } else { - caml_try_run_on_all_domains(&cycle_all_domains_callback, 0, 0); + caml_try_run_on_all_domains + (&stw_cycle_all_domains, (void*)¶ms, 0); } } } @@ -1696,7 +1780,7 @@ static void major_collection_slice(intnat howmuch, void caml_opportunistic_major_collection_slice(intnat howmuch) { - major_collection_slice(howmuch, 0, 0, Slice_opportunistic); + major_collection_slice(howmuch, 0, 0, Slice_opportunistic, 0); } void caml_major_collection_slice(intnat howmuch) @@ -1709,7 +1793,8 @@ void caml_major_collection_slice(intnat howmuch) AUTO_TRIGGERED_MAJOR_SLICE, 0, 0, - Slice_interruptible + Slice_interruptible, + 0 ); if (caml_incoming_interrupts_queued()) { caml_gc_log("Major slice interrupted, rescheduling major slice"); @@ -1718,41 +1803,62 @@ void caml_major_collection_slice(intnat howmuch) } else { /* TODO: could make forced API slices interruptible, but would need to do accounting or pass up interrupt */ - major_collection_slice(howmuch, 0, 0, Slice_uninterruptible); + major_collection_slice(howmuch, 0, 0, Slice_uninterruptible, 0); } /* Record that this domain has completed a major slice for this minor cycle. */ Caml_state->major_slice_epoch = major_slice_epoch; } -static void finish_major_cycle_callback (caml_domain_state* domain, void* arg, - int participating_count, - caml_domain_state** participating) +struct finish_major_cycle_params { + uintnat saved_major_cycles; + int force_compaction; +}; + +static void stw_finish_major_cycle (caml_domain_state* domain, void* arg, + int participating_count, + caml_domain_state** participating) { - uintnat saved_major_cycles = (uintnat)arg; + /* We must copy params because the leader may exit this + before other domains do. There is at least one barrier somewhere + in the major cycle ending, so we don't need one immediately + after this. */ + struct finish_major_cycle_params params = + *((struct finish_major_cycle_params*)arg); + CAMLassert (domain == Caml_state); caml_empty_minor_heap_no_major_slice_from_stw (domain, (void*)0, participating_count, participating); CAML_EV_BEGIN(EV_MAJOR_FINISH_CYCLE); - while (saved_major_cycles == caml_major_cycles_completed) { + while (params.saved_major_cycles == caml_major_cycles_completed) { major_collection_slice(10000000, participating_count, participating, - Slice_uninterruptible); + Slice_uninterruptible, params.force_compaction); } CAML_EV_END(EV_MAJOR_FINISH_CYCLE); } -void caml_finish_major_cycle (void) +void caml_finish_major_cycle (int force_compaction) { uintnat saved_major_cycles = caml_major_cycles_completed; while( saved_major_cycles == caml_major_cycles_completed ) { - caml_try_run_on_all_domains - (&finish_major_cycle_callback, (void*)caml_major_cycles_completed, 0); + struct finish_major_cycle_params params; + params.force_compaction = force_compaction; + params.saved_major_cycles = caml_major_cycles_completed; + + caml_try_run_on_all_domains(&stw_finish_major_cycle, (void*)¶ms, 0); } } +#ifdef DEBUG +int caml_mark_stack_is_empty(void) +{ + return Caml_state->mark_stack->count == 0; +} +#endif + void caml_empty_mark_stack (void) { while (!Caml_state->marking_done){ @@ -1770,6 +1876,9 @@ void caml_finish_marking (void) { if (!Caml_state->marking_done) { CAML_EV_BEGIN(EV_MAJOR_FINISH_MARKING); + if (!caml_marking_started()) { + start_marking(0, NULL); + } caml_empty_mark_stack(); caml_shrink_mark_stack(); Caml_state->stat_major_words += Caml_state->allocated_words; @@ -1890,6 +1999,7 @@ int caml_init_major_gc(caml_domain_state* d) { caml_addrmap_iterator(&d->mark_stack->compressed_stack); /* Fresh domains do not need to performing marking or sweeping. */ + /* CR ocaml 5 domains: how does this interact with Phase_sweep_main? */ d->sweeping_done = 1; d->marking_done = 1; /* Finalisers. Fresh domains participate in updating finalisers. */ diff --git a/runtime/memory.c b/runtime/memory.c index 83cd540ecf5..747c3638f8d 100644 --- a/runtime/memory.c +++ b/runtime/memory.c @@ -24,6 +24,7 @@ #include "caml/misc.h" #include "caml/fail.h" #include "caml/memory.h" +#include "caml/memprof.h" #include "caml/major_gc.h" #include "caml/signals.h" #include "caml/shared_heap.h" @@ -137,7 +138,8 @@ Caml_inline void write_barrier( then this is in a remembered set already */ if (Is_young(old_val)) return; /* old is a block and in the major heap */ - caml_darken(Caml_state, old_val, 0); + if (caml_marking_started()) + caml_darken(Caml_state, old_val, 0); } /* this update is creating a new link from major to minor, remember it */ if (Is_block_and_young(new_val)) { @@ -244,6 +246,13 @@ CAMLexport int caml_atomic_cas_field ( } } +CAMLprim value caml_atomic_make(value v) +{ + CAMLparam1(v); + value ref = caml_alloc_small(1, 0); + Field(ref, 0) = v; + CAMLreturn(ref); +} CAMLprim value caml_atomic_load (value ref) { @@ -316,26 +325,159 @@ CAMLprim value caml_atomic_fetch_add (value ref, value incr) return ret; } -CAMLexport void caml_set_fields (value obj, value v) +CAMLexport int caml_is_stack (value v) { int i; - CAMLassert (Is_block(obj)); + struct caml_local_arenas* loc = Caml_state->local_arenas; + if (!Is_block(v)) return 0; + if (Color_hd(Hd_val(v)) != NOT_MARKABLE) return 0; + if (loc == NULL) return 0; + + /* Search local arenas, starting from the largest (last) */ + for (i = 0; i < loc->count; i++) { + struct caml_local_arena arena = loc->arenas[i]; + if (arena.base <= (char*)v && (char*)v < arena.base + arena.length) + return 1; + } + + return 0; +} + +/* This version of [caml_modify] may additionally be used to mutate + locally-allocated objects. (This version is used by mutations + generated from OCaml code when the value being modified may be + locally allocated) */ +CAMLexport void caml_modify_local (value obj, intnat i, value val) +{ + if (Color_hd(Hd_val(obj)) == NOT_MARKABLE) { + /* This function should not be used on external values, but we have seen + some cases where it has been, in safe contexts where only immediate + values are involved. */ + CAMLassert(caml_is_stack(obj) + || (!Is_block(val) && !Is_block(Field(obj, i)))); + Field(obj, i) = val; + } else { + caml_modify(&Field(obj, i), val); + } +} - for (i = 0; i < Wosize_val(obj); i++) { - caml_modify(&Field(obj, i), v); +CAMLexport caml_local_arenas* caml_get_local_arenas(caml_domain_state* dom) +{ + caml_local_arenas* s = dom->local_arenas; + if (s != NULL) + s->saved_sp = dom->local_sp; + return s; +} + +CAMLexport void caml_set_local_arenas(caml_domain_state* dom, caml_local_arenas* s) +{ + dom->local_arenas = s; + if (s != NULL) { + struct caml_local_arena a = s->arenas[s->count - 1]; + dom->local_sp = s->saved_sp; + dom->local_top = (void*)(a.base + a.length); + dom->local_limit = - a.length; + } else { + dom->local_sp = 0; + dom->local_top = NULL; + dom->local_limit = 0; } } +void caml_local_realloc(void) +{ + caml_local_arenas* s = caml_get_local_arenas(Caml_state); + intnat i; + char* arena; + caml_stat_block block; + if (s == NULL) { + s = caml_stat_alloc(sizeof(*s)); + s->count = 0; + s->next_length = 0; + s->saved_sp = Caml_state->local_sp; + } + if (s->count == Max_local_arenas) + caml_fatal_error("Local allocation stack overflow - exceeded Max_local_arenas"); + + do { + if (s->next_length == 0) { + s->next_length = Init_local_arena_bsize; + } else { + /* overflow check */ + CAML_STATIC_ASSERT(((intnat)Init_local_arena_bsize << (2*Max_local_arenas)) > 0); + s->next_length *= 4; + } + /* may need to loop, if a very large allocation was requested */ + } while (s->saved_sp + s->next_length < 0); + + arena = caml_stat_alloc_aligned_noexc(s->next_length, 0, &block); + if (arena == NULL) + caml_fatal_error("Local allocation stack overflow - out of memory"); +#ifdef DEBUG + for (i = 0; i < s->next_length; i += sizeof(value)) { + *((header_t*)(arena + i)) = Debug_uninit_local; + } +#endif + for (i = s->saved_sp; i < 0; i += sizeof(value)) { + *((header_t*)(arena + s->next_length + i)) = Local_uninit_hd; + } + caml_gc_message(0x08, + "Growing local stack to %"ARCH_INTNAT_PRINTF_FORMAT"d kB\n", + s->next_length / 1024); + s->count++; + s->arenas[s->count-1].length = s->next_length; + s->arenas[s->count-1].base = arena; + s->arenas[s->count-1].alloc_block = block; + caml_set_local_arenas(Caml_state, s); + CAMLassert(Caml_state->local_limit <= Caml_state->local_sp); +} + +CAMLexport value caml_alloc_local(mlsize_t wosize, tag_t tag) +{ +#if defined(NATIVE_CODE) && defined(STACK_ALLOCATION) + intnat sp = Caml_state->local_sp; + header_t* hp; + sp -= Bhsize_wosize(wosize); + Caml_state->local_sp = sp; + if (sp < Caml_state->local_limit) + caml_local_realloc(); + hp = (header_t*)((char*)Caml_state->local_top + sp); + *hp = Make_header(wosize, tag, NOT_MARKABLE); + return Val_hp(hp); +#else + if (wosize <= Max_young_wosize) { + return caml_alloc_small(wosize, tag); + } else { + /* The return value is initialised directly using Field. + This is invalid if it may create major -> minor pointers. + So, perform a minor GC to prevent this. (See caml_make_vect) */ + caml_minor_collection(); + return caml_alloc_shr(wosize, tag); + } +#endif +} + +CAMLprim value caml_local_stack_offset(value blk) +{ +#ifdef NATIVE_CODE + intnat sp = Caml_state->local_sp; + return Val_long(-sp); +#else + return Val_long(0); +#endif +} + + Caml_inline value alloc_shr(mlsize_t wosize, tag_t tag, reserved_t reserved, int noexc) { Caml_check_caml_state(); caml_domain_state *dom_st = Caml_state; value *v = caml_shared_try_alloc(dom_st->shared_heap, - wosize, tag, reserved, 0); + wosize, tag, reserved); if (v == NULL) { if (!noexc) - caml_raise_out_of_memory(); + caml_fatal_out_of_memory(); else return (value)NULL; } @@ -348,11 +490,17 @@ Caml_inline value alloc_shr(mlsize_t wosize, tag_t tag, reserved_t reserved, #ifdef DEBUG if (tag < No_scan_tag) { + /* We don't check the reserved bits here because this is OK even for mixed + blocks. */ mlsize_t i; for (i = 0; i < wosize; i++) Op_hp(v)[i] = Debug_uninit_major; } #endif + caml_memprof_sample_block(Val_hp(v), wosize, + Whsize_wosize(wosize), + CAML_MEMPROF_SRC_NORMAL); + return Val_hp(v); } @@ -466,7 +614,7 @@ CAMLexport void caml_stat_create_pool(void) if (pool == NULL) { pool = malloc(SIZEOF_POOL_BLOCK); if (pool == NULL) - caml_fatal_error("Fatal error: out of memory.\n"); + caml_fatal_out_of_memory (); #ifdef DEBUG pool->magic = Debug_pool_magic; #endif @@ -542,7 +690,7 @@ CAMLexport void* caml_stat_alloc_aligned(asize_t sz, int modulo, void *result = caml_stat_alloc_aligned_noexc(sz, modulo, b); /* malloc() may return NULL if size is 0 */ if ((result == NULL) && (sz != 0)) - caml_raise_out_of_memory(); + caml_fatal_out_of_memory(); return result; } @@ -552,7 +700,7 @@ CAMLexport caml_stat_block caml_stat_alloc(asize_t sz) void *result = caml_stat_alloc_noexc(sz); /* malloc() may return NULL if size is 0 */ if ((result == NULL) && (sz != 0)) - caml_raise_out_of_memory(); + caml_fatal_out_of_memory(); return result; } @@ -601,7 +749,7 @@ CAMLexport caml_stat_block caml_stat_resize(caml_stat_block b, asize_t sz) { void *result = caml_stat_resize_noexc(b, sz); if (result == NULL) - caml_raise_out_of_memory(); + caml_fatal_out_of_memory(); return result; } @@ -633,7 +781,7 @@ CAMLexport caml_stat_string caml_stat_strdup(const char *s) { caml_stat_string result = caml_stat_strdup_noexc(s); if (result == NULL) - caml_raise_out_of_memory(); + caml_fatal_out_of_memory(); return result; } @@ -644,7 +792,7 @@ CAMLexport wchar_t * caml_stat_wcsdup(const wchar_t *s) int slen = wcslen(s); wchar_t* result = caml_stat_alloc((slen + 1)*sizeof(wchar_t)); if (result == NULL) - caml_raise_out_of_memory(); + caml_fatal_out_of_memory(); memcpy(result, s, (slen + 1)*sizeof(wchar_t)); return result; } diff --git a/runtime/memprof.c b/runtime/memprof.c index c7bd1b4cfd3..5434cf34d6b 100644 --- a/runtime/memprof.c +++ b/runtime/memprof.c @@ -15,191 +15,1024 @@ #define CAML_INTERNALS -#include "caml/fail.h" - -CAMLprim value caml_memprof_start(value lv, value szv, value tracker_param) -{ - caml_failwith("Gc.memprof.start: not implemented in multicore"); -} - -CAMLprim value caml_memprof_stop(value unit) -{ - caml_failwith("Gc.memprof.stop: not implemented in multicore"); -} - -/* FIXME: integrate memprof with multicore */ -#if 0 - -#include -#include "caml/memprof.h" -#include "caml/fail.h" +#include +#include #include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/backtrace_prim.h" #include "caml/callback.h" -#include "caml/signals.h" +#include "caml/fail.h" +#include "caml/frame_descriptors.h" #include "caml/memory.h" -#include "caml/minor_gc.h" -#include "caml/backtrace_prim.h" -#include "caml/weak.h" -#include "caml/stack.h" -#include "caml/misc.h" -#include "caml/compact.h" -#include "caml/printexc.h" +#include "caml/memprof.h" +#include "caml/mlvalues.h" +#include "caml/platform.h" #include "caml/runtime_events.h" +#include "caml/shared_heap.h" + +/* Design + * + * 1. Data Design + * + * 1.1. Configuration + * + * A Gc.Memprof.t value (a "profile" from the OCaml point of view) is + * a block on the OCaml heap containing the profile configuration. As + * a profile may be shared between threads and domains, keeping it on + * the OCaml heap allows us not to worry about its liveness - pointers + * to it from memprof data structures are simply treated as GC roots. + * The "status" field in this object allows distinct domains to safely + * `stop` and `discard` (with atomic reads and writes). + * + * 1.2. Entries + * + * Each block of memory tracked by memprof is represented by an + * "entry" structure (entry_s, *entry_t). It tracks the state of the + * block of memory, and its progress through the various callbacks. + * + * A resizable table of entry structures is called an "entries" table + * (entries_s, *entries_t). It tracks ranges of those entries which + * may (a) be ripe for running a callback, (b) be marked for deletion, + * or (c) contain pointers to the minor heap (to be scanned in a minor + * collection). As processing each of these actions proceeds linearly + * through the table, this tracking is done simply by keeping the + * lowest possible entry index for each purpose. The code to perform + * each action (running a callback, evicting a deleted entry, or + * scanning a pointer) checks whether an entry does require the action + * before performing it. + * + * The entries table also has a pointer to the configuration object on + * the OCaml heap, for the profile under which all the entries in the + * table were sampled. This allows callbacks on the table to be run at + * any later time, regardless of the currently-sampling profile of the + * particular domain running the callback. A consequence is that all + * entries in a table must be from the same profile. + * + * After a profile is "discarded", entries may still exist for blocks + * allocated in that profile, but no callbacks will be called for it + * (those entries themselves will be discarded lazily). + * + * There is code for iterating over entries in a table, which is used + * when scanning for GC roots or updating tables to reflect GC activity + * (see below). + * + * 1.3. Threads + * + * The memprof state of a particular systhread is a "thread state" + * (memprof_thread_s, *memprof_thread_t). It has an entries table, for + * blocks allocated by this thread whose allocation callback has not + * yet completed. All allocation callbacks are guaranteed to be called + * by the thread performing the allocation (in the rare circumstance in + * which this is impossible, the tracking entry is discarded). + * + * This thread state structure exists whether or not the systhreads + * module is initialized (one thread state per domain), and whether or + * not memprof is running. + * + * 1.4. Domains + * + * The memprof state of a domain is a "domain state" + * (memprof_domain_s, *memprof_domain_t). It has an entries table, for + * blocks allocated in this domain whose allocation callbacks have + * completed. If a domain terminates, or starts a new profile, while + * it still has tracked entries from a previous profile, those tracked + * entries become "orphaned" (see below). + * + * The domain state has a linked list of thread states for all the + * threads in the domain, and a pointer to the current thread state. + * + * This structure exists whether or not memprof is running. A pointer + * to it is kept in the caml_domain_state. + * + * 1.5. Orphans + * + * When sampling is stopped for a profile, all domains and threads + * continue to manage the entry tables for it as before, but without + * sampling and creating new entries. However, if a domain _starts_ a + * profile while it has entries (tracked blocks) from a previous + * profile which has not been "discarded", it moves those entries to + * its "orphans" list - a linked list of entry tables - for subsequent + * processing. + * + * If a domain is terminated, all its current and orphaned entries + * (and those of its threads) are moved to a global `orphans` + * list. This list, and its protective lock `orphans_lock`, are the + * only memprof global variables. No domain processes the entries in + * the global orphans list directly: the first domain to look at the + * list (either at a collection or when checking for pending + * callbacks) adopts all entry tables on it into its own orphans list, + * and then processes them as its own. + * + * 2. Synchronisation + * + * Mostly threads and domains are free to run callbacks on their own + * allocated blocks without explicitly synchronising. Care is taken + * not to assume that the memprof state of any given thread or entry + * in a domain is preserved outside of memprof code, as another thread + * in the same domain may run and modify that state, but we assume + * that the systhreads module effectively serializes entries to + * memprof within a single domain (for these purposes, entering and + * returning from a callback is treated as leaving and re-entering + * memprof code). + * + * However, there are some structures shared between domains. The main + * such structure is the profile configuration object on the Caml + * heap. The only field written in this object is the status field, + * used to communicate between domains sharing the profile, when a + * profile is stopped or discarded. This field is inspected or set + * atomically by the `Status` and `Set_status` macros. If a profile is + * found to be discarded (`CONFIG_STATUS_DISCARDED`) then no domain + * need take any action on it (and we can lazily discard any state + * from it). + * + * The only other data shared between domains is the global orphans + * list. As noted above, this is protected by a single global lock, + * `orphans_lock`. Because an entry table only gets onto the global + * orphans list when its owning domain terminates (at which point all + * threads of that domain have terminated), and a table is adopted + * from the global orphans list before being processed, all callbacks + * and other entry table processing is performed by a thread of the + * domain which owns the entry table. (and actions of those threads + * are serialized by `systhreads`). + * + * 3. Interface with GC + * + * 3.1. Root scanning + * + * Memprof may have a large number of strong GC roots: one per tracked + * block, pointing to the tracking information ('minor or 'major, in + * the Gc.Memprof.tracker sense), plus the pointer to a config block + * in every entries table. Rather than manually registering and + * deregistering all of these, the GC calls caml_memprof_scan_roots() + * to scan them, in either minor or major collections. This function + * is called by all domains in parallel. A single domain adopts any + * global orphaned entries tables, and then each domain scans its own + * roots. + * + * 3.2. Updating block status. + * + * After a major or minor GC, memprof has to check tracked blocks to + * discover whether they have survived the GC, or (for a minor GC) + * whether they have been promoted to the major heap. This is done by + * caml_memprof_after_minor_gc() and caml_memprof_after_major_gc(), + * which share the system for iterating over entries tables as used by + * caml_memprof_scan_roots(). Again, these functions are called by all + * domains in parallel; a single domain starts by adopting any global + * orphaned entries tables, and then each domain updates its own + * entries. + * + * 3.3. Compaction + * + * GC compaction may move all objects in the major heap, so all + * memprof roots must be scanned and potentially updated, including + * the weak roots (i.e. pointers to the tracked blocks). This is done + * by the same caml_memprof_scan_roots() function as root scanning in + * regular GCs, using a boolean argument to indicate that weak roots + * should also be scanned. + * + * 4. Random Number Generation + * + * 4.1. Requirements + * + * We sample every word of allocation with the same probability + * (lambda, usually very small) - a Bernoulli trial. For the + * allocation of a block on the shared heap, or any allocation from + * the C runtime, we need to know how many samples we make of that + * block (usually zero). This is a **binomial random variable**, + * parameterized by lambda and N (the number of words in the block, + * including the header). + * + * For allocations by Caml on the minor heap, we use the existing GC + * trigger mechanism, to cause Caml to enter the runtime when "the + * next sample" is due. The amount of allocation before "the next + * sample" is a **geometric random variable**, parameterized by + * lambda. + * + * 4.2. Implementation + * + * We focus on generating geometric pseudo-random numbers (PRNs), and + * simulate binomial PRNs for parameters (lambda, N) by counting + * geometric PRNs for lambda which sum to no more than N. + * + * We use a high-quality high-performance 32-bit uniform PRNG + * (xoshiro128+), with per-domain state vectors. We initialize the + * per-domain state vector with a low-quality PRNG (SplitMX64), seeded + * separately for each domain. + * + * To convert from a uniform PRN `u` to a geometric PRN `g`, we compute + * + * g = floor(1 + log(u) / log(1-lambda)) + * + * where we treat u as uniformly distributed in [0,1]. We pre-compute + * 1/log(1-lambda) (called `one_log1m_lambda` here), and compute + * log(u) using a combination of type punning and a 3rd-degree + * polynomial (see `log_approx()`). + * + * For further efficiency we generate geometric PRNs in blocks, and + * the generating code is designed to be vectorizable. + * + * 5. Backtraces + * + * We have to be able to sample the current backtrace at any + * allocation point, and pass it (as a Caml array) to the allocation + * callback. We assume that in most cases these backtraces have short + * lifetimes, so we don't want to allocate them on the shared + * heap. However, we can't always allocate them directly on the Caml + * minor heap, as some allocations (e.g. allocating in the shared heap + * from the runtime) may take place at points at which GC is not safe + * (and so minor-heap allocation is not permitted). In those cases we + * "stash" the backtrace on the C heap, and copy it onto the Caml heap + * when we are about to call the allocation callback. + * + * 6. Sampling + * + * We sample allocation for all threads in a domain which has a + * currently sampling profile, except when such a thread is running a + * memprof callback, which "suspends" sampling on that thread. + * + * Allocation sampling divides into two cases: one simple and one + * complex. + * + * 6.1. Simple Sampling + * + * When sampling an allocation by the runtime (as opposed to + * allocation by Caml), an entry is added to the thread's entry table, + * for subsequent processing. No allocation callback is called at + * allocation time, because the heap may not be consistent so + * allocation by the callback is not safe (see "Backtraces"). + * + * 6.2. Minor Heap Caml Allocation Sampling + * + * Caml code allocates on the minor heap by pointer-bumping, and only + * drops into the runtime if the `young_ptr` allocation pointer hits + * the `young_trigger`, usually triggering a garbage collection. When + * profiling, we set the trigger at the next word which we want to + * sample (see "Random Number Generation"), thus allowing us to enter + * memprof code at the approporiate allocation point. However, + * sampling the allocation is more complex in this case for several + * reasons: + * + * - Deferred allocation. A sampled block is not actually allocated + * until the runtime returns to the GC poll point in Caml code, + * after the memprof sampling code has run. So we have to predict + * the address of the sampled block for the entry record, to track + * its future promotion or collection. Until the allocation callback + * has run, instead of the allocated block address, the entry holds + * the offset in words of the block within the combined allocation, + * and the entry's `offset` field is set. + * + * - Combined allocations. A single GC poll point in Caml code may + * combine the allocation of several distinct blocks, each of which + * may be sampled independently. We create an entry for each sampled + * block and then run all allocation callbacks. + * + * - Prompt allocation callbacks. We call allocation callbacks + * directly from memprof as we sample the allocated blocks. These + * callbacks could be deferred (as are the ones in the "Simple + * Sampling" case), but that would require twice as many entries + * into memprof code. So the allocation callback is called before + * the sampled block is actually allocated (see above), and several + * allocation callbacks may be called at any given GC poll point + * (due to combined allocations). We take care to arrange heap + * metadata such that it is safe to run allocation callbacks (which + * may allocate and trigger minor and major GCs). + * + * - Other callbacks. In order to call the allocation callbacks from + * the poll point, we process the thread's entries table. This may + * call other callbacks for the same thread (specifically: deferred + * "Simple Sampling" callbacks). + * + * - Callback effects. Any callback may raise an exception, stop + * sampling, start a new profile, and/or discard a profile. + * + * If a callback raises an exception, none of the allocations from + * the current poll point will take place. However, some allocation + * callbacks may already have been called. If so, we mark those + * entries as "deallocated", so that matching deallocation callbacks + * will run. We simply delete any tracking entry from the current + * poll point which has not yet run an allocation callback. Then we + * propagate the exception up to Caml. + * + * If a callback stops sampling, subsequent allocations from the + * current poll point will not be sampled. + * + * If a callback stops sampling and starts a new profile, none of + * the allocations from the current poll point are subsequently + * tracked (through promotion and/or deallocation), as it's not + * possible to reconstruct the allocation addresses of the tracking + * entries, so they are simply deleted (or marked as deallocated, as + * in the exceptional case). The new profile effectively begins with + * the following poll point or other allocation. + * + * Most of this complexity is managed in caml_memprof_sample_young(). + * + * 7. Callbacks + * + * Some callbacks are run at allocation time, for allocations from + * Caml (see under "Sampling" above). Other allocation callbacks, and + * all post-allocation callbacks, are run during + * `caml_memprof_run_callbacks_exn()`, which is called by the + * runtime's general pending-action mechanism at poll points. + * + * We set the domain's action-pending flag when we notice we have + * pending callbacks. Caml drops into the runtime at a poll point, and + * calls `caml_memprof_run_callbacks_exn()`, whenever the + * action-pending flag is set, whether or not memprof set it. So + * memprof maintains its own per-domain `pending` flag, to avoid + * suspending/unsuspending sampling, and checking all the entries + * tables, when there are no pending callbacks. + * + * This is particularly important because when we unsuspend sampling, + * we reset the young-limit, which has the side-effect of setting the + * domain's action-pending flag. TODO: consider changing + * `caml_reset_young_limit` so it doesn't do this. + * + * Allocation callbacks are always run by the thread which made the + * allocation, unless that thread terminates before running the + * callback, in which case it is inherited by the domain. + * + * Callbacks are run by iterating through candidate entries in a entry + * table. See under "Entries" above. A single entry may have more than + * one callback to run (if, for example, it has been promoted *and* + * garbage collected since the last time callbacks for that entry were + * run) - they are run in the natural order. + */ +/* number of random variables in a batch */ #define RAND_BLOCK_SIZE 64 -static uint32_t xoshiro_state[4][RAND_BLOCK_SIZE]; -static uintnat rand_geom_buff[RAND_BLOCK_SIZE]; -static uint32_t rand_pos; +/* type aliases for the hierarchy of structures for managing memprof status */ -/* [lambda] is the mean number of samples for each allocated word (including - block headers). */ -static double lambda = 0; -/* Precomputed value of [1/log(1-lambda)], for fast sampling of - geometric distribution. - Dummy if [lambda = 0]. */ -static float one_log1m_lambda; +typedef struct entry_s entry_s, *entry_t; +typedef struct entries_s entries_s, *entries_t; +typedef struct memprof_domain_s memprof_domain_s, *memprof_domain_t; +typedef struct memprof_thread_s memprof_thread_s, *memprof_thread_t; +typedef struct memprof_orphan_table_s memprof_orphan_table_s, + *memprof_orphan_table_t; -static intnat callstack_size; +/* A memprof configuration is held in an object on the Caml heap, of + * type Gc.Memprof.t. Here we define getter macros for each field, and + * a setter macro for the status field (which is updated). */ -/* accessors for the OCaml type [Gc.Memprof.tracker], - which is the type of the [tracker] global below. */ -#define Alloc_minor(tracker) (Field(tracker, 0)) -#define Alloc_major(tracker) (Field(tracker, 1)) -#define Promote(tracker) (Field(tracker, 2)) -#define Dealloc_minor(tracker) (Field(tracker, 3)) -#define Dealloc_major(tracker) (Field(tracker, 4)) +#define CONFIG_FIELDS 9 -static value tracker; +#define CONFIG_FIELD_STATUS 0 +#define CONFIG_FIELD_LAMBDA 1 +#define CONFIG_FIELD_1LOG1ML 2 +#define CONFIG_FIELD_STACK_FRAMES 3 +#define CONFIG_FIELD_ALLOC_MINOR 4 +#define CONFIG_FIELD_ALLOC_MAJOR 5 +#define CONFIG_FIELD_PROMOTE 6 +#define CONFIG_FIELD_DEALLOC_MINOR 7 +#define CONFIG_FIELD_DEALLOC_MAJOR 8 -/* Gc.Memprof.allocation_source */ -enum { SRC_NORMAL = 0, SRC_MARSHAL = 1, SRC_CUSTOM = 2 }; +#define CONFIG_FIELD_FIRST_CALLBACK CONFIG_FIELD_ALLOC_MINOR +#define CONFIG_FIELD_LAST_CALLBACK CONFIG_FIELD_DEALLOC_MAJOR -struct tracked { - /* Memory block being sampled. This is a weak GC root. */ - value block; +#define CONFIG_STATUS_SAMPLING 0 +#define CONFIG_STATUS_STOPPED 1 +#define CONFIG_STATUS_DISCARDED 2 - /* Number of samples in this block. */ - uintnat n_samples; +#define CONFIG_NONE Val_unit + +#define Status(config) Int_val(Field(config, CONFIG_FIELD_STATUS)) +#define Sampling(config) ((config != CONFIG_NONE) && \ + (Status(config) == CONFIG_STATUS_SAMPLING)) + +/* The 'status' field is the only one we ever update. */ + +#define Set_status(config, stat) \ + Store_field(config, CONFIG_FIELD_STATUS, Val_int(stat)) + +/* lambda: the fraction of allocated words to sample. 0 <= lambda <= 1 */ +#define Lambda(config) \ + Double_val(Field(config, CONFIG_FIELD_LAMBDA)) + +/* 1/ln(1-lambda), pre-computed for use in the geometric RNG */ +#define One_log1m_lambda(config) \ + Double_val(Field(config, CONFIG_FIELD_1LOG1ML)) + +/* If lambda is zero or very small, computing one_log1m_lambda + * underflows. It should always be treated as negative infinity in + * that case, (effectively turning sampling off). */ +#define MIN_ONE_LOG1M_LAMBDA (-INFINITY) + +#define Min_lambda(config) \ + (One_log1m_lambda(config) == MIN_ONE_LOG1M_LAMBDA) - /* The size of this block. */ - uintnat wosize; +/* The number of stack frames to record for each allocation site */ +#define Callstack_size(config) \ + Int_val(Field(config, CONFIG_FIELD_STACK_FRAMES)) + +/* callbacks */ +#define Alloc_minor(config) Field(config, CONFIG_FIELD_ALLOC_MINOR) +#define Alloc_major(config) Field(config, CONFIG_FIELD_ALLOC_MAJOR) +#define Promote(config) Field(config, CONFIG_FIELD_PROMOTE) +#define Dealloc_minor(config) Field(config, CONFIG_FIELD_DEALLOC_MINOR) +#define Dealloc_major(config) Field(config, CONFIG_FIELD_DEALLOC_MAJOR) + +/* Callback indexes. "Major" and "minor" are not distinguished here. */ + +#define CB_NONE 0 +#define CB_ALLOC 1 +#define CB_PROMOTE 2 +#define CB_DEALLOC 3 + +/* Maximum value of a callback index */ +#define CB_MAX CB_DEALLOC + +/* How many bits required for a callback index */ +#define CB_BITS 2 + +/* the mask for a given callback index */ +#define CB_MASK(cb) (1 << ((cb) - 1)) + +/* Structure for each tracked allocation. Six words (with many spare + * bits in the final word). */ + +struct entry_s { + /* Memory block being sampled. This is a weak GC root. Note that + * during the allocation callback of a block allocated directly by OCaml, + * this may be a comballoc offset (and the `offset` flag set). */ + value block; /* The value returned by the previous callback for this block, or - the callstack if the alloc callback has not been called yet. - This is a strong GC root. */ + * the callstack (as a value-tagged pointer to the C heap) if the + * alloc callback has not been called yet. This is a strong GC + * root. */ value user_data; - /* The thread currently running a callback for this entry, - or NULL if there is none */ - struct caml_memprof_th_ctx* running; + /* Number of samples in this block. */ + size_t samples; + + /* The size of this block, in words (not including the header). */ + size_t wosize; - /* Whether this block has been initially allocated in the minor heap. */ - unsigned int alloc_young : 1; + /* The thread currently running a callback for this entry, + * or NULL if there is none */ + memprof_thread_t runner; - /* The source of the allocation: normal allocations, marshal or custom_mem. */ + /* The source of the allocation: normal allocations, interning, + * or custom_mem (CAML_MEMPROF_SRC_*). */ unsigned int source : 2; - /* Whether this block has been promoted. Implies [alloc_young]. */ - unsigned int promoted : 1; + /* Is `block` actually an offset? */ + bool offset : 1; - /* Whether this block has been deallocated. */ - unsigned int deallocated : 1; + /* Was this block initially allocated in the minor heap? */ + bool alloc_young : 1; - /* Whether the allocation callback has been called depends on - whether the entry is in a thread local entry array or in - [entries_global]. */ + /* Has this block been promoted? Implies [alloc_young]. */ + bool promoted : 1; - /* Whether the promotion callback has been called. */ - unsigned int cb_promote_called : 1; + /* Has this block been deallocated? */ + bool deallocated : 1; - /* Whether the deallocation callback has been called. */ - unsigned int cb_dealloc_called : 1; + /* Has this entry been marked for deletion. */ + bool deleted : 1; - /* Whether this entry is deleted. */ - unsigned int deleted : 1; + /* Which callback (CB_*) is currently running for this entry. + * Useful when debugging. */ + unsigned int callback : CB_BITS; + + /* A mask of callbacks (1 << (CB_* - 1)) which have been called (not + * necessarily completed) for this entry. */ + unsigned int callbacks : CB_MAX; + + /* There are a number of spare bits here for future expansion, + * without increasing the size of an entry */ }; -/* During the alloc callback for a minor allocation, the block being - sampled is not yet allocated. Instead, we place in the block field - a value computed with the following macro: */ -#define Placeholder_magic 0x04200000 -#define Placeholder_offs(offset) (Val_long(offset + Placeholder_magic)) -#define Offs_placeholder(block) (Long_val(block) & 0xFFFF) -#define Is_placeholder(block) \ - (Is_long(block) && (Long_val(block) & ~(uintnat)0xFFFF) == Placeholder_magic) - -/* A resizable array of entries */ -struct entry_array { - struct tracked* t; - uintnat min_alloc_len, alloc_len, len; - /* Before this position, the [block] and [user_data] fields point to - the major heap ([young <= len]). */ - uintnat young_idx; - /* There are no blocks to be deleted before this position - ([delete_idx <= len]). */ - uintnat delete_idx; +/* A resizable array of entry_s entries. */ + +struct entries_s { + entry_t t; /* Pointer to array of entry_s structures */ + size_t min_capacity, capacity, size; /* array allocation management */ + + /* Before this position, the [block] and [user_data] fields both + * point to the major heap ([young <= size]). */ + size_t young; + + /* There are no blocks to be evicted before this position + * ([evict <= size]). */ + size_t evict; + + /* There are no pending callbacks before this position + * ([active <= size]). */ + size_t active; + + /* The profiling configuration under which these blocks were + * allocated. A strong GC root. */ + value config; }; -#define MIN_ENTRIES_LOCAL_ALLOC_LEN 16 -#define MIN_ENTRIES_GLOBAL_ALLOC_LEN 128 +/* Per-thread memprof state. */ -/* Entries for other blocks. This variable is shared across threads. */ -static struct entry_array entries_global = - { NULL, MIN_ENTRIES_GLOBAL_ALLOC_LEN, 0, 0, 0, 0 }; +/* Minimum capacity of a per-thread entries array */ +#define MIN_ENTRIES_THREAD_CAPACITY 16 -/* There are no pending callbacks in [entries_global] before this - position ([callback_idx <= entries_global.len]). */ -static uintnat callback_idx; +/* Minimum capacity of a per-domain entries array */ +#define MIN_ENTRIES_DOMAIN_CAPACITY 128 -#define CB_IDLE -1 -#define CB_LOCAL -2 -#define CB_STOPPED -3 +/* Minimum capacity of an orphaned entries array */ +#define MIN_ENTRIES_ORPHAN_CAPACITY 16 -/* Structure for thread-local variables. */ -struct caml_memprof_th_ctx { - /* [suspended] is used for masking memprof callbacks when +struct memprof_thread_s { + /* [suspended] is used for inhibiting memprof callbacks when a callback is running or when an uncaught exception handler is called. */ - int suspended; - - /* [callback_status] contains: - - CB_STOPPED if the current thread is running a callback, but - sampling has been stopped using [caml_memprof_stop]; - - The index of the corresponding entry in the [entries_global] - array if the current thread is currently running a promotion or - a deallocation callback; - - CB_LOCAL if the current thread is currently running an - allocation callback; - - CB_IDLE if the current thread is not running any callback. - */ - intnat callback_status; - - /* Entries for blocks whose alloc callback has not yet been called. */ - struct entry_array entries; -} caml_memprof_main_ctx = - { 0, CB_IDLE, { NULL, MIN_ENTRIES_LOCAL_ALLOC_LEN, 0, 0, 0, 0 } }; -static struct caml_memprof_th_ctx* local = &caml_memprof_main_ctx; - -/* Pointer to the word following the next sample in the minor - heap. Equals [Caml_state->young_alloc_start] if no sampling is planned in - the current minor heap. - Invariant: [caml_memprof_young_trigger <= Caml_state->young_ptr]. - */ -value* caml_memprof_young_trigger; + bool suspended; + + /* The index of the entry in `running_table` for which this thread is + * currently in a callback */ + size_t running_index; + + /* Pointer to entries table for the current callback, or NULL if not + * currently running a callback. */ + entries_t running_table; + + /* Entries for blocks allocated in this thread whose alloc callback + * has not yet been called. */ + entries_s entries; + + /* Per-domain memprof information */ + memprof_domain_t domain; + + /* Linked list of thread structures for this domain. Could use a + * doubly-linked list for performance, but I haven't measured it. */ + memprof_thread_t next; +}; + +/* Per-domain memprof state */ + +struct memprof_domain_s { + /* The owning domain */ + caml_domain_state *caml_state; + + /* Tracking entries for this domain. In the usual case these are + * entries allocated by a thread in this domain for which the + * allocation callback has returned: the entry is then transferred + * to this per-domain table. However, this table will also include + * entries for threads in this domain which terminated before + * calling the allocation callback. entries.config is the current + * memprof configuration for this domain. */ + entries_s entries; + + /* Orphaned entries - either from previous profiles run in this + * domain or adopted from terminated domains. */ + memprof_orphan_table_t orphans; + + /* true if there may be callbacks to be processed on the orphans list. */ + bool orphans_pending; + + /* true if there may be any callbacks pending for this domain */ + bool pending; + + /* Linked list of threads in this domain */ + memprof_thread_t threads; + + /* The current thread's memprof state. */ + memprof_thread_t current; + + /* Buffer used to compute backtraces */ + backtrace_slot *callstack_buffer; + size_t callstack_buffer_len; + + /* ---- random number generation state ---- */ + + /* RAND_BLOCK_SIZE separate xoshiro+128 state vectors, defined in this + * column-major order so that SIMD-aware compilers can parallelize the + * algorithm. */ + uint32_t xoshiro_state[4][RAND_BLOCK_SIZE]; + + /* Array of computed geometric random variables */ + uintnat rand_geom_buff[RAND_BLOCK_SIZE]; + uint32_t rand_pos; + + /* Surplus amount of the current sampling distance, not consumed by + * previous allocations. Still a legitimate sample of a geometric + * random variable. */ + uintnat next_rand_geom; +}; + +struct memprof_orphan_table_s { + /* An orphaned entries table */ + entries_s entries; + + /* next orphaned table in a linked list. */ + memprof_orphan_table_t next; +}; + +/* List of orphaned entry tables not yet adopted by any domain. */ +static memprof_orphan_table_t orphans = NULL; + +/* lock controlling access to `orphans` variable */ +static caml_plat_mutex orphans_lock = CAML_PLAT_MUTEX_INITIALIZER; + +/**** Initializing and clearing entries tables ****/ + +static void entries_init(entries_t es, size_t min_capacity, value config) +{ + es->t = NULL; + es->min_capacity = min_capacity; + es->capacity = es->size = es->young = es->evict = es->active = 0; + es->config = config; +} + +static void entries_clear(entries_t es) +{ + if (es->t) { + caml_stat_free(es->t); + es->t = NULL; + } + es->capacity = es->size = es->young = es->evict = es->active = 0; + es->config = CONFIG_NONE; +} + +/**** Managing entries. ****/ + +/* When an entries table needs to grow, grow it by this factor */ +#define ENTRIES_GROWTH_FACTOR 2 + +/* Do not shrink an entries table until it is this much too large */ +#define ENTRIES_SHRINK_FACTOR 4 + +/* Reallocate the [es] entries table if it is either too small or too + * large. [grow] is the number of free cells needed. + * Returns false if reallocation was necessary but failed, and truer + * otherwise. */ + +static bool entries_ensure(entries_t es, size_t grow) +{ + if (es->capacity == 0 && grow == 0) { + /* Don't want min_capacity for an unused table. */ + return true; + } + size_t new_size = es->size + grow; + if (new_size <= es->capacity && + (ENTRIES_SHRINK_FACTOR * new_size >= es->capacity || + es->capacity == es->min_capacity)) { + /* No need to grow or shrink */ + return true; + } + size_t new_capacity = new_size * ENTRIES_GROWTH_FACTOR; + if (new_capacity < es->min_capacity) + new_capacity = es->min_capacity; + entry_t new_t = caml_stat_resize_noexc(es->t, new_capacity * sizeof(entry_s)); + if (new_t == NULL) return false; + es->t = new_t; + es->capacity = new_capacity; + return true; +} + +#define Invalid_index (~(size_t)0) + +/* Create and initialize a new entry in an entries table, and return + * its index (or Invalid_index if allocation fails). */ + +Caml_inline size_t new_entry(entries_t es, + value block, value user_data, + size_t wosize, size_t samples, + int source, bool is_young, + bool offset) +{ + if (!entries_ensure(es, 1)) + return Invalid_index; + size_t i = es->size ++; + entry_t e = es->t + i; + e->block = block; + e->user_data = user_data; + e->samples = samples; + e->wosize = wosize; + e->runner = NULL; + e->source = source; + e->offset = offset; + e->alloc_young = is_young; + e->promoted = false; + e->deallocated = false; + e->deleted = false; + e->callback = CB_NONE; + e->callbacks = 0; + return i; +} + +/* Mark a given entry in an entries table as "deleted". Do not call on + * an entry with a currently-running callback. */ + +static void entry_delete(entries_t es, size_t i) +{ + entry_t e = &es->t[i]; + + CAMLassert(!e->runner); + + e->deleted = true; + e->offset = false; + e->user_data = Val_unit; + e->block = Val_unit; + if (i < es->evict) es->evict = i; +} + +/* Remove any deleted entries from [es], updating [es->young] and + * [es->active] if necessary. */ + +static void entries_evict(entries_t es) +{ + size_t i, j; + + /* The obvious linear compaction algorithm */ + j = i = es->evict; + + while (i < es->size) { + if (!es->t[i].deleted) { /* keep this entry */ + if (i != j) { + es->t[j] = es->t[i]; + if (es->t[i].runner) { + memprof_thread_t runner = es->t[i].runner; + CAMLassert(runner->running_table == es); + CAMLassert(runner->running_index == i); + runner->running_index = j; + } + } + ++ j; + } + ++ i; + if (es->young == i) es->young = j; + if (es->active == i) es->active = j; + } + es->evict = es->size = j; + CAMLassert(es->active <= es->size); + CAMLassert(es->young <= es->size); + + entries_ensure(es, 0); +} + +/* Remove any offset entries from [es]. Ones which have completed an + * allocation callback but not a deallocation callback are marked as + * deallocated. Others are marked as deleted. + * + * This is called before moving entries from a thread's entries table + * to that of the domain, when we're about to orphan all the domain's + * entries. This can occur if we stop a profile and start another one + * during an allocation callback (either directly in the callback or + * on another thread while the callback is running). We'll never be + * able to connect an offset entry to its allocated block (the block + * will not be actually allocated until the callback completes, if at + * all), but some callbacks may already have been run for it. If no + * callbacks have been run, we simply mark the entry as deleted. If + * the allocation callback has been run, the best we can do is + * probably to fake deallocating the block, so that alloc/dealloc + * callback counts correspond. + * + * Note: no callbacks apart from the allocation callback can run on an + * offset entry (as the block has not yet been allocated, it cannot be + * promoted or deallocated). */ + +static void entries_clear_offsets(entries_t es) +{ + for (size_t i = 0; i < es->size; ++i) { + entry_t e = &es->t[i]; + if (e->offset) { + if (e->callbacks & CB_MASK(CB_ALLOC)) { + /* Have called just the allocation callback */ + CAMLassert(e->callbacks == CB_MASK(CB_ALLOC)); + e->block = Val_unit; + e->offset = false; + e->deallocated = true; + if (i < es->active) es->active = i; + } else { + /* Haven't yet called any callbacks */ + CAMLassert(e->runner == NULL); + CAMLassert(e->callbacks == 0); + entry_delete(es, i); + } + } + } + entries_evict(es); +} + +/* Remove any entries from [es] which are not currently running a + * callback. */ + +static void entries_clear_inactive(entries_t es) +{ + CAMLassert (es->config == CONFIG_NONE); + for (size_t i = 0; i < es->size; ++i) { + if (es->t[i].runner == NULL) { + entry_delete(es, i); + } + } + entries_evict(es); +} + +static value validated_config(entries_t es); + +/* Transfer all entries from one entries table to another, excluding + * ones which have not run any callbacks (these are deleted). + * Return `false` if allocation fails. */ + +static bool entries_transfer(entries_t from, entries_t to) +{ + if (from->size == 0) + return true; + + (void)validated_config(from); /* For side-effect, so we can check ... */ + (void)validated_config(to); /* ... that the configs are equal. */ + CAMLassert(from->config == to->config); + + if (!entries_ensure(to, from->size)) + return false; -/* Whether memprof has been initialized. */ -static int init = 0; + size_t delta = to->size; + to->size += from->size; -/* Whether memprof is started. */ -static int started = 0; + for (size_t i = 0; i < from->size; ++i) { + if (from->t[i].callbacks == 0) { + /* Very rare: transferring an entry which hasn't called its + * allocation callback. We just delete it. */ + entry_delete(from, i); + } + to->t[i + delta] = from->t[i]; + memprof_thread_t runner = from->t[i].runner; + if (runner) { /* unusual */ + CAMLassert(runner->running_table == from); + CAMLassert(runner->running_index == i); + runner->running_table = to; + runner->running_index = i + delta; + } + } + + if (to->young == delta) { + to->young = from->young + delta; + } + if (to->evict == delta) { + to->evict = from->evict + delta; + } + if (to->active == delta) { + to->active = from->active + delta; + } + /* Reset `from` to empty, and allow it to shrink */ + from->young = from->evict = from->active = from->size = 0; + entries_ensure(from, 0); + return true; +} + +/* If es->config points to a DISCARDED configuration, update + * es->config to CONFIG_NONE. Return es->config. */ + +static value validated_config(entries_t es) +{ + if ((es->config != CONFIG_NONE) && + (Status(es->config) == CONFIG_STATUS_DISCARDED)) { + es->config = CONFIG_NONE; + entries_clear_inactive(es); + } + return es->config; +} + +/* Return current sampling configuration for a thread. If it's been + * discarded, then reset it to CONFIG_NONE and return that. */ + +static value thread_config(memprof_thread_t thread) +{ + return validated_config(&thread->entries); +} + +/*** Create and destroy orphan tables ***/ + +/* Orphan any surviving entries from a domain or its threads (after + * first discarding any deleted and offset entries), onto the domain's + * orphans list. This copies the domain's table itself, to avoid + * copying the potentially live array. + * + * Returns false if allocation fails, true otherwise. */ + +static bool orphans_create(memprof_domain_t domain) +{ + /* Clear offset entries and count survivors in threads tables. */ + size_t total_size = 0; + memprof_thread_t thread = domain->threads; + while (thread) { + entries_clear_offsets(&thread->entries); + total_size += thread->entries.size; + thread = thread->next; + } + entries_t es = &domain->entries; + entries_evict(es); /* remove deleted entries */ + total_size += es->size; + + if (!total_size) /* No entries to orphan */ + return true; + + memprof_orphan_table_t ot = caml_stat_alloc(sizeof(memprof_orphan_table_s)); + if (!ot) + return false; + + entries_init(&ot->entries, MIN_ENTRIES_ORPHAN_CAPACITY, + domain->entries.config); + if (!entries_ensure(&ot->entries, total_size)) { + /* Couldn't allocate entries table - failure */ + caml_stat_free(ot); + return false; + } + + /* Orphan surviving entries; these transfers will succeed + * because we pre-sized the table. */ + (void)entries_transfer(&domain->entries, &ot->entries); + thread = domain->threads; + while(thread) { + /* May discard entries which haven't run allocation callbacks */ + (void)entries_transfer(&thread->entries, &ot->entries); + thread = thread->next; + } + ot->next = domain->orphans; + domain->orphans = ot; + return true; +} -/* Buffer used to compute backtraces */ -static value* callstack_buffer = NULL; -static intnat callstack_buffer_len = 0; +/* Abandon all a domain's orphans to the global list. */ + +static void orphans_abandon(memprof_domain_t domain) +{ + /* Find the end of the domain's orphans list */ + memprof_orphan_table_t ot = domain->orphans; + if (!ot) + return; + + while(ot->next) { + ot = ot->next; + } + + caml_plat_lock(&orphans_lock); + ot->next = orphans; + orphans = domain->orphans; + caml_plat_unlock(&orphans_lock); + domain->orphans = NULL; +} + +/* Adopt all global orphans to the given domain. */ + +static void orphans_adopt(memprof_domain_t domain) +{ + /* Find the end of the domain's orphans list */ + memprof_orphan_table_t *p = &domain->orphans; + while(*p) { + p = &(*p)->next; + } + + caml_plat_lock(&orphans_lock); + *p = orphans; + orphans = NULL; + caml_plat_unlock(&orphans_lock); +} + +/* Destroy an orphan table. */ + +static void orphans_destroy(memprof_orphan_table_t ot) +{ + entries_clear(&ot->entries); + caml_stat_free(ot); +} + +/* Traverse a domain's orphans list, clearing inactive entries from + * discarded tables and removing any table which is empty, and update + * the orphans_pending flag. */ + +static void orphans_update_pending(memprof_domain_t domain) +{ + memprof_orphan_table_t *p = &domain->orphans; + bool pending = false; + + while(*p) { + memprof_orphan_table_t ot = *p; + memprof_orphan_table_t next = ot->next; + value config = validated_config(&ot->entries); + if (config == CONFIG_NONE) { /* remove inactive entries */ + entries_clear_inactive(&ot->entries); + } + if (ot->entries.size == 0) { + orphans_destroy(ot); + *p = next; + } else { /* any pending entries in this table? */ + pending |= (ot->entries.active < ot->entries.size); + p = &ot->next; + } + } + domain->orphans_pending = pending; +} /**** Statistical sampling ****/ +/* We use a low-quality SplitMix64 PRNG to initialize state vectors + * for a high-quality high-performance 32-bit PRNG (xoshiro128+). That + * PRNG generates uniform random 32-bit numbers, which we use in turn + * to generate geometric random numbers parameterized by [lambda]. + * This is all coded in such a way that compilers can readily use SIMD + * optimisations. */ + +/* splitmix64 PRNG, used to initialize the xoshiro+128 state + * vectors. Closely based on the public-domain implementation + * by Sebastiano Vigna https://xorshift.di.unimi.it/splitmix64.c */ + Caml_inline uint64_t splitmix64_next(uint64_t* x) { uint64_t z = (*x += 0x9E3779B97F4A7C15ull); @@ -208,91 +1041,101 @@ Caml_inline uint64_t splitmix64_next(uint64_t* x) return z ^ (z >> 31); } -static void xoshiro_init(void) +/* Initialize all the xoshiro+128 state vectors. */ + +static void xoshiro_init(memprof_domain_t domain, uint64_t seed) { int i; - uint64_t splitmix64_state = 42; - rand_pos = RAND_BLOCK_SIZE; + uint64_t splitmix64_state = seed; for (i = 0; i < RAND_BLOCK_SIZE; i++) { uint64_t t = splitmix64_next(&splitmix64_state); - xoshiro_state[0][i] = t & 0xFFFFFFFF; - xoshiro_state[1][i] = t >> 32; + domain->xoshiro_state[0][i] = t & 0xFFFFFFFF; + domain->xoshiro_state[1][i] = t >> 32; t = splitmix64_next(&splitmix64_state); - xoshiro_state[2][i] = t & 0xFFFFFFFF; - xoshiro_state[3][i] = t >> 32; + domain->xoshiro_state[2][i] = t & 0xFFFFFFFF; + domain->xoshiro_state[3][i] = t >> 32; } } -Caml_inline uint32_t xoshiro_next(int i) +/* xoshiro128+ PRNG. See Blackman & Vigna; "Scrambled linear + * pseudorandom number generators"; ACM Trans. Math. Softw., 47:1-32, + * 2021: + * "xoshiro128+ is our choice for 32-bit floating-point generation." */ + +Caml_inline uint32_t xoshiro_next(memprof_domain_t domain, int i) { - uint32_t res = xoshiro_state[0][i] + xoshiro_state[3][i]; - uint32_t t = xoshiro_state[1][i] << 9; - xoshiro_state[2][i] ^= xoshiro_state[0][i]; - xoshiro_state[3][i] ^= xoshiro_state[1][i]; - xoshiro_state[1][i] ^= xoshiro_state[2][i]; - xoshiro_state[0][i] ^= xoshiro_state[3][i]; - xoshiro_state[2][i] ^= t; - t = xoshiro_state[3][i]; - xoshiro_state[3][i] = (t << 11) | (t >> 21); + uint32_t res = domain->xoshiro_state[0][i] + domain->xoshiro_state[3][i]; + uint32_t t = domain->xoshiro_state[1][i] << 9; + domain->xoshiro_state[2][i] ^= domain->xoshiro_state[0][i]; + domain->xoshiro_state[3][i] ^= domain->xoshiro_state[1][i]; + domain->xoshiro_state[1][i] ^= domain->xoshiro_state[2][i]; + domain->xoshiro_state[0][i] ^= domain->xoshiro_state[3][i]; + domain->xoshiro_state[2][i] ^= t; + t = domain->xoshiro_state[3][i]; + domain->xoshiro_state[3][i] = (t << 11) | (t >> 21); return res; } /* Computes [log((y+0.5)/2^32)], up to a relatively good precision, - and guarantee that the result is negative. - The average absolute error is very close to 0. */ + * and guarantee that the result is negative, in such a way that SIMD + * can parallelize it. The average absolute error is very close to + * 0. + * + * Uses a type pun to break y+0.5 into biased exponent `exp` (an + * integer-valued float in the range [126, 159]) and mantissa `x` (a + * float in [1,2)). This may discard up to eight low bits of y. + * + * Then y+0.5 = x * 2^(exp-127), so if f(x) ~= log(x) - 159*log(2), + * log((y+0.5)/2^32) ~= f(x) + exp * log(2). + * + * We use sollya to find the unique degree-3 polynomial f such that : + * + * - Its average value is that of log(x) - 159*log(2) for x in [1, 2) + * (so the sampling has the right mean when lambda is small). + * - f(1) = f(2) - log(2), so the approximation is continuous. + * - The error at x=1 is -1e-5, so the approximation is always negative. + * - The maximum absolute error is minimized in [1, 2) (the actual + * maximum absolute error is around 7e-4). */ + Caml_inline float log_approx(uint32_t y) { union { float f; int32_t i; } u; - float exp, x; - u.f = y + 0.5f; /* We convert y to a float ... */ - exp = u.i >> 23; /* ... of which we extract the exponent ... */ + u.f = y + 0.5f; + float exp = u.i >> 23; u.i = (u.i & 0x7FFFFF) | 0x3F800000; - x = u.f; /* ... and the mantissa. */ - - return - /* This polynomial computes the logarithm of the mantissa (which - is in [1, 2]), up to an additive constant. It is chosen such that : - - Its degree is 4. - - Its average value is that of log in [1, 2] - (the sampling has the right mean when lambda is small). - - f(1) = f(2) - log(2) = -159*log(2) - 1e-5 - (this guarantee that log_approx(y) is always <= -1e-5 < 0). - - The maximum of abs(f(x)-log(x)+159*log(2)) is minimized. - */ - x * (2.104659476859f + x * (-0.720478916626f + x * 0.107132064797f)) - - /* Then, we add the term corresponding to the exponent, and - additive constants. */ - + (-111.701724334061f + 0.6931471805f*exp); + float x = u.f; + return (-111.70172433407f + + x * (2.104659476859f + + x * (-0.720478916626f + + x * 0.107132064797f)) + + 0.6931471805f * exp); } -/* This function regenerates [MT_STATE_SIZE] geometric random - variables at once. Doing this by batches help us gain performances: - many compilers (e.g., GCC, CLang, ICC) will be able to use SIMD - instructions to get a performance boost. -*/ +/* This function regenerates [RAND_BLOCK_SIZE] geometric random + * variables at once. Doing this by batches help us gain performances: + * many compilers (e.g., GCC, CLang, ICC) will be able to use SIMD + * instructions to get a performance boost. */ + #ifdef SUPPORTS_TREE_VECTORIZE __attribute__((optimize("tree-vectorize"))) #endif -static void rand_batch(void) + +static void rand_batch(memprof_domain_t domain) { int i; + float one_log1m_lambda = One_log1m_lambda(domain->entries.config); /* Instead of using temporary buffers, we could use one big loop, but it turns out SIMD optimizations of compilers are more fragile when using larger loops. */ - static uint32_t A[RAND_BLOCK_SIZE]; - static float B[RAND_BLOCK_SIZE]; - - CAMLassert(lambda > 0.); + uint32_t A[RAND_BLOCK_SIZE]; + float B[RAND_BLOCK_SIZE]; - /* Shuffle the xoshiro samplers, and generate uniform variables in A. */ + /* Generate uniform variables in A using the xoshiro128+ PRNG. */ for (i = 0; i < RAND_BLOCK_SIZE; i++) - A[i] = xoshiro_next(i); + A[i] = xoshiro_next(domain, i); - /* Generate exponential random variables by computing logarithms. We - do not use math.h library functions, which are slow and prevent - compiler from using SIMD instructions. */ + /* Generate exponential random variables by computing logarithms. */ for (i = 0; i < RAND_BLOCK_SIZE; i++) B[i] = 1 + log_approx(A[i]) * one_log1m_lambda; @@ -305,849 +1148,1176 @@ static void rand_batch(void) CAMLassert (f >= 1); /* [Max_long+1] is a power of two => no rounding in the test. */ if (f >= Max_long+1) - rand_geom_buff[i] = Max_long; - else rand_geom_buff[i] = (uintnat)f; + domain->rand_geom_buff[i] = Max_long; + else domain->rand_geom_buff[i] = (uintnat)f; } - rand_pos = 0; + domain->rand_pos = 0; } -/* Simulate a geometric variable of parameter [lambda]. - The result is clipped in [1..Max_long] */ -static uintnat rand_geom(void) +/* Simulate a geometric random variable of parameter [lambda]. + * The result is clipped in [1..Max_long] */ + +static uintnat rand_geom(memprof_domain_t domain) { uintnat res; - CAMLassert(lambda > 0.); - if (rand_pos == RAND_BLOCK_SIZE) rand_batch(); - res = rand_geom_buff[rand_pos++]; + CAMLassert(One_log1m_lambda(domain->entries.config) <= 0.); + if (domain->rand_pos == RAND_BLOCK_SIZE) + rand_batch(domain); + res = domain->rand_geom_buff[domain->rand_pos++]; CAMLassert(1 <= res && res <= Max_long); return res; } -static uintnat next_rand_geom; -/* Simulate a binomial variable of parameters [len] and [lambda]. - This sampling algorithm has running time linear with [len * - lambda]. We could use more a involved algorithm, but this should - be good enough since, in the average use case, [lambda] <= 0.01 and - therefore the generation of the binomial variable is amortized by - the initialialization of the corresponding block. - - If needed, we could use algorithm BTRS from the paper: - Hormann, Wolfgang. "The generation of binomial random variates." - Journal of statistical computation and simulation 46.1-2 (1993), pp101-110. - */ -static uintnat rand_binom(uintnat len) +/* Initialize per-domain PRNG, so we're ready to sample. */ + +static void rand_init(memprof_domain_t domain) { - uintnat res; - CAMLassert(lambda > 0. && len < Max_long); - for (res = 0; next_rand_geom < len; res++) - next_rand_geom += rand_geom(); - next_rand_geom -= len; - return res; + domain->rand_pos = RAND_BLOCK_SIZE; + if (domain->entries.config != CONFIG_NONE + && !Min_lambda(domain->entries.config)) { + /* next_rand_geom can be zero if the next word is to be sampled, + * but rand_geom always returns a value >= 1. Subtract 1 to correct. */ + domain->next_rand_geom = rand_geom(domain) - 1; + } } -/**** Capturing the call stack *****/ +/* Simulate a binomial random variable of parameters [len] and + * [lambda]. This tells us how many times a single block allocation is + * sampled. This sampling algorithm has running time linear with [len + * * lambda]. We could use a more involved algorithm, but this should + * be good enough since, in the typical use case, [lambda] << 0.01 and + * therefore the generation of the binomial variable is amortized by + * the initialialization of the corresponding block. + * + * If needed, we could use algorithm BTRS from the paper: + * Hormann, Wolfgang. "The generation of binomial random variates." + * Journal of statistical computation and simulation 46.1-2 (1993), pp101-110. + */ -/* This function is called in, e.g., [caml_alloc_shr], which - guarantees that the GC is not called. Clients may use it in a - context where the heap is in an invalid state, or when the roots - are not properly registered. Therefore, we do not use [caml_alloc], - which may call the GC, but prefer using [caml_alloc_shr], which - gives this guarantee. The return value is either a valid callstack - or 0 in out-of-memory scenarios. */ -static value capture_callstack_postponed() +static uintnat rand_binom(memprof_domain_t domain, uintnat len) { - value res; - intnat callstack_len = - caml_collect_current_callstack(&callstack_buffer, &callstack_buffer_len, - callstack_size, -1); - if (callstack_len == 0) - return Atom(0); - res = caml_alloc_shr_no_track_noexc(callstack_len, 0); - if (res == 0) - return Atom(0); - memcpy(Op_val(res), callstack_buffer, sizeof(value) * callstack_len); - if (callstack_buffer_len > 256 && callstack_buffer_len > callstack_len * 8) { - caml_stat_free(callstack_buffer); - callstack_buffer = NULL; - callstack_buffer_len = 0; - } + uintnat res; + CAMLassert(len < Max_long); + for (res = 0; domain->next_rand_geom < len; res++) + domain->next_rand_geom += rand_geom(domain); + domain->next_rand_geom -= len; return res; } -/* In this version, we are allowed to call the GC, so we use - [caml_alloc], which is more efficient since it uses the minor - heap. - Should be called with [local->suspended == 1] */ -static value capture_callstack(int alloc_idx) +/**** Create and destroy thread state structures ****/ + +/* Create a thread state structure attached to `domain`. */ + +static memprof_thread_t thread_create(memprof_domain_t domain) { - value res; - intnat callstack_len = - caml_collect_current_callstack(&callstack_buffer, &callstack_buffer_len, - callstack_size, alloc_idx); - CAMLassert(local->suspended); - res = caml_alloc(callstack_len, 0); - memcpy(Op_val(res), callstack_buffer, sizeof(value) * callstack_len); - if (callstack_buffer_len > 256 && callstack_buffer_len > callstack_len * 8) { - caml_stat_free(callstack_buffer); - callstack_buffer = NULL; - callstack_buffer_len = 0; + memprof_thread_t thread = caml_stat_alloc(sizeof(memprof_thread_s)); + if (!thread) { + return NULL; } - return res; + thread->suspended = false; + thread->running_index = 0; + thread->running_table = NULL; + entries_init(&thread->entries, MIN_ENTRIES_THREAD_CAPACITY, + domain->entries.config); + + /* attach to domain record */ + thread->domain = domain; + thread->next = domain->threads; + domain->threads = thread; + + return thread; } -/**** Managing data structures for tracked blocks. ****/ +/* Destroy a thread state structure. If the thread's entries table is + * not empty (because allocation failed when transferring it to the + * domain) then its entries will be lost. */ -/* Reallocate the [ea] array if it is either too small or too - large. - [grow] is the number of free cells needed. - Returns 1 if reallocation succeeded --[ea->alloc_len] is at - least [ea->len+grow]--, and 0 otherwise. */ -static int realloc_entries(struct entry_array* ea, uintnat grow) +static void thread_destroy(memprof_thread_t thread) { - uintnat new_alloc_len, new_len = ea->len + grow; - struct tracked* new_t; - if (new_len <= ea->alloc_len && - (4*new_len >= ea->alloc_len || ea->alloc_len == ea->min_alloc_len)) - return 1; - new_alloc_len = new_len * 2; - if (new_alloc_len < ea->min_alloc_len) - new_alloc_len = ea->min_alloc_len; - new_t = caml_stat_resize_noexc(ea->t, new_alloc_len * sizeof(struct tracked)); - if (new_t == NULL) return 0; - ea->t = new_t; - ea->alloc_len = new_alloc_len; - return 1; + memprof_domain_t domain = thread->domain; + + /* A thread cannot be destroyed while inside a callback, as + * Thread.exit works by raising an exception, taking us out of the + * callback, and a domain won't terminate while any thread is + * alive. */ + CAMLassert (!thread->running_table); + /* We would like to assert (thread->entries.size == 0), but this may + * not be true if allocation failed when transferring the thread's + * entries to its domain (in which case we are about to lose those + * entries. */ + entries_clear(&thread->entries); + + if (domain->current == thread) { + domain->current = NULL; + } + /* remove thread from the per-domain list. Could go faster if we + * used a doubly-linked list, but that's premature optimisation + * at this point. */ + memprof_thread_t *p = &domain->threads; + while (*p != thread) { + CAMLassert(*p); /* checks that thread is on the list */ + p = &(*p)->next; + } + *p = thread->next; + + caml_stat_free(thread); } -#define Invalid_index (~(uintnat)0) +/**** Create and destroy domain state structures ****/ -Caml_inline uintnat new_tracked(uintnat n_samples, uintnat wosize, - int source, int is_young, - value block, value user_data) -{ - struct tracked *t; - if (!realloc_entries(&local->entries, 1)) - return Invalid_index; - local->entries.len++; - t = &local->entries.t[local->entries.len - 1]; - t->block = block; - t->n_samples = n_samples; - t->wosize = wosize; - t->user_data = user_data; - t->running = NULL; - t->alloc_young = is_young; - t->source = source; - t->promoted = 0; - t->deallocated = 0; - t->cb_promote_called = t->cb_dealloc_called = 0; - t->deleted = 0; - return local->entries.len - 1; -} +/* Destroy a domain state structure. In the usual case, this will + * orphan any entries belonging to the domain or its threads onto the + * global orphans list. However, if there is an allocation failure, + * some or all of those entries may be lost. */ -static void mark_deleted(struct entry_array* ea, uintnat t_idx) +static void domain_destroy(memprof_domain_t domain) { - struct tracked* t = &ea->t[t_idx]; - t->deleted = 1; - t->user_data = Val_unit; - t->block = Val_unit; - if (t_idx < ea->delete_idx) ea->delete_idx = t_idx; + /* Orphan any entries from the domain or its threads, then abandon + * all orphans to the global table. If creating the orphans table + * fails due to allocation failure, we lose the entries. */ + (void)orphans_create(domain); + orphans_abandon(domain); + + /* Destroy thread structures */ + memprof_thread_t thread = domain->threads; + while (thread) { + memprof_thread_t next = thread->next; + thread_destroy(thread); + thread = next; + } + + entries_clear(&domain->entries); /* In case allocation failed */ + caml_stat_free(domain->callstack_buffer); + caml_stat_free(domain); } -Caml_inline value run_callback_exn( - struct entry_array* ea, uintnat t_idx, value cb, value param) +/* Create a domain state structure */ + +static memprof_domain_t domain_create(caml_domain_state *caml_state) { - struct tracked* t = &ea->t[t_idx]; - value res; - CAMLassert(t->running == NULL); - CAMLassert(lambda > 0.); - - local->callback_status = ea == &entries_global ? t_idx : CB_LOCAL; - t->running = local; - t->user_data = Val_unit; /* Release root. */ - res = caml_callback_exn(cb, param); - if (local->callback_status == CB_STOPPED) { - /* Make sure this entry has not been removed by [caml_memprof_stop] */ - local->callback_status = CB_IDLE; - return Is_exception_result(res) ? res : Val_unit; + memprof_domain_t domain = caml_stat_alloc(sizeof(memprof_domain_s)); + if (!domain) { + return NULL; } - /* The call above can move the tracked entry and thus invalidate - [t_idx] and [t]. */ - if (ea == &entries_global) { - CAMLassert(local->callback_status >= 0 && local->callback_status < ea->len); - t_idx = local->callback_status; - t = &ea->t[t_idx]; - } - local->callback_status = CB_IDLE; - CAMLassert(t->running == local); - t->running = NULL; - if (Is_exception_result(res) || res == Val_unit) { - /* Callback raised an exception or returned None or (), discard - this entry. */ - mark_deleted(ea, t_idx); - return res; + + domain->caml_state = caml_state; + entries_init(&domain->entries, MIN_ENTRIES_DOMAIN_CAPACITY, CONFIG_NONE); + domain->orphans = NULL; + domain->orphans_pending = false; + domain->pending = false; + domain->threads = NULL; + domain->current = NULL; + domain->callstack_buffer = NULL; + domain->callstack_buffer_len = 0; + + /* create initial thread for domain */ + memprof_thread_t thread = thread_create(domain); + if (thread) { + domain->current = thread; } else { - /* Callback returned [Some _]. Store the value in [user_data]. */ - CAMLassert(!Is_exception_result(res) && Is_block(res) && Tag_val(res) == 0 - && Wosize_val(res) == 1); - t->user_data = Field(res, 0); - if (Is_block(t->user_data) && Is_young(t->user_data) && - t_idx < ea->young_idx) - ea->young_idx = t_idx; - - // If the following condition are met: - // - we are running a promotion callback, - // - the corresponding block is deallocated, - // - another thread is running callbacks in - // [caml_memprof_handle_postponed_exn], - // then [callback_idx] may have moved forward during this callback, - // which means that we may forget to run the deallocation callback. - // Hence, we reset [callback_idx] if appropriate. - if (ea == &entries_global && t->deallocated && !t->cb_dealloc_called && - callback_idx > t_idx) - callback_idx = t_idx; + domain_destroy(domain); + domain = NULL; + } + return domain; +} - return Val_unit; +/**** Interface with domain action-pending flag ****/ + +/* If a domain has some callbacks pending, and isn't currently + * suspended, set the action pending flag. */ + +static void set_action_pending_as_needed(memprof_domain_t domain) +{ + CAMLassert(domain->current); + if (domain->current->suspended) return; + domain->pending = (domain->entries.active < domain->entries.size || + domain->current->entries.size > 0 || + domain->orphans_pending); + if (domain->pending) { + caml_set_action_pending(domain->caml_state); } } -/* Run the allocation callback for a given entry of the local entries array. - This assumes that the corresponding [deleted] and - [running] fields of the entry are both set to 0. - Reentrancy is not a problem for this function, since other threads - will use a different array for entries. - The index of the entry will not change, except if [caml_memprof_stop] is - called . - Returns: - - An exception result if the callback raised an exception - - Val_long(0) == Val_unit == None otherwise - */ -static value run_alloc_callback_exn(uintnat t_idx) +/* Set the suspended flag on `domain` to `s`. Has the side-effect of + * setting the trigger. */ + +static void update_suspended(memprof_domain_t domain, bool s) { - struct tracked* t = &local->entries.t[t_idx]; - value sample_info; - - CAMLassert(Is_block(t->block) || Is_placeholder(t->block) || t->deallocated); - sample_info = caml_alloc_small(4, 0); - Field(sample_info, 0) = Val_long(t->n_samples); - Field(sample_info, 1) = Val_long(t->wosize); - Field(sample_info, 2) = Val_long(t->source); - Field(sample_info, 3) = t->user_data; - return run_callback_exn(&local->entries, t_idx, - t->alloc_young ? Alloc_minor(tracker) : Alloc_major(tracker), sample_info); + CAMLassert(domain->current); + domain->current->suspended = s; + /* If we are unsuspending, set the action-pending flag if + * we have callbacks to run. */ + if (!s) set_action_pending_as_needed(domain); + + caml_memprof_set_trigger(domain->caml_state); + caml_reset_young_limit(domain->caml_state); } -/* Remove any deleted entries from [ea], updating [ea->young_idx] and - [callback_idx] if [ea == &entries_global]. */ -static void flush_deleted(struct entry_array* ea) +/* Set the suspended flag on the current domain to `s`. + * Has the side-effect of setting the trigger. */ + +void caml_memprof_update_suspended(bool s) { + CAMLassert(Caml_state->memprof); + update_suspended(Caml_state->memprof, s); +} + +/**** Iterating over entries ****/ + +/* Type of a function to apply to a single entry. Returns true if, + * following the call, the entry may have a newly-applicable + * callback. */ + +typedef bool (*entry_action)(entry_t, void *); + +/* Type of a function to apply to an entries array after iterating + * over the entries. */ + +typedef void (*entries_action)(entries_t, void *); + +/* Iterate an entry_action over entries in a single entries table, + * followed by an (optional) entries_action on the whole table. If + * `young` is true, only apply to possibly-young entries (usually a + * small number of entries, often zero). + * + * This function validates the entries table configuration (which + * changes it to NONE if DISCARDED). If then it is NONE, this function + * does nothing else. + * + * Assumes that calling `f` does not change entry table indexes. */ + +static void entries_apply_actions(entries_t entries, bool young, + entry_action f, void *data, + entries_action after) { - uintnat i, j; - - if (ea == NULL) return; - - j = i = ea->delete_idx; - while (i < ea->len) { - if (!ea->t[i].deleted) { - struct caml_memprof_th_ctx* runner = ea->t[i].running; - if (runner != NULL && runner->callback_status == i) - runner->callback_status = j; - ea->t[j] = ea->t[i]; - j++; + value config = validated_config(entries); + if (config == CONFIG_NONE) { + return; + } + + for (size_t i = young ? entries->young : 0; i < entries->size; ++i) { + if (f(&entries->t[i], data) && entries->active > i) { + entries->active = i; } - i++; - if (ea->young_idx == i) ea->young_idx = j; - if (ea == &entries_global && callback_idx == i) callback_idx = j; } - ea->delete_idx = ea->len = j; - CAMLassert(ea != &entries_global || callback_idx <= ea->len); - CAMLassert(ea->young_idx <= ea->len); - realloc_entries(ea, 0); + if (after) { + after(entries, data); + } } -static void check_action_pending(void) +/* Iterate entry_action/entries_action over all entries managed by a + * single domain (including those managed by its threads). + * + * Assumes that calling `f` does not modify entry table indexes. */ + +static void domain_apply_actions(memprof_domain_t domain, bool young, + entry_action f, void *data, + entries_action after) { - if (local->suspended) return; - if (callback_idx < entries_global.len || local->entries.len > 0) - caml_set_action_pending(Caml_state); + entries_apply_actions(&domain->entries, young, f, data, after); + memprof_thread_t thread = domain->threads; + while (thread) { + entries_apply_actions(&thread->entries, young, f, data, after); + thread = thread->next; + } + memprof_orphan_table_t ot = domain->orphans; + while (ot) { + entries_apply_actions(&ot->entries, young, f, data, after); + ot = ot->next; + } } -void caml_memprof_set_suspended(int s) +/**** GC interface ****/ + +/* Root scanning */ + +struct scan_closure { + scanning_action f; + scanning_action_flags fflags; + void *fdata; + bool weak; +}; + +/* An entry_action to scan roots */ + +static bool entry_scan(entry_t e, void *data) { - local->suspended = s; - caml_memprof_renew_minor_sample(); - if (!s) check_action_pending(); + struct scan_closure *closure = data; + closure->f(closure->fdata, e->user_data, &e->user_data); + if (closure->weak && !e->offset && (e->block != Val_unit)) { + closure->f(closure->fdata, e->block, &e->block); + } + return false; } -/* In case of a thread context switch during a callback, this can be - called in a reetrant way. */ -value caml_memprof_handle_postponed_exn(void) +/* An entries_action to scan the config root */ + +static void entries_finish_scan(entries_t es, void *data) { - value res = Val_unit; - uintnat i; - if (local->suspended) return Val_unit; - if (callback_idx >= entries_global.len && local->entries.len == 0) - return Val_unit; + struct scan_closure *closure = data; + closure->f(closure->fdata, es->config, &es->config); +} + +/* Function called by either major or minor GC to scan all the memprof roots */ - caml_memprof_set_suspended(1); - - for (i = 0; i < local->entries.len; i++) { - /* We are the only thread allowed to modify [local->entries], so - the indices cannot shift, but it is still possible that - [caml_memprof_stop] got called during the callback, - invalidating all the entries. */ - res = run_alloc_callback_exn(i); - if (Is_exception_result(res)) goto end; - if (local->entries.len == 0) - goto end; /* [caml_memprof_stop] has been called. */ - if (local->entries.t[i].deleted) continue; - if (realloc_entries(&entries_global, 1)) - /* Transfer the entry to the global array. */ - entries_global.t[entries_global.len++] = local->entries.t[i]; - mark_deleted(&local->entries, i); +void caml_memprof_scan_roots(scanning_action f, + scanning_action_flags fflags, + void* fdata, + caml_domain_state *state, + bool weak, + bool global) +{ + memprof_domain_t domain = state->memprof; + CAMLassert(domain); + if (global) { + /* Adopt all global orphans into this domain. */ + orphans_adopt(domain); } - while (callback_idx < entries_global.len) { - struct tracked* t = &entries_global.t[callback_idx]; + bool young = (fflags & SCANNING_ONLY_YOUNG_VALUES); + struct scan_closure closure = {f, fflags, fdata, weak}; + domain_apply_actions(domain, young, + entry_scan, &closure, entries_finish_scan); +} - if (t->deleted || t->running != NULL) { - /* This entry is not ready. Ignore it. */ - callback_idx++; - } else if (t->promoted && !t->cb_promote_called) { - t->cb_promote_called = 1; - res = run_callback_exn(&entries_global, callback_idx, Promote(tracker), - t->user_data); - if (Is_exception_result(res)) goto end; - } else if (t->deallocated && !t->cb_dealloc_called) { - value cb = (t->promoted || !t->alloc_young) ? - Dealloc_major(tracker) : Dealloc_minor(tracker); - t->cb_dealloc_called = 1; - res = run_callback_exn(&entries_global, callback_idx, cb, t->user_data); - if (Is_exception_result(res)) goto end; +/* Post-GC actions: we have to notice when tracked blocks die or get promoted */ + +/* An entry_action to update a single entry after a minor GC. Notices + * when a young tracked block has died or been promoted. */ + +static bool entry_update_after_minor_gc(entry_t e, void *data) +{ + (void)data; + CAMLassert(Is_block(e->block) + || e->deleted || e->deallocated || e->offset); + if (!e->offset && Is_block(e->block) && Is_young(e->block)) { + if (Hd_val(e->block) == 0) { + /* Block has been promoted */ + e->block = Field(e->block, 0); + e->promoted = true; } else { - /* There is nothing more to do with this entry. */ - callback_idx++; + /* Block is dead */ + e->block = Val_unit; + e->deallocated = true; } + return true; /* either promotion or deallocation callback */ } - - end: - flush_deleted(&local->entries); - flush_deleted(&entries_global); - /* We need to reset the suspended flag *after* flushing - [local->entries] to make sure the floag is not set back to 1. */ - caml_memprof_set_suspended(0); - return res; + return false; /* no callback triggered */ } -/**** Handling weak and strong roots when the GC runs. ****/ +/* An entries_action for use after a minor GC. */ -typedef void (*ea_action)(struct entry_array*, void*); -struct call_on_entry_array_data { ea_action f; void *data; }; -static void call_on_entry_array(struct caml_memprof_th_ctx* ctx, void *data) +static void entries_update_after_minor_gc(entries_t entries, + void *data) { - struct call_on_entry_array_data* closure = data; - closure->f(&ctx->entries, closure->data); + (void)data; + /* There are no 'young' entries left */ + entries->young = entries->size; } -static void entry_arrays_iter(ea_action f, void *data) +/* Update all memprof structures for a given domain, at the end of a + * minor GC. If `global` is set, also ensure shared structures are + * updated (we do this by adopting orphans into this domain). */ + +void caml_memprof_after_minor_gc(caml_domain_state *state, bool global) { - struct call_on_entry_array_data closure = { f, data }; - f(&entries_global, data); - caml_memprof_th_ctx_iter_hook(call_on_entry_array, &closure); + memprof_domain_t domain = state->memprof; + CAMLassert(domain); + if (global) { + /* Adopt all global orphans into this domain. */ + orphans_adopt(domain); + } + + domain_apply_actions(domain, true, entry_update_after_minor_gc, + NULL, entries_update_after_minor_gc); + orphans_update_pending(domain); + set_action_pending_as_needed(domain); } -static void entry_array_oldify_young_roots(struct entry_array *ea, void *data) +/* An entry_action to update a single entry after a major GC. Notices + * when a tracked block has died. */ + +static bool entry_update_after_major_gc(entry_t e, void *data) { - uintnat i; (void)data; - /* This loop should always have a small number of iterations (when - compared to the size of the minor heap), because the young_idx - pointer should always be close to the end of the array. Indeed, - it is only moved back when returning from a callback triggered by - allocation or promotion, which can only happen for blocks - allocated recently, which are close to the end of the - [entries_global] array. */ - for (i = ea->young_idx; i < ea->len; i++) - caml_oldify_one(ea->t[i].user_data, &ea->t[i].user_data); + CAMLassert(Is_block(e->block) + || e->deleted || e->deallocated || e->offset); + if (!e->offset && Is_block(e->block) && !Is_young(e->block)) { + /* Either born in the major heap or promoted */ + CAMLassert(!e->alloc_young || e->promoted); + if (is_unmarked(e->block)) { /* died */ + e->block = Val_unit; + e->deallocated = true; + return true; /* trigger deallocation callback */ + } + } + return false; /* no callback triggered */ } -void caml_memprof_oldify_young_roots(void) -{ - entry_arrays_iter(entry_array_oldify_young_roots, NULL); -} +/* Note: there's nothing to be done at the table level after a major + * GC (unlike a minor GC, when we reset the 'young' index), so there + * is no "entries_update_after_major_gc" function. */ -static void entry_array_minor_update(struct entry_array *ea, void *data) +/* Update all memprof structures for a given domain, at the end of a + * major GC. If `global` is set, also update shared structures (we do + * this by adopting orphans into this domain). */ + +void caml_memprof_after_major_gc(caml_domain_state *state, bool global) { - uintnat i; - (void)data; - /* See comment in [entry_array_oldify_young_roots] for the number - of iterations of this loop. */ - for (i = ea->young_idx; i < ea->len; i++) { - struct tracked *t = &ea->t[i]; - CAMLassert(Is_block(t->block) || t->deleted || t->deallocated || - Is_placeholder(t->block)); - if (Is_block(t->block) && Is_young(t->block)) { - if (Hd_val(t->block) == 0) { - /* Block has been promoted */ - t->block = Field(t->block, 0); - t->promoted = 1; - } else { - /* Block is dead */ - CAMLassert_young_header(Hd_val(t->block)); - t->block = Val_unit; - t->deallocated = 1; - } - } + memprof_domain_t domain = state->memprof; + CAMLassert(domain); + if (global) { + /* Adopt all global orphans into this domain. */ + orphans_adopt(domain); } - ea->young_idx = ea->len; + domain_apply_actions(domain, false, entry_update_after_major_gc, + NULL, NULL); + orphans_update_pending(domain); + set_action_pending_as_needed(domain); } -void caml_memprof_minor_update(void) +/**** Interface to domain module ***/ + +void caml_memprof_new_domain(caml_domain_state *parent, + caml_domain_state *child) { - if (callback_idx > entries_global.young_idx) { - /* The entries after [entries_global.young_idx] will possibly get - promoted. Hence, there might be pending promotion callbacks. */ - callback_idx = entries_global.young_idx; - check_action_pending(); + memprof_domain_t domain = domain_create(child); + child->memprof = domain; + + if (domain == NULL) /* failure - domain creation will fail */ + return; + + /* domain inherits configuration from parent */ + if (parent) { + CAMLassert(parent->memprof); + CAMLassert(domain->current); + domain->current->entries.config = + domain->entries.config = + parent->memprof->entries.config; } + /* Initialize RNG */ + xoshiro_init(domain, (uint64_t)child->id); - entry_arrays_iter(entry_array_minor_update, NULL); + /* If already profiling, set up RNG */ + rand_init(domain); } -static void entry_array_do_roots(struct entry_array *ea, void* data) +void caml_memprof_delete_domain(caml_domain_state *state) { - scanning_action f = data; - uintnat i; - for (i = 0; i < ea->len; i++) - f(ea->t[i].user_data, &ea->t[i].user_data); + CAMLassert(state->memprof); + + domain_destroy(state->memprof); + state->memprof = NULL; } -void caml_memprof_do_roots(scanning_action f) +/**** Capturing the call stack *****/ + +/* A "stashed" callstack, allocated on the C heap. */ + +typedef struct { + size_t frames; + backtrace_slot stack[]; +} callstack_stash_s, *callstack_stash_t; + +/* How large a callstack buffer must be to be considered "large" */ +#define CALLSTACK_BUFFER_LARGE 256 + +/* How much larger a callstack buffer must be, compared to the most + * recent callstack, to be considered large. */ +#define CALLSTACK_BUFFER_FACTOR 8 + +/* If the per-domain callstack buffer is "large" and we've only used a + * small part of it, free it. This saves us from C heap bloat due to + * unbounded lifetime of the callstack buffers (as callstacks may + * sometimes be huge). */ + +static void shrink_callstack_buffer(memprof_domain_t domain, size_t frames) { - entry_arrays_iter(entry_array_do_roots, f); + if (domain->callstack_buffer_len > CALLSTACK_BUFFER_LARGE && + domain->callstack_buffer_len > frames * CALLSTACK_BUFFER_FACTOR) { + caml_stat_free(domain->callstack_buffer); + domain->callstack_buffer = NULL; + domain->callstack_buffer_len = 0; + } } -static void entry_array_clean_phase(struct entry_array *ea, void* data) +/* Capture the call stack when sampling an allocation from the + * runtime. We don't have to account for combined allocations + * (Comballocs) but we can't allocate the resulting stack on the Caml + * heap, because the heap may be in an invalid state so we can't cause + * a GC. Therefore, we capture the callstack onto the C heap, and will + * copy it onto the Caml heap later, when we're ready to call the + * allocation callback. The callstack is returned as a Val_ptr value + * (or an empty array, if allocation fails). */ + +static value capture_callstack_no_GC(memprof_domain_t domain) { - uintnat i; - (void)data; - for (i = 0; i < ea->len; i++) { - struct tracked *t = &ea->t[i]; - if (Is_block(t->block) && !Is_young(t->block)) { - CAMLassert(Is_in_heap(t->block)); - CAMLassert(!t->alloc_young || t->promoted); - if (Is_white_val(t->block)) { - t->block = Val_unit; - t->deallocated = 1; - } + value res = Atom(0); /* empty array. */ + size_t frames = + caml_get_callstack(Callstack_size(domain->entries.config), + &domain->callstack_buffer, + &domain->callstack_buffer_len, -1); + if (frames) { + callstack_stash_t stash = caml_stat_alloc_noexc(sizeof(callstack_stash_s) + + frames * sizeof(value)); + if (stash) { + stash->frames = frames; + memcpy(stash->stack, domain->callstack_buffer, + sizeof(backtrace_slot) * frames); + res = Val_ptr(stash); } } + + shrink_callstack_buffer(domain, frames); + return res; } -void caml_memprof_update_clean_phase(void) +/* Capture the call stack when sampling an allocation from Caml. We + * have to deal with combined allocations (Comballocs), but can + * allocate the resulting call stack directly on the Caml heap. Should + * be called with [domain->current->suspended] set, as it allocates. + * May cause a GC. */ + +static value capture_callstack_GC(memprof_domain_t domain, int alloc_idx) { - entry_arrays_iter(entry_array_clean_phase, NULL); - callback_idx = 0; - check_action_pending(); + CAMLassert(domain->current->suspended); + + size_t frames = + caml_get_callstack(Callstack_size(domain->entries.config), + &domain->callstack_buffer, + &domain->callstack_buffer_len, + alloc_idx); + value res = caml_alloc(frames, 0); + for (size_t i = 0; i < frames; ++i) { + Field(res, i) = Val_backtrace_slot(domain->callstack_buffer[i]); + } + + shrink_callstack_buffer(domain, frames); + return res; } -static void entry_array_invert(struct entry_array *ea, void *data) +/* Given a stashed callstack, copy it to the Caml heap and free the + * stash. Given a non-stashed callstack, simply return it. */ + +static value unstash_callstack(value callstack) { - uintnat i; - (void)data; - for (i = 0; i < ea->len; i++) - caml_invert_root(ea->t[i].block, &ea->t[i].block); + CAMLparam1(callstack); + if (Is_long(callstack)) { /* stashed on C heap */ + callstack_stash_t stash = Ptr_val(callstack); + callstack = caml_alloc(stash->frames, 0); + for (size_t i = 0; i < stash->frames; ++i) { + Field(callstack, i) = Val_backtrace_slot(stash->stack[i]); + } + caml_stat_free(stash); + } + CAMLreturn(callstack); } -void caml_memprof_invert_tracked(void) +/**** Running callbacks ****/ + +/* Runs a single callback, in thread `thread`, for entry number `i` in + * table `es`. The callback closure is `cb`, the parameter is `param`, + * and the "callback index" is `cb_index`. + * Returns Val_unit or an exception result. */ + +static value run_callback_exn(memprof_thread_t thread, + entries_t es, size_t i, + value cb, value param, + uintnat cb_index) { - entry_arrays_iter(entry_array_invert, NULL); + entry_t e = &es->t[i]; + + if (e->runner) { /* some other thread has got to this callback first */ + return Val_unit; + } + + thread->running_table = es; + thread->running_index = i; + e->runner = thread; + + e->callback = cb_index; + e->callbacks |= CB_MASK(cb_index); + e->user_data = Val_unit; /* Release root. */ + + value res = caml_callback_exn(cb, param); + + /* The entry may have been moved to another table under our feet, + * due to the callback or to other threads from this domain. For + * example, if a new profile is started. */ + es = thread->running_table; + thread->running_table = NULL; + i = thread->running_index; + + CAMLassert(es != NULL); + CAMLassert(i < es->size); + e = &es->t[i]; + CAMLassert(e->runner == thread); + e->runner = NULL; + e->callback = CB_NONE; + + if (validated_config(es) == CONFIG_NONE) { + /* The profile was discarded during the callback. + * no entries to update etc. */ + if (!Is_exception_result(res)) + return Val_unit; + } + + if (Is_exception_result(res) || res == Val_unit) { + /* Callback raised an exception or returned None or (), discard + this entry. */ + entry_delete(es, i); + } else { + /* Callback returned [Some _]. Store the value in [user_data]. */ + CAMLassert(Is_block(res) && Tag_val(res) == 0 && Wosize_val(res) == 1); + e->user_data = Field(res, 0); + if (Is_block(e->user_data) && Is_young(e->user_data) && + i < es->young) + es->young = i; + + /* The callback we just ran was not a dealloc (they return unit) + * so there may be more callbacks to run on this entry. If the + * block has been deallocated, or promoted and we were not running + * a promotion callback, mark this entry as ready to run. */ + if (i < es->active && + (e->deallocated || + (e->promoted && (cb_index != CB_PROMOTE)))) + es->active = i; + + res = Val_unit; + } + return res; } -/**** Sampling procedures ****/ +/* Run the allocation callback for a given entry of an entries array. + * Returns Val_unit or an exception result. */ -static void maybe_track_block(value block, uintnat n_samples, - uintnat wosize, int src) +static value run_alloc_callback_exn(memprof_thread_t thread, + entries_t es, size_t i) { - value callstack; - if (n_samples == 0) return; + entry_t e = &es->t[i]; + CAMLassert(e->deallocated || e->offset || Is_block(e->block)); + + e->user_data = unstash_callstack(e->user_data); + value sample_info = caml_alloc_small(4, 0); + Field(sample_info, 0) = Val_long(e->samples); + Field(sample_info, 1) = Val_long(e->wosize); + Field(sample_info, 2) = Val_long(e->source); + Field(sample_info, 3) = e->user_data; + value callback = + e->alloc_young ? Alloc_minor(es->config) : Alloc_major(es->config); + return run_callback_exn(thread, es, i, callback, sample_info, CB_ALLOC); +} + +/* Run any pending callbacks from entries table `es` in thread + * `thread`. Returns either (a) when a callback raises an exception, + * or (b) when all pending callbacks have been run. */ - callstack = capture_callstack_postponed(); - if (callstack == 0) return; +static value entries_run_callbacks_exn(memprof_thread_t thread, + entries_t es) +{ + value res = Val_unit; - new_tracked(n_samples, wosize, src, Is_young(block), block, callstack); - check_action_pending(); + /* Note: several callbacks may be called for a single entry. */ + while (es->active < es->size) { + /* Examine and possibly run a callback on the entry at es->active. + * Running a callback may change many things, including es->active + * and es->config. */ + value config = validated_config(es); + if (config == CONFIG_NONE) break; + size_t i = es->active; + entry_t e = &es->t[i]; + + if (e->deleted || e->runner) { + /* This entry is already deleted, or is running a callback. Ignore it. */ + ++ es->active; + } else if (!(e->callbacks & CB_MASK(CB_ALLOC))) { + /* allocation callback hasn't been run */ + if (Status(config) == CONFIG_STATUS_SAMPLING) { + res = run_alloc_callback_exn(thread, es, i); + if (Is_exception_result(res)) break; + } else { + /* sampling stopped, e.g. by a previous callback; drop this entry */ + entry_delete(es, i); + } + } else if (e->promoted && !(e->callbacks & CB_MASK(CB_PROMOTE))) { + /* promoted entry; call promote callback */ + res = run_callback_exn(thread, es, i, + Promote(config), e->user_data, + CB_PROMOTE); + if (Is_exception_result(res)) break; + } else if (e->deallocated && !(e->callbacks & CB_MASK(CB_DEALLOC))) { + /* deallocated entry; call dealloc callback */ + value cb = (e->promoted || !e->alloc_young) ? + Dealloc_major(config) : Dealloc_minor(config); + res = run_callback_exn(thread, es, i, + cb, e->user_data, + CB_DEALLOC); + if (Is_exception_result(res)) break; + } else { + /* There is nothing to do with this entry. */ + ++ es->active; + } + } + entries_evict(es); + return res; } -void caml_memprof_track_alloc_shr(value block) +/* Run any pending callbacks for the current thread and domain, and + * any orphaned callbacks. + * + * Does not use domain_apply_actions() because this can dynamically + * change the various indexes into an entries table while iterating + * over it, whereas domain_apply_actions assumes that can't happen. */ + +value caml_memprof_run_callbacks_exn(void) { - CAMLassert(Is_in_heap(block)); - if (lambda == 0 || local->suspended) return; + memprof_domain_t domain = Caml_state->memprof; + CAMLassert(domain); + memprof_thread_t thread = domain->current; + CAMLassert(thread); + value res = Val_unit; + if (thread->suspended || !domain->pending) return res; + + orphans_adopt(domain); + update_suspended(domain, true); + + /* run per-domain callbacks first */ + res = entries_run_callbacks_exn(thread, &domain->entries); + if (Is_exception_result(res)) goto end; + + /* run per-thread callbacks for current thread */ + res = entries_run_callbacks_exn(thread, &thread->entries); + if (Is_exception_result(res)) goto end; + /* Move any surviving entries from allocating thread to owning + * domain, so their subsequent callbacks may be run by any thread in + * the domain. entries_run_callbacks_exn didn't return an exception, + * so all these entries have had their allocation callbacks run. If + * this fails due to allocation failure, the entries remain with the + * thread, which is OK. */ + (void)entries_transfer(&thread->entries, &domain->entries); + + /* now run per-domain orphaned callbacks. */ + memprof_orphan_table_t ot = domain->orphans; + while (ot) { + entries_t es = &ot->entries; + if ((validated_config(es) != CONFIG_NONE) && (es->active < es->size)) { + /* An orphan table with something to run. */ + res = entries_run_callbacks_exn(thread, es); + if (Is_exception_result(res)) goto end; + /* Orphan tables may be deallocated during callbacks (if a + * callback discards the profile and then orphans_update_pending + * runs due to a GC) but a callback from an orphan table can + * never deallocate _that_ orphan table, so we can continue down + * the list. */ + } + ot = ot->next; + } - maybe_track_block(block, rand_binom(Whsize_val(block)), - Wosize_val(block), SRC_NORMAL); + end: + orphans_update_pending(domain); + update_suspended(domain, false); + return res; } -void caml_memprof_track_custom(value block, mlsize_t bytes) +/**** Sampling ****/ + +/* Is the current thread currently sampling? */ + +Caml_inline bool sampling(memprof_domain_t domain) { - CAMLassert(Is_young(block) || Is_in_heap(block)); - if (lambda == 0 || local->suspended) return; + memprof_thread_t thread = domain->current; - maybe_track_block(block, rand_binom(Wsize_bsize(bytes)), - Wsize_bsize(bytes), SRC_CUSTOM); + if (thread && !thread->suspended) { + value config = thread_config(thread); + return Sampling(config) && !Min_lambda(config); + } + return false; } -/* Shifts the next sample in the minor heap by [n] words. Essentially, - this tells the sampler to ignore the next [n] words of the minor - heap. */ -static void shift_sample(uintnat n) +/* Respond to the allocation of a block [block], size [wosize], with + * [samples] samples. [src] is one of the [CAML_MEMPROF_SRC_] enum values + * ([Gc.Memprof.allocation_source]). */ + +static void maybe_track_block(memprof_domain_t domain, + value block, size_t samples, + size_t wosize, int src) { - if (caml_memprof_young_trigger - Caml_state->young_alloc_start > n) - caml_memprof_young_trigger -= n; - else - caml_memprof_young_trigger = Caml_state->young_alloc_start; - caml_reset_young_limit(Caml_state); + if (samples == 0) return; + + value callstack = capture_callstack_no_GC(domain); + (void)new_entry(&domain->current->entries, block, callstack, + wosize, samples, src, Is_young(block), false); + set_action_pending_as_needed(domain); } -/* Renew the next sample in the minor heap. This needs to be called - after each minor sampling and after each minor collection. In - practice, this is called at each sampling in the minor heap and at - each minor collection. Extra calls do not change the statistical - properties of the sampling because of the memorylessness of the - geometric distribution. */ -void caml_memprof_renew_minor_sample(void) +/* Sets the trigger for the next sample in a domain's minor + * heap. Could race with sampling and profile-stopping code, so do not + * call from another domain unless the world is stopped (at the time + * of writing, this is only actually called from this domain). Must be + * called after each minor sample and after each minor collection. In + * practice, this is called at each minor sample, at each minor + * collection, and when sampling is suspended and unsuspended. Extra + * calls do not change the statistical properties of the sampling + * because of the memorylessness of the geometric distribution. */ + +void caml_memprof_set_trigger(caml_domain_state *state) { - if (lambda == 0 || local->suspended) - /* No trigger in the current minor heap. */ - caml_memprof_young_trigger = Caml_state->young_alloc_start; - else { - uintnat geom = rand_geom(); - if (Caml_state->young_ptr - Caml_state->young_alloc_start < geom) - /* No trigger in the current minor heap. */ - caml_memprof_young_trigger = Caml_state->young_alloc_start; - else - caml_memprof_young_trigger = Caml_state->young_ptr - (geom - 1); + memprof_domain_t domain = state->memprof; + CAMLassert(domain); + value *trigger = state->young_start; + if (sampling(domain)) { + uintnat geom = rand_geom(domain); + if (state->young_ptr - state->young_start > geom) { + trigger = state->young_ptr - (geom - 1); + } } - caml_reset_young_limit(Caml_state); + CAMLassert((trigger >= state->young_start) && + (trigger <= state->young_ptr)); + state->memprof_young_trigger = trigger; } -/* Called when exceeding the threshold for the next sample in the - minor heap, from the C code (the handling is different when called - from natively compiled OCaml code). */ -void caml_memprof_track_young(uintnat wosize, int from_caml, - int nallocs, unsigned char* encoded_alloc_lens) +/* Respond to the allocation of any block. Does not call callbacks. */ + +void caml_memprof_sample_block(value block, + size_t allocated_words, + size_t sampled_words, + int source) { + memprof_domain_t domain = Caml_state->memprof; + CAMLassert(domain); + CAMLassert(sampled_words >= allocated_words); + if (sampling(domain)) { + maybe_track_block(domain, block, rand_binom(domain, sampled_words), + allocated_words, source); + } +} + +/* Respond to hitting the memprof trigger on the minor heap. May + * sample several distinct blocks in the combined allocation. Runs + * allocation callbacks. */ + +void caml_memprof_sample_young(uintnat wosize, int from_caml, + int allocs, unsigned char* encoded_lens) +{ + CAMLparam0(); + memprof_domain_t domain = Caml_state->memprof; + CAMLassert(domain); + memprof_thread_t thread = domain->current; + CAMLassert(thread); + entries_t entries = &thread->entries; uintnat whsize = Whsize_wosize(wosize); - value callstack, res = Val_unit; - int alloc_idx = 0, i, allocs_sampled = 0; - intnat alloc_ofs, trigger_ofs; - double saved_lambda = lambda; + value res = Val_unit; + CAMLlocal1(config); + config = entries->config; - /* If this condition is false, then [caml_memprof_young_trigger] should be - equal to [Caml_state->young_alloc_start]. But this function is only - called with [Caml_state->young_alloc_start <= Caml_state->young_ptr < - caml_memprof_young_trigger], which is contradictory. */ - CAMLassert(!local->suspended && lambda > 0); + /* When a domain is not sampling, the memprof trigger is not + * set, so we should not come into this function. */ + CAMLassert(sampling(domain)); if (!from_caml) { - unsigned n_samples = 1 + - rand_binom(caml_memprof_young_trigger - 1 - Caml_state->young_ptr); - CAMLassert(encoded_alloc_lens == NULL); /* No Comballoc in C! */ - caml_memprof_renew_minor_sample(); - maybe_track_block(Val_hp(Caml_state->young_ptr), n_samples, - wosize, SRC_NORMAL); - return; + /* Not coming from Caml, so this isn't a comballoc. We know we're + * sampling at least once, but maybe more than once. */ + size_t samples = 1 + + rand_binom(domain, + Caml_state->memprof_young_trigger - 1 - Caml_state->young_ptr); + CAMLassert(encoded_lens == NULL); + maybe_track_block(domain, Val_hp(Caml_state->young_ptr), + samples, wosize, CAML_MEMPROF_SRC_NORMAL); + caml_memprof_set_trigger(Caml_state); + caml_reset_young_limit(Caml_state); + CAMLreturn0; } - /* We need to call the callbacks for this sampled block. Since each - callback can potentially allocate, the sampled block will *not* - be the one pointed to by [caml_memprof_young_trigger]. Instead, - we remember that we need to sample the next allocated word, - call the callback and use as a sample the block which will be - allocated right after the callback. */ - - CAMLassert(Caml_state->young_ptr < caml_memprof_young_trigger && - caml_memprof_young_trigger <= Caml_state->young_ptr + whsize); - trigger_ofs = caml_memprof_young_trigger - Caml_state->young_ptr; - alloc_ofs = whsize; - - /* Restore the minor heap in a valid state for calling the callbacks. - We should not call the GC before these two instructions. */ + /* The memprof trigger lies in (young_ptr, young_ptr + whsize] */ + CAMLassert(Caml_state->young_ptr < Caml_state->memprof_young_trigger && + Caml_state->memprof_young_trigger <= + Caml_state->young_ptr + whsize); + + /* Trigger offset from the base of the combined allocation. We + * reduce this for each sample in this comballoc. Signed so it can + * go negative. */ + intnat trigger_ofs = + Caml_state->memprof_young_trigger - Caml_state->young_ptr; + /* Sub-allocation offset from the base of the combined + * allocation. Signed so we can compare correctly against + * trigger_ofs. */ + intnat alloc_ofs = whsize; + + /* Undo the combined allocation, so that we can allocate callstacks + * and in callbacks. */ Caml_state->young_ptr += whsize; - caml_memprof_set_suspended(1); // This also updates the memprof trigger - - /* Perform the sampling of the block in the set of Comballoc'd - blocks, insert them in the entries array, and run the - callbacks. */ - for (alloc_idx = nallocs - 1; alloc_idx >= 0; alloc_idx--) { - unsigned alloc_wosz = encoded_alloc_lens == NULL ? wosize : - Wosize_encoded_alloc_len(encoded_alloc_lens[alloc_idx]); - unsigned n_samples = 0; - alloc_ofs -= Whsize_wosize(alloc_wosz); + + /* Suspend profiling, so we don't profile allocations of callstacks + * or in callbacks. Resets trigger. */ + update_suspended(domain, true); + + /* Work through the sub-allocations, high address to low address, + * identifying which ones are sampled and how many times. For each + * sampled sub-allocation, create an entry in the thread's table. */ + size_t new_entries = 0; /* useful for debugging */ + size_t sub_alloc = allocs; + do { + -- sub_alloc; + size_t alloc_wosz = + encoded_lens == NULL ? wosize : + Wosize_encoded_alloc_len(encoded_lens[sub_alloc]); + alloc_ofs -= Whsize_wosize(alloc_wosz); /* base of this sub-alloc */ + + /* count samples for this sub-alloc? */ + size_t samples = 0; while (alloc_ofs < trigger_ofs) { - n_samples++; - trigger_ofs -= rand_geom(); + ++ samples; + trigger_ofs -= rand_geom(domain); } - if (n_samples > 0) { - uintnat t_idx; - int stopped; - - callstack = capture_callstack(alloc_idx); - t_idx = new_tracked(n_samples, alloc_wosz, SRC_NORMAL, 1, - Placeholder_offs(alloc_ofs), callstack); - if (t_idx == Invalid_index) continue; - res = run_alloc_callback_exn(t_idx); - /* Has [caml_memprof_stop] been called during the callback? */ - stopped = local->entries.len == 0; - if (stopped) { - allocs_sampled = 0; - if (saved_lambda != lambda) { - /* [lambda] changed during the callback. We need to refresh - [trigger_ofs]. */ - saved_lambda = lambda; - trigger_ofs = lambda == 0. ? 0 : alloc_ofs - (rand_geom() - 1); - } + + if (samples) { + value callstack = capture_callstack_GC(domain, sub_alloc); + size_t entry = + new_entry(entries, (value)alloc_ofs, callstack, + alloc_wosz, samples, CAML_MEMPROF_SRC_NORMAL, + true, true); + if (entry != Invalid_index) { + ++ new_entries; } - if (Is_exception_result(res)) break; - if (!stopped) allocs_sampled++; } - } - - CAMLassert(alloc_ofs == 0 || Is_exception_result(res)); - CAMLassert(allocs_sampled <= nallocs); - - if (!Is_exception_result(res)) { - /* The callbacks did not raise. The allocation will take place. - We now restore the minor heap in the state needed by - [Alloc_small_aux]. */ - if (Caml_state->young_ptr - whsize < Caml_state->young_trigger) { + } while (sub_alloc); + + (void)new_entries; /* this variable is useful to assert */ + CAMLassert(alloc_ofs == 0); + CAMLassert(trigger_ofs <= 0); + CAMLassert(new_entries <= allocs); + + /* Run all outstanding callbacks in this thread's table, which + * includes these recent allocation callbacks. If one of the + * callbacks stops the profile, the other callbacks will still + * run. */ + res = entries_run_callbacks_exn(thread, entries); + + /* A callback, or another thread of this domain, may have stopped + * the profile and then started another one. This will result in the + * entries being transferred to the domain's table which is then + * orphaned, deleting all offset entries. In this case, + * thread->config will have changed. We will have run the allocation + * callbacks up to the one which stopped the old profile. */ + bool restarted = (config != entries->config); + + /* A callback may have raised an exception. In this case, we are + * going to cancel this whole combined allocation and should delete + * the newly-created entries (if they are still in our table). */ + bool cancelled = Is_exception_result(res); + + if (!cancelled) { + /* No exceptions were raised, so the allocations will + * proceed. Make room in the minor heap for the blocks to be + * allocated. We must not trigger a GC after this point. */ + while (Caml_state->young_ptr - whsize < Caml_state->young_trigger) { CAML_EV_COUNTER(EV_C_FORCE_MINOR_MEMPROF, 1); - caml_gc_dispatch(); + caml_poll_gc_work(); } - - /* Re-allocate the blocks in the minor heap. We should not call the - GC after this. */ Caml_state->young_ptr -= whsize; + } + + /* If profiling has been stopped and restarted by these callbacks, + * the thread's entries table has been transferred to the domain and + * orphaned, so must be empty. */ - /* Make sure this block is not going to be sampled again. */ - shift_sample(whsize); + if (restarted) { + CAMLassert(entries->size == 0); } - /* Since [local->entries] is local to the current thread, we know for - sure that the allocated entries are the [alloc_sampled] last entries of - [local->entries]. */ - - for (i = 0; i < allocs_sampled; i++) { - uintnat idx = local->entries.len-allocs_sampled+i; - if (local->entries.t[idx].deleted) continue; - if (realloc_entries(&entries_global, 1)) { - /* Transfer the entry to the global array. */ - struct tracked* t = &entries_global.t[entries_global.len]; - entries_global.len++; - *t = local->entries.t[idx]; - - if (Is_exception_result(res)) { - /* The allocations are cancelled because of the exception, - but this callback has already been called. We simulate a - deallocation. */ - t->block = Val_unit; - t->deallocated = 1; - } else { - /* If the execution of the callback has succeeded, then we start the - tracking of this block.. - - Subtlety: we are actually writing [t->block] with an invalid - (uninitialized) block. This is correct because the allocation - and initialization happens right after returning from - [caml_memprof_track_young]. */ - t->block = Val_hp(Caml_state->young_ptr + Offs_placeholder(t->block)); - - /* We make sure that the action pending flag is not set - systematically, which is to be expected, since we created - a new block in the global entry array, but this new block - does not need promotion or deallocationc callback. */ - if (callback_idx == entries_global.len - 1) - callback_idx = entries_global.len; + /* All deleted entries will have been evicted from the thread's + * table. This may (often) include the offset entries we've just + * created (if an allocation callback returns None, for + * example). Any surviving offset entries will still be at the end + * of this thread's table. If one of the callbacks has raised an + * exception, we will not be allocating the blocks, so these entries + * should be deleted (or marked as deallocated if the allocation + * callback ran). Otherwise, they must be updated to point to the + * blocks which will now be allocated. */ + + if (cancelled) { + entries_clear_offsets(entries); + } else { + for (size_t i = 0; i < entries->size; ++i) { + entry_t e = &entries->t[i]; + if (e->offset) { /* an entry we just created */ + e->block = Val_hp(Caml_state->young_ptr + e->block); + e->offset = false; + if (i < entries->young) entries->young = i; } } - mark_deleted(&local->entries, idx); + /* There are now no outstanding allocation callbacks in the thread's + * entries table. Transfer the whole thing to the domain. If this + * fails due to allocation failure, the entries stay with the thread, + * which is OK. */ + (void)entries_transfer(entries, &domain->entries); } - flush_deleted(&local->entries); - /* We need to reset the suspended flag *after* flushing - [local->entries] to make sure the floag is not set back to 1. */ - caml_memprof_set_suspended(0); - - if (Is_exception_result(res)) - caml_raise(Extract_exception(res)); + /* Unsuspend profiling. Resets trigger. */ + update_suspended(domain, false); - /* /!\ Since the heap is in an invalid state before initialization, - very little heap operations are allowed until then. */ + if (cancelled) + caml_raise_async(Extract_exception(res)); - return; + CAMLreturn0; } -void caml_memprof_track_interned(header_t* block, header_t* blockend) +/**** Interface with systhread. ****/ + +CAMLexport memprof_thread_t caml_memprof_new_thread(caml_domain_state *state) { - header_t *p; - value callstack = 0; - int is_young = Is_young(Val_hp(block)); - - if (lambda == 0 || local->suspended) return; - - p = block; - while (1) { - uintnat next_sample = rand_geom(); - header_t *next_sample_p, *next_p; - if (next_sample > blockend - p) - break; - /* [next_sample_p] is the block *following* the next sampled - block! */ - next_sample_p = p + next_sample; - - while (1) { - next_p = p + Whsize_hp(p); - if (next_p >= next_sample_p) break; - p = next_p; - } + CAMLassert(state->memprof); + return thread_create(state->memprof); +} - if (callstack == 0) callstack = capture_callstack_postponed(); - if (callstack == 0) break; /* OOM */ - new_tracked(rand_binom(next_p - next_sample_p) + 1, - Wosize_hp(p), SRC_MARSHAL, is_young, Val_hp(p), callstack); - p = next_p; - } - check_action_pending(); +CAMLexport memprof_thread_t caml_memprof_main_thread(caml_domain_state *state) +{ + memprof_domain_t domain = state->memprof; + CAMLassert(domain); + memprof_thread_t thread = domain->threads; + CAMLassert(thread); + + /* There should currently be just one thread in this domain */ + CAMLassert(thread->next == NULL); + return thread; } -/**** Interface with the OCaml code. ****/ +CAMLexport void caml_memprof_delete_thread(memprof_thread_t thread) +{ + /* Transfer entries to the domain. If this fails due to allocation + * failure, we will lose the entries. May discard entries which + * haven't run allocation callbacks. */ + (void)entries_transfer(&thread->entries, &thread->domain->entries); + thread_destroy(thread); +} -static void caml_memprof_init(void) +CAMLexport void caml_memprof_enter_thread(memprof_thread_t thread) { - init = 1; - xoshiro_init(); + CAMLassert(thread); + thread->domain->current = thread; + update_suspended(thread->domain, thread->suspended); } -CAMLprim value caml_memprof_start(value lv, value szv, value tracker_param) +/**** Interface to OCaml ****/ + +CAMLprim value caml_memprof_start(value lv, value szv, value tracker) { - CAMLparam3(lv, szv, tracker_param); + CAMLparam3(lv, szv, tracker); + CAMLlocal1(one_log1m_lambda_v); - double l = Double_val(lv); + double lambda = Double_val(lv); intnat sz = Long_val(szv); - if (started) caml_failwith("Gc.Memprof.start: already started."); - - if (sz < 0 || !(l >= 0.) || l > 1.) /* Checks that [l] is not NAN. */ + /* Checks that [lambda] is within range (and not NaN). */ + if (sz < 0 || !(lambda >= 0.0 && lambda <= 1.0)) caml_invalid_argument("Gc.Memprof.start"); - if (!init) caml_memprof_init(); + memprof_domain_t domain = Caml_state->memprof; + CAMLassert(domain); + CAMLassert(domain->current); - lambda = l; - if (l > 0) { - one_log1m_lambda = l == 1 ? 0 : 1/caml_log1p(-l); - rand_pos = RAND_BLOCK_SIZE; - /* next_rand_geom can be zero if the next word is to be sampled, - but rand_geom always returns a value >= 1. Subtract 1 to correct. */ - next_rand_geom = rand_geom() - 1; + if (Sampling(thread_config(domain->current))) { + caml_failwith("Gc.Memprof.start: already started."); } - caml_memprof_renew_minor_sample(); + /* Orphan any surviving tracking entries from a previous profile. */ + if (!orphans_create(domain)) { + caml_raise_out_of_memory(); + } - callstack_size = sz; - started = 1; + double one_log1m_lambda = lambda == 1.0 ? 0.0 : 1.0/caml_log1p(-lambda); + /* Buggy implementations of caml_log1p could produce a + * one_log1m_lambda which is positive infinity or NaN, which would + * cause chaos in the RNG, so we check against this and set + * one_log1m_lambda to negative infinity (which we can test for). We + * preserve the user's value of Lambda for inspection or + * debugging. */ + if (!(one_log1m_lambda <= 0.0)) { /* catches NaN, +Inf, +ve */ + one_log1m_lambda = MIN_ONE_LOG1M_LAMBDA; /* negative infinity */ + } - tracker = tracker_param; - caml_register_generational_global_root(&tracker); + one_log1m_lambda_v = caml_copy_double(one_log1m_lambda); + + value config = caml_alloc_shr(CONFIG_FIELDS, 0); + caml_initialize(&Field(config, CONFIG_FIELD_STATUS), + Val_int(CONFIG_STATUS_SAMPLING)); + caml_initialize(&Field(config, CONFIG_FIELD_LAMBDA), lv); + caml_initialize(&Field(config, CONFIG_FIELD_1LOG1ML), one_log1m_lambda_v); + caml_initialize(&Field(config, CONFIG_FIELD_STACK_FRAMES), szv); + for (int i = CONFIG_FIELD_FIRST_CALLBACK; + i <= CONFIG_FIELD_LAST_CALLBACK; ++i) { + caml_initialize(&Field(config, i), Field(tracker, + i - CONFIG_FIELD_FIRST_CALLBACK)); + } + CAMLassert(domain->entries.size == 0); + + /* Set config pointers of the domain and all its threads */ + domain->entries.config = config; + memprof_thread_t thread = domain->threads; + while (thread) { + CAMLassert(thread->entries.size == 0); + thread->entries.config = config; + thread = thread->next; + } - CAMLreturn(Val_unit); -} + /* reset PRNG, generate first batch of random numbers. */ + rand_init(domain); -static void empty_entry_array(struct entry_array *ea) { - if (ea != NULL) { - ea->alloc_len = ea->len = ea->young_idx = ea->delete_idx = 0; - caml_stat_free(ea->t); - ea->t = NULL; - } -} + caml_memprof_set_trigger(Caml_state); + caml_reset_young_limit(Caml_state); + orphans_update_pending(domain); + set_action_pending_as_needed(domain); -static void th_ctx_memprof_stop(struct caml_memprof_th_ctx* ctx, void* data) -{ - (void)data; - if (ctx->callback_status != CB_IDLE) ctx->callback_status = CB_STOPPED; - empty_entry_array(&ctx->entries); + CAMLreturn(config); } CAMLprim value caml_memprof_stop(value unit) { - if (!started) caml_failwith("Gc.Memprof.stop: not started."); - - /* Discard the tracked blocks in the global entries array. */ - empty_entry_array(&entries_global); - - /* Discard the tracked blocks in the local entries array, - and set [callback_status] to [CB_STOPPED]. */ - caml_memprof_th_ctx_iter_hook(th_ctx_memprof_stop, NULL); - - callback_idx = 0; - - lambda = 0; - // Reset the memprof trigger in order to make sure we won't enter - // [caml_memprof_track_young]. - caml_memprof_renew_minor_sample(); - started = 0; + memprof_domain_t domain = Caml_state->memprof; + CAMLassert(domain); + memprof_thread_t thread = domain->current; + CAMLassert(thread); + + /* Final attempt to run allocation callbacks; don't use + * caml_memprof_run_callbacks_exn as we only really need allocation + * callbacks now. */ + if (!thread->suspended) { + update_suspended(domain, true); + value res = entries_run_callbacks_exn(thread, &thread->entries); + update_suspended(domain, false); + (void) caml_raise_async_if_exception(res, "memprof callback"); + } - caml_remove_generational_global_root(&tracker); + value config = thread_config(thread); + if (config == CONFIG_NONE || Status(config) != CONFIG_STATUS_SAMPLING) { + caml_failwith("Gc.Memprof.stop: no profile running."); + } + Set_status(config, CONFIG_STATUS_STOPPED); - caml_stat_free(callstack_buffer); - callstack_buffer = NULL; - callstack_buffer_len = 0; + caml_memprof_set_trigger(Caml_state); + caml_reset_young_limit(Caml_state); return Val_unit; } -/**** Interface with systhread. ****/ - -static void th_ctx_iter_default(th_ctx_action f, void* data) { - f(local, data); -} - -CAMLexport void (*caml_memprof_th_ctx_iter_hook)(th_ctx_action, void*) - = th_ctx_iter_default; - -CAMLexport struct caml_memprof_th_ctx* caml_memprof_new_th_ctx() -{ - struct caml_memprof_th_ctx* ctx = - caml_stat_alloc(sizeof(struct caml_memprof_th_ctx)); - ctx->suspended = 0; - ctx->callback_status = CB_IDLE; - ctx->entries.t = NULL; - ctx->entries.min_alloc_len = MIN_ENTRIES_LOCAL_ALLOC_LEN; - ctx->entries.alloc_len = ctx->entries.len = 0; - ctx->entries.young_idx = ctx->entries.delete_idx = 0; - return ctx; -} - -CAMLexport void caml_memprof_delete_th_ctx(struct caml_memprof_th_ctx* ctx) +CAMLprim value caml_memprof_discard(value config) { - if (ctx->callback_status >= 0) - /* A callback is running in this thread from the global entries - array. We delete the corresponding entry. */ - mark_deleted(&entries_global, ctx->callback_status); - if (ctx == local) local = NULL; - caml_stat_free(ctx->entries.t); - if (ctx != &caml_memprof_main_ctx) caml_stat_free(ctx); -} + uintnat status = Status(config); + CAMLassert((status == CONFIG_STATUS_STOPPED) || + (status == CONFIG_STATUS_SAMPLING) || + (status == CONFIG_STATUS_DISCARDED)); + + switch (status) { + case CONFIG_STATUS_STOPPED: /* correct case */ + break; + case CONFIG_STATUS_SAMPLING: + caml_failwith("Gc.Memprof.discard: profile not stopped."); + case CONFIG_STATUS_DISCARDED: + caml_failwith("Gc.Memprof.discard: profile already discarded."); + } -CAMLexport void caml_memprof_leave_thread(void) -{ - local = NULL; -} + Set_status(config, CONFIG_STATUS_DISCARDED); -CAMLexport void caml_memprof_enter_thread(struct caml_memprof_th_ctx* ctx) -{ - CAMLassert(local == NULL); - local = ctx; - caml_memprof_set_suspended(ctx->suspended); + return Val_unit; } - -#endif diff --git a/runtime/meta.c b/runtime/meta.c index 70bf854da78..e9d5f0ea8ce 100644 --- a/runtime/meta.c +++ b/runtime/meta.c @@ -67,14 +67,15 @@ static char* buffer_of_bytes_array(value ls, asize_t *len) int i; *len = 0; - for (i = 0; i < Wosize_val(ls); i++) { + mlsize_t ls_size = Wosize_val(ls); + for (i = 0; i < ls_size; i++) { s = Field(ls, i); *len += caml_string_length(s); } ret = caml_stat_alloc(*len); off = 0; - for (i = 0; i < Wosize_val(ls); i++) { + for (i = 0; i < ls_size; i++) { size_t s_len; s = Field(ls, i); s_len = caml_string_length(s); @@ -121,7 +122,7 @@ CAMLprim value caml_reify_bytecode(value ls_prog, clos = caml_alloc_small (2, Closure_tag); Code_val(clos) = (code_t) prog; - Closinfo_val(clos) = Make_closinfo(0, 2); + Closinfo_val(clos) = Make_closinfo(0, 2, 1); bytecode = caml_alloc_small (2, Abstract_tag); Bytecode_val(bytecode)->prog = prog; Bytecode_val(bytecode)->len = len; diff --git a/runtime/minor_gc.c b/runtime/minor_gc.c index be686af4ca0..0df3efc9ebd 100644 --- a/runtime/minor_gc.c +++ b/runtime/minor_gc.c @@ -15,6 +15,7 @@ #define CAML_INTERNALS +#include #include #include @@ -30,6 +31,7 @@ #include "caml/globroots.h" #include "caml/major_gc.h" #include "caml/memory.h" +#include "caml/memprof.h" #include "caml/minor_gc.h" #include "caml/misc.h" #include "caml/mlvalues.h" @@ -82,10 +84,20 @@ static void reset_table (struct generic_table *tbl) tbl->base = tbl->ptr = tbl->threshold = tbl->limit = tbl->end = NULL; } -static void clear_table (struct generic_table *tbl) +static void clear_table (struct generic_table *tbl, + asize_t element_size, + const char *name) { + asize_t maxsz = Caml_state->minor_heap_wsz; + if (tbl->size <= maxsz) { tbl->ptr = tbl->base; tbl->limit = tbl->threshold; + } else { + caml_gc_message (0x08, "Shrinking %s to %ldk bytes\n", + name, + (long)((maxsz * element_size) / 1024)); + alloc_generic_table(tbl, Caml_state->minor_heap_wsz, 256, element_size); + } } struct caml_minor_tables* caml_alloc_minor_tables(void) @@ -129,8 +141,11 @@ void caml_set_minor_heap_size (asize_t wsize) if (domain_state->young_ptr != domain_state->young_end) { CAML_EV_COUNTER (EV_C_FORCE_MINOR_SET_MINOR_HEAP_SIZE, 1); - caml_minor_collection(); + // Don't call caml_minor_collection, since that can run the + // caml_domain_external_interrupt_hook, which can allocate. + caml_empty_minor_heaps_once(); } + CAMLassert (domain_state->young_ptr == domain_state->young_end); if(caml_reallocate_minor_heap(wsize) < 0) { caml_fatal_error("Fatal error: No memory for minor heap"); @@ -151,7 +166,7 @@ static value alloc_shared(caml_domain_state* d, mlsize_t wosize, tag_t tag, reserved_t reserved) { void* mem = caml_shared_try_alloc(d->shared_heap, wosize, tag, - reserved, 0 /* not pinned */); + reserved); d->allocated_words += Whsize_wosize(wosize); if (mem == NULL) { caml_fatal_error("allocation failure during minor GC"); @@ -277,14 +292,14 @@ static void oldify_one (void* st_v, value v, volatile value *p) Field(result, 0) = Val_ptr(stk); if (stk != NULL) { caml_scan_stack(&oldify_one, oldify_scanning_flags, st, - stk, 0); + stk, 0, NULL); } } else { /* Conflict - fix up what we allocated on the major heap */ *Hp_val(result) = Make_header(1, No_scan_tag, - caml_global_heap_state.MARKED); + caml_allocation_status()); #ifdef DEBUG Field(result, 0) = Val_long(1); #endif @@ -296,12 +311,29 @@ static void oldify_one (void* st_v, value v, volatile value *p) result = alloc_shared(st->domain, sz, tag, Reserved_hd(hd)); field0 = Field(v, 0); if( try_update_object_header(v, p, result, infix_offset) ) { - if (sz > 1){ + /* Copy the non-scannable suffix of fields. + There is some trickiness around the 0th field, which + has been overwritten in [v], so we have to use [field0] + directly. + */ + mlsize_t scannable_sz = Scannable_wosize_hd(hd); + i = scannable_sz; + if (i == 0) { + Field(result, i) = field0; + i++; + } + for (; i < sz; i++) { + Field(result, i) = Field(v, i); + } + + if (scannable_sz == 0) { + return; + } else if (scannable_sz > 1){ Field(result, 0) = field0; Field(result, 1) = st->todo_list; st->todo_list = v; } else { - CAMLassert (sz == 1); + CAMLassert (scannable_sz == 1); p = Op_val(result); v = field0; goto tail_call; @@ -309,9 +341,12 @@ static void oldify_one (void* st_v, value v, volatile value *p) } else { /* Conflict - fix up what we allocated on the major heap */ *Hp_val(result) = Make_header(sz, No_scan_tag, - caml_global_heap_state.MARKED); + caml_allocation_status()); #ifdef DEBUG { + /* Don't need to check reserved bits for whether this is a mixed block; + this is just uninitialized data for debugging. + */ int c; for( c = 0; c < sz ; c++ ) { Field(result, c) = Val_long(1); @@ -331,7 +366,7 @@ static void oldify_one (void* st_v, value v, volatile value *p) if( !try_update_object_header(v, p, result, 0) ) { /* Conflict */ *Hp_val(result) = Make_header(sz, No_scan_tag, - caml_global_heap_state.MARKED); + caml_allocation_status()); #ifdef DEBUG for( i = 0; i < sz ; i++ ) { Field(result, i) = Val_long(1); @@ -363,7 +398,7 @@ static void oldify_one (void* st_v, value v, volatile value *p) goto tail_call; } else { *Hp_val(result) = Make_header(1, No_scan_tag, - caml_global_heap_state.MARKED); + caml_allocation_status()); #ifdef DEBUG Field(result, 0) = Val_long(1); #endif @@ -398,12 +433,32 @@ static void oldify_mopup (struct oldify_state* st, int do_ephemerons) new_v = Field(v, 0); /* Follow forward pointer. */ st->todo_list = Field (new_v, 1); /* Remove from list. */ + mlsize_t scannable_wosize = Scannable_wosize_val(new_v); + + /* [v] was only added to the [todo_list] if its [scannable_wosize > 1]. + - It needs to be greater than 0 because we oldify the first field. + - It needs to be greater than 1 so the below loop runs at least once, + overwriting Field(new_v, 1) which [oldify_one] used as temporary + storage of the next value of [todo_list]. + */ + CAMLassert (scannable_wosize > 1); + f = Field(new_v, 0); CAMLassert (!Is_debug_tag(f)); if (Is_block (f) && Is_young(f)) { oldify_one (st, f, Op_val (new_v)); } - for (i = 1; i < Wosize_val (new_v); i++){ + + i = 1; + + if(Tag_val(new_v) == Closure_tag) { + mlsize_t non_scannable = Start_env_closinfo(Closinfo_val(v)); + for (; i < non_scannable; i++) { + Field(new_v, i) = Field(v, i); + } + } + + for (; i < scannable_wosize; i++){ f = Field(v, i); CAMLassert (!Is_debug_tag(f)); if (Is_block (f) && Is_young(f)) { @@ -412,6 +467,9 @@ static void oldify_mopup (struct oldify_state* st, int do_ephemerons) Field(new_v, i) = f; } } + + // The non-scannable suffix is already copied in [oldify_one]. + CAMLassert (Wosize_val(new_v)); } @@ -448,9 +506,15 @@ void caml_empty_minor_heap_domain_clear(caml_domain_state* domain) caml_final_empty_young(domain); - clear_table ((struct generic_table *)&minor_tables->major_ref); - clear_table ((struct generic_table *)&minor_tables->ephe_ref); - clear_table ((struct generic_table *)&minor_tables->custom); + clear_table ((struct generic_table *)&minor_tables->major_ref, + sizeof(value *), + "major_ref"); + clear_table ((struct generic_table *)&minor_tables->ephe_ref, + sizeof(struct caml_ephe_ref_elt), + "ephe_ref"); + clear_table ((struct generic_table *)&minor_tables->custom, + sizeof(struct caml_custom_elt), + "custom"); domain->extra_heap_resources_minor = 0.0; } @@ -460,7 +524,6 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, caml_domain_state** participating) { struct caml_minor_tables *self_minor_tables = domain->minor_tables; - struct caml_custom_elt *elt; value* young_ptr = domain->young_ptr; value* young_end = domain->young_end; uintnat minor_allocated_bytes = (uintnat)young_end - (uintnat)young_ptr; @@ -570,26 +633,17 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, } #endif - /* unconditionally promote custom blocks so accounting is correct */ - for (elt = self_minor_tables->custom.base; - elt < self_minor_tables->custom.ptr; elt++) { - value *v = &elt->block; - if (Is_block(*v) && Is_young(*v)) { - caml_adjust_gc_speed(elt->mem, elt->max); - if (get_header_val(*v) == 0) { /* value copied to major heap */ - *v = Field(*v, 0); - } else { - oldify_one(&st, *v, v); - } - } - } - CAML_EV_BEGIN(EV_MINOR_FINALIZERS_OLDIFY); /* promote the finalizers unconditionally as we want to avoid barriers */ caml_final_do_young_roots (&oldify_one, oldify_scanning_flags, &st, domain, 0); CAML_EV_END(EV_MINOR_FINALIZERS_OLDIFY); + CAML_EV_BEGIN(EV_MINOR_MEMPROF_ROOTS); + caml_memprof_scan_roots(&oldify_one, oldify_scanning_flags, &st, + domain, false, participating[0] == domain); + CAML_EV_END(EV_MINOR_MEMPROF_ROOTS); + CAML_EV_BEGIN(EV_MINOR_REMEMBERED_SET_PROMOTE); oldify_mopup (&st, 1); /* ephemerons promoted here */ CAML_EV_END(EV_MINOR_REMEMBERED_SET_PROMOTE); @@ -607,19 +661,13 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, CAMLassert (!Is_block(vnew) || (get_header_val(vnew) != 0 && !Is_young(vnew))); } - - for (elt = self_minor_tables->custom.base; - elt < self_minor_tables->custom.ptr; elt++) { - value vnew = elt->block; - CAMLassert (!Is_block(vnew) - || (get_header_val(vnew) != 0 && !Is_young(vnew))); - } #endif CAML_EV_BEGIN(EV_MINOR_LOCAL_ROOTS); caml_do_local_roots( &oldify_one, oldify_scanning_flags, &st, - domain->local_roots, domain->current_stack, domain->gc_regs); + domain->local_roots, domain->current_stack, domain->gc_regs, + caml_get_local_arenas(domain)); scan_roots_hook = atomic_load(&caml_scan_roots_hook); if (scan_roots_hook != NULL) @@ -630,11 +678,16 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, CAML_EV_END(EV_MINOR_LOCAL_ROOTS_PROMOTE); CAML_EV_END(EV_MINOR_LOCAL_ROOTS); + CAML_EV_BEGIN(EV_MINOR_MEMPROF_CLEAN); + caml_memprof_after_minor_gc(domain, participating[0] == domain); + CAML_EV_END(EV_MINOR_MEMPROF_CLEAN); + domain->young_ptr = domain->young_end; /* Trigger a GC poll when half of the minor heap is filled. At that point, a * major slice is scheduled. */ domain->young_trigger = domain->young_start + (domain->young_end - domain->young_start) / 2; + caml_memprof_set_trigger(domain); caml_reset_young_limit(domain); if( participating_count > 1 ) { @@ -658,6 +711,28 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, (unsigned)(minor_allocated_bytes + 512)/1024); } +/* Finalize dead custom blocks and do the accounting for the live + ones. This must be done right after leaving the barrier. At this + point, all domains have finished minor GC, but this domain hasn't + resumed running OCaml code. Other domains may have resumed OCaml + code, but they cannot have any pointers into our minor heap. */ +static void custom_finalize_minor (caml_domain_state * domain) +{ + struct caml_custom_elt *elt; + for (elt = domain->minor_tables->custom.base; + elt < domain->minor_tables->custom.ptr; elt++) { + value *v = &elt->block; + if (Is_block(*v) && Is_young(*v)) { + if (get_header_val(*v) == 0) { /* value copied to major heap */ + caml_adjust_gc_speed(elt->mem, elt->max); + } else { + void (*final_fun)(value) = Custom_ops_val(*v)->finalize; + if (final_fun != NULL) final_fun(*v); + } + } + } +} + void caml_do_opportunistic_major_slice (caml_domain_state* domain_unused, void* unused) { @@ -691,6 +766,9 @@ caml_stw_empty_minor_heap_no_major_slice(caml_domain_state* domain, uintnat* initial_young_ptr = (uintnat*)domain->young_ptr; CAMLassert(caml_domain_is_in_stw()); #endif + if (Caml_state->in_minor_collection) + caml_fatal_error("Minor GC triggered recursively"); + Caml_state->in_minor_collection = 1; if( participating[0] == Caml_state ) { atomic_fetch_add(&caml_minor_cycles_started, 1); @@ -717,6 +795,11 @@ caml_stw_empty_minor_heap_no_major_slice(caml_domain_state* domain, CAML_EV_END(EV_MINOR_LEAVE_BARRIER); } + CAML_EV_BEGIN(EV_MINOR_FINALIZED); + caml_gc_log("finalizing dead minor custom blocks"); + custom_finalize_minor(domain); + CAML_EV_END(EV_MINOR_FINALIZED); + CAML_EV_BEGIN(EV_MINOR_FINALIZERS_ADMIN); caml_gc_log("running finalizer data structure book-keeping"); caml_final_update_last_minor(domain); @@ -725,6 +808,7 @@ caml_stw_empty_minor_heap_no_major_slice(caml_domain_state* domain, CAML_EV_BEGIN(EV_MINOR_CLEAR); caml_gc_log("running stw empty_minor_heap_domain_clear"); caml_empty_minor_heap_domain_clear(domain); + #ifdef DEBUG { for (uintnat* p = initial_young_ptr; p < (uintnat*)domain->young_end; ++p) @@ -733,7 +817,11 @@ caml_stw_empty_minor_heap_no_major_slice(caml_domain_state* domain, #endif CAML_EV_END(EV_MINOR_CLEAR); + caml_gc_log("finished stw empty_minor_heap"); + CAMLassert(domain->young_ptr == domain->young_end); + + Caml_state->in_minor_collection = 0; } static void caml_stw_empty_minor_heap (caml_domain_state* domain, void* unused, @@ -813,12 +901,16 @@ void caml_alloc_small_dispatch (caml_domain_state * dom_st, if (flags & CAML_FROM_CAML) /* In the case of allocations performed from OCaml, execute asynchronous callbacks. */ - caml_raise_if_exception(caml_do_pending_actions_exn()); + (void) caml_raise_async_if_exception(caml_do_pending_actions_exn(), + "minor GC"); else { caml_handle_gc_interrupt(); - /* In the case of long-running C code that regularly polls with - [caml_process_pending_actions], still force a query of all - callbacks at every minor collection or major slice. */ + /* We might be here due to a recently-recorded signal, so we + need to remember that we must run signal handlers. In + addition, in the case of long-running C code that regularly + polls with caml_process_pending_actions, we want to force a + query of all callbacks at every minor collection or major + slice (similarly to OCaml behaviour). */ dom_st->action_pending = 1; } @@ -836,23 +928,25 @@ void caml_alloc_small_dispatch (caml_domain_state * dom_st, /* Re-do the allocation: we now have enough space in the minor heap. */ dom_st->young_ptr -= whsize; -#if 0 /* Check if the allocated block has been sampled by memprof. */ - if (dom_st->young_ptr < caml_memprof_young_trigger) { + if (dom_st->young_ptr < dom_st->memprof_young_trigger) { if(flags & CAML_DO_TRACK) { - caml_memprof_track_young(wosize, flags & CAML_FROM_CAML, - nallocs, encoded_alloc_lens); - /* Until the allocation actually takes place, the heap is in an invalid - state (see comments in [caml_memprof_track_young]). Hence, very little - heap operations are allowed before the actual allocation. - - Moreover, [Caml_state->young_ptr] should not be modified before the - allocation, because its value has been used as the pointer to - the sampled block. + caml_memprof_sample_young(wosize, flags & CAML_FROM_CAML, + nallocs, encoded_alloc_lens); + /* Until the allocation actually takes place, the heap is in an + invalid state (see comments in [caml_memprof_sample_young]). + Hence, very few heap operations are allowed between this point + and the actual allocation. + + Specifically, [dom_st->young_ptr] must not now be modified + before the allocation, because it has been used to predict + addresses of sampled block(s). */ - } else caml_memprof_renew_minor_sample(); + } else { /* CAML DONT TRACK */ + caml_memprof_set_trigger(dom_st); + caml_reset_young_limit(dom_st); + } } -#endif } /* Request a minor collection and enter as if it were an interrupt. diff --git a/runtime/misc.c b/runtime/misc.c index 1d96d578ef0..ec81d8248f5 100644 --- a/runtime/misc.c +++ b/runtime/misc.c @@ -84,6 +84,9 @@ void caml_gc_log (char *msg, ...) char fmtbuf[GC_LOG_LENGTH]; va_list args; va_start (args, msg); + if (caml_verb_gc & 0x1000) { + caml_print_timestamp(stderr, caml_verb_gc & 0x2000); + } snprintf(fmtbuf, GC_LOG_LENGTH, "[%02d] %s\n", (Caml_state_opt != NULL) ? Caml_state_opt->id : -1, msg); vfprintf(stderr, fmtbuf, args); @@ -97,6 +100,9 @@ void caml_gc_message (int level, char *msg, ...) if ((atomic_load_relaxed(&caml_verb_gc) & level) != 0){ va_list ap; va_start(ap, msg); + if (caml_verb_gc & 0x1000) { + caml_print_timestamp(stderr, caml_verb_gc & 0x2000); + } vfprintf (stderr, msg, ap); va_end(ap); fflush (stderr); @@ -136,6 +142,11 @@ CAMLexport void caml_fatal_error_arg2 (const char *fmt1, const char *arg1, exit(2); } +void caml_fatal_out_of_memory(void) +{ + caml_fatal_error("Out of memory"); +} + void caml_ext_table_init(struct ext_table * tbl, int init_capa) { tbl->size = 0; @@ -250,3 +261,18 @@ void caml_bad_caml_state(void) { caml_fatal_error("no domain lock held"); } + +/* Flambda 2 invalid term markers */ + +CAMLnoreturn_start +void caml_flambda2_invalid (value message) +CAMLnoreturn_end; + +void caml_flambda2_invalid (value message) +{ + fprintf (stderr, "[ocaml] [flambda2] Invalid code:\n%s\n\n", + String_val(message)); + fprintf (stderr, "This might have arisen from a wrong use of [Obj.magic].\n"); + fprintf (stderr, "Consider using [Sys.opaque_identity].\n"); + abort (); +} diff --git a/runtime/obj.c b/runtime/obj.c index 56db69f5faf..faffb78941d 100644 --- a/runtime/obj.c +++ b/runtime/obj.c @@ -66,6 +66,20 @@ CAMLprim value caml_obj_set_raw_field(value arg, value pos, value bits) return Val_unit; } +CAMLprim value caml_obj_make_forward(value blk, value fwd) +{ + caml_modify(&Field(blk, 0), fwd); + Tag_val (blk) = Forward_tag; + return Val_unit; +} + +CAMLprim value caml_get_header(value blk) +{ + // undefined behaviour if blk is not a block + intnat r = Hd_val(blk); + return caml_copy_nativeint(r); +} + /* [size] is a value encoding a number of blocks */ CAMLprim value caml_obj_block(value tag, value size) { @@ -101,7 +115,7 @@ CAMLprim value caml_obj_block(value tag, value size) /* Closinfo_val is the second field, so we need size at least 2 */ if (sz < 2) caml_invalid_argument ("Obj.new_block"); res = caml_alloc(sz, tg); - Closinfo_val(res) = Make_closinfo(0, 2); /* does not allocate */ + Closinfo_val(res) = Make_closinfo(0, 2, 1); /* does not allocate */ break; } case String_tag: { @@ -144,14 +158,25 @@ CAMLprim value caml_obj_with_tag(value new_tag_v, value arg) res = caml_alloc(sz, tg); memcpy(Bp_val(res), Bp_val(arg), sz * sizeof(value)); } else if (sz <= Max_young_wosize) { - res = caml_alloc_small(sz, tg); + reserved_t reserved = Reserved_val(arg); + res = caml_alloc_small_with_reserved(sz, tg, reserved); for (i = 0; i < sz; i++) Field(res, i) = Field(arg, i); } else { - res = caml_alloc_shr(sz, tg); + mlsize_t scannable_sz = Scannable_wosize_val(arg); + reserved_t reserved = Reserved_val(arg); + + res = caml_alloc_shr_reserved(sz, tg, reserved); /* It is safe to use [caml_initialize] even if [tag == Closure_tag] and some of the "values" being copied are actually code pointers. That's because the new "value" does not point to the minor heap. */ - for (i = 0; i < sz; i++) caml_initialize(&Field(res, i), Field(arg, i)); + for (i = 0; i < scannable_sz; i++) { + caml_initialize(&Field(res, i), Field(arg, i)); + } + + for (i = scannable_sz; i < sz; i++) { + Field(res, i) = Field(arg, i); + } + /* Give gc a chance to run, and run memprof callbacks */ caml_process_pending_actions(); } @@ -161,6 +186,7 @@ CAMLprim value caml_obj_with_tag(value new_tag_v, value arg) CAMLprim value caml_obj_dup(value arg) { + if (!Is_block(arg)) return arg; return caml_obj_with_tag(Val_long(Tag_val(arg)), arg); } @@ -250,6 +276,11 @@ CAMLprim value caml_lazy_update_to_forcing (value v) } } +CAMLprim value caml_obj_is_stack (value v) +{ + return Val_int(caml_is_stack(v)); +} + /* For mlvalues.h and camlinternalOO.ml See also GETPUBMET in interp.c */ @@ -299,3 +330,19 @@ struct queue_chunk { struct queue_chunk *next; value entries[ENTRIES_PER_QUEUE_CHUNK]; }; + +/* Return 0 for uniform blocks and 1+n for a mixed block with scannable prefix + len n. + */ +CAMLprim value caml_succ_scannable_prefix_len (value v) { +#ifdef NATIVE_CODE + return Val_long(Reserved_val(v)); +#else + reserved_t reserved = Reserved_val(v); + if (reserved == Faux_mixed_block_sentinel) { + return Val_long(Scannable_wosize_val(v) + 1); + } else { + return Val_long(0); + } +#endif /* NATIVE_CODE */ +} diff --git a/runtime/platform.c b/runtime/platform.c index b3bf88a7aaf..cfb54fb1e1b 100644 --- a/runtime/platform.c +++ b/runtime/platform.c @@ -22,15 +22,35 @@ #include "caml/osdeps.h" #include "caml/platform.h" #include "caml/fail.h" -#include "caml/lf_skiplist.h" #ifdef HAS_SYS_MMAN_H #include #endif #ifdef _WIN32 #include #endif -#ifdef DEBUG -#include "caml/domain.h" + +#include "caml/alloc.h" +#include "sync_posix.h" + +#ifdef _WIN32 +/* CR ocaml 5 compactor: + + The runtime does not currently guarantee that memory is released to the OS in + the same block sizes as it was allocated, making it incompatible with + Windows. + + This incompatibility arises from the batch-mmap patch at: + + https://github.com/ocaml-flambda/flambda-backend/pull/2248 + + which does large memory allocations to acquire new pools. However, the + compactor releases pools one at a time. Until the compactor is updated + to be aware of large mappings, this will not work on Windows. + + So, for now, Windows compatibility is broken. The assertions ensuring that + mapping and unmapping sizes agree (ocaml/ocaml PR#10908) have been reverted, + and should be restored once the compactor is updated */ +#error "Windows compatibility currently broken due to mmap sizing" #endif /* Error reporting */ @@ -89,14 +109,7 @@ void caml_plat_mutex_free(caml_plat_mutex* m) static void caml_plat_cond_init_aux(caml_plat_cond *cond) { - pthread_condattr_t attr; - pthread_condattr_init(&attr); -#if defined(_POSIX_TIMERS) && \ - defined(_POSIX_MONOTONIC_CLOCK) && \ - _POSIX_MONOTONIC_CLOCK != (-1) - pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); -#endif - pthread_cond_init(&cond->cond, &attr); + custom_condvar_init(&cond->cond); } /* Condition variables */ @@ -109,24 +122,24 @@ void caml_plat_cond_init(caml_plat_cond* cond, caml_plat_mutex* m) void caml_plat_wait(caml_plat_cond* cond) { caml_plat_assert_locked(cond->mutex); - check_err("wait", pthread_cond_wait(&cond->cond, cond->mutex)); + check_err("wait", custom_condvar_wait(&cond->cond, cond->mutex)); } void caml_plat_broadcast(caml_plat_cond* cond) { caml_plat_assert_locked(cond->mutex); - check_err("cond_broadcast", pthread_cond_broadcast(&cond->cond)); + check_err("cond_broadcast", custom_condvar_broadcast(&cond->cond)); } void caml_plat_signal(caml_plat_cond* cond) { caml_plat_assert_locked(cond->mutex); - check_err("cond_signal", pthread_cond_signal(&cond->cond)); + check_err("cond_signal", custom_condvar_signal(&cond->cond)); } void caml_plat_cond_free(caml_plat_cond* cond) { - check_err("cond_free", pthread_cond_destroy(&cond->cond)); + check_err("cond_free", custom_condvar_destroy(&cond->cond)); cond->mutex=0; } @@ -148,29 +161,9 @@ uintnat caml_mem_round_up_pages(uintnat size) #define Is_page_aligned(size) ((size & (caml_plat_pagesize - 1)) == 0) -#ifdef DEBUG -static struct lf_skiplist mmap_blocks = {NULL}; -#endif - -#ifndef _WIN32 -#endif - -void* caml_mem_map(uintnat size, uintnat alignment, int reserve_only) +void* caml_mem_map(uintnat size, int reserve_only) { - CAMLassert(Is_power_of_2(alignment)); - CAMLassert(Is_page_aligned(size)); - alignment = round_up(alignment, caml_plat_mmap_alignment); - -#ifdef DEBUG - if (mmap_blocks.head == NULL) { - /* The first call to caml_mem_map should be during caml_init_domains, called - by caml_init_gc during startup - i.e. before any domains have started. */ - CAMLassert(atomic_load_acquire(&caml_num_domains_running) <= 1); - caml_lf_skiplist_init(&mmap_blocks); - } -#endif - - void* mem = caml_plat_mem_map(size, alignment, reserve_only); + void* mem = caml_plat_mem_map(size, reserve_only); if (mem == 0) { caml_gc_message(0x1000, "mmap %" ARCH_INTNAT_PRINTF_FORMAT "d bytes failed", @@ -181,10 +174,6 @@ void* caml_mem_map(uintnat size, uintnat alignment, int reserve_only) caml_gc_message(0x1000, "mmap %" ARCH_INTNAT_PRINTF_FORMAT "d" " bytes at %p for heaps\n", size, mem); -#ifdef DEBUG - caml_lf_skiplist_insert(&mmap_blocks, (uintnat)mem, size); -#endif - return mem; } @@ -207,17 +196,9 @@ void caml_mem_decommit(void* mem, uintnat size) void caml_mem_unmap(void* mem, uintnat size) { -#ifdef DEBUG - uintnat data; - CAMLassert(caml_lf_skiplist_find(&mmap_blocks, (uintnat)mem, &data) != 0); - CAMLassert(data == size); -#endif caml_gc_message(0x1000, "munmap %" ARCH_INTNAT_PRINTF_FORMAT "d" " bytes at %p for heaps\n", size, mem); caml_plat_mem_unmap(mem, size); -#ifdef DEBUG - caml_lf_skiplist_remove(&mmap_blocks, (uintnat)mem); -#endif } #define Min_sleep_ns 10000 // 10 us diff --git a/runtime/power.S b/runtime/power.S index 68486cb7dc8..30dbee60bcc 100644 --- a/runtime/power.S +++ b/runtime/power.S @@ -649,7 +649,7 @@ caml_system__code_end: .type caml_system.frametable, @object caml_system.frametable: datag 1 /* one descriptor */ - datag .L105 + 4 /* return address into callback */ + .long .L105 + 4 - . /* return address into callback */ .short -1 /* negative size count => use callback link */ .short 0 /* no roots here */ diff --git a/runtime/printexc.c b/runtime/printexc.c index 0d89710479d..66f6e36945c 100644 --- a/runtime/printexc.c +++ b/runtime/printexc.c @@ -17,6 +17,7 @@ /* Print an uncaught exception and abort */ +#include #include #include #include @@ -74,7 +75,8 @@ CAMLexport char * caml_format_exception(value exn) start = 1; } add_char(&buf, '('); - for (i = start; i < Wosize_val(bucket); i++) { + mlsize_t bucket_size = Wosize_val(bucket); + for (i = start; i < bucket_size; i++) { if (i > start) add_string(&buf, ", "); v = Field(bucket, i); if (Is_long(v)) { @@ -109,7 +111,7 @@ CAMLexport char * caml_format_exception(value exn) #endif /* Default C implementation in case the OCaml one is not registered. */ -static void default_fatal_uncaught_exception(value exn) +static void default_fatal_uncaught_exception(value exn, const char *msg2) { char * msg; const value * at_exit; @@ -123,11 +125,16 @@ static void default_fatal_uncaught_exception(value exn) saved_backtrace_pos = Caml_state->backtrace_pos; Caml_state->backtrace_active = 0; at_exit = caml_named_value("Pervasives.do_at_exit"); + /* In the event of an asynchronous exception occurring, it will still get + caught here, because of the semantics of [caml_callback_exn]. */ if (at_exit != NULL) caml_callback_exn(*at_exit, Val_unit); Caml_state->backtrace_active = saved_backtrace_active; Caml_state->backtrace_pos = saved_backtrace_pos; /* Display the uncaught exception */ - fprintf(stderr, "Fatal error: exception %s\n", msg); + if (msg2) + fprintf(stderr, "Fatal error: exception (from %s) %s\n", msg2, msg); + else + fprintf(stderr, "Fatal error: exception %s\n", msg); caml_stat_free(msg); /* Display the backtrace if available */ if (Caml_state->backtrace_active && !DEBUGGER_IN_USE) @@ -136,18 +143,24 @@ static void default_fatal_uncaught_exception(value exn) int caml_abort_on_uncaught_exn = 0; /* see afl.c */ -void caml_fatal_uncaught_exception(value exn) +void caml_fatal_uncaught_exception_with_message(value exn, const char *msg) { const value *handle_uncaught_exception; handle_uncaught_exception = caml_named_value("Printexc.handle_uncaught_exception"); + /* If the callback allocates, memprof could be called, in which case + a memprof callback could raise an exception while + [handle_uncaught_exception] is running, and the printing of + the exception could fail. */ + caml_memprof_update_suspended(true); + if (handle_uncaught_exception != NULL) /* [Printexc.handle_uncaught_exception] does not raise exception. */ caml_callback2(*handle_uncaught_exception, exn, Val_bool(DEBUGGER_IN_USE)); else - default_fatal_uncaught_exception(exn); + default_fatal_uncaught_exception(exn, msg); /* Terminate the process */ if (caml_abort_on_uncaught_exn) { abort(); @@ -155,3 +168,8 @@ void caml_fatal_uncaught_exception(value exn) exit(2); } } + +void caml_fatal_uncaught_exception(value exn) +{ + caml_fatal_uncaught_exception_with_message(exn, NULL); +} diff --git a/runtime/riscv.S b/runtime/riscv.S index c02e437adda..01f4ee74b5c 100644 --- a/runtime/riscv.S +++ b/runtime/riscv.S @@ -834,13 +834,13 @@ caml_system__code_end: /* GC roots for callback */ OBJECT(caml_system.frametable) - .quad 2 /* two descriptors */ - .quad L(caml_retaddr) /* return address into callback */ - .short -1 /* negative frame size => use callback link */ - .short 0 /* no roots */ + .quad 2 /* two descriptors */ + .4byte L(caml_retaddr) - . /* return address into callback */ + .short -1 /* negative frame size => use callback link */ + .short 0 /* no roots */ .align 3 - .quad L(frame_runstack) /* return address into fiber handler */ - .short -1 /* negative frame size => use callback link */ - .short 0 /* no roots */ + .4byte L(frame_runstack) - . /* return address into fiber handler */ + .short -1 /* negative frame size => use callback link */ + .short 0 /* no roots */ .align 3 END_OBJECT(caml_system.frametable) diff --git a/runtime/roots.c b/runtime/roots.c index 42dd222149c..3d98194bcb6 100644 --- a/runtime/roots.c +++ b/runtime/roots.c @@ -39,32 +39,10 @@ void caml_do_roots ( { scan_roots_hook hook; caml_do_local_roots(f, fflags, fdata, - d->local_roots, d->current_stack, d->gc_regs); + d->local_roots, d->current_stack, d->gc_regs, + caml_get_local_arenas(d)); hook = atomic_load(&caml_scan_roots_hook); if (hook != NULL) (*hook)(f, fflags, fdata, d); caml_final_do_roots(f, fflags, fdata, d, do_final_val); } - -CAMLexport void caml_do_local_roots ( - scanning_action f, scanning_action_flags fflags, void* fdata, - struct caml__roots_block *local_roots, - struct stack_info *current_stack, - value * v_gc_regs) -{ - struct caml__roots_block *lr; - int i, j; - value* sp; - - for (lr = local_roots; lr != NULL; lr = lr->next) { - for (i = 0; i < lr->ntables; i++){ - for (j = 0; j < lr->nitems; j++){ - sp = &(lr->tables[i][j]); - if (*sp != 0) { - f (fdata, *sp, sp); - } - } - } - } - caml_scan_stack(f, fflags, fdata, current_stack, v_gc_regs); -} diff --git a/runtime/runtime_events.c b/runtime/runtime_events.c index 1e5e141c0f1..1939e598850 100644 --- a/runtime/runtime_events.c +++ b/runtime/runtime_events.c @@ -832,3 +832,15 @@ CAMLprim value caml_runtime_events_user_resolve( CAMLdrop; return (value) Val_none; } + +/* Linker compatibility with unused 4 stdlib externals */ + +CAMLprim value caml_eventlog_resume(value v) +{ + caml_failwith("Called caml_eventlog_resume in runtime5: not supported."); +} + +CAMLprim value caml_eventlog_pause(value v) +{ + caml_failwith("Called caml_eventlog_pause in runtime5: not supported."); +} diff --git a/runtime/shared_heap.c b/runtime/shared_heap.c index 50613446843..945c772cb56 100644 --- a/runtime/shared_heap.c +++ b/runtime/shared_heap.c @@ -15,6 +15,7 @@ /**************************************************************************/ #define CAML_INTERNALS +#include #include #include @@ -25,13 +26,18 @@ #include "caml/fiber.h" /* for verification */ #include "caml/gc.h" #include "caml/globroots.h" +#include "caml/major_gc.h" #include "caml/memory.h" +#include "caml/memprof.h" #include "caml/mlvalues.h" #include "caml/platform.h" #include "caml/roots.h" #include "caml/shared_heap.h" #include "caml/sizeclasses.h" #include "caml/startup_aux.h" +#include "caml/weak.h" + +CAMLexport atomic_uintnat caml_compactions_count; typedef unsigned int sizeclass; @@ -49,7 +55,11 @@ typedef struct pool { sizeclass sz; } pool; CAML_STATIC_ASSERT(sizeof(pool) == Bsize_wsize(POOL_HEADER_WSIZE)); -#define POOL_HEADER_SZ sizeof(pool) +#define POOL_SLAB_WOFFSET(sz) (POOL_HEADER_WSIZE + wastage_sizeclass[sz]) +#define POOL_FIRST_BLOCK(p, sz) ((header_t*)(p) + POOL_SLAB_WOFFSET(sz)) +#define POOL_END(p) ((header_t*)(p) + POOL_WSIZE) +#define POOL_BLOCKS(p) ((POOL_WSIZE - POOL_HEADER_WSIZE) / \ + wsize_sizeclass[(p)->sz]) typedef struct large_alloc { caml_domain_state* owner; @@ -62,6 +72,16 @@ static struct { caml_plat_mutex lock; pool* free; + /* Mapped but not yet active pools */ + uintnat fresh_pools; + char* next_fresh_pool; + + /* Count of all pools in use across all domains and the global lists below. + + Does not include unused pools ('free' above) or freshly allocated pools + ('next_fresh_pool' above). */ + uintnat active_pools; + /* these only contain swept memory of terminated domains*/ struct heap_stats stats; pool* global_avail_pools[NUM_SIZECLASSES]; @@ -70,6 +90,9 @@ static struct { } pool_freelist = { CAML_PLAT_MUTEX_INITIALIZER, NULL, + 0, + NULL, + 0, { 0, }, { 0, }, { 0, }, @@ -93,6 +116,10 @@ struct caml_heap_state { struct heap_stats stats; }; +struct compact_pool_stat { + int free_blocks; + int live_blocks; +}; /* You need to hold the [pool_freelist] lock to call these functions. */ static void orphan_heap_stats_with_lock(struct caml_heap_state *); @@ -113,6 +140,7 @@ struct caml_heap_state* caml_init_shared_heap (void) { heap->swept_large = NULL; heap->unswept_large = NULL; heap->owner = Caml_state; + memset(&heap->stats, 0, sizeof(heap->stats)); } return heap; @@ -166,53 +194,75 @@ void caml_teardown_shared_heap(struct caml_heap_state* heap) { /* Allocating and deallocating pools from the global freelist. */ -#define POOLS_PER_ALLOCATION 16 static pool* pool_acquire(struct caml_heap_state* local) { pool* r; caml_plat_lock(&pool_freelist.lock); - if (!pool_freelist.free) { - void* mem = caml_mem_map(Bsize_wsize(POOL_WSIZE) * POOLS_PER_ALLOCATION, - Bsize_wsize(POOL_WSIZE), 0 /* allocate */); - int i; - if (mem) { - CAMLassert(pool_freelist.free == NULL); - for (i=0; inext = pool_freelist.free; - r->owner = NULL; - pool_freelist.free = r; + r = pool_freelist.free; + if (r) { + pool_freelist.free = r->next; + } else { + if (pool_freelist.fresh_pools == 0) { + uintnat new_pools = pool_freelist.active_pools * 15 / 100; + if (new_pools < 8) new_pools = 8; + + void* mem = caml_mem_map(Bsize_wsize(POOL_WSIZE) * new_pools, 0); + if (mem) { + pool_freelist.fresh_pools = new_pools; + pool_freelist.next_fresh_pool = mem; } } + if (pool_freelist.fresh_pools > 0) { + r = (pool*)pool_freelist.next_fresh_pool; + pool_freelist.next_fresh_pool += Bsize_wsize(POOL_WSIZE); + pool_freelist.fresh_pools --; + r->next = NULL; + r->owner = NULL; + } + } + if (r) { + pool_freelist.active_pools ++; + CAMLassert(r->owner == NULL); } - r = pool_freelist.free; - if (r) - pool_freelist.free = r->next; caml_plat_unlock(&pool_freelist.lock); - if (r) CAMLassert (r->owner == NULL); return r; } +/* release [pool] to the current free list of pools */ static void pool_release(struct caml_heap_state* local, pool* pool, - sizeclass sz) { + sizeclass sz) +{ pool->owner = NULL; CAMLassert(pool->sz == sz); local->stats.pool_words -= POOL_WSIZE; local->stats.pool_frag_words -= POOL_HEADER_WSIZE + wastage_sizeclass[sz]; - /* TODO: give free pools back to the OS. Issue #698 */ caml_plat_lock(&pool_freelist.lock); pool->next = pool_freelist.free; pool_freelist.free = pool; + pool_freelist.active_pools--; caml_plat_unlock(&pool_freelist.lock); } -static void calc_pool_stats(pool* a, sizeclass sz, struct heap_stats* s) { - value* p = (value*)((char*)a + POOL_HEADER_SZ); - value* end = (value*)a + POOL_WSIZE; + +/* free the memory of [pool], giving it back to the OS */ +static void pool_free(struct caml_heap_state* local, + pool* pool, + sizeclass sz) +{ + CAMLassert(pool->sz == sz); + local->stats.pool_words -= POOL_WSIZE; + local->stats.pool_frag_words -= POOL_HEADER_WSIZE + wastage_sizeclass[sz]; + caml_mem_unmap(pool, Bsize_wsize(POOL_WSIZE)); +} + +static void calc_pool_stats(pool* a, sizeclass sz, struct heap_stats* s) +{ + header_t* p = POOL_FIRST_BLOCK(a, sz); + header_t* end = POOL_END(a); mlsize_t wh = wsize_sizeclass[sz]; - s->pool_frag_words += Wsize_bsize(POOL_HEADER_SZ); + s->pool_frag_words += POOL_SLAB_WOFFSET(sz); while (p + wh <= end) { header_t hd = (header_t)atomic_load_relaxed((atomic_uintnat*)p); @@ -224,8 +274,7 @@ static void calc_pool_stats(pool* a, sizeclass sz, struct heap_stats* s) { p += wh; } - CAMLassert(end - p == wastage_sizeclass[sz]); - s->pool_frag_words += end - p; + CAMLassert(end == p); s->pool_words += POOL_WSIZE; } @@ -235,8 +284,8 @@ Caml_inline void pool_initialize(pool* r, caml_domain_state* owner) { mlsize_t wh = wsize_sizeclass[sz]; - value* p = (value*)((char*)r + POOL_HEADER_SZ); - value* end = (value*)((char*)r + Bsize_wsize(POOL_WSIZE)); + header_t* p = POOL_FIRST_BLOCK(r, sz); + header_t* end = POOL_END(r); r->next = 0; r->owner = owner; @@ -250,9 +299,16 @@ Caml_inline void pool_initialize(pool* r, while (p + wh <= end) { p[0] = 0; /* zero header indicates free object */ p[1] = (value)(p - wh); + #ifdef DEBUG + for (int w = 2 ; w < wh; w++) { + p[w] = Debug_free_major; + } + #endif p += wh; } - r->next_obj = p - wh; + CAMLassert(p == end); + CAMLassert((uintptr_t)end % Cache_line_bsize == 0); + r->next_obj = (value*)(p - wh); } /* Allocating an object from a pool */ @@ -395,7 +451,7 @@ static void* large_allocate(struct caml_heap_state* local, mlsize_t sz) { } value* caml_shared_try_alloc(struct caml_heap_state* local, mlsize_t wosize, - tag_t tag, reserved_t reserved, int pinned) + tag_t tag, reserved_t reserved) { mlsize_t whsize = Whsize_wosize(wosize); value* p; @@ -420,7 +476,7 @@ value* caml_shared_try_alloc(struct caml_heap_state* local, mlsize_t wosize, p = large_allocate(local, Bsize_wsize(whsize)); if (!p) return 0; } - colour = pinned ? NOT_MARKABLE : caml_global_heap_state.MARKED; + colour = caml_allocation_status(); Hd_hp (p) = Make_header_with_reserved(wosize, tag, colour, reserved); #ifdef DEBUG { @@ -433,18 +489,6 @@ value* caml_shared_try_alloc(struct caml_heap_state* local, mlsize_t wosize, return p; } -struct pool* caml_pool_of_shared_block(value v) -{ - mlsize_t whsize; - CAMLassert (Is_block(v) && !Is_young(v)); - whsize = Whsize_wosize(Wosize_val(v)); - if (whsize > 0 && whsize <= SIZECLASS_MAX) { - return (pool*)((uintnat)v &~(POOL_WSIZE * sizeof(value) - 1)); - } else { - return 0; - } -} - /* Sweeping */ static intnat pool_sweep(struct caml_heap_state* local, pool** plist, @@ -455,8 +499,8 @@ static intnat pool_sweep(struct caml_heap_state* local, pool** plist, *plist = a->next; { - value* p = (value*)((char*)a + POOL_HEADER_SZ); - value* end = (value*)a + POOL_WSIZE; + header_t* p = POOL_FIRST_BLOCK(a, sz); + header_t* end = POOL_END(a); mlsize_t wh = wsize_sizeclass[sz]; int all_used = 1; struct heap_stats* s = &local->stats; @@ -485,7 +529,7 @@ static intnat pool_sweep(struct caml_heap_state* local, pool** plist, } } #endif - a->next_obj = p; + a->next_obj = (value*)p; all_used = 0; /* update stats */ s->pool_live_blocks--; @@ -594,8 +638,8 @@ uintnat caml_heap_blocks(struct caml_heap_state* local) { void caml_redarken_pool(struct pool* r, scanning_action f, void* fdata) { mlsize_t wh = wsize_sizeclass[r->sz]; - value* p = (value*)((char*)r + POOL_HEADER_SZ); - value* end = (value*)((char*)r + Bsize_wsize(POOL_WSIZE)); + header_t* p = POOL_FIRST_BLOCK(r, r->sz); + header_t* end = POOL_END(r); while (p + wh <= end) { header_t hd = p[0]; @@ -760,13 +804,14 @@ static void verify_object(struct heap_verify_state* st, value v) { if (Tag_val(v) == Cont_tag) { struct stack_info* stk = Ptr_val(Field(v, 0)); if (stk != NULL) - caml_scan_stack(verify_push, verify_scanning_flags, st, stk, 0); + caml_scan_stack(verify_push, verify_scanning_flags, st, stk, 0, NULL); } else if (Tag_val(v) < No_scan_tag) { int i = 0; if (Tag_val(v) == Closure_tag) { i = Start_env_closinfo(Closinfo_val(v)); } - for (; i < Wosize_val(v); i++) { + mlsize_t scannable_wosize = Scannable_wosize_val(v); + for (; i < scannable_wosize; i++) { value f = Field(v, i); if (Is_block(f)) verify_push(st, f, Op_val(v)+i); } @@ -785,6 +830,501 @@ void caml_verify_heap(caml_domain_state *domain) { caml_stat_free(st); } +/* Compaction starts here. See [caml_compact_heap] for entry. */ + +/* Given a single value `v`, found at `p`, check if it points to an + evacuated block, and if so update it using the forwarding pointer + created by the compactor. */ +static inline void compact_update_value(void* ignored, + value v, + volatile value* p) +{ + if (Is_block(v)) { + CAMLassert(!Is_young(v)); + + tag_t tag = Tag_val(v); + + int infix_offset = 0; + if (tag == Infix_tag) { + infix_offset = Infix_offset_val(v); + /* v currently points to an Infix_tag inside of a Closure_tag. + The forwarding pointer we want is in the first field of the + Closure_tag. */ + v -= infix_offset; + CAMLassert(Tag_val(v) == Closure_tag); + } + + /* non-markable blocks can't move */ + if (Has_status_val(v, NOT_MARKABLE)) + return; + + if (Whsize_val(v) <= SIZECLASS_MAX) { + /* MARKED header status means the location `p` points to a block that + has been evacuated. Use the forwarding pointer in the first field + to update to the new location. */ + if (Has_status_val(v, caml_global_heap_state.MARKED)) { + value fwd = Field(v, 0) + infix_offset; + CAMLassert(Is_block(fwd)); + CAMLassert(Tag_val(fwd) == tag); + *p = fwd; + } + } + } +} + +/* Given a value found at `p` check if it points to an evacuated + block, and if so update it using the forwarding pointer created by + the compactor. */ +static inline void compact_update_value_at(volatile value* p) +{ + compact_update_value(NULL, *p, p); +} + +/* For each pointer in the block pointed to by `p`, check if it points + to an evacuated block and if so update it using the forwarding + pointer created by the compactor. */ +static void compact_update_block(header_t* p) +{ + header_t hd = Hd_hp(p); + + /* We should never be called with a block that has a zero header (this would + indicate a bug in traversing the shared pools). */ + CAMLassert(hd != 0); + + tag_t tag = Tag_hd(hd); + + /* We should never encounter an Infix tag iterating over the shared pools or + large allocations. We could find it in roots but those use + [compact_update_value]. */ + CAMLassert(tag != Infix_tag); + + if (tag == Cont_tag) { + value stk = Field(Val_hp(p), 0); + if (Ptr_val(stk)) { + caml_scan_stack(&compact_update_value, 0, NULL, Ptr_val(stk), 0, NULL); + } + } else { + uintnat offset = 0; + + if (tag == Closure_tag) { + offset = Start_env_closinfo(Closinfo_val(Val_hp(p))); + } + + if (tag < No_scan_tag) { + mlsize_t scannable_wosz = Scannable_wosize_hd(hd); + for (mlsize_t i = offset; i < scannable_wosz; i++) { + compact_update_value_at(&Field(Val_hp(p), i)); + } + } + } +} + +/* Update all the live blocks in a list of pools. */ + +static void compact_update_pools(pool *cur_pool) +{ + while (cur_pool) { + header_t* p = POOL_FIRST_BLOCK(cur_pool, cur_pool->sz); + header_t* end = POOL_END(cur_pool); + mlsize_t wh = wsize_sizeclass[cur_pool->sz]; + + while (p + wh <= end) { + if (*p && + Has_status_val(Val_hp(p), caml_global_heap_state.UNMARKED)) { + compact_update_block(p); + } + p += wh; + } + cur_pool = cur_pool->next; + } +} + +/* Update all the fields in the list of ephemerons found at `*ephe_p` */ + +static void compact_update_ephe_list(volatile value *ephe_p) +{ + while (*ephe_p) { + compact_update_value_at(ephe_p); + + value ephe = *ephe_p; + mlsize_t wosize = Wosize_val(ephe); + compact_update_value_at(&Field(ephe, CAML_EPHE_DATA_OFFSET)); + + for (int i = CAML_EPHE_FIRST_KEY ; i < wosize ; i++) { + compact_update_value_at(&Field(ephe, i)); + } + + ephe_p = &Field(ephe, CAML_EPHE_LINK_OFFSET); + } +} + +/* Compact the heap for the given domain. Run in parallel for all domains. */ + +void caml_compact_heap(caml_domain_state* domain_state, + int participating_count, + caml_domain_state** participants) +{ + caml_gc_log("Compacting heap start"); + CAML_EV_BEGIN(EV_COMPACT); + /* Warning: caml_compact_heap must only be called from + [cycle_all_domains_callback] in major_gc.c as there are + very specific conditions the compaction algorithm expects. + + The following code implements a compaction algorithm that is similar to + Edward's Two-Finger algorithm from the original 1974 LISP book (The + Programming Language LISP). At a high level the algorithm works as a series + of parallel (using all running domains) phases separated by global barriers: + + 1. For each size class + a. Compute the number of live blocks in partially filled pools + b. Keep enough pools to fully contain the number of live blocks and + set the rest to be evacuated + c. For each live block in each pool in the evacuation list, + allocate and copy into a non-evacuating pool. + 2. Proceed through the roots and the heap, updating pointers to evacuated + blocks to point to the new location of the block. Update finalisers and + ephemerons too. + 3. Go through pools evacuated and release them. Finally free all but + one pool in the freelist. + 4. One domain needs to release the pools in the freelist back to the OS. + + The algorithm requires one full pass through the whole heap (pools and large + allocations) to rewrite pointers, as well as two passes through the + partially-occupied pools in the heap to compute the number of live blocks + and evacuate them. + */ + + /* First phase. Here we compute the number of live blocks in partially + filled pools, determine pools to be evacuated and then evacuate from them. + For the first phase we need not consider full pools, they + cannot be evacuated to or from. */ + caml_global_barrier(); + CAML_EV_BEGIN(EV_COMPACT_EVACUATE); + + struct caml_heap_state* heap = Caml_state->shared_heap; + + #ifdef DEBUG + /* Check preconditions for the heap: */ + for (int sz_class = 1; sz_class < NUM_SIZECLASSES; sz_class++) { + /* No sweeping has happened yet */ + CAMLassert(heap->avail_pools[sz_class] == NULL); + CAMLassert(heap->full_pools[sz_class] == NULL); + CAMLassert(heap->swept_large == NULL); + /* No pools waiting for adoption */ + if (participants[0] == Caml_state) { + CAMLassert(pool_freelist.global_avail_pools[sz_class] == NULL); + CAMLassert(pool_freelist.global_full_pools[sz_class] == NULL); + } + /* The minor heap is empty */ + CAMLassert(Caml_state->young_ptr == Caml_state->young_end); + /* The mark stack is empty */ + CAMLassert(caml_mark_stack_is_empty()); + } + #endif + + /* All evacuated pools (of every size class) */ + pool *evacuated_pools = NULL; + + for (int sz_class = 1; sz_class < NUM_SIZECLASSES; sz_class++) { + /* We only care about moving things in pools that aren't full (we cannot + evacuate to or from a full pool) */ + pool* cur_pool = heap->unswept_avail_pools[sz_class]; + + if (!cur_pool) { + /* No partially filled pools for this size, nothing to do */ + continue; + } + + /* count the number of pools */ + int num_pools = 0; + + while (cur_pool) { + num_pools++; + cur_pool = cur_pool->next; + } + + struct compact_pool_stat* pool_stats = caml_stat_alloc_noexc( + sizeof(struct compact_pool_stat) * num_pools); + + /* if we're unable to allocate pool_stats here then we should avoid + evacuating this size class. It's unlikely but it may be that we had + better success with an earlier size class and that results in some + memory being freed up. */ + if( pool_stats == NULL ) { + caml_gc_log("Unable to allocate pool_stats for size class %d", sz_class); + + continue; + } + + cur_pool = heap->unswept_avail_pools[sz_class]; + + /* Count the number of free and live blocks in each pool. Note that a live + block here currently has the header status UNMARKED (because it was + MARKED in the previous cycle). After compaction the shared pools will + contain UNMARKED and GARBAGE from the "to" pools and UNMARKED from the + "from" pools which were evacuated. + + At the cost of some complexity or an additional pass we could compute the + exact amount of space needed or even sweep all pools in this counting + pass. + */ + int k = 0; + int total_live_blocks = 0; +#ifdef DEBUG + int total_free_blocks = 0; +#endif + while (cur_pool) { + header_t* p = POOL_FIRST_BLOCK(cur_pool, sz_class); + header_t* end = POOL_END(cur_pool); + mlsize_t wh = wsize_sizeclass[sz_class]; + + pool_stats[k].free_blocks = 0; + pool_stats[k].live_blocks = 0; + + while (p + wh <= end) { + header_t h = (header_t)atomic_load_relaxed((atomic_uintnat*)p); + + /* A zero header in a shared heap pool indicates an empty space */ + if (!h) { + pool_stats[k].free_blocks++; +#ifdef DEBUG + total_free_blocks++; +#endif + } else if (Has_status_hd(h, caml_global_heap_state.UNMARKED)) { + total_live_blocks++; + pool_stats[k].live_blocks++; + } + p += wh; + } + + cur_pool = cur_pool->next; + k++; + } + + /* Note that partially filled pools must have at least some free space*/ +#ifdef DEBUG + CAMLassert(total_free_blocks > 0); +#endif + + if (!total_live_blocks) { + /* No live (i.e unmarked) blocks in partially filled pools, nothing to do + for this size class */ + continue; + } + + /* Now we use the pool stats to calculate which pools will be evacuated. We + want to walk through the pools and check whether we have enough free + blocks in the pools behind us to accommodate all the remaining live + blocks. */ + int free_blocks = 0; + int j = 0; + int remaining_live_blocks = total_live_blocks; + + cur_pool = heap->unswept_avail_pools[sz_class]; + /* [last_pool_p] will be a pointer to the next field of the last + non-evacuating pool. We need this so we can snip the list of evacuating + pools from [unswept_avail_pools] and eventually attach them all to + [evacuated_pools]. */ + pool **last_pool_p = &heap->unswept_avail_pools[sz_class]; + while (cur_pool) { + if (free_blocks >= remaining_live_blocks) { + break; + } + + free_blocks += pool_stats[j].free_blocks; + remaining_live_blocks -= pool_stats[j].live_blocks; + last_pool_p = &cur_pool->next; + cur_pool = cur_pool->next; + j++; + } + + /* We're done with the pool stats. */ + caml_stat_free(pool_stats); + + /* `cur_pool` now points to the first pool we are evacuating, or NULL if + we could not compact this particular size class (for this domain) */ + + /* Snip the evacuating pools from list of pools we are retaining */ + *last_pool_p = NULL; + + /* Evacuate marked blocks from the evacuating pools into the + avail pools. */ + while (cur_pool) { + header_t* p = POOL_FIRST_BLOCK(cur_pool, sz_class); + header_t* end = POOL_END(cur_pool); + mlsize_t wh = wsize_sizeclass[sz_class]; + + while (p + wh <= end) { + header_t hd = (header_t)atomic_load_relaxed((atomic_uintnat*)p); + + /* A zero header in a shared heap pool indicates an empty space */ + if (hd) { + CAMLassert (!Has_status_hd(hd, caml_global_heap_state.MARKED)); + CAMLassert (!Has_status_hd(hd, NOT_MARKABLE)); + + /* Reminder: since colours have rotated, UNMARKED indicates a MARKED + (i.e live) block */ + if (Has_status_hd(hd, caml_global_heap_state.UNMARKED)) { + /* live block in an evacuating pool, so we evacuate it to + * the first available block */ + pool* to_pool = heap->unswept_avail_pools[sz_class]; + value* new_p = to_pool->next_obj; + CAMLassert(new_p); + value *next = (value*)new_p[1]; + to_pool->next_obj = next; + + if (!next) { + /* This pool is full. Move it to unswept_full_pools */ + heap->unswept_avail_pools[sz_class] = to_pool->next; + to_pool->next = heap->unswept_full_pools[sz_class]; + heap->unswept_full_pools[sz_class] = to_pool; + } + + /* Copy the block to the new location */ + memcpy(new_p, p, Whsize_hd(hd) * sizeof(value)); + + /* Set first field of p to a forwarding pointer */ + Field(Val_hp(p), 0) = Val_hp(new_p); + + /* Since there can be no blocks with the MARKED status, we use this + to indicate that a block has been evacuated and any pointers to + it should be updated. */ + *p = With_status_hd(hd, caml_global_heap_state.MARKED); + } else if (Has_status_hd(hd, caml_global_heap_state.GARBAGE)) { + /* We are implicitly sweeping pools in the evacuation set and thus + we must remember to call finalisers for Custom blocks that would + have been swept in a subsequent major cycle. */ + if (Tag_hd (hd) == Custom_tag) { + void (*final_fun)(value) = Custom_ops_val(Val_hp(p))->finalize; + if (final_fun) final_fun(Val_hp(p)); + } + + /* In the DEBUG runtime, we should overwrite the fields of swept + blocks. Note: this pool can't be allocated in to again and so + we overwrite the header and first fields too. */ + #ifdef DEBUG + for (int w = 0 ; w < wh ; w++) { + Field(p, w) = Debug_free_major; + } + #endif + } + } + + p += wh; + } + /* move pool to evacuated pools list, continue to next pool */ + pool *next = cur_pool->next; + cur_pool->next = evacuated_pools; + evacuated_pools = cur_pool; + cur_pool = next; + } + } + + CAML_EV_END(EV_COMPACT_EVACUATE); + caml_global_barrier(); + CAML_EV_BEGIN(EV_COMPACT_FORWARD); + + /* Second phase: at this point all live blocks in evacuated pools + have been moved and their old locations' first fields now point to + their new locations. We now go through all pools again (including + full ones this time) and for each field we check if the block the + field points to has the header status MARKED - if it does then the block + has been evacuated and we need to update the field to point to the new + location. We do this by using the forwarding pointer that is in the first + field of the evacuated block. */ + + /* First we do roots (locals and finalisers) */ + caml_do_roots(&compact_update_value, 0, NULL, Caml_state, 1); + + /* Memprof roots and "weak" pointers to tracked blocks */ + caml_memprof_scan_roots(&compact_update_value, 0, NULL, + Caml_state, true, participants[0] == Caml_state); + + /* Next, one domain does the global roots */ + if (participants[0] == Caml_state) { + caml_scan_global_roots(&compact_update_value, NULL); + } + + /* Shared heap pools. */ + for (int sz_class = 1; sz_class < NUM_SIZECLASSES; sz_class++) { + compact_update_pools(heap->unswept_avail_pools[sz_class]); + compact_update_pools(heap->unswept_full_pools[sz_class]); + } + + /* Large allocations */ + for (large_alloc* la = heap->unswept_large; la != NULL; la = la->next) { + header_t* p = (header_t*)((char*)la + LARGE_ALLOC_HEADER_SZ); + if (Has_status_val(Val_hp(p), caml_global_heap_state.UNMARKED)) { + compact_update_block(p); + } + } + + /* Ephemerons */ + struct caml_ephe_info* ephe_info = Caml_state->ephe_info; + compact_update_ephe_list(&ephe_info->todo); + compact_update_ephe_list(&ephe_info->live); + + CAML_EV_END(EV_COMPACT_FORWARD); + caml_global_barrier(); + CAML_EV_BEGIN(EV_COMPACT_RELEASE); + + /* Third phase: free all evacuated pools and release the mappings back to + the OS. + + Note that we may have no "available" pools left, if all + remaining pools have been filled up by evacuated blocks. */ + + pool* cur_pool = evacuated_pools; + uintnat freed_pools = 0; + while (cur_pool) { + pool* next_pool = cur_pool->next; + + #ifdef DEBUG + for (header_t *p = POOL_FIRST_BLOCK(cur_pool, cur_pool->sz); + p < POOL_END(cur_pool); p++) { + *p = Debug_free_major; + } + #endif + + pool_free(heap, cur_pool, cur_pool->sz); + cur_pool = next_pool; + freed_pools++; + } + caml_plat_lock(&pool_freelist.lock); + pool_freelist.active_pools -= freed_pools; + caml_plat_unlock(&pool_freelist.lock); + + CAML_EV_END(EV_COMPACT_RELEASE); + caml_global_barrier(); + + /* Fourth phase: one domain also needs to release the free list */ + if( participants[0] == Caml_state ) { + pool* cur_pool; + pool* next_pool; + + caml_plat_lock(&pool_freelist.lock); + cur_pool = pool_freelist.free; + + while( cur_pool ) { + next_pool = cur_pool->next; + /* No stats to update so just unmap */ + caml_mem_unmap(cur_pool, Bsize_wsize(POOL_WSIZE)); + cur_pool = next_pool; + } + + pool_freelist.free = NULL; + + caml_plat_unlock(&pool_freelist.lock); + + /* We are done, increment our compaction count */ + atomic_fetch_add(&caml_compactions_count, 1); + } + + caml_gc_log("Compacting heap complete"); + CAML_EV_END(EV_COMPACT); +} + +/* Compaction end */ struct mem_stats { /* unit is words */ @@ -803,10 +1343,10 @@ static void verify_pool(pool* a, sizeclass sz, struct mem_stats* s) { } { - value* p = (value*)((char*)a + POOL_HEADER_SZ); - value* end = (value*)a + POOL_WSIZE; + header_t* p = POOL_FIRST_BLOCK(a, sz); + header_t* end = POOL_END(a); mlsize_t wh = wsize_sizeclass[sz]; - s->overhead += Wsize_bsize(POOL_HEADER_SZ); + s->overhead += POOL_SLAB_WOFFSET(sz); while (p + wh <= end) { header_t hd = (header_t)*p; @@ -820,8 +1360,7 @@ static void verify_pool(pool* a, sizeclass sz, struct mem_stats* s) { } p += wh; } - CAMLassert(end - p == wastage_sizeclass[sz]); - s->overhead += end - p; + CAMLassert(end == p); s->alloced += POOL_WSIZE; } } diff --git a/runtime/signals.c b/runtime/signals.c index cae41693bd5..8c785b9849e 100644 --- a/runtime/signals.c +++ b/runtime/signals.c @@ -34,6 +34,7 @@ #include "caml/sys.h" #include "caml/memprof.h" #include "caml/finalise.h" +#include "caml/printexc.h" /* The set of pending signals (received but not yet processed). It is represented as a bit vector. @@ -106,12 +107,8 @@ CAMLexport value caml_process_pending_signals_exn(void) } /* Record the delivery of a signal, and arrange for it to be processed - as soon as possible: - - via Caml_state->action_pending, processed in - caml_process_pending_actions. - - by playing with the allocation limit, processed in - caml_alloc_small_dispatch. -*/ + as soon as possible, by playing with the allocation limit, + processed in caml_alloc_small_dispatch. */ CAMLexport void caml_record_signal(int signal_number) { unsigned int i; @@ -119,8 +116,28 @@ CAMLexport void caml_record_signal(int signal_number) i = signal_number - 1; atomic_fetch_or(&caml_pending_signals[i / BITS_PER_WORD], (uintnat)1 << (i % BITS_PER_WORD)); - // FIXME: the TLS variable is not thread-safe - caml_interrupt_self(); + /* We interrupt all domains when a signal arrives. Signals (SIGINT, + SIGALRM...) arrive infrequently-enough that this is affordable. + This is a strategy that makes as little assumptions as possible + about signal-safety, threads, and domains. + + * In mixed C/OCaml applications there is no guarantee that the + POSIX signal handler runs in an OCaml thread, so Caml_state might + be unavailable. + + * While C11 mandates that atomic thread-local variables are + async-signal-safe for reading, gcc does not conform and can + allocate in corner cases involving dynamic linking. It is also + unclear whether the OSX implementation conforms, but this might + be a theoretical concern only. + + * The thread executing a POSIX signal handler is not necessarily + the most ready to execute the corresponding OCaml signal handler. + Examples: + - Ctrl-C in the toplevel when domain 0 is stuck inside [Domain.join]. + - a thread that has just spawned, before the appropriate mask is set. + */ + caml_interrupt_all_for_signal(); } /* Management of blocking sections. */ @@ -146,6 +163,8 @@ CAMLexport void caml_enter_blocking_section(void) { caml_domain_state * domain = Caml_state; while (1){ + if (Caml_state->in_minor_collection) + caml_fatal_error("caml_enter_blocking_section from inside minor GC"); /* Process all pending signals now */ caml_process_pending_actions(); caml_enter_blocking_section_hook (); @@ -201,6 +220,36 @@ void caml_init_signal_handling(void) { caml_register_generational_global_root(&caml_signal_handlers); } +static void check_async_exn(value res, const char *msg) +{ + value exn; + const value *break_exn; + + if (!Is_exception_result(res)) + return; + + exn = Extract_exception(res); + + /* [Break] is not introduced as a predefined exception (in predef.ml and + stdlib.ml) since it causes trouble in conjunction with warnings about + constructor shadowing e.g. in format.ml. + "Sys.Break" must match stdlib/sys.mlp. */ + break_exn = caml_named_value("Sys.Break"); + if (break_exn != NULL && exn == *break_exn) + return; + + caml_fatal_uncaught_exception_with_message(exn, msg); +} + +value caml_raise_async_if_exception(value res, const char* where) +{ + if (Is_exception_result(res)) { + check_async_exn(res, where); + caml_raise_async(Extract_exception(res)); + } + return res; +} + /* Execute a signal handler immediately */ value caml_execute_signal_exn(int signal_number, int in_signal_handler) @@ -270,7 +319,7 @@ void caml_request_minor_gc (void) [Caml_state->action_pending] is 1, or there is a function currently running which is executing all actions. - This is used to ensure [Caml_state->young_limit] is always set + This is used to ensure that [Caml_state->young_limit] is always set appropriately. In case there are two different callbacks (say, a signal and a @@ -283,9 +332,7 @@ void caml_request_minor_gc (void) calling them first. */ -CAMLno_tsan /* When called from [caml_record_signal], these memory - accesses may not be synchronized. Otherwise we assume - that we have unique access to dom_st. */ +/* We assume that we have unique access to dom_st. */ void caml_set_action_pending(caml_domain_state * dom_st) { dom_st->action_pending = 1; @@ -312,16 +359,17 @@ value caml_do_pending_actions_exn(void) /* Call signal handlers first */ value exn = caml_process_pending_signals_exn(); + check_async_exn(exn, "signal handler"); if (Is_exception_result(exn)) goto exception; -#if 0 /* Call memprof callbacks */ - exn = caml_memprof_handle_postponed_exn(); + exn = caml_memprof_run_callbacks_exn(); + check_async_exn(exn, "memprof callback"); if (Is_exception_result(exn)) goto exception; -#endif /* Call finalisers */ exn = caml_final_do_calls_exn(); + check_async_exn(exn, "finaliser"); if (Is_exception_result(exn)) goto exception; return Val_unit; @@ -348,8 +396,9 @@ value caml_process_pending_actions_with_root_exn(value root) value caml_process_pending_actions_with_root(value root) { - return caml_raise_if_exception( - caml_process_pending_actions_with_root_exn(root)); + return caml_raise_async_if_exception( + caml_process_pending_actions_with_root_exn(root), + ""); } CAMLexport value caml_process_pending_actions_exn(void) @@ -670,6 +719,6 @@ CAMLprim value caml_install_signal_handler(value signal_number, value action) caml_modify(&Field(caml_signal_handlers, sig), Field(action, 0)); caml_plat_unlock(&signal_install_mutex); } - caml_raise_if_exception(caml_process_pending_signals_exn()); + (void) caml_raise_async_if_exception(caml_process_pending_signals_exn(), ""); CAMLreturn (res); } diff --git a/runtime/signals_nat.c b/runtime/signals_nat.c index 69e9eb1f4ff..06cb253059b 100644 --- a/runtime/signals_nat.c +++ b/runtime/signals_nat.c @@ -15,6 +15,10 @@ #define CAML_INTERNALS +#include +#define __USE_GNU +#include + /* Signal handling, code specific to the native-code compiler */ #include @@ -62,7 +66,7 @@ void caml_garbage_collection(void) { /* Compute the total allocation size at this point, including allocations combined by Comballoc */ - unsigned char* alloc_len = (unsigned char*)(&d->live_ofs[d->num_live]); + unsigned char* alloc_len = frame_end_of_live_ofs(d); int i, nallocs = *alloc_len++; intnat allocsz = 0; @@ -85,3 +89,53 @@ void caml_garbage_collection(void) nallocs, alloc_len); } } + +#if defined(NATIVE_CODE) && !defined(STACK_CHECKS_ENABLED) + +#if !defined(POSIX_SIGNALS) +#error "stack checks cannot be disabled if POSIX signals are not available" +#endif + +#define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, ucontext_t * context) + +#define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ + sigact.sa_flags = SA_SIGINFO + +CAMLextern void caml_raise_stack_overflow_nat(void); + +DECLARE_SIGNAL_HANDLER(segv_handler) +{ + struct sigaction act; + struct stack_info *block = Caml_state->current_stack; + char* fault_addr = info->si_addr; + int page_size = getpagesize(); + char* protected_low = Protected_stack_page(block, page_size); + char* protected_high = protected_low + page_size; + if ((fault_addr >= protected_low) && (fault_addr < protected_high)) { + context->uc_mcontext.gregs[REG_RIP]= (greg_t) &caml_raise_stack_overflow_nat; + } else { + act.sa_handler = SIG_DFL; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); + sigaction(SIGSEGV, &act, NULL); + } +} + +void caml_init_nat_signals(void) +{ + struct sigaction act; + SET_SIGACT(act, segv_handler); + act.sa_flags |= SA_ONSTACK | SA_NODEFER; + sigemptyset(&act.sa_mask); + sigaction(SIGSEGV, &act, NULL); +} + +#else + +void caml_init_nat_signals(void) +{ +} + +#endif diff --git a/runtime/simd.c b/runtime/simd.c new file mode 100644 index 00000000000..a83c5a76f69 --- /dev/null +++ b/runtime/simd.c @@ -0,0 +1,40 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Max Slater, Jane Street */ +/* */ +/* Copyright 2023 Jane Street Group LLC */ +/* */ +/* 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. */ +/* */ +/**************************************************************************/ + +#define CAML_INTERNALS + +#include "caml/alloc.h" +#include "caml/simd.h" + +#ifdef ARCH_SSE2 + +CAMLexport value caml_copy_vec128(__m128 v) { + value res = caml_alloc_small(2, Abstract_tag); + Store_vec128_val(res, v); + return res; +} + +CAMLexport value caml_copy_vec128i(__m128i v) { + value res = caml_alloc_small(2, Abstract_tag); + Store_vec128_vali(res, v); + return res; +} + +CAMLexport value caml_copy_vec128d(__m128d v) { + value res = caml_alloc_small(2, Abstract_tag); + Store_vec128_vald(res, v); + return res; +} + +#endif diff --git a/runtime/startup_aux.c b/runtime/startup_aux.c index dc659f407f4..8d548f28345 100644 --- a/runtime/startup_aux.c +++ b/runtime/startup_aux.c @@ -1,3 +1,5 @@ +/* CR mshinwell: Reverted to 5.x version, need to check conflicts */ + /**************************************************************************/ /* */ /* OCaml */ @@ -31,6 +33,8 @@ #include "caml/prims.h" #include "caml/signals.h" +#include + #ifdef _WIN32 extern void caml_win32_unregister_overflow_detection (void); #endif @@ -46,16 +50,36 @@ static void init_startup_params(void) char_os * cds_file; #endif + uintnat init_main_stack_wsz; + struct rlimit rlimit; + if (getrlimit(RLIMIT_STACK, &rlimit)) { + // default value, retrieved from a recent system (May 2024) + init_main_stack_wsz = Wsize_bsize(8192 * 1024); + } else { + if (rlimit.rlim_cur == RLIM_INFINITY) { + init_main_stack_wsz = Max_stack_def; + } else { + init_main_stack_wsz = Wsize_bsize(rlimit.rlim_cur); + } + } + if (init_main_stack_wsz > Max_stack_def) { + init_main_stack_wsz = Max_stack_def; + } + params.init_percent_free = Percent_free_def; params.init_minor_heap_wsz = Minor_heap_def; params.init_custom_major_ratio = Custom_major_ratio_def; params.init_custom_minor_ratio = Custom_minor_ratio_def; params.init_custom_minor_max_bsz = Custom_minor_max_bsz_def; + params.init_main_stack_wsz = init_main_stack_wsz; + params.init_thread_stack_wsz = 0; params.init_max_stack_wsz = Max_stack_def; params.runtime_events_log_wsize = Default_runtime_events_log_wsize; #ifdef DEBUG - atomic_store_relaxed(&caml_verb_gc, 0x3F); + // Silenced in flambda-backend to make it easier to run tests that + // check program output. + // atomic_store_relaxed(&caml_verb_gc, 0x3F); #endif #ifndef NATIVE_CODE cds_file = caml_secure_getenv(T("CAML_DEBUG_FILE")); @@ -95,57 +119,17 @@ void caml_parse_ocamlrunparam(void) if (opt != NULL){ while (*opt != '\0'){ switch (*opt++){ -<<<<<<< HEAD - case 'a': scanmult (opt, &caml_init_policy); break; - case 'b': scanmult (opt, &p); caml_record_backtraces(p); break; - case 'c': scanmult (opt, &p); caml_cleanup_on_exit = (p != 0); break; - case 'h': scanmult (opt, &caml_init_heap_wsz); break; - case 'H': scanmult (opt, &caml_use_huge_pages); break; - case 'i': scanmult (opt, &caml_init_heap_chunk_sz); break; - case 'l': scanmult (opt, &caml_init_max_stack_wsz); break; - case 'M': scanmult (opt, &caml_init_custom_major_ratio); break; - case 'm': scanmult (opt, &caml_init_custom_minor_ratio); break; - case 'n': scanmult (opt, &caml_init_custom_minor_max_bsz); break; - case 'o': scanmult (opt, &caml_init_percent_free); break; - case 'O': scanmult (opt, &caml_init_max_percent_free); break; - case 'p': scanmult (opt, &p); caml_parser_trace = (p != 0); break; -||||||| merged common ancestors -<<<<<<<<< Temporary merge branch 1 - case 'a': scanmult (opt, &p); caml_set_allocation_policy ((intnat) p); - break; - case 'b': scanmult (opt, &p); caml_record_backtrace(Val_int (p)); - break; -||||||||| 24dbb0976a - case 'a': scanmult (opt, &p); caml_set_allocation_policy ((intnat) p); - break; - case 'b': scanmult (opt, &p); caml_record_backtrace(Val_bool (p)); - break; -========= - case 'a': scanmult (opt, &caml_init_policy); break; - case 'b': scanmult (opt, &p); caml_record_backtraces(p); break; ->>>>>>>>> Temporary merge branch 2 - case 'c': scanmult (opt, &p); caml_cleanup_on_exit = (p != 0); break; - case 'h': scanmult (opt, &caml_init_heap_wsz); break; - case 'H': scanmult (opt, &caml_use_huge_pages); break; - case 'i': scanmult (opt, &caml_init_heap_chunk_sz); break; - case 'l': scanmult (opt, &caml_init_max_stack_wsz); break; - case 'M': scanmult (opt, &caml_init_custom_major_ratio); break; - case 'm': scanmult (opt, &caml_init_custom_minor_ratio); break; - case 'n': scanmult (opt, &caml_init_custom_minor_max_bsz); break; - case 'o': scanmult (opt, &caml_init_percent_free); break; - case 'O': scanmult (opt, &caml_init_max_percent_free); break; - case 'p': scanmult (opt, &p); caml_parser_trace = (p != 0); break; -======= case 'b': scanmult (opt, ¶ms.backtrace_enabled); break; case 'c': scanmult (opt, ¶ms.cleanup_on_exit); break; case 'e': scanmult (opt, ¶ms.runtime_events_log_wsize); break; + case 'i': scanmult (opt, ¶ms.init_main_stack_wsz); break; + case 'j': scanmult (opt, ¶ms.init_thread_stack_wsz); break; case 'l': scanmult (opt, ¶ms.init_max_stack_wsz); break; case 'M': scanmult (opt, ¶ms.init_custom_major_ratio); break; case 'm': scanmult (opt, ¶ms.init_custom_minor_ratio); break; case 'n': scanmult (opt, ¶ms.init_custom_minor_max_bsz); break; case 'o': scanmult (opt, ¶ms.init_percent_free); break; case 'p': scanmult (opt, ¶ms.parser_trace); break; ->>>>>>> ocaml/5.1 case 'R': break; /* see stdlib/hashtbl.mli */ case 's': scanmult (opt, ¶ms.init_minor_heap_wsz); break; case 't': scanmult (opt, ¶ms.trace_level); break; diff --git a/runtime/startup_byt.c b/runtime/startup_byt.c index 3cb74f27d2c..23bedd1c07a 100644 --- a/runtime/startup_byt.c +++ b/runtime/startup_byt.c @@ -468,7 +468,9 @@ CAMLexport void caml_main(char_os **argv) caml_parse_ocamlrunparam(); #ifdef DEBUG - caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); + // Silenced in flambda-backend to make it easier to run tests that + // check program output. + // caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); #endif if (!caml_startup_aux(/* pooling */ caml_params->cleanup_on_exit)) return; @@ -609,7 +611,9 @@ CAMLexport value caml_startup_code_exn( caml_parse_ocamlrunparam(); #ifdef DEBUG - caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); + // Silenced in flambda-backend to make it easier to run tests that + // check program output. + // caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); #endif if (caml_params->cleanup_on_exit) pooling = 1; diff --git a/runtime/startup_nat.c b/runtime/startup_nat.c index 38fd4a80016..5df2d22da94 100644 --- a/runtime/startup_nat.c +++ b/runtime/startup_nat.c @@ -94,7 +94,9 @@ value caml_startup_common(char_os **argv, int pooling) caml_parse_ocamlrunparam(); #ifdef DEBUG - caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); + // Silenced in flambda-backend to make it easier to run tests that + // check program output. + // caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); #endif if (caml_params->cleanup_on_exit) pooling = 1; @@ -116,6 +118,7 @@ value caml_startup_common(char_os **argv, int pooling) init_segments(); caml_init_signals(); + caml_init_nat_signals(); #ifdef _WIN32 caml_win32_overflow_detection(); #endif @@ -130,6 +133,9 @@ value caml_startup_common(char_os **argv, int pooling) caml_sys_init(exe_name, argv); caml_maybe_expand_stack(); res = caml_start_program(Caml_state); + /* ignore distinction between async and normal, + it's an uncaught exception either way */ + Caml_state->raising_async_exn = 0; caml_terminate_signals(); return res; } diff --git a/runtime/str.c b/runtime/str.c index 32ca54c7a58..59b41b3bc70 100644 --- a/runtime/str.c +++ b/runtime/str.c @@ -78,6 +78,14 @@ CAMLprim value caml_create_bytes(value len) return caml_alloc_string(size); } +CAMLprim value caml_create_local_bytes(value len) +{ + mlsize_t size = Long_val(len); + if (size > Bsize_wsize (Max_wosize) - 1){ + caml_invalid_argument("Bytes.create"); + } + return caml_alloc_local_string(size); +} CAMLprim value caml_string_get(value str, value index) @@ -403,7 +411,9 @@ CAMLexport value caml_alloc_sprintf(const char * format, ...) excluding the terminating '\0'. */ n = vsnprintf(buf, sizeof(buf), format, args); va_end(args); - if (n < sizeof(buf)) { + if (n < 0) { + caml_raise_out_of_memory(); + } else if (n < sizeof(buf)) { /* All output characters were written to buf, including the terminating '\0'. Allocate a Caml string with length "n" as computed by vsnprintf, and copy the output of vsnprintf into it. */ diff --git a/runtime/sync_posix.h b/runtime/sync_posix.h index 52969d88bb4..558f7a94e09 100644 --- a/runtime/sync_posix.h +++ b/runtime/sync_posix.h @@ -23,6 +23,14 @@ #include #include +#ifdef __linux__ +#include +#include +#include +#include +#include +#endif + typedef int sync_retcode; /* Mutexes */ @@ -82,6 +90,80 @@ Caml_inline int sync_mutex_unlock(sync_mutex m) return pthread_mutex_unlock(m); } +/* If we're using glibc, use a custom condition variable implementation to + avoid this bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25847 + + For now we only have this on linux because it directly uses the linux futex + syscalls. */ +#if defined(__linux__) && defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) +static int custom_condvar_init(custom_condvar * cv) +{ + cv->counter = 0; + return 0; +} + +static int custom_condvar_destroy(custom_condvar * cv) +{ + return 0; +} + +static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) +{ + unsigned old_count = cv->counter; + pthread_mutex_unlock(mutex); + syscall(SYS_futex, &cv->counter, FUTEX_WAIT_PRIVATE, old_count, NULL, NULL, 0); + pthread_mutex_lock(mutex); + return 0; +} + +static int custom_condvar_signal(custom_condvar * cv) +{ + __sync_add_and_fetch(&cv->counter, 1); + syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, 1, NULL, NULL, 0); + return 0; +} + +static int custom_condvar_broadcast(custom_condvar * cv) +{ + __sync_add_and_fetch(&cv->counter, 1); + syscall(SYS_futex, &cv->counter, FUTEX_WAKE_PRIVATE, INT_MAX, NULL, NULL, 0); + return 0; +} +#else +static int custom_condvar_init(custom_condvar * cv) +{ + pthread_condattr_t attr; + pthread_condattr_init(&attr); +#if defined(_POSIX_TIMERS) && \ + defined(_POSIX_MONOTONIC_CLOCK) && \ + _POSIX_MONOTONIC_CLOCK != (-1) + pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); +#endif + return pthread_cond_init(cv, &attr); +} + +static int custom_condvar_destroy(custom_condvar * cv) +{ + return pthread_cond_destroy(cv); +} + +static int custom_condvar_wait(custom_condvar * cv, pthread_mutex_t * mutex) +{ + return pthread_cond_wait(cv, mutex); +} + +static int custom_condvar_signal(custom_condvar * cv) +{ + return pthread_cond_signal(cv); +} + +static int custom_condvar_broadcast(custom_condvar * cv) +{ + return pthread_cond_broadcast(cv); +} +#endif + + /* Condition variables */ typedef custom_condvar * sync_condvar; @@ -102,29 +184,29 @@ Caml_inline int sync_condvar_create(sync_condvar * res) Caml_inline int sync_condvar_destroy(sync_condvar c) { int rc; - rc = custom_cond_destroy(c); + rc = custom_condvar_destroy(c); caml_stat_free(c); return rc; } Caml_inline int sync_condvar_signal(sync_condvar c) { - return custom_cond_signal(c); + return custom_condvar_signal(c); } Caml_inline int sync_condvar_broadcast(sync_condvar c) { - return custom_cond_broadcast(c); + return custom_condvar_broadcast(c); } Caml_inline int sync_condvar_wait(sync_condvar c, sync_mutex m) { - return custom_cond_wait(c, m); + return custom_condvar_wait(c, m); } /* Reporting errors */ -static void sync_check_error(int retcode, char * msg) +Caml_inline void sync_check_error(int retcode, char * msg) { char * err; char buf[1024]; diff --git a/runtime/sys.c b/runtime/sys.c index 26c7246b00c..cb630f61118 100644 --- a/runtime/sys.c +++ b/runtime/sys.c @@ -700,6 +700,12 @@ CAMLprim value caml_sys_const_backend_type(value unit) { return Val_int(1); /* Bytecode backed */ } + +CAMLprim value caml_sys_const_runtime5(value unit) +{ + return Val_true; +} + CAMLprim value caml_sys_get_config(value unit) { CAMLparam0 (); /* unit is unused */ @@ -758,3 +764,8 @@ CAMLprim value caml_sys_isatty(value chan) return ret; } + +CAMLprim value caml_sys_const_naked_pointers_checked(value unit) +{ + return Val_false; +} diff --git a/runtime/unix.c b/runtime/unix.c index 0877ec37a0f..0e17a4a0969 100644 --- a/runtime/unix.c +++ b/runtime/unix.c @@ -43,9 +43,8 @@ #ifdef HAS_UNISTD #include #endif -#ifdef HAS_POSIX_MONOTONIC_CLOCK #include -#elif HAS_MACH_ABSOLUTE_TIME +#ifdef HAS_MACH_ABSOLUTE_TIME #include #endif #ifdef HAS_DIRENT @@ -476,6 +475,35 @@ int caml_num_rows_fd(int fd) #endif } +void caml_print_timestamp(FILE* channel, int formatted) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + if (!formatted) { + fprintf(channel, "%ld.%06d ", (long)tv.tv_sec, (int)tv.tv_usec); + } else { + struct tm tm; + char tz[64] = "Z"; + localtime_r(&tv.tv_sec, &tm); + if (tm.tm_gmtoff != 0) { + long tzhour = tm.tm_gmtoff / 60 / 60; + long tzmin = (tm.tm_gmtoff / 60) % 60; + if (tzmin < 0) {tzmin += 60; tzhour--;} + sprintf(tz, "%+03ld:%02ld", tzhour, tzmin); + } + fprintf(channel, + "[%04d-%02d-%02d %02d:%02d:%02d.%06d%s] ", + 1900 + tm.tm_year, + tm.tm_mon + 1, + tm.tm_mday, + tm.tm_hour, + tm.tm_min, + tm.tm_sec, + (int)tv.tv_usec, + tz); + } +} + void caml_init_os_params(void) { caml_plat_mmap_alignment = caml_plat_pagesize = sysconf(_SC_PAGESIZE); @@ -484,23 +512,9 @@ void caml_init_os_params(void) #ifndef __CYGWIN__ -/* Standard Unix implementation: reserve with mmap (and trim to alignment) with - commit done using mmap as well. */ - -Caml_inline void safe_munmap(uintnat addr, uintnat size) +void *caml_plat_mem_map(uintnat size, int reserve_only) { - if (size > 0) { - caml_gc_message(0x1000, "munmap %" ARCH_INTNAT_PRINTF_FORMAT "d" - " bytes at %" ARCH_INTNAT_PRINTF_FORMAT "x" - " for heaps\n", size, addr); - munmap((void*)addr, size); - } -} - -void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) -{ - uintnat alloc_sz = size + alignment; - uintnat base, aligned_start, aligned_end; + uintnat alloc_sz = size; void* mem; mem = mmap(0, alloc_sz, reserve_only ? PROT_NONE : (PROT_READ | PROT_WRITE), @@ -508,14 +522,6 @@ void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) if (mem == MAP_FAILED) return 0; - /* trim to an aligned region */ - base = (uintnat)mem; - aligned_start = (base + alignment - 1) & ~(alignment - 1); - aligned_end = aligned_start + size; - safe_munmap(base, aligned_start - base); - safe_munmap(aligned_end, (base + alloc_sz) - aligned_end); - mem = (void*)aligned_start; - return mem; } @@ -537,13 +543,10 @@ static void* map_fixed(void* mem, uintnat size, int prot) done using mprotect, since Cygwin's mmap doesn't implement the required functions for committing using mmap. */ -void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) +void *caml_plat_mem_map(uintnat size, int reserve_only) { void* mem; - if (alignment > caml_plat_mmap_alignment) - caml_fatal_error("Cannot align memory to %lx on this platform", alignment); - mem = mmap(0, size, reserve_only ? PROT_NONE : (PROT_READ | PROT_WRITE), MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mem == MAP_FAILED) diff --git a/runtime/weak.c b/runtime/weak.c index be5663bc4e8..9b313c5b4ed 100644 --- a/runtime/weak.c +++ b/runtime/weak.c @@ -1,3 +1,5 @@ +/* CR mshinwell: Reverted to 5.x version, need to check conflicts */ + /**************************************************************************/ /* */ /* OCaml */ @@ -43,118 +45,8 @@ struct caml_ephe_info* caml_alloc_ephe_info (void) return e; } -<<<<<<< HEAD -/* The minor heap is considered alive. Outside minor and major heap it is - considered alive (out of reach of the GC). */ -Caml_inline int Test_if_its_white(value x){ - CAMLassert (x != caml_ephe_none); -#ifdef NO_NAKED_POINTERS - if (!Is_block(x) || Is_young (x)) return 0; -#else - if (!Is_block(x) || !Is_in_heap(x)) return 0; -#endif - if (Tag_val(x) == Infix_tag) x -= Infix_offset_val(x); - return Is_white_val(x); -} - -/* If it is not white during clean phase it is dead, i.e it will be swept */ -Caml_inline int Is_Dead_during_clean(value x) -{ - CAMLassert (caml_gc_phase == Phase_clean); - return Test_if_its_white(x); -} - -/** caml_ephe_none is considered as not white */ -Caml_inline int Is_White_During_Mark(value x) -{ - CAMLassert (caml_gc_phase == Phase_mark); - if (x == caml_ephe_none ) return 0; - return Test_if_its_white(x); -} - -/** The minor heap doesn't have to be marked, outside they should - already be black. Remains the value in the heap to mark. -*/ -Caml_inline int Must_be_Marked_during_mark(value x) -{ - CAMLassert (x != caml_ephe_none); - CAMLassert (caml_gc_phase == Phase_mark); -#ifdef NO_NAKED_POINTERS - return Is_block (x) && !Is_young (x); -#else - return Is_block (x) && Is_in_heap (x); -#endif -} - -/* [len] is a number of words (fields) */ -CAMLexport value caml_ephemeron_create (mlsize_t len) -||||||| merged common ancestors -/* The minor heap is considered alive. Outside minor and major heap it is - considered alive (out of reach of the GC). */ -Caml_inline int Test_if_its_white(value x){ - CAMLassert (x != caml_ephe_none); -#ifdef NO_NAKED_POINTERS - if (!Is_block(x) || Is_young (x)) return 0; -#else - if (!Is_block(x) || !Is_in_heap(x)) return 0; -#endif - if (Tag_val(x) == Infix_tag) x -= Infix_offset_val(x); - return Is_white_val(x); -} - -/* If it is not white during clean phase it is dead, i.e it will be swept */ -Caml_inline int Is_Dead_during_clean(value x) -{ - CAMLassert (caml_gc_phase == Phase_clean); -<<<<<<<<< Temporary merge branch 1 -#ifdef NO_NAKED_POINTERS - if (!Is_block(x) || Is_young (x)) return 0; -#else - if (!Is_block(x) || !Is_in_heap(x)) return 0; -#endif - if (Tag_val(x) == Infix_tag) x -= Infix_offset_val(x); - return Is_white_val(x); -||||||||| 24dbb0976a - if (!Is_block(x)) return 0; - if (Tag_val(x) == Infix_tag) x -= Infix_offset_val(x); -#ifdef NO_NAKED_POINTERS - return Is_white_val(x) && !Is_young (x); -#else - return Is_white_val(x) && Is_in_heap (x); -#endif -========= - return Test_if_its_white(x); ->>>>>>>>> Temporary merge branch 2 -} - -/** caml_ephe_none is considered as not white */ -Caml_inline int Is_White_During_Mark(value x) -{ - CAMLassert (caml_gc_phase == Phase_mark); - if (x == caml_ephe_none ) return 0; - return Test_if_its_white(x); -} - -/** The minor heap doesn't have to be marked, outside they should - already be black. Remains the value in the heap to mark. -*/ -Caml_inline int Must_be_Marked_during_mark(value x) -{ - CAMLassert (x != caml_ephe_none); - CAMLassert (caml_gc_phase == Phase_mark); -#ifdef NO_NAKED_POINTERS - return Is_block (x) && !Is_young (x); -#else - return Is_block (x) && Is_in_heap (x); -#endif -} - -/* [len] is a number of words (fields) */ -CAMLexport value caml_ephemeron_create (mlsize_t len) -======= /* [len] is a value that represents a number of words (fields) */ CAMLprim value caml_ephe_create (value len) ->>>>>>> ocaml/5.1 { mlsize_t size, i; value res; @@ -167,8 +59,16 @@ CAMLprim value caml_ephe_create (value len) caml_invalid_argument ("Weak.create"); res = caml_alloc_shr (size, Abstract_tag); - Ephe_link(res) = domain_state->ephe_info->live; - domain_state->ephe_info->live = res; + /* The new ephemeron needs to be added to: + live, if marking has started, to be marked next cycle + todo, if marking has not started, to be marked this cycle */ + if (caml_marking_started()) { + Ephe_link(res) = domain_state->ephe_info->live; + domain_state->ephe_info->live = res; + } else { + Ephe_link(res) = domain_state->ephe_info->todo; + domain_state->ephe_info->todo = res; + } for (i = CAML_EPHE_DATA_OFFSET; i < size; i++) Field(res, i) = caml_ephe_none; /* run memprof callbacks */ @@ -275,8 +175,9 @@ void caml_ephe_clean (value v) { else if (Is_block (child) && !Is_young (child)) { if (Tag_val (child) == Infix_tag) child -= Infix_offset_val (child); /* If we scanned all the keys and the data field remains filled, - then the mark phase must have marked it */ - CAMLassert( is_marked (child) ); + then the mark phase must have marked it (or alternatively the + value concerned is in static data etc). */ + CAMLassert( is_marked (child) || is_not_markable (child) ); } #endif } @@ -362,7 +263,8 @@ static value ephe_get_field (value e, mlsize_t offset) if (elt == caml_ephe_none) { res = Val_none; } else { - caml_darken (Caml_state, elt, 0); + if (caml_marking_started()) + caml_darken (Caml_state, elt, 0); res = caml_alloc_small (1, Tag_some); Field(res, 0) = elt; } @@ -391,7 +293,7 @@ CAMLprim value caml_weak_get (value ar, value n) static void ephe_copy_and_darken(value from, value to) { - mlsize_t i = 0; /* size of non-scannable prefix */ + mlsize_t scan_from, scan_to; CAMLassert(Is_block(from)); CAMLassert(Is_block(to)); @@ -400,23 +302,34 @@ static void ephe_copy_and_darken(value from, value to) CAMLassert(Wosize_val(from) == Wosize_val(to)); if (Tag_val(from) > No_scan_tag) { - i = Wosize_val(to); + scan_from = Wosize_val(from); + scan_to = scan_from; } else if (Tag_val(from) == Closure_tag) { - i = Start_env_closinfo(Closinfo_val(from)); + scan_from = Start_env_closinfo(Closinfo_val(from)); + scan_to = Wosize_val(from); + } + else { + scan_from = 0; + scan_to = Scannable_wosize_val(from); } /* Copy non-scannable prefix */ - memcpy (Bp_val(to), Bp_val(from), Bsize_wsize(i)); + memcpy (Bp_val(to), Bp_val(from), Bsize_wsize(scan_from)); /* Copy and darken scannable fields */ caml_domain_state* domain_state = Caml_state; - while (i < Wosize_val(to)) { + for (mlsize_t i = scan_from; i < scan_to; i++) { value field = Field(from, i); - caml_darken (domain_state, field, 0); + if (caml_marking_started()) + caml_darken (domain_state, field, 0); Store_field(to, i, field); - ++ i; } + + /* Copy non-scannable suffix */ + memcpy (Op_val(to) + scan_to, + Op_val(from) + scan_to, + Bsize_wsize(Wosize_val(from) - scan_to)); } static value ephe_get_field_copy (value e, mlsize_t offset) @@ -463,7 +376,8 @@ static value ephe_get_field_copy (value e, mlsize_t offset) /* This allocation could provoke a GC, which could change the * header or size of val (e.g. in a finalizer). So we go around * the loop to read val again. */ - copy = caml_alloc (Wosize_val(val), Tag_val(val)); + copy = caml_alloc_with_reserved (Wosize_val(val), Tag_val(val), + Reserved_val(val)); val = Val_unit; } @@ -575,7 +489,8 @@ CAMLprim value caml_ephe_blit_key (value es, value ofs, CAMLprim value caml_ephe_blit_data (value es, value ed) { ephe_blit_field (es, CAML_EPHE_DATA_OFFSET, ed, CAML_EPHE_DATA_OFFSET, 1); - caml_darken(0, Field(ed, CAML_EPHE_DATA_OFFSET), 0); + if (caml_marking_started()) + caml_darken(0, Field(ed, CAML_EPHE_DATA_OFFSET), 0); /* [ed] may be in [Caml_state->ephe_info->live] list. The data value may be unmarked. The ephemerons on the live list are not scanned during ephemeron marking. Hence, unconditionally darken the data value. */ diff --git a/runtime/win32.c b/runtime/win32.c index a2dcf920a1e..84bf11bbfb3 100644 --- a/runtime/win32.c +++ b/runtime/win32.c @@ -1107,6 +1107,11 @@ int caml_num_rows_fd(int fd) return -1; } +void caml_print_timestamp(FILE* channel, int formatted) +{ + /* unimplemented */ +} + /* UCRT clock function returns wall-clock time */ CAMLexport clock_t caml_win32_clock(void) { @@ -1151,13 +1156,8 @@ int64_t caml_time_counter(void) return (int64_t)(now.QuadPart * clock_period); } -void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) +void *caml_plat_mem_map(uintnat size, int reserve_only) { - /* VirtualAlloc returns an address aligned to caml_plat_mmap_alignment, so - trimming will not be required. VirtualAlloc returns 0 on error. */ - if (alignment > caml_plat_mmap_alignment) - caml_fatal_error("Cannot align memory to %" ARCH_INTNAT_PRINTF_FORMAT "x" - " on this platform", alignment); return VirtualAlloc(NULL, size, MEM_RESERVE | (reserve_only ? 0 : MEM_COMMIT), diff --git a/runtime4/Makefile b/runtime4/Makefile index 9b75081a30a..ddf7b5648ef 100644 --- a/runtime4/Makefile +++ b/runtime4/Makefile @@ -22,19 +22,19 @@ include $(ROOTDIR)/Makefile.common BYTECODE_C_SOURCES := $(addsuffix .c, \ interp misc stacks fix_code startup_aux startup_byt freelist major_gc \ minor_gc memory alloc roots_byt globroots fail_byt signals \ - signals_byt printexc backtrace_byt backtrace compare ints eventlog \ + signals_byt printexc backtrace_byt backtrace compare ints eventlog prng \ floats simd str array io extern intern hash sys meta parsing gc_ctrl md5 obj \ lexing callback debugger weak compact finalise custom dynlink \ - afl $(UNIX_OR_WIN32) bigarray main memprof domain \ + afl $(UNIX_OR_WIN32) bigarray main memprof domain float32 \ skiplist codefrag) NATIVE_C_SOURCES := $(addsuffix .c, \ startup_aux startup_nat main fail_nat roots_nat signals \ signals_nat misc freelist major_gc minor_gc memory alloc compare ints \ - floats simd str array io extern intern hash sys parsing gc_ctrl eventlog md5 obj \ + floats simd str array io extern intern hash sys parsing gc_ctrl eventlog prng md5 obj \ lexing $(UNIX_OR_WIN32) printexc callback weak compact finalise custom \ globroots backtrace_nat backtrace dynlink_nat debugger meta \ - dynlink clambda_checks afl bigarray \ + dynlink clambda_checks afl bigarray float32 \ memprof domain skiplist codefrag) # Header files generated by configure @@ -112,7 +112,7 @@ libasmrunnnp_OBJECTS := $(NATIVE_C_SOURCES:.c=.nnp.$(O)) $(ASM_OBJECTS) # General (non target-specific) assembler and compiler flags ifneq "$(CCOMPTYPE)" "msvc" -OC_CFLAGS += -g +OC_CFLAGS += -g -Wno-unknown-warning-option endif OC_CPPFLAGS += -DCAMLDLLIMPORT= @@ -137,7 +137,7 @@ ifeq "$(TOOLCHAIN)" "msvc" ASMFLAGS= endif -ASPPFLAGS = -DSYS_$(SYSTEM) -I$(ROOTDIR)/runtime +ASPPFLAGS = -DSYS_$(SYSTEM) -I$(ROOTDIR)/runtime4 ifeq "$(UNIX_OR_WIN32)" "unix" ASPPFLAGS += -DMODEL_$(MODEL) endif @@ -234,6 +234,7 @@ prims.c : primitives (echo '#define CAML_INTERNALS'; \ echo '#include "caml/mlvalues.h"'; \ echo '#include "caml/prims.h"'; \ + echo '#pragma GCC diagnostic ignored "-Wdeprecated-non-prototype"'; \ sed -e 's/.*/extern value &();/' primitives; \ echo 'c_primitive caml_builtin_cprim[] = {'; \ sed -e 's/.*/ &,/' primitives; \ diff --git a/runtime4/afl.c b/runtime4/afl.c index 9d585242440..560efc62ab0 100644 --- a/runtime4/afl.c +++ b/runtime4/afl.c @@ -66,7 +66,7 @@ static void afl_write(uint32_t msg) caml_fatal_error("writing to afl-fuzz"); } -static uint32_t afl_read() +static uint32_t afl_read(void) { uint32_t msg; if (read(FORKSRV_FD_READ, &msg, 4) != 4) diff --git a/runtime4/alloc.c b/runtime4/alloc.c index 71900ec7e70..e1f8954db7f 100644 --- a/runtime4/alloc.c +++ b/runtime4/alloc.c @@ -32,43 +32,69 @@ #define Setup_for_gc #define Restore_after_gc -CAMLexport value caml_alloc (mlsize_t wosize, tag_t tag) +CAMLexport value caml_alloc_with_reserved (mlsize_t wosize, tag_t tag, + reserved_t reserved) { + value result; mlsize_t i; + // Optimization: for mixed blocks, don't fill in non-scannable fields + mlsize_t scannable_wosize = Scannable_wosize_reserved(reserved, wosize); + CAMLassert (tag < 256); CAMLassert (tag != Infix_tag); if (wosize <= Max_young_wosize){ if (wosize == 0){ result = Atom (tag); }else{ - Alloc_small (result, wosize, tag); + Alloc_small_with_reserved (result, wosize, tag, reserved); if (tag < No_scan_tag){ - for (i = 0; i < wosize; i++) Field (result, i) = Val_unit; + for (i = 0; i < scannable_wosize; i++) Field (result, i) = Val_unit; } } }else{ - result = caml_alloc_shr (wosize, tag); + result = caml_alloc_shr_reserved (wosize, tag, reserved); if (tag < No_scan_tag){ - for (i = 0; i < wosize; i++) Field (result, i) = Val_unit; + for (i = 0; i < scannable_wosize; i++) Field (result, i) = Val_unit; } result = caml_check_urgent_gc (result); } return result; } -CAMLexport value caml_alloc_small (mlsize_t wosize, tag_t tag) +CAMLexport value caml_alloc (mlsize_t wosize, tag_t tag) { + return caml_alloc_with_reserved (wosize, tag, 0); +} + +#if NATIVE_CODE +CAMLexport value caml_alloc_mixed (mlsize_t wosize, tag_t tag, + mlsize_t scannable_prefix) { + reserved_t reserved = + Reserved_mixed_block_scannable_wosize_native(scannable_prefix); + return caml_alloc_with_reserved (wosize, tag, reserved); +} +#endif // NATIVE_CODE + +CAMLexport value caml_alloc_small_with_reserved (mlsize_t wosize, tag_t tag, + reserved_t reserved) { value result; CAMLassert (wosize > 0); CAMLassert (wosize <= Max_young_wosize); CAMLassert (tag < 256); - Alloc_small (result, wosize, tag); + CAMLassert (tag != Infix_tag); + Alloc_small_with_reserved (result, wosize, tag, reserved); return result; } +CAMLexport value caml_alloc_small (mlsize_t wosize, tag_t tag) +{ + return caml_alloc_small_with_reserved(wosize, tag, 0); +} + + /* [n] is a number of words (fields) */ CAMLexport value caml_alloc_tuple(mlsize_t n) { @@ -220,6 +246,32 @@ CAMLprim value caml_alloc_dummy_float (value size) return caml_alloc (wosize, 0); } +/* [size] is a [value] representing the number of fields. + [scannable_size] is a [value] representing the length of the prefix of + fields that contains pointer values. +*/ +CAMLprim value caml_alloc_dummy_mixed (value size, value scannable_size) +{ + mlsize_t wosize = Long_val(size); +#ifdef NATIVE_CODE + mlsize_t scannable_wosize = Long_val(scannable_size); + /* The below code runs for bytecode and native code, and critically assumes + that a double record field can be stored in one word. That's true both for + 32-bit and 64-bit bytecode (as a double record field in a mixed record is + always boxed), and for 64-bit native code (as the double record field is + stored flat, taking up 1 word). + */ + CAML_STATIC_ASSERT(Double_wosize == 1); + reserved_t reserved = + Reserved_mixed_block_scannable_wosize_native(scannable_wosize); +#else + /* [scannable_size] can't be used meaningfully in bytecode */ + (void)scannable_size; + reserved_t reserved = Faux_mixed_block_sentinel; +#endif // NATIVE_CODE + return caml_alloc_with_reserved (wosize, 0, reserved); +} + CAMLprim value caml_alloc_dummy_infix(value vsize, value voffset) { mlsize_t wosize = Long_val(vsize), offset = Long_val(voffset); @@ -270,14 +322,25 @@ CAMLprim value caml_update_dummy(value dummy, value newval) } else { CAMLassert (tag < No_scan_tag); CAMLassert (Tag_val(dummy) != Infix_tag); + CAMLassert (Reserved_val(dummy) == Reserved_val(newval)); Tag_val(dummy) = tag; size = Wosize_val(newval); CAMLassert (size == Wosize_val(dummy)); + mlsize_t scannable_size = Scannable_wosize_val(newval); + CAMLassert (scannable_size == Scannable_wosize_val(dummy)); /* See comment above why this is safe even if [tag == Closure_tag] - and some of the "values" being copied are actually code pointers. */ - for (i = 0; i < size; i++){ + and some of the "values" being copied are actually code pointers. + + This reasoning does not apply to arbitrary flat fields, which might have + the same shape as pointers into the minor heap, so we need to handle the + non-scannable suffix of mixed blocks specially. + */ + for (i = 0; i < scannable_size; i++){ caml_modify (&Field(dummy, i), Field(newval, i)); } + for (i = scannable_size; i < size; i++) { + Field(dummy, i) = Field(newval, i); + } } return Val_unit; } @@ -289,3 +352,8 @@ CAMLexport value caml_alloc_some(value v) Field(some, 0) = v; CAMLreturn(some); } + +CAMLprim value caml_atomic_make_contended(value v) +{ + caml_fatal_error("Atomic.make_contended is not supported by runtime4"); +} diff --git a/runtime4/amd64.S b/runtime4/amd64.S index d24629949fb..92640ee36e7 100644 --- a/runtime4/amd64.S +++ b/runtime4/amd64.S @@ -586,14 +586,14 @@ LBL(caml_start_program): /* Build an exception handler */ lea LBL(108)(%rip), %r13 pushq %r13; CFI_ADJUST(8) - pushq Caml_state(exception_pointer); CFI_ADJUST(8) - movq %rsp, Caml_state(exception_pointer) + pushq Caml_state(exn_handler); CFI_ADJUST(8) + movq %rsp, Caml_state(exn_handler) movq %rsp, Caml_state(async_exception_pointer) /* Call the OCaml code */ call *%r12 LBL(107): /* Pop the exception handler */ - popq Caml_state(exception_pointer); CFI_ADJUST(-8) + popq Caml_state(exn_handler); CFI_ADJUST(-8) popq %r12; CFI_ADJUST(-8) /* dummy register */ LBL(109): /* Update alloc ptr */ @@ -621,8 +621,8 @@ FUNCTION(G(caml_raise_exn)) CFI_STARTPROC testq $1, Caml_state(backtrace_active) jne LBL(110) - movq Caml_state(exception_pointer), %rsp - popq Caml_state(exception_pointer); CFI_ADJUST(-8) + movq Caml_state(exn_handler), %rsp + popq Caml_state(exn_handler); CFI_ADJUST(-8) ret LBL(110): movq %rax, %r12 /* Save exception bucket */ @@ -636,14 +636,14 @@ LBL(110): movq %rsp, C_ARG_3 /* arg 3: sp at raise */ #endif /* arg 4: sp of handler */ - movq Caml_state(exception_pointer), C_ARG_4 + movq Caml_state(exn_handler), C_ARG_4 /* PR#5700: thanks to popq above, stack is now 16-aligned */ /* Thanks to ENTER_FUNCTION, stack is now 16-aligned */ PREPARE_FOR_C_CALL /* no need to cleanup after */ call GCALL(caml_stash_backtrace) movq %r12, %rax /* Recover exception bucket */ - movq Caml_state(exception_pointer), %rsp - popq Caml_state(exception_pointer); CFI_ADJUST(-8) + movq Caml_state(exn_handler), %rsp + popq Caml_state(exn_handler); CFI_ADJUST(-8) ret CFI_ENDPROC ENDFUNCTION(G(caml_raise_exn)) @@ -656,9 +656,9 @@ CFI_STARTPROC testq $1, Caml_state(backtrace_active) jne LBL(112) movq C_ARG_2, %rax - movq Caml_state(exception_pointer), %rsp /* Cut stack */ + movq Caml_state(exn_handler), %rsp /* Cut stack */ /* Recover previous exception handler */ - popq Caml_state(exception_pointer); CFI_ADJUST(-8) + popq Caml_state(exn_handler); CFI_ADJUST(-8) movq Caml_state(young_ptr), %r15 /* Reload alloc ptr */ ret LBL(112): @@ -674,16 +674,16 @@ LBL(112): /* arg 3: sp of raise */ movq Caml_state(bottom_of_stack), C_ARG_3 /* arg 4: sp of handler */ - movq Caml_state(exception_pointer), C_ARG_4 + movq Caml_state(exn_handler), C_ARG_4 #ifndef WITH_FRAME_POINTERS subq $8, %rsp /* PR#5700: maintain stack alignment */ #endif PREPARE_FOR_C_CALL /* no need to cleanup after */ call GCALL(caml_stash_backtrace) movq %r12, %rax /* Recover exception bucket */ - movq Caml_state(exception_pointer), %rsp + movq Caml_state(exn_handler), %rsp /* Recover previous exception handler */ - popq Caml_state(exception_pointer); CFI_ADJUST(-8) + popq Caml_state(exn_handler); CFI_ADJUST(-8) movq Caml_state(young_ptr), %r15 /* Reload alloc ptr */ ret CFI_ENDPROC @@ -700,7 +700,7 @@ FUNCTION(G(caml_stack_overflow)) LEA_VAR(caml_exn_Stack_overflow, %rax) movq Caml_state(async_exception_pointer), %rsp /* cut the stack */ /* Recover previous exn handler */ - popq Caml_state(exception_pointer) + popq Caml_state(exn_handler) ret /* jump to handler's code */ ENDFUNCTION(G(caml_stack_overflow)) @@ -791,6 +791,14 @@ G(caml_negf_mask): .align SIXTEEN_ALIGN G(caml_absf_mask): .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF + .globl G(caml_negf32_mask) + .align SIXTEEN_ALIGN +G(caml_negf32_mask): + .quad 0x80000000, 0 + .globl G(caml_absf32_mask) + .align SIXTEEN_ALIGN +G(caml_absf32_mask): + .quad 0xFFFFFFFF7FFFFFFFL, 0xFFFFFFFFFFFFFFFF #if defined(SYS_linux) /* Mark stack as non-executable, PR#4564 */ diff --git a/runtime4/amd64nt.asm b/runtime4/amd64nt.asm index f4e4582b8e3..7314fdf5b7e 100644 --- a/runtime4/amd64nt.asm +++ b/runtime4/amd64nt.asm @@ -453,4 +453,14 @@ caml_negf_mask LABEL QWORD caml_absf_mask LABEL QWORD QWORD 7FFFFFFFFFFFFFFFH, 0FFFFFFFFFFFFFFFFH + PUBLIC caml_negf32_mask + ALIGN 16 +caml_negf32_mask LABEL QWORD + QWORD 80000000H, 0 + + PUBLIC caml_absf32_mask + ALIGN 16 +caml_absf32_mask LABEL QWORD + QWORD FFFFFFFF7FFFFFFFH, 0FFFFFFFFFFFFFFFFH + END diff --git a/runtime4/arm.S b/runtime4/arm.S index 15b23ac200b..a5752e397c7 100644 --- a/runtime4/arm.S +++ b/runtime4/arm.S @@ -126,7 +126,7 @@ caml_hot__code_end: #define DOMAIN_STATE(c_type, name) \ .equ domain_field_caml_##name, domain_curr_field ; \ .set domain_curr_field, domain_curr_field + 1 -#include "../runtime/caml/domain_state.tbl" +#include "../runtime4/caml/domain_state.tbl" #undef DOMAIN_STATE #define Caml_state(var) [domain_state_ptr, 8*domain_field_caml_##var] @@ -159,7 +159,7 @@ FUNCTION(caml_call_gc) /* Save current allocation pointer for debugging purposes */ str alloc_ptr, Caml_state(young_ptr) /* Save trap pointer in case an exception is raised during GC */ - str trap_ptr, Caml_state(exception_pointer) + str trap_ptr, Caml_state(exn_handler) /* Call the garbage collector */ bl caml_garbage_collection /* Restore integer registers and return address from the stack */ @@ -228,7 +228,7 @@ FUNCTION(caml_c_call) CFI_REGISTER(lr, r4) /* Make the exception handler alloc ptr available to the C code */ str alloc_ptr, Caml_state(young_ptr) - str trap_ptr, Caml_state(exception_pointer) + str trap_ptr, Caml_state(exn_handler) /* Call the function */ blx r7 /* Reload alloc ptr */ @@ -273,7 +273,7 @@ FUNCTION(caml_start_program) /* Setup a trap frame to catch exceptions escaping the OCaml code */ sub sp, sp, 8; CFI_ADJUST(8) ldr r5, =.Ltrap_handler - ldr r4, Caml_state(exception_pointer) + ldr r4, Caml_state(exn_handler) str r4, [sp, 0] str r5, [sp, 4] mov trap_ptr, sp @@ -282,9 +282,9 @@ FUNCTION(caml_start_program) /* Call the OCaml code */ blx r12 .Lcaml_retaddr: - /* Pop the trap frame, restoring caml_exception_pointer */ + /* Pop the trap frame, restoring caml_exn_handler */ ldr r5, [sp, 0] - str r5, Caml_state(exception_pointer) + str r5, Caml_state(exn_handler) add sp, sp, 8; CFI_ADJUST(-8) /* Pop the callback link, restoring the global variables */ .Lreturn_result: @@ -315,7 +315,7 @@ FUNCTION(caml_start_program) .Ltrap_handler: CFI_STARTPROC /* Save exception pointer */ - str trap_ptr, Caml_state(exception_pointer) + str trap_ptr, Caml_state(exn_handler) /* Encode exception bucket as an exception result */ orr r0, r0, 2 /* Return it */ @@ -356,7 +356,7 @@ FUNCTION(caml_raise_exception) /* Load exception bucket */ mov r0, r1 /* Reload trap ptr and alloc ptr */ - ldr trap_ptr, Caml_state(exception_pointer) + ldr trap_ptr, Caml_state(exn_handler) ldr alloc_ptr, Caml_state(young_ptr) /* Test if backtrace is active */ ldr r1, Caml_state(backtrace_active) diff --git a/runtime4/arm64.S b/runtime4/arm64.S index 4dc871bf369..1f65ab1b441 100644 --- a/runtime4/arm64.S +++ b/runtime4/arm64.S @@ -60,7 +60,7 @@ .equ domain_field_caml_##name, domain_curr_field ; \ .set domain_curr_field, domain_curr_field + 1 #endif -#include "../runtime/caml/domain_state.tbl" +#include "../runtime4/caml/domain_state.tbl" #undef DOMAIN_STATE #define Caml_state(var) [DOMAIN_STATE_PTR, 8*domain_field_caml_##var] @@ -204,7 +204,7 @@ L(caml_call_gc): /* Save current allocation pointer for debugging purposes */ str ALLOC_PTR, Caml_state(young_ptr) /* Save trap pointer in case an exception is raised during GC */ - str TRAP_PTR, Caml_state(exception_pointer) + str TRAP_PTR, Caml_state(exn_handler) /* Call the garbage collector */ bl G(caml_garbage_collection) /* Restore registers */ @@ -280,6 +280,91 @@ FUNCTION(caml_allocN) CFI_ENDPROC END_FUNCTION(caml_allocN) +FUNCTION(caml_call_local_realloc) +L(caml_call_local_realloc): + CFI_STARTPROC + /* Set up stack space, saving return address and frame pointer */ + /* Store return address and frame pointer */ + /* (2 RA/GP, 24 allocatable int regs, 24 caller-saved float regs) * 8 */ + CFI_OFFSET(29,-400) + CFI_OFFSET(30,-392) + stp x29, x30, [sp,-400]! /* pre-indexing stp */ + CFI_ADJUST(400) + add x29, sp, #0 + + /* Save allocatable integer registers on the stack, using order in proc.ml */ + stp x0, x1, [sp, 16] + stp x2, x3, [sp, 32] + stp x4, x5, [sp, 48] + stp x6, x7, [sp, 64] + stp x8, x9, [sp, 80] + stp x10, x11, [sp, 96] + stp x12, x13, [sp, 112] + stp x14, x15, [sp, 128] + stp x19, x20, [sp, 144] + stp x21, x22, [sp, 160] + stp x23, x24, [sp, 176] + str x25, [sp, 192] + + /* Save caller saved floating-point registers on the stack */ + stp d0, d1, [sp, 208] + stp d2, d3, [sp, 224] + stp d4, d5, [sp, 240] + stp d6, d7, [sp, 256] + stp d16, d17, [sp, 272] + stp d18, d19, [sp, 288] + stp d20, d21, [sp, 304] + stp d22, d23, [sp, 320] + stp d24, d25, [sp, 336] + stp d26, d27, [sp, 352] + stp d28, d29, [sp, 368] + stp d30, d31, [sp, 384] + + /* Store pointer to saved integer registers in Caml_state->gc_regs */ + add TMP, sp, #16 + str TMP, Caml_state(gc_regs) + + /* Save current allocation pointer for debugging purposes */ + str ALLOC_PTR, Caml_state(young_ptr) + + /* Call the realloc function */ + bl G(caml_local_realloc) + + /* Restore registers */ + ldp x0, x1, [sp, 16] + ldp x2, x3, [sp, 32] + ldp x4, x5, [sp, 48] + ldp x6, x7, [sp, 64] + ldp x8, x9, [sp, 80] + ldp x10, x11, [sp, 96] + ldp x12, x13, [sp, 112] + ldp x14, x15, [sp, 128] + ldp x19, x20, [sp, 144] + ldp x21, x22, [sp, 160] + ldp x23, x24, [sp, 176] + ldr x25, [sp, 192] + ldp d0, d1, [sp, 208] + ldp d2, d3, [sp, 224] + ldp d4, d5, [sp, 240] + ldp d6, d7, [sp, 256] + ldp d16, d17, [sp, 272] + ldp d18, d19, [sp, 288] + ldp d20, d21, [sp, 304] + ldp d22, d23, [sp, 320] + ldp d24, d25, [sp, 336] + ldp d26, d27, [sp, 352] + ldp d28, d29, [sp, 368] + ldp d30, d31, [sp, 384] + + /* Reload new allocation pointer */ + ldr ALLOC_PTR, Caml_state(young_ptr) + + /* Free stack space and return to caller */ + ldp x29, x30, [sp], 400 + ret + CFI_ENDPROC + END_FUNCTION(caml_call_local_realloc) + /* Call a C function from OCaml */ /* Function to call is in ADDITIONAL_ARG */ @@ -294,7 +379,7 @@ FUNCTION(caml_c_call) str TMP, Caml_state(bottom_of_stack) /* Make the exception handler alloc ptr available to the C code */ str ALLOC_PTR, Caml_state(young_ptr) - str TRAP_PTR, Caml_state(exception_pointer) + str TRAP_PTR, Caml_state(exn_handler) /* Call the function */ blr ADDITIONAL_ARG /* Reload alloc ptr */ @@ -338,32 +423,38 @@ L(jump_to_caml): ldr x8, Caml_state(bottom_of_stack) ldr x9, Caml_state(last_return_address) ldr x10, Caml_state(gc_regs) + ldr x11, Caml_state(async_exception_pointer) stp x8, x9, [sp, -32]! /* 16-byte alignment */ CFI_ADJUST(32) str x10, [sp, 16] + str x11, [sp, 24] /* Setup a trap frame to catch exceptions escaping the OCaml code */ - ldr x8, Caml_state(exception_pointer) + ldr x8, Caml_state(exn_handler) adr x9, L(trap_handler) stp x8, x9, [sp, -16]! CFI_ADJUST(16) add TRAP_PTR, sp, #0 + /* Store the async exception pointer */ + str TRAP_PTR, Caml_state(async_exception_pointer) /* Reload allocation pointer */ ldr ALLOC_PTR, Caml_state(young_ptr) /* Call the OCaml code */ blr TMP2 L(caml_retaddr): - /* Pop the trap frame, restoring caml_exception_pointer */ + /* Pop the trap frame, restoring caml_exn_handler */ ldr x8, [sp], 16 CFI_ADJUST(-16) - str x8, Caml_state(exception_pointer) + str x8, Caml_state(exn_handler) /* Pop the callback link, restoring the global variables */ L(return_result): + ldr x11, [sp, 24] ldr x10, [sp, 16] ldp x8, x9, [sp], 32 CFI_ADJUST(-32) str x8, Caml_state(bottom_of_stack) str x9, Caml_state(last_return_address) str x10, Caml_state(gc_regs) + str x11, Caml_state(async_exception_pointer) /* Update allocation pointer */ str ALLOC_PTR, Caml_state(young_ptr) /* Reload callee-save registers and return address */ @@ -389,7 +480,7 @@ L(return_result): L(trap_handler): CFI_STARTPROC /* Save exception pointer */ - str TRAP_PTR, Caml_state(exception_pointer) + str TRAP_PTR, Caml_state(exn_handler) /* Encode exception bucket as an exception result */ orr x0, x0, #2 /* Return it */ @@ -432,7 +523,7 @@ FUNCTION(caml_raise_exception) /* Load the exception bucket */ mov x0, C_ARG_2 /* Reload trap ptr and alloc ptr */ - ldr TRAP_PTR, Caml_state(exception_pointer) + ldr TRAP_PTR, Caml_state(exn_handler) ldr ALLOC_PTR, Caml_state(young_ptr) /* Test if backtrace is active */ ldr TMP, Caml_state(backtrace_active) @@ -469,9 +560,10 @@ FUNCTION(caml_raise_exception) FUNCTION(caml_stack_overflow) /* Load the exception bucket */ ADDRGLOBAL(x0, caml_exn_Stack_overflow) - /* Cut stack at current trap handler */ - mov sp, TRAP_PTR - /* Pop previous handler and jump to it */ + /* Cut stack at current async exn trap handler */ + ldr TMP, Caml_state(async_exception_pointer) + mov sp, TMP + /* Pop handler and jump to it */ ldr TMP, [sp, 8] ldr TRAP_PTR, [sp], 16 br TMP diff --git a/runtime4/array.c b/runtime4/array.c index 40e65f957b8..19a6a5d9539 100644 --- a/runtime4/array.c +++ b/runtime4/array.c @@ -24,9 +24,84 @@ #include "caml/mlvalues.h" #include "caml/signals.h" #include "caml/eventlog.h" +#include "caml/custom.h" static const mlsize_t mlsize_t_max = -1; +#define Max_array_wosize (Max_wosize) +#define Max_custom_array_wosize (Max_wosize - 1) +#define Max_unboxed_float_array_wosize (Max_array_wosize / (sizeof(double) / sizeof(intnat))) +#define Max_unboxed_int64_array_wosize (Max_custom_array_wosize / (sizeof(int64_t) / sizeof(intnat))) +#define Max_unboxed_int32_array_wosize (Max_custom_array_wosize * (sizeof(intnat) / sizeof(int32_t))) +#define Max_unboxed_nativeint_array_wosize (Max_custom_array_wosize) + +/* Unboxed arrays */ + +CAMLprim int caml_unboxed_array_no_polymorphic_compare(value v1, value v2) +{ + caml_failwith("Polymorphic comparison is not permitted for unboxed arrays"); +} + +CAMLprim intnat caml_unboxed_array_no_polymorphic_hash(value v) +{ + caml_failwith("Polymorphic hash is not permitted for unboxed arrays"); +} + +CAMLprim void caml_unboxed_array_serialize(value v, uintnat* bsize_32, uintnat* bsize_64) +{ + caml_failwith("Marshalling is not yet implemented for unboxed arrays"); +} + +CAMLprim uintnat caml_unboxed_array_deserialize(void* dst) +{ + caml_failwith("Marshalling is not yet implemented for unboxed arrays"); +} + +// Note: if polymorphic comparison and/or hashing are implemented for +// the int32 unboxed arrays, care needs to be taken with the last word +// when the array is of odd length -- this is not currently initialized. + +CAMLexport struct custom_operations caml_unboxed_int32_array_ops[2] = { + { "_unboxed_int32_even_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, + { "_unboxed_int32_odd_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, +}; + +CAMLexport struct custom_operations caml_unboxed_int64_array_ops = { + "_unboxed_int64_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default +}; + +CAMLexport struct custom_operations caml_unboxed_nativeint_array_ops = { + "_unboxed_nativeint_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default +}; + /* returns number of elements (either fields or floats) */ /* [ 'a array -> int ] */ CAMLexport mlsize_t caml_array_length(value array) @@ -64,7 +139,11 @@ CAMLprim value caml_floatarray_get(value array, value index) double d; value res; - CAMLassert (Tag_val(array) == Double_array_tag); + // [caml_floatarray_get] may be called on a floatarray + // or a mixed block. + CAMLassert ( Tag_val(array) == Double_array_tag + || index > Scannable_wosize_val(array) ); + if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) caml_array_bound_error(); d = Double_flat_field(array, idx); @@ -84,7 +163,11 @@ CAMLprim value caml_floatarray_get_local(value array, value index) double d; value res; - CAMLassert (Tag_val(array) == Double_array_tag); + // [caml_floatarray_get] may be called on a floatarray + // or a mixed block. + CAMLassert ( Tag_val(array) == Double_array_tag + || index > Scannable_wosize_val(array) ); + if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) caml_array_bound_error(); d = Double_flat_field(array, idx); @@ -309,7 +392,7 @@ CAMLprim value caml_floatarray_create(value len) Alloc_small (result, wosize, Double_array_tag); #undef Setup_for_gc #undef Restore_after_gc - }else if (wosize > Max_wosize) + }else if (wosize > Max_unboxed_float_array_wosize) caml_invalid_argument("Float.Array.create"); else { result = caml_alloc_shr (wosize, Double_array_tag); @@ -341,8 +424,8 @@ static value make_vect_gen(value len, value init, int local) mlsize_t wsize; double d; d = Double_val(init); + if (size > Max_unboxed_float_array_wosize) caml_invalid_argument("Array.make"); wsize = size * Double_wosize; - if (wsize > Max_wosize) caml_invalid_argument("Array.make"); res = local ? caml_alloc_local(wsize, Double_array_tag) : caml_alloc(wsize, Double_array_tag); @@ -351,7 +434,7 @@ static value make_vect_gen(value len, value init, int local) } #endif } else { - if (size > Max_wosize) caml_invalid_argument("Array.make"); + if (size > Max_array_wosize) caml_invalid_argument("Array.make"); else if (local) { res = caml_alloc_local(size, 0); for (i = 0; i < size; i++) Field(res, i) = init; @@ -404,6 +487,57 @@ CAMLprim value caml_make_float_vect(value len) #endif } +CAMLprim value caml_make_unboxed_int32_vect(value len) +{ + /* This is only used on 64-bit targets. */ + + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_int32_array_wosize) caml_invalid_argument("Array.make"); + + /* [num_fields] does not include the custom operations field. */ + mlsize_t num_fields = num_elements / 2 + num_elements % 2; + + return caml_alloc_custom(&caml_unboxed_int32_array_ops[num_elements % 2], + num_fields * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_int32_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_int32(0)); +} + +CAMLprim value caml_make_unboxed_int64_vect(value len) +{ + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_int64_array_wosize) caml_invalid_argument("Array.make"); + + struct custom_operations* ops = &caml_unboxed_int64_array_ops; + + return caml_alloc_custom(ops, num_elements * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_int64_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_int64(0)); +} + +CAMLprim value caml_make_unboxed_nativeint_vect(value len) +{ + /* This is only used on 64-bit targets. */ + + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_nativeint_array_wosize) caml_invalid_argument("Array.make"); + + struct custom_operations* ops = &caml_unboxed_nativeint_array_ops; + + return caml_alloc_custom(ops, num_elements * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_nativeint_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_nativeint(0)); +} + /* This primitive is used internally by the compiler to compile explicit array expressions. For float arrays when FLAT_FLOAT_ARRAY is true, it takes an array of @@ -471,6 +605,36 @@ CAMLprim value caml_floatarray_blit(value a1, value ofs1, value a2, value ofs2, return Val_unit; } +CAMLprim value caml_unboxed_int32_vect_blit(value a1, value ofs1, value a2, + value ofs2, value n) +{ + // Need to skip the custom_operations field + memmove((int32_t *)((uintnat *)a2 + 1) + Long_val(ofs2), + (int32_t *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(int32_t)); + return Val_unit; +} + +CAMLprim value caml_unboxed_int64_vect_blit(value a1, value ofs1, value a2, value ofs2, + value n) +{ + // Need to skip the custom_operations field + memmove((int64_t *)((uintnat *)a2 + 1) + Long_val(ofs2), + (int64_t *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(int64_t)); + return Val_unit; +} + +CAMLprim value caml_unboxed_nativeint_vect_blit(value a1, value ofs1, value a2, + value ofs2, value n) +{ + // Need to skip the custom_operations field + memmove((uintnat *)((uintnat *)a2 + 1) + Long_val(ofs2), + (uintnat *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(uintnat)); + return Val_unit; +} + CAMLprim value caml_array_blit(value a1, value ofs1, value a2, value ofs2, value n) { @@ -551,7 +715,7 @@ static value caml_array_gather(intnat num_arrays, #ifdef FLAT_FLOAT_ARRAY else if (isfloat) { /* This is an array of floats. We can use memcpy directly. */ - if (size > Max_wosize/Double_wosize) caml_invalid_argument("Array.concat"); + if (size > Max_unboxed_float_array_wosize) caml_invalid_argument("Array.concat"); wsize = size * Double_wosize; res = local ? caml_alloc_local(wsize, Double_array_tag) : @@ -565,7 +729,7 @@ static value caml_array_gather(intnat num_arrays, CAMLassert(pos == size); } #endif - else if (size > Max_wosize) { + else if (size > Max_array_wosize) { /* Array of values, too big. */ caml_invalid_argument("Array.concat"); } else if (size <= Max_young_wosize || local) { @@ -744,3 +908,51 @@ CAMLprim value caml_array_of_iarray(value a) { return a; } + + +/* We need these pre-declared for [gen_primitives.sh] to work. */ +CAMLprim value caml_array_get_indexed_by_int64(value, value); +CAMLprim value caml_array_unsafe_get_indexed_by_int64(value, value); +CAMLprim value caml_array_set_indexed_by_int64(value, value, value); +CAMLprim value caml_array_unsafe_set_indexed_by_int64(value, value, value); + +CAMLprim value caml_array_get_indexed_by_int32(value, value); +CAMLprim value caml_array_unsafe_get_indexed_by_int32(value, value); +CAMLprim value caml_array_set_indexed_by_int32(value, value, value); +CAMLprim value caml_array_unsafe_set_indexed_by_int32(value, value, value); + +CAMLprim value caml_array_get_indexed_by_nativeint(value, value); +CAMLprim value caml_array_unsafe_get_indexed_by_nativeint(value, value); +CAMLprim value caml_array_set_indexed_by_nativeint(value, value, value); +CAMLprim value caml_array_unsafe_set_indexed_by_nativeint(value, value, value); + +#define CAMLprim_indexed_by(name, index_type, val_func) \ + CAMLprim value caml_array_get_indexed_by_##name(value array, value index) \ + { \ + index_type idx = val_func(index); \ + if (idx != Long_val(Val_long(idx))) caml_array_bound_error(); \ + return caml_array_get(array, Val_long(idx)); \ + } \ + CAMLprim value caml_array_unsafe_get_indexed_by_##name(value array, \ + value index) \ + { \ + return caml_array_unsafe_get(array, Val_long(val_func(index))); \ + } \ + CAMLprim value caml_array_set_indexed_by_##name(value array, \ + value index, \ + value newval) \ + { \ + index_type idx = val_func(index); \ + if (idx != Long_val(Val_long(idx))) caml_array_bound_error(); \ + return caml_array_set(array, Val_long(idx), newval); \ + } \ + CAMLprim value caml_array_unsafe_set_indexed_by_##name(value array, \ + value index, \ + value newval) \ + { \ + return caml_array_unsafe_set(array, Val_long(val_func(index)), newval); \ + } + +CAMLprim_indexed_by(int64, int64_t, Int64_val) +CAMLprim_indexed_by(int32, int32_t, Int32_val) +CAMLprim_indexed_by(nativeint, intnat, Nativeint_val) diff --git a/runtime4/bigarray.c b/runtime4/bigarray.c index ed4ff67d219..d5f4d88b5e3 100644 --- a/runtime4/bigarray.c +++ b/runtime4/bigarray.c @@ -524,7 +524,7 @@ CAMLprim value caml_ba_create(value vkind, value vlayout, value vdim) are within the bounds and return the offset of the corresponding array element in the data part of the array. */ -static intnat caml_ba_offset(struct caml_ba_array * b, intnat * index) +intnat caml_ba_offset(struct caml_ba_array * b, intnat * index) { intnat offset; int i; diff --git a/runtime4/callback.c b/runtime4/callback.c index 5205e2dd8ab..e614e644b42 100644 --- a/runtime4/callback.c +++ b/runtime4/callback.c @@ -23,6 +23,7 @@ #include "caml/fail.h" #include "caml/memory.h" #include "caml/mlvalues.h" +#include "caml/signals.h" static value raise_if_exception(value res) { @@ -278,8 +279,15 @@ CAMLprim value caml_with_async_exns(value body_callback) res = caml_callback_exn(body_callback, Val_unit); /* raised as a normal exn, even if it was asynchronous */ - if (Is_exception_result(res)) - caml_raise(Extract_exception(res)); + if (Is_exception_result(res)) { + /* Drain the queue of pending actions. We may need to do + this several times if some raise */ + do { + res = Extract_exception(res); + res = caml_process_pending_actions_with_root_exn(res); + } while (Is_exception_result(res)); + caml_raise(res); + } return res; } diff --git a/runtime4/caml/alloc.h b/runtime4/caml/alloc.h index 2d86cb6dfcc..f489fc0cd63 100644 --- a/runtime4/caml/alloc.h +++ b/runtime4/caml/alloc.h @@ -30,8 +30,13 @@ extern "C" { /* It is guaranteed that these allocation functions will not trigger any OCaml callback such as finalizers or signal handlers. */ +CAMLextern value caml_alloc_with_reserved (mlsize_t, tag_t, reserved_t); CAMLextern value caml_alloc (mlsize_t wosize, tag_t); +CAMLextern value caml_alloc_mixed (mlsize_t wosize, tag_t, + mlsize_t scannable_wosize); CAMLextern value caml_alloc_small (mlsize_t wosize, tag_t); +CAMLextern value caml_alloc_small_with_reserved (mlsize_t wosize, tag_t, + reserved_t); CAMLextern value caml_alloc_tuple (mlsize_t wosize); CAMLextern value caml_alloc_float_array (mlsize_t len); CAMLextern value caml_alloc_string (mlsize_t len); /* len in bytes (chars) */ diff --git a/runtime4/caml/camlatomic.h b/runtime4/caml/camlatomic.h new file mode 100644 index 00000000000..b29bffa0e46 --- /dev/null +++ b/runtime4/caml/camlatomic.h @@ -0,0 +1,87 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* KC Sivaramakrishnan, Indian Institute of Technology, Madras */ +/* Stephen Dolan, University of Cambridge */ +/* */ +/* Copyright 2018 Indian Institute of Technology, Madras */ +/* Copyright 2018 University of Cambridge */ +/* */ +/* 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. */ +/* */ +/**************************************************************************/ +#ifndef CAML_ATOMIC_H +#define CAML_ATOMIC_H + +#include "config.h" + +/* On platforms supporting C11 atomics, this file just includes . + + On other platforms, this file includes platform-specific stubs for + the subset of C11 atomics needed by the OCaml runtime + */ + +#ifdef __cplusplus + +extern "C++" { +#include +#define ATOMIC_UINTNAT_INIT(x) (x) +typedef std::atomic atomic_uintnat; +typedef std::atomic atomic_intnat; +using std::memory_order_relaxed; +using std::memory_order_acquire; +using std::memory_order_release; +using std::memory_order_acq_rel; +using std::memory_order_seq_cst; +} + +#elif defined(HAS_STDATOMIC_H) + +#include +#define ATOMIC_UINTNAT_INIT(x) (x) + +// CR ocaml 5 domains: provide these typedefs (requires C11) +// typedef _Atomic uintnat atomic_uintnat; +// typedef _Atomic intnat atomic_intnat; + +#elif defined(__GNUC__) + +/* Support for versions of gcc which have built-in atomics but do not + expose stdatomic.h (e.g. gcc 4.8) */ +typedef enum memory_order { + memory_order_relaxed = __ATOMIC_RELAXED, + memory_order_acquire = __ATOMIC_ACQUIRE, + memory_order_release = __ATOMIC_RELEASE, + memory_order_acq_rel = __ATOMIC_ACQ_REL, + memory_order_seq_cst = __ATOMIC_SEQ_CST +} memory_order; + +#define ATOMIC_UINTNAT_INIT(x) { (x) } +typedef struct { uintnat repr; } atomic_uintnat; +typedef struct { intnat repr; } atomic_intnat; + +#define atomic_load_explicit(x, m) __atomic_load_n(&(x)->repr, (m)) +#define atomic_load(x) atomic_load_explicit((x), memory_order_seq_cst) +#define atomic_store_explicit(x, v, m) __atomic_store_n(&(x)->repr, (v), (m)) +#define atomic_store(x, v) atomic_store_explicit((x), (v), memory_order_seq_cst) +#define atomic_compare_exchange_strong(x, oldv, newv) \ + __atomic_compare_exchange_n( \ + &(x)->repr, \ + (oldv), (newv), 0, \ + memory_order_seq_cst, memory_order_seq_cst) +#define atomic_exchange(x, newv) \ + __atomic_exchange_n(&(x)->repr, (newv), memory_order_seq_cst) +#define atomic_fetch_add(x, n) \ + __atomic_fetch_add(&(x)->repr, (n), memory_order_seq_cst) +#define atomic_fetch_or(x, n) \ + __atomic_fetch_or(&(x)->repr, (n), memory_order_seq_cst) +#define atomic_thread_fence __atomic_thread_fence + +#else +#error "C11 atomics are unavailable on this platform. See camlatomic.h" +#endif + +#endif /* CAML_ATOMIC_H */ diff --git a/runtime4/caml/custom.h b/runtime4/caml/custom.h index 420121f43eb..62dec5c6302 100644 --- a/runtime4/caml/custom.h +++ b/runtime4/caml/custom.h @@ -39,6 +39,7 @@ struct custom_operations { int (*compare_ext)(value v1, value v2); const struct custom_fixed_length* fixed_length; }; +CAML_STATIC_ASSERT(sizeof(struct custom_operations) == CUSTOM_OPS_STRUCT_SIZE); #define custom_finalize_default NULL #define custom_compare_default NULL @@ -80,6 +81,7 @@ extern struct custom_operations caml_nativeint_ops; extern struct custom_operations caml_int32_ops; extern struct custom_operations caml_int64_ops; extern struct custom_operations caml_ba_ops; +extern struct custom_operations caml_float32_ops; #endif /* CAML_INTERNALS */ #ifdef __cplusplus diff --git a/runtime4/caml/domain.h b/runtime4/caml/domain.h index 23833d24f1d..4a44a50dadc 100644 --- a/runtime4/caml/domain.h +++ b/runtime4/caml/domain.h @@ -27,6 +27,16 @@ extern "C" { void caml_init_domain(void); +/* OCaml 5 stdlib compatibility hooks */ +extern value (*caml_hook_mutex_new)(value unit); +extern value (*caml_hook_mutex_lock)(value wrapper); +extern value (*caml_hook_mutex_unlock)(value wrapper); +extern value (*caml_hook_mutex_try_lock)(value wrapper); +extern value (*caml_hook_condition_new)(value unit); +extern value (*caml_hook_condition_wait)(value wcond, value wmut); +extern value (*caml_hook_condition_signal)(value wrapper); +extern value (*caml_hook_condition_broadcast)(value wrapper); + #endif /* CAML_INTERNALS */ #ifdef __cplusplus diff --git a/runtime4/caml/domain_state.tbl b/runtime4/caml/domain_state.tbl index 0666a09f999..34b46ba8513 100644 --- a/runtime4/caml/domain_state.tbl +++ b/runtime4/caml/domain_state.tbl @@ -18,8 +18,10 @@ DOMAIN_STATE(value*, young_limit) DOMAIN_STATE(value*, young_ptr) /* Minor heap limit. See minor_gc.c. */ -DOMAIN_STATE(char*, exception_pointer) +DOMAIN_STATE(char*, exn_handler) /* Exception pointer that points into the current stack */ +/* This was called [exception_pointer] before but has been renamed to + match the 5.x runtime */ DOMAIN_STATE(char*, async_exception_pointer) /* Async exception pointer that points into the current stack */ @@ -102,5 +104,10 @@ DOMAIN_STATE(void*, checking_pointer_pc) /* See major_gc.c */ #endif +DOMAIN_STATE(void*, dls_root) +DOMAIN_STATE(void*, c_stack) +DOMAIN_STATE(void*, current_stack) +/* Unused: compatibility with runtime5 */ + DOMAIN_STATE(extra_params_area, extra_params) /* This member must occur last, because it is an array, not a scalar */ diff --git a/runtime4/caml/dune b/runtime4/caml/dune index 4d2e4917d1f..f8ec54b56fd 100644 --- a/runtime4/caml/dune +++ b/runtime4/caml/dune @@ -47,6 +47,7 @@ (backtrace_prim.h as caml/backtrace_prim.h) (bigarray.h as caml/bigarray.h) (callback.h as caml/callback.h) + (camlatomic.h as caml/camlatomic.h) (codefrag.h as caml/codefrag.h) (compact.h as caml/compact.h) (compare.h as caml/compare.h) @@ -91,6 +92,7 @@ (s.h as caml/s.h) (signals.h as caml/signals.h) (simd.h as caml/simd.h) + (float32.h as caml/float32.h) (skiplist.h as caml/skiplist.h) (signals_machdep.h as caml/signals_machdep.h) (stack.h as caml/stack.h) diff --git a/runtime4/caml/exec.h b/runtime4/caml/exec.h index 9831e815592..1326cfb50e9 100644 --- a/runtime4/caml/exec.h +++ b/runtime4/caml/exec.h @@ -60,7 +60,7 @@ struct exec_trailer { /* Magic number for this release */ -#define EXEC_MAGIC "Caml1999X520" +#define EXEC_MAGIC "Caml1999X532" #endif /* CAML_INTERNALS */ diff --git a/runtime4/caml/float32.h b/runtime4/caml/float32.h new file mode 100644 index 00000000000..e2ad2fa17d9 --- /dev/null +++ b/runtime4/caml/float32.h @@ -0,0 +1,26 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ +/* Max Slater, Jane Street */ +/* */ +/* 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. */ +/* */ +/**************************************************************************/ + +#ifndef CAML_FLOAT32_H +#define CAML_FLOAT32_H + +#include "mlvalues.h" + +#define Float32_val(v) (*((float *)Data_custom_val(v))) + +CAMLextern value caml_copy_float32(float); + +#endif /* CAML_FLOAT32_H */ diff --git a/runtime4/caml/instruct.h b/runtime4/caml/instruct.h index d29a7b7bb5a..8d963b79ff0 100644 --- a/runtime4/caml/instruct.h +++ b/runtime4/caml/instruct.h @@ -61,8 +61,19 @@ enum instructions { EVENT, BREAK, RERAISE, RAISE_NOTRACE, GETSTRINGCHAR, + PERFORM, RESUME, RESUMETERM, REPERFORMTERM, + MAKE_FAUX_MIXEDBLOCK, FIRST_UNIMPLEMENTED_OP}; +// Think carefully before adding a new bytecode instruction. In general, +// this makes the flambda-backend compiler less compatible with the +// OCaml ecosystem. Projects may need to be patched to build with +// flambda-backend. +// +// We added the [MAKE_FAUX_MIXEDBLOCK] instruction without making this +// consideration and it has turned out OK, but we might want to reverse +// this decision if we run into difficulty in the future. + #endif /* CAML_INTERNALS */ #endif /* CAML_INSTRUCT_H */ diff --git a/runtime4/caml/m.h.in b/runtime4/caml/m.h.in index 155e9355a05..003c4aabb0f 100644 --- a/runtime4/caml/m.h.in +++ b/runtime4/caml/m.h.in @@ -76,6 +76,8 @@ supports word-aligned 64-bit integers. Leave undefined if 64-bit integers are not supported. */ +#undef CUSTOM_OPS_STRUCT_SIZE + #undef PROFINFO_WIDTH #undef ASM_CFI_SUPPORTED diff --git a/runtime4/caml/major_gc.h b/runtime4/caml/major_gc.h index 054aa90dc8d..1c6e419a5f5 100644 --- a/runtime4/caml/major_gc.h +++ b/runtime4/caml/major_gc.h @@ -22,11 +22,16 @@ #include "misc.h" /* An interval of a single object to be scanned. - The end pointer must always be one-past-the-end of a heap block, - but the start pointer is not necessarily the start of the block */ + The object end pointer must always be one-past-the-end of a heap block, + but the start pointer is not necessarily the start of the block, + and the scannable end pointer is not necessarily the same as the + object end pointer. (The GC should not scan past the scannable + end pointer.) +*/ typedef struct { value* start; - value* end; + value* scannable_end; + value* object_end; } mark_entry; typedef struct { @@ -92,7 +97,7 @@ void caml_init_major_heap (asize_t); /* size in bytes */ asize_t caml_clip_heap_chunk_wsz (asize_t wsz); void caml_darken (value, value *); void caml_major_collection_slice (intnat); -void caml_shrink_mark_stack (); +void caml_shrink_mark_stack (void); void major_collection (void); void caml_finish_major_cycle (void); void caml_set_major_window (int); diff --git a/runtime4/caml/memory.h b/runtime4/caml/memory.h index 800b768fa78..e5204f92f96 100644 --- a/runtime4/caml/memory.h +++ b/runtime4/caml/memory.h @@ -41,6 +41,11 @@ CAMLextern value caml_alloc_shr (mlsize_t wosize, tag_t); Equivalent to caml_alloc_shr unless WITH_PROFINFO is true */ CAMLextern value caml_alloc_shr_with_profinfo (mlsize_t, tag_t, intnat); +/* The same as [caml_alloc_shr_with_profinfo], but named to match the runtime5 + naming convention of reserved bits. + */ +CAMLextern value caml_alloc_shr_reserved (mlsize_t, tag_t, reserved_t); + /* Variant of [caml_alloc_shr] where no memprof sampling is performed. */ CAMLextern value caml_alloc_shr_no_track_noexc (mlsize_t, tag_t); @@ -240,6 +245,9 @@ extern void caml_alloc_small_dispatch (intnat wosize, int flags, #define Alloc_small_with_profinfo(result, wosize, tag, profinfo) \ Alloc_small_aux(result, wosize, tag, profinfo, CAML_DO_TRACK) +#define Alloc_small_with_reserved(result, wosize, tag, reserved) \ + Alloc_small_with_profinfo(result, wosize, tag, reserved) + #define Alloc_small(result, wosize, tag) \ Alloc_small_with_profinfo(result, wosize, tag, (uintnat) 0) #define Alloc_small_no_track(result, wosize, tag) \ @@ -251,7 +259,7 @@ extern void caml_alloc_small_dispatch (intnat wosize, int flags, CAML_DEPRECATED("Modify", "caml_modify") \ caml_modify((fp), (val)) -struct caml_local_arenas* caml_get_local_arenas(); +struct caml_local_arenas* caml_get_local_arenas(void); void caml_set_local_arenas(struct caml_local_arenas* s); #endif /* CAML_INTERNALS */ diff --git a/runtime4/caml/misc.h b/runtime4/caml/misc.h index fd8a7745850..66489a13ca7 100644 --- a/runtime4/caml/misc.h +++ b/runtime4/caml/misc.h @@ -29,6 +29,8 @@ #include #include +#include "camlatomic.h" + /* Deprecation warnings */ #if defined(__GNUC__) || defined(__clang__) diff --git a/runtime4/caml/mlvalues.h b/runtime4/caml/mlvalues.h index 139f3fd842d..8556655f423 100644 --- a/runtime4/caml/mlvalues.h +++ b/runtime4/caml/mlvalues.h @@ -60,6 +60,11 @@ extern "C" { typedef intnat value; typedef uintnat header_t; typedef uintnat mlsize_t; +typedef header_t reserved_t; /* Same role as reserved_t in runtime 5 (reserved + header bits). The mechanism for reserving bits + in runtime 4 is different than runtime 5: it's + the WITH_PROFINFO and PROFINFO_WIDTH macros. + */ typedef unsigned int tag_t; /* Actually, an unsigned char */ typedef uintnat color_t; typedef uintnat mark_t; @@ -103,14 +108,15 @@ For 64-bit architectures: +--------+-------+-----+ bits 63 10 9 8 7 0 -For x86-64 with Spacetime profiling: - P = PROFINFO_WIDTH (as set by "configure", currently 26 bits, giving a - maximum block size of just under 4Gb) +For 64-bit architectures with mixed block support enabled: + P = PROFINFO_WIDTH (as set by "configure", currently 8 bits) +----------------+----------------+-------------+ - | profiling info | wosize | color | tag | + | scannable size | wosize | color | tag | +----------------+----------------+-------------+ bits 63 (64-P) (63-P) 10 9 8 7 0 +Mixed block support uses the PROFINFO_WIDTH functionality +originally built for Spacetime profiling, hence the odd name. */ #define Tag_hd(hd) ((tag_t) ((hd) & 0xFF)) @@ -124,17 +130,97 @@ bits 63 (64-P) (63-P) 10 9 8 7 0 #ifdef WITH_PROFINFO #define PROFINFO_SHIFT (Gen_profinfo_shift(PROFINFO_WIDTH)) #define PROFINFO_MASK (Gen_profinfo_mask(PROFINFO_WIDTH)) -/* Use NO_PROFINFO to debug problems with profinfo macros */ -#define NO_PROFINFO 0xff +#define NO_PROFINFO 0 #define Hd_no_profinfo(hd) ((hd) & ~(PROFINFO_MASK << PROFINFO_SHIFT)) -#define Wosize_hd(hd) ((mlsize_t) ((Hd_no_profinfo(hd)) >> 10)) +#define Allocated_wosize_hd(hd) ((mlsize_t) ((Hd_no_profinfo(hd)) >> 10)) #define Profinfo_hd(hd) (Gen_profinfo_hd(PROFINFO_WIDTH, hd)) #else #define NO_PROFINFO 0 -#define Wosize_hd(hd) ((mlsize_t) ((hd) >> 10)) +#define Allocated_wosize_hd(hd) ((mlsize_t) ((hd) >> 10)) #define Profinfo_hd(hd) NO_PROFINFO #endif /* WITH_PROFINFO */ +/* Header bits reserved for mixed blocks */ + +#define Reserved_hd(hd) ((reserved_t)(Profinfo_hd(hd))) +#define Reserved_val(val) ((reserved_t)(Profinfo_val(val))) + +#define Is_mixed_block_reserved(res) (((reserved_t)(res)) > 0) + +/* Native code versions of mixed block macros. + + The scannable size of a block is how many fields are values as opposed + to flat floats/ints/etc. This is different than the (normal) size of a + block for mixed blocks. + + The runtime has several functions that traverse over the structure of + an OCaml value. (e.g. polymorphic comparison, GC marking/sweeping) + All of these traversals must be written to have one of the following + properties: + - it's known that the input can never be a mixed block, + - it raises an exception on mixed blocks, or + - it uses the scannable size (not the normal size) to figure out which + fields to recursively descend into. + + Otherwise, the traversal could attempt to recursively descend into + a flat field, which could segfault (or worse). +*/ + +#define Scannable_wosize_val_native(val) (Scannable_wosize_hd (Hd_val (val))) +#define Reserved_mixed_block_scannable_wosize_native(sz) (((mlsize_t)(sz)) + 1) +#define Mixed_block_scannable_wosize_reserved_native(res) \ + (((reserved_t)(res)) - 1) + +Caml_inline mlsize_t Scannable_wosize_reserved_native(reserved_t res, + mlsize_t sz) { + return + Is_mixed_block_reserved(res) + ? Mixed_block_scannable_wosize_reserved_native(res) + : sz; +} + +Caml_inline mlsize_t Scannable_wosize_hd_native(header_t hd) { + reserved_t res = Reserved_hd(hd); + return + Is_mixed_block_reserved(res) + ? Mixed_block_scannable_wosize_reserved_native(res) + : Allocated_wosize_hd(hd); +} + +/* Bytecode versions of mixed block macros. + + Bytecode always uses the size of the block as the scannable size. That's + because bytecode doesn't represent mixed records as mixed blocks. They're + "faux mixed blocks", which are regular blocks with a sentinel value set + in the header bits. +*/ + +#define Scannable_wosize_hd_byte(hd) (Allocated_wosize_hd (hd)) +#define Scannable_wosize_val_byte(val) (Allocated_wosize_hd (Hd_val (val))) +Caml_inline mlsize_t Scannable_wosize_reserved_byte(reserved_t res, + mlsize_t size) { + (void)res; + return size; +} + +/* Users should specify whether they want to use the bytecode or native + versions of these macros. Internally to the runtime, the NATIVE_CODE + macro lets us make that determination, so we can define suffixless + versions of the mixed block macros. +*/ +#ifdef CAML_INTERNALS +#ifdef NATIVE_CODE +#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_native(r, s) +#define Scannable_wosize_hd(hd) Scannable_wosize_hd_native(hd) +#define Scannable_wosize_val(val) Scannable_wosize_val_native(val) +#else +#define Faux_mixed_block_sentinel ((reserved_t) 0xff) +#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_byte(r, s) +#define Scannable_wosize_hd(hd) Scannable_wosize_hd_byte(hd) +#define Scannable_wosize_val(val) Scannable_wosize_val_byte(val) +#endif // NATIVE_CODE +#endif // CAML_INTERNALS + #define Hd_val(val) (((header_t *) (val)) [-1]) /* Also an l-value. */ #define Hd_op(op) (Hd_val (op)) /* Also an l-value. */ #define Hd_bp(bp) (Hd_val (bp)) /* Also an l-value. */ @@ -158,10 +244,6 @@ bits 63 (64-P) (63-P) 10 9 8 7 0 #define Max_wosize ((1 << 22) - 1) #endif /* ARCH_SIXTYFOUR */ -#define Wosize_val(val) (Wosize_hd (Hd_val (val))) -#define Wosize_op(op) (Wosize_val (op)) -#define Wosize_bp(bp) (Wosize_val (bp)) -#define Wosize_hp(hp) (Wosize_hd (Hd_hp (hp))) #define Whsize_wosize(sz) ((sz) + 1) #define Wosize_whsize(sz) ((sz) - 1) #define Wosize_bhsize(sz) ((sz) / sizeof (value) - 1) @@ -169,16 +251,49 @@ bits 63 (64-P) (63-P) 10 9 8 7 0 #define Wsize_bsize(sz) ((sz) / sizeof (value)) #define Bhsize_wosize(sz) (Bsize_wsize (Whsize_wosize (sz))) #define Bhsize_bosize(sz) ((sz) + sizeof (header_t)) -#define Bosize_val(val) (Bsize_wsize (Wosize_val (val))) -#define Bosize_op(op) (Bosize_val (Val_op (op))) -#define Bosize_bp(bp) (Bosize_val (Val_bp (bp))) -#define Bosize_hd(hd) (Bsize_wsize (Wosize_hd (hd))) -#define Whsize_hp(hp) (Whsize_wosize (Wosize_hp (hp))) -#define Whsize_val(val) (Whsize_hp (Hp_val (val))) -#define Whsize_bp(bp) (Whsize_val (Val_bp (bp))) -#define Whsize_hd(hd) (Whsize_wosize (Wosize_hd (hd))) -#define Bhsize_hp(hp) (Bsize_wsize (Whsize_hp (hp))) -#define Bhsize_hd(hd) (Bsize_wsize (Whsize_hd (hd))) + +/* flambda-backend: We rename the size macros to [Allocated_...] so that we're + forced to think about whether C code needs to updated for mixed blocks, which + have separate notions of scannable size and total size of an object, even for + scannable tags. We call an object's size (including possibly non-scannable + fields) its "allocated" size to document the fact that you shouldn't scan + fields on the basis of this size alone. +*/ + +#define Allocated_wosize_val(val) (Allocated_wosize_hd (Hd_val (val))) +#define Allocated_wosize_op(op) (Allocated_wosize_val (op)) +#define Allocated_wosize_bp(bp) (Allocated_wosize_val (bp)) +#define Allocated_wosize_hp(hp) (Allocated_wosize_hd (Hd_hp (hp))) +#define Allocated_bosize_val(val) (Bsize_wsize (Allocated_wosize_val (val))) +#define Allocated_bosize_op(op) (Allocated_bosize_val (Val_op (op))) +#define Allocated_bosize_bp(bp) (Allocated_bosize_val (Val_bp (bp))) +#define Allocated_bosize_hd(hd) (Bsize_wsize (Allocated_wosize_hd (hd))) +#define Allocated_whsize_hp(hp) (Whsize_wosize (Allocated_wosize_hp (hp))) +#define Allocated_whsize_val(val) (Allocated_whsize_hp (Hp_val (val))) +#define Allocated_whsize_bp(bp) (Allocated_whsize_val (Val_bp (bp))) +#define Allocated_whsize_hd(hd) (Whsize_wosize (Allocated_wosize_hd (hd))) +#define Allocated_bhsize_hp(hp) (Bsize_wsize (Allocated_whsize_hp (hp))) +#define Allocated_bhsize_hd(hd) (Bsize_wsize (Allocated_whsize_hd (hd))) + +#ifndef Hide_upstream_size_macros +#define Wosize_hd(hd) Allocated_wosize_hd(hd) +#define Wosize_val(val) Allocated_wosize_val(val) +#define Wosize_op(op) Allocated_wosize_op(op) +#define Wosize_bp(bp) Allocated_wosize_bp(bp) +#define Wosize_hp(hp) Allocated_wosize_hp(hp) +#define Bosize_val(val) Allocated_bosize_val(val) +#define Bosize_op(op) Allocated_bosize_op(op) +#define Bosize_bp(bp) Allocated_bosize_bp(bp) +#define Bosize_hd(hd) Allocated_bosize_hd(hd) +#define Whsize_hp(hp) Allocated_whsize_hp(hp) +#define Whsize_val(val) Allocated_whsize_val(val) +#define Whsize_bp(bp) Allocated_whsize_bp(bp) +#define Whsize_hd(hd) Allocated_whsize_hd(hd) +#define Bhsize_hp(hp) Allocated_bhsize_hp(hp) +#define Bhsize_hd(hd) Allocated_bhsize_hd(hd) +#endif // Hide_upstream_size_macros + +#define Scannable_wosize_hp(hp) (Scannable_wosize_hd (Hd_hp (hp))) #define Profinfo_val(val) (Profinfo_hd (Hd_val (val))) @@ -194,6 +309,14 @@ bits 63 (64-P) (63-P) 10 9 8 7 0 /* Also an l-value. */ #endif +#define Unsafe_store_tag_val(dst, val) (Tag_val(dst) = val) +/* Currently [Tag_val(dst)] is an lvalue, but in the future we may + have to break this property by using explicit (relaxed) atomics to + avoid undefined behaviors. [Unsafe_store_tag_val(dst, val)] is + provided to avoid direct uses of [Tag_val(dst)] on the left of an + assignment. The use of [Unsafe] emphasizes that the function + may result in unsafe data races in a concurrent setting. */ + /* The lowest tag for blocks containing no value. */ #define No_scan_tag 251 @@ -226,7 +349,7 @@ typedef opcode_t * code_t; with tag Closure_tag (see compact.c). */ #define Infix_tag 249 -#define Infix_offset_hd(hd) (Bosize_hd(hd)) +#define Infix_offset_hd(hd) (Allocated_bosize_hd(hd)) #define Infix_offset_val(v) Infix_offset_hd(Hd_val(v)) /* Another special case: objects */ @@ -270,10 +393,14 @@ CAMLextern value caml_get_public_method (value obj, value tag); + ((uintnat)(delta) << 1) + 1) #endif -/* This tag is used (with Forward_tag) to implement lazy values. +/* This tag is used (with Forcing_tag & Forward_tag) to implement lazy values. See major_gc.c and stdlib/lazy.ml. */ #define Lazy_tag 246 +/* This tag is used (with Lazy_tag & Forward_tag) to implement lazy values. + * See major_gc.c and stdlib/lazy.ml. */ +#define Forcing_tag 244 + /* Another special case: variants */ CAMLextern value caml_hash_variant(char const * tag); @@ -421,6 +548,22 @@ extern value caml_global_data; CAMLextern value caml_set_oo_id(value obj); +/* Users write this to assert that the ensuing C code is sensitive + to the current layout of mixed blocks in a way that's subject + to change in future compiler releases. We'll bump the version + number when we make a breaking change. For example, we currently + don't pack int32's efficiently, and we will want to someday. + + Users can write: + + Assert_mixed_block_layout_v1; + + (Hack: we define using _Static_assert rather than just an empty + definition so that users can write a semicolon, which is treated + better by C formatters.) + */ +#define Assert_mixed_block_layout_v1 _Static_assert(1, "") + /* Header for out-of-heap blocks. */ #define Caml_out_of_heap_header(wosize, tag) \ diff --git a/runtime4/caml/s.h.in b/runtime4/caml/s.h.in index 8e4efdcc728..16ea4b89080 100644 --- a/runtime4/caml/s.h.in +++ b/runtime4/caml/s.h.in @@ -70,6 +70,8 @@ #undef HAS_ISSETUGID +#undef HAS_STDATOMIC_H + /* 2. For the Unix library. */ #undef HAS_SOCKETS diff --git a/runtime4/caml/sys.h b/runtime4/caml/sys.h index 75b97818c10..3b2d537ac4f 100644 --- a/runtime4/caml/sys.h +++ b/runtime4/caml/sys.h @@ -24,6 +24,8 @@ extern "C" { #endif +CAMLextern char * caml_strerror(int errnum, char * buf, size_t buflen); + #define NO_ARG Val_int(0) CAMLnoreturn_start diff --git a/runtime4/caml/version.h.in b/runtime4/caml/version.h.in index bfe5d70957d..222974ff981 100644 --- a/runtime4/caml/version.h.in +++ b/runtime4/caml/version.h.in @@ -22,3 +22,11 @@ #undef OCAML_VERSION_EXTRA #undef OCAML_VERSION #undef OCAML_VERSION_STRING + +/* Macros defining differences between Jane Street's version of OCaml and + stock OCaml 5, which we will not port over to the OCaml 5 runtime. + */ + +#define JANE_STREET_HAS_OCAML_4_GC +#define JANE_STREET_HAS_OCAML_4_PRNG +#define JANE_STREET_HAS_NO_DOMAINS diff --git a/runtime4/caml/weak.h b/runtime4/caml/weak.h index 8192496f0e8..3970f98da8e 100644 --- a/runtime4/caml/weak.h +++ b/runtime4/caml/weak.h @@ -181,7 +181,8 @@ Caml_inline void caml_ephe_clean_partial (value v, value f = Forward_val (child); if (Is_block (f)) { if (!Is_in_value_area(f) || Tag_val (f) == Forward_tag - || Tag_val (f) == Lazy_tag || Tag_val (f) == Double_tag){ + || Tag_val (f) == Lazy_tag || Tag_val (f) == Forcing_tag + || Tag_val (f) == Double_tag){ /* Do not short-circuit the pointer. */ }else{ Field (v, i) = child = f; diff --git a/runtime4/compact.c b/runtime4/compact.c index a181be0ee45..a038f77a807 100644 --- a/runtime4/compact.c +++ b/runtime4/compact.c @@ -178,6 +178,7 @@ static void do_compaction (intnat new_allocation_policy) while (Is_gray_hd (q)) q = * dptr (q); wosz = Wosize_hd (q); + mlsize_t scannable_wosz = Scannable_wosize_hd (q); if (Is_white_hd (q)){ t = Tag_hd (q); CAMLassert (t != Infix_tag); @@ -188,7 +189,7 @@ static void do_compaction (intnat new_allocation_policy) }else{ first_field = 0; } - for (i = first_field; i < wosz; i++){ + for (i = first_field; i < scannable_wosz; i++){ invert_pointer_at ((word *) &Field (v,i)); } } @@ -272,6 +273,12 @@ static void do_compaction (intnat new_allocation_policy) if (Is_last_closinfo (closinfo)) break; arity = Arity_closinfo (closinfo); i += 2 + (arity != 0 && arity != 1); + /* If space exists between infix headers, skip it. This space is + padded with Val_long(0), which can't be confused with either an + infix header, or an inverted pointer. */ + while (Field(v, i) == Val_long(0)){ + ++i; + } CAMLassert (i < Start_env_closinfo (Closinfo_val (v))); /* Revert the inverted list for infix header at offset [i]. */ diff --git a/runtime4/compare.c b/runtime4/compare.c index 4a0eb6eac0a..d86a53f9d95 100644 --- a/runtime4/compare.c +++ b/runtime4/compare.c @@ -194,6 +194,11 @@ static intnat do_compare_val(struct compare_stack* stk, if (t1 != t2) return (intnat)t1 - (intnat)t2; } + if ( Is_mixed_block_reserved(Reserved_val(v1)) + || Is_mixed_block_reserved(Reserved_val(v2))) { + compare_free_stack(stk); + caml_invalid_argument("compare: mixed block value"); + } switch(t1) { case Forward_tag: { v1 = Forward_val (v1); diff --git a/runtime4/custom.c b/runtime4/custom.c index 3ff5462c344..37d88f48cdc 100644 --- a/runtime4/custom.c +++ b/runtime4/custom.c @@ -164,4 +164,5 @@ void caml_init_custom_operations(void) caml_register_custom_operations(&caml_nativeint_ops); caml_register_custom_operations(&caml_int64_ops); caml_register_custom_operations(&caml_ba_ops); + caml_register_custom_operations(&caml_float32_ops); } diff --git a/runtime4/domain.c b/runtime4/domain.c index f6b9ce8cdb8..b3b7edda9d6 100644 --- a/runtime4/domain.c +++ b/runtime4/domain.c @@ -21,7 +21,7 @@ CAMLexport caml_domain_state* Caml_state; -void caml_init_domain () +void caml_init_domain (void) { if (Caml_state != NULL) return; @@ -32,7 +32,7 @@ void caml_init_domain () caml_fatal_error ("cannot initialize domain state"); Caml_state->young_limit = NULL; - Caml_state->exception_pointer = NULL; + Caml_state->exn_handler = NULL; Caml_state->young_ptr = NULL; Caml_state->young_base = NULL; @@ -99,3 +99,116 @@ void caml_init_domain () Caml_state->checking_pointer_pc = NULL; #endif } + +/* OCaml 5 stdlib compatibility hooks */ +value (*caml_hook_mutex_new)(value unit) = NULL; +value (*caml_hook_mutex_lock)(value wrapper) = NULL; +value (*caml_hook_mutex_unlock)(value wrapper) = NULL; +value (*caml_hook_mutex_try_lock)(value wrapper) = NULL; +value (*caml_hook_condition_new)(value unit) = NULL; +value (*caml_hook_condition_wait)(value wcond, value wmut) = NULL; +value (*caml_hook_condition_signal)(value wrapper) = NULL; +value (*caml_hook_condition_broadcast)(value wrapper) = NULL; + +#include "caml/fail.h" + +CAMLprim value caml_ml_mutex_new(value unit) +{ + if (caml_hook_mutex_new == NULL) + caml_failwith("Must initialize systhreads library before using Mutex"); + + return (*caml_hook_mutex_new)(unit); +} + +CAMLprim value caml_ml_mutex_lock(value wrapper) +{ + if (caml_hook_mutex_lock == NULL) + caml_failwith("Must initialize systhreads library before using Mutex"); + + return (*caml_hook_mutex_lock)(wrapper); +} + +CAMLprim value caml_ml_mutex_unlock(value wrapper) +{ + if (caml_hook_mutex_unlock == NULL) + caml_failwith("Must initialize systhreads library before using Mutex"); + + return (*caml_hook_mutex_unlock)(wrapper); +} + +CAMLprim value caml_ml_mutex_try_lock(value wrapper) +{ + if (caml_hook_mutex_try_lock == NULL) + caml_failwith("Must initialize systhreads library before using Mutex"); + + return (*caml_hook_mutex_try_lock)(wrapper); +} + +CAMLprim value caml_ml_condition_new(value unit) +{ + if (caml_hook_condition_new == NULL) + caml_failwith("Must initialize systhreads library before using Condition"); + + return (*caml_hook_condition_new)(unit); +} + +CAMLprim value caml_ml_condition_wait(value wcond, value wmut) +{ + if (caml_hook_condition_wait == NULL) + caml_failwith("Must initialize systhreads library before using Condition"); + + return (*caml_hook_condition_wait)(wcond, wmut); +} + +CAMLprim value caml_ml_condition_signal(value wrapper) +{ + if (caml_hook_condition_signal == NULL) + caml_failwith("Must initialize systhreads library before using Condition"); + + return (*caml_hook_condition_signal)(wrapper); +} + +CAMLprim value caml_ml_condition_broadcast(value wrapper) +{ + if (caml_hook_condition_broadcast == NULL) + caml_failwith("Must initialize systhreads library before using Condition"); + + return (*caml_hook_condition_broadcast)(wrapper); +} + +/* Dummy implementations to enable [Stdlib.Domain] to link. */ + +CAMLprim value caml_recommended_domain_count(void) +{ + caml_failwith("Domains not supported on runtime4"); +} + +CAMLprim value caml_ml_domain_cpu_relax(void) +{ + caml_failwith("Domains not supported on runtime4"); +} + +CAMLprim value caml_init_domain_self(void) +{ + caml_failwith("Domains not supported on runtime4"); +} + +CAMLprim value caml_domain_spawn(void) +{ + caml_failwith("Domains not supported on runtime4"); +} + +CAMLprim value caml_ml_domain_id(void) +{ + caml_failwith("Domains not supported on runtime4"); +} + +CAMLprim value caml_domain_dls_set(void) +{ + caml_failwith("Domains not supported on runtime4"); +} + +CAMLprim value caml_domain_dls_get(void) +{ + caml_failwith("Domains not supported on runtime4"); +} diff --git a/runtime4/dune b/runtime4/dune index 2cf354911e6..77bde4faf05 100644 --- a/runtime4/dune +++ b/runtime4/dune @@ -23,7 +23,7 @@ callback.c weak.c finalise.c stacks.c dynlink.c backtrace_byt.c backtrace.c afl.c - bigarray.c eventlog.c misc.c) + bigarray.c prng.c eventlog.c misc.c domain.c float32.c) (action (with-stdout-to %{targets} (run %{dep:gen_primitives.sh})))) (rule diff --git a/runtime4/dynlink_nat.c b/runtime4/dynlink_nat.c index 88871cfc4f7..6b686e67248 100644 --- a/runtime4/dynlink_nat.c +++ b/runtime4/dynlink_nat.c @@ -46,7 +46,7 @@ static void *getsym(void *handle, const char *module, const char *name){ char *fullname = caml_stat_strconcat(2, module, name); void *sym; sym = caml_dlsym (handle, fullname); - /* printf("%s => %lx\n", fullname, (uintnat) sym); */ + /* printf("%s => %lx\n", fullname, (uintnat) sym); */ caml_stat_free(fullname); return sym; } @@ -104,30 +104,74 @@ CAMLprim value caml_natdynlink_open(value filename, value global) CAMLreturn(res); } -CAMLprim value caml_natdynlink_run(value handle_v, value symbol) { - CAMLparam2 (handle_v, symbol); - CAMLlocal1 (result); - void *sym,*sym2; +CAMLprim value caml_natdynlink_register(value handle_v, value symbols) { + CAMLparam2 (handle_v, symbols); + int i; + int nsymbols = Wosize_val(symbols); void* handle = Handle_val(handle_v); - const char *unit = String_val(symbol); - void (*entrypoint)(void); - - sym = getsym_exn(handle, unit, "__gc_roots"); + void** table; + + table = caml_stat_alloc(sizeof(void*) * nsymbols); + + for (i = 0; i < nsymbols; i++) { + const char* unit = String_val(Field(symbols, i)); + table[i] = getsym(handle, unit, "__gc_roots"); + if (table[i] == NULL) { + caml_stat_free(table); + caml_invalid_argument_value( + caml_alloc_sprintf("Dynlink: Missing gc_roots for %s", unit)); + } + } + for (int i = 0; i < nsymbols; i++) + caml_register_dyn_global(table[i]); /* [caml_register_dyn_global] can raise, so do it prior to registering frametables etc. */ - caml_register_dyn_global(sym); - sym = getsym_exn(handle, unit, "__frametable"); - caml_register_frametable(sym); + for (i = 0; i < nsymbols; i++) { + const char* unit = String_val(Field(symbols, i)); + table[i] = getsym(handle, unit, "__frametable"); + if (table[i] == NULL) { + caml_stat_free(table); + caml_invalid_argument_value( + caml_alloc_sprintf("Dynlink: Missing frametable for %s", unit)); + } + } + for (int i = 0; i < nsymbols; i++) + caml_register_frametable(table[i]); + + caml_stat_free(table); + + for (i = 0; i < nsymbols; i++) { + void* sym; + void* sym2; + const char* unit = String_val(Field(symbols, i)); + sym = getsym_exn(handle, unit, "__data_begin"); + sym2 = getsym_exn(handle, unit, "__data_end"); + caml_page_table_add(In_static_data, sym, sym2); + } + + for (i = 0; i < nsymbols; i++) { + const char* unit = String_val(Field(symbols, i)); + void* sym = getsym(handle, unit, "__code_begin"); + void* sym2 = getsym(handle, unit, "__code_end"); + /* Do not register empty code fragments */ + if (NULL != sym && NULL != sym2 && sym != sym2) { + caml_register_code_fragment((char *) sym, (char *) sym2, + DIGEST_LATER, NULL); + } + } + + CAMLreturn (Val_unit); +} - sym = getsym_exn(handle, unit, "__data_begin"); - sym2 = getsym_exn(handle, unit, "__data_end"); - caml_page_table_add(In_static_data, sym, sym2); +CAMLprim value caml_natdynlink_run(value handle_v, value symbol) { + CAMLparam2 (handle_v, symbol); + CAMLlocal1 (result); + void* handle = Handle_val(handle_v); + const char *unit; + void (*entrypoint)(void); - sym = getsym_exn(handle, unit, "__code_begin"); - sym2 = getsym_exn(handle, unit, "__code_end"); - caml_register_code_fragment((char *) sym, (char *) sym2, - DIGEST_LATER, NULL); + unit = String_val(symbol); if( caml_natdynlink_hook != NULL ) caml_natdynlink_hook(handle,unit); @@ -141,7 +185,7 @@ CAMLprim value caml_natdynlink_run(value handle_v, value symbol) { CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) { CAMLparam2 (filename, symbol); - CAMLlocal3 (res, v, handle_v); + CAMLlocal4 (res, v, handle_v, symbols); void *handle; char_os *p; @@ -159,10 +203,16 @@ CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) Store_field(res, 0, v); } else { handle_v = Val_handle(handle); + + symbols = caml_alloc_small(1, 0); + Field(symbols, 0) = symbol; + (void) caml_natdynlink_register(handle_v, symbols); + res = caml_alloc(1,0); v = caml_natdynlink_run(handle_v, symbol); Store_field(res, 0, v); } + CAMLreturn(res); } @@ -171,7 +221,16 @@ CAMLprim value caml_natdynlink_loadsym(value symbol) CAMLparam1 (symbol); CAMLlocal1 (sym); + /* Note that this can only be used for symbols which are valid OCaml + values, otherwise a naked pointer would be returned. */ + sym = (value) caml_globalsym(String_val(symbol)); if (!sym) caml_failwith(String_val(symbol)); CAMLreturn(sym); } + +CAMLprim value caml_natdynlink_existssym(value symbol) +{ + void* sym = caml_globalsym(String_val(symbol)); + return sym != NULL ? Val_true : Val_false; +} diff --git a/runtime4/eventlog.c b/runtime4/eventlog.c index 91fda1d78fe..ca73becddf4 100644 --- a/runtime4/eventlog.c +++ b/runtime4/eventlog.c @@ -120,7 +120,7 @@ static int64_t time_counter(void) #endif } -static void setup_evbuf() +static void setup_evbuf(void) { CAMLassert(!evbuf); evbuf = caml_stat_alloc_noexc(sizeof(*evbuf)); @@ -132,7 +132,7 @@ static void setup_evbuf() } #define OUTPUT_FILE_LEN 4096 -static void setup_eventlog_file() +static void setup_eventlog_file(void) { char_os output_file[OUTPUT_FILE_LEN]; char_os *eventlog_filename = NULL; @@ -239,7 +239,7 @@ static void teardown_eventlog(void) } } -void caml_eventlog_init() +void caml_eventlog_init(void) { char_os *toggle = caml_secure_getenv(T("OCAML_EVENTLOG_ENABLED")); @@ -330,7 +330,7 @@ void caml_ev_alloc(uint64_t sz) /* Note that this function does not trigger an actual disk flush, it just pushes events in the event buffer. */ -void caml_ev_alloc_flush() +void caml_ev_alloc_flush(void) { int i; @@ -345,7 +345,7 @@ void caml_ev_alloc_flush() } } -void caml_ev_flush() +void caml_ev_flush(void) { if (!Caml_state->eventlog_enabled) return; if (Caml_state->eventlog_paused) return; @@ -357,7 +357,7 @@ void caml_ev_flush() }; } -void caml_eventlog_disable() +void caml_eventlog_disable(void) { Caml_state->eventlog_enabled = 0; teardown_eventlog(); diff --git a/runtime4/extern.c b/runtime4/extern.c index 10c3df00af2..7910d83de20 100644 --- a/runtime4/extern.c +++ b/runtime4/extern.c @@ -686,8 +686,15 @@ Caml_inline mlsize_t extern_closure_up_to_env(value v) startenv = Start_env_closinfo(Closinfo_val(v)); i = 0; do { - /* The infix header */ - if (i > 0) extern_int(Long_val(Field(v, i++))); + if (i > 0) { + /* The padding before an infix header */ + while (Field(v, i) == Val_long(0)) { + extern_int(0); + i++; + } + /* The infix header */ + extern_int(Long_val(Field(v, i++))); + } /* The default entry point */ extern_code_pointer((char *) Field(v, i++)); /* The closure info. */ @@ -730,12 +737,17 @@ static void extern_rec(value v) header_t hd = Hd_val(v); tag_t tag = Tag_hd(hd); mlsize_t sz = Wosize_hd(hd); + reserved_t reserved = Reserved_hd(hd); + if (Is_mixed_block_reserved(reserved)) { + extern_invalid_argument("output_value: mixed block"); + break; + } if (tag == Forward_tag) { value f = Forward_val (v); if (Is_block (f) && (!Is_in_value_area(f) || Tag_val (f) == Forward_tag - || Tag_val (f) == Lazy_tag + || Tag_val (f) == Lazy_tag || Tag_val (f) == Forcing_tag #ifdef FLAT_FLOAT_ARRAY || Tag_val (f) == Double_tag #endif @@ -1274,16 +1286,19 @@ intnat reachable_words_once(value root, intnat identifier, value sizes_by_root_i } } if (tag < No_scan_tag) { - /* i is the position of the first field to traverse recursively */ + /* i is the position of the first field to traverse recursively, + and j is the position of the last such field. + */ uintnat i = tag == Closure_tag ? Start_env_closinfo(Closinfo_val(v)) : 0; - if (i < sz) { - if (i < sz - 1) { - /* Remember that we need to count fields i + 1 ... sz - 1 */ + uintnat j = Scannable_wosize_hd(hd); + if (i < j) { + if (i < j - 1) { + /* Remember that we need to count fields i + 1 ... j - 1 */ sp++; if (sp >= extern_stack_limit) sp = extern_resize_stack(sp); sp->v = &Field(v, i + 1); - sp->count = sz - i - 1; + sp->count = j - i - 1; } /* Continue with field i */ v = Field(v, i); @@ -1301,7 +1316,7 @@ intnat reachable_words_once(value root, intnat identifier, value sizes_by_root_i return size; } -void reachable_words_init() +void reachable_words_init(void) { obj_counter = 0; extern_flags = 0; @@ -1315,7 +1330,7 @@ void reachable_words_mark_root(value v) extern_record_location_with_data(v, h, RootUnprocessed); } -void reachable_words_cleanup() +void reachable_words_cleanup(void) { extern_free_stack(); extern_free_position_table(); diff --git a/runtime4/fail_byt.c b/runtime4/fail_byt.c index 5230f33b895..faca8ab92bd 100644 --- a/runtime4/fail_byt.c +++ b/runtime4/fail_byt.c @@ -37,6 +37,8 @@ CAMLexport void caml_raise(value v) CAMLassert(!Is_exception_result(v)); v = caml_process_pending_actions_with_root(v); + if (Is_exception_result(v)) + v = Extract_exception(v); Caml_state->exn_bucket = v; if (Caml_state->external_raise == NULL) caml_fatal_uncaught_exception(v); diff --git a/runtime4/fail_nat.c b/runtime4/fail_nat.c index 7f2759bce10..911c17406bf 100644 --- a/runtime4/fail_nat.c +++ b/runtime4/fail_nat.c @@ -58,10 +58,10 @@ CAMLnoreturn_start extern void caml_raise_exception (caml_domain_state* state, value bucket) CAMLnoreturn_end; -static void unwind_local_roots(char *exception_pointer) +static void unwind_local_roots(char *exn_handler) { while (Caml_state->local_roots != NULL && - (char *)Caml_state->local_roots < exception_pointer) + (char *)Caml_state->local_roots < exn_handler) { Caml_state->local_roots = Caml_state->local_roots->next; } @@ -77,12 +77,12 @@ void caml_raise(value v) a blocking call has a chance to interrupt the raising of EINTR */ v = caml_process_pending_actions_with_root(v); - if (Caml_state->exception_pointer == NULL) { + if (Caml_state->exn_handler == NULL) { caml_terminate_signals(); caml_fatal_uncaught_exception(v); } - unwind_local_roots(Caml_state->exception_pointer); + unwind_local_roots(Caml_state->exn_handler); caml_raise_exception(Caml_state, v); } @@ -102,7 +102,7 @@ CAMLno_asan void caml_raise_async(value v) caml_fatal_uncaught_exception(v); unwind_local_roots(Caml_state->async_exception_pointer); - Caml_state->exception_pointer = Caml_state->async_exception_pointer; + Caml_state->exn_handler = Caml_state->async_exception_pointer; Caml_state->raising_async_exn = 1; caml_raise_exception(Caml_state, v); } diff --git a/runtime4/finalise.c b/runtime4/finalise.c index 46e1b7dd4fa..98555c0fddf 100644 --- a/runtime4/finalise.c +++ b/runtime4/finalise.c @@ -152,11 +152,11 @@ static void generic_final_update (struct finalisable * final, int darken_value) } } -void caml_final_update_mark_phase (){ +void caml_final_update_mark_phase (void){ generic_final_update(&finalisable_first, /* darken_value */ 1); } -void caml_final_update_clean_phase (){ +void caml_final_update_clean_phase (void){ generic_final_update(&finalisable_last, /* darken_value */ 0); } @@ -227,7 +227,7 @@ void caml_final_do_roots (scanning_action f) /* Call caml_invert_root on the values of the finalisable set. This is called directly by the compactor. */ -void caml_final_invert_finalisable_values () +void caml_final_invert_finalisable_values (void) { uintnat i; @@ -247,7 +247,7 @@ void caml_final_invert_finalisable_values () /* Call [caml_oldify_one] on the closures and values of the recent set. This is called by the minor GC through [caml_oldify_local_roots]. */ -void caml_final_oldify_young_roots () +void caml_final_oldify_young_roots (void) { uintnat i; @@ -337,7 +337,7 @@ static void generic_final_minor_update (struct finalisable * final) minor heap when moved to major heap or moved them to the finalising set when dead. */ -void caml_final_update_minor_roots () +void caml_final_update_minor_roots (void) { generic_final_minor_update(&finalisable_last); } @@ -361,6 +361,7 @@ static void generic_final_register (struct finalisable *final, value f, value v) #ifdef FLAT_FLOAT_ARRAY || Tag_val (v) == Double_tag #endif + || Tag_val (v) == Forcing_tag || Tag_val (v) == Forward_tag) { caml_invalid_argument ("Gc.finalise"); } diff --git a/runtime4/fix_code.c b/runtime4/fix_code.c index 55840198670..a89b40ecb41 100644 --- a/runtime4/fix_code.c +++ b/runtime4/fix_code.c @@ -116,7 +116,7 @@ int* caml_init_opcode_nargs(void) /* Instructions with two operands */ l[APPTERM] = l[CLOSURE] = l[PUSHGETGLOBALFIELD] = - l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[C_CALLN] = + l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[MAKE_FAUX_MIXEDBLOCK] = l[C_CALLN] = l[BEQ] = l[BNEQ] = l[BLTINT] = l[BLEINT] = l[BGTINT] = l[BGEINT] = l[BULTINT] = l[BUGEINT] = l[GETPUBMET] = 2; @@ -158,7 +158,7 @@ void caml_thread_code (code_t code, asize_t len) #else -int* caml_init_opcode_nargs() +int* caml_init_opcode_nargs(void) { return NULL; } diff --git a/runtime4/float32.c b/runtime4/float32.c new file mode 100644 index 00000000000..ed882976b55 --- /dev/null +++ b/runtime4/float32.c @@ -0,0 +1,826 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ +/* Max Slater, Jane Street */ +/* */ +/* 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. */ +/* */ +/**************************************************************************/ + +#define CAML_INTERNALS + +/* Needed for uselocale */ +#define _XOPEN_SOURCE 700 + +/* Needed for strtof_l */ +#define _GNU_SOURCE + +#include +#include +#include +#include + +#include "caml/alloc.h" +#include "caml/bigarray.h" +#include "caml/fail.h" +#include "caml/custom.h" +#include "caml/float32.h" +#include "caml/memory.h" +#include "caml/intext.h" +#include "caml/mlvalues.h" + +#if defined(HAS_LOCALE) || defined(__MINGW32__) + +#if defined(HAS_LOCALE_H) || defined(__MINGW32__) +#include +#endif + +#if defined(HAS_XLOCALE_H) +#include +#endif + +#if defined(_MSC_VER) +#ifndef locale_t +#define locale_t _locale_t +#endif +#ifndef freelocale +#define freelocale _free_locale +#endif +#ifndef strtof_l +#define strtof_l _strtof_l +#endif +#endif + +#endif /* defined(HAS_LOCALE) */ + +CAML_STATIC_ASSERT(sizeof(float) == sizeof(int32_t)); + +#define Max_custom_array_wosize (Max_wosize - 1) +#define Max_unboxed_float32_array_wosize (Max_custom_array_wosize * (sizeof(intnat) / sizeof(float))) + +intnat caml_float32_compare_unboxed(float f, float g) +{ + /* If one or both of f and g is NaN, order according to the convention + NaN = NaN and NaN < x for all other floats x. */ + /* This branchless implementation is from GPR#164. + Note that [f == f] if and only if f is not NaN. + We expand each subresult of the expression to + avoid sign-extension on 64bit. GPR#2250. */ + intnat res = + (intnat)(f > g) - (intnat)(f < g) + (intnat)(f == f) - (intnat)(g == g); + return res; +} + +static int float32_cmp(value v1, value v2) +{ + return caml_float32_compare_unboxed(Float32_val(v1), Float32_val(v2)); +} + +static intnat float32_hash(value v) +{ + union { + float f; + uint32_t i; + } u; + uint32_t n; + u.f = Float32_val(v); n = u.i; + /* Normalize NaNs */ + if ((n & 0x7F800000) == 0x7F800000 && (n & 0x007FFFFF) != 0) { + n = 0x7F800001; + } + /* Normalize -0 into +0 */ + else if (n == 0x80000000) { + n = 0; + } + return n; +} + +static uintnat float32_deserialize(void *dst) +{ + *((float *)dst) = caml_deserialize_float_4(); + return 4; +} + +static void float32_serialize(value v, uintnat *bsize_32, + uintnat *bsize_64) +{ + caml_serialize_float_4(Float32_val(v)); + *bsize_32 = *bsize_64 = 4; +} + +static const struct custom_fixed_length float32_length = {4, 4}; + +CAMLexport struct custom_operations caml_float32_ops = { + "_f32", + custom_finalize_default, + float32_cmp, + float32_hash, + float32_serialize, + float32_deserialize, + custom_compare_ext_default, + &float32_length +}; + +CAMLexport value caml_copy_float32(float f) +{ + value res = caml_alloc_custom(&caml_float32_ops, 4, 0, 1); + Float32_val(res) = f; + return res; +} + +CAMLprim value caml_float32_of_float(value d) +{ + return caml_copy_float32((float)Double_val(d)); +} + +CAMLprim value caml_float_of_float32(value f) +{ + return caml_copy_double((double)Float32_val(f)); +} + +CAMLprim value caml_int_of_float32(value f) +{ + return Val_long((intnat)Float32_val(f)); +} + +CAMLprim value caml_float32_of_int(value n) +{ + return caml_copy_float32((float)Long_val(n)); +} + +CAMLprim value caml_neg_float32(value f) +{ + return caml_copy_float32(-Float32_val(f)); +} + +CAMLprim value caml_abs_float32(value f) +{ + return caml_copy_float32(fabsf(Float32_val(f))); +} + +CAMLprim value caml_add_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) + Float32_val(g)); +} + +CAMLprim value caml_sub_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) - Float32_val(g)); +} + +CAMLprim value caml_mul_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) * Float32_val(g)); +} + +CAMLprim value caml_div_float32(value f, value g) +{ + return caml_copy_float32(Float32_val(f) / Float32_val(g)); +} + +CAMLprim value caml_sqrt_float32(value f) +{ + return caml_copy_float32(sqrtf(Float32_val(f))); +} + +CAMLprim value caml_float32_compare(value vf, value vg) +{ + return Val_int(caml_float32_compare_unboxed(Float32_val(vf), Float32_val(vg))); +} + +#define DEFINE_NAN_CMP(op) \ + (value f, value g) \ + { \ + return Val_bool(Float32_val(f) op Float32_val(g)); \ + } + +CAMLprim value caml_eq_float32 DEFINE_NAN_CMP(==) +CAMLprim value caml_neq_float32 DEFINE_NAN_CMP(!=) +CAMLprim value caml_le_float32 DEFINE_NAN_CMP(<=) +CAMLprim value caml_lt_float32 DEFINE_NAN_CMP(<) +CAMLprim value caml_ge_float32 DEFINE_NAN_CMP(>=) +CAMLprim value caml_gt_float32 DEFINE_NAN_CMP(>) + +#define DEFINE_BYTE_UNOP(op) \ + (value f) \ + { \ + return caml_copy_float32(op(Float32_val(f))); \ + } + +CAMLprim value caml_sqrt_float32_bytecode DEFINE_BYTE_UNOP(sqrtf) +CAMLprim value caml_cbrt_float32_bytecode DEFINE_BYTE_UNOP(cbrtf) +CAMLprim value caml_exp_float32_bytecode DEFINE_BYTE_UNOP(expf) +CAMLprim value caml_exp2_float32_bytecode DEFINE_BYTE_UNOP(exp2f) +CAMLprim value caml_log_float32_bytecode DEFINE_BYTE_UNOP(logf) +CAMLprim value caml_log10_float32_bytecode DEFINE_BYTE_UNOP(log10f) +CAMLprim value caml_log2_float32_bytecode DEFINE_BYTE_UNOP(log2f) +CAMLprim value caml_expm1_float32_bytecode DEFINE_BYTE_UNOP(expm1f) +CAMLprim value caml_log1p_float32_bytecode DEFINE_BYTE_UNOP(log1pf) +CAMLprim value caml_cos_float32_bytecode DEFINE_BYTE_UNOP(cosf) +CAMLprim value caml_sin_float32_bytecode DEFINE_BYTE_UNOP(sinf) +CAMLprim value caml_tan_float32_bytecode DEFINE_BYTE_UNOP(tanf) +CAMLprim value caml_acos_float32_bytecode DEFINE_BYTE_UNOP(acosf) +CAMLprim value caml_asin_float32_bytecode DEFINE_BYTE_UNOP(asinf) +CAMLprim value caml_atan_float32_bytecode DEFINE_BYTE_UNOP(atanf) +CAMLprim value caml_cosh_float32_bytecode DEFINE_BYTE_UNOP(coshf) +CAMLprim value caml_sinh_float32_bytecode DEFINE_BYTE_UNOP(sinhf) +CAMLprim value caml_tanh_float32_bytecode DEFINE_BYTE_UNOP(tanhf) +CAMLprim value caml_acosh_float32_bytecode DEFINE_BYTE_UNOP(acoshf) +CAMLprim value caml_asinh_float32_bytecode DEFINE_BYTE_UNOP(asinhf) +CAMLprim value caml_atanh_float32_bytecode DEFINE_BYTE_UNOP(atanhf) +CAMLprim value caml_erf_float32_bytecode DEFINE_BYTE_UNOP(erff) +CAMLprim value caml_erfc_float32_bytecode DEFINE_BYTE_UNOP(erfcf) +CAMLprim value caml_trunc_float32_bytecode DEFINE_BYTE_UNOP(truncf) +CAMLprim value caml_round_float32_bytecode DEFINE_BYTE_UNOP(roundf) +CAMLprim value caml_ceil_float32_bytecode DEFINE_BYTE_UNOP(ceilf) +CAMLprim value caml_floor_float32_bytecode DEFINE_BYTE_UNOP(floorf) + +#define DEFINE_BYTE_BINOP(op) \ + (value f, value g) \ + { \ + return caml_copy_float32(op(Float32_val(f),Float32_val(g))); \ + } + +CAMLprim value caml_atan2_float32_bytecode DEFINE_BYTE_BINOP(atan2f) +CAMLprim value caml_hypot_float32_bytecode DEFINE_BYTE_BINOP(hypotf) +CAMLprim value caml_nextafter_float32_bytecode DEFINE_BYTE_BINOP(nextafterf) +CAMLprim value caml_copysign_float32_bytecode DEFINE_BYTE_BINOP(copysignf) +CAMLprim value caml_fmod_float32_bytecode DEFINE_BYTE_BINOP(fmodf) +CAMLprim value caml_power_float32_bytecode DEFINE_BYTE_BINOP(powf) + +CAMLprim value caml_fma_float32_bytecode(value f, value g, value h) +{ + return caml_copy_float32(fmaf(Float32_val(f), Float32_val(g), Float32_val(h))); +} + +float caml_float32_of_int64(int64_t i) { + return (float)i; +} + +CAMLprim value caml_float32_of_int64_bytecode(value i) { + return caml_copy_float32(caml_float32_of_int64(Int64_val(i))); +} + +int64_t caml_float32_to_int64(float f) { + return (int64_t)f; +} + +CAMLprim value caml_float32_to_int64_bytecode(value f) { + return caml_copy_int64(caml_float32_to_int64(Float32_val(f))); +} + +float caml_float32_of_bits(int32_t bits) +{ + union { float f; int32_t i; } u; + u.i = bits; + return u.f; +} + +CAMLprim value caml_float32_of_bits_bytecode(value bits) +{ + return caml_copy_float32(caml_float32_of_bits(Int32_val(bits))); +} + +int32_t caml_float32_to_bits(float f) +{ + union { float f; int32_t i; } u; + u.f = f; + return u.i; +} + +CAMLprim value caml_float32_to_bits_bytecode(value f) +{ + return caml_copy_int32(caml_float32_to_bits(Float32_val(f))); +} + +float caml_ldexp_float32(float f, intnat i) +{ + return ldexpf(f, (int)i); +} + +CAMLprim value caml_ldexp_float32_bytecode(value f, value i) +{ + return caml_copy_float32(caml_ldexp_float32(Float32_val(f), Int_val(i))); +} + +float caml_sse_float32_min(float x, float y) { + return x < y ? x : y; +} + +CAMLprim value caml_sse_float32_min_bytecode(value x, value y) { + return Float32_val(x) < Float32_val(y) ? x : y; +} + +float caml_sse_float32_max(float x, float y) { + return x > y ? x : y; +} + +CAMLprim value caml_sse_float32_max_bytecode(value x, value y) { + return Float32_val(x) > Float32_val(y) ? x : y; +} + +int64_t caml_sse_cast_float32_int64(float f) +{ + return llrintf(f); +} + +CAMLprim value caml_sse_cast_float32_int64_bytecode(value f) +{ + return caml_copy_int64(caml_sse_cast_float32_int64(Float32_val(f))); +} + +#define ROUND_NEG_INF 0x9 +#define ROUND_POS_INF 0xA +#define ROUND_ZERO 0xB +#define ROUND_CURRENT 0xC + +float caml_sse41_float32_round(int mode, float f) { + switch(mode) { + case ROUND_NEG_INF: return floorf(f); + case ROUND_POS_INF: return ceilf(f); + case ROUND_ZERO: return truncf(f); + case ROUND_CURRENT: return rintf(f); + default: caml_fatal_error("Unknown rounding mode."); + } +} + +CAMLprim value caml_sse41_float32_round_bytecode(value mode, value f) { + return caml_copy_float32(caml_sse41_float32_round(Int_val(mode), Float32_val(f))); +} + +enum { FP_normal, FP_subnormal, FP_zero, FP_infinite, FP_nan }; + +value caml_classify_float32(float vf) +{ + union { float f; uint32_t i; } u; + uint32_t n; + uint32_t e; + u.f = vf; + n = u.i << 1; /* shift sign bit off */ + if (n == 0) return Val_int(FP_zero); + e = n >> 24; /* extract exponent */ + if (e == 0) return Val_int(FP_subnormal); + if (e == 0xff) { + if (n << 8 == 0) /* shift exponent off */ + return Val_int(FP_infinite); + else + return Val_int(FP_nan); + } + return Val_int(FP_normal); +} + +CAMLprim value caml_classify_float32_bytecode(value f) +{ + return caml_classify_float32(Float32_val(f)); +} + +value caml_signbit_float32(float f) +{ + return Val_bool(signbit(f)); +} + +CAMLprim value caml_signbit_float32_bytecode(value f) +{ + return caml_signbit_float32(Float32_val(f)); +} + +CAMLprim value caml_frexp_float32(value f) +{ + CAMLparam0 (); + CAMLlocal1 (mantissa); + value res; + int exponent; + + mantissa = caml_copy_float32(frexpf(Float32_val(f), &exponent)); + res = caml_alloc_small(2, 0); + Field(res, 0) = mantissa; + Field(res, 1) = Val_int(exponent); + CAMLreturn (res); +} + +CAMLprim value caml_modf_float32(value f) +{ + CAMLparam0 (); + CAMLlocal2 (quo, rem); + value res; + float frem; + + quo = caml_copy_float32(modff(Float32_val(f), &frem)); + rem = caml_copy_float32(frem); + res = caml_alloc_small(2, 0); + Field(res, 0) = quo; + Field(res, 1) = rem; + CAMLreturn (res); +} + +/* The functions on bytes, strings, and bigstrings (ba_uint8) are only used + in bytecode builds. Otherwise, the flambda-backend compiler translates + the corresponding primitives directly to load/store instructions. */ + +CAMLprim value caml_string_getf32(value str, value index) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(index); + if (idx < 0 || idx + 3 >= caml_string_length(str)) caml_array_bound_error(); + float res = *(float*)&Byte_u(str, idx); + return caml_copy_float32(res); +#endif +} + +CAMLprim value caml_bytes_getf32(value str, value index) +{ + return caml_string_getf32(str, index); +} + +CAMLprim value caml_bytes_setf32(value str, value index, value newval) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(index); + if (idx < 0 || idx + 3 >= caml_string_length(str)) caml_array_bound_error(); + *(float*)&Byte_u(str, idx) = Float32_val(newval); + return Val_unit; +#endif +} + +CAMLprim value caml_ba_uint8_getf32(value vb, value vind) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(vind); + struct caml_ba_array * b = Caml_ba_array_val(vb); + if (idx < 0 || idx >= b->dim[0] - 3) caml_array_bound_error(); + float res = *(float*)&Byte_u(b->data, idx); + return caml_copy_float32(res); +#endif +} + +CAMLprim value caml_ba_uint8_setf32(value vb, value vind, value newval) +{ +#ifdef ARCH_BIG_ENDIAN + caml_failwith( + "Raw float32 load/store is not supported on big-endian architectures."); +#else + intnat idx = Long_val(vind); + struct caml_ba_array * b = Caml_ba_array_val(vb); + if (idx < 0 || idx >= b->dim[0] - 3) caml_array_bound_error(); + *(float*)&Byte_u(b->data, idx) = Float32_val(newval); + return Val_unit; +#endif +} + +/* Defined in bigarray.c */ +CAMLextern intnat caml_ba_offset(struct caml_ba_array * b, intnat * index); + +static value caml_ba_float32_get_aux(value vb, value * vind, int nind) +{ + struct caml_ba_array * b = Caml_ba_array_val(vb); + intnat index[CAML_BA_MAX_NUM_DIMS]; + int i; + intnat offset; + + /* Check number of indices = number of dimensions of array + (maybe not necessary if ML typing guarantees this) */ + if (nind != b->num_dims) + caml_invalid_argument("Float32.Bigarray.get: wrong number of indices"); + /* Compute offset and check bounds */ + for (i = 0; i < b->num_dims; i++) index[i] = Long_val(vind[i]); + offset = caml_ba_offset(b, index); + /* Perform read */ + switch ((b->flags) & CAML_BA_KIND_MASK) { + case CAML_BA_FLOAT32: + return caml_copy_float32(((float *) b->data)[offset]); + default: + caml_invalid_argument("Float32.Bigarray.get: wrong kind"); + } +} + +CAMLprim value caml_ba_float32_get_1(value vb, value vind1) +{ + return caml_ba_float32_get_aux(vb, &vind1, 1); +} + +CAMLprim value caml_ba_float32_get_2(value vb, value vind1, value vind2) +{ + value vind[2]; + vind[0] = vind1; + vind[1] = vind2; + return caml_ba_float32_get_aux(vb, vind, 2); +} + +CAMLprim value caml_ba_float32_get_3(value vb, value vind1, value vind2, + value vind3) +{ + value vind[3]; + vind[0] = vind1; + vind[1] = vind2; + vind[2] = vind3; + return caml_ba_float32_get_aux(vb, vind, 3); +} + +static value caml_ba_float32_set_aux(value vb, value * vind, intnat nind, + value newval) +{ + struct caml_ba_array * b = Caml_ba_array_val(vb); + intnat index[CAML_BA_MAX_NUM_DIMS]; + int i; + intnat offset; + + /* Check number of indices = number of dimensions of array + (maybe not necessary if ML typing guarantees this) */ + if (nind != b->num_dims) + caml_invalid_argument("Float32.Bigarray.set: wrong number of indices"); + /* Compute offset and check bounds */ + for (i = 0; i < b->num_dims; i++) index[i] = Long_val(vind[i]); + offset = caml_ba_offset(b, index); + /* Perform write */ + switch (b->flags & CAML_BA_KIND_MASK) { + case CAML_BA_FLOAT32: + ((float *) b->data)[offset] = Float32_val(newval); + break; + default: + caml_invalid_argument("Float32.Bigarray.get: wrong kind"); + } + return Val_unit; +} + +CAMLprim value caml_ba_float32_set_1(value vb, value vind1, value newval) +{ + return caml_ba_float32_set_aux(vb, &vind1, 1, newval); +} + +CAMLprim value caml_ba_float32_set_2(value vb, value vind1, value vind2, + value newval) +{ + value vind[2]; + vind[0] = vind1; + vind[1] = vind2; + return caml_ba_float32_set_aux(vb, vind, 2, newval); +} + +CAMLprim value caml_ba_float32_set_3(value vb, value vind1, value vind2, + value vind3, value newval) +{ + value vind[3]; + vind[0] = vind1; + vind[1] = vind2; + vind[2] = vind3; + return caml_ba_float32_set_aux(vb, vind, 3, newval); +} + +/* + OCaml runtime itself doesn't call setlocale, i.e. it is using + standard "C" locale by default, but it is possible that + third-party code loaded into process does. +*/ +#ifdef HAS_LOCALE +extern locale_t caml_locale; +#endif + +#if defined(_MSC_VER) || defined(__MINGW32__) +/* there is no analogue to uselocale in MSVC so just set locale for thread */ +#define USE_LOCALE setlocale(LC_NUMERIC,"C") +#define RESTORE_LOCALE do {} while(0) +#elif defined(HAS_LOCALE) +#define USE_LOCALE locale_t saved_locale = uselocale(caml_locale) +#define RESTORE_LOCALE uselocale(saved_locale) +#else +#define USE_LOCALE do {} while(0) +#define RESTORE_LOCALE do {} while(0) +#endif + +CAMLprim value caml_format_float32(value fmt, value arg) +{ + /* See caml_format_float */ + value res; + float f = Float32_val(arg); + +#ifdef HAS_BROKEN_PRINTF + if (isfinite(f)) { +#endif + USE_LOCALE; + res = caml_alloc_sprintf(String_val(fmt), f); + RESTORE_LOCALE; +#ifdef HAS_BROKEN_PRINTF + } else { + if (isnan(f)) { + res = caml_copy_string("nan"); + } else { + if (f > 0) + res = caml_copy_string("inf"); + else + res = caml_copy_string("-inf"); + } + } +#endif + return res; +} + +static int caml_float32_of_hex(const char * s, const char * end, float * res) +{ + /* See caml_float_of_hex */ + int64_t m = 0; /* the mantissa - top 60 bits at most */ + int n_bits = 0; /* total number of bits read */ + int m_bits = 0; /* number of bits in mantissa */ + int x_bits = 0; /* number of bits after mantissa */ + int dec_point = -1; /* bit count corresponding to decimal point */ + /* -1 if no decimal point seen */ + int exp = 0; /* exponent */ + char * p; /* for converting the exponent */ + float f; + + while (s < end) { + char c = *s++; + switch (c) { + case '.': + if (dec_point >= 0) return -1; /* multiple decimal points */ + dec_point = n_bits; + break; + case 'p': case 'P': { + long e; + if (*s == 0) return -1; /* nothing after exponent mark */ + e = strtol(s, &p, 10); + if (p != end) return -1; /* ill-formed exponent */ + /* Handle exponents larger than int by returning 0/infinity directly. + Mind that INT_MIN/INT_MAX are included in the test so as to capture + the overflow case of strtol on Win64 -- long and int have the same + size there. */ + if (e <= INT_MIN) { + *res = 0.f; + return 0; + } + else if (e >= INT_MAX) { + *res = m == 0 ? 0.f : HUGE_VALF; + return 0; + } + /* regular exponent value */ + exp = e; + s = p; /* stop at next loop iteration */ + break; + } + default: { /* Nonzero digit */ + int d; + if (c >= '0' && c <= '9') d = c - '0'; + else if (c >= 'A' && c <= 'F') d = c - 'A' + 10; + else if (c >= 'a' && c <= 'f') d = c - 'a' + 10; + else return -1; /* bad digit */ + n_bits += 4; + if (d == 0 && m == 0) break; /* leading zeros are skipped */ + if (m_bits < 60) { + /* There is still room in m. Add this digit to the mantissa. */ + m = (m << 4) + d; + m_bits += 4; + } else { + /* We've already collected 60 significant bits in m. + Now all we care about is whether there is a nonzero bit + after. In this case, round m to odd so that the later + rounding of m to FP produces the correct result. */ + if (d != 0) m |= 1; /* round to odd */ + x_bits += 4; + } + break; + } + } + } + if (n_bits == 0) return -1; + /* Convert mantissa to FP. We use a signed conversion because we can + (m has 60 bits at most) and because it is faster + on several architectures. */ + f = (float) (int64_t) m; + /* Adjust exponent to take decimal point and extra digits into account */ + { + int adj = x_bits; + if (dec_point >= 0) adj = adj + (dec_point - n_bits); + /* saturated addition exp + adj */ + if (adj > 0 && exp > INT_MAX - adj) + exp = INT_MAX; + else if (adj < 0 && exp < INT_MIN - adj) + exp = INT_MIN; + else + exp = exp + adj; + } + /* Apply exponent if needed */ + if (exp != 0) f = ldexpf(f, exp); + /* Done! */ + *res = f; + return 0; +} + +CAMLprim value caml_float32_of_string(value vs) +{ + /* See caml_float_of_string */ + char parse_buffer[64]; + char * buf, * dst, * end; + const char *src; + mlsize_t len; + int sign; + float f; + + /* Remove '_' characters before conversion */ + len = caml_string_length(vs); + buf = len < sizeof(parse_buffer) ? parse_buffer : caml_stat_alloc(len + 1); + src = String_val(vs); + dst = buf; + while (len--) { + char c = *src++; + if (c != '_') *dst++ = c; + } + *dst = 0; + if (dst == buf) goto error; + /* Check for hexadecimal FP constant */ + src = buf; + sign = 1; + if (*src == '-') { sign = -1; src++; } + else if (*src == '+') { src++; }; + if (src[0] == '0' && (src[1] == 'x' || src[1] == 'X')) { + /* Convert using our hexadecimal FP parser */ + if (caml_float32_of_hex(src + 2, dst, &f) == -1) goto error; + if (sign < 0) f = -f; + } else { + /* Convert using strtof, which is available when strtod is. */ +#if defined(HAS_STRTOD_L) && defined(HAS_LOCALE) + f = strtof_l((const char *) buf, &end, caml_locale); +#else + USE_LOCALE; + f = strtof((const char *) buf, &end); + RESTORE_LOCALE; +#endif /* HAS_STRTOD_L */ + if (end != dst) goto error; + } + if (buf != parse_buffer) caml_stat_free(buf); + return caml_copy_float32(f); + error: + if (buf != parse_buffer) caml_stat_free(buf); + caml_failwith("float32_of_string"); + return Val_unit; /* not reached */ +} + +/* Defined in array.c */ + +CAMLextern int caml_unboxed_array_no_polymorphic_compare(value v1, value v2); +CAMLextern intnat caml_unboxed_array_no_polymorphic_hash(value v); +CAMLextern void caml_unboxed_array_serialize(value v, uintnat* bsize_32, uintnat* bsize_64); +CAMLextern uintnat caml_unboxed_array_deserialize(void* dst); +CAMLextern value caml_make_vect(value len, value init); + +CAMLexport struct custom_operations caml_unboxed_float32_array_ops[2] = { + { "_unboxed_float32_even_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, + { "_unboxed_float32_odd_array", + custom_finalize_default, + caml_unboxed_array_no_polymorphic_compare, + caml_unboxed_array_no_polymorphic_hash, + caml_unboxed_array_serialize, + caml_unboxed_array_deserialize, + custom_compare_ext_default, + custom_fixed_length_default }, +}; + +CAMLprim value caml_make_unboxed_float32_vect(value len) +{ + /* This is only used on 64-bit targets. */ + + mlsize_t num_elements = Long_val(len); + if (num_elements > Max_unboxed_float32_array_wosize) caml_invalid_argument("Array.make"); + + /* [num_fields] does not include the custom operations field. */ + mlsize_t num_fields = num_elements / 2 + num_elements % 2; + + return caml_alloc_custom(&caml_unboxed_float32_array_ops[num_elements % 2], + num_fields * sizeof(value), 0, 0); +} + +CAMLprim value caml_make_unboxed_float32_vect_bytecode(value len) +{ + return caml_make_vect(len, caml_copy_float32(0.0f)); +} + +CAMLprim value caml_unboxed_float32_vect_blit(value a1, value ofs1, value a2, + value ofs2, value n) +{ + // Need to skip the custom_operations field + memmove((float *)((uintnat *)a2 + 1) + Long_val(ofs2), + (float *)((uintnat *)a1 + 1) + Long_val(ofs1), + Long_val(n) * sizeof(float)); + return Val_unit; +} diff --git a/runtime4/gc_ctrl.c b/runtime4/gc_ctrl.c index 7c6c76a4d08..eed64b7c19a 100644 --- a/runtime4/gc_ctrl.c +++ b/runtime4/gc_ctrl.c @@ -116,7 +116,7 @@ static void check_block (header_t *hp) /* For closures, skip to the start of the scannable environment */ if (tag == Closure_tag) start = Start_env_closinfo(Closinfo_val(v)); else start = 0; - for (i = start; i < Wosize_hp (hp); i++){ + for (i = start; i < Scannable_wosize_hd (Hd_hp (hp)); i++){ f = Field (v, i); if (Is_block (f) && Is_in_heap (f)){ check_head (f); @@ -329,7 +329,7 @@ CAMLprim value caml_gc_quick_stat(value v) CAMLreturn (res); } -double caml_gc_minor_words_unboxed() +double caml_gc_minor_words_unboxed(void) { return (Caml_state->stat_minor_words + (double) (Caml_state->young_alloc_end - Caml_state->young_ptr)); @@ -409,7 +409,7 @@ static intnat norm_minsize (intnat s) if (s > Minor_heap_max) s = Minor_heap_max; /* PR#9128 : Make sure the minor heap occupies an integral number of pages, so that no page contains both bytecode and OCaml - values. This would confuse, e.g., caml_hash. */ + values. This would confuse, e.g., caml_hash_exn. */ s = (s + page_wsize - 1) / page_wsize * page_wsize; return s; } diff --git a/runtime4/gen_primitives.sh b/runtime4/gen_primitives.sh index 45fc5038ad2..c4ae3e27d36 100755 --- a/runtime4/gen_primitives.sh +++ b/runtime4/gen_primitives.sh @@ -25,7 +25,7 @@ export LC_ALL=C alloc array compare extern floats gc_ctrl hash intern interp ints io \ lexing md5 meta memprof obj parsing signals str sys callback weak \ finalise stacks dynlink backtrace_byt backtrace afl \ - bigarray eventlog misc + bigarray eventlog misc domain prng float32 do sed -n -e 's/^CAMLprim value \([a-z0-9_][a-z0-9_]*\).*/\1/p' "$prim.c" done diff --git a/runtime4/hash.c b/runtime4/hash.c index f33634c2274..0f9aaf2fb75 100644 --- a/runtime4/hash.c +++ b/runtime4/hash.c @@ -24,6 +24,7 @@ #include "caml/custom.h" #include "caml/memory.h" #include "caml/hash.h" +#include "caml/fail.h" /* The implementation based on MurmurHash 3, https://github.com/aappleby/smhasher/ */ @@ -181,7 +182,13 @@ CAMLexport uint32_t caml_hash_mix_string(uint32_t h, value s) /* The generic hash function */ -CAMLprim value caml_hash(value count, value limit, value seed, value obj) +/* Internally to Jane Street, we have renamed [caml_hash] to [caml_hash_exn] + to suggest that calling it could raise. (E.g. it raises on mixed blocks.) + As such, we've removed [@@noalloc] from the OCaml [external] that references + this C binding, and would likewise need to remove [@@noalloc] from any + other [external] formerly bound to [caml_hash]. +*/ +CAMLprim value caml_hash_exn(value count, value limit, value seed, value obj) { value queue[HASH_QUEUE_SIZE]; /* Queue of values to examine */ intnat rd; /* Position of first value in queue */ @@ -283,6 +290,9 @@ CAMLprim value caml_hash(value count, value limit, value seed, value obj) } #endif default: + if (Is_mixed_block_reserved(Reserved_val(v))) { + caml_invalid_argument("hash: mixed block value"); + } /* Mix in the tag and size, but do not count this towards [num] */ h = caml_hash_mix_uint32(h, Whitehd_hd(Hd_val(v))); /* Copy fields into queue, not exceeding the total size [sz] */ @@ -301,6 +311,15 @@ CAMLprim value caml_hash(value count, value limit, value seed, value obj) return Val_int(h & 0x3FFFFFFFU); } +CAMLprim value caml_string_hash(value seed, value string) +{ + uint32_t h; + h = Int_val(seed); + h = caml_hash_mix_string (h, string); + FINAL_MIX(h); + return Val_int(h & 0x3FFFFFFFU); +} + /* Hashing variant tags */ CAMLexport value caml_hash_variant(char const * tag) diff --git a/runtime4/i386.S b/runtime4/i386.S index 470bb0bb143..a5bfa494e9e 100644 --- a/runtime4/i386.S +++ b/runtime4/i386.S @@ -86,7 +86,7 @@ #define DOMAIN_STATE(c_type, name) \ .equ domain_field_caml_##name, domain_curr_field ; \ .set domain_curr_field, domain_curr_field + 1 -#include "../runtime/caml/domain_state.tbl" +#include "../runtime4/caml/domain_state.tbl" #undef DOMAIN_STATE #define CAML_STATE(var,reg) 8*domain_field_caml_##var(reg) @@ -285,15 +285,15 @@ LBL(106): /* Build an exception handler */ pushl $ LBL(108); CFI_ADJUST(4) ALIGN_STACK(8) - pushl CAML_STATE(exception_pointer, %edi); CFI_ADJUST(4) - movl %esp, CAML_STATE(exception_pointer, %edi) + pushl CAML_STATE(exn_handler, %edi); CFI_ADJUST(4) + movl %esp, CAML_STATE(exn_handler, %edi) movl %esp, CAML_STATE(async_exception_pointer, %edi) /* Call the OCaml code */ call *%esi LBL(107): movl G(Caml_state), %edi /* Pop the exception handler */ - popl CAML_STATE(exception_pointer, %edi); CFI_ADJUST(-4) + popl CAML_STATE(exn_handler, %edi); CFI_ADJUST(-4) addl $12, %esp ; CFI_ADJUST(-12) LBL(109): movl G(Caml_state), %edi /* Reload for LBL(109) entry */ @@ -325,13 +325,13 @@ FUNCTION(caml_raise_exn) movl G(Caml_state), %ebx testl $1, CAML_STATE(backtrace_active, %ebx) jne LBL(110) - movl CAML_STATE(exception_pointer, %ebx), %esp - popl CAML_STATE(exception_pointer, %ebx); CFI_ADJUST(-4) + movl CAML_STATE(exn_handler, %ebx), %esp + popl CAML_STATE(exn_handler, %ebx); CFI_ADJUST(-4) UNDO_ALIGN_STACK(8) ret LBL(110): movl %eax, %esi /* Save exception bucket in esi */ - movl CAML_STATE(exception_pointer, %ebx), %edi /* SP of handler */ + movl CAML_STATE(exn_handler, %ebx), %edi /* SP of handler */ movl 0(%esp), %eax /* PC of raise */ leal 4(%esp), %edx /* SP of raise */ ALIGN_STACK(12) @@ -342,7 +342,7 @@ LBL(110): call G(caml_stash_backtrace) movl %esi, %eax /* Recover exception bucket */ movl %edi, %esp - popl CAML_STATE(exception_pointer, %ebx); CFI_ADJUST(-4) + popl CAML_STATE(exn_handler, %ebx); CFI_ADJUST(-4) UNDO_ALIGN_STACK(8) ret CFI_ENDPROC @@ -356,15 +356,15 @@ FUNCTION(caml_raise_exception) testl $1, CAML_STATE(backtrace_active, %ebx) jne LBL(112) movl 8(%esp), %eax - movl CAML_STATE(exception_pointer, %ebx), %esp - popl CAML_STATE(exception_pointer, %ebx); CFI_ADJUST(-4) + movl CAML_STATE(exn_handler, %ebx), %esp + popl CAML_STATE(exn_handler, %ebx); CFI_ADJUST(-4) UNDO_ALIGN_STACK(8) ret LBL(112): movl 8(%esp), %esi /* Save exception bucket in esi */ ALIGN_STACK(12) /* 4: sp of handler */ - pushl CAML_STATE(exception_pointer, %ebx); CFI_ADJUST(4) + pushl CAML_STATE(exn_handler, %ebx); CFI_ADJUST(4) /* 3: sp of raise */ pushl CAML_STATE(bottom_of_stack, %ebx); CFI_ADJUST(4) /* 2: pc of raise */ @@ -373,8 +373,8 @@ LBL(112): pushl %esi; CFI_ADJUST(4) call G(caml_stash_backtrace) movl %esi, %eax /* Recover exception bucket */ - movl CAML_STATE(exception_pointer, %ebx), %esp - popl CAML_STATE(exception_pointer, %ebx); CFI_ADJUST(-4) + movl CAML_STATE(exn_handler, %ebx), %esp + popl CAML_STATE(exn_handler, %ebx); CFI_ADJUST(-4) UNDO_ALIGN_STACK(8) ret CFI_ENDPROC diff --git a/runtime4/instrtrace.c b/runtime4/instrtrace.c index 2760475ed5a..a37c3f97542 100644 --- a/runtime4/instrtrace.c +++ b/runtime4/instrtrace.c @@ -36,10 +36,9 @@ extern code_t caml_start_code; intnat caml_icount = 0; -void caml_stop_here () {} +void caml_stop_here (void) {} -void caml_disasm_instr(pc) - code_t pc; +void caml_disasm_instr(code_t pc) { int instr = *pc; printf("%6ld %s", (long) (pc - caml_start_code), @@ -60,7 +59,7 @@ void caml_disasm_instr(pc) printf(" %d\n", pc[0]); break; /* Instructions with two operands */ case APPTERM: case CLOSURE: case CLOSUREREC: case PUSHGETGLOBALFIELD: - case GETGLOBALFIELD: case MAKEBLOCK: + case GETGLOBALFIELD: case MAKEBLOCK: case MAKE_FAUX_MIXEDBLOCK: case BEQ: case BNEQ: case BLTINT: case BLEINT: case BGTINT: case BGEINT: case BULTINT: case BUGEINT: printf(" %d, %d\n", pc[0], pc[1]); break; @@ -138,6 +137,7 @@ char * caml_instr_string (code_t pc) case PUSHGETGLOBALFIELD: case GETGLOBALFIELD: case MAKEBLOCK: + case MAKE_FAUX_MIXEDBLOCK: case BEQ: case BNEQ: case BLTINT: diff --git a/runtime4/intern.c b/runtime4/intern.c index 32c10d90abb..c8936baa419 100644 --- a/runtime4/intern.c +++ b/runtime4/intern.c @@ -922,7 +922,7 @@ CAMLprim value caml_marshal_data_size(value buff, value ofs) default: caml_failwith("Marshal.data_size: bad object"); } - return Val_long((header_len - 20) + data_len); + return Val_long((header_len - 16) + data_len); } /* Resolution of code pointers */ diff --git a/runtime4/interp.c b/runtime4/interp.c index 7c80153af44..2dbd7c05d80 100644 --- a/runtime4/interp.c +++ b/runtime4/interp.c @@ -211,6 +211,13 @@ static intnat caml_bcodcount; /* The interpreter itself */ +typedef value (*primitive_arity_1)(value); +typedef value (*primitive_arity_2)(value, value); +typedef value (*primitive_arity_3)(value, value, value); +typedef value (*primitive_arity_4)(value, value, value, value); +typedef value (*primitive_arity_5)(value, value, value, value, value); +typedef value (*primitive_arity_n)(value*, int); + value caml_interprete(code_t prog, asize_t prog_size) { #ifdef PC_REG @@ -747,6 +754,25 @@ value caml_interprete(code_t prog, asize_t prog_size) accu = block; Next; } + Instruct(MAKE_FAUX_MIXEDBLOCK): { + mlsize_t wosize = *pc++; + tag_t tag = *pc++; + mlsize_t i; + value block; + if (wosize <= Max_young_wosize) { + Alloc_small_with_reserved(block, wosize, tag, + Faux_mixed_block_sentinel); + Field(block, 0) = accu; + for (i = 1; i < wosize; i++) Field(block, i) = *sp++; + } else { + block = + caml_alloc_shr_reserved(wosize, tag, Faux_mixed_block_sentinel); + caml_initialize(&Field(block, 0), accu); + for (i = 1; i < wosize; i++) caml_initialize(&Field(block, i), *sp++); + } + accu = block; + Next; + } Instruct(MAKEFLOATBLOCK): { mlsize_t size = *pc++; mlsize_t i; @@ -959,34 +985,34 @@ value caml_interprete(code_t prog, asize_t prog_size) Instruct(C_CALL1): Setup_for_c_call; - accu = Primitive(*pc)(accu); + accu = ((primitive_arity_1) Primitive(*pc))(accu); Restore_after_c_call; pc++; Next; Instruct(C_CALL2): Setup_for_c_call; - accu = Primitive(*pc)(accu, sp[2]); + accu = ((primitive_arity_2) Primitive(*pc))(accu, sp[2]); Restore_after_c_call; sp += 1; pc++; Next; Instruct(C_CALL3): Setup_for_c_call; - accu = Primitive(*pc)(accu, sp[2], sp[3]); + accu = ((primitive_arity_3)Primitive(*pc))(accu, sp[2], sp[3]); Restore_after_c_call; sp += 2; pc++; Next; Instruct(C_CALL4): Setup_for_c_call; - accu = Primitive(*pc)(accu, sp[2], sp[3], sp[4]); + accu = ((primitive_arity_4) Primitive(*pc))(accu, sp[2], sp[3], sp[4]); Restore_after_c_call; sp += 3; pc++; Next; Instruct(C_CALL5): Setup_for_c_call; - accu = Primitive(*pc)(accu, sp[2], sp[3], sp[4], sp[5]); + accu = ((primitive_arity_5) Primitive(*pc))(accu, sp[2], sp[3], sp[4], sp[5]); Restore_after_c_call; sp += 4; pc++; @@ -995,7 +1021,7 @@ value caml_interprete(code_t prog, asize_t prog_size) int nargs = *pc++; *--sp = accu; Setup_for_c_call; - accu = Primitive(*pc)(sp + 2, nargs); + accu = ((primitive_arity_n) Primitive(*pc))(sp + 2, nargs); Restore_after_c_call; sp += nargs; pc++; @@ -1197,6 +1223,12 @@ value caml_interprete(code_t prog, asize_t prog_size) Restore_after_debugger; Restart_curr_instr; + Instruct(PERFORM): + Instruct(RESUME): + Instruct(RESUMETERM): + Instruct(REPERFORMTERM): + caml_fatal_error("Effect primitives not supported on runtime4"); + #ifndef THREADED_CODE default: #if _MSC_VER >= 1200 diff --git a/runtime4/ints.c b/runtime4/ints.c index c9584e4aba2..126476b363f 100644 --- a/runtime4/ints.c +++ b/runtime4/ints.c @@ -334,9 +334,14 @@ CAMLprim value caml_int32_format(value fmt, value arg) return caml_alloc_sprintf(format_string, Int32_val(arg)); } +CAMLprim int32_t caml_int32_of_string_unboxed(value s) +{ + return (int32_t) parse_intnat(s, 32, INT32_ERRMSG); +} + CAMLprim value caml_int32_of_string(value s) { - return caml_copy_int32((int32_t) parse_intnat(s, 32, INT32_ERRMSG)); + return caml_copy_int32(caml_int32_of_string_unboxed(s)); } int32_t caml_int32_bits_of_float_unboxed(double d) @@ -582,7 +587,7 @@ CAMLprim value caml_int64_format(value fmt, value arg) return caml_alloc_sprintf(format_string, Int64_val(arg)); } -CAMLprim value caml_int64_of_string(value s) +CAMLprim int64_t caml_int64_of_string_unboxed(value s) { const char * p; uint64_t res, threshold; @@ -616,7 +621,12 @@ CAMLprim value caml_int64_of_string(value s) } } if (sign < 0) res = - res; - return caml_copy_int64(res); + return res; +} + +CAMLprim value caml_int64_of_string(value s) +{ + return caml_copy_int64(caml_int64_of_string_unboxed(s)); } int64_t caml_int64_bits_of_float_unboxed(double d) @@ -845,7 +855,33 @@ CAMLprim value caml_nativeint_format(value fmt, value arg) return caml_alloc_sprintf(format_string, Nativeint_val(arg)); } +CAMLprim intnat caml_nativeint_of_string_unboxed(value s) +{ + return parse_intnat(s, 8 * sizeof(value), INTNAT_ERRMSG); +} + CAMLprim value caml_nativeint_of_string(value s) { - return caml_copy_nativeint(parse_intnat(s, 8 * sizeof(value), INTNAT_ERRMSG)); + return caml_copy_nativeint(caml_nativeint_of_string_unboxed(s)); +} + +CAMLprim value caml_reinterpret_tagged_int63_as_unboxed_int64(value i) +{ + // This should only be called on 64-bit targets. + // This stub is only used for bytecode, so in fact the "unboxed_int64" + // is to be boxed. + CAMLassert(sizeof(value) == 8); + CAMLassert(Is_long(i)); + return caml_copy_int64((int64_t) i); +} + +CAMLprim value caml_reinterpret_unboxed_int64_as_tagged_int63(value i) +{ + // This should only be called on 64-bit targets. + // This stub is only used for bytecode, so in fact the "unboxed_int64" + // is boxed. + CAMLassert(sizeof(value) == 8); + CAMLassert(Is_block(i)); + CAMLassert(Tag_val(i) == Custom_tag); + return (value) (Int64_val(i) | 1L); } diff --git a/runtime4/major_gc.c b/runtime4/major_gc.c index e9cd9fcdec0..5b2e2d8e2c2 100644 --- a/runtime4/major_gc.c +++ b/runtime4/major_gc.c @@ -166,8 +166,8 @@ static void mark_stack_prune (struct mark_stack* stk) if (ch->redarken_first.start > me.start) ch->redarken_first = me; - if (ch->redarken_end < me.end) - ch->redarken_end = me.end; + if (ch->redarken_end < me.object_end) + ch->redarken_end = me.object_end; if( redarken_first_chunk == NULL || redarken_first_chunk > (char*)chunk_addr ) { @@ -214,7 +214,7 @@ Caml_inline void mark_stack_push(struct mark_stack* stk, value block, uintnat offset, intnat* work) { value v; - int i, block_wsz = Wosize_val(block), end; + int i, block_scannable_wsz, block_wsz, end; mark_entry* me; CAMLassert(Is_block(block) && Is_in_heap (block) @@ -222,6 +222,9 @@ Caml_inline void mark_stack_push(struct mark_stack* stk, value block, CAMLassert(Tag_val(block) != Infix_tag); CAMLassert(Tag_val(block) < No_scan_tag); + block_wsz = Wosize_val(block); + block_scannable_wsz = Scannable_wosize_val(block); + #if defined(NO_NAKED_POINTERS) || defined(NAKED_POINTERS_CHECKER) if (Tag_val(block) == Closure_tag) { /* Skip the code pointers and integers at beginning of closure; @@ -238,7 +241,7 @@ Caml_inline void mark_stack_push(struct mark_stack* stk, value block, } #endif - end = (block_wsz < 8 ? block_wsz : 8); + end = (block_scannable_wsz < 8 ? block_scannable_wsz : 8); /* Optimisation to avoid pushing small, unmarkable objects such as [Some 42] * into the mark stack. */ @@ -250,11 +253,11 @@ Caml_inline void mark_stack_push(struct mark_stack* stk, value block, break; } - if (i == block_wsz) { + if (i == block_scannable_wsz) { /* nothing left to mark */ if( work != NULL ) { /* we should take credit for it though */ - *work -= Whsize_wosize(block_wsz - offset); + *work -= Whsize_wosize(block_scannable_wsz - offset); } return; } @@ -273,7 +276,8 @@ Caml_inline void mark_stack_push(struct mark_stack* stk, value block, me = &stk->stack[stk->count++]; me->start = Op_val(block) + offset; - me->end = Op_val(block) + Wosize_val(block); + me->scannable_end = Op_val(block) + block_scannable_wsz; + me->object_end = Op_val(block) + block_wsz; } #if defined(NAKED_POINTERS_CHECKER) && defined(NATIVE_CODE) @@ -314,7 +318,7 @@ void caml_darken (value v, value *p) /* This function shrinks the mark stack back to the MARK_STACK_INIT_SIZE size and is called at the end of a GC compaction to avoid a mark stack greater than 1/32th of the heap. */ -void caml_shrink_mark_stack () { +void caml_shrink_mark_stack (void) { struct mark_stack* stk = Caml_state->mark_stack; intnat init_stack_bsize = MARK_STACK_INIT_SIZE * sizeof(mark_entry); mark_entry* shrunk_stack; @@ -350,14 +354,15 @@ static int redarken_chunk(char* heap_chunk, struct mark_stack* stk) { while (1) { header_t* hp; /* Skip a prefix of fields that need no marking */ - CAMLassert(me.start <= me.end && (header_t*)me.end <= end); - while (me.start < me.end && + CAMLassert(me.start <= me.scannable_end && + (header_t*)me.scannable_end <= end); + while (me.start < me.scannable_end && (!Is_block(*me.start) || Is_young(*me.start))) { me.start++; } /* Push to the mark stack (if anything's left) */ - if (me.start < me.end) { + if (me.start < me.scannable_end) { if (stk->count < stk->size/4) { stk->stack[stk->count++] = me; } else { @@ -369,7 +374,7 @@ static int redarken_chunk(char* heap_chunk, struct mark_stack* stk) { } /* Find the next block that needs to be re-marked */ - hp = (header_t*)me.end; + hp = (header_t*)me.object_end; CAMLassert(hp <= end); while (hp < end) { value v = Val_hp(hp); @@ -382,7 +387,8 @@ static int redarken_chunk(char* heap_chunk, struct mark_stack* stk) { /* Found a block */ me.start = Op_hp(hp); - me.end = me.start + Wosize_hp(hp); + me.scannable_end = me.start + Scannable_wosize_hp(hp); + me.object_end = me.start + Wosize_hp(hp); if (Tag_hp(hp) == Closure_tag) { me.start += Start_env_closinfo(Closinfo_val(Val_hp(hp))); } @@ -390,7 +396,8 @@ static int redarken_chunk(char* heap_chunk, struct mark_stack* stk) { chunk->redarken_first.start = (value*)(heap_chunk + Chunk_size(heap_chunk)); - chunk->redarken_first.end = chunk->redarken_first.start; + chunk->redarken_first.scannable_end = chunk->redarken_first.start; + chunk->redarken_first.object_end = chunk->redarken_first.start; chunk->redarken_end = (value*)heap_chunk; return 1; @@ -452,7 +459,7 @@ Caml_inline void mark_ephe_darken(struct mark_stack* stk, value v, mlsize_t i, if ((in_ephemeron && Is_long(f)) || (Is_block (f) && (!Is_in_value_area(f) || Tag_val (f) == Forward_tag - || Tag_val (f) == Lazy_tag + || Tag_val (f) == Lazy_tag || Tag_val (f) == Forcing_tag #ifdef FLAT_FLOAT_ARRAY || Tag_val (f) == Double_tag #endif @@ -534,7 +541,7 @@ static void mark_ephe_aux (struct mark_stack *stk, intnat *work, if (Is_long (f) || (Is_block (f) && (!Is_in_value_area(f) || Tag_val (f) == Forward_tag - || Tag_val (f) == Lazy_tag + || Tag_val (f) == Lazy_tag || Tag_val (f) == Forcing_tag #ifdef FLAT_FLOAT_ARRAY || Tag_val (f) == Double_tag #endif @@ -642,7 +649,17 @@ Caml_noinline static intnat do_some_marking #endif while (1) { - value *scan, *obj_end, *scan_end; + /* * [scan] is initialized to the point where we should start scanning in + the object. It is then updated to keep track of the actual scanning + progress. + * [obj_scannable_end] is the point up until which it is legal to scan the + object. + * [obj_end] is a pointer to one past the end of the object. + * [scan_end] is where the scanning actually will progress until. It is + less than [obj_scannable_end] in the event that the work budget is + lower than what would be required to scan until that point. + */ + value *scan, *obj_scannable_end, *obj_end, *scan_end; intnat scan_len; if (pb_enqueued > pb_dequeued + min_pb) { @@ -670,7 +687,9 @@ Caml_noinline static intnat do_some_marking continue; } scan = Op_val(block); + obj_scannable_end = scan + Scannable_wosize_hd(hd); obj_end = scan + Wosize_hd(hd); + work -= obj_end - obj_scannable_end; if (Tag_hd (hd) == Closure_tag) { uintnat env_offset = Start_env_closinfo(Closinfo_val(block)); @@ -690,10 +709,11 @@ Caml_noinline static intnat do_some_marking } else { mark_entry m = stk.stack[--stk.count]; scan = m.start; - obj_end = m.end; + obj_scannable_end = m.scannable_end; + obj_end = m.object_end; } - scan_len = obj_end - scan; + scan_len = obj_scannable_end - scan; if (work < scan_len) { scan_len = work; if (scan_len < 0) scan_len = 0; @@ -725,10 +745,10 @@ Caml_noinline static intnat do_some_marking #endif } - if (scan < obj_end) { + if (scan < obj_scannable_end) { /* Didn't finish scanning this object, either because work <= 0, or the prefetch buffer filled up. Leave the rest on the stack. */ - mark_entry m = { scan, obj_end }; + mark_entry m = { scan, obj_scannable_end, obj_end }; caml_prefetch(scan+1); if (stk.count == stk.size) { *Caml_state->mark_stack = stk; @@ -737,7 +757,8 @@ Caml_noinline static intnat do_some_marking } CAML_EVENTLOG_DO({ if (work <= 0 && pb_enqueued == pb_dequeued) { - CAML_EV_COUNTER(EV_C_MAJOR_MARK_SLICE_REMAIN, obj_end - scan); + CAML_EV_COUNTER(EV_C_MAJOR_MARK_SLICE_REMAIN, + obj_scannable_end - scan); } }); stk.stack[stk.count++] = m; diff --git a/runtime4/memory.c b/runtime4/memory.c index c46f4cd0df7..1d2081d0bfb 100644 --- a/runtime4/memory.c +++ b/runtime4/memory.c @@ -306,7 +306,9 @@ char *caml_alloc_for_heap (asize_t request) Chunk_block (mem) = block; } Chunk_head (mem)->redarken_first.start = (value*)(mem + Chunk_size(mem)); - Chunk_head (mem)->redarken_first.end = (value*)(mem + Chunk_size(mem)); + Chunk_head (mem)->redarken_first.scannable_end = + (value*)(mem + Chunk_size(mem)); + Chunk_head (mem)->redarken_first.object_end = (value*)(mem + Chunk_size(mem)); Chunk_head (mem)->redarken_end = (value*)mem; return mem; } @@ -528,6 +530,8 @@ Caml_inline value caml_alloc_shr_aux (mlsize_t wosize, tag_t tag, int track, #ifdef DEBUG { uintnat i; + /* We don't check the reserved bits here because this is OK even for mixed + blocks. */ for (i = 0; i < wosize; i++){ Field (Val_hp (hp), i) = Debug_uninit_major; } @@ -552,6 +556,12 @@ CAMLexport value caml_alloc_shr_with_profinfo (mlsize_t wosize, tag_t tag, return check_oom(caml_alloc_shr_aux(wosize, tag, 1, profinfo)); } +CAMLexport value caml_alloc_shr_reserved (mlsize_t wosize, tag_t tag, + reserved_t reserved) +{ + return caml_alloc_shr_with_profinfo(wosize, tag, reserved); +} + CAMLexport value caml_alloc_shr_for_minor_gc (mlsize_t wosize, tag_t tag, header_t old_hd) { @@ -706,7 +716,7 @@ CAMLexport void caml_modify_local (value obj, intnat i, value val) } } -CAMLexport intnat caml_local_region_begin() +CAMLexport intnat caml_local_region_begin(void) { return Caml_state->local_sp; } @@ -716,7 +726,7 @@ CAMLexport void caml_local_region_end(intnat reg) Caml_state->local_sp = reg; } -CAMLexport caml_local_arenas* caml_get_local_arenas() +CAMLexport caml_local_arenas* caml_get_local_arenas(void) { caml_local_arenas* s = Caml_state->local_arenas; if (s != NULL) @@ -739,7 +749,7 @@ CAMLexport void caml_set_local_arenas(caml_local_arenas* s) } } -void caml_local_realloc() +void caml_local_realloc(void) { caml_local_arenas* s = caml_get_local_arenas(); intnat i; diff --git a/runtime4/memprof.c b/runtime4/memprof.c index c041d377bd5..054b340349f 100644 --- a/runtime4/memprof.c +++ b/runtime4/memprof.c @@ -340,7 +340,7 @@ static uintnat rand_binom(uintnat len) which may call the GC, but prefer using [caml_alloc_shr], which gives this guarantee. The return value is either a valid callstack or 0 in out-of-memory scenarios. */ -static value capture_callstack_postponed() +static value capture_callstack_postponed(void) { value res; intnat callstack_len = @@ -1089,6 +1089,11 @@ CAMLprim value caml_memprof_stop(value unit) return Val_unit; } +CAMLprim value caml_memprof_discard(value profile) +{ + caml_failwith("Gc.Memprof.discard: not implemented in runtime4"); +} + /**** Interface with systhread. ****/ static void th_ctx_iter_default(th_ctx_action f, void* data) { @@ -1098,7 +1103,7 @@ static void th_ctx_iter_default(th_ctx_action f, void* data) { CAMLexport void (*caml_memprof_th_ctx_iter_hook)(th_ctx_action, void*) = th_ctx_iter_default; -CAMLexport struct caml_memprof_th_ctx* caml_memprof_new_th_ctx() +CAMLexport struct caml_memprof_th_ctx* caml_memprof_new_th_ctx(void) { struct caml_memprof_th_ctx* ctx = caml_stat_alloc(sizeof(struct caml_memprof_th_ctx)); diff --git a/runtime4/minor_gc.c b/runtime4/minor_gc.c index 0162d3c26d5..1f868ec2dc4 100644 --- a/runtime4/minor_gc.c +++ b/runtime4/minor_gc.c @@ -63,7 +63,7 @@ struct generic_table CAML_TABLE_STRUCT(char); -void caml_alloc_minor_tables () +void caml_alloc_minor_tables (void) { Caml_state->ref_table = caml_stat_alloc_noexc(sizeof(struct caml_ref_table)); @@ -216,17 +216,24 @@ void caml_oldify_one (value v, value *p) value field0; sz = Wosize_hd (hd); + mlsize_t scannable_sz = Scannable_wosize_hd(hd); result = caml_alloc_shr_for_minor_gc (sz, tag, hd); *p = result; + /* Copy the non-scannable suffix of fields */ + for (i = scannable_sz; i < sz; i++) { + Field(result, i) = Field(v, i); + } field0 = Field (v, 0); Hd_val (v) = 0; /* Set forward flag */ Field (v, 0) = result; /* and forward pointer. */ - if (sz > 1){ + if (scannable_sz == 0) { + return; + } else if (scannable_sz > 1){ Field (result, 0) = field0; Field (result, 1) = oldify_todo_list; /* Add this block */ oldify_todo_list = v; /* to the "to do" list. */ }else{ - CAMLassert (sz == 1); + CAMLassert (scannable_sz == 1); p = &Field (result, 0); v = field0; goto tail_call; @@ -259,7 +266,7 @@ void caml_oldify_one (value v, value *p) } } } - if (!vv || ft == Forward_tag || ft == Lazy_tag + if (!vv || ft == Forward_tag || ft == Lazy_tag || ft == Forcing_tag #ifdef FLAT_FLOAT_ARRAY || ft == Double_tag #endif @@ -319,11 +326,31 @@ void caml_oldify_mopup (void) new_v = Field (v, 0); /* Follow forward pointer. */ oldify_todo_list = Field (new_v, 1); /* Remove from list. */ + mlsize_t scannable_wosize = Scannable_wosize_val(new_v); + + /* [v] was only added to the [todo_list] if its [scannable_wosize > 1]. + - It needs to be greater than 0 because we oldify the first field. + - It needs to be greater than 1 so the below loop runs at least once, + overwriting Field(new_v, 1) which [oldify_one] used as temporary + storage of the next value of [todo_list]. + */ + CAMLassert (scannable_wosize > 1); + f = Field (new_v, 0); if (Is_block (f) && Is_young (f)){ caml_oldify_one (f, &Field (new_v, 0)); } - for (i = 1; i < Wosize_val (new_v); i++){ + + i = 1; + + if(Tag_val(new_v) == Closure_tag) { + mlsize_t non_scannable = Start_env_closinfo(Closinfo_val(v)); + for (; i < non_scannable; i++) { + Field(new_v, i) = Field(v, i); + } + } + + for (; i < scannable_wosize; i++){ f = Field (v, i); if (Is_block (f) && Is_young (f)){ caml_oldify_one (f, &Field (new_v, i)); @@ -333,6 +360,8 @@ void caml_oldify_mopup (void) } } + // The non-scannable suffix is already copied in [oldify_one]. + /* Oldify the data in the minor heap of alive ephemeron During minor collection keys outside the minor heap are considered alive */ for (re = Caml_state->ephe_ref_table->base; @@ -359,7 +388,7 @@ void caml_oldify_mopup (void) } #ifdef DEBUG -static void verify_minor_heap() +static void verify_minor_heap(void) { header_t* p; struct caml_local_arena* arena = Caml_state->local_arenas ? @@ -373,7 +402,7 @@ static void verify_minor_heap() intnat i = 0; if (Tag_hd(hd) == Closure_tag) i = Start_env_closinfo(Closinfo_val(Val_hp(p))); - for (; i < Wosize_hd(hd); i++) { + for (; i < Scannable_wosize_hd(hd); i++) { value v = Field(Val_hp(p), i); if (Is_block(v)) { if (Is_young(v)) CAMLassert ((value)Caml_state->young_ptr < v); diff --git a/runtime4/misc.c b/runtime4/misc.c index e2c0e9548ab..5208ebb38cd 100644 --- a/runtime4/misc.c +++ b/runtime4/misc.c @@ -28,7 +28,9 @@ __declspec(noreturn) void __cdecl abort(void); #include #include #include +#include "caml/alloc.h" #include "caml/config.h" +#include "caml/fail.h" #include "caml/misc.h" #include "caml/memory.h" #include "caml/osdeps.h" @@ -56,6 +58,8 @@ void caml_failed_assert (char * expr, char_os * file_os, int line) void caml_set_fields (value v, uintnat start, uintnat filler) { mlsize_t i; + /* We use Wosize_val instead of Scannable_wosize_val because it's fine to set + even unscannable fields. */ for (i = start; i < Wosize_val (v); i++){ Field (v, i) = (value) filler; } @@ -225,3 +229,69 @@ void caml_flambda2_invalid (value message) fprintf (stderr, "Consider using [Sys.opaque_identity].\n"); abort (); } + +/* Fake atomic operations - runtime4 is single threaded, but we need to + provide these symbols for compatibility with the 5 Stdlib updates. */ + +CAMLprim value caml_atomic_make(value v) +{ + CAMLparam1(v); + value ref = caml_alloc_small(1, 0); + Field(ref, 0) = v; + CAMLreturn(ref); +} + +CAMLprim value caml_atomic_load(value ref) +{ + return Field(ref, 0); +} + +CAMLprim value caml_atomic_cas(value ref, value oldv, value newv) +{ + value* p = Op_val(ref); + if (*p == oldv) { + caml_modify(p, newv); + return Val_int(1); + } else { + return Val_int(0); + } +} + +CAMLprim value caml_atomic_exchange(value ref, value v) +{ + value ret = Field(ref, 0); + caml_modify(Op_val(ref), v); + return ret; +} + +CAMLprim value caml_atomic_fetch_add(value ref, value incr) +{ + value ret; + value* p = Op_val(ref); + CAMLassert(Is_long(*p)); + ret = *p; + *p = Val_long(Long_val(ret) + Long_val(incr)); + return ret; +} + +// Dummy implementations so effect.ml can compile + +CAMLprim value caml_continuation_use_noexc(void) +{ + caml_fatal_error("Effects not implemented in runtime4"); +} + +CAMLprim value caml_alloc_stack(void) +{ + caml_fatal_error("Effects not implemented in runtime4"); +} + +CAMLprim value caml_get_continuation_callstack(void) +{ + caml_fatal_error("Effects not implemented in runtime4"); +} + +CAMLprim value caml_continuation_use_and_update_handler_noexc(void) +{ + caml_fatal_error("Effects not implemented in runtime4"); +} diff --git a/runtime4/obj.c b/runtime4/obj.c index e0a4d94c73f..b67233151ba 100644 --- a/runtime4/obj.c +++ b/runtime4/obj.c @@ -30,19 +30,24 @@ #include "caml/prims.h" #include "caml/signals.h" -CAMLprim value caml_obj_tag(value arg) +static int obj_tag (value arg) { if (Is_long (arg)){ - return Val_int (1000); /* int_tag */ + return 1000; /* int_tag */ }else if ((long) arg & (sizeof (value) - 1)){ - return Val_int (1002); /* unaligned_tag */ + return 1002; /* unaligned_tag */ }else if (Is_in_value_area (arg)){ - return Val_int(Tag_val(arg)); + return Tag_val(arg); }else{ - return Val_int (1001); /* out_of_heap_tag */ + return 1001; /* out_of_heap_tag */ } } +CAMLprim value caml_obj_tag(value arg) +{ + return Val_int (obj_tag(arg)); +} + CAMLprim value caml_obj_set_tag (value arg, value new_tag) { Tag_val (arg) = Int_val (new_tag); @@ -158,14 +163,25 @@ CAMLprim value caml_obj_with_tag(value new_tag_v, value arg) res = caml_alloc(sz, tg); memcpy(Bp_val(res), Bp_val(arg), sz * sizeof(value)); } else if (sz <= Max_young_wosize) { - res = caml_alloc_small(sz, tg); + reserved_t reserved = Reserved_val(arg); + res = caml_alloc_small_with_reserved(sz, tg, reserved); for (i = 0; i < sz; i++) Field(res, i) = Field(arg, i); } else { - res = caml_alloc_shr(sz, tg); + mlsize_t scannable_sz = Scannable_wosize_val(arg); + reserved_t reserved = Reserved_val(arg); + + res = caml_alloc_shr_reserved(sz, tg, reserved); /* It is safe to use [caml_initialize] even if [tag == Closure_tag] and some of the "values" being copied are actually code pointers. That's because the new "value" does not point to the minor heap. */ - for (i = 0; i < sz; i++) caml_initialize(&Field(res, i), Field(arg, i)); + for (i = 0; i < scannable_sz; i++) { + caml_initialize(&Field(res, i), Field(arg, i)); + } + + for (i = scannable_sz; i < sz; i++) { + Field(res, i) = Field(arg, i); + } + /* Give gc a chance to run, and run memprof callbacks */ caml_process_pending_actions(); } @@ -214,12 +230,22 @@ CAMLprim value caml_obj_truncate (value v, value newsize) beyond new_wosize in v, erase them explicitly so that the GC can darken them as appropriate. */ if (tag < No_scan_tag) { - for (i = new_wosize; i < wosize; i++){ + mlsize_t scannable_wosize = Scannable_wosize_hd(hd); + for (i = new_wosize; i < scannable_wosize; i++){ caml_modify(&Field(v, i), Val_unit); #ifdef DEBUG Field (v, i) = Debug_free_truncate; #endif } +#ifdef DEBUG + /* Unless we're in debug mode, it's not necessary to empty out + the non-scannable suffix, as the GC knows not to look there + anyway. + */ + for (; i < wosize; i++) { + Field (v, i) = Debug_free_truncate; + } +#endif } /* We must use an odd tag for the header of the leftovers so it does not look like a pointer because there may be some references to it in @@ -236,11 +262,9 @@ CAMLprim value caml_obj_add_offset (value v, value offset) return v + (unsigned long) Int32_val (offset); } -/* The following function is used in stdlib/lazy.ml. - It is not written in OCaml because it must be atomic with respect - to the GC. - */ - +/* The following functions are used to support lazy values. They are not + * written in OCaml in order to ensure atomicity guarantees with respect to the + * GC. */ CAMLprim value caml_lazy_make_forward (value v) { CAMLparam1 (v); @@ -251,6 +275,53 @@ CAMLprim value caml_lazy_make_forward (value v) CAMLreturn (res); } +static int obj_update_tag (value blk, int old_tag, int new_tag) +{ + header_t hd; + tag_t tag; + + hd = Hd_val(blk); + tag = Tag_hd(hd); + + if (tag != old_tag) return 0; + Unsafe_store_tag_val(blk, new_tag); + return 1; +} + +CAMLprim value caml_lazy_reset_to_lazy (value v) +{ + CAMLassert (Tag_val(v) == Forcing_tag); + + obj_update_tag (v, Forcing_tag, Lazy_tag); + return Val_unit; +} + +CAMLprim value caml_lazy_update_to_forward (value v) +{ + CAMLassert (Tag_val(v) == Forcing_tag); + + obj_update_tag (v, Forcing_tag, Forward_tag); + return Val_unit; +} + +CAMLprim value caml_lazy_read_result (value v) +{ + if (obj_tag(v) == Forward_tag) + return Field(v,0); + return v; +} + +CAMLprim value caml_lazy_update_to_forcing (value v) +{ + if (Is_block(v) && /* Needed to ensure that we don't attempt to update the + header of a integer value */ + obj_update_tag (v, Lazy_tag, Forcing_tag)) { + return Val_int(0); + } else { + return Val_int(1); + } +} + /* For mlvalues.h and camlinternalOO.ml See also GETPUBMET in interp.c */ @@ -294,3 +365,19 @@ struct queue_chunk { struct queue_chunk *next; value entries[ENTRIES_PER_QUEUE_CHUNK]; }; + +/* Return 0 for uniform blocks and 1+n for a mixed block with scannable prefix + len n. +*/ +CAMLprim value caml_succ_scannable_prefix_len (value v) { +#ifdef NATIVE_CODE + return Val_long(Reserved_val(v)); +#else + reserved_t reserved = Reserved_val(v); + if (reserved == Faux_mixed_block_sentinel) { + return Val_long(Scannable_wosize_val(v) + 1); + } else { + return Val_long(0); + } +#endif /* NATIVE_CODE */ +} diff --git a/runtime4/power.S b/runtime4/power.S index 3d368e181a6..e9e2faf8d8c 100644 --- a/runtime4/power.S +++ b/runtime4/power.S @@ -145,7 +145,7 @@ #define DOMAIN_STATE(c_type, name) \ .equ domain_field_caml_##name, domain_curr_field ; \ .set domain_curr_field, domain_curr_field + 1 -#include "../runtime/caml/domain_state.tbl" +#include "../runtime4/caml/domain_state.tbl" #undef DOMAIN_STATE #define Caml_state(var) 8*domain_field_caml_##var(DOMAIN_STATE_PTR) @@ -177,7 +177,7 @@ FUNCTION(caml_call_gc) /* Save current allocation pointer for debugging purposes */ stg ALLOC_PTR, Caml_state(young_ptr) /* Save exception pointer (if e.g. a sighandler raises) */ - stg TRAP_PTR, Caml_state(exception_pointer) + stg TRAP_PTR, Caml_state(exn_handler) /* Save all registers used by the code generator */ addi 11, 1, 8*32 + PARAM_SAVE_AREA + RESERVED_STACK - WORD stgu 3, WORD(11) @@ -324,7 +324,7 @@ FUNCTION(caml_c_call) stg C_CALL_RET_ADDR, Caml_state(last_return_address) /* Make the exception handler and alloc ptr available to the C code */ stg ALLOC_PTR, Caml_state(young_ptr) - stg TRAP_PTR, Caml_state(exception_pointer) + stg TRAP_PTR, Caml_state(exn_handler) /* Call C function (address in C_CALL_FUN) */ #if defined(MODEL_ppc) mtctr C_CALL_FUN @@ -396,7 +396,7 @@ FUNCTION(caml_raise_exception) bne .L121 .L120: /* Reload OCaml global registers */ - lg 1, Caml_state(exception_pointer) + lg 1, Caml_state(exn_handler) lg ALLOC_PTR, Caml_state(young_ptr) /* Pop trap frame */ lg 0, TRAP_HANDLER_OFFSET(1) @@ -410,7 +410,7 @@ FUNCTION(caml_raise_exception) /* arg1: exception bucket, already in r3 */ lg 4, Caml_state(last_return_address) /* arg2: PC of raise */ lg 5, Caml_state(bottom_of_stack) /* arg3: SP of raise */ - lg 6, Caml_state(exception_pointer) /* arg4: SP of handler */ + lg 6, Caml_state(exn_handler) /* arg4: SP of handler */ addi 1, 1, -(PARAM_SAVE_AREA + RESERVED_STACK) /* reserve stack space for C call */ bl caml_stash_backtrace @@ -498,7 +498,7 @@ FUNCTION(caml_start_program) .cfi_adjust_cfa_offset TRAP_SIZE mflr 0 stg 0, TRAP_HANDLER_OFFSET(1) - lg 11, Caml_state(exception_pointer) + lg 11, Caml_state(exn_handler) stg 11, TRAP_PREVIOUS_OFFSET(1) mr TRAP_PTR, 1 /* Reload allocation pointer */ @@ -522,9 +522,9 @@ FUNCTION(caml_start_program) #else #error "wrong MODEL" #endif - /* Pop the trap frame, restoring caml_exception_pointer */ + /* Pop the trap frame, restoring caml_exn_handler */ lg 0, TRAP_PREVIOUS_OFFSET(1) - stg 0, Caml_state(exception_pointer) + stg 0, Caml_state(exn_handler) addi 1, 1, TRAP_SIZE .cfi_adjust_cfa_offset -TRAP_SIZE /* Pop the callback link, restoring the global variables */ @@ -588,8 +588,8 @@ FUNCTION(caml_start_program) #ifdef TOC_SAVE_PARENT ld 2, (STACKSIZE + TOC_SAVE_PARENT)(1) #endif - /* Update caml_exception_pointer */ - stg TRAP_PTR, Caml_state(exception_pointer) + /* Update caml_exn_handler */ + stg TRAP_PTR, Caml_state(exn_handler) /* Encode exception bucket as an exception result and return it */ ori 3, 3, 2 b .L106 diff --git a/runtime4/prng.c b/runtime4/prng.c new file mode 100644 index 00000000000..35a7b9515cd --- /dev/null +++ b/runtime4/prng.c @@ -0,0 +1,71 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cambium, College de France and Inria */ +/* */ +/* Copyright 2021 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. */ +/* */ +/**************************************************************************/ + +#define CAML_INTERNALS + +#include +#include "caml/alloc.h" +#include "caml/bigarray.h" +#include "caml/mlvalues.h" + +/* The L64X128 member of the LXM family. Taken from figure 1 in + "LXM: Better Splittable Pseudorandom Number Generators + (and Almost as Fast)" by Guy L. Steele Jr. and Sebastiano Vigna, + OOPSLA 2021. */ + +static const uint64_t M = 0xd1342543de82ef95; + +struct LXM_state { + uint64_t a; /* per-instance additive parameter (odd) */ + uint64_t s; /* state of the LCG subgenerator */ + uint64_t x[2]; /* state of the XBG subgenerator (not 0) */ +}; + +/* In OCaml, states are represented as a 1D big array of 64-bit integers */ + +#define LXM_val(v) ((struct LXM_state *) Caml_ba_data_val(v)) + +Caml_inline uint64_t rotl(const uint64_t x, int k) { + return (x << k) | (x >> (64 - k)); +} + +CAMLprim uint64_t caml_lxm_next_unboxed(value v) +{ + uint64_t z, q0, q1; + struct LXM_state * st = LXM_val(v); + + /* Combining operation */ + z = st->s + st->x[0]; + /* Mixing function */ + z = (z ^ (z >> 32)) * 0xdaba0b6eb09322e3; + z = (z ^ (z >> 32)) * 0xdaba0b6eb09322e3; + z = (z ^ (z >> 32)); + /* LCG update */ + st->s = st->s * M + st->a; + /* XBG update */ + q0 = st->x[0]; q1 = st->x[1]; + q1 ^= q0; + q0 = rotl(q0, 24); + q0 = q0 ^ q1 ^ (q1 << 16); + q1 = rotl(q1, 37); + st->x[0] = q0; st->x[1] = q1; + /* Return result */ + return z; +} + +CAMLprim value caml_lxm_next(value v) +{ + return caml_copy_int64(caml_lxm_next_unboxed(v)); +} diff --git a/runtime4/riscv.S b/runtime4/riscv.S index a649ddb5597..4c31e4fccab 100644 --- a/runtime4/riscv.S +++ b/runtime4/riscv.S @@ -46,7 +46,7 @@ #define DOMAIN_STATE(c_type, name) \ .equ domain_field_caml_##name, domain_curr_field ; \ .set domain_curr_field, domain_curr_field + 1 -#include "../runtime/caml/domain_state.tbl" +#include "../runtime4/caml/domain_state.tbl" #undef DOMAIN_STATE #define Caml_state(var) (8*domain_field_caml_##var)(DOMAIN_STATE_PTR) @@ -143,7 +143,7 @@ FUNCTION(caml_call_gc) /* Save current allocation pointer for debugging purposes */ STORE ALLOC_PTR, Caml_state(young_ptr) /* Save trap pointer in case an exception is raised during GC */ - STORE TRAP_PTR, Caml_state(exception_pointer) + STORE TRAP_PTR, Caml_state(exn_handler) /* Call the garbage collector */ call PLT(caml_garbage_collection) /* Restore registers */ @@ -211,7 +211,7 @@ FUNCTION(caml_c_call) STORE sp, Caml_state(bottom_of_stack) /* Make the exception handler alloc ptr available to the C code */ STORE ALLOC_PTR, Caml_state(young_ptr) - STORE TRAP_PTR, Caml_state(exception_pointer) + STORE TRAP_PTR, Caml_state(exn_handler) /* Call the function */ jalr ARG /* Reload alloc ptr */ @@ -253,7 +253,7 @@ END_FUNCTION(caml_raise_exn) FUNCTION(caml_raise_exception) mv DOMAIN_STATE_PTR, a0 mv a0, a1 - LOAD TRAP_PTR, Caml_state(exception_pointer) + LOAD TRAP_PTR, Caml_state(exn_handler) LOAD ALLOC_PTR, Caml_state(young_ptr) LOAD TMP, Caml_state(backtrace_active) bnez TMP, 2f @@ -326,7 +326,7 @@ FUNCTION(caml_start_program) /* set up a trap frame */ addi sp, sp, -16 CFI_ADJUST(16) - LOAD TMP, Caml_state(exception_pointer) + LOAD TMP, Caml_state(exn_handler) STORE TMP, 0(sp) lla TMP, .Ltrap_handler STORE TMP, 8(sp) @@ -334,9 +334,9 @@ FUNCTION(caml_start_program) LOAD ALLOC_PTR, Caml_state(young_ptr) STORE x0, Caml_state(last_return_address) jalr ARG -.Lcaml_retaddr: /* pop trap frame, restoring caml_exception_pointer */ +.Lcaml_retaddr: /* pop trap frame, restoring caml_exn_handler */ LOAD TMP, 0(sp) - STORE TMP, Caml_state(exception_pointer) + STORE TMP, Caml_state(exn_handler) addi sp, sp, 16 CFI_ADJUST(-16) .Lreturn_result: /* pop callback link, restoring global variables */ @@ -386,7 +386,7 @@ END_FUNCTION(caml_start_program) .align 2 .Ltrap_handler: CFI_STARTPROC - STORE TRAP_PTR, Caml_state(exception_pointer) + STORE TRAP_PTR, Caml_state(exn_handler) ori a0, a0, 2 j .Lreturn_result .type .Ltrap_handler, @function diff --git a/runtime4/roots_nat.c b/runtime4/roots_nat.c index db449c36cb0..fefc75ac760 100644 --- a/runtime4/roots_nat.c +++ b/runtime4/roots_nat.c @@ -292,9 +292,11 @@ void caml_register_dyn_global(void *v) { caml_dyn_globals = cons((void*) v,caml_dyn_globals); } -/* Logic to determine at which index within a global root to start - scanning. [*glob_block] and [*start] may be updated by this function. */ -static void compute_index_for_global_root_scan (value* glob_block, int* start) +/* Logic to determine at which index within a global root to start and stop + scanning. [*glob_block], [*start], and [*stop] may be updated by this + function. */ + static void compute_index_for_global_root_scan(value* glob_block, int* start, + int* stop) { *start = 0; @@ -309,12 +311,17 @@ static void compute_index_for_global_root_scan (value* glob_block, int* start) cause a failure. */ if (Tag_val (*glob_block) == Infix_tag) *glob_block -= Infix_offset_val (*glob_block); - if (Tag_val (*glob_block) == Closure_tag) + if (Tag_val (*glob_block) == Closure_tag) { *start = Start_env_closinfo (Closinfo_val (*glob_block)); + *stop = Wosize_val(*glob_block); + } + else { + *stop = Scannable_wosize_val(*glob_block); + } } else { /* Set the index such that none of the block's fields will be scanned. */ - *start = Wosize_val (*glob_block); + *stop = 0; } } @@ -325,7 +332,7 @@ void caml_oldify_local_roots (void) intnat i, j; value * glob; value glob_block; - int start; + int start, stop; link *lnk; /* The global roots */ @@ -334,8 +341,8 @@ void caml_oldify_local_roots (void) i++) { for(glob = caml_globals[i]; *glob != 0; glob++) { glob_block = *glob; - compute_index_for_global_root_scan (&glob_block, &start); - for (j = start; j < Wosize_val (glob_block); j++) + compute_index_for_global_root_scan (&glob_block, &start, &stop); + for (j = start; j < stop; j++) Oldify (&Field (glob_block, j)); } } @@ -345,8 +352,8 @@ void caml_oldify_local_roots (void) iter_list(caml_dyn_globals, lnk) { for(glob = (value *) lnk->data; *glob != 0; glob++) { glob_block = *glob; - compute_index_for_global_root_scan (&glob_block, &start); - for (j = start; j < Wosize_val (glob_block); j++) { + compute_index_for_global_root_scan (&glob_block, &start, &stop); + for (j = start; j < stop; j++) { Oldify (&Field (glob_block, j)); } } @@ -390,6 +397,7 @@ intnat caml_darken_all_roots_slice (intnat work) static int do_resume = 0; static value glob_block; static int start; + static int stop; static mlsize_t roots_count = 0; intnat remaining_work = work; CAML_EV_BEGIN(EV_MAJOR_MARK_GLOBAL_ROOTS_SLICE); @@ -402,8 +410,8 @@ intnat caml_darken_all_roots_slice (intnat work) for (i = 0; caml_globals[i] != 0; i++) { for(glob = caml_globals[i]; *glob != 0; glob++) { glob_block = *glob; - compute_index_for_global_root_scan (&glob_block, &start); - for (j = start; j < Wosize_val (glob_block); j++) { + compute_index_for_global_root_scan (&glob_block, &start, &stop); + for (j = start; j < stop; j++) { caml_darken (Field (glob_block, j), &Field (glob_block, j)); -- remaining_work; if (remaining_work == 0){ @@ -434,7 +442,7 @@ void caml_do_roots (scanning_action f, int do_globals) value * glob; link *lnk; value glob_block; - int start; + int start, stop; CAML_EV_BEGIN(EV_MAJOR_ROOTS_DYNAMIC_GLOBAL); if (do_globals){ @@ -442,8 +450,8 @@ void caml_do_roots (scanning_action f, int do_globals) for (i = 0; caml_globals[i] != 0; i++) { for(glob = caml_globals[i]; *glob != 0; glob++) { glob_block = *glob; - compute_index_for_global_root_scan (&glob_block, &start); - for (j = start; j < Wosize_val (glob_block); j++) + compute_index_for_global_root_scan (&glob_block, &start, &stop); + for (j = start; j < stop; j++) f (Field (glob_block, j), &Field (glob_block, j)); } } @@ -452,8 +460,8 @@ void caml_do_roots (scanning_action f, int do_globals) iter_list(caml_dyn_globals, lnk) { for(glob = (value *) lnk->data; *glob != 0; glob++) { glob_block = *glob; - compute_index_for_global_root_scan (&glob_block, &start); - for (j = start; j < Wosize_val (glob_block); j++) { + compute_index_for_global_root_scan (&glob_block, &start, &stop); + for (j = start; j < stop; j++) { f (Field (glob_block, j), &Field (glob_block, j)); } } @@ -570,7 +578,7 @@ static void do_local_allocations(caml_local_arenas* loc, i = 0; if (Tag_hd(hd) == Closure_tag) i = Start_env_closinfo(Closinfo_val(Val_hp(hp))); - for (; i < Wosize_hd(hd); i++) { + for (; i < Scannable_wosize_hd(hd); i++) { value *p = &Field(Val_hp(hp), i); int marked_local = visit(maj, min, p); if (marked_local) { diff --git a/runtime4/s390x.S b/runtime4/s390x.S index 6695e795d87..7a90f4447ca 100644 --- a/runtime4/s390x.S +++ b/runtime4/s390x.S @@ -29,7 +29,7 @@ #define DOMAIN_STATE(c_type, name) \ .equ domain_field_caml_##name, domain_curr_field ; \ .set domain_curr_field, domain_curr_field + 1 -#include "../runtime/caml/domain_state.tbl" +#include "../runtime4/caml/domain_state.tbl" #undef DOMAIN_STATE #define Caml_state(var) 8*domain_field_caml_##var(%r10) @@ -58,7 +58,7 @@ caml_call_gc: /* Save current allocation pointer for debugging purposes */ stg %r11, Caml_state(young_ptr) /* Save exception pointer (if e.g. a sighandler raises) */ - stg %r13, Caml_state(exception_pointer) + stg %r13, Caml_state(exn_handler) /* Save all registers used by the code generator */ stmg %r2,%r9, (8*16)(%r15) stg %r12, (8*16 + 8*8)(%r15) @@ -125,7 +125,7 @@ caml_c_call: stg %r14, Caml_state(last_return_address) /* Make the exception handler and alloc ptr available to the C code */ stg %r11, Caml_state(young_ptr) - stg %r13, Caml_state(exception_pointer) + stg %r13, Caml_state(exn_handler) /* Call the function */ basr %r14, %r7 /* restore return address */ @@ -174,7 +174,7 @@ caml_raise_exception: jne .L112 .L113: /* Reload OCaml global registers */ - lg %r15, Caml_state(exception_pointer) + lg %r15, Caml_state(exn_handler) lg %r11, Caml_state(young_ptr) /* Pop trap frame */ lg %r1, 0(%r15) @@ -187,7 +187,7 @@ caml_raise_exception: /* arg1: exception bucket, already in r2 */ lg %r3, Caml_state(last_return_address) /* arg2: PC of raise */ lg %r4, Caml_state(bottom_of_stack) /* arg3: SP of raise */ - lg %r5, Caml_state(exception_pointer) /* arg4: SP of handler */ + lg %r5, Caml_state(exn_handler) /* arg4: SP of handler */ /* reserve stack space for C call */ lay %r15, -160(%r15) brasl %r14, caml_stash_backtrace@PLT @@ -237,7 +237,7 @@ caml_start_program: .L103: lay %r15, -16(%r15) stg %r14, 0(%r15) - lg %r1, Caml_state(exception_pointer) + lg %r1, Caml_state(exn_handler) stg %r1, 8(%r15) lgr %r13, %r15 /* Reload allocation pointer */ @@ -246,9 +246,9 @@ caml_start_program: lgr %r1,%r0 basr %r14, %r1 .L105: - /* Pop the trap frame, restoring caml_exception_pointer */ + /* Pop the trap frame, restoring caml_exn_handler */ lg %r0, 8(%r15) - stg %r0, Caml_state(exception_pointer) + stg %r0, Caml_state(exn_handler) la %r15, 16(%r15) /* Pop the callback link, restoring the global variables */ .L106: @@ -280,8 +280,8 @@ caml_start_program: /* The trap handler: */ .L104: - /* Update caml_exception_pointer */ - stg %r13, Caml_state(exception_pointer) + /* Update caml_exn_handler */ + stg %r13, Caml_state(exn_handler) /* Encode exception bucket as an exception result and return it */ oill %r2, 2 j .L106 diff --git a/runtime4/signals.c b/runtime4/signals.c index 3097209d6d4..2de9e0b447f 100644 --- a/runtime4/signals.c +++ b/runtime4/signals.c @@ -153,6 +153,8 @@ CAMLno_tsan /* The read of [caml_something_to_do] is not synchronized. */ CAMLexport void caml_enter_blocking_section(void) { while (1){ + if (Caml_state->in_minor_collection) + caml_fatal_error("caml_enter_blocking_section from inside minor GC"); /* Process all pending signals now */ caml_raise_async_if_exception(caml_process_pending_signals_exn(), "signal handler"); @@ -339,7 +341,7 @@ Caml_inline value process_pending_actions_with_root_exn(value extra_root) } CAMLno_tsan /* The access to [caml_something_to_do] is not synchronized. */ -int caml_check_pending_actions() +int caml_check_pending_actions(void) { return caml_something_to_do; } diff --git a/runtime4/signals_nat.c b/runtime4/signals_nat.c index 3dd37fb0174..16c90b6f3c2 100644 --- a/runtime4/signals_nat.c +++ b/runtime4/signals_nat.c @@ -169,7 +169,7 @@ DECLARE_SIGNAL_HANDLER(trap_handler) caml_sigmask_hook(SIG_UNBLOCK, &mask, NULL); } #endif - Caml_state->exception_pointer = (char *) CONTEXT_EXCEPTION_POINTER; + Caml_state->exn_handler = (char *) CONTEXT_EXCEPTION_POINTER; Caml_state->young_ptr = (value *) CONTEXT_YOUNG_PTR; Caml_state->bottom_of_stack = (char *) CONTEXT_SP; Caml_state->last_return_address = (uintnat) CONTEXT_PC; @@ -229,7 +229,7 @@ DECLARE_SIGNAL_HANDLER(segv_handler) Caml_state->young_ptr = (value *) CONTEXT_YOUNG_PTR; #endif #if defined(CONTEXT_EXCEPTION_POINTER) - Caml_state->exception_pointer = (char *) CONTEXT_EXCEPTION_POINTER; + Caml_state->exn_handler = (char *) CONTEXT_EXCEPTION_POINTER; #endif caml_raise_stack_overflow(); #endif diff --git a/runtime4/startup_nat.c b/runtime4/startup_nat.c index 643e7ddf77f..b7eacbe30c3 100644 --- a/runtime4/startup_nat.c +++ b/runtime4/startup_nat.c @@ -116,6 +116,7 @@ value caml_startup_common(char_os **argv, int pooling) caml_verb_gc = 0x3F; #endif caml_parse_ocamlrunparam(); + CAML_EVENTLOG_INIT(); #ifdef DEBUG caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); diff --git a/runtime4/sys.c b/runtime4/sys.c index a77fd9d1cfb..1965c943a41 100644 --- a/runtime4/sys.c +++ b/runtime4/sys.c @@ -61,6 +61,23 @@ #include "caml/callback.h" #include "caml/startup_aux.h" +CAMLexport char * caml_strerror(int errnum, char * buf, size_t buflen) +{ +#ifdef _WIN32 + /* Windows has a thread-safe strerror */ + return strerror(errnum); +#else + int res = strerror_r(errnum, buf, buflen); + /* glibc<2.13 returns -1/sets errno, >2.13 returns +ve errno. + We assume that buffer size is large enough not to get ERANGE, + so we assume we got EINVAL. */ + if (res != 0) { + snprintf(buf, buflen, "Unknown error %d", errnum); + } + return buf; +#endif +} + static char * error_message(void) { return strerror(errno); @@ -236,6 +253,25 @@ CAMLprim value caml_sys_close(value fd_v) return Val_unit; } +static int caml_sys_file_mode(value name) +{ +#ifdef _WIN32 + struct _stati64 st; +#else + struct stat st; +#endif + char_os * p; + int ret; + + if (! caml_string_is_c_safe(name)) { errno = ENOENT; return -1; } + p = caml_stat_strdup_to_os(String_val(name)); + caml_enter_blocking_section(); + ret = stat_os(p, &st); + caml_leave_blocking_section(); + caml_stat_free(p); + if (ret == -1) return -1; else return st.st_mode; +} + CAMLprim value caml_sys_file_exists(value name) { #ifdef _WIN32 @@ -282,6 +318,18 @@ CAMLprim value caml_sys_is_directory(value name) #endif } +CAMLprim value caml_sys_is_regular_file(value name) +{ + CAMLparam1(name); + int mode = caml_sys_file_mode(name); + if (mode == -1) caml_sys_error(name); +#ifdef S_ISREG + CAMLreturn(Val_bool(S_ISREG(mode))); +#else + CAMLreturn(Val_bool(mode & S_IFREG)); +#endif +} + CAMLprim value caml_sys_remove(value name) { CAMLparam1(name); @@ -661,6 +709,12 @@ CAMLprim value caml_sys_const_backend_type(value unit) { return Val_int(1); /* Bytecode backed */ } + +CAMLprim value caml_sys_const_runtime5(value unit) +{ + return Val_false; +} + CAMLprim value caml_sys_get_config(value unit) { CAMLparam0 (); /* unit is unused */ diff --git a/runtime4/weak.c b/runtime4/weak.c index dc0d061270a..a93fe979aa3 100644 --- a/runtime4/weak.c +++ b/runtime4/weak.c @@ -398,27 +398,34 @@ CAMLprim value caml_ephe_get_data (value ar) static void copy_value(value src, value dst) { - mlsize_t sz, i; - sz = Wosize_val(src); + mlsize_t scan_from, scan_to; if (Tag_val (src) >= No_scan_tag) { /* Direct copy */ - memcpy (Bp_val (dst), Bp_val (src), Bsize_wsize (sz)); + memcpy (Bp_val (dst), Bp_val (src), Bosize_val(src)); return; } - i = 0; if (Tag_val (src) == Closure_tag) { /* Direct copy of the code pointers and closure info fields */ - i = Start_env_closinfo(Closinfo_val(src)); - memcpy (Bp_val (dst), Bp_val (src), Bsize_wsize (i)); + scan_from = Start_env_closinfo(Closinfo_val(src)); + scan_to = Wosize_val(src); + memcpy (Bp_val (dst), Bp_val (src), Bsize_wsize (scan_from)); + } else { + scan_from = 0; + scan_to = Scannable_wosize_val(src); } /* Field-by-field copy and darkening of the remaining fields */ - for (/*nothing*/; i < sz; i++){ + for (mlsize_t i = scan_from; i < scan_to; i++){ value f = Field (src, i); if (caml_gc_phase == Phase_mark && Must_be_Marked_during_mark(f)){ caml_darken (f, NULL); } caml_modify (&Field (dst, i), f); } + + /* Copy non-scannable suffix */ + memcpy (Op_val(dst) + scan_to, + Op_val(src) + scan_to, + Bsize_wsize(Wosize_val(src) - scan_to)); } CAMLexport int caml_ephemeron_get_key_copy(value ar, mlsize_t offset, @@ -464,7 +471,8 @@ CAMLexport int caml_ephemeron_get_key_copy(value ar, mlsize_t offset, caml_minor_collection (); } else { /* cases where loop is between 0 to 7 and where loop is equal to 9 */ - elt = caml_alloc (Wosize_val (v), Tag_val (v)); + elt = caml_alloc_with_reserved (Wosize_val (v), Tag_val (v), + Reserved_val (v)); /* The GC may erase, move or even change v during this call to caml_alloc. */ } @@ -521,7 +529,8 @@ CAMLexport int caml_ephemeron_get_data_copy (value ar, value *data) caml_minor_collection (); } else { /* cases where loop is between 0 to 7 and where loop is equal to 9 */ - elt = caml_alloc (Wosize_val (v), Tag_val (v)); + elt = caml_alloc_with_reserved (Wosize_val (v), Tag_val (v), + Reserved_val (v)); /** cf caml_ephemeron_get_key_copy */ } ++loop; diff --git a/stdlib/.depend b/stdlib/.depend index 6a3e5eff344..287eb923cec 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -130,6 +130,11 @@ stdlib__Callback.cmx : callback.ml \ stdlib__Callback.cmi stdlib__Callback.cmi : callback.mli \ stdlib.cmi +camlinternalAtomic.cmo : \ + camlinternalAtomic.cmi +camlinternalAtomic.cmx : \ + camlinternalAtomic.cmi +camlinternalAtomic.cmi : camlinternalComprehension.cmo : \ stdlib.cmi \ camlinternalComprehension.cmi @@ -237,12 +242,15 @@ stdlib__Complex.cmx : complex.ml \ stdlib__Complex.cmi : complex.mli \ stdlib.cmi stdlib__Condition.cmo : condition.ml \ + stdlib.cmi \ stdlib__Mutex.cmi \ stdlib__Condition.cmi stdlib__Condition.cmx : condition.ml \ + stdlib.cmx \ stdlib__Mutex.cmx \ stdlib__Condition.cmi stdlib__Condition.cmi : condition.mli \ + stdlib.cmi \ stdlib__Mutex.cmi stdlib__Digest.cmo : digest.ml \ stdlib__String.cmi \ @@ -262,9 +270,6 @@ stdlib__Domain.cmo : domain.ml \ stdlib__Sys.cmi \ stdlib.cmi \ stdlib__Obj.cmi \ - stdlib__Mutex.cmi \ - stdlib__List.cmi \ - stdlib__Condition.cmi \ stdlib__Atomic.cmi \ stdlib__Array.cmi \ stdlib__Domain.cmi @@ -272,27 +277,15 @@ stdlib__Domain.cmx : domain.ml \ stdlib__Sys.cmx \ stdlib.cmx \ stdlib__Obj.cmx \ - stdlib__Mutex.cmx \ - stdlib__List.cmx \ - stdlib__Condition.cmx \ stdlib__Atomic.cmx \ stdlib__Array.cmx \ stdlib__Domain.cmi stdlib__Domain.cmi : domain.mli -stdlib__Effect.cmo : effect.ml \ - stdlib__Printf.cmi \ - stdlib__Printexc.cmi \ - stdlib__Obj.cmi \ - stdlib__Callback.cmi \ - stdlib__Effect.cmi -stdlib__Effect.cmx : effect.ml \ - stdlib__Printf.cmx \ - stdlib__Printexc.cmx \ - stdlib__Obj.cmx \ - stdlib__Callback.cmx \ - stdlib__Effect.cmi -stdlib__Effect.cmi : effect.mli \ - stdlib__Printexc.cmi +effect.cmo : \ + effect.cmi +effect.cmx : \ + effect.cmi +effect.cmi : stdlib__Either.cmo : either.ml \ stdlib__Either.cmi stdlib__Either.cmx : either.ml \ @@ -365,16 +358,6 @@ stdlib__Float.cmx : float.ml \ stdlib__Float.cmi : float.mli \ stdlib.cmi \ stdlib__Seq.cmi -stdlib__Float_u.cmo : float_u.ml \ - stdlib.cmi \ - stdlib__Float.cmi \ - stdlib__Float_u.cmi -stdlib__Float_u.cmx : float_u.ml \ - stdlib.cmx \ - stdlib__Float.cmx \ - stdlib__Float_u.cmi -stdlib__Float_u.cmi : float_u.mli \ - stdlib.cmi stdlib__Format.cmo : format.ml \ stdlib__String.cmi \ stdlib.cmi \ @@ -471,32 +454,6 @@ stdlib__Hashtbl.cmx : hashtbl.ml \ stdlib__Hashtbl.cmi : hashtbl.mli \ stdlib.cmi \ stdlib__Seq.cmi -stdlib__Iarray.cmo : iarray.ml \ - stdlib.cmi \ - stdlib__Seq.cmi \ - stdlib__Array.cmi \ - stdlib__Iarray.cmi -stdlib__Iarray.cmx : iarray.ml \ - stdlib.cmx \ - stdlib__Seq.cmx \ - stdlib__Array.cmx \ - stdlib__Iarray.cmi -stdlib__Iarray.cmi : iarray.mli \ - stdlib.cmi \ - stdlib__Seq.cmi -stdlib__IarrayLabels.cmo : iarrayLabels.ml \ - stdlib.cmi \ - stdlib__Seq.cmi \ - stdlib__Array.cmi \ - stdlib__IarrayLabels.cmi -stdlib__IarrayLabels.cmx : iarrayLabels.ml \ - stdlib.cmx \ - stdlib__Seq.cmx \ - stdlib__Array.cmx \ - stdlib__IarrayLabels.cmi -stdlib__IarrayLabels.cmi : iarrayLabels.mli \ - stdlib.cmi \ - stdlib__Seq.cmi stdlib__In_channel.cmo : in_channel.ml \ stdlib__Sys.cmi \ stdlib.cmi \ @@ -608,13 +565,13 @@ stdlib__Map.cmi : map.mli \ stdlib.cmi \ stdlib__Seq.cmi stdlib__Marshal.cmo : marshal.ml \ - stdlib.cmi \ stdlib__String.cmi \ + stdlib.cmi \ stdlib__Bytes.cmi \ stdlib__Marshal.cmi stdlib__Marshal.cmx : marshal.ml \ - stdlib.cmx \ stdlib__String.cmx \ + stdlib.cmx \ stdlib__Bytes.cmx \ stdlib__Marshal.cmi stdlib__Marshal.cmi : marshal.mli \ @@ -763,6 +720,7 @@ stdlib__Queue.cmi : queue.mli \ stdlib__Random.cmo : random.ml \ stdlib__Sys.cmi \ stdlib__String.cmi \ + stdlib.cmi \ stdlib__Nativeint.cmi \ stdlib__Int64.cmi \ stdlib__Int32.cmi \ @@ -775,6 +733,7 @@ stdlib__Random.cmo : random.ml \ stdlib__Random.cmx : random.ml \ stdlib__Sys.cmx \ stdlib__String.cmx \ + stdlib.cmx \ stdlib__Nativeint.cmx \ stdlib__Int64.cmx \ stdlib__Int32.cmx \ @@ -823,14 +782,17 @@ stdlib__Scanf.cmx : scanf.ml \ stdlib__Scanf.cmi : scanf.mli \ stdlib.cmi stdlib__Semaphore.cmo : semaphore.ml \ + stdlib.cmi \ stdlib__Mutex.cmi \ stdlib__Condition.cmi \ stdlib__Semaphore.cmi stdlib__Semaphore.cmx : semaphore.ml \ + stdlib.cmx \ stdlib__Mutex.cmx \ stdlib__Condition.cmx \ stdlib__Semaphore.cmi -stdlib__Semaphore.cmi : semaphore.mli +stdlib__Semaphore.cmi : semaphore.mli \ + stdlib.cmi stdlib__Seq.cmo : seq.ml \ stdlib.cmi \ stdlib__Lazy.cmi \ @@ -893,8 +855,10 @@ stdlib__StdLabels.cmi : stdLabels.mli \ stdlib__BytesLabels.cmi \ stdlib__ArrayLabels.cmi std_exit.cmo : \ + stdlib.cmi \ std_exit.cmi std_exit.cmx : \ + stdlib.cmx \ std_exit.cmi std_exit.cmi : stdlib__String.cmo : string.ml \ @@ -930,9 +894,11 @@ stdlib__Sys.cmx : sys.ml \ stdlib__Sys.cmi : sys.mli \ stdlib.cmi stdlib__Type.cmo : type.ml \ + stdlib.cmi \ stdlib__Obj.cmi \ stdlib__Type.cmi stdlib__Type.cmx : type.ml \ + stdlib.cmx \ stdlib__Obj.cmx \ stdlib__Type.cmi stdlib__Type.cmi : type.mli diff --git a/stdlib/Makefile b/stdlib/Makefile index d2f48adc32e..0e04f642840 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -36,7 +36,7 @@ CAMLOPT=$(OCAMLRUN) $(OPTCOMPILER) CAMLDEP=$(BOOT_OCAMLC) -depend DEPFLAGS=-slash -OC_CPPFLAGS += -I$(ROOTDIR)/runtime +OC_CPPFLAGS += -I$(ROOTDIR)/$(RUNTIME_DIR) include StdlibModules @@ -207,30 +207,6 @@ stdlib.cmx: stdlib.ml $(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) \ -pp "$(AWK) -f ./expand_module_aliases.awk" -c $< - -# special cases to add the extension flag when compiling float_u -# CR layouts: eventually these can be just [-extension layouts] -stdlib__Float_u.cmi: - $(CAMLC) $(COMPFLAGS) -extension layouts_alpha \ - -o $@ -c $(filter %.mli, $^) - -stdlib__Float_u.cmo: - $(CAMLC) $(COMPFLAGS) -extension layouts_alpha \ - -o $@ -c $(filter %.ml, $^) - -stdlib__Float_u.cmx: - $(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -extension layouts_alpha \ - -o $@ -c $(filter %.ml, $^) - -float_u.cmi: %.mli - $(CAMLC) $(COMPFLAGS) -extension layouts_alpha -c $< - -float_u.cmo: %.ml - $(CAMLC) $(COMPFLAGS) -extension layouts_alpha -c $< - -float_u.cmx: %.ml - $(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -extension layouts_alpha -c $< - %.cmi: %.mli $(V_OCAMLC)$(CAMLC) $(COMPFLAGS) -c $< diff --git a/stdlib/StdlibModules b/stdlib/StdlibModules index cf066dae6f4..3036edaca11 100644 --- a/stdlib/StdlibModules +++ b/stdlib/StdlibModules @@ -35,6 +35,7 @@ # with lowercase first letters). These must be listed in dependency order. STDLIB_MODULE_BASENAMES = \ camlinternalFormatBasics \ + camlinternalAtomic \ stdlib \ either \ sys \ @@ -56,12 +57,10 @@ STDLIB_MODULE_BASENAMES = \ unit \ marshal \ array \ - iarray \ float \ - float_u \ int32 \ - int64 \ nativeint \ + int64 \ lexing \ parsing \ set \ @@ -76,6 +75,10 @@ STDLIB_MODULE_BASENAMES = \ fun \ gc \ digest \ + mutex \ + condition \ + semaphore \ + domain \ bigarray \ random \ hashtbl \ @@ -90,7 +93,6 @@ STDLIB_MODULE_BASENAMES = \ filename \ complex \ arrayLabels \ - iarrayLabels \ listLabels \ bytesLabels \ stringLabels \ @@ -98,7 +100,7 @@ STDLIB_MODULE_BASENAMES = \ stdLabels \ in_channel \ out_channel \ - camlinternalComprehensions + camlinternalComprehension STDLIB_PREFIXED_MODULES = \ $(filter-out stdlib camlinternal%, $(STDLIB_MODULE_BASENAMES)) diff --git a/stdlib/arg.ml b/stdlib/arg.ml index 762dfc5bcaa..917e3986446 100644 --- a/stdlib/arg.ml +++ b/stdlib/arg.ml @@ -1,4 +1,4 @@ -# 1 "arg.ml" +# 2 "arg.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/arg.mli b/stdlib/arg.mli index 9de259697dd..44a3772725f 100644 --- a/stdlib/arg.mli +++ b/stdlib/arg.mli @@ -1,4 +1,4 @@ -# 1 "arg.mli" +# 2 "arg.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/array.ml b/stdlib/array.ml index 9280b850d59..e26d4706695 100644 --- a/stdlib/array.ml +++ b/stdlib/array.ml @@ -1,4 +1,4 @@ -# 1 "array.ml" +# 2 "array.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/array.mli b/stdlib/array.mli index 8f66446a465..437b686584c 100644 --- a/stdlib/array.mli +++ b/stdlib/array.mli @@ -1,4 +1,4 @@ -# 1 "array.mli" +# 2 "array.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/arrayLabels.ml b/stdlib/arrayLabels.ml index 2cc66413aff..78dd5ec8f6b 100644 --- a/stdlib/arrayLabels.ml +++ b/stdlib/arrayLabels.ml @@ -1,4 +1,4 @@ -# 1 "arrayLabels.ml" +# 2 "arrayLabels.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/arrayLabels.mli b/stdlib/arrayLabels.mli index dfc63725d99..85b14faea37 100644 --- a/stdlib/arrayLabels.mli +++ b/stdlib/arrayLabels.mli @@ -1,4 +1,4 @@ -# 1 "arrayLabels.mli" +# 2 "arrayLabels.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/atomic.ml b/stdlib/atomic.ml index aa057e3985f..652a33be39d 100644 --- a/stdlib/atomic.ml +++ b/stdlib/atomic.ml @@ -12,61 +12,17 @@ (* *) (**************************************************************************) -(* BACKPORT BEGIN type !'a t external make : 'a -> 'a t = "%makemutable" +external make_contended : 'a -> 'a t = "caml_atomic_make_contended" external get : 'a t -> 'a = "%atomic_load" external exchange : 'a t -> 'a -> 'a = "%atomic_exchange" external compare_and_set : 'a t -> 'a -> 'a -> bool = "%atomic_cas" external fetch_and_add : int t -> int -> int = "%atomic_fetch_add" -*) -external ( == ) : 'a -> 'a -> bool = "%eq" -external ( + ) : int -> int -> int = "%addint" -(* BACKPORT END *) -external ignore : 'a -> unit = "%ignore" - -(* BACKPORT BEGIN *) -(* We are not reusing ('a ref) directly to make it easier to reason - about atomicity if we wish to: even in a sequential implementation, - signals and other asynchronous callbacks might break atomicity. *) -type 'a t = {mutable v: 'a} - -let make v = {v} -let get r = r.v -let set r v = r.v <- v - -(* The following functions are set to never be inlined: Flambda is - allowed to move surrounding code inside the critical section, - including allocations. *) -let[@inline never] exchange r v = - (* BEGIN ATOMIC *) - let cur = r.v in - r.v <- v; - (* END ATOMIC *) - cur - -let[@inline never] compare_and_set r seen v = - (* BEGIN ATOMIC *) - let cur = r.v in - if cur == seen then ( - r.v <- v; - (* END ATOMIC *) - true - ) else - false - -let[@inline never] fetch_and_add r n = - (* BEGIN ATOMIC *) - let cur = r.v in - r.v <- (cur + n); - (* END ATOMIC *) - cur +external ignore : 'a -> unit = "%ignore" -(* BACKPORT END *) -(* BACKPORT let set r x = ignore (exchange r x) -*) let incr r = ignore (fetch_and_add r 1) let decr r = ignore (fetch_and_add r (-1)) diff --git a/stdlib/atomic.mli b/stdlib/atomic.mli index a8142fd5576..184b42072f3 100644 --- a/stdlib/atomic.mli +++ b/stdlib/atomic.mli @@ -29,6 +29,20 @@ type !'a t (** Create an atomic reference. *) val make : 'a -> 'a t +(** Create an atomic reference that is alone on a cache line. It occupies 4-16x + the memory of one allocated with [make v]. + The primary purpose is to prevent false-sharing and the resulting + performance degradation. When a CPU performs an atomic operation, it + temporarily takes ownership of an entire cache line that contains the + atomic reference. If multiple atomic references share the same cache line, + modifying these disjoint memory regions simultaneously becomes impossible, + which can create a bottleneck. Hence, as a general guideline, if an atomic + reference is experiencing contention, assigning it its own cache line may + enhance performance. + + CR ocaml 5 all-runtime5: does not support runtime4 *) +val make_contended : 'a -> 'a t + (** Get the current value of the atomic reference. *) val get : 'a t -> 'a diff --git a/stdlib/bigarray.ml b/stdlib/bigarray.ml index 36e1900b85d..acdb5143b0b 100644 --- a/stdlib/bigarray.ml +++ b/stdlib/bigarray.ml @@ -1,4 +1,4 @@ -# 1 "bigarray.ml" +# 2 "bigarray.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/bigarray.mli b/stdlib/bigarray.mli index a2d53d909a3..530798786dc 100644 --- a/stdlib/bigarray.mli +++ b/stdlib/bigarray.mli @@ -1,4 +1,4 @@ -# 1 "bigarray.mli" +# 2 "bigarray.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/bool.ml b/stdlib/bool.ml index c5f91398fc2..0b7b2c615a4 100644 --- a/stdlib/bool.ml +++ b/stdlib/bool.ml @@ -1,4 +1,4 @@ -# 1 "bool.ml" +# 2 "bool.ml" (**************************************************************************) (* *) (* OCaml *) @@ -37,7 +37,11 @@ let of_string = function let to_string = function false -> "false" | true -> "true" +(* [caml_hash_exn] doesn't raise on booleans, so it's safe for + it to be marked as [@@noalloc]. + *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> bool -> int = "caml_hash_exn" [@@noalloc] + let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x diff --git a/stdlib/bool.mli b/stdlib/bool.mli index 41c59616093..992fd85bb05 100644 --- a/stdlib/bool.mli +++ b/stdlib/bool.mli @@ -1,4 +1,4 @@ -# 1 "bool.mli" +# 2 "bool.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/buffer.ml b/stdlib/buffer.ml index f448b034a91..cc86e555715 100644 --- a/stdlib/buffer.ml +++ b/stdlib/buffer.ml @@ -1,4 +1,4 @@ -# 1 "buffer.ml" +# 2 "buffer.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/buffer.mli b/stdlib/buffer.mli index 55163dcb30a..548dba59f98 100644 --- a/stdlib/buffer.mli +++ b/stdlib/buffer.mli @@ -1,4 +1,4 @@ -# 1 "buffer.mli" +# 2 "buffer.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/bytes.ml b/stdlib/bytes.ml index 586e1b88d30..1cc17d79ec3 100644 --- a/stdlib/bytes.ml +++ b/stdlib/bytes.ml @@ -1,4 +1,4 @@ -# 1 "bytes.ml" +# 2 "bytes.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/bytes.mli b/stdlib/bytes.mli index ea068e5449c..9ae8b23b9a1 100644 --- a/stdlib/bytes.mli +++ b/stdlib/bytes.mli @@ -1,4 +1,4 @@ -# 1 "bytes.mli" +# 2 "bytes.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/bytesLabels.ml b/stdlib/bytesLabels.ml index b5824973158..5f7c80f71ce 100644 --- a/stdlib/bytesLabels.ml +++ b/stdlib/bytesLabels.ml @@ -1,4 +1,4 @@ -# 1 "bytesLabels.ml" +# 2 "bytesLabels.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/bytesLabels.mli b/stdlib/bytesLabels.mli index 63a7e5ccfb9..80b43016484 100644 --- a/stdlib/bytesLabels.mli +++ b/stdlib/bytesLabels.mli @@ -1,4 +1,4 @@ -# 1 "bytesLabels.mli" +# 2 "bytesLabels.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/callback.ml b/stdlib/callback.ml index 16fa4060c14..58e4bc8348e 100644 --- a/stdlib/callback.ml +++ b/stdlib/callback.ml @@ -1,4 +1,4 @@ -# 1 "callback.ml" +# 2 "callback.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/callback.mli b/stdlib/callback.mli index 98b76b744ce..f89e72c7d90 100644 --- a/stdlib/callback.mli +++ b/stdlib/callback.mli @@ -1,4 +1,4 @@ -# 1 "callback.mli" +# 2 "callback.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/camlinternalAtomic.mli b/stdlib/camlinternalAtomic.mli new file mode 100644 index 00000000000..a438ad20d7e --- /dev/null +++ b/stdlib/camlinternalAtomic.mli @@ -0,0 +1,9 @@ +type 'a t = { mutable v : 'a; } +val make : 'a -> 'a t +val get : 'a t -> 'a +val set : 'a t -> 'a -> unit +val exchange : 'a t -> 'a -> 'a +val compare_and_set : 'a t -> 'a -> 'a -> bool +val fetch_and_add : int t -> int -> int +val incr : int t -> unit +val decr : int t -> unit diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 17a30bdefa3..e3f8afd5e64 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1,4 +1,4 @@ -# 1 "camlinternalFormat.ml" +# 2 "camlinternalFormat.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/camlinternalFormat.mli b/stdlib/camlinternalFormat.mli index 94cde281802..810d1d93c1f 100644 --- a/stdlib/camlinternalFormat.mli +++ b/stdlib/camlinternalFormat.mli @@ -1,4 +1,4 @@ -# 1 "camlinternalFormat.mli" +# 2 "camlinternalFormat.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/camlinternalFormatBasics.ml b/stdlib/camlinternalFormatBasics.ml index d14a5d90e27..d718d5d402b 100644 --- a/stdlib/camlinternalFormatBasics.ml +++ b/stdlib/camlinternalFormatBasics.ml @@ -1,4 +1,4 @@ -# 1 "camlinternalFormatBasics.ml" +# 2 "camlinternalFormatBasics.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/camlinternalFormatBasics.mli b/stdlib/camlinternalFormatBasics.mli index c341b716fb0..3974dc60672 100644 --- a/stdlib/camlinternalFormatBasics.mli +++ b/stdlib/camlinternalFormatBasics.mli @@ -1,4 +1,4 @@ -# 1 "camlinternalFormatBasics.mli" +# 2 "camlinternalFormatBasics.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/camlinternalLazy.ml b/stdlib/camlinternalLazy.ml index 6cf7163b22a..a5c31e3cec5 100644 --- a/stdlib/camlinternalLazy.ml +++ b/stdlib/camlinternalLazy.ml @@ -1,4 +1,4 @@ -# 1 "camlinternalLazy.ml" +# 2 "camlinternalLazy.ml" (**************************************************************************) (* *) (* OCaml *) @@ -26,9 +26,6 @@ type 'a t = 'a lazy_t exception Undefined -(* CR ocaml 5 runtime: - BACKPORT BEGIN - (* [update_to_forcing blk] tries to update a [blk] with [lazy_tag] to [forcing_tag] using compare-and-swap (CAS), taking care to handle concurrent marking of the header word by a concurrent GC thread. Returns [0] if the @@ -113,58 +110,3 @@ let force_gen ~only_val (lzv : 'arg lazy_t) = else if t = Obj.forcing_tag then raise Undefined else if t <> Obj.lazy_tag then (Obj.obj x : 'arg) else force_gen_lazy_block ~only_val lzv -*) -let raise_undefined = Obj.repr (fun () -> raise Undefined) - -external make_forward : Obj.t -> Obj.t -> unit = "caml_obj_make_forward" - -(* Assume [blk] is a block with tag lazy *) -let force_lazy_block (blk : 'arg lazy_t) = - let closure = (Obj.obj (Obj.field (Obj.repr blk) 0) : unit -> 'arg) in - Obj.set_field (Obj.repr blk) 0 raise_undefined; - try - let result = closure () in - make_forward (Obj.repr blk) (Obj.repr result); - result - with e -> - Obj.set_field (Obj.repr blk) 0 (Obj.repr (fun () -> raise e)); - raise e - - -(* Assume [blk] is a block with tag lazy *) -let force_val_lazy_block (blk : 'arg lazy_t) = - let closure = (Obj.obj (Obj.field (Obj.repr blk) 0) : unit -> 'arg) in - Obj.set_field (Obj.repr blk) 0 raise_undefined; - let result = closure () in - make_forward (Obj.repr blk) (Obj.repr result); - result - - -(* [force] is not used, since [Lazy.force] is declared as a primitive - whose code inlines the tag tests of its argument, except when afl - instrumentation is turned on. *) - -let force (lzv : 'arg lazy_t) = - (* Using [Sys.opaque_identity] prevents two potential problems: - - If the value is known to have Forward_tag, then its tag could have - changed during GC, so that information must be forgotten (see GPR#713 - and issue #7301) - - If the value is known to be immutable, then if the compiler - cannot prove that the last branch is not taken it will issue a - warning 59 (modification of an immutable value) *) - let lzv = Sys.opaque_identity lzv in - let x = Obj.repr lzv in - let t = Obj.tag x in - if t = Obj.forward_tag then (Obj.obj (Obj.field x 0) : 'arg) else - if t <> Obj.lazy_tag then (Obj.obj x : 'arg) - else force_lazy_block lzv - - -let force_val (lzv : 'arg lazy_t) = - let x = Obj.repr lzv in - let t = Obj.tag x in - if t = Obj.forward_tag then (Obj.obj (Obj.field x 0) : 'arg) else - if t <> Obj.lazy_tag then (Obj.obj x : 'arg) - else force_val_lazy_block lzv - -(* BACKPORT END *) diff --git a/stdlib/camlinternalLazy.mli b/stdlib/camlinternalLazy.mli index 126328f698e..c8b8859ff12 100644 --- a/stdlib/camlinternalLazy.mli +++ b/stdlib/camlinternalLazy.mli @@ -1,4 +1,4 @@ -# 1 "camlinternalLazy.mli" +# 2 "camlinternalLazy.mli" (**************************************************************************) (* *) (* OCaml *) @@ -26,14 +26,4 @@ exception Undefined val force_lazy_block : 'a lazy_t -> 'a -(* CR ocaml 5 runtime: - BACKPORT BEGIN *) -val force_val_lazy_block : 'a lazy_t -> 'a - -val force : 'a lazy_t -> 'a -val force_val : 'a lazy_t -> 'a -(* BACKPORT END *) - -(* CR ocaml 5 runtime: add this back in val force_gen : only_val:bool -> 'a lazy_t -> 'a -*) diff --git a/stdlib/camlinternalMod.ml b/stdlib/camlinternalMod.ml index e308318df1d..a9e6d2b990d 100644 --- a/stdlib/camlinternalMod.ml +++ b/stdlib/camlinternalMod.ml @@ -1,4 +1,4 @@ -# 1 "camlinternalMod.ml" +# 2 "camlinternalMod.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/camlinternalMod.mli b/stdlib/camlinternalMod.mli index fb07070ed08..609ee14db0e 100644 --- a/stdlib/camlinternalMod.mli +++ b/stdlib/camlinternalMod.mli @@ -1,4 +1,4 @@ -# 1 "camlinternalMod.mli" +# 2 "camlinternalMod.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/camlinternalOO.ml b/stdlib/camlinternalOO.ml index c189af16a29..0a96acc2750 100644 --- a/stdlib/camlinternalOO.ml +++ b/stdlib/camlinternalOO.ml @@ -1,4 +1,4 @@ -# 1 "camlinternalOO.ml" +# 2 "camlinternalOO.ml" (**************************************************************************) (* *) (* OCaml *) @@ -200,8 +200,9 @@ let set_method table label element = table.hidden_meths <- (label, element) :: table.hidden_meths let get_method table label = - try List.assoc label table.hidden_meths - with Not_found -> table.methods.(label) + match List.assoc_opt label table.hidden_meths with + | Some x -> x + | None -> table.methods.(label) let to_list arr = if arr == Obj.magic 0 then [] else Array.to_list arr @@ -228,7 +229,9 @@ let narrow table vars virt_meths concr_meths = by_name := Meths.add met label !by_name; by_label := Labs.add label - (try Labs.find label table.methods_by_label with Not_found -> true) + (match Labs.find_opt label table.methods_by_label with + | Some x -> x + | None -> true) !by_label) concr_meths concr_meth_labs; List.iter2 @@ -269,8 +272,9 @@ let new_slot table = index let new_variable table name = - try Vars.find name table.vars - with Not_found -> + match Vars.find_opt name table.vars with + | Some x -> x + | None -> let index = new_slot table in if name <> "" then table.vars <- Vars.add name index table.vars; index diff --git a/stdlib/camlinternalOO.mli b/stdlib/camlinternalOO.mli index 529e8fc3f88..22d4182dd7a 100644 --- a/stdlib/camlinternalOO.mli +++ b/stdlib/camlinternalOO.mli @@ -1,4 +1,4 @@ -# 1 "camlinternalOO.mli" +# 2 "camlinternalOO.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/char.ml b/stdlib/char.ml index 80a4903b77d..05cf3591844 100644 --- a/stdlib/char.ml +++ b/stdlib/char.ml @@ -1,4 +1,4 @@ -# 1 "char.ml" +# 2 "char.ml" (**************************************************************************) (* *) (* OCaml *) @@ -64,7 +64,10 @@ type t = char let compare c1 c2 = code c1 - code c2 let equal (c1: t) (c2: t) = compare c1 c2 = 0 +(* [caml_hash_exn] doesn't raise on chars, so it's safe for + it to be marked as [@@noalloc]. + *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> char -> int = "caml_hash_exn" [@@noalloc] let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x diff --git a/stdlib/char.mli b/stdlib/char.mli index c96e9ab7281..d8b056f23be 100644 --- a/stdlib/char.mli +++ b/stdlib/char.mli @@ -1,4 +1,4 @@ -# 1 "char.mli" +# 2 "char.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/complex.ml b/stdlib/complex.ml index fb5c57e4f4b..101d96e9fea 100644 --- a/stdlib/complex.ml +++ b/stdlib/complex.ml @@ -1,4 +1,4 @@ -# 1 "complex.ml" +# 2 "complex.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/complex.mli b/stdlib/complex.mli index 886daf48f53..51eedd803d6 100644 --- a/stdlib/complex.mli +++ b/stdlib/complex.mli @@ -1,4 +1,4 @@ -# 1 "complex.mli" +# 2 "complex.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/otherlibs/systhreads/condition.ml b/stdlib/condition.ml similarity index 81% rename from otherlibs/systhreads/condition.ml rename to stdlib/condition.ml index 9a014528abf..8fc7b580da9 100644 --- a/otherlibs/systhreads/condition.ml +++ b/stdlib/condition.ml @@ -13,8 +13,10 @@ (* *) (**************************************************************************) +open! Stdlib + type t -external create: unit -> t = "caml_condition_new" -external wait: t -> Mutex.t -> unit = "caml_condition_wait" -external signal: t -> unit = "caml_condition_signal" -external broadcast: t -> unit = "caml_condition_broadcast" +external create: unit -> t = "caml_ml_condition_new" +external wait: t -> Mutex.t -> unit = "caml_ml_condition_wait" +external signal: t -> unit = "caml_ml_condition_signal" +external broadcast: t -> unit = "caml_ml_condition_broadcast" diff --git a/stdlib/condition.mli b/stdlib/condition.mli new file mode 100644 index 00000000000..ca97e575655 --- /dev/null +++ b/stdlib/condition.mli @@ -0,0 +1,178 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy and Damien Doligez, 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +(**Condition variables. + + Condition variables are useful when several threads wish to access a + shared data structure that is protected by a mutex (a mutual exclusion + lock). + + A condition variable is a {i communication channel}. On the receiver + side, one or more threads can indicate that they wish to {i wait} + for a certain property to become true. On the sender side, a thread + can {i signal} that this property has become true, causing one (or + more) waiting threads to be woken up. + + For instance, in the implementation of a queue data structure, if a + thread that wishes to extract an element finds that the queue is + currently empty, then this thread waits for the queue to become + nonempty. A thread that inserts an element into the queue signals + that the queue has become nonempty. A condition variable is used for this + purpose. This communication channel conveys the information that + the property "the queue is nonempty" is true, or more accurately, + may be true. (We explain below why the receiver of a signal cannot + be certain that the property holds.) + + To continue the example of the queue, assuming that the queue has a fixed + maximum capacity, then a thread that wishes to insert an element + may find that the queue is full. Then, this thread must wait for + the queue to become not full, and a thread that extracts an element + of the queue signals that the queue has become not full. Another + condition variable is used for this purpose. + + In short, a condition variable [c] is used to convey the information + that a certain property {i P} about a shared data structure {i D}, + protected by a mutex [m], may be true. + + Condition variables provide an efficient alternative to busy-waiting. + When one wishes to wait for the property {i P} to be true, + instead of writing a busy-waiting loop: + {[ + Mutex.lock m; + while not P do + Mutex.unlock m; Mutex.lock m + done; + ; + Mutex.unlock m + ]} + one uses {!wait} in the body of the loop, as follows: + {[ + Mutex.lock m; + while not P do + Condition.wait c m + done; + ; + Mutex.unlock m + ]} + The busy-waiting loop is inefficient because the waiting thread + consumes processing time and creates contention of the mutex [m]. + Calling {!wait} allows the waiting thread to be suspended, so it + does not consume any computing resources while waiting. + + With a condition variable [c], exactly one mutex [m] is associated. + This association is implicit: the mutex [m] is not explicitly passed + as an argument to {!create}. It is up to the programmer to know, for + each condition variable [c], which is the associated mutex [m]. + + With a mutex [m], several condition variables can be associated. + In the example of the bounded queue, one condition variable is + used to indicate that the queue is nonempty, and another condition + variable is used to indicate that the queue is not full. + + With a condition variable [c], exactly one logical property {i P} + should be associated. Examples of such properties + include "the queue is nonempty" and "the queue is not full". + It is up to the programmer to keep track, for each condition + variable, of the corresponding property {i P}. + A signal is sent on the condition variable [c] + as an indication that the property {i P} is true, or may be true. + On the receiving end, however, a thread that is woken up + cannot assume that {i P} is true; + after a call to {!wait} terminates, + one must explicitly test whether {i P} is true. + There are several reasons why this is so. + One reason is that, + between the moment when the signal is sent + and the moment when a waiting thread receives the signal + and is scheduled, + the property {i P} may be falsified by some other thread + that is able to acquire the mutex [m] and alter the data structure {i D}. + Another reason is that {i spurious wakeups} may occur: + a waiting thread can be woken up even if no signal was sent. + + Here is a complete example, where a mutex protects a sequential + unbounded queue, and where a condition variable is used to signal + that the queue is nonempty. + {[ + type 'a safe_queue = + { queue : 'a Queue.t; mutex : Mutex.t; nonempty : Condition.t } + + let create () = + { queue = Queue.create(); mutex = Mutex.create(); + nonempty = Condition.create() } + + let add v q = + Mutex.lock q.mutex; + let was_empty = Queue.is_empty q.queue in + Queue.add v q.queue; + if was_empty then Condition.broadcast q.nonempty; + Mutex.unlock q.mutex + + let take q = + Mutex.lock q.mutex; + while Queue.is_empty q.queue do Condition.wait q.nonempty q.mutex done; + let v = Queue.take q.queue in (* cannot fail since queue is nonempty *) + Mutex.unlock q.mutex; + v + ]} + Because the call to {!broadcast} takes place inside the critical + section, the following property holds whenever the mutex is unlocked: + {i if the queue is nonempty, then no thread is waiting}, + or, in other words, + {i if some thread is waiting, then the queue must be empty}. + This is a desirable property: if a thread + that attempts to execute a [take] operation + could remain suspended + even though the queue is nonempty, + that would be a problematic situation, + known as a {i deadlock}. *) + +type t +(** The type of condition variables. *) + +val create : unit -> t +(**[create()] creates and returns a new condition variable. + This condition variable should be associated (in the programmer's mind) + with a certain mutex [m] and with a certain property {i P} of the data + structure that is protected by the mutex [m]. *) + +val wait : t -> Mutex.t -> unit +(**The call [wait c m] is permitted only if [m] is the mutex associated + with the condition variable [c], and only if [m] is currently locked. + This call atomically unlocks the mutex [m] and suspends the + current thread on the condition variable [c]. This thread can + later be woken up after the condition variable [c] has been signaled + via {!signal} or {!broadcast}; however, it can also be woken up for + no reason. The mutex [m] is locked again before [wait] returns. One + cannot assume that the property {i P} associated with the condition + variable [c] holds when [wait] returns; one must explicitly test + whether {i P} holds after calling [wait]. *) + +val signal : t -> unit +(**[signal c] wakes up one of the threads waiting on the condition + variable [c], if there is one. If there is none, this call has + no effect. + + It is recommended to call [signal c] inside a critical section, + that is, while the mutex [m] associated with [c] is locked. *) + +val broadcast : t -> unit +(**[broadcast c] wakes up all threads waiting on the condition + variable [c]. If there are none, this call has no effect. + + It is recommended to call [broadcast c] inside a critical section, + that is, while the mutex [m] associated with [c] is locked. *) diff --git a/stdlib/digest.ml b/stdlib/digest.ml index 781b0605b70..54cb1eb14d9 100644 --- a/stdlib/digest.ml +++ b/stdlib/digest.ml @@ -1,4 +1,4 @@ -# 1 "digest.ml" +# 2 "digest.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/digest.mli b/stdlib/digest.mli index 4ab5095ce56..121dcfaf59b 100644 --- a/stdlib/digest.mli +++ b/stdlib/digest.mli @@ -1,4 +1,4 @@ -# 1 "digest.mli" +# 2 "digest.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/domain.ml b/stdlib/domain.ml index 1f13660a5dd..62d43a4b497 100644 --- a/stdlib/domain.ml +++ b/stdlib/domain.ml @@ -1,3 +1,4 @@ +# 2 "domain.ml" (**************************************************************************) (* *) (* OCaml *) @@ -16,249 +17,390 @@ (* *) (**************************************************************************) -(* CR ocaml 5 runtime: domains not supported on 4.x - -module Raw = struct - (* Low-level primitives provided by the runtime *) - type t = private int - external spawn : (unit -> unit) -> Mutex.t -> t - = "caml_domain_spawn" - external self : unit -> t - = "caml_ml_domain_id" - external cpu_relax : unit -> unit - = "caml_ml_domain_cpu_relax" - external get_recommended_domain_count: unit -> int - = "caml_recommended_domain_count" [@@noalloc] -end - -let cpu_relax () = Raw.cpu_relax () +open! Stdlib + +[@@@ocaml.flambda_o3] + +module Runtime_4 = struct + module DLS = struct + + let unique_value = Obj.repr (ref 0) + let state = ref (Array.make 8 unique_value) + + let init () = () + + type 'a key = int * (unit -> 'a) + + let key_counter = ref 0 + + let new_key ?split_from_parent:_ init_orphan = + let idx = !key_counter in + key_counter := idx + 1; + (idx, init_orphan) + + (* If necessary, grow the current domain's local state array such that [idx] + * is a valid index in the array. *) + let maybe_grow idx = + let st = !state in + let sz = Array.length st in + if idx < sz then st + else begin + let rec compute_new_size s = + if idx < s then s else compute_new_size (2 * s) + in + let new_sz = compute_new_size sz in + let new_st = Array.make new_sz unique_value in + Array.blit st 0 new_st 0 sz; + state := new_st; + new_st + end + + let set (idx, _init) x = + let st = maybe_grow idx in + (* [Sys.opaque_identity] ensures that flambda does not look at the type of + * [x], which may be a [float] and conclude that the [st] is a float array. + * We do not want OCaml's float array optimisation kicking in here. *) + st.(idx) <- Obj.repr (Sys.opaque_identity x) + + let get (idx, init) = + let st = maybe_grow idx in + let v = st.(idx) in + if v == unique_value then + let v' = Obj.repr (init ()) in + st.(idx) <- (Sys.opaque_identity v'); + Obj.magic v' + else Obj.magic v + end -type id = Raw.t + (******** Callbacks **********) -type 'a state = -| Running -| Finished of ('a, exn) result + (* first spawn, domain startup and at exit functionality *) + let first_domain_spawned = Atomic.make false -type 'a t = { - domain : Raw.t; - term_mutex: Mutex.t; - term_condition: Condition.t; - term_state: 'a state ref (* protected by [term_mutex] *) -} + let first_spawn_function = ref (fun () -> ()) -module DLS = struct + let before_first_spawn f = + if Atomic.get first_domain_spawned then + raise (Invalid_argument "first domain already spawned") + else begin + let old_f = !first_spawn_function in + let new_f () = old_f (); f () in + first_spawn_function := new_f + end - type dls_state = Obj.t array + let at_exit_key = DLS.new_key (fun () -> (fun () -> ())) - let unique_value = Obj.repr (ref 0) + let at_exit f = + let old_exit : unit -> unit = DLS.get at_exit_key in + let new_exit () = + (* The domain termination callbacks ([at_exit]) are run in + last-in-first-out (LIFO) order in order to be symmetric with the domain + creation callbacks ([at_each_spawn]) which run in first-in-fisrt-out + (FIFO) order. *) + f (); old_exit () + in + DLS.set at_exit_key new_exit + + let do_at_exit () = + let f : unit -> unit = DLS.get at_exit_key in + f () + + (* Unimplemented functions *) + let not_implemented () = + failwith "Multi-domain functionality not supported in runtime4" + type !'a t + type id = int + let spawn _ = not_implemented () + let join _ = not_implemented () + let get_id _ = not_implemented () + let self () = not_implemented () + let cpu_relax () = not_implemented () + let is_main_domain () = not_implemented () + let recommended_domain_count () = not_implemented () +end - external get_dls_state : unit -> dls_state = "%dls_get" +module Runtime_5 = struct + module Raw = struct + (* Low-level primitives provided by the runtime *) + type t = private int + external spawn : (unit -> unit) -> Mutex.t -> t + = "caml_domain_spawn" + external self : unit -> t + = "caml_ml_domain_id" + external cpu_relax : unit -> unit + = "caml_ml_domain_cpu_relax" + external get_recommended_domain_count: unit -> int + = "caml_recommended_domain_count" [@@noalloc] + end - external set_dls_state : dls_state -> unit = - "caml_domain_dls_set" [@@noalloc] + let cpu_relax () = Raw.cpu_relax () + + type id = Raw.t + + type 'a state = + | Running + | Finished of ('a, exn) result + + type 'a t = { + domain : Raw.t; + term_mutex: Mutex.t; + term_condition: Condition.t; + term_state: 'a state ref (* protected by [term_mutex] *) + } + + module DLS = struct + + type dls_state = Obj.t array + + let unique_value = Obj.repr (ref 0) + + external get_dls_state : unit -> dls_state = "%dls_get" + + external set_dls_state : dls_state -> unit = + "caml_domain_dls_set" [@@noalloc] + + let create_dls () = + let st = Array.make 8 unique_value in + set_dls_state st + + let init () = create_dls () + + type 'a key = int * (unit -> 'a) + + let key_counter = Atomic.make 0 + + type key_initializer = + KI: 'a key * ('a -> 'a) -> key_initializer + + let parent_keys = Atomic.make ([] : key_initializer list) + + let rec add_parent_key ki = + let l = Atomic.get parent_keys in + if not (Atomic.compare_and_set parent_keys l (ki :: l)) + then add_parent_key ki + + let new_key ?split_from_parent init_orphan = + let idx = Atomic.fetch_and_add key_counter 1 in + let k = (idx, init_orphan) in + begin match split_from_parent with + | None -> () + | Some split -> add_parent_key (KI(k, split)) + end; + k + + (* If necessary, grow the current domain's local state array such that [idx] + * is a valid index in the array. *) + let maybe_grow idx = + let st = get_dls_state () in + let sz = Array.length st in + if idx < sz then st + else begin + let rec compute_new_size s = + if idx < s then s else compute_new_size (2 * s) + in + let new_sz = compute_new_size sz in + let new_st = Array.make new_sz unique_value in + Array.blit st 0 new_st 0 sz; + set_dls_state new_st; + new_st + end + + let set (idx, _init) x = + let st = maybe_grow idx in + (* [Sys.opaque_identity] ensures that flambda does not look at the type of + * [x], which may be a [float] and conclude that the [st] is a float array. + * We do not want OCaml's float array optimisation kicking in here. *) + st.(idx) <- Obj.repr (Sys.opaque_identity x) + + let get (idx, init) = + let st = maybe_grow idx in + let v = st.(idx) in + if v == unique_value then + let v' = Obj.repr (init ()) in + st.(idx) <- (Sys.opaque_identity v'); + Obj.magic v' + else Obj.magic v + + let get_initial_keys () : (int * Obj.t) list = + List.map + (fun (KI ((idx, _) as k, split)) -> + (idx, Obj.repr (split (get k)))) + (Atomic.get parent_keys) + + let set_initial_keys (l: (int * Obj.t) list) = + List.iter + (fun (idx, v) -> + let st = maybe_grow idx in st.(idx) <- v) + l - let create_dls () = - let st = Array.make 8 unique_value in - set_dls_state st + end - let _ = create_dls () + (******** Identity **********) - type 'a key = int * (unit -> 'a) + let get_id { domain; _ } = domain - let key_counter = Atomic.make 0 + let self () = Raw.self () - type key_initializer = - KI: 'a key * ('a -> 'a) -> key_initializer + let is_main_domain () = (self () :> int) = 0 - let parent_keys = Atomic.make ([] : key_initializer list) + (******** Callbacks **********) - let rec add_parent_key ki = - let l = Atomic.get parent_keys in - if not (Atomic.compare_and_set parent_keys l (ki :: l)) - then add_parent_key ki + (* first spawn, domain startup and at exit functionality *) + let first_domain_spawned = Atomic.make false - let new_key ?split_from_parent init_orphan = - let idx = Atomic.fetch_and_add key_counter 1 in - let k = (idx, init_orphan) in - begin match split_from_parent with - | None -> () - | Some split -> add_parent_key (KI(k, split)) - end; - k + let first_spawn_function = ref (fun () -> ()) - (* If necessary, grow the current domain's local state array such that [idx] - * is a valid index in the array. *) - let maybe_grow idx = - let st = get_dls_state () in - let sz = Array.length st in - if idx < sz then st + let before_first_spawn f = + if Atomic.get first_domain_spawned then + raise (Invalid_argument "first domain already spawned") else begin - let rec compute_new_size s = - if idx < s then s else compute_new_size (2 * s) - in - let new_sz = compute_new_size sz in - let new_st = Array.make new_sz unique_value in - Array.blit st 0 new_st 0 sz; - set_dls_state new_st; - new_st + let old_f = !first_spawn_function in + let new_f () = old_f (); f () in + first_spawn_function := new_f end - let set (idx, _init) x = - let st = maybe_grow idx in - (* [Sys.opaque_identity] ensures that flambda does not look at the type of - * [x], which may be a [float] and conclude that the [st] is a float array. - * We do not want OCaml's float array optimisation kicking in here. *) - st.(idx) <- Obj.repr (Sys.opaque_identity x) - - let get (idx, init) = - let st = maybe_grow idx in - let v = st.(idx) in - if v == unique_value then - let v' = Obj.repr (init ()) in - st.(idx) <- (Sys.opaque_identity v'); - Obj.magic v' - else Obj.magic v - - let get_initial_keys () : (int * Obj.t) list = - List.map - (fun (KI ((idx, _) as k, split)) -> - (idx, Obj.repr (split (get k)))) - (Atomic.get parent_keys) - - let set_initial_keys (l: (int * Obj.t) list) = - List.iter - (fun (idx, v) -> - let st = maybe_grow idx in st.(idx) <- v) - l + let at_exit_key = DLS.new_key (fun () -> (fun () -> ())) -end + let at_exit f = + let old_exit : unit -> unit = DLS.get at_exit_key in + let new_exit () = + (* The domain termination callbacks ([at_exit]) are run in + last-in-first-out (LIFO) order in order to be symmetric with the domain + creation callbacks ([at_each_spawn]) which run in first-in-fisrt-out + (FIFO) order. *) + f (); old_exit () + in + DLS.set at_exit_key new_exit + + let do_at_exit () = + let f : unit -> unit = DLS.get at_exit_key in + f () -(******** Identity **********) + (******* Creation and Termination ********) -let get_id { domain; _ } = domain + let do_before_first_spawn () = + if not (Atomic.get first_domain_spawned) then begin + Atomic.set first_domain_spawned true; + !first_spawn_function(); + (* Release the old function *) + first_spawn_function := (fun () -> ()) + end -let self () = Raw.self () + let spawn f = + do_before_first_spawn (); + let pk = DLS.get_initial_keys () in + + (* The [term_mutex] and [term_condition] are used to + synchronize with the joining domains *) + let term_mutex = Mutex.create () in + let term_condition = Condition.create () in + let term_state = ref Running in + + let body () = + let result = + match + DLS.create_dls (); + DLS.set_initial_keys pk; + let res = f () in + res + with + | x -> Ok x + | exception ex -> Error ex + in -let is_main_domain () = (self () :> int) = 0 + let result' = + (* Run the [at_exit] callbacks when the domain computation either + terminates normally or exceptionally. *) + match do_at_exit () with + | () -> result + | exception ex -> + begin match result with + | Ok _ -> + (* If the domain computation terminated normally, but the + [at_exit] callbacks raised an exception, then return the + exception. *) + Error ex + | Error _ -> + (* If both the domain computation and the [at_exit] callbacks + raised exceptions, then ignore the exception from the + [at_exit] callbacks and return the original exception. *) + result + end + in -(******** Callbacks **********) + (* Synchronize with joining domains *) + Mutex.lock term_mutex; + match !term_state with + | Running -> + term_state := Finished result'; + Condition.broadcast term_condition; + | Finished _ -> + failwith "internal error: Am I already finished?" + (* [term_mutex] is unlocked in the runtime after the cleanup functions on + the C side are finished. *) + in + { domain = Raw.spawn body term_mutex; + term_mutex; + term_condition; + term_state } -(* first spawn, domain startup and at exit functionality *) -let first_domain_spawned = Atomic.make false + let join { term_mutex; term_condition; term_state; _ } = + Mutex.lock term_mutex; + let rec loop () = + match !term_state with + | Running -> + Condition.wait term_condition term_mutex; + loop () + | Finished res -> + Mutex.unlock term_mutex; + res + in + match loop () with + | Ok x -> x + | Error ex -> raise ex -let first_spawn_function = ref (fun () -> ()) + let recommended_domain_count = Raw.get_recommended_domain_count +end -let before_first_spawn f = - if Atomic.get first_domain_spawned then - raise (Invalid_argument "first domain already spawned") - else begin - let old_f = !first_spawn_function in - let new_f () = old_f (); f () in - first_spawn_function := new_f +module type S = sig + type !'a t + val spawn : (unit -> 'a) -> 'a t + val join : 'a t -> 'a + type id = private int + val get_id : 'a t -> id + val self : unit -> id + val cpu_relax : unit -> unit + val is_main_domain : unit -> bool + val recommended_domain_count : unit -> int + val before_first_spawn : (unit -> unit) -> unit + val at_exit : (unit -> unit) -> unit + val do_at_exit : unit -> unit + + module DLS : sig + type 'a key + val new_key : ?split_from_parent:('a -> 'a) -> (unit -> 'a) -> 'a key + val get : 'a key -> 'a + val set : 'a key -> 'a -> unit end +end -let do_before_first_spawn () = - if not (Atomic.get first_domain_spawned) then begin - Atomic.set first_domain_spawned true; - !first_spawn_function(); - (* Release the old function *) - first_spawn_function := (fun () -> ()) +module type S' = sig + include S + module DLS : sig + include module type of struct include DLS end + val init : unit -> unit end +end -let at_exit_key = DLS.new_key (fun () -> (fun () -> ())) +let runtime_4_impl = (module Runtime_4 : S') +let runtime_5_impl = (module Runtime_5 : S') -let at_exit f = - let old_exit : unit -> unit = DLS.get at_exit_key in - let new_exit () = - (* The domain termination callbacks ([at_exit]) are run in - last-in-first-out (LIFO) order in order to be symmetric with the domain - creation callbacks ([at_each_spawn]) which run in first-in-fisrt-out - (FIFO) order. *) - f (); old_exit () - in - DLS.set at_exit_key new_exit +external runtime5 : unit -> bool = "%runtime5" -let do_at_exit () = - let f : unit -> unit = DLS.get at_exit_key in - f () +let impl = if runtime5 () then runtime_5_impl else runtime_4_impl -let _ = Stdlib.do_domain_local_at_exit := do_at_exit +include (val impl : S') -(******* Creation and Termination ********) - -let spawn f = - do_before_first_spawn (); - let pk = DLS.get_initial_keys () in - - (* The [term_mutex] and [term_condition] are used to - synchronize with the joining domains *) - let term_mutex = Mutex.create () in - let term_condition = Condition.create () in - let term_state = ref Running in - - let body () = - let result = - match - DLS.create_dls (); - DLS.set_initial_keys pk; - let res = f () in - res - with - | x -> Ok x - | exception ex -> Error ex - in +let () = DLS.init () - let result' = - (* Run the [at_exit] callbacks when the domain computation either - terminates normally or exceptionally. *) - match do_at_exit () with - | () -> result - | exception ex -> - begin match result with - | Ok _ -> - (* If the domain computation terminated normally, but the - [at_exit] callbacks raised an exception, then return the - exception. *) - Error ex - | Error _ -> - (* If both the domain computation and the [at_exit] callbacks - raised exceptions, then ignore the exception from the - [at_exit] callbacks and return the original exception. *) - result - end - in - - (* Synchronize with joining domains *) - Mutex.lock term_mutex; - match !term_state with - | Running -> - term_state := Finished result'; - Condition.broadcast term_condition; - | Finished _ -> - failwith "internal error: Am I already finished?" - (* [term_mutex] is unlocked in the runtime after the cleanup functions on - the C side are finished. *) - in - { domain = Raw.spawn body term_mutex; - term_mutex; - term_condition; - term_state } - -let join { term_mutex; term_condition; term_state; _ } = - Mutex.lock term_mutex; - let rec loop () = - match !term_state with - | Running -> - Condition.wait term_condition term_mutex; - loop () - | Finished res -> - Mutex.unlock term_mutex; - res - in - match loop () with - | Ok x -> x - | Error ex -> raise ex - -let recommended_domain_count = Raw.get_recommended_domain_count - -*) +let _ = Stdlib.do_domain_local_at_exit := do_at_exit diff --git a/stdlib/domain.mli b/stdlib/domain.mli index 2be1f0e1d53..0112b2f0fc9 100644 --- a/stdlib/domain.mli +++ b/stdlib/domain.mli @@ -1,3 +1,4 @@ +# 2 "domain.mli" (**************************************************************************) (* *) (* OCaml *) @@ -16,8 +17,6 @@ (* *) (**************************************************************************) -(* CR ocaml 5 runtime: domains not supported on 4.x - [@@@alert unstable "The Domain interface may change in incompatible ways in the future." ] @@ -53,6 +52,19 @@ val get_id : 'a t -> id val self : unit -> id (** [self ()] is the identifier of the currently running domain *) +val cpu_relax : unit -> unit +(** If busy-waiting, calling cpu_relax () between iterations + will improve performance on some CPU architectures *) + +val is_main_domain : unit -> bool +(** [is_main_domain ()] returns true if called from the initial domain. *) + +val recommended_domain_count : unit -> int +(** The recommended maximum number of domains which should be running + simultaneously (including domains already running). + + The value returned is at least [1]. *) + val before_first_spawn : (unit -> unit) -> unit (** [before_first_spawn f] registers [f] to be called before the first domain is spawned by the program. The functions registered with @@ -80,19 +92,6 @@ let temp_file_key = Domain.DLS.new_key (fun _ -> to close it, thus guaranteeing the descriptor is not leaked in case the current domain exits. *) -val cpu_relax : unit -> unit -(** If busy-waiting, calling cpu_relax () between iterations - will improve performance on some CPU architectures *) - -val is_main_domain : unit -> bool -(** [is_main_domain ()] returns true if called from the initial domain. *) - -val recommended_domain_count : unit -> int -(** The recommended maximum number of domains which should be running - simultaneously (including domains already running). - - The value returned is at least [1]. *) - module DLS : sig (** Domain-local Storage *) @@ -146,5 +145,3 @@ module DLS : sig to [k], which cannot be restored later. *) end - -*) diff --git a/stdlib/dune b/stdlib/dune index d5722a99cea..1fd2b7f679f 100644 --- a/stdlib/dune +++ b/stdlib/dune @@ -15,443 +15,466 @@ (library (name stdlib) (stdlib - (exit_module std_exit) - (internal_modules Camlinternal*) - (modules_before_stdlib - camlinternalFormatBasics - )) - (flags ( - -strict-sequence -absname -w +a-4-9-41-42-44-45-48-66-67-70 - -g -warn-error A -bin-annot -nostdlib - -safe-string -strict-formats - )) - (ocamlopt_flags (:include %{project_root}/ocamlopt_flags.sexp)) + (exit_module std_exit) + (internal_modules Camlinternal*) + (modules_before_stdlib camlinternalFormatBasics camlinternalAtomic)) + (flags + (:standard + -strict-sequence + -g + -absname + -bin-annot + -nostdlib + -safe-string + -strict-formats)) + (ocamlopt_flags + (:include %{project_root}/ocamlopt_flags.sexp)) (preprocess - (per_module - ((action - (run awk -f %{dep:expand_module_aliases.awk} %{input-file})) - stdlib) -))) + (per_module + ((action + (run awk -f %{dep:expand_module_aliases.awk} %{input-file})) + stdlib)))) (rule - (targets camlheader camlheaderd camlheaderi camlheader_ur) - (deps Makefile StdlibModules .depend ../Makefile.common ../Makefile.config_if_required ../Makefile.build_config ../Makefile.config ../runtime4/sak) - (action (run make -s COMPUTE_DEPS=false %{targets}))) + (targets camlheader camlheaderd camlheaderi camlheader_ur) + (deps + Makefile + StdlibModules + .depend + ../Makefile.common + ../Makefile.config_if_required + ../Makefile.build_config + ../Makefile.config + ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/sak) + (action + (run make -s COMPUTE_DEPS=false %{targets}))) (copy_files ../Makefile.config) (install - (files - Makefile.config - ocaml_compiler_internal_params - - camlheader - camlheaderd - camlheaderi - camlheader_ur - - stdlib.a - stdlib.cma - stdlib.cmxa - .stdlib.objs/byte/stdlib.cmi - .stdlib.objs/byte/stdlib.cmt - .stdlib.objs/byte/stdlib.cmti - - arg.ml - arg.mli - array.ml - array.mli - arrayLabels.ml - arrayLabels.mli - atomic.ml - atomic.mli - bigarray.ml - bigarray.mli - bool.ml - bool.mli - buffer.ml - buffer.mli - bytes.ml - bytes.mli - bytesLabels.ml - bytesLabels.mli - callback.ml - callback.mli - camlinternalComprehension.ml - camlinternalComprehension.mli - camlinternalFormat.ml - camlinternalFormat.mli - camlinternalFormatBasics.ml - camlinternalFormatBasics.mli - camlinternalLazy.ml - camlinternalLazy.mli - camlinternalMod.ml - camlinternalMod.mli - camlinternalOO.ml - camlinternalOO.mli - char.ml - char.mli - complex.ml - complex.mli - digest.ml - digest.mli - either.ml - either.mli - ephemeron.ml - ephemeron.mli - filename.ml - filename.mli - float.ml - float.mli - float_u.ml - float_u.mli - format.ml - format.mli - fun.ml - fun.mli - gc.ml - gc.mli - hashtbl.ml - hashtbl.mli - iarray.ml - iarray.mli - iarrayLabels.ml - iarrayLabels.mli - in_channel.ml - in_channel.mli - int.ml - int.mli - int32.ml - int32.mli - int64.ml - int64.mli - lazy.ml - lazy.mli - lexing.ml - lexing.mli - list.ml - list.mli - listLabels.ml - listLabels.mli - map.ml - map.mli - marshal.ml - marshal.mli - moreLabels.ml - moreLabels.mli - nativeint.ml - nativeint.mli - obj.ml - obj.mli - oo.ml - oo.mli - option.ml - option.mli - out_channel.ml - out_channel.mli - parsing.ml - parsing.mli - printexc.ml - printexc.mli - printf.ml - printf.mli - queue.ml - queue.mli - random.ml - random.mli - result.ml - result.mli - scanf.ml - scanf.mli - seq.ml - seq.mli - set.ml - set.mli - stack.ml - stack.mli - stdLabels.ml - stdLabels.mli - std_exit.ml - stdlib.ml - stdlib.mli - string.ml - string.mli - stringLabels.ml - stringLabels.mli - sys.ml - sys.mli - uchar.ml - uchar.mli - unit.ml - unit.mli - weak.ml - weak.mli - - .stdlib.objs/byte/stdlib__Arg.cmi - .stdlib.objs/byte/stdlib__Arg.cmt - .stdlib.objs/byte/stdlib__Arg.cmti - .stdlib.objs/byte/stdlib__Array.cmi - .stdlib.objs/byte/stdlib__Array.cmt - .stdlib.objs/byte/stdlib__Array.cmti - .stdlib.objs/byte/stdlib__ArrayLabels.cmi - .stdlib.objs/byte/stdlib__ArrayLabels.cmt - .stdlib.objs/byte/stdlib__ArrayLabels.cmti - .stdlib.objs/byte/stdlib__Atomic.cmi - .stdlib.objs/byte/stdlib__Atomic.cmt - .stdlib.objs/byte/stdlib__Atomic.cmti - .stdlib.objs/byte/stdlib__Bigarray.cmi - .stdlib.objs/byte/stdlib__Bigarray.cmt - .stdlib.objs/byte/stdlib__Bigarray.cmti - .stdlib.objs/byte/stdlib__Bool.cmi - .stdlib.objs/byte/stdlib__Bool.cmt - .stdlib.objs/byte/stdlib__Bool.cmti - .stdlib.objs/byte/stdlib__Buffer.cmi - .stdlib.objs/byte/stdlib__Buffer.cmt - .stdlib.objs/byte/stdlib__Buffer.cmti - .stdlib.objs/byte/stdlib__Bytes.cmi - .stdlib.objs/byte/stdlib__Bytes.cmt - .stdlib.objs/byte/stdlib__Bytes.cmti - .stdlib.objs/byte/stdlib__BytesLabels.cmi - .stdlib.objs/byte/stdlib__BytesLabels.cmt - .stdlib.objs/byte/stdlib__BytesLabels.cmti - .stdlib.objs/byte/stdlib__Callback.cmi - .stdlib.objs/byte/stdlib__Callback.cmt - .stdlib.objs/byte/stdlib__Callback.cmti - .stdlib.objs/byte/stdlib__Char.cmi - .stdlib.objs/byte/stdlib__Char.cmt - .stdlib.objs/byte/stdlib__Char.cmti - .stdlib.objs/byte/stdlib__Complex.cmi - .stdlib.objs/byte/stdlib__Complex.cmt - .stdlib.objs/byte/stdlib__Complex.cmti - .stdlib.objs/byte/stdlib__Digest.cmi - .stdlib.objs/byte/stdlib__Digest.cmt - .stdlib.objs/byte/stdlib__Digest.cmti - .stdlib.objs/byte/stdlib__Either.cmi - .stdlib.objs/byte/stdlib__Either.cmt - .stdlib.objs/byte/stdlib__Either.cmti - .stdlib.objs/byte/stdlib__Ephemeron.cmi - .stdlib.objs/byte/stdlib__Ephemeron.cmt - .stdlib.objs/byte/stdlib__Ephemeron.cmti - .stdlib.objs/byte/stdlib__Filename.cmi - .stdlib.objs/byte/stdlib__Filename.cmt - .stdlib.objs/byte/stdlib__Filename.cmti - .stdlib.objs/byte/stdlib__Float.cmi - .stdlib.objs/byte/stdlib__Float.cmt - .stdlib.objs/byte/stdlib__Float.cmti - .stdlib.objs/byte/stdlib__Float_u.cmi - .stdlib.objs/byte/stdlib__Float_u.cmt - .stdlib.objs/byte/stdlib__Float_u.cmti - .stdlib.objs/byte/stdlib__Format.cmi - .stdlib.objs/byte/stdlib__Format.cmt - .stdlib.objs/byte/stdlib__Format.cmti - .stdlib.objs/byte/stdlib__Fun.cmi - .stdlib.objs/byte/stdlib__Fun.cmt - .stdlib.objs/byte/stdlib__Fun.cmti - .stdlib.objs/byte/stdlib__Gc.cmi - .stdlib.objs/byte/stdlib__Gc.cmt - .stdlib.objs/byte/stdlib__Gc.cmti - .stdlib.objs/byte/stdlib__Hashtbl.cmi - .stdlib.objs/byte/stdlib__Hashtbl.cmt - .stdlib.objs/byte/stdlib__Hashtbl.cmti - .stdlib.objs/byte/stdlib__Iarray.cmi - .stdlib.objs/byte/stdlib__Iarray.cmt - .stdlib.objs/byte/stdlib__Iarray.cmti - .stdlib.objs/byte/stdlib__IarrayLabels.cmi - .stdlib.objs/byte/stdlib__IarrayLabels.cmt - .stdlib.objs/byte/stdlib__IarrayLabels.cmti - .stdlib.objs/byte/stdlib__In_channel.cmi - .stdlib.objs/byte/stdlib__In_channel.cmt - .stdlib.objs/byte/stdlib__In_channel.cmti - .stdlib.objs/byte/stdlib__Int.cmi - .stdlib.objs/byte/stdlib__Int.cmt - .stdlib.objs/byte/stdlib__Int.cmti - .stdlib.objs/byte/stdlib__Int32.cmi - .stdlib.objs/byte/stdlib__Int32.cmt - .stdlib.objs/byte/stdlib__Int32.cmti - .stdlib.objs/byte/stdlib__Int64.cmi - .stdlib.objs/byte/stdlib__Int64.cmt - .stdlib.objs/byte/stdlib__Int64.cmti - .stdlib.objs/byte/stdlib__Lazy.cmi - .stdlib.objs/byte/stdlib__Lazy.cmt - .stdlib.objs/byte/stdlib__Lazy.cmti - .stdlib.objs/byte/stdlib__Lexing.cmi - .stdlib.objs/byte/stdlib__Lexing.cmt - .stdlib.objs/byte/stdlib__Lexing.cmti - .stdlib.objs/byte/stdlib__List.cmi - .stdlib.objs/byte/stdlib__List.cmt - .stdlib.objs/byte/stdlib__List.cmti - .stdlib.objs/byte/stdlib__ListLabels.cmi - .stdlib.objs/byte/stdlib__ListLabels.cmt - .stdlib.objs/byte/stdlib__ListLabels.cmti - .stdlib.objs/byte/stdlib__Map.cmi - .stdlib.objs/byte/stdlib__Map.cmt - .stdlib.objs/byte/stdlib__Map.cmti - .stdlib.objs/byte/stdlib__Marshal.cmi - .stdlib.objs/byte/stdlib__Marshal.cmt - .stdlib.objs/byte/stdlib__Marshal.cmti - .stdlib.objs/byte/stdlib__MoreLabels.cmi - .stdlib.objs/byte/stdlib__MoreLabels.cmt - .stdlib.objs/byte/stdlib__MoreLabels.cmti - .stdlib.objs/byte/stdlib__Nativeint.cmi - .stdlib.objs/byte/stdlib__Nativeint.cmt - .stdlib.objs/byte/stdlib__Nativeint.cmti - .stdlib.objs/byte/stdlib__Obj.cmi - .stdlib.objs/byte/stdlib__Obj.cmt - .stdlib.objs/byte/stdlib__Obj.cmti - .stdlib.objs/byte/stdlib__Oo.cmi - .stdlib.objs/byte/stdlib__Oo.cmt - .stdlib.objs/byte/stdlib__Oo.cmti - .stdlib.objs/byte/stdlib__Option.cmi - .stdlib.objs/byte/stdlib__Option.cmt - .stdlib.objs/byte/stdlib__Option.cmti - .stdlib.objs/byte/stdlib__Out_channel.cmi - .stdlib.objs/byte/stdlib__Out_channel.cmt - .stdlib.objs/byte/stdlib__Out_channel.cmti - .stdlib.objs/byte/stdlib__Parsing.cmi - .stdlib.objs/byte/stdlib__Parsing.cmt - .stdlib.objs/byte/stdlib__Parsing.cmti - .stdlib.objs/byte/stdlib__Printexc.cmi - .stdlib.objs/byte/stdlib__Printexc.cmt - .stdlib.objs/byte/stdlib__Printexc.cmti - .stdlib.objs/byte/stdlib__Printf.cmi - .stdlib.objs/byte/stdlib__Printf.cmt - .stdlib.objs/byte/stdlib__Printf.cmti - .stdlib.objs/byte/stdlib__Queue.cmi - .stdlib.objs/byte/stdlib__Queue.cmt - .stdlib.objs/byte/stdlib__Queue.cmti - .stdlib.objs/byte/stdlib__Random.cmi - .stdlib.objs/byte/stdlib__Random.cmt - .stdlib.objs/byte/stdlib__Random.cmti - .stdlib.objs/byte/stdlib__Result.cmi - .stdlib.objs/byte/stdlib__Result.cmt - .stdlib.objs/byte/stdlib__Result.cmti - .stdlib.objs/byte/stdlib__Scanf.cmi - .stdlib.objs/byte/stdlib__Scanf.cmt - .stdlib.objs/byte/stdlib__Scanf.cmti - .stdlib.objs/byte/stdlib__Seq.cmi - .stdlib.objs/byte/stdlib__Seq.cmt - .stdlib.objs/byte/stdlib__Seq.cmti - .stdlib.objs/byte/stdlib__Set.cmi - .stdlib.objs/byte/stdlib__Set.cmt - .stdlib.objs/byte/stdlib__Set.cmti - .stdlib.objs/byte/stdlib__Stack.cmi - .stdlib.objs/byte/stdlib__Stack.cmt - .stdlib.objs/byte/stdlib__Stack.cmti - .stdlib.objs/byte/stdlib__StdLabels.cmi - .stdlib.objs/byte/stdlib__StdLabels.cmt - .stdlib.objs/byte/stdlib__StdLabels.cmti - .stdlib.objs/byte/stdlib__String.cmi - .stdlib.objs/byte/stdlib__String.cmt - .stdlib.objs/byte/stdlib__String.cmti - .stdlib.objs/byte/stdlib__StringLabels.cmi - .stdlib.objs/byte/stdlib__StringLabels.cmt - .stdlib.objs/byte/stdlib__StringLabels.cmti - .stdlib.objs/byte/stdlib__Sys.cmi - .stdlib.objs/byte/stdlib__Sys.cmt - .stdlib.objs/byte/stdlib__Sys.cmti - .stdlib.objs/byte/stdlib__Uchar.cmi - .stdlib.objs/byte/stdlib__Uchar.cmt - .stdlib.objs/byte/stdlib__Uchar.cmti - .stdlib.objs/byte/stdlib__Unit.cmi - .stdlib.objs/byte/stdlib__Unit.cmt - .stdlib.objs/byte/stdlib__Unit.cmti - .stdlib.objs/byte/stdlib__Weak.cmi - .stdlib.objs/byte/stdlib__Weak.cmt - .stdlib.objs/byte/stdlib__Weak.cmti - - .stdlib.objs/native/stdlib.cmx - - .stdlib.objs/byte/camlinternalComprehension.cmi - .stdlib.objs/byte/camlinternalMod.cmi - .stdlib.objs/byte/camlinternalFormatBasics.cmi - .stdlib.objs/byte/camlinternalLazy.cmi - .stdlib.objs/byte/camlinternalOO.cmi - .stdlib.objs/byte/camlinternalFormat.cmi - - .stdlib.objs/byte/camlinternalComprehension.cmt - .stdlib.objs/byte/camlinternalMod.cmt - .stdlib.objs/byte/camlinternalFormatBasics.cmt - .stdlib.objs/byte/camlinternalLazy.cmt - .stdlib.objs/byte/camlinternalOO.cmt - .stdlib.objs/byte/camlinternalFormat.cmt - - .stdlib.objs/byte/camlinternalComprehension.cmti - .stdlib.objs/byte/camlinternalMod.cmti - .stdlib.objs/byte/camlinternalFormatBasics.cmti - .stdlib.objs/byte/camlinternalLazy.cmti - .stdlib.objs/byte/camlinternalOO.cmti - .stdlib.objs/byte/camlinternalFormat.cmti - - .stdlib.objs/native/camlinternalComprehension.cmx - .stdlib.objs/native/camlinternalMod.cmx - .stdlib.objs/native/camlinternalFormatBasics.cmx - .stdlib.objs/native/camlinternalLazy.cmx - .stdlib.objs/native/camlinternalOO.cmx - .stdlib.objs/native/camlinternalFormat.cmx - - .stdlib.objs/byte/std_exit.cmi - .stdlib.objs/byte/std_exit.cmo - .stdlib.objs/byte/std_exit.cmt - .stdlib.objs/native/std_exit.o - .stdlib.objs/native/std_exit.cmx - - .stdlib.objs/native/stdlib__Sys.cmx - .stdlib.objs/native/stdlib__Hashtbl.cmx - .stdlib.objs/native/stdlib__Filename.cmx - .stdlib.objs/native/stdlib__Queue.cmx - .stdlib.objs/native/stdlib__StdLabels.cmx - .stdlib.objs/native/stdlib__Weak.cmx - .stdlib.objs/native/stdlib__Float.cmx - .stdlib.objs/native/stdlib__Float_u.cmx - .stdlib.objs/native/stdlib__Fun.cmx - .stdlib.objs/native/stdlib__Bigarray.cmx - .stdlib.objs/native/stdlib__Array.cmx - .stdlib.objs/native/stdlib__Int32.cmx - .stdlib.objs/native/stdlib__Lexing.cmx - .stdlib.objs/native/stdlib__ArrayLabels.cmx - .stdlib.objs/native/stdlib__Obj.cmx - .stdlib.objs/native/stdlib__Result.cmx - .stdlib.objs/native/stdlib__Map.cmx - .stdlib.objs/native/stdlib__Char.cmx - .stdlib.objs/native/stdlib__Printexc.cmx - .stdlib.objs/native/stdlib__Lazy.cmx - .stdlib.objs/native/stdlib__Parsing.cmx - .stdlib.objs/native/stdlib__Option.cmx - .stdlib.objs/native/stdlib__Uchar.cmx - .stdlib.objs/native/stdlib__Buffer.cmx - .stdlib.objs/native/stdlib__StringLabels.cmx - .stdlib.objs/native/stdlib__Ephemeron.cmx - .stdlib.objs/native/stdlib__String.cmx - .stdlib.objs/native/stdlib__Nativeint.cmx - .stdlib.objs/native/stdlib__Set.cmx - .stdlib.objs/native/stdlib__ListLabels.cmx - .stdlib.objs/native/stdlib__Bool.cmx - .stdlib.objs/native/stdlib__Gc.cmx - .stdlib.objs/native/stdlib__Seq.cmx - .stdlib.objs/native/stdlib__Random.cmx - .stdlib.objs/native/stdlib__Int.cmx - .stdlib.objs/native/stdlib__Int64.cmx - .stdlib.objs/native/stdlib__Scanf.cmx - .stdlib.objs/native/stdlib__Printf.cmx - .stdlib.objs/native/stdlib__Complex.cmx - .stdlib.objs/native/stdlib__Stack.cmx - .stdlib.objs/native/stdlib__Bytes.cmx - .stdlib.objs/native/stdlib__MoreLabels.cmx - .stdlib.objs/native/stdlib__Oo.cmx - .stdlib.objs/native/stdlib__Format.cmx - .stdlib.objs/native/stdlib__Unit.cmx - .stdlib.objs/native/stdlib__List.cmx - .stdlib.objs/native/stdlib__Arg.cmx - .stdlib.objs/native/stdlib__Callback.cmx - .stdlib.objs/native/stdlib__Marshal.cmx - .stdlib.objs/native/stdlib__BytesLabels.cmx - .stdlib.objs/native/stdlib__Digest.cmx - .stdlib.objs/native/stdlib__Atomic.cmx - .stdlib.objs/native/stdlib__Either.cmx - .stdlib.objs/native/stdlib__In_channel.cmx - .stdlib.objs/native/stdlib__Out_channel.cmx - .stdlib.objs/native/stdlib__Iarray.cmx - .stdlib.objs/native/stdlib__IarrayLabels.cmx - ) - (section lib) - (package ocaml_runtime_stdlib)) + (files + Makefile.config + camlheader + camlheaderd + camlheaderi + camlheader_ur + stdlib.a + stdlib.cma + stdlib.cmxa + .stdlib.objs/byte/stdlib.cmi + .stdlib.objs/byte/stdlib.cmt + .stdlib.objs/byte/stdlib.cmti + arg.ml + arg.mli + array.ml + array.mli + arrayLabels.ml + arrayLabels.mli + atomic.ml + atomic.mli + effect.ml + effect.mli + bigarray.ml + bigarray.mli + bool.ml + bool.mli + buffer.ml + buffer.mli + bytes.ml + bytes.mli + bytesLabels.ml + bytesLabels.mli + callback.ml + callback.mli + camlinternalAtomic.ml + camlinternalAtomic.mli + camlinternalComprehension.ml + camlinternalComprehension.mli + camlinternalFormat.ml + camlinternalFormat.mli + camlinternalFormatBasics.ml + camlinternalFormatBasics.mli + camlinternalLazy.ml + camlinternalLazy.mli + camlinternalMod.ml + camlinternalMod.mli + camlinternalOO.ml + camlinternalOO.mli + char.ml + char.mli + complex.ml + complex.mli + condition.ml + condition.mli + digest.ml + digest.mli + domain.ml + domain.mli + either.ml + either.mli + ephemeron.ml + ephemeron.mli + filename.ml + filename.mli + float.ml + float.mli + format.ml + format.mli + fun.ml + fun.mli + gc.ml + gc.mli + hashtbl.ml + hashtbl.mli + in_channel.ml + in_channel.mli + int.ml + int.mli + int32.ml + int32.mli + int64.ml + int64.mli + lazy.ml + lazy.mli + lexing.ml + lexing.mli + list.ml + list.mli + listLabels.ml + listLabels.mli + map.ml + map.mli + marshal.ml + marshal.mli + moreLabels.ml + moreLabels.mli + mutex.ml + mutex.mli + nativeint.ml + nativeint.mli + obj.ml + obj.mli + oo.ml + oo.mli + option.ml + option.mli + out_channel.ml + out_channel.mli + parsing.ml + parsing.mli + printexc.ml + printexc.mli + printf.ml + printf.mli + queue.ml + queue.mli + random.ml + random.mli + result.ml + result.mli + scanf.ml + scanf.mli + semaphore.ml + semaphore.mli + seq.ml + seq.mli + set.ml + set.mli + stack.ml + stack.mli + stdLabels.ml + stdLabels.mli + std_exit.ml + stdlib.ml + stdlib.mli + string.ml + string.mli + stringLabels.ml + stringLabels.mli + sys.ml + sys.mli + type.ml + type.mli + uchar.ml + uchar.mli + unit.ml + unit.mli + weak.ml + weak.mli + .stdlib.objs/byte/stdlib__Arg.cmi + .stdlib.objs/byte/stdlib__Arg.cmt + .stdlib.objs/byte/stdlib__Arg.cmti + .stdlib.objs/byte/stdlib__Array.cmi + .stdlib.objs/byte/stdlib__Array.cmt + .stdlib.objs/byte/stdlib__Array.cmti + .stdlib.objs/byte/stdlib__ArrayLabels.cmi + .stdlib.objs/byte/stdlib__ArrayLabels.cmt + .stdlib.objs/byte/stdlib__ArrayLabels.cmti + .stdlib.objs/byte/stdlib__Atomic.cmi + .stdlib.objs/byte/stdlib__Atomic.cmt + .stdlib.objs/byte/stdlib__Atomic.cmti + .stdlib.objs/byte/stdlib__Effect.cmi + .stdlib.objs/byte/stdlib__Effect.cmt + .stdlib.objs/byte/stdlib__Effect.cmti + .stdlib.objs/byte/stdlib__Bigarray.cmi + .stdlib.objs/byte/stdlib__Bigarray.cmt + .stdlib.objs/byte/stdlib__Bigarray.cmti + .stdlib.objs/byte/stdlib__Bool.cmi + .stdlib.objs/byte/stdlib__Bool.cmt + .stdlib.objs/byte/stdlib__Bool.cmti + .stdlib.objs/byte/stdlib__Buffer.cmi + .stdlib.objs/byte/stdlib__Buffer.cmt + .stdlib.objs/byte/stdlib__Buffer.cmti + .stdlib.objs/byte/stdlib__Bytes.cmi + .stdlib.objs/byte/stdlib__Bytes.cmt + .stdlib.objs/byte/stdlib__Bytes.cmti + .stdlib.objs/byte/stdlib__BytesLabels.cmi + .stdlib.objs/byte/stdlib__BytesLabels.cmt + .stdlib.objs/byte/stdlib__BytesLabels.cmti + .stdlib.objs/byte/stdlib__Callback.cmi + .stdlib.objs/byte/stdlib__Callback.cmt + .stdlib.objs/byte/stdlib__Callback.cmti + .stdlib.objs/byte/stdlib__Char.cmi + .stdlib.objs/byte/stdlib__Char.cmt + .stdlib.objs/byte/stdlib__Char.cmti + .stdlib.objs/byte/stdlib__Complex.cmi + .stdlib.objs/byte/stdlib__Complex.cmt + .stdlib.objs/byte/stdlib__Complex.cmti + .stdlib.objs/byte/stdlib__Condition.cmi + .stdlib.objs/byte/stdlib__Condition.cmt + .stdlib.objs/byte/stdlib__Condition.cmti + .stdlib.objs/byte/stdlib__Digest.cmi + .stdlib.objs/byte/stdlib__Digest.cmt + .stdlib.objs/byte/stdlib__Digest.cmti + .stdlib.objs/byte/stdlib__Domain.cmi + .stdlib.objs/byte/stdlib__Domain.cmt + .stdlib.objs/byte/stdlib__Domain.cmti + .stdlib.objs/byte/stdlib__Either.cmi + .stdlib.objs/byte/stdlib__Either.cmt + .stdlib.objs/byte/stdlib__Either.cmti + .stdlib.objs/byte/stdlib__Ephemeron.cmi + .stdlib.objs/byte/stdlib__Ephemeron.cmt + .stdlib.objs/byte/stdlib__Ephemeron.cmti + .stdlib.objs/byte/stdlib__Filename.cmi + .stdlib.objs/byte/stdlib__Filename.cmt + .stdlib.objs/byte/stdlib__Filename.cmti + .stdlib.objs/byte/stdlib__Float.cmi + .stdlib.objs/byte/stdlib__Float.cmt + .stdlib.objs/byte/stdlib__Float.cmti + .stdlib.objs/byte/stdlib__Format.cmi + .stdlib.objs/byte/stdlib__Format.cmt + .stdlib.objs/byte/stdlib__Format.cmti + .stdlib.objs/byte/stdlib__Fun.cmi + .stdlib.objs/byte/stdlib__Fun.cmt + .stdlib.objs/byte/stdlib__Fun.cmti + .stdlib.objs/byte/stdlib__Gc.cmi + .stdlib.objs/byte/stdlib__Gc.cmt + .stdlib.objs/byte/stdlib__Gc.cmti + .stdlib.objs/byte/stdlib__Hashtbl.cmi + .stdlib.objs/byte/stdlib__Hashtbl.cmt + .stdlib.objs/byte/stdlib__Hashtbl.cmti + .stdlib.objs/byte/stdlib__In_channel.cmi + .stdlib.objs/byte/stdlib__In_channel.cmt + .stdlib.objs/byte/stdlib__In_channel.cmti + .stdlib.objs/byte/stdlib__Int.cmi + .stdlib.objs/byte/stdlib__Int.cmt + .stdlib.objs/byte/stdlib__Int.cmti + .stdlib.objs/byte/stdlib__Int32.cmi + .stdlib.objs/byte/stdlib__Int32.cmt + .stdlib.objs/byte/stdlib__Int32.cmti + .stdlib.objs/byte/stdlib__Int64.cmi + .stdlib.objs/byte/stdlib__Int64.cmt + .stdlib.objs/byte/stdlib__Int64.cmti + .stdlib.objs/byte/stdlib__Lazy.cmi + .stdlib.objs/byte/stdlib__Lazy.cmt + .stdlib.objs/byte/stdlib__Lazy.cmti + .stdlib.objs/byte/stdlib__Lexing.cmi + .stdlib.objs/byte/stdlib__Lexing.cmt + .stdlib.objs/byte/stdlib__Lexing.cmti + .stdlib.objs/byte/stdlib__List.cmi + .stdlib.objs/byte/stdlib__List.cmt + .stdlib.objs/byte/stdlib__List.cmti + .stdlib.objs/byte/stdlib__ListLabels.cmi + .stdlib.objs/byte/stdlib__ListLabels.cmt + .stdlib.objs/byte/stdlib__ListLabels.cmti + .stdlib.objs/byte/stdlib__Map.cmi + .stdlib.objs/byte/stdlib__Map.cmt + .stdlib.objs/byte/stdlib__Map.cmti + .stdlib.objs/byte/stdlib__Marshal.cmi + .stdlib.objs/byte/stdlib__Marshal.cmt + .stdlib.objs/byte/stdlib__Marshal.cmti + .stdlib.objs/byte/stdlib__MoreLabels.cmi + .stdlib.objs/byte/stdlib__MoreLabels.cmt + .stdlib.objs/byte/stdlib__MoreLabels.cmti + .stdlib.objs/byte/stdlib__Mutex.cmi + .stdlib.objs/byte/stdlib__Mutex.cmt + .stdlib.objs/byte/stdlib__Mutex.cmti + .stdlib.objs/byte/stdlib__Nativeint.cmi + .stdlib.objs/byte/stdlib__Nativeint.cmt + .stdlib.objs/byte/stdlib__Nativeint.cmti + .stdlib.objs/byte/stdlib__Obj.cmi + .stdlib.objs/byte/stdlib__Obj.cmt + .stdlib.objs/byte/stdlib__Obj.cmti + .stdlib.objs/byte/stdlib__Oo.cmi + .stdlib.objs/byte/stdlib__Oo.cmt + .stdlib.objs/byte/stdlib__Oo.cmti + .stdlib.objs/byte/stdlib__Option.cmi + .stdlib.objs/byte/stdlib__Option.cmt + .stdlib.objs/byte/stdlib__Option.cmti + .stdlib.objs/byte/stdlib__Out_channel.cmi + .stdlib.objs/byte/stdlib__Out_channel.cmt + .stdlib.objs/byte/stdlib__Out_channel.cmti + .stdlib.objs/byte/stdlib__Parsing.cmi + .stdlib.objs/byte/stdlib__Parsing.cmt + .stdlib.objs/byte/stdlib__Parsing.cmti + .stdlib.objs/byte/stdlib__Printexc.cmi + .stdlib.objs/byte/stdlib__Printexc.cmt + .stdlib.objs/byte/stdlib__Printexc.cmti + .stdlib.objs/byte/stdlib__Printf.cmi + .stdlib.objs/byte/stdlib__Printf.cmt + .stdlib.objs/byte/stdlib__Printf.cmti + .stdlib.objs/byte/stdlib__Queue.cmi + .stdlib.objs/byte/stdlib__Queue.cmt + .stdlib.objs/byte/stdlib__Queue.cmti + .stdlib.objs/byte/stdlib__Random.cmi + .stdlib.objs/byte/stdlib__Random.cmt + .stdlib.objs/byte/stdlib__Random.cmti + .stdlib.objs/byte/stdlib__Result.cmi + .stdlib.objs/byte/stdlib__Result.cmt + .stdlib.objs/byte/stdlib__Result.cmti + .stdlib.objs/byte/stdlib__Scanf.cmi + .stdlib.objs/byte/stdlib__Scanf.cmt + .stdlib.objs/byte/stdlib__Scanf.cmti + .stdlib.objs/byte/stdlib__Semaphore.cmi + .stdlib.objs/byte/stdlib__Semaphore.cmt + .stdlib.objs/byte/stdlib__Semaphore.cmti + .stdlib.objs/byte/stdlib__Seq.cmi + .stdlib.objs/byte/stdlib__Seq.cmt + .stdlib.objs/byte/stdlib__Seq.cmti + .stdlib.objs/byte/stdlib__Set.cmi + .stdlib.objs/byte/stdlib__Set.cmt + .stdlib.objs/byte/stdlib__Set.cmti + .stdlib.objs/byte/stdlib__Stack.cmi + .stdlib.objs/byte/stdlib__Stack.cmt + .stdlib.objs/byte/stdlib__Stack.cmti + .stdlib.objs/byte/stdlib__StdLabels.cmi + .stdlib.objs/byte/stdlib__StdLabels.cmt + .stdlib.objs/byte/stdlib__StdLabels.cmti + .stdlib.objs/byte/stdlib__String.cmi + .stdlib.objs/byte/stdlib__String.cmt + .stdlib.objs/byte/stdlib__String.cmti + .stdlib.objs/byte/stdlib__StringLabels.cmi + .stdlib.objs/byte/stdlib__StringLabels.cmt + .stdlib.objs/byte/stdlib__StringLabels.cmti + .stdlib.objs/byte/stdlib__Sys.cmi + .stdlib.objs/byte/stdlib__Sys.cmt + .stdlib.objs/byte/stdlib__Sys.cmti + .stdlib.objs/byte/stdlib__Type.cmi + .stdlib.objs/byte/stdlib__Type.cmt + .stdlib.objs/byte/stdlib__Type.cmti + .stdlib.objs/byte/stdlib__Uchar.cmi + .stdlib.objs/byte/stdlib__Uchar.cmt + .stdlib.objs/byte/stdlib__Uchar.cmti + .stdlib.objs/byte/stdlib__Unit.cmi + .stdlib.objs/byte/stdlib__Unit.cmt + .stdlib.objs/byte/stdlib__Unit.cmti + .stdlib.objs/byte/stdlib__Weak.cmi + .stdlib.objs/byte/stdlib__Weak.cmt + .stdlib.objs/byte/stdlib__Weak.cmti + .stdlib.objs/native/stdlib.cmx + .stdlib.objs/byte/camlinternalAtomic.cmi + .stdlib.objs/byte/camlinternalComprehension.cmi + .stdlib.objs/byte/camlinternalMod.cmi + .stdlib.objs/byte/camlinternalFormatBasics.cmi + .stdlib.objs/byte/camlinternalLazy.cmi + .stdlib.objs/byte/camlinternalOO.cmi + .stdlib.objs/byte/camlinternalFormat.cmi + .stdlib.objs/byte/camlinternalAtomic.cmt + .stdlib.objs/byte/camlinternalComprehension.cmt + .stdlib.objs/byte/camlinternalMod.cmt + .stdlib.objs/byte/camlinternalFormatBasics.cmt + .stdlib.objs/byte/camlinternalLazy.cmt + .stdlib.objs/byte/camlinternalOO.cmt + .stdlib.objs/byte/camlinternalFormat.cmt + .stdlib.objs/byte/camlinternalAtomic.cmti + .stdlib.objs/byte/camlinternalComprehension.cmti + .stdlib.objs/byte/camlinternalMod.cmti + .stdlib.objs/byte/camlinternalFormatBasics.cmti + .stdlib.objs/byte/camlinternalLazy.cmti + .stdlib.objs/byte/camlinternalOO.cmti + .stdlib.objs/byte/camlinternalFormat.cmti + .stdlib.objs/native/camlinternalAtomic.cmx + .stdlib.objs/native/camlinternalComprehension.cmx + .stdlib.objs/native/camlinternalMod.cmx + .stdlib.objs/native/camlinternalFormatBasics.cmx + .stdlib.objs/native/camlinternalLazy.cmx + .stdlib.objs/native/camlinternalOO.cmx + .stdlib.objs/native/camlinternalFormat.cmx + .stdlib.objs/byte/std_exit.cmi + .stdlib.objs/byte/std_exit.cmo + .stdlib.objs/byte/std_exit.cmt + .stdlib.objs/native/std_exit.o + .stdlib.objs/native/std_exit.cmx + .stdlib.objs/native/stdlib__Sys.cmx + .stdlib.objs/native/stdlib__Hashtbl.cmx + .stdlib.objs/native/stdlib__Filename.cmx + .stdlib.objs/native/stdlib__Queue.cmx + .stdlib.objs/native/stdlib__StdLabels.cmx + .stdlib.objs/native/stdlib__Weak.cmx + .stdlib.objs/native/stdlib__Float.cmx + .stdlib.objs/native/stdlib__Fun.cmx + .stdlib.objs/native/stdlib__Bigarray.cmx + .stdlib.objs/native/stdlib__Array.cmx + .stdlib.objs/native/stdlib__Int32.cmx + .stdlib.objs/native/stdlib__Lexing.cmx + .stdlib.objs/native/stdlib__ArrayLabels.cmx + .stdlib.objs/native/stdlib__Obj.cmx + .stdlib.objs/native/stdlib__Result.cmx + .stdlib.objs/native/stdlib__Map.cmx + .stdlib.objs/native/stdlib__Char.cmx + .stdlib.objs/native/stdlib__Condition.cmx + .stdlib.objs/native/stdlib__Mutex.cmx + .stdlib.objs/native/stdlib__Semaphore.cmx + .stdlib.objs/native/stdlib__Printexc.cmx + .stdlib.objs/native/stdlib__Lazy.cmx + .stdlib.objs/native/stdlib__Parsing.cmx + .stdlib.objs/native/stdlib__Option.cmx + .stdlib.objs/native/stdlib__Type.cmx + .stdlib.objs/native/stdlib__Uchar.cmx + .stdlib.objs/native/stdlib__Buffer.cmx + .stdlib.objs/native/stdlib__StringLabels.cmx + .stdlib.objs/native/stdlib__Ephemeron.cmx + .stdlib.objs/native/stdlib__String.cmx + .stdlib.objs/native/stdlib__Nativeint.cmx + .stdlib.objs/native/stdlib__Set.cmx + .stdlib.objs/native/stdlib__ListLabels.cmx + .stdlib.objs/native/stdlib__Bool.cmx + .stdlib.objs/native/stdlib__Gc.cmx + .stdlib.objs/native/stdlib__Seq.cmx + .stdlib.objs/native/stdlib__Random.cmx + .stdlib.objs/native/stdlib__Int.cmx + .stdlib.objs/native/stdlib__Int64.cmx + .stdlib.objs/native/stdlib__Scanf.cmx + .stdlib.objs/native/stdlib__Printf.cmx + .stdlib.objs/native/stdlib__Complex.cmx + .stdlib.objs/native/stdlib__Stack.cmx + .stdlib.objs/native/stdlib__Bytes.cmx + .stdlib.objs/native/stdlib__MoreLabels.cmx + .stdlib.objs/native/stdlib__Oo.cmx + .stdlib.objs/native/stdlib__Format.cmx + .stdlib.objs/native/stdlib__Unit.cmx + .stdlib.objs/native/stdlib__List.cmx + .stdlib.objs/native/stdlib__Arg.cmx + .stdlib.objs/native/stdlib__Callback.cmx + .stdlib.objs/native/stdlib__Marshal.cmx + .stdlib.objs/native/stdlib__BytesLabels.cmx + .stdlib.objs/native/stdlib__Digest.cmx + .stdlib.objs/native/stdlib__Domain.cmx + .stdlib.objs/native/stdlib__Atomic.cmx + .stdlib.objs/native/stdlib__Effect.cmx + .stdlib.objs/native/stdlib__Either.cmx + .stdlib.objs/native/stdlib__In_channel.cmx + .stdlib.objs/native/stdlib__Out_channel.cmx + (META as stdlib/META)) + (section lib) + (package ocaml_runtime_stdlib)) diff --git a/stdlib/effect.ml b/stdlib/effect.ml index 5fc2ec678d3..c52d98dd703 100644 --- a/stdlib/effect.ml +++ b/stdlib/effect.ml @@ -1,3 +1,4 @@ +# 1 "effect.ml" (**************************************************************************) (* *) (* OCaml *) @@ -12,10 +13,6 @@ (* *) (**************************************************************************) -(* CR mshinwell: To be re-enabled in due course *) - -(* - type 'a t = .. external perform : 'a t -> 'a = "%perform" @@ -163,5 +160,3 @@ module Shallow = struct ('a,'b) continuation -> int -> Printexc.raw_backtrace = "caml_get_continuation_callstack" end - -*) diff --git a/stdlib/effect.mli b/stdlib/effect.mli index 70ce888799b..537260f309b 100644 --- a/stdlib/effect.mli +++ b/stdlib/effect.mli @@ -1,3 +1,4 @@ +# 1 "effect.mli" (**************************************************************************) (* *) (* OCaml *) @@ -12,10 +13,6 @@ (* *) (**************************************************************************) -(* CR mshinwell: To be re-enabled in due course *) - -(* - [@@@alert unstable "The Effect interface may change in incompatible ways in the future." ] @@ -149,5 +146,3 @@ module Shallow : sig (** [get_callstack c n] returns a description of the top of the call stack on the continuation [c], with at most [n] entries. *) end - -*) diff --git a/stdlib/ephemeron.ml b/stdlib/ephemeron.ml index 05eabd8d246..245186411a2 100644 --- a/stdlib/ephemeron.ml +++ b/stdlib/ephemeron.ml @@ -1,4 +1,4 @@ -# 1 "ephemeron.ml" +# 2 "ephemeron.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/ephemeron.mli b/stdlib/ephemeron.mli index 3f7e490d81b..eebeca0f3d8 100644 --- a/stdlib/ephemeron.mli +++ b/stdlib/ephemeron.mli @@ -1,4 +1,4 @@ -# 1 "ephemeron.mli" +# 2 "ephemeron.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/filename.ml b/stdlib/filename.ml index 0933485f76a..7c9c4c99c66 100644 --- a/stdlib/filename.ml +++ b/stdlib/filename.ml @@ -1,4 +1,4 @@ -# 1 "filename.ml" +# 2 "filename.ml" (**************************************************************************) (* *) (* OCaml *) @@ -333,28 +333,10 @@ let remove_extension name = external open_desc: string -> open_flag list -> int -> int = "caml_sys_open" external close_desc: int -> unit = "caml_sys_close" -(* CR ocaml 5 runtime: - BACKPORT BEGIN -let prng_key = - Domain.DLS.new_key Random.State.make_self_init -*) -let prng_key = ref (lazy(Random.State.make_self_init ())) -(* BACKPORT END *) - -(* BACKPORT BEGIN *) -module Domain = struct - module DLS = struct - let new_key ~split_from_parent:_ f = - ref (f ()) - - let get = (!) - let set = (:=) - end -end -(* BACKPORT END *) +let prng_key = Domain.DLS.new_key Random.State.make_self_init let temp_file_name temp_dir prefix suffix = - let random_state = Lazy.force (Domain.DLS.get prng_key) in + let random_state = Domain.DLS.get prng_key in let rnd = (Random.State.bits random_state) land 0xFFFFFF in concat temp_dir (Printf.sprintf "%s%06x%s" prefix rnd suffix) diff --git a/stdlib/filename.mli b/stdlib/filename.mli index bd4da5d1482..88dd6d94a9c 100644 --- a/stdlib/filename.mli +++ b/stdlib/filename.mli @@ -1,4 +1,4 @@ -# 1 "filename.mli" +# 2 "filename.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/float.ml b/stdlib/float.ml index a370d7c29ce..73258f28ba6 100644 --- a/stdlib/float.ml +++ b/stdlib/float.ml @@ -1,4 +1,4 @@ -# 1 "float.ml" +# 2 "float.ml" (**************************************************************************) (* *) (* OCaml *) @@ -171,8 +171,11 @@ let[@inline] min_max_num (x: float) (y: float) = else if is_nan y then (x,x) else if y > x || (not(sign_bit y) && sign_bit x) then (x,y) else (y,x) +(* [caml_hash_exn] doesn't raise on floats, so it's safe for + it to be marked as [@@noalloc]. + *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> float -> int = "caml_hash_exn" [@@noalloc] let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x diff --git a/stdlib/float.mli b/stdlib/float.mli index a8c8d9280e3..0475e56a4a2 100644 --- a/stdlib/float.mli +++ b/stdlib/float.mli @@ -1,4 +1,4 @@ -# 1 "float.mli" +# 2 "float.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/format.ml b/stdlib/format.ml index f930f2b20fb..6fc7aa4fe3e 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -1,4 +1,4 @@ -# 1 "format.ml" +# 2 "format.ml" (**************************************************************************) (* *) (* OCaml *) @@ -1027,8 +1027,6 @@ and err_formatter = formatter_of_out_channel Stdlib.stderr and str_formatter = formatter_of_buffer stdbuf (* Initialise domain local state *) -(* CR ocaml 5 runtime: - BACKPORT BEGIN module DLS = Domain.DLS let stdbuf_key = DLS.new_key pp_make_buffer @@ -1075,16 +1073,6 @@ let err_formatter_key = DLS.new_key (fun () -> Domain.at_exit (pp_print_flush ppf); ppf) let _ = DLS.set err_formatter_key err_formatter -*) -let std_formatter_key = std_formatter -let err_formatter_key = err_formatter -let str_formatter_key = str_formatter -let stdbuf_key = stdbuf - -module DLS = struct - let get = Fun.id -end -(* BACKPORT END *) let get_std_formatter () = DLS.get std_formatter_key let get_err_formatter () = DLS.get err_formatter_key @@ -1107,8 +1095,6 @@ let flush_str_formatter () = let str_formatter = DLS.get str_formatter_key in flush_buffer_formatter stdbuf str_formatter -(* CR ocaml 5 runtime: - BACKPORT let make_synchronized_formatter output flush = DLS.new_key (fun () -> let buf = Buffer.create pp_buffer_size in @@ -1122,7 +1108,6 @@ let make_synchronized_formatter output flush = let synchronized_formatter_of_out_channel oc = make_synchronized_formatter (output_substring oc) (fun () -> flush oc) -*) (* Symbolic pretty-printing @@ -1493,8 +1478,6 @@ let flush_standard_formatters () = let () = at_exit flush_standard_formatters -(* CR ocaml 5 runtime: - BACKPORT let () = Domain.before_first_spawn (fun () -> flush_standard_formatters (); let fs = pp_get_formatter_out_functions std_formatter () in @@ -1507,4 +1490,3 @@ let () = Domain.before_first_spawn (fun () -> {fs with out_string = buffered_out_string err_buf_key; out_flush = buffered_out_flush Stdlib.stderr err_buf_key}; ) -*) diff --git a/stdlib/format.mli b/stdlib/format.mli index f884482ba02..8792ac229a5 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -1,4 +1,4 @@ -# 1 "format.mli" +# 2 "format.mli" (**************************************************************************) (* *) (* OCaml *) @@ -969,8 +969,6 @@ val formatter_of_out_channel : out_channel -> formatter to the corresponding output channel [oc]. *) -(* CR ocaml 5 runtime: - BACKPORT val synchronized_formatter_of_out_channel : out_channel -> formatter Domain.DLS.key [@@alert unstable][@@alert "-unstable"] @@ -982,8 +980,6 @@ val synchronized_formatter_of_out_channel : domains will be interleaved with each other at points where the formatter is flushed, such as with {!print_flush}. *) -*) - val std_formatter : formatter (** The initial domain's standard formatter to write to standard output. @@ -1055,8 +1051,6 @@ val make_formatter : returns a formatter to the {!Stdlib.out_channel} [oc]. *) -(* CR ocaml 5 runtime: - BACKPORT val make_synchronized_formatter : (string -> int -> int -> unit) -> (unit -> unit) -> formatter Domain.DLS.key [@@alert unstable][@@alert "-unstable"] @@ -1069,7 +1063,6 @@ val make_synchronized_formatter : is flushed, such as with {!print_flush}. @since 5.0 *) -*) val formatter_of_out_functions : formatter_out_functions -> formatter diff --git a/stdlib/fun.ml b/stdlib/fun.ml index 7a5f70a5c3a..7da6da99a52 100644 --- a/stdlib/fun.ml +++ b/stdlib/fun.ml @@ -1,4 +1,4 @@ -# 1 "fun.ml" +# 2 "fun.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/fun.mli b/stdlib/fun.mli index 0906e2659ec..96b36a297dd 100644 --- a/stdlib/fun.mli +++ b/stdlib/fun.mli @@ -1,4 +1,4 @@ -# 1 "fun.mli" +# 2 "fun.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/gc.ml b/stdlib/gc.ml index 92856778fa7..c4d1da77b82 100644 --- a/stdlib/gc.ml +++ b/stdlib/gc.ml @@ -1,4 +1,4 @@ -# 1 "gc.ml" +# 2 "gc.ml" (**************************************************************************) (* *) (* OCaml *) @@ -67,9 +67,9 @@ external full_major : unit -> unit = "caml_gc_full_major" external compact : unit -> unit = "caml_gc_compaction" external get_minor_free : unit -> int = "caml_get_minor_free" -(* CR ocaml 5 runtime: These functions are no-ops upstream. We should make them - no-ops internally when we delete the corresponding C functions from the - runtime -- they're already marked as deprecated in the mli. +(* CR ocaml 5 all-runtime5: These functions are no-ops upstream. We should + make them no-ops internally when we delete the corresponding C functions + from the runtime -- they're already marked as deprecated in the mli. *) external eventlog_pause : unit -> unit = "caml_eventlog_pause" @@ -135,11 +135,7 @@ let delete_alarm a = Atomic.set a false module Memprof = struct -(* BACKPORT BEGIN type t -*) - type t = unit -(* BACKPORT END *) type allocation_source = Normal | Marshal | Custom type allocation = { n_samples : int; @@ -164,7 +160,7 @@ module Memprof = } external c_start : - float -> int -> ('minor, 'major) tracker -> unit + float -> int -> ('minor, 'major) tracker -> t = "caml_memprof_start" let start @@ -175,7 +171,5 @@ module Memprof = external stop : unit -> unit = "caml_memprof_stop" -(* BACKPORT external discard : t -> unit = "caml_memprof_discard" -*) end diff --git a/stdlib/gc.mli b/stdlib/gc.mli index c6652d02a48..a37bfa7e696 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -1,4 +1,4 @@ -# 1 "gc.mli" +# 2 "gc.mli" (**************************************************************************) (* *) (* OCaml *) @@ -100,7 +100,7 @@ type stat = value will always be [0]. @since 3.12 *) - (* CR ocaml 5 runtime: Update the above comment to what it is upstream: + (* CR ocaml 5 all-runtime5: Update the above comment to what it is upstream: This metrics is currently not available in OCaml 5: the field value is always [0]. @@ -444,15 +444,16 @@ external eventlog_pause : unit -> unit = "caml_eventlog_pause" external eventlog_resume : unit -> unit = "caml_eventlog_resume" [@@ocaml.deprecated "Use Runtime_events.resume instead."] -(** [Memprof] is a sampling engine for allocated memory words. Every - allocated word has a probability of being sampled equal to a - configurable sampling rate. Once a block is sampled, it becomes - tracked. A tracked block triggers a user-defined callback as soon - as it is allocated, promoted or deallocated. +(** [Memprof] is a profiling engine which randomly samples allocated + memory words. Every allocated word has a probability of being + sampled equal to a configurable sampling rate. Once a block is + sampled, it becomes tracked. A tracked block triggers a + user-defined callback as soon as it is allocated, promoted or + deallocated. Since blocks are composed of several words, a block can potentially be sampled several times. If a block is sampled several times, then - each of the callback is called once for each event of this block: + each of the callbacks is called once for each event of this block: the multiplicity is given in the [n_samples] field of the [allocation] structure. @@ -463,11 +464,7 @@ external eventlog_resume : unit -> unit = "caml_eventlog_resume" notice. *) module Memprof : sig -(* BACKPORT BEGIN type t -*) - type t = unit -(* BACKPORT END *) (** the type of a profile *) type allocation_source = Normal | Marshal | Custom @@ -479,7 +476,7 @@ module Memprof : (** The size of the block, in words, excluding the header. *) source : allocation_source; - (** The type of the allocation. *) + (** The cause of the allocation. *) callstack : Printexc.raw_backtrace (** The callstack for the allocation. *) @@ -502,12 +499,11 @@ module Memprof : to keep for minor blocks, and ['major] the type of metadata for major blocks. - When using threads, it is guaranteed that allocation callbacks are - always run in the thread where the allocation takes place. + The member functions in a [tracker] are called callbacks. - If an allocation-tracking or promotion-tracking function returns [None], - memprof stops tracking the corresponding value. - *) + If an allocation or promotion callback raises an exception or + returns [None], memprof stops tracking the corresponding block. + *) val null_tracker: ('minor, 'major) tracker (** Default callbacks simply return [None] or [()] *) @@ -516,14 +512,15 @@ module Memprof : sampling_rate:float -> ?callstack_size:int -> ('minor, 'major) tracker -> - unit - (** Start the sampling with the given parameters. Fails if - sampling is already active. + t + (** Start a profile with the given parameters. Raises an exception + if a profile is already sampling in the current domain. - The parameter [sampling_rate] is the sampling rate in samples - per word (including headers). Usually, with cheap callbacks, a - rate of 1e-4 has no visible effect on performance, and 1e-3 - causes the program to run a few percent slower + Sampling begins immediately. The parameter [sampling_rate] is + the sampling rate in samples per word (including headers). + Usually, with cheap callbacks, a rate of 1e-4 has no visible + effect on performance, and 1e-3 causes the program to run a few + percent slower. 0.0 <= sampling_rate <= 1.0. The parameter [callstack_size] is the length of the callstack recorded at every sample. Its default is [max_int]. @@ -531,24 +528,53 @@ module Memprof : The parameter [tracker] determines how to track sampled blocks over their lifetime in the minor and major heap. - Sampling is temporarily disabled when calling a callback - for the current thread. So they do not need to be re-entrant if - the program is single-threaded. However, if threads are used, - it is possible that a context switch occurs during a callback, - in this case the callback functions must be re-entrant. - - Note that the callback can be postponed slightly after the - actual event. The callstack passed to the callback is always - accurate, but the program state may have evolved. *) + Sampling and running callbacks are temporarily disabled on the + current thread when calling a callback, so callbacks do not + need to be re-entrant if the program is single-threaded and + single-domain. However, if threads or multiple domains are + used, it is possible that several callbacks will run in + parallel. In this case, callback functions must be re-entrant. + + Note that a callback may be postponed slightly after the actual + event. The callstack passed to an allocation callback always + accurately reflects the allocation, but the program state may + have evolved between the allocation and the call to the + callback. + + If a new thread or domain is created when the current domain is + sampling for a profile, the child thread or domain joins that + profile (using the same [sampling_rate], [callstack_size], and + [tracker] callbacks). + + An allocation callback is always run by the thread which + allocated the block. If the thread exits or the profile is + stopped before the callback is called, the allocation callback + is not called and the block is not tracked. + + Each subsequent callback is generally run by the domain which + allocated the block. If the domain terminates or the profile is + stopped before the callback is called, the callback may be run + by a different domain. + + Different domains may sample for different profiles + simultaneously. *) val stop : unit -> unit - (** Stop the sampling. Fails if sampling is not active. - - This function does not allocate memory. - - All the already tracked blocks are discarded. If there are - pending postponed callbacks, they may be discarded. - - Calling [stop] when a callback is running can lead to - callbacks not being called even though some events happened. *) + (** Stop sampling for the current profile. Fails if no profile is + sampling in the current domain. Stops sampling in all threads + and domains sharing the profile. + + Promotion and deallocation callbacks from a profile may run + after [stop] is called, until [discard] is applied to the + profile. + + A profile is implicitly stopped (but not discarded) if all + domains and threads sampling for it are terminated. + *) + + val discard : t -> unit + (** Discards all profiling state for a stopped profile, which + prevents any more callbacks for it. Raises an exception if + called on a profile which has not been stopped. + *) end diff --git a/stdlib/hashtbl.ml b/stdlib/hashtbl.ml index cc8b5a7f882..bcd51ceec47 100644 --- a/stdlib/hashtbl.ml +++ b/stdlib/hashtbl.ml @@ -1,4 +1,4 @@ -# 1 "hashtbl.ml" +# 2 "hashtbl.ml" (**************************************************************************) (* *) (* OCaml *) @@ -62,12 +62,7 @@ let randomized = Atomic.make randomized_default let randomize () = Atomic.set randomized true let is_randomized () = Atomic.get randomized -(* CR ocaml 5 runtime: - BACKPORT BEGIN let prng_key = Domain.DLS.new_key Random.State.make_self_init -*) -let prng = lazy (Random.State.make_self_init()) -(* BACKPORT END *) (* Functions which appear before the functorial interface must either be independent of the hash function or take it as a parameter (see #2202 and @@ -83,12 +78,7 @@ let rec power_2_above x n = let create ?(random = Atomic.get randomized) initial_size = let s = power_2_above 16 initial_size in let seed = -(* CR ocaml 5 runtime: - BACKPORT BEGIN if random then Random.State.bits (Domain.DLS.get prng_key) else 0 -*) - if random then Random.State.bits (Lazy.force prng) else 0 -(* BACKPORT END *) in { initial_size = s; size = 0; seed = seed; data = Array.make s Empty } @@ -511,7 +501,7 @@ module Make(H: HashedType): (S with type key = H.t) = use - see #2202 *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> 'a -> int = "caml_hash_exn" let hash x = seeded_hash_param 10 100 0 x let hash_param n1 n2 x = seeded_hash_param n1 n2 0 x @@ -636,12 +626,7 @@ let of_seq i = let rebuild ?(random = Atomic.get randomized) h = let s = power_2_above 16 (Array.length h.data) in let seed = -(* CR ocaml 5 runtime: - BACKPORT BEGIN if random then Random.State.bits (Domain.DLS.get prng_key) -*) - if random then Random.State.bits (Lazy.force prng) -(* BACKPORT END *) else if Obj.size (Obj.repr h) >= 4 then h.seed else 0 in let h' = { diff --git a/stdlib/hashtbl.mli b/stdlib/hashtbl.mli index e99b4674ec2..9266053e7be 100644 --- a/stdlib/hashtbl.mli +++ b/stdlib/hashtbl.mli @@ -1,4 +1,4 @@ -# 1 "hashtbl.mli" +# 2 "hashtbl.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/in_channel.mli b/stdlib/in_channel.mli index 5d39b5cbe48..296f1ae4fc2 100644 --- a/stdlib/in_channel.mli +++ b/stdlib/in_channel.mli @@ -13,6 +13,8 @@ (* *) (**************************************************************************) +open! Stdlib + (** Input channels. This module provides functions for working with input channels. diff --git a/stdlib/int.ml b/stdlib/int.ml index 72dab96f0d2..5e6084ab0fc 100644 --- a/stdlib/int.ml +++ b/stdlib/int.ml @@ -1,4 +1,4 @@ -# 1 "int.ml" +# 2 "int.ml" (**************************************************************************) (* *) (* OCaml *) @@ -56,7 +56,10 @@ let of_string s = try Some (int_of_string s) with Failure _ -> None external format_int : string -> int -> string = "caml_format_int" let to_string x = format_int "%d" x +(* [caml_hash_exn] doesn't raise on ints, so it's safe for + it to be marked as [@@noalloc]. + *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> int -> int = "caml_hash_exn" [@@noalloc] let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x diff --git a/stdlib/int.mli b/stdlib/int.mli index e5ab4e92745..345903fa034 100644 --- a/stdlib/int.mli +++ b/stdlib/int.mli @@ -1,4 +1,4 @@ -# 1 "int.mli" +# 2 "int.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/int32.ml b/stdlib/int32.ml index be987ae8de5..a70eb919325 100644 --- a/stdlib/int32.ml +++ b/stdlib/int32.ml @@ -1,4 +1,4 @@ -# 1 "int32.ml" +# 2 "int32.ml" (**************************************************************************) (* *) (* OCaml *) @@ -50,18 +50,18 @@ external float_of_bits : int32 -> float let zero = 0l let one = 1l let minus_one = -1l -let succ n = add n 1l -let pred n = sub n 1l -let abs n = if n >= 0l then n else neg n +let[@inline available] succ n = add n 1l +let[@inline available] pred n = sub n 1l +let[@inline available] abs n = if n >= 0l then n else neg n let min_int = 0x80000000l let max_int = 0x7FFFFFFFl -let lognot n = logxor n (-1l) +let[@inline available] lognot n = logxor n (-1l) let unsigned_to_int = match Sys.word_size with | 32 -> let max_int = of_int Stdlib.max_int in - fun n -> + fun[@inline available] n -> if compare zero n <= 0 && compare n max_int <= 0 then Some (to_int n) else @@ -69,35 +69,36 @@ let unsigned_to_int = | 64 -> (* So that it compiles in 32-bit *) let mask = 0xFFFF lsl 16 lor 0xFFFF in - fun n -> Some (to_int n land mask) + fun[@inline available] n -> Some (to_int n land mask) | _ -> assert false external format : string -> int32 -> string = "caml_int32_format" -let to_string n = format "%d" n +let[@inline available] to_string n = format "%d" n -external of_string : string -> int32 = "caml_int32_of_string" +external of_string : string -> (int32[@unboxed]) + = "caml_int32_of_string" "caml_int32_of_string_unboxed" -let of_string_opt s = +let[@inline available] of_string_opt s = (* TODO: expose a non-raising primitive directly. *) try Some (of_string s) with Failure _ -> None type t = int32 -let compare (x: t) (y: t) = Stdlib.compare x y -let equal (x: t) (y: t) = compare x y = 0 +let[@inline available] compare (x: t) (y: t) = Stdlib.compare x y +let[@inline available] equal (x: t) (y: t) = compare x y = 0 -let unsigned_compare n m = +let[@inline available] unsigned_compare n m = compare (sub n min_int) (sub m min_int) -let min x y : t = if x <= y then x else y -let max x y : t = if x >= y then x else y +let[@inline available] min x y : t = if x <= y then x else y +let[@inline available] max x y : t = if x >= y then x else y (* Unsigned division from signed division of the same bitness. See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. *) -let unsigned_div n d = +let[@inline available] unsigned_div n d = if d < zero then if unsigned_compare n d < 0 then zero else one else @@ -105,10 +106,13 @@ let unsigned_div n d = let r = sub n (mul q d) in if unsigned_compare r d >= 0 then succ q else q -let unsigned_rem n d = - sub n (mul (unsigned_div n d) d) +let[@inline available] unsigned_rem n d = + sub n (mul ((unsigned_div[@inlined]) n d) d) +(* [caml_hash_exn] doesn't raise on int32s, so it's safe for + it to be marked as [@@noalloc]. + *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> int32 -> int = "caml_hash_exn" [@@noalloc] let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x diff --git a/stdlib/int32.mli b/stdlib/int32.mli index 0d3213d6c0f..8df4851706a 100644 --- a/stdlib/int32.mli +++ b/stdlib/int32.mli @@ -1,4 +1,4 @@ -# 1 "int32.mli" +# 2 "int32.mli" (**************************************************************************) (* *) (* OCaml *) @@ -160,7 +160,8 @@ external to_float : int32 -> float [@@unboxed] [@@noalloc] (** Convert the given 32-bit integer to a floating-point number. *) -external of_string : string -> int32 = "caml_int32_of_string" +external of_string : string -> (int32[@unboxed]) + = "caml_int32_of_string" "caml_int32_of_string_unboxed" (** Convert the given string to a 32-bit integer. The string is read in decimal (by default, or if the string begins with [0u]) or in hexadecimal, octal or binary if the diff --git a/stdlib/int64.ml b/stdlib/int64.ml index b8e63806919..5982503f6d0 100644 --- a/stdlib/int64.ml +++ b/stdlib/int64.ml @@ -1,4 +1,4 @@ -# 1 "int64.ml" +# 2 "int64.ml" (**************************************************************************) (* *) (* OCaml *) @@ -48,27 +48,28 @@ external to_nativeint : int64 -> nativeint = "%int64_to_nativeint" let zero = 0L let one = 1L let minus_one = -1L -let succ n = add n 1L -let pred n = sub n 1L -let abs n = if n >= 0L then n else neg n +let[@inline available] succ n = add n 1L +let[@inline available] pred n = sub n 1L +let[@inline available] abs n = if n >= 0L then n else neg n let min_int = 0x8000000000000000L let max_int = 0x7FFFFFFFFFFFFFFFL -let lognot n = logxor n (-1L) +let[@inline available] lognot n = logxor n (-1L) let unsigned_to_int = let max_int = of_int Stdlib.max_int in - fun n -> + fun[@inline available] n -> if compare zero n <= 0 && compare n max_int <= 0 then Some (to_int n) else None external format : string -> int64 -> string = "caml_int64_format" -let to_string n = format "%d" n +let[@inline available] to_string n = format "%d" n -external of_string : string -> int64 = "caml_int64_of_string" +external of_string : string -> (int64[@unboxed]) + = "caml_int64_of_string" "caml_int64_of_string_unboxed" -let of_string_opt s = +let[@inline available] of_string_opt s = (* TODO: expose a non-raising primitive directly. *) try Some (of_string s) with Failure _ -> None @@ -84,19 +85,19 @@ external float_of_bits : int64 -> float type t = int64 -let compare (x: t) (y: t) = Stdlib.compare x y -let equal (x: t) (y: t) = compare x y = 0 +let[@inline available] compare (x: t) (y: t) = Stdlib.compare x y +let[@inline available] equal (x: t) (y: t) = compare x y = 0 -let unsigned_compare n m = +let[@inline available] unsigned_compare n m = compare (sub n min_int) (sub m min_int) -let min x y : t = if x <= y then x else y -let max x y : t = if x >= y then x else y +let[@inline available] min x y : t = if x <= y then x else y +let[@inline available] max x y : t = if x >= y then x else y (* Unsigned division from signed division of the same bitness. See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. *) -let unsigned_div n d = +let[@inline available] unsigned_div n d = if d < zero then if unsigned_compare n d < 0 then zero else one else @@ -104,10 +105,13 @@ let unsigned_div n d = let r = sub n (mul q d) in if unsigned_compare r d >= 0 then succ q else q -let unsigned_rem n d = - sub n (mul (unsigned_div n d) d) +let[@inline available] unsigned_rem n d = + sub n (mul ((unsigned_div[@inlined]) n d) d) +(* [caml_hash_exn] doesn't raise on int64s, so it's safe for + it to be marked as [@@noalloc]. + *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> int64 -> int = "caml_hash_exn" [@@noalloc] let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x diff --git a/stdlib/int64.mli b/stdlib/int64.mli index 073d6648b98..4188ea3c6fc 100644 --- a/stdlib/int64.mli +++ b/stdlib/int64.mli @@ -1,4 +1,4 @@ -# 1 "int64.mli" +# 2 "int64.mli" (**************************************************************************) (* *) (* OCaml *) @@ -180,7 +180,8 @@ external to_nativeint : int64 -> nativeint = "%int64_to_nativeint" is taken modulo 2{^32}. On 64-bit platforms, the conversion is exact. *) -external of_string : string -> int64 = "caml_int64_of_string" +external of_string : string -> (int64[@unboxed]) + = "caml_int64_of_string" "caml_int64_of_string_unboxed" (** Convert the given string to a 64-bit integer. The string is read in decimal (by default, or if the string begins with [0u]) or in hexadecimal, octal or binary if the diff --git a/stdlib/lazy.ml b/stdlib/lazy.ml index 94c44bbfabd..efa84964eae 100644 --- a/stdlib/lazy.ml +++ b/stdlib/lazy.ml @@ -1,4 +1,4 @@ -# 1 "lazy.ml" +# 2 "lazy.ml" (**************************************************************************) (* *) (* OCaml *) @@ -58,12 +58,7 @@ exception Undefined = CamlinternalLazy.Undefined external make_forward : 'a -> 'a lazy_t = "caml_lazy_make_forward" external force : 'a t -> 'a = "%lazy_force" -(* CR ocaml 5 runtime: - BACKPORT BEGIN let force_val l = CamlinternalLazy.force_gen ~only_val:true l -*) -let force_val = CamlinternalLazy.force_val -(* BACKPORT END *) let from_fun (f : unit -> 'arg) = let x = Obj.new_block Obj.lazy_tag 1 in @@ -72,11 +67,8 @@ let from_fun (f : unit -> 'arg) = let from_val (v : 'arg) = let t = Obj.tag (Obj.repr v) in - if t = Obj.forward_tag || t = Obj.lazy_tag -(* BACKPORT BEGIN - || t = Obj.forcing_tag *) -(* BACKPORT END *) - || t = Obj.double_tag then begin + if t = Obj.forward_tag || t = Obj.lazy_tag || + t = Obj.forcing_tag || t = Obj.double_tag then begin make_forward v end else begin (Obj.magic v : 'arg t) diff --git a/stdlib/lazy.mli b/stdlib/lazy.mli index c12ecb397b8..32e6cf60da9 100644 --- a/stdlib/lazy.mli +++ b/stdlib/lazy.mli @@ -1,4 +1,4 @@ -# 1 "lazy.mli" +# 2 "lazy.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/lexing.ml b/stdlib/lexing.ml index a9b3659825c..5ebd2af39d8 100644 --- a/stdlib/lexing.ml +++ b/stdlib/lexing.ml @@ -1,4 +1,4 @@ -# 1 "lexing.ml" +# 2 "lexing.ml" (**************************************************************************) (* *) (* OCaml *) @@ -20,7 +20,7 @@ open! Stdlib (* The run-time library for lexers generated by camllex *) -type position = { +type position = lexing_position = { pos_fname : string; pos_lnum : int; pos_bol : int; diff --git a/stdlib/lexing.mli b/stdlib/lexing.mli index d5927f45051..4374c52c161 100644 --- a/stdlib/lexing.mli +++ b/stdlib/lexing.mli @@ -1,4 +1,4 @@ -# 1 "lexing.mli" +# 2 "lexing.mli" (**************************************************************************) (* *) (* OCaml *) @@ -20,12 +20,13 @@ open! Stdlib (** {1 Positions} *) -type position = { +type position = lexing_position = { pos_fname : string; pos_lnum : int; pos_bol : int; pos_cnum : int; } + (** A value of type [position] describes a point in a source file. [pos_fname] is the file name; [pos_lnum] is the line number; [pos_bol] is the offset of the beginning of the line (number diff --git a/stdlib/list.ml b/stdlib/list.ml index 8124ae57020..4847410ccf9 100644 --- a/stdlib/list.ml +++ b/stdlib/list.ml @@ -1,4 +1,4 @@ -# 1 "list.ml" +# 2 "list.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/list.mli b/stdlib/list.mli index 36bc2cb26f4..5755ba24621 100644 --- a/stdlib/list.mli +++ b/stdlib/list.mli @@ -1,4 +1,4 @@ -# 1 "list.mli" +# 2 "list.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/listLabels.ml b/stdlib/listLabels.ml index cf5047065a2..0bf4571379a 100644 --- a/stdlib/listLabels.ml +++ b/stdlib/listLabels.ml @@ -1,4 +1,4 @@ -# 1 "listLabels.ml" +# 2 "listLabels.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/listLabels.mli b/stdlib/listLabels.mli index 877cb14ca51..0cacb3a850e 100644 --- a/stdlib/listLabels.mli +++ b/stdlib/listLabels.mli @@ -1,4 +1,4 @@ -# 1 "listLabels.mli" +# 2 "listLabels.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/map.ml b/stdlib/map.ml index 10bfb97a059..532110f49eb 100644 --- a/stdlib/map.ml +++ b/stdlib/map.ml @@ -1,4 +1,4 @@ -# 1 "map.ml" +# 2 "map.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/map.mli b/stdlib/map.mli index 1327976f335..26d672e6cc3 100644 --- a/stdlib/map.mli +++ b/stdlib/map.mli @@ -1,4 +1,4 @@ -# 1 "map.mli" +# 2 "map.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/marshal.ml b/stdlib/marshal.ml index 98085840564..9d612cbacbd 100644 --- a/stdlib/marshal.ml +++ b/stdlib/marshal.ml @@ -1,4 +1,4 @@ -# 1 "marshal.ml" +# 2 "marshal.ml" (**************************************************************************) (* *) (* OCaml *) @@ -50,11 +50,8 @@ external from_channel: in_channel -> 'a = "caml_input_value" external from_bytes_unsafe: bytes -> int -> 'a = "caml_input_value_from_bytes" external data_size_unsafe: bytes -> int -> int = "caml_marshal_data_size" -(* BACKPORT BEGIN let header_size = 16 -*) -let header_size = 20 -(* BACKPORT END *) + let data_size buff ofs = if ofs < 0 || ofs > Bytes.length buff - header_size then invalid_arg "Marshal.data_size" diff --git a/stdlib/marshal.mli b/stdlib/marshal.mli index da172428e91..40826f9edf9 100644 --- a/stdlib/marshal.mli +++ b/stdlib/marshal.mli @@ -1,4 +1,4 @@ -# 1 "marshal.mli" +# 2 "marshal.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/moreLabels.ml b/stdlib/moreLabels.ml index 873f5e1e31b..8507eeb5776 100644 --- a/stdlib/moreLabels.ml +++ b/stdlib/moreLabels.ml @@ -1,4 +1,4 @@ -# 1 "moreLabels.ml" +# 2 "moreLabels.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/moreLabels.mli b/stdlib/moreLabels.mli index 6144ff1ea2a..2ff75946f00 100644 --- a/stdlib/moreLabels.mli +++ b/stdlib/moreLabels.mli @@ -1,4 +1,4 @@ -# 1 "moreLabels.mli" +# 2 "moreLabels.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/mutex.ml b/stdlib/mutex.ml new file mode 100644 index 00000000000..e081a7e4528 --- /dev/null +++ b/stdlib/mutex.ml @@ -0,0 +1,34 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy and Pascal Cuoq, INRIA Rocquencourt *) +(* *) +(* Copyright 1995 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. *) +(* *) +(**************************************************************************) + +type t +external create: unit -> t = "caml_ml_mutex_new" +external lock: t -> unit = "caml_ml_mutex_lock" +external try_lock: t -> bool = "caml_ml_mutex_try_lock" +external unlock: t -> unit = "caml_ml_mutex_unlock" + +(* private re-export *) +external reraise : exn -> 'a = "%reraise" + +(* cannot inline, otherwise flambda might move code around. *) +let[@inline never] protect m f = + lock m; + match f() with + | x -> + unlock m; x + | exception e -> + (* NOTE: [unlock] does not poll for asynchronous exceptions *) + unlock m; + reraise e diff --git a/otherlibs/systhreads/mutex.mli b/stdlib/mutex.mli similarity index 82% rename from otherlibs/systhreads/mutex.mli rename to stdlib/mutex.mli index 70a67ce408a..3eb90f1f55a 100644 --- a/otherlibs/systhreads/mutex.mli +++ b/stdlib/mutex.mli @@ -58,3 +58,17 @@ val unlock : t -> unit @before 4.12 {!Sys_error} was not raised when unlocking an unlocked mutex or when unlocking a mutex from a different thread. *) + +val protect : t -> (unit -> 'a) -> 'a +(** [protect mutex f] runs [f()] in a critical section where [mutex] + is locked (using {!lock}); it then takes care of releasing [mutex], + whether [f()] returned a value or raised an exception. + + The unlocking operation is guaranteed to always takes place, + even in the event an asynchronous exception (e.g. {!Sys.Break}) is raised + in some signal handler. + + In the event that an asynchronous exception is raised, it will be + re-raised as a normal exception from [protect]. + + @since 5.1 *) diff --git a/stdlib/nativeint.ml b/stdlib/nativeint.ml index 909bd522a28..7b765a37276 100644 --- a/stdlib/nativeint.ml +++ b/stdlib/nativeint.ml @@ -1,4 +1,4 @@ -# 1 "nativeint.ml" +# 2 "nativeint.ml" (**************************************************************************) (* *) (* OCaml *) @@ -46,47 +46,48 @@ external to_int32: nativeint -> int32 = "%nativeint_to_int32" let zero = 0n let one = 1n let minus_one = -1n -let succ n = add n 1n -let pred n = sub n 1n -let abs n = if n >= 0n then n else neg n +let[@inline available] succ n = add n 1n +let[@inline available] pred n = sub n 1n +let[@inline available] abs n = if n >= 0n then n else neg n let size = Sys.word_size let min_int = shift_left 1n (size - 1) let max_int = sub min_int 1n -let lognot n = logxor n (-1n) +let[@inline available] lognot n = logxor n (-1n) let unsigned_to_int = let max_int = of_int Stdlib.max_int in - fun n -> + fun[@inline available] n -> if compare zero n <= 0 && compare n max_int <= 0 then Some (to_int n) else None external format : string -> nativeint -> string = "caml_nativeint_format" -let to_string n = format "%d" n +let[@inline available] to_string n = format "%d" n -external of_string: string -> nativeint = "caml_nativeint_of_string" +external of_string: string -> (nativeint[@unboxed]) + = "caml_nativeint_of_string" "caml_nativeint_of_string_unboxed" -let of_string_opt s = +let[@inline available] of_string_opt s = (* TODO: expose a non-raising primitive directly. *) try Some (of_string s) with Failure _ -> None type t = nativeint -let compare (x: t) (y: t) = Stdlib.compare x y -let equal (x: t) (y: t) = compare x y = 0 +let[@inline available] compare (x: t) (y: t) = Stdlib.compare x y +let[@inline available] equal (x: t) (y: t) = compare x y = 0 -let unsigned_compare n m = +let[@inline available] unsigned_compare n m = compare (sub n min_int) (sub m min_int) -let min x y : t = if x <= y then x else y -let max x y : t = if x >= y then x else y +let[@inline available] min x y : t = if x <= y then x else y +let[@inline available] max x y : t = if x >= y then x else y (* Unsigned division from signed division of the same bitness. See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. *) -let unsigned_div n d = +let[@inline available] unsigned_div n d = if d < zero then if unsigned_compare n d < 0 then zero else one else @@ -94,10 +95,13 @@ let unsigned_div n d = let r = sub n (mul q d) in if unsigned_compare r d >= 0 then succ q else q -let unsigned_rem n d = - sub n (mul (unsigned_div n d) d) +let[@inline available] unsigned_rem n d = + sub n (mul ((unsigned_div[@inlined]) n d) d) +(* [caml_hash_exn] doesn't raise on nativeints, so it's safe for + it to be marked as [@@noalloc]. + *) external seeded_hash_param : - int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] + int -> int -> int -> nativeint -> int = "caml_hash_exn" [@@noalloc] let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x diff --git a/stdlib/nativeint.mli b/stdlib/nativeint.mli index d2de9a4e56a..233abfdc12b 100644 --- a/stdlib/nativeint.mli +++ b/stdlib/nativeint.mli @@ -1,4 +1,4 @@ -# 1 "nativeint.mli" +# 2 "nativeint.mli" (**************************************************************************) (* *) (* OCaml *) @@ -188,7 +188,8 @@ external to_int32 : nativeint -> int32 = "%nativeint_to_int32" i.e. the top 32 bits are lost. On 32-bit platforms, the conversion is exact. *) -external of_string : string -> nativeint = "caml_nativeint_of_string" +external of_string : string -> (nativeint[@unboxed]) + = "caml_nativeint_of_string" "caml_nativeint_of_string_unboxed" (** Convert the given string to a native integer. The string is read in decimal (by default, or if the string begins with [0u]) or in hexadecimal, octal or binary if the diff --git a/stdlib/obj.ml b/stdlib/obj.ml index 6ad1d9e77dd..1530132fc3e 100644 --- a/stdlib/obj.ml +++ b/stdlib/obj.ml @@ -1,4 +1,4 @@ -# 1 "obj.ml" +# 2 "obj.ml" (**************************************************************************) (* *) (* OCaml *) @@ -197,3 +197,31 @@ module Ephemeron = struct external blit_data : t -> t -> unit = "caml_ephe_blit_data" end + +module Uniform_or_mixed = struct + type obj_t = t + + (* In native code, the raw reserved header bits, which is either 0 if the + block is uniform or n+1 if the block has a scannable prefix of length n. + In bytecode, this will be size+1 for "faux mixed blocks" representing + mixed records, and otherwise 0. + *) + type t = int + + external of_block : obj_t -> t = "caml_succ_scannable_prefix_len" [@@noalloc] + + type repr = + | Uniform + | Mixed of { scannable_prefix_len : int } + + let repr = function + | 0 -> Uniform + | n -> Mixed { scannable_prefix_len = n - 1 } + + let is_uniform t = t = 0 + let is_mixed t = not (is_uniform t) + let mixed_scannable_prefix_len_exn t = + if is_uniform t + then invalid_arg "Uniform_or_mixed.mixed_scannable_prefix_len_exn"; + t - 1 +end diff --git a/stdlib/obj.mli b/stdlib/obj.mli index 523aba7d01c..8deec52e2be 100644 --- a/stdlib/obj.mli +++ b/stdlib/obj.mli @@ -1,4 +1,4 @@ -# 1 "obj.mli" +# 2 "obj.mli" (**************************************************************************) (* *) (* OCaml *) @@ -172,3 +172,39 @@ module Ephemeron: sig (** Maximum length of an ephemeron, ie the maximum number of keys an ephemeron could contain *) end + +module Uniform_or_mixed : sig + (** Blocks with a nominally scannable tag can still have a suffix of + unscanned objects; such a block is "mixed". This contrasts with + "uniform" blocks which are either all-scanned or all-unscanned. + + Note that this module can return different results for the scannable + prefix len of a mixed block in native code vs. bytecode. That's + because more fields are scanned in bytecode. + *) + + type obj_t := t + + type t [@@immediate] + + type repr = + | Uniform + (** The block is tagged as not scannable or the block is tagged as scannable + and all fields can be scanned. *) + | Mixed of { scannable_prefix_len : int } + (** The block is tagged as scannable but some fields can't be scanned. *) + + val repr : t -> repr + + external of_block : obj_t -> t = "caml_succ_scannable_prefix_len" [@@noalloc] + + val is_uniform : t -> bool + (** Equivalent to [repr] returning [Uniform]. *) + + val is_mixed : t -> bool + (** Equivalent to [repr] returning [Mixed _]. *) + + val mixed_scannable_prefix_len_exn : t -> int + (** Returns the [scannable_prefix_len] without materializing the return + value of [repr]. Raises if [is_mixed] is [false]. *) +end diff --git a/stdlib/ocaml_compiler_internal_params b/stdlib/ocaml_compiler_internal_params deleted file mode 100644 index b893c85a01a..00000000000 --- a/stdlib/ocaml_compiler_internal_params +++ /dev/null @@ -1,4 +0,0 @@ -ocaml/stdlib/float_u.mli : extension = layouts_alpha -ocaml/stdlib/float_u.ml : extension = layouts_alpha -stdlib/float_u.mli : extension = layouts_alpha -stdlib/float_u.ml : extension = layouts_alpha diff --git a/stdlib/oo.ml b/stdlib/oo.ml index 40d4d9fa0ce..12e25901fef 100644 --- a/stdlib/oo.ml +++ b/stdlib/oo.ml @@ -1,4 +1,4 @@ -# 1 "oo.ml" +# 2 "oo.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/oo.mli b/stdlib/oo.mli index d32d2ca79aa..ed9d7f57e71 100644 --- a/stdlib/oo.mli +++ b/stdlib/oo.mli @@ -1,4 +1,4 @@ -# 1 "oo.mli" +# 2 "oo.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/option.ml b/stdlib/option.ml index 0c1d7b291c7..4d6ae813edb 100644 --- a/stdlib/option.ml +++ b/stdlib/option.ml @@ -1,4 +1,4 @@ -# 1 "option.ml" +# 2 "option.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/option.mli b/stdlib/option.mli index 790f6796b43..c5e63e57b4c 100644 --- a/stdlib/option.mli +++ b/stdlib/option.mli @@ -1,4 +1,4 @@ -# 1 "option.mli" +# 2 "option.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/parsing.ml b/stdlib/parsing.ml index 843966613d8..2b31c81656b 100644 --- a/stdlib/parsing.ml +++ b/stdlib/parsing.ml @@ -1,4 +1,4 @@ -# 1 "parsing.ml" +# 2 "parsing.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/parsing.mli b/stdlib/parsing.mli index fd77eb193bd..1177edadeb3 100644 --- a/stdlib/parsing.mli +++ b/stdlib/parsing.mli @@ -1,4 +1,4 @@ -# 1 "parsing.mli" +# 2 "parsing.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/printexc.ml b/stdlib/printexc.ml index 47dd31ff1ef..0f6eb065015 100644 --- a/stdlib/printexc.ml +++ b/stdlib/printexc.ml @@ -1,4 +1,4 @@ -# 1 "printexc.ml" +# 2 "printexc.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/printexc.mli b/stdlib/printexc.mli index ee6d5b4ed09..c14419a2ab4 100644 --- a/stdlib/printexc.mli +++ b/stdlib/printexc.mli @@ -1,4 +1,4 @@ -# 1 "printexc.mli" +# 2 "printexc.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/printf.ml b/stdlib/printf.ml index e975b9334be..1a204dd2dbb 100644 --- a/stdlib/printf.ml +++ b/stdlib/printf.ml @@ -1,4 +1,4 @@ -# 1 "printf.ml" +# 2 "printf.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/printf.mli b/stdlib/printf.mli index d470974727e..53965371297 100644 --- a/stdlib/printf.mli +++ b/stdlib/printf.mli @@ -1,4 +1,4 @@ -# 1 "printf.mli" +# 2 "printf.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/queue.ml b/stdlib/queue.ml index 6326dd83b9a..1f8063d14f4 100644 --- a/stdlib/queue.ml +++ b/stdlib/queue.ml @@ -1,4 +1,4 @@ -# 1 "queue.ml" +# 2 "queue.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/queue.mli b/stdlib/queue.mli index 6674d7c0b63..514943d6bac 100644 --- a/stdlib/queue.mli +++ b/stdlib/queue.mli @@ -1,4 +1,4 @@ -# 1 "queue.mli" +# 2 "queue.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/random.ml b/stdlib/random.ml index 1921b592312..d8d639c9fd9 100644 --- a/stdlib/random.ml +++ b/stdlib/random.ml @@ -1,9 +1,9 @@ -# 1 "random.ml" (**************************************************************************) (* *) (* OCaml *) (* *) (* Damien Doligez, projet Para, INRIA Rocquencourt *) +(* Xavier Leroy, projet Cambium, College de France and Inria *) (* *) (* Copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. *) @@ -14,133 +14,224 @@ (* *) (**************************************************************************) -(* CR ocaml 5 runtime: we should update this to the OCaml 5 splittable PRNG -*) +(* Pseudo-random number generator *) open! Stdlib [@@@ocaml.flambda_o3] -(* Pseudo-random number generator - This is a lagged-Fibonacci F(55, 24, +) with a modified addition - function to enhance the mixing of bits. - If we use normal addition, the low-order bit fails tests 1 and 7 - of the Diehard test suite, and bits 1 and 2 also fail test 7. - If we use multiplication as suggested by Marsaglia, it doesn't fare - much better. - By mixing the bits of one of the numbers before addition (XOR the - 5 high-order bits into the low-order bits), we get a generator that - passes all the Diehard tests. -*) - external random_seed: unit -> int array = "caml_sys_random_seed" module State = struct - type t = { st : int array; mutable idx : int } - - let new_state () = { st = Array.make 55 0; idx = 0 } - let assign st1 st2 = - Array.blit st2.st 0 st1.st 0 55; - st1.idx <- st2.idx - - - let full_init s seed = - let combine accu x = Digest.string (accu ^ Int.to_string x) in - let extract d = - Char.code d.[0] + (Char.code d.[1] lsl 8) + (Char.code d.[2] lsl 16) - + (Char.code d.[3] lsl 24) - in - let seed = if Array.length seed = 0 then [| 0 |] else seed in - let l = Array.length seed in - for i = 0 to 54 do - s.st.(i) <- i; + open Bigarray + + type t = (int64, int64_elt, c_layout) Array1.t + + external next: t -> (int64[@unboxed]) + = "caml_lxm_next" "caml_lxm_next_unboxed" [@@noalloc] + + let create () : t = + Array1.create Int64 C_layout 4 + + let set s i1 i2 i3 i4 = + Array1.unsafe_set s 0 (Int64.logor i1 1L); (* must be odd *) + Array1.unsafe_set s 1 i2; + Array1.unsafe_set s 2 (if i3 <> 0L then i3 else 1L); (* must not be 0 *) + Array1.unsafe_set s 3 (if i4 <> 0L then i4 else 2L) (* must not be 0 *) + + let mk i1 i2 i3 i4 = + let s = create () in + set s i1 i2 i3 i4; s + + let serialization_prefix = + "lxm1:" + (* "lxm" denotes the algorithm currently in use, and '1' is + a version number. We should update this prefix if we change + the Random algorithm or the serialization format, so that users + get a clean error instead of believing that they faithfully + reproduce their previous state and in fact get a different + stream. + + Note that there is no constraint to keep the same + ":" format or message size in future versions, + we could change the format completely if we wanted as long + as there is no confusion possible with the previous formats. *) + + let serialization_prefix_len = + String.length serialization_prefix + + let to_binary_string s = + let prefix = serialization_prefix in + let preflen = serialization_prefix_len in + let buf = Bytes.create (preflen + 4 * 8) in + Bytes.blit_string prefix 0 buf 0 preflen; + for i = 0 to 3 do + Bytes.set_int64_le buf (preflen + i * 8) (Array1.get s i) done; - let accu = ref "x" in - for i = 0 to 54 + Int.max 55 l do - let j = i mod 55 in - let k = i mod l in - accu := combine !accu seed.(k); - s.st.(j) <- (s.st.(j) lxor extract !accu) land 0x3FFFFFFF; (* PR#5575 *) - done; - s.idx <- 0 - - - let make seed = - let result = new_state () in - full_init result seed; - result - - - let make_self_init () = make (random_seed ()) + Bytes.unsafe_to_string buf + + let of_binary_string buf = + let prefix = serialization_prefix in + let preflen = serialization_prefix_len in + if String.length buf <> preflen + 4 * 8 + || not (String.starts_with ~prefix buf) + then + failwith + ("Random.State.of_binary_string: expected a format \ + compatible with OCaml " ^ Sys.ocaml_version); + let i1 = String.get_int64_le buf (preflen + 0 * 8) in + let i2 = String.get_int64_le buf (preflen + 1 * 8) in + let i3 = String.get_int64_le buf (preflen + 2 * 8) in + let i4 = String.get_int64_le buf (preflen + 3 * 8) in + mk i1 i2 i3 i4 + + let assign (dst: t) (src: t) = + Array1.blit src dst let copy s = - let result = new_state () in - assign result s; - result - + let s' = create() in assign s' s; s' + + (* The seed is an array of integers. It can be just one integer, + but it can also be 12 or more bytes. To hide the difference, + we serialize the array as a sequence of bytes, then hash the + sequence with MD5 (Digest.bytes). MD5 gives only 128 bits while + we need 256 bits, so we hash twice with different suffixes. *) + let reinit s seed = + let n = Array.length seed in + let b = Bytes.create (n * 8 + 1) in + for i = 0 to n-1 do + Bytes.set_int64_le b (i * 8) (Int64.of_int seed.(i)) + done; + Bytes.set b (n * 8) '\x01'; + let d1 = Digest.bytes b in + Bytes.set b (n * 8) '\x02'; + let d2 = Digest.bytes b in + set s (String.get_int64_le d1 0) + (String.get_int64_le d1 8) + (String.get_int64_le d2 0) + (String.get_int64_le d2 8) - (* Returns 30 random bits as an integer 0 <= x < 1073741824 *) + let make seed = + let s = create() in reinit s seed; s + + let make_self_init () = + make (random_seed ()) + + let min_int31 = -0x4000_0000 + (* = -2{^30}, which is [min_int] for 31-bit integers *) + let max_int31 = 0x3FFF_FFFF + (* = 2{^30}-1, which is [max_int] for 31-bit integers *) + (* avoid integer literals for these, 32-bit OCaml would reject them: *) + let min_int32 = -(1 lsl 31) + (* = -0x8000_0000 on platforms where [Sys.int_size >= 32] *) + let max_int32 = (1 lsl 31) - 1 + (* = 0x7FFF_FFFF on platforms where [Sys.int_size >= 32] *) + + (* Return 30 random bits as an integer 0 <= x < 2^30 *) let bits s = - s.idx <- (s.idx + 1) mod 55; - let curval = s.st.(s.idx) in - let newval = s.st.((s.idx + 24) mod 55) - + (curval lxor ((curval lsr 25) land 0x1F)) in - let newval30 = newval land 0x3FFFFFFF in (* PR#5575 *) - s.st.(s.idx) <- newval30; - newval30 - - - let rec intaux s n = - let r = bits s in + Int64.to_int (next s) land max_int31 + + (* Return an integer between 0 (included) and [n] (excluded). + [bound] may be any positive [int]. [mask] must be of the form [2{^i}-1] + and greater or equal to [n]. Larger values of [mask] make the function + run faster (fewer samples are rejected). Smaller values of [mask] + are usable on a wider range of OCaml implementations. *) + let rec int_aux s n mask = + (* We start by drawing a non-negative integer in the [ [0, mask] ] range *) + let r = Int64.to_int (next s) land mask in let v = r mod n in - if r - v > 0x3FFFFFFF - n + 1 then intaux s n else v - + (* For uniform distribution of the result between 0 included and [n] + * excluded, the random number [r] must have been drawn uniformly in + * an interval whose length is a multiple of [n]. To achieve this, + * we use rejection sampling on the greatest interval [ [0, k*n-1] ] + * that fits in [ [0, mask] ]. That is, we reject the + * sample if it falls outside of this interval, and draw again. + * This is what the test below does, while carefuly avoiding + * overflows and sparing a division [mask / n]. *) + if r - v > mask - n + 1 then int_aux s n mask else v + + (* Return an integer between 0 (included) and [bound] (excluded). + The bound must fit in 31-bit signed integers. + This function yields the same output regardless of the integer size. *) let int s bound = - if bound > 0x3FFFFFFF || bound <= 0 + if bound > max_int31 || bound <= 0 then invalid_arg "Random.int" - else intaux s bound - - let rec int63aux s n = - let max_int_32 = (1 lsl 30) + 0x3FFFFFFF in (* 0x7FFFFFFF *) - let b1 = bits s in - let b2 = bits s in - let (r, max_int) = - if n <= max_int_32 then - (* 31 random bits on both 64-bit OCaml and JavaScript. - Use upper 15 bits of b1 and 16 bits of b2. *) - let bpos = - (((b2 land 0x3FFFC000) lsl 1) lor (b1 lsr 15)) - in - (bpos, max_int_32) - else - let b3 = bits s in - (* 62 random bits on 64-bit OCaml; unreachable on JavaScript. - Use upper 20 bits of b1 and 21 bits of b2 and b3. *) - let bpos = - ((((b3 land 0x3FFFFE00) lsl 12) lor (b2 lsr 9)) lsl 20) - lor (b1 lsr 10) - in - (bpos, max_int) - in - let v = r mod n in - if r - v > max_int - n + 1 then int63aux s n else v + else int_aux s bound max_int31 + (* Return an integer between 0 (included) and [bound] (excluded). + [bound] may be any positive [int]. *) let full_int s bound = if bound <= 0 then invalid_arg "Random.full_int" - else if bound > 0x3FFFFFFF then - int63aux s bound + (* When the bound fits in 31-bit signed integers, we use the same mask + as in function [int] so as to yield the same output on all platforms + supported by OCaml (32-bit OCaml, 64-bit OCaml, and JavaScript). + When the bound fits in 32-bit signed integers, we use [max_int32] + as the mask so as to yield the same output on all platforms where + [Sys.int_size >= 32] (i.e. JavaScript and 64-bit OCaml). *) + else + int_aux s bound + (if bound <= max_int31 then max_int31 + else if bound <= max_int32 then max_int32 + else max_int) + + (* Return an integer between [min] (included) and [max] (included). + The [nbits] parameter is the size in bits of the signed integers + we draw from [s]. + We must have [-2{^nbits - 1} <= min <= max < 2{^nbits - 1}]. + Moreover, for the iteration to converge quickly, the interval + [[min, max]] should have width at least [2{^nbits - 1}]. + As the width approaches this lower limit, the average number of + draws approaches 2, with a quite high standard deviation (2 + epsilon). *) + let rec int_in_large_range s ~min ~max ~nbits = + let drop = Sys.int_size - nbits in + (* The bitshifts replicate the [nbits]-th bit (sign bit) to higher bits: *) + let r = ((Int64.to_int (next s)) lsl drop) asr drop in + if r < min || r > max then int_in_large_range s ~min ~max ~nbits else r + + (* Return an integer between [min] (included) and [max] (included). + [mask] is as described for [int_aux]. + [nbits] is as described for [int_in_large_range]. *) + let int_in_range_aux s ~min ~max ~mask ~nbits = + let span = max - min + 1 in + if span <= mask (* [span] is small enough *) + && span > 0 (* no overflow occurred when computing [span] *) + then + (* Just draw a number in [[0, span)] and shift it by [min]. *) + min + int_aux s span mask else - intaux s bound + (* Span too large, use the alternative drawing method. *) + int_in_large_range s ~min ~max ~nbits + + (* Return an integer between [min] (included) and [max] (included). + We must have [min <= max]. *) + let int_in_range s ~min ~max = + if min > max then + invalid_arg "Random.int_in_range"; + (* When both bounds fit in 31-bit signed integers, we use parameters + [mask] and [nbits] appropriate for 31-bit integers, so as to + yield the same output on all platforms supported by OCaml. + When both bounds fit in 32-bit signed integers, we use parameters + [mask] and [nbits] appropriate for 32-bit integers, so as to + yield the same output on JavaScript and on 64-bit OCaml. *) + if min >= min_int31 && max <= max_int31 then + int_in_range_aux s ~min ~max ~mask:max_int31 ~nbits:31 + else if min >= min_int32 && max <= max_int32 then + int_in_range_aux s ~min ~max ~mask:max_int32 ~nbits:32 + else + int_in_range_aux s ~min ~max ~mask:max_int ~nbits:Sys.int_size + (* Return 32 random bits as an [int32] *) + let bits32 s = + Int64.to_int32 (next s) + (* Return an [int32] between 0 (included) and [bound] (excluded). *) let rec int32aux s n = - let b1 = Int32.of_int (bits s) in - let b2 = Int32.shift_left (Int32.of_int (bits s land 1)) 30 in - let r = Int32.logor b1 b2 in + let r = Int32.shift_right_logical (bits32 s) 1 in let v = Int32.rem r n in - if Int32.sub r v > Int32.add (Int32.sub Int32.max_int n) 1l + (* Explanation of this test: see comment in [int_aux]. *) + if Int32.(sub r v > add (sub max_int n) 1l) then int32aux s n else v @@ -149,14 +240,33 @@ module State = struct then invalid_arg "Random.int32" else int32aux s bound + (* Return an [int32] between [min] (included) and [max] (included). + We must have [min <= max]. *) + let rec int32_in_range_aux s ~min ~max = + let r = Int64.to_int32 (next s) in + if r < min || r > max then int32_in_range_aux s ~min ~max else r + + let int32_in_range s ~min ~max = + if min > max then + invalid_arg "Random.int32_in_range" + else + let span = Int32.succ (Int32.sub max min) in + (* Explanation of this test: see comment in [int_in_range_aux]. *) + if span <= Int32.zero then + int32_in_range_aux s ~min ~max + else + Int32.add min (int32aux s span) + (* Return 64 random bits as an [int64] *) + let bits64 s = + next s + + (* Return an [int64] between 0 (included) and [bound] (excluded). *) let rec int64aux s n = - let b1 = Int64.of_int (bits s) in - let b2 = Int64.shift_left (Int64.of_int (bits s)) 30 in - let b3 = Int64.shift_left (Int64.of_int (bits s land 7)) 60 in - let r = Int64.logor b1 (Int64.logor b2 b3) in + let r = Int64.shift_right_logical (bits64 s) 1 in let v = Int64.rem r n in - if Int64.sub r v > Int64.add (Int64.sub Int64.max_int n) 1L + (* Explanation of this test: see comment in [int_aux]. *) + if Int64.(sub r v > add (sub max_int n) 1L) then int64aux s n else v @@ -165,174 +275,104 @@ module State = struct then invalid_arg "Random.int64" else int64aux s bound + (* Return an [int64] between [min] (included) and [max] (included). + We must have [min <= max]. *) + let rec int64_in_range_aux s ~min ~max = + let r = next s in + if r < min || r > max then int64_in_range_aux s ~min ~max else r + + let int64_in_range s ~min ~max = + if min > max then + invalid_arg "Random.int64_in_range" + else + let span = Int64.succ (Int64.sub max min) in + (* Explanation of this test: see comment in [int_in_range_aux]. *) + if span <= Int64.zero then + int64_in_range_aux s ~min ~max + else + Int64.add min (int64aux s span) + + (* Return 32 or 64 random bits as a [nativeint] *) + let nativebits = + if Nativeint.size = 32 + then fun s -> Nativeint.of_int32 (bits32 s) + else fun s -> Int64.to_nativeint (bits64 s) + (* Return a [nativeint] between 0 (included) and [bound] (excluded). *) let nativeint = if Nativeint.size = 32 then fun s bound -> Nativeint.of_int32 (int32 s (Nativeint.to_int32 bound)) else fun s bound -> Int64.to_nativeint (int64 s (Int64.of_nativeint bound)) - - (* Returns a float 0 <= x <= 1 with at most 60 bits of precision. *) - let rawfloat s = - let scale = 1073741824.0 (* 2^30 *) - and r1 = Stdlib.float (bits s) - and r2 = Stdlib.float (bits s) - in (r1 /. scale +. r2) /. scale - - + (* Return a [nativeint] between [min] (included) and [max] (included). *) + let nativeint_in_range = + if Nativeint.size = 32 + then fun s ~min ~max -> + Nativeint.of_int32 (int32_in_range s + ~min:(Nativeint.to_int32 min) ~max:(Nativeint.to_int32 max)) + else fun s ~min ~max -> + Int64.to_nativeint (int64_in_range s + ~min:(Int64.of_nativeint min) ~max:(Int64.of_nativeint max)) + + (* Return a float 0 < x < 1 uniformly distributed among the + multiples of 2^-53 *) + let rec rawfloat s = + let b = next s in + let n = Int64.shift_right_logical b 11 in + if n <> 0L then Int64.to_float n *. 0x1.p-53 else rawfloat s + + (* Return a float between 0 and [bound] *) let float s bound = rawfloat s *. bound - let bool s = (bits s land 1 = 0) - - let bits32 s = - let b1 = Int32.(shift_right_logical (of_int (bits s)) 14) in (* 16 bits *) - let b2 = Int32.(shift_right_logical (of_int (bits s)) 14) in (* 16 bits *) - Int32.(logor b1 (shift_left b2 16)) - - let bits64 s = - let b1 = Int64.(shift_right_logical (of_int (bits s)) 9) in (* 21 bits *) - let b2 = Int64.(shift_right_logical (of_int (bits s)) 9) in (* 21 bits *) - let b3 = Int64.(shift_right_logical (of_int (bits s)) 8) in (* 22 bits *) - Int64.(logor b1 (logor (shift_left b2 21) (shift_left b3 42))) - - let nativebits = - if Nativeint.size = 32 - then fun s -> Nativeint.of_int32 (bits32 s) - else fun s -> Int64.to_nativeint (bits64 s) + (* Return a random Boolean *) + let bool s = next s < 0L + (* Split a new PRNG off the given PRNG *) + let split s = + let i1 = bits64 s in let i2 = bits64 s in + let i3 = bits64 s in let i4 = bits64 s in + mk i1 i2 i3 i4 end -(* This is the state you get with [init 27182818] and then applying - the "land 0x3FFFFFFF" filter to them. See #5575, #5793, #5977. *) -let default = { - State.st = [| - 0x3ae2522b; 0x1d8d4634; 0x15b4fad0; 0x18b14ace; 0x12f8a3c4; 0x3b086c47; - 0x16d467d6; 0x101d91c7; 0x321df177; 0x0176c193; 0x1ff72bf1; 0x1e889109; - 0x0b464b18; 0x2b86b97c; 0x0891da48; 0x03137463; 0x085ac5a1; 0x15d61f2f; - 0x3bced359; 0x29c1c132; 0x3a86766e; 0x366d8c86; 0x1f5b6222; 0x3ce1b59f; - 0x2ebf78e1; 0x27cd1b86; 0x258f3dc3; 0x389a8194; 0x02e4c44c; 0x18c43f7d; - 0x0f6e534f; 0x1e7df359; 0x055d0b7e; 0x10e84e7e; 0x126198e4; 0x0e7722cb; - 0x1cbede28; 0x3391b964; 0x3d40e92a; 0x0c59933d; 0x0b8cd0b7; 0x24efff1c; - 0x2803fdaa; 0x08ebc72e; 0x0f522e32; 0x05398edc; 0x2144a04c; 0x0aef3cbd; - 0x01ad4719; 0x35b93cd6; 0x2a559d4f; 0x1e6fd768; 0x26e27f36; 0x186f18c3; - 0x2fbf967a; - |]; - State.idx = 0; -} - -let bits () = State.bits default -let int bound = State.int default bound -let full_int bound = State.full_int default bound -let int32 bound = State.int32 default bound -let nativeint bound = State.nativeint default bound -let int64 bound = State.int64 default bound -let float scale = State.float default scale -let bool () = State.bool default -let bits32 () = State.bits32 default -let bits64 () = State.bits64 default -let nativebits () = State.nativebits default - -let full_init seed = State.full_init default seed -let init seed = State.full_init default [| seed |] +let mk_default () = + (* This is the state obtained with [State.make [| 314159265 |]]. *) + State.mk (-6196874289567705097L) + 586573249833713189L + (-8591268803865043407L) + 6388613595849772044L + +let random_key = + Domain.DLS.new_key ~split_from_parent:State.split mk_default + +let bits () = State.bits (Domain.DLS.get random_key) +let int bound = State.int (Domain.DLS.get random_key) bound +let full_int bound = State.full_int (Domain.DLS.get random_key) bound +let int_in_range ~min ~max = + State.int_in_range (Domain.DLS.get random_key) ~min ~max +let int32 bound = State.int32 (Domain.DLS.get random_key) bound +let int32_in_range ~min ~max = + State.int32_in_range (Domain.DLS.get random_key) ~min ~max +let nativeint bound = State.nativeint (Domain.DLS.get random_key) bound +let nativeint_in_range ~min ~max = + State.nativeint_in_range (Domain.DLS.get random_key) ~min ~max +let int64 bound = State.int64 (Domain.DLS.get random_key) bound +let int64_in_range ~min ~max = + State.int64_in_range (Domain.DLS.get random_key) ~min ~max +let float scale = State.float (Domain.DLS.get random_key) scale +let bool () = State.bool (Domain.DLS.get random_key) +let bits32 () = State.bits32 (Domain.DLS.get random_key) +let bits64 () = State.bits64 (Domain.DLS.get random_key) +let nativebits () = State.nativebits (Domain.DLS.get random_key) + +let full_init seed = State.reinit (Domain.DLS.get random_key) seed +let init seed = full_init [| seed |] let self_init () = full_init (random_seed()) +(* Splitting *) + +let split () = State.split (Domain.DLS.get random_key) + (* Manipulating the current state. *) -let get_state () = State.copy default -let set_state s = State.assign default s - -(******************** - -(* Test functions. Not included in the library. - The [chisquare] function should be called with n > 10r. - It returns a triple (low, actual, high). - If low <= actual <= high, the [g] function passed the test, - otherwise it failed. - - Some results: - -init 27182818; chisquare int 100000 1000 -init 27182818; chisquare int 100000 100 -init 27182818; chisquare int 100000 5000 -init 27182818; chisquare int 1000000 1000 -init 27182818; chisquare int 100000 1024 -init 299792643; chisquare int 100000 1024 -init 14142136; chisquare int 100000 1024 -init 27182818; init_diff 1024; chisquare diff 100000 1024 -init 27182818; init_diff 100; chisquare diff 100000 100 -init 27182818; init_diff2 1024; chisquare diff2 100000 1024 -init 27182818; init_diff2 100; chisquare diff2 100000 100 -init 14142136; init_diff2 100; chisquare diff2 100000 100 -init 299792643; init_diff2 100; chisquare diff2 100000 100 -- : float * float * float = (936.754446796632465, 997.5, 1063.24555320336754) -# - : float * float * float = (80., 89.7400000000052387, 120.) -# - : float * float * float = (4858.57864376269, 5045.5, 5141.42135623731) -# - : float * float * float = -(936.754446796632465, 944.805999999982305, 1063.24555320336754) -# - : float * float * float = (960., 1019.19744000000355, 1088.) -# - : float * float * float = (960., 1059.31776000000536, 1088.) -# - : float * float * float = (960., 1039.98463999999512, 1088.) -# - : float * float * float = (960., 1054.38207999999577, 1088.) -# - : float * float * float = (80., 90.096000000005, 120.) -# - : float * float * float = (960., 1076.78720000000612, 1088.) -# - : float * float * float = (80., 85.1760000000067521, 120.) -# - : float * float * float = (80., 85.2160000000003492, 120.) -# - : float * float * float = (80., 80.6220000000030268, 120.) - -*) - -(* Return the sum of the squares of v[i0,i1[ *) -let rec sumsq v i0 i1 = - if i0 >= i1 then 0.0 - else if i1 = i0 + 1 then Stdlib.float v.(i0) *. Stdlib.float v.(i0) - else sumsq v i0 ((i0+i1)/2) +. sumsq v ((i0+i1)/2) i1 - - -let chisquare g n r = - if n <= 10 * r then invalid_arg "chisquare"; - let f = Array.make r 0 in - for i = 1 to n do - let t = g r in - f.(t) <- f.(t) + 1 - done; - let t = sumsq f 0 r - and r = Stdlib.float r - and n = Stdlib.float n in - let sr = 2.0 *. sqrt r in - (r -. sr, (r *. t /. n) -. n, r +. sr) - - -(* This is to test for linear dependencies between successive random numbers. -*) -let st = ref 0 -let init_diff r = st := int r -let diff r = - let x1 = !st - and x2 = int r - in - st := x2; - if x1 >= x2 then - x1 - x2 - else - r + x1 - x2 - - -let st1 = ref 0 -and st2 = ref 0 - - -(* This is to test for quadratic dependencies between successive random - numbers. -*) -let init_diff2 r = st1 := int r; st2 := int r -let diff2 r = - let x1 = !st1 - and x2 = !st2 - and x3 = int r - in - st1 := x2; - st2 := x3; - (x3 - x2 - x2 + x1 + 2*r) mod r - - -********************) +let get_state () = State.copy (Domain.DLS.get random_key) +let set_state s = State.assign (Domain.DLS.get random_key) s \ No newline at end of file diff --git a/stdlib/random.mli b/stdlib/random.mli index f1553a5aa36..a3a25e73a14 100644 --- a/stdlib/random.mli +++ b/stdlib/random.mli @@ -1,9 +1,9 @@ -# 1 "random.mli" (**************************************************************************) (* *) (* OCaml *) (* *) (* Damien Doligez, projet Para, INRIA Rocquencourt *) +(* Xavier Leroy, projet Cambium, College de France and Inria *) (* *) (* Copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. *) @@ -16,57 +16,134 @@ open! Stdlib -(** Pseudo-random number generators (PRNG). *) +(** Pseudo-random number generators (PRNG). + + With multiple domains, each domain has its own generator that evolves + independently of the generators of other domains. When a domain is + created, its generator is initialized by splitting the state + of the generator associated with the parent domain. + + In contrast, all threads within a domain share the same domain-local + generator. Independent generators can be created with the {!Random.split} + function and used with the functions from the {!Random.State} module. + + @before 5.0 Random value generation used a different algorithm. + This affects all the functions in this module which return random values. +*) (** {1 Basic functions} *) val init : int -> unit -(** Initialize the generator, using the argument as a seed. - The same seed will always yield the same sequence of numbers. *) +(** Initialize the domain-local generator, using the argument as a seed. + The same seed will always yield the same sequence of numbers. *) val full_init : int array -> unit (** Same as {!Random.init} but takes more data as seed. *) val self_init : unit -> unit -(** Initialize the generator with a random seed chosen - in a system-dependent way. If [/dev/urandom] is available on - the host machine, it is used to provide a highly random initial - seed. Otherwise, a less random seed is computed from system - parameters (current time, process IDs). *) +(** Initialize the domain-local generator with a random seed chosen + in a system-dependent way. If [/dev/urandom] is available on the host + machine, it is used to provide a highly random initial seed. Otherwise, a + less random seed is computed from system parameters (current time, process + IDs, domain-local state). *) val bits : unit -> int (** Return 30 random bits in a nonnegative integer. - @before 3.12.0 used a different algorithm (affects all the following - functions) *) val int : int -> int (** [Random.int bound] returns a random integer between 0 (inclusive) and [bound] (exclusive). [bound] must be greater than 0 and less - than 2{^30}. *) + than 2{^30}. + + @raise Invalid_argument if [bound] <= 0 or [bound] >= 2{^30}. +*) val full_int : int -> int (** [Random.full_int bound] returns a random integer between 0 (inclusive) and [bound] (exclusive). [bound] may be any positive integer. - If [bound] is less than 2{^30}, [Random.full_int bound] is equal to - {!Random.int}[ bound]. If [bound] is greater than 2{^30} (on 64-bit systems - or non-standard environments, such as JavaScript), [Random.full_int] - returns a value, where {!Random.int} raises {!Invalid_argument}. + If [bound] is less than 2{^31}, + then [Random.full_int bound] yields identical output + across systems with varying [int] sizes. + + If [bound] is less than 2{^30}, + then [Random.full_int bound] is equal to {!Random.int}[ bound]. + + If [bound] is at least 2{^30} + (on 64-bit systems, or non-standard environments such as JavaScript), + then [Random.full_int] returns a value + whereas {!Random.int} raises {!Stdlib.Invalid_argument}. + + @raise Invalid_argument if [bound] <= 0. + + @since 4.13 *) + +val int_in_range : min:int -> max:int -> int +(** [Random.int_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. - @since 4.13.0 *) + If both bounds fit in 32-bit signed integers + (that is, if -2{^31} <= [min] and [max] < 2{^31}), + then [int_in_range] yields identical output + across systems with varying [int] sizes. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) val int32 : Int32.t -> Int32.t (** [Random.int32 bound] returns a random integer between 0 (inclusive) - and [bound] (exclusive). [bound] must be greater than 0. *) + and [bound] (exclusive). [bound] must be greater than 0. + + @raise Invalid_argument if [bound] <= 0. +*) + +val int32_in_range : min:int32 -> max:int32 -> int32 +(** [Random.int32_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) val nativeint : Nativeint.t -> Nativeint.t (** [Random.nativeint bound] returns a random integer between 0 (inclusive) - and [bound] (exclusive). [bound] must be greater than 0. *) + and [bound] (exclusive). [bound] must be greater than 0. + + @raise Invalid_argument if [bound] <= 0. +*) + +val nativeint_in_range : min:nativeint -> max:nativeint -> nativeint +(** [Random.nativeint_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) val int64 : Int64.t -> Int64.t (** [Random.int64 bound] returns a random integer between 0 (inclusive) - and [bound] (exclusive). [bound] must be greater than 0. *) + and [bound] (exclusive). [bound] must be greater than 0. + + @raise Invalid_argument if [bound] <= 0. +*) + +val int64_in_range : min:int64 -> max:int64 -> int64 +(** [Random.int64_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) val float : float -> float (** [Random.float bound] returns a random floating-point number @@ -80,18 +157,18 @@ val bool : unit -> bool val bits32 : unit -> Int32.t (** [Random.bits32 ()] returns 32 random bits as an integer between {!Int32.min_int} and {!Int32.max_int}. - @since 4.14.0 *) + @since 4.14 *) val bits64 : unit -> Int64.t (** [Random.bits64 ()] returns 64 random bits as an integer between {!Int64.min_int} and {!Int64.max_int}. - @since 4.14.0 *) + @since 4.14 *) val nativebits : unit -> Nativeint.t (** [Random.nativebits ()] returns 32 or 64 random bits (depending on the bit width of the platform) as an integer between {!Nativeint.min_int} and {!Nativeint.max_int}. - @since 4.14.0 *) + @since 4.14 *) (** {1 Advanced functions} *) @@ -110,8 +187,9 @@ module State : sig (** Create a new state and initialize it with the given seed. *) val make_self_init : unit -> t - (** Create a new state and initialize it with a system-dependent - low-entropy seed. *) + (** Create a new state and initialize it with a random seed chosen + in a system-dependent way. + The seed is obtained as described in {!Random.self_init}. *) val copy : t -> t (** Return a copy of the given state. *) @@ -119,9 +197,13 @@ module State : sig val bits : t -> int val int : t -> int -> int val full_int : t -> int -> int + val int_in_range : t -> min:int -> max:int -> int val int32 : t -> Int32.t -> Int32.t + val int32_in_range : t -> min:int32 -> max:int32 -> int32 val nativeint : t -> Nativeint.t -> Nativeint.t + val nativeint_in_range : t -> min:nativeint -> max:nativeint -> nativeint val int64 : t -> Int64.t -> Int64.t + val int64_in_range : t -> min:int64 -> max:int64 -> int64 val float : t -> float -> float val bool : t -> bool val bits32 : t -> Int32.t @@ -130,11 +212,60 @@ module State : sig (** These functions are the same as the basic functions, except that they use (and update) the given PRNG state instead of the default one. *) -end + val split : t -> t + (** Draw a fresh PRNG state from the given PRNG state. + (The given PRNG state is modified.) + The new PRNG is statistically independent from the given PRNG. + Data can be drawn from both PRNGs, in any order, without risk of + correlation. Both PRNGs can be split later, arbitrarily many times. + @since 5.0 *) + + val to_binary_string : t -> string + (** Serializes the PRNG state into an immutable sequence of bytes. + See {!of_binary_string} for deserialization. + + The [string] type is intended here for serialization only, the + encoding is not human-readable and may not be printable. + + Note that the serialization format may differ across OCaml + versions. + + @since 5.1 + *) + + val of_binary_string : string -> t + (** Deserializes a byte sequence obtained by calling + {!to_binary_string}. The resulting PRNG state will produce the + same random numbers as the state that was passed as input to + {!to_binary_string}. + + @raise Failure if the input is not in the expected format. + + Note that the serialization format may differ across OCaml + versions. + + Unlike the functions provided by the {!Marshal} module, this + function either produces a valid state or fails cleanly with + a [Failure] exception. It can be safely used on user-provided, + untrusted inputs. + + @since 5.1 + *) +end val get_state : unit -> State.t -(** Return the current state of the generator used by the basic functions. *) +(** [get_state()] returns a fresh copy of the current state of the + domain-local generator (which is used by the basic functions). *) val set_state : State.t -> unit -(** Set the state of the generator used by the basic functions. *) +(** [set_state s] updates the current state of the domain-local + generator (which is used by the basic functions) by copying + the state [s] into it. *) + +val split : unit -> State.t +(** Draw a fresh PRNG state from the current state of the domain-local + generator used by the default functions. + (The state of the domain-local generator is modified.) + See {!Random.State.split}. + @since 5.0 *) \ No newline at end of file diff --git a/stdlib/result.ml b/stdlib/result.ml index 8d7883d9308..5afc77a32bc 100644 --- a/stdlib/result.ml +++ b/stdlib/result.ml @@ -1,4 +1,4 @@ -# 1 "result.ml" +# 2 "result.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/result.mli b/stdlib/result.mli index f5f55a77c56..db6fba7e57d 100644 --- a/stdlib/result.mli +++ b/stdlib/result.mli @@ -1,4 +1,4 @@ -# 1 "result.mli" +# 2 "result.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 431b11be516..d1af20f3bff 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -1,4 +1,4 @@ -# 1 "scanf.ml" +# 2 "scanf.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/scanf.mli b/stdlib/scanf.mli index ea06afc9291..96f5d60c45d 100644 --- a/stdlib/scanf.mli +++ b/stdlib/scanf.mli @@ -1,4 +1,4 @@ -# 1 "scanf.mli" +# 2 "scanf.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/otherlibs/systhreads/semaphore.ml b/stdlib/semaphore.ml similarity index 99% rename from otherlibs/systhreads/semaphore.ml rename to stdlib/semaphore.ml index e4fa4181a0e..f0ecc032cee 100644 --- a/otherlibs/systhreads/semaphore.ml +++ b/stdlib/semaphore.ml @@ -13,6 +13,8 @@ (* *) (**************************************************************************) +open! Stdlib + (** Semaphores *) type sem = { diff --git a/otherlibs/systhreads/semaphore.mli b/stdlib/semaphore.mli similarity index 99% rename from otherlibs/systhreads/semaphore.mli rename to stdlib/semaphore.mli index 3a62747829b..553e1062e16 100644 --- a/otherlibs/systhreads/semaphore.mli +++ b/stdlib/semaphore.mli @@ -13,6 +13,8 @@ (* *) (**************************************************************************) +open! Stdlib + (** Semaphores A semaphore is a thread synchronization device that can be used to diff --git a/stdlib/seq.ml b/stdlib/seq.ml index bdc75fc7415..ca04a2dfa6f 100644 --- a/stdlib/seq.ml +++ b/stdlib/seq.ml @@ -1,4 +1,4 @@ -# 1 "seq.ml" +# 2 "seq.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/seq.mli b/stdlib/seq.mli index a3ef57e536a..3ac64038226 100644 --- a/stdlib/seq.mli +++ b/stdlib/seq.mli @@ -1,4 +1,4 @@ -# 1 "seq.mli" +# 2 "seq.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/set.ml b/stdlib/set.ml index ba7feda668f..92811bf0a1c 100644 --- a/stdlib/set.ml +++ b/stdlib/set.ml @@ -1,4 +1,4 @@ -# 1 "set.ml" +# 2 "set.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/set.mli b/stdlib/set.mli index 1ef596670bf..5f5c2723eeb 100644 --- a/stdlib/set.mli +++ b/stdlib/set.mli @@ -1,4 +1,4 @@ -# 1 "set.mli" +# 2 "set.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/stack.ml b/stdlib/stack.ml index 56bd0e87580..285cb907c11 100644 --- a/stdlib/stack.ml +++ b/stdlib/stack.ml @@ -1,4 +1,4 @@ -# 1 "stack.ml" +# 2 "stack.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/stack.mli b/stdlib/stack.mli index b8cf9502acd..9fe042a4757 100644 --- a/stdlib/stack.mli +++ b/stdlib/stack.mli @@ -1,4 +1,4 @@ -# 1 "stack.mli" +# 2 "stack.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/stdLabels.ml b/stdlib/stdLabels.ml index 4e45e753731..643020f0a15 100644 --- a/stdlib/stdLabels.ml +++ b/stdlib/stdLabels.ml @@ -1,4 +1,4 @@ -# 1 "stdLabels.ml" +# 2 "stdLabels.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/stdLabels.mli b/stdlib/stdLabels.mli index a58a4c8733a..5dd4931d690 100644 --- a/stdlib/stdLabels.mli +++ b/stdlib/stdLabels.mli @@ -1,4 +1,4 @@ -# 1 "stdLabels.mli" +# 2 "stdLabels.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/std_exit.ml b/stdlib/std_exit.ml index 1700b44d9b6..f3afccd0ac5 100644 --- a/stdlib/std_exit.ml +++ b/stdlib/std_exit.ml @@ -1,4 +1,4 @@ -# 1 "std_exit.ml" +# 2 "std_exit.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/stdlib.ml b/stdlib/stdlib.ml index b34855492f7..2258a92ea55 100644 --- a/stdlib/stdlib.ml +++ b/stdlib/stdlib.ml @@ -1,4 +1,4 @@ -# 1 "stdlib.ml" +# 2 "stdlib.ml" (**************************************************************************) (* *) (* OCaml *) @@ -556,27 +556,11 @@ let ( ^^ ) (Format (fmt1, str1)) (Format (fmt2, str2)) = external sys_exit : int -> 'a = "caml_sys_exit" (* for at_exit *) -(* BACKPORT BEGIN type 'a atomic_t external atomic_make : 'a -> 'a atomic_t = "%makemutable" external atomic_get : 'a atomic_t -> 'a = "%atomic_load" external atomic_compare_and_set : 'a atomic_t -> 'a -> 'a -> bool = "%atomic_cas" -*) -type 'a t = {mutable v: 'a} - -let atomic_make v = {v} -let atomic_get r = r.v -let[@inline never] atomic_compare_and_set r seen v = - (* BEGIN ATOMIC *) - let cur = r.v in - if cur == seen then ( - r.v <- v; - (* END ATOMIC *) - true - ) else - false -(* BACKPORT END *) let exit_function = atomic_make flush_all @@ -603,13 +587,10 @@ let exit retcode = let _ = register_named_value "Pervasives.do_at_exit" do_at_exit -(* CR ocaml 5 runtime: - BACKPORT BEGIN *) external major : unit -> unit = "caml_gc_major" external naked_pointers_checked : unit -> bool = "caml_sys_const_naked_pointers_checked" let () = if naked_pointers_checked () then at_exit major -(* BACKPORT END *) (*MODULE_ALIASES*) module Arg = Arg @@ -624,16 +605,10 @@ module BytesLabels = BytesLabels module Callback = Callback module Char = Char module Complex = Complex -(* CR ocaml 5 runtime: - BACKPORT module Condition = Condition -*) module Digest = Digest -(* CR ocaml 5 runtime: - BACKPORT module Domain = Domain module Effect = Effect -*) module Either = Either module Ephemeron = Ephemeron module Filename = Filename @@ -653,10 +628,7 @@ module ListLabels = ListLabels module Map = Map module Marshal = Marshal module MoreLabels = MoreLabels -(* CR ocaml 5 runtime: - BACKPORT module Mutex = Mutex -*) module Nativeint = Nativeint module Obj = Obj module Oo = Oo @@ -669,10 +641,7 @@ module Queue = Queue module Random = Random module Result = Result module Scanf = Scanf -(* CR ocaml 5 runtime: - BACKPORT module Semaphore = Semaphore -*) module Seq = Seq module Set = Set module Stack = Stack diff --git a/stdlib/stdlib.mli b/stdlib/stdlib.mli index 7dd973f7036..a1c704f519d 100644 --- a/stdlib/stdlib.mli +++ b/stdlib/stdlib.mli @@ -1,4 +1,4 @@ -# 1 "stdlib.mli" +# 2 "stdlib.mli" (**************************************************************************) (* *) (* OCaml *) @@ -1403,24 +1403,17 @@ module BytesLabels = BytesLabels module Callback = Callback module Char = Char module Complex = Complex -(* CR ocaml 5 runtime: - BACKPORT module Condition = Condition -*) module Digest = Digest -(* CR ocaml 5 runtime: -BACKPORT module Domain = Domain [@@alert "-unstable"] [@@alert unstable "The Domain interface may change in incompatible ways in the future." ] module Effect = Effect -[@@alert "-unstable"] [@@alert unstable "The Effect interface may change in incompatible ways in the future." ] -*) module Either = Either module Ephemeron = Ephemeron module Filename = Filename @@ -1440,10 +1433,7 @@ module ListLabels = ListLabels module Map = Map module Marshal = Marshal module MoreLabels = MoreLabels -(* CR ocaml 5 runtime: - BACKPORT module Mutex = Mutex -*) module Nativeint = Nativeint module Obj = Obj module Oo = Oo @@ -1456,10 +1446,7 @@ module Queue = Queue module Random = Random module Result = Result module Scanf = Scanf -(* CR ocaml 5 runtime: -BACKPORT module Semaphore = Semaphore -*) module Seq = Seq module Set = Set module Stack = Stack diff --git a/stdlib/string.ml b/stdlib/string.ml index c5b5964f73a..bdb1bc02b48 100644 --- a/stdlib/string.ml +++ b/stdlib/string.ml @@ -1,4 +1,4 @@ -# 1 "string.ml" +# 2 "string.ml" (**************************************************************************) (* *) (* OCaml *) @@ -223,10 +223,8 @@ let ends_with ~suffix s = else aux (i + 1) in diff >= 0 && aux 0 -(* BACKPORT external seeded_hash : int -> string -> int = "caml_string_hash" [@@noalloc] let hash x = seeded_hash 0 x -*) (* duplicated in bytes.ml *) let split_on_char sep s = diff --git a/stdlib/string.mli b/stdlib/string.mli index fa1d460b269..1ea6e5f75cd 100644 --- a/stdlib/string.mli +++ b/stdlib/string.mli @@ -1,4 +1,4 @@ -# 1 "string.mli" +# 2 "string.mli" (**************************************************************************) (* *) (* OCaml *) @@ -483,8 +483,6 @@ val get_int32_ne : string -> int -> int32 @since 4.13 *) -(* BACKPORT - not in 4.x runtime (caml_string_hash) val hash : t -> int (** An unseeded hash function for strings, with the same output value as {!Hashtbl.hash}. This function allows this module to be passed as argument @@ -498,7 +496,6 @@ val seeded_hash : int -> t -> int argument to the functor {!Hashtbl.MakeSeeded}. @since 5.0 *) -*) val get_int32_be : string -> int -> int32 (** [get_int32_be b i] is [b]'s big-endian 32-bit integer diff --git a/stdlib/stringLabels.ml b/stdlib/stringLabels.ml index 21fd2c5beeb..14b88bc4b9f 100644 --- a/stdlib/stringLabels.ml +++ b/stdlib/stringLabels.ml @@ -1,4 +1,4 @@ -# 1 "stringLabels.ml" +# 2 "stringLabels.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/stringLabels.mli b/stdlib/stringLabels.mli index a5863e3c88f..211d201ae7d 100644 --- a/stdlib/stringLabels.mli +++ b/stdlib/stringLabels.mli @@ -1,4 +1,4 @@ -# 1 "stringLabels.mli" +# 2 "stringLabels.mli" (**************************************************************************) (* *) (* OCaml *) @@ -485,9 +485,6 @@ val get_int32_ne : string -> int -> int32 @since 4.13 *) -(* BACKPORT - not in 4.x runtime (caml_string_hash) - val hash : t -> int (** An unseeded hash function for strings, with the same output value as {!Hashtbl.hash}. This function allows this module to be passed as argument @@ -501,7 +498,6 @@ val seeded_hash : int -> t -> int argument to the functor {!Hashtbl.MakeSeeded}. @since 5.0 *) -*) val get_int32_be : string -> int -> int32 (** [get_int32_be b i] is [b]'s big-endian 32-bit integer diff --git a/stdlib/sys.ml.in b/stdlib/sys.ml.in index 2aa8adb4dad..4991ea1adaf 100644 --- a/stdlib/sys.ml.in +++ b/stdlib/sys.ml.in @@ -47,15 +47,39 @@ let cygwin = cygwin () let max_array_length = max_wosize () let max_floatarray_length = max_array_length / (64 / word_size) let max_string_length = word_size / 8 * max_array_length - 1 + +(* In bytecode, [float# array] is treated as [float array]. + Using [max_floatarray_length] assumes flat float arrays are enabled. *) +let max_unboxed_float_array_length = max_floatarray_length + +let max_custom_array_length = max_array_length - 1 + +let max_unboxed_float32_array_length = + match backend_type with + | Native -> max_custom_array_length * (word_size / 32) + | Bytecode | Other _ -> max_array_length + +let max_unboxed_int64_array_length = + match backend_type with + | Native -> max_custom_array_length / (64 / word_size) + | Bytecode | Other _ -> max_array_length + +let max_unboxed_int32_array_length = + match backend_type with + | Native -> max_custom_array_length * (word_size / 32) + | Bytecode | Other _ -> max_array_length + +let max_unboxed_nativeint_array_length = + match backend_type with + | Native -> max_custom_array_length + | Bytecode | Other _ -> max_array_length + external runtime_variant : unit -> string = "caml_runtime_variant" external runtime_parameters : unit -> string = "caml_runtime_parameters" external file_exists: string -> bool = "caml_sys_file_exists" external is_directory : string -> bool = "caml_sys_is_directory" -(* BACKPORT - not in 4.x runtime (caml_sys_is_regular_file) external is_regular_file : string -> bool = "caml_sys_is_regular_file" -*) external remove: string -> unit = "caml_sys_remove" external rename : string -> string -> unit = "caml_sys_rename" external getenv: string -> string = "caml_sys_getenv" @@ -162,7 +186,7 @@ let ocaml_release = { (* Optimization *) -external opaque_identity : 'a -> 'a = "%opaque" +external[@layout_poly] opaque_identity : ('a : any). 'a -> 'a = "%opaque" module Immediate64 = struct module type Non_immediate = sig diff --git a/stdlib/sys.mli b/stdlib/sys.mli index 14c53237493..ed3fd32de64 100644 --- a/stdlib/sys.mli +++ b/stdlib/sys.mli @@ -1,4 +1,4 @@ -# 1 "sys.mli" +# 2 "sys.mli" (**************************************************************************) (* *) (* OCaml *) @@ -45,15 +45,12 @@ external is_directory : string -> bool = "caml_sys_is_directory" @since 3.10 *) -(* BACKPORT - not in 4.x runtime (caml_sys_is_regular_file) external is_regular_file : string -> bool = "caml_sys_is_regular_file" (** Returns [true] if the given name refers to a regular file, [false] if it refers to another kind of file. @raise Sys_error if no file exists with the given name. @since 5.1 *) -*) external remove : string -> unit = "caml_sys_remove" (** Remove the given file name from the file system. *) @@ -193,7 +190,7 @@ val max_string_length : int val max_array_length : int (** Maximum length of a normal array (i.e. any array whose elements are - not of type [float]). The maximum length of a [float array] + not unboxed and not of type [float]). The maximum length of a [float array] is [max_floatarray_length] if OCaml was configured with [--enable-flat-float-array] and [max_array_length] if configured with [--disable-flat-float-array]. *) @@ -203,6 +200,26 @@ val max_floatarray_length : int a [float array] when OCaml is configured with [--enable-flat-float-array]. *) +val max_unboxed_float_array_length : int +(** Maximum length of a [float# array]. + Equivalent to [max_floatarray_length]. *) + +val max_unboxed_float32_array_length : int +(** Maximum length of a [float32# array]. + In non-native backends, equal to [max_array_length]. *) + +val max_unboxed_int64_array_length : int +(** Maximum length of a [int64# array]. + In non-native backends, equal to [max_array_length]. *) + +val max_unboxed_int32_array_length : int +(** Maximum length of a [int32# array]. + In non-native backends, equal to [max_array_length]. *) + +val max_unboxed_nativeint_array_length : int +(** Maximum length of a [nativeint# array]. + In non-native backends, equal to [max_array_length]. *) + external runtime_variant : unit -> string = "caml_runtime_variant" (** Return the name of the runtime variant the program is running on. This is normally the argument given to [-runtime-variant] at compile @@ -357,6 +374,9 @@ val with_async_exns : (unit -> 'a) -> 'a causing any asynchronous [Break] or [Stack_overflow] exceptions (e.g. from finalisers, signal handlers or the GC) to be raised from the call site of [with_async_exns]. + + The asynchronous exception handler context is per-domain, not per-fiber: + delimited continuations do not capture it. *) @@ -415,7 +435,7 @@ val runtime_warnings_enabled: unit -> bool (** {1 Optimization} *) -external opaque_identity : 'a -> 'a = "%opaque" +external[@layout_poly] opaque_identity : ('a : any). 'a -> 'a = "%opaque" (** For the purposes of optimization, [opaque_identity] behaves like an unknown (and thus possibly side-effecting) function. diff --git a/stdlib/type.ml b/stdlib/type.ml index d568b3b0ab1..8840bb4f201 100644 --- a/stdlib/type.ml +++ b/stdlib/type.ml @@ -13,6 +13,8 @@ (* *) (**************************************************************************) +open! Stdlib + (* Type equality witness *) type (_, _) eq = Equal: ('a, 'a) eq diff --git a/stdlib/uchar.ml b/stdlib/uchar.ml index dc212ed04bd..4dfdc820925 100644 --- a/stdlib/uchar.ml +++ b/stdlib/uchar.ml @@ -1,4 +1,4 @@ -# 1 "uchar.ml" +# 2 "uchar.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/uchar.mli b/stdlib/uchar.mli index 16bcb94d9d9..d1640f74fbf 100644 --- a/stdlib/uchar.mli +++ b/stdlib/uchar.mli @@ -1,4 +1,4 @@ -# 1 "uchar.mli" +# 2 "uchar.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/unit.ml b/stdlib/unit.ml index f4b565134d5..b5fb6d9b933 100644 --- a/stdlib/unit.ml +++ b/stdlib/unit.ml @@ -1,4 +1,4 @@ -# 1 "unit.ml" +# 2 "unit.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/unit.mli b/stdlib/unit.mli index fafd2fc9277..a5f02c7cd60 100644 --- a/stdlib/unit.mli +++ b/stdlib/unit.mli @@ -1,4 +1,4 @@ -# 1 "unit.mli" +# 2 "unit.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/weak.ml b/stdlib/weak.ml index 5a0258fb8be..fd78347ab45 100644 --- a/stdlib/weak.ml +++ b/stdlib/weak.ml @@ -1,4 +1,4 @@ -# 1 "weak.ml" +# 2 "weak.ml" (**************************************************************************) (* *) (* OCaml *) diff --git a/stdlib/weak.mli b/stdlib/weak.mli index 1d93edf3ed4..5788caf8a71 100644 --- a/stdlib/weak.mli +++ b/stdlib/weak.mli @@ -1,4 +1,4 @@ -# 1 "weak.mli" +# 2 "weak.mli" (**************************************************************************) (* *) (* OCaml *) diff --git a/testsuite/HACKING.adoc b/testsuite/HACKING.adoc index fcdc3921760..05bc9bad71c 100644 --- a/testsuite/HACKING.adoc +++ b/testsuite/HACKING.adoc @@ -13,6 +13,13 @@ a specific sub-directory. There are many kind of tests already, so the easiest way to start is to extend or copy an existing test. +Note: in april 2023, the test scripting language has changed: the +org-mode-based syntax was replaced by at C-like syntax. ocamltest +includes options to translate from the old to the new syntax: +`-translate`, `-compact`, `-keep-lines`, `-keep-chars`. Look at +`tools/translate-all-tests` for an example using them. These options +will be removed after a transitional period. + == Sorts of tests A test is specified in a `.ml` file containing a `TEST` block which is diff --git a/testsuite/summarize.awk b/testsuite/summarize.awk index 36a8b66c12b..32f79e17bca 100644 --- a/testsuite/summarize.awk +++ b/testsuite/summarize.awk @@ -122,6 +122,14 @@ function record_unexp() { record_skip(); } +/=> predicate.*is not satisfied/ { + record_skip(); +} + +/=> predicate.*is satisfied/ { + record_pass(); +} + /=> n\/a/ { record_na(); } diff --git a/testsuite/tests/afl-instrumentation/afl-fuzz-test.ml b/testsuite/tests/afl-instrumentation/afl-fuzz-test.ml index 8547b388a3f..c33a4ea8513 100644 --- a/testsuite/tests/afl-instrumentation/afl-fuzz-test.ml +++ b/testsuite/tests/afl-instrumentation/afl-fuzz-test.ml @@ -1,12 +1,18 @@ -(* TEST (* Just a test-driver *) - * native-compiler - ** script - script = "sh ${test_source_directory}/has-afl-fuzz.sh" - readonly_files = "readline.ml" - *** setup-ocamlopt.byte-build-env - **** ocamlopt.byte - program = "${test_build_directory}/readline" - flags = "-afl-instrument" - all_modules = "readline.ml" - ***** run +(* TEST + reason = "Broken, ask mshinwell if you want to try to fix it"; + skip; *) +(* TEST + native-compiler; + script = "sh ${test_source_directory}/has-afl-fuzz.sh"; + readonly_files = "readline.ml"; + script; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/readline"; + flags = "-afl-instrument"; + all_modules = "readline.ml"; + ocamlopt.byte; + run; +*) + +(* No code here, this file is a pure test script. *) diff --git a/testsuite/tests/afl-instrumentation/afl-showmap-test.ml b/testsuite/tests/afl-instrumentation/afl-showmap-test.ml index 5efc626874a..d63739a4fc4 100644 --- a/testsuite/tests/afl-instrumentation/afl-showmap-test.ml +++ b/testsuite/tests/afl-instrumentation/afl-showmap-test.ml @@ -1,16 +1,18 @@ -(* TEST (* Just a test-driver *) - * native-compiler - ** script - script = "sh ${test_source_directory}/has-afl-showmap.sh" - readonly_files = "harness.ml test.ml" - *** setup-ocamlopt.byte-build-env - **** ocamlopt.byte - module = "test.ml" - flags = "-afl-instrument" - ***** ocamlopt.byte - module = "" - program = "${test_build_directory}/test" - flags = "-afl-inst-ratio 0" - all_modules = "test.cmx harness.ml" - ****** run +(* TEST + native-compiler; + script = "sh ${test_source_directory}/has-afl-showmap.sh"; + readonly_files = "harness.ml test.ml"; + script; + setup-ocamlopt.byte-build-env; + module = "test.ml"; + flags = "-afl-instrument"; + ocamlopt.byte; + module = ""; + program = "${test_build_directory}/test"; + flags = "-afl-inst-ratio 0"; + all_modules = "test.cmx harness.ml"; + ocamlopt.byte; + run; *) + +(* No code here, this file is a pure test script. *) diff --git a/testsuite/tests/arch-power/exn_raise.ml b/testsuite/tests/arch-power/exn_raise.ml index a68eb875edd..1ed4622f437 100644 --- a/testsuite/tests/arch-power/exn_raise.ml +++ b/testsuite/tests/arch-power/exn_raise.ml @@ -1,9 +1,9 @@ (* TEST - * arch_power - ** native - *** ocamlopt.byte - ocamlopt_flags = "-flarge-toc" - **** run + arch_power; + native; + ocamlopt_flags = "-flarge-toc"; + ocamlopt.byte; + run; *) (* GPR#8506 diff --git a/testsuite/tests/array-functions/test_iarray.ml b/testsuite/tests/array-functions/test_iarray.ml index 4b9b17c65d0..926f428fa46 100644 --- a/testsuite/tests/array-functions/test_iarray.ml +++ b/testsuite/tests/array-functions/test_iarray.ml @@ -1,7 +1,8 @@ (* TEST + include stdlib_stable; *) -module Iarray = Stdlib__Iarray +module Iarray = Stdlib_stable.Iarray external ( .:() ) : 'a iarray -> int -> 'a = "%array_safe_get" (* Copied from [test.ml], but with all the [Array.fill] tests deleted *) diff --git a/testsuite/tests/asmcomp/bind_tuples.ml b/testsuite/tests/asmcomp/bind_tuples.ml index 156b08721e9..384965b4280 100644 --- a/testsuite/tests/asmcomp/bind_tuples.ml +++ b/testsuite/tests/asmcomp/bind_tuples.ml @@ -1,5 +1,5 @@ (* TEST - * native + native; *) (* Check the effectiveness of optimized compilation of tuple binding diff --git a/testsuite/tests/asmcomp/compare.ml b/testsuite/tests/asmcomp/compare.ml index b51116e372a..1a14c4dd328 100644 --- a/testsuite/tests/asmcomp/compare.ml +++ b/testsuite/tests/asmcomp/compare.ml @@ -1,5 +1,5 @@ (* TEST - * native + native; *) let[@inline never] float () = print_string "hello\n"; 42. let[@inline never] f () = compare (float ()) 0.5;; diff --git a/testsuite/tests/asmcomp/evaluation_order.ml b/testsuite/tests/asmcomp/evaluation_order.ml index 2fb7f917ff9..f9cce72ef5b 100644 --- a/testsuite/tests/asmcomp/evaluation_order.ml +++ b/testsuite/tests/asmcomp/evaluation_order.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) external unsafe_get : 'a array -> int -> 'a = "%array_unsafe_get" external caml_bytes_get_16 : bytes -> int -> int = "%caml_bytes_get16" external caml_bytes_set_16 : bytes -> int -> int -> unit = "%caml_bytes_set16" diff --git a/testsuite/tests/asmcomp/evaluation_order_broken.ml b/testsuite/tests/asmcomp/evaluation_order_broken.ml index 5543fb0edb9..6862a8ca6df 100644 --- a/testsuite/tests/asmcomp/evaluation_order_broken.ml +++ b/testsuite/tests/asmcomp/evaluation_order_broken.ml @@ -1,5 +1,5 @@ (* TEST - * bytecode + bytecode; *) (* The following examples have different output on bytecode and native. diff --git a/testsuite/tests/asmcomp/func_sections.ml b/testsuite/tests/asmcomp/func_sections.ml index 7a58afc60c8..bdfcaf4529f 100644 --- a/testsuite/tests/asmcomp/func_sections.ml +++ b/testsuite/tests/asmcomp/func_sections.ml @@ -1,18 +1,23 @@ (* TEST -* function_sections -flags = "-S -function-sections" -** arch_arm -*** native -reference = "${test_source_directory}/func_sections.arm.reference" -** arch_arm64 -*** native -reference = "${test_source_directory}/func_sections.arm.reference" -** arch_amd64 -*** native -reference = "${test_source_directory}/func_sections.reference" -** arch_i386 -*** native -reference = "${test_source_directory}/func_sections.reference" + flags = "-S -function-sections"; + function_sections; + { + arch_arm; + reference = "${test_source_directory}/func_sections.arm.reference"; + native; + }{ + arch_arm64; + reference = "${test_source_directory}/func_sections.arm.reference"; + native; + }{ + arch_amd64; + reference = "${test_source_directory}/func_sections.reference"; + native; + }{ + arch_i386; + reference = "${test_source_directory}/func_sections.reference"; + native; + } *) (* We have a separate reference output for ARM because diff --git a/testsuite/tests/asmcomp/is_static.ml b/testsuite/tests/asmcomp/is_static.ml index b8a3bef006b..78fb16bad4c 100644 --- a/testsuite/tests/asmcomp/is_static.ml +++ b/testsuite/tests/asmcomp/is_static.ml @@ -1,7 +1,7 @@ (* TEST - modules = "is_in_static_data.c" - * naked_pointers - ** native + modules = "is_in_static_data.c"; + naked_pointers; + native; *) (* Data that should be statically allocated by the compiler (all versions) *) diff --git a/testsuite/tests/asmcomp/is_static_flambda.ml b/testsuite/tests/asmcomp/is_static_flambda.ml index 63e53cfc423..768c7ad5e2f 100644 --- a/testsuite/tests/asmcomp/is_static_flambda.ml +++ b/testsuite/tests/asmcomp/is_static_flambda.ml @@ -1,8 +1,8 @@ (* TEST - modules = "is_in_static_data.c is_static_flambda_dep.ml" - * flambda - ** naked_pointers - *** native + modules = "is_in_static_data.c is_static_flambda_dep.ml"; + flambda; + naked_pointers; + native; *) (* Data that should be statically allocated by the compiler (flambda only) *) diff --git a/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml b/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml index 8c8b017d493..7f2758ef945 100644 --- a/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml +++ b/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml @@ -1,6 +1,6 @@ (* TEST - * flambda - ** native + flambda; + native; *) type t = T of { pos : int } diff --git a/testsuite/tests/asmcomp/optargs.ml b/testsuite/tests/asmcomp/optargs.ml index 65e4152bf25..32aafd48e07 100644 --- a/testsuite/tests/asmcomp/optargs.ml +++ b/testsuite/tests/asmcomp/optargs.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-g" - * native + flags = "-g"; + native; *) (* Check the effectiveness of inlining the wrapper which fills in diff --git a/testsuite/tests/asmcomp/poll_attr_both.compilers.reference b/testsuite/tests/asmcomp/poll_attr_both.compilers.reference index f920645a179..11072d1d052 100644 --- a/testsuite/tests/asmcomp/poll_attr_both.compilers.reference +++ b/testsuite/tests/asmcomp/poll_attr_both.compilers.reference @@ -1,6 +1,6 @@ File "poll_attr_both.ml", line 1: Error: Function with poll-error attribute contains polling points: - allocation at File "poll_attr_both.ml", line 16, characters 29-37 - function call at File "poll_attr_both.ml", line 17, characters 13-16 + allocation at File "poll_attr_both.ml", line 17, characters 29-37 + function call at File "poll_attr_both.ml", line 18, characters 13-16 (plus compiler-inserted polling point(s) in prologue and/or loop back edges) diff --git a/testsuite/tests/asmcomp/poll_attr_both.ml b/testsuite/tests/asmcomp/poll_attr_both.ml index 0bef1f20463..d86363b461d 100644 --- a/testsuite/tests/asmcomp/poll_attr_both.ml +++ b/testsuite/tests/asmcomp/poll_attr_both.ml @@ -1,14 +1,14 @@ -(* TEST - * poll-insertion - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte -ocamlopt_byte_exit_status = "2" - **** check-ocamlopt.byte-output - - ** setup-ocamlopt.opt-build-env - *** ocamlopt.opt -ocamlopt_opt_exit_status = "2" - **** check-ocamlopt.opt-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + *) let[@inline never][@local never] v x = x + 1 @@ -20,3 +20,18 @@ let[@poll error] c x = ignore(Sys.opaque_identity(42)) done; x2 + !y + +(* TEST + poll-insertion; + { + setup-ocamlopt.byte-build-env; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + check-ocamlopt.byte-output; + }{ + setup-ocamlopt.opt-build-env; + ocamlopt_opt_exit_status = "2"; + ocamlopt.opt; + check-ocamlopt.opt-output; + } +*) diff --git a/testsuite/tests/asmcomp/poll_attr_inserted.ml b/testsuite/tests/asmcomp/poll_attr_inserted.ml index ea090f3e61d..9a0b434e297 100644 --- a/testsuite/tests/asmcomp/poll_attr_inserted.ml +++ b/testsuite/tests/asmcomp/poll_attr_inserted.ml @@ -1,14 +1,16 @@ (* TEST - * poll-insertion - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte -ocamlopt_byte_exit_status = "2" - **** check-ocamlopt.byte-output - - ** setup-ocamlopt.opt-build-env - *** ocamlopt.opt -ocamlopt_opt_exit_status = "2" - **** check-ocamlopt.opt-output + poll-insertion; + { + setup-ocamlopt.byte-build-env; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + check-ocamlopt.byte-output; + }{ + setup-ocamlopt.opt-build-env; + ocamlopt_opt_exit_status = "2"; + ocamlopt.opt; + check-ocamlopt.opt-output; + } *) let[@poll error] c x = diff --git a/testsuite/tests/asmcomp/poll_attr_prologue.compilers.reference b/testsuite/tests/asmcomp/poll_attr_prologue.compilers.reference index 2b4858f4248..b8fac05d786 100644 --- a/testsuite/tests/asmcomp/poll_attr_prologue.compilers.reference +++ b/testsuite/tests/asmcomp/poll_attr_prologue.compilers.reference @@ -1,5 +1,5 @@ File "poll_attr_prologue.ml", line 1: Error: Function with poll-error attribute contains polling points: - function call at File "poll_attr_prologue.ml", line 16, characters 15-38 + function call at File "poll_attr_prologue.ml", line 17, characters 15-38 (plus compiler-inserted polling point(s) in prologue and/or loop back edges) diff --git a/testsuite/tests/asmcomp/poll_attr_prologue.ml b/testsuite/tests/asmcomp/poll_attr_prologue.ml index 091c7702560..9fdbb57b6f1 100644 --- a/testsuite/tests/asmcomp/poll_attr_prologue.ml +++ b/testsuite/tests/asmcomp/poll_attr_prologue.ml @@ -1,17 +1,32 @@ -(* TEST - * poll-insertion - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte -ocamlopt_byte_exit_status = "2" - **** check-ocamlopt.byte-output - - ** setup-ocamlopt.opt-build-env - *** ocamlopt.opt -ocamlopt_opt_exit_status = "2" - **** check-ocamlopt.opt-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + *) let[@poll error] rec c x l = match l with | [] -> 0 | _ :: tl -> (c[@tailcall]) (x+1) tl + +(* TEST + poll-insertion; + { + setup-ocamlopt.byte-build-env; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + check-ocamlopt.byte-output; + }{ + setup-ocamlopt.opt-build-env; + ocamlopt_opt_exit_status = "2"; + ocamlopt.opt; + check-ocamlopt.opt-output; + } +*) diff --git a/testsuite/tests/asmcomp/poll_attr_user.compilers.reference b/testsuite/tests/asmcomp/poll_attr_user.compilers.reference index 26edc0d289e..0d4319f175d 100644 --- a/testsuite/tests/asmcomp/poll_attr_user.compilers.reference +++ b/testsuite/tests/asmcomp/poll_attr_user.compilers.reference @@ -1,6 +1,6 @@ File "poll_attr_user.ml", line 1: Error: Function with poll-error attribute contains polling points: - allocation at File "poll_attr_user.ml", line 16, characters 29-37 - function call at File "poll_attr_user.ml", line 17, characters 13-16 - allocation at File "poll_attr_user.ml", line 19, characters 34-42 + allocation at File "poll_attr_user.ml", line 17, characters 29-37 + function call at File "poll_attr_user.ml", line 18, characters 13-16 + allocation at File "poll_attr_user.ml", line 20, characters 34-42 diff --git a/testsuite/tests/asmcomp/poll_attr_user.ml b/testsuite/tests/asmcomp/poll_attr_user.ml index b48709a51a6..331cdf81c3b 100644 --- a/testsuite/tests/asmcomp/poll_attr_user.ml +++ b/testsuite/tests/asmcomp/poll_attr_user.ml @@ -1,14 +1,14 @@ -(* TEST - * poll-insertion - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte -ocamlopt_byte_exit_status = "2" - **** check-ocamlopt.byte-output - - ** setup-ocamlopt.opt-build-env - *** ocamlopt.opt -ocamlopt_opt_exit_status = "2" - **** check-ocamlopt.opt-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + *) let[@inline never][@local never] v x = x + 1 @@ -20,3 +20,18 @@ let[@poll error] c x = ignore(Sys.opaque_identity(ref 42)) done; x2 + !y + +(* TEST + poll-insertion; + { + setup-ocamlopt.byte-build-env; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + check-ocamlopt.byte-output; + }{ + setup-ocamlopt.opt-build-env; + ocamlopt_opt_exit_status = "2"; + ocamlopt.opt; + check-ocamlopt.opt-output; + } +*) diff --git a/testsuite/tests/asmcomp/polling.c b/testsuite/tests/asmcomp/polling.c index f38b66c1596..a69affc0f45 100644 --- a/testsuite/tests/asmcomp/polling.c +++ b/testsuite/tests/asmcomp/polling.c @@ -3,7 +3,7 @@ #include #include #include -#if 0 /* BACKPORT */ +#if CAML_RUNTIME_5 #include #include #endif @@ -22,8 +22,9 @@ CAMLprim value request_minor_gc(value v) { } CAMLprim value minor_gcs(value v) { -#if 0 /* BACKPORT */ +#if CAML_RUNTIME_5 return Val_long(atomic_load(&caml_minor_collections_count)); -#endif +#else return Val_long(Caml_state->stat_minor_collections); +#endif } diff --git a/testsuite/tests/asmcomp/polling_insertion.ml b/testsuite/tests/asmcomp/polling_insertion.ml index 1c658a2cac4..6ebb7e1daf6 100644 --- a/testsuite/tests/asmcomp/polling_insertion.ml +++ b/testsuite/tests/asmcomp/polling_insertion.ml @@ -1,9 +1,9 @@ (* TEST - modules = "polling.c" - compare_programs = "false" - * poll-insertion - ** arch64 - *** native + modules = "polling.c"; + compare_programs = "false"; + poll-insertion; + arch64; + native; *) (* This set of tests examine poll insertion behaviour. We do this by requesting diff --git a/testsuite/tests/asmcomp/prevent_fma.ml b/testsuite/tests/asmcomp/prevent_fma.ml index 6ce124fce0a..79506c9c888 100644 --- a/testsuite/tests/asmcomp/prevent_fma.ml +++ b/testsuite/tests/asmcomp/prevent_fma.ml @@ -1,5 +1,5 @@ (* TEST - * native + native; *) let ( *. ) x y = Sys.opaque_identity (x *. y) diff --git a/testsuite/tests/asmcomp/register_typing.ml b/testsuite/tests/asmcomp/register_typing.ml index 3bf3104f202..424aa16ab32 100644 --- a/testsuite/tests/asmcomp/register_typing.ml +++ b/testsuite/tests/asmcomp/register_typing.ml @@ -1,5 +1,5 @@ (* TEST - * native + native; *) type 'a typ = Int : int typ | Ptr : int list typ diff --git a/testsuite/tests/asmcomp/register_typing_switch.ml b/testsuite/tests/asmcomp/register_typing_switch.ml index 73960c4bcc1..f6a3367d7b8 100644 --- a/testsuite/tests/asmcomp/register_typing_switch.ml +++ b/testsuite/tests/asmcomp/register_typing_switch.ml @@ -1,5 +1,5 @@ (* TEST - * native + native; *) type 'a typ = Int : int typ | Ptr : int list typ | Int2 : int typ diff --git a/testsuite/tests/asmcomp/static_float_array_flambda.ml b/testsuite/tests/asmcomp/static_float_array_flambda.ml index 824a12ca89d..3314db1c5e6 100644 --- a/testsuite/tests/asmcomp/static_float_array_flambda.ml +++ b/testsuite/tests/asmcomp/static_float_array_flambda.ml @@ -1,9 +1,9 @@ (* TEST - modules = "is_in_static_data.c simple_float_const.ml" - * flambda - ** flat-float-array - *** naked_pointers - **** native + modules = "is_in_static_data.c simple_float_const.ml"; + flambda; + flat-float-array; + naked_pointers; + native; *) external is_in_static_data : 'a -> bool = "caml_is_in_static_data" diff --git a/testsuite/tests/asmcomp/static_float_array_flambda_opaque.ml b/testsuite/tests/asmcomp/static_float_array_flambda_opaque.ml index 56ea9e17936..33dad7cfe3a 100644 --- a/testsuite/tests/asmcomp/static_float_array_flambda_opaque.ml +++ b/testsuite/tests/asmcomp/static_float_array_flambda_opaque.ml @@ -1,10 +1,10 @@ (* TEST - modules = "is_in_static_data.c simple_float_const_opaque.ml" - flags = "-opaque" - * flambda - ** flat-float-array - *** naked_pointers - **** native + modules = "is_in_static_data.c simple_float_const_opaque.ml"; + flags = "-opaque"; + flambda; + flat-float-array; + naked_pointers; + native; *) external is_in_static_data : 'a -> bool = "caml_is_in_static_data" diff --git a/testsuite/tests/asmcomp/staticalloc.ml b/testsuite/tests/asmcomp/staticalloc.ml index 8f241847f8d..38d5587f0f5 100644 --- a/testsuite/tests/asmcomp/staticalloc.ml +++ b/testsuite/tests/asmcomp/staticalloc.ml @@ -1,7 +1,7 @@ (* TEST - include config - * native - flags = "config.cmx" + include config; + flags = "config.cmx"; + native; *) (* Check the effectiveness of structured constant propagation and diff --git a/testsuite/tests/asmcomp/unrolling_flambda.ml b/testsuite/tests/asmcomp/unrolling_flambda.ml index dcfcb033033..c7c47b33832 100644 --- a/testsuite/tests/asmcomp/unrolling_flambda.ml +++ b/testsuite/tests/asmcomp/unrolling_flambda.ml @@ -1,6 +1,6 @@ (* TEST - * flambda - ** native + flambda; + native; *) let rec f x = diff --git a/testsuite/tests/asmcomp/unrolling_flambda2.ml b/testsuite/tests/asmcomp/unrolling_flambda2.ml index 3079b7327ed..70843c69eca 100644 --- a/testsuite/tests/asmcomp/unrolling_flambda2.ml +++ b/testsuite/tests/asmcomp/unrolling_flambda2.ml @@ -1,6 +1,6 @@ (* TEST - * flambda - ** native + flambda; + native; *) type t = { fn : t -> t -> int -> unit -> unit } diff --git a/testsuite/tests/asmgen/arith.cmm b/testsuite/tests/asmgen/arith.cmm index 3ba0fd333a6..464bd96c1ce 100644 --- a/testsuite/tests/asmgen/arith.cmm +++ b/testsuite/tests/asmgen/arith.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "mainarith.c" -arguments = "mainarith.c" -* asmgen + readonly_files = "mainarith.c"; + arguments = "mainarith.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/catch-float.cmm b/testsuite/tests/asmgen/catch-float.cmm index c51eb3c37ab..e679a0e2912 100644 --- a/testsuite/tests/asmgen/catch-float.cmm +++ b/testsuite/tests/asmgen/catch-float.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DFLOAT_CATCH -DFUN=catch_float main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DFLOAT_CATCH -DFUN=catch_float main.c"; + asmgen; *) (function "catch_float" (b:int) diff --git a/testsuite/tests/asmgen/catch-multiple.cmm b/testsuite/tests/asmgen/catch-multiple.cmm index 3887c5b8910..498235ad721 100644 --- a/testsuite/tests/asmgen/catch-multiple.cmm +++ b/testsuite/tests/asmgen/catch-multiple.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=catch_multiple main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=catch_multiple main.c"; + asmgen; *) (* diff --git a/testsuite/tests/asmgen/catch-rec-deadhandler.cmm b/testsuite/tests/asmgen/catch-rec-deadhandler.cmm index 143f880ebcd..0eea037a633 100644 --- a/testsuite/tests/asmgen/catch-rec-deadhandler.cmm +++ b/testsuite/tests/asmgen/catch-rec-deadhandler.cmm @@ -1,10 +1,10 @@ (* TEST -flags = "-dlive" -readonly_files = "main.c" -arguments = "-DUNIT_INT -DFUN=catch_rec_deadhandler main.c" -* asmgen -** run -*** check-program-output + flags = "-dlive"; + readonly_files = "main.c"; + arguments = "-DUNIT_INT -DFUN=catch_rec_deadhandler main.c"; + asmgen; + run; + check-program-output; *) (function "catch_rec_deadhandler" () diff --git a/testsuite/tests/asmgen/catch-rec.cmm b/testsuite/tests/asmgen/catch-rec.cmm index 51089d32509..37288f8dab5 100644 --- a/testsuite/tests/asmgen/catch-rec.cmm +++ b/testsuite/tests/asmgen/catch-rec.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=catch_fact main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=catch_fact main.c"; + asmgen; *) (function "catch_fact" (b:int) diff --git a/testsuite/tests/asmgen/catch-try-float.cmm b/testsuite/tests/asmgen/catch-try-float.cmm index 31df3d3ac59..7aa72343958 100644 --- a/testsuite/tests/asmgen/catch-try-float.cmm +++ b/testsuite/tests/asmgen/catch-try-float.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DFLOAT_CATCH -DFUN=catch_try_float main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DFLOAT_CATCH -DFUN=catch_try_float main.c"; + asmgen; *) (function "catch_try_float" (b:float) diff --git a/testsuite/tests/asmgen/catch-try.cmm b/testsuite/tests/asmgen/catch-try.cmm index 280a9e17cdc..b5253843ed2 100644 --- a/testsuite/tests/asmgen/catch-try.cmm +++ b/testsuite/tests/asmgen/catch-try.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=catch_exit main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=catch_exit main.c"; + asmgen; *) (function "catch_exit" (b:int) diff --git a/testsuite/tests/asmgen/checkbound.cmm b/testsuite/tests/asmgen/checkbound.cmm index 616c1edc777..a2607b49d2a 100644 --- a/testsuite/tests/asmgen/checkbound.cmm +++ b/testsuite/tests/asmgen/checkbound.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DCHECKBOUND main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DCHECKBOUND main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/even-odd-spill-float.cmm b/testsuite/tests/asmgen/even-odd-spill-float.cmm index dc8169b462d..a907b71fc27 100644 --- a/testsuite/tests/asmgen/even-odd-spill-float.cmm +++ b/testsuite/tests/asmgen/even-odd-spill-float.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_FLOAT -DFUN=is_even main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_FLOAT -DFUN=is_even main.c"; + asmgen; *) ("format_odd": string "odd %d\n\000") diff --git a/testsuite/tests/asmgen/even-odd-spill.cmm b/testsuite/tests/asmgen/even-odd-spill.cmm index 9e392445ce3..7d3a8040b53 100644 --- a/testsuite/tests/asmgen/even-odd-spill.cmm +++ b/testsuite/tests/asmgen/even-odd-spill.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=is_even main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=is_even main.c"; + asmgen; *) ("format_odd": string "odd %d\n\000") diff --git a/testsuite/tests/asmgen/even-odd.cmm b/testsuite/tests/asmgen/even-odd.cmm index a9e20ad8945..51431017015 100644 --- a/testsuite/tests/asmgen/even-odd.cmm +++ b/testsuite/tests/asmgen/even-odd.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=is_even main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=is_even main.c"; + asmgen; *) (function "is_even" (b:int) diff --git a/testsuite/tests/asmgen/fib.cmm b/testsuite/tests/asmgen/fib.cmm index b5a0b5673ea..6399a6c6cdf 100644 --- a/testsuite/tests/asmgen/fib.cmm +++ b/testsuite/tests/asmgen/fib.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=fib main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=fib main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/immediates.cmm b/testsuite/tests/asmgen/immediates.cmm index f61de1ae1e8..023b195408a 100644 --- a/testsuite/tests/asmgen/immediates.cmm +++ b/testsuite/tests/asmgen/immediates.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "mainimmed.c" -arguments = "-I ${test_source_directory} mainimmed.c" -* asmgen + readonly_files = "mainimmed.c"; + arguments = "-I ${test_source_directory} mainimmed.c"; + asmgen; *) (* Regenerate with cpp -P immediates.cmmpp > immediates.cmm *) (function "testimm" () diff --git a/testsuite/tests/asmgen/integr.cmm b/testsuite/tests/asmgen/integr.cmm index 92d1cb07360..4ebee453fa9 100644 --- a/testsuite/tests/asmgen/integr.cmm +++ b/testsuite/tests/asmgen/integr.cmm @@ -1,9 +1,9 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_FLOAT -DFUN=test main.c" -* skip -reason = "This test is currently broken" -** asmgen + readonly_files = "main.c"; + arguments = "-DINT_FLOAT -DFUN=test main.c"; + reason = "This test is currently broken"; + skip; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/invariants.cmm b/testsuite/tests/asmgen/invariants.cmm index 6e93a46e69b..8409ade0cb6 100644 --- a/testsuite/tests/asmgen/invariants.cmm +++ b/testsuite/tests/asmgen/invariants.cmm @@ -1,8 +1,8 @@ (* TEST -* native-compiler -** setup-simple-build-env -*** codegen -codegen_exit_status = "2" + native-compiler; + setup-simple-build-env; + codegen_exit_status = "2"; + codegen; *) (* diff --git a/testsuite/tests/asmgen/pgcd.cmm b/testsuite/tests/asmgen/pgcd.cmm index 74e3c423953..1c669f1f3ca 100644 --- a/testsuite/tests/asmgen/pgcd.cmm +++ b/testsuite/tests/asmgen/pgcd.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=pgcd_30030 main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=pgcd_30030 main.c"; + asmgen; *) (function "pgcd_30030" (a:int) diff --git a/testsuite/tests/asmgen/quicksort.cmm b/testsuite/tests/asmgen/quicksort.cmm index 58029cd16de..b5cb49fb0f0 100644 --- a/testsuite/tests/asmgen/quicksort.cmm +++ b/testsuite/tests/asmgen/quicksort.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DSORT -DFUN=quicksort main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DSORT -DFUN=quicksort main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/quicksort2.cmm b/testsuite/tests/asmgen/quicksort2.cmm index 5c07a7cf5b3..7f0c3cd3a0e 100644 --- a/testsuite/tests/asmgen/quicksort2.cmm +++ b/testsuite/tests/asmgen/quicksort2.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DSORT -DFUN=quicksort main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DSORT -DFUN=quicksort main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/soli.cmm b/testsuite/tests/asmgen/soli.cmm index 568765116ba..fccecc0a7fb 100644 --- a/testsuite/tests/asmgen/soli.cmm +++ b/testsuite/tests/asmgen/soli.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DUNIT_INT -DFUN=solitaire main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DUNIT_INT -DFUN=solitaire main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/tagged-fib.cmm b/testsuite/tests/asmgen/tagged-fib.cmm index a2da4487b69..7ff1255d489 100644 --- a/testsuite/tests/asmgen/tagged-fib.cmm +++ b/testsuite/tests/asmgen/tagged-fib.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_INT -DFUN=fib main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_INT -DFUN=fib main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/tagged-integr.cmm b/testsuite/tests/asmgen/tagged-integr.cmm index 453e73543ad..7a3cb2e98ea 100644 --- a/testsuite/tests/asmgen/tagged-integr.cmm +++ b/testsuite/tests/asmgen/tagged-integr.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DINT_FLOAT -DFUN=test main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DINT_FLOAT -DFUN=test main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/tagged-quicksort.cmm b/testsuite/tests/asmgen/tagged-quicksort.cmm index 8ba8e74497b..401856b9636 100644 --- a/testsuite/tests/asmgen/tagged-quicksort.cmm +++ b/testsuite/tests/asmgen/tagged-quicksort.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DSORT -DFUN=quicksort main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DSORT -DFUN=quicksort main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/tagged-tak.cmm b/testsuite/tests/asmgen/tagged-tak.cmm index 8bb28a0ee02..0a79f660eb5 100644 --- a/testsuite/tests/asmgen/tagged-tak.cmm +++ b/testsuite/tests/asmgen/tagged-tak.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DUNIT_INT -DFUN=takmain main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DUNIT_INT -DFUN=takmain main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/asmgen/tak.cmm b/testsuite/tests/asmgen/tak.cmm index 3e8430b5c32..0d7220885ed 100644 --- a/testsuite/tests/asmgen/tak.cmm +++ b/testsuite/tests/asmgen/tak.cmm @@ -1,7 +1,7 @@ (* TEST -readonly_files = "main.c" -arguments = "-DUNIT_INT -DFUN=takmain main.c" -* asmgen + readonly_files = "main.c"; + arguments = "-DUNIT_INT -DFUN=takmain main.c"; + asmgen; *) (**************************************************************************) diff --git a/testsuite/tests/ast-invariants/test.ml b/testsuite/tests/ast-invariants/test.ml index ab0cd7f7363..dfe1af49831 100644 --- a/testsuite/tests/ast-invariants/test.ml +++ b/testsuite/tests/ast-invariants/test.ml @@ -1,9 +1,9 @@ (* TEST - include ocamlcommon - * hasunix - include unix - arguments = "${ocamlsrcdir}" - ** native + include ocamlcommon; + include unix; + arguments = "${ocamlsrcdir}"; + hasunix; + native; *) (* This test checks all ml files in the ocaml repository that are accepted @@ -85,5 +85,6 @@ let rec walk dir = (Sys.readdir dir) let () = - Language_extension.enable_maximal (); + Language_extension.set_universe_and_enable_all + Language_extension.Universe.maximal; walk root diff --git a/testsuite/tests/async-exns/async_exns_1.ml b/testsuite/tests/async-exns/async_exns_1.ml index 5bc0388c193..bc6fa67eade 100644 --- a/testsuite/tests/async-exns/async_exns_1.ml +++ b/testsuite/tests/async-exns/async_exns_1.ml @@ -1,5 +1,5 @@ (* TEST - modules = "async_exns_stubs.c" + modules = "async_exns_stubs.c"; *) let () = Sys.catch_break true @@ -16,23 +16,32 @@ let[@inline never] allocate_bytes finished = (* Ensure that an async exn raised from a finaliser skips an exception handler, placed around the point where the GC was invoked, instead arriving - at an outer [Sys.with_async_exns] point. *) + at an outer [Sys.with_async_exns] point. + + Furthermore, such asynchronous exception having been caught, make sure + that a normal exception raise works properly. +*) +exception Ok let () = - let finished = ref false in - let r = allocate_bytes finished in try - Sys.with_async_exns (fun () -> - try - r := None; - while true do - (* This allocation will eventually trigger the finaliser *) - let _ = Sys.opaque_identity (42, Random.int 42) in - () - done - with exn -> Printf.printf "1. wrong handler\n%!"; assert false - ) + let finished = ref false in + let r = allocate_bytes finished in + try + Sys.with_async_exns (fun () -> + try + r := None; + while true do + (* This allocation will eventually trigger the finaliser *) + let _ = Sys.opaque_identity (42, Random.int 42) in + () + done + with exn -> Printf.printf "1. wrong handler\n%!"; assert false + ) + with + | Sys.Break -> assert !finished; raise Ok + | _ -> assert false with - | Sys.Break -> assert !finished; Printf.printf "1. OK\n%!" + | Ok -> Printf.printf "1. OK\n%!" | _ -> assert false (* Ensure that [Sys.Break] can be raised and caught as a normal exception. *) @@ -56,7 +65,7 @@ let raise_break_from_finaliser () = let _ = Sys.opaque_identity (42, Random.int 42) in () done - with exn -> Printf.printf "3a. wrong handler\n%!"; exit 1 + with exn -> Printf.printf "3a/b/c/d. wrong handler\n%!"; exit 1 external test_caml_callback_exn_collects_async_exns : (unit -> unit) -> unit = "test_caml_callback_exn_collects_async_exns" @@ -134,7 +143,7 @@ let () = ) with | Sys.Break -> Printf.printf "4a. OK\n%!" - | _ -> assert false + | e -> Printf.eprintf "WRONG: %s" (Printexc.to_string e); assert false (* Same but for a 2-parameter callback *) diff --git a/testsuite/tests/backtrace-multifiles/main.ml b/testsuite/tests/backtrace-multifiles/main.ml index b3e13df2e46..9d7a4cff419 100644 --- a/testsuite/tests/backtrace-multifiles/main.ml +++ b/testsuite/tests/backtrace-multifiles/main.ml @@ -20,63 +20,62 @@ let () = call. *) (* TEST - - readonly_files ="foo.ml" - - * setup-ocamlopt.opt-build-env - compiler_directory_suffix = ".O3" - ** ocamlopt.opt - module = "foo.ml" - flags = "-g -O3" - *** ocamlopt.opt - module = "main.ml" - flags = "-g -O3" - **** ocamlopt.opt - module = "" - all_modules = "foo.cmx main.cmx" - ***** run - ****** check-program-output - - * setup-ocamlopt.opt-build-env - compiler_directory_suffix = ".Oclassic" - ** ocamlopt.opt - module = "foo.ml" - flags = "-g -Oclassic" - *** ocamlopt.opt - module = "main.ml" - flags = "-g -Oclassic" - **** ocamlopt.opt - module = "" - all_modules = "foo.cmx main.cmx" - ***** run - ****** check-program-output - - * setup-ocamlopt.opt-build-env - compiler_directory_suffix = ".O3-Oclassic" - ** ocamlopt.opt - module = "foo.ml" - flags = "-g -O3" - *** ocamlopt.opt - module = "main.ml" - flags = "-g -Oclassic" - **** ocamlopt.opt - module = "" - all_modules = "foo.cmx main.cmx" - ***** run - ****** check-program-output - - * setup-ocamlopt.opt-build-env - compiler_directory_suffix = ".Oclassic-O3" - ** ocamlopt.opt - module = "foo.ml" - flags = "-g -Oclassic" - *** ocamlopt.opt - module = "main.ml" - flags = "-g -O3" - **** ocamlopt.opt - module = "" - all_modules = "foo.cmx main.cmx" - ***** run - ****** check-program-output - + readonly_files = "foo.ml"; + { + compiler_directory_suffix = ".O3"; + setup-ocamlopt.opt-build-env; + module = "foo.ml"; + flags = "-g -O3"; + ocamlopt.opt; + module = "main.ml"; + flags = "-g -O3"; + ocamlopt.opt; + module = ""; + all_modules = "foo.cmx main.cmx"; + ocamlopt.opt; + run; + check-program-output; + }{ + compiler_directory_suffix = ".Oclassic"; + setup-ocamlopt.opt-build-env; + module = "foo.ml"; + flags = "-g -Oclassic"; + ocamlopt.opt; + module = "main.ml"; + flags = "-g -Oclassic"; + ocamlopt.opt; + module = ""; + all_modules = "foo.cmx main.cmx"; + ocamlopt.opt; + run; + check-program-output; + }{ + compiler_directory_suffix = ".O3-Oclassic"; + setup-ocamlopt.opt-build-env; + module = "foo.ml"; + flags = "-g -O3"; + ocamlopt.opt; + module = "main.ml"; + flags = "-g -Oclassic"; + ocamlopt.opt; + module = ""; + all_modules = "foo.cmx main.cmx"; + ocamlopt.opt; + run; + check-program-output; + }{ + compiler_directory_suffix = ".Oclassic-O3"; + setup-ocamlopt.opt-build-env; + module = "foo.ml"; + flags = "-g -Oclassic"; + ocamlopt.opt; + module = "main.ml"; + flags = "-g -O3"; + ocamlopt.opt; + module = ""; + all_modules = "foo.cmx main.cmx"; + ocamlopt.opt; + run; + check-program-output; + } *) diff --git a/testsuite/tests/backtrace/backtrace.ml b/testsuite/tests/backtrace/backtrace.ml index 5f41e8631ad..598d69d0ad4 100644 --- a/testsuite/tests/backtrace/backtrace.ml +++ b/testsuite/tests/backtrace/backtrace.ml @@ -21,6 +21,6 @@ let _ = ignore (g Sys.argv.(1)) (* TEST - flags = "-g" - ocamlrunparam += ",b=1" + flags = "-g"; + ocamlrunparam += ",b=1"; *) diff --git a/testsuite/tests/backtrace/backtrace2.ml b/testsuite/tests/backtrace/backtrace2.ml index 6395de1d177..8e3bb062916 100644 --- a/testsuite/tests/backtrace/backtrace2.ml +++ b/testsuite/tests/backtrace/backtrace2.ml @@ -1,8 +1,8 @@ -(* TEST - * skip - reason = "Backtraces are broken by the use of reraise" - flags = "-g" - ocamlrunparam += ",b=1" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) (* A test for stack backtraces *) @@ -78,3 +78,10 @@ let _ = run test_lazy [| () |]; run test_lazy [| () |]; () + +(* TEST + reason = "Backtraces are broken by the use of reraise"; + flags = "-g"; + ocamlrunparam += ",b=1"; + skip; +*) diff --git a/testsuite/tests/backtrace/backtrace2.reference b/testsuite/tests/backtrace/backtrace2.reference index 30a3be84b66..aece04fdc85 100644 --- a/testsuite/tests/backtrace/backtrace2.reference +++ b/testsuite/tests/backtrace/backtrace2.reference @@ -66,8 +66,8 @@ Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, character Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, characters 43-52 Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, characters 43-52 Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, characters 43-52 -Called from CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 49, characters 17-27 -Re-raised at CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 56, characters 4-11 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. Called from Backtrace2.run in file "backtrace2.ml", line 62, characters 11-23 Uncaught exception Not_found Raised at Backtrace2.test_Not_found.aux in file "backtrace2.ml", line 36, characters 18-33 @@ -89,12 +89,12 @@ Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, character Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, characters 43-52 Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, characters 43-52 Called from Backtrace2.test_lazy.aux in file "backtrace2.ml", line 47, characters 43-52 -Called from CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 37, characters 17-27 -Re-raised at CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 42, characters 4-11 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. Called from Backtrace2.run in file "backtrace2.ml", line 62, characters 11-23 Re-raised at Stdlib__Hashtbl.find in file "hashtbl.ml", line 542, characters 13-28 Called from Backtrace2.test_lazy.exception_raised_internally in file "backtrace2.ml", line 50, characters 8-41 -Re-raised at CamlinternalLazy.force_lazy_block.(fun) in file "camlinternalLazy.ml", line 54, characters 56-63 -Called from CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 49, characters 17-27 -Re-raised at CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 56, characters 4-11 +Re-raised at CamlinternalLazy. +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. Called from Backtrace2.run in file "backtrace2.ml", line 62, characters 11-23 diff --git a/testsuite/tests/backtrace/backtrace3.ml b/testsuite/tests/backtrace/backtrace3.ml index c91f0a030d5..3a41f2cfa5d 100644 --- a/testsuite/tests/backtrace/backtrace3.ml +++ b/testsuite/tests/backtrace/backtrace3.ml @@ -1,6 +1,6 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) (* A test for stack backtraces *) @@ -61,3 +61,8 @@ let _ = run [| "g" |]; run [| "h" |]; run [| |] + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; +*) diff --git a/testsuite/tests/backtrace/backtrace_bounds_exn.ml b/testsuite/tests/backtrace/backtrace_bounds_exn.ml index 5eb0975388b..1c08933f964 100644 --- a/testsuite/tests/backtrace/backtrace_bounds_exn.ml +++ b/testsuite/tests/backtrace/backtrace_bounds_exn.ml @@ -1,6 +1,6 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) (* #11436: bad backtrace for out-of-bounds exception *) @@ -18,3 +18,8 @@ let _ = Printexc.print_backtrace stdout; print_endline "OK" + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; +*) diff --git a/testsuite/tests/backtrace/backtrace_bounds_exn.reference b/testsuite/tests/backtrace/backtrace_bounds_exn.reference index 1705e3f8279..e082c43df40 100644 --- a/testsuite/tests/backtrace/backtrace_bounds_exn.reference +++ b/testsuite/tests/backtrace/backtrace_bounds_exn.reference @@ -1,4 +1,4 @@ Uncaught exception Invalid_argument("index out of bounds") -Raised by primitive operation at Backtrace_bounds_exn.bad_bound_fn in file "backtrace_bounds_exn.ml", line 11, characters 7-15 +Raised at Backtrace_bounds_exn.bad_bound_fn in file "backtrace_bounds_exn.ml", line 11, characters 7-15 Called from Backtrace_bounds_exn in file "backtrace_bounds_exn.ml", line 15, characters 32-54 OK diff --git a/testsuite/tests/backtrace/backtrace_bounds_exn.run b/testsuite/tests/backtrace/backtrace_bounds_exn.run new file mode 100755 index 00000000000..ecfe43c9739 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace_bounds_exn.run @@ -0,0 +1,3 @@ +#!/bin/sh +(${program} 2>&1 || true) 2>&1 | \ + ${test_source_directory}/sanitize-backtrace.sh > ${output} diff --git a/testsuite/tests/backtrace/backtrace_c_exn.byte.reference b/testsuite/tests/backtrace/backtrace_c_exn.byte4.reference similarity index 66% rename from testsuite/tests/backtrace/backtrace_c_exn.byte.reference rename to testsuite/tests/backtrace/backtrace_c_exn.byte4.reference index f7ba194576a..a17b0e1b52c 100644 --- a/testsuite/tests/backtrace/backtrace_c_exn.byte.reference +++ b/testsuite/tests/backtrace/backtrace_c_exn.byte4.reference @@ -1,2 +1,2 @@ Failure("exn") -Raised by primitive operation at Backtrace_c_exn in file "backtrace_c_exn.ml", line 20, characters 4-20 +Raised by primitive operation at Backtrace_c_exn in file "backtrace_c_exn.ml", line 28, characters 4-20 diff --git a/testsuite/tests/backtrace/backtrace_c_exn.ml b/testsuite/tests/backtrace/backtrace_c_exn.ml index 0fc274d16c4..368dd788f51 100644 --- a/testsuite/tests/backtrace/backtrace_c_exn.ml +++ b/testsuite/tests/backtrace/backtrace_c_exn.ml @@ -1,17 +1,25 @@ -(* TEST - modules = "backtrace_c_exn_.c" - flags = "-g" - ocamlrunparam += ",b=1" - * bytecode - reference = "${test_source_directory}/backtrace_c_exn.byte.reference" - * native - reference = "${test_source_directory}/backtrace_c_exn.opt.reference" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + +*) + +(* CR mshinwell: it isn't clear to me why the 5 reference output here + is not worse. It seems to have lost the stack frames on the C side. + (The reference file does match upstream 5.) *) (* https://github.com/ocaml-multicore/ocaml-multicore/issues/498 *) external stubbed_raise : unit -> unit = "caml_498_raise" -let raise_exn () = failwith "exn" +let raise_exn () = (failwith [@inlined never]) "exn" [@@inline never] let () = Callback.register "test_raise_exn" raise_exn @@ -22,3 +30,28 @@ let () = | exn -> Printexc.to_string exn |> print_endline; Printexc.print_backtrace stdout + +(* TEST + modules = "backtrace_c_exn_.c"; + flags = "-g"; + ocamlrunparam += ",b=1"; + { + runtime4; + { + reference = "${test_source_directory}/backtrace_c_exn.byte4.reference"; + bytecode; + }{ + reference = "${test_source_directory}/backtrace_c_exn.opt4.reference"; + native; + } + }{ + runtime5; + { + reference = "${test_source_directory}/backtrace_c_exn.r5.reference"; + bytecode; + }{ + reference = "${test_source_directory}/backtrace_c_exn.r5.reference"; + native; + } + } +*) diff --git a/testsuite/tests/backtrace/backtrace_c_exn.opt.reference b/testsuite/tests/backtrace/backtrace_c_exn.opt4.reference similarity index 59% rename from testsuite/tests/backtrace/backtrace_c_exn.opt.reference rename to testsuite/tests/backtrace/backtrace_c_exn.opt4.reference index f4ec6135684..5d144d202c2 100644 --- a/testsuite/tests/backtrace/backtrace_c_exn.opt.reference +++ b/testsuite/tests/backtrace/backtrace_c_exn.opt4.reference @@ -1,4 +1,4 @@ Failure("exn") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 -Called from Backtrace_c_exn in file "backtrace_c_exn.ml", line 20, characters 4-20 -Called from Backtrace_c_exn in file "backtrace_c_exn.ml", line 20, characters 4-20 +Raised at Stdlib.failwith in file "stdlib.ml", line 35, characters 17-33 +Called from Backtrace_c_exn in file "backtrace_c_exn.ml", line 28, characters 4-20 +Called from Backtrace_c_exn in file "backtrace_c_exn.ml", line 28, characters 4-20 diff --git a/testsuite/tests/backtrace/backtrace_c_exn.r5.reference b/testsuite/tests/backtrace/backtrace_c_exn.r5.reference new file mode 100644 index 00000000000..a17b0e1b52c --- /dev/null +++ b/testsuite/tests/backtrace/backtrace_c_exn.r5.reference @@ -0,0 +1,2 @@ +Failure("exn") +Raised by primitive operation at Backtrace_c_exn in file "backtrace_c_exn.ml", line 28, characters 4-20 diff --git a/testsuite/tests/backtrace/backtrace_deprecated.ml b/testsuite/tests/backtrace/backtrace_deprecated.ml index 41b3c4be6be..750446a64b8 100644 --- a/testsuite/tests/backtrace/backtrace_deprecated.ml +++ b/testsuite/tests/backtrace/backtrace_deprecated.ml @@ -1,6 +1,6 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) (* A test for stack backtraces *) @@ -40,3 +40,8 @@ let _ = run [| "c" |]; run [| "d" |]; run [| |] + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; +*) diff --git a/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference b/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference deleted file mode 100644 index 075aedb459f..00000000000 --- a/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference +++ /dev/null @@ -1,24 +0,0 @@ -Raised by primitive operation at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 6, characters 13-38 -Called from Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 89, characters 12-29 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink.Native.run in file "otherlibs/dynlink/native/dynlink.ml", line 88, characters 4-273 -Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 372, characters 13-56 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 359, characters 8-392 -Called from Dynlink_common.Make.loadfile in file "otherlibs/dynlink/dynlink_common.ml" (inlined), line 374, characters 26-45 -Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 -execution of module initializers in the shared library failed: Failure("SUCCESS") -Raised at Stdlib.failwith in file "stdlib.ml", line 29, characters 17-33 -Called from Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 3, characters 4-22 -Re-raised at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 8, characters 5-12 -Called from Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 89, characters 12-29 -Called from Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 89, characters 12-29 -Re-raised at Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 91, characters 10-149 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink.Native.run in file "otherlibs/dynlink/native/dynlink.ml", line 88, characters 4-273 -Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 372, characters 13-56 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 359, characters 8-392 -Re-raised at Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 372, characters 8-17 -Called from Dynlink_common.Make.loadfile in file "otherlibs/dynlink/dynlink_common.ml" (inlined), line 374, characters 26-45 -Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 diff --git a/testsuite/tests/backtrace/backtrace_dynlink.ml b/testsuite/tests/backtrace/backtrace_dynlink.ml index 3252f53f67e..5688d992e08 100644 --- a/testsuite/tests/backtrace/backtrace_dynlink.ml +++ b/testsuite/tests/backtrace/backtrace_dynlink.ml @@ -1,46 +1,79 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + + + + + + + + + + + -include dynlink - -readonly_files = "backtrace_dynlink_plugin.ml" - -libraries = "" - -* shared-libraries -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "backtrace_dynlink.ml" -flags = "-g" -**** ocamlopt.byte -program = "backtrace_dynlink_plugin.cmxs" -flags = "-shared -g" -all_modules = "backtrace_dynlink_plugin.ml" -**** ocamlopt.byte -program = "${test_build_directory}/main.exe" -libraries = "dynlink" -all_modules = "backtrace_dynlink.cmx" -***** run -ocamlrunparam += ",b=1" -****** no-flambda -******* check-program-output -****** flambda -reference = "${test_source_directory}/backtrace_dynlink.flambda.reference" -******* check-program-output *) (* test for backtrace and stack unwinding with dynlink. *) (* https://github.com/ocaml-multicore/ocaml-multicore/issues/440 *) (* https://github.com/ocaml-multicore/ocaml-multicore/pull/499 *) -let () = + +[@@@ocaml.warning "-52"] + +let () = Dynlink.allow_unsafe_modules true; try - Dynlink.loadfile "backtrace_dynlink_plugin.cmxs" + (Dynlink.loadfile [@inlined never]) "backtrace_dynlink_plugin.cmxs" with - | Dynlink.Error err -> - print_endline @@ Dynlink.error_message err; - Printexc.print_backtrace stdout; + | Dynlink.Error ((Library's_module_initializers_failed ( + Failure "SUCCESS")) as err) -> + print_endline (Dynlink.error_message err); + let bt = Printexc.get_backtrace () in + let bt_list = String.split_on_char '\n' bt in + if List.length bt_list > 5 then print_endline "Backtrace sufficiently long" + else ( + print_endline "Failure: Backtrace too short:"; + print_string bt + ) | exn -> - Printexc.to_string exn |> print_endline; - print_endline "ERROR" + Printexc.to_string exn |> print_endline; + print_endline "ERROR" + +(* TEST + include dynlink; + readonly_files = "backtrace_dynlink_plugin.ml"; + libraries = ""; + shared-libraries; + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "backtrace_dynlink.ml"; + flags = "-g"; + ocamlopt.byte; + }{ + program = "backtrace_dynlink_plugin.cmxs"; + flags = "-shared -g"; + all_modules = "backtrace_dynlink_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/main.exe"; + libraries = "dynlink"; + all_modules = "backtrace_dynlink.cmx"; + ocamlopt.byte; + ocamlrunparam += ",b=1"; + run; + check-program-output; + } +*) diff --git a/testsuite/tests/backtrace/backtrace_dynlink.reference b/testsuite/tests/backtrace/backtrace_dynlink.reference index 77ef4566772..dd5114331af 100644 --- a/testsuite/tests/backtrace/backtrace_dynlink.reference +++ b/testsuite/tests/backtrace/backtrace_dynlink.reference @@ -1,20 +1,3 @@ -Raised by primitive operation at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 6, characters 13-38 -Called from Dynlink.Native.ndl_run in file "otherlibs/dynlink/dynlink.ml", line 292, characters 8-25 -Called from Stdlib__List.iter in file "list.ml", line 116, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 367, characters 13-72 -Called from Stdlib__List.iter in file "list.ml", line 116, characters 12-15 -Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 363, characters 8-408 -Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 +Backtrace sufficiently long (in plugin) execution of module initializers in the shared library failed: Failure("SUCCESS") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 -Called from Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 3, characters 4-22 -Re-raised at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 8, characters 5-12 -Called from Dynlink.Native.ndl_run in file "otherlibs/dynlink/dynlink.ml", line 292, characters 8-25 -Called from Dynlink.Native.ndl_run in file "otherlibs/dynlink/dynlink.ml", line 292, characters 8-25 -Re-raised at Dynlink.Native.ndl_run in file "otherlibs/dynlink/dynlink.ml", line 304, characters 6-137 -Called from Stdlib__List.iter in file "list.ml", line 116, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 367, characters 13-72 -Called from Stdlib__List.iter in file "list.ml", line 116, characters 12-15 -Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 363, characters 8-408 -Re-raised at Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 376, characters 8-17 -Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 +Backtrace sufficiently long diff --git a/testsuite/tests/backtrace/backtrace_dynlink_plugin.ml b/testsuite/tests/backtrace/backtrace_dynlink_plugin.ml index 86a36a020b2..d0ad9a011ca 100644 --- a/testsuite/tests/backtrace/backtrace_dynlink_plugin.ml +++ b/testsuite/tests/backtrace/backtrace_dynlink_plugin.ml @@ -3,6 +3,15 @@ let () = failwith "SUCCESS" with | e -> - let c = Printexc.get_callstack 10 in - Printexc.print_raw_backtrace stdout c; - raise e + let c = Printexc.get_callstack 10 in + let bt = Printexc.raw_backtrace_to_string c in + let bt_list = String.split_on_char '\n' bt in + if List.length bt_list > 5 then ( + print_endline "Backtrace sufficiently long (in plugin)"; + raise e + ) + else ( + print_endline "Failure: Backtrace too short (in plugin):"; + print_string bt; + raise e + ) diff --git a/testsuite/tests/backtrace/backtrace_effects.ml b/testsuite/tests/backtrace/backtrace_effects.ml index 04a4513a427..2060628fe38 100644 --- a/testsuite/tests/backtrace/backtrace_effects.ml +++ b/testsuite/tests/backtrace/backtrace_effects.ml @@ -1,9 +1,9 @@ -(* TEST - * skip +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + - flags = "-g" - ocamlrunparam += ",b=1" - exit_status = "2" *) open Effect @@ -41,3 +41,10 @@ let baz () = | _ -> None } let _ = baz () + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + exit_status = "2"; + skip; +*) diff --git a/testsuite/tests/backtrace/backtrace_effects_nested.ml b/testsuite/tests/backtrace/backtrace_effects_nested.ml index 29d2c9be70e..be0e4ba944a 100644 --- a/testsuite/tests/backtrace/backtrace_effects_nested.ml +++ b/testsuite/tests/backtrace/backtrace_effects_nested.ml @@ -1,15 +1,15 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + -flags = "-g" -* skip - reason = "OCaml 5 only" -** bytecode -** no-flambda -*** native -** flambda -reference = "${test_source_directory}/backtrace_effects_nested.flambda.reference" -*** native *) @@ -46,3 +46,19 @@ let f () = | _ -> None } let () = f () + +(* TEST + flags = "-g"; + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + { + bytecode; + }{ + no-flambda; + native; + }{ + reference = "${test_source_directory}/backtrace_effects_nested.flambda.reference"; + flambda; + native; + } +*) diff --git a/testsuite/tests/backtrace/backtrace_or_exception.ml b/testsuite/tests/backtrace/backtrace_or_exception.ml index dc8f53c0772..908413413c4 100644 --- a/testsuite/tests/backtrace/backtrace_or_exception.ml +++ b/testsuite/tests/backtrace/backtrace_or_exception.ml @@ -1,6 +1,10 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + *) exception Exn @@ -46,3 +50,15 @@ let _ = run without_reraise; run with_reraise; run trickier + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + { + reference = "${test_source_directory}/backtrace_or_exception.reference"; + bytecode; + }{ + reference = "${test_source_directory}/backtrace_or_exception.opt.reference"; + native; + } +*) diff --git a/testsuite/tests/backtrace/backtrace_or_exception.opt.reference b/testsuite/tests/backtrace/backtrace_or_exception.opt.reference new file mode 100644 index 00000000000..44f1b0e72e1 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace_or_exception.opt.reference @@ -0,0 +1,17 @@ +exception Backtrace_or_exception.Exn +Raised at Backtrace_or_exception.without_reraise in file "backtrace_or_exception.ml", line 23, characters 4-13 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 +--------------------------- +exception Backtrace_or_exception.Exn +Raised at Backtrace_or_exception.without_reraise in file "backtrace_or_exception.ml", line 23, characters 4-13 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 +Re-raised at Backtrace_or_exception.return_exn in file "backtrace_or_exception.ml", line 14, characters 4-13 +Called from Backtrace_or_exception.return_exn in file "backtrace_or_exception.ml" (inlined), line 12, characters 15-101 +Called from Backtrace_or_exception.with_reraise in file "backtrace_or_exception.ml", line 27, characters 8-44 +Re-raised at Backtrace_or_exception.with_reraise in file "backtrace_or_exception.ml", line 30, characters 4-13 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 +--------------------------- +exception Backtrace_or_exception.Exn +Raised at Backtrace_or_exception.trickier in file "backtrace_or_exception.ml", line 39, characters 6-15 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 +--------------------------- diff --git a/testsuite/tests/backtrace/backtrace_or_exception.reference b/testsuite/tests/backtrace/backtrace_or_exception.reference index 352f48904b9..c6f2e769ba6 100644 --- a/testsuite/tests/backtrace/backtrace_or_exception.reference +++ b/testsuite/tests/backtrace/backtrace_or_exception.reference @@ -1,16 +1,16 @@ exception Backtrace_or_exception.Exn -Raised at Backtrace_or_exception.without_reraise in file "backtrace_or_exception.ml", line 19, characters 4-13 -Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 39, characters 6-10 +Raised at Backtrace_or_exception.without_reraise in file "backtrace_or_exception.ml", line 23, characters 4-13 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 --------------------------- exception Backtrace_or_exception.Exn -Raised at Backtrace_or_exception.without_reraise in file "backtrace_or_exception.ml", line 19, characters 4-13 -Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 39, characters 6-10 -Re-raised at Backtrace_or_exception.return_exn in file "backtrace_or_exception.ml", line 10, characters 4-13 -Called from Backtrace_or_exception.with_reraise in file "backtrace_or_exception.ml", line 23, characters 8-44 -Re-raised at Backtrace_or_exception.with_reraise in file "backtrace_or_exception.ml", line 26, characters 4-13 -Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 39, characters 6-10 +Raised at Backtrace_or_exception.without_reraise in file "backtrace_or_exception.ml", line 23, characters 4-13 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 +Re-raised at Backtrace_or_exception.return_exn in file "backtrace_or_exception.ml", line 14, characters 4-13 +Called from Backtrace_or_exception.with_reraise in file "backtrace_or_exception.ml", line 27, characters 8-44 +Re-raised at Backtrace_or_exception.with_reraise in file "backtrace_or_exception.ml", line 30, characters 4-13 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 --------------------------- exception Backtrace_or_exception.Exn -Raised at Backtrace_or_exception.trickier in file "backtrace_or_exception.ml", line 35, characters 6-15 -Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 39, characters 6-10 +Raised at Backtrace_or_exception.trickier in file "backtrace_or_exception.ml", line 39, characters 6-15 +Called from Backtrace_or_exception.run in file "backtrace_or_exception.ml", line 43, characters 6-10 --------------------------- diff --git a/testsuite/tests/backtrace/backtrace_slots.ml b/testsuite/tests/backtrace/backtrace_slots.ml index d6b95a0d4ee..22e3e9a13ca 100644 --- a/testsuite/tests/backtrace/backtrace_slots.ml +++ b/testsuite/tests/backtrace/backtrace_slots.ml @@ -1,6 +1,6 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) (* A test for stack backtraces *) @@ -62,3 +62,8 @@ let _ = run [| "c" |]; run [| "d" |]; run [| |] + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; +*) diff --git a/testsuite/tests/backtrace/backtrace_systhreads.ml b/testsuite/tests/backtrace/backtrace_systhreads.ml index d22ce3a9355..8805e981fd6 100644 --- a/testsuite/tests/backtrace/backtrace_systhreads.ml +++ b/testsuite/tests/backtrace/backtrace_systhreads.ml @@ -1,15 +1,15 @@ -(* TEST -flags = "-g" -ocamlrunparam += ",b=1" -* hassysthreads -include systhreads -** bytecode -** native +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + *) -let throw_exn msg = failwith msg [@@inline never] +let throw_exn msg = (failwith [@inlined never]) msg [@@inline never] -let thread_func delay = +let[@inline never] thread_func delay = Thread.yield (); try throw_exn (string_of_int delay) with | exn -> @@ -17,7 +17,7 @@ let thread_func delay = Gc.minor (); raise exn -let thread_backtrace (cond, mut) = +let[@inline never] thread_backtrace (cond, mut) = Thread.yield (); try throw_exn "backtrace" with | exn -> @@ -38,3 +38,15 @@ let () = List.iter Thread.join threads; Condition.signal cond; Thread.join backtrace_thread + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } +*) diff --git a/testsuite/tests/backtrace/backtrace_systhreads.reference b/testsuite/tests/backtrace/backtrace_systhreads.reference index 57d7b72f024..facdbecad46 100644 --- a/testsuite/tests/backtrace/backtrace_systhreads.reference +++ b/testsuite/tests/backtrace/backtrace_systhreads.reference @@ -1,25 +1,25 @@ Thread 2 killed on uncaught exception Failure("0") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 +Raised at Stdlib.failwith in file "stdlib.ml", line 35, characters 17-33 Called from Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 14, characters 6-37 Re-raised at Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 18, characters 5-14 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 Thread 3 killed on uncaught exception Failure("1") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 +Raised at Stdlib.failwith in file "stdlib.ml", line 35, characters 17-33 Called from Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 14, characters 6-37 Re-raised at Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 18, characters 5-14 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 Thread 4 killed on uncaught exception Failure("2") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 +Raised at Stdlib.failwith in file "stdlib.ml", line 35, characters 17-33 Called from Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 14, characters 6-37 Re-raised at Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 18, characters 5-14 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 Thread 5 killed on uncaught exception Failure("3") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 +Raised at Stdlib.failwith in file "stdlib.ml", line 35, characters 17-33 Called from Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 14, characters 6-37 Re-raised at Backtrace_systhreads.thread_func in file "backtrace_systhreads.ml", line 18, characters 5-14 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 Thread 1 killed on uncaught exception Failure("backtrace") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 +Raised at Stdlib.failwith in file "stdlib.ml", line 35, characters 17-33 Called from Backtrace_systhreads.thread_backtrace in file "backtrace_systhreads.ml", line 22, characters 6-27 Re-raised at Backtrace_systhreads.thread_backtrace in file "backtrace_systhreads.ml", line 26, characters 5-14 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 diff --git a/testsuite/tests/backtrace/backtraces_and_finalizers.ml b/testsuite/tests/backtrace/backtraces_and_finalizers.ml index 60c02f48eab..a204b9affc9 100644 --- a/testsuite/tests/backtrace/backtraces_and_finalizers.ml +++ b/testsuite/tests/backtrace/backtraces_and_finalizers.ml @@ -1,7 +1,7 @@ (* TEST - flags = "-g -inline 0" - ocamlrunparam += ",b=1" - * native + flags = "-g -inline 0"; + ocamlrunparam += ",b=1"; + native; *) let finaliser _ = try raise Exit with _ -> () diff --git a/testsuite/tests/backtrace/callstack.ml b/testsuite/tests/backtrace/callstack.ml index 5c33816e06f..4c115351e19 100644 --- a/testsuite/tests/backtrace/callstack.ml +++ b/testsuite/tests/backtrace/callstack.ml @@ -1,10 +1,10 @@ -(* TEST - flags = "-g" - * hassysthreads - include systhreads - ** no-flambda - *** native - *** bytecode +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + *) let[@inline never] f0 () = @@ -29,3 +29,15 @@ let () = the callstack, which breaks the test. *) let () = Printf.printf "new thread:\n" let () = Thread.join (Thread.create f3 ()) + +(* TEST + flags = "-g"; + include systhreads; + hassysthreads; + no-flambda; + { + native; + }{ + bytecode; + } +*) diff --git a/testsuite/tests/backtrace/event_after_prim.ml b/testsuite/tests/backtrace/event_after_prim.ml index 6af09a5fa48..f8f54c4f405 100644 --- a/testsuite/tests/backtrace/event_after_prim.ml +++ b/testsuite/tests/backtrace/event_after_prim.ml @@ -1,5 +1,5 @@ -(* TEST - flags = "-g" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) let f n b = @@ -12,3 +12,7 @@ let () = | _ -> assert false | exception _ -> Printexc.print_backtrace stdout + +(* TEST + flags = "-g"; +*) diff --git a/testsuite/tests/backtrace/inline_test.ml b/testsuite/tests/backtrace/inline_test.ml index 32f4acf4920..fa4ee44e23d 100644 --- a/testsuite/tests/backtrace/inline_test.ml +++ b/testsuite/tests/backtrace/inline_test.ml @@ -1,14 +1,14 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" - * bytecode - * native - * native - ocamlopt_flags = "-O3" - compiler_directory_suffix = ".O3" - * native - ocamlopt_flags = "-Oclassic" - compiler_directory_suffix = ".Oclassic" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + *) (* A test for inlined stack backtraces *) @@ -27,3 +27,21 @@ let i x = let () = i () + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + { + bytecode; + }{ + native; + }{ + ocamlopt_flags = "-O3"; + compiler_directory_suffix = ".O3"; + native; + }{ + ocamlopt_flags = "-Oclassic"; + compiler_directory_suffix = ".Oclassic"; + native; + } +*) diff --git a/testsuite/tests/backtrace/inline_traversal_test.ml b/testsuite/tests/backtrace/inline_traversal_test.ml index cf67562092d..ae0358eb5b6 100644 --- a/testsuite/tests/backtrace/inline_traversal_test.ml +++ b/testsuite/tests/backtrace/inline_traversal_test.ml @@ -1,14 +1,14 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" - * bytecode - * native - * native - ocamlopt_flags = "-O3" - compiler_directory_suffix = ".O3" - * native - ocamlopt_flags = "-Oclassic" - compiler_directory_suffix = ".Oclassic" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + *) (* A test for inlined stack backtraces *) @@ -55,3 +55,21 @@ let () = Printf.printf "Frame %d\n" i; print_slots (Some slot) done + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + { + bytecode; + }{ + native; + }{ + ocamlopt_flags = "-O3"; + compiler_directory_suffix = ".O3"; + native; + }{ + ocamlopt_flags = "-Oclassic"; + compiler_directory_suffix = ".Oclassic"; + native; + } +*) diff --git a/testsuite/tests/backtrace/lazy.flambda.reference b/testsuite/tests/backtrace/lazy.flambda.reference index e7711d88047..261a7fe123c 100644 --- a/testsuite/tests/backtrace/lazy.flambda.reference +++ b/testsuite/tests/backtrace/lazy.flambda.reference @@ -1,12 +1,17 @@ Uncaught exception Not_found Raised at Lazy.l1 in file "lazy.ml", line 3, characters 28-45 -Called from CamlinternalLazy.do_force_block in file "camlinternalLazy.ml", line 49, characters 17-27 -Re-raised at CamlinternalLazy.do_force_block in file "camlinternalLazy.ml", line 56, characters 4-11 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. Called from Lazy.test1 in file "lazy.ml", line 6, characters 11-24 Called from Lazy.run in file "lazy.ml", line 15, characters 4-11 Uncaught exception Not_found -Raised at Lazy.l2 in file "lazy.ml", line 8, characters 28-45 -Called from CamlinternalLazy.do_force_block in file "camlinternalLazy.ml", line 49, characters 17-27 -Re-raised at CamlinternalLazy.do_force_block in file "camlinternalLazy.ml", line 56, characters 4-11 +Raised at Lazy.l1 in file "lazy.ml", line 3, characters 28-45 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. +Called from Lazy.test1 in file "lazy.ml", line 6, characters 11-24 +Called from Lazy.run in file "lazy.ml", line 15, characters 4-11 +Re-raised at Lazy.l2 in file "lazy.ml", line 8, characters 28-45 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. Called from Lazy.test2 in file "lazy.ml", line 11, characters 6-15 Called from Lazy.run in file "lazy.ml", line 15, characters 4-11 diff --git a/testsuite/tests/backtrace/lazy.ml b/testsuite/tests/backtrace/lazy.ml index c6a0626b42e..362539a9f78 100644 --- a/testsuite/tests/backtrace/lazy.ml +++ b/testsuite/tests/backtrace/lazy.ml @@ -24,12 +24,13 @@ let () = (* TEST - -flags = "-g" -* no-flambda -** native -* flambda -reference = "${test_source_directory}/lazy.flambda.reference" -** native - + flags = "-g"; + { + no-flambda; + native; + }{ + reference = "${test_source_directory}/lazy.flambda.reference"; + flambda; + native; + } *) diff --git a/testsuite/tests/backtrace/lazy.reference b/testsuite/tests/backtrace/lazy.reference index 31c18daa32c..65c84530bd2 100644 --- a/testsuite/tests/backtrace/lazy.reference +++ b/testsuite/tests/backtrace/lazy.reference @@ -1,17 +1,20 @@ Uncaught exception Not_found Raised at Lazy.l1 in file "lazy.ml", line 3, characters 28-45 -Called from CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 125, characters 17-27 -Re-raised at CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 130, characters 4-11 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. +Called from CamlinternalLazy. Called from Lazy.test1 in file "lazy.ml", line 6, characters 11-24 Called from Lazy.run in file "lazy.ml", line 15, characters 4-11 Uncaught exception Not_found Raised at Lazy.l1 in file "lazy.ml", line 3, characters 28-45 -Called from CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 125, characters 17-27 -Re-raised at CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 130, characters 4-11 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. +Called from CamlinternalLazy. Called from Lazy.test1 in file "lazy.ml", line 6, characters 11-24 Called from Lazy.run in file "lazy.ml", line 15, characters 4-11 Re-raised at Lazy.l2 in file "lazy.ml", line 8, characters 28-45 -Called from CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 125, characters 17-27 -Re-raised at CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 130, characters 4-11 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. +Called from CamlinternalLazy. Called from Lazy.test2 in file "lazy.ml", line 11, characters 6-15 Called from Lazy.run in file "lazy.ml", line 15, characters 4-11 diff --git a/testsuite/tests/backtrace/lazy.run b/testsuite/tests/backtrace/lazy.run new file mode 100755 index 00000000000..ecfe43c9739 --- /dev/null +++ b/testsuite/tests/backtrace/lazy.run @@ -0,0 +1,3 @@ +#!/bin/sh +(${program} 2>&1 || true) 2>&1 | \ + ${test_source_directory}/sanitize-backtrace.sh > ${output} diff --git a/testsuite/tests/backtrace/methods.ml b/testsuite/tests/backtrace/methods.ml index f016fb51c92..7a449c4a279 100644 --- a/testsuite/tests/backtrace/methods.ml +++ b/testsuite/tests/backtrace/methods.ml @@ -1,5 +1,5 @@ -(* TEST - flags = "-g" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) let[@inline never] id x = Sys.opaque_identity x @@ -26,3 +26,7 @@ let () = | _ -> assert false | exception Exit -> Printexc.print_backtrace stdout + +(* TEST + flags = "-g"; +*) diff --git a/testsuite/tests/backtrace/names.ml b/testsuite/tests/backtrace/names.ml index 2b44f66830b..d8d271d24f1 100644 --- a/testsuite/tests/backtrace/names.ml +++ b/testsuite/tests/backtrace/names.ml @@ -1,7 +1,7 @@ -(* TEST - flags = "-g" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) - *) +*) let id x = Sys.opaque_identity x @@ -78,6 +78,13 @@ end let[@inline never] (+@+) n f = f 42 + 1 +(* [nested] shows up in the backtrace as [nested.(fun)] because + it creates an inner lambda. In contrast, [flat]'s arity is syntactically + 2 and does not create an inner lambda. +*) +let[@inline never] flat = fun x f -> f x + 1 +let[@inline never] nested x = fun[@inline never] f -> f x + 1 + class klass = object (self) val other = new klass2 "asdf" method meth f : int = @@ -122,6 +129,8 @@ let () = Inst.fn @@ fun _ -> Rec1.fn @@ fun _ -> 42 +@+ fun _ -> + flat 7 @@ fun _ -> + nested 5 @@ fun _ -> (new klass)#meth @@ fun _ -> inline_object @@ fun _ -> lazy_ @@ fun _ -> @@ -131,3 +140,7 @@ let () = | _ -> assert false | exception Exit -> Printexc.print_backtrace stdout + +(* TEST + flags = "-g"; +*) diff --git a/testsuite/tests/backtrace/names.reference b/testsuite/tests/backtrace/names.reference index 999503a807f..d7d6001546d 100644 --- a/testsuite/tests/backtrace/names.reference +++ b/testsuite/tests/backtrace/names.reference @@ -1,13 +1,15 @@ Raised at Names.bang in file "names.ml", line 9, characters 29-39 -Called from Names.nontailcall in file "names.ml", line 106, characters 2-6 -Called from Names.lazy_ in file "names.ml", line 101, characters 41-45 -Called from CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 125, characters 17-27 -Re-raised at CamlinternalLazy.force_lazy_block in file "camlinternalLazy.ml", line 130, characters 4-11 -Called from Names.inline_object.object#othermeth in file "names.ml", line 96, characters 6-10 -Called from Names.inline_object.object#meth in file "names.ml", line 94, characters 6-26 -Called from Names.klass2#othermeth.(fun) in file "names.ml", line 88, characters 18-22 -Called from Names.klass2#othermeth in file "names.ml", line 88, characters 4-30 -Called from Names.klass#meth in file "names.ml", line 84, characters 4-27 +Called from Names.nontailcall in file "names.ml", line 113, characters 2-6 +Called from Names.lazy_ in file "names.ml", line 108, characters 41-45 +Called from CamlinternalLazy. +Re-raised at CamlinternalLazy. +Called from Names.inline_object.object#othermeth in file "names.ml", line 103, characters 6-10 +Called from Names.inline_object.object#meth in file "names.ml", line 101, characters 6-26 +Called from Names.klass2#othermeth.(fun) in file "names.ml", line 95, characters 18-22 +Called from Names.klass2#othermeth in file "names.ml", line 95, characters 4-30 +Called from Names.klass#meth in file "names.ml", line 91, characters 4-27 +Called from Names.nested.(fun) in file "names.ml", line 86, characters 54-57 +Called from Names.flat in file "names.ml", line 85, characters 37-40 Called from Names.(+@+) in file "names.ml", line 79, characters 31-35 Called from Names.Rec2.fn in file "names.ml", line 76, characters 28-32 Called from Names.Rec1.fn in file "names.ml", line 71, characters 28-34 @@ -27,4 +29,4 @@ Called from Names.Mod1.Nested.apply in file "names.ml", line 21, characters 33-3 Called from Names.fn_poly in file "names.ml", line 17, characters 2-5 Called from Names.fn_function in file "names.ml", line 14, characters 9-13 Called from Names.fn_multi in file "names.ml", line 11, characters 36-40 -Called from Names in file "names.ml", line 111, characters 4-495 +Called from Names in file "names.ml", line 118, characters 4-543 diff --git a/testsuite/tests/backtrace/names.run b/testsuite/tests/backtrace/names.run new file mode 100755 index 00000000000..ecfe43c9739 --- /dev/null +++ b/testsuite/tests/backtrace/names.run @@ -0,0 +1,3 @@ +#!/bin/sh +(${program} 2>&1 || true) 2>&1 | \ + ${test_source_directory}/sanitize-backtrace.sh > ${output} diff --git a/testsuite/tests/backtrace/names_partial_application.ml b/testsuite/tests/backtrace/names_partial_application.ml index 04bd13e06c2..c9f8191dc57 100644 --- a/testsuite/tests/backtrace/names_partial_application.ml +++ b/testsuite/tests/backtrace/names_partial_application.ml @@ -1,10 +1,10 @@ -(* TEST - flags = "-g" - * bytecode - reference = "${test_source_directory}/names_partial_application.byte.reference" - * native - reference = "${test_source_directory}/names_partial_application.opt.reference" - *) +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + +*) let[@inline never] bang () = raise Exit @@ -23,3 +23,14 @@ let () = | _ -> assert false | exception Exit -> Printexc.print_backtrace stdout + +(* TEST + flags = "-g"; + { + reference = "${test_source_directory}/names_partial_application.byte.reference"; + bytecode; + }{ + reference = "${test_source_directory}/names_partial_application.opt.reference"; + native; + } +*) diff --git a/testsuite/tests/backtrace/pr2195-locs.byte.reference b/testsuite/tests/backtrace/pr2195-locs.byte.reference index 9047f135034..fa29f669f2c 100644 --- a/testsuite/tests/backtrace/pr2195-locs.byte.reference +++ b/testsuite/tests/backtrace/pr2195-locs.byte.reference @@ -1,4 +1,4 @@ Fatal error: exception Stdlib.Exit -Raised at Stdlib.open_in_gen in file "stdlib.ml", line 410, characters 28-54 +Raised at Stdlib.open_in_gen in file "stdlib.ml", line 411, characters 28-54 Called from Pr2195 in file "pr2195.ml", line 24, characters 6-19 Re-raised at Pr2195 in file "pr2195.ml", line 29, characters 4-41 diff --git a/testsuite/tests/backtrace/pr2195.ml b/testsuite/tests/backtrace/pr2195.ml index e0442a34051..e45ea55d90c 100644 --- a/testsuite/tests/backtrace/pr2195.ml +++ b/testsuite/tests/backtrace/pr2195.ml @@ -1,18 +1,18 @@ -(* TEST - flags += "-g" - exit_status = "2" - * bytecode - ocamlrunparam += ",b=0" - reference = "${test_source_directory}/pr2195-nolocs.byte.reference" - * bytecode - ocamlrunparam += ",b=1" - reference = "${test_source_directory}/pr2195-nolocs.byte.reference" - * bytecode - ocamlrunparam += ",b=2" - reference = "${test_source_directory}/pr2195-locs.byte.reference" - * native - reference = "${test_source_directory}/pr2195.opt.reference" - compare_programs = "false" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + + *) let () = @@ -27,3 +27,25 @@ let () = (* The message is platform-specific, so convert the exception to Exit *) let bt = Printexc.get_raw_backtrace () in Printexc.raise_with_backtrace Exit bt + +(* TEST + flags += "-g"; + exit_status = "2"; + { + ocamlrunparam += ",b=0"; + reference = "${test_source_directory}/pr2195-nolocs.byte.reference"; + bytecode; + }{ + ocamlrunparam += ",b=1"; + reference = "${test_source_directory}/pr2195-nolocs.byte.reference"; + bytecode; + }{ + ocamlrunparam += ",b=2"; + reference = "${test_source_directory}/pr2195-locs.byte.reference"; + bytecode; + }{ + reference = "${test_source_directory}/pr2195.opt.reference"; + compare_programs = "false"; + native; + } +*) diff --git a/testsuite/tests/backtrace/pr2195.opt.reference b/testsuite/tests/backtrace/pr2195.opt.reference index 05a04f5cfd7..00bcece3e27 100644 --- a/testsuite/tests/backtrace/pr2195.opt.reference +++ b/testsuite/tests/backtrace/pr2195.opt.reference @@ -1,5 +1,5 @@ Fatal error: exception Stdlib.Exit -Raised at Stdlib.open_in_gen in file "stdlib.ml", line 410, characters 28-54 -Called from Stdlib.open_in in file "stdlib.ml", line 415, characters 2-45 +Raised at Stdlib.open_in_gen in file "stdlib.ml", line 411, characters 28-54 +Called from Stdlib.open_in in file "stdlib.ml", line 416, characters 2-45 Called from Pr2195 in file "pr2195.ml", line 24, characters 6-19 Re-raised at Pr2195 in file "pr2195.ml", line 29, characters 4-41 diff --git a/testsuite/tests/backtrace/pr6920_why_at.ml b/testsuite/tests/backtrace/pr6920_why_at.ml index 1a0583a62f2..3c1e0f57dc1 100644 --- a/testsuite/tests/backtrace/pr6920_why_at.ml +++ b/testsuite/tests/backtrace/pr6920_why_at.ml @@ -1,11 +1,11 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" - ocamlopt_flags = "-inline 0" - exit_status = "2" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) -let why : unit -> unit = fun () -> raise Exit [@@inline never] +let why : unit -> unit = fun () -> raise Exit [@@opaque] let f () = why @@ (); ignore (3 + 2); @@ -13,3 +13,10 @@ let f () = let () = f () + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + ocamlopt_flags = "-inline 0"; + exit_status = "2"; +*) diff --git a/testsuite/tests/backtrace/pr6920_why_swallow.ml b/testsuite/tests/backtrace/pr6920_why_swallow.ml index b1e5d60f162..2234b84b031 100644 --- a/testsuite/tests/backtrace/pr6920_why_swallow.ml +++ b/testsuite/tests/backtrace/pr6920_why_swallow.ml @@ -1,11 +1,11 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" - ocamlopt_flags = "-inline 0" - exit_status = "2" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) -let why : unit -> unit = fun () -> raise Exit [@@inline never] +let why : unit -> unit = fun () -> raise Exit [@@opaque] let f () = for i = 1 to 10 do why @@ (); @@ -15,3 +15,10 @@ let f () = let () = f () + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + ocamlopt_flags = "-inline 0"; + exit_status = "2"; +*) diff --git a/testsuite/tests/backtrace/raw_backtrace.ml b/testsuite/tests/backtrace/raw_backtrace.ml index a685133a7bf..44d9ce5b3a1 100644 --- a/testsuite/tests/backtrace/raw_backtrace.ml +++ b/testsuite/tests/backtrace/raw_backtrace.ml @@ -1,6 +1,6 @@ -(* TEST - flags = "-g" - ocamlrunparam += ",b=1" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) (* A test for stack backtraces *) @@ -60,3 +60,8 @@ let _ = run [| "e" |]; run [| "f" |]; run [| |] + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; +*) diff --git a/testsuite/tests/backtrace/sanitize-backtrace.sh b/testsuite/tests/backtrace/sanitize-backtrace.sh index 0a08a3af365..16522303946 100755 --- a/testsuite/tests/backtrace/sanitize-backtrace.sh +++ b/testsuite/tests/backtrace/sanitize-backtrace.sh @@ -6,4 +6,7 @@ # - remove "by primitive operations" because flambda2 handles # array primitives a bit differently and thus does not emit # this "by primitive operation" for e.g. array accesses -sed -e 's/ (inlined)//' -e 's/ by primitive operation//' +# In addition to the above it now irons out some runtime4/5 differences. +sed -e 's/ (inlined)//' -e 's/ by primitive operation//' \ + -e 's/CamlinternalLazy.force_lazy_block.*/CamlinternalLazy./' \ + -e 's/CamlinternalLazy.do_force_block.*/CamlinternalLazy./' diff --git a/testsuite/tests/badly-ordered-deps/main.ml b/testsuite/tests/badly-ordered-deps/main.ml index ff4d1c90a14..ba6c6cfb97c 100644 --- a/testsuite/tests/badly-ordered-deps/main.ml +++ b/testsuite/tests/badly-ordered-deps/main.ml @@ -1,26 +1,19 @@ (* TEST + modules = "lib.ml"; + setup-ocamlc.byte-build-env; + all_modules = "main.ml"; + compile_only = "true"; + ocamlc.byte; + all_modules = "lib.ml"; + ocamlc.byte; + all_modules = "lib.cmo main.cmo"; + compile_only = "false"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) -(* Make sure ocamlc prints badly ordeered dependencies only once. +(* Make sure ocamlc prints badly ordered dependencies only once. See issue #12074. We test with ocamlc.byte only. *) -modules = "lib.ml" - -* setup-ocamlc.byte-build-env - -** ocamlc.byte -all_modules = "main.ml" -compile_only = "true" - -*** ocamlc.byte -all_modules = "lib.ml" - -**** ocamlc.byte -all_modules = "lib.cmo main.cmo" -compile_only = "false" -ocamlc_byte_exit_status = "2" - -***** check-ocamlc.byte-output - -*) - let value = () diff --git a/testsuite/tests/basic-io-2/io.ml b/testsuite/tests/basic-io-2/io.ml index 016ac1549b2..75117f0e955 100644 --- a/testsuite/tests/basic-io-2/io.ml +++ b/testsuite/tests/basic-io-2/io.ml @@ -1,6 +1,6 @@ (* TEST - arguments = "io.ml" - readonly_files = "test-file-short-lines" + arguments = "io.ml"; + readonly_files = "test-file-short-lines"; *) (* Test a file copy function *) diff --git a/testsuite/tests/basic-io/wc.ml b/testsuite/tests/basic-io/wc.ml index 33e7911597b..9e88d54c406 100644 --- a/testsuite/tests/basic-io/wc.ml +++ b/testsuite/tests/basic-io/wc.ml @@ -1,5 +1,5 @@ (* TEST - arguments = "wc.ml" + arguments = "wc.ml"; *) (* Counts characters, lines and words in one or several files. *) diff --git a/testsuite/tests/basic-manyargs/manyargs.ml b/testsuite/tests/basic-manyargs/manyargs.ml index 53d3a595923..21f5776d808 100644 --- a/testsuite/tests/basic-manyargs/manyargs.ml +++ b/testsuite/tests/basic-manyargs/manyargs.ml @@ -1,5 +1,5 @@ (* TEST - modules = "manyargsprim.c" + modules = "manyargsprim.c"; *) let manyargs a b c d e f g h i j k l m n o = diff --git a/testsuite/tests/basic-modules/anonymous.ml b/testsuite/tests/basic-modules/anonymous.ml index 20e67cca17b..5c6affca9e3 100644 --- a/testsuite/tests/basic-modules/anonymous.ml +++ b/testsuite/tests/basic-modules/anonymous.ml @@ -1,19 +1,19 @@ -(* TEST -flags = "-c -nostdlib -nopervasives -dlambda -dno-unique-ids" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output -compiler_reference = "${test_source_directory}/anonymous.ocamlc.reference" - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -*** no-flambda -**** check-ocamlopt.byte-output -compiler_reference = "${test_source_directory}/anonymous.ocamlopt.reference" -*** flambda -**** check-ocamlc.byte-output -compiler_reference = - "${test_source_directory}/anonymous.ocamlopt.flambda.reference" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + + + *) module _ = struct @@ -53,3 +53,25 @@ end let drop _ = () let () = drop s.cell + +(* TEST + flags = "-c -nostdlib -nopervasives -dlambda -dno-unique-ids"; + { + setup-ocamlc.byte-build-env; + ocamlc.byte; + compiler_reference = "${test_source_directory}/anonymous.ocamlc.reference"; + check-ocamlc.byte-output; + }{ + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + { + no-flambda; + compiler_reference = "${test_source_directory}/anonymous.ocamlopt.reference"; + check-ocamlopt.byte-output; + }{ + flambda; + compiler_reference = "${test_source_directory}/anonymous.ocamlopt.flambda.reference"; + check-ocamlc.byte-output; + } + } +*) diff --git a/testsuite/tests/basic-modules/anonymous.ocamlopt.flambda.reference b/testsuite/tests/basic-modules/anonymous.ocamlopt.flambda.reference index 6645b7d44ad..817257e3725 100644 --- a/testsuite/tests/basic-modules/anonymous.ocamlopt.flambda.reference +++ b/testsuite/tests/basic-modules/anonymous.ocamlopt.flambda.reference @@ -7,14 +7,14 @@ (apply (field_imm 0 (global CamlinternalMod!)) [0: "anonymous.ml" 25 6] [0: [0]]) B = - (apply (field 0 (global CamlinternalMod!)) [0: "anonymous.ml" 35 6] - [0: [0]])) + (apply (field_imm 0 (global CamlinternalMod!)) + [0: "anonymous.ml" 35 6] [0: [0]])) (seq (ignore (let (x =[(consts ()) (non_consts ([0: [int], [int]]))] [0: 4 2]) (makeblock 0 x))) - (apply (field 1 (global CamlinternalMod!)) [0: [0]] A A) - (apply (field 1 (global CamlinternalMod!)) [0: [0]] B + (apply (field_imm 1 (global CamlinternalMod!)) [0: [0]] A A) + (apply (field_imm 1 (global CamlinternalMod!)) [0: [0]] B (let (x =[(consts ()) (non_consts ([0: *, *]))] [0: "foo" "bar"]) (makeblock 0))) (let (f = (function {nlocal = 0} param : int 0) s = (makemutable 0 "")) diff --git a/testsuite/tests/basic-modules/main.ml b/testsuite/tests/basic-modules/main.ml index bd6d4ff3445..8abcf6c3a8b 100644 --- a/testsuite/tests/basic-modules/main.ml +++ b/testsuite/tests/basic-modules/main.ml @@ -1,5 +1,5 @@ (* TEST - modules = "offset.ml pr6726.ml pr7427.ml pr4008.ml" + modules = "offset.ml pr6726.ml pr7427.ml pr4008.ml"; *) (* PR#6435 *) diff --git a/testsuite/tests/basic-modules/recursive_module_evaluation_errors.ml b/testsuite/tests/basic-modules/recursive_module_evaluation_errors.ml index b0fdd12c310..0db608aef6c 100644 --- a/testsuite/tests/basic-modules/recursive_module_evaluation_errors.ml +++ b/testsuite/tests/basic-modules/recursive_module_evaluation_errors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module rec A: sig val x: int end = struct let x = B.x end diff --git a/testsuite/tests/basic-more/bounds.ml b/testsuite/tests/basic-more/bounds.ml index 9915853f6c1..2ffd972e307 100644 --- a/testsuite/tests/basic-more/bounds.ml +++ b/testsuite/tests/basic-more/bounds.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) (* Test bound checks *) diff --git a/testsuite/tests/basic-more/div_by_zero.ml b/testsuite/tests/basic-more/div_by_zero.ml index 7cd910768e5..5c033e24d71 100644 --- a/testsuite/tests/basic-more/div_by_zero.ml +++ b/testsuite/tests/basic-more/div_by_zero.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) let check f n = diff --git a/testsuite/tests/basic-more/function_in_ref.ml b/testsuite/tests/basic-more/function_in_ref.ml index 481384095de..fd4446cbba7 100644 --- a/testsuite/tests/basic-more/function_in_ref.ml +++ b/testsuite/tests/basic-more/function_in_ref.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) let f x = x + 1 diff --git a/testsuite/tests/basic-more/if_in_if.ml b/testsuite/tests/basic-more/if_in_if.ml index cf3525d2fee..ad51f970c34 100644 --- a/testsuite/tests/basic-more/if_in_if.ml +++ b/testsuite/tests/basic-more/if_in_if.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) let sequor b1 b2 = diff --git a/testsuite/tests/basic-more/morematch.ml b/testsuite/tests/basic-more/morematch.ml index 998daee62c3..130c1edad6b 100644 --- a/testsuite/tests/basic-more/morematch.ml +++ b/testsuite/tests/basic-more/morematch.ml @@ -1,5 +1,5 @@ -(* TEST - include testing +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) (**************************************************************) @@ -1157,3 +1157,7 @@ let pr5758 x str = let () = test "pr5758" (pr5758 1.) "A" "Matched A" ;; + +(* TEST + include testing; +*) diff --git a/testsuite/tests/basic-more/opaque_prim.ml b/testsuite/tests/basic-more/opaque_prim.ml index bdb60250ee9..3456f5339ee 100644 --- a/testsuite/tests/basic-more/opaque_prim.ml +++ b/testsuite/tests/basic-more/opaque_prim.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) let f x = Sys.opaque_identity x diff --git a/testsuite/tests/basic-more/pr10338.ml b/testsuite/tests/basic-more/pr10338.ml index 7697f377f80..2f63667b2a7 100644 --- a/testsuite/tests/basic-more/pr10338.ml +++ b/testsuite/tests/basic-more/pr10338.ml @@ -1,4 +1,4 @@ -(* TEST *) +(* TEST_BELOW*) (* exercise push_defaults *) @@ -24,3 +24,6 @@ print_endline (f (module struct exception Ex end) Exit);; let f ?(x = assert false) ((module M) : (module E)) () = 1;; (* so partial application of the module doesn't raise *) let partial = f (module struct exception Ex end);; + +(* TEST +*) diff --git a/testsuite/tests/basic-more/pr1271.ml b/testsuite/tests/basic-more/pr1271.ml index adbb8734ff8..9c67dd9c349 100644 --- a/testsuite/tests/basic-more/pr1271.ml +++ b/testsuite/tests/basic-more/pr1271.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) (* GPR#1271 *) diff --git a/testsuite/tests/basic-more/pr2719.ml b/testsuite/tests/basic-more/pr2719.ml index cb69aeae342..7bddbf9345b 100644 --- a/testsuite/tests/basic-more/pr2719.ml +++ b/testsuite/tests/basic-more/pr2719.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) open Printf diff --git a/testsuite/tests/basic-more/pr6216.ml b/testsuite/tests/basic-more/pr6216.ml index 3f6b410993f..89dba12f283 100644 --- a/testsuite/tests/basic-more/pr6216.ml +++ b/testsuite/tests/basic-more/pr6216.ml @@ -1,6 +1,6 @@ (* TEST - include testing - ocamlopt_flags ="-inline 20" + include testing; + ocamlopt_flags = "-inline 20"; *) (* PR6216: wrong inlining of GADT match *) diff --git a/testsuite/tests/basic-more/record_evaluation_order.ml b/testsuite/tests/basic-more/record_evaluation_order.ml index f8d1d568b3b..66780ea2372 100644 --- a/testsuite/tests/basic-more/record_evaluation_order.ml +++ b/testsuite/tests/basic-more/record_evaluation_order.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) type r = diff --git a/testsuite/tests/basic-more/robustmatch.ml b/testsuite/tests/basic-more/robustmatch.ml index e4768d0a667..5aea6d1f534 100644 --- a/testsuite/tests/basic-more/robustmatch.ml +++ b/testsuite/tests/basic-more/robustmatch.ml @@ -1,6 +1,6 @@ (* TEST - flags += "-w +4+8+9+11+12+52+56+57" - include testing + flags += "-w +4+8+9+11+12+52+56+57"; + include testing; *) module GPR1493 = struct diff --git a/testsuite/tests/basic-more/safer_matching.ml b/testsuite/tests/basic-more/safer_matching.ml index 0720b4c3fc3..668c521968c 100644 --- a/testsuite/tests/basic-more/safer_matching.ml +++ b/testsuite/tests/basic-more/safer_matching.ml @@ -1,5 +1,5 @@ -(* TEST - flags += "-safer-matching" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) type 'a dyn = Int : int -> int dyn | Float : float -> float dyn;; @@ -9,3 +9,7 @@ let f (Float x) = x;; Format.printf "%f\n%!" (f (Float 3.1415));; try Printexc.print f (Obj.magic (Int 3)) with _ -> 0.;; + +(* TEST + flags += "-safer-matching"; +*) diff --git a/testsuite/tests/basic-more/sequential_and_or.ml b/testsuite/tests/basic-more/sequential_and_or.ml index 926cb9ab583..16c1367a41b 100644 --- a/testsuite/tests/basic-more/sequential_and_or.ml +++ b/testsuite/tests/basic-more/sequential_and_or.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) let r = ref 0 diff --git a/testsuite/tests/basic-more/structural_constants.ml b/testsuite/tests/basic-more/structural_constants.ml index 66cff92b3f1..55a4287c556 100644 --- a/testsuite/tests/basic-more/structural_constants.ml +++ b/testsuite/tests/basic-more/structural_constants.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) type t1 = diff --git a/testsuite/tests/basic-more/tailannots.ml b/testsuite/tests/basic-more/tailannots.ml index 73482149972..ee0f790ac57 100644 --- a/testsuite/tests/basic-more/tailannots.ml +++ b/testsuite/tests/basic-more/tailannots.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) let nop () = () diff --git a/testsuite/tests/basic-more/tbuffer.ml b/testsuite/tests/basic-more/tbuffer.ml index c3f96b7345a..7daff1b5765 100644 --- a/testsuite/tests/basic-more/tbuffer.ml +++ b/testsuite/tests/basic-more/tbuffer.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) (* Dummy substitute function. *) diff --git a/testsuite/tests/basic-more/top_level_patterns.ml b/testsuite/tests/basic-more/top_level_patterns.ml index aca641fc4f0..a253bfe5a0b 100644 --- a/testsuite/tests/basic-more/top_level_patterns.ml +++ b/testsuite/tests/basic-more/top_level_patterns.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) type t = diff --git a/testsuite/tests/basic-more/tprintf.ml b/testsuite/tests/basic-more/tprintf.ml index e1cb4c0a7b9..d4bde0bbae3 100644 --- a/testsuite/tests/basic-more/tprintf.ml +++ b/testsuite/tests/basic-more/tprintf.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) open Testing;; diff --git a/testsuite/tests/basic-multdef/usemultdef.ml b/testsuite/tests/basic-multdef/usemultdef.ml index 477cf4ced5d..858b478d0ce 100644 --- a/testsuite/tests/basic-multdef/usemultdef.ml +++ b/testsuite/tests/basic-multdef/usemultdef.ml @@ -1,5 +1,5 @@ (* TEST - modules = "multdef.ml" + modules = "multdef.ml"; *) let _ = print_int(Multdef.f 1); print_newline(); exit 0 diff --git a/testsuite/tests/basic-private/tlength.ml b/testsuite/tests/basic-private/tlength.ml index 00ce4cc843f..7a43ddff1cf 100644 --- a/testsuite/tests/basic-private/tlength.ml +++ b/testsuite/tests/basic-private/tlength.ml @@ -1,5 +1,5 @@ (* TEST - modules = "length.ml" + modules = "length.ml"; *) (* diff --git a/testsuite/tests/basic/combine_checkbound.ml b/testsuite/tests/basic/combine_checkbound.ml index 1bf096648a2..3981bc02598 100644 --- a/testsuite/tests/basic/combine_checkbound.ml +++ b/testsuite/tests/basic/combine_checkbound.ml @@ -1,5 +1,6 @@ (* TEST - * native *) + native; +*) let glob = ref (1, 2) let[@inline never] combine1 x a = diff --git a/testsuite/tests/basic/constprop.ml.c b/testsuite/tests/basic/constprop.ml.c index ee23d48992d..805aa9d600c 100644 --- a/testsuite/tests/basic/constprop.ml.c +++ b/testsuite/tests/basic/constprop.ml.c @@ -1,9 +1,12 @@ (* TEST - flags = "-pp '${c_preprocessor}'" - ocaml_filetype_flag = "-impl" - * bytecode - compare_programs = "false" - * native + flags = "-pp '${c_preprocessor}'"; + ocaml_filetype_flag = "-impl"; + { + compare_programs = "false"; + bytecode; + }{ + native; + } *) (* This file has extension .ml.c because it needs to be preprocessed diff --git a/testsuite/tests/basic/opt_variants.ml b/testsuite/tests/basic/opt_variants.ml index 7083a03d7ad..c36c1b112a5 100644 --- a/testsuite/tests/basic/opt_variants.ml +++ b/testsuite/tests/basic/opt_variants.ml @@ -1,5 +1,5 @@ (* TEST -unset DOES_NOT_EXIST + unset DOES_NOT_EXIST; *) let () = diff --git a/testsuite/tests/basic/patmatch_for_multiple.ml b/testsuite/tests/basic/patmatch_for_multiple.ml index dc3914d7afe..570be1097d0 100644 --- a/testsuite/tests/basic/patmatch_for_multiple.ml +++ b/testsuite/tests/basic/patmatch_for_multiple.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-drawlambda -dlambda" - * expect + flags = "-drawlambda -dlambda"; + expect; *) (* Note: the tests below contain *both* the -drawlambda and @@ -26,15 +26,15 @@ match (3, 2, 1) with | _ -> false ;; [%%expect{| -(let (*match*/271 =[int] 3 *match*/272 =[int] 2 *match*/273 =[int] 1) +(let (*match*/277 =[int] 3 *match*/278 =[int] 2 *match*/279 =[int] 1) (catch (catch - (catch (if (!= *match*/272 3) (exit 3) (exit 1)) with (3) - (if (!= *match*/271 1) (exit 2) (exit 1))) + (catch (if (!= *match*/278 3) (exit 3) (exit 1)) with (3) + (if (!= *match*/277 1) (exit 2) (exit 1))) with (2) 0) with (1) 1)) -(let (*match*/271 =[int] 3 *match*/272 =[int] 2 *match*/273 =[int] 1) - (catch (if (!= *match*/272 3) (if (!= *match*/271 1) 0 (exit 1)) (exit 1)) +(let (*match*/277 =[int] 3 *match*/278 =[int] 2 *match*/279 =[int] 1) + (catch (if (!= *match*/278 3) (if (!= *match*/277 1) 0 (exit 1)) (exit 1)) with (1) 1)) - : bool = false |}];; @@ -47,32 +47,32 @@ match (3, 2, 1) with | _ -> false ;; [%%expect{| -(let (*match*/276 =[int] 3 *match*/277 =[int] 2 *match*/278 =[int] 1) +(let (*match*/282 =[int] 3 *match*/283 =[int] 2 *match*/284 =[int] 1) (catch (catch (catch - (if (!= *match*/277 3) (exit 6) + (if (!= *match*/283 3) (exit 6) (let - (x/280 =a[(consts ()) (non_consts ([0: [int], [int], [int]]))] - (makeblock 0 *match*/276 *match*/277 *match*/278)) - (exit 4 x/280))) + (x/286 =a[(consts ()) (non_consts ([0: [int], [int], [int]]))] + (makeblock 0 *match*/282 *match*/283 *match*/284)) + (exit 4 x/286))) with (6) - (if (!= *match*/276 1) (exit 5) + (if (!= *match*/282 1) (exit 5) (let - (x/279 =a[(consts ()) (non_consts ([0: [int], [int], [int]]))] - (makeblock 0 *match*/276 *match*/277 *match*/278)) - (exit 4 x/279)))) + (x/285 =a[(consts ()) (non_consts ([0: [int], [int], [int]]))] + (makeblock 0 *match*/282 *match*/283 *match*/284)) + (exit 4 x/285)))) with (5) 0) - with (4 x/274[(consts ()) (non_consts ([0: [int], [int], [int]]))]) - (seq (ignore x/274) 1))) -(let (*match*/276 =[int] 3 *match*/277 =[int] 2 *match*/278 =[int] 1) + with (4 x/280[(consts ()) (non_consts ([0: [int], [int], [int]]))]) + (seq (ignore x/280) 1))) +(let (*match*/282 =[int] 3 *match*/283 =[int] 2 *match*/284 =[int] 1) (catch - (if (!= *match*/277 3) - (if (!= *match*/276 1) 0 - (exit 4 (makeblock 0 *match*/276 *match*/277 *match*/278))) - (exit 4 (makeblock 0 *match*/276 *match*/277 *match*/278))) - with (4 x/274[(consts ()) (non_consts ([0: [int], [int], [int]]))]) - (seq (ignore x/274) 1))) + (if (!= *match*/283 3) + (if (!= *match*/282 1) 0 + (exit 4 (makeblock 0 *match*/282 *match*/283 *match*/284))) + (exit 4 (makeblock 0 *match*/282 *match*/283 *match*/284))) + with (4 x/280[(consts ()) (non_consts ([0: [int], [int], [int]]))]) + (seq (ignore x/280) 1))) - : bool = false |}];; @@ -82,8 +82,8 @@ let _ = fun a b -> | ((true, _) as _g) | ((false, _) as _g) -> () [%%expect{| -(function {nlocal = 0} a/281[int] b/282 : int 0) -(function {nlocal = 0} a/281[int] b/282 : int 0) +(function {nlocal = 0} a/287[int] b/288 : int 0) +(function {nlocal = 0} a/287[int] b/288 : int 0) - : bool -> 'a -> unit = |}];; @@ -102,15 +102,15 @@ let _ = fun a b -> match a, b with | (false, _) as p -> p (* outside, trivial *) [%%expect {| -(function {nlocal = 0} a/285[int] b/286 +(function {nlocal = 0} a/291[int] b/292 [(consts ()) (non_consts ([0: [int], *]))](let - (p/287 =a[(consts ()) + (p/293 =a[(consts ()) (non_consts ( [0: [int], *]))] - (makeblock 0 a/285 b/286)) - p/287)) -(function {nlocal = 0} a/285[int] b/286 - [(consts ()) (non_consts ([0: [int], *]))](makeblock 0 a/285 b/286)) + (makeblock 0 a/291 b/292)) + p/293)) +(function {nlocal = 0} a/291[int] b/292 + [(consts ()) (non_consts ([0: [int], *]))](makeblock 0 a/291 b/292)) - : bool -> 'a -> bool * 'a = |}] @@ -119,15 +119,15 @@ let _ = fun a b -> match a, b with | ((false, _) as p) -> p (* inside, trivial *) [%%expect{| -(function {nlocal = 0} a/289[int] b/290 +(function {nlocal = 0} a/295[int] b/296 [(consts ()) (non_consts ([0: [int], *]))](let - (p/291 =a[(consts ()) + (p/297 =a[(consts ()) (non_consts ( [0: [int], *]))] - (makeblock 0 a/289 b/290)) - p/291)) -(function {nlocal = 0} a/289[int] b/290 - [(consts ()) (non_consts ([0: [int], *]))](makeblock 0 a/289 b/290)) + (makeblock 0 a/295 b/296)) + p/297)) +(function {nlocal = 0} a/295[int] b/296 + [(consts ()) (non_consts ([0: [int], *]))](makeblock 0 a/295 b/296)) - : bool -> 'a -> bool * 'a = |}];; @@ -136,20 +136,20 @@ let _ = fun a b -> match a, b with | (false as x, _) as p -> x, p (* outside, simple *) [%%expect {| -(function {nlocal = 0} a/295[int] b/296 +(function {nlocal = 0} a/301[int] b/302 [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], *]))]]))] (let - (x/297 =a[int] a/295 - p/298 =a[(consts ()) (non_consts ([0: [int], *]))] - (makeblock 0 a/295 b/296)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) x/297 - p/298))) -(function {nlocal = 0} a/295[int] b/296 + (x/303 =a[int] a/301 + p/304 =a[(consts ()) (non_consts ([0: [int], *]))] + (makeblock 0 a/301 b/302)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) x/303 + p/304))) +(function {nlocal = 0} a/301[int] b/302 [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], *]))]]))] - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) a/295 - (makeblock 0 a/295 b/296))) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) a/301 + (makeblock 0 a/301 b/302))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -158,20 +158,20 @@ let _ = fun a b -> match a, b with | ((false as x, _) as p) -> x, p (* inside, simple *) [%%expect {| -(function {nlocal = 0} a/301[int] b/302 +(function {nlocal = 0} a/307[int] b/308 [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], *]))]]))] (let - (x/303 =a[int] a/301 - p/304 =a[(consts ()) (non_consts ([0: [int], *]))] - (makeblock 0 a/301 b/302)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) x/303 - p/304))) -(function {nlocal = 0} a/301[int] b/302 + (x/309 =a[int] a/307 + p/310 =a[(consts ()) (non_consts ([0: [int], *]))] + (makeblock 0 a/307 b/308)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) x/309 + p/310))) +(function {nlocal = 0} a/307[int] b/308 [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], *]))]]))] - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) a/301 - (makeblock 0 a/301 b/302))) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) a/307 + (makeblock 0 a/307 b/308))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -180,30 +180,30 @@ let _ = fun a b -> match a, b with | (false, x) as p -> x, p (* outside, complex *) [%%expect{| -(function {nlocal = 0} a/311[int] b/312[int] +(function {nlocal = 0} a/317[int] b/318[int] [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], [int]]))]]))] - (if a/311 + (if a/317 (let - (x/313 =a[int] a/311 - p/314 =a[(consts ()) (non_consts ([0: [int], [int]]))] - (makeblock 0 a/311 b/312)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/313 - p/314)) + (x/319 =a[int] a/317 + p/320 =a[(consts ()) (non_consts ([0: [int], [int]]))] + (makeblock 0 a/317 b/318)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/319 + p/320)) (let - (x/315 =a[(consts ()) (non_consts ([0: ]))] b/312 - p/316 =a[(consts ()) (non_consts ([0: [int], [int]]))] - (makeblock 0 a/311 b/312)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/315 - p/316)))) -(function {nlocal = 0} a/311[int] b/312[int] + (x/321 =a[(consts ()) (non_consts ([0: ]))] b/318 + p/322 =a[(consts ()) (non_consts ([0: [int], [int]]))] + (makeblock 0 a/317 b/318)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/321 + p/322)))) +(function {nlocal = 0} a/317[int] b/318[int] [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], [int]]))]]))] - (if a/311 - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) a/311 - (makeblock 0 a/311 b/312)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) b/312 - (makeblock 0 a/311 b/312)))) + (if a/317 + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) a/317 + (makeblock 0 a/317 b/318)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) b/318 + (makeblock 0 a/317 b/318)))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -213,33 +213,33 @@ let _ = fun a b -> match a, b with -> x, p (* inside, complex *) [%%expect{| -(function {nlocal = 0} a/317[int] b/318[int] +(function {nlocal = 0} a/323[int] b/324[int] [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], [int]]))]]))] (catch - (if a/317 + (if a/323 (let - (x/325 =a[int] a/317 - p/326 =a[(consts ()) (non_consts ([0: [int], [int]]))] - (makeblock 0 a/317 b/318)) - (exit 10 x/325 p/326)) + (x/331 =a[int] a/323 + p/332 =a[(consts ()) (non_consts ([0: [int], [int]]))] + (makeblock 0 a/323 b/324)) + (exit 10 x/331 p/332)) (let - (x/323 =a[(consts ()) (non_consts ([0: ]))] b/318 - p/324 =a[(consts ()) (non_consts ([0: [int], [int]]))] - (makeblock 0 a/317 b/318)) - (exit 10 x/323 p/324))) - with (10 x/319[int] p/320[(consts ()) (non_consts ([0: [int], [int]]))]) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/319 - p/320))) -(function {nlocal = 0} a/317[int] b/318[int] + (x/329 =a[(consts ()) (non_consts ([0: ]))] b/324 + p/330 =a[(consts ()) (non_consts ([0: [int], [int]]))] + (makeblock 0 a/323 b/324)) + (exit 10 x/329 p/330))) + with (10 x/325[int] p/326[(consts ()) (non_consts ([0: [int], [int]]))]) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/325 + p/326))) +(function {nlocal = 0} a/323[int] b/324[int] [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], [int]]))]]))] (catch - (if a/317 (exit 10 a/317 (makeblock 0 a/317 b/318)) - (exit 10 b/318 (makeblock 0 a/317 b/318))) - with (10 x/319[int] p/320[(consts ()) (non_consts ([0: [int], [int]]))]) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/319 - p/320))) + (if a/323 (exit 10 a/323 (makeblock 0 a/323 b/324)) + (exit 10 b/324 (makeblock 0 a/323 b/324))) + with (10 x/325[int] p/326[(consts ()) (non_consts ([0: [int], [int]]))]) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/325 + p/326))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -252,30 +252,30 @@ let _ = fun a b -> match a, b with | (false as x, _) as p -> x, p (* outside, onecase *) [%%expect {| -(function {nlocal = 0} a/327[int] b/328[int] +(function {nlocal = 0} a/333[int] b/334[int] [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], [int]]))]]))] - (if a/327 + (if a/333 (let - (x/329 =a[int] a/327 - _p/330 =a[(consts ()) (non_consts ([0: [int], [int]]))] - (makeblock 0 a/327 b/328)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/329 + (x/335 =a[int] a/333 + _p/336 =a[(consts ()) (non_consts ([0: [int], [int]]))] + (makeblock 0 a/333 b/334)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/335 [0: 1 1])) (let - (x/331 =a[int] a/327 - p/332 =a[(consts ()) (non_consts ([0: [int], [int]]))] - (makeblock 0 a/327 b/328)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/331 - p/332)))) -(function {nlocal = 0} a/327[int] b/328[int] + (x/337 =a[int] a/333 + p/338 =a[(consts ()) (non_consts ([0: [int], [int]]))] + (makeblock 0 a/333 b/334)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) x/337 + p/338)))) +(function {nlocal = 0} a/333[int] b/334[int] [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], [int]]))]]))] - (if a/327 - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) a/327 + (if a/333 + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) a/333 [0: 1 1]) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) a/327 - (makeblock 0 a/327 b/328)))) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], [int]]))]) a/333 + (makeblock 0 a/333 b/334)))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -284,20 +284,20 @@ let _ = fun a b -> match a, b with | ((false as x, _) as p) -> x, p (* inside, onecase *) [%%expect{| -(function {nlocal = 0} a/333[int] b/334 +(function {nlocal = 0} a/339[int] b/340 [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], *]))]]))] (let - (x/335 =a[int] a/333 - p/336 =a[(consts ()) (non_consts ([0: [int], *]))] - (makeblock 0 a/333 b/334)) - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) x/335 - p/336))) -(function {nlocal = 0} a/333[int] b/334 + (x/341 =a[int] a/339 + p/342 =a[(consts ()) (non_consts ([0: [int], *]))] + (makeblock 0 a/339 b/340)) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) x/341 + p/342))) +(function {nlocal = 0} a/339[int] b/340 [(consts ()) (non_consts ([0: [int], [(consts ()) (non_consts ([0: [int], *]))]]))] - (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) a/333 - (makeblock 0 a/333 b/334))) + (makeblock 0 (int,[(consts ()) (non_consts ([0: [int], *]))]) a/339 + (makeblock 0 a/339 b/340))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -314,23 +314,23 @@ let _ =fun a b -> match a, b with | (_, _) as p -> p (* outside, tuplist *) [%%expect {| -(function {nlocal = 0} a/346[int] - b/347[(consts (0)) +(function {nlocal = 0} a/352[int] + b/353[(consts (0)) (non_consts ([0: [(consts ()) (non_consts ([0: *, *]))]]))] [(consts ()) (non_consts ([0: [int], [(consts (0)) (non_consts ([0: *]))]]))](catch - (if a/346 - (if b/347 + (if a/352 + (if b/353 (let - (p/348 =a + (p/354 =a (field_imm 0 - b/347)) - p/348) + b/353)) + p/354) (exit 12)) (exit 12)) with (12) (let - (p/349 =a + (p/355 =a [(consts ()) (non_consts ( [0: @@ -339,24 +339,24 @@ let _ =fun a b -> match a, b with (non_consts ( [0: *]))]]))] (makeblock 0 - a/346 - b/347)) - p/349))) -(function {nlocal = 0} a/346[int] - b/347[(consts (0)) + a/352 + b/353)) + p/355))) +(function {nlocal = 0} a/352[int] + b/353[(consts (0)) (non_consts ([0: [(consts ()) (non_consts ([0: *, *]))]]))] [(consts ()) (non_consts ([0: [int], [(consts (0)) (non_consts ([0: *]))]]))](catch - (if a/346 - (if b/347 + (if a/352 + (if b/353 (field_imm 0 - b/347) + b/353) (exit 12)) (exit 12)) with (12) (makeblock 0 - a/346 - b/347))) + a/352 + b/353))) - : bool -> bool tuplist -> bool * bool tuplist = |}] @@ -365,25 +365,25 @@ let _ = fun a b -> match a, b with | ((_, _) as p) -> p (* inside, tuplist *) [%%expect{| -(function {nlocal = 0} a/350[int] - b/351[(consts (0)) +(function {nlocal = 0} a/356[int] + b/357[(consts (0)) (non_consts ([0: [(consts ()) (non_consts ([0: *, *]))]]))] [(consts ()) (non_consts ([0: [int], [(consts (0)) (non_consts ([0: *]))]]))](catch (catch - (if a/350 - (if b/351 + (if a/356 + (if b/357 (let - (p/355 =a + (p/361 =a (field_imm 0 - b/351)) + b/357)) (exit 13 - p/355)) + p/361)) (exit 14)) (exit 14)) with (14) (let - (p/354 =a + (p/360 =a [(consts ()) (non_consts ( [0: @@ -392,11 +392,11 @@ let _ = fun a b -> match a, b with (non_consts ( [0: *]))]]))] (makeblock 0 - a/350 - b/351)) + a/356 + b/357)) (exit 13 - p/354))) - with (13 p/352 + p/360))) + with (13 p/358 [(consts ()) (non_consts ( [0: @@ -404,26 +404,26 @@ let _ = fun a b -> match a, b with [(consts (0)) (non_consts ( [0: *]))]]))]) - p/352)) -(function {nlocal = 0} a/350[int] - b/351[(consts (0)) + p/358)) +(function {nlocal = 0} a/356[int] + b/357[(consts (0)) (non_consts ([0: [(consts ()) (non_consts ([0: *, *]))]]))] [(consts ()) (non_consts ([0: [int], [(consts (0)) (non_consts ([0: *]))]]))](catch (catch - (if a/350 - (if b/351 + (if a/356 + (if b/357 (exit 13 (field_imm 0 - b/351)) + b/357)) (exit 14)) (exit 14)) with (14) (exit 13 (makeblock 0 - a/350 - b/351))) - with (13 p/352 + a/356 + b/357))) + with (13 p/358 [(consts ()) (non_consts ( [0: @@ -431,6 +431,6 @@ let _ = fun a b -> match a, b with [(consts (0)) (non_consts ( [0: *]))]]))]) - p/352)) + p/358)) - : bool -> bool tuplist -> bool * bool tuplist = |}] diff --git a/testsuite/tests/basic/patmatch_incoherence.ml b/testsuite/tests/basic/patmatch_incoherence.ml index b4b951ca518..ecf6b0b813b 100644 --- a/testsuite/tests/basic/patmatch_incoherence.ml +++ b/testsuite/tests/basic/patmatch_incoherence.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type tlist = { x: 'a. 'a list };; diff --git a/testsuite/tests/basic/patmatch_split_no_or.ml b/testsuite/tests/basic/patmatch_split_no_or.ml index bc505602fad..bdf898cd104 100644 --- a/testsuite/tests/basic/patmatch_split_no_or.ml +++ b/testsuite/tests/basic/patmatch_split_no_or.ml @@ -1,7 +1,7 @@ (* TEST - flags = "-nostdlib -nopervasives -dlambda" - * expect - *) + flags = "-nostdlib -nopervasives -dlambda"; + expect; +*) (******************************************************************************) @@ -15,14 +15,14 @@ let last_is_anys = function ;; [%%expect{| (let - (last_is_anys/11 = + (last_is_anys/12 = (function {nlocal = 0} - param/13[(consts ()) (non_consts ([0: [int], [int]]))] : int + param/14[(consts ()) (non_consts ([0: [int], [int]]))] : int (catch - (if (field_imm 0 param/13) (if (field_imm 1 param/13) (exit 1) 1) - (if (field_imm 1 param/13) (exit 1) 2)) + (if (field_imm 0 param/14) (if (field_imm 1 param/14) (exit 1) 1) + (if (field_imm 1 param/14) (exit 1) 2)) with (1) 3))) - (apply (field_imm 1 (global Toploop!)) "last_is_anys" last_is_anys/11)) + (apply (field_imm 1 (global Toploop!)) "last_is_anys" last_is_anys/12)) val last_is_anys : bool * bool -> int = |}] @@ -33,14 +33,14 @@ let last_is_vars = function ;; [%%expect{| (let - (last_is_vars/18 = + (last_is_vars/19 = (function {nlocal = 0} - param/22[(consts ()) (non_consts ([0: [int], [int]]))] : int + param/23[(consts ()) (non_consts ([0: [int], [int]]))] : int (catch - (if (field_imm 0 param/22) (if (field_imm 1 param/22) (exit 3) 1) - (if (field_imm 1 param/22) (exit 3) 2)) + (if (field_imm 0 param/23) (if (field_imm 1 param/23) (exit 3) 1) + (if (field_imm 1 param/23) (exit 3) 2)) with (3) 3))) - (apply (field_imm 1 (global Toploop!)) "last_is_vars" last_is_vars/18)) + (apply (field_imm 1 (global Toploop!)) "last_is_vars" last_is_vars/19)) val last_is_vars : bool * bool -> int = |}] @@ -54,12 +54,12 @@ type t += A | B of unit | C of bool * int;; 0 type t = .. (let - (A/26 = (makeblock_unique 248 "A" (caml_fresh_oo_id 0)) - B/27 = (makeblock_unique 248 "B" (caml_fresh_oo_id 0)) - C/28 = (makeblock_unique 248 "C" (caml_fresh_oo_id 0))) - (seq (apply (field_imm 1 (global Toploop!)) "A/26" A/26) - (apply (field_imm 1 (global Toploop!)) "B/27" B/27) - (apply (field_imm 1 (global Toploop!)) "C/28" C/28))) + (A/27 = (makeblock_unique 248 "A" (caml_fresh_oo_id 0)) + B/28 = (makeblock_unique 248 "B" (caml_fresh_oo_id 0)) + C/29 = (makeblock_unique 248 "C" (caml_fresh_oo_id 0))) + (seq (apply (field_imm 1 (global Toploop!)) "A/27" A/27) + (apply (field_imm 1 (global Toploop!)) "B/28" B/28) + (apply (field_imm 1 (global Toploop!)) "C/29" C/29))) type t += A | B of unit | C of bool * int |}] @@ -73,21 +73,21 @@ let f = function ;; [%%expect{| (let - (C/28 = (apply (field_imm 0 (global Toploop!)) "C/28") - B/27 = (apply (field_imm 0 (global Toploop!)) "B/27") - A/26 = (apply (field_imm 0 (global Toploop!)) "A/26") - f/29 = + (C/29 = (apply (field_imm 0 (global Toploop!)) "C/29") + B/28 = (apply (field_imm 0 (global Toploop!)) "B/28") + A/27 = (apply (field_imm 0 (global Toploop!)) "A/27") + f/30 = (function {nlocal = 0} - param/31[(consts ()) (non_consts ([0: *, [int], [int]]))] : int - (let (*match*/32 =a (field_imm 0 param/31)) + param/32[(consts ()) (non_consts ([0: *, [int], [int]]))] : int + (let (*match*/33 =a (field_imm 0 param/32)) (catch - (if (== *match*/32 A/26) (if (field_imm 1 param/31) 1 (exit 8)) + (if (== *match*/33 A/27) (if (field_imm 1 param/32) 1 (exit 8)) (exit 8)) with (8) - (if (field_imm 1 param/31) - (if (== (field_imm 0 *match*/32) B/27) 2 - (if (== (field_imm 0 *match*/32) C/28) 3 4)) - (if (field_imm 2 param/31) 12 11)))))) - (apply (field_imm 1 (global Toploop!)) "f" f/29)) + (if (field_imm 1 param/32) + (if (== (field_imm 0 *match*/33) B/28) 2 + (if (== (field_imm 0 *match*/33) C/29) 3 4)) + (if (field_imm 2 param/32) 12 11)))))) + (apply (field_imm 1 (global Toploop!)) "f" f/30)) val f : t * bool * bool -> int = |}] diff --git a/testsuite/tests/basic/unit_naming.ml b/testsuite/tests/basic/unit_naming.ml index 6b7a65c2557..8bbe391b25f 100644 --- a/testsuite/tests/basic/unit_naming.ml +++ b/testsuite/tests/basic/unit_naming.ml @@ -1,9 +1,17 @@ -(* TEST - modules = "camlCase.ml" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - ocamlc_byte_exit_status = "2" - *** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) print_int Camlcase.answer + +(* TEST + modules = "camlCase.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/c-api/aligned_alloc.ml b/testsuite/tests/c-api/aligned_alloc.ml new file mode 100644 index 00000000000..8691672ccca --- /dev/null +++ b/testsuite/tests/c-api/aligned_alloc.ml @@ -0,0 +1,31 @@ +(* TEST + modules = "aligned_alloc_stubs.c"; + { + runtime4; + skip; + }{ + runtime5; + native; + } +*) + +external is_aligned : 'a Atomic.t -> bool = "caml_atomic_is_aligned" +let test_is_aligned () = + let l = List.init 100 Atomic.make in + let all_aligned = + List.for_all is_aligned l + in + assert (not all_aligned) +;; + +let test_make_contended () = + let l = List.init 100 Atomic.make_contended in + List.iteri (fun i atomic -> + assert (Atomic.get atomic == i); + assert (is_aligned atomic)) l +;; + +let () = + test_is_aligned (); + test_make_contended (); +;; \ No newline at end of file diff --git a/testsuite/tests/c-api/aligned_alloc_stubs.c b/testsuite/tests/c-api/aligned_alloc_stubs.c new file mode 100644 index 00000000000..09fc8e4fbd5 --- /dev/null +++ b/testsuite/tests/c-api/aligned_alloc_stubs.c @@ -0,0 +1,12 @@ +#include +#include +#include "caml/alloc.h" + +CAMLprim value caml_atomic_is_aligned(value val) +{ + if ((uintptr_t)Hp_val(val) % Cache_line_bsize == 0) { + return Val_true; + } else { + return Val_false; + } +} \ No newline at end of file diff --git a/testsuite/tests/c-api/alloc_async.ml b/testsuite/tests/c-api/alloc_async.ml index b8c99a4b079..abbf729bd66 100644 --- a/testsuite/tests/c-api/alloc_async.ml +++ b/testsuite/tests/c-api/alloc_async.ml @@ -1,7 +1,7 @@ (* TEST - modules = "alloc_async_stubs.c" - * skip - reason = "alloc async changes: https://github.com/ocaml/ocaml/pull/8897" + modules = "alloc_async_stubs.c"; + reason = "alloc async changes: https://github.com/ocaml/ocaml/pull/8897"; + skip; *) external test : int ref -> unit = "stub" diff --git a/testsuite/tests/c-api/test_c_thread_has_lock.ml b/testsuite/tests/c-api/test_c_thread_has_lock.ml index f3e4a20be89..6e2083510c5 100644 --- a/testsuite/tests/c-api/test_c_thread_has_lock.ml +++ b/testsuite/tests/c-api/test_c_thread_has_lock.ml @@ -1,9 +1,11 @@ (* TEST - modules = "test_c_thread_has_lock_cstubs.c" - * skip - reason = "OCaml 5 only" - ** bytecode - ** native + modules = "test_c_thread_has_lock_cstubs.c"; + runtime5; + { + bytecode; + }{ + native; + } *) external test_with_lock : unit -> bool = "with_lock" diff --git a/testsuite/tests/c-api/test_c_thread_has_lock_systhread.ml b/testsuite/tests/c-api/test_c_thread_has_lock_systhread.ml index 036068739a0..192df137d5d 100644 --- a/testsuite/tests/c-api/test_c_thread_has_lock_systhread.ml +++ b/testsuite/tests/c-api/test_c_thread_has_lock_systhread.ml @@ -1,11 +1,13 @@ (* TEST - modules = "test_c_thread_has_lock_cstubs.c" - * skip - reason = "OCaml 5 only" - ** hassysthreads - include systhreads - *** bytecode - *** native + modules = "test_c_thread_has_lock_cstubs.c"; + runtime5; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) external test_with_lock : unit -> bool = "with_lock" @@ -14,7 +16,8 @@ external test_without_lock : unit -> bool = "without_lock" let passed b = Printf.printf (if b then "passed\n" else "failed\n") let f () = - passed (not (test_without_lock ())) ; + (* CR ocaml 5 domains: all systhreads will always have [caml_state != NULL] *) + passed (test_without_lock ()); passed (test_with_lock ()) let _ = diff --git a/testsuite/tests/callback/callback_effects_gc.ml b/testsuite/tests/callback/callback_effects_gc.ml index 52d7fecb7ae..4213f818f8d 100644 --- a/testsuite/tests/callback/callback_effects_gc.ml +++ b/testsuite/tests/callback/callback_effects_gc.ml @@ -1,8 +1,8 @@ (* TEST - ocamlrunparam += ",s=512" - * skip - reason = "OCaml 5 only" - ** native + ocamlrunparam += ",s=512"; + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + native; *) let count = ref 0 diff --git a/testsuite/tests/callback/minor_named.ml b/testsuite/tests/callback/minor_named.ml index 9bc01b77d5e..77b5e031188 100644 --- a/testsuite/tests/callback/minor_named.ml +++ b/testsuite/tests/callback/minor_named.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "minor_named_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "minor_named_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (* Tests Callback.register and caml_named_value on a young object *) diff --git a/testsuite/tests/callback/nested_fiber.ml b/testsuite/tests/callback/nested_fiber.ml index 8d7a18b65a4..36fc5f58f75 100644 --- a/testsuite/tests/callback/nested_fiber.ml +++ b/testsuite/tests/callback/nested_fiber.ml @@ -1,11 +1,14 @@ (* TEST - include unix - modules = "nested_fiber_.c" - * skip - reason = "OCaml 5 only" - ** libunix - *** bytecode - *** native + include unix; + modules = "nested_fiber_.c"; + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + libunix; + { + bytecode; + }{ + native; + } *) external caml_to_c : (unit -> 'a) -> 'a = "caml_to_c" diff --git a/testsuite/tests/callback/signals_alloc.ml b/testsuite/tests/callback/signals_alloc.ml index 27ed2f7da62..ba3c9fbe3fe 100644 --- a/testsuite/tests/callback/signals_alloc.ml +++ b/testsuite/tests/callback/signals_alloc.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "callbackprim.c" - * libunix - ** bytecode - ** native + include unix; + modules = "callbackprim.c"; + libunix; + { + bytecode; + }{ + native; + } *) external raise_sigusr1 : unit -> unit = "raise_sigusr1" diff --git a/testsuite/tests/callback/stack_overflow.ml b/testsuite/tests/callback/stack_overflow.ml index b54ec93268a..593df2e1b7d 100644 --- a/testsuite/tests/callback/stack_overflow.ml +++ b/testsuite/tests/callback/stack_overflow.ml @@ -1,11 +1,14 @@ (* TEST - include unix - modules = "stack_overflow_.c" - * skip - reason = "OCaml 5 only" - ** libunix - *** bytecode - *** native + include unix; + modules = "stack_overflow_.c"; + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + libunix; + { + bytecode; + }{ + native; + } *) external caml_to_c : (unit -> 'a) -> 'a = "caml_to_c" diff --git a/testsuite/tests/callback/test1.ml b/testsuite/tests/callback/test1.ml index 7c45945a8be..e481d52aa94 100644 --- a/testsuite/tests/callback/test1.ml +++ b/testsuite/tests/callback/test1.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "test1_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "test1_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (**************************************************************************) diff --git a/testsuite/tests/callback/test2.ml b/testsuite/tests/callback/test2.ml index 87314864f29..168745a2a51 100644 --- a/testsuite/tests/callback/test2.ml +++ b/testsuite/tests/callback/test2.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "test2_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "test2_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (* Tests nested calls from C (main C) to OCaml (main OCaml) to C (caml_to_c) to diff --git a/testsuite/tests/callback/test3.ml b/testsuite/tests/callback/test3.ml index 6b4f64b739c..ce40ae91416 100644 --- a/testsuite/tests/callback/test3.ml +++ b/testsuite/tests/callback/test3.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "test3_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "test3_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (* Tests nested calls from C (main C) to OCaml (main OCaml) to C (caml_to_c) to diff --git a/testsuite/tests/callback/test4.ml b/testsuite/tests/callback/test4.ml index 3c42317d7e1..5f51c451588 100644 --- a/testsuite/tests/callback/test4.ml +++ b/testsuite/tests/callback/test4.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "test4_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "test4_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (* Tests nested calls from C (main C) to OCaml (main OCaml) to C (caml_to_c) to diff --git a/testsuite/tests/callback/test5.ml b/testsuite/tests/callback/test5.ml index 62fd8b9b0ec..0249f935370 100644 --- a/testsuite/tests/callback/test5.ml +++ b/testsuite/tests/callback/test5.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "test5_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "test5_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (* Tests nested calls from C (main C) to OCaml (main OCaml) to C (caml_to_c) to diff --git a/testsuite/tests/callback/test6.ml b/testsuite/tests/callback/test6.ml index e3ff477f5b6..4ecdafdf98c 100644 --- a/testsuite/tests/callback/test6.ml +++ b/testsuite/tests/callback/test6.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "test6_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "test6_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (* Tests nested calls from C (main C) to OCaml (main OCaml) to C (caml_to_c) to diff --git a/testsuite/tests/callback/test7.ml b/testsuite/tests/callback/test7.ml index c3d8b47d4f8..dac3465afc1 100644 --- a/testsuite/tests/callback/test7.ml +++ b/testsuite/tests/callback/test7.ml @@ -1,12 +1,14 @@ (* TEST - - include unix - modules = "test7_.c" - * skip - reason = "OCaml 5 only" - ** libunix - *** bytecode - *** native + include unix; + modules = "test7_.c"; + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + libunix; + { + bytecode; + }{ + native; + } *) (* Tests nested calls from C (main C) to OCaml (main OCaml) to C (caml_to_c) to diff --git a/testsuite/tests/callback/test_finaliser_gc.ml b/testsuite/tests/callback/test_finaliser_gc.ml index c9c51cabb6a..97c98cf89a2 100644 --- a/testsuite/tests/callback/test_finaliser_gc.ml +++ b/testsuite/tests/callback/test_finaliser_gc.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let z = ref (0, 1, 2, 3, 4, 5, 6, 7) let finaliser_pending = ref true diff --git a/testsuite/tests/callback/test_signalhandler.ml b/testsuite/tests/callback/test_signalhandler.ml index a2bbacee72e..d94b17c036f 100644 --- a/testsuite/tests/callback/test_signalhandler.ml +++ b/testsuite/tests/callback/test_signalhandler.ml @@ -1,9 +1,12 @@ (* TEST - include unix - modules = "test_signalhandler_.c" - * libunix - ** bytecode - ** native + include unix; + modules = "test_signalhandler_.c"; + libunix; + { + bytecode; + }{ + native; + } *) (**************************************************************************) diff --git a/testsuite/tests/compaction/test_freelist_free.ml b/testsuite/tests/compaction/test_freelist_free.ml new file mode 100644 index 00000000000..87e8f6398fc --- /dev/null +++ b/testsuite/tests/compaction/test_freelist_free.ml @@ -0,0 +1,18 @@ +(* TEST *) + +(* tests that we correctly empty the shared pool's freelist. This requires a + bunch of garbage to be generated, a major cycle and two compactions to + test. If we can do that without segfault, we're good. *) + +let () = + let arr = ref (Some (Array.init 1000000 (fun x -> (Some x)))) in + Gc.minor (); + (* Now arr should be promoted to the major heap *) + arr := None; + Gc.full_major (); + (* Now arr should be garbage and the pools in the shared heap allocated + for it should be on the free list *) + Gc.compact (); + (* Now the pools should be compacted but also the freelist should have + been reset correctly *) + Gc.compact () diff --git a/testsuite/tests/compiler-libs/test_longident.ml b/testsuite/tests/compiler-libs/test_longident.ml index 33bf09ffec3..d30060c7c78 100644 --- a/testsuite/tests/compiler-libs/test_longident.ml +++ b/testsuite/tests/compiler-libs/test_longident.ml @@ -1,7 +1,7 @@ (* TEST - flags = "-I ${ocamlsrcdir}/parsing" - include ocamlcommon - * expect + flags = "-I ${ocamlsrcdir}/parsing"; + include ocamlcommon; + expect; *) [@@@alert "-deprecated"] diff --git a/testsuite/tests/compiler-libs/test_runtimetags.ml b/testsuite/tests/compiler-libs/test_runtimetags.ml new file mode 100644 index 00000000000..e6701ebf920 --- /dev/null +++ b/testsuite/tests/compiler-libs/test_runtimetags.ml @@ -0,0 +1,57 @@ +(* TEST + flags = "-I ${ocamlsrcdir}/utils"; + include ocamlcommon; + expect; +*) + +let check_tag name left right = + match Int.equal left right with + | true -> Format.printf "values for %S agree@." name + | false -> Format.printf "values for %S disagree (%d vs %d)@." name left right + +let check_tags l = + List.iter (fun (name, left, right) -> check_tag name left right) l + +let () = check_tags [ + "first_non_constant_constructor_tag", Obj.first_non_constant_constructor_tag, Runtimetags.first_non_constant_constructor_tag; + "last_non_constant_constructor_tag", Obj.last_non_constant_constructor_tag, Runtimetags.last_non_constant_constructor_tag; + "forcing_tag", Obj.forcing_tag, Runtimetags.forcing_tag; + "cont_tag", Obj.cont_tag, Runtimetags.cont_tag; + "lazy_tag", Obj.lazy_tag, Runtimetags.lazy_tag; + "closure_tag", Obj.closure_tag, Runtimetags.closure_tag; + "object_tag", Obj.object_tag, Runtimetags.object_tag; + "infix_tag", Obj.infix_tag, Runtimetags.infix_tag; + "forward_tag", Obj.forward_tag, Runtimetags.forward_tag; + "no_scan_tag", Obj.no_scan_tag, Runtimetags.no_scan_tag; + "abstract_tag", Obj.abstract_tag, Runtimetags.abstract_tag; + "string_tag", Obj.string_tag, Runtimetags.string_tag; + "double_tag", Obj.double_tag, Runtimetags.double_tag; + "double_array_tag", Obj.double_array_tag, Runtimetags.double_array_tag; + "custom_tag", Obj.custom_tag, Runtimetags.custom_tag; + "int_tag", Obj.int_tag, Runtimetags.int_tag; + "out_of_heap_tag", Obj.out_of_heap_tag, Runtimetags.out_of_heap_tag; + "unaligned_tag", Obj.unaligned_tag, Runtimetags.unaligned_tag; +] + +[%%expect{| +val check_tag : string -> int -> int -> unit = +val check_tags : (string * int * int) list -> unit = +values for "first_non_constant_constructor_tag" agree +values for "last_non_constant_constructor_tag" agree +values for "forcing_tag" agree +values for "cont_tag" agree +values for "lazy_tag" agree +values for "closure_tag" agree +values for "object_tag" agree +values for "infix_tag" agree +values for "forward_tag" agree +values for "no_scan_tag" agree +values for "abstract_tag" agree +values for "string_tag" agree +values for "double_tag" agree +values for "double_array_tag" agree +values for "custom_tag" agree +values for "int_tag" agree +values for "out_of_heap_tag" agree +values for "unaligned_tag" agree +|}] diff --git a/testsuite/tests/compiler-libs/test_untypeast.ml b/testsuite/tests/compiler-libs/test_untypeast.ml index 738e17ef56a..c46c795820b 100644 --- a/testsuite/tests/compiler-libs/test_untypeast.ml +++ b/testsuite/tests/compiler-libs/test_untypeast.ml @@ -1,18 +1,38 @@ (* TEST - flags = "-I ${ocamlsrcdir}/typing \ - -I ${ocamlsrcdir}/parsing \ - -I ${ocamlsrcdir}/utils" - include ocamlcommon - * expect + flags = "-I ${ocamlsrcdir}/typing -I ${ocamlsrcdir}/parsing -I ${ocamlsrcdir}/utils"; + include ocamlcommon; + expect; *) -let res = - let s = {| match None with Some (Some _) -> () | _ -> () |} in +let run s = let pe = Parse.expression (Lexing.from_string s) in let te = Typecore.type_expression (Lazy.force Env.initial) pe in let ute = Untypeast.untype_expression te in Format.asprintf "%a" Pprintast.expression ute [%%expect{| -val res : string = "match None with | Some (Some _) -> () | _ -> ()" -|}] +val run : string -> string = +|}];; + +run {| match None with Some (Some _) -> () | _ -> () |};; + +[%%expect{| +- : string = "match None with | Some (Some _) -> () | _ -> ()" +|}];; + +(***********************************) +(* Untypeast/pprintast maintain the arity of a function. *) + +(* 4-ary function *) +run {| fun x y z -> function w -> x y z w |};; + +[%%expect{| +- : string = "fun x y z -> function | w -> x y z w" +|}];; + +(* 3-ary function returning a 1-ary function *) +run {| fun x y z -> (function w -> x y z w) |};; + +[%%expect{| +- : string = "fun x y z -> (function | w -> x y z w)" +|}];; diff --git a/testsuite/tests/comprehensions/array_comprehensions_pure.ml b/testsuite/tests/comprehensions/array_comprehensions_pure.ml index 2f9cf6aebc1..1cba3f62951 100644 --- a/testsuite/tests/comprehensions/array_comprehensions_pure.ml +++ b/testsuite/tests/comprehensions/array_comprehensions_pure.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension comprehensions" - * expect + flags = "-extension comprehensions"; + expect; *) (****************************************************************************** diff --git a/testsuite/tests/comprehensions/array_comprehensions_side_effects.ml b/testsuite/tests/comprehensions/array_comprehensions_side_effects.ml index bc9b4d7fe2c..966f63f54a6 100644 --- a/testsuite/tests/comprehensions/array_comprehensions_side_effects.ml +++ b/testsuite/tests/comprehensions/array_comprehensions_side_effects.ml @@ -1,5 +1,5 @@ (* TEST - flags = "-extension comprehensions" + flags = "-extension comprehensions"; *) (****************************************************************************** diff --git a/testsuite/tests/comprehensions/array_comprehensions_special.ml b/testsuite/tests/comprehensions/array_comprehensions_special.ml index 83415d95aa4..c8a398ebe87 100644 --- a/testsuite/tests/comprehensions/array_comprehensions_special.ml +++ b/testsuite/tests/comprehensions/array_comprehensions_special.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension comprehensions" - * expect + flags = "-extension comprehensions"; + expect; *) (* Tests for special array comprehension behavior that don't have a direct diff --git a/testsuite/tests/comprehensions/comprehensions_from_quickcheck.ml b/testsuite/tests/comprehensions/comprehensions_from_quickcheck.ml index a9f82b2f1ec..6ea392c7802 100644 --- a/testsuite/tests/comprehensions/comprehensions_from_quickcheck.ml +++ b/testsuite/tests/comprehensions/comprehensions_from_quickcheck.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension comprehensions" - * expect + flags = "-extension comprehensions"; + expect; *) (* Generated by quickcheck_lists_arrays_haskell_python.ml; filtered down to all diff --git a/testsuite/tests/comprehensions/iarray_comprehensions_pure.ml b/testsuite/tests/comprehensions/iarray_comprehensions_pure.ml index f0377765e88..acb04b73727 100644 --- a/testsuite/tests/comprehensions/iarray_comprehensions_pure.ml +++ b/testsuite/tests/comprehensions/iarray_comprehensions_pure.ml @@ -1,11 +1,12 @@ (* TEST - flags = "-extension comprehensions" - * expect + flags = "-extension comprehensions"; + include stdlib_stable; + expect; *) -module Iarray = Stdlib__Iarray;; +module Iarray = Stdlib_stable.Iarray;; [%%expect{| -module Iarray = Stdlib__Iarray +module Iarray = Stdlib_stable.Iarray |}];; (****************************************************************************** diff --git a/testsuite/tests/comprehensions/iarray_comprehensions_side_effects.ml b/testsuite/tests/comprehensions/iarray_comprehensions_side_effects.ml index f846a216b97..9078a6fe898 100644 --- a/testsuite/tests/comprehensions/iarray_comprehensions_side_effects.ml +++ b/testsuite/tests/comprehensions/iarray_comprehensions_side_effects.ml @@ -1,8 +1,9 @@ (* TEST - flags = "-extension comprehensions" + flags = "-extension comprehensions"; + include stdlib_stable; *) -module Iarray = Stdlib__Iarray +module Iarray = Stdlib_stable.Iarray (****************************************************************************** * ******** ATTENTION! ******** * diff --git a/testsuite/tests/comprehensions/iarray_comprehensions_special.ml b/testsuite/tests/comprehensions/iarray_comprehensions_special.ml index c7e2cc7e2b0..d919b1d2a0c 100644 --- a/testsuite/tests/comprehensions/iarray_comprehensions_special.ml +++ b/testsuite/tests/comprehensions/iarray_comprehensions_special.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension comprehensions" - * expect + flags = "-extension comprehensions"; + expect; *) (****************************************************************************** diff --git a/testsuite/tests/comprehensions/list_comprehensions_pure.ml b/testsuite/tests/comprehensions/list_comprehensions_pure.ml index 2f6168efb7d..242b690b562 100644 --- a/testsuite/tests/comprehensions/list_comprehensions_pure.ml +++ b/testsuite/tests/comprehensions/list_comprehensions_pure.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension comprehensions" - * expect + flags = "-extension comprehensions"; + expect; *) (****************************************************************************** diff --git a/testsuite/tests/comprehensions/list_comprehensions_side_effects.ml b/testsuite/tests/comprehensions/list_comprehensions_side_effects.ml index c363b84a9a5..d7b6634676e 100644 --- a/testsuite/tests/comprehensions/list_comprehensions_side_effects.ml +++ b/testsuite/tests/comprehensions/list_comprehensions_side_effects.ml @@ -1,5 +1,5 @@ (* TEST - flags = "-extension comprehensions" + flags = "-extension comprehensions"; *) (****************************************************************************** diff --git a/testsuite/tests/comprehensions/syntax.ml b/testsuite/tests/comprehensions/syntax.ml index 8e99649536c..07a16420bce 100644 --- a/testsuite/tests/comprehensions/syntax.ml +++ b/testsuite/tests/comprehensions/syntax.ml @@ -1,5 +1,6 @@ (* TEST - include ocamlcommon *) + include ocamlcommon; +*) let () = Language_extension.enable Comprehensions ();; diff --git a/testsuite/tests/effects/backtrace.ml b/testsuite/tests/effects/backtrace.ml index 9021613de7e..1ce736038d0 100644 --- a/testsuite/tests/effects/backtrace.ml +++ b/testsuite/tests/effects/backtrace.ml @@ -1,8 +1,8 @@ -(* TEST - * skip +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + - flags = "-g" - ocamlrunparam += ",b=1" *) open Effect @@ -54,3 +54,9 @@ let main () = | _ -> None } let _ = main () + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + skip; +*) diff --git a/testsuite/tests/effects/cmphash.ml b/testsuite/tests/effects/cmphash.ml index 707887708dd..e0c7f4b5ee8 100644 --- a/testsuite/tests/effects/cmphash.ml +++ b/testsuite/tests/effects/cmphash.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/evenodd.ml b/testsuite/tests/effects/evenodd.ml index 0a490bc509c..8913220b03c 100644 --- a/testsuite/tests/effects/evenodd.ml +++ b/testsuite/tests/effects/evenodd.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/issue479.ml b/testsuite/tests/effects/issue479.ml index 73765a09a6c..264acbe8ab3 100644 --- a/testsuite/tests/effects/issue479.ml +++ b/testsuite/tests/effects/issue479.ml @@ -1,6 +1,6 @@ (* TEST - * skip - ** toplevel + skip; + toplevel; *) (* https://github.com/ocaml-multicore/ocaml-multicore/issues/479 *) diff --git a/testsuite/tests/effects/manylive.ml b/testsuite/tests/effects/manylive.ml index 21af606e562..3211eeb3951 100644 --- a/testsuite/tests/effects/manylive.ml +++ b/testsuite/tests/effects/manylive.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) let f x = let a0 = ref 1 in diff --git a/testsuite/tests/effects/marshal.ml b/testsuite/tests/effects/marshal.ml index 02b9d4e4afc..d061d425f10 100644 --- a/testsuite/tests/effects/marshal.ml +++ b/testsuite/tests/effects/marshal.ml @@ -1,7 +1,7 @@ (* TEST -* skip -reason = "OCaml 5 only" - *) + reason = "CR ocaml 5 effects: re-enable this test"; + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/overflow.ml b/testsuite/tests/effects/overflow.ml index 41e931e162a..301638edb30 100644 --- a/testsuite/tests/effects/overflow.ml +++ b/testsuite/tests/effects/overflow.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/partial.ml b/testsuite/tests/effects/partial.ml index 66375a9d2a5..dc297511055 100644 --- a/testsuite/tests/effects/partial.ml +++ b/testsuite/tests/effects/partial.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/reperform.ml b/testsuite/tests/effects/reperform.ml index ca802614401..19ac1dae389 100644 --- a/testsuite/tests/effects/reperform.ml +++ b/testsuite/tests/effects/reperform.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/sched.ml b/testsuite/tests/effects/sched.ml index 6bf961eecd5..3cfd75910d1 100644 --- a/testsuite/tests/effects/sched.ml +++ b/testsuite/tests/effects/sched.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/shallow_state.ml b/testsuite/tests/effects/shallow_state.ml index c8d5293e438..ec60aa2d24f 100644 --- a/testsuite/tests/effects/shallow_state.ml +++ b/testsuite/tests/effects/shallow_state.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Shallow diff --git a/testsuite/tests/effects/shallow_state_io.ml b/testsuite/tests/effects/shallow_state_io.ml index cca03c81e37..0f5890dbbc4 100644 --- a/testsuite/tests/effects/shallow_state_io.ml +++ b/testsuite/tests/effects/shallow_state_io.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Shallow diff --git a/testsuite/tests/effects/test1.ml b/testsuite/tests/effects/test1.ml index a06fe57bd07..ae40884ba69 100644 --- a/testsuite/tests/effects/test1.ml +++ b/testsuite/tests/effects/test1.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/test10.ml b/testsuite/tests/effects/test10.ml index fe743427eb2..6c30f45735b 100644 --- a/testsuite/tests/effects/test10.ml +++ b/testsuite/tests/effects/test10.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/test11.ml b/testsuite/tests/effects/test11.ml index c9fcb6e2a0e..1b30abe953c 100644 --- a/testsuite/tests/effects/test11.ml +++ b/testsuite/tests/effects/test11.ml @@ -1,6 +1,5 @@ (* TEST - * skip - + skip; *) (* Tests RESUMETERM with extra_args != 0 in bytecode, diff --git a/testsuite/tests/effects/test2.ml b/testsuite/tests/effects/test2.ml index 20a3232810f..11ca399ba72 100644 --- a/testsuite/tests/effects/test2.ml +++ b/testsuite/tests/effects/test2.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Printf open Effect diff --git a/testsuite/tests/effects/test3.ml b/testsuite/tests/effects/test3.ml index 26778aab842..176d50ead9a 100644 --- a/testsuite/tests/effects/test3.ml +++ b/testsuite/tests/effects/test3.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/test4.ml b/testsuite/tests/effects/test4.ml index 9b796e48640..17bc4f45abb 100644 --- a/testsuite/tests/effects/test4.ml +++ b/testsuite/tests/effects/test4.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/test5.ml b/testsuite/tests/effects/test5.ml index 2cd0ab5e3f9..e6f84ef3365 100644 --- a/testsuite/tests/effects/test5.ml +++ b/testsuite/tests/effects/test5.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/test6.ml b/testsuite/tests/effects/test6.ml index 4fe4106d24c..3d399d22cf8 100644 --- a/testsuite/tests/effects/test6.ml +++ b/testsuite/tests/effects/test6.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/test_lazy.ml b/testsuite/tests/effects/test_lazy.ml index f2dbde17875..b1d2cce322f 100644 --- a/testsuite/tests/effects/test_lazy.ml +++ b/testsuite/tests/effects/test_lazy.ml @@ -1,6 +1,6 @@ (* TEST - * skip - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/effects/unhandled_unlinked.ml b/testsuite/tests/effects/unhandled_unlinked.ml index c10e8f5f58e..948851aafd8 100644 --- a/testsuite/tests/effects/unhandled_unlinked.ml +++ b/testsuite/tests/effects/unhandled_unlinked.ml @@ -1,9 +1,11 @@ (* TEST - * skip - - exit_status= "2" - * skip - reason = "OCaml 5 only" + { + exit_status = "2"; + skip; + }{ + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + } *) open Effect diff --git a/testsuite/tests/effects/used_cont.ml b/testsuite/tests/effects/used_cont.ml index 48fb6e893c7..0959d254407 100644 --- a/testsuite/tests/effects/used_cont.ml +++ b/testsuite/tests/effects/used_cont.ml @@ -1,7 +1,6 @@ (* TEST - * skip - - *) + skip; +*) open Effect open Effect.Deep diff --git a/testsuite/tests/embedded/cmcaml.ml b/testsuite/tests/embedded/cmcaml.ml index 005b489cc9a..f176cc57cf8 100644 --- a/testsuite/tests/embedded/cmcaml.ml +++ b/testsuite/tests/embedded/cmcaml.ml @@ -1,5 +1,5 @@ (* TEST - modules = "cmstub.c cmmain.c" + modules = "cmstub.c cmmain.c"; *) (* OCaml part of the code *) diff --git a/testsuite/tests/ephe-c-api/test.ml b/testsuite/tests/ephe-c-api/test.ml index ff1646835a1..e84c012ace6 100644 --- a/testsuite/tests/ephe-c-api/test.ml +++ b/testsuite/tests/ephe-c-api/test.ml @@ -1,7 +1,7 @@ (* TEST - modules = "stubs.c" - * skip - reason = "port the new Ephemeron C-api to multicore : https://github.com/ocaml/ocaml/pull/676" + modules = "stubs.c"; + reason = "port the new Ephemeron C-api to multicore : https://github.com/ocaml/ocaml/pull/676"; + skip; *) (* C version of ephetest.ml *) diff --git a/testsuite/tests/exotic-syntax/exotic.ml b/testsuite/tests/exotic-syntax/exotic.ml index 11593763958..eeaf79eb1a7 100644 --- a/testsuite/tests/exotic-syntax/exotic.ml +++ b/testsuite/tests/exotic-syntax/exotic.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Exotic OCaml syntax constructs found in the manual that are not *) (* used in the source of the OCaml distribution (even in the tests). *) diff --git a/testsuite/tests/extension-constructor/test.ml b/testsuite/tests/extension-constructor/test.ml index 227f420a962..b4cc334c8a4 100644 --- a/testsuite/tests/extension-constructor/test.ml +++ b/testsuite/tests/extension-constructor/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) type t = .. diff --git a/testsuite/tests/flambda/afl_lazy.ml b/testsuite/tests/flambda/afl_lazy.ml index fd5178dac87..657b0d20c21 100644 --- a/testsuite/tests/flambda/afl_lazy.ml +++ b/testsuite/tests/flambda/afl_lazy.ml @@ -1,7 +1,7 @@ (* TEST - * flambda - ** native - ocamlopt_flags = "-O3 -afl-instrument" + flambda; + ocamlopt_flags = "-O3 -afl-instrument"; + native; *) let f l = diff --git a/testsuite/tests/flambda/alias_in_join.ml b/testsuite/tests/flambda/alias_in_join.ml new file mode 100644 index 00000000000..5803664ea7d --- /dev/null +++ b/testsuite/tests/flambda/alias_in_join.ml @@ -0,0 +1,52 @@ +(* TEST + native; +*) + +(* This test checks for an issue when joining two branches in flambda2. + It is only relevant at higher optimisation levels. *) +[@@@ocaml.flambda_o3] + +(* Original example extracted from real code. + Triggers the bug when CSE equations on parameters are propagated. *) +let[@inline] m (x : float) y = + if x > y then x else y + +let[@inline] foo x c n = + if x then c +. n else c -. n + +let[@inline] g a b n x b' = + let c = m a b in + let d = foo x c n in (* d is the boxed float that should be removed *) + if b' then m 0. d else d + +let[@opaque] h a b n x b' p = + let r = g a b n x b' in + p /. r + +(* Simplified example triggering the bug without CSE *) +let[@opaque] f x y z = + let[@local] k a b = + a +. b + in + if x then + let arg = y -. z in k arg arg + else + let arg = z -. y in k arg arg + +(* Both examples are supposed to allocate a single float at the end *) +let check_cost = + let x = Gc.allocated_bytes () in + let y = Gc.allocated_bytes () in + y -. x + +let check_alloc f = + let before = Gc.allocated_bytes () in + ignore (f ()); + let after = Gc.allocated_bytes () in + (* A single float allocation should consume 16 bytes *) + assert (after -. before = check_cost +. 16.) + +let () = + check_alloc (fun () -> h 0. 1. 2. true false 3.); + check_alloc (fun () -> f true 0. 1.); + () diff --git a/testsuite/tests/flambda/approx_meet.ml b/testsuite/tests/flambda/approx_meet.ml index c8a1276990c..8b9a638fe17 100644 --- a/testsuite/tests/flambda/approx_meet.ml +++ b/testsuite/tests/flambda/approx_meet.ml @@ -1,7 +1,4 @@ -(* TEST - * flambda - * native -*) +(* TEST *) (* from GPR#1794 *) diff --git a/testsuite/tests/flambda/flambda2_row_like_join.ml b/testsuite/tests/flambda/flambda2_row_like_join.ml new file mode 100644 index 00000000000..f7fc1867080 --- /dev/null +++ b/testsuite/tests/flambda/flambda2_row_like_join.ml @@ -0,0 +1,46 @@ +(* TEST *) + +(* Tests a corner case of the Flambda2 join algorithm. + This checks that joining a row-like type where the tags are known, + with a row-like type where the tag is not known, correctly + takes both sides into account. *) + +(* GADTs allow us to hide kind information *) +type _ t = A : (int * int) t | B : (int * int) t + +let[@inline never] f (type a) (x : a) (cond : a t) = + let result : a = + match cond with + | A -> (0, 1) (* Known tag *) + | B -> begin + let r = fst x in (* Creates an equation on [x] with unknown tag *) + ignore (Sys.opaque_identity r); + x + end + in + (* At this point, [result] has been joined with no kind information. + If everything went well, we should know that: + - It can have tag 0 (as branch A has this tag) + - It can have any tag (as branch B doesn't restrict the tag) + The point of this test is to check that the approximation for + [result] doesn't assume that if it has tag 0, it must have come + from branch A. *) + (* We now need to cast it back to a tuple: *) + let result : int * int = match cond with A -> result | B -> result in + (* Then we need to actually introduce the constraint on the tag. + This is done by storing it into a block with a known shape: *) + let ignored : (unit * (int * int)) = (), result in + (* Now, if we wrongly assumed that only branch A has tag 0, + we would be able to propagate that information here and replace + [a + b] by the constant 1.*) + let a, b = result in + (* [ignored] is returned to make sure we don't remove the block + creation primitive that adds the tag constraint *) + a + b, ignored + +let test () = + let r, _ = f (2, 3) B in + assert (r == 5); + () + +let () = test () diff --git a/testsuite/tests/flambda/gpr2239.ml b/testsuite/tests/flambda/gpr2239.ml index 22c6555e089..0039c2c319a 100644 --- a/testsuite/tests/flambda/gpr2239.ml +++ b/testsuite/tests/flambda/gpr2239.ml @@ -1,7 +1,4 @@ -(* TEST - * flambda - * native -*) +(* TEST *) let do_something () = Printf.printf "Hello world\n%!"; Ok () diff --git a/testsuite/tests/flambda/gpr998.ml b/testsuite/tests/flambda/gpr998.ml index dfb06833ec9..b1cb64baa1a 100644 --- a/testsuite/tests/flambda/gpr998.ml +++ b/testsuite/tests/flambda/gpr998.ml @@ -1,5 +1,5 @@ (* TEST - ocamlopt_flags = "-unbox-closures" + ocamlopt_flags = "-unbox-closures"; *) (* This test attempts to check that unused closures are not deleted diff --git a/testsuite/tests/flambda/is_int_string.ml b/testsuite/tests/flambda/is_int_string.ml new file mode 100644 index 00000000000..c992f571646 --- /dev/null +++ b/testsuite/tests/flambda/is_int_string.ml @@ -0,0 +1,18 @@ +(* TEST + flags = "-flambda2-advanced-meet"; + flambda2; + native; +*) + +type _ opt_or_string = + | S : string opt_or_string + | O : string option opt_or_string + +let to_string (type a) (x : a opt_or_string) (y : a) : string = + match x, y with + | S, s -> s + | O, None -> "" + | O, Some s -> s + +let test () = + to_string (Sys.opaque_identity S) "foo" diff --git a/testsuite/tests/flambda/specialise.ml b/testsuite/tests/flambda/specialise.ml index b5e80c7b996..fc2a57eeb04 100644 --- a/testsuite/tests/flambda/specialise.ml +++ b/testsuite/tests/flambda/specialise.ml @@ -1,7 +1,7 @@ (* TEST - * flambda - ** native - ocamlopt_flags = "-O2 -inline-call-cost 1=20 -unbox-closures" + flambda; + ocamlopt_flags = "-O2 -inline-call-cost 1=20 -unbox-closures"; + native; *) let hide_until_round_2 init_in_hide f_in_hide = diff --git a/testsuite/tests/flambda/unboxing_finds_invalid1.ml b/testsuite/tests/flambda/unboxing_finds_invalid1.ml new file mode 100644 index 00000000000..4bd900a0803 --- /dev/null +++ b/testsuite/tests/flambda/unboxing_finds_invalid1.ml @@ -0,0 +1,37 @@ +(* TEST *) + +[@@@flambda_o3] + +type _ foo = + | Int : int foo + | Float : float foo + +type _ bar = + | I : int -> int bar + | F : float -> float bar + +type t = T : 'a foo * 'a -> t + +let[@inline never] bar b = b + +(* In this test, `z` is not unboxed, but `x` is, and one of the calls to `foo` + (which are all continuations calls, givne the @local), can be found to be + invalid because of the unboxing (it is not found earlier because the `Int` + value is hidden thanks to `Sys.opaque_identity). + + In an early version of invalids during unboxing, there was a bug where in + such cases, there would be missing cases in the extra arguments computed + by the unboxing. *) +let test f g = + let[@local] foo (type a) z (x : a bar) = + match x with + | I i -> z i + | F f -> z (int_of_float f) + in + let aux = Sys.opaque_identity Int in + let t : t = T (aux, 0) in + match t with + | T (Int, i) -> foo f (I i) + | T (Float, f) -> foo g (F f) + + diff --git a/testsuite/tests/flambda/unboxing_finds_invalid2.ml b/testsuite/tests/flambda/unboxing_finds_invalid2.ml new file mode 100644 index 00000000000..b00c19bc6b5 --- /dev/null +++ b/testsuite/tests/flambda/unboxing_finds_invalid2.ml @@ -0,0 +1,33 @@ +(* TEST *) + +[@@@flambda_o3] + +type _ foo = + | Int : int foo + | Float : float foo + +type _ bar = + | I : int -> int bar + | F : float -> float bar + +type t = T : 'a foo * 'a -> t + +let[@inline never] bar b = b + +(* Here, both `b` and `x` are unboxed, and in an early version of + invalids during unboxing, this results in an overlap of rewrite id + between extra args computed for `b` and the invalids (which were found + when computing the extra args for `x`). *) +let test () = + let[@local] foo (type a) b (x : a bar) = + match x with + | I i -> if b then i else 0 + | F f -> if b then int_of_float f else 0 + in + let aux = Sys.opaque_identity Int in + let t : t = T (aux, 0) in + match t with + | T (Int, i) -> foo true (I i) + | T (Float, f) -> foo false (F f) + + diff --git a/testsuite/tests/float-unboxing/float_subst_boxed_number.ml b/testsuite/tests/float-unboxing/float_subst_boxed_number.ml index ec278a5ab35..6c0badbb47a 100644 --- a/testsuite/tests/float-unboxing/float_subst_boxed_number.ml +++ b/testsuite/tests/float-unboxing/float_subst_boxed_number.ml @@ -1,11 +1,15 @@ (* TEST - include config - flags = "-w -55" - ocamlc_flags = "config.cmo" - ocamlopt_flags = "-inline 20 config.cmx" - * native + include config; + flags = "-w -55"; + ocamlc_flags = "config.cmo"; + ocamlopt_flags = "config.cmx"; + native; *) +(* CR-someday mshinwell: enable this for classic mode *) + +[@@@ocaml.flambda_o3] + let eliminate_intermediate_float_record () = let r = ref 0. in for n = 1 to 1000 do diff --git a/testsuite/tests/float-unboxing/unbox_under_assign.ml b/testsuite/tests/float-unboxing/unbox_under_assign.ml index 46a6a18ce3d..9365875f943 100644 --- a/testsuite/tests/float-unboxing/unbox_under_assign.ml +++ b/testsuite/tests/float-unboxing/unbox_under_assign.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) module Float = struct type _ t = diff --git a/testsuite/tests/formats-transition/deprecated_unsigned_printers.ml b/testsuite/tests/formats-transition/deprecated_unsigned_printers.ml index 21f4bf42261..76af1fbdf6b 100644 --- a/testsuite/tests/formats-transition/deprecated_unsigned_printers.ml +++ b/testsuite/tests/formats-transition/deprecated_unsigned_printers.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* %n, %l, %N and %L have a scanf-specific semantics, but are supposed diff --git a/testsuite/tests/formats-transition/ignored_scan_counters.ml b/testsuite/tests/formats-transition/ignored_scan_counters.ml index bc625511d0e..a597532f80d 100644 --- a/testsuite/tests/formats-transition/ignored_scan_counters.ml +++ b/testsuite/tests/formats-transition/ignored_scan_counters.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* Benoit's patch did not support %_[nlNL]; test their behavior *) diff --git a/testsuite/tests/formats-transition/legacy_incompatible_flags.ml b/testsuite/tests/formats-transition/legacy_incompatible_flags.ml index 91b0f6f07fd..b9978026cec 100644 --- a/testsuite/tests/formats-transition/legacy_incompatible_flags.ml +++ b/testsuite/tests/formats-transition/legacy_incompatible_flags.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-no-strict-formats" - * toplevel + flags = "-no-strict-formats"; + toplevel; *) (* the legacy parser ignores flags on formatters on which they make no diff --git a/testsuite/tests/formats-transition/legacy_unfinished_modifiers.ml b/testsuite/tests/formats-transition/legacy_unfinished_modifiers.ml index 9bbaa178a3e..c03de65e203 100644 --- a/testsuite/tests/formats-transition/legacy_unfinished_modifiers.ml +++ b/testsuite/tests/formats-transition/legacy_unfinished_modifiers.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-no-strict-formats" - * toplevel + flags = "-no-strict-formats"; + toplevel; *) (* test whether padding modifiers are accepted without any padding diff --git a/testsuite/tests/formatting/errors_batch.ml b/testsuite/tests/formatting/errors_batch.ml index abf4513da19..6d5bf4611c1 100644 --- a/testsuite/tests/formatting/errors_batch.ml +++ b/testsuite/tests/formatting/errors_batch.ml @@ -1,5 +1,5 @@ (* TEST - include ocamlcommon + include ocamlcommon; *) let () = diff --git a/testsuite/tests/formatting/margins.ml b/testsuite/tests/formatting/margins.ml index 036288890eb..baa1dace636 100644 --- a/testsuite/tests/formatting/margins.ml +++ b/testsuite/tests/formatting/margins.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) let () = Format.pp_set_margin Format.std_formatter 20;; diff --git a/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference b/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference index 88850d6c136..c913c00b11b 100644 --- a/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference +++ b/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference @@ -85,94 +85,97 @@ let rec fib = function | 0 | 1 -> 1 | n -> (fib (n - 1)) + (fib (n - 2)) structure_item (test_locations.ml[17,534+0]..test_locations.ml[19,572+34]) Tstr_value Rec [ - + pattern (test_locations.ml[17,534+8]..test_locations.ml[17,534+11]) Tpat_var "fib" - value_mode Global, Shared, Many + value_mode global,many,nonportable;join(shared,contended)(modevar#1[shared,uncontended .. unique,uncontended]) expression (test_locations.ml[17,534+14]..test_locations.ml[19,572+34]) Texp_function region true - alloc_mode Global, Shared, Many - Nolabel - [ - - pattern (test_locations.ml[18,557+4]..test_locations.ml[18,557+9]) - Tpat_or - pattern (test_locations.ml[18,557+4]..test_locations.ml[18,557+5]) - Tpat_constant Const_int 0 - pattern (test_locations.ml[18,557+8]..test_locations.ml[18,557+9]) - Tpat_constant Const_int 1 - expression (test_locations.ml[18,557+13]..test_locations.ml[18,557+14]) - Texp_constant Const_int 1 - - pattern (test_locations.ml[19,572+4]..test_locations.ml[19,572+5]) - Tpat_var "n" - value_mode Global, Unique, Many - expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+34]) - Texp_apply - apply_mode Tail - locality_mode Global - expression (test_locations.ml[19,572+21]..test_locations.ml[19,572+22]) - Texp_ident "Stdlib!.+" - [ - - Nolabel - expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+20]) - Texp_apply - apply_mode Default - locality_mode Global - expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+12]) - Texp_ident "fib" - [ - - Nolabel - expression (test_locations.ml[19,572+13]..test_locations.ml[19,572+20]) - Texp_apply - apply_mode Default - locality_mode Global - expression (test_locations.ml[19,572+16]..test_locations.ml[19,572+17]) - Texp_ident "Stdlib!.-" - [ - - Nolabel - expression (test_locations.ml[19,572+14]..test_locations.ml[19,572+15]) - Texp_ident "n" - - Nolabel - expression (test_locations.ml[19,572+18]..test_locations.ml[19,572+19]) - Texp_constant Const_int 1 - ] - ] - - Nolabel - expression (test_locations.ml[19,572+23]..test_locations.ml[19,572+34]) - Texp_apply - apply_mode Default - locality_mode Global - expression (test_locations.ml[19,572+23]..test_locations.ml[19,572+26]) - Texp_ident "fib" - [ - - Nolabel - expression (test_locations.ml[19,572+27]..test_locations.ml[19,572+34]) - Texp_apply - apply_mode Default - locality_mode Global - expression (test_locations.ml[19,572+30]..test_locations.ml[19,572+31]) - Texp_ident "Stdlib!.-" - [ - - Nolabel - expression (test_locations.ml[19,572+28]..test_locations.ml[19,572+29]) - Texp_ident "n" - - Nolabel - expression (test_locations.ml[19,572+32]..test_locations.ml[19,572+33]) - Texp_constant Const_int 2 - ] - ] - ] - ] + alloc_mode global,many,nonportable;id(modevar#7[shared,contended .. unique,uncontended]) + [] + Tfunction_cases (test_locations.ml[17,534+14]..test_locations.ml[19,572+34]) + alloc_mode global,many,nonportable;shared,uncontended + value + [ + + pattern (test_locations.ml[18,557+4]..test_locations.ml[18,557+9]) + Tpat_or + pattern (test_locations.ml[18,557+4]..test_locations.ml[18,557+5]) + Tpat_constant Const_int 0 + pattern (test_locations.ml[18,557+8]..test_locations.ml[18,557+9]) + Tpat_constant Const_int 1 + expression (test_locations.ml[18,557+13]..test_locations.ml[18,557+14]) + Texp_constant Const_int 1 + + pattern (test_locations.ml[19,572+4]..test_locations.ml[19,572+5]) + Tpat_var "n" + value_mode global,many,portable;unique,uncontended + expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+34]) + Texp_apply + apply_mode Tail + locality_mode global + expression (test_locations.ml[19,572+21]..test_locations.ml[19,572+22]) + Texp_ident "Stdlib!.+" + [ + + Nolabel + expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+20]) + Texp_apply + apply_mode Default + locality_mode global + expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+12]) + Texp_ident "fib" + [ + + Nolabel + expression (test_locations.ml[19,572+13]..test_locations.ml[19,572+20]) + Texp_apply + apply_mode Default + locality_mode global + expression (test_locations.ml[19,572+16]..test_locations.ml[19,572+17]) + Texp_ident "Stdlib!.-" + [ + + Nolabel + expression (test_locations.ml[19,572+14]..test_locations.ml[19,572+15]) + Texp_ident "n" + + Nolabel + expression (test_locations.ml[19,572+18]..test_locations.ml[19,572+19]) + Texp_constant Const_int 1 + ] + ] + + Nolabel + expression (test_locations.ml[19,572+23]..test_locations.ml[19,572+34]) + Texp_apply + apply_mode Default + locality_mode global + expression (test_locations.ml[19,572+23]..test_locations.ml[19,572+26]) + Texp_ident "fib" + [ + + Nolabel + expression (test_locations.ml[19,572+27]..test_locations.ml[19,572+34]) + Texp_apply + apply_mode Default + locality_mode global + expression (test_locations.ml[19,572+30]..test_locations.ml[19,572+31]) + Texp_ident "Stdlib!.-" + [ + + Nolabel + expression (test_locations.ml[19,572+28]..test_locations.ml[19,572+29]) + Texp_ident "n" + + Nolabel + expression (test_locations.ml[19,572+32]..test_locations.ml[19,572+33]) + Texp_constant Const_int 2 + ] + ] + ] + ] ] ] diff --git a/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference b/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference index 5eb738388fe..41ebb6653bf 100644 --- a/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference +++ b/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference @@ -85,94 +85,97 @@ let rec fib = function | 0 | 1 -> 1 | n -> (fib (n - 1)) + (fib (n - 2)) structure_item Tstr_value Rec [ - + pattern Tpat_var "fib" - value_mode Global, Shared, Many + value_mode global,many,nonportable;join(shared,contended)(modevar#1[shared,uncontended .. unique,uncontended]) expression Texp_function region true - alloc_mode Global, Shared, Many - Nolabel - [ - - pattern - Tpat_or + alloc_mode global,many,nonportable;id(modevar#7[shared,contended .. unique,uncontended]) + [] + Tfunction_cases + alloc_mode global,many,nonportable;shared,uncontended + value + [ + pattern - Tpat_constant Const_int 0 + Tpat_or + pattern + Tpat_constant Const_int 0 + pattern + Tpat_constant Const_int 1 + expression + Texp_constant Const_int 1 + pattern - Tpat_constant Const_int 1 - expression - Texp_constant Const_int 1 - - pattern - Tpat_var "n" - value_mode Global, Unique, Many - expression - Texp_apply - apply_mode Tail - locality_mode Global + Tpat_var "n" + value_mode global,many,portable;unique,uncontended expression - Texp_ident "Stdlib!.+" - [ - - Nolabel - expression - Texp_apply - apply_mode Default - locality_mode Global + Texp_apply + apply_mode Tail + locality_mode global + expression + Texp_ident "Stdlib!.+" + [ + + Nolabel expression - Texp_ident "fib" - [ - - Nolabel - expression - Texp_apply - apply_mode Default - locality_mode Global + Texp_apply + apply_mode Default + locality_mode global + expression + Texp_ident "fib" + [ + + Nolabel expression - Texp_ident "Stdlib!.-" - [ - - Nolabel - expression - Texp_ident "n" - - Nolabel - expression - Texp_constant Const_int 1 - ] - ] - - Nolabel - expression - Texp_apply - apply_mode Default - locality_mode Global + Texp_apply + apply_mode Default + locality_mode global + expression + Texp_ident "Stdlib!.-" + [ + + Nolabel + expression + Texp_ident "n" + + Nolabel + expression + Texp_constant Const_int 1 + ] + ] + + Nolabel expression - Texp_ident "fib" - [ - - Nolabel - expression - Texp_apply - apply_mode Default - locality_mode Global + Texp_apply + apply_mode Default + locality_mode global + expression + Texp_ident "fib" + [ + + Nolabel expression - Texp_ident "Stdlib!.-" - [ - - Nolabel - expression - Texp_ident "n" - - Nolabel - expression - Texp_constant Const_int 2 - ] - ] - ] - ] + Texp_apply + apply_mode Default + locality_mode global + expression + Texp_ident "Stdlib!.-" + [ + + Nolabel + expression + Texp_ident "n" + + Nolabel + expression + Texp_constant Const_int 2 + ] + ] + ] + ] ] ] diff --git a/testsuite/tests/formatting/test_locations.ml b/testsuite/tests/formatting/test_locations.ml index b821f626aee..87bce8c613b 100644 --- a/testsuite/tests/formatting/test_locations.ml +++ b/testsuite/tests/formatting/test_locations.ml @@ -1,20 +1,37 @@ -(* TEST -compile_only="true" -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags="-g -dno-unique-ids -dno-locations -dsource -dparsetree -dtypedtree -dlambda" -*** check-ocamlc.byte-output -compiler_reference = - "${test_source_directory}/test_locations.dno-locations.ocamlc.reference" +(* TEST_BELOW +Filler_text_a +dded_to_preserve_locations_wh +ile_translatin +g_from_old_syntax__Filler_text_added_to_preserve_locations_while_translating_from_o +ld_syntax__Filler_text_added +_to_preserve_locatio +ns_while_translating_from_old_syntax__Filler_text_added_to_preserve_locati -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags="-g -dno-unique-ids -dlocations -dsource -dparsetree -dtypedtree -dlambda" -*** check-ocamlc.byte-output -compiler_reference = - "${test_source_directory}/test_locations.dlocations.ocamlc.reference" +ons_while_translating_from_ol +d_syntax__Fill +er_text_added_to_preserve_locations_while_translating_from_old_syntax__Filler_te +xt_added_to_preserve_locatio +ns_while_translating +_from_old_syntax__Filler_text_added_to_preserve_locations_while_transla *) let rec fib = function | 0 | 1 -> 1 | n -> fib (n - 1) + fib (n - 2) ;; + +(* TEST + compile_only = "true"; + { + setup-ocamlc.byte-build-env; + flags = "-g -dno-unique-ids -dno-locations -dsource -dparsetree -dtypedtree -dlambda"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/test_locations.dno-locations.ocamlc.reference"; + check-ocamlc.byte-output; + }{ + setup-ocamlc.byte-build-env; + flags = "-g -dno-unique-ids -dlocations -dsource -dparsetree -dtypedtree -dlambda"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/test_locations.dlocations.ocamlc.reference"; + check-ocamlc.byte-output; + } +*) diff --git a/testsuite/tests/frame-pointers/c_call.ml b/testsuite/tests/frame-pointers/c_call.ml index e156e23d114..d1380147eeb 100644 --- a/testsuite/tests/frame-pointers/c_call.ml +++ b/testsuite/tests/frame-pointers/c_call.ml @@ -1,14 +1,15 @@ (* TEST - -* skip -reason = "OCaml 5 only" -** frame_pointers -*** native -readonly_files = "fp_backtrace.c c_call_.c" -all_modules = "${readonly_files} c_call.ml" - + runtime5; + frame_pointers; + readonly_files = "fp_backtrace.c c_call_.c"; + all_modules = "${readonly_files} c_call.ml"; + native; *) +(* Force -O3 to ensure the "_code" symbols are present (see the + reference file). *) +[@@@ocaml.flambda_o3] + external fp_backtrace : unit -> unit = "fp_backtrace" external fp_backtrace_no_alloc : unit -> unit = "fp_backtrace" [@@noalloc] external fp_backtrace_many_args : int -> int -> int -> int -> int -> int -> int diff --git a/testsuite/tests/frame-pointers/c_call.reference b/testsuite/tests/frame-pointers/c_call.reference index 92fb40a2389..94e62717a9c 100644 --- a/testsuite/tests/frame-pointers/c_call.reference +++ b/testsuite/tests/frame-pointers/c_call.reference @@ -1,19 +1,19 @@ fp_backtrace_many_args caml_c_call_stack_args -camlC_call.f +camlC_call.f_0_1_code camlC_call.entry caml_program caml_start_program caml_main/caml_startup main caml_c_call -camlC_call.f +camlC_call.f_0_1_code camlC_call.entry caml_program caml_start_program caml_main/caml_startup main -camlC_call.f +camlC_call.f_0_1_code camlC_call.entry caml_program caml_start_program diff --git a/testsuite/tests/frame-pointers/effects.ml b/testsuite/tests/frame-pointers/effects.ml index 3dabbc651eb..2405e632037 100644 --- a/testsuite/tests/frame-pointers/effects.ml +++ b/testsuite/tests/frame-pointers/effects.ml @@ -1,14 +1,14 @@ (* TEST - * skip - - -* skip -reason - "OCaml 5 only" -** frame_pointers -*** native -readonly_files = "fp_backtrace.c" -all_modules = "${readonly_files} effects.ml" - + { + skip; + }{ + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + frame_pointers; + readonly_files = "fp_backtrace.c"; + all_modules = "${readonly_files} effects.ml"; + native; + } *) open Printf diff --git a/testsuite/tests/frame-pointers/exception_handler.ml b/testsuite/tests/frame-pointers/exception_handler.ml index 56676119b71..1ee1b217ee3 100644 --- a/testsuite/tests/frame-pointers/exception_handler.ml +++ b/testsuite/tests/frame-pointers/exception_handler.ml @@ -1,14 +1,15 @@ (* TEST - -* skip -reason = "OCaml 5 only" -** frame_pointers -*** native -readonly_files = "fp_backtrace.c" -all_modules = "${readonly_files} exception_handler.ml" - + runtime5; + frame_pointers; + readonly_files = "fp_backtrace.c"; + all_modules = "${readonly_files} exception_handler.ml"; + native; *) +(* Force -O3 to ensure the "_code" symbols are present (see the + reference file). *) +[@@@ocaml.flambda_o3] + (* https://github.com/ocaml/ocaml/pull/11031 *) external fp_backtrace : unit -> unit = "fp_backtrace" [@@noalloc] diff --git a/testsuite/tests/frame-pointers/exception_handler.reference b/testsuite/tests/frame-pointers/exception_handler.reference index 513ca488b92..03fe7c64d51 100644 --- a/testsuite/tests/frame-pointers/exception_handler.reference +++ b/testsuite/tests/frame-pointers/exception_handler.reference @@ -1,26 +1,26 @@ -camlException_handler.handler -camlException_handler.bare +camlException_handler.handler_2_7_code +camlException_handler.bare_4_9_code camlException_handler.entry caml_program caml_start_program caml_main/caml_startup main -camlException_handler.handler -camlException_handler.bare +camlException_handler.handler_2_7_code +camlException_handler.bare_4_9_code camlException_handler.entry caml_program caml_start_program caml_main/caml_startup main -camlException_handler.handler -camlException_handler.nested +camlException_handler.handler_2_7_code +camlException_handler.nested_3_8_code camlException_handler.entry caml_program caml_start_program caml_main/caml_startup main -camlException_handler.handler -camlException_handler.nested +camlException_handler.handler_2_7_code +camlException_handler.nested_3_8_code camlException_handler.entry caml_program caml_start_program diff --git a/testsuite/tests/frame-pointers/reperform.ml b/testsuite/tests/frame-pointers/reperform.ml index 74925f56297..bc0bfb74833 100644 --- a/testsuite/tests/frame-pointers/reperform.ml +++ b/testsuite/tests/frame-pointers/reperform.ml @@ -1,15 +1,14 @@ (* TEST - * skip - - -* skip -reason - "OCaml 5 only" -** frame_pointers -*** native - -readonly_files = "fp_backtrace.c" -all_modules = "${readonly_files} reperform.ml" - + { + skip; + }{ + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + frame_pointers; + readonly_files = "fp_backtrace.c"; + all_modules = "${readonly_files} reperform.ml"; + native; + } *) open Effect diff --git a/testsuite/tests/frame-pointers/stack_realloc.ml b/testsuite/tests/frame-pointers/stack_realloc.ml index e1e88afe4ce..26a6e6049c0 100644 --- a/testsuite/tests/frame-pointers/stack_realloc.ml +++ b/testsuite/tests/frame-pointers/stack_realloc.ml @@ -1,15 +1,14 @@ (* TEST - * skip - - -* skip -reason - "OCaml 5 only" -** frame_pointers -*** native - -readonly_files = "fp_backtrace.c stack_realloc_.c" -all_modules = "${readonly_files} stack_realloc.ml" - + { + skip; + }{ + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + frame_pointers; + readonly_files = "fp_backtrace.c stack_realloc_.c"; + all_modules = "${readonly_files} stack_realloc.ml"; + native; + } *) open Effect diff --git a/testsuite/tests/frame-pointers/stack_realloc2.ml b/testsuite/tests/frame-pointers/stack_realloc2.ml index 9a4c5f5b24f..ce505b087cf 100644 --- a/testsuite/tests/frame-pointers/stack_realloc2.ml +++ b/testsuite/tests/frame-pointers/stack_realloc2.ml @@ -1,15 +1,14 @@ (* TEST - * skip - - -* skip -reason - "OCaml 5 only" -** frame_pointers -*** native - -readonly_files = "fp_backtrace.c stack_realloc_.c" -all_modules = "${readonly_files} stack_realloc2.ml" - + { + skip; + }{ + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + frame_pointers; + readonly_files = "fp_backtrace.c stack_realloc_.c"; + all_modules = "${readonly_files} stack_realloc2.ml"; + native; + } *) open Effect diff --git a/testsuite/tests/functors/functors.compilers.reference b/testsuite/tests/functors/functors.compilers.reference index 88d3278eaac..bce6f410e33 100644 --- a/testsuite/tests/functors/functors.compilers.reference +++ b/testsuite/tests/functors/functors.compilers.reference @@ -1,16 +1,14 @@ (setglobal Functors! (let (O = - (function {nlocal = 0} X is_a_functor always_inline - ignore assert all zero_alloc never_loop + (function {nlocal = 0} X is_a_functor always_inline never_loop (let (cow = (function {nlocal = 0} x[int] : int (apply (field_imm 0 X) x)) sheep = (function {nlocal = 0} x[int] : int (+ 1 (apply cow x)))) (makeblock 0 cow sheep))) F = - (function {nlocal = 0} X Y is_a_functor always_inline - ignore assert all zero_alloc never_loop + (function {nlocal = 0} X Y is_a_functor always_inline never_loop (let (cow = (function {nlocal = 0} x[int] : int @@ -18,8 +16,7 @@ sheep = (function {nlocal = 0} x[int] : int (+ 1 (apply cow x)))) (makeblock 0 cow sheep))) F1 = - (function {nlocal = 0} X Y is_a_functor always_inline - ignore assert all zero_alloc never_loop + (function {nlocal = 0} X Y is_a_functor always_inline never_loop (let (cow = (function {nlocal = 0} x[int] : int @@ -27,8 +24,7 @@ sheep = (function {nlocal = 0} x[int] : int (+ 1 (apply cow x)))) (makeblock 0 sheep))) F2 = - (function {nlocal = 0} X Y is_a_functor always_inline - ignore assert all zero_alloc never_loop + (function {nlocal = 0} X Y is_a_functor always_inline never_loop (let (X =a (makeblock 0 (field_imm 1 X)) Y =a (makeblock 0 (field_imm 1 Y)) @@ -40,8 +36,7 @@ M = (let (F = - (function {nlocal = 0} X Y is_a_functor always_inline - ignore assert all zero_alloc never_loop + (function {nlocal = 0} X Y is_a_functor always_inline never_loop (let (cow = (function {nlocal = 0} x[int] : int @@ -51,7 +46,6 @@ (makeblock 0 cow sheep)))) (makeblock 0 (function {nlocal = 0} funarg funarg is_a_functor stub - ignore assert all zero_alloc (let (let = (apply F (makeblock 0 (field_imm 1 funarg)) diff --git a/testsuite/tests/functors/functors.ml b/testsuite/tests/functors/functors.ml index 3e40fc61475..0518f718444 100644 --- a/testsuite/tests/functors/functors.ml +++ b/testsuite/tests/functors/functors.ml @@ -1,8 +1,8 @@ (* TEST - * setup-ocamlc.byte-build-env - ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" - *** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + flags = "-dlambda -dno-unique-ids"; + ocamlc.byte; + check-ocamlc.byte-output; *) module type S = sig diff --git a/testsuite/tests/gc-roots/globroots.ml b/testsuite/tests/gc-roots/globroots.ml index 60f93816d6b..52283d34015 100644 --- a/testsuite/tests/gc-roots/globroots.ml +++ b/testsuite/tests/gc-roots/globroots.ml @@ -1,5 +1,5 @@ (* TEST - modules = "globrootsprim.c" + modules = "globrootsprim.c"; *) module type GLOBREF = sig @@ -26,27 +26,14 @@ module Generational : GLOBREF = struct external remove: t -> unit = "gb_generational_remove" end -(* BACKPORT BEGIN *) -module Domain = struct - module DLS = struct - let get t = Lazy.force t - end -end -(* BACKPORT END *) - module Test(G: GLOBREF) () = struct let size = 1024 let random_state = - (* BACKPORT BEGIN Domain.DLS.new_key ~split_from_parent:Random.State.split Random.State.make_self_init - *) - lazy (Random.State.make_self_init ()) - (* BACKPORT END *) - let vals = Array.init size Int.to_string diff --git a/testsuite/tests/gc-roots/globroots_parallel.ml b/testsuite/tests/gc-roots/globroots_parallel.ml index 9b316229753..74f6808682c 100644 --- a/testsuite/tests/gc-roots/globroots_parallel.ml +++ b/testsuite/tests/gc-roots/globroots_parallel.ml @@ -1,9 +1,8 @@ (* TEST - flags += " -w a " - modules = "globrootsprim.c globroots.ml" - - * skip - reason = "OCaml 5 only" + flags += " -w a "; + modules = "globrootsprim.c globroots.ml"; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) open Globroots diff --git a/testsuite/tests/gc-roots/globroots_parallel_spawn_burn.ml b/testsuite/tests/gc-roots/globroots_parallel_spawn_burn.ml index 47099d201dc..bdafc0da706 100644 --- a/testsuite/tests/gc-roots/globroots_parallel_spawn_burn.ml +++ b/testsuite/tests/gc-roots/globroots_parallel_spawn_burn.ml @@ -1,9 +1,8 @@ (* TEST - flags += " -w a " - modules = "globrootsprim.c globroots.ml" - - * skip - reason = "OCaml 5 only" + flags += " -w a "; + modules = "globrootsprim.c globroots.ml"; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) open Globroots diff --git a/testsuite/tests/gc-roots/globroots_sequential.ml b/testsuite/tests/gc-roots/globroots_sequential.ml index 6bf995bf96b..8c9f82e2570 100644 --- a/testsuite/tests/gc-roots/globroots_sequential.ml +++ b/testsuite/tests/gc-roots/globroots_sequential.ml @@ -1,6 +1,6 @@ (* TEST - flags += " -w a " - modules = "globrootsprim.c globroots.ml" + flags += " -w a "; + modules = "globrootsprim.c globroots.ml"; *) open Globroots diff --git a/testsuite/tests/gc-roots/globrootsprim.c b/testsuite/tests/gc-roots/globrootsprim.c index 2f9df707bd7..10280a12672 100644 --- a/testsuite/tests/gc-roots/globrootsprim.c +++ b/testsuite/tests/gc-roots/globrootsprim.c @@ -13,17 +13,15 @@ /* For testing global root registration */ -/* BACKPORT #define CAML_INTERNALS -*/ #include "caml/mlvalues.h" #include "caml/memory.h" #include "caml/alloc.h" #include "caml/gc.h" -/* BACKPORT +#ifdef CAML_RUNTIME_5 #include "caml/shared_heap.h" -*/ +#endif #include "caml/callback.h" struct block { value header; value v; }; @@ -39,11 +37,11 @@ value gb_get(value vblock) value gb_classic_register(value v) { struct block * b = caml_stat_alloc(sizeof(struct block)); - /* BACKPORT BEGIN +#ifdef CAML_RUNTIME_5 b->header = Make_header(1, 0, NOT_MARKABLE); - */ +#else b->header = Make_header(1, 0, Caml_black); - /* BACKPORT END */ +#endif b->v = v; caml_register_global_root(&(b->v)); return Val_block(b); @@ -64,11 +62,11 @@ value gb_classic_remove(value vblock) value gb_generational_register(value v) { struct block * b = caml_stat_alloc(sizeof(struct block)); - /* BACKPORT BEGIN +#ifdef CAML_RUNTIME_5 b->header = Make_header(1, 0, NOT_MARKABLE); - */ +#else b->header = Make_header(1, 0, Caml_black); - /* BACKPORT END */ +#endif b->v = v; caml_register_generational_global_root(&(b->v)); return Val_block(b); diff --git a/testsuite/tests/generalized-open/accepted_expect.ml b/testsuite/tests/generalized-open/accepted_expect.ml index 01c94c275b1..a373e0cfde5 100644 --- a/testsuite/tests/generalized-open/accepted_expect.ml +++ b/testsuite/tests/generalized-open/accepted_expect.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) open Set.Make(String);; diff --git a/testsuite/tests/generalized-open/clambda_optim.ml b/testsuite/tests/generalized-open/clambda_optim.ml index d7ca317ea60..9d24784f85d 100644 --- a/testsuite/tests/generalized-open/clambda_optim.ml +++ b/testsuite/tests/generalized-open/clambda_optim.ml @@ -1,12 +1,9 @@ (* TEST - -compile_only = "true" - -* no-flambda -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -**** check-ocamlopt.byte-output - + compile_only = "true"; + no-flambda; + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + check-ocamlopt.byte-output; *) module Stable = struct diff --git a/testsuite/tests/generalized-open/expansiveness.ml b/testsuite/tests/generalized-open/expansiveness.ml index b2a55012f43..0e833d74e9d 100644 --- a/testsuite/tests/generalized-open/expansiveness.ml +++ b/testsuite/tests/generalized-open/expansiveness.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Fn = struct diff --git a/testsuite/tests/generalized-open/funct_body.ml b/testsuite/tests/generalized-open/funct_body.ml index 4490f77392e..d20f4d2c537 100644 --- a/testsuite/tests/generalized-open/funct_body.ml +++ b/testsuite/tests/generalized-open/funct_body.ml @@ -1,8 +1,8 @@ -(* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) module type T = sig @@ -45,3 +45,13 @@ module O = F(M) let () = O.f N.x + +(* TEST + setup-ocamlc.byte-build-env; + { + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + }{ + check-ocamlc.byte-output; + } +*) diff --git a/testsuite/tests/generalized-open/gpr1506.ml b/testsuite/tests/generalized-open/gpr1506.ml index a6c8daa1057..c057a363f41 100644 --- a/testsuite/tests/generalized-open/gpr1506.ml +++ b/testsuite/tests/generalized-open/gpr1506.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = A @@ -12,7 +12,7 @@ module M = struct type t = B of t * t' | C end [%%expect{| -module M : sig type t = B of t * t/2 | C end +module M : sig type t = B of t/1 * t/2 | C end |}] (* test *) diff --git a/testsuite/tests/generalized-open/pr10048.ml b/testsuite/tests/generalized-open/pr10048.ml index d6f29322b03..8284bae912f 100644 --- a/testsuite/tests/generalized-open/pr10048.ml +++ b/testsuite/tests/generalized-open/pr10048.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Ext (X : sig type 'a t end) = struct type t = T : 'a X.t -> t diff --git a/testsuite/tests/generalized-open/shadowing.ml b/testsuite/tests/generalized-open/shadowing.ml index 589807d3672..37a62346629 100644 --- a/testsuite/tests/generalized-open/shadowing.ml +++ b/testsuite/tests/generalized-open/shadowing.ml @@ -1,8 +1,11 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "0" -** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + { + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + }{ + check-ocamlc.byte-output; + } *) module Make_sure_val : sig diff --git a/testsuite/tests/generated-parse-errors/errors.compilers.reference b/testsuite/tests/generated-parse-errors/errors.compilers.reference index 672efabffb0..24dd6f207c8 100644 --- a/testsuite/tests/generated-parse-errors/errors.compilers.reference +++ b/testsuite/tests/generated-parse-errors/errors.compilers.reference @@ -1088,7 +1088,7 @@ File "implementation: LETOP UIDENT DOT WITH", line 1, characters 14-18: Error: Syntax error File "implementation: LETOP UIDENT LIDENT WITH", line 1, characters 19-23: Error: Syntax error -File "implementation: LETOP UIDENT TILDE", line 1, characters 12-13: +File "implementation: LETOP UIDENT TILDE", line 1, characters 0-2: Error: Syntax error File "implementation: LETOP UIDENT WITH", line 1, characters 12-16: Error: Syntax error diff --git a/testsuite/tests/generated-parse-errors/errors.ml b/testsuite/tests/generated-parse-errors/errors.ml index c1f11f44163..19cf705a075 100644 --- a/testsuite/tests/generated-parse-errors/errors.ml +++ b/testsuite/tests/generated-parse-errors/errors.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) #0 "use_file: HASH LIDENT TRUE WITH" # lident true with diff --git a/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference b/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference new file mode 100644 index 00000000000..2d834047bf9 --- /dev/null +++ b/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference @@ -0,0 +1,4 @@ +File "libc/c3.ml", line 1, characters 8-11: +1 | let x = A.x + 1 + ^^^ +Error: Unbound module A diff --git a/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference b/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference new file mode 100644 index 00000000000..2f75db7acbc --- /dev/null +++ b/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference @@ -0,0 +1,4 @@ +File "libc/c4.ml", line 2, characters 8-11: +2 | let y = A.x + 1 + ^^^ +Error: Unbound module A diff --git a/testsuite/tests/hidden_includes/liba/a.ml b/testsuite/tests/hidden_includes/liba/a.ml new file mode 100644 index 00000000000..22b40309256 --- /dev/null +++ b/testsuite/tests/hidden_includes/liba/a.ml @@ -0,0 +1,5 @@ +type t = int + +let x = 1 + +type s = Baz diff --git a/testsuite/tests/hidden_includes/liba_alt/a.ml b/testsuite/tests/hidden_includes/liba_alt/a.ml new file mode 100644 index 00000000000..e907a667ba2 --- /dev/null +++ b/testsuite/tests/hidden_includes/liba_alt/a.ml @@ -0,0 +1,3 @@ +type t = string + +let x = "hi" diff --git a/testsuite/tests/hidden_includes/libb/b.ml b/testsuite/tests/hidden_includes/libb/b.ml new file mode 100644 index 00000000000..7e41643e960 --- /dev/null +++ b/testsuite/tests/hidden_includes/libb/b.ml @@ -0,0 +1,7 @@ +type t = A.t + +let x : A.t = A.x + +let f : A.t -> A.t = fun x -> x + +let g : A.s -> unit = fun _ -> () diff --git a/testsuite/tests/hidden_includes/libc/c1.ml b/testsuite/tests/hidden_includes/libc/c1.ml new file mode 100644 index 00000000000..e0e5a1fd8d9 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c1.ml @@ -0,0 +1,3 @@ +let x = B.x + 1 + +let () = Printf.printf "%d\n" x diff --git a/testsuite/tests/hidden_includes/libc/c2.ml b/testsuite/tests/hidden_includes/libc/c2.ml new file mode 100644 index 00000000000..dee5a2e74b9 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c2.ml @@ -0,0 +1 @@ +let x = B.f B.x diff --git a/testsuite/tests/hidden_includes/libc/c3.ml b/testsuite/tests/hidden_includes/libc/c3.ml new file mode 100644 index 00000000000..88c0aa8d0d6 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c3.ml @@ -0,0 +1 @@ +let x = A.x + 1 diff --git a/testsuite/tests/hidden_includes/libc/c4.ml b/testsuite/tests/hidden_includes/libc/c4.ml new file mode 100644 index 00000000000..7c14a26c835 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c4.ml @@ -0,0 +1,6 @@ +let x = B.x + 1 +let y = A.x + 1 + +(* Typing x requires loading A's cmi. When it is made available with -H, y + should fail to typecheck because direct references to A are not allowed, even + though it has been loaded. *) diff --git a/testsuite/tests/hidden_includes/libc/c5.ml b/testsuite/tests/hidden_includes/libc/c5.ml new file mode 100644 index 00000000000..bd0715ec1e8 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c5.ml @@ -0,0 +1,7 @@ +let _ = B.g Baz + +(* Type-directed disambiguation: Baz is defined in A, and even when a.cmi is + provided with -H this still typechecks. It's not obvious that this is + necessary (rejecting this program also seems fine, in that case), but this + test is here to record the current behavior so any change will be + intentional. *) diff --git a/testsuite/tests/hidden_includes/missing_cmi_layout.ocamlc.reference b/testsuite/tests/hidden_includes/missing_cmi_layout.ocamlc.reference new file mode 100644 index 00000000000..21a74e94d8e --- /dev/null +++ b/testsuite/tests/hidden_includes/missing_cmi_layout.ocamlc.reference @@ -0,0 +1,10 @@ +File "libc/c2.ml", line 1, characters 12-15: +1 | let x = B.f B.x + ^^^ +Error: Function arguments and returns must be representable. + The layout of A.t is any + because the .cmi file for A.t is missing. + But the layout of A.t must be representable + because we must know concretely how to pass a function argument. + No .cmi file found containing A.t. + Hint: Adding "a" to your dependencies might help. diff --git a/testsuite/tests/hidden_includes/not_included.ocamlc.reference b/testsuite/tests/hidden_includes/not_included.ocamlc.reference new file mode 100644 index 00000000000..f27c83562dc --- /dev/null +++ b/testsuite/tests/hidden_includes/not_included.ocamlc.reference @@ -0,0 +1,7 @@ +File "libc/c1.ml", line 1, characters 8-11: +1 | let x = B.x + 1 + ^^^ +Error: This expression has type A.t but an expression was expected of type + int + Type A.t is abstract because no corresponding cmi file was found + in path. diff --git a/testsuite/tests/hidden_includes/test.ml b/testsuite/tests/hidden_includes/test.ml new file mode 100644 index 00000000000..c6f19425ca6 --- /dev/null +++ b/testsuite/tests/hidden_includes/test.ml @@ -0,0 +1,164 @@ +(* TEST +(* This tests the -H flag. + + The basic structure is that libc depends on libb, which depends on liba. We + want to test a few things: + + - Compiling libc with -I liba allows the compiler to see the type definitions + in liba and allows c.ml to reference it directly. + + - Compiling libc with -H liba allows the compiler to see the type definitions + in liba, but doesn't allow c.ml to reference it directly. + + - If -H and -I are are passed for two different versions of liba, the -I one + takes priority. + + - If -H is passed twice with two different versions of liba, the first takes + priority. + + The liba_alt directory has an alternate versions of liba used for testing the + precedence order of the includes. +*) + +subdirectories = "liba liba_alt libb libc"; +setup-ocamlc.byte-build-env; + +flags = "-I liba -nocwd"; +module = "liba/a.ml"; +ocamlc.byte; + +flags = "-I liba_alt -nocwd"; +module = "liba_alt/a.ml"; +ocamlc.byte; + +flags = "-I liba -I libb -nocwd"; +module = "libb/b.ml"; +ocamlc.byte; +{ + (* Test hiding A completely. You can't do much with types from it because + their layouts are unknown. *) + flags = "-I libb -nocwd"; + module = "libc/c2.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/missing_cmi_layout.ocamlc.reference"; + check-ocamlc.byte-output; +} +{ + (* Test hiding A completely, but using it *) + flags = "-I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/not_included.ocamlc.reference"; + check-ocamlc.byte-output; +} +{ + (* Test transitive use of A's cmi with -I. *) + flags = "-I liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + (* Test transitive use of A's cmi with -H. *) + flags = "-H liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + (* Test direct use of A cmi with -H. *) + flags = "-H liba -I libb -nocwd"; + module = "libc/c3.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/cant_reference_hidden.ocamlc.reference"; + check-ocamlc.byte-output; +} + +(* The next four tests check that -I takes priority over -H regardless of the + order on the command line. +*) +{ + flags = "-H liba_alt -I liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + flags = "-I liba -H liba_alt -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + not-windows; + flags = "-H liba -I liba_alt -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/wrong_include_order.ocamlc.reference"; + check-ocamlc.byte-output; +} +{ + not-windows; + flags = "-I liba_alt -H liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/wrong_include_order.ocamlc.reference"; + check-ocamlc.byte-output; +} + +(* The next two tests show that earlier -Hs take priority over later -Hs *) +{ + not-windows; + flags = "-H liba_alt -H liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/wrong_include_order.ocamlc.reference"; + check-ocamlc.byte-output; +} +{ + flags = "-H liba -H liba_alt -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} + +(* Test that a hidden `A` doesn't become visible as a result of the typechecker + using it. *) +{ + flags = "-H liba -I libb -nocwd"; + module = "libc/c4.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/hidden_stays_hidden.ocamlc.reference"; + check-ocamlc.byte-output; +} + +(* Test that type-directed constructor disambiguation works through -H (at + least, for now). *) +{ + flags = "-H liba -I libb -nocwd"; + module = "libc/c5.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} + +*) diff --git a/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference b/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference new file mode 100644 index 00000000000..cb4538eb625 --- /dev/null +++ b/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference @@ -0,0 +1,3 @@ +File "libc/c1.ml", line 1: +Error: The files libb/b.cmi and liba_alt/a.cmi make inconsistent assumptions + over interface A diff --git a/testsuite/tests/instrumented-runtime/main.ml b/testsuite/tests/instrumented-runtime/main.ml index 4b0260df8d5..b9f8eded7f6 100644 --- a/testsuite/tests/instrumented-runtime/main.ml +++ b/testsuite/tests/instrumented-runtime/main.ml @@ -1,7 +1,8 @@ (* TEST - * instrumented-runtime - ** native - flags = "-runtime-variant=i" + runtime4; + instrumented-runtime; + flags = "-runtime-variant=i"; + native; *) (* Test if the instrumented runtime is in working condition *) diff --git a/testsuite/tests/int64-unboxing/test.ml b/testsuite/tests/int64-unboxing/test.ml index bc94ba1166b..80fae8792cb 100644 --- a/testsuite/tests/int64-unboxing/test.ml +++ b/testsuite/tests/int64-unboxing/test.ml @@ -1,6 +1,6 @@ (* TEST - modules = "stubs.c" - * native + modules = "stubs.c"; + native; *) external ( + ) : int64 -> int64 -> int64 diff --git a/testsuite/tests/jane-modular-syntax/attribute_locations.ml b/testsuite/tests/jane-modular-syntax/attribute_locations.ml index 7d7ae20b114..d8eddf4bcb4 100644 --- a/testsuite/tests/jane-modular-syntax/attribute_locations.ml +++ b/testsuite/tests/jane-modular-syntax/attribute_locations.ml @@ -1,5 +1,6 @@ (* TEST - include ocamlcommon *) + include ocamlcommon; +*) let () = Language_extension.enable Comprehensions ();; diff --git a/testsuite/tests/jane-modular-syntax/user_error1.compilers.reference b/testsuite/tests/jane-modular-syntax/user_error1.compilers.reference index 30145e46aed..f16ecea9b41 100644 --- a/testsuite/tests/jane-modular-syntax/user_error1.compilers.reference +++ b/testsuite/tests/jane-modular-syntax/user_error1.compilers.reference @@ -1,5 +1,5 @@ -File "user_error1.ml", line 21, characters 44-67: -21 | let _malformed_extension_has_payload = () [@jane.erasable.something "no payloads"];; - ^^^^^^^^^^^^^^^^^^^^^^^ +File "user_error1.ml", line 21, characters 44-65: +21 | let _malformed_extension_has_payload = () [@jane.erasable.layouts "no payloads"];; + ^^^^^^^^^^^^^^^^^^^^^ Error: Modular syntax attributes are not allowed to have a payload, - but "jane.erasable.something" does + but "jane.erasable.layouts" does diff --git a/testsuite/tests/jane-modular-syntax/user_error1.ml b/testsuite/tests/jane-modular-syntax/user_error1.ml index 27c5c550d66..d88a189d3b9 100644 --- a/testsuite/tests/jane-modular-syntax/user_error1.ml +++ b/testsuite/tests/jane-modular-syntax/user_error1.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* What happens if the user tries to write one of the pieces of Jane Street @@ -18,5 +18,5 @@ like it in separate files, because the "compile and test output" infrastructure reports only one error at a time. *) -let _malformed_extension_has_payload = () [@jane.erasable.something "no payloads"];; +let _malformed_extension_has_payload = () [@jane.erasable.layouts "no payloads"];; diff --git a/testsuite/tests/jane-modular-syntax/user_error2.ml b/testsuite/tests/jane-modular-syntax/user_error2.ml index 805f5cd4ded..909fb0bd3d9 100644 --- a/testsuite/tests/jane-modular-syntax/user_error2.ml +++ b/testsuite/tests/jane-modular-syntax/user_error2.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* What happens if the user tries to write one of the pieces of Jane Street diff --git a/testsuite/tests/jane-modular-syntax/user_error3.ml b/testsuite/tests/jane-modular-syntax/user_error3.ml index a18058ccb60..39d19dfa8dd 100644 --- a/testsuite/tests/jane-modular-syntax/user_error3.ml +++ b/testsuite/tests/jane-modular-syntax/user_error3.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* What happens if the user tries to write one of the pieces of Jane Street diff --git a/testsuite/tests/jane-modular-syntax/user_error3_1.ml b/testsuite/tests/jane-modular-syntax/user_error3_1.ml index 4131439b873..c8757518ebf 100644 --- a/testsuite/tests/jane-modular-syntax/user_error3_1.ml +++ b/testsuite/tests/jane-modular-syntax/user_error3_1.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* See the comment in user_error3.ml *) diff --git a/testsuite/tests/jane-modular-syntax/user_error3_2.ml b/testsuite/tests/jane-modular-syntax/user_error3_2.ml index 9fdf36a3130..501aa358998 100644 --- a/testsuite/tests/jane-modular-syntax/user_error3_2.ml +++ b/testsuite/tests/jane-modular-syntax/user_error3_2.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* See the comment in user_error3.ml *) diff --git a/testsuite/tests/jane-modular-syntax/user_error3_3.ml b/testsuite/tests/jane-modular-syntax/user_error3_3.ml index ffc73b28cc7..4ed4326e69e 100644 --- a/testsuite/tests/jane-modular-syntax/user_error3_3.ml +++ b/testsuite/tests/jane-modular-syntax/user_error3_3.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* See the comment in user_error3.ml *) diff --git a/testsuite/tests/jane-modular-syntax/user_error4.ml b/testsuite/tests/jane-modular-syntax/user_error4.ml index e5575810e9b..c7b1a3cc5cb 100644 --- a/testsuite/tests/jane-modular-syntax/user_error4.ml +++ b/testsuite/tests/jane-modular-syntax/user_error4.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* What happens if the user tries to write one of the pieces of Jane Street diff --git a/testsuite/tests/jane-modular-syntax/user_error5.ml b/testsuite/tests/jane-modular-syntax/user_error5.ml index fa27f2addd7..54479012b0c 100644 --- a/testsuite/tests/jane-modular-syntax/user_error5.ml +++ b/testsuite/tests/jane-modular-syntax/user_error5.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* What happens if the user tries to write one of the pieces of Jane Street diff --git a/testsuite/tests/jane-modular-syntax/user_error6.ml b/testsuite/tests/jane-modular-syntax/user_error6.ml index b126a93dd5e..1c201e81634 100644 --- a/testsuite/tests/jane-modular-syntax/user_error6.ml +++ b/testsuite/tests/jane-modular-syntax/user_error6.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* What happens if the user tries to write one of the pieces of Jane Street diff --git a/testsuite/tests/jane-modular-syntax/user_error7_attributes.ml b/testsuite/tests/jane-modular-syntax/user_error7_attributes.ml index 1f3c13e811e..a193693112a 100644 --- a/testsuite/tests/jane-modular-syntax/user_error7_attributes.ml +++ b/testsuite/tests/jane-modular-syntax/user_error7_attributes.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + - flags = "-w +A-60-70" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - compile_only = "true" - *** check-ocamlc.byte-output *) @@ -23,3 +23,11 @@ let[@jane] f () = ();; (* We can't use expect test here because warning 53 is only raised by ocamlc, not the toplevel. This is probably a bug. *) + +(* TEST + flags = "-w +A-60-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/jane-modular-syntax/user_error7_extensions.ml b/testsuite/tests/jane-modular-syntax/user_error7_extensions.ml index 02a30ee8916..2ecf7dda1fe 100644 --- a/testsuite/tests/jane-modular-syntax/user_error7_extensions.ml +++ b/testsuite/tests/jane-modular-syntax/user_error7_extensions.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* If we use extension nodes outside of the context they are expected, diff --git a/testsuite/tests/language-extensions/language_extensions.ml b/testsuite/tests/language-extensions/language_extensions.ml index 6cdbe1f708a..7a1817e7461 100644 --- a/testsuite/tests/language-extensions/language_extensions.ml +++ b/testsuite/tests/language-extensions/language_extensions.ml @@ -1,6 +1,6 @@ (* TEST - include ocamlcommon - flags = "-I ${ocamlsrcdir}/parsing" + include ocamlcommon; + flags = "-I ${ocamlsrcdir}/parsing"; *) (* Change these two variables to change which extension is being tested *) @@ -50,11 +50,11 @@ let should_fail name f = | exception Arg.Bad msg -> "Failed as expected: " ^ msg) ;; -let try_disallowing_extensions name = +let try_setting_universe univ name = should_succeed name - "disallowing all extensions" - Language_extension.disallow_extensions + ("setting universe " ^ Language_extension.Universe.to_string univ) + (fun () -> Language_extension.set_universe_and_enable_all univ) ;; type goal = Fail | Succeed @@ -63,14 +63,15 @@ let with_goal goal ~name ~what test = match goal with | Fail -> should_fail name test | Succeed -> should_succeed name what test -let when_disallowed goal f_str f = +let when_universe univ goal f_str f = let can_or_can't = match goal with | Fail -> "can't" | Succeed -> "can" in let f_code = "[" ^ f_str ^ "]" in with_goal goal - ~name:(can_or_can't ^ " call " ^ f_code ^ " when extensions are disallowed") + ~name:(can_or_can't ^ " call " ^ f_code ^ " when in universe " + ^ Language_extension.Universe.to_string univ) ~what:("redundantly calling " ^ f_code) (fun () -> f extension) ;; @@ -174,38 +175,38 @@ report ~name:"Enable two layouts, in reverse order" then "Succeeded" else "Failed");; -(* Test disallowing extensions *) +(* Test [No_extension] universe. *) -try_disallowing_extensions - "can disallow extensions while extensions are enabled"; +try_setting_universe No_extensions + "can set [No_extensions] while extensions are enabled"; -try_disallowing_extensions - "can disallow extensions while extensions are already disallowed"; +try_setting_universe No_extensions + "setting [No_extensions] is idempotent"; (* Test that disallowing extensions prevents other functions from working *) -when_disallowed Fail "set ~enabled:true" +when_universe No_extensions Fail "set ~enabled:true" (Language_extension.set ~enabled:true); -when_disallowed Succeed "set ~enabled:false" +when_universe No_extensions Succeed "set ~enabled:false" (Language_extension.set ~enabled:false); -when_disallowed Fail "enable" +when_universe No_extensions Fail "enable" (fun x -> Language_extension.enable x ()); -when_disallowed Succeed "disable" +when_universe No_extensions Succeed "disable" Language_extension.disable; -when_disallowed Fail "with_set ~enabled:true" +when_universe No_extensions Fail "with_set ~enabled:true" (Language_extension.with_set ~enabled:true |> lift_with); -when_disallowed Succeed "with_set ~enabled:false" +when_universe No_extensions Succeed "with_set ~enabled:false" (Language_extension.with_set ~enabled:false |> lift_with); -when_disallowed Fail "with_enabled" +when_universe No_extensions Fail "with_enabled" ((fun x -> Language_extension.with_enabled x ()) |> lift_with); -when_disallowed Succeed "with_disabled" +when_universe No_extensions Succeed "with_disabled" (Language_extension.with_disabled |> lift_with); (* Test explicitly (rather than just via [report]) that [is_enabled] returns @@ -217,6 +218,38 @@ report then "INCORRECTLY enabled" else "correctly disabled"); +(* Test [Stable] universe. *) + +try_setting_universe Stable + "can set [Stable] while extensions are disabled"; + +(* Test that some extensions work in [Stable] while others don't. *) + +when_universe Stable Succeed "Language_extension.(enable Layouts Stable)" + (fun _ -> Language_extension.(enable Layouts Stable)); + +when_universe Stable Fail "Language_extension.(enable Comprehensions) " + (fun _ -> Language_extension.(enable Comprehensions ())); + +when_universe Stable Fail "Language_extension.(enable Layouts Alpha)" + (fun _ -> Language_extension.(enable Layouts Alpha)); + +(* Test [Beta] universe. *) + +try_setting_universe Beta "can set [Beta] from [Stable]"; + +(* Test that comprehensions is enabled by default in [Beta]: *) + +typecheck_with_extension "enabled via [Universe.set]"; + +when_universe Stable Succeed "Language_extension.(enable Comprehensions) " + (fun _ -> Language_extension.(enable Comprehensions ())); + +(* Test that [Layouts Alpha] is still disabled. *) + +when_universe Stable Fail "Language_extension.(enable Layouts Alpha)" + (fun _ -> Language_extension.(enable Layouts Alpha)); + (* Test that language extensions round-trip via string *) List.iter (fun (Language_extension.Exist.Pack x) -> diff --git a/testsuite/tests/language-extensions/language_extensions.reference b/testsuite/tests/language-extensions/language_extensions.reference index 0b0298c3696..e6536e0cb5e 100644 --- a/testsuite/tests/language-extensions/language_extensions.reference +++ b/testsuite/tests/language-extensions/language_extensions.reference @@ -61,36 +61,60 @@ Succeeded # Enable two layouts, in reverse order [comprehensions enabled]: Succeeded -# can disallow extensions while extensions are enabled [comprehensions disabled]: -Succeeded at disallowing all extensions +# can set [No_extensions] while extensions are enabled [comprehensions disabled]: +Succeeded at setting universe no_extensions -# can disallow extensions while extensions are already disallowed [comprehensions disabled]: -Succeeded at disallowing all extensions +# setting [No_extensions] is idempotent [comprehensions disabled]: +Succeeded at setting universe no_extensions -# can't call [set ~enabled:true] when extensions are disallowed [comprehensions disabled]: -Failed as expected: Cannot enable extension comprehensions: incompatible with flag -disable-all-extensions +# can't call [set ~enabled:true] when in universe no_extensions [comprehensions disabled]: +Failed as expected: Cannot enable extension comprehensions: incompatible with flag -extension-universe no_extensions -# can call [set ~enabled:false] when extensions are disallowed [comprehensions disabled]: +# can call [set ~enabled:false] when in universe no_extensions [comprehensions disabled]: Succeeded at redundantly calling [set ~enabled:false] -# can't call [enable] when extensions are disallowed [comprehensions disabled]: -Failed as expected: Cannot enable extension comprehensions: incompatible with flag -disable-all-extensions +# can't call [enable] when in universe no_extensions [comprehensions disabled]: +Failed as expected: Cannot enable extension comprehensions: incompatible with flag -extension-universe no_extensions -# can call [disable] when extensions are disallowed [comprehensions disabled]: +# can call [disable] when in universe no_extensions [comprehensions disabled]: Succeeded at redundantly calling [disable] -# can't call [with_set ~enabled:true] when extensions are disallowed [comprehensions disabled]: -Failed as expected: Cannot enable extension comprehensions: incompatible with flag -disable-all-extensions +# can't call [with_set ~enabled:true] when in universe no_extensions [comprehensions disabled]: +Failed as expected: Cannot enable extension comprehensions: incompatible with flag -extension-universe no_extensions -# can call [with_set ~enabled:false] when extensions are disallowed [comprehensions disabled]: +# can call [with_set ~enabled:false] when in universe no_extensions [comprehensions disabled]: Succeeded at redundantly calling [with_set ~enabled:false] -# can't call [with_enabled] when extensions are disallowed [comprehensions disabled]: -Failed as expected: Cannot enable extension comprehensions: incompatible with flag -disable-all-extensions +# can't call [with_enabled] when in universe no_extensions [comprehensions disabled]: +Failed as expected: Cannot enable extension comprehensions: incompatible with flag -extension-universe no_extensions -# can call [with_disabled] when extensions are disallowed [comprehensions disabled]: +# can call [with_disabled] when in universe no_extensions [comprehensions disabled]: Succeeded at redundantly calling [with_disabled] # [is_enabled] returns [false] when extensions are disallowed [comprehensions disabled]: "comprehensions" is correctly disabled +# can set [Stable] while extensions are disabled [comprehensions disabled]: +Succeeded at setting universe stable + +# can call [Language_extension.(enable Layouts Stable)] when in universe stable [comprehensions disabled]: +Succeeded at redundantly calling [Language_extension.(enable Layouts Stable)] + +# can't call [Language_extension.(enable Comprehensions) ] when in universe stable [comprehensions disabled]: +Failed as expected: Cannot enable extension comprehensions: incompatible with flag -extension-universe stable + +# can't call [Language_extension.(enable Layouts Alpha)] when in universe stable [comprehensions disabled]: +Failed as expected: Cannot enable extension layouts_alpha: incompatible with flag -extension-universe stable + +# can set [Beta] from [Stable] [comprehensions enabled]: +Succeeded at setting universe beta + +# "comprehensions" extension enabled via [Universe.set] [comprehensions enabled]: +Successfully typechecked "[x for x = 1 to 10]" + +# can call [Language_extension.(enable Comprehensions) ] when in universe stable [comprehensions enabled]: +Succeeded at redundantly calling [Language_extension.(enable Comprehensions) ] + +# can't call [Language_extension.(enable Layouts Alpha)] when in universe stable [comprehensions enabled]: +Failed as expected: Cannot enable extension layouts_alpha: incompatible with flag -extension-universe beta + diff --git a/testsuite/tests/language-extensions/pprintast_unconditional.ml b/testsuite/tests/language-extensions/pprintast_unconditional.ml index 05e0b700935..491cfdcc764 100644 --- a/testsuite/tests/language-extensions/pprintast_unconditional.ml +++ b/testsuite/tests/language-extensions/pprintast_unconditional.ml @@ -1,12 +1,13 @@ (* TEST - include ocamlcommon - flags = "-I ${ocamlsrcdir}/parsing" + include ocamlcommon; + flags = "-I ${ocamlsrcdir}/parsing"; *) (******************************************************************************) (* Setup *) -let () = Language_extension.enable_maximal ();; +let () = Language_extension.set_universe_and_enable_all + Language_extension.Universe.maximal;; module Example = struct open Parsetree @@ -17,6 +18,47 @@ module Example = struct let parse p str = p (Lexing.from_string str) end + let modality_record = parse module_expr + "struct \ + type t = {global_ x : string; global_ y : int} \ + end" + let modality_cstrarg = parse module_expr + "struct \ + type t = Foo of global_ string * global_ string \ + type u = Foo : global_ string * global_ string -> u \ + end" + + let modality_val = parse module_type + "sig \ + val t : string -> string @ local @@ foo bar \ + end" + + let local_exp = parse expression "let x = foo (local_ x) in local_ y" + + let modal_kind_struct = + parse module_expr "struct \ + type 'a list : immutable_data with 'a \ + type ('a, 'b) either : immutable_data with 'a * 'b \ + type 'a gel : kind_of_ 'a mod global \ + type 'a t : _ \ + kind_abbrev_ immediate = value mod global unique many sync uncontended \ + kind_abbrev_ immutable_data = value mod sync uncontended many \ + kind_abbrev_ immutable = value mod uncontended \ + kind_abbrev_ data = value mod sync many \ + end" + + let modal_kind_sig = + parse module_type "sig \ + type 'a list : immutable_data with 'a \ + type ('a, 'b) either : immutable_data with 'a * 'b \ + type 'a gel : kind_of_ 'a mod global \ + type 'a t : _ \ + kind_abbrev_ immediate = value mod global unique many sync uncontended \ + kind_abbrev_ immutable_data = value mod sync uncontended many \ + kind_abbrev_ immutable = value mod uncontended \ + kind_abbrev_ data = value mod sync many \ + end" + let longident = parse longident "No.Longidents.Require.extensions" let expression = parse expression "[x for x = 1 to 10]" let pattern = parse pattern "[:_:]" @@ -76,6 +118,14 @@ module Example = struct ; ptype_loc = loc } let tyvar = "no_tyvars_require_extensions" + let jkind = Jane_syntax.Jkind.( + With ( + Abbreviation + (Const.mk "value" loc), + core_type + )) + + let mode = Jane_syntax.Mode_expr.Const.mk "global" loc end let print_test_header name = @@ -123,6 +173,12 @@ end = struct Test.setup () ;; + let modality_record = test "modality_record" module_expr Example.modality_record + let modality_cstrarg = test "modality_cstrarg" module_expr Example.modality_cstrarg + let modality_val = test "modality_val" module_type Example.modality_val + + let local_exp = test "local_exp" expression Example.local_exp + let longident = test "longident" longident Example.longident let expression = test "expression" expression Example.expression let pattern = test "pattern" pattern Example.pattern @@ -146,8 +202,12 @@ end = struct let string_of_expression = test_string_of "string_of_expression" string_of_expression Example.expression let string_of_structure = test_string_of "string_of_structure" string_of_structure Example.structure + let modal_kind_struct = test "modal_kind_struct" module_expr Example.modal_kind_struct + let modal_kind_sig = test "modal_kind_sig" module_type Example.modal_kind_sig let tyvar = test "tyvar" tyvar Example.tyvar + let jkind = test "jkind" jkind Example.jkind + let mode = test "mode" mode Example.mode end @@ -159,7 +219,8 @@ module _ = Print_all (struct let name = "All extensions enabled" - let setup () = Language_extension.enable_maximal () + let setup () = Language_extension.set_universe_and_enable_all + Language_extension.Universe.maximal end) () ;; @@ -171,7 +232,7 @@ module _ = Print_all (struct let name = "Extensions disallowed" - let setup () = Language_extension.disallow_extensions () + let setup () = Language_extension.set_universe_and_enable_all No_extensions end) () ;; diff --git a/testsuite/tests/language-extensions/pprintast_unconditional.reference b/testsuite/tests/language-extensions/pprintast_unconditional.reference index 462e16842d0..e796a012a5d 100644 --- a/testsuite/tests/language-extensions/pprintast_unconditional.reference +++ b/testsuite/tests/language-extensions/pprintast_unconditional.reference @@ -1,6 +1,22 @@ ##### All extensions enabled -------------------------------- +modality_record: struct type t = { + global_ x: string ; + global_ y: int } end + +modality_cstrarg: + struct + type t = + | Foo of global_ string * global_ string + type u = + | Foo: global_ string * global_ string -> u + end + +modality_val: sig val t : string -> local_ string @@ foo bar end + +local_exp: let x = foo (local_ x) in local_ y + longident: No.Longidents.Require.extensions expression: [x for x = 1 to 10] @@ -51,13 +67,57 @@ string_of_expression: [x for x = 1 to 10] string_of_structure: include functor F +modal_kind_struct: + struct + type 'a list : immutable_data with 'a + type ('a, 'b) either : immutable_data with ('a * 'b) + type 'a gel : kind_of_ 'a mod global + type 'a t : _ + kind_abbrev_ immediate = value mod global unique many sync uncontended + kind_abbrev_ immutable_data = value mod sync uncontended many + kind_abbrev_ immutable = value mod uncontended + kind_abbrev_ data = value mod sync many + end + +modal_kind_sig: + sig + type 'a list : immutable_data with 'a + type ('a, 'b) either : immutable_data with ('a * 'b) + type 'a gel : kind_of_ 'a mod global + type 'a t : _ + kind_abbrev_ immediate = value mod global unique many sync uncontended + kind_abbrev_ immutable_data = value mod sync uncontended many + kind_abbrev_ immutable = value mod uncontended + kind_abbrev_ data = value mod sync many + end + tyvar: 'no_tyvars_require_extensions +jkind: value with local_ ('a : value) -> unit + +mode: global + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ##### Extensions disallowed -------------------------------- +modality_record: struct type t = { + global_ x: string ; + global_ y: int } end + +modality_cstrarg: + struct + type t = + | Foo of global_ string * global_ string + type u = + | Foo: global_ string * global_ string -> u + end + +modality_val: sig val t : string -> local_ string @@ foo bar end + +local_exp: let x = foo (local_ x) in local_ y + longident: No.Longidents.Require.extensions expression: [x for x = 1 to 10] @@ -108,8 +168,36 @@ string_of_expression: [x for x = 1 to 10] string_of_structure: include functor F +modal_kind_struct: + struct + type 'a list : immutable_data with 'a + type ('a, 'b) either : immutable_data with ('a * 'b) + type 'a gel : kind_of_ 'a mod global + type 'a t : _ + kind_abbrev_ immediate = value mod global unique many sync uncontended + kind_abbrev_ immutable_data = value mod sync uncontended many + kind_abbrev_ immutable = value mod uncontended + kind_abbrev_ data = value mod sync many + end + +modal_kind_sig: + sig + type 'a list : immutable_data with 'a + type ('a, 'b) either : immutable_data with ('a * 'b) + type 'a gel : kind_of_ 'a mod global + type 'a t : _ + kind_abbrev_ immediate = value mod global unique many sync uncontended + kind_abbrev_ immutable_data = value mod sync uncontended many + kind_abbrev_ immutable = value mod uncontended + kind_abbrev_ data = value mod sync many + end + tyvar: 'no_tyvars_require_extensions +jkind: value with local_ ('a : value) -> unit + +mode: global + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ##### Calling [Language_extension.For_pprintast.make_printer_exporter ()] diff --git a/testsuite/tests/lazy/lazy1.ml b/testsuite/tests/lazy/lazy1.ml index f88e93da69f..e2e0a2a78ac 100644 --- a/testsuite/tests/lazy/lazy1.ml +++ b/testsuite/tests/lazy/lazy1.ml @@ -1,5 +1,5 @@ (* TEST - ocamlopt_flags += " -O3 " + ocamlopt_flags += " -O3 "; *) (* Mantis 7301, due to A. Frisch *) diff --git a/testsuite/tests/lazy/lazy2.ml b/testsuite/tests/lazy/lazy2.ml index 4fabe6006f3..478cf5acbe0 100644 --- a/testsuite/tests/lazy/lazy2.ml +++ b/testsuite/tests/lazy/lazy2.ml @@ -1,7 +1,7 @@ (* TEST - ocamlopt_flags += " -O3 " - * skip - reason = "OCaml 5 only" + ocamlopt_flags += " -O3 "; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) open Domain diff --git a/testsuite/tests/lazy/lazy3.ml b/testsuite/tests/lazy/lazy3.ml index ad8b37ae815..76843888e9e 100644 --- a/testsuite/tests/lazy/lazy3.ml +++ b/testsuite/tests/lazy/lazy3.ml @@ -1,7 +1,7 @@ (* TEST - ocamlopt_flags += " -O3 " - * skip - reason = "OCaml 5 only" + ocamlopt_flags += " -O3 "; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let f count = diff --git a/testsuite/tests/lazy/lazy4.ml b/testsuite/tests/lazy/lazy4.ml index 3988318c79e..9d4acdd99f6 100644 --- a/testsuite/tests/lazy/lazy4.ml +++ b/testsuite/tests/lazy/lazy4.ml @@ -1,5 +1,5 @@ (* TEST - ocamlopt_flags += " -O3 " + ocamlopt_flags += " -O3 "; *) let r = ref None diff --git a/testsuite/tests/lazy/lazy5.ml b/testsuite/tests/lazy/lazy5.ml index 695a39561ea..b220581ecc1 100644 --- a/testsuite/tests/lazy/lazy5.ml +++ b/testsuite/tests/lazy/lazy5.ml @@ -1,7 +1,7 @@ (* TEST - ocamlopt_flags += " -O3 " - * skip - reason = "OCaml 5 only" + ocamlopt_flags += " -O3 "; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let rec safe_force l = try Lazy.force l with diff --git a/testsuite/tests/lazy/lazy6.ml b/testsuite/tests/lazy/lazy6.ml index 47217a483b3..e07b60c3156 100644 --- a/testsuite/tests/lazy/lazy6.ml +++ b/testsuite/tests/lazy/lazy6.ml @@ -1,7 +1,7 @@ (* TEST - ocamlopt_flags += " -O3 " - * skip - reason = "OCaml 5 only" + ocamlopt_flags += " -O3 "; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let flag1 = Atomic.make false diff --git a/testsuite/tests/lazy/lazy7.ml b/testsuite/tests/lazy/lazy7.ml index 19e08465cff..d27aa248db7 100644 --- a/testsuite/tests/lazy/lazy7.ml +++ b/testsuite/tests/lazy/lazy7.ml @@ -1,7 +1,7 @@ (* TEST - ocamlopt_flags += " -O3 " - * skip - reason = "OCaml 5 only" + ocamlopt_flags += " -O3 "; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let num_domains = 4 diff --git a/testsuite/tests/lazy/lazy8.ml b/testsuite/tests/lazy/lazy8.ml index d031a13c7b5..48c5bca29e7 100644 --- a/testsuite/tests/lazy/lazy8.ml +++ b/testsuite/tests/lazy/lazy8.ml @@ -1,7 +1,7 @@ (* TEST - ocamlopt_flags += " -O3 " - * skip - reason = "OCaml 5 only" + ocamlopt_flags += " -O3 "; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) exception E diff --git a/testsuite/tests/lazy/minor_major_force.ml b/testsuite/tests/lazy/minor_major_force.ml index 90f45dc27cf..78edb4487f2 100644 --- a/testsuite/tests/lazy/minor_major_force.ml +++ b/testsuite/tests/lazy/minor_major_force.ml @@ -1,8 +1,8 @@ (* TEST - ocamlopt_flags += " -O3 " - - * skip - reason = "OCaml 5 only" + ocamlopt_flags += " -O3 "; + runtime5; + { bytecode; } + { native; } *) (* diff --git a/testsuite/tests/let-syntax/let_syntax.ml b/testsuite/tests/let-syntax/let_syntax.ml index 9824bb53095..67ca3c6fcc2 100644 --- a/testsuite/tests/let-syntax/let_syntax.ml +++ b/testsuite/tests/let-syntax/let_syntax.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let id x = x diff --git a/testsuite/tests/letrec-check/basic.ml b/testsuite/tests/letrec-check/basic.ml index 595212802fb..caa8c238ed6 100644 --- a/testsuite/tests/letrec-check/basic.ml +++ b/testsuite/tests/letrec-check/basic.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let rec x = (x; ());; diff --git a/testsuite/tests/letrec-check/extension_constructor.ml b/testsuite/tests/letrec-check/extension_constructor.ml index 93171ae1dc8..007be5b8dde 100644 --- a/testsuite/tests/letrec-check/extension_constructor.ml +++ b/testsuite/tests/letrec-check/extension_constructor.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Example from Stephen Dolan. diff --git a/testsuite/tests/letrec-check/flat_float_array.ml b/testsuite/tests/letrec-check/flat_float_array.ml index e49064cc4d1..56912f44c8d 100644 --- a/testsuite/tests/letrec-check/flat_float_array.ml +++ b/testsuite/tests/letrec-check/flat_float_array.ml @@ -1,6 +1,6 @@ (* TEST - * flat-float-array - ** expect + flat-float-array; + expect; *) (* When the -flat-float-array optimization is active (standard in diff --git a/testsuite/tests/letrec-check/float_unboxing.ml b/testsuite/tests/letrec-check/float_unboxing.ml index 6ef268f85d4..142841312ef 100644 --- a/testsuite/tests/letrec-check/float_unboxing.ml +++ b/testsuite/tests/letrec-check/float_unboxing.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* This program is a minimal example which segfault if diff --git a/testsuite/tests/letrec-check/labels.ml b/testsuite/tests/letrec-check/labels.ml index e8b28342b86..46f8bed903d 100644 --- a/testsuite/tests/letrec-check/labels.ml +++ b/testsuite/tests/letrec-check/labels.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f ~x () = x ();; diff --git a/testsuite/tests/letrec-check/lazy_.ml b/testsuite/tests/letrec-check/lazy_.ml index 3bec9ec77d0..5af54bfe377 100644 --- a/testsuite/tests/letrec-check/lazy_.ml +++ b/testsuite/tests/letrec-check/lazy_.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let rec a = lazy b and b = 3;; diff --git a/testsuite/tests/letrec-check/modules.ml b/testsuite/tests/letrec-check/modules.ml index fc55f76b665..af4e3aeb589 100644 --- a/testsuite/tests/letrec-check/modules.ml +++ b/testsuite/tests/letrec-check/modules.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let rec x = let module M = struct let f = x end in ();; diff --git a/testsuite/tests/letrec-check/no_flat_float_array.ml b/testsuite/tests/letrec-check/no_flat_float_array.ml index 394669bfdc1..fd952c4df81 100644 --- a/testsuite/tests/letrec-check/no_flat_float_array.ml +++ b/testsuite/tests/letrec-check/no_flat_float_array.ml @@ -1,6 +1,6 @@ (* TEST - * no-flat-float-array - ** expect + no-flat-float-array; + expect; *) (* See float_block_disallowed.ml for explanations. diff --git a/testsuite/tests/letrec-check/objects.ml b/testsuite/tests/letrec-check/objects.ml index a223450e495..c3066290b07 100644 --- a/testsuite/tests/letrec-check/objects.ml +++ b/testsuite/tests/letrec-check/objects.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class c = object end diff --git a/testsuite/tests/letrec-check/pr7215.ml b/testsuite/tests/letrec-check/pr7215.ml index 0a13bd6e833..487cdc3ede5 100644 --- a/testsuite/tests/letrec-check/pr7215.ml +++ b/testsuite/tests/letrec-check/pr7215.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* From Stephen Dolan *) diff --git a/testsuite/tests/letrec-check/pr7231.ml b/testsuite/tests/letrec-check/pr7231.ml index b2ddf3c2b3b..7625e4df996 100644 --- a/testsuite/tests/letrec-check/pr7231.ml +++ b/testsuite/tests/letrec-check/pr7231.ml @@ -1,5 +1,9 @@ -(* TEST - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) let rec r = let rec x () = r and y () = x () in y () in r "oops";; + +(* TEST + toplevel; +*) diff --git a/testsuite/tests/letrec-check/pr7706.ml b/testsuite/tests/letrec-check/pr7706.ml index 87403cd5a28..f566bff7eea 100644 --- a/testsuite/tests/letrec-check/pr7706.ml +++ b/testsuite/tests/letrec-check/pr7706.ml @@ -1,8 +1,12 @@ -(* TEST - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) let rec x = let y = if false then (fun z -> 1) else (fun z -> x 4 + 1) in y;; let () = ignore (x 42);; + +(* TEST + toplevel; +*) diff --git a/testsuite/tests/letrec-check/records.ml b/testsuite/tests/letrec-check/records.ml index db11d41eb7e..2076fd227be 100644 --- a/testsuite/tests/letrec-check/records.ml +++ b/testsuite/tests/letrec-check/records.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = { x : int; self : t };; [%%expect {| diff --git a/testsuite/tests/letrec-check/unboxed.ml b/testsuite/tests/letrec-check/unboxed.ml index b1b86167e0d..12c914325cd 100644 --- a/testsuite/tests/letrec-check/unboxed.ml +++ b/testsuite/tests/letrec-check/unboxed.ml @@ -1,5 +1,8 @@ (* TEST - * expect + expect; +*) +(* CR layouts: Using layout annotations here is not backward-compatible. + We can delete this when internal ticket 1110 is resolved. *) type r = R of r list [@@unboxed] @@ -20,7 +23,7 @@ Line 2, characters 12-19: Error: This kind of expression is not allowed as right-hand side of `let rec' |}];; -type r = A of r [@@unboxed] [@@value] +type r : value = A of r [@@unboxed] let rec y = A y;; [%%expect{| type r : value = A of r [@@unboxed] diff --git a/testsuite/tests/letrec-compilation/region.ml b/testsuite/tests/letrec-compilation/region.ml new file mode 100644 index 00000000000..84104036d69 --- /dev/null +++ b/testsuite/tests/letrec-compilation/region.ml @@ -0,0 +1,19 @@ +(* TEST *) + +(* Recursive values are not allowed to be stack-allocated, but their + defining expressions are allowed to make allocations on the stack. + This can introduce a region around the whole definition. *) + +let rec f = + let p = local_ (fun msg -> print_string msg) in + p "hello, "; + p "world!"; + print_newline (); + fun x -> f x + +(* Original bug report: unused function *) +let rec foo = + let _f x = x, foo in + function + | None -> foo None + | Some x -> x diff --git a/testsuite/tests/letrec-compilation/region.reference b/testsuite/tests/letrec-compilation/region.reference new file mode 100644 index 00000000000..270c611ee72 --- /dev/null +++ b/testsuite/tests/letrec-compilation/region.reference @@ -0,0 +1 @@ +hello, world! diff --git a/testsuite/tests/letrec-compilation/store_in_local.ml b/testsuite/tests/letrec-compilation/store_in_local.ml new file mode 100644 index 00000000000..085f6803b58 --- /dev/null +++ b/testsuite/tests/letrec-compilation/store_in_local.ml @@ -0,0 +1,7 @@ +(* TEST *) + +(* If stack allocation is enabled, the record will be allocated locally. + This is allowed by the type-checker, but the dissect_letrec code + choked on it. *) +type t = { a : int } +let rec x = let _ = { a = x } in 3 diff --git a/testsuite/tests/lexing/comments.ml b/testsuite/tests/lexing/comments.ml index a7c9f2758d8..99701d96080 100644 --- a/testsuite/tests/lexing/comments.ml +++ b/testsuite/tests/lexing/comments.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* "*)" *) diff --git a/testsuite/tests/lexing/escape.ml b/testsuite/tests/lexing/escape.ml index bcb753131a2..8e6abbad05e 100644 --- a/testsuite/tests/lexing/escape.ml +++ b/testsuite/tests/lexing/escape.ml @@ -1,5 +1,5 @@ -(* TEST - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) (* Errors *) @@ -9,3 +9,7 @@ let invalid = "\999" ;; let invalid = "\o777" ;; let invalid = "\o77" ;; let invalid = "\o99" ;; + +(* TEST + toplevel; +*) diff --git a/testsuite/tests/lexing/uchar_esc.ml b/testsuite/tests/lexing/uchar_esc.ml index 3e7b5379dae..77e328acd43 100644 --- a/testsuite/tests/lexing/uchar_esc.ml +++ b/testsuite/tests/lexing/uchar_esc.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* Correct escapes and their encoding *) diff --git a/testsuite/tests/lf_skiplist/test.ml b/testsuite/tests/lf_skiplist/test.ml index 9118c4eab78..4ad8d0f796c 100644 --- a/testsuite/tests/lf_skiplist/test.ml +++ b/testsuite/tests/lf_skiplist/test.ml @@ -1,8 +1,8 @@ (* TEST - modules = "stubs.c" - - * skip - reason = "OCaml 5 only" + modules = "stubs.c"; + runtime5; + { bytecode; } + { native; } *) external test_skiplist_serial : unit -> unit = "test_skiplist_serial" diff --git a/testsuite/tests/lf_skiplist/test_parallel.ml b/testsuite/tests/lf_skiplist/test_parallel.ml index d75d2d63fe5..81789d9cc66 100644 --- a/testsuite/tests/lf_skiplist/test_parallel.ml +++ b/testsuite/tests/lf_skiplist/test_parallel.ml @@ -1,8 +1,7 @@ (* TEST - modules = "stubs.c" - - * skip - reason = "OCaml 5 only" + modules = "stubs.c"; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) external init_skiplist : unit -> unit = "init_skiplist" diff --git a/testsuite/tests/lib-arg/test_rest_all.ml b/testsuite/tests/lib-arg/test_rest_all.ml index b0ac3c1eb50..81475013c18 100644 --- a/testsuite/tests/lib-arg/test_rest_all.ml +++ b/testsuite/tests/lib-arg/test_rest_all.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type arg = AString of string | ARest of string | ARest_all of string list diff --git a/testsuite/tests/lib-arg/testerror.ml b/testsuite/tests/lib-arg/testerror.ml index 6bcf0fdeb89..0bbd5dce9bb 100644 --- a/testsuite/tests/lib-arg/testerror.ml +++ b/testsuite/tests/lib-arg/testerror.ml @@ -1,5 +1,5 @@ (* TEST - * native + native; *) (** Test that the right message errors are emitted by Arg *) diff --git a/testsuite/tests/lib-array/iarray_singleton.ml b/testsuite/tests/lib-array/iarray_singleton.ml index 7c54d72c5a7..9000c35caf3 100644 --- a/testsuite/tests/lib-array/iarray_singleton.ml +++ b/testsuite/tests/lib-array/iarray_singleton.ml @@ -1,6 +1,6 @@ (* TEST - * native - *) + native; +*) (* this failed at one point on flambda2 with -O3: https://github.com/ocaml-flambda/flambda-backend/pull/1457 *) diff --git a/testsuite/tests/lib-array/iarrays_with_variables.ml b/testsuite/tests/lib-array/iarrays_with_variables.ml index 1bf87334cfa..24b1274fb1e 100644 --- a/testsuite/tests/lib-array/iarrays_with_variables.ml +++ b/testsuite/tests/lib-array/iarrays_with_variables.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let one = Sys.opaque_identity 1;; diff --git a/testsuite/tests/lib-array/test_array.ml b/testsuite/tests/lib-array/test_array.ml index b3399e98de7..c5b6143db69 100644 --- a/testsuite/tests/lib-array/test_array.ml +++ b/testsuite/tests/lib-array/test_array.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let a = Array.make 8 None;; diff --git a/testsuite/tests/lib-array/test_iarray.ml b/testsuite/tests/lib-array/test_iarray.ml index 936d92eae11..2d7fe8e9612 100644 --- a/testsuite/tests/lib-array/test_iarray.ml +++ b/testsuite/tests/lib-array/test_iarray.ml @@ -1,8 +1,9 @@ (* TEST - * expect + include stdlib_stable; + expect; *) -module Iarray = Stdlib__Iarray;; +module Iarray = Stdlib_stable.Iarray;; external ( .:() ) : 'a iarray -> int -> 'a = "%array_safe_get";; @@ -15,7 +16,7 @@ let marray : int array = [|1;2;3;4;5|];; let mfarray : float array = [|1.5;2.5;3.5;4.5;5.5|];; [%%expect{| -module Iarray = Stdlib__Iarray +module Iarray = Stdlib_stable.Iarray external ( .:() ) : 'a iarray -> int -> 'a = "%array_safe_get" val iarray : int iarray = [:1; 2; 3; 4; 5:] val ifarray : float iarray = [:1.5; 2.5; 3.5; 4.5; 5.5:] diff --git a/testsuite/tests/lib-bigarray-2/bigarrcml.ml b/testsuite/tests/lib-bigarray-2/bigarrcml.ml index 27f83ffae4a..643fb86a9f1 100644 --- a/testsuite/tests/lib-bigarray-2/bigarrcml.ml +++ b/testsuite/tests/lib-bigarray-2/bigarrcml.ml @@ -1,7 +1,5 @@ (* TEST - -modules = "bigarrcstub.c" - + modules = "bigarrcstub.c"; *) open Bigarray diff --git a/testsuite/tests/lib-bigarray-2/bigarrfml.ml b/testsuite/tests/lib-bigarray-2/bigarrfml.ml index a31e545c1ac..05ba7b27717 100644 --- a/testsuite/tests/lib-bigarray-2/bigarrfml.ml +++ b/testsuite/tests/lib-bigarray-2/bigarrfml.ml @@ -1,31 +1,29 @@ (* TEST - -readonly_files = "bigarrf.f bigarrfstub.c" -last_flags = "-cclib -lgfortran" - -* script -script = "sh ${test_source_directory}/has-gfortran.sh" - -** setup-ocamlc.byte-build-env -*** script -script = "sh ${test_source_directory}/call-gfortran.sh ${cc} -c bigarrf.f" -**** ocamlc.byte -all_modules = "bigarrf.o bigarrfstub.c bigarrfml.ml" -***** run -output = "${test_build_directory}/program-output" -stdout = "${output}" -****** check-program-output - -** setup-ocamlopt.byte-build-env -*** script -script = "sh ${test_source_directory}/call-gfortran.sh ${cc} -c bigarrf.f" -**** ocamlopt.byte -all_modules = "bigarrf.o bigarrfstub.c bigarrfml.ml" -***** run -output = "${test_build_directory}/program-output" -stdout = "${output}" -****** check-program-output - + readonly_files = "bigarrf.f bigarrfstub.c"; + last_flags = "-cclib -lgfortran"; + script = "sh ${test_source_directory}/has-gfortran.sh"; + script; + { + setup-ocamlc.byte-build-env; + script = "sh ${test_source_directory}/call-gfortran.sh ${cc} -c bigarrf.f"; + script; + all_modules = "bigarrf.o bigarrfstub.c bigarrfml.ml"; + ocamlc.byte; + output = "${test_build_directory}/program-output"; + stdout = "${output}"; + run; + check-program-output; + }{ + setup-ocamlopt.byte-build-env; + script = "sh ${test_source_directory}/call-gfortran.sh ${cc} -c bigarrf.f"; + script; + all_modules = "bigarrf.o bigarrfstub.c bigarrfml.ml"; + ocamlopt.byte; + output = "${test_build_directory}/program-output"; + stdout = "${output}"; + run; + check-program-output; + } *) open Bigarray diff --git a/testsuite/tests/lib-bigarray-file/mapfile.ml b/testsuite/tests/lib-bigarray-file/mapfile.ml index a359cd1bcca..f4008b7d8fc 100644 --- a/testsuite/tests/lib-bigarray-file/mapfile.ml +++ b/testsuite/tests/lib-bigarray-file/mapfile.ml @@ -1,7 +1,7 @@ (* TEST - * hasunix - include unix - ** native + include unix; + hasunix; + native; *) open Bigarray diff --git a/testsuite/tests/lib-bigarray/bigarrays.ml b/testsuite/tests/lib-bigarray/bigarrays.ml index c2d558c0684..e9ce2296f57 100644 --- a/testsuite/tests/lib-bigarray/bigarrays.ml +++ b/testsuite/tests/lib-bigarray/bigarrays.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) open Bigarray open Printf diff --git a/testsuite/tests/lib-bigarray/fftba.ml b/testsuite/tests/lib-bigarray/fftba.ml index a06ad1bc13c..ee35acfcb79 100644 --- a/testsuite/tests/lib-bigarray/fftba.ml +++ b/testsuite/tests/lib-bigarray/fftba.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) open Bigarray diff --git a/testsuite/tests/lib-bigarray/pr5115.ml b/testsuite/tests/lib-bigarray/pr5115.ml index 74cbe51446e..9b47d9a9c1a 100644 --- a/testsuite/tests/lib-bigarray/pr5115.ml +++ b/testsuite/tests/lib-bigarray/pr5115.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* PR#5115 - multiple evaluation of bigarray expr *) diff --git a/testsuite/tests/lib-bigarray/weak_bigarray.ml b/testsuite/tests/lib-bigarray/weak_bigarray.ml index a0758120c90..76fdee98295 100644 --- a/testsuite/tests/lib-bigarray/weak_bigarray.ml +++ b/testsuite/tests/lib-bigarray/weak_bigarray.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** check that custom block are not copied by Weak.get_copy *) diff --git a/testsuite/tests/lib-bool/test.ml b/testsuite/tests/lib-bool/test.ml index e5a4bcf905d..6a3c92bd167 100644 --- a/testsuite/tests/lib-bool/test.ml +++ b/testsuite/tests/lib-bool/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let test_not () = assert (Bool.not false = true); diff --git a/testsuite/tests/lib-buffer/test.ml b/testsuite/tests/lib-buffer/test.ml index 7b1ab9a475c..d1ba265be37 100644 --- a/testsuite/tests/lib-buffer/test.ml +++ b/testsuite/tests/lib-buffer/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) open Printf ;; diff --git a/testsuite/tests/lib-bytes-utf/test.ml b/testsuite/tests/lib-bytes-utf/test.ml index ac3483071f0..7c5677b5651 100644 --- a/testsuite/tests/lib-bytes-utf/test.ml +++ b/testsuite/tests/lib-bytes-utf/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* UTF codec tests *) diff --git a/testsuite/tests/lib-bytes/binary.ml b/testsuite/tests/lib-bytes/binary.ml index 899cdfe0995..43ab4b4b8f7 100644 --- a/testsuite/tests/lib-bytes/binary.ml +++ b/testsuite/tests/lib-bytes/binary.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let err x = match Lazy.force x with diff --git a/testsuite/tests/lib-bytes/test_bytes.ml b/testsuite/tests/lib-bytes/test_bytes.ml index 1ea7281c7b7..7349a074874 100644 --- a/testsuite/tests/lib-bytes/test_bytes.ml +++ b/testsuite/tests/lib-bytes/test_bytes.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) let test_raises_invalid_argument f x = diff --git a/testsuite/tests/lib-channels/close_in.ml b/testsuite/tests/lib-channels/close_in.ml index 8c51c7d52cf..68129fe5c3d 100644 --- a/testsuite/tests/lib-channels/close_in.ml +++ b/testsuite/tests/lib-channels/close_in.ml @@ -1,7 +1,8 @@ (* TEST -* skip -reason = "OCaml 5 only" - *) + runtime5; + { bytecode; } + { native; } +*) (* Test that inputting bytes from a closed in_channel triggers an exception *) diff --git a/testsuite/tests/lib-channels/input_all.ml b/testsuite/tests/lib-channels/input_all.ml index 711eed73691..1fe6e4b345a 100644 --- a/testsuite/tests/lib-channels/input_all.ml +++ b/testsuite/tests/lib-channels/input_all.ml @@ -1,11 +1,12 @@ (* TEST - -* hassysthreads -include systhreads -readonly_files = "input_all.ml" -** bytecode -** native - + include systhreads; + readonly_files = "input_all.ml"; + hassysthreads; + { + bytecode; + }{ + native; + } *) let data_file = diff --git a/testsuite/tests/lib-channels/input_lines.ml b/testsuite/tests/lib-channels/input_lines.ml index 2c377ee06c9..c2932785269 100644 --- a/testsuite/tests/lib-channels/input_lines.ml +++ b/testsuite/tests/lib-channels/input_lines.ml @@ -1,6 +1,4 @@ -(* TEST - -*) +(* TEST *) open Printf diff --git a/testsuite/tests/lib-channels/refcounting.ml b/testsuite/tests/lib-channels/refcounting.ml index deaba0a3ee0..84776f440b4 100644 --- a/testsuite/tests/lib-channels/refcounting.ml +++ b/testsuite/tests/lib-channels/refcounting.ml @@ -1,7 +1,7 @@ (* TEST - * skip - reason = "OCaml 5 only" - ** expect + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + expect; *) (* Test the behavior of channel refcounting. *) diff --git a/testsuite/tests/lib-digest/md5.ml b/testsuite/tests/lib-digest/md5.ml index d66ba52257d..3d234c7f2f7 100644 --- a/testsuite/tests/lib-digest/md5.ml +++ b/testsuite/tests/lib-digest/md5.ml @@ -1,5 +1,5 @@ (* TEST - flags += " -w -a " + flags += " -w -a "; *) (* Test int32 arithmetic and optimizations using the MD5 algorithm *) diff --git a/testsuite/tests/lib-dynlink-bytecode/main.ml b/testsuite/tests/lib-dynlink-bytecode/main.ml index dfeaa5dde99..d8070a4aa89 100644 --- a/testsuite/tests/lib-dynlink-bytecode/main.ml +++ b/testsuite/tests/lib-dynlink-bytecode/main.ml @@ -1,58 +1,53 @@ (* TEST - -include dynlink - -ld_library_path += "${test_build_directory}" - -readonly_files = "plug1.ml plug2.ml registry.ml stub1.c stub2.c" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -compile_only = "true" -all_modules = "registry.ml stub1.c stub2.c plug1.ml plug2.ml main.ml" -**** ocamlmklib -program = "plug1" -modules = "stub1.${objext}" -***** ocamlmklib -program = "plug2" -modules = "stub2.${objext}" -****** ocamlmklib -program = "plug1" -modules = "plug1.cmo" -******* ocamlmklib -program = "plug2" -modules = "plug2.cmo" - -compile_only = "false" - -******** ocamlc.byte -program = "${test_build_directory}/main.exe" -all_modules = "registry.cmo main.cmo" -********* run -arguments = "plug1.cma plug2.cma" -output = "main.output" -********** check-program-output - -******** ocamlc.byte -program = "${test_build_directory}/static.exe" -flags = "-linkall" -all_modules = "registry.cmo plug1.cma plug2.cma" -********* run -output = "static.output" -********** check-program-output -reference = "${test_source_directory}/static.reference" - -******** ocamlc.byte -program = "${test_build_directory}/custom.exe" -flags = "-custom -linkall -I ." -all_modules = "registry.cmo plug2.cma plug1.cma" -use_runtime = "false" -********* run -output = "custom.output" -********** check-program-output -reference = "${test_source_directory}/custom.reference" - + include dynlink; + ld_library_path += "${test_build_directory}"; + readonly_files = "plug1.ml plug2.ml registry.ml stub1.c stub2.c"; + shared-libraries; + setup-ocamlc.byte-build-env; + compile_only = "true"; + all_modules = "registry.ml stub1.c stub2.c plug1.ml plug2.ml main.ml"; + ocamlc.byte; + program = "plug1"; + modules = "stub1.${objext}"; + ocamlmklib; + program = "plug2"; + modules = "stub2.${objext}"; + ocamlmklib; + program = "plug1"; + modules = "plug1.cmo"; + ocamlmklib; + program = "plug2"; + modules = "plug2.cmo"; + compile_only = "false"; + ocamlmklib; + { + program = "${test_build_directory}/main.exe"; + all_modules = "registry.cmo main.cmo"; + ocamlc.byte; + arguments = "plug1.cma plug2.cma"; + output = "main.output"; + run; + check-program-output; + }{ + program = "${test_build_directory}/static.exe"; + flags = "-linkall"; + all_modules = "registry.cmo plug1.cma plug2.cma"; + ocamlc.byte; + output = "static.output"; + run; + reference = "${test_source_directory}/static.reference"; + check-program-output; + }{ + program = "${test_build_directory}/custom.exe"; + flags = "-custom -linkall -I ."; + all_modules = "registry.cmo plug2.cma plug1.cma"; + use_runtime = "false"; + ocamlc.byte; + output = "custom.output"; + run; + reference = "${test_source_directory}/custom.reference"; + check-program-output; + } *) let f x = print_string "This is Main.f\n"; x diff --git a/testsuite/tests/lib-dynlink-csharp/main.ml b/testsuite/tests/lib-dynlink-csharp/main.ml index 54798b7578e..1075bbfa012 100644 --- a/testsuite/tests/lib-dynlink-csharp/main.ml +++ b/testsuite/tests/lib-dynlink-csharp/main.ml @@ -1,83 +1,78 @@ (* TEST - -include dynlink - -readonly_files = "entry.c main.cs plugin.ml" - -* csharp-compiler -** shared-libraries -set csharp_cmd = "${csc} ${csc_flags} /out:main.exe main.cs" - -*** setup-ocamlc.byte-build-env -**** ocamlc.byte -module = "plugin.ml" -***** ocamlc.byte -module = "" -flags = "-output-obj" -program = "main.dll" -all_modules = "dynlink.cma main.ml entry.c" -****** script -script = "${csharp_cmd}" -******* run -program = "./main.exe" -******** check-program-output -reference = "${test_source_directory}/main.bytecode.reference" - -*** setup-ocamlc.byte-build-env -compiler_directory_suffix = "-dll" -**** ocamlc.byte -module = "plugin.ml" -***** ocamlc.byte -module = "" -flags = "-output-obj" -program = "main_obj.${objext}" -all_modules = "dynlink.cma entry.c main.ml" -****** script -script = "${mkdll} -maindll -o main.dll main_obj.${objext} entry.${objext} \ - ${ocamlsrcdir}/runtime/libcamlrun.${libext} ${bytecc_libs}" -******* script -script = "${csharp_cmd}" -******** run -program = "./main.exe" -********* check-program-output -reference = "${test_source_directory}/main.bytecode.reference" - -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "plugin.ml" -***** ocamlopt.byte -flags = "-output-obj" -program= "main.dll" -all_modules = "dynlink.cmxa entry.c main.ml" -****** script -script = "${csharp_cmd}" -******* run -program = "./main.exe" -******** check-program-output -reference = "${test_source_directory}/main.native.reference" - -*** setup-ocamlopt.byte-build-env -compiler_directory_suffix = "-dll" -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "plugin.ml" -***** ocamlopt.byte -flags = "-output-obj" -program = "main_obj.${objext}" -all_modules = "dynlink.cmxa entry.c main.ml" -****** script -script = "${mkdll} -maindll -o main.dll main_obj.${objext} entry.${objext} \ - ${ocamlsrcdir}/runtime/libasmrun.${libext} ${nativecc_libs}" -******* script -script = "${csharp_cmd}" -******** run -program = "./main.exe" -********* check-program-output -reference = "${test_source_directory}/main.native.reference" - + include dynlink; + readonly_files = "entry.c main.cs plugin.ml"; + csharp-compiler; + set csharp_cmd = "${csc} ${csc_flags} /out:main.exe main.cs"; + shared-libraries; + { + setup-ocamlc.byte-build-env; + module = "plugin.ml"; + ocamlc.byte; + module = ""; + flags = "-output-obj"; + program = "main.dll"; + all_modules = "dynlink.cma main.ml entry.c"; + ocamlc.byte; + script = "${csharp_cmd}"; + script; + program = "./main.exe"; + run; + reference = "${test_source_directory}/main.bytecode.reference"; + check-program-output; + }{ + compiler_directory_suffix = "-dll"; + setup-ocamlc.byte-build-env; + module = "plugin.ml"; + ocamlc.byte; + module = ""; + flags = "-output-obj"; + program = "main_obj.${objext}"; + all_modules = "dynlink.cma entry.c main.ml"; + ocamlc.byte; + script = "${mkdll} -maindll -o main.dll main_obj.${objext} entry.${objext} ${ocamlsrcdir}/${runtime_dir}/libcamlrun.${libext} ${bytecc_libs}"; + script; + script = "${csharp_cmd}"; + script; + program = "./main.exe"; + run; + reference = "${test_source_directory}/main.bytecode.reference"; + check-program-output; + }{ + setup-ocamlopt.byte-build-env; + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "plugin.ml"; + ocamlopt.byte; + flags = "-output-obj"; + program = "main.dll"; + all_modules = "dynlink.cmxa entry.c main.ml"; + ocamlopt.byte; + script = "${csharp_cmd}"; + script; + program = "./main.exe"; + run; + reference = "${test_source_directory}/main.native.reference"; + check-program-output; + }{ + compiler_directory_suffix = "-dll"; + setup-ocamlopt.byte-build-env; + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "plugin.ml"; + ocamlopt.byte; + flags = "-output-obj"; + program = "main_obj.${objext}"; + all_modules = "dynlink.cmxa entry.c main.ml"; + ocamlopt.byte; + script = "${mkdll} -maindll -o main.dll main_obj.${objext} entry.${objext} ${ocamlsrcdir}/${runtime_dir}/libasmrun.${libext} ${nativecc_libs}"; + script; + script = "${csharp_cmd}"; + script; + program = "./main.exe"; + run; + reference = "${test_source_directory}/main.native.reference"; + check-program-output; + } *) let load s = diff --git a/testsuite/tests/lib-dynlink-domains/main.ml b/testsuite/tests/lib-dynlink-domains/main.ml index b82bc789fc2..50ce873bf04 100644 --- a/testsuite/tests/lib-dynlink-domains/main.ml +++ b/testsuite/tests/lib-dynlink-domains/main.ml @@ -1,6 +1,6 @@ (* TEST - * skip - reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* BACKPORT diff --git a/testsuite/tests/lib-dynlink-init-info/test.ml b/testsuite/tests/lib-dynlink-init-info/test.ml index c6105dd752f..21aa3973fa8 100644 --- a/testsuite/tests/lib-dynlink-init-info/test.ml +++ b/testsuite/tests/lib-dynlink-init-info/test.ml @@ -1,5 +1,5 @@ (* TEST - include dynlink + include dynlink; *) (* Make sure dynlink state info is accurate before any load diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference b/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference index cc5dd81351d..5abe54b3726 100644 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference @@ -1,12 +1 @@ Error: Failure("Plugin error") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 -Called from Test10_plugin.g in file "test10_plugin.ml", line 3, characters 2-21 -Called from Test10_plugin.f in file "test10_plugin.ml", line 6, characters 2-6 -Called from Test10_plugin in file "test10_plugin.ml", line 10, characters 2-6 -Called from Dynlink.Bytecode.run in file "otherlibs/dynlink/dynlink.ml", line 159, characters 16-25 -Re-raised at Dynlink.Bytecode.run in file "otherlibs/dynlink/dynlink.ml", line 161, characters 6-137 -Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 367, characters 13-72 -Called from Stdlib__List.iter in file "list.ml", line 116, characters 12-15 -Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 363, characters 8-408 -Re-raised at Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 376, characters 8-17 -Called from Test10_main in file "test10_main.ml", line 51, characters 13-69 diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.ml b/testsuite/tests/lib-dynlink-initializers/test10_main.ml index 03d21a3ec83..951126d83f5 100644 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.ml @@ -1,42 +1,42 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -include dynlink - -readonly_files = "test10_plugin.ml" -flags += "-g" - -libraries = "" - -* no-flambda -** shared-libraries -*** setup-ocamlc.byte-build-env -**** ocamlc.byte -module = "test10_main.ml" -**** ocamlc.byte -module = "test10_plugin.ml" -**** ocamlc.byte -program = "${test_build_directory}/test10.byte" -libraries = "dynlink" -all_modules = "test10_main.cmo" -***** run -****** check-program-output -reference = "${test_source_directory}/test10_main.byte.reference" - -*** native-dynlink -**** setup-ocamlopt.byte-build-env -***** ocamlopt.byte -module = "test10_main.ml" -***** ocamlopt.byte -program = "test10_plugin.cmxs" -flags = "-shared -g" -all_modules = "test10_plugin.ml" -***** ocamlopt.byte -program = "${test_build_directory}/test10.exe" -libraries = "dynlink" -all_modules = "test10_main.cmx" -****** run -******* check-program-output -reference = "${test_source_directory}/test10_main.native.reference" *) (* Check that a module in the main program whose initializer has not @@ -53,5 +53,51 @@ let () = end with | Dynlink.Error (Dynlink.Library's_module_initializers_failed exn) -> - Printf.eprintf "Error: %s\n%!" (Printexc.to_string exn); - Printexc.print_backtrace stderr + Printf.eprintf "Error: %s\n%!" (Printexc.to_string exn) + +(* TEST + include dynlink; + readonly_files = "test10_plugin.ml"; + flags += "-g"; + libraries = ""; + no-flambda; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test10_main.ml"; + ocamlc.byte; + }{ + module = "test10_plugin.ml"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test10.byte"; + libraries = "dynlink"; + all_modules = "test10_main.cmo"; + ocamlc.byte; + run; + reference = "${test_source_directory}/test10_main.byte.reference"; + check-program-output; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test10_main.ml"; + ocamlopt.byte; + }{ + program = "test10_plugin.cmxs"; + flags = "-shared -g"; + all_modules = "test10_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test10.exe"; + libraries = "dynlink"; + all_modules = "test10_main.cmx"; + ocamlopt.byte; + run; + reference = "${test_source_directory}/test10_main.native.reference"; + check-program-output; + } + } +*) diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference index 407bc50a3d7..5abe54b3726 100755 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference @@ -1,14 +1 @@ Error: Failure("Plugin error") -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 -Called from Test10_plugin.g in file "test10_plugin.ml" (inlined), line 2, characters 15-38 -Called from Test10_plugin.f in file "test10_plugin.ml", line 6, characters 2-6 -Called from Test10_plugin in file "test10_plugin.ml", line 10, characters 2-6 -Called from Dynlink.Native.ndl_run in file "otherlibs/dynlink/dynlink.ml", line 292, characters 8-25 -Called from Dynlink.Native.ndl_run in file "otherlibs/dynlink/dynlink.ml", line 292, characters 8-25 -Re-raised at Dynlink.Native.ndl_run in file "otherlibs/dynlink/dynlink.ml", line 304, characters 6-137 -Called from Stdlib__List.iter in file "list.ml", line 116, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 367, characters 13-72 -Called from Stdlib__List.iter in file "list.ml", line 116, characters 12-15 -Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 363, characters 8-408 -Re-raised at Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", line 376, characters 8-17 -Called from Test10_main in file "test10_main.ml", line 49, characters 30-87 diff --git a/testsuite/tests/lib-dynlink-initializers/test1_main.ml b/testsuite/tests/lib-dynlink-initializers/test1_main.ml index 34d3b5ae180..0958573147a 100644 --- a/testsuite/tests/lib-dynlink-initializers/test1_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test1_main.ml @@ -1,40 +1,48 @@ (* TEST - -include dynlink - -readonly_files = "test1_inited_second.ml test1_plugin.ml" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test1_main.ml" -*** ocamlc.byte -module = "test1_inited_second.ml" -*** ocamlc.byte -module = "test1_plugin.ml" -*** ocamlc.byte -program = "${test_build_directory}/test1.byte" -libraries = "dynlink" -all_modules = "test1_main.cmo test1_inited_second.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test1_main.ml" -**** ocamlopt.byte -module = "test1_inited_second.ml" -**** ocamlopt.byte -program = "test1_plugin.cmxs" -flags = "-shared" -all_modules = "test1_plugin.ml" -**** ocamlopt.byte -program = "${test_build_directory}/test1.exe" -libraries = "dynlink" -all_modules = "test1_main.cmx test1_inited_second.cmx" -***** run + include dynlink; + readonly_files = "test1_inited_second.ml test1_plugin.ml"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test1_main.ml"; + ocamlc.byte; + }{ + module = "test1_inited_second.ml"; + ocamlc.byte; + }{ + module = "test1_plugin.ml"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test1.byte"; + libraries = "dynlink"; + all_modules = "test1_main.cmo test1_inited_second.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test1_main.ml"; + ocamlopt.byte; + }{ + module = "test1_inited_second.ml"; + ocamlopt.byte; + }{ + program = "test1_plugin.cmxs"; + flags = "-shared"; + all_modules = "test1_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test1.exe"; + libraries = "dynlink"; + all_modules = "test1_main.cmx test1_inited_second.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that a module in the main program whose initializer has not diff --git a/testsuite/tests/lib-dynlink-initializers/test2_main.ml b/testsuite/tests/lib-dynlink-initializers/test2_main.ml index 6ec8921f091..e1507e7dff6 100644 --- a/testsuite/tests/lib-dynlink-initializers/test2_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test2_main.ml @@ -1,40 +1,48 @@ (* TEST - -include dynlink - -readonly_files = "test2_inited_first.ml test2_plugin.ml" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test2_inited_first.ml" -*** ocamlc.byte -module = "test2_main.ml" -*** ocamlc.byte -module = "test2_plugin.ml" -*** ocamlc.byte -program = "${test_build_directory}/test2.byte" -libraries = "dynlink" -all_modules = "test2_inited_first.cmo test2_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test2_inited_first.ml" -**** ocamlopt.byte -module = "test2_main.ml" -**** ocamlopt.byte -program = "test2_plugin.cmxs" -flags = "-shared" -all_modules = "test2_plugin.ml" -**** ocamlopt.byte -program = "${test_build_directory}/test2.exe" -libraries = "dynlink" -all_modules = "test2_inited_first.cmx test2_main.cmx" -***** run + include dynlink; + readonly_files = "test2_inited_first.ml test2_plugin.ml"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test2_inited_first.ml"; + ocamlc.byte; + }{ + module = "test2_main.ml"; + ocamlc.byte; + }{ + module = "test2_plugin.ml"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test2.byte"; + libraries = "dynlink"; + all_modules = "test2_inited_first.cmo test2_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test2_inited_first.ml"; + ocamlopt.byte; + }{ + module = "test2_main.ml"; + ocamlopt.byte; + }{ + program = "test2_plugin.cmxs"; + flags = "-shared"; + all_modules = "test2_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test2.exe"; + libraries = "dynlink"; + all_modules = "test2_inited_first.cmx test2_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that a shared library can refer to a module in the main program diff --git a/testsuite/tests/lib-dynlink-initializers/test3_main.ml b/testsuite/tests/lib-dynlink-initializers/test3_main.ml index 8f0b94009bc..b2f3e447435 100644 --- a/testsuite/tests/lib-dynlink-initializers/test3_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test3_main.ml @@ -1,46 +1,56 @@ (* TEST - -include dynlink - -readonly_files = "test3_plugin_a.ml test3_plugin_b.ml" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test3_main.ml" -*** ocamlc.byte -module = "test3_plugin_a.ml" -*** ocamlc.byte -module = "test3_plugin_b.ml" -*** ocamlc.byte -program = "test3_plugin.cma" -flags = "-a" -all_modules = "test3_plugin_a.cmo test3_plugin_b.cmo" -*** ocamlc.byte -program = "${test_build_directory}/test3.byte" -libraries = "dynlink" -all_modules = "test3_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test3_main.ml" -**** ocamlopt.byte -module = "test3_plugin_a.ml" -**** ocamlopt.byte -module = "test3_plugin_b.ml" -**** ocamlopt.byte -program = "test3_plugin.cmxs" -flags = "-shared" -all_modules = "test3_plugin_a.cmx test3_plugin_b.cmx" -**** ocamlopt.byte -program = "${test_build_directory}/test3.exe" -libraries = "dynlink" -all_modules = "test3_main.cmx" -***** run + include dynlink; + readonly_files = "test3_plugin_a.ml test3_plugin_b.ml"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test3_main.ml"; + ocamlc.byte; + }{ + module = "test3_plugin_a.ml"; + ocamlc.byte; + }{ + module = "test3_plugin_b.ml"; + ocamlc.byte; + }{ + program = "test3_plugin.cma"; + flags = "-a"; + all_modules = "test3_plugin_a.cmo test3_plugin_b.cmo"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test3.byte"; + libraries = "dynlink"; + all_modules = "test3_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test3_main.ml"; + ocamlopt.byte; + }{ + module = "test3_plugin_a.ml"; + ocamlopt.byte; + }{ + module = "test3_plugin_b.ml"; + ocamlopt.byte; + }{ + program = "test3_plugin.cmxs"; + flags = "-shared"; + all_modules = "test3_plugin_a.cmx test3_plugin_b.cmx"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test3.exe"; + libraries = "dynlink"; + all_modules = "test3_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that one module in a shared library can refer to another module diff --git a/testsuite/tests/lib-dynlink-initializers/test4_main.ml b/testsuite/tests/lib-dynlink-initializers/test4_main.ml index e9cd79ee8ed..d24880e0737 100644 --- a/testsuite/tests/lib-dynlink-initializers/test4_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test4_main.ml @@ -1,46 +1,56 @@ (* TEST - -include dynlink - -readonly_files = "test4_plugin_a.ml test4_plugin_b.ml" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test4_main.ml" -*** ocamlc.byte -module = "test4_plugin_b.ml" -*** ocamlc.byte -module = "test4_plugin_a.ml" -*** ocamlc.byte -program = "test4_plugin.cma" -flags = "-a" -all_modules = "test4_plugin_a.cmo test4_plugin_b.cmo" -*** ocamlc.byte -program = "${test_build_directory}/test4.byte" -libraries = "dynlink" -all_modules = "test4_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test4_main.ml" -**** ocamlopt.byte -module = "test4_plugin_b.ml" -**** ocamlopt.byte -module = "test4_plugin_a.ml" -**** ocamlopt.byte -program = "test4_plugin.cmxs" -flags = "-shared" -all_modules = "test4_plugin_a.cmx test4_plugin_b.cmx" -**** ocamlopt.byte -program = "${test_build_directory}/test4.exe" -libraries = "dynlink" -all_modules = "test4_main.cmx" -***** run + include dynlink; + readonly_files = "test4_plugin_a.ml test4_plugin_b.ml"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test4_main.ml"; + ocamlc.byte; + }{ + module = "test4_plugin_b.ml"; + ocamlc.byte; + }{ + module = "test4_plugin_a.ml"; + ocamlc.byte; + }{ + program = "test4_plugin.cma"; + flags = "-a"; + all_modules = "test4_plugin_a.cmo test4_plugin_b.cmo"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test4.byte"; + libraries = "dynlink"; + all_modules = "test4_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test4_main.ml"; + ocamlopt.byte; + }{ + module = "test4_plugin_b.ml"; + ocamlopt.byte; + }{ + module = "test4_plugin_a.ml"; + ocamlopt.byte; + }{ + program = "test4_plugin.cmxs"; + flags = "-shared"; + all_modules = "test4_plugin_a.cmx test4_plugin_b.cmx"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test4.exe"; + libraries = "dynlink"; + all_modules = "test4_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that a module in a shared library cannot refer to another diff --git a/testsuite/tests/lib-dynlink-initializers/test5_main.ml b/testsuite/tests/lib-dynlink-initializers/test5_main.ml index 0f39f63a423..3c9aab13ce1 100644 --- a/testsuite/tests/lib-dynlink-initializers/test5_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test5_main.ml @@ -1,52 +1,64 @@ (* TEST - -include dynlink - -readonly_files = "test5_plugin_a.ml test5_plugin_b.ml test5_second_plugin.ml" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test5_main.ml" -*** ocamlc.byte -module = "test5_plugin_a.ml" -*** ocamlc.byte -module = "test5_plugin_b.ml" -*** ocamlc.byte -module = "test5_second_plugin.ml" -*** ocamlc.byte -program = "test5_plugin.cma" -flags = "-a" -all_modules = "test5_plugin_a.cmo test5_plugin_b.cmo" -*** ocamlc.byte -program = "${test_build_directory}/test5.byte" -libraries = "dynlink" -all_modules = "test5_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test5_main.ml" -**** ocamlopt.byte -module = "test5_plugin_a.ml" -**** ocamlopt.byte -module = "test5_plugin_b.ml" -**** ocamlopt.byte -program = "test5_plugin.cmxs" -flags = "-shared" -all_modules = "test5_plugin_a.cmx test5_plugin_b.cmx" -**** ocamlopt.byte -program = "test5_second_plugin.cmxs" -flags = "-shared" -all_modules = "test5_second_plugin.ml" -**** ocamlopt.byte -program = "${test_build_directory}/test5.exe" -libraries = "dynlink" -all_modules = "test5_main.cmx" -***** run + include dynlink; + readonly_files = "test5_plugin_a.ml test5_plugin_b.ml test5_second_plugin.ml"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test5_main.ml"; + ocamlc.byte; + }{ + module = "test5_plugin_a.ml"; + ocamlc.byte; + }{ + module = "test5_plugin_b.ml"; + ocamlc.byte; + }{ + module = "test5_second_plugin.ml"; + ocamlc.byte; + }{ + program = "test5_plugin.cma"; + flags = "-a"; + all_modules = "test5_plugin_a.cmo test5_plugin_b.cmo"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test5.byte"; + libraries = "dynlink"; + all_modules = "test5_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test5_main.ml"; + ocamlopt.byte; + }{ + module = "test5_plugin_a.ml"; + ocamlopt.byte; + }{ + module = "test5_plugin_b.ml"; + ocamlopt.byte; + }{ + program = "test5_plugin.cmxs"; + flags = "-shared"; + all_modules = "test5_plugin_a.cmx test5_plugin_b.cmx"; + ocamlopt.byte; + }{ + program = "test5_second_plugin.cmxs"; + flags = "-shared"; + all_modules = "test5_second_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test5.exe"; + libraries = "dynlink"; + all_modules = "test5_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that when one shared library loads another shared library then diff --git a/testsuite/tests/lib-dynlink-initializers/test6_main.ml b/testsuite/tests/lib-dynlink-initializers/test6_main.ml index 332b594c08e..3828bdaa4ad 100644 --- a/testsuite/tests/lib-dynlink-initializers/test6_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test6_main.ml @@ -1,42 +1,50 @@ (* TEST - -include dynlink - -readonly_files = "test6_plugin.ml test6_second_plugin.ml" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test6_main.ml" -*** ocamlc.byte -module = "test6_plugin.ml" -*** ocamlc.byte -module = "test6_second_plugin.ml" -*** ocamlc.byte -program = "${test_build_directory}/test6.byte" -libraries = "dynlink" -all_modules = "test6_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test6_main.ml" -**** ocamlopt.byte -program = "test6_plugin.cmxs" -flags = "-shared" -all_modules = "test6_plugin.ml" -**** ocamlopt.byte -program = "test6_second_plugin.cmxs" -flags = "-shared" -all_modules = "test6_second_plugin.ml" -**** ocamlopt.byte -program = "${test_build_directory}/test6.exe" -libraries = "dynlink" -all_modules = "test6_main.cmx" -***** run + include dynlink; + readonly_files = "test6_plugin.ml test6_second_plugin.ml"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test6_main.ml"; + ocamlc.byte; + }{ + module = "test6_plugin.ml"; + ocamlc.byte; + }{ + module = "test6_second_plugin.ml"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test6.byte"; + libraries = "dynlink"; + all_modules = "test6_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test6_main.ml"; + ocamlopt.byte; + }{ + program = "test6_plugin.cmxs"; + flags = "-shared"; + all_modules = "test6_plugin.ml"; + ocamlopt.byte; + }{ + program = "test6_second_plugin.cmxs"; + flags = "-shared"; + all_modules = "test6_second_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test6.exe"; + libraries = "dynlink"; + all_modules = "test6_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that a module in a loaded shared library whose initializer has not diff --git a/testsuite/tests/lib-dynlink-initializers/test7_main.ml b/testsuite/tests/lib-dynlink-initializers/test7_main.ml index f3dba0c5667..6e3bbbc522c 100644 --- a/testsuite/tests/lib-dynlink-initializers/test7_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test7_main.ml @@ -1,40 +1,48 @@ (* TEST - -include dynlink - -readonly_files = "test7_interface_only.mli test7_plugin.ml" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test7_interface_only.mli" -*** ocamlc.byte -module = "test7_main.ml" -*** ocamlc.byte -module = "test7_plugin.ml" -*** ocamlc.byte -program = "${test_build_directory}/test7.byte" -libraries = "dynlink" -all_modules = "test7_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test7_interface_only.mli" -**** ocamlopt.byte -module = "test7_main.ml" -**** ocamlopt.byte -program = "test7_plugin.cmxs" -flags = "-shared" -all_modules = "test7_plugin.ml" -**** ocamlopt.byte -program = "${test_build_directory}/test7.exe" -libraries = "dynlink" -all_modules = "test7_main.cmx" -***** run + include dynlink; + readonly_files = "test7_interface_only.mli test7_plugin.ml"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test7_interface_only.mli"; + ocamlc.byte; + }{ + module = "test7_main.ml"; + ocamlc.byte; + }{ + module = "test7_plugin.ml"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test7.byte"; + libraries = "dynlink"; + all_modules = "test7_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test7_interface_only.mli"; + ocamlopt.byte; + }{ + module = "test7_main.ml"; + ocamlopt.byte; + }{ + program = "test7_plugin.cmxs"; + flags = "-shared"; + all_modules = "test7_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test7.exe"; + libraries = "dynlink"; + all_modules = "test7_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that a shared library can depend on an interface-only module diff --git a/testsuite/tests/lib-dynlink-initializers/test8_main.ml b/testsuite/tests/lib-dynlink-initializers/test8_main.ml index 45bba9602cb..0f194afcb8e 100644 --- a/testsuite/tests/lib-dynlink-initializers/test8_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test8_main.ml @@ -1,50 +1,62 @@ (* TEST - -include dynlink - -readonly_files = "test8_plugin_a.ml test8_plugin_b.ml test8_plugin_b.mli" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test8_main.ml" -*** ocamlc.byte -module = "test8_plugin_b.mli" -*** ocamlc.byte -module = "test8_plugin_a.ml" -*** ocamlc.byte -module = "test8_plugin_b.ml" -*** ocamlc.byte -program = "test8_plugin.cma" -flags = "-a" -all_modules = "test8_plugin_a.cmo test8_plugin_b.cmo" -*** ocamlc.byte -program = "${test_build_directory}/test8.byte" -libraries = "dynlink" -all_modules = "test8_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test8_main.ml" -**** ocamlopt.byte -module = "test8_plugin_b.mli" -**** ocamlopt.byte -module = "test8_plugin_a.ml" -**** ocamlopt.byte -module = "test8_plugin_b.ml" -**** ocamlopt.byte -program = "test8_plugin.cmxs" -flags = "-shared" -all_modules = "test8_plugin_a.cmx test8_plugin_b.cmx" -**** ocamlopt.byte -program = "${test_build_directory}/test8.exe" -libraries = "dynlink" -all_modules = "test8_main.cmx" -***** run + include dynlink; + readonly_files = "test8_plugin_a.ml test8_plugin_b.ml test8_plugin_b.mli"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test8_main.ml"; + ocamlc.byte; + }{ + module = "test8_plugin_b.mli"; + ocamlc.byte; + }{ + module = "test8_plugin_a.ml"; + ocamlc.byte; + }{ + module = "test8_plugin_b.ml"; + ocamlc.byte; + }{ + program = "test8_plugin.cma"; + flags = "-a"; + all_modules = "test8_plugin_a.cmo test8_plugin_b.cmo"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test8.byte"; + libraries = "dynlink"; + all_modules = "test8_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test8_main.ml"; + ocamlopt.byte; + }{ + module = "test8_plugin_b.mli"; + ocamlopt.byte; + }{ + module = "test8_plugin_a.ml"; + ocamlopt.byte; + }{ + module = "test8_plugin_b.ml"; + ocamlopt.byte; + }{ + program = "test8_plugin.cmxs"; + flags = "-shared"; + all_modules = "test8_plugin_a.cmx test8_plugin_b.cmx"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test8.exe"; + libraries = "dynlink"; + all_modules = "test8_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that modules of a shared library can have interface-only diff --git a/testsuite/tests/lib-dynlink-initializers/test9_main.ml b/testsuite/tests/lib-dynlink-initializers/test9_main.ml index f74ddccb8a1..fcb11286330 100644 --- a/testsuite/tests/lib-dynlink-initializers/test9_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test9_main.ml @@ -1,46 +1,56 @@ (* TEST - -include dynlink - -readonly_files = "test9_plugin.ml test9_second_plugin.ml test9_second_plugin.mli" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "test9_second_plugin.mli" -*** ocamlc.byte -module = "test9_main.ml" -*** ocamlc.byte -module = "test9_plugin.ml" -*** ocamlc.byte -module = "test9_second_plugin.ml" -*** ocamlc.byte -program = "${test_build_directory}/test9.byte" -libraries = "dynlink" -all_modules = "test9_main.cmo" -**** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "test9_second_plugin.mli" -**** ocamlopt.byte -module = "test9_main.ml" -**** ocamlopt.byte -program = "test9_plugin.cmxs" -flags = "-shared" -all_modules = "test9_plugin.ml" -**** ocamlopt.byte -program = "test9_second_plugin.cmxs" -flags = "-shared" -all_modules = "test9_second_plugin.ml" -**** ocamlopt.byte -program = "${test_build_directory}/test9.exe" -libraries = "dynlink" -all_modules = "test9_main.cmx" -***** run + include dynlink; + readonly_files = "test9_plugin.ml test9_second_plugin.ml test9_second_plugin.mli"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + module = "test9_second_plugin.mli"; + ocamlc.byte; + }{ + module = "test9_main.ml"; + ocamlc.byte; + }{ + module = "test9_plugin.ml"; + ocamlc.byte; + }{ + module = "test9_second_plugin.ml"; + ocamlc.byte; + }{ + program = "${test_build_directory}/test9.byte"; + libraries = "dynlink"; + all_modules = "test9_main.cmo"; + ocamlc.byte; + run; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + module = "test9_second_plugin.mli"; + ocamlopt.byte; + }{ + module = "test9_main.ml"; + ocamlopt.byte; + }{ + program = "test9_plugin.cmxs"; + flags = "-shared"; + all_modules = "test9_plugin.ml"; + ocamlopt.byte; + }{ + program = "test9_second_plugin.cmxs"; + flags = "-shared"; + all_modules = "test9_second_plugin.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/test9.exe"; + libraries = "dynlink"; + all_modules = "test9_main.cmx"; + ocamlopt.byte; + run; + } + } *) (* Check that a shared library can depend on an interface-only module diff --git a/testsuite/tests/lib-dynlink-native/main.ml b/testsuite/tests/lib-dynlink-native/main.ml index 7b930ed2bdb..ab64368e542 100644 --- a/testsuite/tests/lib-dynlink-native/main.ml +++ b/testsuite/tests/lib-dynlink-native/main.ml @@ -1,202 +1,204 @@ (* TEST + readonly_files = "a.ml api.ml b.ml bug.ml c.ml factorial.c pack_client.ml \ + packed1_client.ml packed1.ml plugin2.ml plugin4.ml plugin_ext.ml \ + plugin_high_arity.ml plugin.ml plugin.mli plugin_ref.ml plugin_simple.ml \ + plugin_thread.ml"; + subdirectories = "sub"; + include systhreads; + include dynlink; + hassysthreads; + libraries = ""; (* We will add them manually where appropriated *) + native-dynlink; + ocamlopt_default_flags = "";(* Removes the -ccopt -no-pie on ised on OpenBSD *) + setup-ocamlopt.byte-build-env; + module = "api.ml"; + ocamlopt.byte; + flags = "-opaque"; + module = "plugin.mli"; + ocamlopt.byte; + flags = ""; + module = "plugin.ml"; + ocamlopt.byte; + module = ""; + flags = "-shared"; + program = "plugin.so"; + all_modules = "plugin.cmx"; + ocamlopt.byte; + script = "mv plugin.cmx plugin.cmx.bak"; + script; + flags = ""; + module = "plugin2.ml"; + ocamlopt.byte; + script = "mv plugin.cmx.bak plugin.cmx"; + script; + module = ""; + flags = "-shared"; + program = "plugin2.so"; + all_modules = "plugin2.cmx"; + ocamlopt.byte; + flags = ""; + module = "sub/plugin.ml"; + ocamlopt.byte; + module = ""; + flags = "-shared"; + program = "sub/plugin.so"; + all_modules = "sub/plugin.cmx"; + ocamlopt.byte; + cwd = "sub"; + cd; + module = "api.mli"; + flags = "-opaque"; + ocamlopt.byte; + flags = ""; + module = "api.ml"; + ocamlopt.byte; + script = "mv api.cmx api.cmx.bak"; + script; + module = "plugin3.ml"; + ocamlopt.byte; + script = "mv api.cmx.bak api.cmx"; + script; + cwd = ".."; + cd; + module = ""; + flags = "-shared"; + program = "sub/plugin3.so"; + all_modules = "sub/plugin3.cmx"; + ocamlopt.byte; + flags = ""; + module = "plugin4.ml"; + ocamlopt.byte; + module = ""; + flags = "-shared"; + program = "plugin4.so"; + all_modules = "plugin4.cmx"; + ocamlopt.byte; + module = "packed1.ml"; + flags = "-for-pack Mypack"; + ocamlopt.byte; + flags = "-S -pack"; + module = ""; + program = "mypack.cmx"; + all_modules = "packed1.cmx"; + ocamlopt.byte; + program = "mypack.so"; + flags = "-shared"; + all_modules = "mypack.cmx"; + ocamlopt.byte; + program = "packed1.so"; + flags = "-shared"; + all_modules = "packed1.cmx"; + ocamlopt.byte; + flags = ""; + module = "pack_client.ml"; + ocamlopt.byte; + module = ""; + program = "pack_client.so"; + flags = "-shared"; + all_modules = "pack_client.cmx"; + ocamlopt.byte; + flags = ""; + module = "plugin_ref.ml"; + ocamlopt.byte; + module = ""; + program = "plugin_ref.so"; + flags = "-shared"; + all_modules = "plugin_ref.cmx"; + ocamlopt.byte; + flags = ""; + module = "plugin_high_arity.ml"; + ocamlopt.byte; + module = ""; + program = "plugin_high_arity.so"; + flags = "-shared"; + all_modules = "plugin_high_arity.cmx"; + ocamlopt.byte; + flags = "-ccopt ${shared_library_cflags}"; + module = "factorial.c"; + ocamlopt.byte; + flags = ""; + module = "plugin_ext.ml"; + ocamlopt.byte; + module = ""; + program = "plugin_ext.so"; + flags = "-shared"; + all_modules = "factorial.${objext} plugin_ext.cmx"; + ocamlopt.byte; + module = "plugin_simple.ml"; + flags = ""; + ocamlopt.byte; + { + module = ""; + program = "plugin_simple.so"; + flags = "-shared"; + all_modules = "plugin_simple.cmx"; + ocamlopt.byte; + }{ + module = "bug.ml"; + flags = ""; + ocamlopt.byte; + { + module = ""; + program = "bug.so"; + flags = "-shared"; + all_modules = "bug.cmx"; + ocamlopt.byte; + }{ + module = "plugin_thread.ml"; + flags = ""; + ocamlopt.byte; + module = ""; + program = "plugin_thread.so"; + flags = "-shared"; + all_modules = "plugin_thread.cmx"; + ocamlopt.byte; + program = "plugin4_unix.so"; + all_modules = "unix.cmxa plugin4.cmx"; + ocamlopt.byte; + flags = ""; + compile_only = "true"; + all_modules = "a.ml b.ml c.ml main.ml"; + ocamlopt.byte; + module = ""; + compile_only = "false"; + flags = "-shared"; + program = "a.so"; + all_modules = "a.cmx"; + ocamlopt.byte; + program = "b.so"; + all_modules = "b.cmx"; + ocamlopt.byte; + program = "c.so"; + all_modules = "c.cmx"; + ocamlopt.byte; + program = "mylib.cmxa"; + flags = "-a"; + all_modules = "plugin.cmx plugin2.cmx"; + ocamlopt.byte; + program = "mylib.so"; + flags = "-shared -linkall"; + all_modules = "mylib.cmxa"; + ocamlopt.byte; + program = "${test_build_directory}/main.exe"; + libraries = "unix threads dynlink"; + flags = "-linkall"; + all_modules = "api.cmx main.cmx"; + ocamlopt.byte; + (* + On OpenBSD, the compiler produces warnings like + /usr/bin/ld: warning: creating a DT_TEXTREL in a shared object. + So the compiler output is not empty on OpenBSD so an emptiness check + would fail on this platform. -readonly_files = "a.ml api.ml b.ml bug.ml c.ml factorial.c pack_client.ml \ - packed1.ml plugin2.ml plugin4.ml plugin_ext.ml \ - plugin_high_arity.ml plugin.ml plugin.mli plugin_ref.ml \ - plugin_simple.ml plugin_thread.ml" -subdirectories = "sub" + We thus do not check compiler output. This was not done either before the + test was ported to ocamltest. + *) -* hassysthreads -include systhreads -include dynlink - -** native-dynlink -libraries = "" (* We will add them manually where appropriated *) -*** setup-ocamlopt.opt-build-env -ocamlopt_default_flags = "" (* Removes the -ccopt -no-pie on ised on OpenBSD *) - -**** ocamlopt.opt -module = "api.ml" -***** ocamlopt.opt -flags = "-opaque" -module = "plugin.mli" -****** ocamlopt.opt -flags = "" -module = "plugin.ml" -******* ocamlopt.opt -module= "" -flags = "-shared" -program = "plugin.so" -all_modules = "plugin.cmx" -******** script -script = "mv plugin.cmx plugin.cmx.bak" -********* ocamlopt.opt -flags = "" -module = "plugin2.ml" -********** script -script = "mv plugin.cmx.bak plugin.cmx" -*********** ocamlopt.opt -module= "" -flags = "-shared" -program = "plugin2.so" -all_modules = "plugin2.cmx" -************ ocamlopt.opt -flags = "" -module = "sub/plugin.ml" -************* ocamlopt.opt -module = "" -flags = "-shared" -program = "sub/plugin.so" -all_modules = "sub/plugin.cmx" -************** cd -cwd = "sub" -*************** ocamlopt.opt -module = "api.mli" -flags = "-opaque" -**************** ocamlopt.opt -flags = "" -module = "api.ml" -***************** script -script = "mv api.cmx api.cmx.bak" -****************** ocamlopt.opt -module = "plugin3.ml" -******************* script -script = "mv api.cmx.bak api.cmx" -******************** cd -cwd = ".." -********************* ocamlopt.opt -module = "" -flags = "-shared" -program = "sub/plugin3.so" -all_modules = "sub/plugin3.cmx" -********************** ocamlopt.opt -flags = "" -module = "plugin4.ml" -*********************** ocamlopt.opt -module = "" -flags = "-shared" -program = "plugin4.so" -all_modules = "plugin4.cmx" -************************ ocamlopt.opt -module = "packed1.ml" -flags = "-for-pack Mypack" -************************* ocamlopt.opt -flags = "-S -pack" -module = "" -program = "mypack.cmx" -all_modules = "packed1.cmx" -************************** ocamlopt.opt -program = "mypack.so" -flags = "-shared" -all_modules = "mypack.cmx" -*************************** ocamlopt.opt -program = "packed1.so" -flags = "-shared" -all_modules = "packed1.cmx" -**************************** ocamlopt.opt -flags = "" -module = "pack_client.ml" -***************************** ocamlopt.opt -module = "" -program = "pack_client.so" -flags = "-shared" -all_modules = "pack_client.cmx" -****************************** ocamlopt.opt -flags = "" -module = "plugin_ref.ml" -******************************* ocamlopt.opt -module = "" -program = "plugin_ref.so" -flags = "-shared" -all_modules = "plugin_ref.cmx" -******************************** ocamlopt.opt -flags = "" -module = "plugin_high_arity.ml" -********************************* ocamlopt.opt -module = "" -program = "plugin_high_arity.so" -flags = "-shared" -all_modules = "plugin_high_arity.cmx" -********************************** ocamlopt.opt -flags = "-ccopt ${shared_library_cflags}" -module = "factorial.c" -*********************************** ocamlopt.opt -flags = "" -module = "plugin_ext.ml" -************************************ ocamlopt.opt -module = "" -program = "plugin_ext.so" -flags = "-shared" -all_modules = "factorial.${objext} plugin_ext.cmx" -************************************* ocamlopt.opt -module = "plugin_simple.ml" -flags = "" -************************************** ocamlopt.opt -module = "" -program = "plugin_simple.so" -flags = "-shared" -all_modules = "plugin_simple.cmx" -************************************** ocamlopt.opt -module = "bug.ml" -flags = "" -*************************************** ocamlopt.opt -module = "" -program = "bug.so" -flags = "-shared" -all_modules = "bug.cmx" -*************************************** ocamlopt.opt -module = "plugin_thread.ml" -flags = "" -**************************************** ocamlopt.opt -module = "" -program = "plugin_thread.so" -flags = "-shared" -all_modules = "plugin_thread.cmx" -***************************************** ocamlopt.opt -program = "plugin4_unix.so" -all_modules = "unix.cmxa plugin4.cmx" -****************************************** ocamlopt.opt -flags = "" -compile_only = "true" -all_modules = "a.ml b.ml c.ml main.ml" -******************************************* ocamlopt.opt -module = "" -compile_only = "false" -flags = "-shared" -program = "a.so" -all_modules = "a.cmx" -******************************************** ocamlopt.opt -program = "b.so" -all_modules = "b.cmx" -********************************************* ocamlopt.opt -program = "c.so" -all_modules = "c.cmx" -********************************************** ocamlopt.opt -program = "mylib.cmxa" -flags = "-a" -all_modules = "plugin.cmx plugin2.cmx" -*********************************************** ocamlopt.opt -program = "mylib.so" -flags = "-shared -linkall" -all_modules = "mylib.cmxa" -************************************************ ocamlopt.opt -program = "${test_build_directory}/main.exe" -libraries = "unix threads dynlink" -flags = "-linkall" -all_modules = "api.cmx main.cmx" -(* -On OpenBSD, the compiler produces warnings like -/usr/bin/ld: warning: creating a DT_TEXTREL in a shared object. -So the compiler output is not empty on OpenBSD so an emptiness check -would fail on this platform. - -We thus do not check compiler output. This was not done either before the -test was ported to ocamltest. -*) - -************************************************* run -arguments = "plugin.so plugin2.so plugin_thread.so" -************************************************** check-program-output + arguments = "plugin.so plugin2.so plugin_thread.so"; + run; + check-program-output; + } + } *) let () = diff --git a/testsuite/tests/lib-dynlink-native/main.reference b/testsuite/tests/lib-dynlink-native/main.reference index e6d6be749a6..bd628d207b0 100644 --- a/testsuite/tests/lib-dynlink-native/main.reference +++ b/testsuite/tests/lib-dynlink-native/main.reference @@ -6,7 +6,7 @@ Registering module Plugin2 1 2 6 -1 +2 Raised by primitive operation at Plugin2.foo in file "plugin2.ml", line 4, characters 38-64 Called from Plugin2.test_frametable in file "plugin2.ml", line 10, characters 2-72 Called from Plugin2 in file "plugin2.ml", line 19, characters 2-20 diff --git a/testsuite/tests/lib-dynlink-packed/loader.ml b/testsuite/tests/lib-dynlink-packed/loader.ml index ce617bc0d3f..19add8903c4 100644 --- a/testsuite/tests/lib-dynlink-packed/loader.ml +++ b/testsuite/tests/lib-dynlink-packed/loader.ml @@ -1,60 +1,71 @@ (* TEST - -include dynlink -libraries = "" -readonly_files = "a.ml b.ml loader.ml" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -flags = "-for-pack Packed" -module = "a.ml" -*** ocamlc.byte -flags = "-for-pack Packed" -module = "b.ml" -*** ocamlc.byte -program = "packed.cmo" -flags = "-pack" -all_modules = "a.cmo b.cmo" -*** ocamlc.byte -program = "${test_build_directory}/loader.byte" -flags = "-linkall" -include ocamlcommon -libraries += "dynlink" -all_modules = "loader.ml" -**** run -arguments = "packed.cmo" -exit_status = "0" -***** check-program-output -reference = "${test_source_directory}/byte.reference" - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -flags = "-for-pack Packed" -module = "a.ml" -**** ocamlopt.byte -flags = "-for-pack Packed" -module = "b.ml" -**** ocamlopt.byte -program = "packed.cmx" -flags = "-pack" -all_modules = "a.cmx b.cmx" -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "packed.cmx" -**** ocamlopt.byte -program = "${test_build_directory}/loader.exe" -flags = "-linkall" -include ocamlcommon -libraries += "dynlink" -all_modules = "loader.ml" -***** run -arguments = "plugin.cmxs" -exit_status = "0" -****** check-program-output -reference = "${test_source_directory}/native.reference" + include dynlink; + libraries = ""; + readonly_files = "a.ml b.ml loader.ml"; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + flags = "-for-pack Packed"; + module = "a.ml"; + ocamlc.byte; + }{ + flags = "-for-pack Packed"; + module = "b.ml"; + ocamlc.byte; + }{ + program = "packed.cmo"; + flags = "-pack"; + all_modules = "a.cmo b.cmo"; + ocamlc.byte; + }{ + program = "${test_build_directory}/loader.byte"; + flags = "-linkall"; + include ocamlcommon; + libraries += "dynlink"; + all_modules = "loader.ml"; + ocamlc.byte; + arguments = "packed.cmo"; + exit_status = "0"; + run; + reference = "${test_source_directory}/byte.reference"; + check-program-output; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + flags = "-for-pack Packed"; + module = "a.ml"; + ocamlopt.byte; + }{ + flags = "-for-pack Packed"; + module = "b.ml"; + ocamlopt.byte; + }{ + program = "packed.cmx"; + flags = "-pack"; + all_modules = "a.cmx b.cmx"; + ocamlopt.byte; + }{ + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "packed.cmx"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/loader.exe"; + flags = "-linkall"; + include ocamlcommon; + libraries += "dynlink"; + all_modules = "loader.ml"; + ocamlopt.byte; + arguments = "plugin.cmxs"; + exit_status = "0"; + run; + reference = "${test_source_directory}/native.reference"; + check-program-output; + } + } *) let () = try diff --git a/testsuite/tests/lib-dynlink-pr4229/main.ml b/testsuite/tests/lib-dynlink-pr4229/main.ml index 3cdc8937d3b..a6ac99de6b9 100644 --- a/testsuite/tests/lib-dynlink-pr4229/main.ml +++ b/testsuite/tests/lib-dynlink-pr4229/main.ml @@ -1,77 +1,77 @@ (* TEST - -include dynlink - -readonly_files = "abstract.mli abstract.ml static.ml client.ml main.ml" - -subdirectories = "sub" - -libraries = "" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** cd -cwd = "sub" -**** ocamlc.byte -module = "abstract.mli" -***** ocamlc.byte -module = "abstract.ml" -****** cd -cwd = ".." -******* ocamlc.byte -module = "abstract.mli" -******** ocamlc.byte -module = "abstract.ml" -********* ocamlc.byte -module = "static.ml" -********** ocamlc.byte -module = "client.ml" -*********** ocamlc.byte -module = "main.ml" -************ ocamlc.byte -program = "${test_build_directory}/main" -libraries = "dynlink" -module = "" -all_modules = "abstract.cmo static.cmo main.cmo" -************* run -exit_status = "2" -************** check-program-output - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** cd -cwd = "sub" -***** ocamlopt.byte -module = "abstract.mli" -****** ocamlopt.byte -program = "abstract.cmxs" -flags = "-shared" -module = "" -all_modules = "abstract.ml" -******* cd -cwd = ".." -******** ocamlopt.byte -flags = "" -module = "abstract.mli" -********* ocamlopt.byte -module = "abstract.ml" -********** ocamlopt.byte -module = "static.ml" -*********** ocamlopt.byte -program = "client.cmxs" -flags = "-shared" -module = "" -all_modules = "client.ml" -*********** ocamlopt.byte -module = "main.ml" -************ ocamlopt.byte -program = "${test_build_directory}/main_native" -libraries = "dynlink" -module = "" -all_modules = "abstract.cmx static.cmx main.cmx" -************* run -exit_status = "2" -************** check-program-output + include dynlink; + readonly_files = "abstract.mli abstract.ml static.ml client.ml main.ml"; + subdirectories = "sub"; + libraries = ""; + shared-libraries; + { + setup-ocamlc.byte-build-env; + cwd = "sub"; + cd; + module = "abstract.mli"; + ocamlc.byte; + module = "abstract.ml"; + ocamlc.byte; + cwd = ".."; + cd; + module = "abstract.mli"; + ocamlc.byte; + module = "abstract.ml"; + ocamlc.byte; + module = "static.ml"; + ocamlc.byte; + module = "client.ml"; + ocamlc.byte; + module = "main.ml"; + ocamlc.byte; + program = "${test_build_directory}/main"; + libraries = "dynlink"; + module = ""; + all_modules = "abstract.cmo static.cmo main.cmo"; + ocamlc.byte; + exit_status = "2"; + run; + check-program-output; + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + cwd = "sub"; + cd; + module = "abstract.mli"; + ocamlopt.byte; + program = "abstract.cmxs"; + flags = "-shared"; + module = ""; + all_modules = "abstract.ml"; + ocamlopt.byte; + cwd = ".."; + cd; + flags = ""; + module = "abstract.mli"; + ocamlopt.byte; + module = "abstract.ml"; + ocamlopt.byte; + module = "static.ml"; + ocamlopt.byte; + { + program = "client.cmxs"; + flags = "-shared"; + module = ""; + all_modules = "client.ml"; + ocamlopt.byte; + }{ + module = "main.ml"; + ocamlopt.byte; + program = "${test_build_directory}/main_native"; + libraries = "dynlink"; + module = ""; + all_modules = "abstract.cmx static.cmx main.cmx"; + ocamlopt.byte; + exit_status = "2"; + run; + check-program-output; + } + } *) (* PR#4229 *) diff --git a/testsuite/tests/lib-dynlink-pr4839/test.ml b/testsuite/tests/lib-dynlink-pr4839/test.ml index 8d217be9015..7b00270bee2 100644 --- a/testsuite/tests/lib-dynlink-pr4839/test.ml +++ b/testsuite/tests/lib-dynlink-pr4839/test.ml @@ -1,231 +1,301 @@ (* TEST - -include dynlink -libraries = "" -subdirectories = "host plugin1 plugin2 plugin3 plugin4" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** cd -cwd = "plugin1" -*** ocamlc.byte -module = "api.mli" -*** ocamlc.byte -flags = "-for-pack Packed" -module = "api.ml" -*** ocamlc.byte -program = "packed.cmo" -flags = "-pack" -all_modules = "api.cmo" -*** ocamlc.byte -program = "plugin.cma" -flags = "-a" -all_modules = "plugin.ml" -*** cd -cwd = ".." - -*** cd -cwd = "plugin2" -*** ocamlc.byte -module = "api.mli" -*** ocamlc.byte -flags = "-for-pack Packed" -module = "api.ml" -*** ocamlc.byte -program = "packed.cmo" -flags = "-pack" -all_modules = "api.cmo" -*** ocamlc.byte -program = "plugin.cma" -flags = "-a" -all_modules = "plugin.ml" -*** cd -cwd = ".." - -*** cd -cwd = "plugin3" -*** ocamlc.byte -module = "api.mli" -*** ocamlc.byte -flags = "-for-pack Packed" -module = "api.ml" -*** ocamlc.byte -program = "packed.cmo" -flags = "-pack" -all_modules = "api.cmo" -*** ocamlc.byte -program = "plugin.cma" -flags = "-a" -all_modules = "packed.cmo plugin.ml" -*** cd -cwd = ".." - -*** cd -cwd = "plugin4" -*** ocamlc.byte -module = "api.mli" -*** ocamlc.byte -flags = "-for-pack Packed" -module = "api.ml" -*** ocamlc.byte -program = "packed.cmo" -flags = "-pack" -all_modules = "api.cmo" -*** ocamlc.byte -program = "plugin.cma" -flags = "-a" -all_modules = "packed.cmo plugin.ml" -*** cd -cwd = ".." - -*** cd -cwd = "host" -*** ocamlc.byte -module = "api.mli" -*** ocamlc.byte -flags = "-for-pack Packed" -module = "api.ml" -*** ocamlc.byte -program = "packed.cmo" -flags = "-pack" -all_modules = "api.cmo" -*** ocamlc.byte -program = "./host.byt" -libraries = "dynlink" -all_modules = "packed.cmo host.ml" -**** run -arguments = "../plugin1/plugin.cma" -output = "byte.plugin1.result" -***** check-program-output -reference = "${test_source_directory}/byte.plugin1.reference" -**** run -arguments = "../plugin2/plugin.cma" -output = "byte.plugin2.result" -***** check-program-output -reference = "${test_source_directory}/byte.plugin2.reference" -**** run -arguments = "../plugin3/plugin.cma" -output = "byte.plugin3.result" -***** check-program-output -reference = "${test_source_directory}/byte.plugin3.reference" -**** run -arguments = "../plugin4/plugin.cma" -output = "byte.plugin4.result" -***** check-program-output -reference = "${test_source_directory}/byte.plugin4.reference" -*** cd -cwd = ".." - -** native-dynlink -*** setup-ocamlopt.byte-build-env - -**** cd -cwd = "plugin1" -**** ocamlopt.byte -module = "api.mli" -**** ocamlopt.byte -flags = "-for-pack Packed" -module = "api.ml" -**** ocamlopt.byte -program = "packed.cmx" -flags = "-pack" -all_modules = "api.cmx" -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "plugin.ml" -**** cd -cwd = ".." - -**** cd -cwd = "plugin2" -**** ocamlopt.byte -module = "api.mli" -**** ocamlopt.byte -flags = "-for-pack Packed" -module = "api.ml" -**** ocamlopt.byte -program = "packed.cmx" -flags = "-pack" -all_modules = "api.cmx" -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "plugin.ml" -*** cd -cwd = ".." - -**** cd -cwd = "plugin3" -**** ocamlopt.byte -module = "api.mli" -**** ocamlopt.byte -flags = "-for-pack Packed" -module = "api.ml" -**** ocamlopt.byte -program = "packed.cmx" -flags = "-pack" -all_modules = "api.cmx" -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "packed.cmx plugin.ml" -**** cd -cwd = ".." - -**** cd -cwd = "plugin4" -**** ocamlopt.byte -module = "api.mli" -**** ocamlopt.byte -flags = "-for-pack Packed" -module = "api.ml" -**** ocamlopt.byte -program = "packed.cmx" -flags = "-pack" -all_modules = "api.cmx" -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "packed.cmx plugin.ml" -**** cd -cwd = ".." - -**** cd -cwd = "host" -**** ocamlopt.byte -module = "api.mli" -**** ocamlopt.byte -flags = "-for-pack Packed" -module = "api.ml" -**** ocamlopt.byte -program = "packed.cmx" -flags = "-pack" -all_modules = "api.cmx" -**** ocamlopt.byte -program = "./host.exe" -libraries = "dynlink" -all_modules = "packed.cmx host.ml" -***** run -arguments = "../plugin1/plugin.cmxs" -output = "native.plugin1.result" -****** check-program-output -reference = "${test_source_directory}/native.plugin1.reference" -***** run -arguments = "../plugin2/plugin.cmxs" -output = "native.plugin2.result" -****** check-program-output -reference = "${test_source_directory}/native.plugin2.reference" -***** run -arguments = "../plugin3/plugin.cmxs" -output = "native.plugin3.result" -****** check-program-output -reference = "${test_source_directory}/native.plugin3.reference" -***** run -arguments = "../plugin4/plugin.cmxs" -output = "native.plugin4.result" -****** check-program-output -reference = "${test_source_directory}/native.plugin4.reference" -**** cd -cwd = ".." + include dynlink; + libraries = ""; + subdirectories = "host plugin1 plugin2 plugin3 plugin4"; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + cwd = "plugin1"; + cd; + }{ + module = "api.mli"; + ocamlc.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlc.byte; + }{ + program = "packed.cmo"; + flags = "-pack"; + all_modules = "api.cmo"; + ocamlc.byte; + }{ + program = "plugin.cma"; + flags = "-a"; + all_modules = "plugin.ml"; + ocamlc.byte; + }{ + cwd = ".."; + cd; + }{ + cwd = "plugin2"; + cd; + }{ + module = "api.mli"; + ocamlc.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlc.byte; + }{ + program = "packed.cmo"; + flags = "-pack"; + all_modules = "api.cmo"; + ocamlc.byte; + }{ + program = "plugin.cma"; + flags = "-a"; + all_modules = "plugin.ml"; + ocamlc.byte; + }{ + cwd = ".."; + cd; + }{ + cwd = "plugin3"; + cd; + }{ + module = "api.mli"; + ocamlc.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlc.byte; + }{ + program = "packed.cmo"; + flags = "-pack"; + all_modules = "api.cmo"; + ocamlc.byte; + }{ + program = "plugin.cma"; + flags = "-a"; + all_modules = "packed.cmo plugin.ml"; + ocamlc.byte; + }{ + cwd = ".."; + cd; + }{ + cwd = "plugin4"; + cd; + }{ + module = "api.mli"; + ocamlc.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlc.byte; + }{ + program = "packed.cmo"; + flags = "-pack"; + all_modules = "api.cmo"; + ocamlc.byte; + }{ + program = "plugin.cma"; + flags = "-a"; + all_modules = "packed.cmo plugin.ml"; + ocamlc.byte; + }{ + cwd = ".."; + cd; + }{ + cwd = "host"; + cd; + }{ + module = "api.mli"; + ocamlc.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlc.byte; + }{ + program = "packed.cmo"; + flags = "-pack"; + all_modules = "api.cmo"; + ocamlc.byte; + }{ + program = "./host.byt"; + libraries = "dynlink"; + all_modules = "packed.cmo host.ml"; + ocamlc.byte; + { + arguments = "../plugin1/plugin.cma"; + output = "byte.plugin1.result"; + run; + reference = "${test_source_directory}/byte.plugin1.reference"; + check-program-output; + }{ + arguments = "../plugin2/plugin.cma"; + output = "byte.plugin2.result"; + run; + reference = "${test_source_directory}/byte.plugin2.reference"; + check-program-output; + }{ + arguments = "../plugin3/plugin.cma"; + output = "byte.plugin3.result"; + run; + reference = "${test_source_directory}/byte.plugin3.reference"; + check-program-output; + }{ + arguments = "../plugin4/plugin.cma"; + output = "byte.plugin4.result"; + run; + reference = "${test_source_directory}/byte.plugin4.reference"; + check-program-output; + } + }{ + cwd = ".."; + cd; + } + }{ + native-dynlink; + { + setup-ocamlopt.byte-build-env; + { + cwd = "plugin1"; + cd; + }{ + module = "api.mli"; + ocamlopt.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlopt.byte; + }{ + program = "packed.cmx"; + flags = "-pack"; + all_modules = "api.cmx"; + ocamlopt.byte; + }{ + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "plugin.ml"; + ocamlopt.byte; + }{ + cwd = ".."; + cd; + }{ + cwd = "plugin2"; + cd; + }{ + module = "api.mli"; + ocamlopt.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlopt.byte; + }{ + program = "packed.cmx"; + flags = "-pack"; + all_modules = "api.cmx"; + ocamlopt.byte; + }{ + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "plugin.ml"; + ocamlopt.byte; + } + }{ + cwd = ".."; + cd; + { + cwd = "plugin3"; + cd; + }{ + module = "api.mli"; + ocamlopt.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlopt.byte; + }{ + program = "packed.cmx"; + flags = "-pack"; + all_modules = "api.cmx"; + ocamlopt.byte; + }{ + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "packed.cmx plugin.ml"; + ocamlopt.byte; + }{ + cwd = ".."; + cd; + }{ + cwd = "plugin4"; + cd; + }{ + module = "api.mli"; + ocamlopt.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlopt.byte; + }{ + program = "packed.cmx"; + flags = "-pack"; + all_modules = "api.cmx"; + ocamlopt.byte; + }{ + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "packed.cmx plugin.ml"; + ocamlopt.byte; + }{ + cwd = ".."; + cd; + }{ + cwd = "host"; + cd; + }{ + module = "api.mli"; + ocamlopt.byte; + }{ + flags = "-for-pack Packed"; + module = "api.ml"; + ocamlopt.byte; + }{ + program = "packed.cmx"; + flags = "-pack"; + all_modules = "api.cmx"; + ocamlopt.byte; + }{ + program = "./host.exe"; + libraries = "dynlink"; + all_modules = "packed.cmx host.ml"; + ocamlopt.byte; + { + arguments = "../plugin1/plugin.cmxs"; + output = "native.plugin1.result"; + run; + reference = "${test_source_directory}/native.plugin1.reference"; + check-program-output; + }{ + arguments = "../plugin2/plugin.cmxs"; + output = "native.plugin2.result"; + run; + reference = "${test_source_directory}/native.plugin2.reference"; + check-program-output; + }{ + arguments = "../plugin3/plugin.cmxs"; + output = "native.plugin3.result"; + run; + reference = "${test_source_directory}/native.plugin3.reference"; + check-program-output; + }{ + arguments = "../plugin4/plugin.cmxs"; + output = "native.plugin4.result"; + run; + reference = "${test_source_directory}/native.plugin4.reference"; + check-program-output; + } + }{ + cwd = ".."; + cd; + } + } + } *) + +(* CR mshinwell/xclerc: The above "cd" statements are in the wrong place + in the test stanzas and are only working by virtue of the + changing-directory side effect leaking across children of the [Node]s *) diff --git a/testsuite/tests/lib-dynlink-pr6950/loader.ml b/testsuite/tests/lib-dynlink-pr6950/loader.ml index d676934d1dd..f7ba5595af4 100644 --- a/testsuite/tests/lib-dynlink-pr6950/loader.ml +++ b/testsuite/tests/lib-dynlink-pr6950/loader.ml @@ -1,44 +1,50 @@ (* TEST - -include dynlink -libraries = "" -readonly_files = "config.ml b.ml" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -program = "plugin.cma" -flags = "-a" -all_modules = "config.ml b.ml" -*** ocamlc.byte -program = "${test_build_directory}/loader.byte" -flags = "-linkall" -include ocamlcommon -libraries += "dynlink" -all_modules = "loader.ml" -**** run -arguments = "plugin.cma" -exit_status = "2" -***** check-program-output -reference = "${test_source_directory}/byte.reference" - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -program = "plugin.cmxs" -flags = "-shared" -all_modules = "config.ml b.ml" -**** ocamlopt.byte -program = "${test_build_directory}/loader.exe" -flags = "-linkall" -include ocamlcommon -libraries += "dynlink" -all_modules = "loader.ml" -***** run -arguments = "plugin.cmxs" -exit_status = "2" -****** check-program-output -reference = "${test_source_directory}/native.reference" + include dynlink; + libraries = ""; + readonly_files = "config.ml b.ml"; + shared-libraries; + { + setup-ocamlc.byte-build-env; + { + program = "plugin.cma"; + flags = "-a"; + all_modules = "config.ml b.ml"; + ocamlc.byte; + }{ + program = "${test_build_directory}/loader.byte"; + flags = "-linkall"; + include ocamlcommon; + libraries += "dynlink"; + all_modules = "loader.ml"; + ocamlc.byte; + arguments = "plugin.cma"; + exit_status = "2"; + run; + reference = "${test_source_directory}/byte.reference"; + check-program-output; + } + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + { + program = "plugin.cmxs"; + flags = "-shared"; + all_modules = "config.ml b.ml"; + ocamlopt.byte; + }{ + program = "${test_build_directory}/loader.exe"; + flags = "-linkall"; + include ocamlcommon; + libraries += "dynlink"; + all_modules = "loader.ml"; + ocamlopt.byte; + arguments = "plugin.cmxs"; + exit_status = "2"; + run; + reference = "${test_source_directory}/native.reference"; + check-program-output; + } + } *) let () = try diff --git a/testsuite/tests/lib-dynlink-pr9209/dyn.ml b/testsuite/tests/lib-dynlink-pr9209/dyn.ml index 051e7afc39d..1a56bc8f646 100644 --- a/testsuite/tests/lib-dynlink-pr9209/dyn.ml +++ b/testsuite/tests/lib-dynlink-pr9209/dyn.ml @@ -1,61 +1,61 @@ (* TEST - -include dynlink -readonly_files = "lib.ml lib2.ml test.c" -ld_library_path += "${test_build_directory}" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -compile_only = "true" -all_modules = "lib.ml lib2.ml test.c dyn.ml" -**** ocamlmklib -program = "lib" -modules = "lib.cmo test.${objext}" -compile_only = "false" -***** ocamlc.byte -program = "lib2.cma" -libraries = "" -all_modules = "lib2.cmo" -compile_only = "false" -flags = "-a" -****** ocamlc.byte -libraries += "dynlink" -program = "${test_build_directory}/main.exe" -all_modules = "dyn.cmo" -flags = "" -******* run -output = "main.output" -******** check-program-output - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -compile_only = "true" -all_modules = "lib.ml lib2.ml test.c dyn.ml" -***** ocamlmklib -program = "test" -modules = "test.${objext}" -compile_only = "false" -****** ocamlopt.byte -program = "lib.cmxs" -libraries = "" -flags = "-shared -cclib -L. -cclib -ltest" -all_modules = "lib.cmx" -compile_only = "false" -******* ocamlopt.byte -program = "lib2.cmxs" -all_modules = "lib2.cmx" -compile_only = "false" -flags = "-shared" -******** ocamlopt.byte -libraries += "dynlink" -program = "${test_build_directory}/main.exe" -all_modules = "dyn.cmx" -flags = "" -********* run -output = "main.output" -********** check-program-output + include dynlink; + readonly_files = "lib.ml lib2.ml test.c"; + ld_library_path += "${test_build_directory}"; + shared-libraries; + { + setup-ocamlc.byte-build-env; + compile_only = "true"; + all_modules = "lib.ml lib2.ml test.c dyn.ml"; + ocamlc.byte; + program = "lib"; + modules = "lib.cmo test.${objext}"; + compile_only = "false"; + ocamlmklib; + program = "lib2.cma"; + libraries = ""; + all_modules = "lib2.cmo"; + compile_only = "false"; + flags = "-a"; + ocamlc.byte; + libraries += "dynlink"; + program = "${test_build_directory}/main.exe"; + all_modules = "dyn.cmo"; + flags = ""; + ocamlc.byte; + output = "main.output"; + run; + check-program-output; + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + compile_only = "true"; + all_modules = "lib.ml lib2.ml test.c dyn.ml"; + ocamlopt.byte; + program = "test"; + modules = "test.${objext}"; + compile_only = "false"; + ocamlmklib; + program = "lib.cmxs"; + libraries = ""; + flags = "-shared -cclib -L. -cclib -ltest"; + all_modules = "lib.cmx"; + compile_only = "false"; + ocamlopt.byte; + program = "lib2.cmxs"; + all_modules = "lib2.cmx"; + compile_only = "false"; + flags = "-shared"; + ocamlopt.byte; + libraries += "dynlink"; + program = "${test_build_directory}/main.exe"; + all_modules = "dyn.cmx"; + flags = ""; + ocamlopt.byte; + output = "main.output"; + run; + check-program-output; + } *) let () = Dynlink.allow_unsafe_modules true; diff --git a/testsuite/tests/lib-dynlink-private/test.ml b/testsuite/tests/lib-dynlink-private/test.ml index c921b67a45d..3832f74c32e 100644 --- a/testsuite/tests/lib-dynlink-private/test.ml +++ b/testsuite/tests/lib-dynlink-private/test.ml @@ -1,174 +1,173 @@ (* TEST - -include dynlink -libraries = "" -readonly_files = "sheep.mli sheep.ml pig.mli" -subdirectories = "plugin1 plugin2 plugin2b plugin2c plugin3 plugin4 \ - plugin5 plugin6" - -* shared-libraries -** setup-ocamlc.byte-build-env -*** ocamlc.byte -module = "sheep.mli" -**** ocamlc.byte -module = "sheep.ml" -***** ocamlc.byte -module = "pig.mli" -****** ocamlc.byte -module = "test.ml" -******* ocamlc.byte -module = "plugin1/sheep.mli" -******** ocamlc.byte -flags = "-I plugin1" -module = "plugin1/sheep.ml" -********* ocamlc.byte -flags = "" -module = "plugin2/cow.mli" -********** ocamlc.byte -flags = "-I plugin2" -module = "plugin2/cow.ml" -*********** ocamlc.byte -flags = "" -module = "plugin2b/cow.mli" -************ ocamlc.byte -flags = "-I plugin2b" -module = "plugin2b/cow.ml" -************* ocamlc.byte -flags = "" -module = "plugin2c/cow.mli" -************** ocamlc.byte -flags = "-I plugin2c" -module = "plugin2c/cow.ml" -*************** ocamlc.byte -flags = "" -module = "plugin3/pig.mli" -**************** ocamlc.byte -flags = "-I plugin3" -module = "plugin3/pig.ml" -***************** ocamlc.byte -flags = "" -module = "plugin4/chicken.mli" -****************** ocamlc.byte -flags = "-I plugin4" -module = "plugin4/chicken.ml" -******************* ocamlc.byte -flags = "" -module = "plugin5/chicken.mli" -******************** ocamlc.byte -flags = "-I plugin5" -module = "plugin5/chicken.ml" -********************* ocamlc.byte -flags = "" -module = "plugin6/pheasant.mli" -********************** ocamlc.byte -flags = "-I plugin6" -module = "plugin6/pheasant.ml" -*********************** ocamlc.byte -flags = "" -module = "plugin6/partridge.mli" -************************ ocamlc.byte -flags = "-I plugin6" -module = "plugin6/partridge.ml" -************************* ocamlc.byte -flags = "" -program = "./test.byte.exe" -libraries = "dynlink" -all_modules = "sheep.cmo test.cmo" -module = "" -************************** script -script = "cp ${test_build_directory}/plugin2/cow.cmo ${test_build_directory}/plugin2/cow_copy.cmo" -*************************** run - -** native-dynlink -*** setup-ocamlopt.byte-build-env -**** ocamlopt.byte -module = "sheep.mli" -***** ocamlopt.byte -module = "sheep.ml" -****** ocamlopt.byte -module = "pig.mli" -******* ocamlopt.byte -module = "test.ml" -******** ocamlopt.byte -flags = "" -module = "plugin1/sheep.mli" -********* ocamlopt.byte -program = "plugin1/sheep.cmxs" -flags = "-I plugin1 -shared" -module = "" -all_modules = "plugin1/sheep.ml" -********** ocamlopt.byte -flags = "" -module = "plugin2/cow.mli" -*********** ocamlopt.byte -program = "plugin2/cow.cmxs" -flags = "-I plugin2 -shared" -module = "" -all_modules = "plugin2/cow.ml" -************ ocamlopt.byte -flags = "" -module = "plugin2b/cow.mli" -************* ocamlopt.byte -program = "plugin2b/cow.cmxs" -flags = "-I plugin2b -shared" -module = "" -all_modules = "plugin2b/cow.ml" -************** ocamlopt.byte -flags = "" -module = "plugin2c/cow.mli" -*************** ocamlopt.byte -program = "plugin2c/cow.cmxs" -flags = "-I plugin2c -shared" -module = "" -all_modules = "plugin2c/cow.ml" -**************** ocamlopt.byte -flags = "" -module = "plugin3/pig.mli" -***************** ocamlopt.byte -program = "plugin3/pig.cmxs" -flags = "-I plugin3 -shared" -module = "" -all_modules = "plugin3/pig.ml" -****************** ocamlopt.byte -flags = "" -module = "plugin4/chicken.mli" -******************* ocamlopt.byte -program = "plugin4/chicken.cmxs" -flags = "-I plugin4 -shared" -module = "" -all_modules = "plugin4/chicken.ml" -******************** ocamlopt.byte -flags = "" -module = "plugin5/chicken.mli" -********************* ocamlopt.byte -program = "plugin5/chicken.cmxs" -flags = "-I plugin5 -shared" -module = "" -all_modules = "plugin5/chicken.ml" -********************** ocamlopt.byte -flags = "" -module = "plugin6/pheasant.mli" -*********************** ocamlopt.byte -program = "plugin6/pheasant.cmxs" -flags = "-I plugin6 -shared" -module = "" -all_modules = "plugin6/pheasant.ml" -************************ ocamlopt.byte -flags = "" -module = "plugin6/partridge.mli" -************************* ocamlopt.byte -program = "plugin6/partridge.cmxs" -flags = "-I plugin6 -shared" -module = "" -all_modules = "plugin6/partridge.ml" -************************** ocamlopt.byte -flags = "" -program = "./test.opt.exe" -libraries = "dynlink" -all_modules = "sheep.cmx test.cmx" -*************************** script -script = "cp ${test_build_directory}/plugin2/cow.cmxs ${test_build_directory}/plugin2/cow_copy.cmxs" -**************************** run + include dynlink; + libraries = ""; + readonly_files = "sheep.mli sheep.ml pig.mli"; + subdirectories = "plugin1 plugin2 plugin2b plugin2c plugin3 plugin4 plugin5 plugin6"; + shared-libraries; + { + setup-ocamlc.byte-build-env; + module = "sheep.mli"; + ocamlc.byte; + module = "sheep.ml"; + ocamlc.byte; + module = "pig.mli"; + ocamlc.byte; + module = "test.ml"; + ocamlc.byte; + module = "plugin1/sheep.mli"; + ocamlc.byte; + flags = "-I plugin1"; + module = "plugin1/sheep.ml"; + ocamlc.byte; + flags = ""; + module = "plugin2/cow.mli"; + ocamlc.byte; + flags = "-I plugin2"; + module = "plugin2/cow.ml"; + ocamlc.byte; + flags = ""; + module = "plugin2b/cow.mli"; + ocamlc.byte; + flags = "-I plugin2b"; + module = "plugin2b/cow.ml"; + ocamlc.byte; + flags = ""; + module = "plugin2c/cow.mli"; + ocamlc.byte; + flags = "-I plugin2c"; + module = "plugin2c/cow.ml"; + ocamlc.byte; + flags = ""; + module = "plugin3/pig.mli"; + ocamlc.byte; + flags = "-I plugin3"; + module = "plugin3/pig.ml"; + ocamlc.byte; + flags = ""; + module = "plugin4/chicken.mli"; + ocamlc.byte; + flags = "-I plugin4"; + module = "plugin4/chicken.ml"; + ocamlc.byte; + flags = ""; + module = "plugin5/chicken.mli"; + ocamlc.byte; + flags = "-I plugin5"; + module = "plugin5/chicken.ml"; + ocamlc.byte; + flags = ""; + module = "plugin6/pheasant.mli"; + ocamlc.byte; + flags = "-I plugin6"; + module = "plugin6/pheasant.ml"; + ocamlc.byte; + flags = ""; + module = "plugin6/partridge.mli"; + ocamlc.byte; + flags = "-I plugin6"; + module = "plugin6/partridge.ml"; + ocamlc.byte; + flags = ""; + program = "./test.byte.exe"; + libraries = "dynlink"; + all_modules = "sheep.cmo test.cmo"; + module = ""; + ocamlc.byte; + script = "cp ${test_build_directory}/plugin2/cow.cmo ${test_build_directory}/plugin2/cow_copy.cmo"; + script; + run; + }{ + native-dynlink; + setup-ocamlopt.byte-build-env; + module = "sheep.mli"; + ocamlopt.byte; + module = "sheep.ml"; + ocamlopt.byte; + module = "pig.mli"; + ocamlopt.byte; + module = "test.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin1/sheep.mli"; + ocamlopt.byte; + program = "plugin1/sheep.cmxs"; + flags = "-I plugin1 -shared"; + module = ""; + all_modules = "plugin1/sheep.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin2/cow.mli"; + ocamlopt.byte; + program = "plugin2/cow.cmxs"; + flags = "-I plugin2 -shared"; + module = ""; + all_modules = "plugin2/cow.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin2b/cow.mli"; + ocamlopt.byte; + program = "plugin2b/cow.cmxs"; + flags = "-I plugin2b -shared"; + module = ""; + all_modules = "plugin2b/cow.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin2c/cow.mli"; + ocamlopt.byte; + program = "plugin2c/cow.cmxs"; + flags = "-I plugin2c -shared"; + module = ""; + all_modules = "plugin2c/cow.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin3/pig.mli"; + ocamlopt.byte; + program = "plugin3/pig.cmxs"; + flags = "-I plugin3 -shared"; + module = ""; + all_modules = "plugin3/pig.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin4/chicken.mli"; + ocamlopt.byte; + program = "plugin4/chicken.cmxs"; + flags = "-I plugin4 -shared"; + module = ""; + all_modules = "plugin4/chicken.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin5/chicken.mli"; + ocamlopt.byte; + program = "plugin5/chicken.cmxs"; + flags = "-I plugin5 -shared"; + module = ""; + all_modules = "plugin5/chicken.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin6/pheasant.mli"; + ocamlopt.byte; + program = "plugin6/pheasant.cmxs"; + flags = "-I plugin6 -shared"; + module = ""; + all_modules = "plugin6/pheasant.ml"; + ocamlopt.byte; + flags = ""; + module = "plugin6/partridge.mli"; + ocamlopt.byte; + program = "plugin6/partridge.cmxs"; + flags = "-I plugin6 -shared"; + module = ""; + all_modules = "plugin6/partridge.ml"; + ocamlopt.byte; + flags = ""; + program = "./test.opt.exe"; + libraries = "dynlink"; + all_modules = "sheep.cmx test.cmx"; + ocamlopt.byte; + script = "cp ${test_build_directory}/plugin2/cow.cmxs ${test_build_directory}/plugin2/cow_copy.cmxs"; + script; + run; + } *) let () = Sheep.baa Sheep.s (* Use Sheep module *) diff --git a/testsuite/tests/lib-either/test.ml b/testsuite/tests/lib-either/test.ml index 2a62f38919a..5cdaa3837d9 100644 --- a/testsuite/tests/lib-either/test.ml +++ b/testsuite/tests/lib-either/test.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) open Either;; diff --git a/testsuite/tests/lib-extensions/modules.ml b/testsuite/tests/lib-extensions/modules.ml new file mode 100644 index 00000000000..0ea4a207c07 --- /dev/null +++ b/testsuite/tests/lib-extensions/modules.ml @@ -0,0 +1,9 @@ +(* TEST + { + bytecode; + }{ + native; + } +*) + +(* Check that extension library modules exist. *) diff --git a/testsuite/tests/lib-filename/extension.ml b/testsuite/tests/lib-filename/extension.ml index ae7c8b61d4b..3b420567198 100644 --- a/testsuite/tests/lib-filename/extension.ml +++ b/testsuite/tests/lib-filename/extension.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let () = let test f e = diff --git a/testsuite/tests/lib-filename/null.ml b/testsuite/tests/lib-filename/null.ml index 048e36622e3..ecad3c7836a 100644 --- a/testsuite/tests/lib-filename/null.ml +++ b/testsuite/tests/lib-filename/null.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let () = let ic = open_in Filename.null in diff --git a/testsuite/tests/lib-filename/quotecommand.ml b/testsuite/tests/lib-filename/quotecommand.ml index 5e5059c02ac..7034c369220 100644 --- a/testsuite/tests/lib-filename/quotecommand.ml +++ b/testsuite/tests/lib-filename/quotecommand.ml @@ -1,31 +1,30 @@ (* TEST - -readonly_files = "myecho.ml" - -* setup-ocamlc.byte-build-env -program = "${test_build_directory}/quotecommand.byte" -** ocamlc.byte -program = "${test_build_directory}/myecho.exe" -all_modules = "myecho.ml" -*** ocamlc.byte -program = "${test_build_directory}/quotecommand.byte" -all_modules= "quotecommand.ml" -**** check-ocamlc.byte-output -***** run -****** check-program-output - -* setup-ocamlopt.byte-build-env -program = "${test_build_directory}/quotecommand.opt" -** ocamlopt.byte -program = "${test_build_directory}/myecho.exe" -all_modules = "myecho.ml" -*** ocamlopt.byte -program = "${test_build_directory}/quotecommand.opt" -all_modules= "quotecommand.ml" -**** check-ocamlopt.byte-output -***** run -****** check-program-output - + readonly_files = "myecho.ml"; + { + program = "${test_build_directory}/quotecommand.byte"; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/myecho.exe"; + all_modules = "myecho.ml"; + ocamlc.byte; + program = "${test_build_directory}/quotecommand.byte"; + all_modules = "quotecommand.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/quotecommand.opt"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/myecho.exe"; + all_modules = "myecho.ml"; + ocamlopt.byte; + program = "${test_build_directory}/quotecommand.opt"; + all_modules = "quotecommand.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) open Printf diff --git a/testsuite/tests/lib-filename/suffix.ml b/testsuite/tests/lib-filename/suffix.ml index 3faa5c94fe2..071df446535 100644 --- a/testsuite/tests/lib-filename/suffix.ml +++ b/testsuite/tests/lib-filename/suffix.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let () = let test ~suffix name exp = diff --git a/testsuite/tests/lib-filename/temp.ml b/testsuite/tests/lib-filename/temp.ml index d0bbbe9cf28..75d79417e16 100644 --- a/testsuite/tests/lib-filename/temp.ml +++ b/testsuite/tests/lib-filename/temp.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let () = let tmpdir1 = ref "" in diff --git a/testsuite/tests/lib-float/test.ml b/testsuite/tests/lib-float/test.ml index ac3e91b55ea..8cdbd9afe6e 100644 --- a/testsuite/tests/lib-float/test.ml +++ b/testsuite/tests/lib-float/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let is_nan2 (x, y) = Float.is_nan x && Float.is_nan y diff --git a/testsuite/tests/lib-floatarray/floatarray.ml b/testsuite/tests/lib-floatarray/floatarray.ml index 379b76bc785..564c325d7c6 100644 --- a/testsuite/tests/lib-floatarray/floatarray.ml +++ b/testsuite/tests/lib-floatarray/floatarray.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) open Printf diff --git a/testsuite/tests/lib-format/domains.ml b/testsuite/tests/lib-format/domains.ml index 0daaad51719..4bfaa594124 100644 --- a/testsuite/tests/lib-format/domains.ml +++ b/testsuite/tests/lib-format/domains.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (** Test that domains stdout and stderr are flushed at domain exit *) diff --git a/testsuite/tests/lib-format/mc_pr586_par.ml b/testsuite/tests/lib-format/mc_pr586_par.ml index 2b186f8056c..c8475c37a38 100644 --- a/testsuite/tests/lib-format/mc_pr586_par.ml +++ b/testsuite/tests/lib-format/mc_pr586_par.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let () = diff --git a/testsuite/tests/lib-format/mc_pr586_par2.ml b/testsuite/tests/lib-format/mc_pr586_par2.ml index 6a3fa25d441..d2dd7b06a69 100644 --- a/testsuite/tests/lib-format/mc_pr586_par2.ml +++ b/testsuite/tests/lib-format/mc_pr586_par2.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let () = diff --git a/testsuite/tests/lib-format/pr6824.ml b/testsuite/tests/lib-format/pr6824.ml index 7dc9208380f..342ebd9a116 100644 --- a/testsuite/tests/lib-format/pr6824.ml +++ b/testsuite/tests/lib-format/pr6824.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) let f = Format.sprintf "[%i]";; diff --git a/testsuite/tests/lib-format/print_array.ml b/testsuite/tests/lib-format/print_array.ml index dc6481c8842..5efce527580 100644 --- a/testsuite/tests/lib-format/print_array.ml +++ b/testsuite/tests/lib-format/print_array.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) (* diff --git a/testsuite/tests/lib-format/print_seq.ml b/testsuite/tests/lib-format/print_seq.ml index 4113ded9ad6..72f99f02d24 100644 --- a/testsuite/tests/lib-format/print_seq.ml +++ b/testsuite/tests/lib-format/print_seq.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) (* diff --git a/testsuite/tests/lib-format/tformat.ml b/testsuite/tests/lib-format/tformat.ml index e0118387a01..98ad1afdab4 100644 --- a/testsuite/tests/lib-format/tformat.ml +++ b/testsuite/tests/lib-format/tformat.ml @@ -1,6 +1,6 @@ (* TEST - include testing - flags = "-no-strict-formats" + include testing; + flags = "-no-strict-formats"; *) (* diff --git a/testsuite/tests/lib-fun/test.ml b/testsuite/tests/lib-fun/test.ml index ba534db2628..b0c79146977 100644 --- a/testsuite/tests/lib-fun/test.ml +++ b/testsuite/tests/lib-fun/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let test_id () = assert (Fun.id true = true); diff --git a/testsuite/tests/lib-hashtbl/compatibility.ml b/testsuite/tests/lib-hashtbl/compatibility.ml index 9ad3a477f34..39477a62ee7 100644 --- a/testsuite/tests/lib-hashtbl/compatibility.ml +++ b/testsuite/tests/lib-hashtbl/compatibility.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let check_contents (h: (string, int) Hashtbl.t) (expected: (string * int) list) = diff --git a/testsuite/tests/lib-hashtbl/hfun.ml b/testsuite/tests/lib-hashtbl/hfun.ml index 3e15596e85b..ae0634dc11c 100644 --- a/testsuite/tests/lib-hashtbl/hfun.ml +++ b/testsuite/tests/lib-hashtbl/hfun.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Testing the hash function Hashtbl.hash *) (* What is tested: diff --git a/testsuite/tests/lib-hashtbl/htbl.ml b/testsuite/tests/lib-hashtbl/htbl.ml index 5b9cb764389..4af75a9f020 100644 --- a/testsuite/tests/lib-hashtbl/htbl.ml +++ b/testsuite/tests/lib-hashtbl/htbl.ml @@ -1,16 +1,10 @@ -(* TEST -*) - -(* CR ocaml 5 runtime: [String] will gain a [seeded_hash] - function, implemented in the OCaml 5 runtime. When that - happens, we should checkout this test to [tip-5]. -*) +(* TEST *) (* Hashtable operations, using maps as a reference *) open Printf -module Test(H: Hashtbl.S) (M: Map.S with type key = H.key) = struct +module Test(H: Hashtbl.SeededS) (M: Map.S with type key = H.key) = struct let incl_mh m h = try @@ -90,31 +84,31 @@ module SS = struct type t = string let compare (x:t) (y:t) = Stdlib.compare x y let equal (x:t) (y:t) = x=y - let hash = Hashtbl.hash + let seeded_hash = Hashtbl.seeded_hash end module SI = struct type t = int let compare (x:t) (y:t) = Stdlib.compare x y let equal (x:t) (y:t) = x=y - let hash = Hashtbl.hash + let seeded_hash = Hashtbl.seeded_hash end module SSP = struct type t = string*string let compare (x:t) (y:t) = Stdlib.compare x y let equal (x:t) (y:t) = x=y - let hash = Hashtbl.hash + let seeded_hash = Hashtbl.seeded_hash end module SSL = struct type t = string list let compare (x:t) (y:t) = Stdlib.compare x y let equal (x:t) (y:t) = x=y - let hash = Hashtbl.hash + let seeded_hash = Hashtbl.seeded_hash end module SSA = struct type t = string array let compare (x:t) (y:t) = Stdlib.compare x y let equal (x:t) (y:t) = x=y - let hash = Hashtbl.hash + let seeded_hash = Hashtbl.seeded_hash end module MS = Map.Make(SS) @@ -126,11 +120,11 @@ module MSA = Map.Make(SSA) (* Generic hash wrapped as a functorial hash *) -module HofM (M: Map.S) : Hashtbl.S with type key = M.key = +module HofM (M: Map.S) : Hashtbl.SeededS with type key = M.key = struct type key = M.key type 'a t = (key, 'a) Hashtbl.t - let create s = Hashtbl.create s + let create ?random:bool s = Hashtbl.create s let clear = Hashtbl.clear let reset = Hashtbl.reset let copy = Hashtbl.copy @@ -161,13 +155,22 @@ module HSL = HofM(MSL) (* Specific functorial hashes *) -module HS2 = Hashtbl.Make(SS) -module HI2 = Hashtbl.Make(SI) +module HS2 = Hashtbl.MakeSeeded(SS) +module HS3 = Hashtbl.MakeSeeded(String) +module HI2 = Hashtbl.MakeSeeded(SI) + +(* Specific weak functorial hashes *) +module WS = Ephemeron.K1.MakeSeeded(SS) +module WSP1 = Ephemeron.K1.MakeSeeded(SSP) +module WSP2 = Ephemeron.K2.MakeSeeded(SS)(SS) +module WSL = Ephemeron.K1.MakeSeeded(SSL) +module WSA = Ephemeron.Kn.MakeSeeded(SS) (* Instantiating the test *) module TS1 = Test(HS1)(MS) module TS2 = Test(HS2)(MS) +module TS3 = Test(HS3)(MS) module TI1 = Test(HI1)(MI) module TI2 = Test(HI2)(MI) module TSP = Test(HSP)(MSP) @@ -244,11 +247,12 @@ let _ = TS1.test d; printf "-- Strings, functorial interface\n%!"; TS2.test d; + printf "-- Strings, functorial(String) interface\n%!"; + TS3.test d; printf "-- Pairs of strings\n%!"; TSP.test (pair_data d); printf "-- Lists of strings\n%!"; TSL.test (list_data d) -;; let () = diff --git a/testsuite/tests/lib-hashtbl/htbl.reference b/testsuite/tests/lib-hashtbl/htbl.reference index 45f56290837..7c4479968a1 100644 --- a/testsuite/tests/lib-hashtbl/htbl.reference +++ b/testsuite/tests/lib-hashtbl/htbl.reference @@ -14,6 +14,10 @@ Removal: passed Insertion: passed Insertion: passed Removal: passed +-- Strings, functorial(String) interface +Insertion: passed +Insertion: passed +Removal: passed -- Pairs of strings Insertion: passed Insertion: passed diff --git a/testsuite/tests/lib-int/test.ml b/testsuite/tests/lib-int/test.ml index db510fe5b12..2fdee39520f 100644 --- a/testsuite/tests/lib-int/test.ml +++ b/testsuite/tests/lib-int/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let test_consts () = assert (Int.zero = 0); diff --git a/testsuite/tests/lib-int64/issue9460.ml b/testsuite/tests/lib-int64/issue9460.ml index aacbe6189b8..f05005cadac 100644 --- a/testsuite/tests/lib-int64/issue9460.ml +++ b/testsuite/tests/lib-int64/issue9460.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* See https://github.com/ocaml/ocaml/issues/9460 This test comes from Richard Jones diff --git a/testsuite/tests/lib-int64/test.ml b/testsuite/tests/lib-int64/test.ml index 6bb0a5dc10b..c518ad9a087 100644 --- a/testsuite/tests/lib-int64/test.ml +++ b/testsuite/tests/lib-int64/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let test_consts () = assert (Int64.zero = 0L); diff --git a/testsuite/tests/lib-internalformat/test.ml b/testsuite/tests/lib-internalformat/test.ml index 9f81335339a..8b3d3c52757 100644 --- a/testsuite/tests/lib-internalformat/test.ml +++ b/testsuite/tests/lib-internalformat/test.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let inspect (format : _ format6) = diff --git a/testsuite/tests/lib-lazy/test.ml b/testsuite/tests/lib-lazy/test.ml index c6659f22076..cd2c351078d 100644 --- a/testsuite/tests/lib-lazy/test.ml +++ b/testsuite/tests/lib-lazy/test.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* expect-tests currently do not collect I/O, diff --git a/testsuite/tests/lib-list/test.ml b/testsuite/tests/lib-list/test.ml index 3d762e7bcaf..46b73b07201 100644 --- a/testsuite/tests/lib-list/test.ml +++ b/testsuite/tests/lib-list/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let is_even x = (x mod 2 = 0) diff --git a/testsuite/tests/lib-marshal/intext.ml b/testsuite/tests/lib-marshal/intext.ml index 8f9a26133d1..c659776d5aa 100644 --- a/testsuite/tests/lib-marshal/intext.ml +++ b/testsuite/tests/lib-marshal/intext.ml @@ -1,5 +1,5 @@ (* TEST - modules = "intextaux.c" + modules = "intextaux.c"; *) (* Test for output_value / input_value *) @@ -70,7 +70,7 @@ let test_out ?(flags = []) filename = (Nativeint.shift_left (Nativeint.of_string "123456789") 32) flags; Marshal.to_channel oc (Nativeint.shift_left (Nativeint.of_string "-123456789") 32) flags; - let i = Int64.of_string "123456789123456" in + let i = Sys.opaque_identity (Int64.of_string "123456789123456") in Marshal.to_channel oc (i,i) flags; close_out oc diff --git a/testsuite/tests/lib-marshal/intext_par.ml b/testsuite/tests/lib-marshal/intext_par.ml index 024d00a6ce7..ff98b4163d3 100644 --- a/testsuite/tests/lib-marshal/intext_par.ml +++ b/testsuite/tests/lib-marshal/intext_par.ml @@ -1,7 +1,7 @@ (* TEST -* skip -reason = "OCaml 5 only" - modules = "intextaux_par.c" + reason = "CR ocaml 5 domains: re-enable this test"; + modules = "intextaux_par.c"; + skip; *) (* Test for output_value / input_value *) @@ -70,7 +70,8 @@ let test_out filename = output_value oc (Nativeint.of_string "-123456"); output_value oc (Nativeint.shift_left (Nativeint.of_string "123456789") 32); output_value oc (Nativeint.shift_left (Nativeint.of_string "-123456789") 32); - let i = Int64.of_string "123456789123456" in output_value oc (i,i); + let i = Sys.opaque_identity (Int64.of_string "123456789123456") in + output_value oc (i,i); close_out oc diff --git a/testsuite/tests/lib-obj/get_header.byte.reference b/testsuite/tests/lib-obj/get_header.byte.reference deleted file mode 100644 index 1627d1560fc..00000000000 --- a/testsuite/tests/lib-obj/get_header.byte.reference +++ /dev/null @@ -1,3 +0,0 @@ -None false -Some(wosize=1,color=0,tag=252) false -Some(wosize=1,color=0,tag=0) false diff --git a/testsuite/tests/lib-obj/get_header.heap.reference b/testsuite/tests/lib-obj/get_header.heap.reference new file mode 100644 index 00000000000..186569a327c --- /dev/null +++ b/testsuite/tests/lib-obj/get_header.heap.reference @@ -0,0 +1,2 @@ +None +Some(wosize=1,color=3,tag=252) diff --git a/testsuite/tests/lib-obj/get_header.ml b/testsuite/tests/lib-obj/get_header.ml index d13c1fafd69..420e62672cc 100644 --- a/testsuite/tests/lib-obj/get_header.ml +++ b/testsuite/tests/lib-obj/get_header.ml @@ -1,10 +1,20 @@ (* TEST - * native - reference = "${test_source_directory}/get_header.opt.reference" - * bytecode - reference = "${test_source_directory}/get_header.byte.reference" + { + stack-allocation; + reference = "${test_source_directory}/get_header.stack.reference"; + native; + }{ + no-stack-allocation; + reference = "${test_source_directory}/get_header.heap.reference"; + native; + } *) +(* We're likely to remove %get_header in favour of calls to + caml_obj_is_stack under runtime5 (since testing a block's colour isn't + sufficient to check for local allocations) so this doesn't check for local + allocations any more. *) + external repr : ('a[@local_opt]) -> (Obj.t[@local_opt]) = "%identity" external get_header_unsafe : (Obj.t[@local_opt]) -> nativeint = "%get_header" external is_int : (Obj.t[@local_opt]) -> bool = "%obj_is_int" @@ -49,31 +59,15 @@ let print_maybe_header ppf header = | None -> Format.fprintf ppf "None" | Some header -> Format.fprintf ppf "Some(%a)" print_header header -let is_local repr = - match get_header_parsed repr with - | None -> false - | Some {color; _} -> color = 2 - (* immediate *) let () = let x = 42 in let rp = repr x in - Format.printf "%a %a\n" print_maybe_header (get_header_parsed rp) - Format.pp_print_bool (is_local rp) + Format.printf "%a\n" print_maybe_header (get_header_parsed rp) (* global*) let () = let s = "hello" in let _r = ref s in let rp = repr s in - Format.printf "%a %a\n" print_maybe_header (get_header_parsed rp) - Format.pp_print_bool (is_local rp) - -(* local *) -let foo x = - let local_ s = ref x in - let rp = repr s in - Format.printf "%a %a\n" print_maybe_header (get_header_parsed rp) - Format.pp_print_bool (is_local rp) - -let () = foo 42 + Format.printf "%a\n" print_maybe_header (get_header_parsed rp) diff --git a/testsuite/tests/lib-obj/get_header.opt.reference b/testsuite/tests/lib-obj/get_header.opt.reference deleted file mode 100644 index 4eee2c72cf2..00000000000 --- a/testsuite/tests/lib-obj/get_header.opt.reference +++ /dev/null @@ -1,3 +0,0 @@ -None false -Some(wosize=1,color=3,tag=252) false -Some(wosize=1,color=2,tag=0) true diff --git a/testsuite/tests/lib-obj/get_header.stack.reference b/testsuite/tests/lib-obj/get_header.stack.reference new file mode 100644 index 00000000000..186569a327c --- /dev/null +++ b/testsuite/tests/lib-obj/get_header.stack.reference @@ -0,0 +1,2 @@ +None +Some(wosize=1,color=3,tag=252) diff --git a/testsuite/tests/lib-obj/new_obj.ml b/testsuite/tests/lib-obj/new_obj.ml index 049a300f555..ae28f52ea8c 100644 --- a/testsuite/tests/lib-obj/new_obj.ml +++ b/testsuite/tests/lib-obj/new_obj.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let _ = diff --git a/testsuite/tests/lib-obj/reachable_words.ml b/testsuite/tests/lib-obj/reachable_words.ml index 8ec724343cc..42bb2430aed 100644 --- a/testsuite/tests/lib-obj/reachable_words.ml +++ b/testsuite/tests/lib-obj/reachable_words.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) diff --git a/testsuite/tests/lib-obj/reachable_words_bug.ml b/testsuite/tests/lib-obj/reachable_words_bug.ml index 15969eb4210..54e2aadd649 100644 --- a/testsuite/tests/lib-obj/reachable_words_bug.ml +++ b/testsuite/tests/lib-obj/reachable_words_bug.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let _ = (* In 4.13 this causes Obj.reachable_words to segfault diff --git a/testsuite/tests/lib-obj/uniform_or_mixed.bytecode.reference b/testsuite/tests/lib-obj/uniform_or_mixed.bytecode.reference new file mode 100644 index 00000000000..2d25c017d26 --- /dev/null +++ b/testsuite/tests/lib-obj/uniform_or_mixed.bytecode.reference @@ -0,0 +1,7 @@ +t_uniform1: uniform +t_uniform2.0: uniform +t_uniform2.1: uniform +t_uniform3: uniform +t_mixed0: mixed (scannable_prefix_len = 1) +t_mixed1: mixed (scannable_prefix_len = 2) +t_mixed2: mixed (scannable_prefix_len = 3) diff --git a/testsuite/tests/lib-obj/uniform_or_mixed.ml b/testsuite/tests/lib-obj/uniform_or_mixed.ml new file mode 100644 index 00000000000..11a9fd292f4 --- /dev/null +++ b/testsuite/tests/lib-obj/uniform_or_mixed.ml @@ -0,0 +1,53 @@ +(* TEST + flags = "-extension layouts_beta"; + { + reference = "${test_source_directory}/uniform_or_mixed.native.reference"; + compiler_reference2 = "${test_source_directory}/uniform_or_mixed.compiler.reference"; + native; + }{ + reference = "${test_source_directory}/uniform_or_mixed.bytecode.reference"; + compiler_reference2 = "${test_source_directory}/uniform_or_mixed.compiler.reference"; + bytecode; + } +*) + +(* Bytecode and native code have slightly different outputs for the scannable prefix + of mixed records. The fields of mixed records must be scanned in bytecode. + (They are "faux mixed blocks".) +*) + +type t_uniform1 = { x : int } +type t_uniform2 = floatarray +type t_uniform3 = int -> int + +type t_mixed0 = { x : int64# } +type t_mixed1 = { x : string; y : int64# } +type t_mixed2 = { x : string; y : string; z : int64# } + +let run (type a) test_name (obj : a) = + let obj = Obj.repr obj in + let uniform_or_mixed = Obj.Uniform_or_mixed.of_block obj in + match Obj.Uniform_or_mixed.repr uniform_or_mixed with + | Uniform -> + assert (Obj.Uniform_or_mixed.is_uniform uniform_or_mixed); + assert (not (Obj.Uniform_or_mixed.is_mixed uniform_or_mixed)); + Printf.printf "%s: uniform\n" test_name + | Mixed { scannable_prefix_len } -> + assert (Obj.Uniform_or_mixed.is_mixed uniform_or_mixed); + assert (not (Obj.Uniform_or_mixed.is_uniform uniform_or_mixed)); + assert + (Obj.Uniform_or_mixed.mixed_scannable_prefix_len_exn uniform_or_mixed = + scannable_prefix_len); + Printf.printf "%s: mixed (scannable_prefix_len = %d)\n" + test_name scannable_prefix_len; +;; + +let () = run "t_uniform1" ({ x = 3 } : t_uniform1) +let () = run "t_uniform2.0" (Float.Array.create 0 : t_uniform2) +let () = run "t_uniform2.1" (Float.Array.create 1 : t_uniform2) +let () = run "t_uniform3" ((fun x -> x) : t_uniform3) + +let () = run "t_mixed0" ({ x = #4L } : t_mixed0) +let () = run "t_mixed1" ({ x = ""; y = #5L } : t_mixed1) +let () = run "t_mixed2" ({ x = ""; y = ""; z = #5L }: t_mixed2) + diff --git a/testsuite/tests/lib-obj/uniform_or_mixed.native.reference b/testsuite/tests/lib-obj/uniform_or_mixed.native.reference new file mode 100644 index 00000000000..84ec36c9afc --- /dev/null +++ b/testsuite/tests/lib-obj/uniform_or_mixed.native.reference @@ -0,0 +1,7 @@ +t_uniform1: uniform +t_uniform2.0: uniform +t_uniform2.1: uniform +t_uniform3: uniform +t_mixed0: mixed (scannable_prefix_len = 0) +t_mixed1: mixed (scannable_prefix_len = 1) +t_mixed2: mixed (scannable_prefix_len = 2) diff --git a/testsuite/tests/lib-obj/uniquely_reachable_words.ml b/testsuite/tests/lib-obj/uniquely_reachable_words.ml index a98eb7f16e8..0c035d30118 100644 --- a/testsuite/tests/lib-obj/uniquely_reachable_words.ml +++ b/testsuite/tests/lib-obj/uniquely_reachable_words.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let native = match Sys.backend_type with diff --git a/testsuite/tests/lib-obj/with_tag.ml b/testsuite/tests/lib-obj/with_tag.ml index e8929436b85..bf13cb83e28 100644 --- a/testsuite/tests/lib-obj/with_tag.ml +++ b/testsuite/tests/lib-obj/with_tag.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) type t = | A of string * float diff --git a/testsuite/tests/lib-option/test.ml b/testsuite/tests/lib-option/test.ml index 316e3eae97d..5383c382c26 100644 --- a/testsuite/tests/lib-option/test.ml +++ b/testsuite/tests/lib-option/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let strf = Printf.sprintf let assert_raise_invalid_argument f v = diff --git a/testsuite/tests/lib-printf/pr6534.ml b/testsuite/tests/lib-printf/pr6534.ml index b475c58ab01..f4b4fb8d5a2 100644 --- a/testsuite/tests/lib-printf/pr6534.ml +++ b/testsuite/tests/lib-printf/pr6534.ml @@ -1,6 +1,6 @@ (* TEST - include testing - flags = "-no-strict-formats" + include testing; + flags = "-no-strict-formats"; *) (* these are not valid under -strict-formats, but we test them here diff --git a/testsuite/tests/lib-printf/pr6938.ml b/testsuite/tests/lib-printf/pr6938.ml index 5331b77e9f1..cf90e0a8dc3 100644 --- a/testsuite/tests/lib-printf/pr6938.ml +++ b/testsuite/tests/lib-printf/pr6938.ml @@ -1,6 +1,6 @@ (* TEST - include testing - flags = "-no-strict-formats" + include testing; + flags = "-no-strict-formats"; *) (* these are not valid under -strict-formats, but we test them here diff --git a/testsuite/tests/lib-printf/tprintf.ml b/testsuite/tests/lib-printf/tprintf.ml index e3887bd8076..4241a804f72 100644 --- a/testsuite/tests/lib-printf/tprintf.ml +++ b/testsuite/tests/lib-printf/tprintf.ml @@ -1,6 +1,6 @@ (* TEST - include testing - flags = "-no-strict-formats" + include testing; + flags = "-no-strict-formats"; *) (* diff --git a/testsuite/tests/lib-queue/test.ml b/testsuite/tests/lib-queue/test.ml index ac05f4e3030..cff8e2cd65e 100644 --- a/testsuite/tests/lib-queue/test.ml +++ b/testsuite/tests/lib-queue/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) module Q = struct include Queue diff --git a/testsuite/tests/lib-random/chi2.ml b/testsuite/tests/lib-random/chi2.ml index 180beb59931..3804f6511c3 100644 --- a/testsuite/tests/lib-random/chi2.ml +++ b/testsuite/tests/lib-random/chi2.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* A basic chi-square test to detect simple errors in the Random module. *) @@ -96,7 +95,6 @@ let _ = (let p = Int64.to_int 17766642568158577L in fun () -> Random.full_int (256 * p) / p) end; -(* BACKPORT let r1 = Random.split() in let r2 = Random.split() in let r3 = Random.State.split r1 in @@ -106,4 +104,3 @@ let _ = (fun () -> Random.State.bits r1 - Random.State.bits r2); test "Random.split (r2-r3)" (fun () -> Random.State.bits r2 - Random.State.bits r3) -*) diff --git a/testsuite/tests/lib-random/defaultinit.ml b/testsuite/tests/lib-random/defaultinit.ml index df3550374eb..79179d98913 100644 --- a/testsuite/tests/lib-random/defaultinit.ml +++ b/testsuite/tests/lib-random/defaultinit.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) (* Check that the numbers drawn from the default state are the same diff --git a/testsuite/tests/lib-random/defaultinit.reference b/testsuite/tests/lib-random/defaultinit.reference index 943addd1bd3..9d2c43cf792 100644 --- a/testsuite/tests/lib-random/defaultinit.reference +++ b/testsuite/tests/lib-random/defaultinit.reference @@ -1,4 +1,4 @@ - 344 685 182 641 439 500 104 20 921 370 217 885 949 678 615 412 401 606 428 869 289 + 754 262 510 865 996 861 495 37 283 434 98 495 144 34 806 28 180 58 416 138 654 - 122.128067547 461.324792129 360.006556146 768.75882284 396.500946942 190.217751234 567.660068681 403.59226778 59.8488223602 363.816246826 764.705761642 172.627051105 481.861849093 399.173195422 629.424106752 391.547032203 676.701133948 174.382120878 994.425675487 585.00027757 34.3270777955 + 889.820262688 163.886958714 809.261276959 163.701988701 285.093960955 159.853482937 753.952858458 718.309149819 113.116488344 275.531702635 844.229063886 592.96154003 974.771041906 295.713668995 374.084883719 600.675753364 478.414704679 821.538029441 193.559890207 858.508699222 795.477498048 All tests succeeded. diff --git a/testsuite/tests/lib-random/full_int.reference b/testsuite/tests/lib-random/full_int.reference index a3408fb8b26..620db675b37 100644 --- a/testsuite/tests/lib-random/full_int.reference +++ b/testsuite/tests/lib-random/full_int.reference @@ -1 +1 @@ -6beb775a +3a2bb8b8 diff --git a/testsuite/tests/lib-random/parallel.ml b/testsuite/tests/lib-random/parallel.ml index 90a78e22506..07805a0e878 100644 --- a/testsuite/tests/lib-random/parallel.ml +++ b/testsuite/tests/lib-random/parallel.ml @@ -1,11 +1,14 @@ (* TEST - include unix - * skip - reason = "OCaml 5 only" - ** libunix - *** bytecode - *** native - *) + include unix; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + libunix; + { + bytecode; + }{ + native; + } +*) let () = Random.init 42 diff --git a/testsuite/tests/lib-random/selfinit.ml b/testsuite/tests/lib-random/selfinit.ml index 1664907de4c..eab1bfaf1ae 100644 --- a/testsuite/tests/lib-random/selfinit.ml +++ b/testsuite/tests/lib-random/selfinit.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Test that two Random.self_init() in close succession will not result in the same PRNG state. diff --git a/testsuite/tests/lib-random/testvectors.ml b/testsuite/tests/lib-random/testvectors.ml index 2d04120974b..a8ccca12d5e 100644 --- a/testsuite/tests/lib-random/testvectors.ml +++ b/testsuite/tests/lib-random/testvectors.ml @@ -1,6 +1,7 @@ (* TEST - * skip - reason = "OCaml 5 only" + runtime5; + { bytecode; } + { native; } *) (* Check the numbers drawn from a known state against the numbers diff --git a/testsuite/tests/lib-result/test.ml b/testsuite/tests/lib-result/test.ml index 6e7a5cc8cf2..c32c7dc3952 100644 --- a/testsuite/tests/lib-result/test.ml +++ b/testsuite/tests/lib-result/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let strf = Printf.sprintf let assert_raise_invalid_argument f v = diff --git a/testsuite/tests/lib-runtime-events/test.ml b/testsuite/tests/lib-runtime-events/test.ml index 8ccaccdf256..4b5b289f04e 100644 --- a/testsuite/tests/lib-runtime-events/test.ml +++ b/testsuite/tests/lib-runtime-events/test.ml @@ -1,8 +1,24 @@ (* TEST -modules = "stubs.c" -include runtime_events -* skip -reason = "OCaml 5 only" + { + runtime4; + skip; + }{ + reason="this runtime_events test is currently broken, to be fixed later"; + skip; + } +*) + +(* Header to start from when this test gets fixed: + { + runtime4; + skip; + }{ + modules = "stubs.c"; + include runtime_events; + runtime5; + { bytecode; } + { native; } + } *) external start_runtime_events : unit -> unit = "start_runtime_events" diff --git a/testsuite/tests/lib-runtime-events/test_caml.ml b/testsuite/tests/lib-runtime-events/test_caml.ml index 6cc9474f2e7..4095c28ca51 100644 --- a/testsuite/tests/lib-runtime-events/test_caml.ml +++ b/testsuite/tests/lib-runtime-events/test_caml.ml @@ -1,8 +1,25 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + { + runtime4; + skip; + }{ + reason="this runtime_events test is currently broken, to be fixed later"; + skip; + } *) + +(* Header to start from when this test gets fixed: + { + runtime4; + skip; + }{ + include runtime_events; + runtime5; + { bytecode; } + { native; } + } +*) + open Runtime_events let major = ref 0 diff --git a/testsuite/tests/lib-runtime-events/test_caml_counters.ml b/testsuite/tests/lib-runtime-events/test_caml_counters.ml index e64a4fec094..2c18a609449 100644 --- a/testsuite/tests/lib-runtime-events/test_caml_counters.ml +++ b/testsuite/tests/lib-runtime-events/test_caml_counters.ml @@ -1,7 +1,13 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + { + runtime4; + skip; + }{ + include runtime_events; + runtime5; + { bytecode; } + { native; } + } *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_caml_exception.ml b/testsuite/tests/lib-runtime-events/test_caml_exception.ml index 6738603ddd0..6f68bd8cde3 100644 --- a/testsuite/tests/lib-runtime-events/test_caml_exception.ml +++ b/testsuite/tests/lib-runtime-events/test_caml_exception.ml @@ -1,7 +1,13 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + { + include runtime_events; + runtime5; + { bytecode; } + { native; } + }{ + runtime4; + skip; + } *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_caml_parallel.ml b/testsuite/tests/lib-runtime-events/test_caml_parallel.ml index 391186d007c..ceddc35dcd5 100644 --- a/testsuite/tests/lib-runtime-events/test_caml_parallel.ml +++ b/testsuite/tests/lib-runtime-events/test_caml_parallel.ml @@ -1,7 +1,7 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + include runtime_events; + reason = "CR OCaml 5 domains"; + skip; *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_caml_reentry.ml b/testsuite/tests/lib-runtime-events/test_caml_reentry.ml index 724466a63b4..dbfd44f59ae 100644 --- a/testsuite/tests/lib-runtime-events/test_caml_reentry.ml +++ b/testsuite/tests/lib-runtime-events/test_caml_reentry.ml @@ -1,7 +1,13 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + { + include runtime_events; + runtime5; + { bytecode; } + { native; } + }{ + runtime4; + skip; + } *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_caml_runparams.ml b/testsuite/tests/lib-runtime-events/test_caml_runparams.ml index 4dc607eed36..3ced8b7d05e 100644 --- a/testsuite/tests/lib-runtime-events/test_caml_runparams.ml +++ b/testsuite/tests/lib-runtime-events/test_caml_runparams.ml @@ -1,8 +1,14 @@ (* TEST -include runtime_events -ocamlrunparam += ",e=4" -* skip -reason = "OCaml 5 only" + { + runtime4; + skip; + }{ + include runtime_events; + ocamlrunparam += ",e=4"; + runtime5; + { bytecode; } + { native; } + } *) (* We set the ring buffer size smaller and witness that we do indeed diff --git a/testsuite/tests/lib-runtime-events/test_caml_slot_reuse.ml b/testsuite/tests/lib-runtime-events/test_caml_slot_reuse.ml index 8656ca2e592..050757f9165 100644 --- a/testsuite/tests/lib-runtime-events/test_caml_slot_reuse.ml +++ b/testsuite/tests/lib-runtime-events/test_caml_slot_reuse.ml @@ -1,7 +1,7 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + include runtime_events; + reason = "CR OCaml 5 domains"; + skip; *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_caml_stubs_gc.ml b/testsuite/tests/lib-runtime-events/test_caml_stubs_gc.ml index d63066e646a..9695d65b915 100644 --- a/testsuite/tests/lib-runtime-events/test_caml_stubs_gc.ml +++ b/testsuite/tests/lib-runtime-events/test_caml_stubs_gc.ml @@ -1,7 +1,13 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + { + runtime4; + skip; + }{ + include runtime_events; + runtime5; + { bytecode; } + { native; } + } *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_compact.ml b/testsuite/tests/lib-runtime-events/test_compact.ml new file mode 100644 index 00000000000..d535a566971 --- /dev/null +++ b/testsuite/tests/lib-runtime-events/test_compact.ml @@ -0,0 +1,83 @@ +(* TEST + { + runtime4; + skip; + }{ + runtime5; + include runtime_events; + { bytecode; } + { native; } + } +*) +open Runtime_events + +type state = + | INIT + | BEGIN + | EVACUATING_BEGIN + | EVACUATING_END + | FORWARDING_BEGIN + | FORWARDING_END + | RELEASING_BEGIN + | RELEASING_END + | END + +let compact_state = ref INIT + +let () = + start (); + let cursor = create_cursor None in + let runtime_begin domain_id ts phase = + match phase with + | EV_COMPACT -> + begin + match !compact_state with + | INIT -> compact_state := BEGIN + | _ -> assert(false) + end + | EV_COMPACT_EVACUATE -> begin + match !compact_state with + | BEGIN -> compact_state := EVACUATING_BEGIN + | _ -> assert(false) + end + | EV_COMPACT_FORWARD -> begin + match !compact_state with + | EVACUATING_END -> compact_state := FORWARDING_BEGIN + | _ -> assert(false) + end + | EV_COMPACT_RELEASE -> begin + match !compact_state with + | FORWARDING_END -> compact_state := RELEASING_BEGIN + | _ -> assert(false) + end + | _ -> () in + let runtime_end domain_id ts phase = + match phase with + | EV_COMPACT -> + begin + match !compact_state with + | RELEASING_END -> compact_state := END + | _ -> assert(false) + end + | EV_COMPACT_EVACUATE -> begin + match !compact_state with + | EVACUATING_BEGIN -> compact_state := EVACUATING_END + | _ -> assert(false) + end + | EV_COMPACT_FORWARD -> begin + match !compact_state with + | FORWARDING_BEGIN -> compact_state := FORWARDING_END + | _ -> assert(false) + end + | EV_COMPACT_RELEASE -> begin + match !compact_state with + | RELEASING_BEGIN -> compact_state := RELEASING_END + | _ -> assert(false) + end + | _ -> () + in + let callbacks = Callbacks.create ~runtime_begin ~runtime_end () + in + Gc.compact (); + ignore(read_poll cursor callbacks (Some 1_000)); + assert(!compact_state = END) diff --git a/testsuite/tests/lib-runtime-events/test_dropped_events.ml b/testsuite/tests/lib-runtime-events/test_dropped_events.ml index 7d51efd32e0..e4832a1d9df 100644 --- a/testsuite/tests/lib-runtime-events/test_dropped_events.ml +++ b/testsuite/tests/lib-runtime-events/test_dropped_events.ml @@ -1,12 +1,15 @@ (* TEST - include runtime_events - include unix - set OCAMLRUNPARAM = "e=6" - * skip - reason = "OCaml 5 only" - ** libunix - *** native - *** bytecode + include runtime_events; + include unix; + set OCAMLRUNPARAM = "e=6"; + reason = "CR OCaml 5 domains"; + skip; + libunix; + { + native; + }{ + bytecode; + } *) type Runtime_events.User.tag += Ev diff --git a/testsuite/tests/lib-runtime-events/test_env_start.ml b/testsuite/tests/lib-runtime-events/test_env_start.ml index cbdf114e57b..98fab36f9cd 100644 --- a/testsuite/tests/lib-runtime-events/test_env_start.ml +++ b/testsuite/tests/lib-runtime-events/test_env_start.ml @@ -1,8 +1,14 @@ (* TEST -include runtime_events -set OCAML_RUNTIME_EVENTS_START = "1" -* skip -reason = "OCaml 5 only" + { + runtime4; + skip; + }{ + include runtime_events; + set OCAML_RUNTIME_EVENTS_START = "1"; + runtime5; + { bytecode; } + { native; } + } *) (* In this test the runtime_events should already be started by the environment diff --git a/testsuite/tests/lib-runtime-events/test_external.ml b/testsuite/tests/lib-runtime-events/test_external.ml index d050391d1e6..77f3f8b9bf3 100644 --- a/testsuite/tests/lib-runtime-events/test_external.ml +++ b/testsuite/tests/lib-runtime-events/test_external.ml @@ -1,11 +1,19 @@ (* TEST - reason = "OCaml 5 only" - include runtime_events - include unix - * skip - ** libunix - *** bytecode - *** native *) + { + runtime4; + skip; + }{ + include runtime_events; + include unix; + runtime5; + libunix; + { + bytecode; + }{ + native; + } + } +*) let got_major = ref false let got_minor = ref false diff --git a/testsuite/tests/lib-runtime-events/test_external_preserve.ml b/testsuite/tests/lib-runtime-events/test_external_preserve.ml index 76d66b1b669..3cbe60a037a 100644 --- a/testsuite/tests/lib-runtime-events/test_external_preserve.ml +++ b/testsuite/tests/lib-runtime-events/test_external_preserve.ml @@ -1,12 +1,20 @@ (* TEST - include runtime_events - include unix - set OCAML_RUNTIME_EVENTS_PRESERVE = "1" - * skip - reason = "OCaml 5 only" - ** libunix - *** bytecode - *** native *) + { + runtime4; + skip; + }{ + include runtime_events; + include unix; + set OCAML_RUNTIME_EVENTS_PRESERVE = "1"; + runtime5; + libunix; + { + bytecode; + }{ + native; + } + } +*) (* this tests the preservation of ring buffers after termination *) diff --git a/testsuite/tests/lib-runtime-events/test_fork.ml b/testsuite/tests/lib-runtime-events/test_fork.ml index 097905b6261..293d60435e7 100644 --- a/testsuite/tests/lib-runtime-events/test_fork.ml +++ b/testsuite/tests/lib-runtime-events/test_fork.ml @@ -1,11 +1,19 @@ (* TEST - include runtime_events - include unix - * skip - reason = "OCaml 5 only" - ** libunix - *** bytecode - *** native *) + { + runtime4; + skip; + }{ + include runtime_events; + include unix; + runtime5; + libunix; + { + bytecode; + }{ + native; + } + } +*) let got_start = ref false let got_fork_child = ref false diff --git a/testsuite/tests/lib-runtime-events/test_instrumented.ml b/testsuite/tests/lib-runtime-events/test_instrumented.ml index e353268013e..9a1df4806ce 100644 --- a/testsuite/tests/lib-runtime-events/test_instrumented.ml +++ b/testsuite/tests/lib-runtime-events/test_instrumented.ml @@ -1,11 +1,14 @@ (* TEST - include runtime_events - flags = "-runtime-variant=i" - - * skip - reason = "OCaml 5 only" - ** instrumented-runtime - *** native + { + runtime4; + skip; + }{ + include runtime_events; + flags = "-runtime-variant=i"; + runtime5; + instrumented-runtime; + native; + } *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_instrumented.reference b/testsuite/tests/lib-runtime-events/test_instrumented.reference index 2d9ac36c99b..de633b698d4 100644 --- a/testsuite/tests/lib-runtime-events/test_instrumented.reference +++ b/testsuite/tests/lib-runtime-events/test_instrumented.reference @@ -1 +1 @@ -lost_event_words: 0, total_sizes: 2000004, total_minors: 31 +lost_event_words: 0, total_sizes: 2000004, total_minors: 20 diff --git a/testsuite/tests/lib-runtime-events/test_user_event.ml b/testsuite/tests/lib-runtime-events/test_user_event.ml index 51566e99eda..fa51624f308 100644 --- a/testsuite/tests/lib-runtime-events/test_user_event.ml +++ b/testsuite/tests/lib-runtime-events/test_user_event.ml @@ -1,7 +1,13 @@ (* TEST -include runtime_events -* skip -reason = "OCaml 5 only" + { + runtime4; + skip; + }{ + include runtime_events; + runtime5; + { bytecode; } + { native; } + } *) open Runtime_events diff --git a/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml b/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml index a6b5740ae71..b49a1ce8df0 100644 --- a/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml +++ b/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml @@ -1,12 +1,19 @@ (* TEST - include runtime_events - include unix - set OCAML_RUNTIME_EVENTS_PRESERVE = "1" - * skip - reason = "OCaml 5 only" - ** libunix - *** bytecode - *** native + { + runtime4; + skip; + }{ + include runtime_events; + include unix; + set OCAML_RUNTIME_EVENTS_PRESERVE = "1"; + runtime5; + libunix; + { + bytecode; + }{ + native; + } + } *) open Runtime_events diff --git a/testsuite/tests/lib-scanf-2/tscanf2_master.ml b/testsuite/tests/lib-scanf-2/tscanf2_master.ml index d364ceabcdf..7d1e8ee7f8c 100644 --- a/testsuite/tests/lib-scanf-2/tscanf2_master.ml +++ b/testsuite/tests/lib-scanf-2/tscanf2_master.ml @@ -1,59 +1,36 @@ (* TEST - -modules = "tscanf2_io.ml" -* hasunix -include unix -readonly_files = "tscanf2_worker.ml" -reference = "${test_source_directory}/tscanf2.reference" - -(* The bytcode test *) - -** setup-ocamlc.byte-build-env - -program = "${test_build_directory}/master.byte" - -*** ocamlc.byte (* Compiles the master *) - -**** ocamlc.byte (* Compiles the worker *) - -all_modules = "tscanf2_io.cmo tscanf2_worker.ml" - -program = "${test_build_directory}/worker.byte" - -***** check-ocamlc.byte-output - -****** run - -program = "${test_build_directory}/master.byte" - -arguments = "${test_build_directory}/worker.byte" - -******* check-program-output - -(* The native test *) - -** setup-ocamlopt.byte-build-env - -program = "${test_build_directory}/master.opt" - -*** ocamlopt.byte (* Compiles the master *) - -**** ocamlopt.byte (* Compiles the worker *) - -all_modules = "tscanf2_io.cmx tscanf2_worker.ml" - -program = "${test_build_directory}/worker.opt" - -***** check-ocamlopt.byte-output - -****** run - -program = "${test_build_directory}/master.opt" - -arguments = "${test_build_directory}/worker.opt" - -******* check-program-output - + modules = "tscanf2_io.ml"; + include unix; + readonly_files = "tscanf2_worker.ml"; + reference = "${test_source_directory}/tscanf2.reference"; + hasunix; + { + (* The bytecode test *) + program = "${test_build_directory}/master.byte"; + setup-ocamlc.byte-build-env; + ocamlc.byte; (* Compiles the master *) + all_modules = "tscanf2_io.cmo tscanf2_worker.ml"; + program = "${test_build_directory}/worker.byte"; + ocamlc.byte; (* Compiles the worker *) + check-ocamlc.byte-output; + program = "${test_build_directory}/master.byte"; + arguments = "${test_build_directory}/worker.byte"; + run; + check-program-output; + }{ + (* The native test *) + program = "${test_build_directory}/master.opt"; + setup-ocamlopt.byte-build-env; + ocamlopt.byte; (* Compiles the master *) + all_modules = "tscanf2_io.cmx tscanf2_worker.ml"; + program = "${test_build_directory}/worker.opt"; + ocamlopt.byte; (* Compiles the worker *) + check-ocamlopt.byte-output; + program = "${test_build_directory}/master.opt"; + arguments = "${test_build_directory}/worker.opt"; + run; + check-program-output; + } *) (* A very simple master: diff --git a/testsuite/tests/lib-scanf/tscanf.ml b/testsuite/tests/lib-scanf/tscanf.ml index e9be7179c14..b79aab37cf7 100644 --- a/testsuite/tests/lib-scanf/tscanf.ml +++ b/testsuite/tests/lib-scanf/tscanf.ml @@ -1,5 +1,5 @@ (* TEST - include testing + include testing; *) (* diff --git a/testsuite/tests/lib-seq/test.ml b/testsuite/tests/lib-seq/test.ml index 31913dc4191..2936213c728 100644 --- a/testsuite/tests/lib-seq/test.ml +++ b/testsuite/tests/lib-seq/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let (!?) = List.to_seq let (!!) = List.of_seq diff --git a/testsuite/tests/lib-set/testmap.ml b/testsuite/tests/lib-set/testmap.ml index b41c020df05..354567089f0 100644 --- a/testsuite/tests/lib-set/testmap.ml +++ b/testsuite/tests/lib-set/testmap.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) module M = Map.Make(struct type t = int let compare (x:t) y = compare x y end) diff --git a/testsuite/tests/lib-set/testset.ml b/testsuite/tests/lib-set/testset.ml index 764987c00c6..2d1bdb7e368 100644 --- a/testsuite/tests/lib-set/testset.ml +++ b/testsuite/tests/lib-set/testset.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) module S = Set.Make(struct type t = int let compare (x:t) y = compare x y end) diff --git a/testsuite/tests/lib-stack/test.ml b/testsuite/tests/lib-stack/test.ml index 16544f3fb63..e772d546c97 100644 --- a/testsuite/tests/lib-stack/test.ml +++ b/testsuite/tests/lib-stack/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) module S = struct include Stack diff --git a/testsuite/tests/lib-stdlabels/test_stdlabels.ml b/testsuite/tests/lib-stdlabels/test_stdlabels.ml index c846bcb7be1..e7c8ebc9db9 100644 --- a/testsuite/tests/lib-stdlabels/test_stdlabels.ml +++ b/testsuite/tests/lib-stdlabels/test_stdlabels.ml @@ -1,5 +1,5 @@ (* TEST - flags += " -nolabels " + flags += " -nolabels "; *) module A : module type of Array = ArrayLabels diff --git a/testsuite/tests/lib-str/parallel.ml b/testsuite/tests/lib-str/parallel.ml index 08055698e74..1d9f2f5d388 100644 --- a/testsuite/tests/lib-str/parallel.ml +++ b/testsuite/tests/lib-str/parallel.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasstr -include str -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include str; + hasstr; + { + bytecode; + }{ + native; + } *) let total = Atomic.make 0 diff --git a/testsuite/tests/lib-str/t01.ml b/testsuite/tests/lib-str/t01.ml index 076172bdcb9..ec8590157f3 100644 --- a/testsuite/tests/lib-str/t01.ml +++ b/testsuite/tests/lib-str/t01.ml @@ -1,8 +1,11 @@ (* TEST -* hasstr -include str -** bytecode -** native + include str; + hasstr; + { + bytecode; + }{ + native; + } *) open Printf diff --git a/testsuite/tests/lib-string/binary.ml b/testsuite/tests/lib-string/binary.ml index 86f038d2da3..c67656c5d16 100644 --- a/testsuite/tests/lib-string/binary.ml +++ b/testsuite/tests/lib-string/binary.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let err x = match Lazy.force x with diff --git a/testsuite/tests/lib-string/test_string.ml b/testsuite/tests/lib-string/test_string.ml index 399fa8210be..f58349c7481 100644 --- a/testsuite/tests/lib-string/test_string.ml +++ b/testsuite/tests/lib-string/test_string.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) open Printf let rec build_string f n accu = @@ -41,15 +40,12 @@ let () = done ;; - -(* BACKPORT let () = printf "-- Hashtbl.hash raw_string: %x\n%!" (Hashtbl.hash raw_string); printf "-- String.hash raw_string: %x\n%!" (String.hash raw_string); printf "-- Hashtbl.seeded_hash 16 raw_string: %x\n%!" (Hashtbl.seeded_hash 16 raw_string); printf "-- String.seeded_hash 16 raw_string: %x\n%!" (String.seeded_hash 16 raw_string); ;; -*) (* GPR#805/815/833 *) diff --git a/testsuite/tests/lib-string/test_string.reference b/testsuite/tests/lib-string/test_string.reference index e69de29bb2d..2a48fe55568 100644 --- a/testsuite/tests/lib-string/test_string.reference +++ b/testsuite/tests/lib-string/test_string.reference @@ -0,0 +1,4 @@ +-- Hashtbl.hash raw_string: 240a0e56 +-- String.hash raw_string: 240a0e56 +-- Hashtbl.seeded_hash 16 raw_string: 3210af30 +-- String.seeded_hash 16 raw_string: 3210af30 diff --git a/testsuite/tests/lib-sync/prodcons.ml b/testsuite/tests/lib-sync/prodcons.ml index 2b86809df1c..f02257b7547 100644 --- a/testsuite/tests/lib-sync/prodcons.ml +++ b/testsuite/tests/lib-sync/prodcons.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* Classic producer-consumer *) diff --git a/testsuite/tests/lib-sync/trylock.ml b/testsuite/tests/lib-sync/trylock.ml index 6bbdad7c739..53c6d133ae5 100644 --- a/testsuite/tests/lib-sync/trylock.ml +++ b/testsuite/tests/lib-sync/trylock.ml @@ -1,6 +1,7 @@ (* TEST - * skip - reason = "OCaml 5 only" + runtime5; + { bytecode; } + { native; } *) (* Test Mutex.try_lock *) diff --git a/testsuite/tests/lib-sync/trylock2.ml b/testsuite/tests/lib-sync/trylock2.ml index ad60e2eec89..77a86ed45d0 100644 --- a/testsuite/tests/lib-sync/trylock2.ml +++ b/testsuite/tests/lib-sync/trylock2.ml @@ -1,6 +1,7 @@ (* TEST - * skip - reason = "OCaml 5 only" + runtime5; + { bytecode; } + { native; } *) (* Test Mutex.try_lock *) diff --git a/testsuite/tests/lib-sys/immediate64.ml b/testsuite/tests/lib-sys/immediate64.ml index 0f7dea7c42b..84f73f67488 100644 --- a/testsuite/tests/lib-sys/immediate64.ml +++ b/testsuite/tests/lib-sys/immediate64.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) module M : sig type t [@@immediate64] diff --git a/testsuite/tests/lib-sys/rename.ml b/testsuite/tests/lib-sys/rename.ml index e6d6886e62e..5de83a86c8e 100644 --- a/testsuite/tests/lib-sys/rename.ml +++ b/testsuite/tests/lib-sys/rename.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Test the Sys.rename function *) diff --git a/testsuite/tests/lib-systhreads/boundscheck.ml b/testsuite/tests/lib-systhreads/boundscheck.ml index 124d054ec75..2111aba6cf7 100644 --- a/testsuite/tests/lib-systhreads/boundscheck.ml +++ b/testsuite/tests/lib-systhreads/boundscheck.ml @@ -1,12 +1,12 @@ (* TEST - -include systhreads -* skip -reason = "OCaml 5 only" -** hassysthreads -*** bytecode -*** native - + include systhreads; + runtime5; + hassysthreads; + { + bytecode; + }{ + native; + } *) diff --git a/testsuite/tests/lib-systhreads/eintr.ml b/testsuite/tests/lib-systhreads/eintr.ml index b9040b62fa9..7b62e1314c1 100644 --- a/testsuite/tests/lib-systhreads/eintr.ml +++ b/testsuite/tests/lib-systhreads/eintr.ml @@ -1,10 +1,12 @@ (* TEST - -* hassysthreads -include systhreads -** not-windows -*** bytecode -*** native + include systhreads; + hassysthreads; + not-windows; + { + bytecode; + }{ + native; + } *) let signals_requested = Atomic.make 0 diff --git a/testsuite/tests/lib-systhreads/multicore_lifecycle.ml b/testsuite/tests/lib-systhreads/multicore_lifecycle.ml index 0138046146a..018b8548e5d 100644 --- a/testsuite/tests/lib-systhreads/multicore_lifecycle.ml +++ b/testsuite/tests/lib-systhreads/multicore_lifecycle.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hassysthreads -include systhreads -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) let _ = diff --git a/testsuite/tests/lib-systhreads/swapgil.ml b/testsuite/tests/lib-systhreads/swapgil.ml index 2d9341e0a81..713718d2834 100644 --- a/testsuite/tests/lib-systhreads/swapgil.ml +++ b/testsuite/tests/lib-systhreads/swapgil.ml @@ -1,9 +1,9 @@ (* TEST -modules = "swapgil_stubs.c" -* hassysthreads -include systhreads -** hasunix -*** native + modules = "swapgil_stubs.c"; + include systhreads; + hassysthreads; + hasunix; + native; *) external setup : unit -> unit = "swap_gil_setup" diff --git a/testsuite/tests/lib-systhreads/swapgil_stubs.c b/testsuite/tests/lib-systhreads/swapgil_stubs.c index 558a8472155..5c790bed279 100644 --- a/testsuite/tests/lib-systhreads/swapgil_stubs.c +++ b/testsuite/tests/lib-systhreads/swapgil_stubs.c @@ -113,8 +113,9 @@ static void runtime_reinitialize(void* m) value swap_gil_setup(value unused) { - caml_default_locking_scheme.thread_start = runtime_thread_start; - caml_default_locking_scheme.thread_stop = runtime_thread_stop; + struct caml_locking_scheme *s = caml_get_default_locking_scheme(); + s->thread_start = runtime_thread_start; + s->thread_stop = runtime_thread_stop; started = 1; return Val_unit; } diff --git a/testsuite/tests/lib-systhreads/test_c_thread_register.ml b/testsuite/tests/lib-systhreads/test_c_thread_register.ml index a8ec98aa9a7..c18e49e4caf 100644 --- a/testsuite/tests/lib-systhreads/test_c_thread_register.ml +++ b/testsuite/tests/lib-systhreads/test_c_thread_register.ml @@ -1,10 +1,13 @@ (* TEST - modules = "test_c_thread_register_cstubs.c" - * hassysthreads - include systhreads - ** not-bsd - *** bytecode - *** native + modules = "test_c_thread_register_cstubs.c"; + include systhreads; + hassysthreads; + not-bsd; + { + bytecode; + }{ + native; + } *) (* spins a external thread from C and register it to the OCaml runtime *) diff --git a/testsuite/tests/lib-systhreads/testfork.ml b/testsuite/tests/lib-systhreads/testfork.ml index c606c56638f..c359cfc0a52 100644 --- a/testsuite/tests/lib-systhreads/testfork.ml +++ b/testsuite/tests/lib-systhreads/testfork.ml @@ -1,10 +1,13 @@ (* TEST - * hassysthreads - include systhreads - ** not-bsd - *** libunix - **** bytecode - **** native + include systhreads; + hassysthreads; + not-bsd; + libunix; + { + bytecode; + }{ + native; + } *) (* POSIX threads and fork() *) diff --git a/testsuite/tests/lib-systhreads/testfork2.ml b/testsuite/tests/lib-systhreads/testfork2.ml index 9f95024eee3..bea41022d47 100644 --- a/testsuite/tests/lib-systhreads/testfork2.ml +++ b/testsuite/tests/lib-systhreads/testfork2.ml @@ -1,10 +1,13 @@ (* TEST - * hassysthreads - include systhreads - ** not-bsd - *** libunix - **** bytecode - **** native + include systhreads; + hassysthreads; + not-bsd; + libunix; + { + bytecode; + }{ + native; + } *) (* POSIX threads and fork() *) diff --git a/testsuite/tests/lib-systhreads/testpreempt.ml b/testsuite/tests/lib-systhreads/testpreempt.ml index 994a03d790d..0ea1895d311 100644 --- a/testsuite/tests/lib-systhreads/testpreempt.ml +++ b/testsuite/tests/lib-systhreads/testpreempt.ml @@ -1,14 +1,17 @@ (* TEST - * hassysthreads + include systhreads; + hassysthreads; (* On Windows, we use Sleep(0) for triggering preemption of threads. However, this does not seem very reliable, so that this test fails on some Windows configurations. See GPR #1533. *) - include systhreads - ** not-windows - *** bytecode - *** native + not-windows; + { + bytecode; + }{ + native; + } *) let rec generate_list n = diff --git a/testsuite/tests/lib-systhreads/testyield.ml b/testsuite/tests/lib-systhreads/testyield.ml index 646dfe3e6f2..29758cac0d4 100644 --- a/testsuite/tests/lib-systhreads/testyield.ml +++ b/testsuite/tests/lib-systhreads/testyield.ml @@ -1,12 +1,16 @@ (* TEST + include systhreads; + hassysthreads; + not-windows; + { + bytecode; + }{ + native; + } +*) + (* Test that yielding between busy threads reliably triggers a thread switch. *) - * hassysthreads - include systhreads - ** not-windows - *** bytecode - *** native -*) let threads = 4 diff --git a/testsuite/tests/lib-systhreads/threadsigmask.ml b/testsuite/tests/lib-systhreads/threadsigmask.ml index 6bae995afd1..321bbc3aa4b 100644 --- a/testsuite/tests/lib-systhreads/threadsigmask.ml +++ b/testsuite/tests/lib-systhreads/threadsigmask.ml @@ -1,10 +1,12 @@ (* TEST - -* hassysthreads -include systhreads -** not-windows -*** bytecode -*** native + include systhreads; + hassysthreads; + not-windows; + { + bytecode; + }{ + native; + } *) let stopped = ref false diff --git a/testsuite/tests/lib-threads/backtrace_threads.ml b/testsuite/tests/lib-threads/backtrace_threads.ml index 3c112d610e9..5981c7cb96a 100644 --- a/testsuite/tests/lib-threads/backtrace_threads.ml +++ b/testsuite/tests/lib-threads/backtrace_threads.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) let () = Printexc.record_backtrace true diff --git a/testsuite/tests/lib-threads/bank.ml b/testsuite/tests/lib-threads/bank.ml index 0f080ad3e19..e0302ab27e1 100644 --- a/testsuite/tests/lib-threads/bank.ml +++ b/testsuite/tests/lib-threads/bank.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) (* The bank account example, using events and channels *) diff --git a/testsuite/tests/lib-threads/beat.ml b/testsuite/tests/lib-threads/beat.ml index 06120ab961e..12409ebcb18 100644 --- a/testsuite/tests/lib-threads/beat.ml +++ b/testsuite/tests/lib-threads/beat.ml @@ -1,12 +1,15 @@ (* TEST - -* hassysthreads -include systhreads -* skip -reason = "off-by-one error on MacOS+Clang (#408)" -** bytecode -** native - + { + not-macos; + include systhreads; + hassysthreads; + { bytecode; } + { native; } + }{ + macos; + reason = "off-by-one error on MacOS+Clang (#408)"; + skip; + } *) (* Test Thread.delay and its scheduling *) diff --git a/testsuite/tests/lib-threads/bufchan.ml b/testsuite/tests/lib-threads/bufchan.ml index df5f3984d74..f188cac8fae 100644 --- a/testsuite/tests/lib-threads/bufchan.ml +++ b/testsuite/tests/lib-threads/bufchan.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) open Event diff --git a/testsuite/tests/lib-threads/close.ml b/testsuite/tests/lib-threads/close.ml index 2c4eb458f68..59e38c54299 100644 --- a/testsuite/tests/lib-threads/close.ml +++ b/testsuite/tests/lib-threads/close.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) let main () = diff --git a/testsuite/tests/lib-threads/delayintr.ml b/testsuite/tests/lib-threads/delayintr.ml index 5fcc20143c5..924d3179c41 100644 --- a/testsuite/tests/lib-threads/delayintr.ml +++ b/testsuite/tests/lib-threads/delayintr.ml @@ -1,48 +1,33 @@ (* TEST - -* hassysthreads -include systhreads - -readonly_files = "sigint.c" - -** libunix (* excludes mingw32/64 and msvc32/64 *) - -*** setup-ocamlc.byte-build-env - -program = "${test_build_directory}/delayintr.byte" - -**** ocamlc.byte - -program = "sigint" -all_modules = "sigint.c" - -***** ocamlc.byte - -program = "${test_build_directory}/delayintr.byte" -all_modules = "delayintr.ml" - -****** check-ocamlc.byte-output -******* run -******** check-program-output - -*** setup-ocamlopt.byte-build-env - -program = "${test_build_directory}/delayintr.opt" - -**** ocamlopt.byte - -program = "sigint" -all_modules = "sigint.c" - -***** ocamlopt.byte - -program = "${test_build_directory}/delayintr.opt" -all_modules = "delayintr.ml" - -****** check-ocamlopt.byte-output -******* run -******** check-program-output - + include systhreads; + readonly_files = "sigint.c"; + hassysthreads; + libunix; (* excludes mingw32/64 and msvc32/64 *) + { + program = "${test_build_directory}/delayintr.byte"; + setup-ocamlc.byte-build-env; + program = "sigint"; + all_modules = "sigint.c"; + ocamlc.byte; + program = "${test_build_directory}/delayintr.byte"; + all_modules = "delayintr.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/delayintr.opt"; + setup-ocamlopt.byte-build-env; + program = "sigint"; + all_modules = "sigint.c"; + ocamlopt.byte; + program = "${test_build_directory}/delayintr.opt"; + all_modules = "delayintr.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) (* Regression test for MPR#7903 *) diff --git a/testsuite/tests/lib-threads/fileio.ml b/testsuite/tests/lib-threads/fileio.ml index 0e23128d1e2..138be2bd1d5 100644 --- a/testsuite/tests/lib-threads/fileio.ml +++ b/testsuite/tests/lib-threads/fileio.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) (* Test a file copy function *) diff --git a/testsuite/tests/lib-threads/mutex_errors.ml b/testsuite/tests/lib-threads/mutex_errors.ml index 0cb3864cdfd..7f9faee8beb 100644 --- a/testsuite/tests/lib-threads/mutex_errors.ml +++ b/testsuite/tests/lib-threads/mutex_errors.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) let log s = diff --git a/testsuite/tests/lib-threads/pr4466.ml b/testsuite/tests/lib-threads/pr4466.ml index 8b53539ded7..1e0e36a72c9 100644 --- a/testsuite/tests/lib-threads/pr4466.ml +++ b/testsuite/tests/lib-threads/pr4466.ml @@ -1,8 +1,7 @@ (* TEST - -* hassysthreads - include systhreads -** native + include systhreads; + hassysthreads; + native; *) open Printf diff --git a/testsuite/tests/lib-threads/pr5325.ml b/testsuite/tests/lib-threads/pr5325.ml index 25ff6c98bf3..a76757c9e35 100644 --- a/testsuite/tests/lib-threads/pr5325.ml +++ b/testsuite/tests/lib-threads/pr5325.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) open Printf diff --git a/testsuite/tests/lib-threads/pr7638.ml b/testsuite/tests/lib-threads/pr7638.ml index ea7fabc5304..83cd7cf814d 100644 --- a/testsuite/tests/lib-threads/pr7638.ml +++ b/testsuite/tests/lib-threads/pr7638.ml @@ -1,12 +1,12 @@ (* TEST - -unset DOES_NOT_EXIST - -* hassysthreads -include systhreads -** bytecode -** native - + unset DOES_NOT_EXIST; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) (* MPR#7638 repro case *) diff --git a/testsuite/tests/lib-threads/pr8857.ml b/testsuite/tests/lib-threads/pr8857.ml index cc6d53d4c55..1d14b12cae4 100644 --- a/testsuite/tests/lib-threads/pr8857.ml +++ b/testsuite/tests/lib-threads/pr8857.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) let _ = diff --git a/testsuite/tests/lib-threads/pr9971.ml b/testsuite/tests/lib-threads/pr9971.ml index dc016f3f96a..eb41f421b1a 100644 --- a/testsuite/tests/lib-threads/pr9971.ml +++ b/testsuite/tests/lib-threads/pr9971.ml @@ -1,12 +1,17 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + runtime4; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) +(* This test was deleted in OCaml 5 upstream + (rev 55da58ca6c9144331c7fa56a5d0083cb97b50925) *) + let t = let t = Thread.create (fun _ -> ())() in Thread.join t diff --git a/testsuite/tests/lib-threads/prodcons.ml b/testsuite/tests/lib-threads/prodcons.ml index 4867ed38d1a..8c27984127d 100644 --- a/testsuite/tests/lib-threads/prodcons.ml +++ b/testsuite/tests/lib-threads/prodcons.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) (* Classic producer-consumer *) diff --git a/testsuite/tests/lib-threads/prodcons2.ml b/testsuite/tests/lib-threads/prodcons2.ml index 308fcd5151a..3fe057c3974 100644 --- a/testsuite/tests/lib-threads/prodcons2.ml +++ b/testsuite/tests/lib-threads/prodcons2.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) (* Producer-consumer with events and multiple producers *) diff --git a/testsuite/tests/lib-threads/sieve.ml b/testsuite/tests/lib-threads/sieve.ml index d4cdd447e1e..3f8769ff8a5 100644 --- a/testsuite/tests/lib-threads/sieve.ml +++ b/testsuite/tests/lib-threads/sieve.ml @@ -1,17 +1,17 @@ (* TEST - -script = "sh ${test_source_directory}/test-runtime-cleanup.sh" - -* hassysthreads -include systhreads -** script -*** bytecode -output = "${test_build_directory}/program-output" -stdout = "${output}" -*** native -output = "${test_build_directory}/program-output" -stdout = "${output}" - + script = "sh ${test_source_directory}/test-runtime-cleanup.sh"; + include systhreads; + hassysthreads; + script; + { + output = "${test_build_directory}/program-output"; + stdout = "${output}"; + bytecode; + }{ + output = "${test_build_directory}/program-output"; + stdout = "${output}"; + native; + } *) (* This test is skipped in "runtime cleanup at exit" mode diff --git a/testsuite/tests/lib-threads/signal.ml b/testsuite/tests/lib-threads/signal.ml index 226ed81a7c7..07d27576608 100644 --- a/testsuite/tests/lib-threads/signal.ml +++ b/testsuite/tests/lib-threads/signal.ml @@ -1,48 +1,33 @@ (* TEST - -* hassysthreads -include systhreads - -readonly_files = "sigint.c" - -** libunix (* excludes mingw32/64 and msvc32/64 *) - -*** setup-ocamlc.byte-build-env - -program = "${test_build_directory}/signal.byte" - -**** ocamlc.byte - -program = "sigint" -all_modules = "sigint.c" - -***** ocamlc.byte - -program = "${test_build_directory}/signal.byte" -all_modules = "signal.ml" - -****** check-ocamlc.byte-output -******* run -******** check-program-output - -*** setup-ocamlopt.byte-build-env - -program = "${test_build_directory}/signal.opt" - -**** ocamlopt.byte - -program = "sigint" -all_modules = "sigint.c" - -***** ocamlopt.byte - -program = "${test_build_directory}/signal.opt" -all_modules = "signal.ml" - -****** check-ocamlopt.byte-output -******* run -******** check-program-output - + include systhreads; + readonly_files = "sigint.c"; + hassysthreads; + libunix; (* excludes mingw32/64 and msvc32/64 *) + { + program = "${test_build_directory}/signal.byte"; + setup-ocamlc.byte-build-env; + program = "sigint"; + all_modules = "sigint.c"; + ocamlc.byte; + program = "${test_build_directory}/signal.byte"; + all_modules = "signal.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/signal.opt"; + setup-ocamlopt.byte-build-env; + program = "sigint"; + all_modules = "sigint.c"; + ocamlopt.byte; + program = "${test_build_directory}/signal.opt"; + all_modules = "signal.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) let signaled = ref false diff --git a/testsuite/tests/lib-threads/signal_handler_run_in_c_thread.ml b/testsuite/tests/lib-threads/signal_handler_run_in_c_thread.ml new file mode 100644 index 00000000000..f186b649edd --- /dev/null +++ b/testsuite/tests/lib-threads/signal_handler_run_in_c_thread.ml @@ -0,0 +1,18 @@ +(* TEST + modules = "signal_handler_run_in_c_thread_stubs.c"; + native; + hassysthreads; +*) + +(* This doesn't actually need systhreads, but the requirement should + ensure the C pthreads-using code will build. *) + +external c_stub : unit -> unit = "test_signal_handler_run_in_c_thread" + +let () = + Sys.set_signal Sys.sigusr1 (Signal_handle (fun _ -> exit 0)); + c_stub (); + while true do + (* Ensure pending actions are run, by forcing allocation *) + ignore (Sys.opaque_identity (Random.int 42, Random.int 42)) + done diff --git a/testsuite/tests/lib-threads/signal_handler_run_in_c_thread_stubs.c b/testsuite/tests/lib-threads/signal_handler_run_in_c_thread_stubs.c new file mode 100644 index 00000000000..b55556fc308 --- /dev/null +++ b/testsuite/tests/lib-threads/signal_handler_run_in_c_thread_stubs.c @@ -0,0 +1,30 @@ +#include +#include +#include + +static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +static int thread_started = 0; + +static void* in_thread(void* unused) +{ + pthread_mutex_lock(&mutex); + thread_started = 1; + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mutex); + /* Signal to be received in this thread by the OCaml signal handler */ + while (1); +} + +value test_signal_handler_run_in_c_thread(value unit) +{ + pthread_t thread; + pthread_create(&thread, NULL, &in_thread, NULL); + pthread_mutex_lock(&mutex); + while (!thread_started) { + pthread_cond_wait(&cond, &mutex); + } + pthread_mutex_unlock(&mutex); + pthread_kill(thread, SIGUSR1); + return Val_unit; +} diff --git a/testsuite/tests/lib-threads/sockets.ml b/testsuite/tests/lib-threads/sockets.ml index 85644029f33..183f4d6ca60 100644 --- a/testsuite/tests/lib-threads/sockets.ml +++ b/testsuite/tests/lib-threads/sockets.ml @@ -1,13 +1,13 @@ (* TEST - -* hassysthreads -include systhreads - -** not-macos -*** libunix (* Broken on Windows (missing join?), needs to be fixed *) -**** bytecode -**** native - + include systhreads; + hassysthreads; + not-macos; + libunix; + { + bytecode; + }{ + native; + } *) open Printf @@ -27,6 +27,9 @@ let server sock = ignore(Thread.create serve_connection s) done +let mutex = Mutex.create () +let lines = ref [] + let client (addr, msg) = let sock = Unix.socket (Unix.domain_of_sockaddr addr) Unix.SOCK_STREAM 0 in @@ -34,9 +37,11 @@ let client (addr, msg) = let buf = Bytes.make 1024 ' ' in ignore(Unix.write_substring sock msg 0 (String.length msg)); let n = Unix.read sock buf 0 (Bytes.length buf) in - print_bytes (Bytes.sub buf 0 n); flush stdout + Mutex.lock mutex; + lines := (Bytes.sub buf 0 n) :: !lines; + Mutex.unlock mutex -let _ = +let () = let addr = Unix.ADDR_INET(Unix.inet_addr_loopback, 0) in let sock = Unix.socket (Unix.domain_of_sockaddr addr) Unix.SOCK_STREAM 0 in @@ -45,6 +50,9 @@ let _ = let addr = Unix.getsockname sock in Unix.listen sock 5; ignore (Thread.create server sock); - ignore (Thread.create client (addr, "Client #1\n")); + let client1 = Thread.create client (addr, "Client #1\n") in Thread.delay 0.05; - client (addr, "Client #2\n") + client (addr, "Client #2\n"); + Thread.join client1; + List.iter print_bytes (List.sort Bytes.compare !lines); + flush stdout diff --git a/testsuite/tests/lib-threads/swapchan.ml b/testsuite/tests/lib-threads/swapchan.ml index 3536b82e2e7..6c9c3d7714d 100644 --- a/testsuite/tests/lib-threads/swapchan.ml +++ b/testsuite/tests/lib-threads/swapchan.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) open Event diff --git a/testsuite/tests/lib-threads/tls.ml b/testsuite/tests/lib-threads/tls.ml index 2741f7ef0b9..0aa52792eb3 100644 --- a/testsuite/tests/lib-threads/tls.ml +++ b/testsuite/tests/lib-threads/tls.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) let private_data = (Hashtbl.create 17 : (Thread.t, string) Hashtbl.t) diff --git a/testsuite/tests/lib-threads/torture.ml b/testsuite/tests/lib-threads/torture.ml index 91536c950bd..ea351c3e1ed 100644 --- a/testsuite/tests/lib-threads/torture.ml +++ b/testsuite/tests/lib-threads/torture.ml @@ -1,10 +1,11 @@ (* TEST - -* hassysthreads -include systhreads -** bytecode -** native - + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) (* Torture test - I/O interspersed with lots of GC *) diff --git a/testsuite/tests/lib-threads/uncaught_exception_handler.ml b/testsuite/tests/lib-threads/uncaught_exception_handler.ml index 06cf8f60f0e..453b5ed0b52 100644 --- a/testsuite/tests/lib-threads/uncaught_exception_handler.ml +++ b/testsuite/tests/lib-threads/uncaught_exception_handler.ml @@ -1,12 +1,12 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + -flags = "-g" -ocamlrunparam += ",b=1" -* hassysthreads -include systhreads -** bytecode -** native *) @@ -25,9 +25,10 @@ let handler final_exn exn = flush stderr; raise final_exn -let fn () = Printexc.raise_with_backtrace - CallbackExn - (Printexc.get_raw_backtrace ()) +(* don't inline to get consistent backtraces *) +let[@inline never] fn () = + Printexc.raise_with_backtrace + CallbackExn (Printexc.get_raw_backtrace ()) let _ = let th = Thread.create fn () in @@ -38,3 +39,15 @@ let _ = Thread.set_uncaught_exception_handler (handler Thread.Exit); let th = Thread.create fn () in Thread.join th + +(* TEST + flags = "-g"; + ocamlrunparam += ",b=1"; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } +*) diff --git a/testsuite/tests/lib-threads/uncaught_exception_handler.reference b/testsuite/tests/lib-threads/uncaught_exception_handler.reference index 17c8f09b215..3ef4e39738c 100644 --- a/testsuite/tests/lib-threads/uncaught_exception_handler.reference +++ b/testsuite/tests/lib-threads/uncaught_exception_handler.reference @@ -1,15 +1,15 @@ Thread 1 killed on uncaught exception Uncaught_exception_handler.CallbackExn -Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 28, characters 12-113 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 30, characters 2-79 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 [thread 2] caught Uncaught_exception_handler.CallbackExn -Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 28, characters 12-113 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 30, characters 2-79 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 Thread 2 killed on uncaught exception Uncaught_exception_handler.CallbackExn -Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 28, characters 12-113 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 30, characters 2-79 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 Thread 2 uncaught exception handler raised Uncaught_exception_handler.UncaughtHandlerExn Raised at Uncaught_exception_handler.handler in file "uncaught_exception_handler.ml", line 26, characters 2-17 -Called from Thread.create.(fun) in file "thread.ml", line 60, characters 10-41 +Called from Thread.create.(fun) in file "thread.ml", line 61, characters 10-41 [thread 3] caught Uncaught_exception_handler.CallbackExn -Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 28, characters 12-113 -Called from Thread.create.(fun) in file "thread.ml", line 51, characters 8-14 +Raised at Uncaught_exception_handler.fn in file "uncaught_exception_handler.ml", line 30, characters 2-79 +Called from Thread.create.(fun) in file "thread.ml", line 52, characters 8-14 diff --git a/testsuite/tests/lib-uchar/test.ml b/testsuite/tests/lib-uchar/test.ml index 14e907d230e..bc7643fc3b6 100644 --- a/testsuite/tests/lib-uchar/test.ml +++ b/testsuite/tests/lib-uchar/test.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let assert_raise_invalid_argument f v = assert (try ignore (f v); false with Invalid_argument _ -> true) diff --git a/testsuite/tests/lib-unix/common/channel_of.ml b/testsuite/tests/lib-unix/common/channel_of.ml index fb9f294d615..bbb4c6ef179 100644 --- a/testsuite/tests/lib-unix/common/channel_of.ml +++ b/testsuite/tests/lib-unix/common/channel_of.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) open Printf diff --git a/testsuite/tests/lib-unix/common/cloexec.ml b/testsuite/tests/lib-unix/common/cloexec.ml index cb919eb5646..9723a778e4d 100644 --- a/testsuite/tests/lib-unix/common/cloexec.ml +++ b/testsuite/tests/lib-unix/common/cloexec.ml @@ -1,48 +1,47 @@ (* TEST + include unix; + readonly_files = "fdstatus_aux.c fdstatus_main.ml"; + (* + This test is temporarily disabled on the MinGW and MSVC ports, + because since fdstatus has been wrapped in an OCaml program, + it does not work as well as before. + Presumably this is because the OCaml runtime opens files, so that handles + that have actually been closed at execution look open and make the + test fail. -(* - This test is temporarily disabled on the MinGW and MSVC ports, - because since fdstatus has been wrapped in an OCaml program, - it does not work as well as before. - Presumably this is because the OCaml runtime opens files, so that handles - that have actually been closed at execution look open and make the - test fail. - - One possible fix for this would be to make it possible for ocamltest to - compile C-only programs, which will be a bit of work to handle the - output of msvc and will also duplicate what the OCaml compiler itself - already does. -*) - -* hasunix -include unix -readonly_files = "fdstatus_aux.c fdstatus_main.ml" - -** libunix -*** setup-ocamlc.byte-build-env -program = "${test_build_directory}/cloexec.byte" -**** ocamlc.byte -program = "${test_build_directory}/fdstatus.exe" -all_modules = "fdstatus_aux.c fdstatus_main.ml" -***** ocamlc.byte -program = "${test_build_directory}/cloexec.byte" -all_modules= "cloexec.ml" -****** check-ocamlc.byte-output -******* run -******** check-program-output - -*** setup-ocamlopt.byte-build-env -program = "${test_build_directory}/cloexec.opt" -**** ocamlopt.byte -program = "${test_build_directory}/fdstatus.exe" -all_modules = "fdstatus_aux.c fdstatus_main.ml" -***** ocamlopt.byte -program = "${test_build_directory}/cloexec.opt" -all_modules= "cloexec.ml" -****** check-ocamlopt.byte-output -******* run -******** check-program-output + One possible fix for this would be to make it possible for ocamltest to + compile C-only programs, which will be a bit of work to handle the + output of msvc and will also duplicate what the OCaml compiler itself + already does. + *) + hasunix; + libunix; + { + program = "${test_build_directory}/cloexec.byte"; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/fdstatus.exe"; + all_modules = "fdstatus_aux.c fdstatus_main.ml"; + ocamlc.byte; + program = "${test_build_directory}/cloexec.byte"; + all_modules = "cloexec.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/cloexec.opt"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/fdstatus.exe"; + all_modules = "fdstatus_aux.c fdstatus_main.ml"; + ocamlopt.byte; + program = "${test_build_directory}/cloexec.opt"; + all_modules = "cloexec.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) (* This is a terrible hack that plays on the internal representation diff --git a/testsuite/tests/lib-unix/common/dup.ml b/testsuite/tests/lib-unix/common/dup.ml index b689137c0be..2ca20cba539 100644 --- a/testsuite/tests/lib-unix/common/dup.ml +++ b/testsuite/tests/lib-unix/common/dup.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let _ = diff --git a/testsuite/tests/lib-unix/common/dup2.ml b/testsuite/tests/lib-unix/common/dup2.ml index c3a7faccda7..84f3f92030c 100644 --- a/testsuite/tests/lib-unix/common/dup2.ml +++ b/testsuite/tests/lib-unix/common/dup2.ml @@ -1,9 +1,12 @@ (* TEST -* hasunix -include unix -stderr = "/dev/null" -** bytecode -** native + include unix; + stderr = "/dev/null"; + hasunix; + { + bytecode; + }{ + native; + } *) let cat file = diff --git a/testsuite/tests/lib-unix/common/fork_cleanup.ml b/testsuite/tests/lib-unix/common/fork_cleanup.ml index eca8f9de9d3..0206c01b039 100644 --- a/testsuite/tests/lib-unix/common/fork_cleanup.ml +++ b/testsuite/tests/lib-unix/common/fork_cleanup.ml @@ -1,9 +1,12 @@ (* TEST -* hasunix -include unix -** not-windows -*** bytecode -*** native + include unix; + hasunix; + not-windows; + { + bytecode; + }{ + native; + } *) (* this test checks that the domain lock is properly reinitialized diff --git a/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml b/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml index db0ebf4f6d9..a25f217b97a 100644 --- a/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml +++ b/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml @@ -1,9 +1,12 @@ (* TEST -* hassysthreads -include systhreads -** not-windows -*** bytecode -*** native + include systhreads; + hassysthreads; + not-windows; + { + bytecode; + }{ + native; + } *) (* this test checks that the domain lock is properly reinitialized diff --git a/testsuite/tests/lib-unix/common/getaddrinfo.ml b/testsuite/tests/lib-unix/common/getaddrinfo.ml index b140ef91435..4c5b88d51fd 100644 --- a/testsuite/tests/lib-unix/common/getaddrinfo.ml +++ b/testsuite/tests/lib-unix/common/getaddrinfo.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let () = diff --git a/testsuite/tests/lib-unix/common/gethostbyaddr.ml b/testsuite/tests/lib-unix/common/gethostbyaddr.ml index a8ea1cf8d45..e9d4b53a5c2 100644 --- a/testsuite/tests/lib-unix/common/gethostbyaddr.ml +++ b/testsuite/tests/lib-unix/common/gethostbyaddr.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) (* Checks that gethostbyaddr supports both IPv4 and IPv6 (see #11461) *) diff --git a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml index 78112d293ee..1203926ab91 100644 --- a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml +++ b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml @@ -1,11 +1,14 @@ (* TEST -include unix -* skip -reason = "OCaml 5 only" -** hasunix -*** not-windows -**** bytecode -**** native + include unix; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + hasunix; + not-windows; + { + bytecode; + }{ + native; + } *) (* on Multicore, fork is not allowed is another domain is, and was running. *) diff --git a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml index 61f75dce4a2..1dae02b59c8 100644 --- a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml +++ b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml @@ -1,11 +1,14 @@ (* TEST -include unix -* skip -reason = "OCaml 5 only" -** hasunix -*** not-windows -**** bytecode -**** native + include unix; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + hasunix; + not-windows; + { + bytecode; + }{ + native; + } *) (* on Multicore, fork is not allowed is another domain is, and was running. *) diff --git a/testsuite/tests/lib-unix/common/pipe_eof.ml b/testsuite/tests/lib-unix/common/pipe_eof.ml index 3bd6ae5f1af..415107da056 100644 --- a/testsuite/tests/lib-unix/common/pipe_eof.ml +++ b/testsuite/tests/lib-unix/common/pipe_eof.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let drain pipe = diff --git a/testsuite/tests/lib-unix/common/process_pid.ml b/testsuite/tests/lib-unix/common/process_pid.ml index 8d8852f6d45..f2c25f46665 100644 --- a/testsuite/tests/lib-unix/common/process_pid.ml +++ b/testsuite/tests/lib-unix/common/process_pid.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let () = diff --git a/testsuite/tests/lib-unix/common/redirections.ml b/testsuite/tests/lib-unix/common/redirections.ml index b9c04a23230..fb008a3826a 100644 --- a/testsuite/tests/lib-unix/common/redirections.ml +++ b/testsuite/tests/lib-unix/common/redirections.ml @@ -1,35 +1,34 @@ (* TEST - -readonly_files = "reflector.ml" -unset XVAR - -* hasunix -** setup-ocamlc.byte-build-env -program = "${test_build_directory}/redirections.byte" -*** ocamlc.byte -program = "${test_build_directory}/reflector.exe" -all_modules = "reflector.ml" -**** ocamlc.byte -include unix -program = "${test_build_directory}/redirections.byte" -all_modules= "redirections.ml" -***** check-ocamlc.byte-output -****** run -******* check-program-output - -** setup-ocamlopt.byte-build-env -program = "${test_build_directory}/redirections.opt" -*** ocamlopt.byte -program = "${test_build_directory}/reflector.exe" -all_modules = "reflector.ml" -**** ocamlopt.byte -include unix -program = "${test_build_directory}/redirections.opt" -all_modules= "redirections.ml" -***** check-ocamlopt.byte-output -****** run -******* check-program-output - + readonly_files = "reflector.ml"; + unset XVAR; + hasunix; + { + program = "${test_build_directory}/redirections.byte"; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/reflector.exe"; + all_modules = "reflector.ml"; + ocamlc.byte; + include unix; + program = "${test_build_directory}/redirections.byte"; + all_modules = "redirections.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/redirections.opt"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/reflector.exe"; + all_modules = "reflector.ml"; + ocamlopt.byte; + include unix; + program = "${test_build_directory}/redirections.opt"; + all_modules = "redirections.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) diff --git a/testsuite/tests/lib-unix/common/rename.ml b/testsuite/tests/lib-unix/common/rename.ml index 402ddf0bd31..4a88eaa3f01 100644 --- a/testsuite/tests/lib-unix/common/rename.ml +++ b/testsuite/tests/lib-unix/common/rename.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) (* Test the Unix.rename function *) diff --git a/testsuite/tests/lib-unix/common/test_unix_cmdline.ml b/testsuite/tests/lib-unix/common/test_unix_cmdline.ml index 08af41e29a9..aff235bd3f9 100644 --- a/testsuite/tests/lib-unix/common/test_unix_cmdline.ml +++ b/testsuite/tests/lib-unix/common/test_unix_cmdline.ml @@ -1,34 +1,33 @@ (* TEST - -readonly_files = "cmdline_prog.ml" - -* hasunix -** setup-ocamlc.byte-build-env -program = "${test_build_directory}/test_unix_cmdline.byte" -*** ocamlc.byte -program = "${test_build_directory}/cmdline_prog.exe" -all_modules = "cmdline_prog.ml" -**** ocamlc.byte -include unix -program = "${test_build_directory}/test_unix_cmdline.byte" -all_modules= "test_unix_cmdline.ml" -***** check-ocamlc.byte-output -****** run -******* check-program-output - -** setup-ocamlopt.byte-build-env -program = "${test_build_directory}/test_unix_cmdline.opt" -*** ocamlc.byte -program = "${test_build_directory}/cmdline_prog.exe" -all_modules = "cmdline_prog.ml" -**** ocamlopt.byte -include unix -program = "${test_build_directory}/test_unix_cmdline.opt" -all_modules= "test_unix_cmdline.ml" -***** check-ocamlopt.byte-output -****** run -******* check-program-output - + readonly_files = "cmdline_prog.ml"; + hasunix; + { + program = "${test_build_directory}/test_unix_cmdline.byte"; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/cmdline_prog.exe"; + all_modules = "cmdline_prog.ml"; + ocamlc.byte; + include unix; + program = "${test_build_directory}/test_unix_cmdline.byte"; + all_modules = "test_unix_cmdline.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/test_unix_cmdline.opt"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/cmdline_prog.exe"; + all_modules = "cmdline_prog.ml"; + ocamlc.byte; + include unix; + program = "${test_build_directory}/test_unix_cmdline.opt"; + all_modules = "test_unix_cmdline.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) let prog_name = "cmdline_prog.exe" diff --git a/testsuite/tests/lib-unix/common/test_unixlabels.ml b/testsuite/tests/lib-unix/common/test_unixlabels.ml index fc0335b5f84..c34196fbc0f 100644 --- a/testsuite/tests/lib-unix/common/test_unixlabels.ml +++ b/testsuite/tests/lib-unix/common/test_unixlabels.ml @@ -1,9 +1,12 @@ (* TEST -include unix -flags += " -nolabels " -* hasunix -** bytecode -** native + include unix; + flags += " -nolabels "; + hasunix; + { + bytecode; + }{ + native; + } *) module U : module type of Unix = UnixLabels diff --git a/testsuite/tests/lib-unix/common/truncate.ml b/testsuite/tests/lib-unix/common/truncate.ml index a91cabcbb14..50998367d80 100644 --- a/testsuite/tests/lib-unix/common/truncate.ml +++ b/testsuite/tests/lib-unix/common/truncate.ml @@ -1,8 +1,11 @@ (* TEST -include unix -* hasunix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let str = "Hello, OCaml!" diff --git a/testsuite/tests/lib-unix/common/uexit.ml b/testsuite/tests/lib-unix/common/uexit.ml index b80f32087c8..50ec1aa9cad 100644 --- a/testsuite/tests/lib-unix/common/uexit.ml +++ b/testsuite/tests/lib-unix/common/uexit.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let _ = diff --git a/testsuite/tests/lib-unix/common/utimes.ml b/testsuite/tests/lib-unix/common/utimes.ml index 58aecb6ed2e..644579e2623 100644 --- a/testsuite/tests/lib-unix/common/utimes.ml +++ b/testsuite/tests/lib-unix/common/utimes.ml @@ -1,9 +1,12 @@ (* TEST -* hasunix -include unix -readonly_files = "utimes.txt" -** bytecode -** native + include unix; + readonly_files = "utimes.txt"; + hasunix; + { + bytecode; + }{ + native; + } *) (* We do not check setting the "last access time" because it is hard to do so on diff --git a/testsuite/tests/lib-unix/common/wait_nohang.ml b/testsuite/tests/lib-unix/common/wait_nohang.ml index fb4c0b259ed..bddd61a5074 100644 --- a/testsuite/tests/lib-unix/common/wait_nohang.ml +++ b/testsuite/tests/lib-unix/common/wait_nohang.ml @@ -1,34 +1,33 @@ (* TEST - -readonly_files = "reflector.ml" - -* hasunix -** setup-ocamlc.byte-build-env -program = "${test_build_directory}/wait_nohang.byte" -*** ocamlc.byte -program = "${test_build_directory}/reflector.exe" -all_modules = "reflector.ml" -**** ocamlc.byte -include unix -program = "${test_build_directory}/wait_nohang.byte" -all_modules= "wait_nohang.ml" -***** check-ocamlc.byte-output -****** run -******* check-program-output - -** setup-ocamlopt.byte-build-env -program = "${test_build_directory}/wait_nohang.opt" -*** ocamlopt.byte -program = "${test_build_directory}/reflector.exe" -all_modules = "reflector.ml" -**** ocamlopt.byte -include unix -program = "${test_build_directory}/wait_nohang.opt" -all_modules= "wait_nohang.ml" -***** check-ocamlopt.byte-output -****** run -******* check-program-output - + readonly_files = "reflector.ml"; + hasunix; + { + program = "${test_build_directory}/wait_nohang.byte"; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/reflector.exe"; + all_modules = "reflector.ml"; + ocamlc.byte; + include unix; + program = "${test_build_directory}/wait_nohang.byte"; + all_modules = "wait_nohang.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/wait_nohang.opt"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/reflector.exe"; + all_modules = "reflector.ml"; + ocamlopt.byte; + include unix; + program = "${test_build_directory}/wait_nohang.opt"; + all_modules = "wait_nohang.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) let refl = diff --git a/testsuite/tests/lib-unix/isatty/isatty_std.ml b/testsuite/tests/lib-unix/isatty/isatty_std.ml index 1dcff45317b..3ce27593002 100644 --- a/testsuite/tests/lib-unix/isatty/isatty_std.ml +++ b/testsuite/tests/lib-unix/isatty/isatty_std.ml @@ -1,10 +1,13 @@ (* TEST -* hasunix -include unix -stdin = "/dev/null" -stderr = "/dev/null" -** bytecode -** native + include unix; + stdin = "/dev/null"; + stderr = "/dev/null"; + hasunix; + { + bytecode; + }{ + native; + } *) Printf.printf diff --git a/testsuite/tests/lib-unix/isatty/isatty_tty.ml b/testsuite/tests/lib-unix/isatty/isatty_tty.ml index df57e7a3ece..aeed2f781f2 100644 --- a/testsuite/tests/lib-unix/isatty/isatty_tty.ml +++ b/testsuite/tests/lib-unix/isatty/isatty_tty.ml @@ -1,10 +1,11 @@ (* TEST - -* libwin32unix -include unix -** bytecode -** native - + include unix; + libwin32unix; + { + bytecode; + }{ + native; + } *) let console = diff --git a/testsuite/tests/lib-unix/kill/unix_kill.ml b/testsuite/tests/lib-unix/kill/unix_kill.ml index 2ace3849c32..a58fedacd30 100644 --- a/testsuite/tests/lib-unix/kill/unix_kill.ml +++ b/testsuite/tests/lib-unix/kill/unix_kill.ml @@ -1,8 +1,11 @@ (* TEST -include unix -* libunix -** bytecode -** native + include unix; + libunix; + { + bytecode; + }{ + native; + } *) let () = diff --git a/testsuite/tests/lib-unix/realpath/test.ml b/testsuite/tests/lib-unix/realpath/test.ml index 422c718b494..4ec43cc88d6 100644 --- a/testsuite/tests/lib-unix/realpath/test.ml +++ b/testsuite/tests/lib-unix/realpath/test.ml @@ -1,8 +1,11 @@ (* TEST -* hasunix -include unix -** bytecode -** native + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let main () = diff --git a/testsuite/tests/lib-unix/unix-execvpe/exec.ml b/testsuite/tests/lib-unix/unix-execvpe/exec.ml index 70923d54461..06ec0924cd8 100644 --- a/testsuite/tests/lib-unix/unix-execvpe/exec.ml +++ b/testsuite/tests/lib-unix/unix-execvpe/exec.ml @@ -1,11 +1,14 @@ (* TEST - unset FOO - * hasunix - include unix - script = "sh ${test_source_directory}/has-execvpe.sh" - ** script - *** bytecode - *** native + unset FOO; + include unix; + script = "sh ${test_source_directory}/has-execvpe.sh"; + hasunix; + script; + { + bytecode; + }{ + native; + } *) open Printf diff --git a/testsuite/tests/lib-unix/unix-execvpe/has-execvpe.sh b/testsuite/tests/lib-unix/unix-execvpe/has-execvpe.sh index 51707f108a1..7d26050eba1 100755 --- a/testsuite/tests/lib-unix/unix-execvpe/has-execvpe.sh +++ b/testsuite/tests/lib-unix/unix-execvpe/has-execvpe.sh @@ -5,7 +5,7 @@ # It makes sense to run the tests only if execvpe is nt implemented. # If it is implemented, the test is skipped. -if grep -q "#define HAS_EXECVPE" ${ocamlsrcdir}/runtime/caml/s.h; then +if grep -q "#define HAS_EXECVPE" ${ocamlsrcdir}/${runtime_dir}/caml/s.h; then exit ${TEST_SKIP}; fi exit ${TEST_PASS} diff --git a/testsuite/tests/lib-unix/unix-socket/recvfrom_linux.ml b/testsuite/tests/lib-unix/unix-socket/recvfrom_linux.ml index 73fa3fb2737..3eaef789e76 100644 --- a/testsuite/tests/lib-unix/unix-socket/recvfrom_linux.ml +++ b/testsuite/tests/lib-unix/unix-socket/recvfrom_linux.ml @@ -1,11 +1,14 @@ (* TEST -include unix -modules = "recvfrom.ml" -script = "sh ${test_source_directory}/is-linux.sh" -* hasunix -** script -*** bytecode -*** native + include unix; + modules = "recvfrom.ml"; + script = "sh ${test_source_directory}/is-linux.sh"; + hasunix; + script; + { + bytecode; + }{ + native; + } *) open Recvfrom diff --git a/testsuite/tests/lib-unix/unix-socket/recvfrom_unix.ml b/testsuite/tests/lib-unix/unix-socket/recvfrom_unix.ml index e584ff17a32..2e31d00df06 100644 --- a/testsuite/tests/lib-unix/unix-socket/recvfrom_unix.ml +++ b/testsuite/tests/lib-unix/unix-socket/recvfrom_unix.ml @@ -1,10 +1,13 @@ (* TEST -include unix -modules = "recvfrom.ml" -* hasunix -** not-windows -*** bytecode -*** native + include unix; + modules = "recvfrom.ml"; + hasunix; + not-windows; + { + bytecode; + }{ + native; + } *) open Recvfrom diff --git a/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml b/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml index 01ae4df1c3d..4670a410714 100644 --- a/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml +++ b/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml @@ -1,9 +1,12 @@ (* TEST -modules = "fd_of_channel.c" -* libwin32unix -include unix -** bytecode -** native + modules = "fd_of_channel.c"; + include unix; + libwin32unix; + { + bytecode; + }{ + native; + } *) external fd_of_in_channel: in_channel -> int = "caml_fd_of_channel" diff --git a/testsuite/tests/lib-unix/win-createprocess/test.ml b/testsuite/tests/lib-unix/win-createprocess/test.ml index b72f68cf54f..d648f284e23 100644 --- a/testsuite/tests/lib-unix/win-createprocess/test.ml +++ b/testsuite/tests/lib-unix/win-createprocess/test.ml @@ -1,10 +1,11 @@ (* TEST - -* libwin32unix - include unix -** bytecode -** native - + include unix; + libwin32unix; + { + bytecode; + }{ + native; + } *) (* This test is inspired by [Creating a Child Process with Redirected diff --git a/testsuite/tests/lib-unix/win-env/test_env.ml b/testsuite/tests/lib-unix/win-env/test_env.ml index 8f22c4a6f53..3b9ca9a4942 100644 --- a/testsuite/tests/lib-unix/win-env/test_env.ml +++ b/testsuite/tests/lib-unix/win-env/test_env.ml @@ -1,12 +1,15 @@ (* TEST -unset FOO -unset FOO2 -include unix -flags += "-strict-sequence -w +A-70 -warn-error +A" -modules = "stubs.c" -* libwin32unix -** bytecode -** native + unset FOO; + unset FOO2; + include unix; + flags += "-strict-sequence -w +A-70 -warn-error +A"; + modules = "stubs.c"; + libwin32unix; + { + bytecode; + }{ + native; + } *) external set_environment_variable: string -> string -> unit diff --git a/testsuite/tests/lib-unix/win-socketpair/test.ml b/testsuite/tests/lib-unix/win-socketpair/test.ml index 8ea703e0c1c..cecd4a54c93 100644 --- a/testsuite/tests/lib-unix/win-socketpair/test.ml +++ b/testsuite/tests/lib-unix/win-socketpair/test.ml @@ -1,18 +1,19 @@ (* TEST - -* libwin32unix - script = "sh ${test_source_directory}/has-afunix.sh" -** hassysthreads - include systhreads -*** script -**** bytecode -output = "${test_build_directory}/program-output" -stdout = "${output}" -**** native -output = "${test_build_directory}/program-output" -stdout = "${output}" - - *) + script = "sh ${test_source_directory}/has-afunix.sh"; + libwin32unix; + include systhreads; + hassysthreads; + script; + { + output = "${test_build_directory}/program-output"; + stdout = "${output}"; + bytecode; + }{ + output = "${test_build_directory}/program-output"; + stdout = "${output}"; + native; + } +*) let peer id fd = let msg = Bytes.of_string (Printf.sprintf "%d" id) in diff --git a/testsuite/tests/lib-unix/win-stat/test.ml b/testsuite/tests/lib-unix/win-stat/test.ml index 982cf5c48cb..a4722e23426 100644 --- a/testsuite/tests/lib-unix/win-stat/test.ml +++ b/testsuite/tests/lib-unix/win-stat/test.ml @@ -1,9 +1,12 @@ (* TEST -modules = "fakeclock.c" -* libwin32unix -include unix -** bytecode -** native + modules = "fakeclock.c"; + include unix; + libwin32unix; + { + bytecode; + }{ + native; + } *) external set_fake_clock : int64 -> unit = "set_fake_clock" diff --git a/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml b/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml index d27e7db02dd..3d36ad1935b 100644 --- a/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml +++ b/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml @@ -1,9 +1,12 @@ (* TEST -* libwin32unix -include unix -** has_symlink -*** bytecode -*** native + include unix; + libwin32unix; + has_symlink; + { + bytecode; + }{ + native; + } *) let create_symlink barrier src dst () = diff --git a/testsuite/tests/lib-unix/win-symlink/test.ml b/testsuite/tests/lib-unix/win-symlink/test.ml index d9b9f29e507..72426a23df3 100644 --- a/testsuite/tests/lib-unix/win-symlink/test.ml +++ b/testsuite/tests/lib-unix/win-symlink/test.ml @@ -1,11 +1,12 @@ (* TEST - -* libwin32unix - include unix -** has_symlink -*** bytecode -*** native - + include unix; + libwin32unix; + has_symlink; + { + bytecode; + }{ + native; + } *) let link1 = "link1" diff --git a/testsuite/tests/link-test/empty.ml b/testsuite/tests/link-test/empty.ml index d38300bb8dc..5065877bd10 100644 --- a/testsuite/tests/link-test/empty.ml +++ b/testsuite/tests/link-test/empty.ml @@ -1,29 +1,31 @@ (* TEST - -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "empty.ml" -*** ocamlc.byte -module = "" -flags = "-a" -all_modules = "" -program = "empty.cma" -**** ocamlc.byte -flags = "" -program = "${test_build_directory}/empty.byte" -all_modules = "empty.cma empty.cmo" -***** check-ocamlc.byte-output -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -module = "empty.ml" -*** ocamlopt.byte -module = "" -flags = "-a" -all_modules = "" -program = "empty.cmxa" -**** ocamlopt.byte -flags = "" -program = "${test_build_directory}/empty.native" -all_modules = "empty.cmxa empty.cmx" -***** check-ocamlopt.byte-output + { + setup-ocamlc.byte-build-env; + module = "empty.ml"; + ocamlc.byte; + module = ""; + flags = "-a"; + all_modules = ""; + program = "empty.cma"; + ocamlc.byte; + flags = ""; + program = "${test_build_directory}/empty.byte"; + all_modules = "empty.cma empty.cmo"; + ocamlc.byte; + check-ocamlc.byte-output; + }{ + setup-ocamlopt.byte-build-env; + module = "empty.ml"; + ocamlopt.byte; + module = ""; + flags = "-a"; + all_modules = ""; + program = "empty.cmxa"; + ocamlopt.byte; + flags = ""; + program = "${test_build_directory}/empty.native"; + all_modules = "empty.cmxa empty.cmx"; + ocamlopt.byte; + check-ocamlopt.byte-output; + } *) diff --git a/testsuite/tests/link-test/test.ml b/testsuite/tests/link-test/test.ml index 7b618baa44c..a28970ea736 100644 --- a/testsuite/tests/link-test/test.ml +++ b/testsuite/tests/link-test/test.ml @@ -1,84 +1,82 @@ (* TEST - -modules = "aliases.ml external_for_pack.ml external.ml submodule.ml test.ml \ - use_in_pack.ml" - -* setup-ocamlc.byte-build-env -program = "${test_build_directory}/test.byte" -** ocamlc.byte -module = "submodule.ml" -flags = "-no-alias-deps" -*** ocamlc.byte -module = "aliases.ml" -**** ocamlc.byte -module = "external.mli" -***** ocamlc.byte -module = "external.ml" -****** ocamlc.byte -module = "external_for_pack.mli" -******* ocamlc.byte -module = "external_for_pack.ml" -******** ocamlc.byte -module = "test.ml" -********* ocamlc.byte -module = "" -flags = "-a -no-alias-deps" -all_modules = "submodule.cmo aliases.cmo external.cmo external_for_pack.cmo" -program = "mylib.cma" -********** ocamlc.byte -flags = "-no-alias-deps -for-pack P" -module = "use_in_pack.ml" -*********** ocamlc.byte -module = "" -program = "p.cmo" -flags = "-no-alias-deps -pack" -all_modules = "use_in_pack.cmo" -************ ocamlc.byte -program = "${test_build_directory}/test.byte" -all_modules = "mylib.cma p.cmo test.cmo" -flags= "-no-alias-deps" -************* check-ocamlc.byte-output -************** run -*************** check-program-output - -* setup-ocamlopt.byte-build-env -program = "${test_build_directory}/test.opt" -** ocamlopt.byte -module = "submodule.ml" -flags = "-no-alias-deps" -*** ocamlopt.byte -module = "aliases.ml" -**** ocamlopt.byte -module = "external.mli" -***** ocamlopt.byte -module = "external.ml" -****** ocamlopt.byte -module = "external_for_pack.mli" -******* ocamlopt.byte -module = "external_for_pack.ml" -******** ocamlopt.byte -module = "test.ml" -********* ocamlopt.byte -module = "" -flags = "-no-alias-deps -a" -all_modules = "submodule.cmx aliases.cmx external.cmx external_for_pack.cmx" -program = "mylib.cmxa" -********** ocamlopt.byte -flags = "-no-alias-deps -for-pack P" -module = "use_in_pack.ml" -*********** ocamlopt.byte -module = "" -program = "p.cmx" -flags = "-no-alias-deps -pack" -all_modules = "use_in_pack.cmx" -************ ocamlopt.byte -program = "${test_build_directory}/test.opt" -all_modules = "mylib.cmxa p.cmx test.cmx" -flags = "-no-alias-deps" -************* check-ocamlopt.byte-output -************** run -*************** check-program-output - + modules = "aliases.ml external_for_pack.ml external.ml submodule.ml test.ml use_in_pack.ml"; + { + program = "${test_build_directory}/test.byte"; + setup-ocamlc.byte-build-env; + module = "submodule.ml"; + flags = "-no-alias-deps"; + ocamlc.byte; + module = "aliases.ml"; + ocamlc.byte; + module = "external.mli"; + ocamlc.byte; + module = "external.ml"; + ocamlc.byte; + module = "external_for_pack.mli"; + ocamlc.byte; + module = "external_for_pack.ml"; + ocamlc.byte; + module = "test.ml"; + ocamlc.byte; + module = ""; + flags = "-a -no-alias-deps"; + all_modules = "submodule.cmo aliases.cmo external.cmo external_for_pack.cmo"; + program = "mylib.cma"; + ocamlc.byte; + flags = "-no-alias-deps -for-pack P"; + module = "use_in_pack.ml"; + ocamlc.byte; + module = ""; + program = "p.cmo"; + flags = "-no-alias-deps -pack"; + all_modules = "use_in_pack.cmo"; + ocamlc.byte; + program = "${test_build_directory}/test.byte"; + all_modules = "mylib.cma p.cmo test.cmo"; + flags = "-no-alias-deps"; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/test.opt"; + setup-ocamlopt.byte-build-env; + module = "submodule.ml"; + flags = "-no-alias-deps"; + ocamlopt.byte; + module = "aliases.ml"; + ocamlopt.byte; + module = "external.mli"; + ocamlopt.byte; + module = "external.ml"; + ocamlopt.byte; + module = "external_for_pack.mli"; + ocamlopt.byte; + module = "external_for_pack.ml"; + ocamlopt.byte; + module = "test.ml"; + ocamlopt.byte; + module = ""; + flags = "-no-alias-deps -a"; + all_modules = "submodule.cmx aliases.cmx external.cmx external_for_pack.cmx"; + program = "mylib.cmxa"; + ocamlopt.byte; + flags = "-no-alias-deps -for-pack P"; + module = "use_in_pack.ml"; + ocamlopt.byte; + module = ""; + program = "p.cmx"; + flags = "-no-alias-deps -pack"; + all_modules = "use_in_pack.cmx"; + ocamlopt.byte; + program = "${test_build_directory}/test.opt"; + all_modules = "mylib.cmxa p.cmx test.cmx"; + flags = "-no-alias-deps"; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) include Aliases.Submodule.M diff --git a/testsuite/tests/load_path/test.ml b/testsuite/tests/load_path/test.ml index 20a1800c126..aba49ca3787 100644 --- a/testsuite/tests/load_path/test.ml +++ b/testsuite/tests/load_path/test.ml @@ -1,9 +1,7 @@ (* TEST - -subdirectories = "test" - -* setup-ocaml-build-env -** ocaml -test_file = "test/driver.ml" -ocaml_script_as_argument = "true" + subdirectories = "test"; + setup-ocaml-build-env; + test_file = "test/driver.ml"; + ocaml_script_as_argument = "true"; + ocaml; *) diff --git a/testsuite/tests/local-functions/non_local.ml b/testsuite/tests/local-functions/non_local.ml index 684cb0c5f06..6b32f05e343 100644 --- a/testsuite/tests/local-functions/non_local.ml +++ b/testsuite/tests/local-functions/non_local.ml @@ -1,4 +1,4 @@ -(* TEST *) +(* TEST_BELOW*) (* Basic case: local optimisation works *) let local_direct x = @@ -20,3 +20,6 @@ let local_inner_scope x = let local_in_function x = let[@local] f y = x + y in List.map (fun x -> f (succ x)) [0] + +(* TEST +*) diff --git a/testsuite/tests/local-functions/tupled.ml b/testsuite/tests/local-functions/tupled.ml index aef5aacb27e..fb1d9caa3c4 100644 --- a/testsuite/tests/local-functions/tupled.ml +++ b/testsuite/tests/local-functions/tupled.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* PR#8705 *) let () = diff --git a/testsuite/tests/local-functions/tupled2.ml b/testsuite/tests/local-functions/tupled2.ml index e1564980d64..fa2eebe8c5b 100644 --- a/testsuite/tests/local-functions/tupled2.ml +++ b/testsuite/tests/local-functions/tupled2.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* PR#8705 *) diff --git a/testsuite/tests/locale/test.ml b/testsuite/tests/locale/test.ml index dbd4f449d3c..6798138688c 100644 --- a/testsuite/tests/locale/test.ml +++ b/testsuite/tests/locale/test.ml @@ -1,5 +1,5 @@ (* TEST -modules = "stubs.c" + modules = "stubs.c"; *) external setlocale : string -> unit = "ml_setlocale" diff --git a/testsuite/tests/manual-intf-c/prog.ml b/testsuite/tests/manual-intf-c/prog.ml index 9a9e6845caa..260291c962d 100644 --- a/testsuite/tests/manual-intf-c/prog.ml +++ b/testsuite/tests/manual-intf-c/prog.ml @@ -1,15 +1,16 @@ (* TEST -(* Tests from manual, section intf-c *) -(* - This test is currently skipped because there is no proper way to - figure out whether Curses is available or not. If it becomes possible - to figure that out, it would be nice to be able to check that the test - compiles. Executing seems lessrelevant. -*) -* skip -reason = "curses can not be properly detected at the moment" + (* + This test is currently skipped because there is no proper way to + figure out whether Curses is available or not. If it becomes possible + to figure that out, it would be nice to be able to check that the test + compiles. Executing seems lessrelevant. + *) + reason = "curses can not be properly detected at the moment"; + skip; *) +(* Tests from manual, section intf-c *) + (* File prog.ml -- main program using curses *) open Curses;; let main_window = initscr () in diff --git a/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml b/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml index f062524cdb1..63cd731b723 100644 --- a/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml +++ b/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** Test exhaustiveness. diff --git a/testsuite/tests/match-exception-warnings/no_mixing_under_guard.ml b/testsuite/tests/match-exception-warnings/no_mixing_under_guard.ml index 225d53054d5..ee0c9b49509 100644 --- a/testsuite/tests/match-exception-warnings/no_mixing_under_guard.ml +++ b/testsuite/tests/match-exception-warnings/no_mixing_under_guard.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) exception Exit diff --git a/testsuite/tests/match-exception-warnings/no_value_clauses.ml b/testsuite/tests/match-exception-warnings/no_value_clauses.ml index 77996e5bd46..8ce6ac37810 100644 --- a/testsuite/tests/match-exception-warnings/no_value_clauses.ml +++ b/testsuite/tests/match-exception-warnings/no_value_clauses.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let test f = diff --git a/testsuite/tests/match-exception-warnings/placement.ml b/testsuite/tests/match-exception-warnings/placement.ml index c93247e357e..ca7113cbc10 100644 --- a/testsuite/tests/match-exception-warnings/placement.ml +++ b/testsuite/tests/match-exception-warnings/placement.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (*****************************************************) diff --git a/testsuite/tests/match-exception-warnings/pr7083.ml b/testsuite/tests/match-exception-warnings/pr7083.ml index cf8ddd642de..cdf7f2af418 100644 --- a/testsuite/tests/match-exception-warnings/pr7083.ml +++ b/testsuite/tests/match-exception-warnings/pr7083.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f x = diff --git a/testsuite/tests/match-exception-warnings/reachability.ml b/testsuite/tests/match-exception-warnings/reachability.ml index 7c56ca2f05a..9549c50eaa6 100644 --- a/testsuite/tests/match-exception-warnings/reachability.ml +++ b/testsuite/tests/match-exception-warnings/reachability.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f x = diff --git a/testsuite/tests/match-exception/allocation.ml b/testsuite/tests/match-exception/allocation.ml index a99dc83e952..d7acd758d21 100644 --- a/testsuite/tests/match-exception/allocation.ml +++ b/testsuite/tests/match-exception/allocation.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** Test that matching multiple values doesn't allocate a block. *) diff --git a/testsuite/tests/match-exception/exception_propagation.ml b/testsuite/tests/match-exception/exception_propagation.ml index 759ec386c91..57275f61809 100644 --- a/testsuite/tests/match-exception/exception_propagation.ml +++ b/testsuite/tests/match-exception/exception_propagation.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** Test that match allows exceptions to propagate. diff --git a/testsuite/tests/match-exception/identifier_sharing.ml b/testsuite/tests/match-exception/identifier_sharing.ml index e0bb3890ee2..9df7c5e0ed9 100644 --- a/testsuite/tests/match-exception/identifier_sharing.ml +++ b/testsuite/tests/match-exception/identifier_sharing.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) exception String of string diff --git a/testsuite/tests/match-exception/match_failure.ml b/testsuite/tests/match-exception/match_failure.ml index a6c3d8122e9..60e26f6b9db 100644 --- a/testsuite/tests/match-exception/match_failure.ml +++ b/testsuite/tests/match-exception/match_failure.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** Test that value match failure in a match block raises Match_failure. diff --git a/testsuite/tests/match-exception/nested_handlers.ml b/testsuite/tests/match-exception/nested_handlers.ml index 6f019d4b4b0..c23fb983ca4 100644 --- a/testsuite/tests/match-exception/nested_handlers.ml +++ b/testsuite/tests/match-exception/nested_handlers.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Test that multiple handlers coexist happily. diff --git a/testsuite/tests/match-exception/raise_from_success_continuation.ml b/testsuite/tests/match-exception/raise_from_success_continuation.ml index 69a82371cde..af71feb9fa0 100644 --- a/testsuite/tests/match-exception/raise_from_success_continuation.ml +++ b/testsuite/tests/match-exception/raise_from_success_continuation.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** Test raising exceptions from a value-matching branch. diff --git a/testsuite/tests/match-exception/streams.ml b/testsuite/tests/match-exception/streams.ml index 591b76c01e3..b08a455cfcb 100644 --- a/testsuite/tests/match-exception/streams.ml +++ b/testsuite/tests/match-exception/streams.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** Test the stream example . diff --git a/testsuite/tests/match-exception/tail_calls.ml b/testsuite/tests/match-exception/tail_calls.ml index ae72fc93177..cdad8d927d0 100644 --- a/testsuite/tests/match-exception/tail_calls.ml +++ b/testsuite/tests/match-exception/tail_calls.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** The success continuation expression is in tail position. diff --git a/testsuite/tests/memory-model/forbidden.ml b/testsuite/tests/memory-model/forbidden.ml index 32a8d9fa8c5..fb5152618ff 100644 --- a/testsuite/tests/memory-model/forbidden.ml +++ b/testsuite/tests/memory-model/forbidden.ml @@ -1,10 +1,13 @@ (* TEST - modules="opt.ml barrier.ml hist.ml shared.ml run.ml outcome.ml" - * skip - reason = "OCaml 5 only" - ** not-bsd - *** bytecode - *** native + modules = "opt.ml barrier.ml hist.ml shared.ml run.ml outcome.ml"; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + not-bsd; + { + bytecode; + }{ + native; + } *) (* Memory model test: diff --git a/testsuite/tests/memory-model/publish.ml b/testsuite/tests/memory-model/publish.ml index 3ec6e8c6871..192b3adc465 100644 --- a/testsuite/tests/memory-model/publish.ml +++ b/testsuite/tests/memory-model/publish.ml @@ -1,11 +1,14 @@ (* TEST - modules="opt.ml barrier.ml hist.ml shared.ml run.ml outcome.ml" - * skip - reason = "OCaml 5 only" - ** not-bsd - *** not-windows - **** bytecode - *** native + modules = "opt.ml barrier.ml hist.ml shared.ml run.ml outcome.ml"; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + not-bsd; + { + not-windows; + bytecode; + }{ + native; + } *) (* Memory model: test the _publish idiom *) diff --git a/testsuite/tests/messages/highlight_tabs.ml b/testsuite/tests/messages/highlight_tabs.ml index 9a065a45c3d..6570cac4409 100644 --- a/testsuite/tests/messages/highlight_tabs.ml +++ b/testsuite/tests/messages/highlight_tabs.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let x = abc diff --git a/testsuite/tests/messages/precise_locations.ml b/testsuite/tests/messages/precise_locations.ml index aecd8a5ab34..f748b43b76e 100644 --- a/testsuite/tests/messages/precise_locations.ml +++ b/testsuite/tests/messages/precise_locations.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = (unit, unit, unit, unit) bar diff --git a/testsuite/tests/messages/spellcheck.ml b/testsuite/tests/messages/spellcheck.ml index 9c852668de0..17524312753 100644 --- a/testsuite/tests/messages/spellcheck.ml +++ b/testsuite/tests/messages/spellcheck.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* The goal of this test is exhaustively cover all spellcheck-style diff --git a/testsuite/tests/misc-kb/kbmain.ml b/testsuite/tests/misc-kb/kbmain.ml index 6e94ecd0a77..d39d709bdb9 100644 --- a/testsuite/tests/misc-kb/kbmain.ml +++ b/testsuite/tests/misc-kb/kbmain.ml @@ -1,5 +1,5 @@ (* TEST - modules = "terms.ml equations.ml orderings.ml kb.ml" + modules = "terms.ml equations.ml orderings.ml kb.ml"; *) open Terms diff --git a/testsuite/tests/misc-unsafe/almabench.ml b/testsuite/tests/misc-unsafe/almabench.ml index 253db390e21..90620511d2a 100644 --- a/testsuite/tests/misc-unsafe/almabench.ml +++ b/testsuite/tests/misc-unsafe/almabench.ml @@ -1,5 +1,5 @@ (* TEST - flags += " -unsafe " + flags += " -unsafe "; *) (* diff --git a/testsuite/tests/misc-unsafe/fft.ml b/testsuite/tests/misc-unsafe/fft.ml index 463e5c9dd24..381937383c2 100644 --- a/testsuite/tests/misc-unsafe/fft.ml +++ b/testsuite/tests/misc-unsafe/fft.ml @@ -1,5 +1,5 @@ (* TEST - flags += " -unsafe " + flags += " -unsafe "; *) let pi = 3.14159265358979323846 diff --git a/testsuite/tests/misc-unsafe/quicksort.ml b/testsuite/tests/misc-unsafe/quicksort.ml index 208e2052fb0..6f989836582 100644 --- a/testsuite/tests/misc-unsafe/quicksort.ml +++ b/testsuite/tests/misc-unsafe/quicksort.ml @@ -1,5 +1,5 @@ (* TEST - flags += " -unsafe " + flags += " -unsafe "; *) (* Good test for loops. Best compiled with -unsafe. *) diff --git a/testsuite/tests/misc-unsafe/soli.ml b/testsuite/tests/misc-unsafe/soli.ml index 127cd69923b..92a4e52b873 100644 --- a/testsuite/tests/misc-unsafe/soli.ml +++ b/testsuite/tests/misc-unsafe/soli.ml @@ -1,5 +1,5 @@ (* TEST - flags += " -unsafe " + flags += " -unsafe "; *) type peg = Out | Empty | Peg diff --git a/testsuite/tests/misc/bdd.ml b/testsuite/tests/misc/bdd.ml index 30de85e016b..f471ab9f0c0 100644 --- a/testsuite/tests/misc/bdd.ml +++ b/testsuite/tests/misc/bdd.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Translated to OCaml by Xavier Leroy *) (* Original code written in SML by ... *) diff --git a/testsuite/tests/misc/boyer.ml b/testsuite/tests/misc/boyer.ml index 53e18813a21..736b3524c83 100644 --- a/testsuite/tests/misc/boyer.ml +++ b/testsuite/tests/misc/boyer.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Manipulations over terms *) diff --git a/testsuite/tests/misc/exotic.ml b/testsuite/tests/misc/exotic.ml index c8a40a6f4c7..dae81075f75 100644 --- a/testsuite/tests/misc/exotic.ml +++ b/testsuite/tests/misc/exotic.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-I ${ocamlsrcdir}/utils" - * expect + flags = "-I ${ocamlsrcdir}/utils"; + expect; *) (* Strict-sequence can change the behavior of programs *) diff --git a/testsuite/tests/misc/fib.ml b/testsuite/tests/misc/fib.ml index 46c34193d70..f46e4211a52 100644 --- a/testsuite/tests/misc/fib.ml +++ b/testsuite/tests/misc/fib.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2) diff --git a/testsuite/tests/misc/gc_mark_stack_overflow.ml b/testsuite/tests/misc/gc_mark_stack_overflow.ml index 55dd14a7bdd..81b7dd8f1eb 100644 --- a/testsuite/tests/misc/gc_mark_stack_overflow.ml +++ b/testsuite/tests/misc/gc_mark_stack_overflow.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let clear_elements a m = for i = 1 to m do diff --git a/testsuite/tests/misc/gcwords.ml b/testsuite/tests/misc/gcwords.ml index 45125adc6c2..877d50cf8f8 100644 --- a/testsuite/tests/misc/gcwords.ml +++ b/testsuite/tests/misc/gcwords.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) type t = Leaf of int | Branch of t * t diff --git a/testsuite/tests/misc/gpr1370.ml b/testsuite/tests/misc/gpr1370.ml index 9cd0fedfa5e..3f76d7f7717 100644 --- a/testsuite/tests/misc/gpr1370.ml +++ b/testsuite/tests/misc/gpr1370.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) type t = A|B|C|D type s = diff --git a/testsuite/tests/misc/hamming.ml b/testsuite/tests/misc/hamming.ml index f4010ac47a7..8112a101422 100644 --- a/testsuite/tests/misc/hamming.ml +++ b/testsuite/tests/misc/hamming.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* We cannot use bignums because we don't do custom runtimes, but int64 is a bit short, so we roll our own 37-digit numbers... diff --git a/testsuite/tests/misc/nucleic.ml b/testsuite/tests/misc/nucleic.ml index f83bc0467ef..112765bbbd5 100644 --- a/testsuite/tests/misc/nucleic.ml +++ b/testsuite/tests/misc/nucleic.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Use floating-point arithmetic *) diff --git a/testsuite/tests/misc/pr7168.ml b/testsuite/tests/misc/pr7168.ml index 84697ed37be..725e682f681 100644 --- a/testsuite/tests/misc/pr7168.ml +++ b/testsuite/tests/misc/pr7168.ml @@ -1,6 +1,5 @@ (* TEST - -ocamlrunparam += "l=100000" + ocamlrunparam += "l=100000"; *) let rec f x = @@ -72,16 +71,5 @@ let rec f x = () let _ = - (* CR ocaml 5 runtime: we should be able - * to simplify this test along the same - * lines as upstream, as stack overflow - * detection is always supported in -* ocaml 5. *) - if (Gc.get ()).Gc.stack_limit = 0 then begin - (* We are in native code. Skip the test because some platforms cannot - reliably detect stack overflow. *) - Printf.printf "OK\n" - end else begin - try Sys.with_async_exns (fun () -> f 1) - with Stack_overflow -> Printf.printf "OK\n" - end + try Sys.with_async_exns (fun () -> f 1) + with Stack_overflow -> Printf.printf "OK\n" \ No newline at end of file diff --git a/testsuite/tests/misc/sieve.ml b/testsuite/tests/misc/sieve.ml index 1dd83a0ec9b..7a6325d0fc1 100644 --- a/testsuite/tests/misc/sieve.ml +++ b/testsuite/tests/misc/sieve.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Eratosthene's sieve *) diff --git a/testsuite/tests/misc/sorts.ml b/testsuite/tests/misc/sorts.ml index 445c48419fe..3e7214f6bf4 100644 --- a/testsuite/tests/misc/sorts.ml +++ b/testsuite/tests/misc/sorts.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (* Test bench for sorting algorithms. *) diff --git a/testsuite/tests/misc/takc.ml b/testsuite/tests/misc/takc.ml index bfdf11c45c9..5b1632af771 100644 --- a/testsuite/tests/misc/takc.ml +++ b/testsuite/tests/misc/takc.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let rec tak x y z = if x > y then tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y) diff --git a/testsuite/tests/misc/taku.ml b/testsuite/tests/misc/taku.ml index dac1a3f61e0..b73001c2169 100644 --- a/testsuite/tests/misc/taku.ml +++ b/testsuite/tests/misc/taku.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let rec tak (x, y, z) = if x > y then tak(tak (x-1, y, z), tak (y-1, z, x), tak (z-1, x, y)) diff --git a/testsuite/tests/mixed-blocks/closure_padding_float32.ml b/testsuite/tests/mixed-blocks/closure_padding_float32.ml new file mode 100644 index 00000000000..c5ea0b15b94 --- /dev/null +++ b/testsuite/tests/mixed-blocks/closure_padding_float32.ml @@ -0,0 +1,35 @@ +(* TEST + runtime5; + include stdlib_stable; + ocamlopt_flags="-extension layouts_alpha -extension small_numbers"; + native; +*) + +(* From https://github.com/ocaml-flambda/flambda-backend/pull/2698 + although submitted as part of + https://github.com/ocaml-flambda/flambda-backend/pull/2763 +*) + +module Float32_u = Stdlib_stable.Float32_u + +type t = + | Mutable_str of { mutable x : string } + | Float32 of float32# + +let[@inline always] go x y = + let f = + match x with + | Float32 f32 -> + (fun[@inline never] () -> + match y with + | Mutable_str _ -> f32 + | Float32 _ -> assert false) + | Mutable_str _ -> assert false + in + f () + +let () = + let x = Float32 #4.s in + let y = Mutable_str { x = "s" } in + let _ = go x y in + () diff --git a/testsuite/tests/mixed-blocks/constructor_args.ml b/testsuite/tests/mixed-blocks/constructor_args.ml new file mode 100644 index 00000000000..87d4e82fe6d --- /dev/null +++ b/testsuite/tests/mixed-blocks/constructor_args.ml @@ -0,0 +1,496 @@ +(* TEST + flags = "-extension layouts_beta"; + flambda2; + include stdlib_stable; + include stdlib_upstream_compatible; + { + native; + }{ + bytecode; + } +*) + +(*****************************************) +(* Prelude: Functions on unboxed numbers *) + +module Float32_u = Stdlib_stable.Float32_u +module Float32 = Stdlib_stable.Float32 +module Float_u = Stdlib_upstream_compatible.Float_u +module Int32_u = Stdlib_upstream_compatible.Int32_u +module Int64_u = Stdlib_upstream_compatible.Int64_u +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u + +let print_floatu prefix x = Printf.printf "%s: %.2f\n" prefix (Float_u.to_float x) +let print_float prefix x = Printf.printf "%s: %.2f\n" prefix x +let print_int prefix x = Printf.printf "%s: %d\n" prefix x + +(**************************) +(* Mixed constructor args *) + +type t = + | Constant + | Uniform1 of float + | Mixed1 of float# + | Mixed2 of float * float# + | Mixed3 of float * float# * float# + | Mixed4 of string * float# * int32# + | Mixed5 of float * float# * int * int32# * nativeint# * int64# + | Mixed6 of float * int32# * float# + | Mixed7 of float * int64# * float# * nativeint# + | Mixed8 of float * int32# * float# * int64# * float# + | Mixed9 of float * float# * float32# + | Mixed10 of float * float32# * float# * int64# * float# + | Mixed11 of float * int32# * float32# * float# * int64# * nativeint# + | Uniform2 of float * float + (* "I"mixed for "i"nlined records. *) + | Imixed1 of { x1 : float# } + | Imixed2 of { mutable x1 : float; mutable x2 : float# } + | Imixed3 of { x1 : float; x2 : float#; x3 : float# } + | Imixed4 of { mutable x1: string; mutable x2 : float#; mutable x3 : int32# } + | Imixed5 of { x1: float; x2 : float#; x3 : int; x4: int32#; x5 : nativeint#; + x6 : int64# } + | Imixed6 of { mutable x1: float; mutable x2 : int32#; mutable x3 : float# } + | Imixed7 of { x1: float; x2 : int64#; x3 : float#; x4 : nativeint# } + | Imixed8 of { mutable x1: float; mutable x2 : int32#; mutable x3 : float#; + mutable x4 : int64#; mutable x5 : float# } + | Imixed9 of { x1: float; x2 : float#; x3 : float32# } + | Imixed10 of { mutable x1 : float; mutable x2 : float32#; + mutable x3 : float#; mutable x4 : int64#; mutable x5 : float# + } + | Imixed11 of { x1 : float; x2 : int32#; x3 : float32#; x4 : float#; + x5 : int64#; x6 : nativeint# } + +let sprintf = Printf.sprintf + +let to_string = function + | Constant -> "Constant" + | Uniform1 x -> sprintf "Uniform1 %f" x + | Mixed1 x -> sprintf "Mixed1 %f" (Float_u.to_float x) + | Mixed2 (x1, x2) -> sprintf "Mixed2 (%f, %f)" x1 (Float_u.to_float x2) + | Mixed3 (x1, x2, x3) -> + sprintf "Mixed3 (%f, %f, %f)" + x1 (Float_u.to_float x2) (Float_u.to_float x3) + | Mixed4 (x1, x2, x3) -> + sprintf "Mixed4 (%s, %f, %i)" + x1 (Float_u.to_float x2) (Int32_u.to_int x3) + | Mixed5 (x1, x2, x3, x4, x5, x6) -> + sprintf "Mixed5 (%f, %f, %i, %i, %i, %i)" + x1 (Float_u.to_float x2) x3 (Int32_u.to_int x4) (Nativeint_u.to_int x5) + (Int64_u.to_int x6) + | Mixed6 (x1, x2, x3) -> + sprintf "Mixed6 (%f, %i, %f)" + x1 (Int32_u.to_int x2) (Float_u.to_float x3) + | Mixed7 (x1, x2, x3, x4) -> + sprintf "Mixed7 (%f, %i, %f, %i)" + x1 (Int64_u.to_int x2) (Float_u.to_float x3) (Nativeint_u.to_int x4) + | Mixed8 (x1, x2, x3, x4, x5) -> + sprintf "Mixed8 (%f, %i, %f, %i, %f)" + x1 (Int32_u.to_int x2) (Float_u.to_float x3) (Int64_u.to_int x4) + (Float_u.to_float x5) + | Mixed9 (x1, x2, x3) -> + sprintf "Mixed9 (%f, %f, %f)" x1 (Float_u.to_float x2) + (Float_u.to_float (Float32_u.to_float x3)) + | Mixed10 (x1, x2, x3, x4, x5) -> + sprintf "Mixed10 (%f, %f, %f, %i, %f)" + x1 (Float_u.to_float (Float32_u.to_float x2)) (Float_u.to_float x3) + (Int64_u.to_int x4) (Float_u.to_float x5) + | Mixed11 (x1, x2, x3, x4, x5, x6) -> + sprintf "Mixed11 (%f, %i, %f, %f, %i, %i)" + x1 (Int32_u.to_int x2) (Float_u.to_float (Float32_u.to_float x3)) + (Float_u.to_float x4) (Int64_u.to_int x5) (Nativeint_u.to_int x6) + | Uniform2 (x1, x2) -> sprintf "Uniform2 (%f, %f)" x1 x2 + | Imixed1 {x1} -> sprintf "Imixed1 { x1=%f }" (Float_u.to_float x1) + | Imixed2 { x1; x2 } -> + sprintf "Imixed2 { x1=%f; x2=%f }" x1 (Float_u.to_float x2) + | Imixed3 { x1; x2; x3 } -> + sprintf "Imixed3 { x1=%f; x2=%f; x3=%f }" + x1 (Float_u.to_float x2) (Float_u.to_float x3) + | Imixed4 { x1; x2; x3 } -> + sprintf "Imixed4 { x1=%s; s2=%f; x3=%i }" + x1 (Float_u.to_float x2) (Int32_u.to_int x3) + | Imixed5 { x1; x2; x3; x4; x5; x6 } -> + sprintf "Imixed5 { x1=%f; x2=%f; x3=%i; x4=%i; x5=%i; x6=%i }" + x1 (Float_u.to_float x2) x3 (Int32_u.to_int x4) (Nativeint_u.to_int x5) + (Int64_u.to_int x6) + | Imixed6 { x1; x2; x3 } -> + sprintf "Imixed6 { x1=%f; x2=%i; x3=%f }" + x1 (Int32_u.to_int x2) (Float_u.to_float x3) + | Imixed7 { x1; x2; x3; x4 } -> + sprintf "Imixed7 { x1=%f; x2=%i; x3=%f; x4=%i }" + x1 (Int64_u.to_int x2) (Float_u.to_float x3) (Nativeint_u.to_int x4) + | Imixed8 { x1; x2; x3; x4; x5 } -> + sprintf "Imixed8 { x1=%f; x2=%i; x3=%f; x4=%i; x5%f }" + x1 (Int32_u.to_int x2) (Float_u.to_float x3) (Int64_u.to_int x4) + (Float_u.to_float x5) + | Imixed9 { x1; x2; x3 } -> + sprintf "Imixed9 { x1=%f; x2=%f; x3=%f }" x1 (Float_u.to_float x2) + (Float_u.to_float (Float32_u.to_float x3)) + | Imixed10 { x1; x2; x3; x4; x5 } -> + sprintf "Imixed10 { x1=%f; x2=%f; x3=%f; x4=%i; x5=%f }" + x1 (Float_u.to_float (Float32_u.to_float x2)) (Float_u.to_float x3) + (Int64_u.to_int x4) (Float_u.to_float x5) + | Imixed11 { x1; x2; x3; x4; x5; x6 } -> + sprintf "Imixed11 { x1=%f; x2=%i; x3=%f; x4=%f; x5=%i; x6=%i }" + x1 (Int32_u.to_int x2) (Float_u.to_float (Float32_u.to_float x3)) + (Float_u.to_float x4) (Int64_u.to_int x5) (Nativeint_u.to_int x6) + +let print t = print_endline (" " ^ to_string t) + +(**********************) +(* Test: construction *) + +let toplevel = Mixed1 #7.0 + +let run f = + print_endline "Test (construction)"; + let lit = Mixed2 (3.0, #4.5) in + let half_lit = Mixed3 (6.0, f, #5.0) in + print toplevel; + print lit; + print half_lit; +;; + +let () = run #17.0 + +(**********************************************************) +(* Test: construction and destruction of the same value, to + exercise an optimization code path. +*) + +let sum s uf uf' f f' i i32 i64 i_n f32 = + float_of_string s +. + Float_u.to_float uf +. Float_u.to_float uf' +. f +. f' +. + Int32_u.to_float i32 +. Int64_u.to_float i64 +. Nativeint_u.to_float i_n + +. float_of_int i +. (Float_u.to_float (Float32_u.to_float f32)) + +let construct_and_destruct s uf uf' f f' i i32 i64 i_n f32 = + let Constant = Constant in + let Uniform1 f = Uniform1 f in + let Mixed1 uf = Mixed1 uf in + let Mixed2 (f, uf) = Mixed2 (f, uf) in + let Mixed3 (f, uf, uf') = Mixed3 (f, uf, uf') in + let Mixed4 (s, uf, i32) = Mixed4 (s, uf, i32) in + let Mixed5 (f, uf, i, i32, i_n, i64) = Mixed5 (f, uf, i, i32, i_n, i64) in + let Mixed6 (f, i32, uf) = Mixed6 (f, i32, uf) in + let Mixed7 (f, i64, uf, i_n) = Mixed7 (f, i64, uf, i_n) in + let Mixed8 (f, i32, uf, i64, uf') = Mixed8 (f, i32, uf, i64, uf') in + let Mixed9 (f, uf, f32) = Mixed9 (f, uf, f32) in + let Mixed10 (f, f32, uf, i64, uf') = Mixed10 (f, f32, uf, i64, uf') in + let Mixed11 (f, i32, f32, uf, i64, i_n) = Mixed11 (f, i32, f32, uf, i64, i_n) in + let Uniform2 (f, f') = Uniform2 (f, f') in + let Imixed1 { x1 = uf } = Imixed1 { x1 = uf } in + let Imixed2 { x1 = f; x2 = uf } = Imixed2 { x1 = f; x2 = uf } in + let Imixed3 { x1 = f; x2 = uf; x3 = uf' } = + Imixed3 { x1 = f; x2 = uf; x3 = uf' } + in + let Imixed4 { x1 = s; x2 = uf; x3 = i32 } = + Imixed4 { x1 = s; x2 = uf; x3 = i32 } + in + let Imixed5 { x1 = f; x2 = uf; x3 = i; x4 = i32; x5 = i_n; x6 = i64 } = + Imixed5 { x1 = f; x2 = uf; x3 = i; x4 = i32; x5 = i_n; x6 = i64 } + in + let Imixed6 { x1 = f; x2 = i32; x3 = uf } = + Imixed6 { x1 = f; x2 = i32; x3 = uf } + in + let Imixed7 { x1 = f; x2 = i64; x3 = uf; x4 = i_n } = + Imixed7 { x1 = f; x2 = i64; x3 = uf; x4 = i_n } + in + let Imixed8 { x1 = f; x2 = i32; x3 = uf; x4 = i64; x5 = uf' } = + Imixed8 { x1 = f; x2 = i32; x3 = uf; x4 = i64; x5 = uf' } + in + let Imixed9 { x1 = f; x2 = uf; x3 = f32 } = + Imixed9 { x1 = f; x2 = uf; x3 = f32 } + in + let Imixed10 { x1 = f; x2 = f32; x3 = uf; x4 = i64; x5 = uf' } = + Imixed10 { x1 = f; x2 = f32; x3 = uf; x4 = i64; x5 = uf' } + in + let Imixed11 { x1 = f; x2 = i32; x3 = f32; x4 = uf; x5 = i64; x6 = i_n } = + Imixed11 { x1 = f; x2 = i32; x3 = f32; x4 = uf; x5 = i64; x6 = i_n } + in + sum s uf uf' f f' i i32 i64 i_n f32 +[@@ocaml.warning "-partial-match"] + +let () = + let s = "0.3" + and uf = #5.0 + and uf' = #5.1 + and f = 14.2 + and f' = 15.1 + and i = 0 + and i32 = #12l + and i64 = #42L + and i_n = #56n + and f32 = #1.2s + in + let () = + let sum1 = sum s uf uf' f f' i i32 i64 i_n f32 in + let sum2 = construct_and_destruct s uf uf' f f' i i32 i64 i_n f32 in + Printf.printf + "Test (construct and destruct): %f = %f (%s)\n" + sum1 + sum2 + (if Float.equal sum1 sum2 then "PASS" else "FAIL") + in + () + +(**************************) +(* Test: recursive groups *) + +let rec f r = + match r, t_rec1, t_rec2, t_rec3, t_rec4 with + | Mixed1 a, + Mixed1 x, + Mixed2 (y1, y2), + Mixed1 z, + Mixed2 (w1, w2) -> + Float_u.to_float x +. + y1 +. Float_u.to_float y2 +. + Float_u.to_float z +. + w1 +. Float_u.to_float w2 + | _ -> assert false + +and t_rec1 = Mixed1 #4.0 +and t_rec2 = Mixed2 (5.0, #4.0) +and t_rec3 = Mixed1 #5.0 +and t_rec4 = Mixed2 (6.0, #7.0) +and t_rec5 = Imixed1 { x1 = #8.0 } +and t_rec6 = Imixed2 { x1 = 9.0; x2 = #10.0 } + +let _ = + Printf.printf "Test (mixed constructors in recursive groups):\n"; + print t_rec1; + print t_rec2; + print t_rec3; + print t_rec4; + print t_rec5; + print t_rec6; + let result = f t_rec1 in + print_float " result (31.00)" result; + print t_rec1; + print t_rec2; + print t_rec3; + print t_rec4; + print t_rec5; + print t_rec6; +;; + +(**************************) +(* Test: pattern matching *) + +let go_tuple_args x y z = + let f = + match x with + | Mixed11 (f1, i32_1, f32, uf1, i64, i_n) -> + (* Close over the fields we projected out *) + (fun () -> + match y, z with + | Mixed3 (f2, uf2, uf3), + Mixed4 (s1, uf4, i32_2) + | Mixed4 (s1, uf4, i32_2), + Mixed3 (f2, uf2, uf3) -> + [ f1; + Float_u.to_float uf1; + Int32_u.to_float i32_1; + Nativeint_u.to_float i_n; + Int64_u.to_float i64; + f2; + Float_u.to_float uf2; + Float_u.to_float uf3; + float_of_string s1; + Float_u.to_float uf4; + Int32_u.to_float i32_2; + Float32.to_float (Float32_u.to_float32 f32); + ] + | _ -> assert false + ) + | _ -> assert false + in + f () + +let go_record_args x y z = + let f = + match x with + | Imixed11 { x1 = f1; x2 = i32_1; x3 = f32; x4 = uf1; x5 = i64; x6 = i_n } + -> + (* Close over the fields we projected out *) + (fun () -> + match y, z with + | Imixed3 { x1 = f2; x2 = uf2; x3 = uf3 }, + Imixed4 { x1 = s1; x2 = uf4; x3 = i32_2 } + | Imixed4 { x1 = s1; x2 = uf4; x3 = i32_2 }, + Imixed3 { x1 = f2; x2 = uf2; x3 = uf3 } -> + [ f1; + Float_u.to_float uf1; + Int32_u.to_float i32_1; + Nativeint_u.to_float i_n; + Int64_u.to_float i64; + f2; + Float_u.to_float uf2; + Float_u.to_float uf3; + float_of_string s1; + Float_u.to_float uf4; + Int32_u.to_float i32_2; + Float32.to_float (Float32_u.to_float32 f32); + ] + | _ -> assert false + ) + | _ -> assert false + in + f () + + +let test ~go ~name ~mixed11 ~mixed3 ~mixed4 = + let f1 = 4.0 + and f2 = 42.0 + and s1 = "36.0" + and i32_1 = #3l + and i32_2 = -#10l + and i64 = -#20L + and i_n = #174n + and uf1 = #17.0 + and uf2 = #32.0 + and uf3 = #47.5 + and uf4 = #47.8 + and f32 = #1.2s + in + let x = mixed11 f1 i32_1 f32 uf1 i64 i_n in + let y = mixed3 f2 uf2 uf3 in + let z = mixed4 s1 uf4 i32_2 in + (* These results should match as [go] is symmetric in + its 2nd/3rd arguments. + *) + let res1 = go x y z + and res2 = go x z y + in + Printf.printf "Test (pattern matching, %s).\n" name; + assert (res1 = res2); + Printf.printf " Contents of fields:\n"; + List.iter (Printf.printf " %.3f\n") res1 +;; + +let () = test ~go:go_tuple_args ~name:"tuple args" + ~mixed3:(fun x1 x2 x3 -> Mixed3 (x1, x2, x3)) + ~mixed4:(fun x1 x2 x3 -> Mixed4 (x1, x2, x3)) + ~mixed11:(fun x1 x2 x3 x4 x5 x6 -> + Mixed11 (x1, x2, x3, x4, x5, x6)) + +let () = test ~go:go_record_args ~name:"record args" + ~mixed3:(fun x1 x2 x3 -> Imixed3 {x1; x2; x3}) + ~mixed4:(fun x1 x2 x3 -> Imixed4 {x1; x2; x3}) + ~mixed11:(fun x1 x2 x3 x4 x5 x6 -> + Imixed11 {x1; x2; x3; x4; x5; x6}) + +(*********************************************) +(* Test: pattern matching, recursive closure *) + +let go_recursive_tuple_args x y z = + let f_even = + match y, z with + | Mixed3 (f2, uf2, uf3), + Mixed4 (s1, uf4, i32_2) + | Mixed4 (s1, uf4, i32_2), + Mixed3 (f2, uf2, uf3) -> + (* Close over the fields we projected out + with recursive functions. + *) + let rec f_odd n = + if n < 7 then f_even (n+1) + else match x with + | Mixed11 (f1, i32_1, f32, uf1, i64, i_n) -> + [ float_of_int n; + f1; + Float_u.to_float uf1; + Int32_u.to_float i32_1; + Nativeint_u.to_float i_n; + Int64_u.to_float i64; + f2; + Float_u.to_float uf2; + Float_u.to_float uf3; + float_of_string s1; + Float_u.to_float uf4; + Int32_u.to_float i32_2; + Float32.to_float (Float32_u.to_float32 f32); + ] + | _ -> assert false + and f_even n = f_odd (n+1) in + f_even + | _ -> assert false + in + f_even 0 + +let go_recursive_record_args x y z = + let f_even = + match y, z with + | Imixed3 { x1 = f2; x2 = uf2; x3 = uf3 }, + Imixed4 { x1 = s1; x2 = uf4; x3 = i32_2 } + | Imixed4 { x1 = s1; x2 = uf4; x3 = i32_2 }, + Imixed3 { x1 = f2; x2 = uf2; x3 = uf3 } -> + (* Close over the fields we projected out + with recursive functions. + *) + let rec f_odd n = + if n < 7 then f_even (n+1) + else match x with + | Imixed11 { x1 = f1; x2 = i32_1; x3 = f32; x4 = uf1; + x5 = i64; x6 = i_n } -> + [ float_of_int n; + f1; + Float_u.to_float uf1; + Int32_u.to_float i32_1; + Nativeint_u.to_float i_n; + Int64_u.to_float i64; + f2; + Float_u.to_float uf2; + Float_u.to_float uf3; + float_of_string s1; + Float_u.to_float uf4; + Int32_u.to_float i32_2; + Float32.to_float (Float32_u.to_float32 f32); + ] + | _ -> assert false + and f_even n = f_odd (n+1) in + f_even + | _ -> assert false + in + f_even 0 + +let test_recursive ~go ~name ~mixed3 ~mixed4 ~mixed11 = + let f1 = 4.0 + and f2 = 42.0 + and s1 = "36.0" + and i32_1 = #3l + and i32_2 = -#10l + and i64 = -#20L + and i_n = #174n + and uf1 = #17.0 + and uf2 = #32.0 + and uf3 = #47.5 + and uf4 = #47.8 + and f32 = #1.2s + in + let x = mixed11 f1 i32_1 f32 uf1 i64 i_n in + let y = mixed3 f2 uf2 uf3 in + let z = mixed4 s1 uf4 i32_2 in + (* These results should match as [go_recursive] is symmetric in + its 2nd/3rd arguments. + *) + let res1 = go x y z + and res2 = go x z y + in + Printf.printf "Test (pattern matching, recursive closure, %s).\n" name; + assert (res1 = res2); + Printf.printf " Contents of fields:\n"; + List.iter (Printf.printf " %.3f\n") res1 +;; + +let () = test_recursive ~go:go_recursive_tuple_args ~name:"tuple args" + ~mixed3:(fun x1 x2 x3 -> Mixed3 (x1, x2, x3)) + ~mixed4:(fun x1 x2 x3 -> Mixed4 (x1, x2, x3)) + ~mixed11:(fun x1 x2 x3 x4 x5 x6 -> + Mixed11 (x1, x2, x3, x4, x5, x6)) + +let () = test_recursive ~go:go_recursive_record_args ~name:"record args" + ~mixed3:(fun x1 x2 x3 -> Imixed3 {x1; x2; x3}) + ~mixed4:(fun x1 x2 x3 -> Imixed4 {x1; x2; x3}) + ~mixed11:(fun x1 x2 x3 x4 x5 x6 -> + Imixed11 {x1; x2; x3; x4; x5; x6}) diff --git a/testsuite/tests/mixed-blocks/constructor_args.reference b/testsuite/tests/mixed-blocks/constructor_args.reference new file mode 100644 index 00000000000..a6fad7a9187 --- /dev/null +++ b/testsuite/tests/mixed-blocks/constructor_args.reference @@ -0,0 +1,77 @@ +Test (construction) + Mixed1 7.000000 + Mixed2 (3.000000, 4.500000) + Mixed3 (6.000000, 17.000000, 5.000000) +Test (construct and destruct): 150.900000 = 150.900000 (PASS) +Test (mixed constructors in recursive groups): + Mixed1 4.000000 + Mixed2 (5.000000, 4.000000) + Mixed1 5.000000 + Mixed2 (6.000000, 7.000000) + Imixed1 { x1=8.000000 } + Imixed2 { x1=9.000000; x2=10.000000 } + result (31.00): 31.00 + Mixed1 4.000000 + Mixed2 (5.000000, 4.000000) + Mixed1 5.000000 + Mixed2 (6.000000, 7.000000) + Imixed1 { x1=8.000000 } + Imixed2 { x1=9.000000; x2=10.000000 } +Test (pattern matching, tuple args). + Contents of fields: + 4.000 + 17.000 + 3.000 + 174.000 + -20.000 + 42.000 + 32.000 + 47.500 + 36.000 + 47.800 + -10.000 + 1.200 +Test (pattern matching, record args). + Contents of fields: + 4.000 + 17.000 + 3.000 + 174.000 + -20.000 + 42.000 + 32.000 + 47.500 + 36.000 + 47.800 + -10.000 + 1.200 +Test (pattern matching, recursive closure, tuple args). + Contents of fields: + 7.000 + 4.000 + 17.000 + 3.000 + 174.000 + -20.000 + 42.000 + 32.000 + 47.500 + 36.000 + 47.800 + -10.000 + 1.200 +Test (pattern matching, recursive closure, record args). + Contents of fields: + 7.000 + 4.000 + 17.000 + 3.000 + 174.000 + -20.000 + 42.000 + 32.000 + 47.500 + 36.000 + 47.800 + -10.000 + 1.200 diff --git a/testsuite/tests/mixed-blocks/generate_mixed_blocks_code.ml b/testsuite/tests/mixed-blocks/generate_mixed_blocks_code.ml new file mode 100644 index 00000000000..aff27f8320b --- /dev/null +++ b/testsuite/tests/mixed-blocks/generate_mixed_blocks_code.ml @@ -0,0 +1,868 @@ +(* The below code recursively enumerates all mixed record types, + takes a finite prefix of that, and prints a program that + uses the mixed record types in interesting ways that exercise + corners of the runtime. (Especially polymorphic operations, + copying, and garbage collection.) + + It is used in [test.ml]. +*) + +let printf = Printf.printf +let sprintf = Printf.sprintf + +module List = ListLabels +module String = StringLabels + +let list_product xs ys = + List.concat_map xs ~f:(fun x -> + List.map ys ~f:(fun y -> (x, y))) + +module Nonempty_list = struct + type 'a t = ( :: ) of 'a * 'a list + + let of_list = function + | [] -> None + | x :: xs -> Some (x :: xs) + ;; + + let to_list (x :: xs) : _ list = x :: xs + + let map t ~f = of_list (List.map (to_list t) ~f) |> Option.get +end + +let rec list_enumeration enumeration_of_x = + Seq.cons [] (fun () -> + let f = + Seq.product (list_enumeration enumeration_of_x) enumeration_of_x + |> Seq.map (fun (xs, x) -> x :: xs) + in + f ()) +;; + +(* The difference between [list_enumeration (List.to_seq xs)] + and [list_enumeration_of_list xs] is that [list_enumeration_of_list xs] + more eagerly cycles through elements of [xs] (given that it knows it's + finite). [list_enumeration] has to round-robin because the sequence + it's given might be infinite. +*) +let rec list_enumeration_of_list list = + Seq.cons [] (fun () -> + let f = + list_enumeration_of_list list + |> Seq.concat_map (fun xs -> + List.to_seq (List.map list ~f:(fun x -> x :: xs))) + in + f ()) +;; + +let nonempty_list_enumeration enumeration_of_x = + list_enumeration enumeration_of_x |> Seq.filter_map Nonempty_list.of_list +;; + +let nonempty_list_enumeration_of_list xs = + list_enumeration_of_list xs |> Seq.filter_map Nonempty_list.of_list +;; + +type flat_element = + | Imm + | Float64 + | Float32 + | Float + | Bits32 + | Bits64 + | Word + +let allowed_in_flat_float_block = function + | Float64 | Float -> true + | Imm | Float32 | Bits32 | Bits64 | Word -> false + +let flat_element_is_unboxed = function + | Float64 | Float32 | Bits32 | Bits64 | Word -> true + | Imm | Float -> false + +let flat_element_is = ((=) : flat_element -> flat_element -> bool) +let flat_element_is_not = ((<>) : flat_element -> flat_element -> bool) + +let all_of_flat_element = [ Imm; Float64; Float32; Float; Bits32; Bits64; Word ] + +type value_element = + | Str + | Float + | Imm + +let value_element_is = ((=) : value_element -> value_element -> bool) + +let all_of_value_element = [ Str; Float; Imm ] + +type mutability = + | Mutable + | Immutable + +let all_of_mutability = [ Mutable; Immutable ] + +let is_mutable = function + | Mutable -> true + | Immutable -> false +;; + +type prefix = (value_element * mutability) list +type suffix = (flat_element * mutability) Nonempty_list.t + +let enumeration_of_prefix all_of_mutability = + list_enumeration_of_list + (list_product all_of_value_element all_of_mutability) + |> Seq.filter (fun prefix -> + match List.rev prefix with + | [] -> true + | (Imm, _) :: _ -> false + | ((Str | Float), _) :: _ -> true) +;; + +let enumeration_of_suffix_except_all_floats_mixed + all_of_mutability + : _ Seq.t + = + let flat_element_except_float = + all_of_flat_element + |> List.filter ~f:(flat_element_is_not Float) + in + nonempty_list_enumeration_of_list + (list_product all_of_flat_element all_of_mutability) + |> Seq.filter (fun suffix -> + List.exists (Nonempty_list.to_list suffix) ~f:(fun (elem, _) -> + flat_element_is_unboxed elem)) +;; + +let enumeration_of_all_floats_mixed_suffix = + let float_flat_element = + all_of_flat_element + |> List.filter ~f:allowed_in_flat_float_block + in + nonempty_list_enumeration_of_list + (list_product float_flat_element all_of_mutability) + |> Seq.filter (fun suffix -> + let suffix = Nonempty_list.to_list suffix in + List.exists suffix ~f:(fun (elem, _) -> flat_element_is Float64 elem) + && List.exists suffix ~f:(fun (elem, _) -> flat_element_is Float elem)) + +type block = + { prefix : prefix + ; suffix : suffix + } + +let enumeration_of_mixed_blocks_except_all_floats_mixed + all_of_mutability + = + Seq.product + (enumeration_of_prefix all_of_mutability) + (enumeration_of_suffix_except_all_floats_mixed all_of_mutability) + |> Seq.filter (fun (prefix, suffix) -> + let all_float_u_suffix = + List.for_all (Nonempty_list.to_list suffix) + ~f:(fun (elem, _) -> flat_element_is Float64 elem) + in + let all_float_prefix = + List.for_all prefix + ~f:(fun (elem, _) -> value_element_is Float elem) + in + not all_float_u_suffix || not all_float_prefix) + +type constructor = + | Cstr_tuple of + { cstr_prefix : value_element list; + cstr_suffix : flat_element Nonempty_list.t; + } + | Cstr_record of block + +type variant = constructor Nonempty_list.t + +let enumeration_of_cstr_tuples = + let all_of_mutability = [ `Mutability_not_relevant ] in + Seq.product + (enumeration_of_prefix all_of_mutability) + (enumeration_of_suffix_except_all_floats_mixed all_of_mutability) + |> Seq.map (fun (prefix, suffix) -> + let ignore_mut (x, `Mutability_not_relevant) = x in + Cstr_tuple + { cstr_prefix = List.map prefix ~f:ignore_mut; + cstr_suffix = Nonempty_list.map suffix ~f:ignore_mut; + }) + +let enumeration_of_cstr_records = + Seq.product + (enumeration_of_prefix all_of_mutability) + (enumeration_of_suffix_except_all_floats_mixed all_of_mutability) + |> Seq.map (fun (prefix, suffix) -> + Cstr_record { prefix; suffix }) + +let enumeration_of_mixed_variants = + Seq.interleave enumeration_of_cstr_tuples enumeration_of_cstr_records + |> nonempty_list_enumeration + +let enumeration_of_mixed_blocks_except_all_floats_mixed = + enumeration_of_mixed_blocks_except_all_floats_mixed + all_of_mutability + |> Seq.map (fun (prefix, suffix) -> { prefix; suffix }) + + +let enumeration_of_all_floats_mixed_blocks = + enumeration_of_all_floats_mixed_suffix + |> Seq.map (fun suffix -> { prefix = []; suffix }) +;; + +type field_or_arg_type = + | Imm + | Float + | Float64 + | Float32 + | Str + | Bits32 + | Bits64 + | Word + +let type_to_creation_function = function + | Imm -> "create_int ()" + | Float -> "create_float ()" + | Float64 -> "create_float_u ()" + | Float32 -> "create_float32_u ()" + | Bits32 -> "create_int32_u ()" + | Bits64 -> "create_int64_u ()" + | Word -> "create_nativeint_u ()" + | Str -> "create_string ()" + +let type_to_string = function + | Imm -> "int" + | Float -> "float" + | Float64 -> "float#" + | Float32 -> "float32#" + | Bits32 -> "int32#" + | Bits64 -> "int64#" + | Word -> "nativeint#" + | Str -> "string" + +let type_to_field_integrity_check type_ ~access1 ~access2 ~message = + let checker, transformation = + match type_ with + | Str -> "check_string", None + | Imm -> "check_int", None + | Float -> "check_float", None + | Float64 -> "check_float", Some "Stdlib_upstream_compatible.Float_u.to_float" + | Float32 -> "check_float32", Some "Stdlib_stable.Float32_u.to_float32" + | Bits32 -> "check_int32", Some "Stdlib_upstream_compatible.Int32_u.to_int32" + | Bits64 -> "check_int64", Some "Stdlib_upstream_compatible.Int64_u.to_int64" + | Word -> "check_int", Some "Stdlib_upstream_compatible.Nativeint_u.to_int" + in + let transform access = + match transformation with + | None -> access + | Some f -> sprintf "(%s %s)" f access + in + sprintf + "%s %s %s ~message:\"%s\";" + checker + (transform access1) + (transform access2) + (String.escaped message) + +let value_element_to_type : value_element -> field_or_arg_type = function + | Imm -> Imm + | Float -> Float + | Str -> Str + +let flat_element_to_type : flat_element -> field_or_arg_type = function + | Imm -> Imm + | Float -> Float + | Float64 -> Float64 + | Float32 -> Float32 + | Bits64 -> Bits64 + | Bits32 -> Bits32 + | Word -> Word + +module Mixed_record = struct + type field = + { type_ : field_or_arg_type + ; name : string + ; mutable_ : bool + } + + type t = + { index : int + ; fields : field list + } + + let is_all_floats t = + List.for_all t.fields ~f:(fun field -> + match field.type_ with + | Imm | Str | Float32 | Bits32 | Bits64 | Word -> false + | Float | Float64 -> true) + + let of_block index { prefix; suffix } = + let num_fields, prefix_fields = + List.fold_left_map + prefix + ~init:0 + ~f:(fun i ((elem : value_element), mutability) -> + let mutable_ = is_mutable mutability in + let name = + match elem with + | Imm -> "imm" + | Float -> "float" + | Str -> "str" + in + let field = + { type_ = value_element_to_type elem; + name = sprintf "%s%i" name i; + mutable_; + } + in + i+1, field) + in + let _, suffix_fields = + List.fold_left_map + (Nonempty_list.to_list suffix) + ~init:num_fields + ~f:(fun i ((elem : flat_element), mutability) -> + let mutable_ = is_mutable mutability in + let name = + match elem with + | Imm -> "imm" + | Bits32 -> "i32_" + | Bits64 -> "i64_" + | Word -> "n" + | Float -> "float" + | Float64 -> "float_u" + | Float32 -> "float32_u" + in + let field = + { type_ = flat_element_to_type elem; + name = sprintf "%s%i" name i; + mutable_; + } + in + i+1, field) + in + let fields = prefix_fields @ suffix_fields in + { fields; index } + ;; + + let value ?(base = "t") { index; _ } = sprintf "%s%d" base index + let type_ { index; _ } = sprintf "t%d" index + + let fields_to_type_decl fields = + String.concat + ~sep:"; " + (List.map fields ~f:(fun { type_; name; mutable_ } -> + sprintf + "%s%s : %s" + (if mutable_ then "mutable " else "") + name + (type_to_string type_))) + + let type_decl t = + sprintf + "type %s = { %s }" + (type_ t) + (fields_to_type_decl t.fields) + ;; + + let record_value_of_fields fields = + String.concat + ~sep:"; " + (List.map fields ~f:(fun { type_; name; mutable_ = _ } -> + sprintf + "%s = %s" + name + (type_to_creation_function type_))) + |> sprintf "{ %s }" + ;; + + let record_value t = record_value_of_fields t.fields + + let check_field_integrity t = + List.map t.fields ~f:(fun field -> + type_to_field_integrity_check + field.type_ + ~access1:(sprintf "%s.%s" (value t) field.name) + ~access2:(sprintf "%s.%s" (value t ~base:"t_orig") field.name) + ~message:(sprintf "%s.%s" (value t) field.name)) + ;; +end + +module Mixed_variant = struct + type args = + | Args_tuple of field_or_arg_type list + | Args_record of Mixed_record.field list + + type constructor = + { name : string; + index : int; + args : args; + } + + type t = + { index : int + ; constructors : constructor list + } + + let of_constructor name cstr index = + let args = + match cstr with + | Cstr_tuple { cstr_prefix; cstr_suffix } -> + let prefix_args = List.map cstr_prefix ~f:value_element_to_type in + let suffix_args = + List.map + (Nonempty_list.to_list cstr_suffix) + ~f:flat_element_to_type + in + Args_tuple (prefix_args @ suffix_args) + | Cstr_record record -> + let { fields; _ } : Mixed_record.t = Mixed_record.of_block index record in + Args_record fields + in + { name; args; index } + ;; + + let of_variant index cstrs = + let constructors = + Nonempty_list.to_list cstrs + |> List.mapi ~f:(fun i cstr -> + let name = sprintf "%c" (Char.chr (Char.code 'A' + i)) in + of_constructor name cstr i) + in + { index; constructors; } + + let constructor_decl cstr = + sprintf + " | %s of %s" + cstr.name + (match cstr.args with + | Args_tuple args -> + String.concat ~sep:" * " (List.map args ~f:type_to_string) + | Args_record fields -> + sprintf "{ %s }" (Mixed_record.fields_to_type_decl fields)) + ;; + + let type_ { index; _ } = sprintf "t%d" index + let value ?(base = "t") { name; _ } ~index = sprintf "%s%d_%s" base index name + + let constructor_value { name; args } = + sprintf "(%s %s)" + name + (match args with + | Args_record fields -> Mixed_record.record_value_of_fields fields + | Args_tuple args -> + let args_str = + String.concat + ~sep:", " + (List.map args ~f:type_to_creation_function) + in + match args with + | [] -> args_str + | _ -> sprintf "(%s)" args_str) + + let type_decl t = + sprintf + "type %s =\n%s" + (type_ t) + (String.concat ~sep:"\n" (List.map t.constructors ~f:constructor_decl)) + ;; + + let check_field_integrity cstr ~index ~catchall = + let value = value ~index in + let arg_var i ~base = sprintf "%s%i" base i in + let arg_vars cstr ~base = + match cstr.args with + | Args_record _ -> base + | Args_tuple args -> + sprintf "(%s)" + (String.concat ~sep:", " + (List.mapi args ~f:(fun i _ -> + arg_var i ~base))) + in + sprintf {|let () = match %s, %s with + | %s %s, %s %s -> %s + %s + in|} + (value cstr) + (value cstr ~base:"t_orig") + cstr.name (arg_vars cstr ~base:"a") + cstr.name (arg_vars cstr ~base:"b") + (String.concat ~sep:"\n" + (match cstr.args with + | Args_record fields -> + List.map fields ~f:(fun (field : Mixed_record.field) -> + type_to_field_integrity_check + field.type_ + ~access1:(sprintf "a.%s" field.name) + ~access2:(sprintf "b.%s" field.name) + ~message:(sprintf "%s.%s" (value cstr) field.name)) + | Args_tuple args -> + List.mapi args ~f:(fun i type_ -> + type_to_field_integrity_check + type_ + ~access1:(arg_var i ~base:"a") + ~access2:(arg_var i ~base:"b") + ~message:(sprintf "%s.%i" (value cstr) i)))) + (if catchall then "| _ -> assert false" else "") + ;; +end + +module Value = struct + type t = + | Record of Mixed_record.t + | Constructor of Mixed_variant.t * Mixed_variant.constructor + + let value ?base = function + | Record x -> Mixed_record.value ?base x + | Constructor (v, c) -> Mixed_variant.value ?base c ~index:v.index + + let type_ = function + | Record x -> Mixed_record.type_ x + | Constructor (x, _) -> Mixed_variant.type_ x + + let construction = function + | Record x -> Mixed_record.record_value x + | Constructor (_, x) -> Mixed_variant.constructor_value x + + let is_all_floats = function + | Record x -> Mixed_record.is_all_floats x + | Constructor _ -> false + + let index = function + | Record x -> x.index + | Constructor (x, _) -> x.index + + let check_field_integrity = function + | Record x -> Mixed_record.check_field_integrity x + | Constructor (v, c) -> + [ Mixed_variant.check_field_integrity c ~index:v.index + ~catchall:(List.length v.constructors > 1) + ] + + let tag = function + | Record _ -> 0 + | Constructor (_, c) -> c.index +end + +module Type = struct + type t = + | Record of Mixed_record.t + | Variant of Mixed_variant.t + + let type_decl = function + | Record x -> Mixed_record.type_decl x + | Variant x -> Mixed_variant.type_decl x + + let index = function + | Record x -> x.index + | Variant x -> x.index + + let values : t -> Value.t list = function + | Record x -> [ Record x ] + | Variant x -> + List.map x.constructors ~f:(fun cstr -> Value.Constructor (x, cstr)) + + let record_of_block i block = + Record (Mixed_record.of_block i block) + + let variant_of_block i block = + Variant (Mixed_variant.of_variant i block) +end + +let main n ~bytecode = + (* Don't overrepresent all-float mixed blocks. *) + let n_all_floats_mixed = n / 4 in + let records = + Seq.append + (Seq.take n_all_floats_mixed + enumeration_of_all_floats_mixed_blocks) + (Seq.take (n - n_all_floats_mixed) + enumeration_of_mixed_blocks_except_all_floats_mixed) + |> List.of_seq + |> List.mapi ~f:Type.record_of_block + in + let variants = + Seq.take n enumeration_of_mixed_variants + |> List.of_seq + |> List.mapi ~f:(fun i x -> Type.variant_of_block (i+n) x) + in + let types = records @ variants in + let values = List.concat_map types ~f:Type.values in + let line ?(indent = 0) fmt = + Printf.ksprintf + (fun s -> + let indent = Seq.init indent (fun _ -> ' ') |> String.of_seq in + print_endline (indent ^ s)) + fmt + in + let print_in_test ?indent s = + line ?indent {|let () = print_endline "%s";;|} (String.escaped s) + in + let seq_print_in_test ?indent s = + line ?indent {|print_endline "%s";|} (String.escaped s) + in + let do_gc ?indent () = + seq_print_in_test ?indent " - Doing GC"; + line ?indent "Gc.full_major ();" + in + let per_type f = List.iter types ~f in + let per_value f = List.iter values ~f in + (* Iterate over the list of values zipped with itself (staggered by 1) *) + let per_value_staircase f = + List.iter2 values (List.tl values @ [ List.hd values]) ~f + in + line {|(* TEST + flags = "-extension layouts_beta"; + include stdlib_stable; + include stdlib_upstream_compatible;|}; + if bytecode then ( + line {| bytecode;|}; + ) else ( + line {| flambda2;|}; + line {| native;|}; + ); + line {|*)|}; + line "(** This is code generated by [generate_mixed_blocks_code.ml]. *)"; + line ""; + line "(* Helper functions for manipulating the fields of a mixed record *)"; + line {|let create_string () = String.make (Random.int 100) 'a'|}; + line {|let create_int () = Random.int 0x3FFF_FFFF|}; + line {|let create_float () = Random.float Float.max_float|}; + line {|let create_float32 () = Stdlib_stable.Float32.of_float (Random.float Float.max_float)|}; + line {|let create_float_u () = Stdlib_upstream_compatible.Float_u.of_float (create_float ())|}; + line {|let create_float32_u () = Stdlib_stable.Float32_u.of_float32 (create_float32 ())|}; + line {|let create_int32_u () = Stdlib_upstream_compatible.Int32_u.of_int32 (Random.int32 0x7FFF_FFFFl)|}; + line {|let create_int64_u () = Stdlib_upstream_compatible.Int64_u.of_int64 (Random.int64 0x7FFF_FFFF_FFFF_FFFFL)|}; + line {|let create_nativeint_u () = Stdlib_upstream_compatible.Nativeint_u.of_nativeint (Random.nativeint 0x7FFF_FFFF_FFFF_FFFFn)|}; + line + {|let check_gen ~equal ~to_string ~message y1 y2 = + if equal y1 y2 then () else + failwith + (Printf.sprintf "%%s: %%s <> %%s" message (to_string y1) (to_string y2)) +|}; + line + {|let check_string = check_gen ~equal:String.equal ~to_string:(fun x -> x)|}; + line {|let check_int = check_gen ~equal:Int.equal ~to_string:Int.to_string|}; + line + {|let check_float = + check_gen ~equal:Float.equal ~to_string:Float.to_string|}; + line + {|let check_float32 = + check_gen ~equal:Stdlib_stable.Float32.equal ~to_string:Stdlib_stable.Float32.to_string|}; + line + {|let check_int32 = + check_gen ~equal:Int32.equal ~to_string:Int32.to_string|}; + line + {|let check_int64 = + check_gen ~equal:Int64.equal ~to_string:Int64.to_string|}; + line ""; + line "(* Helper functions for testing polymorphic copying. *)"; + line + {| +let copy_via_weak x = + let weak = Weak.create 1 in + Weak.set weak 0 (Some x); + Weak.get_copy weak 0 |> Option.get|}; + line + {| +let copy_via_tag x = + let obj = Obj.repr x in + Obj.with_tag (Obj.tag obj) obj |> Obj.obj;;|}; + line ""; + line {|(* Helper functions for testing polymorphic operations. *)|}; + line {|let oc = Out_channel.open_bin "/dev/null"|}; + line {|exception Unexpected_success|}; + line {|type forget = T : _ -> forget|}; + line + {| +let expect_failure f = + try f (); raise Unexpected_success with + | Unexpected_success -> assert false + | _ -> () + +let hash_expect_failure x = + expect_failure (fun () -> ignore (Hashtbl.hash x : int)) + +let compare_expect_failure x y = + expect_failure (fun () -> ignore (compare (T x) (T y) : int)); + expect_failure (fun () -> ignore ((T x) = (T y) : bool)) + +let compare_expect_success x y = + ignore (compare (T x) (T y) : int); + ignore ((T x) = (T y) : bool) + +let marshal_expect_failure t = + expect_failure (fun () -> output_value oc t)|}; + line + {| +let check_reachable_words expected actual message = + if expected <> actual + then failwith (Printf.sprintf "%%s: %%d <> %%d" message expected actual) +;;|}; + line ""; + line "(* Type declarations *)"; + per_type (fun t -> line "%s" (Type.type_decl t)); + print_endline ""; + line {|external opaque_ignore : ('a [@local_opt]) -> unit = "%%opaque"|}; + print_endline ""; + print_endline "let[@opaque] run () ="; + print_endline "(* Let declarations *)"; + seq_print_in_test "Creating values"; + per_value (fun t -> + line + "let %s : %s = %s in" + (Value.value t) + (Value.type_ t) + (Value.construction t)); + do_gc (); + line ""; + line "(* Copies *)"; + seq_print_in_test "Copying values using [with] record update"; + per_value (fun t -> + match t with + | Constructor _ -> + line + "let %s = %s in" + (Value.value t ~base:"t_orig") + (Value.value t) + | Record record -> + let field = List.hd record.fields in + line + "let %s = { %s%s = %s.%s } in" + (Value.value t ~base:"t_orig") + (match record.fields with + | [_] -> "" + | _ -> sprintf "%s with " (Value.value t)) + field.name + (Value.value t) + field.name); + print_endline ""; + print_endline "(* Checks *)"; + let () = + let indent = 2 in + let line ?(indent = indent) = line ~indent in + let seq_print_in_test ?(indent = indent) = seq_print_in_test ~indent in + line + "let run_checks %s =" + (List.map values ~f:(fun t -> + sprintf "(%s : %s)" (Value.value t) (Value.type_ t)) + |> String.concat ~sep:" "); + seq_print_in_test " - Marshaling"; + per_value (fun t -> line "marshal_expect_failure %s;" (Value.value t)); + seq_print_in_test " - Hashing"; + per_value (fun t -> line "hash_expect_failure %s;" (Value.value t)); + if n > 1 + then ( + seq_print_in_test " - Comparing"; + per_value_staircase (fun t1 t2 -> + let fn_name = + (* Polymorphic compare only raises an exception if + the tags don't match. + *) + if Value.tag t1 = Value.tag t2 + then "compare_expect_failure" + else "compare_expect_success" + in + line "%s %s %s;" fn_name + (Value.value t1) + (Value.value t2))); + seq_print_in_test " - Checking field values"; + per_value (fun t -> + List.iter (Value.check_field_integrity t) ~f:(line "%s")); + seq_print_in_test " - Checking [Obj.reachable_words]"; + per_value (fun t -> + match t with + | Constructor _ -> () + | Record t -> + let is_all_floats = Mixed_record.is_all_floats t in + line + {|check_reachable_words (Obj.reachable_words (Obj.repr %s)) (%d%s) "Reachable words %d";|} + (Mixed_record.value t) + (List.length t.fields + 1) + (List.map t.fields ~f:(fun (field : Mixed_record.field) -> + match field.type_ with + | Imm -> "" + | Float64 -> + (* In bytecode, these fields aren't boxed and thus contribute + two words to the reachable words (the header and the + single-field payload). + *) + if not bytecode then "" else " + 2" + | Float32 | Bits64 | Bits32 | Word -> + (* Same as float64, except these are custom blocks in bytecode, + which involve still another field. *) + if not bytecode then "" else " + 3" + | Float -> + (* The bytecode condition is the same as commented for [Float64]. + Additionally, if the record is not all floats, then this field + is stored boxed. + *) + if is_all_floats && not bytecode then "" else " + 2" + | Str -> + sprintf " + Obj.reachable_words (Obj.repr t%d.%s)" + t.index field.name) + |> String.concat ~sep:"") + t.index); + line "()" + in + print_endline "in"; + let run_checks ?indent () = + seq_print_in_test " - Running checks"; + line + ?indent + "let () = run_checks %s in" + (List.map values ~f:Value.value |> String.concat ~sep:" ") + in + run_checks (); + do_gc (); + run_checks (); + seq_print_in_test "Copying values via [Stdlib.Weak]"; + per_value (fun t -> + line + "let %s : %s = copy_via_weak %s in" + (Value.value t) + (Value.type_ t) + (Value.value t)); + run_checks (); + do_gc (); + run_checks (); + seq_print_in_test "Copying values via [Obj.with_tag]"; + per_value (fun t -> + line + "let %s : %s = copy_via_tag %s in" + (Value.value t) + (Value.type_ t) + (Value.value t)); + run_checks (); + do_gc (); + run_checks (); + line ""; + line "(* Testing local allocation *)"; + print_endline "let go () ="; + let () = + let indent = 2 in + let line ?(indent = indent) = line ~indent in + per_value (fun t -> + line + "let local_ %s : %s = %s in" + (Value.value t) + (Value.type_ t) + (Value.construction t)); + do_gc () ~indent; + per_value (fun t -> line "opaque_ignore %s;" (Value.value t)); + line "()" + in + print_endline "in"; + seq_print_in_test "Testing local allocations"; + print_endline "go ();;"; + print_endline "let () = run ();;" +;; + +let () = + let n, bytecode = + match Sys.argv with + | [| _; n; "native" |] -> n, false + | [| _; n; "byte" |] -> n, true + | _ -> failwith (Printf.sprintf "Usage: %s N " Sys.argv.(0)) + in + main (int_of_string n) ~bytecode diff --git a/testsuite/tests/mixed-blocks/generated_byte_test.ml b/testsuite/tests/mixed-blocks/generated_byte_test.ml new file mode 100644 index 00000000000..fccd5cdafd4 --- /dev/null +++ b/testsuite/tests/mixed-blocks/generated_byte_test.ml @@ -0,0 +1,16980 @@ +(* TEST + flags = "-extension layouts_beta"; + include stdlib_stable; + include stdlib_upstream_compatible; + bytecode; +*) +(** This is code generated by [generate_mixed_blocks_code.ml]. *) + +(* Helper functions for manipulating the fields of a mixed record *) +let create_string () = String.make (Random.int 100) 'a' +let create_int () = Random.int 0x3FFF_FFFF +let create_float () = Random.float Float.max_float +let create_float32 () = Stdlib_stable.Float32.of_float (Random.float Float.max_float) +let create_float_u () = Stdlib_upstream_compatible.Float_u.of_float (create_float ()) +let create_float32_u () = Stdlib_stable.Float32_u.of_float32 (create_float32 ()) +let create_int32_u () = Stdlib_upstream_compatible.Int32_u.of_int32 (Random.int32 0x7FFF_FFFFl) +let create_int64_u () = Stdlib_upstream_compatible.Int64_u.of_int64 (Random.int64 0x7FFF_FFFF_FFFF_FFFFL) +let create_nativeint_u () = Stdlib_upstream_compatible.Nativeint_u.of_nativeint (Random.nativeint 0x7FFF_FFFF_FFFF_FFFFn) +let check_gen ~equal ~to_string ~message y1 y2 = + if equal y1 y2 then () else + failwith + (Printf.sprintf "%s: %s <> %s" message (to_string y1) (to_string y2)) + +let check_string = check_gen ~equal:String.equal ~to_string:(fun x -> x) +let check_int = check_gen ~equal:Int.equal ~to_string:Int.to_string +let check_float = + check_gen ~equal:Float.equal ~to_string:Float.to_string +let check_float32 = + check_gen ~equal:Stdlib_stable.Float32.equal ~to_string:Stdlib_stable.Float32.to_string +let check_int32 = + check_gen ~equal:Int32.equal ~to_string:Int32.to_string +let check_int64 = + check_gen ~equal:Int64.equal ~to_string:Int64.to_string + +(* Helper functions for testing polymorphic copying. *) + +let copy_via_weak x = + let weak = Weak.create 1 in + Weak.set weak 0 (Some x); + Weak.get_copy weak 0 |> Option.get + +let copy_via_tag x = + let obj = Obj.repr x in + Obj.with_tag (Obj.tag obj) obj |> Obj.obj;; + +(* Helper functions for testing polymorphic operations. *) +let oc = Out_channel.open_bin "/dev/null" +exception Unexpected_success +type forget = T : _ -> forget + +let expect_failure f = + try f (); raise Unexpected_success with + | Unexpected_success -> assert false + | _ -> () + +let hash_expect_failure x = + expect_failure (fun () -> ignore (Hashtbl.hash x : int)) + +let compare_expect_failure x y = + expect_failure (fun () -> ignore (compare (T x) (T y) : int)); + expect_failure (fun () -> ignore ((T x) = (T y) : bool)) + +let compare_expect_success x y = + ignore (compare (T x) (T y) : int); + ignore ((T x) = (T y) : bool) + +let marshal_expect_failure t = + expect_failure (fun () -> output_value oc t) + +let check_reachable_words expected actual message = + if expected <> actual + then failwith (Printf.sprintf "%s: %d <> %d" message expected actual) +;; + +(* Type declarations *) +type t0 = { mutable float0 : float; mutable float_u1 : float# } +type t1 = { float0 : float; mutable float_u1 : float# } +type t2 = { mutable float0 : float; float_u1 : float# } +type t3 = { float0 : float; float_u1 : float# } +type t4 = { mutable float_u0 : float#; mutable float1 : float } +type t5 = { float_u0 : float#; mutable float1 : float } +type t6 = { mutable float_u0 : float#; float1 : float } +type t7 = { float_u0 : float#; float1 : float } +type t8 = { mutable float0 : float; mutable float_u1 : float#; mutable float_u2 : float# } +type t9 = { float0 : float; mutable float_u1 : float#; mutable float_u2 : float# } +type t10 = { mutable float0 : float; float_u1 : float#; mutable float_u2 : float# } +type t11 = { float0 : float; float_u1 : float#; mutable float_u2 : float# } +type t12 = { mutable float_u0 : float#; mutable float1 : float; mutable float_u2 : float# } +type t13 = { float_u0 : float#; mutable float1 : float; mutable float_u2 : float# } +type t14 = { mutable float0 : float; mutable float1 : float; mutable float_u2 : float# } +type t15 = { float0 : float; mutable float1 : float; mutable float_u2 : float# } +type t16 = { mutable float_u0 : float#; float1 : float; mutable float_u2 : float# } +type t17 = { float_u0 : float#; float1 : float; mutable float_u2 : float# } +type t18 = { mutable float0 : float; float1 : float; mutable float_u2 : float# } +type t19 = { float0 : float; float1 : float; mutable float_u2 : float# } +type t20 = { mutable float0 : float; mutable float_u1 : float#; float_u2 : float# } +type t21 = { float0 : float; mutable float_u1 : float#; float_u2 : float# } +type t22 = { mutable float0 : float; float_u1 : float#; float_u2 : float# } +type t23 = { float0 : float; float_u1 : float#; float_u2 : float# } +type t24 = { mutable float_u0 : float#; mutable float1 : float; float_u2 : float# } +type t25 = { float_u0 : float#; mutable float1 : float; float_u2 : float# } +type t26 = { mutable float0 : float; mutable float1 : float; float_u2 : float# } +type t27 = { float0 : float; mutable float1 : float; float_u2 : float# } +type t28 = { mutable float_u0 : float#; float1 : float; float_u2 : float# } +type t29 = { float_u0 : float#; float1 : float; float_u2 : float# } +type t30 = { mutable float0 : float; float1 : float; float_u2 : float# } +type t31 = { float0 : float; float1 : float; float_u2 : float# } +type t32 = { mutable float_u0 : float#; mutable float_u1 : float#; mutable float2 : float } +type t33 = { float_u0 : float#; mutable float_u1 : float#; mutable float2 : float } +type t34 = { mutable float0 : float; mutable float_u1 : float#; mutable float2 : float } +type t35 = { float0 : float; mutable float_u1 : float#; mutable float2 : float } +type t36 = { mutable float_u0 : float#; float_u1 : float#; mutable float2 : float } +type t37 = { float_u0 : float#; float_u1 : float#; mutable float2 : float } +type t38 = { mutable float0 : float; float_u1 : float#; mutable float2 : float } +type t39 = { float0 : float; float_u1 : float#; mutable float2 : float } +type t40 = { mutable float_u0 : float#; mutable float1 : float; mutable float2 : float } +type t41 = { float_u0 : float#; mutable float1 : float; mutable float2 : float } +type t42 = { mutable float_u0 : float#; float1 : float; mutable float2 : float } +type t43 = { float_u0 : float#; float1 : float; mutable float2 : float } +type t44 = { mutable float_u0 : float#; mutable float_u1 : float#; float2 : float } +type t45 = { float_u0 : float#; mutable float_u1 : float#; float2 : float } +type t46 = { mutable float0 : float; mutable float_u1 : float#; float2 : float } +type t47 = { float0 : float; mutable float_u1 : float#; float2 : float } +type t48 = { mutable float_u0 : float#; float_u1 : float#; float2 : float } +type t49 = { float_u0 : float#; float_u1 : float#; float2 : float } +type t50 = { mutable float0 : float; float_u1 : float#; float2 : float } +type t51 = { float0 : float; float_u1 : float#; float2 : float } +type t52 = { mutable float_u0 : float#; mutable float1 : float; float2 : float } +type t53 = { float_u0 : float#; mutable float1 : float; float2 : float } +type t54 = { mutable float_u0 : float#; float1 : float; float2 : float } +type t55 = { float_u0 : float#; float1 : float; float2 : float } +type t56 = { mutable float0 : float; mutable float_u1 : float#; mutable float_u2 : float#; mutable float_u3 : float# } +type t57 = { float0 : float; mutable float_u1 : float#; mutable float_u2 : float#; mutable float_u3 : float# } +type t58 = { mutable float0 : float; float_u1 : float#; mutable float_u2 : float#; mutable float_u3 : float# } +type t59 = { float0 : float; float_u1 : float#; mutable float_u2 : float#; mutable float_u3 : float# } +type t60 = { mutable float_u0 : float#; mutable float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t61 = { float_u0 : float#; mutable float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t62 = { mutable float0 : float; mutable float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t63 = { float0 : float; mutable float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t64 = { mutable float_u0 : float#; float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t65 = { float_u0 : float#; float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t66 = { mutable float0 : float; float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t67 = { float0 : float; float1 : float; mutable float_u2 : float#; mutable float_u3 : float# } +type t68 = { mutable float0 : float; mutable float_u1 : float#; float_u2 : float#; mutable float_u3 : float# } +type t69 = { float0 : float; mutable float_u1 : float#; float_u2 : float#; mutable float_u3 : float# } +type t70 = { mutable float0 : float; float_u1 : float#; float_u2 : float#; mutable float_u3 : float# } +type t71 = { float0 : float; float_u1 : float#; float_u2 : float#; mutable float_u3 : float# } +type t72 = { mutable float_u0 : float#; mutable float1 : float; float_u2 : float#; mutable float_u3 : float# } +type t73 = { float_u0 : float#; mutable float1 : float; float_u2 : float#; mutable float_u3 : float# } +type t74 = { mutable float0 : float; mutable float1 : float; float_u2 : float#; mutable float_u3 : float# } +type t75 = { mutable str0 : string; mutable float_u1 : float# } +type t76 = { str0 : string; mutable float_u1 : float# } +type t77 = { mutable str0 : string; float_u1 : float# } +type t78 = { mutable float32_u0 : float32# } +type t79 = { str0 : string; float_u1 : float# } +type t80 = { mutable str0 : string; mutable float32_u1 : float32# } +type t81 = { float32_u0 : float32# } +type t82 = { str0 : string; mutable float32_u1 : float32# } +type t83 = { mutable str0 : string; float32_u1 : float32# } +type t84 = { mutable i32_0 : int32# } +type t85 = { mutable str0 : string; mutable str1 : string; mutable float_u2 : float# } +type t86 = { mutable float0 : float; mutable float32_u1 : float32# } +type t87 = { str0 : string; float32_u1 : float32# } +type t88 = { mutable str0 : string; mutable i32_1 : int32# } +type t89 = { i32_0 : int32# } +type t90 = { str0 : string; mutable str1 : string; mutable float_u2 : float# } +type t91 = { mutable str0 : string; mutable str1 : string; float_u2 : float# } +type t92 = { float0 : float; mutable float32_u1 : float32# } +type t93 = { mutable float0 : float; float32_u1 : float32# } +type t94 = { str0 : string; mutable i32_1 : int32# } +type t95 = { mutable str0 : string; i32_1 : int32# } +type t96 = { mutable i64_0 : int64# } +type t97 = { mutable float0 : float; mutable str1 : string; mutable float_u2 : float# } +type t98 = { str0 : string; mutable str1 : string; float_u2 : float# } +type t99 = { mutable str0 : string; mutable str1 : string; mutable float32_u2 : float32# } +type t100 = { float0 : float; float32_u1 : float32# } +type t101 = { mutable float0 : float; mutable i32_1 : int32# } +type t102 = { str0 : string; i32_1 : int32# } +type t103 = { mutable str0 : string; mutable i64_1 : int64# } +type t104 = { i64_0 : int64# } +type t105 = { float0 : float; mutable str1 : string; mutable float_u2 : float# } +type t106 = { mutable float0 : float; mutable str1 : string; float_u2 : float# } +type t107 = { str0 : string; mutable str1 : string; mutable float32_u2 : float32# } +type t108 = { mutable str0 : string; mutable str1 : string; float32_u2 : float32# } +type t109 = { float0 : float; mutable i32_1 : int32# } +type t110 = { mutable float0 : float; i32_1 : int32# } +type t111 = { str0 : string; mutable i64_1 : int64# } +type t112 = { mutable str0 : string; i64_1 : int64# } +type t113 = { mutable n0 : nativeint# } +type t114 = { mutable imm0 : int; mutable str1 : string; mutable float_u2 : float# } +type t115 = { float0 : float; mutable str1 : string; float_u2 : float# } +type t116 = { mutable float0 : float; mutable str1 : string; mutable float32_u2 : float32# } +type t117 = { str0 : string; mutable str1 : string; float32_u2 : float32# } +type t118 = { mutable str0 : string; mutable str1 : string; mutable i32_2 : int32# } +type t119 = { float0 : float; i32_1 : int32# } +type t120 = { mutable float0 : float; mutable i64_1 : int64# } +type t121 = { str0 : string; i64_1 : int64# } +type t122 = { mutable str0 : string; mutable n1 : nativeint# } +type t123 = { n0 : nativeint# } +type t124 = { imm0 : int; mutable str1 : string; mutable float_u2 : float# } +type t125 = { mutable imm0 : int; mutable str1 : string; float_u2 : float# } +type t126 = { float0 : float; mutable str1 : string; mutable float32_u2 : float32# } +type t127 = { mutable float0 : float; mutable str1 : string; float32_u2 : float32# } +type t128 = { str0 : string; mutable str1 : string; mutable i32_2 : int32# } +type t129 = { mutable str0 : string; mutable str1 : string; i32_2 : int32# } +type t130 = { float0 : float; mutable i64_1 : int64# } +type t131 = { mutable float0 : float; i64_1 : int64# } +type t132 = { str0 : string; mutable n1 : nativeint# } +type t133 = { mutable str0 : string; n1 : nativeint# } +type t134 = { mutable float_u0 : float#; mutable imm1 : int } +type t135 = { mutable str0 : string; str1 : string; mutable float_u2 : float# } +type t136 = { imm0 : int; mutable str1 : string; float_u2 : float# } +type t137 = { mutable imm0 : int; mutable str1 : string; mutable float32_u2 : float32# } +type t138 = { float0 : float; mutable str1 : string; float32_u2 : float32# } +type t139 = { mutable float0 : float; mutable str1 : string; mutable i32_2 : int32# } +type t140 = { str0 : string; mutable str1 : string; i32_2 : int32# } +type t141 = { mutable str0 : string; mutable str1 : string; mutable i64_2 : int64# } +type t142 = { float0 : float; i64_1 : int64# } +type t143 = { mutable float0 : float; mutable n1 : nativeint# } +type t144 = { str0 : string; n1 : nativeint# } +type t145 = { mutable str0 : string; mutable float_u1 : float#; mutable imm2 : int } +type t146 = { float_u0 : float#; mutable imm1 : int } +type t147 = { str0 : string; str1 : string; mutable float_u2 : float# } +type t148 = { mutable str0 : string; str1 : string; float_u2 : float# } +type t149 = { imm0 : int; mutable str1 : string; mutable float32_u2 : float32# } +type t150 = { mutable imm0 : int; mutable str1 : string; float32_u2 : float32# } +type t151 = { float0 : float; mutable str1 : string; mutable i32_2 : int32# } +type t152 = { mutable float0 : float; mutable str1 : string; i32_2 : int32# } +type t153 = { str0 : string; mutable str1 : string; mutable i64_2 : int64# } +type t154 = { mutable str0 : string; mutable str1 : string; i64_2 : int64# } +type t155 = { float0 : float; mutable n1 : nativeint# } +type t156 = { mutable float0 : float; n1 : nativeint# } +type t157 = { str0 : string; mutable float_u1 : float#; mutable imm2 : int } +type t158 = { mutable str0 : string; float_u1 : float#; mutable imm2 : int } +type t159 = { mutable float32_u0 : float32#; mutable imm1 : int } +type t160 = { mutable float0 : float; str1 : string; mutable float_u2 : float# } +type t161 = { str0 : string; str1 : string; float_u2 : float# } +type t162 = { mutable str0 : string; str1 : string; mutable float32_u2 : float32# } +type t163 = { imm0 : int; mutable str1 : string; float32_u2 : float32# } +type t164 = { mutable imm0 : int; mutable str1 : string; mutable i32_2 : int32# } +type t165 = { float0 : float; mutable str1 : string; i32_2 : int32# } +type t166 = { mutable float0 : float; mutable str1 : string; mutable i64_2 : int64# } +type t167 = { str0 : string; mutable str1 : string; i64_2 : int64# } +type t168 = { mutable str0 : string; mutable str1 : string; mutable n2 : nativeint# } +type t169 = { float0 : float; n1 : nativeint# } +type t170 = { mutable float0 : float; mutable float_u1 : float#; mutable imm2 : int } +type t171 = { str0 : string; float_u1 : float#; mutable imm2 : int } +type t172 = { mutable str0 : string; mutable float32_u1 : float32#; mutable imm2 : int } +type t173 = { float32_u0 : float32#; mutable imm1 : int } +type t174 = { float0 : float; str1 : string; mutable float_u2 : float# } +type t175 = { mutable float0 : float; str1 : string; float_u2 : float# } +type t176 = { str0 : string; str1 : string; mutable float32_u2 : float32# } +type t177 = { mutable str0 : string; str1 : string; float32_u2 : float32# } +type t178 = { imm0 : int; mutable str1 : string; mutable i32_2 : int32# } +type t179 = { mutable imm0 : int; mutable str1 : string; i32_2 : int32# } +type t180 = { float0 : float; mutable str1 : string; mutable i64_2 : int64# } +type t181 = { mutable float0 : float; mutable str1 : string; i64_2 : int64# } +type t182 = { str0 : string; mutable str1 : string; mutable n2 : nativeint# } +type t183 = { mutable str0 : string; mutable str1 : string; n2 : nativeint# } +type t184 = { float0 : float; mutable float_u1 : float#; mutable imm2 : int } +type t185 = { mutable float0 : float; float_u1 : float#; mutable imm2 : int } +type t186 = { str0 : string; mutable float32_u1 : float32#; mutable imm2 : int } +type t187 = { mutable str0 : string; float32_u1 : float32#; mutable imm2 : int } +type t188 = { mutable i32_0 : int32#; mutable imm1 : int } +type t189 = { mutable imm0 : int; str1 : string; mutable float_u2 : float# } +type t190 = { float0 : float; str1 : string; float_u2 : float# } +type t191 = { mutable float0 : float; str1 : string; mutable float32_u2 : float32# } +type t192 = { str0 : string; str1 : string; float32_u2 : float32# } +type t193 = { mutable str0 : string; str1 : string; mutable i32_2 : int32# } +type t194 = { imm0 : int; mutable str1 : string; i32_2 : int32# } +type t195 = { mutable imm0 : int; mutable str1 : string; mutable i64_2 : int64# } +type t196 = { float0 : float; mutable str1 : string; i64_2 : int64# } +type t197 = { mutable float0 : float; mutable str1 : string; mutable n2 : nativeint# } +type t198 = { str0 : string; mutable str1 : string; n2 : nativeint# } +type t199 = { mutable str0 : string; mutable str1 : string; mutable float_u2 : float#; mutable imm3 : int } +type t200 = { float0 : float; float_u1 : float#; mutable imm2 : int } +type t201 = { mutable float0 : float; mutable float32_u1 : float32#; mutable imm2 : int } +type t202 = { str0 : string; float32_u1 : float32#; mutable imm2 : int } +type t203 = { mutable str0 : string; mutable i32_1 : int32#; mutable imm2 : int } +type t204 = { i32_0 : int32#; mutable imm1 : int } +type t205 = { imm0 : int; str1 : string; mutable float_u2 : float# } +type t206 = { mutable imm0 : int; str1 : string; float_u2 : float# } +type t207 = { float0 : float; str1 : string; mutable float32_u2 : float32# } +type t208 = { mutable float0 : float; str1 : string; float32_u2 : float32# } +type t209 = { str0 : string; str1 : string; mutable i32_2 : int32# } +type t210 = { mutable str0 : string; str1 : string; i32_2 : int32# } +type t211 = { imm0 : int; mutable str1 : string; mutable i64_2 : int64# } +type t212 = { mutable imm0 : int; mutable str1 : string; i64_2 : int64# } +type t213 = { float0 : float; mutable str1 : string; mutable n2 : nativeint# } +type t214 = { mutable float0 : float; mutable str1 : string; n2 : nativeint# } +type t215 = { str0 : string; mutable str1 : string; mutable float_u2 : float#; mutable imm3 : int } +type t216 = { mutable str0 : string; mutable str1 : string; float_u2 : float#; mutable imm3 : int } +type t217 = { float0 : float; mutable float32_u1 : float32#; mutable imm2 : int } +type t218 = { mutable float0 : float; float32_u1 : float32#; mutable imm2 : int } +type t219 = { str0 : string; mutable i32_1 : int32#; mutable imm2 : int } +type t220 = { mutable str0 : string; i32_1 : int32#; mutable imm2 : int } +type t221 = { mutable i64_0 : int64#; mutable imm1 : int } +type t222 = { mutable str0 : string; mutable float1 : float; mutable float_u2 : float# } +type t223 = { imm0 : int; str1 : string; float_u2 : float# } +type t224 = { mutable imm0 : int; str1 : string; mutable float32_u2 : float32# } +type t225 = { float0 : float; str1 : string; float32_u2 : float32# } +type t226 = { mutable float0 : float; str1 : string; mutable i32_2 : int32# } +type t227 = { str0 : string; str1 : string; i32_2 : int32# } +type t228 = { mutable str0 : string; str1 : string; mutable i64_2 : int64# } +type t229 = { imm0 : int; mutable str1 : string; i64_2 : int64# } +type t230 = { mutable imm0 : int; mutable str1 : string; mutable n2 : nativeint# } +type t231 = { float0 : float; mutable str1 : string; n2 : nativeint# } +type t232 = { mutable float0 : float; mutable str1 : string; mutable float_u2 : float#; mutable imm3 : int } +type t233 = { str0 : string; mutable str1 : string; float_u2 : float#; mutable imm3 : int } +type t234 = { mutable str0 : string; mutable str1 : string; mutable float32_u2 : float32#; mutable imm3 : int } +type t235 = { float0 : float; float32_u1 : float32#; mutable imm2 : int } +type t236 = { mutable float0 : float; mutable i32_1 : int32#; mutable imm2 : int } +type t237 = { str0 : string; i32_1 : int32#; mutable imm2 : int } +type t238 = { mutable str0 : string; mutable i64_1 : int64#; mutable imm2 : int } +type t239 = { i64_0 : int64#; mutable imm1 : int } +type t240 = { str0 : string; mutable float1 : float; mutable float_u2 : float# } +type t241 = { mutable str0 : string; mutable float1 : float; float_u2 : float# } +type t242 = { imm0 : int; str1 : string; mutable float32_u2 : float32# } +type t243 = { mutable imm0 : int; str1 : string; float32_u2 : float32# } +type t244 = { float0 : float; str1 : string; mutable i32_2 : int32# } +type t245 = { mutable float0 : float; str1 : string; i32_2 : int32# } +type t246 = { str0 : string; str1 : string; mutable i64_2 : int64# } +type t247 = { mutable str0 : string; str1 : string; i64_2 : int64# } +type t248 = { imm0 : int; mutable str1 : string; mutable n2 : nativeint# } +type t249 = { mutable imm0 : int; mutable str1 : string; n2 : nativeint# } +type t250 = { float0 : float; mutable str1 : string; mutable float_u2 : float#; mutable imm3 : int } +type t251 = { mutable float0 : float; mutable str1 : string; float_u2 : float#; mutable imm3 : int } +type t252 = { str0 : string; mutable str1 : string; mutable float32_u2 : float32#; mutable imm3 : int } +type t253 = { mutable str0 : string; mutable str1 : string; float32_u2 : float32#; mutable imm3 : int } +type t254 = { float0 : float; mutable i32_1 : int32#; mutable imm2 : int } +type t255 = { mutable float0 : float; i32_1 : int32#; mutable imm2 : int } +type t256 = { str0 : string; mutable i64_1 : int64#; mutable imm2 : int } +type t257 = { mutable str0 : string; i64_1 : int64#; mutable imm2 : int } +type t258 = { mutable n0 : nativeint#; mutable imm1 : int } +type t259 = { str0 : string; mutable float1 : float; float_u2 : float# } +type t260 = { mutable str0 : string; mutable float1 : float; mutable float32_u2 : float32# } +type t261 = { imm0 : int; str1 : string; float32_u2 : float32# } +type t262 = { mutable imm0 : int; str1 : string; mutable i32_2 : int32# } +type t263 = { float0 : float; str1 : string; i32_2 : int32# } +type t264 = { mutable float0 : float; str1 : string; mutable i64_2 : int64# } +type t265 = { str0 : string; str1 : string; i64_2 : int64# } +type t266 = { mutable str0 : string; str1 : string; mutable n2 : nativeint# } +type t267 = { imm0 : int; mutable str1 : string; n2 : nativeint# } +type t268 = { mutable imm0 : int; mutable str1 : string; mutable float_u2 : float#; mutable imm3 : int } +type t269 = { float0 : float; mutable str1 : string; float_u2 : float#; mutable imm3 : int } +type t270 = { mutable float0 : float; mutable str1 : string; mutable float32_u2 : float32#; mutable imm3 : int } +type t271 = { str0 : string; mutable str1 : string; float32_u2 : float32#; mutable imm3 : int } +type t272 = { mutable str0 : string; mutable str1 : string; mutable i32_2 : int32#; mutable imm3 : int } +type t273 = { float0 : float; i32_1 : int32#; mutable imm2 : int } +type t274 = { mutable float0 : float; mutable i64_1 : int64#; mutable imm2 : int } +type t275 = { str0 : string; i64_1 : int64#; mutable imm2 : int } +type t276 = { mutable str0 : string; mutable n1 : nativeint#; mutable imm2 : int } +type t277 = { n0 : nativeint#; mutable imm1 : int } +type t278 = { str0 : string; mutable float1 : float; mutable float32_u2 : float32# } +type t279 = { mutable str0 : string; mutable float1 : float; float32_u2 : float32# } +type t280 = { imm0 : int; str1 : string; mutable i32_2 : int32# } +type t281 = { mutable imm0 : int; str1 : string; i32_2 : int32# } +type t282 = { float0 : float; str1 : string; mutable i64_2 : int64# } +type t283 = { mutable float0 : float; str1 : string; i64_2 : int64# } +type t284 = { str0 : string; str1 : string; mutable n2 : nativeint# } +type t285 = { mutable str0 : string; str1 : string; n2 : nativeint# } +type t286 = { imm0 : int; mutable str1 : string; mutable float_u2 : float#; mutable imm3 : int } +type t287 = { mutable imm0 : int; mutable str1 : string; float_u2 : float#; mutable imm3 : int } +type t288 = { float0 : float; mutable str1 : string; mutable float32_u2 : float32#; mutable imm3 : int } +type t289 = { mutable float0 : float; mutable str1 : string; float32_u2 : float32#; mutable imm3 : int } +type t290 = { str0 : string; mutable str1 : string; mutable i32_2 : int32#; mutable imm3 : int } +type t291 = { mutable str0 : string; mutable str1 : string; i32_2 : int32#; mutable imm3 : int } +type t292 = { float0 : float; mutable i64_1 : int64#; mutable imm2 : int } +type t293 = { mutable float0 : float; i64_1 : int64#; mutable imm2 : int } +type t294 = { str0 : string; mutable n1 : nativeint#; mutable imm2 : int } +type t295 = { mutable str0 : string; n1 : nativeint#; mutable imm2 : int } +type t296 = { mutable float_u0 : float#; imm1 : int } +type t297 = { mutable imm0 : int; mutable float1 : float; mutable float_u2 : float# } +type t298 = { mutable float0 : float; mutable float1 : float; mutable float32_u2 : float32# } +type t299 = { str0 : string; mutable float1 : float; float32_u2 : float32# } +type t300 = + | A of float# +type t301 = + | A of float# + | B of float# +type t302 = + | A of { mutable float_u0 : float# } +type t303 = + | A of float# + | B of float# + | C of float# +type t304 = + | A of { mutable float_u0 : float# } + | B of float# +type t305 = + | A of string * float# +type t306 = + | A of float# + | B of { mutable float_u0 : float# } +type t307 = + | A of { mutable float_u0 : float# } + | B of float# + | C of float# +type t308 = + | A of string * float# + | B of float# +type t309 = + | A of { mutable str0 : string; mutable float_u1 : float# } +type t310 = + | A of float# + | B of float# + | C of float# + | D of float# +type t311 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } +type t312 = + | A of string * float# + | B of float# + | C of float# +type t313 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# +type t314 = + | A of float32# +type t315 = + | A of float# + | B of { mutable float_u0 : float# } + | C of float# +type t316 = + | A of { mutable float_u0 : float# } + | B of float# + | C of float# + | D of float# +type t317 = + | A of string * float# + | B of { mutable float_u0 : float# } +type t318 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# +type t319 = + | A of float32# + | B of float# +type t320 = + | A of { float_u0 : float# } +type t321 = + | A of float# + | B of string * float# +type t322 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t323 = + | A of string * float# + | B of float# + | C of float# + | D of float# +type t324 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } +type t325 = + | A of float32# + | B of float# + | C of float# +type t326 = + | A of { float_u0 : float# } + | B of float# +type t327 = + | A of float * float# +type t328 = + | A of float# + | B of float# + | C of { mutable float_u0 : float# } +type t329 = + | A of { mutable float_u0 : float# } + | B of string * float# +type t330 = + | A of string * float# + | B of { mutable float_u0 : float# } + | C of float# +type t331 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# + | D of float# +type t332 = + | A of float32# + | B of { mutable float_u0 : float# } +type t333 = + | A of { float_u0 : float# } + | B of float# + | C of float# +type t334 = + | A of float * float# + | B of float# +type t335 = + | A of { str0 : string; mutable float_u1 : float# } +type t336 = + | A of float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t337 = + | A of { mutable float_u0 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t338 = + | A of string * float# + | B of string * float# +type t339 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t340 = + | A of float32# + | B of float# + | C of float# + | D of float# +type t341 = + | A of { float_u0 : float# } + | B of { mutable float_u0 : float# } +type t342 = + | A of float * float# + | B of float# + | C of float# +type t343 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# +type t344 = + | A of string * float32# +type t345 = + | A of float# + | B of string * float# + | C of float# +type t346 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t347 = + | A of string * float# + | B of float# + | C of { mutable float_u0 : float# } +type t348 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of string * float# +type t349 = + | A of float32# + | B of { mutable float_u0 : float# } + | C of float# +type t350 = + | A of { float_u0 : float# } + | B of float# + | C of float# + | D of float# +type t351 = + | A of float * float# + | B of { mutable float_u0 : float# } +type t352 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# +type t353 = + | A of string * float32# + | B of float# +type t354 = + | A of { mutable str0 : string; float_u1 : float# } +type t355 = + | A of float# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t356 = + | A of { mutable float_u0 : float# } + | B of string * float# + | C of float# +type t357 = + | A of string * float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t358 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t359 = + | A of float32# + | B of string * float# +type t360 = + | A of { float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t361 = + | A of float * float# + | B of float# + | C of float# + | D of float# +type t362 = + | A of { str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } +type t363 = + | A of string * float32# + | B of float# + | C of float# +type t364 = + | A of { mutable str0 : string; float_u1 : float# } + | B of float# +type t365 = + | A of int32# +type t366 = + | A of float# + | B of float# + | C of float# + | D of float# + | E of float# +type t367 = + | A of { mutable float_u0 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t368 = + | A of string * float# + | B of string * float# + | C of float# +type t369 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t370 = + | A of float32# + | B of float# + | C of { mutable float_u0 : float# } +type t371 = + | A of { float_u0 : float# } + | B of string * float# +type t372 = + | A of float * float# + | B of { mutable float_u0 : float# } + | C of float# +type t373 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# + | D of float# +type t374 = + | A of string * float32# + | B of { mutable float_u0 : float# } +type t375 = + | A of { mutable str0 : string; float_u1 : float# } + | B of float# + | C of float# +type t376 = + | A of int32# + | B of float# +type t377 = + | A of { mutable float32_u0 : float32# } +type t378 = + | A of float# + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t379 = + | A of { mutable float_u0 : float# } + | B of float# + | C of float# + | D of float# + | E of float# +type t380 = + | A of string * float# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t381 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of string * float# + | C of float# +type t382 = + | A of float32# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t383 = + | A of { float_u0 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t384 = + | A of float * float# + | B of string * float# +type t385 = + | A of { str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t386 = + | A of string * float32# + | B of float# + | C of float# + | D of float# +type t387 = + | A of { mutable str0 : string; float_u1 : float# } + | B of { mutable float_u0 : float# } +type t388 = + | A of int32# + | B of float# + | C of float# +type t389 = + | A of { mutable float32_u0 : float32# } + | B of float# +type t390 = + | A of string * string * float# +type t391 = + | A of float# + | B of string * float# + | C of float# + | D of float# +type t392 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t393 = + | A of string * float# + | B of float# + | C of float# + | D of float# + | E of float# +type t394 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t395 = + | A of float32# + | B of string * float# + | C of float# +type t396 = + | A of { float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t397 = + | A of float * float# + | B of float# + | C of { mutable float_u0 : float# } +type t398 = + | A of { str0 : string; mutable float_u1 : float# } + | B of string * float# +type t399 = + | A of string * float32# + | B of { mutable float_u0 : float# } + | C of float# +type t400 = + | A of { mutable str0 : string; float_u1 : float# } + | B of float# + | C of float# + | D of float# +type t401 = + | A of int32# + | B of { mutable float_u0 : float# } +type t402 = + | A of { mutable float32_u0 : float32# } + | B of float# + | C of float# +type t403 = + | A of string * string * float# + | B of float# +type t404 = + | A of { mutable float0 : float; mutable float_u1 : float# } +type t405 = + | A of float# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t406 = + | A of { mutable float_u0 : float# } + | B of string * float# + | C of float# + | D of float# +type t407 = + | A of string * float# + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t408 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# + | D of float# + | E of float# +type t409 = + | A of float32# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t410 = + | A of { float_u0 : float# } + | B of string * float# + | C of float# +type t411 = + | A of float * float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t412 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t413 = + | A of string * float32# + | B of string * float# +type t414 = + | A of { mutable str0 : string; float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t415 = + | A of int32# + | B of float# + | C of float# + | D of float# +type t416 = + | A of { mutable float32_u0 : float32# } + | B of { mutable float_u0 : float# } +type t417 = + | A of string * string * float# + | B of float# + | C of float# +type t418 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of float# +type t419 = + | A of float * float32# +type t420 = + | A of float# + | B of float32# +type t421 = + | A of { mutable float_u0 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t422 = + | A of string * float# + | B of string * float# + | C of float# + | D of float# +type t423 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t424 = + | A of float32# + | B of float# + | C of float# + | D of float# + | E of float# +type t425 = + | A of { float_u0 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t426 = + | A of float * float# + | B of string * float# + | C of float# +type t427 = + | A of { str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t428 = + | A of string * float32# + | B of float# + | C of { mutable float_u0 : float# } +type t429 = + | A of { mutable str0 : string; float_u1 : float# } + | B of string * float# +type t430 = + | A of int32# + | B of { mutable float_u0 : float# } + | C of float# +type t431 = + | A of { mutable float32_u0 : float32# } + | B of float# + | C of float# + | D of float# +type t432 = + | A of string * string * float# + | B of { mutable float_u0 : float# } +type t433 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of float# + | C of float# +type t434 = + | A of float * float32# + | B of float# +type t435 = + | A of { str0 : string; float_u1 : float# } +type t436 = + | A of float# + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t437 = + | A of { mutable float_u0 : float# } + | B of float32# +type t438 = + | A of string * float# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t439 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of string * float# + | C of float# + | D of float# +type t440 = + | A of float32# + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t441 = + | A of { float_u0 : float# } + | B of float# + | C of float# + | D of float# + | E of float# +type t442 = + | A of float * float# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t443 = + | A of { str0 : string; mutable float_u1 : float# } + | B of string * float# + | C of float# +type t444 = + | A of string * float32# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t445 = + | A of { mutable str0 : string; float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t446 = + | A of int32# + | B of string * float# +type t447 = + | A of { mutable float32_u0 : float32# } + | B of { mutable float_u0 : float# } + | C of float# +type t448 = + | A of string * string * float# + | B of float# + | C of float# + | D of float# +type t449 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } +type t450 = + | A of float * float32# + | B of float# + | C of float# +type t451 = + | A of { str0 : string; float_u1 : float# } + | B of float# +type t452 = + | A of string * int32# +type t453 = + | A of float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# + | E of float# +type t454 = + | A of { mutable float_u0 : float# } + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t455 = + | A of string * float# + | B of float32# +type t456 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t457 = + | A of float32# + | B of string * float# + | C of float# + | D of float# +type t458 = + | A of { float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t459 = + | A of float * float# + | B of float# + | C of float# + | D of float# + | E of float# +type t460 = + | A of { str0 : string; mutable float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t461 = + | A of string * float32# + | B of string * float# + | C of float# +type t462 = + | A of { mutable str0 : string; float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t463 = + | A of int32# + | B of float# + | C of { mutable float_u0 : float# } +type t464 = + | A of { mutable float32_u0 : float32# } + | B of string * float# +type t465 = + | A of string * string * float# + | B of { mutable float_u0 : float# } + | C of float# +type t466 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of float# + | C of float# + | D of float# +type t467 = + | A of float * float32# + | B of { mutable float_u0 : float# } +type t468 = + | A of { str0 : string; float_u1 : float# } + | B of float# + | C of float# +type t469 = + | A of string * int32# + | B of float# +type t470 = + | A of { mutable str0 : string; mutable float32_u1 : float32# } +type t471 = + | A of float# + | B of string * float# + | C of { mutable float_u0 : float# } +type t472 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# + | E of float# +type t473 = + | A of string * float# + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t474 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float32# +type t475 = + | A of float32# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t476 = + | A of { float_u0 : float# } + | B of string * float# + | C of float# + | D of float# +type t477 = + | A of float * float# + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t478 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# + | D of float# + | E of float# +type t479 = + | A of string * float32# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t480 = + | A of { mutable str0 : string; float_u1 : float# } + | B of string * float# + | C of float# +type t481 = + | A of int32# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t482 = + | A of { mutable float32_u0 : float32# } + | B of float# + | C of { mutable float_u0 : float# } +type t483 = + | A of string * string * float# + | B of string * float# +type t484 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t485 = + | A of float * float32# + | B of float# + | C of float# + | D of float# +type t486 = + | A of { str0 : string; float_u1 : float# } + | B of { mutable float_u0 : float# } +type t487 = + | A of string * int32# + | B of float# + | C of float# +type t488 = + | A of { mutable str0 : string; mutable float32_u1 : float32# } + | B of float# +type t489 = + | A of int64# +type t490 = + | A of float# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# + | D of float# +type t491 = + | A of { mutable float_u0 : float# } + | B of string * float# + | C of { mutable float_u0 : float# } +type t492 = + | A of string * float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# + | E of float# +type t493 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t494 = + | A of float32# + | B of float32# +type t495 = + | A of { float_u0 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t496 = + | A of float * float# + | B of string * float# + | C of float# + | D of float# +type t497 = + | A of { str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t498 = + | A of string * float32# + | B of float# + | C of float# + | D of float# + | E of float# +type t499 = + | A of { mutable str0 : string; float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t500 = + | A of int32# + | B of string * float# + | C of float# +type t501 = + | A of { mutable float32_u0 : float32# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t502 = + | A of string * string * float# + | B of float# + | C of { mutable float_u0 : float# } +type t503 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of string * float# +type t504 = + | A of float * float32# + | B of { mutable float_u0 : float# } + | C of float# +type t505 = + | A of { str0 : string; float_u1 : float# } + | B of float# + | C of float# + | D of float# +type t506 = + | A of string * int32# + | B of { mutable float_u0 : float# } +type t507 = + | A of { mutable str0 : string; mutable float32_u1 : float32# } + | B of float# + | C of float# +type t508 = + | A of int64# + | B of float# +type t509 = + | A of { float32_u0 : float32# } +type t510 = + | A of float# + | B of float32# + | C of float# +type t511 = + | A of { mutable float_u0 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# + | D of float# +type t512 = + | A of string * float# + | B of string * float# + | C of { mutable float_u0 : float# } +type t513 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# + | E of float# +type t514 = + | A of float32# + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t515 = + | A of { float_u0 : float# } + | B of float32# +type t516 = + | A of float * float# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t517 = + | A of { str0 : string; mutable float_u1 : float# } + | B of string * float# + | C of float# + | D of float# +type t518 = + | A of string * float32# + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t519 = + | A of { mutable str0 : string; float_u1 : float# } + | B of float# + | C of float# + | D of float# + | E of float# +type t520 = + | A of int32# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t521 = + | A of { mutable float32_u0 : float32# } + | B of string * float# + | C of float# +type t522 = + | A of string * string * float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t523 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t524 = + | A of float * float32# + | B of string * float# +type t525 = + | A of { str0 : string; float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t526 = + | A of string * int32# + | B of float# + | C of float# + | D of float# +type t527 = + | A of { mutable str0 : string; mutable float32_u1 : float32# } + | B of { mutable float_u0 : float# } +type t528 = + | A of int64# + | B of float# + | C of float# +type t529 = + | A of { float32_u0 : float32# } + | B of float# +type t530 = + | A of float * string * float# +type t531 = + | A of float# + | B of { float_u0 : float# } +type t532 = + | A of { mutable float_u0 : float# } + | B of float32# + | C of float# +type t533 = + | A of string * float# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# + | D of float# +type t534 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of string * float# + | C of { mutable float_u0 : float# } +type t535 = + | A of float32# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# + | E of float# +type t536 = + | A of { float_u0 : float# } + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t537 = + | A of float * float# + | B of float32# +type t538 = + | A of { str0 : string; mutable float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t539 = + | A of string * float32# + | B of string * float# + | C of float# + | D of float# +type t540 = + | A of { mutable str0 : string; float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t541 = + | A of int32# + | B of float# + | C of float# + | D of float# + | E of float# +type t542 = + | A of { mutable float32_u0 : float32# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t543 = + | A of string * string * float# + | B of string * float# + | C of float# +type t544 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t545 = + | A of float * float32# + | B of float# + | C of { mutable float_u0 : float# } +type t546 = + | A of { str0 : string; float_u1 : float# } + | B of string * float# +type t547 = + | A of string * int32# + | B of { mutable float_u0 : float# } + | C of float# +type t548 = + | A of { mutable str0 : string; mutable float32_u1 : float32# } + | B of float# + | C of float# + | D of float# +type t549 = + | A of int64# + | B of { mutable float_u0 : float# } +type t550 = + | A of { float32_u0 : float32# } + | B of float# + | C of float# +type t551 = + | A of float * string * float# + | B of float# +type t552 = + | A of { float0 : float; mutable float_u1 : float# } +type t553 = + | A of float# + | B of float# + | C of string * float# +type t554 = + | A of { mutable float_u0 : float# } + | B of { float_u0 : float# } +type t555 = + | A of string * float# + | B of float32# + | C of float# +type t556 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# + | D of float# +type t557 = + | A of float32# + | B of string * float# + | C of { mutable float_u0 : float# } +type t558 = + | A of { float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# + | E of float# +type t559 = + | A of float * float# + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t560 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float32# +type t561 = + | A of string * float32# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t562 = + | A of { mutable str0 : string; float_u1 : float# } + | B of string * float# + | C of float# + | D of float# +type t563 = + | A of int32# + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t564 = + | A of { mutable float32_u0 : float32# } + | B of float# + | C of float# + | D of float# + | E of float# +type t565 = + | A of string * string * float# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t566 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of string * float# + | C of float# +type t567 = + | A of float * float32# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t568 = + | A of { str0 : string; float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t569 = + | A of string * int32# + | B of string * float# +type t570 = + | A of { mutable str0 : string; mutable float32_u1 : float32# } + | B of { mutable float_u0 : float# } + | C of float# +type t571 = + | A of int64# + | B of float# + | C of float# + | D of float# +type t572 = + | A of { float32_u0 : float32# } + | B of { mutable float_u0 : float# } +type t573 = + | A of float * string * float# + | B of float# + | C of float# +type t574 = + | A of { float0 : float; mutable float_u1 : float# } + | B of float# +type t575 = + | A of string * string * float32# +type t576 = + | A of float# + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } + | D of float# +type t577 = + | A of { mutable float_u0 : float# } + | B of float# + | C of string * float# +type t578 = + | A of string * float# + | B of { float_u0 : float# } +type t579 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float32# + | C of float# +type t580 = + | A of float32# + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# + | D of float# +type t581 = + | A of { float_u0 : float# } + | B of string * float# + | C of { mutable float_u0 : float# } +type t582 = + | A of float * float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# + | E of float# +type t583 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } + | D of float# +type t584 = + | A of string * float32# + | B of float32# +type t585 = + | A of { mutable str0 : string; float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } + | C of float# +type t586 = + | A of int32# + | B of string * float# + | C of float# + | D of float# +type t587 = + | A of { mutable float32_u0 : float32# } + | B of { mutable float_u0 : float# } + | C of { mutable float_u0 : float# } +type t588 = + | A of string * string * float# + | B of float# + | C of float# + | D of float# + | E of float# +type t589 = + | A of { mutable float0 : float; mutable float_u1 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t590 = + | A of float * float32# + | B of string * float# + | C of float# +type t591 = + | A of { str0 : string; float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t592 = + | A of string * int32# + | B of float# + | C of { mutable float_u0 : float# } +type t593 = + | A of { mutable str0 : string; mutable float32_u1 : float32# } + | B of string * float# +type t594 = + | A of int64# + | B of { mutable float_u0 : float# } + | C of float# +type t595 = + | A of { float32_u0 : float32# } + | B of float# + | C of float# + | D of float# +type t596 = + | A of float * string * float# + | B of { mutable float_u0 : float# } +type t597 = + | A of { float0 : float; mutable float_u1 : float# } + | B of float# + | C of float# +type t598 = + | A of string * string * float32# + | B of float# +type t599 = + | A of { mutable float0 : float; float_u1 : float# } + +external opaque_ignore : ('a [@local_opt]) -> unit = "%opaque" + +let[@opaque] run () = +(* Let declarations *) +print_endline "Creating values"; +let t0 : t0 = { float0 = create_float (); float_u1 = create_float_u () } in +let t1 : t1 = { float0 = create_float (); float_u1 = create_float_u () } in +let t2 : t2 = { float0 = create_float (); float_u1 = create_float_u () } in +let t3 : t3 = { float0 = create_float (); float_u1 = create_float_u () } in +let t4 : t4 = { float_u0 = create_float_u (); float1 = create_float () } in +let t5 : t5 = { float_u0 = create_float_u (); float1 = create_float () } in +let t6 : t6 = { float_u0 = create_float_u (); float1 = create_float () } in +let t7 : t7 = { float_u0 = create_float_u (); float1 = create_float () } in +let t8 : t8 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t9 : t9 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t10 : t10 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t11 : t11 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t12 : t12 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t13 : t13 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t14 : t14 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t15 : t15 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t16 : t16 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t17 : t17 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t18 : t18 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t19 : t19 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t20 : t20 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t21 : t21 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t22 : t22 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t23 : t23 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t24 : t24 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t25 : t25 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t26 : t26 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t27 : t27 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t28 : t28 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t29 : t29 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t30 : t30 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t31 : t31 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t32 : t32 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t33 : t33 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t34 : t34 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t35 : t35 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t36 : t36 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t37 : t37 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t38 : t38 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t39 : t39 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t40 : t40 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t41 : t41 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t42 : t42 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t43 : t43 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t44 : t44 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t45 : t45 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t46 : t46 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t47 : t47 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t48 : t48 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t49 : t49 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in +let t50 : t50 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t51 : t51 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in +let t52 : t52 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t53 : t53 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t54 : t54 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t55 : t55 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in +let t56 : t56 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t57 : t57 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t58 : t58 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t59 : t59 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t60 : t60 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t61 : t61 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t62 : t62 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t63 : t63 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t64 : t64 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t65 : t65 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t66 : t66 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t67 : t67 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t68 : t68 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t69 : t69 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t70 : t70 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t71 : t71 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t72 : t72 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t73 : t73 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t74 : t74 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in +let t75 : t75 = { str0 = create_string (); float_u1 = create_float_u () } in +let t76 : t76 = { str0 = create_string (); float_u1 = create_float_u () } in +let t77 : t77 = { str0 = create_string (); float_u1 = create_float_u () } in +let t78 : t78 = { float32_u0 = create_float32_u () } in +let t79 : t79 = { str0 = create_string (); float_u1 = create_float_u () } in +let t80 : t80 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t81 : t81 = { float32_u0 = create_float32_u () } in +let t82 : t82 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t83 : t83 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t84 : t84 = { i32_0 = create_int32_u () } in +let t85 : t85 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t86 : t86 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t87 : t87 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t88 : t88 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t89 : t89 = { i32_0 = create_int32_u () } in +let t90 : t90 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t91 : t91 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t92 : t92 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t93 : t93 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t94 : t94 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t95 : t95 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t96 : t96 = { i64_0 = create_int64_u () } in +let t97 : t97 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t98 : t98 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t99 : t99 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t100 : t100 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t101 : t101 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t102 : t102 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t103 : t103 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t104 : t104 = { i64_0 = create_int64_u () } in +let t105 : t105 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t106 : t106 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t107 : t107 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t108 : t108 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t109 : t109 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t110 : t110 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t111 : t111 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t112 : t112 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t113 : t113 = { n0 = create_nativeint_u () } in +let t114 : t114 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t115 : t115 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t116 : t116 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t117 : t117 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t118 : t118 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t119 : t119 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t120 : t120 = { float0 = create_float (); i64_1 = create_int64_u () } in +let t121 : t121 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t122 : t122 = { str0 = create_string (); n1 = create_nativeint_u () } in +let t123 : t123 = { n0 = create_nativeint_u () } in +let t124 : t124 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t125 : t125 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t126 : t126 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t127 : t127 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t128 : t128 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t129 : t129 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t130 : t130 = { float0 = create_float (); i64_1 = create_int64_u () } in +let t131 : t131 = { float0 = create_float (); i64_1 = create_int64_u () } in +let t132 : t132 = { str0 = create_string (); n1 = create_nativeint_u () } in +let t133 : t133 = { str0 = create_string (); n1 = create_nativeint_u () } in +let t134 : t134 = { float_u0 = create_float_u (); imm1 = create_int () } in +let t135 : t135 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t136 : t136 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t137 : t137 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t138 : t138 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t139 : t139 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t140 : t140 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t141 : t141 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t142 : t142 = { float0 = create_float (); i64_1 = create_int64_u () } in +let t143 : t143 = { float0 = create_float (); n1 = create_nativeint_u () } in +let t144 : t144 = { str0 = create_string (); n1 = create_nativeint_u () } in +let t145 : t145 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in +let t146 : t146 = { float_u0 = create_float_u (); imm1 = create_int () } in +let t147 : t147 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t148 : t148 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t149 : t149 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t150 : t150 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t151 : t151 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t152 : t152 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t153 : t153 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t154 : t154 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t155 : t155 = { float0 = create_float (); n1 = create_nativeint_u () } in +let t156 : t156 = { float0 = create_float (); n1 = create_nativeint_u () } in +let t157 : t157 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in +let t158 : t158 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in +let t159 : t159 = { float32_u0 = create_float32_u (); imm1 = create_int () } in +let t160 : t160 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t161 : t161 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t162 : t162 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t163 : t163 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t164 : t164 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in +let t165 : t165 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t166 : t166 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in +let t167 : t167 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t168 : t168 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in +let t169 : t169 = { float0 = create_float (); n1 = create_nativeint_u () } in +let t170 : t170 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in +let t171 : t171 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in +let t172 : t172 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t173 : t173 = { float32_u0 = create_float32_u (); imm1 = create_int () } in +let t174 : t174 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t175 : t175 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t176 : t176 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t177 : t177 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t178 : t178 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in +let t179 : t179 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in +let t180 : t180 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in +let t181 : t181 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in +let t182 : t182 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in +let t183 : t183 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in +let t184 : t184 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in +let t185 : t185 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in +let t186 : t186 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t187 : t187 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t188 : t188 = { i32_0 = create_int32_u (); imm1 = create_int () } in +let t189 : t189 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t190 : t190 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t191 : t191 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t192 : t192 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t193 : t193 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t194 : t194 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in +let t195 : t195 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in +let t196 : t196 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in +let t197 : t197 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in +let t198 : t198 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in +let t199 : t199 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t200 : t200 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in +let t201 : t201 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t202 : t202 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t203 : t203 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t204 : t204 = { i32_0 = create_int32_u (); imm1 = create_int () } in +let t205 : t205 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t206 : t206 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t207 : t207 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t208 : t208 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t209 : t209 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t210 : t210 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t211 : t211 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in +let t212 : t212 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in +let t213 : t213 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in +let t214 : t214 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in +let t215 : t215 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t216 : t216 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t217 : t217 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t218 : t218 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t219 : t219 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t220 : t220 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t221 : t221 = { i64_0 = create_int64_u (); imm1 = create_int () } in +let t222 : t222 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in +let t223 : t223 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t224 : t224 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t225 : t225 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t226 : t226 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t227 : t227 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t228 : t228 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t229 : t229 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in +let t230 : t230 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in +let t231 : t231 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in +let t232 : t232 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t233 : t233 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t234 : t234 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in +let t235 : t235 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in +let t236 : t236 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t237 : t237 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t238 : t238 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in +let t239 : t239 = { i64_0 = create_int64_u (); imm1 = create_int () } in +let t240 : t240 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in +let t241 : t241 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in +let t242 : t242 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t243 : t243 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t244 : t244 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t245 : t245 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t246 : t246 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t247 : t247 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t248 : t248 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in +let t249 : t249 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in +let t250 : t250 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t251 : t251 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t252 : t252 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in +let t253 : t253 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in +let t254 : t254 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t255 : t255 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t256 : t256 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in +let t257 : t257 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in +let t258 : t258 = { n0 = create_nativeint_u (); imm1 = create_int () } in +let t259 : t259 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in +let t260 : t260 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in +let t261 : t261 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t262 : t262 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in +let t263 : t263 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in +let t264 : t264 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in +let t265 : t265 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in +let t266 : t266 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in +let t267 : t267 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in +let t268 : t268 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t269 : t269 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t270 : t270 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in +let t271 : t271 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in +let t272 : t272 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u (); imm3 = create_int () } in +let t273 : t273 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in +let t274 : t274 = { float0 = create_float (); i64_1 = create_int64_u (); imm2 = create_int () } in +let t275 : t275 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in +let t276 : t276 = { str0 = create_string (); n1 = create_nativeint_u (); imm2 = create_int () } in +let t277 : t277 = { n0 = create_nativeint_u (); imm1 = create_int () } in +let t278 : t278 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in +let t279 : t279 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in +let t280 : t280 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in +let t281 : t281 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in +let t282 : t282 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in +let t283 : t283 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in +let t284 : t284 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in +let t285 : t285 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in +let t286 : t286 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t287 : t287 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in +let t288 : t288 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in +let t289 : t289 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in +let t290 : t290 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u (); imm3 = create_int () } in +let t291 : t291 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u (); imm3 = create_int () } in +let t292 : t292 = { float0 = create_float (); i64_1 = create_int64_u (); imm2 = create_int () } in +let t293 : t293 = { float0 = create_float (); i64_1 = create_int64_u (); imm2 = create_int () } in +let t294 : t294 = { str0 = create_string (); n1 = create_nativeint_u (); imm2 = create_int () } in +let t295 : t295 = { str0 = create_string (); n1 = create_nativeint_u (); imm2 = create_int () } in +let t296 : t296 = { float_u0 = create_float_u (); imm1 = create_int () } in +let t297 : t297 = { imm0 = create_int (); float1 = create_float (); float_u2 = create_float_u () } in +let t298 : t298 = { float0 = create_float (); float1 = create_float (); float32_u2 = create_float32_u () } in +let t299 : t299 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in +let t300_A : t300 = (A (create_float_u ())) in +let t301_A : t301 = (A (create_float_u ())) in +let t301_B : t301 = (B (create_float_u ())) in +let t302_A : t302 = (A { float_u0 = create_float_u () }) in +let t303_A : t303 = (A (create_float_u ())) in +let t303_B : t303 = (B (create_float_u ())) in +let t303_C : t303 = (C (create_float_u ())) in +let t304_A : t304 = (A { float_u0 = create_float_u () }) in +let t304_B : t304 = (B (create_float_u ())) in +let t305_A : t305 = (A (create_string (), create_float_u ())) in +let t306_A : t306 = (A (create_float_u ())) in +let t306_B : t306 = (B { float_u0 = create_float_u () }) in +let t307_A : t307 = (A { float_u0 = create_float_u () }) in +let t307_B : t307 = (B (create_float_u ())) in +let t307_C : t307 = (C (create_float_u ())) in +let t308_A : t308 = (A (create_string (), create_float_u ())) in +let t308_B : t308 = (B (create_float_u ())) in +let t309_A : t309 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t310_A : t310 = (A (create_float_u ())) in +let t310_B : t310 = (B (create_float_u ())) in +let t310_C : t310 = (C (create_float_u ())) in +let t310_D : t310 = (D (create_float_u ())) in +let t311_A : t311 = (A { float_u0 = create_float_u () }) in +let t311_B : t311 = (B { float_u0 = create_float_u () }) in +let t312_A : t312 = (A (create_string (), create_float_u ())) in +let t312_B : t312 = (B (create_float_u ())) in +let t312_C : t312 = (C (create_float_u ())) in +let t313_A : t313 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t313_B : t313 = (B (create_float_u ())) in +let t314_A : t314 = (A (create_float32_u ())) in +let t315_A : t315 = (A (create_float_u ())) in +let t315_B : t315 = (B { float_u0 = create_float_u () }) in +let t315_C : t315 = (C (create_float_u ())) in +let t316_A : t316 = (A { float_u0 = create_float_u () }) in +let t316_B : t316 = (B (create_float_u ())) in +let t316_C : t316 = (C (create_float_u ())) in +let t316_D : t316 = (D (create_float_u ())) in +let t317_A : t317 = (A (create_string (), create_float_u ())) in +let t317_B : t317 = (B { float_u0 = create_float_u () }) in +let t318_A : t318 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t318_B : t318 = (B (create_float_u ())) in +let t318_C : t318 = (C (create_float_u ())) in +let t319_A : t319 = (A (create_float32_u ())) in +let t319_B : t319 = (B (create_float_u ())) in +let t320_A : t320 = (A { float_u0 = create_float_u () }) in +let t321_A : t321 = (A (create_float_u ())) in +let t321_B : t321 = (B (create_string (), create_float_u ())) in +let t322_A : t322 = (A { float_u0 = create_float_u () }) in +let t322_B : t322 = (B { float_u0 = create_float_u () }) in +let t322_C : t322 = (C (create_float_u ())) in +let t323_A : t323 = (A (create_string (), create_float_u ())) in +let t323_B : t323 = (B (create_float_u ())) in +let t323_C : t323 = (C (create_float_u ())) in +let t323_D : t323 = (D (create_float_u ())) in +let t324_A : t324 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t324_B : t324 = (B { float_u0 = create_float_u () }) in +let t325_A : t325 = (A (create_float32_u ())) in +let t325_B : t325 = (B (create_float_u ())) in +let t325_C : t325 = (C (create_float_u ())) in +let t326_A : t326 = (A { float_u0 = create_float_u () }) in +let t326_B : t326 = (B (create_float_u ())) in +let t327_A : t327 = (A (create_float (), create_float_u ())) in +let t328_A : t328 = (A (create_float_u ())) in +let t328_B : t328 = (B (create_float_u ())) in +let t328_C : t328 = (C { float_u0 = create_float_u () }) in +let t329_A : t329 = (A { float_u0 = create_float_u () }) in +let t329_B : t329 = (B (create_string (), create_float_u ())) in +let t330_A : t330 = (A (create_string (), create_float_u ())) in +let t330_B : t330 = (B { float_u0 = create_float_u () }) in +let t330_C : t330 = (C (create_float_u ())) in +let t331_A : t331 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t331_B : t331 = (B (create_float_u ())) in +let t331_C : t331 = (C (create_float_u ())) in +let t331_D : t331 = (D (create_float_u ())) in +let t332_A : t332 = (A (create_float32_u ())) in +let t332_B : t332 = (B { float_u0 = create_float_u () }) in +let t333_A : t333 = (A { float_u0 = create_float_u () }) in +let t333_B : t333 = (B (create_float_u ())) in +let t333_C : t333 = (C (create_float_u ())) in +let t334_A : t334 = (A (create_float (), create_float_u ())) in +let t334_B : t334 = (B (create_float_u ())) in +let t335_A : t335 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t336_A : t336 = (A (create_float_u ())) in +let t336_B : t336 = (B { float_u0 = create_float_u () }) in +let t336_C : t336 = (C (create_float_u ())) in +let t336_D : t336 = (D (create_float_u ())) in +let t337_A : t337 = (A { float_u0 = create_float_u () }) in +let t337_B : t337 = (B (create_float_u ())) in +let t337_C : t337 = (C { float_u0 = create_float_u () }) in +let t338_A : t338 = (A (create_string (), create_float_u ())) in +let t338_B : t338 = (B (create_string (), create_float_u ())) in +let t339_A : t339 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t339_B : t339 = (B { float_u0 = create_float_u () }) in +let t339_C : t339 = (C (create_float_u ())) in +let t340_A : t340 = (A (create_float32_u ())) in +let t340_B : t340 = (B (create_float_u ())) in +let t340_C : t340 = (C (create_float_u ())) in +let t340_D : t340 = (D (create_float_u ())) in +let t341_A : t341 = (A { float_u0 = create_float_u () }) in +let t341_B : t341 = (B { float_u0 = create_float_u () }) in +let t342_A : t342 = (A (create_float (), create_float_u ())) in +let t342_B : t342 = (B (create_float_u ())) in +let t342_C : t342 = (C (create_float_u ())) in +let t343_A : t343 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t343_B : t343 = (B (create_float_u ())) in +let t344_A : t344 = (A (create_string (), create_float32_u ())) in +let t345_A : t345 = (A (create_float_u ())) in +let t345_B : t345 = (B (create_string (), create_float_u ())) in +let t345_C : t345 = (C (create_float_u ())) in +let t346_A : t346 = (A { float_u0 = create_float_u () }) in +let t346_B : t346 = (B { float_u0 = create_float_u () }) in +let t346_C : t346 = (C (create_float_u ())) in +let t346_D : t346 = (D (create_float_u ())) in +let t347_A : t347 = (A (create_string (), create_float_u ())) in +let t347_B : t347 = (B (create_float_u ())) in +let t347_C : t347 = (C { float_u0 = create_float_u () }) in +let t348_A : t348 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t348_B : t348 = (B (create_string (), create_float_u ())) in +let t349_A : t349 = (A (create_float32_u ())) in +let t349_B : t349 = (B { float_u0 = create_float_u () }) in +let t349_C : t349 = (C (create_float_u ())) in +let t350_A : t350 = (A { float_u0 = create_float_u () }) in +let t350_B : t350 = (B (create_float_u ())) in +let t350_C : t350 = (C (create_float_u ())) in +let t350_D : t350 = (D (create_float_u ())) in +let t351_A : t351 = (A (create_float (), create_float_u ())) in +let t351_B : t351 = (B { float_u0 = create_float_u () }) in +let t352_A : t352 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t352_B : t352 = (B (create_float_u ())) in +let t352_C : t352 = (C (create_float_u ())) in +let t353_A : t353 = (A (create_string (), create_float32_u ())) in +let t353_B : t353 = (B (create_float_u ())) in +let t354_A : t354 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t355_A : t355 = (A (create_float_u ())) in +let t355_B : t355 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t356_A : t356 = (A { float_u0 = create_float_u () }) in +let t356_B : t356 = (B (create_string (), create_float_u ())) in +let t356_C : t356 = (C (create_float_u ())) in +let t357_A : t357 = (A (create_string (), create_float_u ())) in +let t357_B : t357 = (B { float_u0 = create_float_u () }) in +let t357_C : t357 = (C (create_float_u ())) in +let t357_D : t357 = (D (create_float_u ())) in +let t358_A : t358 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t358_B : t358 = (B (create_float_u ())) in +let t358_C : t358 = (C { float_u0 = create_float_u () }) in +let t359_A : t359 = (A (create_float32_u ())) in +let t359_B : t359 = (B (create_string (), create_float_u ())) in +let t360_A : t360 = (A { float_u0 = create_float_u () }) in +let t360_B : t360 = (B { float_u0 = create_float_u () }) in +let t360_C : t360 = (C (create_float_u ())) in +let t361_A : t361 = (A (create_float (), create_float_u ())) in +let t361_B : t361 = (B (create_float_u ())) in +let t361_C : t361 = (C (create_float_u ())) in +let t361_D : t361 = (D (create_float_u ())) in +let t362_A : t362 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t362_B : t362 = (B { float_u0 = create_float_u () }) in +let t363_A : t363 = (A (create_string (), create_float32_u ())) in +let t363_B : t363 = (B (create_float_u ())) in +let t363_C : t363 = (C (create_float_u ())) in +let t364_A : t364 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t364_B : t364 = (B (create_float_u ())) in +let t365_A : t365 = (A (create_int32_u ())) in +let t366_A : t366 = (A (create_float_u ())) in +let t366_B : t366 = (B (create_float_u ())) in +let t366_C : t366 = (C (create_float_u ())) in +let t366_D : t366 = (D (create_float_u ())) in +let t366_E : t366 = (E (create_float_u ())) in +let t367_A : t367 = (A { float_u0 = create_float_u () }) in +let t367_B : t367 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t368_A : t368 = (A (create_string (), create_float_u ())) in +let t368_B : t368 = (B (create_string (), create_float_u ())) in +let t368_C : t368 = (C (create_float_u ())) in +let t369_A : t369 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t369_B : t369 = (B { float_u0 = create_float_u () }) in +let t369_C : t369 = (C (create_float_u ())) in +let t369_D : t369 = (D (create_float_u ())) in +let t370_A : t370 = (A (create_float32_u ())) in +let t370_B : t370 = (B (create_float_u ())) in +let t370_C : t370 = (C { float_u0 = create_float_u () }) in +let t371_A : t371 = (A { float_u0 = create_float_u () }) in +let t371_B : t371 = (B (create_string (), create_float_u ())) in +let t372_A : t372 = (A (create_float (), create_float_u ())) in +let t372_B : t372 = (B { float_u0 = create_float_u () }) in +let t372_C : t372 = (C (create_float_u ())) in +let t373_A : t373 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t373_B : t373 = (B (create_float_u ())) in +let t373_C : t373 = (C (create_float_u ())) in +let t373_D : t373 = (D (create_float_u ())) in +let t374_A : t374 = (A (create_string (), create_float32_u ())) in +let t374_B : t374 = (B { float_u0 = create_float_u () }) in +let t375_A : t375 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t375_B : t375 = (B (create_float_u ())) in +let t375_C : t375 = (C (create_float_u ())) in +let t376_A : t376 = (A (create_int32_u ())) in +let t376_B : t376 = (B (create_float_u ())) in +let t377_A : t377 = (A { float32_u0 = create_float32_u () }) in +let t378_A : t378 = (A (create_float_u ())) in +let t378_B : t378 = (B { float_u0 = create_float_u () }) in +let t378_C : t378 = (C { float_u0 = create_float_u () }) in +let t379_A : t379 = (A { float_u0 = create_float_u () }) in +let t379_B : t379 = (B (create_float_u ())) in +let t379_C : t379 = (C (create_float_u ())) in +let t379_D : t379 = (D (create_float_u ())) in +let t379_E : t379 = (E (create_float_u ())) in +let t380_A : t380 = (A (create_string (), create_float_u ())) in +let t380_B : t380 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t381_A : t381 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t381_B : t381 = (B (create_string (), create_float_u ())) in +let t381_C : t381 = (C (create_float_u ())) in +let t382_A : t382 = (A (create_float32_u ())) in +let t382_B : t382 = (B { float_u0 = create_float_u () }) in +let t382_C : t382 = (C (create_float_u ())) in +let t382_D : t382 = (D (create_float_u ())) in +let t383_A : t383 = (A { float_u0 = create_float_u () }) in +let t383_B : t383 = (B (create_float_u ())) in +let t383_C : t383 = (C { float_u0 = create_float_u () }) in +let t384_A : t384 = (A (create_float (), create_float_u ())) in +let t384_B : t384 = (B (create_string (), create_float_u ())) in +let t385_A : t385 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t385_B : t385 = (B { float_u0 = create_float_u () }) in +let t385_C : t385 = (C (create_float_u ())) in +let t386_A : t386 = (A (create_string (), create_float32_u ())) in +let t386_B : t386 = (B (create_float_u ())) in +let t386_C : t386 = (C (create_float_u ())) in +let t386_D : t386 = (D (create_float_u ())) in +let t387_A : t387 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t387_B : t387 = (B { float_u0 = create_float_u () }) in +let t388_A : t388 = (A (create_int32_u ())) in +let t388_B : t388 = (B (create_float_u ())) in +let t388_C : t388 = (C (create_float_u ())) in +let t389_A : t389 = (A { float32_u0 = create_float32_u () }) in +let t389_B : t389 = (B (create_float_u ())) in +let t390_A : t390 = (A (create_string (), create_string (), create_float_u ())) in +let t391_A : t391 = (A (create_float_u ())) in +let t391_B : t391 = (B (create_string (), create_float_u ())) in +let t391_C : t391 = (C (create_float_u ())) in +let t391_D : t391 = (D (create_float_u ())) in +let t392_A : t392 = (A { float_u0 = create_float_u () }) in +let t392_B : t392 = (B { float_u0 = create_float_u () }) in +let t392_C : t392 = (C { float_u0 = create_float_u () }) in +let t393_A : t393 = (A (create_string (), create_float_u ())) in +let t393_B : t393 = (B (create_float_u ())) in +let t393_C : t393 = (C (create_float_u ())) in +let t393_D : t393 = (D (create_float_u ())) in +let t393_E : t393 = (E (create_float_u ())) in +let t394_A : t394 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t394_B : t394 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t395_A : t395 = (A (create_float32_u ())) in +let t395_B : t395 = (B (create_string (), create_float_u ())) in +let t395_C : t395 = (C (create_float_u ())) in +let t396_A : t396 = (A { float_u0 = create_float_u () }) in +let t396_B : t396 = (B { float_u0 = create_float_u () }) in +let t396_C : t396 = (C (create_float_u ())) in +let t396_D : t396 = (D (create_float_u ())) in +let t397_A : t397 = (A (create_float (), create_float_u ())) in +let t397_B : t397 = (B (create_float_u ())) in +let t397_C : t397 = (C { float_u0 = create_float_u () }) in +let t398_A : t398 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t398_B : t398 = (B (create_string (), create_float_u ())) in +let t399_A : t399 = (A (create_string (), create_float32_u ())) in +let t399_B : t399 = (B { float_u0 = create_float_u () }) in +let t399_C : t399 = (C (create_float_u ())) in +let t400_A : t400 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t400_B : t400 = (B (create_float_u ())) in +let t400_C : t400 = (C (create_float_u ())) in +let t400_D : t400 = (D (create_float_u ())) in +let t401_A : t401 = (A (create_int32_u ())) in +let t401_B : t401 = (B { float_u0 = create_float_u () }) in +let t402_A : t402 = (A { float32_u0 = create_float32_u () }) in +let t402_B : t402 = (B (create_float_u ())) in +let t402_C : t402 = (C (create_float_u ())) in +let t403_A : t403 = (A (create_string (), create_string (), create_float_u ())) in +let t403_B : t403 = (B (create_float_u ())) in +let t404_A : t404 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t405_A : t405 = (A (create_float_u ())) in +let t405_B : t405 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t405_C : t405 = (C (create_float_u ())) in +let t406_A : t406 = (A { float_u0 = create_float_u () }) in +let t406_B : t406 = (B (create_string (), create_float_u ())) in +let t406_C : t406 = (C (create_float_u ())) in +let t406_D : t406 = (D (create_float_u ())) in +let t407_A : t407 = (A (create_string (), create_float_u ())) in +let t407_B : t407 = (B { float_u0 = create_float_u () }) in +let t407_C : t407 = (C { float_u0 = create_float_u () }) in +let t408_A : t408 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t408_B : t408 = (B (create_float_u ())) in +let t408_C : t408 = (C (create_float_u ())) in +let t408_D : t408 = (D (create_float_u ())) in +let t408_E : t408 = (E (create_float_u ())) in +let t409_A : t409 = (A (create_float32_u ())) in +let t409_B : t409 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t410_A : t410 = (A { float_u0 = create_float_u () }) in +let t410_B : t410 = (B (create_string (), create_float_u ())) in +let t410_C : t410 = (C (create_float_u ())) in +let t411_A : t411 = (A (create_float (), create_float_u ())) in +let t411_B : t411 = (B { float_u0 = create_float_u () }) in +let t411_C : t411 = (C (create_float_u ())) in +let t411_D : t411 = (D (create_float_u ())) in +let t412_A : t412 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t412_B : t412 = (B (create_float_u ())) in +let t412_C : t412 = (C { float_u0 = create_float_u () }) in +let t413_A : t413 = (A (create_string (), create_float32_u ())) in +let t413_B : t413 = (B (create_string (), create_float_u ())) in +let t414_A : t414 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t414_B : t414 = (B { float_u0 = create_float_u () }) in +let t414_C : t414 = (C (create_float_u ())) in +let t415_A : t415 = (A (create_int32_u ())) in +let t415_B : t415 = (B (create_float_u ())) in +let t415_C : t415 = (C (create_float_u ())) in +let t415_D : t415 = (D (create_float_u ())) in +let t416_A : t416 = (A { float32_u0 = create_float32_u () }) in +let t416_B : t416 = (B { float_u0 = create_float_u () }) in +let t417_A : t417 = (A (create_string (), create_string (), create_float_u ())) in +let t417_B : t417 = (B (create_float_u ())) in +let t417_C : t417 = (C (create_float_u ())) in +let t418_A : t418 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t418_B : t418 = (B (create_float_u ())) in +let t419_A : t419 = (A (create_float (), create_float32_u ())) in +let t420_A : t420 = (A (create_float_u ())) in +let t420_B : t420 = (B (create_float32_u ())) in +let t421_A : t421 = (A { float_u0 = create_float_u () }) in +let t421_B : t421 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t421_C : t421 = (C (create_float_u ())) in +let t422_A : t422 = (A (create_string (), create_float_u ())) in +let t422_B : t422 = (B (create_string (), create_float_u ())) in +let t422_C : t422 = (C (create_float_u ())) in +let t422_D : t422 = (D (create_float_u ())) in +let t423_A : t423 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t423_B : t423 = (B { float_u0 = create_float_u () }) in +let t423_C : t423 = (C { float_u0 = create_float_u () }) in +let t424_A : t424 = (A (create_float32_u ())) in +let t424_B : t424 = (B (create_float_u ())) in +let t424_C : t424 = (C (create_float_u ())) in +let t424_D : t424 = (D (create_float_u ())) in +let t424_E : t424 = (E (create_float_u ())) in +let t425_A : t425 = (A { float_u0 = create_float_u () }) in +let t425_B : t425 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t426_A : t426 = (A (create_float (), create_float_u ())) in +let t426_B : t426 = (B (create_string (), create_float_u ())) in +let t426_C : t426 = (C (create_float_u ())) in +let t427_A : t427 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t427_B : t427 = (B { float_u0 = create_float_u () }) in +let t427_C : t427 = (C (create_float_u ())) in +let t427_D : t427 = (D (create_float_u ())) in +let t428_A : t428 = (A (create_string (), create_float32_u ())) in +let t428_B : t428 = (B (create_float_u ())) in +let t428_C : t428 = (C { float_u0 = create_float_u () }) in +let t429_A : t429 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t429_B : t429 = (B (create_string (), create_float_u ())) in +let t430_A : t430 = (A (create_int32_u ())) in +let t430_B : t430 = (B { float_u0 = create_float_u () }) in +let t430_C : t430 = (C (create_float_u ())) in +let t431_A : t431 = (A { float32_u0 = create_float32_u () }) in +let t431_B : t431 = (B (create_float_u ())) in +let t431_C : t431 = (C (create_float_u ())) in +let t431_D : t431 = (D (create_float_u ())) in +let t432_A : t432 = (A (create_string (), create_string (), create_float_u ())) in +let t432_B : t432 = (B { float_u0 = create_float_u () }) in +let t433_A : t433 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t433_B : t433 = (B (create_float_u ())) in +let t433_C : t433 = (C (create_float_u ())) in +let t434_A : t434 = (A (create_float (), create_float32_u ())) in +let t434_B : t434 = (B (create_float_u ())) in +let t435_A : t435 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t436_A : t436 = (A (create_float_u ())) in +let t436_B : t436 = (B (create_float_u ())) in +let t436_C : t436 = (C { float_u0 = create_float_u () }) in +let t436_D : t436 = (D (create_float_u ())) in +let t437_A : t437 = (A { float_u0 = create_float_u () }) in +let t437_B : t437 = (B (create_float32_u ())) in +let t438_A : t438 = (A (create_string (), create_float_u ())) in +let t438_B : t438 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t438_C : t438 = (C (create_float_u ())) in +let t439_A : t439 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t439_B : t439 = (B (create_string (), create_float_u ())) in +let t439_C : t439 = (C (create_float_u ())) in +let t439_D : t439 = (D (create_float_u ())) in +let t440_A : t440 = (A (create_float32_u ())) in +let t440_B : t440 = (B { float_u0 = create_float_u () }) in +let t440_C : t440 = (C { float_u0 = create_float_u () }) in +let t441_A : t441 = (A { float_u0 = create_float_u () }) in +let t441_B : t441 = (B (create_float_u ())) in +let t441_C : t441 = (C (create_float_u ())) in +let t441_D : t441 = (D (create_float_u ())) in +let t441_E : t441 = (E (create_float_u ())) in +let t442_A : t442 = (A (create_float (), create_float_u ())) in +let t442_B : t442 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t443_A : t443 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t443_B : t443 = (B (create_string (), create_float_u ())) in +let t443_C : t443 = (C (create_float_u ())) in +let t444_A : t444 = (A (create_string (), create_float32_u ())) in +let t444_B : t444 = (B { float_u0 = create_float_u () }) in +let t444_C : t444 = (C (create_float_u ())) in +let t444_D : t444 = (D (create_float_u ())) in +let t445_A : t445 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t445_B : t445 = (B (create_float_u ())) in +let t445_C : t445 = (C { float_u0 = create_float_u () }) in +let t446_A : t446 = (A (create_int32_u ())) in +let t446_B : t446 = (B (create_string (), create_float_u ())) in +let t447_A : t447 = (A { float32_u0 = create_float32_u () }) in +let t447_B : t447 = (B { float_u0 = create_float_u () }) in +let t447_C : t447 = (C (create_float_u ())) in +let t448_A : t448 = (A (create_string (), create_string (), create_float_u ())) in +let t448_B : t448 = (B (create_float_u ())) in +let t448_C : t448 = (C (create_float_u ())) in +let t448_D : t448 = (D (create_float_u ())) in +let t449_A : t449 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t449_B : t449 = (B { float_u0 = create_float_u () }) in +let t450_A : t450 = (A (create_float (), create_float32_u ())) in +let t450_B : t450 = (B (create_float_u ())) in +let t450_C : t450 = (C (create_float_u ())) in +let t451_A : t451 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t451_B : t451 = (B (create_float_u ())) in +let t452_A : t452 = (A (create_string (), create_int32_u ())) in +let t453_A : t453 = (A (create_float_u ())) in +let t453_B : t453 = (B { float_u0 = create_float_u () }) in +let t453_C : t453 = (C (create_float_u ())) in +let t453_D : t453 = (D (create_float_u ())) in +let t453_E : t453 = (E (create_float_u ())) in +let t454_A : t454 = (A { float_u0 = create_float_u () }) in +let t454_B : t454 = (B (create_float_u ())) in +let t454_C : t454 = (C { float_u0 = create_float_u () }) in +let t454_D : t454 = (D (create_float_u ())) in +let t455_A : t455 = (A (create_string (), create_float_u ())) in +let t455_B : t455 = (B (create_float32_u ())) in +let t456_A : t456 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t456_B : t456 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t456_C : t456 = (C (create_float_u ())) in +let t457_A : t457 = (A (create_float32_u ())) in +let t457_B : t457 = (B (create_string (), create_float_u ())) in +let t457_C : t457 = (C (create_float_u ())) in +let t457_D : t457 = (D (create_float_u ())) in +let t458_A : t458 = (A { float_u0 = create_float_u () }) in +let t458_B : t458 = (B { float_u0 = create_float_u () }) in +let t458_C : t458 = (C { float_u0 = create_float_u () }) in +let t459_A : t459 = (A (create_float (), create_float_u ())) in +let t459_B : t459 = (B (create_float_u ())) in +let t459_C : t459 = (C (create_float_u ())) in +let t459_D : t459 = (D (create_float_u ())) in +let t459_E : t459 = (E (create_float_u ())) in +let t460_A : t460 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t460_B : t460 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t461_A : t461 = (A (create_string (), create_float32_u ())) in +let t461_B : t461 = (B (create_string (), create_float_u ())) in +let t461_C : t461 = (C (create_float_u ())) in +let t462_A : t462 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t462_B : t462 = (B { float_u0 = create_float_u () }) in +let t462_C : t462 = (C (create_float_u ())) in +let t462_D : t462 = (D (create_float_u ())) in +let t463_A : t463 = (A (create_int32_u ())) in +let t463_B : t463 = (B (create_float_u ())) in +let t463_C : t463 = (C { float_u0 = create_float_u () }) in +let t464_A : t464 = (A { float32_u0 = create_float32_u () }) in +let t464_B : t464 = (B (create_string (), create_float_u ())) in +let t465_A : t465 = (A (create_string (), create_string (), create_float_u ())) in +let t465_B : t465 = (B { float_u0 = create_float_u () }) in +let t465_C : t465 = (C (create_float_u ())) in +let t466_A : t466 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t466_B : t466 = (B (create_float_u ())) in +let t466_C : t466 = (C (create_float_u ())) in +let t466_D : t466 = (D (create_float_u ())) in +let t467_A : t467 = (A (create_float (), create_float32_u ())) in +let t467_B : t467 = (B { float_u0 = create_float_u () }) in +let t468_A : t468 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t468_B : t468 = (B (create_float_u ())) in +let t468_C : t468 = (C (create_float_u ())) in +let t469_A : t469 = (A (create_string (), create_int32_u ())) in +let t469_B : t469 = (B (create_float_u ())) in +let t470_A : t470 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in +let t471_A : t471 = (A (create_float_u ())) in +let t471_B : t471 = (B (create_string (), create_float_u ())) in +let t471_C : t471 = (C { float_u0 = create_float_u () }) in +let t472_A : t472 = (A { float_u0 = create_float_u () }) in +let t472_B : t472 = (B { float_u0 = create_float_u () }) in +let t472_C : t472 = (C (create_float_u ())) in +let t472_D : t472 = (D (create_float_u ())) in +let t472_E : t472 = (E (create_float_u ())) in +let t473_A : t473 = (A (create_string (), create_float_u ())) in +let t473_B : t473 = (B (create_float_u ())) in +let t473_C : t473 = (C { float_u0 = create_float_u () }) in +let t473_D : t473 = (D (create_float_u ())) in +let t474_A : t474 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t474_B : t474 = (B (create_float32_u ())) in +let t475_A : t475 = (A (create_float32_u ())) in +let t475_B : t475 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t475_C : t475 = (C (create_float_u ())) in +let t476_A : t476 = (A { float_u0 = create_float_u () }) in +let t476_B : t476 = (B (create_string (), create_float_u ())) in +let t476_C : t476 = (C (create_float_u ())) in +let t476_D : t476 = (D (create_float_u ())) in +let t477_A : t477 = (A (create_float (), create_float_u ())) in +let t477_B : t477 = (B { float_u0 = create_float_u () }) in +let t477_C : t477 = (C { float_u0 = create_float_u () }) in +let t478_A : t478 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t478_B : t478 = (B (create_float_u ())) in +let t478_C : t478 = (C (create_float_u ())) in +let t478_D : t478 = (D (create_float_u ())) in +let t478_E : t478 = (E (create_float_u ())) in +let t479_A : t479 = (A (create_string (), create_float32_u ())) in +let t479_B : t479 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t480_A : t480 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t480_B : t480 = (B (create_string (), create_float_u ())) in +let t480_C : t480 = (C (create_float_u ())) in +let t481_A : t481 = (A (create_int32_u ())) in +let t481_B : t481 = (B { float_u0 = create_float_u () }) in +let t481_C : t481 = (C (create_float_u ())) in +let t481_D : t481 = (D (create_float_u ())) in +let t482_A : t482 = (A { float32_u0 = create_float32_u () }) in +let t482_B : t482 = (B (create_float_u ())) in +let t482_C : t482 = (C { float_u0 = create_float_u () }) in +let t483_A : t483 = (A (create_string (), create_string (), create_float_u ())) in +let t483_B : t483 = (B (create_string (), create_float_u ())) in +let t484_A : t484 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t484_B : t484 = (B { float_u0 = create_float_u () }) in +let t484_C : t484 = (C (create_float_u ())) in +let t485_A : t485 = (A (create_float (), create_float32_u ())) in +let t485_B : t485 = (B (create_float_u ())) in +let t485_C : t485 = (C (create_float_u ())) in +let t485_D : t485 = (D (create_float_u ())) in +let t486_A : t486 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t486_B : t486 = (B { float_u0 = create_float_u () }) in +let t487_A : t487 = (A (create_string (), create_int32_u ())) in +let t487_B : t487 = (B (create_float_u ())) in +let t487_C : t487 = (C (create_float_u ())) in +let t488_A : t488 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in +let t488_B : t488 = (B (create_float_u ())) in +let t489_A : t489 = (A (create_int64_u ())) in +let t490_A : t490 = (A (create_float_u ())) in +let t490_B : t490 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t490_C : t490 = (C (create_float_u ())) in +let t490_D : t490 = (D (create_float_u ())) in +let t491_A : t491 = (A { float_u0 = create_float_u () }) in +let t491_B : t491 = (B (create_string (), create_float_u ())) in +let t491_C : t491 = (C { float_u0 = create_float_u () }) in +let t492_A : t492 = (A (create_string (), create_float_u ())) in +let t492_B : t492 = (B { float_u0 = create_float_u () }) in +let t492_C : t492 = (C (create_float_u ())) in +let t492_D : t492 = (D (create_float_u ())) in +let t492_E : t492 = (E (create_float_u ())) in +let t493_A : t493 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t493_B : t493 = (B (create_float_u ())) in +let t493_C : t493 = (C { float_u0 = create_float_u () }) in +let t493_D : t493 = (D (create_float_u ())) in +let t494_A : t494 = (A (create_float32_u ())) in +let t494_B : t494 = (B (create_float32_u ())) in +let t495_A : t495 = (A { float_u0 = create_float_u () }) in +let t495_B : t495 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t495_C : t495 = (C (create_float_u ())) in +let t496_A : t496 = (A (create_float (), create_float_u ())) in +let t496_B : t496 = (B (create_string (), create_float_u ())) in +let t496_C : t496 = (C (create_float_u ())) in +let t496_D : t496 = (D (create_float_u ())) in +let t497_A : t497 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t497_B : t497 = (B { float_u0 = create_float_u () }) in +let t497_C : t497 = (C { float_u0 = create_float_u () }) in +let t498_A : t498 = (A (create_string (), create_float32_u ())) in +let t498_B : t498 = (B (create_float_u ())) in +let t498_C : t498 = (C (create_float_u ())) in +let t498_D : t498 = (D (create_float_u ())) in +let t498_E : t498 = (E (create_float_u ())) in +let t499_A : t499 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t499_B : t499 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t500_A : t500 = (A (create_int32_u ())) in +let t500_B : t500 = (B (create_string (), create_float_u ())) in +let t500_C : t500 = (C (create_float_u ())) in +let t501_A : t501 = (A { float32_u0 = create_float32_u () }) in +let t501_B : t501 = (B { float_u0 = create_float_u () }) in +let t501_C : t501 = (C (create_float_u ())) in +let t501_D : t501 = (D (create_float_u ())) in +let t502_A : t502 = (A (create_string (), create_string (), create_float_u ())) in +let t502_B : t502 = (B (create_float_u ())) in +let t502_C : t502 = (C { float_u0 = create_float_u () }) in +let t503_A : t503 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t503_B : t503 = (B (create_string (), create_float_u ())) in +let t504_A : t504 = (A (create_float (), create_float32_u ())) in +let t504_B : t504 = (B { float_u0 = create_float_u () }) in +let t504_C : t504 = (C (create_float_u ())) in +let t505_A : t505 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t505_B : t505 = (B (create_float_u ())) in +let t505_C : t505 = (C (create_float_u ())) in +let t505_D : t505 = (D (create_float_u ())) in +let t506_A : t506 = (A (create_string (), create_int32_u ())) in +let t506_B : t506 = (B { float_u0 = create_float_u () }) in +let t507_A : t507 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in +let t507_B : t507 = (B (create_float_u ())) in +let t507_C : t507 = (C (create_float_u ())) in +let t508_A : t508 = (A (create_int64_u ())) in +let t508_B : t508 = (B (create_float_u ())) in +let t509_A : t509 = (A { float32_u0 = create_float32_u () }) in +let t510_A : t510 = (A (create_float_u ())) in +let t510_B : t510 = (B (create_float32_u ())) in +let t510_C : t510 = (C (create_float_u ())) in +let t511_A : t511 = (A { float_u0 = create_float_u () }) in +let t511_B : t511 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t511_C : t511 = (C (create_float_u ())) in +let t511_D : t511 = (D (create_float_u ())) in +let t512_A : t512 = (A (create_string (), create_float_u ())) in +let t512_B : t512 = (B (create_string (), create_float_u ())) in +let t512_C : t512 = (C { float_u0 = create_float_u () }) in +let t513_A : t513 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t513_B : t513 = (B { float_u0 = create_float_u () }) in +let t513_C : t513 = (C (create_float_u ())) in +let t513_D : t513 = (D (create_float_u ())) in +let t513_E : t513 = (E (create_float_u ())) in +let t514_A : t514 = (A (create_float32_u ())) in +let t514_B : t514 = (B (create_float_u ())) in +let t514_C : t514 = (C { float_u0 = create_float_u () }) in +let t514_D : t514 = (D (create_float_u ())) in +let t515_A : t515 = (A { float_u0 = create_float_u () }) in +let t515_B : t515 = (B (create_float32_u ())) in +let t516_A : t516 = (A (create_float (), create_float_u ())) in +let t516_B : t516 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t516_C : t516 = (C (create_float_u ())) in +let t517_A : t517 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t517_B : t517 = (B (create_string (), create_float_u ())) in +let t517_C : t517 = (C (create_float_u ())) in +let t517_D : t517 = (D (create_float_u ())) in +let t518_A : t518 = (A (create_string (), create_float32_u ())) in +let t518_B : t518 = (B { float_u0 = create_float_u () }) in +let t518_C : t518 = (C { float_u0 = create_float_u () }) in +let t519_A : t519 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t519_B : t519 = (B (create_float_u ())) in +let t519_C : t519 = (C (create_float_u ())) in +let t519_D : t519 = (D (create_float_u ())) in +let t519_E : t519 = (E (create_float_u ())) in +let t520_A : t520 = (A (create_int32_u ())) in +let t520_B : t520 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t521_A : t521 = (A { float32_u0 = create_float32_u () }) in +let t521_B : t521 = (B (create_string (), create_float_u ())) in +let t521_C : t521 = (C (create_float_u ())) in +let t522_A : t522 = (A (create_string (), create_string (), create_float_u ())) in +let t522_B : t522 = (B { float_u0 = create_float_u () }) in +let t522_C : t522 = (C (create_float_u ())) in +let t522_D : t522 = (D (create_float_u ())) in +let t523_A : t523 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t523_B : t523 = (B (create_float_u ())) in +let t523_C : t523 = (C { float_u0 = create_float_u () }) in +let t524_A : t524 = (A (create_float (), create_float32_u ())) in +let t524_B : t524 = (B (create_string (), create_float_u ())) in +let t525_A : t525 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t525_B : t525 = (B { float_u0 = create_float_u () }) in +let t525_C : t525 = (C (create_float_u ())) in +let t526_A : t526 = (A (create_string (), create_int32_u ())) in +let t526_B : t526 = (B (create_float_u ())) in +let t526_C : t526 = (C (create_float_u ())) in +let t526_D : t526 = (D (create_float_u ())) in +let t527_A : t527 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in +let t527_B : t527 = (B { float_u0 = create_float_u () }) in +let t528_A : t528 = (A (create_int64_u ())) in +let t528_B : t528 = (B (create_float_u ())) in +let t528_C : t528 = (C (create_float_u ())) in +let t529_A : t529 = (A { float32_u0 = create_float32_u () }) in +let t529_B : t529 = (B (create_float_u ())) in +let t530_A : t530 = (A (create_float (), create_string (), create_float_u ())) in +let t531_A : t531 = (A (create_float_u ())) in +let t531_B : t531 = (B { float_u0 = create_float_u () }) in +let t532_A : t532 = (A { float_u0 = create_float_u () }) in +let t532_B : t532 = (B (create_float32_u ())) in +let t532_C : t532 = (C (create_float_u ())) in +let t533_A : t533 = (A (create_string (), create_float_u ())) in +let t533_B : t533 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t533_C : t533 = (C (create_float_u ())) in +let t533_D : t533 = (D (create_float_u ())) in +let t534_A : t534 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t534_B : t534 = (B (create_string (), create_float_u ())) in +let t534_C : t534 = (C { float_u0 = create_float_u () }) in +let t535_A : t535 = (A (create_float32_u ())) in +let t535_B : t535 = (B { float_u0 = create_float_u () }) in +let t535_C : t535 = (C (create_float_u ())) in +let t535_D : t535 = (D (create_float_u ())) in +let t535_E : t535 = (E (create_float_u ())) in +let t536_A : t536 = (A { float_u0 = create_float_u () }) in +let t536_B : t536 = (B (create_float_u ())) in +let t536_C : t536 = (C { float_u0 = create_float_u () }) in +let t536_D : t536 = (D (create_float_u ())) in +let t537_A : t537 = (A (create_float (), create_float_u ())) in +let t537_B : t537 = (B (create_float32_u ())) in +let t538_A : t538 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t538_B : t538 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t538_C : t538 = (C (create_float_u ())) in +let t539_A : t539 = (A (create_string (), create_float32_u ())) in +let t539_B : t539 = (B (create_string (), create_float_u ())) in +let t539_C : t539 = (C (create_float_u ())) in +let t539_D : t539 = (D (create_float_u ())) in +let t540_A : t540 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t540_B : t540 = (B { float_u0 = create_float_u () }) in +let t540_C : t540 = (C { float_u0 = create_float_u () }) in +let t541_A : t541 = (A (create_int32_u ())) in +let t541_B : t541 = (B (create_float_u ())) in +let t541_C : t541 = (C (create_float_u ())) in +let t541_D : t541 = (D (create_float_u ())) in +let t541_E : t541 = (E (create_float_u ())) in +let t542_A : t542 = (A { float32_u0 = create_float32_u () }) in +let t542_B : t542 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t543_A : t543 = (A (create_string (), create_string (), create_float_u ())) in +let t543_B : t543 = (B (create_string (), create_float_u ())) in +let t543_C : t543 = (C (create_float_u ())) in +let t544_A : t544 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t544_B : t544 = (B { float_u0 = create_float_u () }) in +let t544_C : t544 = (C (create_float_u ())) in +let t544_D : t544 = (D (create_float_u ())) in +let t545_A : t545 = (A (create_float (), create_float32_u ())) in +let t545_B : t545 = (B (create_float_u ())) in +let t545_C : t545 = (C { float_u0 = create_float_u () }) in +let t546_A : t546 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t546_B : t546 = (B (create_string (), create_float_u ())) in +let t547_A : t547 = (A (create_string (), create_int32_u ())) in +let t547_B : t547 = (B { float_u0 = create_float_u () }) in +let t547_C : t547 = (C (create_float_u ())) in +let t548_A : t548 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in +let t548_B : t548 = (B (create_float_u ())) in +let t548_C : t548 = (C (create_float_u ())) in +let t548_D : t548 = (D (create_float_u ())) in +let t549_A : t549 = (A (create_int64_u ())) in +let t549_B : t549 = (B { float_u0 = create_float_u () }) in +let t550_A : t550 = (A { float32_u0 = create_float32_u () }) in +let t550_B : t550 = (B (create_float_u ())) in +let t550_C : t550 = (C (create_float_u ())) in +let t551_A : t551 = (A (create_float (), create_string (), create_float_u ())) in +let t551_B : t551 = (B (create_float_u ())) in +let t552_A : t552 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t553_A : t553 = (A (create_float_u ())) in +let t553_B : t553 = (B (create_float_u ())) in +let t553_C : t553 = (C (create_string (), create_float_u ())) in +let t554_A : t554 = (A { float_u0 = create_float_u () }) in +let t554_B : t554 = (B { float_u0 = create_float_u () }) in +let t555_A : t555 = (A (create_string (), create_float_u ())) in +let t555_B : t555 = (B (create_float32_u ())) in +let t555_C : t555 = (C (create_float_u ())) in +let t556_A : t556 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t556_B : t556 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t556_C : t556 = (C (create_float_u ())) in +let t556_D : t556 = (D (create_float_u ())) in +let t557_A : t557 = (A (create_float32_u ())) in +let t557_B : t557 = (B (create_string (), create_float_u ())) in +let t557_C : t557 = (C { float_u0 = create_float_u () }) in +let t558_A : t558 = (A { float_u0 = create_float_u () }) in +let t558_B : t558 = (B { float_u0 = create_float_u () }) in +let t558_C : t558 = (C (create_float_u ())) in +let t558_D : t558 = (D (create_float_u ())) in +let t558_E : t558 = (E (create_float_u ())) in +let t559_A : t559 = (A (create_float (), create_float_u ())) in +let t559_B : t559 = (B (create_float_u ())) in +let t559_C : t559 = (C { float_u0 = create_float_u () }) in +let t559_D : t559 = (D (create_float_u ())) in +let t560_A : t560 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t560_B : t560 = (B (create_float32_u ())) in +let t561_A : t561 = (A (create_string (), create_float32_u ())) in +let t561_B : t561 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t561_C : t561 = (C (create_float_u ())) in +let t562_A : t562 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t562_B : t562 = (B (create_string (), create_float_u ())) in +let t562_C : t562 = (C (create_float_u ())) in +let t562_D : t562 = (D (create_float_u ())) in +let t563_A : t563 = (A (create_int32_u ())) in +let t563_B : t563 = (B { float_u0 = create_float_u () }) in +let t563_C : t563 = (C { float_u0 = create_float_u () }) in +let t564_A : t564 = (A { float32_u0 = create_float32_u () }) in +let t564_B : t564 = (B (create_float_u ())) in +let t564_C : t564 = (C (create_float_u ())) in +let t564_D : t564 = (D (create_float_u ())) in +let t564_E : t564 = (E (create_float_u ())) in +let t565_A : t565 = (A (create_string (), create_string (), create_float_u ())) in +let t565_B : t565 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t566_A : t566 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t566_B : t566 = (B (create_string (), create_float_u ())) in +let t566_C : t566 = (C (create_float_u ())) in +let t567_A : t567 = (A (create_float (), create_float32_u ())) in +let t567_B : t567 = (B { float_u0 = create_float_u () }) in +let t567_C : t567 = (C (create_float_u ())) in +let t567_D : t567 = (D (create_float_u ())) in +let t568_A : t568 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t568_B : t568 = (B (create_float_u ())) in +let t568_C : t568 = (C { float_u0 = create_float_u () }) in +let t569_A : t569 = (A (create_string (), create_int32_u ())) in +let t569_B : t569 = (B (create_string (), create_float_u ())) in +let t570_A : t570 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in +let t570_B : t570 = (B { float_u0 = create_float_u () }) in +let t570_C : t570 = (C (create_float_u ())) in +let t571_A : t571 = (A (create_int64_u ())) in +let t571_B : t571 = (B (create_float_u ())) in +let t571_C : t571 = (C (create_float_u ())) in +let t571_D : t571 = (D (create_float_u ())) in +let t572_A : t572 = (A { float32_u0 = create_float32_u () }) in +let t572_B : t572 = (B { float_u0 = create_float_u () }) in +let t573_A : t573 = (A (create_float (), create_string (), create_float_u ())) in +let t573_B : t573 = (B (create_float_u ())) in +let t573_C : t573 = (C (create_float_u ())) in +let t574_A : t574 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t574_B : t574 = (B (create_float_u ())) in +let t575_A : t575 = (A (create_string (), create_string (), create_float32_u ())) in +let t576_A : t576 = (A (create_float_u ())) in +let t576_B : t576 = (B { float_u0 = create_float_u () }) in +let t576_C : t576 = (C { float_u0 = create_float_u () }) in +let t576_D : t576 = (D (create_float_u ())) in +let t577_A : t577 = (A { float_u0 = create_float_u () }) in +let t577_B : t577 = (B (create_float_u ())) in +let t577_C : t577 = (C (create_string (), create_float_u ())) in +let t578_A : t578 = (A (create_string (), create_float_u ())) in +let t578_B : t578 = (B { float_u0 = create_float_u () }) in +let t579_A : t579 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t579_B : t579 = (B (create_float32_u ())) in +let t579_C : t579 = (C (create_float_u ())) in +let t580_A : t580 = (A (create_float32_u ())) in +let t580_B : t580 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t580_C : t580 = (C (create_float_u ())) in +let t580_D : t580 = (D (create_float_u ())) in +let t581_A : t581 = (A { float_u0 = create_float_u () }) in +let t581_B : t581 = (B (create_string (), create_float_u ())) in +let t581_C : t581 = (C { float_u0 = create_float_u () }) in +let t582_A : t582 = (A (create_float (), create_float_u ())) in +let t582_B : t582 = (B { float_u0 = create_float_u () }) in +let t582_C : t582 = (C (create_float_u ())) in +let t582_D : t582 = (D (create_float_u ())) in +let t582_E : t582 = (E (create_float_u ())) in +let t583_A : t583 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t583_B : t583 = (B (create_float_u ())) in +let t583_C : t583 = (C { float_u0 = create_float_u () }) in +let t583_D : t583 = (D (create_float_u ())) in +let t584_A : t584 = (A (create_string (), create_float32_u ())) in +let t584_B : t584 = (B (create_float32_u ())) in +let t585_A : t585 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t585_B : t585 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t585_C : t585 = (C (create_float_u ())) in +let t586_A : t586 = (A (create_int32_u ())) in +let t586_B : t586 = (B (create_string (), create_float_u ())) in +let t586_C : t586 = (C (create_float_u ())) in +let t586_D : t586 = (D (create_float_u ())) in +let t587_A : t587 = (A { float32_u0 = create_float32_u () }) in +let t587_B : t587 = (B { float_u0 = create_float_u () }) in +let t587_C : t587 = (C { float_u0 = create_float_u () }) in +let t588_A : t588 = (A (create_string (), create_string (), create_float_u ())) in +let t588_B : t588 = (B (create_float_u ())) in +let t588_C : t588 = (C (create_float_u ())) in +let t588_D : t588 = (D (create_float_u ())) in +let t588_E : t588 = (E (create_float_u ())) in +let t589_A : t589 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t589_B : t589 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t590_A : t590 = (A (create_float (), create_float32_u ())) in +let t590_B : t590 = (B (create_string (), create_float_u ())) in +let t590_C : t590 = (C (create_float_u ())) in +let t591_A : t591 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t591_B : t591 = (B { float_u0 = create_float_u () }) in +let t591_C : t591 = (C (create_float_u ())) in +let t591_D : t591 = (D (create_float_u ())) in +let t592_A : t592 = (A (create_string (), create_int32_u ())) in +let t592_B : t592 = (B (create_float_u ())) in +let t592_C : t592 = (C { float_u0 = create_float_u () }) in +let t593_A : t593 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in +let t593_B : t593 = (B (create_string (), create_float_u ())) in +let t594_A : t594 = (A (create_int64_u ())) in +let t594_B : t594 = (B { float_u0 = create_float_u () }) in +let t594_C : t594 = (C (create_float_u ())) in +let t595_A : t595 = (A { float32_u0 = create_float32_u () }) in +let t595_B : t595 = (B (create_float_u ())) in +let t595_C : t595 = (C (create_float_u ())) in +let t595_D : t595 = (D (create_float_u ())) in +let t596_A : t596 = (A (create_float (), create_string (), create_float_u ())) in +let t596_B : t596 = (B { float_u0 = create_float_u () }) in +let t597_A : t597 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +let t597_B : t597 = (B (create_float_u ())) in +let t597_C : t597 = (C (create_float_u ())) in +let t598_A : t598 = (A (create_string (), create_string (), create_float32_u ())) in +let t598_B : t598 = (B (create_float_u ())) in +let t599_A : t599 = (A { float0 = create_float (); float_u1 = create_float_u () }) in +print_endline " - Doing GC"; +Gc.full_major (); + +(* Copies *) +print_endline "Copying values using [with] record update"; +let t_orig0 = { t0 with float0 = t0.float0 } in +let t_orig1 = { t1 with float0 = t1.float0 } in +let t_orig2 = { t2 with float0 = t2.float0 } in +let t_orig3 = { t3 with float0 = t3.float0 } in +let t_orig4 = { t4 with float_u0 = t4.float_u0 } in +let t_orig5 = { t5 with float_u0 = t5.float_u0 } in +let t_orig6 = { t6 with float_u0 = t6.float_u0 } in +let t_orig7 = { t7 with float_u0 = t7.float_u0 } in +let t_orig8 = { t8 with float0 = t8.float0 } in +let t_orig9 = { t9 with float0 = t9.float0 } in +let t_orig10 = { t10 with float0 = t10.float0 } in +let t_orig11 = { t11 with float0 = t11.float0 } in +let t_orig12 = { t12 with float_u0 = t12.float_u0 } in +let t_orig13 = { t13 with float_u0 = t13.float_u0 } in +let t_orig14 = { t14 with float0 = t14.float0 } in +let t_orig15 = { t15 with float0 = t15.float0 } in +let t_orig16 = { t16 with float_u0 = t16.float_u0 } in +let t_orig17 = { t17 with float_u0 = t17.float_u0 } in +let t_orig18 = { t18 with float0 = t18.float0 } in +let t_orig19 = { t19 with float0 = t19.float0 } in +let t_orig20 = { t20 with float0 = t20.float0 } in +let t_orig21 = { t21 with float0 = t21.float0 } in +let t_orig22 = { t22 with float0 = t22.float0 } in +let t_orig23 = { t23 with float0 = t23.float0 } in +let t_orig24 = { t24 with float_u0 = t24.float_u0 } in +let t_orig25 = { t25 with float_u0 = t25.float_u0 } in +let t_orig26 = { t26 with float0 = t26.float0 } in +let t_orig27 = { t27 with float0 = t27.float0 } in +let t_orig28 = { t28 with float_u0 = t28.float_u0 } in +let t_orig29 = { t29 with float_u0 = t29.float_u0 } in +let t_orig30 = { t30 with float0 = t30.float0 } in +let t_orig31 = { t31 with float0 = t31.float0 } in +let t_orig32 = { t32 with float_u0 = t32.float_u0 } in +let t_orig33 = { t33 with float_u0 = t33.float_u0 } in +let t_orig34 = { t34 with float0 = t34.float0 } in +let t_orig35 = { t35 with float0 = t35.float0 } in +let t_orig36 = { t36 with float_u0 = t36.float_u0 } in +let t_orig37 = { t37 with float_u0 = t37.float_u0 } in +let t_orig38 = { t38 with float0 = t38.float0 } in +let t_orig39 = { t39 with float0 = t39.float0 } in +let t_orig40 = { t40 with float_u0 = t40.float_u0 } in +let t_orig41 = { t41 with float_u0 = t41.float_u0 } in +let t_orig42 = { t42 with float_u0 = t42.float_u0 } in +let t_orig43 = { t43 with float_u0 = t43.float_u0 } in +let t_orig44 = { t44 with float_u0 = t44.float_u0 } in +let t_orig45 = { t45 with float_u0 = t45.float_u0 } in +let t_orig46 = { t46 with float0 = t46.float0 } in +let t_orig47 = { t47 with float0 = t47.float0 } in +let t_orig48 = { t48 with float_u0 = t48.float_u0 } in +let t_orig49 = { t49 with float_u0 = t49.float_u0 } in +let t_orig50 = { t50 with float0 = t50.float0 } in +let t_orig51 = { t51 with float0 = t51.float0 } in +let t_orig52 = { t52 with float_u0 = t52.float_u0 } in +let t_orig53 = { t53 with float_u0 = t53.float_u0 } in +let t_orig54 = { t54 with float_u0 = t54.float_u0 } in +let t_orig55 = { t55 with float_u0 = t55.float_u0 } in +let t_orig56 = { t56 with float0 = t56.float0 } in +let t_orig57 = { t57 with float0 = t57.float0 } in +let t_orig58 = { t58 with float0 = t58.float0 } in +let t_orig59 = { t59 with float0 = t59.float0 } in +let t_orig60 = { t60 with float_u0 = t60.float_u0 } in +let t_orig61 = { t61 with float_u0 = t61.float_u0 } in +let t_orig62 = { t62 with float0 = t62.float0 } in +let t_orig63 = { t63 with float0 = t63.float0 } in +let t_orig64 = { t64 with float_u0 = t64.float_u0 } in +let t_orig65 = { t65 with float_u0 = t65.float_u0 } in +let t_orig66 = { t66 with float0 = t66.float0 } in +let t_orig67 = { t67 with float0 = t67.float0 } in +let t_orig68 = { t68 with float0 = t68.float0 } in +let t_orig69 = { t69 with float0 = t69.float0 } in +let t_orig70 = { t70 with float0 = t70.float0 } in +let t_orig71 = { t71 with float0 = t71.float0 } in +let t_orig72 = { t72 with float_u0 = t72.float_u0 } in +let t_orig73 = { t73 with float_u0 = t73.float_u0 } in +let t_orig74 = { t74 with float0 = t74.float0 } in +let t_orig75 = { t75 with str0 = t75.str0 } in +let t_orig76 = { t76 with str0 = t76.str0 } in +let t_orig77 = { t77 with str0 = t77.str0 } in +let t_orig78 = { float32_u0 = t78.float32_u0 } in +let t_orig79 = { t79 with str0 = t79.str0 } in +let t_orig80 = { t80 with str0 = t80.str0 } in +let t_orig81 = { float32_u0 = t81.float32_u0 } in +let t_orig82 = { t82 with str0 = t82.str0 } in +let t_orig83 = { t83 with str0 = t83.str0 } in +let t_orig84 = { i32_0 = t84.i32_0 } in +let t_orig85 = { t85 with str0 = t85.str0 } in +let t_orig86 = { t86 with float0 = t86.float0 } in +let t_orig87 = { t87 with str0 = t87.str0 } in +let t_orig88 = { t88 with str0 = t88.str0 } in +let t_orig89 = { i32_0 = t89.i32_0 } in +let t_orig90 = { t90 with str0 = t90.str0 } in +let t_orig91 = { t91 with str0 = t91.str0 } in +let t_orig92 = { t92 with float0 = t92.float0 } in +let t_orig93 = { t93 with float0 = t93.float0 } in +let t_orig94 = { t94 with str0 = t94.str0 } in +let t_orig95 = { t95 with str0 = t95.str0 } in +let t_orig96 = { i64_0 = t96.i64_0 } in +let t_orig97 = { t97 with float0 = t97.float0 } in +let t_orig98 = { t98 with str0 = t98.str0 } in +let t_orig99 = { t99 with str0 = t99.str0 } in +let t_orig100 = { t100 with float0 = t100.float0 } in +let t_orig101 = { t101 with float0 = t101.float0 } in +let t_orig102 = { t102 with str0 = t102.str0 } in +let t_orig103 = { t103 with str0 = t103.str0 } in +let t_orig104 = { i64_0 = t104.i64_0 } in +let t_orig105 = { t105 with float0 = t105.float0 } in +let t_orig106 = { t106 with float0 = t106.float0 } in +let t_orig107 = { t107 with str0 = t107.str0 } in +let t_orig108 = { t108 with str0 = t108.str0 } in +let t_orig109 = { t109 with float0 = t109.float0 } in +let t_orig110 = { t110 with float0 = t110.float0 } in +let t_orig111 = { t111 with str0 = t111.str0 } in +let t_orig112 = { t112 with str0 = t112.str0 } in +let t_orig113 = { n0 = t113.n0 } in +let t_orig114 = { t114 with imm0 = t114.imm0 } in +let t_orig115 = { t115 with float0 = t115.float0 } in +let t_orig116 = { t116 with float0 = t116.float0 } in +let t_orig117 = { t117 with str0 = t117.str0 } in +let t_orig118 = { t118 with str0 = t118.str0 } in +let t_orig119 = { t119 with float0 = t119.float0 } in +let t_orig120 = { t120 with float0 = t120.float0 } in +let t_orig121 = { t121 with str0 = t121.str0 } in +let t_orig122 = { t122 with str0 = t122.str0 } in +let t_orig123 = { n0 = t123.n0 } in +let t_orig124 = { t124 with imm0 = t124.imm0 } in +let t_orig125 = { t125 with imm0 = t125.imm0 } in +let t_orig126 = { t126 with float0 = t126.float0 } in +let t_orig127 = { t127 with float0 = t127.float0 } in +let t_orig128 = { t128 with str0 = t128.str0 } in +let t_orig129 = { t129 with str0 = t129.str0 } in +let t_orig130 = { t130 with float0 = t130.float0 } in +let t_orig131 = { t131 with float0 = t131.float0 } in +let t_orig132 = { t132 with str0 = t132.str0 } in +let t_orig133 = { t133 with str0 = t133.str0 } in +let t_orig134 = { t134 with float_u0 = t134.float_u0 } in +let t_orig135 = { t135 with str0 = t135.str0 } in +let t_orig136 = { t136 with imm0 = t136.imm0 } in +let t_orig137 = { t137 with imm0 = t137.imm0 } in +let t_orig138 = { t138 with float0 = t138.float0 } in +let t_orig139 = { t139 with float0 = t139.float0 } in +let t_orig140 = { t140 with str0 = t140.str0 } in +let t_orig141 = { t141 with str0 = t141.str0 } in +let t_orig142 = { t142 with float0 = t142.float0 } in +let t_orig143 = { t143 with float0 = t143.float0 } in +let t_orig144 = { t144 with str0 = t144.str0 } in +let t_orig145 = { t145 with str0 = t145.str0 } in +let t_orig146 = { t146 with float_u0 = t146.float_u0 } in +let t_orig147 = { t147 with str0 = t147.str0 } in +let t_orig148 = { t148 with str0 = t148.str0 } in +let t_orig149 = { t149 with imm0 = t149.imm0 } in +let t_orig150 = { t150 with imm0 = t150.imm0 } in +let t_orig151 = { t151 with float0 = t151.float0 } in +let t_orig152 = { t152 with float0 = t152.float0 } in +let t_orig153 = { t153 with str0 = t153.str0 } in +let t_orig154 = { t154 with str0 = t154.str0 } in +let t_orig155 = { t155 with float0 = t155.float0 } in +let t_orig156 = { t156 with float0 = t156.float0 } in +let t_orig157 = { t157 with str0 = t157.str0 } in +let t_orig158 = { t158 with str0 = t158.str0 } in +let t_orig159 = { t159 with float32_u0 = t159.float32_u0 } in +let t_orig160 = { t160 with float0 = t160.float0 } in +let t_orig161 = { t161 with str0 = t161.str0 } in +let t_orig162 = { t162 with str0 = t162.str0 } in +let t_orig163 = { t163 with imm0 = t163.imm0 } in +let t_orig164 = { t164 with imm0 = t164.imm0 } in +let t_orig165 = { t165 with float0 = t165.float0 } in +let t_orig166 = { t166 with float0 = t166.float0 } in +let t_orig167 = { t167 with str0 = t167.str0 } in +let t_orig168 = { t168 with str0 = t168.str0 } in +let t_orig169 = { t169 with float0 = t169.float0 } in +let t_orig170 = { t170 with float0 = t170.float0 } in +let t_orig171 = { t171 with str0 = t171.str0 } in +let t_orig172 = { t172 with str0 = t172.str0 } in +let t_orig173 = { t173 with float32_u0 = t173.float32_u0 } in +let t_orig174 = { t174 with float0 = t174.float0 } in +let t_orig175 = { t175 with float0 = t175.float0 } in +let t_orig176 = { t176 with str0 = t176.str0 } in +let t_orig177 = { t177 with str0 = t177.str0 } in +let t_orig178 = { t178 with imm0 = t178.imm0 } in +let t_orig179 = { t179 with imm0 = t179.imm0 } in +let t_orig180 = { t180 with float0 = t180.float0 } in +let t_orig181 = { t181 with float0 = t181.float0 } in +let t_orig182 = { t182 with str0 = t182.str0 } in +let t_orig183 = { t183 with str0 = t183.str0 } in +let t_orig184 = { t184 with float0 = t184.float0 } in +let t_orig185 = { t185 with float0 = t185.float0 } in +let t_orig186 = { t186 with str0 = t186.str0 } in +let t_orig187 = { t187 with str0 = t187.str0 } in +let t_orig188 = { t188 with i32_0 = t188.i32_0 } in +let t_orig189 = { t189 with imm0 = t189.imm0 } in +let t_orig190 = { t190 with float0 = t190.float0 } in +let t_orig191 = { t191 with float0 = t191.float0 } in +let t_orig192 = { t192 with str0 = t192.str0 } in +let t_orig193 = { t193 with str0 = t193.str0 } in +let t_orig194 = { t194 with imm0 = t194.imm0 } in +let t_orig195 = { t195 with imm0 = t195.imm0 } in +let t_orig196 = { t196 with float0 = t196.float0 } in +let t_orig197 = { t197 with float0 = t197.float0 } in +let t_orig198 = { t198 with str0 = t198.str0 } in +let t_orig199 = { t199 with str0 = t199.str0 } in +let t_orig200 = { t200 with float0 = t200.float0 } in +let t_orig201 = { t201 with float0 = t201.float0 } in +let t_orig202 = { t202 with str0 = t202.str0 } in +let t_orig203 = { t203 with str0 = t203.str0 } in +let t_orig204 = { t204 with i32_0 = t204.i32_0 } in +let t_orig205 = { t205 with imm0 = t205.imm0 } in +let t_orig206 = { t206 with imm0 = t206.imm0 } in +let t_orig207 = { t207 with float0 = t207.float0 } in +let t_orig208 = { t208 with float0 = t208.float0 } in +let t_orig209 = { t209 with str0 = t209.str0 } in +let t_orig210 = { t210 with str0 = t210.str0 } in +let t_orig211 = { t211 with imm0 = t211.imm0 } in +let t_orig212 = { t212 with imm0 = t212.imm0 } in +let t_orig213 = { t213 with float0 = t213.float0 } in +let t_orig214 = { t214 with float0 = t214.float0 } in +let t_orig215 = { t215 with str0 = t215.str0 } in +let t_orig216 = { t216 with str0 = t216.str0 } in +let t_orig217 = { t217 with float0 = t217.float0 } in +let t_orig218 = { t218 with float0 = t218.float0 } in +let t_orig219 = { t219 with str0 = t219.str0 } in +let t_orig220 = { t220 with str0 = t220.str0 } in +let t_orig221 = { t221 with i64_0 = t221.i64_0 } in +let t_orig222 = { t222 with str0 = t222.str0 } in +let t_orig223 = { t223 with imm0 = t223.imm0 } in +let t_orig224 = { t224 with imm0 = t224.imm0 } in +let t_orig225 = { t225 with float0 = t225.float0 } in +let t_orig226 = { t226 with float0 = t226.float0 } in +let t_orig227 = { t227 with str0 = t227.str0 } in +let t_orig228 = { t228 with str0 = t228.str0 } in +let t_orig229 = { t229 with imm0 = t229.imm0 } in +let t_orig230 = { t230 with imm0 = t230.imm0 } in +let t_orig231 = { t231 with float0 = t231.float0 } in +let t_orig232 = { t232 with float0 = t232.float0 } in +let t_orig233 = { t233 with str0 = t233.str0 } in +let t_orig234 = { t234 with str0 = t234.str0 } in +let t_orig235 = { t235 with float0 = t235.float0 } in +let t_orig236 = { t236 with float0 = t236.float0 } in +let t_orig237 = { t237 with str0 = t237.str0 } in +let t_orig238 = { t238 with str0 = t238.str0 } in +let t_orig239 = { t239 with i64_0 = t239.i64_0 } in +let t_orig240 = { t240 with str0 = t240.str0 } in +let t_orig241 = { t241 with str0 = t241.str0 } in +let t_orig242 = { t242 with imm0 = t242.imm0 } in +let t_orig243 = { t243 with imm0 = t243.imm0 } in +let t_orig244 = { t244 with float0 = t244.float0 } in +let t_orig245 = { t245 with float0 = t245.float0 } in +let t_orig246 = { t246 with str0 = t246.str0 } in +let t_orig247 = { t247 with str0 = t247.str0 } in +let t_orig248 = { t248 with imm0 = t248.imm0 } in +let t_orig249 = { t249 with imm0 = t249.imm0 } in +let t_orig250 = { t250 with float0 = t250.float0 } in +let t_orig251 = { t251 with float0 = t251.float0 } in +let t_orig252 = { t252 with str0 = t252.str0 } in +let t_orig253 = { t253 with str0 = t253.str0 } in +let t_orig254 = { t254 with float0 = t254.float0 } in +let t_orig255 = { t255 with float0 = t255.float0 } in +let t_orig256 = { t256 with str0 = t256.str0 } in +let t_orig257 = { t257 with str0 = t257.str0 } in +let t_orig258 = { t258 with n0 = t258.n0 } in +let t_orig259 = { t259 with str0 = t259.str0 } in +let t_orig260 = { t260 with str0 = t260.str0 } in +let t_orig261 = { t261 with imm0 = t261.imm0 } in +let t_orig262 = { t262 with imm0 = t262.imm0 } in +let t_orig263 = { t263 with float0 = t263.float0 } in +let t_orig264 = { t264 with float0 = t264.float0 } in +let t_orig265 = { t265 with str0 = t265.str0 } in +let t_orig266 = { t266 with str0 = t266.str0 } in +let t_orig267 = { t267 with imm0 = t267.imm0 } in +let t_orig268 = { t268 with imm0 = t268.imm0 } in +let t_orig269 = { t269 with float0 = t269.float0 } in +let t_orig270 = { t270 with float0 = t270.float0 } in +let t_orig271 = { t271 with str0 = t271.str0 } in +let t_orig272 = { t272 with str0 = t272.str0 } in +let t_orig273 = { t273 with float0 = t273.float0 } in +let t_orig274 = { t274 with float0 = t274.float0 } in +let t_orig275 = { t275 with str0 = t275.str0 } in +let t_orig276 = { t276 with str0 = t276.str0 } in +let t_orig277 = { t277 with n0 = t277.n0 } in +let t_orig278 = { t278 with str0 = t278.str0 } in +let t_orig279 = { t279 with str0 = t279.str0 } in +let t_orig280 = { t280 with imm0 = t280.imm0 } in +let t_orig281 = { t281 with imm0 = t281.imm0 } in +let t_orig282 = { t282 with float0 = t282.float0 } in +let t_orig283 = { t283 with float0 = t283.float0 } in +let t_orig284 = { t284 with str0 = t284.str0 } in +let t_orig285 = { t285 with str0 = t285.str0 } in +let t_orig286 = { t286 with imm0 = t286.imm0 } in +let t_orig287 = { t287 with imm0 = t287.imm0 } in +let t_orig288 = { t288 with float0 = t288.float0 } in +let t_orig289 = { t289 with float0 = t289.float0 } in +let t_orig290 = { t290 with str0 = t290.str0 } in +let t_orig291 = { t291 with str0 = t291.str0 } in +let t_orig292 = { t292 with float0 = t292.float0 } in +let t_orig293 = { t293 with float0 = t293.float0 } in +let t_orig294 = { t294 with str0 = t294.str0 } in +let t_orig295 = { t295 with str0 = t295.str0 } in +let t_orig296 = { t296 with float_u0 = t296.float_u0 } in +let t_orig297 = { t297 with imm0 = t297.imm0 } in +let t_orig298 = { t298 with float0 = t298.float0 } in +let t_orig299 = { t299 with str0 = t299.str0 } in +let t_orig300_A = t300_A in +let t_orig301_A = t301_A in +let t_orig301_B = t301_B in +let t_orig302_A = t302_A in +let t_orig303_A = t303_A in +let t_orig303_B = t303_B in +let t_orig303_C = t303_C in +let t_orig304_A = t304_A in +let t_orig304_B = t304_B in +let t_orig305_A = t305_A in +let t_orig306_A = t306_A in +let t_orig306_B = t306_B in +let t_orig307_A = t307_A in +let t_orig307_B = t307_B in +let t_orig307_C = t307_C in +let t_orig308_A = t308_A in +let t_orig308_B = t308_B in +let t_orig309_A = t309_A in +let t_orig310_A = t310_A in +let t_orig310_B = t310_B in +let t_orig310_C = t310_C in +let t_orig310_D = t310_D in +let t_orig311_A = t311_A in +let t_orig311_B = t311_B in +let t_orig312_A = t312_A in +let t_orig312_B = t312_B in +let t_orig312_C = t312_C in +let t_orig313_A = t313_A in +let t_orig313_B = t313_B in +let t_orig314_A = t314_A in +let t_orig315_A = t315_A in +let t_orig315_B = t315_B in +let t_orig315_C = t315_C in +let t_orig316_A = t316_A in +let t_orig316_B = t316_B in +let t_orig316_C = t316_C in +let t_orig316_D = t316_D in +let t_orig317_A = t317_A in +let t_orig317_B = t317_B in +let t_orig318_A = t318_A in +let t_orig318_B = t318_B in +let t_orig318_C = t318_C in +let t_orig319_A = t319_A in +let t_orig319_B = t319_B in +let t_orig320_A = t320_A in +let t_orig321_A = t321_A in +let t_orig321_B = t321_B in +let t_orig322_A = t322_A in +let t_orig322_B = t322_B in +let t_orig322_C = t322_C in +let t_orig323_A = t323_A in +let t_orig323_B = t323_B in +let t_orig323_C = t323_C in +let t_orig323_D = t323_D in +let t_orig324_A = t324_A in +let t_orig324_B = t324_B in +let t_orig325_A = t325_A in +let t_orig325_B = t325_B in +let t_orig325_C = t325_C in +let t_orig326_A = t326_A in +let t_orig326_B = t326_B in +let t_orig327_A = t327_A in +let t_orig328_A = t328_A in +let t_orig328_B = t328_B in +let t_orig328_C = t328_C in +let t_orig329_A = t329_A in +let t_orig329_B = t329_B in +let t_orig330_A = t330_A in +let t_orig330_B = t330_B in +let t_orig330_C = t330_C in +let t_orig331_A = t331_A in +let t_orig331_B = t331_B in +let t_orig331_C = t331_C in +let t_orig331_D = t331_D in +let t_orig332_A = t332_A in +let t_orig332_B = t332_B in +let t_orig333_A = t333_A in +let t_orig333_B = t333_B in +let t_orig333_C = t333_C in +let t_orig334_A = t334_A in +let t_orig334_B = t334_B in +let t_orig335_A = t335_A in +let t_orig336_A = t336_A in +let t_orig336_B = t336_B in +let t_orig336_C = t336_C in +let t_orig336_D = t336_D in +let t_orig337_A = t337_A in +let t_orig337_B = t337_B in +let t_orig337_C = t337_C in +let t_orig338_A = t338_A in +let t_orig338_B = t338_B in +let t_orig339_A = t339_A in +let t_orig339_B = t339_B in +let t_orig339_C = t339_C in +let t_orig340_A = t340_A in +let t_orig340_B = t340_B in +let t_orig340_C = t340_C in +let t_orig340_D = t340_D in +let t_orig341_A = t341_A in +let t_orig341_B = t341_B in +let t_orig342_A = t342_A in +let t_orig342_B = t342_B in +let t_orig342_C = t342_C in +let t_orig343_A = t343_A in +let t_orig343_B = t343_B in +let t_orig344_A = t344_A in +let t_orig345_A = t345_A in +let t_orig345_B = t345_B in +let t_orig345_C = t345_C in +let t_orig346_A = t346_A in +let t_orig346_B = t346_B in +let t_orig346_C = t346_C in +let t_orig346_D = t346_D in +let t_orig347_A = t347_A in +let t_orig347_B = t347_B in +let t_orig347_C = t347_C in +let t_orig348_A = t348_A in +let t_orig348_B = t348_B in +let t_orig349_A = t349_A in +let t_orig349_B = t349_B in +let t_orig349_C = t349_C in +let t_orig350_A = t350_A in +let t_orig350_B = t350_B in +let t_orig350_C = t350_C in +let t_orig350_D = t350_D in +let t_orig351_A = t351_A in +let t_orig351_B = t351_B in +let t_orig352_A = t352_A in +let t_orig352_B = t352_B in +let t_orig352_C = t352_C in +let t_orig353_A = t353_A in +let t_orig353_B = t353_B in +let t_orig354_A = t354_A in +let t_orig355_A = t355_A in +let t_orig355_B = t355_B in +let t_orig356_A = t356_A in +let t_orig356_B = t356_B in +let t_orig356_C = t356_C in +let t_orig357_A = t357_A in +let t_orig357_B = t357_B in +let t_orig357_C = t357_C in +let t_orig357_D = t357_D in +let t_orig358_A = t358_A in +let t_orig358_B = t358_B in +let t_orig358_C = t358_C in +let t_orig359_A = t359_A in +let t_orig359_B = t359_B in +let t_orig360_A = t360_A in +let t_orig360_B = t360_B in +let t_orig360_C = t360_C in +let t_orig361_A = t361_A in +let t_orig361_B = t361_B in +let t_orig361_C = t361_C in +let t_orig361_D = t361_D in +let t_orig362_A = t362_A in +let t_orig362_B = t362_B in +let t_orig363_A = t363_A in +let t_orig363_B = t363_B in +let t_orig363_C = t363_C in +let t_orig364_A = t364_A in +let t_orig364_B = t364_B in +let t_orig365_A = t365_A in +let t_orig366_A = t366_A in +let t_orig366_B = t366_B in +let t_orig366_C = t366_C in +let t_orig366_D = t366_D in +let t_orig366_E = t366_E in +let t_orig367_A = t367_A in +let t_orig367_B = t367_B in +let t_orig368_A = t368_A in +let t_orig368_B = t368_B in +let t_orig368_C = t368_C in +let t_orig369_A = t369_A in +let t_orig369_B = t369_B in +let t_orig369_C = t369_C in +let t_orig369_D = t369_D in +let t_orig370_A = t370_A in +let t_orig370_B = t370_B in +let t_orig370_C = t370_C in +let t_orig371_A = t371_A in +let t_orig371_B = t371_B in +let t_orig372_A = t372_A in +let t_orig372_B = t372_B in +let t_orig372_C = t372_C in +let t_orig373_A = t373_A in +let t_orig373_B = t373_B in +let t_orig373_C = t373_C in +let t_orig373_D = t373_D in +let t_orig374_A = t374_A in +let t_orig374_B = t374_B in +let t_orig375_A = t375_A in +let t_orig375_B = t375_B in +let t_orig375_C = t375_C in +let t_orig376_A = t376_A in +let t_orig376_B = t376_B in +let t_orig377_A = t377_A in +let t_orig378_A = t378_A in +let t_orig378_B = t378_B in +let t_orig378_C = t378_C in +let t_orig379_A = t379_A in +let t_orig379_B = t379_B in +let t_orig379_C = t379_C in +let t_orig379_D = t379_D in +let t_orig379_E = t379_E in +let t_orig380_A = t380_A in +let t_orig380_B = t380_B in +let t_orig381_A = t381_A in +let t_orig381_B = t381_B in +let t_orig381_C = t381_C in +let t_orig382_A = t382_A in +let t_orig382_B = t382_B in +let t_orig382_C = t382_C in +let t_orig382_D = t382_D in +let t_orig383_A = t383_A in +let t_orig383_B = t383_B in +let t_orig383_C = t383_C in +let t_orig384_A = t384_A in +let t_orig384_B = t384_B in +let t_orig385_A = t385_A in +let t_orig385_B = t385_B in +let t_orig385_C = t385_C in +let t_orig386_A = t386_A in +let t_orig386_B = t386_B in +let t_orig386_C = t386_C in +let t_orig386_D = t386_D in +let t_orig387_A = t387_A in +let t_orig387_B = t387_B in +let t_orig388_A = t388_A in +let t_orig388_B = t388_B in +let t_orig388_C = t388_C in +let t_orig389_A = t389_A in +let t_orig389_B = t389_B in +let t_orig390_A = t390_A in +let t_orig391_A = t391_A in +let t_orig391_B = t391_B in +let t_orig391_C = t391_C in +let t_orig391_D = t391_D in +let t_orig392_A = t392_A in +let t_orig392_B = t392_B in +let t_orig392_C = t392_C in +let t_orig393_A = t393_A in +let t_orig393_B = t393_B in +let t_orig393_C = t393_C in +let t_orig393_D = t393_D in +let t_orig393_E = t393_E in +let t_orig394_A = t394_A in +let t_orig394_B = t394_B in +let t_orig395_A = t395_A in +let t_orig395_B = t395_B in +let t_orig395_C = t395_C in +let t_orig396_A = t396_A in +let t_orig396_B = t396_B in +let t_orig396_C = t396_C in +let t_orig396_D = t396_D in +let t_orig397_A = t397_A in +let t_orig397_B = t397_B in +let t_orig397_C = t397_C in +let t_orig398_A = t398_A in +let t_orig398_B = t398_B in +let t_orig399_A = t399_A in +let t_orig399_B = t399_B in +let t_orig399_C = t399_C in +let t_orig400_A = t400_A in +let t_orig400_B = t400_B in +let t_orig400_C = t400_C in +let t_orig400_D = t400_D in +let t_orig401_A = t401_A in +let t_orig401_B = t401_B in +let t_orig402_A = t402_A in +let t_orig402_B = t402_B in +let t_orig402_C = t402_C in +let t_orig403_A = t403_A in +let t_orig403_B = t403_B in +let t_orig404_A = t404_A in +let t_orig405_A = t405_A in +let t_orig405_B = t405_B in +let t_orig405_C = t405_C in +let t_orig406_A = t406_A in +let t_orig406_B = t406_B in +let t_orig406_C = t406_C in +let t_orig406_D = t406_D in +let t_orig407_A = t407_A in +let t_orig407_B = t407_B in +let t_orig407_C = t407_C in +let t_orig408_A = t408_A in +let t_orig408_B = t408_B in +let t_orig408_C = t408_C in +let t_orig408_D = t408_D in +let t_orig408_E = t408_E in +let t_orig409_A = t409_A in +let t_orig409_B = t409_B in +let t_orig410_A = t410_A in +let t_orig410_B = t410_B in +let t_orig410_C = t410_C in +let t_orig411_A = t411_A in +let t_orig411_B = t411_B in +let t_orig411_C = t411_C in +let t_orig411_D = t411_D in +let t_orig412_A = t412_A in +let t_orig412_B = t412_B in +let t_orig412_C = t412_C in +let t_orig413_A = t413_A in +let t_orig413_B = t413_B in +let t_orig414_A = t414_A in +let t_orig414_B = t414_B in +let t_orig414_C = t414_C in +let t_orig415_A = t415_A in +let t_orig415_B = t415_B in +let t_orig415_C = t415_C in +let t_orig415_D = t415_D in +let t_orig416_A = t416_A in +let t_orig416_B = t416_B in +let t_orig417_A = t417_A in +let t_orig417_B = t417_B in +let t_orig417_C = t417_C in +let t_orig418_A = t418_A in +let t_orig418_B = t418_B in +let t_orig419_A = t419_A in +let t_orig420_A = t420_A in +let t_orig420_B = t420_B in +let t_orig421_A = t421_A in +let t_orig421_B = t421_B in +let t_orig421_C = t421_C in +let t_orig422_A = t422_A in +let t_orig422_B = t422_B in +let t_orig422_C = t422_C in +let t_orig422_D = t422_D in +let t_orig423_A = t423_A in +let t_orig423_B = t423_B in +let t_orig423_C = t423_C in +let t_orig424_A = t424_A in +let t_orig424_B = t424_B in +let t_orig424_C = t424_C in +let t_orig424_D = t424_D in +let t_orig424_E = t424_E in +let t_orig425_A = t425_A in +let t_orig425_B = t425_B in +let t_orig426_A = t426_A in +let t_orig426_B = t426_B in +let t_orig426_C = t426_C in +let t_orig427_A = t427_A in +let t_orig427_B = t427_B in +let t_orig427_C = t427_C in +let t_orig427_D = t427_D in +let t_orig428_A = t428_A in +let t_orig428_B = t428_B in +let t_orig428_C = t428_C in +let t_orig429_A = t429_A in +let t_orig429_B = t429_B in +let t_orig430_A = t430_A in +let t_orig430_B = t430_B in +let t_orig430_C = t430_C in +let t_orig431_A = t431_A in +let t_orig431_B = t431_B in +let t_orig431_C = t431_C in +let t_orig431_D = t431_D in +let t_orig432_A = t432_A in +let t_orig432_B = t432_B in +let t_orig433_A = t433_A in +let t_orig433_B = t433_B in +let t_orig433_C = t433_C in +let t_orig434_A = t434_A in +let t_orig434_B = t434_B in +let t_orig435_A = t435_A in +let t_orig436_A = t436_A in +let t_orig436_B = t436_B in +let t_orig436_C = t436_C in +let t_orig436_D = t436_D in +let t_orig437_A = t437_A in +let t_orig437_B = t437_B in +let t_orig438_A = t438_A in +let t_orig438_B = t438_B in +let t_orig438_C = t438_C in +let t_orig439_A = t439_A in +let t_orig439_B = t439_B in +let t_orig439_C = t439_C in +let t_orig439_D = t439_D in +let t_orig440_A = t440_A in +let t_orig440_B = t440_B in +let t_orig440_C = t440_C in +let t_orig441_A = t441_A in +let t_orig441_B = t441_B in +let t_orig441_C = t441_C in +let t_orig441_D = t441_D in +let t_orig441_E = t441_E in +let t_orig442_A = t442_A in +let t_orig442_B = t442_B in +let t_orig443_A = t443_A in +let t_orig443_B = t443_B in +let t_orig443_C = t443_C in +let t_orig444_A = t444_A in +let t_orig444_B = t444_B in +let t_orig444_C = t444_C in +let t_orig444_D = t444_D in +let t_orig445_A = t445_A in +let t_orig445_B = t445_B in +let t_orig445_C = t445_C in +let t_orig446_A = t446_A in +let t_orig446_B = t446_B in +let t_orig447_A = t447_A in +let t_orig447_B = t447_B in +let t_orig447_C = t447_C in +let t_orig448_A = t448_A in +let t_orig448_B = t448_B in +let t_orig448_C = t448_C in +let t_orig448_D = t448_D in +let t_orig449_A = t449_A in +let t_orig449_B = t449_B in +let t_orig450_A = t450_A in +let t_orig450_B = t450_B in +let t_orig450_C = t450_C in +let t_orig451_A = t451_A in +let t_orig451_B = t451_B in +let t_orig452_A = t452_A in +let t_orig453_A = t453_A in +let t_orig453_B = t453_B in +let t_orig453_C = t453_C in +let t_orig453_D = t453_D in +let t_orig453_E = t453_E in +let t_orig454_A = t454_A in +let t_orig454_B = t454_B in +let t_orig454_C = t454_C in +let t_orig454_D = t454_D in +let t_orig455_A = t455_A in +let t_orig455_B = t455_B in +let t_orig456_A = t456_A in +let t_orig456_B = t456_B in +let t_orig456_C = t456_C in +let t_orig457_A = t457_A in +let t_orig457_B = t457_B in +let t_orig457_C = t457_C in +let t_orig457_D = t457_D in +let t_orig458_A = t458_A in +let t_orig458_B = t458_B in +let t_orig458_C = t458_C in +let t_orig459_A = t459_A in +let t_orig459_B = t459_B in +let t_orig459_C = t459_C in +let t_orig459_D = t459_D in +let t_orig459_E = t459_E in +let t_orig460_A = t460_A in +let t_orig460_B = t460_B in +let t_orig461_A = t461_A in +let t_orig461_B = t461_B in +let t_orig461_C = t461_C in +let t_orig462_A = t462_A in +let t_orig462_B = t462_B in +let t_orig462_C = t462_C in +let t_orig462_D = t462_D in +let t_orig463_A = t463_A in +let t_orig463_B = t463_B in +let t_orig463_C = t463_C in +let t_orig464_A = t464_A in +let t_orig464_B = t464_B in +let t_orig465_A = t465_A in +let t_orig465_B = t465_B in +let t_orig465_C = t465_C in +let t_orig466_A = t466_A in +let t_orig466_B = t466_B in +let t_orig466_C = t466_C in +let t_orig466_D = t466_D in +let t_orig467_A = t467_A in +let t_orig467_B = t467_B in +let t_orig468_A = t468_A in +let t_orig468_B = t468_B in +let t_orig468_C = t468_C in +let t_orig469_A = t469_A in +let t_orig469_B = t469_B in +let t_orig470_A = t470_A in +let t_orig471_A = t471_A in +let t_orig471_B = t471_B in +let t_orig471_C = t471_C in +let t_orig472_A = t472_A in +let t_orig472_B = t472_B in +let t_orig472_C = t472_C in +let t_orig472_D = t472_D in +let t_orig472_E = t472_E in +let t_orig473_A = t473_A in +let t_orig473_B = t473_B in +let t_orig473_C = t473_C in +let t_orig473_D = t473_D in +let t_orig474_A = t474_A in +let t_orig474_B = t474_B in +let t_orig475_A = t475_A in +let t_orig475_B = t475_B in +let t_orig475_C = t475_C in +let t_orig476_A = t476_A in +let t_orig476_B = t476_B in +let t_orig476_C = t476_C in +let t_orig476_D = t476_D in +let t_orig477_A = t477_A in +let t_orig477_B = t477_B in +let t_orig477_C = t477_C in +let t_orig478_A = t478_A in +let t_orig478_B = t478_B in +let t_orig478_C = t478_C in +let t_orig478_D = t478_D in +let t_orig478_E = t478_E in +let t_orig479_A = t479_A in +let t_orig479_B = t479_B in +let t_orig480_A = t480_A in +let t_orig480_B = t480_B in +let t_orig480_C = t480_C in +let t_orig481_A = t481_A in +let t_orig481_B = t481_B in +let t_orig481_C = t481_C in +let t_orig481_D = t481_D in +let t_orig482_A = t482_A in +let t_orig482_B = t482_B in +let t_orig482_C = t482_C in +let t_orig483_A = t483_A in +let t_orig483_B = t483_B in +let t_orig484_A = t484_A in +let t_orig484_B = t484_B in +let t_orig484_C = t484_C in +let t_orig485_A = t485_A in +let t_orig485_B = t485_B in +let t_orig485_C = t485_C in +let t_orig485_D = t485_D in +let t_orig486_A = t486_A in +let t_orig486_B = t486_B in +let t_orig487_A = t487_A in +let t_orig487_B = t487_B in +let t_orig487_C = t487_C in +let t_orig488_A = t488_A in +let t_orig488_B = t488_B in +let t_orig489_A = t489_A in +let t_orig490_A = t490_A in +let t_orig490_B = t490_B in +let t_orig490_C = t490_C in +let t_orig490_D = t490_D in +let t_orig491_A = t491_A in +let t_orig491_B = t491_B in +let t_orig491_C = t491_C in +let t_orig492_A = t492_A in +let t_orig492_B = t492_B in +let t_orig492_C = t492_C in +let t_orig492_D = t492_D in +let t_orig492_E = t492_E in +let t_orig493_A = t493_A in +let t_orig493_B = t493_B in +let t_orig493_C = t493_C in +let t_orig493_D = t493_D in +let t_orig494_A = t494_A in +let t_orig494_B = t494_B in +let t_orig495_A = t495_A in +let t_orig495_B = t495_B in +let t_orig495_C = t495_C in +let t_orig496_A = t496_A in +let t_orig496_B = t496_B in +let t_orig496_C = t496_C in +let t_orig496_D = t496_D in +let t_orig497_A = t497_A in +let t_orig497_B = t497_B in +let t_orig497_C = t497_C in +let t_orig498_A = t498_A in +let t_orig498_B = t498_B in +let t_orig498_C = t498_C in +let t_orig498_D = t498_D in +let t_orig498_E = t498_E in +let t_orig499_A = t499_A in +let t_orig499_B = t499_B in +let t_orig500_A = t500_A in +let t_orig500_B = t500_B in +let t_orig500_C = t500_C in +let t_orig501_A = t501_A in +let t_orig501_B = t501_B in +let t_orig501_C = t501_C in +let t_orig501_D = t501_D in +let t_orig502_A = t502_A in +let t_orig502_B = t502_B in +let t_orig502_C = t502_C in +let t_orig503_A = t503_A in +let t_orig503_B = t503_B in +let t_orig504_A = t504_A in +let t_orig504_B = t504_B in +let t_orig504_C = t504_C in +let t_orig505_A = t505_A in +let t_orig505_B = t505_B in +let t_orig505_C = t505_C in +let t_orig505_D = t505_D in +let t_orig506_A = t506_A in +let t_orig506_B = t506_B in +let t_orig507_A = t507_A in +let t_orig507_B = t507_B in +let t_orig507_C = t507_C in +let t_orig508_A = t508_A in +let t_orig508_B = t508_B in +let t_orig509_A = t509_A in +let t_orig510_A = t510_A in +let t_orig510_B = t510_B in +let t_orig510_C = t510_C in +let t_orig511_A = t511_A in +let t_orig511_B = t511_B in +let t_orig511_C = t511_C in +let t_orig511_D = t511_D in +let t_orig512_A = t512_A in +let t_orig512_B = t512_B in +let t_orig512_C = t512_C in +let t_orig513_A = t513_A in +let t_orig513_B = t513_B in +let t_orig513_C = t513_C in +let t_orig513_D = t513_D in +let t_orig513_E = t513_E in +let t_orig514_A = t514_A in +let t_orig514_B = t514_B in +let t_orig514_C = t514_C in +let t_orig514_D = t514_D in +let t_orig515_A = t515_A in +let t_orig515_B = t515_B in +let t_orig516_A = t516_A in +let t_orig516_B = t516_B in +let t_orig516_C = t516_C in +let t_orig517_A = t517_A in +let t_orig517_B = t517_B in +let t_orig517_C = t517_C in +let t_orig517_D = t517_D in +let t_orig518_A = t518_A in +let t_orig518_B = t518_B in +let t_orig518_C = t518_C in +let t_orig519_A = t519_A in +let t_orig519_B = t519_B in +let t_orig519_C = t519_C in +let t_orig519_D = t519_D in +let t_orig519_E = t519_E in +let t_orig520_A = t520_A in +let t_orig520_B = t520_B in +let t_orig521_A = t521_A in +let t_orig521_B = t521_B in +let t_orig521_C = t521_C in +let t_orig522_A = t522_A in +let t_orig522_B = t522_B in +let t_orig522_C = t522_C in +let t_orig522_D = t522_D in +let t_orig523_A = t523_A in +let t_orig523_B = t523_B in +let t_orig523_C = t523_C in +let t_orig524_A = t524_A in +let t_orig524_B = t524_B in +let t_orig525_A = t525_A in +let t_orig525_B = t525_B in +let t_orig525_C = t525_C in +let t_orig526_A = t526_A in +let t_orig526_B = t526_B in +let t_orig526_C = t526_C in +let t_orig526_D = t526_D in +let t_orig527_A = t527_A in +let t_orig527_B = t527_B in +let t_orig528_A = t528_A in +let t_orig528_B = t528_B in +let t_orig528_C = t528_C in +let t_orig529_A = t529_A in +let t_orig529_B = t529_B in +let t_orig530_A = t530_A in +let t_orig531_A = t531_A in +let t_orig531_B = t531_B in +let t_orig532_A = t532_A in +let t_orig532_B = t532_B in +let t_orig532_C = t532_C in +let t_orig533_A = t533_A in +let t_orig533_B = t533_B in +let t_orig533_C = t533_C in +let t_orig533_D = t533_D in +let t_orig534_A = t534_A in +let t_orig534_B = t534_B in +let t_orig534_C = t534_C in +let t_orig535_A = t535_A in +let t_orig535_B = t535_B in +let t_orig535_C = t535_C in +let t_orig535_D = t535_D in +let t_orig535_E = t535_E in +let t_orig536_A = t536_A in +let t_orig536_B = t536_B in +let t_orig536_C = t536_C in +let t_orig536_D = t536_D in +let t_orig537_A = t537_A in +let t_orig537_B = t537_B in +let t_orig538_A = t538_A in +let t_orig538_B = t538_B in +let t_orig538_C = t538_C in +let t_orig539_A = t539_A in +let t_orig539_B = t539_B in +let t_orig539_C = t539_C in +let t_orig539_D = t539_D in +let t_orig540_A = t540_A in +let t_orig540_B = t540_B in +let t_orig540_C = t540_C in +let t_orig541_A = t541_A in +let t_orig541_B = t541_B in +let t_orig541_C = t541_C in +let t_orig541_D = t541_D in +let t_orig541_E = t541_E in +let t_orig542_A = t542_A in +let t_orig542_B = t542_B in +let t_orig543_A = t543_A in +let t_orig543_B = t543_B in +let t_orig543_C = t543_C in +let t_orig544_A = t544_A in +let t_orig544_B = t544_B in +let t_orig544_C = t544_C in +let t_orig544_D = t544_D in +let t_orig545_A = t545_A in +let t_orig545_B = t545_B in +let t_orig545_C = t545_C in +let t_orig546_A = t546_A in +let t_orig546_B = t546_B in +let t_orig547_A = t547_A in +let t_orig547_B = t547_B in +let t_orig547_C = t547_C in +let t_orig548_A = t548_A in +let t_orig548_B = t548_B in +let t_orig548_C = t548_C in +let t_orig548_D = t548_D in +let t_orig549_A = t549_A in +let t_orig549_B = t549_B in +let t_orig550_A = t550_A in +let t_orig550_B = t550_B in +let t_orig550_C = t550_C in +let t_orig551_A = t551_A in +let t_orig551_B = t551_B in +let t_orig552_A = t552_A in +let t_orig553_A = t553_A in +let t_orig553_B = t553_B in +let t_orig553_C = t553_C in +let t_orig554_A = t554_A in +let t_orig554_B = t554_B in +let t_orig555_A = t555_A in +let t_orig555_B = t555_B in +let t_orig555_C = t555_C in +let t_orig556_A = t556_A in +let t_orig556_B = t556_B in +let t_orig556_C = t556_C in +let t_orig556_D = t556_D in +let t_orig557_A = t557_A in +let t_orig557_B = t557_B in +let t_orig557_C = t557_C in +let t_orig558_A = t558_A in +let t_orig558_B = t558_B in +let t_orig558_C = t558_C in +let t_orig558_D = t558_D in +let t_orig558_E = t558_E in +let t_orig559_A = t559_A in +let t_orig559_B = t559_B in +let t_orig559_C = t559_C in +let t_orig559_D = t559_D in +let t_orig560_A = t560_A in +let t_orig560_B = t560_B in +let t_orig561_A = t561_A in +let t_orig561_B = t561_B in +let t_orig561_C = t561_C in +let t_orig562_A = t562_A in +let t_orig562_B = t562_B in +let t_orig562_C = t562_C in +let t_orig562_D = t562_D in +let t_orig563_A = t563_A in +let t_orig563_B = t563_B in +let t_orig563_C = t563_C in +let t_orig564_A = t564_A in +let t_orig564_B = t564_B in +let t_orig564_C = t564_C in +let t_orig564_D = t564_D in +let t_orig564_E = t564_E in +let t_orig565_A = t565_A in +let t_orig565_B = t565_B in +let t_orig566_A = t566_A in +let t_orig566_B = t566_B in +let t_orig566_C = t566_C in +let t_orig567_A = t567_A in +let t_orig567_B = t567_B in +let t_orig567_C = t567_C in +let t_orig567_D = t567_D in +let t_orig568_A = t568_A in +let t_orig568_B = t568_B in +let t_orig568_C = t568_C in +let t_orig569_A = t569_A in +let t_orig569_B = t569_B in +let t_orig570_A = t570_A in +let t_orig570_B = t570_B in +let t_orig570_C = t570_C in +let t_orig571_A = t571_A in +let t_orig571_B = t571_B in +let t_orig571_C = t571_C in +let t_orig571_D = t571_D in +let t_orig572_A = t572_A in +let t_orig572_B = t572_B in +let t_orig573_A = t573_A in +let t_orig573_B = t573_B in +let t_orig573_C = t573_C in +let t_orig574_A = t574_A in +let t_orig574_B = t574_B in +let t_orig575_A = t575_A in +let t_orig576_A = t576_A in +let t_orig576_B = t576_B in +let t_orig576_C = t576_C in +let t_orig576_D = t576_D in +let t_orig577_A = t577_A in +let t_orig577_B = t577_B in +let t_orig577_C = t577_C in +let t_orig578_A = t578_A in +let t_orig578_B = t578_B in +let t_orig579_A = t579_A in +let t_orig579_B = t579_B in +let t_orig579_C = t579_C in +let t_orig580_A = t580_A in +let t_orig580_B = t580_B in +let t_orig580_C = t580_C in +let t_orig580_D = t580_D in +let t_orig581_A = t581_A in +let t_orig581_B = t581_B in +let t_orig581_C = t581_C in +let t_orig582_A = t582_A in +let t_orig582_B = t582_B in +let t_orig582_C = t582_C in +let t_orig582_D = t582_D in +let t_orig582_E = t582_E in +let t_orig583_A = t583_A in +let t_orig583_B = t583_B in +let t_orig583_C = t583_C in +let t_orig583_D = t583_D in +let t_orig584_A = t584_A in +let t_orig584_B = t584_B in +let t_orig585_A = t585_A in +let t_orig585_B = t585_B in +let t_orig585_C = t585_C in +let t_orig586_A = t586_A in +let t_orig586_B = t586_B in +let t_orig586_C = t586_C in +let t_orig586_D = t586_D in +let t_orig587_A = t587_A in +let t_orig587_B = t587_B in +let t_orig587_C = t587_C in +let t_orig588_A = t588_A in +let t_orig588_B = t588_B in +let t_orig588_C = t588_C in +let t_orig588_D = t588_D in +let t_orig588_E = t588_E in +let t_orig589_A = t589_A in +let t_orig589_B = t589_B in +let t_orig590_A = t590_A in +let t_orig590_B = t590_B in +let t_orig590_C = t590_C in +let t_orig591_A = t591_A in +let t_orig591_B = t591_B in +let t_orig591_C = t591_C in +let t_orig591_D = t591_D in +let t_orig592_A = t592_A in +let t_orig592_B = t592_B in +let t_orig592_C = t592_C in +let t_orig593_A = t593_A in +let t_orig593_B = t593_B in +let t_orig594_A = t594_A in +let t_orig594_B = t594_B in +let t_orig594_C = t594_C in +let t_orig595_A = t595_A in +let t_orig595_B = t595_B in +let t_orig595_C = t595_C in +let t_orig595_D = t595_D in +let t_orig596_A = t596_A in +let t_orig596_B = t596_B in +let t_orig597_A = t597_A in +let t_orig597_B = t597_B in +let t_orig597_C = t597_C in +let t_orig598_A = t598_A in +let t_orig598_B = t598_B in +let t_orig599_A = t599_A in + +(* Checks *) + let run_checks (t0 : t0) (t1 : t1) (t2 : t2) (t3 : t3) (t4 : t4) (t5 : t5) (t6 : t6) (t7 : t7) (t8 : t8) (t9 : t9) (t10 : t10) (t11 : t11) (t12 : t12) (t13 : t13) (t14 : t14) (t15 : t15) (t16 : t16) (t17 : t17) (t18 : t18) (t19 : t19) (t20 : t20) (t21 : t21) (t22 : t22) (t23 : t23) (t24 : t24) (t25 : t25) (t26 : t26) (t27 : t27) (t28 : t28) (t29 : t29) (t30 : t30) (t31 : t31) (t32 : t32) (t33 : t33) (t34 : t34) (t35 : t35) (t36 : t36) (t37 : t37) (t38 : t38) (t39 : t39) (t40 : t40) (t41 : t41) (t42 : t42) (t43 : t43) (t44 : t44) (t45 : t45) (t46 : t46) (t47 : t47) (t48 : t48) (t49 : t49) (t50 : t50) (t51 : t51) (t52 : t52) (t53 : t53) (t54 : t54) (t55 : t55) (t56 : t56) (t57 : t57) (t58 : t58) (t59 : t59) (t60 : t60) (t61 : t61) (t62 : t62) (t63 : t63) (t64 : t64) (t65 : t65) (t66 : t66) (t67 : t67) (t68 : t68) (t69 : t69) (t70 : t70) (t71 : t71) (t72 : t72) (t73 : t73) (t74 : t74) (t75 : t75) (t76 : t76) (t77 : t77) (t78 : t78) (t79 : t79) (t80 : t80) (t81 : t81) (t82 : t82) (t83 : t83) (t84 : t84) (t85 : t85) (t86 : t86) (t87 : t87) (t88 : t88) (t89 : t89) (t90 : t90) (t91 : t91) (t92 : t92) (t93 : t93) (t94 : t94) (t95 : t95) (t96 : t96) (t97 : t97) (t98 : t98) (t99 : t99) (t100 : t100) (t101 : t101) (t102 : t102) (t103 : t103) (t104 : t104) (t105 : t105) (t106 : t106) (t107 : t107) (t108 : t108) (t109 : t109) (t110 : t110) (t111 : t111) (t112 : t112) (t113 : t113) (t114 : t114) (t115 : t115) (t116 : t116) (t117 : t117) (t118 : t118) (t119 : t119) (t120 : t120) (t121 : t121) (t122 : t122) (t123 : t123) (t124 : t124) (t125 : t125) (t126 : t126) (t127 : t127) (t128 : t128) (t129 : t129) (t130 : t130) (t131 : t131) (t132 : t132) (t133 : t133) (t134 : t134) (t135 : t135) (t136 : t136) (t137 : t137) (t138 : t138) (t139 : t139) (t140 : t140) (t141 : t141) (t142 : t142) (t143 : t143) (t144 : t144) (t145 : t145) (t146 : t146) (t147 : t147) (t148 : t148) (t149 : t149) (t150 : t150) (t151 : t151) (t152 : t152) (t153 : t153) (t154 : t154) (t155 : t155) (t156 : t156) (t157 : t157) (t158 : t158) (t159 : t159) (t160 : t160) (t161 : t161) (t162 : t162) (t163 : t163) (t164 : t164) (t165 : t165) (t166 : t166) (t167 : t167) (t168 : t168) (t169 : t169) (t170 : t170) (t171 : t171) (t172 : t172) (t173 : t173) (t174 : t174) (t175 : t175) (t176 : t176) (t177 : t177) (t178 : t178) (t179 : t179) (t180 : t180) (t181 : t181) (t182 : t182) (t183 : t183) (t184 : t184) (t185 : t185) (t186 : t186) (t187 : t187) (t188 : t188) (t189 : t189) (t190 : t190) (t191 : t191) (t192 : t192) (t193 : t193) (t194 : t194) (t195 : t195) (t196 : t196) (t197 : t197) (t198 : t198) (t199 : t199) (t200 : t200) (t201 : t201) (t202 : t202) (t203 : t203) (t204 : t204) (t205 : t205) (t206 : t206) (t207 : t207) (t208 : t208) (t209 : t209) (t210 : t210) (t211 : t211) (t212 : t212) (t213 : t213) (t214 : t214) (t215 : t215) (t216 : t216) (t217 : t217) (t218 : t218) (t219 : t219) (t220 : t220) (t221 : t221) (t222 : t222) (t223 : t223) (t224 : t224) (t225 : t225) (t226 : t226) (t227 : t227) (t228 : t228) (t229 : t229) (t230 : t230) (t231 : t231) (t232 : t232) (t233 : t233) (t234 : t234) (t235 : t235) (t236 : t236) (t237 : t237) (t238 : t238) (t239 : t239) (t240 : t240) (t241 : t241) (t242 : t242) (t243 : t243) (t244 : t244) (t245 : t245) (t246 : t246) (t247 : t247) (t248 : t248) (t249 : t249) (t250 : t250) (t251 : t251) (t252 : t252) (t253 : t253) (t254 : t254) (t255 : t255) (t256 : t256) (t257 : t257) (t258 : t258) (t259 : t259) (t260 : t260) (t261 : t261) (t262 : t262) (t263 : t263) (t264 : t264) (t265 : t265) (t266 : t266) (t267 : t267) (t268 : t268) (t269 : t269) (t270 : t270) (t271 : t271) (t272 : t272) (t273 : t273) (t274 : t274) (t275 : t275) (t276 : t276) (t277 : t277) (t278 : t278) (t279 : t279) (t280 : t280) (t281 : t281) (t282 : t282) (t283 : t283) (t284 : t284) (t285 : t285) (t286 : t286) (t287 : t287) (t288 : t288) (t289 : t289) (t290 : t290) (t291 : t291) (t292 : t292) (t293 : t293) (t294 : t294) (t295 : t295) (t296 : t296) (t297 : t297) (t298 : t298) (t299 : t299) (t300_A : t300) (t301_A : t301) (t301_B : t301) (t302_A : t302) (t303_A : t303) (t303_B : t303) (t303_C : t303) (t304_A : t304) (t304_B : t304) (t305_A : t305) (t306_A : t306) (t306_B : t306) (t307_A : t307) (t307_B : t307) (t307_C : t307) (t308_A : t308) (t308_B : t308) (t309_A : t309) (t310_A : t310) (t310_B : t310) (t310_C : t310) (t310_D : t310) (t311_A : t311) (t311_B : t311) (t312_A : t312) (t312_B : t312) (t312_C : t312) (t313_A : t313) (t313_B : t313) (t314_A : t314) (t315_A : t315) (t315_B : t315) (t315_C : t315) (t316_A : t316) (t316_B : t316) (t316_C : t316) (t316_D : t316) (t317_A : t317) (t317_B : t317) (t318_A : t318) (t318_B : t318) (t318_C : t318) (t319_A : t319) (t319_B : t319) (t320_A : t320) (t321_A : t321) (t321_B : t321) (t322_A : t322) (t322_B : t322) (t322_C : t322) (t323_A : t323) (t323_B : t323) (t323_C : t323) (t323_D : t323) (t324_A : t324) (t324_B : t324) (t325_A : t325) (t325_B : t325) (t325_C : t325) (t326_A : t326) (t326_B : t326) (t327_A : t327) (t328_A : t328) (t328_B : t328) (t328_C : t328) (t329_A : t329) (t329_B : t329) (t330_A : t330) (t330_B : t330) (t330_C : t330) (t331_A : t331) (t331_B : t331) (t331_C : t331) (t331_D : t331) (t332_A : t332) (t332_B : t332) (t333_A : t333) (t333_B : t333) (t333_C : t333) (t334_A : t334) (t334_B : t334) (t335_A : t335) (t336_A : t336) (t336_B : t336) (t336_C : t336) (t336_D : t336) (t337_A : t337) (t337_B : t337) (t337_C : t337) (t338_A : t338) (t338_B : t338) (t339_A : t339) (t339_B : t339) (t339_C : t339) (t340_A : t340) (t340_B : t340) (t340_C : t340) (t340_D : t340) (t341_A : t341) (t341_B : t341) (t342_A : t342) (t342_B : t342) (t342_C : t342) (t343_A : t343) (t343_B : t343) (t344_A : t344) (t345_A : t345) (t345_B : t345) (t345_C : t345) (t346_A : t346) (t346_B : t346) (t346_C : t346) (t346_D : t346) (t347_A : t347) (t347_B : t347) (t347_C : t347) (t348_A : t348) (t348_B : t348) (t349_A : t349) (t349_B : t349) (t349_C : t349) (t350_A : t350) (t350_B : t350) (t350_C : t350) (t350_D : t350) (t351_A : t351) (t351_B : t351) (t352_A : t352) (t352_B : t352) (t352_C : t352) (t353_A : t353) (t353_B : t353) (t354_A : t354) (t355_A : t355) (t355_B : t355) (t356_A : t356) (t356_B : t356) (t356_C : t356) (t357_A : t357) (t357_B : t357) (t357_C : t357) (t357_D : t357) (t358_A : t358) (t358_B : t358) (t358_C : t358) (t359_A : t359) (t359_B : t359) (t360_A : t360) (t360_B : t360) (t360_C : t360) (t361_A : t361) (t361_B : t361) (t361_C : t361) (t361_D : t361) (t362_A : t362) (t362_B : t362) (t363_A : t363) (t363_B : t363) (t363_C : t363) (t364_A : t364) (t364_B : t364) (t365_A : t365) (t366_A : t366) (t366_B : t366) (t366_C : t366) (t366_D : t366) (t366_E : t366) (t367_A : t367) (t367_B : t367) (t368_A : t368) (t368_B : t368) (t368_C : t368) (t369_A : t369) (t369_B : t369) (t369_C : t369) (t369_D : t369) (t370_A : t370) (t370_B : t370) (t370_C : t370) (t371_A : t371) (t371_B : t371) (t372_A : t372) (t372_B : t372) (t372_C : t372) (t373_A : t373) (t373_B : t373) (t373_C : t373) (t373_D : t373) (t374_A : t374) (t374_B : t374) (t375_A : t375) (t375_B : t375) (t375_C : t375) (t376_A : t376) (t376_B : t376) (t377_A : t377) (t378_A : t378) (t378_B : t378) (t378_C : t378) (t379_A : t379) (t379_B : t379) (t379_C : t379) (t379_D : t379) (t379_E : t379) (t380_A : t380) (t380_B : t380) (t381_A : t381) (t381_B : t381) (t381_C : t381) (t382_A : t382) (t382_B : t382) (t382_C : t382) (t382_D : t382) (t383_A : t383) (t383_B : t383) (t383_C : t383) (t384_A : t384) (t384_B : t384) (t385_A : t385) (t385_B : t385) (t385_C : t385) (t386_A : t386) (t386_B : t386) (t386_C : t386) (t386_D : t386) (t387_A : t387) (t387_B : t387) (t388_A : t388) (t388_B : t388) (t388_C : t388) (t389_A : t389) (t389_B : t389) (t390_A : t390) (t391_A : t391) (t391_B : t391) (t391_C : t391) (t391_D : t391) (t392_A : t392) (t392_B : t392) (t392_C : t392) (t393_A : t393) (t393_B : t393) (t393_C : t393) (t393_D : t393) (t393_E : t393) (t394_A : t394) (t394_B : t394) (t395_A : t395) (t395_B : t395) (t395_C : t395) (t396_A : t396) (t396_B : t396) (t396_C : t396) (t396_D : t396) (t397_A : t397) (t397_B : t397) (t397_C : t397) (t398_A : t398) (t398_B : t398) (t399_A : t399) (t399_B : t399) (t399_C : t399) (t400_A : t400) (t400_B : t400) (t400_C : t400) (t400_D : t400) (t401_A : t401) (t401_B : t401) (t402_A : t402) (t402_B : t402) (t402_C : t402) (t403_A : t403) (t403_B : t403) (t404_A : t404) (t405_A : t405) (t405_B : t405) (t405_C : t405) (t406_A : t406) (t406_B : t406) (t406_C : t406) (t406_D : t406) (t407_A : t407) (t407_B : t407) (t407_C : t407) (t408_A : t408) (t408_B : t408) (t408_C : t408) (t408_D : t408) (t408_E : t408) (t409_A : t409) (t409_B : t409) (t410_A : t410) (t410_B : t410) (t410_C : t410) (t411_A : t411) (t411_B : t411) (t411_C : t411) (t411_D : t411) (t412_A : t412) (t412_B : t412) (t412_C : t412) (t413_A : t413) (t413_B : t413) (t414_A : t414) (t414_B : t414) (t414_C : t414) (t415_A : t415) (t415_B : t415) (t415_C : t415) (t415_D : t415) (t416_A : t416) (t416_B : t416) (t417_A : t417) (t417_B : t417) (t417_C : t417) (t418_A : t418) (t418_B : t418) (t419_A : t419) (t420_A : t420) (t420_B : t420) (t421_A : t421) (t421_B : t421) (t421_C : t421) (t422_A : t422) (t422_B : t422) (t422_C : t422) (t422_D : t422) (t423_A : t423) (t423_B : t423) (t423_C : t423) (t424_A : t424) (t424_B : t424) (t424_C : t424) (t424_D : t424) (t424_E : t424) (t425_A : t425) (t425_B : t425) (t426_A : t426) (t426_B : t426) (t426_C : t426) (t427_A : t427) (t427_B : t427) (t427_C : t427) (t427_D : t427) (t428_A : t428) (t428_B : t428) (t428_C : t428) (t429_A : t429) (t429_B : t429) (t430_A : t430) (t430_B : t430) (t430_C : t430) (t431_A : t431) (t431_B : t431) (t431_C : t431) (t431_D : t431) (t432_A : t432) (t432_B : t432) (t433_A : t433) (t433_B : t433) (t433_C : t433) (t434_A : t434) (t434_B : t434) (t435_A : t435) (t436_A : t436) (t436_B : t436) (t436_C : t436) (t436_D : t436) (t437_A : t437) (t437_B : t437) (t438_A : t438) (t438_B : t438) (t438_C : t438) (t439_A : t439) (t439_B : t439) (t439_C : t439) (t439_D : t439) (t440_A : t440) (t440_B : t440) (t440_C : t440) (t441_A : t441) (t441_B : t441) (t441_C : t441) (t441_D : t441) (t441_E : t441) (t442_A : t442) (t442_B : t442) (t443_A : t443) (t443_B : t443) (t443_C : t443) (t444_A : t444) (t444_B : t444) (t444_C : t444) (t444_D : t444) (t445_A : t445) (t445_B : t445) (t445_C : t445) (t446_A : t446) (t446_B : t446) (t447_A : t447) (t447_B : t447) (t447_C : t447) (t448_A : t448) (t448_B : t448) (t448_C : t448) (t448_D : t448) (t449_A : t449) (t449_B : t449) (t450_A : t450) (t450_B : t450) (t450_C : t450) (t451_A : t451) (t451_B : t451) (t452_A : t452) (t453_A : t453) (t453_B : t453) (t453_C : t453) (t453_D : t453) (t453_E : t453) (t454_A : t454) (t454_B : t454) (t454_C : t454) (t454_D : t454) (t455_A : t455) (t455_B : t455) (t456_A : t456) (t456_B : t456) (t456_C : t456) (t457_A : t457) (t457_B : t457) (t457_C : t457) (t457_D : t457) (t458_A : t458) (t458_B : t458) (t458_C : t458) (t459_A : t459) (t459_B : t459) (t459_C : t459) (t459_D : t459) (t459_E : t459) (t460_A : t460) (t460_B : t460) (t461_A : t461) (t461_B : t461) (t461_C : t461) (t462_A : t462) (t462_B : t462) (t462_C : t462) (t462_D : t462) (t463_A : t463) (t463_B : t463) (t463_C : t463) (t464_A : t464) (t464_B : t464) (t465_A : t465) (t465_B : t465) (t465_C : t465) (t466_A : t466) (t466_B : t466) (t466_C : t466) (t466_D : t466) (t467_A : t467) (t467_B : t467) (t468_A : t468) (t468_B : t468) (t468_C : t468) (t469_A : t469) (t469_B : t469) (t470_A : t470) (t471_A : t471) (t471_B : t471) (t471_C : t471) (t472_A : t472) (t472_B : t472) (t472_C : t472) (t472_D : t472) (t472_E : t472) (t473_A : t473) (t473_B : t473) (t473_C : t473) (t473_D : t473) (t474_A : t474) (t474_B : t474) (t475_A : t475) (t475_B : t475) (t475_C : t475) (t476_A : t476) (t476_B : t476) (t476_C : t476) (t476_D : t476) (t477_A : t477) (t477_B : t477) (t477_C : t477) (t478_A : t478) (t478_B : t478) (t478_C : t478) (t478_D : t478) (t478_E : t478) (t479_A : t479) (t479_B : t479) (t480_A : t480) (t480_B : t480) (t480_C : t480) (t481_A : t481) (t481_B : t481) (t481_C : t481) (t481_D : t481) (t482_A : t482) (t482_B : t482) (t482_C : t482) (t483_A : t483) (t483_B : t483) (t484_A : t484) (t484_B : t484) (t484_C : t484) (t485_A : t485) (t485_B : t485) (t485_C : t485) (t485_D : t485) (t486_A : t486) (t486_B : t486) (t487_A : t487) (t487_B : t487) (t487_C : t487) (t488_A : t488) (t488_B : t488) (t489_A : t489) (t490_A : t490) (t490_B : t490) (t490_C : t490) (t490_D : t490) (t491_A : t491) (t491_B : t491) (t491_C : t491) (t492_A : t492) (t492_B : t492) (t492_C : t492) (t492_D : t492) (t492_E : t492) (t493_A : t493) (t493_B : t493) (t493_C : t493) (t493_D : t493) (t494_A : t494) (t494_B : t494) (t495_A : t495) (t495_B : t495) (t495_C : t495) (t496_A : t496) (t496_B : t496) (t496_C : t496) (t496_D : t496) (t497_A : t497) (t497_B : t497) (t497_C : t497) (t498_A : t498) (t498_B : t498) (t498_C : t498) (t498_D : t498) (t498_E : t498) (t499_A : t499) (t499_B : t499) (t500_A : t500) (t500_B : t500) (t500_C : t500) (t501_A : t501) (t501_B : t501) (t501_C : t501) (t501_D : t501) (t502_A : t502) (t502_B : t502) (t502_C : t502) (t503_A : t503) (t503_B : t503) (t504_A : t504) (t504_B : t504) (t504_C : t504) (t505_A : t505) (t505_B : t505) (t505_C : t505) (t505_D : t505) (t506_A : t506) (t506_B : t506) (t507_A : t507) (t507_B : t507) (t507_C : t507) (t508_A : t508) (t508_B : t508) (t509_A : t509) (t510_A : t510) (t510_B : t510) (t510_C : t510) (t511_A : t511) (t511_B : t511) (t511_C : t511) (t511_D : t511) (t512_A : t512) (t512_B : t512) (t512_C : t512) (t513_A : t513) (t513_B : t513) (t513_C : t513) (t513_D : t513) (t513_E : t513) (t514_A : t514) (t514_B : t514) (t514_C : t514) (t514_D : t514) (t515_A : t515) (t515_B : t515) (t516_A : t516) (t516_B : t516) (t516_C : t516) (t517_A : t517) (t517_B : t517) (t517_C : t517) (t517_D : t517) (t518_A : t518) (t518_B : t518) (t518_C : t518) (t519_A : t519) (t519_B : t519) (t519_C : t519) (t519_D : t519) (t519_E : t519) (t520_A : t520) (t520_B : t520) (t521_A : t521) (t521_B : t521) (t521_C : t521) (t522_A : t522) (t522_B : t522) (t522_C : t522) (t522_D : t522) (t523_A : t523) (t523_B : t523) (t523_C : t523) (t524_A : t524) (t524_B : t524) (t525_A : t525) (t525_B : t525) (t525_C : t525) (t526_A : t526) (t526_B : t526) (t526_C : t526) (t526_D : t526) (t527_A : t527) (t527_B : t527) (t528_A : t528) (t528_B : t528) (t528_C : t528) (t529_A : t529) (t529_B : t529) (t530_A : t530) (t531_A : t531) (t531_B : t531) (t532_A : t532) (t532_B : t532) (t532_C : t532) (t533_A : t533) (t533_B : t533) (t533_C : t533) (t533_D : t533) (t534_A : t534) (t534_B : t534) (t534_C : t534) (t535_A : t535) (t535_B : t535) (t535_C : t535) (t535_D : t535) (t535_E : t535) (t536_A : t536) (t536_B : t536) (t536_C : t536) (t536_D : t536) (t537_A : t537) (t537_B : t537) (t538_A : t538) (t538_B : t538) (t538_C : t538) (t539_A : t539) (t539_B : t539) (t539_C : t539) (t539_D : t539) (t540_A : t540) (t540_B : t540) (t540_C : t540) (t541_A : t541) (t541_B : t541) (t541_C : t541) (t541_D : t541) (t541_E : t541) (t542_A : t542) (t542_B : t542) (t543_A : t543) (t543_B : t543) (t543_C : t543) (t544_A : t544) (t544_B : t544) (t544_C : t544) (t544_D : t544) (t545_A : t545) (t545_B : t545) (t545_C : t545) (t546_A : t546) (t546_B : t546) (t547_A : t547) (t547_B : t547) (t547_C : t547) (t548_A : t548) (t548_B : t548) (t548_C : t548) (t548_D : t548) (t549_A : t549) (t549_B : t549) (t550_A : t550) (t550_B : t550) (t550_C : t550) (t551_A : t551) (t551_B : t551) (t552_A : t552) (t553_A : t553) (t553_B : t553) (t553_C : t553) (t554_A : t554) (t554_B : t554) (t555_A : t555) (t555_B : t555) (t555_C : t555) (t556_A : t556) (t556_B : t556) (t556_C : t556) (t556_D : t556) (t557_A : t557) (t557_B : t557) (t557_C : t557) (t558_A : t558) (t558_B : t558) (t558_C : t558) (t558_D : t558) (t558_E : t558) (t559_A : t559) (t559_B : t559) (t559_C : t559) (t559_D : t559) (t560_A : t560) (t560_B : t560) (t561_A : t561) (t561_B : t561) (t561_C : t561) (t562_A : t562) (t562_B : t562) (t562_C : t562) (t562_D : t562) (t563_A : t563) (t563_B : t563) (t563_C : t563) (t564_A : t564) (t564_B : t564) (t564_C : t564) (t564_D : t564) (t564_E : t564) (t565_A : t565) (t565_B : t565) (t566_A : t566) (t566_B : t566) (t566_C : t566) (t567_A : t567) (t567_B : t567) (t567_C : t567) (t567_D : t567) (t568_A : t568) (t568_B : t568) (t568_C : t568) (t569_A : t569) (t569_B : t569) (t570_A : t570) (t570_B : t570) (t570_C : t570) (t571_A : t571) (t571_B : t571) (t571_C : t571) (t571_D : t571) (t572_A : t572) (t572_B : t572) (t573_A : t573) (t573_B : t573) (t573_C : t573) (t574_A : t574) (t574_B : t574) (t575_A : t575) (t576_A : t576) (t576_B : t576) (t576_C : t576) (t576_D : t576) (t577_A : t577) (t577_B : t577) (t577_C : t577) (t578_A : t578) (t578_B : t578) (t579_A : t579) (t579_B : t579) (t579_C : t579) (t580_A : t580) (t580_B : t580) (t580_C : t580) (t580_D : t580) (t581_A : t581) (t581_B : t581) (t581_C : t581) (t582_A : t582) (t582_B : t582) (t582_C : t582) (t582_D : t582) (t582_E : t582) (t583_A : t583) (t583_B : t583) (t583_C : t583) (t583_D : t583) (t584_A : t584) (t584_B : t584) (t585_A : t585) (t585_B : t585) (t585_C : t585) (t586_A : t586) (t586_B : t586) (t586_C : t586) (t586_D : t586) (t587_A : t587) (t587_B : t587) (t587_C : t587) (t588_A : t588) (t588_B : t588) (t588_C : t588) (t588_D : t588) (t588_E : t588) (t589_A : t589) (t589_B : t589) (t590_A : t590) (t590_B : t590) (t590_C : t590) (t591_A : t591) (t591_B : t591) (t591_C : t591) (t591_D : t591) (t592_A : t592) (t592_B : t592) (t592_C : t592) (t593_A : t593) (t593_B : t593) (t594_A : t594) (t594_B : t594) (t594_C : t594) (t595_A : t595) (t595_B : t595) (t595_C : t595) (t595_D : t595) (t596_A : t596) (t596_B : t596) (t597_A : t597) (t597_B : t597) (t597_C : t597) (t598_A : t598) (t598_B : t598) (t599_A : t599) = + print_endline " - Marshaling"; + marshal_expect_failure t0; + marshal_expect_failure t1; + marshal_expect_failure t2; + marshal_expect_failure t3; + marshal_expect_failure t4; + marshal_expect_failure t5; + marshal_expect_failure t6; + marshal_expect_failure t7; + marshal_expect_failure t8; + marshal_expect_failure t9; + marshal_expect_failure t10; + marshal_expect_failure t11; + marshal_expect_failure t12; + marshal_expect_failure t13; + marshal_expect_failure t14; + marshal_expect_failure t15; + marshal_expect_failure t16; + marshal_expect_failure t17; + marshal_expect_failure t18; + marshal_expect_failure t19; + marshal_expect_failure t20; + marshal_expect_failure t21; + marshal_expect_failure t22; + marshal_expect_failure t23; + marshal_expect_failure t24; + marshal_expect_failure t25; + marshal_expect_failure t26; + marshal_expect_failure t27; + marshal_expect_failure t28; + marshal_expect_failure t29; + marshal_expect_failure t30; + marshal_expect_failure t31; + marshal_expect_failure t32; + marshal_expect_failure t33; + marshal_expect_failure t34; + marshal_expect_failure t35; + marshal_expect_failure t36; + marshal_expect_failure t37; + marshal_expect_failure t38; + marshal_expect_failure t39; + marshal_expect_failure t40; + marshal_expect_failure t41; + marshal_expect_failure t42; + marshal_expect_failure t43; + marshal_expect_failure t44; + marshal_expect_failure t45; + marshal_expect_failure t46; + marshal_expect_failure t47; + marshal_expect_failure t48; + marshal_expect_failure t49; + marshal_expect_failure t50; + marshal_expect_failure t51; + marshal_expect_failure t52; + marshal_expect_failure t53; + marshal_expect_failure t54; + marshal_expect_failure t55; + marshal_expect_failure t56; + marshal_expect_failure t57; + marshal_expect_failure t58; + marshal_expect_failure t59; + marshal_expect_failure t60; + marshal_expect_failure t61; + marshal_expect_failure t62; + marshal_expect_failure t63; + marshal_expect_failure t64; + marshal_expect_failure t65; + marshal_expect_failure t66; + marshal_expect_failure t67; + marshal_expect_failure t68; + marshal_expect_failure t69; + marshal_expect_failure t70; + marshal_expect_failure t71; + marshal_expect_failure t72; + marshal_expect_failure t73; + marshal_expect_failure t74; + marshal_expect_failure t75; + marshal_expect_failure t76; + marshal_expect_failure t77; + marshal_expect_failure t78; + marshal_expect_failure t79; + marshal_expect_failure t80; + marshal_expect_failure t81; + marshal_expect_failure t82; + marshal_expect_failure t83; + marshal_expect_failure t84; + marshal_expect_failure t85; + marshal_expect_failure t86; + marshal_expect_failure t87; + marshal_expect_failure t88; + marshal_expect_failure t89; + marshal_expect_failure t90; + marshal_expect_failure t91; + marshal_expect_failure t92; + marshal_expect_failure t93; + marshal_expect_failure t94; + marshal_expect_failure t95; + marshal_expect_failure t96; + marshal_expect_failure t97; + marshal_expect_failure t98; + marshal_expect_failure t99; + marshal_expect_failure t100; + marshal_expect_failure t101; + marshal_expect_failure t102; + marshal_expect_failure t103; + marshal_expect_failure t104; + marshal_expect_failure t105; + marshal_expect_failure t106; + marshal_expect_failure t107; + marshal_expect_failure t108; + marshal_expect_failure t109; + marshal_expect_failure t110; + marshal_expect_failure t111; + marshal_expect_failure t112; + marshal_expect_failure t113; + marshal_expect_failure t114; + marshal_expect_failure t115; + marshal_expect_failure t116; + marshal_expect_failure t117; + marshal_expect_failure t118; + marshal_expect_failure t119; + marshal_expect_failure t120; + marshal_expect_failure t121; + marshal_expect_failure t122; + marshal_expect_failure t123; + marshal_expect_failure t124; + marshal_expect_failure t125; + marshal_expect_failure t126; + marshal_expect_failure t127; + marshal_expect_failure t128; + marshal_expect_failure t129; + marshal_expect_failure t130; + marshal_expect_failure t131; + marshal_expect_failure t132; + marshal_expect_failure t133; + marshal_expect_failure t134; + marshal_expect_failure t135; + marshal_expect_failure t136; + marshal_expect_failure t137; + marshal_expect_failure t138; + marshal_expect_failure t139; + marshal_expect_failure t140; + marshal_expect_failure t141; + marshal_expect_failure t142; + marshal_expect_failure t143; + marshal_expect_failure t144; + marshal_expect_failure t145; + marshal_expect_failure t146; + marshal_expect_failure t147; + marshal_expect_failure t148; + marshal_expect_failure t149; + marshal_expect_failure t150; + marshal_expect_failure t151; + marshal_expect_failure t152; + marshal_expect_failure t153; + marshal_expect_failure t154; + marshal_expect_failure t155; + marshal_expect_failure t156; + marshal_expect_failure t157; + marshal_expect_failure t158; + marshal_expect_failure t159; + marshal_expect_failure t160; + marshal_expect_failure t161; + marshal_expect_failure t162; + marshal_expect_failure t163; + marshal_expect_failure t164; + marshal_expect_failure t165; + marshal_expect_failure t166; + marshal_expect_failure t167; + marshal_expect_failure t168; + marshal_expect_failure t169; + marshal_expect_failure t170; + marshal_expect_failure t171; + marshal_expect_failure t172; + marshal_expect_failure t173; + marshal_expect_failure t174; + marshal_expect_failure t175; + marshal_expect_failure t176; + marshal_expect_failure t177; + marshal_expect_failure t178; + marshal_expect_failure t179; + marshal_expect_failure t180; + marshal_expect_failure t181; + marshal_expect_failure t182; + marshal_expect_failure t183; + marshal_expect_failure t184; + marshal_expect_failure t185; + marshal_expect_failure t186; + marshal_expect_failure t187; + marshal_expect_failure t188; + marshal_expect_failure t189; + marshal_expect_failure t190; + marshal_expect_failure t191; + marshal_expect_failure t192; + marshal_expect_failure t193; + marshal_expect_failure t194; + marshal_expect_failure t195; + marshal_expect_failure t196; + marshal_expect_failure t197; + marshal_expect_failure t198; + marshal_expect_failure t199; + marshal_expect_failure t200; + marshal_expect_failure t201; + marshal_expect_failure t202; + marshal_expect_failure t203; + marshal_expect_failure t204; + marshal_expect_failure t205; + marshal_expect_failure t206; + marshal_expect_failure t207; + marshal_expect_failure t208; + marshal_expect_failure t209; + marshal_expect_failure t210; + marshal_expect_failure t211; + marshal_expect_failure t212; + marshal_expect_failure t213; + marshal_expect_failure t214; + marshal_expect_failure t215; + marshal_expect_failure t216; + marshal_expect_failure t217; + marshal_expect_failure t218; + marshal_expect_failure t219; + marshal_expect_failure t220; + marshal_expect_failure t221; + marshal_expect_failure t222; + marshal_expect_failure t223; + marshal_expect_failure t224; + marshal_expect_failure t225; + marshal_expect_failure t226; + marshal_expect_failure t227; + marshal_expect_failure t228; + marshal_expect_failure t229; + marshal_expect_failure t230; + marshal_expect_failure t231; + marshal_expect_failure t232; + marshal_expect_failure t233; + marshal_expect_failure t234; + marshal_expect_failure t235; + marshal_expect_failure t236; + marshal_expect_failure t237; + marshal_expect_failure t238; + marshal_expect_failure t239; + marshal_expect_failure t240; + marshal_expect_failure t241; + marshal_expect_failure t242; + marshal_expect_failure t243; + marshal_expect_failure t244; + marshal_expect_failure t245; + marshal_expect_failure t246; + marshal_expect_failure t247; + marshal_expect_failure t248; + marshal_expect_failure t249; + marshal_expect_failure t250; + marshal_expect_failure t251; + marshal_expect_failure t252; + marshal_expect_failure t253; + marshal_expect_failure t254; + marshal_expect_failure t255; + marshal_expect_failure t256; + marshal_expect_failure t257; + marshal_expect_failure t258; + marshal_expect_failure t259; + marshal_expect_failure t260; + marshal_expect_failure t261; + marshal_expect_failure t262; + marshal_expect_failure t263; + marshal_expect_failure t264; + marshal_expect_failure t265; + marshal_expect_failure t266; + marshal_expect_failure t267; + marshal_expect_failure t268; + marshal_expect_failure t269; + marshal_expect_failure t270; + marshal_expect_failure t271; + marshal_expect_failure t272; + marshal_expect_failure t273; + marshal_expect_failure t274; + marshal_expect_failure t275; + marshal_expect_failure t276; + marshal_expect_failure t277; + marshal_expect_failure t278; + marshal_expect_failure t279; + marshal_expect_failure t280; + marshal_expect_failure t281; + marshal_expect_failure t282; + marshal_expect_failure t283; + marshal_expect_failure t284; + marshal_expect_failure t285; + marshal_expect_failure t286; + marshal_expect_failure t287; + marshal_expect_failure t288; + marshal_expect_failure t289; + marshal_expect_failure t290; + marshal_expect_failure t291; + marshal_expect_failure t292; + marshal_expect_failure t293; + marshal_expect_failure t294; + marshal_expect_failure t295; + marshal_expect_failure t296; + marshal_expect_failure t297; + marshal_expect_failure t298; + marshal_expect_failure t299; + marshal_expect_failure t300_A; + marshal_expect_failure t301_A; + marshal_expect_failure t301_B; + marshal_expect_failure t302_A; + marshal_expect_failure t303_A; + marshal_expect_failure t303_B; + marshal_expect_failure t303_C; + marshal_expect_failure t304_A; + marshal_expect_failure t304_B; + marshal_expect_failure t305_A; + marshal_expect_failure t306_A; + marshal_expect_failure t306_B; + marshal_expect_failure t307_A; + marshal_expect_failure t307_B; + marshal_expect_failure t307_C; + marshal_expect_failure t308_A; + marshal_expect_failure t308_B; + marshal_expect_failure t309_A; + marshal_expect_failure t310_A; + marshal_expect_failure t310_B; + marshal_expect_failure t310_C; + marshal_expect_failure t310_D; + marshal_expect_failure t311_A; + marshal_expect_failure t311_B; + marshal_expect_failure t312_A; + marshal_expect_failure t312_B; + marshal_expect_failure t312_C; + marshal_expect_failure t313_A; + marshal_expect_failure t313_B; + marshal_expect_failure t314_A; + marshal_expect_failure t315_A; + marshal_expect_failure t315_B; + marshal_expect_failure t315_C; + marshal_expect_failure t316_A; + marshal_expect_failure t316_B; + marshal_expect_failure t316_C; + marshal_expect_failure t316_D; + marshal_expect_failure t317_A; + marshal_expect_failure t317_B; + marshal_expect_failure t318_A; + marshal_expect_failure t318_B; + marshal_expect_failure t318_C; + marshal_expect_failure t319_A; + marshal_expect_failure t319_B; + marshal_expect_failure t320_A; + marshal_expect_failure t321_A; + marshal_expect_failure t321_B; + marshal_expect_failure t322_A; + marshal_expect_failure t322_B; + marshal_expect_failure t322_C; + marshal_expect_failure t323_A; + marshal_expect_failure t323_B; + marshal_expect_failure t323_C; + marshal_expect_failure t323_D; + marshal_expect_failure t324_A; + marshal_expect_failure t324_B; + marshal_expect_failure t325_A; + marshal_expect_failure t325_B; + marshal_expect_failure t325_C; + marshal_expect_failure t326_A; + marshal_expect_failure t326_B; + marshal_expect_failure t327_A; + marshal_expect_failure t328_A; + marshal_expect_failure t328_B; + marshal_expect_failure t328_C; + marshal_expect_failure t329_A; + marshal_expect_failure t329_B; + marshal_expect_failure t330_A; + marshal_expect_failure t330_B; + marshal_expect_failure t330_C; + marshal_expect_failure t331_A; + marshal_expect_failure t331_B; + marshal_expect_failure t331_C; + marshal_expect_failure t331_D; + marshal_expect_failure t332_A; + marshal_expect_failure t332_B; + marshal_expect_failure t333_A; + marshal_expect_failure t333_B; + marshal_expect_failure t333_C; + marshal_expect_failure t334_A; + marshal_expect_failure t334_B; + marshal_expect_failure t335_A; + marshal_expect_failure t336_A; + marshal_expect_failure t336_B; + marshal_expect_failure t336_C; + marshal_expect_failure t336_D; + marshal_expect_failure t337_A; + marshal_expect_failure t337_B; + marshal_expect_failure t337_C; + marshal_expect_failure t338_A; + marshal_expect_failure t338_B; + marshal_expect_failure t339_A; + marshal_expect_failure t339_B; + marshal_expect_failure t339_C; + marshal_expect_failure t340_A; + marshal_expect_failure t340_B; + marshal_expect_failure t340_C; + marshal_expect_failure t340_D; + marshal_expect_failure t341_A; + marshal_expect_failure t341_B; + marshal_expect_failure t342_A; + marshal_expect_failure t342_B; + marshal_expect_failure t342_C; + marshal_expect_failure t343_A; + marshal_expect_failure t343_B; + marshal_expect_failure t344_A; + marshal_expect_failure t345_A; + marshal_expect_failure t345_B; + marshal_expect_failure t345_C; + marshal_expect_failure t346_A; + marshal_expect_failure t346_B; + marshal_expect_failure t346_C; + marshal_expect_failure t346_D; + marshal_expect_failure t347_A; + marshal_expect_failure t347_B; + marshal_expect_failure t347_C; + marshal_expect_failure t348_A; + marshal_expect_failure t348_B; + marshal_expect_failure t349_A; + marshal_expect_failure t349_B; + marshal_expect_failure t349_C; + marshal_expect_failure t350_A; + marshal_expect_failure t350_B; + marshal_expect_failure t350_C; + marshal_expect_failure t350_D; + marshal_expect_failure t351_A; + marshal_expect_failure t351_B; + marshal_expect_failure t352_A; + marshal_expect_failure t352_B; + marshal_expect_failure t352_C; + marshal_expect_failure t353_A; + marshal_expect_failure t353_B; + marshal_expect_failure t354_A; + marshal_expect_failure t355_A; + marshal_expect_failure t355_B; + marshal_expect_failure t356_A; + marshal_expect_failure t356_B; + marshal_expect_failure t356_C; + marshal_expect_failure t357_A; + marshal_expect_failure t357_B; + marshal_expect_failure t357_C; + marshal_expect_failure t357_D; + marshal_expect_failure t358_A; + marshal_expect_failure t358_B; + marshal_expect_failure t358_C; + marshal_expect_failure t359_A; + marshal_expect_failure t359_B; + marshal_expect_failure t360_A; + marshal_expect_failure t360_B; + marshal_expect_failure t360_C; + marshal_expect_failure t361_A; + marshal_expect_failure t361_B; + marshal_expect_failure t361_C; + marshal_expect_failure t361_D; + marshal_expect_failure t362_A; + marshal_expect_failure t362_B; + marshal_expect_failure t363_A; + marshal_expect_failure t363_B; + marshal_expect_failure t363_C; + marshal_expect_failure t364_A; + marshal_expect_failure t364_B; + marshal_expect_failure t365_A; + marshal_expect_failure t366_A; + marshal_expect_failure t366_B; + marshal_expect_failure t366_C; + marshal_expect_failure t366_D; + marshal_expect_failure t366_E; + marshal_expect_failure t367_A; + marshal_expect_failure t367_B; + marshal_expect_failure t368_A; + marshal_expect_failure t368_B; + marshal_expect_failure t368_C; + marshal_expect_failure t369_A; + marshal_expect_failure t369_B; + marshal_expect_failure t369_C; + marshal_expect_failure t369_D; + marshal_expect_failure t370_A; + marshal_expect_failure t370_B; + marshal_expect_failure t370_C; + marshal_expect_failure t371_A; + marshal_expect_failure t371_B; + marshal_expect_failure t372_A; + marshal_expect_failure t372_B; + marshal_expect_failure t372_C; + marshal_expect_failure t373_A; + marshal_expect_failure t373_B; + marshal_expect_failure t373_C; + marshal_expect_failure t373_D; + marshal_expect_failure t374_A; + marshal_expect_failure t374_B; + marshal_expect_failure t375_A; + marshal_expect_failure t375_B; + marshal_expect_failure t375_C; + marshal_expect_failure t376_A; + marshal_expect_failure t376_B; + marshal_expect_failure t377_A; + marshal_expect_failure t378_A; + marshal_expect_failure t378_B; + marshal_expect_failure t378_C; + marshal_expect_failure t379_A; + marshal_expect_failure t379_B; + marshal_expect_failure t379_C; + marshal_expect_failure t379_D; + marshal_expect_failure t379_E; + marshal_expect_failure t380_A; + marshal_expect_failure t380_B; + marshal_expect_failure t381_A; + marshal_expect_failure t381_B; + marshal_expect_failure t381_C; + marshal_expect_failure t382_A; + marshal_expect_failure t382_B; + marshal_expect_failure t382_C; + marshal_expect_failure t382_D; + marshal_expect_failure t383_A; + marshal_expect_failure t383_B; + marshal_expect_failure t383_C; + marshal_expect_failure t384_A; + marshal_expect_failure t384_B; + marshal_expect_failure t385_A; + marshal_expect_failure t385_B; + marshal_expect_failure t385_C; + marshal_expect_failure t386_A; + marshal_expect_failure t386_B; + marshal_expect_failure t386_C; + marshal_expect_failure t386_D; + marshal_expect_failure t387_A; + marshal_expect_failure t387_B; + marshal_expect_failure t388_A; + marshal_expect_failure t388_B; + marshal_expect_failure t388_C; + marshal_expect_failure t389_A; + marshal_expect_failure t389_B; + marshal_expect_failure t390_A; + marshal_expect_failure t391_A; + marshal_expect_failure t391_B; + marshal_expect_failure t391_C; + marshal_expect_failure t391_D; + marshal_expect_failure t392_A; + marshal_expect_failure t392_B; + marshal_expect_failure t392_C; + marshal_expect_failure t393_A; + marshal_expect_failure t393_B; + marshal_expect_failure t393_C; + marshal_expect_failure t393_D; + marshal_expect_failure t393_E; + marshal_expect_failure t394_A; + marshal_expect_failure t394_B; + marshal_expect_failure t395_A; + marshal_expect_failure t395_B; + marshal_expect_failure t395_C; + marshal_expect_failure t396_A; + marshal_expect_failure t396_B; + marshal_expect_failure t396_C; + marshal_expect_failure t396_D; + marshal_expect_failure t397_A; + marshal_expect_failure t397_B; + marshal_expect_failure t397_C; + marshal_expect_failure t398_A; + marshal_expect_failure t398_B; + marshal_expect_failure t399_A; + marshal_expect_failure t399_B; + marshal_expect_failure t399_C; + marshal_expect_failure t400_A; + marshal_expect_failure t400_B; + marshal_expect_failure t400_C; + marshal_expect_failure t400_D; + marshal_expect_failure t401_A; + marshal_expect_failure t401_B; + marshal_expect_failure t402_A; + marshal_expect_failure t402_B; + marshal_expect_failure t402_C; + marshal_expect_failure t403_A; + marshal_expect_failure t403_B; + marshal_expect_failure t404_A; + marshal_expect_failure t405_A; + marshal_expect_failure t405_B; + marshal_expect_failure t405_C; + marshal_expect_failure t406_A; + marshal_expect_failure t406_B; + marshal_expect_failure t406_C; + marshal_expect_failure t406_D; + marshal_expect_failure t407_A; + marshal_expect_failure t407_B; + marshal_expect_failure t407_C; + marshal_expect_failure t408_A; + marshal_expect_failure t408_B; + marshal_expect_failure t408_C; + marshal_expect_failure t408_D; + marshal_expect_failure t408_E; + marshal_expect_failure t409_A; + marshal_expect_failure t409_B; + marshal_expect_failure t410_A; + marshal_expect_failure t410_B; + marshal_expect_failure t410_C; + marshal_expect_failure t411_A; + marshal_expect_failure t411_B; + marshal_expect_failure t411_C; + marshal_expect_failure t411_D; + marshal_expect_failure t412_A; + marshal_expect_failure t412_B; + marshal_expect_failure t412_C; + marshal_expect_failure t413_A; + marshal_expect_failure t413_B; + marshal_expect_failure t414_A; + marshal_expect_failure t414_B; + marshal_expect_failure t414_C; + marshal_expect_failure t415_A; + marshal_expect_failure t415_B; + marshal_expect_failure t415_C; + marshal_expect_failure t415_D; + marshal_expect_failure t416_A; + marshal_expect_failure t416_B; + marshal_expect_failure t417_A; + marshal_expect_failure t417_B; + marshal_expect_failure t417_C; + marshal_expect_failure t418_A; + marshal_expect_failure t418_B; + marshal_expect_failure t419_A; + marshal_expect_failure t420_A; + marshal_expect_failure t420_B; + marshal_expect_failure t421_A; + marshal_expect_failure t421_B; + marshal_expect_failure t421_C; + marshal_expect_failure t422_A; + marshal_expect_failure t422_B; + marshal_expect_failure t422_C; + marshal_expect_failure t422_D; + marshal_expect_failure t423_A; + marshal_expect_failure t423_B; + marshal_expect_failure t423_C; + marshal_expect_failure t424_A; + marshal_expect_failure t424_B; + marshal_expect_failure t424_C; + marshal_expect_failure t424_D; + marshal_expect_failure t424_E; + marshal_expect_failure t425_A; + marshal_expect_failure t425_B; + marshal_expect_failure t426_A; + marshal_expect_failure t426_B; + marshal_expect_failure t426_C; + marshal_expect_failure t427_A; + marshal_expect_failure t427_B; + marshal_expect_failure t427_C; + marshal_expect_failure t427_D; + marshal_expect_failure t428_A; + marshal_expect_failure t428_B; + marshal_expect_failure t428_C; + marshal_expect_failure t429_A; + marshal_expect_failure t429_B; + marshal_expect_failure t430_A; + marshal_expect_failure t430_B; + marshal_expect_failure t430_C; + marshal_expect_failure t431_A; + marshal_expect_failure t431_B; + marshal_expect_failure t431_C; + marshal_expect_failure t431_D; + marshal_expect_failure t432_A; + marshal_expect_failure t432_B; + marshal_expect_failure t433_A; + marshal_expect_failure t433_B; + marshal_expect_failure t433_C; + marshal_expect_failure t434_A; + marshal_expect_failure t434_B; + marshal_expect_failure t435_A; + marshal_expect_failure t436_A; + marshal_expect_failure t436_B; + marshal_expect_failure t436_C; + marshal_expect_failure t436_D; + marshal_expect_failure t437_A; + marshal_expect_failure t437_B; + marshal_expect_failure t438_A; + marshal_expect_failure t438_B; + marshal_expect_failure t438_C; + marshal_expect_failure t439_A; + marshal_expect_failure t439_B; + marshal_expect_failure t439_C; + marshal_expect_failure t439_D; + marshal_expect_failure t440_A; + marshal_expect_failure t440_B; + marshal_expect_failure t440_C; + marshal_expect_failure t441_A; + marshal_expect_failure t441_B; + marshal_expect_failure t441_C; + marshal_expect_failure t441_D; + marshal_expect_failure t441_E; + marshal_expect_failure t442_A; + marshal_expect_failure t442_B; + marshal_expect_failure t443_A; + marshal_expect_failure t443_B; + marshal_expect_failure t443_C; + marshal_expect_failure t444_A; + marshal_expect_failure t444_B; + marshal_expect_failure t444_C; + marshal_expect_failure t444_D; + marshal_expect_failure t445_A; + marshal_expect_failure t445_B; + marshal_expect_failure t445_C; + marshal_expect_failure t446_A; + marshal_expect_failure t446_B; + marshal_expect_failure t447_A; + marshal_expect_failure t447_B; + marshal_expect_failure t447_C; + marshal_expect_failure t448_A; + marshal_expect_failure t448_B; + marshal_expect_failure t448_C; + marshal_expect_failure t448_D; + marshal_expect_failure t449_A; + marshal_expect_failure t449_B; + marshal_expect_failure t450_A; + marshal_expect_failure t450_B; + marshal_expect_failure t450_C; + marshal_expect_failure t451_A; + marshal_expect_failure t451_B; + marshal_expect_failure t452_A; + marshal_expect_failure t453_A; + marshal_expect_failure t453_B; + marshal_expect_failure t453_C; + marshal_expect_failure t453_D; + marshal_expect_failure t453_E; + marshal_expect_failure t454_A; + marshal_expect_failure t454_B; + marshal_expect_failure t454_C; + marshal_expect_failure t454_D; + marshal_expect_failure t455_A; + marshal_expect_failure t455_B; + marshal_expect_failure t456_A; + marshal_expect_failure t456_B; + marshal_expect_failure t456_C; + marshal_expect_failure t457_A; + marshal_expect_failure t457_B; + marshal_expect_failure t457_C; + marshal_expect_failure t457_D; + marshal_expect_failure t458_A; + marshal_expect_failure t458_B; + marshal_expect_failure t458_C; + marshal_expect_failure t459_A; + marshal_expect_failure t459_B; + marshal_expect_failure t459_C; + marshal_expect_failure t459_D; + marshal_expect_failure t459_E; + marshal_expect_failure t460_A; + marshal_expect_failure t460_B; + marshal_expect_failure t461_A; + marshal_expect_failure t461_B; + marshal_expect_failure t461_C; + marshal_expect_failure t462_A; + marshal_expect_failure t462_B; + marshal_expect_failure t462_C; + marshal_expect_failure t462_D; + marshal_expect_failure t463_A; + marshal_expect_failure t463_B; + marshal_expect_failure t463_C; + marshal_expect_failure t464_A; + marshal_expect_failure t464_B; + marshal_expect_failure t465_A; + marshal_expect_failure t465_B; + marshal_expect_failure t465_C; + marshal_expect_failure t466_A; + marshal_expect_failure t466_B; + marshal_expect_failure t466_C; + marshal_expect_failure t466_D; + marshal_expect_failure t467_A; + marshal_expect_failure t467_B; + marshal_expect_failure t468_A; + marshal_expect_failure t468_B; + marshal_expect_failure t468_C; + marshal_expect_failure t469_A; + marshal_expect_failure t469_B; + marshal_expect_failure t470_A; + marshal_expect_failure t471_A; + marshal_expect_failure t471_B; + marshal_expect_failure t471_C; + marshal_expect_failure t472_A; + marshal_expect_failure t472_B; + marshal_expect_failure t472_C; + marshal_expect_failure t472_D; + marshal_expect_failure t472_E; + marshal_expect_failure t473_A; + marshal_expect_failure t473_B; + marshal_expect_failure t473_C; + marshal_expect_failure t473_D; + marshal_expect_failure t474_A; + marshal_expect_failure t474_B; + marshal_expect_failure t475_A; + marshal_expect_failure t475_B; + marshal_expect_failure t475_C; + marshal_expect_failure t476_A; + marshal_expect_failure t476_B; + marshal_expect_failure t476_C; + marshal_expect_failure t476_D; + marshal_expect_failure t477_A; + marshal_expect_failure t477_B; + marshal_expect_failure t477_C; + marshal_expect_failure t478_A; + marshal_expect_failure t478_B; + marshal_expect_failure t478_C; + marshal_expect_failure t478_D; + marshal_expect_failure t478_E; + marshal_expect_failure t479_A; + marshal_expect_failure t479_B; + marshal_expect_failure t480_A; + marshal_expect_failure t480_B; + marshal_expect_failure t480_C; + marshal_expect_failure t481_A; + marshal_expect_failure t481_B; + marshal_expect_failure t481_C; + marshal_expect_failure t481_D; + marshal_expect_failure t482_A; + marshal_expect_failure t482_B; + marshal_expect_failure t482_C; + marshal_expect_failure t483_A; + marshal_expect_failure t483_B; + marshal_expect_failure t484_A; + marshal_expect_failure t484_B; + marshal_expect_failure t484_C; + marshal_expect_failure t485_A; + marshal_expect_failure t485_B; + marshal_expect_failure t485_C; + marshal_expect_failure t485_D; + marshal_expect_failure t486_A; + marshal_expect_failure t486_B; + marshal_expect_failure t487_A; + marshal_expect_failure t487_B; + marshal_expect_failure t487_C; + marshal_expect_failure t488_A; + marshal_expect_failure t488_B; + marshal_expect_failure t489_A; + marshal_expect_failure t490_A; + marshal_expect_failure t490_B; + marshal_expect_failure t490_C; + marshal_expect_failure t490_D; + marshal_expect_failure t491_A; + marshal_expect_failure t491_B; + marshal_expect_failure t491_C; + marshal_expect_failure t492_A; + marshal_expect_failure t492_B; + marshal_expect_failure t492_C; + marshal_expect_failure t492_D; + marshal_expect_failure t492_E; + marshal_expect_failure t493_A; + marshal_expect_failure t493_B; + marshal_expect_failure t493_C; + marshal_expect_failure t493_D; + marshal_expect_failure t494_A; + marshal_expect_failure t494_B; + marshal_expect_failure t495_A; + marshal_expect_failure t495_B; + marshal_expect_failure t495_C; + marshal_expect_failure t496_A; + marshal_expect_failure t496_B; + marshal_expect_failure t496_C; + marshal_expect_failure t496_D; + marshal_expect_failure t497_A; + marshal_expect_failure t497_B; + marshal_expect_failure t497_C; + marshal_expect_failure t498_A; + marshal_expect_failure t498_B; + marshal_expect_failure t498_C; + marshal_expect_failure t498_D; + marshal_expect_failure t498_E; + marshal_expect_failure t499_A; + marshal_expect_failure t499_B; + marshal_expect_failure t500_A; + marshal_expect_failure t500_B; + marshal_expect_failure t500_C; + marshal_expect_failure t501_A; + marshal_expect_failure t501_B; + marshal_expect_failure t501_C; + marshal_expect_failure t501_D; + marshal_expect_failure t502_A; + marshal_expect_failure t502_B; + marshal_expect_failure t502_C; + marshal_expect_failure t503_A; + marshal_expect_failure t503_B; + marshal_expect_failure t504_A; + marshal_expect_failure t504_B; + marshal_expect_failure t504_C; + marshal_expect_failure t505_A; + marshal_expect_failure t505_B; + marshal_expect_failure t505_C; + marshal_expect_failure t505_D; + marshal_expect_failure t506_A; + marshal_expect_failure t506_B; + marshal_expect_failure t507_A; + marshal_expect_failure t507_B; + marshal_expect_failure t507_C; + marshal_expect_failure t508_A; + marshal_expect_failure t508_B; + marshal_expect_failure t509_A; + marshal_expect_failure t510_A; + marshal_expect_failure t510_B; + marshal_expect_failure t510_C; + marshal_expect_failure t511_A; + marshal_expect_failure t511_B; + marshal_expect_failure t511_C; + marshal_expect_failure t511_D; + marshal_expect_failure t512_A; + marshal_expect_failure t512_B; + marshal_expect_failure t512_C; + marshal_expect_failure t513_A; + marshal_expect_failure t513_B; + marshal_expect_failure t513_C; + marshal_expect_failure t513_D; + marshal_expect_failure t513_E; + marshal_expect_failure t514_A; + marshal_expect_failure t514_B; + marshal_expect_failure t514_C; + marshal_expect_failure t514_D; + marshal_expect_failure t515_A; + marshal_expect_failure t515_B; + marshal_expect_failure t516_A; + marshal_expect_failure t516_B; + marshal_expect_failure t516_C; + marshal_expect_failure t517_A; + marshal_expect_failure t517_B; + marshal_expect_failure t517_C; + marshal_expect_failure t517_D; + marshal_expect_failure t518_A; + marshal_expect_failure t518_B; + marshal_expect_failure t518_C; + marshal_expect_failure t519_A; + marshal_expect_failure t519_B; + marshal_expect_failure t519_C; + marshal_expect_failure t519_D; + marshal_expect_failure t519_E; + marshal_expect_failure t520_A; + marshal_expect_failure t520_B; + marshal_expect_failure t521_A; + marshal_expect_failure t521_B; + marshal_expect_failure t521_C; + marshal_expect_failure t522_A; + marshal_expect_failure t522_B; + marshal_expect_failure t522_C; + marshal_expect_failure t522_D; + marshal_expect_failure t523_A; + marshal_expect_failure t523_B; + marshal_expect_failure t523_C; + marshal_expect_failure t524_A; + marshal_expect_failure t524_B; + marshal_expect_failure t525_A; + marshal_expect_failure t525_B; + marshal_expect_failure t525_C; + marshal_expect_failure t526_A; + marshal_expect_failure t526_B; + marshal_expect_failure t526_C; + marshal_expect_failure t526_D; + marshal_expect_failure t527_A; + marshal_expect_failure t527_B; + marshal_expect_failure t528_A; + marshal_expect_failure t528_B; + marshal_expect_failure t528_C; + marshal_expect_failure t529_A; + marshal_expect_failure t529_B; + marshal_expect_failure t530_A; + marshal_expect_failure t531_A; + marshal_expect_failure t531_B; + marshal_expect_failure t532_A; + marshal_expect_failure t532_B; + marshal_expect_failure t532_C; + marshal_expect_failure t533_A; + marshal_expect_failure t533_B; + marshal_expect_failure t533_C; + marshal_expect_failure t533_D; + marshal_expect_failure t534_A; + marshal_expect_failure t534_B; + marshal_expect_failure t534_C; + marshal_expect_failure t535_A; + marshal_expect_failure t535_B; + marshal_expect_failure t535_C; + marshal_expect_failure t535_D; + marshal_expect_failure t535_E; + marshal_expect_failure t536_A; + marshal_expect_failure t536_B; + marshal_expect_failure t536_C; + marshal_expect_failure t536_D; + marshal_expect_failure t537_A; + marshal_expect_failure t537_B; + marshal_expect_failure t538_A; + marshal_expect_failure t538_B; + marshal_expect_failure t538_C; + marshal_expect_failure t539_A; + marshal_expect_failure t539_B; + marshal_expect_failure t539_C; + marshal_expect_failure t539_D; + marshal_expect_failure t540_A; + marshal_expect_failure t540_B; + marshal_expect_failure t540_C; + marshal_expect_failure t541_A; + marshal_expect_failure t541_B; + marshal_expect_failure t541_C; + marshal_expect_failure t541_D; + marshal_expect_failure t541_E; + marshal_expect_failure t542_A; + marshal_expect_failure t542_B; + marshal_expect_failure t543_A; + marshal_expect_failure t543_B; + marshal_expect_failure t543_C; + marshal_expect_failure t544_A; + marshal_expect_failure t544_B; + marshal_expect_failure t544_C; + marshal_expect_failure t544_D; + marshal_expect_failure t545_A; + marshal_expect_failure t545_B; + marshal_expect_failure t545_C; + marshal_expect_failure t546_A; + marshal_expect_failure t546_B; + marshal_expect_failure t547_A; + marshal_expect_failure t547_B; + marshal_expect_failure t547_C; + marshal_expect_failure t548_A; + marshal_expect_failure t548_B; + marshal_expect_failure t548_C; + marshal_expect_failure t548_D; + marshal_expect_failure t549_A; + marshal_expect_failure t549_B; + marshal_expect_failure t550_A; + marshal_expect_failure t550_B; + marshal_expect_failure t550_C; + marshal_expect_failure t551_A; + marshal_expect_failure t551_B; + marshal_expect_failure t552_A; + marshal_expect_failure t553_A; + marshal_expect_failure t553_B; + marshal_expect_failure t553_C; + marshal_expect_failure t554_A; + marshal_expect_failure t554_B; + marshal_expect_failure t555_A; + marshal_expect_failure t555_B; + marshal_expect_failure t555_C; + marshal_expect_failure t556_A; + marshal_expect_failure t556_B; + marshal_expect_failure t556_C; + marshal_expect_failure t556_D; + marshal_expect_failure t557_A; + marshal_expect_failure t557_B; + marshal_expect_failure t557_C; + marshal_expect_failure t558_A; + marshal_expect_failure t558_B; + marshal_expect_failure t558_C; + marshal_expect_failure t558_D; + marshal_expect_failure t558_E; + marshal_expect_failure t559_A; + marshal_expect_failure t559_B; + marshal_expect_failure t559_C; + marshal_expect_failure t559_D; + marshal_expect_failure t560_A; + marshal_expect_failure t560_B; + marshal_expect_failure t561_A; + marshal_expect_failure t561_B; + marshal_expect_failure t561_C; + marshal_expect_failure t562_A; + marshal_expect_failure t562_B; + marshal_expect_failure t562_C; + marshal_expect_failure t562_D; + marshal_expect_failure t563_A; + marshal_expect_failure t563_B; + marshal_expect_failure t563_C; + marshal_expect_failure t564_A; + marshal_expect_failure t564_B; + marshal_expect_failure t564_C; + marshal_expect_failure t564_D; + marshal_expect_failure t564_E; + marshal_expect_failure t565_A; + marshal_expect_failure t565_B; + marshal_expect_failure t566_A; + marshal_expect_failure t566_B; + marshal_expect_failure t566_C; + marshal_expect_failure t567_A; + marshal_expect_failure t567_B; + marshal_expect_failure t567_C; + marshal_expect_failure t567_D; + marshal_expect_failure t568_A; + marshal_expect_failure t568_B; + marshal_expect_failure t568_C; + marshal_expect_failure t569_A; + marshal_expect_failure t569_B; + marshal_expect_failure t570_A; + marshal_expect_failure t570_B; + marshal_expect_failure t570_C; + marshal_expect_failure t571_A; + marshal_expect_failure t571_B; + marshal_expect_failure t571_C; + marshal_expect_failure t571_D; + marshal_expect_failure t572_A; + marshal_expect_failure t572_B; + marshal_expect_failure t573_A; + marshal_expect_failure t573_B; + marshal_expect_failure t573_C; + marshal_expect_failure t574_A; + marshal_expect_failure t574_B; + marshal_expect_failure t575_A; + marshal_expect_failure t576_A; + marshal_expect_failure t576_B; + marshal_expect_failure t576_C; + marshal_expect_failure t576_D; + marshal_expect_failure t577_A; + marshal_expect_failure t577_B; + marshal_expect_failure t577_C; + marshal_expect_failure t578_A; + marshal_expect_failure t578_B; + marshal_expect_failure t579_A; + marshal_expect_failure t579_B; + marshal_expect_failure t579_C; + marshal_expect_failure t580_A; + marshal_expect_failure t580_B; + marshal_expect_failure t580_C; + marshal_expect_failure t580_D; + marshal_expect_failure t581_A; + marshal_expect_failure t581_B; + marshal_expect_failure t581_C; + marshal_expect_failure t582_A; + marshal_expect_failure t582_B; + marshal_expect_failure t582_C; + marshal_expect_failure t582_D; + marshal_expect_failure t582_E; + marshal_expect_failure t583_A; + marshal_expect_failure t583_B; + marshal_expect_failure t583_C; + marshal_expect_failure t583_D; + marshal_expect_failure t584_A; + marshal_expect_failure t584_B; + marshal_expect_failure t585_A; + marshal_expect_failure t585_B; + marshal_expect_failure t585_C; + marshal_expect_failure t586_A; + marshal_expect_failure t586_B; + marshal_expect_failure t586_C; + marshal_expect_failure t586_D; + marshal_expect_failure t587_A; + marshal_expect_failure t587_B; + marshal_expect_failure t587_C; + marshal_expect_failure t588_A; + marshal_expect_failure t588_B; + marshal_expect_failure t588_C; + marshal_expect_failure t588_D; + marshal_expect_failure t588_E; + marshal_expect_failure t589_A; + marshal_expect_failure t589_B; + marshal_expect_failure t590_A; + marshal_expect_failure t590_B; + marshal_expect_failure t590_C; + marshal_expect_failure t591_A; + marshal_expect_failure t591_B; + marshal_expect_failure t591_C; + marshal_expect_failure t591_D; + marshal_expect_failure t592_A; + marshal_expect_failure t592_B; + marshal_expect_failure t592_C; + marshal_expect_failure t593_A; + marshal_expect_failure t593_B; + marshal_expect_failure t594_A; + marshal_expect_failure t594_B; + marshal_expect_failure t594_C; + marshal_expect_failure t595_A; + marshal_expect_failure t595_B; + marshal_expect_failure t595_C; + marshal_expect_failure t595_D; + marshal_expect_failure t596_A; + marshal_expect_failure t596_B; + marshal_expect_failure t597_A; + marshal_expect_failure t597_B; + marshal_expect_failure t597_C; + marshal_expect_failure t598_A; + marshal_expect_failure t598_B; + marshal_expect_failure t599_A; + print_endline " - Hashing"; + hash_expect_failure t0; + hash_expect_failure t1; + hash_expect_failure t2; + hash_expect_failure t3; + hash_expect_failure t4; + hash_expect_failure t5; + hash_expect_failure t6; + hash_expect_failure t7; + hash_expect_failure t8; + hash_expect_failure t9; + hash_expect_failure t10; + hash_expect_failure t11; + hash_expect_failure t12; + hash_expect_failure t13; + hash_expect_failure t14; + hash_expect_failure t15; + hash_expect_failure t16; + hash_expect_failure t17; + hash_expect_failure t18; + hash_expect_failure t19; + hash_expect_failure t20; + hash_expect_failure t21; + hash_expect_failure t22; + hash_expect_failure t23; + hash_expect_failure t24; + hash_expect_failure t25; + hash_expect_failure t26; + hash_expect_failure t27; + hash_expect_failure t28; + hash_expect_failure t29; + hash_expect_failure t30; + hash_expect_failure t31; + hash_expect_failure t32; + hash_expect_failure t33; + hash_expect_failure t34; + hash_expect_failure t35; + hash_expect_failure t36; + hash_expect_failure t37; + hash_expect_failure t38; + hash_expect_failure t39; + hash_expect_failure t40; + hash_expect_failure t41; + hash_expect_failure t42; + hash_expect_failure t43; + hash_expect_failure t44; + hash_expect_failure t45; + hash_expect_failure t46; + hash_expect_failure t47; + hash_expect_failure t48; + hash_expect_failure t49; + hash_expect_failure t50; + hash_expect_failure t51; + hash_expect_failure t52; + hash_expect_failure t53; + hash_expect_failure t54; + hash_expect_failure t55; + hash_expect_failure t56; + hash_expect_failure t57; + hash_expect_failure t58; + hash_expect_failure t59; + hash_expect_failure t60; + hash_expect_failure t61; + hash_expect_failure t62; + hash_expect_failure t63; + hash_expect_failure t64; + hash_expect_failure t65; + hash_expect_failure t66; + hash_expect_failure t67; + hash_expect_failure t68; + hash_expect_failure t69; + hash_expect_failure t70; + hash_expect_failure t71; + hash_expect_failure t72; + hash_expect_failure t73; + hash_expect_failure t74; + hash_expect_failure t75; + hash_expect_failure t76; + hash_expect_failure t77; + hash_expect_failure t78; + hash_expect_failure t79; + hash_expect_failure t80; + hash_expect_failure t81; + hash_expect_failure t82; + hash_expect_failure t83; + hash_expect_failure t84; + hash_expect_failure t85; + hash_expect_failure t86; + hash_expect_failure t87; + hash_expect_failure t88; + hash_expect_failure t89; + hash_expect_failure t90; + hash_expect_failure t91; + hash_expect_failure t92; + hash_expect_failure t93; + hash_expect_failure t94; + hash_expect_failure t95; + hash_expect_failure t96; + hash_expect_failure t97; + hash_expect_failure t98; + hash_expect_failure t99; + hash_expect_failure t100; + hash_expect_failure t101; + hash_expect_failure t102; + hash_expect_failure t103; + hash_expect_failure t104; + hash_expect_failure t105; + hash_expect_failure t106; + hash_expect_failure t107; + hash_expect_failure t108; + hash_expect_failure t109; + hash_expect_failure t110; + hash_expect_failure t111; + hash_expect_failure t112; + hash_expect_failure t113; + hash_expect_failure t114; + hash_expect_failure t115; + hash_expect_failure t116; + hash_expect_failure t117; + hash_expect_failure t118; + hash_expect_failure t119; + hash_expect_failure t120; + hash_expect_failure t121; + hash_expect_failure t122; + hash_expect_failure t123; + hash_expect_failure t124; + hash_expect_failure t125; + hash_expect_failure t126; + hash_expect_failure t127; + hash_expect_failure t128; + hash_expect_failure t129; + hash_expect_failure t130; + hash_expect_failure t131; + hash_expect_failure t132; + hash_expect_failure t133; + hash_expect_failure t134; + hash_expect_failure t135; + hash_expect_failure t136; + hash_expect_failure t137; + hash_expect_failure t138; + hash_expect_failure t139; + hash_expect_failure t140; + hash_expect_failure t141; + hash_expect_failure t142; + hash_expect_failure t143; + hash_expect_failure t144; + hash_expect_failure t145; + hash_expect_failure t146; + hash_expect_failure t147; + hash_expect_failure t148; + hash_expect_failure t149; + hash_expect_failure t150; + hash_expect_failure t151; + hash_expect_failure t152; + hash_expect_failure t153; + hash_expect_failure t154; + hash_expect_failure t155; + hash_expect_failure t156; + hash_expect_failure t157; + hash_expect_failure t158; + hash_expect_failure t159; + hash_expect_failure t160; + hash_expect_failure t161; + hash_expect_failure t162; + hash_expect_failure t163; + hash_expect_failure t164; + hash_expect_failure t165; + hash_expect_failure t166; + hash_expect_failure t167; + hash_expect_failure t168; + hash_expect_failure t169; + hash_expect_failure t170; + hash_expect_failure t171; + hash_expect_failure t172; + hash_expect_failure t173; + hash_expect_failure t174; + hash_expect_failure t175; + hash_expect_failure t176; + hash_expect_failure t177; + hash_expect_failure t178; + hash_expect_failure t179; + hash_expect_failure t180; + hash_expect_failure t181; + hash_expect_failure t182; + hash_expect_failure t183; + hash_expect_failure t184; + hash_expect_failure t185; + hash_expect_failure t186; + hash_expect_failure t187; + hash_expect_failure t188; + hash_expect_failure t189; + hash_expect_failure t190; + hash_expect_failure t191; + hash_expect_failure t192; + hash_expect_failure t193; + hash_expect_failure t194; + hash_expect_failure t195; + hash_expect_failure t196; + hash_expect_failure t197; + hash_expect_failure t198; + hash_expect_failure t199; + hash_expect_failure t200; + hash_expect_failure t201; + hash_expect_failure t202; + hash_expect_failure t203; + hash_expect_failure t204; + hash_expect_failure t205; + hash_expect_failure t206; + hash_expect_failure t207; + hash_expect_failure t208; + hash_expect_failure t209; + hash_expect_failure t210; + hash_expect_failure t211; + hash_expect_failure t212; + hash_expect_failure t213; + hash_expect_failure t214; + hash_expect_failure t215; + hash_expect_failure t216; + hash_expect_failure t217; + hash_expect_failure t218; + hash_expect_failure t219; + hash_expect_failure t220; + hash_expect_failure t221; + hash_expect_failure t222; + hash_expect_failure t223; + hash_expect_failure t224; + hash_expect_failure t225; + hash_expect_failure t226; + hash_expect_failure t227; + hash_expect_failure t228; + hash_expect_failure t229; + hash_expect_failure t230; + hash_expect_failure t231; + hash_expect_failure t232; + hash_expect_failure t233; + hash_expect_failure t234; + hash_expect_failure t235; + hash_expect_failure t236; + hash_expect_failure t237; + hash_expect_failure t238; + hash_expect_failure t239; + hash_expect_failure t240; + hash_expect_failure t241; + hash_expect_failure t242; + hash_expect_failure t243; + hash_expect_failure t244; + hash_expect_failure t245; + hash_expect_failure t246; + hash_expect_failure t247; + hash_expect_failure t248; + hash_expect_failure t249; + hash_expect_failure t250; + hash_expect_failure t251; + hash_expect_failure t252; + hash_expect_failure t253; + hash_expect_failure t254; + hash_expect_failure t255; + hash_expect_failure t256; + hash_expect_failure t257; + hash_expect_failure t258; + hash_expect_failure t259; + hash_expect_failure t260; + hash_expect_failure t261; + hash_expect_failure t262; + hash_expect_failure t263; + hash_expect_failure t264; + hash_expect_failure t265; + hash_expect_failure t266; + hash_expect_failure t267; + hash_expect_failure t268; + hash_expect_failure t269; + hash_expect_failure t270; + hash_expect_failure t271; + hash_expect_failure t272; + hash_expect_failure t273; + hash_expect_failure t274; + hash_expect_failure t275; + hash_expect_failure t276; + hash_expect_failure t277; + hash_expect_failure t278; + hash_expect_failure t279; + hash_expect_failure t280; + hash_expect_failure t281; + hash_expect_failure t282; + hash_expect_failure t283; + hash_expect_failure t284; + hash_expect_failure t285; + hash_expect_failure t286; + hash_expect_failure t287; + hash_expect_failure t288; + hash_expect_failure t289; + hash_expect_failure t290; + hash_expect_failure t291; + hash_expect_failure t292; + hash_expect_failure t293; + hash_expect_failure t294; + hash_expect_failure t295; + hash_expect_failure t296; + hash_expect_failure t297; + hash_expect_failure t298; + hash_expect_failure t299; + hash_expect_failure t300_A; + hash_expect_failure t301_A; + hash_expect_failure t301_B; + hash_expect_failure t302_A; + hash_expect_failure t303_A; + hash_expect_failure t303_B; + hash_expect_failure t303_C; + hash_expect_failure t304_A; + hash_expect_failure t304_B; + hash_expect_failure t305_A; + hash_expect_failure t306_A; + hash_expect_failure t306_B; + hash_expect_failure t307_A; + hash_expect_failure t307_B; + hash_expect_failure t307_C; + hash_expect_failure t308_A; + hash_expect_failure t308_B; + hash_expect_failure t309_A; + hash_expect_failure t310_A; + hash_expect_failure t310_B; + hash_expect_failure t310_C; + hash_expect_failure t310_D; + hash_expect_failure t311_A; + hash_expect_failure t311_B; + hash_expect_failure t312_A; + hash_expect_failure t312_B; + hash_expect_failure t312_C; + hash_expect_failure t313_A; + hash_expect_failure t313_B; + hash_expect_failure t314_A; + hash_expect_failure t315_A; + hash_expect_failure t315_B; + hash_expect_failure t315_C; + hash_expect_failure t316_A; + hash_expect_failure t316_B; + hash_expect_failure t316_C; + hash_expect_failure t316_D; + hash_expect_failure t317_A; + hash_expect_failure t317_B; + hash_expect_failure t318_A; + hash_expect_failure t318_B; + hash_expect_failure t318_C; + hash_expect_failure t319_A; + hash_expect_failure t319_B; + hash_expect_failure t320_A; + hash_expect_failure t321_A; + hash_expect_failure t321_B; + hash_expect_failure t322_A; + hash_expect_failure t322_B; + hash_expect_failure t322_C; + hash_expect_failure t323_A; + hash_expect_failure t323_B; + hash_expect_failure t323_C; + hash_expect_failure t323_D; + hash_expect_failure t324_A; + hash_expect_failure t324_B; + hash_expect_failure t325_A; + hash_expect_failure t325_B; + hash_expect_failure t325_C; + hash_expect_failure t326_A; + hash_expect_failure t326_B; + hash_expect_failure t327_A; + hash_expect_failure t328_A; + hash_expect_failure t328_B; + hash_expect_failure t328_C; + hash_expect_failure t329_A; + hash_expect_failure t329_B; + hash_expect_failure t330_A; + hash_expect_failure t330_B; + hash_expect_failure t330_C; + hash_expect_failure t331_A; + hash_expect_failure t331_B; + hash_expect_failure t331_C; + hash_expect_failure t331_D; + hash_expect_failure t332_A; + hash_expect_failure t332_B; + hash_expect_failure t333_A; + hash_expect_failure t333_B; + hash_expect_failure t333_C; + hash_expect_failure t334_A; + hash_expect_failure t334_B; + hash_expect_failure t335_A; + hash_expect_failure t336_A; + hash_expect_failure t336_B; + hash_expect_failure t336_C; + hash_expect_failure t336_D; + hash_expect_failure t337_A; + hash_expect_failure t337_B; + hash_expect_failure t337_C; + hash_expect_failure t338_A; + hash_expect_failure t338_B; + hash_expect_failure t339_A; + hash_expect_failure t339_B; + hash_expect_failure t339_C; + hash_expect_failure t340_A; + hash_expect_failure t340_B; + hash_expect_failure t340_C; + hash_expect_failure t340_D; + hash_expect_failure t341_A; + hash_expect_failure t341_B; + hash_expect_failure t342_A; + hash_expect_failure t342_B; + hash_expect_failure t342_C; + hash_expect_failure t343_A; + hash_expect_failure t343_B; + hash_expect_failure t344_A; + hash_expect_failure t345_A; + hash_expect_failure t345_B; + hash_expect_failure t345_C; + hash_expect_failure t346_A; + hash_expect_failure t346_B; + hash_expect_failure t346_C; + hash_expect_failure t346_D; + hash_expect_failure t347_A; + hash_expect_failure t347_B; + hash_expect_failure t347_C; + hash_expect_failure t348_A; + hash_expect_failure t348_B; + hash_expect_failure t349_A; + hash_expect_failure t349_B; + hash_expect_failure t349_C; + hash_expect_failure t350_A; + hash_expect_failure t350_B; + hash_expect_failure t350_C; + hash_expect_failure t350_D; + hash_expect_failure t351_A; + hash_expect_failure t351_B; + hash_expect_failure t352_A; + hash_expect_failure t352_B; + hash_expect_failure t352_C; + hash_expect_failure t353_A; + hash_expect_failure t353_B; + hash_expect_failure t354_A; + hash_expect_failure t355_A; + hash_expect_failure t355_B; + hash_expect_failure t356_A; + hash_expect_failure t356_B; + hash_expect_failure t356_C; + hash_expect_failure t357_A; + hash_expect_failure t357_B; + hash_expect_failure t357_C; + hash_expect_failure t357_D; + hash_expect_failure t358_A; + hash_expect_failure t358_B; + hash_expect_failure t358_C; + hash_expect_failure t359_A; + hash_expect_failure t359_B; + hash_expect_failure t360_A; + hash_expect_failure t360_B; + hash_expect_failure t360_C; + hash_expect_failure t361_A; + hash_expect_failure t361_B; + hash_expect_failure t361_C; + hash_expect_failure t361_D; + hash_expect_failure t362_A; + hash_expect_failure t362_B; + hash_expect_failure t363_A; + hash_expect_failure t363_B; + hash_expect_failure t363_C; + hash_expect_failure t364_A; + hash_expect_failure t364_B; + hash_expect_failure t365_A; + hash_expect_failure t366_A; + hash_expect_failure t366_B; + hash_expect_failure t366_C; + hash_expect_failure t366_D; + hash_expect_failure t366_E; + hash_expect_failure t367_A; + hash_expect_failure t367_B; + hash_expect_failure t368_A; + hash_expect_failure t368_B; + hash_expect_failure t368_C; + hash_expect_failure t369_A; + hash_expect_failure t369_B; + hash_expect_failure t369_C; + hash_expect_failure t369_D; + hash_expect_failure t370_A; + hash_expect_failure t370_B; + hash_expect_failure t370_C; + hash_expect_failure t371_A; + hash_expect_failure t371_B; + hash_expect_failure t372_A; + hash_expect_failure t372_B; + hash_expect_failure t372_C; + hash_expect_failure t373_A; + hash_expect_failure t373_B; + hash_expect_failure t373_C; + hash_expect_failure t373_D; + hash_expect_failure t374_A; + hash_expect_failure t374_B; + hash_expect_failure t375_A; + hash_expect_failure t375_B; + hash_expect_failure t375_C; + hash_expect_failure t376_A; + hash_expect_failure t376_B; + hash_expect_failure t377_A; + hash_expect_failure t378_A; + hash_expect_failure t378_B; + hash_expect_failure t378_C; + hash_expect_failure t379_A; + hash_expect_failure t379_B; + hash_expect_failure t379_C; + hash_expect_failure t379_D; + hash_expect_failure t379_E; + hash_expect_failure t380_A; + hash_expect_failure t380_B; + hash_expect_failure t381_A; + hash_expect_failure t381_B; + hash_expect_failure t381_C; + hash_expect_failure t382_A; + hash_expect_failure t382_B; + hash_expect_failure t382_C; + hash_expect_failure t382_D; + hash_expect_failure t383_A; + hash_expect_failure t383_B; + hash_expect_failure t383_C; + hash_expect_failure t384_A; + hash_expect_failure t384_B; + hash_expect_failure t385_A; + hash_expect_failure t385_B; + hash_expect_failure t385_C; + hash_expect_failure t386_A; + hash_expect_failure t386_B; + hash_expect_failure t386_C; + hash_expect_failure t386_D; + hash_expect_failure t387_A; + hash_expect_failure t387_B; + hash_expect_failure t388_A; + hash_expect_failure t388_B; + hash_expect_failure t388_C; + hash_expect_failure t389_A; + hash_expect_failure t389_B; + hash_expect_failure t390_A; + hash_expect_failure t391_A; + hash_expect_failure t391_B; + hash_expect_failure t391_C; + hash_expect_failure t391_D; + hash_expect_failure t392_A; + hash_expect_failure t392_B; + hash_expect_failure t392_C; + hash_expect_failure t393_A; + hash_expect_failure t393_B; + hash_expect_failure t393_C; + hash_expect_failure t393_D; + hash_expect_failure t393_E; + hash_expect_failure t394_A; + hash_expect_failure t394_B; + hash_expect_failure t395_A; + hash_expect_failure t395_B; + hash_expect_failure t395_C; + hash_expect_failure t396_A; + hash_expect_failure t396_B; + hash_expect_failure t396_C; + hash_expect_failure t396_D; + hash_expect_failure t397_A; + hash_expect_failure t397_B; + hash_expect_failure t397_C; + hash_expect_failure t398_A; + hash_expect_failure t398_B; + hash_expect_failure t399_A; + hash_expect_failure t399_B; + hash_expect_failure t399_C; + hash_expect_failure t400_A; + hash_expect_failure t400_B; + hash_expect_failure t400_C; + hash_expect_failure t400_D; + hash_expect_failure t401_A; + hash_expect_failure t401_B; + hash_expect_failure t402_A; + hash_expect_failure t402_B; + hash_expect_failure t402_C; + hash_expect_failure t403_A; + hash_expect_failure t403_B; + hash_expect_failure t404_A; + hash_expect_failure t405_A; + hash_expect_failure t405_B; + hash_expect_failure t405_C; + hash_expect_failure t406_A; + hash_expect_failure t406_B; + hash_expect_failure t406_C; + hash_expect_failure t406_D; + hash_expect_failure t407_A; + hash_expect_failure t407_B; + hash_expect_failure t407_C; + hash_expect_failure t408_A; + hash_expect_failure t408_B; + hash_expect_failure t408_C; + hash_expect_failure t408_D; + hash_expect_failure t408_E; + hash_expect_failure t409_A; + hash_expect_failure t409_B; + hash_expect_failure t410_A; + hash_expect_failure t410_B; + hash_expect_failure t410_C; + hash_expect_failure t411_A; + hash_expect_failure t411_B; + hash_expect_failure t411_C; + hash_expect_failure t411_D; + hash_expect_failure t412_A; + hash_expect_failure t412_B; + hash_expect_failure t412_C; + hash_expect_failure t413_A; + hash_expect_failure t413_B; + hash_expect_failure t414_A; + hash_expect_failure t414_B; + hash_expect_failure t414_C; + hash_expect_failure t415_A; + hash_expect_failure t415_B; + hash_expect_failure t415_C; + hash_expect_failure t415_D; + hash_expect_failure t416_A; + hash_expect_failure t416_B; + hash_expect_failure t417_A; + hash_expect_failure t417_B; + hash_expect_failure t417_C; + hash_expect_failure t418_A; + hash_expect_failure t418_B; + hash_expect_failure t419_A; + hash_expect_failure t420_A; + hash_expect_failure t420_B; + hash_expect_failure t421_A; + hash_expect_failure t421_B; + hash_expect_failure t421_C; + hash_expect_failure t422_A; + hash_expect_failure t422_B; + hash_expect_failure t422_C; + hash_expect_failure t422_D; + hash_expect_failure t423_A; + hash_expect_failure t423_B; + hash_expect_failure t423_C; + hash_expect_failure t424_A; + hash_expect_failure t424_B; + hash_expect_failure t424_C; + hash_expect_failure t424_D; + hash_expect_failure t424_E; + hash_expect_failure t425_A; + hash_expect_failure t425_B; + hash_expect_failure t426_A; + hash_expect_failure t426_B; + hash_expect_failure t426_C; + hash_expect_failure t427_A; + hash_expect_failure t427_B; + hash_expect_failure t427_C; + hash_expect_failure t427_D; + hash_expect_failure t428_A; + hash_expect_failure t428_B; + hash_expect_failure t428_C; + hash_expect_failure t429_A; + hash_expect_failure t429_B; + hash_expect_failure t430_A; + hash_expect_failure t430_B; + hash_expect_failure t430_C; + hash_expect_failure t431_A; + hash_expect_failure t431_B; + hash_expect_failure t431_C; + hash_expect_failure t431_D; + hash_expect_failure t432_A; + hash_expect_failure t432_B; + hash_expect_failure t433_A; + hash_expect_failure t433_B; + hash_expect_failure t433_C; + hash_expect_failure t434_A; + hash_expect_failure t434_B; + hash_expect_failure t435_A; + hash_expect_failure t436_A; + hash_expect_failure t436_B; + hash_expect_failure t436_C; + hash_expect_failure t436_D; + hash_expect_failure t437_A; + hash_expect_failure t437_B; + hash_expect_failure t438_A; + hash_expect_failure t438_B; + hash_expect_failure t438_C; + hash_expect_failure t439_A; + hash_expect_failure t439_B; + hash_expect_failure t439_C; + hash_expect_failure t439_D; + hash_expect_failure t440_A; + hash_expect_failure t440_B; + hash_expect_failure t440_C; + hash_expect_failure t441_A; + hash_expect_failure t441_B; + hash_expect_failure t441_C; + hash_expect_failure t441_D; + hash_expect_failure t441_E; + hash_expect_failure t442_A; + hash_expect_failure t442_B; + hash_expect_failure t443_A; + hash_expect_failure t443_B; + hash_expect_failure t443_C; + hash_expect_failure t444_A; + hash_expect_failure t444_B; + hash_expect_failure t444_C; + hash_expect_failure t444_D; + hash_expect_failure t445_A; + hash_expect_failure t445_B; + hash_expect_failure t445_C; + hash_expect_failure t446_A; + hash_expect_failure t446_B; + hash_expect_failure t447_A; + hash_expect_failure t447_B; + hash_expect_failure t447_C; + hash_expect_failure t448_A; + hash_expect_failure t448_B; + hash_expect_failure t448_C; + hash_expect_failure t448_D; + hash_expect_failure t449_A; + hash_expect_failure t449_B; + hash_expect_failure t450_A; + hash_expect_failure t450_B; + hash_expect_failure t450_C; + hash_expect_failure t451_A; + hash_expect_failure t451_B; + hash_expect_failure t452_A; + hash_expect_failure t453_A; + hash_expect_failure t453_B; + hash_expect_failure t453_C; + hash_expect_failure t453_D; + hash_expect_failure t453_E; + hash_expect_failure t454_A; + hash_expect_failure t454_B; + hash_expect_failure t454_C; + hash_expect_failure t454_D; + hash_expect_failure t455_A; + hash_expect_failure t455_B; + hash_expect_failure t456_A; + hash_expect_failure t456_B; + hash_expect_failure t456_C; + hash_expect_failure t457_A; + hash_expect_failure t457_B; + hash_expect_failure t457_C; + hash_expect_failure t457_D; + hash_expect_failure t458_A; + hash_expect_failure t458_B; + hash_expect_failure t458_C; + hash_expect_failure t459_A; + hash_expect_failure t459_B; + hash_expect_failure t459_C; + hash_expect_failure t459_D; + hash_expect_failure t459_E; + hash_expect_failure t460_A; + hash_expect_failure t460_B; + hash_expect_failure t461_A; + hash_expect_failure t461_B; + hash_expect_failure t461_C; + hash_expect_failure t462_A; + hash_expect_failure t462_B; + hash_expect_failure t462_C; + hash_expect_failure t462_D; + hash_expect_failure t463_A; + hash_expect_failure t463_B; + hash_expect_failure t463_C; + hash_expect_failure t464_A; + hash_expect_failure t464_B; + hash_expect_failure t465_A; + hash_expect_failure t465_B; + hash_expect_failure t465_C; + hash_expect_failure t466_A; + hash_expect_failure t466_B; + hash_expect_failure t466_C; + hash_expect_failure t466_D; + hash_expect_failure t467_A; + hash_expect_failure t467_B; + hash_expect_failure t468_A; + hash_expect_failure t468_B; + hash_expect_failure t468_C; + hash_expect_failure t469_A; + hash_expect_failure t469_B; + hash_expect_failure t470_A; + hash_expect_failure t471_A; + hash_expect_failure t471_B; + hash_expect_failure t471_C; + hash_expect_failure t472_A; + hash_expect_failure t472_B; + hash_expect_failure t472_C; + hash_expect_failure t472_D; + hash_expect_failure t472_E; + hash_expect_failure t473_A; + hash_expect_failure t473_B; + hash_expect_failure t473_C; + hash_expect_failure t473_D; + hash_expect_failure t474_A; + hash_expect_failure t474_B; + hash_expect_failure t475_A; + hash_expect_failure t475_B; + hash_expect_failure t475_C; + hash_expect_failure t476_A; + hash_expect_failure t476_B; + hash_expect_failure t476_C; + hash_expect_failure t476_D; + hash_expect_failure t477_A; + hash_expect_failure t477_B; + hash_expect_failure t477_C; + hash_expect_failure t478_A; + hash_expect_failure t478_B; + hash_expect_failure t478_C; + hash_expect_failure t478_D; + hash_expect_failure t478_E; + hash_expect_failure t479_A; + hash_expect_failure t479_B; + hash_expect_failure t480_A; + hash_expect_failure t480_B; + hash_expect_failure t480_C; + hash_expect_failure t481_A; + hash_expect_failure t481_B; + hash_expect_failure t481_C; + hash_expect_failure t481_D; + hash_expect_failure t482_A; + hash_expect_failure t482_B; + hash_expect_failure t482_C; + hash_expect_failure t483_A; + hash_expect_failure t483_B; + hash_expect_failure t484_A; + hash_expect_failure t484_B; + hash_expect_failure t484_C; + hash_expect_failure t485_A; + hash_expect_failure t485_B; + hash_expect_failure t485_C; + hash_expect_failure t485_D; + hash_expect_failure t486_A; + hash_expect_failure t486_B; + hash_expect_failure t487_A; + hash_expect_failure t487_B; + hash_expect_failure t487_C; + hash_expect_failure t488_A; + hash_expect_failure t488_B; + hash_expect_failure t489_A; + hash_expect_failure t490_A; + hash_expect_failure t490_B; + hash_expect_failure t490_C; + hash_expect_failure t490_D; + hash_expect_failure t491_A; + hash_expect_failure t491_B; + hash_expect_failure t491_C; + hash_expect_failure t492_A; + hash_expect_failure t492_B; + hash_expect_failure t492_C; + hash_expect_failure t492_D; + hash_expect_failure t492_E; + hash_expect_failure t493_A; + hash_expect_failure t493_B; + hash_expect_failure t493_C; + hash_expect_failure t493_D; + hash_expect_failure t494_A; + hash_expect_failure t494_B; + hash_expect_failure t495_A; + hash_expect_failure t495_B; + hash_expect_failure t495_C; + hash_expect_failure t496_A; + hash_expect_failure t496_B; + hash_expect_failure t496_C; + hash_expect_failure t496_D; + hash_expect_failure t497_A; + hash_expect_failure t497_B; + hash_expect_failure t497_C; + hash_expect_failure t498_A; + hash_expect_failure t498_B; + hash_expect_failure t498_C; + hash_expect_failure t498_D; + hash_expect_failure t498_E; + hash_expect_failure t499_A; + hash_expect_failure t499_B; + hash_expect_failure t500_A; + hash_expect_failure t500_B; + hash_expect_failure t500_C; + hash_expect_failure t501_A; + hash_expect_failure t501_B; + hash_expect_failure t501_C; + hash_expect_failure t501_D; + hash_expect_failure t502_A; + hash_expect_failure t502_B; + hash_expect_failure t502_C; + hash_expect_failure t503_A; + hash_expect_failure t503_B; + hash_expect_failure t504_A; + hash_expect_failure t504_B; + hash_expect_failure t504_C; + hash_expect_failure t505_A; + hash_expect_failure t505_B; + hash_expect_failure t505_C; + hash_expect_failure t505_D; + hash_expect_failure t506_A; + hash_expect_failure t506_B; + hash_expect_failure t507_A; + hash_expect_failure t507_B; + hash_expect_failure t507_C; + hash_expect_failure t508_A; + hash_expect_failure t508_B; + hash_expect_failure t509_A; + hash_expect_failure t510_A; + hash_expect_failure t510_B; + hash_expect_failure t510_C; + hash_expect_failure t511_A; + hash_expect_failure t511_B; + hash_expect_failure t511_C; + hash_expect_failure t511_D; + hash_expect_failure t512_A; + hash_expect_failure t512_B; + hash_expect_failure t512_C; + hash_expect_failure t513_A; + hash_expect_failure t513_B; + hash_expect_failure t513_C; + hash_expect_failure t513_D; + hash_expect_failure t513_E; + hash_expect_failure t514_A; + hash_expect_failure t514_B; + hash_expect_failure t514_C; + hash_expect_failure t514_D; + hash_expect_failure t515_A; + hash_expect_failure t515_B; + hash_expect_failure t516_A; + hash_expect_failure t516_B; + hash_expect_failure t516_C; + hash_expect_failure t517_A; + hash_expect_failure t517_B; + hash_expect_failure t517_C; + hash_expect_failure t517_D; + hash_expect_failure t518_A; + hash_expect_failure t518_B; + hash_expect_failure t518_C; + hash_expect_failure t519_A; + hash_expect_failure t519_B; + hash_expect_failure t519_C; + hash_expect_failure t519_D; + hash_expect_failure t519_E; + hash_expect_failure t520_A; + hash_expect_failure t520_B; + hash_expect_failure t521_A; + hash_expect_failure t521_B; + hash_expect_failure t521_C; + hash_expect_failure t522_A; + hash_expect_failure t522_B; + hash_expect_failure t522_C; + hash_expect_failure t522_D; + hash_expect_failure t523_A; + hash_expect_failure t523_B; + hash_expect_failure t523_C; + hash_expect_failure t524_A; + hash_expect_failure t524_B; + hash_expect_failure t525_A; + hash_expect_failure t525_B; + hash_expect_failure t525_C; + hash_expect_failure t526_A; + hash_expect_failure t526_B; + hash_expect_failure t526_C; + hash_expect_failure t526_D; + hash_expect_failure t527_A; + hash_expect_failure t527_B; + hash_expect_failure t528_A; + hash_expect_failure t528_B; + hash_expect_failure t528_C; + hash_expect_failure t529_A; + hash_expect_failure t529_B; + hash_expect_failure t530_A; + hash_expect_failure t531_A; + hash_expect_failure t531_B; + hash_expect_failure t532_A; + hash_expect_failure t532_B; + hash_expect_failure t532_C; + hash_expect_failure t533_A; + hash_expect_failure t533_B; + hash_expect_failure t533_C; + hash_expect_failure t533_D; + hash_expect_failure t534_A; + hash_expect_failure t534_B; + hash_expect_failure t534_C; + hash_expect_failure t535_A; + hash_expect_failure t535_B; + hash_expect_failure t535_C; + hash_expect_failure t535_D; + hash_expect_failure t535_E; + hash_expect_failure t536_A; + hash_expect_failure t536_B; + hash_expect_failure t536_C; + hash_expect_failure t536_D; + hash_expect_failure t537_A; + hash_expect_failure t537_B; + hash_expect_failure t538_A; + hash_expect_failure t538_B; + hash_expect_failure t538_C; + hash_expect_failure t539_A; + hash_expect_failure t539_B; + hash_expect_failure t539_C; + hash_expect_failure t539_D; + hash_expect_failure t540_A; + hash_expect_failure t540_B; + hash_expect_failure t540_C; + hash_expect_failure t541_A; + hash_expect_failure t541_B; + hash_expect_failure t541_C; + hash_expect_failure t541_D; + hash_expect_failure t541_E; + hash_expect_failure t542_A; + hash_expect_failure t542_B; + hash_expect_failure t543_A; + hash_expect_failure t543_B; + hash_expect_failure t543_C; + hash_expect_failure t544_A; + hash_expect_failure t544_B; + hash_expect_failure t544_C; + hash_expect_failure t544_D; + hash_expect_failure t545_A; + hash_expect_failure t545_B; + hash_expect_failure t545_C; + hash_expect_failure t546_A; + hash_expect_failure t546_B; + hash_expect_failure t547_A; + hash_expect_failure t547_B; + hash_expect_failure t547_C; + hash_expect_failure t548_A; + hash_expect_failure t548_B; + hash_expect_failure t548_C; + hash_expect_failure t548_D; + hash_expect_failure t549_A; + hash_expect_failure t549_B; + hash_expect_failure t550_A; + hash_expect_failure t550_B; + hash_expect_failure t550_C; + hash_expect_failure t551_A; + hash_expect_failure t551_B; + hash_expect_failure t552_A; + hash_expect_failure t553_A; + hash_expect_failure t553_B; + hash_expect_failure t553_C; + hash_expect_failure t554_A; + hash_expect_failure t554_B; + hash_expect_failure t555_A; + hash_expect_failure t555_B; + hash_expect_failure t555_C; + hash_expect_failure t556_A; + hash_expect_failure t556_B; + hash_expect_failure t556_C; + hash_expect_failure t556_D; + hash_expect_failure t557_A; + hash_expect_failure t557_B; + hash_expect_failure t557_C; + hash_expect_failure t558_A; + hash_expect_failure t558_B; + hash_expect_failure t558_C; + hash_expect_failure t558_D; + hash_expect_failure t558_E; + hash_expect_failure t559_A; + hash_expect_failure t559_B; + hash_expect_failure t559_C; + hash_expect_failure t559_D; + hash_expect_failure t560_A; + hash_expect_failure t560_B; + hash_expect_failure t561_A; + hash_expect_failure t561_B; + hash_expect_failure t561_C; + hash_expect_failure t562_A; + hash_expect_failure t562_B; + hash_expect_failure t562_C; + hash_expect_failure t562_D; + hash_expect_failure t563_A; + hash_expect_failure t563_B; + hash_expect_failure t563_C; + hash_expect_failure t564_A; + hash_expect_failure t564_B; + hash_expect_failure t564_C; + hash_expect_failure t564_D; + hash_expect_failure t564_E; + hash_expect_failure t565_A; + hash_expect_failure t565_B; + hash_expect_failure t566_A; + hash_expect_failure t566_B; + hash_expect_failure t566_C; + hash_expect_failure t567_A; + hash_expect_failure t567_B; + hash_expect_failure t567_C; + hash_expect_failure t567_D; + hash_expect_failure t568_A; + hash_expect_failure t568_B; + hash_expect_failure t568_C; + hash_expect_failure t569_A; + hash_expect_failure t569_B; + hash_expect_failure t570_A; + hash_expect_failure t570_B; + hash_expect_failure t570_C; + hash_expect_failure t571_A; + hash_expect_failure t571_B; + hash_expect_failure t571_C; + hash_expect_failure t571_D; + hash_expect_failure t572_A; + hash_expect_failure t572_B; + hash_expect_failure t573_A; + hash_expect_failure t573_B; + hash_expect_failure t573_C; + hash_expect_failure t574_A; + hash_expect_failure t574_B; + hash_expect_failure t575_A; + hash_expect_failure t576_A; + hash_expect_failure t576_B; + hash_expect_failure t576_C; + hash_expect_failure t576_D; + hash_expect_failure t577_A; + hash_expect_failure t577_B; + hash_expect_failure t577_C; + hash_expect_failure t578_A; + hash_expect_failure t578_B; + hash_expect_failure t579_A; + hash_expect_failure t579_B; + hash_expect_failure t579_C; + hash_expect_failure t580_A; + hash_expect_failure t580_B; + hash_expect_failure t580_C; + hash_expect_failure t580_D; + hash_expect_failure t581_A; + hash_expect_failure t581_B; + hash_expect_failure t581_C; + hash_expect_failure t582_A; + hash_expect_failure t582_B; + hash_expect_failure t582_C; + hash_expect_failure t582_D; + hash_expect_failure t582_E; + hash_expect_failure t583_A; + hash_expect_failure t583_B; + hash_expect_failure t583_C; + hash_expect_failure t583_D; + hash_expect_failure t584_A; + hash_expect_failure t584_B; + hash_expect_failure t585_A; + hash_expect_failure t585_B; + hash_expect_failure t585_C; + hash_expect_failure t586_A; + hash_expect_failure t586_B; + hash_expect_failure t586_C; + hash_expect_failure t586_D; + hash_expect_failure t587_A; + hash_expect_failure t587_B; + hash_expect_failure t587_C; + hash_expect_failure t588_A; + hash_expect_failure t588_B; + hash_expect_failure t588_C; + hash_expect_failure t588_D; + hash_expect_failure t588_E; + hash_expect_failure t589_A; + hash_expect_failure t589_B; + hash_expect_failure t590_A; + hash_expect_failure t590_B; + hash_expect_failure t590_C; + hash_expect_failure t591_A; + hash_expect_failure t591_B; + hash_expect_failure t591_C; + hash_expect_failure t591_D; + hash_expect_failure t592_A; + hash_expect_failure t592_B; + hash_expect_failure t592_C; + hash_expect_failure t593_A; + hash_expect_failure t593_B; + hash_expect_failure t594_A; + hash_expect_failure t594_B; + hash_expect_failure t594_C; + hash_expect_failure t595_A; + hash_expect_failure t595_B; + hash_expect_failure t595_C; + hash_expect_failure t595_D; + hash_expect_failure t596_A; + hash_expect_failure t596_B; + hash_expect_failure t597_A; + hash_expect_failure t597_B; + hash_expect_failure t597_C; + hash_expect_failure t598_A; + hash_expect_failure t598_B; + hash_expect_failure t599_A; + print_endline " - Comparing"; + compare_expect_failure t0 t1; + compare_expect_failure t1 t2; + compare_expect_failure t2 t3; + compare_expect_failure t3 t4; + compare_expect_failure t4 t5; + compare_expect_failure t5 t6; + compare_expect_failure t6 t7; + compare_expect_failure t7 t8; + compare_expect_failure t8 t9; + compare_expect_failure t9 t10; + compare_expect_failure t10 t11; + compare_expect_failure t11 t12; + compare_expect_failure t12 t13; + compare_expect_failure t13 t14; + compare_expect_failure t14 t15; + compare_expect_failure t15 t16; + compare_expect_failure t16 t17; + compare_expect_failure t17 t18; + compare_expect_failure t18 t19; + compare_expect_failure t19 t20; + compare_expect_failure t20 t21; + compare_expect_failure t21 t22; + compare_expect_failure t22 t23; + compare_expect_failure t23 t24; + compare_expect_failure t24 t25; + compare_expect_failure t25 t26; + compare_expect_failure t26 t27; + compare_expect_failure t27 t28; + compare_expect_failure t28 t29; + compare_expect_failure t29 t30; + compare_expect_failure t30 t31; + compare_expect_failure t31 t32; + compare_expect_failure t32 t33; + compare_expect_failure t33 t34; + compare_expect_failure t34 t35; + compare_expect_failure t35 t36; + compare_expect_failure t36 t37; + compare_expect_failure t37 t38; + compare_expect_failure t38 t39; + compare_expect_failure t39 t40; + compare_expect_failure t40 t41; + compare_expect_failure t41 t42; + compare_expect_failure t42 t43; + compare_expect_failure t43 t44; + compare_expect_failure t44 t45; + compare_expect_failure t45 t46; + compare_expect_failure t46 t47; + compare_expect_failure t47 t48; + compare_expect_failure t48 t49; + compare_expect_failure t49 t50; + compare_expect_failure t50 t51; + compare_expect_failure t51 t52; + compare_expect_failure t52 t53; + compare_expect_failure t53 t54; + compare_expect_failure t54 t55; + compare_expect_failure t55 t56; + compare_expect_failure t56 t57; + compare_expect_failure t57 t58; + compare_expect_failure t58 t59; + compare_expect_failure t59 t60; + compare_expect_failure t60 t61; + compare_expect_failure t61 t62; + compare_expect_failure t62 t63; + compare_expect_failure t63 t64; + compare_expect_failure t64 t65; + compare_expect_failure t65 t66; + compare_expect_failure t66 t67; + compare_expect_failure t67 t68; + compare_expect_failure t68 t69; + compare_expect_failure t69 t70; + compare_expect_failure t70 t71; + compare_expect_failure t71 t72; + compare_expect_failure t72 t73; + compare_expect_failure t73 t74; + compare_expect_failure t74 t75; + compare_expect_failure t75 t76; + compare_expect_failure t76 t77; + compare_expect_failure t77 t78; + compare_expect_failure t78 t79; + compare_expect_failure t79 t80; + compare_expect_failure t80 t81; + compare_expect_failure t81 t82; + compare_expect_failure t82 t83; + compare_expect_failure t83 t84; + compare_expect_failure t84 t85; + compare_expect_failure t85 t86; + compare_expect_failure t86 t87; + compare_expect_failure t87 t88; + compare_expect_failure t88 t89; + compare_expect_failure t89 t90; + compare_expect_failure t90 t91; + compare_expect_failure t91 t92; + compare_expect_failure t92 t93; + compare_expect_failure t93 t94; + compare_expect_failure t94 t95; + compare_expect_failure t95 t96; + compare_expect_failure t96 t97; + compare_expect_failure t97 t98; + compare_expect_failure t98 t99; + compare_expect_failure t99 t100; + compare_expect_failure t100 t101; + compare_expect_failure t101 t102; + compare_expect_failure t102 t103; + compare_expect_failure t103 t104; + compare_expect_failure t104 t105; + compare_expect_failure t105 t106; + compare_expect_failure t106 t107; + compare_expect_failure t107 t108; + compare_expect_failure t108 t109; + compare_expect_failure t109 t110; + compare_expect_failure t110 t111; + compare_expect_failure t111 t112; + compare_expect_failure t112 t113; + compare_expect_failure t113 t114; + compare_expect_failure t114 t115; + compare_expect_failure t115 t116; + compare_expect_failure t116 t117; + compare_expect_failure t117 t118; + compare_expect_failure t118 t119; + compare_expect_failure t119 t120; + compare_expect_failure t120 t121; + compare_expect_failure t121 t122; + compare_expect_failure t122 t123; + compare_expect_failure t123 t124; + compare_expect_failure t124 t125; + compare_expect_failure t125 t126; + compare_expect_failure t126 t127; + compare_expect_failure t127 t128; + compare_expect_failure t128 t129; + compare_expect_failure t129 t130; + compare_expect_failure t130 t131; + compare_expect_failure t131 t132; + compare_expect_failure t132 t133; + compare_expect_failure t133 t134; + compare_expect_failure t134 t135; + compare_expect_failure t135 t136; + compare_expect_failure t136 t137; + compare_expect_failure t137 t138; + compare_expect_failure t138 t139; + compare_expect_failure t139 t140; + compare_expect_failure t140 t141; + compare_expect_failure t141 t142; + compare_expect_failure t142 t143; + compare_expect_failure t143 t144; + compare_expect_failure t144 t145; + compare_expect_failure t145 t146; + compare_expect_failure t146 t147; + compare_expect_failure t147 t148; + compare_expect_failure t148 t149; + compare_expect_failure t149 t150; + compare_expect_failure t150 t151; + compare_expect_failure t151 t152; + compare_expect_failure t152 t153; + compare_expect_failure t153 t154; + compare_expect_failure t154 t155; + compare_expect_failure t155 t156; + compare_expect_failure t156 t157; + compare_expect_failure t157 t158; + compare_expect_failure t158 t159; + compare_expect_failure t159 t160; + compare_expect_failure t160 t161; + compare_expect_failure t161 t162; + compare_expect_failure t162 t163; + compare_expect_failure t163 t164; + compare_expect_failure t164 t165; + compare_expect_failure t165 t166; + compare_expect_failure t166 t167; + compare_expect_failure t167 t168; + compare_expect_failure t168 t169; + compare_expect_failure t169 t170; + compare_expect_failure t170 t171; + compare_expect_failure t171 t172; + compare_expect_failure t172 t173; + compare_expect_failure t173 t174; + compare_expect_failure t174 t175; + compare_expect_failure t175 t176; + compare_expect_failure t176 t177; + compare_expect_failure t177 t178; + compare_expect_failure t178 t179; + compare_expect_failure t179 t180; + compare_expect_failure t180 t181; + compare_expect_failure t181 t182; + compare_expect_failure t182 t183; + compare_expect_failure t183 t184; + compare_expect_failure t184 t185; + compare_expect_failure t185 t186; + compare_expect_failure t186 t187; + compare_expect_failure t187 t188; + compare_expect_failure t188 t189; + compare_expect_failure t189 t190; + compare_expect_failure t190 t191; + compare_expect_failure t191 t192; + compare_expect_failure t192 t193; + compare_expect_failure t193 t194; + compare_expect_failure t194 t195; + compare_expect_failure t195 t196; + compare_expect_failure t196 t197; + compare_expect_failure t197 t198; + compare_expect_failure t198 t199; + compare_expect_failure t199 t200; + compare_expect_failure t200 t201; + compare_expect_failure t201 t202; + compare_expect_failure t202 t203; + compare_expect_failure t203 t204; + compare_expect_failure t204 t205; + compare_expect_failure t205 t206; + compare_expect_failure t206 t207; + compare_expect_failure t207 t208; + compare_expect_failure t208 t209; + compare_expect_failure t209 t210; + compare_expect_failure t210 t211; + compare_expect_failure t211 t212; + compare_expect_failure t212 t213; + compare_expect_failure t213 t214; + compare_expect_failure t214 t215; + compare_expect_failure t215 t216; + compare_expect_failure t216 t217; + compare_expect_failure t217 t218; + compare_expect_failure t218 t219; + compare_expect_failure t219 t220; + compare_expect_failure t220 t221; + compare_expect_failure t221 t222; + compare_expect_failure t222 t223; + compare_expect_failure t223 t224; + compare_expect_failure t224 t225; + compare_expect_failure t225 t226; + compare_expect_failure t226 t227; + compare_expect_failure t227 t228; + compare_expect_failure t228 t229; + compare_expect_failure t229 t230; + compare_expect_failure t230 t231; + compare_expect_failure t231 t232; + compare_expect_failure t232 t233; + compare_expect_failure t233 t234; + compare_expect_failure t234 t235; + compare_expect_failure t235 t236; + compare_expect_failure t236 t237; + compare_expect_failure t237 t238; + compare_expect_failure t238 t239; + compare_expect_failure t239 t240; + compare_expect_failure t240 t241; + compare_expect_failure t241 t242; + compare_expect_failure t242 t243; + compare_expect_failure t243 t244; + compare_expect_failure t244 t245; + compare_expect_failure t245 t246; + compare_expect_failure t246 t247; + compare_expect_failure t247 t248; + compare_expect_failure t248 t249; + compare_expect_failure t249 t250; + compare_expect_failure t250 t251; + compare_expect_failure t251 t252; + compare_expect_failure t252 t253; + compare_expect_failure t253 t254; + compare_expect_failure t254 t255; + compare_expect_failure t255 t256; + compare_expect_failure t256 t257; + compare_expect_failure t257 t258; + compare_expect_failure t258 t259; + compare_expect_failure t259 t260; + compare_expect_failure t260 t261; + compare_expect_failure t261 t262; + compare_expect_failure t262 t263; + compare_expect_failure t263 t264; + compare_expect_failure t264 t265; + compare_expect_failure t265 t266; + compare_expect_failure t266 t267; + compare_expect_failure t267 t268; + compare_expect_failure t268 t269; + compare_expect_failure t269 t270; + compare_expect_failure t270 t271; + compare_expect_failure t271 t272; + compare_expect_failure t272 t273; + compare_expect_failure t273 t274; + compare_expect_failure t274 t275; + compare_expect_failure t275 t276; + compare_expect_failure t276 t277; + compare_expect_failure t277 t278; + compare_expect_failure t278 t279; + compare_expect_failure t279 t280; + compare_expect_failure t280 t281; + compare_expect_failure t281 t282; + compare_expect_failure t282 t283; + compare_expect_failure t283 t284; + compare_expect_failure t284 t285; + compare_expect_failure t285 t286; + compare_expect_failure t286 t287; + compare_expect_failure t287 t288; + compare_expect_failure t288 t289; + compare_expect_failure t289 t290; + compare_expect_failure t290 t291; + compare_expect_failure t291 t292; + compare_expect_failure t292 t293; + compare_expect_failure t293 t294; + compare_expect_failure t294 t295; + compare_expect_failure t295 t296; + compare_expect_failure t296 t297; + compare_expect_failure t297 t298; + compare_expect_failure t298 t299; + compare_expect_failure t299 t300_A; + compare_expect_failure t300_A t301_A; + compare_expect_success t301_A t301_B; + compare_expect_success t301_B t302_A; + compare_expect_failure t302_A t303_A; + compare_expect_success t303_A t303_B; + compare_expect_success t303_B t303_C; + compare_expect_success t303_C t304_A; + compare_expect_success t304_A t304_B; + compare_expect_success t304_B t305_A; + compare_expect_failure t305_A t306_A; + compare_expect_success t306_A t306_B; + compare_expect_success t306_B t307_A; + compare_expect_success t307_A t307_B; + compare_expect_success t307_B t307_C; + compare_expect_success t307_C t308_A; + compare_expect_success t308_A t308_B; + compare_expect_success t308_B t309_A; + compare_expect_failure t309_A t310_A; + compare_expect_success t310_A t310_B; + compare_expect_success t310_B t310_C; + compare_expect_success t310_C t310_D; + compare_expect_success t310_D t311_A; + compare_expect_success t311_A t311_B; + compare_expect_success t311_B t312_A; + compare_expect_success t312_A t312_B; + compare_expect_success t312_B t312_C; + compare_expect_success t312_C t313_A; + compare_expect_success t313_A t313_B; + compare_expect_success t313_B t314_A; + compare_expect_failure t314_A t315_A; + compare_expect_success t315_A t315_B; + compare_expect_success t315_B t315_C; + compare_expect_success t315_C t316_A; + compare_expect_success t316_A t316_B; + compare_expect_success t316_B t316_C; + compare_expect_success t316_C t316_D; + compare_expect_success t316_D t317_A; + compare_expect_success t317_A t317_B; + compare_expect_success t317_B t318_A; + compare_expect_success t318_A t318_B; + compare_expect_success t318_B t318_C; + compare_expect_success t318_C t319_A; + compare_expect_success t319_A t319_B; + compare_expect_success t319_B t320_A; + compare_expect_failure t320_A t321_A; + compare_expect_success t321_A t321_B; + compare_expect_success t321_B t322_A; + compare_expect_success t322_A t322_B; + compare_expect_success t322_B t322_C; + compare_expect_success t322_C t323_A; + compare_expect_success t323_A t323_B; + compare_expect_success t323_B t323_C; + compare_expect_success t323_C t323_D; + compare_expect_success t323_D t324_A; + compare_expect_success t324_A t324_B; + compare_expect_success t324_B t325_A; + compare_expect_success t325_A t325_B; + compare_expect_success t325_B t325_C; + compare_expect_success t325_C t326_A; + compare_expect_success t326_A t326_B; + compare_expect_success t326_B t327_A; + compare_expect_failure t327_A t328_A; + compare_expect_success t328_A t328_B; + compare_expect_success t328_B t328_C; + compare_expect_success t328_C t329_A; + compare_expect_success t329_A t329_B; + compare_expect_success t329_B t330_A; + compare_expect_success t330_A t330_B; + compare_expect_success t330_B t330_C; + compare_expect_success t330_C t331_A; + compare_expect_success t331_A t331_B; + compare_expect_success t331_B t331_C; + compare_expect_success t331_C t331_D; + compare_expect_success t331_D t332_A; + compare_expect_success t332_A t332_B; + compare_expect_success t332_B t333_A; + compare_expect_success t333_A t333_B; + compare_expect_success t333_B t333_C; + compare_expect_success t333_C t334_A; + compare_expect_success t334_A t334_B; + compare_expect_success t334_B t335_A; + compare_expect_failure t335_A t336_A; + compare_expect_success t336_A t336_B; + compare_expect_success t336_B t336_C; + compare_expect_success t336_C t336_D; + compare_expect_success t336_D t337_A; + compare_expect_success t337_A t337_B; + compare_expect_success t337_B t337_C; + compare_expect_success t337_C t338_A; + compare_expect_success t338_A t338_B; + compare_expect_success t338_B t339_A; + compare_expect_success t339_A t339_B; + compare_expect_success t339_B t339_C; + compare_expect_success t339_C t340_A; + compare_expect_success t340_A t340_B; + compare_expect_success t340_B t340_C; + compare_expect_success t340_C t340_D; + compare_expect_success t340_D t341_A; + compare_expect_success t341_A t341_B; + compare_expect_success t341_B t342_A; + compare_expect_success t342_A t342_B; + compare_expect_success t342_B t342_C; + compare_expect_success t342_C t343_A; + compare_expect_success t343_A t343_B; + compare_expect_success t343_B t344_A; + compare_expect_failure t344_A t345_A; + compare_expect_success t345_A t345_B; + compare_expect_success t345_B t345_C; + compare_expect_success t345_C t346_A; + compare_expect_success t346_A t346_B; + compare_expect_success t346_B t346_C; + compare_expect_success t346_C t346_D; + compare_expect_success t346_D t347_A; + compare_expect_success t347_A t347_B; + compare_expect_success t347_B t347_C; + compare_expect_success t347_C t348_A; + compare_expect_success t348_A t348_B; + compare_expect_success t348_B t349_A; + compare_expect_success t349_A t349_B; + compare_expect_success t349_B t349_C; + compare_expect_success t349_C t350_A; + compare_expect_success t350_A t350_B; + compare_expect_success t350_B t350_C; + compare_expect_success t350_C t350_D; + compare_expect_success t350_D t351_A; + compare_expect_success t351_A t351_B; + compare_expect_success t351_B t352_A; + compare_expect_success t352_A t352_B; + compare_expect_success t352_B t352_C; + compare_expect_success t352_C t353_A; + compare_expect_success t353_A t353_B; + compare_expect_success t353_B t354_A; + compare_expect_failure t354_A t355_A; + compare_expect_success t355_A t355_B; + compare_expect_success t355_B t356_A; + compare_expect_success t356_A t356_B; + compare_expect_success t356_B t356_C; + compare_expect_success t356_C t357_A; + compare_expect_success t357_A t357_B; + compare_expect_success t357_B t357_C; + compare_expect_success t357_C t357_D; + compare_expect_success t357_D t358_A; + compare_expect_success t358_A t358_B; + compare_expect_success t358_B t358_C; + compare_expect_success t358_C t359_A; + compare_expect_success t359_A t359_B; + compare_expect_success t359_B t360_A; + compare_expect_success t360_A t360_B; + compare_expect_success t360_B t360_C; + compare_expect_success t360_C t361_A; + compare_expect_success t361_A t361_B; + compare_expect_success t361_B t361_C; + compare_expect_success t361_C t361_D; + compare_expect_success t361_D t362_A; + compare_expect_success t362_A t362_B; + compare_expect_success t362_B t363_A; + compare_expect_success t363_A t363_B; + compare_expect_success t363_B t363_C; + compare_expect_success t363_C t364_A; + compare_expect_success t364_A t364_B; + compare_expect_success t364_B t365_A; + compare_expect_failure t365_A t366_A; + compare_expect_success t366_A t366_B; + compare_expect_success t366_B t366_C; + compare_expect_success t366_C t366_D; + compare_expect_success t366_D t366_E; + compare_expect_success t366_E t367_A; + compare_expect_success t367_A t367_B; + compare_expect_success t367_B t368_A; + compare_expect_success t368_A t368_B; + compare_expect_success t368_B t368_C; + compare_expect_success t368_C t369_A; + compare_expect_success t369_A t369_B; + compare_expect_success t369_B t369_C; + compare_expect_success t369_C t369_D; + compare_expect_success t369_D t370_A; + compare_expect_success t370_A t370_B; + compare_expect_success t370_B t370_C; + compare_expect_success t370_C t371_A; + compare_expect_success t371_A t371_B; + compare_expect_success t371_B t372_A; + compare_expect_success t372_A t372_B; + compare_expect_success t372_B t372_C; + compare_expect_success t372_C t373_A; + compare_expect_success t373_A t373_B; + compare_expect_success t373_B t373_C; + compare_expect_success t373_C t373_D; + compare_expect_success t373_D t374_A; + compare_expect_success t374_A t374_B; + compare_expect_success t374_B t375_A; + compare_expect_success t375_A t375_B; + compare_expect_success t375_B t375_C; + compare_expect_success t375_C t376_A; + compare_expect_success t376_A t376_B; + compare_expect_success t376_B t377_A; + compare_expect_failure t377_A t378_A; + compare_expect_success t378_A t378_B; + compare_expect_success t378_B t378_C; + compare_expect_success t378_C t379_A; + compare_expect_success t379_A t379_B; + compare_expect_success t379_B t379_C; + compare_expect_success t379_C t379_D; + compare_expect_success t379_D t379_E; + compare_expect_success t379_E t380_A; + compare_expect_success t380_A t380_B; + compare_expect_success t380_B t381_A; + compare_expect_success t381_A t381_B; + compare_expect_success t381_B t381_C; + compare_expect_success t381_C t382_A; + compare_expect_success t382_A t382_B; + compare_expect_success t382_B t382_C; + compare_expect_success t382_C t382_D; + compare_expect_success t382_D t383_A; + compare_expect_success t383_A t383_B; + compare_expect_success t383_B t383_C; + compare_expect_success t383_C t384_A; + compare_expect_success t384_A t384_B; + compare_expect_success t384_B t385_A; + compare_expect_success t385_A t385_B; + compare_expect_success t385_B t385_C; + compare_expect_success t385_C t386_A; + compare_expect_success t386_A t386_B; + compare_expect_success t386_B t386_C; + compare_expect_success t386_C t386_D; + compare_expect_success t386_D t387_A; + compare_expect_success t387_A t387_B; + compare_expect_success t387_B t388_A; + compare_expect_success t388_A t388_B; + compare_expect_success t388_B t388_C; + compare_expect_success t388_C t389_A; + compare_expect_success t389_A t389_B; + compare_expect_success t389_B t390_A; + compare_expect_failure t390_A t391_A; + compare_expect_success t391_A t391_B; + compare_expect_success t391_B t391_C; + compare_expect_success t391_C t391_D; + compare_expect_success t391_D t392_A; + compare_expect_success t392_A t392_B; + compare_expect_success t392_B t392_C; + compare_expect_success t392_C t393_A; + compare_expect_success t393_A t393_B; + compare_expect_success t393_B t393_C; + compare_expect_success t393_C t393_D; + compare_expect_success t393_D t393_E; + compare_expect_success t393_E t394_A; + compare_expect_success t394_A t394_B; + compare_expect_success t394_B t395_A; + compare_expect_success t395_A t395_B; + compare_expect_success t395_B t395_C; + compare_expect_success t395_C t396_A; + compare_expect_success t396_A t396_B; + compare_expect_success t396_B t396_C; + compare_expect_success t396_C t396_D; + compare_expect_success t396_D t397_A; + compare_expect_success t397_A t397_B; + compare_expect_success t397_B t397_C; + compare_expect_success t397_C t398_A; + compare_expect_success t398_A t398_B; + compare_expect_success t398_B t399_A; + compare_expect_success t399_A t399_B; + compare_expect_success t399_B t399_C; + compare_expect_success t399_C t400_A; + compare_expect_success t400_A t400_B; + compare_expect_success t400_B t400_C; + compare_expect_success t400_C t400_D; + compare_expect_success t400_D t401_A; + compare_expect_success t401_A t401_B; + compare_expect_success t401_B t402_A; + compare_expect_success t402_A t402_B; + compare_expect_success t402_B t402_C; + compare_expect_success t402_C t403_A; + compare_expect_success t403_A t403_B; + compare_expect_success t403_B t404_A; + compare_expect_failure t404_A t405_A; + compare_expect_success t405_A t405_B; + compare_expect_success t405_B t405_C; + compare_expect_success t405_C t406_A; + compare_expect_success t406_A t406_B; + compare_expect_success t406_B t406_C; + compare_expect_success t406_C t406_D; + compare_expect_success t406_D t407_A; + compare_expect_success t407_A t407_B; + compare_expect_success t407_B t407_C; + compare_expect_success t407_C t408_A; + compare_expect_success t408_A t408_B; + compare_expect_success t408_B t408_C; + compare_expect_success t408_C t408_D; + compare_expect_success t408_D t408_E; + compare_expect_success t408_E t409_A; + compare_expect_success t409_A t409_B; + compare_expect_success t409_B t410_A; + compare_expect_success t410_A t410_B; + compare_expect_success t410_B t410_C; + compare_expect_success t410_C t411_A; + compare_expect_success t411_A t411_B; + compare_expect_success t411_B t411_C; + compare_expect_success t411_C t411_D; + compare_expect_success t411_D t412_A; + compare_expect_success t412_A t412_B; + compare_expect_success t412_B t412_C; + compare_expect_success t412_C t413_A; + compare_expect_success t413_A t413_B; + compare_expect_success t413_B t414_A; + compare_expect_success t414_A t414_B; + compare_expect_success t414_B t414_C; + compare_expect_success t414_C t415_A; + compare_expect_success t415_A t415_B; + compare_expect_success t415_B t415_C; + compare_expect_success t415_C t415_D; + compare_expect_success t415_D t416_A; + compare_expect_success t416_A t416_B; + compare_expect_success t416_B t417_A; + compare_expect_success t417_A t417_B; + compare_expect_success t417_B t417_C; + compare_expect_success t417_C t418_A; + compare_expect_success t418_A t418_B; + compare_expect_success t418_B t419_A; + compare_expect_failure t419_A t420_A; + compare_expect_success t420_A t420_B; + compare_expect_success t420_B t421_A; + compare_expect_success t421_A t421_B; + compare_expect_success t421_B t421_C; + compare_expect_success t421_C t422_A; + compare_expect_success t422_A t422_B; + compare_expect_success t422_B t422_C; + compare_expect_success t422_C t422_D; + compare_expect_success t422_D t423_A; + compare_expect_success t423_A t423_B; + compare_expect_success t423_B t423_C; + compare_expect_success t423_C t424_A; + compare_expect_success t424_A t424_B; + compare_expect_success t424_B t424_C; + compare_expect_success t424_C t424_D; + compare_expect_success t424_D t424_E; + compare_expect_success t424_E t425_A; + compare_expect_success t425_A t425_B; + compare_expect_success t425_B t426_A; + compare_expect_success t426_A t426_B; + compare_expect_success t426_B t426_C; + compare_expect_success t426_C t427_A; + compare_expect_success t427_A t427_B; + compare_expect_success t427_B t427_C; + compare_expect_success t427_C t427_D; + compare_expect_success t427_D t428_A; + compare_expect_success t428_A t428_B; + compare_expect_success t428_B t428_C; + compare_expect_success t428_C t429_A; + compare_expect_success t429_A t429_B; + compare_expect_success t429_B t430_A; + compare_expect_success t430_A t430_B; + compare_expect_success t430_B t430_C; + compare_expect_success t430_C t431_A; + compare_expect_success t431_A t431_B; + compare_expect_success t431_B t431_C; + compare_expect_success t431_C t431_D; + compare_expect_success t431_D t432_A; + compare_expect_success t432_A t432_B; + compare_expect_success t432_B t433_A; + compare_expect_success t433_A t433_B; + compare_expect_success t433_B t433_C; + compare_expect_success t433_C t434_A; + compare_expect_success t434_A t434_B; + compare_expect_success t434_B t435_A; + compare_expect_failure t435_A t436_A; + compare_expect_success t436_A t436_B; + compare_expect_success t436_B t436_C; + compare_expect_success t436_C t436_D; + compare_expect_success t436_D t437_A; + compare_expect_success t437_A t437_B; + compare_expect_success t437_B t438_A; + compare_expect_success t438_A t438_B; + compare_expect_success t438_B t438_C; + compare_expect_success t438_C t439_A; + compare_expect_success t439_A t439_B; + compare_expect_success t439_B t439_C; + compare_expect_success t439_C t439_D; + compare_expect_success t439_D t440_A; + compare_expect_success t440_A t440_B; + compare_expect_success t440_B t440_C; + compare_expect_success t440_C t441_A; + compare_expect_success t441_A t441_B; + compare_expect_success t441_B t441_C; + compare_expect_success t441_C t441_D; + compare_expect_success t441_D t441_E; + compare_expect_success t441_E t442_A; + compare_expect_success t442_A t442_B; + compare_expect_success t442_B t443_A; + compare_expect_success t443_A t443_B; + compare_expect_success t443_B t443_C; + compare_expect_success t443_C t444_A; + compare_expect_success t444_A t444_B; + compare_expect_success t444_B t444_C; + compare_expect_success t444_C t444_D; + compare_expect_success t444_D t445_A; + compare_expect_success t445_A t445_B; + compare_expect_success t445_B t445_C; + compare_expect_success t445_C t446_A; + compare_expect_success t446_A t446_B; + compare_expect_success t446_B t447_A; + compare_expect_success t447_A t447_B; + compare_expect_success t447_B t447_C; + compare_expect_success t447_C t448_A; + compare_expect_success t448_A t448_B; + compare_expect_success t448_B t448_C; + compare_expect_success t448_C t448_D; + compare_expect_success t448_D t449_A; + compare_expect_success t449_A t449_B; + compare_expect_success t449_B t450_A; + compare_expect_success t450_A t450_B; + compare_expect_success t450_B t450_C; + compare_expect_success t450_C t451_A; + compare_expect_success t451_A t451_B; + compare_expect_success t451_B t452_A; + compare_expect_failure t452_A t453_A; + compare_expect_success t453_A t453_B; + compare_expect_success t453_B t453_C; + compare_expect_success t453_C t453_D; + compare_expect_success t453_D t453_E; + compare_expect_success t453_E t454_A; + compare_expect_success t454_A t454_B; + compare_expect_success t454_B t454_C; + compare_expect_success t454_C t454_D; + compare_expect_success t454_D t455_A; + compare_expect_success t455_A t455_B; + compare_expect_success t455_B t456_A; + compare_expect_success t456_A t456_B; + compare_expect_success t456_B t456_C; + compare_expect_success t456_C t457_A; + compare_expect_success t457_A t457_B; + compare_expect_success t457_B t457_C; + compare_expect_success t457_C t457_D; + compare_expect_success t457_D t458_A; + compare_expect_success t458_A t458_B; + compare_expect_success t458_B t458_C; + compare_expect_success t458_C t459_A; + compare_expect_success t459_A t459_B; + compare_expect_success t459_B t459_C; + compare_expect_success t459_C t459_D; + compare_expect_success t459_D t459_E; + compare_expect_success t459_E t460_A; + compare_expect_success t460_A t460_B; + compare_expect_success t460_B t461_A; + compare_expect_success t461_A t461_B; + compare_expect_success t461_B t461_C; + compare_expect_success t461_C t462_A; + compare_expect_success t462_A t462_B; + compare_expect_success t462_B t462_C; + compare_expect_success t462_C t462_D; + compare_expect_success t462_D t463_A; + compare_expect_success t463_A t463_B; + compare_expect_success t463_B t463_C; + compare_expect_success t463_C t464_A; + compare_expect_success t464_A t464_B; + compare_expect_success t464_B t465_A; + compare_expect_success t465_A t465_B; + compare_expect_success t465_B t465_C; + compare_expect_success t465_C t466_A; + compare_expect_success t466_A t466_B; + compare_expect_success t466_B t466_C; + compare_expect_success t466_C t466_D; + compare_expect_success t466_D t467_A; + compare_expect_success t467_A t467_B; + compare_expect_success t467_B t468_A; + compare_expect_success t468_A t468_B; + compare_expect_success t468_B t468_C; + compare_expect_success t468_C t469_A; + compare_expect_success t469_A t469_B; + compare_expect_success t469_B t470_A; + compare_expect_failure t470_A t471_A; + compare_expect_success t471_A t471_B; + compare_expect_success t471_B t471_C; + compare_expect_success t471_C t472_A; + compare_expect_success t472_A t472_B; + compare_expect_success t472_B t472_C; + compare_expect_success t472_C t472_D; + compare_expect_success t472_D t472_E; + compare_expect_success t472_E t473_A; + compare_expect_success t473_A t473_B; + compare_expect_success t473_B t473_C; + compare_expect_success t473_C t473_D; + compare_expect_success t473_D t474_A; + compare_expect_success t474_A t474_B; + compare_expect_success t474_B t475_A; + compare_expect_success t475_A t475_B; + compare_expect_success t475_B t475_C; + compare_expect_success t475_C t476_A; + compare_expect_success t476_A t476_B; + compare_expect_success t476_B t476_C; + compare_expect_success t476_C t476_D; + compare_expect_success t476_D t477_A; + compare_expect_success t477_A t477_B; + compare_expect_success t477_B t477_C; + compare_expect_success t477_C t478_A; + compare_expect_success t478_A t478_B; + compare_expect_success t478_B t478_C; + compare_expect_success t478_C t478_D; + compare_expect_success t478_D t478_E; + compare_expect_success t478_E t479_A; + compare_expect_success t479_A t479_B; + compare_expect_success t479_B t480_A; + compare_expect_success t480_A t480_B; + compare_expect_success t480_B t480_C; + compare_expect_success t480_C t481_A; + compare_expect_success t481_A t481_B; + compare_expect_success t481_B t481_C; + compare_expect_success t481_C t481_D; + compare_expect_success t481_D t482_A; + compare_expect_success t482_A t482_B; + compare_expect_success t482_B t482_C; + compare_expect_success t482_C t483_A; + compare_expect_success t483_A t483_B; + compare_expect_success t483_B t484_A; + compare_expect_success t484_A t484_B; + compare_expect_success t484_B t484_C; + compare_expect_success t484_C t485_A; + compare_expect_success t485_A t485_B; + compare_expect_success t485_B t485_C; + compare_expect_success t485_C t485_D; + compare_expect_success t485_D t486_A; + compare_expect_success t486_A t486_B; + compare_expect_success t486_B t487_A; + compare_expect_success t487_A t487_B; + compare_expect_success t487_B t487_C; + compare_expect_success t487_C t488_A; + compare_expect_success t488_A t488_B; + compare_expect_success t488_B t489_A; + compare_expect_failure t489_A t490_A; + compare_expect_success t490_A t490_B; + compare_expect_success t490_B t490_C; + compare_expect_success t490_C t490_D; + compare_expect_success t490_D t491_A; + compare_expect_success t491_A t491_B; + compare_expect_success t491_B t491_C; + compare_expect_success t491_C t492_A; + compare_expect_success t492_A t492_B; + compare_expect_success t492_B t492_C; + compare_expect_success t492_C t492_D; + compare_expect_success t492_D t492_E; + compare_expect_success t492_E t493_A; + compare_expect_success t493_A t493_B; + compare_expect_success t493_B t493_C; + compare_expect_success t493_C t493_D; + compare_expect_success t493_D t494_A; + compare_expect_success t494_A t494_B; + compare_expect_success t494_B t495_A; + compare_expect_success t495_A t495_B; + compare_expect_success t495_B t495_C; + compare_expect_success t495_C t496_A; + compare_expect_success t496_A t496_B; + compare_expect_success t496_B t496_C; + compare_expect_success t496_C t496_D; + compare_expect_success t496_D t497_A; + compare_expect_success t497_A t497_B; + compare_expect_success t497_B t497_C; + compare_expect_success t497_C t498_A; + compare_expect_success t498_A t498_B; + compare_expect_success t498_B t498_C; + compare_expect_success t498_C t498_D; + compare_expect_success t498_D t498_E; + compare_expect_success t498_E t499_A; + compare_expect_success t499_A t499_B; + compare_expect_success t499_B t500_A; + compare_expect_success t500_A t500_B; + compare_expect_success t500_B t500_C; + compare_expect_success t500_C t501_A; + compare_expect_success t501_A t501_B; + compare_expect_success t501_B t501_C; + compare_expect_success t501_C t501_D; + compare_expect_success t501_D t502_A; + compare_expect_success t502_A t502_B; + compare_expect_success t502_B t502_C; + compare_expect_success t502_C t503_A; + compare_expect_success t503_A t503_B; + compare_expect_success t503_B t504_A; + compare_expect_success t504_A t504_B; + compare_expect_success t504_B t504_C; + compare_expect_success t504_C t505_A; + compare_expect_success t505_A t505_B; + compare_expect_success t505_B t505_C; + compare_expect_success t505_C t505_D; + compare_expect_success t505_D t506_A; + compare_expect_success t506_A t506_B; + compare_expect_success t506_B t507_A; + compare_expect_success t507_A t507_B; + compare_expect_success t507_B t507_C; + compare_expect_success t507_C t508_A; + compare_expect_success t508_A t508_B; + compare_expect_success t508_B t509_A; + compare_expect_failure t509_A t510_A; + compare_expect_success t510_A t510_B; + compare_expect_success t510_B t510_C; + compare_expect_success t510_C t511_A; + compare_expect_success t511_A t511_B; + compare_expect_success t511_B t511_C; + compare_expect_success t511_C t511_D; + compare_expect_success t511_D t512_A; + compare_expect_success t512_A t512_B; + compare_expect_success t512_B t512_C; + compare_expect_success t512_C t513_A; + compare_expect_success t513_A t513_B; + compare_expect_success t513_B t513_C; + compare_expect_success t513_C t513_D; + compare_expect_success t513_D t513_E; + compare_expect_success t513_E t514_A; + compare_expect_success t514_A t514_B; + compare_expect_success t514_B t514_C; + compare_expect_success t514_C t514_D; + compare_expect_success t514_D t515_A; + compare_expect_success t515_A t515_B; + compare_expect_success t515_B t516_A; + compare_expect_success t516_A t516_B; + compare_expect_success t516_B t516_C; + compare_expect_success t516_C t517_A; + compare_expect_success t517_A t517_B; + compare_expect_success t517_B t517_C; + compare_expect_success t517_C t517_D; + compare_expect_success t517_D t518_A; + compare_expect_success t518_A t518_B; + compare_expect_success t518_B t518_C; + compare_expect_success t518_C t519_A; + compare_expect_success t519_A t519_B; + compare_expect_success t519_B t519_C; + compare_expect_success t519_C t519_D; + compare_expect_success t519_D t519_E; + compare_expect_success t519_E t520_A; + compare_expect_success t520_A t520_B; + compare_expect_success t520_B t521_A; + compare_expect_success t521_A t521_B; + compare_expect_success t521_B t521_C; + compare_expect_success t521_C t522_A; + compare_expect_success t522_A t522_B; + compare_expect_success t522_B t522_C; + compare_expect_success t522_C t522_D; + compare_expect_success t522_D t523_A; + compare_expect_success t523_A t523_B; + compare_expect_success t523_B t523_C; + compare_expect_success t523_C t524_A; + compare_expect_success t524_A t524_B; + compare_expect_success t524_B t525_A; + compare_expect_success t525_A t525_B; + compare_expect_success t525_B t525_C; + compare_expect_success t525_C t526_A; + compare_expect_success t526_A t526_B; + compare_expect_success t526_B t526_C; + compare_expect_success t526_C t526_D; + compare_expect_success t526_D t527_A; + compare_expect_success t527_A t527_B; + compare_expect_success t527_B t528_A; + compare_expect_success t528_A t528_B; + compare_expect_success t528_B t528_C; + compare_expect_success t528_C t529_A; + compare_expect_success t529_A t529_B; + compare_expect_success t529_B t530_A; + compare_expect_failure t530_A t531_A; + compare_expect_success t531_A t531_B; + compare_expect_success t531_B t532_A; + compare_expect_success t532_A t532_B; + compare_expect_success t532_B t532_C; + compare_expect_success t532_C t533_A; + compare_expect_success t533_A t533_B; + compare_expect_success t533_B t533_C; + compare_expect_success t533_C t533_D; + compare_expect_success t533_D t534_A; + compare_expect_success t534_A t534_B; + compare_expect_success t534_B t534_C; + compare_expect_success t534_C t535_A; + compare_expect_success t535_A t535_B; + compare_expect_success t535_B t535_C; + compare_expect_success t535_C t535_D; + compare_expect_success t535_D t535_E; + compare_expect_success t535_E t536_A; + compare_expect_success t536_A t536_B; + compare_expect_success t536_B t536_C; + compare_expect_success t536_C t536_D; + compare_expect_success t536_D t537_A; + compare_expect_success t537_A t537_B; + compare_expect_success t537_B t538_A; + compare_expect_success t538_A t538_B; + compare_expect_success t538_B t538_C; + compare_expect_success t538_C t539_A; + compare_expect_success t539_A t539_B; + compare_expect_success t539_B t539_C; + compare_expect_success t539_C t539_D; + compare_expect_success t539_D t540_A; + compare_expect_success t540_A t540_B; + compare_expect_success t540_B t540_C; + compare_expect_success t540_C t541_A; + compare_expect_success t541_A t541_B; + compare_expect_success t541_B t541_C; + compare_expect_success t541_C t541_D; + compare_expect_success t541_D t541_E; + compare_expect_success t541_E t542_A; + compare_expect_success t542_A t542_B; + compare_expect_success t542_B t543_A; + compare_expect_success t543_A t543_B; + compare_expect_success t543_B t543_C; + compare_expect_success t543_C t544_A; + compare_expect_success t544_A t544_B; + compare_expect_success t544_B t544_C; + compare_expect_success t544_C t544_D; + compare_expect_success t544_D t545_A; + compare_expect_success t545_A t545_B; + compare_expect_success t545_B t545_C; + compare_expect_success t545_C t546_A; + compare_expect_success t546_A t546_B; + compare_expect_success t546_B t547_A; + compare_expect_success t547_A t547_B; + compare_expect_success t547_B t547_C; + compare_expect_success t547_C t548_A; + compare_expect_success t548_A t548_B; + compare_expect_success t548_B t548_C; + compare_expect_success t548_C t548_D; + compare_expect_success t548_D t549_A; + compare_expect_success t549_A t549_B; + compare_expect_success t549_B t550_A; + compare_expect_success t550_A t550_B; + compare_expect_success t550_B t550_C; + compare_expect_success t550_C t551_A; + compare_expect_success t551_A t551_B; + compare_expect_success t551_B t552_A; + compare_expect_failure t552_A t553_A; + compare_expect_success t553_A t553_B; + compare_expect_success t553_B t553_C; + compare_expect_success t553_C t554_A; + compare_expect_success t554_A t554_B; + compare_expect_success t554_B t555_A; + compare_expect_success t555_A t555_B; + compare_expect_success t555_B t555_C; + compare_expect_success t555_C t556_A; + compare_expect_success t556_A t556_B; + compare_expect_success t556_B t556_C; + compare_expect_success t556_C t556_D; + compare_expect_success t556_D t557_A; + compare_expect_success t557_A t557_B; + compare_expect_success t557_B t557_C; + compare_expect_success t557_C t558_A; + compare_expect_success t558_A t558_B; + compare_expect_success t558_B t558_C; + compare_expect_success t558_C t558_D; + compare_expect_success t558_D t558_E; + compare_expect_success t558_E t559_A; + compare_expect_success t559_A t559_B; + compare_expect_success t559_B t559_C; + compare_expect_success t559_C t559_D; + compare_expect_success t559_D t560_A; + compare_expect_success t560_A t560_B; + compare_expect_success t560_B t561_A; + compare_expect_success t561_A t561_B; + compare_expect_success t561_B t561_C; + compare_expect_success t561_C t562_A; + compare_expect_success t562_A t562_B; + compare_expect_success t562_B t562_C; + compare_expect_success t562_C t562_D; + compare_expect_success t562_D t563_A; + compare_expect_success t563_A t563_B; + compare_expect_success t563_B t563_C; + compare_expect_success t563_C t564_A; + compare_expect_success t564_A t564_B; + compare_expect_success t564_B t564_C; + compare_expect_success t564_C t564_D; + compare_expect_success t564_D t564_E; + compare_expect_success t564_E t565_A; + compare_expect_success t565_A t565_B; + compare_expect_success t565_B t566_A; + compare_expect_success t566_A t566_B; + compare_expect_success t566_B t566_C; + compare_expect_success t566_C t567_A; + compare_expect_success t567_A t567_B; + compare_expect_success t567_B t567_C; + compare_expect_success t567_C t567_D; + compare_expect_success t567_D t568_A; + compare_expect_success t568_A t568_B; + compare_expect_success t568_B t568_C; + compare_expect_success t568_C t569_A; + compare_expect_success t569_A t569_B; + compare_expect_success t569_B t570_A; + compare_expect_success t570_A t570_B; + compare_expect_success t570_B t570_C; + compare_expect_success t570_C t571_A; + compare_expect_success t571_A t571_B; + compare_expect_success t571_B t571_C; + compare_expect_success t571_C t571_D; + compare_expect_success t571_D t572_A; + compare_expect_success t572_A t572_B; + compare_expect_success t572_B t573_A; + compare_expect_success t573_A t573_B; + compare_expect_success t573_B t573_C; + compare_expect_success t573_C t574_A; + compare_expect_success t574_A t574_B; + compare_expect_success t574_B t575_A; + compare_expect_failure t575_A t576_A; + compare_expect_success t576_A t576_B; + compare_expect_success t576_B t576_C; + compare_expect_success t576_C t576_D; + compare_expect_success t576_D t577_A; + compare_expect_success t577_A t577_B; + compare_expect_success t577_B t577_C; + compare_expect_success t577_C t578_A; + compare_expect_success t578_A t578_B; + compare_expect_success t578_B t579_A; + compare_expect_success t579_A t579_B; + compare_expect_success t579_B t579_C; + compare_expect_success t579_C t580_A; + compare_expect_success t580_A t580_B; + compare_expect_success t580_B t580_C; + compare_expect_success t580_C t580_D; + compare_expect_success t580_D t581_A; + compare_expect_success t581_A t581_B; + compare_expect_success t581_B t581_C; + compare_expect_success t581_C t582_A; + compare_expect_success t582_A t582_B; + compare_expect_success t582_B t582_C; + compare_expect_success t582_C t582_D; + compare_expect_success t582_D t582_E; + compare_expect_success t582_E t583_A; + compare_expect_success t583_A t583_B; + compare_expect_success t583_B t583_C; + compare_expect_success t583_C t583_D; + compare_expect_success t583_D t584_A; + compare_expect_success t584_A t584_B; + compare_expect_success t584_B t585_A; + compare_expect_success t585_A t585_B; + compare_expect_success t585_B t585_C; + compare_expect_success t585_C t586_A; + compare_expect_success t586_A t586_B; + compare_expect_success t586_B t586_C; + compare_expect_success t586_C t586_D; + compare_expect_success t586_D t587_A; + compare_expect_success t587_A t587_B; + compare_expect_success t587_B t587_C; + compare_expect_success t587_C t588_A; + compare_expect_success t588_A t588_B; + compare_expect_success t588_B t588_C; + compare_expect_success t588_C t588_D; + compare_expect_success t588_D t588_E; + compare_expect_success t588_E t589_A; + compare_expect_success t589_A t589_B; + compare_expect_success t589_B t590_A; + compare_expect_success t590_A t590_B; + compare_expect_success t590_B t590_C; + compare_expect_success t590_C t591_A; + compare_expect_success t591_A t591_B; + compare_expect_success t591_B t591_C; + compare_expect_success t591_C t591_D; + compare_expect_success t591_D t592_A; + compare_expect_success t592_A t592_B; + compare_expect_success t592_B t592_C; + compare_expect_success t592_C t593_A; + compare_expect_success t593_A t593_B; + compare_expect_success t593_B t594_A; + compare_expect_success t594_A t594_B; + compare_expect_success t594_B t594_C; + compare_expect_success t594_C t595_A; + compare_expect_success t595_A t595_B; + compare_expect_success t595_B t595_C; + compare_expect_success t595_C t595_D; + compare_expect_success t595_D t596_A; + compare_expect_success t596_A t596_B; + compare_expect_success t596_B t597_A; + compare_expect_success t597_A t597_B; + compare_expect_success t597_B t597_C; + compare_expect_success t597_C t598_A; + compare_expect_success t598_A t598_B; + compare_expect_success t598_B t599_A; + compare_expect_failure t599_A t0; + print_endline " - Checking field values"; + check_float t0.float0 t_orig0.float0 ~message:"t0.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t0.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig0.float_u1) ~message:"t0.float_u1"; + check_float t1.float0 t_orig1.float0 ~message:"t1.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t1.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig1.float_u1) ~message:"t1.float_u1"; + check_float t2.float0 t_orig2.float0 ~message:"t2.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t2.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig2.float_u1) ~message:"t2.float_u1"; + check_float t3.float0 t_orig3.float0 ~message:"t3.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t3.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig3.float_u1) ~message:"t3.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t4.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig4.float_u0) ~message:"t4.float_u0"; + check_float t4.float1 t_orig4.float1 ~message:"t4.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t5.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig5.float_u0) ~message:"t5.float_u0"; + check_float t5.float1 t_orig5.float1 ~message:"t5.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t6.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig6.float_u0) ~message:"t6.float_u0"; + check_float t6.float1 t_orig6.float1 ~message:"t6.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t7.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig7.float_u0) ~message:"t7.float_u0"; + check_float t7.float1 t_orig7.float1 ~message:"t7.float1"; + check_float t8.float0 t_orig8.float0 ~message:"t8.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t8.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig8.float_u1) ~message:"t8.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t8.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig8.float_u2) ~message:"t8.float_u2"; + check_float t9.float0 t_orig9.float0 ~message:"t9.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t9.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig9.float_u1) ~message:"t9.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t9.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig9.float_u2) ~message:"t9.float_u2"; + check_float t10.float0 t_orig10.float0 ~message:"t10.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t10.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig10.float_u1) ~message:"t10.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t10.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig10.float_u2) ~message:"t10.float_u2"; + check_float t11.float0 t_orig11.float0 ~message:"t11.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t11.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig11.float_u1) ~message:"t11.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t11.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig11.float_u2) ~message:"t11.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t12.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig12.float_u0) ~message:"t12.float_u0"; + check_float t12.float1 t_orig12.float1 ~message:"t12.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t12.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig12.float_u2) ~message:"t12.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t13.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig13.float_u0) ~message:"t13.float_u0"; + check_float t13.float1 t_orig13.float1 ~message:"t13.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t13.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig13.float_u2) ~message:"t13.float_u2"; + check_float t14.float0 t_orig14.float0 ~message:"t14.float0"; + check_float t14.float1 t_orig14.float1 ~message:"t14.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t14.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig14.float_u2) ~message:"t14.float_u2"; + check_float t15.float0 t_orig15.float0 ~message:"t15.float0"; + check_float t15.float1 t_orig15.float1 ~message:"t15.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t15.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig15.float_u2) ~message:"t15.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t16.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig16.float_u0) ~message:"t16.float_u0"; + check_float t16.float1 t_orig16.float1 ~message:"t16.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t16.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig16.float_u2) ~message:"t16.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t17.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig17.float_u0) ~message:"t17.float_u0"; + check_float t17.float1 t_orig17.float1 ~message:"t17.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t17.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig17.float_u2) ~message:"t17.float_u2"; + check_float t18.float0 t_orig18.float0 ~message:"t18.float0"; + check_float t18.float1 t_orig18.float1 ~message:"t18.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t18.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig18.float_u2) ~message:"t18.float_u2"; + check_float t19.float0 t_orig19.float0 ~message:"t19.float0"; + check_float t19.float1 t_orig19.float1 ~message:"t19.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t19.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig19.float_u2) ~message:"t19.float_u2"; + check_float t20.float0 t_orig20.float0 ~message:"t20.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t20.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig20.float_u1) ~message:"t20.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t20.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig20.float_u2) ~message:"t20.float_u2"; + check_float t21.float0 t_orig21.float0 ~message:"t21.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t21.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig21.float_u1) ~message:"t21.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t21.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig21.float_u2) ~message:"t21.float_u2"; + check_float t22.float0 t_orig22.float0 ~message:"t22.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t22.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig22.float_u1) ~message:"t22.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t22.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig22.float_u2) ~message:"t22.float_u2"; + check_float t23.float0 t_orig23.float0 ~message:"t23.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t23.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig23.float_u1) ~message:"t23.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t23.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig23.float_u2) ~message:"t23.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t24.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig24.float_u0) ~message:"t24.float_u0"; + check_float t24.float1 t_orig24.float1 ~message:"t24.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t24.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig24.float_u2) ~message:"t24.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t25.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig25.float_u0) ~message:"t25.float_u0"; + check_float t25.float1 t_orig25.float1 ~message:"t25.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t25.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig25.float_u2) ~message:"t25.float_u2"; + check_float t26.float0 t_orig26.float0 ~message:"t26.float0"; + check_float t26.float1 t_orig26.float1 ~message:"t26.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t26.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig26.float_u2) ~message:"t26.float_u2"; + check_float t27.float0 t_orig27.float0 ~message:"t27.float0"; + check_float t27.float1 t_orig27.float1 ~message:"t27.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t27.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig27.float_u2) ~message:"t27.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t28.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig28.float_u0) ~message:"t28.float_u0"; + check_float t28.float1 t_orig28.float1 ~message:"t28.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t28.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig28.float_u2) ~message:"t28.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t29.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig29.float_u0) ~message:"t29.float_u0"; + check_float t29.float1 t_orig29.float1 ~message:"t29.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t29.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig29.float_u2) ~message:"t29.float_u2"; + check_float t30.float0 t_orig30.float0 ~message:"t30.float0"; + check_float t30.float1 t_orig30.float1 ~message:"t30.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t30.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig30.float_u2) ~message:"t30.float_u2"; + check_float t31.float0 t_orig31.float0 ~message:"t31.float0"; + check_float t31.float1 t_orig31.float1 ~message:"t31.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t31.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig31.float_u2) ~message:"t31.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t32.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig32.float_u0) ~message:"t32.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t32.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig32.float_u1) ~message:"t32.float_u1"; + check_float t32.float2 t_orig32.float2 ~message:"t32.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t33.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig33.float_u0) ~message:"t33.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t33.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig33.float_u1) ~message:"t33.float_u1"; + check_float t33.float2 t_orig33.float2 ~message:"t33.float2"; + check_float t34.float0 t_orig34.float0 ~message:"t34.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t34.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig34.float_u1) ~message:"t34.float_u1"; + check_float t34.float2 t_orig34.float2 ~message:"t34.float2"; + check_float t35.float0 t_orig35.float0 ~message:"t35.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t35.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig35.float_u1) ~message:"t35.float_u1"; + check_float t35.float2 t_orig35.float2 ~message:"t35.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t36.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig36.float_u0) ~message:"t36.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t36.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig36.float_u1) ~message:"t36.float_u1"; + check_float t36.float2 t_orig36.float2 ~message:"t36.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t37.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig37.float_u0) ~message:"t37.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t37.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig37.float_u1) ~message:"t37.float_u1"; + check_float t37.float2 t_orig37.float2 ~message:"t37.float2"; + check_float t38.float0 t_orig38.float0 ~message:"t38.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t38.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig38.float_u1) ~message:"t38.float_u1"; + check_float t38.float2 t_orig38.float2 ~message:"t38.float2"; + check_float t39.float0 t_orig39.float0 ~message:"t39.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t39.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig39.float_u1) ~message:"t39.float_u1"; + check_float t39.float2 t_orig39.float2 ~message:"t39.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t40.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig40.float_u0) ~message:"t40.float_u0"; + check_float t40.float1 t_orig40.float1 ~message:"t40.float1"; + check_float t40.float2 t_orig40.float2 ~message:"t40.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t41.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig41.float_u0) ~message:"t41.float_u0"; + check_float t41.float1 t_orig41.float1 ~message:"t41.float1"; + check_float t41.float2 t_orig41.float2 ~message:"t41.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t42.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig42.float_u0) ~message:"t42.float_u0"; + check_float t42.float1 t_orig42.float1 ~message:"t42.float1"; + check_float t42.float2 t_orig42.float2 ~message:"t42.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t43.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig43.float_u0) ~message:"t43.float_u0"; + check_float t43.float1 t_orig43.float1 ~message:"t43.float1"; + check_float t43.float2 t_orig43.float2 ~message:"t43.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t44.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig44.float_u0) ~message:"t44.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t44.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig44.float_u1) ~message:"t44.float_u1"; + check_float t44.float2 t_orig44.float2 ~message:"t44.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t45.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig45.float_u0) ~message:"t45.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t45.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig45.float_u1) ~message:"t45.float_u1"; + check_float t45.float2 t_orig45.float2 ~message:"t45.float2"; + check_float t46.float0 t_orig46.float0 ~message:"t46.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t46.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig46.float_u1) ~message:"t46.float_u1"; + check_float t46.float2 t_orig46.float2 ~message:"t46.float2"; + check_float t47.float0 t_orig47.float0 ~message:"t47.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t47.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig47.float_u1) ~message:"t47.float_u1"; + check_float t47.float2 t_orig47.float2 ~message:"t47.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t48.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig48.float_u0) ~message:"t48.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t48.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig48.float_u1) ~message:"t48.float_u1"; + check_float t48.float2 t_orig48.float2 ~message:"t48.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t49.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig49.float_u0) ~message:"t49.float_u0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t49.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig49.float_u1) ~message:"t49.float_u1"; + check_float t49.float2 t_orig49.float2 ~message:"t49.float2"; + check_float t50.float0 t_orig50.float0 ~message:"t50.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t50.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig50.float_u1) ~message:"t50.float_u1"; + check_float t50.float2 t_orig50.float2 ~message:"t50.float2"; + check_float t51.float0 t_orig51.float0 ~message:"t51.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t51.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig51.float_u1) ~message:"t51.float_u1"; + check_float t51.float2 t_orig51.float2 ~message:"t51.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t52.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig52.float_u0) ~message:"t52.float_u0"; + check_float t52.float1 t_orig52.float1 ~message:"t52.float1"; + check_float t52.float2 t_orig52.float2 ~message:"t52.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t53.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig53.float_u0) ~message:"t53.float_u0"; + check_float t53.float1 t_orig53.float1 ~message:"t53.float1"; + check_float t53.float2 t_orig53.float2 ~message:"t53.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t54.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig54.float_u0) ~message:"t54.float_u0"; + check_float t54.float1 t_orig54.float1 ~message:"t54.float1"; + check_float t54.float2 t_orig54.float2 ~message:"t54.float2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t55.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig55.float_u0) ~message:"t55.float_u0"; + check_float t55.float1 t_orig55.float1 ~message:"t55.float1"; + check_float t55.float2 t_orig55.float2 ~message:"t55.float2"; + check_float t56.float0 t_orig56.float0 ~message:"t56.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t56.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig56.float_u1) ~message:"t56.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t56.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig56.float_u2) ~message:"t56.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t56.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig56.float_u3) ~message:"t56.float_u3"; + check_float t57.float0 t_orig57.float0 ~message:"t57.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t57.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig57.float_u1) ~message:"t57.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t57.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig57.float_u2) ~message:"t57.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t57.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig57.float_u3) ~message:"t57.float_u3"; + check_float t58.float0 t_orig58.float0 ~message:"t58.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t58.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig58.float_u1) ~message:"t58.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t58.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig58.float_u2) ~message:"t58.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t58.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig58.float_u3) ~message:"t58.float_u3"; + check_float t59.float0 t_orig59.float0 ~message:"t59.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t59.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig59.float_u1) ~message:"t59.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t59.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig59.float_u2) ~message:"t59.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t59.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig59.float_u3) ~message:"t59.float_u3"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t60.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig60.float_u0) ~message:"t60.float_u0"; + check_float t60.float1 t_orig60.float1 ~message:"t60.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t60.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig60.float_u2) ~message:"t60.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t60.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig60.float_u3) ~message:"t60.float_u3"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t61.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig61.float_u0) ~message:"t61.float_u0"; + check_float t61.float1 t_orig61.float1 ~message:"t61.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t61.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig61.float_u2) ~message:"t61.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t61.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig61.float_u3) ~message:"t61.float_u3"; + check_float t62.float0 t_orig62.float0 ~message:"t62.float0"; + check_float t62.float1 t_orig62.float1 ~message:"t62.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t62.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig62.float_u2) ~message:"t62.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t62.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig62.float_u3) ~message:"t62.float_u3"; + check_float t63.float0 t_orig63.float0 ~message:"t63.float0"; + check_float t63.float1 t_orig63.float1 ~message:"t63.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t63.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig63.float_u2) ~message:"t63.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t63.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig63.float_u3) ~message:"t63.float_u3"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t64.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig64.float_u0) ~message:"t64.float_u0"; + check_float t64.float1 t_orig64.float1 ~message:"t64.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t64.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig64.float_u2) ~message:"t64.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t64.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig64.float_u3) ~message:"t64.float_u3"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t65.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig65.float_u0) ~message:"t65.float_u0"; + check_float t65.float1 t_orig65.float1 ~message:"t65.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t65.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig65.float_u2) ~message:"t65.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t65.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig65.float_u3) ~message:"t65.float_u3"; + check_float t66.float0 t_orig66.float0 ~message:"t66.float0"; + check_float t66.float1 t_orig66.float1 ~message:"t66.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t66.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig66.float_u2) ~message:"t66.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t66.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig66.float_u3) ~message:"t66.float_u3"; + check_float t67.float0 t_orig67.float0 ~message:"t67.float0"; + check_float t67.float1 t_orig67.float1 ~message:"t67.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t67.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig67.float_u2) ~message:"t67.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t67.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig67.float_u3) ~message:"t67.float_u3"; + check_float t68.float0 t_orig68.float0 ~message:"t68.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t68.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig68.float_u1) ~message:"t68.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t68.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig68.float_u2) ~message:"t68.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t68.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig68.float_u3) ~message:"t68.float_u3"; + check_float t69.float0 t_orig69.float0 ~message:"t69.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t69.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig69.float_u1) ~message:"t69.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t69.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig69.float_u2) ~message:"t69.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t69.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig69.float_u3) ~message:"t69.float_u3"; + check_float t70.float0 t_orig70.float0 ~message:"t70.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t70.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig70.float_u1) ~message:"t70.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t70.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig70.float_u2) ~message:"t70.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t70.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig70.float_u3) ~message:"t70.float_u3"; + check_float t71.float0 t_orig71.float0 ~message:"t71.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t71.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig71.float_u1) ~message:"t71.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t71.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig71.float_u2) ~message:"t71.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t71.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig71.float_u3) ~message:"t71.float_u3"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t72.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig72.float_u0) ~message:"t72.float_u0"; + check_float t72.float1 t_orig72.float1 ~message:"t72.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t72.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig72.float_u2) ~message:"t72.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t72.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig72.float_u3) ~message:"t72.float_u3"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t73.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig73.float_u0) ~message:"t73.float_u0"; + check_float t73.float1 t_orig73.float1 ~message:"t73.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t73.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig73.float_u2) ~message:"t73.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t73.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig73.float_u3) ~message:"t73.float_u3"; + check_float t74.float0 t_orig74.float0 ~message:"t74.float0"; + check_float t74.float1 t_orig74.float1 ~message:"t74.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t74.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig74.float_u2) ~message:"t74.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t74.float_u3) (Stdlib_upstream_compatible.Float_u.to_float t_orig74.float_u3) ~message:"t74.float_u3"; + check_string t75.str0 t_orig75.str0 ~message:"t75.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t75.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig75.float_u1) ~message:"t75.float_u1"; + check_string t76.str0 t_orig76.str0 ~message:"t76.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t76.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig76.float_u1) ~message:"t76.float_u1"; + check_string t77.str0 t_orig77.str0 ~message:"t77.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t77.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig77.float_u1) ~message:"t77.float_u1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t78.float32_u0) (Stdlib_stable.Float32_u.to_float32 t_orig78.float32_u0) ~message:"t78.float32_u0"; + check_string t79.str0 t_orig79.str0 ~message:"t79.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t79.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig79.float_u1) ~message:"t79.float_u1"; + check_string t80.str0 t_orig80.str0 ~message:"t80.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t80.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig80.float32_u1) ~message:"t80.float32_u1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t81.float32_u0) (Stdlib_stable.Float32_u.to_float32 t_orig81.float32_u0) ~message:"t81.float32_u0"; + check_string t82.str0 t_orig82.str0 ~message:"t82.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t82.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig82.float32_u1) ~message:"t82.float32_u1"; + check_string t83.str0 t_orig83.str0 ~message:"t83.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t83.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig83.float32_u1) ~message:"t83.float32_u1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t84.i32_0) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig84.i32_0) ~message:"t84.i32_0"; + check_string t85.str0 t_orig85.str0 ~message:"t85.str0"; + check_string t85.str1 t_orig85.str1 ~message:"t85.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t85.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig85.float_u2) ~message:"t85.float_u2"; + check_float t86.float0 t_orig86.float0 ~message:"t86.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t86.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig86.float32_u1) ~message:"t86.float32_u1"; + check_string t87.str0 t_orig87.str0 ~message:"t87.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t87.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig87.float32_u1) ~message:"t87.float32_u1"; + check_string t88.str0 t_orig88.str0 ~message:"t88.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t88.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig88.i32_1) ~message:"t88.i32_1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t89.i32_0) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig89.i32_0) ~message:"t89.i32_0"; + check_string t90.str0 t_orig90.str0 ~message:"t90.str0"; + check_string t90.str1 t_orig90.str1 ~message:"t90.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t90.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig90.float_u2) ~message:"t90.float_u2"; + check_string t91.str0 t_orig91.str0 ~message:"t91.str0"; + check_string t91.str1 t_orig91.str1 ~message:"t91.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t91.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig91.float_u2) ~message:"t91.float_u2"; + check_float t92.float0 t_orig92.float0 ~message:"t92.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t92.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig92.float32_u1) ~message:"t92.float32_u1"; + check_float t93.float0 t_orig93.float0 ~message:"t93.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t93.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig93.float32_u1) ~message:"t93.float32_u1"; + check_string t94.str0 t_orig94.str0 ~message:"t94.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t94.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig94.i32_1) ~message:"t94.i32_1"; + check_string t95.str0 t_orig95.str0 ~message:"t95.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t95.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig95.i32_1) ~message:"t95.i32_1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t96.i64_0) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig96.i64_0) ~message:"t96.i64_0"; + check_float t97.float0 t_orig97.float0 ~message:"t97.float0"; + check_string t97.str1 t_orig97.str1 ~message:"t97.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t97.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig97.float_u2) ~message:"t97.float_u2"; + check_string t98.str0 t_orig98.str0 ~message:"t98.str0"; + check_string t98.str1 t_orig98.str1 ~message:"t98.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t98.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig98.float_u2) ~message:"t98.float_u2"; + check_string t99.str0 t_orig99.str0 ~message:"t99.str0"; + check_string t99.str1 t_orig99.str1 ~message:"t99.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t99.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig99.float32_u2) ~message:"t99.float32_u2"; + check_float t100.float0 t_orig100.float0 ~message:"t100.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t100.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig100.float32_u1) ~message:"t100.float32_u1"; + check_float t101.float0 t_orig101.float0 ~message:"t101.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t101.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig101.i32_1) ~message:"t101.i32_1"; + check_string t102.str0 t_orig102.str0 ~message:"t102.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t102.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig102.i32_1) ~message:"t102.i32_1"; + check_string t103.str0 t_orig103.str0 ~message:"t103.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t103.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig103.i64_1) ~message:"t103.i64_1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t104.i64_0) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig104.i64_0) ~message:"t104.i64_0"; + check_float t105.float0 t_orig105.float0 ~message:"t105.float0"; + check_string t105.str1 t_orig105.str1 ~message:"t105.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t105.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig105.float_u2) ~message:"t105.float_u2"; + check_float t106.float0 t_orig106.float0 ~message:"t106.float0"; + check_string t106.str1 t_orig106.str1 ~message:"t106.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t106.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig106.float_u2) ~message:"t106.float_u2"; + check_string t107.str0 t_orig107.str0 ~message:"t107.str0"; + check_string t107.str1 t_orig107.str1 ~message:"t107.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t107.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig107.float32_u2) ~message:"t107.float32_u2"; + check_string t108.str0 t_orig108.str0 ~message:"t108.str0"; + check_string t108.str1 t_orig108.str1 ~message:"t108.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t108.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig108.float32_u2) ~message:"t108.float32_u2"; + check_float t109.float0 t_orig109.float0 ~message:"t109.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t109.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig109.i32_1) ~message:"t109.i32_1"; + check_float t110.float0 t_orig110.float0 ~message:"t110.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t110.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig110.i32_1) ~message:"t110.i32_1"; + check_string t111.str0 t_orig111.str0 ~message:"t111.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t111.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig111.i64_1) ~message:"t111.i64_1"; + check_string t112.str0 t_orig112.str0 ~message:"t112.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t112.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig112.i64_1) ~message:"t112.i64_1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t113.n0) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig113.n0) ~message:"t113.n0"; + check_int t114.imm0 t_orig114.imm0 ~message:"t114.imm0"; + check_string t114.str1 t_orig114.str1 ~message:"t114.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t114.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig114.float_u2) ~message:"t114.float_u2"; + check_float t115.float0 t_orig115.float0 ~message:"t115.float0"; + check_string t115.str1 t_orig115.str1 ~message:"t115.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t115.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig115.float_u2) ~message:"t115.float_u2"; + check_float t116.float0 t_orig116.float0 ~message:"t116.float0"; + check_string t116.str1 t_orig116.str1 ~message:"t116.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t116.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig116.float32_u2) ~message:"t116.float32_u2"; + check_string t117.str0 t_orig117.str0 ~message:"t117.str0"; + check_string t117.str1 t_orig117.str1 ~message:"t117.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t117.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig117.float32_u2) ~message:"t117.float32_u2"; + check_string t118.str0 t_orig118.str0 ~message:"t118.str0"; + check_string t118.str1 t_orig118.str1 ~message:"t118.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t118.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig118.i32_2) ~message:"t118.i32_2"; + check_float t119.float0 t_orig119.float0 ~message:"t119.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t119.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig119.i32_1) ~message:"t119.i32_1"; + check_float t120.float0 t_orig120.float0 ~message:"t120.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t120.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig120.i64_1) ~message:"t120.i64_1"; + check_string t121.str0 t_orig121.str0 ~message:"t121.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t121.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig121.i64_1) ~message:"t121.i64_1"; + check_string t122.str0 t_orig122.str0 ~message:"t122.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t122.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig122.n1) ~message:"t122.n1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t123.n0) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig123.n0) ~message:"t123.n0"; + check_int t124.imm0 t_orig124.imm0 ~message:"t124.imm0"; + check_string t124.str1 t_orig124.str1 ~message:"t124.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t124.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig124.float_u2) ~message:"t124.float_u2"; + check_int t125.imm0 t_orig125.imm0 ~message:"t125.imm0"; + check_string t125.str1 t_orig125.str1 ~message:"t125.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t125.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig125.float_u2) ~message:"t125.float_u2"; + check_float t126.float0 t_orig126.float0 ~message:"t126.float0"; + check_string t126.str1 t_orig126.str1 ~message:"t126.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t126.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig126.float32_u2) ~message:"t126.float32_u2"; + check_float t127.float0 t_orig127.float0 ~message:"t127.float0"; + check_string t127.str1 t_orig127.str1 ~message:"t127.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t127.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig127.float32_u2) ~message:"t127.float32_u2"; + check_string t128.str0 t_orig128.str0 ~message:"t128.str0"; + check_string t128.str1 t_orig128.str1 ~message:"t128.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t128.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig128.i32_2) ~message:"t128.i32_2"; + check_string t129.str0 t_orig129.str0 ~message:"t129.str0"; + check_string t129.str1 t_orig129.str1 ~message:"t129.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t129.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig129.i32_2) ~message:"t129.i32_2"; + check_float t130.float0 t_orig130.float0 ~message:"t130.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t130.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig130.i64_1) ~message:"t130.i64_1"; + check_float t131.float0 t_orig131.float0 ~message:"t131.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t131.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig131.i64_1) ~message:"t131.i64_1"; + check_string t132.str0 t_orig132.str0 ~message:"t132.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t132.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig132.n1) ~message:"t132.n1"; + check_string t133.str0 t_orig133.str0 ~message:"t133.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t133.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig133.n1) ~message:"t133.n1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t134.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig134.float_u0) ~message:"t134.float_u0"; + check_int t134.imm1 t_orig134.imm1 ~message:"t134.imm1"; + check_string t135.str0 t_orig135.str0 ~message:"t135.str0"; + check_string t135.str1 t_orig135.str1 ~message:"t135.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t135.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig135.float_u2) ~message:"t135.float_u2"; + check_int t136.imm0 t_orig136.imm0 ~message:"t136.imm0"; + check_string t136.str1 t_orig136.str1 ~message:"t136.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t136.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig136.float_u2) ~message:"t136.float_u2"; + check_int t137.imm0 t_orig137.imm0 ~message:"t137.imm0"; + check_string t137.str1 t_orig137.str1 ~message:"t137.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t137.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig137.float32_u2) ~message:"t137.float32_u2"; + check_float t138.float0 t_orig138.float0 ~message:"t138.float0"; + check_string t138.str1 t_orig138.str1 ~message:"t138.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t138.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig138.float32_u2) ~message:"t138.float32_u2"; + check_float t139.float0 t_orig139.float0 ~message:"t139.float0"; + check_string t139.str1 t_orig139.str1 ~message:"t139.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t139.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig139.i32_2) ~message:"t139.i32_2"; + check_string t140.str0 t_orig140.str0 ~message:"t140.str0"; + check_string t140.str1 t_orig140.str1 ~message:"t140.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t140.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig140.i32_2) ~message:"t140.i32_2"; + check_string t141.str0 t_orig141.str0 ~message:"t141.str0"; + check_string t141.str1 t_orig141.str1 ~message:"t141.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t141.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig141.i64_2) ~message:"t141.i64_2"; + check_float t142.float0 t_orig142.float0 ~message:"t142.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t142.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig142.i64_1) ~message:"t142.i64_1"; + check_float t143.float0 t_orig143.float0 ~message:"t143.float0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t143.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig143.n1) ~message:"t143.n1"; + check_string t144.str0 t_orig144.str0 ~message:"t144.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t144.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig144.n1) ~message:"t144.n1"; + check_string t145.str0 t_orig145.str0 ~message:"t145.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t145.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig145.float_u1) ~message:"t145.float_u1"; + check_int t145.imm2 t_orig145.imm2 ~message:"t145.imm2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t146.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig146.float_u0) ~message:"t146.float_u0"; + check_int t146.imm1 t_orig146.imm1 ~message:"t146.imm1"; + check_string t147.str0 t_orig147.str0 ~message:"t147.str0"; + check_string t147.str1 t_orig147.str1 ~message:"t147.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t147.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig147.float_u2) ~message:"t147.float_u2"; + check_string t148.str0 t_orig148.str0 ~message:"t148.str0"; + check_string t148.str1 t_orig148.str1 ~message:"t148.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t148.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig148.float_u2) ~message:"t148.float_u2"; + check_int t149.imm0 t_orig149.imm0 ~message:"t149.imm0"; + check_string t149.str1 t_orig149.str1 ~message:"t149.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t149.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig149.float32_u2) ~message:"t149.float32_u2"; + check_int t150.imm0 t_orig150.imm0 ~message:"t150.imm0"; + check_string t150.str1 t_orig150.str1 ~message:"t150.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t150.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig150.float32_u2) ~message:"t150.float32_u2"; + check_float t151.float0 t_orig151.float0 ~message:"t151.float0"; + check_string t151.str1 t_orig151.str1 ~message:"t151.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t151.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig151.i32_2) ~message:"t151.i32_2"; + check_float t152.float0 t_orig152.float0 ~message:"t152.float0"; + check_string t152.str1 t_orig152.str1 ~message:"t152.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t152.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig152.i32_2) ~message:"t152.i32_2"; + check_string t153.str0 t_orig153.str0 ~message:"t153.str0"; + check_string t153.str1 t_orig153.str1 ~message:"t153.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t153.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig153.i64_2) ~message:"t153.i64_2"; + check_string t154.str0 t_orig154.str0 ~message:"t154.str0"; + check_string t154.str1 t_orig154.str1 ~message:"t154.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t154.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig154.i64_2) ~message:"t154.i64_2"; + check_float t155.float0 t_orig155.float0 ~message:"t155.float0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t155.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig155.n1) ~message:"t155.n1"; + check_float t156.float0 t_orig156.float0 ~message:"t156.float0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t156.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig156.n1) ~message:"t156.n1"; + check_string t157.str0 t_orig157.str0 ~message:"t157.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t157.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig157.float_u1) ~message:"t157.float_u1"; + check_int t157.imm2 t_orig157.imm2 ~message:"t157.imm2"; + check_string t158.str0 t_orig158.str0 ~message:"t158.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t158.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig158.float_u1) ~message:"t158.float_u1"; + check_int t158.imm2 t_orig158.imm2 ~message:"t158.imm2"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t159.float32_u0) (Stdlib_stable.Float32_u.to_float32 t_orig159.float32_u0) ~message:"t159.float32_u0"; + check_int t159.imm1 t_orig159.imm1 ~message:"t159.imm1"; + check_float t160.float0 t_orig160.float0 ~message:"t160.float0"; + check_string t160.str1 t_orig160.str1 ~message:"t160.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t160.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig160.float_u2) ~message:"t160.float_u2"; + check_string t161.str0 t_orig161.str0 ~message:"t161.str0"; + check_string t161.str1 t_orig161.str1 ~message:"t161.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t161.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig161.float_u2) ~message:"t161.float_u2"; + check_string t162.str0 t_orig162.str0 ~message:"t162.str0"; + check_string t162.str1 t_orig162.str1 ~message:"t162.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t162.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig162.float32_u2) ~message:"t162.float32_u2"; + check_int t163.imm0 t_orig163.imm0 ~message:"t163.imm0"; + check_string t163.str1 t_orig163.str1 ~message:"t163.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t163.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig163.float32_u2) ~message:"t163.float32_u2"; + check_int t164.imm0 t_orig164.imm0 ~message:"t164.imm0"; + check_string t164.str1 t_orig164.str1 ~message:"t164.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t164.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig164.i32_2) ~message:"t164.i32_2"; + check_float t165.float0 t_orig165.float0 ~message:"t165.float0"; + check_string t165.str1 t_orig165.str1 ~message:"t165.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t165.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig165.i32_2) ~message:"t165.i32_2"; + check_float t166.float0 t_orig166.float0 ~message:"t166.float0"; + check_string t166.str1 t_orig166.str1 ~message:"t166.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t166.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig166.i64_2) ~message:"t166.i64_2"; + check_string t167.str0 t_orig167.str0 ~message:"t167.str0"; + check_string t167.str1 t_orig167.str1 ~message:"t167.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t167.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig167.i64_2) ~message:"t167.i64_2"; + check_string t168.str0 t_orig168.str0 ~message:"t168.str0"; + check_string t168.str1 t_orig168.str1 ~message:"t168.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t168.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig168.n2) ~message:"t168.n2"; + check_float t169.float0 t_orig169.float0 ~message:"t169.float0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t169.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig169.n1) ~message:"t169.n1"; + check_float t170.float0 t_orig170.float0 ~message:"t170.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t170.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig170.float_u1) ~message:"t170.float_u1"; + check_int t170.imm2 t_orig170.imm2 ~message:"t170.imm2"; + check_string t171.str0 t_orig171.str0 ~message:"t171.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t171.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig171.float_u1) ~message:"t171.float_u1"; + check_int t171.imm2 t_orig171.imm2 ~message:"t171.imm2"; + check_string t172.str0 t_orig172.str0 ~message:"t172.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t172.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig172.float32_u1) ~message:"t172.float32_u1"; + check_int t172.imm2 t_orig172.imm2 ~message:"t172.imm2"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t173.float32_u0) (Stdlib_stable.Float32_u.to_float32 t_orig173.float32_u0) ~message:"t173.float32_u0"; + check_int t173.imm1 t_orig173.imm1 ~message:"t173.imm1"; + check_float t174.float0 t_orig174.float0 ~message:"t174.float0"; + check_string t174.str1 t_orig174.str1 ~message:"t174.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t174.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig174.float_u2) ~message:"t174.float_u2"; + check_float t175.float0 t_orig175.float0 ~message:"t175.float0"; + check_string t175.str1 t_orig175.str1 ~message:"t175.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t175.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig175.float_u2) ~message:"t175.float_u2"; + check_string t176.str0 t_orig176.str0 ~message:"t176.str0"; + check_string t176.str1 t_orig176.str1 ~message:"t176.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t176.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig176.float32_u2) ~message:"t176.float32_u2"; + check_string t177.str0 t_orig177.str0 ~message:"t177.str0"; + check_string t177.str1 t_orig177.str1 ~message:"t177.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t177.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig177.float32_u2) ~message:"t177.float32_u2"; + check_int t178.imm0 t_orig178.imm0 ~message:"t178.imm0"; + check_string t178.str1 t_orig178.str1 ~message:"t178.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t178.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig178.i32_2) ~message:"t178.i32_2"; + check_int t179.imm0 t_orig179.imm0 ~message:"t179.imm0"; + check_string t179.str1 t_orig179.str1 ~message:"t179.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t179.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig179.i32_2) ~message:"t179.i32_2"; + check_float t180.float0 t_orig180.float0 ~message:"t180.float0"; + check_string t180.str1 t_orig180.str1 ~message:"t180.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t180.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig180.i64_2) ~message:"t180.i64_2"; + check_float t181.float0 t_orig181.float0 ~message:"t181.float0"; + check_string t181.str1 t_orig181.str1 ~message:"t181.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t181.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig181.i64_2) ~message:"t181.i64_2"; + check_string t182.str0 t_orig182.str0 ~message:"t182.str0"; + check_string t182.str1 t_orig182.str1 ~message:"t182.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t182.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig182.n2) ~message:"t182.n2"; + check_string t183.str0 t_orig183.str0 ~message:"t183.str0"; + check_string t183.str1 t_orig183.str1 ~message:"t183.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t183.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig183.n2) ~message:"t183.n2"; + check_float t184.float0 t_orig184.float0 ~message:"t184.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t184.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig184.float_u1) ~message:"t184.float_u1"; + check_int t184.imm2 t_orig184.imm2 ~message:"t184.imm2"; + check_float t185.float0 t_orig185.float0 ~message:"t185.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t185.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig185.float_u1) ~message:"t185.float_u1"; + check_int t185.imm2 t_orig185.imm2 ~message:"t185.imm2"; + check_string t186.str0 t_orig186.str0 ~message:"t186.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t186.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig186.float32_u1) ~message:"t186.float32_u1"; + check_int t186.imm2 t_orig186.imm2 ~message:"t186.imm2"; + check_string t187.str0 t_orig187.str0 ~message:"t187.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t187.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig187.float32_u1) ~message:"t187.float32_u1"; + check_int t187.imm2 t_orig187.imm2 ~message:"t187.imm2"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t188.i32_0) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig188.i32_0) ~message:"t188.i32_0"; + check_int t188.imm1 t_orig188.imm1 ~message:"t188.imm1"; + check_int t189.imm0 t_orig189.imm0 ~message:"t189.imm0"; + check_string t189.str1 t_orig189.str1 ~message:"t189.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t189.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig189.float_u2) ~message:"t189.float_u2"; + check_float t190.float0 t_orig190.float0 ~message:"t190.float0"; + check_string t190.str1 t_orig190.str1 ~message:"t190.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t190.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig190.float_u2) ~message:"t190.float_u2"; + check_float t191.float0 t_orig191.float0 ~message:"t191.float0"; + check_string t191.str1 t_orig191.str1 ~message:"t191.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t191.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig191.float32_u2) ~message:"t191.float32_u2"; + check_string t192.str0 t_orig192.str0 ~message:"t192.str0"; + check_string t192.str1 t_orig192.str1 ~message:"t192.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t192.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig192.float32_u2) ~message:"t192.float32_u2"; + check_string t193.str0 t_orig193.str0 ~message:"t193.str0"; + check_string t193.str1 t_orig193.str1 ~message:"t193.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t193.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig193.i32_2) ~message:"t193.i32_2"; + check_int t194.imm0 t_orig194.imm0 ~message:"t194.imm0"; + check_string t194.str1 t_orig194.str1 ~message:"t194.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t194.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig194.i32_2) ~message:"t194.i32_2"; + check_int t195.imm0 t_orig195.imm0 ~message:"t195.imm0"; + check_string t195.str1 t_orig195.str1 ~message:"t195.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t195.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig195.i64_2) ~message:"t195.i64_2"; + check_float t196.float0 t_orig196.float0 ~message:"t196.float0"; + check_string t196.str1 t_orig196.str1 ~message:"t196.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t196.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig196.i64_2) ~message:"t196.i64_2"; + check_float t197.float0 t_orig197.float0 ~message:"t197.float0"; + check_string t197.str1 t_orig197.str1 ~message:"t197.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t197.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig197.n2) ~message:"t197.n2"; + check_string t198.str0 t_orig198.str0 ~message:"t198.str0"; + check_string t198.str1 t_orig198.str1 ~message:"t198.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t198.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig198.n2) ~message:"t198.n2"; + check_string t199.str0 t_orig199.str0 ~message:"t199.str0"; + check_string t199.str1 t_orig199.str1 ~message:"t199.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t199.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig199.float_u2) ~message:"t199.float_u2"; + check_int t199.imm3 t_orig199.imm3 ~message:"t199.imm3"; + check_float t200.float0 t_orig200.float0 ~message:"t200.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t200.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig200.float_u1) ~message:"t200.float_u1"; + check_int t200.imm2 t_orig200.imm2 ~message:"t200.imm2"; + check_float t201.float0 t_orig201.float0 ~message:"t201.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t201.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig201.float32_u1) ~message:"t201.float32_u1"; + check_int t201.imm2 t_orig201.imm2 ~message:"t201.imm2"; + check_string t202.str0 t_orig202.str0 ~message:"t202.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t202.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig202.float32_u1) ~message:"t202.float32_u1"; + check_int t202.imm2 t_orig202.imm2 ~message:"t202.imm2"; + check_string t203.str0 t_orig203.str0 ~message:"t203.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t203.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig203.i32_1) ~message:"t203.i32_1"; + check_int t203.imm2 t_orig203.imm2 ~message:"t203.imm2"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t204.i32_0) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig204.i32_0) ~message:"t204.i32_0"; + check_int t204.imm1 t_orig204.imm1 ~message:"t204.imm1"; + check_int t205.imm0 t_orig205.imm0 ~message:"t205.imm0"; + check_string t205.str1 t_orig205.str1 ~message:"t205.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t205.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig205.float_u2) ~message:"t205.float_u2"; + check_int t206.imm0 t_orig206.imm0 ~message:"t206.imm0"; + check_string t206.str1 t_orig206.str1 ~message:"t206.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t206.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig206.float_u2) ~message:"t206.float_u2"; + check_float t207.float0 t_orig207.float0 ~message:"t207.float0"; + check_string t207.str1 t_orig207.str1 ~message:"t207.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t207.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig207.float32_u2) ~message:"t207.float32_u2"; + check_float t208.float0 t_orig208.float0 ~message:"t208.float0"; + check_string t208.str1 t_orig208.str1 ~message:"t208.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t208.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig208.float32_u2) ~message:"t208.float32_u2"; + check_string t209.str0 t_orig209.str0 ~message:"t209.str0"; + check_string t209.str1 t_orig209.str1 ~message:"t209.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t209.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig209.i32_2) ~message:"t209.i32_2"; + check_string t210.str0 t_orig210.str0 ~message:"t210.str0"; + check_string t210.str1 t_orig210.str1 ~message:"t210.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t210.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig210.i32_2) ~message:"t210.i32_2"; + check_int t211.imm0 t_orig211.imm0 ~message:"t211.imm0"; + check_string t211.str1 t_orig211.str1 ~message:"t211.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t211.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig211.i64_2) ~message:"t211.i64_2"; + check_int t212.imm0 t_orig212.imm0 ~message:"t212.imm0"; + check_string t212.str1 t_orig212.str1 ~message:"t212.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t212.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig212.i64_2) ~message:"t212.i64_2"; + check_float t213.float0 t_orig213.float0 ~message:"t213.float0"; + check_string t213.str1 t_orig213.str1 ~message:"t213.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t213.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig213.n2) ~message:"t213.n2"; + check_float t214.float0 t_orig214.float0 ~message:"t214.float0"; + check_string t214.str1 t_orig214.str1 ~message:"t214.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t214.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig214.n2) ~message:"t214.n2"; + check_string t215.str0 t_orig215.str0 ~message:"t215.str0"; + check_string t215.str1 t_orig215.str1 ~message:"t215.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t215.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig215.float_u2) ~message:"t215.float_u2"; + check_int t215.imm3 t_orig215.imm3 ~message:"t215.imm3"; + check_string t216.str0 t_orig216.str0 ~message:"t216.str0"; + check_string t216.str1 t_orig216.str1 ~message:"t216.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t216.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig216.float_u2) ~message:"t216.float_u2"; + check_int t216.imm3 t_orig216.imm3 ~message:"t216.imm3"; + check_float t217.float0 t_orig217.float0 ~message:"t217.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t217.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig217.float32_u1) ~message:"t217.float32_u1"; + check_int t217.imm2 t_orig217.imm2 ~message:"t217.imm2"; + check_float t218.float0 t_orig218.float0 ~message:"t218.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t218.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig218.float32_u1) ~message:"t218.float32_u1"; + check_int t218.imm2 t_orig218.imm2 ~message:"t218.imm2"; + check_string t219.str0 t_orig219.str0 ~message:"t219.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t219.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig219.i32_1) ~message:"t219.i32_1"; + check_int t219.imm2 t_orig219.imm2 ~message:"t219.imm2"; + check_string t220.str0 t_orig220.str0 ~message:"t220.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t220.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig220.i32_1) ~message:"t220.i32_1"; + check_int t220.imm2 t_orig220.imm2 ~message:"t220.imm2"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t221.i64_0) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig221.i64_0) ~message:"t221.i64_0"; + check_int t221.imm1 t_orig221.imm1 ~message:"t221.imm1"; + check_string t222.str0 t_orig222.str0 ~message:"t222.str0"; + check_float t222.float1 t_orig222.float1 ~message:"t222.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t222.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig222.float_u2) ~message:"t222.float_u2"; + check_int t223.imm0 t_orig223.imm0 ~message:"t223.imm0"; + check_string t223.str1 t_orig223.str1 ~message:"t223.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t223.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig223.float_u2) ~message:"t223.float_u2"; + check_int t224.imm0 t_orig224.imm0 ~message:"t224.imm0"; + check_string t224.str1 t_orig224.str1 ~message:"t224.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t224.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig224.float32_u2) ~message:"t224.float32_u2"; + check_float t225.float0 t_orig225.float0 ~message:"t225.float0"; + check_string t225.str1 t_orig225.str1 ~message:"t225.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t225.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig225.float32_u2) ~message:"t225.float32_u2"; + check_float t226.float0 t_orig226.float0 ~message:"t226.float0"; + check_string t226.str1 t_orig226.str1 ~message:"t226.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t226.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig226.i32_2) ~message:"t226.i32_2"; + check_string t227.str0 t_orig227.str0 ~message:"t227.str0"; + check_string t227.str1 t_orig227.str1 ~message:"t227.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t227.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig227.i32_2) ~message:"t227.i32_2"; + check_string t228.str0 t_orig228.str0 ~message:"t228.str0"; + check_string t228.str1 t_orig228.str1 ~message:"t228.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t228.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig228.i64_2) ~message:"t228.i64_2"; + check_int t229.imm0 t_orig229.imm0 ~message:"t229.imm0"; + check_string t229.str1 t_orig229.str1 ~message:"t229.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t229.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig229.i64_2) ~message:"t229.i64_2"; + check_int t230.imm0 t_orig230.imm0 ~message:"t230.imm0"; + check_string t230.str1 t_orig230.str1 ~message:"t230.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t230.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig230.n2) ~message:"t230.n2"; + check_float t231.float0 t_orig231.float0 ~message:"t231.float0"; + check_string t231.str1 t_orig231.str1 ~message:"t231.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t231.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig231.n2) ~message:"t231.n2"; + check_float t232.float0 t_orig232.float0 ~message:"t232.float0"; + check_string t232.str1 t_orig232.str1 ~message:"t232.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t232.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig232.float_u2) ~message:"t232.float_u2"; + check_int t232.imm3 t_orig232.imm3 ~message:"t232.imm3"; + check_string t233.str0 t_orig233.str0 ~message:"t233.str0"; + check_string t233.str1 t_orig233.str1 ~message:"t233.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t233.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig233.float_u2) ~message:"t233.float_u2"; + check_int t233.imm3 t_orig233.imm3 ~message:"t233.imm3"; + check_string t234.str0 t_orig234.str0 ~message:"t234.str0"; + check_string t234.str1 t_orig234.str1 ~message:"t234.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t234.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig234.float32_u2) ~message:"t234.float32_u2"; + check_int t234.imm3 t_orig234.imm3 ~message:"t234.imm3"; + check_float t235.float0 t_orig235.float0 ~message:"t235.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t235.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig235.float32_u1) ~message:"t235.float32_u1"; + check_int t235.imm2 t_orig235.imm2 ~message:"t235.imm2"; + check_float t236.float0 t_orig236.float0 ~message:"t236.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t236.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig236.i32_1) ~message:"t236.i32_1"; + check_int t236.imm2 t_orig236.imm2 ~message:"t236.imm2"; + check_string t237.str0 t_orig237.str0 ~message:"t237.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t237.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig237.i32_1) ~message:"t237.i32_1"; + check_int t237.imm2 t_orig237.imm2 ~message:"t237.imm2"; + check_string t238.str0 t_orig238.str0 ~message:"t238.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t238.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig238.i64_1) ~message:"t238.i64_1"; + check_int t238.imm2 t_orig238.imm2 ~message:"t238.imm2"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t239.i64_0) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig239.i64_0) ~message:"t239.i64_0"; + check_int t239.imm1 t_orig239.imm1 ~message:"t239.imm1"; + check_string t240.str0 t_orig240.str0 ~message:"t240.str0"; + check_float t240.float1 t_orig240.float1 ~message:"t240.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t240.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig240.float_u2) ~message:"t240.float_u2"; + check_string t241.str0 t_orig241.str0 ~message:"t241.str0"; + check_float t241.float1 t_orig241.float1 ~message:"t241.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t241.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig241.float_u2) ~message:"t241.float_u2"; + check_int t242.imm0 t_orig242.imm0 ~message:"t242.imm0"; + check_string t242.str1 t_orig242.str1 ~message:"t242.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t242.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig242.float32_u2) ~message:"t242.float32_u2"; + check_int t243.imm0 t_orig243.imm0 ~message:"t243.imm0"; + check_string t243.str1 t_orig243.str1 ~message:"t243.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t243.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig243.float32_u2) ~message:"t243.float32_u2"; + check_float t244.float0 t_orig244.float0 ~message:"t244.float0"; + check_string t244.str1 t_orig244.str1 ~message:"t244.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t244.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig244.i32_2) ~message:"t244.i32_2"; + check_float t245.float0 t_orig245.float0 ~message:"t245.float0"; + check_string t245.str1 t_orig245.str1 ~message:"t245.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t245.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig245.i32_2) ~message:"t245.i32_2"; + check_string t246.str0 t_orig246.str0 ~message:"t246.str0"; + check_string t246.str1 t_orig246.str1 ~message:"t246.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t246.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig246.i64_2) ~message:"t246.i64_2"; + check_string t247.str0 t_orig247.str0 ~message:"t247.str0"; + check_string t247.str1 t_orig247.str1 ~message:"t247.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t247.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig247.i64_2) ~message:"t247.i64_2"; + check_int t248.imm0 t_orig248.imm0 ~message:"t248.imm0"; + check_string t248.str1 t_orig248.str1 ~message:"t248.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t248.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig248.n2) ~message:"t248.n2"; + check_int t249.imm0 t_orig249.imm0 ~message:"t249.imm0"; + check_string t249.str1 t_orig249.str1 ~message:"t249.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t249.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig249.n2) ~message:"t249.n2"; + check_float t250.float0 t_orig250.float0 ~message:"t250.float0"; + check_string t250.str1 t_orig250.str1 ~message:"t250.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t250.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig250.float_u2) ~message:"t250.float_u2"; + check_int t250.imm3 t_orig250.imm3 ~message:"t250.imm3"; + check_float t251.float0 t_orig251.float0 ~message:"t251.float0"; + check_string t251.str1 t_orig251.str1 ~message:"t251.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t251.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig251.float_u2) ~message:"t251.float_u2"; + check_int t251.imm3 t_orig251.imm3 ~message:"t251.imm3"; + check_string t252.str0 t_orig252.str0 ~message:"t252.str0"; + check_string t252.str1 t_orig252.str1 ~message:"t252.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t252.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig252.float32_u2) ~message:"t252.float32_u2"; + check_int t252.imm3 t_orig252.imm3 ~message:"t252.imm3"; + check_string t253.str0 t_orig253.str0 ~message:"t253.str0"; + check_string t253.str1 t_orig253.str1 ~message:"t253.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t253.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig253.float32_u2) ~message:"t253.float32_u2"; + check_int t253.imm3 t_orig253.imm3 ~message:"t253.imm3"; + check_float t254.float0 t_orig254.float0 ~message:"t254.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t254.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig254.i32_1) ~message:"t254.i32_1"; + check_int t254.imm2 t_orig254.imm2 ~message:"t254.imm2"; + check_float t255.float0 t_orig255.float0 ~message:"t255.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t255.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig255.i32_1) ~message:"t255.i32_1"; + check_int t255.imm2 t_orig255.imm2 ~message:"t255.imm2"; + check_string t256.str0 t_orig256.str0 ~message:"t256.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t256.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig256.i64_1) ~message:"t256.i64_1"; + check_int t256.imm2 t_orig256.imm2 ~message:"t256.imm2"; + check_string t257.str0 t_orig257.str0 ~message:"t257.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t257.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig257.i64_1) ~message:"t257.i64_1"; + check_int t257.imm2 t_orig257.imm2 ~message:"t257.imm2"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t258.n0) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig258.n0) ~message:"t258.n0"; + check_int t258.imm1 t_orig258.imm1 ~message:"t258.imm1"; + check_string t259.str0 t_orig259.str0 ~message:"t259.str0"; + check_float t259.float1 t_orig259.float1 ~message:"t259.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t259.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig259.float_u2) ~message:"t259.float_u2"; + check_string t260.str0 t_orig260.str0 ~message:"t260.str0"; + check_float t260.float1 t_orig260.float1 ~message:"t260.float1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t260.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig260.float32_u2) ~message:"t260.float32_u2"; + check_int t261.imm0 t_orig261.imm0 ~message:"t261.imm0"; + check_string t261.str1 t_orig261.str1 ~message:"t261.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t261.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig261.float32_u2) ~message:"t261.float32_u2"; + check_int t262.imm0 t_orig262.imm0 ~message:"t262.imm0"; + check_string t262.str1 t_orig262.str1 ~message:"t262.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t262.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig262.i32_2) ~message:"t262.i32_2"; + check_float t263.float0 t_orig263.float0 ~message:"t263.float0"; + check_string t263.str1 t_orig263.str1 ~message:"t263.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t263.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig263.i32_2) ~message:"t263.i32_2"; + check_float t264.float0 t_orig264.float0 ~message:"t264.float0"; + check_string t264.str1 t_orig264.str1 ~message:"t264.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t264.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig264.i64_2) ~message:"t264.i64_2"; + check_string t265.str0 t_orig265.str0 ~message:"t265.str0"; + check_string t265.str1 t_orig265.str1 ~message:"t265.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t265.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig265.i64_2) ~message:"t265.i64_2"; + check_string t266.str0 t_orig266.str0 ~message:"t266.str0"; + check_string t266.str1 t_orig266.str1 ~message:"t266.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t266.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig266.n2) ~message:"t266.n2"; + check_int t267.imm0 t_orig267.imm0 ~message:"t267.imm0"; + check_string t267.str1 t_orig267.str1 ~message:"t267.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t267.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig267.n2) ~message:"t267.n2"; + check_int t268.imm0 t_orig268.imm0 ~message:"t268.imm0"; + check_string t268.str1 t_orig268.str1 ~message:"t268.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t268.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig268.float_u2) ~message:"t268.float_u2"; + check_int t268.imm3 t_orig268.imm3 ~message:"t268.imm3"; + check_float t269.float0 t_orig269.float0 ~message:"t269.float0"; + check_string t269.str1 t_orig269.str1 ~message:"t269.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t269.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig269.float_u2) ~message:"t269.float_u2"; + check_int t269.imm3 t_orig269.imm3 ~message:"t269.imm3"; + check_float t270.float0 t_orig270.float0 ~message:"t270.float0"; + check_string t270.str1 t_orig270.str1 ~message:"t270.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t270.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig270.float32_u2) ~message:"t270.float32_u2"; + check_int t270.imm3 t_orig270.imm3 ~message:"t270.imm3"; + check_string t271.str0 t_orig271.str0 ~message:"t271.str0"; + check_string t271.str1 t_orig271.str1 ~message:"t271.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t271.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig271.float32_u2) ~message:"t271.float32_u2"; + check_int t271.imm3 t_orig271.imm3 ~message:"t271.imm3"; + check_string t272.str0 t_orig272.str0 ~message:"t272.str0"; + check_string t272.str1 t_orig272.str1 ~message:"t272.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t272.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig272.i32_2) ~message:"t272.i32_2"; + check_int t272.imm3 t_orig272.imm3 ~message:"t272.imm3"; + check_float t273.float0 t_orig273.float0 ~message:"t273.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t273.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig273.i32_1) ~message:"t273.i32_1"; + check_int t273.imm2 t_orig273.imm2 ~message:"t273.imm2"; + check_float t274.float0 t_orig274.float0 ~message:"t274.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t274.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig274.i64_1) ~message:"t274.i64_1"; + check_int t274.imm2 t_orig274.imm2 ~message:"t274.imm2"; + check_string t275.str0 t_orig275.str0 ~message:"t275.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t275.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig275.i64_1) ~message:"t275.i64_1"; + check_int t275.imm2 t_orig275.imm2 ~message:"t275.imm2"; + check_string t276.str0 t_orig276.str0 ~message:"t276.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t276.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig276.n1) ~message:"t276.n1"; + check_int t276.imm2 t_orig276.imm2 ~message:"t276.imm2"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t277.n0) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig277.n0) ~message:"t277.n0"; + check_int t277.imm1 t_orig277.imm1 ~message:"t277.imm1"; + check_string t278.str0 t_orig278.str0 ~message:"t278.str0"; + check_float t278.float1 t_orig278.float1 ~message:"t278.float1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t278.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig278.float32_u2) ~message:"t278.float32_u2"; + check_string t279.str0 t_orig279.str0 ~message:"t279.str0"; + check_float t279.float1 t_orig279.float1 ~message:"t279.float1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t279.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig279.float32_u2) ~message:"t279.float32_u2"; + check_int t280.imm0 t_orig280.imm0 ~message:"t280.imm0"; + check_string t280.str1 t_orig280.str1 ~message:"t280.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t280.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig280.i32_2) ~message:"t280.i32_2"; + check_int t281.imm0 t_orig281.imm0 ~message:"t281.imm0"; + check_string t281.str1 t_orig281.str1 ~message:"t281.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t281.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig281.i32_2) ~message:"t281.i32_2"; + check_float t282.float0 t_orig282.float0 ~message:"t282.float0"; + check_string t282.str1 t_orig282.str1 ~message:"t282.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t282.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig282.i64_2) ~message:"t282.i64_2"; + check_float t283.float0 t_orig283.float0 ~message:"t283.float0"; + check_string t283.str1 t_orig283.str1 ~message:"t283.str1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t283.i64_2) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig283.i64_2) ~message:"t283.i64_2"; + check_string t284.str0 t_orig284.str0 ~message:"t284.str0"; + check_string t284.str1 t_orig284.str1 ~message:"t284.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t284.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig284.n2) ~message:"t284.n2"; + check_string t285.str0 t_orig285.str0 ~message:"t285.str0"; + check_string t285.str1 t_orig285.str1 ~message:"t285.str1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t285.n2) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig285.n2) ~message:"t285.n2"; + check_int t286.imm0 t_orig286.imm0 ~message:"t286.imm0"; + check_string t286.str1 t_orig286.str1 ~message:"t286.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t286.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig286.float_u2) ~message:"t286.float_u2"; + check_int t286.imm3 t_orig286.imm3 ~message:"t286.imm3"; + check_int t287.imm0 t_orig287.imm0 ~message:"t287.imm0"; + check_string t287.str1 t_orig287.str1 ~message:"t287.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t287.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig287.float_u2) ~message:"t287.float_u2"; + check_int t287.imm3 t_orig287.imm3 ~message:"t287.imm3"; + check_float t288.float0 t_orig288.float0 ~message:"t288.float0"; + check_string t288.str1 t_orig288.str1 ~message:"t288.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t288.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig288.float32_u2) ~message:"t288.float32_u2"; + check_int t288.imm3 t_orig288.imm3 ~message:"t288.imm3"; + check_float t289.float0 t_orig289.float0 ~message:"t289.float0"; + check_string t289.str1 t_orig289.str1 ~message:"t289.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t289.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig289.float32_u2) ~message:"t289.float32_u2"; + check_int t289.imm3 t_orig289.imm3 ~message:"t289.imm3"; + check_string t290.str0 t_orig290.str0 ~message:"t290.str0"; + check_string t290.str1 t_orig290.str1 ~message:"t290.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t290.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig290.i32_2) ~message:"t290.i32_2"; + check_int t290.imm3 t_orig290.imm3 ~message:"t290.imm3"; + check_string t291.str0 t_orig291.str0 ~message:"t291.str0"; + check_string t291.str1 t_orig291.str1 ~message:"t291.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t291.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig291.i32_2) ~message:"t291.i32_2"; + check_int t291.imm3 t_orig291.imm3 ~message:"t291.imm3"; + check_float t292.float0 t_orig292.float0 ~message:"t292.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t292.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig292.i64_1) ~message:"t292.i64_1"; + check_int t292.imm2 t_orig292.imm2 ~message:"t292.imm2"; + check_float t293.float0 t_orig293.float0 ~message:"t293.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t293.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig293.i64_1) ~message:"t293.i64_1"; + check_int t293.imm2 t_orig293.imm2 ~message:"t293.imm2"; + check_string t294.str0 t_orig294.str0 ~message:"t294.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t294.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig294.n1) ~message:"t294.n1"; + check_int t294.imm2 t_orig294.imm2 ~message:"t294.imm2"; + check_string t295.str0 t_orig295.str0 ~message:"t295.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t295.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig295.n1) ~message:"t295.n1"; + check_int t295.imm2 t_orig295.imm2 ~message:"t295.imm2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t296.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig296.float_u0) ~message:"t296.float_u0"; + check_int t296.imm1 t_orig296.imm1 ~message:"t296.imm1"; + check_int t297.imm0 t_orig297.imm0 ~message:"t297.imm0"; + check_float t297.float1 t_orig297.float1 ~message:"t297.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t297.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig297.float_u2) ~message:"t297.float_u2"; + check_float t298.float0 t_orig298.float0 ~message:"t298.float0"; + check_float t298.float1 t_orig298.float1 ~message:"t298.float1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t298.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig298.float32_u2) ~message:"t298.float32_u2"; + check_string t299.str0 t_orig299.str0 ~message:"t299.str0"; + check_float t299.float1 t_orig299.float1 ~message:"t299.float1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t299.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig299.float32_u2) ~message:"t299.float32_u2"; + let () = match t300_A, t_orig300_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t300_A.0"; + + in + let () = match t301_A, t_orig301_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t301_A.0"; + | _ -> assert false + in + let () = match t301_B, t_orig301_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t301_B.0"; + | _ -> assert false + in + let () = match t302_A, t_orig302_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t302_A.float_u0"; + + in + let () = match t303_A, t_orig303_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t303_A.0"; + | _ -> assert false + in + let () = match t303_B, t_orig303_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t303_B.0"; + | _ -> assert false + in + let () = match t303_C, t_orig303_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t303_C.0"; + | _ -> assert false + in + let () = match t304_A, t_orig304_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t304_A.float_u0"; + | _ -> assert false + in + let () = match t304_B, t_orig304_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t304_B.0"; + | _ -> assert false + in + let () = match t305_A, t_orig305_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t305_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t305_A.1"; + + in + let () = match t306_A, t_orig306_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t306_A.0"; + | _ -> assert false + in + let () = match t306_B, t_orig306_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t306_B.float_u0"; + | _ -> assert false + in + let () = match t307_A, t_orig307_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t307_A.float_u0"; + | _ -> assert false + in + let () = match t307_B, t_orig307_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t307_B.0"; + | _ -> assert false + in + let () = match t307_C, t_orig307_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t307_C.0"; + | _ -> assert false + in + let () = match t308_A, t_orig308_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t308_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t308_A.1"; + | _ -> assert false + in + let () = match t308_B, t_orig308_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t308_B.0"; + | _ -> assert false + in + let () = match t309_A, t_orig309_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t309_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t309_A.float_u1"; + + in + let () = match t310_A, t_orig310_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t310_A.0"; + | _ -> assert false + in + let () = match t310_B, t_orig310_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t310_B.0"; + | _ -> assert false + in + let () = match t310_C, t_orig310_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t310_C.0"; + | _ -> assert false + in + let () = match t310_D, t_orig310_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t310_D.0"; + | _ -> assert false + in + let () = match t311_A, t_orig311_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t311_A.float_u0"; + | _ -> assert false + in + let () = match t311_B, t_orig311_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t311_B.float_u0"; + | _ -> assert false + in + let () = match t312_A, t_orig312_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t312_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t312_A.1"; + | _ -> assert false + in + let () = match t312_B, t_orig312_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t312_B.0"; + | _ -> assert false + in + let () = match t312_C, t_orig312_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t312_C.0"; + | _ -> assert false + in + let () = match t313_A, t_orig313_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t313_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t313_A.float_u1"; + | _ -> assert false + in + let () = match t313_B, t_orig313_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t313_B.0"; + | _ -> assert false + in + let () = match t314_A, t_orig314_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t314_A.0"; + + in + let () = match t315_A, t_orig315_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t315_A.0"; + | _ -> assert false + in + let () = match t315_B, t_orig315_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t315_B.float_u0"; + | _ -> assert false + in + let () = match t315_C, t_orig315_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t315_C.0"; + | _ -> assert false + in + let () = match t316_A, t_orig316_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t316_A.float_u0"; + | _ -> assert false + in + let () = match t316_B, t_orig316_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t316_B.0"; + | _ -> assert false + in + let () = match t316_C, t_orig316_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t316_C.0"; + | _ -> assert false + in + let () = match t316_D, t_orig316_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t316_D.0"; + | _ -> assert false + in + let () = match t317_A, t_orig317_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t317_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t317_A.1"; + | _ -> assert false + in + let () = match t317_B, t_orig317_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t317_B.float_u0"; + | _ -> assert false + in + let () = match t318_A, t_orig318_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t318_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t318_A.float_u1"; + | _ -> assert false + in + let () = match t318_B, t_orig318_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t318_B.0"; + | _ -> assert false + in + let () = match t318_C, t_orig318_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t318_C.0"; + | _ -> assert false + in + let () = match t319_A, t_orig319_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t319_A.0"; + | _ -> assert false + in + let () = match t319_B, t_orig319_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t319_B.0"; + | _ -> assert false + in + let () = match t320_A, t_orig320_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t320_A.float_u0"; + + in + let () = match t321_A, t_orig321_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t321_A.0"; + | _ -> assert false + in + let () = match t321_B, t_orig321_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t321_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t321_B.1"; + | _ -> assert false + in + let () = match t322_A, t_orig322_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t322_A.float_u0"; + | _ -> assert false + in + let () = match t322_B, t_orig322_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t322_B.float_u0"; + | _ -> assert false + in + let () = match t322_C, t_orig322_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t322_C.0"; + | _ -> assert false + in + let () = match t323_A, t_orig323_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t323_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t323_A.1"; + | _ -> assert false + in + let () = match t323_B, t_orig323_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t323_B.0"; + | _ -> assert false + in + let () = match t323_C, t_orig323_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t323_C.0"; + | _ -> assert false + in + let () = match t323_D, t_orig323_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t323_D.0"; + | _ -> assert false + in + let () = match t324_A, t_orig324_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t324_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t324_A.float_u1"; + | _ -> assert false + in + let () = match t324_B, t_orig324_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t324_B.float_u0"; + | _ -> assert false + in + let () = match t325_A, t_orig325_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t325_A.0"; + | _ -> assert false + in + let () = match t325_B, t_orig325_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t325_B.0"; + | _ -> assert false + in + let () = match t325_C, t_orig325_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t325_C.0"; + | _ -> assert false + in + let () = match t326_A, t_orig326_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t326_A.float_u0"; + | _ -> assert false + in + let () = match t326_B, t_orig326_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t326_B.0"; + | _ -> assert false + in + let () = match t327_A, t_orig327_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t327_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t327_A.1"; + + in + let () = match t328_A, t_orig328_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t328_A.0"; + | _ -> assert false + in + let () = match t328_B, t_orig328_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t328_B.0"; + | _ -> assert false + in + let () = match t328_C, t_orig328_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t328_C.float_u0"; + | _ -> assert false + in + let () = match t329_A, t_orig329_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t329_A.float_u0"; + | _ -> assert false + in + let () = match t329_B, t_orig329_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t329_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t329_B.1"; + | _ -> assert false + in + let () = match t330_A, t_orig330_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t330_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t330_A.1"; + | _ -> assert false + in + let () = match t330_B, t_orig330_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t330_B.float_u0"; + | _ -> assert false + in + let () = match t330_C, t_orig330_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t330_C.0"; + | _ -> assert false + in + let () = match t331_A, t_orig331_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t331_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t331_A.float_u1"; + | _ -> assert false + in + let () = match t331_B, t_orig331_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t331_B.0"; + | _ -> assert false + in + let () = match t331_C, t_orig331_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t331_C.0"; + | _ -> assert false + in + let () = match t331_D, t_orig331_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t331_D.0"; + | _ -> assert false + in + let () = match t332_A, t_orig332_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t332_A.0"; + | _ -> assert false + in + let () = match t332_B, t_orig332_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t332_B.float_u0"; + | _ -> assert false + in + let () = match t333_A, t_orig333_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t333_A.float_u0"; + | _ -> assert false + in + let () = match t333_B, t_orig333_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t333_B.0"; + | _ -> assert false + in + let () = match t333_C, t_orig333_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t333_C.0"; + | _ -> assert false + in + let () = match t334_A, t_orig334_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t334_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t334_A.1"; + | _ -> assert false + in + let () = match t334_B, t_orig334_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t334_B.0"; + | _ -> assert false + in + let () = match t335_A, t_orig335_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t335_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t335_A.float_u1"; + + in + let () = match t336_A, t_orig336_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t336_A.0"; + | _ -> assert false + in + let () = match t336_B, t_orig336_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t336_B.float_u0"; + | _ -> assert false + in + let () = match t336_C, t_orig336_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t336_C.0"; + | _ -> assert false + in + let () = match t336_D, t_orig336_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t336_D.0"; + | _ -> assert false + in + let () = match t337_A, t_orig337_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t337_A.float_u0"; + | _ -> assert false + in + let () = match t337_B, t_orig337_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t337_B.0"; + | _ -> assert false + in + let () = match t337_C, t_orig337_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t337_C.float_u0"; + | _ -> assert false + in + let () = match t338_A, t_orig338_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t338_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t338_A.1"; + | _ -> assert false + in + let () = match t338_B, t_orig338_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t338_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t338_B.1"; + | _ -> assert false + in + let () = match t339_A, t_orig339_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t339_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t339_A.float_u1"; + | _ -> assert false + in + let () = match t339_B, t_orig339_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t339_B.float_u0"; + | _ -> assert false + in + let () = match t339_C, t_orig339_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t339_C.0"; + | _ -> assert false + in + let () = match t340_A, t_orig340_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t340_A.0"; + | _ -> assert false + in + let () = match t340_B, t_orig340_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t340_B.0"; + | _ -> assert false + in + let () = match t340_C, t_orig340_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t340_C.0"; + | _ -> assert false + in + let () = match t340_D, t_orig340_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t340_D.0"; + | _ -> assert false + in + let () = match t341_A, t_orig341_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t341_A.float_u0"; + | _ -> assert false + in + let () = match t341_B, t_orig341_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t341_B.float_u0"; + | _ -> assert false + in + let () = match t342_A, t_orig342_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t342_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t342_A.1"; + | _ -> assert false + in + let () = match t342_B, t_orig342_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t342_B.0"; + | _ -> assert false + in + let () = match t342_C, t_orig342_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t342_C.0"; + | _ -> assert false + in + let () = match t343_A, t_orig343_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t343_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t343_A.float_u1"; + | _ -> assert false + in + let () = match t343_B, t_orig343_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t343_B.0"; + | _ -> assert false + in + let () = match t344_A, t_orig344_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t344_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t344_A.1"; + + in + let () = match t345_A, t_orig345_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t345_A.0"; + | _ -> assert false + in + let () = match t345_B, t_orig345_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t345_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t345_B.1"; + | _ -> assert false + in + let () = match t345_C, t_orig345_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t345_C.0"; + | _ -> assert false + in + let () = match t346_A, t_orig346_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t346_A.float_u0"; + | _ -> assert false + in + let () = match t346_B, t_orig346_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t346_B.float_u0"; + | _ -> assert false + in + let () = match t346_C, t_orig346_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t346_C.0"; + | _ -> assert false + in + let () = match t346_D, t_orig346_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t346_D.0"; + | _ -> assert false + in + let () = match t347_A, t_orig347_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t347_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t347_A.1"; + | _ -> assert false + in + let () = match t347_B, t_orig347_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t347_B.0"; + | _ -> assert false + in + let () = match t347_C, t_orig347_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t347_C.float_u0"; + | _ -> assert false + in + let () = match t348_A, t_orig348_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t348_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t348_A.float_u1"; + | _ -> assert false + in + let () = match t348_B, t_orig348_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t348_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t348_B.1"; + | _ -> assert false + in + let () = match t349_A, t_orig349_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t349_A.0"; + | _ -> assert false + in + let () = match t349_B, t_orig349_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t349_B.float_u0"; + | _ -> assert false + in + let () = match t349_C, t_orig349_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t349_C.0"; + | _ -> assert false + in + let () = match t350_A, t_orig350_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t350_A.float_u0"; + | _ -> assert false + in + let () = match t350_B, t_orig350_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t350_B.0"; + | _ -> assert false + in + let () = match t350_C, t_orig350_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t350_C.0"; + | _ -> assert false + in + let () = match t350_D, t_orig350_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t350_D.0"; + | _ -> assert false + in + let () = match t351_A, t_orig351_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t351_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t351_A.1"; + | _ -> assert false + in + let () = match t351_B, t_orig351_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t351_B.float_u0"; + | _ -> assert false + in + let () = match t352_A, t_orig352_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t352_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t352_A.float_u1"; + | _ -> assert false + in + let () = match t352_B, t_orig352_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t352_B.0"; + | _ -> assert false + in + let () = match t352_C, t_orig352_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t352_C.0"; + | _ -> assert false + in + let () = match t353_A, t_orig353_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t353_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t353_A.1"; + | _ -> assert false + in + let () = match t353_B, t_orig353_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t353_B.0"; + | _ -> assert false + in + let () = match t354_A, t_orig354_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t354_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t354_A.float_u1"; + + in + let () = match t355_A, t_orig355_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t355_A.0"; + | _ -> assert false + in + let () = match t355_B, t_orig355_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t355_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t355_B.float_u1"; + | _ -> assert false + in + let () = match t356_A, t_orig356_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t356_A.float_u0"; + | _ -> assert false + in + let () = match t356_B, t_orig356_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t356_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t356_B.1"; + | _ -> assert false + in + let () = match t356_C, t_orig356_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t356_C.0"; + | _ -> assert false + in + let () = match t357_A, t_orig357_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t357_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t357_A.1"; + | _ -> assert false + in + let () = match t357_B, t_orig357_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t357_B.float_u0"; + | _ -> assert false + in + let () = match t357_C, t_orig357_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t357_C.0"; + | _ -> assert false + in + let () = match t357_D, t_orig357_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t357_D.0"; + | _ -> assert false + in + let () = match t358_A, t_orig358_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t358_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t358_A.float_u1"; + | _ -> assert false + in + let () = match t358_B, t_orig358_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t358_B.0"; + | _ -> assert false + in + let () = match t358_C, t_orig358_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t358_C.float_u0"; + | _ -> assert false + in + let () = match t359_A, t_orig359_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t359_A.0"; + | _ -> assert false + in + let () = match t359_B, t_orig359_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t359_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t359_B.1"; + | _ -> assert false + in + let () = match t360_A, t_orig360_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t360_A.float_u0"; + | _ -> assert false + in + let () = match t360_B, t_orig360_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t360_B.float_u0"; + | _ -> assert false + in + let () = match t360_C, t_orig360_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t360_C.0"; + | _ -> assert false + in + let () = match t361_A, t_orig361_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t361_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t361_A.1"; + | _ -> assert false + in + let () = match t361_B, t_orig361_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t361_B.0"; + | _ -> assert false + in + let () = match t361_C, t_orig361_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t361_C.0"; + | _ -> assert false + in + let () = match t361_D, t_orig361_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t361_D.0"; + | _ -> assert false + in + let () = match t362_A, t_orig362_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t362_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t362_A.float_u1"; + | _ -> assert false + in + let () = match t362_B, t_orig362_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t362_B.float_u0"; + | _ -> assert false + in + let () = match t363_A, t_orig363_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t363_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t363_A.1"; + | _ -> assert false + in + let () = match t363_B, t_orig363_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t363_B.0"; + | _ -> assert false + in + let () = match t363_C, t_orig363_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t363_C.0"; + | _ -> assert false + in + let () = match t364_A, t_orig364_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t364_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t364_A.float_u1"; + | _ -> assert false + in + let () = match t364_B, t_orig364_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t364_B.0"; + | _ -> assert false + in + let () = match t365_A, t_orig365_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t365_A.0"; + + in + let () = match t366_A, t_orig366_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t366_A.0"; + | _ -> assert false + in + let () = match t366_B, t_orig366_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t366_B.0"; + | _ -> assert false + in + let () = match t366_C, t_orig366_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t366_C.0"; + | _ -> assert false + in + let () = match t366_D, t_orig366_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t366_D.0"; + | _ -> assert false + in + let () = match t366_E, t_orig366_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t366_E.0"; + | _ -> assert false + in + let () = match t367_A, t_orig367_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t367_A.float_u0"; + | _ -> assert false + in + let () = match t367_B, t_orig367_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t367_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t367_B.float_u1"; + | _ -> assert false + in + let () = match t368_A, t_orig368_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t368_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t368_A.1"; + | _ -> assert false + in + let () = match t368_B, t_orig368_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t368_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t368_B.1"; + | _ -> assert false + in + let () = match t368_C, t_orig368_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t368_C.0"; + | _ -> assert false + in + let () = match t369_A, t_orig369_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t369_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t369_A.float_u1"; + | _ -> assert false + in + let () = match t369_B, t_orig369_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t369_B.float_u0"; + | _ -> assert false + in + let () = match t369_C, t_orig369_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t369_C.0"; + | _ -> assert false + in + let () = match t369_D, t_orig369_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t369_D.0"; + | _ -> assert false + in + let () = match t370_A, t_orig370_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t370_A.0"; + | _ -> assert false + in + let () = match t370_B, t_orig370_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t370_B.0"; + | _ -> assert false + in + let () = match t370_C, t_orig370_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t370_C.float_u0"; + | _ -> assert false + in + let () = match t371_A, t_orig371_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t371_A.float_u0"; + | _ -> assert false + in + let () = match t371_B, t_orig371_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t371_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t371_B.1"; + | _ -> assert false + in + let () = match t372_A, t_orig372_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t372_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t372_A.1"; + | _ -> assert false + in + let () = match t372_B, t_orig372_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t372_B.float_u0"; + | _ -> assert false + in + let () = match t372_C, t_orig372_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t372_C.0"; + | _ -> assert false + in + let () = match t373_A, t_orig373_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t373_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t373_A.float_u1"; + | _ -> assert false + in + let () = match t373_B, t_orig373_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t373_B.0"; + | _ -> assert false + in + let () = match t373_C, t_orig373_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t373_C.0"; + | _ -> assert false + in + let () = match t373_D, t_orig373_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t373_D.0"; + | _ -> assert false + in + let () = match t374_A, t_orig374_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t374_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t374_A.1"; + | _ -> assert false + in + let () = match t374_B, t_orig374_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t374_B.float_u0"; + | _ -> assert false + in + let () = match t375_A, t_orig375_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t375_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t375_A.float_u1"; + | _ -> assert false + in + let () = match t375_B, t_orig375_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t375_B.0"; + | _ -> assert false + in + let () = match t375_C, t_orig375_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t375_C.0"; + | _ -> assert false + in + let () = match t376_A, t_orig376_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t376_A.0"; + | _ -> assert false + in + let () = match t376_B, t_orig376_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t376_B.0"; + | _ -> assert false + in + let () = match t377_A, t_orig377_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t377_A.float32_u0"; + + in + let () = match t378_A, t_orig378_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t378_A.0"; + | _ -> assert false + in + let () = match t378_B, t_orig378_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t378_B.float_u0"; + | _ -> assert false + in + let () = match t378_C, t_orig378_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t378_C.float_u0"; + | _ -> assert false + in + let () = match t379_A, t_orig379_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t379_A.float_u0"; + | _ -> assert false + in + let () = match t379_B, t_orig379_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t379_B.0"; + | _ -> assert false + in + let () = match t379_C, t_orig379_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t379_C.0"; + | _ -> assert false + in + let () = match t379_D, t_orig379_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t379_D.0"; + | _ -> assert false + in + let () = match t379_E, t_orig379_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t379_E.0"; + | _ -> assert false + in + let () = match t380_A, t_orig380_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t380_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t380_A.1"; + | _ -> assert false + in + let () = match t380_B, t_orig380_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t380_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t380_B.float_u1"; + | _ -> assert false + in + let () = match t381_A, t_orig381_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t381_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t381_A.float_u1"; + | _ -> assert false + in + let () = match t381_B, t_orig381_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t381_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t381_B.1"; + | _ -> assert false + in + let () = match t381_C, t_orig381_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t381_C.0"; + | _ -> assert false + in + let () = match t382_A, t_orig382_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t382_A.0"; + | _ -> assert false + in + let () = match t382_B, t_orig382_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t382_B.float_u0"; + | _ -> assert false + in + let () = match t382_C, t_orig382_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t382_C.0"; + | _ -> assert false + in + let () = match t382_D, t_orig382_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t382_D.0"; + | _ -> assert false + in + let () = match t383_A, t_orig383_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t383_A.float_u0"; + | _ -> assert false + in + let () = match t383_B, t_orig383_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t383_B.0"; + | _ -> assert false + in + let () = match t383_C, t_orig383_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t383_C.float_u0"; + | _ -> assert false + in + let () = match t384_A, t_orig384_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t384_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t384_A.1"; + | _ -> assert false + in + let () = match t384_B, t_orig384_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t384_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t384_B.1"; + | _ -> assert false + in + let () = match t385_A, t_orig385_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t385_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t385_A.float_u1"; + | _ -> assert false + in + let () = match t385_B, t_orig385_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t385_B.float_u0"; + | _ -> assert false + in + let () = match t385_C, t_orig385_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t385_C.0"; + | _ -> assert false + in + let () = match t386_A, t_orig386_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t386_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t386_A.1"; + | _ -> assert false + in + let () = match t386_B, t_orig386_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t386_B.0"; + | _ -> assert false + in + let () = match t386_C, t_orig386_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t386_C.0"; + | _ -> assert false + in + let () = match t386_D, t_orig386_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t386_D.0"; + | _ -> assert false + in + let () = match t387_A, t_orig387_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t387_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t387_A.float_u1"; + | _ -> assert false + in + let () = match t387_B, t_orig387_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t387_B.float_u0"; + | _ -> assert false + in + let () = match t388_A, t_orig388_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t388_A.0"; + | _ -> assert false + in + let () = match t388_B, t_orig388_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t388_B.0"; + | _ -> assert false + in + let () = match t388_C, t_orig388_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t388_C.0"; + | _ -> assert false + in + let () = match t389_A, t_orig389_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t389_A.float32_u0"; + | _ -> assert false + in + let () = match t389_B, t_orig389_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t389_B.0"; + | _ -> assert false + in + let () = match t390_A, t_orig390_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t390_A.0"; +check_string a1 b1 ~message:"t390_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t390_A.2"; + + in + let () = match t391_A, t_orig391_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t391_A.0"; + | _ -> assert false + in + let () = match t391_B, t_orig391_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t391_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t391_B.1"; + | _ -> assert false + in + let () = match t391_C, t_orig391_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t391_C.0"; + | _ -> assert false + in + let () = match t391_D, t_orig391_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t391_D.0"; + | _ -> assert false + in + let () = match t392_A, t_orig392_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t392_A.float_u0"; + | _ -> assert false + in + let () = match t392_B, t_orig392_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t392_B.float_u0"; + | _ -> assert false + in + let () = match t392_C, t_orig392_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t392_C.float_u0"; + | _ -> assert false + in + let () = match t393_A, t_orig393_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t393_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t393_A.1"; + | _ -> assert false + in + let () = match t393_B, t_orig393_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t393_B.0"; + | _ -> assert false + in + let () = match t393_C, t_orig393_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t393_C.0"; + | _ -> assert false + in + let () = match t393_D, t_orig393_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t393_D.0"; + | _ -> assert false + in + let () = match t393_E, t_orig393_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t393_E.0"; + | _ -> assert false + in + let () = match t394_A, t_orig394_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t394_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t394_A.float_u1"; + | _ -> assert false + in + let () = match t394_B, t_orig394_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t394_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t394_B.float_u1"; + | _ -> assert false + in + let () = match t395_A, t_orig395_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t395_A.0"; + | _ -> assert false + in + let () = match t395_B, t_orig395_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t395_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t395_B.1"; + | _ -> assert false + in + let () = match t395_C, t_orig395_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t395_C.0"; + | _ -> assert false + in + let () = match t396_A, t_orig396_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t396_A.float_u0"; + | _ -> assert false + in + let () = match t396_B, t_orig396_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t396_B.float_u0"; + | _ -> assert false + in + let () = match t396_C, t_orig396_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t396_C.0"; + | _ -> assert false + in + let () = match t396_D, t_orig396_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t396_D.0"; + | _ -> assert false + in + let () = match t397_A, t_orig397_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t397_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t397_A.1"; + | _ -> assert false + in + let () = match t397_B, t_orig397_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t397_B.0"; + | _ -> assert false + in + let () = match t397_C, t_orig397_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t397_C.float_u0"; + | _ -> assert false + in + let () = match t398_A, t_orig398_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t398_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t398_A.float_u1"; + | _ -> assert false + in + let () = match t398_B, t_orig398_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t398_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t398_B.1"; + | _ -> assert false + in + let () = match t399_A, t_orig399_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t399_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t399_A.1"; + | _ -> assert false + in + let () = match t399_B, t_orig399_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t399_B.float_u0"; + | _ -> assert false + in + let () = match t399_C, t_orig399_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t399_C.0"; + | _ -> assert false + in + let () = match t400_A, t_orig400_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t400_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t400_A.float_u1"; + | _ -> assert false + in + let () = match t400_B, t_orig400_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t400_B.0"; + | _ -> assert false + in + let () = match t400_C, t_orig400_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t400_C.0"; + | _ -> assert false + in + let () = match t400_D, t_orig400_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t400_D.0"; + | _ -> assert false + in + let () = match t401_A, t_orig401_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t401_A.0"; + | _ -> assert false + in + let () = match t401_B, t_orig401_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t401_B.float_u0"; + | _ -> assert false + in + let () = match t402_A, t_orig402_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t402_A.float32_u0"; + | _ -> assert false + in + let () = match t402_B, t_orig402_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t402_B.0"; + | _ -> assert false + in + let () = match t402_C, t_orig402_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t402_C.0"; + | _ -> assert false + in + let () = match t403_A, t_orig403_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t403_A.0"; +check_string a1 b1 ~message:"t403_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t403_A.2"; + | _ -> assert false + in + let () = match t403_B, t_orig403_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t403_B.0"; + | _ -> assert false + in + let () = match t404_A, t_orig404_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t404_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t404_A.float_u1"; + + in + let () = match t405_A, t_orig405_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t405_A.0"; + | _ -> assert false + in + let () = match t405_B, t_orig405_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t405_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t405_B.float_u1"; + | _ -> assert false + in + let () = match t405_C, t_orig405_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t405_C.0"; + | _ -> assert false + in + let () = match t406_A, t_orig406_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t406_A.float_u0"; + | _ -> assert false + in + let () = match t406_B, t_orig406_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t406_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t406_B.1"; + | _ -> assert false + in + let () = match t406_C, t_orig406_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t406_C.0"; + | _ -> assert false + in + let () = match t406_D, t_orig406_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t406_D.0"; + | _ -> assert false + in + let () = match t407_A, t_orig407_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t407_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t407_A.1"; + | _ -> assert false + in + let () = match t407_B, t_orig407_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t407_B.float_u0"; + | _ -> assert false + in + let () = match t407_C, t_orig407_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t407_C.float_u0"; + | _ -> assert false + in + let () = match t408_A, t_orig408_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t408_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t408_A.float_u1"; + | _ -> assert false + in + let () = match t408_B, t_orig408_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t408_B.0"; + | _ -> assert false + in + let () = match t408_C, t_orig408_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t408_C.0"; + | _ -> assert false + in + let () = match t408_D, t_orig408_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t408_D.0"; + | _ -> assert false + in + let () = match t408_E, t_orig408_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t408_E.0"; + | _ -> assert false + in + let () = match t409_A, t_orig409_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t409_A.0"; + | _ -> assert false + in + let () = match t409_B, t_orig409_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t409_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t409_B.float_u1"; + | _ -> assert false + in + let () = match t410_A, t_orig410_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t410_A.float_u0"; + | _ -> assert false + in + let () = match t410_B, t_orig410_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t410_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t410_B.1"; + | _ -> assert false + in + let () = match t410_C, t_orig410_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t410_C.0"; + | _ -> assert false + in + let () = match t411_A, t_orig411_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t411_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t411_A.1"; + | _ -> assert false + in + let () = match t411_B, t_orig411_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t411_B.float_u0"; + | _ -> assert false + in + let () = match t411_C, t_orig411_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t411_C.0"; + | _ -> assert false + in + let () = match t411_D, t_orig411_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t411_D.0"; + | _ -> assert false + in + let () = match t412_A, t_orig412_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t412_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t412_A.float_u1"; + | _ -> assert false + in + let () = match t412_B, t_orig412_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t412_B.0"; + | _ -> assert false + in + let () = match t412_C, t_orig412_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t412_C.float_u0"; + | _ -> assert false + in + let () = match t413_A, t_orig413_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t413_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t413_A.1"; + | _ -> assert false + in + let () = match t413_B, t_orig413_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t413_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t413_B.1"; + | _ -> assert false + in + let () = match t414_A, t_orig414_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t414_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t414_A.float_u1"; + | _ -> assert false + in + let () = match t414_B, t_orig414_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t414_B.float_u0"; + | _ -> assert false + in + let () = match t414_C, t_orig414_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t414_C.0"; + | _ -> assert false + in + let () = match t415_A, t_orig415_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t415_A.0"; + | _ -> assert false + in + let () = match t415_B, t_orig415_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t415_B.0"; + | _ -> assert false + in + let () = match t415_C, t_orig415_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t415_C.0"; + | _ -> assert false + in + let () = match t415_D, t_orig415_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t415_D.0"; + | _ -> assert false + in + let () = match t416_A, t_orig416_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t416_A.float32_u0"; + | _ -> assert false + in + let () = match t416_B, t_orig416_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t416_B.float_u0"; + | _ -> assert false + in + let () = match t417_A, t_orig417_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t417_A.0"; +check_string a1 b1 ~message:"t417_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t417_A.2"; + | _ -> assert false + in + let () = match t417_B, t_orig417_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t417_B.0"; + | _ -> assert false + in + let () = match t417_C, t_orig417_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t417_C.0"; + | _ -> assert false + in + let () = match t418_A, t_orig418_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t418_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t418_A.float_u1"; + | _ -> assert false + in + let () = match t418_B, t_orig418_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t418_B.0"; + | _ -> assert false + in + let () = match t419_A, t_orig419_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t419_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t419_A.1"; + + in + let () = match t420_A, t_orig420_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t420_A.0"; + | _ -> assert false + in + let () = match t420_B, t_orig420_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t420_B.0"; + | _ -> assert false + in + let () = match t421_A, t_orig421_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t421_A.float_u0"; + | _ -> assert false + in + let () = match t421_B, t_orig421_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t421_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t421_B.float_u1"; + | _ -> assert false + in + let () = match t421_C, t_orig421_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t421_C.0"; + | _ -> assert false + in + let () = match t422_A, t_orig422_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t422_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t422_A.1"; + | _ -> assert false + in + let () = match t422_B, t_orig422_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t422_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t422_B.1"; + | _ -> assert false + in + let () = match t422_C, t_orig422_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t422_C.0"; + | _ -> assert false + in + let () = match t422_D, t_orig422_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t422_D.0"; + | _ -> assert false + in + let () = match t423_A, t_orig423_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t423_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t423_A.float_u1"; + | _ -> assert false + in + let () = match t423_B, t_orig423_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t423_B.float_u0"; + | _ -> assert false + in + let () = match t423_C, t_orig423_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t423_C.float_u0"; + | _ -> assert false + in + let () = match t424_A, t_orig424_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t424_A.0"; + | _ -> assert false + in + let () = match t424_B, t_orig424_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t424_B.0"; + | _ -> assert false + in + let () = match t424_C, t_orig424_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t424_C.0"; + | _ -> assert false + in + let () = match t424_D, t_orig424_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t424_D.0"; + | _ -> assert false + in + let () = match t424_E, t_orig424_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t424_E.0"; + | _ -> assert false + in + let () = match t425_A, t_orig425_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t425_A.float_u0"; + | _ -> assert false + in + let () = match t425_B, t_orig425_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t425_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t425_B.float_u1"; + | _ -> assert false + in + let () = match t426_A, t_orig426_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t426_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t426_A.1"; + | _ -> assert false + in + let () = match t426_B, t_orig426_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t426_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t426_B.1"; + | _ -> assert false + in + let () = match t426_C, t_orig426_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t426_C.0"; + | _ -> assert false + in + let () = match t427_A, t_orig427_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t427_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t427_A.float_u1"; + | _ -> assert false + in + let () = match t427_B, t_orig427_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t427_B.float_u0"; + | _ -> assert false + in + let () = match t427_C, t_orig427_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t427_C.0"; + | _ -> assert false + in + let () = match t427_D, t_orig427_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t427_D.0"; + | _ -> assert false + in + let () = match t428_A, t_orig428_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t428_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t428_A.1"; + | _ -> assert false + in + let () = match t428_B, t_orig428_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t428_B.0"; + | _ -> assert false + in + let () = match t428_C, t_orig428_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t428_C.float_u0"; + | _ -> assert false + in + let () = match t429_A, t_orig429_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t429_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t429_A.float_u1"; + | _ -> assert false + in + let () = match t429_B, t_orig429_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t429_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t429_B.1"; + | _ -> assert false + in + let () = match t430_A, t_orig430_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t430_A.0"; + | _ -> assert false + in + let () = match t430_B, t_orig430_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t430_B.float_u0"; + | _ -> assert false + in + let () = match t430_C, t_orig430_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t430_C.0"; + | _ -> assert false + in + let () = match t431_A, t_orig431_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t431_A.float32_u0"; + | _ -> assert false + in + let () = match t431_B, t_orig431_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t431_B.0"; + | _ -> assert false + in + let () = match t431_C, t_orig431_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t431_C.0"; + | _ -> assert false + in + let () = match t431_D, t_orig431_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t431_D.0"; + | _ -> assert false + in + let () = match t432_A, t_orig432_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t432_A.0"; +check_string a1 b1 ~message:"t432_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t432_A.2"; + | _ -> assert false + in + let () = match t432_B, t_orig432_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t432_B.float_u0"; + | _ -> assert false + in + let () = match t433_A, t_orig433_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t433_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t433_A.float_u1"; + | _ -> assert false + in + let () = match t433_B, t_orig433_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t433_B.0"; + | _ -> assert false + in + let () = match t433_C, t_orig433_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t433_C.0"; + | _ -> assert false + in + let () = match t434_A, t_orig434_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t434_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t434_A.1"; + | _ -> assert false + in + let () = match t434_B, t_orig434_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t434_B.0"; + | _ -> assert false + in + let () = match t435_A, t_orig435_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t435_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t435_A.float_u1"; + + in + let () = match t436_A, t_orig436_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t436_A.0"; + | _ -> assert false + in + let () = match t436_B, t_orig436_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t436_B.0"; + | _ -> assert false + in + let () = match t436_C, t_orig436_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t436_C.float_u0"; + | _ -> assert false + in + let () = match t436_D, t_orig436_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t436_D.0"; + | _ -> assert false + in + let () = match t437_A, t_orig437_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t437_A.float_u0"; + | _ -> assert false + in + let () = match t437_B, t_orig437_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t437_B.0"; + | _ -> assert false + in + let () = match t438_A, t_orig438_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t438_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t438_A.1"; + | _ -> assert false + in + let () = match t438_B, t_orig438_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t438_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t438_B.float_u1"; + | _ -> assert false + in + let () = match t438_C, t_orig438_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t438_C.0"; + | _ -> assert false + in + let () = match t439_A, t_orig439_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t439_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t439_A.float_u1"; + | _ -> assert false + in + let () = match t439_B, t_orig439_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t439_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t439_B.1"; + | _ -> assert false + in + let () = match t439_C, t_orig439_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t439_C.0"; + | _ -> assert false + in + let () = match t439_D, t_orig439_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t439_D.0"; + | _ -> assert false + in + let () = match t440_A, t_orig440_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t440_A.0"; + | _ -> assert false + in + let () = match t440_B, t_orig440_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t440_B.float_u0"; + | _ -> assert false + in + let () = match t440_C, t_orig440_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t440_C.float_u0"; + | _ -> assert false + in + let () = match t441_A, t_orig441_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t441_A.float_u0"; + | _ -> assert false + in + let () = match t441_B, t_orig441_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t441_B.0"; + | _ -> assert false + in + let () = match t441_C, t_orig441_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t441_C.0"; + | _ -> assert false + in + let () = match t441_D, t_orig441_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t441_D.0"; + | _ -> assert false + in + let () = match t441_E, t_orig441_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t441_E.0"; + | _ -> assert false + in + let () = match t442_A, t_orig442_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t442_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t442_A.1"; + | _ -> assert false + in + let () = match t442_B, t_orig442_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t442_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t442_B.float_u1"; + | _ -> assert false + in + let () = match t443_A, t_orig443_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t443_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t443_A.float_u1"; + | _ -> assert false + in + let () = match t443_B, t_orig443_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t443_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t443_B.1"; + | _ -> assert false + in + let () = match t443_C, t_orig443_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t443_C.0"; + | _ -> assert false + in + let () = match t444_A, t_orig444_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t444_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t444_A.1"; + | _ -> assert false + in + let () = match t444_B, t_orig444_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t444_B.float_u0"; + | _ -> assert false + in + let () = match t444_C, t_orig444_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t444_C.0"; + | _ -> assert false + in + let () = match t444_D, t_orig444_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t444_D.0"; + | _ -> assert false + in + let () = match t445_A, t_orig445_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t445_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t445_A.float_u1"; + | _ -> assert false + in + let () = match t445_B, t_orig445_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t445_B.0"; + | _ -> assert false + in + let () = match t445_C, t_orig445_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t445_C.float_u0"; + | _ -> assert false + in + let () = match t446_A, t_orig446_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t446_A.0"; + | _ -> assert false + in + let () = match t446_B, t_orig446_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t446_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t446_B.1"; + | _ -> assert false + in + let () = match t447_A, t_orig447_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t447_A.float32_u0"; + | _ -> assert false + in + let () = match t447_B, t_orig447_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t447_B.float_u0"; + | _ -> assert false + in + let () = match t447_C, t_orig447_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t447_C.0"; + | _ -> assert false + in + let () = match t448_A, t_orig448_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t448_A.0"; +check_string a1 b1 ~message:"t448_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t448_A.2"; + | _ -> assert false + in + let () = match t448_B, t_orig448_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t448_B.0"; + | _ -> assert false + in + let () = match t448_C, t_orig448_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t448_C.0"; + | _ -> assert false + in + let () = match t448_D, t_orig448_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t448_D.0"; + | _ -> assert false + in + let () = match t449_A, t_orig449_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t449_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t449_A.float_u1"; + | _ -> assert false + in + let () = match t449_B, t_orig449_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t449_B.float_u0"; + | _ -> assert false + in + let () = match t450_A, t_orig450_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t450_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t450_A.1"; + | _ -> assert false + in + let () = match t450_B, t_orig450_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t450_B.0"; + | _ -> assert false + in + let () = match t450_C, t_orig450_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t450_C.0"; + | _ -> assert false + in + let () = match t451_A, t_orig451_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t451_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t451_A.float_u1"; + | _ -> assert false + in + let () = match t451_B, t_orig451_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t451_B.0"; + | _ -> assert false + in + let () = match t452_A, t_orig452_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t452_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t452_A.1"; + + in + let () = match t453_A, t_orig453_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t453_A.0"; + | _ -> assert false + in + let () = match t453_B, t_orig453_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t453_B.float_u0"; + | _ -> assert false + in + let () = match t453_C, t_orig453_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t453_C.0"; + | _ -> assert false + in + let () = match t453_D, t_orig453_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t453_D.0"; + | _ -> assert false + in + let () = match t453_E, t_orig453_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t453_E.0"; + | _ -> assert false + in + let () = match t454_A, t_orig454_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t454_A.float_u0"; + | _ -> assert false + in + let () = match t454_B, t_orig454_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t454_B.0"; + | _ -> assert false + in + let () = match t454_C, t_orig454_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t454_C.float_u0"; + | _ -> assert false + in + let () = match t454_D, t_orig454_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t454_D.0"; + | _ -> assert false + in + let () = match t455_A, t_orig455_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t455_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t455_A.1"; + | _ -> assert false + in + let () = match t455_B, t_orig455_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t455_B.0"; + | _ -> assert false + in + let () = match t456_A, t_orig456_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t456_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t456_A.float_u1"; + | _ -> assert false + in + let () = match t456_B, t_orig456_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t456_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t456_B.float_u1"; + | _ -> assert false + in + let () = match t456_C, t_orig456_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t456_C.0"; + | _ -> assert false + in + let () = match t457_A, t_orig457_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t457_A.0"; + | _ -> assert false + in + let () = match t457_B, t_orig457_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t457_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t457_B.1"; + | _ -> assert false + in + let () = match t457_C, t_orig457_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t457_C.0"; + | _ -> assert false + in + let () = match t457_D, t_orig457_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t457_D.0"; + | _ -> assert false + in + let () = match t458_A, t_orig458_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t458_A.float_u0"; + | _ -> assert false + in + let () = match t458_B, t_orig458_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t458_B.float_u0"; + | _ -> assert false + in + let () = match t458_C, t_orig458_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t458_C.float_u0"; + | _ -> assert false + in + let () = match t459_A, t_orig459_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t459_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t459_A.1"; + | _ -> assert false + in + let () = match t459_B, t_orig459_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t459_B.0"; + | _ -> assert false + in + let () = match t459_C, t_orig459_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t459_C.0"; + | _ -> assert false + in + let () = match t459_D, t_orig459_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t459_D.0"; + | _ -> assert false + in + let () = match t459_E, t_orig459_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t459_E.0"; + | _ -> assert false + in + let () = match t460_A, t_orig460_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t460_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t460_A.float_u1"; + | _ -> assert false + in + let () = match t460_B, t_orig460_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t460_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t460_B.float_u1"; + | _ -> assert false + in + let () = match t461_A, t_orig461_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t461_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t461_A.1"; + | _ -> assert false + in + let () = match t461_B, t_orig461_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t461_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t461_B.1"; + | _ -> assert false + in + let () = match t461_C, t_orig461_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t461_C.0"; + | _ -> assert false + in + let () = match t462_A, t_orig462_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t462_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t462_A.float_u1"; + | _ -> assert false + in + let () = match t462_B, t_orig462_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t462_B.float_u0"; + | _ -> assert false + in + let () = match t462_C, t_orig462_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t462_C.0"; + | _ -> assert false + in + let () = match t462_D, t_orig462_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t462_D.0"; + | _ -> assert false + in + let () = match t463_A, t_orig463_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t463_A.0"; + | _ -> assert false + in + let () = match t463_B, t_orig463_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t463_B.0"; + | _ -> assert false + in + let () = match t463_C, t_orig463_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t463_C.float_u0"; + | _ -> assert false + in + let () = match t464_A, t_orig464_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t464_A.float32_u0"; + | _ -> assert false + in + let () = match t464_B, t_orig464_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t464_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t464_B.1"; + | _ -> assert false + in + let () = match t465_A, t_orig465_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t465_A.0"; +check_string a1 b1 ~message:"t465_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t465_A.2"; + | _ -> assert false + in + let () = match t465_B, t_orig465_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t465_B.float_u0"; + | _ -> assert false + in + let () = match t465_C, t_orig465_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t465_C.0"; + | _ -> assert false + in + let () = match t466_A, t_orig466_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t466_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t466_A.float_u1"; + | _ -> assert false + in + let () = match t466_B, t_orig466_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t466_B.0"; + | _ -> assert false + in + let () = match t466_C, t_orig466_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t466_C.0"; + | _ -> assert false + in + let () = match t466_D, t_orig466_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t466_D.0"; + | _ -> assert false + in + let () = match t467_A, t_orig467_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t467_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t467_A.1"; + | _ -> assert false + in + let () = match t467_B, t_orig467_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t467_B.float_u0"; + | _ -> assert false + in + let () = match t468_A, t_orig468_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t468_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t468_A.float_u1"; + | _ -> assert false + in + let () = match t468_B, t_orig468_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t468_B.0"; + | _ -> assert false + in + let () = match t468_C, t_orig468_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t468_C.0"; + | _ -> assert false + in + let () = match t469_A, t_orig469_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t469_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t469_A.1"; + | _ -> assert false + in + let () = match t469_B, t_orig469_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t469_B.0"; + | _ -> assert false + in + let () = match t470_A, t_orig470_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t470_A.str0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u1) (Stdlib_stable.Float32_u.to_float32 b.float32_u1) ~message:"t470_A.float32_u1"; + + in + let () = match t471_A, t_orig471_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t471_A.0"; + | _ -> assert false + in + let () = match t471_B, t_orig471_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t471_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t471_B.1"; + | _ -> assert false + in + let () = match t471_C, t_orig471_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t471_C.float_u0"; + | _ -> assert false + in + let () = match t472_A, t_orig472_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t472_A.float_u0"; + | _ -> assert false + in + let () = match t472_B, t_orig472_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t472_B.float_u0"; + | _ -> assert false + in + let () = match t472_C, t_orig472_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t472_C.0"; + | _ -> assert false + in + let () = match t472_D, t_orig472_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t472_D.0"; + | _ -> assert false + in + let () = match t472_E, t_orig472_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t472_E.0"; + | _ -> assert false + in + let () = match t473_A, t_orig473_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t473_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t473_A.1"; + | _ -> assert false + in + let () = match t473_B, t_orig473_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t473_B.0"; + | _ -> assert false + in + let () = match t473_C, t_orig473_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t473_C.float_u0"; + | _ -> assert false + in + let () = match t473_D, t_orig473_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t473_D.0"; + | _ -> assert false + in + let () = match t474_A, t_orig474_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t474_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t474_A.float_u1"; + | _ -> assert false + in + let () = match t474_B, t_orig474_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t474_B.0"; + | _ -> assert false + in + let () = match t475_A, t_orig475_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t475_A.0"; + | _ -> assert false + in + let () = match t475_B, t_orig475_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t475_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t475_B.float_u1"; + | _ -> assert false + in + let () = match t475_C, t_orig475_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t475_C.0"; + | _ -> assert false + in + let () = match t476_A, t_orig476_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t476_A.float_u0"; + | _ -> assert false + in + let () = match t476_B, t_orig476_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t476_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t476_B.1"; + | _ -> assert false + in + let () = match t476_C, t_orig476_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t476_C.0"; + | _ -> assert false + in + let () = match t476_D, t_orig476_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t476_D.0"; + | _ -> assert false + in + let () = match t477_A, t_orig477_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t477_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t477_A.1"; + | _ -> assert false + in + let () = match t477_B, t_orig477_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t477_B.float_u0"; + | _ -> assert false + in + let () = match t477_C, t_orig477_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t477_C.float_u0"; + | _ -> assert false + in + let () = match t478_A, t_orig478_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t478_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t478_A.float_u1"; + | _ -> assert false + in + let () = match t478_B, t_orig478_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t478_B.0"; + | _ -> assert false + in + let () = match t478_C, t_orig478_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t478_C.0"; + | _ -> assert false + in + let () = match t478_D, t_orig478_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t478_D.0"; + | _ -> assert false + in + let () = match t478_E, t_orig478_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t478_E.0"; + | _ -> assert false + in + let () = match t479_A, t_orig479_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t479_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t479_A.1"; + | _ -> assert false + in + let () = match t479_B, t_orig479_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t479_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t479_B.float_u1"; + | _ -> assert false + in + let () = match t480_A, t_orig480_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t480_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t480_A.float_u1"; + | _ -> assert false + in + let () = match t480_B, t_orig480_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t480_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t480_B.1"; + | _ -> assert false + in + let () = match t480_C, t_orig480_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t480_C.0"; + | _ -> assert false + in + let () = match t481_A, t_orig481_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t481_A.0"; + | _ -> assert false + in + let () = match t481_B, t_orig481_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t481_B.float_u0"; + | _ -> assert false + in + let () = match t481_C, t_orig481_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t481_C.0"; + | _ -> assert false + in + let () = match t481_D, t_orig481_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t481_D.0"; + | _ -> assert false + in + let () = match t482_A, t_orig482_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t482_A.float32_u0"; + | _ -> assert false + in + let () = match t482_B, t_orig482_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t482_B.0"; + | _ -> assert false + in + let () = match t482_C, t_orig482_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t482_C.float_u0"; + | _ -> assert false + in + let () = match t483_A, t_orig483_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t483_A.0"; +check_string a1 b1 ~message:"t483_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t483_A.2"; + | _ -> assert false + in + let () = match t483_B, t_orig483_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t483_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t483_B.1"; + | _ -> assert false + in + let () = match t484_A, t_orig484_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t484_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t484_A.float_u1"; + | _ -> assert false + in + let () = match t484_B, t_orig484_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t484_B.float_u0"; + | _ -> assert false + in + let () = match t484_C, t_orig484_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t484_C.0"; + | _ -> assert false + in + let () = match t485_A, t_orig485_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t485_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t485_A.1"; + | _ -> assert false + in + let () = match t485_B, t_orig485_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t485_B.0"; + | _ -> assert false + in + let () = match t485_C, t_orig485_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t485_C.0"; + | _ -> assert false + in + let () = match t485_D, t_orig485_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t485_D.0"; + | _ -> assert false + in + let () = match t486_A, t_orig486_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t486_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t486_A.float_u1"; + | _ -> assert false + in + let () = match t486_B, t_orig486_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t486_B.float_u0"; + | _ -> assert false + in + let () = match t487_A, t_orig487_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t487_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t487_A.1"; + | _ -> assert false + in + let () = match t487_B, t_orig487_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t487_B.0"; + | _ -> assert false + in + let () = match t487_C, t_orig487_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t487_C.0"; + | _ -> assert false + in + let () = match t488_A, t_orig488_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t488_A.str0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u1) (Stdlib_stable.Float32_u.to_float32 b.float32_u1) ~message:"t488_A.float32_u1"; + | _ -> assert false + in + let () = match t488_B, t_orig488_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t488_B.0"; + | _ -> assert false + in + let () = match t489_A, t_orig489_A with + | A (a0), A (b0) -> check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 a0) (Stdlib_upstream_compatible.Int64_u.to_int64 b0) ~message:"t489_A.0"; + + in + let () = match t490_A, t_orig490_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t490_A.0"; + | _ -> assert false + in + let () = match t490_B, t_orig490_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t490_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t490_B.float_u1"; + | _ -> assert false + in + let () = match t490_C, t_orig490_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t490_C.0"; + | _ -> assert false + in + let () = match t490_D, t_orig490_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t490_D.0"; + | _ -> assert false + in + let () = match t491_A, t_orig491_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t491_A.float_u0"; + | _ -> assert false + in + let () = match t491_B, t_orig491_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t491_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t491_B.1"; + | _ -> assert false + in + let () = match t491_C, t_orig491_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t491_C.float_u0"; + | _ -> assert false + in + let () = match t492_A, t_orig492_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t492_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t492_A.1"; + | _ -> assert false + in + let () = match t492_B, t_orig492_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t492_B.float_u0"; + | _ -> assert false + in + let () = match t492_C, t_orig492_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t492_C.0"; + | _ -> assert false + in + let () = match t492_D, t_orig492_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t492_D.0"; + | _ -> assert false + in + let () = match t492_E, t_orig492_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t492_E.0"; + | _ -> assert false + in + let () = match t493_A, t_orig493_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t493_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t493_A.float_u1"; + | _ -> assert false + in + let () = match t493_B, t_orig493_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t493_B.0"; + | _ -> assert false + in + let () = match t493_C, t_orig493_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t493_C.float_u0"; + | _ -> assert false + in + let () = match t493_D, t_orig493_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t493_D.0"; + | _ -> assert false + in + let () = match t494_A, t_orig494_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t494_A.0"; + | _ -> assert false + in + let () = match t494_B, t_orig494_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t494_B.0"; + | _ -> assert false + in + let () = match t495_A, t_orig495_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t495_A.float_u0"; + | _ -> assert false + in + let () = match t495_B, t_orig495_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t495_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t495_B.float_u1"; + | _ -> assert false + in + let () = match t495_C, t_orig495_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t495_C.0"; + | _ -> assert false + in + let () = match t496_A, t_orig496_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t496_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t496_A.1"; + | _ -> assert false + in + let () = match t496_B, t_orig496_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t496_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t496_B.1"; + | _ -> assert false + in + let () = match t496_C, t_orig496_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t496_C.0"; + | _ -> assert false + in + let () = match t496_D, t_orig496_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t496_D.0"; + | _ -> assert false + in + let () = match t497_A, t_orig497_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t497_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t497_A.float_u1"; + | _ -> assert false + in + let () = match t497_B, t_orig497_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t497_B.float_u0"; + | _ -> assert false + in + let () = match t497_C, t_orig497_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t497_C.float_u0"; + | _ -> assert false + in + let () = match t498_A, t_orig498_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t498_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t498_A.1"; + | _ -> assert false + in + let () = match t498_B, t_orig498_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t498_B.0"; + | _ -> assert false + in + let () = match t498_C, t_orig498_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t498_C.0"; + | _ -> assert false + in + let () = match t498_D, t_orig498_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t498_D.0"; + | _ -> assert false + in + let () = match t498_E, t_orig498_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t498_E.0"; + | _ -> assert false + in + let () = match t499_A, t_orig499_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t499_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t499_A.float_u1"; + | _ -> assert false + in + let () = match t499_B, t_orig499_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t499_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t499_B.float_u1"; + | _ -> assert false + in + let () = match t500_A, t_orig500_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t500_A.0"; + | _ -> assert false + in + let () = match t500_B, t_orig500_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t500_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t500_B.1"; + | _ -> assert false + in + let () = match t500_C, t_orig500_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t500_C.0"; + | _ -> assert false + in + let () = match t501_A, t_orig501_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t501_A.float32_u0"; + | _ -> assert false + in + let () = match t501_B, t_orig501_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t501_B.float_u0"; + | _ -> assert false + in + let () = match t501_C, t_orig501_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t501_C.0"; + | _ -> assert false + in + let () = match t501_D, t_orig501_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t501_D.0"; + | _ -> assert false + in + let () = match t502_A, t_orig502_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t502_A.0"; +check_string a1 b1 ~message:"t502_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t502_A.2"; + | _ -> assert false + in + let () = match t502_B, t_orig502_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t502_B.0"; + | _ -> assert false + in + let () = match t502_C, t_orig502_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t502_C.float_u0"; + | _ -> assert false + in + let () = match t503_A, t_orig503_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t503_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t503_A.float_u1"; + | _ -> assert false + in + let () = match t503_B, t_orig503_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t503_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t503_B.1"; + | _ -> assert false + in + let () = match t504_A, t_orig504_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t504_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t504_A.1"; + | _ -> assert false + in + let () = match t504_B, t_orig504_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t504_B.float_u0"; + | _ -> assert false + in + let () = match t504_C, t_orig504_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t504_C.0"; + | _ -> assert false + in + let () = match t505_A, t_orig505_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t505_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t505_A.float_u1"; + | _ -> assert false + in + let () = match t505_B, t_orig505_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t505_B.0"; + | _ -> assert false + in + let () = match t505_C, t_orig505_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t505_C.0"; + | _ -> assert false + in + let () = match t505_D, t_orig505_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t505_D.0"; + | _ -> assert false + in + let () = match t506_A, t_orig506_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t506_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t506_A.1"; + | _ -> assert false + in + let () = match t506_B, t_orig506_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t506_B.float_u0"; + | _ -> assert false + in + let () = match t507_A, t_orig507_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t507_A.str0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u1) (Stdlib_stable.Float32_u.to_float32 b.float32_u1) ~message:"t507_A.float32_u1"; + | _ -> assert false + in + let () = match t507_B, t_orig507_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t507_B.0"; + | _ -> assert false + in + let () = match t507_C, t_orig507_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t507_C.0"; + | _ -> assert false + in + let () = match t508_A, t_orig508_A with + | A (a0), A (b0) -> check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 a0) (Stdlib_upstream_compatible.Int64_u.to_int64 b0) ~message:"t508_A.0"; + | _ -> assert false + in + let () = match t508_B, t_orig508_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t508_B.0"; + | _ -> assert false + in + let () = match t509_A, t_orig509_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t509_A.float32_u0"; + + in + let () = match t510_A, t_orig510_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t510_A.0"; + | _ -> assert false + in + let () = match t510_B, t_orig510_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t510_B.0"; + | _ -> assert false + in + let () = match t510_C, t_orig510_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t510_C.0"; + | _ -> assert false + in + let () = match t511_A, t_orig511_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t511_A.float_u0"; + | _ -> assert false + in + let () = match t511_B, t_orig511_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t511_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t511_B.float_u1"; + | _ -> assert false + in + let () = match t511_C, t_orig511_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t511_C.0"; + | _ -> assert false + in + let () = match t511_D, t_orig511_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t511_D.0"; + | _ -> assert false + in + let () = match t512_A, t_orig512_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t512_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t512_A.1"; + | _ -> assert false + in + let () = match t512_B, t_orig512_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t512_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t512_B.1"; + | _ -> assert false + in + let () = match t512_C, t_orig512_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t512_C.float_u0"; + | _ -> assert false + in + let () = match t513_A, t_orig513_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t513_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t513_A.float_u1"; + | _ -> assert false + in + let () = match t513_B, t_orig513_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t513_B.float_u0"; + | _ -> assert false + in + let () = match t513_C, t_orig513_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t513_C.0"; + | _ -> assert false + in + let () = match t513_D, t_orig513_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t513_D.0"; + | _ -> assert false + in + let () = match t513_E, t_orig513_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t513_E.0"; + | _ -> assert false + in + let () = match t514_A, t_orig514_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t514_A.0"; + | _ -> assert false + in + let () = match t514_B, t_orig514_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t514_B.0"; + | _ -> assert false + in + let () = match t514_C, t_orig514_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t514_C.float_u0"; + | _ -> assert false + in + let () = match t514_D, t_orig514_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t514_D.0"; + | _ -> assert false + in + let () = match t515_A, t_orig515_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t515_A.float_u0"; + | _ -> assert false + in + let () = match t515_B, t_orig515_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t515_B.0"; + | _ -> assert false + in + let () = match t516_A, t_orig516_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t516_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t516_A.1"; + | _ -> assert false + in + let () = match t516_B, t_orig516_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t516_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t516_B.float_u1"; + | _ -> assert false + in + let () = match t516_C, t_orig516_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t516_C.0"; + | _ -> assert false + in + let () = match t517_A, t_orig517_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t517_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t517_A.float_u1"; + | _ -> assert false + in + let () = match t517_B, t_orig517_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t517_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t517_B.1"; + | _ -> assert false + in + let () = match t517_C, t_orig517_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t517_C.0"; + | _ -> assert false + in + let () = match t517_D, t_orig517_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t517_D.0"; + | _ -> assert false + in + let () = match t518_A, t_orig518_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t518_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t518_A.1"; + | _ -> assert false + in + let () = match t518_B, t_orig518_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t518_B.float_u0"; + | _ -> assert false + in + let () = match t518_C, t_orig518_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t518_C.float_u0"; + | _ -> assert false + in + let () = match t519_A, t_orig519_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t519_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t519_A.float_u1"; + | _ -> assert false + in + let () = match t519_B, t_orig519_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t519_B.0"; + | _ -> assert false + in + let () = match t519_C, t_orig519_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t519_C.0"; + | _ -> assert false + in + let () = match t519_D, t_orig519_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t519_D.0"; + | _ -> assert false + in + let () = match t519_E, t_orig519_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t519_E.0"; + | _ -> assert false + in + let () = match t520_A, t_orig520_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t520_A.0"; + | _ -> assert false + in + let () = match t520_B, t_orig520_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t520_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t520_B.float_u1"; + | _ -> assert false + in + let () = match t521_A, t_orig521_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t521_A.float32_u0"; + | _ -> assert false + in + let () = match t521_B, t_orig521_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t521_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t521_B.1"; + | _ -> assert false + in + let () = match t521_C, t_orig521_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t521_C.0"; + | _ -> assert false + in + let () = match t522_A, t_orig522_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t522_A.0"; +check_string a1 b1 ~message:"t522_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t522_A.2"; + | _ -> assert false + in + let () = match t522_B, t_orig522_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t522_B.float_u0"; + | _ -> assert false + in + let () = match t522_C, t_orig522_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t522_C.0"; + | _ -> assert false + in + let () = match t522_D, t_orig522_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t522_D.0"; + | _ -> assert false + in + let () = match t523_A, t_orig523_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t523_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t523_A.float_u1"; + | _ -> assert false + in + let () = match t523_B, t_orig523_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t523_B.0"; + | _ -> assert false + in + let () = match t523_C, t_orig523_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t523_C.float_u0"; + | _ -> assert false + in + let () = match t524_A, t_orig524_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t524_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t524_A.1"; + | _ -> assert false + in + let () = match t524_B, t_orig524_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t524_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t524_B.1"; + | _ -> assert false + in + let () = match t525_A, t_orig525_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t525_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t525_A.float_u1"; + | _ -> assert false + in + let () = match t525_B, t_orig525_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t525_B.float_u0"; + | _ -> assert false + in + let () = match t525_C, t_orig525_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t525_C.0"; + | _ -> assert false + in + let () = match t526_A, t_orig526_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t526_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t526_A.1"; + | _ -> assert false + in + let () = match t526_B, t_orig526_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t526_B.0"; + | _ -> assert false + in + let () = match t526_C, t_orig526_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t526_C.0"; + | _ -> assert false + in + let () = match t526_D, t_orig526_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t526_D.0"; + | _ -> assert false + in + let () = match t527_A, t_orig527_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t527_A.str0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u1) (Stdlib_stable.Float32_u.to_float32 b.float32_u1) ~message:"t527_A.float32_u1"; + | _ -> assert false + in + let () = match t527_B, t_orig527_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t527_B.float_u0"; + | _ -> assert false + in + let () = match t528_A, t_orig528_A with + | A (a0), A (b0) -> check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 a0) (Stdlib_upstream_compatible.Int64_u.to_int64 b0) ~message:"t528_A.0"; + | _ -> assert false + in + let () = match t528_B, t_orig528_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t528_B.0"; + | _ -> assert false + in + let () = match t528_C, t_orig528_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t528_C.0"; + | _ -> assert false + in + let () = match t529_A, t_orig529_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t529_A.float32_u0"; + | _ -> assert false + in + let () = match t529_B, t_orig529_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t529_B.0"; + | _ -> assert false + in + let () = match t530_A, t_orig530_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_float a0 b0 ~message:"t530_A.0"; +check_string a1 b1 ~message:"t530_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t530_A.2"; + + in + let () = match t531_A, t_orig531_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t531_A.0"; + | _ -> assert false + in + let () = match t531_B, t_orig531_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t531_B.float_u0"; + | _ -> assert false + in + let () = match t532_A, t_orig532_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t532_A.float_u0"; + | _ -> assert false + in + let () = match t532_B, t_orig532_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t532_B.0"; + | _ -> assert false + in + let () = match t532_C, t_orig532_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t532_C.0"; + | _ -> assert false + in + let () = match t533_A, t_orig533_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t533_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t533_A.1"; + | _ -> assert false + in + let () = match t533_B, t_orig533_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t533_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t533_B.float_u1"; + | _ -> assert false + in + let () = match t533_C, t_orig533_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t533_C.0"; + | _ -> assert false + in + let () = match t533_D, t_orig533_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t533_D.0"; + | _ -> assert false + in + let () = match t534_A, t_orig534_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t534_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t534_A.float_u1"; + | _ -> assert false + in + let () = match t534_B, t_orig534_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t534_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t534_B.1"; + | _ -> assert false + in + let () = match t534_C, t_orig534_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t534_C.float_u0"; + | _ -> assert false + in + let () = match t535_A, t_orig535_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t535_A.0"; + | _ -> assert false + in + let () = match t535_B, t_orig535_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t535_B.float_u0"; + | _ -> assert false + in + let () = match t535_C, t_orig535_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t535_C.0"; + | _ -> assert false + in + let () = match t535_D, t_orig535_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t535_D.0"; + | _ -> assert false + in + let () = match t535_E, t_orig535_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t535_E.0"; + | _ -> assert false + in + let () = match t536_A, t_orig536_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t536_A.float_u0"; + | _ -> assert false + in + let () = match t536_B, t_orig536_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t536_B.0"; + | _ -> assert false + in + let () = match t536_C, t_orig536_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t536_C.float_u0"; + | _ -> assert false + in + let () = match t536_D, t_orig536_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t536_D.0"; + | _ -> assert false + in + let () = match t537_A, t_orig537_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t537_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t537_A.1"; + | _ -> assert false + in + let () = match t537_B, t_orig537_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t537_B.0"; + | _ -> assert false + in + let () = match t538_A, t_orig538_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t538_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t538_A.float_u1"; + | _ -> assert false + in + let () = match t538_B, t_orig538_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t538_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t538_B.float_u1"; + | _ -> assert false + in + let () = match t538_C, t_orig538_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t538_C.0"; + | _ -> assert false + in + let () = match t539_A, t_orig539_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t539_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t539_A.1"; + | _ -> assert false + in + let () = match t539_B, t_orig539_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t539_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t539_B.1"; + | _ -> assert false + in + let () = match t539_C, t_orig539_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t539_C.0"; + | _ -> assert false + in + let () = match t539_D, t_orig539_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t539_D.0"; + | _ -> assert false + in + let () = match t540_A, t_orig540_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t540_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t540_A.float_u1"; + | _ -> assert false + in + let () = match t540_B, t_orig540_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t540_B.float_u0"; + | _ -> assert false + in + let () = match t540_C, t_orig540_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t540_C.float_u0"; + | _ -> assert false + in + let () = match t541_A, t_orig541_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t541_A.0"; + | _ -> assert false + in + let () = match t541_B, t_orig541_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t541_B.0"; + | _ -> assert false + in + let () = match t541_C, t_orig541_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t541_C.0"; + | _ -> assert false + in + let () = match t541_D, t_orig541_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t541_D.0"; + | _ -> assert false + in + let () = match t541_E, t_orig541_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t541_E.0"; + | _ -> assert false + in + let () = match t542_A, t_orig542_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t542_A.float32_u0"; + | _ -> assert false + in + let () = match t542_B, t_orig542_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t542_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t542_B.float_u1"; + | _ -> assert false + in + let () = match t543_A, t_orig543_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t543_A.0"; +check_string a1 b1 ~message:"t543_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t543_A.2"; + | _ -> assert false + in + let () = match t543_B, t_orig543_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t543_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t543_B.1"; + | _ -> assert false + in + let () = match t543_C, t_orig543_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t543_C.0"; + | _ -> assert false + in + let () = match t544_A, t_orig544_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t544_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t544_A.float_u1"; + | _ -> assert false + in + let () = match t544_B, t_orig544_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t544_B.float_u0"; + | _ -> assert false + in + let () = match t544_C, t_orig544_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t544_C.0"; + | _ -> assert false + in + let () = match t544_D, t_orig544_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t544_D.0"; + | _ -> assert false + in + let () = match t545_A, t_orig545_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t545_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t545_A.1"; + | _ -> assert false + in + let () = match t545_B, t_orig545_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t545_B.0"; + | _ -> assert false + in + let () = match t545_C, t_orig545_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t545_C.float_u0"; + | _ -> assert false + in + let () = match t546_A, t_orig546_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t546_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t546_A.float_u1"; + | _ -> assert false + in + let () = match t546_B, t_orig546_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t546_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t546_B.1"; + | _ -> assert false + in + let () = match t547_A, t_orig547_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t547_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t547_A.1"; + | _ -> assert false + in + let () = match t547_B, t_orig547_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t547_B.float_u0"; + | _ -> assert false + in + let () = match t547_C, t_orig547_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t547_C.0"; + | _ -> assert false + in + let () = match t548_A, t_orig548_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t548_A.str0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u1) (Stdlib_stable.Float32_u.to_float32 b.float32_u1) ~message:"t548_A.float32_u1"; + | _ -> assert false + in + let () = match t548_B, t_orig548_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t548_B.0"; + | _ -> assert false + in + let () = match t548_C, t_orig548_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t548_C.0"; + | _ -> assert false + in + let () = match t548_D, t_orig548_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t548_D.0"; + | _ -> assert false + in + let () = match t549_A, t_orig549_A with + | A (a0), A (b0) -> check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 a0) (Stdlib_upstream_compatible.Int64_u.to_int64 b0) ~message:"t549_A.0"; + | _ -> assert false + in + let () = match t549_B, t_orig549_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t549_B.float_u0"; + | _ -> assert false + in + let () = match t550_A, t_orig550_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t550_A.float32_u0"; + | _ -> assert false + in + let () = match t550_B, t_orig550_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t550_B.0"; + | _ -> assert false + in + let () = match t550_C, t_orig550_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t550_C.0"; + | _ -> assert false + in + let () = match t551_A, t_orig551_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_float a0 b0 ~message:"t551_A.0"; +check_string a1 b1 ~message:"t551_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t551_A.2"; + | _ -> assert false + in + let () = match t551_B, t_orig551_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t551_B.0"; + | _ -> assert false + in + let () = match t552_A, t_orig552_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t552_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t552_A.float_u1"; + + in + let () = match t553_A, t_orig553_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t553_A.0"; + | _ -> assert false + in + let () = match t553_B, t_orig553_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t553_B.0"; + | _ -> assert false + in + let () = match t553_C, t_orig553_C with + | C (a0, a1), C (b0, b1) -> check_string a0 b0 ~message:"t553_C.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t553_C.1"; + | _ -> assert false + in + let () = match t554_A, t_orig554_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t554_A.float_u0"; + | _ -> assert false + in + let () = match t554_B, t_orig554_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t554_B.float_u0"; + | _ -> assert false + in + let () = match t555_A, t_orig555_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t555_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t555_A.1"; + | _ -> assert false + in + let () = match t555_B, t_orig555_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t555_B.0"; + | _ -> assert false + in + let () = match t555_C, t_orig555_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t555_C.0"; + | _ -> assert false + in + let () = match t556_A, t_orig556_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t556_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t556_A.float_u1"; + | _ -> assert false + in + let () = match t556_B, t_orig556_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t556_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t556_B.float_u1"; + | _ -> assert false + in + let () = match t556_C, t_orig556_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t556_C.0"; + | _ -> assert false + in + let () = match t556_D, t_orig556_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t556_D.0"; + | _ -> assert false + in + let () = match t557_A, t_orig557_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t557_A.0"; + | _ -> assert false + in + let () = match t557_B, t_orig557_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t557_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t557_B.1"; + | _ -> assert false + in + let () = match t557_C, t_orig557_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t557_C.float_u0"; + | _ -> assert false + in + let () = match t558_A, t_orig558_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t558_A.float_u0"; + | _ -> assert false + in + let () = match t558_B, t_orig558_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t558_B.float_u0"; + | _ -> assert false + in + let () = match t558_C, t_orig558_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t558_C.0"; + | _ -> assert false + in + let () = match t558_D, t_orig558_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t558_D.0"; + | _ -> assert false + in + let () = match t558_E, t_orig558_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t558_E.0"; + | _ -> assert false + in + let () = match t559_A, t_orig559_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t559_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t559_A.1"; + | _ -> assert false + in + let () = match t559_B, t_orig559_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t559_B.0"; + | _ -> assert false + in + let () = match t559_C, t_orig559_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t559_C.float_u0"; + | _ -> assert false + in + let () = match t559_D, t_orig559_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t559_D.0"; + | _ -> assert false + in + let () = match t560_A, t_orig560_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t560_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t560_A.float_u1"; + | _ -> assert false + in + let () = match t560_B, t_orig560_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t560_B.0"; + | _ -> assert false + in + let () = match t561_A, t_orig561_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t561_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t561_A.1"; + | _ -> assert false + in + let () = match t561_B, t_orig561_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t561_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t561_B.float_u1"; + | _ -> assert false + in + let () = match t561_C, t_orig561_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t561_C.0"; + | _ -> assert false + in + let () = match t562_A, t_orig562_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t562_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t562_A.float_u1"; + | _ -> assert false + in + let () = match t562_B, t_orig562_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t562_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t562_B.1"; + | _ -> assert false + in + let () = match t562_C, t_orig562_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t562_C.0"; + | _ -> assert false + in + let () = match t562_D, t_orig562_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t562_D.0"; + | _ -> assert false + in + let () = match t563_A, t_orig563_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t563_A.0"; + | _ -> assert false + in + let () = match t563_B, t_orig563_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t563_B.float_u0"; + | _ -> assert false + in + let () = match t563_C, t_orig563_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t563_C.float_u0"; + | _ -> assert false + in + let () = match t564_A, t_orig564_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t564_A.float32_u0"; + | _ -> assert false + in + let () = match t564_B, t_orig564_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t564_B.0"; + | _ -> assert false + in + let () = match t564_C, t_orig564_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t564_C.0"; + | _ -> assert false + in + let () = match t564_D, t_orig564_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t564_D.0"; + | _ -> assert false + in + let () = match t564_E, t_orig564_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t564_E.0"; + | _ -> assert false + in + let () = match t565_A, t_orig565_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t565_A.0"; +check_string a1 b1 ~message:"t565_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t565_A.2"; + | _ -> assert false + in + let () = match t565_B, t_orig565_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t565_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t565_B.float_u1"; + | _ -> assert false + in + let () = match t566_A, t_orig566_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t566_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t566_A.float_u1"; + | _ -> assert false + in + let () = match t566_B, t_orig566_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t566_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t566_B.1"; + | _ -> assert false + in + let () = match t566_C, t_orig566_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t566_C.0"; + | _ -> assert false + in + let () = match t567_A, t_orig567_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t567_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t567_A.1"; + | _ -> assert false + in + let () = match t567_B, t_orig567_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t567_B.float_u0"; + | _ -> assert false + in + let () = match t567_C, t_orig567_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t567_C.0"; + | _ -> assert false + in + let () = match t567_D, t_orig567_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t567_D.0"; + | _ -> assert false + in + let () = match t568_A, t_orig568_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t568_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t568_A.float_u1"; + | _ -> assert false + in + let () = match t568_B, t_orig568_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t568_B.0"; + | _ -> assert false + in + let () = match t568_C, t_orig568_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t568_C.float_u0"; + | _ -> assert false + in + let () = match t569_A, t_orig569_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t569_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t569_A.1"; + | _ -> assert false + in + let () = match t569_B, t_orig569_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t569_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t569_B.1"; + | _ -> assert false + in + let () = match t570_A, t_orig570_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t570_A.str0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u1) (Stdlib_stable.Float32_u.to_float32 b.float32_u1) ~message:"t570_A.float32_u1"; + | _ -> assert false + in + let () = match t570_B, t_orig570_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t570_B.float_u0"; + | _ -> assert false + in + let () = match t570_C, t_orig570_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t570_C.0"; + | _ -> assert false + in + let () = match t571_A, t_orig571_A with + | A (a0), A (b0) -> check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 a0) (Stdlib_upstream_compatible.Int64_u.to_int64 b0) ~message:"t571_A.0"; + | _ -> assert false + in + let () = match t571_B, t_orig571_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t571_B.0"; + | _ -> assert false + in + let () = match t571_C, t_orig571_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t571_C.0"; + | _ -> assert false + in + let () = match t571_D, t_orig571_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t571_D.0"; + | _ -> assert false + in + let () = match t572_A, t_orig572_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t572_A.float32_u0"; + | _ -> assert false + in + let () = match t572_B, t_orig572_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t572_B.float_u0"; + | _ -> assert false + in + let () = match t573_A, t_orig573_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_float a0 b0 ~message:"t573_A.0"; +check_string a1 b1 ~message:"t573_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t573_A.2"; + | _ -> assert false + in + let () = match t573_B, t_orig573_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t573_B.0"; + | _ -> assert false + in + let () = match t573_C, t_orig573_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t573_C.0"; + | _ -> assert false + in + let () = match t574_A, t_orig574_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t574_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t574_A.float_u1"; + | _ -> assert false + in + let () = match t574_B, t_orig574_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t574_B.0"; + | _ -> assert false + in + let () = match t575_A, t_orig575_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t575_A.0"; +check_string a1 b1 ~message:"t575_A.1"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a2) (Stdlib_stable.Float32_u.to_float32 b2) ~message:"t575_A.2"; + + in + let () = match t576_A, t_orig576_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t576_A.0"; + | _ -> assert false + in + let () = match t576_B, t_orig576_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t576_B.float_u0"; + | _ -> assert false + in + let () = match t576_C, t_orig576_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t576_C.float_u0"; + | _ -> assert false + in + let () = match t576_D, t_orig576_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t576_D.0"; + | _ -> assert false + in + let () = match t577_A, t_orig577_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t577_A.float_u0"; + | _ -> assert false + in + let () = match t577_B, t_orig577_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t577_B.0"; + | _ -> assert false + in + let () = match t577_C, t_orig577_C with + | C (a0, a1), C (b0, b1) -> check_string a0 b0 ~message:"t577_C.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t577_C.1"; + | _ -> assert false + in + let () = match t578_A, t_orig578_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t578_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t578_A.1"; + | _ -> assert false + in + let () = match t578_B, t_orig578_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t578_B.float_u0"; + | _ -> assert false + in + let () = match t579_A, t_orig579_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t579_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t579_A.float_u1"; + | _ -> assert false + in + let () = match t579_B, t_orig579_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t579_B.0"; + | _ -> assert false + in + let () = match t579_C, t_orig579_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t579_C.0"; + | _ -> assert false + in + let () = match t580_A, t_orig580_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t580_A.0"; + | _ -> assert false + in + let () = match t580_B, t_orig580_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t580_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t580_B.float_u1"; + | _ -> assert false + in + let () = match t580_C, t_orig580_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t580_C.0"; + | _ -> assert false + in + let () = match t580_D, t_orig580_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t580_D.0"; + | _ -> assert false + in + let () = match t581_A, t_orig581_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t581_A.float_u0"; + | _ -> assert false + in + let () = match t581_B, t_orig581_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t581_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t581_B.1"; + | _ -> assert false + in + let () = match t581_C, t_orig581_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t581_C.float_u0"; + | _ -> assert false + in + let () = match t582_A, t_orig582_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t582_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t582_A.1"; + | _ -> assert false + in + let () = match t582_B, t_orig582_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t582_B.float_u0"; + | _ -> assert false + in + let () = match t582_C, t_orig582_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t582_C.0"; + | _ -> assert false + in + let () = match t582_D, t_orig582_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t582_D.0"; + | _ -> assert false + in + let () = match t582_E, t_orig582_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t582_E.0"; + | _ -> assert false + in + let () = match t583_A, t_orig583_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t583_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t583_A.float_u1"; + | _ -> assert false + in + let () = match t583_B, t_orig583_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t583_B.0"; + | _ -> assert false + in + let () = match t583_C, t_orig583_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t583_C.float_u0"; + | _ -> assert false + in + let () = match t583_D, t_orig583_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t583_D.0"; + | _ -> assert false + in + let () = match t584_A, t_orig584_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t584_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t584_A.1"; + | _ -> assert false + in + let () = match t584_B, t_orig584_B with + | B (a0), B (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t584_B.0"; + | _ -> assert false + in + let () = match t585_A, t_orig585_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t585_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t585_A.float_u1"; + | _ -> assert false + in + let () = match t585_B, t_orig585_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t585_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t585_B.float_u1"; + | _ -> assert false + in + let () = match t585_C, t_orig585_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t585_C.0"; + | _ -> assert false + in + let () = match t586_A, t_orig586_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t586_A.0"; + | _ -> assert false + in + let () = match t586_B, t_orig586_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t586_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t586_B.1"; + | _ -> assert false + in + let () = match t586_C, t_orig586_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t586_C.0"; + | _ -> assert false + in + let () = match t586_D, t_orig586_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t586_D.0"; + | _ -> assert false + in + let () = match t587_A, t_orig587_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t587_A.float32_u0"; + | _ -> assert false + in + let () = match t587_B, t_orig587_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t587_B.float_u0"; + | _ -> assert false + in + let () = match t587_C, t_orig587_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t587_C.float_u0"; + | _ -> assert false + in + let () = match t588_A, t_orig588_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t588_A.0"; +check_string a1 b1 ~message:"t588_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t588_A.2"; + | _ -> assert false + in + let () = match t588_B, t_orig588_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t588_B.0"; + | _ -> assert false + in + let () = match t588_C, t_orig588_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t588_C.0"; + | _ -> assert false + in + let () = match t588_D, t_orig588_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t588_D.0"; + | _ -> assert false + in + let () = match t588_E, t_orig588_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t588_E.0"; + | _ -> assert false + in + let () = match t589_A, t_orig589_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t589_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t589_A.float_u1"; + | _ -> assert false + in + let () = match t589_B, t_orig589_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t589_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t589_B.float_u1"; + | _ -> assert false + in + let () = match t590_A, t_orig590_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t590_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t590_A.1"; + | _ -> assert false + in + let () = match t590_B, t_orig590_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t590_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t590_B.1"; + | _ -> assert false + in + let () = match t590_C, t_orig590_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t590_C.0"; + | _ -> assert false + in + let () = match t591_A, t_orig591_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t591_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t591_A.float_u1"; + | _ -> assert false + in + let () = match t591_B, t_orig591_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t591_B.float_u0"; + | _ -> assert false + in + let () = match t591_C, t_orig591_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t591_C.0"; + | _ -> assert false + in + let () = match t591_D, t_orig591_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t591_D.0"; + | _ -> assert false + in + let () = match t592_A, t_orig592_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t592_A.0"; +check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a1) (Stdlib_upstream_compatible.Int32_u.to_int32 b1) ~message:"t592_A.1"; + | _ -> assert false + in + let () = match t592_B, t_orig592_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t592_B.0"; + | _ -> assert false + in + let () = match t592_C, t_orig592_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t592_C.float_u0"; + | _ -> assert false + in + let () = match t593_A, t_orig593_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t593_A.str0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u1) (Stdlib_stable.Float32_u.to_float32 b.float32_u1) ~message:"t593_A.float32_u1"; + | _ -> assert false + in + let () = match t593_B, t_orig593_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t593_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t593_B.1"; + | _ -> assert false + in + let () = match t594_A, t_orig594_A with + | A (a0), A (b0) -> check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 a0) (Stdlib_upstream_compatible.Int64_u.to_int64 b0) ~message:"t594_A.0"; + | _ -> assert false + in + let () = match t594_B, t_orig594_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t594_B.float_u0"; + | _ -> assert false + in + let () = match t594_C, t_orig594_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t594_C.0"; + | _ -> assert false + in + let () = match t595_A, t_orig595_A with + | A a, A b -> check_float32 (Stdlib_stable.Float32_u.to_float32 a.float32_u0) (Stdlib_stable.Float32_u.to_float32 b.float32_u0) ~message:"t595_A.float32_u0"; + | _ -> assert false + in + let () = match t595_B, t_orig595_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t595_B.0"; + | _ -> assert false + in + let () = match t595_C, t_orig595_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t595_C.0"; + | _ -> assert false + in + let () = match t595_D, t_orig595_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t595_D.0"; + | _ -> assert false + in + let () = match t596_A, t_orig596_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_float a0 b0 ~message:"t596_A.0"; +check_string a1 b1 ~message:"t596_A.1"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a2) (Stdlib_upstream_compatible.Float_u.to_float b2) ~message:"t596_A.2"; + | _ -> assert false + in + let () = match t596_B, t_orig596_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t596_B.float_u0"; + | _ -> assert false + in + let () = match t597_A, t_orig597_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t597_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t597_A.float_u1"; + | _ -> assert false + in + let () = match t597_B, t_orig597_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t597_B.0"; + | _ -> assert false + in + let () = match t597_C, t_orig597_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t597_C.0"; + | _ -> assert false + in + let () = match t598_A, t_orig598_A with + | A (a0, a1, a2), A (b0, b1, b2) -> check_string a0 b0 ~message:"t598_A.0"; +check_string a1 b1 ~message:"t598_A.1"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a2) (Stdlib_stable.Float32_u.to_float32 b2) ~message:"t598_A.2"; + | _ -> assert false + in + let () = match t598_B, t_orig598_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t598_B.0"; + | _ -> assert false + in + let () = match t599_A, t_orig599_A with + | A a, A b -> check_float a.float0 b.float0 ~message:"t599_A.float0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t599_A.float_u1"; + + in + print_endline " - Checking [Obj.reachable_words]"; + check_reachable_words (Obj.reachable_words (Obj.repr t0)) (3 + 2 + 2) "Reachable words 0"; + check_reachable_words (Obj.reachable_words (Obj.repr t1)) (3 + 2 + 2) "Reachable words 1"; + check_reachable_words (Obj.reachable_words (Obj.repr t2)) (3 + 2 + 2) "Reachable words 2"; + check_reachable_words (Obj.reachable_words (Obj.repr t3)) (3 + 2 + 2) "Reachable words 3"; + check_reachable_words (Obj.reachable_words (Obj.repr t4)) (3 + 2 + 2) "Reachable words 4"; + check_reachable_words (Obj.reachable_words (Obj.repr t5)) (3 + 2 + 2) "Reachable words 5"; + check_reachable_words (Obj.reachable_words (Obj.repr t6)) (3 + 2 + 2) "Reachable words 6"; + check_reachable_words (Obj.reachable_words (Obj.repr t7)) (3 + 2 + 2) "Reachable words 7"; + check_reachable_words (Obj.reachable_words (Obj.repr t8)) (4 + 2 + 2 + 2) "Reachable words 8"; + check_reachable_words (Obj.reachable_words (Obj.repr t9)) (4 + 2 + 2 + 2) "Reachable words 9"; + check_reachable_words (Obj.reachable_words (Obj.repr t10)) (4 + 2 + 2 + 2) "Reachable words 10"; + check_reachable_words (Obj.reachable_words (Obj.repr t11)) (4 + 2 + 2 + 2) "Reachable words 11"; + check_reachable_words (Obj.reachable_words (Obj.repr t12)) (4 + 2 + 2 + 2) "Reachable words 12"; + check_reachable_words (Obj.reachable_words (Obj.repr t13)) (4 + 2 + 2 + 2) "Reachable words 13"; + check_reachable_words (Obj.reachable_words (Obj.repr t14)) (4 + 2 + 2 + 2) "Reachable words 14"; + check_reachable_words (Obj.reachable_words (Obj.repr t15)) (4 + 2 + 2 + 2) "Reachable words 15"; + check_reachable_words (Obj.reachable_words (Obj.repr t16)) (4 + 2 + 2 + 2) "Reachable words 16"; + check_reachable_words (Obj.reachable_words (Obj.repr t17)) (4 + 2 + 2 + 2) "Reachable words 17"; + check_reachable_words (Obj.reachable_words (Obj.repr t18)) (4 + 2 + 2 + 2) "Reachable words 18"; + check_reachable_words (Obj.reachable_words (Obj.repr t19)) (4 + 2 + 2 + 2) "Reachable words 19"; + check_reachable_words (Obj.reachable_words (Obj.repr t20)) (4 + 2 + 2 + 2) "Reachable words 20"; + check_reachable_words (Obj.reachable_words (Obj.repr t21)) (4 + 2 + 2 + 2) "Reachable words 21"; + check_reachable_words (Obj.reachable_words (Obj.repr t22)) (4 + 2 + 2 + 2) "Reachable words 22"; + check_reachable_words (Obj.reachable_words (Obj.repr t23)) (4 + 2 + 2 + 2) "Reachable words 23"; + check_reachable_words (Obj.reachable_words (Obj.repr t24)) (4 + 2 + 2 + 2) "Reachable words 24"; + check_reachable_words (Obj.reachable_words (Obj.repr t25)) (4 + 2 + 2 + 2) "Reachable words 25"; + check_reachable_words (Obj.reachable_words (Obj.repr t26)) (4 + 2 + 2 + 2) "Reachable words 26"; + check_reachable_words (Obj.reachable_words (Obj.repr t27)) (4 + 2 + 2 + 2) "Reachable words 27"; + check_reachable_words (Obj.reachable_words (Obj.repr t28)) (4 + 2 + 2 + 2) "Reachable words 28"; + check_reachable_words (Obj.reachable_words (Obj.repr t29)) (4 + 2 + 2 + 2) "Reachable words 29"; + check_reachable_words (Obj.reachable_words (Obj.repr t30)) (4 + 2 + 2 + 2) "Reachable words 30"; + check_reachable_words (Obj.reachable_words (Obj.repr t31)) (4 + 2 + 2 + 2) "Reachable words 31"; + check_reachable_words (Obj.reachable_words (Obj.repr t32)) (4 + 2 + 2 + 2) "Reachable words 32"; + check_reachable_words (Obj.reachable_words (Obj.repr t33)) (4 + 2 + 2 + 2) "Reachable words 33"; + check_reachable_words (Obj.reachable_words (Obj.repr t34)) (4 + 2 + 2 + 2) "Reachable words 34"; + check_reachable_words (Obj.reachable_words (Obj.repr t35)) (4 + 2 + 2 + 2) "Reachable words 35"; + check_reachable_words (Obj.reachable_words (Obj.repr t36)) (4 + 2 + 2 + 2) "Reachable words 36"; + check_reachable_words (Obj.reachable_words (Obj.repr t37)) (4 + 2 + 2 + 2) "Reachable words 37"; + check_reachable_words (Obj.reachable_words (Obj.repr t38)) (4 + 2 + 2 + 2) "Reachable words 38"; + check_reachable_words (Obj.reachable_words (Obj.repr t39)) (4 + 2 + 2 + 2) "Reachable words 39"; + check_reachable_words (Obj.reachable_words (Obj.repr t40)) (4 + 2 + 2 + 2) "Reachable words 40"; + check_reachable_words (Obj.reachable_words (Obj.repr t41)) (4 + 2 + 2 + 2) "Reachable words 41"; + check_reachable_words (Obj.reachable_words (Obj.repr t42)) (4 + 2 + 2 + 2) "Reachable words 42"; + check_reachable_words (Obj.reachable_words (Obj.repr t43)) (4 + 2 + 2 + 2) "Reachable words 43"; + check_reachable_words (Obj.reachable_words (Obj.repr t44)) (4 + 2 + 2 + 2) "Reachable words 44"; + check_reachable_words (Obj.reachable_words (Obj.repr t45)) (4 + 2 + 2 + 2) "Reachable words 45"; + check_reachable_words (Obj.reachable_words (Obj.repr t46)) (4 + 2 + 2 + 2) "Reachable words 46"; + check_reachable_words (Obj.reachable_words (Obj.repr t47)) (4 + 2 + 2 + 2) "Reachable words 47"; + check_reachable_words (Obj.reachable_words (Obj.repr t48)) (4 + 2 + 2 + 2) "Reachable words 48"; + check_reachable_words (Obj.reachable_words (Obj.repr t49)) (4 + 2 + 2 + 2) "Reachable words 49"; + check_reachable_words (Obj.reachable_words (Obj.repr t50)) (4 + 2 + 2 + 2) "Reachable words 50"; + check_reachable_words (Obj.reachable_words (Obj.repr t51)) (4 + 2 + 2 + 2) "Reachable words 51"; + check_reachable_words (Obj.reachable_words (Obj.repr t52)) (4 + 2 + 2 + 2) "Reachable words 52"; + check_reachable_words (Obj.reachable_words (Obj.repr t53)) (4 + 2 + 2 + 2) "Reachable words 53"; + check_reachable_words (Obj.reachable_words (Obj.repr t54)) (4 + 2 + 2 + 2) "Reachable words 54"; + check_reachable_words (Obj.reachable_words (Obj.repr t55)) (4 + 2 + 2 + 2) "Reachable words 55"; + check_reachable_words (Obj.reachable_words (Obj.repr t56)) (5 + 2 + 2 + 2 + 2) "Reachable words 56"; + check_reachable_words (Obj.reachable_words (Obj.repr t57)) (5 + 2 + 2 + 2 + 2) "Reachable words 57"; + check_reachable_words (Obj.reachable_words (Obj.repr t58)) (5 + 2 + 2 + 2 + 2) "Reachable words 58"; + check_reachable_words (Obj.reachable_words (Obj.repr t59)) (5 + 2 + 2 + 2 + 2) "Reachable words 59"; + check_reachable_words (Obj.reachable_words (Obj.repr t60)) (5 + 2 + 2 + 2 + 2) "Reachable words 60"; + check_reachable_words (Obj.reachable_words (Obj.repr t61)) (5 + 2 + 2 + 2 + 2) "Reachable words 61"; + check_reachable_words (Obj.reachable_words (Obj.repr t62)) (5 + 2 + 2 + 2 + 2) "Reachable words 62"; + check_reachable_words (Obj.reachable_words (Obj.repr t63)) (5 + 2 + 2 + 2 + 2) "Reachable words 63"; + check_reachable_words (Obj.reachable_words (Obj.repr t64)) (5 + 2 + 2 + 2 + 2) "Reachable words 64"; + check_reachable_words (Obj.reachable_words (Obj.repr t65)) (5 + 2 + 2 + 2 + 2) "Reachable words 65"; + check_reachable_words (Obj.reachable_words (Obj.repr t66)) (5 + 2 + 2 + 2 + 2) "Reachable words 66"; + check_reachable_words (Obj.reachable_words (Obj.repr t67)) (5 + 2 + 2 + 2 + 2) "Reachable words 67"; + check_reachable_words (Obj.reachable_words (Obj.repr t68)) (5 + 2 + 2 + 2 + 2) "Reachable words 68"; + check_reachable_words (Obj.reachable_words (Obj.repr t69)) (5 + 2 + 2 + 2 + 2) "Reachable words 69"; + check_reachable_words (Obj.reachable_words (Obj.repr t70)) (5 + 2 + 2 + 2 + 2) "Reachable words 70"; + check_reachable_words (Obj.reachable_words (Obj.repr t71)) (5 + 2 + 2 + 2 + 2) "Reachable words 71"; + check_reachable_words (Obj.reachable_words (Obj.repr t72)) (5 + 2 + 2 + 2 + 2) "Reachable words 72"; + check_reachable_words (Obj.reachable_words (Obj.repr t73)) (5 + 2 + 2 + 2 + 2) "Reachable words 73"; + check_reachable_words (Obj.reachable_words (Obj.repr t74)) (5 + 2 + 2 + 2 + 2) "Reachable words 74"; + check_reachable_words (Obj.reachable_words (Obj.repr t75)) (3 + Obj.reachable_words (Obj.repr t75.str0) + 2) "Reachable words 75"; + check_reachable_words (Obj.reachable_words (Obj.repr t76)) (3 + Obj.reachable_words (Obj.repr t76.str0) + 2) "Reachable words 76"; + check_reachable_words (Obj.reachable_words (Obj.repr t77)) (3 + Obj.reachable_words (Obj.repr t77.str0) + 2) "Reachable words 77"; + check_reachable_words (Obj.reachable_words (Obj.repr t78)) (2 + 3) "Reachable words 78"; + check_reachable_words (Obj.reachable_words (Obj.repr t79)) (3 + Obj.reachable_words (Obj.repr t79.str0) + 2) "Reachable words 79"; + check_reachable_words (Obj.reachable_words (Obj.repr t80)) (3 + Obj.reachable_words (Obj.repr t80.str0) + 3) "Reachable words 80"; + check_reachable_words (Obj.reachable_words (Obj.repr t81)) (2 + 3) "Reachable words 81"; + check_reachable_words (Obj.reachable_words (Obj.repr t82)) (3 + Obj.reachable_words (Obj.repr t82.str0) + 3) "Reachable words 82"; + check_reachable_words (Obj.reachable_words (Obj.repr t83)) (3 + Obj.reachable_words (Obj.repr t83.str0) + 3) "Reachable words 83"; + check_reachable_words (Obj.reachable_words (Obj.repr t84)) (2 + 3) "Reachable words 84"; + check_reachable_words (Obj.reachable_words (Obj.repr t85)) (4 + Obj.reachable_words (Obj.repr t85.str0) + Obj.reachable_words (Obj.repr t85.str1) + 2) "Reachable words 85"; + check_reachable_words (Obj.reachable_words (Obj.repr t86)) (3 + 2 + 3) "Reachable words 86"; + check_reachable_words (Obj.reachable_words (Obj.repr t87)) (3 + Obj.reachable_words (Obj.repr t87.str0) + 3) "Reachable words 87"; + check_reachable_words (Obj.reachable_words (Obj.repr t88)) (3 + Obj.reachable_words (Obj.repr t88.str0) + 3) "Reachable words 88"; + check_reachable_words (Obj.reachable_words (Obj.repr t89)) (2 + 3) "Reachable words 89"; + check_reachable_words (Obj.reachable_words (Obj.repr t90)) (4 + Obj.reachable_words (Obj.repr t90.str0) + Obj.reachable_words (Obj.repr t90.str1) + 2) "Reachable words 90"; + check_reachable_words (Obj.reachable_words (Obj.repr t91)) (4 + Obj.reachable_words (Obj.repr t91.str0) + Obj.reachable_words (Obj.repr t91.str1) + 2) "Reachable words 91"; + check_reachable_words (Obj.reachable_words (Obj.repr t92)) (3 + 2 + 3) "Reachable words 92"; + check_reachable_words (Obj.reachable_words (Obj.repr t93)) (3 + 2 + 3) "Reachable words 93"; + check_reachable_words (Obj.reachable_words (Obj.repr t94)) (3 + Obj.reachable_words (Obj.repr t94.str0) + 3) "Reachable words 94"; + check_reachable_words (Obj.reachable_words (Obj.repr t95)) (3 + Obj.reachable_words (Obj.repr t95.str0) + 3) "Reachable words 95"; + check_reachable_words (Obj.reachable_words (Obj.repr t96)) (2 + 3) "Reachable words 96"; + check_reachable_words (Obj.reachable_words (Obj.repr t97)) (4 + 2 + Obj.reachable_words (Obj.repr t97.str1) + 2) "Reachable words 97"; + check_reachable_words (Obj.reachable_words (Obj.repr t98)) (4 + Obj.reachable_words (Obj.repr t98.str0) + Obj.reachable_words (Obj.repr t98.str1) + 2) "Reachable words 98"; + check_reachable_words (Obj.reachable_words (Obj.repr t99)) (4 + Obj.reachable_words (Obj.repr t99.str0) + Obj.reachable_words (Obj.repr t99.str1) + 3) "Reachable words 99"; + check_reachable_words (Obj.reachable_words (Obj.repr t100)) (3 + 2 + 3) "Reachable words 100"; + check_reachable_words (Obj.reachable_words (Obj.repr t101)) (3 + 2 + 3) "Reachable words 101"; + check_reachable_words (Obj.reachable_words (Obj.repr t102)) (3 + Obj.reachable_words (Obj.repr t102.str0) + 3) "Reachable words 102"; + check_reachable_words (Obj.reachable_words (Obj.repr t103)) (3 + Obj.reachable_words (Obj.repr t103.str0) + 3) "Reachable words 103"; + check_reachable_words (Obj.reachable_words (Obj.repr t104)) (2 + 3) "Reachable words 104"; + check_reachable_words (Obj.reachable_words (Obj.repr t105)) (4 + 2 + Obj.reachable_words (Obj.repr t105.str1) + 2) "Reachable words 105"; + check_reachable_words (Obj.reachable_words (Obj.repr t106)) (4 + 2 + Obj.reachable_words (Obj.repr t106.str1) + 2) "Reachable words 106"; + check_reachable_words (Obj.reachable_words (Obj.repr t107)) (4 + Obj.reachable_words (Obj.repr t107.str0) + Obj.reachable_words (Obj.repr t107.str1) + 3) "Reachable words 107"; + check_reachable_words (Obj.reachable_words (Obj.repr t108)) (4 + Obj.reachable_words (Obj.repr t108.str0) + Obj.reachable_words (Obj.repr t108.str1) + 3) "Reachable words 108"; + check_reachable_words (Obj.reachable_words (Obj.repr t109)) (3 + 2 + 3) "Reachable words 109"; + check_reachable_words (Obj.reachable_words (Obj.repr t110)) (3 + 2 + 3) "Reachable words 110"; + check_reachable_words (Obj.reachable_words (Obj.repr t111)) (3 + Obj.reachable_words (Obj.repr t111.str0) + 3) "Reachable words 111"; + check_reachable_words (Obj.reachable_words (Obj.repr t112)) (3 + Obj.reachable_words (Obj.repr t112.str0) + 3) "Reachable words 112"; + check_reachable_words (Obj.reachable_words (Obj.repr t113)) (2 + 3) "Reachable words 113"; + check_reachable_words (Obj.reachable_words (Obj.repr t114)) (4 + Obj.reachable_words (Obj.repr t114.str1) + 2) "Reachable words 114"; + check_reachable_words (Obj.reachable_words (Obj.repr t115)) (4 + 2 + Obj.reachable_words (Obj.repr t115.str1) + 2) "Reachable words 115"; + check_reachable_words (Obj.reachable_words (Obj.repr t116)) (4 + 2 + Obj.reachable_words (Obj.repr t116.str1) + 3) "Reachable words 116"; + check_reachable_words (Obj.reachable_words (Obj.repr t117)) (4 + Obj.reachable_words (Obj.repr t117.str0) + Obj.reachable_words (Obj.repr t117.str1) + 3) "Reachable words 117"; + check_reachable_words (Obj.reachable_words (Obj.repr t118)) (4 + Obj.reachable_words (Obj.repr t118.str0) + Obj.reachable_words (Obj.repr t118.str1) + 3) "Reachable words 118"; + check_reachable_words (Obj.reachable_words (Obj.repr t119)) (3 + 2 + 3) "Reachable words 119"; + check_reachable_words (Obj.reachable_words (Obj.repr t120)) (3 + 2 + 3) "Reachable words 120"; + check_reachable_words (Obj.reachable_words (Obj.repr t121)) (3 + Obj.reachable_words (Obj.repr t121.str0) + 3) "Reachable words 121"; + check_reachable_words (Obj.reachable_words (Obj.repr t122)) (3 + Obj.reachable_words (Obj.repr t122.str0) + 3) "Reachable words 122"; + check_reachable_words (Obj.reachable_words (Obj.repr t123)) (2 + 3) "Reachable words 123"; + check_reachable_words (Obj.reachable_words (Obj.repr t124)) (4 + Obj.reachable_words (Obj.repr t124.str1) + 2) "Reachable words 124"; + check_reachable_words (Obj.reachable_words (Obj.repr t125)) (4 + Obj.reachable_words (Obj.repr t125.str1) + 2) "Reachable words 125"; + check_reachable_words (Obj.reachable_words (Obj.repr t126)) (4 + 2 + Obj.reachable_words (Obj.repr t126.str1) + 3) "Reachable words 126"; + check_reachable_words (Obj.reachable_words (Obj.repr t127)) (4 + 2 + Obj.reachable_words (Obj.repr t127.str1) + 3) "Reachable words 127"; + check_reachable_words (Obj.reachable_words (Obj.repr t128)) (4 + Obj.reachable_words (Obj.repr t128.str0) + Obj.reachable_words (Obj.repr t128.str1) + 3) "Reachable words 128"; + check_reachable_words (Obj.reachable_words (Obj.repr t129)) (4 + Obj.reachable_words (Obj.repr t129.str0) + Obj.reachable_words (Obj.repr t129.str1) + 3) "Reachable words 129"; + check_reachable_words (Obj.reachable_words (Obj.repr t130)) (3 + 2 + 3) "Reachable words 130"; + check_reachable_words (Obj.reachable_words (Obj.repr t131)) (3 + 2 + 3) "Reachable words 131"; + check_reachable_words (Obj.reachable_words (Obj.repr t132)) (3 + Obj.reachable_words (Obj.repr t132.str0) + 3) "Reachable words 132"; + check_reachable_words (Obj.reachable_words (Obj.repr t133)) (3 + Obj.reachable_words (Obj.repr t133.str0) + 3) "Reachable words 133"; + check_reachable_words (Obj.reachable_words (Obj.repr t134)) (3 + 2) "Reachable words 134"; + check_reachable_words (Obj.reachable_words (Obj.repr t135)) (4 + Obj.reachable_words (Obj.repr t135.str0) + Obj.reachable_words (Obj.repr t135.str1) + 2) "Reachable words 135"; + check_reachable_words (Obj.reachable_words (Obj.repr t136)) (4 + Obj.reachable_words (Obj.repr t136.str1) + 2) "Reachable words 136"; + check_reachable_words (Obj.reachable_words (Obj.repr t137)) (4 + Obj.reachable_words (Obj.repr t137.str1) + 3) "Reachable words 137"; + check_reachable_words (Obj.reachable_words (Obj.repr t138)) (4 + 2 + Obj.reachable_words (Obj.repr t138.str1) + 3) "Reachable words 138"; + check_reachable_words (Obj.reachable_words (Obj.repr t139)) (4 + 2 + Obj.reachable_words (Obj.repr t139.str1) + 3) "Reachable words 139"; + check_reachable_words (Obj.reachable_words (Obj.repr t140)) (4 + Obj.reachable_words (Obj.repr t140.str0) + Obj.reachable_words (Obj.repr t140.str1) + 3) "Reachable words 140"; + check_reachable_words (Obj.reachable_words (Obj.repr t141)) (4 + Obj.reachable_words (Obj.repr t141.str0) + Obj.reachable_words (Obj.repr t141.str1) + 3) "Reachable words 141"; + check_reachable_words (Obj.reachable_words (Obj.repr t142)) (3 + 2 + 3) "Reachable words 142"; + check_reachable_words (Obj.reachable_words (Obj.repr t143)) (3 + 2 + 3) "Reachable words 143"; + check_reachable_words (Obj.reachable_words (Obj.repr t144)) (3 + Obj.reachable_words (Obj.repr t144.str0) + 3) "Reachable words 144"; + check_reachable_words (Obj.reachable_words (Obj.repr t145)) (4 + Obj.reachable_words (Obj.repr t145.str0) + 2) "Reachable words 145"; + check_reachable_words (Obj.reachable_words (Obj.repr t146)) (3 + 2) "Reachable words 146"; + check_reachable_words (Obj.reachable_words (Obj.repr t147)) (4 + Obj.reachable_words (Obj.repr t147.str0) + Obj.reachable_words (Obj.repr t147.str1) + 2) "Reachable words 147"; + check_reachable_words (Obj.reachable_words (Obj.repr t148)) (4 + Obj.reachable_words (Obj.repr t148.str0) + Obj.reachable_words (Obj.repr t148.str1) + 2) "Reachable words 148"; + check_reachable_words (Obj.reachable_words (Obj.repr t149)) (4 + Obj.reachable_words (Obj.repr t149.str1) + 3) "Reachable words 149"; + check_reachable_words (Obj.reachable_words (Obj.repr t150)) (4 + Obj.reachable_words (Obj.repr t150.str1) + 3) "Reachable words 150"; + check_reachable_words (Obj.reachable_words (Obj.repr t151)) (4 + 2 + Obj.reachable_words (Obj.repr t151.str1) + 3) "Reachable words 151"; + check_reachable_words (Obj.reachable_words (Obj.repr t152)) (4 + 2 + Obj.reachable_words (Obj.repr t152.str1) + 3) "Reachable words 152"; + check_reachable_words (Obj.reachable_words (Obj.repr t153)) (4 + Obj.reachable_words (Obj.repr t153.str0) + Obj.reachable_words (Obj.repr t153.str1) + 3) "Reachable words 153"; + check_reachable_words (Obj.reachable_words (Obj.repr t154)) (4 + Obj.reachable_words (Obj.repr t154.str0) + Obj.reachable_words (Obj.repr t154.str1) + 3) "Reachable words 154"; + check_reachable_words (Obj.reachable_words (Obj.repr t155)) (3 + 2 + 3) "Reachable words 155"; + check_reachable_words (Obj.reachable_words (Obj.repr t156)) (3 + 2 + 3) "Reachable words 156"; + check_reachable_words (Obj.reachable_words (Obj.repr t157)) (4 + Obj.reachable_words (Obj.repr t157.str0) + 2) "Reachable words 157"; + check_reachable_words (Obj.reachable_words (Obj.repr t158)) (4 + Obj.reachable_words (Obj.repr t158.str0) + 2) "Reachable words 158"; + check_reachable_words (Obj.reachable_words (Obj.repr t159)) (3 + 3) "Reachable words 159"; + check_reachable_words (Obj.reachable_words (Obj.repr t160)) (4 + 2 + Obj.reachable_words (Obj.repr t160.str1) + 2) "Reachable words 160"; + check_reachable_words (Obj.reachable_words (Obj.repr t161)) (4 + Obj.reachable_words (Obj.repr t161.str0) + Obj.reachable_words (Obj.repr t161.str1) + 2) "Reachable words 161"; + check_reachable_words (Obj.reachable_words (Obj.repr t162)) (4 + Obj.reachable_words (Obj.repr t162.str0) + Obj.reachable_words (Obj.repr t162.str1) + 3) "Reachable words 162"; + check_reachable_words (Obj.reachable_words (Obj.repr t163)) (4 + Obj.reachable_words (Obj.repr t163.str1) + 3) "Reachable words 163"; + check_reachable_words (Obj.reachable_words (Obj.repr t164)) (4 + Obj.reachable_words (Obj.repr t164.str1) + 3) "Reachable words 164"; + check_reachable_words (Obj.reachable_words (Obj.repr t165)) (4 + 2 + Obj.reachable_words (Obj.repr t165.str1) + 3) "Reachable words 165"; + check_reachable_words (Obj.reachable_words (Obj.repr t166)) (4 + 2 + Obj.reachable_words (Obj.repr t166.str1) + 3) "Reachable words 166"; + check_reachable_words (Obj.reachable_words (Obj.repr t167)) (4 + Obj.reachable_words (Obj.repr t167.str0) + Obj.reachable_words (Obj.repr t167.str1) + 3) "Reachable words 167"; + check_reachable_words (Obj.reachable_words (Obj.repr t168)) (4 + Obj.reachable_words (Obj.repr t168.str0) + Obj.reachable_words (Obj.repr t168.str1) + 3) "Reachable words 168"; + check_reachable_words (Obj.reachable_words (Obj.repr t169)) (3 + 2 + 3) "Reachable words 169"; + check_reachable_words (Obj.reachable_words (Obj.repr t170)) (4 + 2 + 2) "Reachable words 170"; + check_reachable_words (Obj.reachable_words (Obj.repr t171)) (4 + Obj.reachable_words (Obj.repr t171.str0) + 2) "Reachable words 171"; + check_reachable_words (Obj.reachable_words (Obj.repr t172)) (4 + Obj.reachable_words (Obj.repr t172.str0) + 3) "Reachable words 172"; + check_reachable_words (Obj.reachable_words (Obj.repr t173)) (3 + 3) "Reachable words 173"; + check_reachable_words (Obj.reachable_words (Obj.repr t174)) (4 + 2 + Obj.reachable_words (Obj.repr t174.str1) + 2) "Reachable words 174"; + check_reachable_words (Obj.reachable_words (Obj.repr t175)) (4 + 2 + Obj.reachable_words (Obj.repr t175.str1) + 2) "Reachable words 175"; + check_reachable_words (Obj.reachable_words (Obj.repr t176)) (4 + Obj.reachable_words (Obj.repr t176.str0) + Obj.reachable_words (Obj.repr t176.str1) + 3) "Reachable words 176"; + check_reachable_words (Obj.reachable_words (Obj.repr t177)) (4 + Obj.reachable_words (Obj.repr t177.str0) + Obj.reachable_words (Obj.repr t177.str1) + 3) "Reachable words 177"; + check_reachable_words (Obj.reachable_words (Obj.repr t178)) (4 + Obj.reachable_words (Obj.repr t178.str1) + 3) "Reachable words 178"; + check_reachable_words (Obj.reachable_words (Obj.repr t179)) (4 + Obj.reachable_words (Obj.repr t179.str1) + 3) "Reachable words 179"; + check_reachable_words (Obj.reachable_words (Obj.repr t180)) (4 + 2 + Obj.reachable_words (Obj.repr t180.str1) + 3) "Reachable words 180"; + check_reachable_words (Obj.reachable_words (Obj.repr t181)) (4 + 2 + Obj.reachable_words (Obj.repr t181.str1) + 3) "Reachable words 181"; + check_reachable_words (Obj.reachable_words (Obj.repr t182)) (4 + Obj.reachable_words (Obj.repr t182.str0) + Obj.reachable_words (Obj.repr t182.str1) + 3) "Reachable words 182"; + check_reachable_words (Obj.reachable_words (Obj.repr t183)) (4 + Obj.reachable_words (Obj.repr t183.str0) + Obj.reachable_words (Obj.repr t183.str1) + 3) "Reachable words 183"; + check_reachable_words (Obj.reachable_words (Obj.repr t184)) (4 + 2 + 2) "Reachable words 184"; + check_reachable_words (Obj.reachable_words (Obj.repr t185)) (4 + 2 + 2) "Reachable words 185"; + check_reachable_words (Obj.reachable_words (Obj.repr t186)) (4 + Obj.reachable_words (Obj.repr t186.str0) + 3) "Reachable words 186"; + check_reachable_words (Obj.reachable_words (Obj.repr t187)) (4 + Obj.reachable_words (Obj.repr t187.str0) + 3) "Reachable words 187"; + check_reachable_words (Obj.reachable_words (Obj.repr t188)) (3 + 3) "Reachable words 188"; + check_reachable_words (Obj.reachable_words (Obj.repr t189)) (4 + Obj.reachable_words (Obj.repr t189.str1) + 2) "Reachable words 189"; + check_reachable_words (Obj.reachable_words (Obj.repr t190)) (4 + 2 + Obj.reachable_words (Obj.repr t190.str1) + 2) "Reachable words 190"; + check_reachable_words (Obj.reachable_words (Obj.repr t191)) (4 + 2 + Obj.reachable_words (Obj.repr t191.str1) + 3) "Reachable words 191"; + check_reachable_words (Obj.reachable_words (Obj.repr t192)) (4 + Obj.reachable_words (Obj.repr t192.str0) + Obj.reachable_words (Obj.repr t192.str1) + 3) "Reachable words 192"; + check_reachable_words (Obj.reachable_words (Obj.repr t193)) (4 + Obj.reachable_words (Obj.repr t193.str0) + Obj.reachable_words (Obj.repr t193.str1) + 3) "Reachable words 193"; + check_reachable_words (Obj.reachable_words (Obj.repr t194)) (4 + Obj.reachable_words (Obj.repr t194.str1) + 3) "Reachable words 194"; + check_reachable_words (Obj.reachable_words (Obj.repr t195)) (4 + Obj.reachable_words (Obj.repr t195.str1) + 3) "Reachable words 195"; + check_reachable_words (Obj.reachable_words (Obj.repr t196)) (4 + 2 + Obj.reachable_words (Obj.repr t196.str1) + 3) "Reachable words 196"; + check_reachable_words (Obj.reachable_words (Obj.repr t197)) (4 + 2 + Obj.reachable_words (Obj.repr t197.str1) + 3) "Reachable words 197"; + check_reachable_words (Obj.reachable_words (Obj.repr t198)) (4 + Obj.reachable_words (Obj.repr t198.str0) + Obj.reachable_words (Obj.repr t198.str1) + 3) "Reachable words 198"; + check_reachable_words (Obj.reachable_words (Obj.repr t199)) (5 + Obj.reachable_words (Obj.repr t199.str0) + Obj.reachable_words (Obj.repr t199.str1) + 2) "Reachable words 199"; + check_reachable_words (Obj.reachable_words (Obj.repr t200)) (4 + 2 + 2) "Reachable words 200"; + check_reachable_words (Obj.reachable_words (Obj.repr t201)) (4 + 2 + 3) "Reachable words 201"; + check_reachable_words (Obj.reachable_words (Obj.repr t202)) (4 + Obj.reachable_words (Obj.repr t202.str0) + 3) "Reachable words 202"; + check_reachable_words (Obj.reachable_words (Obj.repr t203)) (4 + Obj.reachable_words (Obj.repr t203.str0) + 3) "Reachable words 203"; + check_reachable_words (Obj.reachable_words (Obj.repr t204)) (3 + 3) "Reachable words 204"; + check_reachable_words (Obj.reachable_words (Obj.repr t205)) (4 + Obj.reachable_words (Obj.repr t205.str1) + 2) "Reachable words 205"; + check_reachable_words (Obj.reachable_words (Obj.repr t206)) (4 + Obj.reachable_words (Obj.repr t206.str1) + 2) "Reachable words 206"; + check_reachable_words (Obj.reachable_words (Obj.repr t207)) (4 + 2 + Obj.reachable_words (Obj.repr t207.str1) + 3) "Reachable words 207"; + check_reachable_words (Obj.reachable_words (Obj.repr t208)) (4 + 2 + Obj.reachable_words (Obj.repr t208.str1) + 3) "Reachable words 208"; + check_reachable_words (Obj.reachable_words (Obj.repr t209)) (4 + Obj.reachable_words (Obj.repr t209.str0) + Obj.reachable_words (Obj.repr t209.str1) + 3) "Reachable words 209"; + check_reachable_words (Obj.reachable_words (Obj.repr t210)) (4 + Obj.reachable_words (Obj.repr t210.str0) + Obj.reachable_words (Obj.repr t210.str1) + 3) "Reachable words 210"; + check_reachable_words (Obj.reachable_words (Obj.repr t211)) (4 + Obj.reachable_words (Obj.repr t211.str1) + 3) "Reachable words 211"; + check_reachable_words (Obj.reachable_words (Obj.repr t212)) (4 + Obj.reachable_words (Obj.repr t212.str1) + 3) "Reachable words 212"; + check_reachable_words (Obj.reachable_words (Obj.repr t213)) (4 + 2 + Obj.reachable_words (Obj.repr t213.str1) + 3) "Reachable words 213"; + check_reachable_words (Obj.reachable_words (Obj.repr t214)) (4 + 2 + Obj.reachable_words (Obj.repr t214.str1) + 3) "Reachable words 214"; + check_reachable_words (Obj.reachable_words (Obj.repr t215)) (5 + Obj.reachable_words (Obj.repr t215.str0) + Obj.reachable_words (Obj.repr t215.str1) + 2) "Reachable words 215"; + check_reachable_words (Obj.reachable_words (Obj.repr t216)) (5 + Obj.reachable_words (Obj.repr t216.str0) + Obj.reachable_words (Obj.repr t216.str1) + 2) "Reachable words 216"; + check_reachable_words (Obj.reachable_words (Obj.repr t217)) (4 + 2 + 3) "Reachable words 217"; + check_reachable_words (Obj.reachable_words (Obj.repr t218)) (4 + 2 + 3) "Reachable words 218"; + check_reachable_words (Obj.reachable_words (Obj.repr t219)) (4 + Obj.reachable_words (Obj.repr t219.str0) + 3) "Reachable words 219"; + check_reachable_words (Obj.reachable_words (Obj.repr t220)) (4 + Obj.reachable_words (Obj.repr t220.str0) + 3) "Reachable words 220"; + check_reachable_words (Obj.reachable_words (Obj.repr t221)) (3 + 3) "Reachable words 221"; + check_reachable_words (Obj.reachable_words (Obj.repr t222)) (4 + Obj.reachable_words (Obj.repr t222.str0) + 2 + 2) "Reachable words 222"; + check_reachable_words (Obj.reachable_words (Obj.repr t223)) (4 + Obj.reachable_words (Obj.repr t223.str1) + 2) "Reachable words 223"; + check_reachable_words (Obj.reachable_words (Obj.repr t224)) (4 + Obj.reachable_words (Obj.repr t224.str1) + 3) "Reachable words 224"; + check_reachable_words (Obj.reachable_words (Obj.repr t225)) (4 + 2 + Obj.reachable_words (Obj.repr t225.str1) + 3) "Reachable words 225"; + check_reachable_words (Obj.reachable_words (Obj.repr t226)) (4 + 2 + Obj.reachable_words (Obj.repr t226.str1) + 3) "Reachable words 226"; + check_reachable_words (Obj.reachable_words (Obj.repr t227)) (4 + Obj.reachable_words (Obj.repr t227.str0) + Obj.reachable_words (Obj.repr t227.str1) + 3) "Reachable words 227"; + check_reachable_words (Obj.reachable_words (Obj.repr t228)) (4 + Obj.reachable_words (Obj.repr t228.str0) + Obj.reachable_words (Obj.repr t228.str1) + 3) "Reachable words 228"; + check_reachable_words (Obj.reachable_words (Obj.repr t229)) (4 + Obj.reachable_words (Obj.repr t229.str1) + 3) "Reachable words 229"; + check_reachable_words (Obj.reachable_words (Obj.repr t230)) (4 + Obj.reachable_words (Obj.repr t230.str1) + 3) "Reachable words 230"; + check_reachable_words (Obj.reachable_words (Obj.repr t231)) (4 + 2 + Obj.reachable_words (Obj.repr t231.str1) + 3) "Reachable words 231"; + check_reachable_words (Obj.reachable_words (Obj.repr t232)) (5 + 2 + Obj.reachable_words (Obj.repr t232.str1) + 2) "Reachable words 232"; + check_reachable_words (Obj.reachable_words (Obj.repr t233)) (5 + Obj.reachable_words (Obj.repr t233.str0) + Obj.reachable_words (Obj.repr t233.str1) + 2) "Reachable words 233"; + check_reachable_words (Obj.reachable_words (Obj.repr t234)) (5 + Obj.reachable_words (Obj.repr t234.str0) + Obj.reachable_words (Obj.repr t234.str1) + 3) "Reachable words 234"; + check_reachable_words (Obj.reachable_words (Obj.repr t235)) (4 + 2 + 3) "Reachable words 235"; + check_reachable_words (Obj.reachable_words (Obj.repr t236)) (4 + 2 + 3) "Reachable words 236"; + check_reachable_words (Obj.reachable_words (Obj.repr t237)) (4 + Obj.reachable_words (Obj.repr t237.str0) + 3) "Reachable words 237"; + check_reachable_words (Obj.reachable_words (Obj.repr t238)) (4 + Obj.reachable_words (Obj.repr t238.str0) + 3) "Reachable words 238"; + check_reachable_words (Obj.reachable_words (Obj.repr t239)) (3 + 3) "Reachable words 239"; + check_reachable_words (Obj.reachable_words (Obj.repr t240)) (4 + Obj.reachable_words (Obj.repr t240.str0) + 2 + 2) "Reachable words 240"; + check_reachable_words (Obj.reachable_words (Obj.repr t241)) (4 + Obj.reachable_words (Obj.repr t241.str0) + 2 + 2) "Reachable words 241"; + check_reachable_words (Obj.reachable_words (Obj.repr t242)) (4 + Obj.reachable_words (Obj.repr t242.str1) + 3) "Reachable words 242"; + check_reachable_words (Obj.reachable_words (Obj.repr t243)) (4 + Obj.reachable_words (Obj.repr t243.str1) + 3) "Reachable words 243"; + check_reachable_words (Obj.reachable_words (Obj.repr t244)) (4 + 2 + Obj.reachable_words (Obj.repr t244.str1) + 3) "Reachable words 244"; + check_reachable_words (Obj.reachable_words (Obj.repr t245)) (4 + 2 + Obj.reachable_words (Obj.repr t245.str1) + 3) "Reachable words 245"; + check_reachable_words (Obj.reachable_words (Obj.repr t246)) (4 + Obj.reachable_words (Obj.repr t246.str0) + Obj.reachable_words (Obj.repr t246.str1) + 3) "Reachable words 246"; + check_reachable_words (Obj.reachable_words (Obj.repr t247)) (4 + Obj.reachable_words (Obj.repr t247.str0) + Obj.reachable_words (Obj.repr t247.str1) + 3) "Reachable words 247"; + check_reachable_words (Obj.reachable_words (Obj.repr t248)) (4 + Obj.reachable_words (Obj.repr t248.str1) + 3) "Reachable words 248"; + check_reachable_words (Obj.reachable_words (Obj.repr t249)) (4 + Obj.reachable_words (Obj.repr t249.str1) + 3) "Reachable words 249"; + check_reachable_words (Obj.reachable_words (Obj.repr t250)) (5 + 2 + Obj.reachable_words (Obj.repr t250.str1) + 2) "Reachable words 250"; + check_reachable_words (Obj.reachable_words (Obj.repr t251)) (5 + 2 + Obj.reachable_words (Obj.repr t251.str1) + 2) "Reachable words 251"; + check_reachable_words (Obj.reachable_words (Obj.repr t252)) (5 + Obj.reachable_words (Obj.repr t252.str0) + Obj.reachable_words (Obj.repr t252.str1) + 3) "Reachable words 252"; + check_reachable_words (Obj.reachable_words (Obj.repr t253)) (5 + Obj.reachable_words (Obj.repr t253.str0) + Obj.reachable_words (Obj.repr t253.str1) + 3) "Reachable words 253"; + check_reachable_words (Obj.reachable_words (Obj.repr t254)) (4 + 2 + 3) "Reachable words 254"; + check_reachable_words (Obj.reachable_words (Obj.repr t255)) (4 + 2 + 3) "Reachable words 255"; + check_reachable_words (Obj.reachable_words (Obj.repr t256)) (4 + Obj.reachable_words (Obj.repr t256.str0) + 3) "Reachable words 256"; + check_reachable_words (Obj.reachable_words (Obj.repr t257)) (4 + Obj.reachable_words (Obj.repr t257.str0) + 3) "Reachable words 257"; + check_reachable_words (Obj.reachable_words (Obj.repr t258)) (3 + 3) "Reachable words 258"; + check_reachable_words (Obj.reachable_words (Obj.repr t259)) (4 + Obj.reachable_words (Obj.repr t259.str0) + 2 + 2) "Reachable words 259"; + check_reachable_words (Obj.reachable_words (Obj.repr t260)) (4 + Obj.reachable_words (Obj.repr t260.str0) + 2 + 3) "Reachable words 260"; + check_reachable_words (Obj.reachable_words (Obj.repr t261)) (4 + Obj.reachable_words (Obj.repr t261.str1) + 3) "Reachable words 261"; + check_reachable_words (Obj.reachable_words (Obj.repr t262)) (4 + Obj.reachable_words (Obj.repr t262.str1) + 3) "Reachable words 262"; + check_reachable_words (Obj.reachable_words (Obj.repr t263)) (4 + 2 + Obj.reachable_words (Obj.repr t263.str1) + 3) "Reachable words 263"; + check_reachable_words (Obj.reachable_words (Obj.repr t264)) (4 + 2 + Obj.reachable_words (Obj.repr t264.str1) + 3) "Reachable words 264"; + check_reachable_words (Obj.reachable_words (Obj.repr t265)) (4 + Obj.reachable_words (Obj.repr t265.str0) + Obj.reachable_words (Obj.repr t265.str1) + 3) "Reachable words 265"; + check_reachable_words (Obj.reachable_words (Obj.repr t266)) (4 + Obj.reachable_words (Obj.repr t266.str0) + Obj.reachable_words (Obj.repr t266.str1) + 3) "Reachable words 266"; + check_reachable_words (Obj.reachable_words (Obj.repr t267)) (4 + Obj.reachable_words (Obj.repr t267.str1) + 3) "Reachable words 267"; + check_reachable_words (Obj.reachable_words (Obj.repr t268)) (5 + Obj.reachable_words (Obj.repr t268.str1) + 2) "Reachable words 268"; + check_reachable_words (Obj.reachable_words (Obj.repr t269)) (5 + 2 + Obj.reachable_words (Obj.repr t269.str1) + 2) "Reachable words 269"; + check_reachable_words (Obj.reachable_words (Obj.repr t270)) (5 + 2 + Obj.reachable_words (Obj.repr t270.str1) + 3) "Reachable words 270"; + check_reachable_words (Obj.reachable_words (Obj.repr t271)) (5 + Obj.reachable_words (Obj.repr t271.str0) + Obj.reachable_words (Obj.repr t271.str1) + 3) "Reachable words 271"; + check_reachable_words (Obj.reachable_words (Obj.repr t272)) (5 + Obj.reachable_words (Obj.repr t272.str0) + Obj.reachable_words (Obj.repr t272.str1) + 3) "Reachable words 272"; + check_reachable_words (Obj.reachable_words (Obj.repr t273)) (4 + 2 + 3) "Reachable words 273"; + check_reachable_words (Obj.reachable_words (Obj.repr t274)) (4 + 2 + 3) "Reachable words 274"; + check_reachable_words (Obj.reachable_words (Obj.repr t275)) (4 + Obj.reachable_words (Obj.repr t275.str0) + 3) "Reachable words 275"; + check_reachable_words (Obj.reachable_words (Obj.repr t276)) (4 + Obj.reachable_words (Obj.repr t276.str0) + 3) "Reachable words 276"; + check_reachable_words (Obj.reachable_words (Obj.repr t277)) (3 + 3) "Reachable words 277"; + check_reachable_words (Obj.reachable_words (Obj.repr t278)) (4 + Obj.reachable_words (Obj.repr t278.str0) + 2 + 3) "Reachable words 278"; + check_reachable_words (Obj.reachable_words (Obj.repr t279)) (4 + Obj.reachable_words (Obj.repr t279.str0) + 2 + 3) "Reachable words 279"; + check_reachable_words (Obj.reachable_words (Obj.repr t280)) (4 + Obj.reachable_words (Obj.repr t280.str1) + 3) "Reachable words 280"; + check_reachable_words (Obj.reachable_words (Obj.repr t281)) (4 + Obj.reachable_words (Obj.repr t281.str1) + 3) "Reachable words 281"; + check_reachable_words (Obj.reachable_words (Obj.repr t282)) (4 + 2 + Obj.reachable_words (Obj.repr t282.str1) + 3) "Reachable words 282"; + check_reachable_words (Obj.reachable_words (Obj.repr t283)) (4 + 2 + Obj.reachable_words (Obj.repr t283.str1) + 3) "Reachable words 283"; + check_reachable_words (Obj.reachable_words (Obj.repr t284)) (4 + Obj.reachable_words (Obj.repr t284.str0) + Obj.reachable_words (Obj.repr t284.str1) + 3) "Reachable words 284"; + check_reachable_words (Obj.reachable_words (Obj.repr t285)) (4 + Obj.reachable_words (Obj.repr t285.str0) + Obj.reachable_words (Obj.repr t285.str1) + 3) "Reachable words 285"; + check_reachable_words (Obj.reachable_words (Obj.repr t286)) (5 + Obj.reachable_words (Obj.repr t286.str1) + 2) "Reachable words 286"; + check_reachable_words (Obj.reachable_words (Obj.repr t287)) (5 + Obj.reachable_words (Obj.repr t287.str1) + 2) "Reachable words 287"; + check_reachable_words (Obj.reachable_words (Obj.repr t288)) (5 + 2 + Obj.reachable_words (Obj.repr t288.str1) + 3) "Reachable words 288"; + check_reachable_words (Obj.reachable_words (Obj.repr t289)) (5 + 2 + Obj.reachable_words (Obj.repr t289.str1) + 3) "Reachable words 289"; + check_reachable_words (Obj.reachable_words (Obj.repr t290)) (5 + Obj.reachable_words (Obj.repr t290.str0) + Obj.reachable_words (Obj.repr t290.str1) + 3) "Reachable words 290"; + check_reachable_words (Obj.reachable_words (Obj.repr t291)) (5 + Obj.reachable_words (Obj.repr t291.str0) + Obj.reachable_words (Obj.repr t291.str1) + 3) "Reachable words 291"; + check_reachable_words (Obj.reachable_words (Obj.repr t292)) (4 + 2 + 3) "Reachable words 292"; + check_reachable_words (Obj.reachable_words (Obj.repr t293)) (4 + 2 + 3) "Reachable words 293"; + check_reachable_words (Obj.reachable_words (Obj.repr t294)) (4 + Obj.reachable_words (Obj.repr t294.str0) + 3) "Reachable words 294"; + check_reachable_words (Obj.reachable_words (Obj.repr t295)) (4 + Obj.reachable_words (Obj.repr t295.str0) + 3) "Reachable words 295"; + check_reachable_words (Obj.reachable_words (Obj.repr t296)) (3 + 2) "Reachable words 296"; + check_reachable_words (Obj.reachable_words (Obj.repr t297)) (4 + 2 + 2) "Reachable words 297"; + check_reachable_words (Obj.reachable_words (Obj.repr t298)) (4 + 2 + 2 + 3) "Reachable words 298"; + check_reachable_words (Obj.reachable_words (Obj.repr t299)) (4 + Obj.reachable_words (Obj.repr t299.str0) + 2 + 3) "Reachable words 299"; + () +in +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 t81 t82 t83 t84 t85 t86 t87 t88 t89 t90 t91 t92 t93 t94 t95 t96 t97 t98 t99 t100 t101 t102 t103 t104 t105 t106 t107 t108 t109 t110 t111 t112 t113 t114 t115 t116 t117 t118 t119 t120 t121 t122 t123 t124 t125 t126 t127 t128 t129 t130 t131 t132 t133 t134 t135 t136 t137 t138 t139 t140 t141 t142 t143 t144 t145 t146 t147 t148 t149 t150 t151 t152 t153 t154 t155 t156 t157 t158 t159 t160 t161 t162 t163 t164 t165 t166 t167 t168 t169 t170 t171 t172 t173 t174 t175 t176 t177 t178 t179 t180 t181 t182 t183 t184 t185 t186 t187 t188 t189 t190 t191 t192 t193 t194 t195 t196 t197 t198 t199 t200 t201 t202 t203 t204 t205 t206 t207 t208 t209 t210 t211 t212 t213 t214 t215 t216 t217 t218 t219 t220 t221 t222 t223 t224 t225 t226 t227 t228 t229 t230 t231 t232 t233 t234 t235 t236 t237 t238 t239 t240 t241 t242 t243 t244 t245 t246 t247 t248 t249 t250 t251 t252 t253 t254 t255 t256 t257 t258 t259 t260 t261 t262 t263 t264 t265 t266 t267 t268 t269 t270 t271 t272 t273 t274 t275 t276 t277 t278 t279 t280 t281 t282 t283 t284 t285 t286 t287 t288 t289 t290 t291 t292 t293 t294 t295 t296 t297 t298 t299 t300_A t301_A t301_B t302_A t303_A t303_B t303_C t304_A t304_B t305_A t306_A t306_B t307_A t307_B t307_C t308_A t308_B t309_A t310_A t310_B t310_C t310_D t311_A t311_B t312_A t312_B t312_C t313_A t313_B t314_A t315_A t315_B t315_C t316_A t316_B t316_C t316_D t317_A t317_B t318_A t318_B t318_C t319_A t319_B t320_A t321_A t321_B t322_A t322_B t322_C t323_A t323_B t323_C t323_D t324_A t324_B t325_A t325_B t325_C t326_A t326_B t327_A t328_A t328_B t328_C t329_A t329_B t330_A t330_B t330_C t331_A t331_B t331_C t331_D t332_A t332_B t333_A t333_B t333_C t334_A t334_B t335_A t336_A t336_B t336_C t336_D t337_A t337_B t337_C t338_A t338_B t339_A t339_B t339_C t340_A t340_B t340_C t340_D t341_A t341_B t342_A t342_B t342_C t343_A t343_B t344_A t345_A t345_B t345_C t346_A t346_B t346_C t346_D t347_A t347_B t347_C t348_A t348_B t349_A t349_B t349_C t350_A t350_B t350_C t350_D t351_A t351_B t352_A t352_B t352_C t353_A t353_B t354_A t355_A t355_B t356_A t356_B t356_C t357_A t357_B t357_C t357_D t358_A t358_B t358_C t359_A t359_B t360_A t360_B t360_C t361_A t361_B t361_C t361_D t362_A t362_B t363_A t363_B t363_C t364_A t364_B t365_A t366_A t366_B t366_C t366_D t366_E t367_A t367_B t368_A t368_B t368_C t369_A t369_B t369_C t369_D t370_A t370_B t370_C t371_A t371_B t372_A t372_B t372_C t373_A t373_B t373_C t373_D t374_A t374_B t375_A t375_B t375_C t376_A t376_B t377_A t378_A t378_B t378_C t379_A t379_B t379_C t379_D t379_E t380_A t380_B t381_A t381_B t381_C t382_A t382_B t382_C t382_D t383_A t383_B t383_C t384_A t384_B t385_A t385_B t385_C t386_A t386_B t386_C t386_D t387_A t387_B t388_A t388_B t388_C t389_A t389_B t390_A t391_A t391_B t391_C t391_D t392_A t392_B t392_C t393_A t393_B t393_C t393_D t393_E t394_A t394_B t395_A t395_B t395_C t396_A t396_B t396_C t396_D t397_A t397_B t397_C t398_A t398_B t399_A t399_B t399_C t400_A t400_B t400_C t400_D t401_A t401_B t402_A t402_B t402_C t403_A t403_B t404_A t405_A t405_B t405_C t406_A t406_B t406_C t406_D t407_A t407_B t407_C t408_A t408_B t408_C t408_D t408_E t409_A t409_B t410_A t410_B t410_C t411_A t411_B t411_C t411_D t412_A t412_B t412_C t413_A t413_B t414_A t414_B t414_C t415_A t415_B t415_C t415_D t416_A t416_B t417_A t417_B t417_C t418_A t418_B t419_A t420_A t420_B t421_A t421_B t421_C t422_A t422_B t422_C t422_D t423_A t423_B t423_C t424_A t424_B t424_C t424_D t424_E t425_A t425_B t426_A t426_B t426_C t427_A t427_B t427_C t427_D t428_A t428_B t428_C t429_A t429_B t430_A t430_B t430_C t431_A t431_B t431_C t431_D t432_A t432_B t433_A t433_B t433_C t434_A t434_B t435_A t436_A t436_B t436_C t436_D t437_A t437_B t438_A t438_B t438_C t439_A t439_B t439_C t439_D t440_A t440_B t440_C t441_A t441_B t441_C t441_D t441_E t442_A t442_B t443_A t443_B t443_C t444_A t444_B t444_C t444_D t445_A t445_B t445_C t446_A t446_B t447_A t447_B t447_C t448_A t448_B t448_C t448_D t449_A t449_B t450_A t450_B t450_C t451_A t451_B t452_A t453_A t453_B t453_C t453_D t453_E t454_A t454_B t454_C t454_D t455_A t455_B t456_A t456_B t456_C t457_A t457_B t457_C t457_D t458_A t458_B t458_C t459_A t459_B t459_C t459_D t459_E t460_A t460_B t461_A t461_B t461_C t462_A t462_B t462_C t462_D t463_A t463_B t463_C t464_A t464_B t465_A t465_B t465_C t466_A t466_B t466_C t466_D t467_A t467_B t468_A t468_B t468_C t469_A t469_B t470_A t471_A t471_B t471_C t472_A t472_B t472_C t472_D t472_E t473_A t473_B t473_C t473_D t474_A t474_B t475_A t475_B t475_C t476_A t476_B t476_C t476_D t477_A t477_B t477_C t478_A t478_B t478_C t478_D t478_E t479_A t479_B t480_A t480_B t480_C t481_A t481_B t481_C t481_D t482_A t482_B t482_C t483_A t483_B t484_A t484_B t484_C t485_A t485_B t485_C t485_D t486_A t486_B t487_A t487_B t487_C t488_A t488_B t489_A t490_A t490_B t490_C t490_D t491_A t491_B t491_C t492_A t492_B t492_C t492_D t492_E t493_A t493_B t493_C t493_D t494_A t494_B t495_A t495_B t495_C t496_A t496_B t496_C t496_D t497_A t497_B t497_C t498_A t498_B t498_C t498_D t498_E t499_A t499_B t500_A t500_B t500_C t501_A t501_B t501_C t501_D t502_A t502_B t502_C t503_A t503_B t504_A t504_B t504_C t505_A t505_B t505_C t505_D t506_A t506_B t507_A t507_B t507_C t508_A t508_B t509_A t510_A t510_B t510_C t511_A t511_B t511_C t511_D t512_A t512_B t512_C t513_A t513_B t513_C t513_D t513_E t514_A t514_B t514_C t514_D t515_A t515_B t516_A t516_B t516_C t517_A t517_B t517_C t517_D t518_A t518_B t518_C t519_A t519_B t519_C t519_D t519_E t520_A t520_B t521_A t521_B t521_C t522_A t522_B t522_C t522_D t523_A t523_B t523_C t524_A t524_B t525_A t525_B t525_C t526_A t526_B t526_C t526_D t527_A t527_B t528_A t528_B t528_C t529_A t529_B t530_A t531_A t531_B t532_A t532_B t532_C t533_A t533_B t533_C t533_D t534_A t534_B t534_C t535_A t535_B t535_C t535_D t535_E t536_A t536_B t536_C t536_D t537_A t537_B t538_A t538_B t538_C t539_A t539_B t539_C t539_D t540_A t540_B t540_C t541_A t541_B t541_C t541_D t541_E t542_A t542_B t543_A t543_B t543_C t544_A t544_B t544_C t544_D t545_A t545_B t545_C t546_A t546_B t547_A t547_B t547_C t548_A t548_B t548_C t548_D t549_A t549_B t550_A t550_B t550_C t551_A t551_B t552_A t553_A t553_B t553_C t554_A t554_B t555_A t555_B t555_C t556_A t556_B t556_C t556_D t557_A t557_B t557_C t558_A t558_B t558_C t558_D t558_E t559_A t559_B t559_C t559_D t560_A t560_B t561_A t561_B t561_C t562_A t562_B t562_C t562_D t563_A t563_B t563_C t564_A t564_B t564_C t564_D t564_E t565_A t565_B t566_A t566_B t566_C t567_A t567_B t567_C t567_D t568_A t568_B t568_C t569_A t569_B t570_A t570_B t570_C t571_A t571_B t571_C t571_D t572_A t572_B t573_A t573_B t573_C t574_A t574_B t575_A t576_A t576_B t576_C t576_D t577_A t577_B t577_C t578_A t578_B t579_A t579_B t579_C t580_A t580_B t580_C t580_D t581_A t581_B t581_C t582_A t582_B t582_C t582_D t582_E t583_A t583_B t583_C t583_D t584_A t584_B t585_A t585_B t585_C t586_A t586_B t586_C t586_D t587_A t587_B t587_C t588_A t588_B t588_C t588_D t588_E t589_A t589_B t590_A t590_B t590_C t591_A t591_B t591_C t591_D t592_A t592_B t592_C t593_A t593_B t594_A t594_B t594_C t595_A t595_B t595_C t595_D t596_A t596_B t597_A t597_B t597_C t598_A t598_B t599_A in +print_endline " - Doing GC"; +Gc.full_major (); +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 t81 t82 t83 t84 t85 t86 t87 t88 t89 t90 t91 t92 t93 t94 t95 t96 t97 t98 t99 t100 t101 t102 t103 t104 t105 t106 t107 t108 t109 t110 t111 t112 t113 t114 t115 t116 t117 t118 t119 t120 t121 t122 t123 t124 t125 t126 t127 t128 t129 t130 t131 t132 t133 t134 t135 t136 t137 t138 t139 t140 t141 t142 t143 t144 t145 t146 t147 t148 t149 t150 t151 t152 t153 t154 t155 t156 t157 t158 t159 t160 t161 t162 t163 t164 t165 t166 t167 t168 t169 t170 t171 t172 t173 t174 t175 t176 t177 t178 t179 t180 t181 t182 t183 t184 t185 t186 t187 t188 t189 t190 t191 t192 t193 t194 t195 t196 t197 t198 t199 t200 t201 t202 t203 t204 t205 t206 t207 t208 t209 t210 t211 t212 t213 t214 t215 t216 t217 t218 t219 t220 t221 t222 t223 t224 t225 t226 t227 t228 t229 t230 t231 t232 t233 t234 t235 t236 t237 t238 t239 t240 t241 t242 t243 t244 t245 t246 t247 t248 t249 t250 t251 t252 t253 t254 t255 t256 t257 t258 t259 t260 t261 t262 t263 t264 t265 t266 t267 t268 t269 t270 t271 t272 t273 t274 t275 t276 t277 t278 t279 t280 t281 t282 t283 t284 t285 t286 t287 t288 t289 t290 t291 t292 t293 t294 t295 t296 t297 t298 t299 t300_A t301_A t301_B t302_A t303_A t303_B t303_C t304_A t304_B t305_A t306_A t306_B t307_A t307_B t307_C t308_A t308_B t309_A t310_A t310_B t310_C t310_D t311_A t311_B t312_A t312_B t312_C t313_A t313_B t314_A t315_A t315_B t315_C t316_A t316_B t316_C t316_D t317_A t317_B t318_A t318_B t318_C t319_A t319_B t320_A t321_A t321_B t322_A t322_B t322_C t323_A t323_B t323_C t323_D t324_A t324_B t325_A t325_B t325_C t326_A t326_B t327_A t328_A t328_B t328_C t329_A t329_B t330_A t330_B t330_C t331_A t331_B t331_C t331_D t332_A t332_B t333_A t333_B t333_C t334_A t334_B t335_A t336_A t336_B t336_C t336_D t337_A t337_B t337_C t338_A t338_B t339_A t339_B t339_C t340_A t340_B t340_C t340_D t341_A t341_B t342_A t342_B t342_C t343_A t343_B t344_A t345_A t345_B t345_C t346_A t346_B t346_C t346_D t347_A t347_B t347_C t348_A t348_B t349_A t349_B t349_C t350_A t350_B t350_C t350_D t351_A t351_B t352_A t352_B t352_C t353_A t353_B t354_A t355_A t355_B t356_A t356_B t356_C t357_A t357_B t357_C t357_D t358_A t358_B t358_C t359_A t359_B t360_A t360_B t360_C t361_A t361_B t361_C t361_D t362_A t362_B t363_A t363_B t363_C t364_A t364_B t365_A t366_A t366_B t366_C t366_D t366_E t367_A t367_B t368_A t368_B t368_C t369_A t369_B t369_C t369_D t370_A t370_B t370_C t371_A t371_B t372_A t372_B t372_C t373_A t373_B t373_C t373_D t374_A t374_B t375_A t375_B t375_C t376_A t376_B t377_A t378_A t378_B t378_C t379_A t379_B t379_C t379_D t379_E t380_A t380_B t381_A t381_B t381_C t382_A t382_B t382_C t382_D t383_A t383_B t383_C t384_A t384_B t385_A t385_B t385_C t386_A t386_B t386_C t386_D t387_A t387_B t388_A t388_B t388_C t389_A t389_B t390_A t391_A t391_B t391_C t391_D t392_A t392_B t392_C t393_A t393_B t393_C t393_D t393_E t394_A t394_B t395_A t395_B t395_C t396_A t396_B t396_C t396_D t397_A t397_B t397_C t398_A t398_B t399_A t399_B t399_C t400_A t400_B t400_C t400_D t401_A t401_B t402_A t402_B t402_C t403_A t403_B t404_A t405_A t405_B t405_C t406_A t406_B t406_C t406_D t407_A t407_B t407_C t408_A t408_B t408_C t408_D t408_E t409_A t409_B t410_A t410_B t410_C t411_A t411_B t411_C t411_D t412_A t412_B t412_C t413_A t413_B t414_A t414_B t414_C t415_A t415_B t415_C t415_D t416_A t416_B t417_A t417_B t417_C t418_A t418_B t419_A t420_A t420_B t421_A t421_B t421_C t422_A t422_B t422_C t422_D t423_A t423_B t423_C t424_A t424_B t424_C t424_D t424_E t425_A t425_B t426_A t426_B t426_C t427_A t427_B t427_C t427_D t428_A t428_B t428_C t429_A t429_B t430_A t430_B t430_C t431_A t431_B t431_C t431_D t432_A t432_B t433_A t433_B t433_C t434_A t434_B t435_A t436_A t436_B t436_C t436_D t437_A t437_B t438_A t438_B t438_C t439_A t439_B t439_C t439_D t440_A t440_B t440_C t441_A t441_B t441_C t441_D t441_E t442_A t442_B t443_A t443_B t443_C t444_A t444_B t444_C t444_D t445_A t445_B t445_C t446_A t446_B t447_A t447_B t447_C t448_A t448_B t448_C t448_D t449_A t449_B t450_A t450_B t450_C t451_A t451_B t452_A t453_A t453_B t453_C t453_D t453_E t454_A t454_B t454_C t454_D t455_A t455_B t456_A t456_B t456_C t457_A t457_B t457_C t457_D t458_A t458_B t458_C t459_A t459_B t459_C t459_D t459_E t460_A t460_B t461_A t461_B t461_C t462_A t462_B t462_C t462_D t463_A t463_B t463_C t464_A t464_B t465_A t465_B t465_C t466_A t466_B t466_C t466_D t467_A t467_B t468_A t468_B t468_C t469_A t469_B t470_A t471_A t471_B t471_C t472_A t472_B t472_C t472_D t472_E t473_A t473_B t473_C t473_D t474_A t474_B t475_A t475_B t475_C t476_A t476_B t476_C t476_D t477_A t477_B t477_C t478_A t478_B t478_C t478_D t478_E t479_A t479_B t480_A t480_B t480_C t481_A t481_B t481_C t481_D t482_A t482_B t482_C t483_A t483_B t484_A t484_B t484_C t485_A t485_B t485_C t485_D t486_A t486_B t487_A t487_B t487_C t488_A t488_B t489_A t490_A t490_B t490_C t490_D t491_A t491_B t491_C t492_A t492_B t492_C t492_D t492_E t493_A t493_B t493_C t493_D t494_A t494_B t495_A t495_B t495_C t496_A t496_B t496_C t496_D t497_A t497_B t497_C t498_A t498_B t498_C t498_D t498_E t499_A t499_B t500_A t500_B t500_C t501_A t501_B t501_C t501_D t502_A t502_B t502_C t503_A t503_B t504_A t504_B t504_C t505_A t505_B t505_C t505_D t506_A t506_B t507_A t507_B t507_C t508_A t508_B t509_A t510_A t510_B t510_C t511_A t511_B t511_C t511_D t512_A t512_B t512_C t513_A t513_B t513_C t513_D t513_E t514_A t514_B t514_C t514_D t515_A t515_B t516_A t516_B t516_C t517_A t517_B t517_C t517_D t518_A t518_B t518_C t519_A t519_B t519_C t519_D t519_E t520_A t520_B t521_A t521_B t521_C t522_A t522_B t522_C t522_D t523_A t523_B t523_C t524_A t524_B t525_A t525_B t525_C t526_A t526_B t526_C t526_D t527_A t527_B t528_A t528_B t528_C t529_A t529_B t530_A t531_A t531_B t532_A t532_B t532_C t533_A t533_B t533_C t533_D t534_A t534_B t534_C t535_A t535_B t535_C t535_D t535_E t536_A t536_B t536_C t536_D t537_A t537_B t538_A t538_B t538_C t539_A t539_B t539_C t539_D t540_A t540_B t540_C t541_A t541_B t541_C t541_D t541_E t542_A t542_B t543_A t543_B t543_C t544_A t544_B t544_C t544_D t545_A t545_B t545_C t546_A t546_B t547_A t547_B t547_C t548_A t548_B t548_C t548_D t549_A t549_B t550_A t550_B t550_C t551_A t551_B t552_A t553_A t553_B t553_C t554_A t554_B t555_A t555_B t555_C t556_A t556_B t556_C t556_D t557_A t557_B t557_C t558_A t558_B t558_C t558_D t558_E t559_A t559_B t559_C t559_D t560_A t560_B t561_A t561_B t561_C t562_A t562_B t562_C t562_D t563_A t563_B t563_C t564_A t564_B t564_C t564_D t564_E t565_A t565_B t566_A t566_B t566_C t567_A t567_B t567_C t567_D t568_A t568_B t568_C t569_A t569_B t570_A t570_B t570_C t571_A t571_B t571_C t571_D t572_A t572_B t573_A t573_B t573_C t574_A t574_B t575_A t576_A t576_B t576_C t576_D t577_A t577_B t577_C t578_A t578_B t579_A t579_B t579_C t580_A t580_B t580_C t580_D t581_A t581_B t581_C t582_A t582_B t582_C t582_D t582_E t583_A t583_B t583_C t583_D t584_A t584_B t585_A t585_B t585_C t586_A t586_B t586_C t586_D t587_A t587_B t587_C t588_A t588_B t588_C t588_D t588_E t589_A t589_B t590_A t590_B t590_C t591_A t591_B t591_C t591_D t592_A t592_B t592_C t593_A t593_B t594_A t594_B t594_C t595_A t595_B t595_C t595_D t596_A t596_B t597_A t597_B t597_C t598_A t598_B t599_A in +print_endline "Copying values via [Stdlib.Weak]"; +let t0 : t0 = copy_via_weak t0 in +let t1 : t1 = copy_via_weak t1 in +let t2 : t2 = copy_via_weak t2 in +let t3 : t3 = copy_via_weak t3 in +let t4 : t4 = copy_via_weak t4 in +let t5 : t5 = copy_via_weak t5 in +let t6 : t6 = copy_via_weak t6 in +let t7 : t7 = copy_via_weak t7 in +let t8 : t8 = copy_via_weak t8 in +let t9 : t9 = copy_via_weak t9 in +let t10 : t10 = copy_via_weak t10 in +let t11 : t11 = copy_via_weak t11 in +let t12 : t12 = copy_via_weak t12 in +let t13 : t13 = copy_via_weak t13 in +let t14 : t14 = copy_via_weak t14 in +let t15 : t15 = copy_via_weak t15 in +let t16 : t16 = copy_via_weak t16 in +let t17 : t17 = copy_via_weak t17 in +let t18 : t18 = copy_via_weak t18 in +let t19 : t19 = copy_via_weak t19 in +let t20 : t20 = copy_via_weak t20 in +let t21 : t21 = copy_via_weak t21 in +let t22 : t22 = copy_via_weak t22 in +let t23 : t23 = copy_via_weak t23 in +let t24 : t24 = copy_via_weak t24 in +let t25 : t25 = copy_via_weak t25 in +let t26 : t26 = copy_via_weak t26 in +let t27 : t27 = copy_via_weak t27 in +let t28 : t28 = copy_via_weak t28 in +let t29 : t29 = copy_via_weak t29 in +let t30 : t30 = copy_via_weak t30 in +let t31 : t31 = copy_via_weak t31 in +let t32 : t32 = copy_via_weak t32 in +let t33 : t33 = copy_via_weak t33 in +let t34 : t34 = copy_via_weak t34 in +let t35 : t35 = copy_via_weak t35 in +let t36 : t36 = copy_via_weak t36 in +let t37 : t37 = copy_via_weak t37 in +let t38 : t38 = copy_via_weak t38 in +let t39 : t39 = copy_via_weak t39 in +let t40 : t40 = copy_via_weak t40 in +let t41 : t41 = copy_via_weak t41 in +let t42 : t42 = copy_via_weak t42 in +let t43 : t43 = copy_via_weak t43 in +let t44 : t44 = copy_via_weak t44 in +let t45 : t45 = copy_via_weak t45 in +let t46 : t46 = copy_via_weak t46 in +let t47 : t47 = copy_via_weak t47 in +let t48 : t48 = copy_via_weak t48 in +let t49 : t49 = copy_via_weak t49 in +let t50 : t50 = copy_via_weak t50 in +let t51 : t51 = copy_via_weak t51 in +let t52 : t52 = copy_via_weak t52 in +let t53 : t53 = copy_via_weak t53 in +let t54 : t54 = copy_via_weak t54 in +let t55 : t55 = copy_via_weak t55 in +let t56 : t56 = copy_via_weak t56 in +let t57 : t57 = copy_via_weak t57 in +let t58 : t58 = copy_via_weak t58 in +let t59 : t59 = copy_via_weak t59 in +let t60 : t60 = copy_via_weak t60 in +let t61 : t61 = copy_via_weak t61 in +let t62 : t62 = copy_via_weak t62 in +let t63 : t63 = copy_via_weak t63 in +let t64 : t64 = copy_via_weak t64 in +let t65 : t65 = copy_via_weak t65 in +let t66 : t66 = copy_via_weak t66 in +let t67 : t67 = copy_via_weak t67 in +let t68 : t68 = copy_via_weak t68 in +let t69 : t69 = copy_via_weak t69 in +let t70 : t70 = copy_via_weak t70 in +let t71 : t71 = copy_via_weak t71 in +let t72 : t72 = copy_via_weak t72 in +let t73 : t73 = copy_via_weak t73 in +let t74 : t74 = copy_via_weak t74 in +let t75 : t75 = copy_via_weak t75 in +let t76 : t76 = copy_via_weak t76 in +let t77 : t77 = copy_via_weak t77 in +let t78 : t78 = copy_via_weak t78 in +let t79 : t79 = copy_via_weak t79 in +let t80 : t80 = copy_via_weak t80 in +let t81 : t81 = copy_via_weak t81 in +let t82 : t82 = copy_via_weak t82 in +let t83 : t83 = copy_via_weak t83 in +let t84 : t84 = copy_via_weak t84 in +let t85 : t85 = copy_via_weak t85 in +let t86 : t86 = copy_via_weak t86 in +let t87 : t87 = copy_via_weak t87 in +let t88 : t88 = copy_via_weak t88 in +let t89 : t89 = copy_via_weak t89 in +let t90 : t90 = copy_via_weak t90 in +let t91 : t91 = copy_via_weak t91 in +let t92 : t92 = copy_via_weak t92 in +let t93 : t93 = copy_via_weak t93 in +let t94 : t94 = copy_via_weak t94 in +let t95 : t95 = copy_via_weak t95 in +let t96 : t96 = copy_via_weak t96 in +let t97 : t97 = copy_via_weak t97 in +let t98 : t98 = copy_via_weak t98 in +let t99 : t99 = copy_via_weak t99 in +let t100 : t100 = copy_via_weak t100 in +let t101 : t101 = copy_via_weak t101 in +let t102 : t102 = copy_via_weak t102 in +let t103 : t103 = copy_via_weak t103 in +let t104 : t104 = copy_via_weak t104 in +let t105 : t105 = copy_via_weak t105 in +let t106 : t106 = copy_via_weak t106 in +let t107 : t107 = copy_via_weak t107 in +let t108 : t108 = copy_via_weak t108 in +let t109 : t109 = copy_via_weak t109 in +let t110 : t110 = copy_via_weak t110 in +let t111 : t111 = copy_via_weak t111 in +let t112 : t112 = copy_via_weak t112 in +let t113 : t113 = copy_via_weak t113 in +let t114 : t114 = copy_via_weak t114 in +let t115 : t115 = copy_via_weak t115 in +let t116 : t116 = copy_via_weak t116 in +let t117 : t117 = copy_via_weak t117 in +let t118 : t118 = copy_via_weak t118 in +let t119 : t119 = copy_via_weak t119 in +let t120 : t120 = copy_via_weak t120 in +let t121 : t121 = copy_via_weak t121 in +let t122 : t122 = copy_via_weak t122 in +let t123 : t123 = copy_via_weak t123 in +let t124 : t124 = copy_via_weak t124 in +let t125 : t125 = copy_via_weak t125 in +let t126 : t126 = copy_via_weak t126 in +let t127 : t127 = copy_via_weak t127 in +let t128 : t128 = copy_via_weak t128 in +let t129 : t129 = copy_via_weak t129 in +let t130 : t130 = copy_via_weak t130 in +let t131 : t131 = copy_via_weak t131 in +let t132 : t132 = copy_via_weak t132 in +let t133 : t133 = copy_via_weak t133 in +let t134 : t134 = copy_via_weak t134 in +let t135 : t135 = copy_via_weak t135 in +let t136 : t136 = copy_via_weak t136 in +let t137 : t137 = copy_via_weak t137 in +let t138 : t138 = copy_via_weak t138 in +let t139 : t139 = copy_via_weak t139 in +let t140 : t140 = copy_via_weak t140 in +let t141 : t141 = copy_via_weak t141 in +let t142 : t142 = copy_via_weak t142 in +let t143 : t143 = copy_via_weak t143 in +let t144 : t144 = copy_via_weak t144 in +let t145 : t145 = copy_via_weak t145 in +let t146 : t146 = copy_via_weak t146 in +let t147 : t147 = copy_via_weak t147 in +let t148 : t148 = copy_via_weak t148 in +let t149 : t149 = copy_via_weak t149 in +let t150 : t150 = copy_via_weak t150 in +let t151 : t151 = copy_via_weak t151 in +let t152 : t152 = copy_via_weak t152 in +let t153 : t153 = copy_via_weak t153 in +let t154 : t154 = copy_via_weak t154 in +let t155 : t155 = copy_via_weak t155 in +let t156 : t156 = copy_via_weak t156 in +let t157 : t157 = copy_via_weak t157 in +let t158 : t158 = copy_via_weak t158 in +let t159 : t159 = copy_via_weak t159 in +let t160 : t160 = copy_via_weak t160 in +let t161 : t161 = copy_via_weak t161 in +let t162 : t162 = copy_via_weak t162 in +let t163 : t163 = copy_via_weak t163 in +let t164 : t164 = copy_via_weak t164 in +let t165 : t165 = copy_via_weak t165 in +let t166 : t166 = copy_via_weak t166 in +let t167 : t167 = copy_via_weak t167 in +let t168 : t168 = copy_via_weak t168 in +let t169 : t169 = copy_via_weak t169 in +let t170 : t170 = copy_via_weak t170 in +let t171 : t171 = copy_via_weak t171 in +let t172 : t172 = copy_via_weak t172 in +let t173 : t173 = copy_via_weak t173 in +let t174 : t174 = copy_via_weak t174 in +let t175 : t175 = copy_via_weak t175 in +let t176 : t176 = copy_via_weak t176 in +let t177 : t177 = copy_via_weak t177 in +let t178 : t178 = copy_via_weak t178 in +let t179 : t179 = copy_via_weak t179 in +let t180 : t180 = copy_via_weak t180 in +let t181 : t181 = copy_via_weak t181 in +let t182 : t182 = copy_via_weak t182 in +let t183 : t183 = copy_via_weak t183 in +let t184 : t184 = copy_via_weak t184 in +let t185 : t185 = copy_via_weak t185 in +let t186 : t186 = copy_via_weak t186 in +let t187 : t187 = copy_via_weak t187 in +let t188 : t188 = copy_via_weak t188 in +let t189 : t189 = copy_via_weak t189 in +let t190 : t190 = copy_via_weak t190 in +let t191 : t191 = copy_via_weak t191 in +let t192 : t192 = copy_via_weak t192 in +let t193 : t193 = copy_via_weak t193 in +let t194 : t194 = copy_via_weak t194 in +let t195 : t195 = copy_via_weak t195 in +let t196 : t196 = copy_via_weak t196 in +let t197 : t197 = copy_via_weak t197 in +let t198 : t198 = copy_via_weak t198 in +let t199 : t199 = copy_via_weak t199 in +let t200 : t200 = copy_via_weak t200 in +let t201 : t201 = copy_via_weak t201 in +let t202 : t202 = copy_via_weak t202 in +let t203 : t203 = copy_via_weak t203 in +let t204 : t204 = copy_via_weak t204 in +let t205 : t205 = copy_via_weak t205 in +let t206 : t206 = copy_via_weak t206 in +let t207 : t207 = copy_via_weak t207 in +let t208 : t208 = copy_via_weak t208 in +let t209 : t209 = copy_via_weak t209 in +let t210 : t210 = copy_via_weak t210 in +let t211 : t211 = copy_via_weak t211 in +let t212 : t212 = copy_via_weak t212 in +let t213 : t213 = copy_via_weak t213 in +let t214 : t214 = copy_via_weak t214 in +let t215 : t215 = copy_via_weak t215 in +let t216 : t216 = copy_via_weak t216 in +let t217 : t217 = copy_via_weak t217 in +let t218 : t218 = copy_via_weak t218 in +let t219 : t219 = copy_via_weak t219 in +let t220 : t220 = copy_via_weak t220 in +let t221 : t221 = copy_via_weak t221 in +let t222 : t222 = copy_via_weak t222 in +let t223 : t223 = copy_via_weak t223 in +let t224 : t224 = copy_via_weak t224 in +let t225 : t225 = copy_via_weak t225 in +let t226 : t226 = copy_via_weak t226 in +let t227 : t227 = copy_via_weak t227 in +let t228 : t228 = copy_via_weak t228 in +let t229 : t229 = copy_via_weak t229 in +let t230 : t230 = copy_via_weak t230 in +let t231 : t231 = copy_via_weak t231 in +let t232 : t232 = copy_via_weak t232 in +let t233 : t233 = copy_via_weak t233 in +let t234 : t234 = copy_via_weak t234 in +let t235 : t235 = copy_via_weak t235 in +let t236 : t236 = copy_via_weak t236 in +let t237 : t237 = copy_via_weak t237 in +let t238 : t238 = copy_via_weak t238 in +let t239 : t239 = copy_via_weak t239 in +let t240 : t240 = copy_via_weak t240 in +let t241 : t241 = copy_via_weak t241 in +let t242 : t242 = copy_via_weak t242 in +let t243 : t243 = copy_via_weak t243 in +let t244 : t244 = copy_via_weak t244 in +let t245 : t245 = copy_via_weak t245 in +let t246 : t246 = copy_via_weak t246 in +let t247 : t247 = copy_via_weak t247 in +let t248 : t248 = copy_via_weak t248 in +let t249 : t249 = copy_via_weak t249 in +let t250 : t250 = copy_via_weak t250 in +let t251 : t251 = copy_via_weak t251 in +let t252 : t252 = copy_via_weak t252 in +let t253 : t253 = copy_via_weak t253 in +let t254 : t254 = copy_via_weak t254 in +let t255 : t255 = copy_via_weak t255 in +let t256 : t256 = copy_via_weak t256 in +let t257 : t257 = copy_via_weak t257 in +let t258 : t258 = copy_via_weak t258 in +let t259 : t259 = copy_via_weak t259 in +let t260 : t260 = copy_via_weak t260 in +let t261 : t261 = copy_via_weak t261 in +let t262 : t262 = copy_via_weak t262 in +let t263 : t263 = copy_via_weak t263 in +let t264 : t264 = copy_via_weak t264 in +let t265 : t265 = copy_via_weak t265 in +let t266 : t266 = copy_via_weak t266 in +let t267 : t267 = copy_via_weak t267 in +let t268 : t268 = copy_via_weak t268 in +let t269 : t269 = copy_via_weak t269 in +let t270 : t270 = copy_via_weak t270 in +let t271 : t271 = copy_via_weak t271 in +let t272 : t272 = copy_via_weak t272 in +let t273 : t273 = copy_via_weak t273 in +let t274 : t274 = copy_via_weak t274 in +let t275 : t275 = copy_via_weak t275 in +let t276 : t276 = copy_via_weak t276 in +let t277 : t277 = copy_via_weak t277 in +let t278 : t278 = copy_via_weak t278 in +let t279 : t279 = copy_via_weak t279 in +let t280 : t280 = copy_via_weak t280 in +let t281 : t281 = copy_via_weak t281 in +let t282 : t282 = copy_via_weak t282 in +let t283 : t283 = copy_via_weak t283 in +let t284 : t284 = copy_via_weak t284 in +let t285 : t285 = copy_via_weak t285 in +let t286 : t286 = copy_via_weak t286 in +let t287 : t287 = copy_via_weak t287 in +let t288 : t288 = copy_via_weak t288 in +let t289 : t289 = copy_via_weak t289 in +let t290 : t290 = copy_via_weak t290 in +let t291 : t291 = copy_via_weak t291 in +let t292 : t292 = copy_via_weak t292 in +let t293 : t293 = copy_via_weak t293 in +let t294 : t294 = copy_via_weak t294 in +let t295 : t295 = copy_via_weak t295 in +let t296 : t296 = copy_via_weak t296 in +let t297 : t297 = copy_via_weak t297 in +let t298 : t298 = copy_via_weak t298 in +let t299 : t299 = copy_via_weak t299 in +let t300_A : t300 = copy_via_weak t300_A in +let t301_A : t301 = copy_via_weak t301_A in +let t301_B : t301 = copy_via_weak t301_B in +let t302_A : t302 = copy_via_weak t302_A in +let t303_A : t303 = copy_via_weak t303_A in +let t303_B : t303 = copy_via_weak t303_B in +let t303_C : t303 = copy_via_weak t303_C in +let t304_A : t304 = copy_via_weak t304_A in +let t304_B : t304 = copy_via_weak t304_B in +let t305_A : t305 = copy_via_weak t305_A in +let t306_A : t306 = copy_via_weak t306_A in +let t306_B : t306 = copy_via_weak t306_B in +let t307_A : t307 = copy_via_weak t307_A in +let t307_B : t307 = copy_via_weak t307_B in +let t307_C : t307 = copy_via_weak t307_C in +let t308_A : t308 = copy_via_weak t308_A in +let t308_B : t308 = copy_via_weak t308_B in +let t309_A : t309 = copy_via_weak t309_A in +let t310_A : t310 = copy_via_weak t310_A in +let t310_B : t310 = copy_via_weak t310_B in +let t310_C : t310 = copy_via_weak t310_C in +let t310_D : t310 = copy_via_weak t310_D in +let t311_A : t311 = copy_via_weak t311_A in +let t311_B : t311 = copy_via_weak t311_B in +let t312_A : t312 = copy_via_weak t312_A in +let t312_B : t312 = copy_via_weak t312_B in +let t312_C : t312 = copy_via_weak t312_C in +let t313_A : t313 = copy_via_weak t313_A in +let t313_B : t313 = copy_via_weak t313_B in +let t314_A : t314 = copy_via_weak t314_A in +let t315_A : t315 = copy_via_weak t315_A in +let t315_B : t315 = copy_via_weak t315_B in +let t315_C : t315 = copy_via_weak t315_C in +let t316_A : t316 = copy_via_weak t316_A in +let t316_B : t316 = copy_via_weak t316_B in +let t316_C : t316 = copy_via_weak t316_C in +let t316_D : t316 = copy_via_weak t316_D in +let t317_A : t317 = copy_via_weak t317_A in +let t317_B : t317 = copy_via_weak t317_B in +let t318_A : t318 = copy_via_weak t318_A in +let t318_B : t318 = copy_via_weak t318_B in +let t318_C : t318 = copy_via_weak t318_C in +let t319_A : t319 = copy_via_weak t319_A in +let t319_B : t319 = copy_via_weak t319_B in +let t320_A : t320 = copy_via_weak t320_A in +let t321_A : t321 = copy_via_weak t321_A in +let t321_B : t321 = copy_via_weak t321_B in +let t322_A : t322 = copy_via_weak t322_A in +let t322_B : t322 = copy_via_weak t322_B in +let t322_C : t322 = copy_via_weak t322_C in +let t323_A : t323 = copy_via_weak t323_A in +let t323_B : t323 = copy_via_weak t323_B in +let t323_C : t323 = copy_via_weak t323_C in +let t323_D : t323 = copy_via_weak t323_D in +let t324_A : t324 = copy_via_weak t324_A in +let t324_B : t324 = copy_via_weak t324_B in +let t325_A : t325 = copy_via_weak t325_A in +let t325_B : t325 = copy_via_weak t325_B in +let t325_C : t325 = copy_via_weak t325_C in +let t326_A : t326 = copy_via_weak t326_A in +let t326_B : t326 = copy_via_weak t326_B in +let t327_A : t327 = copy_via_weak t327_A in +let t328_A : t328 = copy_via_weak t328_A in +let t328_B : t328 = copy_via_weak t328_B in +let t328_C : t328 = copy_via_weak t328_C in +let t329_A : t329 = copy_via_weak t329_A in +let t329_B : t329 = copy_via_weak t329_B in +let t330_A : t330 = copy_via_weak t330_A in +let t330_B : t330 = copy_via_weak t330_B in +let t330_C : t330 = copy_via_weak t330_C in +let t331_A : t331 = copy_via_weak t331_A in +let t331_B : t331 = copy_via_weak t331_B in +let t331_C : t331 = copy_via_weak t331_C in +let t331_D : t331 = copy_via_weak t331_D in +let t332_A : t332 = copy_via_weak t332_A in +let t332_B : t332 = copy_via_weak t332_B in +let t333_A : t333 = copy_via_weak t333_A in +let t333_B : t333 = copy_via_weak t333_B in +let t333_C : t333 = copy_via_weak t333_C in +let t334_A : t334 = copy_via_weak t334_A in +let t334_B : t334 = copy_via_weak t334_B in +let t335_A : t335 = copy_via_weak t335_A in +let t336_A : t336 = copy_via_weak t336_A in +let t336_B : t336 = copy_via_weak t336_B in +let t336_C : t336 = copy_via_weak t336_C in +let t336_D : t336 = copy_via_weak t336_D in +let t337_A : t337 = copy_via_weak t337_A in +let t337_B : t337 = copy_via_weak t337_B in +let t337_C : t337 = copy_via_weak t337_C in +let t338_A : t338 = copy_via_weak t338_A in +let t338_B : t338 = copy_via_weak t338_B in +let t339_A : t339 = copy_via_weak t339_A in +let t339_B : t339 = copy_via_weak t339_B in +let t339_C : t339 = copy_via_weak t339_C in +let t340_A : t340 = copy_via_weak t340_A in +let t340_B : t340 = copy_via_weak t340_B in +let t340_C : t340 = copy_via_weak t340_C in +let t340_D : t340 = copy_via_weak t340_D in +let t341_A : t341 = copy_via_weak t341_A in +let t341_B : t341 = copy_via_weak t341_B in +let t342_A : t342 = copy_via_weak t342_A in +let t342_B : t342 = copy_via_weak t342_B in +let t342_C : t342 = copy_via_weak t342_C in +let t343_A : t343 = copy_via_weak t343_A in +let t343_B : t343 = copy_via_weak t343_B in +let t344_A : t344 = copy_via_weak t344_A in +let t345_A : t345 = copy_via_weak t345_A in +let t345_B : t345 = copy_via_weak t345_B in +let t345_C : t345 = copy_via_weak t345_C in +let t346_A : t346 = copy_via_weak t346_A in +let t346_B : t346 = copy_via_weak t346_B in +let t346_C : t346 = copy_via_weak t346_C in +let t346_D : t346 = copy_via_weak t346_D in +let t347_A : t347 = copy_via_weak t347_A in +let t347_B : t347 = copy_via_weak t347_B in +let t347_C : t347 = copy_via_weak t347_C in +let t348_A : t348 = copy_via_weak t348_A in +let t348_B : t348 = copy_via_weak t348_B in +let t349_A : t349 = copy_via_weak t349_A in +let t349_B : t349 = copy_via_weak t349_B in +let t349_C : t349 = copy_via_weak t349_C in +let t350_A : t350 = copy_via_weak t350_A in +let t350_B : t350 = copy_via_weak t350_B in +let t350_C : t350 = copy_via_weak t350_C in +let t350_D : t350 = copy_via_weak t350_D in +let t351_A : t351 = copy_via_weak t351_A in +let t351_B : t351 = copy_via_weak t351_B in +let t352_A : t352 = copy_via_weak t352_A in +let t352_B : t352 = copy_via_weak t352_B in +let t352_C : t352 = copy_via_weak t352_C in +let t353_A : t353 = copy_via_weak t353_A in +let t353_B : t353 = copy_via_weak t353_B in +let t354_A : t354 = copy_via_weak t354_A in +let t355_A : t355 = copy_via_weak t355_A in +let t355_B : t355 = copy_via_weak t355_B in +let t356_A : t356 = copy_via_weak t356_A in +let t356_B : t356 = copy_via_weak t356_B in +let t356_C : t356 = copy_via_weak t356_C in +let t357_A : t357 = copy_via_weak t357_A in +let t357_B : t357 = copy_via_weak t357_B in +let t357_C : t357 = copy_via_weak t357_C in +let t357_D : t357 = copy_via_weak t357_D in +let t358_A : t358 = copy_via_weak t358_A in +let t358_B : t358 = copy_via_weak t358_B in +let t358_C : t358 = copy_via_weak t358_C in +let t359_A : t359 = copy_via_weak t359_A in +let t359_B : t359 = copy_via_weak t359_B in +let t360_A : t360 = copy_via_weak t360_A in +let t360_B : t360 = copy_via_weak t360_B in +let t360_C : t360 = copy_via_weak t360_C in +let t361_A : t361 = copy_via_weak t361_A in +let t361_B : t361 = copy_via_weak t361_B in +let t361_C : t361 = copy_via_weak t361_C in +let t361_D : t361 = copy_via_weak t361_D in +let t362_A : t362 = copy_via_weak t362_A in +let t362_B : t362 = copy_via_weak t362_B in +let t363_A : t363 = copy_via_weak t363_A in +let t363_B : t363 = copy_via_weak t363_B in +let t363_C : t363 = copy_via_weak t363_C in +let t364_A : t364 = copy_via_weak t364_A in +let t364_B : t364 = copy_via_weak t364_B in +let t365_A : t365 = copy_via_weak t365_A in +let t366_A : t366 = copy_via_weak t366_A in +let t366_B : t366 = copy_via_weak t366_B in +let t366_C : t366 = copy_via_weak t366_C in +let t366_D : t366 = copy_via_weak t366_D in +let t366_E : t366 = copy_via_weak t366_E in +let t367_A : t367 = copy_via_weak t367_A in +let t367_B : t367 = copy_via_weak t367_B in +let t368_A : t368 = copy_via_weak t368_A in +let t368_B : t368 = copy_via_weak t368_B in +let t368_C : t368 = copy_via_weak t368_C in +let t369_A : t369 = copy_via_weak t369_A in +let t369_B : t369 = copy_via_weak t369_B in +let t369_C : t369 = copy_via_weak t369_C in +let t369_D : t369 = copy_via_weak t369_D in +let t370_A : t370 = copy_via_weak t370_A in +let t370_B : t370 = copy_via_weak t370_B in +let t370_C : t370 = copy_via_weak t370_C in +let t371_A : t371 = copy_via_weak t371_A in +let t371_B : t371 = copy_via_weak t371_B in +let t372_A : t372 = copy_via_weak t372_A in +let t372_B : t372 = copy_via_weak t372_B in +let t372_C : t372 = copy_via_weak t372_C in +let t373_A : t373 = copy_via_weak t373_A in +let t373_B : t373 = copy_via_weak t373_B in +let t373_C : t373 = copy_via_weak t373_C in +let t373_D : t373 = copy_via_weak t373_D in +let t374_A : t374 = copy_via_weak t374_A in +let t374_B : t374 = copy_via_weak t374_B in +let t375_A : t375 = copy_via_weak t375_A in +let t375_B : t375 = copy_via_weak t375_B in +let t375_C : t375 = copy_via_weak t375_C in +let t376_A : t376 = copy_via_weak t376_A in +let t376_B : t376 = copy_via_weak t376_B in +let t377_A : t377 = copy_via_weak t377_A in +let t378_A : t378 = copy_via_weak t378_A in +let t378_B : t378 = copy_via_weak t378_B in +let t378_C : t378 = copy_via_weak t378_C in +let t379_A : t379 = copy_via_weak t379_A in +let t379_B : t379 = copy_via_weak t379_B in +let t379_C : t379 = copy_via_weak t379_C in +let t379_D : t379 = copy_via_weak t379_D in +let t379_E : t379 = copy_via_weak t379_E in +let t380_A : t380 = copy_via_weak t380_A in +let t380_B : t380 = copy_via_weak t380_B in +let t381_A : t381 = copy_via_weak t381_A in +let t381_B : t381 = copy_via_weak t381_B in +let t381_C : t381 = copy_via_weak t381_C in +let t382_A : t382 = copy_via_weak t382_A in +let t382_B : t382 = copy_via_weak t382_B in +let t382_C : t382 = copy_via_weak t382_C in +let t382_D : t382 = copy_via_weak t382_D in +let t383_A : t383 = copy_via_weak t383_A in +let t383_B : t383 = copy_via_weak t383_B in +let t383_C : t383 = copy_via_weak t383_C in +let t384_A : t384 = copy_via_weak t384_A in +let t384_B : t384 = copy_via_weak t384_B in +let t385_A : t385 = copy_via_weak t385_A in +let t385_B : t385 = copy_via_weak t385_B in +let t385_C : t385 = copy_via_weak t385_C in +let t386_A : t386 = copy_via_weak t386_A in +let t386_B : t386 = copy_via_weak t386_B in +let t386_C : t386 = copy_via_weak t386_C in +let t386_D : t386 = copy_via_weak t386_D in +let t387_A : t387 = copy_via_weak t387_A in +let t387_B : t387 = copy_via_weak t387_B in +let t388_A : t388 = copy_via_weak t388_A in +let t388_B : t388 = copy_via_weak t388_B in +let t388_C : t388 = copy_via_weak t388_C in +let t389_A : t389 = copy_via_weak t389_A in +let t389_B : t389 = copy_via_weak t389_B in +let t390_A : t390 = copy_via_weak t390_A in +let t391_A : t391 = copy_via_weak t391_A in +let t391_B : t391 = copy_via_weak t391_B in +let t391_C : t391 = copy_via_weak t391_C in +let t391_D : t391 = copy_via_weak t391_D in +let t392_A : t392 = copy_via_weak t392_A in +let t392_B : t392 = copy_via_weak t392_B in +let t392_C : t392 = copy_via_weak t392_C in +let t393_A : t393 = copy_via_weak t393_A in +let t393_B : t393 = copy_via_weak t393_B in +let t393_C : t393 = copy_via_weak t393_C in +let t393_D : t393 = copy_via_weak t393_D in +let t393_E : t393 = copy_via_weak t393_E in +let t394_A : t394 = copy_via_weak t394_A in +let t394_B : t394 = copy_via_weak t394_B in +let t395_A : t395 = copy_via_weak t395_A in +let t395_B : t395 = copy_via_weak t395_B in +let t395_C : t395 = copy_via_weak t395_C in +let t396_A : t396 = copy_via_weak t396_A in +let t396_B : t396 = copy_via_weak t396_B in +let t396_C : t396 = copy_via_weak t396_C in +let t396_D : t396 = copy_via_weak t396_D in +let t397_A : t397 = copy_via_weak t397_A in +let t397_B : t397 = copy_via_weak t397_B in +let t397_C : t397 = copy_via_weak t397_C in +let t398_A : t398 = copy_via_weak t398_A in +let t398_B : t398 = copy_via_weak t398_B in +let t399_A : t399 = copy_via_weak t399_A in +let t399_B : t399 = copy_via_weak t399_B in +let t399_C : t399 = copy_via_weak t399_C in +let t400_A : t400 = copy_via_weak t400_A in +let t400_B : t400 = copy_via_weak t400_B in +let t400_C : t400 = copy_via_weak t400_C in +let t400_D : t400 = copy_via_weak t400_D in +let t401_A : t401 = copy_via_weak t401_A in +let t401_B : t401 = copy_via_weak t401_B in +let t402_A : t402 = copy_via_weak t402_A in +let t402_B : t402 = copy_via_weak t402_B in +let t402_C : t402 = copy_via_weak t402_C in +let t403_A : t403 = copy_via_weak t403_A in +let t403_B : t403 = copy_via_weak t403_B in +let t404_A : t404 = copy_via_weak t404_A in +let t405_A : t405 = copy_via_weak t405_A in +let t405_B : t405 = copy_via_weak t405_B in +let t405_C : t405 = copy_via_weak t405_C in +let t406_A : t406 = copy_via_weak t406_A in +let t406_B : t406 = copy_via_weak t406_B in +let t406_C : t406 = copy_via_weak t406_C in +let t406_D : t406 = copy_via_weak t406_D in +let t407_A : t407 = copy_via_weak t407_A in +let t407_B : t407 = copy_via_weak t407_B in +let t407_C : t407 = copy_via_weak t407_C in +let t408_A : t408 = copy_via_weak t408_A in +let t408_B : t408 = copy_via_weak t408_B in +let t408_C : t408 = copy_via_weak t408_C in +let t408_D : t408 = copy_via_weak t408_D in +let t408_E : t408 = copy_via_weak t408_E in +let t409_A : t409 = copy_via_weak t409_A in +let t409_B : t409 = copy_via_weak t409_B in +let t410_A : t410 = copy_via_weak t410_A in +let t410_B : t410 = copy_via_weak t410_B in +let t410_C : t410 = copy_via_weak t410_C in +let t411_A : t411 = copy_via_weak t411_A in +let t411_B : t411 = copy_via_weak t411_B in +let t411_C : t411 = copy_via_weak t411_C in +let t411_D : t411 = copy_via_weak t411_D in +let t412_A : t412 = copy_via_weak t412_A in +let t412_B : t412 = copy_via_weak t412_B in +let t412_C : t412 = copy_via_weak t412_C in +let t413_A : t413 = copy_via_weak t413_A in +let t413_B : t413 = copy_via_weak t413_B in +let t414_A : t414 = copy_via_weak t414_A in +let t414_B : t414 = copy_via_weak t414_B in +let t414_C : t414 = copy_via_weak t414_C in +let t415_A : t415 = copy_via_weak t415_A in +let t415_B : t415 = copy_via_weak t415_B in +let t415_C : t415 = copy_via_weak t415_C in +let t415_D : t415 = copy_via_weak t415_D in +let t416_A : t416 = copy_via_weak t416_A in +let t416_B : t416 = copy_via_weak t416_B in +let t417_A : t417 = copy_via_weak t417_A in +let t417_B : t417 = copy_via_weak t417_B in +let t417_C : t417 = copy_via_weak t417_C in +let t418_A : t418 = copy_via_weak t418_A in +let t418_B : t418 = copy_via_weak t418_B in +let t419_A : t419 = copy_via_weak t419_A in +let t420_A : t420 = copy_via_weak t420_A in +let t420_B : t420 = copy_via_weak t420_B in +let t421_A : t421 = copy_via_weak t421_A in +let t421_B : t421 = copy_via_weak t421_B in +let t421_C : t421 = copy_via_weak t421_C in +let t422_A : t422 = copy_via_weak t422_A in +let t422_B : t422 = copy_via_weak t422_B in +let t422_C : t422 = copy_via_weak t422_C in +let t422_D : t422 = copy_via_weak t422_D in +let t423_A : t423 = copy_via_weak t423_A in +let t423_B : t423 = copy_via_weak t423_B in +let t423_C : t423 = copy_via_weak t423_C in +let t424_A : t424 = copy_via_weak t424_A in +let t424_B : t424 = copy_via_weak t424_B in +let t424_C : t424 = copy_via_weak t424_C in +let t424_D : t424 = copy_via_weak t424_D in +let t424_E : t424 = copy_via_weak t424_E in +let t425_A : t425 = copy_via_weak t425_A in +let t425_B : t425 = copy_via_weak t425_B in +let t426_A : t426 = copy_via_weak t426_A in +let t426_B : t426 = copy_via_weak t426_B in +let t426_C : t426 = copy_via_weak t426_C in +let t427_A : t427 = copy_via_weak t427_A in +let t427_B : t427 = copy_via_weak t427_B in +let t427_C : t427 = copy_via_weak t427_C in +let t427_D : t427 = copy_via_weak t427_D in +let t428_A : t428 = copy_via_weak t428_A in +let t428_B : t428 = copy_via_weak t428_B in +let t428_C : t428 = copy_via_weak t428_C in +let t429_A : t429 = copy_via_weak t429_A in +let t429_B : t429 = copy_via_weak t429_B in +let t430_A : t430 = copy_via_weak t430_A in +let t430_B : t430 = copy_via_weak t430_B in +let t430_C : t430 = copy_via_weak t430_C in +let t431_A : t431 = copy_via_weak t431_A in +let t431_B : t431 = copy_via_weak t431_B in +let t431_C : t431 = copy_via_weak t431_C in +let t431_D : t431 = copy_via_weak t431_D in +let t432_A : t432 = copy_via_weak t432_A in +let t432_B : t432 = copy_via_weak t432_B in +let t433_A : t433 = copy_via_weak t433_A in +let t433_B : t433 = copy_via_weak t433_B in +let t433_C : t433 = copy_via_weak t433_C in +let t434_A : t434 = copy_via_weak t434_A in +let t434_B : t434 = copy_via_weak t434_B in +let t435_A : t435 = copy_via_weak t435_A in +let t436_A : t436 = copy_via_weak t436_A in +let t436_B : t436 = copy_via_weak t436_B in +let t436_C : t436 = copy_via_weak t436_C in +let t436_D : t436 = copy_via_weak t436_D in +let t437_A : t437 = copy_via_weak t437_A in +let t437_B : t437 = copy_via_weak t437_B in +let t438_A : t438 = copy_via_weak t438_A in +let t438_B : t438 = copy_via_weak t438_B in +let t438_C : t438 = copy_via_weak t438_C in +let t439_A : t439 = copy_via_weak t439_A in +let t439_B : t439 = copy_via_weak t439_B in +let t439_C : t439 = copy_via_weak t439_C in +let t439_D : t439 = copy_via_weak t439_D in +let t440_A : t440 = copy_via_weak t440_A in +let t440_B : t440 = copy_via_weak t440_B in +let t440_C : t440 = copy_via_weak t440_C in +let t441_A : t441 = copy_via_weak t441_A in +let t441_B : t441 = copy_via_weak t441_B in +let t441_C : t441 = copy_via_weak t441_C in +let t441_D : t441 = copy_via_weak t441_D in +let t441_E : t441 = copy_via_weak t441_E in +let t442_A : t442 = copy_via_weak t442_A in +let t442_B : t442 = copy_via_weak t442_B in +let t443_A : t443 = copy_via_weak t443_A in +let t443_B : t443 = copy_via_weak t443_B in +let t443_C : t443 = copy_via_weak t443_C in +let t444_A : t444 = copy_via_weak t444_A in +let t444_B : t444 = copy_via_weak t444_B in +let t444_C : t444 = copy_via_weak t444_C in +let t444_D : t444 = copy_via_weak t444_D in +let t445_A : t445 = copy_via_weak t445_A in +let t445_B : t445 = copy_via_weak t445_B in +let t445_C : t445 = copy_via_weak t445_C in +let t446_A : t446 = copy_via_weak t446_A in +let t446_B : t446 = copy_via_weak t446_B in +let t447_A : t447 = copy_via_weak t447_A in +let t447_B : t447 = copy_via_weak t447_B in +let t447_C : t447 = copy_via_weak t447_C in +let t448_A : t448 = copy_via_weak t448_A in +let t448_B : t448 = copy_via_weak t448_B in +let t448_C : t448 = copy_via_weak t448_C in +let t448_D : t448 = copy_via_weak t448_D in +let t449_A : t449 = copy_via_weak t449_A in +let t449_B : t449 = copy_via_weak t449_B in +let t450_A : t450 = copy_via_weak t450_A in +let t450_B : t450 = copy_via_weak t450_B in +let t450_C : t450 = copy_via_weak t450_C in +let t451_A : t451 = copy_via_weak t451_A in +let t451_B : t451 = copy_via_weak t451_B in +let t452_A : t452 = copy_via_weak t452_A in +let t453_A : t453 = copy_via_weak t453_A in +let t453_B : t453 = copy_via_weak t453_B in +let t453_C : t453 = copy_via_weak t453_C in +let t453_D : t453 = copy_via_weak t453_D in +let t453_E : t453 = copy_via_weak t453_E in +let t454_A : t454 = copy_via_weak t454_A in +let t454_B : t454 = copy_via_weak t454_B in +let t454_C : t454 = copy_via_weak t454_C in +let t454_D : t454 = copy_via_weak t454_D in +let t455_A : t455 = copy_via_weak t455_A in +let t455_B : t455 = copy_via_weak t455_B in +let t456_A : t456 = copy_via_weak t456_A in +let t456_B : t456 = copy_via_weak t456_B in +let t456_C : t456 = copy_via_weak t456_C in +let t457_A : t457 = copy_via_weak t457_A in +let t457_B : t457 = copy_via_weak t457_B in +let t457_C : t457 = copy_via_weak t457_C in +let t457_D : t457 = copy_via_weak t457_D in +let t458_A : t458 = copy_via_weak t458_A in +let t458_B : t458 = copy_via_weak t458_B in +let t458_C : t458 = copy_via_weak t458_C in +let t459_A : t459 = copy_via_weak t459_A in +let t459_B : t459 = copy_via_weak t459_B in +let t459_C : t459 = copy_via_weak t459_C in +let t459_D : t459 = copy_via_weak t459_D in +let t459_E : t459 = copy_via_weak t459_E in +let t460_A : t460 = copy_via_weak t460_A in +let t460_B : t460 = copy_via_weak t460_B in +let t461_A : t461 = copy_via_weak t461_A in +let t461_B : t461 = copy_via_weak t461_B in +let t461_C : t461 = copy_via_weak t461_C in +let t462_A : t462 = copy_via_weak t462_A in +let t462_B : t462 = copy_via_weak t462_B in +let t462_C : t462 = copy_via_weak t462_C in +let t462_D : t462 = copy_via_weak t462_D in +let t463_A : t463 = copy_via_weak t463_A in +let t463_B : t463 = copy_via_weak t463_B in +let t463_C : t463 = copy_via_weak t463_C in +let t464_A : t464 = copy_via_weak t464_A in +let t464_B : t464 = copy_via_weak t464_B in +let t465_A : t465 = copy_via_weak t465_A in +let t465_B : t465 = copy_via_weak t465_B in +let t465_C : t465 = copy_via_weak t465_C in +let t466_A : t466 = copy_via_weak t466_A in +let t466_B : t466 = copy_via_weak t466_B in +let t466_C : t466 = copy_via_weak t466_C in +let t466_D : t466 = copy_via_weak t466_D in +let t467_A : t467 = copy_via_weak t467_A in +let t467_B : t467 = copy_via_weak t467_B in +let t468_A : t468 = copy_via_weak t468_A in +let t468_B : t468 = copy_via_weak t468_B in +let t468_C : t468 = copy_via_weak t468_C in +let t469_A : t469 = copy_via_weak t469_A in +let t469_B : t469 = copy_via_weak t469_B in +let t470_A : t470 = copy_via_weak t470_A in +let t471_A : t471 = copy_via_weak t471_A in +let t471_B : t471 = copy_via_weak t471_B in +let t471_C : t471 = copy_via_weak t471_C in +let t472_A : t472 = copy_via_weak t472_A in +let t472_B : t472 = copy_via_weak t472_B in +let t472_C : t472 = copy_via_weak t472_C in +let t472_D : t472 = copy_via_weak t472_D in +let t472_E : t472 = copy_via_weak t472_E in +let t473_A : t473 = copy_via_weak t473_A in +let t473_B : t473 = copy_via_weak t473_B in +let t473_C : t473 = copy_via_weak t473_C in +let t473_D : t473 = copy_via_weak t473_D in +let t474_A : t474 = copy_via_weak t474_A in +let t474_B : t474 = copy_via_weak t474_B in +let t475_A : t475 = copy_via_weak t475_A in +let t475_B : t475 = copy_via_weak t475_B in +let t475_C : t475 = copy_via_weak t475_C in +let t476_A : t476 = copy_via_weak t476_A in +let t476_B : t476 = copy_via_weak t476_B in +let t476_C : t476 = copy_via_weak t476_C in +let t476_D : t476 = copy_via_weak t476_D in +let t477_A : t477 = copy_via_weak t477_A in +let t477_B : t477 = copy_via_weak t477_B in +let t477_C : t477 = copy_via_weak t477_C in +let t478_A : t478 = copy_via_weak t478_A in +let t478_B : t478 = copy_via_weak t478_B in +let t478_C : t478 = copy_via_weak t478_C in +let t478_D : t478 = copy_via_weak t478_D in +let t478_E : t478 = copy_via_weak t478_E in +let t479_A : t479 = copy_via_weak t479_A in +let t479_B : t479 = copy_via_weak t479_B in +let t480_A : t480 = copy_via_weak t480_A in +let t480_B : t480 = copy_via_weak t480_B in +let t480_C : t480 = copy_via_weak t480_C in +let t481_A : t481 = copy_via_weak t481_A in +let t481_B : t481 = copy_via_weak t481_B in +let t481_C : t481 = copy_via_weak t481_C in +let t481_D : t481 = copy_via_weak t481_D in +let t482_A : t482 = copy_via_weak t482_A in +let t482_B : t482 = copy_via_weak t482_B in +let t482_C : t482 = copy_via_weak t482_C in +let t483_A : t483 = copy_via_weak t483_A in +let t483_B : t483 = copy_via_weak t483_B in +let t484_A : t484 = copy_via_weak t484_A in +let t484_B : t484 = copy_via_weak t484_B in +let t484_C : t484 = copy_via_weak t484_C in +let t485_A : t485 = copy_via_weak t485_A in +let t485_B : t485 = copy_via_weak t485_B in +let t485_C : t485 = copy_via_weak t485_C in +let t485_D : t485 = copy_via_weak t485_D in +let t486_A : t486 = copy_via_weak t486_A in +let t486_B : t486 = copy_via_weak t486_B in +let t487_A : t487 = copy_via_weak t487_A in +let t487_B : t487 = copy_via_weak t487_B in +let t487_C : t487 = copy_via_weak t487_C in +let t488_A : t488 = copy_via_weak t488_A in +let t488_B : t488 = copy_via_weak t488_B in +let t489_A : t489 = copy_via_weak t489_A in +let t490_A : t490 = copy_via_weak t490_A in +let t490_B : t490 = copy_via_weak t490_B in +let t490_C : t490 = copy_via_weak t490_C in +let t490_D : t490 = copy_via_weak t490_D in +let t491_A : t491 = copy_via_weak t491_A in +let t491_B : t491 = copy_via_weak t491_B in +let t491_C : t491 = copy_via_weak t491_C in +let t492_A : t492 = copy_via_weak t492_A in +let t492_B : t492 = copy_via_weak t492_B in +let t492_C : t492 = copy_via_weak t492_C in +let t492_D : t492 = copy_via_weak t492_D in +let t492_E : t492 = copy_via_weak t492_E in +let t493_A : t493 = copy_via_weak t493_A in +let t493_B : t493 = copy_via_weak t493_B in +let t493_C : t493 = copy_via_weak t493_C in +let t493_D : t493 = copy_via_weak t493_D in +let t494_A : t494 = copy_via_weak t494_A in +let t494_B : t494 = copy_via_weak t494_B in +let t495_A : t495 = copy_via_weak t495_A in +let t495_B : t495 = copy_via_weak t495_B in +let t495_C : t495 = copy_via_weak t495_C in +let t496_A : t496 = copy_via_weak t496_A in +let t496_B : t496 = copy_via_weak t496_B in +let t496_C : t496 = copy_via_weak t496_C in +let t496_D : t496 = copy_via_weak t496_D in +let t497_A : t497 = copy_via_weak t497_A in +let t497_B : t497 = copy_via_weak t497_B in +let t497_C : t497 = copy_via_weak t497_C in +let t498_A : t498 = copy_via_weak t498_A in +let t498_B : t498 = copy_via_weak t498_B in +let t498_C : t498 = copy_via_weak t498_C in +let t498_D : t498 = copy_via_weak t498_D in +let t498_E : t498 = copy_via_weak t498_E in +let t499_A : t499 = copy_via_weak t499_A in +let t499_B : t499 = copy_via_weak t499_B in +let t500_A : t500 = copy_via_weak t500_A in +let t500_B : t500 = copy_via_weak t500_B in +let t500_C : t500 = copy_via_weak t500_C in +let t501_A : t501 = copy_via_weak t501_A in +let t501_B : t501 = copy_via_weak t501_B in +let t501_C : t501 = copy_via_weak t501_C in +let t501_D : t501 = copy_via_weak t501_D in +let t502_A : t502 = copy_via_weak t502_A in +let t502_B : t502 = copy_via_weak t502_B in +let t502_C : t502 = copy_via_weak t502_C in +let t503_A : t503 = copy_via_weak t503_A in +let t503_B : t503 = copy_via_weak t503_B in +let t504_A : t504 = copy_via_weak t504_A in +let t504_B : t504 = copy_via_weak t504_B in +let t504_C : t504 = copy_via_weak t504_C in +let t505_A : t505 = copy_via_weak t505_A in +let t505_B : t505 = copy_via_weak t505_B in +let t505_C : t505 = copy_via_weak t505_C in +let t505_D : t505 = copy_via_weak t505_D in +let t506_A : t506 = copy_via_weak t506_A in +let t506_B : t506 = copy_via_weak t506_B in +let t507_A : t507 = copy_via_weak t507_A in +let t507_B : t507 = copy_via_weak t507_B in +let t507_C : t507 = copy_via_weak t507_C in +let t508_A : t508 = copy_via_weak t508_A in +let t508_B : t508 = copy_via_weak t508_B in +let t509_A : t509 = copy_via_weak t509_A in +let t510_A : t510 = copy_via_weak t510_A in +let t510_B : t510 = copy_via_weak t510_B in +let t510_C : t510 = copy_via_weak t510_C in +let t511_A : t511 = copy_via_weak t511_A in +let t511_B : t511 = copy_via_weak t511_B in +let t511_C : t511 = copy_via_weak t511_C in +let t511_D : t511 = copy_via_weak t511_D in +let t512_A : t512 = copy_via_weak t512_A in +let t512_B : t512 = copy_via_weak t512_B in +let t512_C : t512 = copy_via_weak t512_C in +let t513_A : t513 = copy_via_weak t513_A in +let t513_B : t513 = copy_via_weak t513_B in +let t513_C : t513 = copy_via_weak t513_C in +let t513_D : t513 = copy_via_weak t513_D in +let t513_E : t513 = copy_via_weak t513_E in +let t514_A : t514 = copy_via_weak t514_A in +let t514_B : t514 = copy_via_weak t514_B in +let t514_C : t514 = copy_via_weak t514_C in +let t514_D : t514 = copy_via_weak t514_D in +let t515_A : t515 = copy_via_weak t515_A in +let t515_B : t515 = copy_via_weak t515_B in +let t516_A : t516 = copy_via_weak t516_A in +let t516_B : t516 = copy_via_weak t516_B in +let t516_C : t516 = copy_via_weak t516_C in +let t517_A : t517 = copy_via_weak t517_A in +let t517_B : t517 = copy_via_weak t517_B in +let t517_C : t517 = copy_via_weak t517_C in +let t517_D : t517 = copy_via_weak t517_D in +let t518_A : t518 = copy_via_weak t518_A in +let t518_B : t518 = copy_via_weak t518_B in +let t518_C : t518 = copy_via_weak t518_C in +let t519_A : t519 = copy_via_weak t519_A in +let t519_B : t519 = copy_via_weak t519_B in +let t519_C : t519 = copy_via_weak t519_C in +let t519_D : t519 = copy_via_weak t519_D in +let t519_E : t519 = copy_via_weak t519_E in +let t520_A : t520 = copy_via_weak t520_A in +let t520_B : t520 = copy_via_weak t520_B in +let t521_A : t521 = copy_via_weak t521_A in +let t521_B : t521 = copy_via_weak t521_B in +let t521_C : t521 = copy_via_weak t521_C in +let t522_A : t522 = copy_via_weak t522_A in +let t522_B : t522 = copy_via_weak t522_B in +let t522_C : t522 = copy_via_weak t522_C in +let t522_D : t522 = copy_via_weak t522_D in +let t523_A : t523 = copy_via_weak t523_A in +let t523_B : t523 = copy_via_weak t523_B in +let t523_C : t523 = copy_via_weak t523_C in +let t524_A : t524 = copy_via_weak t524_A in +let t524_B : t524 = copy_via_weak t524_B in +let t525_A : t525 = copy_via_weak t525_A in +let t525_B : t525 = copy_via_weak t525_B in +let t525_C : t525 = copy_via_weak t525_C in +let t526_A : t526 = copy_via_weak t526_A in +let t526_B : t526 = copy_via_weak t526_B in +let t526_C : t526 = copy_via_weak t526_C in +let t526_D : t526 = copy_via_weak t526_D in +let t527_A : t527 = copy_via_weak t527_A in +let t527_B : t527 = copy_via_weak t527_B in +let t528_A : t528 = copy_via_weak t528_A in +let t528_B : t528 = copy_via_weak t528_B in +let t528_C : t528 = copy_via_weak t528_C in +let t529_A : t529 = copy_via_weak t529_A in +let t529_B : t529 = copy_via_weak t529_B in +let t530_A : t530 = copy_via_weak t530_A in +let t531_A : t531 = copy_via_weak t531_A in +let t531_B : t531 = copy_via_weak t531_B in +let t532_A : t532 = copy_via_weak t532_A in +let t532_B : t532 = copy_via_weak t532_B in +let t532_C : t532 = copy_via_weak t532_C in +let t533_A : t533 = copy_via_weak t533_A in +let t533_B : t533 = copy_via_weak t533_B in +let t533_C : t533 = copy_via_weak t533_C in +let t533_D : t533 = copy_via_weak t533_D in +let t534_A : t534 = copy_via_weak t534_A in +let t534_B : t534 = copy_via_weak t534_B in +let t534_C : t534 = copy_via_weak t534_C in +let t535_A : t535 = copy_via_weak t535_A in +let t535_B : t535 = copy_via_weak t535_B in +let t535_C : t535 = copy_via_weak t535_C in +let t535_D : t535 = copy_via_weak t535_D in +let t535_E : t535 = copy_via_weak t535_E in +let t536_A : t536 = copy_via_weak t536_A in +let t536_B : t536 = copy_via_weak t536_B in +let t536_C : t536 = copy_via_weak t536_C in +let t536_D : t536 = copy_via_weak t536_D in +let t537_A : t537 = copy_via_weak t537_A in +let t537_B : t537 = copy_via_weak t537_B in +let t538_A : t538 = copy_via_weak t538_A in +let t538_B : t538 = copy_via_weak t538_B in +let t538_C : t538 = copy_via_weak t538_C in +let t539_A : t539 = copy_via_weak t539_A in +let t539_B : t539 = copy_via_weak t539_B in +let t539_C : t539 = copy_via_weak t539_C in +let t539_D : t539 = copy_via_weak t539_D in +let t540_A : t540 = copy_via_weak t540_A in +let t540_B : t540 = copy_via_weak t540_B in +let t540_C : t540 = copy_via_weak t540_C in +let t541_A : t541 = copy_via_weak t541_A in +let t541_B : t541 = copy_via_weak t541_B in +let t541_C : t541 = copy_via_weak t541_C in +let t541_D : t541 = copy_via_weak t541_D in +let t541_E : t541 = copy_via_weak t541_E in +let t542_A : t542 = copy_via_weak t542_A in +let t542_B : t542 = copy_via_weak t542_B in +let t543_A : t543 = copy_via_weak t543_A in +let t543_B : t543 = copy_via_weak t543_B in +let t543_C : t543 = copy_via_weak t543_C in +let t544_A : t544 = copy_via_weak t544_A in +let t544_B : t544 = copy_via_weak t544_B in +let t544_C : t544 = copy_via_weak t544_C in +let t544_D : t544 = copy_via_weak t544_D in +let t545_A : t545 = copy_via_weak t545_A in +let t545_B : t545 = copy_via_weak t545_B in +let t545_C : t545 = copy_via_weak t545_C in +let t546_A : t546 = copy_via_weak t546_A in +let t546_B : t546 = copy_via_weak t546_B in +let t547_A : t547 = copy_via_weak t547_A in +let t547_B : t547 = copy_via_weak t547_B in +let t547_C : t547 = copy_via_weak t547_C in +let t548_A : t548 = copy_via_weak t548_A in +let t548_B : t548 = copy_via_weak t548_B in +let t548_C : t548 = copy_via_weak t548_C in +let t548_D : t548 = copy_via_weak t548_D in +let t549_A : t549 = copy_via_weak t549_A in +let t549_B : t549 = copy_via_weak t549_B in +let t550_A : t550 = copy_via_weak t550_A in +let t550_B : t550 = copy_via_weak t550_B in +let t550_C : t550 = copy_via_weak t550_C in +let t551_A : t551 = copy_via_weak t551_A in +let t551_B : t551 = copy_via_weak t551_B in +let t552_A : t552 = copy_via_weak t552_A in +let t553_A : t553 = copy_via_weak t553_A in +let t553_B : t553 = copy_via_weak t553_B in +let t553_C : t553 = copy_via_weak t553_C in +let t554_A : t554 = copy_via_weak t554_A in +let t554_B : t554 = copy_via_weak t554_B in +let t555_A : t555 = copy_via_weak t555_A in +let t555_B : t555 = copy_via_weak t555_B in +let t555_C : t555 = copy_via_weak t555_C in +let t556_A : t556 = copy_via_weak t556_A in +let t556_B : t556 = copy_via_weak t556_B in +let t556_C : t556 = copy_via_weak t556_C in +let t556_D : t556 = copy_via_weak t556_D in +let t557_A : t557 = copy_via_weak t557_A in +let t557_B : t557 = copy_via_weak t557_B in +let t557_C : t557 = copy_via_weak t557_C in +let t558_A : t558 = copy_via_weak t558_A in +let t558_B : t558 = copy_via_weak t558_B in +let t558_C : t558 = copy_via_weak t558_C in +let t558_D : t558 = copy_via_weak t558_D in +let t558_E : t558 = copy_via_weak t558_E in +let t559_A : t559 = copy_via_weak t559_A in +let t559_B : t559 = copy_via_weak t559_B in +let t559_C : t559 = copy_via_weak t559_C in +let t559_D : t559 = copy_via_weak t559_D in +let t560_A : t560 = copy_via_weak t560_A in +let t560_B : t560 = copy_via_weak t560_B in +let t561_A : t561 = copy_via_weak t561_A in +let t561_B : t561 = copy_via_weak t561_B in +let t561_C : t561 = copy_via_weak t561_C in +let t562_A : t562 = copy_via_weak t562_A in +let t562_B : t562 = copy_via_weak t562_B in +let t562_C : t562 = copy_via_weak t562_C in +let t562_D : t562 = copy_via_weak t562_D in +let t563_A : t563 = copy_via_weak t563_A in +let t563_B : t563 = copy_via_weak t563_B in +let t563_C : t563 = copy_via_weak t563_C in +let t564_A : t564 = copy_via_weak t564_A in +let t564_B : t564 = copy_via_weak t564_B in +let t564_C : t564 = copy_via_weak t564_C in +let t564_D : t564 = copy_via_weak t564_D in +let t564_E : t564 = copy_via_weak t564_E in +let t565_A : t565 = copy_via_weak t565_A in +let t565_B : t565 = copy_via_weak t565_B in +let t566_A : t566 = copy_via_weak t566_A in +let t566_B : t566 = copy_via_weak t566_B in +let t566_C : t566 = copy_via_weak t566_C in +let t567_A : t567 = copy_via_weak t567_A in +let t567_B : t567 = copy_via_weak t567_B in +let t567_C : t567 = copy_via_weak t567_C in +let t567_D : t567 = copy_via_weak t567_D in +let t568_A : t568 = copy_via_weak t568_A in +let t568_B : t568 = copy_via_weak t568_B in +let t568_C : t568 = copy_via_weak t568_C in +let t569_A : t569 = copy_via_weak t569_A in +let t569_B : t569 = copy_via_weak t569_B in +let t570_A : t570 = copy_via_weak t570_A in +let t570_B : t570 = copy_via_weak t570_B in +let t570_C : t570 = copy_via_weak t570_C in +let t571_A : t571 = copy_via_weak t571_A in +let t571_B : t571 = copy_via_weak t571_B in +let t571_C : t571 = copy_via_weak t571_C in +let t571_D : t571 = copy_via_weak t571_D in +let t572_A : t572 = copy_via_weak t572_A in +let t572_B : t572 = copy_via_weak t572_B in +let t573_A : t573 = copy_via_weak t573_A in +let t573_B : t573 = copy_via_weak t573_B in +let t573_C : t573 = copy_via_weak t573_C in +let t574_A : t574 = copy_via_weak t574_A in +let t574_B : t574 = copy_via_weak t574_B in +let t575_A : t575 = copy_via_weak t575_A in +let t576_A : t576 = copy_via_weak t576_A in +let t576_B : t576 = copy_via_weak t576_B in +let t576_C : t576 = copy_via_weak t576_C in +let t576_D : t576 = copy_via_weak t576_D in +let t577_A : t577 = copy_via_weak t577_A in +let t577_B : t577 = copy_via_weak t577_B in +let t577_C : t577 = copy_via_weak t577_C in +let t578_A : t578 = copy_via_weak t578_A in +let t578_B : t578 = copy_via_weak t578_B in +let t579_A : t579 = copy_via_weak t579_A in +let t579_B : t579 = copy_via_weak t579_B in +let t579_C : t579 = copy_via_weak t579_C in +let t580_A : t580 = copy_via_weak t580_A in +let t580_B : t580 = copy_via_weak t580_B in +let t580_C : t580 = copy_via_weak t580_C in +let t580_D : t580 = copy_via_weak t580_D in +let t581_A : t581 = copy_via_weak t581_A in +let t581_B : t581 = copy_via_weak t581_B in +let t581_C : t581 = copy_via_weak t581_C in +let t582_A : t582 = copy_via_weak t582_A in +let t582_B : t582 = copy_via_weak t582_B in +let t582_C : t582 = copy_via_weak t582_C in +let t582_D : t582 = copy_via_weak t582_D in +let t582_E : t582 = copy_via_weak t582_E in +let t583_A : t583 = copy_via_weak t583_A in +let t583_B : t583 = copy_via_weak t583_B in +let t583_C : t583 = copy_via_weak t583_C in +let t583_D : t583 = copy_via_weak t583_D in +let t584_A : t584 = copy_via_weak t584_A in +let t584_B : t584 = copy_via_weak t584_B in +let t585_A : t585 = copy_via_weak t585_A in +let t585_B : t585 = copy_via_weak t585_B in +let t585_C : t585 = copy_via_weak t585_C in +let t586_A : t586 = copy_via_weak t586_A in +let t586_B : t586 = copy_via_weak t586_B in +let t586_C : t586 = copy_via_weak t586_C in +let t586_D : t586 = copy_via_weak t586_D in +let t587_A : t587 = copy_via_weak t587_A in +let t587_B : t587 = copy_via_weak t587_B in +let t587_C : t587 = copy_via_weak t587_C in +let t588_A : t588 = copy_via_weak t588_A in +let t588_B : t588 = copy_via_weak t588_B in +let t588_C : t588 = copy_via_weak t588_C in +let t588_D : t588 = copy_via_weak t588_D in +let t588_E : t588 = copy_via_weak t588_E in +let t589_A : t589 = copy_via_weak t589_A in +let t589_B : t589 = copy_via_weak t589_B in +let t590_A : t590 = copy_via_weak t590_A in +let t590_B : t590 = copy_via_weak t590_B in +let t590_C : t590 = copy_via_weak t590_C in +let t591_A : t591 = copy_via_weak t591_A in +let t591_B : t591 = copy_via_weak t591_B in +let t591_C : t591 = copy_via_weak t591_C in +let t591_D : t591 = copy_via_weak t591_D in +let t592_A : t592 = copy_via_weak t592_A in +let t592_B : t592 = copy_via_weak t592_B in +let t592_C : t592 = copy_via_weak t592_C in +let t593_A : t593 = copy_via_weak t593_A in +let t593_B : t593 = copy_via_weak t593_B in +let t594_A : t594 = copy_via_weak t594_A in +let t594_B : t594 = copy_via_weak t594_B in +let t594_C : t594 = copy_via_weak t594_C in +let t595_A : t595 = copy_via_weak t595_A in +let t595_B : t595 = copy_via_weak t595_B in +let t595_C : t595 = copy_via_weak t595_C in +let t595_D : t595 = copy_via_weak t595_D in +let t596_A : t596 = copy_via_weak t596_A in +let t596_B : t596 = copy_via_weak t596_B in +let t597_A : t597 = copy_via_weak t597_A in +let t597_B : t597 = copy_via_weak t597_B in +let t597_C : t597 = copy_via_weak t597_C in +let t598_A : t598 = copy_via_weak t598_A in +let t598_B : t598 = copy_via_weak t598_B in +let t599_A : t599 = copy_via_weak t599_A in +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 t81 t82 t83 t84 t85 t86 t87 t88 t89 t90 t91 t92 t93 t94 t95 t96 t97 t98 t99 t100 t101 t102 t103 t104 t105 t106 t107 t108 t109 t110 t111 t112 t113 t114 t115 t116 t117 t118 t119 t120 t121 t122 t123 t124 t125 t126 t127 t128 t129 t130 t131 t132 t133 t134 t135 t136 t137 t138 t139 t140 t141 t142 t143 t144 t145 t146 t147 t148 t149 t150 t151 t152 t153 t154 t155 t156 t157 t158 t159 t160 t161 t162 t163 t164 t165 t166 t167 t168 t169 t170 t171 t172 t173 t174 t175 t176 t177 t178 t179 t180 t181 t182 t183 t184 t185 t186 t187 t188 t189 t190 t191 t192 t193 t194 t195 t196 t197 t198 t199 t200 t201 t202 t203 t204 t205 t206 t207 t208 t209 t210 t211 t212 t213 t214 t215 t216 t217 t218 t219 t220 t221 t222 t223 t224 t225 t226 t227 t228 t229 t230 t231 t232 t233 t234 t235 t236 t237 t238 t239 t240 t241 t242 t243 t244 t245 t246 t247 t248 t249 t250 t251 t252 t253 t254 t255 t256 t257 t258 t259 t260 t261 t262 t263 t264 t265 t266 t267 t268 t269 t270 t271 t272 t273 t274 t275 t276 t277 t278 t279 t280 t281 t282 t283 t284 t285 t286 t287 t288 t289 t290 t291 t292 t293 t294 t295 t296 t297 t298 t299 t300_A t301_A t301_B t302_A t303_A t303_B t303_C t304_A t304_B t305_A t306_A t306_B t307_A t307_B t307_C t308_A t308_B t309_A t310_A t310_B t310_C t310_D t311_A t311_B t312_A t312_B t312_C t313_A t313_B t314_A t315_A t315_B t315_C t316_A t316_B t316_C t316_D t317_A t317_B t318_A t318_B t318_C t319_A t319_B t320_A t321_A t321_B t322_A t322_B t322_C t323_A t323_B t323_C t323_D t324_A t324_B t325_A t325_B t325_C t326_A t326_B t327_A t328_A t328_B t328_C t329_A t329_B t330_A t330_B t330_C t331_A t331_B t331_C t331_D t332_A t332_B t333_A t333_B t333_C t334_A t334_B t335_A t336_A t336_B t336_C t336_D t337_A t337_B t337_C t338_A t338_B t339_A t339_B t339_C t340_A t340_B t340_C t340_D t341_A t341_B t342_A t342_B t342_C t343_A t343_B t344_A t345_A t345_B t345_C t346_A t346_B t346_C t346_D t347_A t347_B t347_C t348_A t348_B t349_A t349_B t349_C t350_A t350_B t350_C t350_D t351_A t351_B t352_A t352_B t352_C t353_A t353_B t354_A t355_A t355_B t356_A t356_B t356_C t357_A t357_B t357_C t357_D t358_A t358_B t358_C t359_A t359_B t360_A t360_B t360_C t361_A t361_B t361_C t361_D t362_A t362_B t363_A t363_B t363_C t364_A t364_B t365_A t366_A t366_B t366_C t366_D t366_E t367_A t367_B t368_A t368_B t368_C t369_A t369_B t369_C t369_D t370_A t370_B t370_C t371_A t371_B t372_A t372_B t372_C t373_A t373_B t373_C t373_D t374_A t374_B t375_A t375_B t375_C t376_A t376_B t377_A t378_A t378_B t378_C t379_A t379_B t379_C t379_D t379_E t380_A t380_B t381_A t381_B t381_C t382_A t382_B t382_C t382_D t383_A t383_B t383_C t384_A t384_B t385_A t385_B t385_C t386_A t386_B t386_C t386_D t387_A t387_B t388_A t388_B t388_C t389_A t389_B t390_A t391_A t391_B t391_C t391_D t392_A t392_B t392_C t393_A t393_B t393_C t393_D t393_E t394_A t394_B t395_A t395_B t395_C t396_A t396_B t396_C t396_D t397_A t397_B t397_C t398_A t398_B t399_A t399_B t399_C t400_A t400_B t400_C t400_D t401_A t401_B t402_A t402_B t402_C t403_A t403_B t404_A t405_A t405_B t405_C t406_A t406_B t406_C t406_D t407_A t407_B t407_C t408_A t408_B t408_C t408_D t408_E t409_A t409_B t410_A t410_B t410_C t411_A t411_B t411_C t411_D t412_A t412_B t412_C t413_A t413_B t414_A t414_B t414_C t415_A t415_B t415_C t415_D t416_A t416_B t417_A t417_B t417_C t418_A t418_B t419_A t420_A t420_B t421_A t421_B t421_C t422_A t422_B t422_C t422_D t423_A t423_B t423_C t424_A t424_B t424_C t424_D t424_E t425_A t425_B t426_A t426_B t426_C t427_A t427_B t427_C t427_D t428_A t428_B t428_C t429_A t429_B t430_A t430_B t430_C t431_A t431_B t431_C t431_D t432_A t432_B t433_A t433_B t433_C t434_A t434_B t435_A t436_A t436_B t436_C t436_D t437_A t437_B t438_A t438_B t438_C t439_A t439_B t439_C t439_D t440_A t440_B t440_C t441_A t441_B t441_C t441_D t441_E t442_A t442_B t443_A t443_B t443_C t444_A t444_B t444_C t444_D t445_A t445_B t445_C t446_A t446_B t447_A t447_B t447_C t448_A t448_B t448_C t448_D t449_A t449_B t450_A t450_B t450_C t451_A t451_B t452_A t453_A t453_B t453_C t453_D t453_E t454_A t454_B t454_C t454_D t455_A t455_B t456_A t456_B t456_C t457_A t457_B t457_C t457_D t458_A t458_B t458_C t459_A t459_B t459_C t459_D t459_E t460_A t460_B t461_A t461_B t461_C t462_A t462_B t462_C t462_D t463_A t463_B t463_C t464_A t464_B t465_A t465_B t465_C t466_A t466_B t466_C t466_D t467_A t467_B t468_A t468_B t468_C t469_A t469_B t470_A t471_A t471_B t471_C t472_A t472_B t472_C t472_D t472_E t473_A t473_B t473_C t473_D t474_A t474_B t475_A t475_B t475_C t476_A t476_B t476_C t476_D t477_A t477_B t477_C t478_A t478_B t478_C t478_D t478_E t479_A t479_B t480_A t480_B t480_C t481_A t481_B t481_C t481_D t482_A t482_B t482_C t483_A t483_B t484_A t484_B t484_C t485_A t485_B t485_C t485_D t486_A t486_B t487_A t487_B t487_C t488_A t488_B t489_A t490_A t490_B t490_C t490_D t491_A t491_B t491_C t492_A t492_B t492_C t492_D t492_E t493_A t493_B t493_C t493_D t494_A t494_B t495_A t495_B t495_C t496_A t496_B t496_C t496_D t497_A t497_B t497_C t498_A t498_B t498_C t498_D t498_E t499_A t499_B t500_A t500_B t500_C t501_A t501_B t501_C t501_D t502_A t502_B t502_C t503_A t503_B t504_A t504_B t504_C t505_A t505_B t505_C t505_D t506_A t506_B t507_A t507_B t507_C t508_A t508_B t509_A t510_A t510_B t510_C t511_A t511_B t511_C t511_D t512_A t512_B t512_C t513_A t513_B t513_C t513_D t513_E t514_A t514_B t514_C t514_D t515_A t515_B t516_A t516_B t516_C t517_A t517_B t517_C t517_D t518_A t518_B t518_C t519_A t519_B t519_C t519_D t519_E t520_A t520_B t521_A t521_B t521_C t522_A t522_B t522_C t522_D t523_A t523_B t523_C t524_A t524_B t525_A t525_B t525_C t526_A t526_B t526_C t526_D t527_A t527_B t528_A t528_B t528_C t529_A t529_B t530_A t531_A t531_B t532_A t532_B t532_C t533_A t533_B t533_C t533_D t534_A t534_B t534_C t535_A t535_B t535_C t535_D t535_E t536_A t536_B t536_C t536_D t537_A t537_B t538_A t538_B t538_C t539_A t539_B t539_C t539_D t540_A t540_B t540_C t541_A t541_B t541_C t541_D t541_E t542_A t542_B t543_A t543_B t543_C t544_A t544_B t544_C t544_D t545_A t545_B t545_C t546_A t546_B t547_A t547_B t547_C t548_A t548_B t548_C t548_D t549_A t549_B t550_A t550_B t550_C t551_A t551_B t552_A t553_A t553_B t553_C t554_A t554_B t555_A t555_B t555_C t556_A t556_B t556_C t556_D t557_A t557_B t557_C t558_A t558_B t558_C t558_D t558_E t559_A t559_B t559_C t559_D t560_A t560_B t561_A t561_B t561_C t562_A t562_B t562_C t562_D t563_A t563_B t563_C t564_A t564_B t564_C t564_D t564_E t565_A t565_B t566_A t566_B t566_C t567_A t567_B t567_C t567_D t568_A t568_B t568_C t569_A t569_B t570_A t570_B t570_C t571_A t571_B t571_C t571_D t572_A t572_B t573_A t573_B t573_C t574_A t574_B t575_A t576_A t576_B t576_C t576_D t577_A t577_B t577_C t578_A t578_B t579_A t579_B t579_C t580_A t580_B t580_C t580_D t581_A t581_B t581_C t582_A t582_B t582_C t582_D t582_E t583_A t583_B t583_C t583_D t584_A t584_B t585_A t585_B t585_C t586_A t586_B t586_C t586_D t587_A t587_B t587_C t588_A t588_B t588_C t588_D t588_E t589_A t589_B t590_A t590_B t590_C t591_A t591_B t591_C t591_D t592_A t592_B t592_C t593_A t593_B t594_A t594_B t594_C t595_A t595_B t595_C t595_D t596_A t596_B t597_A t597_B t597_C t598_A t598_B t599_A in +print_endline " - Doing GC"; +Gc.full_major (); +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 t81 t82 t83 t84 t85 t86 t87 t88 t89 t90 t91 t92 t93 t94 t95 t96 t97 t98 t99 t100 t101 t102 t103 t104 t105 t106 t107 t108 t109 t110 t111 t112 t113 t114 t115 t116 t117 t118 t119 t120 t121 t122 t123 t124 t125 t126 t127 t128 t129 t130 t131 t132 t133 t134 t135 t136 t137 t138 t139 t140 t141 t142 t143 t144 t145 t146 t147 t148 t149 t150 t151 t152 t153 t154 t155 t156 t157 t158 t159 t160 t161 t162 t163 t164 t165 t166 t167 t168 t169 t170 t171 t172 t173 t174 t175 t176 t177 t178 t179 t180 t181 t182 t183 t184 t185 t186 t187 t188 t189 t190 t191 t192 t193 t194 t195 t196 t197 t198 t199 t200 t201 t202 t203 t204 t205 t206 t207 t208 t209 t210 t211 t212 t213 t214 t215 t216 t217 t218 t219 t220 t221 t222 t223 t224 t225 t226 t227 t228 t229 t230 t231 t232 t233 t234 t235 t236 t237 t238 t239 t240 t241 t242 t243 t244 t245 t246 t247 t248 t249 t250 t251 t252 t253 t254 t255 t256 t257 t258 t259 t260 t261 t262 t263 t264 t265 t266 t267 t268 t269 t270 t271 t272 t273 t274 t275 t276 t277 t278 t279 t280 t281 t282 t283 t284 t285 t286 t287 t288 t289 t290 t291 t292 t293 t294 t295 t296 t297 t298 t299 t300_A t301_A t301_B t302_A t303_A t303_B t303_C t304_A t304_B t305_A t306_A t306_B t307_A t307_B t307_C t308_A t308_B t309_A t310_A t310_B t310_C t310_D t311_A t311_B t312_A t312_B t312_C t313_A t313_B t314_A t315_A t315_B t315_C t316_A t316_B t316_C t316_D t317_A t317_B t318_A t318_B t318_C t319_A t319_B t320_A t321_A t321_B t322_A t322_B t322_C t323_A t323_B t323_C t323_D t324_A t324_B t325_A t325_B t325_C t326_A t326_B t327_A t328_A t328_B t328_C t329_A t329_B t330_A t330_B t330_C t331_A t331_B t331_C t331_D t332_A t332_B t333_A t333_B t333_C t334_A t334_B t335_A t336_A t336_B t336_C t336_D t337_A t337_B t337_C t338_A t338_B t339_A t339_B t339_C t340_A t340_B t340_C t340_D t341_A t341_B t342_A t342_B t342_C t343_A t343_B t344_A t345_A t345_B t345_C t346_A t346_B t346_C t346_D t347_A t347_B t347_C t348_A t348_B t349_A t349_B t349_C t350_A t350_B t350_C t350_D t351_A t351_B t352_A t352_B t352_C t353_A t353_B t354_A t355_A t355_B t356_A t356_B t356_C t357_A t357_B t357_C t357_D t358_A t358_B t358_C t359_A t359_B t360_A t360_B t360_C t361_A t361_B t361_C t361_D t362_A t362_B t363_A t363_B t363_C t364_A t364_B t365_A t366_A t366_B t366_C t366_D t366_E t367_A t367_B t368_A t368_B t368_C t369_A t369_B t369_C t369_D t370_A t370_B t370_C t371_A t371_B t372_A t372_B t372_C t373_A t373_B t373_C t373_D t374_A t374_B t375_A t375_B t375_C t376_A t376_B t377_A t378_A t378_B t378_C t379_A t379_B t379_C t379_D t379_E t380_A t380_B t381_A t381_B t381_C t382_A t382_B t382_C t382_D t383_A t383_B t383_C t384_A t384_B t385_A t385_B t385_C t386_A t386_B t386_C t386_D t387_A t387_B t388_A t388_B t388_C t389_A t389_B t390_A t391_A t391_B t391_C t391_D t392_A t392_B t392_C t393_A t393_B t393_C t393_D t393_E t394_A t394_B t395_A t395_B t395_C t396_A t396_B t396_C t396_D t397_A t397_B t397_C t398_A t398_B t399_A t399_B t399_C t400_A t400_B t400_C t400_D t401_A t401_B t402_A t402_B t402_C t403_A t403_B t404_A t405_A t405_B t405_C t406_A t406_B t406_C t406_D t407_A t407_B t407_C t408_A t408_B t408_C t408_D t408_E t409_A t409_B t410_A t410_B t410_C t411_A t411_B t411_C t411_D t412_A t412_B t412_C t413_A t413_B t414_A t414_B t414_C t415_A t415_B t415_C t415_D t416_A t416_B t417_A t417_B t417_C t418_A t418_B t419_A t420_A t420_B t421_A t421_B t421_C t422_A t422_B t422_C t422_D t423_A t423_B t423_C t424_A t424_B t424_C t424_D t424_E t425_A t425_B t426_A t426_B t426_C t427_A t427_B t427_C t427_D t428_A t428_B t428_C t429_A t429_B t430_A t430_B t430_C t431_A t431_B t431_C t431_D t432_A t432_B t433_A t433_B t433_C t434_A t434_B t435_A t436_A t436_B t436_C t436_D t437_A t437_B t438_A t438_B t438_C t439_A t439_B t439_C t439_D t440_A t440_B t440_C t441_A t441_B t441_C t441_D t441_E t442_A t442_B t443_A t443_B t443_C t444_A t444_B t444_C t444_D t445_A t445_B t445_C t446_A t446_B t447_A t447_B t447_C t448_A t448_B t448_C t448_D t449_A t449_B t450_A t450_B t450_C t451_A t451_B t452_A t453_A t453_B t453_C t453_D t453_E t454_A t454_B t454_C t454_D t455_A t455_B t456_A t456_B t456_C t457_A t457_B t457_C t457_D t458_A t458_B t458_C t459_A t459_B t459_C t459_D t459_E t460_A t460_B t461_A t461_B t461_C t462_A t462_B t462_C t462_D t463_A t463_B t463_C t464_A t464_B t465_A t465_B t465_C t466_A t466_B t466_C t466_D t467_A t467_B t468_A t468_B t468_C t469_A t469_B t470_A t471_A t471_B t471_C t472_A t472_B t472_C t472_D t472_E t473_A t473_B t473_C t473_D t474_A t474_B t475_A t475_B t475_C t476_A t476_B t476_C t476_D t477_A t477_B t477_C t478_A t478_B t478_C t478_D t478_E t479_A t479_B t480_A t480_B t480_C t481_A t481_B t481_C t481_D t482_A t482_B t482_C t483_A t483_B t484_A t484_B t484_C t485_A t485_B t485_C t485_D t486_A t486_B t487_A t487_B t487_C t488_A t488_B t489_A t490_A t490_B t490_C t490_D t491_A t491_B t491_C t492_A t492_B t492_C t492_D t492_E t493_A t493_B t493_C t493_D t494_A t494_B t495_A t495_B t495_C t496_A t496_B t496_C t496_D t497_A t497_B t497_C t498_A t498_B t498_C t498_D t498_E t499_A t499_B t500_A t500_B t500_C t501_A t501_B t501_C t501_D t502_A t502_B t502_C t503_A t503_B t504_A t504_B t504_C t505_A t505_B t505_C t505_D t506_A t506_B t507_A t507_B t507_C t508_A t508_B t509_A t510_A t510_B t510_C t511_A t511_B t511_C t511_D t512_A t512_B t512_C t513_A t513_B t513_C t513_D t513_E t514_A t514_B t514_C t514_D t515_A t515_B t516_A t516_B t516_C t517_A t517_B t517_C t517_D t518_A t518_B t518_C t519_A t519_B t519_C t519_D t519_E t520_A t520_B t521_A t521_B t521_C t522_A t522_B t522_C t522_D t523_A t523_B t523_C t524_A t524_B t525_A t525_B t525_C t526_A t526_B t526_C t526_D t527_A t527_B t528_A t528_B t528_C t529_A t529_B t530_A t531_A t531_B t532_A t532_B t532_C t533_A t533_B t533_C t533_D t534_A t534_B t534_C t535_A t535_B t535_C t535_D t535_E t536_A t536_B t536_C t536_D t537_A t537_B t538_A t538_B t538_C t539_A t539_B t539_C t539_D t540_A t540_B t540_C t541_A t541_B t541_C t541_D t541_E t542_A t542_B t543_A t543_B t543_C t544_A t544_B t544_C t544_D t545_A t545_B t545_C t546_A t546_B t547_A t547_B t547_C t548_A t548_B t548_C t548_D t549_A t549_B t550_A t550_B t550_C t551_A t551_B t552_A t553_A t553_B t553_C t554_A t554_B t555_A t555_B t555_C t556_A t556_B t556_C t556_D t557_A t557_B t557_C t558_A t558_B t558_C t558_D t558_E t559_A t559_B t559_C t559_D t560_A t560_B t561_A t561_B t561_C t562_A t562_B t562_C t562_D t563_A t563_B t563_C t564_A t564_B t564_C t564_D t564_E t565_A t565_B t566_A t566_B t566_C t567_A t567_B t567_C t567_D t568_A t568_B t568_C t569_A t569_B t570_A t570_B t570_C t571_A t571_B t571_C t571_D t572_A t572_B t573_A t573_B t573_C t574_A t574_B t575_A t576_A t576_B t576_C t576_D t577_A t577_B t577_C t578_A t578_B t579_A t579_B t579_C t580_A t580_B t580_C t580_D t581_A t581_B t581_C t582_A t582_B t582_C t582_D t582_E t583_A t583_B t583_C t583_D t584_A t584_B t585_A t585_B t585_C t586_A t586_B t586_C t586_D t587_A t587_B t587_C t588_A t588_B t588_C t588_D t588_E t589_A t589_B t590_A t590_B t590_C t591_A t591_B t591_C t591_D t592_A t592_B t592_C t593_A t593_B t594_A t594_B t594_C t595_A t595_B t595_C t595_D t596_A t596_B t597_A t597_B t597_C t598_A t598_B t599_A in +print_endline "Copying values via [Obj.with_tag]"; +let t0 : t0 = copy_via_tag t0 in +let t1 : t1 = copy_via_tag t1 in +let t2 : t2 = copy_via_tag t2 in +let t3 : t3 = copy_via_tag t3 in +let t4 : t4 = copy_via_tag t4 in +let t5 : t5 = copy_via_tag t5 in +let t6 : t6 = copy_via_tag t6 in +let t7 : t7 = copy_via_tag t7 in +let t8 : t8 = copy_via_tag t8 in +let t9 : t9 = copy_via_tag t9 in +let t10 : t10 = copy_via_tag t10 in +let t11 : t11 = copy_via_tag t11 in +let t12 : t12 = copy_via_tag t12 in +let t13 : t13 = copy_via_tag t13 in +let t14 : t14 = copy_via_tag t14 in +let t15 : t15 = copy_via_tag t15 in +let t16 : t16 = copy_via_tag t16 in +let t17 : t17 = copy_via_tag t17 in +let t18 : t18 = copy_via_tag t18 in +let t19 : t19 = copy_via_tag t19 in +let t20 : t20 = copy_via_tag t20 in +let t21 : t21 = copy_via_tag t21 in +let t22 : t22 = copy_via_tag t22 in +let t23 : t23 = copy_via_tag t23 in +let t24 : t24 = copy_via_tag t24 in +let t25 : t25 = copy_via_tag t25 in +let t26 : t26 = copy_via_tag t26 in +let t27 : t27 = copy_via_tag t27 in +let t28 : t28 = copy_via_tag t28 in +let t29 : t29 = copy_via_tag t29 in +let t30 : t30 = copy_via_tag t30 in +let t31 : t31 = copy_via_tag t31 in +let t32 : t32 = copy_via_tag t32 in +let t33 : t33 = copy_via_tag t33 in +let t34 : t34 = copy_via_tag t34 in +let t35 : t35 = copy_via_tag t35 in +let t36 : t36 = copy_via_tag t36 in +let t37 : t37 = copy_via_tag t37 in +let t38 : t38 = copy_via_tag t38 in +let t39 : t39 = copy_via_tag t39 in +let t40 : t40 = copy_via_tag t40 in +let t41 : t41 = copy_via_tag t41 in +let t42 : t42 = copy_via_tag t42 in +let t43 : t43 = copy_via_tag t43 in +let t44 : t44 = copy_via_tag t44 in +let t45 : t45 = copy_via_tag t45 in +let t46 : t46 = copy_via_tag t46 in +let t47 : t47 = copy_via_tag t47 in +let t48 : t48 = copy_via_tag t48 in +let t49 : t49 = copy_via_tag t49 in +let t50 : t50 = copy_via_tag t50 in +let t51 : t51 = copy_via_tag t51 in +let t52 : t52 = copy_via_tag t52 in +let t53 : t53 = copy_via_tag t53 in +let t54 : t54 = copy_via_tag t54 in +let t55 : t55 = copy_via_tag t55 in +let t56 : t56 = copy_via_tag t56 in +let t57 : t57 = copy_via_tag t57 in +let t58 : t58 = copy_via_tag t58 in +let t59 : t59 = copy_via_tag t59 in +let t60 : t60 = copy_via_tag t60 in +let t61 : t61 = copy_via_tag t61 in +let t62 : t62 = copy_via_tag t62 in +let t63 : t63 = copy_via_tag t63 in +let t64 : t64 = copy_via_tag t64 in +let t65 : t65 = copy_via_tag t65 in +let t66 : t66 = copy_via_tag t66 in +let t67 : t67 = copy_via_tag t67 in +let t68 : t68 = copy_via_tag t68 in +let t69 : t69 = copy_via_tag t69 in +let t70 : t70 = copy_via_tag t70 in +let t71 : t71 = copy_via_tag t71 in +let t72 : t72 = copy_via_tag t72 in +let t73 : t73 = copy_via_tag t73 in +let t74 : t74 = copy_via_tag t74 in +let t75 : t75 = copy_via_tag t75 in +let t76 : t76 = copy_via_tag t76 in +let t77 : t77 = copy_via_tag t77 in +let t78 : t78 = copy_via_tag t78 in +let t79 : t79 = copy_via_tag t79 in +let t80 : t80 = copy_via_tag t80 in +let t81 : t81 = copy_via_tag t81 in +let t82 : t82 = copy_via_tag t82 in +let t83 : t83 = copy_via_tag t83 in +let t84 : t84 = copy_via_tag t84 in +let t85 : t85 = copy_via_tag t85 in +let t86 : t86 = copy_via_tag t86 in +let t87 : t87 = copy_via_tag t87 in +let t88 : t88 = copy_via_tag t88 in +let t89 : t89 = copy_via_tag t89 in +let t90 : t90 = copy_via_tag t90 in +let t91 : t91 = copy_via_tag t91 in +let t92 : t92 = copy_via_tag t92 in +let t93 : t93 = copy_via_tag t93 in +let t94 : t94 = copy_via_tag t94 in +let t95 : t95 = copy_via_tag t95 in +let t96 : t96 = copy_via_tag t96 in +let t97 : t97 = copy_via_tag t97 in +let t98 : t98 = copy_via_tag t98 in +let t99 : t99 = copy_via_tag t99 in +let t100 : t100 = copy_via_tag t100 in +let t101 : t101 = copy_via_tag t101 in +let t102 : t102 = copy_via_tag t102 in +let t103 : t103 = copy_via_tag t103 in +let t104 : t104 = copy_via_tag t104 in +let t105 : t105 = copy_via_tag t105 in +let t106 : t106 = copy_via_tag t106 in +let t107 : t107 = copy_via_tag t107 in +let t108 : t108 = copy_via_tag t108 in +let t109 : t109 = copy_via_tag t109 in +let t110 : t110 = copy_via_tag t110 in +let t111 : t111 = copy_via_tag t111 in +let t112 : t112 = copy_via_tag t112 in +let t113 : t113 = copy_via_tag t113 in +let t114 : t114 = copy_via_tag t114 in +let t115 : t115 = copy_via_tag t115 in +let t116 : t116 = copy_via_tag t116 in +let t117 : t117 = copy_via_tag t117 in +let t118 : t118 = copy_via_tag t118 in +let t119 : t119 = copy_via_tag t119 in +let t120 : t120 = copy_via_tag t120 in +let t121 : t121 = copy_via_tag t121 in +let t122 : t122 = copy_via_tag t122 in +let t123 : t123 = copy_via_tag t123 in +let t124 : t124 = copy_via_tag t124 in +let t125 : t125 = copy_via_tag t125 in +let t126 : t126 = copy_via_tag t126 in +let t127 : t127 = copy_via_tag t127 in +let t128 : t128 = copy_via_tag t128 in +let t129 : t129 = copy_via_tag t129 in +let t130 : t130 = copy_via_tag t130 in +let t131 : t131 = copy_via_tag t131 in +let t132 : t132 = copy_via_tag t132 in +let t133 : t133 = copy_via_tag t133 in +let t134 : t134 = copy_via_tag t134 in +let t135 : t135 = copy_via_tag t135 in +let t136 : t136 = copy_via_tag t136 in +let t137 : t137 = copy_via_tag t137 in +let t138 : t138 = copy_via_tag t138 in +let t139 : t139 = copy_via_tag t139 in +let t140 : t140 = copy_via_tag t140 in +let t141 : t141 = copy_via_tag t141 in +let t142 : t142 = copy_via_tag t142 in +let t143 : t143 = copy_via_tag t143 in +let t144 : t144 = copy_via_tag t144 in +let t145 : t145 = copy_via_tag t145 in +let t146 : t146 = copy_via_tag t146 in +let t147 : t147 = copy_via_tag t147 in +let t148 : t148 = copy_via_tag t148 in +let t149 : t149 = copy_via_tag t149 in +let t150 : t150 = copy_via_tag t150 in +let t151 : t151 = copy_via_tag t151 in +let t152 : t152 = copy_via_tag t152 in +let t153 : t153 = copy_via_tag t153 in +let t154 : t154 = copy_via_tag t154 in +let t155 : t155 = copy_via_tag t155 in +let t156 : t156 = copy_via_tag t156 in +let t157 : t157 = copy_via_tag t157 in +let t158 : t158 = copy_via_tag t158 in +let t159 : t159 = copy_via_tag t159 in +let t160 : t160 = copy_via_tag t160 in +let t161 : t161 = copy_via_tag t161 in +let t162 : t162 = copy_via_tag t162 in +let t163 : t163 = copy_via_tag t163 in +let t164 : t164 = copy_via_tag t164 in +let t165 : t165 = copy_via_tag t165 in +let t166 : t166 = copy_via_tag t166 in +let t167 : t167 = copy_via_tag t167 in +let t168 : t168 = copy_via_tag t168 in +let t169 : t169 = copy_via_tag t169 in +let t170 : t170 = copy_via_tag t170 in +let t171 : t171 = copy_via_tag t171 in +let t172 : t172 = copy_via_tag t172 in +let t173 : t173 = copy_via_tag t173 in +let t174 : t174 = copy_via_tag t174 in +let t175 : t175 = copy_via_tag t175 in +let t176 : t176 = copy_via_tag t176 in +let t177 : t177 = copy_via_tag t177 in +let t178 : t178 = copy_via_tag t178 in +let t179 : t179 = copy_via_tag t179 in +let t180 : t180 = copy_via_tag t180 in +let t181 : t181 = copy_via_tag t181 in +let t182 : t182 = copy_via_tag t182 in +let t183 : t183 = copy_via_tag t183 in +let t184 : t184 = copy_via_tag t184 in +let t185 : t185 = copy_via_tag t185 in +let t186 : t186 = copy_via_tag t186 in +let t187 : t187 = copy_via_tag t187 in +let t188 : t188 = copy_via_tag t188 in +let t189 : t189 = copy_via_tag t189 in +let t190 : t190 = copy_via_tag t190 in +let t191 : t191 = copy_via_tag t191 in +let t192 : t192 = copy_via_tag t192 in +let t193 : t193 = copy_via_tag t193 in +let t194 : t194 = copy_via_tag t194 in +let t195 : t195 = copy_via_tag t195 in +let t196 : t196 = copy_via_tag t196 in +let t197 : t197 = copy_via_tag t197 in +let t198 : t198 = copy_via_tag t198 in +let t199 : t199 = copy_via_tag t199 in +let t200 : t200 = copy_via_tag t200 in +let t201 : t201 = copy_via_tag t201 in +let t202 : t202 = copy_via_tag t202 in +let t203 : t203 = copy_via_tag t203 in +let t204 : t204 = copy_via_tag t204 in +let t205 : t205 = copy_via_tag t205 in +let t206 : t206 = copy_via_tag t206 in +let t207 : t207 = copy_via_tag t207 in +let t208 : t208 = copy_via_tag t208 in +let t209 : t209 = copy_via_tag t209 in +let t210 : t210 = copy_via_tag t210 in +let t211 : t211 = copy_via_tag t211 in +let t212 : t212 = copy_via_tag t212 in +let t213 : t213 = copy_via_tag t213 in +let t214 : t214 = copy_via_tag t214 in +let t215 : t215 = copy_via_tag t215 in +let t216 : t216 = copy_via_tag t216 in +let t217 : t217 = copy_via_tag t217 in +let t218 : t218 = copy_via_tag t218 in +let t219 : t219 = copy_via_tag t219 in +let t220 : t220 = copy_via_tag t220 in +let t221 : t221 = copy_via_tag t221 in +let t222 : t222 = copy_via_tag t222 in +let t223 : t223 = copy_via_tag t223 in +let t224 : t224 = copy_via_tag t224 in +let t225 : t225 = copy_via_tag t225 in +let t226 : t226 = copy_via_tag t226 in +let t227 : t227 = copy_via_tag t227 in +let t228 : t228 = copy_via_tag t228 in +let t229 : t229 = copy_via_tag t229 in +let t230 : t230 = copy_via_tag t230 in +let t231 : t231 = copy_via_tag t231 in +let t232 : t232 = copy_via_tag t232 in +let t233 : t233 = copy_via_tag t233 in +let t234 : t234 = copy_via_tag t234 in +let t235 : t235 = copy_via_tag t235 in +let t236 : t236 = copy_via_tag t236 in +let t237 : t237 = copy_via_tag t237 in +let t238 : t238 = copy_via_tag t238 in +let t239 : t239 = copy_via_tag t239 in +let t240 : t240 = copy_via_tag t240 in +let t241 : t241 = copy_via_tag t241 in +let t242 : t242 = copy_via_tag t242 in +let t243 : t243 = copy_via_tag t243 in +let t244 : t244 = copy_via_tag t244 in +let t245 : t245 = copy_via_tag t245 in +let t246 : t246 = copy_via_tag t246 in +let t247 : t247 = copy_via_tag t247 in +let t248 : t248 = copy_via_tag t248 in +let t249 : t249 = copy_via_tag t249 in +let t250 : t250 = copy_via_tag t250 in +let t251 : t251 = copy_via_tag t251 in +let t252 : t252 = copy_via_tag t252 in +let t253 : t253 = copy_via_tag t253 in +let t254 : t254 = copy_via_tag t254 in +let t255 : t255 = copy_via_tag t255 in +let t256 : t256 = copy_via_tag t256 in +let t257 : t257 = copy_via_tag t257 in +let t258 : t258 = copy_via_tag t258 in +let t259 : t259 = copy_via_tag t259 in +let t260 : t260 = copy_via_tag t260 in +let t261 : t261 = copy_via_tag t261 in +let t262 : t262 = copy_via_tag t262 in +let t263 : t263 = copy_via_tag t263 in +let t264 : t264 = copy_via_tag t264 in +let t265 : t265 = copy_via_tag t265 in +let t266 : t266 = copy_via_tag t266 in +let t267 : t267 = copy_via_tag t267 in +let t268 : t268 = copy_via_tag t268 in +let t269 : t269 = copy_via_tag t269 in +let t270 : t270 = copy_via_tag t270 in +let t271 : t271 = copy_via_tag t271 in +let t272 : t272 = copy_via_tag t272 in +let t273 : t273 = copy_via_tag t273 in +let t274 : t274 = copy_via_tag t274 in +let t275 : t275 = copy_via_tag t275 in +let t276 : t276 = copy_via_tag t276 in +let t277 : t277 = copy_via_tag t277 in +let t278 : t278 = copy_via_tag t278 in +let t279 : t279 = copy_via_tag t279 in +let t280 : t280 = copy_via_tag t280 in +let t281 : t281 = copy_via_tag t281 in +let t282 : t282 = copy_via_tag t282 in +let t283 : t283 = copy_via_tag t283 in +let t284 : t284 = copy_via_tag t284 in +let t285 : t285 = copy_via_tag t285 in +let t286 : t286 = copy_via_tag t286 in +let t287 : t287 = copy_via_tag t287 in +let t288 : t288 = copy_via_tag t288 in +let t289 : t289 = copy_via_tag t289 in +let t290 : t290 = copy_via_tag t290 in +let t291 : t291 = copy_via_tag t291 in +let t292 : t292 = copy_via_tag t292 in +let t293 : t293 = copy_via_tag t293 in +let t294 : t294 = copy_via_tag t294 in +let t295 : t295 = copy_via_tag t295 in +let t296 : t296 = copy_via_tag t296 in +let t297 : t297 = copy_via_tag t297 in +let t298 : t298 = copy_via_tag t298 in +let t299 : t299 = copy_via_tag t299 in +let t300_A : t300 = copy_via_tag t300_A in +let t301_A : t301 = copy_via_tag t301_A in +let t301_B : t301 = copy_via_tag t301_B in +let t302_A : t302 = copy_via_tag t302_A in +let t303_A : t303 = copy_via_tag t303_A in +let t303_B : t303 = copy_via_tag t303_B in +let t303_C : t303 = copy_via_tag t303_C in +let t304_A : t304 = copy_via_tag t304_A in +let t304_B : t304 = copy_via_tag t304_B in +let t305_A : t305 = copy_via_tag t305_A in +let t306_A : t306 = copy_via_tag t306_A in +let t306_B : t306 = copy_via_tag t306_B in +let t307_A : t307 = copy_via_tag t307_A in +let t307_B : t307 = copy_via_tag t307_B in +let t307_C : t307 = copy_via_tag t307_C in +let t308_A : t308 = copy_via_tag t308_A in +let t308_B : t308 = copy_via_tag t308_B in +let t309_A : t309 = copy_via_tag t309_A in +let t310_A : t310 = copy_via_tag t310_A in +let t310_B : t310 = copy_via_tag t310_B in +let t310_C : t310 = copy_via_tag t310_C in +let t310_D : t310 = copy_via_tag t310_D in +let t311_A : t311 = copy_via_tag t311_A in +let t311_B : t311 = copy_via_tag t311_B in +let t312_A : t312 = copy_via_tag t312_A in +let t312_B : t312 = copy_via_tag t312_B in +let t312_C : t312 = copy_via_tag t312_C in +let t313_A : t313 = copy_via_tag t313_A in +let t313_B : t313 = copy_via_tag t313_B in +let t314_A : t314 = copy_via_tag t314_A in +let t315_A : t315 = copy_via_tag t315_A in +let t315_B : t315 = copy_via_tag t315_B in +let t315_C : t315 = copy_via_tag t315_C in +let t316_A : t316 = copy_via_tag t316_A in +let t316_B : t316 = copy_via_tag t316_B in +let t316_C : t316 = copy_via_tag t316_C in +let t316_D : t316 = copy_via_tag t316_D in +let t317_A : t317 = copy_via_tag t317_A in +let t317_B : t317 = copy_via_tag t317_B in +let t318_A : t318 = copy_via_tag t318_A in +let t318_B : t318 = copy_via_tag t318_B in +let t318_C : t318 = copy_via_tag t318_C in +let t319_A : t319 = copy_via_tag t319_A in +let t319_B : t319 = copy_via_tag t319_B in +let t320_A : t320 = copy_via_tag t320_A in +let t321_A : t321 = copy_via_tag t321_A in +let t321_B : t321 = copy_via_tag t321_B in +let t322_A : t322 = copy_via_tag t322_A in +let t322_B : t322 = copy_via_tag t322_B in +let t322_C : t322 = copy_via_tag t322_C in +let t323_A : t323 = copy_via_tag t323_A in +let t323_B : t323 = copy_via_tag t323_B in +let t323_C : t323 = copy_via_tag t323_C in +let t323_D : t323 = copy_via_tag t323_D in +let t324_A : t324 = copy_via_tag t324_A in +let t324_B : t324 = copy_via_tag t324_B in +let t325_A : t325 = copy_via_tag t325_A in +let t325_B : t325 = copy_via_tag t325_B in +let t325_C : t325 = copy_via_tag t325_C in +let t326_A : t326 = copy_via_tag t326_A in +let t326_B : t326 = copy_via_tag t326_B in +let t327_A : t327 = copy_via_tag t327_A in +let t328_A : t328 = copy_via_tag t328_A in +let t328_B : t328 = copy_via_tag t328_B in +let t328_C : t328 = copy_via_tag t328_C in +let t329_A : t329 = copy_via_tag t329_A in +let t329_B : t329 = copy_via_tag t329_B in +let t330_A : t330 = copy_via_tag t330_A in +let t330_B : t330 = copy_via_tag t330_B in +let t330_C : t330 = copy_via_tag t330_C in +let t331_A : t331 = copy_via_tag t331_A in +let t331_B : t331 = copy_via_tag t331_B in +let t331_C : t331 = copy_via_tag t331_C in +let t331_D : t331 = copy_via_tag t331_D in +let t332_A : t332 = copy_via_tag t332_A in +let t332_B : t332 = copy_via_tag t332_B in +let t333_A : t333 = copy_via_tag t333_A in +let t333_B : t333 = copy_via_tag t333_B in +let t333_C : t333 = copy_via_tag t333_C in +let t334_A : t334 = copy_via_tag t334_A in +let t334_B : t334 = copy_via_tag t334_B in +let t335_A : t335 = copy_via_tag t335_A in +let t336_A : t336 = copy_via_tag t336_A in +let t336_B : t336 = copy_via_tag t336_B in +let t336_C : t336 = copy_via_tag t336_C in +let t336_D : t336 = copy_via_tag t336_D in +let t337_A : t337 = copy_via_tag t337_A in +let t337_B : t337 = copy_via_tag t337_B in +let t337_C : t337 = copy_via_tag t337_C in +let t338_A : t338 = copy_via_tag t338_A in +let t338_B : t338 = copy_via_tag t338_B in +let t339_A : t339 = copy_via_tag t339_A in +let t339_B : t339 = copy_via_tag t339_B in +let t339_C : t339 = copy_via_tag t339_C in +let t340_A : t340 = copy_via_tag t340_A in +let t340_B : t340 = copy_via_tag t340_B in +let t340_C : t340 = copy_via_tag t340_C in +let t340_D : t340 = copy_via_tag t340_D in +let t341_A : t341 = copy_via_tag t341_A in +let t341_B : t341 = copy_via_tag t341_B in +let t342_A : t342 = copy_via_tag t342_A in +let t342_B : t342 = copy_via_tag t342_B in +let t342_C : t342 = copy_via_tag t342_C in +let t343_A : t343 = copy_via_tag t343_A in +let t343_B : t343 = copy_via_tag t343_B in +let t344_A : t344 = copy_via_tag t344_A in +let t345_A : t345 = copy_via_tag t345_A in +let t345_B : t345 = copy_via_tag t345_B in +let t345_C : t345 = copy_via_tag t345_C in +let t346_A : t346 = copy_via_tag t346_A in +let t346_B : t346 = copy_via_tag t346_B in +let t346_C : t346 = copy_via_tag t346_C in +let t346_D : t346 = copy_via_tag t346_D in +let t347_A : t347 = copy_via_tag t347_A in +let t347_B : t347 = copy_via_tag t347_B in +let t347_C : t347 = copy_via_tag t347_C in +let t348_A : t348 = copy_via_tag t348_A in +let t348_B : t348 = copy_via_tag t348_B in +let t349_A : t349 = copy_via_tag t349_A in +let t349_B : t349 = copy_via_tag t349_B in +let t349_C : t349 = copy_via_tag t349_C in +let t350_A : t350 = copy_via_tag t350_A in +let t350_B : t350 = copy_via_tag t350_B in +let t350_C : t350 = copy_via_tag t350_C in +let t350_D : t350 = copy_via_tag t350_D in +let t351_A : t351 = copy_via_tag t351_A in +let t351_B : t351 = copy_via_tag t351_B in +let t352_A : t352 = copy_via_tag t352_A in +let t352_B : t352 = copy_via_tag t352_B in +let t352_C : t352 = copy_via_tag t352_C in +let t353_A : t353 = copy_via_tag t353_A in +let t353_B : t353 = copy_via_tag t353_B in +let t354_A : t354 = copy_via_tag t354_A in +let t355_A : t355 = copy_via_tag t355_A in +let t355_B : t355 = copy_via_tag t355_B in +let t356_A : t356 = copy_via_tag t356_A in +let t356_B : t356 = copy_via_tag t356_B in +let t356_C : t356 = copy_via_tag t356_C in +let t357_A : t357 = copy_via_tag t357_A in +let t357_B : t357 = copy_via_tag t357_B in +let t357_C : t357 = copy_via_tag t357_C in +let t357_D : t357 = copy_via_tag t357_D in +let t358_A : t358 = copy_via_tag t358_A in +let t358_B : t358 = copy_via_tag t358_B in +let t358_C : t358 = copy_via_tag t358_C in +let t359_A : t359 = copy_via_tag t359_A in +let t359_B : t359 = copy_via_tag t359_B in +let t360_A : t360 = copy_via_tag t360_A in +let t360_B : t360 = copy_via_tag t360_B in +let t360_C : t360 = copy_via_tag t360_C in +let t361_A : t361 = copy_via_tag t361_A in +let t361_B : t361 = copy_via_tag t361_B in +let t361_C : t361 = copy_via_tag t361_C in +let t361_D : t361 = copy_via_tag t361_D in +let t362_A : t362 = copy_via_tag t362_A in +let t362_B : t362 = copy_via_tag t362_B in +let t363_A : t363 = copy_via_tag t363_A in +let t363_B : t363 = copy_via_tag t363_B in +let t363_C : t363 = copy_via_tag t363_C in +let t364_A : t364 = copy_via_tag t364_A in +let t364_B : t364 = copy_via_tag t364_B in +let t365_A : t365 = copy_via_tag t365_A in +let t366_A : t366 = copy_via_tag t366_A in +let t366_B : t366 = copy_via_tag t366_B in +let t366_C : t366 = copy_via_tag t366_C in +let t366_D : t366 = copy_via_tag t366_D in +let t366_E : t366 = copy_via_tag t366_E in +let t367_A : t367 = copy_via_tag t367_A in +let t367_B : t367 = copy_via_tag t367_B in +let t368_A : t368 = copy_via_tag t368_A in +let t368_B : t368 = copy_via_tag t368_B in +let t368_C : t368 = copy_via_tag t368_C in +let t369_A : t369 = copy_via_tag t369_A in +let t369_B : t369 = copy_via_tag t369_B in +let t369_C : t369 = copy_via_tag t369_C in +let t369_D : t369 = copy_via_tag t369_D in +let t370_A : t370 = copy_via_tag t370_A in +let t370_B : t370 = copy_via_tag t370_B in +let t370_C : t370 = copy_via_tag t370_C in +let t371_A : t371 = copy_via_tag t371_A in +let t371_B : t371 = copy_via_tag t371_B in +let t372_A : t372 = copy_via_tag t372_A in +let t372_B : t372 = copy_via_tag t372_B in +let t372_C : t372 = copy_via_tag t372_C in +let t373_A : t373 = copy_via_tag t373_A in +let t373_B : t373 = copy_via_tag t373_B in +let t373_C : t373 = copy_via_tag t373_C in +let t373_D : t373 = copy_via_tag t373_D in +let t374_A : t374 = copy_via_tag t374_A in +let t374_B : t374 = copy_via_tag t374_B in +let t375_A : t375 = copy_via_tag t375_A in +let t375_B : t375 = copy_via_tag t375_B in +let t375_C : t375 = copy_via_tag t375_C in +let t376_A : t376 = copy_via_tag t376_A in +let t376_B : t376 = copy_via_tag t376_B in +let t377_A : t377 = copy_via_tag t377_A in +let t378_A : t378 = copy_via_tag t378_A in +let t378_B : t378 = copy_via_tag t378_B in +let t378_C : t378 = copy_via_tag t378_C in +let t379_A : t379 = copy_via_tag t379_A in +let t379_B : t379 = copy_via_tag t379_B in +let t379_C : t379 = copy_via_tag t379_C in +let t379_D : t379 = copy_via_tag t379_D in +let t379_E : t379 = copy_via_tag t379_E in +let t380_A : t380 = copy_via_tag t380_A in +let t380_B : t380 = copy_via_tag t380_B in +let t381_A : t381 = copy_via_tag t381_A in +let t381_B : t381 = copy_via_tag t381_B in +let t381_C : t381 = copy_via_tag t381_C in +let t382_A : t382 = copy_via_tag t382_A in +let t382_B : t382 = copy_via_tag t382_B in +let t382_C : t382 = copy_via_tag t382_C in +let t382_D : t382 = copy_via_tag t382_D in +let t383_A : t383 = copy_via_tag t383_A in +let t383_B : t383 = copy_via_tag t383_B in +let t383_C : t383 = copy_via_tag t383_C in +let t384_A : t384 = copy_via_tag t384_A in +let t384_B : t384 = copy_via_tag t384_B in +let t385_A : t385 = copy_via_tag t385_A in +let t385_B : t385 = copy_via_tag t385_B in +let t385_C : t385 = copy_via_tag t385_C in +let t386_A : t386 = copy_via_tag t386_A in +let t386_B : t386 = copy_via_tag t386_B in +let t386_C : t386 = copy_via_tag t386_C in +let t386_D : t386 = copy_via_tag t386_D in +let t387_A : t387 = copy_via_tag t387_A in +let t387_B : t387 = copy_via_tag t387_B in +let t388_A : t388 = copy_via_tag t388_A in +let t388_B : t388 = copy_via_tag t388_B in +let t388_C : t388 = copy_via_tag t388_C in +let t389_A : t389 = copy_via_tag t389_A in +let t389_B : t389 = copy_via_tag t389_B in +let t390_A : t390 = copy_via_tag t390_A in +let t391_A : t391 = copy_via_tag t391_A in +let t391_B : t391 = copy_via_tag t391_B in +let t391_C : t391 = copy_via_tag t391_C in +let t391_D : t391 = copy_via_tag t391_D in +let t392_A : t392 = copy_via_tag t392_A in +let t392_B : t392 = copy_via_tag t392_B in +let t392_C : t392 = copy_via_tag t392_C in +let t393_A : t393 = copy_via_tag t393_A in +let t393_B : t393 = copy_via_tag t393_B in +let t393_C : t393 = copy_via_tag t393_C in +let t393_D : t393 = copy_via_tag t393_D in +let t393_E : t393 = copy_via_tag t393_E in +let t394_A : t394 = copy_via_tag t394_A in +let t394_B : t394 = copy_via_tag t394_B in +let t395_A : t395 = copy_via_tag t395_A in +let t395_B : t395 = copy_via_tag t395_B in +let t395_C : t395 = copy_via_tag t395_C in +let t396_A : t396 = copy_via_tag t396_A in +let t396_B : t396 = copy_via_tag t396_B in +let t396_C : t396 = copy_via_tag t396_C in +let t396_D : t396 = copy_via_tag t396_D in +let t397_A : t397 = copy_via_tag t397_A in +let t397_B : t397 = copy_via_tag t397_B in +let t397_C : t397 = copy_via_tag t397_C in +let t398_A : t398 = copy_via_tag t398_A in +let t398_B : t398 = copy_via_tag t398_B in +let t399_A : t399 = copy_via_tag t399_A in +let t399_B : t399 = copy_via_tag t399_B in +let t399_C : t399 = copy_via_tag t399_C in +let t400_A : t400 = copy_via_tag t400_A in +let t400_B : t400 = copy_via_tag t400_B in +let t400_C : t400 = copy_via_tag t400_C in +let t400_D : t400 = copy_via_tag t400_D in +let t401_A : t401 = copy_via_tag t401_A in +let t401_B : t401 = copy_via_tag t401_B in +let t402_A : t402 = copy_via_tag t402_A in +let t402_B : t402 = copy_via_tag t402_B in +let t402_C : t402 = copy_via_tag t402_C in +let t403_A : t403 = copy_via_tag t403_A in +let t403_B : t403 = copy_via_tag t403_B in +let t404_A : t404 = copy_via_tag t404_A in +let t405_A : t405 = copy_via_tag t405_A in +let t405_B : t405 = copy_via_tag t405_B in +let t405_C : t405 = copy_via_tag t405_C in +let t406_A : t406 = copy_via_tag t406_A in +let t406_B : t406 = copy_via_tag t406_B in +let t406_C : t406 = copy_via_tag t406_C in +let t406_D : t406 = copy_via_tag t406_D in +let t407_A : t407 = copy_via_tag t407_A in +let t407_B : t407 = copy_via_tag t407_B in +let t407_C : t407 = copy_via_tag t407_C in +let t408_A : t408 = copy_via_tag t408_A in +let t408_B : t408 = copy_via_tag t408_B in +let t408_C : t408 = copy_via_tag t408_C in +let t408_D : t408 = copy_via_tag t408_D in +let t408_E : t408 = copy_via_tag t408_E in +let t409_A : t409 = copy_via_tag t409_A in +let t409_B : t409 = copy_via_tag t409_B in +let t410_A : t410 = copy_via_tag t410_A in +let t410_B : t410 = copy_via_tag t410_B in +let t410_C : t410 = copy_via_tag t410_C in +let t411_A : t411 = copy_via_tag t411_A in +let t411_B : t411 = copy_via_tag t411_B in +let t411_C : t411 = copy_via_tag t411_C in +let t411_D : t411 = copy_via_tag t411_D in +let t412_A : t412 = copy_via_tag t412_A in +let t412_B : t412 = copy_via_tag t412_B in +let t412_C : t412 = copy_via_tag t412_C in +let t413_A : t413 = copy_via_tag t413_A in +let t413_B : t413 = copy_via_tag t413_B in +let t414_A : t414 = copy_via_tag t414_A in +let t414_B : t414 = copy_via_tag t414_B in +let t414_C : t414 = copy_via_tag t414_C in +let t415_A : t415 = copy_via_tag t415_A in +let t415_B : t415 = copy_via_tag t415_B in +let t415_C : t415 = copy_via_tag t415_C in +let t415_D : t415 = copy_via_tag t415_D in +let t416_A : t416 = copy_via_tag t416_A in +let t416_B : t416 = copy_via_tag t416_B in +let t417_A : t417 = copy_via_tag t417_A in +let t417_B : t417 = copy_via_tag t417_B in +let t417_C : t417 = copy_via_tag t417_C in +let t418_A : t418 = copy_via_tag t418_A in +let t418_B : t418 = copy_via_tag t418_B in +let t419_A : t419 = copy_via_tag t419_A in +let t420_A : t420 = copy_via_tag t420_A in +let t420_B : t420 = copy_via_tag t420_B in +let t421_A : t421 = copy_via_tag t421_A in +let t421_B : t421 = copy_via_tag t421_B in +let t421_C : t421 = copy_via_tag t421_C in +let t422_A : t422 = copy_via_tag t422_A in +let t422_B : t422 = copy_via_tag t422_B in +let t422_C : t422 = copy_via_tag t422_C in +let t422_D : t422 = copy_via_tag t422_D in +let t423_A : t423 = copy_via_tag t423_A in +let t423_B : t423 = copy_via_tag t423_B in +let t423_C : t423 = copy_via_tag t423_C in +let t424_A : t424 = copy_via_tag t424_A in +let t424_B : t424 = copy_via_tag t424_B in +let t424_C : t424 = copy_via_tag t424_C in +let t424_D : t424 = copy_via_tag t424_D in +let t424_E : t424 = copy_via_tag t424_E in +let t425_A : t425 = copy_via_tag t425_A in +let t425_B : t425 = copy_via_tag t425_B in +let t426_A : t426 = copy_via_tag t426_A in +let t426_B : t426 = copy_via_tag t426_B in +let t426_C : t426 = copy_via_tag t426_C in +let t427_A : t427 = copy_via_tag t427_A in +let t427_B : t427 = copy_via_tag t427_B in +let t427_C : t427 = copy_via_tag t427_C in +let t427_D : t427 = copy_via_tag t427_D in +let t428_A : t428 = copy_via_tag t428_A in +let t428_B : t428 = copy_via_tag t428_B in +let t428_C : t428 = copy_via_tag t428_C in +let t429_A : t429 = copy_via_tag t429_A in +let t429_B : t429 = copy_via_tag t429_B in +let t430_A : t430 = copy_via_tag t430_A in +let t430_B : t430 = copy_via_tag t430_B in +let t430_C : t430 = copy_via_tag t430_C in +let t431_A : t431 = copy_via_tag t431_A in +let t431_B : t431 = copy_via_tag t431_B in +let t431_C : t431 = copy_via_tag t431_C in +let t431_D : t431 = copy_via_tag t431_D in +let t432_A : t432 = copy_via_tag t432_A in +let t432_B : t432 = copy_via_tag t432_B in +let t433_A : t433 = copy_via_tag t433_A in +let t433_B : t433 = copy_via_tag t433_B in +let t433_C : t433 = copy_via_tag t433_C in +let t434_A : t434 = copy_via_tag t434_A in +let t434_B : t434 = copy_via_tag t434_B in +let t435_A : t435 = copy_via_tag t435_A in +let t436_A : t436 = copy_via_tag t436_A in +let t436_B : t436 = copy_via_tag t436_B in +let t436_C : t436 = copy_via_tag t436_C in +let t436_D : t436 = copy_via_tag t436_D in +let t437_A : t437 = copy_via_tag t437_A in +let t437_B : t437 = copy_via_tag t437_B in +let t438_A : t438 = copy_via_tag t438_A in +let t438_B : t438 = copy_via_tag t438_B in +let t438_C : t438 = copy_via_tag t438_C in +let t439_A : t439 = copy_via_tag t439_A in +let t439_B : t439 = copy_via_tag t439_B in +let t439_C : t439 = copy_via_tag t439_C in +let t439_D : t439 = copy_via_tag t439_D in +let t440_A : t440 = copy_via_tag t440_A in +let t440_B : t440 = copy_via_tag t440_B in +let t440_C : t440 = copy_via_tag t440_C in +let t441_A : t441 = copy_via_tag t441_A in +let t441_B : t441 = copy_via_tag t441_B in +let t441_C : t441 = copy_via_tag t441_C in +let t441_D : t441 = copy_via_tag t441_D in +let t441_E : t441 = copy_via_tag t441_E in +let t442_A : t442 = copy_via_tag t442_A in +let t442_B : t442 = copy_via_tag t442_B in +let t443_A : t443 = copy_via_tag t443_A in +let t443_B : t443 = copy_via_tag t443_B in +let t443_C : t443 = copy_via_tag t443_C in +let t444_A : t444 = copy_via_tag t444_A in +let t444_B : t444 = copy_via_tag t444_B in +let t444_C : t444 = copy_via_tag t444_C in +let t444_D : t444 = copy_via_tag t444_D in +let t445_A : t445 = copy_via_tag t445_A in +let t445_B : t445 = copy_via_tag t445_B in +let t445_C : t445 = copy_via_tag t445_C in +let t446_A : t446 = copy_via_tag t446_A in +let t446_B : t446 = copy_via_tag t446_B in +let t447_A : t447 = copy_via_tag t447_A in +let t447_B : t447 = copy_via_tag t447_B in +let t447_C : t447 = copy_via_tag t447_C in +let t448_A : t448 = copy_via_tag t448_A in +let t448_B : t448 = copy_via_tag t448_B in +let t448_C : t448 = copy_via_tag t448_C in +let t448_D : t448 = copy_via_tag t448_D in +let t449_A : t449 = copy_via_tag t449_A in +let t449_B : t449 = copy_via_tag t449_B in +let t450_A : t450 = copy_via_tag t450_A in +let t450_B : t450 = copy_via_tag t450_B in +let t450_C : t450 = copy_via_tag t450_C in +let t451_A : t451 = copy_via_tag t451_A in +let t451_B : t451 = copy_via_tag t451_B in +let t452_A : t452 = copy_via_tag t452_A in +let t453_A : t453 = copy_via_tag t453_A in +let t453_B : t453 = copy_via_tag t453_B in +let t453_C : t453 = copy_via_tag t453_C in +let t453_D : t453 = copy_via_tag t453_D in +let t453_E : t453 = copy_via_tag t453_E in +let t454_A : t454 = copy_via_tag t454_A in +let t454_B : t454 = copy_via_tag t454_B in +let t454_C : t454 = copy_via_tag t454_C in +let t454_D : t454 = copy_via_tag t454_D in +let t455_A : t455 = copy_via_tag t455_A in +let t455_B : t455 = copy_via_tag t455_B in +let t456_A : t456 = copy_via_tag t456_A in +let t456_B : t456 = copy_via_tag t456_B in +let t456_C : t456 = copy_via_tag t456_C in +let t457_A : t457 = copy_via_tag t457_A in +let t457_B : t457 = copy_via_tag t457_B in +let t457_C : t457 = copy_via_tag t457_C in +let t457_D : t457 = copy_via_tag t457_D in +let t458_A : t458 = copy_via_tag t458_A in +let t458_B : t458 = copy_via_tag t458_B in +let t458_C : t458 = copy_via_tag t458_C in +let t459_A : t459 = copy_via_tag t459_A in +let t459_B : t459 = copy_via_tag t459_B in +let t459_C : t459 = copy_via_tag t459_C in +let t459_D : t459 = copy_via_tag t459_D in +let t459_E : t459 = copy_via_tag t459_E in +let t460_A : t460 = copy_via_tag t460_A in +let t460_B : t460 = copy_via_tag t460_B in +let t461_A : t461 = copy_via_tag t461_A in +let t461_B : t461 = copy_via_tag t461_B in +let t461_C : t461 = copy_via_tag t461_C in +let t462_A : t462 = copy_via_tag t462_A in +let t462_B : t462 = copy_via_tag t462_B in +let t462_C : t462 = copy_via_tag t462_C in +let t462_D : t462 = copy_via_tag t462_D in +let t463_A : t463 = copy_via_tag t463_A in +let t463_B : t463 = copy_via_tag t463_B in +let t463_C : t463 = copy_via_tag t463_C in +let t464_A : t464 = copy_via_tag t464_A in +let t464_B : t464 = copy_via_tag t464_B in +let t465_A : t465 = copy_via_tag t465_A in +let t465_B : t465 = copy_via_tag t465_B in +let t465_C : t465 = copy_via_tag t465_C in +let t466_A : t466 = copy_via_tag t466_A in +let t466_B : t466 = copy_via_tag t466_B in +let t466_C : t466 = copy_via_tag t466_C in +let t466_D : t466 = copy_via_tag t466_D in +let t467_A : t467 = copy_via_tag t467_A in +let t467_B : t467 = copy_via_tag t467_B in +let t468_A : t468 = copy_via_tag t468_A in +let t468_B : t468 = copy_via_tag t468_B in +let t468_C : t468 = copy_via_tag t468_C in +let t469_A : t469 = copy_via_tag t469_A in +let t469_B : t469 = copy_via_tag t469_B in +let t470_A : t470 = copy_via_tag t470_A in +let t471_A : t471 = copy_via_tag t471_A in +let t471_B : t471 = copy_via_tag t471_B in +let t471_C : t471 = copy_via_tag t471_C in +let t472_A : t472 = copy_via_tag t472_A in +let t472_B : t472 = copy_via_tag t472_B in +let t472_C : t472 = copy_via_tag t472_C in +let t472_D : t472 = copy_via_tag t472_D in +let t472_E : t472 = copy_via_tag t472_E in +let t473_A : t473 = copy_via_tag t473_A in +let t473_B : t473 = copy_via_tag t473_B in +let t473_C : t473 = copy_via_tag t473_C in +let t473_D : t473 = copy_via_tag t473_D in +let t474_A : t474 = copy_via_tag t474_A in +let t474_B : t474 = copy_via_tag t474_B in +let t475_A : t475 = copy_via_tag t475_A in +let t475_B : t475 = copy_via_tag t475_B in +let t475_C : t475 = copy_via_tag t475_C in +let t476_A : t476 = copy_via_tag t476_A in +let t476_B : t476 = copy_via_tag t476_B in +let t476_C : t476 = copy_via_tag t476_C in +let t476_D : t476 = copy_via_tag t476_D in +let t477_A : t477 = copy_via_tag t477_A in +let t477_B : t477 = copy_via_tag t477_B in +let t477_C : t477 = copy_via_tag t477_C in +let t478_A : t478 = copy_via_tag t478_A in +let t478_B : t478 = copy_via_tag t478_B in +let t478_C : t478 = copy_via_tag t478_C in +let t478_D : t478 = copy_via_tag t478_D in +let t478_E : t478 = copy_via_tag t478_E in +let t479_A : t479 = copy_via_tag t479_A in +let t479_B : t479 = copy_via_tag t479_B in +let t480_A : t480 = copy_via_tag t480_A in +let t480_B : t480 = copy_via_tag t480_B in +let t480_C : t480 = copy_via_tag t480_C in +let t481_A : t481 = copy_via_tag t481_A in +let t481_B : t481 = copy_via_tag t481_B in +let t481_C : t481 = copy_via_tag t481_C in +let t481_D : t481 = copy_via_tag t481_D in +let t482_A : t482 = copy_via_tag t482_A in +let t482_B : t482 = copy_via_tag t482_B in +let t482_C : t482 = copy_via_tag t482_C in +let t483_A : t483 = copy_via_tag t483_A in +let t483_B : t483 = copy_via_tag t483_B in +let t484_A : t484 = copy_via_tag t484_A in +let t484_B : t484 = copy_via_tag t484_B in +let t484_C : t484 = copy_via_tag t484_C in +let t485_A : t485 = copy_via_tag t485_A in +let t485_B : t485 = copy_via_tag t485_B in +let t485_C : t485 = copy_via_tag t485_C in +let t485_D : t485 = copy_via_tag t485_D in +let t486_A : t486 = copy_via_tag t486_A in +let t486_B : t486 = copy_via_tag t486_B in +let t487_A : t487 = copy_via_tag t487_A in +let t487_B : t487 = copy_via_tag t487_B in +let t487_C : t487 = copy_via_tag t487_C in +let t488_A : t488 = copy_via_tag t488_A in +let t488_B : t488 = copy_via_tag t488_B in +let t489_A : t489 = copy_via_tag t489_A in +let t490_A : t490 = copy_via_tag t490_A in +let t490_B : t490 = copy_via_tag t490_B in +let t490_C : t490 = copy_via_tag t490_C in +let t490_D : t490 = copy_via_tag t490_D in +let t491_A : t491 = copy_via_tag t491_A in +let t491_B : t491 = copy_via_tag t491_B in +let t491_C : t491 = copy_via_tag t491_C in +let t492_A : t492 = copy_via_tag t492_A in +let t492_B : t492 = copy_via_tag t492_B in +let t492_C : t492 = copy_via_tag t492_C in +let t492_D : t492 = copy_via_tag t492_D in +let t492_E : t492 = copy_via_tag t492_E in +let t493_A : t493 = copy_via_tag t493_A in +let t493_B : t493 = copy_via_tag t493_B in +let t493_C : t493 = copy_via_tag t493_C in +let t493_D : t493 = copy_via_tag t493_D in +let t494_A : t494 = copy_via_tag t494_A in +let t494_B : t494 = copy_via_tag t494_B in +let t495_A : t495 = copy_via_tag t495_A in +let t495_B : t495 = copy_via_tag t495_B in +let t495_C : t495 = copy_via_tag t495_C in +let t496_A : t496 = copy_via_tag t496_A in +let t496_B : t496 = copy_via_tag t496_B in +let t496_C : t496 = copy_via_tag t496_C in +let t496_D : t496 = copy_via_tag t496_D in +let t497_A : t497 = copy_via_tag t497_A in +let t497_B : t497 = copy_via_tag t497_B in +let t497_C : t497 = copy_via_tag t497_C in +let t498_A : t498 = copy_via_tag t498_A in +let t498_B : t498 = copy_via_tag t498_B in +let t498_C : t498 = copy_via_tag t498_C in +let t498_D : t498 = copy_via_tag t498_D in +let t498_E : t498 = copy_via_tag t498_E in +let t499_A : t499 = copy_via_tag t499_A in +let t499_B : t499 = copy_via_tag t499_B in +let t500_A : t500 = copy_via_tag t500_A in +let t500_B : t500 = copy_via_tag t500_B in +let t500_C : t500 = copy_via_tag t500_C in +let t501_A : t501 = copy_via_tag t501_A in +let t501_B : t501 = copy_via_tag t501_B in +let t501_C : t501 = copy_via_tag t501_C in +let t501_D : t501 = copy_via_tag t501_D in +let t502_A : t502 = copy_via_tag t502_A in +let t502_B : t502 = copy_via_tag t502_B in +let t502_C : t502 = copy_via_tag t502_C in +let t503_A : t503 = copy_via_tag t503_A in +let t503_B : t503 = copy_via_tag t503_B in +let t504_A : t504 = copy_via_tag t504_A in +let t504_B : t504 = copy_via_tag t504_B in +let t504_C : t504 = copy_via_tag t504_C in +let t505_A : t505 = copy_via_tag t505_A in +let t505_B : t505 = copy_via_tag t505_B in +let t505_C : t505 = copy_via_tag t505_C in +let t505_D : t505 = copy_via_tag t505_D in +let t506_A : t506 = copy_via_tag t506_A in +let t506_B : t506 = copy_via_tag t506_B in +let t507_A : t507 = copy_via_tag t507_A in +let t507_B : t507 = copy_via_tag t507_B in +let t507_C : t507 = copy_via_tag t507_C in +let t508_A : t508 = copy_via_tag t508_A in +let t508_B : t508 = copy_via_tag t508_B in +let t509_A : t509 = copy_via_tag t509_A in +let t510_A : t510 = copy_via_tag t510_A in +let t510_B : t510 = copy_via_tag t510_B in +let t510_C : t510 = copy_via_tag t510_C in +let t511_A : t511 = copy_via_tag t511_A in +let t511_B : t511 = copy_via_tag t511_B in +let t511_C : t511 = copy_via_tag t511_C in +let t511_D : t511 = copy_via_tag t511_D in +let t512_A : t512 = copy_via_tag t512_A in +let t512_B : t512 = copy_via_tag t512_B in +let t512_C : t512 = copy_via_tag t512_C in +let t513_A : t513 = copy_via_tag t513_A in +let t513_B : t513 = copy_via_tag t513_B in +let t513_C : t513 = copy_via_tag t513_C in +let t513_D : t513 = copy_via_tag t513_D in +let t513_E : t513 = copy_via_tag t513_E in +let t514_A : t514 = copy_via_tag t514_A in +let t514_B : t514 = copy_via_tag t514_B in +let t514_C : t514 = copy_via_tag t514_C in +let t514_D : t514 = copy_via_tag t514_D in +let t515_A : t515 = copy_via_tag t515_A in +let t515_B : t515 = copy_via_tag t515_B in +let t516_A : t516 = copy_via_tag t516_A in +let t516_B : t516 = copy_via_tag t516_B in +let t516_C : t516 = copy_via_tag t516_C in +let t517_A : t517 = copy_via_tag t517_A in +let t517_B : t517 = copy_via_tag t517_B in +let t517_C : t517 = copy_via_tag t517_C in +let t517_D : t517 = copy_via_tag t517_D in +let t518_A : t518 = copy_via_tag t518_A in +let t518_B : t518 = copy_via_tag t518_B in +let t518_C : t518 = copy_via_tag t518_C in +let t519_A : t519 = copy_via_tag t519_A in +let t519_B : t519 = copy_via_tag t519_B in +let t519_C : t519 = copy_via_tag t519_C in +let t519_D : t519 = copy_via_tag t519_D in +let t519_E : t519 = copy_via_tag t519_E in +let t520_A : t520 = copy_via_tag t520_A in +let t520_B : t520 = copy_via_tag t520_B in +let t521_A : t521 = copy_via_tag t521_A in +let t521_B : t521 = copy_via_tag t521_B in +let t521_C : t521 = copy_via_tag t521_C in +let t522_A : t522 = copy_via_tag t522_A in +let t522_B : t522 = copy_via_tag t522_B in +let t522_C : t522 = copy_via_tag t522_C in +let t522_D : t522 = copy_via_tag t522_D in +let t523_A : t523 = copy_via_tag t523_A in +let t523_B : t523 = copy_via_tag t523_B in +let t523_C : t523 = copy_via_tag t523_C in +let t524_A : t524 = copy_via_tag t524_A in +let t524_B : t524 = copy_via_tag t524_B in +let t525_A : t525 = copy_via_tag t525_A in +let t525_B : t525 = copy_via_tag t525_B in +let t525_C : t525 = copy_via_tag t525_C in +let t526_A : t526 = copy_via_tag t526_A in +let t526_B : t526 = copy_via_tag t526_B in +let t526_C : t526 = copy_via_tag t526_C in +let t526_D : t526 = copy_via_tag t526_D in +let t527_A : t527 = copy_via_tag t527_A in +let t527_B : t527 = copy_via_tag t527_B in +let t528_A : t528 = copy_via_tag t528_A in +let t528_B : t528 = copy_via_tag t528_B in +let t528_C : t528 = copy_via_tag t528_C in +let t529_A : t529 = copy_via_tag t529_A in +let t529_B : t529 = copy_via_tag t529_B in +let t530_A : t530 = copy_via_tag t530_A in +let t531_A : t531 = copy_via_tag t531_A in +let t531_B : t531 = copy_via_tag t531_B in +let t532_A : t532 = copy_via_tag t532_A in +let t532_B : t532 = copy_via_tag t532_B in +let t532_C : t532 = copy_via_tag t532_C in +let t533_A : t533 = copy_via_tag t533_A in +let t533_B : t533 = copy_via_tag t533_B in +let t533_C : t533 = copy_via_tag t533_C in +let t533_D : t533 = copy_via_tag t533_D in +let t534_A : t534 = copy_via_tag t534_A in +let t534_B : t534 = copy_via_tag t534_B in +let t534_C : t534 = copy_via_tag t534_C in +let t535_A : t535 = copy_via_tag t535_A in +let t535_B : t535 = copy_via_tag t535_B in +let t535_C : t535 = copy_via_tag t535_C in +let t535_D : t535 = copy_via_tag t535_D in +let t535_E : t535 = copy_via_tag t535_E in +let t536_A : t536 = copy_via_tag t536_A in +let t536_B : t536 = copy_via_tag t536_B in +let t536_C : t536 = copy_via_tag t536_C in +let t536_D : t536 = copy_via_tag t536_D in +let t537_A : t537 = copy_via_tag t537_A in +let t537_B : t537 = copy_via_tag t537_B in +let t538_A : t538 = copy_via_tag t538_A in +let t538_B : t538 = copy_via_tag t538_B in +let t538_C : t538 = copy_via_tag t538_C in +let t539_A : t539 = copy_via_tag t539_A in +let t539_B : t539 = copy_via_tag t539_B in +let t539_C : t539 = copy_via_tag t539_C in +let t539_D : t539 = copy_via_tag t539_D in +let t540_A : t540 = copy_via_tag t540_A in +let t540_B : t540 = copy_via_tag t540_B in +let t540_C : t540 = copy_via_tag t540_C in +let t541_A : t541 = copy_via_tag t541_A in +let t541_B : t541 = copy_via_tag t541_B in +let t541_C : t541 = copy_via_tag t541_C in +let t541_D : t541 = copy_via_tag t541_D in +let t541_E : t541 = copy_via_tag t541_E in +let t542_A : t542 = copy_via_tag t542_A in +let t542_B : t542 = copy_via_tag t542_B in +let t543_A : t543 = copy_via_tag t543_A in +let t543_B : t543 = copy_via_tag t543_B in +let t543_C : t543 = copy_via_tag t543_C in +let t544_A : t544 = copy_via_tag t544_A in +let t544_B : t544 = copy_via_tag t544_B in +let t544_C : t544 = copy_via_tag t544_C in +let t544_D : t544 = copy_via_tag t544_D in +let t545_A : t545 = copy_via_tag t545_A in +let t545_B : t545 = copy_via_tag t545_B in +let t545_C : t545 = copy_via_tag t545_C in +let t546_A : t546 = copy_via_tag t546_A in +let t546_B : t546 = copy_via_tag t546_B in +let t547_A : t547 = copy_via_tag t547_A in +let t547_B : t547 = copy_via_tag t547_B in +let t547_C : t547 = copy_via_tag t547_C in +let t548_A : t548 = copy_via_tag t548_A in +let t548_B : t548 = copy_via_tag t548_B in +let t548_C : t548 = copy_via_tag t548_C in +let t548_D : t548 = copy_via_tag t548_D in +let t549_A : t549 = copy_via_tag t549_A in +let t549_B : t549 = copy_via_tag t549_B in +let t550_A : t550 = copy_via_tag t550_A in +let t550_B : t550 = copy_via_tag t550_B in +let t550_C : t550 = copy_via_tag t550_C in +let t551_A : t551 = copy_via_tag t551_A in +let t551_B : t551 = copy_via_tag t551_B in +let t552_A : t552 = copy_via_tag t552_A in +let t553_A : t553 = copy_via_tag t553_A in +let t553_B : t553 = copy_via_tag t553_B in +let t553_C : t553 = copy_via_tag t553_C in +let t554_A : t554 = copy_via_tag t554_A in +let t554_B : t554 = copy_via_tag t554_B in +let t555_A : t555 = copy_via_tag t555_A in +let t555_B : t555 = copy_via_tag t555_B in +let t555_C : t555 = copy_via_tag t555_C in +let t556_A : t556 = copy_via_tag t556_A in +let t556_B : t556 = copy_via_tag t556_B in +let t556_C : t556 = copy_via_tag t556_C in +let t556_D : t556 = copy_via_tag t556_D in +let t557_A : t557 = copy_via_tag t557_A in +let t557_B : t557 = copy_via_tag t557_B in +let t557_C : t557 = copy_via_tag t557_C in +let t558_A : t558 = copy_via_tag t558_A in +let t558_B : t558 = copy_via_tag t558_B in +let t558_C : t558 = copy_via_tag t558_C in +let t558_D : t558 = copy_via_tag t558_D in +let t558_E : t558 = copy_via_tag t558_E in +let t559_A : t559 = copy_via_tag t559_A in +let t559_B : t559 = copy_via_tag t559_B in +let t559_C : t559 = copy_via_tag t559_C in +let t559_D : t559 = copy_via_tag t559_D in +let t560_A : t560 = copy_via_tag t560_A in +let t560_B : t560 = copy_via_tag t560_B in +let t561_A : t561 = copy_via_tag t561_A in +let t561_B : t561 = copy_via_tag t561_B in +let t561_C : t561 = copy_via_tag t561_C in +let t562_A : t562 = copy_via_tag t562_A in +let t562_B : t562 = copy_via_tag t562_B in +let t562_C : t562 = copy_via_tag t562_C in +let t562_D : t562 = copy_via_tag t562_D in +let t563_A : t563 = copy_via_tag t563_A in +let t563_B : t563 = copy_via_tag t563_B in +let t563_C : t563 = copy_via_tag t563_C in +let t564_A : t564 = copy_via_tag t564_A in +let t564_B : t564 = copy_via_tag t564_B in +let t564_C : t564 = copy_via_tag t564_C in +let t564_D : t564 = copy_via_tag t564_D in +let t564_E : t564 = copy_via_tag t564_E in +let t565_A : t565 = copy_via_tag t565_A in +let t565_B : t565 = copy_via_tag t565_B in +let t566_A : t566 = copy_via_tag t566_A in +let t566_B : t566 = copy_via_tag t566_B in +let t566_C : t566 = copy_via_tag t566_C in +let t567_A : t567 = copy_via_tag t567_A in +let t567_B : t567 = copy_via_tag t567_B in +let t567_C : t567 = copy_via_tag t567_C in +let t567_D : t567 = copy_via_tag t567_D in +let t568_A : t568 = copy_via_tag t568_A in +let t568_B : t568 = copy_via_tag t568_B in +let t568_C : t568 = copy_via_tag t568_C in +let t569_A : t569 = copy_via_tag t569_A in +let t569_B : t569 = copy_via_tag t569_B in +let t570_A : t570 = copy_via_tag t570_A in +let t570_B : t570 = copy_via_tag t570_B in +let t570_C : t570 = copy_via_tag t570_C in +let t571_A : t571 = copy_via_tag t571_A in +let t571_B : t571 = copy_via_tag t571_B in +let t571_C : t571 = copy_via_tag t571_C in +let t571_D : t571 = copy_via_tag t571_D in +let t572_A : t572 = copy_via_tag t572_A in +let t572_B : t572 = copy_via_tag t572_B in +let t573_A : t573 = copy_via_tag t573_A in +let t573_B : t573 = copy_via_tag t573_B in +let t573_C : t573 = copy_via_tag t573_C in +let t574_A : t574 = copy_via_tag t574_A in +let t574_B : t574 = copy_via_tag t574_B in +let t575_A : t575 = copy_via_tag t575_A in +let t576_A : t576 = copy_via_tag t576_A in +let t576_B : t576 = copy_via_tag t576_B in +let t576_C : t576 = copy_via_tag t576_C in +let t576_D : t576 = copy_via_tag t576_D in +let t577_A : t577 = copy_via_tag t577_A in +let t577_B : t577 = copy_via_tag t577_B in +let t577_C : t577 = copy_via_tag t577_C in +let t578_A : t578 = copy_via_tag t578_A in +let t578_B : t578 = copy_via_tag t578_B in +let t579_A : t579 = copy_via_tag t579_A in +let t579_B : t579 = copy_via_tag t579_B in +let t579_C : t579 = copy_via_tag t579_C in +let t580_A : t580 = copy_via_tag t580_A in +let t580_B : t580 = copy_via_tag t580_B in +let t580_C : t580 = copy_via_tag t580_C in +let t580_D : t580 = copy_via_tag t580_D in +let t581_A : t581 = copy_via_tag t581_A in +let t581_B : t581 = copy_via_tag t581_B in +let t581_C : t581 = copy_via_tag t581_C in +let t582_A : t582 = copy_via_tag t582_A in +let t582_B : t582 = copy_via_tag t582_B in +let t582_C : t582 = copy_via_tag t582_C in +let t582_D : t582 = copy_via_tag t582_D in +let t582_E : t582 = copy_via_tag t582_E in +let t583_A : t583 = copy_via_tag t583_A in +let t583_B : t583 = copy_via_tag t583_B in +let t583_C : t583 = copy_via_tag t583_C in +let t583_D : t583 = copy_via_tag t583_D in +let t584_A : t584 = copy_via_tag t584_A in +let t584_B : t584 = copy_via_tag t584_B in +let t585_A : t585 = copy_via_tag t585_A in +let t585_B : t585 = copy_via_tag t585_B in +let t585_C : t585 = copy_via_tag t585_C in +let t586_A : t586 = copy_via_tag t586_A in +let t586_B : t586 = copy_via_tag t586_B in +let t586_C : t586 = copy_via_tag t586_C in +let t586_D : t586 = copy_via_tag t586_D in +let t587_A : t587 = copy_via_tag t587_A in +let t587_B : t587 = copy_via_tag t587_B in +let t587_C : t587 = copy_via_tag t587_C in +let t588_A : t588 = copy_via_tag t588_A in +let t588_B : t588 = copy_via_tag t588_B in +let t588_C : t588 = copy_via_tag t588_C in +let t588_D : t588 = copy_via_tag t588_D in +let t588_E : t588 = copy_via_tag t588_E in +let t589_A : t589 = copy_via_tag t589_A in +let t589_B : t589 = copy_via_tag t589_B in +let t590_A : t590 = copy_via_tag t590_A in +let t590_B : t590 = copy_via_tag t590_B in +let t590_C : t590 = copy_via_tag t590_C in +let t591_A : t591 = copy_via_tag t591_A in +let t591_B : t591 = copy_via_tag t591_B in +let t591_C : t591 = copy_via_tag t591_C in +let t591_D : t591 = copy_via_tag t591_D in +let t592_A : t592 = copy_via_tag t592_A in +let t592_B : t592 = copy_via_tag t592_B in +let t592_C : t592 = copy_via_tag t592_C in +let t593_A : t593 = copy_via_tag t593_A in +let t593_B : t593 = copy_via_tag t593_B in +let t594_A : t594 = copy_via_tag t594_A in +let t594_B : t594 = copy_via_tag t594_B in +let t594_C : t594 = copy_via_tag t594_C in +let t595_A : t595 = copy_via_tag t595_A in +let t595_B : t595 = copy_via_tag t595_B in +let t595_C : t595 = copy_via_tag t595_C in +let t595_D : t595 = copy_via_tag t595_D in +let t596_A : t596 = copy_via_tag t596_A in +let t596_B : t596 = copy_via_tag t596_B in +let t597_A : t597 = copy_via_tag t597_A in +let t597_B : t597 = copy_via_tag t597_B in +let t597_C : t597 = copy_via_tag t597_C in +let t598_A : t598 = copy_via_tag t598_A in +let t598_B : t598 = copy_via_tag t598_B in +let t599_A : t599 = copy_via_tag t599_A in +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 t81 t82 t83 t84 t85 t86 t87 t88 t89 t90 t91 t92 t93 t94 t95 t96 t97 t98 t99 t100 t101 t102 t103 t104 t105 t106 t107 t108 t109 t110 t111 t112 t113 t114 t115 t116 t117 t118 t119 t120 t121 t122 t123 t124 t125 t126 t127 t128 t129 t130 t131 t132 t133 t134 t135 t136 t137 t138 t139 t140 t141 t142 t143 t144 t145 t146 t147 t148 t149 t150 t151 t152 t153 t154 t155 t156 t157 t158 t159 t160 t161 t162 t163 t164 t165 t166 t167 t168 t169 t170 t171 t172 t173 t174 t175 t176 t177 t178 t179 t180 t181 t182 t183 t184 t185 t186 t187 t188 t189 t190 t191 t192 t193 t194 t195 t196 t197 t198 t199 t200 t201 t202 t203 t204 t205 t206 t207 t208 t209 t210 t211 t212 t213 t214 t215 t216 t217 t218 t219 t220 t221 t222 t223 t224 t225 t226 t227 t228 t229 t230 t231 t232 t233 t234 t235 t236 t237 t238 t239 t240 t241 t242 t243 t244 t245 t246 t247 t248 t249 t250 t251 t252 t253 t254 t255 t256 t257 t258 t259 t260 t261 t262 t263 t264 t265 t266 t267 t268 t269 t270 t271 t272 t273 t274 t275 t276 t277 t278 t279 t280 t281 t282 t283 t284 t285 t286 t287 t288 t289 t290 t291 t292 t293 t294 t295 t296 t297 t298 t299 t300_A t301_A t301_B t302_A t303_A t303_B t303_C t304_A t304_B t305_A t306_A t306_B t307_A t307_B t307_C t308_A t308_B t309_A t310_A t310_B t310_C t310_D t311_A t311_B t312_A t312_B t312_C t313_A t313_B t314_A t315_A t315_B t315_C t316_A t316_B t316_C t316_D t317_A t317_B t318_A t318_B t318_C t319_A t319_B t320_A t321_A t321_B t322_A t322_B t322_C t323_A t323_B t323_C t323_D t324_A t324_B t325_A t325_B t325_C t326_A t326_B t327_A t328_A t328_B t328_C t329_A t329_B t330_A t330_B t330_C t331_A t331_B t331_C t331_D t332_A t332_B t333_A t333_B t333_C t334_A t334_B t335_A t336_A t336_B t336_C t336_D t337_A t337_B t337_C t338_A t338_B t339_A t339_B t339_C t340_A t340_B t340_C t340_D t341_A t341_B t342_A t342_B t342_C t343_A t343_B t344_A t345_A t345_B t345_C t346_A t346_B t346_C t346_D t347_A t347_B t347_C t348_A t348_B t349_A t349_B t349_C t350_A t350_B t350_C t350_D t351_A t351_B t352_A t352_B t352_C t353_A t353_B t354_A t355_A t355_B t356_A t356_B t356_C t357_A t357_B t357_C t357_D t358_A t358_B t358_C t359_A t359_B t360_A t360_B t360_C t361_A t361_B t361_C t361_D t362_A t362_B t363_A t363_B t363_C t364_A t364_B t365_A t366_A t366_B t366_C t366_D t366_E t367_A t367_B t368_A t368_B t368_C t369_A t369_B t369_C t369_D t370_A t370_B t370_C t371_A t371_B t372_A t372_B t372_C t373_A t373_B t373_C t373_D t374_A t374_B t375_A t375_B t375_C t376_A t376_B t377_A t378_A t378_B t378_C t379_A t379_B t379_C t379_D t379_E t380_A t380_B t381_A t381_B t381_C t382_A t382_B t382_C t382_D t383_A t383_B t383_C t384_A t384_B t385_A t385_B t385_C t386_A t386_B t386_C t386_D t387_A t387_B t388_A t388_B t388_C t389_A t389_B t390_A t391_A t391_B t391_C t391_D t392_A t392_B t392_C t393_A t393_B t393_C t393_D t393_E t394_A t394_B t395_A t395_B t395_C t396_A t396_B t396_C t396_D t397_A t397_B t397_C t398_A t398_B t399_A t399_B t399_C t400_A t400_B t400_C t400_D t401_A t401_B t402_A t402_B t402_C t403_A t403_B t404_A t405_A t405_B t405_C t406_A t406_B t406_C t406_D t407_A t407_B t407_C t408_A t408_B t408_C t408_D t408_E t409_A t409_B t410_A t410_B t410_C t411_A t411_B t411_C t411_D t412_A t412_B t412_C t413_A t413_B t414_A t414_B t414_C t415_A t415_B t415_C t415_D t416_A t416_B t417_A t417_B t417_C t418_A t418_B t419_A t420_A t420_B t421_A t421_B t421_C t422_A t422_B t422_C t422_D t423_A t423_B t423_C t424_A t424_B t424_C t424_D t424_E t425_A t425_B t426_A t426_B t426_C t427_A t427_B t427_C t427_D t428_A t428_B t428_C t429_A t429_B t430_A t430_B t430_C t431_A t431_B t431_C t431_D t432_A t432_B t433_A t433_B t433_C t434_A t434_B t435_A t436_A t436_B t436_C t436_D t437_A t437_B t438_A t438_B t438_C t439_A t439_B t439_C t439_D t440_A t440_B t440_C t441_A t441_B t441_C t441_D t441_E t442_A t442_B t443_A t443_B t443_C t444_A t444_B t444_C t444_D t445_A t445_B t445_C t446_A t446_B t447_A t447_B t447_C t448_A t448_B t448_C t448_D t449_A t449_B t450_A t450_B t450_C t451_A t451_B t452_A t453_A t453_B t453_C t453_D t453_E t454_A t454_B t454_C t454_D t455_A t455_B t456_A t456_B t456_C t457_A t457_B t457_C t457_D t458_A t458_B t458_C t459_A t459_B t459_C t459_D t459_E t460_A t460_B t461_A t461_B t461_C t462_A t462_B t462_C t462_D t463_A t463_B t463_C t464_A t464_B t465_A t465_B t465_C t466_A t466_B t466_C t466_D t467_A t467_B t468_A t468_B t468_C t469_A t469_B t470_A t471_A t471_B t471_C t472_A t472_B t472_C t472_D t472_E t473_A t473_B t473_C t473_D t474_A t474_B t475_A t475_B t475_C t476_A t476_B t476_C t476_D t477_A t477_B t477_C t478_A t478_B t478_C t478_D t478_E t479_A t479_B t480_A t480_B t480_C t481_A t481_B t481_C t481_D t482_A t482_B t482_C t483_A t483_B t484_A t484_B t484_C t485_A t485_B t485_C t485_D t486_A t486_B t487_A t487_B t487_C t488_A t488_B t489_A t490_A t490_B t490_C t490_D t491_A t491_B t491_C t492_A t492_B t492_C t492_D t492_E t493_A t493_B t493_C t493_D t494_A t494_B t495_A t495_B t495_C t496_A t496_B t496_C t496_D t497_A t497_B t497_C t498_A t498_B t498_C t498_D t498_E t499_A t499_B t500_A t500_B t500_C t501_A t501_B t501_C t501_D t502_A t502_B t502_C t503_A t503_B t504_A t504_B t504_C t505_A t505_B t505_C t505_D t506_A t506_B t507_A t507_B t507_C t508_A t508_B t509_A t510_A t510_B t510_C t511_A t511_B t511_C t511_D t512_A t512_B t512_C t513_A t513_B t513_C t513_D t513_E t514_A t514_B t514_C t514_D t515_A t515_B t516_A t516_B t516_C t517_A t517_B t517_C t517_D t518_A t518_B t518_C t519_A t519_B t519_C t519_D t519_E t520_A t520_B t521_A t521_B t521_C t522_A t522_B t522_C t522_D t523_A t523_B t523_C t524_A t524_B t525_A t525_B t525_C t526_A t526_B t526_C t526_D t527_A t527_B t528_A t528_B t528_C t529_A t529_B t530_A t531_A t531_B t532_A t532_B t532_C t533_A t533_B t533_C t533_D t534_A t534_B t534_C t535_A t535_B t535_C t535_D t535_E t536_A t536_B t536_C t536_D t537_A t537_B t538_A t538_B t538_C t539_A t539_B t539_C t539_D t540_A t540_B t540_C t541_A t541_B t541_C t541_D t541_E t542_A t542_B t543_A t543_B t543_C t544_A t544_B t544_C t544_D t545_A t545_B t545_C t546_A t546_B t547_A t547_B t547_C t548_A t548_B t548_C t548_D t549_A t549_B t550_A t550_B t550_C t551_A t551_B t552_A t553_A t553_B t553_C t554_A t554_B t555_A t555_B t555_C t556_A t556_B t556_C t556_D t557_A t557_B t557_C t558_A t558_B t558_C t558_D t558_E t559_A t559_B t559_C t559_D t560_A t560_B t561_A t561_B t561_C t562_A t562_B t562_C t562_D t563_A t563_B t563_C t564_A t564_B t564_C t564_D t564_E t565_A t565_B t566_A t566_B t566_C t567_A t567_B t567_C t567_D t568_A t568_B t568_C t569_A t569_B t570_A t570_B t570_C t571_A t571_B t571_C t571_D t572_A t572_B t573_A t573_B t573_C t574_A t574_B t575_A t576_A t576_B t576_C t576_D t577_A t577_B t577_C t578_A t578_B t579_A t579_B t579_C t580_A t580_B t580_C t580_D t581_A t581_B t581_C t582_A t582_B t582_C t582_D t582_E t583_A t583_B t583_C t583_D t584_A t584_B t585_A t585_B t585_C t586_A t586_B t586_C t586_D t587_A t587_B t587_C t588_A t588_B t588_C t588_D t588_E t589_A t589_B t590_A t590_B t590_C t591_A t591_B t591_C t591_D t592_A t592_B t592_C t593_A t593_B t594_A t594_B t594_C t595_A t595_B t595_C t595_D t596_A t596_B t597_A t597_B t597_C t598_A t598_B t599_A in +print_endline " - Doing GC"; +Gc.full_major (); +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 t81 t82 t83 t84 t85 t86 t87 t88 t89 t90 t91 t92 t93 t94 t95 t96 t97 t98 t99 t100 t101 t102 t103 t104 t105 t106 t107 t108 t109 t110 t111 t112 t113 t114 t115 t116 t117 t118 t119 t120 t121 t122 t123 t124 t125 t126 t127 t128 t129 t130 t131 t132 t133 t134 t135 t136 t137 t138 t139 t140 t141 t142 t143 t144 t145 t146 t147 t148 t149 t150 t151 t152 t153 t154 t155 t156 t157 t158 t159 t160 t161 t162 t163 t164 t165 t166 t167 t168 t169 t170 t171 t172 t173 t174 t175 t176 t177 t178 t179 t180 t181 t182 t183 t184 t185 t186 t187 t188 t189 t190 t191 t192 t193 t194 t195 t196 t197 t198 t199 t200 t201 t202 t203 t204 t205 t206 t207 t208 t209 t210 t211 t212 t213 t214 t215 t216 t217 t218 t219 t220 t221 t222 t223 t224 t225 t226 t227 t228 t229 t230 t231 t232 t233 t234 t235 t236 t237 t238 t239 t240 t241 t242 t243 t244 t245 t246 t247 t248 t249 t250 t251 t252 t253 t254 t255 t256 t257 t258 t259 t260 t261 t262 t263 t264 t265 t266 t267 t268 t269 t270 t271 t272 t273 t274 t275 t276 t277 t278 t279 t280 t281 t282 t283 t284 t285 t286 t287 t288 t289 t290 t291 t292 t293 t294 t295 t296 t297 t298 t299 t300_A t301_A t301_B t302_A t303_A t303_B t303_C t304_A t304_B t305_A t306_A t306_B t307_A t307_B t307_C t308_A t308_B t309_A t310_A t310_B t310_C t310_D t311_A t311_B t312_A t312_B t312_C t313_A t313_B t314_A t315_A t315_B t315_C t316_A t316_B t316_C t316_D t317_A t317_B t318_A t318_B t318_C t319_A t319_B t320_A t321_A t321_B t322_A t322_B t322_C t323_A t323_B t323_C t323_D t324_A t324_B t325_A t325_B t325_C t326_A t326_B t327_A t328_A t328_B t328_C t329_A t329_B t330_A t330_B t330_C t331_A t331_B t331_C t331_D t332_A t332_B t333_A t333_B t333_C t334_A t334_B t335_A t336_A t336_B t336_C t336_D t337_A t337_B t337_C t338_A t338_B t339_A t339_B t339_C t340_A t340_B t340_C t340_D t341_A t341_B t342_A t342_B t342_C t343_A t343_B t344_A t345_A t345_B t345_C t346_A t346_B t346_C t346_D t347_A t347_B t347_C t348_A t348_B t349_A t349_B t349_C t350_A t350_B t350_C t350_D t351_A t351_B t352_A t352_B t352_C t353_A t353_B t354_A t355_A t355_B t356_A t356_B t356_C t357_A t357_B t357_C t357_D t358_A t358_B t358_C t359_A t359_B t360_A t360_B t360_C t361_A t361_B t361_C t361_D t362_A t362_B t363_A t363_B t363_C t364_A t364_B t365_A t366_A t366_B t366_C t366_D t366_E t367_A t367_B t368_A t368_B t368_C t369_A t369_B t369_C t369_D t370_A t370_B t370_C t371_A t371_B t372_A t372_B t372_C t373_A t373_B t373_C t373_D t374_A t374_B t375_A t375_B t375_C t376_A t376_B t377_A t378_A t378_B t378_C t379_A t379_B t379_C t379_D t379_E t380_A t380_B t381_A t381_B t381_C t382_A t382_B t382_C t382_D t383_A t383_B t383_C t384_A t384_B t385_A t385_B t385_C t386_A t386_B t386_C t386_D t387_A t387_B t388_A t388_B t388_C t389_A t389_B t390_A t391_A t391_B t391_C t391_D t392_A t392_B t392_C t393_A t393_B t393_C t393_D t393_E t394_A t394_B t395_A t395_B t395_C t396_A t396_B t396_C t396_D t397_A t397_B t397_C t398_A t398_B t399_A t399_B t399_C t400_A t400_B t400_C t400_D t401_A t401_B t402_A t402_B t402_C t403_A t403_B t404_A t405_A t405_B t405_C t406_A t406_B t406_C t406_D t407_A t407_B t407_C t408_A t408_B t408_C t408_D t408_E t409_A t409_B t410_A t410_B t410_C t411_A t411_B t411_C t411_D t412_A t412_B t412_C t413_A t413_B t414_A t414_B t414_C t415_A t415_B t415_C t415_D t416_A t416_B t417_A t417_B t417_C t418_A t418_B t419_A t420_A t420_B t421_A t421_B t421_C t422_A t422_B t422_C t422_D t423_A t423_B t423_C t424_A t424_B t424_C t424_D t424_E t425_A t425_B t426_A t426_B t426_C t427_A t427_B t427_C t427_D t428_A t428_B t428_C t429_A t429_B t430_A t430_B t430_C t431_A t431_B t431_C t431_D t432_A t432_B t433_A t433_B t433_C t434_A t434_B t435_A t436_A t436_B t436_C t436_D t437_A t437_B t438_A t438_B t438_C t439_A t439_B t439_C t439_D t440_A t440_B t440_C t441_A t441_B t441_C t441_D t441_E t442_A t442_B t443_A t443_B t443_C t444_A t444_B t444_C t444_D t445_A t445_B t445_C t446_A t446_B t447_A t447_B t447_C t448_A t448_B t448_C t448_D t449_A t449_B t450_A t450_B t450_C t451_A t451_B t452_A t453_A t453_B t453_C t453_D t453_E t454_A t454_B t454_C t454_D t455_A t455_B t456_A t456_B t456_C t457_A t457_B t457_C t457_D t458_A t458_B t458_C t459_A t459_B t459_C t459_D t459_E t460_A t460_B t461_A t461_B t461_C t462_A t462_B t462_C t462_D t463_A t463_B t463_C t464_A t464_B t465_A t465_B t465_C t466_A t466_B t466_C t466_D t467_A t467_B t468_A t468_B t468_C t469_A t469_B t470_A t471_A t471_B t471_C t472_A t472_B t472_C t472_D t472_E t473_A t473_B t473_C t473_D t474_A t474_B t475_A t475_B t475_C t476_A t476_B t476_C t476_D t477_A t477_B t477_C t478_A t478_B t478_C t478_D t478_E t479_A t479_B t480_A t480_B t480_C t481_A t481_B t481_C t481_D t482_A t482_B t482_C t483_A t483_B t484_A t484_B t484_C t485_A t485_B t485_C t485_D t486_A t486_B t487_A t487_B t487_C t488_A t488_B t489_A t490_A t490_B t490_C t490_D t491_A t491_B t491_C t492_A t492_B t492_C t492_D t492_E t493_A t493_B t493_C t493_D t494_A t494_B t495_A t495_B t495_C t496_A t496_B t496_C t496_D t497_A t497_B t497_C t498_A t498_B t498_C t498_D t498_E t499_A t499_B t500_A t500_B t500_C t501_A t501_B t501_C t501_D t502_A t502_B t502_C t503_A t503_B t504_A t504_B t504_C t505_A t505_B t505_C t505_D t506_A t506_B t507_A t507_B t507_C t508_A t508_B t509_A t510_A t510_B t510_C t511_A t511_B t511_C t511_D t512_A t512_B t512_C t513_A t513_B t513_C t513_D t513_E t514_A t514_B t514_C t514_D t515_A t515_B t516_A t516_B t516_C t517_A t517_B t517_C t517_D t518_A t518_B t518_C t519_A t519_B t519_C t519_D t519_E t520_A t520_B t521_A t521_B t521_C t522_A t522_B t522_C t522_D t523_A t523_B t523_C t524_A t524_B t525_A t525_B t525_C t526_A t526_B t526_C t526_D t527_A t527_B t528_A t528_B t528_C t529_A t529_B t530_A t531_A t531_B t532_A t532_B t532_C t533_A t533_B t533_C t533_D t534_A t534_B t534_C t535_A t535_B t535_C t535_D t535_E t536_A t536_B t536_C t536_D t537_A t537_B t538_A t538_B t538_C t539_A t539_B t539_C t539_D t540_A t540_B t540_C t541_A t541_B t541_C t541_D t541_E t542_A t542_B t543_A t543_B t543_C t544_A t544_B t544_C t544_D t545_A t545_B t545_C t546_A t546_B t547_A t547_B t547_C t548_A t548_B t548_C t548_D t549_A t549_B t550_A t550_B t550_C t551_A t551_B t552_A t553_A t553_B t553_C t554_A t554_B t555_A t555_B t555_C t556_A t556_B t556_C t556_D t557_A t557_B t557_C t558_A t558_B t558_C t558_D t558_E t559_A t559_B t559_C t559_D t560_A t560_B t561_A t561_B t561_C t562_A t562_B t562_C t562_D t563_A t563_B t563_C t564_A t564_B t564_C t564_D t564_E t565_A t565_B t566_A t566_B t566_C t567_A t567_B t567_C t567_D t568_A t568_B t568_C t569_A t569_B t570_A t570_B t570_C t571_A t571_B t571_C t571_D t572_A t572_B t573_A t573_B t573_C t574_A t574_B t575_A t576_A t576_B t576_C t576_D t577_A t577_B t577_C t578_A t578_B t579_A t579_B t579_C t580_A t580_B t580_C t580_D t581_A t581_B t581_C t582_A t582_B t582_C t582_D t582_E t583_A t583_B t583_C t583_D t584_A t584_B t585_A t585_B t585_C t586_A t586_B t586_C t586_D t587_A t587_B t587_C t588_A t588_B t588_C t588_D t588_E t589_A t589_B t590_A t590_B t590_C t591_A t591_B t591_C t591_D t592_A t592_B t592_C t593_A t593_B t594_A t594_B t594_C t595_A t595_B t595_C t595_D t596_A t596_B t597_A t597_B t597_C t598_A t598_B t599_A in + +(* Testing local allocation *) +let go () = + let local_ t0 : t0 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t1 : t1 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t2 : t2 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t3 : t3 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t4 : t4 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t5 : t5 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t6 : t6 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t7 : t7 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t8 : t8 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t9 : t9 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t10 : t10 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t11 : t11 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t12 : t12 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t13 : t13 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t14 : t14 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t15 : t15 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t16 : t16 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t17 : t17 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t18 : t18 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t19 : t19 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t20 : t20 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t21 : t21 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t22 : t22 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t23 : t23 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t24 : t24 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t25 : t25 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t26 : t26 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t27 : t27 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t28 : t28 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t29 : t29 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t30 : t30 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t31 : t31 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t32 : t32 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t33 : t33 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t34 : t34 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t35 : t35 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t36 : t36 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t37 : t37 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t38 : t38 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t39 : t39 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t40 : t40 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t41 : t41 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t42 : t42 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t43 : t43 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t44 : t44 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t45 : t45 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t46 : t46 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t47 : t47 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t48 : t48 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t49 : t49 = { float_u0 = create_float_u (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t50 : t50 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t51 : t51 = { float0 = create_float (); float_u1 = create_float_u (); float2 = create_float () } in + let local_ t52 : t52 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t53 : t53 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t54 : t54 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t55 : t55 = { float_u0 = create_float_u (); float1 = create_float (); float2 = create_float () } in + let local_ t56 : t56 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t57 : t57 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t58 : t58 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t59 : t59 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t60 : t60 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t61 : t61 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t62 : t62 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t63 : t63 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t64 : t64 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t65 : t65 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t66 : t66 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t67 : t67 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t68 : t68 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t69 : t69 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t70 : t70 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t71 : t71 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t72 : t72 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t73 : t73 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t74 : t74 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u (); float_u3 = create_float_u () } in + let local_ t75 : t75 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t76 : t76 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t77 : t77 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t78 : t78 = { float32_u0 = create_float32_u () } in + let local_ t79 : t79 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t80 : t80 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t81 : t81 = { float32_u0 = create_float32_u () } in + let local_ t82 : t82 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t83 : t83 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t84 : t84 = { i32_0 = create_int32_u () } in + let local_ t85 : t85 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t86 : t86 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t87 : t87 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t88 : t88 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t89 : t89 = { i32_0 = create_int32_u () } in + let local_ t90 : t90 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t91 : t91 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t92 : t92 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t93 : t93 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t94 : t94 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t95 : t95 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t96 : t96 = { i64_0 = create_int64_u () } in + let local_ t97 : t97 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t98 : t98 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t99 : t99 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t100 : t100 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t101 : t101 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t102 : t102 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t103 : t103 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t104 : t104 = { i64_0 = create_int64_u () } in + let local_ t105 : t105 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t106 : t106 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t107 : t107 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t108 : t108 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t109 : t109 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t110 : t110 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t111 : t111 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t112 : t112 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t113 : t113 = { n0 = create_nativeint_u () } in + let local_ t114 : t114 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t115 : t115 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t116 : t116 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t117 : t117 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t118 : t118 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t119 : t119 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t120 : t120 = { float0 = create_float (); i64_1 = create_int64_u () } in + let local_ t121 : t121 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t122 : t122 = { str0 = create_string (); n1 = create_nativeint_u () } in + let local_ t123 : t123 = { n0 = create_nativeint_u () } in + let local_ t124 : t124 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t125 : t125 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t126 : t126 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t127 : t127 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t128 : t128 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t129 : t129 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t130 : t130 = { float0 = create_float (); i64_1 = create_int64_u () } in + let local_ t131 : t131 = { float0 = create_float (); i64_1 = create_int64_u () } in + let local_ t132 : t132 = { str0 = create_string (); n1 = create_nativeint_u () } in + let local_ t133 : t133 = { str0 = create_string (); n1 = create_nativeint_u () } in + let local_ t134 : t134 = { float_u0 = create_float_u (); imm1 = create_int () } in + let local_ t135 : t135 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t136 : t136 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t137 : t137 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t138 : t138 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t139 : t139 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t140 : t140 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t141 : t141 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t142 : t142 = { float0 = create_float (); i64_1 = create_int64_u () } in + let local_ t143 : t143 = { float0 = create_float (); n1 = create_nativeint_u () } in + let local_ t144 : t144 = { str0 = create_string (); n1 = create_nativeint_u () } in + let local_ t145 : t145 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t146 : t146 = { float_u0 = create_float_u (); imm1 = create_int () } in + let local_ t147 : t147 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t148 : t148 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t149 : t149 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t150 : t150 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t151 : t151 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t152 : t152 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t153 : t153 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t154 : t154 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t155 : t155 = { float0 = create_float (); n1 = create_nativeint_u () } in + let local_ t156 : t156 = { float0 = create_float (); n1 = create_nativeint_u () } in + let local_ t157 : t157 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t158 : t158 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t159 : t159 = { float32_u0 = create_float32_u (); imm1 = create_int () } in + let local_ t160 : t160 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t161 : t161 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t162 : t162 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t163 : t163 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t164 : t164 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t165 : t165 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t166 : t166 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t167 : t167 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t168 : t168 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t169 : t169 = { float0 = create_float (); n1 = create_nativeint_u () } in + let local_ t170 : t170 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t171 : t171 = { str0 = create_string (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t172 : t172 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t173 : t173 = { float32_u0 = create_float32_u (); imm1 = create_int () } in + let local_ t174 : t174 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t175 : t175 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t176 : t176 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t177 : t177 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t178 : t178 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t179 : t179 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t180 : t180 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t181 : t181 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t182 : t182 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t183 : t183 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t184 : t184 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t185 : t185 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t186 : t186 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t187 : t187 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t188 : t188 = { i32_0 = create_int32_u (); imm1 = create_int () } in + let local_ t189 : t189 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t190 : t190 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t191 : t191 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t192 : t192 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t193 : t193 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t194 : t194 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t195 : t195 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t196 : t196 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t197 : t197 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t198 : t198 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t199 : t199 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t200 : t200 = { float0 = create_float (); float_u1 = create_float_u (); imm2 = create_int () } in + let local_ t201 : t201 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t202 : t202 = { str0 = create_string (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t203 : t203 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t204 : t204 = { i32_0 = create_int32_u (); imm1 = create_int () } in + let local_ t205 : t205 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t206 : t206 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t207 : t207 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t208 : t208 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t209 : t209 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t210 : t210 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t211 : t211 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t212 : t212 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t213 : t213 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t214 : t214 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t215 : t215 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t216 : t216 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t217 : t217 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t218 : t218 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t219 : t219 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t220 : t220 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t221 : t221 = { i64_0 = create_int64_u (); imm1 = create_int () } in + let local_ t222 : t222 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t223 : t223 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t224 : t224 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t225 : t225 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t226 : t226 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t227 : t227 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t228 : t228 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t229 : t229 = { imm0 = create_int (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t230 : t230 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t231 : t231 = { float0 = create_float (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t232 : t232 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t233 : t233 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t234 : t234 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in + let local_ t235 : t235 = { float0 = create_float (); float32_u1 = create_float32_u (); imm2 = create_int () } in + let local_ t236 : t236 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t237 : t237 = { str0 = create_string (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t238 : t238 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in + let local_ t239 : t239 = { i64_0 = create_int64_u (); imm1 = create_int () } in + let local_ t240 : t240 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t241 : t241 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t242 : t242 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t243 : t243 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t244 : t244 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t245 : t245 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t246 : t246 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t247 : t247 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t248 : t248 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t249 : t249 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t250 : t250 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t251 : t251 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t252 : t252 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in + let local_ t253 : t253 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in + let local_ t254 : t254 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t255 : t255 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t256 : t256 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in + let local_ t257 : t257 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in + let local_ t258 : t258 = { n0 = create_nativeint_u (); imm1 = create_int () } in + let local_ t259 : t259 = { str0 = create_string (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t260 : t260 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in + let local_ t261 : t261 = { imm0 = create_int (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t262 : t262 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t263 : t263 = { float0 = create_float (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t264 : t264 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t265 : t265 = { str0 = create_string (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t266 : t266 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t267 : t267 = { imm0 = create_int (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t268 : t268 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t269 : t269 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t270 : t270 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in + let local_ t271 : t271 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in + let local_ t272 : t272 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u (); imm3 = create_int () } in + let local_ t273 : t273 = { float0 = create_float (); i32_1 = create_int32_u (); imm2 = create_int () } in + let local_ t274 : t274 = { float0 = create_float (); i64_1 = create_int64_u (); imm2 = create_int () } in + let local_ t275 : t275 = { str0 = create_string (); i64_1 = create_int64_u (); imm2 = create_int () } in + let local_ t276 : t276 = { str0 = create_string (); n1 = create_nativeint_u (); imm2 = create_int () } in + let local_ t277 : t277 = { n0 = create_nativeint_u (); imm1 = create_int () } in + let local_ t278 : t278 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in + let local_ t279 : t279 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in + let local_ t280 : t280 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t281 : t281 = { imm0 = create_int (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t282 : t282 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t283 : t283 = { float0 = create_float (); str1 = create_string (); i64_2 = create_int64_u () } in + let local_ t284 : t284 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t285 : t285 = { str0 = create_string (); str1 = create_string (); n2 = create_nativeint_u () } in + let local_ t286 : t286 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t287 : t287 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u (); imm3 = create_int () } in + let local_ t288 : t288 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in + let local_ t289 : t289 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u (); imm3 = create_int () } in + let local_ t290 : t290 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u (); imm3 = create_int () } in + let local_ t291 : t291 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u (); imm3 = create_int () } in + let local_ t292 : t292 = { float0 = create_float (); i64_1 = create_int64_u (); imm2 = create_int () } in + let local_ t293 : t293 = { float0 = create_float (); i64_1 = create_int64_u (); imm2 = create_int () } in + let local_ t294 : t294 = { str0 = create_string (); n1 = create_nativeint_u (); imm2 = create_int () } in + let local_ t295 : t295 = { str0 = create_string (); n1 = create_nativeint_u (); imm2 = create_int () } in + let local_ t296 : t296 = { float_u0 = create_float_u (); imm1 = create_int () } in + let local_ t297 : t297 = { imm0 = create_int (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t298 : t298 = { float0 = create_float (); float1 = create_float (); float32_u2 = create_float32_u () } in + let local_ t299 : t299 = { str0 = create_string (); float1 = create_float (); float32_u2 = create_float32_u () } in + let local_ t300_A : t300 = (A (create_float_u ())) in + let local_ t301_A : t301 = (A (create_float_u ())) in + let local_ t301_B : t301 = (B (create_float_u ())) in + let local_ t302_A : t302 = (A { float_u0 = create_float_u () }) in + let local_ t303_A : t303 = (A (create_float_u ())) in + let local_ t303_B : t303 = (B (create_float_u ())) in + let local_ t303_C : t303 = (C (create_float_u ())) in + let local_ t304_A : t304 = (A { float_u0 = create_float_u () }) in + let local_ t304_B : t304 = (B (create_float_u ())) in + let local_ t305_A : t305 = (A (create_string (), create_float_u ())) in + let local_ t306_A : t306 = (A (create_float_u ())) in + let local_ t306_B : t306 = (B { float_u0 = create_float_u () }) in + let local_ t307_A : t307 = (A { float_u0 = create_float_u () }) in + let local_ t307_B : t307 = (B (create_float_u ())) in + let local_ t307_C : t307 = (C (create_float_u ())) in + let local_ t308_A : t308 = (A (create_string (), create_float_u ())) in + let local_ t308_B : t308 = (B (create_float_u ())) in + let local_ t309_A : t309 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t310_A : t310 = (A (create_float_u ())) in + let local_ t310_B : t310 = (B (create_float_u ())) in + let local_ t310_C : t310 = (C (create_float_u ())) in + let local_ t310_D : t310 = (D (create_float_u ())) in + let local_ t311_A : t311 = (A { float_u0 = create_float_u () }) in + let local_ t311_B : t311 = (B { float_u0 = create_float_u () }) in + let local_ t312_A : t312 = (A (create_string (), create_float_u ())) in + let local_ t312_B : t312 = (B (create_float_u ())) in + let local_ t312_C : t312 = (C (create_float_u ())) in + let local_ t313_A : t313 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t313_B : t313 = (B (create_float_u ())) in + let local_ t314_A : t314 = (A (create_float32_u ())) in + let local_ t315_A : t315 = (A (create_float_u ())) in + let local_ t315_B : t315 = (B { float_u0 = create_float_u () }) in + let local_ t315_C : t315 = (C (create_float_u ())) in + let local_ t316_A : t316 = (A { float_u0 = create_float_u () }) in + let local_ t316_B : t316 = (B (create_float_u ())) in + let local_ t316_C : t316 = (C (create_float_u ())) in + let local_ t316_D : t316 = (D (create_float_u ())) in + let local_ t317_A : t317 = (A (create_string (), create_float_u ())) in + let local_ t317_B : t317 = (B { float_u0 = create_float_u () }) in + let local_ t318_A : t318 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t318_B : t318 = (B (create_float_u ())) in + let local_ t318_C : t318 = (C (create_float_u ())) in + let local_ t319_A : t319 = (A (create_float32_u ())) in + let local_ t319_B : t319 = (B (create_float_u ())) in + let local_ t320_A : t320 = (A { float_u0 = create_float_u () }) in + let local_ t321_A : t321 = (A (create_float_u ())) in + let local_ t321_B : t321 = (B (create_string (), create_float_u ())) in + let local_ t322_A : t322 = (A { float_u0 = create_float_u () }) in + let local_ t322_B : t322 = (B { float_u0 = create_float_u () }) in + let local_ t322_C : t322 = (C (create_float_u ())) in + let local_ t323_A : t323 = (A (create_string (), create_float_u ())) in + let local_ t323_B : t323 = (B (create_float_u ())) in + let local_ t323_C : t323 = (C (create_float_u ())) in + let local_ t323_D : t323 = (D (create_float_u ())) in + let local_ t324_A : t324 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t324_B : t324 = (B { float_u0 = create_float_u () }) in + let local_ t325_A : t325 = (A (create_float32_u ())) in + let local_ t325_B : t325 = (B (create_float_u ())) in + let local_ t325_C : t325 = (C (create_float_u ())) in + let local_ t326_A : t326 = (A { float_u0 = create_float_u () }) in + let local_ t326_B : t326 = (B (create_float_u ())) in + let local_ t327_A : t327 = (A (create_float (), create_float_u ())) in + let local_ t328_A : t328 = (A (create_float_u ())) in + let local_ t328_B : t328 = (B (create_float_u ())) in + let local_ t328_C : t328 = (C { float_u0 = create_float_u () }) in + let local_ t329_A : t329 = (A { float_u0 = create_float_u () }) in + let local_ t329_B : t329 = (B (create_string (), create_float_u ())) in + let local_ t330_A : t330 = (A (create_string (), create_float_u ())) in + let local_ t330_B : t330 = (B { float_u0 = create_float_u () }) in + let local_ t330_C : t330 = (C (create_float_u ())) in + let local_ t331_A : t331 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t331_B : t331 = (B (create_float_u ())) in + let local_ t331_C : t331 = (C (create_float_u ())) in + let local_ t331_D : t331 = (D (create_float_u ())) in + let local_ t332_A : t332 = (A (create_float32_u ())) in + let local_ t332_B : t332 = (B { float_u0 = create_float_u () }) in + let local_ t333_A : t333 = (A { float_u0 = create_float_u () }) in + let local_ t333_B : t333 = (B (create_float_u ())) in + let local_ t333_C : t333 = (C (create_float_u ())) in + let local_ t334_A : t334 = (A (create_float (), create_float_u ())) in + let local_ t334_B : t334 = (B (create_float_u ())) in + let local_ t335_A : t335 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t336_A : t336 = (A (create_float_u ())) in + let local_ t336_B : t336 = (B { float_u0 = create_float_u () }) in + let local_ t336_C : t336 = (C (create_float_u ())) in + let local_ t336_D : t336 = (D (create_float_u ())) in + let local_ t337_A : t337 = (A { float_u0 = create_float_u () }) in + let local_ t337_B : t337 = (B (create_float_u ())) in + let local_ t337_C : t337 = (C { float_u0 = create_float_u () }) in + let local_ t338_A : t338 = (A (create_string (), create_float_u ())) in + let local_ t338_B : t338 = (B (create_string (), create_float_u ())) in + let local_ t339_A : t339 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t339_B : t339 = (B { float_u0 = create_float_u () }) in + let local_ t339_C : t339 = (C (create_float_u ())) in + let local_ t340_A : t340 = (A (create_float32_u ())) in + let local_ t340_B : t340 = (B (create_float_u ())) in + let local_ t340_C : t340 = (C (create_float_u ())) in + let local_ t340_D : t340 = (D (create_float_u ())) in + let local_ t341_A : t341 = (A { float_u0 = create_float_u () }) in + let local_ t341_B : t341 = (B { float_u0 = create_float_u () }) in + let local_ t342_A : t342 = (A (create_float (), create_float_u ())) in + let local_ t342_B : t342 = (B (create_float_u ())) in + let local_ t342_C : t342 = (C (create_float_u ())) in + let local_ t343_A : t343 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t343_B : t343 = (B (create_float_u ())) in + let local_ t344_A : t344 = (A (create_string (), create_float32_u ())) in + let local_ t345_A : t345 = (A (create_float_u ())) in + let local_ t345_B : t345 = (B (create_string (), create_float_u ())) in + let local_ t345_C : t345 = (C (create_float_u ())) in + let local_ t346_A : t346 = (A { float_u0 = create_float_u () }) in + let local_ t346_B : t346 = (B { float_u0 = create_float_u () }) in + let local_ t346_C : t346 = (C (create_float_u ())) in + let local_ t346_D : t346 = (D (create_float_u ())) in + let local_ t347_A : t347 = (A (create_string (), create_float_u ())) in + let local_ t347_B : t347 = (B (create_float_u ())) in + let local_ t347_C : t347 = (C { float_u0 = create_float_u () }) in + let local_ t348_A : t348 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t348_B : t348 = (B (create_string (), create_float_u ())) in + let local_ t349_A : t349 = (A (create_float32_u ())) in + let local_ t349_B : t349 = (B { float_u0 = create_float_u () }) in + let local_ t349_C : t349 = (C (create_float_u ())) in + let local_ t350_A : t350 = (A { float_u0 = create_float_u () }) in + let local_ t350_B : t350 = (B (create_float_u ())) in + let local_ t350_C : t350 = (C (create_float_u ())) in + let local_ t350_D : t350 = (D (create_float_u ())) in + let local_ t351_A : t351 = (A (create_float (), create_float_u ())) in + let local_ t351_B : t351 = (B { float_u0 = create_float_u () }) in + let local_ t352_A : t352 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t352_B : t352 = (B (create_float_u ())) in + let local_ t352_C : t352 = (C (create_float_u ())) in + let local_ t353_A : t353 = (A (create_string (), create_float32_u ())) in + let local_ t353_B : t353 = (B (create_float_u ())) in + let local_ t354_A : t354 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t355_A : t355 = (A (create_float_u ())) in + let local_ t355_B : t355 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t356_A : t356 = (A { float_u0 = create_float_u () }) in + let local_ t356_B : t356 = (B (create_string (), create_float_u ())) in + let local_ t356_C : t356 = (C (create_float_u ())) in + let local_ t357_A : t357 = (A (create_string (), create_float_u ())) in + let local_ t357_B : t357 = (B { float_u0 = create_float_u () }) in + let local_ t357_C : t357 = (C (create_float_u ())) in + let local_ t357_D : t357 = (D (create_float_u ())) in + let local_ t358_A : t358 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t358_B : t358 = (B (create_float_u ())) in + let local_ t358_C : t358 = (C { float_u0 = create_float_u () }) in + let local_ t359_A : t359 = (A (create_float32_u ())) in + let local_ t359_B : t359 = (B (create_string (), create_float_u ())) in + let local_ t360_A : t360 = (A { float_u0 = create_float_u () }) in + let local_ t360_B : t360 = (B { float_u0 = create_float_u () }) in + let local_ t360_C : t360 = (C (create_float_u ())) in + let local_ t361_A : t361 = (A (create_float (), create_float_u ())) in + let local_ t361_B : t361 = (B (create_float_u ())) in + let local_ t361_C : t361 = (C (create_float_u ())) in + let local_ t361_D : t361 = (D (create_float_u ())) in + let local_ t362_A : t362 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t362_B : t362 = (B { float_u0 = create_float_u () }) in + let local_ t363_A : t363 = (A (create_string (), create_float32_u ())) in + let local_ t363_B : t363 = (B (create_float_u ())) in + let local_ t363_C : t363 = (C (create_float_u ())) in + let local_ t364_A : t364 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t364_B : t364 = (B (create_float_u ())) in + let local_ t365_A : t365 = (A (create_int32_u ())) in + let local_ t366_A : t366 = (A (create_float_u ())) in + let local_ t366_B : t366 = (B (create_float_u ())) in + let local_ t366_C : t366 = (C (create_float_u ())) in + let local_ t366_D : t366 = (D (create_float_u ())) in + let local_ t366_E : t366 = (E (create_float_u ())) in + let local_ t367_A : t367 = (A { float_u0 = create_float_u () }) in + let local_ t367_B : t367 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t368_A : t368 = (A (create_string (), create_float_u ())) in + let local_ t368_B : t368 = (B (create_string (), create_float_u ())) in + let local_ t368_C : t368 = (C (create_float_u ())) in + let local_ t369_A : t369 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t369_B : t369 = (B { float_u0 = create_float_u () }) in + let local_ t369_C : t369 = (C (create_float_u ())) in + let local_ t369_D : t369 = (D (create_float_u ())) in + let local_ t370_A : t370 = (A (create_float32_u ())) in + let local_ t370_B : t370 = (B (create_float_u ())) in + let local_ t370_C : t370 = (C { float_u0 = create_float_u () }) in + let local_ t371_A : t371 = (A { float_u0 = create_float_u () }) in + let local_ t371_B : t371 = (B (create_string (), create_float_u ())) in + let local_ t372_A : t372 = (A (create_float (), create_float_u ())) in + let local_ t372_B : t372 = (B { float_u0 = create_float_u () }) in + let local_ t372_C : t372 = (C (create_float_u ())) in + let local_ t373_A : t373 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t373_B : t373 = (B (create_float_u ())) in + let local_ t373_C : t373 = (C (create_float_u ())) in + let local_ t373_D : t373 = (D (create_float_u ())) in + let local_ t374_A : t374 = (A (create_string (), create_float32_u ())) in + let local_ t374_B : t374 = (B { float_u0 = create_float_u () }) in + let local_ t375_A : t375 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t375_B : t375 = (B (create_float_u ())) in + let local_ t375_C : t375 = (C (create_float_u ())) in + let local_ t376_A : t376 = (A (create_int32_u ())) in + let local_ t376_B : t376 = (B (create_float_u ())) in + let local_ t377_A : t377 = (A { float32_u0 = create_float32_u () }) in + let local_ t378_A : t378 = (A (create_float_u ())) in + let local_ t378_B : t378 = (B { float_u0 = create_float_u () }) in + let local_ t378_C : t378 = (C { float_u0 = create_float_u () }) in + let local_ t379_A : t379 = (A { float_u0 = create_float_u () }) in + let local_ t379_B : t379 = (B (create_float_u ())) in + let local_ t379_C : t379 = (C (create_float_u ())) in + let local_ t379_D : t379 = (D (create_float_u ())) in + let local_ t379_E : t379 = (E (create_float_u ())) in + let local_ t380_A : t380 = (A (create_string (), create_float_u ())) in + let local_ t380_B : t380 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t381_A : t381 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t381_B : t381 = (B (create_string (), create_float_u ())) in + let local_ t381_C : t381 = (C (create_float_u ())) in + let local_ t382_A : t382 = (A (create_float32_u ())) in + let local_ t382_B : t382 = (B { float_u0 = create_float_u () }) in + let local_ t382_C : t382 = (C (create_float_u ())) in + let local_ t382_D : t382 = (D (create_float_u ())) in + let local_ t383_A : t383 = (A { float_u0 = create_float_u () }) in + let local_ t383_B : t383 = (B (create_float_u ())) in + let local_ t383_C : t383 = (C { float_u0 = create_float_u () }) in + let local_ t384_A : t384 = (A (create_float (), create_float_u ())) in + let local_ t384_B : t384 = (B (create_string (), create_float_u ())) in + let local_ t385_A : t385 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t385_B : t385 = (B { float_u0 = create_float_u () }) in + let local_ t385_C : t385 = (C (create_float_u ())) in + let local_ t386_A : t386 = (A (create_string (), create_float32_u ())) in + let local_ t386_B : t386 = (B (create_float_u ())) in + let local_ t386_C : t386 = (C (create_float_u ())) in + let local_ t386_D : t386 = (D (create_float_u ())) in + let local_ t387_A : t387 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t387_B : t387 = (B { float_u0 = create_float_u () }) in + let local_ t388_A : t388 = (A (create_int32_u ())) in + let local_ t388_B : t388 = (B (create_float_u ())) in + let local_ t388_C : t388 = (C (create_float_u ())) in + let local_ t389_A : t389 = (A { float32_u0 = create_float32_u () }) in + let local_ t389_B : t389 = (B (create_float_u ())) in + let local_ t390_A : t390 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t391_A : t391 = (A (create_float_u ())) in + let local_ t391_B : t391 = (B (create_string (), create_float_u ())) in + let local_ t391_C : t391 = (C (create_float_u ())) in + let local_ t391_D : t391 = (D (create_float_u ())) in + let local_ t392_A : t392 = (A { float_u0 = create_float_u () }) in + let local_ t392_B : t392 = (B { float_u0 = create_float_u () }) in + let local_ t392_C : t392 = (C { float_u0 = create_float_u () }) in + let local_ t393_A : t393 = (A (create_string (), create_float_u ())) in + let local_ t393_B : t393 = (B (create_float_u ())) in + let local_ t393_C : t393 = (C (create_float_u ())) in + let local_ t393_D : t393 = (D (create_float_u ())) in + let local_ t393_E : t393 = (E (create_float_u ())) in + let local_ t394_A : t394 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t394_B : t394 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t395_A : t395 = (A (create_float32_u ())) in + let local_ t395_B : t395 = (B (create_string (), create_float_u ())) in + let local_ t395_C : t395 = (C (create_float_u ())) in + let local_ t396_A : t396 = (A { float_u0 = create_float_u () }) in + let local_ t396_B : t396 = (B { float_u0 = create_float_u () }) in + let local_ t396_C : t396 = (C (create_float_u ())) in + let local_ t396_D : t396 = (D (create_float_u ())) in + let local_ t397_A : t397 = (A (create_float (), create_float_u ())) in + let local_ t397_B : t397 = (B (create_float_u ())) in + let local_ t397_C : t397 = (C { float_u0 = create_float_u () }) in + let local_ t398_A : t398 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t398_B : t398 = (B (create_string (), create_float_u ())) in + let local_ t399_A : t399 = (A (create_string (), create_float32_u ())) in + let local_ t399_B : t399 = (B { float_u0 = create_float_u () }) in + let local_ t399_C : t399 = (C (create_float_u ())) in + let local_ t400_A : t400 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t400_B : t400 = (B (create_float_u ())) in + let local_ t400_C : t400 = (C (create_float_u ())) in + let local_ t400_D : t400 = (D (create_float_u ())) in + let local_ t401_A : t401 = (A (create_int32_u ())) in + let local_ t401_B : t401 = (B { float_u0 = create_float_u () }) in + let local_ t402_A : t402 = (A { float32_u0 = create_float32_u () }) in + let local_ t402_B : t402 = (B (create_float_u ())) in + let local_ t402_C : t402 = (C (create_float_u ())) in + let local_ t403_A : t403 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t403_B : t403 = (B (create_float_u ())) in + let local_ t404_A : t404 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t405_A : t405 = (A (create_float_u ())) in + let local_ t405_B : t405 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t405_C : t405 = (C (create_float_u ())) in + let local_ t406_A : t406 = (A { float_u0 = create_float_u () }) in + let local_ t406_B : t406 = (B (create_string (), create_float_u ())) in + let local_ t406_C : t406 = (C (create_float_u ())) in + let local_ t406_D : t406 = (D (create_float_u ())) in + let local_ t407_A : t407 = (A (create_string (), create_float_u ())) in + let local_ t407_B : t407 = (B { float_u0 = create_float_u () }) in + let local_ t407_C : t407 = (C { float_u0 = create_float_u () }) in + let local_ t408_A : t408 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t408_B : t408 = (B (create_float_u ())) in + let local_ t408_C : t408 = (C (create_float_u ())) in + let local_ t408_D : t408 = (D (create_float_u ())) in + let local_ t408_E : t408 = (E (create_float_u ())) in + let local_ t409_A : t409 = (A (create_float32_u ())) in + let local_ t409_B : t409 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t410_A : t410 = (A { float_u0 = create_float_u () }) in + let local_ t410_B : t410 = (B (create_string (), create_float_u ())) in + let local_ t410_C : t410 = (C (create_float_u ())) in + let local_ t411_A : t411 = (A (create_float (), create_float_u ())) in + let local_ t411_B : t411 = (B { float_u0 = create_float_u () }) in + let local_ t411_C : t411 = (C (create_float_u ())) in + let local_ t411_D : t411 = (D (create_float_u ())) in + let local_ t412_A : t412 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t412_B : t412 = (B (create_float_u ())) in + let local_ t412_C : t412 = (C { float_u0 = create_float_u () }) in + let local_ t413_A : t413 = (A (create_string (), create_float32_u ())) in + let local_ t413_B : t413 = (B (create_string (), create_float_u ())) in + let local_ t414_A : t414 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t414_B : t414 = (B { float_u0 = create_float_u () }) in + let local_ t414_C : t414 = (C (create_float_u ())) in + let local_ t415_A : t415 = (A (create_int32_u ())) in + let local_ t415_B : t415 = (B (create_float_u ())) in + let local_ t415_C : t415 = (C (create_float_u ())) in + let local_ t415_D : t415 = (D (create_float_u ())) in + let local_ t416_A : t416 = (A { float32_u0 = create_float32_u () }) in + let local_ t416_B : t416 = (B { float_u0 = create_float_u () }) in + let local_ t417_A : t417 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t417_B : t417 = (B (create_float_u ())) in + let local_ t417_C : t417 = (C (create_float_u ())) in + let local_ t418_A : t418 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t418_B : t418 = (B (create_float_u ())) in + let local_ t419_A : t419 = (A (create_float (), create_float32_u ())) in + let local_ t420_A : t420 = (A (create_float_u ())) in + let local_ t420_B : t420 = (B (create_float32_u ())) in + let local_ t421_A : t421 = (A { float_u0 = create_float_u () }) in + let local_ t421_B : t421 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t421_C : t421 = (C (create_float_u ())) in + let local_ t422_A : t422 = (A (create_string (), create_float_u ())) in + let local_ t422_B : t422 = (B (create_string (), create_float_u ())) in + let local_ t422_C : t422 = (C (create_float_u ())) in + let local_ t422_D : t422 = (D (create_float_u ())) in + let local_ t423_A : t423 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t423_B : t423 = (B { float_u0 = create_float_u () }) in + let local_ t423_C : t423 = (C { float_u0 = create_float_u () }) in + let local_ t424_A : t424 = (A (create_float32_u ())) in + let local_ t424_B : t424 = (B (create_float_u ())) in + let local_ t424_C : t424 = (C (create_float_u ())) in + let local_ t424_D : t424 = (D (create_float_u ())) in + let local_ t424_E : t424 = (E (create_float_u ())) in + let local_ t425_A : t425 = (A { float_u0 = create_float_u () }) in + let local_ t425_B : t425 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t426_A : t426 = (A (create_float (), create_float_u ())) in + let local_ t426_B : t426 = (B (create_string (), create_float_u ())) in + let local_ t426_C : t426 = (C (create_float_u ())) in + let local_ t427_A : t427 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t427_B : t427 = (B { float_u0 = create_float_u () }) in + let local_ t427_C : t427 = (C (create_float_u ())) in + let local_ t427_D : t427 = (D (create_float_u ())) in + let local_ t428_A : t428 = (A (create_string (), create_float32_u ())) in + let local_ t428_B : t428 = (B (create_float_u ())) in + let local_ t428_C : t428 = (C { float_u0 = create_float_u () }) in + let local_ t429_A : t429 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t429_B : t429 = (B (create_string (), create_float_u ())) in + let local_ t430_A : t430 = (A (create_int32_u ())) in + let local_ t430_B : t430 = (B { float_u0 = create_float_u () }) in + let local_ t430_C : t430 = (C (create_float_u ())) in + let local_ t431_A : t431 = (A { float32_u0 = create_float32_u () }) in + let local_ t431_B : t431 = (B (create_float_u ())) in + let local_ t431_C : t431 = (C (create_float_u ())) in + let local_ t431_D : t431 = (D (create_float_u ())) in + let local_ t432_A : t432 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t432_B : t432 = (B { float_u0 = create_float_u () }) in + let local_ t433_A : t433 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t433_B : t433 = (B (create_float_u ())) in + let local_ t433_C : t433 = (C (create_float_u ())) in + let local_ t434_A : t434 = (A (create_float (), create_float32_u ())) in + let local_ t434_B : t434 = (B (create_float_u ())) in + let local_ t435_A : t435 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t436_A : t436 = (A (create_float_u ())) in + let local_ t436_B : t436 = (B (create_float_u ())) in + let local_ t436_C : t436 = (C { float_u0 = create_float_u () }) in + let local_ t436_D : t436 = (D (create_float_u ())) in + let local_ t437_A : t437 = (A { float_u0 = create_float_u () }) in + let local_ t437_B : t437 = (B (create_float32_u ())) in + let local_ t438_A : t438 = (A (create_string (), create_float_u ())) in + let local_ t438_B : t438 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t438_C : t438 = (C (create_float_u ())) in + let local_ t439_A : t439 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t439_B : t439 = (B (create_string (), create_float_u ())) in + let local_ t439_C : t439 = (C (create_float_u ())) in + let local_ t439_D : t439 = (D (create_float_u ())) in + let local_ t440_A : t440 = (A (create_float32_u ())) in + let local_ t440_B : t440 = (B { float_u0 = create_float_u () }) in + let local_ t440_C : t440 = (C { float_u0 = create_float_u () }) in + let local_ t441_A : t441 = (A { float_u0 = create_float_u () }) in + let local_ t441_B : t441 = (B (create_float_u ())) in + let local_ t441_C : t441 = (C (create_float_u ())) in + let local_ t441_D : t441 = (D (create_float_u ())) in + let local_ t441_E : t441 = (E (create_float_u ())) in + let local_ t442_A : t442 = (A (create_float (), create_float_u ())) in + let local_ t442_B : t442 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t443_A : t443 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t443_B : t443 = (B (create_string (), create_float_u ())) in + let local_ t443_C : t443 = (C (create_float_u ())) in + let local_ t444_A : t444 = (A (create_string (), create_float32_u ())) in + let local_ t444_B : t444 = (B { float_u0 = create_float_u () }) in + let local_ t444_C : t444 = (C (create_float_u ())) in + let local_ t444_D : t444 = (D (create_float_u ())) in + let local_ t445_A : t445 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t445_B : t445 = (B (create_float_u ())) in + let local_ t445_C : t445 = (C { float_u0 = create_float_u () }) in + let local_ t446_A : t446 = (A (create_int32_u ())) in + let local_ t446_B : t446 = (B (create_string (), create_float_u ())) in + let local_ t447_A : t447 = (A { float32_u0 = create_float32_u () }) in + let local_ t447_B : t447 = (B { float_u0 = create_float_u () }) in + let local_ t447_C : t447 = (C (create_float_u ())) in + let local_ t448_A : t448 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t448_B : t448 = (B (create_float_u ())) in + let local_ t448_C : t448 = (C (create_float_u ())) in + let local_ t448_D : t448 = (D (create_float_u ())) in + let local_ t449_A : t449 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t449_B : t449 = (B { float_u0 = create_float_u () }) in + let local_ t450_A : t450 = (A (create_float (), create_float32_u ())) in + let local_ t450_B : t450 = (B (create_float_u ())) in + let local_ t450_C : t450 = (C (create_float_u ())) in + let local_ t451_A : t451 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t451_B : t451 = (B (create_float_u ())) in + let local_ t452_A : t452 = (A (create_string (), create_int32_u ())) in + let local_ t453_A : t453 = (A (create_float_u ())) in + let local_ t453_B : t453 = (B { float_u0 = create_float_u () }) in + let local_ t453_C : t453 = (C (create_float_u ())) in + let local_ t453_D : t453 = (D (create_float_u ())) in + let local_ t453_E : t453 = (E (create_float_u ())) in + let local_ t454_A : t454 = (A { float_u0 = create_float_u () }) in + let local_ t454_B : t454 = (B (create_float_u ())) in + let local_ t454_C : t454 = (C { float_u0 = create_float_u () }) in + let local_ t454_D : t454 = (D (create_float_u ())) in + let local_ t455_A : t455 = (A (create_string (), create_float_u ())) in + let local_ t455_B : t455 = (B (create_float32_u ())) in + let local_ t456_A : t456 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t456_B : t456 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t456_C : t456 = (C (create_float_u ())) in + let local_ t457_A : t457 = (A (create_float32_u ())) in + let local_ t457_B : t457 = (B (create_string (), create_float_u ())) in + let local_ t457_C : t457 = (C (create_float_u ())) in + let local_ t457_D : t457 = (D (create_float_u ())) in + let local_ t458_A : t458 = (A { float_u0 = create_float_u () }) in + let local_ t458_B : t458 = (B { float_u0 = create_float_u () }) in + let local_ t458_C : t458 = (C { float_u0 = create_float_u () }) in + let local_ t459_A : t459 = (A (create_float (), create_float_u ())) in + let local_ t459_B : t459 = (B (create_float_u ())) in + let local_ t459_C : t459 = (C (create_float_u ())) in + let local_ t459_D : t459 = (D (create_float_u ())) in + let local_ t459_E : t459 = (E (create_float_u ())) in + let local_ t460_A : t460 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t460_B : t460 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t461_A : t461 = (A (create_string (), create_float32_u ())) in + let local_ t461_B : t461 = (B (create_string (), create_float_u ())) in + let local_ t461_C : t461 = (C (create_float_u ())) in + let local_ t462_A : t462 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t462_B : t462 = (B { float_u0 = create_float_u () }) in + let local_ t462_C : t462 = (C (create_float_u ())) in + let local_ t462_D : t462 = (D (create_float_u ())) in + let local_ t463_A : t463 = (A (create_int32_u ())) in + let local_ t463_B : t463 = (B (create_float_u ())) in + let local_ t463_C : t463 = (C { float_u0 = create_float_u () }) in + let local_ t464_A : t464 = (A { float32_u0 = create_float32_u () }) in + let local_ t464_B : t464 = (B (create_string (), create_float_u ())) in + let local_ t465_A : t465 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t465_B : t465 = (B { float_u0 = create_float_u () }) in + let local_ t465_C : t465 = (C (create_float_u ())) in + let local_ t466_A : t466 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t466_B : t466 = (B (create_float_u ())) in + let local_ t466_C : t466 = (C (create_float_u ())) in + let local_ t466_D : t466 = (D (create_float_u ())) in + let local_ t467_A : t467 = (A (create_float (), create_float32_u ())) in + let local_ t467_B : t467 = (B { float_u0 = create_float_u () }) in + let local_ t468_A : t468 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t468_B : t468 = (B (create_float_u ())) in + let local_ t468_C : t468 = (C (create_float_u ())) in + let local_ t469_A : t469 = (A (create_string (), create_int32_u ())) in + let local_ t469_B : t469 = (B (create_float_u ())) in + let local_ t470_A : t470 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in + let local_ t471_A : t471 = (A (create_float_u ())) in + let local_ t471_B : t471 = (B (create_string (), create_float_u ())) in + let local_ t471_C : t471 = (C { float_u0 = create_float_u () }) in + let local_ t472_A : t472 = (A { float_u0 = create_float_u () }) in + let local_ t472_B : t472 = (B { float_u0 = create_float_u () }) in + let local_ t472_C : t472 = (C (create_float_u ())) in + let local_ t472_D : t472 = (D (create_float_u ())) in + let local_ t472_E : t472 = (E (create_float_u ())) in + let local_ t473_A : t473 = (A (create_string (), create_float_u ())) in + let local_ t473_B : t473 = (B (create_float_u ())) in + let local_ t473_C : t473 = (C { float_u0 = create_float_u () }) in + let local_ t473_D : t473 = (D (create_float_u ())) in + let local_ t474_A : t474 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t474_B : t474 = (B (create_float32_u ())) in + let local_ t475_A : t475 = (A (create_float32_u ())) in + let local_ t475_B : t475 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t475_C : t475 = (C (create_float_u ())) in + let local_ t476_A : t476 = (A { float_u0 = create_float_u () }) in + let local_ t476_B : t476 = (B (create_string (), create_float_u ())) in + let local_ t476_C : t476 = (C (create_float_u ())) in + let local_ t476_D : t476 = (D (create_float_u ())) in + let local_ t477_A : t477 = (A (create_float (), create_float_u ())) in + let local_ t477_B : t477 = (B { float_u0 = create_float_u () }) in + let local_ t477_C : t477 = (C { float_u0 = create_float_u () }) in + let local_ t478_A : t478 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t478_B : t478 = (B (create_float_u ())) in + let local_ t478_C : t478 = (C (create_float_u ())) in + let local_ t478_D : t478 = (D (create_float_u ())) in + let local_ t478_E : t478 = (E (create_float_u ())) in + let local_ t479_A : t479 = (A (create_string (), create_float32_u ())) in + let local_ t479_B : t479 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t480_A : t480 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t480_B : t480 = (B (create_string (), create_float_u ())) in + let local_ t480_C : t480 = (C (create_float_u ())) in + let local_ t481_A : t481 = (A (create_int32_u ())) in + let local_ t481_B : t481 = (B { float_u0 = create_float_u () }) in + let local_ t481_C : t481 = (C (create_float_u ())) in + let local_ t481_D : t481 = (D (create_float_u ())) in + let local_ t482_A : t482 = (A { float32_u0 = create_float32_u () }) in + let local_ t482_B : t482 = (B (create_float_u ())) in + let local_ t482_C : t482 = (C { float_u0 = create_float_u () }) in + let local_ t483_A : t483 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t483_B : t483 = (B (create_string (), create_float_u ())) in + let local_ t484_A : t484 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t484_B : t484 = (B { float_u0 = create_float_u () }) in + let local_ t484_C : t484 = (C (create_float_u ())) in + let local_ t485_A : t485 = (A (create_float (), create_float32_u ())) in + let local_ t485_B : t485 = (B (create_float_u ())) in + let local_ t485_C : t485 = (C (create_float_u ())) in + let local_ t485_D : t485 = (D (create_float_u ())) in + let local_ t486_A : t486 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t486_B : t486 = (B { float_u0 = create_float_u () }) in + let local_ t487_A : t487 = (A (create_string (), create_int32_u ())) in + let local_ t487_B : t487 = (B (create_float_u ())) in + let local_ t487_C : t487 = (C (create_float_u ())) in + let local_ t488_A : t488 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in + let local_ t488_B : t488 = (B (create_float_u ())) in + let local_ t489_A : t489 = (A (create_int64_u ())) in + let local_ t490_A : t490 = (A (create_float_u ())) in + let local_ t490_B : t490 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t490_C : t490 = (C (create_float_u ())) in + let local_ t490_D : t490 = (D (create_float_u ())) in + let local_ t491_A : t491 = (A { float_u0 = create_float_u () }) in + let local_ t491_B : t491 = (B (create_string (), create_float_u ())) in + let local_ t491_C : t491 = (C { float_u0 = create_float_u () }) in + let local_ t492_A : t492 = (A (create_string (), create_float_u ())) in + let local_ t492_B : t492 = (B { float_u0 = create_float_u () }) in + let local_ t492_C : t492 = (C (create_float_u ())) in + let local_ t492_D : t492 = (D (create_float_u ())) in + let local_ t492_E : t492 = (E (create_float_u ())) in + let local_ t493_A : t493 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t493_B : t493 = (B (create_float_u ())) in + let local_ t493_C : t493 = (C { float_u0 = create_float_u () }) in + let local_ t493_D : t493 = (D (create_float_u ())) in + let local_ t494_A : t494 = (A (create_float32_u ())) in + let local_ t494_B : t494 = (B (create_float32_u ())) in + let local_ t495_A : t495 = (A { float_u0 = create_float_u () }) in + let local_ t495_B : t495 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t495_C : t495 = (C (create_float_u ())) in + let local_ t496_A : t496 = (A (create_float (), create_float_u ())) in + let local_ t496_B : t496 = (B (create_string (), create_float_u ())) in + let local_ t496_C : t496 = (C (create_float_u ())) in + let local_ t496_D : t496 = (D (create_float_u ())) in + let local_ t497_A : t497 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t497_B : t497 = (B { float_u0 = create_float_u () }) in + let local_ t497_C : t497 = (C { float_u0 = create_float_u () }) in + let local_ t498_A : t498 = (A (create_string (), create_float32_u ())) in + let local_ t498_B : t498 = (B (create_float_u ())) in + let local_ t498_C : t498 = (C (create_float_u ())) in + let local_ t498_D : t498 = (D (create_float_u ())) in + let local_ t498_E : t498 = (E (create_float_u ())) in + let local_ t499_A : t499 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t499_B : t499 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t500_A : t500 = (A (create_int32_u ())) in + let local_ t500_B : t500 = (B (create_string (), create_float_u ())) in + let local_ t500_C : t500 = (C (create_float_u ())) in + let local_ t501_A : t501 = (A { float32_u0 = create_float32_u () }) in + let local_ t501_B : t501 = (B { float_u0 = create_float_u () }) in + let local_ t501_C : t501 = (C (create_float_u ())) in + let local_ t501_D : t501 = (D (create_float_u ())) in + let local_ t502_A : t502 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t502_B : t502 = (B (create_float_u ())) in + let local_ t502_C : t502 = (C { float_u0 = create_float_u () }) in + let local_ t503_A : t503 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t503_B : t503 = (B (create_string (), create_float_u ())) in + let local_ t504_A : t504 = (A (create_float (), create_float32_u ())) in + let local_ t504_B : t504 = (B { float_u0 = create_float_u () }) in + let local_ t504_C : t504 = (C (create_float_u ())) in + let local_ t505_A : t505 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t505_B : t505 = (B (create_float_u ())) in + let local_ t505_C : t505 = (C (create_float_u ())) in + let local_ t505_D : t505 = (D (create_float_u ())) in + let local_ t506_A : t506 = (A (create_string (), create_int32_u ())) in + let local_ t506_B : t506 = (B { float_u0 = create_float_u () }) in + let local_ t507_A : t507 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in + let local_ t507_B : t507 = (B (create_float_u ())) in + let local_ t507_C : t507 = (C (create_float_u ())) in + let local_ t508_A : t508 = (A (create_int64_u ())) in + let local_ t508_B : t508 = (B (create_float_u ())) in + let local_ t509_A : t509 = (A { float32_u0 = create_float32_u () }) in + let local_ t510_A : t510 = (A (create_float_u ())) in + let local_ t510_B : t510 = (B (create_float32_u ())) in + let local_ t510_C : t510 = (C (create_float_u ())) in + let local_ t511_A : t511 = (A { float_u0 = create_float_u () }) in + let local_ t511_B : t511 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t511_C : t511 = (C (create_float_u ())) in + let local_ t511_D : t511 = (D (create_float_u ())) in + let local_ t512_A : t512 = (A (create_string (), create_float_u ())) in + let local_ t512_B : t512 = (B (create_string (), create_float_u ())) in + let local_ t512_C : t512 = (C { float_u0 = create_float_u () }) in + let local_ t513_A : t513 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t513_B : t513 = (B { float_u0 = create_float_u () }) in + let local_ t513_C : t513 = (C (create_float_u ())) in + let local_ t513_D : t513 = (D (create_float_u ())) in + let local_ t513_E : t513 = (E (create_float_u ())) in + let local_ t514_A : t514 = (A (create_float32_u ())) in + let local_ t514_B : t514 = (B (create_float_u ())) in + let local_ t514_C : t514 = (C { float_u0 = create_float_u () }) in + let local_ t514_D : t514 = (D (create_float_u ())) in + let local_ t515_A : t515 = (A { float_u0 = create_float_u () }) in + let local_ t515_B : t515 = (B (create_float32_u ())) in + let local_ t516_A : t516 = (A (create_float (), create_float_u ())) in + let local_ t516_B : t516 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t516_C : t516 = (C (create_float_u ())) in + let local_ t517_A : t517 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t517_B : t517 = (B (create_string (), create_float_u ())) in + let local_ t517_C : t517 = (C (create_float_u ())) in + let local_ t517_D : t517 = (D (create_float_u ())) in + let local_ t518_A : t518 = (A (create_string (), create_float32_u ())) in + let local_ t518_B : t518 = (B { float_u0 = create_float_u () }) in + let local_ t518_C : t518 = (C { float_u0 = create_float_u () }) in + let local_ t519_A : t519 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t519_B : t519 = (B (create_float_u ())) in + let local_ t519_C : t519 = (C (create_float_u ())) in + let local_ t519_D : t519 = (D (create_float_u ())) in + let local_ t519_E : t519 = (E (create_float_u ())) in + let local_ t520_A : t520 = (A (create_int32_u ())) in + let local_ t520_B : t520 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t521_A : t521 = (A { float32_u0 = create_float32_u () }) in + let local_ t521_B : t521 = (B (create_string (), create_float_u ())) in + let local_ t521_C : t521 = (C (create_float_u ())) in + let local_ t522_A : t522 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t522_B : t522 = (B { float_u0 = create_float_u () }) in + let local_ t522_C : t522 = (C (create_float_u ())) in + let local_ t522_D : t522 = (D (create_float_u ())) in + let local_ t523_A : t523 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t523_B : t523 = (B (create_float_u ())) in + let local_ t523_C : t523 = (C { float_u0 = create_float_u () }) in + let local_ t524_A : t524 = (A (create_float (), create_float32_u ())) in + let local_ t524_B : t524 = (B (create_string (), create_float_u ())) in + let local_ t525_A : t525 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t525_B : t525 = (B { float_u0 = create_float_u () }) in + let local_ t525_C : t525 = (C (create_float_u ())) in + let local_ t526_A : t526 = (A (create_string (), create_int32_u ())) in + let local_ t526_B : t526 = (B (create_float_u ())) in + let local_ t526_C : t526 = (C (create_float_u ())) in + let local_ t526_D : t526 = (D (create_float_u ())) in + let local_ t527_A : t527 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in + let local_ t527_B : t527 = (B { float_u0 = create_float_u () }) in + let local_ t528_A : t528 = (A (create_int64_u ())) in + let local_ t528_B : t528 = (B (create_float_u ())) in + let local_ t528_C : t528 = (C (create_float_u ())) in + let local_ t529_A : t529 = (A { float32_u0 = create_float32_u () }) in + let local_ t529_B : t529 = (B (create_float_u ())) in + let local_ t530_A : t530 = (A (create_float (), create_string (), create_float_u ())) in + let local_ t531_A : t531 = (A (create_float_u ())) in + let local_ t531_B : t531 = (B { float_u0 = create_float_u () }) in + let local_ t532_A : t532 = (A { float_u0 = create_float_u () }) in + let local_ t532_B : t532 = (B (create_float32_u ())) in + let local_ t532_C : t532 = (C (create_float_u ())) in + let local_ t533_A : t533 = (A (create_string (), create_float_u ())) in + let local_ t533_B : t533 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t533_C : t533 = (C (create_float_u ())) in + let local_ t533_D : t533 = (D (create_float_u ())) in + let local_ t534_A : t534 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t534_B : t534 = (B (create_string (), create_float_u ())) in + let local_ t534_C : t534 = (C { float_u0 = create_float_u () }) in + let local_ t535_A : t535 = (A (create_float32_u ())) in + let local_ t535_B : t535 = (B { float_u0 = create_float_u () }) in + let local_ t535_C : t535 = (C (create_float_u ())) in + let local_ t535_D : t535 = (D (create_float_u ())) in + let local_ t535_E : t535 = (E (create_float_u ())) in + let local_ t536_A : t536 = (A { float_u0 = create_float_u () }) in + let local_ t536_B : t536 = (B (create_float_u ())) in + let local_ t536_C : t536 = (C { float_u0 = create_float_u () }) in + let local_ t536_D : t536 = (D (create_float_u ())) in + let local_ t537_A : t537 = (A (create_float (), create_float_u ())) in + let local_ t537_B : t537 = (B (create_float32_u ())) in + let local_ t538_A : t538 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t538_B : t538 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t538_C : t538 = (C (create_float_u ())) in + let local_ t539_A : t539 = (A (create_string (), create_float32_u ())) in + let local_ t539_B : t539 = (B (create_string (), create_float_u ())) in + let local_ t539_C : t539 = (C (create_float_u ())) in + let local_ t539_D : t539 = (D (create_float_u ())) in + let local_ t540_A : t540 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t540_B : t540 = (B { float_u0 = create_float_u () }) in + let local_ t540_C : t540 = (C { float_u0 = create_float_u () }) in + let local_ t541_A : t541 = (A (create_int32_u ())) in + let local_ t541_B : t541 = (B (create_float_u ())) in + let local_ t541_C : t541 = (C (create_float_u ())) in + let local_ t541_D : t541 = (D (create_float_u ())) in + let local_ t541_E : t541 = (E (create_float_u ())) in + let local_ t542_A : t542 = (A { float32_u0 = create_float32_u () }) in + let local_ t542_B : t542 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t543_A : t543 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t543_B : t543 = (B (create_string (), create_float_u ())) in + let local_ t543_C : t543 = (C (create_float_u ())) in + let local_ t544_A : t544 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t544_B : t544 = (B { float_u0 = create_float_u () }) in + let local_ t544_C : t544 = (C (create_float_u ())) in + let local_ t544_D : t544 = (D (create_float_u ())) in + let local_ t545_A : t545 = (A (create_float (), create_float32_u ())) in + let local_ t545_B : t545 = (B (create_float_u ())) in + let local_ t545_C : t545 = (C { float_u0 = create_float_u () }) in + let local_ t546_A : t546 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t546_B : t546 = (B (create_string (), create_float_u ())) in + let local_ t547_A : t547 = (A (create_string (), create_int32_u ())) in + let local_ t547_B : t547 = (B { float_u0 = create_float_u () }) in + let local_ t547_C : t547 = (C (create_float_u ())) in + let local_ t548_A : t548 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in + let local_ t548_B : t548 = (B (create_float_u ())) in + let local_ t548_C : t548 = (C (create_float_u ())) in + let local_ t548_D : t548 = (D (create_float_u ())) in + let local_ t549_A : t549 = (A (create_int64_u ())) in + let local_ t549_B : t549 = (B { float_u0 = create_float_u () }) in + let local_ t550_A : t550 = (A { float32_u0 = create_float32_u () }) in + let local_ t550_B : t550 = (B (create_float_u ())) in + let local_ t550_C : t550 = (C (create_float_u ())) in + let local_ t551_A : t551 = (A (create_float (), create_string (), create_float_u ())) in + let local_ t551_B : t551 = (B (create_float_u ())) in + let local_ t552_A : t552 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t553_A : t553 = (A (create_float_u ())) in + let local_ t553_B : t553 = (B (create_float_u ())) in + let local_ t553_C : t553 = (C (create_string (), create_float_u ())) in + let local_ t554_A : t554 = (A { float_u0 = create_float_u () }) in + let local_ t554_B : t554 = (B { float_u0 = create_float_u () }) in + let local_ t555_A : t555 = (A (create_string (), create_float_u ())) in + let local_ t555_B : t555 = (B (create_float32_u ())) in + let local_ t555_C : t555 = (C (create_float_u ())) in + let local_ t556_A : t556 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t556_B : t556 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t556_C : t556 = (C (create_float_u ())) in + let local_ t556_D : t556 = (D (create_float_u ())) in + let local_ t557_A : t557 = (A (create_float32_u ())) in + let local_ t557_B : t557 = (B (create_string (), create_float_u ())) in + let local_ t557_C : t557 = (C { float_u0 = create_float_u () }) in + let local_ t558_A : t558 = (A { float_u0 = create_float_u () }) in + let local_ t558_B : t558 = (B { float_u0 = create_float_u () }) in + let local_ t558_C : t558 = (C (create_float_u ())) in + let local_ t558_D : t558 = (D (create_float_u ())) in + let local_ t558_E : t558 = (E (create_float_u ())) in + let local_ t559_A : t559 = (A (create_float (), create_float_u ())) in + let local_ t559_B : t559 = (B (create_float_u ())) in + let local_ t559_C : t559 = (C { float_u0 = create_float_u () }) in + let local_ t559_D : t559 = (D (create_float_u ())) in + let local_ t560_A : t560 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t560_B : t560 = (B (create_float32_u ())) in + let local_ t561_A : t561 = (A (create_string (), create_float32_u ())) in + let local_ t561_B : t561 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t561_C : t561 = (C (create_float_u ())) in + let local_ t562_A : t562 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t562_B : t562 = (B (create_string (), create_float_u ())) in + let local_ t562_C : t562 = (C (create_float_u ())) in + let local_ t562_D : t562 = (D (create_float_u ())) in + let local_ t563_A : t563 = (A (create_int32_u ())) in + let local_ t563_B : t563 = (B { float_u0 = create_float_u () }) in + let local_ t563_C : t563 = (C { float_u0 = create_float_u () }) in + let local_ t564_A : t564 = (A { float32_u0 = create_float32_u () }) in + let local_ t564_B : t564 = (B (create_float_u ())) in + let local_ t564_C : t564 = (C (create_float_u ())) in + let local_ t564_D : t564 = (D (create_float_u ())) in + let local_ t564_E : t564 = (E (create_float_u ())) in + let local_ t565_A : t565 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t565_B : t565 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t566_A : t566 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t566_B : t566 = (B (create_string (), create_float_u ())) in + let local_ t566_C : t566 = (C (create_float_u ())) in + let local_ t567_A : t567 = (A (create_float (), create_float32_u ())) in + let local_ t567_B : t567 = (B { float_u0 = create_float_u () }) in + let local_ t567_C : t567 = (C (create_float_u ())) in + let local_ t567_D : t567 = (D (create_float_u ())) in + let local_ t568_A : t568 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t568_B : t568 = (B (create_float_u ())) in + let local_ t568_C : t568 = (C { float_u0 = create_float_u () }) in + let local_ t569_A : t569 = (A (create_string (), create_int32_u ())) in + let local_ t569_B : t569 = (B (create_string (), create_float_u ())) in + let local_ t570_A : t570 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in + let local_ t570_B : t570 = (B { float_u0 = create_float_u () }) in + let local_ t570_C : t570 = (C (create_float_u ())) in + let local_ t571_A : t571 = (A (create_int64_u ())) in + let local_ t571_B : t571 = (B (create_float_u ())) in + let local_ t571_C : t571 = (C (create_float_u ())) in + let local_ t571_D : t571 = (D (create_float_u ())) in + let local_ t572_A : t572 = (A { float32_u0 = create_float32_u () }) in + let local_ t572_B : t572 = (B { float_u0 = create_float_u () }) in + let local_ t573_A : t573 = (A (create_float (), create_string (), create_float_u ())) in + let local_ t573_B : t573 = (B (create_float_u ())) in + let local_ t573_C : t573 = (C (create_float_u ())) in + let local_ t574_A : t574 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t574_B : t574 = (B (create_float_u ())) in + let local_ t575_A : t575 = (A (create_string (), create_string (), create_float32_u ())) in + let local_ t576_A : t576 = (A (create_float_u ())) in + let local_ t576_B : t576 = (B { float_u0 = create_float_u () }) in + let local_ t576_C : t576 = (C { float_u0 = create_float_u () }) in + let local_ t576_D : t576 = (D (create_float_u ())) in + let local_ t577_A : t577 = (A { float_u0 = create_float_u () }) in + let local_ t577_B : t577 = (B (create_float_u ())) in + let local_ t577_C : t577 = (C (create_string (), create_float_u ())) in + let local_ t578_A : t578 = (A (create_string (), create_float_u ())) in + let local_ t578_B : t578 = (B { float_u0 = create_float_u () }) in + let local_ t579_A : t579 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t579_B : t579 = (B (create_float32_u ())) in + let local_ t579_C : t579 = (C (create_float_u ())) in + let local_ t580_A : t580 = (A (create_float32_u ())) in + let local_ t580_B : t580 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t580_C : t580 = (C (create_float_u ())) in + let local_ t580_D : t580 = (D (create_float_u ())) in + let local_ t581_A : t581 = (A { float_u0 = create_float_u () }) in + let local_ t581_B : t581 = (B (create_string (), create_float_u ())) in + let local_ t581_C : t581 = (C { float_u0 = create_float_u () }) in + let local_ t582_A : t582 = (A (create_float (), create_float_u ())) in + let local_ t582_B : t582 = (B { float_u0 = create_float_u () }) in + let local_ t582_C : t582 = (C (create_float_u ())) in + let local_ t582_D : t582 = (D (create_float_u ())) in + let local_ t582_E : t582 = (E (create_float_u ())) in + let local_ t583_A : t583 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t583_B : t583 = (B (create_float_u ())) in + let local_ t583_C : t583 = (C { float_u0 = create_float_u () }) in + let local_ t583_D : t583 = (D (create_float_u ())) in + let local_ t584_A : t584 = (A (create_string (), create_float32_u ())) in + let local_ t584_B : t584 = (B (create_float32_u ())) in + let local_ t585_A : t585 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t585_B : t585 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t585_C : t585 = (C (create_float_u ())) in + let local_ t586_A : t586 = (A (create_int32_u ())) in + let local_ t586_B : t586 = (B (create_string (), create_float_u ())) in + let local_ t586_C : t586 = (C (create_float_u ())) in + let local_ t586_D : t586 = (D (create_float_u ())) in + let local_ t587_A : t587 = (A { float32_u0 = create_float32_u () }) in + let local_ t587_B : t587 = (B { float_u0 = create_float_u () }) in + let local_ t587_C : t587 = (C { float_u0 = create_float_u () }) in + let local_ t588_A : t588 = (A (create_string (), create_string (), create_float_u ())) in + let local_ t588_B : t588 = (B (create_float_u ())) in + let local_ t588_C : t588 = (C (create_float_u ())) in + let local_ t588_D : t588 = (D (create_float_u ())) in + let local_ t588_E : t588 = (E (create_float_u ())) in + let local_ t589_A : t589 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t589_B : t589 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t590_A : t590 = (A (create_float (), create_float32_u ())) in + let local_ t590_B : t590 = (B (create_string (), create_float_u ())) in + let local_ t590_C : t590 = (C (create_float_u ())) in + let local_ t591_A : t591 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t591_B : t591 = (B { float_u0 = create_float_u () }) in + let local_ t591_C : t591 = (C (create_float_u ())) in + let local_ t591_D : t591 = (D (create_float_u ())) in + let local_ t592_A : t592 = (A (create_string (), create_int32_u ())) in + let local_ t592_B : t592 = (B (create_float_u ())) in + let local_ t592_C : t592 = (C { float_u0 = create_float_u () }) in + let local_ t593_A : t593 = (A { str0 = create_string (); float32_u1 = create_float32_u () }) in + let local_ t593_B : t593 = (B (create_string (), create_float_u ())) in + let local_ t594_A : t594 = (A (create_int64_u ())) in + let local_ t594_B : t594 = (B { float_u0 = create_float_u () }) in + let local_ t594_C : t594 = (C (create_float_u ())) in + let local_ t595_A : t595 = (A { float32_u0 = create_float32_u () }) in + let local_ t595_B : t595 = (B (create_float_u ())) in + let local_ t595_C : t595 = (C (create_float_u ())) in + let local_ t595_D : t595 = (D (create_float_u ())) in + let local_ t596_A : t596 = (A (create_float (), create_string (), create_float_u ())) in + let local_ t596_B : t596 = (B { float_u0 = create_float_u () }) in + let local_ t597_A : t597 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + let local_ t597_B : t597 = (B (create_float_u ())) in + let local_ t597_C : t597 = (C (create_float_u ())) in + let local_ t598_A : t598 = (A (create_string (), create_string (), create_float32_u ())) in + let local_ t598_B : t598 = (B (create_float_u ())) in + let local_ t599_A : t599 = (A { float0 = create_float (); float_u1 = create_float_u () }) in + print_endline " - Doing GC"; + Gc.full_major (); + opaque_ignore t0; + opaque_ignore t1; + opaque_ignore t2; + opaque_ignore t3; + opaque_ignore t4; + opaque_ignore t5; + opaque_ignore t6; + opaque_ignore t7; + opaque_ignore t8; + opaque_ignore t9; + opaque_ignore t10; + opaque_ignore t11; + opaque_ignore t12; + opaque_ignore t13; + opaque_ignore t14; + opaque_ignore t15; + opaque_ignore t16; + opaque_ignore t17; + opaque_ignore t18; + opaque_ignore t19; + opaque_ignore t20; + opaque_ignore t21; + opaque_ignore t22; + opaque_ignore t23; + opaque_ignore t24; + opaque_ignore t25; + opaque_ignore t26; + opaque_ignore t27; + opaque_ignore t28; + opaque_ignore t29; + opaque_ignore t30; + opaque_ignore t31; + opaque_ignore t32; + opaque_ignore t33; + opaque_ignore t34; + opaque_ignore t35; + opaque_ignore t36; + opaque_ignore t37; + opaque_ignore t38; + opaque_ignore t39; + opaque_ignore t40; + opaque_ignore t41; + opaque_ignore t42; + opaque_ignore t43; + opaque_ignore t44; + opaque_ignore t45; + opaque_ignore t46; + opaque_ignore t47; + opaque_ignore t48; + opaque_ignore t49; + opaque_ignore t50; + opaque_ignore t51; + opaque_ignore t52; + opaque_ignore t53; + opaque_ignore t54; + opaque_ignore t55; + opaque_ignore t56; + opaque_ignore t57; + opaque_ignore t58; + opaque_ignore t59; + opaque_ignore t60; + opaque_ignore t61; + opaque_ignore t62; + opaque_ignore t63; + opaque_ignore t64; + opaque_ignore t65; + opaque_ignore t66; + opaque_ignore t67; + opaque_ignore t68; + opaque_ignore t69; + opaque_ignore t70; + opaque_ignore t71; + opaque_ignore t72; + opaque_ignore t73; + opaque_ignore t74; + opaque_ignore t75; + opaque_ignore t76; + opaque_ignore t77; + opaque_ignore t78; + opaque_ignore t79; + opaque_ignore t80; + opaque_ignore t81; + opaque_ignore t82; + opaque_ignore t83; + opaque_ignore t84; + opaque_ignore t85; + opaque_ignore t86; + opaque_ignore t87; + opaque_ignore t88; + opaque_ignore t89; + opaque_ignore t90; + opaque_ignore t91; + opaque_ignore t92; + opaque_ignore t93; + opaque_ignore t94; + opaque_ignore t95; + opaque_ignore t96; + opaque_ignore t97; + opaque_ignore t98; + opaque_ignore t99; + opaque_ignore t100; + opaque_ignore t101; + opaque_ignore t102; + opaque_ignore t103; + opaque_ignore t104; + opaque_ignore t105; + opaque_ignore t106; + opaque_ignore t107; + opaque_ignore t108; + opaque_ignore t109; + opaque_ignore t110; + opaque_ignore t111; + opaque_ignore t112; + opaque_ignore t113; + opaque_ignore t114; + opaque_ignore t115; + opaque_ignore t116; + opaque_ignore t117; + opaque_ignore t118; + opaque_ignore t119; + opaque_ignore t120; + opaque_ignore t121; + opaque_ignore t122; + opaque_ignore t123; + opaque_ignore t124; + opaque_ignore t125; + opaque_ignore t126; + opaque_ignore t127; + opaque_ignore t128; + opaque_ignore t129; + opaque_ignore t130; + opaque_ignore t131; + opaque_ignore t132; + opaque_ignore t133; + opaque_ignore t134; + opaque_ignore t135; + opaque_ignore t136; + opaque_ignore t137; + opaque_ignore t138; + opaque_ignore t139; + opaque_ignore t140; + opaque_ignore t141; + opaque_ignore t142; + opaque_ignore t143; + opaque_ignore t144; + opaque_ignore t145; + opaque_ignore t146; + opaque_ignore t147; + opaque_ignore t148; + opaque_ignore t149; + opaque_ignore t150; + opaque_ignore t151; + opaque_ignore t152; + opaque_ignore t153; + opaque_ignore t154; + opaque_ignore t155; + opaque_ignore t156; + opaque_ignore t157; + opaque_ignore t158; + opaque_ignore t159; + opaque_ignore t160; + opaque_ignore t161; + opaque_ignore t162; + opaque_ignore t163; + opaque_ignore t164; + opaque_ignore t165; + opaque_ignore t166; + opaque_ignore t167; + opaque_ignore t168; + opaque_ignore t169; + opaque_ignore t170; + opaque_ignore t171; + opaque_ignore t172; + opaque_ignore t173; + opaque_ignore t174; + opaque_ignore t175; + opaque_ignore t176; + opaque_ignore t177; + opaque_ignore t178; + opaque_ignore t179; + opaque_ignore t180; + opaque_ignore t181; + opaque_ignore t182; + opaque_ignore t183; + opaque_ignore t184; + opaque_ignore t185; + opaque_ignore t186; + opaque_ignore t187; + opaque_ignore t188; + opaque_ignore t189; + opaque_ignore t190; + opaque_ignore t191; + opaque_ignore t192; + opaque_ignore t193; + opaque_ignore t194; + opaque_ignore t195; + opaque_ignore t196; + opaque_ignore t197; + opaque_ignore t198; + opaque_ignore t199; + opaque_ignore t200; + opaque_ignore t201; + opaque_ignore t202; + opaque_ignore t203; + opaque_ignore t204; + opaque_ignore t205; + opaque_ignore t206; + opaque_ignore t207; + opaque_ignore t208; + opaque_ignore t209; + opaque_ignore t210; + opaque_ignore t211; + opaque_ignore t212; + opaque_ignore t213; + opaque_ignore t214; + opaque_ignore t215; + opaque_ignore t216; + opaque_ignore t217; + opaque_ignore t218; + opaque_ignore t219; + opaque_ignore t220; + opaque_ignore t221; + opaque_ignore t222; + opaque_ignore t223; + opaque_ignore t224; + opaque_ignore t225; + opaque_ignore t226; + opaque_ignore t227; + opaque_ignore t228; + opaque_ignore t229; + opaque_ignore t230; + opaque_ignore t231; + opaque_ignore t232; + opaque_ignore t233; + opaque_ignore t234; + opaque_ignore t235; + opaque_ignore t236; + opaque_ignore t237; + opaque_ignore t238; + opaque_ignore t239; + opaque_ignore t240; + opaque_ignore t241; + opaque_ignore t242; + opaque_ignore t243; + opaque_ignore t244; + opaque_ignore t245; + opaque_ignore t246; + opaque_ignore t247; + opaque_ignore t248; + opaque_ignore t249; + opaque_ignore t250; + opaque_ignore t251; + opaque_ignore t252; + opaque_ignore t253; + opaque_ignore t254; + opaque_ignore t255; + opaque_ignore t256; + opaque_ignore t257; + opaque_ignore t258; + opaque_ignore t259; + opaque_ignore t260; + opaque_ignore t261; + opaque_ignore t262; + opaque_ignore t263; + opaque_ignore t264; + opaque_ignore t265; + opaque_ignore t266; + opaque_ignore t267; + opaque_ignore t268; + opaque_ignore t269; + opaque_ignore t270; + opaque_ignore t271; + opaque_ignore t272; + opaque_ignore t273; + opaque_ignore t274; + opaque_ignore t275; + opaque_ignore t276; + opaque_ignore t277; + opaque_ignore t278; + opaque_ignore t279; + opaque_ignore t280; + opaque_ignore t281; + opaque_ignore t282; + opaque_ignore t283; + opaque_ignore t284; + opaque_ignore t285; + opaque_ignore t286; + opaque_ignore t287; + opaque_ignore t288; + opaque_ignore t289; + opaque_ignore t290; + opaque_ignore t291; + opaque_ignore t292; + opaque_ignore t293; + opaque_ignore t294; + opaque_ignore t295; + opaque_ignore t296; + opaque_ignore t297; + opaque_ignore t298; + opaque_ignore t299; + opaque_ignore t300_A; + opaque_ignore t301_A; + opaque_ignore t301_B; + opaque_ignore t302_A; + opaque_ignore t303_A; + opaque_ignore t303_B; + opaque_ignore t303_C; + opaque_ignore t304_A; + opaque_ignore t304_B; + opaque_ignore t305_A; + opaque_ignore t306_A; + opaque_ignore t306_B; + opaque_ignore t307_A; + opaque_ignore t307_B; + opaque_ignore t307_C; + opaque_ignore t308_A; + opaque_ignore t308_B; + opaque_ignore t309_A; + opaque_ignore t310_A; + opaque_ignore t310_B; + opaque_ignore t310_C; + opaque_ignore t310_D; + opaque_ignore t311_A; + opaque_ignore t311_B; + opaque_ignore t312_A; + opaque_ignore t312_B; + opaque_ignore t312_C; + opaque_ignore t313_A; + opaque_ignore t313_B; + opaque_ignore t314_A; + opaque_ignore t315_A; + opaque_ignore t315_B; + opaque_ignore t315_C; + opaque_ignore t316_A; + opaque_ignore t316_B; + opaque_ignore t316_C; + opaque_ignore t316_D; + opaque_ignore t317_A; + opaque_ignore t317_B; + opaque_ignore t318_A; + opaque_ignore t318_B; + opaque_ignore t318_C; + opaque_ignore t319_A; + opaque_ignore t319_B; + opaque_ignore t320_A; + opaque_ignore t321_A; + opaque_ignore t321_B; + opaque_ignore t322_A; + opaque_ignore t322_B; + opaque_ignore t322_C; + opaque_ignore t323_A; + opaque_ignore t323_B; + opaque_ignore t323_C; + opaque_ignore t323_D; + opaque_ignore t324_A; + opaque_ignore t324_B; + opaque_ignore t325_A; + opaque_ignore t325_B; + opaque_ignore t325_C; + opaque_ignore t326_A; + opaque_ignore t326_B; + opaque_ignore t327_A; + opaque_ignore t328_A; + opaque_ignore t328_B; + opaque_ignore t328_C; + opaque_ignore t329_A; + opaque_ignore t329_B; + opaque_ignore t330_A; + opaque_ignore t330_B; + opaque_ignore t330_C; + opaque_ignore t331_A; + opaque_ignore t331_B; + opaque_ignore t331_C; + opaque_ignore t331_D; + opaque_ignore t332_A; + opaque_ignore t332_B; + opaque_ignore t333_A; + opaque_ignore t333_B; + opaque_ignore t333_C; + opaque_ignore t334_A; + opaque_ignore t334_B; + opaque_ignore t335_A; + opaque_ignore t336_A; + opaque_ignore t336_B; + opaque_ignore t336_C; + opaque_ignore t336_D; + opaque_ignore t337_A; + opaque_ignore t337_B; + opaque_ignore t337_C; + opaque_ignore t338_A; + opaque_ignore t338_B; + opaque_ignore t339_A; + opaque_ignore t339_B; + opaque_ignore t339_C; + opaque_ignore t340_A; + opaque_ignore t340_B; + opaque_ignore t340_C; + opaque_ignore t340_D; + opaque_ignore t341_A; + opaque_ignore t341_B; + opaque_ignore t342_A; + opaque_ignore t342_B; + opaque_ignore t342_C; + opaque_ignore t343_A; + opaque_ignore t343_B; + opaque_ignore t344_A; + opaque_ignore t345_A; + opaque_ignore t345_B; + opaque_ignore t345_C; + opaque_ignore t346_A; + opaque_ignore t346_B; + opaque_ignore t346_C; + opaque_ignore t346_D; + opaque_ignore t347_A; + opaque_ignore t347_B; + opaque_ignore t347_C; + opaque_ignore t348_A; + opaque_ignore t348_B; + opaque_ignore t349_A; + opaque_ignore t349_B; + opaque_ignore t349_C; + opaque_ignore t350_A; + opaque_ignore t350_B; + opaque_ignore t350_C; + opaque_ignore t350_D; + opaque_ignore t351_A; + opaque_ignore t351_B; + opaque_ignore t352_A; + opaque_ignore t352_B; + opaque_ignore t352_C; + opaque_ignore t353_A; + opaque_ignore t353_B; + opaque_ignore t354_A; + opaque_ignore t355_A; + opaque_ignore t355_B; + opaque_ignore t356_A; + opaque_ignore t356_B; + opaque_ignore t356_C; + opaque_ignore t357_A; + opaque_ignore t357_B; + opaque_ignore t357_C; + opaque_ignore t357_D; + opaque_ignore t358_A; + opaque_ignore t358_B; + opaque_ignore t358_C; + opaque_ignore t359_A; + opaque_ignore t359_B; + opaque_ignore t360_A; + opaque_ignore t360_B; + opaque_ignore t360_C; + opaque_ignore t361_A; + opaque_ignore t361_B; + opaque_ignore t361_C; + opaque_ignore t361_D; + opaque_ignore t362_A; + opaque_ignore t362_B; + opaque_ignore t363_A; + opaque_ignore t363_B; + opaque_ignore t363_C; + opaque_ignore t364_A; + opaque_ignore t364_B; + opaque_ignore t365_A; + opaque_ignore t366_A; + opaque_ignore t366_B; + opaque_ignore t366_C; + opaque_ignore t366_D; + opaque_ignore t366_E; + opaque_ignore t367_A; + opaque_ignore t367_B; + opaque_ignore t368_A; + opaque_ignore t368_B; + opaque_ignore t368_C; + opaque_ignore t369_A; + opaque_ignore t369_B; + opaque_ignore t369_C; + opaque_ignore t369_D; + opaque_ignore t370_A; + opaque_ignore t370_B; + opaque_ignore t370_C; + opaque_ignore t371_A; + opaque_ignore t371_B; + opaque_ignore t372_A; + opaque_ignore t372_B; + opaque_ignore t372_C; + opaque_ignore t373_A; + opaque_ignore t373_B; + opaque_ignore t373_C; + opaque_ignore t373_D; + opaque_ignore t374_A; + opaque_ignore t374_B; + opaque_ignore t375_A; + opaque_ignore t375_B; + opaque_ignore t375_C; + opaque_ignore t376_A; + opaque_ignore t376_B; + opaque_ignore t377_A; + opaque_ignore t378_A; + opaque_ignore t378_B; + opaque_ignore t378_C; + opaque_ignore t379_A; + opaque_ignore t379_B; + opaque_ignore t379_C; + opaque_ignore t379_D; + opaque_ignore t379_E; + opaque_ignore t380_A; + opaque_ignore t380_B; + opaque_ignore t381_A; + opaque_ignore t381_B; + opaque_ignore t381_C; + opaque_ignore t382_A; + opaque_ignore t382_B; + opaque_ignore t382_C; + opaque_ignore t382_D; + opaque_ignore t383_A; + opaque_ignore t383_B; + opaque_ignore t383_C; + opaque_ignore t384_A; + opaque_ignore t384_B; + opaque_ignore t385_A; + opaque_ignore t385_B; + opaque_ignore t385_C; + opaque_ignore t386_A; + opaque_ignore t386_B; + opaque_ignore t386_C; + opaque_ignore t386_D; + opaque_ignore t387_A; + opaque_ignore t387_B; + opaque_ignore t388_A; + opaque_ignore t388_B; + opaque_ignore t388_C; + opaque_ignore t389_A; + opaque_ignore t389_B; + opaque_ignore t390_A; + opaque_ignore t391_A; + opaque_ignore t391_B; + opaque_ignore t391_C; + opaque_ignore t391_D; + opaque_ignore t392_A; + opaque_ignore t392_B; + opaque_ignore t392_C; + opaque_ignore t393_A; + opaque_ignore t393_B; + opaque_ignore t393_C; + opaque_ignore t393_D; + opaque_ignore t393_E; + opaque_ignore t394_A; + opaque_ignore t394_B; + opaque_ignore t395_A; + opaque_ignore t395_B; + opaque_ignore t395_C; + opaque_ignore t396_A; + opaque_ignore t396_B; + opaque_ignore t396_C; + opaque_ignore t396_D; + opaque_ignore t397_A; + opaque_ignore t397_B; + opaque_ignore t397_C; + opaque_ignore t398_A; + opaque_ignore t398_B; + opaque_ignore t399_A; + opaque_ignore t399_B; + opaque_ignore t399_C; + opaque_ignore t400_A; + opaque_ignore t400_B; + opaque_ignore t400_C; + opaque_ignore t400_D; + opaque_ignore t401_A; + opaque_ignore t401_B; + opaque_ignore t402_A; + opaque_ignore t402_B; + opaque_ignore t402_C; + opaque_ignore t403_A; + opaque_ignore t403_B; + opaque_ignore t404_A; + opaque_ignore t405_A; + opaque_ignore t405_B; + opaque_ignore t405_C; + opaque_ignore t406_A; + opaque_ignore t406_B; + opaque_ignore t406_C; + opaque_ignore t406_D; + opaque_ignore t407_A; + opaque_ignore t407_B; + opaque_ignore t407_C; + opaque_ignore t408_A; + opaque_ignore t408_B; + opaque_ignore t408_C; + opaque_ignore t408_D; + opaque_ignore t408_E; + opaque_ignore t409_A; + opaque_ignore t409_B; + opaque_ignore t410_A; + opaque_ignore t410_B; + opaque_ignore t410_C; + opaque_ignore t411_A; + opaque_ignore t411_B; + opaque_ignore t411_C; + opaque_ignore t411_D; + opaque_ignore t412_A; + opaque_ignore t412_B; + opaque_ignore t412_C; + opaque_ignore t413_A; + opaque_ignore t413_B; + opaque_ignore t414_A; + opaque_ignore t414_B; + opaque_ignore t414_C; + opaque_ignore t415_A; + opaque_ignore t415_B; + opaque_ignore t415_C; + opaque_ignore t415_D; + opaque_ignore t416_A; + opaque_ignore t416_B; + opaque_ignore t417_A; + opaque_ignore t417_B; + opaque_ignore t417_C; + opaque_ignore t418_A; + opaque_ignore t418_B; + opaque_ignore t419_A; + opaque_ignore t420_A; + opaque_ignore t420_B; + opaque_ignore t421_A; + opaque_ignore t421_B; + opaque_ignore t421_C; + opaque_ignore t422_A; + opaque_ignore t422_B; + opaque_ignore t422_C; + opaque_ignore t422_D; + opaque_ignore t423_A; + opaque_ignore t423_B; + opaque_ignore t423_C; + opaque_ignore t424_A; + opaque_ignore t424_B; + opaque_ignore t424_C; + opaque_ignore t424_D; + opaque_ignore t424_E; + opaque_ignore t425_A; + opaque_ignore t425_B; + opaque_ignore t426_A; + opaque_ignore t426_B; + opaque_ignore t426_C; + opaque_ignore t427_A; + opaque_ignore t427_B; + opaque_ignore t427_C; + opaque_ignore t427_D; + opaque_ignore t428_A; + opaque_ignore t428_B; + opaque_ignore t428_C; + opaque_ignore t429_A; + opaque_ignore t429_B; + opaque_ignore t430_A; + opaque_ignore t430_B; + opaque_ignore t430_C; + opaque_ignore t431_A; + opaque_ignore t431_B; + opaque_ignore t431_C; + opaque_ignore t431_D; + opaque_ignore t432_A; + opaque_ignore t432_B; + opaque_ignore t433_A; + opaque_ignore t433_B; + opaque_ignore t433_C; + opaque_ignore t434_A; + opaque_ignore t434_B; + opaque_ignore t435_A; + opaque_ignore t436_A; + opaque_ignore t436_B; + opaque_ignore t436_C; + opaque_ignore t436_D; + opaque_ignore t437_A; + opaque_ignore t437_B; + opaque_ignore t438_A; + opaque_ignore t438_B; + opaque_ignore t438_C; + opaque_ignore t439_A; + opaque_ignore t439_B; + opaque_ignore t439_C; + opaque_ignore t439_D; + opaque_ignore t440_A; + opaque_ignore t440_B; + opaque_ignore t440_C; + opaque_ignore t441_A; + opaque_ignore t441_B; + opaque_ignore t441_C; + opaque_ignore t441_D; + opaque_ignore t441_E; + opaque_ignore t442_A; + opaque_ignore t442_B; + opaque_ignore t443_A; + opaque_ignore t443_B; + opaque_ignore t443_C; + opaque_ignore t444_A; + opaque_ignore t444_B; + opaque_ignore t444_C; + opaque_ignore t444_D; + opaque_ignore t445_A; + opaque_ignore t445_B; + opaque_ignore t445_C; + opaque_ignore t446_A; + opaque_ignore t446_B; + opaque_ignore t447_A; + opaque_ignore t447_B; + opaque_ignore t447_C; + opaque_ignore t448_A; + opaque_ignore t448_B; + opaque_ignore t448_C; + opaque_ignore t448_D; + opaque_ignore t449_A; + opaque_ignore t449_B; + opaque_ignore t450_A; + opaque_ignore t450_B; + opaque_ignore t450_C; + opaque_ignore t451_A; + opaque_ignore t451_B; + opaque_ignore t452_A; + opaque_ignore t453_A; + opaque_ignore t453_B; + opaque_ignore t453_C; + opaque_ignore t453_D; + opaque_ignore t453_E; + opaque_ignore t454_A; + opaque_ignore t454_B; + opaque_ignore t454_C; + opaque_ignore t454_D; + opaque_ignore t455_A; + opaque_ignore t455_B; + opaque_ignore t456_A; + opaque_ignore t456_B; + opaque_ignore t456_C; + opaque_ignore t457_A; + opaque_ignore t457_B; + opaque_ignore t457_C; + opaque_ignore t457_D; + opaque_ignore t458_A; + opaque_ignore t458_B; + opaque_ignore t458_C; + opaque_ignore t459_A; + opaque_ignore t459_B; + opaque_ignore t459_C; + opaque_ignore t459_D; + opaque_ignore t459_E; + opaque_ignore t460_A; + opaque_ignore t460_B; + opaque_ignore t461_A; + opaque_ignore t461_B; + opaque_ignore t461_C; + opaque_ignore t462_A; + opaque_ignore t462_B; + opaque_ignore t462_C; + opaque_ignore t462_D; + opaque_ignore t463_A; + opaque_ignore t463_B; + opaque_ignore t463_C; + opaque_ignore t464_A; + opaque_ignore t464_B; + opaque_ignore t465_A; + opaque_ignore t465_B; + opaque_ignore t465_C; + opaque_ignore t466_A; + opaque_ignore t466_B; + opaque_ignore t466_C; + opaque_ignore t466_D; + opaque_ignore t467_A; + opaque_ignore t467_B; + opaque_ignore t468_A; + opaque_ignore t468_B; + opaque_ignore t468_C; + opaque_ignore t469_A; + opaque_ignore t469_B; + opaque_ignore t470_A; + opaque_ignore t471_A; + opaque_ignore t471_B; + opaque_ignore t471_C; + opaque_ignore t472_A; + opaque_ignore t472_B; + opaque_ignore t472_C; + opaque_ignore t472_D; + opaque_ignore t472_E; + opaque_ignore t473_A; + opaque_ignore t473_B; + opaque_ignore t473_C; + opaque_ignore t473_D; + opaque_ignore t474_A; + opaque_ignore t474_B; + opaque_ignore t475_A; + opaque_ignore t475_B; + opaque_ignore t475_C; + opaque_ignore t476_A; + opaque_ignore t476_B; + opaque_ignore t476_C; + opaque_ignore t476_D; + opaque_ignore t477_A; + opaque_ignore t477_B; + opaque_ignore t477_C; + opaque_ignore t478_A; + opaque_ignore t478_B; + opaque_ignore t478_C; + opaque_ignore t478_D; + opaque_ignore t478_E; + opaque_ignore t479_A; + opaque_ignore t479_B; + opaque_ignore t480_A; + opaque_ignore t480_B; + opaque_ignore t480_C; + opaque_ignore t481_A; + opaque_ignore t481_B; + opaque_ignore t481_C; + opaque_ignore t481_D; + opaque_ignore t482_A; + opaque_ignore t482_B; + opaque_ignore t482_C; + opaque_ignore t483_A; + opaque_ignore t483_B; + opaque_ignore t484_A; + opaque_ignore t484_B; + opaque_ignore t484_C; + opaque_ignore t485_A; + opaque_ignore t485_B; + opaque_ignore t485_C; + opaque_ignore t485_D; + opaque_ignore t486_A; + opaque_ignore t486_B; + opaque_ignore t487_A; + opaque_ignore t487_B; + opaque_ignore t487_C; + opaque_ignore t488_A; + opaque_ignore t488_B; + opaque_ignore t489_A; + opaque_ignore t490_A; + opaque_ignore t490_B; + opaque_ignore t490_C; + opaque_ignore t490_D; + opaque_ignore t491_A; + opaque_ignore t491_B; + opaque_ignore t491_C; + opaque_ignore t492_A; + opaque_ignore t492_B; + opaque_ignore t492_C; + opaque_ignore t492_D; + opaque_ignore t492_E; + opaque_ignore t493_A; + opaque_ignore t493_B; + opaque_ignore t493_C; + opaque_ignore t493_D; + opaque_ignore t494_A; + opaque_ignore t494_B; + opaque_ignore t495_A; + opaque_ignore t495_B; + opaque_ignore t495_C; + opaque_ignore t496_A; + opaque_ignore t496_B; + opaque_ignore t496_C; + opaque_ignore t496_D; + opaque_ignore t497_A; + opaque_ignore t497_B; + opaque_ignore t497_C; + opaque_ignore t498_A; + opaque_ignore t498_B; + opaque_ignore t498_C; + opaque_ignore t498_D; + opaque_ignore t498_E; + opaque_ignore t499_A; + opaque_ignore t499_B; + opaque_ignore t500_A; + opaque_ignore t500_B; + opaque_ignore t500_C; + opaque_ignore t501_A; + opaque_ignore t501_B; + opaque_ignore t501_C; + opaque_ignore t501_D; + opaque_ignore t502_A; + opaque_ignore t502_B; + opaque_ignore t502_C; + opaque_ignore t503_A; + opaque_ignore t503_B; + opaque_ignore t504_A; + opaque_ignore t504_B; + opaque_ignore t504_C; + opaque_ignore t505_A; + opaque_ignore t505_B; + opaque_ignore t505_C; + opaque_ignore t505_D; + opaque_ignore t506_A; + opaque_ignore t506_B; + opaque_ignore t507_A; + opaque_ignore t507_B; + opaque_ignore t507_C; + opaque_ignore t508_A; + opaque_ignore t508_B; + opaque_ignore t509_A; + opaque_ignore t510_A; + opaque_ignore t510_B; + opaque_ignore t510_C; + opaque_ignore t511_A; + opaque_ignore t511_B; + opaque_ignore t511_C; + opaque_ignore t511_D; + opaque_ignore t512_A; + opaque_ignore t512_B; + opaque_ignore t512_C; + opaque_ignore t513_A; + opaque_ignore t513_B; + opaque_ignore t513_C; + opaque_ignore t513_D; + opaque_ignore t513_E; + opaque_ignore t514_A; + opaque_ignore t514_B; + opaque_ignore t514_C; + opaque_ignore t514_D; + opaque_ignore t515_A; + opaque_ignore t515_B; + opaque_ignore t516_A; + opaque_ignore t516_B; + opaque_ignore t516_C; + opaque_ignore t517_A; + opaque_ignore t517_B; + opaque_ignore t517_C; + opaque_ignore t517_D; + opaque_ignore t518_A; + opaque_ignore t518_B; + opaque_ignore t518_C; + opaque_ignore t519_A; + opaque_ignore t519_B; + opaque_ignore t519_C; + opaque_ignore t519_D; + opaque_ignore t519_E; + opaque_ignore t520_A; + opaque_ignore t520_B; + opaque_ignore t521_A; + opaque_ignore t521_B; + opaque_ignore t521_C; + opaque_ignore t522_A; + opaque_ignore t522_B; + opaque_ignore t522_C; + opaque_ignore t522_D; + opaque_ignore t523_A; + opaque_ignore t523_B; + opaque_ignore t523_C; + opaque_ignore t524_A; + opaque_ignore t524_B; + opaque_ignore t525_A; + opaque_ignore t525_B; + opaque_ignore t525_C; + opaque_ignore t526_A; + opaque_ignore t526_B; + opaque_ignore t526_C; + opaque_ignore t526_D; + opaque_ignore t527_A; + opaque_ignore t527_B; + opaque_ignore t528_A; + opaque_ignore t528_B; + opaque_ignore t528_C; + opaque_ignore t529_A; + opaque_ignore t529_B; + opaque_ignore t530_A; + opaque_ignore t531_A; + opaque_ignore t531_B; + opaque_ignore t532_A; + opaque_ignore t532_B; + opaque_ignore t532_C; + opaque_ignore t533_A; + opaque_ignore t533_B; + opaque_ignore t533_C; + opaque_ignore t533_D; + opaque_ignore t534_A; + opaque_ignore t534_B; + opaque_ignore t534_C; + opaque_ignore t535_A; + opaque_ignore t535_B; + opaque_ignore t535_C; + opaque_ignore t535_D; + opaque_ignore t535_E; + opaque_ignore t536_A; + opaque_ignore t536_B; + opaque_ignore t536_C; + opaque_ignore t536_D; + opaque_ignore t537_A; + opaque_ignore t537_B; + opaque_ignore t538_A; + opaque_ignore t538_B; + opaque_ignore t538_C; + opaque_ignore t539_A; + opaque_ignore t539_B; + opaque_ignore t539_C; + opaque_ignore t539_D; + opaque_ignore t540_A; + opaque_ignore t540_B; + opaque_ignore t540_C; + opaque_ignore t541_A; + opaque_ignore t541_B; + opaque_ignore t541_C; + opaque_ignore t541_D; + opaque_ignore t541_E; + opaque_ignore t542_A; + opaque_ignore t542_B; + opaque_ignore t543_A; + opaque_ignore t543_B; + opaque_ignore t543_C; + opaque_ignore t544_A; + opaque_ignore t544_B; + opaque_ignore t544_C; + opaque_ignore t544_D; + opaque_ignore t545_A; + opaque_ignore t545_B; + opaque_ignore t545_C; + opaque_ignore t546_A; + opaque_ignore t546_B; + opaque_ignore t547_A; + opaque_ignore t547_B; + opaque_ignore t547_C; + opaque_ignore t548_A; + opaque_ignore t548_B; + opaque_ignore t548_C; + opaque_ignore t548_D; + opaque_ignore t549_A; + opaque_ignore t549_B; + opaque_ignore t550_A; + opaque_ignore t550_B; + opaque_ignore t550_C; + opaque_ignore t551_A; + opaque_ignore t551_B; + opaque_ignore t552_A; + opaque_ignore t553_A; + opaque_ignore t553_B; + opaque_ignore t553_C; + opaque_ignore t554_A; + opaque_ignore t554_B; + opaque_ignore t555_A; + opaque_ignore t555_B; + opaque_ignore t555_C; + opaque_ignore t556_A; + opaque_ignore t556_B; + opaque_ignore t556_C; + opaque_ignore t556_D; + opaque_ignore t557_A; + opaque_ignore t557_B; + opaque_ignore t557_C; + opaque_ignore t558_A; + opaque_ignore t558_B; + opaque_ignore t558_C; + opaque_ignore t558_D; + opaque_ignore t558_E; + opaque_ignore t559_A; + opaque_ignore t559_B; + opaque_ignore t559_C; + opaque_ignore t559_D; + opaque_ignore t560_A; + opaque_ignore t560_B; + opaque_ignore t561_A; + opaque_ignore t561_B; + opaque_ignore t561_C; + opaque_ignore t562_A; + opaque_ignore t562_B; + opaque_ignore t562_C; + opaque_ignore t562_D; + opaque_ignore t563_A; + opaque_ignore t563_B; + opaque_ignore t563_C; + opaque_ignore t564_A; + opaque_ignore t564_B; + opaque_ignore t564_C; + opaque_ignore t564_D; + opaque_ignore t564_E; + opaque_ignore t565_A; + opaque_ignore t565_B; + opaque_ignore t566_A; + opaque_ignore t566_B; + opaque_ignore t566_C; + opaque_ignore t567_A; + opaque_ignore t567_B; + opaque_ignore t567_C; + opaque_ignore t567_D; + opaque_ignore t568_A; + opaque_ignore t568_B; + opaque_ignore t568_C; + opaque_ignore t569_A; + opaque_ignore t569_B; + opaque_ignore t570_A; + opaque_ignore t570_B; + opaque_ignore t570_C; + opaque_ignore t571_A; + opaque_ignore t571_B; + opaque_ignore t571_C; + opaque_ignore t571_D; + opaque_ignore t572_A; + opaque_ignore t572_B; + opaque_ignore t573_A; + opaque_ignore t573_B; + opaque_ignore t573_C; + opaque_ignore t574_A; + opaque_ignore t574_B; + opaque_ignore t575_A; + opaque_ignore t576_A; + opaque_ignore t576_B; + opaque_ignore t576_C; + opaque_ignore t576_D; + opaque_ignore t577_A; + opaque_ignore t577_B; + opaque_ignore t577_C; + opaque_ignore t578_A; + opaque_ignore t578_B; + opaque_ignore t579_A; + opaque_ignore t579_B; + opaque_ignore t579_C; + opaque_ignore t580_A; + opaque_ignore t580_B; + opaque_ignore t580_C; + opaque_ignore t580_D; + opaque_ignore t581_A; + opaque_ignore t581_B; + opaque_ignore t581_C; + opaque_ignore t582_A; + opaque_ignore t582_B; + opaque_ignore t582_C; + opaque_ignore t582_D; + opaque_ignore t582_E; + opaque_ignore t583_A; + opaque_ignore t583_B; + opaque_ignore t583_C; + opaque_ignore t583_D; + opaque_ignore t584_A; + opaque_ignore t584_B; + opaque_ignore t585_A; + opaque_ignore t585_B; + opaque_ignore t585_C; + opaque_ignore t586_A; + opaque_ignore t586_B; + opaque_ignore t586_C; + opaque_ignore t586_D; + opaque_ignore t587_A; + opaque_ignore t587_B; + opaque_ignore t587_C; + opaque_ignore t588_A; + opaque_ignore t588_B; + opaque_ignore t588_C; + opaque_ignore t588_D; + opaque_ignore t588_E; + opaque_ignore t589_A; + opaque_ignore t589_B; + opaque_ignore t590_A; + opaque_ignore t590_B; + opaque_ignore t590_C; + opaque_ignore t591_A; + opaque_ignore t591_B; + opaque_ignore t591_C; + opaque_ignore t591_D; + opaque_ignore t592_A; + opaque_ignore t592_B; + opaque_ignore t592_C; + opaque_ignore t593_A; + opaque_ignore t593_B; + opaque_ignore t594_A; + opaque_ignore t594_B; + opaque_ignore t594_C; + opaque_ignore t595_A; + opaque_ignore t595_B; + opaque_ignore t595_C; + opaque_ignore t595_D; + opaque_ignore t596_A; + opaque_ignore t596_B; + opaque_ignore t597_A; + opaque_ignore t597_B; + opaque_ignore t597_C; + opaque_ignore t598_A; + opaque_ignore t598_B; + opaque_ignore t599_A; + () +in +print_endline "Testing local allocations"; +go ();; +let () = run ();; diff --git a/testsuite/tests/mixed-blocks/generated_byte_test.reference b/testsuite/tests/mixed-blocks/generated_byte_test.reference new file mode 100644 index 00000000000..7abb513fe98 --- /dev/null +++ b/testsuite/tests/mixed-blocks/generated_byte_test.reference @@ -0,0 +1,46 @@ +Creating values + - Doing GC +Copying values using [with] record update + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] + - Doing GC + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] +Copying values via [Stdlib.Weak] + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] + - Doing GC + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] +Copying values via [Obj.with_tag] + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] + - Doing GC + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] +Testing local allocations + - Doing GC diff --git a/testsuite/tests/mixed-blocks/generated_native_test.ml b/testsuite/tests/mixed-blocks/generated_native_test.ml new file mode 100644 index 00000000000..231a84304b6 --- /dev/null +++ b/testsuite/tests/mixed-blocks/generated_native_test.ml @@ -0,0 +1,3907 @@ +(* TEST + flags = "-extension layouts_beta"; + include stdlib_stable; + include stdlib_upstream_compatible; + flambda2; + native; +*) +(** This is code generated by [generate_mixed_blocks_code.ml]. *) + +(* Helper functions for manipulating the fields of a mixed record *) +let create_string () = String.make (Random.int 100) 'a' +let create_int () = Random.int 0x3FFF_FFFF +let create_float () = Random.float Float.max_float +let create_float32 () = Stdlib_stable.Float32.of_float (Random.float Float.max_float) +let create_float_u () = Stdlib_upstream_compatible.Float_u.of_float (create_float ()) +let create_float32_u () = Stdlib_stable.Float32_u.of_float32 (create_float32 ()) +let create_int32_u () = Stdlib_upstream_compatible.Int32_u.of_int32 (Random.int32 0x7FFF_FFFFl) +let create_int64_u () = Stdlib_upstream_compatible.Int64_u.of_int64 (Random.int64 0x7FFF_FFFF_FFFF_FFFFL) +let create_nativeint_u () = Stdlib_upstream_compatible.Nativeint_u.of_nativeint (Random.nativeint 0x7FFF_FFFF_FFFF_FFFFn) +let check_gen ~equal ~to_string ~message y1 y2 = + if equal y1 y2 then () else + failwith + (Printf.sprintf "%s: %s <> %s" message (to_string y1) (to_string y2)) + +let check_string = check_gen ~equal:String.equal ~to_string:(fun x -> x) +let check_int = check_gen ~equal:Int.equal ~to_string:Int.to_string +let check_float = + check_gen ~equal:Float.equal ~to_string:Float.to_string +let check_float32 = + check_gen ~equal:Stdlib_stable.Float32.equal ~to_string:Stdlib_stable.Float32.to_string +let check_int32 = + check_gen ~equal:Int32.equal ~to_string:Int32.to_string +let check_int64 = + check_gen ~equal:Int64.equal ~to_string:Int64.to_string + +(* Helper functions for testing polymorphic copying. *) + +let copy_via_weak x = + let weak = Weak.create 1 in + Weak.set weak 0 (Some x); + Weak.get_copy weak 0 |> Option.get + +let copy_via_tag x = + let obj = Obj.repr x in + Obj.with_tag (Obj.tag obj) obj |> Obj.obj;; + +(* Helper functions for testing polymorphic operations. *) +let oc = Out_channel.open_bin "/dev/null" +exception Unexpected_success +type forget = T : _ -> forget + +let expect_failure f = + try f (); raise Unexpected_success with + | Unexpected_success -> assert false + | _ -> () + +let hash_expect_failure x = + expect_failure (fun () -> ignore (Hashtbl.hash x : int)) + +let compare_expect_failure x y = + expect_failure (fun () -> ignore (compare (T x) (T y) : int)); + expect_failure (fun () -> ignore ((T x) = (T y) : bool)) + +let compare_expect_success x y = + ignore (compare (T x) (T y) : int); + ignore ((T x) = (T y) : bool) + +let marshal_expect_failure t = + expect_failure (fun () -> output_value oc t) + +let check_reachable_words expected actual message = + if expected <> actual + then failwith (Printf.sprintf "%s: %d <> %d" message expected actual) +;; + +(* Type declarations *) +type t0 = { mutable float0 : float; mutable float_u1 : float# } +type t1 = { float0 : float; mutable float_u1 : float# } +type t2 = { mutable float0 : float; float_u1 : float# } +type t3 = { float0 : float; float_u1 : float# } +type t4 = { mutable float_u0 : float#; mutable float1 : float } +type t5 = { float_u0 : float#; mutable float1 : float } +type t6 = { mutable float_u0 : float#; float1 : float } +type t7 = { float_u0 : float#; float1 : float } +type t8 = { mutable float0 : float; mutable float_u1 : float#; mutable float_u2 : float# } +type t9 = { float0 : float; mutable float_u1 : float#; mutable float_u2 : float# } +type t10 = { mutable float0 : float; float_u1 : float#; mutable float_u2 : float# } +type t11 = { float0 : float; float_u1 : float#; mutable float_u2 : float# } +type t12 = { mutable float_u0 : float#; mutable float1 : float; mutable float_u2 : float# } +type t13 = { float_u0 : float#; mutable float1 : float; mutable float_u2 : float# } +type t14 = { mutable float0 : float; mutable float1 : float; mutable float_u2 : float# } +type t15 = { float0 : float; mutable float1 : float; mutable float_u2 : float# } +type t16 = { mutable float_u0 : float#; float1 : float; mutable float_u2 : float# } +type t17 = { float_u0 : float#; float1 : float; mutable float_u2 : float# } +type t18 = { mutable str0 : string; mutable float_u1 : float# } +type t19 = { str0 : string; mutable float_u1 : float# } +type t20 = { mutable str0 : string; float_u1 : float# } +type t21 = { mutable float32_u0 : float32# } +type t22 = { str0 : string; float_u1 : float# } +type t23 = { mutable str0 : string; mutable float32_u1 : float32# } +type t24 = { float32_u0 : float32# } +type t25 = { str0 : string; mutable float32_u1 : float32# } +type t26 = { mutable str0 : string; float32_u1 : float32# } +type t27 = { mutable i32_0 : int32# } +type t28 = { mutable str0 : string; mutable str1 : string; mutable float_u2 : float# } +type t29 = { mutable float0 : float; mutable float32_u1 : float32# } +type t30 = { str0 : string; float32_u1 : float32# } +type t31 = { mutable str0 : string; mutable i32_1 : int32# } +type t32 = { i32_0 : int32# } +type t33 = { str0 : string; mutable str1 : string; mutable float_u2 : float# } +type t34 = { mutable str0 : string; mutable str1 : string; float_u2 : float# } +type t35 = { float0 : float; mutable float32_u1 : float32# } +type t36 = { mutable float0 : float; float32_u1 : float32# } +type t37 = { str0 : string; mutable i32_1 : int32# } +type t38 = { mutable str0 : string; i32_1 : int32# } +type t39 = { mutable i64_0 : int64# } +type t40 = { mutable float0 : float; mutable str1 : string; mutable float_u2 : float# } +type t41 = { str0 : string; mutable str1 : string; float_u2 : float# } +type t42 = { mutable str0 : string; mutable str1 : string; mutable float32_u2 : float32# } +type t43 = { float0 : float; float32_u1 : float32# } +type t44 = { mutable float0 : float; mutable i32_1 : int32# } +type t45 = { str0 : string; i32_1 : int32# } +type t46 = { mutable str0 : string; mutable i64_1 : int64# } +type t47 = { i64_0 : int64# } +type t48 = { float0 : float; mutable str1 : string; mutable float_u2 : float# } +type t49 = { mutable float0 : float; mutable str1 : string; float_u2 : float# } +type t50 = { str0 : string; mutable str1 : string; mutable float32_u2 : float32# } +type t51 = { mutable str0 : string; mutable str1 : string; float32_u2 : float32# } +type t52 = { float0 : float; mutable i32_1 : int32# } +type t53 = { mutable float0 : float; i32_1 : int32# } +type t54 = { str0 : string; mutable i64_1 : int64# } +type t55 = { mutable str0 : string; i64_1 : int64# } +type t56 = { mutable n0 : nativeint# } +type t57 = { mutable imm0 : int; mutable str1 : string; mutable float_u2 : float# } +type t58 = { float0 : float; mutable str1 : string; float_u2 : float# } +type t59 = { mutable float0 : float; mutable str1 : string; mutable float32_u2 : float32# } +type t60 = { str0 : string; mutable str1 : string; float32_u2 : float32# } +type t61 = { mutable str0 : string; mutable str1 : string; mutable i32_2 : int32# } +type t62 = { float0 : float; i32_1 : int32# } +type t63 = { mutable float0 : float; mutable i64_1 : int64# } +type t64 = { str0 : string; i64_1 : int64# } +type t65 = { mutable str0 : string; mutable n1 : nativeint# } +type t66 = { n0 : nativeint# } +type t67 = { imm0 : int; mutable str1 : string; mutable float_u2 : float# } +type t68 = { mutable imm0 : int; mutable str1 : string; float_u2 : float# } +type t69 = { float0 : float; mutable str1 : string; mutable float32_u2 : float32# } +type t70 = { mutable float0 : float; mutable str1 : string; float32_u2 : float32# } +type t71 = { str0 : string; mutable str1 : string; mutable i32_2 : int32# } +type t72 = { mutable str0 : string; mutable str1 : string; i32_2 : int32# } +type t73 = { float0 : float; mutable i64_1 : int64# } +type t74 = { mutable float0 : float; i64_1 : int64# } +type t75 = + | A of float# +type t76 = + | A of float# + | B of float# +type t77 = + | A of { mutable float_u0 : float# } +type t78 = + | A of float# + | B of float# + | C of float# +type t79 = + | A of { mutable float_u0 : float# } + | B of float# +type t80 = + | A of string * float# +type t81 = + | A of float# + | B of { mutable float_u0 : float# } +type t82 = + | A of { mutable float_u0 : float# } + | B of float# + | C of float# +type t83 = + | A of string * float# + | B of float# +type t84 = + | A of { mutable str0 : string; mutable float_u1 : float# } +type t85 = + | A of float# + | B of float# + | C of float# + | D of float# +type t86 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } +type t87 = + | A of string * float# + | B of float# + | C of float# +type t88 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# +type t89 = + | A of float32# +type t90 = + | A of float# + | B of { mutable float_u0 : float# } + | C of float# +type t91 = + | A of { mutable float_u0 : float# } + | B of float# + | C of float# + | D of float# +type t92 = + | A of string * float# + | B of { mutable float_u0 : float# } +type t93 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# +type t94 = + | A of float32# + | B of float# +type t95 = + | A of { float_u0 : float# } +type t96 = + | A of float# + | B of string * float# +type t97 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t98 = + | A of string * float# + | B of float# + | C of float# + | D of float# +type t99 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } +type t100 = + | A of float32# + | B of float# + | C of float# +type t101 = + | A of { float_u0 : float# } + | B of float# +type t102 = + | A of float * float# +type t103 = + | A of float# + | B of float# + | C of { mutable float_u0 : float# } +type t104 = + | A of { mutable float_u0 : float# } + | B of string * float# +type t105 = + | A of string * float# + | B of { mutable float_u0 : float# } + | C of float# +type t106 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# + | D of float# +type t107 = + | A of float32# + | B of { mutable float_u0 : float# } +type t108 = + | A of { float_u0 : float# } + | B of float# + | C of float# +type t109 = + | A of float * float# + | B of float# +type t110 = + | A of { str0 : string; mutable float_u1 : float# } +type t111 = + | A of float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t112 = + | A of { mutable float_u0 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t113 = + | A of string * float# + | B of string * float# +type t114 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t115 = + | A of float32# + | B of float# + | C of float# + | D of float# +type t116 = + | A of { float_u0 : float# } + | B of { mutable float_u0 : float# } +type t117 = + | A of float * float# + | B of float# + | C of float# +type t118 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# +type t119 = + | A of string * float32# +type t120 = + | A of float# + | B of string * float# + | C of float# +type t121 = + | A of { mutable float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t122 = + | A of string * float# + | B of float# + | C of { mutable float_u0 : float# } +type t123 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of string * float# +type t124 = + | A of float32# + | B of { mutable float_u0 : float# } + | C of float# +type t125 = + | A of { float_u0 : float# } + | B of float# + | C of float# + | D of float# +type t126 = + | A of float * float# + | B of { mutable float_u0 : float# } +type t127 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# +type t128 = + | A of string * float32# + | B of float# +type t129 = + | A of { mutable str0 : string; float_u1 : float# } +type t130 = + | A of float# + | B of { mutable str0 : string; mutable float_u1 : float# } +type t131 = + | A of { mutable float_u0 : float# } + | B of string * float# + | C of float# +type t132 = + | A of string * float# + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t133 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of float# + | C of { mutable float_u0 : float# } +type t134 = + | A of float32# + | B of string * float# +type t135 = + | A of { float_u0 : float# } + | B of { mutable float_u0 : float# } + | C of float# +type t136 = + | A of float * float# + | B of float# + | C of float# + | D of float# +type t137 = + | A of { str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } +type t138 = + | A of string * float32# + | B of float# + | C of float# +type t139 = + | A of { mutable str0 : string; float_u1 : float# } + | B of float# +type t140 = + | A of int32# +type t141 = + | A of float# + | B of float# + | C of float# + | D of float# + | E of float# +type t142 = + | A of { mutable float_u0 : float# } + | B of { mutable str0 : string; mutable float_u1 : float# } +type t143 = + | A of string * float# + | B of string * float# + | C of float# +type t144 = + | A of { mutable str0 : string; mutable float_u1 : float# } + | B of { mutable float_u0 : float# } + | C of float# + | D of float# +type t145 = + | A of float32# + | B of float# + | C of { mutable float_u0 : float# } +type t146 = + | A of { float_u0 : float# } + | B of string * float# +type t147 = + | A of float * float# + | B of { mutable float_u0 : float# } + | C of float# +type t148 = + | A of { str0 : string; mutable float_u1 : float# } + | B of float# + | C of float# + | D of float# +type t149 = + | A of string * float32# + | B of { mutable float_u0 : float# } + +external opaque_ignore : ('a [@local_opt]) -> unit = "%opaque" + +let[@opaque] run () = +(* Let declarations *) +print_endline "Creating values"; +let t0 : t0 = { float0 = create_float (); float_u1 = create_float_u () } in +let t1 : t1 = { float0 = create_float (); float_u1 = create_float_u () } in +let t2 : t2 = { float0 = create_float (); float_u1 = create_float_u () } in +let t3 : t3 = { float0 = create_float (); float_u1 = create_float_u () } in +let t4 : t4 = { float_u0 = create_float_u (); float1 = create_float () } in +let t5 : t5 = { float_u0 = create_float_u (); float1 = create_float () } in +let t6 : t6 = { float_u0 = create_float_u (); float1 = create_float () } in +let t7 : t7 = { float_u0 = create_float_u (); float1 = create_float () } in +let t8 : t8 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t9 : t9 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t10 : t10 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t11 : t11 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in +let t12 : t12 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t13 : t13 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t14 : t14 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t15 : t15 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in +let t16 : t16 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t17 : t17 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in +let t18 : t18 = { str0 = create_string (); float_u1 = create_float_u () } in +let t19 : t19 = { str0 = create_string (); float_u1 = create_float_u () } in +let t20 : t20 = { str0 = create_string (); float_u1 = create_float_u () } in +let t21 : t21 = { float32_u0 = create_float32_u () } in +let t22 : t22 = { str0 = create_string (); float_u1 = create_float_u () } in +let t23 : t23 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t24 : t24 = { float32_u0 = create_float32_u () } in +let t25 : t25 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t26 : t26 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t27 : t27 = { i32_0 = create_int32_u () } in +let t28 : t28 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t29 : t29 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t30 : t30 = { str0 = create_string (); float32_u1 = create_float32_u () } in +let t31 : t31 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t32 : t32 = { i32_0 = create_int32_u () } in +let t33 : t33 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t34 : t34 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t35 : t35 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t36 : t36 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t37 : t37 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t38 : t38 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t39 : t39 = { i64_0 = create_int64_u () } in +let t40 : t40 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t41 : t41 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in +let t42 : t42 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t43 : t43 = { float0 = create_float (); float32_u1 = create_float32_u () } in +let t44 : t44 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t45 : t45 = { str0 = create_string (); i32_1 = create_int32_u () } in +let t46 : t46 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t47 : t47 = { i64_0 = create_int64_u () } in +let t48 : t48 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t49 : t49 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t50 : t50 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t51 : t51 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t52 : t52 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t53 : t53 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t54 : t54 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t55 : t55 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t56 : t56 = { n0 = create_nativeint_u () } in +let t57 : t57 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t58 : t58 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in +let t59 : t59 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t60 : t60 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t61 : t61 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t62 : t62 = { float0 = create_float (); i32_1 = create_int32_u () } in +let t63 : t63 = { float0 = create_float (); i64_1 = create_int64_u () } in +let t64 : t64 = { str0 = create_string (); i64_1 = create_int64_u () } in +let t65 : t65 = { str0 = create_string (); n1 = create_nativeint_u () } in +let t66 : t66 = { n0 = create_nativeint_u () } in +let t67 : t67 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t68 : t68 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in +let t69 : t69 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t70 : t70 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in +let t71 : t71 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t72 : t72 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in +let t73 : t73 = { float0 = create_float (); i64_1 = create_int64_u () } in +let t74 : t74 = { float0 = create_float (); i64_1 = create_int64_u () } in +let t75_A : t75 = (A (create_float_u ())) in +let t76_A : t76 = (A (create_float_u ())) in +let t76_B : t76 = (B (create_float_u ())) in +let t77_A : t77 = (A { float_u0 = create_float_u () }) in +let t78_A : t78 = (A (create_float_u ())) in +let t78_B : t78 = (B (create_float_u ())) in +let t78_C : t78 = (C (create_float_u ())) in +let t79_A : t79 = (A { float_u0 = create_float_u () }) in +let t79_B : t79 = (B (create_float_u ())) in +let t80_A : t80 = (A (create_string (), create_float_u ())) in +let t81_A : t81 = (A (create_float_u ())) in +let t81_B : t81 = (B { float_u0 = create_float_u () }) in +let t82_A : t82 = (A { float_u0 = create_float_u () }) in +let t82_B : t82 = (B (create_float_u ())) in +let t82_C : t82 = (C (create_float_u ())) in +let t83_A : t83 = (A (create_string (), create_float_u ())) in +let t83_B : t83 = (B (create_float_u ())) in +let t84_A : t84 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t85_A : t85 = (A (create_float_u ())) in +let t85_B : t85 = (B (create_float_u ())) in +let t85_C : t85 = (C (create_float_u ())) in +let t85_D : t85 = (D (create_float_u ())) in +let t86_A : t86 = (A { float_u0 = create_float_u () }) in +let t86_B : t86 = (B { float_u0 = create_float_u () }) in +let t87_A : t87 = (A (create_string (), create_float_u ())) in +let t87_B : t87 = (B (create_float_u ())) in +let t87_C : t87 = (C (create_float_u ())) in +let t88_A : t88 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t88_B : t88 = (B (create_float_u ())) in +let t89_A : t89 = (A (create_float32_u ())) in +let t90_A : t90 = (A (create_float_u ())) in +let t90_B : t90 = (B { float_u0 = create_float_u () }) in +let t90_C : t90 = (C (create_float_u ())) in +let t91_A : t91 = (A { float_u0 = create_float_u () }) in +let t91_B : t91 = (B (create_float_u ())) in +let t91_C : t91 = (C (create_float_u ())) in +let t91_D : t91 = (D (create_float_u ())) in +let t92_A : t92 = (A (create_string (), create_float_u ())) in +let t92_B : t92 = (B { float_u0 = create_float_u () }) in +let t93_A : t93 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t93_B : t93 = (B (create_float_u ())) in +let t93_C : t93 = (C (create_float_u ())) in +let t94_A : t94 = (A (create_float32_u ())) in +let t94_B : t94 = (B (create_float_u ())) in +let t95_A : t95 = (A { float_u0 = create_float_u () }) in +let t96_A : t96 = (A (create_float_u ())) in +let t96_B : t96 = (B (create_string (), create_float_u ())) in +let t97_A : t97 = (A { float_u0 = create_float_u () }) in +let t97_B : t97 = (B { float_u0 = create_float_u () }) in +let t97_C : t97 = (C (create_float_u ())) in +let t98_A : t98 = (A (create_string (), create_float_u ())) in +let t98_B : t98 = (B (create_float_u ())) in +let t98_C : t98 = (C (create_float_u ())) in +let t98_D : t98 = (D (create_float_u ())) in +let t99_A : t99 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t99_B : t99 = (B { float_u0 = create_float_u () }) in +let t100_A : t100 = (A (create_float32_u ())) in +let t100_B : t100 = (B (create_float_u ())) in +let t100_C : t100 = (C (create_float_u ())) in +let t101_A : t101 = (A { float_u0 = create_float_u () }) in +let t101_B : t101 = (B (create_float_u ())) in +let t102_A : t102 = (A (create_float (), create_float_u ())) in +let t103_A : t103 = (A (create_float_u ())) in +let t103_B : t103 = (B (create_float_u ())) in +let t103_C : t103 = (C { float_u0 = create_float_u () }) in +let t104_A : t104 = (A { float_u0 = create_float_u () }) in +let t104_B : t104 = (B (create_string (), create_float_u ())) in +let t105_A : t105 = (A (create_string (), create_float_u ())) in +let t105_B : t105 = (B { float_u0 = create_float_u () }) in +let t105_C : t105 = (C (create_float_u ())) in +let t106_A : t106 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t106_B : t106 = (B (create_float_u ())) in +let t106_C : t106 = (C (create_float_u ())) in +let t106_D : t106 = (D (create_float_u ())) in +let t107_A : t107 = (A (create_float32_u ())) in +let t107_B : t107 = (B { float_u0 = create_float_u () }) in +let t108_A : t108 = (A { float_u0 = create_float_u () }) in +let t108_B : t108 = (B (create_float_u ())) in +let t108_C : t108 = (C (create_float_u ())) in +let t109_A : t109 = (A (create_float (), create_float_u ())) in +let t109_B : t109 = (B (create_float_u ())) in +let t110_A : t110 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t111_A : t111 = (A (create_float_u ())) in +let t111_B : t111 = (B { float_u0 = create_float_u () }) in +let t111_C : t111 = (C (create_float_u ())) in +let t111_D : t111 = (D (create_float_u ())) in +let t112_A : t112 = (A { float_u0 = create_float_u () }) in +let t112_B : t112 = (B (create_float_u ())) in +let t112_C : t112 = (C { float_u0 = create_float_u () }) in +let t113_A : t113 = (A (create_string (), create_float_u ())) in +let t113_B : t113 = (B (create_string (), create_float_u ())) in +let t114_A : t114 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t114_B : t114 = (B { float_u0 = create_float_u () }) in +let t114_C : t114 = (C (create_float_u ())) in +let t115_A : t115 = (A (create_float32_u ())) in +let t115_B : t115 = (B (create_float_u ())) in +let t115_C : t115 = (C (create_float_u ())) in +let t115_D : t115 = (D (create_float_u ())) in +let t116_A : t116 = (A { float_u0 = create_float_u () }) in +let t116_B : t116 = (B { float_u0 = create_float_u () }) in +let t117_A : t117 = (A (create_float (), create_float_u ())) in +let t117_B : t117 = (B (create_float_u ())) in +let t117_C : t117 = (C (create_float_u ())) in +let t118_A : t118 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t118_B : t118 = (B (create_float_u ())) in +let t119_A : t119 = (A (create_string (), create_float32_u ())) in +let t120_A : t120 = (A (create_float_u ())) in +let t120_B : t120 = (B (create_string (), create_float_u ())) in +let t120_C : t120 = (C (create_float_u ())) in +let t121_A : t121 = (A { float_u0 = create_float_u () }) in +let t121_B : t121 = (B { float_u0 = create_float_u () }) in +let t121_C : t121 = (C (create_float_u ())) in +let t121_D : t121 = (D (create_float_u ())) in +let t122_A : t122 = (A (create_string (), create_float_u ())) in +let t122_B : t122 = (B (create_float_u ())) in +let t122_C : t122 = (C { float_u0 = create_float_u () }) in +let t123_A : t123 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t123_B : t123 = (B (create_string (), create_float_u ())) in +let t124_A : t124 = (A (create_float32_u ())) in +let t124_B : t124 = (B { float_u0 = create_float_u () }) in +let t124_C : t124 = (C (create_float_u ())) in +let t125_A : t125 = (A { float_u0 = create_float_u () }) in +let t125_B : t125 = (B (create_float_u ())) in +let t125_C : t125 = (C (create_float_u ())) in +let t125_D : t125 = (D (create_float_u ())) in +let t126_A : t126 = (A (create_float (), create_float_u ())) in +let t126_B : t126 = (B { float_u0 = create_float_u () }) in +let t127_A : t127 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t127_B : t127 = (B (create_float_u ())) in +let t127_C : t127 = (C (create_float_u ())) in +let t128_A : t128 = (A (create_string (), create_float32_u ())) in +let t128_B : t128 = (B (create_float_u ())) in +let t129_A : t129 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t130_A : t130 = (A (create_float_u ())) in +let t130_B : t130 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t131_A : t131 = (A { float_u0 = create_float_u () }) in +let t131_B : t131 = (B (create_string (), create_float_u ())) in +let t131_C : t131 = (C (create_float_u ())) in +let t132_A : t132 = (A (create_string (), create_float_u ())) in +let t132_B : t132 = (B { float_u0 = create_float_u () }) in +let t132_C : t132 = (C (create_float_u ())) in +let t132_D : t132 = (D (create_float_u ())) in +let t133_A : t133 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t133_B : t133 = (B (create_float_u ())) in +let t133_C : t133 = (C { float_u0 = create_float_u () }) in +let t134_A : t134 = (A (create_float32_u ())) in +let t134_B : t134 = (B (create_string (), create_float_u ())) in +let t135_A : t135 = (A { float_u0 = create_float_u () }) in +let t135_B : t135 = (B { float_u0 = create_float_u () }) in +let t135_C : t135 = (C (create_float_u ())) in +let t136_A : t136 = (A (create_float (), create_float_u ())) in +let t136_B : t136 = (B (create_float_u ())) in +let t136_C : t136 = (C (create_float_u ())) in +let t136_D : t136 = (D (create_float_u ())) in +let t137_A : t137 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t137_B : t137 = (B { float_u0 = create_float_u () }) in +let t138_A : t138 = (A (create_string (), create_float32_u ())) in +let t138_B : t138 = (B (create_float_u ())) in +let t138_C : t138 = (C (create_float_u ())) in +let t139_A : t139 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t139_B : t139 = (B (create_float_u ())) in +let t140_A : t140 = (A (create_int32_u ())) in +let t141_A : t141 = (A (create_float_u ())) in +let t141_B : t141 = (B (create_float_u ())) in +let t141_C : t141 = (C (create_float_u ())) in +let t141_D : t141 = (D (create_float_u ())) in +let t141_E : t141 = (E (create_float_u ())) in +let t142_A : t142 = (A { float_u0 = create_float_u () }) in +let t142_B : t142 = (B { str0 = create_string (); float_u1 = create_float_u () }) in +let t143_A : t143 = (A (create_string (), create_float_u ())) in +let t143_B : t143 = (B (create_string (), create_float_u ())) in +let t143_C : t143 = (C (create_float_u ())) in +let t144_A : t144 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t144_B : t144 = (B { float_u0 = create_float_u () }) in +let t144_C : t144 = (C (create_float_u ())) in +let t144_D : t144 = (D (create_float_u ())) in +let t145_A : t145 = (A (create_float32_u ())) in +let t145_B : t145 = (B (create_float_u ())) in +let t145_C : t145 = (C { float_u0 = create_float_u () }) in +let t146_A : t146 = (A { float_u0 = create_float_u () }) in +let t146_B : t146 = (B (create_string (), create_float_u ())) in +let t147_A : t147 = (A (create_float (), create_float_u ())) in +let t147_B : t147 = (B { float_u0 = create_float_u () }) in +let t147_C : t147 = (C (create_float_u ())) in +let t148_A : t148 = (A { str0 = create_string (); float_u1 = create_float_u () }) in +let t148_B : t148 = (B (create_float_u ())) in +let t148_C : t148 = (C (create_float_u ())) in +let t148_D : t148 = (D (create_float_u ())) in +let t149_A : t149 = (A (create_string (), create_float32_u ())) in +let t149_B : t149 = (B { float_u0 = create_float_u () }) in +print_endline " - Doing GC"; +Gc.full_major (); + +(* Copies *) +print_endline "Copying values using [with] record update"; +let t_orig0 = { t0 with float0 = t0.float0 } in +let t_orig1 = { t1 with float0 = t1.float0 } in +let t_orig2 = { t2 with float0 = t2.float0 } in +let t_orig3 = { t3 with float0 = t3.float0 } in +let t_orig4 = { t4 with float_u0 = t4.float_u0 } in +let t_orig5 = { t5 with float_u0 = t5.float_u0 } in +let t_orig6 = { t6 with float_u0 = t6.float_u0 } in +let t_orig7 = { t7 with float_u0 = t7.float_u0 } in +let t_orig8 = { t8 with float0 = t8.float0 } in +let t_orig9 = { t9 with float0 = t9.float0 } in +let t_orig10 = { t10 with float0 = t10.float0 } in +let t_orig11 = { t11 with float0 = t11.float0 } in +let t_orig12 = { t12 with float_u0 = t12.float_u0 } in +let t_orig13 = { t13 with float_u0 = t13.float_u0 } in +let t_orig14 = { t14 with float0 = t14.float0 } in +let t_orig15 = { t15 with float0 = t15.float0 } in +let t_orig16 = { t16 with float_u0 = t16.float_u0 } in +let t_orig17 = { t17 with float_u0 = t17.float_u0 } in +let t_orig18 = { t18 with str0 = t18.str0 } in +let t_orig19 = { t19 with str0 = t19.str0 } in +let t_orig20 = { t20 with str0 = t20.str0 } in +let t_orig21 = { float32_u0 = t21.float32_u0 } in +let t_orig22 = { t22 with str0 = t22.str0 } in +let t_orig23 = { t23 with str0 = t23.str0 } in +let t_orig24 = { float32_u0 = t24.float32_u0 } in +let t_orig25 = { t25 with str0 = t25.str0 } in +let t_orig26 = { t26 with str0 = t26.str0 } in +let t_orig27 = { i32_0 = t27.i32_0 } in +let t_orig28 = { t28 with str0 = t28.str0 } in +let t_orig29 = { t29 with float0 = t29.float0 } in +let t_orig30 = { t30 with str0 = t30.str0 } in +let t_orig31 = { t31 with str0 = t31.str0 } in +let t_orig32 = { i32_0 = t32.i32_0 } in +let t_orig33 = { t33 with str0 = t33.str0 } in +let t_orig34 = { t34 with str0 = t34.str0 } in +let t_orig35 = { t35 with float0 = t35.float0 } in +let t_orig36 = { t36 with float0 = t36.float0 } in +let t_orig37 = { t37 with str0 = t37.str0 } in +let t_orig38 = { t38 with str0 = t38.str0 } in +let t_orig39 = { i64_0 = t39.i64_0 } in +let t_orig40 = { t40 with float0 = t40.float0 } in +let t_orig41 = { t41 with str0 = t41.str0 } in +let t_orig42 = { t42 with str0 = t42.str0 } in +let t_orig43 = { t43 with float0 = t43.float0 } in +let t_orig44 = { t44 with float0 = t44.float0 } in +let t_orig45 = { t45 with str0 = t45.str0 } in +let t_orig46 = { t46 with str0 = t46.str0 } in +let t_orig47 = { i64_0 = t47.i64_0 } in +let t_orig48 = { t48 with float0 = t48.float0 } in +let t_orig49 = { t49 with float0 = t49.float0 } in +let t_orig50 = { t50 with str0 = t50.str0 } in +let t_orig51 = { t51 with str0 = t51.str0 } in +let t_orig52 = { t52 with float0 = t52.float0 } in +let t_orig53 = { t53 with float0 = t53.float0 } in +let t_orig54 = { t54 with str0 = t54.str0 } in +let t_orig55 = { t55 with str0 = t55.str0 } in +let t_orig56 = { n0 = t56.n0 } in +let t_orig57 = { t57 with imm0 = t57.imm0 } in +let t_orig58 = { t58 with float0 = t58.float0 } in +let t_orig59 = { t59 with float0 = t59.float0 } in +let t_orig60 = { t60 with str0 = t60.str0 } in +let t_orig61 = { t61 with str0 = t61.str0 } in +let t_orig62 = { t62 with float0 = t62.float0 } in +let t_orig63 = { t63 with float0 = t63.float0 } in +let t_orig64 = { t64 with str0 = t64.str0 } in +let t_orig65 = { t65 with str0 = t65.str0 } in +let t_orig66 = { n0 = t66.n0 } in +let t_orig67 = { t67 with imm0 = t67.imm0 } in +let t_orig68 = { t68 with imm0 = t68.imm0 } in +let t_orig69 = { t69 with float0 = t69.float0 } in +let t_orig70 = { t70 with float0 = t70.float0 } in +let t_orig71 = { t71 with str0 = t71.str0 } in +let t_orig72 = { t72 with str0 = t72.str0 } in +let t_orig73 = { t73 with float0 = t73.float0 } in +let t_orig74 = { t74 with float0 = t74.float0 } in +let t_orig75_A = t75_A in +let t_orig76_A = t76_A in +let t_orig76_B = t76_B in +let t_orig77_A = t77_A in +let t_orig78_A = t78_A in +let t_orig78_B = t78_B in +let t_orig78_C = t78_C in +let t_orig79_A = t79_A in +let t_orig79_B = t79_B in +let t_orig80_A = t80_A in +let t_orig81_A = t81_A in +let t_orig81_B = t81_B in +let t_orig82_A = t82_A in +let t_orig82_B = t82_B in +let t_orig82_C = t82_C in +let t_orig83_A = t83_A in +let t_orig83_B = t83_B in +let t_orig84_A = t84_A in +let t_orig85_A = t85_A in +let t_orig85_B = t85_B in +let t_orig85_C = t85_C in +let t_orig85_D = t85_D in +let t_orig86_A = t86_A in +let t_orig86_B = t86_B in +let t_orig87_A = t87_A in +let t_orig87_B = t87_B in +let t_orig87_C = t87_C in +let t_orig88_A = t88_A in +let t_orig88_B = t88_B in +let t_orig89_A = t89_A in +let t_orig90_A = t90_A in +let t_orig90_B = t90_B in +let t_orig90_C = t90_C in +let t_orig91_A = t91_A in +let t_orig91_B = t91_B in +let t_orig91_C = t91_C in +let t_orig91_D = t91_D in +let t_orig92_A = t92_A in +let t_orig92_B = t92_B in +let t_orig93_A = t93_A in +let t_orig93_B = t93_B in +let t_orig93_C = t93_C in +let t_orig94_A = t94_A in +let t_orig94_B = t94_B in +let t_orig95_A = t95_A in +let t_orig96_A = t96_A in +let t_orig96_B = t96_B in +let t_orig97_A = t97_A in +let t_orig97_B = t97_B in +let t_orig97_C = t97_C in +let t_orig98_A = t98_A in +let t_orig98_B = t98_B in +let t_orig98_C = t98_C in +let t_orig98_D = t98_D in +let t_orig99_A = t99_A in +let t_orig99_B = t99_B in +let t_orig100_A = t100_A in +let t_orig100_B = t100_B in +let t_orig100_C = t100_C in +let t_orig101_A = t101_A in +let t_orig101_B = t101_B in +let t_orig102_A = t102_A in +let t_orig103_A = t103_A in +let t_orig103_B = t103_B in +let t_orig103_C = t103_C in +let t_orig104_A = t104_A in +let t_orig104_B = t104_B in +let t_orig105_A = t105_A in +let t_orig105_B = t105_B in +let t_orig105_C = t105_C in +let t_orig106_A = t106_A in +let t_orig106_B = t106_B in +let t_orig106_C = t106_C in +let t_orig106_D = t106_D in +let t_orig107_A = t107_A in +let t_orig107_B = t107_B in +let t_orig108_A = t108_A in +let t_orig108_B = t108_B in +let t_orig108_C = t108_C in +let t_orig109_A = t109_A in +let t_orig109_B = t109_B in +let t_orig110_A = t110_A in +let t_orig111_A = t111_A in +let t_orig111_B = t111_B in +let t_orig111_C = t111_C in +let t_orig111_D = t111_D in +let t_orig112_A = t112_A in +let t_orig112_B = t112_B in +let t_orig112_C = t112_C in +let t_orig113_A = t113_A in +let t_orig113_B = t113_B in +let t_orig114_A = t114_A in +let t_orig114_B = t114_B in +let t_orig114_C = t114_C in +let t_orig115_A = t115_A in +let t_orig115_B = t115_B in +let t_orig115_C = t115_C in +let t_orig115_D = t115_D in +let t_orig116_A = t116_A in +let t_orig116_B = t116_B in +let t_orig117_A = t117_A in +let t_orig117_B = t117_B in +let t_orig117_C = t117_C in +let t_orig118_A = t118_A in +let t_orig118_B = t118_B in +let t_orig119_A = t119_A in +let t_orig120_A = t120_A in +let t_orig120_B = t120_B in +let t_orig120_C = t120_C in +let t_orig121_A = t121_A in +let t_orig121_B = t121_B in +let t_orig121_C = t121_C in +let t_orig121_D = t121_D in +let t_orig122_A = t122_A in +let t_orig122_B = t122_B in +let t_orig122_C = t122_C in +let t_orig123_A = t123_A in +let t_orig123_B = t123_B in +let t_orig124_A = t124_A in +let t_orig124_B = t124_B in +let t_orig124_C = t124_C in +let t_orig125_A = t125_A in +let t_orig125_B = t125_B in +let t_orig125_C = t125_C in +let t_orig125_D = t125_D in +let t_orig126_A = t126_A in +let t_orig126_B = t126_B in +let t_orig127_A = t127_A in +let t_orig127_B = t127_B in +let t_orig127_C = t127_C in +let t_orig128_A = t128_A in +let t_orig128_B = t128_B in +let t_orig129_A = t129_A in +let t_orig130_A = t130_A in +let t_orig130_B = t130_B in +let t_orig131_A = t131_A in +let t_orig131_B = t131_B in +let t_orig131_C = t131_C in +let t_orig132_A = t132_A in +let t_orig132_B = t132_B in +let t_orig132_C = t132_C in +let t_orig132_D = t132_D in +let t_orig133_A = t133_A in +let t_orig133_B = t133_B in +let t_orig133_C = t133_C in +let t_orig134_A = t134_A in +let t_orig134_B = t134_B in +let t_orig135_A = t135_A in +let t_orig135_B = t135_B in +let t_orig135_C = t135_C in +let t_orig136_A = t136_A in +let t_orig136_B = t136_B in +let t_orig136_C = t136_C in +let t_orig136_D = t136_D in +let t_orig137_A = t137_A in +let t_orig137_B = t137_B in +let t_orig138_A = t138_A in +let t_orig138_B = t138_B in +let t_orig138_C = t138_C in +let t_orig139_A = t139_A in +let t_orig139_B = t139_B in +let t_orig140_A = t140_A in +let t_orig141_A = t141_A in +let t_orig141_B = t141_B in +let t_orig141_C = t141_C in +let t_orig141_D = t141_D in +let t_orig141_E = t141_E in +let t_orig142_A = t142_A in +let t_orig142_B = t142_B in +let t_orig143_A = t143_A in +let t_orig143_B = t143_B in +let t_orig143_C = t143_C in +let t_orig144_A = t144_A in +let t_orig144_B = t144_B in +let t_orig144_C = t144_C in +let t_orig144_D = t144_D in +let t_orig145_A = t145_A in +let t_orig145_B = t145_B in +let t_orig145_C = t145_C in +let t_orig146_A = t146_A in +let t_orig146_B = t146_B in +let t_orig147_A = t147_A in +let t_orig147_B = t147_B in +let t_orig147_C = t147_C in +let t_orig148_A = t148_A in +let t_orig148_B = t148_B in +let t_orig148_C = t148_C in +let t_orig148_D = t148_D in +let t_orig149_A = t149_A in +let t_orig149_B = t149_B in + +(* Checks *) + let run_checks (t0 : t0) (t1 : t1) (t2 : t2) (t3 : t3) (t4 : t4) (t5 : t5) (t6 : t6) (t7 : t7) (t8 : t8) (t9 : t9) (t10 : t10) (t11 : t11) (t12 : t12) (t13 : t13) (t14 : t14) (t15 : t15) (t16 : t16) (t17 : t17) (t18 : t18) (t19 : t19) (t20 : t20) (t21 : t21) (t22 : t22) (t23 : t23) (t24 : t24) (t25 : t25) (t26 : t26) (t27 : t27) (t28 : t28) (t29 : t29) (t30 : t30) (t31 : t31) (t32 : t32) (t33 : t33) (t34 : t34) (t35 : t35) (t36 : t36) (t37 : t37) (t38 : t38) (t39 : t39) (t40 : t40) (t41 : t41) (t42 : t42) (t43 : t43) (t44 : t44) (t45 : t45) (t46 : t46) (t47 : t47) (t48 : t48) (t49 : t49) (t50 : t50) (t51 : t51) (t52 : t52) (t53 : t53) (t54 : t54) (t55 : t55) (t56 : t56) (t57 : t57) (t58 : t58) (t59 : t59) (t60 : t60) (t61 : t61) (t62 : t62) (t63 : t63) (t64 : t64) (t65 : t65) (t66 : t66) (t67 : t67) (t68 : t68) (t69 : t69) (t70 : t70) (t71 : t71) (t72 : t72) (t73 : t73) (t74 : t74) (t75_A : t75) (t76_A : t76) (t76_B : t76) (t77_A : t77) (t78_A : t78) (t78_B : t78) (t78_C : t78) (t79_A : t79) (t79_B : t79) (t80_A : t80) (t81_A : t81) (t81_B : t81) (t82_A : t82) (t82_B : t82) (t82_C : t82) (t83_A : t83) (t83_B : t83) (t84_A : t84) (t85_A : t85) (t85_B : t85) (t85_C : t85) (t85_D : t85) (t86_A : t86) (t86_B : t86) (t87_A : t87) (t87_B : t87) (t87_C : t87) (t88_A : t88) (t88_B : t88) (t89_A : t89) (t90_A : t90) (t90_B : t90) (t90_C : t90) (t91_A : t91) (t91_B : t91) (t91_C : t91) (t91_D : t91) (t92_A : t92) (t92_B : t92) (t93_A : t93) (t93_B : t93) (t93_C : t93) (t94_A : t94) (t94_B : t94) (t95_A : t95) (t96_A : t96) (t96_B : t96) (t97_A : t97) (t97_B : t97) (t97_C : t97) (t98_A : t98) (t98_B : t98) (t98_C : t98) (t98_D : t98) (t99_A : t99) (t99_B : t99) (t100_A : t100) (t100_B : t100) (t100_C : t100) (t101_A : t101) (t101_B : t101) (t102_A : t102) (t103_A : t103) (t103_B : t103) (t103_C : t103) (t104_A : t104) (t104_B : t104) (t105_A : t105) (t105_B : t105) (t105_C : t105) (t106_A : t106) (t106_B : t106) (t106_C : t106) (t106_D : t106) (t107_A : t107) (t107_B : t107) (t108_A : t108) (t108_B : t108) (t108_C : t108) (t109_A : t109) (t109_B : t109) (t110_A : t110) (t111_A : t111) (t111_B : t111) (t111_C : t111) (t111_D : t111) (t112_A : t112) (t112_B : t112) (t112_C : t112) (t113_A : t113) (t113_B : t113) (t114_A : t114) (t114_B : t114) (t114_C : t114) (t115_A : t115) (t115_B : t115) (t115_C : t115) (t115_D : t115) (t116_A : t116) (t116_B : t116) (t117_A : t117) (t117_B : t117) (t117_C : t117) (t118_A : t118) (t118_B : t118) (t119_A : t119) (t120_A : t120) (t120_B : t120) (t120_C : t120) (t121_A : t121) (t121_B : t121) (t121_C : t121) (t121_D : t121) (t122_A : t122) (t122_B : t122) (t122_C : t122) (t123_A : t123) (t123_B : t123) (t124_A : t124) (t124_B : t124) (t124_C : t124) (t125_A : t125) (t125_B : t125) (t125_C : t125) (t125_D : t125) (t126_A : t126) (t126_B : t126) (t127_A : t127) (t127_B : t127) (t127_C : t127) (t128_A : t128) (t128_B : t128) (t129_A : t129) (t130_A : t130) (t130_B : t130) (t131_A : t131) (t131_B : t131) (t131_C : t131) (t132_A : t132) (t132_B : t132) (t132_C : t132) (t132_D : t132) (t133_A : t133) (t133_B : t133) (t133_C : t133) (t134_A : t134) (t134_B : t134) (t135_A : t135) (t135_B : t135) (t135_C : t135) (t136_A : t136) (t136_B : t136) (t136_C : t136) (t136_D : t136) (t137_A : t137) (t137_B : t137) (t138_A : t138) (t138_B : t138) (t138_C : t138) (t139_A : t139) (t139_B : t139) (t140_A : t140) (t141_A : t141) (t141_B : t141) (t141_C : t141) (t141_D : t141) (t141_E : t141) (t142_A : t142) (t142_B : t142) (t143_A : t143) (t143_B : t143) (t143_C : t143) (t144_A : t144) (t144_B : t144) (t144_C : t144) (t144_D : t144) (t145_A : t145) (t145_B : t145) (t145_C : t145) (t146_A : t146) (t146_B : t146) (t147_A : t147) (t147_B : t147) (t147_C : t147) (t148_A : t148) (t148_B : t148) (t148_C : t148) (t148_D : t148) (t149_A : t149) (t149_B : t149) = + print_endline " - Marshaling"; + marshal_expect_failure t0; + marshal_expect_failure t1; + marshal_expect_failure t2; + marshal_expect_failure t3; + marshal_expect_failure t4; + marshal_expect_failure t5; + marshal_expect_failure t6; + marshal_expect_failure t7; + marshal_expect_failure t8; + marshal_expect_failure t9; + marshal_expect_failure t10; + marshal_expect_failure t11; + marshal_expect_failure t12; + marshal_expect_failure t13; + marshal_expect_failure t14; + marshal_expect_failure t15; + marshal_expect_failure t16; + marshal_expect_failure t17; + marshal_expect_failure t18; + marshal_expect_failure t19; + marshal_expect_failure t20; + marshal_expect_failure t21; + marshal_expect_failure t22; + marshal_expect_failure t23; + marshal_expect_failure t24; + marshal_expect_failure t25; + marshal_expect_failure t26; + marshal_expect_failure t27; + marshal_expect_failure t28; + marshal_expect_failure t29; + marshal_expect_failure t30; + marshal_expect_failure t31; + marshal_expect_failure t32; + marshal_expect_failure t33; + marshal_expect_failure t34; + marshal_expect_failure t35; + marshal_expect_failure t36; + marshal_expect_failure t37; + marshal_expect_failure t38; + marshal_expect_failure t39; + marshal_expect_failure t40; + marshal_expect_failure t41; + marshal_expect_failure t42; + marshal_expect_failure t43; + marshal_expect_failure t44; + marshal_expect_failure t45; + marshal_expect_failure t46; + marshal_expect_failure t47; + marshal_expect_failure t48; + marshal_expect_failure t49; + marshal_expect_failure t50; + marshal_expect_failure t51; + marshal_expect_failure t52; + marshal_expect_failure t53; + marshal_expect_failure t54; + marshal_expect_failure t55; + marshal_expect_failure t56; + marshal_expect_failure t57; + marshal_expect_failure t58; + marshal_expect_failure t59; + marshal_expect_failure t60; + marshal_expect_failure t61; + marshal_expect_failure t62; + marshal_expect_failure t63; + marshal_expect_failure t64; + marshal_expect_failure t65; + marshal_expect_failure t66; + marshal_expect_failure t67; + marshal_expect_failure t68; + marshal_expect_failure t69; + marshal_expect_failure t70; + marshal_expect_failure t71; + marshal_expect_failure t72; + marshal_expect_failure t73; + marshal_expect_failure t74; + marshal_expect_failure t75_A; + marshal_expect_failure t76_A; + marshal_expect_failure t76_B; + marshal_expect_failure t77_A; + marshal_expect_failure t78_A; + marshal_expect_failure t78_B; + marshal_expect_failure t78_C; + marshal_expect_failure t79_A; + marshal_expect_failure t79_B; + marshal_expect_failure t80_A; + marshal_expect_failure t81_A; + marshal_expect_failure t81_B; + marshal_expect_failure t82_A; + marshal_expect_failure t82_B; + marshal_expect_failure t82_C; + marshal_expect_failure t83_A; + marshal_expect_failure t83_B; + marshal_expect_failure t84_A; + marshal_expect_failure t85_A; + marshal_expect_failure t85_B; + marshal_expect_failure t85_C; + marshal_expect_failure t85_D; + marshal_expect_failure t86_A; + marshal_expect_failure t86_B; + marshal_expect_failure t87_A; + marshal_expect_failure t87_B; + marshal_expect_failure t87_C; + marshal_expect_failure t88_A; + marshal_expect_failure t88_B; + marshal_expect_failure t89_A; + marshal_expect_failure t90_A; + marshal_expect_failure t90_B; + marshal_expect_failure t90_C; + marshal_expect_failure t91_A; + marshal_expect_failure t91_B; + marshal_expect_failure t91_C; + marshal_expect_failure t91_D; + marshal_expect_failure t92_A; + marshal_expect_failure t92_B; + marshal_expect_failure t93_A; + marshal_expect_failure t93_B; + marshal_expect_failure t93_C; + marshal_expect_failure t94_A; + marshal_expect_failure t94_B; + marshal_expect_failure t95_A; + marshal_expect_failure t96_A; + marshal_expect_failure t96_B; + marshal_expect_failure t97_A; + marshal_expect_failure t97_B; + marshal_expect_failure t97_C; + marshal_expect_failure t98_A; + marshal_expect_failure t98_B; + marshal_expect_failure t98_C; + marshal_expect_failure t98_D; + marshal_expect_failure t99_A; + marshal_expect_failure t99_B; + marshal_expect_failure t100_A; + marshal_expect_failure t100_B; + marshal_expect_failure t100_C; + marshal_expect_failure t101_A; + marshal_expect_failure t101_B; + marshal_expect_failure t102_A; + marshal_expect_failure t103_A; + marshal_expect_failure t103_B; + marshal_expect_failure t103_C; + marshal_expect_failure t104_A; + marshal_expect_failure t104_B; + marshal_expect_failure t105_A; + marshal_expect_failure t105_B; + marshal_expect_failure t105_C; + marshal_expect_failure t106_A; + marshal_expect_failure t106_B; + marshal_expect_failure t106_C; + marshal_expect_failure t106_D; + marshal_expect_failure t107_A; + marshal_expect_failure t107_B; + marshal_expect_failure t108_A; + marshal_expect_failure t108_B; + marshal_expect_failure t108_C; + marshal_expect_failure t109_A; + marshal_expect_failure t109_B; + marshal_expect_failure t110_A; + marshal_expect_failure t111_A; + marshal_expect_failure t111_B; + marshal_expect_failure t111_C; + marshal_expect_failure t111_D; + marshal_expect_failure t112_A; + marshal_expect_failure t112_B; + marshal_expect_failure t112_C; + marshal_expect_failure t113_A; + marshal_expect_failure t113_B; + marshal_expect_failure t114_A; + marshal_expect_failure t114_B; + marshal_expect_failure t114_C; + marshal_expect_failure t115_A; + marshal_expect_failure t115_B; + marshal_expect_failure t115_C; + marshal_expect_failure t115_D; + marshal_expect_failure t116_A; + marshal_expect_failure t116_B; + marshal_expect_failure t117_A; + marshal_expect_failure t117_B; + marshal_expect_failure t117_C; + marshal_expect_failure t118_A; + marshal_expect_failure t118_B; + marshal_expect_failure t119_A; + marshal_expect_failure t120_A; + marshal_expect_failure t120_B; + marshal_expect_failure t120_C; + marshal_expect_failure t121_A; + marshal_expect_failure t121_B; + marshal_expect_failure t121_C; + marshal_expect_failure t121_D; + marshal_expect_failure t122_A; + marshal_expect_failure t122_B; + marshal_expect_failure t122_C; + marshal_expect_failure t123_A; + marshal_expect_failure t123_B; + marshal_expect_failure t124_A; + marshal_expect_failure t124_B; + marshal_expect_failure t124_C; + marshal_expect_failure t125_A; + marshal_expect_failure t125_B; + marshal_expect_failure t125_C; + marshal_expect_failure t125_D; + marshal_expect_failure t126_A; + marshal_expect_failure t126_B; + marshal_expect_failure t127_A; + marshal_expect_failure t127_B; + marshal_expect_failure t127_C; + marshal_expect_failure t128_A; + marshal_expect_failure t128_B; + marshal_expect_failure t129_A; + marshal_expect_failure t130_A; + marshal_expect_failure t130_B; + marshal_expect_failure t131_A; + marshal_expect_failure t131_B; + marshal_expect_failure t131_C; + marshal_expect_failure t132_A; + marshal_expect_failure t132_B; + marshal_expect_failure t132_C; + marshal_expect_failure t132_D; + marshal_expect_failure t133_A; + marshal_expect_failure t133_B; + marshal_expect_failure t133_C; + marshal_expect_failure t134_A; + marshal_expect_failure t134_B; + marshal_expect_failure t135_A; + marshal_expect_failure t135_B; + marshal_expect_failure t135_C; + marshal_expect_failure t136_A; + marshal_expect_failure t136_B; + marshal_expect_failure t136_C; + marshal_expect_failure t136_D; + marshal_expect_failure t137_A; + marshal_expect_failure t137_B; + marshal_expect_failure t138_A; + marshal_expect_failure t138_B; + marshal_expect_failure t138_C; + marshal_expect_failure t139_A; + marshal_expect_failure t139_B; + marshal_expect_failure t140_A; + marshal_expect_failure t141_A; + marshal_expect_failure t141_B; + marshal_expect_failure t141_C; + marshal_expect_failure t141_D; + marshal_expect_failure t141_E; + marshal_expect_failure t142_A; + marshal_expect_failure t142_B; + marshal_expect_failure t143_A; + marshal_expect_failure t143_B; + marshal_expect_failure t143_C; + marshal_expect_failure t144_A; + marshal_expect_failure t144_B; + marshal_expect_failure t144_C; + marshal_expect_failure t144_D; + marshal_expect_failure t145_A; + marshal_expect_failure t145_B; + marshal_expect_failure t145_C; + marshal_expect_failure t146_A; + marshal_expect_failure t146_B; + marshal_expect_failure t147_A; + marshal_expect_failure t147_B; + marshal_expect_failure t147_C; + marshal_expect_failure t148_A; + marshal_expect_failure t148_B; + marshal_expect_failure t148_C; + marshal_expect_failure t148_D; + marshal_expect_failure t149_A; + marshal_expect_failure t149_B; + print_endline " - Hashing"; + hash_expect_failure t0; + hash_expect_failure t1; + hash_expect_failure t2; + hash_expect_failure t3; + hash_expect_failure t4; + hash_expect_failure t5; + hash_expect_failure t6; + hash_expect_failure t7; + hash_expect_failure t8; + hash_expect_failure t9; + hash_expect_failure t10; + hash_expect_failure t11; + hash_expect_failure t12; + hash_expect_failure t13; + hash_expect_failure t14; + hash_expect_failure t15; + hash_expect_failure t16; + hash_expect_failure t17; + hash_expect_failure t18; + hash_expect_failure t19; + hash_expect_failure t20; + hash_expect_failure t21; + hash_expect_failure t22; + hash_expect_failure t23; + hash_expect_failure t24; + hash_expect_failure t25; + hash_expect_failure t26; + hash_expect_failure t27; + hash_expect_failure t28; + hash_expect_failure t29; + hash_expect_failure t30; + hash_expect_failure t31; + hash_expect_failure t32; + hash_expect_failure t33; + hash_expect_failure t34; + hash_expect_failure t35; + hash_expect_failure t36; + hash_expect_failure t37; + hash_expect_failure t38; + hash_expect_failure t39; + hash_expect_failure t40; + hash_expect_failure t41; + hash_expect_failure t42; + hash_expect_failure t43; + hash_expect_failure t44; + hash_expect_failure t45; + hash_expect_failure t46; + hash_expect_failure t47; + hash_expect_failure t48; + hash_expect_failure t49; + hash_expect_failure t50; + hash_expect_failure t51; + hash_expect_failure t52; + hash_expect_failure t53; + hash_expect_failure t54; + hash_expect_failure t55; + hash_expect_failure t56; + hash_expect_failure t57; + hash_expect_failure t58; + hash_expect_failure t59; + hash_expect_failure t60; + hash_expect_failure t61; + hash_expect_failure t62; + hash_expect_failure t63; + hash_expect_failure t64; + hash_expect_failure t65; + hash_expect_failure t66; + hash_expect_failure t67; + hash_expect_failure t68; + hash_expect_failure t69; + hash_expect_failure t70; + hash_expect_failure t71; + hash_expect_failure t72; + hash_expect_failure t73; + hash_expect_failure t74; + hash_expect_failure t75_A; + hash_expect_failure t76_A; + hash_expect_failure t76_B; + hash_expect_failure t77_A; + hash_expect_failure t78_A; + hash_expect_failure t78_B; + hash_expect_failure t78_C; + hash_expect_failure t79_A; + hash_expect_failure t79_B; + hash_expect_failure t80_A; + hash_expect_failure t81_A; + hash_expect_failure t81_B; + hash_expect_failure t82_A; + hash_expect_failure t82_B; + hash_expect_failure t82_C; + hash_expect_failure t83_A; + hash_expect_failure t83_B; + hash_expect_failure t84_A; + hash_expect_failure t85_A; + hash_expect_failure t85_B; + hash_expect_failure t85_C; + hash_expect_failure t85_D; + hash_expect_failure t86_A; + hash_expect_failure t86_B; + hash_expect_failure t87_A; + hash_expect_failure t87_B; + hash_expect_failure t87_C; + hash_expect_failure t88_A; + hash_expect_failure t88_B; + hash_expect_failure t89_A; + hash_expect_failure t90_A; + hash_expect_failure t90_B; + hash_expect_failure t90_C; + hash_expect_failure t91_A; + hash_expect_failure t91_B; + hash_expect_failure t91_C; + hash_expect_failure t91_D; + hash_expect_failure t92_A; + hash_expect_failure t92_B; + hash_expect_failure t93_A; + hash_expect_failure t93_B; + hash_expect_failure t93_C; + hash_expect_failure t94_A; + hash_expect_failure t94_B; + hash_expect_failure t95_A; + hash_expect_failure t96_A; + hash_expect_failure t96_B; + hash_expect_failure t97_A; + hash_expect_failure t97_B; + hash_expect_failure t97_C; + hash_expect_failure t98_A; + hash_expect_failure t98_B; + hash_expect_failure t98_C; + hash_expect_failure t98_D; + hash_expect_failure t99_A; + hash_expect_failure t99_B; + hash_expect_failure t100_A; + hash_expect_failure t100_B; + hash_expect_failure t100_C; + hash_expect_failure t101_A; + hash_expect_failure t101_B; + hash_expect_failure t102_A; + hash_expect_failure t103_A; + hash_expect_failure t103_B; + hash_expect_failure t103_C; + hash_expect_failure t104_A; + hash_expect_failure t104_B; + hash_expect_failure t105_A; + hash_expect_failure t105_B; + hash_expect_failure t105_C; + hash_expect_failure t106_A; + hash_expect_failure t106_B; + hash_expect_failure t106_C; + hash_expect_failure t106_D; + hash_expect_failure t107_A; + hash_expect_failure t107_B; + hash_expect_failure t108_A; + hash_expect_failure t108_B; + hash_expect_failure t108_C; + hash_expect_failure t109_A; + hash_expect_failure t109_B; + hash_expect_failure t110_A; + hash_expect_failure t111_A; + hash_expect_failure t111_B; + hash_expect_failure t111_C; + hash_expect_failure t111_D; + hash_expect_failure t112_A; + hash_expect_failure t112_B; + hash_expect_failure t112_C; + hash_expect_failure t113_A; + hash_expect_failure t113_B; + hash_expect_failure t114_A; + hash_expect_failure t114_B; + hash_expect_failure t114_C; + hash_expect_failure t115_A; + hash_expect_failure t115_B; + hash_expect_failure t115_C; + hash_expect_failure t115_D; + hash_expect_failure t116_A; + hash_expect_failure t116_B; + hash_expect_failure t117_A; + hash_expect_failure t117_B; + hash_expect_failure t117_C; + hash_expect_failure t118_A; + hash_expect_failure t118_B; + hash_expect_failure t119_A; + hash_expect_failure t120_A; + hash_expect_failure t120_B; + hash_expect_failure t120_C; + hash_expect_failure t121_A; + hash_expect_failure t121_B; + hash_expect_failure t121_C; + hash_expect_failure t121_D; + hash_expect_failure t122_A; + hash_expect_failure t122_B; + hash_expect_failure t122_C; + hash_expect_failure t123_A; + hash_expect_failure t123_B; + hash_expect_failure t124_A; + hash_expect_failure t124_B; + hash_expect_failure t124_C; + hash_expect_failure t125_A; + hash_expect_failure t125_B; + hash_expect_failure t125_C; + hash_expect_failure t125_D; + hash_expect_failure t126_A; + hash_expect_failure t126_B; + hash_expect_failure t127_A; + hash_expect_failure t127_B; + hash_expect_failure t127_C; + hash_expect_failure t128_A; + hash_expect_failure t128_B; + hash_expect_failure t129_A; + hash_expect_failure t130_A; + hash_expect_failure t130_B; + hash_expect_failure t131_A; + hash_expect_failure t131_B; + hash_expect_failure t131_C; + hash_expect_failure t132_A; + hash_expect_failure t132_B; + hash_expect_failure t132_C; + hash_expect_failure t132_D; + hash_expect_failure t133_A; + hash_expect_failure t133_B; + hash_expect_failure t133_C; + hash_expect_failure t134_A; + hash_expect_failure t134_B; + hash_expect_failure t135_A; + hash_expect_failure t135_B; + hash_expect_failure t135_C; + hash_expect_failure t136_A; + hash_expect_failure t136_B; + hash_expect_failure t136_C; + hash_expect_failure t136_D; + hash_expect_failure t137_A; + hash_expect_failure t137_B; + hash_expect_failure t138_A; + hash_expect_failure t138_B; + hash_expect_failure t138_C; + hash_expect_failure t139_A; + hash_expect_failure t139_B; + hash_expect_failure t140_A; + hash_expect_failure t141_A; + hash_expect_failure t141_B; + hash_expect_failure t141_C; + hash_expect_failure t141_D; + hash_expect_failure t141_E; + hash_expect_failure t142_A; + hash_expect_failure t142_B; + hash_expect_failure t143_A; + hash_expect_failure t143_B; + hash_expect_failure t143_C; + hash_expect_failure t144_A; + hash_expect_failure t144_B; + hash_expect_failure t144_C; + hash_expect_failure t144_D; + hash_expect_failure t145_A; + hash_expect_failure t145_B; + hash_expect_failure t145_C; + hash_expect_failure t146_A; + hash_expect_failure t146_B; + hash_expect_failure t147_A; + hash_expect_failure t147_B; + hash_expect_failure t147_C; + hash_expect_failure t148_A; + hash_expect_failure t148_B; + hash_expect_failure t148_C; + hash_expect_failure t148_D; + hash_expect_failure t149_A; + hash_expect_failure t149_B; + print_endline " - Comparing"; + compare_expect_failure t0 t1; + compare_expect_failure t1 t2; + compare_expect_failure t2 t3; + compare_expect_failure t3 t4; + compare_expect_failure t4 t5; + compare_expect_failure t5 t6; + compare_expect_failure t6 t7; + compare_expect_failure t7 t8; + compare_expect_failure t8 t9; + compare_expect_failure t9 t10; + compare_expect_failure t10 t11; + compare_expect_failure t11 t12; + compare_expect_failure t12 t13; + compare_expect_failure t13 t14; + compare_expect_failure t14 t15; + compare_expect_failure t15 t16; + compare_expect_failure t16 t17; + compare_expect_failure t17 t18; + compare_expect_failure t18 t19; + compare_expect_failure t19 t20; + compare_expect_failure t20 t21; + compare_expect_failure t21 t22; + compare_expect_failure t22 t23; + compare_expect_failure t23 t24; + compare_expect_failure t24 t25; + compare_expect_failure t25 t26; + compare_expect_failure t26 t27; + compare_expect_failure t27 t28; + compare_expect_failure t28 t29; + compare_expect_failure t29 t30; + compare_expect_failure t30 t31; + compare_expect_failure t31 t32; + compare_expect_failure t32 t33; + compare_expect_failure t33 t34; + compare_expect_failure t34 t35; + compare_expect_failure t35 t36; + compare_expect_failure t36 t37; + compare_expect_failure t37 t38; + compare_expect_failure t38 t39; + compare_expect_failure t39 t40; + compare_expect_failure t40 t41; + compare_expect_failure t41 t42; + compare_expect_failure t42 t43; + compare_expect_failure t43 t44; + compare_expect_failure t44 t45; + compare_expect_failure t45 t46; + compare_expect_failure t46 t47; + compare_expect_failure t47 t48; + compare_expect_failure t48 t49; + compare_expect_failure t49 t50; + compare_expect_failure t50 t51; + compare_expect_failure t51 t52; + compare_expect_failure t52 t53; + compare_expect_failure t53 t54; + compare_expect_failure t54 t55; + compare_expect_failure t55 t56; + compare_expect_failure t56 t57; + compare_expect_failure t57 t58; + compare_expect_failure t58 t59; + compare_expect_failure t59 t60; + compare_expect_failure t60 t61; + compare_expect_failure t61 t62; + compare_expect_failure t62 t63; + compare_expect_failure t63 t64; + compare_expect_failure t64 t65; + compare_expect_failure t65 t66; + compare_expect_failure t66 t67; + compare_expect_failure t67 t68; + compare_expect_failure t68 t69; + compare_expect_failure t69 t70; + compare_expect_failure t70 t71; + compare_expect_failure t71 t72; + compare_expect_failure t72 t73; + compare_expect_failure t73 t74; + compare_expect_failure t74 t75_A; + compare_expect_failure t75_A t76_A; + compare_expect_success t76_A t76_B; + compare_expect_success t76_B t77_A; + compare_expect_failure t77_A t78_A; + compare_expect_success t78_A t78_B; + compare_expect_success t78_B t78_C; + compare_expect_success t78_C t79_A; + compare_expect_success t79_A t79_B; + compare_expect_success t79_B t80_A; + compare_expect_failure t80_A t81_A; + compare_expect_success t81_A t81_B; + compare_expect_success t81_B t82_A; + compare_expect_success t82_A t82_B; + compare_expect_success t82_B t82_C; + compare_expect_success t82_C t83_A; + compare_expect_success t83_A t83_B; + compare_expect_success t83_B t84_A; + compare_expect_failure t84_A t85_A; + compare_expect_success t85_A t85_B; + compare_expect_success t85_B t85_C; + compare_expect_success t85_C t85_D; + compare_expect_success t85_D t86_A; + compare_expect_success t86_A t86_B; + compare_expect_success t86_B t87_A; + compare_expect_success t87_A t87_B; + compare_expect_success t87_B t87_C; + compare_expect_success t87_C t88_A; + compare_expect_success t88_A t88_B; + compare_expect_success t88_B t89_A; + compare_expect_failure t89_A t90_A; + compare_expect_success t90_A t90_B; + compare_expect_success t90_B t90_C; + compare_expect_success t90_C t91_A; + compare_expect_success t91_A t91_B; + compare_expect_success t91_B t91_C; + compare_expect_success t91_C t91_D; + compare_expect_success t91_D t92_A; + compare_expect_success t92_A t92_B; + compare_expect_success t92_B t93_A; + compare_expect_success t93_A t93_B; + compare_expect_success t93_B t93_C; + compare_expect_success t93_C t94_A; + compare_expect_success t94_A t94_B; + compare_expect_success t94_B t95_A; + compare_expect_failure t95_A t96_A; + compare_expect_success t96_A t96_B; + compare_expect_success t96_B t97_A; + compare_expect_success t97_A t97_B; + compare_expect_success t97_B t97_C; + compare_expect_success t97_C t98_A; + compare_expect_success t98_A t98_B; + compare_expect_success t98_B t98_C; + compare_expect_success t98_C t98_D; + compare_expect_success t98_D t99_A; + compare_expect_success t99_A t99_B; + compare_expect_success t99_B t100_A; + compare_expect_success t100_A t100_B; + compare_expect_success t100_B t100_C; + compare_expect_success t100_C t101_A; + compare_expect_success t101_A t101_B; + compare_expect_success t101_B t102_A; + compare_expect_failure t102_A t103_A; + compare_expect_success t103_A t103_B; + compare_expect_success t103_B t103_C; + compare_expect_success t103_C t104_A; + compare_expect_success t104_A t104_B; + compare_expect_success t104_B t105_A; + compare_expect_success t105_A t105_B; + compare_expect_success t105_B t105_C; + compare_expect_success t105_C t106_A; + compare_expect_success t106_A t106_B; + compare_expect_success t106_B t106_C; + compare_expect_success t106_C t106_D; + compare_expect_success t106_D t107_A; + compare_expect_success t107_A t107_B; + compare_expect_success t107_B t108_A; + compare_expect_success t108_A t108_B; + compare_expect_success t108_B t108_C; + compare_expect_success t108_C t109_A; + compare_expect_success t109_A t109_B; + compare_expect_success t109_B t110_A; + compare_expect_failure t110_A t111_A; + compare_expect_success t111_A t111_B; + compare_expect_success t111_B t111_C; + compare_expect_success t111_C t111_D; + compare_expect_success t111_D t112_A; + compare_expect_success t112_A t112_B; + compare_expect_success t112_B t112_C; + compare_expect_success t112_C t113_A; + compare_expect_success t113_A t113_B; + compare_expect_success t113_B t114_A; + compare_expect_success t114_A t114_B; + compare_expect_success t114_B t114_C; + compare_expect_success t114_C t115_A; + compare_expect_success t115_A t115_B; + compare_expect_success t115_B t115_C; + compare_expect_success t115_C t115_D; + compare_expect_success t115_D t116_A; + compare_expect_success t116_A t116_B; + compare_expect_success t116_B t117_A; + compare_expect_success t117_A t117_B; + compare_expect_success t117_B t117_C; + compare_expect_success t117_C t118_A; + compare_expect_success t118_A t118_B; + compare_expect_success t118_B t119_A; + compare_expect_failure t119_A t120_A; + compare_expect_success t120_A t120_B; + compare_expect_success t120_B t120_C; + compare_expect_success t120_C t121_A; + compare_expect_success t121_A t121_B; + compare_expect_success t121_B t121_C; + compare_expect_success t121_C t121_D; + compare_expect_success t121_D t122_A; + compare_expect_success t122_A t122_B; + compare_expect_success t122_B t122_C; + compare_expect_success t122_C t123_A; + compare_expect_success t123_A t123_B; + compare_expect_success t123_B t124_A; + compare_expect_success t124_A t124_B; + compare_expect_success t124_B t124_C; + compare_expect_success t124_C t125_A; + compare_expect_success t125_A t125_B; + compare_expect_success t125_B t125_C; + compare_expect_success t125_C t125_D; + compare_expect_success t125_D t126_A; + compare_expect_success t126_A t126_B; + compare_expect_success t126_B t127_A; + compare_expect_success t127_A t127_B; + compare_expect_success t127_B t127_C; + compare_expect_success t127_C t128_A; + compare_expect_success t128_A t128_B; + compare_expect_success t128_B t129_A; + compare_expect_failure t129_A t130_A; + compare_expect_success t130_A t130_B; + compare_expect_success t130_B t131_A; + compare_expect_success t131_A t131_B; + compare_expect_success t131_B t131_C; + compare_expect_success t131_C t132_A; + compare_expect_success t132_A t132_B; + compare_expect_success t132_B t132_C; + compare_expect_success t132_C t132_D; + compare_expect_success t132_D t133_A; + compare_expect_success t133_A t133_B; + compare_expect_success t133_B t133_C; + compare_expect_success t133_C t134_A; + compare_expect_success t134_A t134_B; + compare_expect_success t134_B t135_A; + compare_expect_success t135_A t135_B; + compare_expect_success t135_B t135_C; + compare_expect_success t135_C t136_A; + compare_expect_success t136_A t136_B; + compare_expect_success t136_B t136_C; + compare_expect_success t136_C t136_D; + compare_expect_success t136_D t137_A; + compare_expect_success t137_A t137_B; + compare_expect_success t137_B t138_A; + compare_expect_success t138_A t138_B; + compare_expect_success t138_B t138_C; + compare_expect_success t138_C t139_A; + compare_expect_success t139_A t139_B; + compare_expect_success t139_B t140_A; + compare_expect_failure t140_A t141_A; + compare_expect_success t141_A t141_B; + compare_expect_success t141_B t141_C; + compare_expect_success t141_C t141_D; + compare_expect_success t141_D t141_E; + compare_expect_success t141_E t142_A; + compare_expect_success t142_A t142_B; + compare_expect_success t142_B t143_A; + compare_expect_success t143_A t143_B; + compare_expect_success t143_B t143_C; + compare_expect_success t143_C t144_A; + compare_expect_success t144_A t144_B; + compare_expect_success t144_B t144_C; + compare_expect_success t144_C t144_D; + compare_expect_success t144_D t145_A; + compare_expect_success t145_A t145_B; + compare_expect_success t145_B t145_C; + compare_expect_success t145_C t146_A; + compare_expect_success t146_A t146_B; + compare_expect_success t146_B t147_A; + compare_expect_success t147_A t147_B; + compare_expect_success t147_B t147_C; + compare_expect_success t147_C t148_A; + compare_expect_success t148_A t148_B; + compare_expect_success t148_B t148_C; + compare_expect_success t148_C t148_D; + compare_expect_success t148_D t149_A; + compare_expect_success t149_A t149_B; + compare_expect_success t149_B t0; + print_endline " - Checking field values"; + check_float t0.float0 t_orig0.float0 ~message:"t0.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t0.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig0.float_u1) ~message:"t0.float_u1"; + check_float t1.float0 t_orig1.float0 ~message:"t1.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t1.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig1.float_u1) ~message:"t1.float_u1"; + check_float t2.float0 t_orig2.float0 ~message:"t2.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t2.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig2.float_u1) ~message:"t2.float_u1"; + check_float t3.float0 t_orig3.float0 ~message:"t3.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t3.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig3.float_u1) ~message:"t3.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t4.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig4.float_u0) ~message:"t4.float_u0"; + check_float t4.float1 t_orig4.float1 ~message:"t4.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t5.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig5.float_u0) ~message:"t5.float_u0"; + check_float t5.float1 t_orig5.float1 ~message:"t5.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t6.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig6.float_u0) ~message:"t6.float_u0"; + check_float t6.float1 t_orig6.float1 ~message:"t6.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t7.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig7.float_u0) ~message:"t7.float_u0"; + check_float t7.float1 t_orig7.float1 ~message:"t7.float1"; + check_float t8.float0 t_orig8.float0 ~message:"t8.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t8.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig8.float_u1) ~message:"t8.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t8.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig8.float_u2) ~message:"t8.float_u2"; + check_float t9.float0 t_orig9.float0 ~message:"t9.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t9.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig9.float_u1) ~message:"t9.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t9.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig9.float_u2) ~message:"t9.float_u2"; + check_float t10.float0 t_orig10.float0 ~message:"t10.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t10.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig10.float_u1) ~message:"t10.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t10.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig10.float_u2) ~message:"t10.float_u2"; + check_float t11.float0 t_orig11.float0 ~message:"t11.float0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t11.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig11.float_u1) ~message:"t11.float_u1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t11.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig11.float_u2) ~message:"t11.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t12.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig12.float_u0) ~message:"t12.float_u0"; + check_float t12.float1 t_orig12.float1 ~message:"t12.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t12.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig12.float_u2) ~message:"t12.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t13.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig13.float_u0) ~message:"t13.float_u0"; + check_float t13.float1 t_orig13.float1 ~message:"t13.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t13.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig13.float_u2) ~message:"t13.float_u2"; + check_float t14.float0 t_orig14.float0 ~message:"t14.float0"; + check_float t14.float1 t_orig14.float1 ~message:"t14.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t14.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig14.float_u2) ~message:"t14.float_u2"; + check_float t15.float0 t_orig15.float0 ~message:"t15.float0"; + check_float t15.float1 t_orig15.float1 ~message:"t15.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t15.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig15.float_u2) ~message:"t15.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t16.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig16.float_u0) ~message:"t16.float_u0"; + check_float t16.float1 t_orig16.float1 ~message:"t16.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t16.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig16.float_u2) ~message:"t16.float_u2"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t17.float_u0) (Stdlib_upstream_compatible.Float_u.to_float t_orig17.float_u0) ~message:"t17.float_u0"; + check_float t17.float1 t_orig17.float1 ~message:"t17.float1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t17.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig17.float_u2) ~message:"t17.float_u2"; + check_string t18.str0 t_orig18.str0 ~message:"t18.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t18.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig18.float_u1) ~message:"t18.float_u1"; + check_string t19.str0 t_orig19.str0 ~message:"t19.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t19.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig19.float_u1) ~message:"t19.float_u1"; + check_string t20.str0 t_orig20.str0 ~message:"t20.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t20.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig20.float_u1) ~message:"t20.float_u1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t21.float32_u0) (Stdlib_stable.Float32_u.to_float32 t_orig21.float32_u0) ~message:"t21.float32_u0"; + check_string t22.str0 t_orig22.str0 ~message:"t22.str0"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t22.float_u1) (Stdlib_upstream_compatible.Float_u.to_float t_orig22.float_u1) ~message:"t22.float_u1"; + check_string t23.str0 t_orig23.str0 ~message:"t23.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t23.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig23.float32_u1) ~message:"t23.float32_u1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t24.float32_u0) (Stdlib_stable.Float32_u.to_float32 t_orig24.float32_u0) ~message:"t24.float32_u0"; + check_string t25.str0 t_orig25.str0 ~message:"t25.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t25.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig25.float32_u1) ~message:"t25.float32_u1"; + check_string t26.str0 t_orig26.str0 ~message:"t26.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t26.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig26.float32_u1) ~message:"t26.float32_u1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t27.i32_0) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig27.i32_0) ~message:"t27.i32_0"; + check_string t28.str0 t_orig28.str0 ~message:"t28.str0"; + check_string t28.str1 t_orig28.str1 ~message:"t28.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t28.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig28.float_u2) ~message:"t28.float_u2"; + check_float t29.float0 t_orig29.float0 ~message:"t29.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t29.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig29.float32_u1) ~message:"t29.float32_u1"; + check_string t30.str0 t_orig30.str0 ~message:"t30.str0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t30.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig30.float32_u1) ~message:"t30.float32_u1"; + check_string t31.str0 t_orig31.str0 ~message:"t31.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t31.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig31.i32_1) ~message:"t31.i32_1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t32.i32_0) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig32.i32_0) ~message:"t32.i32_0"; + check_string t33.str0 t_orig33.str0 ~message:"t33.str0"; + check_string t33.str1 t_orig33.str1 ~message:"t33.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t33.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig33.float_u2) ~message:"t33.float_u2"; + check_string t34.str0 t_orig34.str0 ~message:"t34.str0"; + check_string t34.str1 t_orig34.str1 ~message:"t34.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t34.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig34.float_u2) ~message:"t34.float_u2"; + check_float t35.float0 t_orig35.float0 ~message:"t35.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t35.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig35.float32_u1) ~message:"t35.float32_u1"; + check_float t36.float0 t_orig36.float0 ~message:"t36.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t36.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig36.float32_u1) ~message:"t36.float32_u1"; + check_string t37.str0 t_orig37.str0 ~message:"t37.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t37.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig37.i32_1) ~message:"t37.i32_1"; + check_string t38.str0 t_orig38.str0 ~message:"t38.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t38.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig38.i32_1) ~message:"t38.i32_1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t39.i64_0) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig39.i64_0) ~message:"t39.i64_0"; + check_float t40.float0 t_orig40.float0 ~message:"t40.float0"; + check_string t40.str1 t_orig40.str1 ~message:"t40.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t40.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig40.float_u2) ~message:"t40.float_u2"; + check_string t41.str0 t_orig41.str0 ~message:"t41.str0"; + check_string t41.str1 t_orig41.str1 ~message:"t41.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t41.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig41.float_u2) ~message:"t41.float_u2"; + check_string t42.str0 t_orig42.str0 ~message:"t42.str0"; + check_string t42.str1 t_orig42.str1 ~message:"t42.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t42.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig42.float32_u2) ~message:"t42.float32_u2"; + check_float t43.float0 t_orig43.float0 ~message:"t43.float0"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t43.float32_u1) (Stdlib_stable.Float32_u.to_float32 t_orig43.float32_u1) ~message:"t43.float32_u1"; + check_float t44.float0 t_orig44.float0 ~message:"t44.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t44.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig44.i32_1) ~message:"t44.i32_1"; + check_string t45.str0 t_orig45.str0 ~message:"t45.str0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t45.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig45.i32_1) ~message:"t45.i32_1"; + check_string t46.str0 t_orig46.str0 ~message:"t46.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t46.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig46.i64_1) ~message:"t46.i64_1"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t47.i64_0) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig47.i64_0) ~message:"t47.i64_0"; + check_float t48.float0 t_orig48.float0 ~message:"t48.float0"; + check_string t48.str1 t_orig48.str1 ~message:"t48.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t48.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig48.float_u2) ~message:"t48.float_u2"; + check_float t49.float0 t_orig49.float0 ~message:"t49.float0"; + check_string t49.str1 t_orig49.str1 ~message:"t49.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t49.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig49.float_u2) ~message:"t49.float_u2"; + check_string t50.str0 t_orig50.str0 ~message:"t50.str0"; + check_string t50.str1 t_orig50.str1 ~message:"t50.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t50.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig50.float32_u2) ~message:"t50.float32_u2"; + check_string t51.str0 t_orig51.str0 ~message:"t51.str0"; + check_string t51.str1 t_orig51.str1 ~message:"t51.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t51.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig51.float32_u2) ~message:"t51.float32_u2"; + check_float t52.float0 t_orig52.float0 ~message:"t52.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t52.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig52.i32_1) ~message:"t52.i32_1"; + check_float t53.float0 t_orig53.float0 ~message:"t53.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t53.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig53.i32_1) ~message:"t53.i32_1"; + check_string t54.str0 t_orig54.str0 ~message:"t54.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t54.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig54.i64_1) ~message:"t54.i64_1"; + check_string t55.str0 t_orig55.str0 ~message:"t55.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t55.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig55.i64_1) ~message:"t55.i64_1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t56.n0) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig56.n0) ~message:"t56.n0"; + check_int t57.imm0 t_orig57.imm0 ~message:"t57.imm0"; + check_string t57.str1 t_orig57.str1 ~message:"t57.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t57.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig57.float_u2) ~message:"t57.float_u2"; + check_float t58.float0 t_orig58.float0 ~message:"t58.float0"; + check_string t58.str1 t_orig58.str1 ~message:"t58.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t58.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig58.float_u2) ~message:"t58.float_u2"; + check_float t59.float0 t_orig59.float0 ~message:"t59.float0"; + check_string t59.str1 t_orig59.str1 ~message:"t59.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t59.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig59.float32_u2) ~message:"t59.float32_u2"; + check_string t60.str0 t_orig60.str0 ~message:"t60.str0"; + check_string t60.str1 t_orig60.str1 ~message:"t60.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t60.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig60.float32_u2) ~message:"t60.float32_u2"; + check_string t61.str0 t_orig61.str0 ~message:"t61.str0"; + check_string t61.str1 t_orig61.str1 ~message:"t61.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t61.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig61.i32_2) ~message:"t61.i32_2"; + check_float t62.float0 t_orig62.float0 ~message:"t62.float0"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t62.i32_1) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig62.i32_1) ~message:"t62.i32_1"; + check_float t63.float0 t_orig63.float0 ~message:"t63.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t63.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig63.i64_1) ~message:"t63.i64_1"; + check_string t64.str0 t_orig64.str0 ~message:"t64.str0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t64.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig64.i64_1) ~message:"t64.i64_1"; + check_string t65.str0 t_orig65.str0 ~message:"t65.str0"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t65.n1) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig65.n1) ~message:"t65.n1"; + check_int (Stdlib_upstream_compatible.Nativeint_u.to_int t66.n0) (Stdlib_upstream_compatible.Nativeint_u.to_int t_orig66.n0) ~message:"t66.n0"; + check_int t67.imm0 t_orig67.imm0 ~message:"t67.imm0"; + check_string t67.str1 t_orig67.str1 ~message:"t67.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t67.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig67.float_u2) ~message:"t67.float_u2"; + check_int t68.imm0 t_orig68.imm0 ~message:"t68.imm0"; + check_string t68.str1 t_orig68.str1 ~message:"t68.str1"; + check_float (Stdlib_upstream_compatible.Float_u.to_float t68.float_u2) (Stdlib_upstream_compatible.Float_u.to_float t_orig68.float_u2) ~message:"t68.float_u2"; + check_float t69.float0 t_orig69.float0 ~message:"t69.float0"; + check_string t69.str1 t_orig69.str1 ~message:"t69.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t69.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig69.float32_u2) ~message:"t69.float32_u2"; + check_float t70.float0 t_orig70.float0 ~message:"t70.float0"; + check_string t70.str1 t_orig70.str1 ~message:"t70.str1"; + check_float32 (Stdlib_stable.Float32_u.to_float32 t70.float32_u2) (Stdlib_stable.Float32_u.to_float32 t_orig70.float32_u2) ~message:"t70.float32_u2"; + check_string t71.str0 t_orig71.str0 ~message:"t71.str0"; + check_string t71.str1 t_orig71.str1 ~message:"t71.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t71.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig71.i32_2) ~message:"t71.i32_2"; + check_string t72.str0 t_orig72.str0 ~message:"t72.str0"; + check_string t72.str1 t_orig72.str1 ~message:"t72.str1"; + check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 t72.i32_2) (Stdlib_upstream_compatible.Int32_u.to_int32 t_orig72.i32_2) ~message:"t72.i32_2"; + check_float t73.float0 t_orig73.float0 ~message:"t73.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t73.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig73.i64_1) ~message:"t73.i64_1"; + check_float t74.float0 t_orig74.float0 ~message:"t74.float0"; + check_int64 (Stdlib_upstream_compatible.Int64_u.to_int64 t74.i64_1) (Stdlib_upstream_compatible.Int64_u.to_int64 t_orig74.i64_1) ~message:"t74.i64_1"; + let () = match t75_A, t_orig75_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t75_A.0"; + + in + let () = match t76_A, t_orig76_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t76_A.0"; + | _ -> assert false + in + let () = match t76_B, t_orig76_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t76_B.0"; + | _ -> assert false + in + let () = match t77_A, t_orig77_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t77_A.float_u0"; + + in + let () = match t78_A, t_orig78_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t78_A.0"; + | _ -> assert false + in + let () = match t78_B, t_orig78_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t78_B.0"; + | _ -> assert false + in + let () = match t78_C, t_orig78_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t78_C.0"; + | _ -> assert false + in + let () = match t79_A, t_orig79_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t79_A.float_u0"; + | _ -> assert false + in + let () = match t79_B, t_orig79_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t79_B.0"; + | _ -> assert false + in + let () = match t80_A, t_orig80_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t80_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t80_A.1"; + + in + let () = match t81_A, t_orig81_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t81_A.0"; + | _ -> assert false + in + let () = match t81_B, t_orig81_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t81_B.float_u0"; + | _ -> assert false + in + let () = match t82_A, t_orig82_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t82_A.float_u0"; + | _ -> assert false + in + let () = match t82_B, t_orig82_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t82_B.0"; + | _ -> assert false + in + let () = match t82_C, t_orig82_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t82_C.0"; + | _ -> assert false + in + let () = match t83_A, t_orig83_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t83_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t83_A.1"; + | _ -> assert false + in + let () = match t83_B, t_orig83_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t83_B.0"; + | _ -> assert false + in + let () = match t84_A, t_orig84_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t84_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t84_A.float_u1"; + + in + let () = match t85_A, t_orig85_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t85_A.0"; + | _ -> assert false + in + let () = match t85_B, t_orig85_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t85_B.0"; + | _ -> assert false + in + let () = match t85_C, t_orig85_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t85_C.0"; + | _ -> assert false + in + let () = match t85_D, t_orig85_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t85_D.0"; + | _ -> assert false + in + let () = match t86_A, t_orig86_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t86_A.float_u0"; + | _ -> assert false + in + let () = match t86_B, t_orig86_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t86_B.float_u0"; + | _ -> assert false + in + let () = match t87_A, t_orig87_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t87_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t87_A.1"; + | _ -> assert false + in + let () = match t87_B, t_orig87_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t87_B.0"; + | _ -> assert false + in + let () = match t87_C, t_orig87_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t87_C.0"; + | _ -> assert false + in + let () = match t88_A, t_orig88_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t88_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t88_A.float_u1"; + | _ -> assert false + in + let () = match t88_B, t_orig88_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t88_B.0"; + | _ -> assert false + in + let () = match t89_A, t_orig89_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t89_A.0"; + + in + let () = match t90_A, t_orig90_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t90_A.0"; + | _ -> assert false + in + let () = match t90_B, t_orig90_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t90_B.float_u0"; + | _ -> assert false + in + let () = match t90_C, t_orig90_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t90_C.0"; + | _ -> assert false + in + let () = match t91_A, t_orig91_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t91_A.float_u0"; + | _ -> assert false + in + let () = match t91_B, t_orig91_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t91_B.0"; + | _ -> assert false + in + let () = match t91_C, t_orig91_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t91_C.0"; + | _ -> assert false + in + let () = match t91_D, t_orig91_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t91_D.0"; + | _ -> assert false + in + let () = match t92_A, t_orig92_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t92_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t92_A.1"; + | _ -> assert false + in + let () = match t92_B, t_orig92_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t92_B.float_u0"; + | _ -> assert false + in + let () = match t93_A, t_orig93_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t93_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t93_A.float_u1"; + | _ -> assert false + in + let () = match t93_B, t_orig93_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t93_B.0"; + | _ -> assert false + in + let () = match t93_C, t_orig93_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t93_C.0"; + | _ -> assert false + in + let () = match t94_A, t_orig94_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t94_A.0"; + | _ -> assert false + in + let () = match t94_B, t_orig94_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t94_B.0"; + | _ -> assert false + in + let () = match t95_A, t_orig95_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t95_A.float_u0"; + + in + let () = match t96_A, t_orig96_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t96_A.0"; + | _ -> assert false + in + let () = match t96_B, t_orig96_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t96_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t96_B.1"; + | _ -> assert false + in + let () = match t97_A, t_orig97_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t97_A.float_u0"; + | _ -> assert false + in + let () = match t97_B, t_orig97_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t97_B.float_u0"; + | _ -> assert false + in + let () = match t97_C, t_orig97_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t97_C.0"; + | _ -> assert false + in + let () = match t98_A, t_orig98_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t98_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t98_A.1"; + | _ -> assert false + in + let () = match t98_B, t_orig98_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t98_B.0"; + | _ -> assert false + in + let () = match t98_C, t_orig98_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t98_C.0"; + | _ -> assert false + in + let () = match t98_D, t_orig98_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t98_D.0"; + | _ -> assert false + in + let () = match t99_A, t_orig99_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t99_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t99_A.float_u1"; + | _ -> assert false + in + let () = match t99_B, t_orig99_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t99_B.float_u0"; + | _ -> assert false + in + let () = match t100_A, t_orig100_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t100_A.0"; + | _ -> assert false + in + let () = match t100_B, t_orig100_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t100_B.0"; + | _ -> assert false + in + let () = match t100_C, t_orig100_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t100_C.0"; + | _ -> assert false + in + let () = match t101_A, t_orig101_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t101_A.float_u0"; + | _ -> assert false + in + let () = match t101_B, t_orig101_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t101_B.0"; + | _ -> assert false + in + let () = match t102_A, t_orig102_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t102_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t102_A.1"; + + in + let () = match t103_A, t_orig103_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t103_A.0"; + | _ -> assert false + in + let () = match t103_B, t_orig103_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t103_B.0"; + | _ -> assert false + in + let () = match t103_C, t_orig103_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t103_C.float_u0"; + | _ -> assert false + in + let () = match t104_A, t_orig104_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t104_A.float_u0"; + | _ -> assert false + in + let () = match t104_B, t_orig104_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t104_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t104_B.1"; + | _ -> assert false + in + let () = match t105_A, t_orig105_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t105_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t105_A.1"; + | _ -> assert false + in + let () = match t105_B, t_orig105_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t105_B.float_u0"; + | _ -> assert false + in + let () = match t105_C, t_orig105_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t105_C.0"; + | _ -> assert false + in + let () = match t106_A, t_orig106_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t106_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t106_A.float_u1"; + | _ -> assert false + in + let () = match t106_B, t_orig106_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t106_B.0"; + | _ -> assert false + in + let () = match t106_C, t_orig106_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t106_C.0"; + | _ -> assert false + in + let () = match t106_D, t_orig106_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t106_D.0"; + | _ -> assert false + in + let () = match t107_A, t_orig107_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t107_A.0"; + | _ -> assert false + in + let () = match t107_B, t_orig107_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t107_B.float_u0"; + | _ -> assert false + in + let () = match t108_A, t_orig108_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t108_A.float_u0"; + | _ -> assert false + in + let () = match t108_B, t_orig108_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t108_B.0"; + | _ -> assert false + in + let () = match t108_C, t_orig108_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t108_C.0"; + | _ -> assert false + in + let () = match t109_A, t_orig109_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t109_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t109_A.1"; + | _ -> assert false + in + let () = match t109_B, t_orig109_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t109_B.0"; + | _ -> assert false + in + let () = match t110_A, t_orig110_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t110_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t110_A.float_u1"; + + in + let () = match t111_A, t_orig111_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t111_A.0"; + | _ -> assert false + in + let () = match t111_B, t_orig111_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t111_B.float_u0"; + | _ -> assert false + in + let () = match t111_C, t_orig111_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t111_C.0"; + | _ -> assert false + in + let () = match t111_D, t_orig111_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t111_D.0"; + | _ -> assert false + in + let () = match t112_A, t_orig112_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t112_A.float_u0"; + | _ -> assert false + in + let () = match t112_B, t_orig112_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t112_B.0"; + | _ -> assert false + in + let () = match t112_C, t_orig112_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t112_C.float_u0"; + | _ -> assert false + in + let () = match t113_A, t_orig113_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t113_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t113_A.1"; + | _ -> assert false + in + let () = match t113_B, t_orig113_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t113_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t113_B.1"; + | _ -> assert false + in + let () = match t114_A, t_orig114_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t114_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t114_A.float_u1"; + | _ -> assert false + in + let () = match t114_B, t_orig114_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t114_B.float_u0"; + | _ -> assert false + in + let () = match t114_C, t_orig114_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t114_C.0"; + | _ -> assert false + in + let () = match t115_A, t_orig115_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t115_A.0"; + | _ -> assert false + in + let () = match t115_B, t_orig115_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t115_B.0"; + | _ -> assert false + in + let () = match t115_C, t_orig115_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t115_C.0"; + | _ -> assert false + in + let () = match t115_D, t_orig115_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t115_D.0"; + | _ -> assert false + in + let () = match t116_A, t_orig116_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t116_A.float_u0"; + | _ -> assert false + in + let () = match t116_B, t_orig116_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t116_B.float_u0"; + | _ -> assert false + in + let () = match t117_A, t_orig117_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t117_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t117_A.1"; + | _ -> assert false + in + let () = match t117_B, t_orig117_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t117_B.0"; + | _ -> assert false + in + let () = match t117_C, t_orig117_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t117_C.0"; + | _ -> assert false + in + let () = match t118_A, t_orig118_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t118_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t118_A.float_u1"; + | _ -> assert false + in + let () = match t118_B, t_orig118_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t118_B.0"; + | _ -> assert false + in + let () = match t119_A, t_orig119_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t119_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t119_A.1"; + + in + let () = match t120_A, t_orig120_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t120_A.0"; + | _ -> assert false + in + let () = match t120_B, t_orig120_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t120_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t120_B.1"; + | _ -> assert false + in + let () = match t120_C, t_orig120_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t120_C.0"; + | _ -> assert false + in + let () = match t121_A, t_orig121_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t121_A.float_u0"; + | _ -> assert false + in + let () = match t121_B, t_orig121_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t121_B.float_u0"; + | _ -> assert false + in + let () = match t121_C, t_orig121_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t121_C.0"; + | _ -> assert false + in + let () = match t121_D, t_orig121_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t121_D.0"; + | _ -> assert false + in + let () = match t122_A, t_orig122_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t122_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t122_A.1"; + | _ -> assert false + in + let () = match t122_B, t_orig122_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t122_B.0"; + | _ -> assert false + in + let () = match t122_C, t_orig122_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t122_C.float_u0"; + | _ -> assert false + in + let () = match t123_A, t_orig123_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t123_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t123_A.float_u1"; + | _ -> assert false + in + let () = match t123_B, t_orig123_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t123_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t123_B.1"; + | _ -> assert false + in + let () = match t124_A, t_orig124_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t124_A.0"; + | _ -> assert false + in + let () = match t124_B, t_orig124_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t124_B.float_u0"; + | _ -> assert false + in + let () = match t124_C, t_orig124_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t124_C.0"; + | _ -> assert false + in + let () = match t125_A, t_orig125_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t125_A.float_u0"; + | _ -> assert false + in + let () = match t125_B, t_orig125_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t125_B.0"; + | _ -> assert false + in + let () = match t125_C, t_orig125_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t125_C.0"; + | _ -> assert false + in + let () = match t125_D, t_orig125_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t125_D.0"; + | _ -> assert false + in + let () = match t126_A, t_orig126_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t126_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t126_A.1"; + | _ -> assert false + in + let () = match t126_B, t_orig126_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t126_B.float_u0"; + | _ -> assert false + in + let () = match t127_A, t_orig127_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t127_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t127_A.float_u1"; + | _ -> assert false + in + let () = match t127_B, t_orig127_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t127_B.0"; + | _ -> assert false + in + let () = match t127_C, t_orig127_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t127_C.0"; + | _ -> assert false + in + let () = match t128_A, t_orig128_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t128_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t128_A.1"; + | _ -> assert false + in + let () = match t128_B, t_orig128_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t128_B.0"; + | _ -> assert false + in + let () = match t129_A, t_orig129_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t129_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t129_A.float_u1"; + + in + let () = match t130_A, t_orig130_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t130_A.0"; + | _ -> assert false + in + let () = match t130_B, t_orig130_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t130_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t130_B.float_u1"; + | _ -> assert false + in + let () = match t131_A, t_orig131_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t131_A.float_u0"; + | _ -> assert false + in + let () = match t131_B, t_orig131_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t131_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t131_B.1"; + | _ -> assert false + in + let () = match t131_C, t_orig131_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t131_C.0"; + | _ -> assert false + in + let () = match t132_A, t_orig132_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t132_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t132_A.1"; + | _ -> assert false + in + let () = match t132_B, t_orig132_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t132_B.float_u0"; + | _ -> assert false + in + let () = match t132_C, t_orig132_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t132_C.0"; + | _ -> assert false + in + let () = match t132_D, t_orig132_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t132_D.0"; + | _ -> assert false + in + let () = match t133_A, t_orig133_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t133_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t133_A.float_u1"; + | _ -> assert false + in + let () = match t133_B, t_orig133_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t133_B.0"; + | _ -> assert false + in + let () = match t133_C, t_orig133_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t133_C.float_u0"; + | _ -> assert false + in + let () = match t134_A, t_orig134_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t134_A.0"; + | _ -> assert false + in + let () = match t134_B, t_orig134_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t134_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t134_B.1"; + | _ -> assert false + in + let () = match t135_A, t_orig135_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t135_A.float_u0"; + | _ -> assert false + in + let () = match t135_B, t_orig135_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t135_B.float_u0"; + | _ -> assert false + in + let () = match t135_C, t_orig135_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t135_C.0"; + | _ -> assert false + in + let () = match t136_A, t_orig136_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t136_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t136_A.1"; + | _ -> assert false + in + let () = match t136_B, t_orig136_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t136_B.0"; + | _ -> assert false + in + let () = match t136_C, t_orig136_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t136_C.0"; + | _ -> assert false + in + let () = match t136_D, t_orig136_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t136_D.0"; + | _ -> assert false + in + let () = match t137_A, t_orig137_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t137_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t137_A.float_u1"; + | _ -> assert false + in + let () = match t137_B, t_orig137_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t137_B.float_u0"; + | _ -> assert false + in + let () = match t138_A, t_orig138_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t138_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t138_A.1"; + | _ -> assert false + in + let () = match t138_B, t_orig138_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t138_B.0"; + | _ -> assert false + in + let () = match t138_C, t_orig138_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t138_C.0"; + | _ -> assert false + in + let () = match t139_A, t_orig139_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t139_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t139_A.float_u1"; + | _ -> assert false + in + let () = match t139_B, t_orig139_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t139_B.0"; + | _ -> assert false + in + let () = match t140_A, t_orig140_A with + | A (a0), A (b0) -> check_int32 (Stdlib_upstream_compatible.Int32_u.to_int32 a0) (Stdlib_upstream_compatible.Int32_u.to_int32 b0) ~message:"t140_A.0"; + + in + let () = match t141_A, t_orig141_A with + | A (a0), A (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t141_A.0"; + | _ -> assert false + in + let () = match t141_B, t_orig141_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t141_B.0"; + | _ -> assert false + in + let () = match t141_C, t_orig141_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t141_C.0"; + | _ -> assert false + in + let () = match t141_D, t_orig141_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t141_D.0"; + | _ -> assert false + in + let () = match t141_E, t_orig141_E with + | E (a0), E (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t141_E.0"; + | _ -> assert false + in + let () = match t142_A, t_orig142_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t142_A.float_u0"; + | _ -> assert false + in + let () = match t142_B, t_orig142_B with + | B a, B b -> check_string a.str0 b.str0 ~message:"t142_B.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t142_B.float_u1"; + | _ -> assert false + in + let () = match t143_A, t_orig143_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t143_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t143_A.1"; + | _ -> assert false + in + let () = match t143_B, t_orig143_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t143_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t143_B.1"; + | _ -> assert false + in + let () = match t143_C, t_orig143_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t143_C.0"; + | _ -> assert false + in + let () = match t144_A, t_orig144_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t144_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t144_A.float_u1"; + | _ -> assert false + in + let () = match t144_B, t_orig144_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t144_B.float_u0"; + | _ -> assert false + in + let () = match t144_C, t_orig144_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t144_C.0"; + | _ -> assert false + in + let () = match t144_D, t_orig144_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t144_D.0"; + | _ -> assert false + in + let () = match t145_A, t_orig145_A with + | A (a0), A (b0) -> check_float32 (Stdlib_stable.Float32_u.to_float32 a0) (Stdlib_stable.Float32_u.to_float32 b0) ~message:"t145_A.0"; + | _ -> assert false + in + let () = match t145_B, t_orig145_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t145_B.0"; + | _ -> assert false + in + let () = match t145_C, t_orig145_C with + | C a, C b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t145_C.float_u0"; + | _ -> assert false + in + let () = match t146_A, t_orig146_A with + | A a, A b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t146_A.float_u0"; + | _ -> assert false + in + let () = match t146_B, t_orig146_B with + | B (a0, a1), B (b0, b1) -> check_string a0 b0 ~message:"t146_B.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t146_B.1"; + | _ -> assert false + in + let () = match t147_A, t_orig147_A with + | A (a0, a1), A (b0, b1) -> check_float a0 b0 ~message:"t147_A.0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a1) (Stdlib_upstream_compatible.Float_u.to_float b1) ~message:"t147_A.1"; + | _ -> assert false + in + let () = match t147_B, t_orig147_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t147_B.float_u0"; + | _ -> assert false + in + let () = match t147_C, t_orig147_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t147_C.0"; + | _ -> assert false + in + let () = match t148_A, t_orig148_A with + | A a, A b -> check_string a.str0 b.str0 ~message:"t148_A.str0"; +check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u1) (Stdlib_upstream_compatible.Float_u.to_float b.float_u1) ~message:"t148_A.float_u1"; + | _ -> assert false + in + let () = match t148_B, t_orig148_B with + | B (a0), B (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t148_B.0"; + | _ -> assert false + in + let () = match t148_C, t_orig148_C with + | C (a0), C (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t148_C.0"; + | _ -> assert false + in + let () = match t148_D, t_orig148_D with + | D (a0), D (b0) -> check_float (Stdlib_upstream_compatible.Float_u.to_float a0) (Stdlib_upstream_compatible.Float_u.to_float b0) ~message:"t148_D.0"; + | _ -> assert false + in + let () = match t149_A, t_orig149_A with + | A (a0, a1), A (b0, b1) -> check_string a0 b0 ~message:"t149_A.0"; +check_float32 (Stdlib_stable.Float32_u.to_float32 a1) (Stdlib_stable.Float32_u.to_float32 b1) ~message:"t149_A.1"; + | _ -> assert false + in + let () = match t149_B, t_orig149_B with + | B a, B b -> check_float (Stdlib_upstream_compatible.Float_u.to_float a.float_u0) (Stdlib_upstream_compatible.Float_u.to_float b.float_u0) ~message:"t149_B.float_u0"; + | _ -> assert false + in + print_endline " - Checking [Obj.reachable_words]"; + check_reachable_words (Obj.reachable_words (Obj.repr t0)) (3) "Reachable words 0"; + check_reachable_words (Obj.reachable_words (Obj.repr t1)) (3) "Reachable words 1"; + check_reachable_words (Obj.reachable_words (Obj.repr t2)) (3) "Reachable words 2"; + check_reachable_words (Obj.reachable_words (Obj.repr t3)) (3) "Reachable words 3"; + check_reachable_words (Obj.reachable_words (Obj.repr t4)) (3) "Reachable words 4"; + check_reachable_words (Obj.reachable_words (Obj.repr t5)) (3) "Reachable words 5"; + check_reachable_words (Obj.reachable_words (Obj.repr t6)) (3) "Reachable words 6"; + check_reachable_words (Obj.reachable_words (Obj.repr t7)) (3) "Reachable words 7"; + check_reachable_words (Obj.reachable_words (Obj.repr t8)) (4) "Reachable words 8"; + check_reachable_words (Obj.reachable_words (Obj.repr t9)) (4) "Reachable words 9"; + check_reachable_words (Obj.reachable_words (Obj.repr t10)) (4) "Reachable words 10"; + check_reachable_words (Obj.reachable_words (Obj.repr t11)) (4) "Reachable words 11"; + check_reachable_words (Obj.reachable_words (Obj.repr t12)) (4) "Reachable words 12"; + check_reachable_words (Obj.reachable_words (Obj.repr t13)) (4) "Reachable words 13"; + check_reachable_words (Obj.reachable_words (Obj.repr t14)) (4) "Reachable words 14"; + check_reachable_words (Obj.reachable_words (Obj.repr t15)) (4) "Reachable words 15"; + check_reachable_words (Obj.reachable_words (Obj.repr t16)) (4) "Reachable words 16"; + check_reachable_words (Obj.reachable_words (Obj.repr t17)) (4) "Reachable words 17"; + check_reachable_words (Obj.reachable_words (Obj.repr t18)) (3 + Obj.reachable_words (Obj.repr t18.str0)) "Reachable words 18"; + check_reachable_words (Obj.reachable_words (Obj.repr t19)) (3 + Obj.reachable_words (Obj.repr t19.str0)) "Reachable words 19"; + check_reachable_words (Obj.reachable_words (Obj.repr t20)) (3 + Obj.reachable_words (Obj.repr t20.str0)) "Reachable words 20"; + check_reachable_words (Obj.reachable_words (Obj.repr t21)) (2) "Reachable words 21"; + check_reachable_words (Obj.reachable_words (Obj.repr t22)) (3 + Obj.reachable_words (Obj.repr t22.str0)) "Reachable words 22"; + check_reachable_words (Obj.reachable_words (Obj.repr t23)) (3 + Obj.reachable_words (Obj.repr t23.str0)) "Reachable words 23"; + check_reachable_words (Obj.reachable_words (Obj.repr t24)) (2) "Reachable words 24"; + check_reachable_words (Obj.reachable_words (Obj.repr t25)) (3 + Obj.reachable_words (Obj.repr t25.str0)) "Reachable words 25"; + check_reachable_words (Obj.reachable_words (Obj.repr t26)) (3 + Obj.reachable_words (Obj.repr t26.str0)) "Reachable words 26"; + check_reachable_words (Obj.reachable_words (Obj.repr t27)) (2) "Reachable words 27"; + check_reachable_words (Obj.reachable_words (Obj.repr t28)) (4 + Obj.reachable_words (Obj.repr t28.str0) + Obj.reachable_words (Obj.repr t28.str1)) "Reachable words 28"; + check_reachable_words (Obj.reachable_words (Obj.repr t29)) (3 + 2) "Reachable words 29"; + check_reachable_words (Obj.reachable_words (Obj.repr t30)) (3 + Obj.reachable_words (Obj.repr t30.str0)) "Reachable words 30"; + check_reachable_words (Obj.reachable_words (Obj.repr t31)) (3 + Obj.reachable_words (Obj.repr t31.str0)) "Reachable words 31"; + check_reachable_words (Obj.reachable_words (Obj.repr t32)) (2) "Reachable words 32"; + check_reachable_words (Obj.reachable_words (Obj.repr t33)) (4 + Obj.reachable_words (Obj.repr t33.str0) + Obj.reachable_words (Obj.repr t33.str1)) "Reachable words 33"; + check_reachable_words (Obj.reachable_words (Obj.repr t34)) (4 + Obj.reachable_words (Obj.repr t34.str0) + Obj.reachable_words (Obj.repr t34.str1)) "Reachable words 34"; + check_reachable_words (Obj.reachable_words (Obj.repr t35)) (3 + 2) "Reachable words 35"; + check_reachable_words (Obj.reachable_words (Obj.repr t36)) (3 + 2) "Reachable words 36"; + check_reachable_words (Obj.reachable_words (Obj.repr t37)) (3 + Obj.reachable_words (Obj.repr t37.str0)) "Reachable words 37"; + check_reachable_words (Obj.reachable_words (Obj.repr t38)) (3 + Obj.reachable_words (Obj.repr t38.str0)) "Reachable words 38"; + check_reachable_words (Obj.reachable_words (Obj.repr t39)) (2) "Reachable words 39"; + check_reachable_words (Obj.reachable_words (Obj.repr t40)) (4 + 2 + Obj.reachable_words (Obj.repr t40.str1)) "Reachable words 40"; + check_reachable_words (Obj.reachable_words (Obj.repr t41)) (4 + Obj.reachable_words (Obj.repr t41.str0) + Obj.reachable_words (Obj.repr t41.str1)) "Reachable words 41"; + check_reachable_words (Obj.reachable_words (Obj.repr t42)) (4 + Obj.reachable_words (Obj.repr t42.str0) + Obj.reachable_words (Obj.repr t42.str1)) "Reachable words 42"; + check_reachable_words (Obj.reachable_words (Obj.repr t43)) (3 + 2) "Reachable words 43"; + check_reachable_words (Obj.reachable_words (Obj.repr t44)) (3 + 2) "Reachable words 44"; + check_reachable_words (Obj.reachable_words (Obj.repr t45)) (3 + Obj.reachable_words (Obj.repr t45.str0)) "Reachable words 45"; + check_reachable_words (Obj.reachable_words (Obj.repr t46)) (3 + Obj.reachable_words (Obj.repr t46.str0)) "Reachable words 46"; + check_reachable_words (Obj.reachable_words (Obj.repr t47)) (2) "Reachable words 47"; + check_reachable_words (Obj.reachable_words (Obj.repr t48)) (4 + 2 + Obj.reachable_words (Obj.repr t48.str1)) "Reachable words 48"; + check_reachable_words (Obj.reachable_words (Obj.repr t49)) (4 + 2 + Obj.reachable_words (Obj.repr t49.str1)) "Reachable words 49"; + check_reachable_words (Obj.reachable_words (Obj.repr t50)) (4 + Obj.reachable_words (Obj.repr t50.str0) + Obj.reachable_words (Obj.repr t50.str1)) "Reachable words 50"; + check_reachable_words (Obj.reachable_words (Obj.repr t51)) (4 + Obj.reachable_words (Obj.repr t51.str0) + Obj.reachable_words (Obj.repr t51.str1)) "Reachable words 51"; + check_reachable_words (Obj.reachable_words (Obj.repr t52)) (3 + 2) "Reachable words 52"; + check_reachable_words (Obj.reachable_words (Obj.repr t53)) (3 + 2) "Reachable words 53"; + check_reachable_words (Obj.reachable_words (Obj.repr t54)) (3 + Obj.reachable_words (Obj.repr t54.str0)) "Reachable words 54"; + check_reachable_words (Obj.reachable_words (Obj.repr t55)) (3 + Obj.reachable_words (Obj.repr t55.str0)) "Reachable words 55"; + check_reachable_words (Obj.reachable_words (Obj.repr t56)) (2) "Reachable words 56"; + check_reachable_words (Obj.reachable_words (Obj.repr t57)) (4 + Obj.reachable_words (Obj.repr t57.str1)) "Reachable words 57"; + check_reachable_words (Obj.reachable_words (Obj.repr t58)) (4 + 2 + Obj.reachable_words (Obj.repr t58.str1)) "Reachable words 58"; + check_reachable_words (Obj.reachable_words (Obj.repr t59)) (4 + 2 + Obj.reachable_words (Obj.repr t59.str1)) "Reachable words 59"; + check_reachable_words (Obj.reachable_words (Obj.repr t60)) (4 + Obj.reachable_words (Obj.repr t60.str0) + Obj.reachable_words (Obj.repr t60.str1)) "Reachable words 60"; + check_reachable_words (Obj.reachable_words (Obj.repr t61)) (4 + Obj.reachable_words (Obj.repr t61.str0) + Obj.reachable_words (Obj.repr t61.str1)) "Reachable words 61"; + check_reachable_words (Obj.reachable_words (Obj.repr t62)) (3 + 2) "Reachable words 62"; + check_reachable_words (Obj.reachable_words (Obj.repr t63)) (3 + 2) "Reachable words 63"; + check_reachable_words (Obj.reachable_words (Obj.repr t64)) (3 + Obj.reachable_words (Obj.repr t64.str0)) "Reachable words 64"; + check_reachable_words (Obj.reachable_words (Obj.repr t65)) (3 + Obj.reachable_words (Obj.repr t65.str0)) "Reachable words 65"; + check_reachable_words (Obj.reachable_words (Obj.repr t66)) (2) "Reachable words 66"; + check_reachable_words (Obj.reachable_words (Obj.repr t67)) (4 + Obj.reachable_words (Obj.repr t67.str1)) "Reachable words 67"; + check_reachable_words (Obj.reachable_words (Obj.repr t68)) (4 + Obj.reachable_words (Obj.repr t68.str1)) "Reachable words 68"; + check_reachable_words (Obj.reachable_words (Obj.repr t69)) (4 + 2 + Obj.reachable_words (Obj.repr t69.str1)) "Reachable words 69"; + check_reachable_words (Obj.reachable_words (Obj.repr t70)) (4 + 2 + Obj.reachable_words (Obj.repr t70.str1)) "Reachable words 70"; + check_reachable_words (Obj.reachable_words (Obj.repr t71)) (4 + Obj.reachable_words (Obj.repr t71.str0) + Obj.reachable_words (Obj.repr t71.str1)) "Reachable words 71"; + check_reachable_words (Obj.reachable_words (Obj.repr t72)) (4 + Obj.reachable_words (Obj.repr t72.str0) + Obj.reachable_words (Obj.repr t72.str1)) "Reachable words 72"; + check_reachable_words (Obj.reachable_words (Obj.repr t73)) (3 + 2) "Reachable words 73"; + check_reachable_words (Obj.reachable_words (Obj.repr t74)) (3 + 2) "Reachable words 74"; + () +in +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75_A t76_A t76_B t77_A t78_A t78_B t78_C t79_A t79_B t80_A t81_A t81_B t82_A t82_B t82_C t83_A t83_B t84_A t85_A t85_B t85_C t85_D t86_A t86_B t87_A t87_B t87_C t88_A t88_B t89_A t90_A t90_B t90_C t91_A t91_B t91_C t91_D t92_A t92_B t93_A t93_B t93_C t94_A t94_B t95_A t96_A t96_B t97_A t97_B t97_C t98_A t98_B t98_C t98_D t99_A t99_B t100_A t100_B t100_C t101_A t101_B t102_A t103_A t103_B t103_C t104_A t104_B t105_A t105_B t105_C t106_A t106_B t106_C t106_D t107_A t107_B t108_A t108_B t108_C t109_A t109_B t110_A t111_A t111_B t111_C t111_D t112_A t112_B t112_C t113_A t113_B t114_A t114_B t114_C t115_A t115_B t115_C t115_D t116_A t116_B t117_A t117_B t117_C t118_A t118_B t119_A t120_A t120_B t120_C t121_A t121_B t121_C t121_D t122_A t122_B t122_C t123_A t123_B t124_A t124_B t124_C t125_A t125_B t125_C t125_D t126_A t126_B t127_A t127_B t127_C t128_A t128_B t129_A t130_A t130_B t131_A t131_B t131_C t132_A t132_B t132_C t132_D t133_A t133_B t133_C t134_A t134_B t135_A t135_B t135_C t136_A t136_B t136_C t136_D t137_A t137_B t138_A t138_B t138_C t139_A t139_B t140_A t141_A t141_B t141_C t141_D t141_E t142_A t142_B t143_A t143_B t143_C t144_A t144_B t144_C t144_D t145_A t145_B t145_C t146_A t146_B t147_A t147_B t147_C t148_A t148_B t148_C t148_D t149_A t149_B in +print_endline " - Doing GC"; +Gc.full_major (); +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75_A t76_A t76_B t77_A t78_A t78_B t78_C t79_A t79_B t80_A t81_A t81_B t82_A t82_B t82_C t83_A t83_B t84_A t85_A t85_B t85_C t85_D t86_A t86_B t87_A t87_B t87_C t88_A t88_B t89_A t90_A t90_B t90_C t91_A t91_B t91_C t91_D t92_A t92_B t93_A t93_B t93_C t94_A t94_B t95_A t96_A t96_B t97_A t97_B t97_C t98_A t98_B t98_C t98_D t99_A t99_B t100_A t100_B t100_C t101_A t101_B t102_A t103_A t103_B t103_C t104_A t104_B t105_A t105_B t105_C t106_A t106_B t106_C t106_D t107_A t107_B t108_A t108_B t108_C t109_A t109_B t110_A t111_A t111_B t111_C t111_D t112_A t112_B t112_C t113_A t113_B t114_A t114_B t114_C t115_A t115_B t115_C t115_D t116_A t116_B t117_A t117_B t117_C t118_A t118_B t119_A t120_A t120_B t120_C t121_A t121_B t121_C t121_D t122_A t122_B t122_C t123_A t123_B t124_A t124_B t124_C t125_A t125_B t125_C t125_D t126_A t126_B t127_A t127_B t127_C t128_A t128_B t129_A t130_A t130_B t131_A t131_B t131_C t132_A t132_B t132_C t132_D t133_A t133_B t133_C t134_A t134_B t135_A t135_B t135_C t136_A t136_B t136_C t136_D t137_A t137_B t138_A t138_B t138_C t139_A t139_B t140_A t141_A t141_B t141_C t141_D t141_E t142_A t142_B t143_A t143_B t143_C t144_A t144_B t144_C t144_D t145_A t145_B t145_C t146_A t146_B t147_A t147_B t147_C t148_A t148_B t148_C t148_D t149_A t149_B in +print_endline "Copying values via [Stdlib.Weak]"; +let t0 : t0 = copy_via_weak t0 in +let t1 : t1 = copy_via_weak t1 in +let t2 : t2 = copy_via_weak t2 in +let t3 : t3 = copy_via_weak t3 in +let t4 : t4 = copy_via_weak t4 in +let t5 : t5 = copy_via_weak t5 in +let t6 : t6 = copy_via_weak t6 in +let t7 : t7 = copy_via_weak t7 in +let t8 : t8 = copy_via_weak t8 in +let t9 : t9 = copy_via_weak t9 in +let t10 : t10 = copy_via_weak t10 in +let t11 : t11 = copy_via_weak t11 in +let t12 : t12 = copy_via_weak t12 in +let t13 : t13 = copy_via_weak t13 in +let t14 : t14 = copy_via_weak t14 in +let t15 : t15 = copy_via_weak t15 in +let t16 : t16 = copy_via_weak t16 in +let t17 : t17 = copy_via_weak t17 in +let t18 : t18 = copy_via_weak t18 in +let t19 : t19 = copy_via_weak t19 in +let t20 : t20 = copy_via_weak t20 in +let t21 : t21 = copy_via_weak t21 in +let t22 : t22 = copy_via_weak t22 in +let t23 : t23 = copy_via_weak t23 in +let t24 : t24 = copy_via_weak t24 in +let t25 : t25 = copy_via_weak t25 in +let t26 : t26 = copy_via_weak t26 in +let t27 : t27 = copy_via_weak t27 in +let t28 : t28 = copy_via_weak t28 in +let t29 : t29 = copy_via_weak t29 in +let t30 : t30 = copy_via_weak t30 in +let t31 : t31 = copy_via_weak t31 in +let t32 : t32 = copy_via_weak t32 in +let t33 : t33 = copy_via_weak t33 in +let t34 : t34 = copy_via_weak t34 in +let t35 : t35 = copy_via_weak t35 in +let t36 : t36 = copy_via_weak t36 in +let t37 : t37 = copy_via_weak t37 in +let t38 : t38 = copy_via_weak t38 in +let t39 : t39 = copy_via_weak t39 in +let t40 : t40 = copy_via_weak t40 in +let t41 : t41 = copy_via_weak t41 in +let t42 : t42 = copy_via_weak t42 in +let t43 : t43 = copy_via_weak t43 in +let t44 : t44 = copy_via_weak t44 in +let t45 : t45 = copy_via_weak t45 in +let t46 : t46 = copy_via_weak t46 in +let t47 : t47 = copy_via_weak t47 in +let t48 : t48 = copy_via_weak t48 in +let t49 : t49 = copy_via_weak t49 in +let t50 : t50 = copy_via_weak t50 in +let t51 : t51 = copy_via_weak t51 in +let t52 : t52 = copy_via_weak t52 in +let t53 : t53 = copy_via_weak t53 in +let t54 : t54 = copy_via_weak t54 in +let t55 : t55 = copy_via_weak t55 in +let t56 : t56 = copy_via_weak t56 in +let t57 : t57 = copy_via_weak t57 in +let t58 : t58 = copy_via_weak t58 in +let t59 : t59 = copy_via_weak t59 in +let t60 : t60 = copy_via_weak t60 in +let t61 : t61 = copy_via_weak t61 in +let t62 : t62 = copy_via_weak t62 in +let t63 : t63 = copy_via_weak t63 in +let t64 : t64 = copy_via_weak t64 in +let t65 : t65 = copy_via_weak t65 in +let t66 : t66 = copy_via_weak t66 in +let t67 : t67 = copy_via_weak t67 in +let t68 : t68 = copy_via_weak t68 in +let t69 : t69 = copy_via_weak t69 in +let t70 : t70 = copy_via_weak t70 in +let t71 : t71 = copy_via_weak t71 in +let t72 : t72 = copy_via_weak t72 in +let t73 : t73 = copy_via_weak t73 in +let t74 : t74 = copy_via_weak t74 in +let t75_A : t75 = copy_via_weak t75_A in +let t76_A : t76 = copy_via_weak t76_A in +let t76_B : t76 = copy_via_weak t76_B in +let t77_A : t77 = copy_via_weak t77_A in +let t78_A : t78 = copy_via_weak t78_A in +let t78_B : t78 = copy_via_weak t78_B in +let t78_C : t78 = copy_via_weak t78_C in +let t79_A : t79 = copy_via_weak t79_A in +let t79_B : t79 = copy_via_weak t79_B in +let t80_A : t80 = copy_via_weak t80_A in +let t81_A : t81 = copy_via_weak t81_A in +let t81_B : t81 = copy_via_weak t81_B in +let t82_A : t82 = copy_via_weak t82_A in +let t82_B : t82 = copy_via_weak t82_B in +let t82_C : t82 = copy_via_weak t82_C in +let t83_A : t83 = copy_via_weak t83_A in +let t83_B : t83 = copy_via_weak t83_B in +let t84_A : t84 = copy_via_weak t84_A in +let t85_A : t85 = copy_via_weak t85_A in +let t85_B : t85 = copy_via_weak t85_B in +let t85_C : t85 = copy_via_weak t85_C in +let t85_D : t85 = copy_via_weak t85_D in +let t86_A : t86 = copy_via_weak t86_A in +let t86_B : t86 = copy_via_weak t86_B in +let t87_A : t87 = copy_via_weak t87_A in +let t87_B : t87 = copy_via_weak t87_B in +let t87_C : t87 = copy_via_weak t87_C in +let t88_A : t88 = copy_via_weak t88_A in +let t88_B : t88 = copy_via_weak t88_B in +let t89_A : t89 = copy_via_weak t89_A in +let t90_A : t90 = copy_via_weak t90_A in +let t90_B : t90 = copy_via_weak t90_B in +let t90_C : t90 = copy_via_weak t90_C in +let t91_A : t91 = copy_via_weak t91_A in +let t91_B : t91 = copy_via_weak t91_B in +let t91_C : t91 = copy_via_weak t91_C in +let t91_D : t91 = copy_via_weak t91_D in +let t92_A : t92 = copy_via_weak t92_A in +let t92_B : t92 = copy_via_weak t92_B in +let t93_A : t93 = copy_via_weak t93_A in +let t93_B : t93 = copy_via_weak t93_B in +let t93_C : t93 = copy_via_weak t93_C in +let t94_A : t94 = copy_via_weak t94_A in +let t94_B : t94 = copy_via_weak t94_B in +let t95_A : t95 = copy_via_weak t95_A in +let t96_A : t96 = copy_via_weak t96_A in +let t96_B : t96 = copy_via_weak t96_B in +let t97_A : t97 = copy_via_weak t97_A in +let t97_B : t97 = copy_via_weak t97_B in +let t97_C : t97 = copy_via_weak t97_C in +let t98_A : t98 = copy_via_weak t98_A in +let t98_B : t98 = copy_via_weak t98_B in +let t98_C : t98 = copy_via_weak t98_C in +let t98_D : t98 = copy_via_weak t98_D in +let t99_A : t99 = copy_via_weak t99_A in +let t99_B : t99 = copy_via_weak t99_B in +let t100_A : t100 = copy_via_weak t100_A in +let t100_B : t100 = copy_via_weak t100_B in +let t100_C : t100 = copy_via_weak t100_C in +let t101_A : t101 = copy_via_weak t101_A in +let t101_B : t101 = copy_via_weak t101_B in +let t102_A : t102 = copy_via_weak t102_A in +let t103_A : t103 = copy_via_weak t103_A in +let t103_B : t103 = copy_via_weak t103_B in +let t103_C : t103 = copy_via_weak t103_C in +let t104_A : t104 = copy_via_weak t104_A in +let t104_B : t104 = copy_via_weak t104_B in +let t105_A : t105 = copy_via_weak t105_A in +let t105_B : t105 = copy_via_weak t105_B in +let t105_C : t105 = copy_via_weak t105_C in +let t106_A : t106 = copy_via_weak t106_A in +let t106_B : t106 = copy_via_weak t106_B in +let t106_C : t106 = copy_via_weak t106_C in +let t106_D : t106 = copy_via_weak t106_D in +let t107_A : t107 = copy_via_weak t107_A in +let t107_B : t107 = copy_via_weak t107_B in +let t108_A : t108 = copy_via_weak t108_A in +let t108_B : t108 = copy_via_weak t108_B in +let t108_C : t108 = copy_via_weak t108_C in +let t109_A : t109 = copy_via_weak t109_A in +let t109_B : t109 = copy_via_weak t109_B in +let t110_A : t110 = copy_via_weak t110_A in +let t111_A : t111 = copy_via_weak t111_A in +let t111_B : t111 = copy_via_weak t111_B in +let t111_C : t111 = copy_via_weak t111_C in +let t111_D : t111 = copy_via_weak t111_D in +let t112_A : t112 = copy_via_weak t112_A in +let t112_B : t112 = copy_via_weak t112_B in +let t112_C : t112 = copy_via_weak t112_C in +let t113_A : t113 = copy_via_weak t113_A in +let t113_B : t113 = copy_via_weak t113_B in +let t114_A : t114 = copy_via_weak t114_A in +let t114_B : t114 = copy_via_weak t114_B in +let t114_C : t114 = copy_via_weak t114_C in +let t115_A : t115 = copy_via_weak t115_A in +let t115_B : t115 = copy_via_weak t115_B in +let t115_C : t115 = copy_via_weak t115_C in +let t115_D : t115 = copy_via_weak t115_D in +let t116_A : t116 = copy_via_weak t116_A in +let t116_B : t116 = copy_via_weak t116_B in +let t117_A : t117 = copy_via_weak t117_A in +let t117_B : t117 = copy_via_weak t117_B in +let t117_C : t117 = copy_via_weak t117_C in +let t118_A : t118 = copy_via_weak t118_A in +let t118_B : t118 = copy_via_weak t118_B in +let t119_A : t119 = copy_via_weak t119_A in +let t120_A : t120 = copy_via_weak t120_A in +let t120_B : t120 = copy_via_weak t120_B in +let t120_C : t120 = copy_via_weak t120_C in +let t121_A : t121 = copy_via_weak t121_A in +let t121_B : t121 = copy_via_weak t121_B in +let t121_C : t121 = copy_via_weak t121_C in +let t121_D : t121 = copy_via_weak t121_D in +let t122_A : t122 = copy_via_weak t122_A in +let t122_B : t122 = copy_via_weak t122_B in +let t122_C : t122 = copy_via_weak t122_C in +let t123_A : t123 = copy_via_weak t123_A in +let t123_B : t123 = copy_via_weak t123_B in +let t124_A : t124 = copy_via_weak t124_A in +let t124_B : t124 = copy_via_weak t124_B in +let t124_C : t124 = copy_via_weak t124_C in +let t125_A : t125 = copy_via_weak t125_A in +let t125_B : t125 = copy_via_weak t125_B in +let t125_C : t125 = copy_via_weak t125_C in +let t125_D : t125 = copy_via_weak t125_D in +let t126_A : t126 = copy_via_weak t126_A in +let t126_B : t126 = copy_via_weak t126_B in +let t127_A : t127 = copy_via_weak t127_A in +let t127_B : t127 = copy_via_weak t127_B in +let t127_C : t127 = copy_via_weak t127_C in +let t128_A : t128 = copy_via_weak t128_A in +let t128_B : t128 = copy_via_weak t128_B in +let t129_A : t129 = copy_via_weak t129_A in +let t130_A : t130 = copy_via_weak t130_A in +let t130_B : t130 = copy_via_weak t130_B in +let t131_A : t131 = copy_via_weak t131_A in +let t131_B : t131 = copy_via_weak t131_B in +let t131_C : t131 = copy_via_weak t131_C in +let t132_A : t132 = copy_via_weak t132_A in +let t132_B : t132 = copy_via_weak t132_B in +let t132_C : t132 = copy_via_weak t132_C in +let t132_D : t132 = copy_via_weak t132_D in +let t133_A : t133 = copy_via_weak t133_A in +let t133_B : t133 = copy_via_weak t133_B in +let t133_C : t133 = copy_via_weak t133_C in +let t134_A : t134 = copy_via_weak t134_A in +let t134_B : t134 = copy_via_weak t134_B in +let t135_A : t135 = copy_via_weak t135_A in +let t135_B : t135 = copy_via_weak t135_B in +let t135_C : t135 = copy_via_weak t135_C in +let t136_A : t136 = copy_via_weak t136_A in +let t136_B : t136 = copy_via_weak t136_B in +let t136_C : t136 = copy_via_weak t136_C in +let t136_D : t136 = copy_via_weak t136_D in +let t137_A : t137 = copy_via_weak t137_A in +let t137_B : t137 = copy_via_weak t137_B in +let t138_A : t138 = copy_via_weak t138_A in +let t138_B : t138 = copy_via_weak t138_B in +let t138_C : t138 = copy_via_weak t138_C in +let t139_A : t139 = copy_via_weak t139_A in +let t139_B : t139 = copy_via_weak t139_B in +let t140_A : t140 = copy_via_weak t140_A in +let t141_A : t141 = copy_via_weak t141_A in +let t141_B : t141 = copy_via_weak t141_B in +let t141_C : t141 = copy_via_weak t141_C in +let t141_D : t141 = copy_via_weak t141_D in +let t141_E : t141 = copy_via_weak t141_E in +let t142_A : t142 = copy_via_weak t142_A in +let t142_B : t142 = copy_via_weak t142_B in +let t143_A : t143 = copy_via_weak t143_A in +let t143_B : t143 = copy_via_weak t143_B in +let t143_C : t143 = copy_via_weak t143_C in +let t144_A : t144 = copy_via_weak t144_A in +let t144_B : t144 = copy_via_weak t144_B in +let t144_C : t144 = copy_via_weak t144_C in +let t144_D : t144 = copy_via_weak t144_D in +let t145_A : t145 = copy_via_weak t145_A in +let t145_B : t145 = copy_via_weak t145_B in +let t145_C : t145 = copy_via_weak t145_C in +let t146_A : t146 = copy_via_weak t146_A in +let t146_B : t146 = copy_via_weak t146_B in +let t147_A : t147 = copy_via_weak t147_A in +let t147_B : t147 = copy_via_weak t147_B in +let t147_C : t147 = copy_via_weak t147_C in +let t148_A : t148 = copy_via_weak t148_A in +let t148_B : t148 = copy_via_weak t148_B in +let t148_C : t148 = copy_via_weak t148_C in +let t148_D : t148 = copy_via_weak t148_D in +let t149_A : t149 = copy_via_weak t149_A in +let t149_B : t149 = copy_via_weak t149_B in +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75_A t76_A t76_B t77_A t78_A t78_B t78_C t79_A t79_B t80_A t81_A t81_B t82_A t82_B t82_C t83_A t83_B t84_A t85_A t85_B t85_C t85_D t86_A t86_B t87_A t87_B t87_C t88_A t88_B t89_A t90_A t90_B t90_C t91_A t91_B t91_C t91_D t92_A t92_B t93_A t93_B t93_C t94_A t94_B t95_A t96_A t96_B t97_A t97_B t97_C t98_A t98_B t98_C t98_D t99_A t99_B t100_A t100_B t100_C t101_A t101_B t102_A t103_A t103_B t103_C t104_A t104_B t105_A t105_B t105_C t106_A t106_B t106_C t106_D t107_A t107_B t108_A t108_B t108_C t109_A t109_B t110_A t111_A t111_B t111_C t111_D t112_A t112_B t112_C t113_A t113_B t114_A t114_B t114_C t115_A t115_B t115_C t115_D t116_A t116_B t117_A t117_B t117_C t118_A t118_B t119_A t120_A t120_B t120_C t121_A t121_B t121_C t121_D t122_A t122_B t122_C t123_A t123_B t124_A t124_B t124_C t125_A t125_B t125_C t125_D t126_A t126_B t127_A t127_B t127_C t128_A t128_B t129_A t130_A t130_B t131_A t131_B t131_C t132_A t132_B t132_C t132_D t133_A t133_B t133_C t134_A t134_B t135_A t135_B t135_C t136_A t136_B t136_C t136_D t137_A t137_B t138_A t138_B t138_C t139_A t139_B t140_A t141_A t141_B t141_C t141_D t141_E t142_A t142_B t143_A t143_B t143_C t144_A t144_B t144_C t144_D t145_A t145_B t145_C t146_A t146_B t147_A t147_B t147_C t148_A t148_B t148_C t148_D t149_A t149_B in +print_endline " - Doing GC"; +Gc.full_major (); +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75_A t76_A t76_B t77_A t78_A t78_B t78_C t79_A t79_B t80_A t81_A t81_B t82_A t82_B t82_C t83_A t83_B t84_A t85_A t85_B t85_C t85_D t86_A t86_B t87_A t87_B t87_C t88_A t88_B t89_A t90_A t90_B t90_C t91_A t91_B t91_C t91_D t92_A t92_B t93_A t93_B t93_C t94_A t94_B t95_A t96_A t96_B t97_A t97_B t97_C t98_A t98_B t98_C t98_D t99_A t99_B t100_A t100_B t100_C t101_A t101_B t102_A t103_A t103_B t103_C t104_A t104_B t105_A t105_B t105_C t106_A t106_B t106_C t106_D t107_A t107_B t108_A t108_B t108_C t109_A t109_B t110_A t111_A t111_B t111_C t111_D t112_A t112_B t112_C t113_A t113_B t114_A t114_B t114_C t115_A t115_B t115_C t115_D t116_A t116_B t117_A t117_B t117_C t118_A t118_B t119_A t120_A t120_B t120_C t121_A t121_B t121_C t121_D t122_A t122_B t122_C t123_A t123_B t124_A t124_B t124_C t125_A t125_B t125_C t125_D t126_A t126_B t127_A t127_B t127_C t128_A t128_B t129_A t130_A t130_B t131_A t131_B t131_C t132_A t132_B t132_C t132_D t133_A t133_B t133_C t134_A t134_B t135_A t135_B t135_C t136_A t136_B t136_C t136_D t137_A t137_B t138_A t138_B t138_C t139_A t139_B t140_A t141_A t141_B t141_C t141_D t141_E t142_A t142_B t143_A t143_B t143_C t144_A t144_B t144_C t144_D t145_A t145_B t145_C t146_A t146_B t147_A t147_B t147_C t148_A t148_B t148_C t148_D t149_A t149_B in +print_endline "Copying values via [Obj.with_tag]"; +let t0 : t0 = copy_via_tag t0 in +let t1 : t1 = copy_via_tag t1 in +let t2 : t2 = copy_via_tag t2 in +let t3 : t3 = copy_via_tag t3 in +let t4 : t4 = copy_via_tag t4 in +let t5 : t5 = copy_via_tag t5 in +let t6 : t6 = copy_via_tag t6 in +let t7 : t7 = copy_via_tag t7 in +let t8 : t8 = copy_via_tag t8 in +let t9 : t9 = copy_via_tag t9 in +let t10 : t10 = copy_via_tag t10 in +let t11 : t11 = copy_via_tag t11 in +let t12 : t12 = copy_via_tag t12 in +let t13 : t13 = copy_via_tag t13 in +let t14 : t14 = copy_via_tag t14 in +let t15 : t15 = copy_via_tag t15 in +let t16 : t16 = copy_via_tag t16 in +let t17 : t17 = copy_via_tag t17 in +let t18 : t18 = copy_via_tag t18 in +let t19 : t19 = copy_via_tag t19 in +let t20 : t20 = copy_via_tag t20 in +let t21 : t21 = copy_via_tag t21 in +let t22 : t22 = copy_via_tag t22 in +let t23 : t23 = copy_via_tag t23 in +let t24 : t24 = copy_via_tag t24 in +let t25 : t25 = copy_via_tag t25 in +let t26 : t26 = copy_via_tag t26 in +let t27 : t27 = copy_via_tag t27 in +let t28 : t28 = copy_via_tag t28 in +let t29 : t29 = copy_via_tag t29 in +let t30 : t30 = copy_via_tag t30 in +let t31 : t31 = copy_via_tag t31 in +let t32 : t32 = copy_via_tag t32 in +let t33 : t33 = copy_via_tag t33 in +let t34 : t34 = copy_via_tag t34 in +let t35 : t35 = copy_via_tag t35 in +let t36 : t36 = copy_via_tag t36 in +let t37 : t37 = copy_via_tag t37 in +let t38 : t38 = copy_via_tag t38 in +let t39 : t39 = copy_via_tag t39 in +let t40 : t40 = copy_via_tag t40 in +let t41 : t41 = copy_via_tag t41 in +let t42 : t42 = copy_via_tag t42 in +let t43 : t43 = copy_via_tag t43 in +let t44 : t44 = copy_via_tag t44 in +let t45 : t45 = copy_via_tag t45 in +let t46 : t46 = copy_via_tag t46 in +let t47 : t47 = copy_via_tag t47 in +let t48 : t48 = copy_via_tag t48 in +let t49 : t49 = copy_via_tag t49 in +let t50 : t50 = copy_via_tag t50 in +let t51 : t51 = copy_via_tag t51 in +let t52 : t52 = copy_via_tag t52 in +let t53 : t53 = copy_via_tag t53 in +let t54 : t54 = copy_via_tag t54 in +let t55 : t55 = copy_via_tag t55 in +let t56 : t56 = copy_via_tag t56 in +let t57 : t57 = copy_via_tag t57 in +let t58 : t58 = copy_via_tag t58 in +let t59 : t59 = copy_via_tag t59 in +let t60 : t60 = copy_via_tag t60 in +let t61 : t61 = copy_via_tag t61 in +let t62 : t62 = copy_via_tag t62 in +let t63 : t63 = copy_via_tag t63 in +let t64 : t64 = copy_via_tag t64 in +let t65 : t65 = copy_via_tag t65 in +let t66 : t66 = copy_via_tag t66 in +let t67 : t67 = copy_via_tag t67 in +let t68 : t68 = copy_via_tag t68 in +let t69 : t69 = copy_via_tag t69 in +let t70 : t70 = copy_via_tag t70 in +let t71 : t71 = copy_via_tag t71 in +let t72 : t72 = copy_via_tag t72 in +let t73 : t73 = copy_via_tag t73 in +let t74 : t74 = copy_via_tag t74 in +let t75_A : t75 = copy_via_tag t75_A in +let t76_A : t76 = copy_via_tag t76_A in +let t76_B : t76 = copy_via_tag t76_B in +let t77_A : t77 = copy_via_tag t77_A in +let t78_A : t78 = copy_via_tag t78_A in +let t78_B : t78 = copy_via_tag t78_B in +let t78_C : t78 = copy_via_tag t78_C in +let t79_A : t79 = copy_via_tag t79_A in +let t79_B : t79 = copy_via_tag t79_B in +let t80_A : t80 = copy_via_tag t80_A in +let t81_A : t81 = copy_via_tag t81_A in +let t81_B : t81 = copy_via_tag t81_B in +let t82_A : t82 = copy_via_tag t82_A in +let t82_B : t82 = copy_via_tag t82_B in +let t82_C : t82 = copy_via_tag t82_C in +let t83_A : t83 = copy_via_tag t83_A in +let t83_B : t83 = copy_via_tag t83_B in +let t84_A : t84 = copy_via_tag t84_A in +let t85_A : t85 = copy_via_tag t85_A in +let t85_B : t85 = copy_via_tag t85_B in +let t85_C : t85 = copy_via_tag t85_C in +let t85_D : t85 = copy_via_tag t85_D in +let t86_A : t86 = copy_via_tag t86_A in +let t86_B : t86 = copy_via_tag t86_B in +let t87_A : t87 = copy_via_tag t87_A in +let t87_B : t87 = copy_via_tag t87_B in +let t87_C : t87 = copy_via_tag t87_C in +let t88_A : t88 = copy_via_tag t88_A in +let t88_B : t88 = copy_via_tag t88_B in +let t89_A : t89 = copy_via_tag t89_A in +let t90_A : t90 = copy_via_tag t90_A in +let t90_B : t90 = copy_via_tag t90_B in +let t90_C : t90 = copy_via_tag t90_C in +let t91_A : t91 = copy_via_tag t91_A in +let t91_B : t91 = copy_via_tag t91_B in +let t91_C : t91 = copy_via_tag t91_C in +let t91_D : t91 = copy_via_tag t91_D in +let t92_A : t92 = copy_via_tag t92_A in +let t92_B : t92 = copy_via_tag t92_B in +let t93_A : t93 = copy_via_tag t93_A in +let t93_B : t93 = copy_via_tag t93_B in +let t93_C : t93 = copy_via_tag t93_C in +let t94_A : t94 = copy_via_tag t94_A in +let t94_B : t94 = copy_via_tag t94_B in +let t95_A : t95 = copy_via_tag t95_A in +let t96_A : t96 = copy_via_tag t96_A in +let t96_B : t96 = copy_via_tag t96_B in +let t97_A : t97 = copy_via_tag t97_A in +let t97_B : t97 = copy_via_tag t97_B in +let t97_C : t97 = copy_via_tag t97_C in +let t98_A : t98 = copy_via_tag t98_A in +let t98_B : t98 = copy_via_tag t98_B in +let t98_C : t98 = copy_via_tag t98_C in +let t98_D : t98 = copy_via_tag t98_D in +let t99_A : t99 = copy_via_tag t99_A in +let t99_B : t99 = copy_via_tag t99_B in +let t100_A : t100 = copy_via_tag t100_A in +let t100_B : t100 = copy_via_tag t100_B in +let t100_C : t100 = copy_via_tag t100_C in +let t101_A : t101 = copy_via_tag t101_A in +let t101_B : t101 = copy_via_tag t101_B in +let t102_A : t102 = copy_via_tag t102_A in +let t103_A : t103 = copy_via_tag t103_A in +let t103_B : t103 = copy_via_tag t103_B in +let t103_C : t103 = copy_via_tag t103_C in +let t104_A : t104 = copy_via_tag t104_A in +let t104_B : t104 = copy_via_tag t104_B in +let t105_A : t105 = copy_via_tag t105_A in +let t105_B : t105 = copy_via_tag t105_B in +let t105_C : t105 = copy_via_tag t105_C in +let t106_A : t106 = copy_via_tag t106_A in +let t106_B : t106 = copy_via_tag t106_B in +let t106_C : t106 = copy_via_tag t106_C in +let t106_D : t106 = copy_via_tag t106_D in +let t107_A : t107 = copy_via_tag t107_A in +let t107_B : t107 = copy_via_tag t107_B in +let t108_A : t108 = copy_via_tag t108_A in +let t108_B : t108 = copy_via_tag t108_B in +let t108_C : t108 = copy_via_tag t108_C in +let t109_A : t109 = copy_via_tag t109_A in +let t109_B : t109 = copy_via_tag t109_B in +let t110_A : t110 = copy_via_tag t110_A in +let t111_A : t111 = copy_via_tag t111_A in +let t111_B : t111 = copy_via_tag t111_B in +let t111_C : t111 = copy_via_tag t111_C in +let t111_D : t111 = copy_via_tag t111_D in +let t112_A : t112 = copy_via_tag t112_A in +let t112_B : t112 = copy_via_tag t112_B in +let t112_C : t112 = copy_via_tag t112_C in +let t113_A : t113 = copy_via_tag t113_A in +let t113_B : t113 = copy_via_tag t113_B in +let t114_A : t114 = copy_via_tag t114_A in +let t114_B : t114 = copy_via_tag t114_B in +let t114_C : t114 = copy_via_tag t114_C in +let t115_A : t115 = copy_via_tag t115_A in +let t115_B : t115 = copy_via_tag t115_B in +let t115_C : t115 = copy_via_tag t115_C in +let t115_D : t115 = copy_via_tag t115_D in +let t116_A : t116 = copy_via_tag t116_A in +let t116_B : t116 = copy_via_tag t116_B in +let t117_A : t117 = copy_via_tag t117_A in +let t117_B : t117 = copy_via_tag t117_B in +let t117_C : t117 = copy_via_tag t117_C in +let t118_A : t118 = copy_via_tag t118_A in +let t118_B : t118 = copy_via_tag t118_B in +let t119_A : t119 = copy_via_tag t119_A in +let t120_A : t120 = copy_via_tag t120_A in +let t120_B : t120 = copy_via_tag t120_B in +let t120_C : t120 = copy_via_tag t120_C in +let t121_A : t121 = copy_via_tag t121_A in +let t121_B : t121 = copy_via_tag t121_B in +let t121_C : t121 = copy_via_tag t121_C in +let t121_D : t121 = copy_via_tag t121_D in +let t122_A : t122 = copy_via_tag t122_A in +let t122_B : t122 = copy_via_tag t122_B in +let t122_C : t122 = copy_via_tag t122_C in +let t123_A : t123 = copy_via_tag t123_A in +let t123_B : t123 = copy_via_tag t123_B in +let t124_A : t124 = copy_via_tag t124_A in +let t124_B : t124 = copy_via_tag t124_B in +let t124_C : t124 = copy_via_tag t124_C in +let t125_A : t125 = copy_via_tag t125_A in +let t125_B : t125 = copy_via_tag t125_B in +let t125_C : t125 = copy_via_tag t125_C in +let t125_D : t125 = copy_via_tag t125_D in +let t126_A : t126 = copy_via_tag t126_A in +let t126_B : t126 = copy_via_tag t126_B in +let t127_A : t127 = copy_via_tag t127_A in +let t127_B : t127 = copy_via_tag t127_B in +let t127_C : t127 = copy_via_tag t127_C in +let t128_A : t128 = copy_via_tag t128_A in +let t128_B : t128 = copy_via_tag t128_B in +let t129_A : t129 = copy_via_tag t129_A in +let t130_A : t130 = copy_via_tag t130_A in +let t130_B : t130 = copy_via_tag t130_B in +let t131_A : t131 = copy_via_tag t131_A in +let t131_B : t131 = copy_via_tag t131_B in +let t131_C : t131 = copy_via_tag t131_C in +let t132_A : t132 = copy_via_tag t132_A in +let t132_B : t132 = copy_via_tag t132_B in +let t132_C : t132 = copy_via_tag t132_C in +let t132_D : t132 = copy_via_tag t132_D in +let t133_A : t133 = copy_via_tag t133_A in +let t133_B : t133 = copy_via_tag t133_B in +let t133_C : t133 = copy_via_tag t133_C in +let t134_A : t134 = copy_via_tag t134_A in +let t134_B : t134 = copy_via_tag t134_B in +let t135_A : t135 = copy_via_tag t135_A in +let t135_B : t135 = copy_via_tag t135_B in +let t135_C : t135 = copy_via_tag t135_C in +let t136_A : t136 = copy_via_tag t136_A in +let t136_B : t136 = copy_via_tag t136_B in +let t136_C : t136 = copy_via_tag t136_C in +let t136_D : t136 = copy_via_tag t136_D in +let t137_A : t137 = copy_via_tag t137_A in +let t137_B : t137 = copy_via_tag t137_B in +let t138_A : t138 = copy_via_tag t138_A in +let t138_B : t138 = copy_via_tag t138_B in +let t138_C : t138 = copy_via_tag t138_C in +let t139_A : t139 = copy_via_tag t139_A in +let t139_B : t139 = copy_via_tag t139_B in +let t140_A : t140 = copy_via_tag t140_A in +let t141_A : t141 = copy_via_tag t141_A in +let t141_B : t141 = copy_via_tag t141_B in +let t141_C : t141 = copy_via_tag t141_C in +let t141_D : t141 = copy_via_tag t141_D in +let t141_E : t141 = copy_via_tag t141_E in +let t142_A : t142 = copy_via_tag t142_A in +let t142_B : t142 = copy_via_tag t142_B in +let t143_A : t143 = copy_via_tag t143_A in +let t143_B : t143 = copy_via_tag t143_B in +let t143_C : t143 = copy_via_tag t143_C in +let t144_A : t144 = copy_via_tag t144_A in +let t144_B : t144 = copy_via_tag t144_B in +let t144_C : t144 = copy_via_tag t144_C in +let t144_D : t144 = copy_via_tag t144_D in +let t145_A : t145 = copy_via_tag t145_A in +let t145_B : t145 = copy_via_tag t145_B in +let t145_C : t145 = copy_via_tag t145_C in +let t146_A : t146 = copy_via_tag t146_A in +let t146_B : t146 = copy_via_tag t146_B in +let t147_A : t147 = copy_via_tag t147_A in +let t147_B : t147 = copy_via_tag t147_B in +let t147_C : t147 = copy_via_tag t147_C in +let t148_A : t148 = copy_via_tag t148_A in +let t148_B : t148 = copy_via_tag t148_B in +let t148_C : t148 = copy_via_tag t148_C in +let t148_D : t148 = copy_via_tag t148_D in +let t149_A : t149 = copy_via_tag t149_A in +let t149_B : t149 = copy_via_tag t149_B in +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75_A t76_A t76_B t77_A t78_A t78_B t78_C t79_A t79_B t80_A t81_A t81_B t82_A t82_B t82_C t83_A t83_B t84_A t85_A t85_B t85_C t85_D t86_A t86_B t87_A t87_B t87_C t88_A t88_B t89_A t90_A t90_B t90_C t91_A t91_B t91_C t91_D t92_A t92_B t93_A t93_B t93_C t94_A t94_B t95_A t96_A t96_B t97_A t97_B t97_C t98_A t98_B t98_C t98_D t99_A t99_B t100_A t100_B t100_C t101_A t101_B t102_A t103_A t103_B t103_C t104_A t104_B t105_A t105_B t105_C t106_A t106_B t106_C t106_D t107_A t107_B t108_A t108_B t108_C t109_A t109_B t110_A t111_A t111_B t111_C t111_D t112_A t112_B t112_C t113_A t113_B t114_A t114_B t114_C t115_A t115_B t115_C t115_D t116_A t116_B t117_A t117_B t117_C t118_A t118_B t119_A t120_A t120_B t120_C t121_A t121_B t121_C t121_D t122_A t122_B t122_C t123_A t123_B t124_A t124_B t124_C t125_A t125_B t125_C t125_D t126_A t126_B t127_A t127_B t127_C t128_A t128_B t129_A t130_A t130_B t131_A t131_B t131_C t132_A t132_B t132_C t132_D t133_A t133_B t133_C t134_A t134_B t135_A t135_B t135_C t136_A t136_B t136_C t136_D t137_A t137_B t138_A t138_B t138_C t139_A t139_B t140_A t141_A t141_B t141_C t141_D t141_E t142_A t142_B t143_A t143_B t143_C t144_A t144_B t144_C t144_D t145_A t145_B t145_C t146_A t146_B t147_A t147_B t147_C t148_A t148_B t148_C t148_D t149_A t149_B in +print_endline " - Doing GC"; +Gc.full_major (); +print_endline " - Running checks"; +let () = run_checks t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75_A t76_A t76_B t77_A t78_A t78_B t78_C t79_A t79_B t80_A t81_A t81_B t82_A t82_B t82_C t83_A t83_B t84_A t85_A t85_B t85_C t85_D t86_A t86_B t87_A t87_B t87_C t88_A t88_B t89_A t90_A t90_B t90_C t91_A t91_B t91_C t91_D t92_A t92_B t93_A t93_B t93_C t94_A t94_B t95_A t96_A t96_B t97_A t97_B t97_C t98_A t98_B t98_C t98_D t99_A t99_B t100_A t100_B t100_C t101_A t101_B t102_A t103_A t103_B t103_C t104_A t104_B t105_A t105_B t105_C t106_A t106_B t106_C t106_D t107_A t107_B t108_A t108_B t108_C t109_A t109_B t110_A t111_A t111_B t111_C t111_D t112_A t112_B t112_C t113_A t113_B t114_A t114_B t114_C t115_A t115_B t115_C t115_D t116_A t116_B t117_A t117_B t117_C t118_A t118_B t119_A t120_A t120_B t120_C t121_A t121_B t121_C t121_D t122_A t122_B t122_C t123_A t123_B t124_A t124_B t124_C t125_A t125_B t125_C t125_D t126_A t126_B t127_A t127_B t127_C t128_A t128_B t129_A t130_A t130_B t131_A t131_B t131_C t132_A t132_B t132_C t132_D t133_A t133_B t133_C t134_A t134_B t135_A t135_B t135_C t136_A t136_B t136_C t136_D t137_A t137_B t138_A t138_B t138_C t139_A t139_B t140_A t141_A t141_B t141_C t141_D t141_E t142_A t142_B t143_A t143_B t143_C t144_A t144_B t144_C t144_D t145_A t145_B t145_C t146_A t146_B t147_A t147_B t147_C t148_A t148_B t148_C t148_D t149_A t149_B in + +(* Testing local allocation *) +let go () = + let local_ t0 : t0 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t1 : t1 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t2 : t2 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t3 : t3 = { float0 = create_float (); float_u1 = create_float_u () } in + let local_ t4 : t4 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t5 : t5 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t6 : t6 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t7 : t7 = { float_u0 = create_float_u (); float1 = create_float () } in + let local_ t8 : t8 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t9 : t9 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t10 : t10 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t11 : t11 = { float0 = create_float (); float_u1 = create_float_u (); float_u2 = create_float_u () } in + let local_ t12 : t12 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t13 : t13 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t14 : t14 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t15 : t15 = { float0 = create_float (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t16 : t16 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t17 : t17 = { float_u0 = create_float_u (); float1 = create_float (); float_u2 = create_float_u () } in + let local_ t18 : t18 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t19 : t19 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t20 : t20 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t21 : t21 = { float32_u0 = create_float32_u () } in + let local_ t22 : t22 = { str0 = create_string (); float_u1 = create_float_u () } in + let local_ t23 : t23 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t24 : t24 = { float32_u0 = create_float32_u () } in + let local_ t25 : t25 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t26 : t26 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t27 : t27 = { i32_0 = create_int32_u () } in + let local_ t28 : t28 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t29 : t29 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t30 : t30 = { str0 = create_string (); float32_u1 = create_float32_u () } in + let local_ t31 : t31 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t32 : t32 = { i32_0 = create_int32_u () } in + let local_ t33 : t33 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t34 : t34 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t35 : t35 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t36 : t36 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t37 : t37 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t38 : t38 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t39 : t39 = { i64_0 = create_int64_u () } in + let local_ t40 : t40 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t41 : t41 = { str0 = create_string (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t42 : t42 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t43 : t43 = { float0 = create_float (); float32_u1 = create_float32_u () } in + let local_ t44 : t44 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t45 : t45 = { str0 = create_string (); i32_1 = create_int32_u () } in + let local_ t46 : t46 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t47 : t47 = { i64_0 = create_int64_u () } in + let local_ t48 : t48 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t49 : t49 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t50 : t50 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t51 : t51 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t52 : t52 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t53 : t53 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t54 : t54 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t55 : t55 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t56 : t56 = { n0 = create_nativeint_u () } in + let local_ t57 : t57 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t58 : t58 = { float0 = create_float (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t59 : t59 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t60 : t60 = { str0 = create_string (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t61 : t61 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t62 : t62 = { float0 = create_float (); i32_1 = create_int32_u () } in + let local_ t63 : t63 = { float0 = create_float (); i64_1 = create_int64_u () } in + let local_ t64 : t64 = { str0 = create_string (); i64_1 = create_int64_u () } in + let local_ t65 : t65 = { str0 = create_string (); n1 = create_nativeint_u () } in + let local_ t66 : t66 = { n0 = create_nativeint_u () } in + let local_ t67 : t67 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t68 : t68 = { imm0 = create_int (); str1 = create_string (); float_u2 = create_float_u () } in + let local_ t69 : t69 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t70 : t70 = { float0 = create_float (); str1 = create_string (); float32_u2 = create_float32_u () } in + let local_ t71 : t71 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t72 : t72 = { str0 = create_string (); str1 = create_string (); i32_2 = create_int32_u () } in + let local_ t73 : t73 = { float0 = create_float (); i64_1 = create_int64_u () } in + let local_ t74 : t74 = { float0 = create_float (); i64_1 = create_int64_u () } in + let local_ t75_A : t75 = (A (create_float_u ())) in + let local_ t76_A : t76 = (A (create_float_u ())) in + let local_ t76_B : t76 = (B (create_float_u ())) in + let local_ t77_A : t77 = (A { float_u0 = create_float_u () }) in + let local_ t78_A : t78 = (A (create_float_u ())) in + let local_ t78_B : t78 = (B (create_float_u ())) in + let local_ t78_C : t78 = (C (create_float_u ())) in + let local_ t79_A : t79 = (A { float_u0 = create_float_u () }) in + let local_ t79_B : t79 = (B (create_float_u ())) in + let local_ t80_A : t80 = (A (create_string (), create_float_u ())) in + let local_ t81_A : t81 = (A (create_float_u ())) in + let local_ t81_B : t81 = (B { float_u0 = create_float_u () }) in + let local_ t82_A : t82 = (A { float_u0 = create_float_u () }) in + let local_ t82_B : t82 = (B (create_float_u ())) in + let local_ t82_C : t82 = (C (create_float_u ())) in + let local_ t83_A : t83 = (A (create_string (), create_float_u ())) in + let local_ t83_B : t83 = (B (create_float_u ())) in + let local_ t84_A : t84 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t85_A : t85 = (A (create_float_u ())) in + let local_ t85_B : t85 = (B (create_float_u ())) in + let local_ t85_C : t85 = (C (create_float_u ())) in + let local_ t85_D : t85 = (D (create_float_u ())) in + let local_ t86_A : t86 = (A { float_u0 = create_float_u () }) in + let local_ t86_B : t86 = (B { float_u0 = create_float_u () }) in + let local_ t87_A : t87 = (A (create_string (), create_float_u ())) in + let local_ t87_B : t87 = (B (create_float_u ())) in + let local_ t87_C : t87 = (C (create_float_u ())) in + let local_ t88_A : t88 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t88_B : t88 = (B (create_float_u ())) in + let local_ t89_A : t89 = (A (create_float32_u ())) in + let local_ t90_A : t90 = (A (create_float_u ())) in + let local_ t90_B : t90 = (B { float_u0 = create_float_u () }) in + let local_ t90_C : t90 = (C (create_float_u ())) in + let local_ t91_A : t91 = (A { float_u0 = create_float_u () }) in + let local_ t91_B : t91 = (B (create_float_u ())) in + let local_ t91_C : t91 = (C (create_float_u ())) in + let local_ t91_D : t91 = (D (create_float_u ())) in + let local_ t92_A : t92 = (A (create_string (), create_float_u ())) in + let local_ t92_B : t92 = (B { float_u0 = create_float_u () }) in + let local_ t93_A : t93 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t93_B : t93 = (B (create_float_u ())) in + let local_ t93_C : t93 = (C (create_float_u ())) in + let local_ t94_A : t94 = (A (create_float32_u ())) in + let local_ t94_B : t94 = (B (create_float_u ())) in + let local_ t95_A : t95 = (A { float_u0 = create_float_u () }) in + let local_ t96_A : t96 = (A (create_float_u ())) in + let local_ t96_B : t96 = (B (create_string (), create_float_u ())) in + let local_ t97_A : t97 = (A { float_u0 = create_float_u () }) in + let local_ t97_B : t97 = (B { float_u0 = create_float_u () }) in + let local_ t97_C : t97 = (C (create_float_u ())) in + let local_ t98_A : t98 = (A (create_string (), create_float_u ())) in + let local_ t98_B : t98 = (B (create_float_u ())) in + let local_ t98_C : t98 = (C (create_float_u ())) in + let local_ t98_D : t98 = (D (create_float_u ())) in + let local_ t99_A : t99 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t99_B : t99 = (B { float_u0 = create_float_u () }) in + let local_ t100_A : t100 = (A (create_float32_u ())) in + let local_ t100_B : t100 = (B (create_float_u ())) in + let local_ t100_C : t100 = (C (create_float_u ())) in + let local_ t101_A : t101 = (A { float_u0 = create_float_u () }) in + let local_ t101_B : t101 = (B (create_float_u ())) in + let local_ t102_A : t102 = (A (create_float (), create_float_u ())) in + let local_ t103_A : t103 = (A (create_float_u ())) in + let local_ t103_B : t103 = (B (create_float_u ())) in + let local_ t103_C : t103 = (C { float_u0 = create_float_u () }) in + let local_ t104_A : t104 = (A { float_u0 = create_float_u () }) in + let local_ t104_B : t104 = (B (create_string (), create_float_u ())) in + let local_ t105_A : t105 = (A (create_string (), create_float_u ())) in + let local_ t105_B : t105 = (B { float_u0 = create_float_u () }) in + let local_ t105_C : t105 = (C (create_float_u ())) in + let local_ t106_A : t106 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t106_B : t106 = (B (create_float_u ())) in + let local_ t106_C : t106 = (C (create_float_u ())) in + let local_ t106_D : t106 = (D (create_float_u ())) in + let local_ t107_A : t107 = (A (create_float32_u ())) in + let local_ t107_B : t107 = (B { float_u0 = create_float_u () }) in + let local_ t108_A : t108 = (A { float_u0 = create_float_u () }) in + let local_ t108_B : t108 = (B (create_float_u ())) in + let local_ t108_C : t108 = (C (create_float_u ())) in + let local_ t109_A : t109 = (A (create_float (), create_float_u ())) in + let local_ t109_B : t109 = (B (create_float_u ())) in + let local_ t110_A : t110 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t111_A : t111 = (A (create_float_u ())) in + let local_ t111_B : t111 = (B { float_u0 = create_float_u () }) in + let local_ t111_C : t111 = (C (create_float_u ())) in + let local_ t111_D : t111 = (D (create_float_u ())) in + let local_ t112_A : t112 = (A { float_u0 = create_float_u () }) in + let local_ t112_B : t112 = (B (create_float_u ())) in + let local_ t112_C : t112 = (C { float_u0 = create_float_u () }) in + let local_ t113_A : t113 = (A (create_string (), create_float_u ())) in + let local_ t113_B : t113 = (B (create_string (), create_float_u ())) in + let local_ t114_A : t114 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t114_B : t114 = (B { float_u0 = create_float_u () }) in + let local_ t114_C : t114 = (C (create_float_u ())) in + let local_ t115_A : t115 = (A (create_float32_u ())) in + let local_ t115_B : t115 = (B (create_float_u ())) in + let local_ t115_C : t115 = (C (create_float_u ())) in + let local_ t115_D : t115 = (D (create_float_u ())) in + let local_ t116_A : t116 = (A { float_u0 = create_float_u () }) in + let local_ t116_B : t116 = (B { float_u0 = create_float_u () }) in + let local_ t117_A : t117 = (A (create_float (), create_float_u ())) in + let local_ t117_B : t117 = (B (create_float_u ())) in + let local_ t117_C : t117 = (C (create_float_u ())) in + let local_ t118_A : t118 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t118_B : t118 = (B (create_float_u ())) in + let local_ t119_A : t119 = (A (create_string (), create_float32_u ())) in + let local_ t120_A : t120 = (A (create_float_u ())) in + let local_ t120_B : t120 = (B (create_string (), create_float_u ())) in + let local_ t120_C : t120 = (C (create_float_u ())) in + let local_ t121_A : t121 = (A { float_u0 = create_float_u () }) in + let local_ t121_B : t121 = (B { float_u0 = create_float_u () }) in + let local_ t121_C : t121 = (C (create_float_u ())) in + let local_ t121_D : t121 = (D (create_float_u ())) in + let local_ t122_A : t122 = (A (create_string (), create_float_u ())) in + let local_ t122_B : t122 = (B (create_float_u ())) in + let local_ t122_C : t122 = (C { float_u0 = create_float_u () }) in + let local_ t123_A : t123 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t123_B : t123 = (B (create_string (), create_float_u ())) in + let local_ t124_A : t124 = (A (create_float32_u ())) in + let local_ t124_B : t124 = (B { float_u0 = create_float_u () }) in + let local_ t124_C : t124 = (C (create_float_u ())) in + let local_ t125_A : t125 = (A { float_u0 = create_float_u () }) in + let local_ t125_B : t125 = (B (create_float_u ())) in + let local_ t125_C : t125 = (C (create_float_u ())) in + let local_ t125_D : t125 = (D (create_float_u ())) in + let local_ t126_A : t126 = (A (create_float (), create_float_u ())) in + let local_ t126_B : t126 = (B { float_u0 = create_float_u () }) in + let local_ t127_A : t127 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t127_B : t127 = (B (create_float_u ())) in + let local_ t127_C : t127 = (C (create_float_u ())) in + let local_ t128_A : t128 = (A (create_string (), create_float32_u ())) in + let local_ t128_B : t128 = (B (create_float_u ())) in + let local_ t129_A : t129 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t130_A : t130 = (A (create_float_u ())) in + let local_ t130_B : t130 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t131_A : t131 = (A { float_u0 = create_float_u () }) in + let local_ t131_B : t131 = (B (create_string (), create_float_u ())) in + let local_ t131_C : t131 = (C (create_float_u ())) in + let local_ t132_A : t132 = (A (create_string (), create_float_u ())) in + let local_ t132_B : t132 = (B { float_u0 = create_float_u () }) in + let local_ t132_C : t132 = (C (create_float_u ())) in + let local_ t132_D : t132 = (D (create_float_u ())) in + let local_ t133_A : t133 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t133_B : t133 = (B (create_float_u ())) in + let local_ t133_C : t133 = (C { float_u0 = create_float_u () }) in + let local_ t134_A : t134 = (A (create_float32_u ())) in + let local_ t134_B : t134 = (B (create_string (), create_float_u ())) in + let local_ t135_A : t135 = (A { float_u0 = create_float_u () }) in + let local_ t135_B : t135 = (B { float_u0 = create_float_u () }) in + let local_ t135_C : t135 = (C (create_float_u ())) in + let local_ t136_A : t136 = (A (create_float (), create_float_u ())) in + let local_ t136_B : t136 = (B (create_float_u ())) in + let local_ t136_C : t136 = (C (create_float_u ())) in + let local_ t136_D : t136 = (D (create_float_u ())) in + let local_ t137_A : t137 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t137_B : t137 = (B { float_u0 = create_float_u () }) in + let local_ t138_A : t138 = (A (create_string (), create_float32_u ())) in + let local_ t138_B : t138 = (B (create_float_u ())) in + let local_ t138_C : t138 = (C (create_float_u ())) in + let local_ t139_A : t139 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t139_B : t139 = (B (create_float_u ())) in + let local_ t140_A : t140 = (A (create_int32_u ())) in + let local_ t141_A : t141 = (A (create_float_u ())) in + let local_ t141_B : t141 = (B (create_float_u ())) in + let local_ t141_C : t141 = (C (create_float_u ())) in + let local_ t141_D : t141 = (D (create_float_u ())) in + let local_ t141_E : t141 = (E (create_float_u ())) in + let local_ t142_A : t142 = (A { float_u0 = create_float_u () }) in + let local_ t142_B : t142 = (B { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t143_A : t143 = (A (create_string (), create_float_u ())) in + let local_ t143_B : t143 = (B (create_string (), create_float_u ())) in + let local_ t143_C : t143 = (C (create_float_u ())) in + let local_ t144_A : t144 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t144_B : t144 = (B { float_u0 = create_float_u () }) in + let local_ t144_C : t144 = (C (create_float_u ())) in + let local_ t144_D : t144 = (D (create_float_u ())) in + let local_ t145_A : t145 = (A (create_float32_u ())) in + let local_ t145_B : t145 = (B (create_float_u ())) in + let local_ t145_C : t145 = (C { float_u0 = create_float_u () }) in + let local_ t146_A : t146 = (A { float_u0 = create_float_u () }) in + let local_ t146_B : t146 = (B (create_string (), create_float_u ())) in + let local_ t147_A : t147 = (A (create_float (), create_float_u ())) in + let local_ t147_B : t147 = (B { float_u0 = create_float_u () }) in + let local_ t147_C : t147 = (C (create_float_u ())) in + let local_ t148_A : t148 = (A { str0 = create_string (); float_u1 = create_float_u () }) in + let local_ t148_B : t148 = (B (create_float_u ())) in + let local_ t148_C : t148 = (C (create_float_u ())) in + let local_ t148_D : t148 = (D (create_float_u ())) in + let local_ t149_A : t149 = (A (create_string (), create_float32_u ())) in + let local_ t149_B : t149 = (B { float_u0 = create_float_u () }) in + print_endline " - Doing GC"; + Gc.full_major (); + opaque_ignore t0; + opaque_ignore t1; + opaque_ignore t2; + opaque_ignore t3; + opaque_ignore t4; + opaque_ignore t5; + opaque_ignore t6; + opaque_ignore t7; + opaque_ignore t8; + opaque_ignore t9; + opaque_ignore t10; + opaque_ignore t11; + opaque_ignore t12; + opaque_ignore t13; + opaque_ignore t14; + opaque_ignore t15; + opaque_ignore t16; + opaque_ignore t17; + opaque_ignore t18; + opaque_ignore t19; + opaque_ignore t20; + opaque_ignore t21; + opaque_ignore t22; + opaque_ignore t23; + opaque_ignore t24; + opaque_ignore t25; + opaque_ignore t26; + opaque_ignore t27; + opaque_ignore t28; + opaque_ignore t29; + opaque_ignore t30; + opaque_ignore t31; + opaque_ignore t32; + opaque_ignore t33; + opaque_ignore t34; + opaque_ignore t35; + opaque_ignore t36; + opaque_ignore t37; + opaque_ignore t38; + opaque_ignore t39; + opaque_ignore t40; + opaque_ignore t41; + opaque_ignore t42; + opaque_ignore t43; + opaque_ignore t44; + opaque_ignore t45; + opaque_ignore t46; + opaque_ignore t47; + opaque_ignore t48; + opaque_ignore t49; + opaque_ignore t50; + opaque_ignore t51; + opaque_ignore t52; + opaque_ignore t53; + opaque_ignore t54; + opaque_ignore t55; + opaque_ignore t56; + opaque_ignore t57; + opaque_ignore t58; + opaque_ignore t59; + opaque_ignore t60; + opaque_ignore t61; + opaque_ignore t62; + opaque_ignore t63; + opaque_ignore t64; + opaque_ignore t65; + opaque_ignore t66; + opaque_ignore t67; + opaque_ignore t68; + opaque_ignore t69; + opaque_ignore t70; + opaque_ignore t71; + opaque_ignore t72; + opaque_ignore t73; + opaque_ignore t74; + opaque_ignore t75_A; + opaque_ignore t76_A; + opaque_ignore t76_B; + opaque_ignore t77_A; + opaque_ignore t78_A; + opaque_ignore t78_B; + opaque_ignore t78_C; + opaque_ignore t79_A; + opaque_ignore t79_B; + opaque_ignore t80_A; + opaque_ignore t81_A; + opaque_ignore t81_B; + opaque_ignore t82_A; + opaque_ignore t82_B; + opaque_ignore t82_C; + opaque_ignore t83_A; + opaque_ignore t83_B; + opaque_ignore t84_A; + opaque_ignore t85_A; + opaque_ignore t85_B; + opaque_ignore t85_C; + opaque_ignore t85_D; + opaque_ignore t86_A; + opaque_ignore t86_B; + opaque_ignore t87_A; + opaque_ignore t87_B; + opaque_ignore t87_C; + opaque_ignore t88_A; + opaque_ignore t88_B; + opaque_ignore t89_A; + opaque_ignore t90_A; + opaque_ignore t90_B; + opaque_ignore t90_C; + opaque_ignore t91_A; + opaque_ignore t91_B; + opaque_ignore t91_C; + opaque_ignore t91_D; + opaque_ignore t92_A; + opaque_ignore t92_B; + opaque_ignore t93_A; + opaque_ignore t93_B; + opaque_ignore t93_C; + opaque_ignore t94_A; + opaque_ignore t94_B; + opaque_ignore t95_A; + opaque_ignore t96_A; + opaque_ignore t96_B; + opaque_ignore t97_A; + opaque_ignore t97_B; + opaque_ignore t97_C; + opaque_ignore t98_A; + opaque_ignore t98_B; + opaque_ignore t98_C; + opaque_ignore t98_D; + opaque_ignore t99_A; + opaque_ignore t99_B; + opaque_ignore t100_A; + opaque_ignore t100_B; + opaque_ignore t100_C; + opaque_ignore t101_A; + opaque_ignore t101_B; + opaque_ignore t102_A; + opaque_ignore t103_A; + opaque_ignore t103_B; + opaque_ignore t103_C; + opaque_ignore t104_A; + opaque_ignore t104_B; + opaque_ignore t105_A; + opaque_ignore t105_B; + opaque_ignore t105_C; + opaque_ignore t106_A; + opaque_ignore t106_B; + opaque_ignore t106_C; + opaque_ignore t106_D; + opaque_ignore t107_A; + opaque_ignore t107_B; + opaque_ignore t108_A; + opaque_ignore t108_B; + opaque_ignore t108_C; + opaque_ignore t109_A; + opaque_ignore t109_B; + opaque_ignore t110_A; + opaque_ignore t111_A; + opaque_ignore t111_B; + opaque_ignore t111_C; + opaque_ignore t111_D; + opaque_ignore t112_A; + opaque_ignore t112_B; + opaque_ignore t112_C; + opaque_ignore t113_A; + opaque_ignore t113_B; + opaque_ignore t114_A; + opaque_ignore t114_B; + opaque_ignore t114_C; + opaque_ignore t115_A; + opaque_ignore t115_B; + opaque_ignore t115_C; + opaque_ignore t115_D; + opaque_ignore t116_A; + opaque_ignore t116_B; + opaque_ignore t117_A; + opaque_ignore t117_B; + opaque_ignore t117_C; + opaque_ignore t118_A; + opaque_ignore t118_B; + opaque_ignore t119_A; + opaque_ignore t120_A; + opaque_ignore t120_B; + opaque_ignore t120_C; + opaque_ignore t121_A; + opaque_ignore t121_B; + opaque_ignore t121_C; + opaque_ignore t121_D; + opaque_ignore t122_A; + opaque_ignore t122_B; + opaque_ignore t122_C; + opaque_ignore t123_A; + opaque_ignore t123_B; + opaque_ignore t124_A; + opaque_ignore t124_B; + opaque_ignore t124_C; + opaque_ignore t125_A; + opaque_ignore t125_B; + opaque_ignore t125_C; + opaque_ignore t125_D; + opaque_ignore t126_A; + opaque_ignore t126_B; + opaque_ignore t127_A; + opaque_ignore t127_B; + opaque_ignore t127_C; + opaque_ignore t128_A; + opaque_ignore t128_B; + opaque_ignore t129_A; + opaque_ignore t130_A; + opaque_ignore t130_B; + opaque_ignore t131_A; + opaque_ignore t131_B; + opaque_ignore t131_C; + opaque_ignore t132_A; + opaque_ignore t132_B; + opaque_ignore t132_C; + opaque_ignore t132_D; + opaque_ignore t133_A; + opaque_ignore t133_B; + opaque_ignore t133_C; + opaque_ignore t134_A; + opaque_ignore t134_B; + opaque_ignore t135_A; + opaque_ignore t135_B; + opaque_ignore t135_C; + opaque_ignore t136_A; + opaque_ignore t136_B; + opaque_ignore t136_C; + opaque_ignore t136_D; + opaque_ignore t137_A; + opaque_ignore t137_B; + opaque_ignore t138_A; + opaque_ignore t138_B; + opaque_ignore t138_C; + opaque_ignore t139_A; + opaque_ignore t139_B; + opaque_ignore t140_A; + opaque_ignore t141_A; + opaque_ignore t141_B; + opaque_ignore t141_C; + opaque_ignore t141_D; + opaque_ignore t141_E; + opaque_ignore t142_A; + opaque_ignore t142_B; + opaque_ignore t143_A; + opaque_ignore t143_B; + opaque_ignore t143_C; + opaque_ignore t144_A; + opaque_ignore t144_B; + opaque_ignore t144_C; + opaque_ignore t144_D; + opaque_ignore t145_A; + opaque_ignore t145_B; + opaque_ignore t145_C; + opaque_ignore t146_A; + opaque_ignore t146_B; + opaque_ignore t147_A; + opaque_ignore t147_B; + opaque_ignore t147_C; + opaque_ignore t148_A; + opaque_ignore t148_B; + opaque_ignore t148_C; + opaque_ignore t148_D; + opaque_ignore t149_A; + opaque_ignore t149_B; + () +in +print_endline "Testing local allocations"; +go ();; +let () = run ();; diff --git a/testsuite/tests/mixed-blocks/generated_native_test.reference b/testsuite/tests/mixed-blocks/generated_native_test.reference new file mode 100644 index 00000000000..7abb513fe98 --- /dev/null +++ b/testsuite/tests/mixed-blocks/generated_native_test.reference @@ -0,0 +1,46 @@ +Creating values + - Doing GC +Copying values using [with] record update + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] + - Doing GC + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] +Copying values via [Stdlib.Weak] + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] + - Doing GC + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] +Copying values via [Obj.with_tag] + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] + - Doing GC + - Running checks + - Marshaling + - Hashing + - Comparing + - Checking field values + - Checking [Obj.reachable_words] +Testing local allocations + - Doing GC diff --git a/testsuite/tests/mixed-blocks/hash.ml b/testsuite/tests/mixed-blocks/hash.ml new file mode 100644 index 00000000000..8bded683ae1 --- /dev/null +++ b/testsuite/tests/mixed-blocks/hash.ml @@ -0,0 +1,84 @@ +(* TEST + flags = "-extension layouts_beta"; + flambda2; + { + native; + }{ + bytecode; + } +*) +let hash x = + match Hashtbl.hash x with + | exception exn -> Printf.sprintf "raised %s" (Printexc.to_string exn) + | i -> string_of_int i + +let printf = Printf.printf + +let () = printf "All Float Mixed Records\n" + +let () = + let open struct + type t = + { x : float; + y : float#; + } + end in + hash { x = 4.0; y = #5.1 } + |> printf "\t{ x : float; y : float# } = %s\n" + + +let () = + let open struct + type t = + { x : float#; + y : float; + } + end in + hash { x = #4.0; y = 5.1 } + |> printf "\t{ x : float#; y : float } = %s\n" + +let () = printf "General Mixed Records\n" + + +let () = + let open struct + type t = + { x : string; + y : float#; + } + end in + hash { x = "abc"; y = #5.1 } + |> printf "\t{ x : string; y : float# } = %s\n" + +let () = + let open struct + type t = + { x : int; + y : float#; + } + end in + hash { x = 23940; y = #5.1 } + |> printf "\t{ x : int; y : float# } = %s\n" + +let () = + let open struct + type t = + { x : int; + y : float#; + z : int; + } + end in + hash { x = 23940; y = #5.1; z = 1340 } + |> printf "\t{ x : int; y : float#; z : int } = %s\n" + +let () = + let open struct + type t = + { a : string; + x : int; + y : float#; + z : int; + } + end in + hash { a = "abc"; x = 23940; y = #5.1; z = 1340 } + |> printf "\t{ a : string; x : int; y : float#; z : int } = %s\n" diff --git a/testsuite/tests/mixed-blocks/hash.reference b/testsuite/tests/mixed-blocks/hash.reference new file mode 100644 index 00000000000..4e28bb0c0c1 --- /dev/null +++ b/testsuite/tests/mixed-blocks/hash.reference @@ -0,0 +1,8 @@ +All Float Mixed Records + { x : float; y : float# } = raised Invalid_argument("hash: mixed block value") + { x : float#; y : float } = raised Invalid_argument("hash: mixed block value") +General Mixed Records + { x : string; y : float# } = raised Invalid_argument("hash: mixed block value") + { x : int; y : float# } = raised Invalid_argument("hash: mixed block value") + { x : int; y : float#; z : int } = raised Invalid_argument("hash: mixed block value") + { a : string; x : int; y : float#; z : int } = raised Invalid_argument("hash: mixed block value") diff --git a/testsuite/tests/mixed-blocks/recursive_mixed_blocks.ml b/testsuite/tests/mixed-blocks/recursive_mixed_blocks.ml new file mode 100644 index 00000000000..903eb66c868 --- /dev/null +++ b/testsuite/tests/mixed-blocks/recursive_mixed_blocks.ml @@ -0,0 +1,23 @@ +(* TEST + flags = "-extension layouts_beta"; + flambda2; + { + native; + }{ + bytecode; + } +*) + +type t = { t : t; flt : float# } + +(* Run Gc.full_major while constructing [t] so that it is promoted + to the major heap. This ensures that the [caml_modify] run as part + of [caml_update_dummy] actually does some interesting work. +*) + +let rec t = + { t; + flt = (Gc.full_major (); #0.); + };; + +let (_ : t) = Sys.opaque_identity t diff --git a/testsuite/tests/mixed-blocks/structural_constants.ml b/testsuite/tests/mixed-blocks/structural_constants.ml new file mode 100644 index 00000000000..c6f409d5204 --- /dev/null +++ b/testsuite/tests/mixed-blocks/structural_constants.ml @@ -0,0 +1,89 @@ +(* TEST + flambda2; + flags="-extension layouts_beta"; + { bytecode; } + { native; } +*) + +type r1 = { x1 : string; y1 : float#; } +type r2 = { x2 : string; y2 : float#; z2 : int } + +type v = + | A of float# + | B of string * float# + | C of string * float# * int + | D of string + +let r1 = { x1 = "x1"; y1 = #1.0 } +let create_r1 () = { x1 = "x1"; y1 = #1.0 } + +let r2 = { x2 = "x2"; y2 = #2.0; z2 = 5 } +let create_r2 () = { x2 = "x2"; y2 = #2.0; z2 = 5 } + +let a = A #5.0 +let create_a () = A #5.0 + +let vs = [A #4.0; B ("B", #5.0); C ("C", #6.0, 6); D "hey"] +let create_vs () = [A #4.0; B ("B", #5.0); C ("C", #6.0, 6); D "hey"] + +let () = print_endline "Testing pattern matching..." + +let () = + let { x1 = "x1"; y1 = #1.0 } = r1 in + let { x1 = "x1"; y1 = #1.0 } = create_r1 () in + let { x1 = "x1"; y1 = #1.0 } = Sys.opaque_identity r1 in + let { x1 = "x1"; y1 = #1.0 } = Sys.opaque_identity (create_r1 ()) in + let { x2 = "x2"; y2 = #2.0; z2 = 5 } = r2 in + let { x2 = "x2"; y2 = #2.0; z2 = 5 } = create_r2 () in + let { x2 = "x2"; y2 = #2.0; z2 = 5 } = Sys.opaque_identity r2 in + let { x2 = "x2"; y2 = #2.0; z2 = 5 } = Sys.opaque_identity (create_r2 ()) in + let A #5.0 = a in + let A #5.0 = create_a () in + let A #5.0 = Sys.opaque_identity a in + let A #5.0 = Sys.opaque_identity (create_a ()) in + let [A #4.0; B ("B", #5.0); C ("C", #6.0, 6); D "hey"] = vs in + let [A #4.0; B ("B", #5.0); C ("C", #6.0, 6); D "hey"] = create_vs () in + let [A #4.0; B ("B", #5.0); C ("C", #6.0, 6); D "hey"] = + Sys.opaque_identity vs + in + let [A #4.0; B ("B", #5.0); C ("C", #6.0, 6); D "hey"] = + Sys.opaque_identity (create_vs ()) + in + () +[@@warning "-partial-match"] +;; + +let () = print_endline "Success!" + +let () = print_endline "Testing optimization (this is a no-op in bytecode)..." + +let () = + (* Both classic mode and optimized mode should be able to statically + allocate the inconstant list. *) + let s = Sys.opaque_identity "foo" in + let bytes_start0 = Gc.allocated_bytes () in + let bytes_start1 = Gc.allocated_bytes () in + let _ = + Sys.opaque_identity [A #4.0; B ("B", #5.0); C ("C", #6.0, 6); D s] + in + match Sys.backend_type with + | Bytecode -> () + | Native | Other _ -> + (* Need to guard against: + - Removal of duplicate immutable block allocations after inlining + - Discovery of the semantics of functions via result types + Wrapping the closures themselves in [opaque_identity] does this. + *) + let bytes_end = Gc.allocated_bytes () in + assert (bytes_start0 +. bytes_end = 2. *. bytes_start1); + assert ((Sys.opaque_identity create_r1) () + == (Sys.opaque_identity create_r1 ())); + assert ((Sys.opaque_identity create_r2) () + == (Sys.opaque_identity create_r2) ()); + assert ((Sys.opaque_identity create_a) () + == (Sys.opaque_identity create_a) ()); + assert ((Sys.opaque_identity create_vs) () + == (Sys.opaque_identity create_vs) ()) +;; + +let () = print_endline "Success!" diff --git a/testsuite/tests/mixed-blocks/structural_constants.reference b/testsuite/tests/mixed-blocks/structural_constants.reference new file mode 100644 index 00000000000..4fab63a1617 --- /dev/null +++ b/testsuite/tests/mixed-blocks/structural_constants.reference @@ -0,0 +1,4 @@ +Testing pattern matching... +Success! +Testing optimization (this is a no-op in bytecode)... +Success! diff --git a/testsuite/tests/mixed-blocks/test.ml b/testsuite/tests/mixed-blocks/test.ml new file mode 100644 index 00000000000..194536833d9 --- /dev/null +++ b/testsuite/tests/mixed-blocks/test.ml @@ -0,0 +1,37 @@ +(* TEST + readonly_files = "generate_mixed_blocks_code.ml"; + (* Generate the bytecode/native code versions of + [generate_mixed_blocks_code.ml]. This doesn't actually run the test; + it just updates the generated test program (which is separately + run by the test harness). + *) + + { + (* First, native code. We test fewer mixed records in native code + than bytecode because the bottleneck for this test's runtime + is ocamlopt compilation time. + *) + setup-ocamlopt.opt-build-env; + program = "${test_source_directory}/generate.out"; + all_modules = "generate_mixed_blocks_code.ml"; + ocamlopt.opt; + arguments = "75 native"; + output = "${test_source_directory}/generated_native_test.ml.corrected"; + run; + output = "${test_source_directory}/generated_native_test.ml.corrected"; + reference = "${test_source_directory}/generated_native_test.ml"; + check-program-output; + }{ + (* Next, bytecode. *) + setup-ocamlopt.opt-build-env; + program = "${test_source_directory}/generate.out"; + all_modules = "generate_mixed_blocks_code.ml"; + ocamlopt.opt; + arguments = "300 byte"; + output = "${test_source_directory}/generated_byte_test.ml.corrected"; + run; + output = "${test_source_directory}/generated_byte_test.ml.corrected"; + reference = "${test_source_directory}/generated_byte_test.ml"; + check-program-output; + } +*) diff --git a/testsuite/tests/mixed-blocks/test_mixed_blocks.ml b/testsuite/tests/mixed-blocks/test_mixed_blocks.ml new file mode 100644 index 00000000000..b7650e7a053 --- /dev/null +++ b/testsuite/tests/mixed-blocks/test_mixed_blocks.ml @@ -0,0 +1,277 @@ +(* TEST + flambda2; + include stdlib_upstream_compatible; + { + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(*****************************************) +(* Prelude: Functions on unboxed numbers *) + +module Float_u = Stdlib_upstream_compatible.Float_u +module Int32_u = Stdlib_upstream_compatible.Int32_u +module Int64_u = Stdlib_upstream_compatible.Int64_u +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u + +(******************************) +(* Test: large mixed blocks *) + +(* Allocations of large-enough blocks go through a different code path in the + backend and runtime. This mixed block is larger than that threshold. + *) + +type uf = float# +type i32 = int32# +type i64 = int64# +type i_n = nativeint# +type t_large = + { x : string; + f1 : uf; f2 : i_n; f3 : uf; f4 : uf; f5 : uf; f6 : uf; f7 : uf; + f8 : i32; f9 : i64; f10 : uf; f11 : uf; f12 : i_n; f13 : uf; f14 : uf; + f15 : uf; f16 : uf; f17 : uf; f18 : i32; f19 : i64; f20 : uf; f21 : uf; + f22 : i_n; f23 : uf; f24 : uf; f25 : uf; f26 : uf; f27 : uf; f28 : i32; + f29 : i64; f30 : uf; f31 : uf; f32 : i_n; f33 : uf; f34 : uf; f35 : uf; + f36 : uf; f37 : uf; f38 : i32; f39 : i64; f40 : uf; f41 : uf; f42 : i_n; + f43 : uf; f44 : uf; f45 : uf; f46 : uf; f47 : uf; f48 : i32; f49 : i64; + f50 : uf; f51 : uf; f52 : i_n; f53 : uf; f54 : uf; f55 : uf; f56 : uf; + f57 : uf; f58 : i32; f59 : i64; f60 : uf; f61 : uf; f62 : i_n; f63 : uf; + f64 : uf; f65 : uf; f66 : uf; f67 : uf; f68 : i32; f69 : i64; f70 : uf; + f71 : uf; f72 : i_n; f73 : uf; f74 : uf; f75 : uf; f76 : uf; f77 : uf; + f78 : i32; f79 : i64; f80 : uf; f81 : uf; f82 : i_n; f83 : uf; f84 : uf; + f85 : uf; f86 : uf; f87 : uf; f88 : i32; f89 : i64; f90 : uf; f91 : uf; + f92 : i_n; f93 : uf; f94 : uf; f95 : uf; f96 : uf; f97 : uf; f98 : i32; + f99 : i64; f100 : uf; f101 : uf; f102 : i_n; f103 : uf; f104 : uf; f105 : uf; + f106 : uf; f107 : uf; f108 : i32; f109 : i64; f110 : uf; f111 : uf; f112 : i_n; + f113 : uf; f114 : uf; f115 : uf; f116 : uf; f117 : uf; f118 : i32; f119 : i64; + f120 : uf; f121 : uf; f122 : i_n; f123 : uf; f124 : uf; f125 : uf; f126 : uf; + f127 : uf; f128 : i32; f129 : i64; f130 : uf; f131 : uf; f132 : i_n; f133 : uf; + f134 : uf; f135 : uf; f136 : uf; f137 : uf; f138 : i32; f139 : i64; f140 : uf; + f141 : uf; f142 : i_n; f143 : uf; f144 : uf; f145 : uf; f146 : uf; f147 : uf; + f148 : i32; f149 : i64; f150 : uf; f151 : uf; f152 : i_n; f153 : uf; f154 : uf; + f155 : uf; f156 : uf; f157 : uf; f158 : i32; f159 : i64; f160 : uf; f161 : uf; + f162 : i_n; f163 : uf; f164 : uf; f165 : uf; f166 : uf; f167 : uf; f168 : i32; + f169 : i64; f170 : uf; f171 : uf; f172 : i_n; f173 : uf; f174 : uf; f175 : uf; + f176 : uf; f177 : uf; f178 : i32; f179 : i64; f180 : uf; f181 : uf; f182 : i_n; + f183 : uf; f184 : uf; f185 : uf; f186 : uf; f187 : uf; f188 : i32; f189 : i64; + f190 : uf; f191 : uf; f192 : i_n; f193 : uf; f194 : uf; f195 : uf; f196 : uf; + f197 : uf; f198 : i32; f199 : i64; f200 : uf; f201 : uf; f202 : i_n; f203 : uf; + f204 : uf; f205 : uf; f206 : uf; f207 : uf; f208 : i32; f209 : i64; f210 : uf; + f211 : uf; f212 : i_n; f213 : uf; f214 : uf; f215 : uf; f216 : uf; f217 : uf; + f218 : i32; f219 : i64; f220 : uf; f221 : uf; f222 : i_n; f223 : uf; f224 : uf; + f225 : uf; f226 : uf; f227 : uf; f228 : i32; f229 : i64; f230 : uf; f231 : uf; + f232 : i_n; f233 : uf; f234 : uf; f235 : uf; f236 : uf; f237 : uf; f238 : i32; + f239 : i64; f240 : uf; f241 : uf; f242 : i_n; f243 : uf; f244 : uf; f245 : uf; + f246 : uf; f247 : uf; f248 : i32; f249 : i64; f250 : uf; f251 : uf; f252 : i_n; + f253 : uf; f254 : uf; f255 : uf; f256 : uf; f257 : uf; f258 : i32; f259 : i64; + } + +let create_large f i32 i64 i_n = + { x = "prefix"; + f1=f 1;f2=i_n 2;f3=f 3;f4=f 4;f5=f 5;f6=f 6;f7=f 7; + f8=i32 8;f9=i64 9;f10=f 10;f11=f 11;f12=i_n 12;f13=f 13;f14=f 14; + f15=f 15;f16=f 16;f17=f 17;f18=i32 18;f19=i64 19;f20=f 20;f21=f 21; + f22=i_n 22;f23=f 23;f24=f 24;f25=f 25;f26=f 26;f27=f 27;f28=i32 28; + f29=i64 29;f30=f 30;f31=f 31;f32=i_n 32;f33=f 33;f34=f 34;f35=f 35; + f36=f 36;f37=f 37;f38=i32 38;f39=i64 39;f40=f 40;f41=f 41;f42=i_n 42; + f43=f 43;f44=f 44;f45=f 45;f46=f 46;f47=f 47;f48=i32 48;f49=i64 49; + f50=f 50;f51=f 51;f52=i_n 52;f53=f 53;f54=f 54;f55=f 55;f56=f 56; + f57=f 57;f58=i32 58;f59=i64 59;f60=f 60;f61=f 61;f62=i_n 62;f63=f 63; + f64=f 64;f65=f 65;f66=f 66;f67=f 67;f68=i32 68;f69=i64 69;f70=f 70; + f71=f 71;f72=i_n 72;f73=f 73;f74=f 74;f75=f 75;f76=f 76;f77=f 77; + f78=i32 78;f79=i64 79;f80=f 80;f81=f 81;f82=i_n 82;f83=f 83;f84=f 84; + f85=f 85;f86=f 86;f87=f 87;f88=i32 88;f89=i64 89;f90=f 90;f91=f 91; + f92=i_n 92;f93=f 93;f94=f 94;f95=f 95;f96=f 96;f97=f 97;f98=i32 98; + f99=i64 99;f100=f 100;f101=f 101;f102=i_n 102;f103=f 103;f104=f 104;f105=f 105; + f106=f 106;f107=f 107;f108=i32 108;f109=i64 109;f110=f 110;f111=f 111;f112=i_n 112; + f113=f 113;f114=f 114;f115=f 115;f116=f 116;f117=f 117;f118=i32 118;f119=i64 119; + f120=f 120;f121=f 121;f122=i_n 122;f123=f 123;f124=f 124;f125=f 125;f126=f 126; + f127=f 127;f128=i32 128;f129=i64 129;f130=f 130;f131=f 131;f132=i_n 132;f133=f 133; + f134=f 134;f135=f 135;f136=f 136;f137=f 137;f138=i32 138;f139=i64 139;f140=f 140; + f141=f 141;f142=i_n 142;f143=f 143;f144=f 144;f145=f 145;f146=f 146;f147=f 147; + f148=i32 148;f149=i64 149;f150=f 150;f151=f 151;f152=i_n 152;f153=f 153;f154=f 154; + f155=f 155;f156=f 156;f157=f 157;f158=i32 158;f159=i64 159;f160=f 160;f161=f 161; + f162=i_n 162;f163=f 163;f164=f 164;f165=f 165;f166=f 166;f167=f 167;f168=i32 168; + f169=i64 169;f170=f 170;f171=f 171;f172=i_n 172;f173=f 173;f174=f 174;f175=f 175; + f176=f 176;f177=f 177;f178=i32 178;f179=i64 179;f180=f 180;f181=f 181;f182=i_n 182; + f183=f 183;f184=f 184;f185=f 185;f186=f 186;f187=f 187;f188=i32 188;f189=i64 189; + f190=f 190;f191=f 191;f192=i_n 192;f193=f 193;f194=f 194;f195=f 195;f196=f 196; + f197=f 197;f198=i32 198;f199=i64 199;f200=f 200;f201=f 201;f202=i_n 202;f203=f 203; + f204=f 204;f205=f 205;f206=f 206;f207=f 207;f208=i32 208;f209=i64 209;f210=f 210; + f211=f 211;f212=i_n 212;f213=f 213;f214=f 214;f215=f 215;f216=f 216;f217=f 217; + f218=i32 218;f219=i64 219;f220=f 220;f221=f 221;f222=i_n 222;f223=f 223;f224=f 224; + f225=f 225;f226=f 226;f227=f 227;f228=i32 228;f229=i64 229;f230=f 230;f231=f 231; + f232=i_n 232;f233=f 233;f234=f 234;f235=f 235;f236=f 236;f237=f 237;f238=i32 238; + f239=i64 239;f240=f 240;f241=f 241;f242=i_n 242;f243=f 243;f244=f 244;f245=f 245; + f246=f 246;f247=f 247;f248=i32 248;f249=i64 249;f250=f 250;f251=f 251;f252=i_n 252; + f253=f 253;f254=f 254;f255=f 255;f256=f 256;f257=f 257;f258=i32 258;f259=i64 259; + } + +let iter_large f i32 i64 i_n t = + f t.f1 1; i_n t.f2 2; f t.f3 3; f t.f4 4; f t.f5 5; f t.f6 6; f t.f7 7; + i32 t.f8 8; i64 t.f9 9; f t.f10 10; f t.f11 11; + i_n t.f12 12; f t.f13 13; f t.f14 14; + f t.f15 15; f t.f16 16; f t.f17 17; i32 t.f18 18; + i64 t.f19 19; f t.f20 20; f t.f21 21; + i_n t.f22 22; f t.f23 23; f t.f24 24; f t.f25 25; + f t.f26 26; f t.f27 27; i32 t.f28 28; + i64 t.f29 29; f t.f30 30; f t.f31 31; i_n t.f32 32; + f t.f33 33; f t.f34 34; f t.f35 35; + f t.f36 36; f t.f37 37; i32 t.f38 38; i64 t.f39 39; + f t.f40 40; f t.f41 41; i_n t.f42 42; + f t.f43 43; f t.f44 44; f t.f45 45; f t.f46 46; + f t.f47 47; i32 t.f48 48; i64 t.f49 49; + f t.f50 50; f t.f51 51; i_n t.f52 52; f t.f53 53; + f t.f54 54; f t.f55 55; f t.f56 56; + f t.f57 57; i32 t.f58 58; i64 t.f59 59; f t.f60 60; + f t.f61 61; i_n t.f62 62; f t.f63 63; + f t.f64 64; f t.f65 65; f t.f66 66; f t.f67 67; + i32 t.f68 68; i64 t.f69 69; f t.f70 70; + f t.f71 71; i_n t.f72 72; f t.f73 73; f t.f74 74; + f t.f75 75; f t.f76 76; f t.f77 77; + i32 t.f78 78; i64 t.f79 79; f t.f80 80; f t.f81 81; + i_n t.f82 82; f t.f83 83; f t.f84 84; + f t.f85 85; f t.f86 86; f t.f87 87; i32 t.f88 88; + i64 t.f89 89; f t.f90 90; f t.f91 91; + i_n t.f92 92; f t.f93 93; f t.f94 94; f t.f95 95; + f t.f96 96; f t.f97 97; i32 t.f98 98; + i64 t.f99 99; f t.f100 100; f t.f101 101; i_n t.f102 102; + f t.f103 103; f t.f104 104; f t.f105 105; + f t.f106 106; f t.f107 107; i32 t.f108 108; i64 t.f109 109; + f t.f110 110; f t.f111 111; i_n t.f112 112; + f t.f113 113; f t.f114 114; f t.f115 115; f t.f116 116; + f t.f117 117; i32 t.f118 118; i64 t.f119 119; + f t.f120 120; f t.f121 121; i_n t.f122 122; f t.f123 123; + f t.f124 124; f t.f125 125; f t.f126 126; + f t.f127 127; i32 t.f128 128; i64 t.f129 129; f t.f130 130; + f t.f131 131; i_n t.f132 132; f t.f133 133; + f t.f134 134; f t.f135 135; f t.f136 136; f t.f137 137; + i32 t.f138 138; i64 t.f139 139; f t.f140 140; + f t.f141 141; i_n t.f142 142; f t.f143 143; f t.f144 144; + f t.f145 145; f t.f146 146; f t.f147 147; + i32 t.f148 148; i64 t.f149 149; f t.f150 150; f t.f151 151; + i_n t.f152 152; f t.f153 153; f t.f154 154; + f t.f155 155; f t.f156 156; f t.f157 157; i32 t.f158 158; + i64 t.f159 159; f t.f160 160; f t.f161 161; + i_n t.f162 162; f t.f163 163; f t.f164 164; f t.f165 165; + f t.f166 166; f t.f167 167; i32 t.f168 168; + i64 t.f169 169; f t.f170 170; f t.f171 171; i_n t.f172 172; + f t.f173 173; f t.f174 174; f t.f175 175; + f t.f176 176; f t.f177 177; i32 t.f178 178; i64 t.f179 179; + f t.f180 180; f t.f181 181; i_n t.f182 182; + f t.f183 183; f t.f184 184; f t.f185 185; f t.f186 186; + f t.f187 187; i32 t.f188 188; i64 t.f189 189; + f t.f190 190; f t.f191 191; i_n t.f192 192; f t.f193 193; + f t.f194 194; f t.f195 195; f t.f196 196; + f t.f197 197; i32 t.f198 198; i64 t.f199 199; f t.f200 200; + f t.f201 201; i_n t.f202 202; f t.f203 203; + f t.f204 204; f t.f205 205; f t.f206 206; f t.f207 207; + i32 t.f208 208; i64 t.f209 209; f t.f210 210; + f t.f211 211; i_n t.f212 212; f t.f213 213; f t.f214 214; + f t.f215 215; f t.f216 216; f t.f217 217; + i32 t.f218 218; i64 t.f219 219; f t.f220 220; f t.f221 221; + i_n t.f222 222; f t.f223 223; f t.f224 224; + f t.f225 225; f t.f226 226; f t.f227 227; i32 t.f228 228; + i64 t.f229 229; f t.f230 230; f t.f231 231; + i_n t.f232 232; f t.f233 233; f t.f234 234; f t.f235 235; + f t.f236 236; f t.f237 237; i32 t.f238 238; + i64 t.f239 239; f t.f240 240; f t.f241 241; i_n t.f242 242; + f t.f243 243; f t.f244 244; f t.f245 245; + f t.f246 246; f t.f247 247; i32 t.f248 248; i64 t.f249 249; + f t.f250 250; f t.f251 251; i_n t.f252 252; + f t.f253 253; f t.f254 254; f t.f255 255; f t.f256 256; + f t.f257 257; i32 t.f258 258; i64 t.f259 259; +;; + +let test_large_mixed_blocks () = + let t = + create_large Float_u.of_int Int32_u.of_int Int64_u.of_int Nativeint_u.of_int + in + let sum () = + let total = ref 0.0 in + iter_large + (fun f _ -> total := !total +. Float_u.to_float f) + (fun i _ -> total := !total +. Int32_u.to_float i) + (fun i _ -> total := !total +. Int64_u.to_float i) + (fun i _ -> total := !total +. Nativeint_u.to_float i) + t; + !total + in + Printf.printf "Test large mixed blocks: sum (33670) = %.3f\n" (sum ()); + let check () = + iter_large + (fun f i -> assert (Float_u.equal f (Float_u.of_int i))) + (fun i32 i -> assert (Int32_u.equal i32 (Int32_u.of_int i))) + (fun i64 i -> assert (Int64_u.equal i64 (Int64_u.of_int i))) + (fun i_n i -> assert (Nativeint_u.equal i_n (Nativeint_u.of_int i))) + t + in + check (); + Gc.full_major (); + check (); + Printf.printf " at end, sum (33670) = %.3f\n" (sum ()); +;; + +let () = test_large_mixed_blocks () + +(*************************) +(* Test 5: optimizations *) + +(* Test that the middle end is able to handle scenarios where + optimizations apply. This doesn't give us assurance that + the optimizations actually apply here -- just that the middle-end + doesn't fall over. +*) + +type t_opt1 = + { imm : int; fl : float#; i32 : int32#; i64 : int64#; i_n : nativeint# } + +let construct_and_destruct_1_1 imm fl i32 i64 i_n = + match { imm; fl; i32; i64; i_n } with + | { imm; fl; i32; i64; i_n } -> + float_of_int imm + +. Float_u.to_float fl + +. Int32_u.to_float i32 + +. Int64_u.to_float i64 + +. Nativeint_u.to_float i_n + +let construct_and_destruct_1_2 b imm fl i32 i64 i_n = + let { imm; fl; i32; i64; i_n } = + match b with + | true -> { imm; fl; i32; i64; i_n } + | false -> { imm = imm + 1; fl; i32; i64; i_n } + in + float_of_int imm + +. Float_u.to_float fl + +. Int32_u.to_float i32 + +. Int64_u.to_float i64 + +. Nativeint_u.to_float i_n + +type t_opt2 = { x : float; y : float# } + +let construct_and_destruct_2_1 ~x ~y = + match { x; y } with + | { x; y } -> x +. Float_u.to_float y + +let construct_and_destruct_2_2 b ~x ~y = + let { x; y } = + match b with + | true -> { x; y } + | false -> { x = x +. 1.; y } + in + x +. Float_u.to_float y + +let test_opt () = + let result1_1 = construct_and_destruct_1_1 36 #4. (-#10l) #13L (-#1n) in + let result1_2 = construct_and_destruct_1_2 true 38 #4. #255l (-#435L) #180n in + let result2_1 = construct_and_destruct_2_1 ~x:37. ~y:#5. in + let result2_2 = construct_and_destruct_2_2 false ~x:36. ~y:#5. in + Printf.printf "Test opt: result (42) = %.3f = %.3f = %.3f = %.3f\n" + result1_1 result1_2 result2_1 result2_2 +;; + +let () = test_opt () diff --git a/testsuite/tests/mixed-blocks/test_mixed_blocks.reference b/testsuite/tests/mixed-blocks/test_mixed_blocks.reference new file mode 100644 index 00000000000..951fd636fc1 --- /dev/null +++ b/testsuite/tests/mixed-blocks/test_mixed_blocks.reference @@ -0,0 +1,3 @@ +Test large mixed blocks: sum (33670) = 33670.000 + at end, sum (33670) = 33670.000 +Test opt: result (42) = 42.000 = 42.000 = 42.000 = 42.000 diff --git a/testsuite/tests/mixed-blocks/test_printing.ml b/testsuite/tests/mixed-blocks/test_printing.ml new file mode 100644 index 00000000000..fdc27c4b58f --- /dev/null +++ b/testsuite/tests/mixed-blocks/test_printing.ml @@ -0,0 +1,36 @@ +(* TEST + flags = "-extension layouts_beta"; + expect; +*) + +(* Test bytecode printing of values *) + +(* All-float *) +type t = { flt : float; uflt : float# } + +let t = { flt = 4.0; uflt = #5.0 } + +[%%expect {| +type t = { flt : float; uflt : float#; } +val t : t = {flt = 4.; uflt = } +|}];; + +(* Non-empty value prefix *) +type t = { str : string; uflt : float# } + +let t = { str = "str"; uflt = #5.0 } + +[%%expect {| +type t = { str : string; uflt : float#; } +val t : t = {str = "str"; uflt = } +|}];; + +(* Flat suffix mixes float# and imm *) +type t = { str : string; uflt : float#; imm : int } + +let t = { str = "str"; uflt = #5.0; imm = 5 } + +[%%expect {| +type t = { str : string; uflt : float#; imm : int; } +val t : t = {str = "str"; uflt = ; imm = 5} +|}];; diff --git a/testsuite/tests/mixed-blocks/typing_recursive_mixed_blocks.ml b/testsuite/tests/mixed-blocks/typing_recursive_mixed_blocks.ml new file mode 100644 index 00000000000..2581faf0a2e --- /dev/null +++ b/testsuite/tests/mixed-blocks/typing_recursive_mixed_blocks.ml @@ -0,0 +1,100 @@ +(* TEST + flags = "-extension layouts_beta"; + expect; +*) + +(* Record *) + +type rec_t = { rec_t : rec_t; x1 : float# } +type t = { t : rec_t; x2 : float# } + +[%%expect {| +type rec_t = { rec_t : rec_t; x1 : float#; } +type t = { t : rec_t; x2 : float#; } +|}];; + +(* OK: the recursive use is for a field in the value prefix. *) +let rec rec_t = { rec_t; x1 = #4.0 } + +[%%expect {| +val rec_t : rec_t = {rec_t = ; x1 = } +|}];; + +(* Error: the recursive use is for a field in the flat suffix *) +let rec x2 = let _ = { t = rec_t; x2 } in #4.0;; + +[%%expect {| +Line 1, characters 13-46: +1 | let rec x2 = let _ = { t = rec_t; x2 } in #4.0;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}];; + +(* OK: an adapted version of the above error to show that the difference + is just in the field layout. *) +let rec rec_t = let _ = { rec_t; x1 = #4.0 } in { rec_t; x1 = #4.0 };; + +[%%expect {| +val rec_t : rec_t = {rec_t = ; x1 = } +|}];; + +(* Constructor: tupled args *) + +type cstr = A of cstr * float# +[%%expect {| +type cstr = A of cstr * float# +|}];; + +(* OK: the recursive use is for a field in the value prefix. *) +let rec rec_cstr = A (rec_cstr, #4.0) +[%%expect {| +val rec_cstr : cstr = A (, ) +|}];; + +(* Error: the recursive use is for a field in the flat suffix *) +let rec bad_flat = let _ = A (rec_cstr, bad_flat) in #4.0;; +[%%expect {| +Line 1, characters 19-57: +1 | let rec bad_flat = let _ = A (rec_cstr, bad_flat) in #4.0;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}];; + +(* OK: an adapted version of the above error to show that the difference + is just in the field layout. *) +let rec good_block = let _ = A (good_block, #4.0) in A (good_block, #4.0);; + +[%%expect {| +val good_block : cstr = A (, ) +|}];; + +(* Constructor: inline record args *) + +type cstr = A of { cstr : cstr; flt : float# } +[%%expect {| +type cstr = A of { cstr : cstr; flt : float#; } +|}];; + +(* OK: the recursive use is for a field in the value prefix. *) +let rec rec_cstr = A { cstr = rec_cstr; flt = #4.0 } +[%%expect {| +val rec_cstr : cstr = A {cstr = ; flt = } +|}];; + +(* Error: the recursive use is for a field in the flat suffix *) +let rec bad_flat = let _ = A { cstr = rec_cstr; flt = bad_flat } in #4.0;; +[%%expect {| +Line 1, characters 19-72: +1 | let rec bad_flat = let _ = A { cstr = rec_cstr; flt = bad_flat } in #4.0;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}];; + +(* OK: an adapted version of the above error to show that the difference + is just in the field layout. *) +let rec good_block = let _ = A { cstr = good_block; flt = #4.0 } in + A { cstr = good_block; flt = #4.0 };; + +[%%expect {| +val good_block : cstr = A {cstr = ; flt = } +|}];; diff --git a/testsuite/tests/mixed-blocks/variant_unboxing.ml b/testsuite/tests/mixed-blocks/variant_unboxing.ml new file mode 100644 index 00000000000..c916d5b3f90 --- /dev/null +++ b/testsuite/tests/mixed-blocks/variant_unboxing.ml @@ -0,0 +1,28 @@ +(* TEST + flags = "-extension layouts_beta"; + native; +*) + +(* Unboxing of variants with mixed constructors *) + +type t = + | Const_t + | Boxed of Float.t + +type u = + | Const_u + | Unboxed of float# + +external unbox : float -> float# = "%unbox_float" + +let t_to_u (t : t) : u = + match t with + | Const_t -> Const_u + | Boxed field -> Unboxed (unbox field) +;; + +let f t = + (* The result of [t_to_u] is speculatively unboxed *) + let _ = t_to_u t in + () +;; diff --git a/testsuite/tests/no-alias-deps/aliases.ml b/testsuite/tests/no-alias-deps/aliases.ml index 6da3f709d5a..41277205ef5 100644 --- a/testsuite/tests/no-alias-deps/aliases.ml +++ b/testsuite/tests/no-alias-deps/aliases.ml @@ -1,17 +1,17 @@ -(* TEST -flags = "-no-alias-deps" -compile_only = "true" -readonly_files = "b.cmi.in c.mli d.mli" -* setup-ocamlc.byte-build-env -** copy -src = "b.cmi.in" -dst = "b.cmi" -*** ocamlc.byte -all_modules = "c.mli d.mli aliases.ml" -**** check-ocamlc.byte-output -***** ocamlobjinfo -program = "aliases.cmo" -****** check-program-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + *) module A' = A (* missing a.cmi *) @@ -19,3 +19,19 @@ module B' = B (* broken b.cmi *) module C' = C (* valid c.cmi *) module D' = D (* valid d.cmi *) let () = print_int D'.something + +(* TEST + flags = "-no-alias-deps"; + compile_only = "true"; + readonly_files = "b.cmi.in c.mli d.mli"; + setup-ocamlc.byte-build-env; + src = "b.cmi.in"; + dst = "b.cmi"; + copy; + all_modules = "c.mli d.mli aliases.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + program = "aliases.cmo"; + ocamlobjinfo; + check-program-output; +*) diff --git a/testsuite/tests/no-alias-deps/gpr2235.ml b/testsuite/tests/no-alias-deps/gpr2235.ml index 96472f3aded..aa038b5da8a 100644 --- a/testsuite/tests/no-alias-deps/gpr2235.ml +++ b/testsuite/tests/no-alias-deps/gpr2235.ml @@ -1,21 +1,21 @@ (* TEST -flags = "-no-alias-deps -w -49" -compile_only = "true" -readonly_files = "a2235.ml lib__2235.ml lib2235.ml user_of_lib2235.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "lib__2235.ml" -*** check-ocamlc.byte-output -**** ocamlc.byte -flags = "-no-alias-deps -w -49 -open Lib__2235 -o lib__A2235.cmo" -module = "a2235.ml" -***** check-ocamlc.byte-output -****** ocamlc.byte -flags = "-no-alias-deps -w -49 -open Lib__2235" -module = "lib2235.ml" -******* check-ocamlc.byte-output -******** ocamlc.byte -flags = "-no-alias-deps -w -49" -module = "user_of_lib2235.ml" -********* check-ocamlc.byte-output + flags = "-no-alias-deps -w -49"; + compile_only = "true"; + readonly_files = "a2235.ml lib__2235.ml lib2235.ml user_of_lib2235.ml"; + setup-ocamlc.byte-build-env; + module = "lib__2235.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + flags = "-no-alias-deps -w -49 -open Lib__2235 -o lib__A2235.cmo"; + module = "a2235.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + flags = "-no-alias-deps -w -49 -open Lib__2235"; + module = "lib2235.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + flags = "-no-alias-deps -w -49"; + module = "user_of_lib2235.ml"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/opaque/test.ml b/testsuite/tests/opaque/test.ml index 4af63ede528..c7bf838c1ad 100644 --- a/testsuite/tests/opaque/test.ml +++ b/testsuite/tests/opaque/test.ml @@ -1,65 +1,56 @@ (* TEST - -subdirectories = "fst intf snd" - -compile_only = "true" - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -flags = "-I intf -opaque" -all_modules = "intf/opaque_intf.mli" -*** ocamlopt.byte -flags = "-I intf" -all_modules = "intf/opaque_impl.mli intf/regular.mli" -**** copy -src = "intf/opaque_intf.cmi intf/opaque_impl.cmi intf/regular.cmi \ - intf/opaque_intf.mli intf/opaque_impl.mli intf/regular.mli" -dst = "fst/" -***** copy -src = "intf/opaque_intf.cmi intf/opaque_impl.cmi intf/regular.cmi \ - intf/opaque_intf.mli intf/opaque_impl.mli intf/regular.mli" -dst = "snd/" -****** ocamlopt.byte -flags = "-I fst -opaque" -all_modules = "fst/opaque_impl.ml" -******* ocamlopt.byte -flags = "-I snd -opaque" -all_modules = "snd/opaque_impl.ml" -******** ocamlopt.byte -flags = "-I fst" -all_modules = "fst/opaque_intf.ml fst/regular.ml" -********* ocamlopt.byte -flags = "-I snd" -all_modules = "snd/opaque_intf.ml snd/regular.ml" -********** ocamlopt.byte -flags = "-I fst" -all_modules = "test.ml" - -(* ordinary compilation *) -*********** ocamlopt.byte -compile_only = "false" -all_modules = "fst/opaque_intf.cmx fst/opaque_impl.cmx fst/regular.cmx test.cmx" -program = "${test_build_directory}/p1.exe" - -(* change to opaque interface *) -*********** ocamlopt.byte -compile_only = "false" -all_modules = "snd/opaque_intf.cmx fst/opaque_impl.cmx fst/regular.cmx test.cmx" -program = "${test_build_directory}/p2.exe" - -(* change to opaque implementation *) -*********** ocamlopt.byte -compile_only = "false" -all_modules = "fst/opaque_intf.cmx snd/opaque_impl.cmx fst/regular.cmx test.cmx" -program = "${test_build_directory}/p3.exe" - -(* change to non-opaque implementation *) -*********** ocamlopt.byte -compile_only = "false" -all_modules = "fst/opaque_intf.cmx fst/opaque_impl.cmx snd/regular.cmx test.cmx" -program = "${test_build_directory}/p4.exe" -ocamlopt_byte_exit_status = "2" - + subdirectories = "fst intf snd"; + compile_only = "true"; + setup-ocamlopt.byte-build-env; + flags = "-I intf -opaque"; + all_modules = "intf/opaque_intf.mli"; + ocamlopt.byte; + flags = "-I intf"; + all_modules = "intf/opaque_impl.mli intf/regular.mli"; + ocamlopt.byte; + src = "intf/opaque_intf.cmi intf/opaque_impl.cmi intf/regular.cmi intf/opaque_intf.mli intf/opaque_impl.mli intf/regular.mli"; + dst = "fst/"; + copy; + src = "intf/opaque_intf.cmi intf/opaque_impl.cmi intf/regular.cmi intf/opaque_intf.mli intf/opaque_impl.mli intf/regular.mli"; + dst = "snd/"; + copy; + flags = "-I fst -opaque"; + all_modules = "fst/opaque_impl.ml"; + ocamlopt.byte; + flags = "-I snd -opaque"; + all_modules = "snd/opaque_impl.ml"; + ocamlopt.byte; + flags = "-I fst"; + all_modules = "fst/opaque_intf.ml fst/regular.ml"; + ocamlopt.byte; + flags = "-I snd"; + all_modules = "snd/opaque_intf.ml snd/regular.ml"; + ocamlopt.byte; + flags = "-I fst"; + all_modules = "test.ml"; + ocamlopt.byte; + { (* ordinary compilation *) + compile_only = "false"; + all_modules = "fst/opaque_intf.cmx fst/opaque_impl.cmx fst/regular.cmx test.cmx"; + program = "${test_build_directory}/p1.exe"; + ocamlopt.byte; + }{ (* change to opaque interface *) + compile_only = "false"; + all_modules = "snd/opaque_intf.cmx fst/opaque_impl.cmx fst/regular.cmx test.cmx"; + program = "${test_build_directory}/p2.exe"; + ocamlopt.byte; + }{ (* change to opaque implementation *) + compile_only = "false"; + all_modules = "fst/opaque_intf.cmx snd/opaque_impl.cmx fst/regular.cmx test.cmx"; + program = "${test_build_directory}/p3.exe"; + ocamlopt.byte; + }{ (* change to non-opaque implementation *) + compile_only = "false"; + all_modules = "fst/opaque_intf.cmx fst/opaque_impl.cmx snd/regular.cmx test.cmx"; + program = "${test_build_directory}/p4.exe"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + } *) let () = diff --git a/testsuite/tests/output-complete-obj/github9344.ml b/testsuite/tests/output-complete-obj/github9344.ml index b7ea5c5ec6e..34f6580fda3 100644 --- a/testsuite/tests/output-complete-obj/github9344.ml +++ b/testsuite/tests/output-complete-obj/github9344.ml @@ -1,14 +1,12 @@ (* TEST - -use_runtime = "false" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags = "-w -a -output-complete-exe -ccopt -I${ocamlsrcdir}/runtime" -program = "github9344" -*** run -program = "sh ${test_source_directory}/github9344.sh" -**** check-program-output + use_runtime = "false"; + setup-ocamlc.byte-build-env; + flags = "-w -a -output-complete-exe -ccopt -I${ocamlsrcdir}/${runtime_dir}"; + program = "github9344"; + ocamlc.byte; + program = "sh ${test_source_directory}/github9344.sh"; + run; + check-program-output; *) raise Not_found diff --git a/testsuite/tests/output-complete-obj/test.ml b/testsuite/tests/output-complete-obj/test.ml index 1b655a6d461..6949f9ce557 100644 --- a/testsuite/tests/output-complete-obj/test.ml +++ b/testsuite/tests/output-complete-obj/test.ml @@ -1,32 +1,30 @@ (* TEST - -readonly_files = "test.ml_stub.c" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags = "-w -a -output-complete-obj" -program = "test.ml.bc.${objext}" -*** script -script = "${mkexe} -I${ocamlsrcdir}/runtime -o test.ml_bc_stub.exe \ - test.ml.bc.${objext} ${nativecc_libs} test.ml_stub.c" -output = "${compiler_output}" -**** run -program = "./test.ml_bc_stub.exe" -stdout = "program-output" -stderr = "program-output" -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -flags = "-w -a -output-complete-obj" -program = "test.ml.exe.${objext}" -*** script -script = "${mkexe} -I${ocamlsrcdir}/runtime -o test.ml_stub.exe \ - test.ml.exe.${objext} ${bytecc_libs} test.ml_stub.c" -output = "${compiler_output}" -**** run -program = "./test.ml_stub.exe" -stdout = "program-output" -stderr = "program-output" - + readonly_files = "test.ml_stub.c"; + { + setup-ocamlc.byte-build-env; + flags = "-w -a -output-complete-obj"; + program = "test.ml.bc.${objext}"; + ocamlc.byte; + script = "${mkexe} -I${ocamlsrcdir}/${runtime_dir} -o test.ml_bc_stub.exe test.ml.bc.${objext} ${nativecc_libs} test.ml_stub.c"; + output = "${compiler_output}"; + script; + program = "./test.ml_bc_stub.exe"; + stdout = "program-output"; + stderr = "program-output"; + run; + }{ + setup-ocamlopt.byte-build-env; + flags = "-w -a -output-complete-obj"; + program = "test.ml.exe.${objext}"; + ocamlopt.byte; + script = "${mkexe} -I${ocamlsrcdir}/${runtime_dir} -o test.ml_stub.exe test.ml.exe.${objext} ${bytecc_libs} test.ml_stub.c"; + output = "${compiler_output}"; + script; + program = "./test.ml_stub.exe"; + stdout = "program-output"; + stderr = "program-output"; + run; + } *) let () = Printf.printf "Test!!\n%!" diff --git a/testsuite/tests/output-complete-obj/test2.ml b/testsuite/tests/output-complete-obj/test2.ml index c201224ce8c..f3751a08062 100644 --- a/testsuite/tests/output-complete-obj/test2.ml +++ b/testsuite/tests/output-complete-obj/test2.ml @@ -1,18 +1,16 @@ (* TEST - -readonly_files = "puts.c" -use_runtime = "false" -unset FOO - -* hasunix -include unix -** setup-ocamlc.byte-build-env -*** ocamlc.byte -flags = "-w -a -output-complete-exe puts.c -ccopt -I${ocamlsrcdir}/runtime" -program = "test2" -**** run -program = "./test2" -***** check-program-output + readonly_files = "puts.c"; + use_runtime = "false"; + unset FOO; + include unix; + hasunix; + setup-ocamlc.byte-build-env; + flags = "-w -a -output-complete-exe puts.c -ccopt -I${ocamlsrcdir}/${runtime_dir}"; + program = "test2"; + ocamlc.byte; + program = "./test2"; + run; + check-program-output; *) external puts: string -> unit = "caml_puts" diff --git a/testsuite/tests/packs/basic/main.ml b/testsuite/tests/packs/basic/main.ml index 3f785af3c6e..63b65da5bf6 100644 --- a/testsuite/tests/packs/basic/main.ml +++ b/testsuite/tests/packs/basic/main.ml @@ -1,46 +1,46 @@ (* TEST - -readonly_files = "main.ml member.ml" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags = "-for-pack Pack" -module = "member.ml" -*** ocamlc.byte -module = "" -flags = "-pack" -program = "pack.cmo" -all_modules = "member.cmo" -**** ocamlc.byte -flags = "" -module = "main.ml" -***** ocamlc.byte -module = "" -program = "${test_build_directory}/main.byte" -all_modules = "pack.cmo main.cmo" -****** run -exit_status = "0" -******* check-program-output - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -flags = "-for-pack Pack" -module = "member.ml" -*** ocamlopt.byte -module = "" -flags = "-pack" -program = "pack.cmx" -all_modules = "member.cmx" -**** ocamlopt.byte -flags = "" -module = "main.ml" -***** ocamlopt.byte -module = "" -program = "${test_build_directory}/main.exe" -all_modules = "pack.cmx main.cmx" -****** run -exit_status = "0" -******* check-program-output + readonly_files = "main.ml member.ml"; + { + setup-ocamlc.byte-build-env; + flags = "-for-pack Pack"; + module = "member.ml"; + ocamlc.byte; + module = ""; + flags = "-pack"; + program = "pack.cmo"; + all_modules = "member.cmo"; + ocamlc.byte; + flags = ""; + module = "main.ml"; + ocamlc.byte; + module = ""; + program = "${test_build_directory}/main.byte"; + all_modules = "pack.cmo main.cmo"; + ocamlc.byte; + exit_status = "0"; + run; + check-program-output; + }{ + setup-ocamlopt.byte-build-env; + flags = "-for-pack Pack"; + module = "member.ml"; + ocamlopt.byte; + module = ""; + flags = "-pack"; + program = "pack.cmx"; + all_modules = "member.cmx"; + ocamlopt.byte; + flags = ""; + module = "main.ml"; + ocamlopt.byte; + module = ""; + program = "${test_build_directory}/main.exe"; + all_modules = "pack.cmx main.cmx"; + ocamlopt.byte; + exit_status = "0"; + run; + check-program-output; + } *) let say_hello () = diff --git a/testsuite/tests/packs/inconsistent/main.ml b/testsuite/tests/packs/inconsistent/main.ml index c8a459e8350..6d04d0f1ba0 100644 --- a/testsuite/tests/packs/inconsistent/main.ml +++ b/testsuite/tests/packs/inconsistent/main.ml @@ -1,29 +1,27 @@ (* TEST - -readonly_files = "member.ml member2.ml use_member_directly.ml" - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -flags = "-for-pack Pack" -module = "member.ml" -*** script -script = "mkdir subdir/" -**** script -script = "cp use_member_directly.ml member.ml subdir/" -***** cd -cwd = "subdir" -****** ocamlopt.byte -flags = "" -module = "member.ml" -******* ocamlopt.byte -module = "use_member_directly.ml" -******** cd -cwd = ".." -********* ocamlopt.byte -flags = "-for-pack Pack -I subdir" -module = "main.ml" -ocamlopt_byte_exit_status = "2" -********** check-ocamlopt.byte-output + readonly_files = "member.ml member2.ml use_member_directly.ml"; + setup-ocamlopt.byte-build-env; + flags = "-for-pack Pack"; + module = "member.ml"; + ocamlopt.byte; + script = "mkdir subdir/"; + script; + script = "cp use_member_directly.ml member.ml subdir/"; + script; + cwd = "subdir"; + cd; + flags = ""; + module = "member.ml"; + ocamlopt.byte; + module = "use_member_directly.ml"; + ocamlopt.byte; + cwd = ".."; + cd; + flags = "-for-pack Pack -I subdir"; + module = "main.ml"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + check-ocamlopt.byte-output; *) module _ = Member diff --git a/testsuite/tests/parallel/atomics.ml b/testsuite/tests/parallel/atomics.ml index de7aa2a5b44..6f092ca6233 100644 --- a/testsuite/tests/parallel/atomics.ml +++ b/testsuite/tests/parallel/atomics.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) type u = U of unit diff --git a/testsuite/tests/parallel/backup_thread.ml b/testsuite/tests/parallel/backup_thread.ml index c69f164ce76..d3d3a19581b 100644 --- a/testsuite/tests/parallel/backup_thread.ml +++ b/testsuite/tests/parallel/backup_thread.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasunix -include unix -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) diff --git a/testsuite/tests/parallel/backup_thread_pipe.ml b/testsuite/tests/parallel/backup_thread_pipe.ml index d0c5bb6e350..e063b4843fb 100644 --- a/testsuite/tests/parallel/backup_thread_pipe.ml +++ b/testsuite/tests/parallel/backup_thread_pipe.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasunix -include unix -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) diff --git a/testsuite/tests/parallel/constpromote.ml b/testsuite/tests/parallel/constpromote.ml index 89e2f9aef40..c8a0e6b2565 100644 --- a/testsuite/tests/parallel/constpromote.ml +++ b/testsuite/tests/parallel/constpromote.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* when run with the bytecode debug runtime, this test diff --git a/testsuite/tests/parallel/deadcont.ml b/testsuite/tests/parallel/deadcont.ml index d162cd19931..d4180fe4a36 100644 --- a/testsuite/tests/parallel/deadcont.ml +++ b/testsuite/tests/parallel/deadcont.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 effects: re-enable this test"; + skip; *) (* diff --git a/testsuite/tests/parallel/domain_dls.ml b/testsuite/tests/parallel/domain_dls.ml index 3d313a288a8..c9c6629b8fc 100644 --- a/testsuite/tests/parallel/domain_dls.ml +++ b/testsuite/tests/parallel/domain_dls.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let check_dls () = diff --git a/testsuite/tests/parallel/domain_dls2.ml b/testsuite/tests/parallel/domain_dls2.ml index fe197763425..97a8c6aff44 100644 --- a/testsuite/tests/parallel/domain_dls2.ml +++ b/testsuite/tests/parallel/domain_dls2.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let _ = diff --git a/testsuite/tests/parallel/domain_id.ml b/testsuite/tests/parallel/domain_id.ml index a38477147b5..47cd6ccbe4a 100644 --- a/testsuite/tests/parallel/domain_id.ml +++ b/testsuite/tests/parallel/domain_id.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) open Domain diff --git a/testsuite/tests/parallel/domain_parallel_spawn_burn.ml b/testsuite/tests/parallel/domain_parallel_spawn_burn.ml index 2b6369bc3b6..6968e203c05 100644 --- a/testsuite/tests/parallel/domain_parallel_spawn_burn.ml +++ b/testsuite/tests/parallel/domain_parallel_spawn_burn.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) open Domain diff --git a/testsuite/tests/parallel/domain_parallel_spawn_burn_gc_set.ml b/testsuite/tests/parallel/domain_parallel_spawn_burn_gc_set.ml index 245b0b73fbc..d07187de741 100644 --- a/testsuite/tests/parallel/domain_parallel_spawn_burn_gc_set.ml +++ b/testsuite/tests/parallel/domain_parallel_spawn_burn_gc_set.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) open Domain diff --git a/testsuite/tests/parallel/domain_serial_spawn_burn.ml b/testsuite/tests/parallel/domain_serial_spawn_burn.ml index ea63910f2f7..a4f003e7f3a 100644 --- a/testsuite/tests/parallel/domain_serial_spawn_burn.ml +++ b/testsuite/tests/parallel/domain_serial_spawn_burn.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasunix -include unix -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) open Domain diff --git a/testsuite/tests/parallel/fib_threads.ml b/testsuite/tests/parallel/fib_threads.ml index 3ab3dde90d0..b6f68ca3c40 100644 --- a/testsuite/tests/parallel/fib_threads.ml +++ b/testsuite/tests/parallel/fib_threads.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hassysthreads -include systhreads -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) diff --git a/testsuite/tests/parallel/join.ml b/testsuite/tests/parallel/join.ml index f98dbcef648..b42f613f253 100644 --- a/testsuite/tests/parallel/join.ml +++ b/testsuite/tests/parallel/join.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let test_size = diff --git a/testsuite/tests/parallel/major_gc_wait_backup.ml b/testsuite/tests/parallel/major_gc_wait_backup.ml index d3ecbb88fda..2f39b4d5441 100644 --- a/testsuite/tests/parallel/major_gc_wait_backup.ml +++ b/testsuite/tests/parallel/major_gc_wait_backup.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasunix -include unix -*** native -*** bytecode + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include unix; + hasunix; + { + native; + }{ + bytecode; + } *) type 'a tree = Empty | Node of 'a tree * 'a tree diff --git a/testsuite/tests/parallel/mctest.ml b/testsuite/tests/parallel/mctest.ml index bbebf9d4b8e..e6be5b08a64 100644 --- a/testsuite/tests/parallel/mctest.ml +++ b/testsuite/tests/parallel/mctest.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasunix -include unix -*** bytecode -*** native + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) (* diff --git a/testsuite/tests/parallel/multicore_systhreads.ml b/testsuite/tests/parallel/multicore_systhreads.ml index 5ce5ea86ead..ddc82a7356f 100644 --- a/testsuite/tests/parallel/multicore_systhreads.ml +++ b/testsuite/tests/parallel/multicore_systhreads.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hassysthreads -include systhreads -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) diff --git a/testsuite/tests/parallel/pingpong.ml b/testsuite/tests/parallel/pingpong.ml index 70b7ed6f690..8898dcff90c 100644 --- a/testsuite/tests/parallel/pingpong.ml +++ b/testsuite/tests/parallel/pingpong.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let r = ref (Some 0) diff --git a/testsuite/tests/parallel/poll.ml b/testsuite/tests/parallel/poll.ml index 98255fb08d8..a2a219f2f9b 100644 --- a/testsuite/tests/parallel/poll.ml +++ b/testsuite/tests/parallel/poll.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasunix -include unix -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let continue = Atomic.make true diff --git a/testsuite/tests/parallel/prodcons_domains.ml b/testsuite/tests/parallel/prodcons_domains.ml index 2b86809df1c..f02257b7547 100644 --- a/testsuite/tests/parallel/prodcons_domains.ml +++ b/testsuite/tests/parallel/prodcons_domains.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* Classic producer-consumer *) diff --git a/testsuite/tests/parallel/recommended_domain_count.ml b/testsuite/tests/parallel/recommended_domain_count.ml index cb2c93cbf66..3e04ea9ebff 100644 --- a/testsuite/tests/parallel/recommended_domain_count.ml +++ b/testsuite/tests/parallel/recommended_domain_count.ml @@ -1,7 +1,7 @@ (* TEST -modules = "recommended_domain_count_cstubs.c" -* skip -reason = "OCaml 5 only" + modules = "recommended_domain_count_cstubs.c"; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) external get_max_domains : unit -> int = "caml_get_max_domains" diff --git a/testsuite/tests/parallel/recommended_domain_count_unix.ml b/testsuite/tests/parallel/recommended_domain_count_unix.ml index 9bab6ccab96..eea7672d925 100644 --- a/testsuite/tests/parallel/recommended_domain_count_unix.ml +++ b/testsuite/tests/parallel/recommended_domain_count_unix.ml @@ -1,10 +1,13 @@ (* TEST -* skip -reason = "OCaml 5 only" -** hasunix -include unix -*** bytecode -*** native + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include unix; + hasunix; + { + bytecode; + }{ + native; + } *) let try_ext cmd = diff --git a/testsuite/tests/parallel/tak.ml b/testsuite/tests/parallel/tak.ml index 106d27cff57..ce81c1e8a10 100644 --- a/testsuite/tests/parallel/tak.ml +++ b/testsuite/tests/parallel/tak.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* filling minor heaps in parallel to trigger diff --git a/testsuite/tests/parallel/test_c_thread_register.ml b/testsuite/tests/parallel/test_c_thread_register.ml index 8b840bb4740..5e888c8b4c9 100644 --- a/testsuite/tests/parallel/test_c_thread_register.ml +++ b/testsuite/tests/parallel/test_c_thread_register.ml @@ -1,11 +1,14 @@ (* TEST - modules = "test_c_thread_register_cstubs.c" - * skip - reason = "OCaml 5 only" - ** hassysthreads - include systhreads - *** bytecode - *** native + modules = "test_c_thread_register_cstubs.c"; + reason = "CR ocaml 5 domains: re-enable this test"; + skip; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) (* spins a external thread from C and register it to the OCaml runtime *) diff --git a/testsuite/tests/parallel/test_issue_11094.ml b/testsuite/tests/parallel/test_issue_11094.ml index 8b9fb98c50a..12060d1d837 100644 --- a/testsuite/tests/parallel/test_issue_11094.ml +++ b/testsuite/tests/parallel/test_issue_11094.ml @@ -1,8 +1,11 @@ (* TEST -* skip -reason = "OCaml 5 only" -** bytecode -** native + reason = "CR ocaml 5 effects: re-enable this test"; + skip; + { + bytecode; + }{ + native; + } *) open Effect diff --git a/testsuite/tests/parse-errors/bigarray_index_labels.compilers.reference b/testsuite/tests/parse-errors/bigarray_index_labels.compilers.reference new file mode 100644 index 00000000000..aacd7f603f2 --- /dev/null +++ b/testsuite/tests/parse-errors/bigarray_index_labels.compilers.reference @@ -0,0 +1,6 @@ +File "bigarray_index_labels.ml", line 14, characters 0-12: +14 | my_big_array.{(1, ~y:2)} <- 1.5;; + ^^^^^^^^^^^^ +Error: This expression has type + (float, Bigarray.float32_elt, Bigarray.c_layout) Bigarray.Array2.t + but an expression was expected of type ('a, 'b, 'c) Bigarray.Array1.t diff --git a/testsuite/tests/parse-errors/bigarray_index_labels.ml b/testsuite/tests/parse-errors/bigarray_index_labels.ml new file mode 100644 index 00000000000..ebf01d347a1 --- /dev/null +++ b/testsuite/tests/parse-errors/bigarray_index_labels.ml @@ -0,0 +1,14 @@ +(* TEST + flags = "-extension labeled_tuples"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) + +open Bigarray + +let my_big_array = + Bigarray.Array2.create Bigarray.float32 Bigarray.c_layout 20 20;; + +my_big_array.{(1, ~y:2)} <- 1.5;; diff --git a/testsuite/tests/parse-errors/escape_error.ml b/testsuite/tests/parse-errors/escape_error.ml index 2a8e99b61d6..4206123f6c0 100644 --- a/testsuite/tests/parse-errors/escape_error.ml +++ b/testsuite/tests/parse-errors/escape_error.ml @@ -1,5 +1,5 @@ -(* TEST - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) (* Nothing to see here, parse.ml dictates that these be printed as regular @@ -10,3 +10,7 @@ try foo () with ;; (3 : );; (3 :> );; + +(* TEST + toplevel; +*) diff --git a/testsuite/tests/parse-errors/expecting.ml b/testsuite/tests/parse-errors/expecting.ml index 4298b81868c..5f3026b3425 100644 --- a/testsuite/tests/parse-errors/expecting.ml +++ b/testsuite/tests/parse-errors/expecting.ml @@ -1,5 +1,5 @@ -(* TEST - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) let f = function @@ -33,3 +33,7 @@ let f = function let f = function | (module -> () ;; + +(* TEST + toplevel; +*) diff --git a/testsuite/tests/parse-errors/mismatch_struct_sig.ml b/testsuite/tests/parse-errors/mismatch_struct_sig.ml index 827adb6affd..d22a45a8cb6 100644 --- a/testsuite/tests/parse-errors/mismatch_struct_sig.ml +++ b/testsuite/tests/parse-errors/mismatch_struct_sig.ml @@ -1,5 +1,5 @@ -(* TEST - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) module type S = struct end @@ -38,3 +38,7 @@ module type S = sig include module type of sig end end ;; + +(* TEST + toplevel; +*) diff --git a/testsuite/tests/parse-errors/pr7847.ml b/testsuite/tests/parse-errors/pr7847.ml index 8018109b1eb..6c2e9fd5313 100644 --- a/testsuite/tests/parse-errors/pr7847.ml +++ b/testsuite/tests/parse-errors/pr7847.ml @@ -1,10 +1,17 @@ -(* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) (* https://caml.inria.fr/mantis/view.php?id=7847 The backquote causes a syntax error; this file should be rejected. *) external x : unit -> (int,int)`A.t = "x" + +(* TEST + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parse-errors/singleton_labeled_tuple_type.compilers.reference b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.compilers.reference new file mode 100644 index 00000000000..c0865faed22 --- /dev/null +++ b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.compilers.reference @@ -0,0 +1,4 @@ +File "singleton_labeled_tuple_type.ml", line 8, characters 26-27: +8 | let foo (just_x : (x : int)) = just_x + ^ +Error: Syntax error diff --git a/testsuite/tests/parse-errors/singleton_labeled_tuple_type.ml b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.ml new file mode 100644 index 00000000000..2b850e5a68e --- /dev/null +++ b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.ml @@ -0,0 +1,8 @@ +(* TEST + flags = "-extension labeled_tuples"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) +let foo (just_x : (x : int)) = just_x diff --git a/testsuite/tests/parse-errors/unclosed_class_signature.mli b/testsuite/tests/parse-errors/unclosed_class_signature.mli index 0aa6bf494ea..659c8b9a48e 100644 --- a/testsuite/tests/parse-errors/unclosed_class_signature.mli +++ b/testsuite/tests/parse-errors/unclosed_class_signature.mli @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) (* It is apparently impossible to get the "unclosed object" message. *) diff --git a/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.ml b/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.ml index 86466d8155f..d0bc47ba964 100644 --- a/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.ml +++ b/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) class c = object diff --git a/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.ml b/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.ml index dc762fd252d..edb21933f2a 100644 --- a/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.ml +++ b/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) class c = (object end : object end diff --git a/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.ml b/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.ml index 142d3b09e07..3b689293cfc 100644 --- a/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.ml +++ b/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) class c = (object end diff --git a/testsuite/tests/parse-errors/unclosed_object.ml b/testsuite/tests/parse-errors/unclosed_object.ml index c74a71357c1..6528ea09f82 100644 --- a/testsuite/tests/parse-errors/unclosed_object.ml +++ b/testsuite/tests/parse-errors/unclosed_object.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) (* Failed to get the unclosed object error message. *) diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr1.ml b/testsuite/tests/parse-errors/unclosed_paren_module_expr1.ml index b22a3fb4fbd..259f2799a20 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr1.ml +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr1.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = (struct end : sig end diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr2.ml b/testsuite/tests/parse-errors/unclosed_paren_module_expr2.ml index a786f351b73..44ac330bc31 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr2.ml +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr2.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = (struct end diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr3.ml b/testsuite/tests/parse-errors/unclosed_paren_module_expr3.ml index 4c5c78585db..9cc8d6e6c59 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr3.ml +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr3.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = (val 3 : diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr4.ml b/testsuite/tests/parse-errors/unclosed_paren_module_expr4.ml index fc3daefcc36..075d5c599ed 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr4.ml +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr4.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = (val 3 :> diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr5.ml b/testsuite/tests/parse-errors/unclosed_paren_module_expr5.ml index 8ce6c0b21cf..68a044256d0 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr5.ml +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr5.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = (val 3 diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_type.mli b/testsuite/tests/parse-errors/unclosed_paren_module_type.mli index 436ce5dc273..e428959842e 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_type.mli +++ b/testsuite/tests/parse-errors/unclosed_paren_module_type.mli @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M : (sig end diff --git a/testsuite/tests/parse-errors/unclosed_sig.mli b/testsuite/tests/parse-errors/unclosed_sig.mli index af49ea40799..12b4d3c9751 100644 --- a/testsuite/tests/parse-errors/unclosed_sig.mli +++ b/testsuite/tests/parse-errors/unclosed_sig.mli @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M : sig diff --git a/testsuite/tests/parse-errors/unclosed_simple_expr.ml b/testsuite/tests/parse-errors/unclosed_simple_expr.ml index f5a9e3b7f28..3a94e4cee84 100644 --- a/testsuite/tests/parse-errors/unclosed_simple_expr.ml +++ b/testsuite/tests/parse-errors/unclosed_simple_expr.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (3; 2;; diff --git a/testsuite/tests/parse-errors/unclosed_simple_pattern.ml b/testsuite/tests/parse-errors/unclosed_simple_pattern.ml index f0878848bbb..4c4c052e2c5 100644 --- a/testsuite/tests/parse-errors/unclosed_simple_pattern.ml +++ b/testsuite/tests/parse-errors/unclosed_simple_pattern.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) let f = function diff --git a/testsuite/tests/parse-errors/unclosed_struct.ml b/testsuite/tests/parse-errors/unclosed_struct.ml index 6066f1e826a..5b05335e73e 100644 --- a/testsuite/tests/parse-errors/unclosed_struct.ml +++ b/testsuite/tests/parse-errors/unclosed_struct.ml @@ -1,8 +1,8 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = struct diff --git a/testsuite/tests/parsetree/locations_test.compilers.reference b/testsuite/tests/parsetree/locations_test.compilers.reference index 34b79a7092f..0c85eb1d1eb 100644 --- a/testsuite/tests/parsetree/locations_test.compilers.reference +++ b/testsuite/tests/parsetree/locations_test.compilers.reference @@ -1441,4 +1441,82 @@ Ptop_def ] val g : int -> int = +Ptop_def + [ + structure_item (//toplevel//[3,15+0]..[3,15+27]) + Pstr_value Nonrec + [ + + pattern (//toplevel//[3,15+4]..[3,15+5]) + Ppat_var "f" (//toplevel//[3,15+4]..[3,15+5]) + expression (//toplevel//[3,15+6]..[3,15+27]) ghost + Pexp_newtype "a" + expression (//toplevel//[3,15+6]..[3,15+27]) ghost + Pexp_newtype "b" + expression (//toplevel//[3,15+6]..[3,15+27]) ghost + Pexp_newtype "c" + expression (//toplevel//[3,15+6]..[3,15+27]) ghost + Pexp_newtype "d" + expression (//toplevel//[3,15+6]..[3,15+27]) ghost + Pexp_newtype "e" + expression (//toplevel//[3,15+25]..[3,15+27]) + Pexp_construct "()" (//toplevel//[3,15+25]..[3,15+27]) + None + ] + ] + +val f : unit = () +Ptop_def + [ + structure_item (//toplevel//[2,1+0]..[2,1+26]) + Pstr_eval + expression (//toplevel//[2,1+0]..[2,1+26]) + Pexp_newtype "a" + expression (//toplevel//[2,1+0]..[2,1+26]) ghost + Pexp_newtype "b" + expression (//toplevel//[2,1+0]..[2,1+26]) ghost + Pexp_newtype "c" + expression (//toplevel//[2,1+0]..[2,1+26]) ghost + Pexp_newtype "d" + expression (//toplevel//[2,1+0]..[2,1+26]) ghost + Pexp_newtype "e" + expression (//toplevel//[2,1+24]..[2,1+26]) + Pexp_construct "()" (//toplevel//[2,1+24]..[2,1+26]) + None + ] + +- : unit = () +Ptop_def + [ + structure_item (//toplevel//[2,1+0]..[2,1+29]) + Pstr_value Nonrec + [ + + pattern (//toplevel//[2,1+4]..[2,1+24]) ghost + Ppat_constraint + pattern (//toplevel//[2,1+4]..[2,1+5]) + Ppat_var "a" (//toplevel//[2,1+4]..[2,1+5]) + core_type (//toplevel//[2,1+20]..[2,1+24]) ghost + Ptyp_poly 'a 'b 'c + core_type (//toplevel//[2,1+20]..[2,1+24]) + Ptyp_constr "unit" (//toplevel//[2,1+20]..[2,1+24]) + [] + expression (//toplevel//[2,1+4]..[2,1+29]) + Pexp_newtype "a" + expression (//toplevel//[2,1+4]..[2,1+29]) ghost + Pexp_newtype "b" + expression (//toplevel//[2,1+4]..[2,1+29]) ghost + Pexp_newtype "c" + expression (//toplevel//[2,1+4]..[2,1+29]) + Pexp_constraint + expression (//toplevel//[2,1+27]..[2,1+29]) + Pexp_construct "()" (//toplevel//[2,1+27]..[2,1+29]) + None + core_type (//toplevel//[2,1+20]..[2,1+24]) + Ptyp_constr "unit" (//toplevel//[2,1+20]..[2,1+24]) + [] + ] + ] + +val a : unit = () diff --git a/testsuite/tests/parsetree/locations_test.ml b/testsuite/tests/parsetree/locations_test.ml index e295d9a4caa..55479d2671b 100644 --- a/testsuite/tests/parsetree/locations_test.ml +++ b/testsuite/tests/parsetree/locations_test.ml @@ -1,6 +1,6 @@ -(* TEST - flags = "-dparsetree" - * toplevel *) +(* TEST_BELOW +Filler_text_added_ +to_preserve_lo*) (* Using a toplevel test and not an expect test, because the locs get shifted by the expect blocks and the output is therefore not stable. *) @@ -132,3 +132,18 @@ let g y = let f ~y = y + 1 in f ~(y:int) ;; + +(* Newtype *) +let f (type a b c d e) = () +;; + +fun (type a b c d e) -> () +;; + +let a : type a b c. unit = () +;; + +(* TEST + flags = "-dparsetree"; + toplevel; +*) diff --git a/testsuite/tests/parsetree/modes_ast_mapper.ml b/testsuite/tests/parsetree/modes_ast_mapper.ml new file mode 100644 index 00000000000..adcc688c59e --- /dev/null +++ b/testsuite/tests/parsetree/modes_ast_mapper.ml @@ -0,0 +1,31 @@ +(* TEST + include ocamlcommon; +*) + +let mode_to_string (m : Jane_syntax.Mode_expr.t) = + List.map (fun m -> + (m : Jane_syntax.Mode_expr.Const.t :> _ Location.loc).txt + ) m.txt + |> String.concat " " +let mapper: Ast_mapper.mapper = + let open Ast_mapper in + { default_mapper with + modes = fun sub m -> + Format.printf "%s [%a]\n" + (mode_to_string m) + Location.print_loc m.loc; + default_mapper.modes sub m} + +let test mapper s = + let p = Lexing.from_string s |> Parse.implementation in + ignore (mapper.Ast_mapper.structure mapper p); + Format.printf "------------------------------\n" + +(* CR zqian: add [modalities] to mapper so the following [bar hello] can be + printed *) +let () = + test mapper "let f (local_ x) = x"; + test mapper "let unique_ f (local_ x) = x"; + test mapper "let local_ f x: int -> int = x"; + test mapper "module M : sig val x : string -> string @ foo @@ bar hello end = struct end"; + () diff --git a/testsuite/tests/parsetree/modes_ast_mapper.reference b/testsuite/tests/parsetree/modes_ast_mapper.reference new file mode 100644 index 00000000000..5b5b1e2e3ae --- /dev/null +++ b/testsuite/tests/parsetree/modes_ast_mapper.reference @@ -0,0 +1,12 @@ +local [File "_none_", line 1] +------------------------------ +local [File "_none_", line 1] +unique [File "_none_", line 1, characters 4-11] +unique [File "_none_", line 1, characters 4-11] +------------------------------ +local [File "_none_", line 1, characters 29-30] +local [File "_none_", line 1, characters 4-10] +local [File "_none_", line 1, characters 4-10] +------------------------------ +foo [File "_none_", line 1] +------------------------------ diff --git a/testsuite/tests/parsetree/ppx_no_op.ml b/testsuite/tests/parsetree/ppx_no_op.ml new file mode 100644 index 00000000000..fb96dc37351 --- /dev/null +++ b/testsuite/tests/parsetree/ppx_no_op.ml @@ -0,0 +1,9 @@ +open Ast_mapper + +(* This PPX rewriter does nothing. *) + +let () = + Language_extension.set_universe_and_enable_all + Language_extension.Universe.maximal; + Ast_mapper.register "no-op" (fun _ -> Ast_mapper.default_mapper); +;; diff --git a/testsuite/tests/parsetree/source_jane_street.ml b/testsuite/tests/parsetree/source_jane_street.ml index 75f65539634..94e79d1d04b 100644 --- a/testsuite/tests/parsetree/source_jane_street.ml +++ b/testsuite/tests/parsetree/source_jane_street.ml @@ -9,6 +9,7 @@ let f (type a : immediate) (x : a) = x;; let f (type (a : immediate)) (x : a) = x;; let f (type (a : immediate) (b : immediate)) (x : a) = x;; +let f (type (a : immediate) (b : immediate) c) (x : a) = x;; let f y (type a : immediate) (x : a) = x;; let f y (type (a : immediate)) (x : a) = x;; @@ -17,12 +18,26 @@ let f y (type (a : immediate) (b : immediate)) (x : a) = x;; let f y (type a : immediate) = y;; let f y (type (a : immediate)) = y;; let f y (type (a : immediate) (b : immediate)) = y;; +let f y (type (a : immediate) (b : immediate) c) = y;; + (* Just newtypes, no value parameters *) let f (type a : immediate) (type b : immediate) (type (c : immediate) (d : immediate)) = ();; +module type S_for_layouts = sig + type t : float64 + + type variant = A : ('a : immediate). 'a -> variant + + val f1: ('a : float64) ('b : immediate) 'c . 'a -> 'b -> 'c + val f2: ('a : float64) 'b ('c : bits64) . 'a -> 'b -> 'c + val f3: 'a 'b ('c : word) . 'a -> 'b -> 'c +end;; + +type ('a : immediate) for_layouts = 'a;; + (******************) (* Comprehensions *) @@ -58,17 +73,19 @@ let f (type a : immediate) (type b : immediate) ([(x[@test.attr1]) for (x[@test.attr2]) in ([][@test.attr3])] [@test.attr4]);; (*********) -(* Local *) +(* Modes *) (* parameters *) -let f (local_ x) ~(local_ y) ~z:(local_ z) ?foo:(local_ w = 1) = x + y + z + w;; +let f (local_ unique_ x) ~(local_ once_ y) ~z:(unique_ once_ z) + ?foo:(local_ unique_ once_ w = 1) () = ();; (* bindings *) let g () = - let local_ f = () in - let local_ f : 'a . 'a -> 'a = fun x -> x in - let local_ f x y = x + y in - let local_ f : int -> int = fun z -> z + z in + let local_ unique_ f = () in + let unique_ once_ f : 'a . 'a -> 'a = fun x -> x in + let once_ local_ f x y = x + y in + let local_ unique_ once_ f : int -> int = fun z -> z + z in + let local_ f x: int -> int = x in (* nroberts: we should reenable this test when we fix * pprint_ast to put the (int -> int) annotation back in * the correct position. *) @@ -76,10 +93,15 @@ let g () = ();; (* expressions *) -let g () = local_ - let f = local_ () in - let f x y = local_ (x + y) in - local_ ();; +let g () = local_ unique_ + let f = unique_ once_ () in + let f x y = once_ local_ (x + y) in + local_ unique_ once_ ();; + +(* exclaves *) +let f () = exclave_ + let f x y = exclave_ (x + y) in + () (* types *) type record = @@ -91,20 +113,25 @@ type 'a parameterized_record = { mutable a: 'a ; global_ c: 'a };; -type fn = local_ int -> local_ int;; -type nested_fn = (local_ int -> local_ int) -> local_ int;; +type fn = local_ unique_ int -> local_ once_ int;; +type nested_fn = (local_ unique_ int -> local_ once_ int) -> local_ unique_ once_ int;; type ('a, 'b) labeled_fn = - a:local_ 'a -> ?b:local_ b -> local_ 'a -> (int -> local_ 'b);; + a:local_ unique_ 'a -> ?b:local_ once_ 'b -> unique_ once_ 'a -> (int -> once_ unique_ 'b);; (*******************) (* Include functor *) +module F_struct (_ : sig end) = struct +end + +module type F_sig = functor (_ : sig end) -> sig end + module T = struct - include functor F + include functor F_struct end;; module type S = sig - include functor F + include functor F_sig end;; (********************) @@ -115,4 +142,163 @@ let f x = | [::] -> [::] | ([:x:] [@test.attr1]) -> (([:x:])[@test.attr1]) | ([:x;y:] [@test.attr2][@test.attr3]) -> - ([:x;y:] [@test.attr2][@test.attr3]);; + ([:x;y:] [@test.attr2][@test.attr3]) + | _ -> assert false;; + +(******************) +(* Labeled tuples *) +let z, punned = 4, 5 +let x_must_be_even _ = assert false +exception Odd + +let x = (~x:1, ~y:2) +let x = ((~x:1, ~y:2) [@test.attr]) +let _ = ( ~x: 5, 2, ~z, ~(punned:int)) +let (x : (x:int * y:int)) = (~x:1, ~y:2) +let (x : ((x:int * y:int) [@test.attr])) = (~x:1, ~y:2) + +let (~x:x0, ~s, ~(y:int), ..) : (x:int * s:string * y:int * string) = + (~x: 1, ~s: "a", ~y: 2, "ignore me") + +module M : sig + val f : (x:int * string) -> (x:int * string) + val mk : unit -> (x:bool * y:string) +end = struct + let f x = x + let mk () = (~x:false, ~y:"hi") +end + +module X_int_int = struct + type t = (x:int * int) +end + +let foo xy k_good k_bad = + match x_must_be_even xy with + | (~x, y) -> k_good () + | exception Odd -> k_bad () + +let (~(x:int), ~y, _) = (~x: 1, ~y: 2, "ignore me") +let ((~(x:int), ~y, _) [@test.attr]) = (~x: 1, ~y: 2, "ignore me") +let f = fun (~foo, ~bar:bar) -> foo * 10 + bar +let f ((~(x:int),y) : (x:int * int)) : int = x + y + +type xy = (x:int * y:int) + +(* Reordering and partial matches *) +let lt = (~x:1, ~y:2, ~x:3, 4) + +let matches = + let (~x, .. ) = lt in + x + +let matches = + let (~y, ~x, .. ) = lt in + (x, y) + +(********************) +(* Unboxed literals *) + +module Float_u = Stdlib_upstream_compatible.Float_u +module Int32_u = Stdlib_upstream_compatible.Int32_u +module Int64_u = Stdlib_upstream_compatible.Int64_u +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u + +let test_float s f = + Format.printf "%s: %f\n" s (Float_u.to_float f); Format.print_flush () +let test_int32 s f = + Format.printf "%s: %ld\n" s (Int32_u.to_int32 f); Format.print_flush () +let test_int64 s f = + Format.printf "%s: %Ld\n" s (Int64_u.to_int64 f); Format.print_flush () +let test_nativeint s f = + Format.printf "%s: %s\n" s (Nativeint_u.to_string f); Format.print_flush () + +(* Expressions *) + +let () = test_float "e" #2.718281828459045 +let () = test_float "negative_one_half" (-#0.5) +let () = test_float "negative_one_half" (- #0.5) +let () = test_float "negative_one_half" (-.#0.5) +let () = test_float "negative_one_half" (-. #0.5) +let () = test_float "positive_one_dot" (+#1.) +let () = test_float "positive_one_dot" (+ #1.) +let () = test_float "positive_one_dot" (+.#1.) +let () = test_float "positive_one_dot" (+. #1.) +let () = test_float "one_billion" (#1e9) +let () = test_float "one_twenty_seven_point_two_five_in_floating_hex" (#0x7f.4) +let () = test_float "five_point_three_seven_five_in_floating_hexponent" (#0xa.cp-1) + +let () = test_nativeint "zero" (#0n) +let () = test_int32 "positive_one" (+#1l) +let () = test_int32 "positive_one" (+ #1l) +let () = test_int64 "negative_one" (-#1L) +let () = test_int64 "negative_one" (- #1L) +let () = test_nativeint "two_fifty_five_in_hex" (#0xFFn) +let () = test_int32 "twenty_five_in_octal" (#0o31l) +let () = test_int64 "forty_two_in_binary" (#0b101010L) + +(* Patterns *) + +let f x = + match x with + | #4. -> `Four + | #5. -> `Five + | _ -> `Other +;; + +let () = + match f #5. with + | `Five -> () + | _ -> assert false;; + +let f x = + match x with + | #4. -> #0. + | #5. -> #1. + | x -> x +;; + +test_float "result" (f #7.);; + +let f x = + match x with + | #4. -> #0. + | #5. -> #1. + | #6. -> #2. + | #7. -> #3. + | #8. -> #4. + | #9. -> #5. + | #10. -> #6. + | #11. -> #7. + | x -> x +;; + +test_float "larger match result" (f #7.);; + + +let f x = + match x with + | #4L -> `Four + | #5L -> `Five + | _ -> `Other +;; + +let () = + match f #4L with + | `Four -> () + | _ -> assert false;; + +let f x = + match x with + | #4L -> #0L + | #5L -> #1L + | x -> x +;; + +test_int64 "result" (f #7L);; + +(***************) +(* Modal kinds *) + +(* CR layouts v2.8: add examples like the ones in + [pprintast_unconditional.ml] when modal kind syntax is fully + implemented. [test_ppx.ml] currently fails. *) diff --git a/testsuite/tests/parsetree/test.ml b/testsuite/tests/parsetree/test.ml index 84b31bbc841..5f5ee1dd4e0 100644 --- a/testsuite/tests/parsetree/test.ml +++ b/testsuite/tests/parsetree/test.ml @@ -1,6 +1,6 @@ (* TEST - include ocamlcommon - readonly_files = "source.ml source_jane_street.ml" + include ocamlcommon; + readonly_files = "source.ml source_jane_street.ml"; *) (* (c) Alain Frisch / Lexifi *) @@ -61,7 +61,7 @@ let test parse_fun pprint print map filename ~extra_checks = | ast -> let str = to_string pprint ast in begin - match extra_checks str with + match extra_checks (to_string print ast) str with | Ok () -> () | Error reason -> Printf.printf "%s: FAIL, %s\n" filename reason; @@ -112,7 +112,7 @@ let rec process path ~extra_checks = path ~extra_checks -let process ?(extra_checks = fun _ -> Ok ()) text = process text ~extra_checks +let process ?(extra_checks = fun _ _ -> Ok ()) text = process text ~extra_checks (* Produce an error if any attribute/extension node does not start with the text prefix. @@ -128,7 +128,7 @@ let process ?(extra_checks = fun _ -> Ok ()) text = process text ~extra_checks We've chosen to keep those constructs out of the test file in preference to updating this logic to properly handle them (which is hard). *) -let check_all_attributes_and_extensions_start_with text ~prefix = +let check_all_printed_attributes_and_extensions_start_with text ~prefix = let check introduction_string = String.split_on_char '[' text |> List.for_all (fun s -> @@ -146,14 +146,63 @@ let check_all_attributes_and_extensions_start_with text ~prefix = prefix) ;; +let check_all_ast_attributes_and_extensions_start_with raw_parsetree_str ~prefixes = + (* Sadly can't use Ast_mapper here because it decodes Jane Syntax by default and + we will need quite a bit of code duplication for it to work for this use case. *) + let check introduction_string = + Misc.Stdlib.String.split_on_string ~split_on:(introduction_string ^ " \"") + raw_parsetree_str + |> List.tl + |> List.for_all (fun s -> + List.exists + (fun prefix -> String.starts_with s ~prefix) + prefixes) + in + if check "extension" && check "attribute" + then Ok () + else + Error + (Printf.sprintf + "Printast produced an extension node or attribute that doesn't \ + begin with one of [%s]" + (String.concat ", " prefixes)) +;; + let () = process "source.ml"; - Language_extension.enable_maximal (); - process "source_jane_street.ml" ~extra_checks:(fun text -> - (* Check that printing Jane Street language extensions produces no more + Language_extension.set_universe_and_enable_all + Language_extension.Universe.maximal; + process "source_jane_street.ml" ~extra_checks:(fun raw_parsetree_str text -> + (* Additionally check that: + + 1. Jane Street language extensions only use "extension." and "jane." prefixed + attributes and exntensions for its parsetree encoding. This is important for + ppx support. + + 2. Printing Jane Street language extensions produces no more attributes or extension nodes than the input program, all of whose attributes begin with "test". This ensures that Jane Syntax attributes aren't printed. *) - check_all_attributes_and_extensions_start_with text ~prefix:"test"); + Result.bind + (check_all_ast_attributes_and_extensions_start_with raw_parsetree_str + ~prefixes:["extension."; "jane."; "test."]) + (fun () -> check_all_printed_attributes_and_extensions_start_with text + ~prefix:"test")); + (* Additionally check that merely parsing doesn't attempt + to check extensions enabledness. This is actually an important property. + That's because ppxes run the parser code in a separate process from the + compiler, and ppxes always enable extensions to the max. So checks + in the parser are ineffective in a common mode of running the + compiler. + *) + Language_extension.disable_all (); + match from_file Parse.implementation "source_jane_street.ml" with + | (_ : _ list) -> () + | exception _ -> + print_endline + "Failed to parse with all extensions disabled after successfully\ + \ parsing with all extensions enabled. Does the parser check for\ + \ extension enabledness, which is almost certainly a bug? (See the\ + \ comment by this test.)" ;; diff --git a/testsuite/tests/parsetree/test_ppx.compilers.reference b/testsuite/tests/parsetree/test_ppx.compilers.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testsuite/tests/parsetree/test_ppx.ml b/testsuite/tests/parsetree/test_ppx.ml new file mode 100644 index 00000000000..a5c1d6d8b28 --- /dev/null +++ b/testsuite/tests/parsetree/test_ppx.ml @@ -0,0 +1,16 @@ +(* TEST + readonly_files = "source_jane_street.ml ppx_no_op.ml"; + include ocamlcommon; + include stdlib_upstream_compatible; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/ppx_no_op.exe"; + all_modules = "ppx_no_op.ml"; + ocamlc.byte; + module = "source_jane_street.ml"; + flags = "-I ${test_build_directory} -w -26 -extension layouts_beta -extension comprehensions -ppx ${program}"; + ocamlc.byte; + check-ocamlc.byte-output; +*) + +(* This test ensures that Jane Street syntax continues to be + handled properly by the compiler even after applying a PPX rewriter. *) diff --git a/testsuite/tests/parsing/anonymous_class_parameter.ml b/testsuite/tests/parsing/anonymous_class_parameter.ml index bbecc1272b2..d2a9fed4788 100644 --- a/testsuite/tests/parsing/anonymous_class_parameter.ml +++ b/testsuite/tests/parsing/anonymous_class_parameter.ml @@ -1,8 +1,8 @@ (* TEST - flags = "-i" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + flags = "-i"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* This test is valid OCaml code. diff --git a/testsuite/tests/parsing/arrow_ambiguity.ml b/testsuite/tests/parsing/arrow_ambiguity.ml index 5af88afe2b0..a40b7b5d300 100644 --- a/testsuite/tests/parsing/arrow_ambiguity.ml +++ b/testsuite/tests/parsing/arrow_ambiguity.ml @@ -1,8 +1,8 @@ (* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* A potential ambiguity arises because the arrow -> is used diff --git a/testsuite/tests/parsing/assert_location.ml b/testsuite/tests/parsing/assert_location.ml index dc8c6b47ca5..58a79aeec08 100644 --- a/testsuite/tests/parsing/assert_location.ml +++ b/testsuite/tests/parsing/assert_location.ml @@ -1,7 +1,11 @@ -(* TEST - exit_status = "2" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) let () = ( assert false ) + +(* TEST + exit_status = "2"; +*) diff --git a/testsuite/tests/parsing/attributes.compilers.reference b/testsuite/tests/parsing/attributes.compilers.reference index 956550354f4..b7cff817d1c 100644 --- a/testsuite/tests/parsing/attributes.compilers.reference +++ b/testsuite/tests/parsing/attributes.compilers.reference @@ -26,11 +26,13 @@ pext_kind = Pext_decl [ - core_type (attributes.ml[10,150+18]..[10,150+21]) - attribute "foo" - [] - Ptyp_constr "int" (attributes.ml[10,150+18]..[10,150+21]) + (attributes.ml[10,150+17]..[10,150+29]) [] + core_type (attributes.ml[10,150+18]..[10,150+21]) + attribute "foo" + [] + Ptyp_constr "int" (attributes.ml[10,150+18]..[10,150+21]) + [] ] None structure_item (attributes.ml[12,196+0]..[12,196+8]) @@ -75,11 +77,13 @@ attribute "foo" [] [ - core_type (attributes.ml[18,265+12]..[18,265+13]) - attribute "foo" - [] - Ptyp_constr "t" (attributes.ml[18,265+12]..[18,265+13]) + (attributes.ml[18,265+11]..[18,265+20]) [] + core_type (attributes.ml[18,265+12]..[18,265+13]) + attribute "foo" + [] + Ptyp_constr "t" (attributes.ml[18,265+12]..[18,265+13]) + [] ] None ] @@ -119,6 +123,7 @@ attribute "foo" [] Immutable + [] "l" (attributes.ml[26,344+4]..[26,344+5]) core_type (attributes.ml[26,344+9]..[26,344+10]) attribute "foo" [] @@ -155,11 +160,13 @@ pext_kind = Pext_decl [ - core_type (attributes.ml[37,450+20]..[37,450+23]) - attribute "foo" - [] - Ptyp_constr "int" (attributes.ml[37,450+20]..[37,450+23]) + (attributes.ml[37,450+19]..[37,450+31]) [] + core_type (attributes.ml[37,450+20]..[37,450+23]) + attribute "foo" + [] + Ptyp_constr "int" (attributes.ml[37,450+20]..[37,450+23]) + [] ] None signature_item (attributes.ml[39,498+2]..[40,566+11]) diff --git a/testsuite/tests/parsing/attributes.ml b/testsuite/tests/parsing/attributes.ml index 14a00083e6d..81caf0f8204 100644 --- a/testsuite/tests/parsing/attributes.ml +++ b/testsuite/tests/parsing/attributes.ml @@ -1,8 +1,8 @@ -(* TEST - flags = "-dparsetree" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_ +to_preserve_locations_while_tran +slating_from_old_ +syntax__Filler_text_added_to_pr *) exception Foo [@foo] [@@foo] @@ -55,3 +55,10 @@ module _ = (Int : T with type t = int [@foo]) let _ = (module Int : T [@foo]) let _ = (module Int : T with type t = int [@foo]) + +(* TEST + flags = "-dparsetree"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/broken_invariants.compilers.reference b/testsuite/tests/parsing/broken_invariants.compilers.reference index a77a45ba19b..626c1d694ea 100644 --- a/testsuite/tests/parsing/broken_invariants.compilers.reference +++ b/testsuite/tests/parsing/broken_invariants.compilers.reference @@ -26,4 +26,12 @@ Line 2, characters 4-15: 2 | [%%missing_rhs] ^^^^^^^^^^^ Error: broken invariant in parsetree: Module type substitution with no right hand side +Line 2, characters 9-26: +2 | let f ([%lt_empty_open_pat]) = ();; + ^^^^^^^^^^^^^^^^^ +Error: broken invariant in parsetree: Open labeled tuple patterns must have at least one component. +Line 1, characters 9-28: +1 | let f ([%lt_short_closed_pat]) = ();; + ^^^^^^^^^^^^^^^^^^^ +Error: broken invariant in parsetree: Closed labeled tuple patterns must have at least 2 components. diff --git a/testsuite/tests/parsing/broken_invariants.ml b/testsuite/tests/parsing/broken_invariants.ml index 29e09a191cd..0ca3bcced91 100644 --- a/testsuite/tests/parsing/broken_invariants.ml +++ b/testsuite/tests/parsing/broken_invariants.ml @@ -1,12 +1,12 @@ -(* TEST - readonly_files = "illegal_ppx.ml" - * setup-ocamlc.byte-build-env - ** ocamlc.byte with ocamlcommon - all_modules="illegal_ppx.ml" - program="ppx.exe" - *** toplevel - all_modules="broken_invariants.ml" - flags="-ppx '${ocamlrun} ${test_build_directory_prefix}/ocamlc.byte/ppx.exe'" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + *) let empty_tuple = [%tuple];; @@ -18,3 +18,17 @@ let f = function [%record_with_functor_fields] -> ();; module type s = sig [%%missing_rhs] end;; + +let f ([%lt_empty_open_pat]) = ();; +let f ([%lt_short_closed_pat]) = ();; + +(* TEST + readonly_files = "illegal_ppx.ml"; + setup-ocamlc.byte-build-env; + all_modules = "illegal_ppx.ml"; + program = "ppx.exe"; + ocamlc.byte with ocamlcommon; + all_modules = "broken_invariants.ml"; + flags = "-extension labeled_tuples -ppx '${ocamlrun} ${test_build_directory_prefix}/ocamlc.byte/ppx.exe'"; + toplevel; +*) diff --git a/testsuite/tests/parsing/change_start_loc.ml b/testsuite/tests/parsing/change_start_loc.ml index 2e5604ce78a..5ebe2bd770a 100644 --- a/testsuite/tests/parsing/change_start_loc.ml +++ b/testsuite/tests/parsing/change_start_loc.ml @@ -1,6 +1,6 @@ (* TEST -flags = "-I ${ocamlsrcdir}/parsing -I ${ocamlsrcdir}/toplevel" -include ocamlcommon + flags = "-I ${ocamlsrcdir}/parsing -I ${ocamlsrcdir}/toplevel"; + include ocamlcommon; *) let position = Lexing.{ (* This corresponds to File "file.ml", line 100, character 10 *) pos_fname = "------should not appear------"; diff --git a/testsuite/tests/parsing/constructor_declarations.ml b/testsuite/tests/parsing/constructor_declarations.ml index cac1f1b0d7b..0681a567f7f 100644 --- a/testsuite/tests/parsing/constructor_declarations.ml +++ b/testsuite/tests/parsing/constructor_declarations.ml @@ -1,8 +1,8 @@ -(* TEST - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) (* Allowed. *) @@ -23,3 +23,10 @@ type w = | | A of int | B of bool + +(* TEST + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/docstrings.ml b/testsuite/tests/parsing/docstrings.ml index 401fbd3502f..cf5a82f3598 100644 --- a/testsuite/tests/parsing/docstrings.ml +++ b/testsuite/tests/parsing/docstrings.ml @@ -1,6 +1,6 @@ (* TEST - * expect - flags += " -dsource " + flags += " -dsource "; + expect; *) (***********************************************************************) diff --git a/testsuite/tests/parsing/extended_indexoperators.ml b/testsuite/tests/parsing/extended_indexoperators.ml index bb5fec23b1d..348a500606a 100644 --- a/testsuite/tests/parsing/extended_indexoperators.ml +++ b/testsuite/tests/parsing/extended_indexoperators.ml @@ -1,6 +1,6 @@ (* TEST - * expect - flags = "-dsource" + flags = "-dsource"; + expect; *) let (.?[]) = Hashtbl.find_opt diff --git a/testsuite/tests/parsing/extension_operators.ml b/testsuite/tests/parsing/extension_operators.ml index 683ec5952bb..e13330399db 100644 --- a/testsuite/tests/parsing/extension_operators.ml +++ b/testsuite/tests/parsing/extension_operators.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f o x = o##x;; diff --git a/testsuite/tests/parsing/extensions.compilers.reference b/testsuite/tests/parsing/extensions.compilers.reference index 075a5167fec..f79405caf9c 100644 --- a/testsuite/tests/parsing/extensions.compilers.reference +++ b/testsuite/tests/parsing/extensions.compilers.reference @@ -283,6 +283,7 @@ Ptyp_constr "t" (extensions.ml[24,573+19]..[24,573+20]) [] [] + [] signature_item (extensions.ml[24,573+22]..[24,573+31]) Psig_value value_description "y" (extensions.ml[24,573+26]..[24,573+27]) (extensions.ml[24,573+22]..[24,573+31]) @@ -290,6 +291,7 @@ Ptyp_constr "t" (extensions.ml[24,573+30]..[24,573+31]) [] [] + [] ] expression (extensions.ml[25,606+4]..[25,606+23]) Pexp_extension "foo" diff --git a/testsuite/tests/parsing/extensions.ml b/testsuite/tests/parsing/extensions.ml index 326d2a47688..b42570c0124 100644 --- a/testsuite/tests/parsing/extensions.ml +++ b/testsuite/tests/parsing/extensions.ml @@ -1,9 +1,9 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_ +to_preserve_locations_while_tran +slating_from_old_syntax__Filler_ +text_added_to_pre +serve_locations_while_translati *) [%%foo let x = 1 in x] @@ -23,3 +23,11 @@ let [%foo? (Bar x | Baz x) ] : [%foo? #bar ] = [%foo? { x }] let [%foo: include S with type t = t ] : [%foo: val x : t val y : t] = [%foo: type t = t ] + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/hash_ambiguity.compilers.reference b/testsuite/tests/parsing/hash_ambiguity.compilers.reference index 6caf201354f..8808e3928a7 100644 --- a/testsuite/tests/parsing/hash_ambiguity.compilers.reference +++ b/testsuite/tests/parsing/hash_ambiguity.compilers.reference @@ -61,13 +61,15 @@ (hash_ambiguity.ml[15,425+12]..[15,425+26]) "A" (hash_ambiguity.ml[15,425+12]..[15,425+13]) [ - core_type (hash_ambiguity.ml[15,425+17]..[15,425+26]) - Ptyp_class "list" (hash_ambiguity.ml[15,425+22]..[15,425+26]) - [ - core_type (hash_ambiguity.ml[15,425+17]..[15,425+20]) - Ptyp_constr "int" (hash_ambiguity.ml[15,425+17]..[15,425+20]) - [] - ] + (hash_ambiguity.ml[15,425+17]..[15,425+26]) + [] + core_type (hash_ambiguity.ml[15,425+17]..[15,425+26]) + Ptyp_class "list" (hash_ambiguity.ml[15,425+22]..[15,425+26]) + [ + core_type (hash_ambiguity.ml[15,425+17]..[15,425+20]) + Ptyp_constr "int" (hash_ambiguity.ml[15,425+17]..[15,425+20]) + [] + ] ] None ] @@ -92,16 +94,20 @@ (hash_ambiguity.ml[17,453+12]..[17,453+32]) "A" (hash_ambiguity.ml[17,453+12]..[17,453+13]) [ - core_type (hash_ambiguity.ml[17,453+17]..[17,453+20]) - Ptyp_constr "int" (hash_ambiguity.ml[17,453+17]..[17,453+20]) + (hash_ambiguity.ml[17,453+17]..[17,453+20]) + [] + core_type (hash_ambiguity.ml[17,453+17]..[17,453+20]) + Ptyp_constr "int" (hash_ambiguity.ml[17,453+17]..[17,453+20]) + [] + (hash_ambiguity.ml[17,453+23]..[17,453+32]) [] - core_type (hash_ambiguity.ml[17,453+23]..[17,453+32]) - Ptyp_class "list" (hash_ambiguity.ml[17,453+28]..[17,453+32]) - [ - core_type (hash_ambiguity.ml[17,453+23]..[17,453+26]) - Ptyp_constr "int" (hash_ambiguity.ml[17,453+23]..[17,453+26]) - [] - ] + core_type (hash_ambiguity.ml[17,453+23]..[17,453+32]) + Ptyp_class "list" (hash_ambiguity.ml[17,453+28]..[17,453+32]) + [ + core_type (hash_ambiguity.ml[17,453+23]..[17,453+26]) + Ptyp_constr "int" (hash_ambiguity.ml[17,453+23]..[17,453+26]) + [] + ] ] None ] diff --git a/testsuite/tests/parsing/hash_ambiguity.ml b/testsuite/tests/parsing/hash_ambiguity.ml index 32f8297f5e2..f364fac99af 100644 --- a/testsuite/tests/parsing/hash_ambiguity.ml +++ b/testsuite/tests/parsing/hash_ambiguity.ml @@ -1,8 +1,8 @@ -(* TEST - flags = "-stop-after parsing -dparsetree" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_to_preserve_location +s_while_translating_from_old_syn +tax__Filler_text_ +added_to_preserve_locations_whi *) class ['a] list = object end @@ -15,3 +15,10 @@ type 'a t = int #list as 'a type 'a u = A of int #list type 'a v = A of int * int #list + +(* TEST + flags = "-stop-after parsing -dparsetree"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/illegal_ppx.ml b/testsuite/tests/parsing/illegal_ppx.ml index 0f8f1b42465..37cd0b89244 100644 --- a/testsuite/tests/parsing/illegal_ppx.ml +++ b/testsuite/tests/parsing/illegal_ppx.ml @@ -18,6 +18,18 @@ let functor_id loc = Location.mkloc let complex_record loc = H.Pat.record ~loc [functor_id loc, H.Pat.any ~loc () ] Asttypes.Closed +(* Malformed labeled tuples *) + +let lt_empty_open_pat loc = + let pat = H.Pat.mk Ppat_any in + Jane_syntax.Labeled_tuples.pat_of ~loc + ([], Open) + +let lt_short_closed_pat loc = + let pat = H.Pat.mk Ppat_any in + Jane_syntax.Labeled_tuples.pat_of ~loc + ([Some "baz", pat], Closed) + let super = M.default_mapper let expr mapper e = match e.pexp_desc with @@ -27,10 +39,18 @@ let expr mapper e = -> empty_apply loc e | _ -> super.M.expr mapper e +let typ mapper t = + match t.ptyp_desc with + | _ -> super.M.typ mapper t + let pat mapper p = match p.ppat_desc with | Ppat_extension ({txt="record_with_functor_fields";loc},_) -> complex_record loc + | Ppat_extension ({txt="lt_empty_open_pat";loc},_) -> + lt_empty_open_pat loc + | Ppat_extension ({txt="lt_short_closed_pat";loc},_) -> + lt_short_closed_pat loc | _ -> super.M.pat mapper p let structure_item mapper stri = match stri.pstr_desc with @@ -44,5 +64,5 @@ let signature_item mapper stri = match stri.psig_desc with let () = M.register "illegal ppx" (fun _ -> - { super with expr; pat; structure_item; signature_item } + { super with typ; expr; pat; structure_item; signature_item } ) diff --git a/testsuite/tests/parsing/include_functor.ml b/testsuite/tests/parsing/include_functor.ml index 7aebdf9a29a..07a99b2f2a5 100644 --- a/testsuite/tests/parsing/include_functor.ml +++ b/testsuite/tests/parsing/include_functor.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dsource -extension include_functor" - * expect + flags = "-dsource -extension include_functor"; + expect; *) (* Test that include functor is printed with a keyword and not an attribute *) diff --git a/testsuite/tests/parsing/int_and_float_with_modifier.ml b/testsuite/tests/parsing/int_and_float_with_modifier.ml index 444964be851..5c4de59212e 100644 --- a/testsuite/tests/parsing/int_and_float_with_modifier.ml +++ b/testsuite/tests/parsing/int_and_float_with_modifier.ml @@ -1,9 +1,9 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_ +to_preserve_locations_while_tran +slating_from_old_syntax__Filler_ +text_added_to_pre +serve_locations_while_translati *) let int_with_custom_modifier = @@ -20,3 +20,11 @@ let hex_with_modifier = 0x32g let float_without_modifer = 1.2e3 let float_with_modifer = 1.2g + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/multi_indices.ml b/testsuite/tests/parsing/multi_indices.ml index fcc79ffbe76..4014809b065 100644 --- a/testsuite/tests/parsing/multi_indices.ml +++ b/testsuite/tests/parsing/multi_indices.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dsource" - * expect + flags = "-dsource"; + expect; *) module A = Bigarray.Genarray diff --git a/testsuite/tests/parsing/pr10468.ml b/testsuite/tests/parsing/pr10468.ml index d795b3bf0f6..b03bca79553 100644 --- a/testsuite/tests/parsing/pr10468.ml +++ b/testsuite/tests/parsing/pr10468.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dsource" - * expect + flags = "-dsource"; + expect; *) module type S = sig diff --git a/testsuite/tests/parsing/pr6604.compilers.reference b/testsuite/tests/parsing/pr6604.compilers.reference index fea21c9fdc7..f486e7b3526 100644 --- a/testsuite/tests/parsing/pr6604.compilers.reference +++ b/testsuite/tests/parsing/pr6604.compilers.reference @@ -1,4 +1,4 @@ File "pr6604.ml", line 9, characters 0-2: 9 | #1 ^^ -Error: Syntax error: line number directive not expected. +Error: Syntax error: Unboxed integer literals require width suffixes. diff --git a/testsuite/tests/parsing/pr6604.ml b/testsuite/tests/parsing/pr6604.ml index 806f9c37ed2..56150f06a1c 100644 --- a/testsuite/tests/parsing/pr6604.ml +++ b/testsuite/tests/parsing/pr6604.ml @@ -1,9 +1,17 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) #1 + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/pr6604_2.compilers.reference b/testsuite/tests/parsing/pr6604_2.compilers.reference index f4e6d547341..fa9a2892590 100644 --- a/testsuite/tests/parsing/pr6604_2.compilers.reference +++ b/testsuite/tests/parsing/pr6604_2.compilers.reference @@ -1,4 +1,4 @@ File "pr6604_2.ml", line 9, characters 1-3: 9 | #1 "pr6604.ml" ^^ -Error: Syntax error: line number directive not expected. +Error: Syntax error: Unboxed integer literals require width suffixes. diff --git a/testsuite/tests/parsing/pr6604_2.ml b/testsuite/tests/parsing/pr6604_2.ml index 995e242d330..a1287bd1285 100644 --- a/testsuite/tests/parsing/pr6604_2.ml +++ b/testsuite/tests/parsing/pr6604_2.ml @@ -1,9 +1,17 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) #1 "pr6604.ml" + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/pr6604_3.ml b/testsuite/tests/parsing/pr6604_3.ml index ef15c5c068f..c8fc095dd6e 100644 --- a/testsuite/tests/parsing/pr6604_3.ml +++ b/testsuite/tests/parsing/pr6604_3.ml @@ -1,8 +1,8 @@ (* TEST - flags = "-dparsetree" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + flags = "-dparsetree"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) # 1 "pr6604.ml" diff --git a/testsuite/tests/parsing/pr6865.ml b/testsuite/tests/parsing/pr6865.ml index c673e2a613f..9e98315b0bd 100644 --- a/testsuite/tests/parsing/pr6865.ml +++ b/testsuite/tests/parsing/pr6865.ml @@ -1,11 +1,19 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_ +to_preserve_locations_while_tran +slating_from_old_syntax__Filler_ +text_added_to_pre +serve_locations_while_translati *) let%foo x = 42 let%foo _ = () and _ = () let%foo _ = () + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/pr7165.ml b/testsuite/tests/parsing/pr7165.ml index e25708c1fc4..2e189f09c8c 100644 --- a/testsuite/tests/parsing/pr7165.ml +++ b/testsuite/tests/parsing/pr7165.ml @@ -1,12 +1,20 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* this is a lexer directive with an out-of-bound integer; it should result in a lexing error instead of an uncaught exception as in PR#7165 *) #9342101923012312312 "" + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/quotedextensions.ml b/testsuite/tests/parsing/quotedextensions.ml index f725f5a1a91..73892894914 100644 --- a/testsuite/tests/parsing/quotedextensions.ml +++ b/testsuite/tests/parsing/quotedextensions.ml @@ -1,9 +1,9 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_ +to_preserve_locations_while_tran +slating_from_old_syntax__Filler_ +text_added_to_pre +serve_locations_while_translati *) (* Structures *) @@ -40,3 +40,11 @@ let {%M.foo bar| {|x|} |bar} (* {|*)|}, and *) (* [%foo {bar|*)|bar}], and *) (* {%foo bar|*)|bar} should be valid inside comments *) + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/parsing/reloc.ml b/testsuite/tests/parsing/reloc.ml index 0948d171b49..816456ee7ce 100644 --- a/testsuite/tests/parsing/reloc.ml +++ b/testsuite/tests/parsing/reloc.ml @@ -1,7 +1,7 @@ (* TEST - flags = "-I ${ocamlsrcdir}/parsing -I ${ocamlsrcdir}/toplevel" - include ocamlcommon - * expect + flags = "-I ${ocamlsrcdir}/parsing -I ${ocamlsrcdir}/toplevel"; + include ocamlcommon; + expect; *) (* Check that [e.pexp_loc :: e.pexp_loc_stack] includes all diff --git a/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference b/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference index de0767440e9..4870b01f8e2 100644 --- a/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference +++ b/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference @@ -684,6 +684,7 @@ [] core_type (shortcut_ext_attr.ml[85,1728+23]..[85,1728+24]) Ptyp_any + [] [ "" ] @@ -787,6 +788,7 @@ Ptyp_constr "t" (shortcut_ext_attr.ml[98,1965+20]..[98,1965+21]) [] [] + [] ] signature_item (shortcut_ext_attr.ml[99,1987+2]..[99,1987+31]) ghost Psig_extension "foo" @@ -799,6 +801,7 @@ core_type (shortcut_ext_attr.ml[99,1987+25]..[99,1987+26]) Ptyp_constr "t" (shortcut_ext_attr.ml[99,1987+25]..[99,1987+26]) [] + [] [ "" ] diff --git a/testsuite/tests/parsing/shortcut_ext_attr.ml b/testsuite/tests/parsing/shortcut_ext_attr.ml index 222e7a0c974..133d7d1629f 100644 --- a/testsuite/tests/parsing/shortcut_ext_attr.ml +++ b/testsuite/tests/parsing/shortcut_ext_attr.ml @@ -1,9 +1,9 @@ -(* TEST - flags = "-dparsetree" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_ +to_preserve_locations_while_tran +slating_from_old_syntax__Filler_ +text_added_to_pre +serve_locations_while_translati *) (* Expressions *) let () = @@ -118,3 +118,11 @@ module type S = sig class type%foo[@foo] x = x end + +(* TEST + flags = "-dparsetree"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/ppx-attributes/inline.ml b/testsuite/tests/ppx-attributes/inline.ml index a4d41088463..3253b5257db 100644 --- a/testsuite/tests/ppx-attributes/inline.ml +++ b/testsuite/tests/ppx-attributes/inline.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dlambda -dno-unique-ids" - * expect + flags = "-dlambda -dno-unique-ids"; + expect; *) (* This checks that function attributes like [@inline] aren't dropped when they diff --git a/testsuite/tests/ppx-attributes/warning.ml b/testsuite/tests/ppx-attributes/warning.ml index 0ae66674724..3b5ba8282ba 100644 --- a/testsuite/tests/ppx-attributes/warning.ml +++ b/testsuite/tests/ppx-attributes/warning.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) [@@@ocaml.warning "@A"] [@@@ocaml.alert "++all"] @@ -31,6 +30,10 @@ module rec B : sig type t end = struct type t = T.deprecated end module type T = sig type t = T.deprecated end [@@ocaml.alert "-deprecated"] +(* Warning 27 is unused function parameter. *) +let f _ = function[@ocaml.warning "-27"] + | x -> () + (* Signature items *) module type S = sig diff --git a/testsuite/tests/ppx-contexts/test.ml b/testsuite/tests/ppx-contexts/test.ml index a8b0be1fa4c..558de987487 100644 --- a/testsuite/tests/ppx-contexts/test.ml +++ b/testsuite/tests/ppx-contexts/test.ml @@ -1,27 +1,17 @@ (* TEST -readonly_files = "myppx.ml" -include ocamlcommon -* setup-ocamlc.byte-build-env -** ocamlc.byte -program = "${test_build_directory}/myppx.exe" -all_modules = "myppx.ml" -*** ocamlc.byte -module = "test.ml" -flags = "-thread \ - -I ${test_build_directory} \ - -open List \ - -rectypes \ - -principal \ - -alias-deps \ - -unboxed-types \ - -ppx ${program}" -**** ocamlc.byte -module = "test.ml" -flags = "-g \ - -no-alias-deps \ - -no-unboxed-types \ - -ppx ${program}" -***** check-ocamlc.byte-output + readonly_files = "myppx.ml"; + include ocamlcommon; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/myppx.exe"; + all_modules = "myppx.ml"; + ocamlc.byte; + module = "test.ml"; + flags = "-thread -I ${test_build_directory} -open List -rectypes -principal -alias-deps -unboxed-types -ppx ${program}"; + ocamlc.byte; + module = "test.ml"; + flags = "-g -no-alias-deps -no-unboxed-types -ppx ${program}"; + ocamlc.byte; + check-ocamlc.byte-output; *) (* empty *) diff --git a/testsuite/tests/ppx-empty-cases/test.compilers.reference b/testsuite/tests/ppx-empty-cases/test.compilers.reference index a1d0a8f6168..96a1a6d0655 100644 --- a/testsuite/tests/ppx-empty-cases/test.compilers.reference +++ b/testsuite/tests/ppx-empty-cases/test.compilers.reference @@ -1,40 +1,40 @@ (setglobal Test! (let - (empty_cases_returning_string/265 = - (function {nlocal = 0} param/267 - (raise - (makeblock 0 (getpredef Match_failure/26!!) [0: "test.ml" 28 50]))) - empty_cases_returning_float64/268 = - (function {nlocal = 0} param/270 : unboxed_float - (raise - (makeblock 0 (getpredef Match_failure/26!!) [0: "test.ml" 29 50]))) - empty_cases_accepting_string/271 = - (function {nlocal = 0} param/273 - (raise - (makeblock 0 (getpredef Match_failure/26!!) [0: "test.ml" 30 50]))) - empty_cases_accepting_float64/274 = - (function {nlocal = 0} param/276[unboxed_float] - (raise - (makeblock 0 (getpredef Match_failure/26!!) [0: "test.ml" 31 50]))) - non_empty_cases_returning_string/277 = - (function {nlocal = 0} param/279 - (raise - (makeblock 0 (getpredef Assert_failure/36!!) [0: "test.ml" 32 68]))) - non_empty_cases_returning_float64/280 = - (function {nlocal = 0} param/282 : unboxed_float - (raise - (makeblock 0 (getpredef Assert_failure/36!!) [0: "test.ml" 33 68]))) - non_empty_cases_accepting_string/283 = - (function {nlocal = 0} param/285 - (raise - (makeblock 0 (getpredef Assert_failure/36!!) [0: "test.ml" 34 68]))) - non_empty_cases_accepting_float64/286 = - (function {nlocal = 0} param/288[unboxed_float] - (raise - (makeblock 0 (getpredef Assert_failure/36!!) [0: "test.ml" 35 68])))) - (makeblock 0 empty_cases_returning_string/265 - empty_cases_returning_float64/268 empty_cases_accepting_string/271 - empty_cases_accepting_float64/274 non_empty_cases_returning_string/277 - non_empty_cases_returning_float64/280 - non_empty_cases_accepting_string/283 - non_empty_cases_accepting_float64/286))) + (empty_cases_returning_string/270 = + (function {nlocal = 0} param/272 + (raise + (makeblock 0 (getpredef Match_failure/32!!) [0: "test.ml" 28 50]))) + empty_cases_returning_float64/273 = + (function {nlocal = 0} param/275 : unboxed_float + (raise + (makeblock 0 (getpredef Match_failure/32!!) [0: "test.ml" 29 50]))) + empty_cases_accepting_string/276 = + (function {nlocal = 0} param/278 + (raise + (makeblock 0 (getpredef Match_failure/32!!) [0: "test.ml" 30 50]))) + empty_cases_accepting_float64/279 = + (function {nlocal = 0} param/281[unboxed_float] + (raise + (makeblock 0 (getpredef Match_failure/32!!) [0: "test.ml" 31 50]))) + non_empty_cases_returning_string/282 = + (function {nlocal = 0} param/284 + (raise + (makeblock 0 (getpredef Assert_failure/42!!) [0: "test.ml" 32 68]))) + non_empty_cases_returning_float64/285 = + (function {nlocal = 0} param/287 : unboxed_float + (raise + (makeblock 0 (getpredef Assert_failure/42!!) [0: "test.ml" 33 68]))) + non_empty_cases_accepting_string/288 = + (function {nlocal = 0} param/290 + (raise + (makeblock 0 (getpredef Assert_failure/42!!) [0: "test.ml" 34 68]))) + non_empty_cases_accepting_float64/291 = + (function {nlocal = 0} param/293[unboxed_float] + (raise + (makeblock 0 (getpredef Assert_failure/42!!) [0: "test.ml" 35 68])))) + (makeblock 0 empty_cases_returning_string/270 + empty_cases_returning_float64/273 empty_cases_accepting_string/276 + empty_cases_accepting_float64/279 non_empty_cases_returning_string/282 + non_empty_cases_returning_float64/285 + non_empty_cases_accepting_string/288 + non_empty_cases_accepting_float64/291))) diff --git a/testsuite/tests/ppx-empty-cases/test.ml b/testsuite/tests/ppx-empty-cases/test.ml index 00612b33380..d92ce0660d5 100644 --- a/testsuite/tests/ppx-empty-cases/test.ml +++ b/testsuite/tests/ppx-empty-cases/test.ml @@ -1,17 +1,17 @@ -(* TEST -readonly_files = "ppx_empty_cases.ml" -include ocamlcommon -* setup-ocamlc.byte-build-env -** ocamlc.byte -program = "${test_build_directory}/ppx_empty_cases.exe" -all_modules = "ppx_empty_cases.ml" -*** ocamlc.byte -module = "test.ml" -flags = "-I ${test_build_directory} \ - -ppx ${program} \ - -extension layouts_alpha \ - -dlambda" -**** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + *) (* It's possible for ppx code to generate empty function cases. This is @@ -34,3 +34,16 @@ let non_empty_cases_returning_float64 : t -> float# = function _ -> assert false let non_empty_cases_accepting_string : string -> t = function _ -> assert false let non_empty_cases_accepting_float64 : float# -> t = function _ -> assert false + +(* TEST + readonly_files = "ppx_empty_cases.ml"; + include ocamlcommon; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/ppx_empty_cases.exe"; + all_modules = "ppx_empty_cases.ml"; + ocamlc.byte; + module = "test.ml"; + flags = "-I ${test_build_directory} -ppx ${program} -extension layouts_alpha -dlambda"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/ppx-error-message/ppx_error_message.ml b/testsuite/tests/ppx-error-message/ppx_error_message.ml new file mode 100644 index 00000000000..694b3354566 --- /dev/null +++ b/testsuite/tests/ppx-error-message/ppx_error_message.ml @@ -0,0 +1,53 @@ +open Ast_mapper + +(* Assert statically that a string that appears in the source text + is alphabetically ordered. This is a bit contrived so that we + can exercise [@ocaml.error_message]. +*) + +let () = + register "sorted" (fun _ -> + { default_mapper with expr = fun self expr -> + match expr.pexp_desc with + | Pexp_extension + ( { txt = "sorted" }, + PStr + [ { pstr_desc = + Pstr_eval + ( { pexp_desc = Pexp_constant (Pconst_string (str, loc, _)) } + , _ ) } ] ) + -> + (* Use a ghost location, as is typical for ppxes *) + let loc = { loc with loc_ghost = true } in + let sorted = + String.to_seq str + |> List.of_seq + |> List.sort Char.compare + |> List.to_seq + |> String.of_seq + in + Ast_helper.with_default_loc loc (fun () -> + Ast_helper.Exp.apply + (Ast_helper.Exp.ident { txt = Lident "ignore"; loc}) + [ Nolabel, + Ast_helper.Exp.attr + (Ast_helper.Exp.constraint_ + (Ast_helper.Exp.variant sorted None) + (Ast_helper.Typ.variant + [ Ast_helper.Rf.tag { txt = str; loc } true [] ] + Closed + None )) + (Ast_helper.Attr.mk + { txt = "ocaml.error_message"; loc } + (PStr + [ Ast_helper.Exp.constant + (Ast_helper.Const.string + (Printf.sprintf + "The %s string is not in alphabetical order." + str)) + |> Ast_helper.Str.eval + ])) + ]) + | _ -> default_mapper.expr self expr + } + ) diff --git a/testsuite/tests/ppx-error-message/test.compilers.reference b/testsuite/tests/ppx-error-message/test.compilers.reference new file mode 100644 index 00000000000..7d2be6761a6 --- /dev/null +++ b/testsuite/tests/ppx-error-message/test.compilers.reference @@ -0,0 +1,9 @@ +File "test.ml", line 20, characters 21-46: +20 | let () = [%sorted "not_in_alphabetical_order"] + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type [> `___aaabcdeehiillnnooprrtt ] + but an expression was expected of type + [ `not_in_alphabetical_order ] + The not_in_alphabetical_order string is not in alphabetical order. + The second variant type does not allow tag(s) + `___aaabcdeehiillnnooprrtt diff --git a/testsuite/tests/ppx-error-message/test.ml b/testsuite/tests/ppx-error-message/test.ml new file mode 100644 index 00000000000..510cf9eb054 --- /dev/null +++ b/testsuite/tests/ppx-error-message/test.ml @@ -0,0 +1,23 @@ +(* TEST + readonly_files = "ppx_error_message.ml"; + include ocamlcommon; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/ppx_error_message.exe"; + all_modules = "ppx_error_message.ml"; + ocamlc.byte; + module = "test.ml"; + flags = "-I ${test_build_directory} -ppx ${program}"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) + +module Good = struct + let () = [%sorted "abcd"] +end + +module Bad = struct + let () = [%sorted "not_in_alphabetical_order"] +end + + diff --git a/testsuite/tests/prim-bigstring/bigstring_access.ml b/testsuite/tests/prim-bigstring/bigstring_access.ml index 0014de3ddaf..9f550b7ffac 100644 --- a/testsuite/tests/prim-bigstring/bigstring_access.ml +++ b/testsuite/tests/prim-bigstring/bigstring_access.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) open Bigarray type bigstring = (char, int8_unsigned_elt, c_layout) Array1.t diff --git a/testsuite/tests/prim-bigstring/string_access.ml b/testsuite/tests/prim-bigstring/string_access.ml index 82c32f2f304..a37b9e9319e 100644 --- a/testsuite/tests/prim-bigstring/string_access.ml +++ b/testsuite/tests/prim-bigstring/string_access.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) external caml_bytes_get_16 : bytes -> int -> int = "%caml_bytes_get16" external caml_bytes_get_32 : bytes -> int -> int32 = "%caml_bytes_get32" diff --git a/testsuite/tests/prim-bswap/bswap.ml b/testsuite/tests/prim-bswap/bswap.ml index 7ab822c74b3..cf43908bcb9 100644 --- a/testsuite/tests/prim-bswap/bswap.ml +++ b/testsuite/tests/prim-bswap/bswap.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) open Printf diff --git a/testsuite/tests/prim-bswap/bswap32roundtrip.ml b/testsuite/tests/prim-bswap/bswap32roundtrip.ml index 14c002219d6..f3f9648bf61 100644 --- a/testsuite/tests/prim-bswap/bswap32roundtrip.ml +++ b/testsuite/tests/prim-bswap/bswap32roundtrip.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) type buf = bytes external create_buf : int -> buf = "caml_create_bytes" diff --git a/testsuite/tests/prim-revapply/apply.ml b/testsuite/tests/prim-revapply/apply.ml index 685b326344a..8b557e152f4 100644 --- a/testsuite/tests/prim-revapply/apply.ml +++ b/testsuite/tests/prim-revapply/apply.ml @@ -1,5 +1,5 @@ (* TEST - flags="-w +48" + flags = "-w +48"; *) external ( @@ ) : ('a -> 'b) -> 'a -> 'b = "%apply" diff --git a/testsuite/tests/prim-revapply/revapply.ml b/testsuite/tests/prim-revapply/revapply.ml index f65b109da50..341548c2ebb 100644 --- a/testsuite/tests/prim-revapply/revapply.ml +++ b/testsuite/tests/prim-revapply/revapply.ml @@ -1,5 +1,5 @@ (* TEST - flags="-w +48" + flags = "-w +48"; *) external ( |> ) : 'a -> ('a -> 'b) -> 'b = "%revapply" diff --git a/testsuite/tests/printing-types/disambiguation.ml b/testsuite/tests/printing-types/disambiguation.ml index ee591a6c142..452d1977f5e 100644 --- a/testsuite/tests/printing-types/disambiguation.ml +++ b/testsuite/tests/printing-types/disambiguation.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a x = private [> `x] as 'a;; diff --git a/testsuite/tests/printing-types/multiple_files.ml b/testsuite/tests/printing-types/multiple_files.ml new file mode 100644 index 00000000000..0266f416656 --- /dev/null +++ b/testsuite/tests/printing-types/multiple_files.ml @@ -0,0 +1,7 @@ +(* See [test_multiple_files.ml]. *) + +module B = struct + type t = B1 | B2 +end + +type _b = B.t = B1 | B2 diff --git a/testsuite/tests/printing-types/pr248.ml b/testsuite/tests/printing-types/pr248.ml index 25d397260a4..cad30c38055 100644 --- a/testsuite/tests/printing-types/pr248.ml +++ b/testsuite/tests/printing-types/pr248.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (** Test that weak variables keep their names long enough *) diff --git a/testsuite/tests/printing-types/test_multiple_files.compilers.reference b/testsuite/tests/printing-types/test_multiple_files.compilers.reference new file mode 100644 index 00000000000..e702f757efe --- /dev/null +++ b/testsuite/tests/printing-types/test_multiple_files.compilers.reference @@ -0,0 +1,4 @@ +val other_file_b : Multiple_files.B.t +module A : sig type t = A1 | A2 end +type _a = A.t = A1 | A2 +val this_file_a : A.t diff --git a/testsuite/tests/printing-types/test_multiple_files.ml b/testsuite/tests/printing-types/test_multiple_files.ml new file mode 100644 index 00000000000..7f2457c8d38 --- /dev/null +++ b/testsuite/tests/printing-types/test_multiple_files.ml @@ -0,0 +1,26 @@ +(* TEST + readonly_files = "multiple_files.ml"; + setup-ocamlopt.opt-build-env; + module = "multiple_files.ml"; + flags = "-g"; + ocamlopt.opt; + module = "test_multiple_files.ml"; + flags = "-short-paths -i"; + ocamlopt.opt; + check-ocamlopt.opt-output; +*) + +(* Ensure that underscore-prefixed type names + are avoided by the type printer when + a good, underscoreless name is available. +*) + +let other_file_b = Multiple_files.B1 + +module A = struct + type t = A1 | A2 +end + +type _a = A.t = A1 | A2 + +let this_file_a = A1 diff --git a/testsuite/tests/raise-counts/main.ml b/testsuite/tests/raise-counts/main.ml index b881b83280e..cee4d34e4b1 100644 --- a/testsuite/tests/raise-counts/main.ml +++ b/testsuite/tests/raise-counts/main.ml @@ -1,5 +1,5 @@ (* TEST - modules = "a.ml b.ml" + modules = "a.ml b.ml"; *) (* PR#7702 *) diff --git a/testsuite/tests/regression/gpr1623/gpr1623.ml b/testsuite/tests/regression/gpr1623/gpr1623.ml index 80f844524df..51f5720352d 100644 --- a/testsuite/tests/regression/gpr1623/gpr1623.ml +++ b/testsuite/tests/regression/gpr1623/gpr1623.ml @@ -1,6 +1,6 @@ (* TEST - arguments = "???" - *) + arguments = "???"; +*) (* On Windows the runtime expand windows wildcards (asterisks and * question marks). diff --git a/testsuite/tests/regression/missing_set_of_closures/missing_set_of_closures.ml b/testsuite/tests/regression/missing_set_of_closures/missing_set_of_closures.ml index c71250cdb2b..6f4aa125892 100644 --- a/testsuite/tests/regression/missing_set_of_closures/missing_set_of_closures.ml +++ b/testsuite/tests/regression/missing_set_of_closures/missing_set_of_closures.ml @@ -1,20 +1,20 @@ (* TEST -readonly_files = "a.ml b.ml b2.ml" -subdirectories = "dir" -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -module = "a.ml" -*** ocamlopt.byte -module = "b.ml" -**** ocamlopt.byte -module = "b2.ml" -***** copy -src = "b.cmx b.cmi b2.cmx b2.cmi" -dst = "dir/" -****** cd -cwd = "dir" -******* ocamlopt.byte -module = "c.ml" -flags = "-w -58" -******** check-ocamlopt.byte-output + readonly_files = "a.ml b.ml b2.ml"; + subdirectories = "dir"; + setup-ocamlopt.byte-build-env; + module = "a.ml"; + ocamlopt.byte; + module = "b.ml"; + ocamlopt.byte; + module = "b2.ml"; + ocamlopt.byte; + src = "b.cmx b.cmi b2.cmx b2.cmi"; + dst = "dir/"; + copy; + cwd = "dir"; + cd; + module = "c.ml"; + flags = "-w -58"; + ocamlopt.byte; + check-ocamlopt.byte-output; *) diff --git a/testsuite/tests/regression/pr11887/pr11887.ml b/testsuite/tests/regression/pr11887/pr11887.ml index 9e7fc6da656..858ae3e2dc9 100644 --- a/testsuite/tests/regression/pr11887/pr11887.ml +++ b/testsuite/tests/regression/pr11887/pr11887.ml @@ -1,6 +1,6 @@ (* TEST - * native - ocamlopt_flags = "-dcmm-invariants" + ocamlopt_flags = "-dcmm-invariants"; + native; *) module Constant = struct diff --git a/testsuite/tests/regression/pr2098/in_minor_collection.ml b/testsuite/tests/regression/pr2098/in_minor_collection.ml new file mode 100644 index 00000000000..f0321cde488 --- /dev/null +++ b/testsuite/tests/regression/pr2098/in_minor_collection.ml @@ -0,0 +1,12 @@ +(* TEST + modules = "stub.c"; + not-windows; + native; +*) + +type t +external alloc : unit -> t = "caml_test_alloc" + +let () = + ignore (alloc()); + Gc.minor() \ No newline at end of file diff --git a/testsuite/tests/regression/pr2098/in_minor_collection.run b/testsuite/tests/regression/pr2098/in_minor_collection.run new file mode 100644 index 00000000000..e07c247f8c2 --- /dev/null +++ b/testsuite/tests/regression/pr2098/in_minor_collection.run @@ -0,0 +1,4 @@ +#!/bin/sh +ulimit -c 0 +(${program} > ${output}) 2>&1 | grep -q 'from inside minor GC' +exit $? diff --git a/testsuite/tests/regression/pr2098/stub.c b/testsuite/tests/regression/pr2098/stub.c new file mode 100644 index 00000000000..bc20955c974 --- /dev/null +++ b/testsuite/tests/regression/pr2098/stub.c @@ -0,0 +1,24 @@ +#include +#include + +static void caml_test_finalize(value v) +{ + caml_enter_blocking_section(); + caml_leave_blocking_section(); +} + +static struct custom_operations caml_test_ops = { + "_test", + caml_test_finalize, + custom_compare_default, + custom_hash_default, + custom_serialize_default, + custom_deserialize_default, + custom_compare_ext_default, + custom_fixed_length_default +}; + +value caml_test_alloc(value unit) +{ + return caml_alloc_custom(&caml_test_ops, 0, 0, 1); +} \ No newline at end of file diff --git a/testsuite/tests/regression/pr3612/pr3612.ml b/testsuite/tests/regression/pr3612/pr3612.ml index c2ca8dbb7f4..758011943af 100644 --- a/testsuite/tests/regression/pr3612/pr3612.ml +++ b/testsuite/tests/regression/pr3612/pr3612.ml @@ -1,5 +1,5 @@ (* TEST - modules = "custom_finalize.c" + modules = "custom_finalize.c"; *) type t diff --git a/testsuite/tests/regression/pr7798/pr7798.ml b/testsuite/tests/regression/pr7798/pr7798.ml index a91b4dc2fbc..3f09de07683 100644 --- a/testsuite/tests/regression/pr7798/pr7798.ml +++ b/testsuite/tests/regression/pr7798/pr7798.ml @@ -1,8 +1,12 @@ (* TEST - * bytecode - * native - * native - ocamlopt_flags = "-compact" + { + bytecode; + }{ + native; + }{ + ocamlopt_flags = "-compact"; + native; + } *) type mut2 = { mutable p: int; mutable q:int } diff --git a/testsuite/tests/regression/pr8769/pr8769.ml b/testsuite/tests/regression/pr8769/pr8769.ml index fa0c73f7a4f..e6e5c3b4dd2 100644 --- a/testsuite/tests/regression/pr8769/pr8769.ml +++ b/testsuite/tests/regression/pr8769/pr8769.ml @@ -1,32 +1,42 @@ (* TEST -modules = "nocrypto.mli fortuna.ml rng.ml" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "nocrypto.mli" -** ocamlc.byte -flags = "-for-pack Nocrypto" -module = "fortuna.ml" -** ocamlc.byte -flags = "-for-pack Nocrypto" -module = "rng.ml" -** ocamlc.byte -program = "nocrypto.cmo" -flags = "-pack" -all_modules = "fortuna.cmo rng.cmo" - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -module = "nocrypto.mli" -** ocamlopt.byte -flags = "-for-pack Nocrypto" -module = "fortuna.ml" -** ocamlopt.byte -flags = "-for-pack Nocrypto" -module = "rng.ml" -** ocamlopt.byte -program = "nocrypto.cmx" -flags = "-pack" -all_modules = "fortuna.cmx rng.cmx" - + modules = "nocrypto.mli fortuna.ml rng.ml"; + { + setup-ocamlc.byte-build-env; + { + module = "nocrypto.mli"; + ocamlc.byte; + }{ + flags = "-for-pack Nocrypto"; + module = "fortuna.ml"; + ocamlc.byte; + }{ + flags = "-for-pack Nocrypto"; + module = "rng.ml"; + ocamlc.byte; + }{ + program = "nocrypto.cmo"; + flags = "-pack"; + all_modules = "fortuna.cmo rng.cmo"; + ocamlc.byte; + } + }{ + setup-ocamlopt.byte-build-env; + { + module = "nocrypto.mli"; + ocamlopt.byte; + }{ + flags = "-for-pack Nocrypto"; + module = "fortuna.ml"; + ocamlopt.byte; + }{ + flags = "-for-pack Nocrypto"; + module = "rng.ml"; + ocamlopt.byte; + }{ + program = "nocrypto.cmx"; + flags = "-pack"; + all_modules = "fortuna.cmx rng.cmx"; + ocamlopt.byte; + } + } *) diff --git a/testsuite/tests/regression/pr9326/gc_set.ml b/testsuite/tests/regression/pr9326/gc_set.ml index 27a7ac127ab..48665e3c564 100644 --- a/testsuite/tests/regression/pr9326/gc_set.ml +++ b/testsuite/tests/regression/pr9326/gc_set.ml @@ -1,7 +1,6 @@ -(* TEST -*) +(* TEST *) -(* BACKPORT BEGIN +module OCaml_5 = struct open Gc let min_heap_sz = 524288 (* 512k *) @@ -11,7 +10,7 @@ let custom_major_ratio = 40 let custom_minor_ratio = 99 let custom_minor_max_size = 4096 -let _ = +let run () = let g1 = Gc.get() in (* Do not use { g1 with ... }, so that the code will break if more fields are added to the Gc.control record type *) @@ -37,19 +36,20 @@ let _ = assert (g2.custom_major_ratio = custom_major_ratio); assert (g2.custom_minor_ratio = custom_minor_ratio); assert (g2.custom_minor_max_size = custom_minor_max_size) -*) +end (* OCaml 4 and 5's runtime differ in what fields are controllable via [Gc.set], e.g. [stack_limit] can be changed in OCaml 5 native code but not in OCaml 4 native code. *) +module OCaml_4 = struct open Gc let min_heap_sz = 524288 (* 512k *) let maj_heap_inc = 4194304 (* 4M *) -let _ = +let run () = let g1 = Gc.get() in (* Do not use { g1 with ... }, so that the code will break if more fields are added to the Gc.control record type *) @@ -77,4 +77,7 @@ let _ = assert (g2.custom_minor_ratio = g1.custom_minor_ratio); assert (g2.custom_minor_max_size = g1.custom_minor_max_size) -(* BACKPORT END *) +end + +external runtime5 : unit -> bool = "%runtime5" +let () = if runtime5 () then OCaml_5.run () else OCaml_4.run () diff --git a/testsuite/tests/reinterpret-casts/i64_i63_reinterpret.ml b/testsuite/tests/reinterpret-casts/i64_i63_reinterpret.ml new file mode 100644 index 00000000000..c5980534c7e --- /dev/null +++ b/testsuite/tests/reinterpret-casts/i64_i63_reinterpret.ml @@ -0,0 +1,66 @@ +(* TEST *) + +(* Tests for reinterpret-cast primitives tagged_int63 <-> unboxed_int64 *) + +[@@@ocaml.flambda_o3] + +external i63_to_i64 : int -> int64# = + "%reinterpret_tagged_int63_as_unboxed_int64" +external i64_to_i63 : int64# -> int = + "%reinterpret_unboxed_int64_as_tagged_int63" + +external box_int64 : int64# -> (int64[@local_opt]) = "%box_int64" + +(* List functions that can be unrolled *) + +let rec map f = function + | [] -> [] + | x::xs -> (f x) :: map f xs + +let[@loop never] rec iter2 f l1 l2 = + match (l1, l2) with + ([], []) -> () + | (a1::l1, a2::l2) -> f a1 a2; iter2 f l1 l2 + | (_, _) -> invalid_arg "iter2" + +let examples = [min_int; -1; 0; 1; max_int] + +let examples_int64 = + (map [@unrolled 6]) + (fun i -> Int64.logor (Int64.mul (Int64.of_int i) 2L) 1L) examples + +(* This simplifies to a function that just returns unit (and does nothing + else)! *) +let[@inline never] test () = + (iter2 [@unrolled 6]) (fun i i64 -> + let i64_unboxed = i63_to_i64 i in + let i64' = box_int64 i64_unboxed in + if not (Int64.equal i64 i64') then + failwith (Printf.sprintf + "i63_to_i64 failure on 0x%x: got 0x%Lx, expected 0x%Lx" i i64' i64); + let i' = i64_to_i63 i64_unboxed in + if not (Int.equal i i') then + failwith (Printf.sprintf + "i64_to_i63 failure on 0x%Lx -> 0x%x: expected 0x%x" i64 i' i)) + examples examples_int64 + +(* This version checks the Cmm compilation of the primitives. *) +let[@inline never] test_opaque () = + List.iter2 (fun i i64 -> + let i64_unboxed = + Sys.opaque_identity (i63_to_i64 (Sys.opaque_identity i)) + in + let i64' = box_int64 i64_unboxed in + if not (Int64.equal i64 i64') then + failwith (Printf.sprintf + "i63_to_i64 failure on 0x%x: got 0x%Lx, expected 0x%Lx" i i64' i64); + let i' = i64_to_i63 i64_unboxed in + if not (Int.equal i i') then + failwith (Printf.sprintf + "i64_to_i63 failure on 0x%Lx -> 0x%x: expected 0x%x" i64 i' i)) + examples examples_int64 + +let () = + test (); + test_opaque (); + print_endline "ok" diff --git a/testsuite/tests/reinterpret-casts/i64_i63_reinterpret.reference b/testsuite/tests/reinterpret-casts/i64_i63_reinterpret.reference new file mode 100644 index 00000000000..9766475a418 --- /dev/null +++ b/testsuite/tests/reinterpret-casts/i64_i63_reinterpret.reference @@ -0,0 +1 @@ +ok diff --git a/testsuite/tests/reproducibility/cmis_on_file_system.ml b/testsuite/tests/reproducibility/cmis_on_file_system.ml index d82f1b378a1..25c4857ce04 100644 --- a/testsuite/tests/reproducibility/cmis_on_file_system.ml +++ b/testsuite/tests/reproducibility/cmis_on_file_system.ml @@ -1,22 +1,22 @@ (* TEST - readonly_files = "cmis_on_file_system.ml cmis_on_file_system_companion.mli" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - compile_only = "true" - module = "cmis_on_file_system.ml" - flags="-bin-annot -no-alias-deps -w '-49'" - *** script - script= "mv cmis_on_file_system.cmt lone.cmt" - **** ocamlc.byte - module = "cmis_on_file_system_companion.mli" - compile_only="true" - ***** ocamlc.byte - compile_only = "true" - flags="-bin-annot -no-alias-deps -w '-49'" - module="cmis_on_file_system.ml" - ****** compare-binary-files - program="cmis_on_file_system.cmt" - program2="lone.cmt" + readonly_files = "cmis_on_file_system.ml cmis_on_file_system_companion.mli"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + module = "cmis_on_file_system.ml"; + flags = "-bin-annot -no-alias-deps -w '-49'"; + ocamlc.byte; + script = "mv cmis_on_file_system.cmt lone.cmt"; + script; + module = "cmis_on_file_system_companion.mli"; + compile_only = "true"; + ocamlc.byte; + compile_only = "true"; + flags = "-bin-annot -no-alias-deps -w '-49'"; + module = "cmis_on_file_system.ml"; + ocamlc.byte; + program = "cmis_on_file_system.cmt"; + program2 = "lone.cmt"; + compare-binary-files; *) diff --git a/testsuite/tests/required-external/main.ml b/testsuite/tests/required-external/main.ml index 7764b822e99..c2c4bfb3d3d 100644 --- a/testsuite/tests/required-external/main.ml +++ b/testsuite/tests/required-external/main.ml @@ -1,40 +1,40 @@ (* TEST -modules = "file.ml" - -* setup-ocamlc.byte-build-env -program = "${test_build_directory}/main.exe" -** ocamlc.byte -module = "file.ml" -*** ocamlc.byte -module = "" -program = "lib.cma" -flags = "-a" -all_modules = "file.cmo" -**** ocamlc.byte -program = "${test_build_directory}/main.exe" -all_modules = "lib.cma main.ml" -flags = "" -***** check-ocamlc.byte-output -****** run -******* check-program-output - -* setup-ocamlopt.byte-build-env -program = "${test_build_directory}/main.exe" -** ocamlopt.byte -module = "file.ml" -*** ocamlopt.byte -module = "" -program = "lib.cmxa" -flags = "-a" -all_modules = "file.cmx" -**** ocamlopt.byte -program = "${test_build_directory}/main.exe" -all_modules = "lib.cmxa main.ml" -flags = "" -***** check-ocamlopt.byte-output -****** run -******* check-program-output - + modules = "file.ml"; + { + program = "${test_build_directory}/main.exe"; + setup-ocamlc.byte-build-env; + module = "file.ml"; + ocamlc.byte; + module = ""; + program = "lib.cma"; + flags = "-a"; + all_modules = "file.cmo"; + ocamlc.byte; + program = "${test_build_directory}/main.exe"; + all_modules = "lib.cma main.ml"; + flags = ""; + ocamlc.byte; + check-ocamlc.byte-output; + run; + check-program-output; + }{ + program = "${test_build_directory}/main.exe"; + setup-ocamlopt.byte-build-env; + module = "file.ml"; + ocamlopt.byte; + module = ""; + program = "lib.cmxa"; + flags = "-a"; + all_modules = "file.cmx"; + ocamlopt.byte; + program = "${test_build_directory}/main.exe"; + all_modules = "lib.cmxa main.ml"; + flags = ""; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; + } *) let () = diff --git a/testsuite/tests/runtime-C-exceptions/test.ml b/testsuite/tests/runtime-C-exceptions/test.ml index 17bf425227d..7bc2671889d 100644 --- a/testsuite/tests/runtime-C-exceptions/test.ml +++ b/testsuite/tests/runtime-C-exceptions/test.ml @@ -1,5 +1,5 @@ (* TEST - modules = "stub_test.c" + modules = "stub_test.c"; *) external failwith_from_ocaml : string -> 'a = "caml_failwith_value" diff --git a/testsuite/tests/runtime-errors/stackoverflow.reference b/testsuite/tests/runtime-errors/stackoverflow.byte.reference similarity index 79% rename from testsuite/tests/runtime-errors/stackoverflow.reference rename to testsuite/tests/runtime-errors/stackoverflow.byte.reference index 694790cb327..dfe25fa2869 100644 --- a/testsuite/tests/runtime-errors/stackoverflow.reference +++ b/testsuite/tests/runtime-errors/stackoverflow.byte.reference @@ -6,4 +6,5 @@ x = 20000 x = 10000 x = 0 second Stack overflow caught +Called from unknown location !p = 42 diff --git a/testsuite/tests/runtime-errors/stackoverflow.ml b/testsuite/tests/runtime-errors/stackoverflow.ml index b9e844efb94..fa1ada1cdb9 100644 --- a/testsuite/tests/runtime-errors/stackoverflow.ml +++ b/testsuite/tests/runtime-errors/stackoverflow.ml @@ -1,6 +1,11 @@ -(* TEST -flags = "-w -a" -ocamlrunparam += "l=100000" +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + *) let rec f x = @@ -28,6 +33,30 @@ let _ = try Sys.with_async_exns (fun () -> ignore(f 0)) with Stack_overflow -> - print_string "second Stack overflow caught"; print_newline() + print_string "second Stack overflow caught"; + print_newline(); + (* Try to make the backtrace reasonably stable. + Note that Closure produces an empty backtrace here. *) + let backtrace = + Printexc.get_backtrace () + |> String.split_on_char '\n' + |> List.filter (fun s -> String.length s > 0) + |> List.rev + |> List.hd + in + print_endline backtrace end; print_string "!p = "; print_int !p; print_newline () + +(* TEST + flags = "-w -a"; + ocamlrunparam += "l=100000"; + flambda; + { + reference = "${test_source_directory}/stackoverflow.byte.reference"; + bytecode; + }{ + reference = "${test_source_directory}/stackoverflow.opt.reference"; + native; + } +*) diff --git a/testsuite/tests/runtime-errors/stackoverflow.opt.reference b/testsuite/tests/runtime-errors/stackoverflow.opt.reference new file mode 100644 index 00000000000..7552944e434 --- /dev/null +++ b/testsuite/tests/runtime-errors/stackoverflow.opt.reference @@ -0,0 +1,10 @@ +x = 20000 +x = 10000 +x = 0 +Stack overflow caught +x = 20000 +x = 10000 +x = 0 +second Stack overflow caught +Called from Stackoverflow in file "stackoverflow.ml", line 34, characters 4-47 +!p = 42 diff --git a/testsuite/tests/runtime-errors/syserror.ml b/testsuite/tests/runtime-errors/syserror.ml index d5230ad7cfd..5cab8e3bd53 100644 --- a/testsuite/tests/runtime-errors/syserror.ml +++ b/testsuite/tests/runtime-errors/syserror.ml @@ -1,29 +1,34 @@ (* TEST - -flags = "-w -a" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** run -exit_status = "2" -**** libunix -***** check-program-output -reference = "${test_source_directory}/syserror.unix.reference" -**** libwin32unix -***** check-program-output -reference = "${test_source_directory}/syserror.win32.reference" - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -*** run -exit_status = "2" -**** libunix -***** check-program-output -reference = "${test_source_directory}/syserror.unix.reference" -**** libwin32unix -***** check-program-output -reference = "${test_source_directory}/syserror.win32.reference" - + flags = "-w -a"; + { + setup-ocamlc.byte-build-env; + ocamlc.byte; + exit_status = "2"; + run; + { + libunix; + reference = "${test_source_directory}/syserror.unix.reference"; + check-program-output; + }{ + libwin32unix; + reference = "${test_source_directory}/syserror.win32.reference"; + check-program-output; + } + }{ + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + exit_status = "2"; + run; + { + libunix; + reference = "${test_source_directory}/syserror.unix.reference"; + check-program-output; + }{ + libwin32unix; + reference = "${test_source_directory}/syserror.win32.reference"; + check-program-output; + } + } *) let _ = Printexc.record_backtrace false diff --git a/testsuite/tests/runtime-naked-pointers/np1.ml b/testsuite/tests/runtime-naked-pointers/np1.ml index be4c677a238..781fe099325 100644 --- a/testsuite/tests/runtime-naked-pointers/np1.ml +++ b/testsuite/tests/runtime-naked-pointers/np1.ml @@ -1,7 +1,11 @@ (* TEST - modules = "cstubs.c np.ml" - * bytecode - * native + modules = "cstubs.c np.ml"; + runtime4; + { + bytecode; + }{ + native; + } *) open Np diff --git a/testsuite/tests/runtime-naked-pointers/np2.ml b/testsuite/tests/runtime-naked-pointers/np2.ml index f24c813c2b6..a3387fbd662 100644 --- a/testsuite/tests/runtime-naked-pointers/np2.ml +++ b/testsuite/tests/runtime-naked-pointers/np2.ml @@ -1,7 +1,11 @@ (* TEST - modules = "cstubs.c np.ml" - * bytecode - * native + modules = "cstubs.c np.ml"; + runtime4; + { + bytecode; + }{ + native; + } *) open Np diff --git a/testsuite/tests/runtime-naked-pointers/np3.ml b/testsuite/tests/runtime-naked-pointers/np3.ml index d207279df16..f18d1cee3e8 100644 --- a/testsuite/tests/runtime-naked-pointers/np3.ml +++ b/testsuite/tests/runtime-naked-pointers/np3.ml @@ -1,8 +1,12 @@ (* TEST - modules = "cstubs.c np.ml" - * naked_pointers - ** bytecode - ** native + modules = "cstubs.c np.ml"; + runtime4; + naked_pointers; + { + bytecode; + }{ + native; + } *) open Np diff --git a/testsuite/tests/runtime-naked-pointers/np4.ml b/testsuite/tests/runtime-naked-pointers/np4.ml index 9cd0e238091..9942f1b0c51 100644 --- a/testsuite/tests/runtime-naked-pointers/np4.ml +++ b/testsuite/tests/runtime-naked-pointers/np4.ml @@ -1,8 +1,12 @@ (* TEST - modules = "cstubs.c np.ml" - * naked_pointers - ** bytecode - ** native + modules = "cstubs.c np.ml"; + runtime4; + naked_pointers; + { + bytecode; + }{ + native; + } *) open Np diff --git a/testsuite/tests/runtime-naked-pointers/runtest.sh b/testsuite/tests/runtime-naked-pointers/runtest.sh index f5d4df561c3..531664347bf 100755 --- a/testsuite/tests/runtime-naked-pointers/runtest.sh +++ b/testsuite/tests/runtime-naked-pointers/runtest.sh @@ -1,6 +1,6 @@ #!/bin/sh -if grep -q "#define NAKED_POINTERS_CHECKER" ${ocamlsrcdir}/runtime/caml/m.h \ +if grep -q "#define NAKED_POINTERS_CHECKER" ${ocamlsrcdir}/${runtime_dir}/caml/m.h \ && (echo ${program} | grep -q '\.opt') then (${program} > ${output}) 2>&1 | grep -q '^Out-of-heap ' diff --git a/testsuite/tests/self-contained-toplevel/main.ml b/testsuite/tests/self-contained-toplevel/main.ml index c89c0485cdf..e41fcd246b8 100644 --- a/testsuite/tests/self-contained-toplevel/main.ml +++ b/testsuite/tests/self-contained-toplevel/main.ml @@ -1,21 +1,21 @@ (* TEST -readonly_files = "foo.ml gen_cached_cmi.ml input.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "foo.ml" -*** ocaml with ocamlcommon -ocaml_script_as_argument = "true" -test_file = "gen_cached_cmi.ml" -arguments = "cached_cmi.ml" -**** ocamlc.byte -module = "" -program = "${test_build_directory}/main.exe" -libraries += "ocamlbytecomp ocamltoplevel" -all_modules = "foo.cmo cached_cmi.ml main.ml" -***** run -set OCAMLLIB="${ocamlsrcdir}/stdlib" -arguments = "input.ml" -****** check-program-output + readonly_files = "foo.ml gen_cached_cmi.ml input.ml"; + setup-ocamlc.byte-build-env; + module = "foo.ml"; + ocamlc.byte; + ocaml_script_as_argument = "true"; + test_file = "gen_cached_cmi.ml"; + arguments = "cached_cmi.ml"; + ocaml with ocamlcommon; + module = ""; + program = "${test_build_directory}/main.exe"; + libraries += "ocamlbytecomp ocamltoplevel"; + all_modules = "foo.cmo cached_cmi.ml main.ml"; + ocamlc.byte; + set OCAMLLIB = "${ocamlsrcdir}/stdlib"; + arguments = "input.ml"; + run; + check-program-output; *) let () = @@ -23,24 +23,34 @@ let () = if Sys.file_exists "foo.cmi" then Sys.remove "foo.cmi"; let module Persistent_signature = Persistent_env.Persistent_signature in let old_loader = !Persistent_signature.load in - Persistent_signature.load := (fun ~unit_name -> + Persistent_signature.load := (fun ~allow_hidden ~unit_name -> match unit_name |> Compilation_unit.Name.to_string with | "Foo" -> - let {Cmi_format.cmi_name; cmi_sign; cmi_crcs; cmi_flags} = + let + { Cmi_format.cmi_name; + cmi_kind; + cmi_params; + cmi_sign; + cmi_crcs; + cmi_flags + } = Marshal.from_string Cached_cmi.foo 0 in let cmi = { Cmi_format.cmi_name; + cmi_kind; + cmi_params; cmi_sign = Subst.Lazy.of_signature cmi_sign; cmi_crcs; cmi_flags } in Some { Persistent_signature. - filename = Sys.executable_name - ; cmi = cmi + filename = Sys.executable_name + ; cmi = cmi + ; visibility = Visible } - | _ -> old_loader unit_name); + | _ -> old_loader ~allow_hidden ~unit_name); Toploop.add_hook (function | Toploop.After_setup -> Toploop.toplevel_env := diff --git a/testsuite/tests/shadow_include/artificial.ml b/testsuite/tests/shadow_include/artificial.ml index f881c9994c6..daed88f9f9a 100644 --- a/testsuite/tests/shadow_include/artificial.ml +++ b/testsuite/tests/shadow_include/artificial.ml @@ -1,6 +1,6 @@ (* TEST - * expect - flags = "-nostdlib -nopervasives" + flags = "-nostdlib -nopervasives"; + expect; *) module Foo : sig diff --git a/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference b/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference index 25fa2349b53..ef3d758481b 100644 --- a/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference +++ b/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference @@ -1,7 +1,7 @@ File "cannot_shadow_error.ml", line 24, characters 2-36: 24 | include Comparable with type t = t ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Illegal shadowing of included type t/2 by t. +Error: Illegal shadowing of included type t/2 by t/1. File "cannot_shadow_error.ml", line 23, characters 2-19: 23 | include Printable ^^^^^^^^^^^^^^^^^ diff --git a/testsuite/tests/shadow_include/cannot_shadow_error.ml b/testsuite/tests/shadow_include/cannot_shadow_error.ml index 11619ca8336..0432f082a3d 100644 --- a/testsuite/tests/shadow_include/cannot_shadow_error.ml +++ b/testsuite/tests/shadow_include/cannot_shadow_error.ml @@ -1,9 +1,9 @@ -(* TEST -* setup-ocamlc.byte-build-env -flags = "-nostdlib -nopervasives" -** ocamlc.byte -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Same example as in tests/typing-sigsubst/sigsubst.ml, but not as an @@ -23,3 +23,11 @@ module type PrintableComparable = sig include Printable include Comparable with type t = t end + +(* TEST + flags = "-nostdlib -nopervasives"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/shadow_include/ghosts.ml b/testsuite/tests/shadow_include/ghosts.ml index 09051a65612..48aa4c92761 100644 --- a/testsuite/tests/shadow_include/ghosts.ml +++ b/testsuite/tests/shadow_include/ghosts.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module C = struct diff --git a/testsuite/tests/shadow_include/shadow_all.ml b/testsuite/tests/shadow_include/shadow_all.ml index 5ff0d99c901..dafac4ecbf5 100644 --- a/testsuite/tests/shadow_include/shadow_all.ml +++ b/testsuite/tests/shadow_include/shadow_all.ml @@ -1,6 +1,6 @@ (* TEST - * expect - flags = "-nopervasives" (* can't pass -nostdlib because of objects. *) + flags = "-nopervasives"; (* can't pass -nostdlib because of objects. *) + expect; *) (* Signatures *) @@ -100,7 +100,7 @@ end Line 4, characters 2-11: 4 | include S ^^^^^^^^^ -Error: Illegal shadowing of included type t/2 by t. +Error: Illegal shadowing of included type t/2 by t/1. Line 2, characters 2-11: 2 | include S ^^^^^^^^^ @@ -144,7 +144,7 @@ end Line 4, characters 2-11: 4 | include S ^^^^^^^^^ -Error: Illegal shadowing of included module M/2 by M. +Error: Illegal shadowing of included module M/2 by M/1. Line 2, characters 2-11: 2 | include S ^^^^^^^^^ @@ -189,7 +189,7 @@ end Line 4, characters 2-11: 4 | include S ^^^^^^^^^ -Error: Illegal shadowing of included module type T/2 by T. +Error: Illegal shadowing of included module type T/2 by T/1. Line 2, characters 2-11: 2 | include S ^^^^^^^^^ @@ -210,7 +210,7 @@ end Line 4, characters 2-11: 4 | include S ^^^^^^^^^ -Error: Illegal shadowing of included type ext/2 by ext. +Error: Illegal shadowing of included type ext/2 by ext/1. Line 2, characters 2-11: 2 | include S ^^^^^^^^^ @@ -506,15 +506,15 @@ end Line 8, characters 2-8: 8 | type t ^^^^^^ -Error: Illegal shadowing of included type t/4 by t. +Error: Illegal shadowing of included type t/2 by t/1. Lines 2-5, characters 2-5: 2 | ..include struct 3 | type t = A 4 | let x = A 5 | end - Type t/4 came from this include. + Type t/2 came from this include. Line 4, characters 8-9: 4 | let x = A ^ - The value x has no valid type if t/4 is shadowed. + The value x has no valid type if t/2 is shadowed. |}] diff --git a/testsuite/tests/shape-index/auxiliaire.ml b/testsuite/tests/shape-index/auxiliaire.ml new file mode 100644 index 00000000000..67f2b31b3ce --- /dev/null +++ b/testsuite/tests/shape-index/auxiliaire.ml @@ -0,0 +1 @@ +let z = 42 diff --git a/testsuite/tests/shape-index/index.ml b/testsuite/tests/shape-index/index.ml new file mode 100644 index 00000000000..2c9650a6383 --- /dev/null +++ b/testsuite/tests/shape-index/index.ml @@ -0,0 +1,69 @@ +(* TEST + +flags = "-bin-annot -bin-annot-occurrences"; +compile_only = "true"; +readonly_files = "auxiliaire.ml"; +setup-ocamlc.byte-build-env; +all_modules = "auxiliaire.ml index.ml"; +ocamlc.byte; +check-ocamlc.byte-output; + +program = "-quiet -index -decls index.cmt"; +output = "out_objinfo"; +ocamlobjinfo; + +check-program-output; +*) + +module type AS = sig + type t + val x : t +end + +module A = struct + type t = int + let (x : t) = 42 +end + +module B = A + +module C : sig + open A + val c : t +end = struct + include A + let c = 42 +end + +open A + +let y = A.x + Auxiliaire.z + +let () = print_int y + +let a = (module A : AS) +module _ = (val a) + +module F (P : AS) = struct include P end +module G = F (A) +type u = F (A).t;; (* FIXME F and A are missing*) + +module type MS = sig + module type MT + module M : AS + module X = A + type u +end +module type MSA = MS with + module M = A (* M, MT and u are missing *) + and module type MT = AS + and type u = B.t + +let () = match 4 with + | A.(0) | _ -> () + +module type MSB = sig + type u + include AS with type t := u + module G := A +end diff --git a/testsuite/tests/shape-index/index.reference b/testsuite/tests/shape-index/index.reference new file mode 100644 index 00000000000..ab08854ebe2 --- /dev/null +++ b/testsuite/tests/shape-index/index.reference @@ -0,0 +1,63 @@ +Indexed shapes: +Resolved: Index.5 : A (File "index.ml", line 68, characters 14-15) +Resolved: Index.25 : u (File "index.ml", line 67, characters 28-29) +Resolved: Index.2 : AS (File "index.ml", line 67, characters 10-12) +Resolved: Index.5 : A (File "index.ml", line 63, characters 4-5) +Resolved: Index.3 : B.t (File "index.ml", line 60, characters 15-18) +Resolved: Index.2 : AS (File "index.ml", line 59, characters 23-25) +Resolved: Index.21 : MS (File "index.ml", line 57, characters 18-20) +Resolved: Index.5 : A (File "index.ml", line 58, characters 13-14) +Resolved: Index.5 : A (File "index.ml", line 54, characters 13-14) +Resolved: Index.2 : AS (File "index.ml", line 53, characters 13-15) +Resolved: Index.3 : F(A).t (File "index.ml", line 49, characters 9-16) +Resolved: Index.5 : A (File "index.ml", line 48, characters 14-15) +Resolved: Index.14 : F (File "index.ml", line 48, characters 11-12) +Resolved: Index.13 : P (File "index.ml", line 47, characters 35-36) +Resolved: Index.2 : AS (File "index.ml", line 47, characters 14-16) +Resolved: Index.11 : a (File "index.ml", line 45, characters 16-17) +Resolved: Index.5 : A (File "index.ml", line 44, characters 16-17) +Resolved: Index.2 : AS (File "index.ml", line 44, characters 20-22) +Resolved: Index.10 : y (File "index.ml", line 42, characters 19-20) +Unresolved: CU Stdlib . "print_int"[value] : + print_int (File "index.ml", line 42, characters 9-18) +Unresolved: CU Auxiliaire . "z"[value] : + Auxiliaire.z (File "index.ml", line 40, characters 14-26) +Resolved: Index.4 : A.x (File "index.ml", line 40, characters 8-11) +Unresolved: CU Stdlib . "+"[value] : + (+) (File "index.ml", line 40, characters 12-13) +Resolved: Index.5 : A (File "index.ml", line 38, characters 5-6) +Resolved: Index.3 : t (File "index.ml", line 32, characters 10-11) +Resolved: Index.5 : A (File "index.ml", line 31, characters 7-8) +Resolved: Index.5 : A (File "index.ml", line 34, characters 10-11) +Resolved: Index.5 : A (File "index.ml", line 28, characters 11-12) +Resolved: Index.3 : t (File "index.ml", line 25, characters 11-12) +Resolved: Index.0 : t (File "index.ml", line 20, characters 10-11) + +Uid of decls: +Index.10: y (File "index.ml", line 40, characters 4-5) +Index.21: MS (File "index.ml", line 51, characters 12-14) +Index.5: A (File "index.ml", line 23, characters 7-8) +Index.15: G (File "index.ml", line 48, characters 7-8) +Index.0: t (File "index.ml", line 19, characters 7-8) +Index.28: MSB (File "index.ml", line 65, characters 12-15) +Index.3: t (File "index.ml", line 24, characters 7-8) +Index.17: MT (File "index.ml", line 52, characters 14-16) +Index.11: a (File "index.ml", line 44, characters 4-5) +Index.25: u (File "index.ml", line 66, characters 7-8) +Index.24: MSA (File "index.ml", line 57, characters 12-15) +Index.1: x (File "index.ml", line 20, characters 6-7) +Index.16: u (File "index.ml", line 49, characters 5-6) +Index.8: c (File "index.ml", line 32, characters 6-7) +Index.9: C (File "index.ml", line 30, characters 7-8) +Index.23: u (File "index.ml", line 60, characters 11-12) +Index.14: F (File "index.ml", line 47, characters 7-8) +Index.12: _ (File "index.ml", line 45, characters 7-8) +Index.27: G (File "index.ml", line 68, characters 9-10) +Index.20: u (File "index.ml", line 55, characters 7-8) +Index.26: t (File "index.ml", line 67, characters 23-24) +Index.19: X (File "index.ml", line 54, characters 9-10) +Index.6: B (File "index.ml", line 28, characters 7-8) +Index.4: x (File "index.ml", line 25, characters 7-8) +Index.18: M (File "index.ml", line 53, characters 9-10) +Index.7: c (File "index.ml", line 35, characters 6-7) +Index.2: AS (File "index.ml", line 18, characters 12-14) diff --git a/testsuite/tests/shape-index/index_aliases.ml b/testsuite/tests/shape-index/index_aliases.ml new file mode 100644 index 00000000000..62d6a54fcb2 --- /dev/null +++ b/testsuite/tests/shape-index/index_aliases.ml @@ -0,0 +1,28 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + { + all_modules = "index_aliases.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_aliases.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; + } +*) + + +module A = struct type t end +module B = A + +module F (X : sig type t end) = X +module F' = F +module C = F'(A) + +module C' = F(B) +module D = C + +module G = B +include G diff --git a/testsuite/tests/shape-index/index_aliases.reference b/testsuite/tests/shape-index/index_aliases.reference new file mode 100644 index 00000000000..c661672cdc4 --- /dev/null +++ b/testsuite/tests/shape-index/index_aliases.reference @@ -0,0 +1,33 @@ +Indexed shapes: +Resolved_alias: Index_aliases.10 -> Index_aliases.2 -> Index_aliases.1 : + G (File "index_aliases.ml", line 28, characters 8-9) +Resolved_alias: Index_aliases.2 -> Index_aliases.1 : + B (File "index_aliases.ml", line 27, characters 11-12) +Resolved: Index_aliases.7 : + C (File "index_aliases.ml", line 25, characters 11-12) +Resolved_alias: Index_aliases.2 -> Index_aliases.1 : + B (File "index_aliases.ml", line 24, characters 14-15) +Resolved: Index_aliases.5 : + F (File "index_aliases.ml", line 24, characters 12-13) +Resolved: Index_aliases.1 : + A (File "index_aliases.ml", line 22, characters 14-15) +Resolved_alias: Index_aliases.6 -> Index_aliases.5 : + F' (File "index_aliases.ml", line 22, characters 11-13) +Resolved: Index_aliases.5 : + F (File "index_aliases.ml", line 21, characters 12-13) +Resolved: Index_aliases.4 : + X (File "index_aliases.ml", line 20, characters 32-33) +Resolved: Index_aliases.1 : + A (File "index_aliases.ml", line 18, characters 11-12) + +Uid of decls: +Index_aliases.1: A (File "index_aliases.ml", line 17, characters 7-8) +Index_aliases.2: B (File "index_aliases.ml", line 18, characters 7-8) +Index_aliases.5: F (File "index_aliases.ml", line 20, characters 7-8) +Index_aliases.7: C (File "index_aliases.ml", line 22, characters 7-8) +Index_aliases.9: D (File "index_aliases.ml", line 25, characters 7-8) +Index_aliases.8: C' (File "index_aliases.ml", line 24, characters 7-9) +Index_aliases.10: G (File "index_aliases.ml", line 27, characters 7-8) +Index_aliases.6: F' (File "index_aliases.ml", line 21, characters 7-9) +Index_aliases.3: t (File "index_aliases.ml", line 20, characters 23-24) +Index_aliases.0: t (File "index_aliases.ml", line 17, characters 23-24) diff --git a/testsuite/tests/shape-index/index_bindingops.ml b/testsuite/tests/shape-index/index_bindingops.ml new file mode 100644 index 00000000000..82570447892 --- /dev/null +++ b/testsuite/tests/shape-index/index_bindingops.ml @@ -0,0 +1,27 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + all_modules = "index_bindingops.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_bindingops.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + +let (let+) x f = Option.map f x + +let (and+) x y = + Option.bind x @@ fun x -> + Option.map (fun y -> (x, y)) y + +let minus_three = + let+ foo = None + and+ bar = None + and+ man = None in + foo + bar - man + +let _ = (let+) +let _ = (and+) diff --git a/testsuite/tests/shape-index/index_bindingops.reference b/testsuite/tests/shape-index/index_bindingops.reference new file mode 100644 index 00000000000..f441d4a5f33 --- /dev/null +++ b/testsuite/tests/shape-index/index_bindingops.reference @@ -0,0 +1,47 @@ +Indexed shapes: +Resolved: Index_bindingops.3 : + (and+) (File "index_bindingops.ml", line 27, characters 8-14) +Resolved: Index_bindingops.0 : + (let+) (File "index_bindingops.ml", line 26, characters 8-14) +Resolved: Index_bindingops.11 : + man (File "index_bindingops.ml", line 24, characters 14-17) +Resolved: Index_bindingops.10 : + bar (File "index_bindingops.ml", line 24, characters 8-11) +Resolved: Index_bindingops.9 : + foo (File "index_bindingops.ml", line 24, characters 2-5) +Unresolved: CU Stdlib . "+"[value] : + (+) (File "index_bindingops.ml", line 24, characters 6-7) +Unresolved: CU Stdlib . "-"[value] : + (-) (File "index_bindingops.ml", line 24, characters 12-13) +Resolved: Index_bindingops.3 : + (and+) (File "index_bindingops.ml", line 23, characters 2-6) +Resolved: Index_bindingops.3 : + (and+) (File "index_bindingops.ml", line 22, characters 2-6) +Resolved: Index_bindingops.0 : + (let+) (File "index_bindingops.ml", line 21, characters 2-6) +Resolved: Index_bindingops.5 : + y (File "index_bindingops.ml", line 18, characters 31-32) +Resolved: Index_bindingops.7 : + y (File "index_bindingops.ml", line 18, characters 27-28) +Resolved: Index_bindingops.6 : + x (File "index_bindingops.ml", line 18, characters 24-25) +Unresolved: CU Stdlib . "Option"[module] . "map"[value] : + Option.map (File "index_bindingops.ml", line 18, characters 2-12) +Resolved: Index_bindingops.4 : + x (File "index_bindingops.ml", line 17, characters 14-15) +Unresolved: CU Stdlib . "Option"[module] . "bind"[value] : + Option.bind (File "index_bindingops.ml", line 17, characters 2-13) +Resolved: Index_bindingops.1 : + x (File "index_bindingops.ml", line 14, characters 30-31) +Resolved: Index_bindingops.2 : + f (File "index_bindingops.ml", line 14, characters 28-29) +Unresolved: CU Stdlib . "Option"[module] . "map"[value] : + Option.map (File "index_bindingops.ml", line 14, characters 17-27) + +Uid of decls: +Index_bindingops.8: + minus_three (File "index_bindingops.ml", line 20, characters 4-15) +Index_bindingops.0: + let+ (File "index_bindingops.ml", line 14, characters 4-10) +Index_bindingops.3: + and+ (File "index_bindingops.ml", line 16, characters 4-10) diff --git a/testsuite/tests/shape-index/index_constrs.ml b/testsuite/tests/shape-index/index_constrs.ml new file mode 100644 index 00000000000..2b8727d5b65 --- /dev/null +++ b/testsuite/tests/shape-index/index_constrs.ml @@ -0,0 +1,29 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + readonly_files = "index_constrs.ml"; + all_modules = "index_constrs.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_constrs.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + +exception E +module M = struct + exception F = E +end + +type t = E + +let x_ = E +let () = raise E +let f x = match x with + | E -> () + | exception E -> () + +let _ = None +let _ = [%extension_constructor M.F] diff --git a/testsuite/tests/shape-index/index_constrs.reference b/testsuite/tests/shape-index/index_constrs.reference new file mode 100644 index 00000000000..9d0249c450e --- /dev/null +++ b/testsuite/tests/shape-index/index_constrs.reference @@ -0,0 +1,26 @@ +Indexed shapes: +Resolved: Index_constrs.1 : + M.F (File "index_constrs.ml", line 29, characters 32-35) +Resolved: Index_constrs.0 : + E (File "index_constrs.ml", line 26, characters 14-15) +Resolved: Index_constrs.4 : + E (File "index_constrs.ml", line 25, characters 4-5) +Resolved: Index_constrs.7 : + x (File "index_constrs.ml", line 24, characters 16-17) +Resolved: Index_constrs.0 : + E (File "index_constrs.ml", line 23, characters 15-16) +Unresolved: CU Stdlib . "raise"[value] : + raise (File "index_constrs.ml", line 23, characters 9-14) +Resolved: Index_constrs.4 : + E (File "index_constrs.ml", line 22, characters 9-10) +Resolved: Index_constrs.0 : + E (File "index_constrs.ml", line 17, characters 16-17) + +Uid of decls: +Index_constrs.6: f (File "index_constrs.ml", line 24, characters 4-5) +Index_constrs.5: x_ (File "index_constrs.ml", line 22, characters 4-6) +Index_constrs.0: E (File "index_constrs.ml", line 15, characters 10-11) +Index_constrs.2: M (File "index_constrs.ml", line 16, characters 7-8) +Index_constrs.1: F (File "index_constrs.ml", line 17, characters 12-13) +Index_constrs.3: t (File "index_constrs.ml", line 20, characters 5-6) +Index_constrs.4: E (File "index_constrs.ml", line 20, characters 9-10) diff --git a/testsuite/tests/shape-index/index_constrs_records.ml b/testsuite/tests/shape-index/index_constrs_records.ml new file mode 100644 index 00000000000..0cf31b60cb6 --- /dev/null +++ b/testsuite/tests/shape-index/index_constrs_records.ml @@ -0,0 +1,41 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + readonly_files = "index_constrs_records.ml"; + all_modules = "index_constrs_records.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_constrs_records.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) +type l = { lbl : int } +module M : sig + type t = A of { l_c : int } +end = struct + type t = A of { l_c : int } + let _ = A { l_c = 42 } +end + +let _ = M.A { l_c = 42 } + +open M + +let _ = A { l_c = 42 } +let f (A { l_c }) ({ lbl } as l) = l_c + lbl + l.lbl + +type u = .. +type u += Ext of { l_ext : int } + +let f (x : u) = match x with + | Ext { l_ext } -> l_ext + | _ -> assert false + +exception Exn of {l_exn : int } + +let e = Exn { l_exn = 2} +let _ = match e with + | Exn { l_exn } -> l_exn + | _ -> assert false diff --git a/testsuite/tests/shape-index/index_constrs_records.reference b/testsuite/tests/shape-index/index_constrs_records.reference new file mode 100644 index 00000000000..26e8425ad1c --- /dev/null +++ b/testsuite/tests/shape-index/index_constrs_records.reference @@ -0,0 +1,93 @@ +Indexed shapes: +Resolved: Index_constrs_records.34 : + l_exn (File "index_constrs_records.ml", line 40, characters 21-26) +Resolved: Index_constrs_records.30 : + l_exn (File "index_constrs_records.ml", line 40, characters 10-15) +Resolved: Index_constrs_records.31 : + Exn (File "index_constrs_records.ml", line 40, characters 4-7) +Resolved: Index_constrs_records.33 : + e (File "index_constrs_records.ml", line 39, characters 14-15) +Resolved: Index_constrs_records.30 : + l_exn (File "index_constrs_records.ml", line 38, characters 14-19) +Resolved: Index_constrs_records.31 : + Exn (File "index_constrs_records.ml", line 38, characters 8-11) +Resolved: Index_constrs_records.29 : + l_ext (File "index_constrs_records.ml", line 33, characters 21-26) +Resolved: Index_constrs_records.24 : + l_ext (File "index_constrs_records.ml", line 33, characters 10-15) +Resolved: Index_constrs_records.25 : + Ext (File "index_constrs_records.ml", line 33, characters 4-7) +Resolved: Index_constrs_records.28 : + x (File "index_constrs_records.ml", line 32, characters 22-23) +Resolved: Index_constrs_records.23 : + u (File "index_constrs_records.ml", line 32, characters 11-12) +Resolved: Index_constrs_records.23 : + u (File "index_constrs_records.ml", line 30, characters 5-6) +Resolved: Index_constrs_records.22 : + l (File "index_constrs_records.ml", line 27, characters 47-48) +Resolved: Index_constrs_records.1 : + lbl (File "index_constrs_records.ml", line 27, characters 49-52) +Resolved: Index_constrs_records.21 : + lbl (File "index_constrs_records.ml", line 27, characters 41-44) +Resolved: Index_constrs_records.20 : + l_c (File "index_constrs_records.ml", line 27, characters 35-38) +Unresolved: CU Stdlib . "+"[value] : + (+) (File "index_constrs_records.ml", line 27, characters 39-40) +Unresolved: CU Stdlib . "+"[value] : + (+) (File "index_constrs_records.ml", line 27, characters 45-46) +Resolved: Index_constrs_records.1 : + lbl (File "index_constrs_records.ml", line 27, characters 21-24) +Resolved: Index_constrs_records.3 : + l_c (File "index_constrs_records.ml", line 27, characters 11-14) +Resolved: Index_constrs_records.4 : + A (File "index_constrs_records.ml", line 27, characters 7-8) +Resolved: Index_constrs_records.3 : + l_c (File "index_constrs_records.ml", line 26, characters 12-15) +Resolved: Index_constrs_records.4 : + A (File "index_constrs_records.ml", line 26, characters 8-9) +Resolved: Index_constrs_records.17 : + M (File "index_constrs_records.ml", line 24, characters 5-6) +Resolved: Index_constrs_records.3 : + l_c (File "index_constrs_records.ml", line 22, characters 14-17) +Resolved: Index_constrs_records.4 : + M.A (File "index_constrs_records.ml", line 22, characters 8-11) +Resolved: Index_constrs_records.3 : + l_c (File "index_constrs_records.ml", line 19, characters 14-17) +Resolved: Index_constrs_records.4 : + A (File "index_constrs_records.ml", line 19, characters 10-11) + +Uid of decls: +Index_constrs_records.19: + f (File "index_constrs_records.ml", line 27, characters 4-5) +Index_constrs_records.4: + A (File "index_constrs_records.ml", line 18, characters 11-12) +Index_constrs_records.33: + e (File "index_constrs_records.ml", line 38, characters 4-5) +Index_constrs_records.10: + l_c (File "index_constrs_records.ml", line 16, characters 18-21) +Index_constrs_records.2: + t (File "index_constrs_records.ml", line 18, characters 7-8) +Index_constrs_records.25: + Ext (File "index_constrs_records.ml", line 30, characters 10-13) +Index_constrs_records.24: + l_ext (File "index_constrs_records.ml", line 30, characters 19-24) +Index_constrs_records.3: + l_c (File "index_constrs_records.ml", line 18, characters 18-21) +Index_constrs_records.30: + l_exn (File "index_constrs_records.ml", line 36, characters 18-23) +Index_constrs_records.17: + M (File "index_constrs_records.ml", line 15, characters 7-8) +Index_constrs_records.31: + Exn (File "index_constrs_records.ml", line 36, characters 10-13) +Index_constrs_records.11: + A (File "index_constrs_records.ml", line 16, characters 11-12) +Index_constrs_records.27: + f (File "index_constrs_records.ml", line 32, characters 4-5) +Index_constrs_records.9: + t (File "index_constrs_records.ml", line 16, characters 7-8) +Index_constrs_records.0: + l (File "index_constrs_records.ml", line 14, characters 5-6) +Index_constrs_records.23: + u (File "index_constrs_records.ml", line 29, characters 5-6) +Index_constrs_records.1: + lbl (File "index_constrs_records.ml", line 14, characters 11-14) diff --git a/testsuite/tests/shape-index/index_functor.ml b/testsuite/tests/shape-index/index_functor.ml new file mode 100644 index 00000000000..7067cefeaf0 --- /dev/null +++ b/testsuite/tests/shape-index/index_functor.ml @@ -0,0 +1,19 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + all_modules = "index_functor.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_functor.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + + +module F (X :sig end ) = struct module M = X end +module N = F(struct end) +module O = N.M +include O +include N diff --git a/testsuite/tests/shape-index/index_functor.reference b/testsuite/tests/shape-index/index_functor.reference new file mode 100644 index 00000000000..9b27d0c87f9 --- /dev/null +++ b/testsuite/tests/shape-index/index_functor.reference @@ -0,0 +1,17 @@ +Indexed shapes: +Resolved: Index_functor.3 : + N (File "index_functor.ml", line 19, characters 8-9) +Resolved_alias: Index_functor.4 -> Index_functor.0 : + O (File "index_functor.ml", line 18, characters 8-9) +Resolved: Index_functor.0 : + N.M (File "index_functor.ml", line 17, characters 11-14) +Resolved: Index_functor.2 : + F (File "index_functor.ml", line 16, characters 11-12) +Resolved: Index_functor.0 : + X (File "index_functor.ml", line 15, characters 43-44) + +Uid of decls: +Index_functor.3: N (File "index_functor.ml", line 16, characters 7-8) +Index_functor.4: O (File "index_functor.ml", line 17, characters 7-8) +Index_functor.2: F (File "index_functor.ml", line 15, characters 7-8) +Index_functor.1: M (File "index_functor.ml", line 15, characters 39-40) diff --git a/testsuite/tests/shape-index/index_labels.ml b/testsuite/tests/shape-index/index_labels.ml new file mode 100644 index 00000000000..191a78a51b7 --- /dev/null +++ b/testsuite/tests/shape-index/index_labels.ml @@ -0,0 +1,24 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + readonly_files = "index_labels.ml"; + all_modules = "index_labels.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_labels.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + +type t = { mutable a: int; b: string } + +let x = { a = 42; b = "" } +let _y = + x.a <- 32; + x.a + +let f = function + | { a = 42; b } -> () + | _ -> () diff --git a/testsuite/tests/shape-index/index_labels.reference b/testsuite/tests/shape-index/index_labels.reference new file mode 100644 index 00000000000..c553fc8738c --- /dev/null +++ b/testsuite/tests/shape-index/index_labels.reference @@ -0,0 +1,25 @@ +Indexed shapes: +Resolved: Index_labels.2 : + b (File "index_labels.ml", line 23, characters 14-15) +Resolved: Index_labels.1 : + a (File "index_labels.ml", line 23, characters 6-7) +Resolved: Index_labels.3 : + x (File "index_labels.ml", line 20, characters 2-3) +Resolved: Index_labels.1 : + a (File "index_labels.ml", line 20, characters 4-5) +Resolved: Index_labels.3 : + x (File "index_labels.ml", line 19, characters 2-3) +Resolved: Index_labels.1 : + a (File "index_labels.ml", line 19, characters 4-5) +Resolved: Index_labels.2 : + b (File "index_labels.ml", line 17, characters 18-19) +Resolved: Index_labels.1 : + a (File "index_labels.ml", line 17, characters 10-11) + +Uid of decls: +Index_labels.5: f (File "index_labels.ml", line 22, characters 4-5) +Index_labels.2: b (File "index_labels.ml", line 15, characters 27-28) +Index_labels.3: x (File "index_labels.ml", line 17, characters 4-5) +Index_labels.1: a (File "index_labels.ml", line 15, characters 19-20) +Index_labels.4: _y (File "index_labels.ml", line 18, characters 4-6) +Index_labels.0: t (File "index_labels.ml", line 15, characters 5-6) diff --git a/testsuite/tests/shape-index/index_modules.ml b/testsuite/tests/shape-index/index_modules.ml new file mode 100644 index 00000000000..f29a49b0aa6 --- /dev/null +++ b/testsuite/tests/shape-index/index_modules.ml @@ -0,0 +1,19 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + all_modules = "index_modules.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_modules.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + +(* Local modules: *) + +let () = + let module A = struct let x = 42 end in + let open A in + print_int (x + A.x) diff --git a/testsuite/tests/shape-index/index_modules.reference b/testsuite/tests/shape-index/index_modules.reference new file mode 100644 index 00000000000..7b6e5a80727 --- /dev/null +++ b/testsuite/tests/shape-index/index_modules.reference @@ -0,0 +1,14 @@ +Indexed shapes: +Resolved: Index_modules.0 : + A.x (File "index_modules.ml", line 19, characters 17-20) +Resolved: Index_modules.0 : + x (File "index_modules.ml", line 19, characters 13-14) +Unresolved: CU Stdlib . "+"[value] : + (+) (File "index_modules.ml", line 19, characters 15-16) +Unresolved: CU Stdlib . "print_int"[value] : + print_int (File "index_modules.ml", line 19, characters 2-11) +Resolved: Index_modules.1 : + A (File "index_modules.ml", line 18, characters 11-12) + +Uid of decls: +Index_modules.0: x (File "index_modules.ml", line 17, characters 28-29) diff --git a/testsuite/tests/shape-index/index_objects.ml b/testsuite/tests/shape-index/index_objects.ml new file mode 100644 index 00000000000..7fa18071e76 --- /dev/null +++ b/testsuite/tests/shape-index/index_objects.ml @@ -0,0 +1,46 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + readonly_files = "index_objects.ml"; + all_modules = "index_objects.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_objects.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + +let o = object + method pop () = () +end + +(* FIXME: method usages are not indexed yet *) +let () = o#pop () + +class c = object + method cpop () = () +end + +let _ : c = new c + +class d = object + inherit c +end + +module type M = sig + class ct : object + method pop : unit + end + + class dt : object inherit ct end +end + +class ins_var = object (self) + val mutable ins = 0 + method get_ins () = ins + method set_ins i = ins <- i + method other () = self#get_ins () + method update = {< ins = 3 >} +end diff --git a/testsuite/tests/shape-index/index_objects.reference b/testsuite/tests/shape-index/index_objects.reference new file mode 100644 index 00000000000..319ae5cd0a8 --- /dev/null +++ b/testsuite/tests/shape-index/index_objects.reference @@ -0,0 +1,32 @@ +Indexed shapes: +Resolved: Index_objects.21 : + ins (File "index_objects.ml", line 45, characters 21-24) +Resolved: Index_objects.28 : + self (File "index_objects.ml", line 44, characters 20-24) +Resolved: Index_objects.26 : + i (File "index_objects.ml", line 43, characters 28-29) +Resolved: Index_objects.21 : + ins (File "index_objects.ml", line 43, characters 21-24) +Resolved: Index_objects.21 : + ins (File "index_objects.ml", line 42, characters 22-25) +Resolved: Index_objects.13 : + ct (File "index_objects.ml", line 37, characters 28-30) +Resolved: Index_objects.5 : + c (File "index_objects.ml", line 29, characters 10-11) +Resolved: Index_objects.5 : + c (File "index_objects.ml", line 26, characters 8-9) +Resolved: Index_objects.5 : + c (File "index_objects.ml", line 26, characters 16-17) +Resolved: Index_objects.5 : + c (File "index_objects.ml", line 26, characters 8-9) +Resolved: Index_objects.0 : + o (File "index_objects.ml", line 20, characters 9-10) + +Uid of decls: +Index_objects.10: d (File "index_objects.ml", line 28, characters 6-7) +Index_objects.15: M (File "index_objects.ml", line 32, characters 12-13) +Index_objects.14: dt (File "index_objects.ml", line 37, characters 8-10) +Index_objects.5: c (File "index_objects.ml", line 22, characters 6-7) +Index_objects.0: o (File "index_objects.ml", line 15, characters 4-5) +Index_objects.16: ins_var (File "index_objects.ml", line 40, characters 6-13) +Index_objects.13: ct (File "index_objects.ml", line 33, characters 8-10) diff --git a/testsuite/tests/shape-index/index_types.ml b/testsuite/tests/shape-index/index_types.ml new file mode 100644 index 00000000000..508b1071fb4 --- /dev/null +++ b/testsuite/tests/shape-index/index_types.ml @@ -0,0 +1,38 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + readonly_files = "index_types.ml"; + all_modules = "index_types.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_types.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + +type t = int + +let x : t = 42 + +module M = struct end + +let () = match 4 with + | (_ : t) -> () + +type poly = [`A|`B] + +let () = match `A with #poly -> () + +module type S = sig + type t2 = .. + type t2 += B +end + +type t1 = .. +type t1 += B + +(* 5.2 local open for types *) +(* module N = struct type t end +type u = N.(t) *) diff --git a/testsuite/tests/shape-index/index_types.reference b/testsuite/tests/shape-index/index_types.reference new file mode 100644 index 00000000000..6fc88071e14 --- /dev/null +++ b/testsuite/tests/shape-index/index_types.reference @@ -0,0 +1,19 @@ +Indexed shapes: +Resolved: Index_types.7 : t1 (File "index_types.ml", line 34, characters 5-7) +Resolved: Index_types.4 : t2 (File "index_types.ml", line 30, characters 7-9) +Resolved: Index_types.3 : + poly (File "index_types.ml", line 26, characters 24-28) +Resolved: Index_types.0 : t (File "index_types.ml", line 22, characters 9-10) +Resolved: Index_types.0 : t (File "index_types.ml", line 17, characters 8-9) +Resolved: Index_types.0 : t (File "index_types.ml", line 17, characters 8-9) + +Uid of decls: +Index_types.3: poly (File "index_types.ml", line 24, characters 5-9) +Index_types.2: M (File "index_types.ml", line 19, characters 7-8) +Index_types.6: S (File "index_types.ml", line 28, characters 12-13) +Index_types.5: B (File "index_types.ml", line 30, characters 13-14) +Index_types.4: t2 (File "index_types.ml", line 29, characters 7-9) +Index_types.1: x (File "index_types.ml", line 17, characters 4-5) +Index_types.8: B (File "index_types.ml", line 34, characters 11-12) +Index_types.0: t (File "index_types.ml", line 15, characters 5-6) +Index_types.7: t1 (File "index_types.ml", line 33, characters 5-7) diff --git a/testsuite/tests/shape-index/index_vb.ml b/testsuite/tests/shape-index/index_vb.ml new file mode 100644 index 00000000000..83f4cc6a830 --- /dev/null +++ b/testsuite/tests/shape-index/index_vb.ml @@ -0,0 +1,19 @@ +(* TEST + flags = "-bin-annot -bin-annot-occurrences"; + compile_only = "true"; + readonly_files = "index_vb.ml"; + all_modules = "index_vb.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + program = "-quiet -index -decls index_vb.cmt"; + output = "out_objinfo"; + check-ocamlc.byte-output; + ocamlobjinfo; + check-program-output; +*) + +type t = { a : int; b : string * int } + +let { a; b = (c, d) } = { a = 42; b = ("", 4) } + +let () = print_int (a + d * (int_of_string c)) diff --git a/testsuite/tests/shape-index/index_vb.reference b/testsuite/tests/shape-index/index_vb.reference new file mode 100644 index 00000000000..3c7237c6b39 --- /dev/null +++ b/testsuite/tests/shape-index/index_vb.reference @@ -0,0 +1,24 @@ +Indexed shapes: +Resolved: Index_vb.4 : c (File "index_vb.ml", line 19, characters 43-44) +Unresolved: CU Stdlib . "int_of_string"[value] : + int_of_string (File "index_vb.ml", line 19, characters 29-42) +Resolved: Index_vb.5 : d (File "index_vb.ml", line 19, characters 24-25) +Unresolved: CU Stdlib . "*"[value] : ( * + ) (File "index_vb.ml", line 19, characters 26-27) +Resolved: Index_vb.3 : a (File "index_vb.ml", line 19, characters 20-21) +Unresolved: CU Stdlib . "+"[value] : + (+) (File "index_vb.ml", line 19, characters 22-23) +Unresolved: CU Stdlib . "print_int"[value] : + print_int (File "index_vb.ml", line 19, characters 9-18) +Resolved: Index_vb.2 : b (File "index_vb.ml", line 17, characters 34-35) +Resolved: Index_vb.1 : a (File "index_vb.ml", line 17, characters 26-27) +Resolved: Index_vb.2 : b (File "index_vb.ml", line 17, characters 9-10) +Resolved: Index_vb.1 : a (File "index_vb.ml", line 17, characters 6-7) + +Uid of decls: +Index_vb.3: a (File "index_vb.ml", line 17, characters 6-7) +Index_vb.1: a (File "index_vb.ml", line 15, characters 11-12) +Index_vb.0: t (File "index_vb.ml", line 15, characters 5-6) +Index_vb.2: b (File "index_vb.ml", line 15, characters 20-21) +Index_vb.5: a (File "index_vb.ml", line 17, characters 6-7) +Index_vb.4: a (File "index_vb.ml", line 17, characters 6-7) diff --git a/testsuite/tests/shapes/aliases.ml b/testsuite/tests/shapes/aliases.ml new file mode 100644 index 00000000000..30f55924e14 --- /dev/null +++ b/testsuite/tests/shapes/aliases.ml @@ -0,0 +1,126 @@ +(* TEST + flags = "-dshape"; + expect; +*) +module A = struct type t end +module B = A +[%%expect{| +{ + "A"[module] -> {<.1> + "t"[type] -> <.0>; + }; + } +module A : sig type t end +{ + "B"[module] -> Alias(<.2> + {<.1> + "t"[type] -> <.0>; + }); + } +module B = A +|}] + +type u = B.t + +[%%expect{| +{ + "u"[type] -> <.3>; + } +type u = B.t +|}] + +module F (X : sig type t end) = X +module F' = F +[%%expect{| +{ + "F"[module] -> Abs<.6>(X, X<.5>); + } +module F : functor (X : sig type t end) -> sig type t = X.t end +{ + "F'"[module] -> Alias(<.7> + Abs<.6>(X, X<.5>)); + } +module F' = F +|}] + +module C = F'(A) +[%%expect{| +{ + "C"[module] -> {<.8> + "t"[type] -> <.0>; + }; + } +module C : sig type t = A.t end +|}] + + +module C = F(B) + +[%%expect{| +{ + "C"[module] -> Alias(<.9> + {<.1> + "t"[type] -> <.0>; + }); + } +module C : sig type t = B.t end +|}] + +module D = C + +[%%expect{| +{ + "D"[module] -> Alias(<.10> + Alias(<.9> + {<.1> + "t"[type] -> <.0>; + })); + } +module D = C +|}] + +module G (X : sig type t end) = struct include X end +[%%expect{| +{ + "G"[module] -> Abs<.13>(X, { + "t"[type] -> X<.12> . "t"[type]; + }); + } +module G : functor (X : sig type t end) -> sig type t = X.t end +|}] + +module E = G(B) +[%%expect{| +{ + "E"[module] -> {<.14> + "t"[type] -> <.0>; + }; + } +module E : sig type t = B.t end +|}] + +module M = struct type t let x = 1 end +module N : sig type t end = M +module O = N +[%%expect{| +{ + "M"[module] -> {<.17> + "t"[type] -> <.15>; + "x"[value] -> <.16>; + }; + } +module M : sig type t val x : int end +{ + "N"[module] -> {<.19> + "t"[type] -> <.15>; + }; + } +module N : sig type t end +{ + "O"[module] -> Alias(<.20> + {<.19> + "t"[type] -> <.15>; + }); + } +module O = N +|}] diff --git a/testsuite/tests/shapes/comp_units.ml b/testsuite/tests/shapes/comp_units.ml index e706bd4c8ea..98b146f5e34 100644 --- a/testsuite/tests/shapes/comp_units.ml +++ b/testsuite/tests/shapes/comp_units.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) (* Make sure that shapes of compilation units are never eagerly loaded, @@ -9,7 +9,8 @@ module Mdirect = Stdlib__Unit [%%expect{| { - "Mdirect"[module] -> CU Stdlib__Unit; + "Mdirect"[module] -> Alias(<.0> + CU Stdlib__Unit); } module Mdirect = Unit |}] @@ -17,7 +18,8 @@ module Mdirect = Unit module Mproj = Stdlib.Unit [%%expect{| { - "Mproj"[module] -> (CU Stdlib . "Unit"[module])<.1>; + "Mproj"[module] -> Alias(<.1> + CU Stdlib . "Unit"[module]); } module Mproj = Unit |}] @@ -25,7 +27,7 @@ module Mproj = Unit module F (X : sig type t end) = X [%%expect{| { - "F"[module] -> Abs<.4>(X/274, X/274<.3>); + "F"[module] -> Abs<.4>(X, X<.3>); } module F : functor (X : sig type t end) -> sig type t = X.t end |}] @@ -49,7 +51,8 @@ module App_proj : sig type t = Unit.t end module App_direct_indir = F (Mdirect) [%%expect{| { - "App_direct_indir"[module] -> CU Stdlib__Unit; + "App_direct_indir"[module] -> Alias(<.7> + CU Stdlib__Unit); } module App_direct_indir : sig type t = Mdirect.t end |}] @@ -57,7 +60,8 @@ module App_direct_indir : sig type t = Mdirect.t end module App_proj_indir = F (Mproj) [%%expect{| { - "App_proj_indir"[module] -> (CU Stdlib . "Unit"[module])<.1>; + "App_proj_indir"[module] -> Alias(<.8> + CU Stdlib . "Unit"[module]); } module App_proj_indir : sig type t = Mproj.t end |}] diff --git a/testsuite/tests/shapes/functors.ml b/testsuite/tests/shapes/functors.ml index 34ac59036a5..33b6c43284c 100644 --- a/testsuite/tests/shapes/functors.ml +++ b/testsuite/tests/shapes/functors.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) module type S = sig @@ -17,7 +17,7 @@ module type S = sig type t val x : t end module Falias (X : S) = X [%%expect{| { - "Falias"[module] -> Abs<.4>(X/276, X/276<.3>); + "Falias"[module] -> Abs<.4>(X, X<.3>); } module Falias : functor (X : S) -> sig type t = X.t val x : t end |}] @@ -29,11 +29,10 @@ end { "Finclude"[module] -> Abs<.6> - (X/280, - { - "t"[type] -> X/280<.5> . "t"[type]; - "x"[value] -> X/280<.5> . "x"[value]; - }); + (X, { + "t"[type] -> X<.5> . "t"[type]; + "x"[value] -> X<.5> . "x"[value]; + }); } module Finclude : functor (X : S) -> sig type t = X.t val x : t end |}] @@ -44,11 +43,10 @@ module Fredef (X : S) = struct end [%%expect{| { - "Fredef"[module] -> - Abs<.10>(X/287, { - "t"[type] -> <.8>; - "x"[value] -> <.9>; - }); + "Fredef"[module] -> Abs<.10>(X, { + "t"[type] -> <.8>; + "x"[value] -> <.9>; + }); } module Fredef : functor (X : S) -> sig type t = X.t val x : X.t end |}] @@ -60,10 +58,14 @@ end [%%expect{| { "Fignore"[module] -> - Abs<.14>(()/1, { - "t"[type] -> <.11>; - "x"[value] -> <.13>; - }); + Abs<.14> + ((), + { + "t"[type] -> {<.11> + "Fresh"[constructor] -> {<.12>}; + }; + "x"[value] -> <.13>; + }); } module Fignore : S -> sig type t = Fresh val x : t end |}] @@ -74,10 +76,13 @@ module Arg : S = struct end [%%expect{| { - "Arg"[module] -> {<.18> - "t"[type] -> <.15>; - "x"[value] -> <.17>; - }; + "Arg"[module] -> + {<.18> + "t"[type] -> {<.15> + "T"[constructor] -> {<.16>}; + }; + "x"[value] -> <.17>; + }; } module Arg : S |}] @@ -85,7 +90,9 @@ module Arg : S include Falias(Arg) [%%expect{| { - "t"[type] -> <.15>; + "t"[type] -> {<.15> + "T"[constructor] -> {<.16>}; + }; "x"[value] -> <.17>; } type t = Arg.t @@ -95,7 +102,9 @@ val x : t = include Finclude(Arg) [%%expect{| { - "t"[type] -> <.15>; + "t"[type] -> {<.15> + "T"[constructor] -> {<.16>}; + }; "x"[value] -> <.17>; } type t = Arg.t @@ -115,7 +124,9 @@ val x : Arg.t = include Fignore(Arg) [%%expect{| { - "t"[type] -> <.11>; + "t"[type] -> {<.11> + "Fresh"[constructor] -> {<.12>}; + }; "x"[value] -> <.13>; } type t = Fignore(Arg).t = Fresh @@ -155,7 +166,9 @@ val x : int = 0 include Fignore(struct type t = int let x = 0 end) [%%expect{| { - "t"[type] -> <.11>; + "t"[type] -> {<.11> + "Fresh"[constructor] -> {<.12>}; + }; "x"[value] -> <.13>; } type t = Fresh @@ -168,10 +181,15 @@ module Fgen () = struct end [%%expect{| { - "Fgen"[module] -> Abs<.30>(()/1, { - "t"[type] -> <.27>; - "x"[value] -> <.29>; - }); + "Fgen"[module] -> + Abs<.30> + ((), + { + "t"[type] -> {<.27> + "Fresher"[constructor] -> {<.28>}; + }; + "x"[value] -> <.29>; + }); } module Fgen : functor () -> sig type t = Fresher val x : t end |}] @@ -179,7 +197,9 @@ module Fgen : functor () -> sig type t = Fresher val x : t end include Fgen () [%%expect{| { - "t"[type] -> <.27>; + "t"[type] -> {<.27> + "Fresher"[constructor] -> {<.28>}; + }; "x"[value] -> <.29>; } type t = Fresher @@ -223,9 +243,9 @@ module Big_to_small1 : B2S = functor (X : Big) -> X [%%expect{| { "Big_to_small1"[module] -> - Abs<.40>(X/380, {<.39> - "t"[type] -> X/380<.39> . "t"[type]; - }); + Abs<.40>(X, {<.39> + "t"[type] -> X<.39> . "t"[type]; + }); } module Big_to_small1 : B2S |}] @@ -233,10 +253,9 @@ module Big_to_small1 : B2S module Big_to_small2 : B2S = functor (X : Big) -> struct include X end [%%expect{| { - "Big_to_small2"[module] -> - Abs<.42>(X/383, { - "t"[type] -> X/383<.41> . "t"[type]; - }); + "Big_to_small2"[module] -> Abs<.42>(X, { + "t"[type] -> X<.41> . "t"[type]; + }); } module Big_to_small2 : B2S |}] diff --git a/testsuite/tests/shapes/incl_md_typeof.ml b/testsuite/tests/shapes/incl_md_typeof.ml index 95b952ff38b..9b0a6f409bb 100644 --- a/testsuite/tests/shapes/incl_md_typeof.ml +++ b/testsuite/tests/shapes/incl_md_typeof.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) module Foo : sig @@ -14,8 +14,7 @@ end [%%expect{| { "Foo"[module] -> {<.2> - "Bar"[module] -> {<.0> - }; + "Bar"[module] -> {<.0>}; }; } module Foo : sig module Bar : sig end end @@ -42,8 +41,7 @@ end [%%expect{| { "E"[module] -> {<.6> - "Bar"[module] -> {<.5> - }; + "Bar"[module] -> {<.5>}; }; } module E : Extended diff --git a/testsuite/tests/shapes/more_func.ml b/testsuite/tests/shapes/more_func.ml new file mode 100644 index 00000000000..77e99732030 --- /dev/null +++ b/testsuite/tests/shapes/more_func.ml @@ -0,0 +1,120 @@ +(* TEST + flags = "-dshape"; + expect; +*) +module M = struct end (* uid 0 *) +module F(X : sig end) = M +module App = F(List) +[%%expect{| +{ + "M"[module] -> {<.0>}; + } +module M : sig end +{ + "F"[module] -> Abs<.2>(X, {<.0>}); + } +module F : functor (X : sig end) -> sig end +{ + "App"[module] -> {<.3>}; + } +module App : sig end +|}] + + +module M = struct end (* uid 4 *) +module F(X : sig end) = struct include M type t end +module App = F(List) +[%%expect{| +{ + "M"[module] -> {<.4>}; + } +module M : sig end +{ + "F"[module] -> Abs<.7>(X, { + "t"[type] -> <.6>; + }); + } +module F : functor (X : sig end) -> sig type t end +{ + "App"[module] -> {<.8> + "t"[type] -> <.6>; + }; + } +module App : sig type t = F(List).t end +|}] + +module M = struct end (* uid 9 *) +module F(X : sig end) = X +module App = F(M) +[%%expect{| +{ + "M"[module] -> {<.9>}; + } +module M : sig end +{ + "F"[module] -> Abs<.11>(X, X<.10>); + } +module F : functor (X : sig end) -> sig end +{ + "App"[module] -> {<.12>}; + } +module App : sig end +|}] + +module Id(X : sig end) = X +module Struct = struct + module L = List +end +[%%expect{| +{ + "Id"[module] -> Abs<.14>(X, X<.13>); + } +module Id : functor (X : sig end) -> sig end +{ + "Struct"[module] -> + {<.16> + "L"[module] -> Alias(<.15> + CU Stdlib . "List"[module]); + }; + } +module Struct : sig module L = List end +|}] + +module App = Id(List) (* this should have the App uid *) +module Proj = Struct.L + (* this should have the Proj uid and be an alias to Struct.L *) +[%%expect{| +{ + "App"[module] -> (CU Stdlib . "List"[module])<.17>; + } +module App : sig end +{ + "Proj"[module] -> Alias(<.18> + Alias(<.15> + CU Stdlib . "List"[module])); + } +module Proj = Struct.L +|}] + +module F (X :sig end ) = struct module M = X end +module N = F(struct end) +module O = N.M +[%%expect{| +{ + "F"[module] -> Abs<.21>(X, { + "M"[module] -> X<.19>; + }); + } +module F : functor (X : sig end) -> sig module M : sig end end +{ + "N"[module] -> {<.22> + "M"[module] -> {<.19>}; + }; + } +module N : sig module M : sig end end +{ + "O"[module] -> Alias(<.23> + {<.19>}); + } +module O = N.M +|}] diff --git a/testsuite/tests/shapes/nested_types.ml b/testsuite/tests/shapes/nested_types.ml new file mode 100644 index 00000000000..cf1d1eb6bac --- /dev/null +++ b/testsuite/tests/shapes/nested_types.ml @@ -0,0 +1,50 @@ +(* TEST + flags = "-dshape"; + expect; +*) + +module M : sig + + exception Exn of { lbl_exn : int } + type l = { lbl : int } + type ext = .. + type ext += Ext of { lbl_ext : int } + type t = C of { lbl_cstr : int } +end = struct + exception Exn of { lbl_exn : int } + type l = { lbl : int } + type ext = .. + type ext += Ext of { lbl_ext : int } + type t = C of { lbl_cstr : int } +end +[%%expect{| +{ + "M"[module] -> + {<.35> + "Exn"[extension constructor] -> {<.1> + "lbl_exn"[label] -> <.0>; + }; + "Ext"[extension constructor] -> {<.7> + "lbl_ext"[label] -> <.6>; + }; + "ext"[type] -> <.5>; + "l"[type] -> {<.3> + "lbl"[label] -> <.4>; + }; + "t"[type] -> + {<.9> + "C"[constructor] -> {<.11> + "lbl_cstr"[label] -> <.10>; + }; + }; + }; + } +module M : + sig + exception Exn of { lbl_exn : int; } + type l = { lbl : int; } + type ext = .. + type ext += Ext of { lbl_ext : int; } + type t = C of { lbl_cstr : int; } + end +|}] diff --git a/testsuite/tests/shapes/open_arg.ml b/testsuite/tests/shapes/open_arg.ml index b82be265277..e25a3f4edc4 100644 --- a/testsuite/tests/shapes/open_arg.ml +++ b/testsuite/tests/shapes/open_arg.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) module type Make = functor (I : sig end) -> sig @@ -22,8 +22,7 @@ end = struct end [%%expect{| { - "Make"[module] -> Abs<.3>(I/276, { - }); + "Make"[module] -> Abs<.3>(I, {}); } module Make : functor (I : sig end) -> sig end |}] diff --git a/testsuite/tests/shapes/open_struct.ml b/testsuite/tests/shapes/open_struct.ml index cacd030094e..12455a2de74 100644 --- a/testsuite/tests/shapes/open_struct.ml +++ b/testsuite/tests/shapes/open_struct.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) (* Everything that couldn't go anywhere else. *) @@ -11,15 +11,16 @@ open struct end end [%%expect{| -{ - } +{} module M : sig type t = A end |}] include M [%%expect{| { - "t"[type] -> <.0>; + "t"[type] -> {<.0> + "A"[constructor] -> {<.1>}; + }; } type t = M.t = A |}] @@ -27,9 +28,13 @@ type t = M.t = A module N = M [%%expect{| { - "N"[module] -> {<.2> - "t"[type] -> <.0>; - }; + "N"[module] -> + Alias(<.3> + {<.2> + "t"[type] -> {<.0> + "A"[constructor] -> {<.1>}; + }; + }); } module N = M |}] @@ -46,7 +51,9 @@ end [%%expect{| { "M'"[module] -> {<.6> - "t"[type] -> <.4>; + "t"[type] -> {<.4> + "A"[constructor] -> {<.5>}; + }; }; } module M' : sig type t = A end @@ -55,9 +62,13 @@ module M' : sig type t = A end module N' = M' [%%expect{| { - "N'"[module] -> {<.6> - "t"[type] -> <.4>; - }; + "N'"[module] -> + Alias(<.7> + {<.6> + "t"[type] -> {<.4> + "A"[constructor] -> {<.5>}; + }; + }); } module N' = M' |}] @@ -69,11 +80,14 @@ module Test = struct end [%%expect{| { - "Test"[module] -> {<.11> - "M"[module] -> {<.10> - "t"[type] -> <.8>; - }; + "Test"[module] -> + {<.11> + "M"[module] -> {<.10> + "t"[type] -> {<.8> + "A"[constructor] -> {<.9>}; + }; }; + }; } module Test : sig module M : sig type t = A end end |}] @@ -82,7 +96,9 @@ include Test [%%expect{| { "M"[module] -> {<.10> - "t"[type] -> <.8>; + "t"[type] -> {<.8> + "A"[constructor] -> {<.9>}; + }; }; } module M = Test.M @@ -91,9 +107,13 @@ module M = Test.M module N = M [%%expect{| { - "N"[module] -> {<.10> - "t"[type] -> <.8>; - }; + "N"[module] -> + Alias(<.12> + {<.10> + "t"[type] -> {<.8> + "A"[constructor] -> {<.9>}; + }; + }); } module N = M |}] diff --git a/testsuite/tests/shapes/recmodules.ml b/testsuite/tests/shapes/recmodules.ml index fe47a48629b..dd6b3351f26 100644 --- a/testsuite/tests/shapes/recmodules.ml +++ b/testsuite/tests/shapes/recmodules.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) (**********) @@ -18,7 +18,9 @@ module rec A : sig [%%expect{| { "A"[module] -> { - "t"[type] -> <.8>; + "t"[type] -> {<.8> + "Leaf"[constructor] -> {<.9>}; + }; }; "B"[module] -> { "t"[type] -> <.10>; @@ -43,8 +45,8 @@ and B : sig end = B [%%expect{| { - "A"[module] -> A/299<.11>; - "B"[module] -> B/300<.12>; + "A"[module] -> A<.11>; + "B"[module] -> B<.12>; } module rec A : sig type t = Leaf of B.t end and B : sig type t = int end @@ -75,19 +77,23 @@ and ASet : sig end = Set.Make(A) [%%expect{| { - "A"[module] -> { - "compare"[value] -> <.38>; - "t"[type] -> <.35>; - }; + "A"[module] -> + { + "compare"[value] -> <.38>; + "t"[type] -> + {<.35> + "Leaf"[constructor] -> {<.36>}; + "Node"[constructor] -> {<.37>}; + }; + }; "ASet"[module] -> { "compare"[value] -> - CU Stdlib . "Set"[module] . "Make"[module](A/321<.19>) . - "compare"[value]; + CU Stdlib . "Set"[module] . "Make"[module](A<.19>) . "compare"[value]; "elt"[type] -> - CU Stdlib . "Set"[module] . "Make"[module](A/321<.19>) . "elt"[type]; + CU Stdlib . "Set"[module] . "Make"[module](A<.19>) . "elt"[type]; "t"[type] -> - CU Stdlib . "Set"[module] . "Make"[module](A/321<.19>) . "t"[type]; + CU Stdlib . "Set"[module] . "Make"[module](A<.19>) . "t"[type]; }; } module rec A : diff --git a/testsuite/tests/shapes/rotor_example.ml b/testsuite/tests/shapes/rotor_example.ml index 961d5d4e803..bb35d701dab 100644 --- a/testsuite/tests/shapes/rotor_example.ml +++ b/testsuite/tests/shapes/rotor_example.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) (* We depart slightly from the example in the PLDI'19 paper, which actually @@ -25,10 +25,10 @@ end [%%expect{| { "Pair"[module] -> - Abs<.9>(X/276, Y/277, { - "t"[type] -> <.5>; - "to_string"[value] -> <.6>; - }); + Abs<.9>(X, Y, { + "t"[type] -> <.5>; + "to_string"[value] -> <.6>; + }); } module Pair : functor (X : Stringable) (Y : Stringable) -> @@ -80,7 +80,6 @@ module P : P.to_string (0, ("!=", 1)) [%%expect{| -{ - } +{} - : string = "0 != 1" |}] diff --git a/testsuite/tests/shapes/simple.ml b/testsuite/tests/shapes/simple.ml index 714c0deeeab..1e335597c00 100644 --- a/testsuite/tests/shapes/simple.ml +++ b/testsuite/tests/shapes/simple.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) let x = () @@ -23,8 +23,12 @@ type t = A of foo and foo = Bar [%%expect{| { - "foo"[type] -> <.3>; - "t"[type] -> <.2>; + "foo"[type] -> {<.3> + "Bar"[constructor] -> {<.5>}; + }; + "t"[type] -> {<.2> + "A"[constructor] -> {<.4>}; + }; } type t = A of foo and foo = Bar @@ -43,7 +47,7 @@ module type S = sig type t end exception E [%%expect{| { - "E"[extension constructor] -> <.8>; + "E"[extension constructor] -> {<.8>}; } exception E |}] @@ -59,8 +63,8 @@ type ext = .. type ext += A | B [%%expect{| { - "A"[extension constructor] -> <.10>; - "B"[extension constructor] -> <.11>; + "A"[extension constructor] -> {<.10>}; + "B"[extension constructor] -> {<.11>}; } type ext += A | B |}] @@ -71,7 +75,7 @@ end [%%expect{| { "M"[module] -> {<.13> - "C"[extension constructor] -> <.12>; + "C"[extension constructor] -> {<.12>}; }; } module M : sig type ext += C end @@ -81,8 +85,7 @@ module _ = struct type t = Should_not_appear_in_shape end [%%expect{| -{ - } +{} |}] module rec M1 : sig @@ -101,12 +104,17 @@ end [%%expect{| { "M1"[module] -> { - "t"[type] -> <.27>; + "t"[type] -> {<.27> + "C"[constructor] -> {<.28>}; + }; }; - "M2"[module] -> { - "t"[type] -> <.29>; - "x"[value] -> <.31>; + "M2"[module] -> + { + "t"[type] -> {<.29> + "T"[constructor] -> {<.30>}; }; + "x"[value] -> <.31>; + }; } module rec M1 : sig type t = C of M2.t end and M2 : sig type t val x : t end @@ -130,3 +138,11 @@ class type c = object end } class type c = object end |}] + +type u = t +[%%expect{| +{ + "u"[type] -> <.36>; + } +type u = t +|}] diff --git a/testsuite/tests/shapes/typeof_include.ml b/testsuite/tests/shapes/typeof_include.ml index 5dd60fab6e2..724e60281ea 100644 --- a/testsuite/tests/shapes/typeof_include.ml +++ b/testsuite/tests/shapes/typeof_include.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-dshape" - * expect + flags = "-dshape"; + expect; *) module type S = sig diff --git a/testsuite/tests/statmemprof/alloc_counts.ml b/testsuite/tests/statmemprof/alloc_counts.ml index de0d1e9e49d..7f7c85bba87 100644 --- a/testsuite/tests/statmemprof/alloc_counts.ml +++ b/testsuite/tests/statmemprof/alloc_counts.ml @@ -1,9 +1,14 @@ -(* TEST -* skip -reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -*) +(* TEST *) + +(* Checks that the allocated words counted by statmemprof + (with sampling rate of 1) match the numbers reported by + Gc.counters(). *) + module MP = Gc.Memprof +(* Returns the number of words allocated on the minor and major heaps + when f is called, as counted by statmemprof *) + let allocs_by_memprof f = let minor = ref 0 in let major = ref 0 in @@ -13,11 +18,15 @@ let allocs_by_memprof f = let alloc_major (info : MP.allocation) = major := !major + info.n_samples; None in - MP.start ~sampling_rate:1. ({MP.null_tracker with alloc_minor; alloc_major}); + let _:MP.t = MP.start ~sampling_rate:1. + ({MP.null_tracker with alloc_minor; alloc_major}) in match Sys.opaque_identity f () with | _ -> MP.stop (); (!minor, !major) | exception e -> MP.stop (); raise e +(* Returns the number of words allocated on the minor and major heaps + when f is called, as counted by Gc.counters() *) + let allocs_by_counters f = let minor1, prom1, major1 = Gc.counters () in let minor2, prom2, major2 = Gc.counters () in @@ -34,6 +43,8 @@ let allocs_by_counters f = int_of_float minor, int_of_float (major -. prom) +(* Compares memprof results with Gc.counters() results *) + let compare name f = let mp_minor, mp_major = allocs_by_memprof f in let ct_minor, ct_major = allocs_by_counters f in @@ -47,6 +58,9 @@ let many f = ignore (Sys.opaque_identity f ()) done +(* Compare allocated word counts for repetitions of various functions + which allocate large or small objects of different kinds. *) + let () = compare "ref" (many (fun () -> ref (ref (ref 42)))); compare "short array" (many (fun () -> Array.make 10 'a')); diff --git a/testsuite/tests/statmemprof/arrays_in_major.ml b/testsuite/tests/statmemprof/arrays_in_major.ml index eb627324ba6..cb3d5edbad8 100644 --- a/testsuite/tests/statmemprof/arrays_in_major.ml +++ b/testsuite/tests/statmemprof/arrays_in_major.ml @@ -1,10 +1,12 @@ -(* TEST - flags = "-g" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -*) +(* TEST *) -open Gc.Memprof +module MP = Gc.Memprof + +(* Tests that array allocation in the major heap is properly counted + and managed by statmemprof. *) + +(* Allocate arrays of all sizes from `lo` to `hi`, `cnt` times. If + `keep`, then keep all the arrays, otherwise discard them all. *) let root = ref [] let[@inline never] allocate_arrays lo hi cnt keep = @@ -16,67 +18,80 @@ let[@inline never] allocate_arrays lo hi cnt keep = if not keep then root := [] done +(* Check that no allocation callbacks are called if the sampling rate + is zero. *) + let check_nosample () = Printf.printf "check_nosample\n%!"; let alloc _ = Printf.printf "Callback called with sampling_rate = 0\n"; - assert(false) + assert(false) in + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:0. + { MP.null_tracker with alloc_minor = alloc; alloc_major = alloc; } in - start ~callstack_size:10 ~sampling_rate:0. - { null_tracker with alloc_minor = alloc; alloc_major = alloc; }; allocate_arrays 300 3000 1 false; - stop () + MP.stop () let () = check_nosample () +(* Cross-check counts of allocations, promotions, and deallocations, + and check that they change appropriately at major collections + depending on reachability *) + let check_counts_full_major force_promote = Printf.printf "check_counts_full_major\n%!"; + let enable = ref true in let nalloc_minor = ref 0 in let nalloc_major = ref 0 in - let enable = ref true in let npromote = ref 0 in let ndealloc_minor = ref 0 in let ndealloc_major = ref 0 in - start ~callstack_size:10 ~sampling_rate:0.01 + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:0.01 { alloc_minor = (fun _ -> if not !enable then None - else Some (incr nalloc_minor) - ); + else Some (incr nalloc_minor)); alloc_major = (fun _ -> if not !enable then None - else Some (incr nalloc_major) - ); - promote = (fun _ -> - Some (incr npromote) - ); - dealloc_minor = (fun _ -> - incr ndealloc_minor - ); - dealloc_major = (fun _ -> - incr ndealloc_major - ); - }; + else Some (incr nalloc_major)); + promote = (fun _ -> Some (incr npromote)); + dealloc_minor = (fun _ -> incr ndealloc_minor); + dealloc_major = (fun _ -> incr ndealloc_major); + } + in allocate_arrays 300 3000 1 true; - enable := false; + enable := false; (* stop sampling *) + (* everything is still reachable from root *) assert (!ndealloc_minor = 0 && !ndealloc_major = 0); + if force_promote then begin Gc.full_major (); + (* everything is still reachable from root, and + everything allocated in the minor heap has now + been promoted *) assert (!ndealloc_minor = 0 && !ndealloc_major = 0 && !npromote = !nalloc_minor); + root := []; Gc.full_major (); + (* nothing is reachable from root, so everything (which was + promoted) has now been deallocated in the major heap *) assert (!ndealloc_minor = 0 && !ndealloc_major = !nalloc_minor + !nalloc_major); + end else begin root := []; Gc.minor (); Gc.full_major (); Gc.full_major (); + (* everything allocated in the minor heap has either + been deallocated in the minor heap or promoted, + and everything deallocated in the major heap had + either been allocated in the major heap or promoted *) assert (!nalloc_minor = !ndealloc_minor + !npromote && !ndealloc_major = !npromote + !nalloc_major) end; - stop () + MP.stop () let () = check_counts_full_major false; @@ -90,27 +105,27 @@ let check_no_nested () = in_callback := true; allocate_arrays 300 300 100 false; in_callback := false; - () - in + () in let cb' _ = cb (); Some () in - start ~callstack_size:10 ~sampling_rate:1. + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:1. { alloc_minor = cb'; alloc_major = cb'; promote = cb'; dealloc_minor = cb; dealloc_major = cb; - }; + } + in allocate_arrays 300 300 100 false; - stop () + MP.stop () let () = check_no_nested () let check_distrib lo hi cnt rate = Printf.printf "check_distrib %d %d %d %f\n%!" lo hi cnt rate; let smp = ref 0 in - start ~callstack_size:10 ~sampling_rate:rate - { null_tracker with + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:rate + { MP.null_tracker with alloc_major = (fun info -> assert (info.size >= lo && info.size <= hi); assert (info.n_samples > 0); @@ -118,9 +133,10 @@ let check_distrib lo hi cnt rate = smp := !smp + info.n_samples; None ); - }; + } + in allocate_arrays lo hi cnt false; - stop (); + MP.stop (); (* The probability distribution of the number of samples follows a binomial distribution of parameters tot_alloc and rate. Given @@ -134,7 +150,7 @@ let check_distrib lo hi cnt rate = float tot_alloc *. (1. -. rate) > 100.); let mean = float tot_alloc *. rate in let stddev = sqrt (float tot_alloc *. rate *. (1. -. rate)) in - (* This assertion has probability to fail close to 1e-8. *) + (* This should fail approximately one time in 100,000,000 *) assert (abs_float (mean -. float !smp) <= stddev *. 5.7) let () = diff --git a/testsuite/tests/statmemprof/arrays_in_major.reference b/testsuite/tests/statmemprof/arrays_in_major.reference new file mode 100644 index 00000000000..1f34ad8ec85 --- /dev/null +++ b/testsuite/tests/statmemprof/arrays_in_major.reference @@ -0,0 +1,11 @@ +check_nosample +check_counts_full_major +check_counts_full_major +check_no_nested +check_distrib 300 3000 3 0.000010 +check_distrib 300 3000 1 0.000100 +check_distrib 300 3000 1 0.010000 +check_distrib 300 3000 1 0.900000 +check_distrib 300 300 100000 0.100000 +check_distrib 300000 300000 30 0.100000 +OK ! diff --git a/testsuite/tests/statmemprof/arrays_in_minor.ml b/testsuite/tests/statmemprof/arrays_in_minor.ml index 99862958361..5abee616d74 100644 --- a/testsuite/tests/statmemprof/arrays_in_minor.ml +++ b/testsuite/tests/statmemprof/arrays_in_minor.ml @@ -1,10 +1,11 @@ -(* TEST - flags = "-g" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -*) +(* TEST *) -open Gc.Memprof +module MP = Gc.Memprof + +(* Tests that array allocation in the minor heap is properly counted + and managed by statmemprof. *) + +(* Use a big array as a GC root, to keep allocated arrays alive. *) let roots = Array.make 1000000 [||] let roots_pos = ref 0 @@ -15,42 +16,42 @@ let clear_roots () = Array.fill roots 0 !roots_pos [||]; roots_pos := 0 -let[@inline never] rec allocate_arrays_inner i hi keep = - if i > hi then () - else begin - add_root (Array.make i 0); - allocate_arrays_inner (i + 3) hi keep - end +(* Allocate arrays of all sizes from `lo` to `hi`, `cnt` times. If + `keep`, then keep all the arrays, otherwise discard them all. *) let[@inline never] allocate_arrays lo hi cnt keep = assert (0 < lo && hi <= 250); (* Fits in minor heap. *) for j = 0 to cnt-1 do - allocate_arrays_inner lo hi keep; + for i = lo to hi do + add_root (Array.make i 0) + done; if not keep then clear_roots () done -let allocate_arrays_total lo hi cnt = - let tot = ref 0 in - let i = ref lo in - while !i <= hi do - tot := !tot + (!i + 1); - i := !i + 3; - done; - cnt * !tot +(* Check that no allocation callbacks are called if the sampling rate + is zero. *) let check_nosample () = Printf.printf "check_nosample\n%!"; let alloc _ = Printf.printf "Callback called with sampling_rate = 0\n"; - assert(false) + assert(false) in + let _ = MP.start ~callstack_size:10 ~sampling_rate:0. + { MP.null_tracker with alloc_minor = alloc; alloc_major = alloc } in - start ~callstack_size:10 ~sampling_rate:0. - { null_tracker with alloc_minor = alloc; alloc_major = alloc }; allocate_arrays 1 250 100 false; - stop () + MP.stop () let () = check_nosample () +(* Cross-check counts of allocations, promotions, and deallocations, + and check that they change appropriately at major collections + depending on reachability. Occasionally trigger minor + collections. Check that every dealloc callback from the major heap + is for a block which has been promoted from the minor heap, and + every dealloc callback from the minor heap is for a block which was + allocated on the minor heap and has not been promoted. *) + let check_counts_full_major force_promote = Printf.printf "check_counts_full_major\n%!"; let nalloc_minor = ref 0 in @@ -59,7 +60,7 @@ let check_counts_full_major force_promote = let npromote = ref 0 in let ndealloc_minor = ref 0 in let ndealloc_major = ref 0 in - start ~callstack_size:10 ~sampling_rate:0.01 + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:0.01 { alloc_minor = (fun info -> if !enable then begin @@ -80,13 +81,19 @@ let check_counts_full_major force_promote = dealloc_major = (fun r -> assert (!r = 17); incr ndealloc_major); - }; + } + in allocate_arrays 1 250 100 true; - enable := false; + enable := false; (* stop sampling *) + (* everything is still reachable from root, no deallocs *) assert (!ndealloc_minor = 0 && !ndealloc_major = 0); + if force_promote then begin Gc.full_major (); promotes_allowed := false; + (* everything is still reachable from root, and + everything allocated in the minor heap has now been + promoted *) allocate_arrays 1 250 10 true; Gc.full_major (); assert (!ndealloc_minor = 0 && !ndealloc_major = 0 && @@ -102,7 +109,7 @@ let check_counts_full_major force_promote = assert (!nalloc_minor = !ndealloc_minor + !npromote && !ndealloc_major = !npromote) end; - stop () + MP.stop () let () = check_counts_full_major false; @@ -117,27 +124,27 @@ let check_no_nested () = allocate_arrays 1 100 10 false; ignore (Array.to_list (Array.make 1000 0)); in_callback := false; - () - in + () in let cb' _ = cb (); Some () in - start ~callstack_size:10 ~sampling_rate:1. + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:1. { alloc_minor = cb'; alloc_major = cb'; promote = cb'; dealloc_minor = cb; dealloc_major = cb; - }; + } + in allocate_arrays 1 250 5 false; - stop () + MP.stop () let () = check_no_nested () let check_distrib lo hi cnt rate = Printf.printf "check_distrib %d %d %d %f\n%!" lo hi cnt rate; let smp = ref 0 in - start ~callstack_size:10 ~sampling_rate:rate - { null_tracker with + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:rate + { MP.null_tracker with alloc_major = (fun _ -> assert false); alloc_minor = (fun info -> assert (info.size >= lo && info.size <= hi); @@ -146,9 +153,10 @@ let check_distrib lo hi cnt rate = smp := !smp + info.n_samples; None ); - }; + } + in allocate_arrays lo hi cnt false; - stop (); + MP.stop (); (* The probability distribution of the number of samples follows a binomial distribution of parameters tot_alloc and rate. Given @@ -157,7 +165,7 @@ let check_distrib lo hi cnt rate = distribution. We compute a 1e-8 confidence interval for !smp using quantiles of the normal distribution, and check that we are in this confidence interval. *) - let tot_alloc = allocate_arrays_total lo hi cnt in + let tot_alloc = cnt*(lo+hi+2)*(hi-lo+1)/2 in assert (float tot_alloc *. rate > 100. && float tot_alloc *. (1. -. rate) > 100.); let mean = float tot_alloc *. rate in diff --git a/testsuite/tests/statmemprof/arrays_in_minor.reference b/testsuite/tests/statmemprof/arrays_in_minor.reference new file mode 100644 index 00000000000..1dad91939c8 --- /dev/null +++ b/testsuite/tests/statmemprof/arrays_in_minor.reference @@ -0,0 +1,11 @@ +check_nosample +check_counts_full_major +check_counts_full_major +check_no_nested +check_distrib 1 250 1000 0.000010 +check_distrib 1 250 1000 0.000100 +check_distrib 1 250 1000 0.010000 +check_distrib 1 250 1000 0.900000 +check_distrib 1 1 10000000 0.010000 +check_distrib 250 250 100000 0.100000 +OK ! diff --git a/testsuite/tests/statmemprof/blocking_in_callback.ml b/testsuite/tests/statmemprof/blocking_in_callback.ml index e1e40f1fb6a..f648dae69dc 100644 --- a/testsuite/tests/statmemprof/blocking_in_callback.ml +++ b/testsuite/tests/statmemprof/blocking_in_callback.ml @@ -1,10 +1,11 @@ (* TEST -* hassysthreads -include systhreads -* skip -reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -** bytecode -** native + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) let cnt = ref 0 @@ -66,10 +67,11 @@ let rec go alloc_num tid = let () = let t = Thread.create (fun () -> go 0 1) () in - Gc.Memprof.(start ~callstack_size:10 ~sampling_rate:1. - { null_tracker with - alloc_minor = alloc_callback; - alloc_major = alloc_callback }); + let _:Gc.Memprof.t = + Gc.Memprof.(start ~callstack_size:10 ~sampling_rate:1. + { null_tracker with + alloc_minor = alloc_callback; + alloc_major = alloc_callback }) in Mutex.unlock mut; go 0 0; Thread.join t; diff --git a/testsuite/tests/statmemprof/callstacks.flat-float-array.byte.reference b/testsuite/tests/statmemprof/callstacks.flat-float-array.byte.reference new file mode 100644 index 00000000000..05cffe37f1f --- /dev/null +++ b/testsuite/tests/statmemprof/callstacks.flat-float-array.byte.reference @@ -0,0 +1,74 @@ +----------- +Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 19, characters 30-53 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 22, characters 30-76 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 27, characters 12-66 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 30, characters 30-60 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 33, characters 30-55 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 37, characters 12-62 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 40, characters 22-27 +Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 30-65 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 45, characters 30-69 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 48, characters 30-73 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 52, characters 30-43 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.get0 in file "callstacks.ml", line 55, characters 28-33 +Called from Callstacks.getfloatfield in file "callstacks.ml", line 57, characters 30-47 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Stdlib__Marshal.from_bytes in file "marshal.ml", line 68, characters 9-35 +Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 63, characters 12-87 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 66, characters 30-59 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 69, characters 37-43 +Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 71, characters 30-49 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 diff --git a/testsuite/tests/statmemprof/callstacks.flat-float-array.opt.reference b/testsuite/tests/statmemprof/callstacks.flat-float-array.opt.reference new file mode 100644 index 00000000000..8e8a311a202 --- /dev/null +++ b/testsuite/tests/statmemprof/callstacks.flat-float-array.opt.reference @@ -0,0 +1,75 @@ +----------- +Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 19, characters 30-53 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 22, characters 30-76 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 27, characters 12-66 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 30, characters 30-60 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 33, characters 30-55 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 37, characters 12-62 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 40, characters 22-27 +Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 30-65 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 45, characters 30-69 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 48, characters 30-73 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 52, characters 30-43 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.get0 in file "callstacks.ml", line 55, characters 28-33 +Called from Callstacks.getfloatfield in file "callstacks.ml", line 57, characters 30-47 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Stdlib__Marshal.from_bytes in file "marshal.ml" (inlined), line 68, characters 9-35 +Called from Stdlib__Marshal.from_string in file "marshal.ml", line 74, characters 2-46 +Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 63, characters 12-87 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 66, characters 30-59 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 +----------- +Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 69, characters 37-43 +Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 71, characters 30-49 +Called from Callstacks.test in file "callstacks.ml", line 94, characters 2-10 +Called from Callstacks.test_all in file "callstacks.ml", line 105, characters 17-23 +Called from Callstacks in file "callstacks.ml", line 107, characters 2-21 diff --git a/testsuite/tests/statmemprof/callstacks.ml b/testsuite/tests/statmemprof/callstacks.ml index e864a50019e..88968cad8b1 100644 --- a/testsuite/tests/statmemprof/callstacks.ml +++ b/testsuite/tests/statmemprof/callstacks.ml @@ -1,22 +1,19 @@ -(* TEST - flags = "-g -w -5" - - * flat-float-array - reference = "${test_source_directory}/callstacks.flat-float-array.reference" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" - ** native - ** bytecode - - * no-flat-float-array - reference = "${test_source_directory}/callstacks.no-flat-float-array.reference" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" - ** native - ** bytecode +(* TEST_BELOW + Blank lines added to preserve locations + + + + + + + + + + + *) -open Gc.Memprof +module MP = Gc.Memprof let alloc_list_literal () = ignore (Sys.opaque_identity [Sys.opaque_identity 1]) @@ -52,7 +49,7 @@ let alloc_large_array () = let alloc_closure () = let x = Sys.opaque_identity 1 in - ignore (Sys.opaque_identity (fun () -> x)) + ignore (Sys.opaque_identity (fun () -> x) : _ -> _) let floatarray = [| 1.; 2. |] let[@inline never] get0 a = a.(0) @@ -79,11 +76,11 @@ let allocators = alloc_small_array; alloc_large_array; alloc_closure; getfloatfield; alloc_unmarshal; alloc_ref; alloc_boxedfloat] -let test alloc = +let[@inline never] test alloc = Printf.printf "-----------\n%!"; let callstack = ref None in - start ~callstack_size:10 ~sampling_rate:1. - { null_tracker with + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:1. + { MP.null_tracker with alloc_minor = (fun info -> callstack := Some info.callstack; None @@ -92,12 +89,40 @@ let test alloc = callstack := Some info.callstack; None ); - }; + } + in alloc (); - stop (); + MP.stop (); match !callstack with | None -> Printf.printf "No callstack\n%!"; | Some cs -> Printexc.print_raw_backtrace stdout cs let () = - List.iter test allocators + (* Manual iteration instead of List.iter, so that backtraces + do not depend on stdlib details *) + let[@inline never] rec test_all = function + | [] -> () + | t :: ts -> test t; test_all ts + in + test_all allocators + +(* TEST + flags = "-g"; + { + flat-float-array; + { reference = "${test_source_directory}/callstacks.flat-float-array.byte.reference"; + bytecode; + } + { reference = "${test_source_directory}/callstacks.flat-float-array.opt.reference"; + native; + } + }{ + no-flat-float-array; + { reference = "${test_source_directory}/callstacks.no-flat-float-array.byte.reference"; + bytecode; + } + { reference = "${test_source_directory}/callstacks.no-flat-float-array.opt.reference"; + native; + } + } +*) diff --git a/testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference b/testsuite/tests/statmemprof/callstacks.no-flat-float-array.byte.reference similarity index 82% rename from testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference rename to testsuite/tests/statmemprof/callstacks.no-flat-float-array.byte.reference index 06e9be9c92b..e2b259a0113 100644 --- a/testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference +++ b/testsuite/tests/statmemprof/callstacks.no-flat-float-array.byte.reference @@ -1,70 +1,70 @@ ----------- Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 18, characters 30-53 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 21, characters 30-76 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 26, characters 12-66 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 29, characters 30-60 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 32, characters 30-55 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 36, characters 12-62 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 39, characters 22-27 Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 41, characters 30-65 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 44, characters 30-69 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 47, characters 30-73 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 51, characters 30-43 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- No callstack ----------- -Raised by primitive operation at Stdlib__Marshal.from_bytes in file "marshal.ml", line 65, characters 9-35 +Raised by primitive operation at Stdlib__Marshal.from_bytes in file "marshal.ml", line 68, characters 9-35 Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 62, characters 12-87 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 65, characters 30-59 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 68, characters 37-43 Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 70, characters 30-49 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 diff --git a/testsuite/tests/statmemprof/callstacks.flat-float-array.reference b/testsuite/tests/statmemprof/callstacks.no-flat-float-array.opt.reference similarity index 75% rename from testsuite/tests/statmemprof/callstacks.flat-float-array.reference rename to testsuite/tests/statmemprof/callstacks.no-flat-float-array.opt.reference index 4eebf868f88..c4bb2a82f71 100644 --- a/testsuite/tests/statmemprof/callstacks.flat-float-array.reference +++ b/testsuite/tests/statmemprof/callstacks.no-flat-float-array.opt.reference @@ -1,74 +1,71 @@ ----------- Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 18, characters 30-53 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 21, characters 30-76 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 26, characters 12-66 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 29, characters 30-60 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 32, characters 30-55 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 36, characters 12-62 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 39, characters 22-27 Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 41, characters 30-65 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 44, characters 30-69 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 47, characters 30-73 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 51, characters 30-43 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- -Raised by primitive operation at Callstacks.get0 in file "callstacks.ml", line 54, characters 28-33 -Called from Callstacks.getfloatfield in file "callstacks.ml", line 56, characters 30-47 -Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 +No callstack ----------- -Raised by primitive operation at Stdlib__Marshal.from_bytes in file "marshal.ml", line 66, characters 9-35 +Raised by primitive operation at Stdlib__Marshal.from_bytes in file "marshal.ml" (inlined), line 68, characters 9-35 +Called from Stdlib__Marshal.from_string in file "marshal.ml", line 74, characters 2-46 Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 62, characters 12-87 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 65, characters 30-59 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 ----------- Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 68, characters 37-43 Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 70, characters 30-49 Called from Callstacks.test in file "callstacks.ml", line 92, characters 2-10 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 110, characters 12-15 Called from Callstacks in file "callstacks.ml", line 99, characters 2-27 diff --git a/testsuite/tests/statmemprof/comballoc.byte.reference b/testsuite/tests/statmemprof/comballoc.byte.reference index 156768ae61b..9bed835f9a4 100644 --- a/testsuite/tests/statmemprof/comballoc.byte.reference +++ b/testsuite/tests/statmemprof/comballoc.byte.reference @@ -1,49 +1,40 @@ 2: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 81, characters 2-11 3: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 81, characters 2-11 4: 0.42 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 11, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 14, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f5 in file "comballoc.ml", line 18, characters 26-35 +Called from Comballoc.f12 in file "comballoc.ml", line 23, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 81, characters 2-11 2: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 82, characters 2-11 3: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 82, characters 2-11 4: 0.01 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 11, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 14, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f5 in file "comballoc.ml", line 18, characters 26-35 +Called from Comballoc.f12 in file "comballoc.ml", line 23, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 82, characters 2-11 2: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 83, characters 2-11 3: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 83, characters 2-11 4: 0.83 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 11, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 14, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f5 in file "comballoc.ml", line 18, characters 26-35 +Called from Comballoc.f12 in file "comballoc.ml", line 23, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 83, characters 2-11 OK diff --git a/testsuite/tests/statmemprof/comballoc.ml b/testsuite/tests/statmemprof/comballoc.ml index 60ca4a01233..885b021cf5f 100644 --- a/testsuite/tests/statmemprof/comballoc.ml +++ b/testsuite/tests/statmemprof/comballoc.ml @@ -1,27 +1,35 @@ (* TEST - flags = "-g" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" - ** bytecode - reference = "${test_source_directory}/comballoc.byte.reference" - ** native - reference = "${test_source_directory}/comballoc.opt.reference" + flags = "-g"; + { + reference = "${test_source_directory}/comballoc.byte.reference"; + bytecode; + }{ + reference = "${test_source_directory}/comballoc.opt.reference"; + native; + } *) -open Gc.Memprof +(* Tests that combined allocations are counted correctly by statmemprof *) -let f4 n = (n,n,n,n) +module MP = Gc.Memprof -let[@inline never] f n = - (n, (n, n, f4 n)) +(* A single 5-word allocation - header plus 4 content words *) + +let[@inline never] f5 n = (n,n,n,n) + +(* A combined 12-word allocation: 5 words, 4 words, and 3 words *) + +let[@inline never] f12 n = + (n, (n, n, f5 n)) let test sampling_rate = - let allocs = Array.make 257 0 in - let deallocs = Array.make 257 0 in - let promotes = Array.make 257 0 in - let callstacks = Array.make 257 None in - start ~callstack_size:10 ~sampling_rate - { null_tracker with + let allocs = Array.make 257 0 in (* block size -> allocated samples *) + let deallocs = Array.make 257 0 in (* block size -> minor-dealloc samples *) + let promotes = Array.make 257 0 in (* block size -> promoted samples *) + let callstacks = Array.make 257 None in (* block size -> callstack option *) + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate + { MP.null_tracker with + (* checks all allocations with a given block size have the same callstack *) alloc_minor = (fun info -> allocs.(info.size) <- allocs.(info.size) + info.n_samples; begin match callstacks.(info.size) with @@ -34,15 +42,17 @@ let test sampling_rate = promote = (fun (sz,n) -> promotes.(sz) <- promotes.(sz) + n; None); - }; + } in let iter = 100_000 in let arr = Array.make iter (0,0,0,0) in for i = 0 to Array.length arr - 1 do - let (_, (_, _, x)) = Sys.opaque_identity f i in + (* extract the 5-word alloc from a 12-word comballoc *) + let (_, (_, _, x)) = Sys.opaque_identity f12 i in arr.(i) <- x; done; Gc.minor (); - stop (); + MP.stop (); + (* use arr, so it's still alive here and is not collected *) ignore (Sys.opaque_identity arr); for i = 0 to 256 do assert (deallocs.(i) + promotes.(i) = allocs.(i)); @@ -68,24 +78,26 @@ let test sampling_rate = done let () = - List.iter test [0.42; 0.01; 0.83] + test 0.42; + test 0.01; + test 0.83 let no_callback_after_stop trigger = let stopped = ref false in let cnt = ref 0 in - start ~callstack_size:0 ~sampling_rate:1. - { null_tracker with + let _:MP.t = MP.start ~callstack_size:0 ~sampling_rate:1. + { MP.null_tracker with alloc_minor = (fun info -> assert(not !stopped); incr cnt; if !cnt > trigger then begin - stop (); + MP.stop (); stopped := true end; None); - }; - for i = 0 to 1000 do ignore (Sys.opaque_identity f i) done; + } in + for i = 0 to 1000 do ignore (Sys.opaque_identity f12 i) done; assert !stopped let () = diff --git a/testsuite/tests/statmemprof/comballoc.opt.reference b/testsuite/tests/statmemprof/comballoc.opt.reference index d557a37c0e4..9bed835f9a4 100644 --- a/testsuite/tests/statmemprof/comballoc.opt.reference +++ b/testsuite/tests/statmemprof/comballoc.opt.reference @@ -1,49 +1,40 @@ 2: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 81, characters 2-11 3: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 81, characters 2-11 4: 0.42 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 11, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 14, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f5 in file "comballoc.ml", line 18, characters 26-35 +Called from Comballoc.f12 in file "comballoc.ml", line 23, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 81, characters 2-11 2: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 82, characters 2-11 3: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 82, characters 2-11 4: 0.01 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 11, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 14, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f5 in file "comballoc.ml", line 18, characters 26-35 +Called from Comballoc.f12 in file "comballoc.ml", line 23, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 82, characters 2-11 2: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 83, characters 2-11 3: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 14, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f12 in file "comballoc.ml", line 23, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 83, characters 2-11 4: 0.83 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 11, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 14, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 39, characters 25-48 -Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 69, characters 2-35 +Raised by primitive operation at Comballoc.f5 in file "comballoc.ml", line 18, characters 26-35 +Called from Comballoc.f12 in file "comballoc.ml", line 23, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 50, characters 25-50 +Called from Comballoc in file "comballoc.ml", line 83, characters 2-11 OK diff --git a/testsuite/tests/statmemprof/custom.ml b/testsuite/tests/statmemprof/custom.ml index 41cf902ec89..2a22dd77b49 100644 --- a/testsuite/tests/statmemprof/custom.ml +++ b/testsuite/tests/statmemprof/custom.ml @@ -1,9 +1,7 @@ -(* TEST -* skip -reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -*) +(* TEST *) -open Gc.Memprof +module MP = Gc.Memprof +let () = Gc.set { (Gc.get ()) with minor_heap_size = 262144 } let bigstring_create sz = Bigarray.Array1.create Bigarray.char Bigarray.c_layout sz @@ -16,7 +14,7 @@ let test sampling_rate = let size_words = size / (Sys.word_size / 8) in let alloc = ref 0 and collect = ref 0 and promote = ref 0 in let tracker = - { null_tracker with + { MP.null_tracker with alloc_minor = (fun info -> if info.source <> Custom then None else begin @@ -27,14 +25,14 @@ let test sampling_rate = promote := !promote + ns; None); dealloc_minor = (fun ns -> collect := !collect + ns) } in - start ~sampling_rate tracker; + let _:MP.t = MP.start ~sampling_rate tracker in for i = 1 to iters do let str = Sys.opaque_identity bigstring_create size in if i mod 10 = 0 then keep := str :: !keep done; keep := []; Gc.full_major (); - stop (); + MP.stop (); assert (!alloc = !promote + !collect); let iters = float_of_int iters and size_words = float_of_int size_words in (* see comballoc.ml for notes on precision *) diff --git a/testsuite/tests/statmemprof/discard_in_callback.ml b/testsuite/tests/statmemprof/discard_in_callback.ml new file mode 100644 index 00000000000..348b2414762 --- /dev/null +++ b/testsuite/tests/statmemprof/discard_in_callback.ml @@ -0,0 +1,135 @@ +(* TEST + runtime5; + { bytecode; } + { native; } +*) + +(* Tests the effects of stopping and discarding the current profile + in an allocation callback, particularly in a combined allocation. + + This test is mainly intended to exercise the handling of tracking + entries inside statmemprof around profile discarding. Testing that + we count the right number of samples etc is of secondary + importance. *) + +module MP = Gc.Memprof + +(* A combined 7-block 33-word allocation *) + +let[@inline never] f33 n = + ((n, n, (n, n, n, (n,n,n,n,n))), (n, n, (n, n, n, (n,n,n,n,0)))) + +(* Repeatedly stop sampling and discard the profile in an allocation + callback. If `restart` is `true, start a fresh profile in the same + callback. Otherwise, start a fresh profile subsequently (not from + an allocation callback). + + Because the profile is discarded, even deallocation/promotion + callbacks are not called. + + In the native code backend, we have combined allocations. If a + single allocation callback from a combined allocation stops + sampling and discards the profile, no further allocation callbacks + from that combined allocation are called (and none of the blocks + are subsequently traced). + + In the bytecode backend, there are no combined allocations, so + that special case doesn't apply. + *) + +let discard_in_alloc restart = + let n_prof = ref 0 in (* number of profiles *) + let n_alloc = ref 0 in (* allocations in current profile *) + let allocs = ref 0 in (* number of sampled allocations *) + let words = ref 0 in (* total size of sampled allocations *) + + let tref = ref MP.null_tracker in + let pref = ref (MP.start ~sampling_rate:0.0 MP.null_tracker) in + let _ = MP.stop() in + let start () = (incr n_prof; + n_alloc := 0; + pref := (MP.start ~sampling_rate:1.0 !tref)) in + let stop () = (MP.stop (); + MP.discard (!pref)) in + + let alloc_minor (info:MP.allocation) = + (incr allocs; + incr n_alloc; + words := !words + info.size + 1; (* add 1 for header word *) + (* stop/discard profile N after N allocations *) + if (!n_alloc) >= (!n_prof) then (stop(); if restart then start()); + Some (!words)) in (* return a tracker value so entry survives *) + + (* We don't expect any other callbacks *) + let promote minor = (assert false) in + let dealloc_minor minor = (assert false) in + let dealloc_major major = (assert false) in + let alloc_major info = (assert false) in + + let tracker = { MP.alloc_minor ; + dealloc_minor ; + promote ; + alloc_major ; + dealloc_major } in + + let res = ref [] in + + tref := tracker; + start (); + res := (f33 42) :: (!res); + if not restart then start (); + res := (f33 42) :: (!res); + if not restart then start (); + res := (f33 42) :: (!res); + if not restart then start (); + res := (f33 42) :: (!res); + if restart then stop(); + Gc.minor(); + res := []; + Gc.full_major(); + + let bytecode = Sys.(backend_type == Bytecode) in + + (* Computations. Each call to f33 allocates 7 blocks of 33 words, + (sizes 6, 5, 4, 6, 5, 4, 3) plus the 3 words for the cons cell to + add the result to !res, making 8 blocks of 36 words. We do it 4 + times, so the true total allocation is 32 blocks of 144 words. + + In the bytecode backend, when restarting profiles, we see all these + allocations. + + In the bytecode backend, without restarting, we see the first + allocation of the first call to f33, the first 2 of the next call, + the first 3 of the third call, and the first 4 of the last + call. That makes 10 allocations, total size 53 words. + + In the native code backend, without restarting, we see the same + allocations as in the bytecode backend. + + In the native code backend, when restarting, we can also see the + cons cell allocations, and these account for some of the + allocations before each profile is stopped. So we see the first + allocation of the first call to f33, the first cons cell and the + first allocation of the next f33, the second cons cell and the + first 2 allocs of the third call, the third cons cell and the first + 3 allocs of the last call, and the fourth cons cell. That makes 11 + allocations, total size 50 words. + + If this were a better test, it would automatically incorporate + these calculations, rather than hard-wiring them here. But at least + I've shown my working. *) + + assert (!allocs = (if restart then (if bytecode then 4 * (7 + 1) + else 1 + 2 + 3 + 4 + 1) + else (1 + 2 + 3 + 4))); + + assert (!words = (if restart then (if bytecode + then (4 * (6 + 5 + 4 + + 6 + 5 + 4 + 3 + 3)) + else (6 + (3 + 6) + (3 + 6 + 5) + + (3 + 6 + 5 + 4) + 3)) + else (6 + (6 + 5) + (6 + 5 + 4) + (6 + 5 + 4 + 6)))); + res + +let _ = discard_in_alloc true +let _ = discard_in_alloc false diff --git a/testsuite/tests/statmemprof/exception_callback.ml b/testsuite/tests/statmemprof/exception_callback.ml index f9f02f690f7..944c7064a5a 100644 --- a/testsuite/tests/statmemprof/exception_callback.ml +++ b/testsuite/tests/statmemprof/exception_callback.ml @@ -1,30 +1,36 @@ -(* TEST - exit_status = "2" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -*) +(* TEST *) -open Gc.Memprof +(* Tests that an exception in the alloc_major callback propagates + correctly to the top level. *) -let alloc_tracker on_alloc = - { null_tracker with - alloc_minor = (fun info -> on_alloc info; None); +module MP = Gc.Memprof + +let alloc_major_tracker on_alloc = + { MP.null_tracker with alloc_major = (fun info -> on_alloc info; None); } -(* We don't want to print the backtrace. We just want to make sure the - exception is printed. - This also makes sure [Printexc] is loaded, otherwise we don't use - its uncaught exception handler. *) -let _ = Printexc.record_backtrace false +(* Run without exception, as the null test *) let () = - start ~callstack_size:10 ~sampling_rate:1. - (alloc_tracker (fun _ -> stop ())); - ignore (Sys.opaque_identity (Array.make 200 0)) + ignore (MP.start ~callstack_size:10 ~sampling_rate:1. + (alloc_major_tracker (fun _ -> ()))); + ignore (Sys.opaque_identity (Array.make 500 0)); + MP.stop(); + print_endline "Run without exception." + + +(* Run with an exception *) let _ = - start ~callstack_size:10 ~sampling_rate:1. - (alloc_tracker (fun _ -> failwith "callback failed")); - ignore (Sys.opaque_identity (Array.make 200 0)); - stop () +try + Sys.with_async_exns (fun () -> + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:1. + (alloc_major_tracker + (fun _ -> raise Sys.Break)) in + (ignore (Sys.opaque_identity (Array.make 500 0)); + MP.stop ()) + ) +with + Sys.Break -> (MP.stop(); + Printf.printf "Exception from memprof.\n") diff --git a/testsuite/tests/statmemprof/exception_callback.reference b/testsuite/tests/statmemprof/exception_callback.reference index 6371f8249e2..cbc8103b62b 100644 --- a/testsuite/tests/statmemprof/exception_callback.reference +++ b/testsuite/tests/statmemprof/exception_callback.reference @@ -1 +1,2 @@ -Fatal error: exception Failure("callback failed") +Run without exception. +Exception from memprof. diff --git a/testsuite/tests/statmemprof/exception_callback_minor.ml b/testsuite/tests/statmemprof/exception_callback_minor.ml index 0bb37782bea..be386042390 100644 --- a/testsuite/tests/statmemprof/exception_callback_minor.ml +++ b/testsuite/tests/statmemprof/exception_callback_minor.ml @@ -1,22 +1,21 @@ -(* TEST - exit_status = "2" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -*) +(* TEST *) -open Gc.Memprof +(* Tests that an exception in the alloc_minor callback propagates + correctly to the top level. *) -(* We don't want to print the backtrace. We just want to make sure the - exception is printed. - This also makes sure [Printexc] is loaded, otherwise we don't use - its uncaught exception handler. *) -let _ = Printexc.record_backtrace false +module MP = Gc.Memprof let _ = - start ~callstack_size:10 ~sampling_rate:1. - { null_tracker with - alloc_minor = (fun _ -> assert false); - alloc_major = (fun _ -> assert false); - }; - ignore (Sys.opaque_identity (ref (ref 42))); - stop () + +try + Sys.with_async_exns (fun () -> + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:1. + { MP.null_tracker with + alloc_minor = + fun _ -> raise Sys.Break } in + (ignore (Sys.opaque_identity (ref (ref 42))); + MP.stop ()) + ) +with + Sys.Break -> (MP.stop(); + Printf.printf "Exception from memprof.\n") diff --git a/testsuite/tests/statmemprof/exception_callback_minor.reference b/testsuite/tests/statmemprof/exception_callback_minor.reference index af75fbbe9b2..b8db23504e0 100644 --- a/testsuite/tests/statmemprof/exception_callback_minor.reference +++ b/testsuite/tests/statmemprof/exception_callback_minor.reference @@ -1 +1 @@ -Fatal error: exception File "exception_callback_minor.ml", line 16, characters 30-36: Assertion failed +Exception from memprof. diff --git a/testsuite/tests/statmemprof/exception_comballoc.ml b/testsuite/tests/statmemprof/exception_comballoc.ml new file mode 100644 index 00000000000..6dbf4c6991b --- /dev/null +++ b/testsuite/tests/statmemprof/exception_comballoc.ml @@ -0,0 +1,168 @@ +(* TEST *) + +(* Tests that an exception in the alloc_minor callback, during a + combined allocation, causes already-run allocation callbacks to + be reflected by deallocation callbacks. *) + +module MP = Gc.Memprof + +external runtime5 : unit -> bool = "%runtime5" + +(* Similar infrastructure to stop_start_in_callback test *) + +(* We need sets of 3-tuples of integers *) + +module Int3Tuples = +struct + type t = int * int * int + let compare (x0,y0,z0) (x1,y1,z1) = + match Stdlib.compare x0 x1 with + | 0 -> (match Stdlib.compare y0 y1 with + | 0 -> Stdlib.compare z0 z1 + | c -> c) + | c -> c +end + +module AllocSet = Set.Make(Int3Tuples) + +(* A combined 7-block 33-word allocation *) + +let[@inline never] f33 n = + ((n, n, (n, n, n, (n,n,n,n,n))), (n, n, (n, n, n, (n,n,n,n,0)))) + +(* Raise exceptions from allocation callbacks. + + In the native code backend, we have combined allocations. If a + single allocation callback from a combined allocation raises an + exception, none of the blocks in that combined allocation are + actually allocated. However, some allocation callbacks may have + already been called, before the exception is raised, so statmemprof + causes their deallocation callbacks also to be called, so that + allocation and deallocation callbacks can be matched up. + + In the bytecode backend, there are no combined allocations, so + these special cases don't apply: allocation callbacks called before + the one which raises an exception reflect actual allocations which + happened at that time, so statmemprof doesn't have to fake + corresponding deallocations. *) + +let raise_in_alloc () = + let n_alloc = ref 0 in (* number of allocations in current profile *) + let n_prof = ref 0 in (* number of profiles *) + let n_exc = ref 0 in (* number of exceptions handled *) + let excs = ref AllocSet.empty in + + (* sets of (profile count, allocation count, size), for each operation *) + let allocs = ref AllocSet.empty in + let deallocs = ref AllocSet.empty in + + let record s (p, a, sz) = s := AllocSet.add (p,a,sz) (!s) in + let dealloc_minor minor = (record deallocs minor; ()) in + let dealloc_major major = (record deallocs major; ()) in + + let alloc_minor (info:MP.allocation) = + (incr n_alloc; + let p = !n_prof in + let a = !n_alloc in + let sz = info.size + 1 in (* add 1 for header word *) + record allocs (p,a,sz); + (* stop profile N after N allocations *) + if a >= p then + (record excs (p,a,sz); + raise Sys.Break); + Some (p, a, sz)) in + + let promote minor = Some minor in + let alloc_major info = (assert false) in (* We don't expect any *) + + let tracker = { MP.alloc_minor ; + dealloc_minor ; + promote ; + alloc_major ; + dealloc_major } in + + let start () = (incr n_prof; + n_alloc := 0; + ignore (MP.start ~sampling_rate:1.0 tracker)) in + + let arr = ref [] in + let clos = Sys.opaque_identity (fun () -> + arr := (f33 42) :: (!arr)) in + + for i = 1 to 10 do + start (); + (try + Sys.with_async_exns clos + with + Sys.Break -> (incr n_exc)); + MP.stop(); + Gc.minor(); + done; + arr := []; + Gc.full_major(); + + let alloc_size = + AllocSet.fold (fun (p,a,sz) tot -> tot + sz) (!allocs) 0 in + let alloc_count = AllocSet.cardinal (!allocs) in + let dealloc_size = + AllocSet.fold (fun (p,a,sz) tot -> tot + sz) (!deallocs) 0 in + let dealloc_count = AllocSet.cardinal (!deallocs) in + + (* Every allocation callback is either raised or deallocated *) + assert (AllocSet.disjoint (!deallocs) (!excs)); + if runtime5 () then + assert (AllocSet.equal (AllocSet.union (!deallocs) (!excs)) (!allocs)) + else + (* runtime4 only makes the following weaker guarantee when + allocation callbacks raise *) + assert (AllocSet.subset (AllocSet.union (!deallocs) (!excs)) (!allocs)); + + + (* Each call to f33 would allocates 7 blocks of 33 words, + (sizes 6, 5, 4, 6, 5, 4, 3) plus the 3 words for the cons cell to + add the result to !arr, making 8 blocks of 36 words. + + So we see this behaviour, as we iterate through the loop: + i allocs exn words + 1 1 1 6 6 + 2 2 1 11 6+5 + 3 3 1 15 6+5+4 + 4 4 1 21 6+5+4+6 + 5 5 1 26 6+5+4+6+5 + 6 6 1 30 6+5+4+6+5+4 + 7 7 1 33 6+5+4+6+5+4+3 + 8 8 1 36 6+5+4+6+5+4+3+3 + 9 8 0 36 6+5+4+6+5+4+3+3 + 10 8 0 36 6+5+4+6+5+4+3+3 + + 52 8 250 total + + and of those "allocations" (most of which never actually take + place with the native code backend), the profile sees + deallocations for all except 8 (the ones for which the callbacks + raise exceptions), which add up to 36 words. + + *) + + if runtime5 () then begin + assert (dealloc_count = 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 8); + assert (alloc_count = dealloc_count + !n_exc); + + assert (dealloc_size = (0 + + 6 + + 6 + 5 + + 6 + 5 + 4 + + 6 + 5 + 4 + 6 + + 6 + 5 + 4 + 6 + 5 + + 6 + 5 + 4 + 6 + 5 + 4 + + 6 + 5 + 4 + 6 + 5 + 4 + 3 + + 6 + 5 + 4 + 6 + 5 + 4 + 3 + 3 + + 6 + 5 + 4 + 6 + 5 + 4 + 3 + 3)); + + assert (alloc_size = dealloc_size + + (6 + 5 + 4 + 6 + 5 + 4 + 3 + 3)); + end; + arr + + +let _ = raise_in_alloc () diff --git a/testsuite/tests/statmemprof/intern.ml b/testsuite/tests/statmemprof/intern.ml index bebcc3c8fff..008d445a478 100644 --- a/testsuite/tests/statmemprof/intern.ml +++ b/testsuite/tests/statmemprof/intern.ml @@ -1,23 +1,25 @@ -(* TEST - flags = "-g" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -*) +(* TEST *) -open Gc.Memprof +module MP = Gc.Memprof let alloc_tracker on_alloc = - { null_tracker with + { MP.null_tracker with alloc_minor = (fun info -> on_alloc info; None); alloc_major = (fun info -> on_alloc info; None); } -type t = I of int | II of int * int | Cons of t -let rec t_of_len = function - | len when len <= 1 -> assert false - | 2 -> I 1 - | 3 -> II (2, 3) - | len -> Cons (t_of_len (len - 2)) +(* avoiding constant folding, make a value tree consisting of n words *) + +type t = O | IIi of int | IIt of t | IIIi of int * int | IIIt of t * t +let rec t_tree k n = match n with + | len when len <= 1 -> O + | 2 -> IIi k + | 3 -> IIIi (k,k) + | 4 -> IIt (IIi k) + | 5 -> IIIt (IIi k, O) + | 6 -> IIIt (IIIi (k,k), O) + | len -> IIIt (t_tree k ((len-3)/2), t_tree k (len - 3 - (len-3)/2));; +let t_of_len n = t_tree 7 n;; let marshalled_data = Hashtbl.create 17 let[@inline never] get_marshalled_data len : t = @@ -37,6 +39,10 @@ let[@inline never] do_intern lo hi cnt keep = if not keep then root := [] done +(* `get_marshalled_data i` should allocate `i` words with source + * `Marshal`, in blocks of size 1 or 2. So `do_intern lo hi cnt _` + * should allocate (hi+lo)(hi-lo+1)/2 words. *) + let check_nosample () = Printf.printf "check_nosample\n%!"; precompute_marshalled_data 2 3000; @@ -44,9 +50,12 @@ let check_nosample () = Printf.printf "Callback called with sampling_rate = 0\n"; assert(false) in - start ~callstack_size:10 ~sampling_rate:0. (alloc_tracker fail_on_alloc); + let _:MP.t = + MP.start ~callstack_size:10 ~sampling_rate:0. + (alloc_tracker fail_on_alloc) + in do_intern 2 3000 1 false; - stop () + MP.stop () let () = check_nosample () @@ -59,7 +68,7 @@ let check_counts_full_major force_promote = let npromote = ref 0 in let ndealloc_minor = ref 0 in let ndealloc_major = ref 0 in - start ~callstack_size:10 ~sampling_rate:0.01 + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:0.01 { alloc_minor = (fun _ -> if not !enable then None @@ -78,7 +87,8 @@ let check_counts_full_major force_promote = dealloc_major = (fun _ -> incr ndealloc_major ); - }; + } + in do_intern 2 3000 1 true; enable := false; assert (!ndealloc_minor = 0 && !ndealloc_major = 0); @@ -98,7 +108,7 @@ let check_counts_full_major force_promote = assert (!nalloc_minor = !ndealloc_minor + !npromote && !ndealloc_major = !npromote + !nalloc_major) end; - stop () + MP.stop () let () = check_counts_full_major false; @@ -116,16 +126,17 @@ let check_no_nested () = () in let cb' _ = cb (); Some () in - start ~callstack_size:10 ~sampling_rate:1. + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:1. { alloc_minor = cb'; alloc_major = cb'; promote = cb'; dealloc_minor = cb; dealloc_major = cb; - }; + } + in do_intern 100 200 1 false; - stop () + MP.stop () let () = check_no_nested () @@ -133,18 +144,21 @@ let check_distrib lo hi cnt rate = Printf.printf "check_distrib %d %d %d %f\n%!" lo hi cnt rate; precompute_marshalled_data lo hi; let smp = ref 0 in - let alloc info = + let alloc (info:MP.allocation) = (* We also allocate the list constructor in the minor heap, so we filter that out. *) if info.source = Marshal then begin assert (info.size = 1 || info.size = 2); assert (info.n_samples > 0); smp := !smp + info.n_samples - end; + end + in + let _:MP.t = + MP.start ~callstack_size:10 ~sampling_rate:rate + (alloc_tracker alloc) in - start ~callstack_size:10 ~sampling_rate:rate (alloc_tracker alloc); do_intern lo hi cnt false; - stop (); + MP.stop (); (* The probability distribution of the number of samples follows a binomial distribution of parameters tot_alloc and rate. Given @@ -158,7 +172,7 @@ let check_distrib lo hi cnt rate = float tot_alloc *. (1. -. rate) > 100.); let mean = float tot_alloc *. rate in let stddev = sqrt (float tot_alloc *. rate *. (1. -. rate)) in - (* This assertion has probability to fail close to 1e-8. *) + (* This should fail approximately one time in 100,000,000 *) assert (abs_float (mean -. float !smp) <= stddev *. 5.7) let () = diff --git a/testsuite/tests/statmemprof/intern.reference b/testsuite/tests/statmemprof/intern.reference new file mode 100644 index 00000000000..d83e8d6d50e --- /dev/null +++ b/testsuite/tests/statmemprof/intern.reference @@ -0,0 +1,10 @@ +check_nosample +check_counts_full_major +check_counts_full_major +check_no_nested +check_distrib 2 3000 3 0.000010 +check_distrib 2 3000 1 0.000100 +check_distrib 2 2000 1 0.010000 +check_distrib 2 2000 1 0.900000 +check_distrib 300000 300000 20 0.100000 +OK ! diff --git a/testsuite/tests/statmemprof/lists_in_minor.ml b/testsuite/tests/statmemprof/lists_in_minor.ml index 765d4fb092b..c65d693755c 100644 --- a/testsuite/tests/statmemprof/lists_in_minor.ml +++ b/testsuite/tests/statmemprof/lists_in_minor.ml @@ -1,10 +1,9 @@ (* TEST - flags = "-g" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" + flags = "-g"; + reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634"; *) -open Gc.Memprof +module MP = Gc.Memprof let rec allocate_list accu = function | 0 -> accu @@ -12,24 +11,26 @@ let rec allocate_list accu = function let[@inline never] allocate_lists len cnt = for j = 0 to cnt-1 do - ignore (allocate_list [] len) + ignore (Sys.opaque_identity (allocate_list [] len)) done let check_distrib len cnt rate = Printf.printf "check_distrib %d %d %f\n%!" len cnt rate; + let tracked = ref 0 in let smp = ref 0 in - start ~callstack_size:10 ~sampling_rate:rate - { null_tracker with + let _:MP.t = MP.start ~callstack_size:10 ~sampling_rate:rate + { MP.null_tracker with alloc_major = (fun _ -> assert false); alloc_minor = (fun info -> assert (info.size = 2); assert (info.n_samples > 0); assert (info.source = Normal); + incr tracked; smp := !smp + info.n_samples; None); - }; + } in allocate_lists len cnt; - stop (); + MP.stop (); (* The probability distribution of the number of samples follows a binomial distribution of parameters tot_alloc and rate. Given @@ -38,22 +39,22 @@ let check_distrib len cnt rate = distribution. We compute a 1e-8 confidence interval for !smp using quantiles of the normal distribution, and check that we are in this confidence interval. *) - let tot_alloc = cnt*len*3 in - assert (float tot_alloc *. rate > 100. && - float tot_alloc *. (1. -. rate) > 100.); - let mean = float tot_alloc *. rate in - let stddev = sqrt (float tot_alloc *. rate *. (1. -. rate)) in - (* This assertion has probability to fail close to 1e-8. *) - assert (abs_float (mean -. float !smp) <= stddev *. 5.7) + let tot_alloc = float (cnt*len*3) in + assert (tot_alloc *. rate > 100. && + tot_alloc *. (1. -. rate) > 100.); + let mean = tot_alloc *. rate in + let stddev = sqrt (tot_alloc *. rate *. (1. -. rate)) in + (* This should fail approximately one time in 100,000,000 *) + assert (abs_float (mean -. float !smp) <= stddev *. 5.7) let () = - check_distrib 10 100000 0.01; + check_distrib 10 1000000 0.01; check_distrib 1000000 10 0.00001; - check_distrib 100000 10 0.0001; - check_distrib 100000 10 0.001; - check_distrib 100000 10 0.01; - check_distrib 10000 10 0.1; - check_distrib 10000 10 0.9 + check_distrib 1000000 10 0.0001; + check_distrib 1000000 10 0.001; + check_distrib 1000000 10 0.01; + check_distrib 100000 10 0.1; + check_distrib 100000 10 0.9 let () = Printf.printf "OK !\n" diff --git a/testsuite/tests/statmemprof/lists_in_minor.reference b/testsuite/tests/statmemprof/lists_in_minor.reference index f03425c6d65..11cfe0ca128 100644 --- a/testsuite/tests/statmemprof/lists_in_minor.reference +++ b/testsuite/tests/statmemprof/lists_in_minor.reference @@ -1,8 +1,8 @@ -check_distrib 10 100000 0.010000 +check_distrib 10 1000000 0.010000 check_distrib 1000000 10 0.000010 -check_distrib 100000 10 0.000100 -check_distrib 100000 10 0.001000 -check_distrib 100000 10 0.010000 -check_distrib 10000 10 0.100000 -check_distrib 10000 10 0.900000 +check_distrib 1000000 10 0.000100 +check_distrib 1000000 10 0.001000 +check_distrib 1000000 10 0.010000 +check_distrib 100000 10 0.100000 +check_distrib 100000 10 0.900000 OK ! diff --git a/testsuite/tests/statmemprof/minor_heap_edge.ml b/testsuite/tests/statmemprof/minor_heap_edge.ml new file mode 100644 index 00000000000..c402a0fc92e --- /dev/null +++ b/testsuite/tests/statmemprof/minor_heap_edge.ml @@ -0,0 +1,56 @@ +(* TEST *) + +module MP = Gc.Memprof + +(* This is a stress-test for weird behaviour when the minor heap is just about to + overflow, which is easier to trigger when the minor heap is small *) +let () = + Gc.set { (Gc.get ()) with minor_heap_size = 2000 } + +let f () = + let n_allocated = ref 0 in + let n_promoted = ref 0 in + let n_deallocated = ref 0 in + let _:MP.t = + let alloc_minor _info = + incr n_allocated; + for i = 1 to Random.int 500 do + ignore (Sys.opaque_identity (ref 42)) + done; + Some () + in + let promote () = + incr n_promoted; + None + in + let dealloc_minor () = + incr n_deallocated; + () + in + MP.start ~callstack_size:0 ~sampling_rate:1. + { MP.null_tracker with alloc_minor; promote; dealloc_minor } + in + let r = ref 42 in + let s = ref [] in + for i = 1 to 10_000 do + incr r; + (* This is a largeish, combined, non-constant allocation, + so goes through caml_memprof_track_young *) + s := [| 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; + 0; 0; 0; 0; 0; 0; 0; 0; 0; !r; |] :: !s; + done; + (* make sure all values are promoted *) + Gc.full_major (); + ignore (Sys.opaque_identity !s); + (* make sure all values are collected *) + s := []; + Gc.full_major (); + ignore (Sys.opaque_identity !s); + MP.stop (); + Printf.printf "%d %d %d\n" !n_allocated !n_promoted !n_deallocated; + () + +let () = f () diff --git a/testsuite/tests/statmemprof/minor_heap_edge.reference b/testsuite/tests/statmemprof/minor_heap_edge.reference new file mode 100644 index 00000000000..0633557342c --- /dev/null +++ b/testsuite/tests/statmemprof/minor_heap_edge.reference @@ -0,0 +1 @@ +20000 20000 0 diff --git a/testsuite/tests/statmemprof/minor_no_postpone.ml b/testsuite/tests/statmemprof/minor_no_postpone.ml index 21c8bfb2447..0c7eaf003a6 100644 --- a/testsuite/tests/statmemprof/minor_no_postpone.ml +++ b/testsuite/tests/statmemprof/minor_no_postpone.ml @@ -1,39 +1,36 @@ (* TEST - modules = "minor_no_postpone_stub.c" - * skip - reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" + modules = "minor_no_postpone_stub.c"; *) -open Gc.Memprof +module MP = Gc.Memprof -let notify_minor ref_ok ref_done = - { null_tracker with +let profile ref_ok ref_done = + MP.start ~callstack_size:0 ~sampling_rate:1. + { MP.null_tracker with alloc_minor = (fun _ -> assert !ref_ok; ref_done := true; None); - } + } let () = let callback_ok = ref true in let callback_done = ref false in - start ~callstack_size:0 ~sampling_rate:1. - (notify_minor callback_ok callback_done); + let _:MP.t = profile callback_ok callback_done in ignore (Sys.opaque_identity (ref 0)); assert(!callback_done); callback_ok := false; - stop () + MP.stop () external alloc_stub : unit -> unit ref = "alloc_stub" let () = let callback_ok = ref false in let callback_done = ref false in - start ~callstack_size:0 ~sampling_rate:1. - (notify_minor callback_ok callback_done); + let _:MP.t = profile callback_ok callback_done in ignore (Sys.opaque_identity (alloc_stub ())); assert(not !callback_done); callback_ok := true; ignore (Sys.opaque_identity (ref ())); assert(!callback_done); - stop () + MP.stop () diff --git a/testsuite/tests/statmemprof/moved_while_blocking.ml b/testsuite/tests/statmemprof/moved_while_blocking.ml index bb8dfc9848e..c8d15bbe1a7 100644 --- a/testsuite/tests/statmemprof/moved_while_blocking.ml +++ b/testsuite/tests/statmemprof/moved_while_blocking.ml @@ -1,33 +1,90 @@ (* TEST -* hassysthreads -include systhreads -* skip -reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -** bytecode -** native + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) +(* A few triggers, to control timing of events between threads. + `await a` will wait until after `set a` has been called. *) + let t2_begin = Atomic.make false let t2_promoting = Atomic.make false let t2_finish_promote = Atomic.make false let t2_done = Atomic.make false let t2_quit = Atomic.make false + +(* `await a` waits for the trigger `a` *) let await a = while not (Atomic.get a) do Thread.yield () done + +(* `set a` pulls the trigger `a` *) let set a = Atomic.set a true (* no-alloc printing to stdout *) let say msg = - Unix.write Unix.stdout (Bytes.unsafe_of_string msg) 0 (String.length msg) |> ignore + Unix.write Unix.stdout (Bytes.unsafe_of_string msg) 0 (String.length msg) + |> ignore + +(* + +The intended sequence of events in this test is as follows: + +- thread 1 spawns thread 2 to run thread_fn. + +- thread 2 starts thread_fn, waits for t2_begin. + +- thread 1 starts a profile, sampling at 100%, which logs allocations and + has a complex "promote" callback which hands control flow back and + forth between threads. +- thread 1 allocates a large object (creating tracking entry 0), then + sets t2_begin and awaits t2_promoting. The alloc_major callback is run at + some point here, so tracking entry 0 now has no pending callbacks. + +- thread 2 wakes on t2_begin. +- thread 2 allocates a small object, a ref cell, on the minor heap. This + creates tracking entry 1, and runs the alloc_minor callback. +- thread 2 commands a minor collection. +- In the minor collection, the small object is promoted. Tracking entry 1 is + now marked as promoted and having a runnable callback. +- The promotion callback runs (thread 2 runs this, because thread 1 + is still waiting for t2_promoting). In the promotion callback, t2_promoting + is set, and then t2_finish_promote is awaited. + +- thread 1 wakes on t2_promoting, clears its root, and sets off a full + major collection which should collect thread 1's large block. The + after-major-GC function runs, marking tracking entry 0 as deallocated. +- thread 1 then sets t2_finish_promote and awaits t2_done. + +- thread 2 wakes on t2_finish_promote, finishes its promotion callback, then + returns to its main flow of control, clearing the reference to its small + block, setting t2_done and awaiting t2_quit. + +- thread 1 wakes on t2:done, does another full collection, which should + free the small block from thread 2 and mark its tracking entry for a dealloc + callback. Then it stops the profile, sets t2_quit, and joins thread 2. + +- thread 2 wakes on t2_quit and exits. + +- thread 1 joins thread 2 and exits. + +Note that the implementation of threads in the bytecode backend +performs some allocations of its own. TODO: update these to use +CAML_DONT_TRACK to avoid statmemprof. For now, I have tweaked the test +so that it doesn't track minor allocations of sizes larger than 1. + +*) let static_ref = ref 0 let global = ref static_ref let thread_fn () = await t2_begin; say "T2: alloc\n"; - let r = ref 0 in - global := r; + global := ref 0; say "T2: minor GC\n"; Gc.minor (); global := static_ref; @@ -45,14 +102,12 @@ let empty_big () = big := [| |] let () = let th = Thread.create thread_fn () in - Gc.Memprof.(start ~sampling_rate:1. + let _:Gc.Memprof.t = Gc.Memprof.(start ~sampling_rate:1. { null_tracker with - alloc_minor = (fun _ -> - say " minor alloc\n"; - Some ()); - alloc_major = (fun _ -> - say " major alloc\n"; - Some "major block\n"); + alloc_minor = (fun info -> if info.size = 1 then + (say " minor alloc\n"; Some ()) + else None); + alloc_major = (fun _ -> say " major alloc\n"; Some "major block\n"); promote = (fun () -> say " promoting...\n"; set t2_promoting; @@ -60,7 +115,8 @@ let () = say " ...done promoting\n"; Some "promoted block\n"); dealloc_major = (fun msg -> - say " major dealloc: "; say msg) }); + say " major dealloc: "; say msg)}) + in say "T1: alloc\n"; fill_big (); set t2_begin; diff --git a/testsuite/tests/statmemprof/start_stop.ml b/testsuite/tests/statmemprof/start_stop.ml new file mode 100644 index 00000000000..01fcbcfebed --- /dev/null +++ b/testsuite/tests/statmemprof/start_stop.ml @@ -0,0 +1,110 @@ +(* TEST + runtime5; + { bytecode; } + { native; } +*) + +(* Tests various valid and invalid orderings of start/stop/discard +statmemprof calls. Doesn't test any callbacks or count any allocations, +etc.*) + +module MP = Gc.Memprof + +let prof () = MP.start ~sampling_rate:1. MP.null_tracker + +(* Null test: start/stop/discard *) +let _ = + let profile = prof () in + MP.stop (); + MP.discard profile; + print_endline "Null test." + +(* Stop without starting *) +let _ = try + MP.stop () +with + Failure s -> Printf.printf "Stop without starting fails with \"%s\"\n" s + +(* Second start without stopping. *) +let _ = + try + Fun.protect ~finally:MP.stop + (fun () -> (ignore (prof ()); + ignore (prof ()))) + with + Failure s -> Printf.printf "Start without stopping fails with \"%s\"\n" s + +(* Discard without stopping. *) +let _ = + try + Fun.protect ~finally:MP.stop + (fun () -> MP.discard (prof())) + with + Failure s -> Printf.printf "Discard without stopping fails with \"%s\"\n" s + +(* Discard same profile twice. *) +let _ = + let profile = prof () in + MP.stop (); + MP.discard profile; + try + MP.discard profile; + with + Failure s -> Printf.printf "Second discard fails with \"%s\"\n" s + +(* Double profile *) +let _ = + ignore (prof ()); + MP.stop (); + ignore (prof ()); + MP.stop (); + print_endline "Double profile." + +(* Double profile with intervening discard *) +let _ = + let prof1 = prof () in + MP.stop (); + MP.discard prof1; + ignore (prof ()); + MP.stop (); + print_endline "Double profile with single discard." + +(* Double profile, both discarded *) +let _ = + let prof1 = prof () in + MP.stop (); + MP.discard prof1; + let prof2 = prof () in + MP.stop (); + MP.discard prof2; + print_endline "Double profile, discarding both." + +(* Double profile, discard both at end *) +let _ = + let prof1 = prof () in + MP.stop (); + let prof2 = prof () in + MP.stop (); + MP.discard prof1; + MP.discard prof2; + print_endline "Double profile, discarding both at end." + +(* Double profile, discard in reverse order *) +let _ = + let prof1 = prof () in + MP.stop (); + let prof2 = prof () in + MP.stop (); + MP.discard prof2; + MP.discard prof1; + print_endline "Double profile, discarding in reverse order." + +(* Double profile, discard first while second is sampling *) +let _ = + let prof1 = prof () in + MP.stop (); + let prof2 = prof () in + MP.discard prof1; + MP.stop (); + MP.discard prof2; + print_endline "Discarding old profile while sampling." diff --git a/testsuite/tests/statmemprof/start_stop.reference b/testsuite/tests/statmemprof/start_stop.reference new file mode 100644 index 00000000000..cd51e19d471 --- /dev/null +++ b/testsuite/tests/statmemprof/start_stop.reference @@ -0,0 +1,11 @@ +Null test. +Stop without starting fails with "Gc.Memprof.stop: no profile running." +Start without stopping fails with "Gc.Memprof.start: already started." +Discard without stopping fails with "Gc.Memprof.discard: profile not stopped." +Second discard fails with "Gc.Memprof.discard: profile already discarded." +Double profile. +Double profile with single discard. +Double profile, discarding both. +Double profile, discarding both at end. +Double profile, discarding in reverse order. +Discarding old profile while sampling. diff --git a/testsuite/tests/statmemprof/stop_start_in_callback.ml b/testsuite/tests/statmemprof/stop_start_in_callback.ml new file mode 100644 index 00000000000..1f6b15fb17d --- /dev/null +++ b/testsuite/tests/statmemprof/stop_start_in_callback.ml @@ -0,0 +1,178 @@ +(* TEST + runtime5; + { bytecode; } + { native; } +*) + +(* Tests the effects of stopping and starting profiles in allocation + callbacks, particularly in combined allocations. + + This also tests that promotion and deallocation callbacks from old + profiles get called correctly even after the profile has stopped + sampling. *) + +module MP = Gc.Memprof + +(* We need sets of 3-tuples of integers *) + +module Int3Tuples = +struct + type t = int * int * int + let compare (x0,y0,z0) (x1,y1,z1) = + match Stdlib.compare x0 x1 with + | 0 -> (match Stdlib.compare y0 y1 with + | 0 -> Stdlib.compare z0 z1 + | c -> c) + | c -> c +end + +module AllocSet = Set.Make(Int3Tuples) + +(* A combined 7-block 33-word allocation *) + +let[@inline never] f33 n = + ((n, n, (n, n, n, (n,n,n,n,n))), (n, n, (n, n, n, (n,n,n,n,0)))) + +(* Repeatedly stop sampling from an allocation callback. If `restart` + is `true, start a fresh profile in the same callback. Otherwise, + start a fresh profile subsequently (not from an allocation + callback). + + In the native code backend, we have combined allocations. If a + single allocation callback from a combined allocation stops + sampling and starts a new profile, blocks from that combined + allocation are not subsequently traced. + + However, blocks whose allocation callbacks have already been called + do have deallocation callbacks also called, so that allocation and + deallocation callbacks can be matched up. + + If an allocation callback from a combined allocation stops + sampling, but doesn't start a new profile, the behaviour is much + simpler: blocks whose allocation callbacks have already been called + are tracked as usual. + + In the bytecode backend, there are no combined allocations, so + these special cases don't apply. + *) + +let stop_in_alloc restart = + let n_alloc = ref 0 in (* number of allocations in current profile *) + let n_prof = ref 0 in (* number of profiles *) + + (* sets of (profile count, allocation count, size), for each operation *) + let allocs = ref AllocSet.empty in + let promotes = ref AllocSet.empty in + let deallocs_minor = ref AllocSet.empty in + let deallocs_major = ref AllocSet.empty in + + let record s (p, a, sz) = s := AllocSet.add (p,a,sz) (!s) in + let promote minor = (record promotes minor; Some minor) in + let dealloc_minor minor = (record deallocs_minor minor; ()) in + let dealloc_major major = (record deallocs_major major; ()) in + + let tref = ref MP.null_tracker in + let start () = (incr n_prof; + n_alloc := 0; + ignore (MP.start ~sampling_rate:1.0 !tref)) in + + let alloc_minor (info:MP.allocation) = + (incr n_alloc; + let p = !n_prof in + let a = !n_alloc in + let sz = info.size + 1 in (* add 1 for header word *) + record allocs (p,a,sz); + (* stop profile N after N allocations *) + if a >= p then + (MP.stop (); + if restart then start()) + else (); + Some (p, a, sz)) in + + let alloc_major info = (assert false) in (* We don't expect any *) + + let tracker = { MP.alloc_minor ; + dealloc_minor ; + promote ; + alloc_major ; + dealloc_major } in + let arr = ref [] in + + tref := tracker; + start (); + + arr := (f33 42) :: (!arr); + if not restart then start (); + arr := (f33 42) :: (!arr); + if not restart then start (); + arr := (f33 42) :: (!arr); + if not restart then start (); + arr := (f33 42) :: (!arr); + if restart then MP.stop(); + Gc.minor(); + arr := []; + Gc.full_major(); + + let alloc_size = + AllocSet.fold (fun (p,a,sz) tot -> tot + sz) (!allocs) 0 in + let alloc_count = AllocSet.cardinal (!allocs) in + let bytecode = Sys.(backend_type == Bytecode) in + + (* Everything promoted is then dealloc'ed from the major heap *) + assert (AllocSet.subset (!promotes) (!deallocs_major)); + + (* Everything deallocated was previously allocated *) + assert (AllocSet.subset (!deallocs_minor) (!allocs)); + assert (AllocSet.subset (!deallocs_major) (!allocs)); + + (* Each block is only deallocated from one heap *) + assert (AllocSet.disjoint (!deallocs_minor) (!deallocs_major)); + + (* Every allocated block is deallocated somewhere *) + assert (AllocSet.equal (AllocSet.union (!deallocs_minor) (!deallocs_major)) + (!allocs)); + + (* Computations. Each call to f33 allocates 7 blocks of 33 words, + (sizes 6, 5, 4, 6, 5, 4, 3) plus the 3 words for the cons cell to + add the result to !arr, making 8 blocks of 36 words. We do it 4 + times, so the true total allocation is 32 blocks of 144 words. + + In the bytecode backend, when restarting profiles, we see all these + allocations. + + In the bytecode backend, without restarting, we see the first + allocation of the first call to f33, the first 2 of the next call, + the first 3 of the third call, and the first 4 of the last + call. That makes 10 allocations, total size 53 words. + + In the native code backend, without restarting, we see the same + allocations as in the bytecode backend. + + In the native code backend, when restarting, we can also see the + cons cell allocations, and these account for some of the + allocations before each profile is stopped. So we see the first + allocation of the first call to f33, the first cons cell and the + first allocation of the next f33, the second cons cell and the + first 2 allocs of the third call, the third cons cell and the first + 3 allocs of the last call, and the fourth cons cell. That makes 11 + allocations, total size 50 words. + + If this were a better test, it would automatically incorporate + these calculations, rather than hard-wiring them here. But at least + I've shown my working. *) + + assert (alloc_count = (if restart then (if bytecode then 4 * (7 + 1) + else 1 + 2 + 3 + 4 + 1) + else (1 + 2 + 3 + 4))); + + assert (alloc_size = (if restart then (if bytecode + then (4 * (6 + 5 + 4 + + 6 + 5 + 4 + 3 + 3)) + else (6 + (3 + 6) + (3 + 6 + 5) + + (3 + 6 + 5 + 4) + 3)) + else (6 + (6 + 5) + (6 + 5 + 4) + (6 + 5 + 4 + 6)))); + arr + + +let _ = stop_in_alloc true +let _ = stop_in_alloc false diff --git a/testsuite/tests/statmemprof/thread_exit_in_callback.ml b/testsuite/tests/statmemprof/thread_exit_in_callback.ml index 28e2aabb8b9..9bd0228f829 100644 --- a/testsuite/tests/statmemprof/thread_exit_in_callback.ml +++ b/testsuite/tests/statmemprof/thread_exit_in_callback.ml @@ -1,28 +1,31 @@ (* TEST -* hassysthreads -include systhreads -* skip -reason = "port stat-mem-prof : https://github.com/ocaml/ocaml/pull/8634" -** bytecode -** native + reason = "Thread.exit from a Memprof callback is a fatal error under flambda-backend"; + skip; + include systhreads; + hassysthreads; + { + bytecode; + }{ + native; + } *) +(* Tests statmemprof behaviour when a callback terminates its thread. + The expected behaviour is that the thread exits, but sampling + continues in other threads of the same domain. Note that this test + doesn't currently test that sampling continues! *) + let _ = let main_thread = Thread.id (Thread.self ()) in - Gc.Memprof.(start ~callstack_size:10 ~sampling_rate:1. + let _:Gc.Memprof.t = Gc.Memprof.(start ~callstack_size:10 ~sampling_rate:1. { null_tracker with alloc_minor = fun _ -> if Thread.id (Thread.self ()) <> main_thread then - Thread.exit (); - None }); + raise Thread.Exit; + None }) + in let t = Thread.create (fun () -> ignore (Sys.opaque_identity (ref 1)); assert false) () in Thread.join t; Gc.Memprof.stop () - -let _ = - Gc.Memprof.(start ~callstack_size:10 ~sampling_rate:1. - { null_tracker with alloc_minor = fun _ -> Thread.exit (); None }); - ignore (Sys.opaque_identity (ref 1)); - assert false diff --git a/testsuite/tests/syntactic-arity/alloc.compilers.reference b/testsuite/tests/syntactic-arity/alloc.compilers.reference new file mode 100644 index 00000000000..a904b12921f --- /dev/null +++ b/testsuite/tests/syntactic-arity/alloc.compilers.reference @@ -0,0 +1,6 @@ +File "alloc.ml", line 34, characters 33-37: +34 | let dont_warn_with_partial_match None x = x + ^^^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +Some _ diff --git a/testsuite/tests/syntactic-arity/alloc.ml b/testsuite/tests/syntactic-arity/alloc.ml new file mode 100644 index 00000000000..2af4c2cbfe8 --- /dev/null +++ b/testsuite/tests/syntactic-arity/alloc.ml @@ -0,0 +1,27 @@ +(* TEST + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + run; + check-program-output; +*) + +type a = { mutable a : int } + +let mutable_pat1 {a} b = a + b + +let mutable_pat2 b {a} = b + a + +let measure name f = + let a = {a = 1} in + let b = 2 in + let before = Gc.minor_words () in + let (_ : int) = f ~a ~b in + let after = Gc.minor_words () in + let alloc = int_of_float (after -. before) in + match alloc with + | 0 -> Printf.printf "%S doesn't allocate\n" name + | _ -> Printf.printf "%S allocates\n" name + +let () = + measure "mutable_pat1" (fun ~a ~b -> mutable_pat1 a b); + measure "mutable_pat2" (fun ~a ~b -> mutable_pat2 b a) diff --git a/testsuite/tests/syntactic-arity/alloc.reference b/testsuite/tests/syntactic-arity/alloc.reference new file mode 100644 index 00000000000..bc584bafe08 --- /dev/null +++ b/testsuite/tests/syntactic-arity/alloc.reference @@ -0,0 +1,2 @@ +"mutable_pat1" doesn't allocate +"mutable_pat2" doesn't allocate diff --git a/testsuite/tests/syntactic-arity/flambda_kind.ml b/testsuite/tests/syntactic-arity/flambda_kind.ml new file mode 100644 index 00000000000..6ec03e6771e --- /dev/null +++ b/testsuite/tests/syntactic-arity/flambda_kind.ml @@ -0,0 +1,25 @@ +(* TEST + flambda2; + native; +*) + +(* This is a regression test, see PR #2471 in ocaml-flambda/flambda-backend *) + +[@@@ocaml.flambda_o3] + +type _ value = + | Int : int value + | Float : float value + +let[@inline never] get (type a) : a value -> a = function + | Int -> 3 + | Float -> 3. + +let[@inline] update (type a) (v : a value) (x : a) : a = + match v with + | Int -> x + 1 + | Float -> x +. 1. + +let run x = update x (get x) + +let (_ : float) = run Float diff --git a/testsuite/tests/syntactic-arity/max_arity.compilers.reference b/testsuite/tests/syntactic-arity/max_arity.compilers.reference new file mode 100644 index 00000000000..ba289bd0370 --- /dev/null +++ b/testsuite/tests/syntactic-arity/max_arity.compilers.reference @@ -0,0 +1,5 @@ +File "max_arity.ml", line 154, characters 8-12: +154 | let _ = f ();; + ^^^^ +Warning 5 [ignored-partial-application]: this function application is partial, +maybe some arguments are missing. diff --git a/testsuite/tests/syntactic-arity/max_arity.ml b/testsuite/tests/syntactic-arity/max_arity.ml new file mode 100644 index 00000000000..6ced3ef98e0 --- /dev/null +++ b/testsuite/tests/syntactic-arity/max_arity.ml @@ -0,0 +1,168 @@ +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + +*) + +(* Observe a case where a function's arity is a different notion + than native code arity (i.e. the number of arguments required + to enter the "fast path" where arguments are passed in registers/in + the argument buffer). + + The max native code arity is 128, but the side-effects here don't run + until after all 133 arguments are provided. + *) + +let f + ?x1:(_ = failwith "1") + ?x2:(_ = failwith "2") + ?x3:(_ = failwith "3") + ?x4:(_ = failwith "4") + ?x5:(_ = failwith "5") + ?x6:(_ = failwith "6") + ?x7:(_ = failwith "7") + ?x8:(_ = failwith "8") + ?x9:(_ = failwith "9") + ?x10:(_ = failwith "10") + ?x11:(_ = failwith "11") + ?x12:(_ = failwith "12") + ?x13:(_ = failwith "13") + ?x14:(_ = failwith "14") + ?x15:(_ = failwith "15") + ?x16:(_ = failwith "16") + ?x17:(_ = failwith "17") + ?x18:(_ = failwith "18") + ?x19:(_ = failwith "19") + ?x20:(_ = failwith "20") + ?x21:(_ = failwith "21") + ?x22:(_ = failwith "22") + ?x23:(_ = failwith "23") + ?x24:(_ = failwith "24") + ?x25:(_ = failwith "25") + ?x26:(_ = failwith "26") + ?x27:(_ = failwith "27") + ?x28:(_ = failwith "28") + ?x29:(_ = failwith "29") + ?x30:(_ = failwith "30") + ?x31:(_ = failwith "31") + ?x32:(_ = failwith "32") + ?x33:(_ = failwith "33") + ?x34:(_ = failwith "34") + ?x35:(_ = failwith "35") + ?x36:(_ = failwith "36") + ?x37:(_ = failwith "37") + ?x38:(_ = failwith "38") + ?x39:(_ = failwith "39") + ?x40:(_ = failwith "40") + ?x41:(_ = failwith "41") + ?x42:(_ = failwith "42") + ?x43:(_ = failwith "43") + ?x44:(_ = failwith "44") + ?x45:(_ = failwith "45") + ?x46:(_ = failwith "46") + ?x47:(_ = failwith "47") + ?x48:(_ = failwith "48") + ?x49:(_ = failwith "49") + ?x50:(_ = failwith "50") + ?x51:(_ = failwith "51") + ?x52:(_ = failwith "52") + ?x53:(_ = failwith "53") + ?x54:(_ = failwith "54") + ?x55:(_ = failwith "55") + ?x56:(_ = failwith "56") + ?x57:(_ = failwith "57") + ?x58:(_ = failwith "58") + ?x59:(_ = failwith "59") + ?x60:(_ = failwith "60") + ?x61:(_ = failwith "61") + ?x62:(_ = failwith "62") + ?x63:(_ = failwith "63") + ?x64:(_ = failwith "64") + ?x65:(_ = failwith "65") + ?x66:(_ = failwith "66") + ?x67:(_ = failwith "67") + ?x68:(_ = failwith "68") + ?x69:(_ = failwith "69") + ?x70:(_ = failwith "70") + ?x71:(_ = failwith "71") + ?x72:(_ = failwith "72") + ?x73:(_ = failwith "73") + ?x74:(_ = failwith "74") + ?x75:(_ = failwith "75") + ?x76:(_ = failwith "76") + ?x77:(_ = failwith "77") + ?x78:(_ = failwith "78") + ?x79:(_ = failwith "79") + ?x80:(_ = failwith "80") + ?x81:(_ = failwith "81") + ?x82:(_ = failwith "82") + ?x83:(_ = failwith "83") + ?x84:(_ = failwith "84") + ?x85:(_ = failwith "85") + ?x86:(_ = failwith "86") + ?x87:(_ = failwith "87") + ?x88:(_ = failwith "88") + ?x89:(_ = failwith "89") + ?x90:(_ = failwith "90") + ?x91:(_ = failwith "91") + ?x92:(_ = failwith "92") + ?x93:(_ = failwith "93") + ?x94:(_ = failwith "94") + ?x95:(_ = failwith "95") + ?x96:(_ = failwith "96") + ?x97:(_ = failwith "97") + ?x98:(_ = failwith "98") + ?x99:(_ = failwith "99") + ?x100:(_ = failwith "100") + ?x101:(_ = failwith "101") + ?x102:(_ = failwith "102") + ?x103:(_ = failwith "103") + ?x104:(_ = failwith "104") + ?x105:(_ = failwith "105") + ?x106:(_ = failwith "106") + ?x107:(_ = failwith "107") + ?x108:(_ = failwith "108") + ?x109:(_ = failwith "109") + ?x110:(_ = failwith "110") + ?x111:(_ = failwith "111") + ?x112:(_ = failwith "112") + ?x113:(_ = failwith "113") + ?x114:(_ = failwith "114") + ?x115:(_ = failwith "115") + ?x116:(_ = failwith "116") + ?x117:(_ = failwith "117") + ?x118:(_ = failwith "118") + ?x119:(_ = failwith "119") + ?x120:(_ = failwith "120") + ?x121:(_ = failwith "121") + ?x122:(_ = failwith "122") + ?x123:(_ = failwith "123") + ?x124:(_ = failwith "124") + ?x125:(_ = failwith "125") + ?x126:(_ = failwith "126") + ?x127:(_ = failwith "127") + ?x128:(_ = failwith "128") + ?x129:(_ = failwith "129") + ?x130:(_ = failwith "130") + ?x131:(_ = failwith "131") + () + () = ();; + +let _ = f ();; + +print_endline "f (): No exception.";; + +try f () () with +| _ -> print_endline "f () (): Exception." +;; + +(* TEST + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + check-ocamlopt.byte-output; + run; + check-program-output; +*) diff --git a/testsuite/tests/syntactic-arity/max_arity.reference b/testsuite/tests/syntactic-arity/max_arity.reference new file mode 100644 index 00000000000..7db047ddd3e --- /dev/null +++ b/testsuite/tests/syntactic-arity/max_arity.reference @@ -0,0 +1,2 @@ +f (): No exception. +f () (): Exception. diff --git a/testsuite/tests/syntactic-arity/max_arity_locals.compilers.reference b/testsuite/tests/syntactic-arity/max_arity_locals.compilers.reference index bdbef2a14b4..d46b183415e 100644 --- a/testsuite/tests/syntactic-arity/max_arity_locals.compilers.reference +++ b/testsuite/tests/syntactic-arity/max_arity_locals.compilers.reference @@ -1,914 +1,433 @@ -(seq - (let - (no_local_params/264 = - (function {nlocal = 0} x1/266 x2/267 x3/268 x4/269 x5/270 x6/271 - x7/272 x8/273 x9/274 x10/275 x11/276 x12/277 x13/278 x14/279 x15/280 - x16/281 x17/282 x18/283 x19/284 x20/285 x21/286 x22/287 x23/288 - x24/289 x25/290 x26/291 x27/292 x28/293 x29/294 x30/295 x31/296 - x32/297 x33/298 x34/299 x35/300 x36/301 x37/302 x38/303 x39/304 - x40/305 x41/306 x42/307 x43/308 x44/309 x45/310 x46/311 x47/312 - x48/313 x49/314 x50/315 x51/316 x52/317 x53/318 x54/319 x55/320 - x56/321 x57/322 x58/323 x59/324 x60/325 x61/326 x62/327 x63/328 - x64/329 x65/330 x66/331 x67/332 x68/333 x69/334 x70/335 x71/336 - x72/337 x73/338 x74/339 x75/340 x76/341 x77/342 x78/343 x79/344 - x80/345 x81/346 x82/347 x83/348 x84/349 x85/350 x86/351 x87/352 - x88/353 x89/354 x90/355 x91/356 x92/357 x93/358 x94/359 x95/360 - x96/361 x97/362 x98/363 x99/364 x100/365 x101/366 x102/367 x103/368 - x104/369 x105/370 x106/371 x107/372 x108/373 x109/374 x110/375 - x111/376 x112/377 x113/378 x114/379 x115/380 x116/381 x117/382 - x118/383 x119/384 x120/385 x121/386 x122/387 x123/388 x124/389 - x125/390 x126/391 - (function {nlocal = 0} x127/392 x128/393 x129/394 x130/395 x131/396 - : int 0))) - (setfield_ptr(root-init) 0 (global Max_arity_locals!) - no_local_params/264)) - (let - (no_local_params__local_returning/397 = - (function {nlocal = 0} x1/399 x2/400 x3/401 x4/402 x5/403 x6/404 - x7/405 x8/406 x9/407 x10/408 x11/409 x12/410 x13/411 x14/412 x15/413 - x16/414 x17/415 x18/416 x19/417 x20/418 x21/419 x22/420 x23/421 - x24/422 x25/423 x26/424 x27/425 x28/426 x29/427 x30/428 x31/429 - x32/430 x33/431 x34/432 x35/433 x36/434 x37/435 x38/436 x39/437 - x40/438 x41/439 x42/440 x43/441 x44/442 x45/443 x46/444 x47/445 - x48/446 x49/447 x50/448 x51/449 x52/450 x53/451 x54/452 x55/453 - x56/454 x57/455 x58/456 x59/457 x60/458 x61/459 x62/460 x63/461 - x64/462 x65/463 x66/464 x67/465 x68/466 x69/467 x70/468 x71/469 - x72/470 x73/471 x74/472 x75/473 x76/474 x77/475 x78/476 x79/477 - x80/478 x81/479 x82/480 x83/481 x84/482 x85/483 x86/484 x87/485 - x88/486 x89/487 x90/488 x91/489 x92/490 x93/491 x94/492 x95/493 - x96/494 x97/495 x98/496 x99/497 x100/498 x101/499 x102/500 x103/501 - x104/502 x105/503 x106/504 x107/505 x108/506 x109/507 x110/508 - x111/509 x112/510 x113/511 x114/512 x115/513 x116/514 x117/515 - x118/516 x119/517 x120/518 x121/519 x122/520 x123/521 x124/522 - x125/523 x126/524 - (function {nlocal = 1} x127/525 x128/526 x129/527 x130/528 x131/529 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/399 - x2/400)))) - (setfield_ptr(root-init) 1 (global Max_arity_locals!) - no_local_params__local_returning/397)) - (let - (local_param_after_split/530 = - (function {nlocal = 0} x1/532 x2/533 x3/534 x4/535 x5/536 x6/537 - x7/538 x8/539 x9/540 x10/541 x11/542 x12/543 x13/544 x14/545 x15/546 - x16/547 x17/548 x18/549 x19/550 x20/551 x21/552 x22/553 x23/554 - x24/555 x25/556 x26/557 x27/558 x28/559 x29/560 x30/561 x31/562 - x32/563 x33/564 x34/565 x35/566 x36/567 x37/568 x38/569 x39/570 - x40/571 x41/572 x42/573 x43/574 x44/575 x45/576 x46/577 x47/578 - x48/579 x49/580 x50/581 x51/582 x52/583 x53/584 x54/585 x55/586 - x56/587 x57/588 x58/589 x59/590 x60/591 x61/592 x62/593 x63/594 - x64/595 x65/596 x66/597 x67/598 x68/599 x69/600 x70/601 x71/602 - x72/603 x73/604 x74/605 x75/606 x76/607 x77/608 x78/609 x79/610 - x80/611 x81/612 x82/613 x83/614 x84/615 x85/616 x86/617 x87/618 - x88/619 x89/620 x90/621 x91/622 x92/623 x93/624 x94/625 x95/626 - x96/627 x97/628 x98/629 x99/630 x100/631 x101/632 x102/633 x103/634 - x104/635 x105/636 x106/637 x107/638 x108/639 x109/640 x110/641 - x111/642 x112/643 x113/644 x114/645 x115/646 x116/647 x117/648 - x118/649 x119/650 x120/651 x121/652 x122/653 x123/654 x124/655 - x125/656 x126/657 - (function {nlocal = 2} x127/658 x128/659 x129/660 x130/661[L] - x131/662 : int 0))) - (setfield_ptr(root-init) 2 (global Max_arity_locals!) - local_param_after_split/530)) - (let - (local_param_after_split__local_returning/663 = - (function {nlocal = 0} x1/665 x2/666 x3/667 x4/668 x5/669 x6/670 - x7/671 x8/672 x9/673 x10/674 x11/675 x12/676 x13/677 x14/678 x15/679 - x16/680 x17/681 x18/682 x19/683 x20/684 x21/685 x22/686 x23/687 - x24/688 x25/689 x26/690 x27/691 x28/692 x29/693 x30/694 x31/695 - x32/696 x33/697 x34/698 x35/699 x36/700 x37/701 x38/702 x39/703 - x40/704 x41/705 x42/706 x43/707 x44/708 x45/709 x46/710 x47/711 - x48/712 x49/713 x50/714 x51/715 x52/716 x53/717 x54/718 x55/719 - x56/720 x57/721 x58/722 x59/723 x60/724 x61/725 x62/726 x63/727 - x64/728 x65/729 x66/730 x67/731 x68/732 x69/733 x70/734 x71/735 - x72/736 x73/737 x74/738 x75/739 x76/740 x77/741 x78/742 x79/743 - x80/744 x81/745 x82/746 x83/747 x84/748 x85/749 x86/750 x87/751 - x88/752 x89/753 x90/754 x91/755 x92/756 x93/757 x94/758 x95/759 - x96/760 x97/761 x98/762 x99/763 x100/764 x101/765 x102/766 x103/767 - x104/768 x105/769 x106/770 x107/771 x108/772 x109/773 x110/774 - x111/775 x112/776 x113/777 x114/778 x115/779 x116/780 x117/781 - x118/782 x119/783 x120/784 x121/785 x122/786 x123/787 x124/788 - x125/789 x126/790 - (function {nlocal = 2} x127/791 x128/792 x129/793 x130/794[L] - x131/795 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/665 - x130/794)))) - (setfield_ptr(root-init) 3 (global Max_arity_locals!) - local_param_after_split__local_returning/663)) - (let - (local_param_just_after_split/796 = - (function {nlocal = 0} x1/798 x2/799 x3/800 x4/801 x5/802 x6/803 - x7/804 x8/805 x9/806 x10/807 x11/808 x12/809 x13/810 x14/811 x15/812 - x16/813 x17/814 x18/815 x19/816 x20/817 x21/818 x22/819 x23/820 - x24/821 x25/822 x26/823 x27/824 x28/825 x29/826 x30/827 x31/828 - x32/829 x33/830 x34/831 x35/832 x36/833 x37/834 x38/835 x39/836 - x40/837 x41/838 x42/839 x43/840 x44/841 x45/842 x46/843 x47/844 - x48/845 x49/846 x50/847 x51/848 x52/849 x53/850 x54/851 x55/852 - x56/853 x57/854 x58/855 x59/856 x60/857 x61/858 x62/859 x63/860 - x64/861 x65/862 x66/863 x67/864 x68/865 x69/866 x70/867 x71/868 - x72/869 x73/870 x74/871 x75/872 x76/873 x77/874 x78/875 x79/876 - x80/877 x81/878 x82/879 x83/880 x84/881 x85/882 x86/883 x87/884 - x88/885 x89/886 x90/887 x91/888 x92/889 x93/890 x94/891 x95/892 - x96/893 x97/894 x98/895 x99/896 x100/897 x101/898 x102/899 x103/900 - x104/901 x105/902 x106/903 x107/904 x108/905 x109/906 x110/907 - x111/908 x112/909 x113/910 x114/911 x115/912 x116/913 x117/914 - x118/915 x119/916 x120/917 x121/918 x122/919 x123/920 x124/921 - x125/922 x126/923 - (function {nlocal = 5} x127/924[L] x128/925 x129/926 x130/927 - x131/928 : int 0))) - (setfield_ptr(root-init) 4 (global Max_arity_locals!) - local_param_just_after_split/796)) - (let - (local_param_just_after_split__local_returning/929 = - (function {nlocal = 0} x1/931 x2/932 x3/933 x4/934 x5/935 x6/936 - x7/937 x8/938 x9/939 x10/940 x11/941 x12/942 x13/943 x14/944 x15/945 - x16/946 x17/947 x18/948 x19/949 x20/950 x21/951 x22/952 x23/953 - x24/954 x25/955 x26/956 x27/957 x28/958 x29/959 x30/960 x31/961 - x32/962 x33/963 x34/964 x35/965 x36/966 x37/967 x38/968 x39/969 - x40/970 x41/971 x42/972 x43/973 x44/974 x45/975 x46/976 x47/977 - x48/978 x49/979 x50/980 x51/981 x52/982 x53/983 x54/984 x55/985 - x56/986 x57/987 x58/988 x59/989 x60/990 x61/991 x62/992 x63/993 - x64/994 x65/995 x66/996 x67/997 x68/998 x69/999 x70/1000 x71/1001 - x72/1002 x73/1003 x74/1004 x75/1005 x76/1006 x77/1007 x78/1008 - x79/1009 x80/1010 x81/1011 x82/1012 x83/1013 x84/1014 x85/1015 - x86/1016 x87/1017 x88/1018 x89/1019 x90/1020 x91/1021 x92/1022 - x93/1023 x94/1024 x95/1025 x96/1026 x97/1027 x98/1028 x99/1029 - x100/1030 x101/1031 x102/1032 x103/1033 x104/1034 x105/1035 - x106/1036 x107/1037 x108/1038 x109/1039 x110/1040 x111/1041 - x112/1042 x113/1043 x114/1044 x115/1045 x116/1046 x117/1047 - x118/1048 x119/1049 x120/1050 x121/1051 x122/1052 x123/1053 - x124/1054 x125/1055 x126/1056 - (function {nlocal = 5} x127/1057[L] x128/1058 x129/1059 x130/1060 - x131/1061 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/931 - x127/1057)))) - (setfield_ptr(root-init) 5 (global Max_arity_locals!) - local_param_just_after_split__local_returning/929)) - (let - (local_param_just_before_split/1062 = - (function {nlocal = 1} x1/1064 x2/1065 x3/1066 x4/1067 x5/1068 x6/1069 - x7/1070 x8/1071 x9/1072 x10/1073 x11/1074 x12/1075 x13/1076 x14/1077 - x15/1078 x16/1079 x17/1080 x18/1081 x19/1082 x20/1083 x21/1084 - x22/1085 x23/1086 x24/1087 x25/1088 x26/1089 x27/1090 x28/1091 - x29/1092 x30/1093 x31/1094 x32/1095 x33/1096 x34/1097 x35/1098 - x36/1099 x37/1100 x38/1101 x39/1102 x40/1103 x41/1104 x42/1105 - x43/1106 x44/1107 x45/1108 x46/1109 x47/1110 x48/1111 x49/1112 - x50/1113 x51/1114 x52/1115 x53/1116 x54/1117 x55/1118 x56/1119 - x57/1120 x58/1121 x59/1122 x60/1123 x61/1124 x62/1125 x63/1126 - x64/1127 x65/1128 x66/1129 x67/1130 x68/1131 x69/1132 x70/1133 - x71/1134 x72/1135 x73/1136 x74/1137 x75/1138 x76/1139 x77/1140 - x78/1141 x79/1142 x80/1143 x81/1144 x82/1145 x83/1146 x84/1147 - x85/1148 x86/1149 x87/1150 x88/1151 x89/1152 x90/1153 x91/1154 - x92/1155 x93/1156 x94/1157 x95/1158 x96/1159 x97/1160 x98/1161 - x99/1162 x100/1163 x101/1164 x102/1165 x103/1166 x104/1167 x105/1168 - x106/1169 x107/1170 x108/1171 x109/1172 x110/1173 x111/1174 - x112/1175 x113/1176 x114/1177 x115/1178 x116/1179 x117/1180 - x118/1181 x119/1182 x120/1183 x121/1184 x122/1185 x123/1186 - x124/1187 x125/1188 x126/1189[L] : local - (function[L] {nlocal = 5} x127/1190 x128/1191 x129/1192 x130/1193 - x131/1194 : int 0))) - (setfield_ptr(root-init) 6 (global Max_arity_locals!) - local_param_just_before_split/1062)) - (let - (local_param_just_before_split__local_returning/1195 = - (function {nlocal = 1} x1/1197 x2/1198 x3/1199 x4/1200 x5/1201 x6/1202 - x7/1203 x8/1204 x9/1205 x10/1206 x11/1207 x12/1208 x13/1209 x14/1210 - x15/1211 x16/1212 x17/1213 x18/1214 x19/1215 x20/1216 x21/1217 - x22/1218 x23/1219 x24/1220 x25/1221 x26/1222 x27/1223 x28/1224 - x29/1225 x30/1226 x31/1227 x32/1228 x33/1229 x34/1230 x35/1231 - x36/1232 x37/1233 x38/1234 x39/1235 x40/1236 x41/1237 x42/1238 - x43/1239 x44/1240 x45/1241 x46/1242 x47/1243 x48/1244 x49/1245 - x50/1246 x51/1247 x52/1248 x53/1249 x54/1250 x55/1251 x56/1252 - x57/1253 x58/1254 x59/1255 x60/1256 x61/1257 x62/1258 x63/1259 - x64/1260 x65/1261 x66/1262 x67/1263 x68/1264 x69/1265 x70/1266 - x71/1267 x72/1268 x73/1269 x74/1270 x75/1271 x76/1272 x77/1273 - x78/1274 x79/1275 x80/1276 x81/1277 x82/1278 x83/1279 x84/1280 - x85/1281 x86/1282 x87/1283 x88/1284 x89/1285 x90/1286 x91/1287 - x92/1288 x93/1289 x94/1290 x95/1291 x96/1292 x97/1293 x98/1294 - x99/1295 x100/1296 x101/1297 x102/1298 x103/1299 x104/1300 x105/1301 - x106/1302 x107/1303 x108/1304 x109/1305 x110/1306 x111/1307 - x112/1308 x113/1309 x114/1310 x115/1311 x116/1312 x117/1313 - x118/1314 x119/1315 x120/1316 x121/1317 x122/1318 x123/1319 - x124/1320 x125/1321 x126/1322[L] : local - (function[L] {nlocal = 5} x127/1323 x128/1324 x129/1325 x130/1326 - x131/1327 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/1197 - x126/1322)))) - (setfield_ptr(root-init) 7 (global Max_arity_locals!) - local_param_just_before_split__local_returning/1195)) - (let - (local_param_before_split/1328 = - (function {nlocal = 119} x1/1330 x2/1331 x3/1332 x4/1333 x5/1334 - x6/1335 x7/1336 x8/1337[L] x9/1338 x10/1339 x11/1340 x12/1341 - x13/1342 x14/1343 x15/1344 x16/1345 x17/1346 x18/1347 x19/1348 - x20/1349 x21/1350 x22/1351 x23/1352 x24/1353 x25/1354 x26/1355 - x27/1356 x28/1357 x29/1358 x30/1359 x31/1360 x32/1361 x33/1362 - x34/1363 x35/1364 x36/1365 x37/1366 x38/1367 x39/1368 x40/1369 - x41/1370 x42/1371 x43/1372 x44/1373 x45/1374 x46/1375 x47/1376 - x48/1377 x49/1378 x50/1379 x51/1380 x52/1381 x53/1382 x54/1383 - x55/1384 x56/1385 x57/1386 x58/1387 x59/1388 x60/1389 x61/1390 - x62/1391 x63/1392 x64/1393 x65/1394 x66/1395 x67/1396 x68/1397 - x69/1398 x70/1399 x71/1400 x72/1401 x73/1402 x74/1403 x75/1404 - x76/1405 x77/1406 x78/1407 x79/1408 x80/1409 x81/1410 x82/1411 - x83/1412 x84/1413 x85/1414 x86/1415 x87/1416 x88/1417 x89/1418 - x90/1419 x91/1420 x92/1421 x93/1422 x94/1423 x95/1424 x96/1425 - x97/1426 x98/1427 x99/1428 x100/1429 x101/1430 x102/1431 x103/1432 - x104/1433 x105/1434 x106/1435 x107/1436 x108/1437 x109/1438 - x110/1439 x111/1440 x112/1441 x113/1442 x114/1443 x115/1444 - x116/1445 x117/1446 x118/1447 x119/1448 x120/1449 x121/1450 - x122/1451 x123/1452 x124/1453 x125/1454 x126/1455 : local - (function[L] {nlocal = 5} x127/1456 x128/1457 x129/1458 x130/1459 - x131/1460 : int 0))) - (setfield_ptr(root-init) 8 (global Max_arity_locals!) - local_param_before_split/1328)) - (let - (local_param_before_split__local_returning/1461 = - (function {nlocal = 119} x1/1463 x2/1464 x3/1465 x4/1466 x5/1467 - x6/1468 x7/1469 x8/1470[L] x9/1471 x10/1472 x11/1473 x12/1474 - x13/1475 x14/1476 x15/1477 x16/1478 x17/1479 x18/1480 x19/1481 - x20/1482 x21/1483 x22/1484 x23/1485 x24/1486 x25/1487 x26/1488 - x27/1489 x28/1490 x29/1491 x30/1492 x31/1493 x32/1494 x33/1495 - x34/1496 x35/1497 x36/1498 x37/1499 x38/1500 x39/1501 x40/1502 - x41/1503 x42/1504 x43/1505 x44/1506 x45/1507 x46/1508 x47/1509 - x48/1510 x49/1511 x50/1512 x51/1513 x52/1514 x53/1515 x54/1516 - x55/1517 x56/1518 x57/1519 x58/1520 x59/1521 x60/1522 x61/1523 - x62/1524 x63/1525 x64/1526 x65/1527 x66/1528 x67/1529 x68/1530 - x69/1531 x70/1532 x71/1533 x72/1534 x73/1535 x74/1536 x75/1537 - x76/1538 x77/1539 x78/1540 x79/1541 x80/1542 x81/1543 x82/1544 - x83/1545 x84/1546 x85/1547 x86/1548 x87/1549 x88/1550 x89/1551 - x90/1552 x91/1553 x92/1554 x93/1555 x94/1556 x95/1557 x96/1558 - x97/1559 x98/1560 x99/1561 x100/1562 x101/1563 x102/1564 x103/1565 - x104/1566 x105/1567 x106/1568 x107/1569 x108/1570 x109/1571 - x110/1572 x111/1573 x112/1574 x113/1575 x114/1576 x115/1577 - x116/1578 x117/1579 x118/1580 x119/1581 x120/1582 x121/1583 - x122/1584 x123/1585 x124/1586 x125/1587 x126/1588 : local - (function[L] {nlocal = 5} x127/1589 x128/1590 x129/1591 x130/1592 - x131/1593 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/1463 - x8/1470)))) - (setfield_ptr(root-init) 9 (global Max_arity_locals!) - local_param_before_split__local_returning/1461)) - (let - (two_splits/1594 = - (function {nlocal = 0} x1/1596 x2/1597 x3/1598 x4/1599 x5/1600 x6/1601 - x7/1602 x8/1603 x9/1604 x10/1605 x11/1606 x12/1607 x13/1608 x14/1609 - x15/1610 x16/1611 x17/1612 x18/1613 x19/1614 x20/1615 x21/1616 - x22/1617 x23/1618 x24/1619 x25/1620 x26/1621 x27/1622 x28/1623 - x29/1624 x30/1625 x31/1626 x32/1627 x33/1628 x34/1629 x35/1630 - x36/1631 x37/1632 x38/1633 x39/1634 x40/1635 x41/1636 x42/1637 - x43/1638 x44/1639 x45/1640 x46/1641 x47/1642 x48/1643 x49/1644 - x50/1645 x51/1646 x52/1647 x53/1648 x54/1649 x55/1650 x56/1651 - x57/1652 x58/1653 x59/1654 x60/1655 x61/1656 x62/1657 x63/1658 - x64/1659 x65/1660 x66/1661 x67/1662 x68/1663 x69/1664 x70/1665 - x71/1666 x72/1667 x73/1668 x74/1669 x75/1670 x76/1671 x77/1672 - x78/1673 x79/1674 x80/1675 x81/1676 x82/1677 x83/1678 x84/1679 - x85/1680 x86/1681 x87/1682 x88/1683 x89/1684 x90/1685 x91/1686 - x92/1687 x93/1688 x94/1689 x95/1690 x96/1691 x97/1692 x98/1693 - x99/1694 x100/1695 x101/1696 x102/1697 x103/1698 x104/1699 x105/1700 - x106/1701 x107/1702 x108/1703 x109/1704 x110/1705 x111/1706 - x112/1707 x113/1708 x114/1709 x115/1710 x116/1711 x117/1712 - x118/1713 x119/1714 x120/1715 x121/1716 x122/1717 x123/1718 - x124/1719 x125/1720 x126/1721 - (function {nlocal = 0} x127/1722 x128/1723 x129/1724 x130/1725 - x131/1726 x132/1727 x133/1728 x134/1729 x135/1730 x136/1731 - x137/1732 x138/1733 x139/1734 x140/1735 x141/1736 x142/1737 - x143/1738 x144/1739 x145/1740 x146/1741 x147/1742 x148/1743 - x149/1744 x150/1745 x151/1746 x152/1747 x153/1748 x154/1749 - x155/1750 x156/1751 x157/1752 x158/1753 x159/1754 x160/1755 - x161/1756 x162/1757 x163/1758 x164/1759 x165/1760 x166/1761 - x167/1762 x168/1763 x169/1764 x170/1765 x171/1766 x172/1767 - x173/1768 x174/1769 x175/1770 x176/1771 x177/1772 x178/1773 - x179/1774 x180/1775 x181/1776 x182/1777 x183/1778 x184/1779 - x185/1780 x186/1781 x187/1782 x188/1783 x189/1784 x190/1785 - x191/1786 x192/1787 x193/1788 x194/1789 x195/1790 x196/1791 - x197/1792 x198/1793 x199/1794 x200/1795 x201/1796 x202/1797 - x203/1798 x204/1799 x205/1800 x206/1801 x207/1802 x208/1803 - x209/1804 x210/1805 x211/1806 x212/1807 x213/1808 x214/1809 - x215/1810 x216/1811 x217/1812 x218/1813 x219/1814 x220/1815 - x221/1816 x222/1817 x223/1818 x224/1819 x225/1820 x226/1821 - x227/1822 x228/1823 x229/1824 x230/1825 x231/1826 x232/1827 - x233/1828 x234/1829 x235/1830 x236/1831 x237/1832 x238/1833 - x239/1834 x240/1835 x241/1836 x242/1837 x243/1838 x244/1839 - x245/1840 x246/1841 x247/1842 x248/1843 x249/1844 x250/1845 - x251/1846 x252/1847 - (function {nlocal = 0} x253/1848 x254/1849 x255/1850 x256/1851 - x257/1852 x258/1853 : int 0)))) - (setfield_ptr(root-init) 10 (global Max_arity_locals!) two_splits/1594)) - (let - (two_splits__local_returning/1854 = - (function {nlocal = 0} x1/1856 x2/1857 x3/1858 x4/1859 x5/1860 x6/1861 - x7/1862 x8/1863 x9/1864 x10/1865 x11/1866 x12/1867 x13/1868 x14/1869 - x15/1870 x16/1871 x17/1872 x18/1873 x19/1874 x20/1875 x21/1876 - x22/1877 x23/1878 x24/1879 x25/1880 x26/1881 x27/1882 x28/1883 - x29/1884 x30/1885 x31/1886 x32/1887 x33/1888 x34/1889 x35/1890 - x36/1891 x37/1892 x38/1893 x39/1894 x40/1895 x41/1896 x42/1897 - x43/1898 x44/1899 x45/1900 x46/1901 x47/1902 x48/1903 x49/1904 - x50/1905 x51/1906 x52/1907 x53/1908 x54/1909 x55/1910 x56/1911 - x57/1912 x58/1913 x59/1914 x60/1915 x61/1916 x62/1917 x63/1918 - x64/1919 x65/1920 x66/1921 x67/1922 x68/1923 x69/1924 x70/1925 - x71/1926 x72/1927 x73/1928 x74/1929 x75/1930 x76/1931 x77/1932 - x78/1933 x79/1934 x80/1935 x81/1936 x82/1937 x83/1938 x84/1939 - x85/1940 x86/1941 x87/1942 x88/1943 x89/1944 x90/1945 x91/1946 - x92/1947 x93/1948 x94/1949 x95/1950 x96/1951 x97/1952 x98/1953 - x99/1954 x100/1955 x101/1956 x102/1957 x103/1958 x104/1959 x105/1960 - x106/1961 x107/1962 x108/1963 x109/1964 x110/1965 x111/1966 - x112/1967 x113/1968 x114/1969 x115/1970 x116/1971 x117/1972 - x118/1973 x119/1974 x120/1975 x121/1976 x122/1977 x123/1978 - x124/1979 x125/1980 x126/1981 - (function {nlocal = 0} x127/1982 x128/1983 x129/1984 x130/1985 - x131/1986 x132/1987 x133/1988 x134/1989 x135/1990 x136/1991 - x137/1992 x138/1993 x139/1994 x140/1995 x141/1996 x142/1997 - x143/1998 x144/1999 x145/2000 x146/2001 x147/2002 x148/2003 - x149/2004 x150/2005 x151/2006 x152/2007 x153/2008 x154/2009 - x155/2010 x156/2011 x157/2012 x158/2013 x159/2014 x160/2015 - x161/2016 x162/2017 x163/2018 x164/2019 x165/2020 x166/2021 - x167/2022 x168/2023 x169/2024 x170/2025 x171/2026 x172/2027 - x173/2028 x174/2029 x175/2030 x176/2031 x177/2032 x178/2033 - x179/2034 x180/2035 x181/2036 x182/2037 x183/2038 x184/2039 - x185/2040 x186/2041 x187/2042 x188/2043 x189/2044 x190/2045 - x191/2046 x192/2047 x193/2048 x194/2049 x195/2050 x196/2051 - x197/2052 x198/2053 x199/2054 x200/2055 x201/2056 x202/2057 - x203/2058 x204/2059 x205/2060 x206/2061 x207/2062 x208/2063 - x209/2064 x210/2065 x211/2066 x212/2067 x213/2068 x214/2069 - x215/2070 x216/2071 x217/2072 x218/2073 x219/2074 x220/2075 - x221/2076 x222/2077 x223/2078 x224/2079 x225/2080 x226/2081 - x227/2082 x228/2083 x229/2084 x230/2085 x231/2086 x232/2087 - x233/2088 x234/2089 x235/2090 x236/2091 x237/2092 x238/2093 - x239/2094 x240/2095 x241/2096 x242/2097 x243/2098 x244/2099 - x245/2100 x246/2101 x247/2102 x248/2103 x249/2104 x250/2105 - x251/2106 x252/2107 - (function {nlocal = 1} x253/2108 x254/2109 x255/2110 x256/2111 - x257/2112 x258/2113 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/1856 - x258/2113))))) - (setfield_ptr(root-init) 11 (global Max_arity_locals!) - two_splits__local_returning/1854)) - (let - (two_splits_local_param/2114 = - (function {nlocal = 0} x1/2116 x2/2117 x3/2118 x4/2119 x5/2120 x6/2121 - x7/2122 x8/2123 x9/2124 x10/2125 x11/2126 x12/2127 x13/2128 x14/2129 - x15/2130 x16/2131 x17/2132 x18/2133 x19/2134 x20/2135 x21/2136 - x22/2137 x23/2138 x24/2139 x25/2140 x26/2141 x27/2142 x28/2143 - x29/2144 x30/2145 x31/2146 x32/2147 x33/2148 x34/2149 x35/2150 - x36/2151 x37/2152 x38/2153 x39/2154 x40/2155 x41/2156 x42/2157 - x43/2158 x44/2159 x45/2160 x46/2161 x47/2162 x48/2163 x49/2164 - x50/2165 x51/2166 x52/2167 x53/2168 x54/2169 x55/2170 x56/2171 - x57/2172 x58/2173 x59/2174 x60/2175 x61/2176 x62/2177 x63/2178 - x64/2179 x65/2180 x66/2181 x67/2182 x68/2183 x69/2184 x70/2185 - x71/2186 x72/2187 x73/2188 x74/2189 x75/2190 x76/2191 x77/2192 - x78/2193 x79/2194 x80/2195 x81/2196 x82/2197 x83/2198 x84/2199 - x85/2200 x86/2201 x87/2202 x88/2203 x89/2204 x90/2205 x91/2206 - x92/2207 x93/2208 x94/2209 x95/2210 x96/2211 x97/2212 x98/2213 - x99/2214 x100/2215 x101/2216 x102/2217 x103/2218 x104/2219 x105/2220 - x106/2221 x107/2222 x108/2223 x109/2224 x110/2225 x111/2226 - x112/2227 x113/2228 x114/2229 x115/2230 x116/2231 x117/2232 - x118/2233 x119/2234 x120/2235 x121/2236 x122/2237 x123/2238 - x124/2239 x125/2240 x126/2241 - (function {nlocal = 101} x127/2242 x128/2243 x129/2244 x130/2245 - x131/2246 x132/2247 x133/2248 x134/2249 x135/2250 x136/2251 - x137/2252 x138/2253 x139/2254 x140/2255 x141/2256 x142/2257 - x143/2258 x144/2259 x145/2260 x146/2261 x147/2262 x148/2263 - x149/2264 x150/2265 x151/2266 x152/2267[L] x153/2268 x154/2269 - x155/2270 x156/2271 x157/2272 x158/2273 x159/2274 x160/2275 - x161/2276 x162/2277 x163/2278 x164/2279 x165/2280 x166/2281 - x167/2282 x168/2283 x169/2284 x170/2285 x171/2286 x172/2287 - x173/2288 x174/2289 x175/2290 x176/2291 x177/2292 x178/2293 - x179/2294 x180/2295 x181/2296 x182/2297 x183/2298 x184/2299 - x185/2300 x186/2301 x187/2302 x188/2303 x189/2304 x190/2305 - x191/2306 x192/2307 x193/2308 x194/2309 x195/2310 x196/2311 - x197/2312 x198/2313 x199/2314 x200/2315 x201/2316 x202/2317 - x203/2318 x204/2319 x205/2320 x206/2321 x207/2322 x208/2323 - x209/2324 x210/2325 x211/2326 x212/2327 x213/2328 x214/2329 - x215/2330 x216/2331 x217/2332 x218/2333 x219/2334 x220/2335 - x221/2336 x222/2337 x223/2338 x224/2339 x225/2340 x226/2341 - x227/2342 x228/2343 x229/2344 x230/2345 x231/2346 x232/2347 - x233/2348 x234/2349 x235/2350 x236/2351 x237/2352 x238/2353 - x239/2354 x240/2355 x241/2356 x242/2357 x243/2358 x244/2359 - x245/2360 x246/2361 x247/2362 x248/2363 x249/2364 x250/2365 - x251/2366 x252/2367 : local - (function[L] {nlocal = 6} x253/2368 x254/2369 x255/2370 x256/2371 - x257/2372 x258/2373 : int 0)))) - (setfield_ptr(root-init) 12 (global Max_arity_locals!) - two_splits_local_param/2114)) - (let - (two_splits_local_param__local_returning/2374 = - (function {nlocal = 0} x1/2376 x2/2377 x3/2378 x4/2379 x5/2380 x6/2381 - x7/2382 x8/2383 x9/2384 x10/2385 x11/2386 x12/2387 x13/2388 x14/2389 - x15/2390 x16/2391 x17/2392 x18/2393 x19/2394 x20/2395 x21/2396 - x22/2397 x23/2398 x24/2399 x25/2400 x26/2401 x27/2402 x28/2403 - x29/2404 x30/2405 x31/2406 x32/2407 x33/2408 x34/2409 x35/2410 - x36/2411 x37/2412 x38/2413 x39/2414 x40/2415 x41/2416 x42/2417 - x43/2418 x44/2419 x45/2420 x46/2421 x47/2422 x48/2423 x49/2424 - x50/2425 x51/2426 x52/2427 x53/2428 x54/2429 x55/2430 x56/2431 - x57/2432 x58/2433 x59/2434 x60/2435 x61/2436 x62/2437 x63/2438 - x64/2439 x65/2440 x66/2441 x67/2442 x68/2443 x69/2444 x70/2445 - x71/2446 x72/2447 x73/2448 x74/2449 x75/2450 x76/2451 x77/2452 - x78/2453 x79/2454 x80/2455 x81/2456 x82/2457 x83/2458 x84/2459 - x85/2460 x86/2461 x87/2462 x88/2463 x89/2464 x90/2465 x91/2466 - x92/2467 x93/2468 x94/2469 x95/2470 x96/2471 x97/2472 x98/2473 - x99/2474 x100/2475 x101/2476 x102/2477 x103/2478 x104/2479 x105/2480 - x106/2481 x107/2482 x108/2483 x109/2484 x110/2485 x111/2486 - x112/2487 x113/2488 x114/2489 x115/2490 x116/2491 x117/2492 - x118/2493 x119/2494 x120/2495 x121/2496 x122/2497 x123/2498 - x124/2499 x125/2500 x126/2501 - (function {nlocal = 101} x127/2502 x128/2503 x129/2504 x130/2505 - x131/2506 x132/2507 x133/2508 x134/2509 x135/2510 x136/2511 - x137/2512 x138/2513 x139/2514 x140/2515 x141/2516 x142/2517 - x143/2518 x144/2519 x145/2520 x146/2521 x147/2522 x148/2523 - x149/2524 x150/2525 x151/2526 x152/2527[L] x153/2528 x154/2529 - x155/2530 x156/2531 x157/2532 x158/2533 x159/2534 x160/2535 - x161/2536 x162/2537 x163/2538 x164/2539 x165/2540 x166/2541 - x167/2542 x168/2543 x169/2544 x170/2545 x171/2546 x172/2547 - x173/2548 x174/2549 x175/2550 x176/2551 x177/2552 x178/2553 - x179/2554 x180/2555 x181/2556 x182/2557 x183/2558 x184/2559 - x185/2560 x186/2561 x187/2562 x188/2563 x189/2564 x190/2565 - x191/2566 x192/2567 x193/2568 x194/2569 x195/2570 x196/2571 - x197/2572 x198/2573 x199/2574 x200/2575 x201/2576 x202/2577 - x203/2578 x204/2579 x205/2580 x206/2581 x207/2582 x208/2583 - x209/2584 x210/2585 x211/2586 x212/2587 x213/2588 x214/2589 - x215/2590 x216/2591 x217/2592 x218/2593 x219/2594 x220/2595 - x221/2596 x222/2597 x223/2598 x224/2599 x225/2600 x226/2601 - x227/2602 x228/2603 x229/2604 x230/2605 x231/2606 x232/2607 - x233/2608 x234/2609 x235/2610 x236/2611 x237/2612 x238/2613 - x239/2614 x240/2615 x241/2616 x242/2617 x243/2618 x244/2619 - x245/2620 x246/2621 x247/2622 x248/2623 x249/2624 x250/2625 - x251/2626 x252/2627 : local - (function[L] {nlocal = 6} x253/2628 x254/2629 x255/2630 x256/2631 - x257/2632 x258/2633 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/2376 - x152/2527))))) - (setfield_ptr(root-init) 13 (global Max_arity_locals!) - two_splits_local_param__local_returning/2374)) - (let - (create_local/2634 = - (function {nlocal = 1} param/4992[int] - [(consts ()) - (non_consts ([0: *, *, *, *, *, *, *, *, *, *, *, *, *, *]))] - (let - (no_local_params/2636 = - (function[L] {nlocal = 126} x1/2637 x2/2638 x3/2639 x4/2640 - x5/2641 x6/2642 x7/2643 x8/2644 x9/2645 x10/2646 x11/2647 - x12/2648 x13/2649 x14/2650 x15/2651 x16/2652 x17/2653 - x18/2654 x19/2655 x20/2656 x21/2657 x22/2658 x23/2659 - x24/2660 x25/2661 x26/2662 x27/2663 x28/2664 x29/2665 - x30/2666 x31/2667 x32/2668 x33/2669 x34/2670 x35/2671 - x36/2672 x37/2673 x38/2674 x39/2675 x40/2676 x41/2677 - x42/2678 x43/2679 x44/2680 x45/2681 x46/2682 x47/2683 - x48/2684 x49/2685 x50/2686 x51/2687 x52/2688 x53/2689 - x54/2690 x55/2691 x56/2692 x57/2693 x58/2694 x59/2695 - x60/2696 x61/2697 x62/2698 x63/2699 x64/2700 x65/2701 - x66/2702 x67/2703 x68/2704 x69/2705 x70/2706 x71/2707 - x72/2708 x73/2709 x74/2710 x75/2711 x76/2712 x77/2713 - x78/2714 x79/2715 x80/2716 x81/2717 x82/2718 x83/2719 - x84/2720 x85/2721 x86/2722 x87/2723 x88/2724 x89/2725 - x90/2726 x91/2727 x92/2728 x93/2729 x94/2730 x95/2731 - x96/2732 x97/2733 x98/2734 x99/2735 x100/2736 x101/2737 - x102/2738 x103/2739 x104/2740 x105/2741 x106/2742 x107/2743 - x108/2744 x109/2745 x110/2746 x111/2747 x112/2748 x113/2749 - x114/2750 x115/2751 x116/2752 x117/2753 x118/2754 x119/2755 - x120/2756 x121/2757 x122/2758 x123/2759 x124/2760 x125/2761 - x126/2762 : local - (function[L] {nlocal = 5} x127/2763 x128/2764 x129/2765 - x130/2766 x131/2767 : int 0)) - no_local_params__local_returning/2768 = - (function[L] {nlocal = 126} x1/2769 x2/2770 x3/2771 x4/2772 - x5/2773 x6/2774 x7/2775 x8/2776 x9/2777 x10/2778 x11/2779 - x12/2780 x13/2781 x14/2782 x15/2783 x16/2784 x17/2785 - x18/2786 x19/2787 x20/2788 x21/2789 x22/2790 x23/2791 - x24/2792 x25/2793 x26/2794 x27/2795 x28/2796 x29/2797 - x30/2798 x31/2799 x32/2800 x33/2801 x34/2802 x35/2803 - x36/2804 x37/2805 x38/2806 x39/2807 x40/2808 x41/2809 - x42/2810 x43/2811 x44/2812 x45/2813 x46/2814 x47/2815 - x48/2816 x49/2817 x50/2818 x51/2819 x52/2820 x53/2821 - x54/2822 x55/2823 x56/2824 x57/2825 x58/2826 x59/2827 - x60/2828 x61/2829 x62/2830 x63/2831 x64/2832 x65/2833 - x66/2834 x67/2835 x68/2836 x69/2837 x70/2838 x71/2839 - x72/2840 x73/2841 x74/2842 x75/2843 x76/2844 x77/2845 - x78/2846 x79/2847 x80/2848 x81/2849 x82/2850 x83/2851 - x84/2852 x85/2853 x86/2854 x87/2855 x88/2856 x89/2857 - x90/2858 x91/2859 x92/2860 x93/2861 x94/2862 x95/2863 - x96/2864 x97/2865 x98/2866 x99/2867 x100/2868 x101/2869 - x102/2870 x103/2871 x104/2872 x105/2873 x106/2874 x107/2875 - x108/2876 x109/2877 x110/2878 x111/2879 x112/2880 x113/2881 - x114/2882 x115/2883 x116/2884 x117/2885 x118/2886 x119/2887 - x120/2888 x121/2889 x122/2890 x123/2891 x124/2892 x125/2893 - x126/2894 : local - (function[L] {nlocal = 5} x127/2895 x128/2896 x129/2897 - x130/2898 x131/2899 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/2769 x2/2770))) - local_param_after_split/2900 = - (function[L] {nlocal = 126} x1/2901 x2/2902 x3/2903 x4/2904 - x5/2905 x6/2906 x7/2907 x8/2908 x9/2909 x10/2910 x11/2911 - x12/2912 x13/2913 x14/2914 x15/2915 x16/2916 x17/2917 - x18/2918 x19/2919 x20/2920 x21/2921 x22/2922 x23/2923 - x24/2924 x25/2925 x26/2926 x27/2927 x28/2928 x29/2929 - x30/2930 x31/2931 x32/2932 x33/2933 x34/2934 x35/2935 - x36/2936 x37/2937 x38/2938 x39/2939 x40/2940 x41/2941 - x42/2942 x43/2943 x44/2944 x45/2945 x46/2946 x47/2947 - x48/2948 x49/2949 x50/2950 x51/2951 x52/2952 x53/2953 - x54/2954 x55/2955 x56/2956 x57/2957 x58/2958 x59/2959 - x60/2960 x61/2961 x62/2962 x63/2963 x64/2964 x65/2965 - x66/2966 x67/2967 x68/2968 x69/2969 x70/2970 x71/2971 - x72/2972 x73/2973 x74/2974 x75/2975 x76/2976 x77/2977 - x78/2978 x79/2979 x80/2980 x81/2981 x82/2982 x83/2983 - x84/2984 x85/2985 x86/2986 x87/2987 x88/2988 x89/2989 - x90/2990 x91/2991 x92/2992 x93/2993 x94/2994 x95/2995 - x96/2996 x97/2997 x98/2998 x99/2999 x100/3000 x101/3001 - x102/3002 x103/3003 x104/3004 x105/3005 x106/3006 x107/3007 - x108/3008 x109/3009 x110/3010 x111/3011 x112/3012 x113/3013 - x114/3014 x115/3015 x116/3016 x117/3017 x118/3018 x119/3019 - x120/3020 x121/3021 x122/3022 x123/3023 x124/3024 x125/3025 - x126/3026 : local - (function[L] {nlocal = 5} x127/3027 x128/3028 x129/3029 - x130/3030[L] x131/3031 : int 0)) - local_param_after_split__local_returning/3032 = - (function[L] {nlocal = 126} x1/3033 x2/3034 x3/3035 x4/3036 - x5/3037 x6/3038 x7/3039 x8/3040 x9/3041 x10/3042 x11/3043 - x12/3044 x13/3045 x14/3046 x15/3047 x16/3048 x17/3049 - x18/3050 x19/3051 x20/3052 x21/3053 x22/3054 x23/3055 - x24/3056 x25/3057 x26/3058 x27/3059 x28/3060 x29/3061 - x30/3062 x31/3063 x32/3064 x33/3065 x34/3066 x35/3067 - x36/3068 x37/3069 x38/3070 x39/3071 x40/3072 x41/3073 - x42/3074 x43/3075 x44/3076 x45/3077 x46/3078 x47/3079 - x48/3080 x49/3081 x50/3082 x51/3083 x52/3084 x53/3085 - x54/3086 x55/3087 x56/3088 x57/3089 x58/3090 x59/3091 - x60/3092 x61/3093 x62/3094 x63/3095 x64/3096 x65/3097 - x66/3098 x67/3099 x68/3100 x69/3101 x70/3102 x71/3103 - x72/3104 x73/3105 x74/3106 x75/3107 x76/3108 x77/3109 - x78/3110 x79/3111 x80/3112 x81/3113 x82/3114 x83/3115 - x84/3116 x85/3117 x86/3118 x87/3119 x88/3120 x89/3121 - x90/3122 x91/3123 x92/3124 x93/3125 x94/3126 x95/3127 - x96/3128 x97/3129 x98/3130 x99/3131 x100/3132 x101/3133 - x102/3134 x103/3135 x104/3136 x105/3137 x106/3138 x107/3139 - x108/3140 x109/3141 x110/3142 x111/3143 x112/3144 x113/3145 - x114/3146 x115/3147 x116/3148 x117/3149 x118/3150 x119/3151 - x120/3152 x121/3153 x122/3154 x123/3155 x124/3156 x125/3157 - x126/3158 : local - (function[L] {nlocal = 5} x127/3159 x128/3160 x129/3161 - x130/3162[L] x131/3163 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3033 x130/3162))) - local_param_just_after_split/3164 = - (function[L] {nlocal = 126} x1/3165 x2/3166 x3/3167 x4/3168 - x5/3169 x6/3170 x7/3171 x8/3172 x9/3173 x10/3174 x11/3175 - x12/3176 x13/3177 x14/3178 x15/3179 x16/3180 x17/3181 - x18/3182 x19/3183 x20/3184 x21/3185 x22/3186 x23/3187 - x24/3188 x25/3189 x26/3190 x27/3191 x28/3192 x29/3193 - x30/3194 x31/3195 x32/3196 x33/3197 x34/3198 x35/3199 - x36/3200 x37/3201 x38/3202 x39/3203 x40/3204 x41/3205 - x42/3206 x43/3207 x44/3208 x45/3209 x46/3210 x47/3211 - x48/3212 x49/3213 x50/3214 x51/3215 x52/3216 x53/3217 - x54/3218 x55/3219 x56/3220 x57/3221 x58/3222 x59/3223 - x60/3224 x61/3225 x62/3226 x63/3227 x64/3228 x65/3229 - x66/3230 x67/3231 x68/3232 x69/3233 x70/3234 x71/3235 - x72/3236 x73/3237 x74/3238 x75/3239 x76/3240 x77/3241 - x78/3242 x79/3243 x80/3244 x81/3245 x82/3246 x83/3247 - x84/3248 x85/3249 x86/3250 x87/3251 x88/3252 x89/3253 - x90/3254 x91/3255 x92/3256 x93/3257 x94/3258 x95/3259 - x96/3260 x97/3261 x98/3262 x99/3263 x100/3264 x101/3265 - x102/3266 x103/3267 x104/3268 x105/3269 x106/3270 x107/3271 - x108/3272 x109/3273 x110/3274 x111/3275 x112/3276 x113/3277 - x114/3278 x115/3279 x116/3280 x117/3281 x118/3282 x119/3283 - x120/3284 x121/3285 x122/3286 x123/3287 x124/3288 x125/3289 - x126/3290 : local - (function[L] {nlocal = 5} x127/3291[L] x128/3292 x129/3293 - x130/3294 x131/3295 : int 0)) - local_param_just_after_split__local_returning/3296 = - (function[L] {nlocal = 126} x1/3297 x2/3298 x3/3299 x4/3300 - x5/3301 x6/3302 x7/3303 x8/3304 x9/3305 x10/3306 x11/3307 - x12/3308 x13/3309 x14/3310 x15/3311 x16/3312 x17/3313 - x18/3314 x19/3315 x20/3316 x21/3317 x22/3318 x23/3319 - x24/3320 x25/3321 x26/3322 x27/3323 x28/3324 x29/3325 - x30/3326 x31/3327 x32/3328 x33/3329 x34/3330 x35/3331 - x36/3332 x37/3333 x38/3334 x39/3335 x40/3336 x41/3337 - x42/3338 x43/3339 x44/3340 x45/3341 x46/3342 x47/3343 - x48/3344 x49/3345 x50/3346 x51/3347 x52/3348 x53/3349 - x54/3350 x55/3351 x56/3352 x57/3353 x58/3354 x59/3355 - x60/3356 x61/3357 x62/3358 x63/3359 x64/3360 x65/3361 - x66/3362 x67/3363 x68/3364 x69/3365 x70/3366 x71/3367 - x72/3368 x73/3369 x74/3370 x75/3371 x76/3372 x77/3373 - x78/3374 x79/3375 x80/3376 x81/3377 x82/3378 x83/3379 - x84/3380 x85/3381 x86/3382 x87/3383 x88/3384 x89/3385 - x90/3386 x91/3387 x92/3388 x93/3389 x94/3390 x95/3391 - x96/3392 x97/3393 x98/3394 x99/3395 x100/3396 x101/3397 - x102/3398 x103/3399 x104/3400 x105/3401 x106/3402 x107/3403 - x108/3404 x109/3405 x110/3406 x111/3407 x112/3408 x113/3409 - x114/3410 x115/3411 x116/3412 x117/3413 x118/3414 x119/3415 - x120/3416 x121/3417 x122/3418 x123/3419 x124/3420 x125/3421 - x126/3422 : local - (function[L] {nlocal = 5} x127/3423[L] x128/3424 x129/3425 - x130/3426 x131/3427 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3297 x127/3423))) - local_param_just_before_split/3428 = - (function[L] {nlocal = 126} x1/3429 x2/3430 x3/3431 x4/3432 - x5/3433 x6/3434 x7/3435 x8/3436 x9/3437 x10/3438 x11/3439 - x12/3440 x13/3441 x14/3442 x15/3443 x16/3444 x17/3445 - x18/3446 x19/3447 x20/3448 x21/3449 x22/3450 x23/3451 - x24/3452 x25/3453 x26/3454 x27/3455 x28/3456 x29/3457 - x30/3458 x31/3459 x32/3460 x33/3461 x34/3462 x35/3463 - x36/3464 x37/3465 x38/3466 x39/3467 x40/3468 x41/3469 - x42/3470 x43/3471 x44/3472 x45/3473 x46/3474 x47/3475 - x48/3476 x49/3477 x50/3478 x51/3479 x52/3480 x53/3481 - x54/3482 x55/3483 x56/3484 x57/3485 x58/3486 x59/3487 - x60/3488 x61/3489 x62/3490 x63/3491 x64/3492 x65/3493 - x66/3494 x67/3495 x68/3496 x69/3497 x70/3498 x71/3499 - x72/3500 x73/3501 x74/3502 x75/3503 x76/3504 x77/3505 - x78/3506 x79/3507 x80/3508 x81/3509 x82/3510 x83/3511 - x84/3512 x85/3513 x86/3514 x87/3515 x88/3516 x89/3517 - x90/3518 x91/3519 x92/3520 x93/3521 x94/3522 x95/3523 - x96/3524 x97/3525 x98/3526 x99/3527 x100/3528 x101/3529 - x102/3530 x103/3531 x104/3532 x105/3533 x106/3534 x107/3535 - x108/3536 x109/3537 x110/3538 x111/3539 x112/3540 x113/3541 - x114/3542 x115/3543 x116/3544 x117/3545 x118/3546 x119/3547 - x120/3548 x121/3549 x122/3550 x123/3551 x124/3552 x125/3553 - x126/3554[L] : local - (function[L] {nlocal = 5} x127/3555 x128/3556 x129/3557 - x130/3558 x131/3559 : int 0)) - local_param_just_before_split__local_returning/3560 = - (function[L] {nlocal = 126} x1/3561 x2/3562 x3/3563 x4/3564 - x5/3565 x6/3566 x7/3567 x8/3568 x9/3569 x10/3570 x11/3571 - x12/3572 x13/3573 x14/3574 x15/3575 x16/3576 x17/3577 - x18/3578 x19/3579 x20/3580 x21/3581 x22/3582 x23/3583 - x24/3584 x25/3585 x26/3586 x27/3587 x28/3588 x29/3589 - x30/3590 x31/3591 x32/3592 x33/3593 x34/3594 x35/3595 - x36/3596 x37/3597 x38/3598 x39/3599 x40/3600 x41/3601 - x42/3602 x43/3603 x44/3604 x45/3605 x46/3606 x47/3607 - x48/3608 x49/3609 x50/3610 x51/3611 x52/3612 x53/3613 - x54/3614 x55/3615 x56/3616 x57/3617 x58/3618 x59/3619 - x60/3620 x61/3621 x62/3622 x63/3623 x64/3624 x65/3625 - x66/3626 x67/3627 x68/3628 x69/3629 x70/3630 x71/3631 - x72/3632 x73/3633 x74/3634 x75/3635 x76/3636 x77/3637 - x78/3638 x79/3639 x80/3640 x81/3641 x82/3642 x83/3643 - x84/3644 x85/3645 x86/3646 x87/3647 x88/3648 x89/3649 - x90/3650 x91/3651 x92/3652 x93/3653 x94/3654 x95/3655 - x96/3656 x97/3657 x98/3658 x99/3659 x100/3660 x101/3661 - x102/3662 x103/3663 x104/3664 x105/3665 x106/3666 x107/3667 - x108/3668 x109/3669 x110/3670 x111/3671 x112/3672 x113/3673 - x114/3674 x115/3675 x116/3676 x117/3677 x118/3678 x119/3679 - x120/3680 x121/3681 x122/3682 x123/3683 x124/3684 x125/3685 - x126/3686[L] : local - (function[L] {nlocal = 5} x127/3687 x128/3688 x129/3689 - x130/3690 x131/3691 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3561 x126/3686))) - local_param_before_split/3692 = - (function[L] {nlocal = 126} x1/3693 x2/3694 x3/3695 x4/3696 - x5/3697 x6/3698 x7/3699 x8/3700[L] x9/3701 x10/3702 x11/3703 - x12/3704 x13/3705 x14/3706 x15/3707 x16/3708 x17/3709 - x18/3710 x19/3711 x20/3712 x21/3713 x22/3714 x23/3715 - x24/3716 x25/3717 x26/3718 x27/3719 x28/3720 x29/3721 - x30/3722 x31/3723 x32/3724 x33/3725 x34/3726 x35/3727 - x36/3728 x37/3729 x38/3730 x39/3731 x40/3732 x41/3733 - x42/3734 x43/3735 x44/3736 x45/3737 x46/3738 x47/3739 - x48/3740 x49/3741 x50/3742 x51/3743 x52/3744 x53/3745 - x54/3746 x55/3747 x56/3748 x57/3749 x58/3750 x59/3751 - x60/3752 x61/3753 x62/3754 x63/3755 x64/3756 x65/3757 - x66/3758 x67/3759 x68/3760 x69/3761 x70/3762 x71/3763 - x72/3764 x73/3765 x74/3766 x75/3767 x76/3768 x77/3769 - x78/3770 x79/3771 x80/3772 x81/3773 x82/3774 x83/3775 - x84/3776 x85/3777 x86/3778 x87/3779 x88/3780 x89/3781 - x90/3782 x91/3783 x92/3784 x93/3785 x94/3786 x95/3787 - x96/3788 x97/3789 x98/3790 x99/3791 x100/3792 x101/3793 - x102/3794 x103/3795 x104/3796 x105/3797 x106/3798 x107/3799 - x108/3800 x109/3801 x110/3802 x111/3803 x112/3804 x113/3805 - x114/3806 x115/3807 x116/3808 x117/3809 x118/3810 x119/3811 - x120/3812 x121/3813 x122/3814 x123/3815 x124/3816 x125/3817 - x126/3818 : local - (function[L] {nlocal = 5} x127/3819 x128/3820 x129/3821 - x130/3822 x131/3823 : int 0)) - local_param_before_split__local_returning/3824 = - (function[L] {nlocal = 126} x1/3825 x2/3826 x3/3827 x4/3828 - x5/3829 x6/3830 x7/3831 x8/3832[L] x9/3833 x10/3834 x11/3835 - x12/3836 x13/3837 x14/3838 x15/3839 x16/3840 x17/3841 - x18/3842 x19/3843 x20/3844 x21/3845 x22/3846 x23/3847 - x24/3848 x25/3849 x26/3850 x27/3851 x28/3852 x29/3853 - x30/3854 x31/3855 x32/3856 x33/3857 x34/3858 x35/3859 - x36/3860 x37/3861 x38/3862 x39/3863 x40/3864 x41/3865 - x42/3866 x43/3867 x44/3868 x45/3869 x46/3870 x47/3871 - x48/3872 x49/3873 x50/3874 x51/3875 x52/3876 x53/3877 - x54/3878 x55/3879 x56/3880 x57/3881 x58/3882 x59/3883 - x60/3884 x61/3885 x62/3886 x63/3887 x64/3888 x65/3889 - x66/3890 x67/3891 x68/3892 x69/3893 x70/3894 x71/3895 - x72/3896 x73/3897 x74/3898 x75/3899 x76/3900 x77/3901 - x78/3902 x79/3903 x80/3904 x81/3905 x82/3906 x83/3907 - x84/3908 x85/3909 x86/3910 x87/3911 x88/3912 x89/3913 - x90/3914 x91/3915 x92/3916 x93/3917 x94/3918 x95/3919 - x96/3920 x97/3921 x98/3922 x99/3923 x100/3924 x101/3925 - x102/3926 x103/3927 x104/3928 x105/3929 x106/3930 x107/3931 - x108/3932 x109/3933 x110/3934 x111/3935 x112/3936 x113/3937 - x114/3938 x115/3939 x116/3940 x117/3941 x118/3942 x119/3943 - x120/3944 x121/3945 x122/3946 x123/3947 x124/3948 x125/3949 - x126/3950 : local - (function[L] {nlocal = 5} x127/3951 x128/3952 x129/3953 - x130/3954 x131/3955 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3825 x8/3832))) - two_splits/3956 = - (function[L] {nlocal = 126} x1/3957 x2/3958 x3/3959 x4/3960 - x5/3961 x6/3962 x7/3963 x8/3964 x9/3965 x10/3966 x11/3967 - x12/3968 x13/3969 x14/3970 x15/3971 x16/3972 x17/3973 - x18/3974 x19/3975 x20/3976 x21/3977 x22/3978 x23/3979 - x24/3980 x25/3981 x26/3982 x27/3983 x28/3984 x29/3985 - x30/3986 x31/3987 x32/3988 x33/3989 x34/3990 x35/3991 - x36/3992 x37/3993 x38/3994 x39/3995 x40/3996 x41/3997 - x42/3998 x43/3999 x44/4000 x45/4001 x46/4002 x47/4003 - x48/4004 x49/4005 x50/4006 x51/4007 x52/4008 x53/4009 - x54/4010 x55/4011 x56/4012 x57/4013 x58/4014 x59/4015 - x60/4016 x61/4017 x62/4018 x63/4019 x64/4020 x65/4021 - x66/4022 x67/4023 x68/4024 x69/4025 x70/4026 x71/4027 - x72/4028 x73/4029 x74/4030 x75/4031 x76/4032 x77/4033 - x78/4034 x79/4035 x80/4036 x81/4037 x82/4038 x83/4039 - x84/4040 x85/4041 x86/4042 x87/4043 x88/4044 x89/4045 - x90/4046 x91/4047 x92/4048 x93/4049 x94/4050 x95/4051 - x96/4052 x97/4053 x98/4054 x99/4055 x100/4056 x101/4057 - x102/4058 x103/4059 x104/4060 x105/4061 x106/4062 x107/4063 - x108/4064 x109/4065 x110/4066 x111/4067 x112/4068 x113/4069 - x114/4070 x115/4071 x116/4072 x117/4073 x118/4074 x119/4075 - x120/4076 x121/4077 x122/4078 x123/4079 x124/4080 x125/4081 - x126/4082 : local - (function[L] {nlocal = 126} x127/4083 x128/4084 x129/4085 - x130/4086 x131/4087 x132/4088 x133/4089 x134/4090 x135/4091 - x136/4092 x137/4093 x138/4094 x139/4095 x140/4096 x141/4097 - x142/4098 x143/4099 x144/4100 x145/4101 x146/4102 x147/4103 - x148/4104 x149/4105 x150/4106 x151/4107 x152/4108 x153/4109 - x154/4110 x155/4111 x156/4112 x157/4113 x158/4114 x159/4115 - x160/4116 x161/4117 x162/4118 x163/4119 x164/4120 x165/4121 - x166/4122 x167/4123 x168/4124 x169/4125 x170/4126 x171/4127 - x172/4128 x173/4129 x174/4130 x175/4131 x176/4132 x177/4133 - x178/4134 x179/4135 x180/4136 x181/4137 x182/4138 x183/4139 - x184/4140 x185/4141 x186/4142 x187/4143 x188/4144 x189/4145 - x190/4146 x191/4147 x192/4148 x193/4149 x194/4150 x195/4151 - x196/4152 x197/4153 x198/4154 x199/4155 x200/4156 x201/4157 - x202/4158 x203/4159 x204/4160 x205/4161 x206/4162 x207/4163 - x208/4164 x209/4165 x210/4166 x211/4167 x212/4168 x213/4169 - x214/4170 x215/4171 x216/4172 x217/4173 x218/4174 x219/4175 - x220/4176 x221/4177 x222/4178 x223/4179 x224/4180 x225/4181 - x226/4182 x227/4183 x228/4184 x229/4185 x230/4186 x231/4187 - x232/4188 x233/4189 x234/4190 x235/4191 x236/4192 x237/4193 - x238/4194 x239/4195 x240/4196 x241/4197 x242/4198 x243/4199 - x244/4200 x245/4201 x246/4202 x247/4203 x248/4204 x249/4205 - x250/4206 x251/4207 x252/4208 : local - (function[L] {nlocal = 6} x253/4209 x254/4210 x255/4211 - x256/4212 x257/4213 x258/4214 : int 0))) - two_splits__local_returning/4215 = - (function[L] {nlocal = 126} x1/4216 x2/4217 x3/4218 x4/4219 - x5/4220 x6/4221 x7/4222 x8/4223 x9/4224 x10/4225 x11/4226 - x12/4227 x13/4228 x14/4229 x15/4230 x16/4231 x17/4232 - x18/4233 x19/4234 x20/4235 x21/4236 x22/4237 x23/4238 - x24/4239 x25/4240 x26/4241 x27/4242 x28/4243 x29/4244 - x30/4245 x31/4246 x32/4247 x33/4248 x34/4249 x35/4250 - x36/4251 x37/4252 x38/4253 x39/4254 x40/4255 x41/4256 - x42/4257 x43/4258 x44/4259 x45/4260 x46/4261 x47/4262 - x48/4263 x49/4264 x50/4265 x51/4266 x52/4267 x53/4268 - x54/4269 x55/4270 x56/4271 x57/4272 x58/4273 x59/4274 - x60/4275 x61/4276 x62/4277 x63/4278 x64/4279 x65/4280 - x66/4281 x67/4282 x68/4283 x69/4284 x70/4285 x71/4286 - x72/4287 x73/4288 x74/4289 x75/4290 x76/4291 x77/4292 - x78/4293 x79/4294 x80/4295 x81/4296 x82/4297 x83/4298 - x84/4299 x85/4300 x86/4301 x87/4302 x88/4303 x89/4304 - x90/4305 x91/4306 x92/4307 x93/4308 x94/4309 x95/4310 - x96/4311 x97/4312 x98/4313 x99/4314 x100/4315 x101/4316 - x102/4317 x103/4318 x104/4319 x105/4320 x106/4321 x107/4322 - x108/4323 x109/4324 x110/4325 x111/4326 x112/4327 x113/4328 - x114/4329 x115/4330 x116/4331 x117/4332 x118/4333 x119/4334 - x120/4335 x121/4336 x122/4337 x123/4338 x124/4339 x125/4340 - x126/4341 : local - (function[L] {nlocal = 126} x127/4342 x128/4343 x129/4344 - x130/4345 x131/4346 x132/4347 x133/4348 x134/4349 x135/4350 - x136/4351 x137/4352 x138/4353 x139/4354 x140/4355 x141/4356 - x142/4357 x143/4358 x144/4359 x145/4360 x146/4361 x147/4362 - x148/4363 x149/4364 x150/4365 x151/4366 x152/4367 x153/4368 - x154/4369 x155/4370 x156/4371 x157/4372 x158/4373 x159/4374 - x160/4375 x161/4376 x162/4377 x163/4378 x164/4379 x165/4380 - x166/4381 x167/4382 x168/4383 x169/4384 x170/4385 x171/4386 - x172/4387 x173/4388 x174/4389 x175/4390 x176/4391 x177/4392 - x178/4393 x179/4394 x180/4395 x181/4396 x182/4397 x183/4398 - x184/4399 x185/4400 x186/4401 x187/4402 x188/4403 x189/4404 - x190/4405 x191/4406 x192/4407 x193/4408 x194/4409 x195/4410 - x196/4411 x197/4412 x198/4413 x199/4414 x200/4415 x201/4416 - x202/4417 x203/4418 x204/4419 x205/4420 x206/4421 x207/4422 - x208/4423 x209/4424 x210/4425 x211/4426 x212/4427 x213/4428 - x214/4429 x215/4430 x216/4431 x217/4432 x218/4433 x219/4434 - x220/4435 x221/4436 x222/4437 x223/4438 x224/4439 x225/4440 - x226/4441 x227/4442 x228/4443 x229/4444 x230/4445 x231/4446 - x232/4447 x233/4448 x234/4449 x235/4450 x236/4451 x237/4452 - x238/4453 x239/4454 x240/4455 x241/4456 x242/4457 x243/4458 - x244/4459 x245/4460 x246/4461 x247/4462 x248/4463 x249/4464 - x250/4465 x251/4466 x252/4467 : local - (function[L] {nlocal = 6} x253/4468 x254/4469 x255/4470 - x256/4471 x257/4472 x258/4473 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/4216 - x258/4473)))) - two_splits_local_param/4474 = - (function[L] {nlocal = 126} x1/4475 x2/4476 x3/4477 x4/4478 - x5/4479 x6/4480 x7/4481 x8/4482 x9/4483 x10/4484 x11/4485 - x12/4486 x13/4487 x14/4488 x15/4489 x16/4490 x17/4491 - x18/4492 x19/4493 x20/4494 x21/4495 x22/4496 x23/4497 - x24/4498 x25/4499 x26/4500 x27/4501 x28/4502 x29/4503 - x30/4504 x31/4505 x32/4506 x33/4507 x34/4508 x35/4509 - x36/4510 x37/4511 x38/4512 x39/4513 x40/4514 x41/4515 - x42/4516 x43/4517 x44/4518 x45/4519 x46/4520 x47/4521 - x48/4522 x49/4523 x50/4524 x51/4525 x52/4526 x53/4527 - x54/4528 x55/4529 x56/4530 x57/4531 x58/4532 x59/4533 - x60/4534 x61/4535 x62/4536 x63/4537 x64/4538 x65/4539 - x66/4540 x67/4541 x68/4542 x69/4543 x70/4544 x71/4545 - x72/4546 x73/4547 x74/4548 x75/4549 x76/4550 x77/4551 - x78/4552 x79/4553 x80/4554 x81/4555 x82/4556 x83/4557 - x84/4558 x85/4559 x86/4560 x87/4561 x88/4562 x89/4563 - x90/4564 x91/4565 x92/4566 x93/4567 x94/4568 x95/4569 - x96/4570 x97/4571 x98/4572 x99/4573 x100/4574 x101/4575 - x102/4576 x103/4577 x104/4578 x105/4579 x106/4580 x107/4581 - x108/4582 x109/4583 x110/4584 x111/4585 x112/4586 x113/4587 - x114/4588 x115/4589 x116/4590 x117/4591 x118/4592 x119/4593 - x120/4594 x121/4595 x122/4596 x123/4597 x124/4598 x125/4599 - x126/4600 : local - (function[L] {nlocal = 126} x127/4601 x128/4602 x129/4603 - x130/4604 x131/4605 x132/4606 x133/4607 x134/4608 x135/4609 - x136/4610 x137/4611 x138/4612 x139/4613 x140/4614 x141/4615 - x142/4616 x143/4617 x144/4618 x145/4619 x146/4620 x147/4621 - x148/4622 x149/4623 x150/4624 x151/4625 x152/4626[L] - x153/4627 x154/4628 x155/4629 x156/4630 x157/4631 x158/4632 - x159/4633 x160/4634 x161/4635 x162/4636 x163/4637 x164/4638 - x165/4639 x166/4640 x167/4641 x168/4642 x169/4643 x170/4644 - x171/4645 x172/4646 x173/4647 x174/4648 x175/4649 x176/4650 - x177/4651 x178/4652 x179/4653 x180/4654 x181/4655 x182/4656 - x183/4657 x184/4658 x185/4659 x186/4660 x187/4661 x188/4662 - x189/4663 x190/4664 x191/4665 x192/4666 x193/4667 x194/4668 - x195/4669 x196/4670 x197/4671 x198/4672 x199/4673 x200/4674 - x201/4675 x202/4676 x203/4677 x204/4678 x205/4679 x206/4680 - x207/4681 x208/4682 x209/4683 x210/4684 x211/4685 x212/4686 - x213/4687 x214/4688 x215/4689 x216/4690 x217/4691 x218/4692 - x219/4693 x220/4694 x221/4695 x222/4696 x223/4697 x224/4698 - x225/4699 x226/4700 x227/4701 x228/4702 x229/4703 x230/4704 - x231/4705 x232/4706 x233/4707 x234/4708 x235/4709 x236/4710 - x237/4711 x238/4712 x239/4713 x240/4714 x241/4715 x242/4716 - x243/4717 x244/4718 x245/4719 x246/4720 x247/4721 x248/4722 - x249/4723 x250/4724 x251/4725 x252/4726 : local - (function[L] {nlocal = 6} x253/4727 x254/4728 x255/4729 - x256/4730 x257/4731 x258/4732 : int 0))) - two_splits_local_param__local_returning/4733 = - (function[L] {nlocal = 126} x1/4734 x2/4735 x3/4736 x4/4737 - x5/4738 x6/4739 x7/4740 x8/4741 x9/4742 x10/4743 x11/4744 - x12/4745 x13/4746 x14/4747 x15/4748 x16/4749 x17/4750 - x18/4751 x19/4752 x20/4753 x21/4754 x22/4755 x23/4756 - x24/4757 x25/4758 x26/4759 x27/4760 x28/4761 x29/4762 - x30/4763 x31/4764 x32/4765 x33/4766 x34/4767 x35/4768 - x36/4769 x37/4770 x38/4771 x39/4772 x40/4773 x41/4774 - x42/4775 x43/4776 x44/4777 x45/4778 x46/4779 x47/4780 - x48/4781 x49/4782 x50/4783 x51/4784 x52/4785 x53/4786 - x54/4787 x55/4788 x56/4789 x57/4790 x58/4791 x59/4792 - x60/4793 x61/4794 x62/4795 x63/4796 x64/4797 x65/4798 - x66/4799 x67/4800 x68/4801 x69/4802 x70/4803 x71/4804 - x72/4805 x73/4806 x74/4807 x75/4808 x76/4809 x77/4810 - x78/4811 x79/4812 x80/4813 x81/4814 x82/4815 x83/4816 - x84/4817 x85/4818 x86/4819 x87/4820 x88/4821 x89/4822 - x90/4823 x91/4824 x92/4825 x93/4826 x94/4827 x95/4828 - x96/4829 x97/4830 x98/4831 x99/4832 x100/4833 x101/4834 - x102/4835 x103/4836 x104/4837 x105/4838 x106/4839 x107/4840 - x108/4841 x109/4842 x110/4843 x111/4844 x112/4845 x113/4846 - x114/4847 x115/4848 x116/4849 x117/4850 x118/4851 x119/4852 - x120/4853 x121/4854 x122/4855 x123/4856 x124/4857 x125/4858 - x126/4859 : local - (function[L] {nlocal = 126} x127/4860 x128/4861 x129/4862 - x130/4863 x131/4864 x132/4865 x133/4866 x134/4867 x135/4868 - x136/4869 x137/4870 x138/4871 x139/4872 x140/4873 x141/4874 - x142/4875 x143/4876 x144/4877 x145/4878 x146/4879 x147/4880 - x148/4881 x149/4882 x150/4883 x151/4884 x152/4885[L] - x153/4886 x154/4887 x155/4888 x156/4889 x157/4890 x158/4891 - x159/4892 x160/4893 x161/4894 x162/4895 x163/4896 x164/4897 - x165/4898 x166/4899 x167/4900 x168/4901 x169/4902 x170/4903 - x171/4904 x172/4905 x173/4906 x174/4907 x175/4908 x176/4909 - x177/4910 x178/4911 x179/4912 x180/4913 x181/4914 x182/4915 - x183/4916 x184/4917 x185/4918 x186/4919 x187/4920 x188/4921 - x189/4922 x190/4923 x191/4924 x192/4925 x193/4926 x194/4927 - x195/4928 x196/4929 x197/4930 x198/4931 x199/4932 x200/4933 - x201/4934 x202/4935 x203/4936 x204/4937 x205/4938 x206/4939 - x207/4940 x208/4941 x209/4942 x210/4943 x211/4944 x212/4945 - x213/4946 x214/4947 x215/4948 x216/4949 x217/4950 x218/4951 - x219/4952 x220/4953 x221/4954 x222/4955 x223/4956 x224/4957 - x225/4958 x226/4959 x227/4960 x228/4961 x229/4962 x230/4963 - x231/4964 x232/4965 x233/4966 x234/4967 x235/4968 x236/4969 - x237/4970 x238/4971 x239/4972 x240/4973 x241/4974 x242/4975 - x243/4976 x244/4977 x245/4978 x246/4979 x247/4980 x248/4981 - x249/4982 x250/4983 x251/4984 x252/4985 : local - (function[L] {nlocal = 6} x253/4986 x254/4987 x255/4988 - x256/4989 x257/4990 x258/4991 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/4734 - x152/4885))))) - (makelocalblock 0 no_local_params/2636 - no_local_params__local_returning/2768 - local_param_after_split/2900 - local_param_after_split__local_returning/3032 - local_param_just_after_split/3164 - local_param_just_after_split__local_returning/3296 - local_param_just_before_split/3428 - local_param_just_before_split__local_returning/3560 - local_param_before_split/3692 - local_param_before_split__local_returning/3824 two_splits/3956 - two_splits__local_returning/4215 two_splits_local_param/4474 - two_splits_local_param__local_returning/4733)))) - (setfield_ptr(root-init) 14 (global Max_arity_locals!) create_local/2634)) - 0) +(let + (no_local_params = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 0} x127 x128 x129 x130 x131 : int 0)) + no_local_params__local_returning = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 1} x127 x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 x2))) + local_param_after_split = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 2} x127 x128 x129 x130[L] x131 : int 0)) + local_param_after_split__local_returning = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 2} x127 x128 x129 x130[L] x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 x130))) + local_param_just_after_split = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 5} x127[L] x128 x129 x130 x131 : int 0)) + local_param_just_after_split__local_returning = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 5} x127[L] x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 x127))) + local_param_just_before_split = + (function {nlocal = 1} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126[L] + : local (function[L] {nlocal = 5} x127 x128 x129 x130 x131 : int 0)) + local_param_just_before_split__local_returning = + (function {nlocal = 1} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126[L] + : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 x126))) + local_param_before_split = + (function {nlocal = 119} x1 x2 x3 x4 x5 x6 x7 x8[L] x9 x10 x11 x12 x13 + x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 + x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 + x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 + x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 + x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 + x99 x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 + x113 x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + : local (function[L] {nlocal = 5} x127 x128 x129 x130 x131 : int 0)) + local_param_before_split__local_returning = + (function {nlocal = 119} x1 x2 x3 x4 x5 x6 x7 x8[L] x9 x10 x11 x12 x13 + x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 + x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 + x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 + x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 + x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 + x99 x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 + x113 x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 x8))) + two_splits = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 0} x127 x128 x129 x130 x131 x132 x133 x134 x135 + x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 x146 x147 x148 + x149 x150 x151 x152 x153 x154 x155 x156 x157 x158 x159 x160 x161 + x162 x163 x164 x165 x166 x167 x168 x169 x170 x171 x172 x173 x174 + x175 x176 x177 x178 x179 x180 x181 x182 x183 x184 x185 x186 x187 + x188 x189 x190 x191 x192 x193 x194 x195 x196 x197 x198 x199 x200 + x201 x202 x203 x204 x205 x206 x207 x208 x209 x210 x211 x212 x213 + x214 x215 x216 x217 x218 x219 x220 x221 x222 x223 x224 x225 x226 + x227 x228 x229 x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 + x240 x241 x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + (function {nlocal = 0} x253 x254 x255 x256 x257 x258 : int 0))) + two_splits__local_returning = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 0} x127 x128 x129 x130 x131 x132 x133 x134 x135 + x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 x146 x147 x148 + x149 x150 x151 x152 x153 x154 x155 x156 x157 x158 x159 x160 x161 + x162 x163 x164 x165 x166 x167 x168 x169 x170 x171 x172 x173 x174 + x175 x176 x177 x178 x179 x180 x181 x182 x183 x184 x185 x186 x187 + x188 x189 x190 x191 x192 x193 x194 x195 x196 x197 x198 x199 x200 + x201 x202 x203 x204 x205 x206 x207 x208 x209 x210 x211 x212 x213 + x214 x215 x216 x217 x218 x219 x220 x221 x222 x223 x224 x225 x226 + x227 x228 x229 x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 + x240 x241 x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + (function {nlocal = 1} x253 x254 x255 x256 x257 x258 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 x258)))) + two_splits_local_param = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 101} x127 x128 x129 x130 x131 x132 x133 x134 x135 + x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 x146 x147 x148 + x149 x150 x151 x152[L] x153 x154 x155 x156 x157 x158 x159 x160 x161 + x162 x163 x164 x165 x166 x167 x168 x169 x170 x171 x172 x173 x174 + x175 x176 x177 x178 x179 x180 x181 x182 x183 x184 x185 x186 x187 + x188 x189 x190 x191 x192 x193 x194 x195 x196 x197 x198 x199 x200 + x201 x202 x203 x204 x205 x206 x207 x208 x209 x210 x211 x212 x213 + x214 x215 x216 x217 x218 x219 x220 x221 x222 x223 x224 x225 x226 + x227 x228 x229 x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 + x240 x241 x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + : local + (function[L] {nlocal = 6} x253 x254 x255 x256 x257 x258 : int 0))) + two_splits_local_param__local_returning = + (function {nlocal = 0} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 + x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 + x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 + x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 + x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 + x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 + x100 x101 x102 x103 x104 x105 x106 x107 x108 x109 x110 x111 x112 x113 + x114 x115 x116 x117 x118 x119 x120 x121 x122 x123 x124 x125 x126 + (function {nlocal = 101} x127 x128 x129 x130 x131 x132 x133 x134 x135 + x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 x146 x147 x148 + x149 x150 x151 x152[L] x153 x154 x155 x156 x157 x158 x159 x160 x161 + x162 x163 x164 x165 x166 x167 x168 x169 x170 x171 x172 x173 x174 + x175 x176 x177 x178 x179 x180 x181 x182 x183 x184 x185 x186 x187 + x188 x189 x190 x191 x192 x193 x194 x195 x196 x197 x198 x199 x200 + x201 x202 x203 x204 x205 x206 x207 x208 x209 x210 x211 x212 x213 + x214 x215 x216 x217 x218 x219 x220 x221 x222 x223 x224 x225 x226 + x227 x228 x229 x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 + x240 x241 x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + : local + (function[L] {nlocal = 6} x253 x254 x255 x256 x257 x258 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 x152)))) + create_local = + (function {nlocal = 1} param[int] + [(consts ()) + (non_consts ([0: *, *, *, *, *, *, *, *, *, *, *, *, *, *]))] + (let + (no_local_params = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 : int 0)) + no_local_params__local_returning = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 + x2))) + local_param_after_split = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127 x128 x129 x130[L] x131 : int 0)) + local_param_after_split__local_returning = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127 x128 x129 x130[L] x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 + x130))) + local_param_just_after_split = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127[L] x128 x129 x130 x131 : int 0)) + local_param_just_after_split__local_returning = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127[L] x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 + x127))) + local_param_just_before_split = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126[L] : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 : int 0)) + local_param_just_before_split__local_returning = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126[L] : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 + x126))) + local_param_before_split = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8[L] x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 : int 0)) + local_param_before_split__local_returning = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8[L] x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 5} x127 x128 x129 x130 x131 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 + x8))) + two_splits = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 126} x127 x128 x129 x130 x131 x132 x133 + x134 x135 x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 + x146 x147 x148 x149 x150 x151 x152 x153 x154 x155 x156 x157 + x158 x159 x160 x161 x162 x163 x164 x165 x166 x167 x168 x169 + x170 x171 x172 x173 x174 x175 x176 x177 x178 x179 x180 x181 + x182 x183 x184 x185 x186 x187 x188 x189 x190 x191 x192 x193 + x194 x195 x196 x197 x198 x199 x200 x201 x202 x203 x204 x205 + x206 x207 x208 x209 x210 x211 x212 x213 x214 x215 x216 x217 + x218 x219 x220 x221 x222 x223 x224 x225 x226 x227 x228 x229 + x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 x240 x241 + x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + : local + (function[L] {nlocal = 6} x253 x254 x255 x256 x257 x258 : int + 0))) + two_splits__local_returning = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 126} x127 x128 x129 x130 x131 x132 x133 + x134 x135 x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 + x146 x147 x148 x149 x150 x151 x152 x153 x154 x155 x156 x157 + x158 x159 x160 x161 x162 x163 x164 x165 x166 x167 x168 x169 + x170 x171 x172 x173 x174 x175 x176 x177 x178 x179 x180 x181 + x182 x183 x184 x185 x186 x187 x188 x189 x190 x191 x192 x193 + x194 x195 x196 x197 x198 x199 x200 x201 x202 x203 x204 x205 + x206 x207 x208 x209 x210 x211 x212 x213 x214 x215 x216 x217 + x218 x219 x220 x221 x222 x223 x224 x225 x226 x227 x228 x229 + x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 x240 x241 + x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + : local + (function[L] {nlocal = 6} x253 x254 x255 x256 x257 x258 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 + x258)))) + two_splits_local_param = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 126} x127 x128 x129 x130 x131 x132 x133 + x134 x135 x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 + x146 x147 x148 x149 x150 x151 x152[L] x153 x154 x155 x156 + x157 x158 x159 x160 x161 x162 x163 x164 x165 x166 x167 x168 + x169 x170 x171 x172 x173 x174 x175 x176 x177 x178 x179 x180 + x181 x182 x183 x184 x185 x186 x187 x188 x189 x190 x191 x192 + x193 x194 x195 x196 x197 x198 x199 x200 x201 x202 x203 x204 + x205 x206 x207 x208 x209 x210 x211 x212 x213 x214 x215 x216 + x217 x218 x219 x220 x221 x222 x223 x224 x225 x226 x227 x228 + x229 x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 x240 + x241 x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + : local + (function[L] {nlocal = 6} x253 x254 x255 x256 x257 x258 : int + 0))) + two_splits_local_param__local_returning = + (function[L] {nlocal = 126} x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 + x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 + x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 + x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 + x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 + x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 + x92 x93 x94 x95 x96 x97 x98 x99 x100 x101 x102 x103 x104 x105 + x106 x107 x108 x109 x110 x111 x112 x113 x114 x115 x116 x117 + x118 x119 x120 x121 x122 x123 x124 x125 x126 : local + (function[L] {nlocal = 126} x127 x128 x129 x130 x131 x132 x133 + x134 x135 x136 x137 x138 x139 x140 x141 x142 x143 x144 x145 + x146 x147 x148 x149 x150 x151 x152[L] x153 x154 x155 x156 + x157 x158 x159 x160 x161 x162 x163 x164 x165 x166 x167 x168 + x169 x170 x171 x172 x173 x174 x175 x176 x177 x178 x179 x180 + x181 x182 x183 x184 x185 x186 x187 x188 x189 x190 x191 x192 + x193 x194 x195 x196 x197 x198 x199 x200 x201 x202 x203 x204 + x205 x206 x207 x208 x209 x210 x211 x212 x213 x214 x215 x216 + x217 x218 x219 x220 x221 x222 x223 x224 x225 x226 x227 x228 + x229 x230 x231 x232 x233 x234 x235 x236 x237 x238 x239 x240 + x241 x242 x243 x244 x245 x246 x247 x248 x249 x250 x251 x252 + : local + (function[L] {nlocal = 6} x253 x254 x255 x256 x257 x258 + [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1 + x152))))) + (makelocalblock 0 no_local_params no_local_params__local_returning + local_param_after_split local_param_after_split__local_returning + local_param_just_after_split + local_param_just_after_split__local_returning + local_param_just_before_split + local_param_just_before_split__local_returning + local_param_before_split local_param_before_split__local_returning + two_splits two_splits__local_returning two_splits_local_param + two_splits_local_param__local_returning)))) + (makeblock 0 no_local_params no_local_params__local_returning + local_param_after_split local_param_after_split__local_returning + local_param_just_after_split + local_param_just_after_split__local_returning + local_param_just_before_split + local_param_just_before_split__local_returning local_param_before_split + local_param_before_split__local_returning two_splits + two_splits__local_returning two_splits_local_param + two_splits_local_param__local_returning create_local)) diff --git a/testsuite/tests/syntactic-arity/max_arity_locals.flambda.reference b/testsuite/tests/syntactic-arity/max_arity_locals.flambda.reference deleted file mode 100644 index a86f45caf58..00000000000 --- a/testsuite/tests/syntactic-arity/max_arity_locals.flambda.reference +++ /dev/null @@ -1,843 +0,0 @@ -(let - (no_local_params/267 = - (function {nlocal = 0} x1/269 x2/270 x3/271 x4/272 x5/273 x6/274 x7/275 - x8/276 x9/277 x10/278 x11/279 x12/280 x13/281 x14/282 x15/283 x16/284 - x17/285 x18/286 x19/287 x20/288 x21/289 x22/290 x23/291 x24/292 - x25/293 x26/294 x27/295 x28/296 x29/297 x30/298 x31/299 x32/300 - x33/301 x34/302 x35/303 x36/304 x37/305 x38/306 x39/307 x40/308 - x41/309 x42/310 x43/311 x44/312 x45/313 x46/314 x47/315 x48/316 - x49/317 x50/318 x51/319 x52/320 x53/321 x54/322 x55/323 x56/324 - x57/325 x58/326 x59/327 x60/328 x61/329 x62/330 x63/331 x64/332 - x65/333 x66/334 x67/335 x68/336 x69/337 x70/338 x71/339 x72/340 - x73/341 x74/342 x75/343 x76/344 x77/345 x78/346 x79/347 x80/348 - x81/349 x82/350 x83/351 x84/352 x85/353 x86/354 x87/355 x88/356 - x89/357 x90/358 x91/359 x92/360 x93/361 x94/362 x95/363 x96/364 - x97/365 x98/366 x99/367 x100/368 x101/369 x102/370 x103/371 x104/372 - x105/373 x106/374 x107/375 x108/376 x109/377 x110/378 x111/379 - x112/380 x113/381 x114/382 x115/383 x116/384 x117/385 x118/386 - x119/387 x120/388 x121/389 x122/390 x123/391 x124/392 x125/393 - x126/394 - (function {nlocal = 0} x127/395 x128/396 x129/397 x130/398 x131/399 - : int 0)) - no_local_params__local_returning/400 = - (function {nlocal = 0} x1/402 x2/403 x3/404 x4/405 x5/406 x6/407 x7/408 - x8/409 x9/410 x10/411 x11/412 x12/413 x13/414 x14/415 x15/416 x16/417 - x17/418 x18/419 x19/420 x20/421 x21/422 x22/423 x23/424 x24/425 - x25/426 x26/427 x27/428 x28/429 x29/430 x30/431 x31/432 x32/433 - x33/434 x34/435 x35/436 x36/437 x37/438 x38/439 x39/440 x40/441 - x41/442 x42/443 x43/444 x44/445 x45/446 x46/447 x47/448 x48/449 - x49/450 x50/451 x51/452 x52/453 x53/454 x54/455 x55/456 x56/457 - x57/458 x58/459 x59/460 x60/461 x61/462 x62/463 x63/464 x64/465 - x65/466 x66/467 x67/468 x68/469 x69/470 x70/471 x71/472 x72/473 - x73/474 x74/475 x75/476 x76/477 x77/478 x78/479 x79/480 x80/481 - x81/482 x82/483 x83/484 x84/485 x85/486 x86/487 x87/488 x88/489 - x89/490 x90/491 x91/492 x92/493 x93/494 x94/495 x95/496 x96/497 - x97/498 x98/499 x99/500 x100/501 x101/502 x102/503 x103/504 x104/505 - x105/506 x106/507 x107/508 x108/509 x109/510 x110/511 x111/512 - x112/513 x113/514 x114/515 x115/516 x116/517 x117/518 x118/519 - x119/520 x120/521 x121/522 x122/523 x123/524 x124/525 x125/526 - x126/527 - (function {nlocal = 1} x127/528 x128/529 x129/530 x130/531 x131/532 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/402 - x2/403))) - local_param_after_split/533 = - (function {nlocal = 0} x1/535 x2/536 x3/537 x4/538 x5/539 x6/540 x7/541 - x8/542 x9/543 x10/544 x11/545 x12/546 x13/547 x14/548 x15/549 x16/550 - x17/551 x18/552 x19/553 x20/554 x21/555 x22/556 x23/557 x24/558 - x25/559 x26/560 x27/561 x28/562 x29/563 x30/564 x31/565 x32/566 - x33/567 x34/568 x35/569 x36/570 x37/571 x38/572 x39/573 x40/574 - x41/575 x42/576 x43/577 x44/578 x45/579 x46/580 x47/581 x48/582 - x49/583 x50/584 x51/585 x52/586 x53/587 x54/588 x55/589 x56/590 - x57/591 x58/592 x59/593 x60/594 x61/595 x62/596 x63/597 x64/598 - x65/599 x66/600 x67/601 x68/602 x69/603 x70/604 x71/605 x72/606 - x73/607 x74/608 x75/609 x76/610 x77/611 x78/612 x79/613 x80/614 - x81/615 x82/616 x83/617 x84/618 x85/619 x86/620 x87/621 x88/622 - x89/623 x90/624 x91/625 x92/626 x93/627 x94/628 x95/629 x96/630 - x97/631 x98/632 x99/633 x100/634 x101/635 x102/636 x103/637 x104/638 - x105/639 x106/640 x107/641 x108/642 x109/643 x110/644 x111/645 - x112/646 x113/647 x114/648 x115/649 x116/650 x117/651 x118/652 - x119/653 x120/654 x121/655 x122/656 x123/657 x124/658 x125/659 - x126/660 - (function {nlocal = 2} x127/661 x128/662 x129/663 x130/664[L] x131/665 - : int 0)) - local_param_after_split__local_returning/666 = - (function {nlocal = 0} x1/668 x2/669 x3/670 x4/671 x5/672 x6/673 x7/674 - x8/675 x9/676 x10/677 x11/678 x12/679 x13/680 x14/681 x15/682 x16/683 - x17/684 x18/685 x19/686 x20/687 x21/688 x22/689 x23/690 x24/691 - x25/692 x26/693 x27/694 x28/695 x29/696 x30/697 x31/698 x32/699 - x33/700 x34/701 x35/702 x36/703 x37/704 x38/705 x39/706 x40/707 - x41/708 x42/709 x43/710 x44/711 x45/712 x46/713 x47/714 x48/715 - x49/716 x50/717 x51/718 x52/719 x53/720 x54/721 x55/722 x56/723 - x57/724 x58/725 x59/726 x60/727 x61/728 x62/729 x63/730 x64/731 - x65/732 x66/733 x67/734 x68/735 x69/736 x70/737 x71/738 x72/739 - x73/740 x74/741 x75/742 x76/743 x77/744 x78/745 x79/746 x80/747 - x81/748 x82/749 x83/750 x84/751 x85/752 x86/753 x87/754 x88/755 - x89/756 x90/757 x91/758 x92/759 x93/760 x94/761 x95/762 x96/763 - x97/764 x98/765 x99/766 x100/767 x101/768 x102/769 x103/770 x104/771 - x105/772 x106/773 x107/774 x108/775 x109/776 x110/777 x111/778 - x112/779 x113/780 x114/781 x115/782 x116/783 x117/784 x118/785 - x119/786 x120/787 x121/788 x122/789 x123/790 x124/791 x125/792 - x126/793 - (function {nlocal = 2} x127/794 x128/795 x129/796 x130/797[L] x131/798 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/668 - x130/797))) - local_param_just_after_split/799 = - (function {nlocal = 0} x1/801 x2/802 x3/803 x4/804 x5/805 x6/806 x7/807 - x8/808 x9/809 x10/810 x11/811 x12/812 x13/813 x14/814 x15/815 x16/816 - x17/817 x18/818 x19/819 x20/820 x21/821 x22/822 x23/823 x24/824 - x25/825 x26/826 x27/827 x28/828 x29/829 x30/830 x31/831 x32/832 - x33/833 x34/834 x35/835 x36/836 x37/837 x38/838 x39/839 x40/840 - x41/841 x42/842 x43/843 x44/844 x45/845 x46/846 x47/847 x48/848 - x49/849 x50/850 x51/851 x52/852 x53/853 x54/854 x55/855 x56/856 - x57/857 x58/858 x59/859 x60/860 x61/861 x62/862 x63/863 x64/864 - x65/865 x66/866 x67/867 x68/868 x69/869 x70/870 x71/871 x72/872 - x73/873 x74/874 x75/875 x76/876 x77/877 x78/878 x79/879 x80/880 - x81/881 x82/882 x83/883 x84/884 x85/885 x86/886 x87/887 x88/888 - x89/889 x90/890 x91/891 x92/892 x93/893 x94/894 x95/895 x96/896 - x97/897 x98/898 x99/899 x100/900 x101/901 x102/902 x103/903 x104/904 - x105/905 x106/906 x107/907 x108/908 x109/909 x110/910 x111/911 - x112/912 x113/913 x114/914 x115/915 x116/916 x117/917 x118/918 - x119/919 x120/920 x121/921 x122/922 x123/923 x124/924 x125/925 - x126/926 - (function {nlocal = 5} x127/927[L] x128/928 x129/929 x130/930 x131/931 - : int 0)) - local_param_just_after_split__local_returning/932 = - (function {nlocal = 0} x1/934 x2/935 x3/936 x4/937 x5/938 x6/939 x7/940 - x8/941 x9/942 x10/943 x11/944 x12/945 x13/946 x14/947 x15/948 x16/949 - x17/950 x18/951 x19/952 x20/953 x21/954 x22/955 x23/956 x24/957 - x25/958 x26/959 x27/960 x28/961 x29/962 x30/963 x31/964 x32/965 - x33/966 x34/967 x35/968 x36/969 x37/970 x38/971 x39/972 x40/973 - x41/974 x42/975 x43/976 x44/977 x45/978 x46/979 x47/980 x48/981 - x49/982 x50/983 x51/984 x52/985 x53/986 x54/987 x55/988 x56/989 - x57/990 x58/991 x59/992 x60/993 x61/994 x62/995 x63/996 x64/997 - x65/998 x66/999 x67/1000 x68/1001 x69/1002 x70/1003 x71/1004 x72/1005 - x73/1006 x74/1007 x75/1008 x76/1009 x77/1010 x78/1011 x79/1012 - x80/1013 x81/1014 x82/1015 x83/1016 x84/1017 x85/1018 x86/1019 - x87/1020 x88/1021 x89/1022 x90/1023 x91/1024 x92/1025 x93/1026 - x94/1027 x95/1028 x96/1029 x97/1030 x98/1031 x99/1032 x100/1033 - x101/1034 x102/1035 x103/1036 x104/1037 x105/1038 x106/1039 x107/1040 - x108/1041 x109/1042 x110/1043 x111/1044 x112/1045 x113/1046 x114/1047 - x115/1048 x116/1049 x117/1050 x118/1051 x119/1052 x120/1053 x121/1054 - x122/1055 x123/1056 x124/1057 x125/1058 x126/1059 - (function {nlocal = 5} x127/1060[L] x128/1061 x129/1062 x130/1063 - x131/1064 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/934 - x127/1060))) - local_param_just_before_split/1065 = - (function {nlocal = 1} x1/1067 x2/1068 x3/1069 x4/1070 x5/1071 x6/1072 - x7/1073 x8/1074 x9/1075 x10/1076 x11/1077 x12/1078 x13/1079 x14/1080 - x15/1081 x16/1082 x17/1083 x18/1084 x19/1085 x20/1086 x21/1087 - x22/1088 x23/1089 x24/1090 x25/1091 x26/1092 x27/1093 x28/1094 - x29/1095 x30/1096 x31/1097 x32/1098 x33/1099 x34/1100 x35/1101 - x36/1102 x37/1103 x38/1104 x39/1105 x40/1106 x41/1107 x42/1108 - x43/1109 x44/1110 x45/1111 x46/1112 x47/1113 x48/1114 x49/1115 - x50/1116 x51/1117 x52/1118 x53/1119 x54/1120 x55/1121 x56/1122 - x57/1123 x58/1124 x59/1125 x60/1126 x61/1127 x62/1128 x63/1129 - x64/1130 x65/1131 x66/1132 x67/1133 x68/1134 x69/1135 x70/1136 - x71/1137 x72/1138 x73/1139 x74/1140 x75/1141 x76/1142 x77/1143 - x78/1144 x79/1145 x80/1146 x81/1147 x82/1148 x83/1149 x84/1150 - x85/1151 x86/1152 x87/1153 x88/1154 x89/1155 x90/1156 x91/1157 - x92/1158 x93/1159 x94/1160 x95/1161 x96/1162 x97/1163 x98/1164 - x99/1165 x100/1166 x101/1167 x102/1168 x103/1169 x104/1170 x105/1171 - x106/1172 x107/1173 x108/1174 x109/1175 x110/1176 x111/1177 x112/1178 - x113/1179 x114/1180 x115/1181 x116/1182 x117/1183 x118/1184 x119/1185 - x120/1186 x121/1187 x122/1188 x123/1189 x124/1190 x125/1191 - x126/1192[L] : local - (function[L] {nlocal = 5} x127/1193 x128/1194 x129/1195 x130/1196 - x131/1197 : int 0)) - local_param_just_before_split__local_returning/1198 = - (function {nlocal = 1} x1/1200 x2/1201 x3/1202 x4/1203 x5/1204 x6/1205 - x7/1206 x8/1207 x9/1208 x10/1209 x11/1210 x12/1211 x13/1212 x14/1213 - x15/1214 x16/1215 x17/1216 x18/1217 x19/1218 x20/1219 x21/1220 - x22/1221 x23/1222 x24/1223 x25/1224 x26/1225 x27/1226 x28/1227 - x29/1228 x30/1229 x31/1230 x32/1231 x33/1232 x34/1233 x35/1234 - x36/1235 x37/1236 x38/1237 x39/1238 x40/1239 x41/1240 x42/1241 - x43/1242 x44/1243 x45/1244 x46/1245 x47/1246 x48/1247 x49/1248 - x50/1249 x51/1250 x52/1251 x53/1252 x54/1253 x55/1254 x56/1255 - x57/1256 x58/1257 x59/1258 x60/1259 x61/1260 x62/1261 x63/1262 - x64/1263 x65/1264 x66/1265 x67/1266 x68/1267 x69/1268 x70/1269 - x71/1270 x72/1271 x73/1272 x74/1273 x75/1274 x76/1275 x77/1276 - x78/1277 x79/1278 x80/1279 x81/1280 x82/1281 x83/1282 x84/1283 - x85/1284 x86/1285 x87/1286 x88/1287 x89/1288 x90/1289 x91/1290 - x92/1291 x93/1292 x94/1293 x95/1294 x96/1295 x97/1296 x98/1297 - x99/1298 x100/1299 x101/1300 x102/1301 x103/1302 x104/1303 x105/1304 - x106/1305 x107/1306 x108/1307 x109/1308 x110/1309 x111/1310 x112/1311 - x113/1312 x114/1313 x115/1314 x116/1315 x117/1316 x118/1317 x119/1318 - x120/1319 x121/1320 x122/1321 x123/1322 x124/1323 x125/1324 - x126/1325[L] : local - (function[L] {nlocal = 5} x127/1326 x128/1327 x129/1328 x130/1329 - x131/1330 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/1200 - x126/1325))) - local_param_before_split/1331 = - (function {nlocal = 119} x1/1333 x2/1334 x3/1335 x4/1336 x5/1337 x6/1338 - x7/1339 x8/1340[L] x9/1341 x10/1342 x11/1343 x12/1344 x13/1345 - x14/1346 x15/1347 x16/1348 x17/1349 x18/1350 x19/1351 x20/1352 - x21/1353 x22/1354 x23/1355 x24/1356 x25/1357 x26/1358 x27/1359 - x28/1360 x29/1361 x30/1362 x31/1363 x32/1364 x33/1365 x34/1366 - x35/1367 x36/1368 x37/1369 x38/1370 x39/1371 x40/1372 x41/1373 - x42/1374 x43/1375 x44/1376 x45/1377 x46/1378 x47/1379 x48/1380 - x49/1381 x50/1382 x51/1383 x52/1384 x53/1385 x54/1386 x55/1387 - x56/1388 x57/1389 x58/1390 x59/1391 x60/1392 x61/1393 x62/1394 - x63/1395 x64/1396 x65/1397 x66/1398 x67/1399 x68/1400 x69/1401 - x70/1402 x71/1403 x72/1404 x73/1405 x74/1406 x75/1407 x76/1408 - x77/1409 x78/1410 x79/1411 x80/1412 x81/1413 x82/1414 x83/1415 - x84/1416 x85/1417 x86/1418 x87/1419 x88/1420 x89/1421 x90/1422 - x91/1423 x92/1424 x93/1425 x94/1426 x95/1427 x96/1428 x97/1429 - x98/1430 x99/1431 x100/1432 x101/1433 x102/1434 x103/1435 x104/1436 - x105/1437 x106/1438 x107/1439 x108/1440 x109/1441 x110/1442 x111/1443 - x112/1444 x113/1445 x114/1446 x115/1447 x116/1448 x117/1449 x118/1450 - x119/1451 x120/1452 x121/1453 x122/1454 x123/1455 x124/1456 x125/1457 - x126/1458 : local - (function[L] {nlocal = 5} x127/1459 x128/1460 x129/1461 x130/1462 - x131/1463 : int 0)) - local_param_before_split__local_returning/1464 = - (function {nlocal = 119} x1/1466 x2/1467 x3/1468 x4/1469 x5/1470 x6/1471 - x7/1472 x8/1473[L] x9/1474 x10/1475 x11/1476 x12/1477 x13/1478 - x14/1479 x15/1480 x16/1481 x17/1482 x18/1483 x19/1484 x20/1485 - x21/1486 x22/1487 x23/1488 x24/1489 x25/1490 x26/1491 x27/1492 - x28/1493 x29/1494 x30/1495 x31/1496 x32/1497 x33/1498 x34/1499 - x35/1500 x36/1501 x37/1502 x38/1503 x39/1504 x40/1505 x41/1506 - x42/1507 x43/1508 x44/1509 x45/1510 x46/1511 x47/1512 x48/1513 - x49/1514 x50/1515 x51/1516 x52/1517 x53/1518 x54/1519 x55/1520 - x56/1521 x57/1522 x58/1523 x59/1524 x60/1525 x61/1526 x62/1527 - x63/1528 x64/1529 x65/1530 x66/1531 x67/1532 x68/1533 x69/1534 - x70/1535 x71/1536 x72/1537 x73/1538 x74/1539 x75/1540 x76/1541 - x77/1542 x78/1543 x79/1544 x80/1545 x81/1546 x82/1547 x83/1548 - x84/1549 x85/1550 x86/1551 x87/1552 x88/1553 x89/1554 x90/1555 - x91/1556 x92/1557 x93/1558 x94/1559 x95/1560 x96/1561 x97/1562 - x98/1563 x99/1564 x100/1565 x101/1566 x102/1567 x103/1568 x104/1569 - x105/1570 x106/1571 x107/1572 x108/1573 x109/1574 x110/1575 x111/1576 - x112/1577 x113/1578 x114/1579 x115/1580 x116/1581 x117/1582 x118/1583 - x119/1584 x120/1585 x121/1586 x122/1587 x123/1588 x124/1589 x125/1590 - x126/1591 : local - (function[L] {nlocal = 5} x127/1592 x128/1593 x129/1594 x130/1595 - x131/1596 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/1466 - x8/1473))) - two_splits/1597 = - (function {nlocal = 0} x1/1599 x2/1600 x3/1601 x4/1602 x5/1603 x6/1604 - x7/1605 x8/1606 x9/1607 x10/1608 x11/1609 x12/1610 x13/1611 x14/1612 - x15/1613 x16/1614 x17/1615 x18/1616 x19/1617 x20/1618 x21/1619 - x22/1620 x23/1621 x24/1622 x25/1623 x26/1624 x27/1625 x28/1626 - x29/1627 x30/1628 x31/1629 x32/1630 x33/1631 x34/1632 x35/1633 - x36/1634 x37/1635 x38/1636 x39/1637 x40/1638 x41/1639 x42/1640 - x43/1641 x44/1642 x45/1643 x46/1644 x47/1645 x48/1646 x49/1647 - x50/1648 x51/1649 x52/1650 x53/1651 x54/1652 x55/1653 x56/1654 - x57/1655 x58/1656 x59/1657 x60/1658 x61/1659 x62/1660 x63/1661 - x64/1662 x65/1663 x66/1664 x67/1665 x68/1666 x69/1667 x70/1668 - x71/1669 x72/1670 x73/1671 x74/1672 x75/1673 x76/1674 x77/1675 - x78/1676 x79/1677 x80/1678 x81/1679 x82/1680 x83/1681 x84/1682 - x85/1683 x86/1684 x87/1685 x88/1686 x89/1687 x90/1688 x91/1689 - x92/1690 x93/1691 x94/1692 x95/1693 x96/1694 x97/1695 x98/1696 - x99/1697 x100/1698 x101/1699 x102/1700 x103/1701 x104/1702 x105/1703 - x106/1704 x107/1705 x108/1706 x109/1707 x110/1708 x111/1709 x112/1710 - x113/1711 x114/1712 x115/1713 x116/1714 x117/1715 x118/1716 x119/1717 - x120/1718 x121/1719 x122/1720 x123/1721 x124/1722 x125/1723 x126/1724 - (function {nlocal = 0} x127/1725 x128/1726 x129/1727 x130/1728 - x131/1729 x132/1730 x133/1731 x134/1732 x135/1733 x136/1734 - x137/1735 x138/1736 x139/1737 x140/1738 x141/1739 x142/1740 - x143/1741 x144/1742 x145/1743 x146/1744 x147/1745 x148/1746 - x149/1747 x150/1748 x151/1749 x152/1750 x153/1751 x154/1752 - x155/1753 x156/1754 x157/1755 x158/1756 x159/1757 x160/1758 - x161/1759 x162/1760 x163/1761 x164/1762 x165/1763 x166/1764 - x167/1765 x168/1766 x169/1767 x170/1768 x171/1769 x172/1770 - x173/1771 x174/1772 x175/1773 x176/1774 x177/1775 x178/1776 - x179/1777 x180/1778 x181/1779 x182/1780 x183/1781 x184/1782 - x185/1783 x186/1784 x187/1785 x188/1786 x189/1787 x190/1788 - x191/1789 x192/1790 x193/1791 x194/1792 x195/1793 x196/1794 - x197/1795 x198/1796 x199/1797 x200/1798 x201/1799 x202/1800 - x203/1801 x204/1802 x205/1803 x206/1804 x207/1805 x208/1806 - x209/1807 x210/1808 x211/1809 x212/1810 x213/1811 x214/1812 - x215/1813 x216/1814 x217/1815 x218/1816 x219/1817 x220/1818 - x221/1819 x222/1820 x223/1821 x224/1822 x225/1823 x226/1824 - x227/1825 x228/1826 x229/1827 x230/1828 x231/1829 x232/1830 - x233/1831 x234/1832 x235/1833 x236/1834 x237/1835 x238/1836 - x239/1837 x240/1838 x241/1839 x242/1840 x243/1841 x244/1842 - x245/1843 x246/1844 x247/1845 x248/1846 x249/1847 x250/1848 - x251/1849 x252/1850 - (function {nlocal = 0} x253/1851 x254/1852 x255/1853 x256/1854 - x257/1855 x258/1856 : int 0))) - two_splits__local_returning/1857 = - (function {nlocal = 0} x1/1859 x2/1860 x3/1861 x4/1862 x5/1863 x6/1864 - x7/1865 x8/1866 x9/1867 x10/1868 x11/1869 x12/1870 x13/1871 x14/1872 - x15/1873 x16/1874 x17/1875 x18/1876 x19/1877 x20/1878 x21/1879 - x22/1880 x23/1881 x24/1882 x25/1883 x26/1884 x27/1885 x28/1886 - x29/1887 x30/1888 x31/1889 x32/1890 x33/1891 x34/1892 x35/1893 - x36/1894 x37/1895 x38/1896 x39/1897 x40/1898 x41/1899 x42/1900 - x43/1901 x44/1902 x45/1903 x46/1904 x47/1905 x48/1906 x49/1907 - x50/1908 x51/1909 x52/1910 x53/1911 x54/1912 x55/1913 x56/1914 - x57/1915 x58/1916 x59/1917 x60/1918 x61/1919 x62/1920 x63/1921 - x64/1922 x65/1923 x66/1924 x67/1925 x68/1926 x69/1927 x70/1928 - x71/1929 x72/1930 x73/1931 x74/1932 x75/1933 x76/1934 x77/1935 - x78/1936 x79/1937 x80/1938 x81/1939 x82/1940 x83/1941 x84/1942 - x85/1943 x86/1944 x87/1945 x88/1946 x89/1947 x90/1948 x91/1949 - x92/1950 x93/1951 x94/1952 x95/1953 x96/1954 x97/1955 x98/1956 - x99/1957 x100/1958 x101/1959 x102/1960 x103/1961 x104/1962 x105/1963 - x106/1964 x107/1965 x108/1966 x109/1967 x110/1968 x111/1969 x112/1970 - x113/1971 x114/1972 x115/1973 x116/1974 x117/1975 x118/1976 x119/1977 - x120/1978 x121/1979 x122/1980 x123/1981 x124/1982 x125/1983 x126/1984 - (function {nlocal = 0} x127/1985 x128/1986 x129/1987 x130/1988 - x131/1989 x132/1990 x133/1991 x134/1992 x135/1993 x136/1994 - x137/1995 x138/1996 x139/1997 x140/1998 x141/1999 x142/2000 - x143/2001 x144/2002 x145/2003 x146/2004 x147/2005 x148/2006 - x149/2007 x150/2008 x151/2009 x152/2010 x153/2011 x154/2012 - x155/2013 x156/2014 x157/2015 x158/2016 x159/2017 x160/2018 - x161/2019 x162/2020 x163/2021 x164/2022 x165/2023 x166/2024 - x167/2025 x168/2026 x169/2027 x170/2028 x171/2029 x172/2030 - x173/2031 x174/2032 x175/2033 x176/2034 x177/2035 x178/2036 - x179/2037 x180/2038 x181/2039 x182/2040 x183/2041 x184/2042 - x185/2043 x186/2044 x187/2045 x188/2046 x189/2047 x190/2048 - x191/2049 x192/2050 x193/2051 x194/2052 x195/2053 x196/2054 - x197/2055 x198/2056 x199/2057 x200/2058 x201/2059 x202/2060 - x203/2061 x204/2062 x205/2063 x206/2064 x207/2065 x208/2066 - x209/2067 x210/2068 x211/2069 x212/2070 x213/2071 x214/2072 - x215/2073 x216/2074 x217/2075 x218/2076 x219/2077 x220/2078 - x221/2079 x222/2080 x223/2081 x224/2082 x225/2083 x226/2084 - x227/2085 x228/2086 x229/2087 x230/2088 x231/2089 x232/2090 - x233/2091 x234/2092 x235/2093 x236/2094 x237/2095 x238/2096 - x239/2097 x240/2098 x241/2099 x242/2100 x243/2101 x244/2102 - x245/2103 x246/2104 x247/2105 x248/2106 x249/2107 x250/2108 - x251/2109 x252/2110 - (function {nlocal = 1} x253/2111 x254/2112 x255/2113 x256/2114 - x257/2115 x258/2116 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/1859 - x258/2116)))) - two_splits_local_param/2117 = - (function {nlocal = 0} x1/2119 x2/2120 x3/2121 x4/2122 x5/2123 x6/2124 - x7/2125 x8/2126 x9/2127 x10/2128 x11/2129 x12/2130 x13/2131 x14/2132 - x15/2133 x16/2134 x17/2135 x18/2136 x19/2137 x20/2138 x21/2139 - x22/2140 x23/2141 x24/2142 x25/2143 x26/2144 x27/2145 x28/2146 - x29/2147 x30/2148 x31/2149 x32/2150 x33/2151 x34/2152 x35/2153 - x36/2154 x37/2155 x38/2156 x39/2157 x40/2158 x41/2159 x42/2160 - x43/2161 x44/2162 x45/2163 x46/2164 x47/2165 x48/2166 x49/2167 - x50/2168 x51/2169 x52/2170 x53/2171 x54/2172 x55/2173 x56/2174 - x57/2175 x58/2176 x59/2177 x60/2178 x61/2179 x62/2180 x63/2181 - x64/2182 x65/2183 x66/2184 x67/2185 x68/2186 x69/2187 x70/2188 - x71/2189 x72/2190 x73/2191 x74/2192 x75/2193 x76/2194 x77/2195 - x78/2196 x79/2197 x80/2198 x81/2199 x82/2200 x83/2201 x84/2202 - x85/2203 x86/2204 x87/2205 x88/2206 x89/2207 x90/2208 x91/2209 - x92/2210 x93/2211 x94/2212 x95/2213 x96/2214 x97/2215 x98/2216 - x99/2217 x100/2218 x101/2219 x102/2220 x103/2221 x104/2222 x105/2223 - x106/2224 x107/2225 x108/2226 x109/2227 x110/2228 x111/2229 x112/2230 - x113/2231 x114/2232 x115/2233 x116/2234 x117/2235 x118/2236 x119/2237 - x120/2238 x121/2239 x122/2240 x123/2241 x124/2242 x125/2243 x126/2244 - (function {nlocal = 101} x127/2245 x128/2246 x129/2247 x130/2248 - x131/2249 x132/2250 x133/2251 x134/2252 x135/2253 x136/2254 - x137/2255 x138/2256 x139/2257 x140/2258 x141/2259 x142/2260 - x143/2261 x144/2262 x145/2263 x146/2264 x147/2265 x148/2266 - x149/2267 x150/2268 x151/2269 x152/2270[L] x153/2271 x154/2272 - x155/2273 x156/2274 x157/2275 x158/2276 x159/2277 x160/2278 - x161/2279 x162/2280 x163/2281 x164/2282 x165/2283 x166/2284 - x167/2285 x168/2286 x169/2287 x170/2288 x171/2289 x172/2290 - x173/2291 x174/2292 x175/2293 x176/2294 x177/2295 x178/2296 - x179/2297 x180/2298 x181/2299 x182/2300 x183/2301 x184/2302 - x185/2303 x186/2304 x187/2305 x188/2306 x189/2307 x190/2308 - x191/2309 x192/2310 x193/2311 x194/2312 x195/2313 x196/2314 - x197/2315 x198/2316 x199/2317 x200/2318 x201/2319 x202/2320 - x203/2321 x204/2322 x205/2323 x206/2324 x207/2325 x208/2326 - x209/2327 x210/2328 x211/2329 x212/2330 x213/2331 x214/2332 - x215/2333 x216/2334 x217/2335 x218/2336 x219/2337 x220/2338 - x221/2339 x222/2340 x223/2341 x224/2342 x225/2343 x226/2344 - x227/2345 x228/2346 x229/2347 x230/2348 x231/2349 x232/2350 - x233/2351 x234/2352 x235/2353 x236/2354 x237/2355 x238/2356 - x239/2357 x240/2358 x241/2359 x242/2360 x243/2361 x244/2362 - x245/2363 x246/2364 x247/2365 x248/2366 x249/2367 x250/2368 - x251/2369 x252/2370 : local - (function[L] {nlocal = 6} x253/2371 x254/2372 x255/2373 x256/2374 - x257/2375 x258/2376 : int 0))) - two_splits_local_param__local_returning/2377 = - (function {nlocal = 0} x1/2379 x2/2380 x3/2381 x4/2382 x5/2383 x6/2384 - x7/2385 x8/2386 x9/2387 x10/2388 x11/2389 x12/2390 x13/2391 x14/2392 - x15/2393 x16/2394 x17/2395 x18/2396 x19/2397 x20/2398 x21/2399 - x22/2400 x23/2401 x24/2402 x25/2403 x26/2404 x27/2405 x28/2406 - x29/2407 x30/2408 x31/2409 x32/2410 x33/2411 x34/2412 x35/2413 - x36/2414 x37/2415 x38/2416 x39/2417 x40/2418 x41/2419 x42/2420 - x43/2421 x44/2422 x45/2423 x46/2424 x47/2425 x48/2426 x49/2427 - x50/2428 x51/2429 x52/2430 x53/2431 x54/2432 x55/2433 x56/2434 - x57/2435 x58/2436 x59/2437 x60/2438 x61/2439 x62/2440 x63/2441 - x64/2442 x65/2443 x66/2444 x67/2445 x68/2446 x69/2447 x70/2448 - x71/2449 x72/2450 x73/2451 x74/2452 x75/2453 x76/2454 x77/2455 - x78/2456 x79/2457 x80/2458 x81/2459 x82/2460 x83/2461 x84/2462 - x85/2463 x86/2464 x87/2465 x88/2466 x89/2467 x90/2468 x91/2469 - x92/2470 x93/2471 x94/2472 x95/2473 x96/2474 x97/2475 x98/2476 - x99/2477 x100/2478 x101/2479 x102/2480 x103/2481 x104/2482 x105/2483 - x106/2484 x107/2485 x108/2486 x109/2487 x110/2488 x111/2489 x112/2490 - x113/2491 x114/2492 x115/2493 x116/2494 x117/2495 x118/2496 x119/2497 - x120/2498 x121/2499 x122/2500 x123/2501 x124/2502 x125/2503 x126/2504 - (function {nlocal = 101} x127/2505 x128/2506 x129/2507 x130/2508 - x131/2509 x132/2510 x133/2511 x134/2512 x135/2513 x136/2514 - x137/2515 x138/2516 x139/2517 x140/2518 x141/2519 x142/2520 - x143/2521 x144/2522 x145/2523 x146/2524 x147/2525 x148/2526 - x149/2527 x150/2528 x151/2529 x152/2530[L] x153/2531 x154/2532 - x155/2533 x156/2534 x157/2535 x158/2536 x159/2537 x160/2538 - x161/2539 x162/2540 x163/2541 x164/2542 x165/2543 x166/2544 - x167/2545 x168/2546 x169/2547 x170/2548 x171/2549 x172/2550 - x173/2551 x174/2552 x175/2553 x176/2554 x177/2555 x178/2556 - x179/2557 x180/2558 x181/2559 x182/2560 x183/2561 x184/2562 - x185/2563 x186/2564 x187/2565 x188/2566 x189/2567 x190/2568 - x191/2569 x192/2570 x193/2571 x194/2572 x195/2573 x196/2574 - x197/2575 x198/2576 x199/2577 x200/2578 x201/2579 x202/2580 - x203/2581 x204/2582 x205/2583 x206/2584 x207/2585 x208/2586 - x209/2587 x210/2588 x211/2589 x212/2590 x213/2591 x214/2592 - x215/2593 x216/2594 x217/2595 x218/2596 x219/2597 x220/2598 - x221/2599 x222/2600 x223/2601 x224/2602 x225/2603 x226/2604 - x227/2605 x228/2606 x229/2607 x230/2608 x231/2609 x232/2610 - x233/2611 x234/2612 x235/2613 x236/2614 x237/2615 x238/2616 - x239/2617 x240/2618 x241/2619 x242/2620 x243/2621 x244/2622 - x245/2623 x246/2624 x247/2625 x248/2626 x249/2627 x250/2628 - x251/2629 x252/2630 : local - (function[L] {nlocal = 6} x253/2631 x254/2632 x255/2633 x256/2634 - x257/2635 x258/2636 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 x1/2379 - x152/2530)))) - create_local/2637 = - (function {nlocal = 1} param/4995[int] - [(consts ()) - (non_consts ([0: *, *, *, *, *, *, *, *, *, *, *, *, *, *]))] - (let - (no_local_params/2639 = - (function[L] {nlocal = 126} x1/2640 x2/2641 x3/2642 x4/2643 - x5/2644 x6/2645 x7/2646 x8/2647 x9/2648 x10/2649 x11/2650 - x12/2651 x13/2652 x14/2653 x15/2654 x16/2655 x17/2656 x18/2657 - x19/2658 x20/2659 x21/2660 x22/2661 x23/2662 x24/2663 x25/2664 - x26/2665 x27/2666 x28/2667 x29/2668 x30/2669 x31/2670 x32/2671 - x33/2672 x34/2673 x35/2674 x36/2675 x37/2676 x38/2677 x39/2678 - x40/2679 x41/2680 x42/2681 x43/2682 x44/2683 x45/2684 x46/2685 - x47/2686 x48/2687 x49/2688 x50/2689 x51/2690 x52/2691 x53/2692 - x54/2693 x55/2694 x56/2695 x57/2696 x58/2697 x59/2698 x60/2699 - x61/2700 x62/2701 x63/2702 x64/2703 x65/2704 x66/2705 x67/2706 - x68/2707 x69/2708 x70/2709 x71/2710 x72/2711 x73/2712 x74/2713 - x75/2714 x76/2715 x77/2716 x78/2717 x79/2718 x80/2719 x81/2720 - x82/2721 x83/2722 x84/2723 x85/2724 x86/2725 x87/2726 x88/2727 - x89/2728 x90/2729 x91/2730 x92/2731 x93/2732 x94/2733 x95/2734 - x96/2735 x97/2736 x98/2737 x99/2738 x100/2739 x101/2740 - x102/2741 x103/2742 x104/2743 x105/2744 x106/2745 x107/2746 - x108/2747 x109/2748 x110/2749 x111/2750 x112/2751 x113/2752 - x114/2753 x115/2754 x116/2755 x117/2756 x118/2757 x119/2758 - x120/2759 x121/2760 x122/2761 x123/2762 x124/2763 x125/2764 - x126/2765 : local - (function[L] {nlocal = 5} x127/2766 x128/2767 x129/2768 - x130/2769 x131/2770 : int 0)) - no_local_params__local_returning/2771 = - (function[L] {nlocal = 126} x1/2772 x2/2773 x3/2774 x4/2775 - x5/2776 x6/2777 x7/2778 x8/2779 x9/2780 x10/2781 x11/2782 - x12/2783 x13/2784 x14/2785 x15/2786 x16/2787 x17/2788 x18/2789 - x19/2790 x20/2791 x21/2792 x22/2793 x23/2794 x24/2795 x25/2796 - x26/2797 x27/2798 x28/2799 x29/2800 x30/2801 x31/2802 x32/2803 - x33/2804 x34/2805 x35/2806 x36/2807 x37/2808 x38/2809 x39/2810 - x40/2811 x41/2812 x42/2813 x43/2814 x44/2815 x45/2816 x46/2817 - x47/2818 x48/2819 x49/2820 x50/2821 x51/2822 x52/2823 x53/2824 - x54/2825 x55/2826 x56/2827 x57/2828 x58/2829 x59/2830 x60/2831 - x61/2832 x62/2833 x63/2834 x64/2835 x65/2836 x66/2837 x67/2838 - x68/2839 x69/2840 x70/2841 x71/2842 x72/2843 x73/2844 x74/2845 - x75/2846 x76/2847 x77/2848 x78/2849 x79/2850 x80/2851 x81/2852 - x82/2853 x83/2854 x84/2855 x85/2856 x86/2857 x87/2858 x88/2859 - x89/2860 x90/2861 x91/2862 x92/2863 x93/2864 x94/2865 x95/2866 - x96/2867 x97/2868 x98/2869 x99/2870 x100/2871 x101/2872 - x102/2873 x103/2874 x104/2875 x105/2876 x106/2877 x107/2878 - x108/2879 x109/2880 x110/2881 x111/2882 x112/2883 x113/2884 - x114/2885 x115/2886 x116/2887 x117/2888 x118/2889 x119/2890 - x120/2891 x121/2892 x122/2893 x123/2894 x124/2895 x125/2896 - x126/2897 : local - (function[L] {nlocal = 5} x127/2898 x128/2899 x129/2900 - x130/2901 x131/2902 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/2772 x2/2773))) - local_param_after_split/2903 = - (function[L] {nlocal = 126} x1/2904 x2/2905 x3/2906 x4/2907 - x5/2908 x6/2909 x7/2910 x8/2911 x9/2912 x10/2913 x11/2914 - x12/2915 x13/2916 x14/2917 x15/2918 x16/2919 x17/2920 x18/2921 - x19/2922 x20/2923 x21/2924 x22/2925 x23/2926 x24/2927 x25/2928 - x26/2929 x27/2930 x28/2931 x29/2932 x30/2933 x31/2934 x32/2935 - x33/2936 x34/2937 x35/2938 x36/2939 x37/2940 x38/2941 x39/2942 - x40/2943 x41/2944 x42/2945 x43/2946 x44/2947 x45/2948 x46/2949 - x47/2950 x48/2951 x49/2952 x50/2953 x51/2954 x52/2955 x53/2956 - x54/2957 x55/2958 x56/2959 x57/2960 x58/2961 x59/2962 x60/2963 - x61/2964 x62/2965 x63/2966 x64/2967 x65/2968 x66/2969 x67/2970 - x68/2971 x69/2972 x70/2973 x71/2974 x72/2975 x73/2976 x74/2977 - x75/2978 x76/2979 x77/2980 x78/2981 x79/2982 x80/2983 x81/2984 - x82/2985 x83/2986 x84/2987 x85/2988 x86/2989 x87/2990 x88/2991 - x89/2992 x90/2993 x91/2994 x92/2995 x93/2996 x94/2997 x95/2998 - x96/2999 x97/3000 x98/3001 x99/3002 x100/3003 x101/3004 - x102/3005 x103/3006 x104/3007 x105/3008 x106/3009 x107/3010 - x108/3011 x109/3012 x110/3013 x111/3014 x112/3015 x113/3016 - x114/3017 x115/3018 x116/3019 x117/3020 x118/3021 x119/3022 - x120/3023 x121/3024 x122/3025 x123/3026 x124/3027 x125/3028 - x126/3029 : local - (function[L] {nlocal = 5} x127/3030 x128/3031 x129/3032 - x130/3033[L] x131/3034 : int 0)) - local_param_after_split__local_returning/3035 = - (function[L] {nlocal = 126} x1/3036 x2/3037 x3/3038 x4/3039 - x5/3040 x6/3041 x7/3042 x8/3043 x9/3044 x10/3045 x11/3046 - x12/3047 x13/3048 x14/3049 x15/3050 x16/3051 x17/3052 x18/3053 - x19/3054 x20/3055 x21/3056 x22/3057 x23/3058 x24/3059 x25/3060 - x26/3061 x27/3062 x28/3063 x29/3064 x30/3065 x31/3066 x32/3067 - x33/3068 x34/3069 x35/3070 x36/3071 x37/3072 x38/3073 x39/3074 - x40/3075 x41/3076 x42/3077 x43/3078 x44/3079 x45/3080 x46/3081 - x47/3082 x48/3083 x49/3084 x50/3085 x51/3086 x52/3087 x53/3088 - x54/3089 x55/3090 x56/3091 x57/3092 x58/3093 x59/3094 x60/3095 - x61/3096 x62/3097 x63/3098 x64/3099 x65/3100 x66/3101 x67/3102 - x68/3103 x69/3104 x70/3105 x71/3106 x72/3107 x73/3108 x74/3109 - x75/3110 x76/3111 x77/3112 x78/3113 x79/3114 x80/3115 x81/3116 - x82/3117 x83/3118 x84/3119 x85/3120 x86/3121 x87/3122 x88/3123 - x89/3124 x90/3125 x91/3126 x92/3127 x93/3128 x94/3129 x95/3130 - x96/3131 x97/3132 x98/3133 x99/3134 x100/3135 x101/3136 - x102/3137 x103/3138 x104/3139 x105/3140 x106/3141 x107/3142 - x108/3143 x109/3144 x110/3145 x111/3146 x112/3147 x113/3148 - x114/3149 x115/3150 x116/3151 x117/3152 x118/3153 x119/3154 - x120/3155 x121/3156 x122/3157 x123/3158 x124/3159 x125/3160 - x126/3161 : local - (function[L] {nlocal = 5} x127/3162 x128/3163 x129/3164 - x130/3165[L] x131/3166 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3036 x130/3165))) - local_param_just_after_split/3167 = - (function[L] {nlocal = 126} x1/3168 x2/3169 x3/3170 x4/3171 - x5/3172 x6/3173 x7/3174 x8/3175 x9/3176 x10/3177 x11/3178 - x12/3179 x13/3180 x14/3181 x15/3182 x16/3183 x17/3184 x18/3185 - x19/3186 x20/3187 x21/3188 x22/3189 x23/3190 x24/3191 x25/3192 - x26/3193 x27/3194 x28/3195 x29/3196 x30/3197 x31/3198 x32/3199 - x33/3200 x34/3201 x35/3202 x36/3203 x37/3204 x38/3205 x39/3206 - x40/3207 x41/3208 x42/3209 x43/3210 x44/3211 x45/3212 x46/3213 - x47/3214 x48/3215 x49/3216 x50/3217 x51/3218 x52/3219 x53/3220 - x54/3221 x55/3222 x56/3223 x57/3224 x58/3225 x59/3226 x60/3227 - x61/3228 x62/3229 x63/3230 x64/3231 x65/3232 x66/3233 x67/3234 - x68/3235 x69/3236 x70/3237 x71/3238 x72/3239 x73/3240 x74/3241 - x75/3242 x76/3243 x77/3244 x78/3245 x79/3246 x80/3247 x81/3248 - x82/3249 x83/3250 x84/3251 x85/3252 x86/3253 x87/3254 x88/3255 - x89/3256 x90/3257 x91/3258 x92/3259 x93/3260 x94/3261 x95/3262 - x96/3263 x97/3264 x98/3265 x99/3266 x100/3267 x101/3268 - x102/3269 x103/3270 x104/3271 x105/3272 x106/3273 x107/3274 - x108/3275 x109/3276 x110/3277 x111/3278 x112/3279 x113/3280 - x114/3281 x115/3282 x116/3283 x117/3284 x118/3285 x119/3286 - x120/3287 x121/3288 x122/3289 x123/3290 x124/3291 x125/3292 - x126/3293 : local - (function[L] {nlocal = 5} x127/3294[L] x128/3295 x129/3296 - x130/3297 x131/3298 : int 0)) - local_param_just_after_split__local_returning/3299 = - (function[L] {nlocal = 126} x1/3300 x2/3301 x3/3302 x4/3303 - x5/3304 x6/3305 x7/3306 x8/3307 x9/3308 x10/3309 x11/3310 - x12/3311 x13/3312 x14/3313 x15/3314 x16/3315 x17/3316 x18/3317 - x19/3318 x20/3319 x21/3320 x22/3321 x23/3322 x24/3323 x25/3324 - x26/3325 x27/3326 x28/3327 x29/3328 x30/3329 x31/3330 x32/3331 - x33/3332 x34/3333 x35/3334 x36/3335 x37/3336 x38/3337 x39/3338 - x40/3339 x41/3340 x42/3341 x43/3342 x44/3343 x45/3344 x46/3345 - x47/3346 x48/3347 x49/3348 x50/3349 x51/3350 x52/3351 x53/3352 - x54/3353 x55/3354 x56/3355 x57/3356 x58/3357 x59/3358 x60/3359 - x61/3360 x62/3361 x63/3362 x64/3363 x65/3364 x66/3365 x67/3366 - x68/3367 x69/3368 x70/3369 x71/3370 x72/3371 x73/3372 x74/3373 - x75/3374 x76/3375 x77/3376 x78/3377 x79/3378 x80/3379 x81/3380 - x82/3381 x83/3382 x84/3383 x85/3384 x86/3385 x87/3386 x88/3387 - x89/3388 x90/3389 x91/3390 x92/3391 x93/3392 x94/3393 x95/3394 - x96/3395 x97/3396 x98/3397 x99/3398 x100/3399 x101/3400 - x102/3401 x103/3402 x104/3403 x105/3404 x106/3405 x107/3406 - x108/3407 x109/3408 x110/3409 x111/3410 x112/3411 x113/3412 - x114/3413 x115/3414 x116/3415 x117/3416 x118/3417 x119/3418 - x120/3419 x121/3420 x122/3421 x123/3422 x124/3423 x125/3424 - x126/3425 : local - (function[L] {nlocal = 5} x127/3426[L] x128/3427 x129/3428 - x130/3429 x131/3430 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3300 x127/3426))) - local_param_just_before_split/3431 = - (function[L] {nlocal = 126} x1/3432 x2/3433 x3/3434 x4/3435 - x5/3436 x6/3437 x7/3438 x8/3439 x9/3440 x10/3441 x11/3442 - x12/3443 x13/3444 x14/3445 x15/3446 x16/3447 x17/3448 x18/3449 - x19/3450 x20/3451 x21/3452 x22/3453 x23/3454 x24/3455 x25/3456 - x26/3457 x27/3458 x28/3459 x29/3460 x30/3461 x31/3462 x32/3463 - x33/3464 x34/3465 x35/3466 x36/3467 x37/3468 x38/3469 x39/3470 - x40/3471 x41/3472 x42/3473 x43/3474 x44/3475 x45/3476 x46/3477 - x47/3478 x48/3479 x49/3480 x50/3481 x51/3482 x52/3483 x53/3484 - x54/3485 x55/3486 x56/3487 x57/3488 x58/3489 x59/3490 x60/3491 - x61/3492 x62/3493 x63/3494 x64/3495 x65/3496 x66/3497 x67/3498 - x68/3499 x69/3500 x70/3501 x71/3502 x72/3503 x73/3504 x74/3505 - x75/3506 x76/3507 x77/3508 x78/3509 x79/3510 x80/3511 x81/3512 - x82/3513 x83/3514 x84/3515 x85/3516 x86/3517 x87/3518 x88/3519 - x89/3520 x90/3521 x91/3522 x92/3523 x93/3524 x94/3525 x95/3526 - x96/3527 x97/3528 x98/3529 x99/3530 x100/3531 x101/3532 - x102/3533 x103/3534 x104/3535 x105/3536 x106/3537 x107/3538 - x108/3539 x109/3540 x110/3541 x111/3542 x112/3543 x113/3544 - x114/3545 x115/3546 x116/3547 x117/3548 x118/3549 x119/3550 - x120/3551 x121/3552 x122/3553 x123/3554 x124/3555 x125/3556 - x126/3557[L] : local - (function[L] {nlocal = 5} x127/3558 x128/3559 x129/3560 - x130/3561 x131/3562 : int 0)) - local_param_just_before_split__local_returning/3563 = - (function[L] {nlocal = 126} x1/3564 x2/3565 x3/3566 x4/3567 - x5/3568 x6/3569 x7/3570 x8/3571 x9/3572 x10/3573 x11/3574 - x12/3575 x13/3576 x14/3577 x15/3578 x16/3579 x17/3580 x18/3581 - x19/3582 x20/3583 x21/3584 x22/3585 x23/3586 x24/3587 x25/3588 - x26/3589 x27/3590 x28/3591 x29/3592 x30/3593 x31/3594 x32/3595 - x33/3596 x34/3597 x35/3598 x36/3599 x37/3600 x38/3601 x39/3602 - x40/3603 x41/3604 x42/3605 x43/3606 x44/3607 x45/3608 x46/3609 - x47/3610 x48/3611 x49/3612 x50/3613 x51/3614 x52/3615 x53/3616 - x54/3617 x55/3618 x56/3619 x57/3620 x58/3621 x59/3622 x60/3623 - x61/3624 x62/3625 x63/3626 x64/3627 x65/3628 x66/3629 x67/3630 - x68/3631 x69/3632 x70/3633 x71/3634 x72/3635 x73/3636 x74/3637 - x75/3638 x76/3639 x77/3640 x78/3641 x79/3642 x80/3643 x81/3644 - x82/3645 x83/3646 x84/3647 x85/3648 x86/3649 x87/3650 x88/3651 - x89/3652 x90/3653 x91/3654 x92/3655 x93/3656 x94/3657 x95/3658 - x96/3659 x97/3660 x98/3661 x99/3662 x100/3663 x101/3664 - x102/3665 x103/3666 x104/3667 x105/3668 x106/3669 x107/3670 - x108/3671 x109/3672 x110/3673 x111/3674 x112/3675 x113/3676 - x114/3677 x115/3678 x116/3679 x117/3680 x118/3681 x119/3682 - x120/3683 x121/3684 x122/3685 x123/3686 x124/3687 x125/3688 - x126/3689[L] : local - (function[L] {nlocal = 5} x127/3690 x128/3691 x129/3692 - x130/3693 x131/3694 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3564 x126/3689))) - local_param_before_split/3695 = - (function[L] {nlocal = 126} x1/3696 x2/3697 x3/3698 x4/3699 - x5/3700 x6/3701 x7/3702 x8/3703[L] x9/3704 x10/3705 x11/3706 - x12/3707 x13/3708 x14/3709 x15/3710 x16/3711 x17/3712 x18/3713 - x19/3714 x20/3715 x21/3716 x22/3717 x23/3718 x24/3719 x25/3720 - x26/3721 x27/3722 x28/3723 x29/3724 x30/3725 x31/3726 x32/3727 - x33/3728 x34/3729 x35/3730 x36/3731 x37/3732 x38/3733 x39/3734 - x40/3735 x41/3736 x42/3737 x43/3738 x44/3739 x45/3740 x46/3741 - x47/3742 x48/3743 x49/3744 x50/3745 x51/3746 x52/3747 x53/3748 - x54/3749 x55/3750 x56/3751 x57/3752 x58/3753 x59/3754 x60/3755 - x61/3756 x62/3757 x63/3758 x64/3759 x65/3760 x66/3761 x67/3762 - x68/3763 x69/3764 x70/3765 x71/3766 x72/3767 x73/3768 x74/3769 - x75/3770 x76/3771 x77/3772 x78/3773 x79/3774 x80/3775 x81/3776 - x82/3777 x83/3778 x84/3779 x85/3780 x86/3781 x87/3782 x88/3783 - x89/3784 x90/3785 x91/3786 x92/3787 x93/3788 x94/3789 x95/3790 - x96/3791 x97/3792 x98/3793 x99/3794 x100/3795 x101/3796 - x102/3797 x103/3798 x104/3799 x105/3800 x106/3801 x107/3802 - x108/3803 x109/3804 x110/3805 x111/3806 x112/3807 x113/3808 - x114/3809 x115/3810 x116/3811 x117/3812 x118/3813 x119/3814 - x120/3815 x121/3816 x122/3817 x123/3818 x124/3819 x125/3820 - x126/3821 : local - (function[L] {nlocal = 5} x127/3822 x128/3823 x129/3824 - x130/3825 x131/3826 : int 0)) - local_param_before_split__local_returning/3827 = - (function[L] {nlocal = 126} x1/3828 x2/3829 x3/3830 x4/3831 - x5/3832 x6/3833 x7/3834 x8/3835[L] x9/3836 x10/3837 x11/3838 - x12/3839 x13/3840 x14/3841 x15/3842 x16/3843 x17/3844 x18/3845 - x19/3846 x20/3847 x21/3848 x22/3849 x23/3850 x24/3851 x25/3852 - x26/3853 x27/3854 x28/3855 x29/3856 x30/3857 x31/3858 x32/3859 - x33/3860 x34/3861 x35/3862 x36/3863 x37/3864 x38/3865 x39/3866 - x40/3867 x41/3868 x42/3869 x43/3870 x44/3871 x45/3872 x46/3873 - x47/3874 x48/3875 x49/3876 x50/3877 x51/3878 x52/3879 x53/3880 - x54/3881 x55/3882 x56/3883 x57/3884 x58/3885 x59/3886 x60/3887 - x61/3888 x62/3889 x63/3890 x64/3891 x65/3892 x66/3893 x67/3894 - x68/3895 x69/3896 x70/3897 x71/3898 x72/3899 x73/3900 x74/3901 - x75/3902 x76/3903 x77/3904 x78/3905 x79/3906 x80/3907 x81/3908 - x82/3909 x83/3910 x84/3911 x85/3912 x86/3913 x87/3914 x88/3915 - x89/3916 x90/3917 x91/3918 x92/3919 x93/3920 x94/3921 x95/3922 - x96/3923 x97/3924 x98/3925 x99/3926 x100/3927 x101/3928 - x102/3929 x103/3930 x104/3931 x105/3932 x106/3933 x107/3934 - x108/3935 x109/3936 x110/3937 x111/3938 x112/3939 x113/3940 - x114/3941 x115/3942 x116/3943 x117/3944 x118/3945 x119/3946 - x120/3947 x121/3948 x122/3949 x123/3950 x124/3951 x125/3952 - x126/3953 : local - (function[L] {nlocal = 5} x127/3954 x128/3955 x129/3956 - x130/3957 x131/3958 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/3828 x8/3835))) - two_splits/3959 = - (function[L] {nlocal = 126} x1/3960 x2/3961 x3/3962 x4/3963 - x5/3964 x6/3965 x7/3966 x8/3967 x9/3968 x10/3969 x11/3970 - x12/3971 x13/3972 x14/3973 x15/3974 x16/3975 x17/3976 x18/3977 - x19/3978 x20/3979 x21/3980 x22/3981 x23/3982 x24/3983 x25/3984 - x26/3985 x27/3986 x28/3987 x29/3988 x30/3989 x31/3990 x32/3991 - x33/3992 x34/3993 x35/3994 x36/3995 x37/3996 x38/3997 x39/3998 - x40/3999 x41/4000 x42/4001 x43/4002 x44/4003 x45/4004 x46/4005 - x47/4006 x48/4007 x49/4008 x50/4009 x51/4010 x52/4011 x53/4012 - x54/4013 x55/4014 x56/4015 x57/4016 x58/4017 x59/4018 x60/4019 - x61/4020 x62/4021 x63/4022 x64/4023 x65/4024 x66/4025 x67/4026 - x68/4027 x69/4028 x70/4029 x71/4030 x72/4031 x73/4032 x74/4033 - x75/4034 x76/4035 x77/4036 x78/4037 x79/4038 x80/4039 x81/4040 - x82/4041 x83/4042 x84/4043 x85/4044 x86/4045 x87/4046 x88/4047 - x89/4048 x90/4049 x91/4050 x92/4051 x93/4052 x94/4053 x95/4054 - x96/4055 x97/4056 x98/4057 x99/4058 x100/4059 x101/4060 - x102/4061 x103/4062 x104/4063 x105/4064 x106/4065 x107/4066 - x108/4067 x109/4068 x110/4069 x111/4070 x112/4071 x113/4072 - x114/4073 x115/4074 x116/4075 x117/4076 x118/4077 x119/4078 - x120/4079 x121/4080 x122/4081 x123/4082 x124/4083 x125/4084 - x126/4085 : local - (function[L] {nlocal = 126} x127/4086 x128/4087 x129/4088 - x130/4089 x131/4090 x132/4091 x133/4092 x134/4093 x135/4094 - x136/4095 x137/4096 x138/4097 x139/4098 x140/4099 x141/4100 - x142/4101 x143/4102 x144/4103 x145/4104 x146/4105 x147/4106 - x148/4107 x149/4108 x150/4109 x151/4110 x152/4111 x153/4112 - x154/4113 x155/4114 x156/4115 x157/4116 x158/4117 x159/4118 - x160/4119 x161/4120 x162/4121 x163/4122 x164/4123 x165/4124 - x166/4125 x167/4126 x168/4127 x169/4128 x170/4129 x171/4130 - x172/4131 x173/4132 x174/4133 x175/4134 x176/4135 x177/4136 - x178/4137 x179/4138 x180/4139 x181/4140 x182/4141 x183/4142 - x184/4143 x185/4144 x186/4145 x187/4146 x188/4147 x189/4148 - x190/4149 x191/4150 x192/4151 x193/4152 x194/4153 x195/4154 - x196/4155 x197/4156 x198/4157 x199/4158 x200/4159 x201/4160 - x202/4161 x203/4162 x204/4163 x205/4164 x206/4165 x207/4166 - x208/4167 x209/4168 x210/4169 x211/4170 x212/4171 x213/4172 - x214/4173 x215/4174 x216/4175 x217/4176 x218/4177 x219/4178 - x220/4179 x221/4180 x222/4181 x223/4182 x224/4183 x225/4184 - x226/4185 x227/4186 x228/4187 x229/4188 x230/4189 x231/4190 - x232/4191 x233/4192 x234/4193 x235/4194 x236/4195 x237/4196 - x238/4197 x239/4198 x240/4199 x241/4200 x242/4201 x243/4202 - x244/4203 x245/4204 x246/4205 x247/4206 x248/4207 x249/4208 - x250/4209 x251/4210 x252/4211 : local - (function[L] {nlocal = 6} x253/4212 x254/4213 x255/4214 - x256/4215 x257/4216 x258/4217 : int 0))) - two_splits__local_returning/4218 = - (function[L] {nlocal = 126} x1/4219 x2/4220 x3/4221 x4/4222 - x5/4223 x6/4224 x7/4225 x8/4226 x9/4227 x10/4228 x11/4229 - x12/4230 x13/4231 x14/4232 x15/4233 x16/4234 x17/4235 x18/4236 - x19/4237 x20/4238 x21/4239 x22/4240 x23/4241 x24/4242 x25/4243 - x26/4244 x27/4245 x28/4246 x29/4247 x30/4248 x31/4249 x32/4250 - x33/4251 x34/4252 x35/4253 x36/4254 x37/4255 x38/4256 x39/4257 - x40/4258 x41/4259 x42/4260 x43/4261 x44/4262 x45/4263 x46/4264 - x47/4265 x48/4266 x49/4267 x50/4268 x51/4269 x52/4270 x53/4271 - x54/4272 x55/4273 x56/4274 x57/4275 x58/4276 x59/4277 x60/4278 - x61/4279 x62/4280 x63/4281 x64/4282 x65/4283 x66/4284 x67/4285 - x68/4286 x69/4287 x70/4288 x71/4289 x72/4290 x73/4291 x74/4292 - x75/4293 x76/4294 x77/4295 x78/4296 x79/4297 x80/4298 x81/4299 - x82/4300 x83/4301 x84/4302 x85/4303 x86/4304 x87/4305 x88/4306 - x89/4307 x90/4308 x91/4309 x92/4310 x93/4311 x94/4312 x95/4313 - x96/4314 x97/4315 x98/4316 x99/4317 x100/4318 x101/4319 - x102/4320 x103/4321 x104/4322 x105/4323 x106/4324 x107/4325 - x108/4326 x109/4327 x110/4328 x111/4329 x112/4330 x113/4331 - x114/4332 x115/4333 x116/4334 x117/4335 x118/4336 x119/4337 - x120/4338 x121/4339 x122/4340 x123/4341 x124/4342 x125/4343 - x126/4344 : local - (function[L] {nlocal = 126} x127/4345 x128/4346 x129/4347 - x130/4348 x131/4349 x132/4350 x133/4351 x134/4352 x135/4353 - x136/4354 x137/4355 x138/4356 x139/4357 x140/4358 x141/4359 - x142/4360 x143/4361 x144/4362 x145/4363 x146/4364 x147/4365 - x148/4366 x149/4367 x150/4368 x151/4369 x152/4370 x153/4371 - x154/4372 x155/4373 x156/4374 x157/4375 x158/4376 x159/4377 - x160/4378 x161/4379 x162/4380 x163/4381 x164/4382 x165/4383 - x166/4384 x167/4385 x168/4386 x169/4387 x170/4388 x171/4389 - x172/4390 x173/4391 x174/4392 x175/4393 x176/4394 x177/4395 - x178/4396 x179/4397 x180/4398 x181/4399 x182/4400 x183/4401 - x184/4402 x185/4403 x186/4404 x187/4405 x188/4406 x189/4407 - x190/4408 x191/4409 x192/4410 x193/4411 x194/4412 x195/4413 - x196/4414 x197/4415 x198/4416 x199/4417 x200/4418 x201/4419 - x202/4420 x203/4421 x204/4422 x205/4423 x206/4424 x207/4425 - x208/4426 x209/4427 x210/4428 x211/4429 x212/4430 x213/4431 - x214/4432 x215/4433 x216/4434 x217/4435 x218/4436 x219/4437 - x220/4438 x221/4439 x222/4440 x223/4441 x224/4442 x225/4443 - x226/4444 x227/4445 x228/4446 x229/4447 x230/4448 x231/4449 - x232/4450 x233/4451 x234/4452 x235/4453 x236/4454 x237/4455 - x238/4456 x239/4457 x240/4458 x241/4459 x242/4460 x243/4461 - x244/4462 x245/4463 x246/4464 x247/4465 x248/4466 x249/4467 - x250/4468 x251/4469 x252/4470 : local - (function[L] {nlocal = 6} x253/4471 x254/4472 x255/4473 - x256/4474 x257/4475 x258/4476 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/4219 x258/4476)))) - two_splits_local_param/4477 = - (function[L] {nlocal = 126} x1/4478 x2/4479 x3/4480 x4/4481 - x5/4482 x6/4483 x7/4484 x8/4485 x9/4486 x10/4487 x11/4488 - x12/4489 x13/4490 x14/4491 x15/4492 x16/4493 x17/4494 x18/4495 - x19/4496 x20/4497 x21/4498 x22/4499 x23/4500 x24/4501 x25/4502 - x26/4503 x27/4504 x28/4505 x29/4506 x30/4507 x31/4508 x32/4509 - x33/4510 x34/4511 x35/4512 x36/4513 x37/4514 x38/4515 x39/4516 - x40/4517 x41/4518 x42/4519 x43/4520 x44/4521 x45/4522 x46/4523 - x47/4524 x48/4525 x49/4526 x50/4527 x51/4528 x52/4529 x53/4530 - x54/4531 x55/4532 x56/4533 x57/4534 x58/4535 x59/4536 x60/4537 - x61/4538 x62/4539 x63/4540 x64/4541 x65/4542 x66/4543 x67/4544 - x68/4545 x69/4546 x70/4547 x71/4548 x72/4549 x73/4550 x74/4551 - x75/4552 x76/4553 x77/4554 x78/4555 x79/4556 x80/4557 x81/4558 - x82/4559 x83/4560 x84/4561 x85/4562 x86/4563 x87/4564 x88/4565 - x89/4566 x90/4567 x91/4568 x92/4569 x93/4570 x94/4571 x95/4572 - x96/4573 x97/4574 x98/4575 x99/4576 x100/4577 x101/4578 - x102/4579 x103/4580 x104/4581 x105/4582 x106/4583 x107/4584 - x108/4585 x109/4586 x110/4587 x111/4588 x112/4589 x113/4590 - x114/4591 x115/4592 x116/4593 x117/4594 x118/4595 x119/4596 - x120/4597 x121/4598 x122/4599 x123/4600 x124/4601 x125/4602 - x126/4603 : local - (function[L] {nlocal = 126} x127/4604 x128/4605 x129/4606 - x130/4607 x131/4608 x132/4609 x133/4610 x134/4611 x135/4612 - x136/4613 x137/4614 x138/4615 x139/4616 x140/4617 x141/4618 - x142/4619 x143/4620 x144/4621 x145/4622 x146/4623 x147/4624 - x148/4625 x149/4626 x150/4627 x151/4628 x152/4629[L] - x153/4630 x154/4631 x155/4632 x156/4633 x157/4634 x158/4635 - x159/4636 x160/4637 x161/4638 x162/4639 x163/4640 x164/4641 - x165/4642 x166/4643 x167/4644 x168/4645 x169/4646 x170/4647 - x171/4648 x172/4649 x173/4650 x174/4651 x175/4652 x176/4653 - x177/4654 x178/4655 x179/4656 x180/4657 x181/4658 x182/4659 - x183/4660 x184/4661 x185/4662 x186/4663 x187/4664 x188/4665 - x189/4666 x190/4667 x191/4668 x192/4669 x193/4670 x194/4671 - x195/4672 x196/4673 x197/4674 x198/4675 x199/4676 x200/4677 - x201/4678 x202/4679 x203/4680 x204/4681 x205/4682 x206/4683 - x207/4684 x208/4685 x209/4686 x210/4687 x211/4688 x212/4689 - x213/4690 x214/4691 x215/4692 x216/4693 x217/4694 x218/4695 - x219/4696 x220/4697 x221/4698 x222/4699 x223/4700 x224/4701 - x225/4702 x226/4703 x227/4704 x228/4705 x229/4706 x230/4707 - x231/4708 x232/4709 x233/4710 x234/4711 x235/4712 x236/4713 - x237/4714 x238/4715 x239/4716 x240/4717 x241/4718 x242/4719 - x243/4720 x244/4721 x245/4722 x246/4723 x247/4724 x248/4725 - x249/4726 x250/4727 x251/4728 x252/4729 : local - (function[L] {nlocal = 6} x253/4730 x254/4731 x255/4732 - x256/4733 x257/4734 x258/4735 : int 0))) - two_splits_local_param__local_returning/4736 = - (function[L] {nlocal = 126} x1/4737 x2/4738 x3/4739 x4/4740 - x5/4741 x6/4742 x7/4743 x8/4744 x9/4745 x10/4746 x11/4747 - x12/4748 x13/4749 x14/4750 x15/4751 x16/4752 x17/4753 x18/4754 - x19/4755 x20/4756 x21/4757 x22/4758 x23/4759 x24/4760 x25/4761 - x26/4762 x27/4763 x28/4764 x29/4765 x30/4766 x31/4767 x32/4768 - x33/4769 x34/4770 x35/4771 x36/4772 x37/4773 x38/4774 x39/4775 - x40/4776 x41/4777 x42/4778 x43/4779 x44/4780 x45/4781 x46/4782 - x47/4783 x48/4784 x49/4785 x50/4786 x51/4787 x52/4788 x53/4789 - x54/4790 x55/4791 x56/4792 x57/4793 x58/4794 x59/4795 x60/4796 - x61/4797 x62/4798 x63/4799 x64/4800 x65/4801 x66/4802 x67/4803 - x68/4804 x69/4805 x70/4806 x71/4807 x72/4808 x73/4809 x74/4810 - x75/4811 x76/4812 x77/4813 x78/4814 x79/4815 x80/4816 x81/4817 - x82/4818 x83/4819 x84/4820 x85/4821 x86/4822 x87/4823 x88/4824 - x89/4825 x90/4826 x91/4827 x92/4828 x93/4829 x94/4830 x95/4831 - x96/4832 x97/4833 x98/4834 x99/4835 x100/4836 x101/4837 - x102/4838 x103/4839 x104/4840 x105/4841 x106/4842 x107/4843 - x108/4844 x109/4845 x110/4846 x111/4847 x112/4848 x113/4849 - x114/4850 x115/4851 x116/4852 x117/4853 x118/4854 x119/4855 - x120/4856 x121/4857 x122/4858 x123/4859 x124/4860 x125/4861 - x126/4862 : local - (function[L] {nlocal = 126} x127/4863 x128/4864 x129/4865 - x130/4866 x131/4867 x132/4868 x133/4869 x134/4870 x135/4871 - x136/4872 x137/4873 x138/4874 x139/4875 x140/4876 x141/4877 - x142/4878 x143/4879 x144/4880 x145/4881 x146/4882 x147/4883 - x148/4884 x149/4885 x150/4886 x151/4887 x152/4888[L] - x153/4889 x154/4890 x155/4891 x156/4892 x157/4893 x158/4894 - x159/4895 x160/4896 x161/4897 x162/4898 x163/4899 x164/4900 - x165/4901 x166/4902 x167/4903 x168/4904 x169/4905 x170/4906 - x171/4907 x172/4908 x173/4909 x174/4910 x175/4911 x176/4912 - x177/4913 x178/4914 x179/4915 x180/4916 x181/4917 x182/4918 - x183/4919 x184/4920 x185/4921 x186/4922 x187/4923 x188/4924 - x189/4925 x190/4926 x191/4927 x192/4928 x193/4929 x194/4930 - x195/4931 x196/4932 x197/4933 x198/4934 x199/4935 x200/4936 - x201/4937 x202/4938 x203/4939 x204/4940 x205/4941 x206/4942 - x207/4943 x208/4944 x209/4945 x210/4946 x211/4947 x212/4948 - x213/4949 x214/4950 x215/4951 x216/4952 x217/4953 x218/4954 - x219/4955 x220/4956 x221/4957 x222/4958 x223/4959 x224/4960 - x225/4961 x226/4962 x227/4963 x228/4964 x229/4965 x230/4966 - x231/4967 x232/4968 x233/4969 x234/4970 x235/4971 x236/4972 - x237/4973 x238/4974 x239/4975 x240/4976 x241/4977 x242/4978 - x243/4979 x244/4980 x245/4981 x246/4982 x247/4983 x248/4984 - x249/4985 x250/4986 x251/4987 x252/4988 : local - (function[L] {nlocal = 6} x253/4989 x254/4990 x255/4991 - x256/4992 x257/4993 x258/4994 - [(consts ()) (non_consts ([0: *, *]))](makelocalblock 0 - x1/4737 x152/4888))))) - (makelocalblock 0 no_local_params/2639 - no_local_params__local_returning/2771 local_param_after_split/2903 - local_param_after_split__local_returning/3035 - local_param_just_after_split/3167 - local_param_just_after_split__local_returning/3299 - local_param_just_before_split/3431 - local_param_just_before_split__local_returning/3563 - local_param_before_split/3695 - local_param_before_split__local_returning/3827 two_splits/3959 - two_splits__local_returning/4218 two_splits_local_param/4477 - two_splits_local_param__local_returning/4736)))) - (makeblock 0 no_local_params/267 no_local_params__local_returning/400 - local_param_after_split/533 local_param_after_split__local_returning/666 - local_param_just_after_split/799 - local_param_just_after_split__local_returning/932 - local_param_just_before_split/1065 - local_param_just_before_split__local_returning/1198 - local_param_before_split/1331 - local_param_before_split__local_returning/1464 two_splits/1597 - two_splits__local_returning/1857 two_splits_local_param/2117 - two_splits_local_param__local_returning/2377 create_local/2637)) diff --git a/testsuite/tests/syntactic-arity/max_arity_locals.ml b/testsuite/tests/syntactic-arity/max_arity_locals.ml index f9370dd0eac..2a6b5e71ca3 100644 --- a/testsuite/tests/syntactic-arity/max_arity_locals.ml +++ b/testsuite/tests/syntactic-arity/max_arity_locals.ml @@ -1,17 +1,10 @@ (* TEST - - flags = "-dlambda -w +unused-value-declaration" - -* no-flambda -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -**** check-ocamlopt.byte-output - -* flambda -compiler_reference = "${test_source_directory}/max_arity_locals.flambda.reference" -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -**** check-ocamlopt.byte-output + flags = "-dlambda -dno-unique-ids -w +unused-value-declaration"; + flambda; + stack-allocation; + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + check-ocamlopt.byte-output; *) (* This test prints the translation of functions whose arity exceeds diff --git a/testsuite/tests/syntactic-arity/measure_arity.ml b/testsuite/tests/syntactic-arity/measure_arity.ml new file mode 100644 index 00000000000..0a711a374bc --- /dev/null +++ b/testsuite/tests/syntactic-arity/measure_arity.ml @@ -0,0 +1,478 @@ +(* TEST + expect; +*) + +[@@@ocaml.warning "-5-8"] + +(* A series of tests that observe the syntactic arity of a function, + by constructing functions whose pattern matching involves side + effects. + + The tests are the same in each numbered section, so please change + them everywhere if you change them in one place. + *) + + +(* I. Measuring arity with lazy patterns *) + +type t = int lazy_t + +let measure_arity f = + let exception Arity of int in + let bot = lazy (assert false) in + let ret d = lazy (raise (Arity d)) in + try + f (ret 1); + f (ret 2) bot; + f (ret 3) bot bot; + f (ret 4) bot bot bot; + failwith "arity too large" + with + | Arity d -> d +;; + +[%%expect{| +type t = int lazy_t +val measure_arity : + ('a lazy_t -> 'b lazy_t -> 'c lazy_t -> 'd lazy_t -> 'e) -> int = +|}];; + +let unary (lazy _ : t) = assert false;; +let arity = measure_arity unary;; +[%%expect{| +val unary : t -> 'a = +val arity : int = 1 +|}];; + +let fun_lambda = fun (lazy _ : t) (lazy _ : t) -> assert false;; +let arity = measure_arity fun_lambda;; +[%%expect{| +val fun_lambda : t -> t -> 'a = +val arity : int = 2 +|}];; + +let nested_arity = fun (lazy _ : t) -> fun (lazy _ : t) -> assert false;; +let arity1 = measure_arity nested_arity;; +let arity2 = measure_arity (nested_arity (lazy 0));; +[%%expect{| +val nested_arity : t -> t -> 'a = +val arity1 : int = 1 +val arity2 : int = 1 +|}];; + +let fun_lambda_with_function_body = + fun (lazy _ : t) (lazy _ : t) -> function (lazy _ : t) -> assert false;; +let arity = measure_arity fun_lambda_with_function_body;; +[%%expect{| +val fun_lambda_with_function_body : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_single_case (lazy _ : t) (lazy _ : t) = function + | (lazy _ : t) -> assert false;; +let arity = measure_arity function_body_single_case;; +[%%expect{| +val function_body_single_case : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_constraint (lazy _ : t) (lazy _ : t) : _ = function + | (lazy _ : t) -> assert false;; +let arity = measure_arity function_body_constraint;; +[%%expect{| +val function_body_constraint : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_multiple_cases (lazy _ : t) (lazy _ : t) = function + | (lazy 2) -> (fun (lazy _ : t) -> assert false) + | (lazy _ : t) -> (fun (lazy _ : t) -> assert false);; +let arity = measure_arity function_body_multiple_cases;; +[%%expect{| +val function_body_multiple_cases : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_constraint_multiple_cases (lazy _ : t) (lazy _ : t) : _ = + function + | (lazy 2) -> (fun (lazy _ : t) -> assert false) + | (lazy _ : t) -> (fun (lazy _ : t) -> assert false) +let arity = measure_arity function_body_constraint_multiple_cases +[%%expect{| +val function_body_constraint_multiple_cases : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_coercion (lazy _ : t) (lazy _ : t) :> _ = function + | (lazy 2) -> (fun (lazy _ : t) -> assert false) + | (lazy _ : t) -> (fun (lazy _ : t) -> assert false) +let arity = measure_arity function_body_coercion +[%%expect{| +val function_body_coercion : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_coercion_constraint (lazy _ : t) (lazy _ : t) : _ :> _ = + function + | (lazy 2) -> (fun (lazy _ : t) -> assert false) + | (lazy _ : t) -> (fun (lazy _ : t) -> assert false) +let arity = measure_arity function_body_coercion_constraint +[%%expect{| +val function_body_coercion_constraint : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +(* partial application: applying a function with arity 3 yields a + function with arity 2. *) +let partial_application (lazy _ : t) (lazy _ : t) = function + | (lazy 2) -> (fun (lazy _ : t) -> assert false) + | (lazy _ : t) -> (fun (lazy _ : t) -> assert false) +let arity1 = measure_arity partial_application +let arity2 = measure_arity (partial_application (lazy 0)) +[%%expect{| +val partial_application : t -> t -> t -> t -> 'a = +val arity1 : int = 3 +val arity2 : int = 2 +|}];; + +(* newtype doesn't interrupt arity *) +let f1 (type a) (lazy _ : t) (lazy _ : t) = (assert false : a) +let f2 (lazy _ : t) (type a) (lazy _ : t) = (assert false : a) +let f3 (lazy _ : t) (lazy _ : t) (type a) = (assert false : a) +let f4 (type a a) (lazy _ : t) (type a a) (lazy _ : t) (type a a) = + assert false +let arity1 = measure_arity f1 +let arity2 = measure_arity f2 +let arity3 = measure_arity f3 +let arity4 = measure_arity f4 +[%%expect{| +val f1 : t -> t -> 'a = +val f2 : t -> t -> 'a = +val f3 : t -> t -> 'a = +val f4 : t -> t -> 'a = +val arity1 : int = 2 +val arity2 : int = 2 +val arity3 : int = 2 +val arity4 : int = 2 +|}];; + +(* II. Measuring arity with non-exhaustive pattern matches *) + +type t = A | B | C + +let measure_arity f = + let exception Arity of int in + let go arity g = + try g () with Match_failure _ -> raise (Arity arity) + in + try + go 1 (fun () -> f B); + go 2 (fun () -> f B B); + go 3 (fun () -> f B B B); + go 4 (fun () -> f B B B B); + failwith "arity too large" + with + | Arity arity -> arity +;; + +[%%expect{| +type t = A | B | C +val measure_arity : (t -> t -> t -> t -> 'a) -> int = +|}];; + +let unary A = assert false;; +let arity = measure_arity unary;; +[%%expect{| +val unary : t -> 'a = +val arity : int = 1 +|}];; + +let fun_lambda = fun A A -> assert false;; +let arity = measure_arity fun_lambda;; +[%%expect{| +val fun_lambda : t -> t -> 'a = +val arity : int = 2 +|}];; + +let nested_arity = fun A -> fun A -> assert false;; +let arity1 = measure_arity nested_arity;; +let arity2 = measure_arity (nested_arity A);; +[%%expect{| +val nested_arity : t -> t -> 'a = +val arity1 : int = 1 +val arity2 : int = 1 +|}];; + +let fun_lambda_with_function_body = + fun A A -> function A -> assert false;; +let arity = measure_arity fun_lambda_with_function_body;; +[%%expect{| +val fun_lambda_with_function_body : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_single_case A A = function + | A -> assert false;; +let arity = measure_arity function_body_single_case;; +[%%expect{| +val function_body_single_case : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_constraint A A : _ = function + | A -> assert false;; +let arity = measure_arity function_body_constraint;; +[%%expect{| +val function_body_constraint : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_multiple_cases A A = function + | C -> (fun A -> assert false) + | A -> (fun A -> assert false);; +let arity = measure_arity function_body_multiple_cases;; +[%%expect{| +val function_body_multiple_cases : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_constraint_multiple_cases A A : _ = function + | C -> (fun A -> assert false) + | A -> (fun A -> assert false) +let arity = measure_arity function_body_constraint_multiple_cases +[%%expect{| +val function_body_constraint_multiple_cases : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_coercion A A :> _ = function + | C -> (fun A -> assert false) + | A -> (fun A -> assert false) +let arity = measure_arity function_body_coercion +[%%expect{| +val function_body_coercion : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_coercion_constraint A A : _ :> _ = function + | C -> (fun A -> assert false) + | A -> (fun A -> assert false) +let arity = measure_arity function_body_coercion_constraint +[%%expect{| +val function_body_coercion_constraint : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +(* partial application: applying a function with arity 3 yields a + function with arity 2. *) +let partial_application A A = function + | C -> (fun A -> assert false) + | A -> (fun A -> assert false) +let arity1 = measure_arity partial_application +let arity2 = measure_arity (partial_application A) +[%%expect{| +val partial_application : t -> t -> t -> t -> 'a = +val arity1 : int = 3 +val arity2 : int = 2 +|}];; + +(* newtype doesn't interrupt arity *) +let f1 (type a) A A = (assert false : a) +let f2 A (type a) A = (assert false : a) +let f3 A A (type a) = (assert false : a) +let f4 (type a a) A (type a a) A (type a a) = assert false +let arity1 = measure_arity f1 +let arity2 = measure_arity f2 +let arity3 = measure_arity f3 +let arity4 = measure_arity f4 +[%%expect{| +val f1 : t -> t -> 'a = +val f2 : t -> t -> 'a = +val f3 : t -> t -> 'a = +val f4 : t -> t -> 'a = +val arity1 : int = 2 +val arity2 : int = 2 +val arity3 : int = 2 +val arity4 : int = 2 +|}];; + +(* III. Measuring arity with mutable pattern matches *) + +exception Return of int + +let return x = raise (Return x) + +type t = { mutable x : int } +type nothing = | + +let measure_arity f = + let exception Arity of int in + (* Measure arity by observing differences between the + behavior of these applications: + + f {x=2} {x=2} ... {x=2} + f !!t t !!... t + + Where t.x is set to 1 between the !!s, and set to 2 outside + of the !!s. + + In the above example, if [f] is 2-ary, it will read the value of t.x as 1 + for the first two arguments. If it's 3-ary, it will read the value as 2. + *) + let go arity ~while_x_is_1 ~while_x_is_2 = + let t = { x = 2 } in + let answer1 = + match f {x=2} {x=2} {x=2} {x=2} {x=2} with + | exception Return r -> r + | (_ : nothing) -> . + in + t.x <- 1; + let answer2 = + match while_x_is_1 f t with + | exception Return r -> r + | f' -> + t.x <- 2; + match while_x_is_2 f' t with + | exception Return r -> r + | (_ : nothing) -> . + in + if answer1 <> answer2 + then raise (Arity arity) + in + try + let one f t = f t in + let two f t = f t t in + let three f t = f t t t in + let four f t = f t t t t in + go 1 ~while_x_is_1:one ~while_x_is_2:four; + go 2 ~while_x_is_1:two ~while_x_is_2:three; + go 3 ~while_x_is_1:three ~while_x_is_2:two; + go 4 ~while_x_is_1:four ~while_x_is_2:one; + failwith "arity too large" + with + | Arity arity -> arity +;; + +[%%expect{| +exception Return of int +val return : int -> 'a = +type t = { mutable x : int; } +type nothing = | +val measure_arity : (t -> t -> t -> t -> t -> nothing) -> int = +|}];; + +let unary {x} = return x;; +let arity = measure_arity unary;; +[%%expect{| +val unary : t -> 'a = +val arity : int = 1 +|}];; + +let fun_lambda = fun {x=x1} {x=x2} -> return (x1+x2);; +let arity = measure_arity fun_lambda;; +[%%expect{| +val fun_lambda : t -> t -> 'a = +val arity : int = 2 +|}];; + +let nested_arity = fun {x=x1} -> fun {x=x2} -> return (x1+x2);; +let arity1 = measure_arity nested_arity;; +let arity2 = measure_arity (nested_arity {x=7});; +[%%expect{| +val nested_arity : t -> t -> 'a = +val arity1 : int = 1 +val arity2 : int = 1 +|}];; + +let fun_lambda_with_function_body = + fun {x=x1} {x=x2} -> function {x=x3} -> return (x1+x2+x3);; +let arity = measure_arity fun_lambda_with_function_body;; +[%%expect{| +val fun_lambda_with_function_body : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_single_case {x=x1} {x=x2} = function + | {x=x3} -> return (x1+x2+x3);; +let arity = measure_arity function_body_single_case;; +[%%expect{| +val function_body_single_case : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_constraint {x=x1} {x=x2} : _ = function + | {x=x3} -> return (x1+x2+x3);; +let arity = measure_arity function_body_constraint;; +[%%expect{| +val function_body_constraint : t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_multiple_cases {x=x1} {x=x2} = function + | {x=3} -> (fun {x=x3} -> return (x1+x2+x3)) + | {x=x3} -> (fun {x=x4} -> return (x1+x2+x3+x4));; +let arity = measure_arity function_body_multiple_cases;; +[%%expect{| +val function_body_multiple_cases : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_constraint_multiple_cases {x=x1} {x=x2} : _ = function + | {x=3} -> (fun {x=x3} -> return (x1+x2+x3)) + | {x=x3} -> (fun {x=x4} -> return (x1+x2+x3+x4)) +let arity = measure_arity function_body_constraint_multiple_cases +[%%expect{| +val function_body_constraint_multiple_cases : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_coercion {x=x1} {x=x2} :> _ = function + | {x=0} -> (fun {x=x3} -> return (x1+x2+x3)) + | {x=x3} -> (fun {x=x4} -> return (x1+x2+x3+x4)) +let arity = measure_arity function_body_coercion +[%%expect{| +val function_body_coercion : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +let function_body_coercion_constraint {x=x1} {x=x2} : _ :> _ = function + | {x=0} -> (fun {x=x3} -> return (x1+x2+x3)) + | {x=x3} -> (fun {x=x4} -> return (x1+x2+x3+x4)) +let arity = measure_arity function_body_coercion_constraint +[%%expect{| +val function_body_coercion_constraint : t -> t -> t -> t -> 'a = +val arity : int = 3 +|}];; + +(* partial application: applying a function with arity 3 yields a + function with arity 2. *) +let partial_application {x=x1} {x=x2} = function + | {x=0} -> (fun {x=x3} -> return (x1+x2+x3)) + | {x=x3} -> (fun {x=x4} -> return (x1+x2+x3+x4)) +let arity1 = measure_arity partial_application +let arity2 = measure_arity (partial_application {x=7}) +[%%expect{| +val partial_application : t -> t -> t -> t -> 'a = +val arity1 : int = 3 +val arity2 : int = 2 +|}];; + +(* newtype doesn't interrupt arity *) +let f1 (type a) {x=x1} {x=x2} = return (x1+x2) +let f2 {x=x1} (type a) {x=x2} = return (x1+x2) +let f3 {x=x1} {x=x2} (type a) = return (x1+x2) +let f4 (type a a) {x=x1} (type a a) {x=x2} (type a a) = return (x1+x2) +let arity1 = measure_arity f1 +let arity2 = measure_arity f2 +let arity3 = measure_arity f3 +let arity4 = measure_arity f4 +[%%expect{| +val f1 : t -> t -> 'a = +val f2 : t -> t -> 'a = +val f3 : t -> t -> 'a = +val f4 : t -> t -> 'a = +val arity1 : int = 2 +val arity2 : int = 2 +val arity3 : int = 2 +val arity4 : int = 2 +|}];; diff --git a/testsuite/tests/syntactic-arity/measure_runtime_arity.ml b/testsuite/tests/syntactic-arity/measure_runtime_arity.ml new file mode 100644 index 00000000000..a9203c7213b --- /dev/null +++ b/testsuite/tests/syntactic-arity/measure_runtime_arity.ml @@ -0,0 +1,128 @@ +(* TEST + flags = "-w +A-70"; + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + run; + check-program-output; +*) + +(* Check that the runtime arity of a function (i.e., its 'fast path' for + runtime application) matches its syntactic arity (i.e., the number + of arguments appearing directly following [fun]). +*) + +(* This function will need to change if the runtime representation of closures + changes. Currently, the arity is the first 8 bits of the second field of + a closure. +*) +let extract_arity_from_closure (closure : Obj.t) : int = + assert (Obj.closure_tag = Obj.tag closure); + let clos_info = Obj.raw_field (Obj.repr closure) 1 in + Nativeint.(to_int (shift_right clos_info (Sys.word_size - 8))) + +type (_, _) raw_arity = + | One : (int -> 'ret, 'ret) raw_arity + | Succ : ('f, 'ret) raw_arity -> (int -> 'f, 'ret) raw_arity + +let rec numeric_arity : type f ret. (f, ret) raw_arity -> int = + fun arity -> + match arity with + | One -> 1 + | Succ arity -> numeric_arity arity + 1 + +let rec apply : type f ret. (f, ret) raw_arity -> f -> int -> ret = + fun arity f arg -> + match arity with + | One -> f arg + | Succ arity -> apply arity (f arg) arg + +type 'a arity = + | Tupled + | Curried : ('a, _) raw_arity -> 'a arity + +type packed_raw_arity = Packed_raw_arity : _ raw_arity -> packed_raw_arity +type packed_arity = Packed_arity : _ arity -> packed_arity + +let arity_description (type a) (arity : a arity) = + match arity with + | Tupled -> "tupled fun" + | Curried arity -> Printf.sprintf "%d-ary fun" (numeric_arity arity) + +(* [runtime_arity] depends on representation details of functions and + is subject to change. +*) +let runtime_arity (f : 'a -> 'b) : ('a -> 'b) arity = + let raw_arity = extract_arity_from_closure (Obj.repr f) in + if raw_arity < 0 then Tupled else + let rec build_arity n = + if n = 1 then Packed_raw_arity One + else + let Packed_raw_arity pred = build_arity (n-1) in + Packed_raw_arity (Succ pred) + in + let Packed_raw_arity arity = build_arity raw_arity in + (* Obj.magic is claiming that [f]'s arity matches the arity + we've constructed here. + *) + Curried (Obj.magic arity : ('a -> 'b, _) raw_arity) + +let maybe_runtime_arity (type a) (x : a) : a arity option = + let open struct + type _ is_function = + | Not_function : _ is_function + | Is_function : (_ -> _) is_function + + let is_function (type a) (x : a) = + if Obj.tag (Obj.repr x) = Obj.closure_tag + then (Obj.magic Is_function : a is_function) + else Not_function + end + in + match is_function x with + | Is_function -> Some (runtime_arity x) + | Not_function -> None + +(* The "nested arity" of a value is either: + - the empty list, if the value isn't a function + - x :: xs if the value is a function [f], where [x] is [f]'s arity, and + [xs] is the nested arity of the result of applying [f] to [x] many + values. + + "nested arity" isn't well-defined for a function that, say, returns a 2-ary + function for some inputs and a 3-ary for others. None of the functions in + this test do that. +*) +let rec nested_arity : type a. a -> packed_arity list = + fun f -> + match maybe_runtime_arity f with + | None -> [] + | Some x -> + let rest = + match x with + | Tupled -> [] + | Curried arity -> nested_arity (apply arity f 1_234) + in + Packed_arity x :: rest + +let run ~name f = + Printf.printf "%s: %s\n" name + (nested_arity f + |> List.map (fun (Packed_arity arity) -> arity_description arity) + |> String.concat " returning ") + +let () = + print_endline "Key:"; + print_endline " : "; + print_newline (); + run (fun _ _ _ -> ()) ~name:"3 params"; + run (fun _ _ -> fun _ -> ()) ~name:"2 params then 1 param"; + run (fun _ -> fun _ _ -> ()) ~name:"1 param then 2 params"; + run (fun _ -> fun _ -> fun _ -> ()) + ~name:"1 param, then 1 param, then 1 param"; + run (fun _ -> let g _ _ = () in g) + ~name:"1 param then let-bound 2 params"; + run (fun _ _ -> let g _ = () in g) + ~name:"2 params then let-bound 1 param"; + run (fun _ -> let g _ = let h _ = () in h in g) + ~name:"1 param, then let-bound 1 param, then let-bound 1 param"; +;; diff --git a/testsuite/tests/syntactic-arity/measure_runtime_arity.reference b/testsuite/tests/syntactic-arity/measure_runtime_arity.reference new file mode 100644 index 00000000000..9f1e7c56c3e --- /dev/null +++ b/testsuite/tests/syntactic-arity/measure_runtime_arity.reference @@ -0,0 +1,10 @@ +Key: + : + +3 params: 3-ary fun +2 params then 1 param: 2-ary fun returning 1-ary fun +1 param then 2 params: 1-ary fun returning 2-ary fun +1 param, then 1 param, then 1 param: 1-ary fun returning 1-ary fun returning 1-ary fun +1 param then let-bound 2 params: 1-ary fun returning 2-ary fun +2 params then let-bound 1 param: 2-ary fun returning 1-ary fun +1 param, then let-bound 1 param, then let-bound 1 param: 1-ary fun returning 1-ary fun returning 1-ary fun diff --git a/testsuite/tests/syntactic-arity/syntactic_arity.ml b/testsuite/tests/syntactic-arity/syntactic_arity.ml new file mode 100644 index 00000000000..8c23fbdc124 --- /dev/null +++ b/testsuite/tests/syntactic-arity/syntactic_arity.ml @@ -0,0 +1,70 @@ +(* TEST *) + +(* A few simple tests to demonstrate basic properties of arity. + For more exhaustive tests, look at [measure_arity.ml]. +*) + +let def fun_name param_name = + Printf.printf "Evaluating param %s to %s.\n" param_name fun_name + +(* No optional argument defaults are evaluated until the function is + fully saturated a number of arguments equalling its syntactic arity. +*) +let f ?opt1:(() = def __FUNCTION__ "opt1") () + ?opt2:(() = def __FUNCTION__ "opt2") () = ();; + +print_endline "f, 1 argument:";; +f ();; +print_endline "f, 2 arguments:";; +f () ();; + +(* The arity is the same even in the presence of active patterns, e.g. lazy. *) +let f_lazy ?opt1:(() = def __FUNCTION__ "opt1") (lazy ()) + ?opt2:(() = def __FUNCTION__ "opt2") () = ();; + +print_endline "f_lazy, 1 argument:";; +f_lazy (lazy ());; +print_endline "f_lazy, 2 arguments:";; +f_lazy (lazy ()) ();; + +(* Mutable fields aren't read until the function is fully saturated. *) +let g { contents = x1 } { contents = x2 } () = x1 + x2 +let r = ref 1;; +let g' = g r;; +r := 2;; +let g'' = g' r;; +r := 3;; +let result = g'' ();; +assert (result = 6);; + +(* Patterns and optional arguments are considered left-to-right to preserve + binding structure. +*) +type t = ..;; +module type S = sig + type t += E +end;; + +module M1 : S = struct + type t += E +end;; + +module M2 : S = struct + type t += E +end;; + +let binding1 (module M : S) ?(opt = M.E) () = opt;; + +match binding1 (module M1) () with +| M1.E -> () +| _ -> assert false;; + +let binding2 ?opt:((module M) = (module M1 : S)) M.E = () +[@@ocaml.warning "-8"];; + +binding2 M1.E;; +binding2 ~opt:(module M2) M2.E;; + +match binding2 M2.E with +| exception Match_failure _ -> () +| _ -> assert false;; diff --git a/testsuite/tests/syntactic-arity/syntactic_arity.reference b/testsuite/tests/syntactic-arity/syntactic_arity.reference new file mode 100644 index 00000000000..98f36410841 --- /dev/null +++ b/testsuite/tests/syntactic-arity/syntactic_arity.reference @@ -0,0 +1,8 @@ +f, 1 argument: +f, 2 arguments: +Evaluating param opt1 to Syntactic_arity.f. +Evaluating param opt2 to Syntactic_arity.f. +f_lazy, 1 argument: +f_lazy, 2 arguments: +Evaluating param opt1 to Syntactic_arity.f_lazy. +Evaluating param opt2 to Syntactic_arity.f_lazy. diff --git a/testsuite/tests/syntactic-arity/warnings.ml b/testsuite/tests/syntactic-arity/warnings.ml new file mode 100644 index 00000000000..2529849bce5 --- /dev/null +++ b/testsuite/tests/syntactic-arity/warnings.ml @@ -0,0 +1,92 @@ +(* TEST + expect; +*) + +(* Locations of type errors when there is an error + * partway through checking type parameters. *) + +module type S = sig + type t + type _ u = t -> t +end + +let f (module M : S) = ((fun z -> z) : _ M.u);; +[%%expect {| +module type S = sig type t type _ u = t -> t end +Line 6, characters 23-45: +6 | let f (module M : S) = ((fun z -> z) : _ M.u);; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type M.t -> M.t + but an expression was expected of type 'a + The type constructor M.t would escape its scope +|}];; + +let f (module M : S) y = ((fun z -> z) : _ M.u);; +[%%expect {| +Line 1, characters 25-47: +1 | let f (module M : S) y = ((fun z -> z) : _ M.u);; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type M.t -> M.t + but an expression was expected of type 'a + The type constructor M.t would escape its scope +|}];; + +let f (module M : S) y : _ = ((fun z -> z) : _ M.u);; +[%%expect {| +Line 1, characters 29-51: +1 | let f (module M : S) y : _ = ((fun z -> z) : _ M.u);; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type M.t -> M.t + but an expression was expected of type 'a + The type constructor M.t would escape its scope +|}];; + +let f (module M : S) (type a) = ((fun z -> z) : a M.u);; +[%%expect {| +Line 1, characters 21-54: +1 | let f (module M : S) (type a) = ((fun z -> z) : a M.u);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type M.t -> M.t + but an expression was expected of type 'a + The type constructor M.t would escape its scope +|}];; + +let f (module M : S) (type a) x = ((fun z -> z) : a M.u);; +[%%expect {| +Line 1, characters 21-56: +1 | let f (module M : S) (type a) x = ((fun z -> z) : a M.u);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a -> M.t -> M.t + but an expression was expected of type 'b + The type constructor M.t would escape its scope +|}];; + +let f (module M : S) x (type a) = ((fun z -> z) : a M.u);; +[%%expect {| +Line 1, characters 23-56: +1 | let f (module M : S) x (type a) = ((fun z -> z) : a M.u);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type M.t -> M.t + but an expression was expected of type 'a + The type constructor M.t would escape its scope +|}];; + +let f (module M : S) x (type a) :> a M.u = function z -> z +[%%expect {| +Line 1, characters 23-58: +1 | let f (module M : S) x (type a) :> a M.u = function z -> z + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type M.t -> M.t + but an expression was expected of type 'a + The type constructor M.t would escape its scope +|}];; + +let f (module M : S) x (type a) : a M.u = function z -> z +[%%expect {| +Line 1, characters 23-57: +1 | let f (module M : S) x (type a) : a M.u = function z -> z + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type M.t -> M.t + but an expression was expected of type 'a + The type constructor M.t would escape its scope +|}];; diff --git a/testsuite/tests/templates/basic/bad_arg_impl.ml b/testsuite/tests/templates/basic/bad_arg_impl.ml new file mode 100644 index 00000000000..86371fc4034 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_arg_impl.ml @@ -0,0 +1,4 @@ +type t = unit + +let empty = () +let append () () = `Banana diff --git a/testsuite/tests/templates/basic/bad_arg_impl.reference b/testsuite/tests/templates/basic/bad_arg_impl.reference new file mode 100644 index 00000000000..128ba2632bd --- /dev/null +++ b/testsuite/tests/templates/basic/bad_arg_impl.reference @@ -0,0 +1,12 @@ +File "bad_arg_impl.ml", line 1: +Error: The argument module bad_arg_impl.ml + does not match the parameter signature monoid.cmi: + Values do not match: + val append : unit -> unit -> [> `Banana ] + is not included in + val append : t -> t -> t + The type unit -> unit -> [> `Banana ] is not compatible with the type + t -> t -> t + Type [> `Banana ] is not compatible with type t = unit + File "monoid.mli", line 4, characters 0-24: Expected declaration + File "bad_arg_impl.ml", line 4, characters 4-10: Actual declaration diff --git a/testsuite/tests/templates/basic/bad_arg_intf.mli b/testsuite/tests/templates/basic/bad_arg_intf.mli new file mode 100644 index 00000000000..13c9b7ff4ab --- /dev/null +++ b/testsuite/tests/templates/basic/bad_arg_intf.mli @@ -0,0 +1,4 @@ +type t + +val empty : t +val append : t -> t -> [ `Banana ] diff --git a/testsuite/tests/templates/basic/bad_arg_intf.reference b/testsuite/tests/templates/basic/bad_arg_intf.reference new file mode 100644 index 00000000000..2c5c65e3503 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_arg_intf.reference @@ -0,0 +1,12 @@ +File "bad_arg_intf.mli", line 1: +Error: The argument module bad_arg_intf.mli + does not match the parameter signature monoid.cmi: + Values do not match: + val append : t -> t -> [ `Banana ] + is not included in + val append : t -> t -> t + The type t -> t -> [ `Banana ] is not compatible with the type + t -> t -> t + Type [ `Banana ] is not compatible with type t + File "monoid.mli", line 4, characters 0-24: Expected declaration + File "bad_arg_intf.mli", line 4, characters 0-34: Actual declaration diff --git a/testsuite/tests/templates/basic/bad_impl_as_param.ml b/testsuite/tests/templates/basic/bad_impl_as_param.ml new file mode 100644 index 00000000000..3c30e176633 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_impl_as_param.ml @@ -0,0 +1,11 @@ +(* TEST + readonly_files = "bad_impl_as_param.reference"; + setup-ocamlc.byte-build-env; + flags = "-as-parameter"; + modules = "bad_impl_as_param.ml"; + ocamlc_byte_exit_status = "2"; + compiler_output = "bad_impl_as_param.output"; + ocamlc.byte; + compiler_reference = "bad_impl_as_param.reference"; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/templates/basic/bad_impl_as_param.reference b/testsuite/tests/templates/basic/bad_impl_as_param.reference new file mode 100644 index 00000000000..6eebbb92710 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_impl_as_param.reference @@ -0,0 +1,2 @@ +File "bad_impl_as_param.ml", line 1: +Error: Cannot compile an implementation with -as-parameter. diff --git a/testsuite/tests/templates/basic/bad_param_impl.ml b/testsuite/tests/templates/basic/bad_param_impl.ml new file mode 100644 index 00000000000..0ad3ce763eb --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_impl.ml @@ -0,0 +1,14 @@ +(* TEST + readonly_files = "bad_param_impl.mli bad_param_impl.reference"; + setup-ocamlc.byte-build-env; + flags = "-as-parameter"; + module = "bad_param_impl.mli"; + ocamlc.byte; + flags = ""; + module = "bad_param_impl.ml"; + ocamlc_byte_exit_status = "2"; + compiler_output = "bad_param_impl.output"; + ocamlc.byte; + compiler_reference = "bad_param_impl.reference"; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/templates/basic/bad_param_impl.mli b/testsuite/tests/templates/basic/bad_param_impl.mli new file mode 100644 index 00000000000..6f01572d835 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_impl.mli @@ -0,0 +1 @@ +(* To be compiled with [-as-parameter] *) diff --git a/testsuite/tests/templates/basic/bad_param_impl.reference b/testsuite/tests/templates/basic/bad_param_impl.reference new file mode 100644 index 00000000000..14b23e01ca7 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_impl.reference @@ -0,0 +1,3 @@ +File "bad_param_impl.ml", line 1: +Error: The interface for Bad_param_impl was compiled with -as-parameter. + It cannot be implemented directly. diff --git a/testsuite/tests/templates/basic/bad_param_not_param.mli b/testsuite/tests/templates/basic/bad_param_not_param.mli new file mode 100644 index 00000000000..731e3e2e392 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_not_param.mli @@ -0,0 +1,19 @@ +(* TEST + readonly_files = "bad_param_not_param.reference widget.mli"; + setup-ocamlc.byte-build-env; + flags = ""; + module = "widget.mli"; + compiler_output = "bad_param_not_param.output"; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + flags = "-parameter Widget"; + module = "bad_param_not_param.mli"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = "bad_param_not_param.reference"; + check-ocamlc.byte-output; +*) + +(* Compiled with [-parameter Widget] but [Widget] is not a parameter *) + +val frobnicate : Widget.t -> Widget.t diff --git a/testsuite/tests/templates/basic/bad_param_not_param.reference b/testsuite/tests/templates/basic/bad_param_not_param.reference new file mode 100644 index 00000000000..5cc1c04ae3b --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_not_param.reference @@ -0,0 +1,3 @@ +File "bad_param_not_param.mli", line 1: +Error: The module Widget is specified as a parameter, but widget.cmi + was not compiled with -as-parameter. diff --git a/testsuite/tests/templates/basic/bad_param_packed.mli b/testsuite/tests/templates/basic/bad_param_packed.mli new file mode 100644 index 00000000000..1334a44eafb --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_packed.mli @@ -0,0 +1,11 @@ +(* TEST + readonly_files = "bad_param_packed.reference"; + setup-ocamlc.byte-build-env; + flags = "-as-parameter -for-pack Pack"; + module = "bad_param_packed.mli"; + compiler_output = "bad_param_packed.output"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = "bad_param_packed.reference"; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/templates/basic/bad_param_packed.reference b/testsuite/tests/templates/basic/bad_param_packed.reference new file mode 100644 index 00000000000..b998e345645 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_packed.reference @@ -0,0 +1,2 @@ +File "_none_", line 1: +Error: Cannot compile a parameter with -for-pack. diff --git a/testsuite/tests/templates/basic/bad_param_param.mli b/testsuite/tests/templates/basic/bad_param_param.mli new file mode 100644 index 00000000000..36e4567c4c6 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_param.mli @@ -0,0 +1,3 @@ +(* Compiled with both [-parameter Monoid] and [-as-parameter] *) + +val f : Monoid.t -> Monoid.t diff --git a/testsuite/tests/templates/basic/bad_param_param.reference b/testsuite/tests/templates/basic/bad_param_param.reference new file mode 100644 index 00000000000..331cfe98fc2 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_param_param.reference @@ -0,0 +1,3 @@ +File "_none_", line 1: +Error: Cannot combine -as-parameter with -parameter: parameters cannot + be parameterised. diff --git a/testsuite/tests/templates/basic/bad_ref_direct.ml b/testsuite/tests/templates/basic/bad_ref_direct.ml new file mode 100644 index 00000000000..7fbd0d0b73d --- /dev/null +++ b/testsuite/tests/templates/basic/bad_ref_direct.ml @@ -0,0 +1,3 @@ +(* [Monoid] is not a parameter *) + +let empty = Monoid.id diff --git a/testsuite/tests/templates/basic/bad_ref_direct.reference b/testsuite/tests/templates/basic/bad_ref_direct.reference new file mode 100644 index 00000000000..41b081e6997 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_ref_direct.reference @@ -0,0 +1,3 @@ +File "bad_ref_direct.ml", line 1: +Error: The file monoid.cmi contains the interface of a parameter. + Monoid is not declared as a parameter for the current unit (-parameter Monoid). diff --git a/testsuite/tests/templates/basic/bad_ref_indirect.reference b/testsuite/tests/templates/basic/bad_ref_indirect.reference new file mode 100644 index 00000000000..2b690323618 --- /dev/null +++ b/testsuite/tests/templates/basic/bad_ref_indirect.reference @@ -0,0 +1,5 @@ +File "bad_ref_indirect.ml", line 1: +Error: The module Monoid_utils is not accessible because it takes Monoid + as a parameter and the current unit does not. +Hint: Pass `-parameter Monoid` to add Monoid as a parameter + of the current unit. diff --git a/testsuite/tests/templates/basic/monoid.mli b/testsuite/tests/templates/basic/monoid.mli new file mode 100644 index 00000000000..1abe7d4d943 --- /dev/null +++ b/testsuite/tests/templates/basic/monoid.mli @@ -0,0 +1,4 @@ +type t + +val empty : t +val append : t -> t -> t diff --git a/testsuite/tests/templates/basic/monoid_utils.ml b/testsuite/tests/templates/basic/monoid_utils.ml new file mode 100644 index 00000000000..32a7bc441d9 --- /dev/null +++ b/testsuite/tests/templates/basic/monoid_utils.ml @@ -0,0 +1,3 @@ +type ts = Monoid.t list + +let concat = List.fold_left Monoid.append Monoid.empty diff --git a/testsuite/tests/templates/basic/monoid_utils.mli b/testsuite/tests/templates/basic/monoid_utils.mli new file mode 100644 index 00000000000..6feb1f4ac13 --- /dev/null +++ b/testsuite/tests/templates/basic/monoid_utils.mli @@ -0,0 +1,3 @@ +type ts = Monoid.t list + +val concat : ts -> Monoid.t diff --git a/testsuite/tests/templates/basic/monoid_utils_as_program.reference b/testsuite/tests/templates/basic/monoid_utils_as_program.reference new file mode 100644 index 00000000000..290e022f232 --- /dev/null +++ b/testsuite/tests/templates/basic/monoid_utils_as_program.reference @@ -0,0 +1 @@ +Fatal error: exception Invalid_argument("-parameter not yet implemented") diff --git a/testsuite/tests/templates/basic/ref_indirect.cmo.ocamlobjinfo.reference b/testsuite/tests/templates/basic/ref_indirect.cmo.ocamlobjinfo.reference new file mode 100644 index 00000000000..5e4fdd34e2c --- /dev/null +++ b/testsuite/tests/templates/basic/ref_indirect.cmo.ocamlobjinfo.reference @@ -0,0 +1,22 @@ +File ref_indirect.cmo +Unit name: Ref_indirect +Interfaces imported: + 00000000000000000000000000000000 Stdlib + 00000000000000000000000000000000 Ref_indirect + 00000000000000000000000000000000 Monoid_utils + 00000000000000000000000000000000 Monoid + 00000000000000000000000000000000 CamlinternalFormatBasics +Required globals: +Uses unsafe features: no +Force link: no +File ref_indirect.cmi +Unit name: Ref_indirect +Is parameter: no +Parameters: + Monoid +Interfaces imported: + 00000000000000000000000000000000 Ref_indirect + 00000000000000000000000000000000 Stdlib + 00000000000000000000000000000000 Monoid_utils + 00000000000000000000000000000000 Monoid + 00000000000000000000000000000000 CamlinternalFormatBasics diff --git a/testsuite/tests/templates/basic/ref_indirect.cmx.ocamlobjinfo.reference b/testsuite/tests/templates/basic/ref_indirect.cmx.ocamlobjinfo.reference new file mode 100644 index 00000000000..986e58b4771 --- /dev/null +++ b/testsuite/tests/templates/basic/ref_indirect.cmx.ocamlobjinfo.reference @@ -0,0 +1,30 @@ +File ref_indirect.cmx +Name: Ref_indirect +CRC of implementation: 00000000000000000000000000000000 +Globals defined: + Ref_indirect +Interfaces imported: + 00000000000000000000000000000000 Stdlib + 00000000000000000000000000000000 Ref_indirect + 00000000000000000000000000000000 Monoid_utils + 00000000000000000000000000000000 Monoid + 00000000000000000000000000000000 CamlinternalFormatBasics +Implementations imported: +Flambda 2 unit (with no export information) +Currying functions: +Apply functions: +Send functions: +Force link: no +Function summaries for static checks: + camlRef_indirect__entry = 0x15 +File ref_indirect.cmi +Unit name: Ref_indirect +Is parameter: no +Parameters: + Monoid +Interfaces imported: + 00000000000000000000000000000000 Ref_indirect + 00000000000000000000000000000000 Stdlib + 00000000000000000000000000000000 Monoid_utils + 00000000000000000000000000000000 Monoid + 00000000000000000000000000000000 CamlinternalFormatBasics diff --git a/testsuite/tests/templates/basic/ref_indirect.ml b/testsuite/tests/templates/basic/ref_indirect.ml new file mode 100644 index 00000000000..e80d19e6d02 --- /dev/null +++ b/testsuite/tests/templates/basic/ref_indirect.ml @@ -0,0 +1 @@ +let concat = Monoid_utils.concat diff --git a/testsuite/tests/templates/basic/string_monoid.ml b/testsuite/tests/templates/basic/string_monoid.ml new file mode 100644 index 00000000000..43385c451b3 --- /dev/null +++ b/testsuite/tests/templates/basic/string_monoid.ml @@ -0,0 +1,4 @@ +type t = string + +let empty = "" +let append = (^) diff --git a/testsuite/tests/templates/basic/string_monoid.mli b/testsuite/tests/templates/basic/string_monoid.mli new file mode 100644 index 00000000000..a915a865726 --- /dev/null +++ b/testsuite/tests/templates/basic/string_monoid.mli @@ -0,0 +1,4 @@ +type t = string + +val empty : t +val append : t -> t -> t diff --git a/testsuite/tests/templates/basic/test.ml b/testsuite/tests/templates/basic/test.ml new file mode 100644 index 00000000000..959abe57058 --- /dev/null +++ b/testsuite/tests/templates/basic/test.ml @@ -0,0 +1,253 @@ +(* TEST + readonly_files = "\ + bad_arg_impl.ml bad_arg_impl.reference \ + bad_arg_intf.mli bad_arg_intf.reference \ + bad_param_param.mli bad_param_param.reference \ + bad_ref_direct.ml bad_ref_direct.reference \ + bad_ref_indirect.reference \ + monoid.mli \ + monoid_utils.ml monoid_utils.mli monoid_utils_as_program.reference \ + ref_indirect.ml \ + ref_indirect.cmo.ocamlobjinfo.reference \ + ref_indirect.cmx.ocamlobjinfo.reference \ + string_monoid.ml string_monoid.mli \ + test_direct_access.ml test_direct_access.reference \ + "; + + { + setup-ocamlc.byte-build-env; + + flags = "-as-parameter"; + module = "monoid.mli"; + ocamlc.byte; + { + flags = ""; + module = "bad_ref_direct.ml"; + compiler_output = "bad_ref_direct.output"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + + compiler_reference = "bad_ref_direct.reference"; + check-ocamlc.byte-output; + }{ + flags = "-parameter Monoid -as-parameter"; + module = "bad_param_param.mli"; + compiler_output = "bad_param_param.output"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + + compiler_reference = "bad_param_param.reference"; + check-ocamlc.byte-output; + }{ + flags = "-as-argument-for Monoid"; + module = "bad_arg_impl.ml"; + compiler_output = "bad_arg_impl.output"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + + compiler_reference = "bad_arg_impl.reference"; + check-ocamlc.byte-output; + }{ + flags = "-as-argument-for Monoid"; + module = "bad_arg_intf.mli"; + compiler_output = "bad_arg_intf.output"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + + compiler_reference = "bad_arg_intf.reference"; + check-ocamlc.byte-output; + }{ + src = "string_monoid.ml"; + dst = "string_monoid_no_mli.ml"; + copy; + + flags = "-as-argument-for Monoid"; + module = "string_monoid_no_mli.ml string_monoid.mli string_monoid.ml"; + ocamlc.byte; + + flags = ""; + module = "test_direct_access.ml"; + ocamlc.byte; + + flags = ""; + program = "${test_build_directory}/test_direct_access.bc"; + module = ""; + all_modules = "\ + string_monoid.cmo \ + string_monoid_no_mli.cmo \ + test_direct_access.cmo \ + "; + ocamlc.byte; + + output = "test_direct_access.output"; + exit_status = "0"; + run; + + reference = "test_direct_access.reference"; + check-program-output; + }{ + flags = "-parameter Monoid"; + module = "monoid_utils.mli monoid_utils.ml"; + ocamlc.byte; + { + src = "ref_indirect.ml"; + dst = "bad_ref_indirect.ml"; + copy; + + flags = ""; + module = "bad_ref_indirect.ml"; + compiler_output = "bad_ref_indirect.output"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + + compiler_reference = "bad_ref_indirect.reference"; + check-ocamlc.byte-output; + }{ + flags = "-parameter Monoid"; + module = "ref_indirect.ml"; + ocamlc.byte; + + (* [-no-code] and [-no-approx] are currently unimplemented (see PR 2737), which + sadly does make the reference file here a mite bloated and sensitive to + random changes in flambda2. *) + program = "-no-code -no-approx ref_indirect.cmo ref_indirect.cmi"; + output = "ref_indirect.cmo.ocamlobjinfo.output"; + ocamlobjinfo; + + reference = "ref_indirect.cmo.ocamlobjinfo.reference"; + check-program-output; + }{ + program = "${test_build_directory}/monoid_utils_as_program.bc"; + module = ""; + all_modules = "monoid_utils.cmo "; + ocamlc.byte; + + output = "monoid_utils_as_program.output"; + exit_status = "2"; + run; + + reference = "monoid_utils_as_program.reference"; + check-program-output; + } + } + }{ + setup-ocamlopt.byte-build-env; + + flags = "-as-parameter"; + module = "monoid.mli"; + ocamlopt.byte; + { + flags = ""; + module = "bad_ref_direct.ml"; + compiler_output = "bad_ref_direct.output"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + + compiler_reference = "bad_ref_direct.reference"; + check-ocamlopt.byte-output; + }{ + flags = "-parameter Monoid -as-parameter"; + module = "bad_param_param.mli"; + compiler_output = "bad_param_param.output"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + + compiler_reference = "bad_param_param.reference"; + check-ocamlopt.byte-output; + }{ + flags = "-as-argument-for Monoid"; + module = "bad_arg_impl.ml"; + compiler_output = "bad_arg_impl.output"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + + compiler_reference = "bad_arg_impl.reference"; + check-ocamlopt.byte-output; + }{ + flags = "-as-argument-for Monoid"; + module = "bad_arg_intf.mli"; + compiler_output = "bad_arg_intf.output"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + + compiler_reference = "bad_arg_intf.reference"; + check-ocamlopt.byte-output; + }{ + src = "string_monoid.ml"; + dst = "string_monoid_no_mli.ml"; + copy; + + flags = "-as-argument-for Monoid"; + module = "string_monoid_no_mli.ml string_monoid.mli string_monoid.ml"; + ocamlopt.byte; + + flags = ""; + module = "test_direct_access.ml"; + ocamlopt.byte; + + flags = ""; + program = "${test_build_directory}/test_direct_access.exe"; + module = ""; + all_modules = "\ + string_monoid.cmx \ + string_monoid_no_mli.cmx \ + test_direct_access.cmx \ + "; + ocamlopt.byte; + + output = "test_direct_access.output"; + exit_status = "0"; + run; + + reference = "test_direct_access.reference"; + check-program-output; + }{ + flags = "-parameter Monoid"; + module = "monoid_utils.mli monoid_utils.ml"; + ocamlopt.byte; + { + src = "ref_indirect.ml"; + dst = "bad_ref_indirect.ml"; + copy; + + flags = ""; + module = "bad_ref_indirect.ml"; + compiler_output = "bad_ref_indirect.output"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + + compiler_reference = "bad_ref_indirect.reference"; + check-ocamlopt.byte-output; + }{ + flags = "-parameter Monoid"; + module = "ref_indirect.ml"; + ocamlopt.byte; + + (* [-no-code] and [-no-approx] are currently unimplemented (see PR 2737), which + sadly does make the reference file here a mite bloated and sensitive to + random changes in flambda2. *) + program = "-no-code -no-approx ref_indirect.cmx ref_indirect.cmi"; + output = "ref_indirect.cmx.ocamlobjinfo.output"; + ocamlobjinfo; + + reason = "sensitive to runtime4 vs. runtime5; will be fixed by PR 2737"; + skip; + + reference = "ref_indirect.cmx.ocamlobjinfo.reference"; + check-program-output; + }{ + program = "${test_build_directory}/monoid_utils_as_program.exe"; + module = ""; + all_modules = "monoid_utils.cmx "; + ocamlopt.byte; + + output = "monoid_utils_as_program.output"; + exit_status = "2"; + run; + + reference = "monoid_utils_as_program.reference"; + check-program-output; + } + } + } +*) diff --git a/testsuite/tests/templates/basic/test_direct_access.ml b/testsuite/tests/templates/basic/test_direct_access.ml new file mode 100644 index 00000000000..01cb6358343 --- /dev/null +++ b/testsuite/tests/templates/basic/test_direct_access.ml @@ -0,0 +1,5 @@ +let () = + let open Printf in + printf "With .mli: %s\n" (String_monoid.append "Hello " "world!"); + printf "Without .mli: %s\n" (String_monoid_no_mli.append "Hello " "world!"); + () diff --git a/testsuite/tests/templates/basic/test_direct_access.reference b/testsuite/tests/templates/basic/test_direct_access.reference new file mode 100644 index 00000000000..bd0888b5798 --- /dev/null +++ b/testsuite/tests/templates/basic/test_direct_access.reference @@ -0,0 +1,2 @@ +With .mli: Hello world! +Without .mli: Hello world! diff --git a/testsuite/tests/templates/basic/widget.mli b/testsuite/tests/templates/basic/widget.mli new file mode 100644 index 00000000000..56e271e5159 --- /dev/null +++ b/testsuite/tests/templates/basic/widget.mli @@ -0,0 +1,3 @@ +(* Not compiled with -as-parameter *) + +type t diff --git a/testsuite/tests/tmc/ambiguities.ml b/testsuite/tests/tmc/ambiguities.ml index 55d99fe236e..0f846587cdb 100644 --- a/testsuite/tests/tmc/ambiguities.ml +++ b/testsuite/tests/tmc/ambiguities.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) type 'a tree = | Leaf of 'a | Node of 'a tree * 'a tree diff --git a/testsuite/tests/tmc/other_features.ml b/testsuite/tests/tmc/other_features.ml index 0183b01858b..d75e1dab0c6 100644 --- a/testsuite/tests/tmc/other_features.ml +++ b/testsuite/tests/tmc/other_features.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) module Non_recursive_let_bad = struct type 'a t = diff --git a/testsuite/tests/tmc/partial_application.ml b/testsuite/tests/tmc/partial_application.ml index 7721416f828..35ddd35e8bc 100644 --- a/testsuite/tests/tmc/partial_application.ml +++ b/testsuite/tests/tmc/partial_application.ml @@ -1,6 +1,6 @@ -(* TEST - * bytecode - * native +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) type t = Ret of (unit -> unit) | Next of t @@ -17,3 +17,11 @@ let () = match g ~first:true with | Next (Ret f) -> f () | _ -> assert false + +(* TEST + { + bytecode; + }{ + native; + } +*) diff --git a/testsuite/tests/tmc/readable_output.ml b/testsuite/tests/tmc/readable_output.ml index 8204b7d812c..89e222fe062 100644 --- a/testsuite/tests/tmc/readable_output.ml +++ b/testsuite/tests/tmc/readable_output.ml @@ -1,6 +1,7 @@ (* TEST - flags = "-dlambda -dno-unique-ids" - * expect *) + flags = "-dlambda -dno-unique-ids"; + expect; +*) (* Check that the code produced by TMC reads reasonably well. *) let[@tail_mod_cons] rec map f = function diff --git a/testsuite/tests/tmc/region_close.ml b/testsuite/tests/tmc/region_close.ml index 80ec912c19b..1f4b6b929f7 100644 --- a/testsuite/tests/tmc/region_close.ml +++ b/testsuite/tests/tmc/region_close.ml @@ -1,6 +1,9 @@ (* TEST - * bytecode - * native + { + bytecode; + }{ + native; + } *) (* This was producing an error in ocamlopt because the call to [failwith] had diff --git a/testsuite/tests/tmc/semantic.ml b/testsuite/tests/tmc/semantic.ml index 32ffed168a1..3e99e5a947e 100644 --- a/testsuite/tests/tmc/semantic.ml +++ b/testsuite/tests/tmc/semantic.ml @@ -1,5 +1,5 @@ (* TEST - * bytecode + bytecode; *) (* Test that evaluation order of constructor arguments is preserved. diff --git a/testsuite/tests/tmc/stack_space.ml b/testsuite/tests/tmc/stack_space.ml index 664cc2e668f..45499db65ab 100644 --- a/testsuite/tests/tmc/stack_space.ml +++ b/testsuite/tests/tmc/stack_space.ml @@ -1,13 +1,13 @@ (* TEST - * setup-ocamlc.byte-build-env - ** ocamlc.byte - module = "stack_space.ml" - *** ocamlc.byte - program = "./test.byte.exe" - all_modules = "stack_space.cmo" - module = "" - **** run - ocamlrunparam += ",l=300" + setup-ocamlc.byte-build-env; + module = "stack_space.ml"; + ocamlc.byte; + program = "./test.byte.exe"; + all_modules = "stack_space.cmo"; + module = ""; + ocamlc.byte; + ocamlrunparam += ",l=300"; + run; *) (* large with respect to the stack-size=300 setting above *) diff --git a/testsuite/tests/tmc/tupled_function.ml b/testsuite/tests/tmc/tupled_function.ml index 605bab98861..5ed4172f9ae 100644 --- a/testsuite/tests/tmc/tupled_function.ml +++ b/testsuite/tests/tmc/tupled_function.ml @@ -1,6 +1,9 @@ (* TEST - * bytecode - * native + { + bytecode; + }{ + native; + } *) type 'a t = | N of 'a diff --git a/testsuite/tests/tmc/tupled_function_calls.ml b/testsuite/tests/tmc/tupled_function_calls.ml index 1ce7fa5f6ef..a99354def49 100644 --- a/testsuite/tests/tmc/tupled_function_calls.ml +++ b/testsuite/tests/tmc/tupled_function_calls.ml @@ -1,6 +1,6 @@ -(* TEST - * bytecode - * native +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) (* this works as expected *) @@ -19,3 +19,11 @@ let[@tail_mod_cons] rec tupled_map_not_direct (f, li) = | x :: xs -> let pair = (f, xs) in f x :: (tupled_map_not_direct[@tailcall true]) pair + +(* TEST + { + bytecode; + }{ + native; + } +*) diff --git a/testsuite/tests/tmc/usage_warnings.ml b/testsuite/tests/tmc/usage_warnings.ml index 966b65983fc..009210a6133 100644 --- a/testsuite/tests/tmc/usage_warnings.ml +++ b/testsuite/tests/tmc/usage_warnings.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) (* build-up *) let[@tail_mod_cons] rec append xs ys = diff --git a/testsuite/tests/tool-command-line/test-o-one-c-file.ml b/testsuite/tests/tool-command-line/test-o-one-c-file.ml index 0d35166787b..04e949255bc 100644 --- a/testsuite/tests/tool-command-line/test-o-one-c-file.ml +++ b/testsuite/tests/tool-command-line/test-o-one-c-file.ml @@ -1,14 +1,14 @@ (* TEST -readonly_files = "hello.c" -* setup-ocamlopt.opt-build-env -** script -script = "mkdir outputdir" -*** ocamlopt.opt -all_modules = "hello.c" -compile_only = "true" -flags = "-o outputdir/hello.${objext}" -**** file-exists -file = "outputdir/hello.${objext}" + readonly_files = "hello.c"; + setup-ocamlopt.opt-build-env; + script = "mkdir outputdir"; + script; + all_modules = "hello.c"; + compile_only = "true"; + flags = "-o outputdir/hello.${objext}"; + ocamlopt.opt; + file = "outputdir/hello.${objext}"; + file-exists; *) (* diff --git a/testsuite/tests/tool-command-line/test-o-several-files.ml b/testsuite/tests/tool-command-line/test-o-several-files.ml index 090ace50433..8c5f95eedf2 100644 --- a/testsuite/tests/tool-command-line/test-o-several-files.ml +++ b/testsuite/tests/tool-command-line/test-o-several-files.ml @@ -1,11 +1,11 @@ (* TEST -* setup-ocamlopt.opt-build-env -** ocamlopt.opt -all_modules = "foo.c bar.c" -compile_only = "true" -flags = "-o outputdir/baz.${objext}" -ocamlopt_opt_exit_status = "2" -*** check-ocamlopt.opt-output + setup-ocamlopt.opt-build-env; + all_modules = "foo.c bar.c"; + compile_only = "true"; + flags = "-o outputdir/baz.${objext}"; + ocamlopt_opt_exit_status = "2"; + ocamlopt.opt; + check-ocamlopt.opt-output; *) (* diff --git a/testsuite/tests/tool-command-line/test-unknown-file.ml b/testsuite/tests/tool-command-line/test-unknown-file.ml index 148220e5cee..2d09383701e 100644 --- a/testsuite/tests/tool-command-line/test-unknown-file.ml +++ b/testsuite/tests/tool-command-line/test-unknown-file.ml @@ -1,31 +1,30 @@ (* TEST - -readonly_files = "unknown-file" - -* setup-ocamlc.byte-build-env -compiler_output = "compiler-output.raw" -** ocamlc.byte -all_modules = "" -flags = "unknown-file" -ocamlc_byte_exit_status = "2" -*** script -script = "grep 'know what to do with unknown-file' compiler-output.raw" -output = "compiler-output" -**** check-ocamlc.byte-output -compiler_output = "compiler-output" - -* setup-ocamlopt.byte-build-env -compiler_output = "compiler-output.raw" -** ocamlopt.byte -all_modules = "" -flags = "unknown-file" -ocamlopt_byte_exit_status = "2" -*** script -script = "grep 'know what to do with unknown-file' compiler-output.raw" -output = "compiler-output" -**** check-ocamlopt.byte-output -compiler_output = "compiler-output" - + readonly_files = "unknown-file"; + { + compiler_output = "compiler-output.raw"; + setup-ocamlc.byte-build-env; + all_modules = ""; + flags = "unknown-file"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + script = "grep 'know what to do with unknown-file' compiler-output.raw"; + output = "compiler-output"; + script; + compiler_output = "compiler-output"; + check-ocamlc.byte-output; + }{ + compiler_output = "compiler-output.raw"; + setup-ocamlopt.byte-build-env; + all_modules = ""; + flags = "unknown-file"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + script = "grep 'know what to do with unknown-file' compiler-output.raw"; + output = "compiler-output"; + script; + compiler_output = "compiler-output"; + check-ocamlopt.byte-output; + } *) (* diff --git a/testsuite/tests/tool-debugger/basic/debuggee.ml b/testsuite/tests/tool-debugger/basic/debuggee.ml index 91ad3c21dcd..a5320cf5915 100644 --- a/testsuite/tests/tool-debugger/basic/debuggee.ml +++ b/testsuite/tests/tool-debugger/basic/debuggee.ml @@ -1,14 +1,14 @@ (* TEST -set foo = "bar" -flags += " -g " -ocamldebug_script = "${test_source_directory}/input_script" -* debugger -** shared-libraries -*** setup-ocamlc.byte-build-env -**** ocamlc.byte -***** check-ocamlc.byte-output -****** ocamldebug -******* check-program-output + set foo = "bar"; + flags += " -g "; + ocamldebug_script = "${test_source_directory}/input_script"; + debugger; + shared-libraries; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; + ocamldebug; + check-program-output; *) print_endline Sys.argv.(1);; diff --git a/testsuite/tests/tool-debugger/dynlink/host.ml b/testsuite/tests/tool-debugger/dynlink/host.ml index f46ef8a022e..ef12572f681 100644 --- a/testsuite/tests/tool-debugger/dynlink/host.ml +++ b/testsuite/tests/tool-debugger/dynlink/host.ml @@ -1,35 +1,32 @@ (* TEST - -include dynlink -readonly_files = "host.ml plugin.ml" -libraries = "" - -flags += " -g " -ocamldebug_script = "${test_source_directory}/input_script" - -* debugger -** shared-libraries -*** setup-ocamlc.byte-build-env -**** ocamlc.byte -module = "host.ml" -***** ocamlc.byte -module = "plugin.ml" -****** ocamlc.byte -module = "" -all_modules = "host.cmo" -program = "${test_build_directory}/host.byte" -libraries = "dynlink" - -******* run -output = "host.output" -******** check-program-output -reference = "${test_source_directory}/host.reference" - -******** ocamldebug -output = "host.debug.output" -********* check-program-output -reference = "${test_source_directory}/host.debug.reference" - + include dynlink; + readonly_files = "host.ml plugin.ml"; + libraries = ""; + flags += " -g "; + ocamldebug_script = "${test_source_directory}/input_script"; + debugger; + shared-libraries; + setup-ocamlc.byte-build-env; + module = "host.ml"; + ocamlc.byte; + module = "plugin.ml"; + ocamlc.byte; + module = ""; + all_modules = "host.cmo"; + program = "${test_build_directory}/host.byte"; + libraries = "dynlink"; + ocamlc.byte; + output = "host.output"; + run; + { + reference = "${test_source_directory}/host.reference"; + check-program-output; + }{ + output = "host.debug.output"; + ocamldebug; + reference = "${test_source_directory}/host.debug.reference"; + check-program-output; + } *) let () = print_endline "hello host"; Dynlink.loadfile "plugin.cmo" diff --git a/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml b/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml index 70aee3ff048..37544574d91 100644 --- a/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml +++ b/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml @@ -1,25 +1,25 @@ (* TEST -ocamldebug_script = "${test_source_directory}/input_script" -* debugger -** shared-libraries -*** setup-ocamlc.byte-build-env -**** script -script = "mkdir out" -***** ocamlc.byte -flags = "-g -c" -all_modules = "${test_source_directory}/in/blah.ml" -program = "out/blah.cmo" -****** ocamlc.byte -program = "out/foo.cmo" -flags = "-I out -g -c" -all_modules = "${test_source_directory}/in/foo.ml" -******* ocamlc.byte -all_modules = "out/blah.cmo out/foo.cmo" -flags = " -g " -program = "debuggee.exe" -******** check-ocamlc.byte-output -********* ocamldebug -********** check-program-output + ocamldebug_script = "${test_source_directory}/input_script"; + debugger; + shared-libraries; + setup-ocamlc.byte-build-env; + script = "mkdir out"; + script; + flags = "-g -c"; + all_modules = "${test_source_directory}/in/blah.ml"; + program = "out/blah.cmo"; + ocamlc.byte; + program = "out/foo.cmo"; + flags = "-I out -g -c"; + all_modules = "${test_source_directory}/in/foo.ml"; + ocamlc.byte; + all_modules = "out/blah.cmo out/foo.cmo"; + flags = " -g "; + program = "debuggee.exe"; + ocamlc.byte; + check-ocamlc.byte-output; + ocamldebug; + check-program-output; *) (* This file only contains the specification of how to run the test *) diff --git a/testsuite/tests/tool-debugger/module_named_main/main.ml b/testsuite/tests/tool-debugger/module_named_main/main.ml index 25eebe7c027..8c374be083a 100644 --- a/testsuite/tests/tool-debugger/module_named_main/main.ml +++ b/testsuite/tests/tool-debugger/module_named_main/main.ml @@ -1,13 +1,13 @@ -(* TEST -flags += " -g " -ocamldebug_script = "${test_source_directory}/input_script" -* debugger -** shared-libraries -*** setup-ocamlc.byte-build-env -**** ocamlc.byte -***** check-ocamlc.byte-output -****** ocamldebug -******* check-program-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + *) module Submodule = struct @@ -28,3 +28,15 @@ let debug () = ;; debug (); + +(* TEST + flags += " -g "; + ocamldebug_script = "${test_source_directory}/input_script"; + debugger; + shared-libraries; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; + ocamldebug; + check-program-output; +*) diff --git a/testsuite/tests/tool-debugger/no_debug_event/noev.ml b/testsuite/tests/tool-debugger/no_debug_event/noev.ml index 4eb334ea845..746b310b961 100644 --- a/testsuite/tests/tool-debugger/no_debug_event/noev.ml +++ b/testsuite/tests/tool-debugger/no_debug_event/noev.ml @@ -1,28 +1,28 @@ (* TEST -readonly_files = "a.ml b.ml" -ocamldebug_script = "${test_source_directory}/input_script" -* debugger -** shared-libraries -*** setup-ocamlc.byte-build-env -**** ocamlc.byte -module = "a.ml" -flags = "-g -for-pack foo" -***** ocamlc.byte -module = "" -all_modules = "a.cmo" -program = "foo.cmo" -flags = "-g -pack" -****** ocamlc.byte -module = "b.ml" -flags = " -g " -******* ocamlc.byte -module = "" -flags = " -g " -all_modules = "foo.cmo b.cmo" -program = "${test_build_directory}/noev.exe" -******** check-ocamlc.byte-output -********* ocamldebug -********** check-program-output + readonly_files = "a.ml b.ml"; + ocamldebug_script = "${test_source_directory}/input_script"; + debugger; + shared-libraries; + setup-ocamlc.byte-build-env; + module = "a.ml"; + flags = "-g -for-pack foo"; + ocamlc.byte; + module = ""; + all_modules = "a.cmo"; + program = "foo.cmo"; + flags = "-g -pack"; + ocamlc.byte; + module = "b.ml"; + flags = " -g "; + ocamlc.byte; + module = ""; + flags = " -g "; + all_modules = "foo.cmo b.cmo"; + program = "${test_build_directory}/noev.exe"; + ocamlc.byte; + check-ocamlc.byte-output; + ocamldebug; + check-program-output; *) (* This file only contains the specification of how to run the test *) diff --git a/testsuite/tests/tool-debugger/printer/debuggee.ml b/testsuite/tests/tool-debugger/printer/debuggee.ml index f22a4bd50f6..ab5f293a3fc 100644 --- a/testsuite/tests/tool-debugger/printer/debuggee.ml +++ b/testsuite/tests/tool-debugger/printer/debuggee.ml @@ -1,17 +1,17 @@ -(* TEST -flags += " -g " -ocamldebug_script = "${test_source_directory}/input_script" -readonly_files = "printer.ml" -include debugger -* debugger -** shared-libraries -*** setup-ocamlc.byte-build-env -**** ocamlc.byte -module = "printer.ml" -**** ocamlc.byte -***** check-ocamlc.byte-output -****** ocamldebug -******* check-program-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + *) let f x = @@ -20,3 +20,22 @@ let f x = done let () = f 3 + +(* TEST + flags += " -g "; + ocamldebug_script = "${test_source_directory}/input_script"; + readonly_files = "printer.ml"; + include debugger; + debugger; + shared-libraries; + setup-ocamlc.byte-build-env; + { + module = "printer.ml"; + ocamlc.byte; + }{ + ocamlc.byte; + check-ocamlc.byte-output; + ocamldebug; + check-program-output; + } +*) diff --git a/testsuite/tests/tool-dumpobj/test.ml b/testsuite/tests/tool-dumpobj/test.ml index 240732e3610..cf83b7d84a0 100644 --- a/testsuite/tests/tool-dumpobj/test.ml +++ b/testsuite/tests/tool-dumpobj/test.ml @@ -1,10 +1,8 @@ (* TEST - -flags = "-nopervasives" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** run -**** check-program-output + flags = "-nopervasives"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + run; + check-program-output; *) let x = 42L diff --git a/testsuite/tests/tool-expect-test/clean_typer.ml b/testsuite/tests/tool-expect-test/clean_typer.ml index 535ce8d8f19..0e000ad6154 100644 --- a/testsuite/tests/tool-expect-test/clean_typer.ml +++ b/testsuite/tests/tool-expect-test/clean_typer.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Variants = struct diff --git a/testsuite/tests/tool-expect-test/include.ml b/testsuite/tests/tool-expect-test/include.ml new file mode 100644 index 00000000000..beeeea5de28 --- /dev/null +++ b/testsuite/tests/tool-expect-test/include.ml @@ -0,0 +1,13 @@ +(* TEST + include unix; + hasunix; + libunix; + expect; +*) + +(* Test that [include] works in expect tests: the Unix module is not + available by default. *) +Unix.sleepf 0.01;; +[%%expect {| +- : unit = () +|}] diff --git a/testsuite/tests/tool-lexyacc/calc.ml b/testsuite/tests/tool-lexyacc/calc.ml index ec2bb795726..f0ded386051 100644 --- a/testsuite/tests/tool-lexyacc/calc.ml +++ b/testsuite/tests/tool-lexyacc/calc.ml @@ -1,9 +1,9 @@ (* TEST - modules = "calc_parser.mly calc_lexer.mll" - ocamllex_flags = " -q " - ocamlyacc_flags = " -q " - readonly_files = "calc_input.txt" - stdin = "calc_input.txt" + modules = "calc_parser.mly calc_lexer.mll"; + ocamllex_flags = " -q "; + ocamlyacc_flags = " -q "; + readonly_files = "calc_input.txt"; + stdin = "calc_input.txt"; *) let _ = try diff --git a/testsuite/tests/tool-lexyacc/chars.mll b/testsuite/tests/tool-lexyacc/chars.mll index b91f2618597..3bc3ffdf17f 100644 --- a/testsuite/tests/tool-lexyacc/chars.mll +++ b/testsuite/tests/tool-lexyacc/chars.mll @@ -1,5 +1,5 @@ (* TEST - ocamllex_flags = " -q " + ocamllex_flags = " -q "; *) { diff --git a/testsuite/tests/tool-lexyacc/csets.mll b/testsuite/tests/tool-lexyacc/csets.mll index 91e9e35fb59..a1aefeee438 100644 --- a/testsuite/tests/tool-lexyacc/csets.mll +++ b/testsuite/tests/tool-lexyacc/csets.mll @@ -1,5 +1,5 @@ (* TEST - ocamllex_flags = " -q " + ocamllex_flags = " -q "; *) let digit = ['0'-'9'] diff --git a/testsuite/tests/tool-lexyacc/mpr7760.mll b/testsuite/tests/tool-lexyacc/mpr7760.mll index bffca2d5701..7f3f36dd260 100644 --- a/testsuite/tests/tool-lexyacc/mpr7760.mll +++ b/testsuite/tests/tool-lexyacc/mpr7760.mll @@ -1,5 +1,5 @@ (* TEST - ocamllex_flags = " -q " + ocamllex_flags = " -q "; *) rule read = shortest diff --git a/testsuite/tests/tool-lexyacc/parsecheck.mly b/testsuite/tests/tool-lexyacc/parsecheck.mly index 2acb15f3777..57dba9af4eb 100644 --- a/testsuite/tests/tool-lexyacc/parsecheck.mly +++ b/testsuite/tests/tool-lexyacc/parsecheck.mly @@ -1,5 +1,5 @@ /* TEST - ocamlyacc_flags = " -q --strict " + ocamlyacc_flags = " -q --strict "; */ %token SIMPLE %type silly diff --git a/testsuite/tests/tool-ocaml-annot/failure.ml b/testsuite/tests/tool-ocaml-annot/failure.ml index fd9ad0fbe62..4afef598f6d 100644 --- a/testsuite/tests/tool-ocaml-annot/failure.ml +++ b/testsuite/tests/tool-ocaml-annot/failure.ml @@ -1,17 +1,17 @@ (* TEST - -flags = "-annot" -script = "sh ${test_source_directory}/check-annot.sh failure" -ocamlc_byte_exit_status = "2" -ocamlopt_byte_exit_status = "2" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** script - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -*** script + flags = "-annot"; + script = "sh ${test_source_directory}/check-annot.sh failure"; + ocamlc_byte_exit_status = "2"; + ocamlopt_byte_exit_status = "2"; + { + setup-ocamlc.byte-build-env; + ocamlc.byte; + script; + }{ + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + script; + } *) (* Check that .annot files are emitted in case of failed compilation. *) diff --git a/testsuite/tests/tool-ocaml-annot/success.ml b/testsuite/tests/tool-ocaml-annot/success.ml index 126799c980f..396861a55b2 100644 --- a/testsuite/tests/tool-ocaml-annot/success.ml +++ b/testsuite/tests/tool-ocaml-annot/success.ml @@ -1,15 +1,15 @@ (* TEST - -flags = "-annot" -script = "sh ${test_source_directory}/check-annot.sh success" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** script - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -*** script + flags = "-annot"; + script = "sh ${test_source_directory}/check-annot.sh success"; + { + setup-ocamlc.byte-build-env; + ocamlc.byte; + script; + }{ + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + script; + } *) (* Check that .annot files are emitted in case of regular successful diff --git a/testsuite/tests/tool-ocaml-annot/typeonly.ml b/testsuite/tests/tool-ocaml-annot/typeonly.ml index db8d1eae253..75ccf668e55 100644 --- a/testsuite/tests/tool-ocaml-annot/typeonly.ml +++ b/testsuite/tests/tool-ocaml-annot/typeonly.ml @@ -1,16 +1,16 @@ (* TEST - -flags = "-i -annot" -compile_only = "true" -script = "sh ${test_source_directory}/check-annot.sh typeonly" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** script - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -*** script + flags = "-i -annot"; + compile_only = "true"; + script = "sh ${test_source_directory}/check-annot.sh typeonly"; + { + setup-ocamlc.byte-build-env; + ocamlc.byte; + script; + }{ + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + script; + } *) (* Check that .annot files are emitted in case of type-only compilation. *) diff --git a/testsuite/tests/tool-ocaml/directive_failure.ml b/testsuite/tests/tool-ocaml/directive_failure.ml index e7aa4c6d2d9..3c1260ca097 100644 --- a/testsuite/tests/tool-ocaml/directive_failure.ml +++ b/testsuite/tests/tool-ocaml/directive_failure.ml @@ -1,8 +1,8 @@ (* TEST -ocaml_script_as_argument = "true" -ocaml_exit_status = "125" -* setup-ocaml-build-env -** ocaml + ocaml_script_as_argument = "true"; + ocaml_exit_status = "125"; + setup-ocaml-build-env; + ocaml; *) #use "no";; diff --git a/testsuite/tests/tool-ocaml/t000.ml b/testsuite/tests/tool-ocaml/t000.ml index a8413fb10f4..15b068fa6f5 100644 --- a/testsuite/tests/tool-ocaml/t000.ml +++ b/testsuite/tests/tool-ocaml/t000.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) (* empty file *) diff --git a/testsuite/tests/tool-ocaml/t010-const0.ml b/testsuite/tests/tool-ocaml/t010-const0.ml index 62166833967..4ee3ca3fa36 100644 --- a/testsuite/tests/tool-ocaml/t010-const0.ml +++ b/testsuite/tests/tool-ocaml/t010-const0.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) 0;; diff --git a/testsuite/tests/tool-ocaml/t010-const1.ml b/testsuite/tests/tool-ocaml/t010-const1.ml index a536453d003..73011193e1c 100644 --- a/testsuite/tests/tool-ocaml/t010-const1.ml +++ b/testsuite/tests/tool-ocaml/t010-const1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) 1;; diff --git a/testsuite/tests/tool-ocaml/t010-const2.ml b/testsuite/tests/tool-ocaml/t010-const2.ml index 7f06a725132..a8200e77e4a 100644 --- a/testsuite/tests/tool-ocaml/t010-const2.ml +++ b/testsuite/tests/tool-ocaml/t010-const2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) 2;; diff --git a/testsuite/tests/tool-ocaml/t010-const3.ml b/testsuite/tests/tool-ocaml/t010-const3.ml index 92ed01b9a87..db7e14ee82b 100644 --- a/testsuite/tests/tool-ocaml/t010-const3.ml +++ b/testsuite/tests/tool-ocaml/t010-const3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) 3;; diff --git a/testsuite/tests/tool-ocaml/t011-constint.ml b/testsuite/tests/tool-ocaml/t011-constint.ml index 26a6f1efe3e..9b149f330ac 100644 --- a/testsuite/tests/tool-ocaml/t011-constint.ml +++ b/testsuite/tests/tool-ocaml/t011-constint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) 4;; diff --git a/testsuite/tests/tool-ocaml/t020.ml b/testsuite/tests/tool-ocaml/t020.ml index 3d3c3ff8dce..e7c0dc6649e 100644 --- a/testsuite/tests/tool-ocaml/t020.ml +++ b/testsuite/tests/tool-ocaml/t020.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) let _ = () in ();; diff --git a/testsuite/tests/tool-ocaml/t021-pushconst1.ml b/testsuite/tests/tool-ocaml/t021-pushconst1.ml index d315d23dbaa..a9d028ebb1c 100644 --- a/testsuite/tests/tool-ocaml/t021-pushconst1.ml +++ b/testsuite/tests/tool-ocaml/t021-pushconst1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) let _ = () in 1;; diff --git a/testsuite/tests/tool-ocaml/t021-pushconst2.ml b/testsuite/tests/tool-ocaml/t021-pushconst2.ml index df2d22c30a1..48d521cf2b9 100644 --- a/testsuite/tests/tool-ocaml/t021-pushconst2.ml +++ b/testsuite/tests/tool-ocaml/t021-pushconst2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) let _ = () in 2;; diff --git a/testsuite/tests/tool-ocaml/t021-pushconst3.ml b/testsuite/tests/tool-ocaml/t021-pushconst3.ml index c07111e9524..fd1a31fb9b0 100644 --- a/testsuite/tests/tool-ocaml/t021-pushconst3.ml +++ b/testsuite/tests/tool-ocaml/t021-pushconst3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) let _ = () in 3;; diff --git a/testsuite/tests/tool-ocaml/t022-pushconstint.ml b/testsuite/tests/tool-ocaml/t022-pushconstint.ml index bdb708d2e96..7fb3c3c715a 100644 --- a/testsuite/tests/tool-ocaml/t022-pushconstint.ml +++ b/testsuite/tests/tool-ocaml/t022-pushconstint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) let _ = () in -1;; diff --git a/testsuite/tests/tool-ocaml/t040-makeblock1.ml b/testsuite/tests/tool-ocaml/t040-makeblock1.ml index 1c52df3085a..da56950b28e 100644 --- a/testsuite/tests/tool-ocaml/t040-makeblock1.ml +++ b/testsuite/tests/tool-ocaml/t040-makeblock1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) type t = { diff --git a/testsuite/tests/tool-ocaml/t040-makeblock2.ml b/testsuite/tests/tool-ocaml/t040-makeblock2.ml index e96a8b67cd6..e6222e32250 100644 --- a/testsuite/tests/tool-ocaml/t040-makeblock2.ml +++ b/testsuite/tests/tool-ocaml/t040-makeblock2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) type t = { diff --git a/testsuite/tests/tool-ocaml/t040-makeblock3.ml b/testsuite/tests/tool-ocaml/t040-makeblock3.ml index a2083304ef2..c8ff9e44fcf 100644 --- a/testsuite/tests/tool-ocaml/t040-makeblock3.ml +++ b/testsuite/tests/tool-ocaml/t040-makeblock3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) type t = { diff --git a/testsuite/tests/tool-ocaml/t041-makeblock.ml b/testsuite/tests/tool-ocaml/t041-makeblock.ml index 8d70bb630b8..57b8d687853 100644 --- a/testsuite/tests/tool-ocaml/t041-makeblock.ml +++ b/testsuite/tests/tool-ocaml/t041-makeblock.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) type t = { diff --git a/testsuite/tests/tool-ocaml/t050-getglobal.ml b/testsuite/tests/tool-ocaml/t050-getglobal.ml index cbd7ee1ad8e..c5f636c357b 100644 --- a/testsuite/tests/tool-ocaml/t050-getglobal.ml +++ b/testsuite/tests/tool-ocaml/t050-getglobal.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) [1];; diff --git a/testsuite/tests/tool-ocaml/t050-pushgetglobal.ml b/testsuite/tests/tool-ocaml/t050-pushgetglobal.ml index e1123279670..c0262a94689 100644 --- a/testsuite/tests/tool-ocaml/t050-pushgetglobal.ml +++ b/testsuite/tests/tool-ocaml/t050-pushgetglobal.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) let _ = () in 0.01;; diff --git a/testsuite/tests/tool-ocaml/t051-getglobalfield.ml b/testsuite/tests/tool-ocaml/t051-getglobalfield.ml index a78a5e8e46e..9e16ebdb092 100644 --- a/testsuite/tests/tool-ocaml/t051-getglobalfield.ml +++ b/testsuite/tests/tool-ocaml/t051-getglobalfield.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) Lib.x;; diff --git a/testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml b/testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml index 26c1e0d1b7a..182eb83f2b8 100644 --- a/testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml +++ b/testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) let _ = () in Lib.x;; diff --git a/testsuite/tests/tool-ocaml/t060-raise.ml b/testsuite/tests/tool-ocaml/t060-raise.ml index 1bee8b2d20d..0a116e81980 100644 --- a/testsuite/tests/tool-ocaml/t060-raise.ml +++ b/testsuite/tests/tool-ocaml/t060-raise.ml @@ -1,10 +1,10 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -ocaml_exit_status = "2" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + ocaml_exit_status = "2"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t070-branch.ml b/testsuite/tests/tool-ocaml/t070-branch.ml index 8a58e20e8c4..1d7570aba3e 100644 --- a/testsuite/tests/tool-ocaml/t070-branch.ml +++ b/testsuite/tests/tool-ocaml/t070-branch.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t070-branchif.ml b/testsuite/tests/tool-ocaml/t070-branchif.ml index a231f04110b..9650d404ef4 100644 --- a/testsuite/tests/tool-ocaml/t070-branchif.ml +++ b/testsuite/tests/tool-ocaml/t070-branchif.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t070-branchifnot.ml b/testsuite/tests/tool-ocaml/t070-branchifnot.ml index 578380b1f17..cb1fd166e63 100644 --- a/testsuite/tests/tool-ocaml/t070-branchifnot.ml +++ b/testsuite/tests/tool-ocaml/t070-branchifnot.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t071-boolnot.ml b/testsuite/tests/tool-ocaml/t071-boolnot.ml index 3400655bff5..db814ba4a44 100644 --- a/testsuite/tests/tool-ocaml/t071-boolnot.ml +++ b/testsuite/tests/tool-ocaml/t071-boolnot.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t080-eq.ml b/testsuite/tests/tool-ocaml/t080-eq.ml index b8fc6455c3e..fb1c1429ed2 100644 --- a/testsuite/tests/tool-ocaml/t080-eq.ml +++ b/testsuite/tests/tool-ocaml/t080-eq.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t080-geint.ml b/testsuite/tests/tool-ocaml/t080-geint.ml index d604fed654f..9dd65a40fef 100644 --- a/testsuite/tests/tool-ocaml/t080-geint.ml +++ b/testsuite/tests/tool-ocaml/t080-geint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t080-gtint.ml b/testsuite/tests/tool-ocaml/t080-gtint.ml index df53f75199a..be75d3bc200 100644 --- a/testsuite/tests/tool-ocaml/t080-gtint.ml +++ b/testsuite/tests/tool-ocaml/t080-gtint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t080-leint.ml b/testsuite/tests/tool-ocaml/t080-leint.ml index b78aa3a5db4..68295f154ab 100644 --- a/testsuite/tests/tool-ocaml/t080-leint.ml +++ b/testsuite/tests/tool-ocaml/t080-leint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t080-ltint.ml b/testsuite/tests/tool-ocaml/t080-ltint.ml index 9737ad1a338..0135b8000f2 100644 --- a/testsuite/tests/tool-ocaml/t080-ltint.ml +++ b/testsuite/tests/tool-ocaml/t080-ltint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t080-neq.ml b/testsuite/tests/tool-ocaml/t080-neq.ml index b1c33aec21d..f3510719b70 100644 --- a/testsuite/tests/tool-ocaml/t080-neq.ml +++ b/testsuite/tests/tool-ocaml/t080-neq.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc0.ml b/testsuite/tests/tool-ocaml/t090-acc0.ml index 0b398c26eab..1892888dbc6 100644 --- a/testsuite/tests/tool-ocaml/t090-acc0.ml +++ b/testsuite/tests/tool-ocaml/t090-acc0.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc1.ml b/testsuite/tests/tool-ocaml/t090-acc1.ml index 8a4dcd17119..823213a9ef1 100644 --- a/testsuite/tests/tool-ocaml/t090-acc1.ml +++ b/testsuite/tests/tool-ocaml/t090-acc1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc2.ml b/testsuite/tests/tool-ocaml/t090-acc2.ml index 708da881fe1..9bb080af8c6 100644 --- a/testsuite/tests/tool-ocaml/t090-acc2.ml +++ b/testsuite/tests/tool-ocaml/t090-acc2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc3.ml b/testsuite/tests/tool-ocaml/t090-acc3.ml index 9474236d439..445b24f4450 100644 --- a/testsuite/tests/tool-ocaml/t090-acc3.ml +++ b/testsuite/tests/tool-ocaml/t090-acc3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc4.ml b/testsuite/tests/tool-ocaml/t090-acc4.ml index 673694d059f..e272351663a 100644 --- a/testsuite/tests/tool-ocaml/t090-acc4.ml +++ b/testsuite/tests/tool-ocaml/t090-acc4.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc5.ml b/testsuite/tests/tool-ocaml/t090-acc5.ml index f270f5fc171..0e7bd171c06 100644 --- a/testsuite/tests/tool-ocaml/t090-acc5.ml +++ b/testsuite/tests/tool-ocaml/t090-acc5.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc6.ml b/testsuite/tests/tool-ocaml/t090-acc6.ml index b1d0e833032..35999f02827 100644 --- a/testsuite/tests/tool-ocaml/t090-acc6.ml +++ b/testsuite/tests/tool-ocaml/t090-acc6.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t090-acc7.ml b/testsuite/tests/tool-ocaml/t090-acc7.ml index 64e61e791be..689e9d31647 100644 --- a/testsuite/tests/tool-ocaml/t090-acc7.ml +++ b/testsuite/tests/tool-ocaml/t090-acc7.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t091-acc.ml b/testsuite/tests/tool-ocaml/t091-acc.ml index be3c73ebcac..999dca3a3a0 100644 --- a/testsuite/tests/tool-ocaml/t091-acc.ml +++ b/testsuite/tests/tool-ocaml/t091-acc.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc.ml b/testsuite/tests/tool-ocaml/t092-pushacc.ml index 26a414b3b58..26931f87232 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc0.ml b/testsuite/tests/tool-ocaml/t092-pushacc0.ml index 7199799b907..7d6bd2e6b6b 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc0.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc0.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc1.ml b/testsuite/tests/tool-ocaml/t092-pushacc1.ml index d6e34cee03d..0a7d4507272 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc1.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc2.ml b/testsuite/tests/tool-ocaml/t092-pushacc2.ml index 2f1b641bab9..ed2adb2f9a0 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc2.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc3.ml b/testsuite/tests/tool-ocaml/t092-pushacc3.ml index c0bc7fcd990..95553e09113 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc3.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc4.ml b/testsuite/tests/tool-ocaml/t092-pushacc4.ml index 07dd054eee3..84b7d5aff99 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc4.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc4.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc5.ml b/testsuite/tests/tool-ocaml/t092-pushacc5.ml index 57c6213e5f7..746d0eeec23 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc5.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc5.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc6.ml b/testsuite/tests/tool-ocaml/t092-pushacc6.ml index 01304d6a66b..4d14f8c80f1 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc6.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc6.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t092-pushacc7.ml b/testsuite/tests/tool-ocaml/t092-pushacc7.ml index befef4c2f64..ba648b245c3 100644 --- a/testsuite/tests/tool-ocaml/t092-pushacc7.ml +++ b/testsuite/tests/tool-ocaml/t092-pushacc7.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t093-pushacc.ml b/testsuite/tests/tool-ocaml/t093-pushacc.ml index efd8d8d8d9e..9d35dd38ccd 100644 --- a/testsuite/tests/tool-ocaml/t093-pushacc.ml +++ b/testsuite/tests/tool-ocaml/t093-pushacc.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t100-pushtrap.ml b/testsuite/tests/tool-ocaml/t100-pushtrap.ml index 586e720d017..28abb4caf57 100644 --- a/testsuite/tests/tool-ocaml/t100-pushtrap.ml +++ b/testsuite/tests/tool-ocaml/t100-pushtrap.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t101-poptrap.ml b/testsuite/tests/tool-ocaml/t101-poptrap.ml index 842ec08962a..5e008639419 100644 --- a/testsuite/tests/tool-ocaml/t101-poptrap.ml +++ b/testsuite/tests/tool-ocaml/t101-poptrap.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-addint.ml b/testsuite/tests/tool-ocaml/t110-addint.ml index cc31dc61664..1d689ff1806 100644 --- a/testsuite/tests/tool-ocaml/t110-addint.ml +++ b/testsuite/tests/tool-ocaml/t110-addint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-andint.ml b/testsuite/tests/tool-ocaml/t110-andint.ml index 52497d319c8..4999cd11194 100644 --- a/testsuite/tests/tool-ocaml/t110-andint.ml +++ b/testsuite/tests/tool-ocaml/t110-andint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-asrint-1.ml b/testsuite/tests/tool-ocaml/t110-asrint-1.ml index fe700edc298..0933bea1cb0 100644 --- a/testsuite/tests/tool-ocaml/t110-asrint-1.ml +++ b/testsuite/tests/tool-ocaml/t110-asrint-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-asrint-2.ml b/testsuite/tests/tool-ocaml/t110-asrint-2.ml index 9f15bde01f6..65dcb1fce61 100644 --- a/testsuite/tests/tool-ocaml/t110-asrint-2.ml +++ b/testsuite/tests/tool-ocaml/t110-asrint-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-divint-1.ml b/testsuite/tests/tool-ocaml/t110-divint-1.ml index 0e1208abe19..59dceadc49a 100644 --- a/testsuite/tests/tool-ocaml/t110-divint-1.ml +++ b/testsuite/tests/tool-ocaml/t110-divint-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-divint-2.ml b/testsuite/tests/tool-ocaml/t110-divint-2.ml index eabec84efde..39bb0b38aa6 100644 --- a/testsuite/tests/tool-ocaml/t110-divint-2.ml +++ b/testsuite/tests/tool-ocaml/t110-divint-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-divint-3.ml b/testsuite/tests/tool-ocaml/t110-divint-3.ml index d17e1350a05..8dde42dac97 100644 --- a/testsuite/tests/tool-ocaml/t110-divint-3.ml +++ b/testsuite/tests/tool-ocaml/t110-divint-3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-lslint.ml b/testsuite/tests/tool-ocaml/t110-lslint.ml index fc903ef8fea..2b4e56f2b34 100644 --- a/testsuite/tests/tool-ocaml/t110-lslint.ml +++ b/testsuite/tests/tool-ocaml/t110-lslint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-lsrint.ml b/testsuite/tests/tool-ocaml/t110-lsrint.ml index 348a2b6a3ec..ec1f0023ca7 100644 --- a/testsuite/tests/tool-ocaml/t110-lsrint.ml +++ b/testsuite/tests/tool-ocaml/t110-lsrint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-modint-1.ml b/testsuite/tests/tool-ocaml/t110-modint-1.ml index 0bfb65defa7..a5e25531884 100644 --- a/testsuite/tests/tool-ocaml/t110-modint-1.ml +++ b/testsuite/tests/tool-ocaml/t110-modint-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-modint-2.ml b/testsuite/tests/tool-ocaml/t110-modint-2.ml index e2ea7c29a8b..3835861df23 100644 --- a/testsuite/tests/tool-ocaml/t110-modint-2.ml +++ b/testsuite/tests/tool-ocaml/t110-modint-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-mulint.ml b/testsuite/tests/tool-ocaml/t110-mulint.ml index bae1ffb610c..49faaa88578 100644 --- a/testsuite/tests/tool-ocaml/t110-mulint.ml +++ b/testsuite/tests/tool-ocaml/t110-mulint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-negint.ml b/testsuite/tests/tool-ocaml/t110-negint.ml index 770a2ee81f0..470466e752d 100644 --- a/testsuite/tests/tool-ocaml/t110-negint.ml +++ b/testsuite/tests/tool-ocaml/t110-negint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-offsetint.ml b/testsuite/tests/tool-ocaml/t110-offsetint.ml index 9b74667e4ff..08db4246cb0 100644 --- a/testsuite/tests/tool-ocaml/t110-offsetint.ml +++ b/testsuite/tests/tool-ocaml/t110-offsetint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-orint.ml b/testsuite/tests/tool-ocaml/t110-orint.ml index 8551be84b66..99c3bd1f4c2 100644 --- a/testsuite/tests/tool-ocaml/t110-orint.ml +++ b/testsuite/tests/tool-ocaml/t110-orint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-subint.ml b/testsuite/tests/tool-ocaml/t110-subint.ml index 3993dd329e0..dcef9628054 100644 --- a/testsuite/tests/tool-ocaml/t110-subint.ml +++ b/testsuite/tests/tool-ocaml/t110-subint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t110-xorint.ml b/testsuite/tests/tool-ocaml/t110-xorint.ml index 2dd2a9b96c4..71aaaff1f85 100644 --- a/testsuite/tests/tool-ocaml/t110-xorint.ml +++ b/testsuite/tests/tool-ocaml/t110-xorint.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t120-getstringchar.ml b/testsuite/tests/tool-ocaml/t120-getstringchar.ml index 271022c3554..3e38b57d42e 100644 --- a/testsuite/tests/tool-ocaml/t120-getstringchar.ml +++ b/testsuite/tests/tool-ocaml/t120-getstringchar.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t121-setstringchar.ml b/testsuite/tests/tool-ocaml/t121-setstringchar.ml index 6ea9899c135..40f8a92d638 100644 --- a/testsuite/tests/tool-ocaml/t121-setstringchar.ml +++ b/testsuite/tests/tool-ocaml/t121-setstringchar.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t130-getvectitem.ml b/testsuite/tests/tool-ocaml/t130-getvectitem.ml index f8af8f1714d..fd04d3e5309 100644 --- a/testsuite/tests/tool-ocaml/t130-getvectitem.ml +++ b/testsuite/tests/tool-ocaml/t130-getvectitem.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t130-vectlength.ml b/testsuite/tests/tool-ocaml/t130-vectlength.ml index ea568544260..eae68391214 100644 --- a/testsuite/tests/tool-ocaml/t130-vectlength.ml +++ b/testsuite/tests/tool-ocaml/t130-vectlength.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t131-setvectitem.ml b/testsuite/tests/tool-ocaml/t131-setvectitem.ml index abb238f3c45..8f7065ea97d 100644 --- a/testsuite/tests/tool-ocaml/t131-setvectitem.ml +++ b/testsuite/tests/tool-ocaml/t131-setvectitem.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t140-switch-1.ml b/testsuite/tests/tool-ocaml/t140-switch-1.ml index 0928b068757..e932d4eb3ca 100644 --- a/testsuite/tests/tool-ocaml/t140-switch-1.ml +++ b/testsuite/tests/tool-ocaml/t140-switch-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t140-switch-2.ml b/testsuite/tests/tool-ocaml/t140-switch-2.ml index 3089ffbc0db..a7a81a9fe22 100644 --- a/testsuite/tests/tool-ocaml/t140-switch-2.ml +++ b/testsuite/tests/tool-ocaml/t140-switch-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t140-switch-3.ml b/testsuite/tests/tool-ocaml/t140-switch-3.ml index ff15ead8a0f..35e98bf7c3f 100644 --- a/testsuite/tests/tool-ocaml/t140-switch-3.ml +++ b/testsuite/tests/tool-ocaml/t140-switch-3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t140-switch-4.ml b/testsuite/tests/tool-ocaml/t140-switch-4.ml index 61b7954dd01..4596100adf4 100644 --- a/testsuite/tests/tool-ocaml/t140-switch-4.ml +++ b/testsuite/tests/tool-ocaml/t140-switch-4.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t141-switch-5.ml b/testsuite/tests/tool-ocaml/t141-switch-5.ml index 29d2cd5d91d..7379a75a04f 100644 --- a/testsuite/tests/tool-ocaml/t141-switch-5.ml +++ b/testsuite/tests/tool-ocaml/t141-switch-5.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t141-switch-6.ml b/testsuite/tests/tool-ocaml/t141-switch-6.ml index 34a87740b3c..0f5ec6a45eb 100644 --- a/testsuite/tests/tool-ocaml/t141-switch-6.ml +++ b/testsuite/tests/tool-ocaml/t141-switch-6.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t141-switch-7.ml b/testsuite/tests/tool-ocaml/t141-switch-7.ml index 137080e0c0c..2d4eb469b06 100644 --- a/testsuite/tests/tool-ocaml/t141-switch-7.ml +++ b/testsuite/tests/tool-ocaml/t141-switch-7.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t142-switch-8.ml b/testsuite/tests/tool-ocaml/t142-switch-8.ml index 5d806419cc4..78bec9f0f07 100644 --- a/testsuite/tests/tool-ocaml/t142-switch-8.ml +++ b/testsuite/tests/tool-ocaml/t142-switch-8.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t142-switch-9.ml b/testsuite/tests/tool-ocaml/t142-switch-9.ml index 8de4de43d25..31b3fe05ad3 100644 --- a/testsuite/tests/tool-ocaml/t142-switch-9.ml +++ b/testsuite/tests/tool-ocaml/t142-switch-9.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t142-switch-A.ml b/testsuite/tests/tool-ocaml/t142-switch-A.ml index 09bfdedfbf1..c356d296262 100644 --- a/testsuite/tests/tool-ocaml/t142-switch-A.ml +++ b/testsuite/tests/tool-ocaml/t142-switch-A.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t150-push-1.ml b/testsuite/tests/tool-ocaml/t150-push-1.ml index d13723b4090..b34e13f3cdb 100644 --- a/testsuite/tests/tool-ocaml/t150-push-1.ml +++ b/testsuite/tests/tool-ocaml/t150-push-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t150-push-2.ml b/testsuite/tests/tool-ocaml/t150-push-2.ml index ce9cc2877b3..d2c9bc532e8 100644 --- a/testsuite/tests/tool-ocaml/t150-push-2.ml +++ b/testsuite/tests/tool-ocaml/t150-push-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t160-closure.ml b/testsuite/tests/tool-ocaml/t160-closure.ml index f26a4c9f790..9ad6c07a5ce 100644 --- a/testsuite/tests/tool-ocaml/t160-closure.ml +++ b/testsuite/tests/tool-ocaml/t160-closure.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t161-apply1.ml b/testsuite/tests/tool-ocaml/t161-apply1.ml index beccf312fc2..5bb6cddc6d8 100644 --- a/testsuite/tests/tool-ocaml/t161-apply1.ml +++ b/testsuite/tests/tool-ocaml/t161-apply1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t162-return.ml b/testsuite/tests/tool-ocaml/t162-return.ml index 664c54b21c4..59c549c8074 100644 --- a/testsuite/tests/tool-ocaml/t162-return.ml +++ b/testsuite/tests/tool-ocaml/t162-return.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t163.ml b/testsuite/tests/tool-ocaml/t163.ml index 41380ca26b8..ea0c181da61 100644 --- a/testsuite/tests/tool-ocaml/t163.ml +++ b/testsuite/tests/tool-ocaml/t163.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t164-apply2.ml b/testsuite/tests/tool-ocaml/t164-apply2.ml index af928e714df..a5f5e7f98c2 100644 --- a/testsuite/tests/tool-ocaml/t164-apply2.ml +++ b/testsuite/tests/tool-ocaml/t164-apply2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t164-apply3.ml b/testsuite/tests/tool-ocaml/t164-apply3.ml index 2c4f1f6e5e4..fdc92df92e8 100644 --- a/testsuite/tests/tool-ocaml/t164-apply3.ml +++ b/testsuite/tests/tool-ocaml/t164-apply3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t165-apply.ml b/testsuite/tests/tool-ocaml/t165-apply.ml index c06caf0f9bd..ab51c87d521 100644 --- a/testsuite/tests/tool-ocaml/t165-apply.ml +++ b/testsuite/tests/tool-ocaml/t165-apply.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t170-envacc2.ml b/testsuite/tests/tool-ocaml/t170-envacc2.ml index 3484ca54fd7..19c183fb851 100644 --- a/testsuite/tests/tool-ocaml/t170-envacc2.ml +++ b/testsuite/tests/tool-ocaml/t170-envacc2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t170-envacc3.ml b/testsuite/tests/tool-ocaml/t170-envacc3.ml index 583fd00fdbf..9b494a0a057 100644 --- a/testsuite/tests/tool-ocaml/t170-envacc3.ml +++ b/testsuite/tests/tool-ocaml/t170-envacc3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t170-envacc4.ml b/testsuite/tests/tool-ocaml/t170-envacc4.ml index 70df1ac98fa..6a44794f419 100644 --- a/testsuite/tests/tool-ocaml/t170-envacc4.ml +++ b/testsuite/tests/tool-ocaml/t170-envacc4.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t171-envacc.ml b/testsuite/tests/tool-ocaml/t171-envacc.ml index 98bb61f5d19..f91f4c748ad 100644 --- a/testsuite/tests/tool-ocaml/t171-envacc.ml +++ b/testsuite/tests/tool-ocaml/t171-envacc.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc1.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc1.ml index 7ad3287eb64..55d26001635 100644 --- a/testsuite/tests/tool-ocaml/t172-pushenvacc1.ml +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc2.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc2.ml index 70e23115796..ae034cc1ec1 100644 --- a/testsuite/tests/tool-ocaml/t172-pushenvacc2.ml +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc3.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc3.ml index 170dc2afbcc..4203cc1c41f 100644 --- a/testsuite/tests/tool-ocaml/t172-pushenvacc3.ml +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc4.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc4.ml index 16967b6f6fe..061abe3d18d 100644 --- a/testsuite/tests/tool-ocaml/t172-pushenvacc4.ml +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc4.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t173-pushenvacc.ml b/testsuite/tests/tool-ocaml/t173-pushenvacc.ml index 3a2c19ddb0c..2a43f1c68fd 100644 --- a/testsuite/tests/tool-ocaml/t173-pushenvacc.ml +++ b/testsuite/tests/tool-ocaml/t173-pushenvacc.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t180-appterm1.ml b/testsuite/tests/tool-ocaml/t180-appterm1.ml index 42e6c323866..56853e159e6 100644 --- a/testsuite/tests/tool-ocaml/t180-appterm1.ml +++ b/testsuite/tests/tool-ocaml/t180-appterm1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t180-appterm2.ml b/testsuite/tests/tool-ocaml/t180-appterm2.ml index 0afccadf1f6..2f68cd13aca 100644 --- a/testsuite/tests/tool-ocaml/t180-appterm2.ml +++ b/testsuite/tests/tool-ocaml/t180-appterm2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t180-appterm3.ml b/testsuite/tests/tool-ocaml/t180-appterm3.ml index d0ed1e67433..788c0adab89 100644 --- a/testsuite/tests/tool-ocaml/t180-appterm3.ml +++ b/testsuite/tests/tool-ocaml/t180-appterm3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t181-appterm.ml b/testsuite/tests/tool-ocaml/t181-appterm.ml index 4a7778e532e..f001d871b61 100644 --- a/testsuite/tests/tool-ocaml/t181-appterm.ml +++ b/testsuite/tests/tool-ocaml/t181-appterm.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml b/testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml index 0d3c6d1374e..22d52d58ac4 100644 --- a/testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml +++ b/testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml b/testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml index 869b6de9e8d..5b3ffd7c805 100644 --- a/testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml +++ b/testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml b/testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml index a966a2f21cb..63d8e6bf310 100644 --- a/testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml +++ b/testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t191-vectlength.ml b/testsuite/tests/tool-ocaml/t191-vectlength.ml index ef7a93f5c29..b1541083526 100644 --- a/testsuite/tests/tool-ocaml/t191-vectlength.ml +++ b/testsuite/tests/tool-ocaml/t191-vectlength.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml b/testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml index 74e1f7a6aef..bd4af309e8b 100644 --- a/testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml +++ b/testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml b/testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml index fc224244de6..c5b59ebad43 100644 --- a/testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml +++ b/testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml b/testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml index 708c3bc42c1..12e75548823 100644 --- a/testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml +++ b/testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml b/testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml index 80d010f6ee3..d5cc07194a9 100644 --- a/testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml +++ b/testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t200-getfield0.ml b/testsuite/tests/tool-ocaml/t200-getfield0.ml index fa768984b77..4be33c0f4a5 100644 --- a/testsuite/tests/tool-ocaml/t200-getfield0.ml +++ b/testsuite/tests/tool-ocaml/t200-getfield0.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t200-getfield1.ml b/testsuite/tests/tool-ocaml/t200-getfield1.ml index c394ab2c2fe..de07981dc36 100644 --- a/testsuite/tests/tool-ocaml/t200-getfield1.ml +++ b/testsuite/tests/tool-ocaml/t200-getfield1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t200-getfield2.ml b/testsuite/tests/tool-ocaml/t200-getfield2.ml index 954f86f0d52..d8930fc75ce 100644 --- a/testsuite/tests/tool-ocaml/t200-getfield2.ml +++ b/testsuite/tests/tool-ocaml/t200-getfield2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t200-getfield3.ml b/testsuite/tests/tool-ocaml/t200-getfield3.ml index 3381468e0df..8b2189ca05c 100644 --- a/testsuite/tests/tool-ocaml/t200-getfield3.ml +++ b/testsuite/tests/tool-ocaml/t200-getfield3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t201-getfield.ml b/testsuite/tests/tool-ocaml/t201-getfield.ml index f76fe0057c7..253262f2011 100644 --- a/testsuite/tests/tool-ocaml/t201-getfield.ml +++ b/testsuite/tests/tool-ocaml/t201-getfield.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t210-setfield0.ml b/testsuite/tests/tool-ocaml/t210-setfield0.ml index 40803c4f209..e1891fa82c2 100644 --- a/testsuite/tests/tool-ocaml/t210-setfield0.ml +++ b/testsuite/tests/tool-ocaml/t210-setfield0.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t210-setfield1.ml b/testsuite/tests/tool-ocaml/t210-setfield1.ml index ff65da7a2b1..ffbdc0f202d 100644 --- a/testsuite/tests/tool-ocaml/t210-setfield1.ml +++ b/testsuite/tests/tool-ocaml/t210-setfield1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t210-setfield2.ml b/testsuite/tests/tool-ocaml/t210-setfield2.ml index 7a46e87aa6f..b7d8cd50b4f 100644 --- a/testsuite/tests/tool-ocaml/t210-setfield2.ml +++ b/testsuite/tests/tool-ocaml/t210-setfield2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t210-setfield3.ml b/testsuite/tests/tool-ocaml/t210-setfield3.ml index 20394fbbdb8..d921a3043f9 100644 --- a/testsuite/tests/tool-ocaml/t210-setfield3.ml +++ b/testsuite/tests/tool-ocaml/t210-setfield3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t211-setfield.ml b/testsuite/tests/tool-ocaml/t211-setfield.ml index 21730fae0bd..f935b7e5558 100644 --- a/testsuite/tests/tool-ocaml/t211-setfield.ml +++ b/testsuite/tests/tool-ocaml/t211-setfield.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t220-assign.ml b/testsuite/tests/tool-ocaml/t220-assign.ml index 0044f89e30e..26c6287cb23 100644 --- a/testsuite/tests/tool-ocaml/t220-assign.ml +++ b/testsuite/tests/tool-ocaml/t220-assign.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t230-check_signals.ml b/testsuite/tests/tool-ocaml/t230-check_signals.ml index d027d690be3..3df0a96759f 100644 --- a/testsuite/tests/tool-ocaml/t230-check_signals.ml +++ b/testsuite/tests/tool-ocaml/t230-check_signals.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t240-c_call1.ml b/testsuite/tests/tool-ocaml/t240-c_call1.ml index 89758f50141..a5feaebb925 100644 --- a/testsuite/tests/tool-ocaml/t240-c_call1.ml +++ b/testsuite/tests/tool-ocaml/t240-c_call1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t240-c_call2.ml b/testsuite/tests/tool-ocaml/t240-c_call2.ml index 35d3916e822..963c42eaafd 100644 --- a/testsuite/tests/tool-ocaml/t240-c_call2.ml +++ b/testsuite/tests/tool-ocaml/t240-c_call2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t240-c_call3.ml b/testsuite/tests/tool-ocaml/t240-c_call3.ml index f98ed86f2e0..994b00f09c1 100644 --- a/testsuite/tests/tool-ocaml/t240-c_call3.ml +++ b/testsuite/tests/tool-ocaml/t240-c_call3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t240-c_call4.ml b/testsuite/tests/tool-ocaml/t240-c_call4.ml index e5a47342a2b..24fa8a4ee75 100644 --- a/testsuite/tests/tool-ocaml/t240-c_call4.ml +++ b/testsuite/tests/tool-ocaml/t240-c_call4.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t240-c_call5.ml b/testsuite/tests/tool-ocaml/t240-c_call5.ml index 14a5954a9f3..e55a454edfd 100644 --- a/testsuite/tests/tool-ocaml/t240-c_call5.ml +++ b/testsuite/tests/tool-ocaml/t240-c_call5.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t250-closurerec-1.ml b/testsuite/tests/tool-ocaml/t250-closurerec-1.ml index d8e3169f6df..3285c5c96a2 100644 --- a/testsuite/tests/tool-ocaml/t250-closurerec-1.ml +++ b/testsuite/tests/tool-ocaml/t250-closurerec-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t250-closurerec-2.ml b/testsuite/tests/tool-ocaml/t250-closurerec-2.ml index 4ddfd208eba..cd1e1f89dd2 100644 --- a/testsuite/tests/tool-ocaml/t250-closurerec-2.ml +++ b/testsuite/tests/tool-ocaml/t250-closurerec-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml index aa29928be4b..3df568aab55 100644 --- a/testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml +++ b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml index c84eea3774c..9304ee16682 100644 --- a/testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml +++ b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml b/testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml index bc19d6fb451..bb70ea28119 100644 --- a/testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml +++ b/testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml b/testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml index dee93f84dc8..1c949dde9f3 100644 --- a/testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml +++ b/testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t253-offsetclosure0.ml b/testsuite/tests/tool-ocaml/t253-offsetclosure0.ml index 092f755a756..14f7bb92ae4 100644 --- a/testsuite/tests/tool-ocaml/t253-offsetclosure0.ml +++ b/testsuite/tests/tool-ocaml/t253-offsetclosure0.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t253-offsetclosure2.ml b/testsuite/tests/tool-ocaml/t253-offsetclosure2.ml index 977574ded2b..46769674fe2 100644 --- a/testsuite/tests/tool-ocaml/t253-offsetclosure2.ml +++ b/testsuite/tests/tool-ocaml/t253-offsetclosure2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml b/testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml index 69b2f13915c..16ada804dbd 100644 --- a/testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml +++ b/testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t254-offsetclosure.ml b/testsuite/tests/tool-ocaml/t254-offsetclosure.ml index 1bf10ceef5f..a40f94152d2 100644 --- a/testsuite/tests/tool-ocaml/t254-offsetclosure.ml +++ b/testsuite/tests/tool-ocaml/t254-offsetclosure.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t260-offsetref.ml b/testsuite/tests/tool-ocaml/t260-offsetref.ml index 2884f468b9c..4dd2d0f9710 100644 --- a/testsuite/tests/tool-ocaml/t260-offsetref.ml +++ b/testsuite/tests/tool-ocaml/t260-offsetref.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t270-push_retaddr.ml b/testsuite/tests/tool-ocaml/t270-push_retaddr.ml index 137d668c326..8a56844657c 100644 --- a/testsuite/tests/tool-ocaml/t270-push_retaddr.ml +++ b/testsuite/tests/tool-ocaml/t270-push_retaddr.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t300-getmethod.ml b/testsuite/tests/tool-ocaml/t300-getmethod.ml index c8600604793..da4c46ea123 100644 --- a/testsuite/tests/tool-ocaml/t300-getmethod.ml +++ b/testsuite/tests/tool-ocaml/t300-getmethod.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t301-object.ml b/testsuite/tests/tool-ocaml/t301-object.ml index 1d035a4a0b9..dc170ae97c6 100644 --- a/testsuite/tests/tool-ocaml/t301-object.ml +++ b/testsuite/tests/tool-ocaml/t301-object.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) (**** file testinterp/t301-object.ml diff --git a/testsuite/tests/tool-ocaml/t310-alloc-1.ml b/testsuite/tests/tool-ocaml/t310-alloc-1.ml index 7021eda5a2b..5f57c1e206d 100644 --- a/testsuite/tests/tool-ocaml/t310-alloc-1.ml +++ b/testsuite/tests/tool-ocaml/t310-alloc-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t310-alloc-2.ml b/testsuite/tests/tool-ocaml/t310-alloc-2.ml index 4118a737bd4..a2f31d4a085 100644 --- a/testsuite/tests/tool-ocaml/t310-alloc-2.ml +++ b/testsuite/tests/tool-ocaml/t310-alloc-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t320-gc-1.ml b/testsuite/tests/tool-ocaml/t320-gc-1.ml index be95ac9e178..4c8f4bc94ec 100644 --- a/testsuite/tests/tool-ocaml/t320-gc-1.ml +++ b/testsuite/tests/tool-ocaml/t320-gc-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t320-gc-2.ml b/testsuite/tests/tool-ocaml/t320-gc-2.ml index 54203e9e72e..39678f8f7b0 100644 --- a/testsuite/tests/tool-ocaml/t320-gc-2.ml +++ b/testsuite/tests/tool-ocaml/t320-gc-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t320-gc-3.ml b/testsuite/tests/tool-ocaml/t320-gc-3.ml index c9b4e49b3e2..e3653c29c88 100644 --- a/testsuite/tests/tool-ocaml/t320-gc-3.ml +++ b/testsuite/tests/tool-ocaml/t320-gc-3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t330-compact-1.ml b/testsuite/tests/tool-ocaml/t330-compact-1.ml index fb58c1f8599..a0a88381047 100644 --- a/testsuite/tests/tool-ocaml/t330-compact-1.ml +++ b/testsuite/tests/tool-ocaml/t330-compact-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t330-compact-2.ml b/testsuite/tests/tool-ocaml/t330-compact-2.ml index d466b1a246c..9ef3a2acbad 100644 --- a/testsuite/tests/tool-ocaml/t330-compact-2.ml +++ b/testsuite/tests/tool-ocaml/t330-compact-2.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t330-compact-3.ml b/testsuite/tests/tool-ocaml/t330-compact-3.ml index 490b686ce67..95dfc4c18e2 100644 --- a/testsuite/tests/tool-ocaml/t330-compact-3.ml +++ b/testsuite/tests/tool-ocaml/t330-compact-3.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t330-compact-4.ml b/testsuite/tests/tool-ocaml/t330-compact-4.ml index e27be14bb15..a0aabcc6fdf 100644 --- a/testsuite/tests/tool-ocaml/t330-compact-4.ml +++ b/testsuite/tests/tool-ocaml/t330-compact-4.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t340-weak.ml b/testsuite/tests/tool-ocaml/t340-weak.ml index 6c3d26e2f30..596278d3932 100644 --- a/testsuite/tests/tool-ocaml/t340-weak.ml +++ b/testsuite/tests/tool-ocaml/t340-weak.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t350-heapcheck.ml b/testsuite/tests/tool-ocaml/t350-heapcheck.ml index bf3d137aaaa..3255cf9b842 100644 --- a/testsuite/tests/tool-ocaml/t350-heapcheck.ml +++ b/testsuite/tests/tool-ocaml/t350-heapcheck.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t360-stacks-1.ml b/testsuite/tests/tool-ocaml/t360-stacks-1.ml index b952c18a8f2..48c116c353c 100644 --- a/testsuite/tests/tool-ocaml/t360-stacks-1.ml +++ b/testsuite/tests/tool-ocaml/t360-stacks-1.ml @@ -1,9 +1,9 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocaml/t360-stacks-2.ml b/testsuite/tests/tool-ocaml/t360-stacks-2.ml index 9a20bbfcd3d..a1e729527f9 100644 --- a/testsuite/tests/tool-ocaml/t360-stacks-2.ml +++ b/testsuite/tests/tool-ocaml/t360-stacks-2.ml @@ -1,10 +1,10 @@ (* TEST -include tool-ocaml-lib -flags = "-w -a" -ocaml_script_as_argument = "true" -ocamlrunparam = "l=1000000" -* setup-ocaml-build-env -** ocaml + include tool-ocaml-lib; + flags = "-w -a"; + ocaml_script_as_argument = "true"; + ocamlrunparam = "l=1000000"; + setup-ocaml-build-env; + ocaml; *) open Lib;; diff --git a/testsuite/tests/tool-ocamlc-compat32/compat32.ml b/testsuite/tests/tool-ocamlc-compat32/compat32.ml index 8b09d8ab668..aca044847bf 100644 --- a/testsuite/tests/tool-ocamlc-compat32/compat32.ml +++ b/testsuite/tests/tool-ocamlc-compat32/compat32.ml @@ -1,29 +1,29 @@ (* TEST - * arch64 - ** setup-ocamlc.byte-build-env - *** ocamlc.byte - compile_only = "true" - flags = "-compat-32" - ocamlc_byte_exit_status = "2" - **** ocamlc.byte - ocamlc_byte_exit_status = "0" - flags = "" - ***** ocamlc.byte - compile_only = "false" - all_modules = "compat32.cmo" - flags = "-compat-32 -a" - program = "compat32.cma" - ocamlc_byte_exit_status = "2" - ****** ocamlc.byte - flags = "-a" - program = "compat32.cma" - ocamlc_byte_exit_status = "0" - ******* ocamlc.byte - all_modules = "compat32.cma" - flags = "-compat-32 -linkall" - program = "compat32.byte" - ocamlc_byte_exit_status = "2" - ******** check-ocamlc.byte-output + arch64; + setup-ocamlc.byte-build-env; + compile_only = "true"; + flags = "-compat-32"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + ocamlc_byte_exit_status = "0"; + flags = ""; + ocamlc.byte; + compile_only = "false"; + all_modules = "compat32.cmo"; + flags = "-compat-32 -a"; + program = "compat32.cma"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + flags = "-a"; + program = "compat32.cma"; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + all_modules = "compat32.cma"; + flags = "-compat-32 -linkall"; + program = "compat32.byte"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) let a = 0xffffffffffff diff --git a/testsuite/tests/tool-ocamlc-error-cleanup/test.ml b/testsuite/tests/tool-ocamlc-error-cleanup/test.ml index 0624a6a8a92..f668d172a9e 100644 --- a/testsuite/tests/tool-ocamlc-error-cleanup/test.ml +++ b/testsuite/tests/tool-ocamlc-error-cleanup/test.ml @@ -1,12 +1,12 @@ (* TEST -* setup-ocamlc.byte-build-env -compiler_output = "compiler-output.raw" -** ocamlc.byte -all_modules = "test.ml" -flags = "-warn-error +A" -ocamlc_byte_exit_status = "2" -*** script -script = "sh ${test_source_directory}/check-error-cleanup.sh" + compiler_output = "compiler-output.raw"; + setup-ocamlc.byte-build-env; + all_modules = "test.ml"; + flags = "-warn-error +A"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + script = "sh ${test_source_directory}/check-error-cleanup.sh"; + script; *) (* Regression test for MPR#7918 *) diff --git a/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.ml b/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.ml index e965ca43855..cad238d97c6 100644 --- a/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.ml +++ b/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.ml @@ -1,7 +1,7 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags = "-open F(" -ocamlc_byte_exit_status = "2" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + flags = "-open F("; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open.ml b/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open.ml index 9485a681e85..f7c275dd927 100644 --- a/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open.ml +++ b/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open.ml @@ -1,10 +1,10 @@ (* TEST -readonly_files = "a.ml b.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "a.ml" -*** ocamlc.byte -module = "b.ml" -flags = "-open A.M" -**** check-ocamlc.byte-output + readonly_files = "a.ml b.ml"; + setup-ocamlc.byte-build-env; + module = "a.ml"; + ocamlc.byte; + module = "b.ml"; + flags = "-open A.M"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/tool-ocamlc-stop-after/stop_after_lambda.ml b/testsuite/tests/tool-ocamlc-stop-after/stop_after_lambda.ml index e018d17ce6b..e1c2b586707 100644 --- a/testsuite/tests/tool-ocamlc-stop-after/stop_after_lambda.ml +++ b/testsuite/tests/tool-ocamlc-stop-after/stop_after_lambda.ml @@ -1,9 +1,9 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte - flags = "-dlambda -stop-after lambda -nopervasives " - ocamlc_byte_exit_status = "0" -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + flags = "-dlambda -stop-after lambda -nopervasives "; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + check-ocamlc.byte-output; *) external p : int -> unit = "" diff --git a/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_impl.ml b/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_impl.ml index 3276733c518..0029d7b0ff8 100644 --- a/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_impl.ml +++ b/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_impl.ml @@ -1,12 +1,20 @@ -(* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte - flags = "-stop-after parsing -dparsetree" - ocamlc_byte_exit_status = "0" -*** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_to_pr +eserve_locatio +ns_while_translating_from_old_syntax__Filler_ +text_added_to_preserve_locations_ +while_translating_from_old_s *) (* we intentionally write ill-typed output; if `-stop-after parsing` was not supported properly, the test would fail with an error *) let _ = (1 + "true") + x + +(* TEST + setup-ocamlc.byte-build-env; + flags = "-stop-after parsing -dparsetree"; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.compilers.reference b/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.compilers.reference index f5cb47d16a6..68ebe85c714 100644 --- a/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.compilers.reference +++ b/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.compilers.reference @@ -6,5 +6,6 @@ Ptyp_constr "Module_that_does_not_exists.type_that_does_not_exists" (stop_after_parsing_intf.mli[12,306+8]..[12,306+61]) [] [] + [] ] diff --git a/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.mli b/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.mli index 328a78d47fa..802fe9abf23 100644 --- a/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.mli +++ b/testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.mli @@ -1,12 +1,20 @@ -(* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte - flags = "-stop-after parsing -dparsetree" - ocamlc_byte_exit_status = "0" -*** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_to_pr +eserve_locatio +ns_while_translating_from_old_syntax__Filler_ +text_added_to_preserve_locations_ +while_translating_from_old_s *) (* we intentionally write ill-typed output; if `-stop-after parsing` was not supported properly, the test would fail with an error *) val x : Module_that_does_not_exists.type_that_does_not_exists + +(* TEST + setup-ocamlc.byte-build-env; + flags = "-stop-after parsing -dparsetree"; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/tool-ocamlc-stop-after/stop_after_scheduling.ml b/testsuite/tests/tool-ocamlc-stop-after/stop_after_scheduling.ml index c5eae2bb417..d4344f8ba17 100644 --- a/testsuite/tests/tool-ocamlc-stop-after/stop_after_scheduling.ml +++ b/testsuite/tests/tool-ocamlc-stop-after/stop_after_scheduling.ml @@ -1,14 +1,14 @@ (* TEST -* setup-ocamlc.byte-build-env -compiler_output = "compiler-output.raw" -** ocamlc.byte - flags = "-stop-after scheduling" - ocamlc_byte_exit_status = "2" -*** script - script = "sh ${test_source_directory}/stop_after_scheduling.sh" - output = "compiler-output" -**** check-ocamlc.byte-output -compiler_output = "compiler-output" + compiler_output = "compiler-output.raw"; + setup-ocamlc.byte-build-env; + flags = "-stop-after scheduling"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + script = "sh ${test_source_directory}/stop_after_scheduling.sh"; + output = "compiler-output"; + script; + compiler_output = "compiler-output"; + check-ocamlc.byte-output; *) (* this file is just a test driver, the test does not contain real OCaml code *) diff --git a/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.ml b/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.ml index f739509551e..2cf68dbd28e 100644 --- a/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.ml +++ b/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.ml @@ -1,9 +1,9 @@ -(* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte - flags = "-stop-after typing -dno-unique-ids -dtypedtree" - ocamlc_byte_exit_status = "0" -*** check-ocamlc.byte-output +(* TEST_BELOW +Filler_text_added_to_pr +eserve_locatio +ns_while_translating_from_old_syntax__Filler_text_added_to_p +reserve_locations_while_translati +ng_from_old_syntax__Filler_t *) (* we intentionally write an output that is type-correct @@ -11,3 +11,11 @@ due to the incorrect type given to the %apply compiler primitive. *) external apply: int -> int = "%apply" + +(* TEST + setup-ocamlc.byte-build-env; + flags = "-stop-after typing -dno-unique-ids -dtypedtree"; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/tool-ocamldep-modalias/main.ml b/testsuite/tests/tool-ocamldep-modalias/main.ml index 801fa033398..18fe38e9e88 100644 --- a/testsuite/tests/tool-ocamldep-modalias/main.ml +++ b/testsuite/tests/tool-ocamldep-modalias/main.ml @@ -1,137 +1,134 @@ (* TEST - -readonly_files = "A.ml B.ml C.ml D.ml lib_impl.ml lib.mli \ - Makefile.build Makefile.build2" - -set sources = "A.ml B.ml C.ml D.ml" -set links = "LibA.ml LibB.ml LibC.ml LibD.ml" -set stdlib = "-nostdlib -I ${ocamlsrcdir}/stdlib" -set OCAMLC = "${ocamlrun} ${ocamlc_byte} ${stdlib}" -set OCAMLOPT = "${ocamlrun} ${ocamlopt_byte} ${stdlib}" - -* setup-ocamlc.byte-build-env -compiler_directory_suffix = ".depend.mk" -compiler_output = "${test_build_directory}/depend.mk" -** copy -src = "A.ml" -dst = "LibA.ml" -*** copy -src = "B.ml" -dst = "LibB.ml" -**** copy -src = "C.ml" -dst = "LibC.ml" -***** copy -src = "D.ml" -dst = "LibD.ml" -****** copy -src = "lib_impl.ml" -dst = "lib.ml" -******* ocamlc.byte -commandline = "-depend -as-map lib.ml lib.mli" -******** ocamlc.byte -commandline = "-depend -map lib.ml -open Lib ${links}" -********* check-ocamlc.byte-output -compiler_reference = "${test_source_directory}/depend.mk.reference" -********** hasunix -*********** script -script = "rm -f ${links}" -************ script -script = "${MAKE} -f Makefile.build byte" -************* native-compiler -************** script -script = "${MAKE} -f Makefile.build opt" - -* setup-ocamlc.byte-build-env -compiler_directory_suffix = ".depend.mk2" -compiler_output = "${test_build_directory}/depend.mk2" -** copy -src = "A.ml" -dst = "LibA.ml" -*** copy -src = "B.ml" -dst = "LibB.ml" -**** copy -src = "C.ml" -dst = "LibC.ml" -***** copy -src = "D.ml" -dst = "LibD.ml" -****** ocamlc.byte -commandline = "-depend -map lib.mli -open Lib ${links}" -******* check-ocamlc.byte-output -compiler_reference = "${test_source_directory}/depend.mk2.reference" -******** hasunix -********* script -script = "rm -f ${links}" -********** script -script = "${MAKE} -f Makefile.build2 byte" -*********** native-compiler -************ script -script = "${MAKE} -f Makefile.build2 opt" - -* setup-ocamlc.byte-build-env -compiler_directory_suffix = ".depend.mod" -** copy -src = "A.ml" -dst = "LibA.ml" -*** copy -src = "B.ml" -dst = "LibB.ml" -**** copy -src = "C.ml" -dst = "LibC.ml" -***** copy -src = "D.ml" -dst = "LibD.ml" -****** copy -src = "lib_impl.ml" -dst = "lib.ml" -******* ocamlc.byte -commandline = "-depend -as-map -modules lib.ml lib.mli" -******** ocamlc.byte -commandline = "-depend -modules -map lib.ml -open Lib ${links}" -********* check-ocamlc.byte-output -compiler_reference = "${test_source_directory}/depend.mod.reference" - -* setup-ocamlc.byte-build-env -compiler_directory_suffix = ".depend.mod2" -** copy -src = "A.ml" -dst = "LibA.ml" -*** copy -src = "B.ml" -dst = "LibB.ml" -**** copy -src = "C.ml" -dst = "LibC.ml" -***** copy -src = "D.ml" -dst = "LibD.ml" -****** ocamlc.byte -commandline = "-depend -modules -map lib.mli ${links}" -******* check-ocamlc.byte-output -compiler_reference = "${test_source_directory}/depend.mod2.reference" - -* setup-ocamlc.byte-build-env -compiler_directory_suffix = ".depend.mod3" -** copy -src = "A.ml" -dst = "LibA.ml" -*** copy -src = "B.ml" -dst = "LibB.ml" -**** copy -src = "C.ml" -dst = "LibC.ml" -***** copy -src = "D.ml" -dst = "LibD.ml" -****** ocamlc.byte -commandline = "-depend -modules -as-map -map lib.mli -open Lib ${links}" -******* check-ocamlc.byte-output -compiler_reference = "${test_source_directory}/depend.mod3.reference" - + readonly_files = "A.ml B.ml C.ml D.ml lib_impl.ml lib.mli Makefile.build Makefile.build2"; + set sources = "A.ml B.ml C.ml D.ml"; + set links = "LibA.ml LibB.ml LibC.ml LibD.ml"; + set stdlib = "-nostdlib -I ${ocamlsrcdir}/stdlib"; + set OCAMLC = "${ocamlrun} ${ocamlc_byte} ${stdlib}"; + set OCAMLOPT = "${ocamlrun} ${ocamlopt_byte} ${stdlib}"; + { + compiler_directory_suffix = ".depend.mk"; + compiler_output = "${test_build_directory}/depend.mk"; + setup-ocamlc.byte-build-env; + src = "A.ml"; + dst = "LibA.ml"; + copy; + src = "B.ml"; + dst = "LibB.ml"; + copy; + src = "C.ml"; + dst = "LibC.ml"; + copy; + src = "D.ml"; + dst = "LibD.ml"; + copy; + src = "lib_impl.ml"; + dst = "lib.ml"; + copy; + commandline = "-depend -as-map lib.ml lib.mli"; + ocamlc.byte; + commandline = "-depend -map lib.ml -open Lib ${links}"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/depend.mk.reference"; + check-ocamlc.byte-output; + hasunix; + script = "rm -f ${links}"; + script; + script = "${MAKE} -f Makefile.build byte"; + script; + native-compiler; + script = "${MAKE} -f Makefile.build opt"; + script; + }{ + compiler_directory_suffix = ".depend.mk2"; + compiler_output = "${test_build_directory}/depend.mk2"; + setup-ocamlc.byte-build-env; + src = "A.ml"; + dst = "LibA.ml"; + copy; + src = "B.ml"; + dst = "LibB.ml"; + copy; + src = "C.ml"; + dst = "LibC.ml"; + copy; + src = "D.ml"; + dst = "LibD.ml"; + copy; + commandline = "-depend -map lib.mli -open Lib ${links}"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/depend.mk2.reference"; + check-ocamlc.byte-output; + hasunix; + script = "rm -f ${links}"; + script; + script = "${MAKE} -f Makefile.build2 byte"; + script; + native-compiler; + script = "${MAKE} -f Makefile.build2 opt"; + script; + }{ + compiler_directory_suffix = ".depend.mod"; + setup-ocamlc.byte-build-env; + src = "A.ml"; + dst = "LibA.ml"; + copy; + src = "B.ml"; + dst = "LibB.ml"; + copy; + src = "C.ml"; + dst = "LibC.ml"; + copy; + src = "D.ml"; + dst = "LibD.ml"; + copy; + src = "lib_impl.ml"; + dst = "lib.ml"; + copy; + commandline = "-depend -as-map -modules lib.ml lib.mli"; + ocamlc.byte; + commandline = "-depend -modules -map lib.ml -open Lib ${links}"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/depend.mod.reference"; + check-ocamlc.byte-output; + }{ + compiler_directory_suffix = ".depend.mod2"; + setup-ocamlc.byte-build-env; + src = "A.ml"; + dst = "LibA.ml"; + copy; + src = "B.ml"; + dst = "LibB.ml"; + copy; + src = "C.ml"; + dst = "LibC.ml"; + copy; + src = "D.ml"; + dst = "LibD.ml"; + copy; + commandline = "-depend -modules -map lib.mli ${links}"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/depend.mod2.reference"; + check-ocamlc.byte-output; + }{ + compiler_directory_suffix = ".depend.mod3"; + setup-ocamlc.byte-build-env; + src = "A.ml"; + dst = "LibA.ml"; + copy; + src = "B.ml"; + dst = "LibB.ml"; + copy; + src = "C.ml"; + dst = "LibC.ml"; + copy; + src = "D.ml"; + dst = "LibD.ml"; + copy; + commandline = "-depend -modules -as-map -map lib.mli -open Lib ${links}"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/depend.mod3.reference"; + check-ocamlc.byte-output; + } *) open Lib diff --git a/testsuite/tests/tool-ocamldep-shadowing/a.ml b/testsuite/tests/tool-ocamldep-shadowing/a.ml index 066d4b52005..5da9c539374 100644 --- a/testsuite/tests/tool-ocamldep-shadowing/a.ml +++ b/testsuite/tests/tool-ocamldep-shadowing/a.ml @@ -1,12 +1,10 @@ (* TEST - -subdirectories = "dir1 dir2" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -commandline = "-depend -slash -I dir1 -I dir2 a.ml" -*** check-ocamlc.byte-output -compiler_reference = "${test_source_directory}/a.reference" + subdirectories = "dir1 dir2"; + setup-ocamlc.byte-build-env; + commandline = "-depend -slash -I dir1 -I dir2 a.ml"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/a.reference"; + check-ocamlc.byte-output; *) include B diff --git a/testsuite/tests/tool-ocamldoc-open/main.ml b/testsuite/tests/tool-ocamldoc-open/main.ml index 4dca4e546d2..f76734e67eb 100644 --- a/testsuite/tests/tool-ocamldoc-open/main.ml +++ b/testsuite/tests/tool-ocamldoc-open/main.ml @@ -1,8 +1,8 @@ (* TEST - modules = "inner.ml alias.ml" - * ocamldoc - ocamldoc_backend="latex" - ocamldoc_flags=" -open Alias.Container -open Aliased_inner " + modules = "inner.ml alias.ml"; + ocamldoc_backend = "latex"; + ocamldoc_flags = " -open Alias.Container -open Aliased_inner "; + ocamldoc; *) (** Documentation test *) diff --git a/testsuite/tests/tool-ocamldoc/Alert_toplevel.mli b/testsuite/tests/tool-ocamldoc/Alert_toplevel.mli index 4b67c2d769a..73a9e74625b 100644 --- a/testsuite/tests/tool-ocamldoc/Alert_toplevel.mli +++ b/testsuite/tests/tool-ocamldoc/Alert_toplevel.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) (** There's a top-comment before. *) diff --git a/testsuite/tests/tool-ocamldoc/Alert_toplevel2.mli b/testsuite/tests/tool-ocamldoc/Alert_toplevel2.mli index a31bab43042..9284a7db669 100644 --- a/testsuite/tests/tool-ocamldoc/Alert_toplevel2.mli +++ b/testsuite/tests/tool-ocamldoc/Alert_toplevel2.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) [@@@alert deprecated "foo"] diff --git a/testsuite/tests/tool-ocamldoc/Alerts.mli b/testsuite/tests/tool-ocamldoc/Alerts.mli index 95846b0a19a..c2d0a44f318 100644 --- a/testsuite/tests/tool-ocamldoc/Alerts.mli +++ b/testsuite/tests/tool-ocamldoc/Alerts.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) (** Test the rendering of alerts. *) diff --git a/testsuite/tests/tool-ocamldoc/Alerts_impl.ml b/testsuite/tests/tool-ocamldoc/Alerts_impl.ml index db38c1e573f..e542af37d1c 100644 --- a/testsuite/tests/tool-ocamldoc/Alerts_impl.ml +++ b/testsuite/tests/tool-ocamldoc/Alerts_impl.ml @@ -1,6 +1,6 @@ (* TEST - * ocamldoc with html - *) + ocamldoc with html; +*) (** Alerts from implementation. *) diff --git a/testsuite/tests/tool-ocamldoc/Documentation_tags.mli b/testsuite/tests/tool-ocamldoc/Documentation_tags.mli index 0dadce6610c..cffb06626de 100644 --- a/testsuite/tests/tool-ocamldoc/Documentation_tags.mli +++ b/testsuite/tests/tool-ocamldoc/Documentation_tags.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) (** Test the html rendering of ocamldoc documentation tags *) diff --git a/testsuite/tests/tool-ocamldoc/Entities.ml b/testsuite/tests/tool-ocamldoc/Entities.ml index 218817eed88..ce48d6755b2 100644 --- a/testsuite/tests/tool-ocamldoc/Entities.ml +++ b/testsuite/tests/tool-ocamldoc/Entities.ml @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) type ul diff --git a/testsuite/tests/tool-ocamldoc/Extensible_variant.ml b/testsuite/tests/tool-ocamldoc/Extensible_variant.ml index f459fa276b7..7202a8475cd 100644 --- a/testsuite/tests/tool-ocamldoc/Extensible_variant.ml +++ b/testsuite/tests/tool-ocamldoc/Extensible_variant.ml @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with latex + ocamldoc with latex; *) (** Testing display of extensible variant types and exceptions. diff --git a/testsuite/tests/tool-ocamldoc/Include_module_type_of.mli b/testsuite/tests/tool-ocamldoc/Include_module_type_of.mli index c30432d4725..b33cbb5c5c1 100644 --- a/testsuite/tests/tool-ocamldoc/Include_module_type_of.mli +++ b/testsuite/tests/tool-ocamldoc/Include_module_type_of.mli @@ -1,6 +1,9 @@ (* TEST - * ocamldoc with html - * ocamldoc with latex + { + ocamldoc with html; + }{ + ocamldoc with latex; + } *) (** Test [include module type of...] variants *) diff --git a/testsuite/tests/tool-ocamldoc/Inline_records.mli b/testsuite/tests/tool-ocamldoc/Inline_records.mli index 5b4646d9e1d..1f5a15e6670 100644 --- a/testsuite/tests/tool-ocamldoc/Inline_records.mli +++ b/testsuite/tests/tool-ocamldoc/Inline_records.mli @@ -1,7 +1,11 @@ (* TEST - * ocamldoc with html - * ocamldoc with latex - * ocamldoc with man + { + ocamldoc with html; + }{ + ocamldoc with latex; + }{ + ocamldoc with man; + } *) (** diff --git a/testsuite/tests/tool-ocamldoc/Inline_records_bis.ml b/testsuite/tests/tool-ocamldoc/Inline_records_bis.ml index 4844aaf27a3..970912b3f8c 100644 --- a/testsuite/tests/tool-ocamldoc/Inline_records_bis.ml +++ b/testsuite/tests/tool-ocamldoc/Inline_records_bis.ml @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with latex + ocamldoc with latex; *) (** diff --git a/testsuite/tests/tool-ocamldoc/Item_ids.mli b/testsuite/tests/tool-ocamldoc/Item_ids.mli index 878c6fef308..744fd9d239f 100644 --- a/testsuite/tests/tool-ocamldoc/Item_ids.mli +++ b/testsuite/tests/tool-ocamldoc/Item_ids.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) (** Check that all toplevel items are given a unique id. *) diff --git a/testsuite/tests/tool-ocamldoc/Level_0.mli b/testsuite/tests/tool-ocamldoc/Level_0.mli index f7ac2a888e3..3bd9aea9778 100644 --- a/testsuite/tests/tool-ocamldoc/Level_0.mli +++ b/testsuite/tests/tool-ocamldoc/Level_0.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with latex + ocamldoc with latex; *) (** Test for level 0 headings diff --git a/testsuite/tests/tool-ocamldoc/Linebreaks.mli b/testsuite/tests/tool-ocamldoc/Linebreaks.mli index 1dce3838b85..1baf3db3144 100644 --- a/testsuite/tests/tool-ocamldoc/Linebreaks.mli +++ b/testsuite/tests/tool-ocamldoc/Linebreaks.mli @@ -1,8 +1,8 @@ (* TEST - * ocamldoc with html - ** check-program-output - output="type_Linebreaks.html" - reference="${test_source_directory}/type_Linebreaks.reference" + ocamldoc with html; + output = "type_Linebreaks.html"; + reference = "${test_source_directory}/type_Linebreaks.reference"; + check-program-output; *) (** diff --git a/testsuite/tests/tool-ocamldoc/Loop.ml b/testsuite/tests/tool-ocamldoc/Loop.ml index 8428f9fc157..b3c4f6888e7 100644 --- a/testsuite/tests/tool-ocamldoc/Loop.ml +++ b/testsuite/tests/tool-ocamldoc/Loop.ml @@ -1,5 +1,8 @@ (* TEST - * ocamldoc with html - * ocamldoc with latex + { + ocamldoc with html; + }{ + ocamldoc with latex; + } *) module rec A : sig type t end = B and B : sig type t = A.t end = A;; diff --git a/testsuite/tests/tool-ocamldoc/Module_whitespace.ml b/testsuite/tests/tool-ocamldoc/Module_whitespace.ml index 75c6c292744..7b3723d6cf3 100644 --- a/testsuite/tests/tool-ocamldoc/Module_whitespace.ml +++ b/testsuite/tests/tool-ocamldoc/Module_whitespace.ml @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) module M = Set.Make(struct diff --git a/testsuite/tests/tool-ocamldoc/No_preamble.mli b/testsuite/tests/tool-ocamldoc/No_preamble.mli index 7d016dda22f..ea8a655f198 100644 --- a/testsuite/tests/tool-ocamldoc/No_preamble.mli +++ b/testsuite/tests/tool-ocamldoc/No_preamble.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) open String diff --git a/testsuite/tests/tool-ocamldoc/Paragraph.mli b/testsuite/tests/tool-ocamldoc/Paragraph.mli index 8073c7cd99c..73e39e9412b 100644 --- a/testsuite/tests/tool-ocamldoc/Paragraph.mli +++ b/testsuite/tests/tool-ocamldoc/Paragraph.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with html + ocamldoc with html; *) (** This file tests the generation of paragraph within module comments. diff --git a/testsuite/tests/tool-ocamldoc/Short_description.latex.reference b/testsuite/tests/tool-ocamldoc/Short_description.latex.reference index 4a938e41688..26241644c12 100644 --- a/testsuite/tests/tool-ocamldoc/Short_description.latex.reference +++ b/testsuite/tests/tool-ocamldoc/Short_description.latex.reference @@ -8,7 +8,7 @@ \begin{document} \tableofcontents \section{Short\_description : (* TEST - * ocamldoc with latex + ocamldoc with latex; *)} \label{Short-underscoredescription}\index{Short-underscoredescription@\verb`Short_description`} diff --git a/testsuite/tests/tool-ocamldoc/Short_description.txt b/testsuite/tests/tool-ocamldoc/Short_description.txt index e0021ea697d..12a063ba609 100644 --- a/testsuite/tests/tool-ocamldoc/Short_description.txt +++ b/testsuite/tests/tool-ocamldoc/Short_description.txt @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with latex + ocamldoc with latex; *) Short global description in text mode diff --git a/testsuite/tests/tool-ocamldoc/Test.mli b/testsuite/tests/tool-ocamldoc/Test.mli index b28c8e734ef..cbb4aa6a217 100644 --- a/testsuite/tests/tool-ocamldoc/Test.mli +++ b/testsuite/tests/tool-ocamldoc/Test.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with latex + ocamldoc with latex; *) (** Ten comments for tests *) diff --git a/testsuite/tests/tool-ocamldoc/Variants.mli b/testsuite/tests/tool-ocamldoc/Variants.mli index 137a42ce6d5..ba6de5b455f 100644 --- a/testsuite/tests/tool-ocamldoc/Variants.mli +++ b/testsuite/tests/tool-ocamldoc/Variants.mli @@ -1,6 +1,9 @@ (* TEST - * ocamldoc with html - * ocamldoc with latex + { + ocamldoc with html; + }{ + ocamldoc with latex; + } *) (** This test is here to check the latex code generated for variants *) diff --git a/testsuite/tests/tool-ocamldoc/latex_ref.mli b/testsuite/tests/tool-ocamldoc/latex_ref.mli index 8424aa891ff..9ed1a8f86a4 100644 --- a/testsuite/tests/tool-ocamldoc/latex_ref.mli +++ b/testsuite/tests/tool-ocamldoc/latex_ref.mli @@ -1,5 +1,5 @@ (* TEST - * ocamldoc with latex + ocamldoc with latex; *) (** Latex-only test *) diff --git a/testsuite/tests/tool-ocamldoc/t01.ml b/testsuite/tests/tool-ocamldoc/t01.ml index 4dcd2ef381b..1e77854b8fd 100644 --- a/testsuite/tests/tool-ocamldoc/t01.ml +++ b/testsuite/tests/tool-ocamldoc/t01.ml @@ -1,7 +1,7 @@ (* TEST - plugins="odoc_test.ml" - * ocamldoc - flags="-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing" + plugins = "odoc_test.ml"; + flags = "-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing"; + ocamldoc; *) (** Testing display of types. diff --git a/testsuite/tests/tool-ocamldoc/t02.ml b/testsuite/tests/tool-ocamldoc/t02.ml index 821c652be5a..d2f79343474 100644 --- a/testsuite/tests/tool-ocamldoc/t02.ml +++ b/testsuite/tests/tool-ocamldoc/t02.ml @@ -1,7 +1,7 @@ (* TEST - plugins="odoc_test.ml" - * ocamldoc - flags="-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing" + plugins = "odoc_test.ml"; + flags = "-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing"; + ocamldoc; *) module Foo = struct type u type t = int let x = 1 end;; diff --git a/testsuite/tests/tool-ocamldoc/t03.ml b/testsuite/tests/tool-ocamldoc/t03.ml index 818c4f3ffde..512faaccb44 100644 --- a/testsuite/tests/tool-ocamldoc/t03.ml +++ b/testsuite/tests/tool-ocamldoc/t03.ml @@ -1,7 +1,7 @@ (* TEST - plugins="odoc_test.ml" - * ocamldoc - flags="-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing" + plugins = "odoc_test.ml"; + flags = "-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing"; + ocamldoc; *) module Foo = struct type t = int let x = 1 end;; diff --git a/testsuite/tests/tool-ocamldoc/t04.ml b/testsuite/tests/tool-ocamldoc/t04.ml index dbdb9085953..8fa0982fa6f 100644 --- a/testsuite/tests/tool-ocamldoc/t04.ml +++ b/testsuite/tests/tool-ocamldoc/t04.ml @@ -1,7 +1,7 @@ (* TEST - plugins="odoc_test.ml" - * ocamldoc - flags="-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing" + plugins = "odoc_test.ml"; + flags = "-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing"; + ocamldoc; *) (** Testing display of inline record. diff --git a/testsuite/tests/tool-ocamldoc/t05.ml b/testsuite/tests/tool-ocamldoc/t05.ml index 1c1abe29071..8938e7724c3 100644 --- a/testsuite/tests/tool-ocamldoc/t05.ml +++ b/testsuite/tests/tool-ocamldoc/t05.ml @@ -1,7 +1,7 @@ (* TEST - plugins="odoc_test.ml" - * ocamldoc - flags="-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing" + plugins = "odoc_test.ml"; + flags = "-I ${ocamlsrcdir}/ocamldoc -I ${ocamlsrcdir}/typing"; + ocamldoc; *) module rec A : sig type t end = B and B : sig type t = A.t end = A;; diff --git a/testsuite/tests/tool-ocamlobjinfo/question.ml b/testsuite/tests/tool-ocamlobjinfo/question.ml index 43c440b2a21..6795da05ee3 100644 --- a/testsuite/tests/tool-ocamlobjinfo/question.ml +++ b/testsuite/tests/tool-ocamlobjinfo/question.ml @@ -1,18 +1,28 @@ (* TEST -* shared-libraries -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -flags = "-shared" -all_modules = "question.ml" -program = "question.cmxs" -**** check-ocamlopt.byte-output -***** ocamlobjinfo -****** check-program-output + shared-libraries; + setup-ocamlopt.byte-build-env; + flags = "-shared"; + all_modules = "question.ml"; + program = "question.cmxs"; + ocamlopt.byte; + check-ocamlopt.byte-output; + { + ocamlobjinfo; -***** ocamlobjinfo -program = "question.cmx" -(* The cmx output varies too much to check. We're just happy it didn't - segfault on us. *) + program = "-no-code -no-approx question.cmx"; + ocamlobjinfo; + + program = "-no-code question.cmx"; + ocamlobjinfo; + + runtime5; + check-program-output; + }{ + program = "question.cmx"; + ocamlobjinfo; + (* The full cmx output varies too much to check. We're just happy it didn't + segfault on us. *) + } *) (* We use a function rather than a value of type int to ensure that there diff --git a/testsuite/tests/tool-ocamlobjinfo/question.reference b/testsuite/tests/tool-ocamlobjinfo/question.reference index 513bf9c168d..d5d936c5cb1 100644 --- a/testsuite/tests/tool-ocamlobjinfo/question.reference +++ b/testsuite/tests/tool-ocamlobjinfo/question.reference @@ -8,3 +8,64 @@ Interfaces imported: 00000000000000000000000000000000 Question 00000000000000000000000000000000 CamlinternalFormatBasics Implementations imported: +File question.cmx +Name: Question +CRC of implementation: 00000000000000000000000000000000 +Globals defined: + Question +Interfaces imported: + 00000000000000000000000000000000 Stdlib + 00000000000000000000000000000000 Question + 00000000000000000000000000000000 CamlinternalFormatBasics +Implementations imported: +Flambda 2 unit with export information +Currying functions: +Apply functions: +Send functions: +Force link: no +File question.cmx +Name: Question +CRC of implementation: 00000000000000000000000000000000 +Globals defined: + Question +Interfaces imported: + 00000000000000000000000000000000 Stdlib + 00000000000000000000000000000000 Question + 00000000000000000000000000000000 CamlinternalFormatBasics +Implementations imported: +Flambda 2 export information: +Original unit: Question +Typing env: +((defined_symbols_without_equations ()) + (code_age_relation + {(camlQuestion.answer_0_1_code camlQuestion.answer_0_0_code)}) + (type_equations + {(Question.camlQuestion + (Val + (Variant + (blocks + ((alloc_mode Heap) (known + {(tag_0 => (Known 1), ((Val (= Question.camlQuestion.answer_1))))}) + (other Bottom))) (tagged_imms (Naked_immediate ⊥))))) + (Question.camlQuestion.answer_1 + (Val + ((alloc_mode Heap) (known + {((answer/0 ∷ 𝕍) + => (Known ((closures { (answer/0 ∷ 𝕍) }) (value_slots { }))), + ((function_types + {((answer/0 ∷ 𝕍) + (Ok (function_type (code_id camlQuestion.answer_0_1_code) + (rec_info (Rec_info 0)))))}) + (closure_types + ((function_slot_components_by_index + {((answer/0 ∷ 𝕍) (Val (= Question.camlQuestion.answer_1)))}))) + (value_slot_types ((value_slot_components_by_index {})))))}) + (other Bottom))))}) + (aliases + ((canonical_elements {}) (aliases_of_canonical_names {}) + (aliases_of_consts {})))) + +Currying functions: +Apply functions: +Send functions: +Force link: no diff --git a/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.ml b/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.ml index 610abbdc343..531aacbd7ae 100644 --- a/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.ml +++ b/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.ml @@ -1,16 +1,16 @@ (* TEST - * native-compiler - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte - flags = "-save-ir-after scheduling" - ocamlopt_byte_exit_status = "0" - **** script - script = "touch empty.ml" - ***** ocamlopt.byte - flags = "-S check_for_pack.cmir-linear -for-pack foo" - module = "empty.ml" - ocamlopt_byte_exit_status = "2" - ****** check-ocamlopt.byte-output + native-compiler; + setup-ocamlopt.byte-build-env; + flags = "-save-ir-after scheduling"; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + script = "touch empty.ml"; + script; + flags = "-S check_for_pack.cmir-linear -for-pack foo"; + module = "empty.ml"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + check-ocamlopt.byte-output; *) let foo f x = diff --git a/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_scheduling.ml b/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_scheduling.ml index 1d815978569..9d8e1e11e3d 100644 --- a/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_scheduling.ml +++ b/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_scheduling.ml @@ -1,11 +1,11 @@ (* TEST - * native-compiler - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte - flags = "-save-ir-after scheduling -S" - **** check-ocamlopt.byte-output - ***** script - script = "sh ${test_source_directory}/save_ir_after_scheduling.sh" + native-compiler; + setup-ocamlopt.byte-build-env; + flags = "-save-ir-after scheduling -S"; + ocamlopt.byte; + check-ocamlopt.byte-output; + script = "sh ${test_source_directory}/save_ir_after_scheduling.sh"; + script; *) let foo f x = diff --git a/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_typing.ml b/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_typing.ml index 15c2379f7cc..17c4554e52a 100644 --- a/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_typing.ml +++ b/testsuite/tests/tool-ocamlopt-save-ir/save_ir_after_typing.ml @@ -1,15 +1,18 @@ (* TEST - * native-compiler - ** setup-ocamlopt.byte-build-env - compiler_output = "compiler-output.raw" - *** ocamlopt.byte - flags = "-save-ir-after typing" - ocamlopt_byte_exit_status = "2" - *** script - script = "sh ${test_source_directory}/save_ir_after_typing.sh" - output = "compiler-output" - **** check-ocamlopt.byte-output - compiler_output = "compiler-output" + native-compiler; + compiler_output = "compiler-output.raw"; + setup-ocamlopt.byte-build-env; + { + flags = "-save-ir-after typing"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + }{ + script = "sh ${test_source_directory}/save_ir_after_typing.sh"; + output = "compiler-output"; + script; + compiler_output = "compiler-output"; + check-ocamlopt.byte-output; + } *) (* this file is just a test driver, the test does not contain real OCaml code *) diff --git a/testsuite/tests/tool-ocamlopt-save-ir/start_from_emit.ml b/testsuite/tests/tool-ocamlopt-save-ir/start_from_emit.ml index bac85a816fd..66757e0691c 100644 --- a/testsuite/tests/tool-ocamlopt-save-ir/start_from_emit.ml +++ b/testsuite/tests/tool-ocamlopt-save-ir/start_from_emit.ml @@ -1,29 +1,28 @@ (* TEST - * native-compiler - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte - flags = "-save-ir-after scheduling -stop-after scheduling" - ocamlopt_byte_exit_status = "0" - **** script - script = "touch empty.ml" - ***** ocamlopt.byte - flags = "-S start_from_emit.cmir-linear" - module = "empty.ml" - ocamlopt_byte_exit_status = "0" - ****** check-ocamlopt.byte-output - ******* script - script = "sh ${test_source_directory}/start_from_emit.sh" - ******** ocamlopt.byte - flags = "-S start_from_emit.cmir-linear -save-ir-after scheduling" - module = "empty.ml" - ocamlopt_byte_exit_status = "0" - ********* copy - src = "start_from_emit.cmir-linear" - dst = "expected.cmir_linear" - ********** check-ocamlopt.byte-output - *********** script - script = "cmp start_from_emit.cmir-linear expected.cmir_linear" - + native-compiler; + setup-ocamlopt.byte-build-env; + flags = "-save-ir-after scheduling -stop-after scheduling"; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + script = "touch empty.ml"; + script; + flags = "-S start_from_emit.cmir-linear"; + module = "empty.ml"; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + check-ocamlopt.byte-output; + script = "sh ${test_source_directory}/start_from_emit.sh"; + script; + flags = "-S start_from_emit.cmir-linear -save-ir-after scheduling"; + module = "empty.ml"; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + src = "start_from_emit.cmir-linear"; + dst = "expected.cmir_linear"; + copy; + check-ocamlopt.byte-output; + script = "cmp start_from_emit.cmir-linear expected.cmir_linear"; + script; *) let foo f x = diff --git a/testsuite/tests/tool-ocamlopt-stop-after/stop_after_lambda.ml b/testsuite/tests/tool-ocamlopt-stop-after/stop_after_lambda.ml index 591f3d112b4..a3f08f4bfc2 100644 --- a/testsuite/tests/tool-ocamlopt-stop-after/stop_after_lambda.ml +++ b/testsuite/tests/tool-ocamlopt-stop-after/stop_after_lambda.ml @@ -1,10 +1,10 @@ (* TEST -* no-flambda -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte - flags = "-dlambda -stop-after lambda -nopervasives " - ocamlopt_byte_exit_status = "0" -**** check-ocamlopt.byte-output + no-flambda; + setup-ocamlopt.byte-build-env; + flags = "-dlambda -stop-after lambda -nopervasives "; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + check-ocamlopt.byte-output; *) (* no-flambda: the -lambda output differs with flambda, and diff --git a/testsuite/tests/tool-ocamlopt-stop-after/stop_after_scheduling.ml b/testsuite/tests/tool-ocamlopt-stop-after/stop_after_scheduling.ml index dfa97ffd68c..d446248f1b4 100644 --- a/testsuite/tests/tool-ocamlopt-stop-after/stop_after_scheduling.ml +++ b/testsuite/tests/tool-ocamlopt-stop-after/stop_after_scheduling.ml @@ -1,12 +1,12 @@ (* TEST - * native-compiler - ** setup-ocamlopt.byte-build-env - *** ocamlopt.byte - flags = "-stop-after scheduling -S" - ocamlopt_byte_exit_status = "0" - **** check-ocamlopt.byte-output - ***** script - script = "sh ${test_source_directory}/stop_after_scheduling.sh" + native-compiler; + setup-ocamlopt.byte-build-env; + flags = "-stop-after scheduling -S"; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + check-ocamlopt.byte-output; + script = "sh ${test_source_directory}/stop_after_scheduling.sh"; + script; *) (* this file is just a test driver, the test does not contain real OCaml code *) diff --git a/testsuite/tests/tool-ocamltest/norm1.ml b/testsuite/tests/tool-ocamltest/norm1.ml index ea32acffedf..d4f5e418e80 100644 --- a/testsuite/tests/tool-ocamltest/norm1.ml +++ b/testsuite/tests/tool-ocamltest/norm1.ml @@ -1,5 +1,4 @@ -(* TEST - *) +(* TEST *) let () = set_binary_mode_out stdout true in (* ocamltest must normalise the \r\n *) print_string "line1\r\n"; flush stdout diff --git a/testsuite/tests/tool-ocamltest/norm2.ml b/testsuite/tests/tool-ocamltest/norm2.ml index 284e99d6946..cdf4afaf96b 100644 --- a/testsuite/tests/tool-ocamltest/norm2.ml +++ b/testsuite/tests/tool-ocamltest/norm2.ml @@ -1,5 +1,4 @@ -(* TEST - *) +(* TEST *) let () = set_binary_mode_out stdout true in (* ocamltest must normalise the \r\n *) print_string "line1\r\nline2\r\n"; flush stdout diff --git a/testsuite/tests/tool-ocamltest/norm3.ml b/testsuite/tests/tool-ocamltest/norm3.ml index eb7baa75ce1..9818a2c3b42 100644 --- a/testsuite/tests/tool-ocamltest/norm3.ml +++ b/testsuite/tests/tool-ocamltest/norm3.ml @@ -1,5 +1,4 @@ -(* TEST - *) +(* TEST *) let () = set_binary_mode_out stdout true in (* ocamltest must normalise the \r\n but preserve the final \r *) print_string "line1\r\nline2\r"; flush stdout diff --git a/testsuite/tests/tool-ocamltest/norm4.ml b/testsuite/tests/tool-ocamltest/norm4.ml index 7b06b922283..b91b390a658 100644 --- a/testsuite/tests/tool-ocamltest/norm4.ml +++ b/testsuite/tests/tool-ocamltest/norm4.ml @@ -1,5 +1,4 @@ -(* TEST - *) +(* TEST *) let () = set_binary_mode_out stdout true in (* ocamltest must normalise the \r\n *) print_string "line1\r\nline2"; flush stdout diff --git a/testsuite/tests/tool-toplevel-invocation/test.ml b/testsuite/tests/tool-toplevel-invocation/test.ml index b5c54d54994..7951c7e2a91 100644 --- a/testsuite/tests/tool-toplevel-invocation/test.ml +++ b/testsuite/tests/tool-toplevel-invocation/test.ml @@ -1,51 +1,47 @@ (* TEST - -readonly_files = "first_arg_fail.txt last_arg_fail.txt" - -* setup-ocaml-build-env - -** ocaml -flags = "-args ${test_source_directory}/first_arg_fail.txt" -compiler_reference = "${test_source_directory}/first_arg_fail.txt.reference" -compiler_output = "${test_build_directory}/first_arg_fail.output" -ocaml_exit_status = "2" -*** check-ocaml-output - -** ocaml -flags = "-args ${test_source_directory}/indirect_first_arg_fail.txt" -compiler_reference = - "${test_source_directory}/indirect_first_arg_fail.txt.reference" -compiler_output = "${test_build_directory}/indirect_first_arg_fail.output" -ocaml_exit_status = "2" -*** check-ocaml-output - -** ocaml -flags = "-args ${test_source_directory}/indirect_last_arg_fail.txt" -compiler_reference = - "${test_source_directory}/indirect_last_arg_fail.txt.reference" -compiler_output = "${test_build_directory}/indirect_last_arg_fail.output" -ocaml_exit_status = "2" -*** check-ocaml-output - -** ocaml -flags = "-args ${test_source_directory}/last_arg_fail.txt" -compiler_reference = "${test_source_directory}/last_arg_fail.txt.reference" -compiler_output = "${test_build_directory}/last_arg_fail.output" -ocaml_exit_status = "2" -*** check-ocaml-output - -** ocaml -flags = "-args ${test_source_directory}/working_arg.txt" -compiler_reference = "${test_source_directory}/working_arg.txt.reference" -compiler_output = "${test_build_directory}/working_arg.output" -*** check-ocaml-output - -** ocaml -flags = "${test_source_directory}/print_args.ml foo bar" -compiler_reference = "${test_source_directory}/print_args.reference" -compiler_output = "${test_build_directory}/print_args.output" -*** check-ocaml-output - + readonly_files = "first_arg_fail.txt last_arg_fail.txt"; + setup-ocaml-build-env; + { + flags = "-args ${test_source_directory}/first_arg_fail.txt"; + compiler_reference = "${test_source_directory}/first_arg_fail.txt.reference"; + compiler_output = "${test_build_directory}/first_arg_fail.output"; + ocaml_exit_status = "2"; + ocaml; + check-ocaml-output; + }{ + flags = "-args ${test_source_directory}/indirect_first_arg_fail.txt"; + compiler_reference = "${test_source_directory}/indirect_first_arg_fail.txt.reference"; + compiler_output = "${test_build_directory}/indirect_first_arg_fail.output"; + ocaml_exit_status = "2"; + ocaml; + check-ocaml-output; + }{ + flags = "-args ${test_source_directory}/indirect_last_arg_fail.txt"; + compiler_reference = "${test_source_directory}/indirect_last_arg_fail.txt.reference"; + compiler_output = "${test_build_directory}/indirect_last_arg_fail.output"; + ocaml_exit_status = "2"; + ocaml; + check-ocaml-output; + }{ + flags = "-args ${test_source_directory}/last_arg_fail.txt"; + compiler_reference = "${test_source_directory}/last_arg_fail.txt.reference"; + compiler_output = "${test_build_directory}/last_arg_fail.output"; + ocaml_exit_status = "2"; + ocaml; + check-ocaml-output; + }{ + flags = "-args ${test_source_directory}/working_arg.txt"; + compiler_reference = "${test_source_directory}/working_arg.txt.reference"; + compiler_output = "${test_build_directory}/working_arg.output"; + ocaml; + check-ocaml-output; + }{ + flags = "${test_source_directory}/print_args.ml foo bar"; + compiler_reference = "${test_source_directory}/print_args.reference"; + compiler_output = "${test_build_directory}/print_args.output"; + ocaml; + check-ocaml-output; + } *) printf "Test succeeds\n";; diff --git a/testsuite/tests/tool-toplevel/any.ml b/testsuite/tests/tool-toplevel/any.ml index c181c53e61f..6fadce0fc11 100644 --- a/testsuite/tests/tool-toplevel/any.ml +++ b/testsuite/tests/tool-toplevel/any.ml @@ -1,7 +1,7 @@ (* TEST - exit_status = "2" - * toplevel.opt - reference = "${test_source_directory}/any.native.reference" + exit_status = "2"; + reference = "${test_source_directory}/any.native.reference"; + toplevel.opt; *) (* This checks that things with layout "any" don't cause problems in [Tstr_eval] *) diff --git a/testsuite/tests/tool-toplevel/error_highlighting.ml b/testsuite/tests/tool-toplevel/error_highlighting.ml index dbf3810387a..eb6f98af1fe 100644 --- a/testsuite/tests/tool-toplevel/error_highlighting.ml +++ b/testsuite/tests/tool-toplevel/error_highlighting.ml @@ -1,9 +1,9 @@ -(* TEST - readonly_files = "error_highlighting_use1.ml \ - error_highlighting_use2.ml \ - error_highlighting_use3.ml \ - error_highlighting_use4.ml" - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) let x = (1 + 2) +. 3. in ();; @@ -109,3 +109,8 @@ let x = 1 in ();; #use "error_highlighting_use2.ml";; #use "error_highlighting_use3.ml";; #use "error_highlighting_use4.ml";; + +(* TEST + readonly_files = "error_highlighting_use1.ml error_highlighting_use2.ml error_highlighting_use3.ml error_highlighting_use4.ml"; + toplevel; +*) diff --git a/testsuite/tests/tool-toplevel/exotic_arrays.compilers.reference b/testsuite/tests/tool-toplevel/exotic_arrays.compilers.reference new file mode 100644 index 00000000000..9c464b44c2e --- /dev/null +++ b/testsuite/tests/tool-toplevel/exotic_arrays.compilers.reference @@ -0,0 +1,6 @@ +val y : float array = [|1.; 2.; 3.; 4.|] +val y : float# array = [|; ; ; |] +val y : int32# array = +val y : nativeint# array = +val y : int64# array = + diff --git a/testsuite/tests/tool-toplevel/exotic_arrays.ml b/testsuite/tests/tool-toplevel/exotic_arrays.ml new file mode 100644 index 00000000000..dbd0d323f20 --- /dev/null +++ b/testsuite/tests/tool-toplevel/exotic_arrays.ml @@ -0,0 +1,13 @@ +(* TEST + toplevel.opt; +*) + +let y = [| 1.0; 2.0; 3.0; 4.0 |];; + +let y = [| #1.0; #2.0; #3.0; #4.0 |];; + +let y = [| #1l; #2l; #3l; #4l |];; + +let y = [| #1n; #2n; #3n; #4n |];; + +let y = [| #1L; #2L; #3L; #4L |];; diff --git a/testsuite/tests/tool-toplevel/exotic_lists.ml b/testsuite/tests/tool-toplevel/exotic_lists.ml index bb09823bd9c..a42ff0534bf 100644 --- a/testsuite/tests/tool-toplevel/exotic_lists.ml +++ b/testsuite/tests/tool-toplevel/exotic_lists.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) module L = struct diff --git a/testsuite/tests/tool-toplevel/install_printer.ml b/testsuite/tests/tool-toplevel/install_printer.ml index e14a0ced8f5..1f5478fcfc9 100644 --- a/testsuite/tests/tool-toplevel/install_printer.ml +++ b/testsuite/tests/tool-toplevel/install_printer.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* simple printer *) diff --git a/testsuite/tests/tool-toplevel/known-bugs/broken_rec_in_show.ml b/testsuite/tests/tool-toplevel/known-bugs/broken_rec_in_show.ml index de8262bc0f8..d496f06be48 100644 --- a/testsuite/tests/tool-toplevel/known-bugs/broken_rec_in_show.ml +++ b/testsuite/tests/tool-toplevel/known-bugs/broken_rec_in_show.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* This is a known-bug file for use of 'rec' by the '#show' command, diff --git a/testsuite/tests/tool-toplevel/mod_use.ml b/testsuite/tests/tool-toplevel/mod_use.ml index 4ea967e5c0d..0b40a600e1c 100644 --- a/testsuite/tests/tool-toplevel/mod_use.ml +++ b/testsuite/tests/tool-toplevel/mod_use.ml @@ -1,6 +1,6 @@ (* TEST - readonly_files = "mod.ml" - * expect + readonly_files = "mod.ml"; + expect; *) #mod_use "mod.ml" diff --git a/testsuite/tests/tool-toplevel/pr6468.ml b/testsuite/tests/tool-toplevel/pr6468.ml index 69680ccfddc..e4dc5c8f5c8 100644 --- a/testsuite/tests/tool-toplevel/pr6468.ml +++ b/testsuite/tests/tool-toplevel/pr6468.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* Make the test reproducible regardless of whether OCAMLRUNPARAM=b or not *) diff --git a/testsuite/tests/tool-toplevel/pr7060.ml b/testsuite/tests/tool-toplevel/pr7060.ml index e6ad7408880..87e00e60107 100644 --- a/testsuite/tests/tool-toplevel/pr7060.ml +++ b/testsuite/tests/tool-toplevel/pr7060.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) type t = A | B;; diff --git a/testsuite/tests/tool-toplevel/pr7751.ml b/testsuite/tests/tool-toplevel/pr7751.ml index 40ce9ffd444..d0c42e209ce 100644 --- a/testsuite/tests/tool-toplevel/pr7751.ml +++ b/testsuite/tests/tool-toplevel/pr7751.ml @@ -1,6 +1,6 @@ (* TEST - include ocamlcommon - * toplevel + include ocamlcommon; + toplevel; *) Parse.expression (Lexing.from_string "1");; diff --git a/testsuite/tests/tool-toplevel/pr9701.compilers.reference b/testsuite/tests/tool-toplevel/pr9701.compilers.reference index 81d7947b05b..d1b7944331f 100644 --- a/testsuite/tests/tool-toplevel/pr9701.compilers.reference +++ b/testsuite/tests/tool-toplevel/pr9701.compilers.reference @@ -1,4 +1,4 @@ Exception: Failure "test". -Raised at Stdlib.failwith in file "stdlib.ml", line 34, characters 17-33 +Raised at Stdlib.failwith in file "stdlib.ml", line 35, characters 17-33 Called from in file "pr9701.ml", line 5, characters 9-16 Called from Topeval.load_lambda in file "ocaml/toplevel/byte/topeval.ml", line 90, characters 4-14 diff --git a/testsuite/tests/tool-toplevel/pr9701.ml b/testsuite/tests/tool-toplevel/pr9701.ml index 4dbbc2d6142..daefafbff39 100644 --- a/testsuite/tests/tool-toplevel/pr9701.ml +++ b/testsuite/tests/tool-toplevel/pr9701.ml @@ -1,9 +1,9 @@ (* TEST -ocaml_script_as_argument = "true" -ocaml_exit_status = "2" -* setup-ocaml-build-env -** ocaml -*** check-ocaml-output + ocaml_script_as_argument = "true"; + ocaml_exit_status = "2"; + setup-ocaml-build-env; + ocaml; + check-ocaml-output; *) #1 "pr9701.ml" diff --git a/testsuite/tests/tool-toplevel/printval.ml b/testsuite/tests/tool-toplevel/printval.ml index 17c2744440b..1305dad3fe8 100644 --- a/testsuite/tests/tool-toplevel/printval.ml +++ b/testsuite/tests/tool-toplevel/printval.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Test a success case *) diff --git a/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference b/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference index c2a968027d5..b2fcdd65595 100644 --- a/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference +++ b/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference @@ -14,7 +14,7 @@ val y : (u * v * (module S)) M.t = M.X (A, B, ) Line 2, characters 4-5: 2 | x = y;; ^ -Error: This expression has type (u * v * (module S)) M.t +Error: This expression has type (u/1 * v/1 * (module S/1)) M/1.t but an expression was expected of type (u/2 * v/2 * (module S/2)) M/2.t Hint: The types v and u have been defined multiple times in this @@ -43,14 +43,16 @@ Error: This expression has type a/2 but an expression was expected of type Line 1, characters 4-5: 1 | a = c;; ^ -Error: This expression has type a but an expression was expected of type a/3 +Error: This expression has type a/1 but an expression was expected of type + a/2 Hint: The type a has been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of this type. Did you try to redefine them? Line 1, characters 4-5: 1 | b = c;; ^ -Error: This expression has type a but an expression was expected of type a/2 +Error: This expression has type a/1 but an expression was expected of type + a/2 Hint: The type a has been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of this type. Did you try to redefine them? diff --git a/testsuite/tests/tool-toplevel/redefinition_hints.ml b/testsuite/tests/tool-toplevel/redefinition_hints.ml index ee90af82dbf..2b691b7dd0c 100644 --- a/testsuite/tests/tool-toplevel/redefinition_hints.ml +++ b/testsuite/tests/tool-toplevel/redefinition_hints.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* This is a toplevel test to trigger toplevel specific hints *) diff --git a/testsuite/tests/tool-toplevel/show.ml b/testsuite/tests/tool-toplevel/show.ml index 28b59d9fdb1..35ad009167d 100644 --- a/testsuite/tests/tool-toplevel/show.ml +++ b/testsuite/tests/tool-toplevel/show.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* this is a set of tests to test the #show functionality diff --git a/testsuite/tests/tool-toplevel/show_short_paths.ml b/testsuite/tests/tool-toplevel/show_short_paths.ml index 000e7752347..1051a1839fe 100644 --- a/testsuite/tests/tool-toplevel/show_short_paths.ml +++ b/testsuite/tests/tool-toplevel/show_short_paths.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -short-paths " - * expect + flags = " -short-paths "; + expect; *) (* This is currently just a regression test for the bug diff --git a/testsuite/tests/tool-toplevel/strings.ml b/testsuite/tests/tool-toplevel/strings.ml index baf29871530..982f2dd80d2 100644 --- a/testsuite/tests/tool-toplevel/strings.ml +++ b/testsuite/tests/tool-toplevel/strings.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* Test the printing of strings in the terminal *) diff --git a/testsuite/tests/tool-toplevel/topeval.compilers.reference b/testsuite/tests/tool-toplevel/topeval.compilers.reference index 0a7e236f97d..7b15010ca85 100644 --- a/testsuite/tests/tool-toplevel/topeval.compilers.reference +++ b/testsuite/tests/tool-toplevel/topeval.compilers.reference @@ -7,4 +7,7 @@ val _bar : ('a, 'b) A.t -> 'a option = - : string = "" - : char = 'd' - : float = 42. +external foo : int -> int -> int = "%addint" +module S = String +val x : int = 42 diff --git a/testsuite/tests/tool-toplevel/topeval.ml b/testsuite/tests/tool-toplevel/topeval.ml index 802f04b5afc..a9888c62c51 100644 --- a/testsuite/tests/tool-toplevel/topeval.ml +++ b/testsuite/tests/tool-toplevel/topeval.ml @@ -1,6 +1,9 @@ (* TEST - * toplevel - * toplevel.opt + { + toplevel; + }{ + toplevel.opt; + } *) (* Various test-cases ensuring that the native and bytecode toplevels produce @@ -45,3 +48,20 @@ let List.(String.(_)) = 'd' let List.(_) : float = 42.0 ;; + +(* issue #12257: external or module alias followed by regular value triggers + an exception in ocamlnat *) +external foo : int -> int -> int = "%addint" +module S = String +let x = 42 +;; + +(* Check that frametables are correctly loaded by triggering GC *) +let () = + Gc.minor (); + let r = List.init 1000 Sys.opaque_identity in + Gc.minor (); + let _ = Sys.opaque_identity (List.init 1000 (fun _ -> "!")) in + List.iteri (fun i j -> assert (i = j)) r; + () +;; diff --git a/testsuite/tests/tool-toplevel/tracing.ml b/testsuite/tests/tool-toplevel/tracing.ml index 8a1221f63a5..f76e7026cf6 100644 --- a/testsuite/tests/tool-toplevel/tracing.ml +++ b/testsuite/tests/tool-toplevel/tracing.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) List.fold_left;; diff --git a/testsuite/tests/tool-toplevel/uncaught_exceptions.ml b/testsuite/tests/tool-toplevel/uncaught_exceptions.ml index 3544e1ddd00..634ef4a5b7a 100644 --- a/testsuite/tests/tool-toplevel/uncaught_exceptions.ml +++ b/testsuite/tests/tool-toplevel/uncaught_exceptions.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#8594 *) diff --git a/testsuite/tests/tool-toplevel/use_command.ml b/testsuite/tests/tool-toplevel/use_command.ml index 7bb9d8fa274..dbe28558a45 100644 --- a/testsuite/tests/tool-toplevel/use_command.ml +++ b/testsuite/tests/tool-toplevel/use_command.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Test a success case *) diff --git a/testsuite/tests/translprim/array_spec.heap.flat.reference b/testsuite/tests/translprim/array_spec.heap.flat.reference index 287506151b0..9593b4888bb 100644 --- a/testsuite/tests/translprim/array_spec.heap.flat.reference +++ b/testsuite/tests/translprim/array_spec.heap.flat.reference @@ -6,81 +6,86 @@ (seq (array.length[int] int_a) (array.length[float] float_a) (array.length[addr] addr_a) (function {nlocal = 0} a[genarray] : int (array.length[gen] a)) - (array.get[int] int_a 0) (array.get[float] float_a 0) - (array.get[addr] addr_a 0) - (function {nlocal = 0} a[genarray] (array.get[gen] a 0)) - (array.unsafe_get[int] int_a 0) (array.unsafe_get[float] float_a 0) - (array.unsafe_get[addr] addr_a 0) - (function {nlocal = 0} a[genarray] (array.unsafe_get[gen] a 0)) - (array.set[int] int_a 0 1) (array.set[float] float_a 0 1.) - (array.set[addr] addr_a 0 "a") - (function {nlocal = 0} a[genarray] x : int (array.set[gen] a 0 x)) - (array.unsafe_set[int] int_a 0 1) - (array.unsafe_set[float] float_a 0 1.) - (array.unsafe_set[addr] addr_a 0 "a") + (array.get[int indexed by int] int_a 0) + (array.get[float indexed by int] float_a 0) + (array.get[addr indexed by int] addr_a 0) + (function {nlocal = 0} a[genarray] (array.get[gen indexed by int] a 0)) + (array.unsafe_get[int indexed by int] int_a 0) + (array.unsafe_get[float indexed by int] float_a 0) + (array.unsafe_get[addr indexed by int] addr_a 0) + (function {nlocal = 0} a[genarray] + (array.unsafe_get[gen indexed by int] a 0)) + (array.set[int indexed by int] int_a 0 1) + (array.set[float indexed by int] float_a 0 1.) + (array.set[addr indexed by int] addr_a 0 "a") (function {nlocal = 0} a[genarray] x : int - (array.unsafe_set[gen] a 0 x)) + (array.set[gen indexed by int] a 0 x)) + (array.unsafe_set[int indexed by int] int_a 0 1) + (array.unsafe_set[float indexed by int] float_a 0 1.) + (array.unsafe_set[addr indexed by int] addr_a 0 "a") + (function {nlocal = 0} a[genarray] x : int + (array.unsafe_set[gen indexed by int] a 0 x)) (let (eta_gen_len = - (function {nlocal = 0} prim[genarray] stub + (function {nlocal = 0} prim[genarray] stub : int (array.length[gen] prim)) eta_gen_safe_get = (function {nlocal = 0} prim[genarray] prim[int] stub - (array.get[gen] prim prim)) + (array.get[gen indexed by int] prim prim)) eta_gen_unsafe_get = (function {nlocal = 0} prim[genarray] prim[int] stub - (array.unsafe_get[gen] prim prim)) + (array.unsafe_get[gen indexed by int] prim prim)) eta_gen_safe_set = - (function {nlocal = 0} prim[genarray] prim[int] prim stub - (array.set[gen] prim prim prim)) + (function {nlocal = 0} prim[genarray] prim[int] prim stub : int + (array.set[gen indexed by int] prim prim prim)) eta_gen_unsafe_set = - (function {nlocal = 0} prim[genarray] prim[int] prim stub - (array.unsafe_set[gen] prim prim prim)) + (function {nlocal = 0} prim[genarray] prim[int] prim stub : int + (array.unsafe_set[gen indexed by int] prim prim prim)) eta_int_len = - (function {nlocal = 0} prim[intarray] stub + (function {nlocal = 0} prim[intarray] stub : int (array.length[int] prim)) eta_int_safe_get = - (function {nlocal = 0} prim[intarray] prim[int] stub - (array.get[int] prim prim)) + (function {nlocal = 0} prim[intarray] prim[int] stub : int + (array.get[int indexed by int] prim prim)) eta_int_unsafe_get = - (function {nlocal = 0} prim[intarray] prim[int] stub - (array.unsafe_get[int] prim prim)) + (function {nlocal = 0} prim[intarray] prim[int] stub : int + (array.unsafe_get[int indexed by int] prim prim)) eta_int_safe_set = (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub - (array.set[int] prim prim prim)) + : int (array.set[int indexed by int] prim prim prim)) eta_int_unsafe_set = (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub - (array.unsafe_set[int] prim prim prim)) + : int (array.unsafe_set[int indexed by int] prim prim prim)) eta_float_len = - (function {nlocal = 0} prim[floatarray] stub + (function {nlocal = 0} prim[floatarray] stub : int (array.length[float] prim)) eta_float_safe_get = - (function {nlocal = 0} prim[floatarray] prim[int] stub - (array.get[float] prim prim)) + (function {nlocal = 0} prim[floatarray] prim[int] stub : float + (array.get[float indexed by int] prim prim)) eta_float_unsafe_get = - (function {nlocal = 0} prim[floatarray] prim[int] stub - (array.unsafe_get[float] prim prim)) + (function {nlocal = 0} prim[floatarray] prim[int] stub : float + (array.unsafe_get[float indexed by int] prim prim)) eta_float_safe_set = (function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub - (array.set[float] prim prim prim)) + : int (array.set[float indexed by int] prim prim prim)) eta_float_unsafe_set = (function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub - (array.unsafe_set[float] prim prim prim)) + : int (array.unsafe_set[float indexed by int] prim prim prim)) eta_addr_len = - (function {nlocal = 0} prim[addrarray] stub + (function {nlocal = 0} prim[addrarray] stub : int (array.length[addr] prim)) eta_addr_safe_get = (function {nlocal = 0} prim[addrarray] prim[int] stub - (array.get[addr] prim prim)) + (array.get[addr indexed by int] prim prim)) eta_addr_unsafe_get = (function {nlocal = 0} prim[addrarray] prim[int] stub - (array.unsafe_get[addr] prim prim)) + (array.unsafe_get[addr indexed by int] prim prim)) eta_addr_safe_set = - (function {nlocal = 0} prim[addrarray] prim[int] prim stub - (array.set[addr] prim prim prim)) + (function {nlocal = 0} prim[addrarray] prim[int] prim stub : int + (array.set[addr indexed by int] prim prim prim)) eta_addr_unsafe_set = - (function {nlocal = 0} prim[addrarray] prim[int] prim stub - (array.unsafe_set[addr] prim prim prim))) + (function {nlocal = 0} prim[addrarray] prim[int] prim stub : int + (array.unsafe_set[addr indexed by int] prim prim prim))) (makeblock 0 int_a float_a addr_a eta_gen_len eta_gen_safe_get eta_gen_unsafe_get eta_gen_safe_set eta_gen_unsafe_set eta_int_len eta_int_safe_get eta_int_unsafe_get eta_int_safe_set diff --git a/testsuite/tests/translprim/array_spec.ml b/testsuite/tests/translprim/array_spec.ml index ff4f9128f2f..bd6e2e20514 100644 --- a/testsuite/tests/translprim/array_spec.ml +++ b/testsuite/tests/translprim/array_spec.ml @@ -1,20 +1,23 @@ (* TEST - * setup-ocamlc.byte-build-env - ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" - *** flat-float-array - **** stack-allocation - ***** check-ocamlc.byte-output - compiler_reference = - "${test_source_directory}/array_spec.stack.flat.reference" - **** no-stack-allocation - ***** check-ocamlc.byte-output - compiler_reference = - "${test_source_directory}/array_spec.heap.flat.reference" - *** no-flat-float-array - **** check-ocamlc.byte-output - compiler_reference = - "${test_source_directory}/array_spec.compilers.no-flat.reference" + setup-ocamlc.byte-build-env; + flags = "-dlambda -dno-unique-ids"; + ocamlc.byte; + { + flat-float-array; + { + stack-allocation; + compiler_reference = "${test_source_directory}/array_spec.stack.flat.reference"; + check-ocamlc.byte-output; + }{ + no-stack-allocation; + compiler_reference = "${test_source_directory}/array_spec.heap.flat.reference"; + check-ocamlc.byte-output; + } + }{ + no-flat-float-array; + compiler_reference = "${test_source_directory}/array_spec.compilers.no-flat.reference"; + check-ocamlc.byte-output; + } *) external len : 'a array -> int = "%array_length" diff --git a/testsuite/tests/translprim/array_spec.stack.flat.reference b/testsuite/tests/translprim/array_spec.stack.flat.reference index 9e2b535ac06..5a20a245eac 100644 --- a/testsuite/tests/translprim/array_spec.stack.flat.reference +++ b/testsuite/tests/translprim/array_spec.stack.flat.reference @@ -6,92 +6,86 @@ (seq (array.length[int] int_a) (array.length[float] float_a) (array.length[addr] addr_a) (function {nlocal = 0} a[genarray] : int (array.length[gen] a)) - (array.get[int] int_a 0) (array.get[float] float_a 0) - (array.get[addr] addr_a 0) - (function {nlocal = 0} a[genarray] (array.get[gen] a 0)) - (array.unsafe_get[int] int_a 0) (array.unsafe_get[float] float_a 0) - (array.unsafe_get[addr] addr_a 0) - (function {nlocal = 0} a[genarray] (array.unsafe_get[gen] a 0)) - (array.set[int] int_a 0 1) (array.set[float] float_a 0 1.) - (array.set[addr] addr_a 0 "a") - (function {nlocal = 2} a[genarray] x : int (array.set[gen] a 0 x)) - (array.unsafe_set[int] int_a 0 1) - (array.unsafe_set[float] float_a 0 1.) - (array.unsafe_set[addr] addr_a 0 "a") + (array.get[int indexed by int] int_a 0) + (array.get[float indexed by int] float_a 0) + (array.get[addr indexed by int] addr_a 0) + (function {nlocal = 0} a[genarray] (array.get[gen indexed by int] a 0)) + (array.unsafe_get[int indexed by int] int_a 0) + (array.unsafe_get[float indexed by int] float_a 0) + (array.unsafe_get[addr indexed by int] addr_a 0) + (function {nlocal = 0} a[genarray] + (array.unsafe_get[gen indexed by int] a 0)) + (array.set[int indexed by int] int_a 0 1) + (array.set[float indexed by int] float_a 0 1.) + (array.set[addr indexed by int] addr_a 0 "a") (function {nlocal = 2} a[genarray] x : int - (array.unsafe_set[gen] a 0 x)) + (array.set[gen indexed by int] a 0 x)) + (array.unsafe_set[int indexed by int] int_a 0 1) + (array.unsafe_set[float indexed by int] float_a 0 1.) + (array.unsafe_set[addr indexed by int] addr_a 0 "a") + (function {nlocal = 2} a[genarray] x : int + (array.unsafe_set[gen indexed by int] a 0 x)) (let (eta_gen_len = - (function {nlocal = 0} prim[genarray] stub - ignore assert all zero_alloc : int (array.length[gen] prim)) + (function {nlocal = 0} prim[genarray] stub : int + (array.length[gen] prim)) eta_gen_safe_get = (function {nlocal = 0} prim[genarray] prim[int] stub - ignore assert all zero_alloc (array.get[gen] prim prim)) + (array.get[gen indexed by int] prim prim)) eta_gen_unsafe_get = (function {nlocal = 0} prim[genarray] prim[int] stub - ignore assert all zero_alloc (array.unsafe_get[gen] prim prim)) + (array.unsafe_get[gen indexed by int] prim prim)) eta_gen_safe_set = - (function {nlocal = 0} prim[genarray] prim[int] prim stub - ignore assert all zero_alloc : int - (array.set[gen] prim prim prim)) + (function {nlocal = 0} prim[genarray] prim[int] prim stub : int + (array.set[gen indexed by int] prim prim prim)) eta_gen_unsafe_set = - (function {nlocal = 0} prim[genarray] prim[int] prim stub - ignore assert all zero_alloc : int - (array.unsafe_set[gen] prim prim prim)) + (function {nlocal = 0} prim[genarray] prim[int] prim stub : int + (array.unsafe_set[gen indexed by int] prim prim prim)) eta_int_len = - (function {nlocal = 0} prim[intarray] stub - ignore assert all zero_alloc : int (array.length[int] prim)) + (function {nlocal = 0} prim[intarray] stub : int + (array.length[int] prim)) eta_int_safe_get = - (function {nlocal = 0} prim[intarray] prim[int] stub - ignore assert all zero_alloc : int (array.get[int] prim prim)) + (function {nlocal = 0} prim[intarray] prim[int] stub : int + (array.get[int indexed by int] prim prim)) eta_int_unsafe_get = - (function {nlocal = 0} prim[intarray] prim[int] stub - ignore assert all zero_alloc : int - (array.unsafe_get[int] prim prim)) + (function {nlocal = 0} prim[intarray] prim[int] stub : int + (array.unsafe_get[int indexed by int] prim prim)) eta_int_safe_set = (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub - ignore assert all zero_alloc : int - (array.set[int] prim prim prim)) + : int (array.set[int indexed by int] prim prim prim)) eta_int_unsafe_set = (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub - ignore assert all zero_alloc : int - (array.unsafe_set[int] prim prim prim)) + : int (array.unsafe_set[int indexed by int] prim prim prim)) eta_float_len = - (function {nlocal = 0} prim[floatarray] stub - ignore assert all zero_alloc : int (array.length[float] prim)) + (function {nlocal = 0} prim[floatarray] stub : int + (array.length[float] prim)) eta_float_safe_get = - (function {nlocal = 0} prim[floatarray] prim[int] stub - ignore assert all zero_alloc : float - (array.get[float] prim prim)) + (function {nlocal = 0} prim[floatarray] prim[int] stub : float + (array.get[float indexed by int] prim prim)) eta_float_unsafe_get = - (function {nlocal = 0} prim[floatarray] prim[int] stub - ignore assert all zero_alloc : float - (array.unsafe_get[float] prim prim)) + (function {nlocal = 0} prim[floatarray] prim[int] stub : float + (array.unsafe_get[float indexed by int] prim prim)) eta_float_safe_set = (function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub - ignore assert all zero_alloc : int - (array.set[float] prim prim prim)) + : int (array.set[float indexed by int] prim prim prim)) eta_float_unsafe_set = (function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub - ignore assert all zero_alloc : int - (array.unsafe_set[float] prim prim prim)) + : int (array.unsafe_set[float indexed by int] prim prim prim)) eta_addr_len = - (function {nlocal = 0} prim[addrarray] stub - ignore assert all zero_alloc : int (array.length[addr] prim)) + (function {nlocal = 0} prim[addrarray] stub : int + (array.length[addr] prim)) eta_addr_safe_get = (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc (array.get[addr] prim prim)) + (array.get[addr indexed by int] prim prim)) eta_addr_unsafe_get = (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc (array.unsafe_get[addr] prim prim)) + (array.unsafe_get[addr indexed by int] prim prim)) eta_addr_safe_set = - (function {nlocal = 0} prim[addrarray] prim[int] prim stub - ignore assert all zero_alloc : int - (array.set[addr] prim prim prim)) + (function {nlocal = 0} prim[addrarray] prim[int] prim stub : int + (array.set[addr indexed by int] prim prim prim)) eta_addr_unsafe_set = - (function {nlocal = 0} prim[addrarray] prim[int] prim stub - ignore assert all zero_alloc : int - (array.unsafe_set[addr] prim prim prim))) + (function {nlocal = 0} prim[addrarray] prim[int] prim stub : int + (array.unsafe_set[addr indexed by int] prim prim prim))) (makeblock 0 int_a float_a addr_a eta_gen_len eta_gen_safe_get eta_gen_unsafe_get eta_gen_safe_set eta_gen_unsafe_set eta_int_len eta_int_safe_get eta_int_unsafe_get eta_int_safe_set diff --git a/testsuite/tests/translprim/comparison_table.heap.reference b/testsuite/tests/translprim/comparison_table.heap.reference index e8b3f67924a..0947a36d4d5 100644 --- a/testsuite/tests/translprim/comparison_table.heap.reference +++ b/testsuite/tests/translprim/comparison_table.heap.reference @@ -7,7 +7,8 @@ intlike_cmp = (function {nlocal = 0} x[int] y[int] : int (compare_ints x y)) float_cmp = - (function {nlocal = 0} x[float] y[float] : int (compare_floats x y)) + (function {nlocal = 0} x[float] y[float] : int + (compare_floats float x y)) string_cmp = (function {nlocal = 0} x y : int (caml_string_compare x y)) int32_cmp = (function {nlocal = 0} x[int32] y[int32] : int @@ -22,7 +23,8 @@ int_eq = (function {nlocal = 0} x[int] y[int] : int (== x y)) bool_eq = (function {nlocal = 0} x[int] y[int] : int (== x y)) intlike_eq = (function {nlocal = 0} x[int] y[int] : int (== x y)) - float_eq = (function {nlocal = 0} x[float] y[float] : int (==. x y)) + float_eq = + (function {nlocal = 0} x[float] y[float] : int (Float.== x y)) string_eq = (function {nlocal = 0} x y : int (caml_string_equal x y)) int32_eq = (function {nlocal = 0} x[int32] y[int32] : int (Int32.== x y)) @@ -35,7 +37,8 @@ int_ne = (function {nlocal = 0} x[int] y[int] : int (!= x y)) bool_ne = (function {nlocal = 0} x[int] y[int] : int (!= x y)) intlike_ne = (function {nlocal = 0} x[int] y[int] : int (!= x y)) - float_ne = (function {nlocal = 0} x[float] y[float] : int (!=. x y)) + float_ne = + (function {nlocal = 0} x[float] y[float] : int (Float.!= x y)) string_ne = (function {nlocal = 0} x y : int (caml_string_notequal x y)) int32_ne = (function {nlocal = 0} x[int32] y[int32] : int (Int32.!= x y)) @@ -48,7 +51,7 @@ int_lt = (function {nlocal = 0} x[int] y[int] : int (< x y)) bool_lt = (function {nlocal = 0} x[int] y[int] : int (< x y)) intlike_lt = (function {nlocal = 0} x[int] y[int] : int (< x y)) - float_lt = (function {nlocal = 0} x[float] y[float] : int (<. x y)) + float_lt = (function {nlocal = 0} x[float] y[float] : int (Float.< x y)) string_lt = (function {nlocal = 0} x y : int (caml_string_lessthan x y)) int32_lt = (function {nlocal = 0} x[int32] y[int32] : int (Int32.< x y)) int64_lt = (function {nlocal = 0} x[int64] y[int64] : int (Int64.< x y)) @@ -59,7 +62,7 @@ int_gt = (function {nlocal = 0} x[int] y[int] : int (> x y)) bool_gt = (function {nlocal = 0} x[int] y[int] : int (> x y)) intlike_gt = (function {nlocal = 0} x[int] y[int] : int (> x y)) - float_gt = (function {nlocal = 0} x[float] y[float] : int (>. x y)) + float_gt = (function {nlocal = 0} x[float] y[float] : int (Float.> x y)) string_gt = (function {nlocal = 0} x y : int (caml_string_greaterthan x y)) int32_gt = (function {nlocal = 0} x[int32] y[int32] : int (Int32.> x y)) @@ -71,7 +74,8 @@ int_le = (function {nlocal = 0} x[int] y[int] : int (<= x y)) bool_le = (function {nlocal = 0} x[int] y[int] : int (<= x y)) intlike_le = (function {nlocal = 0} x[int] y[int] : int (<= x y)) - float_le = (function {nlocal = 0} x[float] y[float] : int (<=. x y)) + float_le = + (function {nlocal = 0} x[float] y[float] : int (Float.<= x y)) string_le = (function {nlocal = 0} x y : int (caml_string_lessequal x y)) int32_le = @@ -85,7 +89,8 @@ int_ge = (function {nlocal = 0} x[int] y[int] : int (>= x y)) bool_ge = (function {nlocal = 0} x[int] y[int] : int (>= x y)) intlike_ge = (function {nlocal = 0} x[int] y[int] : int (>= x y)) - float_ge = (function {nlocal = 0} x[float] y[float] : int (>=. x y)) + float_ge = + (function {nlocal = 0} x[float] y[float] : int (Float.>= x y)) string_ge = (function {nlocal = 0} x y : int (caml_string_greaterequal x y)) int32_ge = @@ -96,160 +101,171 @@ (function {nlocal = 0} x[nativeint] y[nativeint] : int (Nativeint.>= x y)) eta_gen_cmp = - (function {nlocal = 0} prim prim stub (caml_compare prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_compare prim prim)) eta_int_cmp = - (function {nlocal = 0} prim[int] prim[int] stub + (function {nlocal = 0} prim[int] prim[int] stub : int (compare_ints prim prim)) eta_bool_cmp = - (function {nlocal = 0} prim[int] prim[int] stub + (function {nlocal = 0} prim[int] prim[int] stub : int (compare_ints prim prim)) eta_intlike_cmp = - (function {nlocal = 0} prim[int] prim[int] stub + (function {nlocal = 0} prim[int] prim[int] stub : int (compare_ints prim prim)) eta_float_cmp = - (function {nlocal = 0} prim[float] prim[float] stub - (compare_floats prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (compare_floats float prim prim)) eta_string_cmp = - (function {nlocal = 0} prim prim stub (caml_string_compare prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_compare prim prim)) eta_int32_cmp = - (function {nlocal = 0} prim[int32] prim[int32] stub + (function {nlocal = 0} prim[int32] prim[int32] stub : int (compare_bints int32 prim prim)) eta_int64_cmp = - (function {nlocal = 0} prim[int64] prim[int64] stub + (function {nlocal = 0} prim[int64] prim[int64] stub : int (compare_bints int64 prim prim)) eta_nativeint_cmp = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (compare_bints nativeint prim prim)) eta_gen_eq = - (function {nlocal = 0} prim prim stub (caml_equal prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_equal prim prim)) eta_int_eq = - (function {nlocal = 0} prim[int] prim[int] stub (== prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (== prim prim)) eta_bool_eq = - (function {nlocal = 0} prim[int] prim[int] stub (== prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (== prim prim)) eta_intlike_eq = - (function {nlocal = 0} prim[int] prim[int] stub (== prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (== prim prim)) eta_float_eq = - (function {nlocal = 0} prim[float] prim[float] stub (==. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.== prim prim)) eta_string_eq = - (function {nlocal = 0} prim prim stub (caml_string_equal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_equal prim prim)) eta_int32_eq = - (function {nlocal = 0} prim[int32] prim[int32] stub + (function {nlocal = 0} prim[int32] prim[int32] stub : int (Int32.== prim prim)) eta_int64_eq = - (function {nlocal = 0} prim[int64] prim[int64] stub + (function {nlocal = 0} prim[int64] prim[int64] stub : int (Int64.== prim prim)) eta_nativeint_eq = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (Nativeint.== prim prim)) eta_gen_ne = - (function {nlocal = 0} prim prim stub (caml_notequal prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_notequal prim prim)) eta_int_ne = - (function {nlocal = 0} prim[int] prim[int] stub (!= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (!= prim prim)) eta_bool_ne = - (function {nlocal = 0} prim[int] prim[int] stub (!= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (!= prim prim)) eta_intlike_ne = - (function {nlocal = 0} prim[int] prim[int] stub (!= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (!= prim prim)) eta_float_ne = - (function {nlocal = 0} prim[float] prim[float] stub (!=. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.!= prim prim)) eta_string_ne = - (function {nlocal = 0} prim prim stub + (function {nlocal = 0} prim prim stub : int (caml_string_notequal prim prim)) eta_int32_ne = - (function {nlocal = 0} prim[int32] prim[int32] stub + (function {nlocal = 0} prim[int32] prim[int32] stub : int (Int32.!= prim prim)) eta_int64_ne = - (function {nlocal = 0} prim[int64] prim[int64] stub + (function {nlocal = 0} prim[int64] prim[int64] stub : int (Int64.!= prim prim)) eta_nativeint_ne = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (Nativeint.!= prim prim)) eta_gen_lt = - (function {nlocal = 0} prim prim stub (caml_lessthan prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_lessthan prim prim)) eta_int_lt = - (function {nlocal = 0} prim[int] prim[int] stub (< prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (< prim prim)) eta_bool_lt = - (function {nlocal = 0} prim[int] prim[int] stub (< prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (< prim prim)) eta_intlike_lt = - (function {nlocal = 0} prim[int] prim[int] stub (< prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (< prim prim)) eta_float_lt = - (function {nlocal = 0} prim[float] prim[float] stub (<. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.< prim prim)) eta_string_lt = - (function {nlocal = 0} prim prim stub + (function {nlocal = 0} prim prim stub : int (caml_string_lessthan prim prim)) eta_int32_lt = - (function {nlocal = 0} prim[int32] prim[int32] stub + (function {nlocal = 0} prim[int32] prim[int32] stub : int (Int32.< prim prim)) eta_int64_lt = - (function {nlocal = 0} prim[int64] prim[int64] stub + (function {nlocal = 0} prim[int64] prim[int64] stub : int (Int64.< prim prim)) eta_nativeint_lt = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (Nativeint.< prim prim)) eta_gen_gt = - (function {nlocal = 0} prim prim stub (caml_greaterthan prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_greaterthan prim prim)) eta_int_gt = - (function {nlocal = 0} prim[int] prim[int] stub (> prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (> prim prim)) eta_bool_gt = - (function {nlocal = 0} prim[int] prim[int] stub (> prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (> prim prim)) eta_intlike_gt = - (function {nlocal = 0} prim[int] prim[int] stub (> prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (> prim prim)) eta_float_gt = - (function {nlocal = 0} prim[float] prim[float] stub (>. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.> prim prim)) eta_string_gt = - (function {nlocal = 0} prim prim stub + (function {nlocal = 0} prim prim stub : int (caml_string_greaterthan prim prim)) eta_int32_gt = - (function {nlocal = 0} prim[int32] prim[int32] stub + (function {nlocal = 0} prim[int32] prim[int32] stub : int (Int32.> prim prim)) eta_int64_gt = - (function {nlocal = 0} prim[int64] prim[int64] stub + (function {nlocal = 0} prim[int64] prim[int64] stub : int (Int64.> prim prim)) eta_nativeint_gt = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (Nativeint.> prim prim)) eta_gen_le = - (function {nlocal = 0} prim prim stub (caml_lessequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_lessequal prim prim)) eta_int_le = - (function {nlocal = 0} prim[int] prim[int] stub (<= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (<= prim prim)) eta_bool_le = - (function {nlocal = 0} prim[int] prim[int] stub (<= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (<= prim prim)) eta_intlike_le = - (function {nlocal = 0} prim[int] prim[int] stub (<= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (<= prim prim)) eta_float_le = - (function {nlocal = 0} prim[float] prim[float] stub (<=. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.<= prim prim)) eta_string_le = - (function {nlocal = 0} prim prim stub + (function {nlocal = 0} prim prim stub : int (caml_string_lessequal prim prim)) eta_int32_le = - (function {nlocal = 0} prim[int32] prim[int32] stub + (function {nlocal = 0} prim[int32] prim[int32] stub : int (Int32.<= prim prim)) eta_int64_le = - (function {nlocal = 0} prim[int64] prim[int64] stub + (function {nlocal = 0} prim[int64] prim[int64] stub : int (Int64.<= prim prim)) eta_nativeint_le = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (Nativeint.<= prim prim)) eta_gen_ge = - (function {nlocal = 0} prim prim stub (caml_greaterequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_greaterequal prim prim)) eta_int_ge = - (function {nlocal = 0} prim[int] prim[int] stub (>= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (>= prim prim)) eta_bool_ge = - (function {nlocal = 0} prim[int] prim[int] stub (>= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (>= prim prim)) eta_intlike_ge = - (function {nlocal = 0} prim[int] prim[int] stub (>= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (>= prim prim)) eta_float_ge = - (function {nlocal = 0} prim[float] prim[float] stub (>=. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.>= prim prim)) eta_string_ge = - (function {nlocal = 0} prim prim stub + (function {nlocal = 0} prim prim stub : int (caml_string_greaterequal prim prim)) eta_int32_ge = - (function {nlocal = 0} prim[int32] prim[int32] stub + (function {nlocal = 0} prim[int32] prim[int32] stub : int (Int32.>= prim prim)) eta_int64_ge = - (function {nlocal = 0} prim[int64] prim[int64] stub + (function {nlocal = 0} prim[int64] prim[int64] stub : int (Int64.>= prim prim)) eta_nativeint_ge = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (Nativeint.>= prim prim)) int_vec =[(consts (0)) (non_consts ([0: *, [(consts (0)) (non_consts ([0: *, *]))]]))] @@ -294,9 +310,9 @@ (non_consts ( [0: *, *]))] (apply f - (field 0 + (field_imm 0 param) - (field 1 + (field_imm 1 param))) map = (function @@ -315,7 +331,7 @@ (non_consts ( [0: *, *]))]]))] (apply - (field 18 + (field_imm 19 (global Stdlib__List!)) (apply uncurry @@ -496,7 +512,7 @@ (uncurry = (function {nlocal = 0} f param[(consts ()) (non_consts ([0: *, *]))] - (apply f (field 0 param) (field 1 param))) + (apply f (field_imm 0 param) (field_imm 1 param))) map = (function {nlocal = 0} f l[(consts (0)) @@ -505,7 +521,7 @@ [(consts (0)) (non_consts ([0: *, [(consts (0)) (non_consts ([0: *, *]))]]))] - (apply (field 18 (global Stdlib__List!)) + (apply (field_imm 19 (global Stdlib__List!)) (apply uncurry f) l))) (makeblock 0 ([(consts ()) (non_consts ([0: diff --git a/testsuite/tests/translprim/comparison_table.ml b/testsuite/tests/translprim/comparison_table.ml index 63a2e648d0d..ad1ed588aa0 100644 --- a/testsuite/tests/translprim/comparison_table.ml +++ b/testsuite/tests/translprim/comparison_table.ml @@ -1,16 +1,16 @@ (* TEST - * setup-ocamlc.byte-build-env - ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" - *** stack-allocation - **** check-ocamlc.byte-output - compiler_reference = - "${test_source_directory}/comparison_table.stack.reference" - *** no-stack-allocation - **** check-ocamlc.byte-output - compiler_reference = - "${test_source_directory}/comparison_table.heap.reference" - + setup-ocamlc.byte-build-env; + flags = "-dlambda -dno-unique-ids"; + ocamlc.byte; + { + stack-allocation; + compiler_reference = "${test_source_directory}/comparison_table.stack.reference"; + check-ocamlc.byte-output; + }{ + no-stack-allocation; + compiler_reference = "${test_source_directory}/comparison_table.heap.reference"; + check-ocamlc.byte-output; + } *) external cmp : 'a -> 'a -> int = "%compare";; diff --git a/testsuite/tests/translprim/comparison_table.stack.reference b/testsuite/tests/translprim/comparison_table.stack.reference index c4a57b9796b..49ad5b8dbfd 100644 --- a/testsuite/tests/translprim/comparison_table.stack.reference +++ b/testsuite/tests/translprim/comparison_table.stack.reference @@ -7,7 +7,8 @@ intlike_cmp = (function {nlocal = 0} x[int] y[int] : int (compare_ints x y)) float_cmp = - (function {nlocal = 0} x[float] y[float] : int (compare_floats x y)) + (function {nlocal = 0} x[float] y[float] : int + (compare_floats float x y)) string_cmp = (function {nlocal = 0} x y : int (caml_string_compare x y)) int32_cmp = (function {nlocal = 0} x[int32] y[int32] : int @@ -22,7 +23,8 @@ int_eq = (function {nlocal = 0} x[int] y[int] : int (== x y)) bool_eq = (function {nlocal = 0} x[int] y[int] : int (== x y)) intlike_eq = (function {nlocal = 0} x[int] y[int] : int (== x y)) - float_eq = (function {nlocal = 0} x[float] y[float] : int (==. x y)) + float_eq = + (function {nlocal = 0} x[float] y[float] : int (Float.== x y)) string_eq = (function {nlocal = 0} x y : int (caml_string_equal x y)) int32_eq = (function {nlocal = 0} x[int32] y[int32] : int (Int32.== x y)) @@ -35,7 +37,8 @@ int_ne = (function {nlocal = 0} x[int] y[int] : int (!= x y)) bool_ne = (function {nlocal = 0} x[int] y[int] : int (!= x y)) intlike_ne = (function {nlocal = 0} x[int] y[int] : int (!= x y)) - float_ne = (function {nlocal = 0} x[float] y[float] : int (!=. x y)) + float_ne = + (function {nlocal = 0} x[float] y[float] : int (Float.!= x y)) string_ne = (function {nlocal = 0} x y : int (caml_string_notequal x y)) int32_ne = (function {nlocal = 0} x[int32] y[int32] : int (Int32.!= x y)) @@ -48,7 +51,7 @@ int_lt = (function {nlocal = 0} x[int] y[int] : int (< x y)) bool_lt = (function {nlocal = 0} x[int] y[int] : int (< x y)) intlike_lt = (function {nlocal = 0} x[int] y[int] : int (< x y)) - float_lt = (function {nlocal = 0} x[float] y[float] : int (<. x y)) + float_lt = (function {nlocal = 0} x[float] y[float] : int (Float.< x y)) string_lt = (function {nlocal = 0} x y : int (caml_string_lessthan x y)) int32_lt = (function {nlocal = 0} x[int32] y[int32] : int (Int32.< x y)) int64_lt = (function {nlocal = 0} x[int64] y[int64] : int (Int64.< x y)) @@ -59,7 +62,7 @@ int_gt = (function {nlocal = 0} x[int] y[int] : int (> x y)) bool_gt = (function {nlocal = 0} x[int] y[int] : int (> x y)) intlike_gt = (function {nlocal = 0} x[int] y[int] : int (> x y)) - float_gt = (function {nlocal = 0} x[float] y[float] : int (>. x y)) + float_gt = (function {nlocal = 0} x[float] y[float] : int (Float.> x y)) string_gt = (function {nlocal = 0} x y : int (caml_string_greaterthan x y)) int32_gt = (function {nlocal = 0} x[int32] y[int32] : int (Int32.> x y)) @@ -71,7 +74,8 @@ int_le = (function {nlocal = 0} x[int] y[int] : int (<= x y)) bool_le = (function {nlocal = 0} x[int] y[int] : int (<= x y)) intlike_le = (function {nlocal = 0} x[int] y[int] : int (<= x y)) - float_le = (function {nlocal = 0} x[float] y[float] : int (<=. x y)) + float_le = + (function {nlocal = 0} x[float] y[float] : int (Float.<= x y)) string_le = (function {nlocal = 0} x y : int (caml_string_lessequal x y)) int32_le = @@ -85,7 +89,8 @@ int_ge = (function {nlocal = 0} x[int] y[int] : int (>= x y)) bool_ge = (function {nlocal = 0} x[int] y[int] : int (>= x y)) intlike_ge = (function {nlocal = 0} x[int] y[int] : int (>= x y)) - float_ge = (function {nlocal = 0} x[float] y[float] : int (>=. x y)) + float_ge = + (function {nlocal = 0} x[float] y[float] : int (Float.>= x y)) string_ge = (function {nlocal = 0} x y : int (caml_string_greaterequal x y)) int32_ge = @@ -96,195 +101,172 @@ (function {nlocal = 0} x[nativeint] y[nativeint] : int (Nativeint.>= x y)) eta_gen_cmp = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_compare prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_compare prim prim)) eta_int_cmp = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (compare_ints prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int + (compare_ints prim prim)) eta_bool_cmp = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (compare_ints prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int + (compare_ints prim prim)) eta_intlike_cmp = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (compare_ints prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int + (compare_ints prim prim)) eta_float_cmp = - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (compare_floats prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (compare_floats float prim prim)) eta_string_cmp = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_compare prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_compare prim prim)) eta_int32_cmp = - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (compare_bints int32 prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (compare_bints int32 prim prim)) eta_int64_cmp = - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (compare_bints int64 prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (compare_bints int64 prim prim)) eta_nativeint_cmp = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (compare_bints nativeint prim prim)) eta_gen_eq = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_equal prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_equal prim prim)) eta_int_eq = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (== prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (== prim prim)) eta_bool_eq = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (== prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (== prim prim)) eta_intlike_eq = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (== prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (== prim prim)) eta_float_eq = - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (==. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.== prim prim)) eta_string_eq = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_equal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_equal prim prim)) eta_int32_eq = - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.== prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.== prim prim)) eta_int64_eq = - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.== prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.== prim prim)) eta_nativeint_eq = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.== prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.== prim prim)) eta_gen_ne = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_notequal prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_notequal prim prim)) eta_int_ne = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (!= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (!= prim prim)) eta_bool_ne = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (!= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (!= prim prim)) eta_intlike_ne = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (!= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (!= prim prim)) eta_float_ne = - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (!=. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.!= prim prim)) eta_string_ne = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_notequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_notequal prim prim)) eta_int32_ne = - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.!= prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.!= prim prim)) eta_int64_ne = - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.!= prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.!= prim prim)) eta_nativeint_ne = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.!= prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.!= prim prim)) eta_gen_lt = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_lessthan prim prim)) + (function {nlocal = 0} prim prim stub : int (caml_lessthan prim prim)) eta_int_lt = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (< prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (< prim prim)) eta_bool_lt = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (< prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (< prim prim)) eta_intlike_lt = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (< prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (< prim prim)) eta_float_lt = - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (<. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.< prim prim)) eta_string_lt = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_lessthan prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_lessthan prim prim)) eta_int32_lt = - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.< prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.< prim prim)) eta_int64_lt = - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.< prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.< prim prim)) eta_nativeint_lt = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.< prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.< prim prim)) eta_gen_gt = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_greaterthan prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_greaterthan prim prim)) eta_int_gt = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (> prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (> prim prim)) eta_bool_gt = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (> prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (> prim prim)) eta_intlike_gt = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (> prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (> prim prim)) eta_float_gt = - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (>. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.> prim prim)) eta_string_gt = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_greaterthan prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_greaterthan prim prim)) eta_int32_gt = - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.> prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.> prim prim)) eta_int64_gt = - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.> prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.> prim prim)) eta_nativeint_gt = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.> prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.> prim prim)) eta_gen_le = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_lessequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_lessequal prim prim)) eta_int_le = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (<= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (<= prim prim)) eta_bool_le = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (<= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (<= prim prim)) eta_intlike_le = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (<= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (<= prim prim)) eta_float_le = - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (<=. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.<= prim prim)) eta_string_le = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_lessequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_lessequal prim prim)) eta_int32_le = - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.<= prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.<= prim prim)) eta_int64_le = - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.<= prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.<= prim prim)) eta_nativeint_le = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.<= prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.<= prim prim)) eta_gen_ge = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_greaterequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_greaterequal prim prim)) eta_int_ge = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (>= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (>= prim prim)) eta_bool_ge = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (>= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (>= prim prim)) eta_intlike_ge = - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (>= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (>= prim prim)) eta_float_ge = - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (>=. prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.>= prim prim)) eta_string_ge = - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_greaterequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_greaterequal prim prim)) eta_int32_ge = - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.>= prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.>= prim prim)) eta_int64_ge = - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.>= prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.>= prim prim)) eta_nativeint_ge = - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.>= prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.>= prim prim)) int_vec =[(consts (0)) (non_consts ([0: *, [(consts (0)) (non_consts ([0: *, *]))]]))] [0: [0: 1 1] [0: [0: 1 2] [0: [0: 2 1] 0]]] diff --git a/testsuite/tests/translprim/locs.ml b/testsuite/tests/translprim/locs.ml index 79e4646875c..b734f735054 100644 --- a/testsuite/tests/translprim/locs.ml +++ b/testsuite/tests/translprim/locs.ml @@ -1,4 +1,4 @@ -(* TEST *) +(* TEST_BELOW*) let print_loc loc = print_endline loc @@ -159,3 +159,6 @@ let () = (new klass)#meth (); inline_object (); bang () + +(* TEST +*) diff --git a/testsuite/tests/translprim/module_coercion.compilers.flat.reference b/testsuite/tests/translprim/module_coercion.compilers.flat.reference index cc3d191f07d..7eb02b2ffa2 100644 --- a/testsuite/tests/translprim/module_coercion.compilers.flat.reference +++ b/testsuite/tests/translprim/module_coercion.compilers.flat.reference @@ -2,170 +2,146 @@ (let (M = (makeblock 0)) (makeblock 0 M (makeblock 0 - (function {nlocal = 0} prim[intarray] stub - ignore assert all zero_alloc : int (array.length[int] prim)) - (function {nlocal = 0} prim[intarray] prim[int] stub - ignore assert all zero_alloc : int (array.get[int] prim prim)) - (function {nlocal = 0} prim[intarray] prim[int] stub - ignore assert all zero_alloc : int - (array.unsafe_get[int] prim prim)) - (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub - ignore assert all zero_alloc : int (array.set[int] prim prim prim)) - (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub - ignore assert all zero_alloc : int - (array.unsafe_set[int] prim prim prim)) - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (compare_ints prim prim)) - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (== prim prim)) - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (!= prim prim)) - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (< prim prim)) - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (> prim prim)) - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (<= prim prim)) - (function {nlocal = 0} prim[int] prim[int] stub - ignore assert all zero_alloc : int (>= prim prim))) + (function {nlocal = 0} prim[intarray] stub : int + (array.length[int] prim)) + (function {nlocal = 0} prim[intarray] prim[int] stub : int + (array.get[int indexed by int] prim prim)) + (function {nlocal = 0} prim[intarray] prim[int] stub : int + (array.unsafe_get[int indexed by int] prim prim)) + (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub : int + (array.set[int indexed by int] prim prim prim)) + (function {nlocal = 0} prim[intarray] prim[int] prim[int] stub : int + (array.unsafe_set[int indexed by int] prim prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int + (compare_ints prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (== prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (!= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (< prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (> prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (<= prim prim)) + (function {nlocal = 0} prim[int] prim[int] stub : int (>= prim prim))) (makeblock 0 - (function {nlocal = 0} prim[floatarray] stub - ignore assert all zero_alloc : int (array.length[float] prim)) - (function {nlocal = 0} prim[floatarray] prim[int] stub - ignore assert all zero_alloc : float (array.get[float] prim prim)) - (function {nlocal = 0} prim[floatarray] prim[int] stub - ignore assert all zero_alloc : float - (array.unsafe_get[float] prim prim)) + (function {nlocal = 0} prim[floatarray] stub : int + (array.length[float] prim)) + (function {nlocal = 0} prim[floatarray] prim[int] stub : float + (array.get[float indexed by int] prim prim)) + (function {nlocal = 0} prim[floatarray] prim[int] stub : float + (array.unsafe_get[float indexed by int] prim prim)) (function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub - ignore assert all zero_alloc : int - (array.set[float] prim prim prim)) + : int (array.set[float indexed by int] prim prim prim)) (function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub - ignore assert all zero_alloc : int - (array.unsafe_set[float] prim prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (compare_floats prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (==. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (!=. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (<. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (>. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (<=. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub - ignore assert all zero_alloc : int (>=. prim prim))) + : int (array.unsafe_set[float indexed by int] prim prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (compare_floats float prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.== prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.!= prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.< prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.> prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.<= prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub : int + (Float.>= prim prim))) (makeblock 0 - (function {nlocal = 0} prim[addrarray] stub - ignore assert all zero_alloc : int (array.length[addr] prim)) + (function {nlocal = 0} prim[addrarray] stub : int + (array.length[addr] prim)) (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc (array.get[addr] prim prim)) + (array.get[addr indexed by int] prim prim)) (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc (array.unsafe_get[addr] prim prim)) - (function {nlocal = 0} prim[addrarray] prim[int] prim stub - ignore assert all zero_alloc : int - (array.set[addr] prim prim prim)) - (function {nlocal = 0} prim[addrarray] prim[int] prim stub - ignore assert all zero_alloc : int - (array.unsafe_set[addr] prim prim prim)) - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_compare prim prim)) - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_equal prim prim)) - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_notequal prim prim)) - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_lessthan prim prim)) - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_greaterthan prim prim)) - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_lessequal prim prim)) - (function {nlocal = 0} prim prim stub ignore assert all zero_alloc - : int (caml_string_greaterequal prim prim))) + (array.unsafe_get[addr indexed by int] prim prim)) + (function {nlocal = 0} prim[addrarray] prim[int] prim stub : int + (array.set[addr indexed by int] prim prim prim)) + (function {nlocal = 0} prim[addrarray] prim[int] prim stub : int + (array.unsafe_set[addr indexed by int] prim prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_compare prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_equal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_notequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_lessthan prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_greaterthan prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_lessequal prim prim)) + (function {nlocal = 0} prim prim stub : int + (caml_string_greaterequal prim prim))) (makeblock 0 - (function {nlocal = 0} prim[addrarray] stub - ignore assert all zero_alloc : int (array.length[addr] prim)) - (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc : int32 (array.get[addr] prim prim)) - (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc : int32 - (array.unsafe_get[addr] prim prim)) + (function {nlocal = 0} prim[addrarray] stub : int + (array.length[addr] prim)) + (function {nlocal = 0} prim[addrarray] prim[int] stub : int32 + (array.get[addr indexed by int] prim prim)) + (function {nlocal = 0} prim[addrarray] prim[int] stub : int32 + (array.unsafe_get[addr indexed by int] prim prim)) (function {nlocal = 0} prim[addrarray] prim[int] prim[int32] stub - ignore assert all zero_alloc : int - (array.set[addr] prim prim prim)) + : int (array.set[addr indexed by int] prim prim prim)) (function {nlocal = 0} prim[addrarray] prim[int] prim[int32] stub - ignore assert all zero_alloc : int - (array.unsafe_set[addr] prim prim prim)) - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (compare_bints int32 prim prim)) - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.== prim prim)) - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.!= prim prim)) - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.< prim prim)) - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.> prim prim)) - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.<= prim prim)) - (function {nlocal = 0} prim[int32] prim[int32] stub - ignore assert all zero_alloc : int (Int32.>= prim prim))) + : int (array.unsafe_set[addr indexed by int] prim prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (compare_bints int32 prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.== prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.!= prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.< prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.> prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.<= prim prim)) + (function {nlocal = 0} prim[int32] prim[int32] stub : int + (Int32.>= prim prim))) (makeblock 0 - (function {nlocal = 0} prim[addrarray] stub - ignore assert all zero_alloc : int (array.length[addr] prim)) - (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc : int64 (array.get[addr] prim prim)) - (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc : int64 - (array.unsafe_get[addr] prim prim)) + (function {nlocal = 0} prim[addrarray] stub : int + (array.length[addr] prim)) + (function {nlocal = 0} prim[addrarray] prim[int] stub : int64 + (array.get[addr indexed by int] prim prim)) + (function {nlocal = 0} prim[addrarray] prim[int] stub : int64 + (array.unsafe_get[addr indexed by int] prim prim)) (function {nlocal = 0} prim[addrarray] prim[int] prim[int64] stub - ignore assert all zero_alloc : int - (array.set[addr] prim prim prim)) + : int (array.set[addr indexed by int] prim prim prim)) (function {nlocal = 0} prim[addrarray] prim[int] prim[int64] stub - ignore assert all zero_alloc : int - (array.unsafe_set[addr] prim prim prim)) - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (compare_bints int64 prim prim)) - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.== prim prim)) - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.!= prim prim)) - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.< prim prim)) - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.> prim prim)) - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.<= prim prim)) - (function {nlocal = 0} prim[int64] prim[int64] stub - ignore assert all zero_alloc : int (Int64.>= prim prim))) + : int (array.unsafe_set[addr indexed by int] prim prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (compare_bints int64 prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.== prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.!= prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.< prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.> prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.<= prim prim)) + (function {nlocal = 0} prim[int64] prim[int64] stub : int + (Int64.>= prim prim))) (makeblock 0 - (function {nlocal = 0} prim[addrarray] stub - ignore assert all zero_alloc : int (array.length[addr] prim)) - (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc : nativeint - (array.get[addr] prim prim)) - (function {nlocal = 0} prim[addrarray] prim[int] stub - ignore assert all zero_alloc : nativeint - (array.unsafe_get[addr] prim prim)) + (function {nlocal = 0} prim[addrarray] stub : int + (array.length[addr] prim)) + (function {nlocal = 0} prim[addrarray] prim[int] stub : nativeint + (array.get[addr indexed by int] prim prim)) + (function {nlocal = 0} prim[addrarray] prim[int] stub : nativeint + (array.unsafe_get[addr indexed by int] prim prim)) (function {nlocal = 0} prim[addrarray] prim[int] prim[nativeint] stub - ignore assert all zero_alloc : int - (array.set[addr] prim prim prim)) + : int (array.set[addr indexed by int] prim prim prim)) (function {nlocal = 0} prim[addrarray] prim[int] prim[nativeint] stub - ignore assert all zero_alloc : int - (array.unsafe_set[addr] prim prim prim)) - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int + : int (array.unsafe_set[addr indexed by int] prim prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int (compare_bints nativeint prim prim)) - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.== prim prim)) - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.!= prim prim)) - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.< prim prim)) - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.> prim prim)) - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.<= prim prim)) - (function {nlocal = 0} prim[nativeint] prim[nativeint] stub - ignore assert all zero_alloc : int (Nativeint.>= prim prim)))))) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.== prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.!= prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.< prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.> prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.<= prim prim)) + (function {nlocal = 0} prim[nativeint] prim[nativeint] stub : int + (Nativeint.>= prim prim)))))) diff --git a/testsuite/tests/translprim/module_coercion.compilers.no-flat.reference b/testsuite/tests/translprim/module_coercion.compilers.no-flat.reference index d63bd7da813..0014464a379 100644 --- a/testsuite/tests/translprim/module_coercion.compilers.no-flat.reference +++ b/testsuite/tests/translprim/module_coercion.compilers.no-flat.reference @@ -31,13 +31,20 @@ (function {nlocal = 0} prim[addrarray] prim[int] prim[float] stub (array.unsafe_set[addr] prim prim prim)) (function {nlocal = 0} prim[float] prim[float] stub - (compare_floats prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub (==. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub (!=. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub (<. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub (>. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub (<=. prim prim)) - (function {nlocal = 0} prim[float] prim[float] stub (>=. prim prim))) + ignore assert all zero_alloc : int + (compare_floats float prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub + ignore assert all zero_alloc : int (Float.== prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub + ignore assert all zero_alloc : int (Float.!= prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub + ignore assert all zero_alloc : int (Float.< prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub + ignore assert all zero_alloc : int (Float.> prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub + ignore assert all zero_alloc : int (Float.<= prim prim)) + (function {nlocal = 0} prim[float] prim[float] stub + ignore assert all zero_alloc : int (Float.>= prim prim))) (makeblock 0 (function {nlocal = 0} prim[addrarray] stub (array.length[addr] prim)) diff --git a/testsuite/tests/translprim/module_coercion.ml b/testsuite/tests/translprim/module_coercion.ml index a6d334c8ad0..282e96e3238 100644 --- a/testsuite/tests/translprim/module_coercion.ml +++ b/testsuite/tests/translprim/module_coercion.ml @@ -1,15 +1,16 @@ (* TEST - * setup-ocamlc.byte-build-env - ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" - *** flat-float-array - **** check-ocamlc.byte-output - compiler_reference = - "${test_source_directory}/module_coercion.compilers.flat.reference" - *** no-flat-float-array - **** check-ocamlc.byte-output - compiler_reference = - "${test_source_directory}/module_coercion.compilers.no-flat.reference" + setup-ocamlc.byte-build-env; + flags = "-dlambda -dno-unique-ids"; + ocamlc.byte; + { + flat-float-array; + compiler_reference = "${test_source_directory}/module_coercion.compilers.flat.reference"; + check-ocamlc.byte-output; + }{ + no-flat-float-array; + compiler_reference = "${test_source_directory}/module_coercion.compilers.no-flat.reference"; + check-ocamlc.byte-output; + } *) module M = struct diff --git a/testsuite/tests/translprim/ref_spec.ml b/testsuite/tests/translprim/ref_spec.ml index e5bdff5aea7..d34589bff0f 100644 --- a/testsuite/tests/translprim/ref_spec.ml +++ b/testsuite/tests/translprim/ref_spec.ml @@ -1,13 +1,16 @@ (* TEST - * setup-ocamlc.byte-build-env - ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" - *** stack-allocation - **** check-ocamlc.byte-output - compiler_reference = "${test_source_directory}/ref_spec.stack.reference" - *** no-stack-allocation - **** check-ocamlc.byte-output - compiler_reference = "${test_source_directory}/ref_spec.heap.reference" + setup-ocamlc.byte-build-env; + flags = "-dlambda -dno-unique-ids"; + ocamlc.byte; + { + stack-allocation; + compiler_reference = "${test_source_directory}/ref_spec.stack.reference"; + check-ocamlc.byte-output; + }{ + no-stack-allocation; + compiler_reference = "${test_source_directory}/ref_spec.heap.reference"; + check-ocamlc.byte-output; + } *) type 'a custom_rec = { x : unit; mutable y : 'a } diff --git a/testsuite/tests/tsan/array_elt.ml b/testsuite/tests/tsan/array_elt.ml deleted file mode 100644 index 5df01d1d47a..00000000000 --- a/testsuite/tests/tsan/array_elt.ml +++ /dev/null @@ -1,17 +0,0 @@ -(* TEST - - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) -let () = - let v = Array.make 4 0 in - let t1 = Domain.spawn (fun () -> Array.set v 3 0; Unix.sleepf 0.1) in - let t2 = Domain.spawn (fun () -> ignore (Sys.opaque_identity (Array.get v 3)); Unix.sleepf 0.1) in - Domain.join t1; - Domain.join t2; diff --git a/testsuite/tests/tsan/exn_from_c.ml b/testsuite/tests/tsan/exn_from_c.ml deleted file mode 100644 index fa36508b948..00000000000 --- a/testsuite/tests/tsan/exn_from_c.ml +++ /dev/null @@ -1,53 +0,0 @@ -(* TEST - - modules = "callbacks.c"; - - ocamlopt_flags = "-g -ccopt -fsanitize=thread -ccopt -O1 -ccopt -fno-omit-frame-pointer -ccopt -g"; - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) - -external print_and_raise : unit -> unit = "print_and_raise" - -open Printf - -let r = ref 0 - -let [@inline never] race () = ignore @@ !r - -let [@inline never] i () = - printf "entering i\n%!"; - printf "calling print_and_raise...\n%!"; - print_and_raise (); - printf "leaving i\n%!" - -let [@inline never] h () = - printf "entering h\n%!"; - i (); - printf "leaving h\n%!" - -let [@inline never] g () = - printf "entering g\n%!"; - h (); - printf "leaving g\n%!" - -let [@inline never] f () = - printf "entering f\n%!"; - (try g () - with Failure msg -> - printf "caught Failure \"%s\"\n%!" msg; - Printexc.print_backtrace stdout; - race ()); - printf "leaving f\n%!" - -let () = - Printexc.record_backtrace true; - let d = Domain.spawn (fun () -> Unix.sleep 1; r := 1) in - f (); Unix.sleep 1; - Domain.join d diff --git a/testsuite/tests/tsan/exn_in_callback.ml b/testsuite/tests/tsan/exn_in_callback.ml deleted file mode 100644 index 634a505dd15..00000000000 --- a/testsuite/tests/tsan/exn_in_callback.ml +++ /dev/null @@ -1,63 +0,0 @@ -(* TEST - - modules = "callbacks.c"; - - ocamlopt_flags = "-g -ccopt -fsanitize=thread -ccopt -O1 -ccopt -fno-omit-frame-pointer -ccopt -g"; - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) -exception ExnA -exception ExnB - -external print_and_call_ocaml_h : unit -> unit = "print_and_call_ocaml_h" - -open Printf - -let r = ref 0 - -let [@inline never] race () = ignore @@ !r - -let [@inline never] i () = - printf "entering i\n%!"; - printf "throwing Exn...\n%!"; - (*race ();*) - ignore (raise ExnB); - printf "leaving i\n%!" - -let [@inline never] h () = - printf "entering h\n%!"; - i (); - (* try i () with - | ExnA -> printf "caught an ExnA\n%!"; - *) - printf "leaving h\n%!" - -let _ = Callback.register "ocaml_h" h - -let [@inline never] g () = - printf "entering g\n%!"; - printf "calling C code\n%!"; - print_and_call_ocaml_h (); - printf "back from C code\n%!"; - printf "leaving g\n%!" - -let [@inline never] f () = - printf "entering f\n%!"; - (try g () with - | ExnB -> - printf "caught an ExnB\n%!"; - Printexc.print_backtrace stdout; - race ()); - printf "leaving f\n%!" - -let () = - Printexc.record_backtrace true; - let d = Domain.spawn (fun () -> Unix.sleep 1; r := 1) in - f (); Unix.sleep 1; - Domain.join d diff --git a/testsuite/tests/tsan/exn_reraise.ml b/testsuite/tests/tsan/exn_reraise.ml deleted file mode 100644 index 828eef5e200..00000000000 --- a/testsuite/tests/tsan/exn_reraise.ml +++ /dev/null @@ -1,52 +0,0 @@ -(* TEST - - ocamlopt_flags = "-g -ccopt -fsanitize=thread -ccopt -O1 -ccopt -fno-omit-frame-pointer -ccopt -g"; - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) -exception ExnA -exception ExnB - -open Printf - -let r = ref 0 - -let [@inline never] race () = ignore @@ !r - -let [@inline never] i () = - printf "entering i\n%!"; - printf "throwing Exn...\n%!"; - ignore (raise ExnA); - printf "leaving i\n%!" - -let [@inline never] h () = - printf "entering h\n%!"; - try i () with - | ExnB -> printf "caught an ExnB\n%!"; - printf "leaving h\n%!" - -let [@inline never] g () = - printf "entering g\n%!"; - h (); - printf "leaving g\n%!" - -let [@inline never] f () = - printf "entering f\n%!"; - (try g () with - | ExnA -> - printf "caught an ExnA\n%!"; - Printexc.print_backtrace stdout; - race ()); - printf "leaving f\n%!" - -let () = - Printexc.record_backtrace true; - let d = Domain.spawn (fun () -> Unix.sleep 1; r := 1) in - f (); Unix.sleep 1; - Domain.join d diff --git a/testsuite/tests/tsan/handlers_at_tail.ml b/testsuite/tests/tsan/handlers_at_tail.ml deleted file mode 100644 index b3ead5808bc..00000000000 --- a/testsuite/tests/tsan/handlers_at_tail.ml +++ /dev/null @@ -1,28 +0,0 @@ -(* TEST - - ocamlopt_flags = "-g"; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) - -(* This is a regression test for a bug that incorrectly instrumented two nested - try...with expressions, by treating the innermost exception handler as being - in tail position, and thus inserting a redundant call to [__tsan_func_exit] - before the call to [g], causing TSan's shadow stack to underflow after a few - iterations. *) - -let g () = raise Exit [@@inline never] - -let rec f n = - try - try - if n >= 1000 then () else g () - with Exit -> g () (* Innermost handler *) - with Exit -> f (n+1) - -let () = f 1 diff --git a/testsuite/tests/tsan/norace_atomics.ml b/testsuite/tests/tsan/norace_atomics.ml deleted file mode 100644 index 28c53b6c393..00000000000 --- a/testsuite/tests/tsan/norace_atomics.ml +++ /dev/null @@ -1,20 +0,0 @@ -(* TEST - - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) - -let v = Atomic.make 0 - -let () = - let t1 = Domain.spawn (fun () -> Atomic.set v 10; Unix.sleep 1) in - let t2 = Domain.spawn (fun () -> - ignore (Sys.opaque_identity (Atomic.get v)); Unix.sleep 1) in - Domain.join t1; - Domain.join t2 diff --git a/testsuite/tests/tsan/perform.ml b/testsuite/tests/tsan/perform.ml deleted file mode 100644 index 90353cec643..00000000000 --- a/testsuite/tests/tsan/perform.ml +++ /dev/null @@ -1,88 +0,0 @@ -(* TEST - - ocamlopt_flags = "-g"; - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) - -(* This performs two effects. We trigger race reports in order to check - correctness of the backtrace in three places: - - In the effect handler after performing once; - - After resuming; - - In the value handler when the computation returned. *) -open Printf -open Effect -open Effect.Deep - -type _ Effect.t += E : int -> int t - -let g_ref1 = ref 0 -let g_ref2 = ref 0 -let g_ref3 = ref 0 - -let [@inline never] race = - function - | 0 -> g_ref1 := 42 - | 1 -> g_ref2 := 42 - | _ -> g_ref3 := 42 - -let [@inline never] h () = - print_endline "entering h and perform-ing"; - let v = perform (E 0) in - print_endline "resuming h"; - race 0; - print_endline "leaving h"; - v - -let [@inline never] g () = - print_endline "entering g"; - let v = h () in - print_endline "leaving g"; - v - -let [@inline never] f () = - print_endline "computation, entering f"; - let v = g () in - print_endline "computation, leaving f"; - v + 1 - -let effh : type a. a t -> ((a, 'b) continuation -> 'b) option = function - | E v -> Some (fun k -> - print_endline "in the effect handler"; - race 1; - let v = continue k (v + 1) in - print_endline "handler after continue"; - v + 1 - ) - | e -> None - -let[@inline never] main () = - print_endline "Let's work!"; - ignore ( - match_with f () - { retc = (fun v -> - print_endline "value handler"; - race 2; - v + 1 - ); - exnc = (fun e -> raise e); - effc = effh } - ); - 44 - -let[@inline never] other_domain () = - ignore (Sys.opaque_identity (!g_ref1, !g_ref2, !g_ref3)); - Unix.sleepf 0.66 - -let () = - let d = Domain.spawn other_domain in - Unix.sleepf 0.33; - let v = main () in - printf "result = %d\n" v; - Domain.join d diff --git a/testsuite/tests/tsan/raise_through_handler.ml b/testsuite/tests/tsan/raise_through_handler.ml deleted file mode 100644 index 25250be8d8b..00000000000 --- a/testsuite/tests/tsan/raise_through_handler.ml +++ /dev/null @@ -1,61 +0,0 @@ -(* TEST - - ocamlopt_flags = "-g"; - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) - -open Printf -open Effect -open Effect.Deep - -let g_ref = ref 0 - -let [@inline never] race () = - g_ref := 42 - -let [@inline never] g () = - print_endline "entering g"; - ignore @@ raise Exit; - print_endline "leaving g"; - 12 - -let [@inline never] f () = - print_endline "computation, entering f"; - let v = g () in - print_endline "computation, leaving f"; - v + 1 - -let effh : type a. a t -> ((a, 'b) continuation -> 'b) option = fun _ -> None - -let[@inline never] main () = - print_endline "Let's work!"; - (try - ignore ( - match_with f () - { retc = (fun v -> v + 1); - exnc = (fun e -> raise e); - effc = effh } - ) - with Exit -> - print_endline "In exception handler"; - race (); - ); - 44 - -let[@inline never] other_domain () = - ignore (Sys.opaque_identity !g_ref); - Unix.sleepf 0.66 - -let () = - let d = Domain.spawn other_domain in - Unix.sleepf 0.33; - let v = main () in - printf "result = %d\n" v; - Domain.join d diff --git a/testsuite/tests/tsan/record_field.ml b/testsuite/tests/tsan/record_field.ml deleted file mode 100644 index caee528565d..00000000000 --- a/testsuite/tests/tsan/record_field.ml +++ /dev/null @@ -1,20 +0,0 @@ -(* TEST - - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) -type t = { mutable x : int } - -let v = { x = 0 } - -let () = - let t1 = Domain.spawn (fun () -> v.x <- 10; Unix.sleepf 0.1) in - let t2 = Domain.spawn (fun () -> ignore (Sys.opaque_identity v.x); Unix.sleepf 0.1) in - Domain.join t1; - Domain.join t2 diff --git a/testsuite/tests/tsan/reperform.ml b/testsuite/tests/tsan/reperform.ml deleted file mode 100644 index ffe18fae4fb..00000000000 --- a/testsuite/tests/tsan/reperform.ml +++ /dev/null @@ -1,103 +0,0 @@ -(* TEST - - ocamlopt_flags = "-g"; - include unix; - set TSAN_OPTIONS="detect_deadlocks=0"; - - reason = "OCaml 5 only"; - skip; - tsan; - native; - -*) - -(* This performs two effects. We trigger race reports in order to check - correctness of the backtrace in three places: - - In the outer effect handler after a perform and a reperform; - - After resuming, back in the deepest computation; - - After the outermost Effect.match_with has completed. *) -open Printf -open Effect -open Effect.Deep - -let print_endline s = Stdlib.print_endline s; flush stdout - -type _ t += E1 : int -> int t -type _ t += E2 : int -> int t - -let g_ref1 = ref 0 -let g_ref2 = ref 0 -let g_ref3 = ref 0 - -let [@inline never] race = - function - | 0 -> g_ref1 := 1 - | 1 -> g_ref2 := 1 - | _ -> g_ref3 := 1 - -let [@inline never] h () = - print_endline "entering h"; - let v = perform (E1 0) in - race 1; - print_endline "leaving h"; - v - -let [@inline never] g () = - print_endline "entering g"; - let v = h () in - print_endline "leaving g"; - v - -let f () = - print_endline "entering f"; - let v = g () in - print_endline "leaving f"; - v + 1 - -let [@inline never] fiber2 () = - ignore @@ match_with f () - { retc = Fun.id; - exnc = raise; - effc = (fun (type a) (e : a t) -> - match e with - | E2 v -> Some (fun (k : (a, _) continuation) -> - print_endline "E2 handler before continue"; - let v = continue k v in - print_endline "E2 handler after continue"; - v) - | e -> None) }; - 42 - -let effh : type a. a t -> ((a, 'b) continuation -> 'b) option = function - | E1 v -> Some (fun k -> - print_endline "E1 handler before continue"; - race 0; - let v = continue k (v + 1) in - print_endline "E1 handler after continue"; - v + 1 - ) - | e -> None - -let [@inline never] fiber1 () = - ignore @@ match_with fiber2 () - { retc = (fun v -> - print_endline "value handler"; v + 1); - exnc = (fun e -> raise e); - effc = effh }; - 1338 - -let[@inline never] main () = - let v = fiber1 () in - v + 1 - -let[@inline never] other_domain () = - ignore @@ (!g_ref1, !g_ref2, !g_ref3); - Unix.sleepf 0.66 - -let () = - let d = Domain.spawn other_domain in - Unix.sleepf 0.33; - let v = main () in - printf "result=%d\n%!" v; - race 2; - Domain.join d diff --git a/testsuite/tests/typing-core-bugs/const_int_hint.ml b/testsuite/tests/typing-core-bugs/const_int_hint.ml index e802b02b450..1391318600b 100644 --- a/testsuite/tests/typing-core-bugs/const_int_hint.ml +++ b/testsuite/tests/typing-core-bugs/const_int_hint.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let _ = Int32.(add 1 2l);; @@ -187,12 +187,12 @@ Error: This pattern matches values of type int but a pattern was expected which matches values of type int32 Hint: Did you mean `0b1000_1101l'? |}] -type t1 = {f1: int32};; let _ = fun x -> x.f1 <- 1_000n;; +type t1 = {mutable f1: int32};; let _ = fun x -> x.f1 <- 1_000n;; [%%expect{| -type t1 = { f1 : int32; } -Line 1, characters 49-55: -1 | type t1 = {f1: int32};; let _ = fun x -> x.f1 <- 1_000n;; - ^^^^^^ +type t1 = { mutable f1 : int32; } +Line 1, characters 57-63: +1 | type t1 = {mutable f1: int32};; let _ = fun x -> x.f1 <- 1_000n;; + ^^^^^^ Error: This expression has type nativeint but an expression was expected of type int32 Hint: Did you mean `1_000l'? diff --git a/testsuite/tests/typing-core-bugs/missing_rec_hint.ml b/testsuite/tests/typing-core-bugs/missing_rec_hint.ml index f3e62e2b041..e62607a34cb 100644 --- a/testsuite/tests/typing-core-bugs/missing_rec_hint.ml +++ b/testsuite/tests/typing-core-bugs/missing_rec_hint.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let facto n = (* missing [rec] *) diff --git a/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml b/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml index 3c187fa4a2e..d5ff406d011 100644 --- a/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml +++ b/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* MPR 7864 *) diff --git a/testsuite/tests/typing-core-bugs/type_expected_explanation.ml b/testsuite/tests/typing-core-bugs/type_expected_explanation.ml index fe9bc478ed9..9616ffbc89a 100644 --- a/testsuite/tests/typing-core-bugs/type_expected_explanation.ml +++ b/testsuite/tests/typing-core-bugs/type_expected_explanation.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-strict-sequence" - * expect + flags = "-strict-sequence"; + expect; *) if 3 then ();; diff --git a/testsuite/tests/typing-core-bugs/unit_fun_hints.ml b/testsuite/tests/typing-core-bugs/unit_fun_hints.ml index 73b4ad22d63..1b9acece95b 100644 --- a/testsuite/tests/typing-core-bugs/unit_fun_hints.ml +++ b/testsuite/tests/typing-core-bugs/unit_fun_hints.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-strict-sequence" - * expect + flags = "-strict-sequence"; + expect; *) let g f = f () diff --git a/testsuite/tests/typing-deprecated/alerts.ml b/testsuite/tests/typing-deprecated/alerts.ml index edc07e43207..e9d7d89829a 100644 --- a/testsuite/tests/typing-deprecated/alerts.ml +++ b/testsuite/tests/typing-deprecated/alerts.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) diff --git a/testsuite/tests/typing-deprecated/deprecated.ml b/testsuite/tests/typing-deprecated/deprecated.ml index c8c37077038..0ac02d610fe 100644 --- a/testsuite/tests/typing-deprecated/deprecated.ml +++ b/testsuite/tests/typing-deprecated/deprecated.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) [@@@ocaml.warning "+3"];; diff --git a/testsuite/tests/typing-extension-constructor/test.ml b/testsuite/tests/typing-extension-constructor/test.ml index d18777c72da..b486694d921 100644 --- a/testsuite/tests/typing-extension-constructor/test.ml +++ b/testsuite/tests/typing-extension-constructor/test.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) type t = ..;; diff --git a/testsuite/tests/typing-extension-constructor/test.ocaml.reference b/testsuite/tests/typing-extension-constructor/test.ocaml.reference index 276d01c85db..0fa7595bdd8 100644 --- a/testsuite/tests/typing-extension-constructor/test.ocaml.reference +++ b/testsuite/tests/typing-extension-constructor/test.ocaml.reference @@ -6,8 +6,6 @@ module M : sig type extension_constructor = int end Line 2, characters 1-27: 2 | ([%extension_constructor A] : extension_constructor);; ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This expression has type extension_constructor/2 +Error: This expression has type extension_constructor but an expression was expected of type M.extension_constructor = int - File "_none_", line 1: - Definition of type extension_constructor/2 diff --git a/testsuite/tests/typing-extensions/cast.ml b/testsuite/tests/typing-extensions/cast.ml index 7e155f53687..8bad32bb056 100644 --- a/testsuite/tests/typing-extensions/cast.ml +++ b/testsuite/tests/typing-extensions/cast.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* Ignore OCAMLRUNPARAM=b to be reproducible *) diff --git a/testsuite/tests/typing-extensions/disambiguation.ml b/testsuite/tests/typing-extensions/disambiguation.ml index 4201763397c..c0217b88b7a 100644 --- a/testsuite/tests/typing-extensions/disambiguation.ml +++ b/testsuite/tests/typing-extensions/disambiguation.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** Test type-directed disambiguation and spellchecker hints *) @@ -247,3 +247,19 @@ The first one was selected. Please disambiguate if this is wrong. val x : b = Unique |}] + +(* Optional argument defaults *) +module M = struct + type t = A | B +end;; + +let f1 ?(x : M.t = A) () = ();; +let f2 ?x:(_ : M.t = A) () = ();; +let f3 ?x:((_ : M.t) = A) () = ();; + +[%%expect {| +module M : sig type t = A | B end +val f1 : ?x:M.t -> unit -> unit = +val f2 : ?x:M.t -> unit -> unit = +val f3 : ?x:M.t -> unit -> unit = +|}] diff --git a/testsuite/tests/typing-extensions/extensions.ml b/testsuite/tests/typing-extensions/extensions.ml index 060302105d6..d9cacb9b226 100644 --- a/testsuite/tests/typing-extensions/extensions.ml +++ b/testsuite/tests/typing-extensions/extensions.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Ignore OCAMLRUNPARAM=b to be reproducible *) diff --git a/testsuite/tests/typing-extensions/msg.ml b/testsuite/tests/typing-extensions/msg.ml index 07cdba656a1..0a66f2a9329 100644 --- a/testsuite/tests/typing-extensions/msg.ml +++ b/testsuite/tests/typing-extensions/msg.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* Typed names *) diff --git a/testsuite/tests/typing-extensions/open_types.ml b/testsuite/tests/typing-extensions/open_types.ml index b481ed4a17f..b7ddea5b021 100644 --- a/testsuite/tests/typing-extensions/open_types.ml +++ b/testsuite/tests/typing-extensions/open_types.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type foo = .. diff --git a/testsuite/tests/typing-external/pr11392.ml b/testsuite/tests/typing-external/pr11392.ml index 91c8ea77eb7..61cd5cada60 100644 --- a/testsuite/tests/typing-external/pr11392.ml +++ b/testsuite/tests/typing-external/pr11392.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'self nat = diff --git a/testsuite/tests/typing-fstclassmod/aliases.ml b/testsuite/tests/typing-fstclassmod/aliases.ml index f6043ed443b..0ad18c98a0a 100644 --- a/testsuite/tests/typing-fstclassmod/aliases.ml +++ b/testsuite/tests/typing-fstclassmod/aliases.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M = struct end diff --git a/testsuite/tests/typing-fstclassmod/fstclassmod.ml b/testsuite/tests/typing-fstclassmod/fstclassmod.ml index 3330f957d80..2c31f300391 100644 --- a/testsuite/tests/typing-fstclassmod/fstclassmod.ml +++ b/testsuite/tests/typing-fstclassmod/fstclassmod.ml @@ -1,5 +1,5 @@ (* TEST - flags = "-w +A-70 -warn-error +A" + flags = "-w +A-70 -warn-error +A"; *) (* Example of algorithm parametrized with modules *) diff --git a/testsuite/tests/typing-fstclassmod/nondep_instance.ml b/testsuite/tests/typing-fstclassmod/nondep_instance.ml index 34f37b1c861..fec690651cd 100644 --- a/testsuite/tests/typing-fstclassmod/nondep_instance.ml +++ b/testsuite/tests/typing-fstclassmod/nondep_instance.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) module type Vector_space = sig type t diff --git a/testsuite/tests/typing-fstclassmod/scope_escape.ml b/testsuite/tests/typing-fstclassmod/scope_escape.ml index 08726856c3f..926373fa47e 100644 --- a/testsuite/tests/typing-fstclassmod/scope_escape.ml +++ b/testsuite/tests/typing-fstclassmod/scope_escape.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Typing for recursive modules checks scope escape *) diff --git a/testsuite/tests/typing-gadts/ambiguity.ml b/testsuite/tests/typing-gadts/ambiguity.ml index 36b651f13b8..d6e9f86d751 100644 --- a/testsuite/tests/typing-gadts/ambiguity.ml +++ b/testsuite/tests/typing-gadts/ambiguity.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) [@@@warning "-8-11-12"] (* reduce the noise. *) diff --git a/testsuite/tests/typing-gadts/ambivalent_apply.ml b/testsuite/tests/typing-gadts/ambivalent_apply.ml index 5e44d26de54..2dc0cf72bd1 100644 --- a/testsuite/tests/typing-gadts/ambivalent_apply.ml +++ b/testsuite/tests/typing-gadts/ambivalent_apply.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_,_) eq = Refl : ('a,'a) eq;; diff --git a/testsuite/tests/typing-gadts/didier.ml b/testsuite/tests/typing-gadts/didier.ml index 0e120e8503b..75062f76089 100644 --- a/testsuite/tests/typing-gadts/didier.ml +++ b/testsuite/tests/typing-gadts/didier.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a ty = diff --git a/testsuite/tests/typing-gadts/dynamic_frisch.ml b/testsuite/tests/typing-gadts/dynamic_frisch.ml index 8bef407420d..56ad6d0576b 100644 --- a/testsuite/tests/typing-gadts/dynamic_frisch.ml +++ b/testsuite/tests/typing-gadts/dynamic_frisch.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Encoding generics using GADTs *) diff --git a/testsuite/tests/typing-gadts/gadthead.ml b/testsuite/tests/typing-gadts/gadthead.ml index 57a0f04d824..5e4cbfd5b08 100644 --- a/testsuite/tests/typing-gadts/gadthead.ml +++ b/testsuite/tests/typing-gadts/gadthead.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M : sig diff --git a/testsuite/tests/typing-gadts/name_existentials.ml b/testsuite/tests/typing-gadts/name_existentials.ml index 91b2f5bb1d3..71bc112d8de 100644 --- a/testsuite/tests/typing-gadts/name_existentials.ml +++ b/testsuite/tests/typing-gadts/name_existentials.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ ty = Int : int ty diff --git a/testsuite/tests/typing-gadts/nested_equations.ml b/testsuite/tests/typing-gadts/nested_equations.ml index b1719bfbd09..4a9173c0393 100644 --- a/testsuite/tests/typing-gadts/nested_equations.ml +++ b/testsuite/tests/typing-gadts/nested_equations.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Tests for nested equations (bind abstract types from other modules) *) diff --git a/testsuite/tests/typing-gadts/omega07.ml b/testsuite/tests/typing-gadts/omega07.ml index a8e63880355..01600502df7 100644 --- a/testsuite/tests/typing-gadts/omega07.ml +++ b/testsuite/tests/typing-gadts/omega07.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* diff --git a/testsuite/tests/typing-gadts/optional_args.ml b/testsuite/tests/typing-gadts/optional_args.ml new file mode 100644 index 00000000000..4682e1bf847 --- /dev/null +++ b/testsuite/tests/typing-gadts/optional_args.ml @@ -0,0 +1,68 @@ +(* TEST + expect; +*) + +(* A bug in typecore leading to extra expansion led this to be rejected. *) + +type (_, _) refl = Refl : ('a, 'a) refl + +[%%expect{| +type (_, _) refl = Refl : ('a, 'a) refl +|}] + +let apply (_ : unit -> 'a) : 'a = assert false +let go (type a) (Refl : (unit, a) refl) = apply (fun () : a -> ()) + +[%%expect{| +val apply : (unit -> 'a) -> 'a = +val go : (unit, 'a) refl -> 'a = +|}] + +let apply (_ : x:unit -> unit -> 'a) : 'a = assert false +let go (type a) (Refl : (unit, a) refl) = apply (fun ~x:_ () : a -> ()) + +[%%expect{| +val apply : (x:unit -> unit -> 'a) -> 'a = +val go : (unit, 'a) refl -> 'a = +|}] + +let apply (_ : ?x:unit -> unit -> 'a) : 'a = assert false +let go (type a) (Refl : (unit, a) refl) = apply (fun ?x:_ () : a -> ()) + +[%%expect{| +val apply : (?x:unit -> unit -> 'a) -> 'a = +Line 2, characters 42-71: +2 | let go (type a) (Refl : (unit, a) refl) = apply (fun ?x:_ () : a -> ()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type a = unit + but an expression was expected of type 'a + This instance of unit is ambiguous: + it would escape the scope of its equation +|}] + +let apply (_ : unit -> x:unit -> 'a) : 'a = assert false +let go (type a) (Refl : (unit, a) refl) = apply (fun () ~x:_ : a -> ()) + +[%%expect{| +val apply : (unit -> x:unit -> 'a) -> 'a = +val go : (unit, 'a) refl -> 'a = +|}] + +let apply (_ : unit -> ?x:unit -> 'a) : 'a = assert false +let go (type a) (Refl : (unit, a) refl) = apply (fun () ?x:_ : a -> ()) + +[%%expect{| +val apply : (unit -> ?x:unit -> 'a) -> 'a = +Line 2, characters 59-60: +2 | let go (type a) (Refl : (unit, a) refl) = apply (fun () ?x:_ : a -> ()) + ^ +Warning 16 [unerasable-optional-argument]: this optional argument cannot be erased. + +Line 2, characters 42-71: +2 | let go (type a) (Refl : (unit, a) refl) = apply (fun () ?x:_ : a -> ()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type a = unit + but an expression was expected of type 'a + This instance of unit is ambiguous: + it would escape the scope of its equation +|}] diff --git a/testsuite/tests/typing-gadts/or_patterns.ml b/testsuite/tests/typing-gadts/or_patterns.ml index 74f8d9fcd73..e2e4456fa2c 100644 --- a/testsuite/tests/typing-gadts/or_patterns.ml +++ b/testsuite/tests/typing-gadts/or_patterns.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ t = diff --git a/testsuite/tests/typing-gadts/packed-module-recasting.ml b/testsuite/tests/typing-gadts/packed-module-recasting.ml index 9cb88216737..73ac738c96d 100644 --- a/testsuite/tests/typing-gadts/packed-module-recasting.ml +++ b/testsuite/tests/typing-gadts/packed-module-recasting.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) eq = Refl : ('a, 'a) eq;; diff --git a/testsuite/tests/typing-gadts/pr10189.ml b/testsuite/tests/typing-gadts/pr10189.ml index 5df054fd10b..65cb8183a3e 100644 --- a/testsuite/tests/typing-gadts/pr10189.ml +++ b/testsuite/tests/typing-gadts/pr10189.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type i = 'c > diff --git a/testsuite/tests/typing-gadts/pr10271.ml b/testsuite/tests/typing-gadts/pr10271.ml index 37b6bdbc620..061e5568dcb 100644 --- a/testsuite/tests/typing-gadts/pr10271.ml +++ b/testsuite/tests/typing-gadts/pr10271.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M = struct diff --git a/testsuite/tests/typing-gadts/pr10348.ml b/testsuite/tests/typing-gadts/pr10348.ml index ba3e860770d..23437dca3ab 100644 --- a/testsuite/tests/typing-gadts/pr10348.ml +++ b/testsuite/tests/typing-gadts/pr10348.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) diff --git a/testsuite/tests/typing-gadts/pr10735.ml b/testsuite/tests/typing-gadts/pr10735.ml index 5405670b11e..6202c3629e8 100644 --- a/testsuite/tests/typing-gadts/pr10735.ml +++ b/testsuite/tests/typing-gadts/pr10735.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module X : sig diff --git a/testsuite/tests/typing-gadts/pr10907.ml b/testsuite/tests/typing-gadts/pr10907.ml index abd431f2657..e0b9d4d5572 100644 --- a/testsuite/tests/typing-gadts/pr10907.ml +++ b/testsuite/tests/typing-gadts/pr10907.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* from @dyzsr *) diff --git a/testsuite/tests/typing-gadts/pr11888.ml b/testsuite/tests/typing-gadts/pr11888.ml index b0ff6fcea03..b4d72ce91ee 100644 --- a/testsuite/tests/typing-gadts/pr11888.ml +++ b/testsuite/tests/typing-gadts/pr11888.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type z diff --git a/testsuite/tests/typing-gadts/pr5332.ml b/testsuite/tests/typing-gadts/pr5332.ml index f81fff4955b..851864a2f06 100644 --- a/testsuite/tests/typing-gadts/pr5332.ml +++ b/testsuite/tests/typing-gadts/pr5332.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ('env, 'a) var = diff --git a/testsuite/tests/typing-gadts/pr5689.ml b/testsuite/tests/typing-gadts/pr5689.ml index f61d80af8e5..87b2bef9e8e 100644 --- a/testsuite/tests/typing-gadts/pr5689.ml +++ b/testsuite/tests/typing-gadts/pr5689.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type inkind = [ `Link | `Nonlink ] diff --git a/testsuite/tests/typing-gadts/pr5785.ml b/testsuite/tests/typing-gadts/pr5785.ml index 7817cb0422f..102ba05f4b5 100644 --- a/testsuite/tests/typing-gadts/pr5785.ml +++ b/testsuite/tests/typing-gadts/pr5785.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Add (T : sig type two end) = diff --git a/testsuite/tests/typing-gadts/pr5848.ml b/testsuite/tests/typing-gadts/pr5848.ml index 1c908d781d5..d76ecff2967 100644 --- a/testsuite/tests/typing-gadts/pr5848.ml +++ b/testsuite/tests/typing-gadts/pr5848.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module B : sig diff --git a/testsuite/tests/typing-gadts/pr5906.ml b/testsuite/tests/typing-gadts/pr5906.ml index 86ebfd0e36e..30d372733cf 100644 --- a/testsuite/tests/typing-gadts/pr5906.ml +++ b/testsuite/tests/typing-gadts/pr5906.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ constant = diff --git a/testsuite/tests/typing-gadts/pr5948.ml b/testsuite/tests/typing-gadts/pr5948.ml index 9581adc3c61..9edbf430bd1 100644 --- a/testsuite/tests/typing-gadts/pr5948.ml +++ b/testsuite/tests/typing-gadts/pr5948.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type tag = [`TagA | `TagB | `TagC];; diff --git a/testsuite/tests/typing-gadts/pr5981.ml b/testsuite/tests/typing-gadts/pr5981.ml index 3d01d36c9df..83502759c86 100644 --- a/testsuite/tests/typing-gadts/pr5981.ml +++ b/testsuite/tests/typing-gadts/pr5981.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module F(S : sig type 'a t end) = struct diff --git a/testsuite/tests/typing-gadts/pr5985.ml b/testsuite/tests/typing-gadts/pr5985.ml index d38d9eecca5..d38e7e789d4 100644 --- a/testsuite/tests/typing-gadts/pr5985.ml +++ b/testsuite/tests/typing-gadts/pr5985.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Report from Jeremy Yallop *) diff --git a/testsuite/tests/typing-gadts/pr5989.ml b/testsuite/tests/typing-gadts/pr5989.ml index 27d086d3f0b..a23ade09260 100644 --- a/testsuite/tests/typing-gadts/pr5989.ml +++ b/testsuite/tests/typing-gadts/pr5989.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) t = diff --git a/testsuite/tests/typing-gadts/pr5997.ml b/testsuite/tests/typing-gadts/pr5997.ml index 0f9f85b469e..907a3944266 100644 --- a/testsuite/tests/typing-gadts/pr5997.ml +++ b/testsuite/tests/typing-gadts/pr5997.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) comp = diff --git a/testsuite/tests/typing-gadts/pr6158.ml b/testsuite/tests/typing-gadts/pr6158.ml index 711304bb37c..388cfbc4be8 100644 --- a/testsuite/tests/typing-gadts/pr6158.ml +++ b/testsuite/tests/typing-gadts/pr6158.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a t = T of 'a diff --git a/testsuite/tests/typing-gadts/pr6163.ml b/testsuite/tests/typing-gadts/pr6163.ml index cf06eaf58fd..4ceecfe098d 100644 --- a/testsuite/tests/typing-gadts/pr6163.ml +++ b/testsuite/tests/typing-gadts/pr6163.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ nat = diff --git a/testsuite/tests/typing-gadts/pr6174.ml b/testsuite/tests/typing-gadts/pr6174.ml index bf710891f83..d689f656c80 100644 --- a/testsuite/tests/typing-gadts/pr6174.ml +++ b/testsuite/tests/typing-gadts/pr6174.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ t = C : ((('a -> 'o) -> 'o) -> ('b -> 'o) -> 'o) t diff --git a/testsuite/tests/typing-gadts/pr6241.ml b/testsuite/tests/typing-gadts/pr6241.ml index bf1108aeacc..c7975600df3 100644 --- a/testsuite/tests/typing-gadts/pr6241.ml +++ b/testsuite/tests/typing-gadts/pr6241.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) t = diff --git a/testsuite/tests/typing-gadts/pr6690.ml b/testsuite/tests/typing-gadts/pr6690.ml index ebf308d0958..9e952be9fd0 100644 --- a/testsuite/tests/typing-gadts/pr6690.ml +++ b/testsuite/tests/typing-gadts/pr6690.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a visit_action diff --git a/testsuite/tests/typing-gadts/pr6817.ml b/testsuite/tests/typing-gadts/pr6817.ml index 64621436373..bc48ca8e29e 100644 --- a/testsuite/tests/typing-gadts/pr6817.ml +++ b/testsuite/tests/typing-gadts/pr6817.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module A = struct diff --git a/testsuite/tests/typing-gadts/pr6934.ml b/testsuite/tests/typing-gadts/pr6934.ml index 76cb0563dab..e2a692df340 100644 --- a/testsuite/tests/typing-gadts/pr6934.ml +++ b/testsuite/tests/typing-gadts/pr6934.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type nonrec t = A : t;; diff --git a/testsuite/tests/typing-gadts/pr6980.ml b/testsuite/tests/typing-gadts/pr6980.ml index 191443240e6..d2654679621 100644 --- a/testsuite/tests/typing-gadts/pr6980.ml +++ b/testsuite/tests/typing-gadts/pr6980.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a t = [< `Foo | `Bar] as 'a;; diff --git a/testsuite/tests/typing-gadts/pr6993_bad.ml b/testsuite/tests/typing-gadts/pr6993_bad.ml index d3a74ce4978..adfe73b74fb 100644 --- a/testsuite/tests/typing-gadts/pr6993_bad.ml +++ b/testsuite/tests/typing-gadts/pr6993_bad.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) eqp = Y : ('a, 'a) eqp | N : string -> ('a, 'b) eqp diff --git a/testsuite/tests/typing-gadts/pr7016.ml b/testsuite/tests/typing-gadts/pr7016.ml index 3da34245b8b..38734d9b178 100644 --- a/testsuite/tests/typing-gadts/pr7016.ml +++ b/testsuite/tests/typing-gadts/pr7016.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) t = @@ -11,9 +11,9 @@ let get1 (Cons (x, _) : (_ * 'a, 'a) t) = x ;; (* warn, cf PR#6993 *) type (_, _) t = Nil : ('tl, 'tl) t | Cons : 'a * ('b, 'tl) t -> ('a * 'b, 'tl) t -Line 5, characters 9-43: +Line 5, characters 9-39: 5 | let get1 (Cons (x, _) : (_ * 'a, 'a) t) = x ;; (* warn, cf PR#6993 *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: Nil diff --git a/testsuite/tests/typing-gadts/pr7160.ml b/testsuite/tests/typing-gadts/pr7160.ml index 5a613052b80..b5584cefdb4 100644 --- a/testsuite/tests/typing-gadts/pr7160.ml +++ b/testsuite/tests/typing-gadts/pr7160.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ t = diff --git a/testsuite/tests/typing-gadts/pr7214.ml b/testsuite/tests/typing-gadts/pr7214.ml index a14616d7665..99236786850 100644 --- a/testsuite/tests/typing-gadts/pr7214.ml +++ b/testsuite/tests/typing-gadts/pr7214.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ t = I : int t;; diff --git a/testsuite/tests/typing-gadts/pr7222.ml b/testsuite/tests/typing-gadts/pr7222.ml index d0177e23c72..834d043e16a 100644 --- a/testsuite/tests/typing-gadts/pr7222.ml +++ b/testsuite/tests/typing-gadts/pr7222.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type +'a n = private int diff --git a/testsuite/tests/typing-gadts/pr7230.ml b/testsuite/tests/typing-gadts/pr7230.ml index 1c29f5e4aaa..40be65fb3bb 100644 --- a/testsuite/tests/typing-gadts/pr7230.ml +++ b/testsuite/tests/typing-gadts/pr7230.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ t = T : int t;; diff --git a/testsuite/tests/typing-gadts/pr7234.ml b/testsuite/tests/typing-gadts/pr7234.ml index 614f0adce10..fb61bcd80fd 100644 --- a/testsuite/tests/typing-gadts/pr7234.ml +++ b/testsuite/tests/typing-gadts/pr7234.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) eq = Eq : ('a, 'a) eq | Neq : int -> ('a, 'b) eq;; @@ -8,9 +8,9 @@ let f (type a) (Neq n : (a, a t) eq) = n;; (* warn! *) [%%expect{| type (_, _) eq = Eq : ('a, 'a) eq | Neq : int -> ('a, 'b) eq type 'a t -Line 3, characters 15-40: +Line 3, characters 15-36: 3 | let f (type a) (Neq n : (a, a t) eq) = n;; (* warn! *) - ^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: Eq @@ -22,9 +22,9 @@ module F (T : sig type _ t end) = struct let f (type a) (Neq n : (a, a T.t) eq) = n (* warn! *) end;; [%%expect{| -Line 2, characters 16-43: +Line 2, characters 16-39: 2 | let f (type a) (Neq n : (a, a T.t) eq) = n (* warn! *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: Eq diff --git a/testsuite/tests/typing-gadts/pr7260.ml b/testsuite/tests/typing-gadts/pr7260.ml index 2685e3b23b3..d0a830d806d 100644 --- a/testsuite/tests/typing-gadts/pr7260.ml +++ b/testsuite/tests/typing-gadts/pr7260.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type bar = < bar: unit > diff --git a/testsuite/tests/typing-gadts/pr7269.ml b/testsuite/tests/typing-gadts/pr7269.ml index 58da0d5ef5c..36b7b8a807c 100644 --- a/testsuite/tests/typing-gadts/pr7269.ml +++ b/testsuite/tests/typing-gadts/pr7269.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type s = [`A | `B] and sub = [`B];; @@ -11,9 +11,9 @@ let _ = f (T (`Conj `B) :> s t);; (* warn *) type s = [ `A | `B ] and sub = [ `B ] type +'a t = T : [< `Conj of 'a & sub | `Other of string ] -> 'a t -Line 4, characters 6-47: +Line 4, characters 6-28: 4 | let f (T (`Other msg) : s t) = print_string msg;; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: T (`Conj _) @@ -73,9 +73,9 @@ module M : } val e : elim -> unit end -Line 13, characters 21-57: +Line 13, characters 25-37: 13 | let () = M.(e { ex = fun (`Other msg) -> print_string msg });; (* warn *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: `Conj _ diff --git a/testsuite/tests/typing-gadts/pr7298.ml b/testsuite/tests/typing-gadts/pr7298.ml index 931d96129bf..06118652bbe 100644 --- a/testsuite/tests/typing-gadts/pr7298.ml +++ b/testsuite/tests/typing-gadts/pr7298.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = T : t;; diff --git a/testsuite/tests/typing-gadts/pr7374.ml b/testsuite/tests/typing-gadts/pr7374.ml index 6e2d5e42ba7..7aa139d9ce8 100644 --- a/testsuite/tests/typing-gadts/pr7374.ml +++ b/testsuite/tests/typing-gadts/pr7374.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ('a, 'b) eq = Refl : ('a, 'a) eq diff --git a/testsuite/tests/typing-gadts/pr7378.ml b/testsuite/tests/typing-gadts/pr7378.ml index fe771d8d0ad..1499ac5960d 100644 --- a/testsuite/tests/typing-gadts/pr7378.ml +++ b/testsuite/tests/typing-gadts/pr7378.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module X = struct diff --git a/testsuite/tests/typing-gadts/pr7381.ml b/testsuite/tests/typing-gadts/pr7381.ml index 7609cce77d3..cdc9c88de5c 100644 --- a/testsuite/tests/typing-gadts/pr7381.ml +++ b/testsuite/tests/typing-gadts/pr7381.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_,_) eql = Refl : ('a, 'a) eql;; diff --git a/testsuite/tests/typing-gadts/pr7390.ml b/testsuite/tests/typing-gadts/pr7390.ml index 7522209a386..8d019307a09 100644 --- a/testsuite/tests/typing-gadts/pr7390.ml +++ b/testsuite/tests/typing-gadts/pr7390.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type empty = Empty and filled = Filled @@ -21,9 +21,9 @@ type 'fill either = let f (* : filled either -> string *) = fun (Either (Y a, N)) -> a;; [%%expect{| -Line 2, characters 2-28: +Line 2, characters 6-23: 2 | fun (Either (Y a, N)) -> a;; - ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: Either (N, Y _) diff --git a/testsuite/tests/typing-gadts/pr7391.ml b/testsuite/tests/typing-gadts/pr7391.ml index f16654c5a03..a4160b0b9cc 100644 --- a/testsuite/tests/typing-gadts/pr7391.ml +++ b/testsuite/tests/typing-gadts/pr7391.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class virtual child1 parent = diff --git a/testsuite/tests/typing-gadts/pr7397.ml b/testsuite/tests/typing-gadts/pr7397.ml index 8a85eaff8c5..328f5a88c7b 100644 --- a/testsuite/tests/typing-gadts/pr7397.ml +++ b/testsuite/tests/typing-gadts/pr7397.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type +'a t diff --git a/testsuite/tests/typing-gadts/pr7421.ml b/testsuite/tests/typing-gadts/pr7421.ml index 79acaceb7da..8bf4025a90f 100644 --- a/testsuite/tests/typing-gadts/pr7421.ml +++ b/testsuite/tests/typing-gadts/pr7421.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) eq = Refl : ('a, 'a) eq;; diff --git a/testsuite/tests/typing-gadts/pr7432.ml b/testsuite/tests/typing-gadts/pr7432.ml index abb2167be1a..9e2903311af 100644 --- a/testsuite/tests/typing-gadts/pr7432.ml +++ b/testsuite/tests/typing-gadts/pr7432.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) #labels false;; diff --git a/testsuite/tests/typing-gadts/pr7520.ml b/testsuite/tests/typing-gadts/pr7520.ml index b4bfe2f4a85..1ee54463906 100644 --- a/testsuite/tests/typing-gadts/pr7520.ml +++ b/testsuite/tests/typing-gadts/pr7520.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ('a, 'b) eq = Refl : ('a, 'a) eq diff --git a/testsuite/tests/typing-gadts/pr7618.ml b/testsuite/tests/typing-gadts/pr7618.ml index afff67b5e2a..8fa12ef3539 100644 --- a/testsuite/tests/typing-gadts/pr7618.ml +++ b/testsuite/tests/typing-gadts/pr7618.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ t = I : int t;; diff --git a/testsuite/tests/typing-gadts/pr7747.ml b/testsuite/tests/typing-gadts/pr7747.ml index 97b89061d00..ca5eeaa7199 100644 --- a/testsuite/tests/typing-gadts/pr7747.ml +++ b/testsuite/tests/typing-gadts/pr7747.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_,_) eq = Refl : ('a,'a) eq diff --git a/testsuite/tests/typing-gadts/pr7902.ml b/testsuite/tests/typing-gadts/pr7902.ml index b88fc23e49f..cee0ad0df30 100644 --- a/testsuite/tests/typing-gadts/pr7902.ml +++ b/testsuite/tests/typing-gadts/pr7902.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ('a, 'b) segment = diff --git a/testsuite/tests/typing-gadts/pr9019.ml b/testsuite/tests/typing-gadts/pr9019.ml index 4f65c94398b..47e408a2c62 100644 --- a/testsuite/tests/typing-gadts/pr9019.ml +++ b/testsuite/tests/typing-gadts/pr9019.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* #9012 by Thomas Refis *) diff --git a/testsuite/tests/typing-gadts/pr9759.ml b/testsuite/tests/typing-gadts/pr9759.ml index cf68cebbc5a..7cdd9abd1ba 100644 --- a/testsuite/tests/typing-gadts/pr9759.ml +++ b/testsuite/tests/typing-gadts/pr9759.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* #9759 by Thomas Refis *) diff --git a/testsuite/tests/typing-gadts/pr9799.ml b/testsuite/tests/typing-gadts/pr9799.ml index 5d083684bbb..de7e5987005 100644 --- a/testsuite/tests/typing-gadts/pr9799.ml +++ b/testsuite/tests/typing-gadts/pr9799.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a t = diff --git a/testsuite/tests/typing-gadts/principality-and-gadts.ml b/testsuite/tests/typing-gadts/principality-and-gadts.ml index 4a1bbb52bc0..83b8b2c8c72 100644 --- a/testsuite/tests/typing-gadts/principality-and-gadts.ml +++ b/testsuite/tests/typing-gadts/principality-and-gadts.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) module M = struct type t = A | B end;; [%%expect{| diff --git a/testsuite/tests/typing-gadts/return_type.ml b/testsuite/tests/typing-gadts/return_type.ml index ebd5340a699..7c2a16b7ab4 100644 --- a/testsuite/tests/typing-gadts/return_type.ml +++ b/testsuite/tests/typing-gadts/return_type.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type i = int diff --git a/testsuite/tests/typing-gadts/syntactic-arity.ml b/testsuite/tests/typing-gadts/syntactic-arity.ml new file mode 100644 index 00000000000..1edbdcfadf7 --- /dev/null +++ b/testsuite/tests/typing-gadts/syntactic-arity.ml @@ -0,0 +1,169 @@ +(* TEST + expect; +*) + +type nothing = | +type (_, _) eq = Eq : ('a, 'a) eq +[%%expect{| +type nothing = | +type (_, _) eq = Eq : ('a, 'a) eq +|}];; + +(* This definition is a bit unusual, as [type a] is unified with a function type. + This avoids unsoundness. + *) +let ok (type a) ?opt:((Eq : (a, int -> int) eq) = assert false) () : a = + function x -> x + 1;; +[%%expect{| +val ok : + ('a : any) ('b : any). ?opt:('a -> 'b, int -> int) eq -> unit -> 'a -> 'b = + +|}];; + +let (x : string -> nothing) = ok ();; +x "hello";; +[%%expect{| +val x : string -> nothing = +Exception: Assert_failure ("", 1, 50). +|}];; + +(* Notably you can't give [x] non-arrow types; that would be unsound *) +print_endline (ok ());; +[%%expect{| +Line 1, characters 14-21: +1 | print_endline (ok ());; + ^^^^^^^ +Error: This expression has type 'a -> 'b + but an expression was expected of type string + Hint: This function application is partial, + maybe some arguments are missing. +|}];; + +(* And the fully polymorphic definition is rejected. *) +let bad : type a. ?opt:(a, int -> int) eq -> unit -> a = + fun ?opt:((Eq : (a, int -> int) eq) = assert false) () x -> x + 1;; + +[%%expect{| +Line 2, characters 2-67: +2 | fun ?opt:((Eq : (a, int -> int) eq) = assert false) () x -> x + 1;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The syntactic arity of the function doesn't match the type constraint: + This function has 3 syntactic arguments, but its type is constrained to + ?opt:(a, int -> int) eq -> unit -> a. + Hint: consider splitting the function definition into + fun ... gadt_pat -> fun ... + where gadt_pat is the pattern with the GADT constructor that + introduces the local type equation on a. +|}];; + +(* Workaround 1: no GADT in default argument pattern *) + +let workaround1 (type a) ?opt:((opt : (a, int -> int) eq) = assert false) () : a = + match opt with + | Eq -> (function x -> x + 1);; + +[%%expect{| +val workaround1 : ?opt:('a, int -> int) eq -> unit -> 'a = +|}];; + +(* Workaround 2: Use an expression body instead of a function body *) + +let workaround2 (type a) ?opt:((Eq : (a, int -> int) eq) = assert false) () : a = + (function x -> x + 1);; +[%%expect{| +val workaround2 : ?opt:('a, int -> int) eq -> unit -> 'a = +|}];; + +let (x : nothing) = workaround2 ();; +[%%expect{| +Exception: Assert_failure ("", 1, 59). +|}];; + +(* The corresponding check for partial matches on GADTs *) +type (_, _) eq_or_not = + | Eq : ('a, 'a) eq_or_not + | Neq : ('a, 'b) eq_or_not + +let ok (type a) (Eq : (a, int -> int) eq_or_not) : a = + function x -> x + 1;; + +[%%expect{| +type (_, _) eq_or_not = Eq : ('a, 'a) eq_or_not | Neq : ('a, 'b) eq_or_not +Line 5, characters 16-48: +5 | let ok (type a) (Eq : (a, int -> int) eq_or_not) : a = + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +Neq + +val ok : ('a : any) ('b : any). ('a -> 'b, int -> int) eq_or_not -> 'a -> 'b = + +|}];; + +let bad : type a. (a, int -> int) eq_or_not -> a = + fun (Eq : (a, int -> int) eq_or_not) x -> x + 1;; + +[%%expect{| +Line 2, characters 6-38: +2 | fun (Eq : (a, int -> int) eq_or_not) x -> x + 1;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +Neq + +Line 2, characters 2-49: +2 | fun (Eq : (a, int -> int) eq_or_not) x -> x + 1;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The syntactic arity of the function doesn't match the type constraint: + This function has 2 syntactic arguments, but its type is constrained to + (a, int -> int) eq_or_not -> a. + Hint: consider splitting the function definition into + fun ... gadt_pat -> fun ... + where gadt_pat is the pattern with the GADT constructor that + introduces the local type equation on a. +|}];; + + +(* The corresponding check for lazy matches on GADTs *) +let ok (type a) (lazy (Eq : (a, int -> int) eq)) : a = + function x -> x + 1 + +[%%expect{| +val ok : ('a : any) ('b : any). ('a -> 'b, int -> int) eq lazy_t -> 'a -> 'b = + +|}];; + +let bad : type a. (a, int -> int) eq lazy_t -> a = + fun (lazy Eq) x -> x + 1 + +[%%expect{| +Line 2, characters 2-26: +2 | fun (lazy Eq) x -> x + 1 + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The syntactic arity of the function doesn't match the type constraint: + This function has 2 syntactic arguments, but its type is constrained to + (a, int -> int) eq lazy_t -> a. + Hint: consider splitting the function definition into + fun ... gadt_pat -> fun ... + where gadt_pat is the pattern with the GADT constructor that + introduces the local type equation on a. +|}];; + + +(* This definition is rejected but isn't unsound. *) + +let spurious : type a. (a, int -> int) eq -> a = + fun Eq x -> x + +[%%expect{| +Line 2, characters 2-15: +2 | fun Eq x -> x + ^^^^^^^^^^^^^ +Error: The syntactic arity of the function doesn't match the type constraint: + This function has 2 syntactic arguments, but its type is constrained to + (a, int -> int) eq -> a. + Hint: consider splitting the function definition into + fun ... gadt_pat -> fun ... + where gadt_pat is the pattern with the GADT constructor that + introduces the local type equation on a. +|}];; diff --git a/testsuite/tests/typing-gadts/term-conv.ml b/testsuite/tests/typing-gadts/term-conv.ml index 436100bac8a..3c7f008055c 100644 --- a/testsuite/tests/typing-gadts/term-conv.ml +++ b/testsuite/tests/typing-gadts/term-conv.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* HOAS to de Bruijn, by chak *) diff --git a/testsuite/tests/typing-gadts/test.ml b/testsuite/tests/typing-gadts/test.ml index d7edb746e17..1b37b8be008 100644 --- a/testsuite/tests/typing-gadts/test.ml +++ b/testsuite/tests/typing-gadts/test.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Exp = diff --git a/testsuite/tests/typing-gadts/unexpected_existentials.ml b/testsuite/tests/typing-gadts/unexpected_existentials.ml index 5216dc50329..db79e922bb4 100644 --- a/testsuite/tests/typing-gadts/unexpected_existentials.ml +++ b/testsuite/tests/typing-gadts/unexpected_existentials.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** Test the error message for existential types apparearing in unexpected position *) diff --git a/testsuite/tests/typing-gadts/unify_mb.ml b/testsuite/tests/typing-gadts/unify_mb.ml index cea21717f91..7b0fafc0f0c 100644 --- a/testsuite/tests/typing-gadts/unify_mb.ml +++ b/testsuite/tests/typing-gadts/unify_mb.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* First-Order Unification by Structural Recursion *) diff --git a/testsuite/tests/typing-gadts/variables_in_mcomp.ml b/testsuite/tests/typing-gadts/variables_in_mcomp.ml index 0a370454999..8e8985af4d2 100644 --- a/testsuite/tests/typing-gadts/variables_in_mcomp.ml +++ b/testsuite/tests/typing-gadts/variables_in_mcomp.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M = struct diff --git a/testsuite/tests/typing-gadts/yallop_bugs.ml b/testsuite/tests/typing-gadts/yallop_bugs.ml index 24181efc3b7..bdd2a55d7cf 100644 --- a/testsuite/tests/typing-gadts/yallop_bugs.ml +++ b/testsuite/tests/typing-gadts/yallop_bugs.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Injectivity *) diff --git a/testsuite/tests/typing-immediate/immediate.ml b/testsuite/tests/typing-immediate/immediate.ml index fe942adcba4..2b5222fbbd1 100644 --- a/testsuite/tests/typing-immediate/immediate.ml +++ b/testsuite/tests/typing-immediate/immediate.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module type S = sig type t [@@immediate] end;; @@ -143,8 +143,14 @@ end;; Line 2, characters 2-31: 2 | type t = string [@@immediate] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type string has layout value, which is not a sublayout of immediate. +Error: The kind of type string is value + because it is the primitive value type string. + But the kind of type string must be a subkind of immediate + because of the definition of t at line 2, characters 2-31. |}];; +(* CR layouts v2.9: The "of the definition of t ..." part is not great and it + should only refer to definitions that type check. Fixing it will involve + building a second [final_env] in [transl_type_decl] which is costly. *) (* Cannot directly declare a non-immediate type as immediate (variant) *) module B = struct @@ -154,7 +160,10 @@ end;; Line 2, characters 2-41: 2 | type t = Foo of int | Bar [@@immediate] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type t has layout value, which is not a sublayout of immediate. +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of immediate + because of the annotation on the declaration of the type t. |}];; (* Cannot directly declare a non-immediate type as immediate (record) *) @@ -165,7 +174,10 @@ end;; Line 2, characters 2-38: 2 | type t = { foo : int } [@@immediate] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type t has layout value, which is not a sublayout of immediate. +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of immediate + because of the annotation on the declaration of the type t. |}];; (* Not guaranteed that t is immediate, so this is an invalid declaration *) @@ -177,7 +189,10 @@ end;; Line 3, characters 2-26: 3 | type s = t [@@immediate] ^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type t has layout value, which is not a sublayout of immediate. +Error: The kind of type t is value + because of the definition of t at line 2, characters 2-8. + But the kind of type t must be a subkind of immediate + because of the definition of s at line 3, characters 2-26. |}];; (* Can't ascribe to an immediate type signature with a non-immediate type *) @@ -198,12 +213,14 @@ Error: Signature mismatch: type t = string is not included in type t : immediate - the first has layout value, which is not a sublayout of immediate. + The kind of the first is value + because it is the primitive value type string. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 1, characters 15-35. |}];; (* Same as above but with explicit signature *) module M_invalid : S = struct type t = string end;; -module FM_invalid = F (struct type t = string end);; [%%expect{| Line 1, characters 23-49: 1 | module M_invalid : S = struct type t = string end;; @@ -214,7 +231,27 @@ Error: Signature mismatch: type t = string is not included in type t : immediate - the first has layout value, which is not a sublayout of immediate. + The kind of the first is value + because it is the primitive value type string. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 1, characters 20-40. +|}];; + +module FM_invalid = F (struct type t = string end);; +[%%expect{| +Line 1, characters 20-50: +1 | module FM_invalid = F (struct type t = string end);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Modules do not match: sig type t = string end is not included in + S + Type declarations do not match: + type t = string + is not included in + type t : immediate + The kind of the first is value + because it is the primitive value type string. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 1, characters 20-40. |}];; (* Can't use a non-immediate type even if mutually recursive *) @@ -226,7 +263,10 @@ end;; Line 2, characters 2-26: 2 | type t = s [@@immediate] ^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type s has layout value, which is not a sublayout of immediate. +Error: The kind of type s is value + because it is the primitive value type string. + But the kind of type s must be a subkind of immediate + because of the definition of t at line 2, characters 2-26. |}];; diff --git a/testsuite/tests/typing-implicit-source-positions/application_via_option.ml b/testsuite/tests/typing-implicit-source-positions/application_via_option.ml new file mode 100644 index 00000000000..78d6083d921 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/application_via_option.ml @@ -0,0 +1,119 @@ +(* TEST_BELOW +Fille +*) + +let f = fun ~(call_pos:[%call_pos]) () -> call_pos +[%%expect {| +val f : call_pos:[%call_pos] -> unit -> lexing_position = +|}] + +let _ = f ?call_pos:None (); +[%%expect {| +Line 1, characters 20-24: +1 | let _ = f ?call_pos:None (); + ^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + +let _ = + let pos = f () in + f ?call_pos:(Some pos) (); +[%%expect {| +Line 3, characters 14-24: +3 | f ?call_pos:(Some pos) (); + ^^^^^^^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + +let ( >>| ) ~(call_pos : [%call_pos]) a b = a + b, call_pos ;; +[%%expect {| +val ( >>| ) : call_pos:[%call_pos] -> int -> int -> int * lexing_position = + +|}] + +let _ = ( >>| ) ?call_pos:None 1 2 ;; +[%%expect {| +Line 1, characters 27-31: +1 | let _ = ( >>| ) ?call_pos:None 1 2 ;; + ^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + +let _ = + let pos = f () in + ( >>| ) ?call_pos:(Some pos) 1 2 +;; +[%%expect {| +Line 3, characters 20-30: +3 | ( >>| ) ?call_pos:(Some pos) 1 2 + ^^^^^^^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + +class c ~(call_pos : [%call_pos]) () = object + method call_pos = call_pos +end +[%%expect {| +class c : + call_pos:[%call_pos] -> + unit -> object method call_pos : lexing_position end +|}] + +let _ = (new c ?call_pos:None ())#call_pos;; +[%%expect {| +Line 1, characters 25-29: +1 | let _ = (new c ?call_pos:None ())#call_pos;; + ^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + +let _ = + let pos = f () in + (new c ?call_pos:(Some pos) ())#call_pos;; +[%%expect {| +Line 3, characters 19-29: +3 | (new c ?call_pos:(Some pos) ())#call_pos;; + ^^^^^^^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + +class parent ~(call_pos : [%call_pos]) () = object + method pos = call_pos +end +[%%expect {| +class parent : + call_pos:[%call_pos] -> unit -> object method pos : lexing_position end +|}] + +let _ = (object + inherit parent ?call_pos:None () +end)#pos;; +[%%expect {| +Line 2, characters 27-31: +2 | inherit parent ?call_pos:None () + ^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + +let o = (object + inherit parent ?call_pos:(Some (f ())) () +end)#pos +[%%expect {| +Line 2, characters 27-40: +2 | inherit parent ?call_pos:(Some (f ())) () + ^^^^^^^^^^^^^ +Error: the argument labeled 'call_pos' is a [%call_pos] argument, filled in + automatically if ommitted. It cannot be passed with '?'. +|}] + + +(* TEST + expect; +*) diff --git a/testsuite/tests/typing-implicit-source-positions/commuting.ml b/testsuite/tests/typing-implicit-source-positions/commuting.ml new file mode 100644 index 00000000000..6854ed4c75b --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/commuting.ml @@ -0,0 +1,154 @@ +(* TEST + expect; +*) + +let pos_a : lexing_position = {Lexing.dummy_pos with pos_fname = "a"};; +let pos_b : lexing_position = {Lexing.dummy_pos with pos_fname = "b"};; +[%%expect{| +val pos_a : lexing_position = + {pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +val pos_b : lexing_position = + {pos_fname = "b"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +let f = fun ~(a:[%call_pos]) ~(b:[%call_pos]) () -> a, b +[%%expect{| +val f : + a:[%call_pos] -> b:[%call_pos] -> unit -> lexing_position * lexing_position = + +|}] + +let _ = f ~b:pos_b ~a:pos_a () ;; +[%%expect{| +- : lexing_position * lexing_position = +({pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}, + {pos_fname = "b"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}) +|}] + +(* Partial application *) +let x = f ~b:pos_b ;; +let y = x ~a:pos_a ;; +let z = y () ;; +[%%expect {| +val x : a:[%call_pos] -> unit -> lexing_position * lexing_position = +val y : unit -> lexing_position * lexing_position = +val z : lexing_position * lexing_position = + ({pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}, + {pos_fname = "b"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}) +|}] + +let g = fun ~(a:[%call_pos]) ?(c = 0) ~(b:[%call_pos]) () -> a, b, c +[%%expect{| +val g : + a:[%call_pos] -> + ?c:int -> b:[%call_pos] -> unit -> lexing_position * lexing_position * int = + +|}] + +let _ = g ~b:pos_b ~a:pos_a () ;; +[%%expect{| +- : lexing_position * lexing_position * int = +({pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}, + {pos_fname = "b"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}, 0) +|}] + +let h = fun ~(a:[%call_pos]) ~(b:int) () -> a, b +[%%expect{| +val h : a:[%call_pos] -> b:int -> unit -> lexing_position * int = +|}] + +let _ = h ~b:0 ~a:pos_a ();; +[%%expect{| +- : lexing_position * int = +({pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}, 0) +|}] + +let k = fun ~(a:int) ~(a:[%call_pos])() -> a +[%%expect{| +val k : a:int -> a:[%call_pos] -> unit -> lexing_position = +|}] + +let _ = k ~a:Lexing.dummy_pos ~a:0 ();; +[%%expect{| +Line 1, characters 13-29: +1 | let _ = k ~a:Lexing.dummy_pos ~a:0 ();; + ^^^^^^^^^^^^^^^^ +Error: This expression has type Lexing.position = lexing_position + but an expression was expected of type int +|}] + +let _ = k ~a:0 ~a:Lexing.dummy_pos ();; +[%%expect{| +- : Lexing.position = +{Lexing.pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +(* Labels on source positions can't commute in definitions *) +let m : a:[%call_pos] -> b:[%call_pos] -> unit -> unit = fun ~(b:[%call_pos]) ~(a:[%call_pos]) () -> () +[%%expect{| +Line 1, characters 57-103: +1 | let m : a:[%call_pos] -> b:[%call_pos] -> unit -> unit = fun ~(b:[%call_pos]) ~(a:[%call_pos]) () -> () + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This function should have type + a:[%call_pos] -> b:[%call_pos] -> unit -> unit + but its first argument is ~(b:[%call_pos]) instead of ~(a:[%call_pos]) +|}] + +(* Object system *) + +class c ~(a : [%call_pos]) ~(b : [%call_pos]) () = + object + method x = a, b + end +[%%expect{| +class c : + a:[%call_pos] -> + b:[%call_pos] -> + unit -> object method x : lexing_position * lexing_position end +|}] + +(* Object system partial application *) +let x = new c ~b:pos_b ;; +let y = x ~a:pos_a ;; +let a, b = (y ())#x ;; +[%%expect{| +val x : a:[%call_pos] -> unit -> c = +val y : unit -> c = +val a : lexing_position = + {pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +val b : lexing_position = + {pos_fname = "b"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +(* Labels on source positions can't commute in class definitions *) +class m : a:[%call_pos] -> b:[%call_pos] -> unit -> object end = + fun ~(b:[%call_pos]) ~(a:[%call_pos]) () -> object end +[%%expect{| +Line 2, characters 6-56: +2 | fun ~(b:[%call_pos]) ~(a:[%call_pos]) () -> object end + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The class type b:[%call_pos] -> a:[%call_pos] -> unit -> object end + is not matched by the class type + a:[%call_pos] -> b:[%call_pos] -> unit -> object end +|}] + +(* [%call_pos] is distinct from lexing_position *) +class c : + a:lexing_position -> b:[%call_pos] -> unit -> object + method x : lexing_position * lexing_position + end = fun ~(a : [%call_pos]) ~b () -> object + method x = a, b + end +[%%expect{| +Lines 4-6, characters 12-5: +4 | ............~(a : [%call_pos]) ~b () -> object +5 | method x = a, b +6 | end +Error: The class type + a:[%call_pos] -> b:'b -> unit -> object method x : 'a * 'b end + is not matched by the class type + a:lexing_position -> + b:[%call_pos] -> + unit -> object method x : lexing_position * lexing_position end +|}] + diff --git a/testsuite/tests/typing-implicit-source-positions/expressions.ml b/testsuite/tests/typing-implicit-source-positions/expressions.ml new file mode 100644 index 00000000000..97d0653184d --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/expressions.ml @@ -0,0 +1,32 @@ +(* TEST_BELOW +Fille +*) + +let x = [%src_pos] +[%%expect{| +val x : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 24; pos_cnum = 32} +|}] + +let f = fun ~(call_pos:[%call_pos]) () -> call_pos +[%%expect{| +val f : call_pos:[%call_pos] -> unit -> lexing_position = +|}] + +let _ = f ~call_pos:x () ;; +[%%expect{| +- : lexing_position = +{pos_fname = ""; pos_lnum = 1; pos_bol = 24; pos_cnum = 32} +|}] + +let _ = "Increment line count" +let _ = f ~call_pos:[%src_pos] () ;; +[%%expect{| +- : string = "Increment line count" +- : lexing_position = +{pos_fname = ""; pos_lnum = 2; pos_bol = 438; pos_cnum = 458} +|}] + +(* TEST + expect; +*) diff --git a/testsuite/tests/typing-implicit-source-positions/fn_decl_and_defn.ml b/testsuite/tests/typing-implicit-source-positions/fn_decl_and_defn.ml new file mode 100644 index 00000000000..10c6be7d785 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/fn_decl_and_defn.ml @@ -0,0 +1,41 @@ +(* TEST + expect; +*) + +type t = call_pos:[%call_pos] -> unit -> unit + +[%%expect {| +type t = call_pos:[%call_pos] -> unit -> unit +|}] + +let f : t = fun ~(call_pos:[%call_pos]) () -> () + +[%%expect{| +val f : t = +|}] + +let g ~(call_pos:[%call_pos]) () = () + +[%%expect{| +val g : call_pos:[%call_pos] -> unit -> unit = +|}] + +let apply (f : t) = f ~call_pos:Lexing.dummy_pos () ;; +[%%expect {| +val apply : t -> unit = +|}] + +let _ = apply f ;; +[%%expect{| +- : unit = () +|}] + +let _ = apply g ;; +[%%expect{| +- : unit = () +|}] + +let _ = g ~call_pos:Lexing.dummy_pos () ;; +[%%expect{| +- : unit = () +|}] diff --git a/testsuite/tests/typing-implicit-source-positions/implicit_argument.ml b/testsuite/tests/typing-implicit-source-positions/implicit_argument.ml new file mode 100644 index 00000000000..89dcb424fe2 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/implicit_argument.ml @@ -0,0 +1,87 @@ +(* TEST_BELOW +Fille +*) + +let f = fun ~(call_pos:[%call_pos]) () -> call_pos +[%%expect{| +val f : call_pos:[%call_pos] -> unit -> lexing_position = +|}] + +let _ = f ();; +[%%expect{| +- : lexing_position = +{pos_fname = ""; pos_lnum = 1; pos_bol = 156; pos_cnum = 164} +|}] + +let j = (f : unit -> lexing_position);; +[%%expect{| +val j : unit -> lexing_position = +|}] + +let g = fun ~(a:[%call_pos]) ?(c = 0) ~(b:[%call_pos]) () -> a, b +[%%expect{| +val g : + a:[%call_pos] -> + ?c:int -> b:[%call_pos] -> unit -> lexing_position * lexing_position = + +|}] + +let _ = g () ;; +[%%expect{| +- : lexing_position * lexing_position = +({pos_fname = ""; pos_lnum = 1; pos_bol = 560; pos_cnum = 568}, + {pos_fname = ""; pos_lnum = 1; pos_bol = 560; pos_cnum = 568}) +|}] + +let h ~(a:[%call_pos]) ~(b:[%call_pos]) () : lexing_position * lexing_position + = a, b +[%%expect{| +val h : + a:[%call_pos] -> b:[%call_pos] -> unit -> lexing_position * lexing_position = + +|}] + +(* Partial application *) +let x = h ~b:{Lexing.dummy_pos with pos_fname = "b"};; +[%%expect{| +val x : a:[%call_pos] -> unit -> lexing_position * lexing_position = +|}] + +let y = x ();; +[%%expect{| +val y : lexing_position * lexing_position = + ({pos_fname = ""; pos_lnum = 1; pos_bol = 1135; pos_cnum = 1143}, + {pos_fname = "b"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1}) +|}] + +let k = (f : unit -> lexing_position);; +[%%expect{| +val k : unit -> lexing_position = +|}] + +let _ = j ();; +[%%expect{| +- : lexing_position = +{pos_fname = ""; pos_lnum = 1; pos_bol = 272; pos_cnum = 281} +|}] + +let _ = k ();; +[%%expect{| +- : lexing_position = +{pos_fname = ""; pos_lnum = 1; pos_bol = 1343; pos_cnum = 1352} +|}] + +let m ~(call_pos:[%call_pos]) = () +[%%expect {| +Line 1, characters 8-16: +1 | let m ~(call_pos:[%call_pos]) = () + ^^^^^^^^ +Warning 188 [unerasable-position-argument]: this position argument cannot be erased. + +val m : call_pos:[%call_pos] -> unit = +|}] + + +(* TEST + expect; +*) diff --git a/testsuite/tests/typing-implicit-source-positions/invalid_usages.ml b/testsuite/tests/typing-implicit-source-positions/invalid_usages.ml new file mode 100644 index 00000000000..999355d8948 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/invalid_usages.ml @@ -0,0 +1,130 @@ +(* TEST + expect; +*) + +type t = [%call_pos] +[%%expect {| +Line 1, characters 11-19: +1 | type t = [%call_pos] + ^^^^^^^^ +Error: [%call_pos] can only exist as the type of a labelled argument +|}] + +type t = unit -> unit -> [%call_pos] +[%%expect {| +Line 1, characters 27-35: +1 | type t = unit -> unit -> [%call_pos] + ^^^^^^^^ +Error: [%call_pos] can only exist as the type of a labelled argument +|}] + +let f ~(call_pos:[%call_pos]) () : [%call_pos] = call_pos + +[%%expect{| +Line 1, characters 37-45: +1 | let f ~(call_pos:[%call_pos]) () : [%call_pos] = call_pos + ^^^^^^^^ +Error: [%call_pos] can only exist as the type of a labelled argument +|}] + +let apply f = f ~call_pos:Lexing.dummy_pos () ;; +[%%expect {| +val apply : (call_pos:Lexing.position -> unit -> 'a) -> 'a = +|}] + +let g = fun ~(call_pos:[%call_pos]) () -> () +[%%expect{| +val g : call_pos:[%call_pos] -> unit -> unit = +|}] + +let _ = apply g ;; +[%%expect{| +Line 1, characters 14-15: +1 | let _ = apply g ;; + ^ +Error: This expression has type call_pos:[%call_pos] -> unit -> unit + but an expression was expected of type + call_pos:Lexing.position -> unit -> 'a +|}] + +let h ?(call_pos:[%call_pos]) () = () +[%%expect{| +Line 1, characters 17-28: +1 | let h ?(call_pos:[%call_pos]) () = () + ^^^^^^^^^^^ +Error: A position argument must not be optional. +|}] + +let j (call_pos:[%call_pos]) () = () +[%%expect{| +Line 1, characters 16-27: +1 | let j (call_pos:[%call_pos]) () = () + ^^^^^^^^^^^ +Error: A position argument must not be unlabelled. +|}] + +let k : call_pos:[%call_pos] -> unit -> unit = + fun ~call_pos () -> () +[%%expect{| +Line 2, characters 3-25: +2 | fun ~call_pos () -> () + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This function should have type call_pos:[%call_pos] -> unit -> unit + but its first argument is labeled ~call_pos + instead of ~(call_pos:[%call_pos]) +Hint: Consider explicitly annotating the label with '[%call_pos]' +|}] + +let n = fun ~(call_pos:[%call_pos]) () -> call_pos +[%%expect{| +val n : call_pos:[%call_pos] -> unit -> lexing_position = +|}] + +let _ = n Lexing.dummy_pos ();; +[%%expect {| +Line 1, characters 27-29: +1 | let _ = n Lexing.dummy_pos ();; + ^^ +Error: The function applied to this argument has type + call_pos:[%call_pos] -> lexing_position +This argument cannot be applied without label +|}] + +class this_class_has_an_unerasable_argument ~(pos : [%call_pos]) = object end + +[%%expect{| +Line 1, characters 46-49: +1 | class this_class_has_an_unerasable_argument ~(pos : [%call_pos]) = object end + ^^^ +Warning 188 [unerasable-position-argument]: this position argument cannot be erased. + +class this_class_has_an_unerasable_argument : pos:[%call_pos] -> object end +|}] + +class c = object + method this_method_has_an_unerasable_argument ~(pos : [%call_pos]) = pos +end +[%%expect{| +Line 2, characters 50-53: +2 | method this_method_has_an_unerasable_argument ~(pos : [%call_pos]) = pos + ^^^ +Warning 188 [unerasable-position-argument]: this position argument cannot be erased. + +class c : + object + method this_method_has_an_unerasable_argument : + pos:[%call_pos] -> lexing_position + end +|}] + +let this_object_has_an_unerasable_argument ~(pos : [%call_pos]) = object end + +[%%expect{| +Line 1, characters 45-48: +1 | let this_object_has_an_unerasable_argument ~(pos : [%call_pos]) = object end + ^^^ +Warning 188 [unerasable-position-argument]: this position argument cannot be erased. + +val this_object_has_an_unerasable_argument : pos:[%call_pos] -> < > = +|}] + diff --git a/testsuite/tests/typing-implicit-source-positions/let_operators.ml b/testsuite/tests/typing-implicit-source-positions/let_operators.ml new file mode 100644 index 00000000000..125e70104ca --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/let_operators.ml @@ -0,0 +1,56 @@ +(* TEST_BELOW +Fille +*) + +let ( let+ ) ~(call_pos : [%call_pos]) a f = f (call_pos, a);; +[%%expect{| +val ( let+ ) : + call_pos:[%call_pos] -> 'a -> (lexing_position * 'a -> 'b) -> 'b = +|}] + +(* Would be nice to add support for implicit position parameters and (also maybe optional + arguments) for let operators. *) +let _ = + let+ (call_pos, a) = 1 in + call_pos + +[%%expect{| +Line 2, characters 2-6: +2 | let+ (call_pos, a) = 1 in + ^^^^ +Error: The operator let+ has type + call_pos:[%call_pos] -> 'a -> (lexing_position * 'a -> 'b) -> 'b + but it was expected to have type 'c -> ('d -> 'e) -> 'f +|}] + +let ( let* ) ?(call_pos = 1) a g = g (call_pos, a);; + +let _ = + let* (call_pos, a) = 1 in + call_pos + +[%%expect{| +val ( let* ) : ?call_pos:int -> 'a -> (int * 'a -> 'b) -> 'b = +Line 4, characters 2-6: +4 | let* (call_pos, a) = 1 in + ^^^^ +Error: The operator let* has type + ?call_pos:int -> 'a -> (int * 'a -> 'b) -> 'b + but it was expected to have type 'c -> ('d -> 'e) -> 'f +|}] + +(* Infix operators work! *) +let ( >>| ) ~(call_pos : [%call_pos]) x f = f (call_pos, x) +let _ = + 1 >>| fun (call_pos, a) -> call_pos + +[%%expect{| +val ( >>| ) : + call_pos:[%call_pos] -> 'a -> (lexing_position * 'a -> 'b) -> 'b = +- : lexing_position = +{pos_fname = ""; pos_lnum = 3; pos_bol = 1128; pos_cnum = 1132} +|}] + +(* TEST + expect; +*) diff --git a/testsuite/tests/typing-implicit-source-positions/location_with_directory.ml b/testsuite/tests/typing-implicit-source-positions/location_with_directory.ml new file mode 100644 index 00000000000..a7a4729361f --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/location_with_directory.ml @@ -0,0 +1,7 @@ +(* TEST + flags = "-directory app/foo"; + native; +*) + +let f = fun ~(call_pos:[%call_pos]) () -> call_pos +let _ = print_string (f ()).pos_fname;; diff --git a/testsuite/tests/typing-implicit-source-positions/location_with_directory.reference b/testsuite/tests/typing-implicit-source-positions/location_with_directory.reference new file mode 100644 index 00000000000..7b7db926af4 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/location_with_directory.reference @@ -0,0 +1 @@ +app/foo/location_with_directory.ml \ No newline at end of file diff --git a/testsuite/tests/typing-implicit-source-positions/object_system.ml b/testsuite/tests/typing-implicit-source-positions/object_system.ml new file mode 100644 index 00000000000..61c74477f47 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/object_system.ml @@ -0,0 +1,226 @@ +(* TEST_BELOW +Fille +*) + +let object_with_a_method_with_a_positional_parameter = object + method m ~(call_pos : [%call_pos]) () = call_pos +end + +[%%expect{| +val object_with_a_method_with_a_positional_parameter : + < m : call_pos:[%call_pos] -> unit -> lexing_position > = +|}] + +let position = object_with_a_method_with_a_positional_parameter#m ();; + +[%%expect{| +val position : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 281; pos_cnum = 296} +|}] + +class class_with_a_method_with_a_positional_parameter = object + method m ~(call_pos : [%call_pos]) () = call_pos +end + +[%%expect{| +class class_with_a_method_with_a_positional_parameter : + object method m : call_pos:[%call_pos] -> unit -> lexing_position end +|}] + +let o = new class_with_a_method_with_a_positional_parameter;; + +[%%expect{| +val o : class_with_a_method_with_a_positional_parameter = +|}] + +let position = o#m ();; + +[%%expect{| +val position : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 876; pos_cnum = 891} +|}] + +let position = (new class_with_a_method_with_a_positional_parameter)#m ();; + +[%%expect{| +val position : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 1015; pos_cnum = 1030} +|}] + + +class class_with_positional_parameter ~(call_pos : [%call_pos]) () = object + method call_pos = call_pos +end + +[%%expect{| +class class_with_positional_parameter : + call_pos:[%call_pos] -> + unit -> object method call_pos : lexing_position end +|}] + +let o = new class_with_positional_parameter () +let position = o#call_pos + +[%%expect{| +val o : class_with_positional_parameter = +val position : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 1458; pos_cnum = 1466} +|}] + + +(* Different kinds of shadowed parameters (both a class parameter is shadowed and a + method parameter is shadowed) *) + +class c ~(call_pos : [%call_pos]) () = object(self) + method from_class_param = call_pos + + method m ~(call_pos : [%call_pos]) () = call_pos, self#from_class_param +end +[%%expect{| +class c : + call_pos:[%call_pos] -> + unit -> + object + method from_class_param : lexing_position + method m : + call_pos:[%call_pos] -> unit -> lexing_position * lexing_position + end +|}] + +let c = (new c ()) +let from_method_param, from_class_param = c#m() + +[%%expect{| +val c : c = +val from_method_param : lexing_position = + {pos_fname = ""; pos_lnum = 2; pos_bol = 2216; pos_cnum = 2258} +val from_class_param : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 2197; pos_cnum = 2206} +|}] + +class parent ~(call_pos : [%call_pos]) () = object + method pos = call_pos +end + +let o = object + inherit parent () +end +let position = o#pos + +[%%expect{| +class parent : + call_pos:[%call_pos] -> unit -> object method pos : lexing_position end +val o : parent = +val position : lexing_position = + {pos_fname = ""; pos_lnum = 6; pos_bol = 2611; pos_cnum = 2621} +|}] + +let o ~(call_pos : [%call_pos]) () = object + inherit parent ~call_pos () +end +let position = (o ())#pos + +[%%expect{| +val o : call_pos:[%call_pos] -> unit -> parent = +val position : lexing_position = + {pos_fname = ""; pos_lnum = 4; pos_bol = 2964; pos_cnum = 2980} +|}] + +(* Applying an call_pos argument without a label. *) +let o ~(call_pos : [%call_pos]) () = object + inherit parent call_pos () +end +let position = (o ())#pos + +[%%expect{| +Line 2, characters 10-16: +2 | inherit parent call_pos () + ^^^^^^ +Warning 6 [labels-omitted]: label call_pos was omitted in the application of this function. + +val o : call_pos:[%call_pos] -> unit -> parent = +val position : lexing_position = + {pos_fname = ""; pos_lnum = 4; pos_bol = 3293; pos_cnum = 3309} +|}] + + +(* Same behavior as optional parameters. *) +class parent ?(i = 1) () = object + method i = i +end + +let o = object + inherit parent () +end +let position = o#i + +[%%expect{| +class parent : ?i:int -> unit -> object method i : int end +val o : parent = +val position : int = 1 +|}] + +(* Partially applying a class *) +class c ~(a : [%call_pos]) ~(b : [%call_pos]) () = + object + method a = a + method b = b + end + +[%%expect{| +class c : + a:[%call_pos] -> + b:[%call_pos] -> + unit -> object method a : lexing_position method b : lexing_position end +|}] + +let pos_a : lexing_position = {Lexing.dummy_pos with pos_fname = "a"};; +let partially_applied_class = new c ~a:pos_a + +[%%expect{| +val pos_a : lexing_position = + {pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +val partially_applied_class : b:[%call_pos] -> unit -> c = +|}] + +let fully_applied_class = partially_applied_class () + +[%%expect{| +val fully_applied_class : c = +|}] + +let a, b = fully_applied_class#a, fully_applied_class#b + +[%%expect{| +val a : lexing_position = + {pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +val b : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 4512; pos_cnum = 4538} +|}] + +class c : + x:[%call_pos] -> y:lexing_position -> unit -> object + method xy : lexing_position * lexing_position + end = fun ~(x : [%call_pos]) ~y () -> object + method xy = x, y + end + +[%%expect{| +class c : + x:[%call_pos] -> + y:lexing_position -> + unit -> object method xy : lexing_position * lexing_position end +|}] + +let x, y = (new c ~y:pos_a ())#xy + +[%%expect{| +val x : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 5199; pos_cnum = 5211} +val y : lexing_position = + {pos_fname = "a"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +(* TEST + expect; +*) diff --git a/testsuite/tests/typing-implicit-source-positions/recursion.ml b/testsuite/tests/typing-implicit-source-positions/recursion.ml new file mode 100644 index 00000000000..b8e0e0f2843 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/recursion.ml @@ -0,0 +1,49 @@ +(* TEST + expect; +*) + +type t = { + pos_fname : string; + pos_lnum : int; + pos_bol : int; + pos_cnum : int; +} +[%%expect{| +type t = { + pos_fname : string; + pos_lnum : int; + pos_bol : int; + pos_cnum : int; +} +|}] + +(* type-based disambiguation *) +let rec f ~(call_pos:[%call_pos]) i = + if i < 0 then 0 + else f ~call_pos:{ pos_fname = "" + ; pos_lnum = 0 + ; pos_bol = 0 + ; pos_cnum = -1 } + (i - 1) +[%%expect {| +val f : call_pos:[%call_pos] -> int -> int = +|}] + +let y = { pos_fname = "" + ; pos_lnum = 0 + ; pos_bol = 0 + ; pos_cnum = -1 } +[%%expect {| +val y : t = {pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +let rec g ~(call_pos:[%call_pos]) i = + if i < 0 then 0 + else g ~call_pos:y (i - 1) +[%%expect {| +Line 3, characters 19-20: +3 | else g ~call_pos:y (i - 1) + ^ +Error: This expression has type t but an expression was expected of type + lexing_position +|}] diff --git a/testsuite/tests/typing-implicit-source-positions/rev_apply_correct_location.ml b/testsuite/tests/typing-implicit-source-positions/rev_apply_correct_location.ml new file mode 100644 index 00000000000..11023bb403b --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/rev_apply_correct_location.ml @@ -0,0 +1,45 @@ +(* TEST + expect; +*) + +let f ~(here : [%call_pos]) x = here, x + +[%%expect + {| +val f : here:[%call_pos] -> 'a -> lexing_position * 'a = +|}] + +let result = () |> f |> f + +(* Importantly, these locations are different. *) +[%%expect + {| +val result : lexing_position * (lexing_position * unit) = + ({pos_fname = ""; pos_lnum = 1; pos_bol = 145; pos_cnum = 169}, + ({pos_fname = ""; pos_lnum = 1; pos_bol = 145; pos_cnum = 164}, ())) +|}] + +class ['a] c : here:[%call_pos] -> 'a -> object + method here : lexing_position * 'a + end = fun ~(here : [%call_pos]) a -> object + method here = here, a + end + +[%%expect{| +class ['a] c : + here:[%call_pos] -> 'a -> object method here : lexing_position * 'a end +|}] + +let obj = (() |> new c |> new c) + +let second_here = fst obj#here +let first_here = fst (snd obj#here)#here + + +[%%expect{| +val obj : unit c c = +val second_here : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 710; pos_cnum = 736} +val first_here : lexing_position = + {pos_fname = ""; pos_lnum = 1; pos_bol = 710; pos_cnum = 727} +|}] diff --git a/testsuite/tests/typing-implicit-source-positions/shadowing.ml b/testsuite/tests/typing-implicit-source-positions/shadowing.ml new file mode 100644 index 00000000000..dc8d32e727a --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/shadowing.ml @@ -0,0 +1,60 @@ +(* TEST + expect; +*) + +(* Shadowing *) + +type lexing_position = int +[%%expect{| +type lexing_position = int +|}] + +(* src_pos works *) +let f ~(call_pos:[%call_pos]) () = ();; +[%%expect{| +val f : call_pos:[%call_pos] -> unit -> unit = +|}] + +let _ = f ~call_pos:Lexing.dummy_pos () ;; +[%%expect{| +- : unit = () +|}] + +(* new type works *) +let h (x : lexing_position) = x ;; +[%%expect{| +val h : lexing_position -> lexing_position = +|}] + +let _ = h 5;; +[%%expect {| +- : lexing_position = 5 +|}] + +(* Works with class parameters *) +class c ~(call_pos : [%call_pos]) () = object end + +[%%expect {| +class c : call_pos:[%call_pos] -> unit -> object end +|}] + +let _ = new c ~call_pos:Lexing.dummy_pos ();; + +[%%expect{| +- : c = +|}] + +(* Works with object method parameters *) +let o = object + method m ~(call_pos : [%call_pos]) () = () +end + +[%%expect {| +val o : < m : call_pos:[%call_pos] -> unit -> unit > = +|}] + +let _ = o#m ~call_pos:Lexing.dummy_pos () + +[%%expect{| +- : unit = () +|}] diff --git a/testsuite/tests/typing-implicit-source-positions/synonyms.ml b/testsuite/tests/typing-implicit-source-positions/synonyms.ml new file mode 100644 index 00000000000..121765263d7 --- /dev/null +++ b/testsuite/tests/typing-implicit-source-positions/synonyms.ml @@ -0,0 +1,45 @@ +(* TEST + expect; +*) + +(* lexing_position and Lexing.position are synonyms *) +let x = Lexing.dummy_pos;; +[%%expect {| +val x : Lexing.position = + {Lexing.pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +let y : lexing_position = x;; +[%%expect {| +val y : lexing_position = + {pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +let predef_to_module ~(call_pos:[%call_pos]) () : Lexing.position = call_pos ;; +[%%expect{| +val predef_to_module : call_pos:[%call_pos] -> unit -> Lexing.position = + +|}] + +let module_to_predef (call_pos:Lexing.position) : lexing_position = call_pos ;; +[%%expect{| +val module_to_predef : Lexing.position -> lexing_position = +|}] + +let x = predef_to_module ~call_pos:Lexing.dummy_pos ();; +[%%expect{| +val x : Lexing.position = + {Lexing.pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +let y = module_to_predef Lexing.dummy_pos;; +[%%expect{| +val y : lexing_position = + {pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = -1} +|}] + +(* Fields accessible from within Lexing module *) +let _ = x.Lexing.pos_cnum = y.Lexing.pos_cnum && x.pos_cnum = y.pos_cnum && x.Lexing.pos_cnum = x.pos_cnum +[%%expect{| +- : bool = true +|}] diff --git a/testsuite/tests/typing-implicit_unpack/implicit_unpack.ml b/testsuite/tests/typing-implicit_unpack/implicit_unpack.ml index f967e0be9ea..ae5fbbfad83 100644 --- a/testsuite/tests/typing-implicit_unpack/implicit_unpack.ml +++ b/testsuite/tests/typing-implicit_unpack/implicit_unpack.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* diff --git a/testsuite/tests/typing-kind/kind_mismatch.ml b/testsuite/tests/typing-kind/kind_mismatch.ml index 93f5e54d974..003645f7ede 100644 --- a/testsuite/tests/typing-kind/kind_mismatch.ml +++ b/testsuite/tests/typing-kind/kind_mismatch.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** Error messages for kind mismatches. *) diff --git a/testsuite/tests/typing-labeled-tuples/labeled_tuple_patterns.ml b/testsuite/tests/typing-labeled-tuples/labeled_tuple_patterns.ml new file mode 100644 index 00000000000..f0fc300d6e0 --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeled_tuple_patterns.ml @@ -0,0 +1,641 @@ +(* TEST + flags = "-extension labeled_tuples"; + expect; +*) + +(* Test match statements with exception patterns *) + +exception Odd + +let x_must_be_even (~x, y) = + if x mod 2 = 1 then + raise Odd + else + (~x, y) + +let foo xy k_good k_bad = + match x_must_be_even xy with + | (~x, y) -> k_good () + | exception Odd -> k_bad () +[%%expect{| +exception Odd +val x_must_be_even : (x:int * 'a) -> x:int * 'a = +val foo : (x:int * 'a) -> (unit -> 'b) -> (unit -> 'b) -> 'b = +|}] + +(* Test correctness *) +let _ = foo (~x:2, 5) (fun () -> true) (fun () -> false) +let _ = foo (~x:3, 5) (fun () -> false) (fun () -> true) +[%%expect{| +- : bool = true +- : bool = true +|}] + +(* Test that the actions occur outside of the exception handler *) +let _ = + try + foo (~x:2, 5) (fun () -> raise Odd) (fun () -> false) + with Odd -> true +let _ = + try + foo (~x:3, 5) (fun () -> false) (fun () -> raise Odd) + with Odd -> true +[%%expect{| +- : bool = true +- : bool = true +|}] + +(* Labeled tuple pattern *) +let (~x:x0, ~y:y0, _) = ~x: 1, ~y: 2, "ignore me" +[%%expect{| +val x0 : int = 1 +val y0 : int = 2 +|}] + +(* Pattern with punning and type annotation *) +let (~(x:int), ~y, _) = ~x: 1, ~y: 2, "ignore me" +[%%expect{| +val x : int = 1 +val y : int = 2 +|}] + +(* Patterns in functions *) +let f = fun (~foo, ~bar:bar) -> foo * 10 + bar +let bar = 5 +let _ = f (~foo:1, ~bar) +[%%expect{| +val f : (foo:int * bar:int) -> int = +val bar : int = 5 +- : int = 15 +|}] + +(* Correct annotation *) +let f : (foo:int * bar:int) -> int = + fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +val f : (foo:int * bar:int) -> int = +|}] + +let f = fun (~foo, ~bar:bar) : (foo:int * bar:int) -> foo * 10 + bar +[%%expect{| +Line 1, characters 54-68: +1 | let f = fun (~foo, ~bar:bar) : (foo:int * bar:int) -> foo * 10 + bar + ^^^^^^^^^^^^^^ +Error: This expression has type int but an expression was expected of type + foo:int * bar:int +|}] + +(* Missing label *) +let f : (int * bar:int) -> int = fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +Line 1, characters 37-53: +1 | let f : (int * bar:int) -> int = fun (~foo, ~bar:bar) -> foo * 10 + bar + ^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type int * bar:int, + but it is missing an unlabeled component. +|}] + +let f = fun (~foo, ~bar:bar) : (foo:int * int) -> foo * 10 + bar +[%%expect{| +Line 1, characters 50-64: +1 | let f = fun (~foo, ~bar:bar) : (foo:int * int) -> foo * 10 + bar + ^^^^^^^^^^^^^^ +Error: This expression has type int but an expression was expected of type + foo:int * int +|}] + +(* Wrong label *) +let f : (foo:int * foo:int) -> int = + fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +Line 2, characters 7-23: +2 | fun (~foo, ~bar:bar) -> foo * 10 + bar + ^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type foo:int * foo:int, + but it is missing a component with label foo. + Hint: use .. to ignore some components. +|}] + +(* Wrong type *) +let f : (foo:float * foo:int) -> int = + fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +Line 2, characters 7-23: +2 | fun (~foo, ~bar:bar) -> foo * 10 + bar + ^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type foo:float * foo:int, + but it is missing a component with label foo. + Hint: use .. to ignore some components. +|}] + +(* Annotated pattern *) +let f (~x,y : (x:int * int)) : int = x + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +(* Misannotated pattern *) +let f (~x,y : (int * int)) : int = x + y +[%%expect{| +Line 1, characters 7-11: +1 | let f (~x,y : (int * int)) : int = x + y + ^^^^ +Error: This pattern was expected to match values of type int * int, + but it is missing an unlabeled component. +|}] + +let f (~x,y : (int * x:int)) : int = x + y +[%%expect{| +val f : int * x:int -> int = +|}] + +(* Annotation within pattern *) +let f (~(x:int),y : (x:int * int)) : int = x + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +let f (~(x:int),y) = x + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +let f (~x:(x0:int),y) = x0 + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +(* Misannotation within pattern *) +let f (~(x:float),y) = x + y +[%%expect{| +Line 1, characters 23-24: +1 | let f (~(x:float),y) = x + y + ^ +Error: This expression has type float but an expression was expected of type + int +|}] +(* Reordering in functions *) +type xy = (x:int * y:int) +type yx = (y:int * x:int) +let xy_id (pt : xy) = pt +let yx_id (pt : yx) = pt +[%%expect{| +type xy = x:int * y:int +type yx = y:int * x:int +val xy_id : xy -> xy = +val yx_id : yx -> yx = +|}] + +let xy_id (~y, ~x) : xy = ~x, ~y +[%%expect{| +val xy_id : (y:int * x:int) -> xy = +|}] + + +let swap (~x, ~y) = ~y, ~x +[%%expect{| +val swap : (x:'a * y:'b) -> y:'b * x:'a = +|}] + +let swap (~y, ~x : xy) = ~y, ~x +[%%expect{| +val swap : xy -> y:int * x:int = +|}] + +let swap (~x, ~y) = (~x, ~y : yx) +[%%expect{| +Line 1, characters 21-27: +1 | let swap (~x, ~y) = (~x, ~y : yx) + ^^^^^^ +Error: This expression has type x:'a * y:'b + but an expression was expected of type yx = y:int * x:int +|}] + +let swap (pt : xy) : yx = pt +[%%expect{| +Line 1, characters 26-28: +1 | let swap (pt : xy) : yx = pt + ^^ +Error: This expression has type xy = x:int * y:int + but an expression was expected of type yx = y:int * x:int +|}] + +let swap : xy -> yx = Fun.id +[%%expect{| +Line 1, characters 22-28: +1 | let swap : xy -> yx = Fun.id + ^^^^^^ +Error: This expression has type xy -> xy + but an expression was expected of type xy -> yx + Type xy = x:int * y:int is not compatible with type yx = y:int * x:int +|}] + +let swap : xy -> yx = xy_id +[%%expect{| +Line 1, characters 22-27: +1 | let swap : xy -> yx = xy_id + ^^^^^ +Error: This expression has type (y:int * x:int) -> xy + but an expression was expected of type xy -> yx + Type y:int * x:int is not compatible with type xy = x:int * y:int +|}] + +let swap : xy -> yx = yx_id +[%%expect{| +Line 1, characters 22-27: +1 | let swap : xy -> yx = yx_id + ^^^^^ +Error: This expression has type yx -> yx + but an expression was expected of type xy -> yx + Type yx = y:int * x:int is not compatible with type xy = x:int * y:int +|}] + +(* Reordering and partial matches *) +let lt = ~x:1, ~y:2, ~x:3, 4 + +(* Full match, in order *) +let matches = + let ~x, ~y, ~x:x2, z = lt in + x, y, x2, z +[%%expect{| +val lt : x:int * y:int * x:int * int = (~x:1, ~y:2, ~x:3, 4) +val matches : int * int * int * int = (1, 2, 3, 4) +|}] + +(* Full match, over-bound *) +let matches = + let ~x, ~y, ~x, z = lt in + x, y, z +[%%expect{| +Line 2, characters 15-16: +2 | let ~x, ~y, ~x, z = lt in + ^ +Error: Variable x is bound several times in this matching +|}] + +(* Full match, missing label *) +let matches = + let ~x, ~y, z = lt in + x, y, z +[%%expect{| +Line 2, characters 6-15: +2 | let ~x, ~y, z = lt in + ^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it is missing a component with label x. + Hint: use .. to ignore some components. +|}] + +(* Full match, wrong label *) +let matches = + let ~x, ~y, ~w, z = lt in + x, y, z +[%%expect{| +Line 2, characters 6-19: +2 | let ~x, ~y, ~w, z = lt in + ^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it is missing a component with label x. + Hint: use .. to ignore some components. +|}] + +(* Full match, extra label *) +let matches = + let ~x, ~y, ~x, ~y, z = lt in + x, y, z +[%%expect{| +Line 2, characters 6-23: +2 | let ~x, ~y, ~x, ~y, z = lt in + ^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it contains an extra component with label y. +|}] + +(* Full match, extra unlabeled label *) +let matches = + let ~x, ~y, ~x, z, w = lt in + x, y, z +[%%expect{| +Line 2, characters 6-22: +2 | let ~x, ~y, ~x, z, w = lt in + ^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it contains an extra unlabeled component. +|}] + + +(* Partial match *) +let matches = + let ~x, ~y, .. = lt in + x, y +[%%expect{| +val matches : int * int = (1, 2) +|}] + +(* Partial match, reordered *) +let matches = + let ~y, ~x, .. = lt in + x, y +[%%expect{| +val matches : int * int = (1, 2) +|}] + +(* Partial match, reordered, over-bound *) +let matches = + let ~y:x, ~x, .. = lt in + x +[%%expect{| +Line 2, characters 9-10: +2 | let ~y:x, ~x, .. = lt in + ^ +Error: Variable x is bound several times in this matching +|}] + +(* Partial match one *) +let matches = + let ~x, .. = lt in + x +[%%expect{| +val matches : int = 1 +|}] + +(* Partial match all *) +let matches = + let ~x, ~y, ~x:x2, z, .. = lt in + x, y, x2, z +[%%expect{| +Line 2, characters 7-27: +2 | let ~x, ~y, ~x:x2, z, .. = lt in + ^^^^^^^^^^^^^^^^^^^^ +Warning 189 [unnecessarily-partial-tuple-pattern]: This tuple pattern +unnecessarily ends in '..', as it explicitly matches all components +of its expected type. + +val matches : int * int * int * int = (1, 2, 3, 4) +|}] + +(* Partial match too many of a name *) +let matches = + let ~y, ~y:y2, ~x, .. = lt in + x, y +[%%expect{| +Line 2, characters 7-24: +2 | let ~y, ~y:y2, ~x, .. = lt in + ^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it contains an extra component with label y. +|}] + +(* Partial match bad name *) +let matches = + let ~w, ~y, ~x, .. = lt in + x, y, x2, z +[%%expect{| +Line 2, characters 7-21: +2 | let ~w, ~y, ~x, .. = lt in + ^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it contains an extra component with label w. +|}] + +(* Nested pattern *) +let f (z, (~y, ~x)) = x, y, z +[%%expect{| +val f : 'a * (y:'b * x:'c) -> 'c * 'b * 'a = +|}] + +(* Non-principally known patterns *) + +let f (z, (~y, ~x, ..)) = x, y, z +[%%expect{| +Line 1, characters 10-22: +1 | let f (z, (~y, ~x, ..)) = x, y, z + ^^^^^^^^^^^^ +Error: Could not determine the type of this partial tuple pattern. +|}] + +let f (~x, ~y, ..) = x, y +[%%expect{| +Line 1, characters 6-18: +1 | let f (~x, ~y, ..) = x, y + ^^^^^^^^^^^^ +Error: Could not determine the type of this partial tuple pattern. +|}] + +(* CR labeled tuples: One day, all the above should be supported for top-level + lets. But this requires changing their typechecking a fair bit. *) + +(* Labeled tuples nested in records *) + +let x = ref (~x:1, ~y:2, ~x:3, 4) + +(* Good match *) +let _1234 = match x with +| { contents = ~x:x0, ~y, ~x , z } -> x0, y, x, z +[%%expect{| +val x : (x:int * y:int * x:int * int) ref = + {contents = (~x:1, ~y:2, ~x:3, 4)} +val _1234 : int * int * int * int = (1, 2, 3, 4) +|}] + +(* Good partial match *) +let _1 = match x with +| { contents = ~x, ..} -> x +[%%expect{| +val _1 : int = 1 +|}] + +(* Wrong label *) +let () = match x with +| { contents = ~w , .. } -> w +[%%expect{| +Line 2, characters 15-22: +2 | | { contents = ~w , .. } -> w + ^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it contains an extra component with label w. +|}] + +(* Missing unordered label *) +let () = match x with +| { contents = ~x:x0, ~y , ~x } -> y +[%%expect{| +Line 2, characters 15-29: +2 | | { contents = ~x:x0, ~y , ~x } -> y + ^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, but it is missing an unlabeled component. +|}] + +(* Extra unordered label *) +let () = match x with +| { contents = ~x:x0, ~y, ~x, w1, w2 } -> y +[%%expect{| +Line 2, characters 15-36: +2 | | { contents = ~x:x0, ~y, ~x, w1, w2 } -> y + ^^^^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it contains an extra unlabeled component. +|}] + +(* Extra unordered label, open *) +let () = match x with +| { contents = ~x:x0, ~y, ~x, w1, w2, .. } -> y +[%%expect{| +Line 2, characters 15-40: +2 | | { contents = ~x:x0, ~y, ~x, w1, w2, .. } -> y + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it contains an extra unlabeled component. +|}] + +(* Missing label *) +let () = match x with +| { contents = ~x:x0, ~y, x } -> y +[%%expect{| +Line 2, characters 15-27: +2 | | { contents = ~x:x0, ~y, x } -> y + ^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it is missing a component with label x. + Hint: use .. to ignore some components. +|}] + +(* Extra label *) +let () = match x with +| { contents = ~y:y0, ~y, ~x } -> y +[%%expect{| +Line 2, characters 15-28: +2 | | { contents = ~y:y0, ~y, ~x } -> y + ^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + x:int * y:int * x:int * int, + but it is missing a component with label x. + Hint: use .. to ignore some components. +|}] + +(* Behavior w.r.t whether types are principally known *) + +let f (z : (x:_ * y:_)) = + match z with + | ~y, ~x -> x + y +[%%expect{| +val f : (x:int * y:int) -> int = +|}] + +let f = function ~x, ~y -> x + y + +let g z = + (f z, match z with ~y, ~x -> x + y) +[%%expect{| +val f : (x:int * y:int) -> int = +val g : (x:int * y:int) -> int * int = +|}, Principal{| +val f : (x:int * y:int) -> int = +Line 4, characters 21-27: +4 | (f z, match z with ~y, ~x -> x + y) + ^^^^^^ +Error: This pattern matches values of type y:'a * x:'b + but a pattern was expected which matches values of type x:int * y:int +|}] + +let f = function ~x, ~y -> x + y + +let g z = + match z with ~y, ~x -> x + y, f z +[%%expect{| +val f : (x:int * y:int) -> int = +Line 4, characters 34-35: +4 | match z with ~y, ~x -> x + y, f z + ^ +Error: This expression has type y:int * x:int + but an expression was expected of type x:int * y:int +|}] + +(* More re-ordering stress tests *) +type t = + x:int * + y:int * + int * + x:int * + x:int * + y:int * + y:int * + int * + int * + y:int * + x:int + +let t : t = ~x:1, ~y:2, 3, ~x:4, ~x:5, ~y:6, ~y:7, 8, 9, ~y:10, ~x:11 + +let _ = + let (~y, ~y:y2, ~y:y3, ..) = t in + y, y2, y3 +[%%expect{| +type t = + x:int * y:int * int * x:int * x:int * y:int * y:int * int * int * + y:int * x:int +val t : t = (~x:1, ~y:2, 3, ~x:4, ~x:5, ~y:6, ~y:7, 8, 9, ~y:10, ~x:11) +- : int * int * int = (2, 6, 7) +|}] + +let _ = + let (a, b, c, ..) = t in + (a, b, c) +[%%expect{| +- : int * int * int = (3, 8, 9) +|}] + +let _ = + let (n3, ~y:n2, ~y, ~x:n1, ..) = t in + (n1, n2, n3, y) +[%%expect{| +- : int * int * int * int = (1, 2, 3, 6) +|}] + +let _ = + let (~x:x1, ~x:x2, ~x:x3, ~x, ..) = t in + (x1, x2, x3, x) +[%%expect{| +- : int * int * int * int = (1, 4, 5, 11) +|}] + +let _ = + let (~y:n2, ~y:n6, n3, ~x:n1, ~y:n7, n8, ~y:n10, ~x:n4, ~x:n5, ~x:n11, n9) = + t + in + (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11) +[%%expect{| +- : int * int * int * int * int * int * int * int * int * int * int = +(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) +|}] + +let _ = + let (n3, n8, n9, ~y:n2, ~y:n6, ~y:n7, ~y:n10, ~x:n1, ~x:n4, ~x:n5, ~x:n11) = + t + in + (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11) +[%%expect{| +- : int * int * int * int * int * int * int * int * int * int * int = +(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) +|}] + +let _ = + let (~x:n1, ~y:n2, n3, ~x:n4, ~x:n5, ~y:n6, ~y:n7, n8, n9, ~y:n10, ~x:n11) = + t + in + (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11) +[%%expect{| +- : int * int * int * int * int * int * int * int * int * int * int = +(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) +|}] diff --git a/testsuite/tests/typing-labeled-tuples/labeled_tuples_and_constructors.ml b/testsuite/tests/typing-labeled-tuples/labeled_tuples_and_constructors.ml new file mode 100644 index 00000000000..6d4e4b3c155 --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeled_tuples_and_constructors.ml @@ -0,0 +1,85 @@ +(* TEST + flags = "-extension labeled_tuples"; + expect; +*) + +(* Constructor with labeled arguments (disallowed) *) + +type ('a, 'b) pair = Pair of 'a * 'b +let x = Pair (~x: 5, 2) + +[%%expect{| +type ('a, 'b) pair = Pair of 'a * 'b +Line 2, characters 8-23: +2 | let x = Pair (~x: 5, 2) + ^^^^^^^^^^^^^^^ +Error: Constructors cannot have labeled arguments. Consider using an inline record instead. +|}] + +(* Labeled tuple pattern in constructor pattern, with the same arity as the + constructor. This is intentionally disallowed. *) +let f = function +| Pair (~x:5, 2) -> true +| _ -> false +[%%expect{| +Line 2, characters 2-16: +2 | | Pair (~x:5, 2) -> true + ^^^^^^^^^^^^^^ +Error: Constructors cannot have labeled arguments. Consider using an inline record instead. +|}] + +(* Labeled tuple patterns in constructor patterns with that can union with the + constructor pattern type. *) +let f = function +| Some (~x:5, 2) -> true +| _ -> false +[%%expect{| +val f : (x:int * int) option -> bool = +|}] + + +type t = Foo of (x:int * int) +let f = function +| Foo (~x:5, 2) -> true +| _ -> false +[%%expect{| +type t = Foo of (x:int * int) +val f : t -> bool = +|}] + +let _ = f (Foo (~x:5,2)) +let _ = f (Foo (~x:4,2)) +let _ = f (Foo (~x:5,1)) +[%%expect{| +- : bool = true +- : bool = false +- : bool = false +|}] + +let _ = f (Foo (5,1)) +[%%expect{| +Line 1, characters 15-20: +1 | let _ = f (Foo (5,1)) + ^^^^^ +Error: This expression has type 'a * 'b + but an expression was expected of type x:int * int +|}] + +let _ = f (Foo (5,~x:1)) +[%%expect{| +Line 1, characters 15-23: +1 | let _ = f (Foo (5,~x:1)) + ^^^^^^^^ +Error: This expression has type 'a * x:'b + but an expression was expected of type x:int * int +|}] + +let _ = f (Foo (5,~y:1)) +[%%expect{| +Line 1, characters 15-23: +1 | let _ = f (Foo (5,~y:1)) + ^^^^^^^^ +Error: This expression has type 'a * y:'b + but an expression was expected of type x:int * int +|}] + diff --git a/testsuite/tests/typing-labeled-tuples/labeled_tuples_dsource.ml b/testsuite/tests/typing-labeled-tuples/labeled_tuples_dsource.ml new file mode 100644 index 00000000000..2206daabf56 --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeled_tuples_dsource.ml @@ -0,0 +1,33 @@ +(* TEST + flags = "-extension labeled_tuples -dsource"; + expect; +*) +let x = ~x:1, ~y:2 +[%%expect{| + +let x = (~x:1, ~y:2);; +val x : x:int * y:int = (~x:1, ~y:2) +|}] + +(* Attribute should prevent punning *) +let z = 5 +let y = ~z:z, ~z, ~z:(z [@attr]) +[%%expect{| + +let z = 5;; +val z : int = 5 + +let y = (~z, ~z, ~z:((z)[@attr ]));; +val y : z:int * z:int * z:int = (~z:5, ~z:5, ~z:5) +|}] + +let (~x:x0, ~s, ~(y:int), ..) : x:int * s:string * y:int * string = + ~x: 1, ~s: "a", ~y: 2, "ignore me" +[%%expect{| + +let (~x:x0, ~s, ~y:(y : int), ..) : (x:int * s:string * y:int * string) = + (~x:1, ~s:"a", ~y:2, "ignore me");; +val x0 : int = 1 +val s : string = "a" +val y : int = 2 +|}] diff --git a/testsuite/tests/typing-labeled-tuples/labeledtuples.ml b/testsuite/tests/typing-labeled-tuples/labeledtuples.ml new file mode 100644 index 00000000000..2ad078b8b29 --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeledtuples.ml @@ -0,0 +1,528 @@ +(* TEST + flags = "-extension labeled_tuples"; + expect; +*) + +(* Basic expressions *) +let x = ~x:1, ~y:2 + +[%%expect{| +val x : x:int * y:int = (~x:1, ~y:2) +|}];; + +let z = 5 +let punned = 2 +let _ = ~x: 5, 2, ~z, ~(punned:int) +[%%expect{| +val z : int = 5 +val punned : int = 2 +- : x:int * int * z:int * punned:int = (~x:5, 2, ~z:5, ~punned:2) +|}] + +(* Basic annotations *) +let (x : x:int * y:int) = ~x:1, ~y:2 +[%%expect{| +val x : x:int * y:int = (~x:1, ~y:2) +|}] + +let (x : x:int * int) = ~x:1, 2 +[%%expect{| +val x : x:int * int = (~x:1, 2) +|}] + +(* Incorrect annotations *) +let (x : int * int) = ~x:1, 2 +[%%expect{| +Line 1, characters 22-29: +1 | let (x : int * int) = ~x:1, 2 + ^^^^^^^ +Error: This expression has type x:'a * 'b + but an expression was expected of type int * int +|}] + +let (x : x:string * int) = ~x:1, 2 +[%%expect{| +Line 1, characters 30-31: +1 | let (x : x:string * int) = ~x:1, 2 + ^ +Error: This expression has type int but an expression was expected of type + string +|}] + +let (x : int * y:int) = ~x:1, 2 +[%%expect{| +Line 1, characters 24-31: +1 | let (x : int * y:int) = ~x:1, 2 + ^^^^^^^ +Error: This expression has type x:'a * 'b + but an expression was expected of type int * y:int +|}] + +(* Happy case *) +let foo b = if b then + ~a: "s", 10, ~c: "hi" +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +val foo : bool -> a:string * int * c:string = +|}] + +(* Missing label (the type vars in the error aren't ideal, but the same thing + happens when unifying normal tuples of different lengths) *) +let foo b = if b then + ~a: "s", 10, "hi" +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +Line 4, characters 3-24: +4 | ~a: "5", 10, ~c: "hi" + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type a:string * int * c:'a + but an expression was expected of type a:string * int * string +|}] + +(* Missing labeled component *) +let foo b = if b then + ~a: "s", 10 +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +Line 4, characters 3-24: +4 | ~a: "5", 10, ~c: "hi" + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type a:'a * 'b * c:'c + but an expression was expected of type a:string * int +|}] + +(* Wrong label *) +let foo b = if b then + ~a: "s", 10, ~a: "hi" +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +Line 4, characters 3-24: +4 | ~a: "5", 10, ~c: "hi" + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type a:string * int * c:'a + but an expression was expected of type a:string * int * a:string +|}] + +(* Types in function argument/return *) +let default = ~x: 1, ~y: 2 +let choose_pt replace_with_default pt = + if replace_with_default then + default + else + pt +[%%expect{| +val default : x:int * y:int = (~x:1, ~y:2) +val choose_pt : bool -> (x:int * y:int) -> x:int * y:int = +|}] + +(* Application happy case *) +let a = choose_pt true (~x: 5, ~y: 6) +[%%expect{| +val a : x:int * y:int = (~x:1, ~y:2) +|}] + +(* Wrong order *) +let a = choose_pt true (~y: 6, ~x: 5) +[%%expect{| +Line 1, characters 23-37: +1 | let a = choose_pt true (~y: 6, ~x: 5) + ^^^^^^^^^^^^^^ +Error: This expression has type y:'a * x:'b + but an expression was expected of type x:int * y:int +|}] + +(* Mutually-recursive definitions *) +let rec a = 1, ~lbl:b +and b = 2, ~lbl:a +[%%expect{| +Line 2, characters 16-17: +2 | and b = 2, ~lbl:a + ^ +Error: This expression has type int * lbl:(int * lbl:'a) + but an expression was expected of type 'a + The type variable 'a occurs inside int * lbl:(int * lbl:'a) +|}] + +let rec l = ~lbl: 5, ~lbl2: 10 :: l +[%%expect{| +val l : (lbl:int * lbl2:int) list = [(~lbl:5, ~lbl2:10); ] +|}] + +(* Tuple containing labeled tuples *) +let tup = (~a:1, ~b:2), (~b:3, ~a:4), 5 +[%%expect{| +val tup : (a:int * b:int) * (b:int * a:int) * int = + ((~a:1, ~b:2), (~b:3, ~a:4), 5) +|}] + +(* Polymorphic variant containing labeled tuple *) +let a = `Some (~a: 1, ~b:2, 3) +[%%expect{| +val a : [> `Some of a:int * b:int * int ] = `Some (~a:1, ~b:2, 3) +|}] + +(* List of labeled tuples *) +let lst = ~a: 1, ~b: 2 :: [] +[%%expect{| +val lst : (a:int * b:int) list = [(~a:1, ~b:2)] +|}] + +(* Ref of labeled tuple *) +let x = ref (~x:"hello", 5) +[%%expect{| +val x : (x:string * int) ref = {contents = (~x:"hello", 5)} +|}] + +(* Polymorphic record containing a labeled tuple *) +type 'a box = {thing: 'a} +let boxed = {thing = "hello", ~x:5} +[%%expect{| +type 'a box = { thing : 'a; } +val boxed : (string * x:int) box = {thing = ("hello", ~x:5)} +|}] + +(* Punned tuple components with type annotations. *) +let x = 42 +let y = "hi" + +let z = ~x, ~(y:string);; +[%%expect{| +val x : int = 42 +val y : string = "hi" +val z : x:int * y:string = (~x:42, ~y:"hi") +|}];; + +let z = ~(x:int), ~y:"baz";; +[%%expect{| +val z : x:int * y:string = (~x:42, ~y:"baz") +|}];; + +let z = ~(x:string), ~y:"baz";; +[%%expect{| +Line 1, characters 10-11: +1 | let z = ~(x:string), ~y:"baz";; + ^ +Error: This expression has type int but an expression was expected of type + string +|}];; + +(* Take a [a:'a * b:'a] and an int, and returns a + [swapped:[a:'a * b:'a] * same:bool]. + The swapped component is the input with the [a] and [b] components swapped + as many times as the input int. The second component is whether the first + equals the input. *) +let rec swap (~a, ~b) = + function + | 0 -> ~swapped:(~a, ~b), ~same:true + | n -> swap' (~a:b, ~b:a) (n-1) +and swap' (~a, ~b) = + function + | 0 -> ~swapped:(~a, ~b), ~same:false + | n -> swap (~a:b, ~b:a) (n-1) +[%%expect{| +val swap : (a:'a * b:'a) -> int -> swapped:(a:'a * b:'a) * same:bool = +val swap' : (a:'a * b:'a) -> int -> swapped:(a:'a * b:'a) * same:bool = +|}] + +let foobar = swap (~a:"foo", ~b:"bar") 86 +let barfoo = swap (~a:"foo", ~b:"bar") 87 +[%%expect{| +val foobar : swapped:(a:string * b:string) * same:bool = + (~swapped:(~a:"foo", ~b:"bar"), ~same:true) +val barfoo : swapped:(a:string * b:string) * same:bool = + (~swapped:(~a:"bar", ~b:"foo"), ~same:false) +|}] + +(* Labeled tuple type annotations *) +(* Bad type *) +let x: string * a:int * int = ~lbl:5, "hi" +[%%expect{| +Line 1, characters 30-42: +1 | let x: string * a:int * int = ~lbl:5, "hi" + ^^^^^^^^^^^^ +Error: This expression has type lbl:'a * 'b + but an expression was expected of type string * a:int * int +|}] + +(* Well-typed *) +let x: string * a:int * int = "hi", ~a:1, 2 +[%%expect{| +val x : string * a:int * int = ("hi", ~a:1, 2) +|}] + +(* Function type *) +let mk_x : (foo:unit * bar:unit) -> string * a:int * int = fun _ -> x +[%%expect{| +val mk_x : (foo:unit * bar:unit) -> string * a:int * int = +|}] + +let x = mk_x (~foo:(), ~bar:()) +[%%expect{| +val x : string * a:int * int = ("hi", ~a:1, 2) +|}] + +(* Labeled tuples in records *) + +type bad_t = {x : lbl:bad_type * int} +[%%expect{| +Line 1, characters 22-30: +1 | type bad_t = {x : lbl:bad_type * int} + ^^^^^^^^ +Error: Unbound type constructor bad_type +Hint: Did you mean bad_t? +|}] + +type tx = { x : foo:int * bar:int } +type tx_unlabeled = { x : int * int } +[%%expect{| +type tx = { x : foo:int * bar:int; } +type tx_unlabeled = { x : int * int; } +|}] + + +let _ = { x = ~foo:1, ~bar:2} +[%%expect{| +Line 1, characters 14-28: +1 | let _ = { x = ~foo:1, ~bar:2} + ^^^^^^^^^^^^^^ +Error: This expression has type foo:'a * bar:'b + but an expression was expected of type int * int +|}] + +let _ : tx = { x = ~foo:1, ~bar:2 } +[%%expect{| +- : tx = {x = (~foo:1, ~bar:2)} +|}] + +let _ : tx = {x = 1, ~bar:2} +[%%expect{| +Line 1, characters 18-27: +1 | let _ : tx = {x = 1, ~bar:2} + ^^^^^^^^^ +Error: This expression has type 'a * bar:'b + but an expression was expected of type foo:int * bar:int +|}] + +let _ : tx = { x = ~foo:1, 2} +[%%expect{| +Line 1, characters 19-28: +1 | let _ : tx = { x = ~foo:1, 2} + ^^^^^^^^^ +Error: This expression has type foo:int * 'a + but an expression was expected of type foo:int * bar:int +|}] + +let _ : tx = { x = 1, 2} +[%%expect{| +Line 1, characters 19-23: +1 | let _ : tx = { x = 1, 2} + ^^^^ +Error: This expression has type 'a * 'b + but an expression was expected of type foo:int * bar:int +|}] + +let _ = { x = 1, 2 } +[%%expect{| +- : tx_unlabeled = {x = (1, 2)} +|}] + +(* Module inclusion *) + +module IntString : sig + type t + val mk : (x: int * string) -> t + val unwrap : t -> x:int * string +end = struct + type t = string * x:int + let mk (~x, s) = s, ~x + let unwrap (s, ~x) = ~x, s +end +[%%expect{| +module IntString : + sig + type t + val mk : (x:int * string) -> t + val unwrap : t -> x:int * string + end +|}] + +module Stringable = struct + module type Has_unwrap = sig + type t + val unwrap : t -> x: int * string + end + + module type Has_to_string = sig + include Has_unwrap + val to_string : t -> string + end + + module Make (M : Has_unwrap) : Has_to_string with type t := M.t = struct + include M + let to_string int_string = + let (~x, s) = unwrap int_string in + (Int.to_string x) ^ " " ^ s + end +end +[%%expect{| +module Stringable : + sig + module type Has_unwrap = sig type t val unwrap : t -> x:int * string end + module type Has_to_string = + sig + type t + val unwrap : t -> x:int * string + val to_string : t -> string + end + module Make : + functor (M : Has_unwrap) -> + sig + val unwrap : M.t -> x:int * string + val to_string : M.t -> string + end + end +|}] + +module StringableIntString = struct + include IntString + include functor Stringable.Make +end +[%%expect{| +module StringableIntString : + sig + type t = IntString.t + val mk : (x:int * string) -> t + val unwrap : IntString.t -> x:int * string + val to_string : IntString.t -> string + end +|}] + +let _ = StringableIntString.to_string (StringableIntString.mk (~x:1, "hi")) +[%%expect{| +- : string = "1 hi" +|}] + +module M : sig + val f : (x:int * string) -> x:int * string + val mk : unit -> x:bool * y:string +end = struct + let f x = x + let mk () = ~x:false, ~y:"hi" +end + +(* Module inclusion failure *) +module X_int_int = struct + type t = x:int * int +end +[%%expect{| +module M : + sig + val f : (x:int * string) -> x:int * string + val mk : unit -> x:bool * y:string + end +module X_int_int : sig type t = x:int * int end +|}] + +module Y_int_int : sig + type t = y:int * int +end = struct + include X_int_int +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | include X_int_int +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = x:int * int end + is not included in + sig type t = y:int * int end + Type declarations do not match: + type t = x:int * int + is not included in + type t = y:int * int + The type x:int * int is not equal to the type y:int * int +|}] + +module Int_int : sig + type t = int * int +end = X_int_int +[%%expect{| +Line 3, characters 6-15: +3 | end = X_int_int + ^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig type t = x:int * int end + is not included in + sig type t = int * int end + Type declarations do not match: + type t = x:int * int + is not included in + type t = int * int + The type x:int * int is not equal to the type int * int +|}] + +(* Recursive modules *) +module rec Tree : sig + type t = Leaf of string | Branch of string * TwoTrees.t + val in_order : t -> string list +end = struct + type t = Leaf of string | Branch of string * TwoTrees.t + let rec in_order = function + | Leaf s -> [s] + | Branch (s, (~left, ~right)) -> (in_order left) @ [s] @ (in_order right) +end +and TwoTrees : sig + type t = left:Tree.t * right:Tree.t +end = struct + type t = left:Tree.t * right:Tree.t +end +[%%expect{| +module rec Tree : + sig + type t = Leaf of string | Branch of string * TwoTrees.t + val in_order : t -> string list + end +and TwoTrees : sig type t = left:Tree.t * right:Tree.t end +|}] + +let leaf s = Tree.Leaf s +let tree_abc = Tree.Branch ("b", (~left:(leaf "a"), ~right:(leaf "c"))) +let tree_abcde = Tree.Branch ("d", (~left:tree_abc, ~right:(leaf "e"))) +let _ = Tree.in_order tree_abcde +[%%expect{| +val leaf : string -> Tree.t = +val tree_abc : Tree.t = + Tree.Branch ("b", (~left:Tree.Leaf "a", ~right:Tree.Leaf "c")) +val tree_abcde : Tree.t = + Tree.Branch ("d", + (~left:Tree.Branch ("b", (~left:Tree.Leaf "a", ~right:Tree.Leaf "c")), + ~right:Tree.Leaf "e")) +- : string list = ["a"; "b"; "c"; "d"; "e"] +|}] + +(* Motivating example *) +let two_kinds_of_sums ints = + let init = (~normal_sum:0, ~absolute_value_sum:0) in + List.fold_left (fun (~normal_sum, ~absolute_value_sum) elem -> + let normal_sum = elem + normal_sum in + let absolute_value_sum = abs elem + absolute_value_sum in + (~normal_sum, ~absolute_value_sum)) + init ints + +let _ = two_kinds_of_sums [1;2;3;4] +let _ = two_kinds_of_sums [1;2;-3;42;-17] +[%%expect{| +val two_kinds_of_sums : int list -> normal_sum:int * absolute_value_sum:int = + +- : normal_sum:int * absolute_value_sum:int = +(~normal_sum:10, ~absolute_value_sum:10) +- : normal_sum:int * absolute_value_sum:int = +(~normal_sum:25, ~absolute_value_sum:65) +|}] diff --git a/testsuite/tests/typing-layouts-arrays/basics.ml b/testsuite/tests/typing-layouts-arrays/basics.ml new file mode 100644 index 00000000000..ecc44427d38 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/basics.ml @@ -0,0 +1,345 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension layouts_beta -extension small_numbers"; + expect; + }{ + flags = "-extension small_numbers"; + expect; + } +*) +(* Tests around type-checking arrays of unboxed types. Tests around + compilation correctness should go somewhere else. *) + +(*******************************************) +(* Test 1: Support unboxed types in arrays *) + +type t_any : any + +type t1 = float# array +type t2 = int32# array +type t3 = int64# array +type t4 = nativeint# array +type t5 = t_any array +type t6 = float32# array + +type ('a : float64) t1' = 'a array +type ('a : bits32) t2' = 'a array +type ('a : bits64) t3' = 'a array +type ('a : word) t4' = 'a array +type ('a : any) t5' = 'a array +type ('a : float32) t6' = 'a array + +[%%expect{| +type t_any : any +type t1 = float# array +type t2 = int32# array +type t3 = int64# array +type t4 = nativeint# array +type t5 = t_any array +type t6 = float32# array +type ('a : float64) t1' = 'a array +type ('a : bits32) t2' = 'a array +type ('a : bits64) t3' = 'a array +type ('a : word) t4' = 'a array +type ('a : any) t5' = 'a array +type ('a : float32) t6' = 'a array +|}];; + +(*****************************) +(* Test 2: array expressions *) + +let v1 = [| #1. |] +[%%expect{| +val v1 : float# array = [||] +|}];; + + +let v2 = [| #1l |] +[%%expect{| +val v2 : int32# array = [||] +|}];; + + +let v3 = [| #1L |] +[%%expect{| +val v3 : int64# array = [||] +|}];; + + +let v4 = [| #1n |] +[%%expect{| +val v4 : nativeint# array = [||] +|}];; + +let v5 = [| #1.s |] +[%%expect{| +val v5 : float32# array = [||] +|}];; + +(****************************************) +(* Test 3: Array operations do not work *) + +let f (x : float# array) = x.(0) +[%%expect{| +Line 1, characters 27-28: +1 | let f (x : float# array) = x.(0) + ^ +Error: This expression has type float# array + but an expression was expected of type 'a array + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f (x : float# array) = Array.length x +[%%expect{| +Line 1, characters 40-41: +1 | let f (x : float# array) = Array.length x + ^ +Error: This expression has type float# array + but an expression was expected of type 'a array + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +(*****************************************************************) +(* Test 4: Calling wrong primitives on unboxed array kinds fails *) + +external get : float# array -> int -> float = "%floatarray_safe_get" +let d (x : float# array) = get x 0 + +[%%expect{| +external get : float# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 27-34: +2 | let d (x : float# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + + +(* [Obj.magic] can bypass the error but this should be discouraged *) +external get : floatarray -> int -> float = "%floatarray_safe_get" +let d (x : float# array) = get (Obj.magic x : floatarray) 0 + +[%%expect{| +external get : floatarray -> int -> float = "%floatarray_safe_get" +val d : float# array -> float = +|}];; + +external get : ('a : any). 'a array -> int -> float = "%floatarray_safe_get" +let d (x : 'a array) = get x 0 + +[%%expect{| +external get : ('a : any). 'a array -> int -> float = "%floatarray_safe_get" +Line 2, characters 23-30: +2 | let d (x : 'a array) = get x 0 + ^^^^^^^ +Error: A representable layout is required here. + The layout of 'a is any + because of the definition of d at line 2, characters 6-30. + But the layout of 'a must be representable + because it's the type of an array element. +|}];; + +external get : int32# array -> int -> float = "%floatarray_safe_get" +let d (x : int32# array) = get x 0 + +[%%expect{| +external get : int32# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 27-34: +2 | let d (x : int32# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +external get : int64# array -> int -> float = "%floatarray_safe_get" +let d (x : int64# array) = get x 0 + +[%%expect{| +external get : int64# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 27-34: +2 | let d (x : int64# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +external get : nativeint# array -> int -> float = "%floatarray_safe_get" +let d (x : nativeint# array) = get x 0 + +[%%expect{| +external get : nativeint# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 31-38: +2 | let d (x : nativeint# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +external get : float32# array -> int -> float = "%floatarray_safe_get" +let d (x : float32# array) = get x 0 + +[%%expect{| +external get : float32# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 29-36: +2 | let d (x : float32# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +(**************************) +(* Test 5: [@layout_poly] *) + +external[@layout_poly] get : ('a : any). 'a array -> int -> 'a = "%array_safe_get" +let f1 (x : float# array) = get x 0 +let f2 (x : int32# array) = get x 0 +let f3 (x : int64# array) = get x 0 +let f4 (x : nativeint# array) = get x 0 +let f5 (x : float32# array) = get x 0 + +[%%expect{| +external get : ('a : any). 'a array -> int -> 'a = "%array_safe_get" + [@@layout_poly] +val f1 : float# array -> float# = +val f2 : int32# array -> int32# = +val f3 : int64# array -> int64# = +val f4 : nativeint# array -> nativeint# = +val f5 : float32# array -> float32# = +|}];; + +external[@layout_poly] set : ('a : any). 'a array -> int -> 'a -> unit = "%array_safe_set" +let f1 (x : float# array) v = set x 0 v +let f2 (x : int32# array) v = set x 0 v +let f3 (x : int64# array) v = set x 0 v +let f4 (x : nativeint# array) v = set x 0 v +let f5 (x : float32# array) v = set x 0 v + +[%%expect{| +external set : ('a : any). 'a array -> int -> 'a -> unit = "%array_safe_set" + [@@layout_poly] +val f1 : float# array -> float# -> unit = +val f2 : int32# array -> int32# -> unit = +val f3 : int64# array -> int64# -> unit = +val f4 : nativeint# array -> nativeint# -> unit = +val f5 : float32# array -> float32# -> unit = +|}] + +(***********************************) +(* Test 6: sort variable inference *) + +module M6_1 = struct + (* sort var in pat *) + + let get_third arr = + match arr with + | [| _; _; z |] -> z + | _ -> assert false + + let _ = assert (Stdlib_upstream_compatible.Int32_u.equal #42l (get_third [| #0l; #1l; #42l |])) + + let _ = assert (Stdlib_upstream_compatible.Int64_u.equal #42L (get_third [| #0L; #1L; #42L |])) +end + +[%%expect{| +Line 11, characters 79-82: +11 | let _ = assert (Stdlib_upstream_compatible.Int64_u.equal #42L (get_third [| #0L; #1L; #42L |])) + ^^^ +Error: This expression has type int64# but an expression was expected of type + ('a : bits32) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of bits32 + because of the definition of get_third at lines 4-7, characters 16-23. +|}] + +module M6_2 = struct + (* sort var in exp *) + + external[@layout_poly] get : ('a : any). 'a array -> int -> 'a = "%array_safe_get" + + let arr = [||] + + let f1 idx : float# = get arr idx + let f2 idx : int32# = get arr idx +end + +(* CR layouts v2.8: The jkind in the error message is wrong. It should really be + ('a : layout float64) *) +[%%expect{| +Line 9, characters 24-35: +9 | let f2 idx : int32# = get arr idx + ^^^^^^^^^^^ +Error: This expression has type ('a : float64) + but an expression was expected of type int32# + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of float64 + because of the definition of arr at line 6, characters 12-16. +|}] + +(*********************) +(* Test 7: rec check *) + +(* See upstream PR #6939 *) + +let _ = + let[@warning "-10"] rec x = [| x |]; #42.0 in + ();; +[%%expect{| +Line 2, characters 30-44: +2 | let[@warning "-10"] rec x = [| x |]; #42.0 in + ^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42l in + ();; + +[%%expect{| +Line 2, characters 30-43: +2 | let[@warning "-10"] rec x = [| x |]; #42l in + ^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42L in + ();; + +[%%expect{| +Line 2, characters 30-43: +2 | let[@warning "-10"] rec x = [| x |]; #42L in + ^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42n in + ();; + +[%%expect{| +Line 2, characters 30-43: +2 | let[@warning "-10"] rec x = [| x |]; #42n in + ^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42.0s in + ();; + +[%%expect{| +Line 2, characters 30-45: +2 | let[@warning "-10"] rec x = [| x |]; #42.0s in + ^^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] diff --git a/testsuite/tests/typing-layouts-arrays/basics_alpha.ml b/testsuite/tests/typing-layouts-arrays/basics_alpha.ml new file mode 100644 index 00000000000..f0f3ff39990 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/basics_alpha.ml @@ -0,0 +1,343 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension layouts_alpha -extension small_numbers"; + expect; + } +*) +(* Tests around type-checking arrays of unboxed types. Tests around + compilation correctness should go somewhere else. *) + +(*******************************************) +(* Test 1: Support unboxed types in arrays *) + +type t_any_non_null : any_non_null + +type t1 = float# array +type t2 = int32# array +type t3 = int64# array +type t4 = nativeint# array +type t5 = t_any_non_null array +type t6 = float32# array + +type ('a : float64) t1' = 'a array +type ('a : bits32) t2' = 'a array +type ('a : bits64) t3' = 'a array +type ('a : word) t4' = 'a array +type ('a : any_non_null) t5' = 'a array +type ('a : float32) t6' = 'a array + +[%%expect{| +type t_any_non_null : any_non_null +type t1 = float# array +type t2 = int32# array +type t3 = int64# array +type t4 = nativeint# array +type t5 = t_any_non_null array +type t6 = float32# array +type ('a : float64) t1' = 'a array +type ('a : bits32) t2' = 'a array +type ('a : bits64) t3' = 'a array +type ('a : word) t4' = 'a array +type ('a : any_non_null) t5' = 'a array +type ('a : float32) t6' = 'a array +|}];; + +(*****************************) +(* Test 2: array expressions *) + +let v1 = [| #1. |] +[%%expect{| +val v1 : float# array = [||] +|}];; + + +let v2 = [| #1l |] +[%%expect{| +val v2 : int32# array = [||] +|}];; + + +let v3 = [| #1L |] +[%%expect{| +val v3 : int64# array = [||] +|}];; + + +let v4 = [| #1n |] +[%%expect{| +val v4 : nativeint# array = [||] +|}];; + +let v5 = [| #1.s |] +[%%expect{| +val v5 : float32# array = [||] +|}];; + +(****************************************) +(* Test 3: Array operations do not work *) + +let f (x : float# array) = x.(0) +[%%expect{| +Line 1, characters 27-28: +1 | let f (x : float# array) = x.(0) + ^ +Error: This expression has type float# array + but an expression was expected of type 'a array + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f (x : float# array) = Array.length x +[%%expect{| +Line 1, characters 40-41: +1 | let f (x : float# array) = Array.length x + ^ +Error: This expression has type float# array + but an expression was expected of type 'a array + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +(*****************************************************************) +(* Test 4: Calling wrong primitives on unboxed array kinds fails *) + +external get : float# array -> int -> float = "%floatarray_safe_get" +let d (x : float# array) = get x 0 + +[%%expect{| +external get : float# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 27-34: +2 | let d (x : float# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + + +(* [Obj.magic] can bypass the error but this should be discouraged *) +external get : floatarray -> int -> float = "%floatarray_safe_get" +let d (x : float# array) = get (Obj.magic x : floatarray) 0 + +[%%expect{| +external get : floatarray -> int -> float = "%floatarray_safe_get" +val d : float# array -> float = +|}];; + +external get : ('a : any_non_null). 'a array -> int -> float = "%floatarray_safe_get" +let d (x : 'a array) = get x 0 + +[%%expect{| +external get : ('a : any_non_null). 'a array -> int -> float + = "%floatarray_safe_get" +Line 2, characters 23-30: +2 | let d (x : 'a array) = get x 0 + ^^^^^^^ +Error: A representable layout is required here. + The layout of 'a is any + because of the definition of d at line 2, characters 6-30. + But the layout of 'a must be representable + because it's the type of an array element. +|}];; + +external get : int32# array -> int -> float = "%floatarray_safe_get" +let d (x : int32# array) = get x 0 + +[%%expect{| +external get : int32# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 27-34: +2 | let d (x : int32# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +external get : int64# array -> int -> float = "%floatarray_safe_get" +let d (x : int64# array) = get x 0 + +[%%expect{| +external get : int64# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 27-34: +2 | let d (x : int64# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +external get : nativeint# array -> int -> float = "%floatarray_safe_get" +let d (x : nativeint# array) = get x 0 + +[%%expect{| +external get : nativeint# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 31-38: +2 | let d (x : nativeint# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +external get : float32# array -> int -> float = "%floatarray_safe_get" +let d (x : float32# array) = get x 0 + +[%%expect{| +external get : float32# array -> int -> float = "%floatarray_safe_get" +Line 2, characters 29-36: +2 | let d (x : float32# array) = get x 0 + ^^^^^^^ +Error: Floatarray primitives can't be used on arrays containing + unboxed types. +|}];; + +(**************************) +(* Test 5: [@layout_poly] *) + +external[@layout_poly] get : ('a : any_non_null). 'a array -> int -> 'a = "%array_safe_get" +let f1 (x : float# array) = get x 0 +let f2 (x : int32# array) = get x 0 +let f3 (x : int64# array) = get x 0 +let f4 (x : nativeint# array) = get x 0 +let f5 (x : float32# array) = get x 0 + +[%%expect{| +external get : ('a : any_non_null). 'a array -> int -> 'a = "%array_safe_get" + [@@layout_poly] +val f1 : float# array -> float# = +val f2 : int32# array -> int32# = +val f3 : int64# array -> int64# = +val f4 : nativeint# array -> nativeint# = +val f5 : float32# array -> float32# = +|}];; + +external[@layout_poly] set : ('a : any_non_null). 'a array -> int -> 'a -> unit = "%array_safe_set" +let f1 (x : float# array) v = set x 0 v +let f2 (x : int32# array) v = set x 0 v +let f3 (x : int64# array) v = set x 0 v +let f4 (x : nativeint# array) v = set x 0 v +let f5 (x : float32# array) v = set x 0 v + +[%%expect{| +external set : ('a : any_non_null). 'a array -> int -> 'a -> unit + = "%array_safe_set" [@@layout_poly] +val f1 : float# array -> float# -> unit = +val f2 : int32# array -> int32# -> unit = +val f3 : int64# array -> int64# -> unit = +val f4 : nativeint# array -> nativeint# -> unit = +val f5 : float32# array -> float32# -> unit = +|}] + +(***********************************) +(* Test 6: sort variable inference *) + +module M6_1 = struct + (* sort var in pat *) + + let get_third arr = + match arr with + | [| _; _; z |] -> z + | _ -> assert false + + let _ = assert (Stdlib_upstream_compatible.Int32_u.equal #42l (get_third [| #0l; #1l; #42l |])) + + let _ = assert (Stdlib_upstream_compatible.Int64_u.equal #42L (get_third [| #0L; #1L; #42L |])) +end + +[%%expect{| +Line 11, characters 79-82: +11 | let _ = assert (Stdlib_upstream_compatible.Int64_u.equal #42L (get_third [| #0L; #1L; #42L |])) + ^^^ +Error: This expression has type int64# but an expression was expected of type + ('a : bits32) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of bits32 + because of the definition of get_third at lines 4-7, characters 16-23. +|}] + +module M6_2 = struct + (* sort var in exp *) + + external[@layout_poly] get : ('a : any_non_null). 'a array -> int -> 'a = "%array_safe_get" + + let arr = [||] + + let f1 idx : float# = get arr idx + let f2 idx : int32# = get arr idx +end + +(* CR layouts v2.8: The jkind in the error message is wrong. It should really be + ('a : layout float64) *) +[%%expect{| +Line 9, characters 24-35: +9 | let f2 idx : int32# = get arr idx + ^^^^^^^^^^^ +Error: This expression has type ('a : float64) + but an expression was expected of type int32# + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of float64 + because of the definition of arr at line 6, characters 12-16. +|}] + +(*********************) +(* Test 7: rec check *) + +(* See upstream PR #6939 *) + +let _ = + let[@warning "-10"] rec x = [| x |]; #42.0 in + ();; +[%%expect{| +Line 2, characters 30-44: +2 | let[@warning "-10"] rec x = [| x |]; #42.0 in + ^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42l in + ();; + +[%%expect{| +Line 2, characters 30-43: +2 | let[@warning "-10"] rec x = [| x |]; #42l in + ^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42L in + ();; + +[%%expect{| +Line 2, characters 30-43: +2 | let[@warning "-10"] rec x = [| x |]; #42L in + ^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42n in + ();; + +[%%expect{| +Line 2, characters 30-43: +2 | let[@warning "-10"] rec x = [| x |]; #42n in + ^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] + +let _ = + let[@warning "-10"] rec x = [| x |]; #42.0s in + ();; + +[%%expect{| +Line 2, characters 30-45: +2 | let[@warning "-10"] rec x = [| x |]; #42.0s in + ^^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of `let rec' +|}] diff --git a/testsuite/tests/typing-layouts-arrays/exp_and_pat.ml b/testsuite/tests/typing-layouts-arrays/exp_and_pat.ml new file mode 100644 index 00000000000..b3b8d1959fb --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/exp_and_pat.ml @@ -0,0 +1,54 @@ +(* TEST + readonly_files = "float_u_array.ml"; + modules = "${readonly_files}"; + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension comprehensions -extension layouts_alpha"; + native; + }{ + flags = "-extension comprehensions -extension layouts_alpha"; + bytecode; + }{ + flags = "-extension comprehensions -extension layouts_beta"; + native; + }{ + flags = "-extension comprehensions -extension layouts_beta"; + bytecode; + }{ + flags = "-extension comprehensions"; + native; + }{ + flags = "-extension comprehensions"; + bytecode; + } +*) +(* Test for literals, patterns, and comprehension (when that's + supported) for arrays of unboxed types. In its own file so + we can test both native and bytecode. *) + +module Float_u = Stdlib_upstream_compatible.Float_u + +let (=) = Float_u.equal + +(* match statement *) +let () = + let d = [| #1.; #2. |] in + match d with + | [| a; b |] -> + assert (a = #1.); + assert (b = #2.) + | _ -> assert false + +(* let statement pattern *) +let () = + let a = [||] in + let b = [| #1. |] in + let c = Float_u_array.append a b in + let[@warning "-8"] [| d |] = c in + assert (d = #1.) + +(* function argument pattern *) +let () = + let[@warning "-8"] f [| b |] = b in + assert (f [| #1. |] = #1.) diff --git a/testsuite/tests/typing-layouts-arrays/exp_and_pat_failing.ml b/testsuite/tests/typing-layouts-arrays/exp_and_pat_failing.ml new file mode 100644 index 00000000000..49de402aad1 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/exp_and_pat_failing.ml @@ -0,0 +1,59 @@ +(* TEST + readonly_files = "float_u_array.ml"; + modules = "${readonly_files}"; + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension comprehensions -extension layouts_alpha"; + expect; + }{ + flags = "-extension comprehensions -extension layouts_beta"; + expect; + }{ + flags = "-extension comprehensions"; + expect; + } +*) +(* Failing array comprehension tests. Delete this file and move tests + to [exp_and_pat.ml] when the feature is implemented.*) + +module Float_u = Stdlib_upstream_compatible.Float_u +let of_int = Float_u.of_int +let (=) = Float_u.equal + +(* array comprehension *) +(* CR layouts v4: add array comprehension support *) +(* let () = + let check_i = Float_u_array.iteri (fun i x -> assert (x = of_int i)) in + (* fixed size *) + let a = [|Float_u.of_int e for e = 0 to 9|] in + check_i a; + (* call to length a *) + let b = [| x for x in a |] in + check_i b; + (* dynamic size *) + let c = [| Float_u.(add (mul (of_int 10) x) y) for x in a for y in b |] in + check_i c; + (* mix types *) + let d = [| Float_u.(add (mul (of_int 10) x) (of_int y)) for x in a for y = 0 to 9 |] in + check_i d; + let e = [| Float_u.(add (of_int (10 * x)) y) for x = 0 to 9 for y in a |] in + check_i e; + () *) + +let f () = [|Float_u.of_int e for e = 0 to 9|] + +[%%expect{| +module Float_u = Stdlib_upstream_compatible.Float_u +val of_int : int -> Float_u.t = +val ( = ) : Float_u.t -> Float_u.t -> bool = +Line 25, characters 13-29: +25 | let f () = [|Float_u.of_int e for e = 0 to 9|] + ^^^^^^^^^^^^^^^^ +Error: This expression has type Float_u.t = float# + but an expression was expected of type ('a : value) + The layout of Float_u.t is float64 + because it is the primitive float64 type float#. + But the layout of Float_u.t must be a sublayout of value + because it's the element type of array comprehension. +|}];; diff --git a/testsuite/tests/typing-layouts-arrays/float_u_array.ml b/testsuite/tests/typing-layouts-arrays/float_u_array.ml new file mode 100644 index 00000000000..01f4a971006 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/float_u_array.ml @@ -0,0 +1,512 @@ +(* This file is not in stdlib because closure middle end can't compile + it. Should be moved to somewhere in otherlibs in the future. *) + +(**************************************************************************) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open! Stdlib + +[@@@ocaml.flambda_o3] + +[@@@ocaml.nolabels] + +(* An alias for the type of arrays. *) +type ('a : float64) t = ('a : float64) array + +(* Array operations *) + +external length : ('a : float64) array -> int = "%array_length" +external get: ('a : float64) array -> int -> ('a : float64) = "%array_safe_get" +external set: ('a : float64) array -> int -> ('a : float64) -> unit = "%array_safe_set" +external unsafe_get: ('a : float64) array -> int -> ('a : float64) = "%array_unsafe_get" +external unsafe_set: ('a : float64) array -> int -> ('a : float64) -> unit = "%array_unsafe_set" +external floatarray_create : int -> ('a : float64) array = "caml_floatarray_create" +external unsafe_blit : + ('a : float64) array -> int -> ('a : float64) array -> int -> int -> unit = "caml_floatarray_blit" + +let unsafe_fill : ('a : float64) array -> int -> int -> ('a : float64) -> unit = + fun a ofs len v -> + for i = ofs to ofs + len - 1 do unsafe_set a i v done + +let make : int -> ('a : float64) -> ('a : float64) array = fun n v -> + let result = floatarray_create n in + unsafe_fill result 0 n v; + result + +let create: int -> ('a : float64) -> ('a : float64) array = make + +let unsafe_sub: ('a : float64) array -> int -> int -> ('a : float64) array = fun a ofs len -> + let result = floatarray_create len in + unsafe_blit a ofs result 0 len; + result + +let append_prim: ('a : float64) array -> ('a : float64) array -> ('a : float64) array = fun a1 a2 -> + let l1 = length a1 in + let l2 = length a2 in + let result = floatarray_create (l1 + l2) in + unsafe_blit a1 0 result 0 l1; + unsafe_blit a2 0 result l1 l2; + result +let ensure_ge (x:int) y = + if x >= y then x else invalid_arg "Float_u_array.concat" + +let rec sum_lengths acc = function + | [] -> acc + | hd :: tl -> sum_lengths (ensure_ge (length hd + acc) acc) tl + +let concat: ('a : float64) array list -> ('a : float64) array = fun l -> + let len = sum_lengths 0 l in + let result = floatarray_create len in + let rec loop l i = + match l with + | [] -> assert (i = len) + | hd :: tl -> + let hlen = length hd in + unsafe_blit hd 0 result i hlen; + loop tl (i + hlen) + in + loop l 0; + result + +let empty () = floatarray_create 0 + +let init l f = + if l = 0 then (empty ()) else + if l < 0 then invalid_arg "Float_u_array.init" + (* See #6575. We could also check for maximum array size, but this depends + on whether we create a float array or a regular one... *) + else + let res = create l (f 0) in + for i = 1 to pred l do + unsafe_set res i (f i) + done; + res + +let make_matrix sx sy init = + let res = Array.make sx (empty ()) in + for x = 0 to pred sx do + Array.unsafe_set res x (create sy init) + done; + res + +let create_matrix = make_matrix + +let copy a = + let l = length a in if l = 0 then (empty ()) else unsafe_sub a 0 l + +let append a1 a2 = + let l1 = length a1 in + if l1 = 0 then copy a2 + else if length a2 = 0 then unsafe_sub a1 0 l1 + else append_prim a1 a2 + +let sub a ofs len = + if ofs < 0 || len < 0 || ofs > length a - len + then invalid_arg "Float_u_array.sub" + else unsafe_sub a ofs len + +let fill a ofs len v = + if ofs < 0 || len < 0 || ofs > length a - len + then invalid_arg "Float_u_array.fill" + else unsafe_fill a ofs len v + +let blit a1 ofs1 a2 ofs2 len = + if len < 0 || ofs1 < 0 || ofs1 > length a1 - len + || ofs2 < 0 || ofs2 > length a2 - len + then invalid_arg "Float_u_array.blit" + else unsafe_blit a1 ofs1 a2 ofs2 len + +let iter f a = + for i = 0 to length a - 1 do f(unsafe_get a i) done + +let iter2 f a b = + if length a <> length b then + invalid_arg "Float_u_array.iter2: arrays must have the same length" + else + for i = 0 to length a - 1 do f (unsafe_get a i) (unsafe_get b i) done + +let map f a = + let l = length a in + if l = 0 then (empty ()) else begin + let r = create l (f(unsafe_get a 0)) in + for i = 1 to l - 1 do + unsafe_set r i (f(unsafe_get a i)) + done; + r + end + +(* duplicated from array.ml *) +let map_inplace f a = + for i = 0 to length a - 1 do + unsafe_set a i (f (unsafe_get a i)) + done + +let map2 f a b = + let la = length a in + let lb = length b in + if la <> lb then + invalid_arg "Float_u_array.map2: arrays must have the same length" + else begin + if la = 0 then (empty ()) else begin + let r = create la (f (unsafe_get a 0) (unsafe_get b 0)) in + for i = 1 to la - 1 do + unsafe_set r i (f (unsafe_get a i) (unsafe_get b i)) + done; + r + end + end + +let iteri f a = + for i = 0 to length a - 1 do f i (unsafe_get a i) done + +let mapi f a = + let l = length a in + if l = 0 then (empty ()) else begin + let r = create l (f 0 (unsafe_get a 0)) in + for i = 1 to l - 1 do + unsafe_set r i (f i (unsafe_get a i)) + done; + r + end + +(* duplicated from array.ml *) +let mapi_inplace f a = + for i = 0 to length a - 1 do + unsafe_set a i (f i (unsafe_get a i)) + done + +(* CR layouts: Uncommment functions below when we can have unboxed + things in lists and other types. *) +(* let to_list a = + * let rec tolist i res = + * if i < 0 then res else tolist (i - 1) (unsafe_get a i :: res) in + * tolist (length a - 1) [] + * + * (* Cannot use List.length here because the List module depends on Float_u_array. *) + * let rec list_length accu = function + * | [] -> accu + * | _::t -> list_length (succ accu) t + * + * let of_list = function + * [] -> (empty ()) + * | hd::tl as l -> + * let a = create (list_length 0 l) hd in + * let rec fill i = function + * [] -> a + * | hd::tl -> unsafe_set a i hd; fill (i+1) tl in + * fill 1 tl *) + +let fold_left f x a = + let r = ref x in + for i = 0 to length a - 1 do + r := f !r (unsafe_get a i) + done; + !r + +(* CR layouts: Uncommment functions below when we can have unboxed + things in lists and other types. *) +(* let fold_left_map f acc input_array = + * let len = length input_array in + * if len = 0 then (acc, (empty ())) else begin + * let acc, elt = f acc (unsafe_get input_array 0) in + * let output_array = create len elt in + * let acc = ref acc in + * for i = 1 to len - 1 do + * let acc', elt = f !acc (unsafe_get input_array i) in + * acc := acc'; + * unsafe_set output_array i elt; + * done; + * !acc, output_array + * end *) + +let fold_right f a x = + let r = ref x in + for i = length a - 1 downto 0 do + r := f (unsafe_get a i) !r + done; + !r + +let exists p a = + let n = length a in + let rec loop i = + if i = n then false + else if p (unsafe_get a i) then true + else loop (succ i) in + loop 0 + +let for_all p a = + (* take [n], [p], and [a] as parameters to avoid a closure allocation *) + let rec loop n p a i = + if i = n then true + else if p (unsafe_get a i) then loop n p a (succ i) + else false in + loop (length a) p a 0 + +let for_all2 p l1 l2 = + let n1 = length l1 + and n2 = length l2 in + if n1 <> n2 then invalid_arg "Float_u_array.for_all2" + else let rec loop i = + if i = n1 then true + else if p (unsafe_get l1 i) (unsafe_get l2 i) then loop (succ i) + else false in + loop 0 + +let exists2 p l1 l2 = + let n1 = length l1 + and n2 = length l2 in + if n1 <> n2 then invalid_arg "Float_u_array.exists2" + else let rec loop i = + if i = n1 then false + else if p (unsafe_get l1 i) (unsafe_get l2 i) then true + else loop (succ i) in + loop 0 + + +external to_float : ('a : float64) -> (float[@local_opt]) = "%box_float" +let[@inline always] compare x y = Float.compare (to_float x) (to_float y) +let mem x a = + let n = length a in + let rec loop i = + if i = n then false + else if compare (unsafe_get a i) x = 0 then true + else loop (succ i) in + loop 0 + +(* CR layouts: Uncommment functions below when we can have unboxed + things in lists and other types. *) +(* let memq x a = + * let n = length a in + * let rec loop i = + * if i = n then false + * else if x == (unsafe_get a i) then true + * else loop (succ i) in + * loop 0 *) + +(* let find_opt p a = + * let n = length a in + * let rec loop i = + * if i = n then None + * else + * let x = unsafe_get a i in + * if p x then Some x + * else loop (succ i) + * in + * loop 0 + * + * let split x = + * if x = (empty ()) then (empty ()), (empty ()) + * else begin + * let a0, b0 = unsafe_get x 0 in + * let n = length x in + * let a = create n a0 in + * let b = create n b0 in + * for i = 1 to n - 1 do + * let ai, bi = unsafe_get x i in + * unsafe_set a i ai; + * unsafe_set b i bi + * done; + * a, b + * end + * + * let combine a b = + * let na = length a in + * let nb = length b in + * if na <> nb then invalid_arg "Float_u_array.combine"; + * if na = 0 then (empty ()) + * else begin + * let x = create na (unsafe_get a 0, unsafe_get b 0) in + * for i = 1 to na - 1 do + * unsafe_set x i (unsafe_get a i, unsafe_get b i) + * done; + * x + * end *) + +(* duplicated from array.ml *) +let find_index p a = + let n = length a in + let rec loop i = + if i = n then None + else if p (unsafe_get a i) then Some i + else loop (i + 1) in + loop 0 + +(* duplicated from array.ml *) +let find_map f a = + let n = length a in + let rec loop i = + if i = n then None + else + match f (unsafe_get a i) with + | None -> loop (i + 1) + | Some _ as r -> r + in + loop 0 + +(* duplicated from array.ml *) +let find_mapi f a = + let n = length a in + let rec loop i = + if i = n then None + else + match f i (unsafe_get a i) with + | None -> loop (i + 1) + | Some _ as r -> r + in + loop 0 + +exception Bottom of int +let sort cmp a = + let maxson l i = + let i31 = i+i+i+1 in + let x = ref i31 in + if i31+2 < l then begin + if cmp (get a i31) (get a (i31+1)) < 0 then x := i31+1; + if cmp (get a !x) (get a (i31+2)) < 0 then x := i31+2; + !x + end else + if i31+1 < l && cmp (get a i31) (get a (i31+1)) < 0 + then i31+1 + else if i31 < l then i31 else raise (Bottom i) + in + let rec trickledown l i e = + let j = maxson l i in + if cmp (get a j) e > 0 then begin + set a i (get a j); + trickledown l j e; + end else begin + set a i e; + end; + in + let trickle l i e = try trickledown l i e with Bottom i -> set a i e in + let rec bubbledown l i = + let j = maxson l i in + set a i (get a j); + bubbledown l j + in + let bubble l i = try bubbledown l i with Bottom i -> i in + let rec trickleup i e = + let father = (i - 1) / 3 in + assert (i <> father); + if cmp (get a father) e < 0 then begin + set a i (get a father); + if father > 0 then trickleup father e else set a 0 e; + end else begin + set a i e; + end; + in + let l = length a in + for i = (l + 1) / 3 - 1 downto 0 do trickle l i (get a i); done; + for i = l - 1 downto 2 do + let e = (get a i) in + set a i (get a 0); + trickleup (bubble i 0) e; + done; + if l > 1 then (let e = (get a 1) in set a 1 (get a 0); set a 0 e) + + +let cutoff = 5 +let stable_sort cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + set dst d s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 (get a i1) i2 s2 (d + 1) + else + blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + set dst d s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 (get src2 i2) (d + 1) + else + blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs (get a src1ofs) src2ofs (get src2 src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = (get a (srcofs + i)) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp (get dst !j) e > 0) do + set dst (!j + 1) (get dst !j); + decr j; + done; + set dst (!j + 1) e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = make l2 (get a 0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end + + +let fast_sort = stable_sort + +(** {1 Iterators} *) + +(* CR layouts: Uncommment functions below when we can have unboxed + things in lists and other types. *) +(* let to_seq a = + * let rec aux i () = + * if i < length a + * then + * let x = unsafe_get a i in + * Seq.Cons (x, aux (i+1)) + * else Seq.Nil + * in + * aux 0 + * + * let to_seqi a = + * let rec aux i () = + * if i < length a + * then + * let x = unsafe_get a i in + * Seq.Cons ((i,x), aux (i+1)) + * else Seq.Nil + * in + * aux 0 + * + * let of_rev_list = function + * [] -> (empty ()) + * | hd::tl as l -> + * let len = list_length 0 l in + * let a = create len hd in + * let rec fill i = function + * [] -> a + * | hd::tl -> unsafe_set a i hd; fill (i-1) tl + * in + * fill (len-2) tl + * + * let of_seq i = + * let l = Seq.fold_left (fun acc x -> x::acc) [] i in + * of_rev_list l *) diff --git a/testsuite/tests/typing-layouts-arrays/gen_u_array.ml b/testsuite/tests/typing-layouts-arrays/gen_u_array.ml new file mode 100644 index 00000000000..776d515d99e --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/gen_u_array.ml @@ -0,0 +1,614 @@ +(* Provides a functor [Make] to build modules similar stdlib [Array] + for unboxed ints. To make this work, unboxed ints are boxed in + closures with type [element_arg] to be passed between functions. + + When we add library support in otherlibs, reconsider if the + approach here is appropriate. *) + +module type S0 = sig + (* An alias for the type of arrays. *) + type element_t: any + type ('a : any) array_t + (* Reason why we need [element_arg] is not to be able to define + modules that implement [S0]. We can do that without it. + + Instead, we need this to be able to use the methods below when + [S0] is the type of a functor argument. In which case, the + function argument/return types need to be representable. *) + type element_arg = unit -> element_t + type t = element_t array_t + + (* Array operations *) + + val length : t -> int + val get: t -> int -> element_arg + val set: t -> int -> element_arg -> unit + val unsafe_get: t -> int -> element_arg + val unsafe_set: t -> int -> element_arg -> unit + val unsafe_create : int -> t + val unsafe_blit : + t -> int -> t -> int -> int -> unit + val empty : unit -> t + val compare_element: element_arg -> element_arg -> int + val max_length : int +end + + +module type S = sig + include S0 + + (* methods below are copied from [array.mli] *) + val make : int -> element_arg -> t + + val create : int -> element_arg -> t + [@@ocaml.deprecated "Use Array.make/ArrayLabels.make instead."] + + (* external create_float: int -> float array = "caml_make_float_vect" + * + * val make_float: int -> float array + * [@@ocaml.deprecated + * "Use Array.create_float/ArrayLabels.create_float instead."] *) + + val init : int -> (int -> element_arg) -> t + val make_matrix : int -> int -> element_arg -> t array + val create_matrix : int -> int -> element_arg -> t array + [@@ocaml.deprecated + "Use Array.make_matrix/ArrayLabels.make_matrix instead."] + + val append : t -> t -> t + val concat : t list -> t + val sub : t -> int -> int -> t + val copy : t -> t + val fill : t -> int -> int -> element_arg -> unit + val blit : + t -> int -> t -> int -> int -> + unit + + (* val to_list : t -> element_arg list + * + * val of_list : element_arg list -> t *) + (* CR layouts v5: Unboxed values can't be in list yet *) + + (** {1 Iterators} *) + + val iter : (element_arg -> unit) -> t -> unit + val iteri : (int -> element_arg -> unit) -> t -> unit + val map : (element_arg -> element_arg) -> t -> t + val map_inplace : (element_arg -> element_arg) -> t -> unit + val mapi : (int -> element_arg -> element_arg) -> t -> t + val mapi_inplace : (int -> element_arg -> element_arg) -> t -> unit + val fold_left : ('a -> element_arg -> 'a) -> 'a -> t -> 'a + + (* val fold_left_map : + * (element_arg -> 'b -> element_arg * 'c) -> element_arg -> 'b array -> element_arg * 'c array *) + (* CR layouts v5: Unboxed values can't be in tuples yet *) + + val fold_right : (element_arg -> 'a -> 'a) -> t -> 'a -> 'a + + (** {1 Iterators on two arrays} *) + + + val iter2 : (element_arg -> element_arg -> unit) -> t -> t -> unit + val map2 : (element_arg -> element_arg -> element_arg) -> t -> t -> t + + + (** {1 Array scanning} *) + + val for_all : (element_arg -> bool) -> t -> bool + + val exists : (element_arg -> bool) -> t -> bool + + val for_all2 : (element_arg -> element_arg -> bool) -> t -> t -> bool + + val exists2 : (element_arg -> element_arg -> bool) -> t -> t -> bool + + val mem : element_arg -> t -> bool + + (* val memq : element_arg -> t -> bool *) + + (* val find_opt : (element_arg -> bool) -> t -> element_arg option *) + (* CR layouts v5: Unboxed values can't be in option yet *) + + val find_index : (element_arg -> bool) -> t -> int option + + val find_map : (element_arg -> 'b option) -> t -> 'b option + + val find_mapi : (int -> element_arg -> 'b option) -> t -> 'b option + + (** {1 Arrays of pairs} *) + + (* val split : (element_arg * 'b) array -> t * 'b array + * + * val combine : t -> 'b array -> (element_arg * 'b) array *) + (* CR layouts v5: Unboxed values can't be in tuples yet *) + + (** {1 Sorting} *) + + val sort : (element_arg -> element_arg -> int) -> t -> unit + + val stable_sort : (element_arg -> element_arg -> int) -> t -> unit + + val fast_sort : (element_arg -> element_arg -> int) -> t -> unit + + + (** {1 Arrays and Sequences} *) + + (* val to_seq : t -> element_arg Seq.t + * + * val to_seqi : t -> (int * element_arg) Seq.t + * + * val of_seq : element_arg Seq.t -> t *) + (* CR layouts v5: Unboxed [Seq.t] not yet supported *) + (**/**) +end + +module Make (M : S0) + : (S + with type element_t = M.element_t + and type ('a : any) array_t = 'a M.array_t) = struct + + include M + + let unsafe_fill : t -> int -> int -> element_arg -> unit = + fun a ofs len v -> + for i = ofs to ofs + len - 1 do unsafe_set a i v done + + + let make : int -> element_arg -> t = fun n v -> + let result = unsafe_create n in + unsafe_fill result 0 n v; + result + + let create = make + + let unsafe_sub: t -> int -> int -> t = fun a ofs len -> + let result = unsafe_create len in + unsafe_blit a ofs result 0 len; + result + + let append_prim: t -> t -> t = fun a1 a2 -> + let l1 = length a1 in + let l2 = length a2 in + let result = unsafe_create (l1 + l2) in + unsafe_blit a1 0 result 0 l1; + unsafe_blit a2 0 result l1 l2; + result + (* only used to defend against potential overflows in the length + computation of array concatenation *) + let ensure_ge (x:int) y = + if x >= y then x else invalid_arg "Int32_u_array.concat" + + let rec sum_lengths acc = function + | [] -> acc + | hd :: tl -> sum_lengths (ensure_ge (length hd + acc) acc) tl + + let concat: t list -> t = fun l -> + let len = sum_lengths 0 l in + let result = unsafe_create len in + let rec loop l i = + match l with + | [] -> assert (i = len) + | hd :: tl -> + let hlen = length hd in + unsafe_blit hd 0 result i hlen; + loop tl (i + hlen) + in + loop l 0; + result + + let init: int -> (int -> element_arg) -> t = fun l f -> + if l = 0 then (empty ()) else + if l < 0 then invalid_arg "Int32_u_array.init" + (* See #6575. We could also check for maximum array size, but this depends + on whether we create a float array or a regular one... *) + else + let res = create l (f 0) in + for i = 1 to pred l do + unsafe_set res i (f i) + done; + res + + let make_matrix sx sy init = + let res = Array.make sx (empty ()) in + for x = 0 to pred sx do + Array.unsafe_set res x (create sy init) + done; + res + + let create_matrix = make_matrix + + let copy a = + let l = length a in if l = 0 then (empty ()) else unsafe_sub a 0 l + + let append a1 a2 = + let l1 = length a1 in + if l1 = 0 then copy a2 + else if length a2 = 0 then unsafe_sub a1 0 l1 + else append_prim a1 a2 + + let sub a ofs len = + if ofs < 0 || len < 0 || ofs > length a - len + then invalid_arg "Int32_u_array.sub" + else unsafe_sub a ofs len + + let fill a ofs len v = + if ofs < 0 || len < 0 || ofs > length a - len + then invalid_arg "Int32_u_array.fill" + else unsafe_fill a ofs len v + + let blit a1 ofs1 a2 ofs2 len = + if len < 0 || ofs1 < 0 || ofs1 > length a1 - len + || ofs2 < 0 || ofs2 > length a2 - len + then invalid_arg "Int32_u_array.blit" + else unsafe_blit a1 ofs1 a2 ofs2 len + + let iter f a = + for i = 0 to length a - 1 do f(unsafe_get a i) done + + let iter2 f a b = + if length a <> length b then + invalid_arg "Int32_u_array.iter2: arrays must have the same length" + else + for i = 0 to length a - 1 do f (unsafe_get a i) (unsafe_get b i) done + + let map f a = + let l = length a in + if l = 0 then (empty ()) else begin + let r = create l (f(unsafe_get a 0)) in + for i = 1 to l - 1 do + unsafe_set r i (f(unsafe_get a i)) + done; + r + end + + let map_inplace f a = + for i = 0 to length a - 1 do + unsafe_set a i (f (unsafe_get a i)) + done + + let mapi_inplace f a = + for i = 0 to length a - 1 do + unsafe_set a i (f i (unsafe_get a i)) + done + + let map2 f a b = + let la = length a in + let lb = length b in + if la <> lb then + invalid_arg "Int32_u_array.map2: arrays must have the same length" + else begin + if la = 0 then (empty ()) else begin + let r = create la (f (unsafe_get a 0) (unsafe_get b 0)) in + for i = 1 to la - 1 do + unsafe_set r i (f (unsafe_get a i) (unsafe_get b i)) + done; + r + end + end + + let iteri f a = + for i = 0 to length a - 1 do f i (unsafe_get a i) done + + let mapi f a = + let l = length a in + if l = 0 then (empty ()) else begin + let r = create l (f 0 (unsafe_get a 0)) in + for i = 1 to l - 1 do + unsafe_set r i (f i (unsafe_get a i)) + done; + r + end + + (* let to_list a = + * let rec tolist i res = + * if i < 0 then res else tolist (i - 1) (unsafe_get a i :: res) in + * tolist (length a - 1) [] + * + * (* Cannot use List.length here because the List module depends on Int32_u_array. *) + * let rec list_length accu = function + * | [] -> accu + * | _::t -> list_length (succ accu) t + * + * let of_list = function + * [] -> (empty ()) + * | hd::tl as l -> + * let a = create (list_length 0 l) hd in + * let rec fill i = function + * [] -> a + * | hd::tl -> unsafe_set a i hd; fill (i+1) tl in + * fill 1 tl *) + + let fold_left f x a = + let r = ref x in + for i = 0 to length a - 1 do + r := f !r (unsafe_get a i) + done; + !r + + (* let fold_left_map f acc input_array = + * let len = length input_array in + * if len = 0 then (acc, (empty ())) else begin + * let acc, elt = f acc (unsafe_get input_array 0) in + * let output_array = create len elt in + * let acc = ref acc in + * for i = 1 to len - 1 do + * let acc', elt = f !acc (unsafe_get input_array i) in + * acc := acc'; + * unsafe_set output_array i elt; + * done; + * !acc, output_array + * end *) + + let fold_right f a x = + let r = ref x in + for i = length a - 1 downto 0 do + r := f (unsafe_get a i) !r + done; + !r + + let exists p a = + let n = length a in + let rec loop i = + if i = n then false + else if p (unsafe_get a i) then true + else loop (succ i) in + loop 0 + + let for_all p a = + (* take [n], [p], and [a] as parameters to avoid a closure allocation *) + let rec loop n p a i = + if i = n then true + else if p (unsafe_get a i) then loop n p a (succ i) + else false in + loop (length a) p a 0 + + let for_all2 p l1 l2 = + let n1 = length l1 + and n2 = length l2 in + if n1 <> n2 then invalid_arg "Int32_u_array.for_all2" + else let rec loop i = + if i = n1 then true + else if p (unsafe_get l1 i) (unsafe_get l2 i) then loop (succ i) + else false in + loop 0 + + let exists2 p l1 l2 = + let n1 = length l1 + and n2 = length l2 in + if n1 <> n2 then invalid_arg "Int32_u_array.exists2" + else let rec loop i = + if i = n1 then false + else if p (unsafe_get l1 i) (unsafe_get l2 i) then true + else loop (succ i) in + loop 0 + + + + let mem x a = + let n = length a in + let rec loop i = + if i = n then false + else if compare_element (unsafe_get a i) x = 0 then true + else loop (succ i) in + loop 0 + + (* let memq x a = + * let n = length a in + * let rec loop i = + * if i = n then false + * else if x == (unsafe_get a i) then true + * else loop (succ i) in + * loop 0 *) + + (* let find_opt p a = + * let n = length a in + * let rec loop i = + * if i = n then None + * else + * let x = unsafe_get a i in + * if p x then Some x + * else loop (succ i) + * in + * loop 0 + * + * let split x = + * if x = (empty ()) then (empty ()), (empty ()) + * else begin + * let a0, b0 = unsafe_get x 0 in + * let n = length x in + * let a = create n a0 in + * let b = create n b0 in + * for i = 1 to n - 1 do + * let ai, bi = unsafe_get x i in + * unsafe_set a i ai; + * unsafe_set b i bi + * done; + * a, b + * end + * + * let combine a b = + * let na = length a in + * let nb = length b in + * if na <> nb then invalid_arg "Int32_u_array.combine"; + * if na = 0 then (empty ()) + * else begin + * let x = create na (unsafe_get a 0, unsafe_get b 0) in + * for i = 1 to na - 1 do + * unsafe_set x i (unsafe_get a i, unsafe_get b i) + * done; + * x + * end *) + + let find_index p a = + let n = length a in + let rec loop i = + if i = n then None + else if p (unsafe_get a i) then Some i + else loop (succ i) in + loop 0 + + let find_map f a = + let n = length a in + let rec loop i = + if i = n then None + else + match f (unsafe_get a i) with + | None -> loop (succ i) + | Some _ as r -> r + in + loop 0 + + let find_mapi f a = + let n = length a in + let rec loop i = + if i = n then None + else + match f i (unsafe_get a i) with + | None -> loop (succ i) + | Some _ as r -> r + in + loop 0 + + exception Bottom of int + let sort cmp a = + let maxson l i = + let i31 = i+i+i+1 in + let x = ref i31 in + if i31+2 < l then begin + if cmp (get a i31) (get a (i31+1)) < 0 then x := i31+1; + if cmp (get a !x) (get a (i31+2)) < 0 then x := i31+2; + !x + end else + if i31+1 < l && cmp (get a i31) (get a (i31+1)) < 0 + then i31+1 + else if i31 < l then i31 else raise (Bottom i) + in + let rec trickledown l i e = + let j = maxson l i in + if cmp (get a j) e > 0 then begin + set a i (get a j); + trickledown l j e; + end else begin + set a i e; + end; + in + let trickle l i e = try trickledown l i e with Bottom i -> set a i e in + let rec bubbledown l i = + let j = maxson l i in + set a i (get a j); + bubbledown l j + in + let bubble l i = try bubbledown l i with Bottom i -> i in + let rec trickleup i e = + let father = (i - 1) / 3 in + assert (i <> father); + if cmp (get a father) e < 0 then begin + set a i (get a father); + if father > 0 then trickleup father e else set a 0 e; + end else begin + set a i e; + end; + in + let l = length a in + for i = (l + 1) / 3 - 1 downto 0 do trickle l i (get a i); done; + for i = l - 1 downto 2 do + let e = (get a i) in + set a i (get a 0); + trickleup (bubble i 0) e; + done; + if l > 1 then (let e = (get a 1) in set a 1 (get a 0); set a 0 e) + + + let cutoff = 5 + let stable_sort cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + set dst d s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 (get a i1) i2 s2 (d + 1) + else + blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + set dst d s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 (get src2 i2) (d + 1) + else + blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs (get a src1ofs) src2ofs (get src2 src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = (get a (srcofs + i)) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp (get dst !j) e > 0) do + set dst (!j + 1) (get dst !j); + decr j; + done; + set dst (!j + 1) e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = make l2 (get a 0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end + + + let fast_sort = stable_sort + + (** {1 Iterators} *) + + (* let to_seq a = + * let rec aux i () = + * if i < length a + * then + * let x = unsafe_get a i in + * Seq.Cons (x, aux (i+1)) + * else Seq.Nil + * in + * aux 0 + * + * let to_seqi a = + * let rec aux i () = + * if i < length a + * then + * let x = unsafe_get a i in + * Seq.Cons ((i,x), aux (i+1)) + * else Seq.Nil + * in + * aux 0 + * + * let of_rev_list = function + * [] -> (empty ()) + * | hd::tl as l -> + * let len = list_length 0 l in + * let a = create len hd in + * let rec fill i = function + * [] -> a + * | hd::tl -> unsafe_set a i hd; fill (i-1) tl + * in + * fill (len-2) tl + * + * let of_seq i = + * let l = Seq.fold_left (fun acc x -> x::acc) [] i in + * of_rev_list l *) + +end diff --git a/testsuite/tests/typing-layouts-arrays/test_float32_u_array.ml b/testsuite/tests/typing-layouts-arrays/test_float32_u_array.ml new file mode 100644 index 00000000000..36ad686be30 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/test_float32_u_array.ml @@ -0,0 +1,209 @@ +(* TEST + readonly_files = "gen_u_array.ml test_gen_u_array.ml"; + modules = "${readonly_files}"; + include stdlib_stable; + flambda2; + { + bytecode; + }{ + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + } +*) +(* Test compilation correctness for array of unboxed float32s. General + tests around type-checking should go to [basics.ml]. *) + +module Float32_I = struct + include Stdlib_stable.Float32 + let max_val = max_float + let min_val = min_float + let rand f = of_float (Random.float (to_float f)) + let print f = Format.printf "%f" (to_float f) +end + +module Float32_array : Test_gen_u_array.S = struct + include Stdlib.Array + type element_t = float32 + type t = element_t array + let map_to_array f a = map f a + let map_from_array f a = map f a + let max_length = Sys.max_array_length + let equal = for_all2 (fun x y -> x = y) + module I = Float32_I +end +module _ = Test_gen_u_array.Test (Float32_array) + +module Float32_u_array0 : Gen_u_array.S0 + with type element_t = float32# + and type ('a : any) array_t = 'a array = struct + + type element_t = float32# + type ('a : any) array_t = 'a array + type element_arg = unit -> element_t + type t = element_t array + let max_length = Sys.max_unboxed_float32_array_length + external length : ('a : float32). 'a array -> int = "%array_length" + external get: ('a : float32). 'a array -> int -> 'a = "%array_safe_get" + let get t i = let a = get t i in fun () -> a + external set: ('a : float32). 'a array -> int -> 'a -> unit = "%array_safe_set" + let set t i e = set t i (e ()) + external unsafe_get: ('a : float32). 'a array -> int -> 'a = "%array_unsafe_get" + let unsafe_get t i = let a = unsafe_get t i in fun () -> a + external unsafe_set: ('a : float32). 'a array -> int -> 'a -> unit = "%array_unsafe_set" + let unsafe_set t i e = unsafe_set t i (e ()) + + external unsafe_create : ('a : float32). int -> 'a array = + "caml_make_unboxed_float32_vect_bytecode" "caml_make_unboxed_float32_vect" + external unsafe_blit : ('a : float32). + 'a array -> int -> 'a array -> int -> int -> unit = + "caml_array_blit" "caml_unboxed_float32_vect_blit" + let empty () = [||] + external to_boxed : ('a : float32) -> (float32[@local_opt]) = "%box_float32" + let compare_element x y = Stdlib_stable.Float32.compare (to_boxed (x ())) (to_boxed (y ())) +end + +module Float32_u_array = Gen_u_array.Make (Float32_u_array0) +module Float32_u_array_boxed : Test_gen_u_array.S with type t = float32# array = Test_gen_u_array.Make_boxed (struct + module M = Float32_u_array + module I = Float32_I + module E = struct + open Stdlib_stable.Float32_u + let to_boxed x = to_float32 (x ()) + let of_boxed x () = of_float32 x + end +end) +module _ = Test_gen_u_array.Test (Float32_u_array_boxed) + + +(* Extra tests for array expressions and patterns *) +module A = Float32_u_array_boxed +module I = Float32_u_array_boxed.I + +let check_i a = + let rec check_i_upto a i = + if i >= 0 then begin + assert (A.get a i = I.of_int i); + check_i_upto a (i - 1); + end + in + check_i_upto a (A.length a - 1) + +let check_eq_f f arr = A.iteri (fun i x -> assert (x = f i)) arr +let check_all_the_same v arr = A.iter (fun x -> assert (x = v)) arr + +let check_inval f arg = + match f arg with + | _ -> assert false + | exception (Invalid_argument _) -> () + | exception _ -> assert false + +let () = + (* empty arrays *) + let test_empty_array arr = + check_inval (fun a -> A.get a 0) arr; + check_inval (fun a -> A.get a 1) arr; + check_inval (fun a -> A.get a (-1)) arr; + check_inval (fun a -> A.set a 0 (I.of_int 0)) arr; + check_inval (fun a -> A.set a 1 (I.of_int 0)) arr; + check_inval (fun a -> A.set a (-1) (I.of_int 0)) arr + in + let r : A.t = [||] in + test_empty_array r; + let r = A.make (Sys.opaque_identity 0) (I.of_int 0) in + test_empty_array r; + + (* static blocks *) + let r = [| +#0.s;#1.s;#2.s;#3.s;#4.s;#5.s;#6.s;#7.s;#8.s;#9.s;#10.s;#11.s;#12.s;#13.s;#14.s;#15.s;#16.s;#17.s; +#18.s;#19.s;#20.s;#21.s;#22.s;#23.s;#24.s;#25.s;#26.s;#27.s;#28.s;#29.s;#30.s;#31.s;#32.s;#33.s;#34.s;#35.s; +#36.s;#37.s;#38.s;#39.s;#40.s;#41.s;#42.s;#43.s;#44.s;#45.s;#46.s;#47.s;#48.s;#49.s;#50.s;#51.s;#52.s;#53.s; +#54.s;#55.s;#56.s;#57.s;#58.s;#59.s;#60.s;#61.s;#62.s;#63.s;#64.s;#65.s;#66.s;#67.s;#68.s;#69.s;#70.s;#71.s; +#72.s;#73.s;#74.s;#75.s;#76.s;#77.s;#78.s;#79.s;#80.s;#81.s;#82.s;#83.s;#84.s;#85.s;#86.s;#87.s;#88.s;#89.s; +#90.s;#91.s;#92.s;#93.s;#94.s;#95.s;#96.s;#97.s;#98.s;#99.s; |] + in + check_i r; + let r = [| +#0.s;#1.s;#2.s;#3.s;#4.s;#5.s;#6.s;#7.s;#8.s;#9.s;#10.s;#11.s;#12.s;#13.s;#14.s;#15.s;#16.s;#17.s; +#18.s;#19.s;#20.s;#21.s;#22.s;#23.s;#24.s;#25.s;#26.s;#27.s;#28.s;#29.s;#30.s;#31.s;#32.s;#33.s;#34.s;#35.s; +#36.s;#37.s;#38.s;#39.s;#40.s;#41.s;#42.s;#43.s;#44.s;#45.s;#46.s;#47.s;#48.s;#49.s;#50.s;#51.s;#52.s;#53.s; +#54.s;#55.s;#56.s;#57.s;#58.s;#59.s;#60.s;#61.s;#62.s;#63.s;#64.s;#65.s;#66.s;#67.s;#68.s;#69.s;#70.s;#71.s; +#72.s;#73.s;#74.s;#75.s;#76.s;#77.s;#78.s;#79.s;#80.s;#81.s;#82.s;#83.s;#84.s;#85.s;#86.s;#87.s;#88.s;#89.s; +#90.s;#91.s;#92.s;#93.s;#94.s;#95.s;#96.s;#97.s;#98.s;#99.s;#100.s; |] + in + check_i r; + let r = [|-#123.s;-#123.s;-#123.s;-#123.s;-#123.s;-#123.s;-#123.s;-#123.s;-#123.s;-#123.s;-#123.s;|] in + check_all_the_same (I.of_int (-123)) r; + let r = + [|-#1.s; #1.s; -#1.s; #1.s; -#1.s; #1.s; -#1.s; #1.s; -#1.s;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|#1.s; -#1.s; #1.s; -#1.s; #1.s; -#1.s; #1.s; -#1.s;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + (* dynamic blocks *) + let[@inline never] f x = x in + let r = [| + f #0.s;f #1.s;f #2.s;f #3.s;f #4.s;f #5.s;f #6.s;f #7.s;f #8.s;f #9.s;f #10.s;f #11.s;f #12.s;f #13.s;f #14.s; + f #15.s;f #16.s;f #17.s;f #18.s;f #19.s;f #20.s;f #21.s;f #22.s;f #23.s;f #24.s;f #25.s;f #26.s;f #27.s;f #28.s;f #29.s; + f #30.s;f #31.s;f #32.s;f #33.s;f #34.s;f #35.s;f #36.s;f #37.s;f #38.s;f #39.s;f #40.s;f #41.s;f #42.s;f #43.s;f #44.s; + f #45.s;f #46.s;f #47.s;f #48.s;f #49.s;f #50.s;f #51.s;f #52.s;f #53.s;f #54.s;f #55.s;f #56.s;f #57.s;f #58.s;f #59.s; + f #60.s;f #61.s;f #62.s;f #63.s;f #64.s;f #65.s;f #66.s;f #67.s;f #68.s;f #69.s;f #70.s;f #71.s;f #72.s;f #73.s;f #74.s; + f #75.s;f #76.s;f #77.s;f #78.s;f #79.s;f #80.s;f #81.s;f #82.s;f #83.s;f #84.s;f #85.s;f #86.s;f #87.s;f #88.s;f #89.s; + f #90.s;f #91.s;f #92.s;f #93.s;f #94.s;f #95.s;f #96.s;f #97.s;f #98.s;f #99.s; |] + in + check_i r; + let r = [| + f #0.s;f #1.s;f #2.s;f #3.s;f #4.s;f #5.s;f #6.s;f #7.s;f #8.s;f #9.s;f #10.s;f #11.s;f #12.s;f #13.s;f #14.s; + f #15.s;f #16.s;f #17.s;f #18.s;f #19.s;f #20.s;f #21.s;f #22.s;f #23.s;f #24.s;f #25.s;f #26.s;f #27.s;f #28.s;f #29.s; + f #30.s;f #31.s;f #32.s;f #33.s;f #34.s;f #35.s;f #36.s;f #37.s;f #38.s;f #39.s;f #40.s;f #41.s;f #42.s;f #43.s;f #44.s; + f #45.s;f #46.s;f #47.s;f #48.s;f #49.s;f #50.s;f #51.s;f #52.s;f #53.s;f #54.s;f #55.s;f #56.s;f #57.s;f #58.s;f #59.s; + f #60.s;f #61.s;f #62.s;f #63.s;f #64.s;f #65.s;f #66.s;f #67.s;f #68.s;f #69.s;f #70.s;f #71.s;f #72.s;f #73.s;f #74.s; + f #75.s;f #76.s;f #77.s;f #78.s;f #79.s;f #80.s;f #81.s;f #82.s;f #83.s;f #84.s;f #85.s;f #86.s;f #87.s;f #88.s;f #89.s; + f #90.s;f #91.s;f #92.s;f #93.s;f #94.s;f #95.s;f #96.s;f #97.s;f #98.s;f #99.s;f #100.s; |] + in + check_i r; + let r = + [|f (-#123.s);f (-#123.s);f (-#123.s);f (-#123.s);f (-#123.s);f (-#123.s);f (-#123.s);f (-#123.s);f (-#123.s);|] + in + check_all_the_same (I.of_int (-123)) r; + check_i [| #0.s; ((fun x -> x) #1.s)|]; + check_i [| #0.s; ((fun x -> x) #1.s); #2.s|]; + let r = + [|f (-#1.s);f (#1.s);f (-#1.s);f (#1.s);f (-#1.s);f (#1.s);f (-#1.s);f (#1.s);f (-#1.s);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|f (#1.s);f (-#1.s);f (#1.s);f (-#1.s);f (#1.s);f (-#1.s);f (#1.s);f (-#1.s);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + () + + +(* expression and patterns *) +let () = + let ( = ) = Stdlib_stable.Float32_u.equal in + (* match statement *) + let d = [| #1.s; #2.s |] in + (match d with + | [| a; b |] -> + assert (a = #1.s); + assert (b = #2.s) + | _ -> assert false); + + (* let statement pattern *) + let a = [||] in + let b = [| #1.s |] in + let c = A.append a b in + let[@warning "-8"] [| d |] = c in + assert (d = #1.s); + + (* function argument pattern *) + let[@warning "-8"] f [| b |] = b in + assert (f [| #1.s |] = #1.s); + () diff --git a/testsuite/tests/typing-layouts-arrays/test_gen_u_array.ml b/testsuite/tests/typing-layouts-arrays/test_gen_u_array.ml new file mode 100644 index 00000000000..0a3ac3af5b1 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/test_gen_u_array.ml @@ -0,0 +1,959 @@ +(* Provides functor [Make_boxed] that constructs a module with a + simliar interface as stdlib [Array] specialized to int64, int32, or + nativeint. This module can then be passed to functor [Test] to check + for correctness. *) + +module type Element_intf = sig + type t + val of_int : int -> t + val add : t -> t -> t + val sub : t -> t -> t + val mul : t -> t -> t + val neg : t -> t + val max_val : t + val min_val : t + val rand : t -> t + val compare : t -> t -> int + val print : t -> unit +end + +module type S = sig + type t + type element_t + val length : t -> int + val get : t -> int -> element_t + val set : t -> int -> element_t -> unit + val make : int -> element_t -> t + val init : int -> (int -> element_t) -> t + val make_matrix : int -> int -> element_t -> t array + val append : t -> t -> t + val concat : t list -> t + val sub : t -> int -> int -> t + val copy : t -> t + val fill : t -> int -> int -> element_t -> unit + val blit : t -> int -> t -> int -> int -> unit + val to_list : t -> element_t list + val of_list : element_t list -> t + val iter : (element_t -> unit) -> t -> unit + val iteri : (int -> element_t -> unit) -> t -> unit + val map : (element_t -> element_t) -> t -> t + val map_inplace : (element_t -> element_t) -> t -> unit + val mapi : (int -> element_t -> element_t) -> t -> t + val mapi_inplace : (int -> element_t -> element_t) -> t -> unit + val fold_left : ('a -> element_t -> 'a) -> 'a -> t -> 'a + val fold_right : (element_t -> 'a -> 'a) -> t -> 'a -> 'a + val iter2 : (element_t -> element_t -> unit) -> t -> t -> unit + val map2 : (element_t -> element_t -> element_t) -> t -> t -> t + val for_all : (element_t -> bool) -> t -> bool + val for_all2 : (element_t -> element_t -> bool) -> t -> t -> bool + val exists : (element_t -> bool) -> t -> bool + val exists2 : (element_t -> element_t -> bool) -> t -> t -> bool + val mem : element_t -> t -> bool + val find_opt : (element_t -> bool) -> t -> element_t option + val find_index : (element_t-> bool) -> t -> int option + val find_map : (element_t -> 'a option) -> t -> 'a option + val find_mapi : (int -> element_t -> 'a option) -> t -> 'a option + val sort : (element_t -> element_t -> int) -> t -> unit + val stable_sort : (element_t -> element_t -> int) -> t -> unit + val fast_sort : (element_t -> element_t -> int) -> t -> unit + val to_seq : t -> element_t Seq.t + val to_seqi : t -> (int * element_t) Seq.t + val of_seq : element_t Seq.t -> t + val map_to_array : (element_t -> 'a) -> t -> 'a array + val map_from_array : ('a -> element_t) -> 'a array -> t + val unsafe_get : t -> int -> element_t + val unsafe_set : t -> int -> element_t -> unit + val equal : t -> t -> bool + (* From Sys, rather than Float.Array *) + val max_length : int + + module I : Element_intf with type t = element_t +end + +module Make_boxed (Arg : sig + module M : Gen_u_array.S + module I : Element_intf + module E : sig + val to_boxed : M.element_arg -> I.t + val of_boxed : I.t -> M.element_arg + end +end) : S with type t = Arg.M.t + and type element_t = Arg.I.t = struct + include Arg.M + include Arg.E + + module I = Arg.I + + type element_t = I.t + + let empty () = make 0 (of_boxed (I.of_int 0)) + let to_seq a = + let rec aux i () = + if i < length a + then + let x = unsafe_get a i in + Seq.Cons (to_boxed x, aux (i+1)) + else Seq.Nil + in + aux 0 + + let to_seqi a = + let rec aux i () = + if i < length a + then + let x = unsafe_get a i in + Seq.Cons ((i,to_boxed x), aux (i+1)) + else Seq.Nil + in + aux 0 + + let of_rev_list = function + [] -> empty () + | hd::tl as l -> + let len = List.length l in + let a = make len (of_boxed hd) in + let rec fill i = function + [] -> a + | hd::tl -> unsafe_set a i (of_boxed hd); fill (i-1) tl + in + fill (len-2) tl + + let of_seq i = + let l = Seq.fold_left (fun acc x -> x::acc) [] i in + of_rev_list l + + + let to_list t = fold_right (fun f l -> (to_boxed f)::l) t [] + + let of_list l = + let len = List.length l in + let res = make len (of_boxed (I.of_int 0)) in + List.iteri (fun idx f -> set res idx (of_boxed f)) l; + res + + let get t idx = to_boxed (get t idx) + let set t idx v = set t idx (of_boxed v) + + let make l f = make l (of_boxed f) + let init l f = init l (fun i -> of_boxed (f i)) + let make_matrix sx sy init = make_matrix sx sy (of_boxed init) + let fill a ofs len v = fill a ofs len (of_boxed v) + let iter f t = iter (fun v -> f (to_boxed v)) t + let iteri f t = iteri (fun i v -> f i (to_boxed v)) t + let map f t = map (fun v -> of_boxed (f (to_boxed v))) t + let map_inplace f t = map_inplace (fun v -> of_boxed (f (to_boxed v))) t + let mapi f t = mapi (fun i v -> of_boxed (f i (to_boxed v))) t + let mapi_inplace f t = mapi_inplace (fun i v -> of_boxed (f i (to_boxed v))) t + let fold_left f acc t = fold_left (fun acc v -> f acc (to_boxed v)) acc t + let fold_right f t acc = fold_right (fun v acc -> f (to_boxed v) acc) t acc + + let iter2 f a b = iter2 (fun v1 v2 -> f (to_boxed v1) (to_boxed v2)) a b + let map2 f a b = map2 (fun v1 v2 -> of_boxed (f (to_boxed v1) (to_boxed v2))) a b + let for_all f t = for_all (fun v -> f (to_boxed v)) t + let exists f t = exists (fun v -> f (to_boxed v)) t + let mem v t = mem (of_boxed v) t + + let find_index f t = find_index (fun v -> f (to_boxed v)) t + let find_opt f t = + match find_index f t with + | None -> None + | Some idx -> Some (get t idx) + let find_map f t = find_map (fun v -> f (to_boxed v)) t + let find_mapi f t = find_mapi (fun i v -> f i (to_boxed v)) t + + let sort f t = sort (fun a b -> f (to_boxed a) (to_boxed b)) t + let stable_sort f t = stable_sort (fun a b -> f (to_boxed a) (to_boxed b)) t + let fast_sort f t = fast_sort (fun a b -> f (to_boxed a) (to_boxed b)) t + + let map_to_array f t = + if length t = 0 then [||] else begin + let res = Array.make (length t) (f (get t 0)) in + iteri (fun idx v -> if idx > 0 then Array.set res idx (f v)) t; + res + end + + let map_from_array f a = + if Array.length a = 0 then empty () else begin + let res = make (Array.length a) (f (Array.get a 0)) in + Array.iteri (fun idx v -> if idx > 0 then set res idx (f v)) a; + res + end + + let unsafe_get t idx = to_boxed (unsafe_get t idx) + let unsafe_set t idx v = unsafe_set t idx (of_boxed v) + let equal = for_all2 (fun x y -> to_boxed x = to_boxed y) + let for_all2 f t1 t2 = for_all2 (fun a b -> f (to_boxed a) (to_boxed b)) t1 t2 + let exists2 f t1 t2 = exists2 (fun a b -> f (to_boxed a) (to_boxed b)) t1 t2 +end + +module Test (A : S) : sig end = struct + let module I = A.I in + let assert_eq x y = assert (I.compare x y = 0) in + + (* auxiliary functions *) + let rec check_i_upto a i = + if i >= 0 then begin + assert_eq (A.get a i) (I.of_int i); + check_i_upto a (i - 1); + end + in + + let check_i a = check_i_upto a (A.length a - 1) in + + let check_inval f arg = + match f arg with + | _ -> Format.printf "check_inval failed"; assert false + | exception (Invalid_argument _) -> () + | exception _ -> assert false + in + + (* [make] [set] [get] *) + let a = A.make 1000 (I.of_int 1) in + for i = 0 to 499 do A.set a i (I.of_int i) done; + let rec loop i = + if i >= 0 then begin + assert_eq (A.get a i) (if i < 500 then I.of_int i else (I.of_int 1)); + loop (i - 1); + end + in loop 999; + check_inval (A.get a) (-1); + check_inval (A.get a) (1000); + check_inval (fun i -> A.set a i (I.of_int 1)) (-1); + check_inval (fun i -> A.set a i (I.of_int 1)) 1000; + check_inval (fun i -> A.make i (I.of_int 1)) (-1); + check_inval (fun i -> A.make i (I.of_int 1)) (A.max_length + 1); + + let a = A.make 1001 (I.of_int 1) in + for i = 0 to 499 do A.set a i (I.of_int i) done; + let rec loop i = + if i >= 0 then begin + assert_eq (A.get a i) (if i < 500 then I.of_int i else (I.of_int 1)); + loop (i - 1); + end + in loop 1000; + check_inval (A.get a) (-1); + check_inval (A.get a) (1001); + check_inval (fun i -> A.set a i (I.of_int 1)) (-1); + check_inval (fun i -> A.set a i (I.of_int 1)) 1001; + + (* [length] *) + let test_length l = assert (l = (A.length (A.make l (I.of_int 1)))) in + test_length 0; + test_length 1; + test_length 10; + test_length 25; + test_length 255; + test_length 256; + test_length 1000; + test_length 1001; + test_length 123456; + + (* [init] *) + let a = A.init 1000 I.of_int in + check_i a; + let a = A.init 1001 I.of_int in + check_i a; + check_inval (fun i -> A.init i I.of_int) (-1); + check_inval (fun i -> A.init i I.of_int) (A.max_length + 1); + + (* [append] *) + let check m n = + let a = A.init m I.of_int in + let b = A.init n (fun x -> I.of_int (x + m)) in + let c = A.append a b in + assert (A.length c = (m + n)); + check_i c; + in + check 0 0; + check 0 100; + check 1 100; + check 100 0; + check 100 1; + check 100 100; + check 1000 1000; + check 1000 1001; + check 1001 1000; + check 1001 1001; + (* check_inval omitted *) + + (* [concat] *) + let check l = + let f (len, acc) n = + (len + n, A.init n (fun i -> I.of_int (len + i)) :: acc) + in + let (total, ll) = List.fold_left f (0, []) l in + let b = A.concat (List.rev ll) in + assert (A.length b = total); + check_i b; + in + check [0; 0; 0]; + check [1; 10; 100]; + check [10; 0]; + check [0]; + check [1000; 1000; 1000]; + check []; + check [1001; 1000; 1000]; + check [1000; 1001; 1000]; + check [1000; 1000; 1001]; + check [1001; 1001; 1001]; + (* check_inval omitted *) + + (* [sub] *) + let a = A.init 1000 (fun i -> I.of_int (i - 100)) in + let b = A.sub a 100 200 in + check_i b; + assert (A.length b = 200); + let b = A.sub a 1000 0 in + check_i b; + assert (A.length b = 0); + check_inval (A.sub a (-1)) 0; + check_inval (A.sub a 0) (-1); + check_inval (A.sub a 0) 1001; + check_inval (A.sub a 1000) 1; + + let a = A.init 1001 (fun i -> I.of_int (i - 101)) in + let b = A.sub a 101 199 in + check_i b; + assert (A.length b = 199); + let b = A.sub a 1001 0 in + check_i (A.sub a 1001 0); + assert (A.length b = 0); + check_inval (A.sub a (-1)) 0; + check_inval (A.sub a 0) (-1); + check_inval (A.sub a 0) 1002; + check_inval (A.sub a 1001) 1; + + (* [copy] *) + let check len = + let a = A.init len I.of_int in + let b = A.copy a in + check_i b; + assert (A.length b = len); + in + check 0; + check 1; + check 128; + check 1023; + + (* [blit] [fill] *) + let test_blit_fill data initval ofs len = + let a = A.of_list data in + let b = A.make (List.length data) (I.of_int 1) in + A.blit a 0 b 0 (A.length b); + assert (A.equal a b); + A.fill b ofs len initval; + let rec check i = function + | [] -> () + | hd :: tl -> + assert_eq (A.get b i) (if i >= ofs && i < ofs + len + then initval else hd); + check (i + 1) tl; + in + check 0 data + in + test_blit_fill [I.of_int 1;I.of_int 2;I.of_int 5;I.of_int 8;I.of_int (-100);I.of_int 2120000000] (I.of_int 3) 3 2; + let a = A.make 100 (I.of_int 0) in + check_inval (A.fill a (-1) 0) (I.of_int 1); + check_inval (A.fill a 0 (-1)) (I.of_int 1); + check_inval (A.fill a 0 101) (I.of_int 1); + check_inval (A.fill a 100 1) (I.of_int 1); + check_inval (A.fill a 101 0) (I.of_int 1); + check_inval (A.blit a (-1) a 0) 0; + check_inval (A.blit a 0 a 0) (-1); + check_inval (A.blit a 0 a 0) 101; + check_inval (A.blit a 100 a 0) 1; + check_inval (A.blit a 101 a 0) 0; + check_inval (A.blit a 0 a (-1)) 0; + check_inval (A.blit a 0 a 100) 1; + check_inval (A.blit a 0 a 101) 0; + let a = A.make 101 (I.of_int 0) in + check_inval (A.fill a (-1) 0) (I.of_int 1); + check_inval (A.fill a 0 (-1)) (I.of_int 1); + check_inval (A.fill a 0 102) (I.of_int 1); + check_inval (A.fill a 101 1) (I.of_int 1); + check_inval (A.fill a 102 0) (I.of_int 1); + check_inval (A.blit a (-1) a 0) 0; + check_inval (A.blit a 0 a 0) (-1); + check_inval (A.blit a 0 a 0) 102; + check_inval (A.blit a 101 a 0) 1; + check_inval (A.blit a 102 a 0) 0; + check_inval (A.blit a 0 a (-1)) 0; + check_inval (A.blit a 0 a 101) 1; + check_inval (A.blit a 0 a 102) 0; + let test_blit_overlap a ofs1 ofs2 len = + let a = A.of_list a in + let b = A.copy a in + A.blit a ofs1 a ofs2 len; + for i = 0 to len - 1 do + assert_eq (A.get b (ofs1 + i)) (A.get a (ofs2 + i)) + done + in + test_blit_overlap [(I.of_int 1); (I.of_int 2); (I.of_int 3); (I.of_int 4)] 1 2 2; + + (* [to_list] [of_list] *) + let a = A.init 1000 I.of_int in + assert (A.equal a (A.of_list (A.to_list a))); + let a = A.init 1001 I.of_int in + assert (A.equal a (A.of_list (A.to_list a))); + let a = A.init 0 I.of_int in + assert (A.equal a (A.of_list (A.to_list a))); + (* check_inval omitted *) + + (* [iter] *) + let a = A.init 300 (I.of_int) in + let r = ref (I.of_int 0) in + A.iter (fun x -> assert_eq x !r; r := I.add x (I.of_int 1)) a; + A.iter (fun _ -> assert false) (A.make 0 (I.of_int 0)); + assert_eq !r (I.of_int 300); + + let a = A.init 301 (I.of_int) in + let r = ref (I.of_int 0) in + A.iter (fun x -> assert_eq x !r; r := I.add x (I.of_int 1)) a; + assert_eq !r (I.of_int 301); + + (* [iteri] *) + let a = A.init 300 I.of_int in + let r = ref 0 in + let f i x = + assert (i = !r); + assert_eq x (I.of_int i); + r := i + 1 + in + A.iteri f a; + A.iteri (fun _ _ -> assert false) (A.make 0 (I.of_int 0)); + assert (!r = 300); + + let a = A.init 301 I.of_int in + let r = ref 0 in + let f i x = + assert (i = !r); + assert_eq x (I.of_int i); + r := i + 1 + in + A.iteri f a; + A.iteri (fun _ _ -> assert false) (A.make 0 (I.of_int 0)); + assert (!r = 301); + + (* [map], test result and order of evaluation *) + let a = A.init 500 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x (!r); + r := I.add !r (I.of_int 1); + I.sub x (I.of_int 1) + in + let b = A.map f a in + check_i (A.sub b 1 499); + + let a = A.init 501 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x (!r); + r := I.add !r (I.of_int 1); + I.sub x (I.of_int 1) + in + let b = A.map f a in + check_i (A.sub b 1 500); + + (* [mapi], test result and order of evaluation *) + let a = A.init 500 I.of_int in + let r = ref (I.of_int 0) in + let f i x = + assert_eq x (I.of_int i); + assert_eq x (!r); + r := I.add !r (I.of_int 1); + I.sub x (I.of_int 1) + in + let b = A.mapi f a in + check_i (A.sub b 1 499); + + let a = A.init 501 I.of_int in + let r = ref (I.of_int 0) in + let f i x = + assert_eq x (I.of_int i); + assert_eq x !r; + r := I.add !r (I.of_int 1); + I.sub x (I.of_int 1) + in + let b = A.mapi f a in + check_i (A.sub b 1 500); + + (* [fold_left], test result and order of evaluation *) + let a = A.init 500 I.of_int in + let f acc x = + assert_eq acc x; + I.add x (I.of_int 1) + in + let acc = A.fold_left f (I.of_int 0) a in + assert_eq acc (I.of_int 500); + + let a = A.init 501 I.of_int in + let acc = A.fold_left f (I.of_int 0) a in + assert_eq acc (I.of_int 501); + + (* [fold_right], test result and order of evaluation *) + let a = A.init 500 I.of_int in + let f x acc = + assert_eq x (I.sub acc (I.of_int 1)); + x + in + let acc = A.fold_right f a (I.of_int 500) in + assert_eq acc (I.of_int 0); + + let a = A.init 501 I.of_int in + let acc = A.fold_right f a (I.of_int 501) in + assert_eq acc (I.of_int 0); + + (* [iter2], test result and order of evaluation *) + let a = A.init 123 I.of_int in + let b = A.init 123 I.of_int in + let r = ref (I.of_int 0) in + let f x y = + assert_eq x !r; + assert_eq y !r; + r := I.add!r (I.of_int 1); + in + A.iter2 f a b; + let c = A.make 456 (I.of_int 0) in + check_inval (A.iter2 (fun _ _ -> assert false) a) c; + check_inval (A.iter2 (fun _ _ -> assert false) c) a; + + let a = A.init 124 I.of_int in + let b = A.init 124 I.of_int in + let r = ref (I.of_int 0) in + let f x y = + assert_eq x !r; + assert_eq y !r; + r := I.add !r (I.of_int 1); + in + A.iter2 f a b; + + (* [map2], test result and order of evaluation *) + let a = A.init 456 I.of_int in + let b = A.init 456 (fun i -> I.(mul (of_int i) (I.of_int 2))) in + let r = ref (I.of_int 0) in + let f x y = + assert_eq x !r; + assert_eq y (I.mul !r (I.of_int 2)); + r := I.add !r (I.of_int 1); + I.(neg (sub x y)) + in + let c = A.map2 f a b in + check_i c; + let d = A.make 455 (I.of_int 0) in + check_inval (A.map2 (fun _ _ -> assert false) a) d; + check_inval (A.map2 (fun _ _ -> assert false) d) a; + + let a = A.init 457 I.of_int in + let b = A.init 457 (fun i -> I.(mul (of_int i) (I.of_int 2))) in + let r = ref (I.of_int 0) in + let f x y = + assert_eq x !r; + assert_eq y (I.mul !r (I.of_int 2)); + r := I.add !r (I.of_int 1); + I.(neg (sub x y)) + in + let c = A.map2 f a b in + check_i c; + + (* [for_all], test result and order of evaluation *) + let a = A.init 777 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x !r; + r := I.add x (I.of_int 1); + true + in + assert (A.for_all f a); + let f x = assert_eq x (I.of_int 0); false in + assert (not (A.for_all f a)); + + let a = A.init 778 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x !r; + r := I.add x (I.of_int 1); + true + in + assert (A.for_all f a); + let f x = assert_eq x (I.of_int 0); false in + assert (not (A.for_all f a)); + + (* [exists], test result and order of evaluation *) + let a = A.init 777 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x !r; + r := I.add x (I.of_int 1); + false + in + assert (not (A.exists f a)); + let f x = assert_eq x (I.of_int 0); true in + assert (A.exists f a); + + let a = A.init 778 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x !r; + r := I.add x (I.of_int 1); + false + in + assert (not (A.exists f a)); + let f x = assert_eq x (I.of_int 0); true in + assert (A.exists f a); + + (* [mem] *) + let a = A.init 7777 I.of_int in + assert (A.mem (I.of_int 0) a); + assert (A.mem (I.of_int 7776) a); + assert (not (A.mem ((I.of_int (-1))) a)); + assert (not (A.mem (I.of_int 7777) a)); + let check v = + A.set a 1000 v; + assert (A.mem v a); + in + List.iter check [I.max_val; I.min_val; (I.of_int (-1)); (I.of_int 0)]; + + let a = A.init 7778 I.of_int in + assert (A.mem (I.of_int 0) a); + assert (A.mem (I.of_int 7777) a); + assert (not (A.mem ((I.of_int (-1))) a)); + assert (not (A.mem (I.of_int 7778) a)); + let check v = + A.set a 1001 v; + assert (A.mem v a); + in + List.iter check [I.max_val; I.min_val; (I.of_int (-1)); (I.of_int 0)]; + + (* [find_opt], test result and order of evaluation *) + let a = A.init 777 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x !r; + r := I.add x (I.of_int 1); + false + in + assert (Option.is_none (A.find_opt f a)); + let f x = assert_eq x (I.of_int 0); true in + assert (Option.is_some (A.find_opt f a)); + + (* [find_index], test result and order of evaluation *) + let a = A.init 777 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x !r; + r := I.add x (I.of_int 1); + false + in + assert (Option.is_none (A.find_index f a)); + let f x = assert_eq x (I.of_int 0); true in + assert (Option.get (A.find_index f a) = 0); + + (* [find_map], test result and order of evaluation *) + let a = A.init 777 I.of_int in + let r = ref (I.of_int 0) in + let f x = + assert_eq x !r; + r := I.add x (I.of_int 1); + None + in + assert (Option.is_none (A.find_map f a)); + let f x = assert_eq x (I.of_int 0); Some "abc" in + assert (Option.get (A.find_map f a) = "abc"); + + (* [find_mapi], test result and order of evaluation *) + let a = A.init 777 I.of_int in + let r = ref (I.of_int 0) in + let r_i = ref 0 in + let f i x = + assert (i = !r_i); + assert_eq x !r; + r_i := !r_i + 1; + r := I.add x (I.of_int 1); + None + in + assert (Option.is_none (A.find_mapi f a)); + let f i x = + assert (i = 0); + assert_eq x (I.of_int 0); + Some "abc" + in + assert (Option.get (A.find_mapi f a) = "abc"); + + (* [sort] [fast_sort] [stable_sort] *) + let check_sort sort cmp a = + let rec check_sorted a i = + if i + 1 < A.length a then begin + assert (cmp (A.get a i) (A.get a (i + 1)) <= 0); + check_sorted a (i + 1); + end + in + let rec check_permutation a b i = + let p = Array.make (A.length a) true in + let rec find lo hi x = + assert (lo < hi); + if hi = lo + 1 then begin + assert (cmp (A.get a lo) x = 0); + assert (p.(lo)); + p.(lo) <- false; + end else begin + let mid = (lo + hi) / 2 in + assert (lo < mid && mid < hi); + match cmp (A.get a (mid - 1)) x with + | 0 when p.(mid - 1) -> find lo mid x + | 0 -> find mid hi x + | c when c < 0 -> find mid hi x + | c when c > 0 -> find lo mid x + | _ -> assert false + end + in + A.iter (find 0 (A.length a)) b + in + let b = A.copy a in + sort cmp a; + check_sorted a 0; + check_permutation a b 0; + in + Random.init 123; + let rand_val _ = + match Random.int 1000 with + | n when n < 500 -> I.rand I.max_val + | _ -> I.neg (I.rand I.max_val) + in + let check s = + let a = A.init 5 I.of_int in + check_sort s I.compare a; (* already sorted *) + check_sort s (fun x y -> I.compare y x) a; (* reverse-sorted *) + + let a = A.init 6 I.of_int in + check_sort s I.compare a; (* already sorted *) + check_sort s (fun x y -> I.compare y x) a; (* reverse-sorted *) + + let a = A.of_list [I.max_val; I.min_val; (I.of_int (-1)); (I.of_int 0)] in + check_sort s I.compare a; (* already sorted *) + check_sort s (fun x y -> I.compare y x) a; (* reverse-sorted *) + + let a = A.init 50000 rand_val in + check_sort s I.compare a; + let a = A.init 50001 rand_val in + check_sort s I.compare a; + let a = A.make 1000 (I.of_int 1) in + check_sort s I.compare a; + let a = A.make 1001 (I.of_int 1) in + check_sort s I.compare a; + let a = A.append (A.make 1000 (I.of_int 1)) (A.make 1000 (I.of_int 2)) in + check_sort s I.compare a; + let a = A.append (A.make 1001 (I.of_int 1)) (A.make 1001 (I.of_int 2)) in + check_sort s I.compare a; + in + check A.sort; + check A.stable_sort; + check A.fast_sort; + + (* [to_seq] *) + let check_seq a = + let r = ref 0 in + let f x = + assert_eq (A.get a !r) x; + r := !r + 1; + in + let s = A.to_seq a in + Seq.iter f s; + in + check_seq (A.init 999 I.of_int); + check_seq (A.init 1000 I.of_int); + check_seq (A.make 0 (I.of_int 0)); + + (* [to_seqi] *) + let check_seqi a = + let r = ref 0 in + let f (i, x) = + assert (i = !r); + assert_eq (A.get a !r) x; + r := !r + 1; + in + let s = A.to_seqi a in + Seq.iter f s; + in + check_seqi (A.init 999 I.of_int); + check_seqi (A.init 1000 I.of_int); + check_seqi (A.make 0 (I.of_int 0)); + + (* [of_seq] *) + let r = ref 0 in + let rec f () = + if !r = 100 then Seq.Nil else begin + let res = Seq.Cons (I.of_int !r, f) in + r := !r + 1; + res + end + in + let a = A.of_seq f in + assert (A.equal a (A.init 100 I.of_int)); + assert (A.equal (A.of_seq Seq.empty) (A.make 0 (I.of_int 0))); + + (* [map_to_array] *) + let r = ref 0 in + let f x = + assert_eq x (I.of_int !r); + r := !r + 1; + I.mul x (I.of_int 2) + in + let a = A.init 876 I.of_int in + let ar1 = A.map_to_array f a in + let ar2 = Array.init 876 (fun x -> I.of_int (2 * x)) in + assert (ar1 = ar2); + let ar = A.map_to_array (fun _ -> assert false) (A.make 0 (I.of_int 0)) in + assert (ar = [| |]); + + (* [map_from_array] *) + let r = ref 0 in + let f x = + assert_eq x (I.of_int !r); + r := !r + 1; + I.mul x (I.of_int 2) + in + let ar = Array.init 876 I.of_int in + let a1 = A.map_from_array f ar in + let a2 = A.init 876 (fun x -> I.of_int (2 * x)) in + assert (A.equal a1 a2); + let a = A.map_from_array (fun _ -> assert false) [| |] in + assert (A.equal a (A.make 0 (I.of_int 0))); + + (* comparisons *) + (* No polymorphic compare yet *) + (* let normalize_comparison n = + if n = 0 then 0 else if n < 0 then -1 else 1 + in + let check c l1 l2 = + assert (c = (normalize_comparison (compare (A.of_list l1) (A.of_list l2)))) + in + check 0 [(I.of_int 0); (I.of_int 1); (I.of_int -4); I.max_val; I.min_val] + [(I.of_int 0); (I.of_int 1); (I.of_int -4); I.max_val; I.min_val]; + check (-1) [(I.of_int 0); (I.of_int 1); (I.of_int -4); I.max_val; I.min_val] + [(I.of_int 0); (I.of_int 1); (I.of_int -4); I.max_val; I.(add min_val (I.of_int 1))]; + check (-1) [(I.of_int 0); (I.of_int 1); (I.of_int -4); I.max_val; 4509684(I.of_int 3)] + [(I.of_int 0); (I.of_int 1); (I.of_int -4); I.max_val; 4509684(I.of_int 4)]; + check 1 [(I.of_int 0); (I.of_int 2); (I.of_int -4)] + [(I.of_int 0); (I.of_int 0); (I.of_int 3)]; + check 1 [(I.of_int 0); (I.of_int 2); (I.of_int -4)] + [I.min_val; (I.of_int 0); (I.of_int 3)]; *) + + (* [unsafe_get] [unsafe_set] *) + let a = A.make 3 (I.of_int 0) in + for i = 0 to 2 do A.unsafe_set a i (I.of_int i) done; + for i = 0 to 2 do assert_eq (A.unsafe_get a i) (I.of_int i) done; + + let a = A.make 4 (I.of_int 0) in + for i = 0 to 3 do A.unsafe_set a i (I.of_int i) done; + for i = 0 to 3 do assert_eq (A.unsafe_get a i) (I.of_int i) done; + + (* I/O *) + (* No marshalling yet *) + (* let test_structured_io value = + let (tmp, oc) = + Filename.open_temp_file ~mode:[Open_binary] "int64_array" ".data" + in + Marshal.to_channel oc value []; + close_out oc; + let ic = open_in_bin tmp in + let value' = Marshal.from_channel ic in + close_in ic; + Sys.remove tmp; + assert (compare value value' = 0) + in + let l = [(I.of_int 0); (I.of_int 1); (I.of_int -4); I.max_val; I.min_val; 3141592(I.of_int 6)] in + test_structured_io (A.of_list l); *) + + (* map_inplace *) + let a = A.init 4 (fun i -> I.of_int (i + 1)) in + A.map_inplace (fun x -> I.mul x (I.of_int 2)) a; + let got = A.map_to_array Fun.id a in + let expected = [|I.of_int 2; I.of_int 4; I.of_int 6; I.of_int 8|] in + assert (Array.for_all2 (fun x y -> I.compare x y = 0) got expected); + + (* mapi_inplace *) + let a = A.init 4 (fun i -> I.of_int (i + 1)) in + A.mapi_inplace (fun i x -> I.(add (add (of_int 1) (of_int i)) x)) a; + let got = A.map_to_array Fun.id a in + let expected = [|I.of_int 2; I.of_int 4; I.of_int 6; I.of_int 8|] in + assert (Array.for_all2 (fun x y -> I.compare x y = 0) got expected); + + (* make_matrix *) + check_inval (A.make_matrix (-1) 1) (I.of_int 1); + check_inval (A.make_matrix 1 (-1)) (I.of_int 1); + let check_matrix a = + let row_len = Array.length a in + assert (row_len > 0); + let col_len = A.length (a.(0)) in + for row = 0 to (row_len - 1) do + assert (A.length (a.(row)) = col_len); + for col = 0 to (col_len - 1) do + assert (I.compare (A.get (a.(row)) col) (I.of_int 1) = 0) + done + done in + let a = A.make_matrix 100 100 (I.of_int 1) in + check_matrix a; + let a = A.make_matrix 101 100 (I.of_int 1) in + check_matrix a; + let a = A.make_matrix 101 101 (I.of_int 1) in + check_matrix a; + let a = A.make_matrix 100 101 (I.of_int 1) in + check_matrix a; + + (* for_all2 *) + let test a = + let r = ref 0 in + let f x y = + assert_eq x (I.of_int !r); + assert_eq y (I.of_int !r); + r := !r + 1; + true + in + assert (A.for_all2 f a a); + let f x y = + assert_eq x (I.of_int 0); assert_eq y (I.of_int 0); false in + assert (not (A.for_all2 f a a) = (A.length a > 0)) + in + let a = A.init 777 I.of_int in + test a; + let a = A.init 778 I.of_int in + test a; + let a = A.init 0 I.of_int in + test a; + let a = A.init 778 I.of_int in + let b = A.init 778 (fun _ -> I.of_int 0) in + assert (A.for_all2 (fun a b -> I.compare a b >= 0) a b); + assert (not (A.for_all2 (fun a b -> I.compare a b >= 0) b a)); + check_inval (fun x -> A.for_all2 (fun _ _ -> true) (A.make 100 x) (A.make 101 x)) + (I.of_int 1); + + (* exists2 *) + let test a = + let r = ref 0 in + let f x y = + assert_eq x (I.of_int !r); + assert_eq y (I.of_int !r); + r := !r + 1; + false + in + assert (not (A.exists2 f a a)); + let f x y = + assert_eq x (I.of_int 0); assert_eq y (I.of_int 0); true in + assert (A.exists2 f a a = (A.length a > 0)) + + in + let a = A.init 777 I.of_int in + test a; + let a = A.init 778 I.of_int in + test a; + let a = A.init 0 I.of_int in + test a; + let a = A.init 778 I.of_int in + let b = A.init 778 (fun _ -> I.of_int 0) in + assert (A.exists2 (fun a b -> I.compare a b > 0) a b); + assert (not (A.exists2 (fun a b -> I.compare a b > 0) b a)); + check_inval (fun x -> A.exists2 (fun _ _ -> true) (A.make 100 x) (A.make 101 x)) + (I.of_int 1); + +end diff --git a/testsuite/tests/typing-layouts-arrays/test_int32_u_array.ml b/testsuite/tests/typing-layouts-arrays/test_int32_u_array.ml new file mode 100644 index 00000000000..a469f1cf451 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/test_int32_u_array.ml @@ -0,0 +1,209 @@ +(* TEST + readonly_files = "gen_u_array.ml test_gen_u_array.ml"; + modules = "${readonly_files}"; + include stdlib_upstream_compatible; + flambda2; + { + bytecode; + }{ + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + } +*) +(* Test compilation correctness for array of unboxed int32s. General + tests around type-checking should go to [basics.ml]. *) + +module Int32_I = struct + include Int32 + let max_val = max_int + let min_val = min_int + let rand = Random.int32 + let print = Format.printf "%ld" +end + +module Int32_array : Test_gen_u_array.S = struct + include Stdlib.Array + type element_t = int32 + type t = element_t array + let map_to_array f a = map f a + let map_from_array f a = map f a + let max_length = Sys.max_array_length + let equal = for_all2 (fun x y -> x = y) + module I = Int32_I +end +module _ = Test_gen_u_array.Test (Int32_array) + +module Int32_u_array0 : Gen_u_array.S0 + with type element_t = int32# + and type ('a : any) array_t = 'a array = struct + + type element_t = int32# + type ('a : any) array_t = 'a array + type element_arg = unit -> element_t + type t = element_t array + let max_length = Sys.max_unboxed_int32_array_length + external length : ('a : bits32). 'a array -> int = "%array_length" + external get: ('a : bits32). 'a array -> int -> 'a = "%array_safe_get" + let get t i = let a = get t i in fun () -> a + external set: ('a : bits32). 'a array -> int -> 'a -> unit = "%array_safe_set" + let set t i e = set t i (e ()) + external unsafe_get: ('a : bits32). 'a array -> int -> 'a = "%array_unsafe_get" + let unsafe_get t i = let a = unsafe_get t i in fun () -> a + external unsafe_set: ('a : bits32). 'a array -> int -> 'a -> unit = "%array_unsafe_set" + let unsafe_set t i e = unsafe_set t i (e ()) + + external unsafe_create : ('a : bits32). int -> 'a array = + "caml_make_unboxed_int32_vect_bytecode" "caml_make_unboxed_int32_vect" + external unsafe_blit : ('a : bits32). + 'a array -> int -> 'a array -> int -> int -> unit = + "caml_array_blit" "caml_unboxed_int32_vect_blit" + let empty () = [||] + external to_boxed : ('a : bits32) -> (int32[@local_opt]) = "%box_int32" + let compare_element x y = Int32.compare (to_boxed (x ())) (to_boxed (y ())) +end + +module Int32_u_array = Gen_u_array.Make (Int32_u_array0) +module Int32_u_array_boxed : Test_gen_u_array.S with type t = int32# array = Test_gen_u_array.Make_boxed (struct + module M = Int32_u_array + module I = Int32_I + module E = struct + open Stdlib_upstream_compatible.Int32_u + let to_boxed x = to_int32 (x ()) + let of_boxed x () = of_int32 x + end +end) +module _ = Test_gen_u_array.Test (Int32_u_array_boxed) + + +(* Extra tests for array expressions and patterns *) +module A = Int32_u_array_boxed +module I = Int32_u_array_boxed.I + +let check_i a = + let rec check_i_upto a i = + if i >= 0 then begin + assert (A.get a i = I.of_int i); + check_i_upto a (i - 1); + end + in + check_i_upto a (A.length a - 1) + +let check_eq_f f arr = A.iteri (fun i x -> assert (x = f i)) arr +let check_all_the_same v arr = A.iter (fun x -> assert (x = v)) arr + +let check_inval f arg = + match f arg with + | _ -> assert false + | exception (Invalid_argument _) -> () + | exception _ -> assert false + +let () = + (* empty arrays *) + let test_empty_array arr = + check_inval (fun a -> A.get a 0) arr; + check_inval (fun a -> A.get a 1) arr; + check_inval (fun a -> A.get a (-1)) arr; + check_inval (fun a -> A.set a 0 (I.of_int 0)) arr; + check_inval (fun a -> A.set a 1 (I.of_int 0)) arr; + check_inval (fun a -> A.set a (-1) (I.of_int 0)) arr + in + let r : A.t = [||] in + test_empty_array r; + let r = A.make (Sys.opaque_identity 0) (I.of_int 0) in + test_empty_array r; + + (* static blocks *) + let r = [| +#0l;#1l;#2l;#3l;#4l;#5l;#6l;#7l;#8l;#9l;#10l;#11l;#12l;#13l;#14l;#15l;#16l;#17l; +#18l;#19l;#20l;#21l;#22l;#23l;#24l;#25l;#26l;#27l;#28l;#29l;#30l;#31l;#32l;#33l;#34l;#35l; +#36l;#37l;#38l;#39l;#40l;#41l;#42l;#43l;#44l;#45l;#46l;#47l;#48l;#49l;#50l;#51l;#52l;#53l; +#54l;#55l;#56l;#57l;#58l;#59l;#60l;#61l;#62l;#63l;#64l;#65l;#66l;#67l;#68l;#69l;#70l;#71l; +#72l;#73l;#74l;#75l;#76l;#77l;#78l;#79l;#80l;#81l;#82l;#83l;#84l;#85l;#86l;#87l;#88l;#89l; +#90l;#91l;#92l;#93l;#94l;#95l;#96l;#97l;#98l;#99l; |] + in + check_i r; + let r = [| +#0l;#1l;#2l;#3l;#4l;#5l;#6l;#7l;#8l;#9l;#10l;#11l;#12l;#13l;#14l;#15l;#16l;#17l; +#18l;#19l;#20l;#21l;#22l;#23l;#24l;#25l;#26l;#27l;#28l;#29l;#30l;#31l;#32l;#33l;#34l;#35l; +#36l;#37l;#38l;#39l;#40l;#41l;#42l;#43l;#44l;#45l;#46l;#47l;#48l;#49l;#50l;#51l;#52l;#53l; +#54l;#55l;#56l;#57l;#58l;#59l;#60l;#61l;#62l;#63l;#64l;#65l;#66l;#67l;#68l;#69l;#70l;#71l; +#72l;#73l;#74l;#75l;#76l;#77l;#78l;#79l;#80l;#81l;#82l;#83l;#84l;#85l;#86l;#87l;#88l;#89l; +#90l;#91l;#92l;#93l;#94l;#95l;#96l;#97l;#98l;#99l;#100l; |] + in + check_i r; + let r = [|-#123l;-#123l;-#123l;-#123l;-#123l;-#123l;-#123l;-#123l;-#123l;-#123l;-#123l;|] in + check_all_the_same (I.of_int (-123)) r; + let r = + [|-#1l; #1l; -#1l; #1l; -#1l; #1l; -#1l; #1l; -#1l;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|#1l; -#1l; #1l; -#1l; #1l; -#1l; #1l; -#1l;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + (* dynamic blocks *) + let[@inline never] f x = x in + let r = [| + f #0l;f #1l;f #2l;f #3l;f #4l;f #5l;f #6l;f #7l;f #8l;f #9l;f #10l;f #11l;f #12l;f #13l;f #14l; + f #15l;f #16l;f #17l;f #18l;f #19l;f #20l;f #21l;f #22l;f #23l;f #24l;f #25l;f #26l;f #27l;f #28l;f #29l; + f #30l;f #31l;f #32l;f #33l;f #34l;f #35l;f #36l;f #37l;f #38l;f #39l;f #40l;f #41l;f #42l;f #43l;f #44l; + f #45l;f #46l;f #47l;f #48l;f #49l;f #50l;f #51l;f #52l;f #53l;f #54l;f #55l;f #56l;f #57l;f #58l;f #59l; + f #60l;f #61l;f #62l;f #63l;f #64l;f #65l;f #66l;f #67l;f #68l;f #69l;f #70l;f #71l;f #72l;f #73l;f #74l; + f #75l;f #76l;f #77l;f #78l;f #79l;f #80l;f #81l;f #82l;f #83l;f #84l;f #85l;f #86l;f #87l;f #88l;f #89l; + f #90l;f #91l;f #92l;f #93l;f #94l;f #95l;f #96l;f #97l;f #98l;f #99l; |] + in + check_i r; + let r = [| + f #0l;f #1l;f #2l;f #3l;f #4l;f #5l;f #6l;f #7l;f #8l;f #9l;f #10l;f #11l;f #12l;f #13l;f #14l; + f #15l;f #16l;f #17l;f #18l;f #19l;f #20l;f #21l;f #22l;f #23l;f #24l;f #25l;f #26l;f #27l;f #28l;f #29l; + f #30l;f #31l;f #32l;f #33l;f #34l;f #35l;f #36l;f #37l;f #38l;f #39l;f #40l;f #41l;f #42l;f #43l;f #44l; + f #45l;f #46l;f #47l;f #48l;f #49l;f #50l;f #51l;f #52l;f #53l;f #54l;f #55l;f #56l;f #57l;f #58l;f #59l; + f #60l;f #61l;f #62l;f #63l;f #64l;f #65l;f #66l;f #67l;f #68l;f #69l;f #70l;f #71l;f #72l;f #73l;f #74l; + f #75l;f #76l;f #77l;f #78l;f #79l;f #80l;f #81l;f #82l;f #83l;f #84l;f #85l;f #86l;f #87l;f #88l;f #89l; + f #90l;f #91l;f #92l;f #93l;f #94l;f #95l;f #96l;f #97l;f #98l;f #99l;f #100l; |] + in + check_i r; + let r = + [|f (-#123l);f (-#123l);f (-#123l);f (-#123l);f (-#123l);f (-#123l);f (-#123l);f (-#123l);f (-#123l);|] + in + check_all_the_same (I.of_int (-123)) r; + check_i [| #0l; ((fun x -> x) #1l)|]; + check_i [| #0l; ((fun x -> x) #1l); #2l|]; + let r = + [|f (-#1l);f (#1l);f (-#1l);f (#1l);f (-#1l);f (#1l);f (-#1l);f (#1l);f (-#1l);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|f (#1l);f (-#1l);f (#1l);f (-#1l);f (#1l);f (-#1l);f (#1l);f (-#1l);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + () + + +(* expression and patterns *) +let () = + let ( = ) = Stdlib_upstream_compatible.Int32_u.equal in + (* match statement *) + let d = [| #1l; #2l |] in + (match d with + | [| a; b |] -> + assert (a = #1l); + assert (b = #2l) + | _ -> assert false); + + (* let statement pattern *) + let a = [||] in + let b = [| #1l |] in + let c = A.append a b in + let[@warning "-8"] [| d |] = c in + assert (d = #1l); + + (* function argument pattern *) + let[@warning "-8"] f [| b |] = b in + assert (f [| #1l |] = #1l); + () diff --git a/testsuite/tests/typing-layouts-arrays/test_int64_u_array.ml b/testsuite/tests/typing-layouts-arrays/test_int64_u_array.ml new file mode 100644 index 00000000000..cae6ea4a24d --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/test_int64_u_array.ml @@ -0,0 +1,210 @@ +(* TEST + readonly_files = "gen_u_array.ml test_gen_u_array.ml"; + modules = "${readonly_files}"; + include stdlib_upstream_compatible; + flambda2; + { + bytecode; + }{ + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + } +*) +(* Test compilation correctness for array of unboxed int64s. General + tests around type-checking should go to [basics.ml]. *) + +module Int64_I = struct + include Int64 + let max_val = max_int + let min_val = min_int + let rand = Random.int64 + let print = Format.printf "%Ld" +end + +module Int64_array : Test_gen_u_array.S = struct + include Stdlib.Array + type element_t = int64 + type t = element_t array + let map_to_array f a = map f a + let map_from_array f a = map f a + let max_length = Sys.max_array_length + let equal = for_all2 (fun x y -> x = y) + module I = Int64_I +end +module _ = Test_gen_u_array.Test (Int64_array) + +module Int64_u_array0 : Gen_u_array.S0 + with type element_t = int64# + and type ('a : any) array_t = 'a array = struct + + type element_t = int64# + type ('a : any) array_t = 'a array + type element_arg = unit -> element_t + type t = element_t array + let max_length = Sys.max_unboxed_int64_array_length + external length : ('a : bits64). 'a array -> int = "%array_length" + external get: ('a : bits64). 'a array -> int -> 'a = "%array_safe_get" + let get t i = let a = get t i in fun () -> a + external set: ('a : bits64). 'a array -> int -> 'a -> unit = "%array_safe_set" + let set t i e = set t i (e ()) + external unsafe_get: ('a : bits64). 'a array -> int -> 'a = "%array_unsafe_get" + let unsafe_get t i = let a = unsafe_get t i in fun () -> a + external unsafe_set: ('a : bits64). 'a array -> int -> 'a -> unit = "%array_unsafe_set" + let unsafe_set t i e = unsafe_set t i (e ()) + + external unsafe_create : ('a : bits64). int -> 'a array = + "caml_make_unboxed_int64_vect_bytecode" "caml_make_unboxed_int64_vect" + external unsafe_blit : ('a : bits64). + 'a array -> int -> 'a array -> int -> int -> unit = + "caml_array_blit" "caml_unboxed_int64_vect_blit" + let empty () = [||] + external to_boxed : ('a : bits64) -> (int64[@local_opt]) = "%box_int64" + let compare_element x y = Int64.compare (to_boxed (x ())) (to_boxed (y ())) +end + +module Int64_u_array = Gen_u_array.Make (Int64_u_array0) +module Int64_u_array_boxed = Test_gen_u_array.Make_boxed (struct + module M = Int64_u_array + module I = Int64_I + module E = struct + open Stdlib_upstream_compatible.Int64_u + let to_boxed x = to_int64 (x ()) + let of_boxed x () = of_int64 x + end +end) +module _ = Test_gen_u_array.Test (Int64_u_array_boxed) + + + +(* Extra tests for array expressions and patterns *) +module A = Int64_u_array_boxed +module I = Int64_u_array_boxed.I + +let check_i a = + let rec check_i_upto a i = + if i >= 0 then begin + assert (A.get a i = I.of_int i); + check_i_upto a (i - 1); + end + in + check_i_upto a (A.length a - 1) + +let check_eq_f f arr = A.iteri (fun i x -> assert (x = f i)) arr +let check_all_the_same v arr = A.iter (fun x -> assert (x = v)) arr + +let check_inval f arg = + match f arg with + | _ -> assert false + | exception (Invalid_argument _) -> () + | exception _ -> assert false + +let () = + (* empty arrays *) + let test_empty_array arr = + check_inval (fun a -> A.get a 0) arr; + check_inval (fun a -> A.get a 1) arr; + check_inval (fun a -> A.get a (-1)) arr; + check_inval (fun a -> A.set a 0 (I.of_int 0)) arr; + check_inval (fun a -> A.set a 1 (I.of_int 0)) arr; + check_inval (fun a -> A.set a (-1) (I.of_int 0)) arr + in + let r : A.t = [||] in + test_empty_array r; + let r = A.make 0 (I.of_int 0) in + test_empty_array r; + + (* static blocks *) + let r = [| +#0L;#1L;#2L;#3L;#4L;#5L;#6L;#7L;#8L;#9L;#10L;#11L;#12L;#13L;#14L;#15L;#16L;#17L; +#18L;#19L;#20L;#21L;#22L;#23L;#24L;#25L;#26L;#27L;#28L;#29L;#30L;#31L;#32L;#33L;#34L;#35L; +#36L;#37L;#38L;#39L;#40L;#41L;#42L;#43L;#44L;#45L;#46L;#47L;#48L;#49L;#50L;#51L;#52L;#53L; +#54L;#55L;#56L;#57L;#58L;#59L;#60L;#61L;#62L;#63L;#64L;#65L;#66L;#67L;#68L;#69L;#70L;#71L; +#72L;#73L;#74L;#75L;#76L;#77L;#78L;#79L;#80L;#81L;#82L;#83L;#84L;#85L;#86L;#87L;#88L;#89L; +#90L;#91L;#92L;#93L;#94L;#95L;#96L;#97L;#98L;#99L; |] + in + check_i r; + let r = [| +#0L;#1L;#2L;#3L;#4L;#5L;#6L;#7L;#8L;#9L;#10L;#11L;#12L;#13L;#14L;#15L;#16L;#17L; +#18L;#19L;#20L;#21L;#22L;#23L;#24L;#25L;#26L;#27L;#28L;#29L;#30L;#31L;#32L;#33L;#34L;#35L; +#36L;#37L;#38L;#39L;#40L;#41L;#42L;#43L;#44L;#45L;#46L;#47L;#48L;#49L;#50L;#51L;#52L;#53L; +#54L;#55L;#56L;#57L;#58L;#59L;#60L;#61L;#62L;#63L;#64L;#65L;#66L;#67L;#68L;#69L;#70L;#71L; +#72L;#73L;#74L;#75L;#76L;#77L;#78L;#79L;#80L;#81L;#82L;#83L;#84L;#85L;#86L;#87L;#88L;#89L; +#90L;#91L;#92L;#93L;#94L;#95L;#96L;#97L;#98L;#99L;#100L; |] + in + check_i r; + let r = [|-#123L;-#123L;-#123L;-#123L;-#123L;-#123L;-#123L;-#123L;-#123L;-#123L;-#123L;|] in + check_all_the_same (I.of_int (-123)) r; + let r = + [|-#1L; #1L; -#1L; #1L; -#1L; #1L; -#1L; #1L; -#1L;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|#1L; -#1L; #1L; -#1L; #1L; -#1L; #1L; -#1L;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + (* dynamic blocks *) + let[@inline never] f x = x in + let r = [| + f #0L;f #1L;f #2L;f #3L;f #4L;f #5L;f #6L;f #7L;f #8L;f #9L;f #10L;f #11L;f #12L;f #13L;f #14L; + f #15L;f #16L;f #17L;f #18L;f #19L;f #20L;f #21L;f #22L;f #23L;f #24L;f #25L;f #26L;f #27L;f #28L;f #29L; + f #30L;f #31L;f #32L;f #33L;f #34L;f #35L;f #36L;f #37L;f #38L;f #39L;f #40L;f #41L;f #42L;f #43L;f #44L; + f #45L;f #46L;f #47L;f #48L;f #49L;f #50L;f #51L;f #52L;f #53L;f #54L;f #55L;f #56L;f #57L;f #58L;f #59L; + f #60L;f #61L;f #62L;f #63L;f #64L;f #65L;f #66L;f #67L;f #68L;f #69L;f #70L;f #71L;f #72L;f #73L;f #74L; + f #75L;f #76L;f #77L;f #78L;f #79L;f #80L;f #81L;f #82L;f #83L;f #84L;f #85L;f #86L;f #87L;f #88L;f #89L; + f #90L;f #91L;f #92L;f #93L;f #94L;f #95L;f #96L;f #97L;f #98L;f #99L; |] + in + check_i r; + let r = [| + f #0L;f #1L;f #2L;f #3L;f #4L;f #5L;f #6L;f #7L;f #8L;f #9L;f #10L;f #11L;f #12L;f #13L;f #14L; + f #15L;f #16L;f #17L;f #18L;f #19L;f #20L;f #21L;f #22L;f #23L;f #24L;f #25L;f #26L;f #27L;f #28L;f #29L; + f #30L;f #31L;f #32L;f #33L;f #34L;f #35L;f #36L;f #37L;f #38L;f #39L;f #40L;f #41L;f #42L;f #43L;f #44L; + f #45L;f #46L;f #47L;f #48L;f #49L;f #50L;f #51L;f #52L;f #53L;f #54L;f #55L;f #56L;f #57L;f #58L;f #59L; + f #60L;f #61L;f #62L;f #63L;f #64L;f #65L;f #66L;f #67L;f #68L;f #69L;f #70L;f #71L;f #72L;f #73L;f #74L; + f #75L;f #76L;f #77L;f #78L;f #79L;f #80L;f #81L;f #82L;f #83L;f #84L;f #85L;f #86L;f #87L;f #88L;f #89L; + f #90L;f #91L;f #92L;f #93L;f #94L;f #95L;f #96L;f #97L;f #98L;f #99L;f #100L; |] + in + check_i r; + let r = + [|f (-#123L);f (-#123L);f (-#123L);f (-#123L);f (-#123L);f (-#123L);f (-#123L);f (-#123L);f (-#123L);|] + in + check_all_the_same (I.of_int (-123)) r; + check_i [| #0L; ((fun x -> x) #1L)|]; + check_i [| #0L; ((fun x -> x) #1L); #2L|]; + let r = + [|f (-#1L);f (#1L);f (-#1L);f (#1L);f (-#1L);f (#1L);f (-#1L);f (#1L);f (-#1L);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|f (#1L);f (-#1L);f (#1L);f (-#1L);f (#1L);f (-#1L);f (#1L);f (-#1L);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + () + + +(* expression and patterns *) +let () = + let ( = ) = Stdlib_upstream_compatible.Int64_u.equal in + (* match statement *) + let d = [| #1L; #2L |] in + (match d with + | [| a; b |] -> + assert (a = #1L); + assert (b = #2L) + | _ -> assert false); + + (* let statement pattern *) + let a = [||] in + let b = [| #1L |] in + let c = A.append a b in + let[@warning "-8"] [| d |] = c in + assert (d = #1L); + + (* function argument pattern *) + let[@warning "-8"] f [| b |] = b in + assert (f [| #1L |] = #1L); + () diff --git a/testsuite/tests/typing-layouts-arrays/test_nativeint_u_array.ml b/testsuite/tests/typing-layouts-arrays/test_nativeint_u_array.ml new file mode 100644 index 00000000000..732fb0c3c2d --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/test_nativeint_u_array.ml @@ -0,0 +1,212 @@ +(* TEST + readonly_files = "gen_u_array.ml test_gen_u_array.ml"; + modules = "${readonly_files}"; + include stdlib_upstream_compatible; + flambda2; + { + bytecode; + }{ + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + } +*) +(* Test compilation correctness for array of unboxed nativeints. + General tests around type-checking should go to [basics.ml]. *) + +module Nativeint_I = struct + include Nativeint + let max_val = max_int + let min_val = min_int + let rand = Random.nativeint + let print = Format.printf "%nd" +end + +module Nativeint_array : Test_gen_u_array.S = struct + include Stdlib.Array + type element_t = nativeint + type t = element_t array + let map_to_array f a = map f a + let map_from_array f a = map f a + let max_length = Sys.max_array_length + let equal = for_all2 (fun x y -> x = y) + module I = Nativeint_I +end +module _ = Test_gen_u_array.Test (Nativeint_array) + + +module Nativeint_u_array0 : Gen_u_array.S0 + with type element_t = nativeint# + and type ('a : any) array_t = 'a array = struct + + type element_t = nativeint# + type ('a : any) array_t = 'a array + type element_arg = unit -> element_t + type t = element_t array + let max_length = Sys.max_unboxed_nativeint_array_length + external length : ('a : word). 'a array -> int = "%array_length" + external get: ('a : word). 'a array -> int -> 'a = "%array_safe_get" + let get t i = let a = get t i in fun () -> a + external set: ('a : word). 'a array -> int -> 'a -> unit = "%array_safe_set" + let set t i e = set t i (e ()) + external unsafe_get: ('a : word). 'a array -> int -> 'a = "%array_unsafe_get" + let unsafe_get t i = let a = unsafe_get t i in fun () -> a + external unsafe_set: ('a : word). 'a array -> int -> 'a -> unit = "%array_unsafe_set" + let unsafe_set t i e = unsafe_set t i (e ()) + + external unsafe_create : ('a : word). int -> 'a array = + "caml_make_unboxed_nativeint_vect_bytecode" "caml_make_unboxed_nativeint_vect" + external unsafe_blit : ('a : word). + 'a array -> int -> 'a array -> int -> int -> unit = + "caml_array_blit" "caml_unboxed_nativeint_vect_blit" + let empty () = [||] + external to_boxed : ('a : word) -> (nativeint[@local_opt]) = "%box_nativeint" + let compare_element x y = Nativeint.compare (to_boxed (x ())) (to_boxed (y ())) +end + + +module Nativeint_u_array = Gen_u_array.Make (Nativeint_u_array0) +module Nativeint_u_array_boxed = Test_gen_u_array.Make_boxed (struct + module M = Nativeint_u_array + module I = Nativeint_I + module E = struct + open Stdlib_upstream_compatible.Nativeint_u + let to_boxed x = to_nativeint (x ()) + let of_boxed x () = of_nativeint x + end +end) +module _ = Test_gen_u_array.Test (Nativeint_u_array_boxed) + + + +(* Extra tests for array expressions and patterns *) +module A = Nativeint_u_array_boxed +module I = Nativeint_u_array_boxed.I + +let check_i a = + let rec check_i_upto a i = + if i >= 0 then begin + assert (A.get a i = I.of_int i); + check_i_upto a (i - 1); + end + in + check_i_upto a (A.length a - 1) + +let check_eq_f f arr = A.iteri (fun i x -> assert (x = f i)) arr +let check_all_the_same v arr = A.iter (fun x -> assert (x = v)) arr + +let check_inval f arg = + match f arg with + | _ -> assert false + | exception (Invalid_argument _) -> () + | exception _ -> assert false + +let () = + (* empty arrays *) + let test_empty_array arr = + check_inval (fun a -> A.get a 0) arr; + check_inval (fun a -> A.get a 1) arr; + check_inval (fun a -> A.get a (-1)) arr; + check_inval (fun a -> A.set a 0 (I.of_int 0)) arr; + check_inval (fun a -> A.set a 1 (I.of_int 0)) arr; + check_inval (fun a -> A.set a (-1) (I.of_int 0)) arr + in + let r : A.t = [||] in + test_empty_array r; + let r = A.make 0 (I.of_int 0) in + test_empty_array r; + + (* static blocks *) + let r = [| +#0n;#1n;#2n;#3n;#4n;#5n;#6n;#7n;#8n;#9n;#10n;#11n;#12n;#13n;#14n;#15n;#16n;#17n; +#18n;#19n;#20n;#21n;#22n;#23n;#24n;#25n;#26n;#27n;#28n;#29n;#30n;#31n;#32n;#33n;#34n;#35n; +#36n;#37n;#38n;#39n;#40n;#41n;#42n;#43n;#44n;#45n;#46n;#47n;#48n;#49n;#50n;#51n;#52n;#53n; +#54n;#55n;#56n;#57n;#58n;#59n;#60n;#61n;#62n;#63n;#64n;#65n;#66n;#67n;#68n;#69n;#70n;#71n; +#72n;#73n;#74n;#75n;#76n;#77n;#78n;#79n;#80n;#81n;#82n;#83n;#84n;#85n;#86n;#87n;#88n;#89n; +#90n;#91n;#92n;#93n;#94n;#95n;#96n;#97n;#98n;#99n; |] + in + check_i r; + let r = [| +#0n;#1n;#2n;#3n;#4n;#5n;#6n;#7n;#8n;#9n;#10n;#11n;#12n;#13n;#14n;#15n;#16n;#17n; +#18n;#19n;#20n;#21n;#22n;#23n;#24n;#25n;#26n;#27n;#28n;#29n;#30n;#31n;#32n;#33n;#34n;#35n; +#36n;#37n;#38n;#39n;#40n;#41n;#42n;#43n;#44n;#45n;#46n;#47n;#48n;#49n;#50n;#51n;#52n;#53n; +#54n;#55n;#56n;#57n;#58n;#59n;#60n;#61n;#62n;#63n;#64n;#65n;#66n;#67n;#68n;#69n;#70n;#71n; +#72n;#73n;#74n;#75n;#76n;#77n;#78n;#79n;#80n;#81n;#82n;#83n;#84n;#85n;#86n;#87n;#88n;#89n; +#90n;#91n;#92n;#93n;#94n;#95n;#96n;#97n;#98n;#99n;#100n; |] + in + check_i r; + let r = [|-#123n;-#123n;-#123n;-#123n;-#123n;-#123n;-#123n;-#123n;-#123n;-#123n;-#123n;|] in + check_all_the_same (I.of_int (-123)) r; + let r = + [|-#1n; #1n; -#1n; #1n; -#1n; #1n; -#1n; #1n; -#1n;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|#1n; -#1n; #1n; -#1n; #1n; -#1n; #1n; -#1n;|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + (* dynamic blocks *) + let[@inline never] f x = x in + let r = [| + f #0n;f #1n;f #2n;f #3n;f #4n;f #5n;f #6n;f #7n;f #8n;f #9n;f #10n;f #11n;f #12n;f #13n;f #14n; + f #15n;f #16n;f #17n;f #18n;f #19n;f #20n;f #21n;f #22n;f #23n;f #24n;f #25n;f #26n;f #27n;f #28n;f #29n; + f #30n;f #31n;f #32n;f #33n;f #34n;f #35n;f #36n;f #37n;f #38n;f #39n;f #40n;f #41n;f #42n;f #43n;f #44n; + f #45n;f #46n;f #47n;f #48n;f #49n;f #50n;f #51n;f #52n;f #53n;f #54n;f #55n;f #56n;f #57n;f #58n;f #59n; + f #60n;f #61n;f #62n;f #63n;f #64n;f #65n;f #66n;f #67n;f #68n;f #69n;f #70n;f #71n;f #72n;f #73n;f #74n; + f #75n;f #76n;f #77n;f #78n;f #79n;f #80n;f #81n;f #82n;f #83n;f #84n;f #85n;f #86n;f #87n;f #88n;f #89n; + f #90n;f #91n;f #92n;f #93n;f #94n;f #95n;f #96n;f #97n;f #98n;f #99n; |] + in + check_i r; + let r = [| + f #0n;f #1n;f #2n;f #3n;f #4n;f #5n;f #6n;f #7n;f #8n;f #9n;f #10n;f #11n;f #12n;f #13n;f #14n; + f #15n;f #16n;f #17n;f #18n;f #19n;f #20n;f #21n;f #22n;f #23n;f #24n;f #25n;f #26n;f #27n;f #28n;f #29n; + f #30n;f #31n;f #32n;f #33n;f #34n;f #35n;f #36n;f #37n;f #38n;f #39n;f #40n;f #41n;f #42n;f #43n;f #44n; + f #45n;f #46n;f #47n;f #48n;f #49n;f #50n;f #51n;f #52n;f #53n;f #54n;f #55n;f #56n;f #57n;f #58n;f #59n; + f #60n;f #61n;f #62n;f #63n;f #64n;f #65n;f #66n;f #67n;f #68n;f #69n;f #70n;f #71n;f #72n;f #73n;f #74n; + f #75n;f #76n;f #77n;f #78n;f #79n;f #80n;f #81n;f #82n;f #83n;f #84n;f #85n;f #86n;f #87n;f #88n;f #89n; + f #90n;f #91n;f #92n;f #93n;f #94n;f #95n;f #96n;f #97n;f #98n;f #99n;f #100n; |] + in + check_i r; + let r = + [|f (-#123n);f (-#123n);f (-#123n);f (-#123n);f (-#123n);f (-#123n);f (-#123n);f (-#123n);f (-#123n);|] + in + check_all_the_same (I.of_int (-123)) r; + check_i [| #0n; ((fun x -> x) #1n)|]; + check_i [| #0n; ((fun x -> x) #1n); #2n|]; + let r = + [|f (-#1n);f (#1n);f (-#1n);f (#1n);f (-#1n);f (#1n);f (-#1n);f (#1n);f (-#1n);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (-1) else I.of_int 1) r; + let r = + [|f (#1n);f (-#1n);f (#1n);f (-#1n);f (#1n);f (-#1n);f (#1n);f (-#1n);|] + in + check_eq_f (fun idx -> if (idx mod 2) = 0 then I.of_int (1) else I.of_int (-1)) r; + () + + +(* expression and patterns *) +let () = + let ( = ) = Stdlib_upstream_compatible.Nativeint_u.equal in + (* match statement *) + let d = [| #1n; #2n |] in + (match d with + | [| a; b |] -> + assert (a = #1n); + assert (b = #2n) + | _ -> assert false); + + (* let statement pattern *) + let a = [||] in + let b = [| #1n |] in + let c = A.append a b in + let[@warning "-8"] [| d |] = c in + assert (d = #1n); + + (* function argument pattern *) + let[@warning "-8"] f [| b |] = b in + assert (f [| #1n |] = #1n); + () diff --git a/testsuite/tests/typing-layouts-arrays/test_stdlib_float_u_array.ml b/testsuite/tests/typing-layouts-arrays/test_stdlib_float_u_array.ml new file mode 100644 index 00000000000..9a7ea933f81 --- /dev/null +++ b/testsuite/tests/typing-layouts-arrays/test_stdlib_float_u_array.ml @@ -0,0 +1,1044 @@ +(* TEST + readonly_files = "float_u_array.ml"; + modules = "${readonly_files}"; + include stdlib_upstream_compatible; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) +(* Test compilation correctness for array of unboxed floats. General + tests around type-checking should go to [basics.ml]. *) + +open Printf + +(* This is the module type of [Float.Array] except type [t] is abstract. *) +module type S = sig + type t + val length : t -> int + val get : t -> int -> float + val set : t -> int -> float -> unit + val make : int -> float -> t + val create : int -> t + val init : int -> (int -> float) -> t + val append : t -> t -> t + val concat : t list -> t + val sub : t -> int -> int -> t + val copy : t -> t + val fill : t -> int -> int -> float -> unit + val blit : t -> int -> t -> int -> int -> unit + val to_list : t -> float list + val of_list : float list -> t + val iter : (float -> unit) -> t -> unit + val iteri : (int -> float -> unit) -> t -> unit + val map : (float -> float) -> t -> t + val map_inplace : (float -> float) -> t -> unit + val mapi : (int -> float -> float) -> t -> t + val mapi_inplace : (int -> float -> float) -> t -> unit + val fold_left : ('a -> float -> 'a) -> 'a -> t -> 'a + val fold_right : (float -> 'a -> 'a) -> t -> 'a -> 'a + val iter2 : (float -> float -> unit) -> t -> t -> unit + val map2 : (float -> float -> float) -> t -> t -> t + val for_all : (float -> bool) -> t -> bool + val exists : (float -> bool) -> t -> bool + val mem : float -> t -> bool + val mem_ieee : float -> t -> bool + val find_opt : (float -> bool) -> t -> float option + val find_index : (float-> bool) -> t -> int option + val find_map : (float -> 'a option) -> t -> 'a option + val find_mapi : (int -> float -> 'a option) -> t -> 'a option + val sort : (float -> float -> int) -> t -> unit + val stable_sort : (float -> float -> int) -> t -> unit + val fast_sort : (float -> float -> int) -> t -> unit + val to_seq : t -> float Seq.t + val to_seqi : t -> (int * float) Seq.t + val of_seq : float Seq.t -> t + val map_to_array : (float -> 'a) -> t -> 'a array + val map_from_array : ('a -> float) -> 'a array -> t + val unsafe_get : t -> int -> float + val unsafe_set : t -> int -> float -> unit + + (* From Sys, rather than Float.Array *) + val max_length : int +end + +module Flat_float_array : S = struct + include Stdlib.Float.Array + let max_length = Sys.max_floatarray_length +end + +(* module [Array] specialized to [float] and with a few changes, + satisfies signature S *) +module Float_array : S = struct + include Stdlib.Array + let create = create_float + let map_to_array f a = map f a + let map_from_array f a = map f a + let mem_ieee x a = exists ((=) x) a + type t = float array + + (* This test assumes flat float arrays are enabled. *) + let max_length = Sys.max_floatarray_length +end + +module Test_float_u_array : S = struct + include Float_u_array + + module Float_u = Stdlib_upstream_compatible.Float_u + + let to_float = Float_u.to_float + let of_float = Float_u.of_float + + type t = float# array + + let empty () = make 0 (of_float 0.0) + let to_seq a = + let rec aux i () = + if i < length a + then + let x = unsafe_get a i in + Seq.Cons (to_float x, aux (i+1)) + else Seq.Nil + in + aux 0 + + let to_seqi a = + let rec aux i () = + if i < length a + then + let x = unsafe_get a i in + Seq.Cons ((i,to_float x), aux (i+1)) + else Seq.Nil + in + aux 0 + + let of_rev_list = function + [] -> empty () + | hd::tl as l -> + let len = List.length l in + let a = make len (of_float hd) in + let rec fill i = function + [] -> a + | hd::tl -> unsafe_set a i (of_float hd); fill (i-1) tl + in + fill (len-2) tl + + let of_seq i = + let l = Seq.fold_left (fun acc x -> x::acc) [] i in + of_rev_list l + + + let create l = make l (of_float 0.0) + let to_list t = fold_right (fun f l -> (to_float f)::l) t [] + + let of_list l = + let len = List.length l in + let res = create len in + List.iteri (fun idx f -> set res idx (of_float f)) l; + res + + let max_length = Sys.max_unboxed_float_array_length + + let get t idx = to_float (get t idx) + let set t idx v = set t idx (of_float v) + + let make l f = make l (of_float f) + let init l f = init l (fun i -> of_float (f i)) + let fill a ofs len v = fill a ofs len (of_float v) + let iter f t = iter (fun v -> f (to_float v)) t + let iteri f t = iteri (fun i v -> f i (to_float v)) t + let map f t = map (fun v -> of_float (f (to_float v))) t + let map_inplace f t = map_inplace (fun v -> of_float (f (to_float v))) t + let mapi f t = mapi (fun i v -> of_float (f i (to_float v))) t + let mapi_inplace f t = mapi_inplace (fun i v -> of_float (f i (to_float v))) t + let fold_left f acc t = fold_left (fun acc v -> f acc (to_float v)) acc t + let fold_right f t acc = fold_right (fun v acc -> f (to_float v) acc) t acc + + let iter2 f a b = iter2 (fun v1 v2 -> f (to_float v1) (to_float v2)) a b + let map2 f a b = map2 (fun v1 v2 -> of_float (f (to_float v1) (to_float v2))) a b + let for_all f t = for_all (fun v -> f (to_float v)) t + let exists f t = exists (fun v -> f (to_float v)) t + let mem v t = mem (of_float v) t + let mem_ieee goal t = exists (fun v -> v = goal) t + + let find_index f t = find_index (fun v -> f (to_float v)) t + let find_opt f t = + match find_index f t with + | None -> None + | Some idx -> Some (get t idx) + let find_map f t = find_map (fun v -> f (to_float v)) t + let find_mapi f t = find_mapi (fun i v -> f i (to_float v)) t + + let sort f t = sort (fun a b -> f (to_float a) (to_float b)) t + let stable_sort f t = stable_sort (fun a b -> f (to_float a) (to_float b)) t + let fast_sort f t = fast_sort (fun a b -> f (to_float a) (to_float b)) t + + let map_to_array f t = + if length t = 0 then [||] else begin + let res = Array.make (length t) (f (get t 0)) in + iteri (fun idx v -> if idx > 0 then Array.set res idx (f v)) t; + res + end + + let map_from_array f a = + if Array.length a = 0 then empty () else begin + let res = make (Array.length a) (f (Array.get a 0)) in + Array.iteri (fun idx v -> if idx > 0 then set res idx (f v)) a; + res + end + + let unsafe_get t idx = to_float (unsafe_get t idx) + let unsafe_set t idx v = unsafe_set t idx (of_float v) + +end + + +module Test (A : S) : sig end = struct + + (* auxiliary functions *) + + let neg_zero = 1.0 /. neg_infinity in + + let rec check_i_upto a i = + if i >= 0 then begin + assert (A.get a i = Float.of_int i); + check_i_upto a (i - 1); + end + in + + let check_i a = check_i_upto a (A.length a - 1) in + + let check_inval f arg = + match f arg with + | _ -> assert false + | exception (Invalid_argument _) -> () + | exception _ -> assert false + in + + (* [make] [set] [get] *) + let a = A.make 1000 1.0 in + for i = 0 to 499 do A.set a i (Float.of_int i) done; + let rec loop i = + if i >= 0 then begin + assert (A.get a i = (if i < 500 then Float.of_int i else 1.0)); + loop (i - 1); + end + in loop 999; + check_inval (A.get a) (-1); + check_inval (A.get a) (1000); + check_inval (fun i -> A.set a i 1.0) (-1); + check_inval (fun i -> A.set a i 1.0) 1000; + check_inval A.create (-1); + check_inval A.create (A.max_length + 1); + check_inval (fun i -> A.make i 1.0) (-1); + check_inval (fun i -> A.make i 1.0) (A.max_length + 1); + + let a = A.make 1001 1.0 in + for i = 0 to 499 do A.set a i (Float.of_int i) done; + let rec loop i = + if i >= 0 then begin + assert (A.get a i = (if i < 500 then Float.of_int i else 1.0)); + loop (i - 1); + end + in loop 1000; + check_inval (A.get a) (-1); + check_inval (A.get a) (1001); + check_inval (fun i -> A.set a i 1.0) (-1); + check_inval (fun i -> A.set a i 1.0) 1001; + + (* [length] *) + let test_length l = assert (l = (A.length (A.create l))) in + test_length 0; + test_length 10; + test_length 25; + test_length 255; + test_length 256; + test_length 1000; + test_length 123456; + + (* [init] *) + let a = A.init 1000 Float.of_int in + check_i a; + let a = A.init 1001 Float.of_int in + check_i a; + check_inval (fun i -> A.init i Float.of_int) (-1); + check_inval (fun i -> A.init i Float.of_int) (A.max_length + 1); + + (* [append] *) + let check m n = + let a = A.init m Float.of_int in + let b = A.init n (fun x -> Float.of_int (x + m)) in + let c = A.append a b in + assert (A.length c = (m + n)); + check_i c; + in + check 0 0; + check 0 100; + check 1 100; + check 100 0; + check 100 1; + check 100 100; + check 1000 1000; + check 1000 1001; + check 1001 1000; + check 1001 1001; + (* check_inval omitted *) + + (* [concat] *) + let check l = + let f (len, acc) n = + (len + n, A.init n (fun i -> Float.of_int (len + i)) :: acc) + in + let (total, ll) = List.fold_left f (0, []) l in + let b = A.concat (List.rev ll) in + assert (A.length b = total); + check_i b; + in + check [0; 0; 0]; + check [1; 10; 100]; + check [10; 0]; + check [0]; + check [1000; 1000; 1000]; + check []; + check [1001; 1000; 1000]; + check [1000; 1001; 1000]; + check [1000; 1000; 1001]; + check [1001; 1001; 1001]; + (* check_inval omitted *) + + (* [sub] *) + let a = A.init 1000 (fun i -> Float.of_int (i - 100)) in + let b = A.sub a 100 200 in + check_i b; + assert (A.length b = 200); + let b = A.sub a 1000 0 in + check_i b; + assert (A.length b = 0); + check_inval (A.sub a (-1)) 0; + check_inval (A.sub a 0) (-1); + check_inval (A.sub a 0) 1001; + check_inval (A.sub a 1000) 1; + + let a = A.init 1001 (fun i -> Float.of_int (i - 101)) in + let b = A.sub a 101 199 in + check_i b; + assert (A.length b = 199); + let b = A.sub a 1001 0 in + check_i (A.sub a 1001 0); + assert (A.length b = 0); + check_inval (A.sub a (-1)) 0; + check_inval (A.sub a 0) (-1); + check_inval (A.sub a 0) 1002; + check_inval (A.sub a 1001) 1; + + (* [copy] *) + let check len = + let a = A.init len Float.of_int in + let b = A.copy a in + check_i b; + assert (A.length b = len); + in + check 0; + check 1; + check 128; + check 1023; + + (* [blit] [fill] *) + let test_blit_fill data initval ofs len = + let a = A.of_list data in + let b = A.create (List.length data) in + A.blit a 0 b 0 (A.length b); + assert (a = b); + A.fill b ofs len initval; + let rec check i = function + | [] -> () + | hd :: tl -> + assert (A.get b i = (if i >= ofs && i < ofs + len + then initval else hd)); + check (i + 1) tl; + in + check 0 data + in + test_blit_fill [1.0;2.0;5.0;8.123;-100.456;212e19] 3.1415 3 2; + let a = A.create 100 in + check_inval (A.fill a (-1) 0) 1.0; + check_inval (A.fill a 0 (-1)) 1.0; + check_inval (A.fill a 0 101) 1.0; + check_inval (A.fill a 100 1) 1.0; + check_inval (A.fill a 101 0) 1.0; + check_inval (A.blit a (-1) a 0) 0; + check_inval (A.blit a 0 a 0) (-1); + check_inval (A.blit a 0 a 0) 101; + check_inval (A.blit a 100 a 0) 1; + check_inval (A.blit a 101 a 0) 0; + check_inval (A.blit a 0 a (-1)) 0; + check_inval (A.blit a 0 a 100) 1; + check_inval (A.blit a 0 a 101) 0; + let a = A.create 101 in + check_inval (A.fill a (-1) 0) 1.0; + check_inval (A.fill a 0 (-1)) 1.0; + check_inval (A.fill a 0 102) 1.0; + check_inval (A.fill a 101 1) 1.0; + check_inval (A.fill a 102 0) 1.0; + check_inval (A.blit a (-1) a 0) 0; + check_inval (A.blit a 0 a 0) (-1); + check_inval (A.blit a 0 a 0) 102; + check_inval (A.blit a 101 a 0) 1; + check_inval (A.blit a 102 a 0) 0; + check_inval (A.blit a 0 a (-1)) 0; + check_inval (A.blit a 0 a 101) 1; + check_inval (A.blit a 0 a 102) 0; + let test_blit_overlap a ofs1 ofs2 len = + let a = A.of_list a in + let b = A.copy a in + A.blit a ofs1 a ofs2 len; + for i = 0 to len - 1 do + assert (A.get b (ofs1 + i) = A.get a (ofs2 + i)) + done + in + test_blit_overlap [1.; 2.; 3.; 4.] 1 2 2; + + (* [to_list] [of_list] *) + let a = A.init 1000 Float.of_int in + assert (compare a (A.of_list (A.to_list a)) = 0); + let a = A.init 1001 Float.of_int in + assert (compare a (A.of_list (A.to_list a)) = 0); + let a = A.init 0 Float.of_int in + assert (compare a (A.of_list (A.to_list a)) = 0); + (* check_inval omitted *) + + (* [iter] *) + let a = A.init 300 (Float.of_int) in + let r = ref 0.0 in + A.iter (fun x -> assert (x = !r); r := x +. 1.0) a; + A.iter (fun _ -> assert false) (A.create 0); + assert (!r = 300.0); + + let a = A.init 301 (Float.of_int) in + let r = ref 0.0 in + A.iter (fun x -> assert (x = !r); r := x +. 1.0) a; + assert (!r = 301.0); + + (* [iteri] *) + let a = A.init 300 Float.of_int in + let r = ref 0 in + let f i x = + assert (i = !r); + assert (x = Float.of_int i); + r := i + 1 + in + A.iteri f a; + A.iteri (fun _ _ -> assert false) (A.create 0); + assert (!r = 300); + + let a = A.init 301 Float.of_int in + let r = ref 0 in + let f i x = + assert (i = !r); + assert (x = Float.of_int i); + r := i + 1 + in + A.iteri f a; + A.iteri (fun _ _ -> assert false) (A.create 0); + assert (!r = 301); + + (* [map], test result and order of evaluation *) + let a = A.init 500 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := !r +. 1.0; + x -. 1.0 + in + let b = A.map f a in + check_i (A.sub b 1 499); + + let a = A.init 501 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := !r +. 1.0; + x -. 1.0 + in + let b = A.map f a in + check_i (A.sub b 1 500); + + (* [mapi], test result and order of evaluation *) + let a = A.init 500 Float.of_int in + let r = ref 0.0 in + let f i x = + assert (x = Float.of_int i); + assert (x = !r); + r := !r +. 1.0; + x -. 1.0 + in + let b = A.mapi f a in + check_i (A.sub b 1 499); + + let a = A.init 501 Float.of_int in + let r = ref 0.0 in + let f i x = + assert (x = Float.of_int i); + assert (x = !r); + r := !r +. 1.0; + x -. 1.0 + in + let b = A.mapi f a in + check_i (A.sub b 1 500); + + (* [fold_left], test result and order of evaluation *) + let a = A.init 500 Float.of_int in + let f acc x = + assert (acc = x); + x +. 1.0 + in + let acc = A.fold_left f 0.0 a in + assert (acc = 500.0); + + let a = A.init 501 Float.of_int in + let acc = A.fold_left f 0.0 a in + assert (acc = 501.0); + + (* [fold_right], test result and order of evaluation *) + let a = A.init 500 Float.of_int in + let f x acc = + assert (x = acc -. 1.0); + x + in + let acc = A.fold_right f a 500.0 in + assert (acc = 0.0); + + let a = A.init 501 Float.of_int in + let acc = A.fold_right f a 501.0 in + assert (acc = 0.0); + + (* [iter2], test result and order of evaluation *) + let a = A.init 123 Float.of_int in + let b = A.init 123 Float.of_int in + let r = ref 0.0 in + let f x y = + assert (x = !r); + assert (y = !r); + r := !r +. 1.0; + in + A.iter2 f a b; + let c = A.create 456 in + check_inval (A.iter2 (fun _ _ -> assert false) a) c; + check_inval (A.iter2 (fun _ _ -> assert false) c) a; + + let a = A.init 124 Float.of_int in + let b = A.init 124 Float.of_int in + let r = ref 0.0 in + let f x y = + assert (x = !r); + assert (y = !r); + r := !r +. 1.0; + in + A.iter2 f a b; + + (* [map2], test result and order of evaluation *) + let a = A.init 456 Float.of_int in + let b = A.init 456 (fun i -> Float.of_int i /. 2.0) in + let r = ref 0.0 in + let f x y = + assert (x = !r); + assert (y = !r /. 2.0); + r := !r +. 1.0; + 2.0 *. (x -. y) + in + let c = A.map2 f a b in + check_i c; + let d = A.create 455 in + check_inval (A.map2 (fun _ _ -> assert false) a) d; + check_inval (A.map2 (fun _ _ -> assert false) d) a; + + let a = A.init 457 Float.of_int in + let b = A.init 457 (fun i -> Float.of_int i /. 2.0) in + let r = ref 0.0 in + let f x y = + assert (x = !r); + assert (y = !r /. 2.0); + r := !r +. 1.0; + 2.0 *. (x -. y) + in + let c = A.map2 f a b in + check_i c; + + (* [for_all], test result and order of evaluation *) + let a = A.init 777 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := x +. 1.0; + true + in + assert (A.for_all f a); + let f x = assert (x = 0.0); false in + assert (not (A.for_all f a)); + + let a = A.init 778 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := x +. 1.0; + true + in + assert (A.for_all f a); + let f x = assert (x = 0.0); false in + assert (not (A.for_all f a)); + + (* [exists], test result and order of evaluation *) + let a = A.init 777 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := x +. 1.0; + false + in + assert (not (A.exists f a)); + let f x = assert (x = 0.0); true in + assert (A.exists f a); + + let a = A.init 778 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := x +. 1.0; + false + in + assert (not (A.exists f a)); + let f x = assert (x = 0.0); true in + assert (A.exists f a); + + (* [mem] *) + let a = A.init 7777 Float.of_int in + assert (A.mem 0.0 a); + assert (A.mem 7776.0 a); + assert (not (A.mem (-1.0) a)); + assert (not (A.mem 7777.0 a)); + let check v = + A.set a 1000 v; + assert (A.mem v a); + in + List.iter check [infinity; neg_infinity; neg_zero; nan]; + + let a = A.init 7778 Float.of_int in + assert (A.mem 0.0 a); + assert (A.mem 7777.0 a); + assert (not (A.mem (-1.0) a)); + assert (not (A.mem 7778.0 a)); + let check v = + A.set a 1001 v; + assert (A.mem v a); + in + List.iter check [infinity; neg_infinity; neg_zero; nan]; + + (* [mem_ieee] *) + let a = A.init 7777 Float.of_int in + assert (A.mem_ieee 0.0 a); + assert (A.mem_ieee 7776.0 a); + assert (not (A.mem_ieee (-1.0) a)); + assert (not (A.mem_ieee 7777.0 a)); + let check v = + A.set a 1000 v; + assert (A.mem_ieee v a); + in + List.iter check [infinity; neg_infinity; neg_zero]; + A.set a 0 nan; + assert (not (A.mem_ieee nan a)); + + (* [find_opt], test result and order of evaluation *) + let a = A.init 777 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := x +. 1.0; + false + in + assert (Option.is_none (A.find_opt f a)); + let f x = assert (x = 0.0); true in + assert (Option.is_some (A.find_opt f a)); + + (* [find_index], test result and order of evaluation *) + let a = A.init 777 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := x +. 1.0; + false + in + assert (Option.is_none (A.find_index f a)); + let f x = assert (x = 0.0); true in + assert (Option.get (A.find_index f a) = 0); + + (* [find_map], test result and order of evaluation *) + let a = A.init 777 Float.of_int in + let r = ref 0.0 in + let f x = + assert (x = !r); + r := x +. 1.0; + None + in + assert (Option.is_none (A.find_map f a)); + let f x = assert (x = 0.0); Some "abc" in + assert (Option.get (A.find_map f a) = "abc"); + + (* [find_mapi], test result and order of evaluation *) + let a = A.init 777 Float.of_int in + let r = ref 0.0 in + let r_i = ref 0 in + let f i x = + assert (i = !r_i); + assert (x = !r); + r_i := !r_i + 1; + r := x +. 1.0; + None + in + assert (Option.is_none (A.find_mapi f a)); + let f i x = + assert (i = 0); + assert (x = 0.0); + Some "abc" + in + assert (Option.get (A.find_mapi f a) = "abc"); + + (* [sort] [fast_sort] [stable_sort] *) + let check_sort sort cmp a = + let rec check_sorted a i = + if i + 1 < A.length a then begin + assert (cmp (A.get a i) (A.get a (i + 1)) <= 0); + check_sorted a (i + 1); + end + in + let rec check_permutation a b i = + let p = Array.make (A.length a) true in + let rec find lo hi x = + assert (lo < hi); + if hi = lo + 1 then begin + assert (cmp (A.get a lo) x = 0); + assert (p.(lo)); + p.(lo) <- false; + end else begin + let mid = (lo + hi) / 2 in + assert (lo < mid && mid < hi); + match cmp (A.get a (mid - 1)) x with + | 0 when p.(mid - 1) -> find lo mid x + | 0 -> find mid hi x + | c when c < 0 -> find mid hi x + | c when c > 0 -> find lo mid x + | _ -> assert false + end + in + A.iter (find 0 (A.length a)) b + in + let b = A.copy a in + sort cmp a; + check_sorted a 0; + check_permutation a b 0; + in + Random.init 123; + let rand_float _ = + match Random.int 1004 with + | 1000 -> nan + | 1001 -> infinity + | 1002 -> neg_infinity + | 1003 -> neg_zero + | n when n < 500 -> Random.float 1.0 + | _ -> -. Random.float 1.0 + in + let check s = + let a = A.init 5 Float.of_int in + check_sort s Stdlib.compare a; (* already sorted *) + check_sort s (fun x y -> Stdlib.compare y x) a; (* reverse-sorted *) + + let a = A.init 6 Float.of_int in + check_sort s Stdlib.compare a; (* already sorted *) + check_sort s (fun x y -> Stdlib.compare y x) a; (* reverse-sorted *) + + let a = A.of_list [nan; neg_infinity; neg_zero; 0.; infinity] in + check_sort s Stdlib.compare a; (* already sorted *) + check_sort s (fun x y -> Stdlib.compare y x) a; (* reverse-sorted *) + + let a = A.init 50000 rand_float in + check_sort s Stdlib.compare a; + let a = A.init 50001 rand_float in + check_sort s Stdlib.compare a; + let a = A.make 1000 1.0 in + check_sort s Stdlib.compare a; + let a = A.make 1001 1.0 in + check_sort s Stdlib.compare a; + let a = A.append (A.make 1000 1.0) (A.make 1000 2.0) in + check_sort s Stdlib.compare a; + let a = A.append (A.make 1001 1.0) (A.make 1001 2.0) in + check_sort s Stdlib.compare a; + in + check A.sort; + check A.stable_sort; + check A.fast_sort; + + (* [to_seq] *) + let check_seq a = + let r = ref 0 in + let f x = + assert (A.get a !r = x); + r := !r + 1; + in + let s = A.to_seq a in + Seq.iter f s; + in + check_seq (A.init 999 Float.of_int); + check_seq (A.init 1000 Float.of_int); + check_seq (A.create 0); + + (* [to_seqi] *) + let check_seqi a = + let r = ref 0 in + let f (i, x) = + assert (i = !r); + assert (A.get a !r = x); + r := !r + 1; + in + let s = A.to_seqi a in + Seq.iter f s; + in + check_seqi (A.init 999 Float.of_int); + check_seqi (A.init 1000 Float.of_int); + check_seqi (A.create 0); + + (* [of_seq] *) + let r = ref 0 in + let rec f () = + if !r = 100 then Seq.Nil else begin + let res = Seq.Cons (Float.of_int !r, f) in + r := !r + 1; + res + end + in + let a = A.of_seq f in + assert (a = A.init 100 Float.of_int); + assert (A.of_seq Seq.empty = A.create 0); + + (* [map_to_array] *) + let r = ref 0 in + let f x = + assert (x = Float.of_int !r); + r := !r + 1; + x *. 2.0 + in + let a = A.init 876 Float.of_int in + let ar1 = A.map_to_array f a in + let ar2 = Array.init 876 (fun x -> Float.of_int (2 * x)) in + assert (ar1 = ar2); + let ar = A.map_to_array (fun _ -> assert false) (A.create 0) in + assert (ar = [| |]); + + (* [map_from_array] *) + let r = ref 0 in + let f x = + assert (x = Float.of_int !r); + r := !r + 1; + x *. 2.0 + in + let ar = Array.init 876 Float.of_int in + let a1 = A.map_from_array f ar in + let a2 = A.init 876 (fun x -> Float.of_int (2 * x)) in + assert (a1 = a2); + let a = A.map_from_array (fun _ -> assert false) [| |] in + assert (a = A.create 0); + + (* comparisons *) + let normalize_comparison n = + if n = 0 then 0 else if n < 0 then -1 else 1 + in + let check c l1 l2 = + assert (c = (normalize_comparison (compare (A.of_list l1) (A.of_list l2)))) + in + check 0 [0.0; 0.25; -4.0; 3.141592654; nan] + [0.0; 0.25; -4.0; 3.141592654; nan]; + check (-1) [0.0; 0.25; nan] + [0.0; 0.25; 3.14]; + check (-1) [0.0; 0.25; -4.0] + [0.0; 0.25; 3.14159]; + check 1 [0.0; 2.718; -4.0] + [0.0; 0.25; 3.14159]; + check 1 [0.0; 2.718; -4.0] + [nan; 0.25; 3.14159]; + + (* [unsafe_get] [unsafe_set] *) + let a = A.create 3 in + for i = 0 to 2 do A.unsafe_set a i (float i) done; + for i = 0 to 2 do assert (A.unsafe_get a i = float i) done; + + let a = A.create 4 in + for i = 0 to 3 do A.unsafe_set a i (float i) done; + for i = 0 to 3 do assert (A.unsafe_get a i = float i) done; + + (* I/O *) + let test_structured_io value = + let (tmp, oc) = + Filename.open_temp_file ~mode:[Open_binary] "floatarray" ".data" + in + Marshal.to_channel oc value []; + close_out oc; + let ic = open_in_bin tmp in + let value' = Marshal.from_channel ic in + close_in ic; + Sys.remove tmp; + assert (compare value value' = 0) + in + let l = [0.; 0.25; -4.; 3.14159265; nan; infinity; neg_infinity; neg_zero] in + test_structured_io (A.of_list l); + + (* map_inplace *) + let a = A.init 4 (fun i -> Float.of_int (i + 1)) in + A.map_inplace (fun x -> 2. *. x) a; + let got = A.map_to_array Fun.id a in + let expected = [|2.; 4.; 6.; 8.|] in + assert (Array.for_all2 Float.equal got expected); + + (* mapi_inplace *) + let a = A.init 4 (fun i -> Float.of_int (i + 1)) in + A.mapi_inplace (fun i x -> 1. +. (Float.of_int i) +. x) a; + let got = A.map_to_array Fun.id a in + let expected = [|2.; 4.; 6.; 8.|] in + assert (Array.for_all2 Float.equal got expected) +end + +module T3 = Test (Test_float_u_array) + +(* Extra tests for functions not covered above *) +module Float_u = Stdlib_upstream_compatible.Float_u +let () = + let open Float_u_array in + let check_inval f arg = + match f arg with + | _ -> assert false + | exception (Invalid_argument _) -> () + | exception _ -> assert false + in + + (* make_matrix *) + check_inval (make_matrix (-1) 1) (Float_u.of_int 1); + check_inval (make_matrix 1 (-1)) (Float_u.of_int 1); + let check_matrix a = + let row_len = Array.length a in + assert (row_len > 0); + let col_len = length (a.(0)) in + for row = 0 to (row_len - 1) do + assert (length (a.(row)) = col_len); + for col = 0 to (col_len - 1) do + assert Float_u.(equal (get (a.(row)) col) (of_int 1)) + done + done in + let a = make_matrix 100 100 (Float_u.of_int 1) in + check_matrix a; + let a = make_matrix 101 100 (Float_u.of_int 1) in + check_matrix a; + let a = make_matrix 101 101 (Float_u.of_int 1) in + check_matrix a; + let a = make_matrix 100 101 (Float_u.of_int 1) in + check_matrix a; + + (* for_all2 *) + let test a = + let r = ref 0.0 in + let f x y = + let x = Float_u.to_float x in + let y = Float_u.to_float y in + assert (x = !r); + assert (y = !r); + r := x +. 1.0; + true + in + assert (for_all2 f a a); + let f x y = + let x = Float_u.to_float x in + let y = Float_u.to_float y in + assert (x = 0.0); assert (y = 0.0); false in + if length a > 0 then assert (not (for_all2 f a a)) + + in + let a = init 777 Float_u.of_int in + test a; + let a = init 778 Float_u.of_int in + test a; + let a = init 0 Float_u.of_int in + test a; + check_inval (fun x -> for_all2 (fun _ _ -> true) (make 100 x) (make 101 x)) + (Float_u.of_int 1); + + (* exists2 *) + let test a = + let r = ref 0.0 in + let f x y = + let x = Float_u.to_float x in + let y = Float_u.to_float y in + assert (x = !r); + assert (y = !r); + r := x +. 1.0; + false + in + assert (not (exists2 f a a)); + let f x y = + let x = Float_u.to_float x in + let y = Float_u.to_float y in + assert (x = 0.0); assert (y = 0.0); true in + if length a > 0 then assert (exists2 f a a) + + in + let a = init 777 Float_u.of_int in + test a; + let a = init 778 Float_u.of_int in + test a; + let a = init 0 Float_u.of_int in + test a; + check_inval (fun x -> exists2 (fun _ _ -> true) (make 100 x) (make 101 x)) + (Float_u.of_int 1) + +module Test_same_memory_layout_as_floatarray = struct + (* It is currently the case that [float# array] has the same memory + representation as [floatarray]. This test is here to document + that fact and help catch issues when this assumption is no longer + true. *) + + external get_f : floatarray -> int -> float = "%floatarray_safe_get" + let get_f (arr : float# array) idx = + get_f (Obj.magic arr : floatarray) idx |> Float_u.of_float + + external set_f : floatarray -> int -> float -> unit = "%floatarray_safe_set" + let set_f (arr : float# array) idx v = + set_f (Obj.magic arr : floatarray) idx (Float_u.to_float v) + + let float_u_eq x y = Float_u.compare x y = 0 + let check_eq arr g = + let open Float_u_array in + for i = 0 to length arr - 1 do + assert (float_u_eq (g arr i) (get arr i)) + done + + let () = + let open Float_u_array in + + check_eq (Float_u_array.make 10 #1.) get_f; + check_eq [| #1.; #2.; #3.|] get_f; + + let fill arr v = + for i = 0 to length arr - 1 do + set_f arr i v; assert(float_u_eq (get arr i) v) + done + in + let check_all_eq arr v = assert (for_all (fun x -> float_u_eq x v) arr) in + let arr = [| #1.; #2.; #3.|] in + fill arr #0.; check_all_eq arr #0.; + let arr = Float_u_array.make 10 #1. in + fill arr #0.; check_all_eq arr #0.; + () +end diff --git a/testsuite/tests/typing-layouts-bits32/alloc.ml b/testsuite/tests/typing-layouts-bits32/alloc.ml new file mode 100644 index 00000000000..f330dfd94d2 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/alloc.ml @@ -0,0 +1,112 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + native; +*) + +(* A test comparing allocations when using unboxed [int32#]es to allocations + when using boxed [int32s]. *) + +(* Hide polymorphic equality *) +let ( = ) = Int.equal + +module Int32 = struct + include Int32 + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( = ) = equal +end + +module Int32_u = struct + include Stdlib_upstream_compatible.Int32_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( = ) = equal +end + +let baseline_allocation = + let first = Gc.allocated_bytes () in + let second = Gc.allocated_bytes () in + second -. first + +let measure_alloc fmt f = + let before = Gc.allocated_bytes () in + let result = (f[@inlined never]) () in + let after = Gc.allocated_bytes () in + let alloc = (after -. before) -. baseline_allocation in + Printf.printf (fmt ^^ "; %s\n") + (Int32_u.to_int32 result) + (if alloc > 0.0 then "allocated" else "did not allocate") + +(* We mark key functions [[@inline never]]. Without this, flambda2 might be + able to eliminate all allocations in the boxed case, and it's important to + have neither inlined for a fair comparison. (This was the case in the + [float64] version of this test.) *) + +module Collatz_unboxed = struct + open Int32_u + + let[@inline never] rec collatz_count' count n = + if n = of_int32 1l then + count + else + collatz_count' + (succ count) + (if n %% of_int32 2l = of_int32 0l then + n // of_int32 2l + else + of_int32 3l * n + of_int32 1l) + + let collatz_count n = collatz_count' (of_int32 0l) n + + let go () = + measure_alloc "Unboxed: Collatz took %ld steps to reach 1" + (fun () -> collatz_count (of_int32 27l)) +end + +module Collatz_boxed = struct + open Int32 + + let[@inline never] rec collatz_count' count n = + if n = 1l then + count + else + collatz_count' + (succ count) + (if n %% 2l = 0l then + n // 2l + else + 3l*n + 1l) + + let collatz_count n = Int32_u.of_int32 (collatz_count' 0l n) + + let go () = + measure_alloc "Boxed: Collatz took %ld steps to reach 1" + (fun () -> collatz_count 27l) +end + +let () = Collatz_unboxed.go () +let () = Collatz_boxed.go () + +let[@inline never] literal_test x y = + let open Int32_u in + let[@inline never] f x y = (#1l + x) * (y - #4l) in + match x with + | #2l | #0x7fffffffl-> (f x y) / (#3l % #10l) + | _ -> #0l + +let _ = measure_alloc "literals (should be -1): %ld" (fun () -> literal_test #2l #3l) +let _ = measure_alloc "literals (should be -715827882): %ld" + (fun () -> literal_test #0x7fffffffl #0x7fffffffl) diff --git a/testsuite/tests/typing-layouts-bits32/alloc.reference b/testsuite/tests/typing-layouts-bits32/alloc.reference new file mode 100644 index 00000000000..93995822e15 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/alloc.reference @@ -0,0 +1,4 @@ +Unboxed: Collatz took 111 steps to reach 1; did not allocate +Boxed: Collatz took 111 steps to reach 1; allocated +literals (should be -1): -1; did not allocate +literals (should be -715827882): -715827882; did not allocate diff --git a/testsuite/tests/typing-layouts-bits32/basics.ml b/testsuite/tests/typing-layouts-bits32/basics.ml new file mode 100644 index 00000000000..bf170b12375 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/basics.ml @@ -0,0 +1,778 @@ +(* TEST + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } +*) + +(* This file contains typing tests for the layout [bits32]. + + Runtime tests for the type [int32#] can be found in the + [unboxed_int32], [alloc], and [test_int32_u] tests in this + directory. The type [int32#] here is used as a convenient example of a + concrete [bits32] type in some tests, but its behavior isn't the primary + purpose of this test. *) + +type t_bits32 : bits32 +type ('a : bits32) t_bits32_id = 'a + +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_bits32) = x;; +let f1_2 (x : 'a t_bits32_id) = x;; +let f1_3 (x : int32#) = x;; +[%%expect{| +type t_bits32 : bits32 +type ('a : bits32) t_bits32_id = 'a +val f1_1 : t_bits32 -> t_bits32 = +val f1_2 : ('a : bits32). 'a t_bits32_id -> 'a t_bits32_id = +val f1_3 : int32# -> int32# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_bits32) = + let y = x in + y;; + +let f2_2 (x : 'a t_bits32_id) = + let y = x in + y;; + +let f2_3 (x : int32#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_bits32 -> t_bits32 = +val f2_2 : ('a : bits32). 'a t_bits32_id -> 'a t_bits32_id = +val f2_3 : int32# -> int32# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_bits32 = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_bits32 = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout bits32. +|}];; + +let x3_2 : 'a t_bits32_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_bits32_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout bits32. +|}];; + +let x3_3 : int32# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : int32# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout bits32. +|}];; + +module M3_4 = struct + let x : t_bits32 = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_bits32 = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout bits32. +|}];; + +module M3_5 = struct + let f (x : int32#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout bits32. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_bits32) = x, false;; +[%%expect{| +Line 1, characters 26-27: +1 | let f4_1 (x : t_bits32) = x, false;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_bits32_id) = x, false;; +[%%expect{| +Line 1, characters 32-33: +1 | let f4_2 (x : 'a t_bits32_id) = x, false;; + ^ +Error: This expression has type 'a t_bits32_id = ('a : bits32) + but an expression was expected of type ('b : value) + The layout of 'a t_bits32_id is bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. + But the layout of 'a t_bits32_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : int32#) = x, false;; +[%%expect{| +Line 1, characters 24-25: +1 | let f4_3 (x : int32#) = x, false;; + ^ +Error: This expression has type int32# but an expression was expected of type + ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_bits32 * string;; +[%%expect{| +Line 1, characters 12-20: +1 | type t4_4 = t_bits32 * string;; + ^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * int32#;; +[%%expect{| +Line 1, characters 18-24: +1 | type t4_5 = int * int32#;; + ^^^^^^ +Error: Tuple element types must have layout value. + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : bits32) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 26-28: +1 | type ('a : bits32) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : bits32, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 31-33: +1 | type ('a : bits32, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(*********************************************************) +(* Test 5: Allowed in some structures in typedecls. *) + +type t5_1 = { x : t_bits32 };; +[%%expect{| +type t5_1 = { x : t_bits32; } +|}];; + +type t5_2 = { y : int; x : t_bits32 };; +[%%expect{| +type t5_2 = { y : int; x : t_bits32; } +|}];; + +type t5_2' = { y : string; x : t_bits32 };; +[%%expect{| +type t5_2' = { y : string; x : t_bits32; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_bits32 } [@@unboxed];; +[%%expect{| +Line 1, characters 14-26: +1 | type t5_3 = { x : t_bits32 } [@@unboxed];; + ^^^^^^^^^^^^ +Error: Type t_bits32 has layout bits32. + Unboxed records may not yet contain types of this layout. +|}];; + + +type t5_4 = A of t_bits32;; +[%%expect{| +type t5_4 = A of t_bits32 +|}];; + +type t5_5 = A of int * t_bits32;; +[%%expect{| +type t5_5 = A of int * t_bits32 +|}];; + +type ('a : bits32) t5_7 = A of int +type ('a : bits32) t5_8 = A of 'a;; +[%%expect{| +type ('a : bits32) t5_7 = A of int +type ('a : bits32) t5_8 = A of 'a +|}] + +(* not allowed: value in flat suffix *) +type 'a t_disallowed = A of t_bits32 * 'a + +[%%expect{| +Line 1, characters 23-41: +1 | type 'a t_disallowed = A of t_bits32 * 'a + ^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_bits32, but found boxed argument, 'a. +|}] + +type t5_6 = A of t_bits32 [@@unboxed];; +[%%expect{| +Line 1, characters 12-25: +1 | type t5_6 = A of t_bits32 [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_bits32 has layout bits32. + Unboxed variants may not yet contain types of this layout. +|}];; + +type t5_6_1 = A of { x : t_bits32 } [@@unboxed];; +[%%expect{| +Line 1, characters 21-33: +1 | type t5_6_1 = A of { x : t_bits32 } [@@unboxed];; + ^^^^^^^^^^^^ +Error: Type t_bits32 has layout bits32. + Unboxed inlined records may not yet contain types of this layout. +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_bits32 end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-39: +1 | module type S6_1 = sig val x : t_bits32 end + ^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of type t_bits32 must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_bits32_id end +[%%expect{| +Line 1, characters 31-45: +1 | module type S6_2 = sig val x : 'a t_bits32_id end + ^^^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_bits32_id is bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. + But the layout of type 'a t_bits32_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : int32# end +[%%expect{| +Line 1, characters 31-37: +1 | module type S6_3 = sig val x : int32# end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of type int32# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_bits32) = `A x;; +[%%expect{| +Line 1, characters 29-30: +1 | let f7_1 (x : t_bits32) = `A x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_bits32_id) = `A x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f7_2 (x : 'a t_bits32_id) = `A x;; + ^ +Error: This expression has type 'a t_bits32_id = ('a : bits32) + but an expression was expected of type ('b : value) + The layout of 'a t_bits32_id is bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. + But the layout of 'a t_bits32_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : int32#) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f7_3 (x : int32#) = `A x;; + ^ +Error: This expression has type int32# but an expression was expected of type + ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_bits32 ];; +[%%expect{| +Line 1, characters 20-28: +1 | type f7_4 = [ `A of t_bits32 ];; + ^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : bits32) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 34-36: +1 | type ('a : bits32) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_bits32 () : t_bits32 = assert false +let make_t_bits32_id () : 'a t_bits32_id = assert false +let make_int32u () : int32# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_bits32 : unit -> t_bits32 = +val make_t_bits32_id : ('a : bits32). unit -> 'a t_bits32_id = +val make_int32u : unit -> int32# = +val id_value : 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_bits32 ());; +[%%expect{| +Line 1, characters 20-38: +1 | let x8_1 = id_value (make_t_bits32 ());; + ^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_bits32_id ());; +[%%expect{| +Line 1, characters 20-41: +1 | let x8_2 = id_value (make_t_bits32_id ());; + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_bits32_id = ('a : bits32) + but an expression was expected of type ('b : value) + The layout of 'a t_bits32_id is bits32 + because of the definition of make_t_bits32_id at line 2, characters 21-55. + But the layout of 'a t_bits32_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_int32u ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_3 = id_value (make_int32u ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type int32# but an expression was expected of type + ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But bits32 functions do. *) + +let twice f (x : 'a t_bits32_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_bits32 ()) +let f9_2 () = twice f1_2 (make_t_bits32_id ()) +let f9_3 () = twice f1_3 (make_int32u ());; +[%%expect{| +val twice : + ('a : bits32). + ('a t_bits32_id -> 'a t_bits32_id) -> 'a t_bits32_id -> 'a t_bits32_id = + +val f9_1 : unit -> t_bits32 t_bits32_id = +val f9_2 : ('a : bits32). unit -> 'a t_bits32_id = +val f9_3 : unit -> int32# t_bits32_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of bits32 and externals *) + +(* Valid uses of bits32 in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> int32# = "foo";; +[%%expect{| +Line 1, characters 0-46: +1 | external f10_1 : int -> bool -> int32# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_bits32 -> int = "foo";; +[%%expect{| +Line 1, characters 0-40: +1 | external f10_2 : t_bits32 -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_6 : (int32#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : int32# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (int32#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> int32# = "foo" "bar" +|}];; + +external f10_8 : int32 -> int32# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (int32 [@unboxed]) -> int32# = "foo" "bar" +|}];; + +external f10_9 : (int32#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 18-24: +1 | external f10_9 : (int32#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (int32#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-35: +1 | external f10_10 : string -> (int32#[@untagged]) = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(*************************************************) +(* Test 11: bits32 banned in extensible variants *) + +type t11_1 = .. + +type t11_1 += A of t_bits32;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-27: +3 | type t11_1 += A of t_bits32;; + ^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of int32#;; +[%%expect{| +Line 1, characters 14-25: +1 | type t11_1 += B of int32#;; + ^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type ('a : bits32) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : bits32) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +(* not allowed: value in flat suffix *) +type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + +[%%expect{| +Line 1, characters 17-40: +1 | type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, 'a, + but found boxed argument, 'b. +|}] + +(***************************************) +(* Test 12: bits32 in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_bits32 >;; +[%%expect{| +Line 1, characters 15-27: +1 | type t12_1 = < x : t_bits32 >;; + ^^^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : bits32) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 33-35: +1 | type ('a : bits32) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_bits32 = assert false end;; +[%%expect{| +Line 1, characters 21-55: +1 | class c12_3 = object method x : t_bits32 = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_bits32 but is expected to have type + ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_bits32_id -> 'a t_bits32_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_bits32_id -> 'a t_bits32_id = assert false + ^^ +Error: This type ('a : bits32) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. +|}];; + +class c12_5 = object val x : t_bits32 = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_bits32 = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : int32# end;; +[%%expect{| +Line 1, characters 26-43: +1 | class type c12_6 = object method x : int32# end;; + ^^^^^^^^^^^^^^^^^ +Error: The method x has type int32# but is expected to have type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : int32# end +[%%expect{| +Line 1, characters 26-40: +1 | class type c12_7 = object val x : int32# end + ^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is bits32 + because it is the primitive bits32 type int32#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_bits32_id -> 'a t_bits32_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_bits32_id -> 'a t_bits32_id + ^^ +Error: This type ('a : bits32) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_bits32 -> t_bits32 > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_bits32) : t_bits32 = o#baz y y y;; +class ['a] c12_11 = object + method x : t_bits32 -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_bits32 = assert false +end;; +[%%expect{| +type t12_8 = < f : t_bits32 -> t_bits32 > +val f12_9 : t12_8 -> t_bits32 -> t_bits32 = +val f12_10 : + < baz : t_bits32 -> t_bits32 -> t_bits32 -> t_bits32; .. > -> + t_bits32 -> t_bits32 = +class ['a] c12_11 : object method x : t_bits32 -> 'a end +class ['a] c12_12 : object method x : 'a -> t_bits32 end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_bits32 + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_bits32) (m2 : t_bits32) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on bits32 yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_bits32) = x = x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f13_1 (x : t_bits32) = x = x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_bits32) = compare x x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f13_2 (x : t_bits32) = compare x x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_bits32) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 44-45: +1 | let f13_3 (x : t_bits32) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_bits32) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 40-41: +1 | let f13_4 (x : t_bits32) = Hashtbl.hash x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; diff --git a/testsuite/tests/typing-layouts-bits32/basics_alpha.ml b/testsuite/tests/typing-layouts-bits32/basics_alpha.ml new file mode 100644 index 00000000000..9088619418a --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/basics_alpha.ml @@ -0,0 +1,769 @@ +(* TEST + { + flags = "-extension layouts_alpha"; + expect; + } +*) + +(* This file contains typing tests for the layout [bits32]. + + Runtime tests for the type [int32#] can be found in the + [unboxed_int32], [alloc], and [test_int32_u] tests in this + directory. The type [int32#] here is used as a convenient example of a + concrete [bits32] type in some tests, but its behavior isn't the primary + purpose of this test. *) + +type t_bits32 : bits32 +type ('a : bits32) t_bits32_id = 'a + +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_bits32) = x;; +let f1_2 (x : 'a t_bits32_id) = x;; +let f1_3 (x : int32#) = x;; +[%%expect{| +type t_bits32 : bits32 +type ('a : bits32) t_bits32_id = 'a +val f1_1 : t_bits32 -> t_bits32 = +val f1_2 : ('a : bits32). 'a t_bits32_id -> 'a t_bits32_id = +val f1_3 : int32# -> int32# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_bits32) = + let y = x in + y;; + +let f2_2 (x : 'a t_bits32_id) = + let y = x in + y;; + +let f2_3 (x : int32#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_bits32 -> t_bits32 = +val f2_2 : ('a : bits32). 'a t_bits32_id -> 'a t_bits32_id = +val f2_3 : int32# -> int32# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_bits32 = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_bits32 = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout bits32. +|}];; + +let x3_2 : 'a t_bits32_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_bits32_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout bits32. +|}];; + +let x3_3 : int32# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : int32# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout bits32. +|}];; + +module M3_4 = struct + let x : t_bits32 = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_bits32 = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout bits32. +|}];; + +module M3_5 = struct + let f (x : int32#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout bits32. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_bits32) = x, false;; +[%%expect{| +Line 1, characters 26-27: +1 | let f4_1 (x : t_bits32) = x, false;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value_or_null) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_bits32_id) = x, false;; +[%%expect{| +Line 1, characters 32-33: +1 | let f4_2 (x : 'a t_bits32_id) = x, false;; + ^ +Error: This expression has type 'a t_bits32_id = ('a : bits32) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_bits32_id is bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. + But the layout of 'a t_bits32_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : int32#) = x, false;; +[%%expect{| +Line 1, characters 24-25: +1 | let f4_3 (x : int32#) = x, false;; + ^ +Error: This expression has type int32# but an expression was expected of type + ('a : value_or_null) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_bits32 * string;; +[%%expect{| +Line 1, characters 12-20: +1 | type t4_4 = t_bits32 * string;; + ^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * int32#;; +[%%expect{| +Line 1, characters 18-24: +1 | type t4_5 = int * int32#;; + ^^^^^^ +Error: Tuple element types must have layout value. + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : bits32) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 26-28: +1 | type ('a : bits32) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value_or_null) should be an instance of type + ('a0 : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : bits32, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 31-33: +1 | type ('a : bits32, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(*********************************************************) +(* Test 5: Allowed in some structures in typedecls. *) + +type t5_1 = { x : t_bits32 };; +[%%expect{| +type t5_1 = { x : t_bits32; } +|}];; + +type t5_2 = { y : int; x : t_bits32 };; +[%%expect{| +type t5_2 = { y : int; x : t_bits32; } +|}];; + +type t5_2' = { y : string; x : t_bits32 };; +[%%expect{| +type t5_2' = { y : string; x : t_bits32; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_bits32 } [@@unboxed];; +[%%expect{| +Line 1, characters 14-26: +1 | type t5_3 = { x : t_bits32 } [@@unboxed];; + ^^^^^^^^^^^^ +Error: Type t_bits32 has layout bits32. + Unboxed records may not yet contain types of this layout. +|}];; + + +type t5_4 = A of t_bits32;; +[%%expect{| +type t5_4 = A of t_bits32 +|}];; + +type t5_5 = A of int * t_bits32;; +[%%expect{| +type t5_5 = A of int * t_bits32 +|}];; + +type ('a : bits32) t5_7 = A of int +type ('a : bits32) t5_8 = A of 'a;; +[%%expect{| +type ('a : bits32) t5_7 = A of int +type ('a : bits32) t5_8 = A of 'a +|}] + +(* not allowed: value in flat suffix *) +type 'a t_disallowed = A of t_bits32 * 'a + +[%%expect{| +Line 1, characters 23-41: +1 | type 'a t_disallowed = A of t_bits32 * 'a + ^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_bits32, but found boxed argument, 'a. +|}] + +type t5_6 = A of t_bits32 [@@unboxed];; +[%%expect{| +Line 1, characters 12-25: +1 | type t5_6 = A of t_bits32 [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_bits32 has layout bits32. + Unboxed variants may not yet contain types of this layout. +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_bits32 end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-39: +1 | module type S6_1 = sig val x : t_bits32 end + ^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of type t_bits32 must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_bits32_id end +[%%expect{| +Line 1, characters 31-45: +1 | module type S6_2 = sig val x : 'a t_bits32_id end + ^^^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_bits32_id is bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. + But the layout of type 'a t_bits32_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : int32# end +[%%expect{| +Line 1, characters 31-37: +1 | module type S6_3 = sig val x : int32# end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of type int32# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_bits32) = `A x;; +[%%expect{| +Line 1, characters 29-30: +1 | let f7_1 (x : t_bits32) = `A x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value_or_null) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_bits32_id) = `A x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f7_2 (x : 'a t_bits32_id) = `A x;; + ^ +Error: This expression has type 'a t_bits32_id = ('a : bits32) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_bits32_id is bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. + But the layout of 'a t_bits32_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : int32#) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f7_3 (x : int32#) = `A x;; + ^ +Error: This expression has type int32# but an expression was expected of type + ('a : value_or_null) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_bits32 ];; +[%%expect{| +Line 1, characters 20-28: +1 | type f7_4 = [ `A of t_bits32 ];; + ^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : bits32) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 34-36: +1 | type ('a : bits32) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value_or_null) should be an instance of type + ('a0 : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_bits32 () : t_bits32 = assert false +let make_t_bits32_id () : 'a t_bits32_id = assert false +let make_int32u () : int32# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_bits32 : unit -> t_bits32 = +val make_t_bits32_id : ('a : bits32). unit -> 'a t_bits32_id = +val make_int32u : unit -> int32# = +val id_value : ('a : value_or_null). 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_bits32 ());; +[%%expect{| +Line 1, characters 20-38: +1 | let x8_1 = id_value (make_t_bits32 ());; + ^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value_or_null) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_bits32_id ());; +[%%expect{| +Line 1, characters 20-41: +1 | let x8_2 = id_value (make_t_bits32_id ());; + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_bits32_id = ('a : bits32) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_bits32_id is bits32 + because of the definition of make_t_bits32_id at line 2, characters 21-55. + But the layout of 'a t_bits32_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_int32u ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_3 = id_value (make_int32u ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type int32# but an expression was expected of type + ('a : value_or_null) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But bits32 functions do. *) + +let twice f (x : 'a t_bits32_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_bits32 ()) +let f9_2 () = twice f1_2 (make_t_bits32_id ()) +let f9_3 () = twice f1_3 (make_int32u ());; +[%%expect{| +val twice : + ('a : bits32). + ('a t_bits32_id -> 'a t_bits32_id) -> 'a t_bits32_id -> 'a t_bits32_id = + +val f9_1 : unit -> t_bits32 t_bits32_id = +val f9_2 : ('a : bits32). unit -> 'a t_bits32_id = +val f9_3 : unit -> int32# t_bits32_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of bits32 and externals *) + +(* Valid uses of bits32 in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> int32# = "foo";; +[%%expect{| +Line 1, characters 0-46: +1 | external f10_1 : int -> bool -> int32# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_bits32 -> int = "foo";; +[%%expect{| +Line 1, characters 0-40: +1 | external f10_2 : t_bits32 -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_6 : (int32#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : int32# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (int32#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> int32# = "foo" "bar" +|}];; + +external f10_8 : int32 -> int32# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (int32 [@unboxed]) -> int32# = "foo" "bar" +|}];; + +external f10_9 : (int32#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 18-24: +1 | external f10_9 : (int32#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (int32#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-35: +1 | external f10_10 : string -> (int32#[@untagged]) = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(*************************************************) +(* Test 11: bits32 banned in extensible variants *) + +type t11_1 = .. + +type t11_1 += A of t_bits32;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-27: +3 | type t11_1 += A of t_bits32;; + ^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of int32#;; +[%%expect{| +Line 1, characters 14-25: +1 | type t11_1 += B of int32#;; + ^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type ('a : bits32) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : bits32) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +(* not allowed: value in flat suffix *) +type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + +[%%expect{| +Line 1, characters 17-40: +1 | type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, 'a, + but found boxed argument, 'b. +|}] + +(***************************************) +(* Test 12: bits32 in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_bits32 >;; +[%%expect{| +Line 1, characters 15-27: +1 | type t12_1 = < x : t_bits32 >;; + ^^^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : bits32) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 33-35: +1 | type ('a : bits32) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_bits32 = assert false end;; +[%%expect{| +Line 1, characters 21-55: +1 | class c12_3 = object method x : t_bits32 = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_bits32 but is expected to have type + ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_bits32_id -> 'a t_bits32_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_bits32_id -> 'a t_bits32_id = assert false + ^^ +Error: This type ('a : bits32) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. +|}];; + +class c12_5 = object val x : t_bits32 = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_bits32 = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : int32# end;; +[%%expect{| +Line 1, characters 26-43: +1 | class type c12_6 = object method x : int32# end;; + ^^^^^^^^^^^^^^^^^ +Error: The method x has type int32# but is expected to have type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : int32# end +[%%expect{| +Line 1, characters 26-40: +1 | class type c12_7 = object val x : int32# end + ^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is bits32 + because it is the primitive bits32 type int32#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_bits32_id -> 'a t_bits32_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_bits32_id -> 'a t_bits32_id + ^^ +Error: This type ('a : bits32) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits32 + because of the definition of t_bits32_id at line 2, characters 0-35. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_bits32 -> t_bits32 > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_bits32) : t_bits32 = o#baz y y y;; +class ['a] c12_11 = object + method x : t_bits32 -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_bits32 = assert false +end;; +[%%expect{| +type t12_8 = < f : t_bits32 -> t_bits32 > +val f12_9 : t12_8 -> t_bits32 -> t_bits32 = +val f12_10 : + < baz : t_bits32 -> t_bits32 -> t_bits32 -> t_bits32; .. > -> + t_bits32 -> t_bits32 = +class ['a] c12_11 : object method x : t_bits32 -> 'a end +class ['a] c12_12 : object method x : 'a -> t_bits32 end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_bits32 + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_bits32) (m2 : t_bits32) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on bits32 yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_bits32) = x = x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f13_1 (x : t_bits32) = x = x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_bits32) = compare x x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f13_2 (x : t_bits32) = compare x x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_bits32) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 44-45: +1 | let f13_3 (x : t_bits32) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_bits32) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 40-41: +1 | let f13_4 (x : t_bits32) = Hashtbl.hash x;; + ^ +Error: This expression has type t_bits32 + but an expression was expected of type ('a : value) + The layout of t_bits32 is bits32 + because of the definition of t_bits32 at line 1, characters 0-22. + But the layout of t_bits32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; diff --git a/testsuite/tests/typing-layouts-bits32/c_api.ml b/testsuite/tests/typing-layouts-bits32/c_api.ml new file mode 100644 index 00000000000..3589a6460c4 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/c_api.ml @@ -0,0 +1,75 @@ +(* TEST + modules = "c_functions.c"; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* This file tests using external C functions with int32#. *) + +external to_int32 : int32# -> (int32[@local_opt]) = "%box_int32" + +let print_int32u s f = Printf.printf "%s: %ld\n" s (to_int32 f) +let print_int32 s f = Printf.printf "%s: %ld\n" s f + +(* Various combinations of arguments int32, int32 [@unboxed], and + int32# *) +external lognot_UtoU : int32# -> int32# = + "lognot_bytecode" "lognot_UtoU" +external lognot_BtoU : int32 -> int32# = + "lognot_bytecode" "lognot_BtoU" +external lognot_UtoB : int32# -> int32 = + "lognot_bytecode" "lognot_UtoB" +external lognot_BUtoU : (int32[@unboxed]) -> int32# = + "lognot_bytecode" "lognot_UtoU" +external lognot_UtoBU : int32# -> (int32[@unboxed]) = + "lognot_bytecode" "lognot_UtoU" + +let () = + let i = lognot_UtoU #42l in + print_int32u "int32# -> int32#, ~42" i + +let () = + let i = lognot_BtoU (-100l) in + print_int32u "int32 -> int32#, ~(-100)" i + +let () = + let f = lognot_UtoB #255l in + print_int32 "int32# -> int32, ~255" f + +let () = + let f = lognot_BUtoU 1024l in + print_int32u "(int32[@unboxed]) -> int32#, ~1024" f + +let () = + let f = lognot_UtoBU (-#1726l) in + print_int32 "int32# -> (int32[@unboxed]), ~(-1726)" f + +(* If there are more than 5 args, you get an array in bytecode *) +external sum_7 : + int32# -> int32 -> int32# -> int32 -> + int32# -> int32 -> int32# -> int32# = + "sum_7_bytecode" "sum_7_UBUBUBUtoU" + +let _ = + let f = + sum_7 + #1l 2l #3l 4l + #5l 6l #7l + in + print_int32u "Function of 7 args, 1+2+3+4+5+6+7" f diff --git a/testsuite/tests/typing-layouts-bits32/c_api.reference b/testsuite/tests/typing-layouts-bits32/c_api.reference new file mode 100644 index 00000000000..61e2dfa0d03 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/c_api.reference @@ -0,0 +1,6 @@ +int32# -> int32#, ~42: -43 +int32 -> int32#, ~(-100): 99 +int32# -> int32, ~255: -256 +(int32[@unboxed]) -> int32#, ~1024: -1025 +int32# -> (int32[@unboxed]), ~(-1726): 1725 +Function of 7 args, 1+2+3+4+5+6+7: 28 diff --git a/testsuite/tests/typing-layouts-bits32/c_functions.c b/testsuite/tests/typing-layouts-bits32/c_functions.c new file mode 100644 index 00000000000..75ed3bbfa91 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/c_functions.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +CAMLprim int32_t lognot_UtoU(int32_t u) { + return ~u; +} + +CAMLprim int32_t lognot_BtoU(value u) { + return ~Int32_val(u); +} + +CAMLprim value lognot_UtoB(int32_t u) { + CAMLparam0(); + CAMLlocal1(result); + result = caml_copy_int32(~u); + CAMLreturn(result); +} + +CAMLprim value lognot_bytecode(value u) { + CAMLparam1(u); + CAMLlocal1(result); + result = caml_copy_int32(~Int32_val(u)); + CAMLreturn(result); +} + +CAMLprim int32_t sum_7_UBUBUBUtoU(int32_t u1, value b2, int32_t u3, value b4, + int32_t u5, value b6, int32_t u7) { + int32_t u2 = Int32_val(b2); + int32_t u4 = Int32_val(b4); + int32_t u6 = Int32_val(b6); + return (u1 + u2 + u3 + u4 + u5 + u6 + u7); +} + +CAMLprim value sum_7_bytecode(value* argv, int argn) { + CAMLparam0(); + CAMLassert(argn == 7); + if (argn != 7) CAMLreturn(caml_copy_int32(-1)); + int32_t u1 = Int32_val(argv[0]); + int32_t u2 = Int32_val(argv[1]); + int32_t u3 = Int32_val(argv[2]); + int32_t u4 = Int32_val(argv[3]); + int32_t u5 = Int32_val(argv[4]); + int32_t u6 = Int32_val(argv[5]); + int32_t u7 = Int32_val(argv[6]); + CAMLlocal1(result); + result = caml_copy_int32(u1 + u2 + u3 + u4 + u5 + u6 + u7); + CAMLreturn(result); +} diff --git a/testsuite/tests/typing-layouts-bits32/parsing.ml b/testsuite/tests/typing-layouts-bits32/parsing.ml new file mode 100644 index 00000000000..2114c62c688 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/parsing.ml @@ -0,0 +1,277 @@ +(* TEST + expect; +*) + +(* These tests show how potential ambiguities are resolved + between the types #c and int32#. +*) + +(* Basic syntax: int32# is an unboxed int32. *) +type t = int32#;; +let f (_ : int32#) = ();; +[%%expect {| +type t = int32# +val f : int32# -> unit = +|}];; + +type t = C of int32#;; +[%%expect {| +type t = C of int32# +|}];; + +type t = C : int32# -> t;; +[%%expect {| +type t = C : int32# -> t +|}];; + +(* int32# works as an argument to normal type constructors, not just + classes, even though many of the rest of the tests in this file are concerned + with classes. +*) +type t = int32# list;; +[%%expect {| +Line 1, characters 9-15: +1 | type t = int32# list;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +let f (_ : int32# list) = ();; +[%%expect {| +Line 1, characters 11-17: +1 | let f (_ : int32# list) = ();; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C of int32# list;; +[%%expect {| +Line 1, characters 14-20: +1 | type t = C of int32# list;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C : int32# list -> t;; +[%%expect {| +Line 1, characters 13-19: +1 | type t = C : int32# list -> t;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +(* Syntax: int32#c + Interpreted as type application of [c] to [int32#]. +*) +class ['a] c = object(self) + method x :'a = assert false +end;; +[%%expect {| +class ['a] c : object method x : 'a end +|}];; + +type t = int32#c;; +[%%expect {| +Line 1, characters 9-15: +1 | type t = int32#c;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : int32#c) = ();; +[%%expect {| +Line 1, characters 11-17: +1 | let f (_ : int32#c) = ();; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of int32#c;; +[%%expect {| +Line 1, characters 14-20: +1 | type t = C of int32#c;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : int32#c -> t;; +[%%expect {| +Line 1, characters 13-19: +1 | type t = C : int32#c -> t;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: int32# c + Interpreted as type application of [c] to [int32#]. +*) +type t = int32# c;; +[%%expect {| +Line 1, characters 9-15: +1 | type t = int32# c;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : int32# c) = ();; +[%%expect {| +Line 1, characters 11-17: +1 | let f (_ : int32# c) = ();; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of int32# c;; +[%%expect {| +Line 1, characters 14-20: +1 | type t = C of int32# c;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : int32# c -> t;; +[%%expect {| +Line 1, characters 13-19: +1 | type t = C : int32# c -> t;; + ^^^^^^ +Error: This type int32# should be an instance of type ('a : value) + The layout of int32# is bits32 + because it is the primitive bits32 type int32#. + But the layout of int32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: int32 #c + Interpreted as type application of [#c] to [int32]. + + Note that [int32 #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) +type t = int32 #c;; +[%%expect {| +Line 1, characters 0-17: +1 | type t = int32 #c;; + ^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type int32 #c as 'a the variable 'a is unbound +|}];; +type t = C of int32 #c;; +[%%expect {| +Line 1, characters 0-22: +1 | type t = C of int32 #c;; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (int32 #c as 'a) the variable 'a is unbound +|}];; +type 'a t = (int32 #c as 'a);; +let f (_ : int32 #c) = ();; +type 'a t = C of (int32 #c as 'a);; +type t = C : int32 #c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = int32 #c +val f : int32 #c -> unit = +type 'a t = C of 'a constraint 'a = int32 #c +type t = C : int32 #c -> t +|}];; + +(* Syntax: int32 # c + Interpreted as type application of [#c] to [int32]. + + Note that [int32 #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) + +type t = int32 # c;; +[%%expect {| +Line 1, characters 0-18: +1 | type t = int32 # c;; + ^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type int32 #c as 'a the variable 'a is unbound +|}];; +type t = C of int32 # c;; +[%%expect {| +Line 1, characters 0-23: +1 | type t = C of int32 # c;; + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (int32 #c as 'a) the variable 'a is unbound +|}];; + +type 'a t = (int32 # c as 'a);; +let f (_ : int32 # c) = ();; +type 'a t = C of (int32 # c as 'a);; +type t = C : int32 # c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = int32 #c +val f : int32 #c -> unit = +type 'a t = C of 'a constraint 'a = int32 #c +type t = C : int32 #c -> t +|}];; + +(***************************) +(* Type application: it's a type error, not a parse error. *) + +type t = int int32#;; +[%%expect {| +Line 1, characters 9-19: +1 | type t = int int32#;; + ^^^^^^^^^^ +Error: The type constructor int32# expects 0 argument(s), + but is here applied to 1 argument(s) +|}];; + +type t = (int, int) int32#;; +[%%expect {| +Line 1, characters 9-26: +1 | type t = (int, int) int32#;; + ^^^^^^^^^^^^^^^^^ +Error: The type constructor int32# expects 0 argument(s), + but is here applied to 2 argument(s) +|}];; diff --git a/testsuite/tests/typing-layouts-bits32/test_int32_u.ml b/testsuite/tests/typing-layouts-bits32/test_int32_u.ml new file mode 100644 index 00000000000..8d14e303690 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/test_int32_u.ml @@ -0,0 +1,316 @@ +(* TEST + include stdlib_upstream_compatible; +*) + +module Int32_u = Stdlib_upstream_compatible.Int32_u + +(* Print all individual successful tests; used for debugging, as it will cause + this test to fail *) +let debug_tests = false + +(* Constant seed for repeatable random-testing properties *) +(* I hear primes are often good? This is an 11-digit prime in the decimal + expansion of [e], containing the earliest 10-digit prime the decimal + expansion of [e] per OEIS sequence A098963. *) +let () = Random.init 61000000007 + +let to_ocaml_string s = "\"" ^ String.escaped s ^ "\"" + +type 'a result = { + expected : 'a; + actual : 'a; + equal : 'a -> 'a -> bool; + to_string : 'a -> string +} + +module type Result = sig + type t + val equal : t -> t -> bool + val to_string : t -> string +end + +let mk_result' equal to_string = fun ~expected ~actual -> + { expected; actual; equal; to_string } + +let mk_result (type a) (module M : Result with type t = a) = + mk_result' M.equal M.to_string + +let float_result = mk_result (module Float) +let bool_result = mk_result (module Bool) +let int_result = mk_result (module Int) +let int32_result = mk_result (module Int32) +let string_result = mk_result' String.equal to_ocaml_string + +let option_result (type a) (module M : Result with type t = a) = + mk_result' + (Option.equal M.equal) + (function + | None -> "None" + | Some x -> "Some (" ^ M.to_string x ^ ")") + +type 'a generator = + | Rand of (unit -> 'a) + | Const of 'a + +let map_generator f = function + | Rand r -> Rand (fun () -> f (r ())) + | Const c -> Const (f c) + +type 'a input = { + generators : 'a generator list; + to_string : 'a -> string +} + +module type Integer = sig + type t + (* Interesting constants *) + val zero : t + val one : t + val minus_one : t + val max_int : t + val min_int : t + (* String generation *) + val to_string : t -> string + (* Comparison (for zero-testing) *) + val equal : t -> t -> bool + (* Arithmetic (for generating small numbers) *) + val sub : t -> t -> t + val shift_left : t -> int -> t +end + +let one_thousand (type a) (module I : Integer with type t = a) = + let open I in + let i1024 = shift_left one 10 in + let i16 = shift_left one 4 in + let i8 = shift_left one 3 in + sub (sub i1024 i16) i8 + +let two_thousand (type a) (module I : Integer with type t = a) = + I.shift_left (one_thousand (module I)) 1 + +let unit_input = + { generators = [Const ()] + ; to_string = Unit.to_string + } + +let bool_input = + { generators = [Const false; Const true] + ; to_string = Bool.to_string + } + +let float_input = + { generators = [ Const 0. + ; Const 1. + ; Const (-1.) + ; Const Float.max_float + ; Const Float.min_float + ; Const Float.epsilon + ; Const Float.nan + ; Const Float.infinity + ; Const Float.neg_infinity + ; Rand (fun () -> Random.float 2000. -. 1000.) + ; Rand (fun () -> Int64.float_of_bits (Random.bits64 ())) + ] + ; to_string = Float.to_string + } + +let integer_input + (type a) (module I : Integer with type t = a) + rand_range rand_full = + let rand_small () = + let i0_to_2000 = rand_range (two_thousand (module I)) in + I.sub i0_to_2000 (one_thousand (module I)) + in + { generators = [ Const I.zero + ; Const I.one + ; Const I.minus_one + ; Const I.max_int + ; Const I.min_int + ; Rand rand_small + ; Rand rand_full + ] + ; to_string = I.to_string + } + +let nonzero_integer_input + (type a) (module I : Integer with type t = a) + rand_range rand_full = + let { generators; to_string } = + integer_input (module I) rand_range rand_full + in + let generators = + generators |> + List.filter_map + (function + | Const c -> + if I.equal c I.zero + then None + else Some (Const c) + | Rand r -> + Some (Rand (fun () -> + let n = ref I.zero in + while I.equal !n I.zero do + n := r () + done; + !n))) + in + { generators; to_string } + +let int_input = integer_input (module Int) Random.int Random.bits +let int32_input = integer_input (module Int32) Random.int32 Random.bits32 +let nonzero_int32_input = + nonzero_integer_input (module Int32) Random.int32 Random.bits32 + +let int32_shift_amount_input = + { generators = List.init 32 (fun c -> Const c) + ; to_string = Int.to_string + } + +let int32_string_input = + { generators = List.map + (map_generator Int32.to_string) + int32_input.generators + ; to_string = to_ocaml_string + } + +let product2 ~f xs ys = + List.concat_map (fun x -> + List.map (fun y -> + f x y) + ys) + xs + +let two_inputs in1 in2 = + { generators = product2 in1.generators in2.generators ~f:(fun gen1 gen2 -> + match gen1, gen2 with + | Const c1, Const c2 -> Const (c1, c2) + | Const c1, Rand r2 -> Rand (fun () -> c1, r2 ()) + | Rand r1, Const c2 -> Rand (fun () -> r1 (), c2) + | Rand r1, Rand r2 -> Rand (fun () -> r1 (), r2 ()) + ) + ; to_string = fun (x1, x2) -> + Printf.sprintf "(%s, %s)" (in1.to_string x1) (in2.to_string x2) + } + +let passed { actual; expected; equal; _ } = equal actual expected + +let test ?(n=100) name prop { generators; to_string = input_to_string } = + let test input = + let {expected; actual; to_string} as result = prop input in + let print_test outcome = + Printf.printf "Test %s: %s. Input = %s; expected = %s; actual = %s\n" + outcome name + (input_to_string input) (to_string expected) (to_string actual) + in + if passed result then begin + if debug_tests then print_test "succeeded" + end + else + print_test "failed" + in + List.iter + (function + | Const c -> test c + | Rand r -> for _ = 1 to n do test (r ()) done) + generators + +let test_same + ~input ~result ~apply_expected ~apply_actual + ?n name expected actual = + test ?n name + (fun x -> + result + ~expected:(apply_expected expected x) + ~actual:(apply_actual actual x)) + input + +let test_constant ?n name expected actual result = + test ?n name (fun () -> result ~expected ~actual) unit_input + +let test_same_unary ?n name input result expected actual = + test_same + ~input + ~result + ~apply_expected:Fun.id + ~apply_actual:Fun.id + ?n name expected actual + +let test_same_binary ?n name input1 input2 result expected actual = + test_same + ~input:(two_inputs input1 input2) + ~result + ~apply_expected:(fun f (x,y) -> f x y) + ~apply_actual:(fun f (x,y) -> f x y) + ?n name expected actual + +let test_unary ?n name f fu = + test_same_unary ?n name int32_input int32_result f + (fun x -> Int32_u.to_int32 (fu (Int32_u.of_int32 x))) + +let test_unary_of ?n name f fu result = + test_same_unary ?n name int32_input result f + (fun x -> fu (Int32_u.of_int32 x)) + +let test_unary_to ?n name f fu input = + test_same_unary ?n name input int32_result f + (fun x -> Int32_u.to_int32 (fu x)) + +let test_binary' ~second_input ?n name f fu = + test_same_binary ?n name int32_input second_input int32_result f + (fun x y -> Int32_u.to_int32 + (fu + (Int32_u.of_int32 x) + (Int32_u.of_int32 y))) + +let test_binary = test_binary' ~second_input:int32_input + +let test_division = test_binary' ~second_input:nonzero_int32_input + +let test_binary_of ?n name f fu result = + test_same_binary ?n name int32_input int32_input result f + (fun x y -> fu + (Int32_u.of_int32 x) + (Int32_u.of_int32 y)) + +let test_shift ?n name shift shiftu = + test_same_binary + ?n name int32_input int32_shift_amount_input int32_result shift + (fun x y -> Int32_u.to_int32 + (shiftu + (Int32_u.of_int32 x) + y)) + +let () = + test_unary "neg" Int32.neg Int32_u.neg; + test_binary "add" Int32.add Int32_u.add; + test_binary "sub" Int32.sub Int32_u.sub; + test_binary "mul" Int32.mul Int32_u.mul; + test_division "div" Int32.div Int32_u.div; + test_division "unsigned_div" Int32.unsigned_div Int32_u.unsigned_div; + test_division "rem" Int32.rem Int32_u.rem; + test_division "unsigned_rem" Int32.unsigned_rem Int32_u.unsigned_rem; + test_unary "succ" Int32.succ Int32_u.succ; + test_unary "pred" Int32.pred Int32_u.pred; + test_unary "abs" Int32.abs Int32_u.abs; + test_binary "logand" Int32.logand Int32_u.logand; + test_binary "logor" Int32.logor Int32_u.logor; + test_binary "logxor" Int32.logxor Int32_u.logxor; + test_unary "lognot" Int32.lognot Int32_u.lognot; + test_shift "shift_left" Int32.shift_left Int32_u.shift_left; + test_shift "shift_right" Int32.shift_right Int32_u.shift_right; + test_shift "shift_right_logical" Int32.shift_right_logical Int32_u.shift_right_logical; + test_unary_to "of_int" Int32.of_int Int32_u.of_int int_input; + test_unary_of "to_int" Int32.to_int Int32_u.to_int int_result; + test_unary_of "unsigned_to_int" Int32.unsigned_to_int Int32_u.unsigned_to_int (option_result (module Int)); + test_unary_to "of_float" Int32.of_float Int32_u.of_float float_input; + test_unary_of "to_float" Int32.to_float Int32_u.to_float float_result; + test_unary_to "of_string" Int32.of_string Int32_u.of_string int32_string_input; + test_unary_of "to_string" Int32.to_string Int32_u.to_string string_result; + test_unary_to "bits_of_float" Int32.bits_of_float Int32_u.bits_of_float float_input; + test_unary_of "float_of_bits" Int32.float_of_bits Int32_u.float_of_bits float_result; + test_binary_of "compare" Int32.compare Int32_u.compare int_result; + test_binary_of "unsigned_compare" Int32.unsigned_compare Int32_u.unsigned_compare int_result; + test_binary_of "equal" Int32.equal Int32_u.equal bool_result; + test_binary "min" Int32.min Int32_u.min; + test_binary "max" Int32.max Int32_u.max; + () diff --git a/testsuite/tests/typing-layouts-bits32/unboxed_bits32s.ml b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s.ml new file mode 100644 index 00000000000..87cd92740c6 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s.ml @@ -0,0 +1,423 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* This file contains various tests for [int32#]. It's not an expect test + to make sure it gets tested for native code. *) + +(*****************************************) +(* Prelude: Functions on unboxed int32s. *) + +module Int32_u = struct + include Stdlib_upstream_compatible.Int32_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( > ) x y = (compare x y) > 0 +end + +let to_binary_string x = + String.init 32 (fun i -> + if Int32.(equal (logand x (shift_left 1l (32 - i - 1))) 0l) + then '0' + else '1') + +let print_int prefix x = + Printf.printf "%s: %d\n" prefix x + +let print_int32u prefix x = + Printf.printf "%s: %ld\n" prefix (Int32_u.to_int32 x) + +let print_int32u_bin prefix x = + let bx = Int32_u.to_int32 x in + Printf.printf "%s: %ld = 0b%s\n" prefix bx (to_binary_string bx) + +(*********************************) +(* Test 1: some basic arithmetic *) + +(* Tests all the operators above *) +let test1 () = + (* CR layouts: When bits32 defs are allowed at the module level, get rid of + [test1] and move these definitions there. *) + let open Int32_u in + + (* Positive numbers *) + + let three = #3l in + print_int32u "Test 1, three" three; + + let twice_three = three + #3l in + print_int32u "Test 1, twice_three" twice_three; + + let thrice_three = #3l * three in + print_int32u "Test 1, thrice_three" thrice_three; + + let twice_three_again = thrice_three - three in + print_int32u "Test 1, twice_three_again" twice_three; + + let three_again = twice_three_again / #2l in + print_int32u "Test 1, three_again" three_again; + + let three_again_unsigned = twice_three_again // #2l in + print_int32u "Test 1, three_again_unsigned" three_again_unsigned; + + let twice_three_greater_than_three = twice_three > three in + Printf.printf "Test 1, twice_three_greater_than_three: %b\n" + twice_three_greater_than_three; + + let three_with_effort = + (#3l + twice_three) * #2l / #6l in + print_int32u "Test 1, three_with_effort" three_with_effort; + + let seven_rem_three = #7l % three in + print_int32u "Test 1, seven_rem_three" seven_rem_three; + + let seven_rem_three_unsigned = #7l %% three in + print_int32u "Test 1, seven_rem_three_unsigned" seven_rem_three_unsigned; + + let forty_two_logand_three = logand #42l three in + print_int32u_bin "Test1, forty_two_logand_three (0b00101010 & 0b00000011)" forty_two_logand_three; + + let forty_two_logor_three = logor #42l three in + print_int32u_bin "Test1, forty_two_logor_three (0b00101010 & 0b00000011)" forty_two_logor_three; + + let forty_two_logxor_three = logxor #42l three in + print_int32u_bin "Test1, forty_two_logxor_three (0b00101010 & 0b00000011)" forty_two_logxor_three; + + let lognot_three = lognot three in + print_int32u_bin "Test1, lognot_three (~0b00000011)" lognot_three; + + let three_shl_eight = shift_left three 8 in + print_int32u_bin "Test1, three_shl_eight (0b00000011 << 8)" three_shl_eight; + + let three_shr_one = shift_right three 1 in + print_int32u_bin "Test1, three_shr_one (0b00000011 >> 1)" three_shr_one; + + let three_shrl_one = shift_right_logical three 1 in + print_int32u_bin "Test1, three_shr_one (0b00000011 >>> 1)" three_shrl_one; + + (* Negative numbers *) + + let minus_five = -#5l in + print_int32u "Test 1, minus_five" minus_five; + + let twice_minus_five = minus_five + (-#5l) in + print_int32u "Test 1, twice_minus_five" twice_minus_five; + + let thrice_minus_five = #3l * minus_five in + print_int32u "Test 1, thrice_minus_five" thrice_minus_five; + + let twice_minus_five_again = thrice_minus_five - minus_five in + print_int32u "Test 1, twice_minus_five_again" twice_minus_five; + + let minus_five_again = twice_minus_five_again / #2l in + print_int32u "Test 1, minus_five_again" minus_five_again; + + let minus_five_again_unsigned = twice_minus_five_again // #2l in + print_int32u "Test 1, minus_five_again_unsigned" minus_five_again_unsigned; + + let minus_five_greater_than_twice_minus_five = minus_five > twice_minus_five in + Printf.printf "Test 1, minus_five_greater_than_twice_minus_five: %b\n" + minus_five_greater_than_twice_minus_five; + + let minus_five_with_effort = + ((-#5l) + twice_minus_five) * #2l / #6l in + print_int32u "Test 1, minus_five_with_effort" minus_five_with_effort; + + let seven_rem_minus_five = #7l % minus_five in + print_int32u "Test 1, seven_rem_minus_five" seven_rem_minus_five; + + let seven_rem_minus_five_unsigned = #7l %% minus_five in + print_int32u "Test 1, seven_rem_minus_five_unsigned" seven_rem_minus_five_unsigned; + + let forty_two_logand_minus_five = logand #42l minus_five in + print_int32u_bin "Test1, forty_two_logand_minus_five (0b00101010 & 0b1...1011)" forty_two_logand_minus_five; + + let forty_two_logor_minus_five = logor #42l minus_five in + print_int32u_bin "Test1, forty_two_logor_minus_five (0b00101010 & 0b1...1011)" forty_two_logor_minus_five; + + let forty_two_logxor_minus_five = logxor #42l minus_five in + print_int32u_bin "Test1, forty_two_logxor_minus_five (0b00101010 & 0b1...1011)" forty_two_logxor_minus_five; + + let lognot_minus_five = lognot minus_five in + print_int32u_bin "Test1, lognot_minus_five (~0b1...1011)" lognot_minus_five; + + let minus_five_shl_eight = shift_left minus_five 8 in + print_int32u_bin "Test1, minus_five_shl_eight (0b1...1011 << 8)" minus_five_shl_eight; + + let minus_five_shr_one = shift_right minus_five 1 in + print_int32u_bin "Test1, minus_five_shr_one (0b1...1011 >> 1)" minus_five_shr_one; + + let minus_five_shrl_one = shift_right_logical minus_five 1 in + print_int32u_bin "Test1, minus_five_shr_one (0b1...1011 >>> 1)" minus_five_shrl_one + + (* CR layouts: Restore these when the appropriate constants exist *) + (* print_int32u "Test 1, max_int" max_int; + * print_int32u "Test 1, min_int" min_int; *) + +let _ = test1 () + +(**********************************) +(* Test 2: higher-order functions *) + +(* CR layouts v1.5: This type definition can be eliminated once we have + annotations. *) +type ('a : bits32) t_bits32 = 'a + +let[@inline never] twice f (x : 'a t_bits32) = f (f x) +let[@inline never] compose f g (x : 'a t_bits32) = f (g x) + +let[@inline never] twice_on_three f = + let pi = #3l in + twice f pi + +let times_four = twice Int32_u.(fun x -> x * #2l) + +let _ = + let open Int32_u in + print_int32u "Test 2, add three twice" + (twice (fun x -> x + #3l) #0l); + print_int32u "Test 2, add three four times" + (twice (twice (fun x -> x + #3l)) #0l); + print_int32u "Test 2, increment three twice" + (twice_on_three (fun x -> #1l + x)); + print_int32u "Test 2, increment three four times" + (twice_on_three (twice (fun x -> #1l + x))); + print_int32u "Test 2, two times four" + (times_four #2l); + print_int32u "Test 2, three times sixteen" + (twice_on_three times_four); + print_int32u "Test 2, three times sixteen again" + (compose times_four times_four #3l); + print_int32u "Test 2, three minus four" + (let two = twice (fun x -> x + #1l) #0l in + let add_two = Int32_u.(+) two in + let add_two_after = compose add_two in + let minus_four = add_two_after (twice (fun x -> x - #3l)) in + minus_four #3l) + +(**********************************) +(* Test 3: int32# in closures *) + +(* [go]'s closure should haave an [int] (immediate), a [int32#] (bits32) and a + [int32 array] (value). *) +let[@inline never] f3 n m steps () = + let[@inline never] rec go k = + if k = n + then #0l + else begin + let acc = go (k + 1) in + steps.(k) <- Int32_u.to_int32 acc; + Int32_u.(+) m acc + end + in + go 0 + +(* many args - even args are tuples, odd args are unboxed int32s *) +let[@inline_never] f3_manyargs x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 steps () = + let (start_k, end_k) = x0 in + let[@inline never] rec go k = + if k = end_k + then #0l + else begin + let (x2_1, x2_2) = x2 in + let (x4_1, x4_2) = x4 in + let (x6_1, x6_2) = x6 in + let (x8_1, x8_2) = x8 in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Int32_u.to_int32 acc; + Int32_u.(acc + ((x1 + x3 + x5 + x7 + x9) * (of_int32 (Int32.of_int sum)))) + end + in + go start_k + +let test3 () = + (* Test f3 *) + let steps = Array.init 10 (fun _ -> 0l) in + let five_times_three = f3 5 #3l steps in + print_int32u "Test 3, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 3, step %d: %ld\n") steps; + + (* Test f3_manyargs + + (1 + 2 + 3 + 5 + 8) = 19 + 3 * (1 + 2 + 3 + 5 + 8) = 57 + 6 * (1 + 2 + 3 + 5 + 8) = 114 + 9 * (1 + 2 + 3 + 5 + 8) = 171 + *) + let steps = Array.init 10 (fun _ -> 0l) in + let x1 = #1l in + let x3 = #2l in + let x5 = #3l in + let x7 = #5l in + let x9 = #8l in + + (* all these 8 numbers together sum to 3 *) + let x2 = (7, 42) in + let x4 = (-23, 109) in + let x6 = (-242, 90) in + let x8 = (-2, 22) in + + let f3_manyargs = f3_manyargs (4,8) x1 x2 x3 x4 x5 x6 x7 x8 x9 steps in + print_int32u "Test 3, 171: " (f3_manyargs ()); + Array.iteri (Printf.printf " Test 3, step %d: %ld\n") steps + +let _ = test3 () + +(*********************************************) +(* Test 4: Partial and indirect applications *) + +let[@inline never] test4 () = + (* Simple indirect call *) + let[@inline never] go f = + Int32_u.to_int32 (f #1l #2l) + in + let (x1, x2) = (go Int32_u.(+), go Int32_u.(-)) in + print_int32u "Test 4, 1 + 2" (Int32_u.of_int32 x1); + print_int32u "Test 4, 1 - 2" (Int32_u.of_int32 x2); + + (* partial application to int32# *) + let steps = Array.init 10 (fun _ -> 0l) in + let f = Sys.opaque_identity (f3 5 #3l) in + let five_times_three = f steps in + print_int32u "Test 4, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %ld\n") steps; + + (* partial application with int32# remaining *) + let steps = Array.init 10 (fun _ -> 0l) in + let f = Sys.opaque_identity (f3 6) in + let six_times_three = f #3l steps in + print_int32u "Test 4, 6 * 3: " (six_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %ld\n") steps; + + (* Those two tests again, but making f3 also opaque to prevent expansion of + the partial application. *) + let f3 = Sys.opaque_identity f3 in + + let steps = Array.init 10 (fun _ -> 0l) in + let f = Sys.opaque_identity (f3 5 #3l) in + let five_times_three = f steps in + print_int32u "Test 4, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %ld\n") steps; + + let steps = Array.init 10 (fun _ -> 0l) in + let f = Sys.opaque_identity (f3 6) in + let six_times_three = f #3l steps in + print_int32u "Test 4, 6 * 3: " (six_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %ld\n") steps + +let _ = test4 () + +(****************************) +(* Test 5: Over application *) + +let[@inline never] f5 n m = + let open Int32_u in + (* Also testing a closure with only int32# values *) + let[@inline never] go f = + f (n + m) + in + go + +let test5 () = + let open Int32_u in + let _ : unit = + f5 #3l #2l + (fun n s m -> print_int32u s (n + m)) "Test 5, 3 + 2 + 1" + #1l + in + () + +let _ = test5 () + +(*********************************) +(* Test 6: methods on int32s *) + +(* CR layouts: add tests that capture int32s in objects, once that is + allowed. *) + +(* int32# args and returns *) +let f6_1 () = object + method f6_m1 f1 f2 f3 = + let open Int32_u in + (f1 - f2) / f3 +end + +(* capture a pair, recursion *) +let f6_2 n = object(self) + method f6_m2 n3 m1 f = + if n3 = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) then + m1 + else f (self#f6_m2 (n3+1) m1 f) +end + +(* overapplication to int32# and non-int32# args *) +let f6_3 n k = object + method f6_m3 n3 m1 f = + let n = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) in + f (n + k + n3) m1 +end + +let test6 () = + let add3 n (m, k) = n + m + k in + let open Int32_u in + + (* (30 - 20) / 3 = 3 *) + let o = (Sys.opaque_identity f6_1) () in + print_int32u "Test 6, 3" + (o#f6_m1 #30l #20l #3l); + + (* 4 * 8 = 32 *) + let o = (Sys.opaque_identity f6_2) (4,7) in + let result = o#f6_m2 8 #4l (fun x -> x * #2l) in + print_int32u "Test 6, 32" result; + + (* (1 + 2 + 3 + (-2) + (-12) + 4) * (2 + (-1) + 10) = -44 *) + let o = (Sys.opaque_identity f6_3) (1,2) 3 in + let result = + o#f6_m3 (-2) #2l + (fun[@inline never] i m1 m2 n m3 -> + (of_int32 (Int32.of_int (add3 i n))) * (m1 + m2 + m3)) + (-#1l) (-12,4) #10l + in + print_int32u "Test 6, -44" result + +let _ = test6 () + +(*****************************************) +(* Test 7: int32# and assert false joins *) + +module M = struct + open Int32_u + let[@inline never] f () = assert false + let g () = if Sys.opaque_identity true then #32l else f () +end + +let test7 () = + print_int32u "Test 7, 32" (M.g ()) + +let _ = test7 () diff --git a/testsuite/tests/typing-layouts-bits32/unboxed_bits32s.reference b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s.reference new file mode 100644 index 00000000000..1a0fa79f35c --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s.reference @@ -0,0 +1,115 @@ +Test 1, three: 3 +Test 1, twice_three: 6 +Test 1, thrice_three: 9 +Test 1, twice_three_again: 6 +Test 1, three_again: 3 +Test 1, three_again_unsigned: 3 +Test 1, twice_three_greater_than_three: true +Test 1, three_with_effort: 3 +Test 1, seven_rem_three: 1 +Test 1, seven_rem_three_unsigned: 1 +Test1, forty_two_logand_three (0b00101010 & 0b00000011): 2 = 0b00000000000000000000000000000010 +Test1, forty_two_logor_three (0b00101010 & 0b00000011): 43 = 0b00000000000000000000000000101011 +Test1, forty_two_logxor_three (0b00101010 & 0b00000011): 41 = 0b00000000000000000000000000101001 +Test1, lognot_three (~0b00000011): -4 = 0b11111111111111111111111111111100 +Test1, three_shl_eight (0b00000011 << 8): 768 = 0b00000000000000000000001100000000 +Test1, three_shr_one (0b00000011 >> 1): 1 = 0b00000000000000000000000000000001 +Test1, three_shr_one (0b00000011 >>> 1): 1 = 0b00000000000000000000000000000001 +Test 1, minus_five: -5 +Test 1, twice_minus_five: -10 +Test 1, thrice_minus_five: -15 +Test 1, twice_minus_five_again: -10 +Test 1, minus_five_again: -5 +Test 1, minus_five_again_unsigned: 2147483643 +Test 1, minus_five_greater_than_twice_minus_five: true +Test 1, minus_five_with_effort: -5 +Test 1, seven_rem_minus_five: 2 +Test 1, seven_rem_minus_five_unsigned: 7 +Test1, forty_two_logand_minus_five (0b00101010 & 0b1...1011): 42 = 0b00000000000000000000000000101010 +Test1, forty_two_logor_minus_five (0b00101010 & 0b1...1011): -5 = 0b11111111111111111111111111111011 +Test1, forty_two_logxor_minus_five (0b00101010 & 0b1...1011): -47 = 0b11111111111111111111111111010001 +Test1, lognot_minus_five (~0b1...1011): 4 = 0b00000000000000000000000000000100 +Test1, minus_five_shl_eight (0b1...1011 << 8): -1280 = 0b11111111111111111111101100000000 +Test1, minus_five_shr_one (0b1...1011 >> 1): -3 = 0b11111111111111111111111111111101 +Test1, minus_five_shr_one (0b1...1011 >>> 1): 2147483645 = 0b01111111111111111111111111111101 +Test 2, add three twice: 6 +Test 2, add three four times: 12 +Test 2, increment three twice: 5 +Test 2, increment three four times: 7 +Test 2, two times four: 8 +Test 2, three times sixteen: 48 +Test 2, three times sixteen again: 48 +Test 2, three minus four: -1 +Test 3, 5 * 3: : 15 + Test 3, step 0: 12 + Test 3, step 1: 9 + Test 3, step 2: 6 + Test 3, step 3: 3 + Test 3, step 4: 0 + Test 3, step 5: 0 + Test 3, step 6: 0 + Test 3, step 7: 0 + Test 3, step 8: 0 + Test 3, step 9: 0 +Test 3, 171: : 228 + Test 3, step 0: 0 + Test 3, step 1: 0 + Test 3, step 2: 0 + Test 3, step 3: 0 + Test 3, step 4: 171 + Test 3, step 5: 114 + Test 3, step 6: 57 + Test 3, step 7: 0 + Test 3, step 8: 0 + Test 3, step 9: 0 +Test 4, 1 + 2: 3 +Test 4, 1 - 2: -1 +Test 4, 5 * 3: : 15 + Test 4, step 0: 12 + Test 4, step 1: 9 + Test 4, step 2: 6 + Test 4, step 3: 3 + Test 4, step 4: 0 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 6 * 3: : 18 + Test 4, step 0: 15 + Test 4, step 1: 12 + Test 4, step 2: 9 + Test 4, step 3: 6 + Test 4, step 4: 3 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 5 * 3: : 15 + Test 4, step 0: 12 + Test 4, step 1: 9 + Test 4, step 2: 6 + Test 4, step 3: 3 + Test 4, step 4: 0 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 6 * 3: : 18 + Test 4, step 0: 15 + Test 4, step 1: 12 + Test 4, step 2: 9 + Test 4, step 3: 6 + Test 4, step 4: 3 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 5, 3 + 2 + 1: 6 +Test 6, 3: 3 +Test 6, 32: 32 +Test 6, -44: -44 +Test 7, 32: 32 diff --git a/testsuite/tests/typing-layouts-bits32/unboxed_bits32s_alpha.ml b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s_alpha.ml new file mode 100644 index 00000000000..b06f79f0563 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s_alpha.ml @@ -0,0 +1,317 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + } +*) + +(* This should be read as a continuation of the [unboxed_bits32s.ml] test. + We can't put them there because: + - [unboxed_bits32s.ml] is run at all maturities, but + - these tests use features that only are enabled at the alpha maturity. + + Once mixed blocks move to the "stable" maturity level, we can + move these tests there. + *) + +(*****************************************) +(* Prelude: Functions on unboxed int32s. *) + +module Int32_u = struct + include Stdlib_upstream_compatible.Int32_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( > ) x y = (compare x y) > 0 +end + +let print_float prefix x = Printf.printf "%s: %.2f\n" prefix x + +let to_binary_string x = + String.init 32 (fun i -> + if Int32.(equal (logand x (shift_left 1l (32 - i - 1))) 0l) + then '0' + else '1') + +let print_int prefix x = + Printf.printf "%s: %d\n" prefix x + +let print_int32u prefix x = + Printf.printf "%s: %ld\n" prefix (Int32_u.to_int32 x) + +let print_int32u_bin prefix x = + let bx = Int32_u.to_int32 x in + Printf.printf "%s: %ld = 0b%s\n" prefix bx (to_binary_string bx) + +(***********************************) +(* Test: mixed blocks in closures *) + +(* Adapted from Test 3 in unboxed_bits32s.ml *) + +type block = + { x0_1 : int; + x0_2 : int; + x1 : int32#; + x2_1 : int; + x2_2 : int; + x3 : int32#; + x4_1 : int; + x4_2 : int; + x5 : int32#; + x6_1 : int; + x6_2 : int; + x7 : int32#; + x8_1 : int; + x8_2 : int; + x9 : int32#; + } + +let[@inline_never] f_mixed_blocks_and_closures + steps ({ x1; x0_1 = start_k; x0_2 = end_k; x8_1; x8_2; + x5; x6_1; x6_2; } as iargs) () = + let[@inline never] rec go k = + if k = end_k + then #0l + else begin + let (x2_1, x2_2) = iargs.x2_1, iargs.x2_2 in + let {x4_1; x4_2; _} = iargs in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Int32_u.to_int32 acc; + Int32_u.(acc + ((x1 + iargs.x3 + x5 + iargs.x7 + iargs.x9) + * (of_int32 (Int32.of_int sum)))) + end + in + go start_k + +let test_mixed_blocks_and_closures () = + (* Test f_mixed_blocks_and_closures + + (1 + 2 + 3 + 5 + 8) = 19 + 3 * (1 + 2 + 3 + 5 + 8) = 57 + 6 * (1 + 2 + 3 + 5 + 8) = 114 + 9 * (1 + 2 + 3 + 5 + 8) = 171 + *) + let steps = Array.init 10 (fun _ -> 0l) in + let x1 = #1l in + let x3 = #2l in + let x5 = #3l in + let x7 = #5l in + let x9 = #8l in + + (* all these 8 numbers together sum to 3 *) + let x2_1, x2_2 = (7, 42) in + let x4_1, x4_2 = (-23, 109) in + let x6_1, x6_2 = (-242, 90) in + let x8_1, x8_2 = (-2, 22) in + + let f = f_mixed_blocks_and_closures steps + { x0_1 = 4; x0_2 = 8; x1; x2_1; x2_2; x3; x4_1; x4_2; x5; + x6_1; x6_2; x7; x8_1; x8_2; x9 } + in + print_int32u "Test mixed_blocks_with_closures, 171: " (f ()); + Array.iteri (Printf.printf " Test mixed_blocks_with_closures, step %d: %ld\n") + steps + +let _ = test_mixed_blocks_and_closures () + +(**************************************) +(* Test: mixed record manipulation *) + +type t_mixed_record = + { a : float; + mutable b : int; + c : int32#; + mutable d : int32#; + e : int; + mutable f : int32# } + +(* Construction *) +let t_mixed1 = { a = 317.; + b = 1300; + c = #731l; + d = #141l; + e = 600; + f = #2710l; + } + +let t_mixed2 = { a = (-317.); + b = -1300; + c = -#731l; + d = -#141l; + e = -600; + f = -#2710l; + } + +let print_t_mixed t = + print_float " a" t.a; + print_int " b" t.b; + print_int32u " c" t.c; + print_int32u " d" t.d; + print_int " e" t.e; + print_int32u " f" t.f + +let _ = + Printf.printf "Test mixed record construction:\n"; + print_t_mixed t_mixed1; + print_t_mixed t_mixed2 + +(* Matching, projection *) +let f_mixed1 {c; d; f; _} r = + match r with + | { a; _ } -> + { a = Float.of_int r.e; + b = Int32_u.(to_int (of_float a - d)); + c = Int32_u.(r.c + c); + d = Int32_u.(d - (of_int r.b)); + e = Int32_u.(to_int (f + (of_int r.e))); + f = r.f; + } + +let _ = + Printf.printf "Test mixed record matching and projection:\n"; + print_t_mixed (f_mixed1 t_mixed1 t_mixed2) + +(* Record update and mutation *) +let f_mixed2 ({a; d; _} as r1) r2 = + r1.d <- #4200l; + let r3 = { r2 with c = r1.d; + d = #2500l; } + in + r3.b <- Int32_u.(to_int (of_float a + d)); + r2.b <- 1700; + r1.f <- r2.c; + r3 + +let _ = + Printf.printf "Test mixed record update and mutation:\n"; + let t_mixed3 = f_mixed2 t_mixed1 t_mixed2 in + print_t_mixed t_mixed1; + print_t_mixed t_mixed2; + print_t_mixed t_mixed3 + +(**************************************) +(* Test: mixed constructor manipulation *) + +type t_mixed_variant = + | Const + | T of + { a : float; + mutable b : int; + c : int32#; + mutable d : int32#; + e : int; + mutable f : int32# } + +(* Construction *) +let t_mixed_variant1 = T + { a = 317.; + b = 1300; + c = #731l; + d = #141l; + e = 600; + f = #2710l; + } + +let t_mixed_variant2 = T + { a = (-317.); + b = -1300; + c = -#731l; + d = -#141l; + e = -600; + f = -#2710l; + } + +let[@warning "-partial-match"] print_t_mixed_variant (T t) = + print_float " a" t.a; + print_int " b" t.b; + print_int32u " c" t.c; + print_int32u " d" t.d; + print_int " e" t.e; + print_int32u " f" t.f + +let _ = + Printf.printf "Test mixed variant construction:\n"; + print_t_mixed_variant t_mixed_variant1; + print_t_mixed_variant t_mixed_variant2 + +(* Matching, projection *) +let[@warning "-partial-match"] f_mixed1 (T {c; d; f; _}) r = + match r with + | T ({ a; _ } as r) -> + T + { a = Float.of_int r.e; + b = Int32_u.(to_int (of_float a - d)); + c = Int32_u.(r.c + c); + d = Int32_u.(d - (of_int r.b)); + e = Int32_u.(to_int (f + (of_int r.e))); + f = r.f; + } + +let _ = + Printf.printf "Test mixed variant matching and projection:\n"; + print_t_mixed_variant (f_mixed1 t_mixed_variant1 t_mixed_variant2) + +(* Variant update and mutation *) +let[@warning "-partial-match"] f_mixed2 (T ({a; d; _} as r1)) (T r2) = + r1.d <- #4200l; + let T r3 = T { r2 with c = r1.d; + d = #2500l; } + in + r3.b <- Int32_u.(to_int (of_float a + d)); + r2.b <- 1700; + r1.f <- r2.c; + T r3 + +let _ = + Printf.printf "Test mixed variant update and mutation:\n"; + let t_mixed_variant3 = f_mixed2 t_mixed_variant1 t_mixed_variant2 in + print_t_mixed_variant t_mixed_variant1; + print_t_mixed_variant t_mixed_variant2; + print_t_mixed_variant t_mixed_variant3 + + +(************************************************************) +(* Test mixed records in recursive groups *) + +let rec f r = + r.d <- Int32_u.of_int t_rec1.b; + t_rec2.b <- 42; + t_rec1.f <- Int32_u.of_float t_rec1.a; + Int32_u.(of_float r.a + of_float t_rec2.a) + + +and t_rec1 = { a = 11.; + b = 2; + c = #33l; + d = #44l; + e = 5; + f = #66l; + } + +and t_rec2 = { a = (- 51.); + b = -6; + c = -#73l; + d = -#84l; + e = -9; + f = -#106l; + } + +let _ = + Printf.printf "Test 18, mixed records in recursive groups:\n"; + print_t_mixed t_rec1; + print_t_mixed t_rec2; + let result = f t_rec1 in + print_int32u " result (-40)" result; + print_t_mixed t_rec1; + print_t_mixed t_rec2 diff --git a/testsuite/tests/typing-layouts-bits32/unboxed_bits32s_alpha.reference b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s_alpha.reference new file mode 100644 index 00000000000..3964141ee4f --- /dev/null +++ b/testsuite/tests/typing-layouts-bits32/unboxed_bits32s_alpha.reference @@ -0,0 +1,115 @@ +Test mixed_blocks_with_closures, 171: : 228 + Test mixed_blocks_with_closures, step 0: 0 + Test mixed_blocks_with_closures, step 1: 0 + Test mixed_blocks_with_closures, step 2: 0 + Test mixed_blocks_with_closures, step 3: 0 + Test mixed_blocks_with_closures, step 4: 171 + Test mixed_blocks_with_closures, step 5: 114 + Test mixed_blocks_with_closures, step 6: 57 + Test mixed_blocks_with_closures, step 7: 0 + Test mixed_blocks_with_closures, step 8: 0 + Test mixed_blocks_with_closures, step 9: 0 +Test mixed record construction: + a: 317.00 + b: 1300 + c: 731 + d: 141 + e: 600 + f: 2710 + a: -317.00 + b: -1300 + c: -731 + d: -141 + e: -600 + f: -2710 +Test mixed record matching and projection: + a: -600.00 + b: -458 + c: 0 + d: 1441 + e: 2110 + f: -2710 +Test mixed record update and mutation: + a: 317.00 + b: 1300 + c: 731 + d: 4200 + e: 600 + f: -731 + a: -317.00 + b: 1700 + c: -731 + d: -141 + e: -600 + f: -2710 + a: -317.00 + b: 458 + c: 4200 + d: 2500 + e: -600 + f: -2710 +Test mixed variant construction: + a: 317.00 + b: 1300 + c: 731 + d: 141 + e: 600 + f: 2710 + a: -317.00 + b: -1300 + c: -731 + d: -141 + e: -600 + f: -2710 +Test mixed variant matching and projection: + a: -600.00 + b: -458 + c: 0 + d: 1441 + e: 2110 + f: -2710 +Test mixed variant update and mutation: + a: 317.00 + b: 1300 + c: 731 + d: 4200 + e: 600 + f: -731 + a: -317.00 + b: 1700 + c: -731 + d: -141 + e: -600 + f: -2710 + a: -317.00 + b: 458 + c: 4200 + d: 2500 + e: -600 + f: -2710 +Test 18, mixed records in recursive groups: + a: 11.00 + b: 2 + c: 33 + d: 44 + e: 5 + f: 66 + a: -51.00 + b: -6 + c: -73 + d: -84 + e: -9 + f: -106 + result (-40): -40 + a: 11.00 + b: 2 + c: 33 + d: 2 + e: 5 + f: 11 + a: -51.00 + b: 42 + c: -73 + d: -84 + e: -9 + f: -106 diff --git a/testsuite/tests/typing-layouts-bits64/alloc.ml b/testsuite/tests/typing-layouts-bits64/alloc.ml new file mode 100644 index 00000000000..137864a9845 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/alloc.ml @@ -0,0 +1,112 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + native; +*) + +(* A test comparing allocations when using unboxed [int64#]es to allocations + when using boxed [int64s]. *) + +(* Hide polymorphic equality *) +let ( = ) = Int.equal + +module Int64 = struct + include Int64 + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( = ) = equal +end + +module Int64_u = struct + include Stdlib_upstream_compatible.Int64_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( = ) = equal +end + +let baseline_allocation = + let first = Gc.allocated_bytes () in + let second = Gc.allocated_bytes () in + second -. first + +let measure_alloc fmt f = + let before = Gc.allocated_bytes () in + let result = (f[@inlined never]) () in + let after = Gc.allocated_bytes () in + let alloc = (after -. before) -. baseline_allocation in + Printf.printf (fmt ^^ "; %s\n") + (Int64_u.to_int64 result) + (if alloc > 0.0 then "allocated" else "did not allocate") + +(* We mark key functions [[@inline never]]. Without this, flambda2 might be + able to eliminate all allocations in the boxed case, and it's important to + have neither inlined for a fair comparison. (This was the case in the + [float64] version of this test. *) + +module Collatz_unboxed = struct + open Int64_u + + let[@inline never] rec collatz_count' count n = + if n = of_int64 1L then + count + else + collatz_count' + (succ count) + (if n %% of_int64 2L = of_int64 0L then + n // of_int64 2L + else + of_int64 3L * n + of_int64 1L) + + let collatz_count n = collatz_count' (of_int64 0L) n + + let go () = + measure_alloc "Unboxed: Collatz took %Ld steps to reach 1" + (fun () -> collatz_count (of_int64 27L)) +end + +module Collatz_boxed = struct + open Int64 + + let[@inline never] rec collatz_count' count n = + if n = 1L then + count + else + collatz_count' + (succ count) + (if n %% 2L = 0L then + n // 2L + else + 3L*n + 1L) + + let collatz_count n = Int64_u.of_int64 (collatz_count' 0L n) + + let go () = + measure_alloc "Boxed: Collatz took %Ld steps to reach 1" + (fun () -> collatz_count 27L) +end + +let () = Collatz_unboxed.go () +let () = Collatz_boxed.go () + +let[@inline never] literal_test x y = + let open Int64_u in + let[@inline never] f x y = (#1L + x) * (y - #4L) in + match x with + | #2L | #0x7fffffffffffffffL -> (f x y) / (#3L % #10L) + | _ -> #0L + +let _ = measure_alloc "literals (should be -1): %Ld" (fun () -> literal_test #2L #3L) +let _ = measure_alloc "literals (should be -3074457345618258602): %Ld" + (fun () -> literal_test #0x7fffffffffffffffL #0x7fffffffffffffffL) diff --git a/testsuite/tests/typing-layouts-bits64/alloc.reference b/testsuite/tests/typing-layouts-bits64/alloc.reference new file mode 100644 index 00000000000..98ca450330f --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/alloc.reference @@ -0,0 +1,4 @@ +Unboxed: Collatz took 111 steps to reach 1; did not allocate +Boxed: Collatz took 111 steps to reach 1; allocated +literals (should be -1): -1; did not allocate +literals (should be -3074457345618258602): -3074457345618258602; did not allocate diff --git a/testsuite/tests/typing-layouts-bits64/basics.ml b/testsuite/tests/typing-layouts-bits64/basics.ml new file mode 100644 index 00000000000..3bc6954a408 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/basics.ml @@ -0,0 +1,780 @@ +(* TEST + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } +*) + +(* This file contains typing tests for the layout [bits64]. + + Runtime tests for the type [int64#] can be found in the + [unboxed_int64], [alloc], and [test_int64_u] tests in this + directory. The type [int64#] here is used as a convenient example of a + concrete [bits64] type in some tests, but its behavior isn't the primary + purpose of this test. *) + +type t_bits64 : bits64 +type ('a : bits64) t_bits64_id = 'a + +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_bits64) = x;; +let f1_2 (x : 'a t_bits64_id) = x;; +let f1_3 (x : int64#) = x;; +[%%expect{| +type t_bits64 : bits64 +type ('a : bits64) t_bits64_id = 'a +val f1_1 : t_bits64 -> t_bits64 = +val f1_2 : ('a : bits64). 'a t_bits64_id -> 'a t_bits64_id = +val f1_3 : int64# -> int64# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_bits64) = + let y = x in + y;; + +let f2_2 (x : 'a t_bits64_id) = + let y = x in + y;; + +let f2_3 (x : int64#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_bits64 -> t_bits64 = +val f2_2 : ('a : bits64). 'a t_bits64_id -> 'a t_bits64_id = +val f2_3 : int64# -> int64# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_bits64 = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_bits64 = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout bits64. +|}];; + +let x3_2 : 'a t_bits64_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_bits64_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout bits64. +|}];; + +let x3_3 : int64# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : int64# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout bits64. +|}];; + +module M3_4 = struct + let x : t_bits64 = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_bits64 = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout bits64. +|}];; + +module M3_5 = struct + let f (x : int64#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout bits64. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_bits64) = x, false;; +[%%expect{| +Line 1, characters 26-27: +1 | let f4_1 (x : t_bits64) = x, false;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_bits64_id) = x, false;; +[%%expect{| +Line 1, characters 32-33: +1 | let f4_2 (x : 'a t_bits64_id) = x, false;; + ^ +Error: This expression has type 'a t_bits64_id = ('a : bits64) + but an expression was expected of type ('b : value) + The layout of 'a t_bits64_id is bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. + But the layout of 'a t_bits64_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : int64#) = x, false;; +[%%expect{| +Line 1, characters 24-25: +1 | let f4_3 (x : int64#) = x, false;; + ^ +Error: This expression has type int64# but an expression was expected of type + ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_bits64 * string;; +[%%expect{| +Line 1, characters 12-20: +1 | type t4_4 = t_bits64 * string;; + ^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * int64#;; +[%%expect{| +Line 1, characters 18-24: +1 | type t4_5 = int * int64#;; + ^^^^^^ +Error: Tuple element types must have layout value. + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : bits64) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 26-28: +1 | type ('a : bits64) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : bits64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 31-33: +1 | type ('a : bits64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(****************************************************) +(* Test 5: Allowed in some structures in typedecls. *) + +type t5_1 = { x : t_bits64 };; +[%%expect{| +type t5_1 = { x : t_bits64; } +|}];; + +type t5_2 = { y : int; x : t_bits64 };; +[%%expect{| +type t5_2 = { y : int; x : t_bits64; } +|}];; + +type t5_2' = { y : string; x : t_bits64 };; +[%%expect{| +type t5_2' = { y : string; x : t_bits64; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_bits64 } [@@unboxed];; +[%%expect{| +Line 1, characters 14-26: +1 | type t5_3 = { x : t_bits64 } [@@unboxed];; + ^^^^^^^^^^^^ +Error: Type t_bits64 has layout bits64. + Unboxed records may not yet contain types of this layout. +|}];; + +type t5_4 = A of t_bits64;; +[%%expect{| +type t5_4 = A of t_bits64 +|}];; + +type t5_5 = A of int * t_bits64;; +[%%expect{| +type t5_5 = A of int * t_bits64 +|}];; + +type ('a : bits64) t5_7 = A of int +type ('a : bits64) t5_8 = A of 'a;; +[%%expect{| +type ('a : bits64) t5_7 = A of int +type ('a : bits64) t5_8 = A of 'a +|}] + +(* not allowed: value in flat suffix *) +type 'a t_disallowed = A of t_bits64 * 'a + +[%%expect{| +Line 1, characters 23-41: +1 | type 'a t_disallowed = A of t_bits64 * 'a + ^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_bits64, but found boxed argument, 'a. +|}] + + +type t5_6 = A of t_bits64 [@@unboxed];; +[%%expect{| +Line 1, characters 12-25: +1 | type t5_6 = A of t_bits64 [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_bits64 has layout bits64. + Unboxed variants may not yet contain types of this layout. +|}];; + +type t5_6_1 = A of { x : t_bits64 } [@@unboxed];; +[%%expect{| +Line 1, characters 21-33: +1 | type t5_6_1 = A of { x : t_bits64 } [@@unboxed];; + ^^^^^^^^^^^^ +Error: Type t_bits64 has layout bits64. + Unboxed inlined records may not yet contain types of this layout. +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_bits64 end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-39: +1 | module type S6_1 = sig val x : t_bits64 end + ^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of type t_bits64 must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_bits64_id end +[%%expect{| +Line 1, characters 31-45: +1 | module type S6_2 = sig val x : 'a t_bits64_id end + ^^^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_bits64_id is bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. + But the layout of type 'a t_bits64_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : int64# end +[%%expect{| +Line 1, characters 31-37: +1 | module type S6_3 = sig val x : int64# end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of type int64# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_bits64) = `A x;; +[%%expect{| +Line 1, characters 29-30: +1 | let f7_1 (x : t_bits64) = `A x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_bits64_id) = `A x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f7_2 (x : 'a t_bits64_id) = `A x;; + ^ +Error: This expression has type 'a t_bits64_id = ('a : bits64) + but an expression was expected of type ('b : value) + The layout of 'a t_bits64_id is bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. + But the layout of 'a t_bits64_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : int64#) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f7_3 (x : int64#) = `A x;; + ^ +Error: This expression has type int64# but an expression was expected of type + ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_bits64 ];; +[%%expect{| +Line 1, characters 20-28: +1 | type f7_4 = [ `A of t_bits64 ];; + ^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : bits64) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 34-36: +1 | type ('a : bits64) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_bits64 () : t_bits64 = assert false +let make_t_bits64_id () : 'a t_bits64_id = assert false +let make_int64u () : int64# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_bits64 : unit -> t_bits64 = +val make_t_bits64_id : ('a : bits64). unit -> 'a t_bits64_id = +val make_int64u : unit -> int64# = +val id_value : 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_bits64 ());; +[%%expect{| +Line 1, characters 20-38: +1 | let x8_1 = id_value (make_t_bits64 ());; + ^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_bits64_id ());; +[%%expect{| +Line 1, characters 20-41: +1 | let x8_2 = id_value (make_t_bits64_id ());; + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_bits64_id = ('a : bits64) + but an expression was expected of type ('b : value) + The layout of 'a t_bits64_id is bits64 + because of the definition of make_t_bits64_id at line 2, characters 21-55. + But the layout of 'a t_bits64_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_int64u ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_3 = id_value (make_int64u ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type int64# but an expression was expected of type + ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But bits64 functions do. *) + +let twice f (x : 'a t_bits64_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_bits64 ()) +let f9_2 () = twice f1_2 (make_t_bits64_id ()) +let f9_3 () = twice f1_3 (make_int64u ());; +[%%expect{| +val twice : + ('a : bits64). + ('a t_bits64_id -> 'a t_bits64_id) -> 'a t_bits64_id -> 'a t_bits64_id = + +val f9_1 : unit -> t_bits64 t_bits64_id = +val f9_2 : ('a : bits64). unit -> 'a t_bits64_id = +val f9_3 : unit -> int64# t_bits64_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of bits64 and externals *) + +(* Valid uses of bits64 in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> int64# = "foo";; +[%%expect{| +Line 1, characters 0-46: +1 | external f10_1 : int -> bool -> int64# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_bits64 -> int = "foo";; +[%%expect{| +Line 1, characters 0-40: +1 | external f10_2 : t_bits64 -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_6 : (int64#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : int64# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (int64#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> int64# = "foo" "bar" +|}];; + +external f10_8 : int64 -> int64# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (int64 [@unboxed]) -> int64# = "foo" "bar" +|}];; + +external f10_9 : (int64#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 18-24: +1 | external f10_9 : (int64#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (int64#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-35: +1 | external f10_10 : string -> (int64#[@untagged]) = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(*************************************************) +(* Test 11: bits64 banned in extensible variants *) + +(* CR layouts v5.9: Actually allow mixed extensible variant blocks. *) + +type t11_1 = .. + +type t11_1 += A of t_bits64;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-27: +3 | type t11_1 += A of t_bits64;; + ^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of int64#;; +[%%expect{| +Line 1, characters 14-25: +1 | type t11_1 += B of int64#;; + ^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type ('a : bits64) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : bits64) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +(* not allowed: value in flat suffix *) +type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + +[%%expect{| +Line 1, characters 17-40: +1 | type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, 'a, + but found boxed argument, 'b. +|}] + +(***************************************) +(* Test 12: bits64 in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_bits64 >;; +[%%expect{| +Line 1, characters 15-27: +1 | type t12_1 = < x : t_bits64 >;; + ^^^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : bits64) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 33-35: +1 | type ('a : bits64) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_bits64 = assert false end;; +[%%expect{| +Line 1, characters 21-55: +1 | class c12_3 = object method x : t_bits64 = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_bits64 but is expected to have type + ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_bits64_id -> 'a t_bits64_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_bits64_id -> 'a t_bits64_id = assert false + ^^ +Error: This type ('a : bits64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. +|}];; + +class c12_5 = object val x : t_bits64 = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_bits64 = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : int64# end;; +[%%expect{| +Line 1, characters 26-43: +1 | class type c12_6 = object method x : int64# end;; + ^^^^^^^^^^^^^^^^^ +Error: The method x has type int64# but is expected to have type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : int64# end +[%%expect{| +Line 1, characters 26-40: +1 | class type c12_7 = object val x : int64# end + ^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is bits64 + because it is the primitive bits64 type int64#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_bits64_id -> 'a t_bits64_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_bits64_id -> 'a t_bits64_id + ^^ +Error: This type ('a : bits64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_bits64 -> t_bits64 > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_bits64) : t_bits64 = o#baz y y y;; +class ['a] c12_11 = object + method x : t_bits64 -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_bits64 = assert false +end;; +[%%expect{| +type t12_8 = < f : t_bits64 -> t_bits64 > +val f12_9 : t12_8 -> t_bits64 -> t_bits64 = +val f12_10 : + < baz : t_bits64 -> t_bits64 -> t_bits64 -> t_bits64; .. > -> + t_bits64 -> t_bits64 = +class ['a] c12_11 : object method x : t_bits64 -> 'a end +class ['a] c12_12 : object method x : 'a -> t_bits64 end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_bits64 + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_bits64) (m2 : t_bits64) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on bits64 yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_bits64) = x = x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f13_1 (x : t_bits64) = x = x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_bits64) = compare x x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f13_2 (x : t_bits64) = compare x x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_bits64) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 44-45: +1 | let f13_3 (x : t_bits64) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_bits64) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 40-41: +1 | let f13_4 (x : t_bits64) = Hashtbl.hash x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; diff --git a/testsuite/tests/typing-layouts-bits64/basics_alpha.ml b/testsuite/tests/typing-layouts-bits64/basics_alpha.ml new file mode 100644 index 00000000000..261a8a3fd4d --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/basics_alpha.ml @@ -0,0 +1,771 @@ +(* TEST + { + flags = "-extension layouts_alpha"; + expect; + } +*) + +(* This file contains typing tests for the layout [bits64]. + + Runtime tests for the type [int64#] can be found in the + [unboxed_int64], [alloc], and [test_int64_u] tests in this + directory. The type [int64#] here is used as a convenient example of a + concrete [bits64] type in some tests, but its behavior isn't the primary + purpose of this test. *) + +type t_bits64 : bits64 +type ('a : bits64) t_bits64_id = 'a + +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_bits64) = x;; +let f1_2 (x : 'a t_bits64_id) = x;; +let f1_3 (x : int64#) = x;; +[%%expect{| +type t_bits64 : bits64 +type ('a : bits64) t_bits64_id = 'a +val f1_1 : t_bits64 -> t_bits64 = +val f1_2 : ('a : bits64). 'a t_bits64_id -> 'a t_bits64_id = +val f1_3 : int64# -> int64# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_bits64) = + let y = x in + y;; + +let f2_2 (x : 'a t_bits64_id) = + let y = x in + y;; + +let f2_3 (x : int64#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_bits64 -> t_bits64 = +val f2_2 : ('a : bits64). 'a t_bits64_id -> 'a t_bits64_id = +val f2_3 : int64# -> int64# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_bits64 = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_bits64 = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout bits64. +|}];; + +let x3_2 : 'a t_bits64_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_bits64_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout bits64. +|}];; + +let x3_3 : int64# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : int64# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout bits64. +|}];; + +module M3_4 = struct + let x : t_bits64 = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_bits64 = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout bits64. +|}];; + +module M3_5 = struct + let f (x : int64#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout bits64. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_bits64) = x, false;; +[%%expect{| +Line 1, characters 26-27: +1 | let f4_1 (x : t_bits64) = x, false;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value_or_null) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_bits64_id) = x, false;; +[%%expect{| +Line 1, characters 32-33: +1 | let f4_2 (x : 'a t_bits64_id) = x, false;; + ^ +Error: This expression has type 'a t_bits64_id = ('a : bits64) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_bits64_id is bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. + But the layout of 'a t_bits64_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : int64#) = x, false;; +[%%expect{| +Line 1, characters 24-25: +1 | let f4_3 (x : int64#) = x, false;; + ^ +Error: This expression has type int64# but an expression was expected of type + ('a : value_or_null) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_bits64 * string;; +[%%expect{| +Line 1, characters 12-20: +1 | type t4_4 = t_bits64 * string;; + ^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * int64#;; +[%%expect{| +Line 1, characters 18-24: +1 | type t4_5 = int * int64#;; + ^^^^^^ +Error: Tuple element types must have layout value. + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : bits64) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 26-28: +1 | type ('a : bits64) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value_or_null) should be an instance of type + ('a0 : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : bits64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 31-33: +1 | type ('a : bits64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(****************************************************) +(* Test 5: Allowed in some structures in typedecls. *) + +type t5_1 = { x : t_bits64 };; +[%%expect{| +type t5_1 = { x : t_bits64; } +|}];; + +type t5_2 = { y : int; x : t_bits64 };; +[%%expect{| +type t5_2 = { y : int; x : t_bits64; } +|}];; + +type t5_2' = { y : string; x : t_bits64 };; +[%%expect{| +type t5_2' = { y : string; x : t_bits64; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_bits64 } [@@unboxed];; +[%%expect{| +Line 1, characters 14-26: +1 | type t5_3 = { x : t_bits64 } [@@unboxed];; + ^^^^^^^^^^^^ +Error: Type t_bits64 has layout bits64. + Unboxed records may not yet contain types of this layout. +|}];; + +type t5_4 = A of t_bits64;; +[%%expect{| +type t5_4 = A of t_bits64 +|}];; + +type t5_5 = A of int * t_bits64;; +[%%expect{| +type t5_5 = A of int * t_bits64 +|}];; + +type ('a : bits64) t5_7 = A of int +type ('a : bits64) t5_8 = A of 'a;; +[%%expect{| +type ('a : bits64) t5_7 = A of int +type ('a : bits64) t5_8 = A of 'a +|}] + +(* not allowed: value in flat suffix *) +type 'a t_disallowed = A of t_bits64 * 'a + +[%%expect{| +Line 1, characters 23-41: +1 | type 'a t_disallowed = A of t_bits64 * 'a + ^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_bits64, but found boxed argument, 'a. +|}] + + +type t5_6 = A of t_bits64 [@@unboxed];; +[%%expect{| +Line 1, characters 12-25: +1 | type t5_6 = A of t_bits64 [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_bits64 has layout bits64. + Unboxed variants may not yet contain types of this layout. +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_bits64 end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-39: +1 | module type S6_1 = sig val x : t_bits64 end + ^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of type t_bits64 must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_bits64_id end +[%%expect{| +Line 1, characters 31-45: +1 | module type S6_2 = sig val x : 'a t_bits64_id end + ^^^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_bits64_id is bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. + But the layout of type 'a t_bits64_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : int64# end +[%%expect{| +Line 1, characters 31-37: +1 | module type S6_3 = sig val x : int64# end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of type int64# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_bits64) = `A x;; +[%%expect{| +Line 1, characters 29-30: +1 | let f7_1 (x : t_bits64) = `A x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value_or_null) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_bits64_id) = `A x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f7_2 (x : 'a t_bits64_id) = `A x;; + ^ +Error: This expression has type 'a t_bits64_id = ('a : bits64) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_bits64_id is bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. + But the layout of 'a t_bits64_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : int64#) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f7_3 (x : int64#) = `A x;; + ^ +Error: This expression has type int64# but an expression was expected of type + ('a : value_or_null) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_bits64 ];; +[%%expect{| +Line 1, characters 20-28: +1 | type f7_4 = [ `A of t_bits64 ];; + ^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : bits64) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 34-36: +1 | type ('a : bits64) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value_or_null) should be an instance of type + ('a0 : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_bits64 () : t_bits64 = assert false +let make_t_bits64_id () : 'a t_bits64_id = assert false +let make_int64u () : int64# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_bits64 : unit -> t_bits64 = +val make_t_bits64_id : ('a : bits64). unit -> 'a t_bits64_id = +val make_int64u : unit -> int64# = +val id_value : ('a : value_or_null). 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_bits64 ());; +[%%expect{| +Line 1, characters 20-38: +1 | let x8_1 = id_value (make_t_bits64 ());; + ^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value_or_null) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_bits64_id ());; +[%%expect{| +Line 1, characters 20-41: +1 | let x8_2 = id_value (make_t_bits64_id ());; + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_bits64_id = ('a : bits64) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_bits64_id is bits64 + because of the definition of make_t_bits64_id at line 2, characters 21-55. + But the layout of 'a t_bits64_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_int64u ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_3 = id_value (make_int64u ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type int64# but an expression was expected of type + ('a : value_or_null) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But bits64 functions do. *) + +let twice f (x : 'a t_bits64_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_bits64 ()) +let f9_2 () = twice f1_2 (make_t_bits64_id ()) +let f9_3 () = twice f1_3 (make_int64u ());; +[%%expect{| +val twice : + ('a : bits64). + ('a t_bits64_id -> 'a t_bits64_id) -> 'a t_bits64_id -> 'a t_bits64_id = + +val f9_1 : unit -> t_bits64 t_bits64_id = +val f9_2 : ('a : bits64). unit -> 'a t_bits64_id = +val f9_3 : unit -> int64# t_bits64_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of bits64 and externals *) + +(* Valid uses of bits64 in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> int64# = "foo";; +[%%expect{| +Line 1, characters 0-46: +1 | external f10_1 : int -> bool -> int64# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_bits64 -> int = "foo";; +[%%expect{| +Line 1, characters 0-40: +1 | external f10_2 : t_bits64 -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_6 : (int64#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : int64# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (int64#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> int64# = "foo" "bar" +|}];; + +external f10_8 : int64 -> int64# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (int64 [@unboxed]) -> int64# = "foo" "bar" +|}];; + +external f10_9 : (int64#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 18-24: +1 | external f10_9 : (int64#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (int64#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-35: +1 | external f10_10 : string -> (int64#[@untagged]) = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(*************************************************) +(* Test 11: bits64 banned in extensible variants *) + +(* CR layouts v5.9: Actually allow mixed extensible variant blocks. *) + +type t11_1 = .. + +type t11_1 += A of t_bits64;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-27: +3 | type t11_1 += A of t_bits64;; + ^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of int64#;; +[%%expect{| +Line 1, characters 14-25: +1 | type t11_1 += B of int64#;; + ^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type ('a : bits64) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : bits64) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +(* not allowed: value in flat suffix *) +type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + +[%%expect{| +Line 1, characters 17-40: +1 | type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, 'a, + but found boxed argument, 'b. +|}] + +(***************************************) +(* Test 12: bits64 in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_bits64 >;; +[%%expect{| +Line 1, characters 15-27: +1 | type t12_1 = < x : t_bits64 >;; + ^^^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : bits64) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 33-35: +1 | type ('a : bits64) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : bits64) + The layout of 'a is bits64 + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_bits64 = assert false end;; +[%%expect{| +Line 1, characters 21-55: +1 | class c12_3 = object method x : t_bits64 = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_bits64 but is expected to have type + ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_bits64_id -> 'a t_bits64_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_bits64_id -> 'a t_bits64_id = assert false + ^^ +Error: This type ('a : bits64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. +|}];; + +class c12_5 = object val x : t_bits64 = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_bits64 = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : int64# end;; +[%%expect{| +Line 1, characters 26-43: +1 | class type c12_6 = object method x : int64# end;; + ^^^^^^^^^^^^^^^^^ +Error: The method x has type int64# but is expected to have type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : int64# end +[%%expect{| +Line 1, characters 26-40: +1 | class type c12_7 = object val x : int64# end + ^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is bits64 + because it is the primitive bits64 type int64#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_bits64_id -> 'a t_bits64_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_bits64_id -> 'a t_bits64_id + ^^ +Error: This type ('a : bits64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with bits64 + because of the definition of t_bits64_id at line 2, characters 0-35. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_bits64 -> t_bits64 > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_bits64) : t_bits64 = o#baz y y y;; +class ['a] c12_11 = object + method x : t_bits64 -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_bits64 = assert false +end;; +[%%expect{| +type t12_8 = < f : t_bits64 -> t_bits64 > +val f12_9 : t12_8 -> t_bits64 -> t_bits64 = +val f12_10 : + < baz : t_bits64 -> t_bits64 -> t_bits64 -> t_bits64; .. > -> + t_bits64 -> t_bits64 = +class ['a] c12_11 : object method x : t_bits64 -> 'a end +class ['a] c12_12 : object method x : 'a -> t_bits64 end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_bits64 + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_bits64) (m2 : t_bits64) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on bits64 yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_bits64) = x = x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f13_1 (x : t_bits64) = x = x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_bits64) = compare x x;; +[%%expect{| +Line 1, characters 35-36: +1 | let f13_2 (x : t_bits64) = compare x x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_bits64) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 44-45: +1 | let f13_3 (x : t_bits64) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_bits64) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 40-41: +1 | let f13_4 (x : t_bits64) = Hashtbl.hash x;; + ^ +Error: This expression has type t_bits64 + but an expression was expected of type ('a : value) + The layout of t_bits64 is bits64 + because of the definition of t_bits64 at line 1, characters 0-22. + But the layout of t_bits64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; diff --git a/testsuite/tests/typing-layouts-bits64/c_api.ml b/testsuite/tests/typing-layouts-bits64/c_api.ml new file mode 100644 index 00000000000..732c77aa16f --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/c_api.ml @@ -0,0 +1,75 @@ +(* TEST + modules = "c_functions.c"; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* This file tests using external C functions with int64#. *) + +external to_int64 : int64# -> (int64[@local_opt]) = "%box_int64" + +let print_int64u s f = Printf.printf "%s: %Ld\n" s (to_int64 f) +let print_int64 s f = Printf.printf "%s: %Ld\n" s f + +(* Various combinations of arguments int64, int64 [@unboxed], and + int64# *) +external lognot_UtoU : int64# -> int64# = + "lognot_bytecode" "lognot_UtoU" +external lognot_BtoU : int64 -> int64# = + "lognot_bytecode" "lognot_BtoU" +external lognot_UtoB : int64# -> int64 = + "lognot_bytecode" "lognot_UtoB" +external lognot_BUtoU : (int64[@unboxed]) -> int64# = + "lognot_bytecode" "lognot_UtoU" +external lognot_UtoBU : int64# -> (int64[@unboxed]) = + "lognot_bytecode" "lognot_UtoU" + +let () = + let i = lognot_UtoU #42L in + print_int64u "int64# -> int64#, ~42" i + +let () = + let i = lognot_BtoU (-100L) in + print_int64u "int64 -> int64#, ~(-100)" i + +let () = + let f = lognot_UtoB #255L in + print_int64 "int64# -> int64, ~255" f + +let () = + let f = lognot_BUtoU 1024L in + print_int64u "(int64[@unboxed]) -> int64#, ~1024" f + +let () = + let f = lognot_UtoBU (-#1726L) in + print_int64 "int64# -> (int64[@unboxed]), ~(-1726)" f + +(* If there are more than 5 args, you get an array in bytecode *) +external sum_7 : + int64# -> int64 -> int64# -> int64 -> + int64# -> int64 -> int64# -> int64# = + "sum_7_bytecode" "sum_7_UBUBUBUtoU" + +let _ = + let f = + sum_7 + #1L 2L #3L 4L + #5L 6L #7L + in + print_int64u "Function of 7 args, 1+2+3+4+5+6+7" f diff --git a/testsuite/tests/typing-layouts-bits64/c_api.reference b/testsuite/tests/typing-layouts-bits64/c_api.reference new file mode 100644 index 00000000000..6c5b84e195e --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/c_api.reference @@ -0,0 +1,6 @@ +int64# -> int64#, ~42: -43 +int64 -> int64#, ~(-100): 99 +int64# -> int64, ~255: -256 +(int64[@unboxed]) -> int64#, ~1024: -1025 +int64# -> (int64[@unboxed]), ~(-1726): 1725 +Function of 7 args, 1+2+3+4+5+6+7: 28 diff --git a/testsuite/tests/typing-layouts-bits64/c_functions.c b/testsuite/tests/typing-layouts-bits64/c_functions.c new file mode 100644 index 00000000000..757e3527665 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/c_functions.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +CAMLprim int64_t lognot_UtoU(int64_t u) { + return ~u; +} + +CAMLprim int64_t lognot_BtoU(value u) { + return ~Int64_val(u); +} + +CAMLprim value lognot_UtoB(int64_t u) { + CAMLparam0(); + CAMLlocal1(result); + result = caml_copy_int64(~u); + CAMLreturn(result); +} + +CAMLprim value lognot_bytecode(value u) { + CAMLparam1(u); + CAMLlocal1(result); + result = caml_copy_int64(~Int64_val(u)); + CAMLreturn(result); +} + +CAMLprim int64_t sum_7_UBUBUBUtoU(int64_t u1, value b2, int64_t u3, value b4, + int64_t u5, value b6, int64_t u7) { + int64_t u2 = Int64_val(b2); + int64_t u4 = Int64_val(b4); + int64_t u6 = Int64_val(b6); + return (u1 + u2 + u3 + u4 + u5 + u6 + u7); +} + +CAMLprim value sum_7_bytecode(value* argv, int argn) { + CAMLparam0(); + CAMLassert(argn == 7); + if (argn != 7) CAMLreturn(caml_copy_int64(INT64_LITERAL(-1))); + int64_t u1 = Int64_val(argv[0]); + int64_t u2 = Int64_val(argv[1]); + int64_t u3 = Int64_val(argv[2]); + int64_t u4 = Int64_val(argv[3]); + int64_t u5 = Int64_val(argv[4]); + int64_t u6 = Int64_val(argv[5]); + int64_t u7 = Int64_val(argv[6]); + CAMLlocal1(result); + result = caml_copy_int64(u1 + u2 + u3 + u4 + u5 + u6 + u7); + CAMLreturn(result); +} diff --git a/testsuite/tests/typing-layouts-bits64/parsing.ml b/testsuite/tests/typing-layouts-bits64/parsing.ml new file mode 100644 index 00000000000..fa76f07ea90 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/parsing.ml @@ -0,0 +1,277 @@ +(* TEST + expect; +*) + +(* These tests show how potential ambiguities are resolved + between the types #c and int64#. +*) + +(* Basic syntax: int64# is an unboxed int64. *) +type t = int64#;; +let f (_ : int64#) = ();; +[%%expect {| +type t = int64# +val f : int64# -> unit = +|}];; + +type t = C of int64#;; +[%%expect {| +type t = C of int64# +|}];; + +type t = C : int64# -> t;; +[%%expect {| +type t = C : int64# -> t +|}];; + +(* int64# works as an argument to normal type constructors, not just + classes, even though many of the rest of the tests in this file are concerned + with classes. +*) +type t = int64# list;; +[%%expect {| +Line 1, characters 9-15: +1 | type t = int64# list;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +let f (_ : int64# list) = ();; +[%%expect {| +Line 1, characters 11-17: +1 | let f (_ : int64# list) = ();; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C of int64# list;; +[%%expect {| +Line 1, characters 14-20: +1 | type t = C of int64# list;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C : int64# list -> t;; +[%%expect {| +Line 1, characters 13-19: +1 | type t = C : int64# list -> t;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +(* Syntax: int64#c + Interpreted as type application of [c] to [int64#]. +*) +class ['a] c = object(self) + method x :'a = assert false +end;; +[%%expect {| +class ['a] c : object method x : 'a end +|}];; + +type t = int64#c;; +[%%expect {| +Line 1, characters 9-15: +1 | type t = int64#c;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : int64#c) = ();; +[%%expect {| +Line 1, characters 11-17: +1 | let f (_ : int64#c) = ();; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of int64#c;; +[%%expect {| +Line 1, characters 14-20: +1 | type t = C of int64#c;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : int64#c -> t;; +[%%expect {| +Line 1, characters 13-19: +1 | type t = C : int64#c -> t;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: int64# c + Interpreted as type application of [c] to [int64#]. +*) +type t = int64# c;; +[%%expect {| +Line 1, characters 9-15: +1 | type t = int64# c;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : int64# c) = ();; +[%%expect {| +Line 1, characters 11-17: +1 | let f (_ : int64# c) = ();; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of int64# c;; +[%%expect {| +Line 1, characters 14-20: +1 | type t = C of int64# c;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : int64# c -> t;; +[%%expect {| +Line 1, characters 13-19: +1 | type t = C : int64# c -> t;; + ^^^^^^ +Error: This type int64# should be an instance of type ('a : value) + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: int64 #c + Interpreted as type application of [#c] to [int64]. + + Note that [int64 #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) +type t = int64 #c;; +[%%expect {| +Line 1, characters 0-17: +1 | type t = int64 #c;; + ^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type int64 #c as 'a the variable 'a is unbound +|}];; +type t = C of int64 #c;; +[%%expect {| +Line 1, characters 0-22: +1 | type t = C of int64 #c;; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (int64 #c as 'a) the variable 'a is unbound +|}];; +type 'a t = (int64 #c as 'a);; +let f (_ : int64 #c) = ();; +type 'a t = C of (int64 #c as 'a);; +type t = C : int64 #c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = int64 #c +val f : int64 #c -> unit = +type 'a t = C of 'a constraint 'a = int64 #c +type t = C : int64 #c -> t +|}];; + +(* Syntax: int64 # c + Interpreted as type application of [#c] to [int64]. + + Note that [int64 #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) + +type t = int64 # c;; +[%%expect {| +Line 1, characters 0-18: +1 | type t = int64 # c;; + ^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type int64 #c as 'a the variable 'a is unbound +|}];; +type t = C of int64 # c;; +[%%expect {| +Line 1, characters 0-23: +1 | type t = C of int64 # c;; + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (int64 #c as 'a) the variable 'a is unbound +|}];; + +type 'a t = (int64 # c as 'a);; +let f (_ : int64 # c) = ();; +type 'a t = C of (int64 # c as 'a);; +type t = C : int64 # c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = int64 #c +val f : int64 #c -> unit = +type 'a t = C of 'a constraint 'a = int64 #c +type t = C : int64 #c -> t +|}];; + +(***************************) +(* Type application: it's a type error, not a parse error. *) + +type t = int int64#;; +[%%expect {| +Line 1, characters 9-19: +1 | type t = int int64#;; + ^^^^^^^^^^ +Error: The type constructor int64# expects 0 argument(s), + but is here applied to 1 argument(s) +|}];; + +type t = (int, int) int64#;; +[%%expect {| +Line 1, characters 9-26: +1 | type t = (int, int) int64#;; + ^^^^^^^^^^^^^^^^^ +Error: The type constructor int64# expects 0 argument(s), + but is here applied to 2 argument(s) +|}];; diff --git a/testsuite/tests/typing-layouts-bits64/test_int64_u.ml b/testsuite/tests/typing-layouts-bits64/test_int64_u.ml new file mode 100644 index 00000000000..d5361f7308d --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/test_int64_u.ml @@ -0,0 +1,336 @@ +(* TEST + include stdlib_upstream_compatible; +*) + +module Int64_u = Stdlib_upstream_compatible.Int64_u +module Int32_u = Stdlib_upstream_compatible.Int32_u +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u + +(* Print all individual successful tests; used for debugging, as it will cause + this test to fail *) +let debug_tests = false + +(* Constant seed for repeatable random-testing properties *) +(* I hear primes are often good? This is an 11-digit prime in the decimal + expansion of [e], containing the earliest 10-digit prime the decimal + expansion of [e] per OEIS sequence A098963. *) +let () = Random.init 61000000007 + +let to_ocaml_string s = "\"" ^ String.escaped s ^ "\"" + +type 'a result = { + expected : 'a; + actual : 'a; + equal : 'a -> 'a -> bool; + to_string : 'a -> string +} + +module type Result = sig + type t + val equal : t -> t -> bool + val to_string : t -> string +end + +let mk_result' equal to_string = fun ~expected ~actual -> + { expected; actual; equal; to_string } + +let mk_result (type a) (module M : Result with type t = a) = + mk_result' M.equal M.to_string + +let float_result = mk_result (module Float) +let bool_result = mk_result (module Bool) +let int_result = mk_result (module Int) +let int32_result = mk_result (module Int32) +let int64_result = mk_result (module Int64) +let nativeint_result = mk_result (module Nativeint) +let string_result = mk_result' String.equal to_ocaml_string + +let option_result (type a) (module M : Result with type t = a) = + mk_result' + (Option.equal M.equal) + (function + | None -> "None" + | Some x -> "Some (" ^ M.to_string x ^ ")") + +type 'a generator = + | Rand of (unit -> 'a) + | Const of 'a + +let map_generator f = function + | Rand r -> Rand (fun () -> f (r ())) + | Const c -> Const (f c) + +type 'a input = { + generators : 'a generator list; + to_string : 'a -> string +} + +module type Integer = sig + type t + (* Interesting constants *) + val zero : t + val one : t + val minus_one : t + val max_int : t + val min_int : t + (* String generation *) + val to_string : t -> string + (* Comparison (for zero-testing) *) + val equal : t -> t -> bool + (* Arithmetic (for generating small numbers) *) + val sub : t -> t -> t + val shift_left : t -> int -> t +end + +let one_thousand (type a) (module I : Integer with type t = a) = + let open I in + let i1024 = shift_left one 10 in + let i16 = shift_left one 4 in + let i8 = shift_left one 3 in + sub (sub i1024 i16) i8 + +let two_thousand (type a) (module I : Integer with type t = a) = + I.shift_left (one_thousand (module I)) 1 + +let unit_input = + { generators = [Const ()] + ; to_string = Unit.to_string + } + +let bool_input = + { generators = [Const false; Const true] + ; to_string = Bool.to_string + } + +let float_input = + { generators = [ Const 0. + ; Const 1. + ; Const (-1.) + ; Const Float.max_float + ; Const Float.min_float + ; Const Float.epsilon + ; Const Float.nan + ; Const Float.infinity + ; Const Float.neg_infinity + ; Rand (fun () -> Random.float 2000. -. 1000.) + ; Rand (fun () -> Int64.float_of_bits (Random.bits64 ())) + ] + ; to_string = Float.to_string + } + +let integer_input + (type a) (module I : Integer with type t = a) + rand_range rand_full = + let rand_small () = + let i0_to_2000 = rand_range (two_thousand (module I)) in + I.sub i0_to_2000 (one_thousand (module I)) + in + { generators = [ Const I.zero + ; Const I.one + ; Const I.minus_one + ; Const I.max_int + ; Const I.min_int + ; Rand rand_small + ; Rand rand_full + ] + ; to_string = I.to_string + } + +let nonzero_integer_input + (type a) (module I : Integer with type t = a) + rand_range rand_full = + let { generators; to_string } = + integer_input (module I) rand_range rand_full + in + let generators = + generators |> + List.filter_map + (function + | Const c -> + if I.equal c I.zero + then None + else Some (Const c) + | Rand r -> + Some (Rand (fun () -> + let n = ref I.zero in + while I.equal !n I.zero do + n := r () + done; + !n))) + in + { generators; to_string } + +let int_input = integer_input (module Int) Random.int Random.bits +let int32_input = integer_input (module Int32) Random.int32 Random.bits32 +let int64_input = integer_input (module Int64) Random.int64 Random.bits64 +let nativeint_input = + integer_input (module Nativeint) Random.nativeint Random.nativebits +let nonzero_int64_input = + nonzero_integer_input (module Int64) Random.int64 Random.bits64 + +let int64_shift_amount_input = + { generators = List.init 64 (fun c -> Const c) + ; to_string = Int.to_string + } + +let int64_string_input = + { generators = List.map + (map_generator Int64.to_string) + int64_input.generators + ; to_string = to_ocaml_string + } + +let product2 ~f xs ys = + List.concat_map (fun x -> + List.map (fun y -> + f x y) + ys) + xs + +let two_inputs in1 in2 = + { generators = product2 in1.generators in2.generators ~f:(fun gen1 gen2 -> + match gen1, gen2 with + | Const c1, Const c2 -> Const (c1, c2) + | Const c1, Rand r2 -> Rand (fun () -> c1, r2 ()) + | Rand r1, Const c2 -> Rand (fun () -> r1 (), c2) + | Rand r1, Rand r2 -> Rand (fun () -> r1 (), r2 ()) + ) + ; to_string = fun (x1, x2) -> + Printf.sprintf "(%s, %s)" (in1.to_string x1) (in2.to_string x2) + } + +let passed { actual; expected; equal; _ } = equal actual expected + +let test ?(n=100) name prop { generators; to_string = input_to_string } = + let test input = + let {expected; actual; to_string} as result = prop input in + let print_test outcome = + Printf.printf "Test %s: %s. Input = %s; expected = %s; actual = %s\n" + outcome name + (input_to_string input) (to_string expected) (to_string actual) + in + if passed result then begin + if debug_tests then print_test "succeeded" + end + else + print_test "failed" + in + List.iter + (function + | Const c -> test c + | Rand r -> for _ = 1 to n do test (r ()) done) + generators + +let test_same + ~input ~result ~apply_expected ~apply_actual + ?n name expected actual = + test ?n name + (fun x -> + result + ~expected:(apply_expected expected x) + ~actual:(apply_actual actual x)) + input + +let test_constant ?n name expected actual result = + test ?n name (fun () -> result ~expected ~actual) unit_input + +let test_same_unary ?n name input result expected actual = + test_same + ~input + ~result + ~apply_expected:Fun.id + ~apply_actual:Fun.id + ?n name expected actual + +let test_same_binary ?n name input1 input2 result expected actual = + test_same + ~input:(two_inputs input1 input2) + ~result + ~apply_expected:(fun f (x,y) -> f x y) + ~apply_actual:(fun f (x,y) -> f x y) + ?n name expected actual + +let test_unary ?n name f fu = + test_same_unary ?n name int64_input int64_result f + (fun x -> Int64_u.to_int64 (fu (Int64_u.of_int64 x))) + +let test_unary_of ?n name f fu result = + test_same_unary ?n name int64_input result f + (fun x -> fu (Int64_u.of_int64 x)) + +let test_unary_to ?n name f fu input = + test_same_unary ?n name input int64_result f + (fun x -> Int64_u.to_int64 (fu x)) + +let test_binary' ~second_input ?n name f fu = + test_same_binary ?n name int64_input second_input int64_result f + (fun x y -> Int64_u.to_int64 + (fu + (Int64_u.of_int64 x) + (Int64_u.of_int64 y))) + +let test_binary = test_binary' ~second_input:int64_input + +let test_division = test_binary' ~second_input:nonzero_int64_input + +let test_binary_of ?n name f fu result = + test_same_binary ?n name int64_input int64_input result f + (fun x y -> fu + (Int64_u.of_int64 x) + (Int64_u.of_int64 y)) + +let test_shift ?n name shift shiftu = + test_same_binary + ?n name int64_input int64_shift_amount_input int64_result shift + (fun x y -> Int64_u.to_int64 + (shiftu + (Int64_u.of_int64 x) + y)) + +let int64_u_of_int32 x = Int64_u.of_int32_u (Int32_u.of_int32 x) +let int64_u_to_int32 x = Int32_u.to_int32 (Int64_u.to_int32_u x) +let int64_u_of_nativeint x = Int64_u.of_nativeint_u (Nativeint_u.of_nativeint x) +let int64_u_to_nativeint x = Nativeint_u.to_nativeint (Int64_u.to_nativeint_u x) + +let () = + test_unary "neg" Int64.neg Int64_u.neg; + test_binary "add" Int64.add Int64_u.add; + test_binary "sub" Int64.sub Int64_u.sub; + test_binary "mul" Int64.mul Int64_u.mul; + test_division "div" Int64.div Int64_u.div; + test_division "unsigned_div" Int64.unsigned_div Int64_u.unsigned_div; + test_division "rem" Int64.rem Int64_u.rem; + test_division "unsigned_rem" Int64.unsigned_rem Int64_u.unsigned_rem; + test_unary "succ" Int64.succ Int64_u.succ; + test_unary "pred" Int64.pred Int64_u.pred; + test_unary "abs" Int64.abs Int64_u.abs; + test_binary "logand" Int64.logand Int64_u.logand; + test_binary "logor" Int64.logor Int64_u.logor; + test_binary "logxor" Int64.logxor Int64_u.logxor; + test_unary "lognot" Int64.lognot Int64_u.lognot; + test_shift "shift_left" Int64.shift_left Int64_u.shift_left; + test_shift "shift_right" Int64.shift_right Int64_u.shift_right; + test_shift "shift_right_logical" Int64.shift_right_logical Int64_u.shift_right_logical; + test_unary_to "of_int" Int64.of_int Int64_u.of_int int_input; + test_unary_of "to_int" Int64.to_int Int64_u.to_int int_result; + test_unary_of "unsigned_to_int" Int64.unsigned_to_int Int64_u.unsigned_to_int (option_result (module Int)); + test_unary_to "of_float" Int64.of_float Int64_u.of_float float_input; + test_unary_of "to_float" Int64.to_float Int64_u.to_float float_result; + test_unary_to "of_int32" Int64.of_int32 Int64_u.of_int32 int32_input; + test_unary_of "to_int32" Int64.to_int32 Int64_u.to_int32 int32_result; + test_unary_to "of_nativeint" Int64.of_nativeint Int64_u.of_nativeint nativeint_input; + test_unary_of "to_nativeint" Int64.to_nativeint Int64_u.to_nativeint nativeint_result; + test_unary_to "of_int32_u" Int64.of_int32 int64_u_of_int32 int32_input; + test_unary_of "to_int32_u" Int64.to_int32 int64_u_to_int32 int32_result; + test_unary_to "of_nativeint_u" Int64.of_nativeint int64_u_of_nativeint nativeint_input; + test_unary_of "to_nativeint_u" Int64.to_nativeint int64_u_to_nativeint nativeint_result; + test_unary_to "of_string" Int64.of_string Int64_u.of_string int64_string_input; + test_unary_of "to_string" Int64.to_string Int64_u.to_string string_result; + test_unary_to "bits_of_float" Int64.bits_of_float Int64_u.bits_of_float float_input; + test_unary_of "float_of_bits" Int64.float_of_bits Int64_u.float_of_bits float_result; + test_binary_of "compare" Int64.compare Int64_u.compare int_result; + test_binary_of "unsigned_compare" Int64.unsigned_compare Int64_u.unsigned_compare int_result; + test_binary_of "equal" Int64.equal Int64_u.equal bool_result; + test_binary "min" Int64.min Int64_u.min; + test_binary "max" Int64.max Int64_u.max; + () diff --git a/testsuite/tests/typing-layouts-bits64/unboxed_bits64s.ml b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s.ml new file mode 100644 index 00000000000..6915607a8fd --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s.ml @@ -0,0 +1,423 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* This file contains various tests for [int64#]. It's not an expect test + to make sure it gets tested for native code. *) + +(*****************************************) +(* Prelude: Functions on unboxed int64s. *) + +module Int64_u = struct + include Stdlib_upstream_compatible.Int64_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( > ) x y = (compare x y) > 0 +end + +let to_binary_string x = + String.init 64 (fun i -> + if Int64.(equal (logand x (shift_left 1L (64 - i - 1))) 0L) + then '0' + else '1') + +let print_int prefix x = + Printf.printf "%s: %d\n" prefix x + +let print_int64u prefix x = + Printf.printf "%s: %Ld\n" prefix (Int64_u.to_int64 x) + +let print_int64u_bin prefix x = + let bx = Int64_u.to_int64 x in + Printf.printf "%s: %Ld = 0b%s\n" prefix bx (to_binary_string bx) + +(*********************************) +(* Test 1: some basic arithmetic *) + +(* Tests all the operators above *) +let test1 () = + (* CR layouts: When bits64 defs are allowed at the module level, get rid of + [test1] and move these definitions there. *) + let open Int64_u in + + (* Positive numbers *) + + let three = #3L in + print_int64u "Test 1, three" three; + + let twice_three = three + #3L in + print_int64u "Test 1, twice_three" twice_three; + + let thrice_three = #3L * three in + print_int64u "Test 1, thrice_three" thrice_three; + + let twice_three_again = thrice_three - three in + print_int64u "Test 1, twice_three_again" twice_three; + + let three_again = twice_three_again / #2L in + print_int64u "Test 1, three_again" three_again; + + let three_again_unsigned = twice_three_again // #2L in + print_int64u "Test 1, three_again_unsigned" three_again_unsigned; + + let twice_three_greater_than_three = twice_three > three in + Printf.printf "Test 1, twice_three_greater_than_three: %b\n" + twice_three_greater_than_three; + + let three_with_effort = + (#3L + twice_three) * #2L / #6L in + print_int64u "Test 1, three_with_effort" three_with_effort; + + let seven_rem_three = #7L % three in + print_int64u "Test 1, seven_rem_three" seven_rem_three; + + let seven_rem_three_unsigned = #7L %% three in + print_int64u "Test 1, seven_rem_three_unsigned" seven_rem_three_unsigned; + + let forty_two_logand_three = logand #42L three in + print_int64u_bin "Test1, forty_two_logand_three (0b00101010 & 0b00000011)" forty_two_logand_three; + + let forty_two_logor_three = logor #42L three in + print_int64u_bin "Test1, forty_two_logor_three (0b00101010 & 0b00000011)" forty_two_logor_three; + + let forty_two_logxor_three = logxor #42L three in + print_int64u_bin "Test1, forty_two_logxor_three (0b00101010 & 0b00000011)" forty_two_logxor_three; + + let lognot_three = lognot three in + print_int64u_bin "Test1, lognot_three (~0b00000011)" lognot_three; + + let three_shl_eight = shift_left three 8 in + print_int64u_bin "Test1, three_shl_eight (0b00000011 << 8)" three_shl_eight; + + let three_shr_one = shift_right three 1 in + print_int64u_bin "Test1, three_shr_one (0b00000011 >> 1)" three_shr_one; + + let three_shrl_one = shift_right_logical three 1 in + print_int64u_bin "Test1, three_shr_one (0b00000011 >>> 1)" three_shrl_one; + + (* Negative numbers *) + + let minus_five = -#5L in + print_int64u "Test 1, minus_five" minus_five; + + let twice_minus_five = minus_five + (-#5L) in + print_int64u "Test 1, twice_minus_five" twice_minus_five; + + let thrice_minus_five = #3L * minus_five in + print_int64u "Test 1, thrice_minus_five" thrice_minus_five; + + let twice_minus_five_again = thrice_minus_five - minus_five in + print_int64u "Test 1, twice_minus_five_again" twice_minus_five; + + let minus_five_again = twice_minus_five_again / #2L in + print_int64u "Test 1, minus_five_again" minus_five_again; + + let minus_five_again_unsigned = twice_minus_five_again // #2L in + print_int64u "Test 1, minus_five_again_unsigned" minus_five_again_unsigned; + + let minus_five_greater_than_twice_minus_five = minus_five > twice_minus_five in + Printf.printf "Test 1, minus_five_greater_than_twice_minus_five: %b\n" + minus_five_greater_than_twice_minus_five; + + let minus_five_with_effort = + ((-#5L) + twice_minus_five) * #2L / #6L in + print_int64u "Test 1, minus_five_with_effort" minus_five_with_effort; + + let seven_rem_minus_five = #7L % minus_five in + print_int64u "Test 1, seven_rem_minus_five" seven_rem_minus_five; + + let seven_rem_minus_five_unsigned = #7L %% minus_five in + print_int64u "Test 1, seven_rem_minus_five_unsigned" seven_rem_minus_five_unsigned; + + let forty_two_logand_minus_five = logand #42L minus_five in + print_int64u_bin "Test1, forty_two_logand_minus_five (0b00101010 & 0b1...1011)" forty_two_logand_minus_five; + + let forty_two_logor_minus_five = logor #42L minus_five in + print_int64u_bin "Test1, forty_two_logor_minus_five (0b00101010 & 0b1...1011)" forty_two_logor_minus_five; + + let forty_two_logxor_minus_five = logxor #42L minus_five in + print_int64u_bin "Test1, forty_two_logxor_minus_five (0b00101010 & 0b1...1011)" forty_two_logxor_minus_five; + + let lognot_minus_five = lognot minus_five in + print_int64u_bin "Test1, lognot_minus_five (~0b1...1011)" lognot_minus_five; + + let minus_five_shl_eight = shift_left minus_five 8 in + print_int64u_bin "Test1, minus_five_shl_eight (0b1...1011 << 8)" minus_five_shl_eight; + + let minus_five_shr_one = shift_right minus_five 1 in + print_int64u_bin "Test1, minus_five_shr_one (0b1...1011 >> 1)" minus_five_shr_one; + + let minus_five_shrl_one = shift_right_logical minus_five 1 in + print_int64u_bin "Test1, minus_five_shr_one (0b1...1011 >>> 1)" minus_five_shrl_one + + (* CR layouts: Restore these when the appropriate constants exist *) + (* print_int64u "Test 1, max_int" max_int; + * print_int64u "Test 1, min_int" min_int; *) + +let _ = test1 () + +(**********************************) +(* Test 2: higher-order functions *) + +(* CR layouts v1.5: This type definition can be eliminated once we have + annotations. *) +type ('a : bits64) t_bits64 = 'a + +let[@inline never] twice f (x : 'a t_bits64) = f (f x) +let[@inline never] compose f g (x : 'a t_bits64) = f (g x) + +let[@inline never] twice_on_three f = + let pi = #3L in + twice f pi + +let times_four = twice Int64_u.(fun x -> x * #2L) + +let _ = + let open Int64_u in + print_int64u "Test 2, add three twice" + (twice (fun x -> x + #3L) #0L); + print_int64u "Test 2, add three four times" + (twice (twice (fun x -> x + #3L)) #0L); + print_int64u "Test 2, increment three twice" + (twice_on_three (fun x -> #1L + x)); + print_int64u "Test 2, increment three four times" + (twice_on_three (twice (fun x -> #1L + x))); + print_int64u "Test 2, two times four" + (times_four #2L); + print_int64u "Test 2, three times sixteen" + (twice_on_three times_four); + print_int64u "Test 2, three times sixteen again" + (compose times_four times_four #3L); + print_int64u "Test 2, three minus four" + (let two = twice (fun x -> x + #1L) #0L in + let add_two = Int64_u.(+) two in + let add_two_after = compose add_two in + let minus_four = add_two_after (twice (fun x -> x - #3L)) in + minus_four #3L) + +(**********************************) +(* Test 3: int64# in closures *) + +(* [go]'s closure should haave an [int] (immediate), a [int64#] (bits64) and a + [int64 array] (value). *) +let[@inline never] f3 n m steps () = + let[@inline never] rec go k = + if k = n + then #0L + else begin + let acc = go (k + 1) in + steps.(k) <- Int64_u.to_int64 acc; + Int64_u.(+) m acc + end + in + go 0 + +(* many args - even args are tuples, odd args are unboxed int64s *) +let[@inline_never] f3_manyargs x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 steps () = + let (start_k, end_k) = x0 in + let[@inline never] rec go k = + if k = end_k + then #0L + else begin + let (x2_1, x2_2) = x2 in + let (x4_1, x4_2) = x4 in + let (x6_1, x6_2) = x6 in + let (x8_1, x8_2) = x8 in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Int64_u.to_int64 acc; + Int64_u.(acc + ((x1 + x3 + x5 + x7 + x9) * (of_int64 (Int64.of_int sum)))) + end + in + go start_k + +let test3 () = + (* Test f3 *) + let steps = Array.init 10 (fun _ -> 0L) in + let five_times_three = f3 5 #3L steps in + print_int64u "Test 3, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 3, step %d: %Ld\n") steps; + + (* Test f3_manyargs + + (1 + 2 + 3 + 5 + 8) = 19 + 3 * (1 + 2 + 3 + 5 + 8) = 57 + 6 * (1 + 2 + 3 + 5 + 8) = 114 + 9 * (1 + 2 + 3 + 5 + 8) = 171 + *) + let steps = Array.init 10 (fun _ -> 0L) in + let x1 = #1L in + let x3 = #2L in + let x5 = #3L in + let x7 = #5L in + let x9 = #8L in + + (* all these 8 numbers together sum to 3 *) + let x2 = (7, 42) in + let x4 = (-23, 109) in + let x6 = (-242, 90) in + let x8 = (-2, 22) in + + let f3_manyargs = f3_manyargs (4,8) x1 x2 x3 x4 x5 x6 x7 x8 x9 steps in + print_int64u "Test 3, 171: " (f3_manyargs ()); + Array.iteri (Printf.printf " Test 3, step %d: %Ld\n") steps + +let _ = test3 () + +(*********************************************) +(* Test 4: Partial and indirect applications *) + +let[@inline never] test4 () = + (* Simple indirect call *) + let[@inline never] go f = + Int64_u.to_int64 (f #1L #2L) + in + let (x1, x2) = (go Int64_u.(+), go Int64_u.(-)) in + print_int64u "Test 4, 1 + 2" (Int64_u.of_int64 x1); + print_int64u "Test 4, 1 - 2" (Int64_u.of_int64 x2); + + (* partial application to int64# *) + let steps = Array.init 10 (fun _ -> 0L) in + let f = Sys.opaque_identity (f3 5 #3L) in + let five_times_three = f steps in + print_int64u "Test 4, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %Ld\n") steps; + + (* partial application with int64# remaining *) + let steps = Array.init 10 (fun _ -> 0L) in + let f = Sys.opaque_identity (f3 6) in + let six_times_three = f #3L steps in + print_int64u "Test 4, 6 * 3: " (six_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %Ld\n") steps; + + (* Those two tests again, but making f3 also opaque to prevent expansion of + the partial application. *) + let f3 = Sys.opaque_identity f3 in + + let steps = Array.init 10 (fun _ -> 0L) in + let f = Sys.opaque_identity (f3 5 #3L) in + let five_times_three = f steps in + print_int64u "Test 4, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %Ld\n") steps; + + let steps = Array.init 10 (fun _ -> 0L) in + let f = Sys.opaque_identity (f3 6) in + let six_times_three = f #3L steps in + print_int64u "Test 4, 6 * 3: " (six_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %Ld\n") steps + +let _ = test4 () + +(****************************) +(* Test 5: Over application *) + +let[@inline never] f5 n m = + let open Int64_u in + (* Also testing a closure with only int64# values *) + let[@inline never] go f = + f (n + m) + in + go + +let test5 () = + let open Int64_u in + let _ : unit = + f5 #3L #2L + (fun n s m -> print_int64u s (n + m)) "Test 5, 3 + 2 + 1" + #1L + in + () + +let _ = test5 () + +(*********************************) +(* Test 6: methods on int64s *) + +(* CR layouts: add tests that capture int64s in objects, once that is + allowed. *) + +(* int64# args and returns *) +let f6_1 () = object + method f6_m1 f1 f2 f3 = + let open Int64_u in + (f1 - f2) / f3 +end + +(* capture a pair, recursion *) +let f6_2 n = object(self) + method f6_m2 n3 m1 f = + if n3 = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) then + m1 + else f (self#f6_m2 (n3+1) m1 f) +end + +(* overapplication to int64# and non-int64# args *) +let f6_3 n k = object + method f6_m3 n3 m1 f = + let n = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) in + f (n + k + n3) m1 +end + +let test6 () = + let add3 n (m, k) = n + m + k in + let open Int64_u in + + (* (30 - 20) / 3 = 3 *) + let o = (Sys.opaque_identity f6_1) () in + print_int64u "Test 6, 3" + (o#f6_m1 #30L #20L #3L); + + (* 4 * 8 = 32 *) + let o = (Sys.opaque_identity f6_2) (4,7) in + let result = o#f6_m2 8 #4L (fun x -> x * #2L) in + print_int64u "Test 6, 32" result; + + (* (1 + 2 + 3 + (-2) + (-12) + 4) * (2 + (-1) + 10) = -44 *) + let o = (Sys.opaque_identity f6_3) (1,2) 3 in + let result = + o#f6_m3 (-2) #2L + (fun[@inline never] i m1 m2 n m3 -> + (of_int64 (Int64.of_int (add3 i n))) * (m1 + m2 + m3)) + (-#1L) (-12,4) #10L + in + print_int64u "Test 6, -44" result + +let _ = test6 () + +(*****************************************) +(* Test 7: int64# and assert false joins *) + +module M = struct + open Int64_u + let[@inline never] f () = assert false + let g () = if Sys.opaque_identity true then #32L else f () +end + +let test7 () = + print_int64u "Test 7, 32" (M.g ()) + +let _ = test7 () diff --git a/testsuite/tests/typing-layouts-bits64/unboxed_bits64s.reference b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s.reference new file mode 100644 index 00000000000..6ce6b247674 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s.reference @@ -0,0 +1,115 @@ +Test 1, three: 3 +Test 1, twice_three: 6 +Test 1, thrice_three: 9 +Test 1, twice_three_again: 6 +Test 1, three_again: 3 +Test 1, three_again_unsigned: 3 +Test 1, twice_three_greater_than_three: true +Test 1, three_with_effort: 3 +Test 1, seven_rem_three: 1 +Test 1, seven_rem_three_unsigned: 1 +Test1, forty_two_logand_three (0b00101010 & 0b00000011): 2 = 0b0000000000000000000000000000000000000000000000000000000000000010 +Test1, forty_two_logor_three (0b00101010 & 0b00000011): 43 = 0b0000000000000000000000000000000000000000000000000000000000101011 +Test1, forty_two_logxor_three (0b00101010 & 0b00000011): 41 = 0b0000000000000000000000000000000000000000000000000000000000101001 +Test1, lognot_three (~0b00000011): -4 = 0b1111111111111111111111111111111111111111111111111111111111111100 +Test1, three_shl_eight (0b00000011 << 8): 768 = 0b0000000000000000000000000000000000000000000000000000001100000000 +Test1, three_shr_one (0b00000011 >> 1): 1 = 0b0000000000000000000000000000000000000000000000000000000000000001 +Test1, three_shr_one (0b00000011 >>> 1): 1 = 0b0000000000000000000000000000000000000000000000000000000000000001 +Test 1, minus_five: -5 +Test 1, twice_minus_five: -10 +Test 1, thrice_minus_five: -15 +Test 1, twice_minus_five_again: -10 +Test 1, minus_five_again: -5 +Test 1, minus_five_again_unsigned: 9223372036854775803 +Test 1, minus_five_greater_than_twice_minus_five: true +Test 1, minus_five_with_effort: -5 +Test 1, seven_rem_minus_five: 2 +Test 1, seven_rem_minus_five_unsigned: 7 +Test1, forty_two_logand_minus_five (0b00101010 & 0b1...1011): 42 = 0b0000000000000000000000000000000000000000000000000000000000101010 +Test1, forty_two_logor_minus_five (0b00101010 & 0b1...1011): -5 = 0b1111111111111111111111111111111111111111111111111111111111111011 +Test1, forty_two_logxor_minus_five (0b00101010 & 0b1...1011): -47 = 0b1111111111111111111111111111111111111111111111111111111111010001 +Test1, lognot_minus_five (~0b1...1011): 4 = 0b0000000000000000000000000000000000000000000000000000000000000100 +Test1, minus_five_shl_eight (0b1...1011 << 8): -1280 = 0b1111111111111111111111111111111111111111111111111111101100000000 +Test1, minus_five_shr_one (0b1...1011 >> 1): -3 = 0b1111111111111111111111111111111111111111111111111111111111111101 +Test1, minus_five_shr_one (0b1...1011 >>> 1): 9223372036854775805 = 0b0111111111111111111111111111111111111111111111111111111111111101 +Test 2, add three twice: 6 +Test 2, add three four times: 12 +Test 2, increment three twice: 5 +Test 2, increment three four times: 7 +Test 2, two times four: 8 +Test 2, three times sixteen: 48 +Test 2, three times sixteen again: 48 +Test 2, three minus four: -1 +Test 3, 5 * 3: : 15 + Test 3, step 0: 12 + Test 3, step 1: 9 + Test 3, step 2: 6 + Test 3, step 3: 3 + Test 3, step 4: 0 + Test 3, step 5: 0 + Test 3, step 6: 0 + Test 3, step 7: 0 + Test 3, step 8: 0 + Test 3, step 9: 0 +Test 3, 171: : 228 + Test 3, step 0: 0 + Test 3, step 1: 0 + Test 3, step 2: 0 + Test 3, step 3: 0 + Test 3, step 4: 171 + Test 3, step 5: 114 + Test 3, step 6: 57 + Test 3, step 7: 0 + Test 3, step 8: 0 + Test 3, step 9: 0 +Test 4, 1 + 2: 3 +Test 4, 1 - 2: -1 +Test 4, 5 * 3: : 15 + Test 4, step 0: 12 + Test 4, step 1: 9 + Test 4, step 2: 6 + Test 4, step 3: 3 + Test 4, step 4: 0 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 6 * 3: : 18 + Test 4, step 0: 15 + Test 4, step 1: 12 + Test 4, step 2: 9 + Test 4, step 3: 6 + Test 4, step 4: 3 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 5 * 3: : 15 + Test 4, step 0: 12 + Test 4, step 1: 9 + Test 4, step 2: 6 + Test 4, step 3: 3 + Test 4, step 4: 0 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 6 * 3: : 18 + Test 4, step 0: 15 + Test 4, step 1: 12 + Test 4, step 2: 9 + Test 4, step 3: 6 + Test 4, step 4: 3 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 5, 3 + 2 + 1: 6 +Test 6, 3: 3 +Test 6, 32: 32 +Test 6, -44: -44 +Test 7, 32: 32 diff --git a/testsuite/tests/typing-layouts-bits64/unboxed_bits64s_alpha.ml b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s_alpha.ml new file mode 100644 index 00000000000..4df4eacd3a3 --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s_alpha.ml @@ -0,0 +1,316 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + } +*) + +(* This should be read as a continuation of the [unboxed_bits64s.ml] test. + We can't put them there because: + - [unboxed_bits64s.ml] is run at all maturities, but + - these tests use features that only are enabled at the alpha maturity. + + Once mixed blocks move to the "stable" maturity level, we can + move these tests there. + *) + +(*****************************************) +(* Prelude: Functions on unboxed int64s. *) + +module Int64_u = struct + include Stdlib_upstream_compatible.Int64_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( > ) x y = (compare x y) > 0 +end + +let print_float prefix x = Printf.printf "%s: %.2f\n" prefix x + +let to_binary_string x = + String.init 64 (fun i -> + if Int64.(equal (logand x (shift_left 1L (64 - i - 1))) 0L) + then '0' + else '1') + +let print_int prefix x = + Printf.printf "%s: %d\n" prefix x + +let print_int64u prefix x = + Printf.printf "%s: %Ld\n" prefix (Int64_u.to_int64 x) + +let print_int64u_bin prefix x = + let bx = Int64_u.to_int64 x in + Printf.printf "%s: %Ld = 0b%s\n" prefix bx (to_binary_string bx) + +(***********************************) +(* Test: mixed blocks in closures *) + +(* Adapted from Test 3 in unboxed_bits64s.ml *) + +type block = + { x0_1 : int; + x0_2 : int; + x1 : int64#; + x2_1 : int; + x2_2 : int; + x3 : int64#; + x4_1 : int; + x4_2 : int; + x5 : int64#; + x6_1 : int; + x6_2 : int; + x7 : int64#; + x8_1 : int; + x8_2 : int; + x9 : int64#; + } + +let[@inline_never] f_mixed_blocks_and_closures + steps ({ x1; x0_1 = start_k; x0_2 = end_k; x8_1; x8_2; + x5; x6_1; x6_2; } as iargs) () = + let[@inline never] rec go k = + if k = end_k + then #0L + else begin + let (x2_1, x2_2) = iargs.x2_1, iargs.x2_2 in + let {x4_1; x4_2; _} = iargs in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Int64_u.to_int64 acc; + Int64_u.(acc + ((x1 + iargs.x3 + x5 + iargs.x7 + iargs.x9) + * (of_int64 (Int64.of_int sum)))) + end + in + go start_k + +let test_mixed_blocks_and_closures () = + (* Test f_mixed_blocks_and_closures + + (1 + 2 + 3 + 5 + 8) = 19 + 3 * (1 + 2 + 3 + 5 + 8) = 57 + 6 * (1 + 2 + 3 + 5 + 8) = 114 + 9 * (1 + 2 + 3 + 5 + 8) = 171 + *) + let steps = Array.init 10 (fun _ -> 0L) in + let x1 = #1L in + let x3 = #2L in + let x5 = #3L in + let x7 = #5L in + let x9 = #8L in + + (* all these 8 numbers together sum to 3 *) + let x2_1, x2_2 = (7, 42) in + let x4_1, x4_2 = (-23, 109) in + let x6_1, x6_2 = (-242, 90) in + let x8_1, x8_2 = (-2, 22) in + + let f = f_mixed_blocks_and_closures steps + { x0_1 = 4; x0_2 = 8; x1; x2_1; x2_2; x3; x4_1; x4_2; x5; + x6_1; x6_2; x7; x8_1; x8_2; x9 } + in + print_int64u "Test mixed_blocks_with_closures, 171: " (f ()); + Array.iteri (Printf.printf " Test mixed_blocks_with_closures, step %d: %Ld\n") + steps + +let _ = test_mixed_blocks_and_closures () + +(**************************************) +(* Test: mixed record manipulation *) + +type t_mixed_record = + { a : float; + mutable b : int; + c : int64#; + mutable d : int64#; + e : int; + mutable f : int64# } + +(* Construction *) +let t_mixed1 = { a = 317.; + b = 1300; + c = #731L; + d = #141L; + e = 600; + f = #2710L; + } + +let t_mixed2 = { a = (-317.); + b = -1300; + c = -#731L; + d = -#141L; + e = -600; + f = -#2710L; + } + +let print_t_mixed t = + print_float " a" t.a; + print_int " b" t.b; + print_int64u " c" t.c; + print_int64u " d" t.d; + print_int " e" t.e; + print_int64u " f" t.f + +let _ = + Printf.printf "Test mixed record construction:\n"; + print_t_mixed t_mixed1; + print_t_mixed t_mixed2 + +(* Matching, projection *) +let f_mixed1 {c; d; f; _} r = + match r with + | { a; _ } -> + { a = Float.of_int r.e; + b = Int64_u.(to_int (of_float a - d)); + c = Int64_u.(r.c + c); + d = Int64_u.(d - (of_int r.b)); + e = Int64_u.(to_int (f + (of_int r.e))); + f = r.f; + } + +let _ = + Printf.printf "Test mixed record matching and projection:\n"; + print_t_mixed (f_mixed1 t_mixed1 t_mixed2) + +(* Record update and mutation *) +let f_mixed2 ({a; d; _} as r1) r2 = + r1.d <- #4200L; + let r3 = { r2 with c = r1.d; + d = #2500L; } + in + r3.b <- Int64_u.(to_int (of_float a + d)); + r2.b <- 1700; + r1.f <- r2.c; + r3 + +let _ = + Printf.printf "Test mixed record update and mutation:\n"; + let t_mixed3 = f_mixed2 t_mixed1 t_mixed2 in + print_t_mixed t_mixed1; + print_t_mixed t_mixed2; + print_t_mixed t_mixed3 + +(**************************************) +(* Test: mixed constructor manipulation *) + +type t_mixed_variant = + | Const + | T of + { a : float; + mutable b : int; + c : int64#; + mutable d : int64#; + e : int; + mutable f : int64# } + +(* Construction *) +let t_mixed_variant1 = T + { a = 317.; + b = 1300; + c = #731L; + d = #141L; + e = 600; + f = #2710L; + } + +let t_mixed_variant2 = T + { a = (-317.); + b = -1300; + c = -#731L; + d = -#141L; + e = -600; + f = -#2710L; + } + +let[@warning "-partial-match"] print_t_mixed_variant (T t) = + print_float " a" t.a; + print_int " b" t.b; + print_int64u " c" t.c; + print_int64u " d" t.d; + print_int " e" t.e; + print_int64u " f" t.f + +let _ = + Printf.printf "Test mixed variant construction:\n"; + print_t_mixed_variant t_mixed_variant1; + print_t_mixed_variant t_mixed_variant2 + +(* Matching, projection *) +let[@warning "-partial-match"] f_mixed1 (T {c; d; f; _}) r = + match r with + | T ({ a; _ } as r) -> + T + { a = Float.of_int r.e; + b = Int64_u.(to_int (of_float a - d)); + c = Int64_u.(r.c + c); + d = Int64_u.(d - (of_int r.b)); + e = Int64_u.(to_int (f + (of_int r.e))); + f = r.f; + } + +let _ = + Printf.printf "Test mixed variant matching and projection:\n"; + print_t_mixed_variant (f_mixed1 t_mixed_variant1 t_mixed_variant2) + +(* Variant update and mutation *) +let[@warning "-partial-match"] f_mixed2 (T ({a; d; _} as r1)) (T r2) = + r1.d <- #4200L; + let T r3 = T { r2 with c = r1.d; + d = #2500L; } + in + r3.b <- Int64_u.(to_int (of_float a + d)); + r2.b <- 1700; + r1.f <- r2.c; + T r3 + +let _ = + Printf.printf "Test mixed variant update and mutation:\n"; + let t_mixed_variant3 = f_mixed2 t_mixed_variant1 t_mixed_variant2 in + print_t_mixed_variant t_mixed_variant1; + print_t_mixed_variant t_mixed_variant2; + print_t_mixed_variant t_mixed_variant3 + +(************************************************************) +(* Test mixed records in recursive groups *) + +let rec f r = + r.d <- Int64_u.of_int t_rec1.b; + t_rec2.b <- 42; + t_rec1.f <- Int64_u.of_float t_rec1.a; + Int64_u.(of_float r.a + of_float t_rec2.a) + + +and t_rec1 = { a = 11.; + b = 2; + c = #33L; + d = #44L; + e = 5; + f = #66L; + } + +and t_rec2 = { a = (- 51.); + b = -6; + c = -#73L; + d = -#84L; + e = -9; + f = -#106L; + } + +let _ = + Printf.printf "Test 18, mixed records in recursive groups:\n"; + print_t_mixed t_rec1; + print_t_mixed t_rec2; + let result = f t_rec1 in + print_int64u " result (-40)" result; + print_t_mixed t_rec1; + print_t_mixed t_rec2 diff --git a/testsuite/tests/typing-layouts-bits64/unboxed_bits64s_alpha.reference b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s_alpha.reference new file mode 100644 index 00000000000..3964141ee4f --- /dev/null +++ b/testsuite/tests/typing-layouts-bits64/unboxed_bits64s_alpha.reference @@ -0,0 +1,115 @@ +Test mixed_blocks_with_closures, 171: : 228 + Test mixed_blocks_with_closures, step 0: 0 + Test mixed_blocks_with_closures, step 1: 0 + Test mixed_blocks_with_closures, step 2: 0 + Test mixed_blocks_with_closures, step 3: 0 + Test mixed_blocks_with_closures, step 4: 171 + Test mixed_blocks_with_closures, step 5: 114 + Test mixed_blocks_with_closures, step 6: 57 + Test mixed_blocks_with_closures, step 7: 0 + Test mixed_blocks_with_closures, step 8: 0 + Test mixed_blocks_with_closures, step 9: 0 +Test mixed record construction: + a: 317.00 + b: 1300 + c: 731 + d: 141 + e: 600 + f: 2710 + a: -317.00 + b: -1300 + c: -731 + d: -141 + e: -600 + f: -2710 +Test mixed record matching and projection: + a: -600.00 + b: -458 + c: 0 + d: 1441 + e: 2110 + f: -2710 +Test mixed record update and mutation: + a: 317.00 + b: 1300 + c: 731 + d: 4200 + e: 600 + f: -731 + a: -317.00 + b: 1700 + c: -731 + d: -141 + e: -600 + f: -2710 + a: -317.00 + b: 458 + c: 4200 + d: 2500 + e: -600 + f: -2710 +Test mixed variant construction: + a: 317.00 + b: 1300 + c: 731 + d: 141 + e: 600 + f: 2710 + a: -317.00 + b: -1300 + c: -731 + d: -141 + e: -600 + f: -2710 +Test mixed variant matching and projection: + a: -600.00 + b: -458 + c: 0 + d: 1441 + e: 2110 + f: -2710 +Test mixed variant update and mutation: + a: 317.00 + b: 1300 + c: 731 + d: 4200 + e: 600 + f: -731 + a: -317.00 + b: 1700 + c: -731 + d: -141 + e: -600 + f: -2710 + a: -317.00 + b: 458 + c: 4200 + d: 2500 + e: -600 + f: -2710 +Test 18, mixed records in recursive groups: + a: 11.00 + b: 2 + c: 33 + d: 44 + e: 5 + f: 66 + a: -51.00 + b: -6 + c: -73 + d: -84 + e: -9 + f: -106 + result (-40): -40 + a: 11.00 + b: 2 + c: 33 + d: 2 + e: 5 + f: 11 + a: -51.00 + b: 42 + c: -73 + d: -84 + e: -9 + f: -106 diff --git a/testsuite/tests/typing-layouts-err-msg/a.ml b/testsuite/tests/typing-layouts-err-msg/a.ml new file mode 100644 index 00000000000..d56bfa3a28f --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/a.ml @@ -0,0 +1,5 @@ +type 'a t = 'a +type ('a ,'b) t2 = 'a +type ('a ,'b,'c,'d,'e) t5 = 'a +let f x = x + 1 +let f2 x = x diff --git a/testsuite/tests/typing-layouts-err-msg/annots.ml b/testsuite/tests/typing-layouts-err-msg/annots.ml new file mode 100644 index 00000000000..3940ac8f3cf --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/annots.ml @@ -0,0 +1,111 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(*********************) +(* Annotation errors *) + +type ('a : value) value = unit + +(* Type_declaration *) +type t_void : void +and t = t_void value + +[%%expect{| +type 'a value = unit +Line 5, characters 8-14: +5 | and t = t_void value + ^^^^^^ +Error: This type t_void = ('a : void) should be an instance of type + ('b : value) + The layout of t_void is void + because of the annotation on the declaration of the type t_void. + But the layout of t_void must overlap with value + because of the definition of value at line 1, characters 0-30. +|}] + +(* Type_parameter *) +type ('a : void) t = 'a value + +[%%expect{| +Line 1, characters 21-23: +1 | type ('a : void) t = 'a value + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : void) + The layout of 'a is void + because of the annotation on 'a in the declaration of the type t. + But the layout of 'a must overlap with value + because of the definition of value at line 1, characters 0-30. +|}] + +(* Newtype_declaration *) +let f (type a : void) (x: a value) = x + +[%%expect{| +Line 1, characters 26-27: +1 | let f (type a : void) (x: a value) = x + ^ +Error: This type a should be an instance of type ('a : value) + The layout of a is void + because of the annotation on the abstract type declaration for a. + But the layout of a must be a sublayout of value + because of the definition of value at line 1, characters 0-30. +|}] + +(* Constructor_type_parameter *) +type _ g = A : ('a: void) . 'a value -> unit g + +[%%expect{| +Line 1, characters 28-30: +1 | type _ g = A : ('a: void) . 'a value -> unit g + ^^ +Error: This type ('a : void) should be an instance of type ('b : value) + The layout of 'a is void + because of the annotation on a in the declaration of constructor A. + But the layout of 'a must overlap with value + because of the definition of value at line 1, characters 0-30. +|}] + +(* Univar *) +let f : ('a : void). 'a -> 'a value = assert false + +[%%expect{| +Line 1, characters 27-29: +1 | let f : ('a : void). 'a -> 'a value = assert false + ^^ +Error: This type ('a : void) should be an instance of type ('b : value) + The layout of 'a is void + because of the annotation on the universal variable 'a. + But the layout of 'a must overlap with value + because of the definition of value at line 1, characters 0-30. +|}] + +(* Type_variable *) +type t = 'a -> int as ('b : void) + +[%%expect{| +Line 1, characters 9-33: +1 | type t = 'a -> int as ('b : void) + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This alias is bound to type 'a -> int + but is used as an instance of type ('b : void) + The layout of 'a -> int is value + because it's a function type. + But the layout of 'a -> int must be a sublayout of void + because of the annotation on the type variable 'b. +|}] + +(* Type_wildcard *) +type t = 'a -> int as (_ : void) + +[%%expect{| +Line 1, characters 27-31: +1 | type t = 'a -> int as (_ : void) + ^^^^ +Error: Bad layout annotation: + The layout of 'a -> int is value + because it's a function type. + But the layout of 'a -> int must be a sublayout of void + because of the annotation on the wildcard _ at line 1, characters 27-31. +|}] diff --git a/testsuite/tests/typing-layouts-err-msg/any.ml b/testsuite/tests/typing-layouts-err-msg/any.ml new file mode 100644 index 00000000000..73d15462585 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/any.ml @@ -0,0 +1,25 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(*********************) +(* Any layout errors *) + +(* Missing_cmi *) +(* See [any_missing_cmi.ml] *) + +(* Wildcard *) +(* Unable to produce this error *) + +(* Unification_var *) +(* Unable to produce this error *) + +(* Initial_typedecl_env *) +(* Unable to produce this error *) + +(* Dummy_layout *) +(* Unable to produce this error *) + +(* Type_expression_call *) +(* Unable to produce this error *) diff --git a/testsuite/tests/typing-layouts-err-msg/any_missing_cmi.ml b/testsuite/tests/typing-layouts-err-msg/any_missing_cmi.ml new file mode 100644 index 00000000000..2c66c92452c --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/any_missing_cmi.ml @@ -0,0 +1,28 @@ +(* TEST + readonly_files = "any_missing_cmi_lib.ml any_missing_cmi_lib2.ml"; + setup-ocamlc.byte-build-env; + module = "any_missing_cmi_lib2.ml"; + ocamlc.byte; + module = "any_missing_cmi_lib.ml"; + ocamlc.byte; + script = "rm -f any_missing_cmi_lib2.cmi"; + script; + expect; +*) + +#directory "ocamlc.byte";; +#load "any_missing_cmi_lib.cmo";; + +let f = Any_missing_cmi_lib.f (assert false) +[%%expect{| +Line 1, characters 30-44: +1 | let f = Any_missing_cmi_lib.f (assert false) + ^^^^^^^^^^^^^^ +Error: Function arguments and returns must be representable. + The layout of Any_missing_cmi_lib2.t is any + because the .cmi file for Any_missing_cmi_lib2.t is missing. + But the layout of Any_missing_cmi_lib2.t must be representable + because we must know concretely how to pass a function argument. + No .cmi file found containing Any_missing_cmi_lib2.t. + Hint: Adding "any_missing_cmi_lib2" to your dependencies might help. +|}] diff --git a/testsuite/tests/typing-layouts-err-msg/any_missing_cmi_lib.ml b/testsuite/tests/typing-layouts-err-msg/any_missing_cmi_lib.ml new file mode 100644 index 00000000000..8e39828884d --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/any_missing_cmi_lib.ml @@ -0,0 +1 @@ +let f (a: Any_missing_cmi_lib2.t) = a diff --git a/testsuite/tests/typing-layouts-err-msg/any_missing_cmi_lib2.ml b/testsuite/tests/typing-layouts-err-msg/any_missing_cmi_lib2.ml new file mode 100644 index 00000000000..90cb2c4c209 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/any_missing_cmi_lib2.ml @@ -0,0 +1 @@ +type t = Mk of int diff --git a/testsuite/tests/typing-layouts-err-msg/concrete.ml b/testsuite/tests/typing-layouts-err-msg/concrete.ml new file mode 100644 index 00000000000..d59eb8346c1 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/concrete.ml @@ -0,0 +1,179 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(**************************) +(* Concrete layout errors *) + +type t_any : any +type t_void : void + +(* Match *) +let () = match (assert false : t_any) with _ -> () + +[%%expect{| +type t_any : any +type t_void : void +Line 5, characters 15-37: +5 | let () = match (assert false : t_any) with _ -> () + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_1) + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because a value of this type is matched against a pattern. +|}] + +(* Constructor_declaration *) +type t = A of t_any + +[%%expect{| +Line 1, characters 9-19: +1 | type t = A of t_any + ^^^^^^^^^^ +Error: Constructor argument types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. +|}] + +(* Label_declaration *) +type t = {a: t_any} + +[%%expect{| +Line 1, characters 10-18: +1 | type t = {a: t_any} + ^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field a. +|}] + +(* Unannotated_type_parameter *) +type 'a t = 'a +and t2 = t_any t + +[%%expect{| +Line 2, characters 9-14: +2 | and t2 = t_any t + ^^^^^ +Error: This type t_any should be an instance of type + ('a : '_representable_layout_2) + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because it instantiates an unannotated type parameter of t. +|}] + +(* Record_projection *) +(* Can't have a type with layout any in a record *) + +(* Record_assignment *) +(* Can't have a type with layout any in a record *) + +(* Let_binding *) +let x: t_any = assert false + +[%%expect{| +Line 1, characters 4-5: +1 | let x: t_any = assert false + ^ +Error: This pattern matches values of type t_any + but a pattern was expected which matches values of type + ('a : '_representable_layout_3) + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because it's the type of a variable bound by a `let`. +|}] + +(* Function_argument *) +let f (x: t_any) = () + +[%%expect{| +Line 1, characters 6-16: +1 | let f (x: t_any) = () + ^^^^^^^^^^ +Error: This pattern matches values of type t_any + but a pattern was expected which matches values of type + ('a : '_representable_layout_4) + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because we must know concretely how to pass a function argument. +|}] + +(* Function_result *) +let f (): t_any = assert false + +[%%expect{| +Line 1, characters 18-30: +1 | let f (): t_any = assert false + ^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_5) + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because we must know concretely how to return a function result. +|}] + +(* Structure_item_expression *) +(* See [concrete_struct_item_expr.ml] *) + +(* V1_safety_check *) +(* See [concrete_v1_check.ml] *) + +(* External_argument *) +external eq : t_any -> 'a -> bool = "%equal" +[%%expect{| +Line 1, characters 14-19: +1 | external eq : t_any -> 'a -> bool = "%equal" + ^^^^^ +Error: Types in an external must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because it's the type of an argument in an external declaration. +|}] +(* Shadowed by Function_argument *) + +(* External_result *) +external eq : 'a -> 'a -> t_any = "%equal" +[%%expect{| +Line 1, characters 26-31: +1 | external eq : 'a -> 'a -> t_any = "%equal" + ^^^^^ +Error: Types in an external must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because it's the type of the result of an external declaration. +|}] +(* Shadowed by Function_result *) + +(* Statement *) +let _ = (assert false : t_any); () + +[%%expect{| +Line 1, characters 8-30: +1 | let _ = (assert false : t_any); () + ^^^^^^^^^^^^^^^^^^^^^^ +Warning 10 [non-unit-statement]: this expression should have type unit. + +Line 1, characters 9-21: +1 | let _ = (assert false : t_any); () + ^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_6) + because it is in the left-hand side of a sequence + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the layout of t_any must be representable + because it's the type of a statement. +|}] diff --git a/testsuite/tests/typing-layouts-err-msg/concrete_struct_item_expr.compilers.reference b/testsuite/tests/typing-layouts-err-msg/concrete_struct_item_expr.compilers.reference new file mode 100644 index 00000000000..9558144b3b5 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/concrete_struct_item_expr.compilers.reference @@ -0,0 +1,11 @@ +type t_any : any +Line 1, characters 0-22: +1 | (assert false : t_any);; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_1) + The layout of t_any is any + because of the definition of t_any at line 6, characters 0-16. + But the layout of t_any must be representable + because it's the type of an expression in a structure. + diff --git a/testsuite/tests/typing-layouts-err-msg/concrete_struct_item_expr.ml b/testsuite/tests/typing-layouts-err-msg/concrete_struct_item_expr.ml new file mode 100644 index 00000000000..051273b89d1 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/concrete_struct_item_expr.ml @@ -0,0 +1,7 @@ +(* TEST + flags = "-extension layouts_alpha"; + toplevel; +*) + +type t_any : any;; +(assert false : t_any);; diff --git a/testsuite/tests/typing-layouts-err-msg/concrete_v1_check.compilers.reference b/testsuite/tests/typing-layouts-err-msg/concrete_v1_check.compilers.reference new file mode 100644 index 00000000000..1ab8f83aac1 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/concrete_v1_check.compilers.reference @@ -0,0 +1,5 @@ +type t_void : void +File "_none_", line 1: +Error: Non-value sort void detected in [translmod] in type t_void: + Please report this error to the Jane Street compilers team. + diff --git a/testsuite/tests/typing-layouts-err-msg/concrete_v1_check.ml b/testsuite/tests/typing-layouts-err-msg/concrete_v1_check.ml new file mode 100644 index 00000000000..761713ebb1b --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/concrete_v1_check.ml @@ -0,0 +1,7 @@ +(* TEST + flags = "-extension layouts_alpha"; + toplevel; +*) + +type t_void : void;; +(assert false : t_void);; diff --git a/testsuite/tests/typing-layouts-err-msg/debug_printer.compilers.reference b/testsuite/tests/typing-layouts-err-msg/debug_printer.compilers.reference new file mode 100644 index 00000000000..9d4065f8049 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/debug_printer.compilers.reference @@ -0,0 +1,4 @@ +type ('a : float64) t = 'a +val f : ('b : value_or_null) ('a : float64). 'b -> 'a t -> unit = +f has the wrong type for a printing function. + diff --git a/testsuite/tests/typing-layouts-err-msg/debug_printer.ml b/testsuite/tests/typing-layouts-err-msg/debug_printer.ml new file mode 100644 index 00000000000..a3ac504c2a1 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/debug_printer.ml @@ -0,0 +1,8 @@ +(* TEST + flags = "-extension layouts_alpha"; + toplevel; +*) +type ('a : float64) t = 'a +let f ppf (x : 'a t) = ();; +#install_printer f;; +(* Always shows the "??? has the wrong type for a printing function" message on exception *) diff --git a/testsuite/tests/typing-layouts-err-msg/float64.ml b/testsuite/tests/typing-layouts-err-msg/float64.ml new file mode 100644 index 00000000000..31f5d532a73 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/float64.ml @@ -0,0 +1,21 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(*************************) +(* Float64 layout errors *) + +(* Primitive *) +let f (x: float#): ('a : value) = x +[%%expect{| +Line 1, characters 34-35: +1 | let f (x: float#): ('a : value) = x + ^ +Error: This expression has type float# but an expression was expected of type + ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of the annotation on the type variable 'a. +|}];; diff --git a/testsuite/tests/typing-layouts-err-msg/gadt_existential.compilers.reference b/testsuite/tests/typing-layouts-err-msg/gadt_existential.compilers.reference new file mode 100644 index 00000000000..fdd60318315 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/gadt_existential.compilers.reference @@ -0,0 +1,9 @@ +File "gadt_existential.ml", line 13, characters 61-62: +13 | let f = function Dyn (type a) (w, x : a ty * a) -> ignore (f x) + ^ +Error: This expression has type a but an expression was expected of type + 'a t = ('a : void) + The layout of a is value + because it's an unannotated existential type variable. + But the layout of a must be a sublayout of void + because of the definition of f at file "gadt_existential.ml", line 10, characters 6-17. diff --git a/testsuite/tests/typing-layouts-err-msg/gadt_existential.ml b/testsuite/tests/typing-layouts-err-msg/gadt_existential.ml new file mode 100644 index 00000000000..8dae6e4e377 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/gadt_existential.ml @@ -0,0 +1,13 @@ +(* TEST + flags = "-extension layouts_alpha"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) + +type ('a: void) t = 'a +let f x: 'a t = x +type _ ty = Int : int ty +type dyn = Dyn : 'a ty * 'a -> dyn +let f = function Dyn (type a) (w, x : a ty * a) -> ignore (f x) diff --git a/testsuite/tests/typing-layouts-err-msg/immediate.ml b/testsuite/tests/typing-layouts-err-msg/immediate.ml new file mode 100644 index 00000000000..ba0af2af8ba --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/immediate.ml @@ -0,0 +1,68 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(***************************) +(* Immediate layout errors *) + +(* Empty_record *) +type ('a: void) t: void = { a: 'a } +[%%expect{| +Line 1, characters 0-35: +1 | type ('a: void) t: void = { a: 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Records must contain at least one runtime value. +|}] +(* Records with all void fields are not yet supported *) + +(* Enumeration *) +type ('a: void) t = 'a +type v = unit +let f (x: v): 'a t = x +[%%expect{| +type ('a : void) t = 'a +type v = unit +Line 3, characters 21-22: +3 | let f (x: v): 'a t = x + ^ +Error: This expression has type v = unit + but an expression was expected of type 'a t = ('a : void) + The layout of unit is value + because it's an enumeration variant type (all constructors are constant). + But the layout of unit must be a sublayout of void + because of the definition of t at line 1, characters 0-22. +|}] + +(* Primitive *) +type ('a: void) t = 'a +let f (x: int): 'a t = x +[%%expect{| +type ('a : void) t = 'a +Line 2, characters 23-24: +2 | let f (x: int): 'a t = x + ^ +Error: This expression has type int but an expression was expected of type + 'a t = ('a : void) + The layout of int is value + because it is the primitive immediate type int. + But the layout of int must be a sublayout of void + because of the definition of t at line 1, characters 0-22. +|}];; + +(* Immediate_polymorphic_variant *) +type ('a: void) t = 'a +let f (x: [`A | `B]): 'a t = x +[%%expect{| +type ('a : void) t = 'a +Line 2, characters 29-30: +2 | let f (x: [`A | `B]): 'a t = x + ^ +Error: This expression has type [ `A | `B ] + but an expression was expected of type 'a t = ('a : void) + The layout of [ `A | `B ] is value + because it's an enumeration variant type (all constructors are constant). + But the layout of [ `A | `B ] must be a sublayout of void + because of the definition of t at line 1, characters 0-22. +|}] + diff --git a/testsuite/tests/typing-layouts-err-msg/immediate64.ml b/testsuite/tests/typing-layouts-err-msg/immediate64.ml new file mode 100644 index 00000000000..9e857fa3a63 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/immediate64.ml @@ -0,0 +1,10 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(*****************************) +(* Immediate64 layout errors *) + +(* Separability_check *) +(* Only used within [Result.is_ok] and not thrown as an exception *) diff --git a/testsuite/tests/typing-layouts-err-msg/probe.ml b/testsuite/tests/typing-layouts-err-msg/probe.ml new file mode 100644 index 00000000000..3e842b885aa --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/probe.ml @@ -0,0 +1,15 @@ +(* TEST + setup-ocamlopt.opt-build-env; + arch_amd64; + flags = "-extension layouts_alpha"; + compiler_reference2 = "${test_source_directory}/probe.reference"; + ocamlopt_opt_exit_status = "2"; + compile_only = "true"; + ocamlopt.opt; + check-ocamlopt.opt-output; +*) + +let f (x: float#) = [%probe "a" ( + let f () = x in + () +)] diff --git a/testsuite/tests/typing-layouts-err-msg/probe.reference b/testsuite/tests/typing-layouts-err-msg/probe.reference new file mode 100644 index 00000000000..4fa2c13e711 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/probe.reference @@ -0,0 +1,11 @@ +File "probe.ml", line 13, characters 6-7: +13 | let f () = x in + ^ +Warning 26 [unused-var]: unused variable f. + +File "probe.ml", lines 12-15, characters 20-2: +12 | ....................[%probe "a" ( +13 | let f () = x in +14 | () +15 | )] +Error: Variables in probe handlers must have jkind value, but x in this handler does not. diff --git a/testsuite/tests/typing-layouts-err-msg/test.ml b/testsuite/tests/typing-layouts-err-msg/test.ml new file mode 100644 index 00000000000..4f775aaa982 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/test.ml @@ -0,0 +1,252 @@ +(* TEST + readonly_files = "a.ml"; + flags = "-extension layouts_alpha"; + setup-ocamlc.byte-build-env; + module = "a.ml"; + ocamlc.byte; + expect; +*) + +#directory "ocamlc.byte";; +#load "a.cmo";; +module B = A +type t_void : void +type t_value : value + +[%%expect{| +module B = A +type t_void : void +type t_value : value +|}] + +let f (x : t_void): 'a A.t = x + +[%%expect{| +Line 1, characters 29-30: +1 | let f (x : t_void): 'a A.t = x + ^ +Error: This expression has type t_void but an expression was expected of type + 'a A.t = ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the type argument of A.t has this layout. +|}] + +type t = t_void A.t + +[%%expect{| +Line 1, characters 9-15: +1 | type t = t_void A.t + ^^^^^^ +Error: This type t_void should be an instance of type ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the type argument of A.t has this layout. +|}] + + +let f (x : t_void): 'a B.t = x + +[%%expect{| +Line 1, characters 29-30: +1 | let f (x : t_void): 'a B.t = x + ^ +Error: This expression has type t_void but an expression was expected of type + 'a B.t = ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the type argument of B.t has this layout. +|}] + +type t = t_void B.t + +[%%expect{| +Line 1, characters 9-15: +1 | type t = t_void B.t + ^^^^^^ +Error: This type t_void should be an instance of type ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the type argument of B.t has this layout. +|}] + +let f (x : t_void): ('a, 'b) A.t2 = x + +[%%expect{| +Line 1, characters 36-37: +1 | let f (x : t_void): ('a, 'b) A.t2 = x + ^ +Error: This expression has type t_void but an expression was expected of type + ('a, 'b) A.t2 = ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the 1st type argument of A.t2 has this layout. +|}] + +type t = (t_void, t_value) A.t2 + +[%%expect{| +Line 1, characters 10-16: +1 | type t = (t_void, t_value) A.t2 + ^^^^^^ +Error: This type t_void should be an instance of type ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the 1st type argument of A.t2 has this layout. +|}] + +type t = (t_value, t_void, t_void, t_void, t_void) A.t5 + +[%%expect{| +Line 1, characters 19-25: +1 | type t = (t_value, t_void, t_void, t_void, t_void) A.t5 + ^^^^^^ +Error: This type t_void should be an instance of type ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the 2nd type argument of A.t5 has this layout. +|}] + +type t = (t_value, t_value, t_void, t_void, t_void) A.t5 + +[%%expect{| +Line 1, characters 28-34: +1 | type t = (t_value, t_value, t_void, t_void, t_void) A.t5 + ^^^^^^ +Error: This type t_void should be an instance of type ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the 3rd type argument of A.t5 has this layout. +|}] + +type t = (t_value, t_value, t_value, t_void, t_void) A.t5 + +[%%expect{| +Line 1, characters 37-43: +1 | type t = (t_value, t_value, t_value, t_void, t_void) A.t5 + ^^^^^^ +Error: This type t_void should be an instance of type ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the 4th type argument of A.t5 has this layout. +|}] + + +type t = (t_value, t_value, t_value, t_value, t_void) A.t5 + +[%%expect{| +Line 1, characters 46-52: +1 | type t = (t_value, t_value, t_value, t_value, t_void) A.t5 + ^^^^^^ +Error: This type t_void should be an instance of type ('a : value) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because the 5th type argument of A.t5 has this layout. +|}] + +let f (x: t_void) = A.f x + +[%%expect{| +Line 1, characters 24-25: +1 | let f (x: t_void) = A.f x + ^ +Error: This expression has type t_void but an expression was expected of type + int +|}] + +let f2 (x: t_void) = A.f2 x + +[%%expect{| +Line 1, characters 26-27: +1 | let f2 (x: t_void) = A.f2 x + ^ +Error: This expression has type t_void but an expression was expected of type + ('a : value_or_null) + The layout of t_void is void + because of the definition of t_void at line 2, characters 0-18. + But the layout of t_void must be a sublayout of value + because of layout requirements from an imported definition. +|}] + +type ('a : value) t_v = 'a +type ('a : void) t_vv = 'a +let f x: 'a t_v = x +let f2 = f +let () = ignore (f2 (assert false : 'a t_vv)) + +[%%expect{| +type 'a t_v = 'a +type ('a : void) t_vv = 'a +val f : 'a t_v -> 'a t_v = +val f2 : 'a t_v -> 'a t_v = +Line 5, characters 20-44: +5 | let () = ignore (f2 (assert false : 'a t_vv)) + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_vv = ('a : void) + but an expression was expected of type 'b t_v = ('b : value) + The layout of 'a is value + because of the definition of f2 at line 4, characters 9-10. + But the layout of 'a must overlap with void + because of the definition of t_vv at line 2, characters 0-26. +|}] + +type ('a : value) t_v = 'a +type ('a : void) t_v1 = 'a +type 'a t_v2 = 'a t_v1 +let f x: 'a t_v = x + +let () = ignore (f (assert false : 'a t_v2)) + +[%%expect{| +type 'a t_v = 'a +type ('a : void) t_v1 = 'a +type ('a : void) t_v2 = 'a t_v1 +val f : 'a t_v -> 'a t_v = +Line 6, characters 19-43: +6 | let () = ignore (f (assert false : 'a t_v2)) + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_v2 = ('a : void) + but an expression was expected of type 'b t_v = ('b : value) + The layout of 'a is value + because of the definition of f at line 4, characters 6-19. + But the layout of 'a must overlap with void + because of the definition of t_v2 at line 3, characters 0-22. +|}] + + +module type S1 = sig + type ('a : void) t = 'a +end + +module type S2 = S1 + +module M : S2 = struct + type 'a t = 'a +end + +[%%expect{| +module type S1 = sig type ('a : void) t = 'a end +module type S2 = S1 +Lines 7-9, characters 16-3: +7 | ................struct +8 | type 'a t = 'a +9 | end +Error: Signature mismatch: + Modules do not match: sig type 'a t = 'a end is not included in S2 + Type declarations do not match: + type 'a t = 'a + is not included in + type ('a : void) t = 'a + The type ('a : value) is not equal to the type ('a0 : void) + because their layouts are different. +|}] diff --git a/testsuite/tests/typing-layouts-err-msg/value.ml b/testsuite/tests/typing-layouts-err-msg/value.ml new file mode 100644 index 00000000000..6356ffa81e8 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/value.ml @@ -0,0 +1,415 @@ +(* TEST + flags = "-extension layouts_alpha -extension comprehensions"; + expect; +*) + +(***********************) +(* Value layout errors *) + +type t_any : any +type t_value : value +type t_imm : immediate +type t_imm64 : immediate64 +type t_float64 : float64 +type t_void : void + +type void_variant = VV of t_void +[%%expect{| +type t_any : any +type t_value : value +type t_imm : immediate +type t_imm64 : immediate64 +type t_float64 : float64 +type t_void : void +type void_variant = VV of t_void +|}];; + +(* Class_let_binding *) +let f (): t_float64 = assert false +class foo () = + let v = f () in + object end;; +[%%expect{| +val f : unit -> t_float64 = +Line 3, characters 6-7: +3 | let v = f () in + ^ +Error: The types of variables bound by a 'let' in a class function + must have layout value. Instead, v's type has layout float64. +|}];; + +(* Tuple_element *) +type t = t_any * t_any +[%%expect{| +Line 1, characters 9-14: +1 | type t = t_any * t_any + ^^^^^ +Error: Tuple element types must have layout value. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of t_any must be a sublayout of value + because it's the type of a tuple element. +|}];; + +(* Probe *) +(* See [probe.ml] *) + +(* Object *) +let f: ('a : void) -> 'b = fun x -> x # baz +[%%expect{| +Line 1, characters 36-37: +1 | let f: ('a : void) -> 'b = fun x -> x # baz + ^ +Error: Object types must have layout value. + The layout of the type of this expression is void + because of the annotation on the type variable 'a. + But the layout of the type of this expression must overlap with value + because it's the type of an object. +|}];; + +(* Instance_variable *) +module type S = sig + class foo : + object + val baz : t_void + end +end;; +[%%expect{| +Line 4, characters 6-22: +4 | val baz : t_void + ^^^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of baz is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of baz must be a sublayout of value + because it's the type of an instance variable. +|}];; + +(* Object_field *) +let f x: t_void = x # baz +[%%expect{| +Line 1, characters 18-25: +1 | let f x: t_void = x # baz + ^^^^^^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_void + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of an object field. +|}];; + +(* Class_field *) +class foo () = + object + val bar: t_void = assert false + end +[%%expect{| +Line 3, characters 8-11: +3 | val bar: t_void = assert false + ^^^ +Error: Variables bound in a class must have layout value. + The layout of bar is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of bar must be a sublayout of value + because it's the type of a class field. +|}];; + +(* Boxed_record *) +type r : void = {a:string} +[%%expect{| +Line 1, characters 0-26: +1 | type r : void = {a:string} + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type r is value + because it's a boxed record type. + But the layout of type r must be a sublayout of void + because of the annotation on the declaration of the type r. +|}];; + +(* Boxed_variant *) +type v : void = A of t_value +[%%expect{| +Line 1, characters 0-28: +1 | type v : void = A of t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type v is value + because it's a boxed variant type. + But the layout of type v must be a sublayout of void + because of the annotation on the declaration of the type v. +|}];; + +(* Extensible_variant *) +type attr : void = .. +[%%expect{| +Line 1, characters 0-21: +1 | type attr : void = .. + ^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type attr is value + because it's an extensible variant type. + But the layout of type attr must be a sublayout of void + because of the annotation on the declaration of the type attr. +|}] + +(* Primitive *) +let f : unit -> ('a : void) = fun () -> "abc" +[%%expect{| +Line 1, characters 40-45: +1 | let f : unit -> ('a : void) = fun () -> "abc" + ^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : void) + The layout of string is value + because it is the primitive value type string. + But the layout of string must be a sublayout of void + because of the annotation on the type variable 'a. +|}];; + +(* Type_argument *) +let f (x: t_void) = [x] +[%%expect{| +Line 1, characters 21-22: +1 | let f (x: t_void) = [x] + ^ +Error: This expression has type t_void but an expression was expected of type + ('a : value) + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of list has layout value. +|}];; + +(* Tuple *) +let f : unit -> ('a : void) = fun () -> (1,2) +[%%expect{| +Line 1, characters 40-45: +1 | let f : unit -> ('a : void) = fun () -> (1,2) + ^^^^^ +Error: This expression has type 'b * 'c + but an expression was expected of type ('a : void) + The layout of 'a * 'b is value + because it's a tuple type. + But the layout of 'a * 'b must be a sublayout of void + because of the annotation on the type variable 'a. +|}];; + +(* Row_variable *) +(* Unable to produce this error *) + +(* Polymorphic_variant *) +type ('a: void) t = 'a +let f (x: [`A of int | `B]): 'a t = x +[%%expect{| +type ('a : void) t = 'a +Line 2, characters 36-37: +2 | let f (x: [`A of int | `B]): 'a t = x + ^ +Error: This expression has type [ `A of int | `B ] + but an expression was expected of type 'a t = ('a : void) + The layout of [ `A of int | `B ] is value + because it's a polymorphic variant type. + But the layout of [ `A of int | `B ] must be a sublayout of void + because of the definition of t at line 1, characters 0-22. +|}] + +(* Arrow *) +type ('a: void) t = 'a +let f (x : int -> int): 'a t = x +[%%expect{| +type ('a : void) t = 'a +Line 2, characters 31-32: +2 | let f (x : int -> int): 'a t = x + ^ +Error: This expression has type int -> int + but an expression was expected of type 'a t = ('a : void) + The layout of int -> int is value + because it's a function type. + But the layout of int -> int must be a sublayout of void + because of the definition of t at line 1, characters 0-22. +|}] + +(* Tfield *) +(* Unable to produce this error *) + +(* Tnil *) +(* Unable to produce this error *) + +(* First_class_module *) +type ('a: void) t = 'a +module type X_int = sig val x : int end;; +module Three : X_int = struct let x = 3 end;; +let f (): 'a t = (module Three : X_int) +[%%expect{| +type ('a : void) t = 'a +module type X_int = sig val x : int end +module Three : X_int +Line 4, characters 17-39: +4 | let f (): 'a t = (module Three : X_int) + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type (module X_int) + but an expression was expected of type 'a t = ('a : void) + The layout of (module X_int) is value + because it's a first-class module type. + But the layout of (module X_int) must be a sublayout of void + because of the definition of t at line 1, characters 0-22. +|}] + +(* Separability_check *) +(* Only used within [Result.is_error] and not thrown as an exception *) + +(* Univar *) +let f: 'a. 'a -> ('b : void) = fun x -> x +[%%expect{| +Line 1, characters 40-41: +1 | let f: 'a. 'a -> ('b : void) = fun x -> x + ^ +Error: This expression has type ('a : value) + but an expression was expected of type ('b : void) + The layout of 'b is void + because of the annotation on the type variable 'b. + But the layout of 'b must overlap with value + because it is or unifies with an unannotated universal variable. +|}];; + +(* Polymorphic_variant_field *) +let f (x : t_float64) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f (x : t_float64) = `A x;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value_or_null) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 5, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +(* Default_type_jkind *) +type ('a : immediate) t2 = {a: 'a} and t3 = t t2 and t +[%%expect{| +Line 1, characters 49-54: +1 | type ('a : immediate) t2 = {a: 'a} and t3 = t t2 and t + ^^^^^ +Error: + The kind of t is value + because an abstract type has the value kind by default. + But the kind of t must be a subkind of immediate + because of the annotation on 'a in the declaration of the type t2. +|}];; + +(* Float_record_field *) +(* The type is restricted to float which always has layout value. + Can't generate an error *) + +(* Existential_type_variable *) +(* See [gadt_existential.ml] *) + +(* Array_comprehension_element *) +let f (x : t_float64) = [| x for i = 0 to 1 |] +[%%expect{| +Line 1, characters 27-28: +1 | let f (x : t_float64) = [| x for i = 0 to 1 |] + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 5, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the element type of array comprehension. +|}];; + +(* Lazy_expression *) +let f (x : t_float64) = lazy x +[%%expect{| +Line 1, characters 29-30: +1 | let f (x : t_float64) = lazy x + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 5, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a lazy expression. +|}];; + +(* Class_type_argument *) +module M = struct + type ('a : void) t + + class virtual ['a] foo = + object + val virtual baz : 'a t + end +end +[%%expect{| +Line 6, characters 24-26: +6 | val virtual baz : 'a t + ^^ +Error: This type ('a : void) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with void + because of the definition of t at line 2, characters 2-20. +|}];; + +(* Class_term_argument *) +class foo (x : t_float64) = + object end;; +[%%expect{| +Line 1, characters 10-25: +1 | class foo (x : t_float64) = + ^^^^^^^^^^^^^^^ +Error: This pattern matches values of type t_float64 + but a pattern was expected which matches values of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 5, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a term-level argument to a class constructor. +|}];; + +(* Structure_element *) +module type S = sig val x : t_void end +[%%expect{| +Line 1, characters 28-34: +1 | module type S = sig val x : t_void end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of type t_void must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +(* Debug_printer_argument *) +(* See [debug_printer.ml] *) + +(* V1_safety_check *) +type t = {a: t_void; b: int} +let f (x: t) = match x with | {a; b} -> a +[%%expect {| +type t = { a : t_void; b : int; } +Line 2, characters 15-41: +2 | let f (x: t) = match x with | {a; b} -> a + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Non-value layout void detected in [Typeopt.layout] as sort for type + t_void. Please report this error to the Jane Street compilers team. +|}] + +(* Captured_in_object *) +let f (m1 : t_float64) = object + val f = fun () -> m1 +end;; +[%%expect{| +Line 2, characters 20-22: +2 | val f = fun () -> m1 + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 5, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(* Unknown *) +(* Unable to produce this error *) diff --git a/testsuite/tests/typing-layouts-err-msg/void.ml b/testsuite/tests/typing-layouts-err-msg/void.ml new file mode 100644 index 00000000000..154d1670c35 --- /dev/null +++ b/testsuite/tests/typing-layouts-err-msg/void.ml @@ -0,0 +1,8 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(**********************) +(* Void layout errors *) + diff --git a/testsuite/tests/typing-layouts-float32/alloc.ml b/testsuite/tests/typing-layouts-float32/alloc.ml new file mode 100644 index 00000000000..9747d3de3f8 --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/alloc.ml @@ -0,0 +1,193 @@ +(* TEST + flambda2; + { + include stdlib_stable; + native; + } +*) + +(* mshinwell: This test is now only run with flambda2, as the corresponding + ocamltest predicate is reliable for testing whether this is an + flambda-backend build. *) + +(* A test comparing allocations with unboxed floats to allocations with boxed + floats. *) + +module Float32_u = struct + include Stdlib_stable.Float32_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( ** ) = pow + let ( > ) x y = (compare x y) > 0 +end + +let alloc = ref 0.0 + +let measure_alloc f : float32# = + (* NB: right-to-left evaluation order gets this right *) + let baseline_allocation = Gc.allocated_bytes() -. Gc.allocated_bytes() in + let before = Gc.allocated_bytes () in + let result = (f[@inlined never]) () in + let after = Gc.allocated_bytes () in + alloc := (after -. before) -. baseline_allocation; + result + +let measure_alloc_value f : 'a = + (* NB: right-to-left evaluation order gets this right *) + let baseline_allocation = Gc.allocated_bytes() -. Gc.allocated_bytes() in + let before = Gc.allocated_bytes () in + let result = (f[@inlined never]) () in + let after = Gc.allocated_bytes () in + alloc := (after -. before) -. baseline_allocation; + result + +(* We mark both [step] functions [@inline never]. Without this, flambda2 can + eliminate all allocations in [Pi_boxed] (and we do it in [Pi_unboxed] for a + fair comparison). Despite the fact that flambda2 could eliminate these + allocations, this seems like a reasonable test - it's not hard to imagine + more complicated scenarios with functions that couldn't be inlined for other + reasons. +*) + +let get_allocations () = + let result = if !alloc > 0. then "Allocated" else "Did not allocate" in + alloc := 0.0; + result + +let get_exact_allocations () = + let result = !alloc in + alloc := 0.0; + result + +module Pi_unboxed = +struct + open Float32_u + + let[@inline never] step n estimate = + let new_term = + ((-#1.s) ** n) + / ((n * #2.s) + #1.s) + in + estimate + new_term + + let rec go n est = + if n > #10000.s then est else go (n+ #1.s) (step n est) + + let estimate () = + let est = + measure_alloc (fun () -> go #0.s #0.s) + in + Printf.printf "Unboxed:\n estimate: %f\n allocations: %s\n" + (Stdlib_stable.Float32.to_float (to_float32 est) *. 4.) (get_allocations ()) +end + +module Pi_boxed = +struct + open Stdlib_stable.Float32 + open Operators + + let[@inline never] step n estimate = + let new_term = + (-1.s ** n) /. ((n *. 2.s) +. 1.s) + in + estimate +. new_term + + let rec go n est = + if n > 10000.s then est else go (n+.1.s) (step n est) + + let estimate () = + let est = + measure_alloc (fun () -> Float32_u.of_float32 (go 0.s 0.s)) + in + Printf.printf "Boxed:\n estimate: %f\n allocations: %s\n" + (to_float ((Float32_u.to_float32 est) *. 4.s)) (get_allocations ()) +end + +let _ = Pi_unboxed.estimate () +let _ = Pi_boxed.estimate () + + +(**********************************) +(* float32# record allocation tests *) +let[@inline never] consumer x y = Float32_u.(x + y) + +type t8 = { a : float32#; + mutable b : float32#; + c : float32#; + mutable d : float32# } + +let print_record_and_allocs s r = + let allocs = get_exact_allocations () in + Printf.printf + "%s:\n allocated bytes: %.2f\n a: %.2f\n b: %.2f\n c: %.2f\n d: %.2f\n" + s allocs + (Stdlib_stable.Float32.to_float (Float32_u.to_float32 r.a)) + (Stdlib_stable.Float32.to_float (Float32_u.to_float32 r.b)) + (Stdlib_stable.Float32.to_float (Float32_u.to_float32 r.c)) + (Stdlib_stable.Float32.to_float (Float32_u.to_float32 r.d)) + +(* Building a record should only allocate the box *) +let[@inline never] build x = + { a = x; + b = #42.0s; + c = consumer x x; + d = consumer x #1.0s } + +let[@inline never] project_a r = r.a +let[@inline never] update_d r x = r.d <- x + +(* We should be able to get floats out, do math on them, pass them to functions, + etc, without allocating. *) +let[@inline never] manipulate ({c; _} as r) = + match r with + | { b; _ } -> + update_d r (consumer b (project_a r)); + r.b <- Float32_u.sub c #21.1s; + r.a + +let _ = + let r = measure_alloc_value (fun () -> build #3.14s) in + print_record_and_allocs "Construction (40 bytes for record)" r; + let _ = measure_alloc (fun () -> manipulate r) in + print_record_and_allocs "Manipulation (0 bytes)" r + + +(* There was some concern the below would allocate when passed `false` due to + CSE. The idea is: + - Projections like `r.a` were initially implemented as + `unbox (box ( *(r+offset) ))`. This box is supposed to be erased by the + middle-end, but... + - The boxes from the `true` branch could get lifted out of the `if` to be + combined with the box from the projection, preventing it from being erased. + Projections are no longer implemented that way, so there's no common + subexpression to be eliminated, but I've kept the test. *) +let[@inline never] cse_test b r = + let (x : float32#) = r.a in + if b then + (Float32_u.to_float32 x, Float32_u.to_float32 x) + else + (0.s, 0.s) + +let _ = + let r = build #3.14s in + let _ = measure_alloc_value (fun () -> cse_test false r) in + let allocs = get_exact_allocations () in + Printf.printf "CSE test (0 bytes):\n allocated bytes: %.2f\n" allocs + +let[@inline never] literal_test x y = + let open Float32_u in + (#1.s + x) * (y - #4.s) / (#3.s ** #1.s) + +let print_allocs s = + let allocs = get_exact_allocations () in + Printf.printf + "%s:\n allocated bytes: %.2f\n" + s allocs + +let _ = + let r = measure_alloc (fun () -> literal_test #2.s #3.s) in + assert (Float32_u.equal r (-#1.s)); + print_allocs "Float32 literals"; diff --git a/testsuite/tests/typing-layouts-float32/alloc.reference b/testsuite/tests/typing-layouts-float32/alloc.reference new file mode 100644 index 00000000000..d915be2ac25 --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/alloc.reference @@ -0,0 +1,22 @@ +Unboxed: + estimate: 3.141699 + allocations: Did not allocate +Boxed: + estimate: 3.141699 + allocations: Allocated +Construction (40 bytes for record): + allocated bytes: 40.00 + a: 3.14 + b: 42.00 + c: 6.28 + d: 4.14 +Manipulation (0 bytes): + allocated bytes: 0.00 + a: 3.14 + b: -14.82 + c: 6.28 + d: 45.14 +CSE test (0 bytes): + allocated bytes: 0.00 +Float32 literals: + allocated bytes: 0.00 diff --git a/testsuite/tests/typing-layouts-float32/basics.ml b/testsuite/tests/typing-layouts-float32/basics.ml new file mode 100644 index 00000000000..39db3f54429 --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/basics.ml @@ -0,0 +1,915 @@ +(* TEST + flambda2; + { + flags = "-extension small_numbers"; + expect; + } +*) + +(* This file contains typing tests for the layout [float32]. + + Runtime tests for the type [float32#] can be found in the [unboxed_float] and + [alloc] tests in this directory. The type [float32#] here is used as a + convenient example of a concrete [float32] type in some tests, but its + behavior isn't the primary purpose of this test. *) + +type t_float32 : float32 +type ('a : float32) t_float32_id = 'a + +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_float32) = x;; +let f1_2 (x : 'a t_float32_id) = x;; +let f1_3 (x : float32#) = x;; +[%%expect{| +type t_float32 : float32 +type ('a : float32) t_float32_id = 'a +val f1_1 : t_float32 -> t_float32 = +val f1_2 : ('a : float32). 'a t_float32_id -> 'a t_float32_id = +val f1_3 : float32# -> float32# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_float32) = + let y = x in + y;; + +let f2_2 (x : 'a t_float32_id) = + let y = x in + y;; + +let f2_3 (x : float32#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_float32 -> t_float32 = +val f2_2 : ('a : float32). 'a t_float32_id -> 'a t_float32_id = +val f2_3 : float32# -> float32# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_float32 = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_float32 = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout float32. +|}];; + +let x3_2 : 'a t_float32_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_float32_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout float32. +|}];; + +let x3_3 : float32# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : float32# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout float32. +|}];; + +module M3_4 = struct + let x : t_float32 = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_float32 = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout float32. +|}];; + +module M3_5 = struct + let f (x : float32#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout float32. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_float32) = x, false;; +[%%expect{| +Line 1, characters 27-28: +1 | let f4_1 (x : t_float32) = x, false;; + ^ +Error: This expression has type t_float32 + but an expression was expected of type ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_float32_id) = x, false;; +[%%expect{| +Line 1, characters 33-34: +1 | let f4_2 (x : 'a t_float32_id) = x, false;; + ^ +Error: This expression has type 'a t_float32_id = ('a : float32) + but an expression was expected of type ('b : value) + The layout of 'a t_float32_id is float32 + because of the definition of t_float32_id at line 2, characters 0-37. + But the layout of 'a t_float32_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : float32#) = x, false;; +[%%expect{| +Line 1, characters 26-27: +1 | let f4_3 (x : float32#) = x, false;; + ^ +Error: This expression has type float32# + but an expression was expected of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_float32 * string;; +[%%expect{| +Line 1, characters 12-21: +1 | type t4_4 = t_float32 * string;; + ^^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * float32#;; +[%%expect{| +Line 1, characters 18-26: +1 | type t4_5 = int * float32#;; + ^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : float32) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 27-29: +1 | type ('a : float32) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : float32) + The layout of 'a is float32 + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : float32, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 32-34: +1 | type ('a : float32, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : float32) + The layout of 'a is float32 + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(*****************************************) +(* Test 5: float32 in structures *) + +(* all-float32 records are allowed, as are some records that mix float32 and + value fields. See [tests/typing-layouts/mixed_records.ml] for tests of mixed + records. *) +type t5_1 = { x : t_float32 };; +[%%expect{| +type t5_1 = { x : t_float32; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_float32 } [@@unboxed];; +[%%expect{| +Line 1, characters 14-27: +1 | type t5_3 = { x : t_float32 } [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_float32 has layout float32. + Unboxed records may not yet contain types of this layout. +|}];; + +type t5_4 = A of t_float32;; +[%%expect{| +type t5_4 = A of t_float32 +|}];; + +type t5_5 = A of int * t_float32;; +[%%expect{| +type t5_5 = A of int * t_float32 +|}];; + +type t5_6 = A of t_float32 [@@unboxed];; +[%%expect{| +Line 1, characters 12-26: +1 | type t5_6 = A of t_float32 [@@unboxed];; + ^^^^^^^^^^^^^^ +Error: Type t_float32 has layout float32. + Unboxed variants may not yet contain types of this layout. +|}];; + +type t5_6_1 = A of { x : t_float32 } [@@unboxed];; +[%%expect{| +Line 1, characters 21-34: +1 | type t5_6_1 = A of { x : t_float32 } [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_float32 has layout float32. + Unboxed inlined records may not yet contain types of this layout. +|}];; + +type ('a : float32) t5_7 = A of int +type ('a : float32) t5_8 = A of 'a;; +[%%expect{| +type ('a : float32) t5_7 = A of int +type ('a : float32) t5_8 = A of 'a +|}] + +type ('a : float32, 'b : float32) t5_9 = {x : 'a; y : 'b; z : 'a} + +type 'a t5_10 = 'a t_float32_id +and 'a t5_11 = {x : 'a t5_10; y : 'a} +[%%expect{| +type ('a : float32, 'b : float32) t5_9 = { x : 'a; y : 'b; z : 'a; } +Line 4, characters 20-28: +4 | and 'a t5_11 = {x : 'a t5_10; y : 'a} + ^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The layout of 'a is float32 + because of the definition of t_float32_id at line 2, characters 0-37. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t5_11, + defaulted to layout value. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}];; + +type ('a : float32) t5_12 = {x : 'a; y : float32#};; +[%%expect{| +type ('a : float32) t5_12 = { x : 'a; y : float32#; } +|}];; + +type ('a : float32) t5_13 = {x : 'a; y : float32#};; +[%%expect{| +type ('a : float32) t5_13 = { x : 'a; y : float32#; } +|}];; + +type 'a t5_14 = {x : 'a; y : float32#};; +[%%expect{| +type 'a t5_14 = { x : 'a; y : float32#; } +|}];; + +type ufref = { mutable contents : float32# };; +[%%expect{| +type ufref = { mutable contents : float32#; } +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_float32 end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-40: +1 | module type S6_1 = sig val x : t_float32 end + ^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of type t_float32 must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_float32_id end +[%%expect{| +Line 1, characters 31-46: +1 | module type S6_2 = sig val x : 'a t_float32_id end + ^^^^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_float32_id is float32 + because of the definition of t_float32_id at line 2, characters 0-37. + But the layout of type 'a t_float32_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : float32# end +[%%expect{| +Line 1, characters 31-39: +1 | module type S6_3 = sig val x : float32# end + ^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type float32# is float32 + because it is the primitive float32 type float32#. + But the layout of type float32# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_float32) = `A x;; +[%%expect{| +Line 1, characters 30-31: +1 | let f7_1 (x : t_float32) = `A x;; + ^ +Error: This expression has type t_float32 + but an expression was expected of type ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_float32_id) = `A x;; +[%%expect{| +Line 1, characters 36-37: +1 | let f7_2 (x : 'a t_float32_id) = `A x;; + ^ +Error: This expression has type 'a t_float32_id = ('a : float32) + but an expression was expected of type ('b : value) + The layout of 'a t_float32_id is float32 + because of the definition of t_float32_id at line 2, characters 0-37. + But the layout of 'a t_float32_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : float32#) = `A x;; +[%%expect{| +Line 1, characters 29-30: +1 | let f7_3 (x : float32#) = `A x;; + ^ +Error: This expression has type float32# + but an expression was expected of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_float32 ];; +[%%expect{| +Line 1, characters 20-29: +1 | type f7_4 = [ `A of t_float32 ];; + ^^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : float32) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 35-37: +1 | type ('a : float32) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : float32) + The layout of 'a is float32 + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_float32 () : t_float32 = assert false +let make_t_float32_id () : 'a t_float32_id = assert false +let make_floatu () : float32# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_float32 : unit -> t_float32 = +val make_t_float32_id : ('a : float32). unit -> 'a t_float32_id = +val make_floatu : unit -> float32# = +val id_value : 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_float32 ());; +[%%expect{| +Line 1, characters 20-39: +1 | let x8_1 = id_value (make_t_float32 ());; + ^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_float32 + but an expression was expected of type ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_float32_id ());; +[%%expect{| +Line 1, characters 20-42: +1 | let x8_2 = id_value (make_t_float32_id ());; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_float32_id = ('a : float32) + but an expression was expected of type ('b : value) + The layout of 'a t_float32_id is float32 + because of the definition of make_t_float32_id at line 2, characters 22-57. + But the layout of 'a t_float32_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_floatu ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_3 = id_value (make_floatu ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type float32# + but an expression was expected of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But float32 functions do. *) + +let twice f (x : 'a t_float32_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_float32 ()) +let f9_2 () = twice f1_2 (make_t_float32_id ()) +let f9_3 () = twice f1_3 (make_floatu ());; +[%%expect{| +val twice : + ('a : float32). + ('a t_float32_id -> 'a t_float32_id) -> + 'a t_float32_id -> 'a t_float32_id = + +val f9_1 : unit -> t_float32 t_float32_id = +val f9_2 : ('a : float32). unit -> 'a t_float32_id = +val f9_3 : unit -> float32# t_float32_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of float32 and externals *) + +(* Valid uses of float32 in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - if using a non-value layout in an external, you may not use the old-style + unboxed float directive, and + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> float32# = "foo";; +[%%expect{| +Line 1, characters 0-48: +1 | external f10_1 : int -> bool -> float32# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_float32 -> int = "foo";; +[%%expect{| +Line 1, characters 0-41: +1 | external f10_2 : t_float32 -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_3 : float32 -> t_float32 = "foo" "bar" "float";; +[%%expect{| +Line 1, characters 0-60: +1 | external f10_3 : float32 -> t_float32 = "foo" "bar" "float";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Cannot use "float" in conjunction with types of non-value layouts. +|}];; + +external f10_4 : int -> float32# -> float32 = "foo" "bar" "float";; +[%%expect{| +Line 1, characters 0-66: +1 | external f10_4 : int -> float32# -> float32 = "foo" "bar" "float";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Cannot use "float" in conjunction with types of non-value layouts. +|}];; + +external f10_5 : float32# -> bool -> string = "foo" "bar" "float";; +[%%expect{| +Line 1, characters 0-66: +1 | external f10_5 : float32# -> bool -> string = "foo" "bar" "float";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Cannot use "float" in conjunction with types of non-value layouts. +|}];; + +external f10_6 : (float32#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : float32# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (float32#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> float32# = "foo" "bar" +|}];; + +external f10_8 : float -> float32# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (float [@unboxed]) -> float32# = "foo" "bar" +|}];; + +external f10_9 : (float32#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 18-26: +1 | external f10_9 : (float32#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (float32#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-37: +1 | external f10_10 : string -> (float32#[@untagged]) = "foo" "bar";; + ^^^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(**************************************************) +(* Test 11: float32 banned in extensible variants *) + +type t11_1 = .. + +type t11_1 += A of t_float32;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-28: +3 | type t11_1 += A of t_float32;; + ^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of float32#;; +[%%expect{| +Line 1, characters 14-27: +1 | type t11_1 += B of float32#;; + ^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type ('a : float32) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : float32) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += C of t_float32 * string;; + +[%%expect{| +Line 1, characters 14-37: +1 | type t11_1 += C of t_float32 * string;; + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_float32, but found boxed argument, string. +|}] + +(***************************************) +(* Test 12: float32 in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_float32 >;; +[%%expect{| +Line 1, characters 15-28: +1 | type t12_1 = < x : t_float32 >;; + ^^^^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : float32) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 34-36: +1 | type ('a : float32) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : float32) + The layout of 'a is float32 + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_float32 = assert false end;; +[%%expect{| +Line 1, characters 21-56: +1 | class c12_3 = object method x : t_float32 = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_float32 but is expected to have type + ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_float32_id -> 'a t_float32_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_float32_id -> 'a t_float32_id = assert false + ^^ +Error: This type ('a : float32) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with float32 + because of the definition of t_float32_id at line 2, characters 0-37. +|}];; + +class c12_5 = object val x : t_float32 = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_float32 = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : float32# end;; +[%%expect{| +Line 1, characters 26-45: +1 | class type c12_6 = object method x : float32# end;; + ^^^^^^^^^^^^^^^^^^^ +Error: The method x has type float32# but is expected to have type + ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : float32# end +[%%expect{| +Line 1, characters 26-42: +1 | class type c12_7 = object val x : float32# end + ^^^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is float32 + because it is the primitive float32 type float32#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_float32_id -> 'a t_float32_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_float32_id -> 'a t_float32_id + ^^ +Error: This type ('a : float32) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with float32 + because of the definition of t_float32_id at line 2, characters 0-37. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_float32 -> t_float32 > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_float32) : t_float32 = o#baz y y y;; +class ['a] c12_11 = object + method x : t_float32 -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_float32 = assert false +end;; +[%%expect{| +type t12_8 = < f : t_float32 -> t_float32 > +val f12_9 : t12_8 -> t_float32 -> t_float32 = +val f12_10 : + < baz : t_float32 -> t_float32 -> t_float32 -> t_float32; .. > -> + t_float32 -> t_float32 = +class ['a] c12_11 : object method x : t_float32 -> 'a end +class ['a] c12_12 : object method x : 'a -> t_float32 end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_float32 + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_float32) (m2 : t_float32) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on float32 yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_float32) = x = x;; +[%%expect{| +Line 1, characters 28-29: +1 | let f13_1 (x : t_float32) = x = x;; + ^ +Error: This expression has type t_float32 + but an expression was expected of type ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_float32) = compare x x;; +[%%expect{| +Line 1, characters 36-37: +1 | let f13_2 (x : t_float32) = compare x x;; + ^ +Error: This expression has type t_float32 + but an expression was expected of type ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_float32) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 45-46: +1 | let f13_3 (x : t_float32) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_float32 + but an expression was expected of type ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_float32) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 41-42: +1 | let f13_4 (x : t_float32) = Hashtbl.hash x;; + ^ +Error: This expression has type t_float32 + but an expression was expected of type ('a : value) + The layout of t_float32 is float32 + because of the definition of t_float32 at line 1, characters 0-24. + But the layout of t_float32 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +(***********************************************************) +(* Test 14: unboxed float32 records work like normal records *) + +module FU = struct + + external of_float32 : (float32[@local_opt]) -> float32# = "%unbox_float32" + + external to_float32 : float32# -> (float32[@local_opt]) = "%box_float32" + + external sub : + (float32[@local_opt]) -> (float32[@local_opt]) -> (float32[@local_opt]) + = "%subfloat32" + + external add : + (float32[@local_opt]) -> (float32[@local_opt]) -> (float32[@local_opt]) + = "%addfloat32" + + let[@inline always] sub x y = of_float32 (sub (to_float32 x) (to_float32 y)) + + let[@inline always] add x y = of_float32 (add (to_float32 x) (to_float32 y)) +end + +type t14_1 = { x : float32#; y : float32# } + +(* pattern matching *) +let f14_1 {x;y} = FU.sub x y + +(* construction *) +let r14 = { x = #3.14s; y = #2.72s } + +let sum14_1 = FU.to_float32 (f14_1 r14) + +(* projection *) +let f14_2 ({y;_} as r) = FU.sub r.x y + +let sum14_2 = FU.to_float32 (f14_1 r14) + +type t14_2 = { mutable a : float32#; b : float32#; mutable c : float32# } + +let f14_3 ({b; c; _} as r) = + (* pure record update *) + let r' = { r with b = #20.0s; c = r.a } in + (* mutation *) + r.a <- FU.sub r.a r'.b; + r'.a <- #42.0s; + r' + +let a, b, c, a', b', c' = + let r = {a = #3.1s; b = -#0.42s; c = #27.7s } in + let r' = f14_3 r in + FU.to_float32 r.a, + FU.to_float32 r.b, + FU.to_float32 r.c, + FU.to_float32 r'.a, + FU.to_float32 r'.b, + FU.to_float32 r'.c + +let f14_4 r = + let {x; y} = r in + FU.add x y + + +[%%expect{| +module FU : + sig + external of_float32 : (float32 [@local_opt]) -> float32# + = "%unbox_float32" + external to_float32 : float32# -> (float32 [@local_opt]) = "%box_float32" + val sub : float32# -> float32# -> float32# + val add : float32# -> float32# -> float32# + end +type t14_1 = { x : float32#; y : float32#; } +val f14_1 : t14_1 -> float32# = +val r14 : t14_1 = {x = ; y = } +val sum14_1 : float32 = 0.420000076s +val f14_2 : t14_1 -> float32# = +val sum14_2 : float32 = 0.420000076s +type t14_2 = { mutable a : float32#; b : float32#; mutable c : float32#; } +val f14_3 : t14_2 -> t14_2 = +val a : float32 = -16.8999996s +val b : float32 = -0.419999987s +val c : float32 = 27.7000008s +val a' : float32 = 42.s +val b' : float32 = 20.s +val c' : float32 = 3.0999999s +val f14_4 : t14_1 -> float32# = +|}] diff --git a/testsuite/tests/typing-layouts-float32/c_api.ml b/testsuite/tests/typing-layouts-float32/c_api.ml new file mode 100644 index 00000000000..a2c771652d3 --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/c_api.ml @@ -0,0 +1,83 @@ +(* TEST + modules = "stubs.c"; + reference = "${test_source_directory}/c_api.reference"; + flambda2; + { + flags = "-extension small_numbers"; + native; + }{ + flags = "-extension small_numbers"; + bytecode; + }{ + flags = "-extension layouts_alpha -extension small_numbers"; + native; + }{ + flags = "-extension layouts_alpha -extension small_numbers"; + bytecode; + }{ + flags = "-extension layouts_beta -extension small_numbers"; + native; + }{ + flags = "-extension layouts_beta -extension small_numbers"; + bytecode; + } +*) + +(* mshinwell: This test is now only run with flambda2, as the corresponding + ocamltest predicate is reliable for testing whether this is an + flambda-backend build. *) + +(* This file tests using external C functions with float32#. *) + +external to_float : float32 -> float = "%floatoffloat32" +external to_float32 : float32# -> (float32[@local_opt]) = "%box_float32" + +let print_floatu s f = Printf.printf "%s: %.2f\n" s (to_float (to_float32 f)) +let print_float s f = Printf.printf "%s: %.2f\n" s (to_float f) + +(* Various combinations of arguments float, float [@unboxed], and float32# *) +external sin_U_U : float32# -> float32# = "sin_byte" "sin_U_U" +external sin_B_U : float32 -> float32# = "sin_byte" "sin_B_U" +external sin_U_B : float32# -> float32 = "sin_byte" "sin_U_B" + +external sin_BU_U : (float32[@unboxed]) -> float32# = "sin_byte" "sin_U_U" +external sin_U_BU : float32# -> (float32[@unboxed]) = "sin_byte" "sin_U_U" + +let sin_two = + let f = sin_U_U #2.s in + print_floatu "Test U -> U, sin two" f + +let sin_three = + let f = sin_B_U 3.s in + print_floatu "Test B -> U, sin three" f + +let sin_four = + let f = sin_U_B #4.s in + print_float "Test U -> B, sin four" f + +let sin_five = + let f = sin_BU_U 5.s in + print_floatu "Test (B[@unboxed]) -> U, sin five" f + +let sin_six = + let f = sin_U_BU #6.s in + print_float "Test U -> (B[@unboxed]), sin six" f + +(* If there are more than 5 args, you get an array in the bytecode version, + which is fine since the floats are boxed for bytecode. *) +external sum_7 : + float32# -> float32 -> float32# -> float32 -> float32# -> float32 -> float32# -> float32# = + "sum_7_byte" "sum_7" + +let sum_of_one_to_seven = + let f = + sum_7 #1.s 2.s #3.s 4.s #5.s 6.s #7.s + in + print_floatu "Function with many args, sum_of_one_to_seven" f + +(* Non-inlined eta expansion *) +let[@inline never] sin_U_U' x = sin_U_U x + +let sin_seven = + let f = sin_U_U' #7.s in + print_floatu "Test U -> U eta expansion, sin seven" f diff --git a/testsuite/tests/typing-layouts-float32/c_api.reference b/testsuite/tests/typing-layouts-float32/c_api.reference new file mode 100644 index 00000000000..fcbcf55a9de --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/c_api.reference @@ -0,0 +1,7 @@ +Test U -> U, sin two: 0.91 +Test B -> U, sin three: 0.14 +Test U -> B, sin four: -0.76 +Test (B[@unboxed]) -> U, sin five: -0.96 +Test U -> (B[@unboxed]), sin six: -0.28 +Function with many args, sum_of_one_to_seven: 28.00 +Test U -> U eta expansion, sin seven: 0.66 diff --git a/testsuite/tests/typing-layouts-float32/parsing.ml b/testsuite/tests/typing-layouts-float32/parsing.ml new file mode 100644 index 00000000000..1add5ee0b5c --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/parsing.ml @@ -0,0 +1,291 @@ +(* TEST + flags = "-extension layouts_alpha -extension small_numbers"; + { + flags = "-extension layouts_beta -extension small_numbers"; + expect; + } +*) + +(* These tests show how potential ambiguities are resolved + between the types #c and float32#. +*) + +(* Basic syntax: float32# is an unboxed float. *) +type t = float32#;; +let f (_ : float32#) = ();; +[%%expect {| +type t = float32# +val f : float32# -> unit = +|}];; + +type t = C of float32#;; +[%%expect {| +type t = C of float32# +|}];; + +type t = C : float32# -> t;; +[%%expect {| +type t = C : float32# -> t +|}];; + +(* float32# works as an argument to normal type constructors, not just classes, + even though many of the rest of the tests in this file are concerned with + classes. +*) +type t = float32# list;; +[%%expect {| +Line 1, characters 9-17: +1 | type t = float32# list;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +let f (_ : float32# list) = ();; +[%%expect {| +Line 1, characters 11-19: +1 | let f (_ : float32# list) = ();; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C of float32# list;; +[%%expect {| +Line 1, characters 14-22: +1 | type t = C of float32# list;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C : float32# list -> t;; +[%%expect {| +Line 1, characters 13-21: +1 | type t = C : float32# list -> t;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +(* Syntax: float32#c + Interpreted as type application of [c] to [float32#]. +*) +class ['a] c = object(self) + method x :'a = assert false +end;; +[%%expect {| +class ['a] c : object method x : 'a end +|}];; + +type t = float32#c;; +[%%expect {| +Line 1, characters 9-17: +1 | type t = float32#c;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : float32#c) = ();; +[%%expect {| +Line 1, characters 11-19: +1 | let f (_ : float32#c) = ();; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of float32#c;; +[%%expect {| +Line 1, characters 14-22: +1 | type t = C of float32#c;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : float32#c -> t;; +[%%expect {| +Line 1, characters 13-21: +1 | type t = C : float32#c -> t;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: float32# c + Interpreted as type application of [c] to [float32#]. +*) +type t = float32# c;; +[%%expect {| +Line 1, characters 9-17: +1 | type t = float32# c;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : float32# c) = ();; +[%%expect {| +Line 1, characters 11-19: +1 | let f (_ : float32# c) = ();; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of float32# c;; +[%%expect {| +Line 1, characters 14-22: +1 | type t = C of float32# c;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : float32# c -> t;; +[%%expect {| +Line 1, characters 13-21: +1 | type t = C : float32# c -> t;; + ^^^^^^^^ +Error: This type float32# should be an instance of type ('a : value) + The layout of float32# is float32 + because it is the primitive float32 type float32#. + But the layout of float32# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: float32 #c + Interpreted as type application of [#c] to [float32]. + + Note that [float32 #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) +type t = float32 #c;; +[%%expect {| +Line 1, characters 0-19: +1 | type t = float32 #c;; + ^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type float32 #c as 'a the variable 'a is unbound +|}];; +type t = C of float32 #c;; +[%%expect {| +Line 1, characters 0-24: +1 | type t = C of float32 #c;; + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (float32 #c as 'a) the variable 'a is unbound +|}];; +type 'a t = (float32 #c as 'a);; +let f (_ : float32 #c) = ();; +type 'a t = C of (float32 #c as 'a);; +type t = C : float32 #c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = float32 #c +val f : float32 #c -> unit = +type 'a t = C of 'a constraint 'a = float32 #c +type t = C : float32 #c -> t +|}];; + +(* Syntax: float32 # c + Interpreted as type application of [#c] to [float32]. + + Note that [float32 #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) + +type t = float32 # c;; +[%%expect {| +Line 1, characters 0-20: +1 | type t = float32 # c;; + ^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type float32 #c as 'a the variable 'a is unbound +|}];; +type t = C of float32 # c;; +[%%expect {| +Line 1, characters 0-25: +1 | type t = C of float32 # c;; + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (float32 #c as 'a) the variable 'a is unbound +|}];; + +type 'a t = (float32 # c as 'a);; +let f (_ : float32 # c) = ();; +type 'a t = C of (float32 # c as 'a);; +type t = C : float32 # c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = float32 #c +val f : float32 #c -> unit = +type 'a t = C of 'a constraint 'a = float32 #c +type t = C : float32 #c -> t +|}];; + +(***************************) +(* Type application: it's a type error, not a parse error. *) + +type t = int float32#;; +[%%expect {| +Line 1, characters 9-21: +1 | type t = int float32#;; + ^^^^^^^^^^^^ +Error: The type constructor float32# expects 0 argument(s), + but is here applied to 1 argument(s) +|}];; + +type t = (int, int) float32#;; +[%%expect {| +Line 1, characters 9-28: +1 | type t = (int, int) float32#;; + ^^^^^^^^^^^^^^^^^^^ +Error: The type constructor float32# expects 0 argument(s), + but is here applied to 2 argument(s) +|}];; + +(*******************) +(* Hint for #float32 *) +type t = #float32;; +[%%expect {| +Line 1, characters 9-17: +1 | type t = #float32;; + ^^^^^^^^ +Error: float32 isn't a class type. Did you mean the unboxed type float32#? +|}] diff --git a/testsuite/tests/typing-layouts-float32/stubs.c b/testsuite/tests/typing-layouts-float32/stubs.c new file mode 100644 index 00000000000..5a485d90543 --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/stubs.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include + +#include + +CAMLprim float sin_U_U (float u1) { + return sin(u1); +} + +CAMLprim float sin_B_U (value u1) { + return sin(Float32_val (u1)); +} + +CAMLprim value sin_U_B (float u1) { + CAMLparam0(); + CAMLlocal1(result); + result = caml_copy_float32(sin(u1)); + CAMLreturn(result); +} + +CAMLprim value sin_byte (value u1) { + CAMLparam1(u1); + CAMLlocal1(result); + result = caml_copy_float32(sin_U_U (Float32_val (u1))); + CAMLreturn(result); +} + +CAMLprim float sum_7(float x1, value x2b, float x3, value x4b, float x5, + value x6b, float x7) { + float x2 = Float32_val(x2b); + float x4 = Float32_val(x4b); + float x6 = Float32_val(x6b); + return (x1 + x2 + x3 + x4 + x5 + x6 + x7); +} + +CAMLprim value sum_7_byte(value* argv, int argn) { + CAMLparam0(); + float x1 = Float32_val(argv[0]); + float x2 = Float32_val(argv[1]); + float x3 = Float32_val(argv[2]); + float x4 = Float32_val(argv[3]); + float x5 = Float32_val(argv[4]); + float x6 = Float32_val(argv[5]); + float x7 = Float32_val(argv[6]); + CAMLlocal1(result); + result = caml_copy_float32(x1 + x2 + x3 + x4 + x5 + x6 + x7); + CAMLreturn(result); +} diff --git a/testsuite/tests/typing-layouts-float32/unboxed_float32s.ml b/testsuite/tests/typing-layouts-float32/unboxed_float32s.ml new file mode 100644 index 00000000000..d98583cc995 --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/unboxed_float32s.ml @@ -0,0 +1,952 @@ +(* TEST + reference = "${test_source_directory}/unboxed_float32s.reference"; + include stdlib_stable; + flambda2; + { + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* CR layouts v2.6: Layouts should be erasable and we can remove the + only-erasable-extensions stanza above. *) + +(* mshinwell: This test is now only run with flambda2, as the corresponding + ocamltest predicate is reliable for testing whether this is an + flambda-backend build. *) + +(* This file contains various tests for float32#. It's not an expect test to make + sure it gets tested for native code. *) + +(* CR layouts v2.5: When unboxed literals work, change this file to use them + instead of [of_float] on boxed literals everywhere. *) + +(*****************************************) +(* Prelude: Functions on unboxed floats. *) + +module Float32 = struct + include Stdlib_stable.Float32 + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( ** ) = pow + let ( > ) x y = (compare x y) > 0 +end + +module Float32_u = struct + include Stdlib_stable.Float32_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( ** ) = pow + let ( > ) x y = (compare x y) > 0 +end + +(*********************************) +(* Test 1: some basic arithmetic *) + +let print_floatu prefix x = Printf.printf "%s: %.2f\n" prefix (Float32.to_float (Float32_u.to_float32 x)) +let print_float prefix x = Printf.printf "%s: %.2f\n" prefix (Float32.to_float x) +let print_int prefix x = Printf.printf "%s: %d\n" prefix x + +(* Tests all the operators above *) +let test1 () = + (* CR layouts: When float32 defs are allowed at the module level, get rid of + [test1] and move these definitions there. *) + let open Float32_u in + let pi = #3.14s in + print_floatu "Test 1, pi" pi; + + let twice_pi = pi + #3.14s in + print_floatu "Test 1, twice_pi" twice_pi; + + let thrice_pi = #3.0s * pi in + print_floatu "Test 1, thrice_pi" thrice_pi; + + let twice_pi_again = thrice_pi - pi in + print_floatu "Test 1, twice_pi_again" twice_pi; + + let pi_again = twice_pi_again / #2.0s in + print_floatu "Test 1, pi_again" pi_again; + + let twice_pi_to_the_pi = twice_pi ** pi in + print_floatu "Test 1, twice_pi_to_the_pi" twice_pi_to_the_pi; + + let twice_pi_greater_than_pi = twice_pi > pi in + Printf.printf "Test 1, twice_pi_greater_than_pi: %b\n" + twice_pi_greater_than_pi; + + let pi_with_effort = + (#3.14s + twice_pi) * #2.0s / #6.0s in + print_floatu "Test 1, pi_with_effort" pi_with_effort + +let _ = test1 () + +(**********************************) +(* Test 2: higher-order functions *) + +(* CR layouts v1.5: This type definition can be eliminated once we have + annotations. *) +type ('a : float32) t_float32 = 'a + +let[@inline never] twice f (x : 'a t_float32) = f (f x) +let[@inline never] compose f g (x : 'a t_float32) = f (g x) + +let[@inline never] twice_on_pi f = + let pi = #3.14s in + twice f pi + +let times_four = twice Float32_u.(fun x -> x * #2.0s) + +let _ = + let open Float32_u in + print_floatu "Test 2, add pi twice" + (twice (fun x -> x + #3.14s) #0.0s); + print_floatu "Test 2, add pi four times" + (twice (twice (fun x -> x + #3.14s)) #0.0s); + print_floatu "Test 2, increment pi twice" + (twice_on_pi (fun x -> #1.0s + x)); + print_floatu "Test 2, increment pi four times" + (twice_on_pi (twice (fun x -> #1.0s + x))); + print_floatu "Test 2, e times four" + (times_four #2.72s); + print_floatu "Test 2, pi times sixteen" + (twice_on_pi times_four); + print_floatu "Test 2, pi times sixteen again" + (compose times_four times_four #3.14s); + print_floatu "Test 2, pi minus four" + (let two = twice (fun x -> x + #1.0s) #0.0s in + let add_two = Float32_u.(+) two in + let add_two_after = compose add_two in + let minus_four = add_two_after (twice (fun x -> x - #3.0s)) in + minus_four #3.14s) + +(******************************) +(* Test 3: float32# in closures *) + +(* [go]'s closure should haave an [int] (immediate), a [float32#] (float32) and a + [float array] (value). *) +let[@inline never] f3 n m steps () = + let[@inline never] rec go k = + if k = n + then #0.s + else begin + let acc = go (k + 1) in + steps.(k) <- Float32_u.to_float32 acc; + Float32_u.(+) m acc + end + in + go 0 + +(* many args - even args are tuples, odd args are unboxed floats *) +let[@inline_never] f3_manyargs x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 steps () = + let (start_k, end_k) = x0 in + let[@inline never] rec go k = + if k = end_k + then #0.s + else begin + let (x2_1, x2_2) = x2 in + let (x4_1, x4_2) = x4 in + let (x6_1, x6_2) = x6 in + let (x8_1, x8_2) = x8 in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Float32_u.to_float32 acc; + Float32_u.(acc + ((x1 + x3 + x5 + x7 + x9) * (of_float32 (Float32.of_int sum)))) + end + in + go start_k + +let test3 () = + (* Test f3 *) + let steps = Array.init 10 (fun _ -> 0.0s) in + let five_pi = f3 5 #3.14s steps in + print_floatu "Test 3, 5 * pi: " (five_pi ()); + Array.iteri (fun i f -> Printf.printf " Test 3, step %d: %.2f\n" i (Float32.to_float f)) steps; + + (* Test f3_manyargs + + (3.14 + 2.72 + 1.62 + 1.41 + 42.0) = 50.86 + 3 * (3.14 + 2.72 + 1.62 + 1.41 + 42.0) = 152.58 + 6 * (3.14 + 2.72 + 1.62 + 1.41 + 42.0) = 306.16 + 9 * (3.14 + 2.72 + 1.62 + 1.41 + 42.0) = 457.74 + + ( but we expect some floating point error ) + *) + let steps = Array.init 10 (fun _ -> 0.0s) in + let x1 = #3.14s in + let x3 = #2.72s in + let x5 = #1.62s in + let x7 = #1.41s in + let x9 = #42.0s in + + (* these sum to 3 *) + let x2 = (7, 42) in + let x4 = (-23, 109) in + let x6 = (-242, 90) in + let x8 = (-2, 22) in + + let f3_manyargs = f3_manyargs (4,8) x1 x2 x3 x4 x5 x6 x7 x8 x9 steps in + print_floatu "Test 3, 610.68: " (f3_manyargs ()); + Array.iteri (fun i f -> Printf.printf " Test 3, step %d: %.2f\n" i (Float32.to_float f)) steps + +let _ = test3 () + +(*********************************************) +(* Test 4: Partial and indirect applications *) + +let[@inline never] test4 () = + (* Simple indirect call *) + let[@inline never] go f = + Float32_u.to_float32 (f #1.s #2.s) + in + let (x1, x2) = (go Float32_u.(+), go Float32_u.(-)) in + print_floatu "Test 4, 1 + 2" (Float32_u.of_float32 x1); + print_floatu "Test 4, 1 - 2" (Float32_u.of_float32 x2); + + (* partial application to float32# *) + let steps = Array.init 10 (fun _ -> 0.0s) in + let f = Sys.opaque_identity (f3 5 #3.14s) in + let five_pi = f steps in + print_floatu "Test 4, 5 * pi: " (five_pi ()); + Array.iteri (fun i f -> Printf.printf " Test 4, step %d: %.2f\n" i (Float32.to_float f)) steps; + + (* partial application with float32# remaining *) + let steps = Array.init 10 (fun _ -> 0.0s) in + let f = Sys.opaque_identity (f3 6) in + let five_pi = f #3.14s steps in + print_floatu "Test 4, 6 * pi: " (five_pi ()); + Array.iteri (fun i f -> Printf.printf " Test 4, step %d: %.2f\n" i (Float32.to_float f)) steps; + + (* Those two tests again, but making f3 also opaque to prevent expansion of + the partial application. *) + let f3 = Sys.opaque_identity f3 in + + let steps = Array.init 10 (fun _ -> 0.0s) in + let f = Sys.opaque_identity (f3 5 #3.14s) in + let five_pi = f steps in + print_floatu "Test 4, 5 * pi: " (five_pi ()); + Array.iteri (fun i f -> Printf.printf " Test 4, step %d: %.2f\n" i (Float32.to_float f)) steps; + + let steps = Array.init 10 (fun _ -> 0.0s) in + let f = Sys.opaque_identity (f3 6) in + let five_pi = f #3.14s steps in + print_floatu "Test 4, 6 * pi: " (five_pi ()); + Array.iteri (fun i f -> Printf.printf " Test 4, step %d: %.2f\n" i (Float32.to_float f)) steps + +let _ = test4 () + +(****************************) +(* Test 5: Over application *) + +let[@inline never] f5 n m = + let open Float32_u in + (* Also testing a closure with only float32# values *) + let[@inline never] go f = + f (n + m) + in + go + +let test5 () = + let open Float32_u in + let _ : unit = + f5 #3.14s #2.72s + (fun n s m -> print_floatu s (n + m)) "Test 5, pi+e+1" + #1.0s + in + () + +let _ = test5 () + +(*****************************) +(* Test 6: methods on floats *) + +(* CR layouts: add tests that capture floats in objects, once that is + allowed. *) + +(* float32# args and returns *) +let f6_1 () = object + method f6_m1 f1 f2 f3 = + let open Float32_u in + (f1 - f2) / f3 +end + +(* capture a pair, recursion *) +let f6_2 n = object(self) + method f6_m2 n3 m1 f = + if n3 = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) then + m1 + else f (self#f6_m2 (n3+1) m1 f) +end + +(* overapplication to float32# and non-float32# args *) +let f6_3 n k = object + method f6_m3 n3 m1 f = + let n = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) in + f (n + k + n3) m1 +end + +let test6 () = + let add3 n (m, k) = n + m + k in + let open Float32_u in + + (* (3.14 - 2.72) / 2.5 = ~0.17 *) + let o = (Sys.opaque_identity f6_1) () in + print_floatu "Test 6, 0.17" + (o#f6_m1 #3.14s #2.72s #2.5s); + + (* 4.25 * 8 = 34 *) + let o = (Sys.opaque_identity f6_2) (4,7) in + let result = o#f6_m2 8 #4.25s (fun x -> x * #2.s) in + print_floatu "Test 6, 34.00" result; + + (* (1 + 2 + 3 + (-2) + (-12) + 4) * (2.72 + (-1) + 10) = -46.88 *) + let o = (Sys.opaque_identity f6_3) (1,2) 3 in + let result = + o#f6_m3 (-2) (#2.72s) + (fun[@inline never] i m1 m2 n m3 -> + (of_float32 (Float32.of_int (add3 i n))) * (m1 + m2 + m3)) + (-#1.s) (-12,4) (#10.s) + in + print_floatu "Test 6, -46.88" result + +let _ = test6 () + +(*****************************) +(* Test 7: letop with floats *) + +let ( let* ) x f = f Float32_u.(x + #1.5s) + +let _ = + let* x = #42.0s in + print_floatu "Test 7, 36.50" Float32_u.(x - #7.0s) + +let ( let* ) x (f : _ -> float32#) = f x +let ( and* ) x y = Float32_u.(x, to_float32 (y - #1.2s)) +let _ = + let result = + let* x = 42.0s + and* y = #3.3s + and* z = -#10.7s in + Float32_u.of_float32 Float32.(x + y + z) + in + print_floatu "Test 7, 32.20" result + +(********************************) +(* Test 8: basic float32# records *) + +(* Copy of test 3, but the float args are in a record *) +type manyargs = { x1 : float32#; x3 : float32#; x5 : float32#; x7: float32#; x9: float32# } + +(* Get some float32# args by pattern matching and others by projection *) +let[@inline_never] f8 x0 x2 x4 x6 x8 steps ({ x1; x5; _ } as fargs) () = + let (start_k, end_k) = x0 in + let[@inline never] rec go k = + if k = end_k + then #0.s + else begin + let (x2_1, x2_2) = x2 in + let (x4_1, x4_2) = x4 in + let (x6_1, x6_2) = x6 in + let (x8_1, x8_2) = x8 in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Float32_u.to_float32 acc; + Float32_u.(acc + ((x1 + fargs.x3 + x5 + fargs.x7 + fargs.x9) + * (of_float32 (Float32.of_int sum)))) + end + in + go start_k + +let test8 () = + (* same math as f3_manyargs *) + let steps = Array.init 10 (fun _ -> 0.0s) in + let x1 = #3.14s in + let x3 = #2.72s in + let x5 = #1.62s in + let x7 = #1.41s in + let x9 = #42.0s in + + (* these sum to 3 *) + let x2 = (7, 42) in + let x4 = (-23, 109) in + let x6 = (-242, 90) in + let x8 = (-2, 22) in + + let fargs = { x1; x3; x5; x7; x9 } in + + let f8 = f8 (4,8) x2 x4 x6 x8 steps fargs in + print_floatu "Test 8, 610.68: " (f8 ()); + Array.iteri (fun i f -> Printf.printf " Test 8, step %d: %.2f\n" i (Float32.to_float f)) steps + +let _ = test8 () + +(**************************************) +(* Test 9: float32# record manipulation *) + +type t9 = { a : float32#; + mutable b : float32#; + c : float32#; + mutable d : float32# } + +(* Construction *) +let t9_1 = { a = #3.14s; + b = #2.72s; + c = #1.62s; + d = #1.41s } + +let t9_2 = { a = -#3.14s; + b = -#2.72s; + c = -#1.62s; + d = -#1.41s } + +let print_t9 t9 = + print_floatu " a" t9.a; + print_floatu " b" t9.b; + print_floatu " c" t9.c; + print_floatu " d" t9.d + +let _ = + Printf.printf "Test 9, construction:\n"; + print_t9 t9_1; + print_t9 t9_2 + +(* Matching, projection *) +let f9_1 {c; d; _} r = + match r with + | { a; _ } -> + Float32_u. { a = c; + b = a - d; + c = r.c + c; + d = d - r.b } + +let _ = + Printf.printf "Test 9, matching and projection:\n"; + print_t9 (f9_1 t9_1 t9_2) + +(* Record update and mutation *) +let f9_2 ({a; d; _} as r1) r2 = + r1.d <- #42.0s; + let r3 = { r2 with c = r1.d; d = #25.0s } in + r3.b <- Float32_u.(a + d); + r2.b <- #17.0s; + r3 + +let _ = + Printf.printf "Test 9, record update and mutation:\n"; + let t9_3 = f9_2 t9_1 t9_2 in + print_t9 t9_1; + print_t9 t9_2; + print_t9 t9_3 + +(***********************************************) +(* Test 10: float32# records in recursive groups *) + +let rec f r = + r.d <- t10_1.b; + t10_2.b <- #42.0s; + Float32_u.(r.a + t10_2.a) + + +and t10_1 = { a = #1.1s; + b = #2.2s; + c = #3.2s; + d = #4.4s } + +and t10_2 = { a = -#5.1s; + b = -#6.2s; + c = -#7.3s; + d = -#8.4s } + +let _ = + Printf.printf "Test 10, float32# records in recursive groups.\n"; + print_t9 t10_1; + print_t9 t10_2; + let result = f t10_1 in + print_floatu " result (-4.00)" result; + print_t9 t10_1; + print_t9 t10_2 + +(***********************************************) +(* Test 11: Heterogeneous polymorphic equality *) + +(* Not supported for float32 blocks; they are always mixed. *) + +(*************************************************) +(* Test 12: If-then-else with float32 and assert *) + +let _ = + let a = if Sys.opaque_identity true then #1.s else assert false in + Printf.printf "Test 12, If-then-else with assert and float32.\n"; + print_floatu " result (1.00)" a + +(*************************************************) +(* Test 13: basic float32 + float32# records *) + +(* Same as test 13 for floats, but boxed float32s have to be in the prefix. *) + +type mixed_float32_record = + { x2_1 : float32; + x4_1 : float32; + x6_1 : float32; + x8_1 : float32; + x1 : float32#; + x3 : float32#; + x5 : float32#; + x7 : float32#; + x9 : float32# } + +type int_args = + { x0_1 : int; + x0_2 : int; + x2_2 : int; + x4_2 : int; + x6_2 : int; + x8_2 : int; + } + +(* Get some float32# args by pattern matching and others by projection *) +let[@inline_never] f13 steps ({ x1; x8_1; x5; x6_1 } as fargs) + ({ x0_1=start_k; x0_2=end_k; x4_2; x8_2 } as iargs) () = + let[@inline never] rec go k = + if k = end_k + then Float32_u.of_float32 0.s + else begin + let (x2_1, x2_2) = (fargs.x2_1, iargs.x2_2) in + let {x4_1; _}, {x6_2; _} = fargs, iargs in + let sum = + Float32_u.(of_float32 x2_1 + of_int x2_2 + of_float32 x4_1 + of_int x4_2 + + of_float32 x6_1 + of_int x6_2 + of_float32 x8_1 + of_int x8_2) + in + let acc = go (k + 1) in + steps.(k) <- Float32_u.to_float32 acc; + Float32_u.(acc + ((x1 + fargs.x3 + x5 + fargs.x7 + fargs.x9) + * sum)) + end + in + go start_k + +let test13 () = + (* same math as f3_manyargs *) + let steps = Array.init 10 (fun _ -> 0.0s) in + let x1 = Float32_u.of_float32 3.14s in + let x3 = Float32_u.of_float32 2.72s in + let x5 = Float32_u.of_float32 1.62s in + let x7 = Float32_u.of_float32 1.41s in + let x9 = Float32_u.of_float32 42.0s in + + (* these sum to 3.0 *) + let x2_1 = 6.6s in + let x2_2 = 42 in + let x4_1 = -22.9s in + let x4_2 = 109 in + let x6_1 = -241.2s in + let x6_2 = 90 in + let x8_1 = -2.5s in + let x8_2 = 22 in + + let fargs = + { x1; x2_1; x3; x4_1; x5; x6_1; x7; + x8_1; x9; } + in + let iargs = { x0_1 = 4; x0_2 = 8; x2_2; x4_2; x6_2; x8_2 } in + + let f13 = f13 steps fargs iargs in + print_floatu "Test 13, 610.68: " (f13 ()); + Array.iteri (fun i f -> Printf.printf " Test 13, step %d: %.2f\n" i (Float32.to_float f)) steps + +let _ = test13 () + +(*****************************************************) +(* Test 14: (float32# + float32) record manipulation *) + +(* Same as test 14 for floats, but boxed float32s have to be in the prefix. *) + +type t14 = { mutable b : float32; + e : float32; + a : float32#; + c : float32#; + mutable d : float32#; + mutable f : float32# } + +(* Construction *) +let t14_1 = { a = Float32_u.of_float32 3.14s; + b = 13.s; + c = Float32_u.of_float32 7.31s; + d = Float32_u.of_float32 1.41s; + e = 6.s; + f = Float32_u.of_float32 27.1s + } + +let t14_2 = { a = Float32_u.of_float32 (-3.14s); + b = -13.s; + c = Float32_u.of_float32 (-7.31s); + d = Float32_u.of_float32 (-1.41s); + e = -6.s; + f = Float32_u.of_float32 (-27.1s) + } + +let print_t14 t14 = + print_floatu " a" t14.a; + print_float " b" t14.b; + print_floatu " c" t14.c; + print_floatu " d" t14.d; + print_float " e" t14.e; + print_floatu " f" t14.f + +let _ = + Printf.printf "Test 14, construction:\n"; + print_t14 t14_1; + print_t14 t14_2 + +(* Matching, projection *) +let f14_1 {c; d; f; _} r = + match r with + | { a; _ } -> + { a = (Float32_u.of_float32 r.e); + b = Float32_u.(to_float32 (a - d)); + c = Float32_u.(r.c + c); + d = Float32_u.(d - (of_float32 r.b)); + e = Float32_u.(to_float32 (f + (of_float32 r.e))); + f = r.f} + +let _ = + Printf.printf "Test 14, matching and projection:\n"; + print_t14 (f14_1 t14_1 t14_2) + +(* Record update and mutation *) +let f14_2 ({a; d; _} as r1) r2 = + r1.d <- Float32_u.of_float32 42.0s; + let r3 = { r2 with c = r1.d; + d = Float32_u.of_float32 25.0s } + in + r3.b <- Float32_u.(to_float32 (a + d)); + r2.b <- 17.s; + r1.f <- r2.c; + r3 + +let _ = + Printf.printf "Test 14, record update and mutation:\n"; + let t14_3 = f14_2 t14_1 t14_2 in + print_t14 t14_1; + print_t14 t14_2; + print_t14 t14_3 + +(*****************************************************) +(* Test 14.1: (float32# + float32) variant manipulation *) + +(* Same as test 14 for floats, but boxed float32s have to be in the prefix. *) + +type t14_variant = + | Const + | T of { mutable b : float32; + e : float32; + a : float32#; + c : float32#; + mutable d : float32#; + mutable f : float32# } + +(* Construction *) +let t14_1 = T + { a = Float32_u.of_float32 3.14s; + b = 13.s; + c = Float32_u.of_float32 7.31s; + d = Float32_u.of_float32 1.41s; + e = 6.s; + f = Float32_u.of_float32 27.1s + } + +let t14_2 = T + { a = Float32_u.of_float32 (-3.14s); + b = -13.s; + c = Float32_u.of_float32 (-7.31s); + d = Float32_u.of_float32 (-1.41s); + e = -6.s; + f = Float32_u.of_float32 (-27.1s) + } + +let[@warning "-partial-match"] print_t14_variant (T t14) = + print_floatu " a" t14.a; + print_float " b" t14.b; + print_floatu " c" t14.c; + print_floatu " d" t14.d; + print_float " e" t14.e; + print_floatu " f" t14.f + +let _ = + Printf.printf "Test 14.1, construction:\n"; + print_t14_variant t14_1; + print_t14_variant t14_2 + +(* Matching, projection *) +let[@warning "-partial-match"] f14_1 (T {c; d; f; _}) r = + match r with + | T ({ a; _ } as r) -> + T + { a = (Float32_u.of_float32 r.e); + b = Float32_u.(to_float32 (a - d)); + c = Float32_u.(r.c + c); + d = Float32_u.(d - (of_float32 r.b)); + e = Float32_u.(to_float32 (f + (of_float32 r.e))); + f = r.f} + +let _ = + Printf.printf "Test 14.1, matching and projection:\n"; + print_t14_variant (f14_1 t14_1 t14_2) + +(* Record update and mutation *) +let[@warning "-partial-match"] f14_2 (T ({a; d; _} as r1)) (T r2) = + r1.d <- Float32_u.of_float32 42.0s; + let T r3 = T { r2 with c = r1.d; + d = Float32_u.of_float32 25.0s } + in + r3.b <- Float32_u.(to_float32 (a + d)); + r2.b <- 17.s; + r1.f <- r2.c; + T r3 + +let _ = + Printf.printf "Test 14.1, variant update and mutation:\n"; + let t14_3 = f14_2 t14_1 t14_2 in + print_t14_variant t14_1; + print_t14_variant t14_2; + print_t14_variant t14_3 + +(*************************************************************) +(* Test 15: (float32# + float32) records in recursive groups *) + +let rec f r = + r.d <- Float32_u.of_float32 t15_1.b; + t15_2.b <- 42.s; + t15_1.f <- t15_1.a; + Float32_u.(r.a + t15_2.a) + + +and t15_1 = { a = Float32_u.of_float32 1.1s; + b = 2.s; + c = Float32_u.of_float32 3.3s; + d = Float32_u.of_float32 4.4s; + e = 5.s; + f = Float32_u.of_float32 6.6s} + +and t15_2 = { a = Float32_u.of_float32 (- 5.1s); + b = -6.s; + c = Float32_u.of_float32 (-7.3s); + d = Float32_u.of_float32 (-8.4s); + e = -9.s; + f = Float32_u.of_float32 (-10.6s) } + +let _ = + Printf.printf "Test 15, (float32#+float32) records in recursive groups:\n"; + print_t14 t15_1; + print_t14 t15_2; + let result = f t15_1 in + print_floatu " result (-4.00)" result; + print_t14 t15_1; + print_t14 t15_2 + +let dummy = "dummy" + +(*************************************************) +(* Test 16: basic mixed records involving float32# *) + +type mixedargs = { x2_1 : float32; + x4_1 : float32; + x6_1 : float32; + x8_1 : float32; + (* We include the string field to document more plainly that + the preceding section of [float32] fields are boxed. + Without the [str] field, an implementation of mixed blocks + could more conceivably unbox the [float32] fields. + *) + dummy : string; + x0_1 : int; + x0_2 : int; + x1 : float32#; + x2_2 : int; + x3 : float32#; + x4_2 : int; + x5 : float32#; + x6_2 : int; + x7 : float32#; + x8_2 : int; + x9 : float32# } + +(* Get some float32# args by pattern matching and others by projection *) +let[@inline_never] f16 steps ({ x1; x0_1=start_k; x0_2=end_k; x8_1; x8_2; x5; + x6_1; x6_2 } as fargs) () = + let[@inline never] rec go k = + if k = end_k + then Float32_u.of_float32 0.s + else begin + let (x2_1, x2_2) = (fargs.x2_1, fargs.x2_2) in + let {x4_1; x4_2; _} = fargs in + let sum = + Float32_u.(of_float32 x2_1 + of_int x2_2 + of_float32 x4_1 + of_int x4_2 + + of_float32 x6_1 + of_int x6_2 + of_float32 x8_1 + of_int x8_2) + in + let acc = go (k + 1) in + steps.(k) <- Float32_u.to_float32 acc; + Float32_u.(acc + ((x1 + fargs.x3 + x5 + fargs.x7 + fargs.x9) + * sum)) + end + in + go start_k + +let test16 () = + (* same math as f3_manyargs *) + let steps = Array.init 10 (fun _ -> 0.0s) in + let x1 = Float32_u.of_float32 3.14s in + let x3 = Float32_u.of_float32 2.72s in + let x5 = Float32_u.of_float32 1.62s in + let x7 = Float32_u.of_float32 1.41s in + let x9 = Float32_u.of_float32 42.0s in + + (* these sum to 3.0 *) + let x2_1 = 6.6s in + let x2_2 = 42 in + let x4_1 = -22.9s in + let x4_2 = 109 in + let x6_1 = -241.2s in + let x6_2 = 90 in + let x8_1 = -2.5s in + let x8_2 = 22 in + + let fargs = + { x0_1 = 4; x0_2 = 8; x1; x2_1; x2_2; x3; x4_1; x4_2; x5; x6_1; x6_2; x7; + x8_1; x8_2; x9; + dummy } + in + + let f16 = f16 steps fargs in + print_floatu "Test 16, 610.68: " (f16 ()); + Array.iteri (fun i f -> Printf.printf " Test 16, step %d: %.2f\n" i (Float32.to_float f)) steps + +let _ = test16 () + +(*****************************************************) +(* Test 17: mixed record manipulation *) + +type t17 = { a : float32; + dummy : string; + mutable b : int; + c : float32#; + mutable d : float32#; + e : int; + mutable f : float32# } + +(* Construction *) +let t17_1 = { a = 3.17s; + b = 13; + c = Float32_u.of_float32 7.31s; + d = Float32_u.of_float32 1.41s; + e = 6; + f = Float32_u.of_float32 27.1s; + dummy; + } + +let t17_2 = { a = (-3.17s); + b = -13; + c = Float32_u.of_float32 (-7.31s); + d = Float32_u.of_float32 (-1.41s); + e = -6; + f = Float32_u.of_float32 (-27.1s); + dummy; + } + +let print_t17 t17 = + print_float " a" t17.a; + print_int " b" t17.b; + print_floatu " c" t17.c; + print_floatu " d" t17.d; + print_int " e" t17.e; + print_floatu " f" t17.f + +let _ = + Printf.printf "Test 17, construction:\n"; + print_t17 t17_1; + print_t17 t17_2 + +(* Matching, projection *) +let f17_1 {c; d; f; _} r = + match r with + | { a; _ } -> + { a = Float32.of_int r.e; + b = Float32_u.(to_int (of_float32 a - d)); + c = Float32_u.(r.c + c); + d = Float32_u.(d - (of_int r.b)); + e = Float32_u.(to_int (f + (of_int r.e))); + f = r.f; + dummy} + +let _ = + Printf.printf "Test 17, matching and projection:\n"; + print_t17 (f17_1 t17_1 t17_2) + +(* Record update and mutation *) +let f17_2 ({a; d; _} as r1) r2 = + r1.d <- Float32_u.of_float32 42.0s; + let r3 = { r2 with c = r1.d; + d = Float32_u.of_float32 25.0s } + in + r3.b <- Float32_u.(to_int (of_float32 a + d)); + r2.b <- 17; + r1.f <- r2.c; + r3 + +let _ = + Printf.printf "Test 17, record update and mutation:\n"; + let t17_3 = f17_2 t17_1 t17_2 in + print_t17 t17_1; + print_t17 t17_2; + print_t17 t17_3 + +(************************************************************) +(* Test 18: (float32# + immediate) records in recursive groups *) + +let rec f r = + r.d <- Float32_u.of_int t18_1.b; + t18_2.b <- 42; + t18_1.f <- Float32_u.of_float32 t18_1.a; + Float32_u.(of_float32 r.a + of_float32 t18_2.a) + + +and t18_1 = { a = 1.1s; + b = 2; + c = Float32_u.of_float32 3.3s; + d = Float32_u.of_float32 4.4s; + e = 5; + f = Float32_u.of_float32 6.6s; + dummy; + } + +and t18_2 = { a = (- 5.1s); + b = -6; + c = Float32_u.of_float32 (-7.3s); + d = Float32_u.of_float32 (-8.4s); + e = -9; + f = Float32_u.of_float32 (-10.6s); + dummy; + } + +let _ = + Printf.printf "Test 18, (float32#+imm) records in recursive groups:\n"; + print_t17 t18_1; + print_t17 t18_2; + let result = f t18_1 in + print_floatu " result (-4.00)" result; + print_t17 t18_1; + print_t17 t18_2 diff --git a/testsuite/tests/typing-layouts-float32/unboxed_float32s.reference b/testsuite/tests/typing-layouts-float32/unboxed_float32s.reference new file mode 100644 index 00000000000..3bcc33d9309 --- /dev/null +++ b/testsuite/tests/typing-layouts-float32/unboxed_float32s.reference @@ -0,0 +1,339 @@ +Test 1, pi: 3.14 +Test 1, twice_pi: 6.28 +Test 1, thrice_pi: 9.42 +Test 1, twice_pi_again: 6.28 +Test 1, pi_again: 3.14 +Test 1, twice_pi_to_the_pi: 320.33 +Test 1, twice_pi_greater_than_pi: true +Test 1, pi_with_effort: 3.14 +Test 2, add pi twice: 6.28 +Test 2, add pi four times: 12.56 +Test 2, increment pi twice: 5.14 +Test 2, increment pi four times: 7.14 +Test 2, e times four: 10.88 +Test 2, pi times sixteen: 50.24 +Test 2, pi times sixteen again: 50.24 +Test 2, pi minus four: -0.86 +Test 3, 5 * pi: : 15.70 + Test 3, step 0: 12.56 + Test 3, step 1: 9.42 + Test 3, step 2: 6.28 + Test 3, step 3: 3.14 + Test 3, step 4: 0.00 + Test 3, step 5: 0.00 + Test 3, step 6: 0.00 + Test 3, step 7: 0.00 + Test 3, step 8: 0.00 + Test 3, step 9: 0.00 +Test 3, 610.68: : 610.68 + Test 3, step 0: 0.00 + Test 3, step 1: 0.00 + Test 3, step 2: 0.00 + Test 3, step 3: 0.00 + Test 3, step 4: 458.01 + Test 3, step 5: 305.34 + Test 3, step 6: 152.67 + Test 3, step 7: 0.00 + Test 3, step 8: 0.00 + Test 3, step 9: 0.00 +Test 4, 1 + 2: 3.00 +Test 4, 1 - 2: -1.00 +Test 4, 5 * pi: : 15.70 + Test 4, step 0: 12.56 + Test 4, step 1: 9.42 + Test 4, step 2: 6.28 + Test 4, step 3: 3.14 + Test 4, step 4: 0.00 + Test 4, step 5: 0.00 + Test 4, step 6: 0.00 + Test 4, step 7: 0.00 + Test 4, step 8: 0.00 + Test 4, step 9: 0.00 +Test 4, 6 * pi: : 18.84 + Test 4, step 0: 15.70 + Test 4, step 1: 12.56 + Test 4, step 2: 9.42 + Test 4, step 3: 6.28 + Test 4, step 4: 3.14 + Test 4, step 5: 0.00 + Test 4, step 6: 0.00 + Test 4, step 7: 0.00 + Test 4, step 8: 0.00 + Test 4, step 9: 0.00 +Test 4, 5 * pi: : 15.70 + Test 4, step 0: 12.56 + Test 4, step 1: 9.42 + Test 4, step 2: 6.28 + Test 4, step 3: 3.14 + Test 4, step 4: 0.00 + Test 4, step 5: 0.00 + Test 4, step 6: 0.00 + Test 4, step 7: 0.00 + Test 4, step 8: 0.00 + Test 4, step 9: 0.00 +Test 4, 6 * pi: : 18.84 + Test 4, step 0: 15.70 + Test 4, step 1: 12.56 + Test 4, step 2: 9.42 + Test 4, step 3: 6.28 + Test 4, step 4: 3.14 + Test 4, step 5: 0.00 + Test 4, step 6: 0.00 + Test 4, step 7: 0.00 + Test 4, step 8: 0.00 + Test 4, step 9: 0.00 +Test 5, pi+e+1: 6.86 +Test 6, 0.17: 0.17 +Test 6, 34.00: 34.00 +Test 6, -46.88: -46.88 +Test 7, 36.50: 36.50 +Test 7, 32.20: 32.20 +Test 8, 610.68: : 610.68 + Test 8, step 0: 0.00 + Test 8, step 1: 0.00 + Test 8, step 2: 0.00 + Test 8, step 3: 0.00 + Test 8, step 4: 458.01 + Test 8, step 5: 305.34 + Test 8, step 6: 152.67 + Test 8, step 7: 0.00 + Test 8, step 8: 0.00 + Test 8, step 9: 0.00 +Test 9, construction: + a: 3.14 + b: 2.72 + c: 1.62 + d: 1.41 + a: -3.14 + b: -2.72 + c: -1.62 + d: -1.41 +Test 9, matching and projection: + a: 1.62 + b: -4.55 + c: 0.00 + d: 4.13 +Test 9, record update and mutation: + a: 3.14 + b: 2.72 + c: 1.62 + d: 42.00 + a: -3.14 + b: 17.00 + c: -1.62 + d: -1.41 + a: -3.14 + b: 4.55 + c: 42.00 + d: 25.00 +Test 10, float32# records in recursive groups. + a: 1.10 + b: 2.20 + c: 3.20 + d: 4.40 + a: -5.10 + b: -6.20 + c: -7.30 + d: -8.40 + result (-4.00): -4.00 + a: 1.10 + b: 2.20 + c: 3.20 + d: 2.20 + a: -5.10 + b: 42.00 + c: -7.30 + d: -8.40 +Test 12, If-then-else with assert and float32. + result (1.00): 1.00 +Test 13, 610.68: : 610.68 + Test 13, step 0: 0.00 + Test 13, step 1: 0.00 + Test 13, step 2: 0.00 + Test 13, step 3: 0.00 + Test 13, step 4: 458.01 + Test 13, step 5: 305.34 + Test 13, step 6: 152.67 + Test 13, step 7: 0.00 + Test 13, step 8: 0.00 + Test 13, step 9: 0.00 +Test 14, construction: + a: 3.14 + b: 13.00 + c: 7.31 + d: 1.41 + e: 6.00 + f: 27.10 + a: -3.14 + b: -13.00 + c: -7.31 + d: -1.41 + e: -6.00 + f: -27.10 +Test 14, matching and projection: + a: -6.00 + b: -4.55 + c: 0.00 + d: 14.41 + e: 21.10 + f: -27.10 +Test 14, record update and mutation: + a: 3.14 + b: 13.00 + c: 7.31 + d: 42.00 + e: 6.00 + f: -7.31 + a: -3.14 + b: 17.00 + c: -7.31 + d: -1.41 + e: -6.00 + f: -27.10 + a: -3.14 + b: 4.55 + c: 42.00 + d: 25.00 + e: -6.00 + f: -27.10 +Test 14.1, construction: + a: 3.14 + b: 13.00 + c: 7.31 + d: 1.41 + e: 6.00 + f: 27.10 + a: -3.14 + b: -13.00 + c: -7.31 + d: -1.41 + e: -6.00 + f: -27.10 +Test 14.1, matching and projection: + a: -6.00 + b: -4.55 + c: 0.00 + d: 14.41 + e: 21.10 + f: -27.10 +Test 14.1, variant update and mutation: + a: 3.14 + b: 13.00 + c: 7.31 + d: 42.00 + e: 6.00 + f: -7.31 + a: -3.14 + b: 17.00 + c: -7.31 + d: -1.41 + e: -6.00 + f: -27.10 + a: -3.14 + b: 4.55 + c: 42.00 + d: 25.00 + e: -6.00 + f: -27.10 +Test 15, (float32#+float32) records in recursive groups: + a: 1.10 + b: 2.00 + c: 3.30 + d: 4.40 + e: 5.00 + f: 6.60 + a: -5.10 + b: -6.00 + c: -7.30 + d: -8.40 + e: -9.00 + f: -10.60 + result (-4.00): -4.00 + a: 1.10 + b: 2.00 + c: 3.30 + d: 2.00 + e: 5.00 + f: 1.10 + a: -5.10 + b: 42.00 + c: -7.30 + d: -8.40 + e: -9.00 + f: -10.60 +Test 16, 610.68: : 610.68 + Test 16, step 0: 0.00 + Test 16, step 1: 0.00 + Test 16, step 2: 0.00 + Test 16, step 3: 0.00 + Test 16, step 4: 458.01 + Test 16, step 5: 305.34 + Test 16, step 6: 152.67 + Test 16, step 7: 0.00 + Test 16, step 8: 0.00 + Test 16, step 9: 0.00 +Test 17, construction: + a: 3.17 + b: 13 + c: 7.31 + d: 1.41 + e: 6 + f: 27.10 + a: -3.17 + b: -13 + c: -7.31 + d: -1.41 + e: -6 + f: -27.10 +Test 17, matching and projection: + a: -6.00 + b: -4 + c: 0.00 + d: 14.41 + e: 21 + f: -27.10 +Test 17, record update and mutation: + a: 3.17 + b: 13 + c: 7.31 + d: 42.00 + e: 6 + f: -7.31 + a: -3.17 + b: 17 + c: -7.31 + d: -1.41 + e: -6 + f: -27.10 + a: -3.17 + b: 4 + c: 42.00 + d: 25.00 + e: -6 + f: -27.10 +Test 18, (float32#+imm) records in recursive groups: + a: 1.10 + b: 2 + c: 3.30 + d: 4.40 + e: 5 + f: 6.60 + a: -5.10 + b: -6 + c: -7.30 + d: -8.40 + e: -9 + f: -10.60 + result (-4.00): -4.00 + a: 1.10 + b: 2 + c: 3.30 + d: 2.00 + e: 5 + f: 1.10 + a: -5.10 + b: 42 + c: -7.30 + d: -8.40 + e: -9 + f: -10.60 diff --git a/testsuite/tests/typing-layouts-float64/alloc.ml b/testsuite/tests/typing-layouts-float64/alloc.ml index a97e2e29b23..dab72f2e5a6 100644 --- a/testsuite/tests/typing-layouts-float64/alloc.ml +++ b/testsuite/tests/typing-layouts-float64/alloc.ml @@ -1,13 +1,18 @@ (* TEST - flags = "-extension layouts_beta" - * native + include stdlib_upstream_compatible; + flambda2; + native; *) +(* mshinwell: This test is now only run with flambda2, as the corresponding + ocamltest predicate is reliable for testing whether this is an + flambda-backend build. *) + (* A test comparing allocations with unboxed floats to allocations with boxed floats. *) module Float_u = struct - include Stdlib__Float_u + include Stdlib_upstream_compatible.Float_u let ( + ) = add let ( - ) = sub @@ -61,17 +66,17 @@ struct let[@inline never] step n estimate = let new_term = - ((of_float (-1.)) ** n) - / ((n * (of_float 2.)) + (of_float 1.)) + ((-#1.) ** n) + / ((n * #2.) + #1.) in estimate + new_term let rec go n est = - if n > (of_float 10000.) then est else go (n+ (of_float 1.)) (step n est) + if n > #10000. then est else go (n+ #1.) (step n est) let estimate () = let est = - measure_alloc (fun () -> go (of_float 0.) (of_float 0.)) + measure_alloc (fun () -> go #0. #0.) in Printf.printf "Unboxed:\n estimate: %f\n allocations: %s\n" ((to_float est) *. 4.) (get_allocations ()) @@ -118,9 +123,9 @@ let print_record_and_allocs s r = (* Building a record should only allocate the box *) let[@inline never] build x = { a = x; - b = Float_u.of_float 42.0; + b = #42.0; c = consumer x x; - d = consumer x (Float_u.of_float 1.0) } + d = consumer x #1.0 } let[@inline never] project_a r = r.a let[@inline never] update_d r x = r.d <- x @@ -131,11 +136,11 @@ let[@inline never] manipulate ({c; _} as r) = match r with | { b; _ } -> update_d r (consumer b (project_a r)); - r.b <- Float_u.sub c (Float_u.of_float 21.1); + r.b <- Float_u.sub c #21.1; r.a let _ = - let r = measure_alloc_value (fun () -> build (Float_u.of_float 3.14)) in + let r = measure_alloc_value (fun () -> build #3.14) in print_record_and_allocs "Construction (40 bytes for record)" r; let _ = measure_alloc (fun () -> manipulate r) in print_record_and_allocs "Manipulation (0 bytes)" r @@ -158,7 +163,22 @@ let[@inline never] cse_test b r = (0., 0.) let _ = - let r = build (Float_u.of_float 3.14) in + let r = build #3.14 in let _ = measure_alloc_value (fun () -> cse_test false r) in let allocs = get_exact_allocations () in Printf.printf "CSE test (0 bytes):\n allocated bytes: %.2f\n" allocs + +let[@inline never] literal_test x y = + let open Float_u in + (#1. + x) * (y - #4.) / (#3. ** #1.) + +let print_allocs s = + let allocs = get_exact_allocations () in + Printf.printf + "%s:\n allocated bytes: %.2f\n" + s allocs + +let _ = + let r = measure_alloc (fun () -> literal_test #2. #3.) in + assert (Float_u.equal r (-#1.)); + print_allocs "Float literals"; diff --git a/testsuite/tests/typing-layouts-float64/alloc.reference b/testsuite/tests/typing-layouts-float64/alloc.reference index 8cd7f847e22..23a3a02bf88 100644 --- a/testsuite/tests/typing-layouts-float64/alloc.reference +++ b/testsuite/tests/typing-layouts-float64/alloc.reference @@ -18,3 +18,5 @@ Manipulation (0 bytes): d: 45.14 CSE test (0 bytes): allocated bytes: 0.00 +Float literals: + allocated bytes: 0.00 diff --git a/testsuite/tests/typing-layouts-float64/basics.ml b/testsuite/tests/typing-layouts-float64/basics.ml index cf67ffef1a6..d6a72051d6b 100644 --- a/testsuite/tests/typing-layouts-float64/basics.ml +++ b/testsuite/tests/typing-layouts-float64/basics.ml @@ -1,6 +1,9 @@ (* TEST - flags = "-extension layouts" - * expect + flambda2; + include stdlib_upstream_compatible; + { + expect; + } *) (* This file contains typing tests for the layout [float64]. @@ -10,30 +13,887 @@ convenient example of a concrete [float64] type in some tests, but its behavior isn't the primary purpose of this test. *) -(* CR layouts: Bring tests here from [basics_alpha.ml] once we have float64 by - default *) +type t_float64 : float64 +type ('a : float64) t_float64_id = 'a -type t_float64 [@@float64] -type ('a : float64) t_float64_id = 'a;; +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_float64) = x;; +let f1_2 (x : 'a t_float64_id) = x;; +let f1_3 (x : float#) = x;; +[%%expect{| +type t_float64 : float64 +type ('a : float64) t_float64_id = 'a +val f1_1 : t_float64 -> t_float64 = +val f1_2 : ('a : float64). 'a t_float64_id -> 'a t_float64_id = +val f1_3 : float# -> float# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_float64) = + let y = x in + y;; + +let f2_2 (x : 'a t_float64_id) = + let y = x in + y;; + +let f2_3 (x : float#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_float64 -> t_float64 = +val f2_2 : ('a : float64). 'a t_float64_id -> 'a t_float64_id = +val f2_3 : float# -> float# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_float64 = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_float64 = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout float64. +|}];; + +let x3_2 : 'a t_float64_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_float64_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout float64. +|}];; + +let x3_3 : float# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : float# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout float64. +|}];; + +module M3_4 = struct + let x : t_float64 = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_float64 = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout float64. +|}];; + +module M3_5 = struct + let f (x : float#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout float64. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_float64) = x, false;; +[%%expect{| +Line 1, characters 27-28: +1 | let f4_1 (x : t_float64) = x, false;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_float64_id) = x, false;; +[%%expect{| +Line 1, characters 33-34: +1 | let f4_2 (x : 'a t_float64_id) = x, false;; + ^ +Error: This expression has type 'a t_float64_id = ('a : float64) + but an expression was expected of type ('b : value) + The layout of 'a t_float64_id is float64 + because of the definition of t_float64_id at line 2, characters 0-37. + But the layout of 'a t_float64_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : float#) = x, false;; +[%%expect{| +Line 1, characters 24-25: +1 | let f4_3 (x : float#) = x, false;; + ^ +Error: This expression has type float# but an expression was expected of type + ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_float64 * string;; +[%%expect{| +Line 1, characters 12-21: +1 | type t4_4 = t_float64 * string;; + ^^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * float#;; +[%%expect{| +Line 1, characters 18-24: +1 | type t4_5 = int * float#;; + ^^^^^^ +Error: Tuple element types must have layout value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : float64) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 27-29: +1 | type ('a : float64) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : float64) + The layout of 'a is float64 + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : float64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 32-34: +1 | type ('a : float64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : float64) + The layout of 'a is float64 + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(*****************************************) +(* Test 5: Can be put in some structures *) + +(* all-float64 records are allowed, as are some records that mix float64 and + value fields. See [tests/typing-layouts/mixed_records.ml] for tests of mixed + records. +*) +type t5_1 = { x : t_float64 };; +[%%expect{| +type t5_1 = { x : t_float64; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_float64 } [@@unboxed];; +[%%expect{| +Line 1, characters 14-27: +1 | type t5_3 = { x : t_float64 } [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_float64 has layout float64. + Unboxed records may not yet contain types of this layout. +|}];; + +(* all-float64 constructor args are also allowed, as are some constructors that + mix float64 and value fields. See + [tests/typing-layouts/mixed_constructor_args.ml] for tests of mixed + constructor args. *) +type t5_4 = A of t_float64;; +[%%expect{| +type t5_4 = A of t_float64 +|}];; + +type t5_5 = A of int * t_float64;; +[%%expect{| +type t5_5 = A of int * t_float64 +|}];; + +type t5_6 = A of t_float64 [@@unboxed];; +[%%expect{| +Line 1, characters 12-26: +1 | type t5_6 = A of t_float64 [@@unboxed];; + ^^^^^^^^^^^^^^ +Error: Type t_float64 has layout float64. + Unboxed variants may not yet contain types of this layout. +|}];; + +type t5_6_1 = A of { x : t_float64 } [@@unboxed];; +[%%expect{| +Line 1, characters 21-34: +1 | type t5_6_1 = A of { x : t_float64 } [@@unboxed];; + ^^^^^^^^^^^^^ +Error: Type t_float64 has layout float64. + Unboxed inlined records may not yet contain types of this layout. +|}];; + +type ('a : float64) t5_7 = A of int +type ('a : float64) t5_8 = A of 'a;; +[%%expect{| +type ('a : float64) t5_7 = A of int +type ('a : float64) t5_8 = A of 'a +|}] + +type ('a : float64, 'b : float64) t5_9 = {x : 'a; y : 'b; z : 'a} + +type 'a t5_10 = 'a t_float64_id +and 'a t5_11 = {x : 'a t5_10; y : 'a} +[%%expect{| +type ('a : float64, 'b : float64) t5_9 = { x : 'a; y : 'b; z : 'a; } +Line 4, characters 20-28: +4 | and 'a t5_11 = {x : 'a t5_10; y : 'a} + ^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The layout of 'a is float64 + because of the definition of t_float64_id at line 2, characters 0-37. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t5_11, + defaulted to layout value. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}];; + +type ('a : float64) t5_12 = {x : 'a; y : float#};; +[%%expect{| +type ('a : float64) t5_12 = { x : 'a; y : float#; } +|}];; + +type ('a : float64) t5_13 = {x : 'a; y : float#};; +[%%expect{| +type ('a : float64) t5_13 = { x : 'a; y : float#; } +|}];; + +type 'a t5_14 = {x : 'a; y : float#};; +[%%expect{| +type 'a t5_14 = { x : 'a; y : float#; } +|}];; + +type ufref = { mutable contents : float# };; +[%%expect{| +type ufref = { mutable contents : float#; } +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_float64 end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-40: +1 | module type S6_1 = sig val x : t_float64 end + ^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of type t_float64 must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_float64_id end +[%%expect{| +Line 1, characters 31-46: +1 | module type S6_2 = sig val x : 'a t_float64_id end + ^^^^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_float64_id is float64 + because of the definition of t_float64_id at line 2, characters 0-37. + But the layout of type 'a t_float64_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : float# end +[%%expect{| +Line 1, characters 31-37: +1 | module type S6_3 = sig val x : float# end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type float# is float64 + because it is the primitive float64 type float#. + But the layout of type float# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_float64) = `A x;; +[%%expect{| +Line 1, characters 30-31: +1 | let f7_1 (x : t_float64) = `A x;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_float64_id) = `A x;; +[%%expect{| +Line 1, characters 36-37: +1 | let f7_2 (x : 'a t_float64_id) = `A x;; + ^ +Error: This expression has type 'a t_float64_id = ('a : float64) + but an expression was expected of type ('b : value) + The layout of 'a t_float64_id is float64 + because of the definition of t_float64_id at line 2, characters 0-37. + But the layout of 'a t_float64_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : float#) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f7_3 (x : float#) = `A x;; + ^ +Error: This expression has type float# but an expression was expected of type + ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_float64 ];; +[%%expect{| +Line 1, characters 20-29: +1 | type f7_4 = [ `A of t_float64 ];; + ^^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : float64) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 35-37: +1 | type ('a : float64) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : float64) + The layout of 'a is float64 + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_float64 () : t_float64 = assert false +let make_t_float64_id () : 'a t_float64_id = assert false +let make_floatu () : float# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_float64 : unit -> t_float64 = +val make_t_float64_id : ('a : float64). unit -> 'a t_float64_id = +val make_floatu : unit -> float# = +val id_value : 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_float64 ());; +[%%expect{| +Line 1, characters 20-39: +1 | let x8_1 = id_value (make_t_float64 ());; + ^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_float64_id ());; +[%%expect{| +Line 1, characters 20-42: +1 | let x8_2 = id_value (make_t_float64_id ());; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_float64_id = ('a : float64) + but an expression was expected of type ('b : value) + The layout of 'a t_float64_id is float64 + because of the definition of make_t_float64_id at line 2, characters 22-57. + But the layout of 'a t_float64_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_floatu ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_3 = id_value (make_floatu ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type float# but an expression was expected of type + ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But float64 functions do. *) + +let twice f (x : 'a t_float64_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_float64 ()) +let f9_2 () = twice f1_2 (make_t_float64_id ()) +let f9_3 () = twice f1_3 (make_floatu ());; +[%%expect{| +val twice : + ('a : float64). + ('a t_float64_id -> 'a t_float64_id) -> + 'a t_float64_id -> 'a t_float64_id = + +val f9_1 : unit -> t_float64 t_float64_id = +val f9_2 : ('a : float64). unit -> 'a t_float64_id = +val f9_3 : unit -> float# t_float64_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of float64 and externals *) + +(* Valid uses of float64 in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - if using a non-value layout in an external, you may not use the old-style + unboxed float directive, and + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> float# = "foo";; +[%%expect{| +Line 1, characters 0-46: +1 | external f10_1 : int -> bool -> float# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_float64 -> int = "foo";; +[%%expect{| +Line 1, characters 0-41: +1 | external f10_2 : t_float64 -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_3 : float -> t_float64 = "foo" "bar" "float";; +[%%expect{| +Line 1, characters 0-58: +1 | external f10_3 : float -> t_float64 = "foo" "bar" "float";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Cannot use "float" in conjunction with types of non-value layouts. +|}];; + +external f10_4 : int -> float# -> float = "foo" "bar" "float";; +[%%expect{| +Line 1, characters 0-62: +1 | external f10_4 : int -> float# -> float = "foo" "bar" "float";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Cannot use "float" in conjunction with types of non-value layouts. +|}];; + +external f10_5 : float# -> bool -> string = "foo" "bar" "float";; +[%%expect{| +Line 1, characters 0-64: +1 | external f10_5 : float# -> bool -> string = "foo" "bar" "float";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Cannot use "float" in conjunction with types of non-value layouts. +|}];; + +external f10_6 : (float#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : float# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (float#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> float# = "foo" "bar" +|}];; + +external f10_8 : float -> float# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (float [@unboxed]) -> float# = "foo" "bar" +|}];; + +external f10_9 : (float#[@untagged]) -> bool -> string = "foo" "bar";; [%%expect{| -Line 1, characters 15-26: -1 | type t_float64 [@@float64] - ^^^^^^^^^^^ -Error: Layout float64 is used here, but the appropriate layouts extension is not enabled +Line 1, characters 18-24: +1 | external f10_9 : (float#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (float#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-35: +1 | external f10_10 : string -> (float#[@untagged]) = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(**************************************************) +(* Test 11: float64 banned in extensible variants *) + +(* CR layouts v5.9: Allow mixed extensible variant blocks. *) + +type t11_1 = .. + +type t11_1 += A of t_float64;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-28: +3 | type t11_1 += A of t_float64;; + ^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of float#;; +[%%expect{| +Line 1, characters 14-25: +1 | type t11_1 += B of float#;; + ^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. |}] -(* CR layouts: The below test checks that we give an acceptable error for cases - where a float64 was used from a library in a file where the user forgot to - enable the relevant extension. It can be deleted when float64 is on by - default (though at that time we should add tests for explicitly disabling the - layouts extension). *) -let f x = Stdlib__Float_u.sin x +type ('a : float64) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : float64) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +(* Some extensible variants aren't supported, though. *) + +type t11_1 += C of t_float64 * string;; + +[%%expect{| +Line 1, characters 14-37: +1 | type t11_1 += C of t_float64 * string;; + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_float64, but found boxed argument, string. +|}] + +(***************************************) +(* Test 12: float64 in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_float64 >;; +[%%expect{| +Line 1, characters 15-28: +1 | type t12_1 = < x : t_float64 >;; + ^^^^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : float64) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 34-36: +1 | type ('a : float64) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : float64) + The layout of 'a is float64 + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_float64 = assert false end;; +[%%expect{| +Line 1, characters 21-56: +1 | class c12_3 = object method x : t_float64 = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_float64 but is expected to have type + ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_float64_id -> 'a t_float64_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_float64_id -> 'a t_float64_id = assert false + ^^ +Error: This type ('a : float64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with float64 + because of the definition of t_float64_id at line 2, characters 0-37. +|}];; + +class c12_5 = object val x : t_float64 = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_float64 = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : float# end;; +[%%expect{| +Line 1, characters 26-43: +1 | class type c12_6 = object method x : float# end;; + ^^^^^^^^^^^^^^^^^ +Error: The method x has type float# but is expected to have type ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : float# end +[%%expect{| +Line 1, characters 26-40: +1 | class type c12_7 = object val x : float# end + ^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is float64 + because it is the primitive float64 type float#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_float64_id -> 'a t_float64_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_float64_id -> 'a t_float64_id + ^^ +Error: This type ('a : float64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with float64 + because of the definition of t_float64_id at line 2, characters 0-37. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_float64 -> t_float64 > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_float64) : t_float64 = o#baz y y y;; +class ['a] c12_11 = object + method x : t_float64 -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_float64 = assert false +end;; +[%%expect{| +type t12_8 = < f : t_float64 -> t_float64 > +val f12_9 : t12_8 -> t_float64 -> t_float64 = +val f12_10 : + < baz : t_float64 -> t_float64 -> t_float64 -> t_float64; .. > -> + t_float64 -> t_float64 = +class ['a] c12_11 : object method x : t_float64 -> 'a end +class ['a] c12_12 : object method x : 'a -> t_float64 end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_float64 + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_float64) (m2 : t_float64) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on float64 yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_float64) = x = x;; +[%%expect{| +Line 1, characters 28-29: +1 | let f13_1 (x : t_float64) = x = x;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_float64) = compare x x;; +[%%expect{| +Line 1, characters 36-37: +1 | let f13_2 (x : t_float64) = compare x x;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_float64) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 45-46: +1 | let f13_3 (x : t_float64) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_float64) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 41-42: +1 | let f13_4 (x : t_float64) = Hashtbl.hash x;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 1, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +(***********************************************************) +(* Test 14: unboxed float records work like normal records *) + +module FU = Stdlib_upstream_compatible.Float_u + +type t14_1 = { x : float#; y : float# } + +(* pattern matching *) +let f14_1 {x;y} = FU.sub x y + +(* construction *) +let r14 = { x = #3.14; y = #2.72 } + +let sum14_1 = FU.to_float (f14_1 r14) + +(* projection *) +let f14_2 ({y;_} as r) = FU.sub r.x y + +let sum14_2 = FU.to_float (f14_1 r14) + +type t14_2 = { mutable a : float#; b : float#; mutable c : float# } + +let f14_3 ({b; c; _} as r) = + (* pure record update *) + let r' = { r with b = #20.0; c = r.a } in + (* mutation *) + r.a <- FU.sub r.a r'.b; + r'.a <- #42.0; + r' + +let a, b, c, a', b', c' = + let r = {a = #3.1; b = -#0.42; c = #27.7 } in + let r' = f14_3 r in + FU.to_float r.a, + FU.to_float r.b, + FU.to_float r.c, + FU.to_float r'.a, + FU.to_float r'.b, + FU.to_float r'.c + +let f14_4 r = + let {x; y} = r in + FU.add x y + + [%%expect{| -Line 1, characters 6-31: -1 | let f x = Stdlib__Float_u.sin x - ^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Non-value layout float64 detected as sort for type float#, - but this requires extension layouts_beta, which is not enabled. - If you intended to use this layout, please add this flag to your build file. - Otherwise, please report this error to the Jane Street compilers team. +module FU = Stdlib_upstream_compatible.Float_u +type t14_1 = { x : float#; y : float#; } +val f14_1 : t14_1 -> FU.t = +val r14 : t14_1 = {x = ; y = } +val sum14_1 : float = 0.419999999999999929 +val f14_2 : t14_1 -> FU.t = +val sum14_2 : float = 0.419999999999999929 +type t14_2 = { mutable a : float#; b : float#; mutable c : float#; } +val f14_3 : t14_2 -> t14_2 = +val a : float = -16.9 +val b : float = -0.42 +val c : float = 27.7 +val a' : float = 42. +val b' : float = 20. +val c' : float = 3.1 +val f14_4 : t14_1 -> FU.t = |}] diff --git a/testsuite/tests/typing-layouts-float64/basics_alpha_beta.ml b/testsuite/tests/typing-layouts-float64/basics_alpha_beta.ml deleted file mode 100644 index e03ba379473..00000000000 --- a/testsuite/tests/typing-layouts-float64/basics_alpha_beta.ml +++ /dev/null @@ -1,790 +0,0 @@ -(* TEST - * expect - flags = "-extension layouts_alpha" - * expect - flags = "-extension layouts_beta" -*) - -(* This file contains typing tests for the layout [float64]. - - Runtime tests for the type [float#] can be found in the [unboxed_float] and - [alloc] tests in this directory. The type [float#] here is used as a - convenient example of a concrete [float64] type in some tests, but its - behavior isn't the primary purpose of this test. *) - -type t_float64 [@@float64] -type ('a : float64) t_float64_id = 'a - -(*********************************) -(* Test 1: The identity function *) - -let f1_1 (x : t_float64) = x;; -let f1_2 (x : 'a t_float64_id) = x;; -let f1_3 (x : float#) = x;; -[%%expect{| -type t_float64 : float64 -type ('a : float64) t_float64_id = 'a -val f1_1 : t_float64 -> t_float64 = -val f1_2 : ('a : float64). 'a t_float64_id -> 'a t_float64_id = -val f1_3 : float# -> float# = -|}];; - -(*****************************************) -(* Test 2: You can let-bind them locally *) -let f2_1 (x : t_float64) = - let y = x in - y;; - -let f2_2 (x : 'a t_float64_id) = - let y = x in - y;; - -let f2_3 (x : float#) = - let y = x in - y;; -[%%expect{| -val f2_1 : t_float64 -> t_float64 = -val f2_2 : ('a : float64). 'a t_float64_id -> 'a t_float64_id = -val f2_3 : float# -> float# = -|}];; - -(*****************************************) -(* Test 3: No module-level bindings yet. *) - -let x3_1 : t_float64 = assert false;; -[%%expect{| -Line 1, characters 4-8: -1 | let x3_1 : t_float64 = assert false;; - ^^^^ -Error: Top-level module bindings must have layout value, but x3_1 has layout - float64. -|}];; - -let x3_2 : 'a t_float64_id = assert false;; -[%%expect{| -Line 1, characters 4-8: -1 | let x3_2 : 'a t_float64_id = assert false;; - ^^^^ -Error: Top-level module bindings must have layout value, but x3_2 has layout - float64. -|}];; - -let x3_3 : float# = assert false;; -[%%expect{| -Line 1, characters 4-8: -1 | let x3_3 : float# = assert false;; - ^^^^ -Error: Top-level module bindings must have layout value, but x3_3 has layout - float64. -|}];; - -module M3_4 = struct - let x : t_float64 = assert false -end -[%%expect{| -Line 2, characters 6-7: -2 | let x : t_float64 = assert false - ^ -Error: Top-level module bindings must have layout value, but x has layout - float64. -|}];; - -module M3_5 = struct - let f (x : float#) = x - - let y = f (assert false) -end -[%%expect{| -Line 4, characters 6-7: -4 | let y = f (assert false) - ^ -Error: Top-level module bindings must have layout value, but y has layout - float64. -|}];; - -(*************************************) -(* Test 4: No putting them in tuples *) - -let f4_1 (x : t_float64) = x, false;; -[%%expect{| -Line 1, characters 27-28: -1 | let f4_1 (x : t_float64) = x, false;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let f4_2 (x : 'a t_float64_id) = x, false;; -[%%expect{| -Line 1, characters 33-34: -1 | let f4_2 (x : 'a t_float64_id) = x, false;; - ^ -Error: This expression has type 'a t_float64_id = ('a : float64) - but an expression was expected of type ('b : value) - 'a t_float64_id has layout float64, which does not overlap with value. -|}];; - -let f4_3 (x : float#) = x, false;; -[%%expect{| -Line 1, characters 24-25: -1 | let f4_3 (x : float#) = x, false;; - ^ -Error: This expression has type float# but an expression was expected of type - ('a : value) - float# has layout float64, which is not a sublayout of value. -|}];; - -type t4_4 = t_float64 * string;; -[%%expect{| -Line 1, characters 12-21: -1 | type t4_4 = t_float64 * string;; - ^^^^^^^^^ -Error: Tuple element types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -type t4_5 = int * float#;; -[%%expect{| -Line 1, characters 18-24: -1 | type t4_5 = int * float#;; - ^^^^^^ -Error: Tuple element types must have layout value. - float# has layout float64, which is not a sublayout of value. -|}];; - -type ('a : float64) t4_6 = 'a * 'a -[%%expect{| -Line 1, characters 27-29: -1 | type ('a : float64) t4_6 = 'a * 'a - ^^ -Error: This type ('a : value) should be an instance of type ('a0 : float64) - 'a has layout float64, which does not overlap with value. -|}];; - -(* check for layout propagation *) -type ('a : float64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; -[%%expect{| -Line 1, characters 32-34: -1 | type ('a : float64, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; - ^^ -Error: This type ('b : value) should be an instance of type ('a : float64) - 'a has layout float64, which does not overlap with value. -|}] - -(******************************************************************************) -(* Test 5: Can't be put in structures in typedecls, except all-float records. *) - -type t5_1 = { x : t_float64 };; -[%%expect{| -type t5_1 = { x : t_float64; } -|}];; - -(* CR layouts v5: this should work *) -type t5_2 = { y : int; x : t_float64 };; -[%%expect{| -Line 1, characters 0-38: -1 | type t5_2 = { y : int; x : t_float64 };; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Records may not contain both unboxed floats and normal values. -|}];; - -(* CR layouts: this runs afoul of the mixed block restriction, but should work - once we relax that. *) -type t5_2' = { y : string; x : t_float64 };; -[%%expect{| -Line 1, characters 0-42: -1 | type t5_2' = { y : string; x : t_float64 };; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Records may not contain both unboxed floats and normal values. -|}];; - -(* CR layouts 2.5: allow this *) -type t5_3 = { x : t_float64 } [@@unboxed];; -[%%expect{| -Line 1, characters 14-27: -1 | type t5_3 = { x : t_float64 } [@@unboxed];; - ^^^^^^^^^^^^^ -Error: Type t_float64 has layout float64. - Unboxed records may not yet contain types of this layout. -|}];; - -type t5_4 = A of t_float64;; -[%%expect{| -Line 1, characters 12-26: -1 | type t5_4 = A of t_float64;; - ^^^^^^^^^^^^^^ -Error: Type t_float64 has layout float64. - Variants may not yet contain types of this layout. -|}];; - -type t5_5 = A of int * t_float64;; -[%%expect{| -Line 1, characters 12-32: -1 | type t5_5 = A of int * t_float64;; - ^^^^^^^^^^^^^^^^^^^^ -Error: Type t_float64 has layout float64. - Variants may not yet contain types of this layout. -|}];; - -type t5_6 = A of t_float64 [@@unboxed];; -[%%expect{| -Line 1, characters 12-26: -1 | type t5_6 = A of t_float64 [@@unboxed];; - ^^^^^^^^^^^^^^ -Error: Type t_float64 has layout float64. - Variants may not yet contain types of this layout. -|}];; - -type ('a : float64) t5_7 = A of int -type ('a : float64) t5_8 = A of 'a;; -[%%expect{| -type ('a : float64) t5_7 = A of int -Line 2, characters 27-34: -2 | type ('a : float64) t5_8 = A of 'a;; - ^^^^^^^ -Error: Type 'a has layout float64. - Variants may not yet contain types of this layout. -|}] - -type ('a : float64, 'b : float64) t5_9 = {x : 'a; y : 'b; z : 'a} - -type 'a t5_10 = 'a t_float64_id -and 'a t5_11 = {x : 'a t5_10; y : 'a} - -type ('a : float64) t5_12 = {x : 'a; y : float#};; -[%%expect{| -type ('a : float64, 'b : float64) t5_9 = { x : 'a; y : 'b; z : 'a; } -type ('a : float64) t5_10 = 'a t_float64_id -and ('a : float64) t5_11 = { x : 'a t5_10; y : 'a; } -type ('a : float64) t5_12 = { x : 'a; y : float#; } -|}];; - -type ('a : float64) t5_13 = {x : 'a; y : float#};; -[%%expect{| -type ('a : float64) t5_13 = { x : 'a; y : float#; } -|}];; - -type 'a t5_14 = {x : 'a; y : float#};; -[%%expect{| -Line 1, characters 0-36: -1 | type 'a t5_14 = {x : 'a; y : float#};; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Records may not contain both unboxed floats and normal values. -|}];; - -type ufref = { mutable contents : float# };; -[%%expect{| -type ufref = { mutable contents : float#; } -|}];; - -(****************************************************) -(* Test 6: Can't be put at top level of signatures. *) -module type S6_1 = sig val x : t_float64 end - -let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; -[%%expect{| -Line 1, characters 31-40: -1 | module type S6_1 = sig val x : t_float64 end - ^^^^^^^^^ -Error: This type signature for x is not a value type. - x has layout float64, which is not a sublayout of value. -|}];; - -module type S6_2 = sig val x : 'a t_float64_id end -[%%expect{| -Line 1, characters 31-46: -1 | module type S6_2 = sig val x : 'a t_float64_id end - ^^^^^^^^^^^^^^^ -Error: This type signature for x is not a value type. - x has layout float64, which does not overlap with value. -|}];; - -module type S6_3 = sig val x : float# end -[%%expect{| -Line 1, characters 31-37: -1 | module type S6_3 = sig val x : float# end - ^^^^^^ -Error: This type signature for x is not a value type. - x has layout float64, which is not a sublayout of value. -|}];; - - -(*********************************************************) -(* Test 7: Can't be used as polymorphic variant argument *) -let f7_1 (x : t_float64) = `A x;; -[%%expect{| -Line 1, characters 30-31: -1 | let f7_1 (x : t_float64) = `A x;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let f7_2 (x : 'a t_float64_id) = `A x;; -[%%expect{| -Line 1, characters 36-37: -1 | let f7_2 (x : 'a t_float64_id) = `A x;; - ^ -Error: This expression has type 'a t_float64_id = ('a : float64) - but an expression was expected of type ('b : value) - 'a t_float64_id has layout float64, which does not overlap with value. -|}];; - -let f7_3 (x : float#) = `A x;; -[%%expect{| -Line 1, characters 27-28: -1 | let f7_3 (x : float#) = `A x;; - ^ -Error: This expression has type float# but an expression was expected of type - ('a : value) - float# has layout float64, which is not a sublayout of value. -|}];; - -type f7_4 = [ `A of t_float64 ];; -[%%expect{| -Line 1, characters 20-29: -1 | type f7_4 = [ `A of t_float64 ];; - ^^^^^^^^^ -Error: Polymorphic variant constructor argument types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -type ('a : float64) f7_5 = [ `A of 'a ];; -[%%expect{| -Line 1, characters 35-37: -1 | type ('a : float64) f7_5 = [ `A of 'a ];; - ^^ -Error: This type ('a : value) should be an instance of type ('a0 : float64) - 'a has layout float64, which does not overlap with value. -|}];; -(* CR layouts v2.9: This error could be improved *) - -(************************************************************) -(* Test 8: Normal polymorphic functions don't work on them. *) - -let make_t_float64 () : t_float64 = assert false -let make_t_float64_id () : 'a t_float64_id = assert false -let make_floatu () : float# = assert false - -let id_value x = x;; -[%%expect{| -val make_t_float64 : unit -> t_float64 = -val make_t_float64_id : ('a : float64). unit -> 'a t_float64_id = -val make_floatu : unit -> float# = -val id_value : 'a -> 'a = -|}];; - -let x8_1 = id_value (make_t_float64 ());; -[%%expect{| -Line 1, characters 20-39: -1 | let x8_1 = id_value (make_t_float64 ());; - ^^^^^^^^^^^^^^^^^^^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x8_2 = id_value (make_t_float64_id ());; -[%%expect{| -Line 1, characters 20-42: -1 | let x8_2 = id_value (make_t_float64_id ());; - ^^^^^^^^^^^^^^^^^^^^^^ -Error: This expression has type 'a t_float64_id = ('a : float64) - but an expression was expected of type ('b : value) - 'a t_float64_id has layout float64, which does not overlap with value. -|}];; - -let x8_3 = id_value (make_floatu ());; -[%%expect{| -Line 1, characters 20-36: -1 | let x8_3 = id_value (make_floatu ());; - ^^^^^^^^^^^^^^^^ -Error: This expression has type float# but an expression was expected of type - ('a : value) - float# has layout float64, which is not a sublayout of value. -|}];; - -(*************************************) -(* Test 9: But float64 functions do. *) - -let twice f (x : 'a t_float64_id) = f (f x) - -let f9_1 () = twice f1_1 (make_t_float64 ()) -let f9_2 () = twice f1_2 (make_t_float64_id ()) -let f9_3 () = twice f1_3 (make_floatu ());; -[%%expect{| -val twice : - ('a : float64). - ('a t_float64_id -> 'a t_float64_id) -> - 'a t_float64_id -> 'a t_float64_id = - -val f9_1 : unit -> t_float64 t_float64_id = -val f9_2 : ('a : float64). unit -> 'a t_float64_id = -val f9_3 : unit -> float# t_float64_id = -|}];; - -(**************************************************) -(* Test 10: Invalid uses of float64 and externals *) - -(* Valid uses of float64 in externals are tested elsewhere - this is just a test - for uses the typechecker should reject. In particular - - if using a non-value layout in an external, you must supply separate - bytecode and native code implementations, - - if using a non-value layout in an external, you may not use the old-style - unboxed float directive, and - - unboxed types can't be unboxed more. -*) - -external f10_1 : int -> bool -> float# = "foo";; -[%%expect{| -Line 1, characters 0-46: -1 | external f10_1 : int -> bool -> float# = "foo";; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The native code version of the primitive is mandatory - for types with non-value layouts. -|}];; - -external f10_2 : t_float64 -> int = "foo";; -[%%expect{| -Line 1, characters 0-41: -1 | external f10_2 : t_float64 -> int = "foo";; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The native code version of the primitive is mandatory - for types with non-value layouts. -|}];; - -external f10_3 : float -> t_float64 = "foo" "bar" "float";; -[%%expect{| -Line 1, characters 0-58: -1 | external f10_3 : float -> t_float64 = "foo" "bar" "float";; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Cannot use "float" in conjunction with types of non-value layouts. -|}];; - -external f10_4 : int -> float# -> float = "foo" "bar" "float";; -[%%expect{| -Line 1, characters 0-62: -1 | external f10_4 : int -> float# -> float = "foo" "bar" "float";; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Cannot use "float" in conjunction with types of non-value layouts. -|}];; - -external f10_5 : float# -> bool -> string = "foo" "bar" "float";; -[%%expect{| -Line 1, characters 0-64: -1 | external f10_5 : float# -> bool -> string = "foo" "bar" "float";; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Cannot use "float" in conjunction with types of non-value layouts. -|}];; - -external f10_6 : (float#[@unboxed]) -> bool -> string = "foo" "bar";; -[%%expect{| -Line 1, characters 18-24: -1 | external f10_6 : (float#[@unboxed]) -> bool -> string = "foo" "bar";; - ^^^^^^ -Error: Don't know how to unbox this type. - Only float, int32, int64, nativeint, and vector primitives can be unboxed. -|}];; - -external f10_7 : string -> (float#[@unboxed]) = "foo" "bar";; -[%%expect{| -Line 1, characters 28-34: -1 | external f10_7 : string -> (float#[@unboxed]) = "foo" "bar";; - ^^^^^^ -Error: Don't know how to unbox this type. - Only float, int32, int64, nativeint, and vector primitives can be unboxed. -|}];; - -external f10_8 : float -> float# = "foo" "bar" [@@unboxed];; -[%%expect{| -Line 1, characters 26-32: -1 | external f10_8 : float -> float# = "foo" "bar" [@@unboxed];; - ^^^^^^ -Error: Don't know how to unbox this type. - Only float, int32, int64, nativeint, and vector primitives can be unboxed. -|}];; - -(*******************************************************) -(* Test 11: Don't allow float64 in extensible variants *) - -type t11_1 = .. - -type t11_1 += A of t_float64;; -[%%expect{| -type t11_1 = .. -Line 3, characters 14-28: -3 | type t11_1 += A of t_float64;; - ^^^^^^^^^^^^^^ -Error: Type t_float64 has layout float64. - Variants may not yet contain types of this layout. -|}] - -type t11_1 += B of float#;; -[%%expect{| -Line 1, characters 14-25: -1 | type t11_1 += B of float#;; - ^^^^^^^^^^^ -Error: Type float# has layout float64. - Variants may not yet contain types of this layout. -|}] - -type ('a : float64) t11_2 = .. - -type 'a t11_2 += A of int - -type 'a t11_2 += B of 'a;; - -[%%expect{| -type ('a : float64) t11_2 = .. -type 'a t11_2 += A of int -Line 5, characters 17-24: -5 | type 'a t11_2 += B of 'a;; - ^^^^^^^ -Error: Type 'a has layout float64. - Variants may not yet contain types of this layout. -|}] - -(***************************************) -(* Test 12: float64 in objects/classes *) - -(* First, disallowed uses: in object types, class parameters, etc. *) -type t12_1 = < x : t_float64 >;; -[%%expect{| -Line 1, characters 15-28: -1 | type t12_1 = < x : t_float64 >;; - ^^^^^^^^^^^^^ -Error: Object field types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -type ('a : float64) t12_2 = < x : 'a >;; -[%%expect{| -Line 1, characters 34-36: -1 | type ('a : float64) t12_2 = < x : 'a >;; - ^^ -Error: This type ('a : value) should be an instance of type ('a0 : float64) - 'a has layout float64, which does not overlap with value. -|}] - -class c12_3 = object method x : t_float64 = assert false end;; -[%%expect{| -Line 1, characters 21-56: -1 | class c12_3 = object method x : t_float64 = assert false end;; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The method x has type t_float64 but is expected to have type - ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -class ['a] c12_4 = object - method x : 'a t_float64_id -> 'a t_float64_id = assert false -end;; -[%%expect{| -Line 2, characters 13-15: -2 | method x : 'a t_float64_id -> 'a t_float64_id = assert false - ^^ -Error: This type ('a : float64) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with float64. -|}];; -(* CR layouts v2.9: Error could be improved *) - -class c12_5 = object val x : t_float64 = assert false end;; -[%%expect{| -Line 1, characters 25-26: -1 | class c12_5 = object val x : t_float64 = assert false end;; - ^ -Error: Variables bound in a class must have layout value. - x has layout float64, which is not a sublayout of value. -|}];; - -class type c12_6 = object method x : float# end;; -[%%expect{| -Line 1, characters 26-43: -1 | class type c12_6 = object method x : float# end;; - ^^^^^^^^^^^^^^^^^ -Error: The method x has type float# but is expected to have type ('a : value) - float# has layout float64, which is not a sublayout of value. -|}];; -(* CR layouts v2.9: Error could be improved *) - -class type c12_7 = object val x : float# end -[%%expect{| -Line 1, characters 26-40: -1 | class type c12_7 = object val x : float# end - ^^^^^^^^^^^^^^ -Error: Variables bound in a class must have layout value. - x has layout float64, which is not a sublayout of value. -|}];; - -class type ['a] c12_8 = object - val x : 'a t_float64_id -> 'a t_float64_id -end -[%%expect{| -Line 2, characters 10-12: -2 | val x : 'a t_float64_id -> 'a t_float64_id - ^^ -Error: This type ('a : float64) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with float64. -|}];; - -(* Second, allowed uses: as method parameters / returns *) -type t12_8 = < f : t_float64 -> t_float64 > -let f12_9 (o : t12_8) x = o#f x -let f12_10 o (y : t_float64) : t_float64 = o#baz y y y;; -class ['a] c12_11 = object - method x : t_float64 -> 'a = assert false -end;; -class ['a] c12_12 = object - method x : 'a -> t_float64 = assert false -end;; -[%%expect{| -type t12_8 = < f : t_float64 -> t_float64 > -val f12_9 : t12_8 -> t_float64 -> t_float64 = -val f12_10 : - < baz : t_float64 -> t_float64 -> t_float64 -> t_float64; .. > -> - t_float64 -> t_float64 = -class ['a] c12_11 : object method x : t_float64 -> 'a end -class ['a] c12_12 : object method x : 'a -> t_float64 end -|}];; - -(* Third, another disallowed use: capture in an object. *) -let f12_13 m1 m2 = object - val f = fun () -> - let _ = f1_1 m1 in - let _ = f1_1 m2 in - () -end;; -[%%expect{| -Line 3, characters 17-19: -3 | let _ = f1_1 m1 in - ^^ -Error: This expression has type ('a : value) - but an expression was expected of type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let f12_14 (m1 : t_float64) (m2 : t_float64) = object - val f = fun () -> - let _ = f1_1 m1 in - let _ = f1_1 m2 in - () -end;; -[%%expect{| -Line 3, characters 17-19: -3 | let _ = f1_1 m1 in - ^^ -Error: m1 must have a type of layout value because it is captured by an object. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(*********************************************************************) -(* Test 13: Ad-hoc polymorphic operations don't work on float64 yet. *) - -(* CR layouts v5: Remember to handle the case of calling these on structures - containing other layouts. *) - -let f13_1 (x : t_float64) = x = x;; -[%%expect{| -Line 1, characters 28-29: -1 | let f13_1 (x : t_float64) = x = x;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let f13_2 (x : t_float64) = compare x x;; -[%%expect{| -Line 1, characters 36-37: -1 | let f13_2 (x : t_float64) = compare x x;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let f13_3 (x : t_float64) = Marshal.to_bytes x;; -[%%expect{| -Line 1, characters 45-46: -1 | let f13_3 (x : t_float64) = Marshal.to_bytes x;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let f13_4 (x : t_float64) = Hashtbl.hash x;; -[%%expect{| -Line 1, characters 41-42: -1 | let f13_4 (x : t_float64) = Hashtbl.hash x;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(***********************************************************) -(* Test 14: unboxed float records work like normal records *) - -module FU = Stdlib__Float_u - -type t14_1 = { x : float#; y : float# } - -(* pattern matching *) -let f14_1 {x;y} = FU.sub x y - -(* construction *) -let r14 = { x = FU.of_float 3.14; y = FU.of_float 2.72 } - -let sum14_1 = FU.to_float (f14_1 r14) - -(* projection *) -let f14_2 ({y;_} as r) = FU.sub r.x y - -let sum14_2 = FU.to_float (f14_1 r14) - -type t14_2 = { mutable a : float#; b : float#; mutable c : float# } - -let f14_3 ({b; c; _} as r) = - (* pure record update *) - let r' = { r with b = FU.of_float 20.0; c = r.a } in - (* mutation *) - r.a <- FU.sub r.a r'.b; - r'.a <- FU.of_float 42.0; - r' - -let a, b, c, a', b', c' = - let r = {a = FU.of_float 3.1; b = FU.of_float (-0.42); c = FU.of_float 27.7 } in - let r' = f14_3 r in - FU.to_float r.a, - FU.to_float r.b, - FU.to_float r.c, - FU.to_float r'.a, - FU.to_float r'.b, - FU.to_float r'.c - -let f14_4 r = - let {x; y} = r in - FU.add x y - - -[%%expect{| -module FU = Stdlib__Float_u -type t14_1 = { x : float#; y : float#; } -val f14_1 : t14_1 -> float# = -val r14 : t14_1 = {x = ; y = } -val sum14_1 : float = 0.419999999999999929 -val f14_2 : t14_1 -> float# = -val sum14_2 : float = 0.419999999999999929 -type t14_2 = { mutable a : float#; b : float#; mutable c : float#; } -val f14_3 : t14_2 -> t14_2 = -val a : float = -16.9 -val b : float = -0.42 -val c : float = 27.7 -val a' : float = 42. -val b' : float = 20. -val c' : float = 3.1 -val f14_4 : t14_1 -> float# = -|}] diff --git a/testsuite/tests/typing-layouts-float64/c_api.ml b/testsuite/tests/typing-layouts-float64/c_api.ml index 6fbca60df05..81f67d1c407 100644 --- a/testsuite/tests/typing-layouts-float64/c_api.ml +++ b/testsuite/tests/typing-layouts-float64/c_api.ml @@ -1,20 +1,33 @@ (* TEST - modules = "stubs.c" - reference = "${test_source_directory}/c_api.reference" - * native - flags = "-extension layouts_alpha" - * bytecode - flags = "-extension layouts_alpha" - * native - flags = "-extension layouts_beta" - * bytecode - flags = "-extension layouts_beta" + modules = "stubs.c"; + reference = "${test_source_directory}/c_api.reference"; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } *) +(* mshinwell: This test is now only run with flambda2, as the corresponding + ocamltest predicate is reliable for testing whether this is an + flambda-backend build. *) + (* This file tests using external C functions with float#. *) external to_float : float# -> (float[@local_opt]) = "%box_float" -external of_float : (float[@local_opt]) -> float# = "%unbox_float" let print_floatu s f = Printf.printf "%s: %.2f\n" s (to_float f) let print_float s f = Printf.printf "%s: %.2f\n" s f @@ -28,7 +41,7 @@ external sin_BU_U : (float[@unboxed]) -> float# = "sin_byte" "sin_U_U" external sin_U_BU : float# -> (float[@unboxed]) = "sin_byte" "sin_U_U" let sin_two = - let f = sin_U_U (of_float 2.) in + let f = sin_U_U #2. in print_floatu "Test U -> U, sin two" f let sin_three = @@ -36,7 +49,7 @@ let sin_three = print_floatu "Test B -> U, sin three" f let sin_four = - let f = sin_U_B (of_float 4.) in + let f = sin_U_B #4. in print_float "Test U -> B, sin four" f let sin_five = @@ -44,7 +57,7 @@ let sin_five = print_floatu "Test (B[@unboxed]) -> U, sin five" f let sin_six = - let f = sin_U_BU (of_float 6.) in + let f = sin_U_BU #6. in print_float "Test U -> (B[@unboxed]), sin six" f (* If there are more than 5 args, you get an array in the bytecode version, @@ -55,7 +68,7 @@ external sum_7 : let sum_of_one_to_seven = let f = - sum_7 (of_float 1.) 2. (of_float 3.) 4. (of_float 5.) 6. (of_float 7.) + sum_7 #1. 2. #3. 4. #5. 6. #7. in print_floatu "Function with many args, sum_of_one_to_seven" f @@ -63,5 +76,5 @@ let sum_of_one_to_seven = let[@inline never] sin_U_U' x = sin_U_U x let sin_seven = - let f = sin_U_U' (of_float 7.) in + let f = sin_U_U' #7. in print_floatu "Test U -> U eta expansion, sin seven" f diff --git a/testsuite/tests/typing-layouts-float64/debug_events.ml b/testsuite/tests/typing-layouts-float64/debug_events.ml new file mode 100644 index 00000000000..afcb4d89809 --- /dev/null +++ b/testsuite/tests/typing-layouts-float64/debug_events.ml @@ -0,0 +1,8 @@ +(* TEST + flags = "-g"; + include stdlib_upstream_compatible; + bytecode; +*) + +let f1 f i = Stdlib_upstream_compatible.Float_u.to_float (f i) +let f2 f i = Stdlib_upstream_compatible.Float_u.to_float (f i) +. 0. diff --git a/testsuite/tests/typing-layouts-float64/parsing.ml b/testsuite/tests/typing-layouts-float64/parsing.ml index 8397420403f..fb2cc7915f8 100644 --- a/testsuite/tests/typing-layouts-float64/parsing.ml +++ b/testsuite/tests/typing-layouts-float64/parsing.ml @@ -1,8 +1,11 @@ (* TEST - flags = "-extension layouts_alpha" - * expect - flags = "-extension layouts_beta" - * expect + flags = "-extension layouts_alpha"; + { + flags = "-extension layouts_beta"; + expect; + }{ + expect; + } *) (* These tests show how potential ambiguities are resolved @@ -17,24 +20,6 @@ type t = float# val f : float# -> unit = |}];; -type t = C of float#;; -[%%expect {| -Line 1, characters 9-20: -1 | type t = C of float#;; - ^^^^^^^^^^^ -Error: Type float# has layout float64. - Variants may not yet contain types of this layout. -|}];; - -type t = C : float# -> t;; -[%%expect {| -Line 1, characters 9-24: -1 | type t = C : float# -> t;; - ^^^^^^^^^^^^^^^ -Error: Type float# has layout float64. - Variants may not yet contain types of this layout. -|}];; - (* float# works as an argument to normal type constructors, not just classes, even though many of the rest of the tests in this file are concerned with classes. @@ -45,7 +30,10 @@ Line 1, characters 9-15: 1 | type t = float# list;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because the type argument of list has layout value. |}];; let f (_ : float# list) = ();; @@ -54,7 +42,10 @@ Line 1, characters 11-17: 1 | let f (_ : float# list) = ();; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because the type argument of list has layout value. |}];; type t = C of float# list;; @@ -63,7 +54,10 @@ Line 1, characters 14-20: 1 | type t = C of float# list;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because the type argument of list has layout value. |}];; type t = C : float# list -> t;; @@ -72,7 +66,10 @@ Line 1, characters 13-19: 1 | type t = C : float# list -> t;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because the type argument of list has layout value. |}];; (* Syntax: float#c @@ -91,7 +88,10 @@ Line 1, characters 9-15: 1 | type t = float#c;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; let f (_ : float#c) = ();; @@ -100,7 +100,10 @@ Line 1, characters 11-17: 1 | let f (_ : float#c) = ();; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; type t = C of float#c;; @@ -109,7 +112,10 @@ Line 1, characters 14-20: 1 | type t = C of float#c;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; type t = C : float#c -> t;; @@ -118,7 +124,10 @@ Line 1, characters 13-19: 1 | type t = C : float#c -> t;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; (* Syntax: float# c @@ -130,7 +139,10 @@ Line 1, characters 9-15: 1 | type t = float# c;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; let f (_ : float# c) = ();; @@ -139,7 +151,10 @@ Line 1, characters 11-17: 1 | let f (_ : float# c) = ();; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; type t = C of float# c;; @@ -148,7 +163,10 @@ Line 1, characters 14-20: 1 | type t = C of float# c;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; type t = C : float# c -> t;; @@ -157,7 +175,10 @@ Line 1, characters 13-19: 1 | type t = C : float# c -> t;; ^^^^^^ Error: This type float# should be an instance of type ('a : value) - float# has layout float64, which is not a sublayout of value. + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's a type argument to a class constructor. |}];; (* Syntax: float #c @@ -255,9 +276,8 @@ Error: The type constructor float# expects 0 argument(s), (* Hint for #float *) type t = #float;; [%%expect {| -Line 1, characters 10-15: +Line 1, characters 9-15: 1 | type t = #float;; - ^^^^^ -Error: Unbound class type float -Hint: Did you mean float#? + ^^^^^^ +Error: float isn't a class type. Did you mean the unboxed type float#? |}] diff --git a/testsuite/tests/typing-layouts-float64/parsing_alpha.ml b/testsuite/tests/typing-layouts-float64/parsing_alpha.ml new file mode 100644 index 00000000000..17d66e84a4b --- /dev/null +++ b/testsuite/tests/typing-layouts-float64/parsing_alpha.ml @@ -0,0 +1,18 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(* We can move this back to [parsing.ml] when mixed blocks + exit alpha. +*) + +type t = C of float#;; +[%%expect {| +type t = C of float# +|}];; + +type t = C : float# -> t;; +[%%expect {| +type t = C : float# -> t +|}];; diff --git a/testsuite/tests/typing-layouts-float64/stdlib_float_u.ml b/testsuite/tests/typing-layouts-float64/stdlib_float_u.ml index 47d746d8262..8a81bcb1ae2 100644 --- a/testsuite/tests/typing-layouts-float64/stdlib_float_u.ml +++ b/testsuite/tests/typing-layouts-float64/stdlib_float_u.ml @@ -1,15 +1,21 @@ (* TEST - * native - flags = "-extension layouts_alpha" - * bytecode - flags = "-extension layouts_alpha" - * native - flags = "-extension layouts_beta" - * bytecode - flags = "-extension layouts_beta" + include stdlib_upstream_compatible; + { + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } *) -module Float_u = Stdlib__Float_u +module Float_u = Stdlib_upstream_compatible.Float_u (* Constant seed for repeatable random-testing properties *) let () = Random.init 1234 diff --git a/testsuite/tests/typing-layouts-float64/unboxed_floats.ml b/testsuite/tests/typing-layouts-float64/unboxed_floats.ml index 87b05cb898a..bb348142296 100644 --- a/testsuite/tests/typing-layouts-float64/unboxed_floats.ml +++ b/testsuite/tests/typing-layouts-float64/unboxed_floats.ml @@ -1,21 +1,46 @@ (* TEST - reference = "${test_source_directory}/unboxed_floats.reference" - * native - flags = "-extension layouts_alpha" - * bytecode - flags = "-extension layouts_alpha" - * native - flags = "-extension layouts_beta" - * bytecode - flags = "-extension layouts_beta" - * setup-ocamlc.byte-build-env - ocamlc_byte_exit_status = "2" - flags = "-extension layouts" - ** ocamlc.byte - compiler_reference = "${test_source_directory}/unboxed_floats_disabled.compilers.reference" - *** check-ocamlc.byte-output + reference = "${test_source_directory}/unboxed_floats.reference"; + include stdlib_upstream_compatible; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + }{ + flags = "-extension-universe upstream_compatible"; + native; + }{ + flags = "-extension-universe upstream_compatible"; + bytecode; + }{ + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + flags = "-extension-universe no_extensions"; + compiler_reference = "${test_source_directory}/unboxed_floats_disabled.compilers.reference"; + ocamlc.byte; + check-ocamlc.byte-output; + } *) +(* CR layouts v2.6: Layouts should be erasable and we can remove the + only-erasable-extensions stanza above. *) + +(* mshinwell: This test is now only run with flambda2, as the corresponding + ocamltest predicate is reliable for testing whether this is an + flambda-backend build. *) + (* This file contains various tests for float#. It's not an expect test to make sure it gets tested for native code. *) @@ -26,7 +51,7 @@ (* Prelude: Functions on unboxed floats. *) module Float_u = struct - include Stdlib__Float_u + include Stdlib_upstream_compatible.Float_u let ( + ) = add let ( - ) = sub @@ -40,25 +65,27 @@ end (* Test 1: some basic arithmetic *) let print_floatu prefix x = Printf.printf "%s: %.2f\n" prefix (Float_u.to_float x) +let print_float prefix x = Printf.printf "%s: %.2f\n" prefix x +let print_int prefix x = Printf.printf "%s: %d\n" prefix x (* Tests all the operators above *) let test1 () = (* CR layouts: When float64 defs are allowed at the module level, get rid of [test1] and move these definitions there. *) let open Float_u in - let pi = of_float 3.14 in + let pi = #3.14 in print_floatu "Test 1, pi" pi; - let twice_pi = pi + (of_float 3.14) in + let twice_pi = pi + #3.14 in print_floatu "Test 1, twice_pi" twice_pi; - let thrice_pi = (of_float 3.0) * pi in + let thrice_pi = #3.0 * pi in print_floatu "Test 1, thrice_pi" thrice_pi; let twice_pi_again = thrice_pi - pi in print_floatu "Test 1, twice_pi_again" twice_pi; - let pi_again = twice_pi_again / (of_float 2.0) in + let pi_again = twice_pi_again / #2.0 in print_floatu "Test 1, pi_again" pi_again; let twice_pi_to_the_pi = twice_pi ** pi in @@ -69,7 +96,7 @@ let test1 () = twice_pi_greater_than_pi; let pi_with_effort = - ((of_float 3.14) + twice_pi) * (of_float 2.0) / (of_float 6.0) in + (#3.14 + twice_pi) * #2.0 / #6.0 in print_floatu "Test 1, pi_with_effort" pi_with_effort let _ = test1 () @@ -85,33 +112,33 @@ let[@inline never] twice f (x : 'a t_float64) = f (f x) let[@inline never] compose f g (x : 'a t_float64) = f (g x) let[@inline never] twice_on_pi f = - let pi = Float_u.of_float 3.14 in + let pi = #3.14 in twice f pi -let times_four = twice Float_u.(fun x -> x * (of_float 2.0)) +let times_four = twice Float_u.(fun x -> x * #2.0) let _ = let open Float_u in print_floatu "Test 2, add pi twice" - (twice (fun x -> x + (of_float 3.14)) (of_float 0.0)); + (twice (fun x -> x + #3.14) #0.0); print_floatu "Test 2, add pi four times" - (twice (twice (fun x -> x + (of_float 3.14))) (of_float 0.0)); + (twice (twice (fun x -> x + #3.14)) #0.0); print_floatu "Test 2, increment pi twice" - (twice_on_pi (fun x -> (of_float 1.0) + x)); + (twice_on_pi (fun x -> #1.0 + x)); print_floatu "Test 2, increment pi four times" - (twice_on_pi (twice (fun x -> (of_float 1.0) + x))); + (twice_on_pi (twice (fun x -> #1.0 + x))); print_floatu "Test 2, e times four" - (times_four (of_float 2.72)); + (times_four #2.72); print_floatu "Test 2, pi times sixteen" (twice_on_pi times_four); print_floatu "Test 2, pi times sixteen again" - (compose times_four times_four (of_float 3.14)); + (compose times_four times_four #3.14); print_floatu "Test 2, pi minus four" - (let two = twice (fun x -> x + (of_float 1.0)) (of_float 0.0) in + (let two = twice (fun x -> x + #1.0) #0.0 in let add_two = Float_u.(+) two in let add_two_after = compose add_two in - let minus_four = add_two_after (twice (fun x -> x - (of_float 3.0))) in - minus_four (of_float 3.14)) + let minus_four = add_two_after (twice (fun x -> x - #3.0)) in + minus_four #3.14) (******************************) (* Test 3: float# in closures *) @@ -121,7 +148,7 @@ let _ = let[@inline never] f3 n m steps () = let[@inline never] rec go k = if k = n - then Float_u.of_float 0. + then #0. else begin let acc = go (k + 1) in steps.(k) <- Float_u.to_float acc; @@ -135,7 +162,7 @@ let[@inline_never] f3_manyargs x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 steps () = let (start_k, end_k) = x0 in let[@inline never] rec go k = if k = end_k - then Float_u.of_float 0. + then #0. else begin let (x2_1, x2_2) = x2 in let (x4_1, x4_2) = x4 in @@ -152,7 +179,7 @@ let[@inline_never] f3_manyargs x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 steps () = let test3 () = (* Test f3 *) let steps = Array.init 10 (fun _ -> 0.0) in - let five_pi = f3 5 (Float_u.of_float 3.14) steps in + let five_pi = f3 5 #3.14 steps in print_floatu "Test 3, 5 * pi: " (five_pi ()); Array.iteri (Printf.printf " Test 3, step %d: %.2f\n") steps; @@ -166,11 +193,11 @@ let test3 () = ( but we expect some floating point error ) *) let steps = Array.init 10 (fun _ -> 0.0) in - let x1 = Float_u.of_float 3.14 in - let x3 = Float_u.of_float 2.72 in - let x5 = Float_u.of_float 1.62 in - let x7 = Float_u.of_float 1.41 in - let x9 = Float_u.of_float 42.0 in + let x1 = #3.14 in + let x3 = #2.72 in + let x5 = #1.62 in + let x7 = #1.41 in + let x9 = #42.0 in (* these sum to 3 *) let x2 = (7, 42) in @@ -190,7 +217,7 @@ let _ = test3 () let[@inline never] test4 () = (* Simple indirect call *) let[@inline never] go f = - Float_u.to_float (f (Float_u.of_float 1.) (Float_u.of_float 2.)) + Float_u.to_float (f #1. #2.) in let (x1, x2) = (go Float_u.(+), go Float_u.(-)) in print_floatu "Test 4, 1 + 2" (Float_u.of_float x1); @@ -198,7 +225,7 @@ let[@inline never] test4 () = (* partial application to float# *) let steps = Array.init 10 (fun _ -> 0.0) in - let f = Sys.opaque_identity (f3 5 (Float_u.of_float 3.14)) in + let f = Sys.opaque_identity (f3 5 #3.14) in let five_pi = f steps in print_floatu "Test 4, 5 * pi: " (five_pi ()); Array.iteri (Printf.printf " Test 4, step %d: %.2f\n") steps; @@ -206,7 +233,7 @@ let[@inline never] test4 () = (* partial application with float# remaining *) let steps = Array.init 10 (fun _ -> 0.0) in let f = Sys.opaque_identity (f3 6) in - let five_pi = f (Float_u.of_float 3.14) steps in + let five_pi = f #3.14 steps in print_floatu "Test 4, 6 * pi: " (five_pi ()); Array.iteri (Printf.printf " Test 4, step %d: %.2f\n") steps; @@ -215,14 +242,14 @@ let[@inline never] test4 () = let f3 = Sys.opaque_identity f3 in let steps = Array.init 10 (fun _ -> 0.0) in - let f = Sys.opaque_identity (f3 5 (Float_u.of_float 3.14)) in + let f = Sys.opaque_identity (f3 5 #3.14) in let five_pi = f steps in print_floatu "Test 4, 5 * pi: " (five_pi ()); Array.iteri (Printf.printf " Test 4, step %d: %.2f\n") steps; let steps = Array.init 10 (fun _ -> 0.0) in let f = Sys.opaque_identity (f3 6) in - let five_pi = f (Float_u.of_float 3.14) steps in + let five_pi = f #3.14 steps in print_floatu "Test 4, 6 * pi: " (five_pi ()); Array.iteri (Printf.printf " Test 4, step %d: %.2f\n") steps @@ -242,9 +269,9 @@ let[@inline never] f5 n m = let test5 () = let open Float_u in let _ : unit = - f5 (of_float 3.14) (of_float 2.72) + f5 #3.14 #2.72 (fun n s m -> print_floatu s (n + m)) "Test 5, pi+e+1" - (of_float 1.0) + #1.0 in () @@ -285,20 +312,20 @@ let test6 () = (* (3.14 - 2.72) / 2.5 = ~0.17 *) let o = (Sys.opaque_identity f6_1) () in print_floatu "Test 6, 0.17" - (o#f6_m1 (of_float 3.14) (of_float 2.72) (of_float 2.5)); + (o#f6_m1 #3.14 #2.72 #2.5); (* 4.25 * 8 = 34 *) let o = (Sys.opaque_identity f6_2) (4,7) in - let result = o#f6_m2 8 (of_float 4.25) (fun x -> x * of_float 2.) in + let result = o#f6_m2 8 #4.25 (fun x -> x * #2.) in print_floatu "Test 6, 34.00" result; (* (1 + 2 + 3 + (-2) + (-12) + 4) * (2.72 + (-1) + 10) = -46.88 *) let o = (Sys.opaque_identity f6_3) (1,2) 3 in let result = - o#f6_m3 (-2) (of_float 2.72) + o#f6_m3 (-2) (#2.72) (fun[@inline never] i m1 m2 n m3 -> (of_float (Float.of_int (add3 i n))) * (m1 + m2 + m3)) - (of_float (-1.)) (-12,4) (of_float 10.) + (-#1.) (-12,4) (#10.) in print_floatu "Test 6, -46.88" result @@ -307,19 +334,19 @@ let _ = test6 () (*****************************) (* Test 7: letop with floats *) -let ( let* ) x f = f Float_u.(x + (of_float 1.5)) +let ( let* ) x f = f Float_u.(x + #1.5) let _ = - let* x = Float_u.of_float 42.0 in - print_floatu "Test 7, 36.50" Float_u.(x - of_float 7.0) + let* x = #42.0 in + print_floatu "Test 7, 36.50" Float_u.(x - #7.0) let ( let* ) x (f : _ -> float#) = f x -let ( and* ) x y = Float_u.(x, to_float (y - (of_float 1.2))) +let ( and* ) x y = Float_u.(x, to_float (y - #1.2)) let _ = let result = let* x = 42.0 - and* y = Float_u.of_float 3.3 - and* z = Float_u.of_float (-10.7) in + and* y = #3.3 + and* z = -#10.7 in Float_u.of_float (x +. y +. z) in print_floatu "Test 7, 32.20" result @@ -335,7 +362,7 @@ let[@inline_never] f8 x0 x2 x4 x6 x8 steps ({ x1; x5; _ } as fargs) () = let (start_k, end_k) = x0 in let[@inline never] rec go k = if k = end_k - then Float_u.of_float 0. + then #0. else begin let (x2_1, x2_2) = x2 in let (x4_1, x4_2) = x4 in @@ -353,11 +380,11 @@ let[@inline_never] f8 x0 x2 x4 x6 x8 steps ({ x1; x5; _ } as fargs) () = let test8 () = (* same math as f3_manyargs *) let steps = Array.init 10 (fun _ -> 0.0) in - let x1 = Float_u.of_float 3.14 in - let x3 = Float_u.of_float 2.72 in - let x5 = Float_u.of_float 1.62 in - let x7 = Float_u.of_float 1.41 in - let x9 = Float_u.of_float 42.0 in + let x1 = #3.14 in + let x3 = #2.72 in + let x5 = #1.62 in + let x7 = #1.41 in + let x9 = #42.0 in (* these sum to 3 *) let x2 = (7, 42) in @@ -382,15 +409,15 @@ type t9 = { a : float#; mutable d : float# } (* Construction *) -let t9_1 = { a = Float_u.of_float 3.14; - b = Float_u.of_float 2.72; - c = Float_u.of_float 1.62; - d = Float_u.of_float 1.41 } +let t9_1 = { a = #3.14; + b = #2.72; + c = #1.62; + d = #1.41 } -let t9_2 = { a = Float_u.of_float (-3.14); - b = Float_u.of_float (-2.72); - c = Float_u.of_float (-1.62); - d = Float_u.of_float (-1.41) } +let t9_2 = { a = -#3.14; + b = -#2.72; + c = -#1.62; + d = -#1.41 } let print_t9 t9 = print_floatu " a" t9.a; @@ -418,10 +445,10 @@ let _ = (* Record update and mutation *) let f9_2 ({a; d; _} as r1) r2 = - r1.d <- Float_u.of_float 42.0; - let r3 = { r2 with c = r1.d; d = Float_u.of_float 25.0 } in + r1.d <- #42.0; + let r3 = { r2 with c = r1.d; d = #25.0 } in r3.b <- Float_u.(a + d); - r2.b <- Float_u.of_float 17.0; + r2.b <- #17.0; r3 let _ = @@ -436,19 +463,19 @@ let _ = let rec f r = r.d <- t10_1.b; - t10_2.b <- (Float_u.of_float 42.0); + t10_2.b <- #42.0; Float_u.(r.a + t10_2.a) -and t10_1 = { a = Float_u.of_float 1.1; - b = Float_u.of_float 2.2; - c = Float_u.of_float 3.2; - d = Float_u.of_float 4.4 } +and t10_1 = { a = #1.1; + b = #2.2; + c = #3.2; + d = #4.4 } -and t10_2 = { a = Float_u.of_float (- 5.1); - b = Float_u.of_float (- 6.2); - c = Float_u.of_float (- 7.3); - d = Float_u.of_float (- 8.4) } +and t10_2 = { a = -#5.1; + b = -#6.2; + c = -#7.3; + d = -#8.4 } let _ = Printf.printf "Test 10, float# records in recursive groups.\n"; @@ -467,11 +494,19 @@ type ex = Ex : 'a -> ex type t11_u = { xu : float#; yu : float# } type t11_b = { xb : float; yb : float } -let ru = { xu = Float_u.of_float 3.14; yu = Float_u.of_float 42.0 } +let ru = { xu = #3.14; yu = #42.0 } let rb = { xb = 3.14; yb = 42.0 } let rb' = { xb = 3.14; yb = 42.1 } let _ = Printf.printf "Test 11, heterogeneous polymorphic equality.\n"; Printf.printf " equal: %b\n" (Ex ru = Ex rb); - Printf.printf " unequal: %b\n" (Ex ru = Ex rb'); + Printf.printf " unequal: %b\n" (Ex ru = Ex rb') + +(*************************************************) +(* Test 12: If-then-else with float64 and assert *) + +let _ = + let a = if Sys.opaque_identity true then #1. else assert false in + Printf.printf "Test 12, If-then-else with assert and float64.\n"; + print_floatu " result (1.00)" a diff --git a/testsuite/tests/typing-layouts-float64/unboxed_floats.reference b/testsuite/tests/typing-layouts-float64/unboxed_floats.reference index 17511276f06..8fe460ccafd 100644 --- a/testsuite/tests/typing-layouts-float64/unboxed_floats.reference +++ b/testsuite/tests/typing-layouts-float64/unboxed_floats.reference @@ -147,3 +147,5 @@ Test 10, float# records in recursive groups. Test 11, heterogeneous polymorphic equality. equal: true unequal: false +Test 12, If-then-else with assert and float64. + result (1.00): 1.00 diff --git a/testsuite/tests/typing-layouts-float64/unboxed_floats_beta.ml b/testsuite/tests/typing-layouts-float64/unboxed_floats_beta.ml new file mode 100644 index 00000000000..2cfc7f5f28f --- /dev/null +++ b/testsuite/tests/typing-layouts-float64/unboxed_floats_beta.ml @@ -0,0 +1,498 @@ +(* TEST + reference = "${test_source_directory}/unboxed_floats_beta.reference"; + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* This should be read as a continuation of the [unboxed_floats.ml] test. + We can't put them there because: + - [unboxed_floats.ml] is run at all maturities, but + - these tests use features that only are enabled at the beta maturity. + + Once mixed blocks move to the "stable" maturity level, we can + move these tests there. + *) + +(*****************************************) +(* Prelude: Functions on unboxed floats. *) + +module Float_u = struct + include Stdlib_upstream_compatible.Float_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( ** ) = pow + let ( > ) x y = (compare x y) > 0 +end + +let print_floatu prefix x = Printf.printf "%s: %.2f\n" prefix (Float_u.to_float x) +let print_float prefix x = Printf.printf "%s: %.2f\n" prefix x +let print_int prefix x = Printf.printf "%s: %d\n" prefix x + +(*************************************************) +(* Test 13: basic float + float# records *) + +(* Copy of test 3, everything is in the record, with boxed float fields + necessarily in the prefix of the record. +*) +type mixed_float_record = + { x1 : float#; + x2_1 : float; + x3 : float#; + x4_1 : float; + x5 : float#; + x6_1 : float; + x7 : float#; + x8_1 : float; + x9 : float# } + +type int_args = + { x0_1 : int; + x0_2 : int; + x2_2 : int; + x4_2 : int; + x6_2 : int; + x8_2 : int; + } + +(* Get some float# args by pattern matching and others by projection *) +let[@inline_never] f13 steps ({ x1; x8_1; x5; x6_1 } as fargs) + ({ x0_1=start_k; x0_2=end_k; x4_2; x8_2 } as iargs) () = + let[@inline never] rec go k = + if k = end_k + then Float_u.of_float 0. + else begin + let (x2_1, x2_2) = (fargs.x2_1, iargs.x2_2) in + let {x4_1; _}, {x6_2; _} = fargs, iargs in + let sum = + Float_u.(of_float x2_1 + of_int x2_2 + of_float x4_1 + of_int x4_2 + + of_float x6_1 + of_int x6_2 + of_float x8_1 + of_int x8_2) + in + let acc = go (k + 1) in + steps.(k) <- Float_u.to_float acc; + Float_u.(acc + ((x1 + fargs.x3 + x5 + fargs.x7 + fargs.x9) + * sum)) + end + in + go start_k + +let test13 () = + (* same math as f3_manyargs *) + let steps = Array.init 10 (fun _ -> 0.0) in + let x1 = Float_u.of_float 3.14 in + let x3 = Float_u.of_float 2.72 in + let x5 = Float_u.of_float 1.62 in + let x7 = Float_u.of_float 1.41 in + let x9 = Float_u.of_float 42.0 in + + (* these sum to 3.0 *) + let x2_1 = 6.6 in + let x2_2 = 42 in + let x4_1 = -22.9 in + let x4_2 = 109 in + let x6_1 = -241.2 in + let x6_2 = 90 in + let x8_1 = -2.5 in + let x8_2 = 22 in + + let fargs = + { x1; x2_1; x3; x4_1; x5; x6_1; x7; + x8_1; x9; } + in + let iargs = { x0_1 = 4; x0_2 = 8; x2_2; x4_2; x6_2; x8_2 } in + + let f13 = f13 steps fargs iargs in + print_floatu "Test 13, 610.68: " (f13 ()); + Array.iteri (Printf.printf " Test 13, step %d: %.2f\n") steps + +let _ = test13 () + +(*****************************************************) +(* Test 14: (float# + float) record manipulation *) + +type t14 = { a : float#; + mutable b : float; + c : float#; + mutable d : float#; + e : float; + mutable f : float# } + +(* Construction *) +let t14_1 = { a = Float_u.of_float 3.14; + b = 13.; + c = Float_u.of_float 7.31; + d = Float_u.of_float 1.41; + e = 6.; + f = Float_u.of_float 27.1 + } + +let t14_2 = { a = Float_u.of_float (-3.14); + b = -13.; + c = Float_u.of_float (-7.31); + d = Float_u.of_float (-1.41); + e = -6.; + f = Float_u.of_float (-27.1) + } + +let print_t14 t14 = + print_floatu " a" t14.a; + print_float " b" t14.b; + print_floatu " c" t14.c; + print_floatu " d" t14.d; + print_float " e" t14.e; + print_floatu " f" t14.f + +let _ = + Printf.printf "Test 14, construction:\n"; + print_t14 t14_1; + print_t14 t14_2 + +(* Matching, projection *) +let f14_1 {c; d; f; _} r = + match r with + | { a; _ } -> + { a = (Float_u.of_float r.e); + b = Float_u.(to_float (a - d)); + c = Float_u.(r.c + c); + d = Float_u.(d - (of_float r.b)); + e = Float_u.(to_float (f + (of_float r.e))); + f = r.f} + +let _ = + Printf.printf "Test 14, matching and projection:\n"; + print_t14 (f14_1 t14_1 t14_2) + +(* Record update and mutation *) +let f14_2 ({a; d; _} as r1) r2 = + r1.d <- Float_u.of_float 42.0; + let r3 = { r2 with c = r1.d; + d = Float_u.of_float 25.0 } + in + r3.b <- Float_u.(to_float (a + d)); + r2.b <- 17.; + r1.f <- r2.c; + r3 + +let _ = + Printf.printf "Test 14, record update and mutation:\n"; + let t14_3 = f14_2 t14_1 t14_2 in + print_t14 t14_1; + print_t14 t14_2; + print_t14 t14_3 + +(*************************************************************) +(* Test 15: (float# + float) records in recursive groups *) + +let rec f r = + r.d <- Float_u.of_float t15_1.b; + t15_2.b <- 42.; + t15_1.f <- t15_1.a; + Float_u.(r.a + t15_2.a) + + +and t15_1 = { a = Float_u.of_float 1.1; + b = 2.; + c = Float_u.of_float 3.3; + d = Float_u.of_float 4.4; + e = 5.; + f = Float_u.of_float 6.6} + +and t15_2 = { a = Float_u.of_float (- 5.1); + b = -6.; + c = Float_u.of_float (-7.3); + d = Float_u.of_float (-8.4); + e = -9.; + f = Float_u.of_float (-10.6) } + +let _ = + Printf.printf "Test 15, (float#+float) records in recursive groups:\n"; + print_t14 t15_1; + print_t14 t15_2; + let result = f t15_1 in + print_floatu " result (-4.00)" result; + print_t14 t15_1; + print_t14 t15_2 + +let dummy = "dummy" + +(*************************************************) +(* Test 16: basic mixed records involving float# *) + +type mixedargs = { x2_1 : float; + x4_1 : float; + x6_1 : float; + x8_1 : float; + (* We include the string field to document more plainly that + the preceding section of [float] fields are boxed. + Without the [str] field, an implementation of mixed blocks + could more conceivably unbox the [float] fields. + *) + dummy : string; + x0_1 : int; + x0_2 : int; + x1 : float#; + x2_2 : int; + x3 : float#; + x4_2 : int; + x5 : float#; + x6_2 : int; + x7 : float#; + x8_2 : int; + x9 : float# } + +(* Get some float# args by pattern matching and others by projection *) +let[@inline_never] f16 steps ({ x1; x0_1=start_k; x0_2=end_k; x8_1; x8_2; x5; + x6_1; x6_2 } as fargs) () = + let[@inline never] rec go k = + if k = end_k + then Float_u.of_float 0. + else begin + let (x2_1, x2_2) = (fargs.x2_1, fargs.x2_2) in + let {x4_1; x4_2; _} = fargs in + let sum = + Float_u.(of_float x2_1 + of_int x2_2 + of_float x4_1 + of_int x4_2 + + of_float x6_1 + of_int x6_2 + of_float x8_1 + of_int x8_2) + in + let acc = go (k + 1) in + steps.(k) <- Float_u.to_float acc; + Float_u.(acc + ((x1 + fargs.x3 + x5 + fargs.x7 + fargs.x9) + * sum)) + end + in + go start_k + +let test16 () = + (* same math as f3_manyargs *) + let steps = Array.init 10 (fun _ -> 0.0) in + let x1 = Float_u.of_float 3.14 in + let x3 = Float_u.of_float 2.72 in + let x5 = Float_u.of_float 1.62 in + let x7 = Float_u.of_float 1.41 in + let x9 = Float_u.of_float 42.0 in + + (* these sum to 3.0 *) + let x2_1 = 6.6 in + let x2_2 = 42 in + let x4_1 = -22.9 in + let x4_2 = 109 in + let x6_1 = -241.2 in + let x6_2 = 90 in + let x8_1 = -2.5 in + let x8_2 = 22 in + + let fargs = + { x0_1 = 4; x0_2 = 8; x1; x2_1; x2_2; x3; x4_1; x4_2; x5; x6_1; x6_2; x7; + x8_1; x8_2; x9; + dummy } + in + + let f16 = f16 steps fargs in + print_floatu "Test 16, 610.68: " (f16 ()); + Array.iteri (Printf.printf " Test 16, step %d: %.2f\n") steps + +let _ = test16 () + +(*****************************************************) +(* Test 17: mixed record manipulation *) + +type t17 = { a : float; + dummy : string; + mutable b : int; + c : float#; + mutable d : float#; + e : int; + mutable f : float# } + +(* Construction *) +let t17_1 = { a = 3.17; + b = 13; + c = Float_u.of_float 7.31; + d = Float_u.of_float 1.41; + e = 6; + f = Float_u.of_float 27.1; + dummy; + } + +let t17_2 = { a = (-3.17); + b = -13; + c = Float_u.of_float (-7.31); + d = Float_u.of_float (-1.41); + e = -6; + f = Float_u.of_float (-27.1); + dummy; + } + +let print_t17 t17 = + print_float " a" t17.a; + print_int " b" t17.b; + print_floatu " c" t17.c; + print_floatu " d" t17.d; + print_int " e" t17.e; + print_floatu " f" t17.f + +let _ = + Printf.printf "Test 17, construction:\n"; + print_t17 t17_1; + print_t17 t17_2 + +(* Matching, projection *) +let f17_1 {c; d; f; _} r = + match r with + | { a; _ } -> + { a = Float.of_int r.e; + b = Float_u.(to_int (of_float a - d)); + c = Float_u.(r.c + c); + d = Float_u.(d - (of_int r.b)); + e = Float_u.(to_int (f + (of_int r.e))); + f = r.f; + dummy} + +let _ = + Printf.printf "Test 17, matching and projection:\n"; + print_t17 (f17_1 t17_1 t17_2) + +(* Record update and mutation *) +let f17_2 ({a; d; _} as r1) r2 = + r1.d <- Float_u.of_float 42.0; + let r3 = { r2 with c = r1.d; + d = Float_u.of_float 25.0 } + in + r3.b <- Float_u.(to_int (of_float a + d)); + r2.b <- 17; + r1.f <- r2.c; + r3 + +let _ = + Printf.printf "Test 17, record update and mutation:\n"; + let t17_3 = f17_2 t17_1 t17_2 in + print_t17 t17_1; + print_t17 t17_2; + print_t17 t17_3 + +(*********************************************) +(* Test 17.1: mixed constructor manipulation *) + +type t17_variant = + | Const + | T of { a : float; + dummy : string; + mutable b : int; + c : float#; + mutable d : float#; + e : int; + mutable f : float# } + +(* Construction *) +let t17_1 = T + { a = 3.17; + b = 13; + c = Float_u.of_float 7.31; + d = Float_u.of_float 1.41; + e = 6; + f = Float_u.of_float 27.1; + dummy; + } + +let t17_2 = T + { a = (-3.17); + b = -13; + c = Float_u.of_float (-7.31); + d = Float_u.of_float (-1.41); + e = -6; + f = Float_u.of_float (-27.1); + dummy; + } + +let[@warning "-partial-match"] print_t17_variant (T t17) = + print_float " a" t17.a; + print_int " b" t17.b; + print_floatu " c" t17.c; + print_floatu " d" t17.d; + print_int " e" t17.e; + print_floatu " f" t17.f + +let _ = + Printf.printf "Test 17.1, construction:\n"; + print_t17_variant t17_1; + print_t17_variant t17_2 + +(* Matching, projection *) +let[@warning "-partial-match"] f17_1 (T {c; d; f; _}) r = + match r with + | T ({ a; _ } as r) -> + T + { a = Float.of_int r.e; + b = Float_u.(to_int (of_float a - d)); + c = Float_u.(r.c + c); + d = Float_u.(d - (of_int r.b)); + e = Float_u.(to_int (f + (of_int r.e))); + f = r.f; + dummy} + +let _ = + Printf.printf "Test 17.1, matching and projection:\n"; + print_t17_variant (f17_1 t17_1 t17_2) + +(* Record update and mutation *) +let[@warning "-partial-match"] f17_2 (T ({a; d; _} as r1)) (T r2) = + r1.d <- Float_u.of_float 42.0; + let T r3 = T { r2 with c = r1.d; + d = Float_u.of_float 25.0 } + in + r3.b <- Float_u.(to_int (of_float a + d)); + r2.b <- 17; + r1.f <- r2.c; + T r3 + +let _ = + Printf.printf "Test 17.1, variant update and mutation:\n"; + let t17_3 = f17_2 t17_1 t17_2 in + print_t17_variant t17_1; + print_t17_variant t17_2; + print_t17_variant t17_3 + +(************************************************************) +(* Test 18: (float# + immediate) records in recursive groups *) + +let rec f r = + r.d <- Float_u.of_int t18_1.b; + t18_2.b <- 42; + t18_1.f <- Float_u.of_float t18_1.a; + Float_u.(of_float r.a + of_float t18_2.a) + + +and t18_1 = { a = 1.1; + b = 2; + c = Float_u.of_float 3.3; + d = Float_u.of_float 4.4; + e = 5; + f = Float_u.of_float 6.6; + dummy; + } + +and t18_2 = { a = (- 5.1); + b = -6; + c = Float_u.of_float (-7.3); + d = Float_u.of_float (-8.4); + e = -9; + f = Float_u.of_float (-10.6); + dummy; + } + +let _ = + Printf.printf "Test 18, (float#+imm) records in recursive groups:\n"; + print_t17 t18_1; + print_t17 t18_2; + let result = f t18_1 in + print_floatu " result (-4.00)" result; + print_t17 t18_1; + print_t17 t18_2 diff --git a/testsuite/tests/typing-layouts-float64/unboxed_floats_beta.reference b/testsuite/tests/typing-layouts-float64/unboxed_floats_beta.reference new file mode 100644 index 00000000000..bad536a4a87 --- /dev/null +++ b/testsuite/tests/typing-layouts-float64/unboxed_floats_beta.reference @@ -0,0 +1,191 @@ +Test 13, 610.68: : 610.68 + Test 13, step 0: 0.00 + Test 13, step 1: 0.00 + Test 13, step 2: 0.00 + Test 13, step 3: 0.00 + Test 13, step 4: 458.01 + Test 13, step 5: 305.34 + Test 13, step 6: 152.67 + Test 13, step 7: 0.00 + Test 13, step 8: 0.00 + Test 13, step 9: 0.00 +Test 14, construction: + a: 3.14 + b: 13.00 + c: 7.31 + d: 1.41 + e: 6.00 + f: 27.10 + a: -3.14 + b: -13.00 + c: -7.31 + d: -1.41 + e: -6.00 + f: -27.10 +Test 14, matching and projection: + a: -6.00 + b: -4.55 + c: 0.00 + d: 14.41 + e: 21.10 + f: -27.10 +Test 14, record update and mutation: + a: 3.14 + b: 13.00 + c: 7.31 + d: 42.00 + e: 6.00 + f: -7.31 + a: -3.14 + b: 17.00 + c: -7.31 + d: -1.41 + e: -6.00 + f: -27.10 + a: -3.14 + b: 4.55 + c: 42.00 + d: 25.00 + e: -6.00 + f: -27.10 +Test 15, (float#+float) records in recursive groups: + a: 1.10 + b: 2.00 + c: 3.30 + d: 4.40 + e: 5.00 + f: 6.60 + a: -5.10 + b: -6.00 + c: -7.30 + d: -8.40 + e: -9.00 + f: -10.60 + result (-4.00): -4.00 + a: 1.10 + b: 2.00 + c: 3.30 + d: 2.00 + e: 5.00 + f: 1.10 + a: -5.10 + b: 42.00 + c: -7.30 + d: -8.40 + e: -9.00 + f: -10.60 +Test 16, 610.68: : 610.68 + Test 16, step 0: 0.00 + Test 16, step 1: 0.00 + Test 16, step 2: 0.00 + Test 16, step 3: 0.00 + Test 16, step 4: 458.01 + Test 16, step 5: 305.34 + Test 16, step 6: 152.67 + Test 16, step 7: 0.00 + Test 16, step 8: 0.00 + Test 16, step 9: 0.00 +Test 17, construction: + a: 3.17 + b: 13 + c: 7.31 + d: 1.41 + e: 6 + f: 27.10 + a: -3.17 + b: -13 + c: -7.31 + d: -1.41 + e: -6 + f: -27.10 +Test 17, matching and projection: + a: -6.00 + b: -4 + c: 0.00 + d: 14.41 + e: 21 + f: -27.10 +Test 17, record update and mutation: + a: 3.17 + b: 13 + c: 7.31 + d: 42.00 + e: 6 + f: -7.31 + a: -3.17 + b: 17 + c: -7.31 + d: -1.41 + e: -6 + f: -27.10 + a: -3.17 + b: 4 + c: 42.00 + d: 25.00 + e: -6 + f: -27.10 +Test 17.1, construction: + a: 3.17 + b: 13 + c: 7.31 + d: 1.41 + e: 6 + f: 27.10 + a: -3.17 + b: -13 + c: -7.31 + d: -1.41 + e: -6 + f: -27.10 +Test 17.1, matching and projection: + a: -6.00 + b: -4 + c: 0.00 + d: 14.41 + e: 21 + f: -27.10 +Test 17.1, variant update and mutation: + a: 3.17 + b: 13 + c: 7.31 + d: 42.00 + e: 6 + f: -7.31 + a: -3.17 + b: 17 + c: -7.31 + d: -1.41 + e: -6 + f: -27.10 + a: -3.17 + b: 4 + c: 42.00 + d: 25.00 + e: -6 + f: -27.10 +Test 18, (float#+imm) records in recursive groups: + a: 1.10 + b: 2 + c: 3.30 + d: 4.40 + e: 5 + f: 6.60 + a: -5.10 + b: -6 + c: -7.30 + d: -8.40 + e: -9 + f: -10.60 + result (-4.00): -4.00 + a: 1.10 + b: 2 + c: 3.30 + d: 2.00 + e: 5 + f: 1.10 + a: -5.10 + b: 42 + c: -7.30 + d: -8.40 + e: -9 + f: -10.60 diff --git a/testsuite/tests/typing-layouts-float64/unboxed_floats_disabled.compilers.reference b/testsuite/tests/typing-layouts-float64/unboxed_floats_disabled.compilers.reference index ad4b78dea84..36bab1c7dd2 100644 --- a/testsuite/tests/typing-layouts-float64/unboxed_floats_disabled.compilers.reference +++ b/testsuite/tests/typing-layouts-float64/unboxed_floats_disabled.compilers.reference @@ -1,4 +1,4 @@ -File "unboxed_floats.ml", line 316, characters 25-31: -316 | let ( let* ) x (f : _ -> float#) = f x - ^^^^^^ -Error: This construct requires the beta version of the extension "layouts", which is disabled and cannot be used +File "unboxed_floats.ml", line 76, characters 11-16: +76 | let pi = #3.14 in + ^^^^^ +Error: The extension "layouts" is disabled and cannot be used diff --git a/testsuite/tests/typing-layouts-gadt-sort-var/insert.ml b/testsuite/tests/typing-layouts-gadt-sort-var/insert.ml index 96b6dbf656b..3da34aeb0e5 100644 --- a/testsuite/tests/typing-layouts-gadt-sort-var/insert.ml +++ b/testsuite/tests/typing-layouts-gadt-sort-var/insert.ml @@ -1,4 +1,4 @@ -type t_void [@@void] +type t_void : void let rec g (_ : t_void) = () diff --git a/testsuite/tests/typing-layouts-gadt-sort-var/insert_extensible.ml b/testsuite/tests/typing-layouts-gadt-sort-var/insert_extensible.ml index 1a1771a3bd3..4f07713ca5b 100644 --- a/testsuite/tests/typing-layouts-gadt-sort-var/insert_extensible.ml +++ b/testsuite/tests/typing-layouts-gadt-sort-var/insert_extensible.ml @@ -1,4 +1,4 @@ -type t_void [@@void] +type t_void : void let rec g (_ : t_void) = () diff --git a/testsuite/tests/typing-layouts-gadt-sort-var/test.compilers.reference b/testsuite/tests/typing-layouts-gadt-sort-var/test.compilers.reference index 6665ade1cc2..a8c052cedb5 100644 --- a/testsuite/tests/typing-layouts-gadt-sort-var/test.compilers.reference +++ b/testsuite/tests/typing-layouts-gadt-sort-var/test.compilers.reference @@ -3,4 +3,7 @@ File "insert.ml", line 5, characters 47-48: ^ Error: This expression has type t_void -> unit but an expression was expected of type 'a -> unit - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at file "insert.ml", line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because of layout requirements from an imported definition. diff --git a/testsuite/tests/typing-layouts-gadt-sort-var/test.ml b/testsuite/tests/typing-layouts-gadt-sort-var/test.ml index 20c599e5e62..148d8880481 100644 --- a/testsuite/tests/typing-layouts-gadt-sort-var/test.ml +++ b/testsuite/tests/typing-layouts-gadt-sort-var/test.ml @@ -1,14 +1,13 @@ (* TEST - - readonly_files = "gadt.ml insert.ml extract.ml" - flags = "-extension layouts_alpha" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - module = "gadt.ml" - *** ocamlc.byte - module = "extract.ml" - **** ocamlc.byte - module = "insert.ml" - ocamlc_byte_exit_status = "2" - ***** check-ocamlc.byte-output + readonly_files = "gadt.ml insert.ml extract.ml"; + flags = "-extension layouts_alpha"; + setup-ocamlc.byte-build-env; + module = "gadt.ml"; + ocamlc.byte; + module = "extract.ml"; + ocamlc.byte; + module = "insert.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.compilers.reference b/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.compilers.reference index 28c2a73fcfb..bb091c0cb43 100644 --- a/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.compilers.reference +++ b/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.compilers.reference @@ -3,4 +3,7 @@ File "insert_extensible.ml", line 5, characters 58-59: ^ Error: This expression has type t_void -> unit but an expression was expected of type 'a -> unit - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at file "insert_extensible.ml", line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because of layout requirements from an imported definition. diff --git a/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.ml b/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.ml index b0cea3fbcea..f22c5bafa36 100644 --- a/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.ml +++ b/testsuite/tests/typing-layouts-gadt-sort-var/test_extensible.ml @@ -1,14 +1,13 @@ (* TEST - - readonly_files = "gadt_extensible.ml insert_extensible.ml extract_extensible.ml" - flags = "-extension layouts_alpha" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - module = "gadt_extensible.ml" - *** ocamlc.byte - module = "extract_extensible.ml" - **** ocamlc.byte - module = "insert_extensible.ml" - ocamlc_byte_exit_status = "2" - ***** check-ocamlc.byte-output + readonly_files = "gadt_extensible.ml insert_extensible.ml extract_extensible.ml"; + flags = "-extension layouts_alpha"; + setup-ocamlc.byte-build-env; + module = "gadt_extensible.ml"; + ocamlc.byte; + module = "extract_extensible.ml"; + ocamlc.byte; + module = "insert_extensible.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/typing-layouts-missing-cmi/a.ml b/testsuite/tests/typing-layouts-missing-cmi/a.ml index 66deb585363..81191097e5e 100644 --- a/testsuite/tests/typing-layouts-missing-cmi/a.ml +++ b/testsuite/tests/typing-layouts-missing-cmi/a.ml @@ -2,4 +2,4 @@ use any non-value layout. *) type a_imm = A type a_value = string -(* type a_void [@@void] *) +(* type a_void : void *) diff --git a/testsuite/tests/typing-layouts-missing-cmi/c.ml b/testsuite/tests/typing-layouts-missing-cmi/c.ml index 40e130a9754..d6b5471e354 100644 --- a/testsuite/tests/typing-layouts-missing-cmi/c.ml +++ b/testsuite/tests/typing-layouts-missing-cmi/c.ml @@ -1,15 +1,14 @@ (* TEST - -readonly_files = "a.ml b.ml" -flags = "-extension layouts_beta" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "a.ml" -*** ocamlc.byte -module = "b.ml" -**** script -script = "rm -f a.cmi" -***** expect + readonly_files = "a.ml b.ml"; + flags = "-extension layouts_beta"; + setup-ocamlc.byte-build-env; + module = "a.ml"; + ocamlc.byte; + module = "b.ml"; + ocamlc.byte; + script = "rm -f a.cmi"; + script; + expect; *) (* CR layouts v2.5: The commented out code in this file uses void, but could @@ -45,8 +44,10 @@ Line 1, characters 12-19: ^^^^^^^ Error: This type B.b_value = A.a_value should be an instance of type ('a : immediate) - B.b_value has an unknown layout, - which might not be a sublayout of immediate. + The kind of B.b_value is value + because the .cmi file for A.a_value is missing. + But the kind of B.b_value must be a subkind of immediate + because of the definition of imm_arg at line 3, characters 0-29. No .cmi file found containing A.a_value. Hint: Adding "a" to your dependencies might help. |}];; diff --git a/testsuite/tests/typing-layouts-missing-cmi/function_arg.ml b/testsuite/tests/typing-layouts-missing-cmi/function_arg.ml index 98f31cdf84b..bf097559071 100644 --- a/testsuite/tests/typing-layouts-missing-cmi/function_arg.ml +++ b/testsuite/tests/typing-layouts-missing-cmi/function_arg.ml @@ -1,14 +1,13 @@ (* TEST - -readonly_files = "function_a.ml function_b.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "function_a.ml" -*** ocamlc.byte -module = "function_b.ml" -**** script -script = "rm -f function_a.cmi" -***** expect + readonly_files = "function_a.ml function_b.ml"; + setup-ocamlc.byte-build-env; + module = "function_a.ml"; + ocamlc.byte; + module = "function_b.ml"; + ocamlc.byte; + script = "rm -f function_a.cmi"; + script; + expect; *) #directory "ocamlc.byte";; @@ -24,7 +23,10 @@ Line 1, characters 40-54: 1 | let f0 (g : Function_b.fun_t) = g ~arg1:(assert false) ^^^^^^^^^^^^^^ Error: Function arguments and returns must be representable. - Function_a.t has an unknown layout, which might not be representable. + The layout of Function_a.t is any + because the .cmi file for Function_a.t is missing. + But the layout of Function_a.t must be representable + because we must know concretely how to pass a function argument. No .cmi file found containing Function_a.t. Hint: Adding "function_a" to your dependencies might help. |}] @@ -36,7 +38,10 @@ Line 1, characters 34-36: 1 | let f1 (g : Function_b.fun_t) = g () ^^ Error: Function arguments and returns must be representable. - Function_a.t has an unknown layout, which might not be representable. + The layout of Function_a.t is any + because the .cmi file for Function_a.t is missing. + But the layout of Function_a.t must be representable + because we must know concretely how to pass a function argument. No .cmi file found containing Function_a.t. Hint: Adding "function_a" to your dependencies might help. |}] @@ -48,7 +53,10 @@ Line 1, characters 28-56: 1 | let f2 : Function_b.fun_t = fun ~arg1:_ ~arg2 () -> arg2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Function arguments and returns must be representable. - Function_a.t has an unknown layout, which might not be representable. + The layout of Function_a.t is any + because the .cmi file for Function_a.t is missing. + But the layout of Function_a.t must be representable + because we must know concretely how to pass a function argument. No .cmi file found containing Function_a.t. Hint: Adding "function_a" to your dependencies might help. |}] @@ -60,7 +68,10 @@ Line 1, characters 31-53: 1 | let f3 : Function_b.return_t = fun () -> assert false ^^^^^^^^^^^^^^^^^^^^^^ Error: Function arguments and returns must be representable. - Function_a.t has an unknown layout, which might not be representable. + The layout of Function_a.t is any + because the .cmi file for Function_a.t is missing. + But the layout of Function_a.t must be representable + because we must know concretely how to return a function result. No .cmi file found containing Function_a.t. Hint: Adding "function_a" to your dependencies might help. |}] @@ -74,7 +85,10 @@ Line 2, characters 12-28: 2 | let x1 = f4 Function_b.f_opt ^^^^^^^^^^^^^^^^ Error: Function arguments and returns must be representable. - Function_a.t has an unknown layout, which might not be representable. + The layout of Function_a.t is any + because the .cmi file for Function_a.t is missing. + But the layout of Function_a.t must be representable + because we must know concretely how to pass a function argument. No .cmi file found containing Function_a.t. Hint: Adding "function_a" to your dependencies might help. |}] @@ -88,7 +102,10 @@ Line 2, characters 12-30: 2 | let x2 = f5 Function_b.f_opt_2 ^^^^^^^^^^^^^^^^^^ Error: Function arguments and returns must be representable. - Function_a.t has an unknown layout, which might not be representable. + The layout of Function_a.t is any + because the .cmi file for Function_a.t is missing. + But the layout of Function_a.t must be representable + because we must know concretely how to return a function result. No .cmi file found containing Function_a.t. Hint: Adding "function_a" to your dependencies might help. |}] diff --git a/testsuite/tests/typing-layouts-or-null/array.ml b/testsuite/tests/typing-layouts-or-null/array.ml new file mode 100644 index 00000000000..633241afaae --- /dev/null +++ b/testsuite/tests/typing-layouts-or-null/array.ml @@ -0,0 +1,39 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(* Array type arguments are [any_non_null]: *) + +type t_any : any + +type should_fail = t_any array + +[%%expect{| +type t_any : any +Line 3, characters 19-24: +3 | type should_fail = t_any array + ^^^^^ +Error: This type t_any should be an instance of type ('a : any_non_null) + The kind of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the kind of t_any must be a subkind of any_non_null + because it's the type argument to the array type. +|}] + +type t_value_or_null : value_or_null + +type should_fail = t_value_or_null array + +[%%expect{| +type t_value_or_null : value_or_null +Line 3, characters 19-34: +3 | type should_fail = t_value_or_null array + ^^^^^^^^^^^^^^^ +Error: This type t_value_or_null should be an instance of type + ('a : any_non_null) + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 1, characters 0-36. + But the kind of t_value_or_null must be a subkind of any_non_null + because it's the type argument to the array type. +|}] diff --git a/testsuite/tests/typing-layouts-or-null/basics.ml b/testsuite/tests/typing-layouts-or-null/basics.ml new file mode 100644 index 00000000000..0a4f403dde4 --- /dev/null +++ b/testsuite/tests/typing-layouts-or-null/basics.ml @@ -0,0 +1,472 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +type t_any : any +type t_any_non_null : any_non_null +type t_value_or_null : value_or_null +type t_value : value +type t_bits64 : bits64 + +[%%expect{| +type t_any : any +type t_any_non_null : any_non_null +type t_value_or_null : value_or_null +type t_value : value +type t_bits64 : bits64 +|}] + +(* [any_non_null] is not representable *) +let f (x : t_any_non_null) = x + +[%%expect{| +Line 1, characters 6-26: +1 | let f (x : t_any_non_null) = x + ^^^^^^^^^^^^^^^^^^^^ +Error: This pattern matches values of type t_any_non_null + but a pattern was expected which matches values of type + ('a : '_representable_layout_1) + The layout of t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of t_any_non_null must be representable + because we must know concretely how to pass a function argument. +|}] + +type t = { x : t_any_non_null } + +[%%expect{| +Line 1, characters 11-29: +1 | type t = { x : t_any_non_null } + ^^^^^^^^^^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of t_any_non_null must be representable + because it is the type of record field x. +|}] + +module type S1 = sig + val x : t_any_non_null +end + +[%%expect{| +Line 2, characters 10-24: +2 | val x : t_any_non_null + ^^^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of type t_any_non_null must be a sublayout of value + because it's the type of something stored in a module structure. +|}] + +module type S2 = sig + val f : unit -> t_any + val g : unit -> t_any_non_null +end + +[%%expect{| +module type S2 = sig val f : unit -> t_any val g : unit -> t_any_non_null end +|}] + +module M2 (X : S2) = struct + let g () = X.g () +end + +[%%expect{| +Line 2, characters 13-19: +2 | let g () = X.g () + ^^^^^^ +Error: This expression has type t_any_non_null + but an expression was expected of type ('a : '_representable_layout_2) + The layout of t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of t_any_non_null must be representable + because we must know concretely how to return a function result. +|}] + +(* [value_or_null] is representable *) + +let f (x : t_value_or_null) = x + +[%%expect{| +val f : t_value_or_null -> t_value_or_null = +|}] + +type t = { x : t_value_or_null } + +[%%expect {| +type t = { x : t_value_or_null; } +|}] + +module type S1 = sig + val x : t_value_or_null +end + +[%%expect {| +module type S1 = sig val x : t_value_or_null end +|}] + +module type S2 = sig + val f : unit -> t_value_or_null +end + +[%%expect {| +module type S2 = sig val f : unit -> t_value_or_null end +|}] + +module M2 (X : S2) = struct + let f () = X.f () +end + +[%%expect{| +module M2 : functor (X : S2) -> sig val f : unit -> t_value_or_null end +|}] + +type ('a : any) id_any = 'a +type ('a : any_non_null) id_any_non_null = 'a +type ('a : value_or_null) id_value_or_null = 'a +type ('a : value) id_value = 'a +type ('a : bits64) id_bits64 = 'a + +[%%expect{| +type ('a : any) id_any = 'a +type ('a : any_non_null) id_any_non_null = 'a +type ('a : value_or_null) id_value_or_null = 'a +type 'a id_value = 'a +type ('a : bits64) id_bits64 = 'a +|}] + +(* [any_non_null] is a sublayout of [any] *) + +type t = t_any_non_null id_any + +[%%expect{| +type t = t_any_non_null id_any +|}] + +module M (X : sig type t : any_non_null end) : sig type t : any end = X + +[%%expect{| +module M : + functor (X : sig type t : any_non_null end) -> sig type t : any end +|}] + +(* [any] is not a sublayout of [any_non_null] *) + +type t = t_any id_any_non_null + +[%%expect{| +Line 1, characters 9-14: +1 | type t = t_any id_any_non_null + ^^^^^ +Error: This type t_any should be an instance of type ('a : any_non_null) + The kind of t_any is any + because of the definition of t_any at line 1, characters 0-16. + But the kind of t_any must be a subkind of any_non_null + because of the definition of id_any_non_null at line 2, characters 0-45. +|}] + +module M (X : sig type t : any end) : sig type t : any_non_null end = X + +[%%expect{| +Line 1, characters 70-71: +1 | module M (X : sig type t : any end) : sig type t : any_non_null end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig type t = X.t end + is not included in + sig type t : any_non_null end + Type declarations do not match: + type t = X.t + is not included in + type t : any_non_null + The kind of the first is any + because of the definition of t at line 1, characters 18-30. + But the kind of the first must be a subkind of any_non_null + because of the definition of t at line 1, characters 42-63. +|}] + +(* [value] is a sublayout of [value_or_null] *) + +type t = t_value id_value_or_null + +[%%expect{| +type t = t_value id_value_or_null +|}] + +module M (X : sig type t : value end) : sig type t : value_or_null end = X + +[%%expect{| +module M : + functor (X : sig type t : value end) -> sig type t : value_or_null end +|}] + +(* [value_or_null] is not a sublayout of [value] *) + +type t = t_value_or_null id_value + +[%%expect{| +Line 1, characters 9-24: +1 | type t = t_value_or_null id_value + ^^^^^^^^^^^^^^^ +Error: This type t_value_or_null should be an instance of type ('a : value) + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 3, characters 0-36. + But the kind of t_value_or_null must be a subkind of value + because of the definition of id_value at line 4, characters 0-31. +|}] + +module M (X : sig type t : value_or_null end) : sig type t : value end = X + +[%%expect{| +Line 1, characters 73-74: +1 | module M (X : sig type t : value_or_null end) : sig type t : value end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig type t = X.t end + is not included in + sig type t : value end + Type declarations do not match: + type t = X.t + is not included in + type t : value + The kind of the first is value_or_null + because of the definition of t at line 1, characters 18-40. + But the kind of the first must be a subkind of value + because of the definition of t at line 1, characters 52-66. +|}] + +(* [value] is a sublayout of [any_non_null] *) + +type t = t_value id_any_non_null + +[%%expect{| +type t = t_value id_any_non_null +|}] + +module M (X : sig type t : value end) : sig type t : any_non_null end = X + +[%%expect{| +module M : + functor (X : sig type t : value end) -> sig type t : any_non_null end +|}] + +(* [value_or_null] is not a sublayout of [any_non_null] *) + +type t = t_value_or_null id_any_non_null + +[%%expect{| +Line 1, characters 9-24: +1 | type t = t_value_or_null id_any_non_null + ^^^^^^^^^^^^^^^ +Error: This type t_value_or_null should be an instance of type + ('a : any_non_null) + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 3, characters 0-36. + But the kind of t_value_or_null must be a subkind of any_non_null + because of the definition of id_any_non_null at line 2, characters 0-45. +|}] + +module M (X : sig type t : value_or_null end) : sig type t : any_non_null end = X + +[%%expect{| +Line 1, characters 80-81: +1 | module M (X : sig type t : value_or_null end) : sig type t : any_non_null end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig type t = X.t end + is not included in + sig type t : any_non_null end + Type declarations do not match: + type t = X.t + is not included in + type t : any_non_null + The kind of the first is value_or_null + because of the definition of t at line 1, characters 18-40. + But the kind of the first must be a subkind of any_non_null + because of the definition of t at line 1, characters 52-73. +|}] + +(* [value_or_null] is a sublayout of [any] *) + +type t = t_value_or_null id_any + +[%%expect{| +type t = t_value_or_null id_any +|}] + +module M (X : sig type t : value_or_null end) : sig type t : any end = X + +[%%expect{| +module M : + functor (X : sig type t : value_or_null end) -> sig type t : any end +|}] + +(* [bits64] (and presumably similar jkinds) is a sublayout of [any_non_null] *) + +type t = t_bits64 id_any_non_null + +[%%expect{| +type t = t_bits64 id_any_non_null +|}] + +module M (X : sig type t : bits64 end) : sig type t : any_non_null end = X + +[%%expect{| +module M : + functor (X : sig type t : bits64 end) -> sig type t : any_non_null end +|}] + +(* [any_non_null] is not a sublayout of [value] *) + +type t = t_any_non_null id_value + +[%%expect{| +Line 1, characters 9-23: +1 | type t = t_any_non_null id_value + ^^^^^^^^^^^^^^ +Error: This type t_any_non_null should be an instance of type ('a : value) + The layout of t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of t_any_non_null must be a sublayout of value + because of the definition of id_value at line 4, characters 0-31. +|}] + +module M (X : sig type t : any_non_null end) : sig type t : value end = X + +[%%expect{| +Line 1, characters 72-73: +1 | module M (X : sig type t : any_non_null end) : sig type t : value end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig type t = X.t end + is not included in + sig type t : value end + Type declarations do not match: + type t = X.t + is not included in + type t : value + The layout of the first is any + because of the definition of t at line 1, characters 18-39. + But the layout of the first must be a sublayout of value + because of the definition of t at line 1, characters 51-65. +|}] + +(* [any_non_null] is not a sublayout of [value_or_null] *) + +type t = t_any_non_null id_value_or_null + +[%%expect{| +Line 1, characters 9-23: +1 | type t = t_any_non_null id_value_or_null + ^^^^^^^^^^^^^^ +Error: This type t_any_non_null should be an instance of type + ('a : value_or_null) + The layout of t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of t_any_non_null must be a sublayout of value + because of the definition of id_value_or_null at line 3, characters 0-47. +|}] + +module M (X : sig type t : any_non_null end) : sig type t : value_or_null end = X + +[%%expect{| +Line 1, characters 80-81: +1 | module M (X : sig type t : any_non_null end) : sig type t : value_or_null end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig type t = X.t end + is not included in + sig type t : value_or_null end + Type declarations do not match: + type t = X.t + is not included in + type t : value_or_null + The layout of the first is any + because of the definition of t at line 1, characters 18-39. + But the layout of the first must be a sublayout of value + because of the definition of t at line 1, characters 51-73. +|}] + +(* [any_non_null] is not a sublayout of [bits64] (and presumably similar jkinds) *) + +type t = t_any_non_null id_bits64 + +[%%expect{| +Line 1, characters 9-23: +1 | type t = t_any_non_null id_bits64 + ^^^^^^^^^^^^^^ +Error: This type t_any_non_null should be an instance of type ('a : bits64) + The layout of t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of t_any_non_null must be a sublayout of bits64 + because of the definition of id_bits64 at line 5, characters 0-33. +|}] + +module M (X : sig type t : any_non_null end) : sig type t : bits64 end = X + +[%%expect{| +Line 1, characters 73-74: +1 | module M (X : sig type t : any_non_null end) : sig type t : bits64 end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig type t = X.t end + is not included in + sig type t : bits64 end + Type declarations do not match: + type t = X.t + is not included in + type t : bits64 + The layout of the first is any + because of the definition of t at line 1, characters 18-39. + But the layout of the first must be a sublayout of bits64 + because of the definition of t at line 1, characters 51-66. +|}] + +(* The meet of [any_non_null] and [value_or_null] is [value] *) + +type (_, _) two + +type ('a : any) t1 = ('a id_any_non_null, 'a id_value_or_null) two + +type should_work = t_value t1 + +[%%expect{| +type (_, _) two +type 'a t1 = ('a id_any_non_null, 'a id_value_or_null) two +type should_work = t_value t1 +|}] + +type should_fail = t_value_or_null t1 + +[%%expect{| +Line 1, characters 19-34: +1 | type should_fail = t_value_or_null t1 + ^^^^^^^^^^^^^^^ +Error: This type t_value_or_null should be an instance of type ('a : value) + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 3, characters 0-36. + But the kind of t_value_or_null must be a subkind of value + because of the definition of t1 at line 3, characters 0-66. +|}] + +type should_fail = t_any_non_null t1 + +[%%expect{| +Line 1, characters 19-33: +1 | type should_fail = t_any_non_null t1 + ^^^^^^^^^^^^^^ +Error: This type t_any_non_null should be an instance of type ('a : value) + The layout of t_any_non_null is any + because of the definition of t_any_non_null at line 2, characters 0-34. + But the layout of t_any_non_null must be a sublayout of value + because of the definition of t1 at line 3, characters 0-66. +|}] diff --git a/testsuite/tests/typing-layouts-or-null/variables.ml b/testsuite/tests/typing-layouts-or-null/variables.ml new file mode 100644 index 00000000000..60dd2fb8e96 --- /dev/null +++ b/testsuite/tests/typing-layouts-or-null/variables.ml @@ -0,0 +1,399 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +type t_value_or_null : value_or_null +type ('a : value_or_null) id_value_or_null = 'a + +[%%expect{| +type t_value_or_null : value_or_null +type ('a : value_or_null) id_value_or_null = 'a +|}] + +(* Type parameters default to [value] and need + explicit annotations to accept [value_or_null]. *) + +type 'a should_not_accept_or_null = 'a id_value_or_null + +type should_not_work = t_value_or_null should_not_accept_or_null +type should_not_work = t_value_or_null should_not_accept_or_null + +[%%expect{| +type 'a should_not_accept_or_null = 'a id_value_or_null +Line 3, characters 23-38: +3 | type should_not_work = t_value_or_null should_not_accept_or_null + ^^^^^^^^^^^^^^^ +Error: This type t_value_or_null should be an instance of type ('a : value) + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 1, characters 0-36. + But the kind of t_value_or_null must be a subkind of value + because of the definition of should_not_accept_or_null at line 1, characters 0-55. +|}] + +(* [value_or_null] is accepted for function arguments and results. *) + +let should_work (x : t_value_or_null) = x + +[%%expect{| +val should_work : t_value_or_null -> t_value_or_null = +|}] + +(* Type variables in function definitions default to [value]. *) + +module type S = sig + val should_not_work : 'a -> unit +end + +module M (X : S) : sig + val should_not_work : ('a : value_or_null) . 'a -> unit +end = X + +[%%expect{| +module type S = sig val should_not_work : 'a -> unit end +Line 7, characters 6-7: +7 | end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig val should_not_work : 'a -> unit end + is not included in + sig val should_not_work : ('a : value_or_null). 'a -> unit end + Values do not match: + val should_not_work : 'a -> unit + is not included in + val should_not_work : ('a : value_or_null). 'a -> unit + The type 'a -> unit is not compatible with the type 'b -> unit + The kind of 'a is value_or_null + because of the definition of should_not_work at line 6, characters 2-57. + But the kind of 'a must be a subkind of value + because of the definition of should_not_work at line 2, characters 2-34. +|}] + +(* Type parameters default to [value] for fully abstract types *) + +module M (X : sig type 'a t end) : sig type ('a : value_or_null) t end = X + +[%%expect{| +Line 1, characters 73-74: +1 | module M (X : sig type 'a t end) : sig type ('a : value_or_null) t end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig type 'a t = 'a X.t end + is not included in + sig type ('a : value_or_null) t end + Type declarations do not match: + type 'a t = 'a X.t + is not included in + type ('a : value_or_null) t + Their parameters differ: + The type ('a : value) is not equal to the type ('a0 : value_or_null) + because their layouts are different. +|}] + +(* Ttype parameters default to [value] for abstract types with equalities. *) + +module type S = sig + type 'a t = 'a + + type t2 = t_value_or_null t +end + +[%%expect{| +Line 4, characters 12-27: +4 | type t2 = t_value_or_null t + ^^^^^^^^^^^^^^^ +Error: This type t_value_or_null should be an instance of type ('a : value) + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 1, characters 0-36. + But the kind of t_value_or_null must be a subkind of value + because of the definition of t at line 2, characters 2-16. +|}] + +(* CR layouts v3.0: the sublayout check should accept this for backwards + compatibility. *) + +module M : sig + type 'a t +end = struct + type ('a : value_or_null) t = 'a +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type ('a : value_or_null) t = 'a +5 | end +Error: Signature mismatch: + Modules do not match: + sig type ('a : value_or_null) t = 'a end + is not included in + sig type 'a t end + Type declarations do not match: + type ('a : value_or_null) t = 'a + is not included in + type 'a t + Their parameters differ: + The type ('a : value_or_null) is not equal to the type ('a0 : value) + because their layouts are different. +|}] + +(* Type parameters default to [value] for non-abstract types. *) + +module type S = sig + type 'a t = Value of 'a + + type t2 = t_value_or_null t +end + +[%%expect{| +Line 4, characters 12-27: +4 | type t2 = t_value_or_null t + ^^^^^^^^^^^^^^^ +Error: This type t_value_or_null should be an instance of type ('a : value) + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 1, characters 0-36. + But the kind of t_value_or_null must be a subkind of value + because of the definition of t at line 2, characters 2-25. +|}] + +(* Rigid type variables default to [value]. *) + +module M : sig + val f : ('a : value_or_null). 'a -> 'a +end = struct + let f (type a) (x : a) = x +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | let f (type a) (x : a) = x +5 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + sig val f : ('a : value_or_null). 'a -> 'a end + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : value_or_null). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The kind of 'a is value_or_null + because of the definition of f at line 2, characters 2-40. + But the kind of 'a must be a subkind of value + because of the definition of f at line 4, characters 8-28. +|}] + +module M : sig + val f : ('a : value_or_null). 'a -> 'a +end = struct + let f : 'a. 'a -> 'a = fun x -> x +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | let f : 'a. 'a -> 'a = fun x -> x +5 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + sig val f : ('a : value_or_null). 'a -> 'a end + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : value_or_null). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The kind of 'a is value_or_null + because of the definition of f at line 2, characters 2-40. + But the kind of 'a must be a subkind of value + because of the definition of f at line 4, characters 6-7. +|}] + + +module M : sig + val f : ('a : value_or_null) . 'a -> 'a +end = struct + let f : type a. a -> a = fun x -> x +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | let f : type a. a -> a = fun x -> x +5 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + sig val f : ('a : value_or_null). 'a -> 'a end + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : value_or_null). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The kind of 'a is value_or_null + because of the definition of f at line 2, characters 2-41. + But the kind of 'a must be a subkind of value + because of the definition of f at line 4, characters 6-7. +|}] + + +module M : sig + val f : ('a : value_or_null) . 'a -> 'a +end = struct + let f : type a. a -> a = fun x -> x +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | let f : type a. a -> a = fun x -> x +5 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + sig val f : ('a : value_or_null). 'a -> 'a end + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : value_or_null). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The kind of 'a is value_or_null + because of the definition of f at line 2, characters 2-41. + But the kind of 'a must be a subkind of value + because of the definition of f at line 4, characters 6-7. +|}] + +(* CR layouts v3.0: this should work. *) + +module M : sig + val f : ('a : value_or_null) . 'a -> 'a +end = struct + let f : type a. a -> a = fun x -> x +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | let f : type a. a -> a = fun x -> x +5 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + sig val f : ('a : value_or_null). 'a -> 'a end + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : value_or_null). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The kind of 'a is value_or_null + because of the definition of f at line 2, characters 2-41. + But the kind of 'a must be a subkind of value + because of the definition of f at line 4, characters 6-7. +|}] + +(* CR layouts v3.0: annotations on non-rigid type variables are upper bounds. + This is in line with similar OCaml behavior, but is confusing. *) + +module M : sig + val f : ('a : value_or_null) -> 'a +end = struct + let f (type a) (x : a) = x +end + +[%%expect{| +module M : sig val f : 'a -> 'a end +|}] + +(* GADTs and constraints tests. *) + +type (!'a : value_or_null) dummy + +(* This must infer ('a : value) for backwards compatibility. *) +type t = Packed : 'a dummy -> t + +[%%expect{| +type (!'a : value_or_null) dummy +type t = Packed : 'a dummy -> t +|}] + +(* Annotations here are upper bounds, so due to defaulting we can't + set ['a : value_or_null]. *) +type t = Packed : ('a : value_or_null) dummy -> t +[%%expect{| +type t = Packed : 'a dummy -> t +|}] + +(* However, this works. *) +type t = Packed : ('a : value_or_null). 'a dummy -> t +[%%expect{| +type t = Packed : ('a : value_or_null). 'a dummy -> t +|}] + +(* Variables on the right side of constraints default to non-null. + This must be the case for backwards compatibility: ['b constrained] + below should be a [value] to allow upgrading existing types like [list] + to accept [value_or_null]. *) +type 'b constrained = 'a constraint 'b = 'a dummy + +[%%expect{| +type 'b constrained = 'a constraint 'b = 'a dummy +|}] + +type fails = bool constrained + +[%%expect{| +Line 1, characters 13-17: +1 | type fails = bool constrained + ^^^^ +Error: This type bool should be an instance of type 'a dummy +|}] + +type fails = (t_value_or_null dummy) constrained + +[%%expect{| +Line 1, characters 14-35: +1 | type fails = (t_value_or_null dummy) constrained + ^^^^^^^^^^^^^^^^^^^^^ +Error: This type t_value_or_null dummy should be an instance of type 'a dummy + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 1, characters 0-36. + But the kind of t_value_or_null must be a subkind of value + because of the definition of constrained at line 1, characters 0-49. +|}] + +type succeeds = (int dummy) constrained + +[%%expect{| +type succeeds = int dummy constrained +|}] + +(* CR layouts v3.0: we can't set a variable on the right side of + the constraint to be [maybe_null]. This might be hard to fix, see + [Note about [new_var_jkind]]. *) +type ('c : value_or_null) constrained' = bool + constraint 'c = ('a : value_or_null) dummy + +[%%expect{| +type 'b constrained' = bool constraint 'b = 'a dummy +|}] + +type fails = (t_value_or_null dummy) constrained' + +[%%expect{| +Line 1, characters 14-35: +1 | type fails = (t_value_or_null dummy) constrained' + ^^^^^^^^^^^^^^^^^^^^^ +Error: This type t_value_or_null dummy should be an instance of type 'a dummy + The kind of t_value_or_null is value_or_null + because of the definition of t_value_or_null at line 1, characters 0-36. + But the kind of t_value_or_null must be a subkind of value + because of the definition of constrained' at lines 1-2, characters 0-44. +|}] diff --git a/testsuite/tests/typing-layouts-word/alloc.ml b/testsuite/tests/typing-layouts-word/alloc.ml new file mode 100644 index 00000000000..26d0a1e1b3d --- /dev/null +++ b/testsuite/tests/typing-layouts-word/alloc.ml @@ -0,0 +1,112 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + native; +*) + +(* A test comparing allocations when using unboxed [nativeint#]es to allocations + when using boxed [nativeints]. *) + +(* Hide polymorphic equality *) +let ( = ) = Int.equal + +module Nativeint = struct + include Nativeint + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( = ) = equal +end + +module Nativeint_u = struct + include Stdlib_upstream_compatible.Nativeint_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( = ) = equal +end + +let baseline_allocation = + let first = Gc.allocated_bytes () in + let second = Gc.allocated_bytes () in + second -. first + +let measure_alloc fmt f = + let before = Gc.allocated_bytes () in + let result = (f[@inlined never]) () in + let after = Gc.allocated_bytes () in + let alloc = (after -. before) -. baseline_allocation in + Printf.printf (fmt ^^ "; %s\n") + (Nativeint_u.to_nativeint result) + (if alloc > 0.0 then "allocated" else "did not allocate") + +(* We mark key functions [[@inline never]]. Without this, flambda2 might be + able to eliminate all allocations in the boxed case, and it's important to + have neither inlined for a fair comparison. (This was the case in the + [float64] version of this test. *) + +module Collatz_unboxed = struct + open Nativeint_u + + let[@inline never] rec collatz_count' count n = + if n = of_nativeint 1n then + count + else + collatz_count' + (succ count) + (if n %% of_nativeint 2n = of_nativeint 0n then + n // of_nativeint 2n + else + of_nativeint 3n * n + of_nativeint 1n) + + let collatz_count n = collatz_count' (of_nativeint 0n) n + + let go () = + measure_alloc "Unboxed: Collatz took %nd steps to reach 1" + (fun () -> collatz_count (of_nativeint 27n)) +end + +module Collatz_boxed = struct + open Nativeint + + let[@inline never] rec collatz_count' count n = + if n = 1n then + count + else + collatz_count' + (succ count) + (if n %% 2n = 0n then + n // 2n + else + 3n*n + 1n) + + let collatz_count n = Nativeint_u.of_nativeint (collatz_count' 0n n) + + let go () = + measure_alloc "Boxed: Collatz took %nd steps to reach 1" + (fun () -> collatz_count 27n) +end + +let () = Collatz_unboxed.go () +let () = Collatz_boxed.go () + +let[@inline never] literal_test x y = + let open Nativeint_u in + let[@inline never] f x y = (#1n + x) * (y - #4n) in + match x with + | #2n | #0x7fffffffffffffffn -> (f x y) / (#3n % #10n) + | _ -> #0n + +let _ = measure_alloc "literals (should be -1): %nd" (fun () -> literal_test #2n #3n) +let _ = measure_alloc "literals (should be -3074457345618258602): %nd" + (fun () -> literal_test #0x7fffffffffffffffn #0x7fffffffffffffffn) diff --git a/testsuite/tests/typing-layouts-word/alloc.reference b/testsuite/tests/typing-layouts-word/alloc.reference new file mode 100644 index 00000000000..98ca450330f --- /dev/null +++ b/testsuite/tests/typing-layouts-word/alloc.reference @@ -0,0 +1,4 @@ +Unboxed: Collatz took 111 steps to reach 1; did not allocate +Boxed: Collatz took 111 steps to reach 1; allocated +literals (should be -1): -1; did not allocate +literals (should be -3074457345618258602): -3074457345618258602; did not allocate diff --git a/testsuite/tests/typing-layouts-word/basics.ml b/testsuite/tests/typing-layouts-word/basics.ml new file mode 100644 index 00000000000..cfc29c6f8b2 --- /dev/null +++ b/testsuite/tests/typing-layouts-word/basics.ml @@ -0,0 +1,778 @@ +(* TEST + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } +*) + +(* This file contains typing tests for the layout [word]. + + Runtime tests for the type [nativeint#] can be found in the + [unboxed_nativeint], [alloc], and [test_nativeint_u] tests in this + directory. The type [nativeint#] here is used as a convenient example of a + concrete [word] type in some tests, but its behavior isn't the primary + purpose of this test. *) + +type t_word : word +type ('a : word) t_word_id = 'a + +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_word) = x;; +let f1_2 (x : 'a t_word_id) = x;; +let f1_3 (x : nativeint#) = x;; +[%%expect{| +type t_word : word +type ('a : word) t_word_id = 'a +val f1_1 : t_word -> t_word = +val f1_2 : ('a : word). 'a t_word_id -> 'a t_word_id = +val f1_3 : nativeint# -> nativeint# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_word) = + let y = x in + y;; + +let f2_2 (x : 'a t_word_id) = + let y = x in + y;; + +let f2_3 (x : nativeint#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_word -> t_word = +val f2_2 : ('a : word). 'a t_word_id -> 'a t_word_id = +val f2_3 : nativeint# -> nativeint# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_word = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_word = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout word. +|}];; + +let x3_2 : 'a t_word_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_word_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout word. +|}];; + +let x3_3 : nativeint# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : nativeint# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout word. +|}];; + +module M3_4 = struct + let x : t_word = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_word = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout word. +|}];; + +module M3_5 = struct + let f (x : nativeint#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout word. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_word) = x, false;; +[%%expect{| +Line 1, characters 24-25: +1 | let f4_1 (x : t_word) = x, false;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_word_id) = x, false;; +[%%expect{| +Line 1, characters 30-31: +1 | let f4_2 (x : 'a t_word_id) = x, false;; + ^ +Error: This expression has type 'a t_word_id = ('a : word) + but an expression was expected of type ('b : value) + The layout of 'a t_word_id is word + because of the definition of t_word_id at line 2, characters 0-31. + But the layout of 'a t_word_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : nativeint#) = x, false;; +[%%expect{| +Line 1, characters 28-29: +1 | let f4_3 (x : nativeint#) = x, false;; + ^ +Error: This expression has type nativeint# + but an expression was expected of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_word * string;; +[%%expect{| +Line 1, characters 12-18: +1 | type t4_4 = t_word * string;; + ^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * nativeint#;; +[%%expect{| +Line 1, characters 18-28: +1 | type t4_5 = int * nativeint#;; + ^^^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : word) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 24-26: +1 | type ('a : word) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : word, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 29-31: +1 | type ('a : word, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(****************************************************) +(* Test 5: Allowed in some structures in typedecls. *) + +type t5_1 = { x : t_word };; +[%%expect{| +type t5_1 = { x : t_word; } +|}];; + +type t5_2 = { y : int; x : t_word };; +[%%expect{| +type t5_2 = { y : int; x : t_word; } +|}];; + +type t5_2' = { y : string; x : t_word };; +[%%expect{| +type t5_2' = { y : string; x : t_word; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_word } [@@unboxed];; +[%%expect{| +Line 1, characters 14-24: +1 | type t5_3 = { x : t_word } [@@unboxed];; + ^^^^^^^^^^ +Error: Type t_word has layout word. + Unboxed records may not yet contain types of this layout. +|}];; + +type t5_4 = A of t_word;; +[%%expect{| +type t5_4 = A of t_word +|}];; + +type t5_5 = A of int * t_word;; +[%%expect{| +type t5_5 = A of int * t_word +|}];; + +type ('a : word) t5_7 = A of int +type ('a : word) t5_8 = A of 'a;; +[%%expect{| +type ('a : word) t5_7 = A of int +type ('a : word) t5_8 = A of 'a +|}] + +(* not allowed: value in flat suffix *) +type 'a t_disallowed = A of t_word * 'a + +[%%expect{| +Line 1, characters 23-39: +1 | type 'a t_disallowed = A of t_word * 'a + ^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_word, but found boxed argument, 'a. +|}] + +type t5_6 = A of t_word [@@unboxed];; +[%%expect{| +Line 1, characters 12-23: +1 | type t5_6 = A of t_word [@@unboxed];; + ^^^^^^^^^^^ +Error: Type t_word has layout word. + Unboxed variants may not yet contain types of this layout. +|}];; + +type t5_6_1 = A of { x : t_word } [@@unboxed];; +[%%expect{| +Line 1, characters 21-31: +1 | type t5_6_1 = A of { x : t_word } [@@unboxed];; + ^^^^^^^^^^ +Error: Type t_word has layout word. + Unboxed inlined records may not yet contain types of this layout. +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_word end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-37: +1 | module type S6_1 = sig val x : t_word end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of type t_word must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_word_id end +[%%expect{| +Line 1, characters 31-43: +1 | module type S6_2 = sig val x : 'a t_word_id end + ^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_word_id is word + because of the definition of t_word_id at line 2, characters 0-31. + But the layout of type 'a t_word_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : nativeint# end +[%%expect{| +Line 1, characters 31-41: +1 | module type S6_3 = sig val x : nativeint# end + ^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type nativeint# is word + because it is the primitive word type nativeint#. + But the layout of type nativeint# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_word) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f7_1 (x : t_word) = `A x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_word_id) = `A x;; +[%%expect{| +Line 1, characters 33-34: +1 | let f7_2 (x : 'a t_word_id) = `A x;; + ^ +Error: This expression has type 'a t_word_id = ('a : word) + but an expression was expected of type ('b : value) + The layout of 'a t_word_id is word + because of the definition of t_word_id at line 2, characters 0-31. + But the layout of 'a t_word_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : nativeint#) = `A x;; +[%%expect{| +Line 1, characters 31-32: +1 | let f7_3 (x : nativeint#) = `A x;; + ^ +Error: This expression has type nativeint# + but an expression was expected of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_word ];; +[%%expect{| +Line 1, characters 20-26: +1 | type f7_4 = [ `A of t_word ];; + ^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : word) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 32-34: +1 | type ('a : word) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_word () : t_word = assert false +let make_t_word_id () : 'a t_word_id = assert false +let make_nativeintu () : nativeint# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_word : unit -> t_word = +val make_t_word_id : ('a : word). unit -> 'a t_word_id = +val make_nativeintu : unit -> nativeint# = +val id_value : 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_word ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_1 = id_value (make_t_word ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_word_id ());; +[%%expect{| +Line 1, characters 20-39: +1 | let x8_2 = id_value (make_t_word_id ());; + ^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_word_id = ('a : word) + but an expression was expected of type ('b : value) + The layout of 'a t_word_id is word + because of the definition of make_t_word_id at line 2, characters 19-51. + But the layout of 'a t_word_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_nativeintu ());; +[%%expect{| +Line 1, characters 20-40: +1 | let x8_3 = id_value (make_nativeintu ());; + ^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type nativeint# + but an expression was expected of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But word functions do. *) + +let twice f (x : 'a t_word_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_word ()) +let f9_2 () = twice f1_2 (make_t_word_id ()) +let f9_3 () = twice f1_3 (make_nativeintu ());; +[%%expect{| +val twice : + ('a : word). ('a t_word_id -> 'a t_word_id) -> 'a t_word_id -> 'a t_word_id = + +val f9_1 : unit -> t_word t_word_id = +val f9_2 : ('a : word). unit -> 'a t_word_id = +val f9_3 : unit -> nativeint# t_word_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of word and externals *) + +(* Valid uses of word in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> nativeint# = "foo";; +[%%expect{| +Line 1, characters 0-50: +1 | external f10_1 : int -> bool -> nativeint# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_word -> int = "foo";; +[%%expect{| +Line 1, characters 0-38: +1 | external f10_2 : t_word -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_6 : (nativeint#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : nativeint# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (nativeint#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> nativeint# = "foo" "bar" +|}];; + +external f10_8 : nativeint -> nativeint# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (nativeint [@unboxed]) -> nativeint# = "foo" "bar" +|}];; + +external f10_9 : (nativeint#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 18-28: +1 | external f10_9 : (nativeint#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (nativeint#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-39: +1 | external f10_10 : string -> (nativeint#[@untagged]) = "foo" "bar";; + ^^^^^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(***********************************************) +(* Test 11: word banned in extensible variants *) + +(* CR layouts v5.9: Actually allow mixed extensible variant blocks. *) + +type t11_1 = .. + +type t11_1 += A of t_word;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-25: +3 | type t11_1 += A of t_word;; + ^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of nativeint#;; +[%%expect{| +Line 1, characters 14-29: +1 | type t11_1 += B of nativeint#;; + ^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type ('a : word) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : word) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +(* not allowed: value in flat suffix *) +type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + +[%%expect{| +Line 1, characters 17-40: +1 | type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, 'a, + but found boxed argument, 'b. +|}] + +(***************************************) +(* Test 12: word in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_word >;; +[%%expect{| +Line 1, characters 15-25: +1 | type t12_1 = < x : t_word >;; + ^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : word) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 31-33: +1 | type ('a : word) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_word = assert false end;; +[%%expect{| +Line 1, characters 21-53: +1 | class c12_3 = object method x : t_word = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_word but is expected to have type ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_word_id -> 'a t_word_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_word_id -> 'a t_word_id = assert false + ^^ +Error: This type ('a : word) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with word + because of the definition of t_word_id at line 2, characters 0-31. +|}];; + +class c12_5 = object val x : t_word = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_word = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : nativeint# end;; +[%%expect{| +Line 1, characters 26-47: +1 | class type c12_6 = object method x : nativeint# end;; + ^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type nativeint# but is expected to have type + ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : nativeint# end +[%%expect{| +Line 1, characters 26-44: +1 | class type c12_7 = object val x : nativeint# end + ^^^^^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is word + because it is the primitive word type nativeint#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_word_id -> 'a t_word_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_word_id -> 'a t_word_id + ^^ +Error: This type ('a : word) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with word + because of the definition of t_word_id at line 2, characters 0-31. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_word -> t_word > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_word) : t_word = o#baz y y y;; +class ['a] c12_11 = object + method x : t_word -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_word = assert false +end;; +[%%expect{| +type t12_8 = < f : t_word -> t_word > +val f12_9 : t12_8 -> t_word -> t_word = +val f12_10 : + < baz : t_word -> t_word -> t_word -> t_word; .. > -> t_word -> t_word = + +class ['a] c12_11 : object method x : t_word -> 'a end +class ['a] c12_12 : object method x : 'a -> t_word end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_word + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_word) (m2 : t_word) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on word yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_word) = x = x;; +[%%expect{| +Line 1, characters 25-26: +1 | let f13_1 (x : t_word) = x = x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_word) = compare x x;; +[%%expect{| +Line 1, characters 33-34: +1 | let f13_2 (x : t_word) = compare x x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_word) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 42-43: +1 | let f13_3 (x : t_word) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_word) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 38-39: +1 | let f13_4 (x : t_word) = Hashtbl.hash x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; diff --git a/testsuite/tests/typing-layouts-word/basics_alpha.ml b/testsuite/tests/typing-layouts-word/basics_alpha.ml new file mode 100644 index 00000000000..fa0a4d77fa1 --- /dev/null +++ b/testsuite/tests/typing-layouts-word/basics_alpha.ml @@ -0,0 +1,769 @@ +(* TEST + { + flags = "-extension layouts_alpha"; + expect; + } +*) + +(* This file contains typing tests for the layout [word]. + + Runtime tests for the type [nativeint#] can be found in the + [unboxed_nativeint], [alloc], and [test_nativeint_u] tests in this + directory. The type [nativeint#] here is used as a convenient example of a + concrete [word] type in some tests, but its behavior isn't the primary + purpose of this test. *) + +type t_word : word +type ('a : word) t_word_id = 'a + +(*********************************) +(* Test 1: The identity function *) + +let f1_1 (x : t_word) = x;; +let f1_2 (x : 'a t_word_id) = x;; +let f1_3 (x : nativeint#) = x;; +[%%expect{| +type t_word : word +type ('a : word) t_word_id = 'a +val f1_1 : t_word -> t_word = +val f1_2 : ('a : word). 'a t_word_id -> 'a t_word_id = +val f1_3 : nativeint# -> nativeint# = +|}];; + +(*****************************************) +(* Test 2: You can let-bind them locally *) +let f2_1 (x : t_word) = + let y = x in + y;; + +let f2_2 (x : 'a t_word_id) = + let y = x in + y;; + +let f2_3 (x : nativeint#) = + let y = x in + y;; +[%%expect{| +val f2_1 : t_word -> t_word = +val f2_2 : ('a : word). 'a t_word_id -> 'a t_word_id = +val f2_3 : nativeint# -> nativeint# = +|}];; + +(*****************************************) +(* Test 3: No module-level bindings yet. *) + +let x3_1 : t_word = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_1 : t_word = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_1 has layout word. +|}];; + +let x3_2 : 'a t_word_id = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_2 : 'a t_word_id = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_2 has layout word. +|}];; + +let x3_3 : nativeint# = assert false;; +[%%expect{| +Line 1, characters 4-8: +1 | let x3_3 : nativeint# = assert false;; + ^^^^ +Error: Types of top-level module bindings must have layout value, but + the type of x3_3 has layout word. +|}];; + +module M3_4 = struct + let x : t_word = assert false +end +[%%expect{| +Line 2, characters 6-7: +2 | let x : t_word = assert false + ^ +Error: Types of top-level module bindings must have layout value, but + the type of x has layout word. +|}];; + +module M3_5 = struct + let f (x : nativeint#) = x + + let y = f (assert false) +end +[%%expect{| +Line 4, characters 6-7: +4 | let y = f (assert false) + ^ +Error: Types of top-level module bindings must have layout value, but + the type of y has layout word. +|}];; + +(*************************************) +(* Test 4: No putting them in tuples *) + +let f4_1 (x : t_word) = x, false;; +[%%expect{| +Line 1, characters 24-25: +1 | let f4_1 (x : t_word) = x, false;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value_or_null) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a tuple element. +|}];; + +let f4_2 (x : 'a t_word_id) = x, false;; +[%%expect{| +Line 1, characters 30-31: +1 | let f4_2 (x : 'a t_word_id) = x, false;; + ^ +Error: This expression has type 'a t_word_id = ('a : word) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_word_id is word + because of the definition of t_word_id at line 2, characters 0-31. + But the layout of 'a t_word_id must overlap with value + because it's the type of a tuple element. +|}];; + +let f4_3 (x : nativeint#) = x, false;; +[%%expect{| +Line 1, characters 28-29: +1 | let f4_3 (x : nativeint#) = x, false;; + ^ +Error: This expression has type nativeint# + but an expression was expected of type ('a : value_or_null) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_4 = t_word * string;; +[%%expect{| +Line 1, characters 12-18: +1 | type t4_4 = t_word * string;; + ^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type t4_5 = int * nativeint#;; +[%%expect{| +Line 1, characters 18-28: +1 | type t4_5 = int * nativeint#;; + ^^^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +type ('a : word) t4_6 = 'a * 'a +[%%expect{| +Line 1, characters 24-26: +1 | type ('a : word) t4_6 = 'a * 'a + ^^ +Error: This type ('a : value_or_null) should be an instance of type + ('a0 : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type t4_6. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}];; + +(* check for layout propagation *) +type ('a : word, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; +[%%expect{| +Line 1, characters 29-31: +1 | type ('a : word, 'b) t4_7 = ('a as 'b) -> ('b * 'b);; + ^^ +Error: This type ('b : value) should be an instance of type ('a : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type t4_7. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t4_7, + defaulted to layout value. +|}] + +(****************************************************) +(* Test 5: Allowed in some structures in typedecls. *) + +type t5_1 = { x : t_word };; +[%%expect{| +type t5_1 = { x : t_word; } +|}];; + +type t5_2 = { y : int; x : t_word };; +[%%expect{| +type t5_2 = { y : int; x : t_word; } +|}];; + +type t5_2' = { y : string; x : t_word };; +[%%expect{| +type t5_2' = { y : string; x : t_word; } +|}];; + +(* CR layouts 2.5: allow this *) +type t5_3 = { x : t_word } [@@unboxed];; +[%%expect{| +Line 1, characters 14-24: +1 | type t5_3 = { x : t_word } [@@unboxed];; + ^^^^^^^^^^ +Error: Type t_word has layout word. + Unboxed records may not yet contain types of this layout. +|}];; + +type t5_4 = A of t_word;; +[%%expect{| +type t5_4 = A of t_word +|}];; + +type t5_5 = A of int * t_word;; +[%%expect{| +type t5_5 = A of int * t_word +|}];; + +type ('a : word) t5_7 = A of int +type ('a : word) t5_8 = A of 'a;; +[%%expect{| +type ('a : word) t5_7 = A of int +type ('a : word) t5_8 = A of 'a +|}] + +(* not allowed: value in flat suffix *) +type 'a t_disallowed = A of t_word * 'a + +[%%expect{| +Line 1, characters 23-39: +1 | type 'a t_disallowed = A of t_word * 'a + ^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + t_word, but found boxed argument, 'a. +|}] + +type t5_6 = A of t_word [@@unboxed];; +[%%expect{| +Line 1, characters 12-23: +1 | type t5_6 = A of t_word [@@unboxed];; + ^^^^^^^^^^^ +Error: Type t_word has layout word. + Unboxed variants may not yet contain types of this layout. +|}];; + +(****************************************************) +(* Test 6: Can't be put at top level of signatures. *) +module type S6_1 = sig val x : t_word end + +let f6 (m : (module S6_1)) = let module M6 = (val m) in M6.x;; +[%%expect{| +Line 1, characters 31-37: +1 | module type S6_1 = sig val x : t_word end + ^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of type t_word must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_2 = sig val x : 'a t_word_id end +[%%expect{| +Line 1, characters 31-43: +1 | module type S6_2 = sig val x : 'a t_word_id end + ^^^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type 'a t_word_id is word + because of the definition of t_word_id at line 2, characters 0-31. + But the layout of type 'a t_word_id must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + +module type S6_3 = sig val x : nativeint# end +[%%expect{| +Line 1, characters 31-41: +1 | module type S6_3 = sig val x : nativeint# end + ^^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type nativeint# is word + because it is the primitive word type nativeint#. + But the layout of type nativeint# must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; + + +(*********************************************************) +(* Test 7: Can't be used as polymorphic variant argument *) +let f7_1 (x : t_word) = `A x;; +[%%expect{| +Line 1, characters 27-28: +1 | let f7_1 (x : t_word) = `A x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value_or_null) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_2 (x : 'a t_word_id) = `A x;; +[%%expect{| +Line 1, characters 33-34: +1 | let f7_2 (x : 'a t_word_id) = `A x;; + ^ +Error: This expression has type 'a t_word_id = ('a : word) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_word_id is word + because of the definition of t_word_id at line 2, characters 0-31. + But the layout of 'a t_word_id must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +let f7_3 (x : nativeint#) = `A x;; +[%%expect{| +Line 1, characters 31-32: +1 | let f7_3 (x : nativeint#) = `A x;; + ^ +Error: This expression has type nativeint# + but an expression was expected of type ('a : value_or_null) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type f7_4 = [ `A of t_word ];; +[%%expect{| +Line 1, characters 20-26: +1 | type f7_4 = [ `A of t_word ];; + ^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +type ('a : word) f7_5 = [ `A of 'a ];; +[%%expect{| +Line 1, characters 32-34: +1 | type ('a : word) f7_5 = [ `A of 'a ];; + ^^ +Error: This type ('a : value_or_null) should be an instance of type + ('a0 : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type f7_5. + But the layout of 'a must overlap with value + because it's the type of the field of a polymorphic variant. +|}];; + +(************************************************************) +(* Test 8: Normal polymorphic functions don't work on them. *) + +let make_t_word () : t_word = assert false +let make_t_word_id () : 'a t_word_id = assert false +let make_nativeintu () : nativeint# = assert false + +let id_value x = x;; +[%%expect{| +val make_t_word : unit -> t_word = +val make_t_word_id : ('a : word). unit -> 'a t_word_id = +val make_nativeintu : unit -> nativeint# = +val id_value : ('a : value_or_null). 'a -> 'a = +|}];; + +let x8_1 = id_value (make_t_word ());; +[%%expect{| +Line 1, characters 20-36: +1 | let x8_1 = id_value (make_t_word ());; + ^^^^^^^^^^^^^^^^ +Error: This expression has type t_word but an expression was expected of type + ('a : value_or_null) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_2 = id_value (make_t_word_id ());; +[%%expect{| +Line 1, characters 20-39: +1 | let x8_2 = id_value (make_t_word_id ());; + ^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'a t_word_id = ('a : word) + but an expression was expected of type ('b : value_or_null) + The layout of 'a t_word_id is word + because of the definition of make_t_word_id at line 2, characters 19-51. + But the layout of 'a t_word_id must overlap with value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +let x8_3 = id_value (make_nativeintu ());; +[%%expect{| +Line 1, characters 20-40: +1 | let x8_3 = id_value (make_nativeintu ());; + ^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type nativeint# + but an expression was expected of type ('a : value_or_null) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because of the definition of id_value at line 5, characters 13-18. +|}];; + +(*************************************) +(* Test 9: But word functions do. *) + +let twice f (x : 'a t_word_id) = f (f x) + +let f9_1 () = twice f1_1 (make_t_word ()) +let f9_2 () = twice f1_2 (make_t_word_id ()) +let f9_3 () = twice f1_3 (make_nativeintu ());; +[%%expect{| +val twice : + ('a : word). ('a t_word_id -> 'a t_word_id) -> 'a t_word_id -> 'a t_word_id = + +val f9_1 : unit -> t_word t_word_id = +val f9_2 : ('a : word). unit -> 'a t_word_id = +val f9_3 : unit -> nativeint# t_word_id = +|}];; + +(**************************************************) +(* Test 10: Invalid uses of word and externals *) + +(* Valid uses of word in externals are tested elsewhere - this is just a test + for uses the typechecker should reject. In particular + - if using a non-value layout in an external, you must supply separate + bytecode and native code implementations, + - [@unboxed] is allowed on unboxed types but has no effect. Same is not + true for [@untagged]. +*) + +external f10_1 : int -> bool -> nativeint# = "foo";; +[%%expect{| +Line 1, characters 0-50: +1 | external f10_1 : int -> bool -> nativeint# = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_2 : t_word -> int = "foo";; +[%%expect{| +Line 1, characters 0-38: +1 | external f10_2 : t_word -> int = "foo";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The native code version of the primitive is mandatory + for types with non-value layouts. +|}];; + +external f10_6 : (nativeint#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f10_6 : nativeint# -> bool -> string = "foo" "bar" +|}];; + +external f10_7 : string -> (nativeint#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f10_7 : string -> nativeint# = "foo" "bar" +|}];; + +external f10_8 : nativeint -> nativeint# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f10_8 : (nativeint [@unboxed]) -> nativeint# = "foo" "bar" +|}];; + +external f10_9 : (nativeint#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 18-28: +1 | external f10_9 : (nativeint#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f10_10 : string -> (nativeint#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 29-39: +1 | external f10_10 : string -> (nativeint#[@untagged]) = "foo" "bar";; + ^^^^^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(***********************************************) +(* Test 11: word banned in extensible variants *) + +(* CR layouts v5.9: Actually allow mixed extensible variant blocks. *) + +type t11_1 = .. + +type t11_1 += A of t_word;; +[%%expect{| +type t11_1 = .. +Line 3, characters 14-25: +3 | type t11_1 += A of t_word;; + ^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type t11_1 += B of nativeint#;; +[%%expect{| +Line 1, characters 14-29: +1 | type t11_1 += B of nativeint#;; + ^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +type ('a : word) t11_2 = .. + +type 'a t11_2 += A of int + +type 'a t11_2 += B of 'a;; + +[%%expect{| +type ('a : word) t11_2 = .. +type 'a t11_2 += A of int +Line 5, characters 17-24: +5 | type 'a t11_2 += B of 'a;; + ^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}] + +(* not allowed: value in flat suffix *) +type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + +[%%expect{| +Line 1, characters 17-40: +1 | type 'a t11_2 += C : 'a * 'b -> 'a t11_2 + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, 'a, + but found boxed argument, 'b. +|}] + +(***************************************) +(* Test 12: word in objects/classes *) + +(* First, disallowed uses: in object types, class parameters, etc. *) +type t12_1 = < x : t_word >;; +[%%expect{| +Line 1, characters 15-25: +1 | type t12_1 = < x : t_word >;; + ^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of an object field. +|}];; + +type ('a : word) t12_2 = < x : 'a >;; +[%%expect{| +Line 1, characters 31-33: +1 | type ('a : word) t12_2 = < x : 'a >;; + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : word) + The layout of 'a is word + because of the annotation on 'a in the declaration of the type t12_2. + But the layout of 'a must overlap with value + because it's the type of an object field. +|}] + +class c12_3 = object method x : t_word = assert false end;; +[%%expect{| +Line 1, characters 21-53: +1 | class c12_3 = object method x : t_word = assert false end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type t_word but is expected to have type ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of an object field. +|}];; + +class ['a] c12_4 = object + method x : 'a t_word_id -> 'a t_word_id = assert false +end;; +[%%expect{| +Line 2, characters 13-15: +2 | method x : 'a t_word_id -> 'a t_word_id = assert false + ^^ +Error: This type ('a : word) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with word + because of the definition of t_word_id at line 2, characters 0-31. +|}];; + +class c12_5 = object val x : t_word = assert false end;; +[%%expect{| +Line 1, characters 25-26: +1 | class c12_5 = object val x : t_word = assert false end;; + ^ +Error: Variables bound in a class must have layout value. + The layout of x is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of x must be a sublayout of value + because it's the type of a class field. +|}];; + +class type c12_6 = object method x : nativeint# end;; +[%%expect{| +Line 1, characters 26-47: +1 | class type c12_6 = object method x : nativeint# end;; + ^^^^^^^^^^^^^^^^^^^^^ +Error: The method x has type nativeint# but is expected to have type + ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's the type of an object field. +|}];; + +class type c12_7 = object val x : nativeint# end +[%%expect{| +Line 1, characters 26-44: +1 | class type c12_7 = object val x : nativeint# end + ^^^^^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of x is word + because it is the primitive word type nativeint#. + But the layout of x must be a sublayout of value + because it's the type of an instance variable. +|}];; + +class type ['a] c12_8 = object + val x : 'a t_word_id -> 'a t_word_id +end +[%%expect{| +Line 2, characters 10-12: +2 | val x : 'a t_word_id -> 'a t_word_id + ^^ +Error: This type ('a : word) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with word + because of the definition of t_word_id at line 2, characters 0-31. +|}];; + +(* Second, allowed uses: as method parameters / returns *) +type t12_8 = < f : t_word -> t_word > +let f12_9 (o : t12_8) x = o#f x +let f12_10 o (y : t_word) : t_word = o#baz y y y;; +class ['a] c12_11 = object + method x : t_word -> 'a = assert false +end;; +class ['a] c12_12 = object + method x : 'a -> t_word = assert false +end;; +[%%expect{| +type t12_8 = < f : t_word -> t_word > +val f12_9 : t12_8 -> t_word -> t_word = +val f12_10 : + < baz : t_word -> t_word -> t_word -> t_word; .. > -> t_word -> t_word = + +class ['a] c12_11 : object method x : t_word -> 'a end +class ['a] c12_12 : object method x : 'a -> t_word end +|}];; + +(* Third, another disallowed use: capture in an object. *) +let f12_13 m1 m2 = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: This expression has type ('a : value) + but an expression was expected of type t_word + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +let f12_14 (m1 : t_word) (m2 : t_word) = object + val f = fun () -> + let _ = f1_1 m1 in + let _ = f1_1 m2 in + () +end;; +[%%expect{| +Line 3, characters 17-19: +3 | let _ = f1_1 m1 in + ^^ +Error: m1 must have a type of layout value because it is captured by an object. + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because it's the type of a variable captured in an object. +|}];; + +(*********************************************************************) +(* Test 13: Ad-hoc polymorphic operations don't work on word yet. *) + +(* CR layouts v5: Remember to handle the case of calling these on structures + containing other layouts. *) + +let f13_1 (x : t_word) = x = x;; +[%%expect{| +Line 1, characters 25-26: +1 | let f13_1 (x : t_word) = x = x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_2 (x : t_word) = compare x x;; +[%%expect{| +Line 1, characters 33-34: +1 | let f13_2 (x : t_word) = compare x x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_3 (x : t_word) = Marshal.to_bytes x;; +[%%expect{| +Line 1, characters 42-43: +1 | let f13_3 (x : t_word) = Marshal.to_bytes x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; + +let f13_4 (x : t_word) = Hashtbl.hash x;; +[%%expect{| +Line 1, characters 38-39: +1 | let f13_4 (x : t_word) = Hashtbl.hash x;; + ^ +Error: This expression has type t_word but an expression was expected of type + ('a : value) + The layout of t_word is word + because of the definition of t_word at line 1, characters 0-18. + But the layout of t_word must be a sublayout of value + because of layout requirements from an imported definition. +|}];; diff --git a/testsuite/tests/typing-layouts-word/c_api.ml b/testsuite/tests/typing-layouts-word/c_api.ml new file mode 100644 index 00000000000..be17380a9c0 --- /dev/null +++ b/testsuite/tests/typing-layouts-word/c_api.ml @@ -0,0 +1,75 @@ +(* TEST + modules = "c_functions.c"; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* This file tests using external C functions with nativeint#. *) + +external to_nativeint : nativeint# -> (nativeint[@local_opt]) = "%box_nativeint" + +let print_nativeintu s f = Printf.printf "%s: %nd\n" s (to_nativeint f) +let print_nativeint s f = Printf.printf "%s: %nd\n" s f + +(* Various combinations of arguments nativeint, nativeint [@unboxed], and + nativeint# *) +external lognot_UtoU : nativeint# -> nativeint# = + "lognot_bytecode" "lognot_UtoU" +external lognot_BtoU : nativeint -> nativeint# = + "lognot_bytecode" "lognot_BtoU" +external lognot_UtoB : nativeint# -> nativeint = + "lognot_bytecode" "lognot_UtoB" +external lognot_BUtoU : (nativeint[@unboxed]) -> nativeint# = + "lognot_bytecode" "lognot_UtoU" +external lognot_UtoBU : nativeint# -> (nativeint[@unboxed]) = + "lognot_bytecode" "lognot_UtoU" + +let () = + let i = lognot_UtoU #42n in + print_nativeintu "nativeint# -> nativeint#, ~42" i + +let () = + let i = lognot_BtoU (-100n) in + print_nativeintu "nativeint -> nativeint#, ~(-100)" i + +let () = + let f = lognot_UtoB #255n in + print_nativeint "nativeint# -> nativeint, ~255" f + +let () = + let f = lognot_BUtoU 1024n in + print_nativeintu "(nativeint[@unboxed]) -> nativeint#, ~1024" f + +let () = + let f = lognot_UtoBU (-#1726n) in + print_nativeint "nativeint# -> (nativeint[@unboxed]), ~(-1726)" f + +(* If there are more than 5 args, you get an array in bytecode *) +external sum_7 : + nativeint# -> nativeint -> nativeint# -> nativeint -> + nativeint# -> nativeint -> nativeint# -> nativeint# = + "sum_7_bytecode" "sum_7_UBUBUBUtoU" + +let _ = + let f = + sum_7 + #1n 2n #3n 4n + #5n 6n #7n + in + print_nativeintu "Function of 7 args, 1+2+3+4+5+6+7" f diff --git a/testsuite/tests/typing-layouts-word/c_api.reference b/testsuite/tests/typing-layouts-word/c_api.reference new file mode 100644 index 00000000000..8ee6f9a7a68 --- /dev/null +++ b/testsuite/tests/typing-layouts-word/c_api.reference @@ -0,0 +1,6 @@ +nativeint# -> nativeint#, ~42: -43 +nativeint -> nativeint#, ~(-100): 99 +nativeint# -> nativeint, ~255: -256 +(nativeint[@unboxed]) -> nativeint#, ~1024: -1025 +nativeint# -> (nativeint[@unboxed]), ~(-1726): 1725 +Function of 7 args, 1+2+3+4+5+6+7: 28 diff --git a/testsuite/tests/typing-layouts-word/c_functions.c b/testsuite/tests/typing-layouts-word/c_functions.c new file mode 100644 index 00000000000..94ff91499d0 --- /dev/null +++ b/testsuite/tests/typing-layouts-word/c_functions.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +CAMLprim intnat lognot_UtoU(intnat u) { + return ~u; +} + +CAMLprim intnat lognot_BtoU(value u) { + return ~Nativeint_val(u); +} + +CAMLprim value lognot_UtoB(intnat u) { + CAMLparam0(); + CAMLlocal1(result); + result = caml_copy_nativeint(~u); + CAMLreturn(result); +} + +CAMLprim value lognot_bytecode(value u) { + CAMLparam1(u); + CAMLlocal1(result); + result = caml_copy_nativeint(~Nativeint_val(u)); + CAMLreturn(result); +} + +CAMLprim intnat sum_7_UBUBUBUtoU(intnat u1, value b2, intnat u3, value b4, + intnat u5, value b6, intnat u7) { + intnat u2 = Nativeint_val(b2); + intnat u4 = Nativeint_val(b4); + intnat u6 = Nativeint_val(b6); + return (u1 + u2 + u3 + u4 + u5 + u6 + u7); +} + +CAMLprim value sum_7_bytecode(value* argv, int argn) { + CAMLparam0(); + CAMLassert(argn == 7); + if (argn != 7) CAMLreturn(caml_copy_nativeint(-1)); + intnat u1 = Nativeint_val(argv[0]); + intnat u2 = Nativeint_val(argv[1]); + intnat u3 = Nativeint_val(argv[2]); + intnat u4 = Nativeint_val(argv[3]); + intnat u5 = Nativeint_val(argv[4]); + intnat u6 = Nativeint_val(argv[5]); + intnat u7 = Nativeint_val(argv[6]); + CAMLlocal1(result); + result = caml_copy_nativeint(u1 + u2 + u3 + u4 + u5 + u6 + u7); + CAMLreturn(result); +} diff --git a/testsuite/tests/typing-layouts-word/parsing.ml b/testsuite/tests/typing-layouts-word/parsing.ml new file mode 100644 index 00000000000..fc49544491d --- /dev/null +++ b/testsuite/tests/typing-layouts-word/parsing.ml @@ -0,0 +1,277 @@ +(* TEST + expect; +*) + +(* These tests show how potential ambiguities are resolved + between the types #c and nativeint#. +*) + +(* Basic syntax: nativeint# is an unboxed nativeint. *) +type t = nativeint#;; +let f (_ : nativeint#) = ();; +[%%expect {| +type t = nativeint# +val f : nativeint# -> unit = +|}];; + +type t = C of nativeint#;; +[%%expect {| +type t = C of nativeint# +|}];; + +type t = C : nativeint# -> t;; +[%%expect {| +type t = C : nativeint# -> t +|}];; + +(* nativeint# works as an argument to normal type constructors, not just + classes, even though many of the rest of the tests in this file are concerned + with classes. +*) +type t = nativeint# list;; +[%%expect {| +Line 1, characters 9-19: +1 | type t = nativeint# list;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +let f (_ : nativeint# list) = ();; +[%%expect {| +Line 1, characters 11-21: +1 | let f (_ : nativeint# list) = ();; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C of nativeint# list;; +[%%expect {| +Line 1, characters 14-24: +1 | type t = C of nativeint# list;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +type t = C : nativeint# list -> t;; +[%%expect {| +Line 1, characters 13-23: +1 | type t = C : nativeint# list -> t;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because the type argument of list has layout value. +|}];; + +(* Syntax: nativeint#c + Interpreted as type application of [c] to [nativeint#]. +*) +class ['a] c = object(self) + method x :'a = assert false +end;; +[%%expect {| +class ['a] c : object method x : 'a end +|}];; + +type t = nativeint#c;; +[%%expect {| +Line 1, characters 9-19: +1 | type t = nativeint#c;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : nativeint#c) = ();; +[%%expect {| +Line 1, characters 11-21: +1 | let f (_ : nativeint#c) = ();; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of nativeint#c;; +[%%expect {| +Line 1, characters 14-24: +1 | type t = C of nativeint#c;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : nativeint#c -> t;; +[%%expect {| +Line 1, characters 13-23: +1 | type t = C : nativeint#c -> t;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: nativeint# c + Interpreted as type application of [c] to [nativeint#]. +*) +type t = nativeint# c;; +[%%expect {| +Line 1, characters 9-19: +1 | type t = nativeint# c;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +let f (_ : nativeint# c) = ();; +[%%expect {| +Line 1, characters 11-21: +1 | let f (_ : nativeint# c) = ();; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C of nativeint# c;; +[%%expect {| +Line 1, characters 14-24: +1 | type t = C of nativeint# c;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +type t = C : nativeint# c -> t;; +[%%expect {| +Line 1, characters 13-23: +1 | type t = C : nativeint# c -> t;; + ^^^^^^^^^^ +Error: This type nativeint# should be an instance of type ('a : value) + The layout of nativeint# is word + because it is the primitive word type nativeint#. + But the layout of nativeint# must be a sublayout of value + because it's a type argument to a class constructor. +|}];; + +(* Syntax: nativeint #c + Interpreted as type application of [#c] to [nativeint]. + + Note that [nativeint #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) +type t = nativeint #c;; +[%%expect {| +Line 1, characters 0-21: +1 | type t = nativeint #c;; + ^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type nativeint #c as 'a the variable 'a is unbound +|}];; +type t = C of nativeint #c;; +[%%expect {| +Line 1, characters 0-26: +1 | type t = C of nativeint #c;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (nativeint #c as 'a) the variable 'a is unbound +|}];; +type 'a t = (nativeint #c as 'a);; +let f (_ : nativeint #c) = ();; +type 'a t = C of (nativeint #c as 'a);; +type t = C : nativeint #c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = nativeint #c +val f : nativeint #c -> unit = +type 'a t = C of 'a constraint 'a = nativeint #c +type t = C : nativeint #c -> t +|}];; + +(* Syntax: nativeint # c + Interpreted as type application of [#c] to [nativeint]. + + Note that [nativeint #c] implicitly binds a type variable, + so we need to name it with [as] to get some examples to + typecheck. +*) + +type t = nativeint # c;; +[%%expect {| +Line 1, characters 0-22: +1 | type t = nativeint # c;; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In type nativeint #c as 'a the variable 'a is unbound +|}];; +type t = C of nativeint # c;; +[%%expect {| +Line 1, characters 0-27: +1 | type t = C of nativeint # c;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type variable is unbound in this type declaration. + In case C of (nativeint #c as 'a) the variable 'a is unbound +|}];; + +type 'a t = (nativeint # c as 'a);; +let f (_ : nativeint # c) = ();; +type 'a t = C of (nativeint # c as 'a);; +type t = C : nativeint # c -> t;; +[%%expect {| +type 'a t = 'a constraint 'a = nativeint #c +val f : nativeint #c -> unit = +type 'a t = C of 'a constraint 'a = nativeint #c +type t = C : nativeint #c -> t +|}];; + +(***************************) +(* Type application: it's a type error, not a parse error. *) + +type t = int nativeint#;; +[%%expect {| +Line 1, characters 9-23: +1 | type t = int nativeint#;; + ^^^^^^^^^^^^^^ +Error: The type constructor nativeint# expects 0 argument(s), + but is here applied to 1 argument(s) +|}];; + +type t = (int, int) nativeint#;; +[%%expect {| +Line 1, characters 9-30: +1 | type t = (int, int) nativeint#;; + ^^^^^^^^^^^^^^^^^^^^^ +Error: The type constructor nativeint# expects 0 argument(s), + but is here applied to 2 argument(s) +|}];; diff --git a/testsuite/tests/typing-layouts-word/test_nativeint_u.ml b/testsuite/tests/typing-layouts-word/test_nativeint_u.ml new file mode 100644 index 00000000000..88fea11a7eb --- /dev/null +++ b/testsuite/tests/typing-layouts-word/test_nativeint_u.ml @@ -0,0 +1,326 @@ +(* TEST + include stdlib_upstream_compatible; +*) + +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u +module Int32_u = Stdlib_upstream_compatible.Int32_u + +(* Print all individual successful tests; used for debugging, as it will cause + this test to fail *) +let debug_tests = false + +(* Constant seed for repeatable random-testing properties *) +(* I hear primes are often good? This is an 11-digit prime in the decimal + expansion of [e], containing the earliest 10-digit prime the decimal + expansion of [e] per OEIS sequence A098963. *) +let () = Random.init 61000000007 + +let to_ocaml_string s = "\"" ^ String.escaped s ^ "\"" + +type 'a result = { + expected : 'a; + actual : 'a; + equal : 'a -> 'a -> bool; + to_string : 'a -> string +} + +module type Result = sig + type t + val equal : t -> t -> bool + val to_string : t -> string +end + +let mk_result' equal to_string = fun ~expected ~actual -> + { expected; actual; equal; to_string } + +let mk_result (type a) (module M : Result with type t = a) = + mk_result' M.equal M.to_string + +let float_result = mk_result (module Float) +let bool_result = mk_result (module Bool) +let int_result = mk_result (module Int) +let int32_result = mk_result (module Int32) +let nativeint_result = mk_result (module Nativeint) +let string_result = mk_result' String.equal to_ocaml_string + +let option_result (type a) (module M : Result with type t = a) = + mk_result' + (Option.equal M.equal) + (function + | None -> "None" + | Some x -> "Some (" ^ M.to_string x ^ ")") + +type 'a generator = + | Rand of (unit -> 'a) + | Const of 'a + +let map_generator f = function + | Rand r -> Rand (fun () -> f (r ())) + | Const c -> Const (f c) + +type 'a input = { + generators : 'a generator list; + to_string : 'a -> string +} + +module type Integer = sig + type t + (* Interesting constants *) + val zero : t + val one : t + val minus_one : t + val max_int : t + val min_int : t + (* String generation *) + val to_string : t -> string + (* Comparison (for zero-testing) *) + val equal : t -> t -> bool + (* Arithmetic (for generating small numbers) *) + val sub : t -> t -> t + val shift_left : t -> int -> t +end + +let one_thousand (type a) (module I : Integer with type t = a) = + let open I in + let i1024 = shift_left one 10 in + let i16 = shift_left one 4 in + let i8 = shift_left one 3 in + sub (sub i1024 i16) i8 + +let two_thousand (type a) (module I : Integer with type t = a) = + I.shift_left (one_thousand (module I)) 1 + +let unit_input = + { generators = [Const ()] + ; to_string = Unit.to_string + } + +let bool_input = + { generators = [Const false; Const true] + ; to_string = Bool.to_string + } + +let float_input = + { generators = [ Const 0. + ; Const 1. + ; Const (-1.) + ; Const Float.max_float + ; Const Float.min_float + ; Const Float.epsilon + ; Const Float.nan + ; Const Float.infinity + ; Const Float.neg_infinity + ; Rand (fun () -> Random.float 2000. -. 1000.) + ; Rand (fun () -> Int64.float_of_bits (Random.bits64 ())) + ] + ; to_string = Float.to_string + } + +let integer_input + (type a) (module I : Integer with type t = a) + rand_range rand_full = + let rand_small () = + let i0_to_2000 = rand_range (two_thousand (module I)) in + I.sub i0_to_2000 (one_thousand (module I)) + in + { generators = [ Const I.zero + ; Const I.one + ; Const I.minus_one + ; Const I.max_int + ; Const I.min_int + ; Rand rand_small + ; Rand rand_full + ] + ; to_string = I.to_string + } + +let nonzero_integer_input + (type a) (module I : Integer with type t = a) + rand_range rand_full = + let { generators; to_string } = + integer_input (module I) rand_range rand_full + in + let generators = + generators |> + List.filter_map + (function + | Const c -> + if I.equal c I.zero + then None + else Some (Const c) + | Rand r -> + Some (Rand (fun () -> + let n = ref I.zero in + while I.equal !n I.zero do + n := r () + done; + !n))) + in + { generators; to_string } + +let int_input = integer_input (module Int) Random.int Random.bits +let int32_input = integer_input (module Int32) Random.int32 Random.bits32 +let nativeint_input = + integer_input (module Nativeint) Random.nativeint Random.nativebits +let nonzero_nativeint_input = + nonzero_integer_input (module Nativeint) Random.nativeint Random.nativebits + +let nativeint_shift_amount_input = + { generators = List.init Nativeint.size (fun c -> Const c) + ; to_string = Int.to_string + } + +let nativeint_string_input = + { generators = List.map + (map_generator Nativeint.to_string) + nativeint_input.generators + ; to_string = to_ocaml_string + } + +let product2 ~f xs ys = + List.concat_map (fun x -> + List.map (fun y -> + f x y) + ys) + xs + +let two_inputs in1 in2 = + { generators = product2 in1.generators in2.generators ~f:(fun gen1 gen2 -> + match gen1, gen2 with + | Const c1, Const c2 -> Const (c1, c2) + | Const c1, Rand r2 -> Rand (fun () -> c1, r2 ()) + | Rand r1, Const c2 -> Rand (fun () -> r1 (), c2) + | Rand r1, Rand r2 -> Rand (fun () -> r1 (), r2 ()) + ) + ; to_string = fun (x1, x2) -> + Printf.sprintf "(%s, %s)" (in1.to_string x1) (in2.to_string x2) + } + +let passed { actual; expected; equal; _ } = equal actual expected + +let test ?(n=100) name prop { generators; to_string = input_to_string } = + let test input = + let {expected; actual; to_string} as result = prop input in + let print_test outcome = + Printf.printf "Test %s: %s. Input = %s; expected = %s; actual = %s\n" + outcome name + (input_to_string input) (to_string expected) (to_string actual) + in + if passed result then begin + if debug_tests then print_test "succeeded" + end + else + print_test "failed" + in + List.iter + (function + | Const c -> test c + | Rand r -> for _ = 1 to n do test (r ()) done) + generators + +let test_same + ~input ~result ~apply_expected ~apply_actual + ?n name expected actual = + test ?n name + (fun x -> + result + ~expected:(apply_expected expected x) + ~actual:(apply_actual actual x)) + input + +let test_constant ?n name expected actual result = + test ?n name (fun () -> result ~expected ~actual) unit_input + +let test_same_unary ?n name input result expected actual = + test_same + ~input + ~result + ~apply_expected:Fun.id + ~apply_actual:Fun.id + ?n name expected actual + +let test_same_binary ?n name input1 input2 result expected actual = + test_same + ~input:(two_inputs input1 input2) + ~result + ~apply_expected:(fun f (x,y) -> f x y) + ~apply_actual:(fun f (x,y) -> f x y) + ?n name expected actual + +let test_unary ?n name f fu = + test_same_unary ?n name nativeint_input nativeint_result f + (fun x -> Nativeint_u.to_nativeint (fu (Nativeint_u.of_nativeint x))) + +let test_unary_of ?n name f fu result = + test_same_unary ?n name nativeint_input result f + (fun x -> fu (Nativeint_u.of_nativeint x)) + +let test_unary_to ?n name f fu input = + test_same_unary ?n name input nativeint_result f + (fun x -> Nativeint_u.to_nativeint (fu x)) + +let test_binary' ~second_input ?n name f fu = + test_same_binary ?n name nativeint_input second_input nativeint_result f + (fun x y -> Nativeint_u.to_nativeint + (fu + (Nativeint_u.of_nativeint x) + (Nativeint_u.of_nativeint y))) + +let test_binary = test_binary' ~second_input:nativeint_input + +let test_division = test_binary' ~second_input:nonzero_nativeint_input + +let test_binary_of ?n name f fu result = + test_same_binary ?n name nativeint_input nativeint_input result f + (fun x y -> fu + (Nativeint_u.of_nativeint x) + (Nativeint_u.of_nativeint y)) + +let test_shift ?n name shift shiftu = + test_same_binary + ?n name nativeint_input nativeint_shift_amount_input nativeint_result shift + (fun x y -> Nativeint_u.to_nativeint + (shiftu + (Nativeint_u.of_nativeint x) + y)) + +let nativeint_u_of_int32 x = Nativeint_u.of_int32_u (Int32_u.of_int32 x) +let nativeint_u_to_int32 x = Int32_u.to_int32 (Nativeint_u.to_int32_u x) + +let () = + test_unary "neg" Nativeint.neg Nativeint_u.neg; + test_binary "add" Nativeint.add Nativeint_u.add; + test_binary "sub" Nativeint.sub Nativeint_u.sub; + test_binary "mul" Nativeint.mul Nativeint_u.mul; + test_division "div" Nativeint.div Nativeint_u.div; + test_division "unsigned_div" Nativeint.unsigned_div Nativeint_u.unsigned_div; + test_division "rem" Nativeint.rem Nativeint_u.rem; + test_division "unsigned_rem" Nativeint.unsigned_rem Nativeint_u.unsigned_rem; + test_unary "succ" Nativeint.succ Nativeint_u.succ; + test_unary "pred" Nativeint.pred Nativeint_u.pred; + test_unary "abs" Nativeint.abs Nativeint_u.abs; + test_constant "size" Nativeint.size Nativeint_u.size int_result; + test_binary "logand" Nativeint.logand Nativeint_u.logand; + test_binary "logor" Nativeint.logor Nativeint_u.logor; + test_binary "logxor" Nativeint.logxor Nativeint_u.logxor; + test_unary "lognot" Nativeint.lognot Nativeint_u.lognot; + test_shift "shift_left" Nativeint.shift_left Nativeint_u.shift_left; + test_shift "shift_right" Nativeint.shift_right Nativeint_u.shift_right; + test_shift "shift_right_logical" Nativeint.shift_right_logical Nativeint_u.shift_right_logical; + test_unary_to "of_int" Nativeint.of_int Nativeint_u.of_int int_input; + test_unary_of "to_int" Nativeint.to_int Nativeint_u.to_int int_result; + test_unary_of "unsigned_to_int" Nativeint.unsigned_to_int Nativeint_u.unsigned_to_int (option_result (module Int)); + test_unary_to "of_float" Nativeint.of_float Nativeint_u.of_float float_input; + test_unary_of "to_float" Nativeint.to_float Nativeint_u.to_float float_result; + test_unary_to "of_int32" Nativeint.of_int32 Nativeint_u.of_int32 int32_input; + test_unary_of "to_int32" Nativeint.to_int32 Nativeint_u.to_int32 int32_result; + test_unary_to "of_int32_u" Nativeint.of_int32 nativeint_u_of_int32 int32_input; + test_unary_of "to_int32_u" Nativeint.to_int32 nativeint_u_to_int32 int32_result; + test_unary_to "of_string" Nativeint.of_string Nativeint_u.of_string nativeint_string_input; + test_unary_of "to_string" Nativeint.to_string Nativeint_u.to_string string_result; + test_binary_of "compare" Nativeint.compare Nativeint_u.compare int_result; + test_binary_of "unsigned_compare" Nativeint.unsigned_compare Nativeint_u.unsigned_compare int_result; + test_binary_of "equal" Nativeint.equal Nativeint_u.equal bool_result; + test_binary "min" Nativeint.min Nativeint_u.min; + test_binary "max" Nativeint.max Nativeint_u.max; + () diff --git a/testsuite/tests/typing-layouts-word/unboxed_nativeints.ml b/testsuite/tests/typing-layouts-word/unboxed_nativeints.ml new file mode 100644 index 00000000000..2750e33eec2 --- /dev/null +++ b/testsuite/tests/typing-layouts-word/unboxed_nativeints.ml @@ -0,0 +1,427 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* This file contains various tests for [nativeint#]. It's not an expect test + to make sure it gets tested for native code. *) + +(*****************************************) +(* Prelude: Functions on unboxed nativeints. *) + +module Nativeint_u = struct + include Stdlib_upstream_compatible.Nativeint_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( > ) x y = (compare x y) > 0 +end + +let to_binary_string x = + String.init Nativeint.size (fun i -> + if Nativeint.(equal (logand x (shift_left 1n (Nativeint.size - i - 1))) 0n) + then '0' + else '1') + +let print_int prefix x = + Printf.printf "%s: %d\n" prefix x + +let print_nativeintu prefix x = + Printf.printf "%s: %nd\n" prefix (Nativeint_u.to_nativeint x) + +let print_nativeintu_bin prefix x = + let bx = Nativeint_u.to_nativeint x in + Printf.printf "%s: %nd = 0b%s\n" prefix bx (to_binary_string bx) + +(*********************************) +(* Test 1: some basic arithmetic *) + +(* Tests all the operators above *) +let test1 () = + (* CR layouts: When word defs are allowed at the module level, get rid of + [test1] and move these definitions there. *) + let open Nativeint_u in + + (* Positive numbers *) + + let three = #3n in + print_nativeintu "Test 1, three" three; + + let twice_three = three + #3n in + print_nativeintu "Test 1, twice_three" twice_three; + + let thrice_three = #3n * three in + print_nativeintu "Test 1, thrice_three" thrice_three; + + let twice_three_again = thrice_three - three in + print_nativeintu "Test 1, twice_three_again" twice_three; + + let three_again = twice_three_again / #2n in + print_nativeintu "Test 1, three_again" three_again; + + let three_again_unsigned = twice_three_again // #2n in + print_nativeintu "Test 1, three_again_unsigned" three_again_unsigned; + + let twice_three_greater_than_three = twice_three > three in + Printf.printf "Test 1, twice_three_greater_than_three: %b\n" + twice_three_greater_than_three; + + let three_with_effort = + (#3n + twice_three) * #2n / #6n in + print_nativeintu "Test 1, three_with_effort" three_with_effort; + + let seven_rem_three = #7n % three in + print_nativeintu "Test 1, seven_rem_three" seven_rem_three; + + let seven_rem_three_unsigned = #7n %% three in + print_nativeintu "Test 1, seven_rem_three_unsigned" seven_rem_three_unsigned; + + let forty_two_logand_three = logand #42n three in + print_nativeintu_bin "Test1, forty_two_logand_three (0b00101010 & 0b00000011)" forty_two_logand_three; + + let forty_two_logor_three = logor #42n three in + print_nativeintu_bin "Test1, forty_two_logor_three (0b00101010 & 0b00000011)" forty_two_logor_three; + + let forty_two_logxor_three = logxor #42n three in + print_nativeintu_bin "Test1, forty_two_logxor_three (0b00101010 & 0b00000011)" forty_two_logxor_three; + + let lognot_three = lognot three in + print_nativeintu_bin "Test1, lognot_three (~0b00000011)" lognot_three; + + let three_shl_eight = shift_left three 8 in + print_nativeintu_bin "Test1, three_shl_eight (0b00000011 << 8)" three_shl_eight; + + let three_shr_one = shift_right three 1 in + print_nativeintu_bin "Test1, three_shr_one (0b00000011 >> 1)" three_shr_one; + + let three_shrl_one = shift_right_logical three 1 in + print_nativeintu_bin "Test1, three_shr_one (0b00000011 >>> 1)" three_shrl_one; + + (* Negative numbers *) + + let minus_five = -#5n in + print_nativeintu "Test 1, minus_five" minus_five; + + let twice_minus_five = minus_five + (-#5n) in + print_nativeintu "Test 1, twice_minus_five" twice_minus_five; + + let thrice_minus_five = #3n * minus_five in + print_nativeintu "Test 1, thrice_minus_five" thrice_minus_five; + + let twice_minus_five_again = thrice_minus_five - minus_five in + print_nativeintu "Test 1, twice_minus_five_again" twice_minus_five; + + let minus_five_again = twice_minus_five_again / #2n in + print_nativeintu "Test 1, minus_five_again" minus_five_again; + + let minus_five_again_unsigned = twice_minus_five_again // #2n in + print_nativeintu "Test 1, minus_five_again_unsigned" minus_five_again_unsigned; + + let minus_five_greater_than_twice_minus_five = minus_five > twice_minus_five in + Printf.printf "Test 1, minus_five_greater_than_twice_minus_five: %b\n" + minus_five_greater_than_twice_minus_five; + + let minus_five_with_effort = + ((-#5n) + twice_minus_five) * #2n / #6n in + print_nativeintu "Test 1, minus_five_with_effort" minus_five_with_effort; + + let seven_rem_minus_five = #7n % minus_five in + print_nativeintu "Test 1, seven_rem_minus_five" seven_rem_minus_five; + + let seven_rem_minus_five_unsigned = #7n %% minus_five in + print_nativeintu "Test 1, seven_rem_minus_five_unsigned" seven_rem_minus_five_unsigned; + + let forty_two_logand_minus_five = logand #42n minus_five in + print_nativeintu_bin "Test1, forty_two_logand_minus_five (0b00101010 & 0b1...1011)" forty_two_logand_minus_five; + + let forty_two_logor_minus_five = logor #42n minus_five in + print_nativeintu_bin "Test1, forty_two_logor_minus_five (0b00101010 & 0b1...1011)" forty_two_logor_minus_five; + + let forty_two_logxor_minus_five = logxor #42n minus_five in + print_nativeintu_bin "Test1, forty_two_logxor_minus_five (0b00101010 & 0b1...1011)" forty_two_logxor_minus_five; + + let lognot_minus_five = lognot minus_five in + print_nativeintu_bin "Test1, lognot_minus_five (~0b1...1011)" lognot_minus_five; + + let minus_five_shl_eight = shift_left minus_five 8 in + print_nativeintu_bin "Test1, minus_five_shl_eight (0b1...1011 << 8)" minus_five_shl_eight; + + let minus_five_shr_one = shift_right minus_five 1 in + print_nativeintu_bin "Test1, minus_five_shr_one (0b1...1011 >> 1)" minus_five_shr_one; + + let minus_five_shrl_one = shift_right_logical minus_five 1 in + print_nativeintu_bin "Test1, minus_five_shr_one (0b1...1011 >>> 1)" minus_five_shrl_one; + + (* Constants *) + + print_int "Test 1, size" size + + (* CR layouts: Restore these when the appropriate constants exist *) + (* print_nativeintu "Test 1, max_int" max_int; + * print_nativeintu "Test 1, min_int" min_int; *) + +let _ = test1 () + +(**********************************) +(* Test 2: higher-order functions *) + +(* CR layouts v1.5: This type definition can be eliminated once we have + annotations. *) +type ('a : word) t_word = 'a + +let[@inline never] twice f (x : 'a t_word) = f (f x) +let[@inline never] compose f g (x : 'a t_word) = f (g x) + +let[@inline never] twice_on_three f = + let pi = #3n in + twice f pi + +let times_four = twice Nativeint_u.(fun x -> x * #2n) + +let _ = + let open Nativeint_u in + print_nativeintu "Test 2, add three twice" + (twice (fun x -> x + #3n) #0n); + print_nativeintu "Test 2, add three four times" + (twice (twice (fun x -> x + #3n)) #0n); + print_nativeintu "Test 2, increment three twice" + (twice_on_three (fun x -> #1n + x)); + print_nativeintu "Test 2, increment three four times" + (twice_on_three (twice (fun x -> #1n + x))); + print_nativeintu "Test 2, two times four" + (times_four #2n); + print_nativeintu "Test 2, three times sixteen" + (twice_on_three times_four); + print_nativeintu "Test 2, three times sixteen again" + (compose times_four times_four #3n); + print_nativeintu "Test 2, three minus four" + (let two = twice (fun x -> x + #1n) #0n in + let add_two = Nativeint_u.(+) two in + let add_two_after = compose add_two in + let minus_four = add_two_after (twice (fun x -> x - #3n)) in + minus_four #3n) + +(**********************************) +(* Test 3: nativeint# in closures *) + +(* [go]'s closure should haave an [int] (immediate), a [nativeint#] (word) and a + [nativeint array] (value). *) +let[@inline never] f3 n m steps () = + let[@inline never] rec go k = + if k = n + then #0n + else begin + let acc = go (k + 1) in + steps.(k) <- Nativeint_u.to_nativeint acc; + Nativeint_u.(+) m acc + end + in + go 0 + +(* many args - even args are tuples, odd args are unboxed nativeints *) +let[@inline_never] f3_manyargs x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 steps () = + let (start_k, end_k) = x0 in + let[@inline never] rec go k = + if k = end_k + then #0n + else begin + let (x2_1, x2_2) = x2 in + let (x4_1, x4_2) = x4 in + let (x6_1, x6_2) = x6 in + let (x8_1, x8_2) = x8 in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Nativeint_u.to_nativeint acc; + Nativeint_u.(acc + ((x1 + x3 + x5 + x7 + x9) * (of_nativeint (Nativeint.of_int sum)))) + end + in + go start_k + +let test3 () = + (* Test f3 *) + let steps = Array.init 10 (fun _ -> 0n) in + let five_times_three = f3 5 #3n steps in + print_nativeintu "Test 3, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 3, step %d: %nd\n") steps; + + (* Test f3_manyargs + + (1 + 2 + 3 + 5 + 8) = 19 + 3 * (1 + 2 + 3 + 5 + 8) = 57 + 6 * (1 + 2 + 3 + 5 + 8) = 114 + 9 * (1 + 2 + 3 + 5 + 8) = 171 + *) + let steps = Array.init 10 (fun _ -> 0n) in + let x1 = #1n in + let x3 = #2n in + let x5 = #3n in + let x7 = #5n in + let x9 = #8n in + + (* all these 8 numbers together sum to 3 *) + let x2 = (7, 42) in + let x4 = (-23, 109) in + let x6 = (-242, 90) in + let x8 = (-2, 22) in + + let f3_manyargs = f3_manyargs (4,8) x1 x2 x3 x4 x5 x6 x7 x8 x9 steps in + print_nativeintu "Test 3, 171: " (f3_manyargs ()); + Array.iteri (Printf.printf " Test 3, step %d: %nd\n") steps + +let _ = test3 () + +(*********************************************) +(* Test 4: Partial and indirect applications *) + +let[@inline never] test4 () = + (* Simple indirect call *) + let[@inline never] go f = + Nativeint_u.to_nativeint (f #1n #2n) + in + let (x1, x2) = (go Nativeint_u.(+), go Nativeint_u.(-)) in + print_nativeintu "Test 4, 1 + 2" (Nativeint_u.of_nativeint x1); + print_nativeintu "Test 4, 1 - 2" (Nativeint_u.of_nativeint x2); + + (* partial application to nativeint# *) + let steps = Array.init 10 (fun _ -> 0n) in + let f = Sys.opaque_identity (f3 5 #3n) in + let five_times_three = f steps in + print_nativeintu "Test 4, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %nd\n") steps; + + (* partial application with nativeint# remaining *) + let steps = Array.init 10 (fun _ -> 0n) in + let f = Sys.opaque_identity (f3 6) in + let six_times_three = f #3n steps in + print_nativeintu "Test 4, 6 * 3: " (six_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %nd\n") steps; + + (* Those two tests again, but making f3 also opaque to prevent expansion of + the partial application. *) + let f3 = Sys.opaque_identity f3 in + + let steps = Array.init 10 (fun _ -> 0n) in + let f = Sys.opaque_identity (f3 5 #3n) in + let five_times_three = f steps in + print_nativeintu "Test 4, 5 * 3: " (five_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %nd\n") steps; + + let steps = Array.init 10 (fun _ -> 0n) in + let f = Sys.opaque_identity (f3 6) in + let six_times_three = f #3n steps in + print_nativeintu "Test 4, 6 * 3: " (six_times_three ()); + Array.iteri (Printf.printf " Test 4, step %d: %nd\n") steps + +let _ = test4 () + +(****************************) +(* Test 5: Over application *) + +let[@inline never] f5 n m = + let open Nativeint_u in + (* Also testing a closure with only nativeint# values *) + let[@inline never] go f = + f (n + m) + in + go + +let test5 () = + let open Nativeint_u in + let _ : unit = + f5 #3n #2n + (fun n s m -> print_nativeintu s (n + m)) "Test 5, 3 + 2 + 1" + #1n + in + () + +let _ = test5 () + +(*********************************) +(* Test 6: methods on nativeints *) + +(* CR layouts: add tests that capture nativeints in objects, once that is + allowed. *) + +(* nativeint# args and returns *) +let f6_1 () = object + method f6_m1 f1 f2 f3 = + let open Nativeint_u in + (f1 - f2) / f3 +end + +(* capture a pair, recursion *) +let f6_2 n = object(self) + method f6_m2 n3 m1 f = + if n3 = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) then + m1 + else f (self#f6_m2 (n3+1) m1 f) +end + +(* overapplication to nativeint# and non-nativeint# args *) +let f6_3 n k = object + method f6_m3 n3 m1 f = + let n = ((Sys.opaque_identity fst) n) + ((Sys.opaque_identity snd) n) in + f (n + k + n3) m1 +end + +let test6 () = + let add3 n (m, k) = n + m + k in + let open Nativeint_u in + + (* (30 - 20) / 3 = 3 *) + let o = (Sys.opaque_identity f6_1) () in + print_nativeintu "Test 6, 3" + (o#f6_m1 #30n #20n #3n); + + (* 4 * 8 = 32 *) + let o = (Sys.opaque_identity f6_2) (4,7) in + let result = o#f6_m2 8 #4n (fun x -> x * #2n) in + print_nativeintu "Test 6, 32" result; + + (* (1 + 2 + 3 + (-2) + (-12) + 4) * (2 + (-1) + 10) = -44 *) + let o = (Sys.opaque_identity f6_3) (1,2) 3 in + let result = + o#f6_m3 (-2) #2n + (fun[@inline never] i m1 m2 n m3 -> + (of_nativeint (Nativeint.of_int (add3 i n))) * (m1 + m2 + m3)) + (-#1n) (-12,4) #10n + in + print_nativeintu "Test 6, -44" result + +let _ = test6 () + +(*********************************************) +(* Test 7: nativeints and assert false joins *) + +module M = struct + open Nativeint_u + let[@inline never] f () = assert false + let g () = if Sys.opaque_identity true then #32n else f () +end + +let test7 () = + print_nativeintu "Test 7, 32" (M.g ()) + +let _ = test7 () diff --git a/testsuite/tests/typing-layouts-word/unboxed_nativeints.reference b/testsuite/tests/typing-layouts-word/unboxed_nativeints.reference new file mode 100644 index 00000000000..02de5b7b279 --- /dev/null +++ b/testsuite/tests/typing-layouts-word/unboxed_nativeints.reference @@ -0,0 +1,116 @@ +Test 1, three: 3 +Test 1, twice_three: 6 +Test 1, thrice_three: 9 +Test 1, twice_three_again: 6 +Test 1, three_again: 3 +Test 1, three_again_unsigned: 3 +Test 1, twice_three_greater_than_three: true +Test 1, three_with_effort: 3 +Test 1, seven_rem_three: 1 +Test 1, seven_rem_three_unsigned: 1 +Test1, forty_two_logand_three (0b00101010 & 0b00000011): 2 = 0b0000000000000000000000000000000000000000000000000000000000000010 +Test1, forty_two_logor_three (0b00101010 & 0b00000011): 43 = 0b0000000000000000000000000000000000000000000000000000000000101011 +Test1, forty_two_logxor_three (0b00101010 & 0b00000011): 41 = 0b0000000000000000000000000000000000000000000000000000000000101001 +Test1, lognot_three (~0b00000011): -4 = 0b1111111111111111111111111111111111111111111111111111111111111100 +Test1, three_shl_eight (0b00000011 << 8): 768 = 0b0000000000000000000000000000000000000000000000000000001100000000 +Test1, three_shr_one (0b00000011 >> 1): 1 = 0b0000000000000000000000000000000000000000000000000000000000000001 +Test1, three_shr_one (0b00000011 >>> 1): 1 = 0b0000000000000000000000000000000000000000000000000000000000000001 +Test 1, minus_five: -5 +Test 1, twice_minus_five: -10 +Test 1, thrice_minus_five: -15 +Test 1, twice_minus_five_again: -10 +Test 1, minus_five_again: -5 +Test 1, minus_five_again_unsigned: 9223372036854775803 +Test 1, minus_five_greater_than_twice_minus_five: true +Test 1, minus_five_with_effort: -5 +Test 1, seven_rem_minus_five: 2 +Test 1, seven_rem_minus_five_unsigned: 7 +Test1, forty_two_logand_minus_five (0b00101010 & 0b1...1011): 42 = 0b0000000000000000000000000000000000000000000000000000000000101010 +Test1, forty_two_logor_minus_five (0b00101010 & 0b1...1011): -5 = 0b1111111111111111111111111111111111111111111111111111111111111011 +Test1, forty_two_logxor_minus_five (0b00101010 & 0b1...1011): -47 = 0b1111111111111111111111111111111111111111111111111111111111010001 +Test1, lognot_minus_five (~0b1...1011): 4 = 0b0000000000000000000000000000000000000000000000000000000000000100 +Test1, minus_five_shl_eight (0b1...1011 << 8): -1280 = 0b1111111111111111111111111111111111111111111111111111101100000000 +Test1, minus_five_shr_one (0b1...1011 >> 1): -3 = 0b1111111111111111111111111111111111111111111111111111111111111101 +Test1, minus_five_shr_one (0b1...1011 >>> 1): 9223372036854775805 = 0b0111111111111111111111111111111111111111111111111111111111111101 +Test 1, size: 64 +Test 2, add three twice: 6 +Test 2, add three four times: 12 +Test 2, increment three twice: 5 +Test 2, increment three four times: 7 +Test 2, two times four: 8 +Test 2, three times sixteen: 48 +Test 2, three times sixteen again: 48 +Test 2, three minus four: -1 +Test 3, 5 * 3: : 15 + Test 3, step 0: 12 + Test 3, step 1: 9 + Test 3, step 2: 6 + Test 3, step 3: 3 + Test 3, step 4: 0 + Test 3, step 5: 0 + Test 3, step 6: 0 + Test 3, step 7: 0 + Test 3, step 8: 0 + Test 3, step 9: 0 +Test 3, 171: : 228 + Test 3, step 0: 0 + Test 3, step 1: 0 + Test 3, step 2: 0 + Test 3, step 3: 0 + Test 3, step 4: 171 + Test 3, step 5: 114 + Test 3, step 6: 57 + Test 3, step 7: 0 + Test 3, step 8: 0 + Test 3, step 9: 0 +Test 4, 1 + 2: 3 +Test 4, 1 - 2: -1 +Test 4, 5 * 3: : 15 + Test 4, step 0: 12 + Test 4, step 1: 9 + Test 4, step 2: 6 + Test 4, step 3: 3 + Test 4, step 4: 0 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 6 * 3: : 18 + Test 4, step 0: 15 + Test 4, step 1: 12 + Test 4, step 2: 9 + Test 4, step 3: 6 + Test 4, step 4: 3 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 5 * 3: : 15 + Test 4, step 0: 12 + Test 4, step 1: 9 + Test 4, step 2: 6 + Test 4, step 3: 3 + Test 4, step 4: 0 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 4, 6 * 3: : 18 + Test 4, step 0: 15 + Test 4, step 1: 12 + Test 4, step 2: 9 + Test 4, step 3: 6 + Test 4, step 4: 3 + Test 4, step 5: 0 + Test 4, step 6: 0 + Test 4, step 7: 0 + Test 4, step 8: 0 + Test 4, step 9: 0 +Test 5, 3 + 2 + 1: 6 +Test 6, 3: 3 +Test 6, 32: 32 +Test 6, -44: -44 +Test 7, 32: 32 diff --git a/testsuite/tests/typing-layouts-word/unboxed_nativeints_alpha.ml b/testsuite/tests/typing-layouts-word/unboxed_nativeints_alpha.ml new file mode 100644 index 00000000000..566a144419b --- /dev/null +++ b/testsuite/tests/typing-layouts-word/unboxed_nativeints_alpha.ml @@ -0,0 +1,316 @@ +(* TEST + include stdlib_upstream_compatible; + flambda2; + { + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + } +*) + +(* This should be read as a continuation of the [unboxed_nativeints.ml] test. + We can't put them there because: + - [unboxed_nativeints.ml] is run at all maturities, but + - these tests use features that only are enabled at the alpha maturity. + + Once mixed blocks move to the "stable" maturity level, we can + move these tests there. + *) + +(*****************************************) +(* Prelude: Functions on unboxed nativeints. *) + +module Nativeint_u = struct + include Stdlib_upstream_compatible.Nativeint_u + + let ( + ) = add + let ( - ) = sub + let ( * ) = mul + let ( / ) = div + let ( // ) = unsigned_div + let ( % ) = rem + let ( %% ) = unsigned_rem + let ( > ) x y = (compare x y) > 0 +end + +let print_float prefix x = Printf.printf "%s: %.2f\n" prefix x + +let to_binary_string x = + String.init Nativeint.size (fun i -> + if Nativeint.(equal (logand x (shift_left 1n (Nativeint.size - i - 1))) 0n) + then '0' + else '1') + +let print_int prefix x = + Printf.printf "%s: %d\n" prefix x + +let print_nativeintu prefix x = + Printf.printf "%s: %nd\n" prefix (Nativeint_u.to_nativeint x) + +let print_nativeintu_bin prefix x = + let bx = Nativeint_u.to_nativeint x in + Printf.printf "%s: %nd = 0b%s\n" prefix bx (to_binary_string bx) + +(***********************************) +(* Test: mixed blocks in closures *) + +(* Adapted from Test 3 in unboxed_nativeints.ml *) + +type block = + { x0_1 : int; + x0_2 : int; + x1 : nativeint#; + x2_1 : int; + x2_2 : int; + x3 : nativeint#; + x4_1 : int; + x4_2 : int; + x5 : nativeint#; + x6_1 : int; + x6_2 : int; + x7 : nativeint#; + x8_1 : int; + x8_2 : int; + x9 : nativeint#; + } + +let[@inline_never] f_mixed_blocks_and_closures + steps ({ x1; x0_1 = start_k; x0_2 = end_k; x8_1; x8_2; + x5; x6_1; x6_2; } as iargs) () = + let[@inline never] rec go k = + if k = end_k + then #0n + else begin + let (x2_1, x2_2) = iargs.x2_1, iargs.x2_2 in + let {x4_1; x4_2; _} = iargs in + let sum = x2_1 + x2_2 + x4_1 + x4_2 + x6_1 + x6_2 + x8_1 + x8_2 in + let acc = go (k + 1) in + steps.(k) <- Nativeint_u.to_nativeint acc; + Nativeint_u.(acc + ((x1 + iargs.x3 + x5 + iargs.x7 + iargs.x9) + * (of_nativeint (Nativeint.of_int sum)))) + end + in + go start_k + +let test_mixed_blocks_and_closures () = + (* Test f_mixed_blocks_and_closures + + (1 + 2 + 3 + 5 + 8) = 19 + 3 * (1 + 2 + 3 + 5 + 8) = 57 + 6 * (1 + 2 + 3 + 5 + 8) = 114 + 9 * (1 + 2 + 3 + 5 + 8) = 171 + *) + let steps = Array.init 10 (fun _ -> 0n) in + let x1 = #1n in + let x3 = #2n in + let x5 = #3n in + let x7 = #5n in + let x9 = #8n in + + (* all these 8 numbers together sum to 3 *) + let x2_1, x2_2 = (7, 42) in + let x4_1, x4_2 = (-23, 109) in + let x6_1, x6_2 = (-242, 90) in + let x8_1, x8_2 = (-2, 22) in + + let f = f_mixed_blocks_and_closures steps + { x0_1 = 4; x0_2 = 8; x1; x2_1; x2_2; x3; x4_1; x4_2; x5; + x6_1; x6_2; x7; x8_1; x8_2; x9 } + in + print_nativeintu "Test mixed_blocks_with_closures, 171: " (f ()); + Array.iteri (Printf.printf " Test mixed_blocks_with_closures, step %d: %nd\n") + steps + +let _ = test_mixed_blocks_and_closures () + +(**************************************) +(* Test: mixed record manipulation *) + +type t_mixed_record = + { a : float; + mutable b : int; + c : nativeint#; + mutable d : nativeint#; + e : int; + mutable f : nativeint# } + +(* Construction *) +let t_mixed1 = { a = 317.; + b = 1300; + c = #731n; + d = #141n; + e = 600; + f = #2710n; + } + +let t_mixed2 = { a = (-317.); + b = -1300; + c = -#731n; + d = -#141n; + e = -600; + f = -#2710n; + } + +let print_t_mixed t = + print_float " a" t.a; + print_int " b" t.b; + print_nativeintu " c" t.c; + print_nativeintu " d" t.d; + print_int " e" t.e; + print_nativeintu " f" t.f + +let _ = + Printf.printf "Test mixed record construction:\n"; + print_t_mixed t_mixed1; + print_t_mixed t_mixed2 + +(* Matching, projection *) +let f_mixed1 {c; d; f; _} r = + match r with + | { a; _ } -> + { a = Float.of_int r.e; + b = Nativeint_u.(to_int (of_float a - d)); + c = Nativeint_u.(r.c + c); + d = Nativeint_u.(d - (of_int r.b)); + e = Nativeint_u.(to_int (f + (of_int r.e))); + f = r.f; + } + +let _ = + Printf.printf "Test mixed record matching and projection:\n"; + print_t_mixed (f_mixed1 t_mixed1 t_mixed2) + +(* Record update and mutation *) +let f_mixed2 ({a; d; _} as r1) r2 = + r1.d <- #4200n; + let r3 = { r2 with c = r1.d; + d = #2500n; } + in + r3.b <- Nativeint_u.(to_int (of_float a + d)); + r2.b <- 1700; + r1.f <- r2.c; + r3 + +let _ = + Printf.printf "Test mixed record update and mutation:\n"; + let t_mixed3 = f_mixed2 t_mixed1 t_mixed2 in + print_t_mixed t_mixed1; + print_t_mixed t_mixed2; + print_t_mixed t_mixed3 + +(**************************************) +(* Test: mixed constructor manipulation *) + +type t_mixed_variant = + | Const + | T of + { a : float; + mutable b : int; + c : nativeint#; + mutable d : nativeint#; + e : int; + mutable f : nativeint# } + +(* Construction *) +let t_mixed_variant1 = T + { a = 317.; + b = 1300; + c = #731n; + d = #141n; + e = 600; + f = #2710n; + } + +let t_mixed_variant2 = T + { a = (-317.); + b = -1300; + c = -#731n; + d = -#141n; + e = -600; + f = -#2710n; + } + +let[@warning "-partial-match"] print_t_mixed_variant (T t) = + print_float " a" t.a; + print_int " b" t.b; + print_nativeintu " c" t.c; + print_nativeintu " d" t.d; + print_int " e" t.e; + print_nativeintu " f" t.f + +let _ = + Printf.printf "Test mixed variant construction:\n"; + print_t_mixed_variant t_mixed_variant1; + print_t_mixed_variant t_mixed_variant2 + +(* Matching, projection *) +let[@warning "-partial-match"] f_mixed1 (T {c; d; f; _}) r = + match r with + | T ({ a; _ } as r) -> + T + { a = Float.of_int r.e; + b = Nativeint_u.(to_int (of_float a - d)); + c = Nativeint_u.(r.c + c); + d = Nativeint_u.(d - (of_int r.b)); + e = Nativeint_u.(to_int (f + (of_int r.e))); + f = r.f; + } + +let _ = + Printf.printf "Test mixed variant matching and projection:\n"; + print_t_mixed_variant (f_mixed1 t_mixed_variant1 t_mixed_variant2) + +(* Variant update and mutation *) +let[@warning "-partial-match"] f_mixed2 (T ({a; d; _} as r1)) (T r2) = + r1.d <- #4200n; + let T r3 = T { r2 with c = r1.d; + d = #2500n; } + in + r3.b <- Nativeint_u.(to_int (of_float a + d)); + r2.b <- 1700; + r1.f <- r2.c; + T r3 + +let _ = + Printf.printf "Test mixed variant update and mutation:\n"; + let t_mixed_variant3 = f_mixed2 t_mixed_variant1 t_mixed_variant2 in + print_t_mixed_variant t_mixed_variant1; + print_t_mixed_variant t_mixed_variant2; + print_t_mixed_variant t_mixed_variant3 + +(************************************************************) +(* Test mixed records in recursive groups *) + +let rec f r = + r.d <- Nativeint_u.of_int t_rec1.b; + t_rec2.b <- 42; + t_rec1.f <- Nativeint_u.of_float t_rec1.a; + Nativeint_u.(of_float r.a + of_float t_rec2.a) + + +and t_rec1 = { a = 11.; + b = 2; + c = #33n; + d = #44n; + e = 5; + f = #66n; + } + +and t_rec2 = { a = (- 51.); + b = -6; + c = -#73n; + d = -#84n; + e = -9; + f = -#106n; + } + +let _ = + Printf.printf "Test 18, mixed records in recursive groups:\n"; + print_t_mixed t_rec1; + print_t_mixed t_rec2; + let result = f t_rec1 in + print_nativeintu " result (-40)" result; + print_t_mixed t_rec1; + print_t_mixed t_rec2 diff --git a/testsuite/tests/typing-layouts-word/unboxed_nativeints_alpha.reference b/testsuite/tests/typing-layouts-word/unboxed_nativeints_alpha.reference new file mode 100644 index 00000000000..3964141ee4f --- /dev/null +++ b/testsuite/tests/typing-layouts-word/unboxed_nativeints_alpha.reference @@ -0,0 +1,115 @@ +Test mixed_blocks_with_closures, 171: : 228 + Test mixed_blocks_with_closures, step 0: 0 + Test mixed_blocks_with_closures, step 1: 0 + Test mixed_blocks_with_closures, step 2: 0 + Test mixed_blocks_with_closures, step 3: 0 + Test mixed_blocks_with_closures, step 4: 171 + Test mixed_blocks_with_closures, step 5: 114 + Test mixed_blocks_with_closures, step 6: 57 + Test mixed_blocks_with_closures, step 7: 0 + Test mixed_blocks_with_closures, step 8: 0 + Test mixed_blocks_with_closures, step 9: 0 +Test mixed record construction: + a: 317.00 + b: 1300 + c: 731 + d: 141 + e: 600 + f: 2710 + a: -317.00 + b: -1300 + c: -731 + d: -141 + e: -600 + f: -2710 +Test mixed record matching and projection: + a: -600.00 + b: -458 + c: 0 + d: 1441 + e: 2110 + f: -2710 +Test mixed record update and mutation: + a: 317.00 + b: 1300 + c: 731 + d: 4200 + e: 600 + f: -731 + a: -317.00 + b: 1700 + c: -731 + d: -141 + e: -600 + f: -2710 + a: -317.00 + b: 458 + c: 4200 + d: 2500 + e: -600 + f: -2710 +Test mixed variant construction: + a: 317.00 + b: 1300 + c: 731 + d: 141 + e: 600 + f: 2710 + a: -317.00 + b: -1300 + c: -731 + d: -141 + e: -600 + f: -2710 +Test mixed variant matching and projection: + a: -600.00 + b: -458 + c: 0 + d: 1441 + e: 2110 + f: -2710 +Test mixed variant update and mutation: + a: 317.00 + b: 1300 + c: 731 + d: 4200 + e: 600 + f: -731 + a: -317.00 + b: 1700 + c: -731 + d: -141 + e: -600 + f: -2710 + a: -317.00 + b: 458 + c: 4200 + d: 2500 + e: -600 + f: -2710 +Test 18, mixed records in recursive groups: + a: 11.00 + b: 2 + c: 33 + d: 44 + e: 5 + f: 66 + a: -51.00 + b: -6 + c: -73 + d: -84 + e: -9 + f: -106 + result (-40): -40 + a: 11.00 + b: 2 + c: 33 + d: 2 + e: 5 + f: 11 + a: -51.00 + b: 42 + c: -73 + d: -84 + e: -9 + f: -106 diff --git a/testsuite/tests/typing-layouts/allow_illegal_crossing.ml b/testsuite/tests/typing-layouts/allow_illegal_crossing.ml new file mode 100644 index 00000000000..9128506b596 --- /dev/null +++ b/testsuite/tests/typing-layouts/allow_illegal_crossing.ml @@ -0,0 +1,966 @@ +(* TEST + { + flags = "-allow-illegal-crossing"; + expect; + } +*) + +(*************************************************************************************) +(* Test 1: nominative types can cross portability and contention axes when annotated *) + +type a +type b : value mod portable = { a : int; b : int } +[%%expect {| +type a +type b : value mod portable = { a : int; b : int; } +|}] + +type a +type b : value mod uncontended = Foo of int +[%%expect {| +type a +type b : value mod uncontended = Foo of int +|}] + +type a +type b : value mod uncontended portable = Foo of int | Bar of int +[%%expect {| +type a +type b : value mod uncontended portable = Foo of int | Bar of int +|}] + +module _ = struct + type a + type b : value mod uncontended = private a +end +[%%expect {| +Line 3, characters 2-44: +3 | type b : value mod uncontended = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 2, characters 2-8. + But the kind of type a must be a subkind of value mod uncontended + because of the definition of b at line 3, characters 2-44. +|}] + +type t : value mod portable uncontended = { a : int; b : int } +[%%expect {| +type t : value mod portable uncontended = { a : int; b : int; } +|}] + +type ('a, 'b) t : value mod portable uncontended = { a : 'a; b : 'b } +[%%expect {| +type ('a, 'b) t : value mod portable uncontended = { a : 'a; b : 'b; } +|}] + +type t : value mod portable = private { foo : string } +[%%expect {| +type t : value mod portable = private { foo : string; } +|}] + +type a : value mod portable = { foo : string } +type b : value mod portable = a = { foo : string } +[%%expect {| +type a : value mod portable = { foo : string; } +type b = a : value mod portable = { foo : string; } +|}] + +type a : value mod uncontended = private { foo : string } +type b : value mod uncontended = a = private { foo : string } +[%%expect {| +type a : value mod uncontended = private { foo : string; } +type b = a : value mod uncontended = private { foo : string; } +|}] + +type t : value mod uncontended = private Foo of int | Bar +[%%expect {| +type t : value mod uncontended = private Foo of int | Bar +|}] + +type a : value mod uncontended = Foo of int | Bar +type b : value mod uncontended = a = Foo of int | Bar +[%%expect {| +type a : value mod uncontended = Foo of int | Bar +type b = a : value mod uncontended = Foo of int | Bar +|}] + +type a : value mod portable = private Foo of int | Bar +type b : value mod portable = a = private Foo of int | Bar +[%%expect {| +type a : value mod portable = private Foo of int | Bar +type b = a : value mod portable = private Foo of int | Bar +|}] + +module A : sig + type t : value mod portable = { a : string } +end = struct + type t = { a : string } +end +[%%expect {| +module A : sig type t : value mod portable = { a : string; } end +|}] + +(********************************************) +(* Test 2: illegal mode crossing propogates *) + +type a : value mod portable uncontended = Foo of string +type ('a : value mod portable uncontended) b +type c = a b +[%%expect {| +type a : value mod portable uncontended = Foo of string +type ('a : value mod uncontended portable) b +type c = a b +|}] + +type t : value mod portable uncontended = { a : string; b : int } +let f : ('a : value mod portable uncontended). 'a -> 'a = fun x -> x +let g (x : t) = f x +[%%expect {| +type t : value mod portable uncontended = { a : string; b : int; } +val f : ('a : value mod uncontended portable). 'a -> 'a = +val g : t -> t = +|}] + +type t : value mod portable uncontended = { a : int; b : int } +let x : _ as (_ : value mod portable uncontended) = { a = 5; b = 5 } +[%%expect {| +type t : value mod portable uncontended = { a : int; b : int; } +val x : t = {a = 5; b = 5} +|}] + +type ('a, 'b) t : value mod portable uncontended = { a : 'a; b : 'b } +let x : _ as (_ : value mod portable uncontended) = { a = 5; b = 5 } +[%%expect {| +type ('a, 'b) t : value mod portable uncontended = { a : 'a; b : 'b; } +val x : (int, int) t = {a = 5; b = 5} +|}] + +type t : value mod portable uncontended = Foo of string | Bar of int +let x : _ as (_ : value mod portable uncontended) = Foo "hello world" +[%%expect {| +type t : value mod portable uncontended = Foo of string | Bar of int +val x : t = Foo "hello world" +|}] + +module A : sig + type t : value mod portable = { a : string } +end = struct + type t = { a : string } +end +type ('a : value mod portable) u = 'a +type v = A.t u +let x : _ as (_ : value mod portable) = ({ a = "hello" } : A.t) +[%%expect {| +module A : sig type t : value mod portable = { a : string; } end +type ('a : value mod portable) u = 'a +type v = A.t u +val x : A.t = {A.a = "hello"} +|}] + +type t : value mod portable = { a : string } +let my_str : string @@ nonportable = "" +let y = ({ a = my_str } : t @@ portable) +[%%expect {| +type t : value mod portable = { a : string; } +val my_str : string = "" +val y : t = {a = ""} +|}] + +type t : value mod portable = { a : string } +let my_str : string @@ nonportable = "" +let y : t @@ portable = { a = my_str } +[%%expect {| +type t : value mod portable = { a : string; } +val my_str : string = "" +Line 3, characters 30-36: +3 | let y : t @@ portable = { a = my_str } + ^^^^^^ +Error: This value is nonportable but expected to be portable. +|}] +(* CR layouts v2.8: this is unfortunate that this isn't accepted, but it is fine + since pushing the annotation to the right hand side resolves the issue, and + -allow-illegal-crossing is a short-term solution *) + +type t : value mod uncontended = { a : string } +let make_str () : string = failwith "" +let f () = + let _ = ({ a = make_str () } : t @@ uncontended) in + () +[%%expect {| +type t : value mod uncontended = { a : string; } +val make_str : unit -> string = +val f : unit -> unit = +|}] + +type t : value mod uncontended = { a : string } +let make_str () : string = failwith "" +let f () = + let _ : t @@ uncontended = { a = make_str () } in + () +[%%expect {| +type t : value mod uncontended = { a : string; } +val make_str : unit -> string = +val f : unit -> unit = +|}] +(* CR layouts v2.8: this is unfortunate that this isn't accepted, but it is fine + since pushing the annotation to the right hand side resolves the issue, and + -allow-illegal-crossing is a short-term solution *) + +type t_value : value +type t : value mod portable uncontended = Foo of t_value +let make_value () : t_value = failwith "" +let f () = + let _ = (Foo (make_value ()) : t @@ portable uncontended) in + () +[%%expect {| +type t_value : value +type t : value mod portable uncontended = Foo of t_value +val make_value : unit -> t_value = +val f : unit -> unit = +|}] + +type t : value mod portable = { a : string } +let my_str : string @@ nonportable = "" +let y = ({ a = my_str } : _ @@ portable) +[%%expect {| +type t : value mod portable = { a : string; } +val my_str : string = "" +Line 3, characters 15-21: +3 | let y = ({ a = my_str } : _ @@ portable) + ^^^^^^ +Error: This value is nonportable but expected to be portable. +|}] +(* CR layouts v2.8: this is unfortunate that this isn't accepted, but it is fine + since adding the type to the annotation resolves the issue, and + -allow-illegal-crossing is a short-term solution *) + +let f (_x : _ @@ portable uncontended) = () +type t : value mod portable uncontended = Foo of string | Bar of int +let g (x : t @@ nonportable contended) = f x; f (Foo ""); f (Bar 10) +[%%expect {| +val f : 'a @ portable -> unit = +type t : value mod portable uncontended = Foo of string | Bar of int +val g : t @ contended -> unit = +|}] + +(* Demonstrate that -allow-illegal-crossing allows for unsound mode-crossing *) +module Unsound : sig + val cross : 'a @ nonportable contended -> 'a @ portable uncontended +end = struct + type 'a box : value mod portable uncontended = { value : 'a } + let cross x = + let box = { value = x } in + box.value +end + +module Value : sig + type t + val value : t +end = struct + type t = Foo + let value = Foo +end + +let x : Value.t @@ portable uncontended = Unsound.cross Value.value +[%%expect {| +module Unsound : sig val cross : 'a @ contended -> 'a @ portable end +module Value : sig type t val value : t end +val x : Value.t = +|}] + +(* Validate above testing technique *) +let x : Value.t @@ portable uncontended = Value.value +[%%expect {| +Line 1, characters 42-53: +1 | let x : Value.t @@ portable uncontended = Value.value + ^^^^^^^^^^^ +Error: This value is nonportable but expected to be portable. +|}] +(********************************************************) +(* Test 3: types cannot cross other axes when annotated *) + +type a +type b : value mod global = private a +[%%expect {| +type a +Line 2, characters 0-37: +2 | type b : value mod global = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod global + because of the definition of b at line 2, characters 0-37. +|}] + +type a +type b : value mod many = private a +[%%expect {| +type a +Line 2, characters 0-35: +2 | type b : value mod many = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod many + because of the definition of b at line 2, characters 0-35. +|}] + +type a +type b : value mod unique = private a +[%%expect {| +type a +Line 2, characters 0-37: +2 | type b : value mod unique = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod unique + because of the definition of b at line 2, characters 0-37. +|}] + +type a +type b : immediate = private a +[%%expect {| +type a +Line 2, characters 0-30: +2 | type b : immediate = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of immediate + because of the definition of b at line 2, characters 0-30. +|}] + +module _ = struct + type a + type b : value mod global = private a +end +[%%expect {| +Line 3, characters 2-39: +3 | type b : value mod global = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a/2 is value + because of the definition of a at line 2, characters 2-8. + But the kind of type a/2 must be a subkind of value mod global + because of the definition of b at line 3, characters 2-39. +|}] + +module A : sig + type t +end = struct + type t : value mod many = private string +end +[%%expect {| +Line 4, characters 2-42: +4 | type t : value mod many = private string + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type string is value + because it is the primitive value type string. + But the kind of type string must be a subkind of value mod many + because of the definition of t at line 4, characters 2-42. +|}] + +type t : value mod external_ = private string +[%%expect {| +Line 1, characters 0-45: +1 | type t : value mod external_ = private string + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type string is value + because it is the primitive value type string. + But the kind of type string must be a subkind of value mod external_ + because of the definition of t at line 1, characters 0-45. +|}] + +type t : value mod global = { a : int; b : int } +[%%expect {| +Line 1, characters 0-48: +1 | type t : value mod global = { a : int; b : int } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] + +type ('a, 'b) t : value mod many = { a : 'a; b : 'b } +[%%expect {| +Line 1, characters 0-53: +1 | type ('a, 'b) t : value mod many = { a : 'a; b : 'b } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod many + because of the annotation on the declaration of the type t. +|}] + +type a : value mod unique = private b +and b +[%%expect {| +Line 1, characters 0-37: +1 | type a : value mod unique = private b + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type b is value + because an abstract type has the value kind by default. + But the kind of type b must be a subkind of value mod unique + because of the definition of a at line 1, characters 0-37. +|}] + +type a +and b : value mod global = private a +[%%expect {| +Line 2, characters 0-36: +2 | and b : value mod global = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a/3 is value + because an abstract type has the value kind by default. + But the kind of type a/3 must be a subkind of value mod global + because of the definition of b at line 2, characters 0-36. +|}] + +module rec A : sig + type t : value mod external_ +end = struct + type t : value mod external_ = private B.t +end +and B : sig + type t +end = struct + type t +end +[%%expect {| +Line 4, characters 2-44: +4 | type t : value mod external_ = private B.t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type B.t is value + because of the definition of t at line 7, characters 2-8. + But the kind of type B.t must be a subkind of value mod external_ + because of the definition of t at line 4, characters 2-44. +|}] + +module rec A : sig + type t +end = struct + type t +end +and B : sig + type t : value mod many +end = struct + type t : value mod many = private A.t +end +[%%expect {| +Line 9, characters 2-39: +9 | type t : value mod many = private A.t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type A.t is value + because of the definition of t at line 2, characters 2-8. + But the kind of type A.t must be a subkind of value mod many + because of the definition of t at line 9, characters 2-39. +|}] + +(*********************************************************************************) +(* Test 4: types cannot cross portability and contention axes when not annotated *) + +module A : sig + type t : value mod portable +end = struct + type t = { a : string } +end +[%%expect {| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { a : string } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { a : string; } end + is not included in + sig type t : value mod portable end + Type declarations do not match: + type t = { a : string; } + is not included in + type t : value mod portable + The kind of the first is value + because of the definition of t at line 4, characters 2-25. + But the kind of the first must be a subkind of value mod portable + because of the definition of t at line 2, characters 2-29. +|}] + +module A : sig + type t : value mod portable = { a : string } +end = struct + type t = { a : string } + type ('a : value mod portable) u = 'a + type v = t u +end +[%%expect {| +Line 6, characters 11-12: +6 | type v = t u + ^ +Error: This type t should be an instance of type ('a : value mod portable) + The kind of t is value + because of the definition of t at line 4, characters 2-25. + But the kind of t must be a subkind of value mod portable + because of the definition of u at line 5, characters 2-39. +|}] + +module A : sig + type t : value mod portable = { a : string } +end = struct + type t = { a : string } + let x : _ as (_ : value mod portable) = { a = "hello" } +end +[%%expect {| +Line 5, characters 42-57: +5 | let x : _ as (_ : value mod portable) = { a = "hello" } + ^^^^^^^^^^^^^^^ +Error: This expression has type t but an expression was expected of type + ('a : value mod portable) + The kind of t is value + because of the definition of t at line 4, characters 2-25. + But the kind of t must be a subkind of value mod portable + because of the annotation on the wildcard _ at line 5, characters 20-38. +|}] + +type a +type b : value mod portable = a +[%%expect {| +type a +Line 2, characters 0-31: +2 | type b : value mod portable = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod portable + because of the definition of b at line 2, characters 0-31. +|}] + +type a = { foo : int; bar : string } +type b : any mod portable = a +[%%expect {| +type a = { foo : int; bar : string; } +Line 2, characters 0-29: +2 | type b : any mod portable = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-36. + But the kind of type a must be a subkind of any mod portable + because of the definition of b at line 2, characters 0-29. +|}] + +type a = Foo of int | Bar of string +type b : any mod uncontended = a +[%%expect {| +type a = Foo of int | Bar of string +Line 2, characters 0-32: +2 | type b : any mod uncontended = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-35. + But the kind of type a must be a subkind of any mod uncontended + because of the definition of b at line 2, characters 0-32. +|}] + +module Foo : sig + type t +end = struct + type t : value mod portable = string +end +type t : value mod portable = Foo.t +[%%expect {| +Line 4, characters 2-38: +4 | type t : value mod portable = string + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type string is value + because it is the primitive value type string. + But the kind of type string must be a subkind of value mod portable + because of the definition of t at line 4, characters 2-38. +|}] + +type a = { foo : string } +type b : value mod portable = a = { foo : string } +[%%expect {| +type a = { foo : string; } +Line 2, characters 0-50: +2 | type b : value mod portable = a = { foo : string } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-25. + But the kind of type a must be a subkind of value mod portable + because of the definition of b at line 2, characters 0-50. +|}] + +type a = private { foo : string } +type b : value mod uncontended = a = private { foo : string } +[%%expect {| +type a = private { foo : string; } +Line 2, characters 0-61: +2 | type b : value mod uncontended = a = private { foo : string } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-33. + But the kind of type a must be a subkind of value mod uncontended + because of the definition of b at line 2, characters 0-61. +|}] + +type a = Foo of string | Bar +type b : value mod uncontended = a = Foo of string | Bar +[%%expect {| +type a = Foo of string | Bar +Line 2, characters 0-56: +2 | type b : value mod uncontended = a = Foo of string | Bar + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-28. + But the kind of type a must be a subkind of value mod uncontended + because of the definition of b at line 2, characters 0-56. +|}] + +type a = private Foo of string | Bar +type b : value mod portable = a = private Foo of string | Bar +[%%expect {| +type a = private Foo of string | Bar +Line 2, characters 0-61: +2 | type b : value mod portable = a = private Foo of string | Bar + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-36. + But the kind of type a must be a subkind of value mod portable + because of the definition of b at line 2, characters 0-61. +|}] + +type ('a : value mod uncontended) of_uncontended +type t = string of_uncontended +[%%expect {| +type ('a : value mod uncontended) of_uncontended +Line 2, characters 9-15: +2 | type t = string of_uncontended + ^^^^^^ +Error: This type string should be an instance of type + ('a : value mod uncontended) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod uncontended + because of the definition of of_uncontended at line 1, characters 0-48. +|}] + +type ('a : value mod portable) of_portable +type t = { foo : int } +type u = t of_portable +[%%expect {| +type ('a : value mod portable) of_portable +type t = { foo : int; } +Line 3, characters 9-10: +3 | type u = t of_portable + ^ +Error: This type t should be an instance of type ('a : value mod portable) + The kind of t is value + because of the definition of t at line 2, characters 0-22. + But the kind of t must be a subkind of value mod portable + because of the definition of of_portable at line 1, characters 0-42. +|}] + +let f : ('a : value mod portable). 'a -> 'a = fun x -> x +let _ = f "hello" +[%%expect {| +val f : ('a : value mod portable). 'a -> 'a = +Line 2, characters 10-17: +2 | let _ = f "hello" + ^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : value mod portable) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod portable + because of the definition of f at line 1, characters 4-5. +|}] + +let f : ('a : value mod uncontended). 'a -> 'a = fun x -> x +let _ = f "hello" +[%%expect {| +val f : ('a : value mod uncontended). 'a -> 'a = +Line 2, characters 10-17: +2 | let _ = f "hello" + ^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : value mod uncontended) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod uncontended + because of the definition of f at line 1, characters 4-5. +|}] + +(* immediate types can still cross *) +let f : ('a : value mod portable uncontended). 'a -> 'a = fun x -> x +let _ = f 0 +[%%expect {| +val f : ('a : value mod uncontended portable). 'a -> 'a = +- : int = 0 +|}] + +(*****************************************) +(* Test 5: values cannot illegally cross *) + +let x : _ as (_ : value mod portable) = "hello world" +[%%expect {| +Line 1, characters 40-53: +1 | let x : _ as (_ : value mod portable) = "hello world" + ^^^^^^^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : value mod portable) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod portable + because of the annotation on the wildcard _ at line 1, characters 18-36. +|}] + +type t = { str : string } +let f _ : _ as (_ : value mod uncontended) = { str = "hello world" } +[%%expect {| +type t = { str : string; } +Line 2, characters 45-68: +2 | let f _ : _ as (_ : value mod uncontended) = { str = "hello world" } + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t but an expression was expected of type + ('a : value mod uncontended) + The kind of t is value + because of the definition of t at line 1, characters 0-25. + But the kind of t must be a subkind of value mod uncontended + because of the annotation on the wildcard _ at line 2, characters 20-41. +|}] + +type t = Foo of string +let f : ('a : value mod portable). 'a -> 'a = fun _ -> Foo "hello world" +[%%expect {| +type t = Foo of string +Line 2, characters 55-72: +2 | let f : ('a : value mod portable). 'a -> 'a = fun _ -> Foo "hello world" + ^^^^^^^^^^^^^^^^^ +Error: This expression has type t but an expression was expected of type + ('a : value mod portable) + The kind of t is value + because of the definition of t at line 1, characters 0-22. + But the kind of t must be a subkind of value mod portable + because of the annotation on the universal variable 'a. +|}] + +type t = string +let x : ('a : value mod uncontended) = ("hello world" : t) +[%%expect {| +type t = string +Line 2, characters 39-58: +2 | let x : ('a : value mod uncontended) = ("hello world" : t) + ^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t = string + but an expression was expected of type ('a : value mod uncontended) + The kind of t is value + because it is the primitive value type string. + But the kind of t must be a subkind of value mod uncontended + because of the annotation on the type variable 'a. +|}] + +(***************************************) +(* Test 6: layout check is not ignored *) + +type a : word +type b : value mod portable = a +[%%expect {| +type a : word +Line 2, characters 0-31: +2 | type b : value mod portable = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type a is word + because of the definition of a at line 1, characters 0-13. + But the layout of type a must be a sublayout of value + because of the definition of b at line 2, characters 0-31. +|}] + +type a : bits64 +type b : float32 mod uncontended = a +[%%expect {| +type a : bits64 +Line 2, characters 0-36: +2 | type b : float32 mod uncontended = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type a is bits64 + because of the definition of a at line 1, characters 0-15. + But the layout of type a must be a sublayout of float32 + because of the definition of b at line 2, characters 0-36. +|}] + +type a : any +type b : value mod uncontended = a +[%%expect {| +type a : any +Line 2, characters 0-34: +2 | type b : value mod uncontended = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type a is any + because of the definition of a at line 1, characters 0-12. + But the layout of type a must be a sublayout of value + because of the definition of b at line 2, characters 0-34. +|}] + +(****************************************************************) +(* Test 7: Non-nominative types cannot perform illegal crossing *) + +type a +type b : value mod portable = a +[%%expect {| +type a +Line 2, characters 0-31: +2 | type b : value mod portable = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod portable + because of the definition of b at line 2, characters 0-31. +|}] + +type a +type b : value mod uncontended = a +[%%expect {| +type a +Line 2, characters 0-34: +2 | type b : value mod uncontended = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod uncontended + because of the definition of b at line 2, characters 0-34. +|}] + +type a +type b : value mod portable = private a +[%%expect {| +type a +Line 2, characters 0-39: +2 | type b : value mod portable = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod portable + because of the definition of b at line 2, characters 0-39. +|}] + +type a +type b : value mod uncontended = private a +[%%expect {| +type a +Line 2, characters 0-42: +2 | type b : value mod uncontended = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-6. + But the kind of type a must be a subkind of value mod uncontended + because of the definition of b at line 2, characters 0-42. +|}] + +type a : word +type b : any mod uncontended portable = private a +[%%expect {| +type a : word +Line 2, characters 0-49: +2 | type b : any mod uncontended portable = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is word + because of the definition of a at line 1, characters 0-13. + But the kind of type a must be a subkind of + any mod uncontended portable + because of the definition of b at line 2, characters 0-49. +|}] + +type a : value mod global many unique external_ +type b : immediate = private a +[%%expect {| +type a : value mod global many unique external_ +Line 2, characters 0-30: +2 | type b : immediate = private a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value mod global unique many external_ + because of the definition of a at line 1, characters 0-47. + But the kind of type a must be a subkind of immediate + because of the definition of b at line 2, characters 0-30. +|}] + +module A : sig + type t +end = struct + type t : value mod portable = private string +end +[%%expect {| +Line 4, characters 2-46: +4 | type t : value mod portable = private string + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type string is value + because it is the primitive value type string. + But the kind of type string must be a subkind of value mod portable + because of the definition of t at line 4, characters 2-46. +|}] + +type a : value mod portable uncontended = private b +and b +[%%expect {| +Line 1, characters 0-51: +1 | type a : value mod portable uncontended = private b + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type b is value + because an abstract type has the value kind by default. + But the kind of type b must be a subkind of + value mod uncontended portable + because of the definition of a at line 1, characters 0-51. +|}] + +type a +and b : value mod portable uncontended = a +[%%expect {| +Line 2, characters 0-42: +2 | and b : value mod portable uncontended = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a/2 is value + because an abstract type has the value kind by default. + But the kind of type a/2 must be a subkind of + value mod uncontended portable + because of the definition of b at line 2, characters 0-42. +|}] + +module rec A : sig + type t : value mod portable uncontended +end = struct + type t : value mod portable uncontended = B.t +end +and B : sig + type t +end = struct + type t +end +[%%expect {| +Line 4, characters 2-47: +4 | type t : value mod portable uncontended = B.t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type B.t is value + because of the definition of t at line 7, characters 2-8. + But the kind of type B.t must be a subkind of + value mod uncontended portable + because of the definition of t at line 4, characters 2-47. +|}] + +module rec A : sig + type t +end = struct + type t +end +and B : sig + type t : value mod portable uncontended +end = struct + type t : value mod portable uncontended = private A.t +end +[%%expect {| +Line 9, characters 2-55: +9 | type t : value mod portable uncontended = private A.t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type A.t is value + because of the definition of t at line 2, characters 2-8. + But the kind of type A.t must be a subkind of + value mod uncontended portable + because of the definition of t at line 9, characters 2-55. +|}] diff --git a/testsuite/tests/typing-layouts/annots-failing.ml b/testsuite/tests/typing-layouts/annots-failing.ml index db322b9fe4f..066bed2a7a1 100644 --- a/testsuite/tests/typing-layouts/annots-failing.ml +++ b/testsuite/tests/typing-layouts/annots-failing.ml @@ -1,8 +1,8 @@ (* TEST - * skip - reason = "bugs not fixed yet" - ** expect - flags = "-extension layouts_alpha" + reason = "bugs not fixed yet"; + skip; + flags = "-extension layouts_alpha"; + expect; *) (* CR layouts v1.5: merge this with annots.ml after these all pass *) diff --git a/testsuite/tests/typing-layouts/annots.ml b/testsuite/tests/typing-layouts/annots.ml index a40c545e65c..4696c97cfd5 100644 --- a/testsuite/tests/typing-layouts/annots.ml +++ b/testsuite/tests/typing-layouts/annots.ml @@ -1,94 +1,176 @@ (* TEST - * expect - flags = "-extension layouts" + include stdlib_upstream_compatible; + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } *) - type t_value : value type t_imm : immediate type t_imm64 : immediate64 -;; +type t_float64 : float64 +type t_any : any;; + [%%expect{| type t_value : value type t_imm : immediate type t_imm64 : immediate64 -|}];; +type t_float64 : float64 +type t_any : any +|}] -type t_any : any;; +type t_void : void;; [%%expect{| -Line 1, characters 13-16: -1 | type t_any : any;; - ^^^ -Error: Layout any is used here, but the appropriate layouts extension is not enabled +Line 1, characters 14-18: +1 | type t_void : void;; + ^^^^ +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. |}] -type t_void : void +type t_any_non_null : any_non_null;; [%%expect{| -Line 1, characters 14-18: -1 | type t_void : void - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +type t_any_non_null : any_non_null +|}] + +type t_value_or_null : value_or_null;; + +[%%expect{| +Line 1, characters 23-36: +1 | type t_value_or_null : value_or_null;; + ^^^^^^^^^^^^^ +Error: Layout value_or_null is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. +|}] + +type t_value_mod_global : value mod global +type t_value_mod_local : value mod local +type t_value_mod_many : value mod many +type t_value_mod_once : value mod once +type t_value_mod_unique : value mod unique +type t_value_mod_shared : value mod shared +type t_value_mod_internal : value mod internal +type t_value_mod_contended : value mod contended +type t_value_mod_uncontended : value mod uncontended +type t_value_mod_portable : value mod portable +type t_value_mod_nonportable : value mod nonportable +type t_value_mod_external : value mod external_ +type t_value_mod_external64 : value mod external64 + +[%%expect{| +type t_value_mod_global : value mod global +type t_value_mod_local : value mod local +type t_value_mod_many : value mod many +type t_value_mod_once : value mod once +type t_value_mod_unique : value mod unique +type t_value_mod_shared : value mod shared +type t_value_mod_internal : value mod internal +type t_value_mod_contended : value mod contended +type t_value_mod_uncontended : value mod uncontended +type t_value_mod_portable : value mod portable +type t_value_mod_nonportable : value mod nonportable +type t_value_mod_external : value mod external_ +type t_value_mod_external64 : value mod external64 +|}] + +type t1 : float32 mod internal shared many local +type t2 : bits64 mod once external64 unique +type t3 : immediate mod local unique +type t4 : value mod local local +type t5 : float64 mod global global +type t6 : bits32 mod local global +type t7 : bits64 mod global local +type t8 : value mod global local many once unique shared internal uncontended contended + portable nonportable external64 external_ + +[%%expect{| +type t1 : float32 mod internal shared many local +type t2 : bits64 mod once external64 unique +type t3 : immediate mod local unique +type t4 : value mod local local +type t5 : float64 mod global global +type t6 : bits32 mod local global +type t7 : bits64 mod global local +type t8 + : value mod global local many once unique shared internal uncontended + contended portable nonportable external64 external_ |}] (***************************************) (* Test 1: annotation on type variable *) -let x : int as ('a : value) = 5 +let x : int as ('a: value) = 5 let x : int as ('a : immediate) = 5 -;; -[%%expect {| -val x : int = 5 -Line 2, characters 21-30: -2 | let x : int as ('a : immediate) = 5 - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. -|}] -(* CR layouts: fix when [immediate] becomes available in [layouts] *) - let x : int as ('a : any) = 5;; +let x : int as ('a: value mod global shared many uncontended portable external_) = 5 [%%expect{| -Line 1, characters 21-24: -1 | let x : int as ('a : any) = 5;; - ^^^ -Error: Layout any is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val x : int = 5 +val x : int = 5 +val x : int = 5 +val x : int = 5 +|}] + +let x : int as ('a : float64) = 5;; +[%%expect {| +Line 1, characters 8-29: +1 | let x : int as ('a : float64) = 5;; + ^^^^^^^^^^^^^^^^^^^^^ +Error: This alias is bound to type int but is used as an instance of type + ('a : float64) + The layout of int is value + because it is the primitive immediate type int. + But the layout of int must be a sublayout of float64 + because of the annotation on the type variable 'a. |}] -(* CR layouts: fix when [any] becomes available in [layouts] *) let x : (int as ('a : immediate)) list as ('b : value) = [3;4;5] ;; [%%expect {| -Line 1, characters 22-31: -1 | let x : (int as ('a : immediate)) list as ('b : value) = [3;4;5] - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val x : int list = [3; 4; 5] |}] let x : int list as ('a : immediate) = [3;4;5] ;; [%%expect {| -Line 1, characters 26-35: +Line 1, characters 8-36: 1 | let x : int list as ('a : immediate) = [3;4;5] - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This alias is bound to type int list + but is used as an instance of type ('a : immediate) + The kind of int list is value + because it's a boxed variant type. + But the kind of int list must be a subkind of immediate + because of the annotation on the type variable 'a. +|}] +(* CR layouts: error message could be phrased better *) + +let x : int list as ('a : value mod global) = [3;4;5] +[%%expect {| +Line 1, characters 8-43: +1 | let x : int list as ('a : value mod global) = [3;4;5] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This alias is bound to type int list + but is used as an instance of type ('a : value mod global) + The kind of int list is value + because it's a boxed variant type. + But the kind of int list must be a subkind of value mod global + because of the annotation on the type variable 'a. |}] (****************************************) (* Test 2: Annotation on type parameter *) -(* CR layouts: move over beta tests once [immediate] is allowed in [layouts] *) - type ('a : value) t2 type (_ : value) t2' type t3 = int t2 type t4 = bool t2 -;; + [%%expect {| type 'a t2 type _ t2' @@ -96,6 +178,39 @@ type t3 = int t2 type t4 = bool t2 |}] +type t = string t2 +;; +[%%expect {| +type t = string t2 +|}] + +type ('a : immediate) t2_imm +type (_ : immediate) t2_imm' +type t1 = int t2_imm +type t2' = bool t2_imm' +type ('a : float64) t2_float64 +type (_ : float64) t2_float64' +type t3 = float# t2_float64 +type ('a : value mod global) t2_global +type (_ : value mod global) t2_global' +type ('a : word mod external_ many shared) t2_complex +type (_ : word mod external_ many shared) t2_complex' + + +[%%expect {| +type ('a : immediate) t2_imm +type (_ : immediate) t2_imm' +type t1 = int t2_imm +type t2' = bool t2_imm' +type ('a : float64) t2_float64 +type (_ : float64) t2_float64' +type t3 = float# t2_float64 +type ('a : value mod global) t2_global +type (_ : value mod global) t2_global' +type ('a : word mod many external_) t2_complex +type (_ : word mod many external_) t2_complex' +|}] + module M1 : sig type ('a : value) t end = struct @@ -113,10 +228,245 @@ module M1 : sig type 'a t end module M2 : sig type _ t end |}] -type t = string t2 +module M1 : sig + type ('a : immediate) t +end = struct + type (_ : immediate) t +end + +module M2 : sig + type (_ : immediate) t +end = struct + type ('a : immediate) t +end + +[%%expect {| +module M1 : sig type ('a : immediate) t end +module M2 : sig type (_ : immediate) t end +|}] + +module M1 : sig + type ('a : value mod global) t +end = struct + type (_ : value mod global) t +end + +module M2 : sig + type (_ : value mod global) t +end = struct + type ('a : value mod global) t +end + +[%%expect {| +module M1 : sig type ('a : value mod global) t end +module M2 : sig type (_ : value mod global) t end +|}] + +module M1 : sig + type ('a : word mod external_ many shared) t +end = struct + type (_ : word mod external_ many shared) t +end + +module M2 : sig + type (_ : word mod external_ many shared) t +end = struct + type ('a : word mod external_ many shared) t +end + +[%%expect {| +module M1 : sig type ('a : word mod many external_) t end +module M2 : sig type (_ : word mod many external_) t end +|}] + +type t = string t2_imm ;; [%%expect {| -type t = string t2 +Line 1, characters 9-15: +1 | type t = string t2_imm + ^^^^^^ +Error: This type string should be an instance of type ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of t2_imm at line 1, characters 0-28. +|}] + +type t = string t2_global +;; +[%%expect {| +Line 1, characters 9-15: +1 | type t = string t2_global + ^^^^^^ +Error: This type string should be an instance of type ('a : value mod global) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod global + because of the definition of t2_global at line 8, characters 0-38. +|}] + +type u : word +type t = u t2_complex +;; +[%%expect {| +type u : word +Line 2, characters 9-10: +2 | type t = u t2_complex + ^ +Error: This type u should be an instance of type + ('a : word mod many external_) + The kind of u is word + because of the definition of u at line 1, characters 0-13. + But the kind of u must be a subkind of word mod many external_ + because of the definition of t2_complex at line 10, characters 0-53. +|}] + +let f : 'a t2_imm -> 'a t2_imm = fun x -> x +let f : 'a t2_global -> 'a t2_global = fun x -> x +let f : 'a t2_complex -> 'a t2_complex = fun x -> x +[%%expect {| +val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = +val f : ('a : value mod global). 'a t2_global -> 'a t2_global = +val f : ('a : word mod many external_). 'a t2_complex -> 'a t2_complex = + +|}] + +let f : ('a : immediate) t2_imm -> ('a : value) t2_imm = fun x -> x +let f : ('a : value mod global) t2_global -> ('a : value) t2_global = fun x -> x +let f : ('a : word mod external_ many shared) t2_complex -> ('a : word) t2_complex = fun x -> x +[%%expect {| +val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = +val f : ('a : value mod global). 'a t2_global -> 'a t2_global = +val f : ('a : word mod many external_). 'a t2_complex -> 'a t2_complex = + +|}] + +let f : ('a : value) t2_imm -> ('a : value) t2_imm = fun x -> x +let f : ('a : value) t2_global -> ('a : value) t2_global = fun x -> x +let f : ('a : word) t2_complex -> ('a : word) t2_complex = fun x -> x +[%%expect {| +val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = +val f : ('a : value mod global). 'a t2_global -> 'a t2_global = +val f : ('a : word mod many external_). 'a t2_complex -> 'a t2_complex = + +|}] + +let f : ('a : immediate). 'a t2_imm -> 'a t2_imm = fun x -> x +let f : ('a : value mod global). 'a t2_global -> 'a t2_global = fun x -> x +let f : ('a : word mod external_ many shared). 'a t2_complex -> 'a t2_complex = fun x -> x +[%%expect {| +val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = +val f : ('a : value mod global). 'a t2_global -> 'a t2_global = +val f : ('a : word mod many external_). 'a t2_complex -> 'a t2_complex = + +|}] + +let f : ('a : value). 'a t2_imm -> 'a t2_imm = fun x -> x +;; +[%%expect {| +Line 1, characters 8-44: +1 | let f : ('a : value). 'a t2_imm -> 'a t2_imm = fun x -> x + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was declared to have kind value. + But it was inferred to have kind immediate + because of the definition of t2_imm at line 1, characters 0-28. +|}] + +let f : ('a : value). 'a t2_global -> 'a t2_global = fun x -> x +;; +[%%expect {| +Line 1, characters 8-50: +1 | let f : ('a : value). 'a t2_global -> 'a t2_global = fun x -> x + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was declared to have kind value. + But it was inferred to have kind value mod global + because of the definition of t2_global at line 8, characters 0-38. +|}] + +let f : ('a : word). 'a t2_complex -> 'a t2_complex = fun x -> x +;; +[%%expect {| +Line 1, characters 8-51: +1 | let f : ('a : word). 'a t2_complex -> 'a t2_complex = fun x -> x + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was declared to have kind word. + But it was inferred to have kind word mod many external_ + because of the definition of t2_complex at line 10, characters 0-53. +|}] + +type 'a t = 'a t2_imm +type 'a t = 'a t2_global +type 'a t = 'a t2_complex +[%%expect {| +type ('a : immediate) t = 'a t2_imm +type ('a : value mod global) t = 'a t2_global +type ('a : word mod many external_) t = 'a t2_complex +|}] + +type ('a : value) t = 'a t2_imm +type ('a : value) t = 'a t2_global +type ('a : word) t = 'a t2_complex +[%%expect {| +type ('a : immediate) t = 'a t2_imm +type ('a : value mod global) t = 'a t2_global +type ('a : word mod many external_) t = 'a t2_complex +|}] + +type ('a : immediate) t = 'a t2_imm +type ('a : value mod global) t = 'a t2_global +type ('a : word mod external_ many shared) t = 'a t2_complex +[%%expect {| +type ('a : immediate) t = 'a t2_imm +type ('a : value mod global) t = 'a t2_global +type ('a : word mod many external_) t = 'a t2_complex +|}] + +let f : (_ : value) t2_imm -> unit = fun _ -> () +let g : (_ : immediate) t2_imm -> unit = fun _ -> () + +let f : (_ : value) t2_global -> unit = fun _ -> () +let g : (_ : value mod global) t2_global -> unit = fun _ -> () + +let f : (_ : word) t2_complex -> unit = fun _ -> () +let g : (_ : word mod external_ many shared) t2_complex -> unit = fun _ -> () + +[%%expect {| +val f : ('a : immediate). 'a t2_imm -> unit = +val g : ('a : immediate). 'a t2_imm -> unit = +val f : ('a : value mod global). 'a t2_global -> unit = +val g : ('a : value mod global). 'a t2_global -> unit = +val f : ('a : word mod many external_). 'a t2_complex -> unit = +val g : ('a : word mod many external_). 'a t2_complex -> unit = +|}] + +let f : (_ : immediate) -> unit = fun _ -> () +let f : (_ : value mod global) -> unit = fun _ -> () +let f : (_ : word mod external_ many shared) -> unit = fun _ -> () +let g : (_ : value) -> unit = fun _ -> () + +[%%expect {| +val f : ('a : immediate). 'a -> unit = +val f : ('a : value mod global). 'a -> unit = +val f : ('a : word mod many external_). 'a -> unit = +val g : 'a -> unit = +|}] + +let f : (_ : immediate) -> (_ : value) = fun _ -> assert false +let g : (_ : value) -> (_ : immediate) = fun _ -> assert false + +let f : (_ : value mod global) -> (_ : value) = fun _ -> assert false +let g : (_ : value) -> (_ : value mod global) = fun _ -> assert false + +let f : (_ : word mod external_ many shared) -> (_ : value) = fun _ -> assert false +let g : (_ : value) -> (_ : word mod external_ many shared) = fun _ -> assert false + +[%%expect {| +val f : ('a : immediate) 'b. 'a -> 'b = +val g : 'a ('b : immediate). 'a -> 'b = +val f : ('a : value mod global) 'b. 'a -> 'b = +val g : 'a ('b : value mod global). 'a -> 'b = +val f : ('a : word mod many external_) 'b. 'a -> 'b = +val g : 'a ('b : word mod many external_). 'a -> 'b = |}] (********************************************) @@ -125,37 +475,230 @@ type t = string t2 let f : ('a : any) -> 'a = fun x -> x ;; [%%expect {| -Line 1, characters 14-17: -1 | let f : ('a : any) -> 'a = fun x -> x - ^^^ -Error: Layout any is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : 'a -> 'a = |}] let f : ('a : any). 'a -> 'a = fun x -> x ;; [%%expect {| -Line 1, characters 14-17: +Line 1, characters 31-41: 1 | let f : ('a : any). 'a -> 'a = fun x -> x - ^^^ -Error: Layout any is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. + ^^^^^^^^^^ +Error: This definition has type 'b -> 'b which is less general than + ('a : any). 'a -> 'a + The layout of 'a is any + because of the annotation on the universal variable 'a. + But the layout of 'a must be representable + because we must know concretely how to pass a function argument. +|}] +(* CR layouts v2.9: This error message is not great. Check later if layout history + is able to improve it. *) + +let f : ('a : float64). 'a -> 'a = fun x -> x +;; +[%%expect {| +val f : ('a : float64). 'a -> 'a = |}] -(* CR layouts: fix when [any] becomes available in [layouts] *) (********************************************) (* Test 4: Annotation on record field types *) type r = { field : ('a : immediate). 'a -> 'a } +let f { field } = field 5 +;; +[%%expect {| +type r = { field : ('a : immediate). 'a -> 'a; } +val f : r -> int = +|}] + +type rf = { fieldf : ('a : float64). 'a -> 'a } +let f { fieldf } = fieldf (Stdlib_upstream_compatible.Float_u.of_float 3.14);; +[%%expect {| +type rf = { fieldf : ('a : float64). 'a -> 'a; } +val f : rf -> Stdlib_upstream_compatible.Float_u.t = +|}] + +type rg = { fieldg : ('a : value mod global). 'a -> 'a } +let f { fieldg } = fieldg 5;; +[%%expect {| +type rg = { fieldg : ('a : value mod global). 'a -> 'a; } +val f : rg -> int = +|}] + +type rc = { fieldc : ('a : word mod external_ many shared). 'a -> 'a } +let f { fieldc } = + let x : _ as (_ : word mod external_ many shared) = assert false in + fieldc x;; +[%%expect {| +type rc = { fieldc : ('a : word mod many external_). 'a -> 'a; } +val f : ('a : word mod many external_). rc -> 'a = +|}] + +let f { field } = field "hello" +;; +[%%expect {| +Line 1, characters 24-31: +1 | let f { field } = field "hello" + ^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of r at line 1, characters 0-47. +|}] + +let f { fieldg } = fieldg "hello" +;; +[%%expect {| +Line 1, characters 26-33: +1 | let f { fieldg } = fieldg "hello" + ^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : value mod global) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod global + because of the definition of rg at line 1, characters 0-56. +|}] + +let f { fieldc } = fieldc "hello" +;; +[%%expect {| +Line 1, characters 26-33: +1 | let f { fieldc } = fieldc "hello" + ^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : word mod many external_) + The layout of string is value + because it is the primitive value type string. + But the layout of string must be a sublayout of word + because of the definition of rc at line 1, characters 0-70. +|}] + +let r = { field = fun x -> x } +let r = { field = Fun.id } +;; +[%%expect {| +val r : r = {field = } +val r : r = {field = } +|}] + +let r = { field = fun (type (a : immediate)) (x : a) -> x } +let r = { field = fun (type (a : value mod global)) (x : a) -> x } +;; +[%%expect {| +val r : r = {field = } +val r : r = {field = } +|}] + +let r = { field = fun (type (a : value)) (x : a) -> x } +;; +[%%expect {| +val r : r = {field = } +|}] + +type r_value = { field : 'a. 'a -> 'a } +let r = { field = fun (type a : immediate) (x : a) -> x } [%%expect{| -Line 1, characters 25-34: -1 | type r = { field : ('a : immediate). 'a -> 'a } - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +type r_value = { field : 'a. 'a -> 'a; } +Line 2, characters 18-55: +2 | let r = { field = fun (type a : immediate) (x : a) -> x } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This field value has type 'b -> 'b which is less general than + 'a. 'a -> 'a + The kind of 'a is value + because of the definition of r_value at line 1, characters 0-39. + But the kind of 'a must be a subkind of immediate + because of the annotation on the abstract type declaration for a. +|}] +(* CR layouts v1.5: that's a pretty awful error message *) + +let r = { field = fun (type a : value mod global) (x : a) -> x } +[%%expect{| +Line 1, characters 18-62: +1 | let r = { field = fun (type a : value mod global) (x : a) -> x } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This field value has type 'b -> 'b which is less general than + 'a. 'a -> 'a + The kind of 'a is value + because of the definition of r_value at line 1, characters 0-39. + But the kind of 'a must be a subkind of value mod global + because of the annotation on the abstract type declaration for a. +|}] +(* CR layouts v1.5: that's a pretty awful error message *) + +type ('a : immediate) t_imm + +type s = { f : ('a : value). 'a -> 'a u } +and 'a u = 'a t_imm + +[%%expect{| +type ('a : immediate) t_imm +Line 3, characters 15-39: +3 | type s = { f : ('a : value). 'a -> 'a u } + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The kind of 'a is value + because of the annotation on the universal variable 'a. + But the kind of 'a must be a subkind of immediate + because of the definition of t_imm at line 1, characters 0-27. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}] +(* CR layouts v1.5: the location on that message is wrong. But it's hard + to improve, because it comes from re-checking typedtree, where we don't + have locations any more. I conjecture the same location problem exists + when constraints aren't satisfied. *) + +type ('a : value mod global) t_global + +type s = { f : ('a : value). 'a -> 'a u } +and 'a u = 'a t_global +[%%expect {| +type ('a : value mod global) t_global +Line 3, characters 15-39: +3 | type s = { f : ('a : value). 'a -> 'a u } + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The kind of 'a is value + because of the annotation on the universal variable 'a. + But the kind of 'a must be a subkind of value mod global + because of the definition of t_global at line 1, characters 0-37. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}] + +type ('a : word mod external_ many shared) t_complex + +type s = { f : ('a : word). 'a -> 'a u } +and 'a u = 'a t_complex +[%%expect {| +type ('a : word mod many external_) t_complex +Line 3, characters 15-38: +3 | type s = { f : ('a : word). 'a -> 'a u } + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The kind of 'a is word + because of the annotation on the universal variable 'a. + But the kind of 'a must be a subkind of word mod many external_ + because of the definition of t_complex at line 1, characters 0-52. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. |}] -(* CR layouts: fix when we allow annotations on field types in [layouts] *) (********************) (* Test 5: newtypes *) @@ -169,23 +712,41 @@ val f : 'a -> 'a = let f = fun (type (a : immediate)) (x : a) -> x ;; [%%expect {| -Line 1, characters 23-32: -1 | let f = fun (type (a : immediate)) (x : a) -> x - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : ('a : immediate). 'a -> 'a = +|}] + +let f = fun (type (a : float64)) (x : a) -> x +;; +[%%expect {| +val f : ('a : float64). 'a -> 'a = +|}] + +let f = fun (type (a : value mod global)) (x : a) -> x +;; +[%%expect {| +val f : ('a : value mod global). 'a -> 'a = +|}] + +let f = fun (type (a : word mod external_ many shared)) (x : a) -> x +;; +[%%expect {| +val f : ('a : word mod many external_). 'a -> 'a = |}] let f = fun (type (a : any)) (x : a) -> x ;; [%%expect {| -Line 1, characters 23-26: +Line 1, characters 29-36: 1 | let f = fun (type (a : any)) (x : a) -> x - ^^^ -Error: Layout any is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. + ^^^^^^^ +Error: This pattern matches values of type a + but a pattern was expected which matches values of type + ('a : '_representable_layout_1) + The layout of a is any + because of the annotation on the abstract type declaration for a. + But the layout of a must be representable + because we must know concretely how to pass a function argument. |}] -(* CR layouts: fix when we allow annotations on newtypes in [layouts] *) (****************************************) (* Test 6: abstract universal variables *) @@ -199,27 +760,67 @@ val f : 'a -> 'a = let f : type (a : immediate). a -> a = fun x -> x ;; [%%expect {| -Line 1, characters 18-27: -1 | let f : type (a : immediate). a -> a = fun x -> x - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : ('a : immediate). 'a -> 'a = +|}] + +let f : type (a : float64). a -> a = fun x -> x +;; +[%%expect {| +val f : ('a : float64). 'a -> 'a = +|}] + +let f : type (a : value mod global). a -> a = fun x -> x +;; +[%%expect {| +val f : ('a : value mod global). 'a -> 'a = +|}] + +let f : type (a : word mod external_ many shared). a -> a = fun x -> x +;; +[%%expect {| +val f : ('a : word mod many external_). 'a -> 'a = |}] let f : type (a : any). a -> a = fun x -> x ;; [%%expect {| -Line 1, characters 18-21: +Line 1, characters 33-43: 1 | let f : type (a : any). a -> a = fun x -> x - ^^^ -Error: Layout any is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. + ^^^^^^^^^^ +Error: Function arguments and returns must be representable. + The layout of a is any + because of the annotation on the abstract type declaration for a. + But the layout of a must be representable + because we must know concretely how to pass a function argument. |}] -(* CR layouts: fix when we allow annotations on newtypes in [layouts] *) (**************************************************) (* Test 7: Defaulting universal variable to value *) +module type S = sig + val f : 'a. 'a t2_imm -> 'a t2_imm +end +;; +[%%expect {| +Line 2, characters 10-36: +2 | val f : 'a. 'a t2_imm -> 'a t2_imm + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was defaulted to have kind value. + But it was inferred to have kind immediate + because of the definition of t2_imm at line 1, characters 0-28. +|}] + +let f : 'a. 'a t2_imm -> 'a t2_imm = fun x -> x + +[%%expect {| +Line 1, characters 8-34: +1 | let f : 'a. 'a t2_imm -> 'a t2_imm = fun x -> x + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was defaulted to have kind value. + But it was inferred to have kind immediate + because of the definition of t2_imm at line 1, characters 0-28. +|}] + (********************************************) (* Test 8: Annotation on universal variable *) @@ -232,18 +833,113 @@ module type S = sig val f : 'a t2 -> 'a t2 end |}] module type S = sig - val f : 'a t2 -> 'a t2 - val g : ('a : immediate). 'a t2 -> 'a t2 + val f : ('a : value). 'a t2_imm -> 'a t2_imm +end +;; +[%%expect {| +Line 2, characters 10-46: +2 | val f : ('a : value). 'a t2_imm -> 'a t2_imm + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was declared to have kind value. + But it was inferred to have kind immediate + because of the definition of t2_imm at line 1, characters 0-28. +|}] + +module type S = sig + val f : ('a : value). 'a t2_global -> 'a t2_global +end +;; +[%%expect {| +Line 2, characters 10-52: +2 | val f : ('a : value). 'a t2_global -> 'a t2_global + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was declared to have kind value. + But it was inferred to have kind value mod global + because of the definition of t2_global at line 8, characters 0-38. +|}] + +module type S = sig + val f : ('a : value). 'a t2_complex -> 'a t2_complex +end +;; +[%%expect {| +Line 2, characters 24-26: +2 | val f : ('a : value). 'a t2_complex -> 'a t2_complex + ^^ +Error: This type ('a : value) should be an instance of type + ('b : word mod many external_) + The layout of 'a is value + because of the annotation on the universal variable 'a. + But the layout of 'a must overlap with word + because of the definition of t2_complex at line 10, characters 0-53. +|}] + +module type S = sig + val f : ('a : word). 'a t2_complex -> 'a t2_complex +end +;; +[%%expect {| +Line 2, characters 10-53: +2 | val f : ('a : word). 'a t2_complex -> 'a t2_complex + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was declared to have kind word. + But it was inferred to have kind word mod many external_ + because of the definition of t2_complex at line 10, characters 0-53. +|}] + +module type S = sig + val f : 'a t2_imm -> 'a t2_imm + val g : ('a : immediate). 'a t2_imm -> 'a t2_imm +end +;; +[%%expect {| +module type S = + sig + val f : ('a : immediate). 'a t2_imm -> 'a t2_imm + val g : ('a : immediate). 'a t2_imm -> 'a t2_imm + end +|}] + +module type S = sig + val f : 'a t2_float64 -> 'a t2_float64 + val g : ('a : float64). 'a t2_float64 -> 'a t2_float64 end ;; [%%expect {| -Line 3, characters 16-25: -3 | val g : ('a : immediate). 'a t2 -> 'a t2 - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +module type S = + sig + val f : ('a : float64). 'a t2_float64 -> 'a t2_float64 + val g : ('a : float64). 'a t2_float64 -> 'a t2_float64 + end +|}] + +module type S = sig + val f : 'a t2_global -> 'a t2_global + val g : ('a : value mod global). 'a t2_global -> 'a t2_global +end +;; +[%%expect {| +module type S = + sig + val f : ('a : value mod global). 'a t2_global -> 'a t2_global + val g : ('a : value mod global). 'a t2_global -> 'a t2_global + end +|}] + +module type S = sig + val f : 'a t2_complex -> 'a t2_complex + val g : ('a : word mod external_ many shared). 'a t2_complex -> 'a t2_complex + val h : ('a : word mod external_ many). 'a t2_complex -> 'a t2_complex +end +;; +[%%expect {| +module type S = + sig + val f : ('a : word mod many external_). 'a t2_complex -> 'a t2_complex + val g : ('a : word mod many external_). 'a t2_complex -> 'a t2_complex + val h : ('a : word mod many external_). 'a t2_complex -> 'a t2_complex + end |}] -(* CR layouts: fix when we allow annotations on universals in [layouts] *) (************************************************************) (* Test 9: Annotation on universal in polymorphic parameter *) @@ -254,183 +950,703 @@ let f (x : ('a : value). 'a -> 'a) = x "string", x 5 val f : ('a. 'a -> 'a) -> string * int = |}] +let f (x : ('a : word mod external_ many shared). 'a -> 'a) = + let native_int : nativeint# = assert false in + x native_int + +[%%expect {| +val f : (('a : word mod many external_). 'a -> 'a) -> nativeint# = +|}] + let f (x : ('a : immediate). 'a -> 'a) = x "string" [%%expect {| -Line 1, characters 17-26: +Line 1, characters 43-51: 1 | let f (x : ('a : immediate). 'a -> 'a) = x "string" - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. + ^^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the annotation on the universal variable 'a. +|}] + +let f (x : ('a : value mod global). 'a -> 'a) = x "string" + +[%%expect {| +Line 1, characters 50-58: +1 | let f (x : ('a : value mod global). 'a -> 'a) = x "string" + ^^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : value mod global) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod global + because of the annotation on the universal variable 'a. |}] -(* CR layouts: fix when we allow annotations on universals in [layouts] *) (**************************************) -(* Test 10: Parsing & pretty-printing *) +(* Test 10: Annotation of record type *) -let f (type a : immediate) (x : a) = x +type t_value : value +[%%expect {| +type t_value : value +|}] -[%%expect{| -Line 1, characters 16-25: -1 | let f (type a : immediate) (x : a) = x - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +type t = { x : int } +let f (x : t) : _ as (_ : value) = x +[%%expect {| +type t = { x : int; } +val f : t -> t = |}] -let f = fun (type a : immediate) (x : a) -> x +type t : value = { x : t_value } +[%%expect {| +type t = { x : t_value; } +|}] + +type t : value mod global = { x : int} +[%%expect {| +Line 1, characters 0-38: +1 | type t : value mod global = { x : int} + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: This should be accepted, because t should be inferred to be + immediate *) + +type t : any mod portable = { x : float } +[%%expect {| +Line 1, characters 0-41: +1 | type t : any mod portable = { x : float } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod portable + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: This should be accepted, because t should be inferred to be + immediate *) + +type t = { x : int } [@@unboxed] +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = { x : int; } [@@unboxed] +val f : t -> t = +|}] + +type t : value = { x : int } [@@unboxed] +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t : value = { x : int; } [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : immediate = { x : int } [@@unboxed] +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t : immediate = { x : int; } [@@unboxed] +val f : t -> t = +|}] + +type t : value mod global = { x : t_value } +[%%expect {| +Line 1, characters 0-43: +1 | type t : value mod global = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] + +type t : value mod unique = { x : t_value } +[%%expect {| +Line 1, characters 0-43: +1 | type t : value mod unique = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod unique + because of the annotation on the declaration of the type t. +|}] + +type t : value mod many = { x : t_value } +[%%expect {| +Line 1, characters 0-41: +1 | type t : value mod many = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod many + because of the annotation on the declaration of the type t. +|}] + +type t : value mod portable = { x : t_value } +[%%expect {| +Line 1, characters 0-45: +1 | type t : value mod portable = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod portable + because of the annotation on the declaration of the type t. +|}] + +type t : value mod uncontended = { x : t_value } +[%%expect {| +Line 1, characters 0-48: +1 | type t : value mod uncontended = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod uncontended + because of the annotation on the declaration of the type t. +|}] + +type t : value mod external_ = { x : t_value } +[%%expect {| +Line 1, characters 0-46: +1 | type t : value mod external_ = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod external_ + because of the annotation on the declaration of the type t. +|}] + +(***************************************) +(* Test 11: Annotation of variant type *) + +type t = Foo of int +let f (x : t) : _ as (_ : value) = x +[%%expect {| +type t = Foo of int +val f : t -> t = +|}] + +type t : value = Foo of t_value +[%%expect {| +type t = Foo of t_value +|}] + +type t : value mod global = Foo of int +[%%expect {| +Line 1, characters 0-38: +1 | type t : value mod global = Foo of int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] + +type t : any mod portable = Foo of float +[%%expect {| +Line 1, characters 0-40: +1 | type t : any mod portable = Foo of float + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of any mod portable + because of the annotation on the declaration of the type t. +|}] + +type t = Foo | Bar +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = Foo | Bar +val f : t -> t = +|}] + +type t : value = Foo | Bar +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = Foo | Bar +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : immediate = Foo | Bar +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = Foo | Bar +val f : t -> t = +|}] + +type t = Foo of int [@@unboxed] +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = Foo of int [@@unboxed] +val f : t -> t = +|}] + +type t : value = Foo of int [@@unboxed] +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t : value = Foo of int [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : immediate = Foo of int [@@unboxed] +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t : immediate = Foo of int [@@unboxed] +val f : t -> t = +|}] + +type t : value mod global = Foo of t_value +[%%expect {| +Line 1, characters 0-42: +1 | type t : value mod global = Foo of t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] + +type t : value mod unique = Foo of t_value +[%%expect {| +Line 1, characters 0-42: +1 | type t : value mod unique = Foo of t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of value mod unique + because of the annotation on the declaration of the type t. +|}] + +type t : value mod many = Foo of t_value +[%%expect {| +Line 1, characters 0-40: +1 | type t : value mod many = Foo of t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of value mod many + because of the annotation on the declaration of the type t. +|}] + +type t : value mod portable = Foo of t_value +[%%expect {| +Line 1, characters 0-44: +1 | type t : value mod portable = Foo of t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of value mod portable + because of the annotation on the declaration of the type t. +|}] + +type t : value mod uncontended = Foo of t_value +[%%expect {| +Line 1, characters 0-47: +1 | type t : value mod uncontended = Foo of t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of value mod uncontended + because of the annotation on the declaration of the type t. +|}] + +type t : value mod external_ = Foo of t_value +[%%expect {| +Line 1, characters 0-45: +1 | type t : value mod external_ = Foo of t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of value mod external_ + because of the annotation on the declaration of the type t. +|}] + +(***************************************) +(* Test 12: Annotation on private type *) + +type t = private int +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] + +type t : value = private int +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : immediate = private int +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] + +type t : bits64 mod portable unique +type u = private t +let f (x : t) : _ as (_ : bits64 mod portable unique) = x +[%%expect {| +type t : bits64 mod portable unique +type u = private t +val f : t -> t = +|}] + +type t : bits64 mod portable unique +type u : bits64 = private t +let f (x : t) : _ as (_ : bits64 mod portable unique) = x +[%%expect {| +type t : bits64 mod portable unique +type u = private t +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since u is nominative *) + +type t : bits64 mod portable unique +type u : bits64 mod portable unique = private t +let f (x : t) : _ as (_ : bits64 mod portable unique) = x +[%%expect {| +type t : bits64 mod portable unique +type u = private t +val f : t -> t = +|}] + +type t : float64 mod global portable +type u : bits64 mod global portable = private t +[%%expect {| +type t : float64 mod global portable +Line 2, characters 0-47: +2 | type u : bits64 mod global portable = private t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type t is float64 + because of the definition of t at line 1, characters 0-36. + But the layout of type t must be a sublayout of bits64 + because of the definition of u at line 2, characters 0-47. +|}] + +type t : word +type u : word mod global = private t +[%%expect {| +type t : word +Line 2, characters 0-36: +2 | type u : word mod global = private t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is word + because of the definition of t at line 1, characters 0-13. + But the kind of type t must be a subkind of word mod global + because of the definition of u at line 2, characters 0-36. +|}] +(* CR layouts v2.8: Bad error message. The error message should be about a kind or mode + mismatch, not a layout mismatch. *) + +type t : word +type u : word mod unique = private t +[%%expect {| +type t : word +Line 2, characters 0-36: +2 | type u : word mod unique = private t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is word + because of the definition of t at line 1, characters 0-13. + But the kind of type t must be a subkind of word mod unique + because of the definition of u at line 2, characters 0-36. +|}] +(* CR layouts v2.8: Bad error message. The error message should be about a kind or mode + mismatch, not a layout mismatch. *) + +type t : word +type u : word mod many = private t +[%%expect {| +type t : word +Line 2, characters 0-34: +2 | type u : word mod many = private t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is word + because of the definition of t at line 1, characters 0-13. + But the kind of type t must be a subkind of word mod many + because of the definition of u at line 2, characters 0-34. +|}] +(* CR layouts v2.8: Bad error message. The error message should be about a kind or mode + mismatch, not a layout mismatch. *) + +type t : word +type u : word mod portable = private t +[%%expect {| +type t : word +Line 2, characters 0-38: +2 | type u : word mod portable = private t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is word + because of the definition of t at line 1, characters 0-13. + But the kind of type t must be a subkind of word mod portable + because of the definition of u at line 2, characters 0-38. +|}] +(* CR layouts v2.8: Bad error message. The error message should be about a kind or mode + mismatch, not a layout mismatch. *) + +type t : word +type u : word mod uncontended = private t +[%%expect {| +type t : word +Line 2, characters 0-41: +2 | type u : word mod uncontended = private t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is word + because of the definition of t at line 1, characters 0-13. + But the kind of type t must be a subkind of word mod uncontended + because of the definition of u at line 2, characters 0-41. +|}] +(* CR layouts v2.8: Bad error message. The error message should be about a kind or mode + mismatch, not a layout mismatch. *) + +type t : word +type u : word mod external_ = private t +[%%expect {| +type t : word +Line 2, characters 0-39: +2 | type u : word mod external_ = private t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is word + because of the definition of t at line 1, characters 0-13. + But the kind of type t must be a subkind of word mod external_ + because of the definition of u at line 2, characters 0-39. +|}] +(* CR layouts v2.8: Bad error message. The error message should be about a kind or mode + mismatch, not a layout mismatch. *) + +(**************************************) +(* Test 13: Parsing & pretty-printing *) + +let f (type a : value) (x : a) = x +let f (type a : immediate) (x : a) = x +let f (type a : value mod global) (x : a) = x +let f (type a : immediate mod global) (x : a) = x +let f (type a : word mod external_ many shared) (x : a) = x [%%expect{| -Line 1, characters 22-31: -1 | let f = fun (type a : immediate) (x : a) -> x - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : value mod global). 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : word mod many external_). 'a -> 'a = |}] let f = fun (type a : value) (x : a) -> x +let f = fun (type a : immediate) (x : a) -> x +let f = fun (type a : value mod global) (x : a) -> x +let f = fun (type a : immediate mod global) (x : a) -> x +let f = fun (type a : word mod external_ many shared) (x : a) -> x [%%expect{| val f : 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : value mod global). 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : word mod many external_). 'a -> 'a = |}] +let o = object + method m : type (a : value). a -> a = fun x -> x +end let o = object method m : type (a : immediate). a -> a = fun x -> x end +let o = object + method m : type (a : value mod global). a -> a = fun x -> x +end +let o = object + method m : type (a : immediate mod global). a -> a = fun x -> x +end +let o = object + method m : type (a : word mod external_ many shared). a -> a = fun x -> x +end [%%expect{| -Line 2, characters 23-32: -2 | method m : type (a : immediate). a -> a = fun x -> x - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val o : < m : 'a. 'a -> 'a > = +val o : < m : ('a : immediate). 'a -> 'a > = +val o : < m : ('a : value mod global). 'a -> 'a > = +val o : < m : ('a : immediate). 'a -> 'a > = +val o : < m : ('a : word mod many external_). 'a -> 'a > = |}] +let f : type (a : value). a -> a = fun x -> x let f : type (a : immediate). a -> a = fun x -> x +let f : type (a : value mod global). a -> a = fun x -> x +let f : type (a : immediate mod global). a -> a = fun x -> x +let f : type (a : word mod external_ many shared). a -> a = fun x -> x [%%expect{| -Line 1, characters 18-27: -1 | let f : type (a : immediate). a -> a = fun x -> x - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : value mod global). 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : word mod many external_). 'a -> 'a = |}] +let f x = + let local_ g (type a : value) (x : a) = x in + g x [@nontail] + let f x = let local_ g (type a : immediate) (x : a) = x in g x [@nontail] +let f x = + let local_ g (type a : value mod global) (x : a) = x in + g x [@nontail] + +let f x = + let local_ g (type a : immediate mod global) (x : a) = x in + g x [@nontail] + +let f x = + let local_ g (type a : word mod external_ many shared) (x : a) = x in + g x [@nontail] + [%%expect{| -Line 2, characters 25-34: -2 | let local_ g (type a : immediate) (x : a) = x in - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : value mod global). 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +val f : ('a : word mod many external_). 'a -> 'a = |}] +let f = fun x y (type (a : value)) (z : a) -> z let f = fun x y (type (a : immediate)) (z : a) -> z +let f = fun x y (type (a : value mod global)) (z : a) -> z +let f = fun x y (type (a : immediate mod global)) (z : a) -> z +let f = fun x y (type (a : word mod external_ many shared)) (z : a) -> z [%%expect{| -Line 1, characters 27-36: -1 | let f = fun x y (type (a : immediate)) (z : a) -> z - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : immediate). 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : value mod global). 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : immediate). 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : word mod many external_). 'b -> 'c -> 'a -> 'a = |}] +let f = fun x y (type a : value) (z : a) -> z let f = fun x y (type a : immediate) (z : a) -> z +let f = fun x y (type a : value mod global) (z : a) -> z +let f = fun x y (type a : immediate mod global) (z : a) -> z +let f = fun x y (type a : word mod external_ many shared) (z : a) -> z [%%expect{| -Line 1, characters 26-35: -1 | let f = fun x y (type a : immediate) (z : a) -> z - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f : 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : immediate). 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : value mod global). 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : immediate). 'b -> 'c -> 'a -> 'a = +val f : 'b 'c ('a : word mod many external_). 'b -> 'c -> 'a -> 'a = |}] +(* CR layouts: canonicalizing the order of quantification here + would reduce wibbles in error messages *) +external f : ('a : value). 'a -> 'a = "%identity" external f : ('a : immediate). 'a -> 'a = "%identity" +external f : ('a : value mod global). 'a -> 'a = "%identity" +external f : ('a : immediate mod global). 'a -> 'a = "%identity" +external f : ('a : word mod external_ many shared). 'a -> 'a = "%identity" [%%expect{| -Line 1, characters 19-28: -1 | external f : ('a : immediate). 'a -> 'a = "%identity" - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +external f : 'a -> 'a = "%identity" +external f : ('a : immediate). 'a -> 'a = "%identity" +external f : ('a : value mod global). 'a -> 'a = "%identity" +external f : ('a : immediate). 'a -> 'a = "%identity" +external f : ('a : word mod many external_). 'a -> 'a = "%identity" |}] -type (_ : any) t2_any - -[%%expect{| -Line 1, characters 10-13: -1 | type (_ : any) t2_any - ^^^ -Error: Layout any is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. -|}] +type (_ : any) t2_any +exception E : ('a : value) ('b : any). 'b t2_any * 'a list -> exn exception E : ('a : immediate) ('b : any). 'b t2_any * 'a list -> exn +exception E : ('a : value mod global) ('b : any). 'b t2_any * 'a list -> exn +exception E : ('a : immediate mod global) ('b : any). 'b t2_any * 'a list -> exn [%%expect{| -Line 1, characters 20-29: -1 | exception E : ('a : immediate) ('b : any). 'b t2_any * 'a list -> exn - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +type (_ : any) t2_any +exception E : ('b : any) 'a. 'b t2_any * 'a list -> exn +exception E : ('b : any) ('a : immediate). 'b t2_any * 'a list -> exn +exception E : ('b : any) ('a : value mod global). 'b t2_any * 'a list -> exn +exception E : ('b : any) ('a : immediate). 'b t2_any * 'a list -> exn |}] +let f (x : ('a : value). 'a -> 'a) = x 3, x true let f (x : ('a : immediate). 'a -> 'a) = x 3, x true +let f (x : ('a : value mod global). 'a -> 'a) = x 3, x true +let f (x : ('a : immediate mod global). 'a -> 'a) = x 3, x true -[%%expect {| -Line 1, characters 17-26: -1 | let f (x : ('a : immediate). 'a -> 'a) = x 3, x true - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +[%%expect{| +val f : ('a. 'a -> 'a) -> int * bool = +val f : (('a : immediate). 'a -> 'a) -> int * bool = +val f : (('a : value mod global). 'a -> 'a) -> int * bool = +val f : (('a : immediate). 'a -> 'a) -> int * bool = |}] +type _ a = Mk : [> ] * ('a : value) -> int a type _ a = Mk : [> ] * ('a : immediate) -> int a +type _ a = Mk : [> ] * ('a : value mod global) -> int a +type _ a = Mk : [> ] * ('a : immediate mod global) -> int a [%%expect {| -Line 1, characters 29-38: -1 | type _ a = Mk : [> ] * ('a : immediate) -> int a - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +type _ a = Mk : [> ] * 'a -> int a +type _ a = Mk : ('a : immediate). [> ] * 'a -> int a +type _ a = Mk : ('a : value mod global). [> ] * 'a -> int a +type _ a = Mk : ('a : immediate). [> ] * 'a -> int a |}] let f_imm : ('a : immediate). 'a -> 'a = fun x -> x [%%expect {| -Line 1, characters 18-27: -1 | let f_imm : ('a : immediate). 'a -> 'a = fun x -> x - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +val f_imm : ('a : immediate). 'a -> 'a = |}] -let f_val : ('a : value). 'a -> 'a = fun x -> x +let f_val : ('a : value). 'a -> 'a = fun x -> f_imm x [%%expect {| -val f_val : 'a -> 'a = +Line 1, characters 37-53: +1 | let f_val : ('a : value). 'a -> 'a = fun x -> f_imm x + ^^^^^^^^^^^^^^^^ +Error: This definition has type 'b -> 'b which is less general than + 'a. 'a -> 'a + The kind of 'a is value + because of the annotation on the universal variable 'a. + But the kind of 'a must be a subkind of immediate + because of the definition of f_imm at line 1, characters 4-9. |}] type (_ : value) g = - | MkG : ('a : immediate). 'a g + | A : ('a : value). 'a g + | B : ('a : immediate). 'a g + | C : ('a : value mod global). 'a g + | D : ('a : immediate mod global). 'a g [%%expect {| -Line 2, characters 16-25: -2 | | MkG : ('a : immediate). 'a g - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +type _ g = + A : 'a g + | B : ('a : immediate). 'a g + | C : ('a : value mod global). 'a g + | D : ('a : immediate). 'a g |}] +type t = int as (_ : value) type t = int as (_ : immediate) +type t = int as (_ : value mod global) +type t = int as (_ : immediate mod global) +type t = nativeint# as (_ : word mod external_ many shared) [%%expect {| -Line 1, characters 21-30: -1 | type t = int as (_ : immediate) - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +type t = int +type t = int +type t = int +type t = int +type t = nativeint# |}] diff --git a/testsuite/tests/typing-layouts/annots_beta.ml b/testsuite/tests/typing-layouts/annots_beta.ml deleted file mode 100644 index 69733075c36..00000000000 --- a/testsuite/tests/typing-layouts/annots_beta.ml +++ /dev/null @@ -1,561 +0,0 @@ -(* TEST - flags = "-extension layouts_beta" - * expect -*) - -type t_value : value -type t_imm : immediate -type t_imm64 : immediate64 -type t_float64 : float64 -type t_any : any;; - -[%%expect{| -type t_value : value -type t_imm : immediate -type t_imm64 : immediate64 -type t_float64 : float64 -type t_any : any -|}] - -type t_void : void;; - -[%%expect{| -Line 1, characters 14-18: -1 | type t_void : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}] - -(***************************************) -(* Test 1: annotation on type variable *) - -let x : int as ('a: value) = 5 -let x : int as ('a : immediate) = 5 -let x : int as ('a : any) = 5;; - -[%%expect{| -val x : int = 5 -val x : int = 5 -val x : int = 5 -|}] - -let x : int as ('a : float64) = 5;; -[%%expect {| -Line 1, characters 8-29: -1 | let x : int as ('a : float64) = 5;; - ^^^^^^^^^^^^^^^^^^^^^ -Error: This alias is bound to type int but is used as an instance of type - ('a : float64) - int has layout immediate, which is not a sublayout of float64. -|}] - -let x : (int as ('a : immediate)) list as ('b : value) = [3;4;5] -;; -[%%expect {| -val x : int list = [3; 4; 5] -|}] - -let x : int list as ('a : immediate) = [3;4;5] -;; -[%%expect {| -Line 1, characters 8-36: -1 | let x : int list as ('a : immediate) = [3;4;5] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This alias is bound to type int list - but is used as an instance of type ('a : immediate) - int list has layout value, which is not a sublayout of immediate. -|}] -(* CR layouts: error message could be phrased better *) - -(****************************************) -(* Test 2: Annotation on type parameter *) - -type ('a : immediate) t2_imm -type (_ : immediate) t2_imm' -type t1 = int t2_imm -type t2 = bool t2_imm -type ('a : float64) t2_float64 -type (_ : float64) t2_float64' -type t3 = float# t2_float64 - - -[%%expect {| -type ('a : immediate) t2_imm -type (_ : immediate) t2_imm' -type t1 = int t2_imm -type t2 = bool t2_imm -type ('a : float64) t2_float64 -type (_ : float64) t2_float64' -type t3 = float# t2_float64 -|}] - -module M1 : sig - type ('a : immediate) t -end = struct - type (_ : immediate) t -end - -module M2 : sig - type (_ : immediate) t -end = struct - type ('a : immediate) t -end - -[%%expect {| -module M1 : sig type ('a : immediate) t end -module M2 : sig type (_ : immediate) t end -|}] - -type t = string t2_imm -;; -[%%expect {| -Line 1, characters 9-15: -1 | type t = string t2_imm - ^^^^^^ -Error: This type string should be an instance of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}] - -let f : 'a t2_imm -> 'a t2_imm = fun x -> x -;; -[%%expect {| -val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = -|}] - -let f : ('a : immediate) t2_imm -> ('a : value) t2_imm = fun x -> x -;; -[%%expect {| -val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = -|}] - -let f : ('a : value) t2_imm -> ('a : value) t2_imm = fun x -> x -;; -[%%expect {| -val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = -|}] - -let f : ('a : immediate). 'a t2_imm -> 'a t2_imm = fun x -> x -;; -[%%expect {| -val f : ('a : immediate). 'a t2_imm -> 'a t2_imm = -|}] - -let f : ('a : value). 'a t2_imm -> 'a t2_imm = fun x -> x -;; -[%%expect {| -Line 1, characters 8-44: -1 | let f : ('a : value). 'a t2_imm -> 'a t2_imm = fun x -> x - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The universal type variable 'a was declared to have - layout value, but was inferred to have layout immediate. -|}] - -type 'a t = 'a t2_imm -;; -[%%expect {| -type ('a : immediate) t = 'a t2_imm -|}] - -type ('a : value) t = 'a t2_imm -;; -[%%expect {| -type ('a : immediate) t = 'a t2_imm -|}] - -type ('a : immediate) t = 'a t2_imm -;; -[%%expect {| -type ('a : immediate) t = 'a t2_imm -|}] - -let f : (_ : value) t2_imm -> unit = fun _ -> () -let g : (_ : immediate) t2_imm -> unit = fun _ -> () - -[%%expect {| -val f : ('a : immediate). 'a t2_imm -> unit = -val g : ('a : immediate). 'a t2_imm -> unit = -|}] - -let f : (_ : immediate) -> unit = fun _ -> () -let g : (_ : value) -> unit = fun _ -> () - -[%%expect {| -val f : ('a : immediate). 'a -> unit = -val g : 'a -> unit = -|}] - -let f : (_ : immediate) -> (_ : value) = fun _ -> assert false -let g : (_ : value) -> (_ : immediate) = fun _ -> assert false - -[%%expect {| -val f : 'b ('a : immediate). 'a -> 'b = -val g : ('b : immediate) 'a. 'a -> 'b = -|}] - -(********************************************) -(* Test 3: Annotation on types in functions *) - -let f : ('a : any) -> 'a = fun x -> x -;; -[%%expect {| -val f : 'a -> 'a = -|}] - -let f : ('a : any). 'a -> 'a = fun x -> x -;; -[%%expect {| -Line 1, characters 8-28: -1 | let f : ('a : any). 'a -> 'a = fun x -> x - ^^^^^^^^^^^^^^^^^^^^ -Error: The universal type variable 'a was declared to have - layout any, but was inferred to have a representable layout. -|}] -(* CR layouts v2.5: This error message should change to complain - about the [fun x], not the arrow type. *) - -let f : ('a : float64). 'a -> 'a = fun x -> x -;; -[%%expect {| -val f : ('a : float64). 'a -> 'a = -|}] - -(********************************************) -(* Test 4: Annotation on record field types *) - -type r = { field : ('a : immediate). 'a -> 'a } -let f { field } = field 5 -;; -[%%expect {| -type r = { field : ('a : immediate). 'a -> 'a; } -val f : r -> int = -|}] - -type rf = { fieldf : ('a : float64). 'a -> 'a } -let f { fieldf } = fieldf (Stdlib__Float_u.of_float 3.14);; -[%%expect {| -type rf = { fieldf : ('a : float64). 'a -> 'a; } -val f : rf -> float# = -|}] - -let f { field } = field "hello" -;; -[%%expect {| -Line 1, characters 24-31: -1 | let f { field } = field "hello" - ^^^^^^^ -Error: This expression has type string but an expression was expected of type - ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}] - -let r = { field = fun x -> x } -let r = { field = Fun.id } -;; -[%%expect {| -val r : r = {field = } -val r : r = {field = } -|}] - -let r = { field = fun (type (a : immediate)) (x : a) -> x } -;; -[%%expect {| -val r : r = {field = } -|}] - -let r = { field = fun (type (a : value)) (x : a) -> x } -;; -[%%expect {| -val r : r = {field = } -|}] - -type r_value = { field : 'a. 'a -> 'a } -let r = { field = fun (type a : immediate) (x : a) -> x } - -[%%expect{| -type r_value = { field : 'a. 'a -> 'a; } -Line 2, characters 18-55: -2 | let r = { field = fun (type a : immediate) (x : a) -> x } - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This field value has type 'b -> 'b which is less general than - 'a. 'a -> 'a - 'a has layout value, which is not a sublayout of immediate. -|}] -(* CR layouts v1.5: that's a pretty awful error message *) - -type ('a : immediate) t_imm - -type s = { f : ('a : value). 'a -> 'a u } -and 'a u = 'a t_imm - -[%%expect{| -type ('a : immediate) t_imm -Line 3, characters 15-39: -3 | type s = { f : ('a : value). 'a -> 'a u } - ^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type 'a has layout value, which is not a sublayout of immediate. -|}] -(* CR layouts v1.5: the location on that message is wrong. But it's hard - to improve, because it comes from re-checking typedtree, where we don't - have locations any more. I conjecture the same location problem exists - when constraints aren't satisfied. *) - -(********************) -(* Test 5: newtypes *) - -let f = fun (type (a : value)) (x : a) -> x -;; -[%%expect {| -val f : 'a -> 'a = -|}] - -let f = fun (type (a : immediate)) (x : a) -> x -;; -[%%expect {| -val f : ('a : immediate). 'a -> 'a = -|}] - -let f = fun (type (a : float64)) (x : a) -> x -;; -[%%expect {| -val f : ('a : float64). 'a -> 'a = -|}] - -let f = fun (type (a : any)) (x : a) -> x -;; -[%%expect {| -Line 1, characters 29-36: -1 | let f = fun (type (a : any)) (x : a) -> x - ^^^^^^^ -Error: This pattern matches values of type a - but a pattern was expected which matches values of type - ('a : '_representable_layout_1) - a has layout any, which is not representable. -|}] - -(****************************************) -(* Test 6: abstract universal variables *) - -let f : type (a : value). a -> a = fun x -> x -;; -[%%expect {| -val f : 'a -> 'a = -|}] - -let f : type (a : immediate). a -> a = fun x -> x -;; -[%%expect {| -val f : ('a : immediate). 'a -> 'a = -|}] - -let f : type (a : float64). a -> a = fun x -> x -;; -[%%expect {| -val f : ('a : float64). 'a -> 'a = -|}] - -let f : type (a : any). a -> a = fun x -> x -;; -[%%expect {| -Line 1, characters 24-30: -1 | let f : type (a : any). a -> a = fun x -> x - ^^^^^^ -Error: The universal type variable 'a was declared to have - layout any, but was inferred to have a representable layout. -|}] -(* CR layouts v2.5: This error message will change to complain - about the fun x, not the arrow type. *) - -(**************************************************) -(* Test 7: Defaulting universal variable to value *) - -module type S = sig - val f : 'a. 'a t2_imm -> 'a t2_imm -end -;; -[%%expect {| -Line 2, characters 10-36: -2 | val f : 'a. 'a t2_imm -> 'a t2_imm - ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The universal type variable 'a was defaulted to have - layout value, but was inferred to have layout immediate. -|}] - -let f : 'a. 'a t2_imm -> 'a t2_imm = fun x -> x - -[%%expect {| -Line 1, characters 8-34: -1 | let f : 'a. 'a t2_imm -> 'a t2_imm = fun x -> x - ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The universal type variable 'a was defaulted to have - layout value, but was inferred to have layout immediate. -|}] - -(********************************************) -(* Test 8: Annotation on universal variable *) - -module type S = sig - val f : ('a : value). 'a t2_imm -> 'a t2_imm -end -;; -[%%expect {| -Line 2, characters 10-46: -2 | val f : ('a : value). 'a t2_imm -> 'a t2_imm - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The universal type variable 'a was declared to have - layout value, but was inferred to have layout immediate. -|}] - -module type S = sig - val f : 'a t2_imm -> 'a t2_imm - val g : ('a : immediate). 'a t2_imm -> 'a t2_imm -end -;; -[%%expect {| -module type S = - sig - val f : ('a : immediate). 'a t2_imm -> 'a t2_imm - val g : ('a : immediate). 'a t2_imm -> 'a t2_imm - end -|}] - -module type S = sig - val f : 'a t2_float64 -> 'a t2_float64 - val g : ('a : float64). 'a t2_float64 -> 'a t2_float64 -end -;; -[%%expect {| -module type S = - sig - val f : ('a : float64). 'a t2_float64 -> 'a t2_float64 - val g : ('a : float64). 'a t2_float64 -> 'a t2_float64 - end -|}] - -(************************************************************) -(* Test 9: Annotation on universal in polymorphic parameter *) - -let f (x : ('a : immediate). 'a -> 'a) = x "string" - -[%%expect {| -Line 1, characters 43-51: -1 | let f (x : ('a : immediate). 'a -> 'a) = x "string" - ^^^^^^^^ -Error: This expression has type string but an expression was expected of type - ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}] - -(**************************************) -(* Test 10: Parsing & pretty-printing *) - -let f (type a : immediate) (x : a) = x - -[%%expect{| -val f : ('a : immediate). 'a -> 'a = -|}] - -let f = fun (type a : immediate) (x : a) -> x - -[%%expect{| -val f : ('a : immediate). 'a -> 'a = -|}] - -let f = fun (type a : value) (x : a) -> x - -[%%expect{| -val f : 'a -> 'a = -|}] - -let o = object - method m : type (a : immediate). a -> a = fun x -> x -end - -[%%expect{| -val o : < m : ('a : immediate). 'a -> 'a > = -|}] - -let f : type (a : immediate). a -> a = fun x -> x - -[%%expect{| -val f : ('a : immediate). 'a -> 'a = -|}] - -let f x = - let local_ g (type a : immediate) (x : a) = x in - g x [@nontail] - -[%%expect{| -val f : ('a : immediate). 'a -> 'a = -|}] - -let f = fun x y (type (a : immediate)) (z : a) -> z - -[%%expect{| -val f : ('a : immediate) 'c 'b. 'b -> 'c -> 'a -> 'a = -|}] - -let f = fun x y (type a : immediate) (z : a) -> z - -[%%expect{| -val f : ('a : immediate) 'c 'b. 'b -> 'c -> 'a -> 'a = -|}] -(* CR layouts: canonicalizing the order of quantification here - would reduce wibbles in error messages *) - -external f : ('a : immediate). 'a -> 'a = "%identity" - -[%%expect{| -external f : ('a : immediate). 'a -> 'a = "%identity" -|}] - - -type (_ : any) t2_any -exception E : ('a : immediate) ('b : any). 'b t2_any * 'a list -> exn - -[%%expect{| -type (_ : any) t2_any -exception E : ('a : immediate) ('b : any). 'b t2_any * 'a list -> exn -|}] - - -let f (x : ('a : immediate). 'a -> 'a) = x 3, x true - -[%%expect{| -val f : (('a : immediate). 'a -> 'a) -> int * bool = -|}] - -type _ a = Mk : [> ] * ('a : immediate) -> int a - -[%%expect {| -type _ a = Mk : ('a : immediate). [> ] * 'a -> int a -|}] - -let f_imm : ('a : immediate). 'a -> 'a = fun x -> x - -[%%expect {| -val f_imm : ('a : immediate). 'a -> 'a = -|}] - -let f_val : ('a : value). 'a -> 'a = fun x -> f_imm x - -[%%expect {| -Line 1, characters 37-53: -1 | let f_val : ('a : value). 'a -> 'a = fun x -> f_imm x - ^^^^^^^^^^^^^^^^ -Error: This definition has type 'b -> 'b which is less general than - 'a. 'a -> 'a - 'a has layout value, which is not a sublayout of immediate. -|}] - -type (_ : value) g = - | MkG : ('a : immediate). 'a g - -[%%expect {| -type _ g = MkG : ('a : immediate). 'a g -|}] - -type t = int as (_ : immediate) - -[%%expect {| -type t = int -|}] diff --git a/testsuite/tests/typing-layouts/any_in_types.ml b/testsuite/tests/typing-layouts/any_in_types.ml new file mode 100644 index 00000000000..349b4fcd983 --- /dev/null +++ b/testsuite/tests/typing-layouts/any_in_types.ml @@ -0,0 +1,113 @@ +(* TEST + include stdlib_upstream_compatible; + { + native; + }{ + bytecode; + } +*) + +(* See also Test 10 in modules.ml, which tests for type-checking failures in + code that is similar to this. *) + +let unbox = Stdlib_upstream_compatible.Float_u.of_float + +module type S = sig + type t : any + + val add : t -> t -> t + val one : unit -> t + val print : (unit -> t) -> unit +end + +(* type substitution *) +module M1 : S with type t = float# = struct + type t = float# + + let add x y = Stdlib_upstream_compatible.Float_u.add x y + let one () = unbox 1. + let print f = Printf.printf "Printing a float#: %f\n" (Stdlib_upstream_compatible.Float_u.to_float (f ())) +end + +module M2 : S with type t = int = struct + type t = int + + let add x y = x + y + let one () = 1 + let print f = Printf.printf "Printing a int: %d\n" (f ()) +end + +let () = Printf.printf "%f\n" (Stdlib_upstream_compatible.Float_u.to_float (M1.add (unbox 10.) (unbox 10.))) +let () = Printf.printf "%d\n" (M2.add 10 10) + +(* destructive substitution *) +module M3 : S with type t := float# = struct + let add x y = Stdlib_upstream_compatible.Float_u.add x y + let one () = unbox 1. + let print f = Printf.printf "Printing a float#: %f\n" (Stdlib_upstream_compatible.Float_u.to_float (f ())) +end + +module M4 : S with type t := int = struct + let add x y = x + y + let one () = 1 + let print f = Printf.printf "Printing a int: %d\n" (f ()) +end + +let () = Printf.printf "%f\n" (Stdlib_upstream_compatible.Float_u.to_float (M3.add (unbox 10.) (unbox 10.))) +let () = Printf.printf "%d\n" (M4.add 10 10) + +(* functor *) +module type Q = sig + include S + + val print_one : unit -> unit +end + +module Make (M : S) : Q = struct + include M + + let print_one () = M.print M.one +end + +module M1' = Make (M1) +module M2' = Make (M2) + +let () = M1'.print_one () +let () = M2'.print_one () + +(* edge cases and order of evaluation *) +let g : type (a : any). unit -> a -> a = fun () -> assert false + +let () = + try + let r = + g + () + (Printf.printf "a\n"; + unbox 10.) + in + Printf.printf "%f\n" (Stdlib_upstream_compatible.Float_u.to_float r) + with + | _ -> Printf.printf "b\n" +;; + +let () = + try + let r = + g + () + (Printf.printf "c\n"; + 10) + in + Printf.printf "%d\n" r + with + | _ -> Printf.printf "d\n" +;; + +(* This should type check *) +let rec f : type (a : any). unit -> a -> a = fun () -> f () + +let f' () = + let _ = f () 10 in + f () (unbox 10.) +;; diff --git a/testsuite/tests/typing-layouts/any_in_types.reference b/testsuite/tests/typing-layouts/any_in_types.reference new file mode 100644 index 00000000000..74165c70a52 --- /dev/null +++ b/testsuite/tests/typing-layouts/any_in_types.reference @@ -0,0 +1,10 @@ +20.000000 +20 +20.000000 +20 +Printing a float#: 1.000000 +Printing a int: 1 +a +b +c +d diff --git a/testsuite/tests/typing-layouts/basics.ml b/testsuite/tests/typing-layouts/basics.ml index afdafc1e9bc..1794469a199 100644 --- a/testsuite/tests/typing-layouts/basics.ml +++ b/testsuite/tests/typing-layouts/basics.ml @@ -1,341 +1,2805 @@ (* TEST - * expect - flags = "-extension layouts" + include stdlib_upstream_compatible; + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } *) + type t_value : value type t_imm : immediate -type t_imm64 : immediate64;; +type t_imm64 : immediate64 +type t_float64 : float64;; +type t_any : any;; [%%expect{| type t_value : value type t_imm : immediate type t_imm64 : immediate64 +type t_float64 : float64 +type t_any : any |}] -type t_any : any;; -[%%expect{| -Line 1, characters 15-18: -1 | type t_any : any;; - ^^^ -Error: Layout any is used here, but the appropriate layouts extension is not enabled -|}];; - type t_void : void;; [%%expect{| Line 1, characters 15-19: 1 | type t_void : void;; ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. |}];; +type t_any_non_null : any_non_null;; -(************************************************************) -(* Test 1: Disallow non-representable function args/returns *) +[%%expect{| +type t_any_non_null : any_non_null +|}] -(* CR layouts v3: moved to layouts alpha. Bring here when we have - non-representable layouts enabled by default. *) +type t_value_or_null : value_or_null;; -(*****************************************************) -(* Test 2: Permit representable function arg/returns *) +[%%expect{| +Line 1, characters 23-36: +1 | type t_value_or_null : value_or_null;; + ^^^^^^^^^^^^^ +Error: Layout value_or_null is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. +|}] -(* CR layouts v3: much of this test moved to basics_alpha. Add #float versions - and bring them here when #float is allowed by default. *) -module type S = sig - val f1 : t_value -> t_value - val f2 : t_imm -> t_imm64 +(******************************************************************) +(* Test 1: Allow non-representable function args/returns in types *) + +module type S1 = sig + val f : int -> t_any end;; +[%%expect {| +module type S1 = sig val f : int -> t_any end +|}];; -[%%expect{| -module type S = sig val f1 : t_value -> t_value val f2 : t_imm -> t_imm64 end +module type S1 = sig + val f : t_any -> int +end;; +[%%expect {| +module type S1 = sig val f : t_any -> int end |}];; -(**************************************) -(* Test 3: basic annotated parameters *) +module type S1 = sig + type t : any -(* CR layouts: mostly moved to [basics_beta.ml]. Bring back here when we allow - annotations on parameters by default. *) -type ('a : immediate) imm_id = 'a;; + type ('a : any) s = 'a -> int constraint 'a = t + + type q = t s +end;; [%%expect{| -Line 1, characters 11-20: -1 | type ('a : immediate) imm_id = 'a;; - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. -|}];; +module type S1 = + sig type t : any type 'a s = 'a -> int constraint 'a = t type q = t s end +|}] -(************************************) -(* Test 4: parameters and recursion *) +module type S1 = sig + type t : any -(* CR layouts: immediate bits moved to [basics_beta.ml] and void bits to - [basics_alpha.ml]. Bring each part back here when we allow the relevant - layout annotations on parameters by default. *) + type 'a s = 'a -> int constraint 'a = t -(************************************************************) -(* Test 5: You can touch a void, but not return it directly *) + type q = t s +end;; +[%%expect{| +Line 4, characters 35-41: +4 | type 'a s = 'a -> int constraint 'a = t + ^^^^^^ +Error: The type constraints are not consistent. + Type ('a : '_representable_layout_1) is not compatible with type t + The layout of t is any + because of the definition of t at line 2, characters 2-14. + But the layout of t must be representable + because it instantiates an unannotated type parameter of s. +|}] -(* CR layouts v5: these tests moved to [basics_alpha.ml]. Bring them back here - when we allow void by default. Also the tests will change because we'll - allow returning void. *) +module type S1 = sig + type t : any -(****************************************) -(* Test 6: explicitly polymorphic types *) + type ('a : any) s = int -> 'a constraint 'a = t + + type q = t s +end;; +[%%expect{| +module type S1 = + sig type t : any type 'a s = int -> 'a constraint 'a = t type q = t s end +|}] -(* CR layouts: These tests can come back from [layouts_beta.ml] when we allow parameter - jkind annotations by default. *) +module M1 = struct + type t : any -(*****************************************) -(* Test 7: the layout check in unify_var *) + type ('a : any) s = { a: 'a -> 'a } -(* CR layouts: This test can come back from [layouts_beta.ml] when we allow - parameter layout annotations by default. *) + type q = t s -(**********************************************************) -(* Test 8: Polymorphic variants take value args (for now) *) + let f1 () : 'a s = { a = fun x -> Stdlib_upstream_compatible.Float_u.abs x } + let f2 () : 'a s = { a = fun x -> x ^ "!" } + let f3 () : 'a s = { a = fun x -> x + 1 } +end;; +[%%expect{| +module M1 : + sig + type t : any + type ('a : any) s = { a : 'a -> 'a; } + type q = t s + val f1 : unit -> Stdlib_upstream_compatible.Float_u.t s + val f2 : unit -> string s + val f3 : unit -> int s + end +|}] -(* CR layouts: these tests moved to [basics_alphs.ml] because they need a - non-value layout. Similar tests should be added here once we have another - sort enabled by default (though we will probably chose to allow it as an arg - to polymorphic variants, not ban it). *) +module M1 = struct + type t : any -(************************************************) -(* Test 9: Tuples only work on values (for now) *) + type ('a : any) s = A of ('a -> 'a) -(* CR layouts: these tests moved to [basics_alphs.ml] because they need a - non-value layout. Similar tests should be added here once we have another - sort enabled by default. *) + type q = t s -(*************************************************) -(* Test 10: jkinds are checked by "more general" *) + let f1 () : 'a s = A (fun x -> Stdlib_upstream_compatible.Float_u.abs x) + let f2 () : 'a s = A (fun x -> x ^ "!") + let f3 () : 'a s = A (fun x -> x + 1) +end;; +[%%expect{| +module M1 : + sig + type t : any + type ('a : any) s = A of ('a -> 'a) + type q = t s + val f1 : unit -> Stdlib_upstream_compatible.Float_u.t s + val f2 : unit -> string s + val f3 : unit -> int s + end +|}] -(* CR layouts: These tests moved to [basics_beta.ml] because they use annotated - type parameters. Bring them back here when we allow this by default. *) +module M1 = struct + type t : any -module M10_1 : sig - val x : string -end = struct - type ('a : immediate) t = 'a + type ('a : any) s = A of { a: 'a -> 'a } - let f : 'a t -> 'a = fun x -> x + type q = t s - let x = f (assert false) + let f1 () : 'a s = A { a = fun x -> Stdlib_upstream_compatible.Float_u.abs x } + let f2 () : 'a s = A { a = fun x -> x ^ "!" } + let f3 () : 'a s = A { a = fun x -> x + 1 } end;; [%%expect{| -Line 4, characters 13-22: -4 | type ('a : immediate) t = 'a - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +module M1 : + sig + type t : any + type ('a : any) s = A of { a : 'a -> 'a; } + type q = t s + val f1 : unit -> Stdlib_upstream_compatible.Float_u.t s + val f2 : unit -> string s + val f3 : unit -> int s + end |}] -(**************************************************************) -(* Test 11: objects are values and methods take/return values *) +module M1 = struct + type t : any -(* CR layouts: These tests moved to [basics_alpha.ml] as they need a non-value - sort. Bring back here when we have one enabled by default. *) -module M11_1 = struct - type ('a : void) t = { x : int; v : 'a } + type ('a : any) s = A : ('a : any) 'b. { a: 'a -> 'b -> 'a } -> 'a s - let f t = - t.v # baz11 + type q = t s + + let f0 () = A {a = (fun x y -> x)} + let f1 () = A {a = (fun x y -> x + 1)} + let f2 () = A {a = (fun x y -> x ^ "!")} + let f3 () = A {a = (fun x y -> Stdlib_upstream_compatible.Float_u.abs x)} + let f4 () = A {a = (fun x y -> x + y)} + let f5 () = A {a = (fun x y -> x ^ y)} end;; [%%expect{| -Line 2, characters 13-17: -2 | type ('a : void) t = { x : int; v : 'a } - ^^^^ -Error: Layout void is more experimental than allowed by -extension layouts. - You must enable -extension layouts_alpha to use this feature. +module M1 : + sig + type t : any + type ('a : any) s = A : ('a : any) 'b. { a : 'a -> 'b -> 'a; } -> 'a s + type q = t s + val f0 : unit -> 'a s + val f1 : unit -> int s + val f2 : unit -> string s + val f3 : unit -> Stdlib_upstream_compatible.Float_u.t s + val f4 : unit -> int s + val f5 : unit -> string s + end |}] -(*******************************************************************) -(* Test 12: class parameters and bound vars must have layout value *) +module M1 = struct + type t : any -(* CR layouts: These tests moved to [basics_alpha.ml] as they need a non-value - sort. Bring back here when we have one enabled by default. *) + type ('a : any) s = A : ('a : any) 'b. ('a -> 'b -> 'a) -> 'a s -(***********************************************************) -(* Test 13: built-in type constructors work only on values *) + type q = t s -(* CR layouts: These tests moved to [basics_alpha.ml] as they need a non-value - sort. Bring back here when we have one enabled by default. *) + let f0 () = A (fun x y -> x) + let f1 () = A (fun x y -> x + 1) + let f2 () = A (fun x y -> x ^ "!") + let f3 () = A (fun x y -> Stdlib_upstream_compatible.Float_u.abs x) + let f4 () = A (fun x y -> x + y) + let f5 () = A (fun x y -> x ^ y) +end +[%%expect{| +module M1 : + sig + type t : any + type ('a : any) s = A : ('a : any) 'b. ('a -> 'b -> 'a) -> 'a s + type q = t s + val f0 : unit -> 'a s + val f1 : unit -> int s + val f2 : unit -> string s + val f3 : unit -> Stdlib_upstream_compatible.Float_u.t s + val f4 : unit -> int s + val f5 : unit -> string s + end +|}] -(****************************************************************************) -(* Test 14: Examples motivating the trick with the manifest in [enter_type] *) -type t14 = foo14 list -and foo14 = string;; +module type S1 = sig + type t : any + + type ('a : any) s = A : { a: 'a -> 'b -> 'a } -> 'a s + + type q = t s +end;; [%%expect{| -type t14 = foo14 list -and foo14 = string -|}];; +module type S1 = + sig + type t : any + type ('a : any) s = A : { a : 'a -> 'b -> 'a; } -> 'a s + type q = t s + end +|}] -(* CR layouts: Part of this test moved to [basics_alpha.ml] as it needs a - non-value sort. Bring back here when we have one enabled by default. *) +module M1 = struct + type ('a : any) s = A : { a: 'a -> 'b -> 'a } -> 'a s -(****************************************************) -(* Test 15: Type aliases need not have layout value *) + let f1 () = A {a = (fun x y -> Stdlib_upstream_compatible.Float_u.abs x)} +end;; -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +[%%expect{| +Line 4, characters 72-73: +4 | let f1 () = A {a = (fun x y -> Stdlib_upstream_compatible.Float_u.abs x)} + ^ +Error: This expression has type ('a : value) + but an expression was expected of type + Stdlib_upstream_compatible.Float_u.t = float# + The layout of Stdlib_upstream_compatible.Float_u.t is float64 + because it is the primitive float64 type float#. + But the layout of Stdlib_upstream_compatible.Float_u.t must be a sublayout of value + because of the definition of s at line 2, characters 2-55. +|}] -(********************************************************) -(* Test 16: seperability: [msig_of_external_type] logic *) +module type S1 = sig + type t : any -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) + type ('a : any) s = A : ('a -> 'b -> 'a) -> 'a s -type 'a t_void_16 : void;; + type q = t s +end;; [%%expect{| -Line 1, characters 20-24: -1 | type 'a t_void_16 : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}];; +module type S1 = + sig + type t : any + type ('a : any) s = A : ('a -> 'b -> 'a) -> 'a s + type q = t s + end +|}] -(**************************************************************************) -(* Test 17: incremental layout checking of @@unboxed types - see comment on - [constrain_type_layout]. *) +module M1 = struct + type ('a : any) s = A : ('a -> 'b -> 'a) -> 'a s -type 'a t17 = 'a list -type s17 = { lbl : s17 t17 } [@@unboxed];; + let f1 () = A (fun x y -> Stdlib_upstream_compatible.Float_u.abs x) +end;; [%%expect{| -type 'a t17 = 'a list -type s17 = { lbl : s17 t17; } [@@unboxed] +Line 4, characters 67-68: +4 | let f1 () = A (fun x y -> Stdlib_upstream_compatible.Float_u.abs x) + ^ +Error: This expression has type ('a : value) + but an expression was expected of type + Stdlib_upstream_compatible.Float_u.t = float# + The layout of Stdlib_upstream_compatible.Float_u.t is float64 + because it is the primitive float64 type float#. + But the layout of Stdlib_upstream_compatible.Float_u.t must be a sublayout of value + because of the definition of s at line 2, characters 2-50. +|}] + +module M1 = struct + type ('a : any) s = A : ('a : any) 'b. { a: 'a -> 'b -> 'a } -> 'a s + + let f6 () = A {a = (fun x y -> Stdlib_upstream_compatible.Float_u.add x y)} +end;; + +[%%expect{| +Line 4, characters 74-75: +4 | let f6 () = A {a = (fun x y -> Stdlib_upstream_compatible.Float_u.add x y)} + ^ +Error: This expression has type ('a : value) + but an expression was expected of type + Stdlib_upstream_compatible.Float_u.t = float# + The layout of Stdlib_upstream_compatible.Float_u.t is float64 + because it is the primitive float64 type float#. + But the layout of Stdlib_upstream_compatible.Float_u.t must be a sublayout of value + because of the definition of s at line 2, characters 2-70. +|}] + +module M1 = struct + type ('a : any) s = A : ('a : any) 'b. ('a -> 'b -> 'a) -> 'a s + + let f6 () = A (fun x y -> Stdlib_upstream_compatible.Float_u.add x y) +end;; + +[%%expect{| +Line 4, characters 69-70: +4 | let f6 () = A (fun x y -> Stdlib_upstream_compatible.Float_u.add x y) + ^ +Error: This expression has type ('a : value) + but an expression was expected of type + Stdlib_upstream_compatible.Float_u.t = float# + The layout of Stdlib_upstream_compatible.Float_u.t is float64 + because it is the primitive float64 type float#. + But the layout of Stdlib_upstream_compatible.Float_u.t must be a sublayout of value + because of the definition of s at line 2, characters 2-65. +|}] + +module type S1 = sig + type t : any + + type 'a s = 'a -> int constraint 'a = t +end;; +[%%expect{| +Line 4, characters 35-41: +4 | type 'a s = 'a -> int constraint 'a = t + ^^^^^^ +Error: The type constraints are not consistent. + Type ('a : '_representable_layout_2) is not compatible with type t + The layout of t is any + because of the definition of t at line 2, characters 2-14. + But the layout of t must be representable + because it instantiates an unannotated type parameter of s. +|}] + +module type S1 = sig + type t : any + + type 'a s = int -> 'a constraint 'a = t +end;; +[%%expect{| +Line 4, characters 35-41: +4 | type 'a s = int -> 'a constraint 'a = t + ^^^^^^ +Error: The type constraints are not consistent. + Type ('a : '_representable_layout_3) is not compatible with type t + The layout of t is any + because of the definition of t at line 2, characters 2-14. + But the layout of t must be representable + because it instantiates an unannotated type parameter of s. +|}] + +let f1 () : t_any = assert false;; +[%%expect{| +Line 1, characters 20-32: +1 | let f1 () : t_any = assert false;; + ^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_4) + The layout of t_any is any + because of the definition of t_any at line 5, characters 0-18. + But the layout of t_any must be representable + because we must know concretely how to return a function result. |}];; -(*****************************************) -(* Test 18: expansion in [check_univars] *) -(* This test isn't really layouts-specific, but it checks that the layout checks - we've added in [Typecore.check_univars] don't choke when expansion is needed - to see a variable *) -type 'a t18 = 'a +let f1 (x : t_any) = ();; +[%%expect{| +Line 1, characters 7-18: +1 | let f1 (x : t_any) = ();; + ^^^^^^^^^^^ +Error: This pattern matches values of type t_any + but a pattern was expected which matches values of type + ('a : '_representable_layout_5) + The layout of t_any is any + because of the definition of t_any at line 5, characters 0-18. + But the layout of t_any must be representable + because we must know concretely how to pass a function argument. +|}];; -let id18 (x : 'a t18) = x +(*****************************************************) +(* Test 2: Permit representable function arg/returns *) -let f18 : 'a . 'a -> 'a = fun x -> id18 x;; +(* CR layouts v5: the void bits of this test should be copied here from + basics_alpha *) +module type S = sig + val f1 : t_value -> t_value + val f2 : t_imm -> t_imm64 +end;; [%%expect{| -type 'a t18 = 'a -val id18 : 'a t18 -> 'a t18 = -val f18 : 'a -> 'a = +module type S = sig val f1 : t_value -> t_value val f2 : t_imm -> t_imm64 end |}];; -(********************************) -(* Test 19: non-value coercions *) +module type S2 = sig + val g : float# -> int +end;; +[%%expect{| +module type S2 = sig val g : float# -> int end +|}];; -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +module type S2 = sig + val g : int -> float# +end +[%%expect {| +module type S2 = sig val g : int -> float# end +|}];; -(********************************************) -(* Test 20: Non-value bodies for let module *) +module type S2 = sig + type t' : float64 + type s' = r' -> int + and r' = t' +end;; +[%%expect{| +module type S2 = sig type t' : float64 type s' = r' -> int and r' = t' end +|}] -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +module type S2 = sig + val f : int -> t_float64 +end;; +[%%expect {| +module type S2 = sig val f : int -> t_float64 end +|}];; -(**********************************) -(* Test 21: Non-value unpack body *) +module type S = sig + type t' : float64 + type 'a s' = 'a -> int constraint 'a = t' +end;; +[%%expect{| +module type S = + sig type t' : float64 type 'a s' = 'a -> int constraint 'a = t' end +|}] -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +module F2 (X : sig val x : t_float64 end) = struct + let f () = X.x +end;; +[%%expect{| +Line 1, characters 27-36: +1 | module F2 (X : sig val x : t_float64 end) = struct + ^^^^^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of type t_float64 must be a sublayout of value + because it's the type of something stored in a module structure. +|}];; +(* CR layouts v5: the test above should be made to work *) -(***************************************************************) -(* Test 22: approx_type catch-all can't be restricted to value *) +module F2 (X : sig val f : t_float64 -> unit end) = struct + let g z = X.f z +end;; +[%%expect{| +module F2 : + functor (X : sig val f : t_float64 -> unit end) -> + sig val g : t_float64 -> unit end +|}];; -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +(**************************************) +(* Test 3: basic annotated parameters *) +type ('a : immediate) imm_id = 'a -type t_void : void;; [%%expect{| -Line 1, characters 14-18: -1 | type t_void : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +type ('a : immediate) imm_id = 'a |}];; -(* CR layouts v5: Once we allow non-value top-level module definitions, add - tests showing that things get defaulted to value. -*) +type my_int = int imm_id +let plus_3 (x : my_int) = x + 3 +let plus_3' (x : int imm_id) = x + 3;; -(********************************************************************) -(* Test 23: checking the error message from impossible GADT matches *) +[%%expect{| +type my_int = int imm_id +val plus_3 : my_int -> int = +val plus_3' : int imm_id -> int = +|}];; -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +let string_id (x : string imm_id) = x;; +[%%expect{| +Line 1, characters 19-25: +1 | let string_id (x : string imm_id) = x;; + ^^^^^^ +Error: This type string should be an instance of type ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of imm_id at line 1, characters 0-33. +|}];; -(*****************************************************) -(* Test 24: Polymorphic parameter with exotic layout *) +let id_for_imms (x : 'a imm_id) = x -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +let three = id_for_imms 3 +let true_ = id_for_imms true;; +[%%expect{| +val id_for_imms : ('a : immediate). 'a imm_id -> 'a imm_id = +val three : int imm_id = 3 +val true_ : bool imm_id = true +|}] -(**************************************************) -(* Test 25: Optional parameter with exotic layout *) +let not_helloworld = id_for_imms "hello world";; +[%%expect{| +Line 1, characters 33-46: +1 | let not_helloworld = id_for_imms "hello world";; + ^^^^^^^^^^^^^ +Error: This expression has type string but an expression was expected of type + 'a imm_id = ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of id_for_imms at line 1, characters 16-35. +|}] -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +(************************************) +(* Test 4: parameters and recursion *) +type ('a : immediate) t4 +and s4 = string t4;; -(*********************************************************) -(* Test 26: Inferring an application to an exotic layout *) +[%%expect{| +Line 2, characters 9-15: +2 | and s4 = string t4;; + ^^^^^^ +Error: This type string should be an instance of type ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the annotation on 'a in the declaration of the type t4. +|}];; -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +type s4 = string t4 +and ('a : immediate) t4;; -(******************************************) -(* Test 27: Exotic layouts in approx_type *) +[%%expect{| +Line 1, characters 10-16: +1 | type s4 = string t4 + ^^^^^^ +Error: This type string should be an instance of type ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the annotation on 'a in the declaration of the type t4. +|}] -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +type s4 = int t4 +and ('a : immediate) t4;; -(************************************) -(* Test 28: Exotic layouts in letop *) +[%%expect{| +type s4 = int t4 +and ('a : immediate) t4 +|}] -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +type s4 = s5 t4 +and ('a : immediate) t4 +and s5 = int;; -(*******************************************) -(* Test 29: [external]s default to [value] *) +[%%expect{| +type s4 = s5 t4 +and ('a : immediate) t4 +and s5 = int +|}] -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +type s4 = s5 t4 +and ('a : immediate) t4 +and s5 = string;; -(**************************************) -(* Test 30: [val]s default to [value] *) +[%%expect{| +Line 3, characters 0-15: +3 | and s5 = string;; + ^^^^^^^^^^^^^^^ +Error: + The kind of s5 is value + because it is the primitive value type string. + But the kind of s5 must be a subkind of immediate + because of the annotation on 'a in the declaration of the type t4. +|}] -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +type ('a : any) t4 = 'a +and s4 = string t4;; +[%%expect{| +type ('a : any) t4 = 'a +and s4 = string t4 +|}];; -(**************************************************) -(* Test 31: checking that #poly_var patterns work *) +type s4 = string t4 +and ('a : any) t4;; +[%%expect{| +type s4 = string t4 +and ('a : any) t4 +|}];; + +type ('a : void) void4 = Void4 of 'a;; +[%%expect{| +Line 1, characters 11-15: +1 | type ('a : void) void4 = Void4 of 'a;; + ^^^^ +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. +|}];; -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +type ('a : any) any4 = Any4 of 'a +[%%expect{| +type 'a any4 = Any4 of 'a +|}];; -(*********************************************************) -(* Test 32: Polymorphic variant constructors take values *) +(************************************************************) +(* Test 5: You can touch a void, but not return it directly *) -(* CR layouts: This test moved to [basics_alpha.ml] as it needs a non-value - sort. Bring back here when we have one enabled by default. *) +(* CR layouts v5: these tests moved to [basics_alpha.ml]. Bring them here. + Also the tests will change because we'll allow returning void. *) -(******************************************************) -(* Test 33: Externals must have representable types *) +(****************************************) +(* Test 6: explicitly polymorphic types *) +type ('a : immediate) t6_imm = T6imm of 'a +type ('a : value) t6_val = T6val of 'a;; +[%%expect{| +type ('a : immediate) t6_imm = T6imm of 'a +type 'a t6_val = T6val of 'a +|}];; + +let ignore_val6 : 'a . 'a -> unit = + fun a -> let _ = T6val a in ();; +[%%expect{| +val ignore_val6 : 'a -> unit = +|}];; -(* CR layouts v2.5: This test moved to [basics_alpha.ml] as it needs a - non-representable layout. Bring it back here when we can mention [t_any] in - [-extension layouts]. *) +let ignore_imm6 : 'a . 'a -> unit = + fun a -> let _ = T6imm a in ();; +[%%expect{| +Line 2, characters 2-32: +2 | fun a -> let _ = T6imm a in ();; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This definition has type 'b -> unit which is less general than + 'a. 'a -> unit + The kind of 'a is value + because it is or unifies with an unannotated universal variable. + But the kind of 'a must be a subkind of immediate + because of the definition of t6_imm at line 1, characters 0-42. +|}];; -(****************************************************) -(* Test 34: Layout clash in polymorphic record type *) +let o6 = object + method ignore_imm6 : 'a . 'a -> unit = + fun a -> let _ = T6imm a in () +end;; +[%%expect{| +Line 3, characters 4-34: +3 | fun a -> let _ = T6imm a in () + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This method has type 'b -> unit which is less general than + 'a. 'a -> unit + The kind of 'a is value + because it is or unifies with an unannotated universal variable. + But the kind of 'a must be a subkind of immediate + because of the definition of t6_imm at line 1, characters 0-42. +|}];; -(* CR layouts: This test moved to [basics_beta.ml] as it needs an immediate - type parameter. Bring back here when we have one enabled by default. *) +(* CR layouts v1.5: add more tests here once you can annotate these types with + jkinds. *) -(****************************************************) -(* Test 35: check bad layout error in filter_arrow *) +(****************************************) +(* Test 7: the jkind check in unify_var *) -(* CR layouts: This test moved to [basics_beta.ml] as it needs an immediate - type parameter. Bring back here when we have one enabled by default. *) +type ('a : immediate) t7 = Foo7 of 'a -(**************************************************) -(* Test 36: Disallow non-representable statements *) +type t7' = (int * int) t7;; +[%%expect{| +type ('a : immediate) t7 = Foo7 of 'a +Line 3, characters 12-21: +3 | type t7' = (int * int) t7;; + ^^^^^^^^^ +Error: This type int * int should be an instance of type ('a : immediate) + The kind of int * int is value + because it's a tuple type. + But the kind of int * int must be a subkind of immediate + because of the definition of t7 at line 1, characters 0-37. +|}] -(* CR layouts: This test moved to [basics_beta.ml]. Bring here when we have - non-representable layouts enabled by default. *) +(**********************************************************) +(* Test 8: Polymorphic variants take value args (for now) *) + +(* CR layouts v5: Bring over void versions of these tests. *) + +module M8_1f = struct + type foo1 = [ `Foo1 of int | `Baz1 of t_float64 | `Bar1 of string ];; +end +[%%expect{| +Line 2, characters 40-49: +2 | type foo1 = [ `Foo1 of int | `Baz1 of t_float64 | `Bar1 of string ];; + ^^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +module M8_2f = struct + let foo x = + match x with + | `Baz 42 -> Stdlib_upstream_compatible.Float_u.of_float 3.14 + | `Bar v -> v + | `Bas i -> Stdlib_upstream_compatible.Float_u.of_float 3.14 +end;; +[%%expect {| +Line 5, characters 16-17: +5 | | `Bar v -> v + ^ +Error: This expression has type ('a : value) + but an expression was expected of type + Stdlib_upstream_compatible.Float_u.t = float# + The layout of Stdlib_upstream_compatible.Float_u.t is float64 + because it is the primitive float64 type float#. + But the layout of Stdlib_upstream_compatible.Float_u.t must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}];; + +module M8_3f = struct + type 'a t = [ `Foo of 'a | `Baz of int ] + + type bad = t_float64 t +end;; +[%%expect {| +Line 4, characters 13-22: +4 | type bad = t_float64 t + ^^^^^^^^^ +Error: This type t_float64 should be an instance of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of the definition of t at line 2, characters 2-42. +|}];; + +module M8_4f = struct + type 'a t = [ `Foo of 'a | `Baz of int ] constraint 'a = t_float64 +end;; +[%%expect {| +Line 2, characters 54-68: +2 | type 'a t = [ `Foo of 'a | `Baz of int ] constraint 'a = t_float64 + ^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. + Type ('a : value) is not compatible with type t_float64 + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it instantiates an unannotated type parameter of t, + defaulted to layout value. +|}];; + +module type S8_5f = sig + val x : [`A of t_float64] +end;; +[%%expect{| +Line 2, characters 17-26: +2 | val x : [`A of t_float64] + ^^^^^^^^^ +Error: Polymorphic variant constructor argument types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}] + +(************************************************) +(* Test 9: Tuples only work on values (for now) *) + +(* CR layouts v5: bring over void tests. *) +module M9_1f = struct + type foo1 = int * t_float64 * [ `Foo1 of int | `Bar1 of string ];; +end +[%%expect{| +Line 2, characters 20-29: +2 | type foo1 = int * t_float64 * [ `Foo1 of int | `Bar1 of string ];; + ^^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +module M9_2f = struct + type result = V of (string * t_float64) | I of int +end;; +[%%expect {| +Line 2, characters 31-40: +2 | type result = V of (string * t_float64) | I of int + ^^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +module M9_4f = struct + let f_id (x : float#) = x + + let foo x = + match x with + | (a, _) -> f_id a +end;; +[%%expect {| +Line 6, characters 21-22: +6 | | (a, _) -> f_id a + ^ +Error: This expression has type ('a : value) + but an expression was expected of type float# + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because it's the type of a tuple element. +|}];; + +module M9_5f = struct + type 'a t = (int * 'a) + + type bad = t_float64 t +end;; +[%%expect {| +Line 4, characters 13-22: +4 | type bad = t_float64 t + ^^^^^^^^^ +Error: This type t_float64 should be an instance of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of the definition of t at line 2, characters 2-24. +|}];; + +module M9_6f = struct + type 'a t = int * 'a constraint 'a = t_float64 +end;; +[%%expect {| +Line 2, characters 34-48: +2 | type 'a t = int * 'a constraint 'a = t_float64 + ^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. + Type ('a : value) is not compatible with type t_float64 + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it instantiates an unannotated type parameter of t, + defaulted to layout value. +|}];; + +module type S9_7f = sig + val x : int * t_float64 +end;; +[%%expect{| +Line 2, characters 16-25: +2 | val x : int * t_float64 + ^^^^^^^^^ +Error: Tuple element types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a tuple element. +|}];; + +(*************************************************) +(* Test 10: jkinds are checked by "more general" *) + +(* This hits the first linktype in moregen (no expansion required to see it's a + var) *) +module M10_1 : sig + val x : string +end = struct + type ('a : immediate) t = 'a + + let f : 'a t -> 'a = fun x -> x + + let x = f (assert false) +end;; +[%%expect {| +Lines 3-9, characters 6-3: +3 | ......struct +4 | type ('a : immediate) t = 'a +5 | +6 | let f : 'a t -> 'a = fun x -> x +7 | +8 | let x = f (assert false) +9 | end.. +Error: Signature mismatch: + Modules do not match: + sig + type ('a : immediate) t = 'a + val f : ('a : immediate). 'a t -> 'a + val x : ('a : immediate). 'a + end + is not included in + sig val x : string end + Values do not match: + val x : ('a : immediate). 'a + is not included in + val x : string + The type ('a : immediate) is not compatible with the type string + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of x at line 8, characters 10-26. +|}];; + +(* This hits the second linktype in moregen (requires expansion to see it's a + var) *) +module M10_2 : sig + val x : string +end = struct + type ('a : immediate) t = 'a + + let f (x : 'a t) : 'a t = x + + let x = f (assert false) +end;; +[%%expect {| +Lines 3-9, characters 6-3: +3 | ......struct +4 | type ('a : immediate) t = 'a +5 | +6 | let f (x : 'a t) : 'a t = x +7 | +8 | let x = f (assert false) +9 | end.. +Error: Signature mismatch: + Modules do not match: + sig + type ('a : immediate) t = 'a + val f : ('a : immediate). 'a t -> 'a t + val x : ('a : immediate). 'a t + end + is not included in + sig val x : string end + Values do not match: + val x : ('a : immediate). 'a t + is not included in + val x : string + The type 'a t = ('a : immediate) is not compatible with the type + string + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of x at line 8, characters 10-26. +|}] + +(**********************************************************************) +(* Test 11: objects are values. methods may take/return other sorts. *) + +(* CR layouts v5: bring the void versions back here. *) +module M11_1 = struct + type ('a : void) t = { x : int; v : 'a } + + let f t = + t.v # baz11 +end;; +[%%expect{| +Line 2, characters 13-17: +2 | type ('a : void) t = { x : int; v : 'a } + ^^^^ +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. +|}] + +module M11_1f = struct + type ('a : float64) t = 'a + + let f (x : 'a t) = + x # baz11 +end;; +[%%expect{| +Line 5, characters 4-5: +5 | x # baz11 + ^ +Error: Object types must have layout value. + The layout of the type of this expression is float64 + because of the definition of t at line 2, characters 2-28. + But the layout of the type of this expression must overlap with value + because it's the type of an object. +|}] + +module M11_2f = struct + type ('a : float64) t = 'a + let f_id (x : 'a t) = x + let foo x = f_id (x # getfloat) +end;; +[%%expect{| +Line 4, characters 19-33: +4 | let foo x = f_id (x # getfloat) + ^^^^^^^^^^^^^^ +Error: This expression has type ('a : value) + but an expression was expected of type 'b t = ('b : float64) + The layout of 'a t is float64 + because of the definition of f_id at line 3, characters 11-25. + But the layout of 'a t must overlap with value + because it's the type of an object field. +|}];; + +module M11_3f = struct + type ('a : float64) t = 'a + + let foo o (x : 'a t) = o # usefloat x +end;; +[%%expect{| +module M11_3f : + sig + type ('a : float64) t = 'a + val foo : ('a : float64) 'b. < usefloat : 'a t -> 'b; .. > -> 'a t -> 'b + end +|}];; + +module M11_4f = struct + val x : < l : t_float64 > +end;; +[%%expect{| +Line 2, characters 12-25: +2 | val x : < l : t_float64 > + ^^^^^^^^^^^^^ +Error: Object field types must have layout value. + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of an object field. +|}];; + +module M11_5f = struct + type 'a t = < l : 'a s > + and ('a : float64) s = 'a +end;; +[%%expect{| +Line 3, characters 2-27: +3 | and ('a : float64) s = 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: + The layout of 'a s is float64 + because of the annotation on 'a in the declaration of the type s. + But the layout of 'a s must be a sublayout of value + because it's the type of an object field. +|}];; + +module M11_6f = struct + type 'a t = < l : 'a > constraint 'a = t_float64 +end;; +[%%expect{| +Line 2, characters 36-50: +2 | type 'a t = < l : 'a > constraint 'a = t_float64 + ^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. + Type ('a : value) is not compatible with type t_float64 + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of an object field. +|}];; + +(*******************************************************************) +(* Test 12: class parameters and bound vars must have jkind value *) + +(* CR layouts v5: Bring the void versions back here. *) + +(* Hits `Pcl_let` *) +module M12_1f = struct + let f : ('a : float64) . unit -> 'a = fun () -> assert false + class foo12 u = + let d = f u in + object + val bar = () + end;; +end +[%%expect{| +Line 4, characters 8-9: +4 | let d = f u in + ^ +Error: The types of variables bound by a 'let' in a class function + must have layout value. Instead, d's type has layout float64. +|}];; + +(* Hits the Cfk_concrete case of Pcf_val *) +module M12_2f = struct + let f : ('a : float64) . unit -> 'a = fun () -> assert false + class foo u = + object + val bar = f u + end +end;; +[%%expect{| +Line 5, characters 10-13: +5 | val bar = f u + ^^^ +Error: Variables bound in a class must have layout value. + The layout of bar is float64 + because of the definition of f at line 2, characters 6-7. + But the layout of bar must overlap with value + because it's the type of a class field. +|}];; + +(* Hits the Cfk_virtual case of Pcf_val *) +module M12_3f = struct + class virtual foo = + object + val virtual bar : t_float64 + end +end;; +[%%expect{| +Line 4, characters 18-21: +4 | val virtual bar : t_float64 + ^^^ +Error: Variables bound in a class must have layout value. + The layout of bar is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of bar must be a sublayout of value + because it's the type of a class field. +|}];; + +module M12_4f = struct + type ('a : float64) t + + class virtual ['a] foo = + object + val virtual baz : 'a t + end +end +[%%expect{| +Line 6, characters 24-26: +6 | val virtual baz : 'a t + ^^ +Error: This type ('a : float64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with float64 + because of the definition of t at line 2, characters 2-23. +|}];; + +module M12_5f = struct + type ('a : float64) t = 'a + + class ['a] foo = + object + method void_id (a : 'a t) : 'a t = a + end +end;; +[%%expect{| +Line 6, characters 26-28: +6 | method void_id (a : 'a t) : 'a t = a + ^^ +Error: This type ('a : float64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with float64 + because of the definition of t at line 2, characters 2-28. +|}];; + +module type S12_6f = sig + type ('a : float64) t = 'a + + class ['a] foo : + 'a t -> + object + method baz : int + end +end;; +[%%expect{| +Line 5, characters 4-6: +5 | 'a t -> + ^^ +Error: This type ('a : float64) should be an instance of type ('a0 : value) + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with float64 + because of the definition of t at line 2, characters 2-28. +|}];; + +module type S12_7f = sig + class foo : + object + val baz : t_float64 + end +end;; +[%%expect{| +Line 4, characters 6-25: +4 | val baz : t_float64 + ^^^^^^^^^^^^^^^^^^^ +Error: Variables bound in a class must have layout value. + The layout of baz is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of baz must be a sublayout of value + because it's the type of an instance variable. +|}];; + +(*************************************************************************) +(* Test 13: built-in type constructors and support for non-value layouts *) + +(* CR layouts v5: Bring the void versions over from basics_alpha *) + +(* lazy *) +type t13f = t_float64 Lazy.t;; +[%%expect{| +Line 1, characters 12-21: +1 | type t13f = t_float64 Lazy.t;; + ^^^^^^^^^ +Error: This type t_float64 should be an instance of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of Lazy.t has this layout. +|}];; + +let x13f (v : t_float64) = lazy v;; +[%%expect{| +Line 1, characters 32-33: +1 | let x13f (v : t_float64) = lazy v;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a lazy expression. +|}];; + +let f_id (x : t_float64) = x +let x13f v = + match v with + | lazy v -> f_id v +[%%expect{| +val f_id : t_float64 -> t_float64 = +Line 4, characters 19-20: +4 | | lazy v -> f_id v + ^ +Error: This expression has type ('a : value) + but an expression was expected of type t_float64 + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a lazy expression. +|}];; + +(* option *) +(* CR layouts v5: allow this *) +type t13f = t_float64 option;; +[%%expect{| +Line 1, characters 12-21: +1 | type t13f = t_float64 option;; + ^^^^^^^^^ +Error: This type t_float64 should be an instance of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of option has layout value. +|}];; + +let x13f (v : t_float64) = Some v;; +[%%expect{| +Line 1, characters 32-33: +1 | let x13f (v : t_float64) = Some v;; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of option has layout value. +|}];; + +let x13f v = + match v with + | Some v -> f_id v + | None -> assert false +[%%expect{| +Line 3, characters 19-20: +3 | | Some v -> f_id v + ^ +Error: This expression has type ('a : value) + but an expression was expected of type t_float64 + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of option has layout value. +|}];; + +(* list *) +type t13f = t_float64 list;; +[%%expect{| +Line 1, characters 12-21: +1 | type t13f = t_float64 list;; + ^^^^^^^^^ +Error: This type t_float64 should be an instance of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of list has layout value. +|}];; + +let x13 (v : t_float64) = [v];; +[%%expect{| +Line 1, characters 27-28: +1 | let x13 (v : t_float64) = [v];; + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of list has layout value. +|}];; + +let x13 v = + match v with + | [v] -> f_id v + | _ -> assert false +[%%expect{| +Line 3, characters 16-17: +3 | | [v] -> f_id v + ^ +Error: This expression has type ('a : value) + but an expression was expected of type t_float64 + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of list has layout value. +|}];; + +(* array *) +type t13f = t_float64 array;; +[%%expect{| +type t13f = t_float64 array +|}];; + +let x13f (v : t_float64) = [| v |];; +[%%expect{| +val x13f : t_float64 -> t_float64 array = +|}];; + +let x13f v = + match v with + | [| v |] -> f_id v + | _ -> assert false +[%%expect{| +val x13f : t_float64 array -> t_float64 = +|}];; + +(****************************************************************************) +(* Test 14: Examples motivating the trick with the manifest in [enter_type] *) + +type t14 = foo14 list +and foo14 = string;; +[%%expect{| +type t14 = foo14 list +and foo14 = string +|}];; + +(* CR layouts v5: Bring back void version from basics_alpha. *) + +type t14 = foo14 list +and foo14 = t_float64;; +[%%expect{| +Line 2, characters 0-21: +2 | and foo14 = t_float64;; + ^^^^^^^^^^^^^^^^^^^^^ +Error: + The layout of foo14 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of foo14 must be a sublayout of value + because the type argument of list has layout value. +|}];; + +(****************************************************) +(* Test 15: Type aliases need not have jkind value *) + +(* CR layouts v5: Bring back void version from basics_alpha. *) + +type ('a : float64) t15 +type ('a, 'b) foo15 = ('a as 'b) t15 -> 'b t15;; +[%%expect{| +type ('a : float64) t15 +type ('a : float64, 'b) foo15 = 'a t15 -> 'a t15 constraint 'b = 'a +|}] + + +(********************************************************) +(* Test 16: seperability: [msig_of_external_type] logic *) + +(* CR layouts v5: This test moved to [basics_alpha.ml] as it needs a non-value + sort in a variant. Bring back here when we have one. *) + +type 'a t_void_16 : void;; +[%%expect{| +Line 1, characters 20-24: +1 | type 'a t_void_16 : void;; + ^^^^ +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. +|}];; + +(**************************************************************************) +(* Test 17: incremental jkind checking of @@unboxed types - see comment on + [constrain_type_jkind]. *) + +type 'a t17 = 'a list +type s17 = { lbl : s17 t17 } [@@unboxed];; + +[%%expect{| +type 'a t17 = 'a list +type s17 = { lbl : s17 t17; } [@@unboxed] +|}];; + +(*****************************************) +(* Test 18: expansion in [check_univars] *) +(* This test isn't really jkinds-specific, but it checks that the jkind checks + we've added in [Typecore.check_univars] don't choke when expansion is needed + to see a variable *) +type 'a t18 = 'a + +let id18 (x : 'a t18) = x + +let f18 : 'a . 'a -> 'a = fun x -> id18 x;; + +[%%expect{| +type 'a t18 = 'a +val id18 : 'a t18 -> 'a t18 = +val f18 : 'a -> 'a = +|}];; + +(********************************) +(* Test 19: non-value coercions *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +let f19f () = + let x : t_float64 = assert false in + let _y = (x :> t_float64) in + ();; +[%%expect{| +val f19f : unit -> unit = +|}];; + +(********************************************) +(* Test 20: Non-value bodies for let module *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +let f20f () = + let x : t_float64 = assert false in + let _y = + let module M = struct end in + x + in + ();; +[%%expect{| +val f20f : unit -> unit = +|}];; + +(**********************************) +(* Test 21: Non-value unpack body *) +module type M21 = sig end + +(* CR layouts v5: bring void version here from layouts_alpha *) + +let f21f () = + let x : t_float64 = assert false in + let _y = + let (module M) = (module struct end : M21) in + x + in + ();; +[%%expect{| +module type M21 = sig end +val f21f : unit -> unit = +|}];; + +(***************************************************************) +(* Test 22: approx_type catch-all can't be restricted to value *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +type ('a : float64) t22f = 'a + +let f () = + let rec g x : _ t22f = g x in + g (assert false);; +[%%expect{| +type ('a : float64) t22f = 'a +val f : ('a : float64). unit -> 'a t22f t22f = +|}];; + + +(********************************************************************) +(* Test 23: checking the error message from impossible GADT matches *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +type (_ : any, _ : any) eq = Refl : ('a : any). ('a, 'a) eq + +module Mf : sig + type t_float64 : float64 + type t_imm : immediate +end = struct + type t_float64 : float64 + type t_imm : immediate +end +(* these are abstract, so the only trouble with unifying them in a GADT + match is around their layouts *) + +let f (x : (Mf.t_float64, Mf.t_imm) eq) = + match x with + | Refl -> () + +[%%expect{| +type (_ : any, _ : any) eq = Refl : ('a : any). ('a, 'a) eq +module Mf : sig type t_float64 : float64 type t_imm : immediate end +Line 15, characters 4-8: +15 | | Refl -> () + ^^^^ +Error: This pattern matches values of type (Mf.t_float64, Mf.t_float64) eq + but a pattern was expected which matches values of type + (Mf.t_float64, Mf.t_imm) eq + The layout of Mf.t_float64 is float64 + because of the definition of t_float64 at line 4, characters 2-26. + But the layout of Mf.t_float64 must overlap with value + because of the definition of t_imm at line 5, characters 2-24. +|}] + +(*****************************************************) +(* Test 24: Polymorphic parameter with exotic layout *) + +(* CR layouts v5: bring void version here from layouts_alpha *) +type 'a t2_float : float64 + +let f (x : 'a. 'a t2_float) = x + +[%%expect{| +type 'a t2_float : float64 +val f : ('a. 'a t2_float) -> 'b t2_float = +|}] + +(**************************************************) +(* Test 25: Optional parameter with exotic layout *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +let f (x : t_float64) = + let g ?(x2 = x) () = () in + () + +[%%expect{| +Line 2, characters 15-16: +2 | let g ?(x2 = x) () = () in + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because the type argument of option has layout value. +|}] + +(*********************************************************) +(* Test 26: Inferring an application to an exotic layout *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +let g f (x : t_float64) : t_float64 = f x + +[%%expect{| +val g : (t_float64 -> t_float64) -> t_float64 -> t_float64 = +|}] + +(******************************************) +(* Test 27: Exotic layouts in approx_type *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +let rec f : _ -> _ = fun (x : t_float64) -> x + +[%%expect{| +val f : t_float64 -> t_float64 = +|}] + +(************************************) +(* Test 28: Exotic layouts in letop *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +(* 28.1: non-value letop arg *) +let ( let* ) (x : t_float64) f = () + +let q () = + let* x = assert false in + () + +[%%expect{| +val ( let* ) : t_float64 -> 'a -> unit = +val q : unit -> unit = +|}] + +(* 28.2: non-value letop binder arg without and *) +let ( let* ) x (f : t_float64 -> _) = () + +let q () = + let* x = assert false in + () + +[%%expect{| +val ( let* ) : 'a ('b : any). 'a -> (t_float64 -> 'b) -> unit = +val q : unit -> unit = +|}] + +(* 28.3: non-value letop binder result *) +let ( let* ) x (f : _ -> t_float64) = () + +let q () = + let* x = assert false in + assert false + +[%%expect{| +val ( let* ) : 'a ('b : any). 'a -> ('b -> t_float64) -> unit = +val q : unit -> unit = +|}] + +(* 28.4: non-value letop result *) +let ( let* ) x f : t_float64 = assert false + +let q () = + let* x = 5 in + () + +[%%expect{| +val ( let* ) : 'a -> 'b -> t_float64 = +val q : unit -> t_float64 = +|}] + +(* 28.5: non-value andop second arg *) +let ( let* ) x f = () +let ( and* ) x1 (x2 : t_float64) = () +let q () = + let* x = 5 + and* y = assert false + in + () + +[%%expect{| +val ( let* ) : 'a -> 'b -> unit = +val ( and* ) : 'a -> t_float64 -> unit = +val q : unit -> unit = +|}] + +(* 28.6: non-value andop first arg *) +let ( let* ) x f = () +let ( and* ) (x1 : t_float64) x2 = () +let q () = + let* x = assert false + and* y = 5 + in + () + +[%%expect{| +val ( let* ) : 'a -> 'b -> unit = +val ( and* ) : t_float64 -> 'a -> unit = +val q : unit -> unit = +|}] + +(* 28.7: non-value andop result *) +let ( let* ) (x : (_ : float64)) f = () +let ( and* ) x1 x2 : t_float64 = assert false +let q () = + let* x = 5 + and* y = 5 + in + () + +[%%expect{| +val ( let* ) : ('a : float64) 'b. 'a -> 'b -> unit = +val ( and* ) : 'a -> 'b -> t_float64 = +val q : unit -> unit = +|}] + +(* 28.8: non-value letop binder arg with and *) +let ( let* ) x f = () +let ( and* ) x1 x2 = assert false +let q () = + let* x : t_float64 = assert false + and* y = 5 + in + () + +[%%expect{| +val ( let* ) : 'a -> 'b -> unit = +val ( and* ) : 'a -> 'b -> 'c = +Line 4, characters 9-22: +4 | let* x : t_float64 = assert false + ^^^^^^^^^^^^^ +Error: This pattern matches values of type t_float64 + but a pattern was expected which matches values of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a tuple element. +|}] + +(*******************************************) +(* Test 29: [external]s default to [value] *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +external eq : 'a -> 'a -> bool = "%equal" +let mk_float64 () : t_float64 = assert false +let x () = eq (mk_float64 ()) (mk_float64 ()) + +[%%expect{| +external eq : 'a -> 'a -> bool = "%equal" +val mk_float64 : unit -> t_float64 = +Line 3, characters 14-29: +3 | let x () = eq (mk_float64 ()) (mk_float64 ()) + ^^^^^^^^^^^^^^^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of the definition of eq at line 1, characters 0-41. +|}] + +(**************************************) +(* Test 30: [val]s default to [value] *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +module M : sig + val f : 'a -> 'a +end = struct + let f x = x +end + +let g (x : t_float64) = M.f x + +[%%expect{| +module M : sig val f : 'a -> 'a end +Line 7, characters 28-29: +7 | let g (x : t_float64) = M.f x + ^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of the definition of f at line 2, characters 2-18. +|}] + +(**************************************************) +(* Test 31: checking that #poly_var patterns work *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +type ('a : float64) poly_var = [`A of int * 'a | `B] + +let f #poly_var = "hello" + +[%%expect{| +Line 1, characters 44-46: +1 | type ('a : float64) poly_var = [`A of int * 'a | `B] + ^^ +Error: This type ('a : value) should be an instance of type ('a0 : float64) + The layout of 'a is float64 + because of the annotation on 'a in the declaration of the type + poly_var. + But the layout of 'a must overlap with value + because it's the type of a tuple element. +|}] + +(*********************************************************) +(* Test 32: Polymorphic variant constructors take values *) + +(* CR layouts v5: bring void version here from layouts_alpha *) + +let f _ = `Mk (assert false : t_float64) + +[%%expect{| +Line 1, characters 14-40: +1 | let f _ = `Mk (assert false : t_float64) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_float64 + but an expression was expected of type ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of the field of a polymorphic variant. +|}] + +(******************************************************) +(* Test 33: Externals must have representable types *) + +external foo33 : t_any = "foo33";; + +[%%expect{| +Line 1, characters 17-22: +1 | external foo33 : t_any = "foo33";; + ^^^^^ +Error: This type signature for foo33 is not a value type. + The layout of type t_any is any + because of the definition of t_any at line 5, characters 0-18. + But the layout of type t_any must be a sublayout of value + because it's the type of something stored in a module structure. +|}] + +external foo44 : ('a : any). 'a -> unit = "foo44";; + +[%%expect{| +Line 1, characters 29-31: +1 | external foo44 : ('a : any). 'a -> unit = "foo44";; + ^^ +Error: Types in an external must have a representable layout. + The layout of 'a is any + because of the annotation on the universal variable 'a. + But the layout of 'a must be representable + because it's the type of an argument in an external declaration. +|}] + +external foo55 : ('a : any). unit -> 'a = "foo55";; + +[%%expect{| +Line 1, characters 37-39: +1 | external foo55 : ('a : any). unit -> 'a = "foo55";; + ^^ +Error: Types in an external must have a representable layout. + The layout of 'a is any + because of the annotation on the universal variable 'a. + But the layout of 'a must be representable + because it's the type of the result of an external declaration. +|}] + +(****************************************************) +(* Test 34: Layout clash in polymorphic record type *) + +type ('a : immediate) t2_imm + +type s = { f : ('a : value) . 'a -> 'a u } +and 'a u = 'a t2_imm + +[%%expect {| +type ('a : immediate) t2_imm +Line 3, characters 15-40: +3 | type s = { f : ('a : value) . 'a -> 'a u } + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The kind of 'a is value + because of the annotation on the universal variable 'a. + But the kind of 'a must be a subkind of immediate + because of the definition of t2_imm at line 1, characters 0-28. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}] + +(****************************************************) +(* Test 35: check bad layout error in filter_arrow *) + +type ('a : immediate) t35 = 'a +let f35 : 'a t35 = fun () -> () + +[%%expect {| +type ('a : immediate) t35 = 'a +Line 2, characters 19-31: +2 | let f35 : 'a t35 = fun () -> () + ^^^^^^^^^^^^ +Error: + The kind of 'a -> 'b is value + because it's a function type. + But the kind of 'a -> 'b must be a subkind of immediate + because of the definition of t35 at line 1, characters 0-30. +|}] + +(**************************************************) +(* Test 36: Disallow non-representable statements *) + +let () = (assert false : t_any); () +[%%expect{| +Line 1, characters 9-31: +1 | let () = (assert false : t_any); () + ^^^^^^^^^^^^^^^^^^^^^^ +Warning 10 [non-unit-statement]: this expression should have type unit. + +Line 1, characters 10-22: +1 | let () = (assert false : t_any); () + ^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_6) + because it is in the left-hand side of a sequence + The layout of t_any is any + because of the definition of t_any at line 5, characters 0-18. + But the layout of t_any must be representable + because it's the type of a statement. +|}] + +let () = while false do (assert false : t_any); done +[%%expect{| +Line 1, characters 24-46: +1 | let () = while false do (assert false : t_any); done + ^^^^^^^^^^^^^^^^^^^^^^ +Warning 10 [non-unit-statement]: this expression should have type unit. + +Line 1, characters 25-37: +1 | let () = while false do (assert false : t_any); done + ^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_7) + because it is in the body of a while-loop + The layout of t_any is any + because of the definition of t_any at line 5, characters 0-18. + But the layout of t_any must be representable + because it's the type of a statement. +|}] + +let () = for i = 0 to 0 do (assert false : t_any); done +[%%expect{| +Line 1, characters 27-49: +1 | let () = for i = 0 to 0 do (assert false : t_any); done + ^^^^^^^^^^^^^^^^^^^^^^ +Warning 10 [non-unit-statement]: this expression should have type unit. + +Line 1, characters 28-40: +1 | let () = for i = 0 to 0 do (assert false : t_any); done + ^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_8) + because it is in the body of a for-loop + The layout of t_any is any + because of the definition of t_any at line 5, characters 0-18. + But the layout of t_any must be representable + because it's the type of a statement. +|}] + +(******************************************************) +(* Test 37: Ensure signature inclusion checks layouts *) + +module M1 : sig + val f : ('a : any). 'a -> 'a +end = struct + let f x = x +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | let f x = x +5 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + sig val f : ('a : any). 'a -> 'a end + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : any). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The layout of 'a is any + because of the definition of f at line 2, characters 2-30. + But the layout of 'a must be representable + because of the definition of f at line 4, characters 8-13. +|}] + +module M1 : sig + val f : unit -> 'a -> 'a +end = struct + let rec f : type (a : any). unit -> a -> a = fun _ -> f () +end + +[%%expect{| +module M1 : sig val f : unit -> 'a -> 'a end +|}] + +module type S_any = sig + val f : ('a : any). 'a -> 'a +end + +module type S_value = sig + val f : 'a -> 'a +end + +module type S_float64 = sig + val f : ('a : float64). 'a -> 'a +end + +[%%expect{| +module type S_any = sig val f : ('a : any). 'a -> 'a end +module type S_value = sig val f : 'a -> 'a end +module type S_float64 = sig val f : ('a : float64). 'a -> 'a end +|}] + +module F (X : S_any) : S_value = X + +[%%expect{| +module F : functor (X : S_any) -> S_value +|}] + +module F (X : S_value) : S_any = X + +[%%expect{| +Line 1, characters 33-34: +1 | module F (X : S_value) : S_any = X + ^ +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + S_any + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : any). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The layout of 'a is any + because of the definition of f at line 2, characters 2-30. + But the layout of 'a must be a sublayout of value + because of the definition of f at line 6, characters 2-18. +|}] + +module F (X : S_value) : S_float64 = X + +[%%expect{| +Line 1, characters 37-38: +1 | module F (X : S_value) : S_float64 = X + ^ +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a end + is not included in + S_float64 + Values do not match: + val f : 'a -> 'a + is not included in + val f : ('a : float64). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The layout of 'a is float64 + because of the definition of f at line 10, characters 2-34. + But the layout of 'a must be a sublayout of value + because of the definition of f at line 6, characters 2-18. +|}] + +module M2 : sig + type ('a : any) t = 'a +end = struct + type ('a : value) t = 'a +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type ('a : value) t = 'a +5 | end +Error: Signature mismatch: + Modules do not match: + sig type 'a t = 'a end + is not included in + sig type ('a : any) t = 'a end + Type declarations do not match: + type 'a t = 'a + is not included in + type ('a : any) t = 'a + The type ('a : value) is not equal to the type ('a0 : any) + because their layouts are different. +|}] + +module M3 : sig + type ('a : any) t = 'a -> 'a +end = struct + type 'a t = 'a -> 'a +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type 'a t = 'a -> 'a +5 | end +Error: Signature mismatch: + Modules do not match: + sig type 'a t = 'a -> 'a end + is not included in + sig type ('a : any) t = 'a -> 'a end + Type declarations do not match: + type 'a t = 'a -> 'a + is not included in + type ('a : any) t = 'a -> 'a + The type ('a : value) is not equal to the type ('a0 : any) + because their layouts are different. +|}] + +module M4 : sig + type t = { f : ('a : any). 'a -> 'a } +end = struct + type t = { f : 'a. 'a -> 'a } +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { f : 'a. 'a -> 'a } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { f : 'a. 'a -> 'a; } end + is not included in + sig type t = { f : ('a : any). 'a -> 'a; } end + Type declarations do not match: + type t = { f : 'a. 'a -> 'a; } + is not included in + type t = { f : ('a : any). 'a -> 'a; } + Fields do not match: + f : 'a. 'a -> 'a; + is not the same as: + f : ('a : any). 'a -> 'a; + The type 'a. 'a -> 'a is not equal to the type ('a : any). 'a -> 'a + Type 'a is not equal to type 'a0 +|}] + +module M5 : sig + type t = { f : 'a. 'a -> 'a } +end = struct + type t = { f : ('a : any). 'a -> 'a } +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { f : ('a : any). 'a -> 'a } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { f : ('a : any). 'a -> 'a; } end + is not included in + sig type t = { f : 'a. 'a -> 'a; } end + Type declarations do not match: + type t = { f : ('a : any). 'a -> 'a; } + is not included in + type t = { f : 'a. 'a -> 'a; } + Fields do not match: + f : ('a : any). 'a -> 'a; + is not the same as: + f : 'a. 'a -> 'a; + The type ('a : any). 'a -> 'a is not equal to the type 'a. 'a -> 'a + Type 'a is not equal to type 'a0 +|}] + +module M6 : sig + val f : ('a. 'a -> unit) -> unit +end = struct + let f (g : ('a : any). 'a -> unit) = + ignore (g (Stdlib_upstream_compatible.Float_u.of_float 3.14)); ignore (g "hello"); ignore (g 5); () +end + +[%%expect{| +Lines 3-6, characters 6-3: +3 | ......struct +4 | let f (g : ('a : any). 'a -> unit) = +5 | ignore (g (Stdlib_upstream_compatible.Float_u.of_float 3.14)); ignore (g "hello"); ignore (g 5); () +6 | end +Error: Signature mismatch: + Modules do not match: + sig val f : (('a : any). 'a -> unit) -> unit end + is not included in + sig val f : ('a. 'a -> unit) -> unit end + Values do not match: + val f : (('a : any). 'a -> unit) -> unit + is not included in + val f : ('a. 'a -> unit) -> unit + The type (('a : any). 'a -> unit) -> unit + is not compatible with the type ('a. 'a -> unit) -> unit + Type 'a is not compatible with type 'a0 +|}] + +module M7 : sig + val f : (('a : any). 'a -> 'a) -> unit +end = struct + let f (g : 'a. 'a -> 'a) = + ignore (g "hello"); () +end + +[%%expect{| +Lines 3-6, characters 6-3: +3 | ......struct +4 | let f (g : 'a. 'a -> 'a) = +5 | ignore (g "hello"); () +6 | end +Error: Signature mismatch: + Modules do not match: + sig val f : ('a. 'a -> 'a) -> unit end + is not included in + sig val f : (('a : any). 'a -> 'a) -> unit end + Values do not match: + val f : ('a. 'a -> 'a) -> unit + is not included in + val f : (('a : any). 'a -> 'a) -> unit + The type ('a. 'a -> 'a) -> unit is not compatible with the type + (('a : any). 'a -> 'a) -> unit + Type 'a is not compatible with type 'a0 +|}] + +module M8 : sig + type ('a : any) t = K of ('a -> 'a) +end = struct + type 'a t = K of ('a -> 'a) +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type 'a t = K of ('a -> 'a) +5 | end +Error: Signature mismatch: + Modules do not match: + sig type 'a t = K of ('a -> 'a) end + is not included in + sig type ('a : any) t = K of ('a -> 'a) end + Type declarations do not match: + type 'a t = K of ('a -> 'a) + is not included in + type ('a : any) t = K of ('a -> 'a) + Their parameters differ: + The type ('a : value) is not equal to the type ('a0 : any) + because their layouts are different. +|}] + +module M9 : sig + type 'a t = K of ('a -> 'a) +end = struct + type ('a : any) t = K of ('a -> 'a) +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type ('a : any) t = K of ('a -> 'a) +5 | end +Error: Signature mismatch: + Modules do not match: + sig type ('a : any) t = K of ('a -> 'a) end + is not included in + sig type 'a t = K of ('a -> 'a) end + Type declarations do not match: + type ('a : any) t = K of ('a -> 'a) + is not included in + type 'a t = K of ('a -> 'a) + Their parameters differ: + The type ('a : any) is not equal to the type ('a0 : value) + because their layouts are different. +|}] +(* CR layouts: This one should be fine to accept *) + +(*****************************************************) +(* Test 38: Ensure Univar unification checks layouts *) + +let poly : ('a. 'a -> 'a) -> int * bool = + fun (id : ('a : immediate). 'a -> 'a) -> id 3, id true + +[%%expect{| +Line 2, characters 7-38: +2 | fun (id : ('a : immediate). 'a -> 'a) -> id 3, id true + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This pattern matches values of type ('a : immediate). 'a -> 'a + but a pattern was expected which matches values of type 'a. 'a -> 'a + Type 'a is not compatible with type 'a0 +|}] +(* CR layouts: This one should be fine to accept *) + +type ('a : any) foo = 'a +type ('a : any) bar + +let f (x : < foo : ('a : float64) . 'a foo bar >) + : < foo : 'a . 'a foo bar > = x + +[%%expect{| +type ('a : any) foo = 'a +type ('a : any) bar +Line 5, characters 32-33: +5 | : < foo : 'a . 'a foo bar > = x + ^ +Error: This expression has type < foo : ('a : float64). 'a foo bar > + but an expression was expected of type < foo : 'a. 'a foo bar > + Type 'a foo = 'a is not compatible with type 'a0 foo = 'a0 + Types for method foo are incompatible +|}] + +(*************************************************************) +(* Test 39: Inference of functions that don't bind arguments *) + +let rec f () : 'a -> 'a = f () + +[%%expect{| +val f : ('a : any). unit -> 'a -> 'a = +|}] + +module M = struct + let rec f () : 'a -> 'a = f () +end + +[%%expect{| +module M : sig val f : ('a : any). unit -> 'a -> 'a end +|}] + +let rec f () : 'a -> 'a = f () +let g : ('a : any). unit -> 'a -> 'a = f + +[%%expect{| +val f : ('a : any). unit -> 'a -> 'a = +val g : ('a : any). unit -> 'a -> 'a = +|}] + +module M : sig + val f : ('a : any). unit -> 'a -> 'a +end = struct + let rec f () : 'a -> 'a = f () +end + +[%%expect{| +module M : sig val f : ('a : any). unit -> 'a -> 'a end +|}] + +let rec f : ('a : any). unit -> 'a -> 'a = fun () -> f () + +[%%expect{| +val f : ('a : any). unit -> 'a -> 'a = +|}] + +(****************************************************************) +(* Test 40: unannotated type parameter defaults to layout value *) + +type 'a t40 = 'a +let f40 (x: t_float64): 'a t40 = x + +[%%expect{| +type 'a t40 = 'a +Line 2, characters 33-34: +2 | let f40 (x: t_float64): 'a t40 = x + ^ +Error: This expression has type t_float64 + but an expression was expected of type 'a t40 = ('a : value) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because of the definition of t40 at line 1, characters 0-16. +|}] + +(**********************************************************************) +(* Test 41: constraints in manifests in mutually recursive typedecls. *) + +(* This example must be rejected. *) +type t1 = string t2 as (_ : immediate) +and 'a t2 = 'a + +[%%expect{| +Line 2, characters 0-14: +2 | and 'a t2 = 'a + ^^^^^^^^^^^^^^ +Error: + The kind of 'a t2 is value + because it instantiates an unannotated type parameter of t2, + defaulted to kind value. + But the kind of 'a t2 must be a subkind of immediate + because of the annotation on the wildcard _ at line 1, characters 28-37. +|}] + +(* This example is unfortunately rejected as a consequence of the fix for the + above in typedecl. If we ever change that so that the below starts working, + make sure [t1]'s parameter is immediate! Previously this was allowed and t1's + parameter was just value (a bug). *) +type 'a t1 = 'a t2 as (_ : immediate) +and 'a t2 = 'a + +[%%expect{| +Line 2, characters 0-14: +2 | and 'a t2 = 'a + ^^^^^^^^^^^^^^ +Error: + The kind of 'a t2 is value + because it instantiates an unannotated type parameter of t2, + defaulted to kind value. + But the kind of 'a t2 must be a subkind of immediate + because of the annotation on the wildcard _ at line 1, characters 27-36. +|}] + +(* This one also unfortunately rejected for the same reason. *) +type t1 = int t2 as (_ : immediate) +and 'a t2 = 'a + +[%%expect{| +Line 2, characters 0-14: +2 | and 'a t2 = 'a + ^^^^^^^^^^^^^^ +Error: + The kind of 'a t2 is value + because it instantiates an unannotated type parameter of t2, + defaulted to kind value. + But the kind of 'a t2 must be a subkind of immediate + because of the annotation on the wildcard _ at line 1, characters 25-34. +|}] + +(**********************************************************************) +(* Test 42: Externals for built-in primitives have some safety checks *) + +(* oops the argument/return got swapped *) +external f : float# -> float = "%unbox_float";; +[%%expect{| +Line 1, characters 13-28: +1 | external f : float# -> float = "%unbox_float";; + ^^^^^^^^^^^^^^^ +Error: The primitive [%unbox_float] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +(* using the wrong primitive *) +external f : ('a : bits64). 'a -> int64 = "%box_int32";; +[%%expect{| +Line 1, characters 13-39: +1 | external f : ('a : bits64). 'a -> int64 = "%box_int32";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The primitive [%box_int32] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +(* can't use primitives for jkind conversions *) +external f : float# -> int32# = "%identity";; +[%%expect{| +Line 1, characters 13-29: +1 | external f : float# -> int32# = "%identity";; + ^^^^^^^^^^^^^^^^ +Error: The primitive [%identity] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +external f : float# -> int32# = "%opaque";; +[%%expect{| +Line 1, characters 13-29: +1 | external f : float# -> int32# = "%opaque";; + ^^^^^^^^^^^^^^^^ +Error: The primitive [%opaque] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +external f : float# -> int32# = "%obj_magic";; +[%%expect{| +Line 1, characters 13-29: +1 | external f : float# -> int32# = "%obj_magic";; + ^^^^^^^^^^^^^^^^ +Error: The primitive [%obj_magic] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +(* not smart enough to stop this + but the middle end should error in this case *) +external f : (float# -> int32#) -> int32# -> int32# = "%apply";; +[%%expect{| +external f : (float# -> int32#) -> int32# -> int32# = "%apply" +|}] + +external f : float# -> int -> int = "%send";; +[%%expect{| +Line 1, characters 13-33: +1 | external f : float# -> int -> int = "%send";; + ^^^^^^^^^^^^^^^^^^^^ +Error: The primitive [%send] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +external f : int -> int -> float# = "%sendself";; +[%%expect{| +Line 1, characters 13-33: +1 | external f : int -> int -> float# = "%sendself";; + ^^^^^^^^^^^^^^^^^^^^ +Error: The primitive [%sendself] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +external f : int -> float# -> int -> int -> int = "%sendcache";; +[%%expect{| +Line 1, characters 13-47: +1 | external f : int -> float# -> int -> int -> int = "%sendcache";; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The primitive [%sendcache] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +(*********************************************************) +(* Test 43: GADT refinement works on layouts as expected *) + +type ('a : any) t_gadt_simple = + | Float64 : ('a : float64) t_gadt_simple + +let f_match_allowed (type a : any) (x : a t_gadt_simple) : int = + match x with + | Float64 -> 1;; +[%%expect{| +type ('a : any) t_gadt_simple = Float64 : ('a : float64). 'a t_gadt_simple +val f_match_allowed : ('a : any). 'a t_gadt_simple -> int = +|}] + +let not_magic (type a : any) (x : a t_gadt_simple) : 'b = + match x with + | _ -> . +[%%expect{| +Line 3, characters 4-5: +3 | | _ -> . + ^ +Error: This match case could not be refuted. + Here is an example of a value that would reach it: Float64 +|}] + +type ('a : any) t = + | UFloat : float# t + | Float : float t + | Int : int t + +let make_pi (type a : any) (x : a t) : unit -> a = + match x with + | UFloat -> fun () -> #3.14 + | Float -> fun () -> 3.14 + | Int -> fun () -> 3;; +[%%expect{| +type ('a : any) t = UFloat : float# t | Float : float t | Int : int t +val make_pi : ('a : any). 'a t -> unit -> 'a = +|}] + +type ('a : any) repr = + | Float64 : ('a : float64) repr + | Value : ('a : value) repr + +let lpoly_id (type a : any) (x : a repr) : a -> a = + match x with + | Float64 -> fun x -> x + | Value -> fun x -> x +[%%expect{| +type ('a : any) repr = Float64 : ('a : float64). 'a repr | Value : 'a repr +val lpoly_id : ('a : any). 'a repr -> 'a -> 'a = +|}] + +type 'a s = 'a + +module M = struct + type t : immediate +end + +module N = struct + type ('a,'b) eq = + | Refl : ('a, 'a) eq + + let f (x : (M.t, 'a s) eq) : int = + match x with + | Refl -> 42 +end +[%%expect{| +type 'a s = 'a +module M : sig type t : immediate end +module N : + sig + type ('a, 'b) eq = Refl : ('a, 'a) eq + val f : (M.t, M.t s) eq -> int + end +|}] + +module N2 = struct + type ('a, 'b) eq = + | Refl : ('a, 'a) eq + + let f (x : (M.t, ('a : immediate) s) eq) : int = + match x with + | Refl -> 42 +end + +[%%expect{| +module N2 : + sig + type ('a, 'b) eq = Refl : ('a, 'a) eq + val f : (M.t, M.t s) eq -> int + end +|}] + +type ('a : immediate) s_imm = 'a + +module N3 = struct + type ('a, 'b) eq = + | Refl : ('a, 'a) eq + + let f (x : (M.t, 'a s_imm) eq) : int = + match x with + | Refl -> 42 +end + +[%%expect{| +type ('a : immediate) s_imm = 'a +module N3 : + sig + type ('a, 'b) eq = Refl : ('a, 'a) eq + val f : (M.t, M.t s_imm) eq -> int + end +|}] + +module M2 = struct + type t : value +end + +module N4 = struct + type ('a, 'b) eq = + | Refl : ('a, 'a) eq + + let f (x : (M2.t, 'a s_imm) eq) : int = + match x with + | Refl -> 42 +end + +(* CR layouts v2.9: This message is rubbish. *) +[%%expect{| +module M2 : sig type t : value end +Line 11, characters 6-10: +11 | | Refl -> 42 + ^^^^ +Error: This pattern matches values of type (M2.t, M2.t) eq + but a pattern was expected which matches values of type + (M2.t, $'a s_imm) eq + Type M2.t is not compatible with type $'a s_imm = $'a + The type constructor $'a would escape its scope +|}] + +module N5 = struct + type ('a : any, 'b : any) eq = + | Refl : ('a : any). ('a, 'a) eq + + let f (x : (M2.t, ('a : bits64)) eq) : int = + match x with + | Refl -> 42 +end + +(* CR layouts v2.9: This message is rubbish. *) +[%%expect{| +Line 7, characters 6-10: +7 | | Refl -> 42 + ^^^^ +Error: This pattern matches values of type (M2.t, M2.t) eq + but a pattern was expected which matches values of type (M2.t, $'a) eq + The type constructor $'a would escape its scope +|}] + +module M2 = struct + type 'a t : immediate +end + +module N6 = struct + type ('a,'b) eq = + | Refl : ('a, 'a) eq + + let f (x : (_ M2.t, 'a s) eq) : int = + match x with + | Refl -> 42 +end + +[%%expect{| +module M2 : sig type 'a t : immediate end +module N6 : + sig + type ('a, 'b) eq = Refl : ('a, 'a) eq + val f : ('a M2.t, 'a M2.t s) eq -> int + end +|}] + +type ('a : any) is_value = + | V : ('a : value) is_value + +module A : sig + type 'a t : any + + val is_value : 'a t is_value +end = struct + type 'a t = int + + let is_value = V +end + +let magic (type a) (x : a A.t is_value) : 'b = + match x with + | _ -> . + +let not_so_good : 'b = magic A.is_value + +[%%expect{| +type ('a : any) is_value = V : 'a is_value +module A : sig type 'a t : any val is_value : 'a t is_value end +Line 16, characters 4-5: +16 | | _ -> . + ^ +Error: This match case could not be refuted. + Here is an example of a value that would reach it: V +|}] + +type ('a : any) is_value = + | V : ('a : value) is_value + +type t : float64 + +let refute (x : t is_value) = + match x with + | _ -> . + +[%%expect{| +type ('a : any) is_value = V : 'a is_value +type t : float64 +val refute : t is_value -> 'a = +|}] + +type ('a : any) is_value = + | V : ('a : value) is_value + +type 'a t : float64 + +let refute (x : 'a t is_value) = + match x with + | _ -> . + +[%%expect{| +type ('a : any) is_value = V : 'a is_value +type 'a t : float64 +val refute : 'a t is_value -> 'b = +|}] + +(***********************************) +(* Test 44: Kind-checking in mcomp *) + +type (!'a : any) inj + +module type S = sig + type 'a value : value + type 'a bits64 : bits64 +end + +type ('a : any) s = 'a + +(* These all have to use polymorphic variants to avoid getting handled + by special cases in unification: we're trying to trigger the call to + [mcomp_for] in [unify3_var]. *) +module F (X : S) = struct + let f1 : ([ `K of 'a X.bits64 inj ], [ `K of 'a X.value inj ]) eq -> _ = + function _ -> . + let f2 : ([ `K of 'a X.bits64 inj ], [ `K of (int -> int) inj ]) eq -> _ = + function _ -> . + let f3 : ([ `K of 'a X.bits64 inj ], [ `K of ('b : value) inj ]) eq -> _ = + function _ -> . + let f4 : ([ `K of ('b : value) inj ], [ `K of 'a X.bits64 inj ]) eq -> _ = + function _ -> . + let f5 : ([ `K of 'a X.bits64 s inj ], [ `K of ('b : value) s inj ]) eq -> _ = + function _ -> . + let f6 : ([ `K of ('b : value) s inj ], [ `K of 'a X.bits64 s inj ]) eq -> _ = + function _ -> . +end + +[%%expect{| +type (!'a : any) inj +module type S = sig type 'a value : value type 'a bits64 : bits64 end +type ('a : any) s = 'a +module F : + functor (X : S) -> + sig + val f1 : ([ `K of 'a X.bits64 inj ], [ `K of 'a X.value inj ]) eq -> 'b + val f2 : + ([ `K of 'a X.bits64 inj ], [ `K of (int -> int) inj ]) eq -> 'b + val f3 : ([ `K of 'a X.bits64 inj ], [ `K of 'b inj ]) eq -> 'c + val f4 : ([ `K of 'b inj ], [ `K of 'a X.bits64 inj ]) eq -> 'c + val f5 : ([ `K of 'a X.bits64 s inj ], [ `K of 'b s inj ]) eq -> 'c + val f6 : ([ `K of 'b s inj ], [ `K of 'a X.bits64 s inj ]) eq -> 'c + end +|}] + +(* This naturally doesn't work if the type isn't injective *) +type ('a : any) not_inj + +module F (X : S) = struct + let f1 : ([ `K of 'a X.bits64 not_inj ], [ `K of 'a X.value not_inj ]) eq -> _ = + function _ -> . +end + +[%%expect{| +type ('a : any) not_inj +Line 5, characters 13-14: +5 | function _ -> . + ^ +Error: This match case could not be refuted. + Here is an example of a value that would reach it: Refl +|}] diff --git a/testsuite/tests/typing-layouts/basics_alpha.ml b/testsuite/tests/typing-layouts/basics_alpha.ml index 0378d54be22..d33ad163e5d 100644 --- a/testsuite/tests/typing-layouts/basics_alpha.ml +++ b/testsuite/tests/typing-layouts/basics_alpha.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension layouts_alpha" - * expect + flags = "-extension layouts_alpha"; + expect; *) type t_any : any @@ -9,6 +9,8 @@ type t_imm : immediate type t_imm64 : immediate64 type t_float64 : float64 type t_void : void +type t_any_non_null : any_non_null;; +type t_value_or_null : value_or_null;; type void_variant = VV of t_void type void_record = {vr_void : t_void; vr_int : int} @@ -21,35 +23,47 @@ type t_imm : immediate type t_imm64 : immediate64 type t_float64 : float64 type t_void : void +type t_any_non_null : any_non_null +type t_value_or_null : value_or_null type void_variant = VV of t_void type void_record = { vr_void : t_void; vr_int : int; } type void_unboxed_record = { vur_void : t_void; } [@@unboxed] |}];; -(************************************************************) -(* Test 1: Disallow non-representable function args/returns *) +(******************************************************************) +(* Test 1: Allow non-representable function args/returns in types *) module type S1 = sig val f : int -> t_any end;; [%%expect {| -Line 2, characters 17-22: -2 | val f : int -> t_any - ^^^^^ -Error: Function return types must have a representable layout. - t_any has layout any, which is not representable. +module type S1 = sig val f : int -> t_any end |}];; module type S1 = sig val f : t_any -> int end;; [%%expect {| -Line 2, characters 10-15: -2 | val f : t_any -> int - ^^^^^ -Error: Function argument types must have a representable layout. - t_any has layout any, which is not representable. +module type S1 = sig val f : t_any -> int end |}];; +module type S1 = sig + type t : any + + type ('a : any) s = 'a -> int constraint 'a = t +end;; +[%%expect{| +module type S1 = sig type t : any type 'a s = 'a -> int constraint 'a = t end +|}] + +module type S1 = sig + type t : any + + type ('a : any) s = int -> 'a constraint 'a = t +end;; +[%%expect{| +module type S1 = sig type t : any type 'a s = int -> 'a constraint 'a = t end +|}] + module type S1 = sig type t : any @@ -61,7 +75,10 @@ Line 4, characters 35-41: ^^^^^^ Error: The type constraints are not consistent. Type ('a : '_representable_layout_1) is not compatible with type t - t has layout any, which is not representable. + The layout of t is any + because of the definition of t at line 2, characters 2-14. + But the layout of t must be representable + because it instantiates an unannotated type parameter of s. |}] module type S1 = sig @@ -75,7 +92,10 @@ Line 4, characters 35-41: ^^^^^^ Error: The type constraints are not consistent. Type ('a : '_representable_layout_2) is not compatible with type t - t has layout any, which is not representable. + The layout of t is any + because of the definition of t at line 2, characters 2-14. + But the layout of t must be representable + because it instantiates an unannotated type parameter of s. |}] let f1 () : t_any = assert false;; @@ -85,7 +105,10 @@ Line 1, characters 20-32: ^^^^^^^^^^^^ Error: This expression has type t_any but an expression was expected of type ('a : '_representable_layout_3) - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of t_any must be representable + because we must know concretely how to return a function result. |}];; let f1 (x : t_any) = ();; @@ -96,7 +119,10 @@ Line 1, characters 7-18: Error: This pattern matches values of type t_any but a pattern was expected which matches values of type ('a : '_representable_layout_4) - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of t_any must be representable + because we must know concretely how to pass a function argument. |}];; (*****************************************************) @@ -174,7 +200,10 @@ Line 1, characters 27-33: 1 | module F2 (X : sig val x : t_void end) = struct ^^^^^^ Error: This type signature for x is not a value type. - x has layout void, which is not a sublayout of value. + The layout of type t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of type t_void must be a sublayout of value + because it's the type of something stored in a module structure. |}];; (* CR layouts v5: the test above should be made to work *) @@ -182,11 +211,15 @@ module F2 (X : sig val f : void_record -> unit end) = struct let g z = X.f { vr_void = z; vr_int = 42 } end;; [%%expect{| -Line 2, characters 8-44: +Line 2, characters 16-44: 2 | let g z = X.f { vr_void = z; vr_int = 42 } - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Non-value layout void detected in [Typeopt.layout] as sort for type - t_void. Please report this error to the Jane Street compilers team. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Non-value detected in [value_kind]. + Please report this error to the Jane Street compilers team. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}];; (**************************************) @@ -213,7 +246,10 @@ Line 1, characters 19-25: 1 | let string_id (x : string imm_id) = x;; ^^^^^^ Error: This type string should be an instance of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of imm_id at line 1, characters 0-33. |}];; let id_for_imms (x : 'a imm_id) = x @@ -233,7 +269,10 @@ Line 1, characters 33-46: ^^^^^^^^^^^^^ Error: This expression has type string but an expression was expected of type 'a imm_id = ('a : immediate) - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of id_for_imms at line 1, characters 16-35. |}] (************************************) @@ -246,7 +285,10 @@ Line 2, characters 9-15: 2 | and s4 = string t4;; ^^^^^^ Error: This type string should be an instance of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the annotation on 'a in the declaration of the type t4. |}];; type s4 = string t4 @@ -257,7 +299,10 @@ Line 1, characters 10-16: 1 | type s4 = string t4 ^^^^^^ Error: This type string should be an instance of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the annotation on 'a in the declaration of the type t4. |}] type s4 = int t4 @@ -287,9 +332,11 @@ Line 3, characters 0-15: 3 | and s5 = string;; ^^^^^^^^^^^^^^^ Error: - s5 has layout value, which is not a sublayout of immediate. + The kind of s5 is value + because it is the primitive value type string. + But the kind of s5 must be a subkind of immediate + because of the annotation on 'a in the declaration of the type t4. |}] -(* CR layouts v2.9: improve error, which will require jkind histories *) type ('a : any) t4 = 'a and s4 = string t4;; @@ -312,7 +359,6 @@ and ('a : any) t4 moved to [basics_beta.ml]. *) type ('a : void) void5 = Void5 of 'a -type ('a : any) any5 = Any5 of 'a let id5 : 'a void5 -> 'a void5 = function | Void5 x -> Void5 x @@ -334,13 +380,15 @@ let id5 : 'a void5 -> 'a void5 = function [%%expect{| type ('a : void) void5 = Void5 of 'a -type 'a any5 = Any5 of 'a -Lines 4-5, characters 33-22: -4 | .................................function -5 | | Void5 x -> Void5 x +Lines 3-4, characters 33-22: +3 | .................................function +4 | | Void5 x -> Void5 x Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - 'a has layout void, which is not a sublayout of value. + The layout of 'a is void + because of the definition of void5 at line 1, characters 0-37. + But the layout of 'a must be a sublayout of value + because it has to be value for the V1 safety check. |}];; (* disallowed attempts to use f5 and Void5 on non-voids *) @@ -350,17 +398,23 @@ Line 1, characters 12-15: 1 | let h5 (x : int void5) = f5 x ^^^ Error: This type int should be an instance of type ('a : void) - int has layout immediate, which is not a sublayout of void. + The layout of int is value + because it is the primitive immediate type int. + But the layout of int must be a sublayout of void + because of the definition of void5 at line 1, characters 0-37. |}];; -let h5' (x : int any5) = Void5 x +let h5' (x : int) = Void5 x [%%expect{| -Line 1, characters 31-32: -1 | let h5' (x : int any5) = Void5 x - ^ -Error: This expression has type int any5 - but an expression was expected of type ('a : void) - int any5 has layout value, which is not a sublayout of void. +Line 1, characters 26-27: +1 | let h5' (x : int) = Void5 x + ^ +Error: This expression has type int but an expression was expected of type + ('a : void) + The layout of int is value + because it is the primitive immediate type int. + But the layout of int must be a sublayout of void + because of the definition of void5 at line 1, characters 0-37. |}];; (* disallowed - tries to return void *) @@ -368,13 +422,11 @@ let g (x : 'a void5) = match x with | Void5 x -> x;; [%%expect{| -Lines 1-3, characters 6-16: -1 | ......(x : 'a void5) = -2 | match x with +Lines 2-3, characters 2-16: +2 | ..match x with 3 | | Void5 x -> x.. -Error: Non-value detected in [value_kind]. - Please report this error to the Jane Street compilers team. - 'a has layout void, which is not a sublayout of value. +Error: Non-value layout void detected in [Typeopt.layout] as sort for type + 'a. Please report this error to the Jane Street compilers team. |}] (****************************************) @@ -400,7 +452,10 @@ Line 2, characters 2-32: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This definition has type 'b -> unit which is less general than 'a. 'a -> unit - 'a has layout value, which is not a sublayout of immediate. + The kind of 'a is value + because it is or unifies with an unannotated universal variable. + But the kind of 'a must be a subkind of immediate + because of the definition of t6_imm at line 1, characters 0-42. |}];; let o6 = object @@ -413,7 +468,10 @@ Line 3, characters 4-34: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This method has type 'b -> unit which is less general than 'a. 'a -> unit - 'a has layout value, which is not a sublayout of immediate. + The kind of 'a is value + because it is or unifies with an unannotated universal variable. + But the kind of 'a must be a subkind of immediate + because of the definition of t6_imm at line 1, characters 0-42. |}];; (* CR layouts v1.5: add more tests here once you can annotate these types with @@ -432,7 +490,10 @@ Line 3, characters 12-21: 3 | type t7' = (int * int) t7;; ^^^^^^^^^ Error: This type int * int should be an instance of type ('a : immediate) - int * int has layout value, which is not a sublayout of immediate. + The kind of int * int is value + because it's a tuple type. + But the kind of int * int must be a subkind of immediate + because of the definition of t7 at line 1, characters 0-37. |}] (**********************************************************) @@ -448,7 +509,10 @@ Line 2, characters 40-46: 2 | type foo1 = [ `Foo1 of int | `Baz1 of t_void | `Bar1 of string ];; ^^^^^^ Error: Polymorphic variant constructor argument types must have layout value. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of the field of a polymorphic variant. |}];; module M8_2 = struct @@ -478,7 +542,10 @@ Line 4, characters 13-19: 4 | type bad = t_void t ^^^^^^ Error: This type t_void should be an instance of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because of the definition of t at line 2, characters 2-42. |}];; module M8_4 = struct @@ -490,8 +557,11 @@ Line 2, characters 54-78: ^^^^^^^^^^^^^^^^^^^^^^^^ Error: The type constraints are not consistent. Type ('a : value) is not compatible with type void_unboxed_record - void_unboxed_record has layout void, - which is not a sublayout of value. + The layout of void_unboxed_record is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of void_unboxed_record must be a sublayout of value + because it instantiates an unannotated type parameter of t, + defaulted to layout value. |}];; module type S8_5 = sig @@ -502,7 +572,10 @@ Line 2, characters 17-23: 2 | val x : [`A of t_void] ^^^^^^ Error: Polymorphic variant constructor argument types must have layout value. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of the field of a polymorphic variant. |}] (************************************************) @@ -517,7 +590,10 @@ Line 2, characters 20-26: 2 | type foo1 = int * t_void * [ `Foo1 of int | `Bar1 of string ];; ^^^^^^ Error: Tuple element types must have layout value. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of a tuple element. |}];; module M9_2 = struct @@ -528,8 +604,10 @@ Line 2, characters 31-50: 2 | type result = V of (string * void_unboxed_record) | I of int ^^^^^^^^^^^^^^^^^^^ Error: Tuple element types must have layout value. - void_unboxed_record has layout void, - which is not a sublayout of value. + The layout of void_unboxed_record is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of void_unboxed_record must be a sublayout of value + because it's the type of a tuple element. |}];; module M9_3 = struct @@ -545,9 +623,11 @@ Line 7, characters 13-14: 7 | | V t -> t, 27 ^ Error: This expression has type void_unboxed_record - but an expression was expected of type ('a : value) - void_unboxed_record has layout void, - which is not a sublayout of value. + but an expression was expected of type ('a : value_or_null) + The layout of void_unboxed_record is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of void_unboxed_record must be a sublayout of value + because it's the type of a tuple element. |}];; module M9_4 = struct @@ -561,8 +641,10 @@ Line 4, characters 8-16: ^^^^^^^^ Error: The record field vur_void belongs to the type void_unboxed_record but is mixed here with fields of type ('a : value) - void_unboxed_record has layout void, - which is not a sublayout of value. + The layout of void_unboxed_record is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of void_unboxed_record must be a sublayout of value + because it's a boxed record type. |}];; module M9_5 = struct @@ -575,7 +657,10 @@ Line 4, characters 13-19: 4 | type bad = t_void t ^^^^^^ Error: This type t_void should be an instance of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because of the definition of t at line 2, characters 2-24. |}];; module M9_6 = struct @@ -587,8 +672,11 @@ Line 2, characters 34-58: ^^^^^^^^^^^^^^^^^^^^^^^^ Error: The type constraints are not consistent. Type ('a : value) is not compatible with type void_unboxed_record - void_unboxed_record has layout void, - which is not a sublayout of value. + The layout of void_unboxed_record is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of void_unboxed_record must be a sublayout of value + because it instantiates an unannotated type parameter of t, + defaulted to layout value. |}];; module type S9_7 = sig @@ -599,7 +687,10 @@ Line 2, characters 16-22: 2 | val x : int * t_void ^^^^^^ Error: Tuple element types must have layout value. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of a tuple element. |}];; module M9_9 (X : sig @@ -614,8 +705,11 @@ Line 5, characters 11-23: 5 | match 3, X.vr.vr_void with ^^^^^^^^^^^^ Error: This expression has type t_void but an expression was expected of type - ('a : value) - t_void has layout void, which is not a sublayout of value. + ('a : value_or_null) + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of a tuple element. |}];; (*************************************************) @@ -655,7 +749,10 @@ Error: Signature mismatch: is not included in val x : string The type ('a : immediate) is not compatible with the type string - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of x at line 8, characters 10-26. |}];; (* This hits the second linktype in moregen (requires expansion to see it's a @@ -693,7 +790,10 @@ Error: Signature mismatch: val x : string The type 'a t = ('a : immediate) is not compatible with the type string - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of x at line 8, characters 10-26. |}] (**************************************************************) @@ -708,8 +808,11 @@ end;; Line 5, characters 4-7: 5 | t.v # baz11 ^^^ -Error: Method types must have layout value. - This expression has layout void, which does not overlap with value. +Error: Object types must have layout value. + The layout of the type of this expression is void + because of the definition of t at line 2, characters 2-42. + But the layout of the type of this expression must overlap with value + because it's the type of an object. |}] module M11_2 = struct @@ -721,7 +824,10 @@ Line 2, characters 17-30: ^^^^^^^^^^^^^ Error: This expression has type ('a : value) but an expression was expected of type t_void - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of an object field. |}];; module M11_3 = struct @@ -730,12 +836,11 @@ module M11_3 = struct let foo o (A x) = o # usevoid x end;; [%%expect{| -Line 4, characters 12-33: +Line 4, characters 32-33: 4 | let foo o (A x) = o # usevoid x - ^^^^^^^^^^^^^^^^^^^^^ -Error: Non-value detected in [value_kind]. - Please report this error to the Jane Street compilers team. - 'a has layout void, which is not a sublayout of value. + ^ +Error: Non-value layout void detected in [Typeopt.layout] as sort for type + 'a. Please report this error to the Jane Street compilers team. |}];; module M11_4 = struct @@ -746,7 +851,10 @@ Line 2, characters 12-22: 2 | val x : < l : t_void > ^^^^^^^^^^ Error: Object field types must have layout value. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of an object field. |}];; module M11_5 = struct @@ -758,7 +866,10 @@ Line 3, characters 2-24: 3 | and ('a : void) s = 'a ^^^^^^^^^^^^^^^^^^^^^^ Error: - 'a s has layout void, which does not overlap with value. + The layout of 'a s is void + because of the annotation on 'a in the declaration of the type s. + But the layout of 'a s must be a sublayout of value + because it's the type of an object field. |}];; module M11_6 = struct @@ -770,7 +881,10 @@ Line 2, characters 36-47: ^^^^^^^^^^^ Error: The type constraints are not consistent. Type ('a : value) is not compatible with type t_void - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of an object field. |}];; (*******************************************************************) @@ -804,7 +918,10 @@ Line 4, characters 10-13: 4 | val bar = v.vr_void ^^^ Error: Variables bound in a class must have layout value. - bar has layout void, which is not a sublayout of value. + The layout of bar is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of bar must be a sublayout of value + because it's the type of a class field. |}];; (* Hits the Cfk_virtual case of Pcf_val *) @@ -819,7 +936,10 @@ Line 4, characters 18-21: 4 | val virtual bar : t_void ^^^ Error: Variables bound in a class must have layout value. - bar has layout void, which is not a sublayout of value. + The layout of bar is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of bar must be a sublayout of value + because it's the type of a class field. |}];; module M12_4 = struct @@ -835,7 +955,10 @@ Line 6, characters 24-26: 6 | val virtual baz : 'a t ^^ Error: This type ('a : void) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with void. + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with void + because of the definition of t at line 2, characters 2-20. |}];; module M12_5 = struct @@ -851,7 +974,10 @@ Line 6, characters 29-31: 6 | method void_id (A a) : 'a t = a ^^ Error: This type ('a : void) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with void. + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with void + because of the definition of t at line 2, characters 2-30. |}];; module type S12_6 = sig @@ -868,7 +994,10 @@ Line 5, characters 4-6: 5 | 'a t -> ^^ Error: This type ('a : void) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with void. + The layout of 'a is value + because it's a type argument to a class constructor. + But the layout of 'a must overlap with void + because of the definition of t at line 2, characters 2-30. |}];; module type S12_7 = sig @@ -882,11 +1011,14 @@ Line 4, characters 6-22: 4 | val baz : t_void ^^^^^^^^^^^^^^^^ Error: Variables bound in a class must have layout value. - baz has layout void, which is not a sublayout of value. + The layout of baz is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of baz must be a sublayout of value + because it's the type of an instance variable. |}];; -(***********************************************************) -(* Test 13: built-in type constructors work only on values *) +(*************************************************************************) +(* Test 13: built-in type constructors and support for non-value layouts *) (* lazy *) type t13 = t_void Lazy.t;; @@ -895,7 +1027,10 @@ Line 1, characters 11-17: 1 | type t13 = t_void Lazy.t;; ^^^^^^ Error: This type t_void should be an instance of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of Lazy.t has this layout. |}];; let x13 (VV v) = lazy v;; @@ -905,7 +1040,10 @@ Line 1, characters 22-23: ^ Error: This expression has type t_void but an expression was expected of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of a lazy expression. |}];; let x13 v = @@ -917,7 +1055,10 @@ Line 3, characters 17-18: ^ Error: This expression has type ('a : value) but an expression was expected of type t_void - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it's the type of a lazy expression. |}];; (* option *) @@ -928,7 +1069,10 @@ Line 1, characters 11-17: 1 | type t13 = t_void option;; ^^^^^^ Error: This type t_void should be an instance of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of option has layout value. |}];; let x13 (VV v) = Some v;; @@ -938,7 +1082,10 @@ Line 1, characters 22-23: ^ Error: This expression has type t_void but an expression was expected of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of option has layout value. |}];; let x13 v = @@ -951,7 +1098,10 @@ Line 3, characters 17-18: ^ Error: This expression has type ('a : value) but an expression was expected of type t_void - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of option has layout value. |}];; (* list *) @@ -962,7 +1112,10 @@ Line 1, characters 11-17: 1 | type t13 = t_void list;; ^^^^^^ Error: This type t_void should be an instance of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of list has layout value. |}];; let x13 (VV v) = [v];; @@ -972,7 +1125,10 @@ Line 1, characters 18-19: ^ Error: This expression has type t_void but an expression was expected of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of list has layout value. |}];; let x13 v = @@ -985,28 +1141,25 @@ Line 3, characters 14-15: ^ Error: This expression has type ('a : value) but an expression was expected of type t_void - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because the type argument of list has layout value. |}];; (* array *) (* CR layouts v4: should work *) type t13 = t_void array;; [%%expect{| -Line 1, characters 11-17: -1 | type t13 = t_void array;; - ^^^^^^ -Error: This type t_void should be an instance of type ('a : value) - t_void has layout void, which is not a sublayout of value. +type t13 = t_void array |}];; let x13 (VV v) = [| v |];; [%%expect{| -Line 1, characters 20-21: +Line 1, characters 17-24: 1 | let x13 (VV v) = [| v |];; - ^ -Error: This expression has type t_void but an expression was expected of type - ('a : value) - t_void has layout void, which is not a sublayout of value. + ^^^^^^^ +Error: Layout void is not supported yet. |}];; let x13 v = @@ -1014,12 +1167,16 @@ let x13 v = | [| v |] -> VV v | _ -> assert false [%%expect{| -Line 3, characters 18-19: +Lines 2-4, characters 2-21: +2 | ..match v with 3 | | [| v |] -> VV v - ^ -Error: This expression has type ('a : value) - but an expression was expected of type t_void - t_void has layout void, which is not a sublayout of value. +4 | | _ -> assert false +Error: Non-value detected in [value_kind]. + Please report this error to the Jane Street compilers team. + The layout of t_void is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}];; (****************************************************************************) @@ -1038,7 +1195,10 @@ Line 2, characters 0-18: 2 | and foo14 = t_void;; ^^^^^^^^^^^^^^^^^^ Error: - foo14 has layout void, which is not a sublayout of value. + The layout of foo14 is void + because of the definition of t_void at line 6, characters 0-19. + But the layout of foo14 must be a sublayout of value + because the type argument of list has layout value. |}];; (****************************************************) @@ -1154,19 +1314,21 @@ let f () = [%%expect{| type t_void : void type ('a : void) r = { x : int; y : 'a; } -Lines 5-7, characters 6-20: -5 | ......() = -6 | let rec g { x = x ; y = y } : _ r = g { x; y } in +Lines 6-7, characters 2-20: +6 | ..let rec g { x = x ; y = y } : _ r = g { x; y } in 7 | g (failwith "foo").. Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - 'a has layout void, which is not a sublayout of value. + The layout of 'a is void + because of the definition of r at line 3, characters 0-40. + But the layout of 'a must be a sublayout of value + because it has to be value for the V1 safety check. |}];; (********************************************************************) (* Test 23: checking the error message from impossible GADT matches *) -type (_ : any, _ : any) eq = Refl : ('a, 'a) eq +type (_ : any, _ : any) eq = Refl : ('a : any). ('a, 'a) eq module M : sig type t_void : void @@ -1191,11 +1353,11 @@ Line 15, characters 4-8: Error: This pattern matches values of type (M.t_void, M.t_void) eq but a pattern was expected which matches values of type (M.t_void, M.t_imm) eq - M.t_void has layout void, which does not overlap with immediate. + The layout of M.t_void is void + because of the definition of t_void at line 4, characters 2-20. + But the layout of M.t_void must overlap with value + because of the definition of t_imm at line 5, characters 2-24. |}] -(* CR layouts v2.9: error message is OK, but it could probably be better. - But a similar case without jkinds is already pretty bad, so try - that before spending too much time here. *) (*****************************************************) (* Test 24: Polymorphic parameter with exotic layout *) @@ -1206,11 +1368,11 @@ let f (x : 'a. 'a t2_void) = x [%%expect{| type 'a t2_void : void -Line 3, characters 6-30: +Line 3, characters 29-30: 3 | let f (x : 'a. 'a t2_void) = x - ^^^^^^^^^^^^^^^^^^^^^^^^ + ^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type - 'a. 'a t2_void. + 'a t2_void. Please report this error to the Jane Street compilers team. |}] @@ -1227,7 +1389,10 @@ Line 2, characters 15-16: ^ Error: This expression has type t_void but an expression was expected of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because the type argument of option has layout value. |}] (*********************************************************) @@ -1236,9 +1401,9 @@ Error: This expression has type t_void but an expression was expected of type let g f (x : t_void) : t_void = f x [%%expect{| -Line 1, characters 8-35: +Line 1, characters 32-35: 1 | let g f (x : t_void) : t_void = f x - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1249,9 +1414,9 @@ Error: Non-value layout void detected in [Typeopt.layout] as sort for type let rec f : _ -> _ = fun (x : t_void) -> x [%%expect{| -Line 1, characters 21-42: +Line 1, characters 41-42: 1 | let rec f : _ -> _ = fun (x : t_void) -> x - ^^^^^^^^^^^^^^^^^^^^^ + ^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1271,9 +1436,9 @@ and q () = () [%%expect{| -Line 1, characters 17-36: +Line 1, characters 17-29: 1 | let rec ( let* ) (x : t_void) f = () - ^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1285,7 +1450,7 @@ let q () = () [%%expect{| -val ( let* ) : t_float64 -> 'a -> unit = +val ( let* ) : ('a : value_or_null). t_float64 -> 'a -> unit = val q : unit -> unit = |}] @@ -1297,9 +1462,9 @@ and q () = () [%%expect{| -Lines 4-5, characters 2-4: -4 | ..let* x = assert false in -5 | () +Line 4, characters 7-8: +4 | let* x = assert false in + ^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1311,7 +1476,8 @@ let q () = () [%%expect{| -val ( let* ) : 'a -> (t_float64 -> 'b) -> unit = +val ( let* ) : + ('a : value_or_null) ('b : any). 'a -> (t_float64 -> 'b) -> unit = val q : unit -> unit = |}] @@ -1337,7 +1503,8 @@ let q () = assert false [%%expect{| -val ( let* ) : 'a -> ('b -> t_float64) -> unit = +val ( let* ) : + ('a : value_or_null) ('b : any). 'a -> ('b -> t_float64) -> unit = val q : unit -> unit = |}] @@ -1349,9 +1516,9 @@ and q () = () [%%expect{| -Line 1, characters 19-44: +Line 1, characters 32-44: 1 | let rec ( let* ) x f : t_void = assert false - ^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1363,7 +1530,8 @@ let q () = () [%%expect{| -val ( let* ) : 'a -> 'b -> t_float64 = +val ( let* ) : + ('a : value_or_null) ('b : value_or_null). 'a -> 'b -> t_float64 = val q : unit -> t_float64 = |}] @@ -1377,9 +1545,9 @@ and q () = () [%%expect{| -Line 2, characters 16-34: +Line 2, characters 16-29: 2 | and ( and* ) x1 (x2 : t_void) = () - ^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1393,8 +1561,9 @@ let q () = () [%%expect{| -val ( let* ) : 'a -> 'b -> unit = -val ( and* ) : 'a -> t_float64 -> unit = +val ( let* ) : ('a : value_or_null) ('b : value_or_null). 'a -> 'b -> unit = + +val ( and* ) : ('a : value_or_null). 'a -> t_float64 -> unit = val q : unit -> unit = |}] @@ -1408,9 +1577,9 @@ and q () = () [%%expect{| -Line 2, characters 13-34: +Line 2, characters 13-26: 2 | and ( and* ) (x1 : t_void) x2 = () - ^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1424,8 +1593,9 @@ let q () = () [%%expect{| -val ( let* ) : 'a -> 'b -> unit = -val ( and* ) : t_float64 -> 'a -> unit = +val ( let* ) : ('a : value_or_null) ('b : value_or_null). 'a -> 'b -> unit = + +val ( and* ) : ('a : value_or_null). t_float64 -> 'a -> unit = val q : unit -> unit = |}] @@ -1439,9 +1609,9 @@ and q () = () [%%expect{| -Line 1, characters 17-25: +Line 1, characters 17-18: 1 | let rec ( let* ) x f = () - ^^^^^^^^ + ^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type t_void. Please report this error to the Jane Street compilers team. |}] @@ -1455,8 +1625,9 @@ let q () = () [%%expect{| -val ( let* ) : 'b ('a : float64). 'a -> 'b -> unit = -val ( and* ) : 'a -> 'b -> t_float64 = +val ( let* ) : ('a : float64) ('b : value_or_null). 'a -> 'b -> unit = +val ( and* ) : + ('a : value_or_null) ('b : value_or_null). 'a -> 'b -> t_float64 = val q : unit -> unit = |}] @@ -1476,8 +1647,12 @@ Line 4, characters 9-19: 4 | let* x : t_void = assert false ^^^^^^^^^^ Error: This pattern matches values of type t_void - but a pattern was expected which matches values of type ('a : value) - t_void has layout void, which is not a sublayout of value. + but a pattern was expected which matches values of type + ('a : value_or_null) + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it's the type of a tuple element. |}] let ( let* ) x f = () @@ -1489,14 +1664,22 @@ let q () = () [%%expect{| -val ( let* ) : 'a -> 'b -> unit = -val ( and* ) : 'a -> 'b -> 'c = +val ( let* ) : ('a : value_or_null) ('b : value_or_null). 'a -> 'b -> unit = + +val ( and* ) : + ('a : value_or_null) ('b : value_or_null) ('c : value_or_null). + 'a -> 'b -> 'c = + Line 4, characters 9-22: 4 | let* x : t_float64 = assert false ^^^^^^^^^^^^^ Error: This pattern matches values of type t_float64 - but a pattern was expected which matches values of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. + but a pattern was expected which matches values of type + ('a : value_or_null) + The layout of t_float64 is float64 + because of the definition of t_float64 at line 5, characters 0-24. + But the layout of t_float64 must be a sublayout of value + because it's the type of a tuple element. |}] @@ -1519,7 +1702,10 @@ Line 4, characters 16-28: ^^^^^^^^^^^^ Error: This expression has type t_void but an expression was expected of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because of the definition of eq at line 2, characters 2-43. |}] (**************************************) @@ -1545,7 +1731,10 @@ Line 8, characters 27-28: ^ Error: This expression has type t_void but an expression was expected of type ('a : value) - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because of the definition of f at line 3, characters 4-20. |}] (**************************************************) @@ -1559,8 +1748,13 @@ let f #poly_var = "hello" Line 1, characters 41-43: 1 | type ('a : void) poly_var = [`A of int * 'a | `B] ^^ -Error: This type ('a : value) should be an instance of type ('a0 : void) - 'a has layout void, which does not overlap with value. +Error: This type ('a : value_or_null) should be an instance of type + ('a0 : void) + The layout of 'a is void + because of the annotation on 'a in the declaration of the type + poly_var. + But the layout of 'a must overlap with value + because it's the type of a tuple element. |}] (* CR layouts bug: this should be accepted (or maybe we should reject @@ -1578,8 +1772,11 @@ Line 1, characters 14-37: 1 | let f _ = `Mk (assert false : t_void) ^^^^^^^^^^^^^^^^^^^^^^^ Error: This expression has type t_void but an expression was expected of type - ('a : value) - t_void has layout void, which is not a sublayout of value. + ('a : value_or_null) + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it's the type of the field of a polymorphic variant. |}] (******************************************************) @@ -1591,7 +1788,10 @@ Line 1, characters 17-22: 1 | external foo33 : t_any = "foo33";; ^^^^^ Error: This type signature for foo33 is not a value type. - foo33 has layout any, which is not a sublayout of value. + The layout of type t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of type t_any must be a sublayout of value + because it's the type of something stored in a module structure. |}] @@ -1612,7 +1812,10 @@ Line 2, characters 19-31: 2 | let f35 : 'a t35 = fun () -> () ^^^^^^^^^^^^ Error: - 'a -> 'b has layout value, which is not a sublayout of immediate. + The kind of 'a -> 'b is value + because it's a function type. + But the kind of 'a -> 'b must be a subkind of immediate + because of the definition of t35 at line 1, characters 0-30. |}] (**************************************************) @@ -1631,7 +1834,10 @@ Line 1, characters 10-22: Error: This expression has type t_any but an expression was expected of type ('a : '_representable_layout_5) because it is in the left-hand side of a sequence - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of t_any must be representable + because it's the type of a statement. |}] let () = while false do (assert false : t_any); done @@ -1647,7 +1853,10 @@ Line 1, characters 25-37: Error: This expression has type t_any but an expression was expected of type ('a : '_representable_layout_6) because it is in the body of a while-loop - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of t_any must be representable + because it's the type of a statement. |}] let () = for i = 0 to 0 do (assert false : t_any); done @@ -1663,5 +1872,35 @@ Line 1, characters 28-40: Error: This expression has type t_any but an expression was expected of type ('a : '_representable_layout_7) because it is in the body of a for-loop - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of t_any must be representable + because it's the type of a statement. |}] + +(******************************************************) +(* Test 37: Ensure signature inclusion checks layouts *) + +(* Doesn't need layouts_alpha. *) + + +(*****************************************************) +(* Test 38: Ensure Univar unification checks layouts *) + +(* Doesn't need layouts_alpha. *) + + +(*************************************************************) +(* Test 39: Inference of functions that don't bind arguments *) + +(* Doesn't need layouts_alpha. *) + +(****************************************************) +(* Test 40: unannotated type parameter defaults to layout value *) + +(* Doesn't need layouts_alpha. *) + +(**********************************************************************) +(* Test 41: constraints in manifests in mutually recursive typedecls. *) + +(* Doesn't need layouts_alpha. *) diff --git a/testsuite/tests/typing-layouts/basics_beta.ml b/testsuite/tests/typing-layouts/basics_beta.ml deleted file mode 100644 index ce604d31260..00000000000 --- a/testsuite/tests/typing-layouts/basics_beta.ml +++ /dev/null @@ -1,1457 +0,0 @@ -(* TEST - flags = "-extension layouts_beta" - * expect -*) - -type t_value : value -type t_imm : immediate -type t_imm64 : immediate64 -type t_float64 : float64;; -type t_any : any;; - -[%%expect{| -type t_value : value -type t_imm : immediate -type t_imm64 : immediate64 -type t_float64 : float64 -type t_any : any -|}] - -type t_void : void;; -[%%expect{| -Line 1, characters 15-19: -1 | type t_void : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}];; - -(************************************************************) -(* Test 1: Disallow non-representable function args/returns *) - -module type S1 = sig - val f : int -> t_any -end;; -[%%expect {| -Line 2, characters 17-22: -2 | val f : int -> t_any - ^^^^^ -Error: Function return types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -module type S1 = sig - val f : t_any -> int -end;; -[%%expect {| -Line 2, characters 10-15: -2 | val f : t_any -> int - ^^^^^ -Error: Function argument types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -module type S1 = sig - type t : any - - type 'a s = 'a -> int constraint 'a = t -end;; -[%%expect{| -Line 4, characters 35-41: -4 | type 'a s = 'a -> int constraint 'a = t - ^^^^^^ -Error: The type constraints are not consistent. - Type ('a : '_representable_layout_1) is not compatible with type t - t has layout any, which is not representable. -|}] - -module type S1 = sig - type t : any - - type 'a s = int -> 'a constraint 'a = t -end;; -[%%expect{| -Line 4, characters 35-41: -4 | type 'a s = int -> 'a constraint 'a = t - ^^^^^^ -Error: The type constraints are not consistent. - Type ('a : '_representable_layout_2) is not compatible with type t - t has layout any, which is not representable. -|}] - -let f1 () : t_any = assert false;; -[%%expect{| -Line 1, characters 20-32: -1 | let f1 () : t_any = assert false;; - ^^^^^^^^^^^^ -Error: This expression has type t_any but an expression was expected of type - ('a : '_representable_layout_3) - t_any has layout any, which is not representable. -|}];; - -let f1 (x : t_any) = ();; -[%%expect{| -Line 1, characters 7-18: -1 | let f1 (x : t_any) = ();; - ^^^^^^^^^^^ -Error: This pattern matches values of type t_any - but a pattern was expected which matches values of type - ('a : '_representable_layout_4) - t_any has layout any, which is not representable. -|}];; - -(*****************************************************) -(* Test 2: Permit representable function arg/returns *) - -(* CR layouts v5: the void bits of this test should be copied here from - basics_alpha *) -module type S = sig - val f1 : t_value -> t_value - val f2 : t_imm -> t_imm64 -end;; - -[%%expect{| -module type S = sig val f1 : t_value -> t_value val f2 : t_imm -> t_imm64 end -|}];; - -module type S2 = sig - val g : float# -> int -end;; -[%%expect{| -module type S2 = sig val g : float# -> int end -|}];; - -module type S2 = sig - val g : int -> float# -end -[%%expect {| -module type S2 = sig val g : int -> float# end -|}];; - -module type S2 = sig - type t' : float64 - type s' = r' -> int - and r' = t' -end;; -[%%expect{| -module type S2 = sig type t' : float64 type s' = r' -> int and r' = t' end -|}] - -module type S2 = sig - val f : int -> t_float64 -end;; -[%%expect {| -module type S2 = sig val f : int -> t_float64 end -|}];; - -module type S = sig - type t' : float64 - type 'a s' = 'a -> int constraint 'a = t' -end;; -[%%expect{| -module type S = - sig type t' : float64 type 'a s' = 'a -> int constraint 'a = t' end -|}] - -module F2 (X : sig val x : t_float64 end) = struct - let f () = X.x -end;; -[%%expect{| -Line 1, characters 27-36: -1 | module F2 (X : sig val x : t_float64 end) = struct - ^^^^^^^^^ -Error: This type signature for x is not a value type. - x has layout float64, which is not a sublayout of value. -|}];; -(* CR layouts v5: the test above should be made to work *) - -module F2 (X : sig val f : t_float64 -> unit end) = struct - let g z = X.f z -end;; -[%%expect{| -module F2 : - functor (X : sig val f : t_float64 -> unit end) -> - sig val g : t_float64 -> unit end -|}];; - -(**************************************) -(* Test 3: basic annotated parameters *) -type ('a : immediate) imm_id = 'a - -[%%expect{| -type ('a : immediate) imm_id = 'a -|}];; - -type my_int = int imm_id -let plus_3 (x : my_int) = x + 3 -let plus_3' (x : int imm_id) = x + 3;; - -[%%expect{| -type my_int = int imm_id -val plus_3 : my_int -> int = -val plus_3' : int imm_id -> int = -|}];; - -let string_id (x : string imm_id) = x;; -[%%expect{| -Line 1, characters 19-25: -1 | let string_id (x : string imm_id) = x;; - ^^^^^^ -Error: This type string should be an instance of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}];; - -let id_for_imms (x : 'a imm_id) = x - -let three = id_for_imms 3 -let true_ = id_for_imms true;; -[%%expect{| -val id_for_imms : ('a : immediate). 'a imm_id -> 'a imm_id = -val three : int imm_id = 3 -val true_ : bool imm_id = true -|}] - -let not_helloworld = id_for_imms "hello world";; -[%%expect{| -Line 1, characters 33-46: -1 | let not_helloworld = id_for_imms "hello world";; - ^^^^^^^^^^^^^ -Error: This expression has type string but an expression was expected of type - 'a imm_id = ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}] - -(************************************) -(* Test 4: parameters and recursion *) -type ('a : immediate) t4 -and s4 = string t4;; - -[%%expect{| -Line 2, characters 9-15: -2 | and s4 = string t4;; - ^^^^^^ -Error: This type string should be an instance of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}];; - -type s4 = string t4 -and ('a : immediate) t4;; - -[%%expect{| -Line 1, characters 10-16: -1 | type s4 = string t4 - ^^^^^^ -Error: This type string should be an instance of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}] - -type s4 = int t4 -and ('a : immediate) t4;; - -[%%expect{| -type s4 = int t4 -and ('a : immediate) t4 -|}] - -type s4 = s5 t4 -and ('a : immediate) t4 -and s5 = int;; - -[%%expect{| -type s4 = s5 t4 -and ('a : immediate) t4 -and s5 = int -|}] - -type s4 = s5 t4 -and ('a : immediate) t4 -and s5 = string;; - -[%%expect{| -Line 3, characters 0-15: -3 | and s5 = string;; - ^^^^^^^^^^^^^^^ -Error: - s5 has layout value, which is not a sublayout of immediate. -|}] -(* CR layouts v2.9: improve error, which requires layout histories *) - -type ('a : any) t4 = 'a -and s4 = string t4;; -[%%expect{| -type ('a : any) t4 = 'a -and s4 = string t4 -|}];; - -type s4 = string t4 -and ('a : any) t4;; -[%%expect{| -type s4 = string t4 -and ('a : any) t4 -|}];; - -type ('a : void) void4 = Void4 of 'a;; -[%%expect{| -Line 1, characters 11-15: -1 | type ('a : void) void4 = Void4 of 'a;; - ^^^^ -Error: Layout void is more experimental than allowed by -extension layouts_beta. - You must enable -extension layouts_alpha to use this feature. -|}];; - -type ('a : any) any4 = Any4 of 'a -[%%expect{| -type 'a any4 = Any4 of 'a -|}];; - -(************************************************************) -(* Test 5: You can touch a void, but not return it directly *) - -(* CR layouts v5: these tests moved to [basics_alpha.ml]. Bring them here. - Also the tests will change because we'll allow returning void. *) - -(****************************************) -(* Test 6: explicitly polymorphic types *) -type ('a : immediate) t6_imm = T6imm of 'a -type ('a : value) t6_val = T6val of 'a;; -[%%expect{| -type ('a : immediate) t6_imm = T6imm of 'a -type 'a t6_val = T6val of 'a -|}];; - -let ignore_val6 : 'a . 'a -> unit = - fun a -> let _ = T6val a in ();; -[%%expect{| -val ignore_val6 : 'a -> unit = -|}];; - -let ignore_imm6 : 'a . 'a -> unit = - fun a -> let _ = T6imm a in ();; -[%%expect{| -Line 2, characters 2-32: -2 | fun a -> let _ = T6imm a in ();; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This definition has type 'b -> unit which is less general than - 'a. 'a -> unit - 'a has layout value, which is not a sublayout of immediate. -|}];; - -let o6 = object - method ignore_imm6 : 'a . 'a -> unit = - fun a -> let _ = T6imm a in () -end;; -[%%expect{| -Line 3, characters 4-34: -3 | fun a -> let _ = T6imm a in () - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This method has type 'b -> unit which is less general than - 'a. 'a -> unit - 'a has layout value, which is not a sublayout of immediate. -|}];; - -(* CR layouts v1.5: add more tests here once you can annotate these types with - jkinds. *) - -(****************************************) -(* Test 7: the jkind check in unify_var *) - -type ('a : immediate) t7 = Foo7 of 'a - -type t7' = (int * int) t7;; -[%%expect{| -type ('a : immediate) t7 = Foo7 of 'a -Line 3, characters 12-21: -3 | type t7' = (int * int) t7;; - ^^^^^^^^^ -Error: This type int * int should be an instance of type ('a : immediate) - int * int has layout value, which is not a sublayout of immediate. -|}] - -(**********************************************************) -(* Test 8: Polymorphic variants take value args (for now) *) - -(* CR layouts v5: Bring over void versions of these tests. *) - -module M8_1f = struct - type foo1 = [ `Foo1 of int | `Baz1 of t_float64 | `Bar1 of string ];; -end -[%%expect{| -Line 2, characters 40-49: -2 | type foo1 = [ `Foo1 of int | `Baz1 of t_float64 | `Bar1 of string ];; - ^^^^^^^^^ -Error: Polymorphic variant constructor argument types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module M8_2f = struct - let foo x = - match x with - | `Baz 42 -> Stdlib__Float_u.of_float 3.14 - | `Bar v -> v - | `Bas i -> Stdlib__Float_u.of_float 3.14 -end;; -[%%expect {| -Line 5, characters 16-17: -5 | | `Bar v -> v - ^ -Error: This expression has type ('a : value) - but an expression was expected of type float# - float# has layout float64, which is not a sublayout of value. -|}];; - -module M8_3f = struct - type 'a t = [ `Foo of 'a | `Baz of int ] - - type bad = t_float64 t -end;; -[%%expect {| -Line 4, characters 13-22: -4 | type bad = t_float64 t - ^^^^^^^^^ -Error: This type t_float64 should be an instance of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module M8_4f = struct - type 'a t = [ `Foo of 'a | `Baz of int ] constraint 'a = t_float64 -end;; -[%%expect {| -Line 2, characters 54-68: -2 | type 'a t = [ `Foo of 'a | `Baz of int ] constraint 'a = t_float64 - ^^^^^^^^^^^^^^ -Error: The type constraints are not consistent. - Type ('a : value) is not compatible with type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module type S8_5f = sig - val x : [`A of t_float64] -end;; -[%%expect{| -Line 2, characters 17-26: -2 | val x : [`A of t_float64] - ^^^^^^^^^ -Error: Polymorphic variant constructor argument types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}] - -(************************************************) -(* Test 9: Tuples only work on values (for now) *) - -(* CR layouts v5: bring over void tests. *) -module M9_1f = struct - type foo1 = int * t_float64 * [ `Foo1 of int | `Bar1 of string ];; -end -[%%expect{| -Line 2, characters 20-29: -2 | type foo1 = int * t_float64 * [ `Foo1 of int | `Bar1 of string ];; - ^^^^^^^^^ -Error: Tuple element types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module M9_2f = struct - type result = V of (string * t_float64) | I of int -end;; -[%%expect {| -Line 2, characters 31-40: -2 | type result = V of (string * t_float64) | I of int - ^^^^^^^^^ -Error: Tuple element types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module M9_4f = struct - let f_id (x : float#) = x - - let foo x = - match x with - | (a, _) -> f_id a -end;; -[%%expect {| -Line 6, characters 21-22: -6 | | (a, _) -> f_id a - ^ -Error: This expression has type ('a : value) - but an expression was expected of type float# - float# has layout float64, which is not a sublayout of value. -|}];; - -module M9_5f = struct - type 'a t = (int * 'a) - - type bad = t_float64 t -end;; -[%%expect {| -Line 4, characters 13-22: -4 | type bad = t_float64 t - ^^^^^^^^^ -Error: This type t_float64 should be an instance of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module M9_6f = struct - type 'a t = int * 'a constraint 'a = t_float64 -end;; -[%%expect {| -Line 2, characters 34-48: -2 | type 'a t = int * 'a constraint 'a = t_float64 - ^^^^^^^^^^^^^^ -Error: The type constraints are not consistent. - Type ('a : value) is not compatible with type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module type S9_7f = sig - val x : int * t_float64 -end;; -[%%expect{| -Line 2, characters 16-25: -2 | val x : int * t_float64 - ^^^^^^^^^ -Error: Tuple element types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(*************************************************) -(* Test 10: jkinds are checked by "more general" *) - -(* This hits the first linktype in moregen (no expansion required to see it's a - var) *) -module M10_1 : sig - val x : string -end = struct - type ('a : immediate) t = 'a - - let f : 'a t -> 'a = fun x -> x - - let x = f (assert false) -end;; -[%%expect {| -Lines 3-9, characters 6-3: -3 | ......struct -4 | type ('a : immediate) t = 'a -5 | -6 | let f : 'a t -> 'a = fun x -> x -7 | -8 | let x = f (assert false) -9 | end.. -Error: Signature mismatch: - Modules do not match: - sig - type ('a : immediate) t = 'a - val f : ('a : immediate). 'a t -> 'a - val x : ('a : immediate). 'a - end - is not included in - sig val x : string end - Values do not match: - val x : ('a : immediate). 'a - is not included in - val x : string - The type ('a : immediate) is not compatible with the type string - string has layout value, which is not a sublayout of immediate. -|}];; - -(* This hits the second linktype in moregen (requires expansion to see it's a - var) *) -module M10_2 : sig - val x : string -end = struct - type ('a : immediate) t = 'a - - let f (x : 'a t) : 'a t = x - - let x = f (assert false) -end;; -[%%expect {| -Lines 3-9, characters 6-3: -3 | ......struct -4 | type ('a : immediate) t = 'a -5 | -6 | let f (x : 'a t) : 'a t = x -7 | -8 | let x = f (assert false) -9 | end.. -Error: Signature mismatch: - Modules do not match: - sig - type ('a : immediate) t = 'a - val f : ('a : immediate). 'a t -> 'a t - val x : ('a : immediate). 'a t - end - is not included in - sig val x : string end - Values do not match: - val x : ('a : immediate). 'a t - is not included in - val x : string - The type 'a t = ('a : immediate) is not compatible with the type - string - string has layout value, which is not a sublayout of immediate. -|}] - -(**********************************************************************) -(* Test 11: objects are values. methods may take/return other sorts. *) - -(* CR layouts v5: bring the void versions back here. *) -module M11_1 = struct - type ('a : void) t = { x : int; v : 'a } - - let f t = - t.v # baz11 -end;; -[%%expect{| -Line 2, characters 13-17: -2 | type ('a : void) t = { x : int; v : 'a } - ^^^^ -Error: Layout void is more experimental than allowed by -extension layouts_beta. - You must enable -extension layouts_alpha to use this feature. -|}] - -module M11_1f = struct - type ('a : float64) t = 'a - - let f (x : 'a t) = - x # baz11 -end;; -[%%expect{| -Line 5, characters 4-5: -5 | x # baz11 - ^ -Error: Method types must have layout value. - This expression has layout float64, which does not overlap with value. -|}] - -module M11_2f = struct - type ('a : float64) t = 'a - let f_id (x : 'a t) = x - let foo x = f_id (x # getfloat) -end;; -[%%expect{| -Line 4, characters 19-33: -4 | let foo x = f_id (x # getfloat) - ^^^^^^^^^^^^^^ -Error: This expression has type ('a : value) - but an expression was expected of type 'b t = ('b : float64) - 'a t has layout float64, which does not overlap with value. -|}];; - -module M11_3f = struct - type ('a : float64) t = 'a - - let foo o (x : 'a t) = o # usefloat x -end;; -[%%expect{| -module M11_3f : - sig - type ('a : float64) t = 'a - val foo : 'b ('a : float64). < usefloat : 'a t -> 'b; .. > -> 'a t -> 'b - end -|}];; - -module M11_4f = struct - val x : < l : t_float64 > -end;; -[%%expect{| -Line 2, characters 12-25: -2 | val x : < l : t_float64 > - ^^^^^^^^^^^^^ -Error: Object field types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module M11_5f = struct - type 'a t = < l : 'a s > - and ('a : float64) s = 'a -end;; -[%%expect{| -Line 3, characters 2-27: -3 | and ('a : float64) s = 'a - ^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: - 'a s has layout float64, which does not overlap with value. -|}];; - -module M11_6f = struct - type 'a t = < l : 'a > constraint 'a = t_float64 -end;; -[%%expect{| -Line 2, characters 36-50: -2 | type 'a t = < l : 'a > constraint 'a = t_float64 - ^^^^^^^^^^^^^^ -Error: The type constraints are not consistent. - Type ('a : value) is not compatible with type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(*******************************************************************) -(* Test 12: class parameters and bound vars must have jkind value *) - -(* CR layouts v5: Bring the void versions back here. *) - -(* Hits `Pcl_let` *) -module M12_1f = struct - let f : ('a : float64) . unit -> 'a = fun () -> assert false - class foo12 u = - let d = f u in - object - val bar = () - end;; -end -[%%expect{| -Line 4, characters 8-9: -4 | let d = f u in - ^ -Error: The types of variables bound by a 'let' in a class function - must have layout value. Instead, d's type has layout float64. -|}];; - -(* Hits the Cfk_concrete case of Pcf_val *) -module M12_2f = struct - let f : ('a : float64) . unit -> 'a = fun () -> assert false - class foo u = - object - val bar = f u - end -end;; -[%%expect{| -Line 5, characters 10-13: -5 | val bar = f u - ^^^ -Error: Variables bound in a class must have layout value. - bar has layout float64, which does not overlap with value. -|}];; - -(* Hits the Cfk_virtual case of Pcf_val *) -module M12_3f = struct - class virtual foo = - object - val virtual bar : t_float64 - end -end;; -[%%expect{| -Line 4, characters 18-21: -4 | val virtual bar : t_float64 - ^^^ -Error: Variables bound in a class must have layout value. - bar has layout float64, which is not a sublayout of value. -|}];; - -module M12_4f = struct - type ('a : float64) t - - class virtual ['a] foo = - object - val virtual baz : 'a t - end -end -[%%expect{| -Line 6, characters 24-26: -6 | val virtual baz : 'a t - ^^ -Error: This type ('a : float64) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with float64. -|}];; - -module M12_5f = struct - type ('a : float64) t = 'a - - class ['a] foo = - object - method void_id (a : 'a t) : 'a t = a - end -end;; -[%%expect{| -Line 6, characters 26-28: -6 | method void_id (a : 'a t) : 'a t = a - ^^ -Error: This type ('a : float64) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with float64. -|}];; - -module type S12_6f = sig - type ('a : float64) t = 'a - - class ['a] foo : - 'a t -> - object - method baz : int - end -end;; -[%%expect{| -Line 5, characters 4-6: -5 | 'a t -> - ^^ -Error: This type ('a : float64) should be an instance of type ('a0 : value) - 'a has layout value, which does not overlap with float64. -|}];; - -module type S12_7f = sig - class foo : - object - val baz : t_float64 - end -end;; -[%%expect{| -Line 4, characters 6-25: -4 | val baz : t_float64 - ^^^^^^^^^^^^^^^^^^^ -Error: Variables bound in a class must have layout value. - baz has layout float64, which is not a sublayout of value. -|}];; - -(***********************************************************) -(* Test 13: built-in type constructors work only on values *) - -(* CR layouts v5: Bring the void versions over from basics_alpha *) - -(* lazy *) -type t13f = t_float64 Lazy.t;; -[%%expect{| -Line 1, characters 12-21: -1 | type t13f = t_float64 Lazy.t;; - ^^^^^^^^^ -Error: This type t_float64 should be an instance of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x13f (v : t_float64) = lazy v;; -[%%expect{| -Line 1, characters 32-33: -1 | let x13f (v : t_float64) = lazy v;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let f_id (x : t_float64) = x -let x13f v = - match v with - | lazy v -> f_id v -[%%expect{| -val f_id : t_float64 -> t_float64 = -Line 4, characters 19-20: -4 | | lazy v -> f_id v - ^ -Error: This expression has type ('a : value) - but an expression was expected of type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(* option *) -(* CR layouts v5: allow this *) -type t13f = t_float64 option;; -[%%expect{| -Line 1, characters 12-21: -1 | type t13f = t_float64 option;; - ^^^^^^^^^ -Error: This type t_float64 should be an instance of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x13f (v : t_float64) = Some v;; -[%%expect{| -Line 1, characters 32-33: -1 | let x13f (v : t_float64) = Some v;; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x13f v = - match v with - | Some v -> f_id v - | None -> assert false -[%%expect{| -Line 3, characters 19-20: -3 | | Some v -> f_id v - ^ -Error: This expression has type ('a : value) - but an expression was expected of type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(* list *) -type t13f = t_float64 list;; -[%%expect{| -Line 1, characters 12-21: -1 | type t13f = t_float64 list;; - ^^^^^^^^^ -Error: This type t_float64 should be an instance of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x13 (v : t_float64) = [v];; -[%%expect{| -Line 1, characters 27-28: -1 | let x13 (v : t_float64) = [v];; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x13 v = - match v with - | [v] -> f_id v - | _ -> assert false -[%%expect{| -Line 3, characters 16-17: -3 | | [v] -> f_id v - ^ -Error: This expression has type ('a : value) - but an expression was expected of type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(* array *) -type t13f = t_float64 array;; -[%%expect{| -Line 1, characters 12-21: -1 | type t13f = t_float64 array;; - ^^^^^^^^^ -Error: This type t_float64 should be an instance of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x13f (v : t_float64) = [| v |];; -[%%expect{| -Line 1, characters 30-31: -1 | let x13f (v : t_float64) = [| v |];; - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -let x13f v = - match v with - | [| v |] -> f_id v - | _ -> assert false -[%%expect{| -Line 3, characters 20-21: -3 | | [| v |] -> f_id v - ^ -Error: This expression has type ('a : value) - but an expression was expected of type t_float64 - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -(****************************************************************************) -(* Test 14: Examples motivating the trick with the manifest in [enter_type] *) - -type t14 = foo14 list -and foo14 = string;; -[%%expect{| -type t14 = foo14 list -and foo14 = string -|}];; - -(* CR layouts v5: Bring back void version from basics_alpha. *) - -type t14 = foo14 list -and foo14 = t_float64;; -[%%expect{| -Line 2, characters 0-21: -2 | and foo14 = t_float64;; - ^^^^^^^^^^^^^^^^^^^^^ -Error: - foo14 has layout float64, which is not a sublayout of value. -|}];; - -(****************************************************) -(* Test 15: Type aliases need not have jkind value *) - -(* CR layouts v5: Bring back void version from basics_alpha. *) - -type ('a : float64) t15 -type ('a, 'b) foo15 = ('a as 'b) t15 -> 'b t15;; -[%%expect{| -type ('a : float64) t15 -type ('a : float64, 'b) foo15 = 'a t15 -> 'a t15 constraint 'b = 'a -|}] - - -(********************************************************) -(* Test 16: seperability: [msig_of_external_type] logic *) - -(* CR layouts v5: This test moved to [basics_alpha.ml] as it needs a non-value - sort in a variant. Bring back here when we have one. *) - -type 'a t_void_16 : void;; -[%%expect{| -Line 1, characters 20-24: -1 | type 'a t_void_16 : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}];; - -(**************************************************************************) -(* Test 17: incremental jkind checking of @@unboxed types - see comment on - [constrain_type_jkind]. *) - -type 'a t17 = 'a list -type s17 = { lbl : s17 t17 } [@@unboxed];; - -[%%expect{| -type 'a t17 = 'a list -type s17 = { lbl : s17 t17; } [@@unboxed] -|}];; - -(*****************************************) -(* Test 18: expansion in [check_univars] *) -(* This test isn't really jkinds-specific, but it checks that the jkind checks - we've added in [Typecore.check_univars] don't choke when expansion is needed - to see a variable *) -type 'a t18 = 'a - -let id18 (x : 'a t18) = x - -let f18 : 'a . 'a -> 'a = fun x -> id18 x;; - -[%%expect{| -type 'a t18 = 'a -val id18 : 'a t18 -> 'a t18 = -val f18 : 'a -> 'a = -|}];; - -(********************************) -(* Test 19: non-value coercions *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -let f19f () = - let x : t_float64 = assert false in - let _y = (x :> t_float64) in - ();; -[%%expect{| -val f19f : unit -> unit = -|}];; - -(********************************************) -(* Test 20: Non-value bodies for let module *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -let f20f () = - let x : t_float64 = assert false in - let _y = - let module M = struct end in - x - in - ();; -[%%expect{| -val f20f : unit -> unit = -|}];; - -(**********************************) -(* Test 21: Non-value unpack body *) -module type M21 = sig end - -(* CR layouts v5: bring void version here from layouts_alpha *) - -let f21f () = - let x : t_float64 = assert false in - let _y = - let (module M) = (module struct end : M21) in - x - in - ();; -[%%expect{| -module type M21 = sig end -val f21f : unit -> unit = -|}];; - -(***************************************************************) -(* Test 22: approx_type catch-all can't be restricted to value *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -type ('a : float64) t22f = 'a - -let f () = - let rec g x : _ t22f = g x in - g (assert false);; -[%%expect{| -type ('a : float64) t22f = 'a -val f : ('a : float64). unit -> 'a t22f t22f = -|}];; - - -(********************************************************************) -(* Test 23: checking the error message from impossible GADT matches *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -type (_ : any, _ : any) eq = Refl : ('a, 'a) eq - -module Mf : sig - type t_float64 : float64 - type t_imm : immediate -end = struct - type t_float64 : float64 - type t_imm : immediate -end -(* these are abstract, so the only trouble with unifying them in a GADT - match is around their layouts *) - -let f (x : (Mf.t_float64, Mf.t_imm) eq) = - match x with - | Refl -> () - -[%%expect{| -type (_ : any, _ : any) eq = Refl : ('a : any). ('a, 'a) eq -module Mf : sig type t_float64 : float64 type t_imm : immediate end -Line 15, characters 4-8: -15 | | Refl -> () - ^^^^ -Error: This pattern matches values of type (Mf.t_float64, Mf.t_float64) eq - but a pattern was expected which matches values of type - (Mf.t_float64, Mf.t_imm) eq - Mf.t_float64 has layout float64, - which does not overlap with immediate. -|}] - -(*****************************************************) -(* Test 24: Polymorphic parameter with exotic layout *) - -(* CR layouts v5: bring void version here from layouts_alpha *) -type 'a t2_float : float64 - -let f (x : 'a. 'a t2_float) = x - -[%%expect{| -type 'a t2_float : float64 -val f : ('a. 'a t2_float) -> 'b t2_float = -|}] - -(**************************************************) -(* Test 25: Optional parameter with exotic layout *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -let f (x : t_float64) = - let g ?(x2 = x) () = () in - () - -[%%expect{| -Line 2, characters 15-16: -2 | let g ?(x2 = x) () = () in - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}] - -(*********************************************************) -(* Test 26: Inferring an application to an exotic layout *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -let g f (x : t_float64) : t_float64 = f x - -[%%expect{| -val g : (t_float64 -> t_float64) -> t_float64 -> t_float64 = -|}] - -(******************************************) -(* Test 27: Exotic layouts in approx_type *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -let rec f : _ -> _ = fun (x : t_float64) -> x - -[%%expect{| -val f : t_float64 -> t_float64 = -|}] - -(************************************) -(* Test 28: Exotic layouts in letop *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -(* 28.1: non-value letop arg *) -let ( let* ) (x : t_float64) f = () - -let q () = - let* x = assert false in - () - -[%%expect{| -val ( let* ) : t_float64 -> 'a -> unit = -val q : unit -> unit = -|}] - -(* 28.2: non-value letop binder arg without and *) -let ( let* ) x (f : t_float64 -> _) = () - -let q () = - let* x = assert false in - () - -[%%expect{| -val ( let* ) : 'a -> (t_float64 -> 'b) -> unit = -val q : unit -> unit = -|}] - -(* 28.3: non-value letop binder result *) -let ( let* ) x (f : _ -> t_float64) = () - -let q () = - let* x = assert false in - assert false - -[%%expect{| -val ( let* ) : 'a -> ('b -> t_float64) -> unit = -val q : unit -> unit = -|}] - -(* 28.4: non-value letop result *) -let ( let* ) x f : t_float64 = assert false - -let q () = - let* x = 5 in - () - -[%%expect{| -val ( let* ) : 'a -> 'b -> t_float64 = -val q : unit -> t_float64 = -|}] - -(* 28.5: non-value andop second arg *) -let ( let* ) x f = () -let ( and* ) x1 (x2 : t_float64) = () -let q () = - let* x = 5 - and* y = assert false - in - () - -[%%expect{| -val ( let* ) : 'a -> 'b -> unit = -val ( and* ) : 'a -> t_float64 -> unit = -val q : unit -> unit = -|}] - -(* 28.6: non-value andop first arg *) -let ( let* ) x f = () -let ( and* ) (x1 : t_float64) x2 = () -let q () = - let* x = assert false - and* y = 5 - in - () - -[%%expect{| -val ( let* ) : 'a -> 'b -> unit = -val ( and* ) : t_float64 -> 'a -> unit = -val q : unit -> unit = -|}] - -(* 28.7: non-value andop result *) -let ( let* ) (x : (_ : float64)) f = () -let ( and* ) x1 x2 : t_float64 = assert false -let q () = - let* x = 5 - and* y = 5 - in - () - -[%%expect{| -val ( let* ) : 'b ('a : float64). 'a -> 'b -> unit = -val ( and* ) : 'a -> 'b -> t_float64 = -val q : unit -> unit = -|}] - -(* 28.8: non-value letop binder arg with and *) -let ( let* ) x f = () -let ( and* ) x1 x2 = assert false -let q () = - let* x : t_float64 = assert false - and* y = 5 - in - () - -[%%expect{| -val ( let* ) : 'a -> 'b -> unit = -val ( and* ) : 'a -> 'b -> 'c = -Line 4, characters 9-22: -4 | let* x : t_float64 = assert false - ^^^^^^^^^^^^^ -Error: This pattern matches values of type t_float64 - but a pattern was expected which matches values of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}] - -(*******************************************) -(* Test 29: [external]s default to [value] *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -external eq : 'a -> 'a -> bool = "%equal" -let mk_float64 () : t_float64 = assert false -let x () = eq (mk_float64 ()) (mk_float64 ()) - -[%%expect{| -external eq : 'a -> 'a -> bool = "%equal" -val mk_float64 : unit -> t_float64 = -Line 3, characters 14-29: -3 | let x () = eq (mk_float64 ()) (mk_float64 ()) - ^^^^^^^^^^^^^^^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}] - -(**************************************) -(* Test 30: [val]s default to [value] *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -module M : sig - val f : 'a -> 'a -end = struct - let f x = x -end - -let g (x : t_float64) = M.f x - -[%%expect{| -module M : sig val f : 'a -> 'a end -Line 7, characters 28-29: -7 | let g (x : t_float64) = M.f x - ^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}] - -(**************************************************) -(* Test 31: checking that #poly_var patterns work *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -type ('a : float64) poly_var = [`A of int * 'a | `B] - -let f #poly_var = "hello" - -[%%expect{| -Line 1, characters 44-46: -1 | type ('a : float64) poly_var = [`A of int * 'a | `B] - ^^ -Error: This type ('a : value) should be an instance of type ('a0 : float64) - 'a has layout float64, which does not overlap with value. -|}] - -(*********************************************************) -(* Test 32: Polymorphic variant constructors take values *) - -(* CR layouts v5: bring void version here from layouts_alpha *) - -let f _ = `Mk (assert false : t_float64) - -[%%expect{| -Line 1, characters 14-40: -1 | let f _ = `Mk (assert false : t_float64) - ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This expression has type t_float64 - but an expression was expected of type ('a : value) - t_float64 has layout float64, which is not a sublayout of value. -|}] - -(******************************************************) -(* Test 33: Externals must have representable types *) - -external foo33 : t_any = "foo33";; - -[%%expect{| -Line 1, characters 17-22: -1 | external foo33 : t_any = "foo33";; - ^^^^^ -Error: This type signature for foo33 is not a value type. - foo33 has layout any, which is not a sublayout of value. -|}] - -(****************************************************) -(* Test 34: Layout clash in polymorphic record type *) - -type ('a : immediate) t2_imm - -type s = { f : ('a : value) . 'a -> 'a u } -and 'a u = 'a t2_imm - -[%%expect {| -type ('a : immediate) t2_imm -Line 3, characters 15-40: -3 | type s = { f : ('a : value) . 'a -> 'a u } - ^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type 'a has layout value, which is not a sublayout of immediate. -|}] - -(****************************************************) -(* Test 35: check bad layout error in filter_arrow *) - -type ('a : immediate) t35 = 'a -let f35 : 'a t35 = fun () -> () - -[%%expect {| -type ('a : immediate) t35 = 'a -Line 2, characters 19-31: -2 | let f35 : 'a t35 = fun () -> () - ^^^^^^^^^^^^ -Error: - 'a -> 'b has layout value, which is not a sublayout of immediate. -|}] - -(**************************************************) -(* Test 36: Disallow non-representable statements *) - -let () = (assert false : t_any); () -[%%expect{| -Line 1, characters 9-31: -1 | let () = (assert false : t_any); () - ^^^^^^^^^^^^^^^^^^^^^^ -Warning 10 [non-unit-statement]: this expression should have type unit. - -Line 1, characters 10-22: -1 | let () = (assert false : t_any); () - ^^^^^^^^^^^^ -Error: This expression has type t_any but an expression was expected of type - ('a : '_representable_layout_5) - because it is in the left-hand side of a sequence - t_any has layout any, which is not representable. -|}] - -let () = while false do (assert false : t_any); done -[%%expect{| -Line 1, characters 24-46: -1 | let () = while false do (assert false : t_any); done - ^^^^^^^^^^^^^^^^^^^^^^ -Warning 10 [non-unit-statement]: this expression should have type unit. - -Line 1, characters 25-37: -1 | let () = while false do (assert false : t_any); done - ^^^^^^^^^^^^ -Error: This expression has type t_any but an expression was expected of type - ('a : '_representable_layout_6) - because it is in the body of a while-loop - t_any has layout any, which is not representable. -|}] - -let () = for i = 0 to 0 do (assert false : t_any); done -[%%expect{| -Line 1, characters 27-49: -1 | let () = for i = 0 to 0 do (assert false : t_any); done - ^^^^^^^^^^^^^^^^^^^^^^ -Warning 10 [non-unit-statement]: this expression should have type unit. - -Line 1, characters 28-40: -1 | let () = for i = 0 to 0 do (assert false : t_any); done - ^^^^^^^^^^^^ -Error: This expression has type t_any but an expression was expected of type - ('a : '_representable_layout_7) - because it is in the body of a for-loop - t_any has layout any, which is not representable. -|}] diff --git a/testsuite/tests/typing-layouts/datatypes.ml b/testsuite/tests/typing-layouts/datatypes.ml index 2e3885f7a5c..84227c09398 100644 --- a/testsuite/tests/typing-layouts/datatypes.ml +++ b/testsuite/tests/typing-layouts/datatypes.ml @@ -1,6 +1,10 @@ (* TEST - * expect - flags = "-extension layouts" + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } *) (* Tests for jkinds in algebraic datatypes *) @@ -9,17 +13,11 @@ type t_value : value type t_immediate : immediate;; +type t_any : any;; [%%expect {| type t_value : value type t_immediate : immediate -|}];; - -type t_any : any;; -[%%expect{| -Line 1, characters 13-16: -1 | type t_any : any;; - ^^^ -Error: Layout any is used here, but the appropriate layouts extension is not enabled +type t_any : any |}];; type t_void : void;; @@ -27,62 +25,490 @@ type t_void : void;; Line 1, characters 14-18: 1 | type t_void : void;; ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. |}];; -(***************************************************) -(* Test 1: constructor arguments may have any sort *) +(********************************************************) +(* Test 1: constructor arguments may be values or voids *) -(* CR layouts: Needs non-value jkind - moved to [datatypes_alpha.ml] *) +(* CR layouts v5: Needs void - moved to [datatypes_alpha.ml] *) (************************************) (* Test 2: but not the "any" layout *) -(* CR layouts: Needs the ability to talk about any - moved to - [datatypes_alpha.ml] *) +type t2_any1 = T2_any1 of t_any +[%%expect {| +Line 1, characters 15-31: +1 | type t2_any1 = T2_any1 of t_any + ^^^^^^^^^^^^^^^^ +Error: Constructor argument types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. +|}];; + +type t2_any2 = T2_any2 of t_immediate * t_any +[%%expect {| +Line 1, characters 15-45: +1 | type t2_any2 = T2_any2 of t_immediate * t_any + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Constructor argument types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. +|}];; + +type t2_any3 = T2_any3 of t_any * t_value +[%%expect {| +Line 1, characters 15-41: +1 | type t2_any3 = T2_any3 of t_any * t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Constructor argument types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. +|}];; + +type 'a t1_constraint = T1_con of 'a constraint 'a = 'b t1_constraint' +and 'b t1_constraint' = t_any +[%%expect {| +Line 2, characters 0-29: +2 | and 'b t1_constraint' = t_any + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: + The layout of 'b t1_constraint' is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of 'b t1_constraint' must be representable + because it instantiates an unannotated type parameter of t1_constraint. +|}] (******************************************************) (* Test 3: void allowed in records, but not by itself *) -(* CR layouts: Needs void - moved to [datatypes_alpha.ml]. Will change by the - time we add back void anyway. *) +(* CR layouts v5: Needs void - moved to [datatypes_alpha.ml]. Will change by + the time we add back void anyway. *) (**************************) (* Test 4: but any is not *) -(* CR layouts: Needs the ability to talk about any - moved to - [datatypes_alpha.ml] *) +type t4_any1 = { x : t_any } +[%%expect {| +Line 1, characters 17-26: +1 | type t4_any1 = { x : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; + +type t4_any2 = { x : t_immediate; y : t_any } +[%%expect {| +Line 1, characters 34-43: +1 | type t4_any2 = { x : t_immediate; y : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. +|}];; + +type t4_any3 = { x : t_any; y : t_value } +[%%expect {| +Line 1, characters 18-28: +1 | type t4_any3 = { x : t_any; y : t_value } + ^^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; + +type t4_cany1 = C of { x : t_any } +[%%expect {| +Line 1, characters 23-32: +1 | type t4_cany1 = C of { x : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; + +type t4_cany2 = C of { x : t_immediate; y : t_any } +[%%expect {| +Line 1, characters 40-49: +1 | type t4_cany2 = C of { x : t_immediate; y : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. +|}];; + +type t4_cany3 = C of { x : t_any; y : t_value } +[%%expect {| +Line 1, characters 23-33: +1 | type t4_cany3 = C of { x : t_any; y : t_value } + ^^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; + +(*********************************************************) +(* Test 5: These same rules apply to extensible variants *) + +(* CR layouts v5: void parts of this test from datatypes_alpha. *) +type t4_any1 = { x : t_any } +[%%expect {| +Line 1, characters 17-26: +1 | type t4_any1 = { x : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; + +type t4_any2 = { x : t_immediate; y : t_any } +[%%expect {| +Line 1, characters 34-43: +1 | type t4_any2 = { x : t_immediate; y : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. +|}];; + +type t4_any3 = { x : t_any; y : t_value } +[%%expect {| +Line 1, characters 18-28: +1 | type t4_any3 = { x : t_any; y : t_value } + ^^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; + +type t4_cany1 = C of { x : t_any } +[%%expect {| +Line 1, characters 23-32: +1 | type t4_cany1 = C of { x : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; + +type t4_cany2 = C of { x : t_immediate; y : t_any } +[%%expect {| +Line 1, characters 40-49: +1 | type t4_cany2 = C of { x : t_immediate; y : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. +|}];; + +type t4_cany3 = C of { x : t_any; y : t_value } +[%%expect {| +Line 1, characters 23-33: +1 | type t4_cany3 = C of { x : t_any; y : t_value } + ^^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. +|}];; (*********************************************************) (* Test 5: These same rules apply to extensible variants *) -(* CR layouts: Needs void and the ability to talk about any - moved to - [datatypes_alpha.ml] *) +(* CR layouts v5: void parts of this test from [datatypes_alpha] *) +type t5 = .. + +type t5 += T5_2 of t_value +type t5 += T5_3 of t_immediate + +type t5 += T5_6 of t_value * t_immediate;; +[%%expect{| +type t5 = .. +type t5 += T5_2 of t_value +type t5 += T5_3 of t_immediate +type t5 += T5_6 of t_value * t_immediate +|}] + + +type t5 += T5_7 of t_any +[%%expect {| +Line 1, characters 11-24: +1 | type t5 += T5_7 of t_any + ^^^^^^^^^^^^^ +Error: Constructor argument types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. +|}];; + +type t5 += T5_8 of t_immediate * t_any +[%%expect {| +Line 1, characters 11-38: +1 | type t5 += T5_8 of t_immediate * t_any + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Constructor argument types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. +|}];; + +type t5 += T5_9 of t_any * t_value +[%%expect {| +Line 1, characters 11-34: +1 | type t5 += T5_9 of t_any * t_value + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Constructor argument types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. +|}];; + +type t5 += T5_11 of { x : t_value } +type t5 += T5_12 of { x : t_immediate } + +type t5 += T5_15 of { x : t_value; y : t_immediate };; +[%%expect{| +type t5 += T5_11 of { x : t_value; } +type t5 += T5_12 of { x : t_immediate; } +type t5 += T5_15 of { x : t_value; y : t_immediate; } +|}];; + +type t5 += T5_17 of { x : t_immediate; y : t_any } +[%%expect {| +Line 1, characters 39-48: +1 | type t5 += T5_17 of { x : t_immediate; y : t_any } + ^^^^^^^^^ +Error: Record element types must have a representable layout. + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. +|}];; (**************************************************************************) (* Test 6: fields in all-float records get jkind value. may change in the future, but record fields must at least be representable. *) - -(* CR layouts: Needs jkind annotations on type parameters. Moved to - [datatypes_beta.ml]. Bring back when that isn't behind an extension flag. *) - type t6 = { fld6 : float } type ('a : immediate) s6 = S6 of 'a -[%%expect{| + +let f6 x = + let { fld6 = fld6 } = x in fld6 + +let f6' x = + let { fld6 = fld6 } = x in S6 fld6;; +[%%expect {| type t6 = { fld6 : float; } -Line 2, characters 11-20: -2 | type ('a : immediate) s6 = S6 of 'a - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. -|}] +type ('a : immediate) s6 = S6 of 'a +val f6 : t6 -> float = +Line 8, characters 32-36: +8 | let { fld6 = fld6 } = x in S6 fld6;; + ^^^^ +Error: This expression has type float but an expression was expected of type + ('a : immediate) + The kind of float is value + because it is the primitive value type float. + But the kind of float must be a subkind of immediate + because of the definition of s6 at line 2, characters 0-35. +|}];; (*****************************************************) (* Test 7: Recursive propagation of immediacy checks *) -(* CR layouts: copy test from datatypes_alpha with float64 when available *) +(* CR layouts v5: copy test from datatypes_alpha when non-values can go in + general datatype declarations. *) (***********************************************************************) (* Test 8: Type parameters in the presence of recursive concrete usage *) (* CR layouts: copy test from datatypes_alpha with float64 when available *) + +type t_float64 : float64 +type ('a : float64) float64_t + +[%%expect {| +type t_float64 : float64 +type ('a : float64) float64_t +|}] + +type 'b t = 'b float64_t * t2 +and t2 = t_float64 float64_t + +[%%expect {| +type ('b : float64) t = 'b float64_t * t2 +and t2 = t_float64 float64_t +|}] + +type 'b t = 'b float64_t * t2 +and t2 = Mk1 of t_float64 t | Mk2 + +[%%expect {| +type ('b : float64) t = 'b float64_t * t2 +and t2 = Mk1 of t_float64 t | Mk2 +|}] + +type 'a t8_5 = { x : 'a t8_6; y : string} +and 'a t8_6 = 'a float64_t;; +[%%expect {| +Line 1, characters 21-28: +1 | type 'a t8_5 = { x : 'a t8_6; y : string} + ^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The layout of 'a is float64 + because of the definition of float64_t at line 2, characters 0-29. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t8_5, + defaulted to layout value. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}] + + +(*****************************************************************************) +(* Test 9: Looking through polytypes in mutually recursive type declarations *) + +type 'a t9_1 = unit +and t9_2 = { x : string t9_1 } +and t9_3 = { x : 'a. 'a t9_1 } + +[%%expect {| +type 'a t9_1 = unit +and t9_2 = { x : string t9_1; } +and t9_3 = { x : 'a. 'a t9_1; } +|}] + +type 'a floaty = float# +and t9_4 = { x : float#; y : string floaty } +and t9_5 = { x : float#; y : 'a. 'a floaty } + +[%%expect {| +type 'a floaty = float# +and t9_4 = { x : float#; y : string floaty; } +and t9_5 = { x : float#; y : 'a. 'a floaty; } +|}] + +(*****************************************************) +(* Test 10: Constraints and parameter kind inference *) + +module M : sig + type ('a : any) t constraint 'a = int +end = struct + type ('a : value) t = 'a constraint 'a = int +end + +[%%expect {| +module M : sig type 'a t constraint 'a = int end +|}] + +module M : sig + type 'a t1 : value constraint 'a = 'b t2 + and (!'c : any) t2 +end = struct + type 'a t1 = 'b constraint 'a = 'b t2 + and (!'c : any) t2 +end + +type t3 = t_any M.t2 +type t4 = t_any M.t2 M.t1 + +[%%expect {| +module M : + sig type 'a t1 : value constraint 'a = 'b t2 and (!'c : any) t2 end +type t3 = t_any M.t2 +Line 10, characters 10-20: +10 | type t4 = t_any M.t2 M.t1 + ^^^^^^^^^^ +Error: This type t_any M.t2 should be an instance of type 'a M.t2 + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be a sublayout of value + because of the definition of t1 at line 2, characters 2-42. +|}] + +module M : sig + type (!'c : any) t2 + and 'a t1 : value constraint 'a = 'b t2 +end = struct + type (!'c : any) t2 + and 'a t1 = 'b constraint 'a = 'b t2 +end + +type t3 = t_any M.t2 +type t4 = t_any M.t2 M.t1 + +[%%expect {| +module M : + sig type (!'c : any) t2 and 'a t1 : value constraint 'a = 'b t2 end +type t3 = t_any M.t2 +Line 10, characters 10-20: +10 | type t4 = t_any M.t2 M.t1 + ^^^^^^^^^^ +Error: This type t_any M.t2 should be an instance of type 'a M.t2 + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be a sublayout of value + because of the definition of t1 at line 3, characters 2-41. +|}] + +module M : sig + type (!'c : any) t2 + type 'a t1 : value constraint 'a = 'b t2 +end = struct + type (!'c : any) t2 + type 'a t1 = 'b constraint 'a = 'b t2 +end + +type t3 = t_any M.t2 +type t4 = t_any M.t2 M.t1 + +[%%expect {| +module M : + sig type (!'c : any) t2 type 'a t1 : value constraint 'a = 'b t2 end +type t3 = t_any M.t2 +Line 10, characters 10-20: +10 | type t4 = t_any M.t2 M.t1 + ^^^^^^^^^^ +Error: This type t_any M.t2 should be an instance of type 'a M.t2 + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be a sublayout of value + because of the definition of t1 at line 3, characters 2-42. +|}] + diff --git a/testsuite/tests/typing-layouts/datatypes_alpha.ml b/testsuite/tests/typing-layouts/datatypes_alpha.ml index c586d6ff69e..3bbb6fee204 100644 --- a/testsuite/tests/typing-layouts/datatypes_alpha.ml +++ b/testsuite/tests/typing-layouts/datatypes_alpha.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension layouts_alpha" - * expect + flags = "-extension layouts_alpha"; + expect; *) (* Tests for jkinds in algebraic datatypes *) @@ -49,7 +49,10 @@ Line 1, characters 15-31: 1 | type t2_any1 = T2_any1 of t_any ^^^^^^^^^^^^^^^^ Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. |}];; type t2_any2 = T2_any2 of t_immediate * t_any @@ -58,7 +61,10 @@ Line 1, characters 15-45: 1 | type t2_any2 = T2_any2 of t_immediate * t_any ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. |}];; type t2_any3 = T2_any3 of t_any * t_value @@ -67,7 +73,10 @@ Line 1, characters 15-41: 1 | type t2_any3 = T2_any3 of t_any * t_value ^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. |}];; type 'a t1_constraint = T1_con of 'a constraint 'a = 'b t1_constraint' @@ -77,7 +86,10 @@ Line 2, characters 0-29: 2 | and 'b t1_constraint' = t_any ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: - 'b t1_constraint' has layout any, which is not representable. + The layout of 'b t1_constraint' is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of 'b t1_constraint' must be representable + because it instantiates an unannotated type parameter of t1_constraint. |}] (* CR layouts errors: this error is blamed on the wrong piece *) @@ -135,7 +147,10 @@ Line 1, characters 17-26: 1 | type t4_any1 = { x : t_any } ^^^^^^^^^ Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. |}];; type t4_any2 = { x : t_immediate; y : t_any } @@ -144,7 +159,10 @@ Line 1, characters 34-43: 1 | type t4_any2 = { x : t_immediate; y : t_any } ^^^^^^^^^ Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. |}];; type t4_any3 = { x : t_any; y : t_value } @@ -153,7 +171,10 @@ Line 1, characters 18-28: 1 | type t4_any3 = { x : t_any; y : t_value } ^^^^^^^^^^ Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. |}];; type t4_cany1 = C of { x : t_any } @@ -162,7 +183,10 @@ Line 1, characters 23-32: 1 | type t4_cany1 = C of { x : t_any } ^^^^^^^^^ Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. |}];; type t4_cany2 = C of { x : t_immediate; y : t_any } @@ -171,7 +195,10 @@ Line 1, characters 40-49: 1 | type t4_cany2 = C of { x : t_immediate; y : t_any } ^^^^^^^^^ Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. |}];; type t4_cany3 = C of { x : t_any; y : t_value } @@ -180,7 +207,10 @@ Line 1, characters 23-33: 1 | type t4_cany3 = C of { x : t_any; y : t_value } ^^^^^^^^^^ Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field x. |}];; (*********************************************************) @@ -211,7 +241,10 @@ Line 1, characters 11-24: 1 | type t5 += T5_7 of t_any ^^^^^^^^^^^^^ Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. |}];; type t5 += T5_8 of t_immediate * t_any @@ -220,7 +253,10 @@ Line 1, characters 11-38: 1 | type t5 += T5_8 of t_immediate * t_any ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. |}];; type t5 += T5_9 of t_any * t_value @@ -229,7 +265,10 @@ Line 1, characters 11-34: 1 | type t5 += T5_9 of t_any * t_value ^^^^^^^^^^^^^^^^^^^^^^^ Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it's the type of a constructor field. |}];; type t5 += T5_11 of { x : t_value } @@ -260,7 +299,10 @@ Line 1, characters 39-48: 1 | type t5 += T5_17 of { x : t_immediate; y : t_any } ^^^^^^^^^ Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it is the type of record field y. |}];; (**************************************************************************) @@ -283,7 +325,10 @@ Line 8, characters 32-36: ^^^^ Error: This expression has type float but an expression was expected of type ('a : immediate) - float has layout value, which is not a sublayout of immediate. + The kind of float is value + because it is the primitive value type float. + But the kind of float must be a subkind of immediate + because of the definition of s6 at line 2, characters 0-35. |}];; (*****************************************************) @@ -331,6 +376,72 @@ and t2 = Mk1 of t_void t | Mk2 type 'a t8_5 = { x : 'a t8_6; y : string} and 'a t8_6 = 'a void_t;; [%%expect {| -type ('a : void) t8_5 = { x : 'a t8_6; y : string; } -and ('a : void) t8_6 = 'a void_t +Line 1, characters 21-28: +1 | type 'a t8_5 = { x : 'a t8_6; y : string} + ^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The layout of 'a is void + because of the definition of void_t at line 1, characters 0-23. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t8_5, + defaulted to layout value. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. |}] + +type ('a : immediate) imm_t +type 'a t10 = { x : 'a t10_2; y : string} +and 'a t10_2 = 'a imm_t;; + +[%%expect{| +type ('a : immediate) imm_t +Line 2, characters 20-28: +2 | type 'a t10 = { x : 'a t10_2; y : string} + ^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The kind of 'a is value + because it instantiates an unannotated type parameter of t10, + defaulted to kind value. + But the kind of 'a must be a subkind of immediate + because of the definition of imm_t at line 1, characters 0-27. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}] + +type 'a t = { x : ('b : void). 'b t -> 'b t } + constraint 'a = float# + +[%%expect{| +Line 1, characters 18-43: +1 | type 'a t = { x : ('b : void). 'b t -> 'b t } + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of void + because of the annotation on the universal variable 'b. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}] + +(*****************************************************************************) +(* Test 9: Looking through polytypes in mutually recursive type declarations *) + +(* Doesn't need layouts_alpha. *) + +(*****************************************************) +(* Test 10: Constraints and parameter kind inference *) + +(* Doesn't need layouts_alpha. *) diff --git a/testsuite/tests/typing-layouts/datatypes_beta.ml b/testsuite/tests/typing-layouts/datatypes_beta.ml deleted file mode 100644 index 1279c028424..00000000000 --- a/testsuite/tests/typing-layouts/datatypes_beta.ml +++ /dev/null @@ -1,291 +0,0 @@ -(* TEST - flags = "-extension layouts_beta" - * expect -*) - -(* Tests for jkinds in algebraic datatypes *) - -(* CR layouts v5: add mixed block restriction tests. *) - -type t_value : value -type t_immediate : immediate;; -type t_any : any;; -[%%expect {| -type t_value : value -type t_immediate : immediate -type t_any : any -|}];; - -type t_void : void;; -[%%expect{| -Line 1, characters 14-18: -1 | type t_void : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}];; - -(********************************************************) -(* Test 1: constructor arguments may be values or voids *) - -(* CR layouts v5: Needs void - moved to [datatypes_alpha.ml] *) - -(************************************) -(* Test 2: but not the "any" layout *) - -type t2_any1 = T2_any1 of t_any -[%%expect {| -Line 1, characters 15-31: -1 | type t2_any1 = T2_any1 of t_any - ^^^^^^^^^^^^^^^^ -Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t2_any2 = T2_any2 of t_immediate * t_any -[%%expect {| -Line 1, characters 15-45: -1 | type t2_any2 = T2_any2 of t_immediate * t_any - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t2_any3 = T2_any3 of t_any * t_value -[%%expect {| -Line 1, characters 15-41: -1 | type t2_any3 = T2_any3 of t_any * t_value - ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type 'a t1_constraint = T1_con of 'a constraint 'a = 'b t1_constraint' -and 'b t1_constraint' = t_any -[%%expect {| -Line 2, characters 0-29: -2 | and 'b t1_constraint' = t_any - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: - 'b t1_constraint' has layout any, which is not representable. -|}] - -(******************************************************) -(* Test 3: void allowed in records, but not by itself *) - -(* CR layouts v5: Needs void - moved to [datatypes_alpha.ml]. Will change by - the time we add back void anyway. *) - -(**************************) -(* Test 4: but any is not *) - -type t4_any1 = { x : t_any } -[%%expect {| -Line 1, characters 17-26: -1 | type t4_any1 = { x : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_any2 = { x : t_immediate; y : t_any } -[%%expect {| -Line 1, characters 34-43: -1 | type t4_any2 = { x : t_immediate; y : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_any3 = { x : t_any; y : t_value } -[%%expect {| -Line 1, characters 18-28: -1 | type t4_any3 = { x : t_any; y : t_value } - ^^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_cany1 = C of { x : t_any } -[%%expect {| -Line 1, characters 23-32: -1 | type t4_cany1 = C of { x : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_cany2 = C of { x : t_immediate; y : t_any } -[%%expect {| -Line 1, characters 40-49: -1 | type t4_cany2 = C of { x : t_immediate; y : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_cany3 = C of { x : t_any; y : t_value } -[%%expect {| -Line 1, characters 23-33: -1 | type t4_cany3 = C of { x : t_any; y : t_value } - ^^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -(*********************************************************) -(* Test 5: These same rules apply to extensible variants *) - -(* CR layouts v5: void parts of this test from datatypes_alpha. *) -type t4_any1 = { x : t_any } -[%%expect {| -Line 1, characters 17-26: -1 | type t4_any1 = { x : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_any2 = { x : t_immediate; y : t_any } -[%%expect {| -Line 1, characters 34-43: -1 | type t4_any2 = { x : t_immediate; y : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_any3 = { x : t_any; y : t_value } -[%%expect {| -Line 1, characters 18-28: -1 | type t4_any3 = { x : t_any; y : t_value } - ^^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_cany1 = C of { x : t_any } -[%%expect {| -Line 1, characters 23-32: -1 | type t4_cany1 = C of { x : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_cany2 = C of { x : t_immediate; y : t_any } -[%%expect {| -Line 1, characters 40-49: -1 | type t4_cany2 = C of { x : t_immediate; y : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t4_cany3 = C of { x : t_any; y : t_value } -[%%expect {| -Line 1, characters 23-33: -1 | type t4_cany3 = C of { x : t_any; y : t_value } - ^^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -(*********************************************************) -(* Test 5: These same rules apply to extensible variants *) - -(* CR layouts v5: void parts of this test from [datatypes_alpha] *) -type t5 = .. - -type t5 += T5_2 of t_value -type t5 += T5_3 of t_immediate - -type t5 += T5_6 of t_value * t_immediate;; -[%%expect{| -type t5 = .. -type t5 += T5_2 of t_value -type t5 += T5_3 of t_immediate -type t5 += T5_6 of t_value * t_immediate -|}] - - -type t5 += T5_7 of t_any -[%%expect {| -Line 1, characters 11-24: -1 | type t5 += T5_7 of t_any - ^^^^^^^^^^^^^ -Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t5 += T5_8 of t_immediate * t_any -[%%expect {| -Line 1, characters 11-38: -1 | type t5 += T5_8 of t_immediate * t_any - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t5 += T5_9 of t_any * t_value -[%%expect {| -Line 1, characters 11-34: -1 | type t5 += T5_9 of t_any * t_value - ^^^^^^^^^^^^^^^^^^^^^^^ -Error: Constructor argument types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -type t5 += T5_11 of { x : t_value } -type t5 += T5_12 of { x : t_immediate } - -type t5 += T5_15 of { x : t_value; y : t_immediate };; -[%%expect{| -type t5 += T5_11 of { x : t_value; } -type t5 += T5_12 of { x : t_immediate; } -type t5 += T5_15 of { x : t_value; y : t_immediate; } -|}];; - -type t5 += T5_17 of { x : t_immediate; y : t_any } -[%%expect {| -Line 1, characters 39-48: -1 | type t5 += T5_17 of { x : t_immediate; y : t_any } - ^^^^^^^^^ -Error: Record element types must have a representable layout. - t_any has layout any, which is not representable. -|}];; - -(**************************************************************************) -(* Test 6: fields in all-float records get jkind value. may change in the - future, but record fields must at least be representable. *) -type t6 = { fld6 : float } -type ('a : immediate) s6 = S6 of 'a - -let f6 x = - let { fld6 = fld6 } = x in fld6 - -let f6' x = - let { fld6 = fld6 } = x in S6 fld6;; -[%%expect {| -type t6 = { fld6 : float; } -type ('a : immediate) s6 = S6 of 'a -val f6 : t6 -> float = -Line 8, characters 32-36: -8 | let { fld6 = fld6 } = x in S6 fld6;; - ^^^^ -Error: This expression has type float but an expression was expected of type - ('a : immediate) - float has layout value, which is not a sublayout of immediate. -|}];; - -(*****************************************************) -(* Test 7: Recursive propagation of immediacy checks *) - -(* CR layouts v5: copy test from datatypes_alpha when non-values can go in - general datatype declarations. *) - -(***********************************************************************) -(* Test 8: Type parameters in the presence of recursive concrete usage *) - -(* CR layouts v5: copy test from datatypes_alpha when non-values can go in - general datatype declarations. *) - diff --git a/testsuite/tests/typing-layouts/erasable_annot.ml b/testsuite/tests/typing-layouts/erasable_annot.ml new file mode 100644 index 00000000000..a8369de8650 --- /dev/null +++ b/testsuite/tests/typing-layouts/erasable_annot.ml @@ -0,0 +1,592 @@ +(* TEST + flags = "-extension-universe upstream_compatible"; + expect; +*) + +(* Upstream compatible usages of immediate/immediate64 are allowed *) +module type S1 = sig + type t_immediate : immediate + type t_immediate64 : immediate64 +end;; +[%%expect {| +module type S1 = + sig type t_immediate : immediate type t_immediate64 : immediate64 end +|}];; + +(* Same is not true when constraining type vars *) +(* immediate *) +module type S = sig + val f_immediate : ('a : immediate). 'a -> 'a -> 'a +end;; +[%%expect {| +Line 2, characters 2-52: +2 | val f_immediate : ('a : immediate). 'a -> 'a -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f_immediate +can't be erased for compatibility with upstream OCaml. + +module type S = sig val f_immediate : ('a : immediate). 'a -> 'a -> 'a end +|}];; + +module type S = sig + val f_immediate : ('a : immediate) -> 'a -> 'a +end;; +[%%expect {| +Line 2, characters 2-48: +2 | val f_immediate : ('a : immediate) -> 'a -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f_immediate +can't be erased for compatibility with upstream OCaml. + +module type S = sig val f_immediate : ('a : immediate). 'a -> 'a -> 'a end +|}];; + +module type S = sig + type ('a : immediate) t +end;; +[%%expect {| +Line 2, characters 2-25: +2 | type ('a : immediate) t + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in t +can't be erased for compatibility with upstream OCaml. + +module type S = sig type ('a : immediate) t end +|}];; + +module type S = sig + type _ g = | MkG : ('a : immediate). 'a g +end;; +[%%expect {| +Line 2, characters 2-43: +2 | type _ g = | MkG : ('a : immediate). 'a g + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in g +can't be erased for compatibility with upstream OCaml. + +module type S = sig type _ g = MkG : ('a : immediate). 'a g end +|}];; + +let f (type a : immediate): a -> a = fun x -> x +[%%expect {| +Line 1, characters 4-5: +1 | let f (type a : immediate): a -> a = fun x -> x + ^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +val f : ('a : immediate). 'a -> 'a = +|}];; + +let f x = (x : (_ : immediate)) +[%%expect {| +Line 1, characters 4-5: +1 | let f x = (x : (_ : immediate)) + ^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +val f : ('a : immediate). 'a -> 'a = +|}];; + +let f v: ((_ : immediate)[@error_message "Custom message"]) = v +[%%expect {| +Line 1, characters 4-5: +1 | let f v: ((_ : immediate)[@error_message "Custom message"]) = v + ^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +val f : ('a : immediate). 'a -> 'a = +|}];; + +(* immediate64 *) +module type S = sig + val f_immediate64 : ('a : immediate64). 'a -> 'a -> 'a +end;; +[%%expect {| +Line 2, characters 2-56: +2 | val f_immediate64 : ('a : immediate64). 'a -> 'a -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f_immediate64 +can't be erased for compatibility with upstream OCaml. + +module type S = + sig val f_immediate64 : ('a : immediate64). 'a -> 'a -> 'a end +|}];; + +module type S = sig + val f_immediate64 : ('a : immediate64) -> 'a -> 'a +end;; +[%%expect {| +Line 2, characters 2-52: +2 | val f_immediate64 : ('a : immediate64) -> 'a -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f_immediate64 +can't be erased for compatibility with upstream OCaml. + +module type S = + sig val f_immediate64 : ('a : immediate64). 'a -> 'a -> 'a end +|}];; + +module type S = sig + type ('a : immediate64) t +end;; +[%%expect {| +Line 2, characters 2-27: +2 | type ('a : immediate64) t + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in t +can't be erased for compatibility with upstream OCaml. + +module type S = sig type ('a : immediate64) t end +|}];; + +module type S = sig + type _ g = | MkG : ('a : immediate64). 'a g +end;; +[%%expect {| +Line 2, characters 2-45: +2 | type _ g = | MkG : ('a : immediate64). 'a g + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in g +can't be erased for compatibility with upstream OCaml. + +module type S = sig type _ g = MkG : ('a : immediate64). 'a g end +|}];; + +let f (type a : immediate64): a -> a = fun x -> x +[%%expect {| +Line 1, characters 4-5: +1 | let f (type a : immediate64): a -> a = fun x -> x + ^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +val f : ('a : immediate64). 'a -> 'a = +|}];; + +let f x = (x : (_ : immediate64)) +[%%expect {| +Line 1, characters 4-5: +1 | let f x = (x : (_ : immediate64)) + ^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +val f : ('a : immediate64). 'a -> 'a = +|}];; + +let f v: ((_ : immediate64)[@error_message "Custom message"]) = v +[%%expect {| +Line 1, characters 4-5: +1 | let f v: ((_ : immediate64)[@error_message "Custom message"]) = v + ^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +val f : ('a : immediate64). 'a -> 'a = +|}];; + +(* CR layouts: This message should change after we fix the package hack. + But it should still be an error under [-extension-universe upstream_compatible]. *) +module type S = sig + type t[@@immediate64] +end + +module type K = sig + val f : 'a -> (module S with type t = 'a) -> 'a +end + +[%%expect {| +module type S = sig type t : immediate64 end +Line 6, characters 2-49: +6 | val f : 'a -> (module S with type t = 'a) -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +module type K = + sig val f : ('a : immediate64). 'a -> (module S with type t = 'a) -> 'a end +|}];; + +(* Annotations here do nothing and should be accepted *) +module type S = sig + val f : (int as (_ : immediate)) -> (int as (_ : immediate64)) +end + +[%%expect {| +module type S = sig val f : int -> int end +|}];; + + +(* Annotation would affect ['a] and should be rejected *) +module type S = sig + type 'b id = 'b + val f : ('a id as (_ : immediate)) -> 'a +end + +[%%expect {| +Line 3, characters 2-42: +3 | val f : ('a id as (_ : immediate)) -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +module type S = sig type 'b id = 'b val f : ('a : immediate). 'a id -> 'a end +|}];; + +(* Inferring [f] to have an immediate type parameter is enough *) +module type S = sig + type t [@@immediate] +end + +let f (module _ : S with type t = 'a) (x : 'a) = x +;; + +[%%expect{| +module type S = sig type t : immediate end +Line 5, characters 4-5: +5 | let f (module _ : S with type t = 'a) (x : 'a) = x + ^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in f +can't be erased for compatibility with upstream OCaml. + +val f : ('a : immediate). (module S with type t = 'a) -> 'a -> 'a = +|}] + +(* CR layouts: this example should raise a warning, but it does not. + It's quite complicated, and missing it only means that this error + will be caught by the upstream compiler later. We have decided that + fixing this is not worth the effort. *) +module type S = sig + type t [@@immediate] +end + +let x = + ignore (fun (module _ : S with type t = 'a) (_ : 'a) -> 10); + 15 +;; + +[%%expect{| +module type S = sig type t : immediate end +val x : int = 15 +|}] + +(* CR layouts: this example should raise a warning, but it does not. + It's quite complicated, and missing it only means that this error + will be caught by the upstream compiler later. We have decided that + fixing this is not worth the effort. *) +let y = + ignore (fun (type a : immediate) (x : a) -> + let module _ : S = struct + type t = a + end in + ()); + 4 +;; + +[%%expect{| +val y : int = 4 +|}] + +(* Other annotations are not effected by this flag *) +module type S = sig + val f_any : ('a : any). ('a : any) -> (('a : any)[@error_message ""]) + type ('a : any) t_any : any + type (_ : any) t_any_ = MkG : ('a : any). 'a t_any_ + val f_bits64 : ('a : bits64). ('a : bits64) -> (('a : bits64)[@error_message ""]) + type ('a : bits64) t_bits64 : bits64 + type (_ : bits64) t_bits64_ = MkG : ('a : bits64). 'a t_bits64_ + val f_bits32 : ('a : bits32). ('a : bits32) -> (('a : bits32)[@error_message ""]) + type ('a : bits32) t_bits32 : bits32 + type (_ : bits32) t_bits32_ = MkG : ('a : bits32). 'a t_bits32_ + val f_float64 : ('a : float64). ('a : float64) -> (('a : float64)[@error_message ""]) + type ('a : float64) t_float64 : float64 + type (_ : float64) t_float64_ = MkG : ('a : float64). 'a t_float64_ + val f_word : ('a : word). ('a : word) -> (('a : word)[@error_message ""]) + type ('a : word) t_word : word + type (_ : word) t_word_ = MkG : ('a : word). 'a t_word_ +end + +module M = struct + let f_any (type a : any) = () + let f_bits64 (type a : bits64) = () + let f_bits32 (type a : bits32) = () + let f_float64 (type a : float64) = () + let f_word (type a : word) = () +end +[%%expect {| +module type S = + sig + val f_any : ('a : any). 'a -> 'a + type ('a : any) t_any : any + type (_ : any) t_any_ = MkG : ('a : any). 'a t_any_ + val f_bits64 : ('a : bits64). 'a -> 'a + type ('a : bits64) t_bits64 : bits64 + type (_ : bits64) t_bits64_ = MkG : ('a : bits64). 'a t_bits64_ + val f_bits32 : ('a : bits32). 'a -> 'a + type ('a : bits32) t_bits32 : bits32 + type (_ : bits32) t_bits32_ = MkG : ('a : bits32). 'a t_bits32_ + val f_float64 : ('a : float64). 'a -> 'a + type ('a : float64) t_float64 : float64 + type (_ : float64) t_float64_ = MkG : ('a : float64). 'a t_float64_ + val f_word : ('a : word). 'a -> 'a + type ('a : word) t_word : word + type (_ : word) t_word_ = MkG : ('a : word). 'a t_word_ + end +module M : + sig + val f_any : unit + val f_bits64 : unit + val f_bits32 : unit + val f_float64 : unit + val f_word : unit + end +|}];; + +(* Externals *) + +external f_1 : int -> bool -> int64# = "foo" "bar";; +[%%expect{| +Line 1, characters 30-36: +1 | external f_1 : int -> bool -> int64# = "foo" "bar";; + ^^^^^^ +Warning 187 [incompatible-with-upstream]: [@unboxed] attribute must be added to external declaration +argument type with layout bits64 for upstream compatibility. + +external f_1 : int -> bool -> (int64# [@unboxed]) = "foo" "bar" +|}];; + +external f_2 : int32# -> bool -> int = "foo" "bar";; +[%%expect{| +Line 1, characters 15-21: +1 | external f_2 : int32# -> bool -> int = "foo" "bar";; + ^^^^^^ +Warning 187 [incompatible-with-upstream]: [@unboxed] attribute must be added to external declaration +argument type with layout bits32 for upstream compatibility. + +external f_2 : (int32# [@unboxed]) -> bool -> int = "foo" "bar" +|}];; + +external f_3 : (float#[@unboxed]) -> bool -> string = "foo" "bar";; +[%%expect{| +external f_3 : (float# [@unboxed]) -> bool -> string = "foo" "bar" +|}];; + +external f_4 : string -> (nativeint#[@unboxed]) = "foo" "bar";; +[%%expect{| +external f_4 : string -> (nativeint# [@unboxed]) = "foo" "bar" +|}];; + +external f_5 : int64 -> int64# = "foo" "bar" [@@unboxed];; +[%%expect{| +external f_5 : int64 -> int64# = "foo" "bar" [@@unboxed] +|}];; + +external f_6 : (int32#[@untagged]) -> bool -> string = "foo" "bar";; +[%%expect{| +Line 1, characters 16-22: +1 | external f_6 : (int32#[@untagged]) -> bool -> string = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +external f_7 : string -> (int64#[@untagged]) = "foo" "bar";; +[%%expect{| +Line 1, characters 26-32: +1 | external f_7 : string -> (int64#[@untagged]) = "foo" "bar";; + ^^^^^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}];; + +(* With [@layout_poly] *) + +external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +[%%expect{| +external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] +|}];; + + +external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" [@@unboxed] +[%%expect{| +Line 1, characters 40-42: +1 | external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" [@@unboxed] + ^^ +Error: Don't know how to unbox this type. + Only float, int32, int64, nativeint, vector primitives, and + concrete unboxed types can be marked unboxed. +|}];; + + +external[@layout_poly] id : ('a : any). ('a[@unboxed]) -> 'a = "%identity" +[%%expect{| +Line 1, characters 41-43: +1 | external[@layout_poly] id : ('a : any). ('a[@unboxed]) -> 'a = "%identity" + ^^ +Error: Don't know how to unbox this type. + Only float, int32, int64, nativeint, vector primitives, and + concrete unboxed types can be marked unboxed. +|}];; + +(* module and abstract types *) +module M : sig + type t : float64 +end = struct + type t = float# +end + +external f_1 : M.t -> M.t = "%identity";; +[%%expect{| +module M : sig type t : float64 end +Line 7, characters 15-18: +7 | external f_1 : M.t -> M.t = "%identity";; + ^^^ +Warning 187 [incompatible-with-upstream]: [@unboxed] attribute must be added to external declaration +argument type with layout float64 for upstream compatibility. + +Line 7, characters 22-25: +7 | external f_1 : M.t -> M.t = "%identity";; + ^^^ +Warning 187 [incompatible-with-upstream]: [@unboxed] attribute must be added to external declaration +argument type with layout float64 for upstream compatibility. + +external f_1 : M.t -> M.t = "%identity" [@@unboxed] +|}];; + +external f_2 : M.t -> M.t = "%identity" [@@unboxed];; +[%%expect{| +Line 1, characters 15-18: +1 | external f_2 : M.t -> M.t = "%identity" [@@unboxed];; + ^^^ +Warning 187 [incompatible-with-upstream]: External declaration here is not upstream compatible. +The only types with non-value layouts allowed are float#, +int32#, int64#, and nativeint#. Unknown type with layout +float64 encountered. + +Line 1, characters 22-25: +1 | external f_2 : M.t -> M.t = "%identity" [@@unboxed];; + ^^^ +Warning 187 [incompatible-with-upstream]: External declaration here is not upstream compatible. +The only types with non-value layouts allowed are float#, +int32#, int64#, and nativeint#. Unknown type with layout +float64 encountered. + +external f_2 : M.t -> M.t = "%identity" [@@unboxed] +|}];; + +module M2 : sig + type t = float# +end = struct + type t = float# +end + +external f_3 : M2.t -> M2.t = "%identity" [@@unboxed];; +[%%expect{| +module M2 : sig type t = float# end +external f_3 : M2.t -> M2.t = "%identity" [@@unboxed] +|}];; + +(* should also work with private types *) +module M3 : sig + type t = private float# +end = struct + type t = float# +end + +external f_4 : M3.t -> M3.t = "%identity" [@@unboxed] +[%%expect{| +module M3 : sig type t = private float# end +external f_4 : M3.t -> M3.t = "%identity" [@@unboxed] +|}];; + +(* Disabling warnings *) + +module M4 : sig + [@@@warning "-187"] + type ('a : immediate) t = Something of 'a + + val f : ('a : immediate). 'a t -> 'a +end = struct + [@@@warning "-187"] + + type ('a : immediate) t = Something of 'a + + let f (Something x) = x +end;; + +[%%expect{| +module M4 : + sig + type ('a : immediate) t = Something of 'a + val f : ('a : immediate). 'a t -> 'a + end +|}] + +module[@warning "-187"] M5 = struct + let f (type a : immediate): a -> a = fun x -> x +end;; + +[%%expect{| +module M5 : sig val f : ('a : immediate). 'a -> 'a end +|}] + +(* Just disabling the warning on the expression level doesn't work + if the declaration has a type variable annotation. *) + +let[@warning "-187"] fails (type a : immediate): a -> a = fun x -> x +;; + +[%%expect{| +Line 1, characters 21-26: +1 | let[@warning "-187"] fails (type a : immediate): a -> a = fun x -> x + ^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in fails +can't be erased for compatibility with upstream OCaml. + +val fails : ('a : immediate). 'a -> 'a = +|}] + +module type S1 = sig + type ('a : immediate) fails = int [@@warning "-187"] +end;; + +[%%expect{| +Line 2, characters 2-54: +2 | type ('a : immediate) fails = int [@@warning "-187"] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in fails +can't be erased for compatibility with upstream OCaml. + +module type S1 = sig type ('a : immediate) fails = int end +|}] + +(* Disabling the warning just in the signature isn't sufficient. *) +module M6 : sig + [@@@warning "-187"] + type ('a : immediate) t = 'a * 'a +end = struct + type ('a : immediate) t = 'a * 'a +end;; +[%%expect{| +Line 5, characters 2-35: +5 | type ('a : immediate) t = 'a * 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 187 [incompatible-with-upstream]: Usage of layout immediate/immediate64 in t +can't be erased for compatibility with upstream OCaml. + +module M6 : sig type ('a : immediate) t = 'a * 'a end +|}] + +(* More disabled warnings. *) +external[@warning "-187"] f_ok : int -> bool -> int64# = "foo" "bar";; + +[%%expect{| +external f_ok : int -> bool -> (int64# [@unboxed]) = "foo" "bar" +|}] + +external f_2_ok : M.t -> M.t = "%identity" [@@unboxed] [@@warning "-187"];; + +[%%expect{| +external f_2_ok : M.t -> M.t = "%identity" [@@unboxed] +|}] diff --git a/testsuite/tests/typing-layouts/error_message_attr.ml b/testsuite/tests/typing-layouts/error_message_attr.ml new file mode 100644 index 00000000000..77d315f389e --- /dev/null +++ b/testsuite/tests/typing-layouts/error_message_attr.ml @@ -0,0 +1,284 @@ +(* TEST + include stdlib_upstream_compatible; + flags = "-extension layouts_alpha"; + expect; +*) + +module Float_u = Stdlib_upstream_compatible.Float_u + +[%%expect{| +module Float_u = Stdlib_upstream_compatible.Float_u +|}] + +(* Needs a string payload *) + +let f (v: float#): ((_ : value)[@error_message]) = v +[%%expect{| +Line 1, characters 31-47: +1 | let f (v: float#): ((_ : value)[@error_message]) = v + ^^^^^^^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'error_message'. +error_message attribute expects a string argument + +Line 1, characters 51-52: +1 | let f (v: float#): ((_ : value)[@error_message]) = v + ^ +Error: This expression has type float# but an expression was expected of type + ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of the annotation on the wildcard _ at line 1, characters 20-31. +|}] + +let f (v: float#): ((_ : value)[@error_message 1]) = v +[%%expect{| +Line 1, characters 31-49: +1 | let f (v: float#): ((_ : value)[@error_message 1]) = v + ^^^^^^^^^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'error_message'. +error_message attribute expects a string argument + +Line 1, characters 53-54: +1 | let f (v: float#): ((_ : value)[@error_message 1]) = v + ^ +Error: This expression has type float# but an expression was expected of type + ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of the annotation on the wildcard _ at line 1, characters 20-31. +|}] + +(* Ltyp_var { name = None; layout } case *) +let f (v: float#): ((_ : value)[@error_message "Custom message"]) = v +[%%expect{| +Line 1, characters 68-69: +1 | let f (v: float#): ((_ : value)[@error_message "Custom message"]) = v + ^ +Error: This expression has type float# but an expression was expected of type + ('a : value) + The layout of float# is float64 + because it is the primitive float64 type float#. + But the layout of float# must be a sublayout of value + because of the annotation on the wildcard _ at line 1, characters 20-31. + Custom message +|}] + +let f x = + ignore ((x : (_ : value)[@error_message "Custom message"])); + Float_u.to_float x +[%%expect{| +Line 3, characters 19-20: +3 | Float_u.to_float x + ^ +Error: This expression has type ('a : value) + but an expression was expected of type Float_u.t = float# + The layout of Float_u.t is float64 + because it is the primitive float64 type float#. + But the layout of Float_u.t must be a sublayout of value + because of the annotation on the wildcard _ at line 2, characters 15-26. + Custom message +|}] + +(* Ltyp_var { name = Some name; layout } case *) +module type a = sig + type ('a : float64) t = 'a + val f : (('a : value)[@error_message "Custom message"]) -> 'a t +end + +[%%expect{| +Line 3, characters 61-63: +3 | val f : (('a : value)[@error_message "Custom message"]) -> 'a t + ^^ +Error: This type ('a : value) should be an instance of type ('b : float64) + The layout of 'a is value + because of the annotation on the type variable 'a. + Custom message + But the layout of 'a must overlap with float64 + because of the definition of t at line 2, characters 2-28. +|}] + + +(* Ltyp_alias { aliased_type; name; layout } case *) + +(* First call to [layout_of_annotation] in [transl_type_alias] *) +module type a = sig + type t : float64 + val f : 'a -> t -> (t as ('a : value)[@error_message "Custom message"]) +end +[%%expect{| +Line 3, characters 33-38: +3 | val f : 'a -> t -> (t as ('a : value)[@error_message "Custom message"]) + ^^^^^ +Error: Bad layout annotation: + The layout of t is float64 + because of the definition of t at line 2, characters 2-18. + But the layout of t must be a sublayout of value + because of the annotation on the type variable 'a. + Custom message +|}] + +(* Second call to [layout_of_annotation] in the Not_found case + of [transl_type_alias] *) +module type a = sig + type t : float64 + val f : t -> (t as ('a : value)[@error_message "Custom message"]) +end +[%%expect{| +Line 3, characters 16-33: +3 | val f : t -> (t as ('a : value)[@error_message "Custom message"]) + ^^^^^^^^^^^^^^^^^ +Error: This alias is bound to type t but is used as an instance of type + ('a : value) + The layout of t is float64 + because of the definition of t at line 2, characters 2-18. + But the layout of t must be a sublayout of value + because of the annotation on the type variable 'a. + Custom message +|}] + +(* Third call to [layout_of_annotation] in the None case + of [transl_type_alias] *) +module type a = sig + type t : float64 + val f : t -> (t as (_ : value)[@error_message "Custom message"]) +end +[%%expect{| +Line 3, characters 26-31: +3 | val f : t -> (t as (_ : value)[@error_message "Custom message"]) + ^^^^^ +Error: Bad layout annotation: + The layout of t/2 is float64 + because of the definition of t at line 2, characters 2-18. + But the layout of t/2 must be a sublayout of value + because of the annotation on the wildcard _ at line 3, characters 26-31. + Custom message +|}] + +(* Currently it's not possible to attach attributes to Ltyp_poly *) + +(* *************************************************************** *) +(* Tests for [@error_message] applied to [Pexp_constraint]. + Seperate implementation from when it's applied to layout annotations. *) + +(* Needs a string body *) +let f (x : bool) = (x : int)[@error_message] +[%%expect{| +Line 1, characters 28-44: +1 | let f (x : bool) = (x : int)[@error_message] + ^^^^^^^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'error_message'. +error_message attribute expects a string argument + +Line 1, characters 20-21: +1 | let f (x : bool) = (x : int)[@error_message] + ^ +Error: This expression has type bool but an expression was expected of type + int +|}] + +(* Can only be applied once *) +let f (x : bool) = (x : int)[@error_message "A"][@error_message "B"] +[%%expect{| +Line 1, characters 20-21: +1 | let f (x : bool) = (x : int)[@error_message "A"][@error_message "B"] + ^ +Error: This expression has type bool but an expression was expected of type + int + A +|}] + +(* Simple test case *) +let f (x : bool) = (x : int)[@error_message "custom message"] +[%%expect{| +Line 1, characters 20-21: +1 | let f (x : bool) = (x : int)[@error_message "custom message"] + ^ +Error: This expression has type bool but an expression was expected of type + int + custom message +|}] + +(* Doesn't work when the type mismatch happens later. This differs from + the layout annotation case. *) +let f x: bool = (x : int)[@error_message "custom message"] +[%%expect{| +Line 1, characters 16-25: +1 | let f x: bool = (x : int)[@error_message "custom message"] + ^^^^^^^^^ +Error: This expression has type int but an expression was expected of type + bool +|}] + +(* Doesn't apply when the type error is from elsewhere within the expression *) +let g (x : int) = x +let f (x : bool) = (let y = false in g y : int)[@error_message "custom message"] +[%%expect{| +val g : int -> int = +Line 2, characters 39-40: +2 | let f (x : bool) = (let y = false in g y : int)[@error_message "custom message"] + ^ +Error: This expression has type bool but an expression was expected of type + int +|}] + +(* Can be used to enforce layouts but not great *) +let f (x : string) = (x : (_ : immediate))[@error_message "custom message"] +[%%expect{| +Line 1, characters 22-23: +1 | let f (x : string) = (x : (_ : immediate))[@error_message "custom message"] + ^ +Error: This expression has type string but an expression was expected of type + ('a : immediate) + custom message + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the annotation on the wildcard _ at line 1, characters 26-41. +|}] + +(* Doesn't apply when the mismatch is deep *) +let f () = (fun (x: int) -> x : string -> string)[@error_message "custom message"] +[%%expect{| +Line 1, characters 16-24: +1 | let f () = (fun (x: int) -> x : string -> string)[@error_message "custom message"] + ^^^^^^^^ +Error: This pattern matches values of type int + but a pattern was expected which matches values of type string +|}] + +let f () = (fun (x: int) -> x : string)[@error_message "custom message"] +[%%expect{| +Line 1, characters 12-29: +1 | let f () = (fun (x: int) -> x : string)[@error_message "custom message"] + ^^^^^^^^^^^^^^^^^ +Error: This expression should not be a function, the expected type is + string + custom message +|}] + +(* Same when the function is not declared inline *) +let g (x: int) = x +let f () = (g : (string -> string))[@error_message "custom message"] +[%%expect{| +val g : int -> int = +Line 2, characters 12-13: +2 | let f () = (g : (string -> string))[@error_message "custom message"] + ^ +Error: This expression has type int -> int + but an expression was expected of type string -> string + Type int is not compatible with type string +|}] + +let g (x: int) = x +let f () = (g : string)[@error_message "custom message"] +[%%expect{| +val g : int -> int = +Line 2, characters 12-13: +2 | let f () = (g : string)[@error_message "custom message"] + ^ +Error: This expression has type int -> int + but an expression was expected of type string + custom message +|}] diff --git a/testsuite/tests/typing-layouts/immediates.ml b/testsuite/tests/typing-layouts/immediates.ml new file mode 100644 index 00000000000..1996fa9367c --- /dev/null +++ b/testsuite/tests/typing-layouts/immediates.ml @@ -0,0 +1,128 @@ +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + + + + + + + + +*) + +(* This tests some example uses of immediates in both native and bytecode. *) + +(*****************************************) +(* Prelude: Some immediate types. *) + +type a : immediate = A | B | C + +(*********************************) +(* Test 1: higher-order function *) + +let[@inline never] test1 (f : ('a : immediate). 'a -> 'a) = + match f 4 + f 5, f A with + | x, A -> Printf.printf "Test 1: %d\n" (x + 1) + | _, (B | C) -> assert false + +let () = test1 (fun x -> x) + +(****************************************) +(* Test 2: exercising the write barrier *) + +type 'a mut = + { mutable x : 'a } + +type ('a : immediate) mut_imm = + { mutable x_imm : 'a } + +type ('a : immediate64) mut_imm64 = + { mutable x_imm64 : 'a } + +let[@inline never] update_with_write_barrier (type a) (m : a mut) (x : a) = + m.x <- x +;; + +let[@inline never] update_1 (type (a : immediate)) (m : a mut) (x : a) = + m.x <- x +;; + +let[@inline never] update_2 (type (a : immediate64)) (m : a mut) (x : a) = + m.x <- x +;; + +let[@inline never] update_imm (type (a : immediate)) (m : a mut_imm) (x : a) = + m.x_imm <- x +;; + +let[@inline never] update_imm64 (type (a : immediate64)) (m : a mut_imm64) (x : a) = + m.x_imm64 <- x +;; + +let[@inline never] test2 x = + Printf.printf "Test 2: original value: %d\n" x; + let mut_non_imm = { x = [||] } in + let mut = { x } in + let mut_imm = { x_imm = x } in + let mut_imm64 = { x_imm64 = x } in + Gc.full_major (); + (* Exercise the write barrier by making something on the major heap point + back to the minor heap. + *) + update_with_write_barrier mut_non_imm [| x |]; + Printf.printf " 1. mut_non_imm.x.(0): %d\n" mut_non_imm.x.(0); + update_with_write_barrier mut x; + Printf.printf " 2. mut.x: %d\n" mut.x; + update_1 mut x; + Printf.printf " 3. mut.x: %d\n" mut.x; + update_2 mut (x+1); + update_imm mut_imm (x+2); + update_imm64 mut_imm64 (x+3); + Gc.full_major (); + Printf.printf " 4. mut_non_imm.x.(0): %d\n" mut_non_imm.x.(0); + Printf.printf " 5. mut.x: %d\n" mut.x; + Printf.printf " 6. mut_imm.x_imm: %d\n" mut_imm.x_imm; + Printf.printf " 7. mut_imm64.x_imm64: %d\n" mut_imm64.x_imm64; +;; + +let () = test2 123_456_789_000 + +(* TEST + reference = "${test_source_directory}/immediates.reference"; + flambda2; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + }{ + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + flags = "-extension-universe no_extensions"; + compiler_reference = "${test_source_directory}/immediates_disabled.compilers.reference"; + ocamlc.byte; + check-ocamlc.byte-output; + } +*) diff --git a/testsuite/tests/typing-layouts/immediates.reference b/testsuite/tests/typing-layouts/immediates.reference new file mode 100644 index 00000000000..74ef890b386 --- /dev/null +++ b/testsuite/tests/typing-layouts/immediates.reference @@ -0,0 +1,9 @@ +Test 1: 10 +Test 2: original value: 123456789000 + 1. mut_non_imm.x.(0): 123456789000 + 2. mut.x: 123456789000 + 3. mut.x: 123456789000 + 4. mut_non_imm.x.(0): 123456789000 + 5. mut.x: 123456789001 + 6. mut_imm.x_imm: 123456789002 + 7. mut_imm64.x_imm64: 123456789003 diff --git a/testsuite/tests/typing-layouts/immediates_disabled.compilers.reference b/testsuite/tests/typing-layouts/immediates_disabled.compilers.reference new file mode 100644 index 00000000000..67265191bbd --- /dev/null +++ b/testsuite/tests/typing-layouts/immediates_disabled.compilers.reference @@ -0,0 +1,4 @@ +File "immediates.ml", line 29, characters 0-30: +29 | type a : immediate = A | B | C + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The extension "layouts" is disabled and cannot be used diff --git a/testsuite/tests/typing-layouts/invalid_integer_literals.compilers.reference b/testsuite/tests/typing-layouts/invalid_integer_literals.compilers.reference index e89dd66e750..ce5b9a4129e 100644 --- a/testsuite/tests/typing-layouts/invalid_integer_literals.compilers.reference +++ b/testsuite/tests/typing-layouts/invalid_integer_literals.compilers.reference @@ -3,5 +3,5 @@ Line 6, characters 44-47: 6 | let unboxed_integers_must_have_a_modifier = #42 ^^^ -Error: Syntax error: unboxed integer literal with type-specifying suffix expected. +Error: Syntax error: Unboxed integer literals require width suffixes. diff --git a/testsuite/tests/typing-layouts/invalid_integer_literals.ml b/testsuite/tests/typing-layouts/invalid_integer_literals.ml index 85817c1f034..94e3543fd5b 100644 --- a/testsuite/tests/typing-layouts/invalid_integer_literals.ml +++ b/testsuite/tests/typing-layouts/invalid_integer_literals.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension layouts_alpha" - * toplevel + flags = "-extension layouts_alpha"; + toplevel; *) let unboxed_integers_must_have_a_modifier = #42 diff --git a/testsuite/tests/typing-layouts/jkinds.ml b/testsuite/tests/typing-layouts/jkinds.ml new file mode 100644 index 00000000000..99e0ae956e7 --- /dev/null +++ b/testsuite/tests/typing-layouts/jkinds.ml @@ -0,0 +1,1601 @@ +(* TEST + flags = "-extension small_numbers"; + expect; +*) + +(********************************) +(* Test 1: Unimplemented syntax *) + +type 'a list : immutable_data with 'a + +[%%expect{| +>> Fatal error: XXX unimplemented +Uncaught exception: Misc.Fatal_error + +|}] + +type ('a, 'b) either : immutable_data with 'a * 'b + +[%%expect{| +>> Fatal error: XXX unimplemented +Uncaught exception: Misc.Fatal_error + +|}] + +type 'a gel : kind_of_ 'a mod global + +[%%expect{| +>> Fatal error: XXX unimplemented +Uncaught exception: Misc.Fatal_error + +|}] + +type 'a t : _ + +[%%expect{| +>> Fatal error: XXX unimplemented +Uncaught exception: Misc.Fatal_error + +|}] + +kind_abbrev_ immediate = value mod global unique many sync uncontended + +[%%expect{| +>> Fatal error: kind_abbrev not supported! +Uncaught exception: Misc.Fatal_error + +|}] + +kind_abbrev_ immutable_data = value mod sync uncontended many + +[%%expect{| +>> Fatal error: kind_abbrev not supported! +Uncaught exception: Misc.Fatal_error + +|}] + +kind_abbrev_ immutable = value mod uncontended + +[%%expect{| +>> Fatal error: kind_abbrev not supported! +Uncaught exception: Misc.Fatal_error + +|}] + +kind_abbrev_ data = value mod sync many + +[%%expect{| +>> Fatal error: kind_abbrev not supported! +Uncaught exception: Misc.Fatal_error + +|}] + +module type S = sig + type 'a list : immutable_data with 'a + type ('a, 'b) either : immutable_data with 'a * 'b + type 'a gel : kind_of_ 'a mod global + type 'a t : _ + kind_abbrev_ immediate = value mod global unique many sync uncontended + kind_abbrev_ immutable_data = value mod sync uncontended many + kind_abbrev_ immutable = value mod uncontended + kind_abbrev_ data = value mod sync many +end + +[%%expect{| +>> Fatal error: XXX unimplemented +Uncaught exception: Misc.Fatal_error + +|}] + +(**************************************) +(* Test 2: Subkind relationships hold *) + +(* type a : ka + type b : kb = a + typechecks iff ka <= kb *) +type a : value +type b : value = a +[%%expect{| +type a : value +type b = a +|}] + +type a : value +type b : any = a +[%%expect{| +type a : value +type b = a +|}] + +type a : any +type b : value = a +[%%expect{| +type a : any +Line 2, characters 0-18: +2 | type b : value = a + ^^^^^^^^^^^^^^^^^^ +Error: The layout of type a is any + because of the definition of a at line 1, characters 0-12. + But the layout of type a must be a sublayout of value + because of the definition of b at line 2, characters 0-18. +|}] + +type a : float32 +type b : float32 = a +[%%expect{| +type a : float32 +type b = a +|}] + +type a : float32 +type b : any = a +[%%expect{| +type a : float32 +type b = a +|}] + +type a : any +type b : float32 = a +[%%expect{| +type a : any +Line 2, characters 0-20: +2 | type b : float32 = a + ^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type a is any + because of the definition of a at line 1, characters 0-12. + But the layout of type a must be a sublayout of float32 + because of the definition of b at line 2, characters 0-20. +|}] + +type a : float32 +type b : word = a +[%%expect{| +type a : float32 +Line 2, characters 0-17: +2 | type b : word = a + ^^^^^^^^^^^^^^^^^ +Error: The layout of type a is float32 + because of the definition of a at line 1, characters 0-16. + But the layout of type a must be a sublayout of word + because of the definition of b at line 2, characters 0-17. +|}] + +type a : value mod local +type b : value mod local = a +[%%expect{| +type a : value mod local +type b = a +|}] + +type a : value mod global +type b : value mod local = a +[%%expect{| +type a : value mod global +type b = a +|}] + +type a : value mod global +type b : value mod global = a +[%%expect{| +type a : value mod global +type b = a +|}] + +type a : value mod local +type b : value mod global = a +[%%expect{| +type a : value mod local +Line 2, characters 0-29: +2 | type b : value mod global = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is value + because of the definition of a at line 1, characters 0-24. + But the kind of type a must be a subkind of value mod global + because of the definition of b at line 2, characters 0-29. +|}] + +type a : value mod global +type b : any mod local = a +[%%expect{| +type a : value mod global +type b = a +|}] + +type a : value mod global +type b : float32 mod local = a +[%%expect{| +type a : value mod global +Line 2, characters 0-30: +2 | type b : float32 mod local = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type a is value + because of the definition of a at line 1, characters 0-25. + But the layout of type a must be a sublayout of float32 + because of the definition of b at line 2, characters 0-30. +|}] + +type a : value mod global unique many uncontended portable external_ +type b : value mod local shared once contended nonportable internal = a +[%%expect{| +type a : value mod global unique many uncontended portable external_ +type b = a +|}] + +type a : value mod global unique once uncontended portable external_ +type b : value mod local shared many uncontended nonportable internal = a +[%%expect{| +type a : value mod global unique once uncontended portable external_ +Line 2, characters 0-73: +2 | type b : value mod local shared many uncontended nonportable internal = a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type a is + value mod global unique uncontended portable external_ + because of the definition of a at line 1, characters 0-68. + But the kind of type a must be a subkind of value mod many uncontended + because of the definition of b at line 2, characters 0-73. +|}] + +(********************************************************) +(* Test 3: Abbreviation primitives are properly defined *) +(* CR layouts: when we have abbreviations, these tests can become less verbose *) + +type a : any +type b : any mod local shared once contended nonportable internal = a +type c : any mod local shared once contended nonportable internal +type d : any = c +[%%expect{| +type a : any +type b = a +type c : any mod local shared once contended nonportable internal +type d = c +|}] + +type a : value +type b : value mod local shared once contended nonportable internal = a +type c : value mod local shared once contended nonportable internal +type d : value = c +[%%expect{| +type a : value +type b = a +type c : value mod local shared once contended nonportable internal +type d = c +|}] + +type a : void +type b : void mod local shared once contended nonportable internal = a +type c : void mod local shared once contended nonportable internal +type d : void = c +[%%expect{| +Line 1, characters 9-13: +1 | type a : void + ^^^^ +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. +|}] + +type a : immediate +type b : value mod global unique many uncontended portable external_ = a +type c : value mod global unique many uncontended portable external_ +type d : immediate = c +[%%expect{| +type a : immediate +type b = a +type c : value mod global unique many uncontended portable external_ +type d = c +|}] + +type a : immediate64 +type b : value mod global unique many uncontended portable external64 = a +type c : value mod global unique many uncontended portable external64 +type d : immediate64 = c +[%%expect{| +type a : immediate64 +type b = a +type c : value mod global unique many uncontended portable external64 +type d = c +|}] + +type a : float64 +type b : float64 mod global unique many uncontended portable external_ = a +type c : float64 mod global unique many uncontended portable external_ +type d : float64 = c +[%%expect{| +type a : float64 +type b = a +type c : float64 mod global unique many uncontended portable external_ +type d = c +|}] + +type a : float32 +type b : float32 mod global unique many uncontended portable external_ = a +type c : float32 mod global unique many uncontended portable external_ +type d : float32 = c +[%%expect{| +type a : float32 +type b = a +type c : float32 mod global unique many uncontended portable external_ +type d = c +|}] + +type a : word +type b : word mod local shared once contended nonportable internal = a +type c : word mod local shared once contended nonportable internal +type d : word = c +[%%expect{| +type a : word +type b = a +type c : word mod local shared once contended nonportable internal +type d = c +|}] + +type a : bits32 +type b : bits32 mod local shared once contended nonportable internal = a +type c : bits32 mod local shared once contended nonportable internal +type d : bits32 = c +[%%expect{| +type a : bits32 +type b = a +type c : bits32 mod local shared once contended nonportable internal +type d = c +|}] + +type a : bits64 +type b : bits64 mod local shared once contended nonportable internal = a +type c : bits64 mod local shared once contended nonportable internal +type d : bits64 = c +[%%expect{| +type a : bits64 +type b = a +type c : bits64 mod local shared once contended nonportable internal +type d = c +|}] + +(****************************************) +(* Test 4: Appropriate types mode cross *) + +type t : any mod global unique many uncontended portable external_ = int +[%%expect{| +type t = int +|}] + +type t : any mod global unique many uncontended portable external_ = float# +[%%expect{| +type t = float# +|}] + +type t : any mod global unique many uncontended portable external_ = float32# +[%%expect{| +type t = float32# +|}] + +type t : any mod global unique many uncontended portable external_ = int64# +[%%expect{| +type t = int64# +|}] + +type t : any mod global unique many uncontended portable external_ = int32# +[%%expect{| +type t = int32# +|}] + +type t : any mod global unique many uncontended portable external_ = nativeint# +[%%expect{| +type t = nativeint# +|}] + +type indirect_int = int +type t : any mod global unique many uncontended portable external_ = indirect_int +[%%expect{| +type indirect_int = int +type t = indirect_int +|}] + +let x : (_ : value mod uncontended) = 10 +[%%expect {| +val x : int = 10 +|}] + +let f (x : nativeint#) = + let _ : (_ : word mod portable many unique) = x in + () +[%%expect {| +val f : nativeint# -> unit = +|}] + +type t_value : value +[%%expect {| +type t_value : value +|}] + +type t : any mod global = t_value +[%%expect{| +Line 1, characters 0-33: +1 | type t : any mod global = t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t_value is value + because of the definition of t_value at line 1, characters 0-20. + But the kind of type t_value must be a subkind of any mod global + because of the definition of t at line 1, characters 0-33. +|}] + +type t : any mod unique = t_value +[%%expect{| +Line 1, characters 0-33: +1 | type t : any mod unique = t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t_value is value + because of the definition of t_value at line 1, characters 0-20. + But the kind of type t_value must be a subkind of any mod unique + because of the definition of t at line 1, characters 0-33. +|}] + +type t : any mod many = t_value +[%%expect{| +Line 1, characters 0-31: +1 | type t : any mod many = t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t_value is value + because of the definition of t_value at line 1, characters 0-20. + But the kind of type t_value must be a subkind of any mod many + because of the definition of t at line 1, characters 0-31. +|}] + +type t : any mod uncontended = t_value +[%%expect{| +Line 1, characters 0-38: +1 | type t : any mod uncontended = t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t_value is value + because of the definition of t_value at line 1, characters 0-20. + But the kind of type t_value must be a subkind of any mod uncontended + because of the definition of t at line 1, characters 0-38. +|}] + +type t : any mod portable = t_value +[%%expect{| +Line 1, characters 0-35: +1 | type t : any mod portable = t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t_value is value + because of the definition of t_value at line 1, characters 0-20. + But the kind of type t_value must be a subkind of any mod portable + because of the definition of t at line 1, characters 0-35. +|}] + +type t : any mod external_ = t_value +[%%expect{| +Line 1, characters 0-36: +1 | type t : any mod external_ = t_value + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t_value is value + because of the definition of t_value at line 1, characters 0-20. + But the kind of type t_value must be a subkind of any mod external_ + because of the definition of t at line 1, characters 0-36. +|}] + +type ('a : value mod unique) t = { unique_field : 'a } +let x = { unique_field = "string" } +[%%expect {| +type ('a : value mod unique) t = { unique_field : 'a; } +Line 2, characters 25-33: +2 | let x = { unique_field = "string" } + ^^^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : value mod unique) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of value mod unique + because of the definition of t at line 1, characters 0-54. +|}] + +type t : value mod global +let g (x : t) : ('a : value mod global) = x +[%%expect{| +type t : value mod global +val g : t -> t = +|}] + +type t : value mod many +let g (x : t) : ('a : value mod global) = x +[%%expect{| +type t : value mod many +Line 2, characters 42-43: +2 | let g (x : t) : ('a : value mod global) = x + ^ +Error: This expression has type t but an expression was expected of type + ('a : value mod global) + The kind of t is value mod many + because of the definition of t at line 1, characters 0-23. + But the kind of t must be a subkind of value mod global + because of the annotation on the type variable 'a. +|}] + +type t : value mod unique +let f (x : _ as (_ : value mod unique)) = () +let g (x : t) = f x +[%%expect {| +type t : value mod unique +val f : ('a : value mod unique). 'a -> unit = +val g : t -> unit = +|}] + +type t : value mod external64 +let f (x : _ as (_ : value mod unique)) = () +let g (x : t) = f x +[%%expect {| +type t : value mod external64 +val f : ('a : value mod unique). 'a -> unit = +Line 3, characters 18-19: +3 | let g (x : t) = f x + ^ +Error: This expression has type t but an expression was expected of type + ('a : value mod unique) + The kind of t is value mod external64 + because of the definition of t at line 1, characters 0-29. + But the kind of t must be a subkind of value mod unique + because of the definition of f at line 2, characters 6-44. +|}] + +module A : sig + type t : immediate +end = struct + type t = int +end + +type t : immediate = A.t + +[%%expect {| +module A : sig type t : immediate end +type t = A.t +|}] + +module A : sig + type t : value +end = struct + type t = int +end + +type t : immediate = A.t + +[%%expect {| +module A : sig type t : value end +Line 7, characters 0-24: +7 | type t : immediate = A.t + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type A.t is value + because of the definition of t at line 2, characters 2-16. + But the kind of type A.t must be a subkind of immediate + because of the definition of t at line 7, characters 0-24. +|}] + +type t : value = private int +let f (x : t) : _ as (_ : value mod global) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private int +let f (x : t) : _ as (_ : value mod unique) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private int +let f (x : t) : _ as (_ : value mod many) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private int +let f (x : t) : _ as (_ : value mod portable) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private int +let f (x : t) : _ as (_ : value mod uncontended) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private int +let f (x : t) : _ as (_ : value mod external_) = x +[%%expect {| +type t = private int +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t = private int +let f (x : t) : _ as (_ : value mod global) = x +let f (x : t) : _ as (_ : value mod unique) = x +let f (x : t) : _ as (_ : value mod many) = x +let f (x : t) : _ as (_ : value mod portable) = x +let f (x : t) : _ as (_ : value mod uncontended) = x +let f (x : t) : _ as (_ : value mod external_) = x +let f (x : t) : _ as (_ : immediate) = x +[%%expect {| +type t = private int +val f : t -> t = +val f : t -> t = +val f : t -> t = +val f : t -> t = +val f : t -> t = +val f : t -> t = +val f : t -> t = +|}] + +type t : value = private { x : int } [@@unboxed] +let f (x : t) : _ as (_ : value mod global) = x +[%%expect {| +type t : value = private { x : int; } [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private { x : int } [@@unboxed] +let f (x : t) : _ as (_ : value mod unique) = x +[%%expect {| +type t : value = private { x : int; } [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private { x : int } [@@unboxed] +let f (x : t) : _ as (_ : value mod many) = x +[%%expect {| +type t : value = private { x : int; } [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private { x : int } [@@unboxed] +let f (x : t) : _ as (_ : value mod portable) = x +[%%expect {| +type t : value = private { x : int; } [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private { x : int } [@@unboxed] +let f (x : t) : _ as (_ : value mod uncontended) = x +[%%expect {| +type t : value = private { x : int; } [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +type t : value = private { x : int } [@@unboxed] +let f (x : t) : _ as (_ : value mod external_) = x +[%%expect {| +type t : value = private { x : int; } [@@unboxed] +val f : t -> t = +|}] +(* CR layouts v2.8: This should fail since t is nominative *) + +(************************************) +(* Test 5: Mode crossing of records *) + +type t : any mod global = { x : string } +[%%expect{| +Line 1, characters 0-40: +1 | type t : any mod global = { x : string } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod global + because of the annotation on the declaration of the type t. +|}] + +type t : any mod unique = { x : string } +[%%expect{| +Line 1, characters 0-40: +1 | type t : any mod unique = { x : string } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod unique + because of the annotation on the declaration of the type t. +|}] + +type t : any mod external_ = { x : string } +[%%expect{| +Line 1, characters 0-43: +1 | type t : any mod external_ = { x : string } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod external_ + because of the annotation on the declaration of the type t. +|}] + +type t : any mod many = { x : string } +type t : any mod portable = { x : string } +type t : any mod uncontended = { x : string } +[%%expect {| +Line 1, characters 0-38: +1 | type t : any mod many = { x : string } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod many + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: This should be accepted *) + +type t : any mod many = { x : t_value } +[%%expect{| +Line 1, characters 0-39: +1 | type t : any mod many = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod many + because of the annotation on the declaration of the type t. +|}] + +type t : any mod uncontended = { x : t_value } +[%%expect{| +Line 1, characters 0-46: +1 | type t : any mod uncontended = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod uncontended + because of the annotation on the declaration of the type t. +|}] + +type t : any mod portable = { x : t_value } +[%%expect{| +Line 1, characters 0-43: +1 | type t : any mod portable = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod portable + because of the annotation on the declaration of the type t. +|}] + +type t : any mod many uncontended portable global = { x : t_value } +[%%expect{| +Line 1, characters 0-67: +1 | type t : any mod many uncontended portable global = { x : t_value } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of + any mod global many uncontended portable + because of the annotation on the declaration of the type t. +|}] + +type u : immediate +type t : value mod portable many uncontended = { x : string; y : int; z : u } +[%%expect {| +type u : immediate +Line 2, characters 0-77: +2 | type t : value mod portable many uncontended = { x : string; y : int; z : u } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of + value mod many uncontended portable + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: This should be accepted *) + +type t = { x : string } +let foo : _ as (_ : value mod external_) = { x = "string" } +[%%expect {| +type t = { x : string; } +Line 2, characters 43-59: +2 | let foo : _ as (_ : value mod external_) = { x = "string" } + ^^^^^^^^^^^^^^^^ +Error: This expression has type t but an expression was expected of type + ('a : value mod external_) + The kind of t is value + because of the definition of t at line 1, characters 0-23. + But the kind of t must be a subkind of value mod external_ + because of the annotation on the wildcard _ at line 2, characters 20-39. +|}] + +type t : any mod uncontended = { x : int } +type t : any mod portable = { x : int } +type t : any mod many = { x : int } +[%%expect{| +Line 1, characters 0-42: +1 | type t : any mod uncontended = { x : int } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod uncontended + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type t : any mod global = { x : int } +[%%expect {| +Line 1, characters 0-37: +1 | type t : any mod global = { x : int } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod global + because of the annotation on the declaration of the type t. +|}] + +type t : any mod external_ = { x : int } +[%%expect {| +Line 1, characters 0-40: +1 | type t : any mod external_ = { x : int } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod external_ + because of the annotation on the declaration of the type t. +|}] + +type t : any mod unique = { x : int } +[%%expect {| +Line 1, characters 0-37: +1 | type t : any mod unique = { x : int } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of any mod unique + because of the annotation on the declaration of the type t. +|}] + +type t : any mod global = { x : int } [@@unboxed] +type t : any mod portable = { x : int } [@@unboxed] +type t : any mod uncontended = { x : int } [@@unboxed] +type t : any mod external_ = { x : int } [@@unboxed] +type t : any mod many = { x : int } [@@unboxed] +type t : any mod unique = { x : int } [@@unboxed] +type t : immediate = { x : int } [@@unboxed] +[%%expect {| +type t : any mod global = { x : int; } [@@unboxed] +type t : any mod portable = { x : int; } [@@unboxed] +type t : any mod uncontended = { x : int; } [@@unboxed] +type t : any mod external_ = { x : int; } [@@unboxed] +type t : any mod many = { x : int; } [@@unboxed] +type t : any mod unique = { x : int; } [@@unboxed] +type t : immediate = { x : int; } [@@unboxed] +|}] + +type ('a : immediate) t : any mod global = { x : 'a } [@@unboxed] +type ('a : immediate) t : any mod portable = { x : 'a } [@@unboxed] +type ('a : immediate) t : any mod uncontended = { x : 'a } [@@unboxed] +type ('a : immediate) t : any mod external_ = { x : 'a } [@@unboxed] +type ('a : immediate) t : any mod many = { x : 'a } [@@unboxed] +type ('a : immediate) t : any mod unique = { x : 'a } [@@unboxed] +type ('a : immediate) t : immediate = { x : 'a } [@@unboxed] +[%%expect {| +type ('a : immediate) t : any mod global = { x : 'a; } [@@unboxed] +type ('a : immediate) t : any mod portable = { x : 'a; } [@@unboxed] +type ('a : immediate) t : any mod uncontended = { x : 'a; } [@@unboxed] +type ('a : immediate) t : any mod external_ = { x : 'a; } [@@unboxed] +type ('a : immediate) t : any mod many = { x : 'a; } [@@unboxed] +type ('a : immediate) t : any mod unique = { x : 'a; } [@@unboxed] +type ('a : immediate) t : immediate = { x : 'a; } [@@unboxed] +|}] + +type u : value +[%%expect {| +type u : value +|}] + +type t : any mod global = { x : u } [@@unboxed] +[%%expect {| +Line 1, characters 0-47: +1 | type t : any mod global = { x : u } [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because of the definition of u at line 1, characters 0-14. + But the kind of type t must be a subkind of any mod global + because of the annotation on the declaration of the type t. +|}] + +type t : any mod portable = { x : u } [@@unboxed] +[%%expect {| +Line 1, characters 0-49: +1 | type t : any mod portable = { x : u } [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because of the definition of u at line 1, characters 0-14. + But the kind of type t must be a subkind of any mod portable + because of the annotation on the declaration of the type t. +|}] + +type t : any mod uncontended = { x : u } [@@unboxed] +[%%expect {| +Line 1, characters 0-52: +1 | type t : any mod uncontended = { x : u } [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because of the definition of u at line 1, characters 0-14. + But the kind of type t must be a subkind of any mod uncontended + because of the annotation on the declaration of the type t. +|}] + +type t : any mod external_ = { x : u } [@@unboxed] +[%%expect {| +Line 1, characters 0-50: +1 | type t : any mod external_ = { x : u } [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because of the definition of u at line 1, characters 0-14. + But the kind of type t must be a subkind of any mod external_ + because of the annotation on the declaration of the type t. +|}] + +type t : any mod many = { x : u } [@@unboxed] +[%%expect {| +Line 1, characters 0-45: +1 | type t : any mod many = { x : u } [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because of the definition of u at line 1, characters 0-14. + But the kind of type t must be a subkind of any mod many + because of the annotation on the declaration of the type t. +|}] + +type t : any mod unique = { x : u } [@@unboxed] +[%%expect {| +Line 1, characters 0-47: +1 | type t : any mod unique = { x : u } [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because of the definition of u at line 1, characters 0-14. + But the kind of type t must be a subkind of any mod unique + because of the annotation on the declaration of the type t. +|}] + +type t : value mod global = { x : int } [@@unboxed] +let f (x : _ as (_ : immediate)) : (_ as (_ : value mod many)) = x.x +let v : (int as (_ : value mod portable)) = f { x = 5 } +[%%expect {| +type t : value mod global = { x : int; } [@@unboxed] +val f : t -> int = +val v : int = 5 +|}] + +type ('a : immediate) t : value mod many portable = { mutable x : 'a } +[%%expect {| +Line 1, characters 0-70: +1 | type ('a : immediate) t : value mod many portable = { mutable x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod many portable + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type ('a : immediate) t : value mod global = { mutable x : 'a } +[%%expect {| +Line 1, characters 0-63: +1 | type ('a : immediate) t : value mod global = { mutable x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] + +type ('a : immediate) t : value mod unique = { mutable x : 'a } +[%%expect {| +Line 1, characters 0-63: +1 | type ('a : immediate) t : value mod unique = { mutable x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod unique + because of the annotation on the declaration of the type t. +|}] + +type ('a : immediate) t : value mod uncontended = { mutable x : 'a } +[%%expect {| +Line 1, characters 0-68: +1 | type ('a : immediate) t : value mod uncontended = { mutable x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod uncontended + because of the annotation on the declaration of the type t. +|}] + +type ('a : immediate) t : value mod external_ = { mutable x : 'a } +[%%expect {| +Line 1, characters 0-66: +1 | type ('a : immediate) t : value mod external_ = { mutable x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod external_ + because of the annotation on the declaration of the type t. +|}] + +type ('a : immediate) t : value mod external64 = { mutable x : 'a } +[%%expect {| +Line 1, characters 0-67: +1 | type ('a : immediate) t : value mod external64 = { mutable x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod external64 + because of the annotation on the declaration of the type t. +|}] + +(*************************************) +(* Test 6: Mode crossing of variants *) + +type t : any mod global = Foo | Bar +type t : any mod unique = Foo | Bar +type t : any mod many = Foo | Bar +type t : any mod portable = Foo | Bar +type t : any mod uncontended = Foo | Bar +type t : any mod external_ = Foo | Bar +[%%expect {| +type t = Foo | Bar +type t = Foo | Bar +type t = Foo | Bar +type t = Foo | Bar +type t = Foo | Bar +type t = Foo | Bar +|}] +(* CR layouts v2.8: These outputs should include kinds *) + +type t : any mod uncontended = Foo of int | Bar +type t : any mod portable = Foo of int | Bar +type t : any mod many = Foo of int | Bar +[%%expect {| +Line 1, characters 0-47: +1 | type t : any mod uncontended = Foo of int | Bar + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of any mod uncontended + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type t : any mod unique = Foo of int | Bar +[%%expect {| +Line 1, characters 0-42: +1 | type t : any mod unique = Foo of int | Bar + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of any mod unique + because of the annotation on the declaration of the type t. +|}] + +type t : any mod global = Foo of int | Bar +[%%expect {| +Line 1, characters 0-42: +1 | type t : any mod global = Foo of int | Bar + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of any mod global + because of the annotation on the declaration of the type t. +|}] + + +type t : any mod external_ = Foo of int | Bar +[%%expect {| +Line 1, characters 0-45: +1 | type t : any mod external_ = Foo of int | Bar + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed variant type. + But the kind of type t must be a subkind of any mod external_ + because of the annotation on the declaration of the type t. +|}] + +type t : any mod portable = Foo of bool [@@unboxed] +let x = (Foo true : _ as (_ : value mod portable uncontended unique)) +[%%expect {| +type t : any mod portable = Foo of bool [@@unboxed] +val x : t = +|}] +(* CR layouts v2.8: This should be rejected once nominative types remember their kinds *) + +type t : value mod global = Foo of int [@@unboxed] +type t : value mod many = Foo of int [@@unboxed] +type t : value mod unique = Foo of int [@@unboxed] +type t : value mod portable = Foo of int [@@unboxed] +type t : value mod uncontended = Foo of int [@@unboxed] +type t : value mod external_ = Foo of int [@@unboxed] +[%%expect {| +type t : value mod global = Foo of int [@@unboxed] +type t : value mod many = Foo of int [@@unboxed] +type t : value mod unique = Foo of int [@@unboxed] +type t : value mod portable = Foo of int [@@unboxed] +type t : value mod uncontended = Foo of int [@@unboxed] +type t : value mod external_ = Foo of int [@@unboxed] +|}] + +type t : any mod portable = Foo of string [@@unboxed] +[%%expect {| +Line 1, characters 0-53: +1 | type t : any mod portable = Foo of string [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it is the primitive value type string. + But the kind of type t must be a subkind of any mod portable + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted portability *) + +(***********************************************) +(* Test 7: Inference with modality annotations *) + +type 'a t : value mod global portable uncontended many unique = + { x : 'a @@ global portable uncontended many unique } [@@unboxed] +[%%expect {| +Lines 1-2, characters 0-67: +1 | type 'a t : value mod global portable uncontended many unique = +2 | { x : 'a @@ global portable uncontended many unique } [@@unboxed] +Error: The kind of type t is value + because it instantiates an unannotated type parameter of t, + defaulted to kind value. + But the kind of type t must be a subkind of + value mod global unique many uncontended portable + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type 'a t : value mod global portable uncontended many unique = + Foo of 'a @@ global portable uncontended many unique [@@unboxed] +[%%expect {| +Lines 1-2, characters 0-66: +1 | type 'a t : value mod global portable uncontended many unique = +2 | Foo of 'a @@ global portable uncontended many unique [@@unboxed] +Error: The kind of type t is value + because it instantiates an unannotated type parameter of t, + defaulted to kind value. + But the kind of type t must be a subkind of + value mod global unique many uncontended portable + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type ('a : value mod global) t : value mod global = { x : 'a @@ global } [@@unboxed] +type ('a : immediate) t : immediate = { x : 'a @@ global } [@@unboxed] +type ('a : value mod global) t : value mod global = { x : 'a @@ local } [@@unboxed] +type ('a : value mod global) t : value mod global = Foo of 'a @@ global [@@unboxed] +type ('a : immediate) t : immediate = Foo of 'a @@ global [@@unboxed] +type ('a : value mod global) t : value mod global = Foo of 'a @@ local [@@unboxed] +[%%expect {| +type ('a : value mod global) t : value mod global = { global_ x : 'a; } [@@unboxed] +type ('a : immediate) t : immediate = { global_ x : 'a; } [@@unboxed] +type ('a : value mod global) t : value mod global = { x : 'a; } [@@unboxed] +type ('a : value mod global) t : value mod global = Foo of global_ 'a [@@unboxed] +type ('a : immediate) t : immediate = Foo of global_ 'a [@@unboxed] +type ('a : value mod global) t : value mod global = Foo of 'a [@@unboxed] +|}] + +type ('a : value mod uncontended many) t : value mod uncontended many unique = + { x : 'a @@ unique } [@@unboxed] +[%%expect {| +Lines 1-2, characters 0-34: +1 | type ('a : value mod uncontended many) t : value mod uncontended many unique = +2 | { x : 'a @@ unique } [@@unboxed] +Error: The kind of type t is value mod many uncontended + because of the annotation on 'a in the declaration of the type t. + But the kind of type t must be a subkind of + value mod unique many uncontended + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type ('a : value mod external_) t : immediate = + Foo of 'a @@ global portable uncontended many unique [@@unboxed] +[%%expect {| +Lines 1-2, characters 0-66: +1 | type ('a : value mod external_) t : immediate = +2 | Foo of 'a @@ global portable uncontended many unique [@@unboxed] +Error: The kind of type t is value mod external_ + because of the annotation on 'a in the declaration of the type t. + But the kind of type t must be a subkind of immediate + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type 'a t : value mod many = { x : 'a @@ many } +type 'a t : value mod uncontended = { x : 'a @@ uncontended } +type 'a t : value mod portable = { x : 'a @@ portable } +[%%expect {| +Line 1, characters 0-47: +1 | type 'a t : value mod many = { x : 'a @@ many } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod many + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted *) + +type 'a t : value mod unique = { x : 'a @@ unique } +[%%expect {| +Line 1, characters 0-51: +1 | type 'a t : value mod unique = { x : 'a @@ unique } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod unique + because of the annotation on the declaration of the type t. +|}] + +type 'a t : value mod global = { x : 'a @@ global } +[%%expect {| +Line 1, characters 0-51: +1 | type 'a t : value mod global = { x : 'a @@ global } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] + +(*****************************) +(* Test 8: Kind intersection *) + +type ('a : value mod unique) t = ('a : value mod global) +type ('a : immediate) t = ('a : value) +type ('a : value) t = ('a : immediate) +type ('a : value mod external_ portable many) t = ('a : value mod uncontended global unique) +type ('a : value) t = ('a : any) +type ('a : value) t = ('a : value) +type ('a : bits32 mod unique) t = ('a : any mod global) +[%%expect {| +type ('a : value mod global unique) t = 'a +type ('a : immediate) t = 'a +type ('a : immediate) t = 'a +type ('a : immediate) t = 'a +type 'a t = 'a +type 'a t = 'a +type ('a : bits32 mod global unique) t = 'a +|}] + +type ('a : bits32) t = ('a : word) +[%%expect {| +Line 1, characters 23-34: +1 | type ('a : bits32) t = ('a : word) + ^^^^^^^^^^^ +Error: This type ('a : word) should be an instance of type ('a0 : bits32) + The layout of 'a is bits32 + because of the annotation on 'a in the declaration of the type t. + But the layout of 'a must overlap with word + because of the annotation on the type variable 'a. +|}] + +let f : ('a : any mod global unique) -> ('a: any mod uncontended) = fun x -> x +let f : ('a : value mod external64) -> ('a: any mod external_) = fun x -> x +let f : ('a : value) -> ('a: immediate) = fun x -> x +[%%expect {| +val f : ('a : value mod global unique uncontended). 'a -> 'a = +val f : ('a : value mod external_). 'a -> 'a = +val f : ('a : immediate). 'a -> 'a = +|}] + +let f : ('a : value) -> ('a: float32) = fun x -> x +[%%expect {| +Line 1, characters 29-36: +1 | let f : ('a : value) -> ('a: float32) = fun x -> x + ^^^^^^^ +Error: Bad layout annotation: + The layout of 'a is value + because of the annotation on the type variable 'a. + But the layout of 'a must overlap with float32 + because of the annotation on the type variable 'a. +|}] + +val x : 'a. ('a : value mod global) +[%%expect {| +Line 1, characters 8-35: +1 | val x : 'a. ('a : value mod global) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was defaulted to have kind value. + But it was inferred to have kind value mod global + because of the annotation on the type variable 'a. +|}] + +(*****************) +(* Test 9: GADTs *) + +type _ t = + | K : (_ : value mod global) t + +let f (type a : value) (x : a t) = + let y : a @@ local = assert false in + match x with + | K -> y + +[%%expect{| +type _ t = K : ('a : value mod global). 'a t +val f : 'a t -> 'a = +|}] + +type _ t = + | A : ('a : immediate) t + | B : ('b : value mod portable) -> ('b : value mod unique) t + | C : _ t + +let f (type a : value) (x : a t) = + let y : a = assert false in + match x with + | A -> + let f (_ : _ as (_ : immediate)) = () in + f y + | B z -> + let f : ('a : value mod portable unique). 'a -> 'a -> _ = fun _ _ -> () in + f y z + | C -> + () + +[%%expect{| +type _ t = + A : ('a : immediate). 'a t + | B : ('b : value mod unique portable). 'b -> 'b t + | C : 'c t +val f : 'a t -> unit = +|}] + +type _ t = + | A : ('a : immediate) t + | B : ('b : value mod portable) -> ('b : value mod unique) t + | C : _ t + +let f (type a : value) (x : a t) = + let y : a = assert false in + match x with + | A -> + let f (_ : _ as (_ : immediate)) = () in + f y + | B z -> + let f : ('a : value mod portable unique). 'a -> 'a -> _ = fun _ _ -> () in + f y z + | C -> + let f (_ : _ as (_ : immediate)) = () in + f y + +[%%expect{| +type _ t = + A : ('a : immediate). 'a t + | B : ('b : value mod unique portable). 'b -> 'b t + | C : 'c t +Line 17, characters 6-7: +17 | f y + ^ +Error: This expression has type a but an expression was expected of type + ('a : immediate) + The kind of a is value + because of the annotation on the abstract type declaration for a. + But the kind of a must be a subkind of immediate + because of the definition of f at line 16, characters 10-41. +|}] + +(********************) +(* Test 10: Objects *) + +type t : value = < > +[%%expect {| +type t = < > +|}] + +type t : value mod global = < > +[%%expect {| +Line 1, characters 0-31: +1 | type t : value mod global = < > + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type < > is value + because it's the type of an object. + But the kind of type < > must be a subkind of value mod global + because of the definition of t at line 1, characters 0-31. +|}] + +let x : (_ as (_ : value)) = object end +[%%expect{| +val x : < > = +|}] + +let x : (_ as (_ : value mod global)) = object end +[%%expect {| +Line 1, characters 40-50: +1 | let x : (_ as (_ : value mod global)) = object end + ^^^^^^^^^^ +Error: This expression has type < > but an expression was expected of type + ('a : value mod global) + The kind of < > is value + because it's the type of an object. + But the kind of < > must be a subkind of value mod global + because of the annotation on the wildcard _ at line 1, characters 19-35. +|}] + +let x : (_ as (_ : value mod many)) = object end +[%%expect {| +Line 1, characters 38-48: +1 | let x : (_ as (_ : value mod many)) = object end + ^^^^^^^^^^ +Error: This expression has type < > but an expression was expected of type + ('a : value mod many) + The kind of < > is value + because it's the type of an object. + But the kind of < > must be a subkind of value mod many + because of the annotation on the wildcard _ at line 1, characters 19-33. +|}] + +let x : (_ as (_ : value mod unique)) = object end +[%%expect {| +Line 1, characters 40-50: +1 | let x : (_ as (_ : value mod unique)) = object end + ^^^^^^^^^^ +Error: This expression has type < > but an expression was expected of type + ('a : value mod unique) + The kind of < > is value + because it's the type of an object. + But the kind of < > must be a subkind of value mod unique + because of the annotation on the wildcard _ at line 1, characters 19-35. +|}] + +let x : (_ as (_ : value mod portable)) = object end +[%%expect {| +Line 1, characters 42-52: +1 | let x : (_ as (_ : value mod portable)) = object end + ^^^^^^^^^^ +Error: This expression has type < > but an expression was expected of type + ('a : value mod portable) + The kind of < > is value + because it's the type of an object. + But the kind of < > must be a subkind of value mod portable + because of the annotation on the wildcard _ at line 1, characters 19-37. +|}] + +let x : (_ as (_ : value mod uncontended)) = object end +[%%expect {| +Line 1, characters 45-55: +1 | let x : (_ as (_ : value mod uncontended)) = object end + ^^^^^^^^^^ +Error: This expression has type < > but an expression was expected of type + ('a : value mod uncontended) + The kind of < > is value + because it's the type of an object. + But the kind of < > must be a subkind of value mod uncontended + because of the annotation on the wildcard _ at line 1, characters 19-40. +|}] + +let x : (_ as (_ : value mod external_)) = object end +[%%expect {| +Line 1, characters 43-53: +1 | let x : (_ as (_ : value mod external_)) = object end + ^^^^^^^^^^ +Error: This expression has type < > but an expression was expected of type + ('a : value mod external_) + The kind of < > is value + because it's the type of an object. + But the kind of < > must be a subkind of value mod external_ + because of the annotation on the wildcard _ at line 1, characters 19-38. +|}] + +(****************************************) +(* Test 11: Inference of type parameter *) + +type 'a t : any = 'a +[%%expect {| +type 'a t = 'a +|}] + +type 'a t : value = 'a +[%%expect {| +type 'a t = 'a +|}] + +type 'a t : value mod global = 'a +[%%expect {| +Line 1, characters 0-33: +1 | type 'a t : value mod global = 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type 'a is value + because of the definition of t at line 1, characters 0-33. + But the kind of type 'a must be a subkind of value mod global + because of the definition of t at line 1, characters 0-33. +|}] +(* CR layouts v2.8: this should be accepted; 'a should be inferred to have kind + value mod global *) + +type 'a t : word = 'a +[%%expect {| +Line 1, characters 0-21: +1 | type 'a t : word = 'a + ^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type 'a is value + because of the definition of t at line 1, characters 0-21. + But the layout of type 'a must be a sublayout of word + because of the definition of t at line 1, characters 0-21. +|}] +(* CR layouts v2.8: this should be accepted; 'a should be inferred to have kind + word *) + +type 'a t : any = private 'a +[%%expect {| +type 'a t = private 'a +|}] + +type 'a t : value = private 'a +[%%expect {| +type 'a t = private 'a +|}] + +type 'a t : value mod global = private 'a +[%%expect {| +Line 1, characters 0-41: +1 | type 'a t : value mod global = private 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type 'a is value + because of the definition of t at line 1, characters 0-41. + But the kind of type 'a must be a subkind of value mod global + because of the definition of t at line 1, characters 0-41. +|}] +(* CR layouts v2.8: this should be accepted; 'a should be inferred to have kind + value mod global *) + +type 'a t : word = private 'a +[%%expect {| +Line 1, characters 0-29: +1 | type 'a t : word = private 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The layout of type 'a is value + because of the definition of t at line 1, characters 0-29. + But the layout of type 'a must be a sublayout of word + because of the definition of t at line 1, characters 0-29. +|}] +(* CR layouts v2.8: this should be accepted; 'a should be inferred to have kind + word *) + +type 'a t : value mod global = Foo of 'a [@@unboxed] +[%%expect {| +Line 1, characters 0-52: +1 | type 'a t : value mod global = Foo of 'a [@@unboxed] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it instantiates an unannotated type parameter of t, + defaulted to kind value. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] +(* CR layouts v2.8: this should be accepted; 'a should be inferred to have kind + value mod global *) + +type 'a t : value mod global = { x : 'a } +[%%expect {| +Line 1, characters 0-41: +1 | type 'a t : value mod global = { x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod global + because of the annotation on the declaration of the type t. +|}] + +type 'a t : value mod many = { x : 'a } +[%%expect {| +Line 1, characters 0-39: +1 | type 'a t : value mod many = { x : 'a } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The kind of type t is value + because it's a boxed record type. + But the kind of type t must be a subkind of value mod many + because of the annotation on the declaration of the type t. +|}] diff --git a/testsuite/tests/typing-layouts/layout_poly.ml b/testsuite/tests/typing-layouts/layout_poly.ml new file mode 100644 index 00000000000..de95f1cd26e --- /dev/null +++ b/testsuite/tests/typing-layouts/layout_poly.ml @@ -0,0 +1,715 @@ +(* TEST + include stdlib_upstream_compatible; + { + flags = "-extension layouts"; + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } +*) + +module F = Stdlib_upstream_compatible.Float_u + +type t_any : any +type ('a : any) t_with_any = 'a +module M_any : sig + type ('a : any) t = private 'a +end = struct + type ('a : any) t = 'a +end +[%%expect{| +module F = Stdlib_upstream_compatible.Float_u +type t_any : any +type ('a : any) t_with_any = 'a +module M_any : sig type ('a : any) t = private 'a end +|}] + +external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" + +let f () = id (assert false : t_any) +[%%expect{| +external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] +Line 3, characters 14-36: +3 | let f () = id (assert false : t_any) + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_any but an expression was expected of type + ('a : '_representable_layout_1) + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the layout polymorphic type in an external declaration + ([@layout_poly] forces all variables of layout 'any' to be + representable at call sites). +|}] + +type ('a : any) t +external[@layout_poly] id : ('a : any). 'a t -> 'a t = "%identity" +let f () = id (assert false : t_any t) +[%%expect{| +type ('a : any) t +external id : ('a : any). 'a t -> 'a t = "%identity" [@@layout_poly] +Line 3, characters 14-38: +3 | let f () = id (assert false : t_any t) + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type t_any t + but an expression was expected of type 'a t + The layout of t_any is any + because of the definition of t_any at line 3, characters 0-16. + But the layout of t_any must be representable + because it's the layout polymorphic type in an external declaration + ([@layout_poly] forces all variables of layout 'any' to be + representable at call sites). +|}] + + +external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +(* This works *) +let () = Format.printf "%f %s\n" (F.to_float (id #1.)) (id "abc"); Format.print_flush () +[%%expect{| +external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] +1.000000 abc +|}] + +module M = struct + let id' x = id x + (* But not this *) + let () = Format.printf "%f %s\n" (F.to_float (id' #1.)) (id' "abc") +end + +(* CR layouts v2.8: The jkind in the error message is wrong. It should really be + ('a : layout float64) *) +[%%expect{| +Line 4, characters 63-68: +4 | let () = Format.printf "%f %s\n" (F.to_float (id' #1.)) (id' "abc") + ^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : float64) + The layout of string is value + because it is the primitive value type string. + But the layout of string must be a sublayout of float64 + because of the definition of id' at line 2, characters 10-18. +|}] + +(********************) +(* Module inclusion *) + +(* External in both *) +module S : sig + external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +end = struct + external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +end + +let g1 () = S.id #1.0 +let g2 () = S.id "abc" + +[%%expect{| +module S : + sig external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] end +val g1 : unit -> float# = +val g2 : unit -> string = +|}] + +type ('a : any) s +module S : sig + external id : ('a : any). 'a s -> 'a s = "%identity" +end = struct + external[@layout_poly] id : ('a : any). 'a s -> 'a s = "%identity" +end + +[%%expect{| +type ('a : any) s +Lines 4-6, characters 6-3: +4 | ......struct +5 | external[@layout_poly] id : ('a : any). 'a s -> 'a s = "%identity" +6 | end +Error: Signature mismatch: + Modules do not match: + sig + external id : ('a : any). 'a s -> 'a s = "%identity" + [@@layout_poly] + end + is not included in + sig external id : ('a : any). 'a s -> 'a s = "%identity" end + Values do not match: + external id : ('a : any). 'a s -> 'a s = "%identity" [@@layout_poly] + is not included in + external id : ('a : any). 'a s -> 'a s = "%identity" + The type 'a s -> 'a s is not compatible with the type 'b s -> 'b s + The layout of 'a is any + because of the definition of id at line 3, characters 2-54. + But the layout of 'a must be representable + because it's the layout polymorphic type in an external declaration + ([@layout_poly] forces all variables of layout 'any' to be + representable at call sites). +|}] + +type ('a : any, 'b : any) s +type t_any : any +module S : sig + external[@layout_poly] id : + ('b : any). (t_any, 'b) s -> (t_any, 'b) s = "%identity" +end = struct + external[@layout_poly] id : + ('a : any) ('b : any). ('a, 'b) s -> ('a, 'b) s = "%identity" +end + +[%%expect{| +type ('a : any, 'b : any) s +type t_any : any +Lines 6-9, characters 6-3: +6 | ......struct +7 | external[@layout_poly] id : +8 | ('a : any) ('b : any). ('a, 'b) s -> ('a, 'b) s = "%identity" +9 | end +Error: Signature mismatch: + Modules do not match: + sig + external id : ('a : any) ('b : any). ('a, 'b) s -> ('a, 'b) s + = "%identity" [@@layout_poly] + end + is not included in + sig + external id : ('b : any). (t_any, 'b) s -> (t_any, 'b) s + = "%identity" [@@layout_poly] + end + Values do not match: + external id : ('a : any) ('b : any). ('a, 'b) s -> ('a, 'b) s + = "%identity" [@@layout_poly] + is not included in + external id : ('b : any). (t_any, 'b) s -> (t_any, 'b) s + = "%identity" [@@layout_poly] + The type ('a, 'b) s -> ('a, 'b) s is not compatible with the type + (t_any, 'c) s -> (t_any, 'c) s + The layout of t_any is any + because of the definition of t_any at line 2, characters 0-16. + But the layout of t_any must be representable + because it's the layout polymorphic type in an external declaration + ([@layout_poly] forces all variables of layout 'any' to be + representable at call sites). +|}] + +type ('a : any, 'b : any) s + +type t_any : any +module S : sig + external[@layout_poly] id : + ('a : any) ('b : any). ('a, 'b) s -> ('a, 'b) s = "%identity" +end = struct + external[@layout_poly] id : + ('b : any). (t_any, 'b) s -> (t_any, 'b) s = "%identity" +end + +[%%expect{| +type ('a : any, 'b : any) s +type t_any : any +Lines 7-10, characters 6-3: + 7 | ......struct + 8 | external[@layout_poly] id : + 9 | ('b : any). (t_any, 'b) s -> (t_any, 'b) s = "%identity" +10 | end +Error: Signature mismatch: + Modules do not match: + sig + external id : ('b : any). (t_any, 'b) s -> (t_any, 'b) s + = "%identity" [@@layout_poly] + end + is not included in + sig + external id : ('a : any) ('b : any). ('a, 'b) s -> ('a, 'b) s + = "%identity" [@@layout_poly] + end + Values do not match: + external id : ('b : any). (t_any, 'b) s -> (t_any, 'b) s + = "%identity" [@@layout_poly] + is not included in + external id : ('a : any) ('b : any). ('a, 'b) s -> ('a, 'b) s + = "%identity" [@@layout_poly] + The type (t_any, 'a) s -> (t_any, 'a) s + is not compatible with the type ('b, 'c) s -> ('b, 'c) s + Type t_any is not compatible with type 'b +|}] + +(* together with local_opt *) +module S : sig + external[@layout_poly] id : ('a : any). ('a[@local_opt]) -> ('a[@local_opt]) = "%identity" +end = struct + external[@layout_poly] id : ('a : any). ('a[@local_opt]) -> ('a[@local_opt]) = "%identity" +end + +let g1 () = S.id #1.0 +let g2 () = S.id "abc" + +[%%expect{| +module S : + sig + external id : ('a : any). ('a [@local_opt]) -> ('a [@local_opt]) + = "%identity" [@@layout_poly] + end +val g1 : unit -> float# = +val g2 : unit -> string = +|}] + + +module S : sig + external id : ('a : any). 'a -> 'a = "%identity" +end = struct + external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +end + +[%%expect{| +Line 2, characters 28-30: +2 | external id : ('a : any). 'a -> 'a = "%identity" + ^^ +Error: Types in an external must have a representable layout. + The layout of 'a is any + because of the annotation on the universal variable 'a. + But the layout of 'a must be representable + because it's the type of an argument in an external declaration. +|}] + +module S : sig + external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +end = struct + external id : ('a : any). 'a -> 'a = "%identity" +end + +[%%expect{| +Line 4, characters 28-30: +4 | external id : ('a : any). 'a -> 'a = "%identity" + ^^ +Error: Types in an external must have a representable layout. + The layout of 'a is any + because of the annotation on the universal variable 'a. + But the layout of 'a must be representable + because it's the type of an argument in an external declaration. +|}] + +(* External in struct *) + +module S : sig + val id : ('a : float64). 'a -> 'a +end = struct + external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +end + +let () = Format.printf "%f\n" (F.to_float (S.id #1.)); Format.print_flush () + +[%%expect{| +module S : sig val id : ('a : float64). 'a -> 'a end +1.000000 +|}] + +let () = Format.printf "%s\n" (S.id "abc") + +[%%expect{| +Line 1, characters 36-41: +1 | let () = Format.printf "%s\n" (S.id "abc") + ^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : float64) + The layout of string is value + because it is the primitive value type string. + But the layout of string must be a sublayout of float64 + because of the definition of id at line 2, characters 2-35. +|}] + + +module S : sig + val id : ('a : any). 'a -> 'a +end = struct + external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +5 | end +Error: Signature mismatch: + Modules do not match: + sig + external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] + end + is not included in + sig val id : ('a : any). 'a -> 'a end + Values do not match: + external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] + is not included in + val id : ('a : any). 'a -> 'a + The type 'a -> 'a is not compatible with the type 'b -> 'b + The layout of 'a is any + because of the definition of id at line 2, characters 2-31. + But the layout of 'a must be representable + because it's the layout polymorphic type in an external declaration + ([@layout_poly] forces all variables of layout 'any' to be + representable at call sites). +|}] + + +(* External in sig *) +module S : sig + external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +end = struct + let id: ('a : any). 'a -> 'a = assert false +end + +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | let id: ('a : any). 'a -> 'a = assert false +5 | end +Error: Signature mismatch: + Modules do not match: + sig val id : ('a : any). 'a -> 'a end + is not included in + sig + external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] + end + Values do not match: + val id : ('a : any). 'a -> 'a + is not included in + external id : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] + The implementation is not a primitive. +|}] + +(********************) +(* Variable capture *) + +module type S = sig + type t + val f : 'a -> t -> 'a +end + +let f (type a1 : any) () = + let module M = struct + type t = a1 + external[@layout_poly] f : ('a : any). 'a -> a1 -> 'a = "%apply" + end in + (module M : S with type t = a1) + +[%%expect{| +module type S = sig type t val f : 'a -> t -> 'a end +Line 9, characters 49-51: +9 | external[@layout_poly] f : ('a : any). 'a -> a1 -> 'a = "%apply" + ^^ +Error: Types in an external must have a representable layout + (locally-scoped type variables with layout 'any' are + made representable by [@layout_poly]). + The layout of a1 is any + because of the annotation on the abstract type declaration for a1. + But the layout of a1 must be representable + because it's the type of an argument in an external declaration. +|}] + +let f (type a2 : any) () = + let module M = struct + type t = a2 + external[@layout_poly] f : ('a : any). 'a -> a2 t_with_any -> 'a = "%apply" + end in + (module M : S with type t = a2) + +[%%expect{| +Line 4, characters 49-62: +4 | external[@layout_poly] f : ('a : any). 'a -> a2 t_with_any -> 'a = "%apply" + ^^^^^^^^^^^^^ +Error: Types in an external must have a representable layout + (locally-scoped type variables with layout 'any' are + made representable by [@layout_poly]). + The layout of a2 t_with_any is any + because of the annotation on the abstract type declaration for a2. + But the layout of a2 t_with_any must be representable + because it's the type of an argument in an external declaration. +|}] + +let f (type a3 : any) () = + let module M = struct + type t = a3 + external[@layout_poly] f : ('a : any). 'a -> a3 M_any.t -> 'a = "%apply" + end in + (module M : S with type t = a3) + +[%%expect{| +Line 4, characters 49-59: +4 | external[@layout_poly] f : ('a : any). 'a -> a3 M_any.t -> 'a = "%apply" + ^^^^^^^^^^ +Error: Types in an external must have a representable layout + (locally-scoped type variables with layout 'any' are + made representable by [@layout_poly]). + The layout of a3 M_any.t is any + because of the annotation on the abstract type declaration for a3. + But the layout of a3 M_any.t must be representable + because it's the type of an argument in an external declaration. +|}] + +module type S4 = sig + type t + val f : int -> int +end + +let f (type a4 : any) () = + let module M = struct + type t = a4 + type ('a : any) s = int + external[@layout_poly] f : a4 s -> a4 s = "%identity" + end in + (module M : S4 with type t = a4) + +[%%expect{| +module type S4 = sig type t val f : int -> int end +Line 10, characters 31-43: +10 | external[@layout_poly] f : a4 s -> a4 s = "%identity" + ^^^^^^^^^^^^ +Error: [@layout_poly] on this external declaration has no + effect. Consider removing it or adding a type + variable for it to operate on. +|}] + +(************) +(* Functors *) + +module M (A : sig + type t: any +end) = struct + external[@layout_poly] id : ('a : any). 'a -> A.t -> 'a = "%apply" +end + +[%%expect{| +Line 4, characters 48-51: +4 | external[@layout_poly] id : ('a : any). 'a -> A.t -> 'a = "%apply" + ^^^ +Error: Types in an external must have a representable layout + (locally-scoped type variables with layout 'any' are + made representable by [@layout_poly]). + The layout of A.t is any + because of the definition of t at line 2, characters 2-13. + But the layout of A.t must be representable + because it's the type of an argument in an external declaration. +|}] + +module M (A : sig + type ('a: any) t = private 'a +end) = struct + external[@layout_poly] id : ('a : any). 'a A.t -> 'a = "%identity" + let f1 (): float# = id (assert false : float# A.t) + let f2 (): int64# = id (assert false : int64# A.t) + let f3 (): int32# = id (assert false : int32# A.t) +end + +[%%expect{| +module M : + functor (A : sig type ('a : any) t = private 'a end) -> + sig + external id : ('a : any). 'a A.t -> 'a = "%identity" [@@layout_poly] + val f1 : unit -> float# + val f2 : unit -> int64# + val f3 : unit -> int32# + end +|}] + +(*************************) +(* Not allowed in C stub *) + +(* Also means [No_native_primitive_with_non_value] errors + get shadowed when using the attribute. *) + +external[@layout_poly] id : ('a : any). 'a -> 'a = "caml_obj_tag" +[%%expect{| +Line 1, characters 0-65: +1 | external[@layout_poly] id : ('a : any). 'a -> 'a = "caml_obj_tag" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Attribute [@layout_poly] can only be used on built-in primitives. +|}] + +external[@layout_poly] id : ('a : any). 'a -> 'a = "caml_obj_tag" "caml_obj_tag" +[%%expect{| +Line 1, characters 0-80: +1 | external[@layout_poly] id : ('a : any). 'a -> 'a = "caml_obj_tag" "caml_obj_tag" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Attribute [@layout_poly] can only be used on built-in primitives. +|}] + +(***********************************) +(* All type vars get the same sort *) + +external[@layout_poly] id : ('a : any) ('b : any). 'a -> 'b = "%identity" +let f (x: float#): int64# = id x + +(* CR layouts v2.8: The jkind in the error message is wrong. It should really be + ('a : layout float64) *) +[%%expect{| +external id : ('a : any) ('b : any). 'a -> 'b = "%identity" [@@layout_poly] +Line 2, characters 28-32: +2 | let f (x: float#): int64# = id x + ^^^^ +Error: This expression has type ('a : float64) + but an expression was expected of type int64# + The layout of int64# is bits64 + because it is the primitive bits64 type int64#. + But the layout of int64# must be a sublayout of float64 + because it's the layout polymorphic type in an external declaration + ([@layout_poly] forces all variables of layout 'any' to be + representable at call sites). +|}] +(* CR layouts v2.9: the default part is not quite correct *) + +(*************************************) +(* Interaction with other attributes *) + +external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" [@@unboxed] + +[%%expect{| +Line 1, characters 40-42: +1 | external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" [@@unboxed] + ^^ +Error: Don't know how to unbox this type. + Only float, int32, int64, nativeint, vector primitives, and + concrete unboxed types can be marked unboxed. +|}] + +external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" [@@untagged] + +[%%expect{| +Line 1, characters 40-42: +1 | external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" [@@untagged] + ^^ +Error: Don't know how to untag this type. Only int can be untagged. +|}] + +external[@layout_poly] id : ('a : any). 'a -> 'a = + "%identity" "%identity" "float" +[%%expect{| +Lines 1-2, characters 0-33: +1 | external[@layout_poly] id : ('a : any). 'a -> 'a = +2 | "%identity" "%identity" "float" +Error: Cannot use "float" in conjunction with types of non-value layouts. +|}] + +(*************************************) +(* Type var in nested in other types *) + +external[@layout_poly] id : ('a : any). 'a t_with_any -> 'a t_with_any = "%identity" + +let f (x: float#): float# = id x +let f (x: int64#): int64# = id x +let f (x: int32#): int32# = id x + +[%%expect{| +external id : ('a : any). 'a t_with_any -> 'a t_with_any = "%identity" + [@@layout_poly] +val f : float# -> float# = +val f : int64# -> int64# = +val f : int32# -> int32# = +|}] + + +external[@layout_poly] id : ('a : any). 'a M_any.t -> 'a M_any.t = "%identity" + +let f (): float# M_any.t = id (assert false : float# M_any.t) +let f (): int64# M_any.t = id (assert false : int64# M_any.t) +let f (): int32# M_any.t = id (assert false : int32# M_any.t) + +[%%expect{| +external id : ('a : any). 'a M_any.t -> 'a M_any.t = "%identity" + [@@layout_poly] +val f : unit -> float# M_any.t = +val f : unit -> int64# M_any.t = +val f : unit -> int32# M_any.t = +|}] + + +(* doesn't work when the type constructor puts a constraint on ['a] *) +external[@layout_poly] id : ('a : any). 'a list -> 'a list = "%identity" + +[%%expect{| +Line 1, characters 28-58: +1 | external[@layout_poly] id : ('a : any). 'a list -> 'a list = "%identity" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The universal type variable 'a was declared to have kind any. + But it was inferred to have kind value + because the type argument of list has kind value. +|}] + +(* Test this when sorts can be inside unboxed records *) +(* type ('a : any) r = {field: 'a} [@@unboxed] +external[@layout_poly] id : ('a : any). 'a M_any.t r -> 'a M_any.t r = "%identity" + +let f (): float# M_any.t r = id (assert false : float# M_any.t r) +let f (): int64# M_any.t r = id (assert false : int64# M_any.t r) +let f (): int32# M_any.t r = id (assert false : int32# M_any.t r) *) + + +(********************************************) +(* Some primitives require layout_poly to work *) + +type ('a : any) t +external id : ('a : any). 'a t -> int = "%array_length" +let id' x = id x + +[%%expect{| +type ('a : any) t +Line 2, characters 14-37: +2 | external id : ('a : any). 'a t -> int = "%array_length" + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: The primitive [%array_length] doesn't work well with type variables of + layout any. Consider using [@layout_poly]. +|}] + +external[@layout_poly] id : ('a : any). 'a t -> int = "%array_length" +let id' x = id x + +[%%expect{| +external id : ('a : any). 'a t -> int = "%array_length" [@@layout_poly] +val id' : 'a t -> int = +|}] + +external id : ('a : any). 'a t -> int = "%identity" +let id' x = id x + +[%%expect{| +external id : ('a : any). 'a t -> int = "%identity" +val id' : ('a : any). 'a t -> int = +|}] + + +(***************************************************************) +(* Some primitives can't have layout_poly or any non-value jkinds *) + +external[@layout_poly] dup : ('a : any). 'a -> 'a = "%obj_dup" +[%%expect{| +Line 1, characters 29-49: +1 | external[@layout_poly] dup : ('a : any). 'a -> 'a = "%obj_dup" + ^^^^^^^^^^^^^^^^^^^^ +Error: The primitive [%obj_dup] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +external dup : float# -> float# = "%obj_dup" +[%%expect{| +Line 1, characters 15-31: +1 | external dup : float# -> float# = "%obj_dup" + ^^^^^^^^^^^^^^^^ +Error: The primitive [%obj_dup] is used in an invalid declaration. + The declaration contains argument/return types with the wrong layout. +|}] + +(*************************************************************) +(* Non-explicitly quantify tvars don't work with layout_poly *) + +type ('a : any) t = 'a + +external[@layout_poly] id : 'a t -> 'a t = "%identity" + +(* should fail as ['a] will get defaulted to [value] above without explicit + quantification *) +let idf : ('a : float64). 'a -> 'a = id +[%%expect{| +type ('a : any) t = 'a +Line 3, characters 28-40: +3 | external[@layout_poly] id : 'a t -> 'a t = "%identity" + ^^^^^^^^^^^^ +Error: [@layout_poly] on this external declaration has no + effect. Consider removing it or adding a type + variable for it to operate on. +|}] diff --git a/testsuite/tests/typing-layouts/layout_poly_native.ml b/testsuite/tests/typing-layouts/layout_poly_native.ml new file mode 100644 index 00000000000..3678d6d7ce3 --- /dev/null +++ b/testsuite/tests/typing-layouts/layout_poly_native.ml @@ -0,0 +1,71 @@ +(* TEST + flags = "-extension layouts"; + include stdlib_upstream_compatible; + flambda2; + { + native; + }{ + bytecode; + } +*) + + +external[@layout_poly] id : ('a : any). 'a -> 'a = "%identity" +external[@layout_poly] opaque : ('a : any). 'a -> 'a = "%opaque" +external[@layout_poly] magic : ('a : any) ('b : any). 'a -> 'b = "%obj_magic" +external[@layout_poly] apply : ('a : any) ('b : any). ('a -> 'b) -> 'a -> 'b = "%apply" +external[@layout_poly] revapply : ('a : any) ('b : any). 'a -> ('a -> 'b) -> 'b = "%revapply" + +type t_any : any +module N = Stdlib_upstream_compatible.Nativeint_u +module I32 = Stdlib_upstream_compatible.Int32_u +module I64 = Stdlib_upstream_compatible.Int64_u +module F = Stdlib_upstream_compatible.Float_u +let () = + (* id (assert false : t_any); *) + Printf.printf "%s\n" (N.to_string (id #1n)); + Printf.printf "%s\n" (I32.to_string (id #2l)); + Printf.printf "%s\n" (I64.to_string (id #3L)); + Printf.printf "%s\n" (F.to_string (id #4.)); + Printf.printf "%s\n" (id "abcde"); + () + +let () = + Printf.printf "%s\n" (N.to_string (opaque #1n)); + Printf.printf "%s\n" (I32.to_string (opaque #2l)); + Printf.printf "%s\n" (I64.to_string (opaque #3L)); + Printf.printf "%s\n" (F.to_string (opaque #4.)); + Printf.printf "%s\n" (opaque "abcde"); + () + +let () = + Printf.printf "%s\n" (N.to_string (magic #1n)); + Printf.printf "%s\n" (I32.to_string (magic #2l)); + Printf.printf "%s\n" (I64.to_string (magic #3L)); + Printf.printf "%s\n" (F.to_string (magic #4.)); + Printf.printf "%s\n" (magic "abcde"); + () + +let () = + Printf.printf "%s\n" (N.to_string (apply (fun x -> x) #1n)); + Printf.printf "%s\n" (I32.to_string (apply (fun x -> x) #2l)); + Printf.printf "%s\n" (I64.to_string (apply (fun x -> x) #3L)); + Printf.printf "%s\n" (F.to_string (apply (fun x -> x) #4.)); + Printf.printf "%s\n" (apply (fun x -> x) "abcde"); + () + +let () = + Printf.printf "%s\n" (N.to_string (revapply #1n (fun x -> x))); + Printf.printf "%s\n" (I32.to_string (revapply #2l (fun x -> x))); + Printf.printf "%s\n" (I64.to_string (revapply #3L (fun x -> x))); + Printf.printf "%s\n" (F.to_string (revapply #4. (fun x -> x))); + Printf.printf "%s\n" (revapply "abcde" (fun x -> x)); + () + +let () = + Printf.printf "%s\n" (N.to_string (Sys.opaque_identity #1n)); + Printf.printf "%s\n" (I32.to_string (Sys.opaque_identity #2l)); + Printf.printf "%s\n" (I64.to_string (Sys.opaque_identity #3L)); + Printf.printf "%s\n" (F.to_string (Sys.opaque_identity #4.)); + Printf.printf "%s\n" (Sys.opaque_identity "abcde"); + () diff --git a/testsuite/tests/typing-layouts/layout_poly_native.reference b/testsuite/tests/typing-layouts/layout_poly_native.reference new file mode 100644 index 00000000000..e4cf2b6b4b0 --- /dev/null +++ b/testsuite/tests/typing-layouts/layout_poly_native.reference @@ -0,0 +1,30 @@ +1 +2 +3 +4. +abcde +1 +2 +3 +4. +abcde +1 +2 +3 +4. +abcde +1 +2 +3 +4. +abcde +1 +2 +3 +4. +abcde +1 +2 +3 +4. +abcde diff --git a/testsuite/tests/typing-layouts/literals.ml b/testsuite/tests/typing-layouts/literals.ml index 125c9b9890c..c2bc1308f1e 100644 --- a/testsuite/tests/typing-layouts/literals.ml +++ b/testsuite/tests/typing-layouts/literals.ml @@ -1,177 +1,172 @@ (* TEST - flags = "-extension layouts_alpha" - * expect + include stdlib_upstream_compatible; + flags = "-extension layouts_beta"; + expect; *) (*****************************************) -(* Expressions *) +(* Prelude: Functions on unboxed floats. *) + +module Float_u = Stdlib_upstream_compatible.Float_u +module Int32_u = Stdlib_upstream_compatible.Int32_u +module Int64_u = Stdlib_upstream_compatible.Int64_u +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u + +let test_float s f = + Format.printf "%s: %f\n" s (Float_u.to_float f); Format.print_flush () +let test_int32 s f = + Format.printf "%s: %ld\n" s (Int32_u.to_int32 f); Format.print_flush () +let test_int64 s f = + Format.printf "%s: %Ld\n" s (Int64_u.to_int64 f); Format.print_flush () +let test_nativeint s f = + Format.printf "%s: %s\n" s (Nativeint_u.to_string f); Format.print_flush () -let e = #2.718281828459045 [%%expect{| -Line 1, characters 8-26: -1 | let e = #2.718281828459045 - ^^^^^^^^^^^^^^^^^^ -Error: Unboxed float literals aren't supported yet. +module Float_u = Stdlib_upstream_compatible.Float_u +module Int32_u = Stdlib_upstream_compatible.Int32_u +module Int64_u = Stdlib_upstream_compatible.Int64_u +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u +val test_float : string -> Float_u.t -> unit = +val test_int32 : string -> Int32_u.t -> unit = +val test_int64 : string -> Int64_u.t -> unit = +val test_nativeint : string -> Nativeint_u.t -> unit = |}] -let negative_one_half = -#0.5 +(*****************************************) +(* Expressions *) + +let () = test_float "e" #2.718281828459045 + [%%expect{| -Line 1, characters 24-29: -1 | let negative_one_half = -#0.5 - ^^^^^ -Error: Unboxed float literals aren't supported yet. +e: 2.718282 |}] -let negative_one_half = - #0.5 +let () = test_float "negative_one_half" (-#0.5) [%%expect{| -Line 1, characters 24-30: -1 | let negative_one_half = - #0.5 - ^^^^^^ -Error: Unboxed float literals aren't supported yet. +negative_one_half: -0.500000 |}] -let negative_one_half = -.#0.5 +let () = test_float "negative_one_half" (- #0.5) [%%expect{| -Line 1, characters 24-30: -1 | let negative_one_half = -.#0.5 - ^^^^^^ -Error: Unboxed float literals aren't supported yet. +negative_one_half: -0.500000 |}] -let negative_one_half = -. #0.5 +let () = test_float "negative_one_half" (-.#0.5) [%%expect{| -Line 1, characters 24-31: -1 | let negative_one_half = -. #0.5 - ^^^^^^^ -Error: Unboxed float literals aren't supported yet. +negative_one_half: -0.500000 |}] -let positive_one_dot = +#1. +let () = test_float "negative_one_half" (-. #0.5) [%%expect{| -Line 1, characters 23-27: -1 | let positive_one_dot = +#1. - ^^^^ -Error: Unboxed float literals aren't supported yet. +negative_one_half: -0.500000 |}] -let positive_one_dot = + #1. +let () = test_float "positive_one_dot" (+#1.) [%%expect{| -Line 1, characters 23-28: -1 | let positive_one_dot = + #1. - ^^^^^ -Error: Unboxed float literals aren't supported yet. +positive_one_dot: 1.000000 |}] -let positive_one_dot = +.#1. +let () = test_float "positive_one_dot" (+ #1.) [%%expect{| -Line 1, characters 23-28: -1 | let positive_one_dot = +.#1. - ^^^^^ -Error: Unboxed float literals aren't supported yet. +positive_one_dot: 1.000000 |}] -let positive_one_dot = +. #1. +let () = test_float "positive_one_dot" (+.#1.) [%%expect{| -Line 1, characters 23-29: -1 | let positive_one_dot = +. #1. - ^^^^^^ -Error: Unboxed float literals aren't supported yet. +positive_one_dot: 1.000000 |}] -let one_billion = #1e9 +let () = test_float "positive_one_dot" (+. #1.) [%%expect{| -Line 1, characters 18-22: -1 | let one_billion = #1e9 - ^^^^ -Error: Unboxed float literals aren't supported yet. +positive_one_dot: 1.000000 |}] -let zero = #0n +let () = test_float "one_billion" (#1e9) [%%expect{| -Line 1, characters 11-14: -1 | let zero = #0n - ^^^ -Error: Unboxed int literals aren't supported yet. +one_billion: 1000000000.000000 |}] - -let positive_one = +#1l +let () = test_nativeint "zero" (#0n) [%%expect{| -Line 1, characters 19-23: -1 | let positive_one = +#1l - ^^^^ -Error: Unboxed int literals aren't supported yet. +zero: 0 |}] - -let positive_one = + #1l +let () = test_int32 "positive_one" (+#1l) [%%expect{| -Line 1, characters 19-24: -1 | let positive_one = + #1l - ^^^^^ -Error: Unboxed int literals aren't supported yet. +positive_one: 1 |}] - -let negative_one = -#1L +let () = test_int32 "positive_one" (+ #1l) +[%%expect{| +positive_one: 1 +|}] +let () = test_int64 "negative_one" (-#1L) +[%%expect{| +negative_one: -1 +|}] +let () = test_int64 "negative_one" (- #1L) +[%%expect{| +negative_one: -1 +|}] +let () = test_nativeint "two_fifty_five_in_hex" (#0xFFn) [%%expect{| -Line 1, characters 19-23: -1 | let negative_one = -#1L - ^^^^ -Error: Unboxed int literals aren't supported yet. +two_fifty_five_in_hex: 255 +|}] +let () = test_int32 "twenty_five_in_octal" (#0o31l) +[%%expect{| +twenty_five_in_octal: 25 +|}] +let () = test_int64 "forty_two_in_binary" (#0b101010L) +[%%expect{| +forty_two_in_binary: 42 |}] -let negative_one = - #1L +let () = test_float "one_twenty_seven_point_two_five_in_floating_hex" (#0x7f.4) [%%expect{| -Line 1, characters 19-24: -1 | let negative_one = - #1L - ^^^^^ -Error: Unboxed int literals aren't supported yet. +one_twenty_seven_point_two_five_in_floating_hex: 127.250000 |}] -let two_fifty_five_in_hex = #0xFFn +let () = test_float "five_point_three_seven_five_in_floating_hexponent" (#0xa.cp-1) [%%expect{| -Line 1, characters 28-34: -1 | let two_fifty_five_in_hex = #0xFFn - ^^^^^^ -Error: Unboxed int literals aren't supported yet. +five_point_three_seven_five_in_floating_hexponent: 5.375000 |}] -let twenty_five_in_octal = #0o31l +let () = test_float "unknown_floating_point_suffix" (#0.P) [%%expect{| -Line 1, characters 27-33: -1 | let twenty_five_in_octal = #0o31l - ^^^^^^ -Error: Unboxed int literals aren't supported yet. +Line 1, characters 52-58: +1 | let () = test_float "unknown_floating_point_suffix" (#0.P) + ^^^^^^ +Error: Unknown modifier 'P' for literal #0.P |}] -let forty_two_in_binary = #0b101010L +let () = test_int32 "unknown_int_suffix" (#0g) [%%expect{| -Line 1, characters 26-36: -1 | let forty_two_in_binary = #0b101010L - ^^^^^^^^^^ -Error: Unboxed int literals aren't supported yet. +Line 1, characters 41-46: +1 | let () = test_int32 "unknown_int_suffix" (#0g) + ^^^^^ +Error: Unknown modifier 'g' for literal #0g |}] -let one_twenty_seven_point_two_five_in_floating_hex = #0x7f.4 + +let () = test_nativeint "invalid_nativeint" (#0x10000000000000000n) [%%expect{| -Line 1, characters 54-61: -1 | let one_twenty_seven_point_two_five_in_floating_hex = #0x7f.4 - ^^^^^^^ -Error: Unboxed float literals aren't supported yet. +Line 1, characters 44-67: +1 | let () = test_nativeint "invalid_nativeint" (#0x10000000000000000n) + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Integer literal exceeds the range of representable integers of type nativeint# |}] -let five_point_three_seven_five_in_floating_hexponent = #0xa.cp-1 +let () = test_int64 "invalid_int64" (#0x10000000000000000L) [%%expect{| -Line 1, characters 56-65: -1 | let five_point_three_seven_five_in_floating_hexponent = #0xa.cp-1 - ^^^^^^^^^ -Error: Unboxed float literals aren't supported yet. +Line 1, characters 36-59: +1 | let () = test_int64 "invalid_int64" (#0x10000000000000000L) + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Integer literal exceeds the range of representable integers of type int64# |}] -let unknown_floating_point_suffix = #0.P +let () = test_int32 "invalid_int32" (#0x100000000l) [%%expect{| -Line 1, characters 36-40: -1 | let unknown_floating_point_suffix = #0.P - ^^^^ -Error: Unboxed float literals aren't supported yet. +Line 1, characters 36-51: +1 | let () = test_int32 "invalid_int32" (#0x100000000l) + ^^^^^^^^^^^^^^^ +Error: Integer literal exceeds the range of representable integers of type int32# |}] (*****************************************) @@ -186,10 +181,49 @@ let f x = f #4L;; [%%expect {| -Line 3, characters 4-7: -3 | | #4L -> `Four - ^^^ -Error: Unboxed int literals aren't supported yet. +val f : int64# -> [> `Five | `Four | `Other ] = +- : [> `Five | `Four | `Other ] = `Four +|}];; + +let f x = + match x with + | #4L -> #0L + | #5L -> #1L + | x -> x +;; + +test_int64 "result" (f #7L);; +[%%expect {| +val f : int64# -> int64# = +result: 7 +- : unit = () +|}];; + +let f x = + match x with + | #0L -> #0L + | #1L -> #0L + | #2L -> #0L + | #4L -> #0L + | #5L -> #1L +;; + +test_int64 "result" (f #7L);; +(* This is here to test the [partial-match] warning *) +[%%expect {| +Lines 2-7, characters 2-14: +2 | ..match x with +3 | | #0L -> #0L +4 | | #1L -> #0L +5 | | #2L -> #0L +6 | | #4L -> #0L +7 | | #5L -> #1L +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +#3L + +val f : int64# -> int64# = +Exception: Match_failure ("", 2, 2). |}];; let f x = @@ -201,34 +235,67 @@ let f x = f #5.;; [%%expect {| -Line 3, characters 4-7: -3 | | #4. -> `Four - ^^^ -Error: Unboxed float literals aren't supported yet. +val f : float# -> [> `Five | `Four | `Other ] = +- : [> `Five | `Four | `Other ] = `Five +|}];; + +let f x = + match x with + | #4. -> #0. + | #5. -> #1. + | x -> x +;; + +test_float "result" (f #7.);; +[%%expect {| +val f : float# -> float# = +result: 7.000000 +- : unit = () |}];; +let f x = + match x with + | #4. -> #0. + | #5. -> #1. +;; + +test_float "result" (f #7.);; +(* This is here to test the [partial-match] warning *) +[%%expect {| +Lines 2-4, characters 2-14: +2 | ..match x with +3 | | #4. -> #0. +4 | | #5. -> #1. +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +#0. + +val f : float# -> float# = +Exception: Match_failure ("", 2, 2). +|}];; + + (*****************************************) (* Lexing edge cases *) (* Unboxed literals at the beginning of the line aren't directives. *) -let f _ _ = ();; -let () = f +let f1 (_ : float#) (_ : int64#) = ();; +let f2 (_ : float#) (_ : float#) = ();; +let () = f1 #2. #2L ;; -let () = f +let () = f2 #2. #2. ;; [%%expect{| -val f : 'a -> 'b -> unit = -Line 3, characters 0-3: -3 | #2. - ^^^ -Error: Unboxed float literals aren't supported yet. +val f1 : float# -> int64# -> unit = +val f2 : float# -> float# -> unit = |}];; +let f _ _ = ();; let () = f (* This lexes as a directive. #2 is not a valid unboxed int literal anyway, as it lacks a suffix. @@ -239,4 +306,5 @@ let () = f ;; [%%expect{| +val f : 'a -> 'b -> unit = |}];; diff --git a/testsuite/tests/typing-layouts/literals_native.ml b/testsuite/tests/typing-layouts/literals_native.ml new file mode 100644 index 00000000000..1c1486a84a5 --- /dev/null +++ b/testsuite/tests/typing-layouts/literals_native.ml @@ -0,0 +1,113 @@ +(* TEST + flags = "-extension layouts_beta"; + include stdlib_upstream_compatible; + flambda2; + { + native; + }{ + bytecode; + } +*) + +(*****************************************) +(* Prelude: Functions on unboxed floats. *) + +module Float_u = Stdlib_upstream_compatible.Float_u +module Int32_u = Stdlib_upstream_compatible.Int32_u +module Int64_u = Stdlib_upstream_compatible.Int64_u +module Nativeint_u = Stdlib_upstream_compatible.Nativeint_u + +let test_float s f = + Format.printf "%s: %f\n" s (Float_u.to_float f); Format.print_flush () +let test_int32 s f = + Format.printf "%s: %ld\n" s (Int32_u.to_int32 f); Format.print_flush () +let test_int64 s f = + Format.printf "%s: %Ld\n" s (Int64_u.to_int64 f); Format.print_flush () +let test_nativeint s f = + Format.printf "%s: %s\n" s (Nativeint_u.to_string f); Format.print_flush () + +(*****************************************) +(* Expressions *) + +let () = test_float "e" #2.718281828459045 +let () = test_float "negative_one_half" (-#0.5) +let () = test_float "negative_one_half" (- #0.5) +let () = test_float "negative_one_half" (-.#0.5) +let () = test_float "negative_one_half" (-. #0.5) +let () = test_float "positive_one_dot" (+#1.) +let () = test_float "positive_one_dot" (+ #1.) +let () = test_float "positive_one_dot" (+.#1.) +let () = test_float "positive_one_dot" (+. #1.) +let () = test_float "one_billion" (#1e9) +let () = test_float "one_twenty_seven_point_two_five_in_floating_hex" (#0x7f.4) +let () = test_float "five_point_three_seven_five_in_floating_hexponent" (#0xa.cp-1) + +let () = test_nativeint "zero" (#0n) +let () = test_int32 "positive_one" (+#1l) +let () = test_int32 "positive_one" (+ #1l) +let () = test_int64 "negative_one" (-#1L) +let () = test_int64 "negative_one" (- #1L) +let () = test_nativeint "two_fifty_five_in_hex" (#0xFFn) +let () = test_int32 "twenty_five_in_octal" (#0o31l) +let () = test_int64 "forty_two_in_binary" (#0b101010L) + +(*****************************************) +(* Patterns *) + +let f x = + match x with + | #4. -> `Four + | #5. -> `Five + | _ -> `Other +;; + +let () = + match f #5. with + | `Five -> () + | _ -> assert false;; + +let f x = + match x with + | #4. -> #0. + | #5. -> #1. + | x -> x +;; + +test_float "result" (f #7.);; + +let f x = + match x with + | #4. -> #0. + | #5. -> #1. + | #6. -> #2. + | #7. -> #3. + | #8. -> #4. + | #9. -> #5. + | #10. -> #6. + | #11. -> #7. + | x -> x +;; + +test_float "larger match result" (f #7.);; + + +let f x = + match x with + | #4L -> `Four + | #5L -> `Five + | _ -> `Other +;; + +let () = + match f #4L with + | `Four -> () + | _ -> assert false;; + +let f x = + match x with + | #4L -> #0L + | #5L -> #1L + | x -> x +;; + +test_int64 "result" (f #7L);; diff --git a/testsuite/tests/typing-layouts/literals_native.reference b/testsuite/tests/typing-layouts/literals_native.reference new file mode 100644 index 00000000000..14969634039 --- /dev/null +++ b/testsuite/tests/typing-layouts/literals_native.reference @@ -0,0 +1,23 @@ +e: 2.718282 +negative_one_half: -0.500000 +negative_one_half: -0.500000 +negative_one_half: -0.500000 +negative_one_half: -0.500000 +positive_one_dot: 1.000000 +positive_one_dot: 1.000000 +positive_one_dot: 1.000000 +positive_one_dot: 1.000000 +one_billion: 1000000000.000000 +one_twenty_seven_point_two_five_in_floating_hex: 127.250000 +five_point_three_seven_five_in_floating_hexponent: 5.375000 +zero: 0 +positive_one: 1 +positive_one: 1 +negative_one: -1 +negative_one: -1 +two_fifty_five_in_hex: 255 +twenty_five_in_octal: 25 +forty_two_in_binary: 42 +result: 7.000000 +larger match result: 3.000000 +result: 7 diff --git a/testsuite/tests/typing-layouts/mixed_constructor_arguments.ml b/testsuite/tests/typing-layouts/mixed_constructor_arguments.ml new file mode 100644 index 00000000000..79297d61d3f --- /dev/null +++ b/testsuite/tests/typing-layouts/mixed_constructor_arguments.ml @@ -0,0 +1,693 @@ +(* TEST + { + flags = "-extension layouts_alpha"; + expect; + }{ + flags = "-extension layouts_beta"; + expect; + }{ + expect; + } +*) + +(* For each example with regular variants, this test also includes an example + with (i) variants with inline record arguments, and (ii) extensible variants. + (At time of writing, extensible variants aren't supported.) +*) + +type t_ext = .. +[%%expect {| +type t_ext = .. +|}];; + +(* Mixed float-float# constructor args are OK, but the float args aren't flat *) +type t_cstr_boxed_float = A of float * float# + +[%%expect{| +type t_cstr_boxed_float = A of float * float# +|}];; + +type t_cstr_boxed_float_record = A of { x : float; y : float# } + +[%%expect{| +type t_cstr_boxed_float_record = A of { x : float; y : float#; } +|}];; + +type t_ext += A of float * float# + +[%%expect{| +Line 1, characters 14-33: +1 | type t_ext += A of float * float# + ^^^^^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}];; + +(* The fact that the float args aren't flat is evidenced by the fact this + type decl doesn't type-check. +*) +type t_cstr_boxed_float_bad = A of float# * float + +[%%expect{| +Line 1, characters 30-49: +1 | type t_cstr_boxed_float_bad = A of float# * float + ^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +type t_cstr_boxed_float_bad_record = A of { x : float#; y : float } + +[%%expect{| +Line 1, characters 44-55: +1 | type t_cstr_boxed_float_bad_record = A of { x : float#; y : float } + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, x, + but found boxed field, y. +|}];; + +type t_ext += A of float# * float + +[%%expect{| +Line 1, characters 14-33: +1 | type t_ext += A of float# * float + ^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +(* You can't trick the type-checker by adding more constructors *) +type t_cstr_boxed_float_bad_multi_constr = + | Const + | A of float# * float + +[%%expect{| +Line 3, characters 2-23: +3 | | A of float# * float + ^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +type t_cstr_boxed_float_bad_multi_constr_record = + | Const + | A of { x : float#; y : float } + +[%%expect{| +Line 3, characters 11-22: +3 | | A of { x : float#; y : float } + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, x, + but found boxed field, y. +|}];; + +type t_ext += + | Const + | A of float# * float + +[%%expect{| +Line 3, characters 2-23: +3 | | A of float# * float + ^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +(* When a non-float/float# field appears, [float] + fields continue to not be considered flat. *) +type t_cstr_boxed_float_plus_more = + | A of float# * float * int + +[%%expect{| +Line 2, characters 2-29: +2 | | A of float# * float * int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +type t_cstr_boxed_float_plus_more_record = + | A of { x : float#; y : float; z : int } + +[%%expect{| +Line 2, characters 11-22: +2 | | A of { x : float#; y : float; z : int } + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, x, + but found boxed field, y. +|}];; + +type t_ext += + | A of float# * float * int + +[%%expect{| +Line 2, characters 2-29: +2 | | A of float# * float * int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +(* [float] appearing as a non-flat field in the value prefix. *) +type t_cstr_boxed_float = A of float * float# * int + +[%%expect{| +type t_cstr_boxed_float = A of float * float# * int +|}];; + +type t_cstr_boxed_float_record = A of { x : float; y : float#; z : int } + +[%%expect{| +type t_cstr_boxed_float_record = A of { x : float; y : float#; z : int; } +|}];; + +type t_ext += A of float * float# * int + +[%%expect{| +Line 1, characters 14-39: +1 | type t_ext += A of float * float# * int + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}];; + +(* The third field can't be flat because a non-float/float# field [d] appears.*) +type t_cstr_multi_boxed_float_bad = A of float * float# * float * int + +[%%expect{| +Line 1, characters 36-69: +1 | type t_cstr_multi_boxed_float_bad = A of float * float# * float * int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +type t_cstr_multi_boxed_float_record_bad = A of { a : float; b : float#; + c : float; d : int; } + +[%%expect{| +Line 1, characters 61-72: +1 | type t_cstr_multi_boxed_float_record_bad = A of { a : float; b : float#; + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, b, + but found boxed field, c. +|}];; + +type t_ext += A of float * float# * float * int + +[%%expect{| +Line 1, characters 14-47: +1 | type t_ext += A of float * float# * float * int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, float. +|}];; + +(* String can't appear in the flat suffix *) +type t_cstr_flat_string_bad1 = A of float# * string + +[%%expect{| +Line 1, characters 31-51: +1 | type t_cstr_flat_string_bad1 = A of float# * string + ^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, string. +|}];; + +type t_cstr_flat_string_record_bad1 = A of { x : float#; y : string } + +[%%expect{| +Line 1, characters 45-56: +1 | type t_cstr_flat_string_record_bad1 = A of { x : float#; y : string } + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, x, + but found boxed field, y. +|}];; + +type t_ext += A of float# * string + +[%%expect{| +Line 1, characters 14-34: +1 | type t_ext += A of float# * string + ^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, string. +|}];; + +(* The string can't appear in the flat suffix. *) +type t_cstr_flat_string_bad2 = A of float# * float# * string + +[%%expect{| +Line 1, characters 31-60: +1 | type t_cstr_flat_string_bad2 = A of float# * float# * string + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, string. +|}];; + +type t_cstr_flat_string_record_bad2 = A of { x : float#; y : float#; z : string } + +[%%expect{| +Line 1, characters 45-56: +1 | type t_cstr_flat_string_record_bad2 = A of { x : float#; y : float#; z : string } + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, x, + but found boxed field, z. +|}];; + +type t_ext += A of float# * float# * string + +[%%expect{| +Line 1, characters 14-43: +1 | type t_ext += A of float# * float# * string + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, string. +|}];; + +(* The int [c] can appear in the flat suffix. *) +type t_cstr_flat_int = A of float# * float# * int + +[%%expect{| +type t_cstr_flat_int = A of float# * float# * int +|}];; + +type t_cstr_flat_int_record = A of { a : float#; b : float#; c : int } + +[%%expect{| +type t_cstr_flat_int_record = A of { a : float#; b : float#; c : int; } +|}];; + +type t_ext += A of float# * float# * int + +[%%expect{| +Line 1, characters 14-40: +1 | type t_ext += A of float# * float# * int + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}];; + +type t_cstr_flat_int_multi = + | A of float# * float# * int + | B of int + | C of float# * int + | D of float# * int * float# + | E of int * float# * int * float# + +[%%expect{| +type t_cstr_flat_int_multi = + A of float# * float# * int + | B of int + | C of float# * int + | D of float# * int * float# + | E of int * float# * int * float# +|}];; + +type t_cstr_flat_int_multi_record = + | A of { a : float#; b : float#; c : int } + | B of { a : int } + | C of { a : float#; b : int; c : int } + | D of { a : float#; b : int; c : float# } + | E of { a : int; b : float#; c : int; d : float# } + +[%%expect{| +type t_cstr_flat_int_multi_record = + A of { a : float#; b : float#; c : int; } + | B of { a : int; } + | C of { a : float#; b : int; c : int; } + | D of { a : float#; b : int; c : float#; } + | E of { a : int; b : float#; c : int; d : float#; } +|}];; + +type t_ext += + | A of float# * float# * int + | B of int + | C of float# * int + | D of float# * int * float# + | E of int * float# * int * float# + +[%%expect{| +Line 2, characters 2-30: +2 | | A of float# * float# * int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}];; + +(* Parameterized types *) + +type ('a : float64) t_cstr_param1 = A of string * 'a +[%%expect{| +type ('a : float64) t_cstr_param1 = A of string * 'a +|}];; + +type ('a : float64) t_cstr_param_record1 = A of { a : string; b : 'a } +[%%expect{| +type ('a : float64) t_cstr_param_record1 = A of { a : string; b : 'a; } +|}];; + +type ('a : float64) t_cstr_param_ext1 = .. +type 'a t_cstr_param_ext1 += A of string * 'a +[%%expect{| +type ('a : float64) t_cstr_param_ext1 = .. +Line 2, characters 29-45: +2 | type 'a t_cstr_param_ext1 += A of string * 'a + ^^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}];; + +type ('a : float64, 'b : immediate) t_cstr_param2 = A of string * 'a * 'b +[%%expect{| +type ('a : float64, 'b : immediate) t_cstr_param2 = A of string * 'a * 'b +|}];; + +type ('a : float64, 'b : immediate) t_cstr_param_record2 = + A of { x : string; y : 'a; z : 'b } +[%%expect{| +type ('a : float64, 'b : immediate) t_cstr_param_record2 = + A of { x : string; y : 'a; z : 'b; } +|}];; + +type ('a : float64, 'b : immediate) t_cstr_param_ext2 = .. +type ('a, 'b) t_cstr_param_ext2 += A of string * 'a * 'b;; + +[%%expect{| +type ('a : float64, 'b : immediate) t_cstr_param_ext2 = .. +Line 2, characters 35-56: +2 | type ('a, 'b) t_cstr_param_ext2 += A of string * 'a * 'b;; + ^^^^^^^^^^^^^^^^^^^^^ +Error: Extensible types can't have fields of unboxed type. Consider wrapping the unboxed fields in a record. +|}];; + +type 'a t_cstr_bad_value_after_float = C of float# * 'a + +[%%expect{| +Line 1, characters 39-55: +1 | type 'a t_cstr_bad_value_after_float = C of float# * 'a + ^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, 'a. +|}];; + +type 'a t_cstr_bad_value_after_float_record = C of { x : float#; y : 'a } + +[%%expect{| +Line 1, characters 53-64: +1 | type 'a t_cstr_bad_value_after_float_record = C of { x : float#; y : 'a } + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, x, + but found boxed field, y. +|}];; + +(* Types with external mode are allowed in flat suffix *) + +type ('a : value mod external_) t = A of float# * 'a +type ('a : immediate) t = A of float# * 'a +[%%expect {| +type ('a : value mod external_) t = A of float# * 'a +type ('a : immediate) t = A of float# * 'a +|}] + +type u : value mod external_ +type t = A of float * u +[%%expect {| +type u : value mod external_ +type t = A of float * u +|}] + +type u : immediate +type t = A of float# * u +[%%expect {| +type u : immediate +type t = A of float# * u +|}] + +(* Types with external mode and value layout are allowed in scannable prefix *) + +type ('a : value mod external_) t = A of 'a * string +type ('a : immediate) t = A of 'a * string +[%%expect {| +type ('a : value mod external_) t = A of 'a * string +type ('a : immediate) t = A of 'a * string +|}] + +type u : value mod external_ +type t = A of u * string +[%%expect {| +type u : value mod external_ +type t = A of u * string +|}] + +type u : immediate +type t = A of u * string +[%%expect {| +type u : immediate +type t = A of u * string +|}] + +(* Recursive groups. There's not a good way to exercise the same functionality + for extensible variants, so we omit that aspect of this test. +*) + +type ('a : float64) t_float64_id = 'a +type ('a : immediate) t_immediate_id = 'a +[%%expect{| +type ('a : float64) t_float64_id = 'a +type ('a : immediate) t_immediate_id = 'a +|}];; + +type 'a t_float = 'a t_float64_id +and 'a t_imm = 'a t_immediate_id +and ('a, 'b, 'ptr) t_cstr1 = A of 'ptr * 'a * 'a t_float * 'b * 'b t_imm +[%%expect{| +Line 3, characters 46-56: +3 | and ('a, 'b, 'ptr) t_cstr1 = A of 'ptr * 'a * 'a t_float * 'b * 'b t_imm + ^^^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The layout of 'a is float64 + because of the definition of t_float64_id at line 1, characters 0-37. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t_cstr1, + defaulted to layout value. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}];; + +type 'a t_float = 'a t_float64_id +and 'a t_imm = 'a t_immediate_id +and ('a : float64, 'b : immediate, 'ptr) t_cstr2 = + A of 'ptr * 'a * 'a t_float * 'b * 'b t_imm +[%%expect{| +type ('a : float64) t_float = 'a t_float64_id +and ('a : immediate) t_imm = 'a t_immediate_id +and ('a : float64, 'b : immediate, 'ptr) t_cstr2 = + A of 'ptr * 'a * 'a t_float * 'b * 'b t_imm +|}];; + +(* There is a cap on the number of fields in the scannable prefix. *) +type ptr = string +type t_cstr_capped = + A of + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * + int * float# +[%%expect{| +type ptr = string +Lines 3-36, characters 2-16: + 3 | ..A of + 4 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + 5 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + 6 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + 7 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * +... +33 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * +34 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * +35 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * +36 | int * float# +Error: Mixed constructors may contain at most 254 value fields prior to the flat suffix, but this one contains 255. +|}];; + +type t_cstr_capped_record = A of { + a0:ptr; a1:ptr; a2:ptr; a3:ptr; a4:ptr; a5:ptr; a6:ptr; a7:ptr; a8:ptr; a9:ptr; + b0:ptr; b1:ptr; b2:ptr; b3:ptr; b4:ptr; b5:ptr; b6:ptr; b7:ptr; b8:ptr; b9:ptr; + c0:ptr; c1:ptr; c2:ptr; c3:ptr; c4:ptr; c5:ptr; c6:ptr; c7:ptr; c8:ptr; c9:ptr; + d0:ptr; d1:ptr; d2:ptr; d3:ptr; d4:ptr; d5:ptr; d6:ptr; d7:ptr; d8:ptr; d9:ptr; + e0:ptr; e1:ptr; e2:ptr; e3:ptr; e4:ptr; e5:ptr; e6:ptr; e7:ptr; e8:ptr; e9:ptr; + f0:ptr; f1:ptr; f2:ptr; f3:ptr; f4:ptr; f5:ptr; f6:ptr; f7:ptr; f8:ptr; f9:ptr; + g0:ptr; g1:ptr; g2:ptr; g3:ptr; g4:ptr; g5:ptr; g6:ptr; g7:ptr; g8:ptr; g9:ptr; + h0:ptr; h1:ptr; h2:ptr; h3:ptr; h4:ptr; h5:ptr; h6:ptr; h7:ptr; h8:ptr; h9:ptr; + i0:ptr; i1:ptr; i2:ptr; i3:ptr; i4:ptr; i5:ptr; i6:ptr; i7:ptr; i8:ptr; i9:ptr; + j0:ptr; j1:ptr; j2:ptr; j3:ptr; j4:ptr; j5:ptr; j6:ptr; j7:ptr; j8:ptr; j9:ptr; + k0:ptr; k1:ptr; k2:ptr; k3:ptr; k4:ptr; k5:ptr; k6:ptr; k7:ptr; k8:ptr; k9:ptr; + l0:ptr; l1:ptr; l2:ptr; l3:ptr; l4:ptr; l5:ptr; l6:ptr; l7:ptr; l8:ptr; l9:ptr; + m0:ptr; m1:ptr; m2:ptr; m3:ptr; m4:ptr; m5:ptr; m6:ptr; m7:ptr; m8:ptr; m9:ptr; + n0:ptr; n1:ptr; n2:ptr; n3:ptr; n4:ptr; n5:ptr; n6:ptr; n7:ptr; n8:ptr; n9:ptr; + o0:ptr; o1:ptr; o2:ptr; o3:ptr; o4:ptr; o5:ptr; o6:ptr; o7:ptr; o8:ptr; o9:ptr; + p0:ptr; p1:ptr; p2:ptr; p3:ptr; p4:ptr; p5:ptr; p6:ptr; p7:ptr; p8:ptr; p9:ptr; + q0:ptr; q1:ptr; q2:ptr; q3:ptr; q4:ptr; q5:ptr; q6:ptr; q7:ptr; q8:ptr; q9:ptr; + r0:ptr; r1:ptr; r2:ptr; r3:ptr; r4:ptr; r5:ptr; r6:ptr; r7:ptr; r8:ptr; r9:ptr; + s0:ptr; s1:ptr; s2:ptr; s3:ptr; s4:ptr; s5:ptr; s6:ptr; s7:ptr; s8:ptr; s9:ptr; + t0:ptr; t1:ptr; t2:ptr; t3:ptr; t4:ptr; t5:ptr; t6:ptr; t7:ptr; t8:ptr; t9:ptr; + u0:ptr; u1:ptr; u2:ptr; u3:ptr; u4:ptr; u5:ptr; u6:ptr; u7:ptr; u8:ptr; u9:ptr; + v0:ptr; v1:ptr; v2:ptr; v3:ptr; v4:ptr; v5:ptr; v6:ptr; v7:ptr; v8:ptr; v9:ptr; + w0:ptr; w1:ptr; w2:ptr; w3:ptr; w4:ptr; w5:ptr; w6:ptr; w7:ptr; w8:ptr; w9:ptr; + x0:ptr; x1:ptr; x2:ptr; x3:ptr; x4:ptr; x5:ptr; x6:ptr; x7:ptr; x8:ptr; x9:ptr; + y0:ptr; y1:ptr; y2:ptr; y3:ptr; y4:ptr; y5:ptr; y6:ptr; y7:ptr; y8:ptr; y9:ptr; + z0:ptr; z1:ptr; z2:ptr; z3:ptr; z4:ptr; + int:int; unboxed:float# + } +[%%expect{| +Lines 1-29, characters 28-2: + 1 | ............................A of { + 2 | a0:ptr; a1:ptr; a2:ptr; a3:ptr; a4:ptr; a5:ptr; a6:ptr; a7:ptr; a8:ptr; a9:ptr; + 3 | b0:ptr; b1:ptr; b2:ptr; b3:ptr; b4:ptr; b5:ptr; b6:ptr; b7:ptr; b8:ptr; b9:ptr; + 4 | c0:ptr; c1:ptr; c2:ptr; c3:ptr; c4:ptr; c5:ptr; c6:ptr; c7:ptr; c8:ptr; c9:ptr; + 5 | d0:ptr; d1:ptr; d2:ptr; d3:ptr; d4:ptr; d5:ptr; d6:ptr; d7:ptr; d8:ptr; d9:ptr; +... +26 | y0:ptr; y1:ptr; y2:ptr; y3:ptr; y4:ptr; y5:ptr; y6:ptr; y7:ptr; y8:ptr; y9:ptr; +27 | z0:ptr; z1:ptr; z2:ptr; z3:ptr; z4:ptr; +28 | int:int; unboxed:float# +29 | } +Error: Mixed inline record arguments to constructors may contain at most 254 value fields prior to the flat suffix, but this one contains 255. +|}];; +type t_ext += + A of + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + ptr * ptr * ptr * ptr * ptr * ptr * ptr * + int * float# +[%%expect{| +Lines 2-35, characters 2-16: + 2 | ..A of + 3 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + 4 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + 5 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * + 6 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * +... +32 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * +33 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * ptr * +34 | ptr * ptr * ptr * ptr * ptr * ptr * ptr * +35 | int * float# +Error: Mixed constructors may contain at most 254 value fields prior to the flat suffix, but this one contains 255. +|}];; + +(* GADT syntax *) + +type ('a : float64) tf : float64 +type ('a : value) tv : value + +[%%expect {| +type ('a : float64) tf : float64 +type 'a tv : value +|}] + +type ('a : any) t_gadt_any = + | A : 'a tf -> 'a t_gadt_any + | B : 'b tv -> 'a t_gadt_any + | A_record : { x : 'a tf } -> 'a t_gadt_any + | B_record : { x : 'a tv } -> 'a t_gadt_any + +[%%expect {| +type ('a : any) t_gadt_any = + A : ('a : float64). 'a tf -> 'a t_gadt_any + | B : 'b tv -> 'a t_gadt_any + | A_record : ('a : float64). { x : 'a tf; } -> 'a t_gadt_any + | B_record : { x : 'a tv; } -> 'a t_gadt_any +|}] + +type ('a : any) t_gadt_any_multiple_fields = + | A : float# * 'a tf -> 'a t_gadt_any_multiple_fields + | B : 'b tv * float# -> 'a t_gadt_any_multiple_fields + | A_record : { x : float#; y : 'a tf } -> 'a t_gadt_any_multiple_fields + | B_record : { x : 'b tv; y : float# } -> 'a t_gadt_any_multiple_fields + +[%%expect {| +type ('a : any) t_gadt_any_multiple_fields = + A : ('a : float64). float# * 'a tf -> 'a t_gadt_any_multiple_fields + | B : 'b tv * float# -> 'a t_gadt_any_multiple_fields + | A_record : ('a : float64). { x : float#; y : 'a tf; + } -> 'a t_gadt_any_multiple_fields + | B_record : { x : 'b tv; y : float#; } -> 'a t_gadt_any_multiple_fields +|}] + +type ('a : any) t_gadt_any_bad = + | A : float# * 'a tv -> 'a t_gadt_any_bad + +[%%expect{| +Line 2, characters 2-43: +2 | | A : float# * 'a tv -> 'a t_gadt_any_bad + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Expected all flat constructor arguments after non-value argument, + float#, but found boxed argument, 'a tv. +|}] + +type ('a : any) t_gadt_any_record_bad = + | A : { x : float#; y : 'a tv } -> 'a t_gadt_any_record_bad + +[%%expect{| +Line 2, characters 10-21: +2 | | A : { x : float#; y : 'a tv } -> 'a t_gadt_any_record_bad + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, x, + but found boxed field, y. +|}] diff --git a/testsuite/tests/typing-layouts/mixed_constructor_arguments_alpha.ml b/testsuite/tests/typing-layouts/mixed_constructor_arguments_alpha.ml new file mode 100644 index 00000000000..b3bedbba842 --- /dev/null +++ b/testsuite/tests/typing-layouts/mixed_constructor_arguments_alpha.ml @@ -0,0 +1,36 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(* Void is not allowed in mixed constructors, for now *) + +type t_void : void + +type t_void_in_value_prefix = A of t_void * string * float# +[%%expect {| +type t_void : void +Line 3, characters 30-59: +3 | type t_void_in_value_prefix = A of t_void * string * float# + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type t_void has layout void. + Structures with non-value elements may not yet contain types of this layout. +|}] + +type t_void_in_flat_suffix = A of int * float# * t_void +[%%expect {| +Line 1, characters 29-55: +1 | type t_void_in_flat_suffix = A of int * float# * t_void + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type t_void has layout void. + Structures with non-value elements may not yet contain types of this layout. +|}] + +type t_void_at_border_of_prefix_and_suffix = A of string * t_void * float# +[%%expect {| +Line 1, characters 45-74: +1 | type t_void_at_border_of_prefix_and_suffix = A of string * t_void * float# + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type t_void has layout void. + Structures with non-value elements may not yet contain types of this layout. +|}] diff --git a/testsuite/tests/typing-layouts/mixed_records.ml b/testsuite/tests/typing-layouts/mixed_records.ml new file mode 100644 index 00000000000..5cac96d5a3d --- /dev/null +++ b/testsuite/tests/typing-layouts/mixed_records.ml @@ -0,0 +1,287 @@ +(* TEST + { + flags = "-extension layouts_alpha"; + expect; + }{ + flags = "-extension layouts_beta"; + expect; + }{ + expect; + } +*) + +(* Mixed float-float# blocks are always OK. *) +type t = + { a : float; + b : float#; + } + +[%%expect{| +type t = { a : float; b : float#; } +|}];; + +(* Mixed float-float# blocks are always OK. *) +type t = + { a : float#; + b : float; + } + +[%%expect{| +type t = { a : float#; b : float; } +|}];; + +(* When a non-float/float# field appears, [float] + fields are no longer considered flat. *) +type t = + { a : float#; + b : float; + c : int; + } + +[%%expect{| +Line 3, characters 4-14: +3 | b : float; + ^^^^^^^^^^ +Error: Expected all flat fields after non-value field, a, + but found boxed field, b. +|}];; + +(* [float] appearing as a non-flat field in the value prefix. *) +type t = + { a : float; + b : float#; + c : int; + } + +[%%expect{| +type t = { a : float; b : float#; c : int; } +|}];; + +(* The field [c] can't be flat because a non-float/float# field [d] appears. *) +type t = + { a : float; + b : float#; + c : float; + d : int; + } + +[%%expect{| +Line 4, characters 4-14: +4 | c : float; + ^^^^^^^^^^ +Error: Expected all flat fields after non-value field, b, + but found boxed field, c. +|}];; + +(* String can't appear in the flat suffix *) +type t = + { a : float#; + b : string; + } + +[%%expect{| +Line 3, characters 4-15: +3 | b : string; + ^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, a, + but found boxed field, b. +|}];; + +(* [f3] can be flat because all other fields are float/float#, + so it can appear in the flat suffix. + *) +type t = + { f1 : float#; + f2 : float#; + f3 : float; + } + +[%%expect{| +type t = { f1 : float#; f2 : float#; f3 : float; } +|}];; + +(* The string [f3] can't appear in the flat suffix. *) +type t = + { f1 : float#; + f2 : float#; + f3 : string; + } + +[%%expect{| +Line 4, characters 4-16: +4 | f3 : string; + ^^^^^^^^^^^^ +Error: Expected all flat fields after non-value field, f1, + but found boxed field, f3. +|}];; + +(* The int [c] can appear in the flat suffix. *) +type t = + { a : float#; + b : float#; + c : int; + } + +[%%expect{| +type t = { a : float#; b : float#; c : int; } +|}];; + +(* Parameterized types *) + +type ('a : float64) t = { x : string; y : 'a } +[%%expect{| +type ('a : float64) t = { x : string; y : 'a; } +|}];; + +type ('a : float64, 'b : immediate) t = { x : string; y : 'a; z : 'b } +[%%expect{| +type ('a : float64, 'b : immediate) t = { x : string; y : 'a; z : 'b; } +|}];; + +(* Types with external mode are allowed in flat suffix *) + +type ('a : value mod external_) t = { x : float#; y : 'a } +type ('a : immediate) t = { x : float#; y : 'a } +[%%expect {| +type ('a : value mod external_) t = { x : float#; y : 'a; } +type ('a : immediate) t = { x : float#; y : 'a; } +|}] + +type u : value mod external_ +type t = { x : float#; y : u } +[%%expect {| +type u : value mod external_ +type t = { x : float#; y : u; } +|}] + +type u : immediate +type t = { x : float#; y : u } +[%%expect {| +type u : immediate +type t = { x : float#; y : u; } +|}] + +(* Types with external mode and value layout are allowed in scannable prefix *) + +type ('a : value mod external_) t = { x : 'a; y : string } +type ('a : immediate) t = { x : 'a; y : string } +[%%expect {| +type ('a : value mod external_) t = { x : 'a; y : string; } +type ('a : immediate) t = { x : 'a; y : string; } +|}] + +type u : value mod external_ +type t = { x : u ; y : string } +[%%expect {| +type u : value mod external_ +type t = { x : u; y : string; } +|}] + +type u : immediate +type t = { x : u ; y : string } +[%%expect {| +type u : immediate +type t = { x : u; y : string; } +|}] + +(* Recursive groups *) + +type ('a : float64) t_float64_id = 'a +type ('a : immediate) t_immediate_id = 'a +[%%expect{| +type ('a : float64) t_float64_id = 'a +type ('a : immediate) t_immediate_id = 'a +|}];; + +type 'a t_float = 'a t_float64_id +and 'a t_imm = 'a t_immediate_id +and ('a, 'b, 'ptr) t = + {ptr : 'ptr; x : 'a; y : 'a t_float; z : 'b; w : 'b t_imm} +[%%expect{| +Line 4, characters 27-37: +4 | {ptr : 'ptr; x : 'a; y : 'a t_float; z : 'b; w : 'b t_imm} + ^^^^^^^^^^ +Error: Layout mismatch in final type declaration consistency check. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The layout of 'a is float64 + because of the definition of t_float64_id at line 1, characters 0-37. + But the layout of 'a must overlap with value + because it instantiates an unannotated type parameter of t, + defaulted to layout value. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}];; + +type 'a t_float = 'a t_float64_id +and 'a t_imm = 'a t_immediate_id +and ('a : float64, 'b : immediate, 'ptr) t = + {ptr : 'ptr; x : 'a; y : 'a t_float; z : 'b; w : 'b t_imm} +[%%expect{| +type ('a : float64) t_float = 'a t_float64_id +and ('a : immediate) t_imm = 'a t_immediate_id +and ('a : float64, 'b : immediate, 'ptr) t = { + ptr : 'ptr; + x : 'a; + y : 'a t_float; + z : 'b; + w : 'b t_imm; +} +|}];; + + +(* There is a cap on the number of fields in the scannable prefix. *) +type ptr = string +type t = + { + x1:ptr; x2:ptr; x3:ptr; x4:ptr; x5:ptr; x6:ptr; x7:ptr; x8:ptr; + x9:ptr; x10:ptr; x11:ptr; x12:ptr; x13:ptr; x14:ptr; x15:ptr; x16:ptr; + x17:ptr; x18:ptr; x19:ptr; x20:ptr; x21:ptr; x22:ptr; x23:ptr; x24:ptr; + x25:ptr; x26:ptr; x27:ptr; x28:ptr; x29:ptr; x30:ptr; x31:ptr; x32:ptr; + x33:ptr; x34:ptr; x35:ptr; x36:ptr; x37:ptr; x38:ptr; x39:ptr; x40:ptr; + x41:ptr; x42:ptr; x43:ptr; x44:ptr; x45:ptr; x46:ptr; x47:ptr; x48:ptr; + x49:ptr; x50:ptr; x51:ptr; x52:ptr; x53:ptr; x54:ptr; x55:ptr; x56:ptr; + x57:ptr; x58:ptr; x59:ptr; x60:ptr; x61:ptr; x62:ptr; x63:ptr; x64:ptr; + x65:ptr; x66:ptr; x67:ptr; x68:ptr; x69:ptr; x70:ptr; x71:ptr; x72:ptr; + x73:ptr; x74:ptr; x75:ptr; x76:ptr; x77:ptr; x78:ptr; x79:ptr; x80:ptr; + x81:ptr; x82:ptr; x83:ptr; x84:ptr; x85:ptr; x86:ptr; x87:ptr; x88:ptr; + x89:ptr; x90:ptr; x91:ptr; x92:ptr; x93:ptr; x94:ptr; x95:ptr; x96:ptr; + x97:ptr; x98:ptr; x99:ptr; x100:ptr; x101:ptr; x102:ptr; x103:ptr; x104:ptr; + x105:ptr; x106:ptr; x107:ptr; x108:ptr; x109:ptr; x110:ptr; x111:ptr; x112:ptr; + x113:ptr; x114:ptr; x115:ptr; x116:ptr; x117:ptr; x118:ptr; x119:ptr; x120:ptr; + x121:ptr; x122:ptr; x123:ptr; x124:ptr; x125:ptr; x126:ptr; x127:ptr; x128:ptr; + x129:ptr; x130:ptr; x131:ptr; x132:ptr; x133:ptr; x134:ptr; x135:ptr; x136:ptr; + x137:ptr; x138:ptr; x139:ptr; x140:ptr; x141:ptr; x142:ptr; x143:ptr; x144:ptr; + x145:ptr; x146:ptr; x147:ptr; x148:ptr; x149:ptr; x150:ptr; x151:ptr; x152:ptr; + x153:ptr; x154:ptr; x155:ptr; x156:ptr; x157:ptr; x158:ptr; x159:ptr; x160:ptr; + x161:ptr; x162:ptr; x163:ptr; x164:ptr; x165:ptr; x166:ptr; x167:ptr; x168:ptr; + x169:ptr; x170:ptr; x171:ptr; x172:ptr; x173:ptr; x174:ptr; x175:ptr; x176:ptr; + x177:ptr; x178:ptr; x179:ptr; x180:ptr; x181:ptr; x182:ptr; x183:ptr; x184:ptr; + x185:ptr; x186:ptr; x187:ptr; x188:ptr; x189:ptr; x190:ptr; x191:ptr; x192:ptr; + x193:ptr; x194:ptr; x195:ptr; x196:ptr; x197:ptr; x198:ptr; x199:ptr; x200:ptr; + x201:ptr; x202:ptr; x203:ptr; x204:ptr; x205:ptr; x206:ptr; x207:ptr; x208:ptr; + x209:ptr; x210:ptr; x211:ptr; x212:ptr; x213:ptr; x214:ptr; x215:ptr; x216:ptr; + x217:ptr; x218:ptr; x219:ptr; x220:ptr; x221:ptr; x222:ptr; x223:ptr; x224:ptr; + x225:ptr; x226:ptr; x227:ptr; x228:ptr; x229:ptr; x230:ptr; x231:ptr; x232:ptr; + x233:ptr; x234:ptr; x235:ptr; x236:ptr; x237:ptr; x238:ptr; x239:ptr; x240:ptr; + x241:ptr; x242:ptr; x243:ptr; x244:ptr; x245:ptr; x246:ptr; x247:ptr; x248:ptr; + x249:ptr; x250:ptr; x251:ptr; x252:ptr; x253:ptr; x254:ptr; x255:ptr; + value_but_flat:int; unboxed:float#; + } +[%%expect{| +type ptr = string +Lines 2-37, characters 0-3: + 2 | type t = + 3 | { + 4 | x1:ptr; x2:ptr; x3:ptr; x4:ptr; x5:ptr; x6:ptr; x7:ptr; x8:ptr; + 5 | x9:ptr; x10:ptr; x11:ptr; x12:ptr; x13:ptr; x14:ptr; x15:ptr; x16:ptr; + 6 | x17:ptr; x18:ptr; x19:ptr; x20:ptr; x21:ptr; x22:ptr; x23:ptr; x24:ptr; +... +34 | x241:ptr; x242:ptr; x243:ptr; x244:ptr; x245:ptr; x246:ptr; x247:ptr; x248:ptr; +35 | x249:ptr; x250:ptr; x251:ptr; x252:ptr; x253:ptr; x254:ptr; x255:ptr; +36 | value_but_flat:int; unboxed:float#; +37 | } +Error: Mixed records may contain at most 254 value fields prior to the flat suffix, but this one contains 255. +|}];; diff --git a/testsuite/tests/typing-layouts/mixed_records_alpha.ml b/testsuite/tests/typing-layouts/mixed_records_alpha.ml new file mode 100644 index 00000000000..c7e703028ab --- /dev/null +++ b/testsuite/tests/typing-layouts/mixed_records_alpha.ml @@ -0,0 +1,46 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(* Void is not allowed in mixed records, for now *) + +type t_void : void + +type t_void_in_value_prefix = { x : t_void; y : string; z : float# } +[%%expect {| +type t_void : void +Line 3, characters 0-68: +3 | type t_void_in_value_prefix = { x : t_void; y : string; z : float# } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type t_void has layout void. + Structures with non-value elements may not yet contain types of this layout. +|}] + +type t_void_in_flat_suffix = { x : int; y : float#; z : t_void } +[%%expect {| +Line 1, characters 0-64: +1 | type t_void_in_flat_suffix = { x : int; y : float#; z : t_void } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type t_void has layout void. + Structures with non-value elements may not yet contain types of this layout. +|}] + +type t_void_at_border_of_prefix_and_suffix = + { x : string; y : t_void; z : float# } +[%%expect {| +Lines 1-2, characters 0-40: +1 | type t_void_at_border_of_prefix_and_suffix = +2 | { x : string; y : t_void; z : float# } +Error: Type t_void has layout void. + Structures with non-value elements may not yet contain types of this layout. +|}] + +type t_void_in_all_float_mixed_record = { x : t_void; y : float#; z : float } +[%%expect {| +Line 1, characters 0-77: +1 | type t_void_in_all_float_mixed_record = { x : t_void; y : float#; z : float } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type t_void has layout void. + Structures with non-value elements may not yet contain types of this layout. +|}] diff --git a/testsuite/tests/typing-layouts/modules.ml b/testsuite/tests/typing-layouts/modules.ml index a41bfb0428c..69373f5a254 100644 --- a/testsuite/tests/typing-layouts/modules.ml +++ b/testsuite/tests/typing-layouts/modules.ml @@ -1,23 +1,24 @@ (* TEST - * expect - flags = "-extension layouts" + include stdlib_upstream_compatible; + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } *) type t_value : value type t_imm : immediate -type t_imm64 : immediate64;; +type t_imm64 : immediate64 +type t_float64 : float64 +type t_any : any;; [%%expect {| type t_value : value type t_imm : immediate type t_imm64 : immediate64 -|}];; - -type t_any : any;; -[%%expect{| -Line 1, characters 15-18: -1 | type t_any : any;; - ^^^ -Error: Layout any is used here, but the appropriate layouts extension is not enabled +type t_float64 : float64 +type t_any : any |}];; type t_void : void;; @@ -25,15 +26,15 @@ type t_void : void;; Line 1, characters 15-19: 1 | type t_void : void;; ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. |}];; (*********************************************************) (* Test 1: Simple with type constraints respect jkinds. *) -(* CR layouts: parts of this test moved to [modules_alpha.ml] because they - need a non-value jkind. Bring back here when we have one enabled by - default. *) +(* CR layouts v5: parts of this test moved to [modules_alpha.ml] because they + need void. Bring back here when we have it. *) module type S1 = sig type ('a : void) t type s @@ -42,44 +43,162 @@ end;; Line 2, characters 13-17: 2 | type ('a : void) t ^^^^ -Error: Layout void is more experimental than allowed by -extension layouts. +Error: Layout void is more experimental than allowed by the enabled layouts extension. You must enable -extension layouts_alpha to use this feature. |}];; -(* CR layouts: parts of this test moved to [modules_beta.ml] because they need - immediate annotations on type parameters. Bring back here when we turn that - on by default. *) -module type S1_2 = sig - type ('a : immediate) t +module type S1f = sig + type ('a : float64) t + type s end;; + +type ('a : float64) t1;; + +module type S1f' = S1f with type 'a t = t_float64 t1 and type s = t_float64 t1;; + [%%expect {| -Line 2, characters 13-22: -2 | type ('a : immediate) t - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. +module type S1f = sig type ('a : float64) t type s end +type ('a : float64) t1 +module type S1f' = + sig type ('a : float64) t = t_float64 t1 type s = t_float64 t1 end |}];; +module type S1f'' = S1f with type 'a t = 'a list;; +[%%expect {| +Line 1, characters 34-36: +1 | module type S1f'' = S1f with type 'a t = 'a list;; + ^^ +Error: The type constraints are not consistent. + Type ('a : value) is not compatible with type ('b : float64) + The layout of 'a is float64 + because of the definition of t at line 2, characters 2-23. + But the layout of 'a must overlap with value + because the type argument of list has layout value. +|}];; + +module type S1f'' = S1f with type s = t_float64;; + +[%%expect{| +Line 1, characters 29-47: +1 | module type S1f'' = S1f with type s = t_float64;; + ^^^^^^^^^^^^^^^^^^ +Error: The layout of type t_float64 is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of type t_float64 must be a sublayout of value + because of the definition of s at line 3, characters 2-8. +|}] + +module type S1_2 = sig + type ('a : immediate) t +end + +module type S1_2' = S1_2 with type 'a t = 'a list + +module M1_2' : S1_2' = struct + type ('a : immediate) t = 'a list +end;; +[%%expect{| +module type S1_2 = sig type ('a : immediate) t end +module type S1_2' = sig type ('a : immediate) t = 'a list end +module M1_2' : S1_2' +|}] + +(* CR layouts - annoyingly, the immediate annotation on 'a is required. We + can probably relax this so you don't have to label the parameter explcitly + and the jkind is determined from the signature. But we anticipate it'll + require non-trivial refactoring of eqtype, so we've put it off for now. *) +module M1_2'': S1_2' = struct + type 'a t = 'a list +end;; +[%%expect{| +Lines 1-3, characters 23-3: +1 | .......................struct +2 | type 'a t = 'a list +3 | end.. +Error: Signature mismatch: + Modules do not match: + sig type 'a t = 'a list end + is not included in + S1_2' + Type declarations do not match: + type 'a t = 'a list + is not included in + type ('a : immediate) t = 'a list + The type ('a : value) is not equal to the type ('a0 : immediate) + because their layouts are different. +|}] + +module M1_2''' : S1_2 = struct + type 'a t = 'a list +end;; +[%%expect{| +Lines 1-3, characters 24-3: +1 | ........................struct +2 | type 'a t = 'a list +3 | end.. +Error: Signature mismatch: + Modules do not match: + sig type 'a t = 'a list end + is not included in + S1_2 + Type declarations do not match: + type 'a t = 'a list + is not included in + type ('a : immediate) t + Their parameters differ: + The type ('a : value) is not equal to the type ('a0 : immediate) + because their layouts are different. +|}] + (************************************************************************) (* Test 2: with type constraints for fixed types (the complicated case of Type_mod.merge_constraint) *) - -(* CR layouts: this test moved to [modules_beta.ml] because it needs immediate - annotations on type parameters. Bring back here when we turn that on by - default. *) module type S2 = sig type ('a : immediate) t +end + +type ('a : immediate) r2 = R +type ('a : immediate) s2 = private [> `A of 'a r2] + +module type T2 = S2 with type 'a t = 'a s2 + +module F2 (X : T2) = struct + let f () : 'a X.t = `A R end;; [%%expect{| -Line 2, characters 13-22: -2 | type ('a : immediate) t - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. -|}];; +module type S2 = sig type ('a : immediate) t end +type ('a : immediate) r2 = R +type (!'a : immediate) s2 = private [> `A of 'a r2 ] +module type T2 = sig type ('a : immediate) t = 'a s2 end +module F2 : + functor (X : T2) -> sig val f : ('a : immediate). unit -> 'a X.t end +|}] + +type ('a : immediate) s2' = private [> `B of 'a] +module type T2' = S2 with type 'a t = 'a s2' + +module F2' (X : T2') = struct + let f () : 'a X.t = `B "bad" +end +[%%expect{| +type (!'a : immediate) s2' = private [> `B of 'a ] +module type T2' = sig type ('a : immediate) t = 'a s2' end +Line 5, characters 25-30: +5 | let f () : 'a X.t = `B "bad" + ^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of t at line 2, characters 2-25. +|}] (******************************************************************) (* Test 3: Recursive modules, with and without jkind annotations *) + +(* CR layouts v5: Some parts of this test need void. *) + module rec Foo3 : sig val create : Bar3.t -> unit end = struct @@ -96,9 +215,6 @@ module rec Foo3 : sig val create : Bar3.t -> unit end and Bar3 : sig type t end |}];; -(* CR layouts: parts of this test moved to [modules_alpha.ml] because they - need a non-value jkind. Bring back here when we have one enabled by - default. *) module rec Foo3 : sig val create : Bar3.t -> unit end = struct @@ -114,7 +230,24 @@ end;; Line 8, characters 11-15: 8 | type t : void ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. +|}];; + +module rec Foo3f : sig + val create : Bar3f.t -> unit +end = struct + let create _ = () +end + +and Bar3f : sig + type t : float64 +end = struct + type t : float64 +end;; +[%%expect {| +module rec Foo3f : sig val create : Bar3f.t -> unit end +and Bar3f : sig type t : float64 end |}];; module rec Foo3 : sig @@ -132,7 +265,10 @@ end;; Line 2, characters 2-29: 2 | type t : immediate = Bar3.t ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type Bar3.t has layout value, which is not a sublayout of immediate. +Error: The kind of type Bar3.t is value + because of the annotation on the declaration of the type t. + But the kind of type Bar3.t must be a subkind of immediate + because of the definition of t at line 2, characters 2-29. |}];; module rec Foo3 : sig @@ -151,22 +287,174 @@ module rec Foo3 : sig type t = Bar3.t end and Bar3 : sig type t : immediate end |}];; -(* CR layouts: more bits moved to [modules_alpha.ml] from down here. *) +module rec Foo3f : sig + type 'a t = 'a Bar3f.t * 'a list +end = struct + type t = 'a Bar3f.t * 'a list +end + +and Bar3f : sig + type ('a : float64) t +end = struct + type 'a t +end;; +[%%expect {| +Line 2, characters 27-29: +2 | type 'a t = 'a Bar3f.t * 'a list + ^^ +Error: This type ('a : float64) should be an instance of type ('b : value) + The layout of 'a is float64 + because of the annotation on 'a in the declaration of the type t. + But the layout of 'a must overlap with value + because the type argument of list has layout value. +|}];; + +type t3f : float64 + +module rec Foo3f : sig + type t = t3f +end = struct + type t = t3f +end + +and Bar3f : sig + type ('a : float64) t + + type s = Foo3f.t t +end = struct + type ('a : float64) t + type s = Foo3f.t t +end;; +[%%expect {| +type t3f : float64 +Line 12, characters 11-18: +12 | type s = Foo3f.t t + ^^^^^^^ +Error: This type Foo3f.t should be an instance of type ('a : float64) + The layout of Foo3f.t is value + because an abstract type has the value layout by default. + But the layout of Foo3f.t must be a sublayout of float64 + because of the definition of t at line 10, characters 2-23. +|}];; + +(* Previous example works with annotation *) +module rec Foo3f : sig + type t : float64 = t3f +end = struct + type t = t3f +end + +and Bar3 : sig + type ('a : float64) t + + type s = Foo3f.t t +end = struct + type ('a : float64) t + type s = Foo3f.t t +end;; +[%%expect {| +module rec Foo3f : sig type t = t3f end +and Bar3 : sig type ('a : float64) t type s = Foo3f.t t end +|}];; (*************************************************************************) (* Test 4: Nondep typedecl jkind approximation in the Nondep_cannot_erase case. *) -(* CR layouts: This test moved to [modules_beta.ml] and [modules_alpha.ml]. - Parts of it can come back when we have the ability to annotate type parameter - jkinds without extension flags, and other parts need a non-value jkind. *) +(* CR layouts v5: Bring back the void part of this test. *) +module F4(X : sig type t end) = struct + type s = Foo of X.t +end + +module M4 = F4(struct type t = T end) + +type ('a : value) t4_val + +type t4 = M4.s t4_val;; +[%%expect {| +module F4 : functor (X : sig type t end) -> sig type s = Foo of X.t end +module M4 : sig type s end +type 'a t4_val +type t4 = M4.s t4_val +|}] + +type ('a : float64) t4_float64 +type t4f' = M4.s t4_float64;; +[%%expect {| +type ('a : float64) t4_float64 +Line 2, characters 12-16: +2 | type t4f' = M4.s t4_float64;; + ^^^^ +Error: This type M4.s should be an instance of type ('a : float64) + The layout of M4.s is value + because of the definition of s at line 2, characters 2-21. + But the layout of M4.s must be a sublayout of float64 + because of the definition of t4_float64 at line 1, characters 0-30. +|}] + +module F4'(X : sig type t : immediate end) = struct + type s : immediate = Foo of X.t [@@unboxed] +end + +module M4' = F4'(struct type t = T end) + +type ('a : immediate) t4_imm + +type t4 = M4'.s t4_imm;; +[%%expect{| +module F4' : + functor (X : sig type t : immediate end) -> + sig type s : immediate = Foo of X.t [@@unboxed] end +module M4' : sig type s : immediate end +type ('a : immediate) t4_imm +type t4 = M4'.s t4_imm +|}];; + +type t4 = M4'.s t4_float64;; +[%%expect{| +Line 1, characters 10-15: +1 | type t4 = M4'.s t4_float64;; + ^^^^^ +Error: This type M4'.s should be an instance of type ('a : float64) + The layout of M4'.s is value + because of the definition of s at line 2, characters 2-45. + But the layout of M4'.s must be a sublayout of float64 + because of the definition of t4_float64 at line 1, characters 0-30. +|}];; + (************************************) (* Test 5: Destructive substitution *) +module type S3_1 = sig + type ('a : immediate) t + val f : 'a -> 'a t +end + +module type S3_1' = S3_1 with type 'a t := 'a list + +module M3_1 : S3_1' = struct + let f x = [x] +end + +let x3 = M3_1.f 42 -(* CR layouts: The first part of this test has been moved to [modules_beta.ml]. - It can come back when we have the ability to annotate jkind parameters - without extensions. *) +let x3' = M3_1.f "test";; +[%%expect{| +module type S3_1 = + sig type ('a : immediate) t val f : ('a : immediate). 'a -> 'a t end +module type S3_1' = sig val f : ('a : immediate). 'a -> 'a list end +module M3_1 : S3_1' +val x3 : int list = [42] +Line 14, characters 17-23: +14 | let x3' = M3_1.f "test";; + ^^^^^^ +Error: This expression has type string but an expression was expected of type + ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of f at line 3, characters 2-20. +|}] module type S3_2 = sig type t : immediate @@ -178,15 +466,16 @@ module type S3_2 = sig type t : immediate end Line 5, characters 30-46: 5 | module type S3_2' = S3_2 with type t := string;; ^^^^^^^^^^^^^^^^ -Error: Type string has layout value, which is not a sublayout of immediate. +Error: The kind of type string is value + because it is the primitive value type string. + But the kind of type string must be a subkind of immediate + because of the definition of t at line 2, characters 2-20. |}] (*****************************************) (* Test 6: With constraints on packages. *) -(* CR layouts: The first part of this test needs a non-value jkind and has - been moved to modules_alpha.ml. Bring it back once we have a non-value - jkind enabled by default. *) +(* CR layouts v5: Bring over void versions of these tests from modules_alpha *) module type S6_1 = sig type t : void end @@ -194,9 +483,57 @@ end Line 2, characters 11-15: 2 | type t : void ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. |}] +module type S6_1f = sig + type t : float64 +end + +module type S6_2f = sig + val m : (module S6_1f with type t = int) +end;; +[%%expect{| +module type S6_1f = sig type t : float64 end +Line 6, characters 10-42: +6 | val m : (module S6_1f with type t = int) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this `with' constraint, the new definition of t + does not match its original definition in the constrained signature: + Type declarations do not match: + type t = int + is not included in + type t : float64 + The layout of the first is value + because it is the primitive immediate type int. + But the layout of the first must be a sublayout of float64 + because of the definition of t at line 2, characters 2-18. +|}];; + +module type S6_3 = sig + type t : value +end + +module type S6_4f = sig + val m : (module S6_3 with type t = t_float64) +end;; +[%%expect{| +module type S6_3 = sig type t : value end +Line 6, characters 10-47: +6 | val m : (module S6_3 with type t = t_float64) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this `with' constraint, the new definition of t + does not match its original definition in the constrained signature: + Type declarations do not match: + type t = t_float64 + is not included in + type t : value + The layout of the first is float64 + because of the definition of t_float64 at line 4, characters 0-24. + But the layout of the first must be a sublayout of value + because of the definition of t at line 2, characters 2-16. +|}];; module type S6_5 = sig type t : immediate @@ -213,10 +550,13 @@ Line 6, characters 10-44: Error: In this `with' constraint, the new definition of t does not match its original definition in the constrained signature: Type declarations do not match: - type t + type t = string is not included in type t : immediate - the first has layout value, which is not a sublayout of immediate. + The kind of the first is value + because it is the primitive value type string. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 2, characters 2-20. |}];; module type S6_6' = sig @@ -230,31 +570,22 @@ Line 3, characters 10-39: Error: In this `with' constraint, the new definition of t does not match its original definition in the constrained signature: Type declarations do not match: - type t + type t = s is not included in type t : immediate - the first has layout value, which is not a sublayout of immediate. + The kind of the first is value + because of the definition of s at line 2, characters 2-8. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 2, characters 2-20. |}];; -(* CR layouts: this is broken because of the package with-type hack. It was - already broken before jkinds, but it would be nice to fix. See the comment - on See the comments in the [Ptyp_package] case of - [Typetexp.transl_type_aux]. *) module type S6_6'' = sig type s = int val m : (module S6_5 with type t = int) end;; [%%expect{| -Line 3, characters 10-41: -3 | val m : (module S6_5 with type t = int) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: In this `with' constraint, the new definition of t - does not match its original definition in the constrained signature: - Type declarations do not match: - type t - is not included in - type t : immediate - the first has layout value, which is not a sublayout of immediate. +module type S6_6'' = + sig type s = int val m : (module S6_5 with type t = int) end |}];; (*****************************************) @@ -269,4 +600,134 @@ module F : sig end -> sig end (****************************************) (* Test 8: [val]s must be representable *) -(* CR layouts: Bring this test back from modules_alpha *) +module type S = sig val x : t_any end + +module M = struct + let x : t_void = assert false +end + +[%%expect{| +Line 1, characters 28-33: +1 | module type S = sig val x : t_any end + ^^^^^ +Error: This type signature for x is not a value type. + The layout of type t_any is any + because of the definition of t_any at line 5, characters 0-18. + But the layout of type t_any must be a sublayout of value + because it's the type of something stored in a module structure. +|}] + +(****************************************************************) +(* Test 9: Non-values temporarily banned in recmod safety check *) +module type S = sig + val f : ('a : float64). 'a -> 'a +end + +module rec M : S = M + +[%%expect{| +module type S = sig val f : ('a : float64). 'a -> 'a end +Line 5, characters 19-20: +5 | module rec M : S = M + ^ +Error: Cannot safely evaluate the definition of the following cycle + of recursively-defined modules: M -> M. + There are no safe modules in this cycle (see manual section 12.2). +Line 2, characters 2-34: +2 | val f : ('a : float64). 'a -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Module M defines a function whose first argument is not a value, f . +|}] + +(*******************************) +(* Test 10: Specializing [any] *) + +(* see also the test any_in_types.ml, which makes sure running code + that looks like this produces the right result *) + +module type S = sig + type t : any + + val one : unit -> t + val print : t -> unit +end + +module Floaty : S with type t := float# = struct + let one () = Stdlib_upstream_compatible.Float_u.of_float 1. (* CR layouts: use literal syntax *) + let print t = Printf.printf "%f" (Stdlib_upstream_compatible.Float_u.to_float t) +end + +module Inty : S with type t := int = struct + let one () = 1 + let print t = Printf.printf "%d" t +end + +module Stringy : S with type t := string = struct + let one () = "one" + let print t = Printf.printf "%s" t +end + +[%%expect{| +module type S = + sig type t : any val one : unit -> t val print : t -> unit end +module Floaty : sig val one : unit -> float# val print : float# -> unit end +module Inty : sig val one : unit -> int val print : int -> unit end +module Stringy : sig val one : unit -> string val print : string -> unit end +|}] + +module F1 (X : S with type t := float#) : sig + val print_one : unit -> unit +end = struct + let print_one () = X.print (X.one ()) +end + +module F2 (X : S with type t := string) : sig + val print_one : unit -> unit +end = struct + let print_one () = X.print (X.one ()) +end + +[%%expect{| +module F1 : + functor (X : sig val one : unit -> float# val print : float# -> unit end) + -> sig val print_one : unit -> unit end +module F2 : + functor (X : sig val one : unit -> string val print : string -> unit end) + -> sig val print_one : unit -> unit end +|}] + +module F_bad (X : S) : sig + val print_one : unit -> unit +end = struct + let print_one () = X.print (X.one ()) +end + +[%%expect{| +Line 4, characters 29-39: +4 | let print_one () = X.print (X.one ()) + ^^^^^^^^^^ +Error: Function arguments and returns must be representable. + The layout of X.t is any + because of the definition of t at line 2, characters 2-14. + But the layout of X.t must be representable + because we must know concretely how to pass a function argument. +|}] + +(***********************************) +(* Test 11: [any] in package types *) + +module type S = sig + type t : any +end + +module C : S = struct + type t = float +end + +let x = (module C : S with type t = 'a) + +[%%expect{| +module type S = sig type t : any end +module C : S +val x : (module S with type t = C.t) = +|}] diff --git a/testsuite/tests/typing-layouts/modules_alpha.ml b/testsuite/tests/typing-layouts/modules_alpha.ml index 591f725577c..0a231d84cf0 100644 --- a/testsuite/tests/typing-layouts/modules_alpha.ml +++ b/testsuite/tests/typing-layouts/modules_alpha.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension layouts_alpha" - * expect + flags = "-extension layouts_alpha"; + expect; *) type t_any : any @@ -37,7 +37,10 @@ Line 1, characters 32-34: ^^ Error: The type constraints are not consistent. Type ('a : value) is not compatible with type ('b : void) - 'a has layout void, which does not overlap with value. + The layout of 'a is void + because of the definition of t at line 10, characters 2-20. + But the layout of 'a must overlap with value + because the type argument of list has layout value. |}];; module type S1'' = S1 with type s = t_void;; @@ -46,7 +49,10 @@ module type S1'' = S1 with type s = t_void;; Line 1, characters 27-42: 1 | module type S1'' = S1 with type s = t_void;; ^^^^^^^^^^^^^^^ -Error: Type t_void has layout void, which is not a sublayout of value. +Error: The layout of type t_void is void + because of the definition of t_void at line 5, characters 0-19. + But the layout of type t_void must be a sublayout of value + because of the definition of s at line 11, characters 2-8. |}] module type S1_2 = sig @@ -127,7 +133,10 @@ Line 5, characters 25-30: ^^^^^ Error: This expression has type string but an expression was expected of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of t at line 2, characters 2-25. |}] (******************************************************************) @@ -160,9 +169,9 @@ end = struct type t : void end;; [%%expect {| -Line 4, characters 13-19: +Line 4, characters 13-14: 4 | let create _ = () - ^^^^^^ + ^ Error: Non-value layout void detected in [Typeopt.layout] as sort for type 'a. Please report this error to the Jane Street compilers team. |}];; @@ -182,7 +191,10 @@ end;; Line 2, characters 2-29: 2 | type t : immediate = Bar3.t ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type Bar3.t has layout value, which is not a sublayout of immediate. +Error: The kind of type Bar3.t is value + because of the annotation on the declaration of the type t. + But the kind of type Bar3.t must be a subkind of immediate + because of the definition of t at line 2, characters 2-29. |}];; module rec Foo3 : sig @@ -217,7 +229,10 @@ Line 2, characters 26-28: 2 | type 'a t = 'a Bar3.t * 'a list ^^ Error: This type ('a : void) should be an instance of type ('b : value) - 'a has layout void, which does not overlap with value. + The layout of 'a is void + because of the annotation on 'a in the declaration of the type t. + But the layout of 'a must overlap with value + because the type argument of list has layout value. |}];; (* One downside of the current approach - this could be allowed, but isn't. You @@ -245,7 +260,10 @@ Line 12, characters 11-17: 12 | type s = Foo3.t t ^^^^^^ Error: This type Foo3.t should be an instance of type ('a : void) - Foo3.t has layout value, which is not a sublayout of void. + The layout of Foo3.t is value + because an abstract type has the value layout by default. + But the layout of Foo3.t must be a sublayout of void + because of the definition of t at line 10, characters 2-20. |}];; (* Previous example works with annotation *) @@ -295,7 +313,10 @@ Line 1, characters 11-15: 1 | type t4' = M4.s t4_void;; ^^^^ Error: This type M4.s should be an instance of type ('a : void) - M4.s has layout value, which is not a sublayout of void. + The layout of M4.s is value + because of the definition of s at line 2, characters 2-21. + But the layout of M4.s must be a sublayout of void + because of the definition of t4_void at line 8, characters 0-24. |}] module F4'(X : sig type t : immediate end) = struct @@ -322,7 +343,10 @@ Line 1, characters 10-15: 1 | type t4 = M4'.s t4_void;; ^^^^^ Error: This type M4'.s should be an instance of type ('a : void) - M4'.s has layout immediate, which is not a sublayout of void. + The layout of M4'.s is value + because of the definition of s at line 2, characters 2-45. + But the layout of M4'.s must be a sublayout of void + because of the definition of t4_void at line 8, characters 0-24. |}];; (************************************) @@ -352,7 +376,10 @@ Line 14, characters 17-23: ^^^^^^ Error: This expression has type string but an expression was expected of type ('a : immediate) - string has layout value, which is not a sublayout of immediate. + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of f at line 3, characters 2-20. |}] module type S3_2 = sig @@ -365,7 +392,10 @@ module type S3_2 = sig type t : immediate end Line 5, characters 30-46: 5 | module type S3_2' = S3_2 with type t := string;; ^^^^^^^^^^^^^^^^ -Error: Type string has layout value, which is not a sublayout of immediate. +Error: The kind of type string is value + because it is the primitive value type string. + But the kind of type string must be a subkind of immediate + because of the definition of t at line 2, characters 2-20. |}] (*****************************************) @@ -385,10 +415,13 @@ Line 6, characters 10-41: Error: In this `with' constraint, the new definition of t does not match its original definition in the constrained signature: Type declarations do not match: - type t + type t = int is not included in type t : void - the first has layout value, which is not a sublayout of void. + The layout of the first is value + because it is the primitive immediate type int. + But the layout of the first must be a sublayout of void + because of the definition of t at line 2, characters 2-15. |}];; module type S6_3 = sig @@ -400,11 +433,19 @@ module type S6_4 = sig end;; [%%expect{| module type S6_3 = sig type t : value end -Line 6, characters 33-34: +Line 6, characters 10-44: 6 | val m : (module S6_3 with type t = t_void) - ^ -Error: Signature package constraint types must have layout value. - t_void has layout void, which is not a sublayout of value. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this `with' constraint, the new definition of t + does not match its original definition in the constrained signature: + Type declarations do not match: + type t = t_void + is not included in + type t : value + The layout of the first is void + because of the definition of t_void at line 5, characters 0-19. + But the layout of the first must be a sublayout of value + because of the definition of t at line 2, characters 2-16. |}];; module type S6_5 = sig @@ -422,10 +463,13 @@ Line 6, characters 10-44: Error: In this `with' constraint, the new definition of t does not match its original definition in the constrained signature: Type declarations do not match: - type t + type t = string is not included in type t : immediate - the first has layout value, which is not a sublayout of immediate. + The kind of the first is value + because it is the primitive value type string. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 2, characters 2-20. |}];; module type S6_6' = sig @@ -439,28 +483,22 @@ Line 3, characters 10-39: Error: In this `with' constraint, the new definition of t does not match its original definition in the constrained signature: Type declarations do not match: - type t + type t = s is not included in type t : immediate - the first has layout value, which is not a sublayout of immediate. + The kind of the first is value + because of the definition of s at line 2, characters 2-8. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 2, characters 2-20. |}];; -(* CR layouts: S6_6'' should be fixed *) module type S6_6'' = sig type s = int val m : (module S6_5 with type t = int) end;; [%%expect{| -Line 3, characters 10-41: -3 | val m : (module S6_5 with type t = int) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: In this `with' constraint, the new definition of t - does not match its original definition in the constrained signature: - Type declarations do not match: - type t - is not included in - type t : immediate - the first has layout value, which is not a sublayout of immediate. +module type S6_6'' = + sig type s = int val m : (module S6_5 with type t = int) end |}];; (*****************************************) @@ -486,5 +524,35 @@ Line 1, characters 28-33: 1 | module type S = sig val x : t_any end ^^^^^ Error: This type signature for x is not a value type. - x has layout any, which is not a sublayout of value. + The layout of type t_any is any + because of the definition of t_any at line 1, characters 0-18. + But the layout of type t_any must be a sublayout of value + because it's the type of something stored in a module structure. +|}] + +(****************************************************************) +(* Test 9: Non-values temporarily banned in recmod safety check *) +module type S = sig + val f : ('a : float64). 'a -> 'a +end + +module rec M : S = M + +[%%expect{| +module type S = sig val f : ('a : float64). 'a -> 'a end +Line 5, characters 19-20: +5 | module rec M : S = M + ^ +Error: Cannot safely evaluate the definition of the following cycle + of recursively-defined modules: M -> M. + There are no safe modules in this cycle (see manual section 12.2). +Line 2, characters 2-34: +2 | val f : ('a : float64). 'a -> 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Module M defines a function whose first argument is not a value, f . |}] + +(*******************************) +(* Test 10: Specializing [any] *) + +(* in modules.ml only *) diff --git a/testsuite/tests/typing-layouts/modules_beta.ml b/testsuite/tests/typing-layouts/modules_beta.ml deleted file mode 100644 index 6cd24bdfb3e..00000000000 --- a/testsuite/tests/typing-layouts/modules_beta.ml +++ /dev/null @@ -1,569 +0,0 @@ -(* TEST - flags = "-extension layouts_beta" - * expect -*) - -type t_value : value -type t_imm : immediate -type t_imm64 : immediate64 -type t_float64 : float64 -type t_any : any;; -[%%expect {| -type t_value : value -type t_imm : immediate -type t_imm64 : immediate64 -type t_float64 : float64 -type t_any : any -|}];; - -type t_void : void;; -[%%expect{| -Line 1, characters 15-19: -1 | type t_void : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}];; - -(*********************************************************) -(* Test 1: Simple with type constraints respect jkinds. *) - -(* CR layouts v5: parts of this test moved to [modules_alpha.ml] because they - need void. Bring back here when we have it. *) -module type S1 = sig - type ('a : void) t - type s -end;; -[%%expect {| -Line 2, characters 13-17: -2 | type ('a : void) t - ^^^^ -Error: Layout void is more experimental than allowed by -extension layouts_beta. - You must enable -extension layouts_alpha to use this feature. -|}];; - -module type S1f = sig - type ('a : float64) t - type s -end;; - -type ('a : float64) t1;; - -module type S1f' = S1f with type 'a t = t_float64 t1 and type s = t_float64 t1;; - -[%%expect {| -module type S1f = sig type ('a : float64) t type s end -type ('a : float64) t1 -module type S1f' = - sig type ('a : float64) t = t_float64 t1 type s = t_float64 t1 end -|}];; - -module type S1f'' = S1f with type 'a t = 'a list;; -[%%expect {| -Line 1, characters 34-36: -1 | module type S1f'' = S1f with type 'a t = 'a list;; - ^^ -Error: The type constraints are not consistent. - Type ('a : value) is not compatible with type ('b : float64) - 'a has layout float64, which does not overlap with value. -|}];; - -module type S1f'' = S1f with type s = t_float64;; - -[%%expect{| -Line 1, characters 29-47: -1 | module type S1f'' = S1f with type s = t_float64;; - ^^^^^^^^^^^^^^^^^^ -Error: Type t_float64 has layout float64, which is not a sublayout of value. -|}] - -module type S1_2 = sig - type ('a : immediate) t -end - -module type S1_2' = S1_2 with type 'a t = 'a list - -module M1_2' : S1_2' = struct - type ('a : immediate) t = 'a list -end;; -[%%expect{| -module type S1_2 = sig type ('a : immediate) t end -module type S1_2' = sig type ('a : immediate) t = 'a list end -module M1_2' : S1_2' -|}] - -(* CR layouts - annoyingly, the immediate annotation on 'a is required. We - can probably relax this so you don't have to label the parameter explcitly - and the jkind is determined from the signature. But we anticipate it'll - require non-trivial refactoring of eqtype, so we've put it off for now. *) -module M1_2'': S1_2' = struct - type 'a t = 'a list -end;; -[%%expect{| -Lines 1-3, characters 23-3: -1 | .......................struct -2 | type 'a t = 'a list -3 | end.. -Error: Signature mismatch: - Modules do not match: - sig type 'a t = 'a list end - is not included in - S1_2' - Type declarations do not match: - type 'a t = 'a list - is not included in - type ('a : immediate) t = 'a list - The type ('a : value) is not equal to the type ('a0 : immediate) - because their layouts are different. -|}] - -module M1_2''' : S1_2 = struct - type 'a t = 'a list -end;; -[%%expect{| -Lines 1-3, characters 24-3: -1 | ........................struct -2 | type 'a t = 'a list -3 | end.. -Error: Signature mismatch: - Modules do not match: - sig type 'a t = 'a list end - is not included in - S1_2 - Type declarations do not match: - type 'a t = 'a list - is not included in - type ('a : immediate) t - Their parameters differ: - The type ('a : value) is not equal to the type ('a0 : immediate) - because their layouts are different. -|}] - -(************************************************************************) -(* Test 2: with type constraints for fixed types (the complicated case of - Type_mod.merge_constraint) *) -module type S2 = sig - type ('a : immediate) t -end - -type ('a : immediate) r2 = R -type ('a : immediate) s2 = private [> `A of 'a r2] - -module type T2 = S2 with type 'a t = 'a s2 - -module F2 (X : T2) = struct - let f () : 'a X.t = `A R -end;; -[%%expect{| -module type S2 = sig type ('a : immediate) t end -type ('a : immediate) r2 = R -type (!'a : immediate) s2 = private [> `A of 'a r2 ] -module type T2 = sig type ('a : immediate) t = 'a s2 end -module F2 : - functor (X : T2) -> sig val f : ('a : immediate). unit -> 'a X.t end -|}] - -type ('a : immediate) s2' = private [> `B of 'a] -module type T2' = S2 with type 'a t = 'a s2' - -module F2' (X : T2') = struct - let f () : 'a X.t = `B "bad" -end -[%%expect{| -type (!'a : immediate) s2' = private [> `B of 'a ] -module type T2' = sig type ('a : immediate) t = 'a s2' end -Line 5, characters 25-30: -5 | let f () : 'a X.t = `B "bad" - ^^^^^ -Error: This expression has type string but an expression was expected of type - ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}] - -(******************************************************************) -(* Test 3: Recursive modules, with and without jkind annotations *) - -(* CR layouts v5: Some parts of this test need void. *) - -module rec Foo3 : sig - val create : Bar3.t -> unit -end = struct - let create _ = () -end - -and Bar3 : sig - type t -end = struct - type t = unit -end;; -[%%expect {| -module rec Foo3 : sig val create : Bar3.t -> unit end -and Bar3 : sig type t end -|}];; - -module rec Foo3 : sig - val create : Bar3.t -> unit -end = struct - let create _ = () -end - -and Bar3 : sig - type t : void -end = struct - type t : void -end;; -[%%expect {| -Line 8, characters 11-15: -8 | type t : void - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}];; - -module rec Foo3f : sig - val create : Bar3f.t -> unit -end = struct - let create _ = () -end - -and Bar3f : sig - type t : float64 -end = struct - type t : float64 -end;; -[%%expect {| -module rec Foo3f : sig val create : Bar3f.t -> unit end -and Bar3f : sig type t : float64 end -|}];; - -module rec Foo3 : sig - type t : immediate = Bar3.t -end = struct - type t = Bar3.t -end - -and Bar3 : sig - type t : value -end = struct - type t = A -end;; -[%%expect {| -Line 2, characters 2-29: -2 | type t : immediate = Bar3.t - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type Bar3.t has layout value, which is not a sublayout of immediate. -|}];; - -module rec Foo3 : sig - type t : immediate = Bar3.t -end = struct - type t = Bar3.t -end - -and Bar3 : sig - type t : immediate -end = struct - type t = A -end;; -[%%expect {| -module rec Foo3 : sig type t = Bar3.t end -and Bar3 : sig type t : immediate end -|}];; - -module rec Foo3f : sig - type 'a t = 'a Bar3f.t * 'a list -end = struct - type t = 'a Bar3f.t * 'a list -end - -and Bar3f : sig - type ('a : float64) t -end = struct - type 'a t -end;; -[%%expect {| -Line 2, characters 27-29: -2 | type 'a t = 'a Bar3f.t * 'a list - ^^ -Error: This type ('a : float64) should be an instance of type ('b : value) - 'a has layout float64, which does not overlap with value. -|}];; - -type t3f : float64 - -module rec Foo3f : sig - type t = t3f -end = struct - type t = t3f -end - -and Bar3f : sig - type ('a : float64) t - - type s = Foo3f.t t -end = struct - type ('a : float64) t - type s = Foo3f.t t -end;; -[%%expect {| -type t3f : float64 -Line 12, characters 11-18: -12 | type s = Foo3f.t t - ^^^^^^^ -Error: This type Foo3f.t should be an instance of type ('a : float64) - Foo3f.t has layout value, which is not a sublayout of float64. -|}];; - -(* Previous example works with annotation *) -module rec Foo3f : sig - type t : float64 = t3f -end = struct - type t = t3f -end - -and Bar3 : sig - type ('a : float64) t - - type s = Foo3f.t t -end = struct - type ('a : float64) t - type s = Foo3f.t t -end;; -[%%expect {| -module rec Foo3f : sig type t = t3f end -and Bar3 : sig type ('a : float64) t type s = Foo3f.t t end -|}];; - -(*************************************************************************) -(* Test 4: Nondep typedecl jkind approximation in the Nondep_cannot_erase - case. *) - -(* CR layouts v5: Bring back the void part of this test. *) -module F4(X : sig type t end) = struct - type s = Foo of X.t -end - -module M4 = F4(struct type t = T end) - -type ('a : value) t4_val - -type t4 = M4.s t4_val;; -[%%expect {| -module F4 : functor (X : sig type t end) -> sig type s = Foo of X.t end -module M4 : sig type s end -type 'a t4_val -type t4 = M4.s t4_val -|}] - -type ('a : float64) t4_float64 -type t4f' = M4.s t4_float64;; -[%%expect {| -type ('a : float64) t4_float64 -Line 2, characters 12-16: -2 | type t4f' = M4.s t4_float64;; - ^^^^ -Error: This type M4.s should be an instance of type ('a : float64) - M4.s has layout value, which is not a sublayout of float64. -|}] - -module F4'(X : sig type t : immediate end) = struct - type s : immediate = Foo of X.t [@@unboxed] -end - -module M4' = F4'(struct type t = T end) - -type ('a : immediate) t4_imm - -type t4 = M4'.s t4_imm;; -[%%expect{| -module F4' : - functor (X : sig type t : immediate end) -> - sig type s : immediate = Foo of X.t [@@unboxed] end -module M4' : sig type s : immediate end -type ('a : immediate) t4_imm -type t4 = M4'.s t4_imm -|}];; - -type t4 = M4'.s t4_float64;; -[%%expect{| -Line 1, characters 10-15: -1 | type t4 = M4'.s t4_float64;; - ^^^^^ -Error: This type M4'.s should be an instance of type ('a : float64) - M4'.s has layout immediate, which is not a sublayout of float64. -|}];; - - -(************************************) -(* Test 5: Destructive substitution *) -module type S3_1 = sig - type ('a : immediate) t - val f : 'a -> 'a t -end - -module type S3_1' = S3_1 with type 'a t := 'a list - -module M3_1 : S3_1' = struct - let f x = [x] -end - -let x3 = M3_1.f 42 - -let x3' = M3_1.f "test";; -[%%expect{| -module type S3_1 = - sig type ('a : immediate) t val f : ('a : immediate). 'a -> 'a t end -module type S3_1' = sig val f : ('a : immediate). 'a -> 'a list end -module M3_1 : S3_1' -val x3 : int list = [42] -Line 14, characters 17-23: -14 | let x3' = M3_1.f "test";; - ^^^^^^ -Error: This expression has type string but an expression was expected of type - ('a : immediate) - string has layout value, which is not a sublayout of immediate. -|}] - -module type S3_2 = sig - type t : immediate -end - -module type S3_2' = S3_2 with type t := string;; -[%%expect{| -module type S3_2 = sig type t : immediate end -Line 5, characters 30-46: -5 | module type S3_2' = S3_2 with type t := string;; - ^^^^^^^^^^^^^^^^ -Error: Type string has layout value, which is not a sublayout of immediate. -|}] - -(*****************************************) -(* Test 6: With constraints on packages. *) - -(* CR layouts v5: Bring over void versions of these tests from modules_alpha *) -module type S6_1 = sig - type t : void -end -[%%expect{| -Line 2, characters 11-15: -2 | type t : void - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}] - -module type S6_1f = sig - type t : float64 -end - -module type S6_2f = sig - val m : (module S6_1f with type t = int) -end;; -[%%expect{| -module type S6_1f = sig type t : float64 end -Line 6, characters 10-42: -6 | val m : (module S6_1f with type t = int) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: In this `with' constraint, the new definition of t - does not match its original definition in the constrained signature: - Type declarations do not match: - type t - is not included in - type t : float64 - the first has layout value, which is not a sublayout of float64. -|}];; - -module type S6_3 = sig - type t : value -end - -module type S6_4f = sig - val m : (module S6_3 with type t = t_float64) -end;; -[%%expect{| -module type S6_3 = sig type t : value end -Line 6, characters 33-34: -6 | val m : (module S6_3 with type t = t_float64) - ^ -Error: Signature package constraint types must have layout value. - t_float64 has layout float64, which is not a sublayout of value. -|}];; - -module type S6_5 = sig - type t : immediate -end - -module type S6_6 = sig - val m : (module S6_5 with type t = string) -end -[%%expect{| -module type S6_5 = sig type t : immediate end -Line 6, characters 10-44: -6 | val m : (module S6_5 with type t = string) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: In this `with' constraint, the new definition of t - does not match its original definition in the constrained signature: - Type declarations do not match: - type t - is not included in - type t : immediate - the first has layout value, which is not a sublayout of immediate. -|}];; - -module type S6_6' = sig - type s - val m : (module S6_5 with type t = s) -end -[%%expect{| -Line 3, characters 10-39: -3 | val m : (module S6_5 with type t = s) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: In this `with' constraint, the new definition of t - does not match its original definition in the constrained signature: - Type declarations do not match: - type t - is not included in - type t : immediate - the first has layout value, which is not a sublayout of immediate. -|}];; - -(* CR layouts: S6_6'' should be fixed *) -module type S6_6'' = sig - type s = int - val m : (module S6_5 with type t = int) -end;; -[%%expect{| -Line 3, characters 10-41: -3 | val m : (module S6_5 with type t = int) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: In this `with' constraint, the new definition of t - does not match its original definition in the constrained signature: - Type declarations do not match: - type t - is not included in - type t : immediate - the first has layout value, which is not a sublayout of immediate. -|}];; - -(*****************************************) -(* Test 7: "any" is allowed in Tstr_eval *) -module F (_ : sig end) = struct - assert false -end;; -[%%expect {| -module F : sig end -> sig end -|}];; - -(****************************************) -(* Test 8: [val]s must be representable *) - -module type S = sig val x : t_any end - -module M = struct - let x : t_void = assert false -end - -[%%expect{| -Line 1, characters 28-33: -1 | module type S = sig val x : t_any end - ^^^^^ -Error: This type signature for x is not a value type. - x has layout any, which is not a sublayout of value. -|}] diff --git a/testsuite/tests/typing-layouts/or_null.ml b/testsuite/tests/typing-layouts/or_null.ml index 8fad5954fdf..a33be00ac66 100644 --- a/testsuite/tests/typing-layouts/or_null.ml +++ b/testsuite/tests/typing-layouts/or_null.ml @@ -1,7 +1,7 @@ (* TEST - * skip - reason = "Unboxed types aren't implemented yet" - ** expect + reason = "Unboxed types aren't implemented yet"; + skip; + expect; *) (* CR layouts (v3): enable this test *) diff --git a/testsuite/tests/typing-layouts/parsing.compilers.reference b/testsuite/tests/typing-layouts/parsing.compilers.reference deleted file mode 100644 index 7ef77c54cee..00000000000 --- a/testsuite/tests/typing-layouts/parsing.compilers.reference +++ /dev/null @@ -1,28 +0,0 @@ -type 'a t0 = 'a list -Line 2, characters 11-20: -2 | type ('a : immediate) t0 = 'a list;; - ^^^^^^^^^ -Error: Layout immediate is more experimental than allowed by -extension layouts. - You must enable -extension layouts_beta to use this feature. -Line 2, characters 11-15: -2 | type ('a : void) t0 = 'a list;; - ^^^^ -Error: Layout void is more experimental than allowed by -extension layouts. - You must enable -extension layouts_alpha to use this feature. -Line 2, characters 11-15: -2 | type ('a : valu) t0 = 'a list;; - ^^^^ -Error: Syntax error: layout expected. -Line 2, characters 9-15: -2 | type t = float#;; - ^^^^^^ -Error: This construct requires the beta version of the extension "layouts", which is disabled and cannot be used -Line 2, characters 9-13: -2 | type t = int#;; - ^^^^ -Error: Syntax error: Unboxed type other than float# not expected. -Line 2, characters 9-17: -2 | type t = Float.t#;; - ^^^^^^^^ -Error: Syntax error: Unboxed type other than float# not expected. - diff --git a/testsuite/tests/typing-layouts/parsing.ml b/testsuite/tests/typing-layouts/parsing.ml index 5da5f7b332d..7f790e64fc5 100644 --- a/testsuite/tests/typing-layouts/parsing.ml +++ b/testsuite/tests/typing-layouts/parsing.ml @@ -1,6 +1,16 @@ (* TEST - * toplevel - flags = "-extension layouts" + { + compiler_reference = "${test_source_directory}/parsing_stable_beta.compilers.reference"; + toplevel; + }{ + flags = "-extension layouts_beta"; + compiler_reference = "${test_source_directory}/parsing_stable_beta.compilers.reference"; + toplevel; + }{ + flags = "-extension layouts_alpha"; + compiler_reference = "${test_source_directory}/parsing_alpha.compilers.reference"; + toplevel; + } *) type ('a : value) t0 = 'a list;; @@ -16,3 +26,11 @@ type t = float#;; type t = int#;; type t = Float.t#;; + +type ('a : any, 'b : any, 'c : any) t;; + +type 'a s1 = ('a : float64, int, bool) t;; + +let f : ('a, _ : value, bool) t -> int = fun _ -> 42;; + +type ('a, 'b, 'c) s2 = ('a, 'b, 'c : bits32) t;; diff --git a/testsuite/tests/typing-layouts/parsing_alpha.compilers.reference b/testsuite/tests/typing-layouts/parsing_alpha.compilers.reference index 7ab9f80c25c..5f39303e7be 100644 --- a/testsuite/tests/typing-layouts/parsing_alpha.compilers.reference +++ b/testsuite/tests/typing-layouts/parsing_alpha.compilers.reference @@ -4,18 +4,26 @@ Line 2, characters 22-24: 2 | type ('a : void) t0 = 'a list;; ^^ Error: This type ('a : value) should be an instance of type ('a0 : void) - 'a has layout void, which does not overlap with value. + The layout of 'a is void + because of the annotation on 'a in the declaration of the type t0. + But the layout of 'a must overlap with value + because the type argument of list has layout value. Line 2, characters 11-15: 2 | type ('a : valu) t0 = 'a list;; ^^^^ -Error: Syntax error: layout expected. +Error: Unknown layout valu type t = float# Line 2, characters 9-13: 2 | type t = int#;; ^^^^ -Error: Syntax error: Unboxed type other than float# not expected. +Error: Unbound type constructor int# +Hint: Did you mean int? Line 2, characters 9-17: 2 | type t = Float.t#;; ^^^^^^^^ -Error: Syntax error: Unboxed type other than float# not expected. +Error: Unbound type constructor Float.t# +type ('a : any, 'b : any, 'c : any) t +type ('a : float64) s1 = ('a, int, bool) t +val f : ('a : any) 'b. ('a, 'b, bool) t -> int = +type ('a, 'b, 'c : bits32) s2 = ('a, 'b, 'c) t diff --git a/testsuite/tests/typing-layouts/parsing_alpha.ml b/testsuite/tests/typing-layouts/parsing_alpha.ml deleted file mode 100644 index 158eeadbe07..00000000000 --- a/testsuite/tests/typing-layouts/parsing_alpha.ml +++ /dev/null @@ -1,18 +0,0 @@ -(* TEST - flags = "-extension layouts_alpha" - * toplevel -*) - -type ('a : value) t0 = 'a list;; - -type ('a : immediate) t0 = 'a list;; - -type ('a : void) t0 = 'a list;; - -type ('a : valu) t0 = 'a list;; - -type t = float#;; - -type t = int#;; - -type t = Float.t#;; diff --git a/testsuite/tests/typing-layouts/parsing_beta.ml b/testsuite/tests/typing-layouts/parsing_beta.ml deleted file mode 100644 index 60ec1ccc5f4..00000000000 --- a/testsuite/tests/typing-layouts/parsing_beta.ml +++ /dev/null @@ -1,18 +0,0 @@ -(* TEST - flags = "-extension layouts_beta" - * toplevel -*) - -type ('a : value) t0 = 'a list;; - -type ('a : immediate) t0 = 'a list;; - -type ('a : void) t0 = 'a list;; - -type ('a : valu) t0 = 'a list;; - -type t = float#;; - -type t = int#;; - -type t = Float.t#;; diff --git a/testsuite/tests/typing-layouts/parsing_beta.compilers.reference b/testsuite/tests/typing-layouts/parsing_stable_beta.compilers.reference similarity index 52% rename from testsuite/tests/typing-layouts/parsing_beta.compilers.reference rename to testsuite/tests/typing-layouts/parsing_stable_beta.compilers.reference index de52ef5a8a0..7f1bab21fb0 100644 --- a/testsuite/tests/typing-layouts/parsing_beta.compilers.reference +++ b/testsuite/tests/typing-layouts/parsing_stable_beta.compilers.reference @@ -3,19 +3,24 @@ type ('a : immediate) t0 = 'a list Line 2, characters 11-15: 2 | type ('a : void) t0 = 'a list;; ^^^^ -Error: Layout void is more experimental than allowed by -extension layouts_beta. +Error: Layout void is more experimental than allowed by the enabled layouts extension. You must enable -extension layouts_alpha to use this feature. Line 2, characters 11-15: 2 | type ('a : valu) t0 = 'a list;; ^^^^ -Error: Syntax error: layout expected. +Error: Unknown layout valu type t = float# Line 2, characters 9-13: 2 | type t = int#;; ^^^^ -Error: Syntax error: Unboxed type other than float# not expected. +Error: Unbound type constructor int# +Hint: Did you mean int? Line 2, characters 9-17: 2 | type t = Float.t#;; ^^^^^^^^ -Error: Syntax error: Unboxed type other than float# not expected. +Error: Unbound type constructor Float.t# +type ('a : any, 'b : any, 'c : any) t +type ('a : float64) s1 = ('a, int, bool) t +val f : ('a : any) 'b. ('a, 'b, bool) t -> int = +type ('a, 'b, 'c : bits32) s2 = ('a, 'b, 'c) t diff --git a/testsuite/tests/typing-layouts/printing.ml b/testsuite/tests/typing-layouts/printing.ml index 8f6df2553e2..fe17520332e 100644 --- a/testsuite/tests/typing-layouts/printing.ml +++ b/testsuite/tests/typing-layouts/printing.ml @@ -1,6 +1,6 @@ (* TEST - * expect - flags = "-verbose-types" + flags = "-verbose-types"; + expect; *) module M : sig diff --git a/testsuite/tests/typing-layouts/unboxed_bigstring_primitives.ml b/testsuite/tests/typing-layouts/unboxed_bigstring_primitives.ml new file mode 100644 index 00000000000..663393572e7 --- /dev/null +++ b/testsuite/tests/typing-layouts/unboxed_bigstring_primitives.ml @@ -0,0 +1,122 @@ +(* TEST + flambda2; + include stdlib_upstream_compatible; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +(* CR layouts: add the unboxed simd externals once we support them *) +open Bigarray +type bigstring = (char, int8_unsigned_elt, c_layout) Array1.t +external caml_bigstring_get_32 : bigstring -> int -> int32# = "%caml_bigstring_get32#" +external caml_bigstring_get_64 : bigstring -> int -> int64# = "%caml_bigstring_get64#" +external caml_bigstring_set_32 : bigstring -> int -> int32# -> unit = "%caml_bigstring_set32#" +external caml_bigstring_set_64 : bigstring -> int -> int64# -> unit = "%caml_bigstring_set64#" + +external unsafe_caml_bigstring_get_32 : bigstring -> int -> int32# = "%caml_bigstring_get32u#" +external unsafe_caml_bigstring_get_64 : bigstring -> int -> int64# = "%caml_bigstring_get64u#" +external unsafe_caml_bigstring_set_32 : bigstring -> int -> int32# -> unit = "%caml_bigstring_set32u#" +external unsafe_caml_bigstring_set_64 : bigstring -> int -> int64# -> unit = "%caml_bigstring_set64u#" + +external[@layout_poly] ignore : ('a : any). 'a -> unit = "%ignore" + +let bigstring_of_string s = + let a = Array1.create char c_layout (String.length s) in + for i = 0 to String.length s - 1 do + a.{i} <- s.[i] + done; + a + +let s = bigstring_of_string (String.make 10 '\x00') +let empty_s = bigstring_of_string "" + +let assert_bound_check f = + try + ignore(f ()); + assert false + with + | Invalid_argument _ -> () + +let () = + assert_bound_check (fun () -> ignore (caml_bigstring_get_32 s (-1))); + assert_bound_check (fun () -> ignore (caml_bigstring_get_32 s 7)); + assert_bound_check (fun () -> ignore (caml_bigstring_get_64 s (-1))); + assert_bound_check (fun () -> ignore (caml_bigstring_get_64 s 3)); + + assert_bound_check (fun () -> caml_bigstring_set_32 s (-1) #0l); + assert_bound_check (fun () -> caml_bigstring_set_32 s 7 #0l); + assert_bound_check (fun () -> caml_bigstring_set_64 s (-1) #0L); + assert_bound_check (fun () -> caml_bigstring_set_64 s 3 #0L); + + assert_bound_check (fun () -> ignore (caml_bigstring_get_32 empty_s 0)); + assert_bound_check (fun () -> ignore (caml_bigstring_get_64 empty_s 0)); + + assert_bound_check (fun () -> caml_bigstring_set_32 empty_s 0 #0l); + assert_bound_check (fun () -> caml_bigstring_set_64 empty_s 0 #0L) + +external bswap32: int32 -> int32 = "%bswap_int32" +external bswap64: int64 -> int64 = "%bswap_int64" + +let swap32 x = + let open Stdlib_upstream_compatible.Int32_u in + if Sys.big_endian + then x |> to_int32 |> bswap32 |> of_int32 + else x + +let swap64 x = + let open Stdlib_upstream_compatible.Int64_u in + if Sys.big_endian + then x |> to_int64 |> bswap64 |> of_int64 + else x + +let to_int32 = Stdlib_upstream_compatible.Int32_u.to_int32 +let to_int64 = Stdlib_upstream_compatible.Int64_u.to_int64 +let test get_64 set_64 get_32 set_32 = + set_32 s 0 (swap32 #0x12345678l); + Printf.printf "%lx %lx %lx\n%!" + (to_int32 (swap32 (get_32 s 0))) + (to_int32 (swap32 (get_32 s 1))) + (to_int32 (swap32 (get_32 s 2))); + set_32 s 0 (swap32 #0xFEDCBA09l); + Printf.printf "%lx %lx %lx\n%!" + (to_int32 (swap32 (get_32 s 0))) + (to_int32 (swap32 (get_32 s 1))) + (to_int32 (swap32 (get_32 s 2))); + + set_64 s 0 (swap64 #0x1234567890ABCDEFL); + Printf.printf "%Lx %Lx %Lx\n%!" + (to_int64 (swap64 (get_64 s 0))) + (to_int64 (swap64 (get_64 s 1))) + (to_int64 (swap64 (get_64 s 2))); + set_64 s 0 (swap64 #0xFEDCBA0987654321L); + Printf.printf "%Lx %Lx %Lx\n%!" + (to_int64 (swap64 (get_64 s 0))) + (to_int64 (swap64 (get_64 s 1))) + (to_int64 (swap64 (get_64 s 2))) + +let () = + test + caml_bigstring_get_64 + caml_bigstring_set_64 + caml_bigstring_get_32 + caml_bigstring_set_32; + test + unsafe_caml_bigstring_get_64 + unsafe_caml_bigstring_set_64 + unsafe_caml_bigstring_get_32 + unsafe_caml_bigstring_set_32 diff --git a/testsuite/tests/typing-layouts/unboxed_bigstring_primitives.reference b/testsuite/tests/typing-layouts/unboxed_bigstring_primitives.reference new file mode 100644 index 00000000000..15e965c5bfa --- /dev/null +++ b/testsuite/tests/typing-layouts/unboxed_bigstring_primitives.reference @@ -0,0 +1,8 @@ +12345678 123456 1234 +fedcba09 fedcba fedc +1234567890abcdef 1234567890abcd 1234567890ab +fedcba0987654321 fedcba09876543 fedcba098765 +12345678 9123456 ba091234 +fedcba09 9fedcba ba09fedc +1234567890abcdef 1234567890abcd 1234567890ab +fedcba0987654321 fedcba09876543 fedcba098765 diff --git a/testsuite/tests/typing-layouts/unboxed_int_array_indexing.ml b/testsuite/tests/typing-layouts/unboxed_int_array_indexing.ml new file mode 100644 index 00000000000..18a7b3fcccf --- /dev/null +++ b/testsuite/tests/typing-layouts/unboxed_int_array_indexing.ml @@ -0,0 +1,163 @@ +(* TEST + flambda2; + include stdlib_upstream_compatible; + { + native; + }{ + bytecode; + }{ + flags = "-extension layouts_alpha"; + native; + }{ + flags = "-extension layouts_alpha"; + bytecode; + }{ + flags = "-extension layouts_beta"; + native; + }{ + flags = "-extension layouts_beta"; + bytecode; + } +*) + +module By_int64_u = struct + module I = Stdlib_upstream_compatible.Int64_u + module A = struct + external get : 'a array -> int64# -> 'a = + "%array_safe_get_indexed_by_int64#" + external set : 'a array -> int64# -> 'a -> unit = + "%array_safe_set_indexed_by_int64#" + external unsafe_get : 'a array -> int64# -> 'a = + "%array_unsafe_get_indexed_by_int64#" + external unsafe_set : 'a array -> int64# -> 'a -> unit = + "%array_unsafe_set_indexed_by_int64#" + end +end + +module By_int32_u = struct + module I = Stdlib_upstream_compatible.Int32_u + module A = struct + external get : 'a array -> int32# -> 'a = + "%array_safe_get_indexed_by_int32#" + external set : 'a array -> int32# -> 'a -> unit = + "%array_safe_set_indexed_by_int32#" + external unsafe_get : 'a array -> int32# -> 'a = + "%array_unsafe_get_indexed_by_int32#" + external unsafe_set : 'a array -> int32# -> 'a -> unit = + "%array_unsafe_set_indexed_by_int32#" + end +end + +module By_nativeint_u = struct + module I = Stdlib_upstream_compatible.Nativeint_u + + module A = struct + external get : 'a array -> nativeint# -> 'a = + "%array_safe_get_indexed_by_nativeint#" + external set : 'a array -> nativeint# -> 'a -> unit = + "%array_safe_set_indexed_by_nativeint#" + external unsafe_get : 'a array -> nativeint# -> 'a = + "%array_unsafe_get_indexed_by_nativeint#" + external unsafe_set : 'a array -> nativeint# -> 'a -> unit = + "%array_unsafe_set_indexed_by_nativeint#" + end +end + +let check_eq arr g = + for i = 0 to Array.length arr - 1 do + assert (g arr i = arr.(i)) + done + +let check_inval f = + try f (); assert false with + | Invalid_argument _ -> () + +let pp = Format.printf + +let test_get (g: 'a. 'a array -> int -> 'a) = + check_eq [| 1; 2; 3; 4; 5; 6; 7|] g; + check_eq [| "a"; "b"; "c"; "d"|] g; + check_eq [| 1.; 2.; 3.; 4.; 5.|] g; + () + +let test_set (g: 'a. 'a array -> int -> 'a -> unit) = + let fill arr v = + for i = 0 to Array.length arr - 1 do + g arr i v; assert(Array.get arr i = v) + done + in + let check_all_eq arr v = assert (Array.for_all (fun x -> x = v) arr) in + let arr = [| 1; 2; 3; 4; 5; 6; 7|] in + fill arr 0; check_all_eq arr 0; + let arr = [| "a"; "b"; "c"; "d"|] in + fill arr "aaa"; check_all_eq arr "aaa"; + let arr = [| 1.; 2.; 3.; 4.; 5.|] in + fill arr 0.; check_all_eq arr 0.; + () + +let test_int64_u () = + let open By_int64_u in + + test_get (fun arr i -> A.get arr (I.of_int i)); + test_get (fun arr i -> A.unsafe_get arr (I.of_int i)); + + test_set (fun arr i -> A.set arr (I.of_int i)); + test_set (fun arr i -> A.unsafe_set arr (I.of_int i)); + + (* This is + 0b1000000000000000000000000000000000000000000000000000000000000001 + in binary and should be out of bound. *) + check_inval (fun () -> A.get [| 1; 2; 3|] (-#9223372036854775807L)); + check_inval (fun () -> A.set [| 1; 2; 3|] (-#9223372036854775807L) 0); + (* no promises when using unsafe_get. int truncation happens. *) + let arr = [| 1; 2; 3|] in + assert (A.unsafe_get arr (-#9223372036854775807L) = 2); + A.unsafe_set arr (-#9223372036854775807L) 11111; + assert (A.unsafe_get arr #1L = 11111); + check_inval (fun () -> A.get [| 1; 2; 3|] (-#1L)); + check_inval (fun () -> A.set [| 1; 2; 3|] (-#1L) 1); + () + +let test_int32_u () = + let open By_int32_u in + + test_get (fun arr i -> A.get arr (I.of_int i)); + test_get (fun arr i -> A.unsafe_get arr (I.of_int i)); + + test_set (fun arr i -> A.set arr (I.of_int i)); + test_set (fun arr i -> A.unsafe_set arr (I.of_int i)); + + check_inval (fun () -> A.get [| 1; 2; 3|] (-#2147483647l)); + check_inval (fun () -> A.set [| 1; 2; 3|] (-#2147483647l) 0); + check_inval (fun () -> A.get [| 1; 2; 3|] (-#1l)); + check_inval (fun () -> A.set [| 1; 2; 3|] (-#1l) 1); + () + +let test_nativeint_u () = + let open By_nativeint_u in + + test_get (fun arr i -> A.get arr (I.of_int i)); + test_get (fun arr i -> A.unsafe_get arr (I.of_int i)); + + test_set (fun arr i -> A.set arr (I.of_int i)); + test_set (fun arr i -> A.unsafe_set arr (I.of_int i)); + + (* This is + 0b1000000000000000000000000000000000000000000000000000000000000001 + in binary and should be out of bound. *) + check_inval (fun () -> A.get [| 1; 2; 3|] (-#9223372036854775807n)); + check_inval (fun () -> A.set [| 1; 2; 3|] (-#9223372036854775807n) 0); + (* no promises when using unsafe_get. int truncation happens. *) + let arr = [| 1; 2; 3|] in + assert (A.unsafe_get arr (-#9223372036854775807n) = 2); + A.unsafe_set arr (-#9223372036854775807n) 11111; + assert (A.unsafe_get arr #1n = 11111); + check_inval (fun () -> A.get [| 1; 2; 3|] (-#1n)); + check_inval (fun () -> A.set [| 1; 2; 3|] (-#1n) 1); + () + +let () = + test_int64_u (); + test_int32_u (); + test_nativeint_u (); + () diff --git a/testsuite/tests/typing-layouts/unboxed_int_array_indexing.reference b/testsuite/tests/typing-layouts/unboxed_int_array_indexing.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testsuite/tests/typing-layouts/user_errors.ml b/testsuite/tests/typing-layouts/user_errors.ml new file mode 100644 index 00000000000..76df05043a1 --- /dev/null +++ b/testsuite/tests/typing-layouts/user_errors.ml @@ -0,0 +1,65 @@ +(* TEST + flags = "-extension layouts_alpha"; + expect; +*) + +(* This test makes sure that [type t : unboxed = manifest] doesn't get + (incorrectly) interpreted as [type t = manifest [@@unboxed]]. + *) + +type t : unboxed = { single_field : string } + +[%%expect{| +Line 1, characters 9-16: +1 | type t : unboxed = { single_field : string } + ^^^^^^^ +Error: Unknown layout unboxed +|}] + +(* The below tests make sure that a layout is given only as an + attribute or as an annotation, but not both, regardless + of whether the two sources match. + *) + +(* the two sources match *) +type t : immediate = int [@@immediate] + +[%%expect{| +Line 1, characters 0-38: +1 | type t : immediate = int [@@immediate] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type declaration's layout can be given at most once. + This declaration has an layout annotation (immediate) and a layout attribute ([@@immediate]). +|}] + +(* the two sources don't match, but either is correct *) +type t : immediate64 = int [@@immediate] + +[%%expect{| +Line 1, characters 0-40: +1 | type t : immediate64 = int [@@immediate] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type declaration's layout can be given at most once. + This declaration has an layout annotation (immediate64) and a layout attribute ([@@immediate]). +|}] + +(* the two sources don't match, and one or the other is incorrect *) +type t : void = int [@@immediate] + +[%%expect{| +Line 1, characters 0-33: +1 | type t : void = int [@@immediate] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type declaration's layout can be given at most once. + This declaration has an layout annotation (void) and a layout attribute ([@@immediate]). +|}] + +type t : void = string [@@immediate] + +[%%expect{| +Line 1, characters 0-36: +1 | type t : void = string [@@immediate] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: A type declaration's layout can be given at most once. + This declaration has an layout annotation (void) and a layout attribute ([@@immediate]). +|}] diff --git a/testsuite/tests/typing-layouts/void.ml b/testsuite/tests/typing-layouts/void.ml index 8d793660169..ea65c1e1b0f 100644 --- a/testsuite/tests/typing-layouts/void.ml +++ b/testsuite/tests/typing-layouts/void.ml @@ -1,5 +1,10 @@ (* TEST - * expect + { + expect; + }{ + flags = "-extension layouts_beta"; + expect; + } *) (* CR layouts: all tests from this file moved to [void_alpha.ml]. Move back @@ -9,5 +14,6 @@ type t_void : void;; Line 1, characters 14-18: 1 | type t_void : void;; ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled +Error: Layout void is more experimental than allowed by the enabled layouts extension. + You must enable -extension layouts_alpha to use this feature. |}] diff --git a/testsuite/tests/typing-layouts/void_alpha.ml b/testsuite/tests/typing-layouts/void_alpha.ml index ce8ef4f7236..896d5be71f4 100644 --- a/testsuite/tests/typing-layouts/void_alpha.ml +++ b/testsuite/tests/typing-layouts/void_alpha.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension layouts_alpha" - * expect + flags = "-extension layouts_alpha"; + expect; *) (* CR layouts v5: when we add the ability to make actual void types, eliminate the uses of Obj.magic from this file *) @@ -62,9 +62,8 @@ type baz = { } val r : '_weak1 list ref = {contents = []} val cons_r : '_weak1 -> unit = -Lines 13-21, characters 8-3: -13 | ........{a1; a2; x; v; z; b1; b2} = -14 | {a1 = (cons_r 11; {v = ((cons_r 12; a1).v)}); +Lines 14-21, characters 2-3: +14 | ..{a1 = (cons_r 11; {v = ((cons_r 12; a1).v)}); 15 | a2 = (cons_r 9; {v = ((cons_r 10; a2).v)}); 16 | x = (cons_r 8; x); 17 | v = (cons_r 6; {v = ((cons_r 7; v).v)}); @@ -74,7 +73,10 @@ Lines 13-21, characters 8-3: 21 | } Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - void_rec has layout void, which is not a sublayout of value. + The layout of void_rec is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of void_rec must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -122,9 +124,8 @@ let b' = id1' b' let _ = assert (List.for_all2 (=) !r [12;11;10;9;8;7;6;5;4;3;2;1]);; [%%expect{| -Lines 3-11, characters 9-3: - 3 | .........{a1; a2; x; v; z; b1; b2} = - 4 | {a2 = (cons_r 9; {v = ((cons_r 10; a2).v)}); +Lines 4-11, characters 2-3: + 4 | ..{a2 = (cons_r 9; {v = ((cons_r 10; a2).v)}); 5 | b2 = (cons_r 1; {v = ((cons_r 2; b2).v)}); 6 | x = (cons_r 8; x); 7 | a1 = (cons_r 11; {v = ((cons_r 12; a1).v)}); @@ -134,7 +135,10 @@ Lines 3-11, characters 9-3: 11 | } Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - void_rec has layout void, which is not a sublayout of value. + The layout of void_rec is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of void_rec must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -220,7 +224,10 @@ Lines 17-35, characters 10-27: 35 | b2 = (cons_r 1; b2)} Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -321,8 +328,8 @@ let x : t_void = assert false;; Line 1, characters 4-5: 1 | let x : t_void = assert false;; ^ -Error: Top-level module bindings must have layout value, but x has layout - void. +Error: Types of top-level module bindings must have layout value, but + the type of x has layout void. |}];; module M3_1 = struct @@ -332,8 +339,8 @@ end;; Line 2, characters 6-7: 2 | let x : t_void = assert false;; ^ -Error: Top-level module bindings must have layout value, but x has layout - void. +Error: Types of top-level module bindings must have layout value, but + the type of x has layout void. |}];; module M3_2 = struct @@ -431,7 +438,10 @@ Line 5, characters 4-6: ^^ Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -463,9 +473,8 @@ let _ = local_void_bindings_1 vh let _ = assert (List.for_all2 (=) !r [8;7;6;5;4;3;2;1]);; [%%expect{| -Lines 3-11, characters 26-24: - 3 | ..........................vh = - 4 | let V v = cons_r 1; vh in +Lines 4-11, characters 2-24: + 4 | ..let V v = cons_r 1; vh in 5 | {a1 = {v = (cons_r 8; v)}; 6 | a2 = {v = (cons_r 7; v)}; 7 | x = (cons_r 6; 12); @@ -475,7 +484,10 @@ Lines 3-11, characters 26-24: 11 | b2 = (cons_r 2; {v})} Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. + The layout of void_rec is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of void_rec must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -496,13 +508,15 @@ let (x, _, vh2, z, _) = local_void_bindings_2 b' let _ = assert (x = 3 && z = 42) [%%expect{| -Lines 1-3, characters 26-32: -1 | ..........................b = -2 | let {z; a1; b1; x; b2} = b in +Lines 2-3, characters 2-32: +2 | ..let {z; a1; b1; x; b2} = b in 3 | (x, V b2.v, V b1.v, z, V a1.v) Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - void_rec has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -598,20 +612,12 @@ let [@warning "-10"] exnmatch1 (V v) = let _ = assert ((exnmatch1 vh) = 1);; [%%expect{| -Lines 1-13, characters 31-24: - 1 | ...............................(V v) = - 2 | match - 3 | {v = (if true then raise (Ex1 42); v)}; - 4 | if true then raise (Ex2 "test"); - 5 | {v = ((if true then raise (Ex3 true)); v)} -... -10 | | exception Ex2 "test" -> 3 -11 | | exception Ex2 _ -> 4 -12 | | exception Ex3 true -> 5 -13 | | exception Ex3 _ -> 6 -Error: Non-value detected in [value_kind]. - Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. +Lines 3-5, characters 4-46: +3 | ....{v = (if true then raise (Ex1 42); v)}; +4 | if true then raise (Ex2 "test"); +5 | {v = ((if true then raise (Ex3 true)); v)} +Error: Non-value layout void detected in [Typeopt.layout] as sort for type + void_rec. Please report this error to the Jane Street compilers team. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -637,20 +643,12 @@ let [@warning "-10"] exnmatch2 (V v) = let _ = assert ((exnmatch2 vh) = 3);; [%%expect{| -Lines 1-13, characters 31-24: - 1 | ...............................(V v) = - 2 | match - 3 | {v = v}; - 4 | if true then raise (Ex2 "test"); - 5 | {v = ((if true then raise (Ex3 true)); v)} -... -10 | | exception Ex2 "test" -> 3 -11 | | exception Ex2 _ -> 4 -12 | | exception Ex3 true -> 5 -13 | | exception Ex3 _ -> 6 -Error: Non-value detected in [value_kind]. - Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. +Lines 3-5, characters 4-46: +3 | ....{v = v}; +4 | if true then raise (Ex2 "test"); +5 | {v = ((if true then raise (Ex3 true)); v)} +Error: Non-value layout void detected in [Typeopt.layout] as sort for type + void_rec. Please report this error to the Jane Street compilers team. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -675,20 +673,11 @@ let [@warning "-10"] exnmatch3 (V v) = let _ = assert ((exnmatch3 vh) = 5);; [%%expect{| -Lines 1-12, characters 31-24: - 1 | ...............................(V v) = - 2 | match - 3 | {v = v}; - 4 | {v = ((if true then raise (Ex3 true)); v)} - 5 | with -... - 9 | | exception Ex2 "test" -> 3 -10 | | exception Ex2 _ -> 4 -11 | | exception Ex3 true -> 5 -12 | | exception Ex3 _ -> 6 -Error: Non-value detected in [value_kind]. - Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. +Lines 3-4, characters 4-46: +3 | ....{v = v}; +4 | {v = ((if true then raise (Ex3 true)); v)} +Error: Non-value layout void detected in [Typeopt.layout] as sort for type + void_rec. Please report this error to the Jane Street compilers team. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -713,20 +702,11 @@ let [@warning "-10"] exnmatch4 (V v) = let _ = assert ((exnmatch4 vh) = 0);; [%%expect{| -Lines 1-12, characters 31-24: - 1 | ...............................(V v) = - 2 | match - 3 | {v = v}; - 4 | {v = v} - 5 | with -... - 9 | | exception Ex2 "test" -> 3 -10 | | exception Ex2 _ -> 4 -11 | | exception Ex3 true -> 5 -12 | | exception Ex3 _ -> 6 -Error: Non-value detected in [value_kind]. - Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. +Lines 3-4, characters 4-11: +3 | ....{v = v}; +4 | {v = v} +Error: Non-value layout void detected in [Typeopt.layout] as sort for type + void_rec. Please report this error to the Jane Street compilers team. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -792,20 +772,23 @@ let _ = assert (List.for_all2 (=) !r [7;6;5;4;3;2;1]);; [%%expect{| type unboxed_inlined_void_rec = UIVR of { uivr_v : t_void; } [@@unboxed] type uivr_holder = { uivrh_x : int; uivrh_v : unboxed_inlined_void_rec; } -Lines 8-18, characters 21-29: - 8 | .....................vh = - 9 | let uivrh = +Lines 9-18, characters 2-29: + 9 | ..let uivrh = 10 | cons_r 1; 11 | match cons_r 2; vh with 12 | | V v -> begin -... +13 | cons_r 3; +14 | { uivrh_x = (cons_r 6; 7); 15 | uivrh_v = (cons_r 4; UIVR { uivr_v = (cons_r 5; v) }) } 16 | end 17 | in 18 | cons_r uivrh.uivrh_x; uivrh Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. + The layout of unboxed_inlined_void_rec is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of unboxed_inlined_void_rec must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -842,9 +825,8 @@ let () = assert (List.for_all2 (=) !r [4;3;2;1]);; [%%expect{| exception Test8 of int * void_holder type test8_rec = { t8_x : int; t8_v : t_void; } -Lines 5-11, characters 10-7: - 5 | ..........(f : unit -> test8_rec) : int * void_holder = - 6 | match cons_r 1; f () with +Lines 6-11, characters 2-7: + 6 | ..match cons_r 1; f () with 7 | | ({t8_x = x; t8_v = v} | exception (Test8 (x, V v))) -> 8 | begin 9 | cons_r 3; @@ -852,7 +834,10 @@ Lines 5-11, characters 10-7: 11 | end Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -906,9 +891,8 @@ let () = assert (x = 42);; let () = assert (List.for_all2 (=) !r [2;1]);; [%%expect{| -Lines 3-11, characters 22-11: - 3 | ......................vh x = - 4 | let v = match vh with +Lines 4-11, characters 2-11: + 4 | ..let v = match vh with 5 | | V v -> v 6 | in 7 | (* not all void *) @@ -918,7 +902,10 @@ Lines 3-11, characters 22-11: 11 | (y, V v') Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after @@ -947,9 +934,8 @@ let () = assert (x = 42);; let () = assert (List.for_all2 (=) !r [3;2;1]);; [%%expect{| -Lines 3-12, characters 22-23: - 3 | ......................vh x = - 4 | let v = match vh with +Lines 4-12, characters 2-23: + 4 | ..let v = match vh with 5 | | V v -> v 6 | in 7 | (* all void *) @@ -960,7 +946,10 @@ Lines 3-12, characters 22-23: 12 | (x, V v1, V v2, V v3) Error: Non-value detected in [value_kind]. Please report this error to the Jane Street compilers team. - t_void has layout void, which is not a sublayout of value. + The layout of t_void is void + because of the definition of t_void at line 1, characters 0-18. + But the layout of t_void must be a sublayout of value + because it has to be value for the V1 safety check. |}] (* CR layouts v5: This was the expected behavior before removing the handling of void for lambda, and we expected it to be the expected behavior again after diff --git a/testsuite/tests/typing-layouts/void_beta.ml b/testsuite/tests/typing-layouts/void_beta.ml deleted file mode 100644 index 2164494df26..00000000000 --- a/testsuite/tests/typing-layouts/void_beta.ml +++ /dev/null @@ -1,14 +0,0 @@ -(* TEST - flags = "-extension layouts_beta" - * expect -*) - -(* CR layouts v5: all tests from this file moved to [void_alpha.ml]. Move back - here. *) -type t_void : void;; -[%%expect {| -Line 1, characters 14-18: -1 | type t_void : void;; - ^^^^ -Error: Layout void is used here, but the appropriate layouts extension is not enabled -|}] diff --git a/testsuite/tests/typing-local/alloc.heap.reference b/testsuite/tests/typing-local/alloc.heap.reference index dd961d510ab..871b2fa9660 100644 --- a/testsuite/tests/typing-local/alloc.heap.reference +++ b/testsuite/tests/typing-local/alloc.heap.reference @@ -23,6 +23,7 @@ longarray: Allocation floatgenarray: Allocation longfgarray: Allocation + maniparray0: Allocation maniparray: Allocation manipfarray: Allocation ref: Allocation diff --git a/testsuite/tests/typing-local/alloc.ml b/testsuite/tests/typing-local/alloc.ml index 66a888be2b5..4506ddeca03 100644 --- a/testsuite/tests/typing-local/alloc.ml +++ b/testsuite/tests/typing-local/alloc.ml @@ -1,13 +1,30 @@ (* TEST - * bytecode - reference = "${test_source_directory}/alloc.heap.reference" - * stack-allocation - ** native - reference = "${test_source_directory}/alloc.stack.reference" - * no-stack-allocation - ** native - reference = "${test_source_directory}/alloc.heap.reference" - *) + { + reference = "${test_source_directory}/alloc.heap.reference"; + bytecode; + }{ + stack-allocation; + reference = "${test_source_directory}/alloc.stack.reference"; + native; + }{ + no-stack-allocation; + reference = "${test_source_directory}/alloc.heap.reference"; + native; + } +*) + +(* First test to ensure that noalloc externals that locally allocate + don't cause a crash in the middle end (originally seen on + flambda-backend PR2180). *) + +(* This will never be called, caml_alloc_dummy is just chosen as a primitive that + exists in the bytecode runtime too *) +external foo : unit -> ('a[@local_opt]) = + "caml_alloc_dummy" "caml_alloc_dummy" [@@noalloc] + +let foo () = foo () + +(* Remaining tests *) type t = int @@ -264,6 +281,16 @@ external array_blit : external array_fill : local_ 'a array -> int -> int -> 'a -> unit = "caml_array_fill" +let maniparray0 = + let l = [42] in + fun arr -> + (* This function should only locally allocate in the C runtime function + for doing the array allocation, and not in the OCaml code, in order + to ensure that locally-allocating C calls hold onto regions. *) + let x = local_array 6 l in + assert (x = arr); + () + let maniparray arr = (* arr = 1,2,3,1,2,3 *) let x = local_array 2 [2] in (* 2,2 *) let x = array_append x x in (* 2,2,2,2 *) @@ -472,6 +499,7 @@ let () = run "longarray" makelongarray 42; run "floatgenarray" makeshortarray 42.; run "longfgarray" makelongarray 42.; + run "maniparray0" maniparray0 [| [42]; [42]; [42]; [42]; [42]; [42] |]; run "maniparray" maniparray [| [1]; [2]; [3]; [1]; [2]; [3] |]; run "manipfarray" manipfarray [| 1.; 2.; 3.; 1.; 2.; 3. |]; run "ref" makeref 42; diff --git a/testsuite/tests/typing-local/alloc.stack.reference b/testsuite/tests/typing-local/alloc.stack.reference index 98345b8bf05..7be5f7deeb3 100644 --- a/testsuite/tests/typing-local/alloc.stack.reference +++ b/testsuite/tests/typing-local/alloc.stack.reference @@ -23,6 +23,7 @@ longarray: No Allocation floatgenarray: No Allocation longfgarray: No Allocation + maniparray0: No Allocation maniparray: No Allocation manipfarray: No Allocation ref: No Allocation diff --git a/testsuite/tests/typing-local/alloc_arg_with_mli.ml b/testsuite/tests/typing-local/alloc_arg_with_mli.ml index 93f869aeab7..64c0755dad9 100644 --- a/testsuite/tests/typing-local/alloc_arg_with_mli.ml +++ b/testsuite/tests/typing-local/alloc_arg_with_mli.ml @@ -1,7 +1,7 @@ (* TEST - * stack-allocation - ** native - *) + stack-allocation; + native; +*) (* Check whether functions that *could* take their argument locally allow their callers to locally construct the argument. diff --git a/testsuite/tests/typing-local/alloc_arg_without_mli.ml b/testsuite/tests/typing-local/alloc_arg_without_mli.ml index 9cb1451f973..46490b49ba1 100644 --- a/testsuite/tests/typing-local/alloc_arg_without_mli.ml +++ b/testsuite/tests/typing-local/alloc_arg_without_mli.ml @@ -1,12 +1,10 @@ (* TEST - -readonly_files = "alloc_arg_with_mli.ml" - -* stack-allocation -** native -compile_only = "false" -flags = "-o ${test_build_directory}/alloc_arg_without_mli.opt" -module = "alloc_arg_with_mli.ml" + readonly_files = "alloc_arg_with_mli.ml"; + stack-allocation; + compile_only = "false"; + flags = "-o ${test_build_directory}/alloc_arg_without_mli.opt"; + module = "alloc_arg_with_mli.ml"; + native; *) (* Check whether functions that *could* take their argument diff --git a/testsuite/tests/typing-local/close_at_apply.ml b/testsuite/tests/typing-local/close_at_apply.ml new file mode 100644 index 00000000000..eeaf58b98b1 --- /dev/null +++ b/testsuite/tests/typing-local/close_at_apply.ml @@ -0,0 +1,57 @@ +(* TEST + stack-allocation; + flambda2; + { + ocamlopt_flags="-Oclassic"; + native; + }{ + ocamlopt_flags="-O3"; + native; + } +*) + +external local_stack_offset : unit -> int = "caml_local_stack_offset" + +external ignore : ('a[@local_opt]) -> unit = "%ignore" +external opaque_identity : ('a[@local_opt]) -> ('a[@local_opt]) = "%opaque" + +external ( +. ) + : (float[@local_opt]) + -> (float[@local_opt]) + -> (float[@local_opt]) + = "%addfloat" + +let locally_allocate = + let f = 1.0 in + fun [@inline never] () -> ignore (opaque_identity (f +. 1.0) : float) +;; + +let saved_stack_offset = ref 0 + +let foo list = + (* The Simplif local function optimization will transform [run] and + [wrapper] into continuations. *) + let[@inline never][@local] run f = f () in + let[@inline never][@local] wrapper f = + match Sys.opaque_identity true with + | true -> + (* Make a local allocation *) + ignore (opaque_identity (opaque_identity 1.0 +. 1.0)); + (* This tail call gets moved into non-tail position after the above + inlining transformation. As such it's important that its + [Rc_close_at_apply] semantics is respected carefully: only the + current region, and not the parent one, must be closed (since [f] + is locally allocated in that parent region). *) + f () + | false -> run (fun () -> f ()) [@nontail] + in + let f = fun _ -> + assert (local_stack_offset () = !saved_stack_offset); + locally_allocate (); + Stdlib.List.hd list + in + saved_stack_offset := local_stack_offset (); + wrapper f [@nontail] +;; + +let _ : int = foo [ 1 ] diff --git a/testsuite/tests/typing-local/crossing.ml b/testsuite/tests/typing-local/crossing.ml index 8109b302184..58b6a76a6f4 100644 --- a/testsuite/tests/typing-local/crossing.ml +++ b/testsuite/tests/typing-local/crossing.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) type ('a, 'b) bar0 = Bar0 of 'a * 'b type bar = (int, string) bar0 @@ -53,7 +54,9 @@ let f : local_ _ -> _ = Line 2, characters 14-15: 2 | fun x -> f' x ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] (* 2. constructor argument crosses mode at construction *) @@ -69,7 +72,7 @@ let f : local_ _ -> bar = Line 2, characters 21-22: 2 | fun n -> Bar0 (42, n) ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* 3. record field crosses mode at construction *) @@ -85,7 +88,7 @@ let f : local_ _ -> foo = Line 2, characters 24-25: 2 | fun n -> {x = 42; y = n} ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* 4. expression crosses mode when being constrained *) @@ -101,7 +104,7 @@ let f : local_ _ -> _ = Line 2, characters 12-13: 2 | fun n -> (n : string) ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* 5. polymorphic variant arguments crosses mode on construction*) @@ -117,7 +120,7 @@ let f : local_ _ -> [> `Text of string] = Line 2, characters 17-18: 2 | fun n -> `Text n ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* tuple elements crosses mode at construction *) @@ -133,7 +136,7 @@ let f : local_ _ -> string * string = Line 2, characters 12-13: 2 | fun n -> (n, n) ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* array elements crosses mode at construction *) @@ -149,7 +152,7 @@ let f: local_ _ -> string array = Line 2, characters 13-14: 2 | fun n -> [|n; n|] ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* after discussion with sdolan, we agree that @@ -177,7 +180,7 @@ let f : local_ foo -> _ = Line 2, characters 11-14: 2 | fun r -> r.y ^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* the expected type is not considered when mode crossing the result of @@ -213,7 +216,9 @@ val g : string -> string = Line 6, characters 6-22: 6 | g (local_ "world") ^^^^^^^^^^^^^^^^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] (* the result of function application crosses mode *) @@ -241,7 +246,7 @@ let g : _ -> _ = Line 2, characters 28-29: 2 | fun () -> let x = f () in x ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* constructor argument crosses modes upon pattern matching *) @@ -273,7 +278,7 @@ let f : local_ bar -> _ = Line 4, characters 21-22: 4 | | Bar0 (_, y) -> y ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* record fields crosses modes upon pattern matching *) @@ -303,7 +308,7 @@ let f : local_ foo -> _ = Line 4, characters 16-17: 4 | | {y; _} -> y ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* constraint crosses modes upon pattern matching *) @@ -319,7 +324,7 @@ let f : local_ _ -> _ = Line 2, characters 22-23: 2 | fun (x : string) -> x ^ -Error: This value escapes its region +Error: This value escapes its region. |}] @@ -345,7 +350,7 @@ val f : local_ M.t -> M.t = val f : local_ t2 -> t2 = |}] -(* This test needs the snapshotting in [is_immediate] to prevent a type error +(* This test needs the snapshotting in [type_jkind_purely] to prevent a type error from the use of the gadt equation in the inner scope. *) type _ t_gadt = Int : int t_gadt type 'a t_rec = { fld : 'a } @@ -438,6 +443,28 @@ Line 1, characters 12-39: Error: Type int -> local_ int is not a subtype of local_ int -> int |}] +(* Testing mode crossing in [enlarge_type] *) +module M : sig + val foo : (int -> unit) -> (local_ int -> unit) +end = struct + let foo f = (f :> local_ int -> unit) +end +[%%expect{| +module M : sig val foo : (int -> unit) -> local_ int -> unit end +|}] + +(* Same, but in opposite variance. + The following coercion is still strenghthening *) +module M : sig + val foo : ((local_ int -> int) -> unit) -> ((int -> int) -> unit) +end = struct + let foo f = (f :> (int -> int) -> unit) +end +[%%expect{| +module M : + sig val foo : ((local_ int -> int) -> unit) -> (int -> int) -> unit end +|}] + (* Mode crossing at identifiers - in the following, x and y are added to the environment at mode local, but they cross to global when they are refered to again. Note that ref is polymorphic and thus doesn't trigger crossing. *) @@ -447,4 +474,13 @@ let foo () = () [%%expect{| val foo : unit -> unit = -|}] \ No newline at end of file +|}] + +(* Values crosses modes when pattern-matching, an implication is that, closing + over [local int] won't force the closure to be [local]. *) +let foo (local_ x : int) = + let bar y = x + y in + ref bar +[%%expect{| +val foo : local_ int -> (int -> int) ref = +|}] diff --git a/testsuite/tests/typing-local/crossing_64.ml b/testsuite/tests/typing-local/crossing_64.ml index f2d0737bc0d..8a0c150eed4 100644 --- a/testsuite/tests/typing-local/crossing_64.ml +++ b/testsuite/tests/typing-local/crossing_64.ml @@ -1,6 +1,7 @@ (* TEST - * arch64 - ** expect *) + arch64; + expect; +*) (* Mode crossing works on immediate64 types *) module F (M : sig type t [@@immediate64] end) = struct diff --git a/testsuite/tests/typing-local/curry.ml b/testsuite/tests/typing-local/curry.ml index 9bde0d76d4e..a7725d8c5a9 100644 --- a/testsuite/tests/typing-local/curry.ml +++ b/testsuite/tests/typing-local/curry.ml @@ -1,13 +1,17 @@ (* TEST - * bytecode - reference = "${test_source_directory}/curry.heap.reference" - * stack-allocation - ** native - reference = "${test_source_directory}/curry.stack.reference" - * no-stack-allocation - ** native - reference = "${test_source_directory}/curry.heap.reference" - *) + { + reference = "${test_source_directory}/curry.heap.reference"; + bytecode; + }{ + stack-allocation; + reference = "${test_source_directory}/curry.stack.reference"; + native; + }{ + no-stack-allocation; + reference = "${test_source_directory}/curry.heap.reference"; + native; + } +*) module M : sig (* explicit signature to force return modes *) diff --git a/testsuite/tests/typing-local/exceptions.ml b/testsuite/tests/typing-local/exceptions.ml index ad68e8f283e..cc8feda03d0 100644 --- a/testsuite/tests/typing-local/exceptions.ml +++ b/testsuite/tests/typing-local/exceptions.ml @@ -1,5 +1,6 @@ (* TEST - * native *) + native; +*) external local_stack_offset : unit -> int = "caml_local_stack_offset" diff --git a/testsuite/tests/typing-local/exclave.ml b/testsuite/tests/typing-local/exclave.ml index 6c68aeeb7aa..900a1e5f342 100644 --- a/testsuite/tests/typing-local/exclave.ml +++ b/testsuite/tests/typing-local/exclave.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) (* typing tests *) @@ -61,7 +62,7 @@ let foo x = Line 5, characters 8-9: 5 | ref y ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* following we check error detection *) @@ -83,7 +84,7 @@ let foo x = Line 3, characters 10-25: 3 | let z = exclave_ Some y in ^^^^^^^^^^^^^^^ -Error: Exclave expression should only be in tail position of the current region +Error: Exclave expression should only be in tail position of the current region. |}] (* following we test WHILE loop *) @@ -107,7 +108,7 @@ let foo () = Line 3, characters 4-17: 3 | (exclave_ ()); ^^^^^^^^^^^^^ -Error: Exclave expression should only be in tail position of the current region +Error: Exclave expression should only be in tail position of the current region. |}] (* following we test FOR loop *) @@ -128,7 +129,7 @@ let foo () = Line 3, characters 4-17: 3 | (exclave_ ()); ^^^^^^^^^^^^^ -Error: Exclave expression should only be in tail position of the current region +Error: Exclave expression should only be in tail position of the current region. |}] type t = { x : int option } @@ -161,7 +162,7 @@ type data = { mutable a : string; } Line 6, characters 9-10: 6 | x.a <- z; ^ -Error: This value escapes its region +Error: This value escapes its region. |}] let foo x = @@ -182,9 +183,9 @@ val bar : 'a -> string = |}] (* Ensure that Alias bindings are not substituted by Simplif (PR1448) *) -type 'a glob = Glob of ('a[@global]) +type 'a glob = Glob of global_ 'a -let[@inline never] return_local a = [%local] (Glob a) +let[@inline never] return_local a = local_ (Glob a) let f () = let (Glob x) = return_local 1 in @@ -212,4 +213,35 @@ Line 3, characters 4-19: ^^^^^^^^^^^^^^^ Error: This function or one of its parameters escape their region when it is partially applied. -|}] \ No newline at end of file +|}] + +let f () = + exclave_ ( + (fun x -> function | "a" -> () | _ -> ()) : (string -> string -> unit) + ) +[%%expect{| +Line 3, characters 4-45: +3 | (fun x -> function | "a" -> () | _ -> ()) : (string -> string -> unit) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This function or one of its parameters escape their region + when it is partially applied. +|}] + +(* For nested functions, inner functions are not constrained *) +let f () = + exclave_ ( + (fun x -> fun y -> ()) : (string -> string -> unit) + ) +[%%expect{| +val f : unit -> local_ (string -> (string -> unit)) = +|}] + +let f : local_ string -> string = + fun x -> exclave_ s +[%%expect{| +Line 2, characters 11-21: +2 | fun x -> exclave_ s + ^^^^^^^^^^ +Error: This expression was expected to be not local, but is an exclave expression, + which must be local. +|}] diff --git a/testsuite/tests/typing-local/external.ml b/testsuite/tests/typing-local/external.ml new file mode 100644 index 00000000000..75fdbbac225 --- /dev/null +++ b/testsuite/tests/typing-local/external.ml @@ -0,0 +1,19 @@ +(* TEST + flambda2; + native; +*) + +module M : sig + val bits_of_float : float -> int64 +end = struct + external bits_of_float + : (float[@local_opt]) + -> (int64[@local_opt]) + = "caml_int64_bits_of_float" "caml_int64_bits_of_float_unboxed" + [@@unboxed] [@@noalloc] +end + +let go_m f = + let i = M.bits_of_float f in + assert (i = 4L); + () diff --git a/testsuite/tests/typing-local/float_iarray.ml b/testsuite/tests/typing-local/float_iarray.ml index 48a3fdbb208..ae8ef935941 100644 --- a/testsuite/tests/typing-local/float_iarray.ml +++ b/testsuite/tests/typing-local/float_iarray.ml @@ -1,18 +1,23 @@ (* TEST - * bytecode - reference = "${test_source_directory}/float_iarray.heap.reference" - * stack-allocation - ** native - reference = "${test_source_directory}/float_iarray.stack.reference" - * no-stack-allocation - ** native - reference = "${test_source_directory}/float_iarray.heap.reference" - *) + include stdlib_stable; + { + reference = "${test_source_directory}/float_iarray.heap.reference"; + bytecode; + }{ + stack-allocation; + reference = "${test_source_directory}/float_iarray.stack.reference"; + native; + }{ + no-stack-allocation; + reference = "${test_source_directory}/float_iarray.heap.reference"; + native; + } +*) (* Testing that local [float iarray]s don't allocate on access. This is a question because for flat float arrays, accesses have to box the float. *) -module Iarray = Stdlib__Iarray +module Iarray = Stdlib_stable.Iarray let ( .:() ) = Iarray.( .:() ) diff --git a/testsuite/tests/typing-local/local-layouts.ml b/testsuite/tests/typing-local/local-layouts.ml index 8e84ee814d6..7ef308a0a5a 100644 --- a/testsuite/tests/typing-local/local-layouts.ml +++ b/testsuite/tests/typing-local/local-layouts.ml @@ -1,6 +1,6 @@ (* TEST - * expect - flags = "-extension layouts_beta" + flags = "-extension layouts_beta"; + expect; *) let foo _t (type a) = local_ 1 diff --git a/testsuite/tests/typing-local/local.ml b/testsuite/tests/typing-local/local.ml index 4e7f8ef3e6b..9bf7c74a73a 100644 --- a/testsuite/tests/typing-local/local.ml +++ b/testsuite/tests/typing-local/local.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) let leak n = let r = local_ ref n in @@ -8,8 +9,8 @@ let leak n = Line 3, characters 2-3: 3 | r ^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] external idint : local_ int -> int = "%identity" @@ -39,8 +40,8 @@ let leak n = Line 3, characters 2-3: 3 | r ^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let leak n = @@ -50,8 +51,8 @@ let leak n = Line 3, characters 2-3: 3 | r ^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let leak n = @@ -61,8 +62,8 @@ let leak n = Line 3, characters 2-3: 3 | f ^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let leak n = @@ -72,8 +73,8 @@ let leak n = Line 3, characters 2-3: 3 | f ^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] (* If both type and mode are wrong, complain about type *) @@ -267,8 +268,8 @@ let apply2 x = f4 x x Line 1, characters 15-21: 1 | let apply2 x = f4 x x ^^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 2 more arguments will make the value non-local |}] @@ -277,8 +278,8 @@ let apply3 x = f4 x x x Line 1, characters 15-23: 1 | let apply3 x = f4 x x x ^^^^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 1 more argument will make the value non-local |}] @@ -315,8 +316,8 @@ let apply1 x = g x Line 1, characters 15-18: 1 | let apply1 x = g x ^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 1 more argument will make the value non-local |}] @@ -338,8 +339,8 @@ let apply3_wrapped x = (g x x) x Line 1, characters 23-32: 1 | let apply3_wrapped x = (g x x) x ^^^^^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 1 more argument will make the value non-local |}] @@ -395,32 +396,33 @@ let app1 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) Line 1, characters 64-79: 1 | let app1 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) () ^^^^^^^^^^^^^^^ -Error: This value escapes its region - Hint: It is captured by a partial application +Error: This value escapes its region. + Hint: It is captured by a partial application. |}] let app2 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) [%%expect{| Line 1, characters 64-79: 1 | let app2 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) ^^^^^^^^^^^^^^^ -Error: This value escapes its region - Hint: It is captured by a partial application +Error: This value escapes its region. + Hint: It is captured by a partial application. |}] let app3 (f : a:int -> b:local_ int ref -> unit) = f ~b:(local_ ref 42) [%%expect{| Line 1, characters 56-71: 1 | let app3 (f : a:int -> b:local_ int ref -> unit) = f ~b:(local_ ref 42) ^^^^^^^^^^^^^^^ -Error: This value escapes its region - Hint: It is captured by a partial application +Error: This value escapes its region. + Hint: It is captured by a partial application. |}] let app4 (f : b:local_ int ref -> a:int -> unit) = f ~b:(local_ ref 42) [%%expect{| Line 1, characters 56-71: 1 | let app4 (f : b:local_ int ref -> a:int -> unit) = f ~b:(local_ ref 42) ^^^^^^^^^^^^^^^ -Error: This local value escapes its region - Hint: This argument cannot be local, because this is a tail call +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let app42 (f : a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) = f ~a:(local_ ref 1) 2 ~c:4 @@ -445,8 +447,9 @@ let app43 (f : a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) = Line 2, characters 7-21: 2 | f ~a:(local_ ref 1) 2 ^^^^^^^^^^^^^^ -Error: This local value escapes its region - Hint: This argument cannot be local, because this is a tail call +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let app5 (f : b:local_ int ref -> a:int -> unit) = f ~a:42 [%%expect{| @@ -480,8 +483,8 @@ let app4' (f : b:local_ int ref -> a:int -> unit) = f ~b:(ref 42) Line 1, characters 52-65: 1 | let app4' (f : b:local_ int ref -> a:int -> unit) = f ~b:(ref 42) ^^^^^^^^^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 1 more argument will make the value non-local |}] @@ -535,8 +538,8 @@ let rapp3 (f : a:int -> unit -> local_ int ref) = f ~a:1 () Line 1, characters 50-59: 1 | let rapp3 (f : a:int -> unit -> local_ int ref) = f ~a:1 () ^^^^^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let bug1 () = @@ -550,8 +553,8 @@ let bug1 () = Line 7, characters 2-5: 7 | res ^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let bug2 () = let foo : a:local_ string -> (b:local_ string -> (c:int -> unit)) = @@ -636,7 +639,7 @@ let bug4 : local_ (string -> foo:string -> unit) -> (string -> unit) = Line 2, characters 11-25: 2 | fun f -> f ~foo:"hello" ^^^^^^^^^^^^^^ -Error: This value escapes its region +Error: This value escapes its region. Hint: This is a partial application Adding 1 more argument will make the value non-local |}] @@ -659,8 +662,8 @@ let bug4' () = Line 3, characters 25-31: 3 | let local_ perm ~foo = f ~foo in ^^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 1 more argument may make the value non-local |}] @@ -681,8 +684,8 @@ let appopt2 (f : ?a:local_ int ref -> unit -> unit) = Line 3, characters 2-5: 3 | res ^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] (* In principle. it would be sound to allow this one: @@ -694,8 +697,8 @@ let appopt3 (f : ?a:local_ int ref -> int -> int -> unit) = Line 3, characters 2-5: 3 | res ^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let optret1 (f : ?x:int -> local_ (y:unit -> unit -> int)) = f () @@ -703,8 +706,8 @@ let optret1 (f : ?x:int -> local_ (y:unit -> unit -> int)) = f () Line 1, characters 61-65: 1 | let optret1 (f : ?x:int -> local_ (y:unit -> unit -> int)) = f () ^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 1 more argument will make the value non-local |}] @@ -720,7 +723,7 @@ let eta (local_ f : ?a:bool -> unit -> int) = (f : unit -> int) Line 1, characters 47-48: 1 | let eta (local_ f : ?a:bool -> unit -> int) = (f : unit -> int) ^ -Error: This value escapes its region +Error: This value escapes its region. |}] let etajoin p (f : ?b:bool -> unit -> int) (local_ g : unit -> int) = @@ -748,7 +751,7 @@ let foo ?(local_ x = local_ "hello") () = x;; Line 1, characters 21-35: 1 | let foo ?(local_ x = local_ "hello") () = x;; ^^^^^^^^^^^^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] let foo ?(local_ x = local_ "hello") () = local_ x;; @@ -756,7 +759,7 @@ let foo ?(local_ x = local_ "hello") () = local_ x;; Line 1, characters 21-35: 1 | let foo ?(local_ x = local_ "hello") () = local_ x;; ^^^^^^^^^^^^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* @@ -778,7 +781,7 @@ val baduse : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c lazy_t = Line 2, characters 20-45: 2 | let result = baduse (fun a b -> local_ (a,b)) 1 2 ^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This function is local-returning, but was expected otherwise +Error: This function is local-returning, but was expected otherwise. |}] (* @@ -842,7 +845,7 @@ let heap_closure () = Line 10, characters 24-26: 10 | let _force_heap = ref fn in ^^ -Error: This value escapes its region +Error: This value escapes its region. |}] let local_closure () = @@ -870,7 +873,7 @@ let toplevel_stack = local_ {contents=42} Line 1, characters 21-41: 1 | let toplevel_stack = local_ {contents=42} ^^^^^^^^^^^^^^^^^^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] module M = struct @@ -885,7 +888,7 @@ let _ = local_ {contents=42} Line 1, characters 8-28: 1 | let _ = local_ {contents=42} ^^^^^^^^^^^^^^^^^^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] @@ -899,7 +902,7 @@ module type T = sig val x : int option end Line 4, characters 50-51: 4 | let _m : (module T) = local_ (module struct let x = thing end) in ^ -Error: This value escapes its region +Error: This value is local, but expected to be global because it is inside a module. |}] let local_module () = let thing = local_ Some 1 in @@ -911,7 +914,7 @@ let local_module () = Line 4, characters 30-31: 4 | let module M = struct let x = thing end in ^ -Error: This value escapes its region +Error: This value is local, but expected to be global because it is inside a module. |}] let obj () = let thing = local_ Some 1 in @@ -952,7 +955,7 @@ let leak_id = Line 2, characters 24-25: 2 | use_locally (fun x -> x) 42 ^ -Error: This value escapes its region +Error: This value escapes its region. |}] let leak_ref = @@ -963,7 +966,7 @@ let leak_ref = Line 3, characters 43-44: 3 | use_locally (fun x -> r.contents <- Some x; x) 42 ^ -Error: This value escapes its region +Error: This value escapes its region. |}] let leak_ref_2 = @@ -983,7 +986,7 @@ let leak_ref_3 = Line 3, characters 64-65: 3 | use_locally' (fun x -> let _ = local_ r in r.contents <- Some x; x) 42 ^ -Error: This value escapes its region +Error: This value escapes its region. |}] @@ -1000,7 +1003,7 @@ let do_leak_exn = Line 2, characters 66-67: 2 | use_locally (fun x -> let _exn = local_ raise (Invalid_argument x) in "bluh") "blah" ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* handled exceptions are known to be global *) @@ -1023,7 +1026,8 @@ val catch : (unit -> local_ string) -> string * string = (* same, but this time the function is allowed to return its argument *) let use_locally (f : local_ 'a -> local_ 'a) : local_ 'a -> local_ 'a = f [%%expect{| -val use_locally : (local_ 'a -> local_ 'a) -> local_ 'a -> local_ 'a = +val use_locally : + ('a : any). (local_ 'a -> local_ 'a) -> local_ 'a -> local_ 'a = |}] let loc = ((fun x -> local_ x) : local_ int -> local_ int) @@ -1057,7 +1061,7 @@ let bar (local_ (m : (module S))) = Line 2, characters 19-20: 2 | let (module M) = m in ^ -Error: This value escapes its region +Error: This value escapes its region. |}] let bar (local_ m) = @@ -1067,7 +1071,7 @@ let bar (local_ m) = Line 2, characters 22-23: 2 | let module M = (val m : S) in ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* Don't escape through a lazy value *) @@ -1167,7 +1171,7 @@ let foo (local_ x) = Line 4, characters 10-11: 4 | let y = x in ^ -Error: This value escapes its region +Error: This value escapes its region. |}] let foo (local_ x) = @@ -1277,7 +1281,7 @@ let foo (local_ x) = Line 3, characters 14-15: 3 | let rec g = x :: g in ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* Cannot pass local values to tail calls *) @@ -1292,8 +1296,9 @@ val print : local_ string ref -> unit = Line 5, characters 8-9: 5 | print r ^ -Error: This local value escapes its region - Hint: This argument cannot be local, because this is a tail call +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let local_cb (local_ f) = f () @@ -1347,8 +1352,9 @@ let foo x = Line 4, characters 2-5: 4 | foo () ^^^ -Error: This local value escapes its region - Hint: This function cannot be local, because this is a tail call +Error: This value escapes its region. + Hint: This function cannot be local, + because it is the function in a tail call. |}] let foo x = @@ -1377,8 +1383,8 @@ let foo x = Line 3, characters 2-3: 3 | r ^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let foo x = @@ -1477,8 +1483,8 @@ let foo : 'a -> unit = fun (local_ x) -> () Line 1, characters 23-43: 1 | let foo : 'a -> unit = fun (local_ x) -> () ^^^^^^^^^^^^^^^^^^^^ -Error: This function has a local parameter, but was expected to have type: - 'a -> unit +Error: This function takes a parameter which is local, + but was expected to take a parameter which is global. |}] (* Return mode must be greater than the type *) @@ -1493,7 +1499,7 @@ let foo : unit -> string = fun () -> local_ "hello" Line 1, characters 27-51: 1 | let foo : unit -> string = fun () -> local_ "hello" ^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This function is local-returning, but was expected otherwise +Error: This function is local-returning, but was expected otherwise. |}] (* Unboxed type constructors do not affect regionality *) @@ -1531,8 +1537,8 @@ let foo y = Line 3, characters 2-7: 3 | x.imm ^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let foo (local_ x) = x.mut [%%expect{| @@ -1566,8 +1572,8 @@ let foo y = Line 3, characters 2-5: 3 | imm ^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let foo (local_ { mut }) = mut [%%expect{| @@ -1610,7 +1616,7 @@ let foo (local_ mut) = Line 2, characters 12-15: 2 | let _ = { mut } in ^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] let foo () = let mut = local_ ref 5 in @@ -1620,7 +1626,7 @@ let foo () = Line 3, characters 12-15: 3 | let _ = { mut } in ^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] let foo (local_ gbl) = let _ = { gbl } in @@ -1629,7 +1635,7 @@ let foo (local_ gbl) = Line 2, characters 12-15: 2 | let _ = { gbl } in ^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] let foo () = let gbl = local_ ref 5 in @@ -1639,7 +1645,7 @@ let foo () = Line 3, characters 12-15: 3 | let _ = { gbl } in ^^^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* Global fields are preserved in module inclusion *) @@ -1666,7 +1672,7 @@ Error: Signature mismatch: foo : string; is not the same as: global_ foo : string; - The second is global and the first is not. + The second is global_ and the first is not. |}] module M : sig @@ -1692,7 +1698,7 @@ Error: Signature mismatch: global_ foo : string; is not the same as: foo : string; - The first is global and the second is not. + The first is global_ and the second is not. |}] (* Special handling of tuples in matches and let bindings *) @@ -1718,7 +1724,9 @@ let foo (local_ x) y = Line 4, characters 29-30: 4 | | Some _, Some b -> escape b ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo (local_ x) y = @@ -1731,7 +1739,9 @@ let foo (local_ x) y = Line 5, characters 11-12: 5 | escape b ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo p (local_ x) y z = @@ -1753,7 +1763,9 @@ let foo p (local_ x) y (local_ z) = Line 5, characters 9-10: 5 | escape b;; ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo p (local_ x) y z = @@ -1765,7 +1777,9 @@ let foo p (local_ x) y z = Line 5, characters 9-10: 5 | escape a;; ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo p (local_ x) y z = @@ -1778,7 +1792,9 @@ let foo p (local_ x) y z = Line 6, characters 9-10: 6 | escape b;; ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] (* [as] patterns *) @@ -1799,7 +1815,9 @@ let foo (local_ x) = Line 4, characters 26-27: 4 | | Some _ as y -> escape y ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo (local_ x) = @@ -1808,6 +1826,13 @@ let foo (local_ x) = | _ -> () [%%expect{| val foo : local_ int -> unit = +|}, Principal{| +Line 3, characters 21-22: +3 | | 0 as y -> escape y + ^ +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo (local_ x) = @@ -1816,6 +1841,13 @@ let foo (local_ x) = | _ -> () [%%expect{| val foo : local_ char -> unit = +|}, Principal{| +Line 3, characters 28-29: +3 | | 'a'..'e' as y -> escape y + ^ +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo (local_ x) = @@ -1826,7 +1858,9 @@ let foo (local_ x) = Line 3, characters 23-24: 3 | | 1.1 as y -> escape y ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo (local_ x) = @@ -1845,7 +1879,9 @@ let foo (local_ x) = Line 3, characters 28-29: 3 | | (`Foo _) as y -> escape y ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo (local_ x) = @@ -1855,7 +1891,9 @@ let foo (local_ x) = Line 3, characters 35-36: 3 | | (None | Some _) as y -> escape y ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] let foo (local_ x) = @@ -1865,7 +1903,9 @@ let foo (local_ x) = Line 3, characters 33-34: 3 | | (Some _|None) as y -> escape y ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] type foo = [`Foo | `Bar] @@ -1888,7 +1928,9 @@ type foo = [ `Bar of int | `Foo ] Line 5, characters 24-25: 5 | | #foo as y -> escape y ^ -Error: This value escapes its region +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] (* Primitives *) @@ -2049,8 +2091,9 @@ val testbool1 : (local_ int ref -> bool) -> bool = Line 3, characters 63-64: 3 | let testbool2 f = let local_ r = ref 42 in true && (false || f r) ^ -Error: This local value escapes its region - Hint: This argument cannot be local, because this is a tail call +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. |}] (* boolean operator when at tail of function makes the function local-returning @@ -2076,7 +2119,7 @@ external strange_and : bool -> 'a option -> 'a option = "%sequand" Line 5, characters 19-20: 5 | strange_and true x ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* mode-crossing using unary + *) @@ -2107,10 +2150,10 @@ module M = struct | (None, None, z) = (Some (ref 0), (local_ (Some (ref 0))), (ref 0)) end [%%expect{| -Line 2, characters 35-36: +Line 2, characters 12-13: 2 | let (Some z, _, _) | (None, Some z, _) - ^ -Error: This value escapes its region + ^ +Error: This value is local, but expected to be global because it is inside a module. |}] module M = struct @@ -2121,7 +2164,7 @@ end Line 2, characters 12-13: 2 | let (Some z, _, _) | (None, Some z, _) ^ -Error: This value escapes its region +Error: This value is local, but expected to be global because it is inside a module. |}] (* Example of backtracking after mode error *) @@ -2480,7 +2523,8 @@ Error: Signature mismatch: Bar of int * string is not the same as: Bar of int * global_ string - Locality mismatch at argument position 2 : The second is global and the first is not. + Modality mismatch at argument position 2: + The second is global_ and the first is not. |}] @@ -2507,7 +2551,8 @@ Error: Signature mismatch: Bar of int * global_ string is not the same as: Bar of int * string - Locality mismatch at argument position 2 : The first is global and the second is not. + Modality mismatch at argument position 2: + The first is global_ and the second is not. |}] (* global_ binds closer than star *) @@ -2516,6 +2561,11 @@ type gfoo = GFoo of global_ string * string type gfoo = GFoo of global_ string * string |}] +type gfoo' = GFoo' : global_ string -> gfoo' +[%%expect{| +type gfoo' = GFoo' : global_ string -> gfoo' +|}] + (* TESTING OF GLOBAL_ *) (* global arguments must be global when constructing @@ -2527,7 +2577,7 @@ let f (local_ s : string) = Line 2, characters 8-9: 2 | GFoo (s, "bar") ^ -Error: This value escapes its region +Error: This value escapes its region. |}] let f = @@ -2537,7 +2587,7 @@ let f = Line 3, characters 8-9: 3 | GFoo (s, "bar") ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* s' extracted from x as global *) @@ -2570,8 +2620,8 @@ let f (s : string) = Line 4, characters 20-22: 4 | | GFoo (_, s') -> s' ^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] (* and regional gives regional *) @@ -2583,7 +2633,7 @@ let f (local_ x : gfoo) = Line 3, characters 24-26: 3 | | GFoo (_, s') -> ref s' ^^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* Test of array.*) @@ -2598,7 +2648,7 @@ let f (local_ x : string) = ref [: x; "foo" :] Line 1, characters 35-36: 1 | let f (local_ x : string) = ref [: x; "foo" :] ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* constructing local iarray from local elements is fine *) @@ -2622,7 +2672,7 @@ let f (local_ a : string iarray) = Line 3, characters 22-23: 3 | | [: x; _ :] -> ref x ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* a test that was passing type check *) @@ -2634,8 +2684,8 @@ let unsafe_globalize (local_ s : string) : string = Line 3, characters 14-16: 3 | | [:s':] -> s' ^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. |}] let f (local_ a : string iarray) = @@ -2664,7 +2714,7 @@ let f (local_ x : string) = local_ [| x |] Line 1, characters 38-39: 1 | let f (local_ x : string) = local_ [| x |] ^ -Error: This value escapes its region +Error: This value escapes its region. |}] (* constructing local array from global elements is allowed *) @@ -2701,8 +2751,8 @@ end Line 11, characters 13-59: 11 | let f () = fold_until [] ~init:0 ~f:(fun _ _ -> Right ()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This local value escapes its region - Hint: Cannot return local value without an "exclave_" annotation +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. Hint: This is a partial application Adding 1 more argument will make the value non-local |}] @@ -2739,25 +2789,41 @@ Error: Signature mismatch: (* Escaping uncurried functions *) -(* Valid; [local_ int -> int -> int] is [local_ int -> local_ (int -> int)] *) -let f () = ((fun x y -> x + y) : (local_ int -> int -> int));; +(* Valid; [local_ string -> string -> string] is [local_ string -> local_ (string -> string)] *) +let f () = ((fun x y -> "") : (local_ string -> string -> string));; [%%expect{| -val f : unit -> local_ int -> int -> int = +val f : unit -> local_ string -> string -> string = |}];; -(* Illegal: the return mode on (int -> int) is global. *) -let f () = ((fun x y -> x + y) : (local_ int -> (int -> int)));; +(* Illegal: the return mode on (string -> string) is global. *) +let f () = ((fun x y -> "") : (local_ string -> (string -> string)));; [%%expect{| -Line 1, characters 12-30: -1 | let f () = ((fun x y -> x + y) : (local_ int -> (int -> int)));; - ^^^^^^^^^^^^^^^^^^ +Line 1, characters 12-27: +1 | let f () = ((fun x y -> "") : (local_ string -> (string -> string)));; + ^^^^^^^^^^^^^^^ +Error: This function or one of its parameters escape their region + when it is partially applied. +|}];; + +let f () = ((fun x -> function | y -> "") : (local_ string -> (string -> string)));; +[%%expect{| +Line 1, characters 12-41: +1 | let f () = ((fun x -> function | y -> "") : (local_ string -> (string -> string)));; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This function or one of its parameters escape their region when it is partially applied. |}];; (* ok if curried *) -let f () = ((fun x -> (fun y -> x + y) [@extension.curry]) - : (local_ int -> (int -> int)));; +let f () = ((fun x -> (fun y -> "") [@extension.curry]) + : (local_ string -> (string -> string)));; +[%%expect{| +val f : unit -> local_ string -> (string -> string) = +|}];; + +(* mode crossing - the inner closure is [global] despite closing over [local_ +int] *) +let f () = ((fun x y -> x + y) : (local_ int -> (int -> int)));; [%%expect{| val f : unit -> local_ int -> (int -> int) = |}];; @@ -2772,6 +2838,26 @@ Error: This function or one of its parameters escape their region when it is partially applied. |}];; +let f () = local_ ((fun x -> function | 0 -> x | y -> x + y) : (_ -> _));; +[%%expect{| +Line 1, characters 19-60: +1 | let f () = local_ ((fun x -> function | 0 -> x | y -> x + y) : (_ -> _));; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This function or one of its parameters escape their region + when it is partially applied. +|}];; + +(* For nested functions, inner functions are not constrained *) +let f () = ((fun x -> fun y -> "") : (local_ string -> (string -> string)));; +[%%expect{| +val f : unit -> local_ string -> (string -> string) = +|}];; + +let f () = local_ ((fun x -> fun y -> x + y) : (_ -> _));; +[%%expect{| +val f : unit -> local_ (int -> (int -> int)) = +|}];; + (* ok if curried *) let f () = local_ ((fun x -> (fun y -> x + y) [@extension.curry]) : (_ -> _));; [%%expect{| @@ -2794,11 +2880,11 @@ let foo () = let _bar : int -> int -> int = local_ (fun x y -> x + y) in () [%%expect{| -Line 2, characters 33-58: +Line 2, characters 40-58: 2 | let _bar : int -> int -> int = local_ (fun x y -> x + y) in - ^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This expression has type int -> local_ (int -> int) - but an expression was expected of type int -> (int -> int) + ^^^^^^^^^^^^^^^^^^ +Error: This function or one of its parameters escape their region + when it is partially applied. |}];; (* test that [function] checks all its branches either for local_ or the @@ -2825,3 +2911,85 @@ let foo b = val foo : bool -> local_ int option = |}] +type f = local_ local_ string -> string +[%%expect{| +Line 1, characters 16-22: +1 | type f = local_ local_ string -> string + ^^^^^^ +Error: The locality axis has already been specified. +|}] + +let foo () = + let local_ local_ _x = "hello" in + () +[%%expect{| +Line 2, characters 13-19: +2 | let local_ local_ _x = "hello" in + ^^^^^^ +Error: The locality axis has already been specified. +|}] + +let foo (local_ local_ _) = () +[%%expect{| +Line 1, characters 16-22: +1 | let foo (local_ local_ _) = () + ^^^^^^ +Error: The locality axis has already been specified. +|}] + +(* type-directed disambiguation *) + +module M = struct + type t = M_constructor +end + +let foo (local_ _ : M.t) = ();; +let foo_f (local_ _ : M.t -> unit) = ();; +[%%expect{| +module M : sig type t = M_constructor end +val foo : local_ M.t -> unit = +val foo_f : local_ (M.t -> unit) -> unit = +|}] + +let () = foo M_constructor +[%%expect{| +|}] + +let () = foo_f (fun M_constructor -> ()) +[%%expect{| +|}] + +let () = foo (local_ M_constructor) +[%%expect{| +|}] + +let () = foo_f (local_ (fun M_constructor -> ())) +[%%expect{| +|}] + +let _ret () : M.t -> unit = (fun M_constructor -> ()) +[%%expect{| +val _ret : unit -> M.t -> unit = +|}] + +let _ret () : M.t -> unit = local_ (fun M_constructor -> ()) +[%%expect{| +val _ret : unit -> local_ (M.t -> unit) = +|}] + +let _ret () : M.t -> unit = exclave_ (fun M_constructor -> ()) +[%%expect{| +val _ret : unit -> local_ (M.t -> unit) = +|}] + +type r = {global_ x : string; y : string} + +let foo () = + let local_ y = "world" in + let local_ r = {x = "hello"; y} in + (* Only using r.x, which is global. So the whole return is global and OK. *) + {r with y = "foo!" } +[%%expect{| +type r = { global_ x : string; y : string; } +val foo : unit -> r = +|}] diff --git a/testsuite/tests/typing-local/local_gadt.ml b/testsuite/tests/typing-local/local_gadt.ml new file mode 100644 index 00000000000..1a3d7840d8c --- /dev/null +++ b/testsuite/tests/typing-local/local_gadt.ml @@ -0,0 +1,14 @@ +(* TEST *) + +type (_, _) eq = Eq : ('a, 'a) eq + +let[@inline always] cast (type a b) (x : a) (Eq : (a, b) eq) : b = x + +let test (f : local_ 'a -> local_ 'b) (eq : (local_ 'a -> local_ 'b, 'a -> 'b) eq) (x : 'a) : 'b = + (cast f eq) x + +type 'a box = Box of 'a + +let localf : (local_ 'a -> local_ 'a box) = fun x -> exclave_ (local_ (Box x)) + +let g eq x = test localf eq x \ No newline at end of file diff --git a/testsuite/tests/typing-local/local_gadt.reference b/testsuite/tests/typing-local/local_gadt.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testsuite/tests/typing-local/local_optparam.ml b/testsuite/tests/typing-local/local_optparam.ml new file mode 100644 index 00000000000..79b892bac89 --- /dev/null +++ b/testsuite/tests/typing-local/local_optparam.ml @@ -0,0 +1,6 @@ +(* TEST *) + +let foo (local_ f) l = l +let go a b g ?(x = foo (fun y -> a, y) b) () = + let x = foo (fun y -> a, y) x in + g x \ No newline at end of file diff --git a/testsuite/tests/typing-local/local_optparam.reference b/testsuite/tests/typing-local/local_optparam.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testsuite/tests/typing-local/localgcbug.ml b/testsuite/tests/typing-local/localgcbug.ml index 0c5ba998734..19efbc9e811 100644 --- a/testsuite/tests/typing-local/localgcbug.ml +++ b/testsuite/tests/typing-local/localgcbug.ml @@ -1,5 +1,6 @@ (* TEST - * native *) + native; +*) type n = Z | S of n diff --git a/testsuite/tests/typing-local/loop_regions.heap.reference b/testsuite/tests/typing-local/loop_regions.heap.reference index 7769c32e8b9..50aac3b7f2e 100644 --- a/testsuite/tests/typing-local/loop_regions.heap.reference +++ b/testsuite/tests/typing-local/loop_regions.heap.reference @@ -4,3 +4,5 @@ nonlocal while body: [0; 0; 0] local while cond: [0; 0; 0] nonlocal while cond: [0; 0; 0] + local func: [0; 0; 0] + nonlocal func: [0; 0; 0] diff --git a/testsuite/tests/typing-local/loop_regions.ml b/testsuite/tests/typing-local/loop_regions.ml index 7ba3e12af8d..bd333ce8d4d 100644 --- a/testsuite/tests/typing-local/loop_regions.ml +++ b/testsuite/tests/typing-local/loop_regions.ml @@ -1,11 +1,14 @@ (* TEST - * stack-allocation - ** native - reference = "${test_source_directory}/loop_regions.stack.reference" - * no-stack-allocation - ** native - reference = "${test_source_directory}/loop_regions.heap.reference" - *) + { + stack-allocation; + reference = "${test_source_directory}/loop_regions.stack.reference"; + native; + }{ + no-stack-allocation; + reference = "${test_source_directory}/loop_regions.heap.reference"; + native; + } +*) external local_stack_offset : unit -> int = "caml_local_stack_offset" let local_stack_offset () = local_stack_offset () / (Sys.word_size / 8) diff --git a/testsuite/tests/typing-local/match_with_exception.ml b/testsuite/tests/typing-local/match_with_exception.ml index d257e42cc44..1cb8b08a6ee 100644 --- a/testsuite/tests/typing-local/match_with_exception.ml +++ b/testsuite/tests/typing-local/match_with_exception.ml @@ -1,5 +1,6 @@ (* TEST - * native *) + native; +*) let[@inline never] f x = local_ (x, (0, 0)) diff --git a/testsuite/tests/typing-local/nosyntax.ml b/testsuite/tests/typing-local/nosyntax.ml deleted file mode 100644 index 1629fbe8178..00000000000 --- a/testsuite/tests/typing-local/nosyntax.ml +++ /dev/null @@ -1,99 +0,0 @@ -(* TEST - flags += "-disable-all-extensions" - * expect *) - -type fn = string -> int -type lfn = (string[@ocaml.local]) -> int -type lfn' = local_ string -> int -[%%expect{| -type fn = string -> int -type lfn = (string [@local]) -> int -Line 3, characters 19-25: -3 | type lfn' = local_ string -> int - ^^^^^^ -Error: The local extension is disabled - To enable it, pass the '-extension local' flag -|}] - -let cast (x : fn) = (x : lfn) -[%%expect{| -Line 1, characters 21-22: -1 | let cast (x : fn) = (x : lfn) - ^ -Error: This expression has type fn = string -> int - but an expression was expected of type (string [@local]) -> int -|}] - -let local_ref (f : lfn -> unit) = - f (fun s -> let _ = [|s;s;s|] in 1) - -[%%expect{| -Line 2, characters 24-25: -2 | f (fun s -> let _ = [|s;s;s|] in 1) - ^ -Error: This value escapes its region -|}] - -type foo = { - x : string -} -[%%expect{| -type foo = { x : string; } -|}] - -type gfoo = { - x : string [@ocaml.global] -} -[%%expect{| -type gfoo = { x : (string [@global]); } -|}] -type gfoo' = { - global_ x : string -} -[%%expect{| -Line 2, characters 2-21: -2 | global_ x : string - ^^^^^^^^^^^^^^^^^^^ -Error: The local extension is disabled - To enable it, pass the '-extension local' flag -|}] - -let cast ((r : foo)[@ocaml.local]) : gfoo = - match r with - | {x} -> {x} -[%%expect{| -Line 3, characters 12-13: -3 | | {x} -> {x} - ^ -Error: This value escapes its region -|}] - -type foo = Foo of string -[%%expect{| -type foo = Foo of string -|}] -type gfoo = GFoo of (string [@ocaml.global]) -[%%expect{| -type gfoo = GFoo of (string [@global]) -|}] -type gfoo' = Gfoo of global_ string -[%%expect{| -Line 1, characters 29-35: -1 | type gfoo' = Gfoo of global_ string - ^^^^^^ -Error: The local extension is disabled - To enable it, pass the '-extension local' flag -|}] - - -let cast ((r : foo)[@ocaml.local]) : gfoo = - match r with - | Foo x -> GFoo x - -[%%expect{| -Line 3, characters 18-19: -3 | | Foo x -> GFoo x - ^ -Error: This value escapes its region -|}] - diff --git a/testsuite/tests/typing-local/partial.ml b/testsuite/tests/typing-local/partial.ml index 8b7f371cda9..b73fd184820 100644 --- a/testsuite/tests/typing-local/partial.ml +++ b/testsuite/tests/typing-local/partial.ml @@ -1,5 +1,6 @@ (* TEST - flags += " -g" *) + flags += " -g"; +*) let f1 ~a ~b ~c ~d ~e = a + b + c + d + e let f2 ~b ~c ~e = f1 ~b ~c ~e diff --git a/testsuite/tests/typing-local/partial_app_bug.ml b/testsuite/tests/typing-local/partial_app_bug.ml new file mode 100644 index 00000000000..b508e940e56 --- /dev/null +++ b/testsuite/tests/typing-local/partial_app_bug.ml @@ -0,0 +1,12 @@ +(* TEST *) + +type 'a box = Box of 'a +module X : sig + val f : int -> string -> local_ int box +end = struct + let[@inline never] f x y = exclave_ (local_ (Box x)) +end + +let[@inline always] h x = x + +let g a = (h X.f) a \ No newline at end of file diff --git a/testsuite/tests/typing-local/partial_app_bug.reference b/testsuite/tests/typing-local/partial_app_bug.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testsuite/tests/typing-local/partial_app_dead_gadt_case.ml b/testsuite/tests/typing-local/partial_app_dead_gadt_case.ml new file mode 100644 index 00000000000..a00c18c59d1 --- /dev/null +++ b/testsuite/tests/typing-local/partial_app_dead_gadt_case.ml @@ -0,0 +1,29 @@ +(* TEST + { + stack-allocation; + ocamlopt_flags = "-Oclassic"; + native; + }{ + stack-allocation; + ocamlopt_flags = "-O3"; + native; + } +*) + +type (_,_) eq = Refl : ('a, 'a) eq + +let apply (type a) (equ : (a, unit -> unit) eq option) (f : a) = + match equ with + | None -> () + | Some Refl -> f () + +let fn (local_ x) (local_ y) = () + +let bad p = apply p fn + +(* More minimal example: *) + +let cast (type a b) (Refl : (a, b) eq) (f : a) : b = f + +let fn (local_ x) (local_ y) = () +let bad2 p = cast p fn () diff --git a/testsuite/tests/typing-local/partial_coerce.ml b/testsuite/tests/typing-local/partial_coerce.ml new file mode 100644 index 00000000000..ad3ea78c882 --- /dev/null +++ b/testsuite/tests/typing-local/partial_coerce.ml @@ -0,0 +1,20 @@ +(* TEST *) + +type 'a box = Box of 'a + +let[@inline never] f x y z = + match x, y, z with Box x, Box y, Box z -> x + y + z + +type t = int box -> int box -> int +let[@inline always] h x = x +let g = (h f :> int box -> local_ t) + +let[@inline never] go a b c = + let local_ g1 = (g a) in + let g2 = (g1 b) in + g2 c + +let[@inline never] test () = + Format.eprintf "%d@." (go (Box 1) (Box 2) (Box 3)) + +let () = test () \ No newline at end of file diff --git a/testsuite/tests/typing-local/partial_coerce.reference b/testsuite/tests/typing-local/partial_coerce.reference new file mode 100644 index 00000000000..1e8b3149621 --- /dev/null +++ b/testsuite/tests/typing-local/partial_coerce.reference @@ -0,0 +1 @@ +6 diff --git a/testsuite/tests/typing-local/pr902.ml b/testsuite/tests/typing-local/pr902.ml index 8c8e9bcd7f8..6903923c418 100644 --- a/testsuite/tests/typing-local/pr902.ml +++ b/testsuite/tests/typing-local/pr902.ml @@ -1,6 +1,6 @@ (* TEST - * stack-allocation - ** native + stack-allocation; + native; *) (* PR902 (return mode on second application expression in a split diff --git a/testsuite/tests/typing-local/regions.ml b/testsuite/tests/typing-local/regions.ml index d5eabc7c7cd..8e707711da3 100644 --- a/testsuite/tests/typing-local/regions.ml +++ b/testsuite/tests/typing-local/regions.ml @@ -1,7 +1,9 @@ (* TEST - modules = "cstubs.c" - include ocamlcommon - * native *) + modules = "cstubs.c"; + include ocamlcommon; + stack-allocation; + native; +*) external local_stack_offset : unit -> int = "caml_local_stack_offset" external opaque_identity : ('a[@local_opt]) -> ('a[@local_opt]) = "%opaque" diff --git a/testsuite/tests/typing-local/regression_class_type.ml b/testsuite/tests/typing-local/regression_class_type.ml index d0c6803e294..52529c2dbf9 100644 --- a/testsuite/tests/typing-local/regression_class_type.ml +++ b/testsuite/tests/typing-local/regression_class_type.ml @@ -1,11 +1,11 @@ (* TEST -readonly_files = "regression_class_dep.ml" -* setup-ocamlc.opt-build-env -** ocamlc.opt -module = "regression_class_dep.ml" -*** ocamlc.opt -module = "" -flags = "-c" + readonly_files = "regression_class_dep.ml"; + setup-ocamlc.opt-build-env; + module = "regression_class_dep.ml"; + ocamlc.opt; + module = ""; + flags = "-c"; + ocamlc.opt; *) (* https://github.com/ocaml-flambda/ocaml-jst/issues/65 *) diff --git a/testsuite/tests/typing-local/regression_cmm_unboxing.heap.reference b/testsuite/tests/typing-local/regression_cmm_unboxing.heap.reference new file mode 100644 index 00000000000..2822dd444ac --- /dev/null +++ b/testsuite/tests/typing-local/regression_cmm_unboxing.heap.reference @@ -0,0 +1,3 @@ +44 3 +2 words +2 words diff --git a/testsuite/tests/typing-local/regression_cmm_unboxing.ml b/testsuite/tests/typing-local/regression_cmm_unboxing.ml index 63d1d15eb8a..741b0bd5d3a 100644 --- a/testsuite/tests/typing-local/regression_cmm_unboxing.ml +++ b/testsuite/tests/typing-local/regression_cmm_unboxing.ml @@ -1,5 +1,13 @@ (* TEST - * native + { + stack-allocation; + reference = "${test_source_directory}/regression_cmm_unboxing.stack.reference"; + native; + }{ + no-stack-allocation; + reference = "${test_source_directory}/regression_cmm_unboxing.heap.reference"; + native; + } *) (* Regression test for a bad interaction between Cmm unboxing diff --git a/testsuite/tests/typing-local/regression_cmm_unboxing.reference b/testsuite/tests/typing-local/regression_cmm_unboxing.stack.reference similarity index 100% rename from testsuite/tests/typing-local/regression_cmm_unboxing.reference rename to testsuite/tests/typing-local/regression_cmm_unboxing.stack.reference diff --git a/testsuite/tests/typing-local/tailcalls.ml b/testsuite/tests/typing-local/tailcalls.ml index 1c7ce1c5447..ffe22740375 100644 --- a/testsuite/tests/typing-local/tailcalls.ml +++ b/testsuite/tests/typing-local/tailcalls.ml @@ -1,7 +1,7 @@ (* TEST - * stack-allocation - ** native - *) + stack-allocation; + native; +*) open Printexc @@ -39,6 +39,77 @@ let foo () = let stack = get_backtrace () in bar stack +(* Test the local functions optimisation *) + +let[@inline never] ignore_local (local_ x) = () + +let rec foo n p a b stack = + if n <= 0 then () else + let stack' = get_backtrace () in + begin match stack with + | None -> () + | Some stack -> assert (equal_backtraces stack stack') + end; + let bar x y = + foo (n - 1) p x y (Some stack') + in + ignore_local (Some a); + if p then + bar a b + else + bar b a + +let () = foo 10 true 1 2 None + +let rec foo2 n p a b stack = + if n <= 0 then () else + let stack' = get_backtrace () in + begin match stack with + | None -> () + | Some stack -> assert (equal_backtraces stack stack') + end; + let bar x y = + foo2 (n - 1) p x y (Some stack') + in + let bar2 p x y = + if p then + bar y x + else + bar x y + in + ignore_local (Some a); + if p then + bar2 p a b + else + bar2 p b a + +let () = foo2 10 true 1 2 None + +let rec foo3 n p a b stack = + if n <= 0 then () else + let stack' = get_backtrace () in + begin match stack with + | None -> () + | Some stack -> assert (equal_backtraces stack stack') + end; + let bar x y = + foo3 (n - 1) p x y (Some stack') + in + let bar2 p x y = + ignore_local (Some a); + if p then + bar y x + else + bar x y + in + ignore_local (Some a); + if p then + bar2 p a b + else + bar2 p b a + +let () = foo3 10 true 1 2 None + external local_stack_offset : unit -> int = "caml_local_stack_offset" let[@inline never][@specialise never][@local never] allocate () = diff --git a/testsuite/tests/typing-local/iarray.heap.reference b/testsuite/tests/typing-local/test_iarray.byte.reference similarity index 100% rename from testsuite/tests/typing-local/iarray.heap.reference rename to testsuite/tests/typing-local/test_iarray.byte.reference diff --git a/testsuite/tests/typing-local/test_iarray.heap.reference b/testsuite/tests/typing-local/test_iarray.heap.reference new file mode 100644 index 00000000000..4987b8e6a3e --- /dev/null +++ b/testsuite/tests/typing-local/test_iarray.heap.reference @@ -0,0 +1,14 @@ + init_local: Allocation + append_local: Allocation + concat_local: Allocation + sub_local: Allocation + to_list_local: Allocation + of_list_local: Allocation + map_local: Allocation + mapi_local: Allocation + fold_left_local: Allocation + fold_left_map_local: Allocation + fold_right_local: Allocation + map2_local: Allocation + split_local: Allocation + combine_local: Allocation diff --git a/testsuite/tests/typing-local/iarray.ml b/testsuite/tests/typing-local/test_iarray.ml similarity index 90% rename from testsuite/tests/typing-local/iarray.ml rename to testsuite/tests/typing-local/test_iarray.ml index ee4e14fffa4..e0a4b1085ea 100644 --- a/testsuite/tests/typing-local/iarray.ml +++ b/testsuite/tests/typing-local/test_iarray.ml @@ -1,13 +1,18 @@ (* TEST - * bytecode - reference = "${test_source_directory}/iarray.heap.reference" - * stack-allocation - ** native - reference = "${test_source_directory}/iarray.stack.reference" - * no-stack-allocation - ** native - reference = "${test_source_directory}/iarray.heap.reference" - *) + include stdlib_stable; + { + reference = "${test_source_directory}/test_iarray.byte.reference"; + bytecode; + }{ + stack-allocation; + reference = "${test_source_directory}/test_iarray.stack.reference"; + native; + }{ + no-stack-allocation; + reference = "${test_source_directory}/test_iarray.heap.reference"; + native; + } +*) (* Testing all the [iarray] functions that allocate [iarray]s locally (not including multiple variants of the same function) for: @@ -17,7 +22,7 @@ 2. Correctness: They actually create arrays on the stack (by testing that no GCed allocation happens). *) -module Iarray = Stdlib__Iarray +module Iarray = Stdlib_stable.Iarray external opaque_local : local_ 'a -> local_ 'a = "%opaque" diff --git a/testsuite/tests/typing-local/iarray.stack.reference b/testsuite/tests/typing-local/test_iarray.stack.reference similarity index 100% rename from testsuite/tests/typing-local/iarray.stack.reference rename to testsuite/tests/typing-local/test_iarray.stack.reference diff --git a/testsuite/tests/typing-local/tmc.ml b/testsuite/tests/typing-local/tmc.ml index fc1cb2bbe2d..945ff9ec0f7 100644 --- a/testsuite/tests/typing-local/tmc.ml +++ b/testsuite/tests/typing-local/tmc.ml @@ -1,9 +1,9 @@ (* TEST - * stack-allocation - ** setup-ocamlopt.opt-build-env - *** ocamlopt.opt - ocamlopt_opt_exit_status = "2" - **** check-ocamlopt.opt-output + stack-allocation; + setup-ocamlopt.opt-build-env; + ocamlopt_opt_exit_status = "2"; + ocamlopt.opt; + check-ocamlopt.opt-output; *) (* Cannot use TMC on local-returning functions *) diff --git a/testsuite/tests/typing-misc-bugs/core_array_reduced_ok.ml b/testsuite/tests/typing-misc-bugs/core_array_reduced_ok.ml index 38b630185a7..ca36163faa0 100644 --- a/testsuite/tests/typing-misc-bugs/core_array_reduced_ok.ml +++ b/testsuite/tests/typing-misc-bugs/core_array_reduced_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) type sexp = A of string | L of sexp list diff --git a/testsuite/tests/typing-misc-bugs/gadt_declaration_check.ml b/testsuite/tests/typing-misc-bugs/gadt_declaration_check.ml index 432a502ff27..dd16d40c762 100644 --- a/testsuite/tests/typing-misc-bugs/gadt_declaration_check.ml +++ b/testsuite/tests/typing-misc-bugs/gadt_declaration_check.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type foo = Foo;; [%%expect{| diff --git a/testsuite/tests/typing-misc-bugs/pr6303_bad.ml b/testsuite/tests/typing-misc-bugs/pr6303_bad.ml index e2980e0f031..8a1706c1fc1 100644 --- a/testsuite/tests/typing-misc-bugs/pr6303_bad.ml +++ b/testsuite/tests/typing-misc-bugs/pr6303_bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) type 'a foo = {x: 'a; y: int} let r = {{x = 0; y = 0} with x = 0} let r' : string foo = r + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-misc-bugs/pr6946_bad.ml b/testsuite/tests/typing-misc-bugs/pr6946_bad.ml index 5142becdf93..aae63d899c3 100644 --- a/testsuite/tests/typing-misc-bugs/pr6946_bad.ml +++ b/testsuite/tests/typing-misc-bugs/pr6946_bad.ml @@ -1,10 +1,18 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) external foo : int = "%ignore";; let _ = foo ();; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-misc/apply_non_function.ml b/testsuite/tests/typing-misc/apply_non_function.ml index 8ac766a85f9..7e768c6473c 100644 --- a/testsuite/tests/typing-misc/apply_non_function.ml +++ b/testsuite/tests/typing-misc/apply_non_function.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let print_lines = List.iter print_endline diff --git a/testsuite/tests/typing-misc/build_as_type.ml b/testsuite/tests/typing-misc/build_as_type.ml index 51aa4e23386..b1b8de78124 100644 --- a/testsuite/tests/typing-misc/build_as_type.ml +++ b/testsuite/tests/typing-misc/build_as_type.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f = function diff --git a/testsuite/tests/typing-misc/constraints.ml b/testsuite/tests/typing-misc/constraints.ml index 586516592c1..f90c600b644 100644 --- a/testsuite/tests/typing-misc/constraints.ml +++ b/testsuite/tests/typing-misc/constraints.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a t = [`A of 'a t t] as 'a;; (* fails *) diff --git a/testsuite/tests/typing-misc/deep.ml b/testsuite/tests/typing-misc/deep.ml index 01ade06106a..e8d207d55fb 100644 --- a/testsuite/tests/typing-misc/deep.ml +++ b/testsuite/tests/typing-misc/deep.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M : sig diff --git a/testsuite/tests/typing-misc/disambiguate_principality.ml b/testsuite/tests/typing-misc/disambiguate_principality.ml index d5529524fe8..cec00b5c2a4 100644 --- a/testsuite/tests/typing-misc/disambiguate_principality.ml +++ b/testsuite/tests/typing-misc/disambiguate_principality.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (*** Record ***) diff --git a/testsuite/tests/typing-misc/distant_errors.ml b/testsuite/tests/typing-misc/distant_errors.ml index f5f2ffd0fbd..ef28cb8dfb6 100644 --- a/testsuite/tests/typing-misc/distant_errors.ml +++ b/testsuite/tests/typing-misc/distant_errors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** The aim of this file is to keep track of programs that are "far" from being well-typed *) diff --git a/testsuite/tests/typing-misc/empty_variant.ml b/testsuite/tests/typing-misc/empty_variant.ml index 7aaa1afab47..6b2f7b82050 100644 --- a/testsuite/tests/typing-misc/empty_variant.ml +++ b/testsuite/tests/typing-misc/empty_variant.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* empty variant *) diff --git a/testsuite/tests/typing-misc/enrich_typedecl.ml b/testsuite/tests/typing-misc/enrich_typedecl.ml index ac699720d92..34e659cd91e 100644 --- a/testsuite/tests/typing-misc/enrich_typedecl.ml +++ b/testsuite/tests/typing-misc/enrich_typedecl.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module rec A : sig diff --git a/testsuite/tests/typing-misc/exotic_unifications.ml b/testsuite/tests/typing-misc/exotic_unifications.ml index 2e3e69692fc..56480999be1 100644 --- a/testsuite/tests/typing-misc/exotic_unifications.ml +++ b/testsuite/tests/typing-misc/exotic_unifications.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class virtual t = object method virtual x: float end diff --git a/testsuite/tests/typing-misc/external_arity.ml b/testsuite/tests/typing-misc/external_arity.ml index bad0fb1729b..487fa835633 100644 --- a/testsuite/tests/typing-misc/external_arity.ml +++ b/testsuite/tests/typing-misc/external_arity.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f a b c = a + b + c diff --git a/testsuite/tests/typing-misc/filter_params.ml b/testsuite/tests/typing-misc/filter_params.ml index 879693680bc..7035dd74e05 100644 --- a/testsuite/tests/typing-misc/filter_params.ml +++ b/testsuite/tests/typing-misc/filter_params.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ('a, 'b) t constraint 'a = 'b diff --git a/testsuite/tests/typing-misc/gpr2277.ml b/testsuite/tests/typing-misc/gpr2277.ml index eabd3cc0ca6..3d2b8b8d270 100644 --- a/testsuite/tests/typing-misc/gpr2277.ml +++ b/testsuite/tests/typing-misc/gpr2277.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f (type t) (x : t) = x diff --git a/testsuite/tests/typing-misc/includeclass_errors.ml b/testsuite/tests/typing-misc/includeclass_errors.ml index 033669e2a53..ddc5d165236 100644 --- a/testsuite/tests/typing-misc/includeclass_errors.ml +++ b/testsuite/tests/typing-misc/includeclass_errors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class type foo_t = diff --git a/testsuite/tests/typing-misc/injectivity.ml b/testsuite/tests/typing-misc/injectivity.ml index e6aedfa63d6..42fc65d61a7 100644 --- a/testsuite/tests/typing-misc/injectivity.ml +++ b/testsuite/tests/typing-misc/injectivity.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Syntax *) diff --git a/testsuite/tests/typing-misc/inside_out.ml b/testsuite/tests/typing-misc/inside_out.ml index 077af370503..541586e4e60 100644 --- a/testsuite/tests/typing-misc/inside_out.ml +++ b/testsuite/tests/typing-misc/inside_out.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ('a, 'b) eq = Refl : ('a, 'a) eq diff --git a/testsuite/tests/typing-misc/is_expansive.ml b/testsuite/tests/typing-misc/is_expansive.ml index 3bab4f93781..9a4d66da5e8 100644 --- a/testsuite/tests/typing-misc/is_expansive.ml +++ b/testsuite/tests/typing-misc/is_expansive.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) match [] with x -> (fun x -> x);; [%%expect{| diff --git a/testsuite/tests/typing-misc/labels.ml b/testsuite/tests/typing-misc/labels.ml index 7cb3a7156f7..987ccdc2e69 100644 --- a/testsuite/tests/typing-misc/labels.ml +++ b/testsuite/tests/typing-misc/labels.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#5835 *) @@ -106,7 +106,7 @@ val f : (?x:int -> unit -> int) -> int = Line 1, characters 46-47: 1 | let f g = ignore (g : ?x:int -> unit -> int); g ();; ^ -Warning 19 [non-principal-labels]: eliminated optional argument without principality. +Warning 19 [non-principal-labels]: eliminated omittable argument without principality. val f : (?x:int -> unit -> int) -> int = |}];; diff --git a/testsuite/tests/typing-misc/normalize_type.ml b/testsuite/tests/typing-misc/normalize_type.ml index 0b21b183038..6812764e5d6 100644 --- a/testsuite/tests/typing-misc/normalize_type.ml +++ b/testsuite/tests/typing-misc/normalize_type.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* #8907 *) diff --git a/testsuite/tests/typing-misc/occur_check.ml b/testsuite/tests/typing-misc/occur_check.ml index 9d681c88a91..7a5d9c6d938 100644 --- a/testsuite/tests/typing-misc/occur_check.ml +++ b/testsuite/tests/typing-misc/occur_check.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#5907 *) diff --git a/testsuite/tests/typing-misc/optbinders.ml b/testsuite/tests/typing-misc/optbinders.ml index ab1390675dc..01af6bbf0bb 100644 --- a/testsuite/tests/typing-misc/optbinders.ml +++ b/testsuite/tests/typing-misc/optbinders.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Optional binders can be used in value declarations, diff --git a/testsuite/tests/typing-misc/pat_type_sharing.ml b/testsuite/tests/typing-misc/pat_type_sharing.ml index 1cbf69641b9..4fd5dfa0954 100644 --- a/testsuite/tests/typing-misc/pat_type_sharing.ml +++ b/testsuite/tests/typing-misc/pat_type_sharing.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a r = { a : 'a; b : 'a; } type 'a ty = Int : int ty | Float : float ty;; diff --git a/testsuite/tests/typing-misc/pattern_open.ml b/testsuite/tests/typing-misc/pattern_open.ml index 16572b6eeaf..9fe25d54529 100644 --- a/testsuite/tests/typing-misc/pattern_open.ml +++ b/testsuite/tests/typing-misc/pattern_open.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let pp fmt = Format.printf (fmt^^"@.") diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml index 714bcf22c44..aaf281ec850 100644 --- a/testsuite/tests/typing-misc/polyvars.ml +++ b/testsuite/tests/typing-misc/polyvars.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ab = [ `A | `B ];; diff --git a/testsuite/tests/typing-misc/pr6416.ml b/testsuite/tests/typing-misc/pr6416.ml index 0bfe20a11c8..dc49fa16304 100644 --- a/testsuite/tests/typing-misc/pr6416.ml +++ b/testsuite/tests/typing-misc/pr6416.ml @@ -1,6 +1,6 @@ (* TEST - flags="-no-alias-deps -w +40" - * expect + flags = "-no-alias-deps -w +40"; + expect; *) module M = struct type t = A @@ -23,13 +23,13 @@ Error: Signature mismatch: is not included in sig val f : t -> unit end Values do not match: - val f : t -> unit + val f : t/1 -> unit is not included in val f : t/2 -> unit - The type t -> unit is not compatible with the type t/2 -> unit - Type t is not compatible with type t/2 + The type t/1 -> unit is not compatible with the type t/2 -> unit + Type t/1 is not compatible with type t/2 Line 6, characters 4-14: - Definition of type t + Definition of type t/1 Line 2, characters 2-12: Definition of type t/2 |}] @@ -49,16 +49,16 @@ Error: Signature mismatch: is not included in sig type u = A of t end Type declarations do not match: - type u = A of t + type u = A of t/1 is not included in type u = A of t/2 Constructors do not match: - A of t + A of t/1 is not the same as: - A of t - The type t is not equal to the type t/2 + A of t/2 + The type t/1 is not equal to the type t/2 Line 4, characters 9-19: - Definition of type t + Definition of type t/1 Line 2, characters 2-11: Definition of type t/2 |}] @@ -85,15 +85,15 @@ Error: Signature mismatch: sig module A : functor (X : s) -> sig end end In module A: Modules do not match: - functor (X : s) -> ... + functor (X : s/1) -> ... is not included in functor (X : s/2) -> ... Module types do not match: - s + s/1 does not include s/2 Line 5, characters 6-19: - Definition of module type s + Definition of module type s/1 Line 2, characters 2-15: Definition of module type s/2 |}] @@ -118,16 +118,16 @@ Error: Signature mismatch: is not included in sig type t = A of T.t end Type declarations do not match: - type t = A of T.t + type t = A of T/1.t is not included in type t = A of T/2.t Constructors do not match: - A of T.t + A of T/1.t is not the same as: - A of T.t - The type T.t is not equal to the type T/2.t + A of T/2.t + The type T/1.t is not equal to the type T/2.t Line 5, characters 6-34: - Definition of module T + Definition of module T/1 Line 2, characters 2-30: Definition of module T/2 |}] @@ -145,22 +145,22 @@ Line 5, characters 2-62: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Signature mismatch: Modules do not match: - sig module type s type t = B val f : (module s) -> t/2 -> t end + sig module type s type t = B val f : (module s) -> t/2 -> t/1 end is not included in sig val f : (module s) -> t -> t end Values do not match: - val f : (module s) -> t/2 -> t + val f : (module s/1) -> t/2 -> t/1 is not included in val f : (module s/2) -> t/2 -> t/2 - The type (module s) -> t/2 -> t is not compatible with the type + The type (module s/1) -> t/2 -> t/1 is not compatible with the type (module s/2) -> t/2 -> t/2 - Type (module s) is not compatible with type (module s/2) + Type (module s/1) is not compatible with type (module s/2) Line 5, characters 23-33: - Definition of type t + Definition of type t/1 Line 3, characters 2-12: Definition of type t/2 Line 5, characters 9-22: - Definition of module type s + Definition of module type s/1 Line 2, characters 2-15: Definition of module type s/2 |}] @@ -178,18 +178,18 @@ Line 5, characters 5-41: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Signature mismatch: Modules do not match: - sig type a = B val f : a/2 -> 'a -> a end + sig type a = B val f : a/2 -> 'a -> a/1 end is not included in sig val f : a -> (module a) -> a end Values do not match: - val f : a/2 -> 'a -> a + val f : a/2 -> 'a -> a/1 is not included in val f : a/2 -> (module a) -> a/2 - The type a/2 -> (module a) -> a is not compatible with the type + The type a/2 -> (module a) -> a/1 is not compatible with the type a/2 -> (module a) -> a/2 - Type a is not compatible with type a/2 + Type a/1 is not compatible with type a/2 Line 5, characters 12-22: - Definition of type a + Definition of type a/1 Line 3, characters 2-12: Definition of type a/2 |}] @@ -222,7 +222,7 @@ Error: Signature mismatch: The public method c cannot be hidden The first class type has no method m Line 5, characters 4-74: - Definition of class type a + Definition of class type a/1 Line 2, characters 2-36: Definition of class type a/2 |}] @@ -248,12 +248,12 @@ Error: Signature mismatch: is not included in sig class type b = a end Class type declarations do not match: - class type b = a + class type b = a/1 does not match class type b = a/2 The first class type has no method m Line 5, characters 4-29: - Definition of class type a + Definition of class type a/1 Line 2, characters 2-42: Definition of class type a/2 |}] @@ -315,11 +315,11 @@ Error: Signature mismatch: Class type declarations do not match: class type c = object method m : t/2 end does not match - class type c = object method m : t end - The method m has type t/2 but is expected to have type t - Type t/2 is not equal to type t = K.t + class type c = object method m : t/1 end + The method m has type t/2 but is expected to have type t/1 + Type t/2 is not equal to type t/1 = K.t Line 12, characters 4-10: - Definition of type t + Definition of type t/1 Line 9, characters 2-8: Definition of type t/2 |}] @@ -338,12 +338,12 @@ Error: Signature mismatch: is not included in sig type t type a = M.t end Type declarations do not match: - type a = M.t + type a = M/1.t is not included in type a = M/2.t - The type M.t = M/2.M.t is not equal to the type M/2.t + The type M/1.t = M/2.M.t is not equal to the type M/2.t Line 2, characters 14-42: - Definition of module M + Definition of module M/1 File "_none_", line 1: Definition of module M/2 |}] @@ -368,23 +368,23 @@ Lines 5-7, characters 44-3: 7 | end.. Error: Signature mismatch: Modules do not match: - sig val f : t/4 -> t/3 -> t/2 -> t end + sig val f : t/2 -> t/3 -> t/4 -> t/1 end is not included in sig val f : t -> t -> t -> t end Values do not match: - val f : t/4 -> t/3 -> t/2 -> t + val f : t/2 -> t/3 -> t/4 -> t/1 is not included in - val f : t -> t -> t -> t - The type t/4 -> t/3 -> t/2 -> t is not compatible with the type - t -> t -> t -> t - Type t/4 is not compatible with type t + val f : t/1 -> t/1 -> t/1 -> t/1 + The type t/2 -> t/3 -> t/4 -> t/1 is not compatible with the type + t/1 -> t/1 -> t/1 -> t/1 + Type t/2 is not compatible with type t/1 Line 4, characters 0-10: - Definition of type t - Line 3, characters 0-10: + Definition of type t/1 + Line 1, characters 0-10: Definition of type t/2 Line 2, characters 0-10: Definition of type t/3 - Line 1, characters 0-10: + Line 3, characters 0-10: Definition of type t/4 |}] diff --git a/testsuite/tests/typing-misc/pr6634.ml b/testsuite/tests/typing-misc/pr6634.ml index e96126cfcb3..5337db72362 100644 --- a/testsuite/tests/typing-misc/pr6634.ml +++ b/testsuite/tests/typing-misc/pr6634.ml @@ -1,6 +1,6 @@ (* TEST - * expect - *) + expect; +*) type t = int module M : sig type t end with type t = [`T of t] = @@ -18,16 +18,16 @@ Error: Signature mismatch: Modules do not match: sig type t = [ `T of t ] end is not included in - sig type t = [ `T of t/2 ] end + sig type t = [ `T of t ] end Type declarations do not match: - type t = [ `T of t ] + type t = [ `T of t/2 ] is not included in - type t = [ `T of t/3 ] - The type [ `T of t ] is not equal to the type [ `T of t/2 ] - Type t = [ `T of t ] is not equal to type t/2 = int + type t = [ `T of t/1 ] + The type [ `T of t/1 ] is not equal to the type [ `T of t/2 ] + Type t/1 = [ `T of t/1 ] is not equal to type t/2 = int Types for tag `T are incompatible Line 4, characters 2-20: - Definition of type t + Definition of type t/1 Line 1, characters 0-12: Definition of type t/2 |}] diff --git a/testsuite/tests/typing-misc/pr6939-flat-float-array.ml b/testsuite/tests/typing-misc/pr6939-flat-float-array.ml index 6c253460063..91ad7317051 100644 --- a/testsuite/tests/typing-misc/pr6939-flat-float-array.ml +++ b/testsuite/tests/typing-misc/pr6939-flat-float-array.ml @@ -1,6 +1,6 @@ (* TEST - * flat-float-array - ** expect + flat-float-array; + expect; *) let rec x = [| x |]; 1.;; diff --git a/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml b/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml index c511bc625aa..a3d139ac393 100644 --- a/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml +++ b/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml @@ -1,6 +1,6 @@ (* TEST - * no-flat-float-array - ** expect + no-flat-float-array; + expect; *) let rec x = [| x |]; 1.;; diff --git a/testsuite/tests/typing-misc/pr7103.ml b/testsuite/tests/typing-misc/pr7103.ml index 8156462392f..ddb3b61ca75 100644 --- a/testsuite/tests/typing-misc/pr7103.ml +++ b/testsuite/tests/typing-misc/pr7103.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a t diff --git a/testsuite/tests/typing-misc/pr7228.ml b/testsuite/tests/typing-misc/pr7228.ml index 1e98cca59de..480fa549afd 100644 --- a/testsuite/tests/typing-misc/pr7228.ml +++ b/testsuite/tests/typing-misc/pr7228.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = A of {mutable x: int};; diff --git a/testsuite/tests/typing-misc/pr7668_bad.ml b/testsuite/tests/typing-misc/pr7668_bad.ml index e7134886960..e9fe766d53b 100644 --- a/testsuite/tests/typing-misc/pr7668_bad.ml +++ b/testsuite/tests/typing-misc/pr7668_bad.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let partition_map f xs = diff --git a/testsuite/tests/typing-misc/pr7712.ml b/testsuite/tests/typing-misc/pr7712.ml index 09ffb4d2972..b7ba586bef8 100644 --- a/testsuite/tests/typing-misc/pr7712.ml +++ b/testsuite/tests/typing-misc/pr7712.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a or_error = string diff --git a/testsuite/tests/typing-misc/pr7937.ml b/testsuite/tests/typing-misc/pr7937.ml index af812700fc7..4c6ab299064 100644 --- a/testsuite/tests/typing-misc/pr7937.ml +++ b/testsuite/tests/typing-misc/pr7937.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a r = [< `X of int & 'a ] as 'a diff --git a/testsuite/tests/typing-misc/pr8548.ml b/testsuite/tests/typing-misc/pr8548.ml index 7053ed6817d..dd6cac13efa 100644 --- a/testsuite/tests/typing-misc/pr8548.ml +++ b/testsuite/tests/typing-misc/pr8548.ml @@ -1,5 +1,6 @@ (* TEST - * expect *) + expect; +*) module type Endpoint_intf = sig type t diff --git a/testsuite/tests/typing-misc/pr8548_split.ml b/testsuite/tests/typing-misc/pr8548_split.ml index 751dfa56033..5ba2cb09c7b 100644 --- a/testsuite/tests/typing-misc/pr8548_split.ml +++ b/testsuite/tests/typing-misc/pr8548_split.ml @@ -1,20 +1,26 @@ (* TEST -readonly_files = "mapping.ml range_intf.ml ranged_intf.ml range.ml ranged.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags = "-no-alias-deps -w -49 -o Pr8548__Mapping" -module = "mapping.ml" -** ocamlc.byte -flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Range_intf.cmo" -module = "range_intf.ml" -*** ocamlc.byte -flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Range.cmo" -module = "range.ml" -*** ocamlc.byte -flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Ranged_intf.cmo" -module = "ranged_intf.ml" -**** ocamlc.byte -flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Ranged.cmo" -module = "ranged.ml" -ocamlc_byte_exit_status = "0" + readonly_files = "mapping.ml range_intf.ml ranged_intf.ml range.ml ranged.ml"; + setup-ocamlc.byte-build-env; + { + flags = "-no-alias-deps -w -49 -o Pr8548__Mapping"; + module = "mapping.ml"; + ocamlc.byte; + }{ + flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Range_intf.cmo"; + module = "range_intf.ml"; + ocamlc.byte; + { + flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Range.cmo"; + module = "range.ml"; + ocamlc.byte; + }{ + flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Ranged_intf.cmo"; + module = "ranged_intf.ml"; + ocamlc.byte; + flags = "-no-alias-deps -open Pr8548__Mapping -o pr8548__Ranged.cmo"; + module = "ranged.ml"; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + } + } *) diff --git a/testsuite/tests/typing-misc/printing.ml b/testsuite/tests/typing-misc/printing.ml index d0ddffeab73..c7a37340503 100644 --- a/testsuite/tests/typing-misc/printing.ml +++ b/testsuite/tests/typing-misc/printing.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#7012 *) diff --git a/testsuite/tests/typing-misc/records.ml b/testsuite/tests/typing-misc/records.ml index 2a029fe8a54..83b5e486530 100644 --- a/testsuite/tests/typing-misc/records.ml +++ b/testsuite/tests/typing-misc/records.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* undefined labels *) @@ -300,3 +300,14 @@ Line 6, characters 13-23: Error: Unbound module Coq__10 Hint: Did you mean Coq__11? |}] + +type a = unit +type b = a = { a : int } +[%%expect{| +type a = unit +Line 2, characters 0-24: +2 | type b = a = { a : int } + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This variant or record definition does not match that of type a + The original is abstract, but this is a record. +|}] diff --git a/testsuite/tests/typing-misc/scope_escape.ml b/testsuite/tests/typing-misc/scope_escape.ml index 94a47d236e3..248cafc167d 100644 --- a/testsuite/tests/typing-misc/scope_escape.ml +++ b/testsuite/tests/typing-misc/scope_escape.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let x = ref [] diff --git a/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.ml b/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.ml index 9b4624d3e25..041f1f8eb06 100644 --- a/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.ml +++ b/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.ml @@ -1,12 +1,12 @@ (* TEST - readonly_files = "empty_ppx.ml" - * setup-ocamlc.byte-build-env - ** ocamlc.byte with ocamlcommon - all_modules="empty_ppx.ml" - program="ppx.exe" - *** toplevel - all_modules="${test_file}" - flags="-ppx '${ocamlrun} ${test_build_directory_prefix}/ocamlc.byte/ppx.exe'" + readonly_files = "empty_ppx.ml"; + setup-ocamlc.byte-build-env; + all_modules = "empty_ppx.ml"; + program = "ppx.exe"; + ocamlc.byte with ocamlcommon; + all_modules = "${test_file}"; + flags = "-ppx '${ocamlrun} ${test_build_directory_prefix}/ocamlc.byte/ppx.exe'"; + toplevel; *) type t = [%empty_polyvar];; diff --git a/testsuite/tests/typing-misc/typecore_errors.ml b/testsuite/tests/typing-misc/typecore_errors.ml index d5a3e8c7d17..2300ebb6d0b 100644 --- a/testsuite/tests/typing-misc/typecore_errors.ml +++ b/testsuite/tests/typing-misc/typecore_errors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) diff --git a/testsuite/tests/typing-misc/typecore_nolabel_errors.ml b/testsuite/tests/typing-misc/typecore_nolabel_errors.ml index 04ecb525783..d0dcc9d1a61 100644 --- a/testsuite/tests/typing-misc/typecore_nolabel_errors.ml +++ b/testsuite/tests/typing-misc/typecore_nolabel_errors.ml @@ -1,6 +1,6 @@ (* TEST - flags="-nolabels" - * expect + flags = "-nolabels"; + expect; *) diff --git a/testsuite/tests/typing-misc/typetexp_errors.ml b/testsuite/tests/typing-misc/typetexp_errors.ml index 7dc03e90ac3..4f71bd478b6 100644 --- a/testsuite/tests/typing-misc/typetexp_errors.ml +++ b/testsuite/tests/typing-misc/typetexp_errors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type ('a,'at,'any,'en) t = A of 'an diff --git a/testsuite/tests/typing-misc/unbound_type_variables.ml b/testsuite/tests/typing-misc/unbound_type_variables.ml index c00d0360796..285d54ae0d4 100644 --- a/testsuite/tests/typing-misc/unbound_type_variables.ml +++ b/testsuite/tests/typing-misc/unbound_type_variables.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type synonym = 'a -> 'a diff --git a/testsuite/tests/typing-misc/unique_names_in_unification.ml b/testsuite/tests/typing-misc/unique_names_in_unification.ml index 18a69f32bd2..13133af7f32 100644 --- a/testsuite/tests/typing-misc/unique_names_in_unification.ml +++ b/testsuite/tests/typing-misc/unique_names_in_unification.ml @@ -1,6 +1,6 @@ (* TEST - * expect - *) + expect; +*) type t = A let x = A module M = struct @@ -14,9 +14,10 @@ val x : t = A Line 5, characters 27-28: 5 | let f: t -> t = fun B -> x ^ -Error: This expression has type t/2 but an expression was expected of type t +Error: This expression has type t/2 but an expression was expected of type + t/1 Line 4, characters 2-12: - Definition of type t + Definition of type t/1 Line 1, characters 0-10: Definition of type t/2 |}] @@ -37,9 +38,9 @@ Line 7, characters 34-35: 7 | let f : M.t -> M.t = fun M.C -> y ^ Error: This expression has type M/2.t but an expression was expected of type - M.t + M/1.t Lines 4-6, characters 2-5: - Definition of module M + Definition of module M/1 Line 1, characters 0-32: Definition of module M/2 |}] @@ -53,9 +54,10 @@ type t = D Line 2, characters 25-26: 2 | let f: t -> t = fun D -> x;; ^ -Error: This expression has type t/2 but an expression was expected of type t +Error: This expression has type t/2 but an expression was expected of type + t/1 Line 1, characters 0-10: - Definition of type t + Definition of type t/1 Line 1, characters 0-10: Definition of type t/2 |}] @@ -77,9 +79,9 @@ Line 2, characters 32-33: 2 | let x: ttt = let rec y = A y in y;; ^ Error: This expression has type ttt/2 but an expression was expected of type - ttt + ttt/1 Line 1, characters 0-26: - Definition of type ttt + Definition of type ttt/1 Line 2, characters 0-30: Definition of type ttt/2 |}] diff --git a/testsuite/tests/typing-misc/variance.ml b/testsuite/tests/typing-misc/variance.ml index 419e348f480..a41db4f27a0 100644 --- a/testsuite/tests/typing-misc/variance.ml +++ b/testsuite/tests/typing-misc/variance.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* #8698 *) diff --git a/testsuite/tests/typing-misc/variant.ml b/testsuite/tests/typing-misc/variant.ml index 4270adca565..80967902884 100644 --- a/testsuite/tests/typing-misc/variant.ml +++ b/testsuite/tests/typing-misc/variant.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#6394 *) diff --git a/testsuite/tests/typing-misc/wellfounded.ml b/testsuite/tests/typing-misc/wellfounded.ml index c8820f7ec8f..3d0385167f9 100644 --- a/testsuite/tests/typing-misc/wellfounded.ml +++ b/testsuite/tests/typing-misc/wellfounded.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#6768 *) diff --git a/testsuite/tests/typing-misc/wrong_kind.ml b/testsuite/tests/typing-misc/wrong_kind.ml index 76d1a07688a..8638b6a2d21 100644 --- a/testsuite/tests/typing-misc/wrong_kind.ml +++ b/testsuite/tests/typing-misc/wrong_kind.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Constr = struct diff --git a/testsuite/tests/typing-missing-cmi-2/test.compilers.reference b/testsuite/tests/typing-missing-cmi-2/test.compilers.reference index f1ee85e77eb..63f60002a8f 100644 --- a/testsuite/tests/typing-missing-cmi-2/test.compilers.reference +++ b/testsuite/tests/typing-missing-cmi-2/test.compilers.reference @@ -3,6 +3,9 @@ File "baz.ml", line 1, characters 8-18: ^^^^^^^^^^ Error: This expression has type 'a Foo.t but an expression was expected of type ('b : '_representable_layout_1) - 'a Foo.t has an unknown layout, which might not be representable. + The layout of 'a Foo.t is any + because the .cmi file for Foo.t is missing. + But the layout of 'a Foo.t must be representable + because it's the type of a variable bound by a `let`. No .cmi file found containing Foo.t. Hint: Adding "foo" to your dependencies might help. diff --git a/testsuite/tests/typing-missing-cmi-2/test.ml b/testsuite/tests/typing-missing-cmi-2/test.ml index ae1db90bbfb..d9d2125e090 100644 --- a/testsuite/tests/typing-missing-cmi-2/test.ml +++ b/testsuite/tests/typing-missing-cmi-2/test.ml @@ -1,15 +1,15 @@ (* TEST -readonly_files = "foo.mli bar.mli baz.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "foo.mli" -*** ocamlc.byte -module = "bar.mli" -**** script -script = "rm foo.cmi" -***** ocamlc.byte -flags = "-c -i" -module = "baz.ml" -ocamlc_byte_exit_status = "2" -****** check-ocamlc.byte-output + readonly_files = "foo.mli bar.mli baz.ml"; + setup-ocamlc.byte-build-env; + module = "foo.mli"; + ocamlc.byte; + module = "bar.mli"; + ocamlc.byte; + script = "rm foo.cmi"; + script; + flags = "-c -i"; + module = "baz.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/typing-missing-cmi-3/middle.ml b/testsuite/tests/typing-missing-cmi-3/middle.ml index a04ca4008c9..fbbf03f0489 100644 --- a/testsuite/tests/typing-missing-cmi-3/middle.ml +++ b/testsuite/tests/typing-missing-cmi-3/middle.ml @@ -20,3 +20,5 @@ type ('a,'b) gadt = | G: ('a, 'a ti) gadt type 'a is_int = 'a Original.is_int = Is_int : int is_int + +type u = { y: Original.u } [@@unboxed] diff --git a/testsuite/tests/typing-missing-cmi-3/original.ml b/testsuite/tests/typing-missing-cmi-3/original.ml index d392be992fb..93a1cc98363 100644 --- a/testsuite/tests/typing-missing-cmi-3/original.ml +++ b/testsuite/tests/typing-missing-cmi-3/original.ml @@ -8,3 +8,5 @@ type s = S let s = S type _ is_int = Is_int : int is_int + +type u = int diff --git a/testsuite/tests/typing-missing-cmi-3/user.ml b/testsuite/tests/typing-missing-cmi-3/user.ml index d34bff284a1..def622d57a7 100644 --- a/testsuite/tests/typing-missing-cmi-3/user.ml +++ b/testsuite/tests/typing-missing-cmi-3/user.ml @@ -1,14 +1,13 @@ (* TEST - -readonly_files = "original.ml middle.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "original.ml" -*** ocamlc.byte -module = "middle.ml" -**** script -script = "rm -f original.cmi" -***** expect + readonly_files = "original.ml middle.ml"; + setup-ocamlc.byte-build-env; + module = "original.ml"; + ocamlc.byte; + module = "middle.ml"; + ocamlc.byte; + script = "rm -f original.cmi"; + script; + expect; *) @@ -116,3 +115,8 @@ let g : bool Middle.is_int -> 'a = function _ -> . val f : 'a Middle.is_int -> 'a -> int = val g : bool Middle.is_int -> 'a = |}] + +let f (x: Middle.u) = x +[%%expect {| +val f : Middle.u -> Middle.u = +|}] diff --git a/testsuite/tests/typing-missing-cmi-indirections/test.compilers.reference b/testsuite/tests/typing-missing-cmi-indirections/test.compilers.reference index a8cd534433e..9e56e22c5be 100644 --- a/testsuite/tests/typing-missing-cmi-indirections/test.compilers.reference +++ b/testsuite/tests/typing-missing-cmi-indirections/test.compilers.reference @@ -2,6 +2,9 @@ File "client.ml", line 2, characters 0-19: 2 | and alias = missing ^^^^^^^^^^^^^^^^^^^ Error: - alias has an unknown layout, which might not be a sublayout of value. + The layout of alias is any + because the .cmi file for Missing.t is missing. + But the layout of alias must be a sublayout of value + because the type argument of list has layout value. No .cmi file found containing Missing.t. Hint: Adding "missing" to your dependencies might help. diff --git a/testsuite/tests/typing-missing-cmi-indirections/test.ml b/testsuite/tests/typing-missing-cmi-indirections/test.ml index 3930441b434..5c9c9c426fb 100644 --- a/testsuite/tests/typing-missing-cmi-indirections/test.ml +++ b/testsuite/tests/typing-missing-cmi-indirections/test.ml @@ -1,16 +1,16 @@ (* TEST -readonly_files = "missing.mli present.mli client.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "missing.mli" -*** ocamlc.byte -flags = "-open Missing" -module = "present.mli" -**** script -script = "rm missing.cmi" -***** ocamlc.byte -flags = "-c -i" -module = "client.ml" -ocamlc_byte_exit_status = "2" -****** check-ocamlc.byte-output + readonly_files = "missing.mli present.mli client.ml"; + setup-ocamlc.byte-build-env; + module = "missing.mli"; + ocamlc.byte; + flags = "-open Missing"; + module = "present.mli"; + ocamlc.byte; + script = "rm missing.cmi"; + script; + flags = "-c -i"; + module = "client.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/typing-missing-cmi/main.ml.reference b/testsuite/tests/typing-missing-cmi/main.ml.reference deleted file mode 100644 index dfcfd020473..00000000000 --- a/testsuite/tests/typing-missing-cmi/main.ml.reference +++ /dev/null @@ -1,5 +0,0 @@ -File "main.ml", line 1, characters 14-17: -Error: This expression has type M.b but an expression was expected of type - M.a -M.b is abstract because no corresponding cmi file was found in path. -M.a is abstract because no corresponding cmi file was found in path. diff --git a/testsuite/tests/typing-missing-cmi/test.compilers.reference b/testsuite/tests/typing-missing-cmi/test.compilers.reference index b75953604d6..748d8db1386 100644 --- a/testsuite/tests/typing-missing-cmi/test.compilers.reference +++ b/testsuite/tests/typing-missing-cmi/test.compilers.reference @@ -3,6 +3,9 @@ File "main.ml", line 1, characters 8-11: ^^^ Error: This expression has type M.a but an expression was expected of type ('a : value) - M.a has an unknown layout, which might not be a sublayout of value. + The layout of M.a is any + because the .cmi file for M.a is missing. + But the layout of M.a must be a sublayout of value + because of layout requirements from an imported definition. No .cmi file found containing M.a. Hint: Adding "m" to your dependencies might help. diff --git a/testsuite/tests/typing-missing-cmi/test.ml b/testsuite/tests/typing-missing-cmi/test.ml index b946a8c1cb7..a100351501a 100644 --- a/testsuite/tests/typing-missing-cmi/test.ml +++ b/testsuite/tests/typing-missing-cmi/test.ml @@ -1,21 +1,21 @@ (* TEST -readonly_files = "a.ml b.ml c.ml main.ml main_ok.ml" -subdirectories = "subdir" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "subdir/m.ml" -*** ocamlc.byte -flags = "-I subdir" -module = "a.ml" -**** ocamlc.byte -module = "b.ml" -***** ocamlc.byte -module = "c.ml" -****** ocamlc.byte -flags = "" -module = "main_ok.ml" -******* ocamlc.byte -module = "main.ml" -ocamlc_byte_exit_status = "2" -******** check-ocamlc.byte-output + readonly_files = "a.ml b.ml c.ml main.ml main_ok.ml"; + subdirectories = "subdir"; + setup-ocamlc.byte-build-env; + module = "subdir/m.ml"; + ocamlc.byte; + flags = "-I subdir"; + module = "a.ml"; + ocamlc.byte; + module = "b.ml"; + ocamlc.byte; + module = "c.ml"; + ocamlc.byte; + flags = ""; + module = "main_ok.ml"; + ocamlc.byte; + module = "main.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/typing-modal-kinds/basics.ml b/testsuite/tests/typing-modal-kinds/basics.ml new file mode 100644 index 00000000000..c5ecc6acf40 --- /dev/null +++ b/testsuite/tests/typing-modal-kinds/basics.ml @@ -0,0 +1,693 @@ +(* TEST + flags = "-extension unique"; + expect; +*) + +module Hidden_string : sig + type t + val hide : string -> t +end = struct + type t = string + let hide x = x +end + +module Hidden_int : sig + type t : immediate + val hide : int -> t +end = struct + type t = int + let hide x = x +end + +module Hidden_float_u : sig + type t : float64 + val hide : float# -> t +end = struct + type t = float# + let hide x = x +end + +module Hidden_int64_u : sig + type t : bits64 + val hide : int64# -> t +end = struct + type t = int64# + let hide x = x +end + +[%%expect{| +module Hidden_string : sig type t val hide : string -> t end +module Hidden_int : sig type t : immediate val hide : int -> t end +module Hidden_float_u : sig type t : float64 val hide : float# -> t end +module Hidden_int64_u : sig type t : bits64 val hide : int64# -> t end +|}] + +module Immediate : sig + val id : ('a : immediate). 'a -> 'a + val ignore : ('a : immediate). 'a -> unit + val unique : ('a : immediate). unique_ 'a -> 'a +end = struct + let id x = x + let ignore _ = () + let unique (unique_ x) = x +end + +[%%expect{| +module Immediate : + sig + val id : ('a : immediate). 'a -> 'a + val ignore : ('a : immediate). 'a -> unit + val unique : ('a : immediate). unique_ 'a -> 'a + end +|}] + +module Float_u : sig + val id : ('a : float64). 'a -> 'a + val ignore : ('a : float64). 'a -> unit + val unique : ('a : float64). unique_ 'a -> 'a +end = struct + let id x = x + let ignore _ = () + let unique (unique_ x) = x +end + +[%%expect{| +module Float_u : + sig + val id : ('a : float64). 'a -> 'a + val ignore : ('a : float64). 'a -> unit + val unique : ('a : float64). unique_ 'a -> 'a + end +|}] + +module Int64_u : sig + val id : ('a : bits64). 'a -> 'a + val ignore : ('a : bits64). 'a -> unit + val unique : ('a : bits64). unique_ 'a -> 'a +end = struct + let id x = x + let ignore _ = () + let unique (unique_ x) = x +end + +[%%expect{| +module Int64_u : + sig + val id : ('a : bits64). 'a -> 'a + val ignore : ('a : bits64). 'a -> unit + val unique : ('a : bits64). unique_ 'a -> 'a + end +|}] + +type float_u_record = { x : float#; y : float# } + +[%%expect{| +type float_u_record = { x : float#; y : float#; } +|}] + +let string_escape = let local_ x : string = "hello" in x + +[%%expect{| +Line 1, characters 55-56: +1 | let string_escape = let local_ x : string = "hello" in x + ^ +Error: This value escapes its region. +|}] + +let int_escape = let local_ x : int = 5 in x + +[%%expect{| +val int_escape : int = 5 +|}] + +let string_list_escape = let local_ x : string list = ["hi";"bye"] in x + +[%%expect{| +Line 1, characters 70-71: +1 | let string_list_escape = let local_ x : string list = ["hi";"bye"] in x + ^ +Error: This value escapes its region. +|}] + +let int_list_escape = let local_ x : int list = [4;5] in x + +[%%expect{| +Line 1, characters 57-58: +1 | let int_list_escape = let local_ x : int list = [4;5] in x + ^ +Error: This value escapes its region. +|}] + +let hidden_string_escape = + let local_ x : Hidden_string.t = Hidden_string.hide "hello" in x + +[%%expect{| +Line 2, characters 65-66: +2 | let local_ x : Hidden_string.t = Hidden_string.hide "hello" in x + ^ +Error: This value escapes its region. +|}] + +let hidden_int_escape = + let local_ x : Hidden_int.t = Hidden_int.hide 42 in x + +[%%expect{| +val hidden_int_escape : Hidden_int.t = +|}] + +let hidden_string_list_escape = + let local_ x : Hidden_string.t list = + [Hidden_string.hide "hi"; Hidden_string.hide "bye"] + in x + +[%%expect{| +Line 4, characters 5-6: +4 | in x + ^ +Error: This value escapes its region. +|}] + +let hidden_int_list_escape = + let local_ x : Hidden_int.t list = + [Hidden_int.hide 2; Hidden_int.hide 3] + in x + +[%%expect{| +Line 4, characters 5-6: +4 | in x + ^ +Error: This value escapes its region. +|}] + +let float_escape = let local_ x : float = 3.14 in x + +[%%expect{| +Line 1, characters 50-51: +1 | let float_escape = let local_ x : float = 3.14 in x + ^ +Error: This value escapes its region. +|}] + +let float_u_escape () = let local_ x : float# = #3.14 in x + +[%%expect{| +val float_u_escape : unit -> float# = +|}] + +let int64_u_escape () = let local_ x : int64# = #314L in x + +[%%expect{| +val int64_u_escape : unit -> int64# = +|}] + +let hidden_float_u_escape () = + let local_ x : Hidden_float_u.t = Hidden_float_u.hide #3.14 in x + +[%%expect{| +val hidden_float_u_escape : unit -> Hidden_float_u.t = +|}] + +let hidden_int64_u_escape () = + let local_ x : Hidden_int64_u.t = Hidden_int64_u.hide #314L in x + +[%%expect{| +Line 2, characters 65-66: +2 | let local_ x : Hidden_int64_u.t = Hidden_int64_u.hide #314L in x + ^ +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. +|}] + +let float_u_record_escape = + let local_ x : float_u_record = { x = #3.14; y = #2.718 } in x + +[%%expect{| +Line 2, characters 63-64: +2 | let local_ x : float_u_record = { x = #3.14; y = #2.718 } in x + ^ +Error: This value escapes its region. +|}] + +let float_u_record_list_escape = + let local_ x : float_u_record list = [] in x + +[%%expect{| +Line 2, characters 45-46: +2 | let local_ x : float_u_record list = [] in x + ^ +Error: This value escapes its region. +|}] + +type r = {x : float; y : float} + +let foo () = + let local_ r = {x = 3.0; y = 4.0} in + (* [r.x] is allocated global and can escape. *) + r.x + +[%%expect{| +type r = { x : float; y : float; } +val foo : unit -> float = +|}] + +let function_escape = let local_ x : int -> int = fun y -> y in x + +[%%expect{| +Line 1, characters 64-65: +1 | let function_escape = let local_ x : int -> int = fun y -> y in x + ^ +Error: This value escapes its region. +|}] + +let function_list_escape = + let local_ x : (int -> int) list = [(fun y -> y); fun z -> z + 1] in x + +[%%expect{| +Line 2, characters 71-72: +2 | let local_ x : (int -> int) list = [(fun y -> y); fun z -> z + 1] in x + ^ +Error: This value escapes its region. +|}] + +let string_duplicate = let once_ x : string = "hello" in Fun.id x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 64-65: +1 | let string_duplicate = let once_ x : string = "hello" in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let int_duplicate = let once_ x : int = 5 in Fun.id x + +[%%expect{| +val int_duplicate : int = 5 +|}] + +let string_list_duplicate = let once_ x : string list = ["hi";"bye"] in Fun.id x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 79-80: +1 | let string_list_duplicate = let once_ x : string list = ["hi";"bye"] in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let int_list_duplicate = let once_ x : int list = [4;5] in Fun.id x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 66-67: +1 | let int_list_duplicate = let once_ x : int list = [4;5] in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let hidden_string_duplicate = + let once_ x : Hidden_string.t = Hidden_string.hide "hello" in Fun.id x + +[%%expect{| +Line 2, characters 71-72: +2 | let once_ x : Hidden_string.t = Hidden_string.hide "hello" in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let hidden_int_duplicate = + let once_ x : Hidden_int.t = Hidden_int.hide 42 in Fun.id x + +[%%expect{| +val hidden_int_duplicate : Hidden_int.t = +|}] + +let hidden_string_list_duplicate = + let once_ x : Hidden_string.t list = + [Hidden_string.hide "hi"; Hidden_string.hide "bye"] + in Fun.id x + +[%%expect{| +Line 4, characters 12-13: +4 | in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let hidden_int_list_duplicate = + let once_ x : Hidden_int.t list = + [Hidden_int.hide 2; Hidden_int.hide 3] + in Fun.id x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 4, characters 12-13: +4 | in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let float_duplicate = let once_ x : float = 3.14 in Fun.id x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 59-60: +1 | let float_duplicate = let once_ x : float = 3.14 in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let float_u_duplicate () = let once_ x : float# = #3.14 in Float_u.id x + +[%%expect{| +val float_u_duplicate : unit -> float# = +|}] + +let int64_u_duplicate () = let once_ x : int64# = #314L in Int64_u.id x + +[%%expect{| +val int64_u_duplicate : unit -> int64# = +|}] + +let hidden_float_u_duplicate () = + let once_ x : Hidden_float_u.t = Hidden_float_u.hide #3.14 in Float_u.id x + +[%%expect{| +val hidden_float_u_duplicate : unit -> Hidden_float_u.t = +|}] + +let hidden_int64_u_duplicate () = + let once_ x : Hidden_int64_u.t = Hidden_int64_u.hide #314L in Int64_u.id x + +[%%expect{| +Line 2, characters 75-76: +2 | let once_ x : Hidden_int64_u.t = Hidden_int64_u.hide #314L in Int64_u.id x + ^ +Error: This value is once but expected to be many. +|}] + +let float_u_record_duplicate = + let once_ x : float_u_record = { x = #3.14; y = #2.718 } in Fun.id x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 2, characters 69-70: +2 | let once_ x : float_u_record = { x = #3.14; y = #2.718 } in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let float_u_record_list_duplicate = + let once_ x : float_u_record list = [] in Fun.id x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 2, characters 51-52: +2 | let once_ x : float_u_record list = [] in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let function_duplicate = let once_ x : int -> int = fun y -> y in Fun.id x + +[%%expect{| +Line 1, characters 73-74: +1 | let function_duplicate = let once_ x : int -> int = fun y -> y in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let function_list_duplicate = + let once_ x : (int -> int) list = [(fun y -> y); fun z -> z + 1] in Fun.id x + +[%%expect{| +Line 2, characters 77-78: +2 | let once_ x : (int -> int) list = [(fun y -> y); fun z -> z + 1] in Fun.id x + ^ +Error: This value is once but expected to be many. +|}] + +let unique (unique_ x) = x + +[%%expect{| +val unique : unique_ 'a -> 'a = +|}] + +let string_unshare = let x : string = "hello" in ignore x; unique x + +[%%expect{| +Line 1, characters 66-67: +1 | let string_unshare = let x : string = "hello" in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 1, characters 56-57: +1 | let string_unshare = let x : string = "hello" in ignore x; unique x + ^ + +|}] + +let int_unshare = let x : int = 5 in ignore x; unique x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 54-55: +1 | let int_unshare = let x : int = 5 in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 1, characters 44-45: +1 | let int_unshare = let x : int = 5 in ignore x; unique x + ^ + +|}] + +let string_list_unshare = + let x : string list = ["hi";"bye"] in ignore x; unique x + +[%%expect{| +Line 2, characters 57-58: +2 | let x : string list = ["hi";"bye"] in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 2, characters 47-48: +2 | let x : string list = ["hi";"bye"] in ignore x; unique x + ^ + +|}] + +let int_list_unshare = let x : int list = [4;5] in ignore x; unique x + +[%%expect{| +Line 1, characters 68-69: +1 | let int_list_unshare = let x : int list = [4;5] in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 1, characters 58-59: +1 | let int_list_unshare = let x : int list = [4;5] in ignore x; unique x + ^ + +|}] + +let hidden_string_unshare = + let x : Hidden_string.t = Hidden_string.hide "hello" in ignore x; unique x + +(* CR layouts v2.8: Why is this error message different?? *) +[%%expect{| +Line 2, characters 75-76: +2 | let x : Hidden_string.t = Hidden_string.hide "hello" in ignore x; unique x + ^ +Error: This value is shared but expected to be unique. +|}] + +let hidden_int_unshare = + let x : Hidden_int.t = Hidden_int.hide 42 in ignore x; unique x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 2, characters 64-65: +2 | let x : Hidden_int.t = Hidden_int.hide 42 in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 2, characters 54-55: +2 | let x : Hidden_int.t = Hidden_int.hide 42 in ignore x; unique x + ^ + +|}] + +let hidden_string_list_unshare = + let x : Hidden_string.t list = + [Hidden_string.hide "hi"; Hidden_string.hide "bye"] + in ignore x; unique x + +[%%expect{| +Line 4, characters 22-23: +4 | in ignore x; unique x + ^ +Error: This value is shared but expected to be unique. +|}] + +let hidden_int_list_unshare = + let x : Hidden_int.t list = + [Hidden_int.hide 2; Hidden_int.hide 3] + in ignore x; unique x + +[%%expect{| +Line 4, characters 22-23: +4 | in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 4, characters 12-13: +4 | in ignore x; unique x + ^ + +|}] + +let float_unshare = let x : float = 3.14 in ignore x; unique x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 61-62: +1 | let float_unshare = let x : float = 3.14 in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 1, characters 51-52: +1 | let float_unshare = let x : float = 3.14 in ignore x; unique x + ^ + +|}] + +(* CR layouts v2.8: The following should pass, even in principal mode, because the +argument kind is known to cross mode. *) + +let float_u_unshare () = let x : float# = #3.14 in Float_u.ignore x; Float_u.unique x + +[%%expect{| +val float_u_unshare : unit -> float# = +|}, Principal{| +Line 1, characters 84-85: +1 | let float_u_unshare () = let x : float# = #3.14 in Float_u.ignore x; Float_u.unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 1, characters 66-67: +1 | let float_u_unshare () = let x : float# = #3.14 in Float_u.ignore x; Float_u.unique x + ^ + +|}] + +let int64_u_unshare () = let x : int64# = #314L in Int64_u.ignore x; Int64_u.unique x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 84-85: +1 | let int64_u_unshare () = let x : int64# = #314L in Int64_u.ignore x; Int64_u.unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 1, characters 66-67: +1 | let int64_u_unshare () = let x : int64# = #314L in Int64_u.ignore x; Int64_u.unique x + ^ + +|}] + +let imm_escape () = Immediate.id (local_ 42) [@nontail] + +[%%expect{| +val imm_escape : unit -> int = +|}, Principal{| +Line 1, characters 33-44: +1 | let imm_escape () = Immediate.id (local_ 42) [@nontail] + ^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let hidden_float_u_unshare () = + let x : Hidden_float_u.t = Hidden_float_u.hide #3.14 in + Float_u.ignore x; Float_u.unique x + +[%%expect{| +val hidden_float_u_unshare : unit -> Hidden_float_u.t = +|}, Principal{| +Line 3, characters 35-36: +3 | Float_u.ignore x; Float_u.unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 3, characters 17-18: +3 | Float_u.ignore x; Float_u.unique x + ^ + +|}] + +let hidden_int64_u_unshare () = + let x : Hidden_int64_u.t = Hidden_int64_u.hide #314L in + Int64_u.ignore x; Int64_u.unique x + +[%%expect{| +Line 3, characters 35-36: +3 | Int64_u.ignore x; Int64_u.unique x + ^ +Error: This value is shared but expected to be unique. +|}] + +let float_u_record_unshare = + let x : float_u_record = { x = #3.14; y = #2.718 } in ignore x; unique x + +[%%expect{| +Line 2, characters 73-74: +2 | let x : float_u_record = { x = #3.14; y = #2.718 } in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 2, characters 63-64: +2 | let x : float_u_record = { x = #3.14; y = #2.718 } in ignore x; unique x + ^ + +|}] + +let float_u_record_list_unshare = + let x : float_u_record list = [] in ignore x; unique x + +[%%expect{| +Line 2, characters 55-56: +2 | let x : float_u_record list = [] in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 2, characters 45-46: +2 | let x : float_u_record list = [] in ignore x; unique x + ^ + +|}] + +let function_unshare = let x : int -> int = fun y -> y in ignore x; unique x + +(* CR layouts v2.8: this should succeed *) +[%%expect{| +Line 1, characters 75-76: +1 | let function_unshare = let x : int -> int = fun y -> y in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 1, characters 65-66: +1 | let function_unshare = let x : int -> int = fun y -> y in ignore x; unique x + ^ + +|}] + +let function_list_unshare = + let x : (int -> int) list = [(fun y -> y); fun z -> z + 1] in ignore x; unique x + +[%%expect{| +Line 2, characters 81-82: +2 | let x : (int -> int) list = [(fun y -> y); fun z -> z + 1] in ignore x; unique x + ^ +Error: This value is used here as unique, but it has already been used: +Line 2, characters 71-72: +2 | let x : (int -> int) list = [(fun y -> y); fun z -> z + 1] in ignore x; unique x + ^ + +|}] + +(* CR layouts: this should succeed. *) +let foo : (string -> string) -> (string -> string) @ unique + = fun f -> f +[%%expect{| +Line 2, characters 13-14: +2 | = fun f -> f + ^ +Error: This value is shared but expected to be unique. +|}] diff --git a/testsuite/tests/typing-modal-kinds/expected_mode.ml b/testsuite/tests/typing-modal-kinds/expected_mode.ml new file mode 100644 index 00000000000..85bdd09e423 --- /dev/null +++ b/testsuite/tests/typing-modal-kinds/expected_mode.ml @@ -0,0 +1,408 @@ +(* TEST + flags = "-extension unique"; + expect; +*) + +module Hidden_string : sig + type t + val hide : string -> t +end = struct + type t = string + let hide x = x +end + +module Hidden_int : sig + type t : immediate + val hide : int -> t +end = struct + type t = int + let hide x = x +end + +module Hidden_float_u : sig + type t : float64 + val hide : float# -> t +end = struct + type t = float# + let hide x = x +end + +[%%expect{| +module Hidden_string : sig type t val hide : string -> t end +module Hidden_int : sig type t : immediate val hide : int -> t end +module Hidden_float_u : sig type t : float64 val hide : float# -> t end +|}] + +module Float_u : sig + type ('a : float64, 'b : float64) pair + val mk_pair : ('a : float64) ('b : float64). 'a -> 'b -> ('a, 'b) pair +end = struct + type ('a : float64, 'b : float64) pair = { fst : 'a; snd : 'b } + let mk_pair fst snd = { fst; snd } +end + +[%%expect{| +module Float_u : + sig + type ('a : float64, 'b : float64) pair + val mk_pair : ('a : float64) ('b : float64). 'a -> 'b -> ('a, 'b) pair + end +|}] + +type float_u_record = { x : float#; y : float# } + +[%%expect{| +type float_u_record = { x : float#; y : float#; } +|}] + +let string_escape : local_ _ -> string * string = fun x -> x, x + +[%%expect{| +Line 1, characters 59-60: +1 | let string_escape : local_ _ -> string * string = fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let int_escape : local_ _ -> int * int = fun x -> x, x + +[%%expect{| +val int_escape : local_ int -> int * int = +|}] + +let string_list_escape : local_ _ -> string list * string list = fun x -> x, x + +[%%expect{| +Line 1, characters 74-75: +1 | let string_list_escape : local_ _ -> string list * string list = fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let int_list_escape : local_ _ -> int list * int list = fun x -> x, x + +[%%expect{| +Line 1, characters 65-66: +1 | let int_list_escape : local_ _ -> int list * int list = fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let hidden_string_escape : local_ _ -> Hidden_string.t * Hidden_string.t = + fun x -> x, x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let hidden_int_escape : local_ _ -> Hidden_int.t * Hidden_int.t = + fun x -> x, x + +[%%expect{| +val hidden_int_escape : local_ Hidden_int.t -> Hidden_int.t * Hidden_int.t = + +|}] + +let float_escape : local_ _ -> float * float = fun x -> x, x + +[%%expect{| +Line 1, characters 56-57: +1 | let float_escape : local_ _ -> float * float = fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +(* CR layouts v2.8: The following should pass, even in principal mode. *) +let float_u_escape : local_ _ -> (float#, float#) Float_u.pair = + fun x -> Float_u.mk_pair x x [@nontail] + +[%%expect{| +val float_u_escape : local_ float# -> (float#, float#) Float_u.pair = +|}, Principal{| +Line 2, characters 27-28: +2 | fun x -> Float_u.mk_pair x x [@nontail] + ^ +Error: This value escapes its region. +|}] + +let hidden_float_u_escape : + local_ _ -> (Hidden_float_u.t, Hidden_float_u.t) Float_u.pair = + fun x -> Float_u.mk_pair x x [@nontail] + +[%%expect{| +val hidden_float_u_escape : + local_ Hidden_float_u.t -> + (Hidden_float_u.t, Hidden_float_u.t) Float_u.pair = +|}, Principal{| +Line 3, characters 27-28: +3 | fun x -> Float_u.mk_pair x x [@nontail] + ^ +Error: This value escapes its region. +|}] + +let float_u_record_escape : local_ _ -> float_u_record * float_u_record = + fun x -> x, x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let float_u_record_list_escape : + local_ _ -> float_u_record list * float_u_record list = + fun x -> x, x + +[%%expect{| +Line 3, characters 11-12: +3 | fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let function_escape : local_ _ -> (int -> int) * (int -> int) = fun x -> x, x + +[%%expect{| +Line 1, characters 73-74: +1 | let function_escape : local_ _ -> (int -> int) * (int -> int) = fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let function_list_escape : local_ _ -> (int -> int) list * (int -> int) list = + fun x -> x, x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x, x + ^ +Error: This value escapes its region. +|}] + +let string_duplicate : once_ _ -> string = fun x -> x + +[%%expect{| +Line 1, characters 52-53: +1 | let string_duplicate : once_ _ -> string = fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let int_duplicate : once_ _ -> int = fun x -> x + +[%%expect{| +val int_duplicate : once_ int -> int = +|}] + +let string_list_duplicate : once_ _ -> string list = fun x -> x + +[%%expect{| +Line 1, characters 62-63: +1 | let string_list_duplicate : once_ _ -> string list = fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let int_list_duplicate : once_ _ -> int list = fun x -> x + +[%%expect{| +Line 1, characters 56-57: +1 | let int_list_duplicate : once_ _ -> int list = fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let hidden_string_duplicate : once_ _ -> Hidden_string.t = + fun x -> x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let hidden_int_duplicate : once_ _ -> Hidden_int.t = + fun x -> x + +[%%expect{| +val hidden_int_duplicate : once_ Hidden_int.t -> Hidden_int.t = +|}] + +let float_duplicate : once_ _ -> float = fun x -> x + +[%%expect{| +Line 1, characters 50-51: +1 | let float_duplicate : once_ _ -> float = fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let float_u_duplicate : once_ _ -> float# = fun x -> x + +[%%expect{| +val float_u_duplicate : once_ float# -> float# = +|}] + +let hidden_float_u_duplicate : once_ _ -> Hidden_float_u.t = fun x -> x + +[%%expect{| +val hidden_float_u_duplicate : once_ Hidden_float_u.t -> Hidden_float_u.t = + +|}] + +let float_u_record_duplicate : once_ _ -> float_u_record = + fun x -> x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let float_u_record_list_duplicate : + once_ _ -> float_u_record list = + fun x -> x + +[%%expect{| +Line 3, characters 11-12: +3 | fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let function_duplicate : once_ _ -> (int -> int) = fun x -> x + +[%%expect{| +Line 1, characters 60-61: +1 | let function_duplicate : once_ _ -> (int -> int) = fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let function_list_duplicate : once_ _ -> (int -> int) list = + fun x -> x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x + ^ +Error: This value is once but expected to be many. +|}] + +let string_unshare : _ -> unique_ string = fun x -> x + +[%%expect{| +Line 1, characters 52-53: +1 | let string_unshare : _ -> unique_ string = fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let int_unshare : _ -> unique_ int = fun x -> x + +[%%expect{| +val int_unshare : int -> unique_ int = +|}] + +let string_list_unshare : _ -> unique_ string list = fun x -> x + +[%%expect{| +Line 1, characters 62-63: +1 | let string_list_unshare : _ -> unique_ string list = fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let int_list_unshare : _ -> unique_ int list = fun x -> x + +[%%expect{| +Line 1, characters 56-57: +1 | let int_list_unshare : _ -> unique_ int list = fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let hidden_string_unshare : _ -> unique_ Hidden_string.t = + fun x -> x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let hidden_int_unshare : _ -> unique_ Hidden_int.t = + fun x -> x + +[%%expect{| +val hidden_int_unshare : Hidden_int.t -> unique_ Hidden_int.t = +|}] + +let float_unshare : _ -> unique_ float = fun x -> x + +[%%expect{| +Line 1, characters 50-51: +1 | let float_unshare : _ -> unique_ float = fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let float_u_unshare : _ -> unique_ float# = fun x -> x + +[%%expect{| +val float_u_unshare : float# -> unique_ float# = +|}] + +let hidden_float_u_unshare : _ -> unique_ Hidden_float_u.t = fun x -> x + +[%%expect{| +val hidden_float_u_unshare : Hidden_float_u.t -> unique_ Hidden_float_u.t = + +|}] + +let float_u_record_unshare : _ -> unique_ float_u_record = + fun x -> x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let float_u_record_list_unshare : + _ -> unique_ float_u_record list = + fun x -> x + +[%%expect{| +Line 3, characters 11-12: +3 | fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let function_unshare : _ -> unique_ (int -> int) = fun x -> x + +[%%expect{| +Line 1, characters 60-61: +1 | let function_unshare : _ -> unique_ (int -> int) = fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] + +let function_list_unshare : _ -> unique_ (int -> int) list = + fun x -> x + +[%%expect{| +Line 2, characters 11-12: +2 | fun x -> x + ^ +Error: This value is shared but expected to be unique. +|}] diff --git a/testsuite/tests/typing-modal-kinds/principal.ml b/testsuite/tests/typing-modal-kinds/principal.ml new file mode 100644 index 00000000000..d571974a7fe --- /dev/null +++ b/testsuite/tests/typing-modal-kinds/principal.ml @@ -0,0 +1,131 @@ +(* TEST + expect; +*) + +type 'a pair = Pair of 'a * 'a + +[%%expect{| +type 'a pair = Pair of 'a * 'a +|}] + +let string_escape_l (local_ y) = let Pair (x, _) = Pair (y, "hello") in x + +[%%expect{| +Line 1, characters 72-73: +1 | let string_escape_l (local_ y) = let Pair (x, _) = Pair (y, "hello") in x + ^ +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. +|}] + +let string_escape_r (local_ y) = let Pair (x, _) = Pair ("hello", y) in x + +[%%expect{| +Line 1, characters 72-73: +1 | let string_escape_r (local_ y) = let Pair (x, _) = Pair ("hello", y) in x + ^ +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. +|}] + +let int_escape_l (local_ y) = let Pair (x, _) = Pair (y, 5) in x + +[%%expect{| +val int_escape_l : local_ int -> int = +|}, Principal{| +Line 1, characters 63-64: +1 | let int_escape_l (local_ y) = let Pair (x, _) = Pair (y, 5) in x + ^ +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. +|}] + +let int_escape_r (local_ y) = let Pair (x, _) = Pair (5, y) in x + +[%%expect{| +val int_escape_r : local_ int -> int = +|}, Principal{| +Line 1, characters 63-64: +1 | let int_escape_r (local_ y) = let Pair (x, _) = Pair (5, y) in x + ^ +Error: This value escapes its region. + Hint: Cannot return a local value without an "exclave_" annotation. +|}] + +let string_escape_expected_l : local_ _ -> _ pair = fun x -> Pair (x, "hello") + +[%%expect{| +Line 1, characters 67-68: +1 | let string_escape_expected_l : local_ _ -> _ pair = fun x -> Pair (x, "hello") + ^ +Error: This value escapes its region. +|}] + +let string_escape_expected_r : local_ _ -> _ pair = fun x -> Pair ("hello", x) + +[%%expect{| +Line 1, characters 76-77: +1 | let string_escape_expected_r : local_ _ -> _ pair = fun x -> Pair ("hello", x) + ^ +Error: This value escapes its region. +|}] + + +(* If this one ends up being accepted under non-principal mode, that's fine. *) +let int_escape_expected_l : local_ _ -> _ pair = fun x -> Pair (x, 5) + +[%%expect{| +Line 1, characters 64-65: +1 | let int_escape_expected_l : local_ _ -> _ pair = fun x -> Pair (x, 5) + ^ +Error: This value escapes its region. +|}] + +let int_escape_expected_r : local_ _ -> _ pair = fun x -> Pair (5, x) + +[%%expect{| +val int_escape_expected_r : local_ int -> int pair = +|}, Principal{| +Line 1, characters 67-68: +1 | let int_escape_expected_r : local_ _ -> _ pair = fun x -> Pair (5, x) + ^ +Error: This value escapes its region. +|}] + +let escape : 'a -> unit = fun _ -> () + +[%%expect{| +val escape : 'a -> unit = +|}] + +let pattern_l (local_ x) = + match x with + | Pair (y, 0) -> escape y + | _ -> () + +[%%expect{| +val pattern_l : local_ int pair -> unit = +|}, Principal{| +Line 3, characters 26-27: +3 | | Pair (y, 0) -> escape y + ^ +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. +|}] + +let pattern_r (local_ x) = + match x with + | Pair (0, y) -> escape y + | _ -> () + +[%%expect{| +val pattern_r : local_ int pair -> unit = +|}, Principal{| +Line 3, characters 26-27: +3 | | Pair (0, y) -> escape y + ^ +Error: This value escapes its region. + Hint: This argument cannot be local, + because it is an argument in a tail call. +|}] diff --git a/testsuite/tests/typing-modes/class.ml b/testsuite/tests/typing-modes/class.ml new file mode 100644 index 00000000000..013d41b1de3 --- /dev/null +++ b/testsuite/tests/typing-modes/class.ml @@ -0,0 +1,196 @@ +(* TEST + flags += "-extension unique"; + expect; +*) + +(* This file tests that classes/objects are sound wrt modes. *) + +let unique_use : 'a @ unique -> unit = fun _ -> () + +let portable_use : 'a @ portable -> unit = fun _ -> () +[%%expect{| +val unique_use : unique_ 'a -> unit = +val portable_use : 'a @ portable -> unit = +|}] + +(* There is a closure_lock of legacy around a class. We test for comonadic and + monadic axes separately. *) + +(* class cannot refer to external local things *) +let foo () = + let local_ s = "hello" in + let module M = struct + class cla = object + val k = s + end + end in () +[%%expect{| +Line 5, characters 16-17: +5 | val k = s + ^ +Error: The value s is local, so cannot be used inside a class. +|}] + +(* class can refer to external unique things, but only as shared. *) +let foo () = + let unique_ s = "hello" in + let module M = struct + class cla = object + val k = unique_use s + end + end in () +[%%expect{| +Line 5, characters 27-28: +5 | val k = unique_use s + ^ +Error: This value is shared but expected to be unique. + Hint: This identifier cannot be used uniquely, + because it is defined in a class. +|}] + +(* instance variables need to be defined as legacy *) +class cla = object + val x = ("world" : _ @@ local) +end +[%%expect{| +Line 2, characters 12-34: +2 | val x = ("world" : _ @@ local) + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +(* instance variables are available as legacy to methods *) +class cla = object + val x = ("world" : _ @@ portable) + + method foo = portable_use x +end +[%%expect{| +Line 4, characters 30-31: +4 | method foo = portable_use x + ^ +Error: This value is nonportable but expected to be portable. +|}] + +(* values written to instance variables need to be legacy *) +class cla = object + val mutable x = "hello" + + method foo = x <- ("world" : _ @@ local) +end +[%%expect{| +Line 4, characters 22-44: +4 | method foo = x <- ("world" : _ @@ local) + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +class cla = object + method m = "hello" +end + +(* For Pexp_send, the object needs to be legacy *) +let foo () = + let local_ obj = new cla in + obj#m +[%%expect{| +class cla : object method m : string end +Line 8, characters 4-7: +8 | obj#m + ^^^ +Error: This value escapes its region. +|}] + +(* methods are available as legacy *) +let u = + let obj = new cla in + portable_use obj#m +[%%expect{| +Line 3, characters 17-22: +3 | portable_use obj#m + ^^^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* for methods, arguments can be of any modes *) +class cla = object + method foo (x : string) = portable_use x +end +[%%expect{| +class cla : object method foo : string @ portable -> unit end +|}] + +(* the argument mode is soundly required during application *) +let foo () = + let x @ nonportable = "hello" in + let o = new cla in + o#foo x +[%%expect{| +Line 4, characters 10-11: +4 | o#foo x + ^ +Error: This value is nonportable but expected to be portable. +|}] + + +(* Closing over classes affects closure's mode *) +let u = + let foo () = new cla in + portable_use foo +[%%expect{| +Line 3, characters 17-20: +3 | portable_use foo + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +module type SC = sig + class cla : object end +end +[%%expect{| +module type SC = sig class cla : object end end +|}] + +let u = + let foo () = + let m = (module struct class cla = object end end : SC) in + let module M = (val m) in + new M.cla + in + portable_use foo +[%%expect{| +val u : unit = () +|}] + +(* objects are always legacy *) +let u = + let obj = new cla in + portable_use obj +[%%expect{| +Line 3, characters 17-20: +3 | portable_use obj + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +let foo () = + let x = object end in + portable_use x +[%%expect{| +Line 3, characters 17-18: +3 | portable_use x + ^ +Error: This value is nonportable but expected to be portable. +|}] + +class cla = object + method m = + let o = {< >} in + portable_use o +end +[%%expect{| +Line 4, characters 21-22: +4 | portable_use o + ^ +Error: This value is nonportable but expected to be portable. +|}] diff --git a/testsuite/tests/typing-modes/def_nonportable.ml b/testsuite/tests/typing-modes/def_nonportable.ml new file mode 100644 index 00000000000..a9ef0cb445f --- /dev/null +++ b/testsuite/tests/typing-modes/def_nonportable.ml @@ -0,0 +1 @@ +let (f @ nonportable) x = x diff --git a/testsuite/tests/typing-modes/def_portable.ml b/testsuite/tests/typing-modes/def_portable.ml new file mode 100644 index 00000000000..79b11f3b0b6 --- /dev/null +++ b/testsuite/tests/typing-modes/def_portable.ml @@ -0,0 +1 @@ +let f x = x diff --git a/testsuite/tests/typing-modes/lazy.ml b/testsuite/tests/typing-modes/lazy.ml new file mode 100644 index 00000000000..672f5017a35 --- /dev/null +++ b/testsuite/tests/typing-modes/lazy.ml @@ -0,0 +1,25 @@ +(* TEST + expect; +*) + +(* lazy expression is legacy *) +let u = + let _x @ portable = lazy "hello" in + () +[%%expect{| +Line 2, characters 24-36: +2 | let _x @ portable = lazy "hello" in + ^^^^^^^^^^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* lazy body is legacy *) +let x = lazy ("hello" : _ @@ local) +[%%expect{| +Line 1, characters 13-35: +1 | let x = lazy ("hello" : _ @@ local) + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +(* Forcing lazy gives legacy, but that's in stdlib and not compiler *) diff --git a/testsuite/tests/typing-modes/letop.ml b/testsuite/tests/typing-modes/letop.ml new file mode 100644 index 00000000000..32dea72dc84 --- /dev/null +++ b/testsuite/tests/typing-modes/letop.ml @@ -0,0 +1,95 @@ +(* TEST + expect; +*) + +let portable_use : _ @ portable -> unit = fun _ -> () + +let ( let* ) o f = + match o with + | None -> None + | Some x -> f x + +let ( and* ) a b = + match a, b with + | Some a, Some b -> Some (a, b) + | _ -> None + +[%%expect{| +val portable_use : 'a @ portable -> unit = +val ( let* ) : 'a option -> ('a -> 'b option) -> 'b option = +val ( and* ) : 'a option -> 'b option -> ('a * 'b) option = +|}] + +(* bindings are required to be legacy *) +let foo () = + let* a = local_ "hello" in + () +[%%expect{| +Line 2, characters 13-27: +2 | let* a = local_ "hello" in + ^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let foo () = + let* a = Some "hello" + and* b = local_ "hello" in + () +[%%expect{| +Line 3, characters 13-27: +3 | and* b = local_ "hello" in + ^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +(* Bindings are avialable as legacy *) +let foo () = + let* a = Some (fun x -> x) + and* b = Some (fun x -> x) in + portable_use a +[%%expect{| +Line 4, characters 17-18: +4 | portable_use a + ^ +Error: This value is nonportable but expected to be portable. +|}] + +let foo () = + let* a = Some (fun x -> x) + and* b = Some (fun x -> x) in + portable_use b +[%%expect{| +Line 4, characters 17-18: +4 | portable_use b + ^ +Error: This value is nonportable but expected to be portable. +|}] + +(* Body required to be legacy *) +let foo () = + let _ = + let* a = Some (fun x -> x) in + local_ "hello" + in + () +[%%expect{| +Line 4, characters 8-22: +4 | local_ "hello" + ^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +(* The whole letop is available as legacy *) +let foo () = + portable_use ( + let* a = Some (fun x -> x) in + fun x -> x + ) +[%%expect{| +Lines 2-5, characters 17-5: +2 | .................( +3 | let* a = Some (fun x -> x) in +4 | fun x -> x +5 | ) +Error: This value is nonportable but expected to be portable. +|}] diff --git a/testsuite/tests/typing-modes/modes.ml b/testsuite/tests/typing-modes/modes.ml new file mode 100644 index 00000000000..23d091c4e24 --- /dev/null +++ b/testsuite/tests/typing-modes/modes.ml @@ -0,0 +1,397 @@ +(* TEST + expect; +*) + +(* Let bindings *) +let local_ foo : string @@ unique = "hello" +[%%expect{| +Line 1, characters 4-43: +1 | let local_ foo : string @@ unique = "hello" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let local_ foo @ unique = "hello" +[%%expect{| +Line 1, characters 4-33: +1 | let local_ foo @ unique = "hello" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let local_ foo : 'a. 'a -> 'a @@ unique = fun x -> x +[%%expect{| +Line 1, characters 4-52: +1 | let local_ foo : 'a. 'a -> 'a @@ unique = fun x -> x + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let foo : type a. a -> a @@ unique = fun x -> x +[%%expect{| +val foo : 'a -> 'a = +|}] + +let (x, y) @ local unique = "hello", "world" +[%%expect{| +Line 1, characters 4-44: +1 | let (x, y) @ local unique = "hello", "world" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let (x, y) : _ @@ local unique = "hello", "world" +[%%expect{| +Line 1, characters 4-49: +1 | let (x, y) : _ @@ local unique = "hello", "world" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let foo @ foo = "hello" +[%%expect{| +Line 1, characters 10-13: +1 | let foo @ foo = "hello" + ^^^ +Error: Unrecognized mode name foo. +|}] + +let foo () = + let bar @ local local = "hello" in + () +[%%expect{| +Line 2, characters 18-23: +2 | let bar @ local local = "hello" in + ^^^^^ +Error: The locality axis has already been specified. +|}] + +(* CR zqian: this should be supported *) +(* let foo a b @ local = "hello" +let foo a b : _ @@ local = "hello" *) + +(* Expressions *) +let foo = ("hello" : _ @@ local) +[%%expect{| +Line 1, characters 10-32: +1 | let foo = ("hello" : _ @@ local) + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +(* this is not mode annotation *) +let foo = ("hello" @ local) +[%%expect{| +Line 1, characters 11-18: +1 | let foo = ("hello" @ local) + ^^^^^^^ +Error: This expression has type string but an expression was expected of type + 'a list +|}] + +(* CR zqian: Support the following in the future. Currently skipped for + simplicity in the ocamlformat. +let foo ~bar = bar ^ "hello" + +let x = + let bar = "world" in + foo ~(bar : _ @@ unique) +[%%expect{| +val foo : bar:string -> string = +Line 5, characters 8-11: +5 | foo ~(bar : _ @@ unique) + ^^^ +Error: Found a shared value where a unique value was expected +|}] + +let x = + let bar = "world" in + foo ~(bar @ unique) +[%%expect{| +Line 3, characters 8-11: +3 | foo ~(bar @ unique) + ^^^ +Error: Found a shared value where a unique value was expected +|}] + +type r = {a : string; b : string} + +let r = {a : _ @@ unique = "hello"; + b : _ @@ once = "world"} +[%%expect{| +type r = { a : string; b : string; } +Line 4, characters 11-32: +4 | b : _ @@ once = "world"} + ^^^^^^^^^^^^^^^^^^^^^ +Error: Found a once value where a many value was expected +|}] + +let r = {a @ unique = "hello"; + b @ once = "world"} +[%%expect{| +Line 2, characters 11-27: +2 | b @ once = "world"} + ^^^^^^^^^^^^^^^^ +Error: Found a once value where a many value was expected +|}] + +let foo () = + let bar = "hello" in + let biz = "world" in + ~(bar:_@@unique), ~(biz:_@@once) +[%%expect{| +Line 4, characters 4-7: +4 | ~(bar:_@@unique), ~(biz:_@@once) + ^^^ +Error: Found a shared value where a unique value was expected +|}] + + +let foo () = + let bar = "hello" in + let biz = "world" in + ~(bar @ unique), ~(biz @ once) +[%%expect{| +Line 4, characters 4-7: +4 | ~(bar @ unique), ~(biz @ once) + ^^^ +Error: Found a shared value where a unique value was expected +|}] +*) + +(* arrow types *) +type r = local_ string @ unique once -> unique_ string @ local once +[%%expect{| +type r = local_ once_ unique_ string -> local_ once_ unique_ string +|}] + +type r = local_ string * y:string @ unique once -> local_ string * w:string @ once +[%%expect{| +type r = local_ once_ unique_ string * string -> local_ once_ string * string +|}] + +type r = x:local_ string * y:string @ unique once -> local_ string * w:string @ once +[%%expect{| +type r = + x:local_ once_ unique_ string * string -> local_ once_ string * string +|}] + + +type r = local_ string @ foo -> string +[%%expect{| +Line 1, characters 25-28: +1 | type r = local_ string @ foo -> string + ^^^ +Error: Unrecognized mode name foo. +|}] + +type r = local_ string @ local -> string +[%%expect{| +Line 1, characters 25-30: +1 | type r = local_ string @ local -> string + ^^^^^ +Error: The locality axis has already been specified. +|}] + +(* Mixing legacy and new modes *) +type r = local_ unique_ once_ string -> string +[%%expect{| +type r = local_ once_ unique_ string -> string +|}] + +type r = local_ unique_ once_ string @ portable contended -> string +[%%expect{| +type r = local_ once_ unique_ string @ portable contended -> string +|}] + +type r = string @ local unique once portable contended -> string +[%%expect{| +type r = local_ once_ unique_ string @ portable contended -> string +|}] + +type r = string @ local unique once nonportable uncontended -> string +[%%expect{| +type r = local_ once_ unique_ string -> string +|}] + + +(* modality on constructor arguments and record fields *) + +type t = Foo of string @@ global * global_ string +[%%expect{| +type t = Foo of global_ string * global_ string +|}] + +type t = Foo of string @@ foo +[%%expect{| +Line 1, characters 26-29: +1 | type t = Foo of string @@ foo + ^^^ +Error: Unrecognized modality foo. +|}] + +type t = Foo of global_ string @@ global +(* CR reduced-modality: this should warn. *) +[%%expect{| +type t = Foo of global_ string +|}] + +type r = { + x : string @@ global +} +[%%expect{| +type r = { global_ x : string; } +|}] + +type r = { + x : string @@ foo +} +[%%expect{| +Line 2, characters 16-19: +2 | x : string @@ foo + ^^^ +Error: Unrecognized modality foo. +|}] + +type r = { + global_ x : string @@ global +} +(* CR reduced-modality: this should warn. *) +[%%expect{| +type r = { global_ x : string; } +|}] + +(* Modalities don't imply each other; this will change as we add borrowing. *) +type r = { + global_ x : string @@ shared +} +[%%expect{| +type r = { global_ x : string @@ shared; } +|}] + +type r = { + x : string @@ shared global many +} +[%%expect{| +type r = { global_ x : string @@ many shared; } +|}] + +type r = { + x : string @@ shared global many shared +} +(* CR reduced-modality: this should warn. *) +[%%expect{| +type r = { global_ x : string @@ many shared; } +|}] + +type r = Foo of string @@ global shared many +[%%expect{| +type r = Foo of global_ string @@ many shared +|}] + +(* mutable implies global shared many. No warnings are given since we imagine + that the coupling will be removed soon. *) +type r = { + mutable x : string @@ global shared many +} +[%%expect{| +type r = { mutable x : string; } +|}] + + +(* patterns *) + +let foo ?(local_ x @ unique once = 42) () = () +[%%expect{| +val foo : ?x:local_ once_ unique_ int -> unit -> unit = +|}] + +let foo ?(local_ x : _ @@ unique once = 42) () = () +[%%expect{| +val foo : ?x:local_ once_ unique_ int -> unit -> unit = +|}] + +let foo ?(local_ x : 'a. 'a -> 'a @@ unique once) = () +[%%expect{| +Line 1, characters 17-48: +1 | let foo ?(local_ x : 'a. 'a -> 'a @@ unique once) = () + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Optional parameters cannot be polymorphic +|}] + +let foo ?x:(local_ (x,y) @ unique once = (42, 42)) () = () +[%%expect{| +val foo : ?x:local_ once_ unique_ int * int -> unit -> unit = +|}] + +let foo ?x:(local_ (x,y) : _ @@ unique once = (42, 42)) () = () +[%%expect{| +val foo : ?x:local_ once_ unique_ int * int -> unit -> unit = +|}] + +let foo ?x:(local_ (x,y) : 'a.'a->'a @@ unique once) () = () +[%%expect{| +Line 1, characters 19-36: +1 | let foo ?x:(local_ (x,y) : 'a.'a->'a @@ unique once) () = () + ^^^^^^^^^^^^^^^^^ +Error: Optional parameters cannot be polymorphic +|}] + +(* note: Legacy mode syntax is not parsed for patterns *) + +(* CR zqian: currently all patterns, except those directly as function + arguments, DO NOT pick up modes during type checking. This should be fixed in + another PR. Here, we test that they at least parse. *) +let foo ((x @ unique once), (y@local unique)) = x + y +[%%expect{| +Line 1, characters 14-25: +1 | let foo ((x @ unique once), (y@local unique)) = x + y + ^^^^^^^^^^^ +Error: Mode annotations on patterns are not supported yet. +|}] + +let foo ((x : _ @@ unique once), (y : _ @@ local unique)) = x + y +[%%expect{| +Line 1, characters 19-30: +1 | let foo ((x : _ @@ unique once), (y : _ @@ local unique)) = x + y + ^^^^^^^^^^^ +Error: Mode annotations on patterns are not supported yet. +|}] + +(* let-bound function *) +(* by default, all strings following @ are parsed as modes, not argument *) +let foo () = + let bar @ unique local once = () in + bar +[%%expect{| +val foo : unit -> unit = +|}] + +let foo () = + let bar @ unique local foo = () in + bar +[%%expect{| +Line 2, characters 25-28: +2 | let bar @ unique local foo = () in + ^^^ +Error: Unrecognized mode name foo. +|}] + +let foo () = + let (bar @ local) a b = () in + bar 42 24; + () +[%%expect{| +val foo : unit -> unit = +|}] + +(* modalities on normal values requires [-extension mode_alpha] *) +module type S = sig + val x : string -> string @ local @@ foo bar +end +[%%expect{| +Line 2, characters 38-41: +2 | val x : string -> string @ local @@ foo bar + ^^^ +Error: The extension "mode" is disabled and cannot be used +|}] diff --git a/testsuite/tests/typing-modes/module.ml b/testsuite/tests/typing-modes/module.ml new file mode 100644 index 00000000000..c8b74e83ddd --- /dev/null +++ b/testsuite/tests/typing-modes/module.ml @@ -0,0 +1,182 @@ +(* TEST + expect; +*) + +(* This file tests the legacy aspect of modules. The non-legacy aspects are + tested in [val_modalities.ml]. As we enrich modules with modes, this file + will shrink. *) + +let portable_use : 'a @ portable -> unit = fun _ -> () + +module type S = sig val x : 'a -> unit end + +module type SL = sig type 'a t end + +module M = struct + type 'a t = int + let x _ = () +end +module F (X : S) = struct + type t = int + let x = X.x +end +[%%expect{| +val portable_use : 'a @ portable -> unit = +module type S = sig val x : 'a -> unit end +module type SL = sig type 'a t end +module M : sig type 'a t = int val x : 'a -> unit end +module F : functor (X : S) -> sig type t = int val x : 'a -> unit end +|}] + +(* Closing over modules affects closure's modes *) +let u = + let foo () = + let _ = (module M : S) in + () + in + portable_use foo +[%%expect{| +Line 6, characters 17-20: +6 | portable_use foo + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +let u = + let foo () = + let module X = struct + let x _ = () + end + in + let module R = F(X) in + () + in + portable_use foo +[%%expect{| +Line 10, characters 17-20: +10 | portable_use foo + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* File-level modules are looked up differently and need to be tested +separately. *) +let u = + let foo () = + let _ = (module List : SL) in + () + in + portable_use foo +[%%expect{| +Line 6, characters 17-20: +6 | portable_use foo + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +let u = + let foo () = + let m = (module struct let x _ = () end : S) in + let module M = (val m) in + M.x + in + portable_use foo +[%%expect{| +val u : unit = () +|}] + +(* first class modules are produced at legacy *) +let x = ((module M : SL) : _ @@ portable) +[%%expect{| +Line 1, characters 9-24: +1 | let x = ((module M : SL) : _ @@ portable) + ^^^^^^^^^^^^^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* first class modules are consumed at legacy *) +let foo () = + let m @ local = (module M : SL) in + let module M = (val m) in + () +[%%expect{| +Line 3, characters 24-25: +3 | let module M = (val m) in + ^ +Error: This value escapes its region. +|}] + +let foo () = + let bar () = + let _ : F(M).t = 42 in + () + in + let _ = (bar : _ @@ portable) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +let foo () = + let bar () = + let module _ : sig + open M + end = struct end + in + () + in + let _ = (bar : _ @@ portable) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +let foo () = + let bar () = + let module _ : (sig + module M' : sig end + end with module M' := M) = struct + end + in + () + in + let _ = (bar : _ @@ portable) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +(* Replacing [:=] in the above example with [=] should work similarly, but I + couldn't construct an example to test this properly. *) + +let foo () = + let bar () = + let module _ : module type of M = struct + type 'a t = int + let x _ = () + end + in + () + in + let _ = (bar : _ @@ portable) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +let foo () = + let bar () = + let module _ : (sig + module M' := M + end) = struct + end + in + () + in + let _ = (bar : _ @@ portable) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +(* Pmty_alias is not testable *) diff --git a/testsuite/tests/typing-modes/mutable.ml b/testsuite/tests/typing-modes/mutable.ml new file mode 100644 index 00000000000..3028efc7a34 --- /dev/null +++ b/testsuite/tests/typing-modes/mutable.ml @@ -0,0 +1,175 @@ +(* TEST + flags = "-extension unique -w +53"; + expect; +*) + +(* This file tests the typing around mutable() logic. *) + +(* By default, mutable implies [global many shared] modalities *) +type r = {mutable s : string} +let foo (local_ s) = local_ {s} +[%%expect{| +type r = { mutable s : string; } +Line 2, characters 29-30: +2 | let foo (local_ s) = local_ {s} + ^ +Error: This value escapes its region. +|}] + +(* [@no_mutable_implied_modalities] disables those implied modalities, and + allows us to test [mutable] alone *) + +(* Note the attribute is not printed back, which might be confusing. + Considering this is a short-term workaround, let's not worry too much. *) +type 'a r = {mutable s : 'a [@no_mutable_implied_modalities]} +[%%expect{| +type 'a r = { mutable s : 'a; } +|}] + +(* We can now construct a local record using a local field. *) +let foo (local_ s) = local_ {s} +[%%expect{| +val foo : local_ 'a -> local_ 'a r = +|}] + +(* Mutation needs to be global *) +let foo (local_ r) = + r.s <- (local_ "hello") +[%%expect{| +Line 2, characters 9-25: +2 | r.s <- (local_ "hello") + ^^^^^^^^^^^^^^^^ +Error: This value escapes its region. +|}] + +let foo (local_ r) = ref r.s +[%%expect{| +Line 1, characters 25-28: +1 | let foo (local_ r) = ref r.s + ^^^ +Error: This value escapes its region. +|}] + +let foo (local_ r) = + r.s <- "hello" +[%%expect{| +val foo : local_ string r -> unit = +|}] + +(* We can still add modalities explicitly. Of course, the print-back is + confusing. *) +type r' = {mutable s' : string @@ global [@no_mutable_implied_modalities]} +[%%expect{| +type r' = { mutable global_ s' : string; } +|}] + +let foo (local_ s') = local_ {s'} +[%%expect{| +Line 1, characters 30-32: +1 | let foo (local_ s') = local_ {s'} + ^^ +Error: This value escapes its region. +|}] + +(* mutable defaults to mutable(legacy = nonportable), so currently we can't construct a + portable record (ignoring mode-crossing). *) +let foo (s @ portable) = ({s} : _ @@ portable) +[%%expect{| +Line 1, characters 26-29: +1 | let foo (s @ portable) = ({s} : _ @@ portable) + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* For monadic axes, mutable defaults to mutable(min). So currently we can't + write a [contended] value to a mutable field. *) +let foo (r @ uncontended) (s @ contended) = r.s <- s +[%%expect{| +Line 1, characters 51-52: +1 | let foo (r @ uncontended) (s @ contended) = r.s <- s + ^ +Error: This value is contended but expected to be uncontended. +|}] + +module M : sig + type t = { mutable s : string [@no_mutable_implied_modalities] } +end = struct + type t = { mutable s : string } +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { mutable s : string } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { mutable s : string; } end + is not included in + sig type t = { mutable s : string; } end + Type declarations do not match: + type t = { mutable s : string; } + is not included in + type t = { mutable s : string; } + Fields do not match: + mutable s : string; + is not the same as: + mutable s : string; + The second is empty and the first is shared. +|}] + +module M : sig + type t = { mutable s : string } +end = struct + type t = { mutable s : string [@no_mutable_implied_modalities] } +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { mutable s : string [@no_mutable_implied_modalities] } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { mutable s : string; } end + is not included in + sig type t = { mutable s : string; } end + Type declarations do not match: + type t = { mutable s : string; } + is not included in + type t = { mutable s : string; } + Fields do not match: + mutable s : string; + is not the same as: + mutable s : string; + The second is global_ and the first is not. +|}] + +type r = + { f : string -> string; + mutable a : int } +let r @ portable = + { f = (fun x -> x); + a = 42 } +(* CR mode-crossing: The [m0] in mutable should cross modes upon construction. *) +[%%expect{| +type r = { f : string -> string; mutable a : int; } +Lines 5-6, characters 2-12: +5 | ..{ f = (fun x -> x); +6 | a = 42 } +Error: This value is nonportable but expected to be portable. +|}] + +type r = + { f : string -> string; + mutable g : string -> string @@ portable } +let r @ portable = + { f = (fun x -> x); + g = fun x -> x } +(* CR mode-crossing: The [m0] in mutable corresponds to the field type wrapped + in modality; as a result, it enjoys mode crossing enabled by the modality. *) +[%%expect{| +type r = { f : string -> string; mutable g : string -> string @@ portable; } +Lines 5-6, characters 2-20: +5 | ..{ f = (fun x -> x); +6 | g = fun x -> x } +Error: This value is nonportable but expected to be portable. +|}] diff --git a/testsuite/tests/typing-modes/portable-contend.ml b/testsuite/tests/typing-modes/portable-contend.ml new file mode 100644 index 00000000000..e085edb85c4 --- /dev/null +++ b/testsuite/tests/typing-modes/portable-contend.ml @@ -0,0 +1,266 @@ +(* TEST + include stdlib_stable; + expect; +*) + +type r = {mutable a : bytes; b : bytes} + +let best_bytes : unit -> bytes @ portable uncontended + = Obj.magic (fun () -> Bytes.empty) +[%%expect{| +type r = { mutable a : bytes; b : bytes; } +val best_bytes : unit -> bytes @ portable = +|}] + +(* TESTING records *) + +(* Reading/writing mutable field from contended record is rejected. Also note + that the mutation error precedes type error. *) +let foo (r @ contended) = r.a <- 42 +[%%expect{| +Line 1, characters 26-27: +1 | let foo (r @ contended) = r.a <- 42 + ^ +Error: This value is contended but expected to be uncontended. + Hint: In order to write into the mutable fields, + this record needs to be uncontended. +|}] + +let foo (r @ contended) = r.a +[%%expect{| +Line 1, characters 26-27: +1 | let foo (r @ contended) = r.a + ^ +Error: This value is contended but expected to be uncontended. + Hint: In order to read from the mutable fields, + this record needs to be uncontended. +|}] + +let foo (r @ contended) = {r with a = best_bytes ()} +[%%expect{| +val foo : r @ contended -> r @ contended = +|}] + +let foo (r @ contended) = {r with b = best_bytes ()} +[%%expect{| +Line 1, characters 27-28: +1 | let foo (r @ contended) = {r with b = best_bytes ()} + ^ +Error: This value is contended but expected to be uncontended. + Hint: In order to read from the mutable fields, + this record needs to be uncontended. +|}] + +(* reading immutable field from contended record is fine *) +let foo (r @ contended) = r.b +[%%expect{| +val foo : r @ contended -> bytes @ contended = +|}] + +(* Force top level to be uncontended and nonportable *) +let r @ contended = best_bytes () +[%%expect{| +Line 1, characters 4-33: +1 | let r @ contended = best_bytes () + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value is contended but expected to be uncontended. +|}] + +let x @ portable = best_bytes () + +let y @ portable = x +[%%expect{| +val x : bytes = Bytes.of_string "" +Line 3, characters 19-20: +3 | let y @ portable = x + ^ +Error: This value is nonportable but expected to be portable. +|}] + +(* Closing over writing mutable field gives nonportable *) +let foo () = + let r = {a = best_bytes (); b = best_bytes ()} in + let bar () = r.a <- best_bytes () in + let _ @ portable = bar in + () +[%%expect{| +Line 4, characters 23-26: +4 | let _ @ portable = bar in + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* Closing over reading mutable field gives nonportable *) +let foo () = + let r = {a = best_bytes (); b = best_bytes ()} in + let bar () = let _ = r.a in () in + let _ @ portable = bar in + () +[%%expect{| +Line 4, characters 23-26: +4 | let _ @ portable = bar in + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* Closing over reading immutable field is OK *) +let foo () = + let r @ portable = {a = best_bytes (); b = best_bytes ()} in + let bar () = let _ = r.b in () in + let _ @ portable = bar in + () +(* CR zqian: currently mutable(legacy) means all records constructed are nonportable, + and the above bar is closing over an nonportable record. Once we allow mutable() + syntax, we can test this. *) +[%%expect{| +Line 2, characters 23-61: +2 | let r @ portable = {a = best_bytes (); b = best_bytes ()} in + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value is nonportable but expected to be portable. +|}] + + +(* TESTING arrays *) +(* reading/writing to array requires uncontended *) +let foo (r @ contended) = Array.set r 42 (best_bytes ()) +[%%expect{| +Line 1, characters 36-37: +1 | let foo (r @ contended) = Array.set r 42 (best_bytes ()) + ^ +Error: This value is contended but expected to be uncontended. +|}] +let foo (r @ contended) = Array.get r 42 +[%%expect{| +Line 1, characters 36-37: +1 | let foo (r @ contended) = Array.get r 42 + ^ +Error: This value is contended but expected to be uncontended. +|}] +let foo (r @ contended) = + match r with + | [| x; y |] -> () +[%%expect{| +Line 3, characters 6-16: +3 | | [| x; y |] -> () + ^^^^^^^^^^ +Error: This value is contended but expected to be uncontended. + Hint: In order to read from the mutable fields, + this record needs to be uncontended. +|}] + + +(* Closing over write gives nonportable *) +let foo () = + let r = [| best_bytes (); best_bytes () |] in + let bar () = Array.set r 0 (best_bytes ()) in + let _ @ portable = bar in + () +[%%expect{| +Line 4, characters 23-26: +4 | let _ @ portable = bar in + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +(* Closing over read gives nonportable *) +let foo () = + let r = [| best_bytes (); best_bytes () |] in + let bar () = Array.get r 0 in + let _ @ portable = bar in + () +[%%expect{| +Line 4, characters 23-26: +4 | let _ @ portable = bar in + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + + +(* Closing over Array.length doesn't force nonportable; but that needs a + modified stdlib. Once modified the test is trivial. So we omit that. *) + + +(* OTHER TESTS *) +(* Closing over uncontended but doesn't exploit that; the function is still +portable. *) +let foo () = + let r @ portable uncontended = best_bytes () in + let bar () = let _ = r in () in + let _ @ portable = bar in + () +[%%expect{| +val foo : unit -> unit = +|}] + +(* Closing over nonportable forces nonportable. *) +let foo () = + let r @ nonportable = best_bytes () in + let bar () = let _ = r in () in + let _ @ portable = bar in + () +[%%expect{| +Line 4, characters 23-26: +4 | let _ @ portable = bar in + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +let foo : 'a @ nonportable contended -> ('a -> 'a) @ portable = fun a b -> best_bytes () +[%%expect{| +Line 1, characters 64-88: +1 | let foo : 'a @ nonportable contended -> ('a -> 'a) @ portable = fun a b -> best_bytes () + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This function when partially applied returns a value which is nonportable, + but expected to be portable. +|}] + +let foo : 'a @ uncontended portable -> (string -> string) @ portable = fun a b -> best_bytes () +[%%expect{| +Line 1, characters 82-95: +1 | let foo : 'a @ uncontended portable -> (string -> string) @ portable = fun a b -> best_bytes () + ^^^^^^^^^^^^^ +Error: This expression has type bytes but an expression was expected of type + string +|}] + +let foo : 'a @ contended portable -> (string -> string) @ portable @@ nonportable contended = fun a b -> best_bytes () +(* CR layouts v2.8: arrows should cross contention. *) +[%%expect{| +Line 1, characters 4-118: +1 | let foo : 'a @ contended portable -> (string -> string) @ portable @@ nonportable contended = fun a b -> best_bytes () + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This value is contended but expected to be uncontended. +|}] + +let foo : 'a @ contended portable -> (string -> string) @ portable @@ uncontended portable = fun a b -> best_bytes () +[%%expect{| +Line 1, characters 104-114: +1 | let foo : 'a @ contended portable -> (string -> string) @ portable @@ uncontended portable = fun a b -> best_bytes () + ^^^^^^^^^^ +Error: The value best_bytes is nonportable, so cannot be used inside a closure that is portable. +|}] + +(* immediates crosses portability and contention *) +let foo (x : int @@ nonportable) (y : int @@ contended) = + let _ @ portable = x in + let _ @ uncontended = y in + () +[%%expect{| +val foo : int -> int @ contended -> unit = +|}] + +(* TESTING immutable array *) +module Iarray = Stdlib_stable.Iarray + +let foo (r @ contended) = Iarray.get r 42 +(* CR zqian: The following should pass; the modal kind system should mode cross +iarray depending on the type of its element. *) +[%%expect{| +module Iarray = Stdlib_stable.Iarray +Line 3, characters 37-38: +3 | let foo (r @ contended) = Iarray.get r 42 + ^ +Error: This value is contended but expected to be uncontended. +|}] + +(* CR zqian: add portable/uncontended modality and test. *) diff --git a/testsuite/tests/typing-modes/syntax-error.compilers.reference b/testsuite/tests/typing-modes/syntax-error.compilers.reference new file mode 100644 index 00000000000..1880b7e6608 --- /dev/null +++ b/testsuite/tests/typing-modes/syntax-error.compilers.reference @@ -0,0 +1,131 @@ +Line 5, characters 27-28: +5 | let local_ foo : string @@ = "hello";; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 17-18: +2 | let local_ foo @ = "hello";; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 34-35: +2 | let local_ foo : 'a. 'a -> 'a @@ = fun x -> x;; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 29-30: +2 | let foo : type a. a -> a @@ = fun x -> x;; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 13-14: +2 | let (x, y) @ = "hello", "world";; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 18-19: +2 | let (x, y) : _ @@ = "hello", "world";; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 10-11: +2 | let foo @ = "hello";; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 26-27: +2 | let foo = ("hello" : _ @@ );; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 21-22: +2 | let foo = ("hello" @ );; + ^ +Error: Syntax error +val foo : bar:string -> string = +Line 4, characters 16-18: +4 | foo ~(bar : _ @@ ) + ^^ +Error: Syntax error +Line 4, characters 12-13: +4 | foo ~(bar @ ) + ^ +Error: Syntax error +type r = { a : string; b : string; } +Line 2, characters 15-17: +2 | let r = {a : _ @@ = "hello"; + ^^ +Error: Syntax error: '}' expected +Line 2, characters 8-9: +2 | let r = {a : _ @@ = "hello"; + ^ + This '{' might be unmatched +Line 3, characters 5-6: +3 | {a @ = "hello"; + ^ +Error: Syntax error: '}' expected +Line 3, characters 2-3: +3 | {a @ = "hello"; + ^ + This '{' might be unmatched +Line 5, characters 9-11: +5 | ~(bar:_@@), ~(biz:_@@) + ^^ +Error: Syntax error +Line 5, characters 8-9: +5 | ~(bar @ ), ~(biz @ ) + ^ +Error: Syntax error +Line 2, characters 26-28: +2 | type r = local_ string @ -> unique_ string @ ;; + ^^ +Error: Syntax error: mode expression expected. +Line 2, characters 37-39: +2 | type r = local_ string * y:string @ -> local_ string * w:string @;; + ^^ +Error: Syntax error: mode expression expected. +Line 2, characters 39-41: +2 | type r = x:local_ string * y:string @ -> local_ string * w:string @;; + ^^ +Error: Syntax error: mode expression expected. +Line 2, characters 25-27: +2 | type r = local_ string @ -> string;; + ^^ +Error: Syntax error: mode expression expected. +Line 2, characters 26-27: +2 | type t = Foo of string @@ * global_ string;; + ^ +Error: Syntax error: modality expression expected. +Line 4, characters 0-1: +4 | } + ^ +Error: Syntax error: modality expression expected. +Line 2, characters 21-22: +2 | let foo ?(local_ x @ = 42) () = () ;; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 26-27: +2 | let foo ?(local_ x : _ @@ = 42) () = ();; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 37-38: +2 | let foo ?(local_ x : 'a. 'a -> 'a @@ ) = ();; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 27-28: +2 | let foo ?x:(local_ (x,y) @ = (42, 42)) () = ();; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 32-33: +2 | let foo ?x:(local_ (x,y) : _ @@ = (42, 42)) () = ();; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 40-41: +2 | let foo ?x:(local_ (x,y) : 'a.'a->'a @@ ) () = ();; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 14-15: +2 | let foo ((x @ ), (y@)) = x + y ;; + ^ +Error: Syntax error: mode expression expected. +Line 2, characters 19-20: +2 | let foo ((x : _ @@ ), (y : _ @@ )) = x + y;; + ^ +Error: Syntax error: mode expression expected. +Line 3, characters 13-14: +3 | let (bar @ ) a b = () in + ^ +Error: Syntax error: mode expression expected. + diff --git a/testsuite/tests/typing-modes/syntax-error.ml b/testsuite/tests/typing-modes/syntax-error.ml new file mode 100644 index 00000000000..33e66cfb5f8 --- /dev/null +++ b/testsuite/tests/typing-modes/syntax-error.ml @@ -0,0 +1,93 @@ +(* TEST + toplevel; +*) + +let local_ foo : string @@ = "hello";; + +let local_ foo @ = "hello";; + +let local_ foo : 'a. 'a -> 'a @@ = fun x -> x;; + +let foo : type a. a -> a @@ = fun x -> x;; + +let (x, y) @ = "hello", "world";; + +let (x, y) : _ @@ = "hello", "world";; + +let foo @ = "hello";; + +let foo = ("hello" : _ @@ );; + +let foo = ("hello" @ );; + +let foo ~bar = bar ^ "hello";; + +let x = + let bar = "world" in + foo ~(bar : _ @@ ) +;; + +let x = + let bar = "world" in + foo ~(bar @ ) +;; + +type r = {a : string; b : string};; + +let r = {a : _ @@ = "hello"; + b : _ @@ = "world"} +;; + +let r = + {a @ = "hello"; + b @ = "world"} +;; + +let foo () = + let bar = "hello" in + let biz = "world" in + ~(bar:_@@), ~(biz:_@@) +;; + +let foo () = + let bar = "hello" in + let biz = "world" in + ~(bar @ ), ~(biz @ ) +;; + +type r = local_ string @ -> unique_ string @ ;; + +type r = local_ string * y:string @ -> local_ string * w:string @;; + +type r = x:local_ string * y:string @ -> local_ string * w:string @;; + +type r = local_ string @ -> string;; + +type t = Foo of string @@ * global_ string;; + +type r = { + x : string @@ +} +;; + +let foo ?(local_ x @ = 42) () = () ;; + +let foo ?(local_ x : _ @@ = 42) () = ();; + +let foo ?(local_ x : 'a. 'a -> 'a @@ ) = ();; + +let foo ?x:(local_ (x,y) @ = (42, 42)) () = ();; + +let foo ?x:(local_ (x,y) : _ @@ = (42, 42)) () = ();; + +let foo ?x:(local_ (x,y) : 'a.'a->'a @@ ) () = ();; + +let foo ((x @ ), (y@)) = x + y ;; + +let foo ((x : _ @@ ), (y : _ @@ )) = x + y;; + +let foo () = + let (bar @ ) a b = () in + bar 42 24; + () +;; diff --git a/testsuite/tests/typing-modes/use_portable.bad.reference b/testsuite/tests/typing-modes/use_portable.bad.reference new file mode 100644 index 00000000000..83cca43971f --- /dev/null +++ b/testsuite/tests/typing-modes/use_portable.bad.reference @@ -0,0 +1,4 @@ +File "use_portable.ml", line 3, characters 22-38: +3 | let () = portable_use Maybe_portable.f + ^^^^^^^^^^^^^^^^ +Error: This value is nonportable but expected to be portable. diff --git a/testsuite/tests/typing-modes/use_portable.ml b/testsuite/tests/typing-modes/use_portable.ml new file mode 100644 index 00000000000..a22b330afb2 --- /dev/null +++ b/testsuite/tests/typing-modes/use_portable.ml @@ -0,0 +1,3 @@ +let portable_use : _ @ portable -> _ = fun _ -> () + +let () = portable_use Maybe_portable.f diff --git a/testsuite/tests/typing-modes/val_modalities.ml b/testsuite/tests/typing-modes/val_modalities.ml new file mode 100644 index 00000000000..461dd0211ab --- /dev/null +++ b/testsuite/tests/typing-modes/val_modalities.ml @@ -0,0 +1,363 @@ +(* TEST + flags = "-extension unique -extension mode_alpha"; + expect; +*) + +type r = { + mutable x : string; +} + +(* In below, printing always gives the strongest modalities possible. Printing + backtracks the "zapping to strongest" mutation, so the mutation doesn't + persist. *) + +let uncontended_use (_ @ uncontended) = () +[%%expect{| +type r = { mutable x : string; } +val uncontended_use : 'a -> unit @@ global many = +|}] + +let share_use : 'a -> unit @@ portable = fun _ -> () +[%%expect{| +val share_use : 'a -> unit @@ global many = +|}] + +let (portable_use @ portable) (_ @ portable) = () +[%%expect{| +val portable_use : 'a @ portable -> unit @@ global many = +|}] + +(* The compiler building itself is a comprehensive test of legacy modules/values. + Below we test non-legacy values in modules. *) + +module M = struct + let foo = {x = "hello"} +end +[%%expect{| +module M : sig val foo : r @@ global many end +|}] + +module type S = sig + val x : string @@ global local unique shared once many uncontended contended + portable nonportable +end +[%%expect{| +module type S = + sig val x : string @@ global many portable shared contended end +|}] + +(* values' comonadic axes must be lower than the module *) +module M = struct + let local_ x = "hello" +end +[%%expect{| +Line 2, characters 15-16: +2 | let local_ x = "hello" + ^ +Error: This value is local, but expected to be global because it is inside a module. +|}] + +(* Monadic axes don't have such constraint *) +module M = struct + let x @ contended = "hello" +end +[%%expect{| +module M : sig val x : string @@ global many portable contended end +|}] + +(* Testing the defaulting behaviour. + "module type of" triggers the defaulting logic. + Note that the defaulting will mutate the original module type. +*) +module Module_type_of_comonadic = struct + module M = struct + let x @ portable = "hello" + end + (* for comonadic axes, we default to id = meet_with_max, which is the + weakest. The original modality is not mutated. *) + module M' : module type of M = struct + let x @ portable = "hello" + end + let _ = portable_use M.x (* The original modality stays portable *) + let _ = portable_use M'.x +end +[%%expect{| +Line 11, characters 25-29: +11 | let _ = portable_use M'.x + ^^^^ +Error: This value is nonportable but expected to be portable. +|}] + +module Module_type_of_monadic = struct + module M = struct + let x @ uncontended = "hello" + end + module M' : module type of M = M + (* for monadic axes, we try to push to the id = join_with_min. The original + modality is pushed to floor. *) + module M' : module type of M = struct + let x @ contended = "hello" + end +end +[%%expect{| +Lines 8-10, characters 35-7: + 8 | ...................................struct + 9 | let x @ contended = "hello" +10 | end +Error: Signature mismatch: + Modules do not match: + sig val x : string @@ global many portable contended end + is not included in + sig val x : string end + Values do not match: + val x : string @@ global many portable contended + is not included in + val x : string + The second is empty and the first is contended. +|}] + +module Module_type_nested = struct + module M = struct + let x @ contended portable = "hello" + module N = struct + let y @ uncontended portable = "world" + end + end + module M' : module type of M = struct + let x = "hello" + module N = struct + let y @ contended = "hello" + end + end +end +[%%expect{| +Lines 8-13, characters 35-7: + 8 | ...................................struct + 9 | let x = "hello" +10 | module N = struct +11 | let y @ contended = "hello" +12 | end +13 | end +Error: Signature mismatch: + Modules do not match: + sig + val x : string @@ global many portable + module N : + sig val y : string @@ global many portable contended end + end + is not included in + sig + val x : string @@ contended + module N : sig val y : string end + end + In module N: + Modules do not match: + sig val y : string @@ global many portable contended end + is not included in + sig val y : string end + In module N: + Values do not match: + val y : string @@ global many portable contended + is not included in + val y : string + The second is empty and the first is contended. +|}] + +(* When defaulting, prioritize modes in arrow types over modalities. *) +(* CR zqian: add tests when this becomes testable. *) + +(* When module doesn't have signature, the values' modes/modalities are still + flexible. *) +module Without_inclusion = struct + module M = struct + let x @ portable = "hello" + end + let () = portable_use M.x +end +[%%expect{| +module Without_inclusion : + sig module M : sig val x : string @@ global many portable end end +|}] + +module Without_inclusion = struct + module M = struct + let x @ nonportable = "hello" + end + let () = portable_use M.x +end +[%%expect{| +Line 5, characters 26-29: +5 | let () = portable_use M.x + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +module Inclusion_fail = struct + module M : sig + val x : string @@ uncontended + end = struct + let x @ contended = "hello" + end +end +[%%expect{| +Lines 4-6, characters 10-7: +4 | ..........struct +5 | let x @ contended = "hello" +6 | end +Error: Signature mismatch: + Modules do not match: + sig val x : string @@ global many portable contended end + is not included in + sig val x : string end + Values do not match: + val x : string @@ global many portable contended + is not included in + val x : string + The second is empty and the first is contended. +|}] + +module Inclusion_weakens_monadic = struct + module M : sig + val x : string @@ contended + end = struct + let x @ uncontended = "hello" + end + let _ = uncontended_use M.x +end +[%%expect{| +Line 7, characters 28-31: +7 | let _ = uncontended_use M.x + ^^^ +Error: This value is contended but expected to be uncontended. +|}] + +module Inclusion_weakens_comonadic = struct + module M : sig + val x : string @@ nonportable + end = struct + let x @ portable = "hello" + end + let _ = portable_use M.x +end +[%%expect{| +Line 7, characters 23-26: +7 | let _ = portable_use M.x + ^^^ +Error: This value is nonportable but expected to be portable. +|}] + +module Inclusion_match = struct + module M : sig + val x : string @@ uncontended + end = struct + let x @ uncontended = "hello" + end + let () = uncontended_use M.x +end +[%%expect{| +module Inclusion_match : sig module M : sig val x : string end end +|}] + +(* [foo] closes over [M.x] instead of [M]. This is better ergonomics. *) +module Close_over_value = struct + module M = struct + let x @ portable uncontended = "hello" + end + let (foo @ portable) () = + let _ = M.x in + () +end +[%%expect{| +module Close_over_value : + sig + module M : sig val x : string @@ global many portable end + val foo : unit -> unit @@ global many portable + end +|}] + +module Close_over_value_monadic = struct + module M = struct + let r @ uncontended = "hello" + end + let (foo @ portable) () = + let uncontended_use (_ @ uncontended) = () in + uncontended_use M.r +end +[%%expect{| +Line 7, characters 20-23: +7 | uncontended_use M.r + ^^^ +Error: This value is contended but expected to be uncontended. +|}] + +module Close_over_value_comonadic = struct + module M = struct + let x @ nonportable = "hello" + end + let (foo @ portable) () = + let _ = M.x in + () +end +[%%expect{| +Line 6, characters 12-15: +6 | let _ = M.x in + ^^^ +Error: The value M.x is nonportable, so cannot be used inside a closure that is portable. +|}] + +(* Modalities on primitives are supported. They are simpler than real values, + because primitives have the same parsetree in [sig] and [struct]. In + particular, both contain [val_modalities] already, so we just do a simple + sub-modality check. *) +module M : sig + external length : string -> int @@ portable = "%string_length" +end = struct + external length : string -> int = "%string_length" +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | external length : string -> int = "%string_length" +5 | end +Error: Signature mismatch: + Modules do not match: + sig external length : string -> int = "%string_length" end + is not included in + sig + external length : string -> int @@ portable = "%string_length" + end + Values do not match: + external length : string -> int = "%string_length" + is not included in + external length : string -> int @@ portable = "%string_length" + The second is portable and the first is not. +|}] + +module M : sig + external length : string -> int @@ portable = "%string_length" +end = struct + external length : string -> int @@ portable = "%string_length" +end + +let _ = portable_use M.length +[%%expect{| +module M : + sig external length : string -> int @@ portable = "%string_length" end +- : unit = () +|}] + +(* weakening to non-portable *) +module M : sig + external length : string -> int = "%string_length" +end = struct + external length : string -> int @@ portable = "%string_length" +end + +let _ = portable_use M.length +[%%expect{| +module M : sig external length : string -> int = "%string_length" end +Line 7, characters 21-29: +7 | let _ = portable_use M.length + ^^^^^^^^ +Error: This value is nonportable but expected to be portable. +|}] diff --git a/testsuite/tests/typing-modes/val_modalities_floor.ml b/testsuite/tests/typing-modes/val_modalities_floor.ml new file mode 100644 index 00000000000..57f300a9b42 --- /dev/null +++ b/testsuite/tests/typing-modes/val_modalities_floor.ml @@ -0,0 +1,47 @@ +(* We test that cmi generated without mli has the modalities pushed to the +strongest instead of legacy *) + +(* TEST + readonly_files = "\ + def_portable.ml \ + def_nonportable.ml \ + use_portable.ml use_portable.bad.reference \ + "; +{ + setup-ocamlopt.byte-build-env; + flags = "-extension mode_alpha"; + + { + src = "def_portable.ml"; + dst = "maybe_portable.ml"; + copy; + + module = "maybe_portable.ml"; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + + module = "use_portable.ml"; + + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + } + + { + src = "def_nonportable.ml"; + dst = "maybe_portable.ml"; + copy; + + module = "maybe_portable.ml"; + ocamlopt_byte_exit_status = "0"; + ocamlopt.byte; + + module = "use_portable.ml"; + compiler_output = "use_portable.bad.output"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + + compiler_reference = "use_portable.bad.reference"; + check-ocamlopt.byte-output; + } +} +*) diff --git a/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml b/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml index fea9becac8d..6b86ec43101 100644 --- a/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml +++ b/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module Std = struct module Hash = Hashtbl end;; diff --git a/testsuite/tests/typing-modules-bugs/pr10661_ok.ml b/testsuite/tests/typing-modules-bugs/pr10661_ok.ml index 1dfa42f4342..300fe8f19c9 100644 --- a/testsuite/tests/typing-modules-bugs/pr10661_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr10661_ok.ml @@ -1,7 +1,7 @@ (* TEST -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = struct diff --git a/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference index ad6a16bb7a2..7d5d4eb7ddd 100644 --- a/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference @@ -35,20 +35,20 @@ Error: Signature mismatch: In module M.M: Modules do not match: sig - val x : X.t option - module M : functor (Y : Dep) -> sig val x : X.t option end + val x : X/2.t option + module M : functor (Y : Dep) -> sig val x : X/2.t option end end is not included in sig val x : X.t option end In module M.M: Values do not match: - val x : X.t option + val x : X/1.t option is not included in val x : X/2.t option - The type X.t option is not compatible with the type X/2.t option - Type X.t is not compatible with type X/2.t + The type X/1.t option is not compatible with the type X/2.t option + Type X/1.t is not compatible with type X/2.t File "_none_", line 1: - Definition of module X + Definition of module X/1 File "_none_", line 1: Definition of module X/2 File "pr10693_bad.ml", line 17, characters 6-24: Expected declaration diff --git a/testsuite/tests/typing-modules-bugs/pr10693_bad.ml b/testsuite/tests/typing-modules-bugs/pr10693_bad.ml index 4e964c9e13b..02122c9096e 100644 --- a/testsuite/tests/typing-modules-bugs/pr10693_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr10693_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = "-no-app-funct" -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module type Dep = sig type t val x : t end module String = struct type t = string let x = "Forty Two" end @@ -44,3 +44,11 @@ module N' = N.M(String) module N'' = N'.M(Int) let () = print_endline (Option.get N''.x) + +(* TEST + flags = "-no-app-funct"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr5164_ok.ml b/testsuite/tests/typing-modules-bugs/pr5164_ok.ml index 9d8e5715194..af34ebbcceb 100644 --- a/testsuite/tests/typing-modules-bugs/pr5164_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr5164_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type INCLUDING = sig diff --git a/testsuite/tests/typing-modules-bugs/pr51_ok.ml b/testsuite/tests/typing-modules-bugs/pr51_ok.ml index 740d9bcca69..4e873698800 100644 --- a/testsuite/tests/typing-modules-bugs/pr51_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr51_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module X=struct diff --git a/testsuite/tests/typing-modules-bugs/pr5663_ok.ml b/testsuite/tests/typing-modules-bugs/pr5663_ok.ml index 670869b8a5a..1eebb3dd2cd 100644 --- a/testsuite/tests/typing-modules-bugs/pr5663_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr5663_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module F (M : sig diff --git a/testsuite/tests/typing-modules-bugs/pr5914_ok.ml b/testsuite/tests/typing-modules-bugs/pr5914_ok.ml index a027c0b0909..766030b34c2 100644 --- a/testsuite/tests/typing-modules-bugs/pr5914_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr5914_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) type 't a = [ `A ] diff --git a/testsuite/tests/typing-modules-bugs/pr6240_ok.ml b/testsuite/tests/typing-modules-bugs/pr6240_ok.ml index ce0ef4de5fa..bed38dbc83d 100644 --- a/testsuite/tests/typing-modules-bugs/pr6240_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6240_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module M : sig diff --git a/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference index 58975e16207..c5db33cb826 100644 --- a/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference @@ -4,7 +4,7 @@ File "pr6293_bad.ml", line 10, characters 18-37: Error: In this `with' constraint, the new definition of t does not match its original definition in the constrained signature: Type declarations do not match: - type t + type t = int is not included in type t = { a : int; b : int; } The first is abstract, but the second is a record. diff --git a/testsuite/tests/typing-modules-bugs/pr6293_bad.ml b/testsuite/tests/typing-modules-bugs/pr6293_bad.ml index db937995131..ba9997d11bf 100644 --- a/testsuite/tests/typing-modules-bugs/pr6293_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr6293_bad.ml @@ -1,10 +1,18 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module type S = sig type t = { a : int; b : int; } end;; let f (module M : S with type t = int) = { M.a = 0 };; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr6427_bad.ml b/testsuite/tests/typing-modules-bugs/pr6427_bad.ml index 426c0369d57..85b4b1766c1 100644 --- a/testsuite/tests/typing-modules-bugs/pr6427_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr6427_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) let flag = ref false @@ -26,3 +26,11 @@ let () = flag := true module M2 = M(Float)(Int) let _ = [| M2.X.x; M1.X.x |] + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr6485_ok.ml b/testsuite/tests/typing-modules-bugs/pr6485_ok.ml index cf9a9469333..cf3b244a2a5 100644 --- a/testsuite/tests/typing-modules-bugs/pr6485_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6485_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (** Check that rebinding module preserves private type aliases *) diff --git a/testsuite/tests/typing-modules-bugs/pr6513_ok.ml b/testsuite/tests/typing-modules-bugs/pr6513_ok.ml index 61487326046..a6caa16bd20 100644 --- a/testsuite/tests/typing-modules-bugs/pr6513_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6513_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type PR6513 = sig diff --git a/testsuite/tests/typing-modules-bugs/pr6572_ok.ml b/testsuite/tests/typing-modules-bugs/pr6572_ok.ml index 28f33d35206..39a73814d23 100644 --- a/testsuite/tests/typing-modules-bugs/pr6572_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6572_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type S = sig diff --git a/testsuite/tests/typing-modules-bugs/pr6651_ok.ml b/testsuite/tests/typing-modules-bugs/pr6651_ok.ml index db48d15f175..33c5db23874 100644 --- a/testsuite/tests/typing-modules-bugs/pr6651_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6651_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type S = sig diff --git a/testsuite/tests/typing-modules-bugs/pr6752_bad.ml b/testsuite/tests/typing-modules-bugs/pr6752_bad.ml index 42d39e6afd5..3e087e88ffb 100644 --- a/testsuite/tests/typing-modules-bugs/pr6752_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr6752_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Sorry, we have to disable this as this requires accepting @@ -52,3 +52,11 @@ module M1 = let () = Common.add (Reload "config.file") let () = Common.add (Alert "Initialisation done") end + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr6752_ok.ml b/testsuite/tests/typing-modules-bugs/pr6752_ok.ml index 2d5ac02ad3b..fe1b3ce37cc 100644 --- a/testsuite/tests/typing-modules-bugs/pr6752_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6752_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* Adding a type annotation is sufficient to make typing go through *) diff --git a/testsuite/tests/typing-modules-bugs/pr6899_first_bad.ml b/testsuite/tests/typing-modules-bugs/pr6899_first_bad.ml index d7c1f71a335..4a265df2c57 100644 --- a/testsuite/tests/typing-modules-bugs/pr6899_first_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr6899_first_bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) let should_reject = let table = Hashtbl.create 1 in fun x y -> Hashtbl.add table x y + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr6899_ok.ml b/testsuite/tests/typing-modules-bugs/pr6899_ok.ml index 95d0860c0b6..85a8ab55a80 100644 --- a/testsuite/tests/typing-modules-bugs/pr6899_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6899_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) type 'a t = 'a option diff --git a/testsuite/tests/typing-modules-bugs/pr6899_second_bad.ml b/testsuite/tests/typing-modules-bugs/pr6899_second_bad.ml index 42d8bdde485..3600362368c 100644 --- a/testsuite/tests/typing-modules-bugs/pr6899_second_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr6899_second_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) include struct @@ -11,3 +11,11 @@ include struct let wrap f `Test = f let bar = wrap () end + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr6944_ok.ml b/testsuite/tests/typing-modules-bugs/pr6944_ok.ml index 9ff8d3564e3..a54f65dbebc 100644 --- a/testsuite/tests/typing-modules-bugs/pr6944_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6944_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) let f () = diff --git a/testsuite/tests/typing-modules-bugs/pr6954_ok.ml b/testsuite/tests/typing-modules-bugs/pr6954_ok.ml index 2970e4f3402..b6963da967b 100644 --- a/testsuite/tests/typing-modules-bugs/pr6954_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6954_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module X = struct module Y = struct module type S = sig type t end end end diff --git a/testsuite/tests/typing-modules-bugs/pr6981_ok.ml b/testsuite/tests/typing-modules-bugs/pr6981_ok.ml index 449e9dc754b..2f7f54bd226 100644 --- a/testsuite/tests/typing-modules-bugs/pr6981_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6981_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type S = diff --git a/testsuite/tests/typing-modules-bugs/pr6982_ok.ml b/testsuite/tests/typing-modules-bugs/pr6982_ok.ml index 47b65abba8a..81261287b08 100644 --- a/testsuite/tests/typing-modules-bugs/pr6982_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6982_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module A = struct diff --git a/testsuite/tests/typing-modules-bugs/pr6985_extended.ml b/testsuite/tests/typing-modules-bugs/pr6985_extended.ml index 01faa3fe04f..26c1ed16787 100644 --- a/testsuite/tests/typing-modules-bugs/pr6985_extended.ml +++ b/testsuite/tests/typing-modules-bugs/pr6985_extended.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) diff --git a/testsuite/tests/typing-modules-bugs/pr6985_ok.ml b/testsuite/tests/typing-modules-bugs/pr6985_ok.ml index 043502dae99..8852a8fa984 100644 --- a/testsuite/tests/typing-modules-bugs/pr6985_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr6985_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module Foo diff --git a/testsuite/tests/typing-modules-bugs/pr6992_bad.ml b/testsuite/tests/typing-modules-bugs/pr6992_bad.ml index 18733c706bb..48f1f592af9 100644 --- a/testsuite/tests/typing-modules-bugs/pr6992_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr6992_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* PR#6992, reported by Stephen Dolan *) @@ -21,3 +21,11 @@ module FixId = Fix (struct type 'a f = 'a end) let bad : (int, string) eq = FixId.uniq Eq Eq let _ = Printf.printf "Oh dear: %s" (cast bad 42) *) + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr7036_ok.ml b/testsuite/tests/typing-modules-bugs/pr7036_ok.ml index 305d2425a77..711e9af2d5b 100644 --- a/testsuite/tests/typing-modules-bugs/pr7036_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7036_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module M = struct diff --git a/testsuite/tests/typing-modules-bugs/pr7082_ok.ml b/testsuite/tests/typing-modules-bugs/pr7082_ok.ml index 849427d44b7..59f714acfa1 100644 --- a/testsuite/tests/typing-modules-bugs/pr7082_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7082_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type FOO = sig type t end diff --git a/testsuite/tests/typing-modules-bugs/pr7112_bad.ml b/testsuite/tests/typing-modules-bugs/pr7112_bad.ml index ffc634901fb..20738024e16 100644 --- a/testsuite/tests/typing-modules-bugs/pr7112_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr7112_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module A = struct module type S module S = struct end end @@ -11,3 +11,11 @@ module F (_ : sig end) = struct module type S module S = A.S end module M = struct end module N = M module G (X : F(N).S) : A.S = X + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr7112_ok.ml b/testsuite/tests/typing-modules-bugs/pr7112_ok.ml index 666c604c56f..1ce72502e47 100644 --- a/testsuite/tests/typing-modules-bugs/pr7112_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7112_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module F (_ : sig end) = struct module type S end diff --git a/testsuite/tests/typing-modules-bugs/pr7152_ok.ml b/testsuite/tests/typing-modules-bugs/pr7152_ok.ml index eada285f761..29543b1c399 100644 --- a/testsuite/tests/typing-modules-bugs/pr7152_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7152_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module M : sig diff --git a/testsuite/tests/typing-modules-bugs/pr7182_ok.ml b/testsuite/tests/typing-modules-bugs/pr7182_ok.ml index 801348f9f60..8e9bfd9c125 100644 --- a/testsuite/tests/typing-modules-bugs/pr7182_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7182_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module rec M diff --git a/testsuite/tests/typing-modules-bugs/pr7305_principal.ml b/testsuite/tests/typing-modules-bugs/pr7305_principal.ml index 3371e378861..7d31856a721 100644 --- a/testsuite/tests/typing-modules-bugs/pr7305_principal.ml +++ b/testsuite/tests/typing-modules-bugs/pr7305_principal.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -principal -w +18+19 -warn-error +A " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -principal -w +18+19 -warn-error +A "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) type c1 = < c1: c1 > diff --git a/testsuite/tests/typing-modules-bugs/pr7321_ok.ml b/testsuite/tests/typing-modules-bugs/pr7321_ok.ml index 9d217847388..b0ad633dbe6 100644 --- a/testsuite/tests/typing-modules-bugs/pr7321_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7321_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type S = sig type 'a t end diff --git a/testsuite/tests/typing-modules-bugs/pr7414_2_bad.ml b/testsuite/tests/typing-modules-bugs/pr7414_2_bad.ml index 1926ae4425d..1d503a059cd 100644 --- a/testsuite/tests/typing-modules-bugs/pr7414_2_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr7414_2_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module type T = sig @@ -48,3 +48,11 @@ let () = let () = (!M'.r) := [M'.Choice.x] in let module N' = (N : S) in List.iter (fun x -> print_string (N'.Choice.show x)) !(!N'.r) + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr7414_bad.ml b/testsuite/tests/typing-modules-bugs/pr7414_bad.ml index 7bc294599d9..25b1b80d592 100644 --- a/testsuite/tests/typing-modules-bugs/pr7414_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr7414_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module type T = sig @@ -61,3 +61,11 @@ module N' = (N : S) let () = List.iter (fun x -> print_string (N'.Choice.show x)) !(!N'.r) *) + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules-bugs/pr7519_ok.ml b/testsuite/tests/typing-modules-bugs/pr7519_ok.ml index c6278ce3927..4b1cd79747d 100644 --- a/testsuite/tests/typing-modules-bugs/pr7519_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7519_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module Gen_spec = struct type 't extra = unit end diff --git a/testsuite/tests/typing-modules-bugs/pr7601_ok.ml b/testsuite/tests/typing-modules-bugs/pr7601_ok.ml index 80003920141..b9ed83c7cf9 100644 --- a/testsuite/tests/typing-modules-bugs/pr7601_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7601_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (**************************************************************************) diff --git a/testsuite/tests/typing-modules-bugs/pr7601a_ok.ml b/testsuite/tests/typing-modules-bugs/pr7601a_ok.ml index ce2b8bb71b5..4e062e0b452 100644 --- a/testsuite/tests/typing-modules-bugs/pr7601a_ok.ml +++ b/testsuite/tests/typing-modules-bugs/pr7601a_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type Param1 = sig diff --git a/testsuite/tests/typing-modules-bugs/pr9695_bad.ml b/testsuite/tests/typing-modules-bugs/pr9695_bad.ml index 86ea3f8cdf2..b0e8803b351 100644 --- a/testsuite/tests/typing-modules-bugs/pr9695_bad.ml +++ b/testsuite/tests/typing-modules-bugs/pr9695_bad.ml @@ -1,10 +1,18 @@ -(* TEST -flags = " -w -a -no-alias-deps" -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module A = MissingModule let () = let open A in x + +(* TEST + flags = " -w -a -no-alias-deps"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-modules/Test.ml b/testsuite/tests/typing-modules/Test.ml index f87fa521d15..17afb6483ff 100644 --- a/testsuite/tests/typing-modules/Test.ml +++ b/testsuite/tests/typing-modules/Test.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* with module *) diff --git a/testsuite/tests/typing-modules/abbreviate_in_error_messages.ml b/testsuite/tests/typing-modules/abbreviate_in_error_messages.ml index 37dd30f1f5d..134fb9bc276 100644 --- a/testsuite/tests/typing-modules/abbreviate_in_error_messages.ml +++ b/testsuite/tests/typing-modules/abbreviate_in_error_messages.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Width = struct diff --git a/testsuite/tests/typing-modules/aliases.ml b/testsuite/tests/typing-modules/aliases.ml index b9ed5c6e8ca..a242d844bdb 100644 --- a/testsuite/tests/typing-modules/aliases.ml +++ b/testsuite/tests/typing-modules/aliases.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module C = Char;; diff --git a/testsuite/tests/typing-modules/anonymous.ml b/testsuite/tests/typing-modules/anonymous.ml index 7d006eddd91..367eb381844 100644 --- a/testsuite/tests/typing-modules/anonymous.ml +++ b/testsuite/tests/typing-modules/anonymous.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module _ = struct end;; diff --git a/testsuite/tests/typing-modules/applicative_functor_type.ml b/testsuite/tests/typing-modules/applicative_functor_type.ml index e23bed94cc4..b6ec9053ccd 100644 --- a/testsuite/tests/typing-modules/applicative_functor_type.ml +++ b/testsuite/tests/typing-modules/applicative_functor_type.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = Set.Make(String).t @@ -23,7 +23,7 @@ Error: Modules do not match: sig type t = M.t val equal : 'a -> 'a -> bool end is not included in Set.OrderedType The value `compare' is required but not provided - File "set.mli", line 57, characters 4-31: Expected declaration + File "set.mli", line 58, characters 4-31: Expected declaration |} ] diff --git a/testsuite/tests/typing-modules/extension_constructors_errors_test.ml b/testsuite/tests/typing-modules/extension_constructors_errors_test.ml index b37f9d17a26..b273c9d0e8b 100644 --- a/testsuite/tests/typing-modules/extension_constructors_errors_test.ml +++ b/testsuite/tests/typing-modules/extension_constructors_errors_test.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = ..;; diff --git a/testsuite/tests/typing-modules/firstclass.ml b/testsuite/tests/typing-modules/firstclass.ml index a79d01d93f2..6a442b5270a 100644 --- a/testsuite/tests/typing-modules/firstclass.ml +++ b/testsuite/tests/typing-modules/firstclass.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module type S = sig type u type t end;; diff --git a/testsuite/tests/typing-modules/functors.ml b/testsuite/tests/typing-modules/functors.ml index fce17e79d7a..b6c203031a8 100644 --- a/testsuite/tests/typing-modules/functors.ml +++ b/testsuite/tests/typing-modules/functors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) @@ -520,11 +520,11 @@ Error: The functor application is ill-typed. functor (X : x) (B : b/2) (Y : y) -> ... 1. Module $S1 matches the expected module type x 2. Modules do not match: - P.B : b + P.B : b/1 is not included in b/2 Line 5, characters 2-15: - Definition of module type b + Definition of module type b/1 Line 2, characters 0-13: Definition of module type b/2 3. Modules do not match: $S3 : sig type w end is not included in y @@ -543,9 +543,9 @@ module F : functor (X : a) -> sig type t end Line 6, characters 13-19: 6 | type t = F(X).t ^^^^^^ -Error: Modules do not match: (a with P.X) is not included in a/2 +Error: Modules do not match: (a/1 with P.X) is not included in a/2 Line 3, characters 2-15: - Definition of module type a + Definition of module type a/1 Line 1, characters 0-13: Definition of module type a/2 |}] @@ -576,16 +576,16 @@ Error: Signature mismatch: sig module F : functor (X : a) (Y : a) -> sig end end In module F: Modules do not match: - functor (X : aa) (Y : a) -> ... + functor (X : aa) (Y : a/1) -> ... is not included in functor (X : a/2) (Y : a/2) -> ... 1. Module types aa and a/2 match 2. Module types do not match: - a + a/1 does not include a/2 Line 4, characters 2-15: - Definition of module type a + Definition of module type a/1 Line 1, characters 0-13: Definition of module type a/2 |}] @@ -605,9 +605,9 @@ Error: Signature mismatch: does not include sig end The type `t' is required but not provided - File "set.mli", line 54, characters 4-10: Expected declaration + File "set.mli", line 55, characters 4-10: Expected declaration The value `compare' is required but not provided - File "set.mli", line 57, characters 4-31: Expected declaration + File "set.mli", line 58, characters 4-31: Expected declaration |}] (** Deeply nested errors *) @@ -1445,8 +1445,8 @@ Error: Signature mismatch: 1. An extra argument is provided of module type $S1 = sig type wrong end 2. Module types $S2 and $T2 match - 3. Module types X.T and X.T match - 4. Module types X.T and X.T match + 3. Module types X/3.T and X/2.T match + 4. Module types X/3.T and X/2.T match |}] @@ -1519,9 +1519,9 @@ Error: Signature mismatch: sig end The type `wrong' is required but not provided 2. Module types $S2 and $T2 match - 3. An extra argument is provided of module type X.T - 4. Module types X.T and X.T match - 5. Module types X.T and X.T match + 3. An extra argument is provided of module type X/2.T + 4. Module types X/2.T and X/2.T match + 5. Module types X/2.T and X/2.T match |}] @@ -1554,7 +1554,7 @@ Error: The functor application is ill-typed. 3. Modules do not match: Y : sig type t = Y.t = Y of int end is not included in - $T3 = sig type t = Y of X.t end + $T3 = sig type t = Y of X/2.t end Type declarations do not match: type t = Y.t = Y of int is not included in @@ -1567,7 +1567,7 @@ Error: The functor application is ill-typed. 4. Modules do not match: Z : sig type t = Z.t = Z of int end is not included in - $T4 = sig type t = Z of X.t end + $T4 = sig type t = Z of X/2.t end Type declarations do not match: type t = Z.t = Z of int is not included in @@ -1827,10 +1827,12 @@ Error: The functor application is ill-typed. is not included in type 'a t They have different arities. + Lines 9-12, characters 0-3: + Definition of module A/1 2. Modules do not match: $S2 : sig val f : 'a -> 'a end is not included in - $T2 = sig type 'a t val f : 'a A.t -> 'a t end + $T2 = sig type 'a t val f : 'a A/2.t -> 'a t end |}] @@ -1918,7 +1920,7 @@ Error: The functor application is ill-typed. functor (A : ...) (B : $T2) () () -> ... 1. Module $S1 matches the expected module type 2. An argument appears to be missing with module type - $T2 = sig module type t = A.t end + $T2 = sig module type t = A/2.t end 3. Module () matches the expected module type 4. Module () matches the expected module type |}] @@ -1973,10 +1975,12 @@ Error: The functor application is ill-typed. $T1 = sig type 'a t type 'a s end Type declarations do not match: type t is not included in type 'a t They have different arities. + Line 5, characters 0-32: + Definition of module X/1 2. Modules do not match: $S2 : sig val f : 'a -> 'a end is not included in - $T2 = sig val f : 'a X.s -> 'a end + $T2 = sig val f : 'a X/2.s -> 'a end Values do not match: val f : 'a -> 'a is not included in diff --git a/testsuite/tests/typing-modules/generative.ml b/testsuite/tests/typing-modules/generative.ml index a3710a4ce07..ce168e3a29a 100644 --- a/testsuite/tests/typing-modules/generative.ml +++ b/testsuite/tests/typing-modules/generative.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Using generative functors *) diff --git a/testsuite/tests/typing-modules/illegal_permutation.ml b/testsuite/tests/typing-modules/illegal_permutation.ml index 024e5d0201a..6de161fc813 100644 --- a/testsuite/tests/typing-modules/illegal_permutation.ml +++ b/testsuite/tests/typing-modules/illegal_permutation.ml @@ -1,5 +1,5 @@ (* TEST -* expect + expect; *) class type ct = object end module type s = sig type a val one:int type b class two:ct type c type exn+=Three type d end diff --git a/testsuite/tests/typing-modules/include_functor.ml b/testsuite/tests/typing-modules/include_functor.ml index cdc472724ef..ff2857e9f61 100644 --- a/testsuite/tests/typing-modules/include_functor.ml +++ b/testsuite/tests/typing-modules/include_functor.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension include_functor -w +a" - * expect + flags = "-extension include_functor -w +a"; + expect; *) (* Test 1: Basic usage in structs *) diff --git a/testsuite/tests/typing-modules/include_functor_disabled_1.ml b/testsuite/tests/typing-modules/include_functor_disabled_1.ml index 78bdbc48811..cc5c371c7ef 100644 --- a/testsuite/tests/typing-modules/include_functor_disabled_1.ml +++ b/testsuite/tests/typing-modules/include_functor_disabled_1.ml @@ -1,9 +1,9 @@ (* TEST - flags = "-disable-all-extensions" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + flags = "-extension-universe no_extensions"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* This test checks that the include functor feature doesn't work without the diff --git a/testsuite/tests/typing-modules/include_functor_disabled_2.ml b/testsuite/tests/typing-modules/include_functor_disabled_2.ml index 395e7292a76..68aeeb63f75 100644 --- a/testsuite/tests/typing-modules/include_functor_disabled_2.ml +++ b/testsuite/tests/typing-modules/include_functor_disabled_2.ml @@ -1,9 +1,9 @@ (* TEST - flags = "-disable-all-extensions" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + flags = "-extension-universe no_extensions"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* This test checks that the include functor feature doesn't work without the diff --git a/testsuite/tests/typing-modules/include_functor_disabled_3.ml b/testsuite/tests/typing-modules/include_functor_disabled_3.ml index 45d45a442d0..b43055e3c89 100644 --- a/testsuite/tests/typing-modules/include_functor_disabled_3.ml +++ b/testsuite/tests/typing-modules/include_functor_disabled_3.ml @@ -1,9 +1,9 @@ (* TEST - flags = "-disable-all-extensions" - ocamlc_byte_exit_status = "2" - * setup-ocamlc.byte-build-env - ** ocamlc.byte - *** check-ocamlc.byte-output + flags = "-extension-universe no_extensions"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* This test checks that the include functor feature doesn't work without the diff --git a/testsuite/tests/typing-modules/include_functor_native.ml b/testsuite/tests/typing-modules/include_functor_native.ml index 35b76dc52ad..c32e0914c25 100644 --- a/testsuite/tests/typing-modules/include_functor_native.ml +++ b/testsuite/tests/typing-modules/include_functor_native.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension include_functor" - * native + flags = "-extension include_functor"; + native; *) (* This duplicates some of the tests from `include_functor.ml` (using just diff --git a/testsuite/tests/typing-modules/inclusion_errors.ml b/testsuite/tests/typing-modules/inclusion_errors.ml index fa5d3d53584..8361ae84b06 100644 --- a/testsuite/tests/typing-modules/inclusion_errors.ml +++ b/testsuite/tests/typing-modules/inclusion_errors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (********************************** Equality **********************************) @@ -552,14 +552,14 @@ Error: Signature mismatch: is not included in sig val f : (module s) -> unit end Values do not match: - val f : (module s) -> unit + val f : (module s/1) -> unit is not included in val f : (module s/2) -> unit - The type (module s) -> unit is not compatible with the type + The type (module s/1) -> unit is not compatible with the type (module s/2) -> unit - Type (module s) is not compatible with type (module s/2) + Type (module s/1) is not compatible with type (module s/2) Line 6, characters 4-17: - Definition of module type s + Definition of module type s/1 Line 2, characters 2-15: Definition of module type s/2 |}];; diff --git a/testsuite/tests/typing-modules/inclusion_errors_elision.ml b/testsuite/tests/typing-modules/inclusion_errors_elision.ml index 3dbd0e67fff..e3f2ea9cbb4 100644 --- a/testsuite/tests/typing-modules/inclusion_errors_elision.ml +++ b/testsuite/tests/typing-modules/inclusion_errors_elision.ml @@ -1,7 +1,7 @@ (* TEST - flags ="-keep-original-error-size" - * expect - *) + flags = "-keep-original-error-size"; + expect; +*) module A = struct @@ -26,6 +26,46 @@ Lines 9-13, characters 15-3: 11 | type a and b and c and d and e and f and g and h 12 | end 13 | end +Error: Signature mismatch: + Modules do not match: + sig + module B : + sig type a and b and c and d and e and f and g and h end + end + is not included in + S + In module B: + Modules do not match: + sig + type a = B.a + and b = B.b + and c = B.c + and d = B.d + and e = B.e + and f = B.f + and g = B.g + and h = B.h + end + is not included in + (module A) +|}] + +module C : S = struct + module B = struct + type a and b and c and d and e and f and g and h + and a_type_with_extremely_long_long_long_long_long_long_long_long_name + and a_type_with_extremely_long_long_long_long_long_long_long_long_name0 + end +end +[%%expect {| +Lines 1-7, characters 15-3: +1 | ...............struct +2 | module B = struct +3 | type a and b and c and d and e and f and g and h +4 | and a_type_with_extremely_long_long_long_long_long_long_long_long_name +5 | and a_type_with_extremely_long_long_long_long_long_long_long_long_name0 +6 | end +7 | end Error: Signature mismatch: ... In module B: @@ -39,6 +79,10 @@ Error: Signature mismatch: and f = B.f and g = B.g and h = B.h + and a_type_with_extremely_long_long_long_long_long_long_long_long_name = + B.a_type_with_extremely_long_long_long_long_long_long_long_long_name + and a_type_with_extremely_long_long_long_long_long_long_long_long_name0 = + B.a_type_with_extremely_long_long_long_long_long_long_long_long_name0 end is not included in (module A) @@ -72,6 +116,69 @@ Lines 11-17, characters 15-3: 15 | end 16 | end 17 | end +Error: Signature mismatch: + Modules do not match: + sig + module type B = + sig + module C : + sig type a and b and c and d and e and f and g and h end + end + end + is not included in + S + Module type declarations do not match: + module type B = + sig + module C : + sig type a and b and c and d and e and f and g and h end + end + does not match + module type B = sig module C = A end + At position module type B = + Module types do not match: + sig + module C : + sig type a and b and c and d and e and f and g and h end + end + is not equal to + sig module C = A end + At position module type B = sig module C : end + Modules do not match: + sig + type a = C.a + and b = C.b + and c = C.c + and d = C.d + and e = C.e + and f = C.f + and g = C.g + and h = C.h + end + is not included in + (module A) +|}] + +module D : S = struct + module type B = sig + module C: sig + type a and b and c and d and e and f and g and h + and a_type_with_extremely_long_long_long_long_long_long_long_long_name + and a_type_with_extremely_long_long_long_long_long_long_long_long_name0 + end + end +end +[%%expect{| +Lines 1-9, characters 15-3: +1 | ...............struct +2 | module type B = sig +3 | module C: sig +4 | type a and b and c and d and e and f and g and h +5 | and a_type_with_extremely_long_long_long_long_long_long_long_long_name +6 | and a_type_with_extremely_long_long_long_long_long_long_long_long_name0 +7 | end +8 | end +9 | end Error: Signature mismatch: ... ... @@ -87,6 +194,10 @@ Error: Signature mismatch: and f = C.f and g = C.g and h = C.h + and a_type_with_extremely_long_long_long_long_long_long_long_long_name = + C.a_type_with_extremely_long_long_long_long_long_long_long_long_name + and a_type_with_extremely_long_long_long_long_long_long_long_long_name0 = + C.a_type_with_extremely_long_long_long_long_long_long_long_long_name0 end is not included in (module A) diff --git a/testsuite/tests/typing-modules/merge_constraint.ml b/testsuite/tests/typing-modules/merge_constraint.ml index d5c439e941b..b284451334f 100644 --- a/testsuite/tests/typing-modules/merge_constraint.ml +++ b/testsuite/tests/typing-modules/merge_constraint.ml @@ -1,6 +1,7 @@ (* TEST - ocamlrunparam = "l=1000000" - * expect *) + ocamlrunparam = "l=1000000"; + expect; +*) (* #9623 *) @@ -58,8 +59,8 @@ module VarianceEnv : type 'a user = Foo of 'a abstract module M : sig - type 'a abstract = 'a abstract/2 - type 'a user = 'a user/2 = Foo of 'a abstract + type 'a abstract = 'a abstract + type 'a user = 'a user = Foo of 'a abstract end type 'a foo = 'a M.user end @@ -93,8 +94,8 @@ module UnboxedEnv : type t = T : 'e ind -> t [@@unboxed] module type ReboundSig = sig - type 'a ind = 'a ind/2 - type t = t/2 = T : 'a ind -> t [@@unboxed] + type 'a ind = 'a ind + type t = t/2 = T : 'a ind -> t/1 [@@unboxed] end end end @@ -115,7 +116,7 @@ module ParamsUnificationEnv : sig type 'a u = 'a list type +'a t constraint 'a = 'b u end type +'a t = 'b constraint 'a = 'b list module type Sig2 = - sig type 'a u = 'a list type +'a t = 'a t/2 constraint 'a = 'b u end + sig type 'a u = 'a list type +'a t = 'a t constraint 'a = 'b u end end |}] @@ -147,7 +148,7 @@ module CorrectEnvConstructionTest : and +'a abstract module M : sig - type 'a user = 'a user/2 = Foo of 'a abstract + type 'a user = 'a user = Foo of 'a abstract/1 and 'a abstract = 'a abstract/2 end type 'a foo = 'a M.user diff --git a/testsuite/tests/typing-modules/module_type_substitution.ml b/testsuite/tests/typing-modules/module_type_substitution.ml index 09f16ce7be5..3aa341ab374 100644 --- a/testsuite/tests/typing-modules/module_type_substitution.ml +++ b/testsuite/tests/typing-modules/module_type_substitution.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** Basic *) diff --git a/testsuite/tests/typing-modules/nondep.ml b/testsuite/tests/typing-modules/nondep.ml index 36e541127f5..e74731dd4e8 100644 --- a/testsuite/tests/typing-modules/nondep.ml +++ b/testsuite/tests/typing-modules/nondep.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module F(X : sig type t end) = struct diff --git a/testsuite/tests/typing-modules/nondep_private_abbrev.ml b/testsuite/tests/typing-modules/nondep_private_abbrev.ml index a0daa1fb95e..282b04e130c 100644 --- a/testsuite/tests/typing-modules/nondep_private_abbrev.ml +++ b/testsuite/tests/typing-modules/nondep_private_abbrev.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module F(_ : sig end) : sig diff --git a/testsuite/tests/typing-modules/nongen.ml b/testsuite/tests/typing-modules/nongen.ml index 8fbea248b5b..9aca5a1f88f 100644 --- a/testsuite/tests/typing-modules/nongen.ml +++ b/testsuite/tests/typing-modules/nongen.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module X = struct diff --git a/testsuite/tests/typing-modules/normalize_path.ml b/testsuite/tests/typing-modules/normalize_path.ml index 44f45ef49ee..fcca202ee7a 100644 --- a/testsuite/tests/typing-modules/normalize_path.ml +++ b/testsuite/tests/typing-modules/normalize_path.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module X = struct diff --git a/testsuite/tests/typing-modules/package_constraint.ml b/testsuite/tests/typing-modules/package_constraint.ml new file mode 100644 index 00000000000..ee3a6c89a32 --- /dev/null +++ b/testsuite/tests/typing-modules/package_constraint.ml @@ -0,0 +1,334 @@ +(* TEST + expect; +*) + +(* You may constrain abstract types in packages. *) +module type S = sig + type t +end + +type m = (module S with type t = int);; +[%%expect{| +module type S = sig type t end +type m = (module S with type t = int) +|}];; + +(* You may use variables in the current environment in the new definitions. *) +module type S = sig + type t +end + +type 'a m = (module S with type t = 'a);; +[%%expect{| +module type S = sig type t end +type 'a m = (module S with type t = 'a) +|}];; + +(* It works with non-trivial paths. *) +module type S = sig + module M : sig + type t + end +end + +type m = (module S with type M.t = int) +[%%expect{| +module type S = sig module M : sig type t end end +type m = (module S with type M.t = int) +|}];; + +(* It should respect immediacy - [m1] should typecheck but not [m2]. *) +module type S = sig + type t [@@immediate] +end + +type m1 = (module S with type t = int) +type m2 = (module S with type t = string);; +[%%expect{| +module type S = sig type t : immediate end +type m1 = (module S with type t = int) +Line 6, characters 10-41: +6 | type m2 = (module S with type t = string);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this `with' constraint, the new definition of t + does not match its original definition in the constrained signature: + Type declarations do not match: + type t = string + is not included in + type t : immediate + The kind of the first is value + because it is the primitive value type string. + But the kind of the first must be a subkind of immediate + because of the definition of t at line 2, characters 2-22. +|}];; + +(* You may not constrain types with a manifest in a package *) +module type S = sig + type t = int +end + +type m = (module S with type t = string);; +[%%expect{| +module type S = sig type t = int end +Line 5, characters 9-40: +5 | type m = (module S with type t = string);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type t is defined to be int. + Package `with' constraints may only be used on abstract types. +|}];; + +(* Even if your constraint would be satisfied. *) +(* It would be nice if this worked. *) +module type S = sig + type t = int +end + +type m = (module S with type t = int);; +[%%expect{| +module type S = sig type t = int end +Line 5, characters 9-37: +5 | type m = (module S with type t = int);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type t is defined to be int. + Package `with' constraints may only be used on abstract types. +|}];; + +(* And even if the manifest is not obvious in the original definition. *) +module M = struct + type t +end + +module type S = sig + module P = M +end + +type m = (module S with type P.t = int);; +[%%expect{| +module M : sig type t end +module type S = sig module P = M end +Line 9, characters 9-39: +9 | type m = (module S with type P.t = int);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type P.t is defined to be M.t. + Package `with' constraints may only be used on abstract types. +|}];; + +(* If writing a package constraint in a mutually recursive group of type decls, + checking that the constraint's immediacy may rely on the definitions of other + elements of the mutually recursive group. *) +module type S = sig + type t [@@immediate] +end + +type t1 = int +and t2 = (module S with type t = t1);; +[%%expect{| +module type S = sig type t : immediate end +type t1 = int +and t2 = (module S with type t = t1) +|}];; + +module type S = sig + type t [@@immediate] +end + +type t1 = (module S with type t = t2) +and t2 = string;; +[%%expect{| +module type S = sig type t : immediate end +Line 6, characters 0-15: +6 | and t2 = string;; + ^^^^^^^^^^^^^^^ +Error: + The kind of t2 is value + because it is the primitive value type string. + But the kind of t2 must be a subkind of immediate + because of the definition of t at line 2, characters 2-22. +|}];; + +(* Though this sometimes fails if the check would require particularly clever + inference around typedecl parameters. See also Test 41 in + [tests/typing-layouts/basics.ml]. *) +(* It would be nice if this worked. *) +module type S = sig + type t [@@immediate] +end + +type t1 = (module S with type t = int t2) +and 'a t2 = 'a;; +[%%expect{| +module type S = sig type t : immediate end +Line 6, characters 0-14: +6 | and 'a t2 = 'a;; + ^^^^^^^^^^^^^^ +Error: Layout mismatch in checking consistency of mutually recursive groups. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The kind of 'a t2 is value + because it instantiates an unannotated type parameter of t2, + defaulted to kind value. + But the kind of 'a t2 must be a subkind of immediate + because of the definition of t at line 2, characters 2-22. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}];; + +(* If the previous example ever starts checking, this one still should not. *) +module type S = sig + type t [@@immediate] +end + +type t1 = (module S with type t = string t2) +and 'a t2 = 'a;; +[%%expect{| +module type S = sig type t : immediate end +Line 6, characters 0-14: +6 | and 'a t2 = 'a;; + ^^^^^^^^^^^^^^ +Error: Layout mismatch in checking consistency of mutually recursive groups. + This is most often caused by the fact that type inference is not + clever enough to propagate layouts through variables in different + declarations. It is also not clever enough to produce a good error + message, so we'll say this instead: + The kind of 'a t2 is value + because it instantiates an unannotated type parameter of t2, + defaulted to kind value. + But the kind of 'a t2 must be a subkind of immediate + because of the definition of t at line 2, characters 2-22. + A good next step is to add a layout annotation on a parameter to + the declaration where this error is reported. +|}];; + + +(* When using a package with constraint to give an abstract type a definition + that is immediate, that immediacy information should be usable after + unpacking. *) +module type S = sig + type t +end + +type m = (module S with type t = int) + +module F (X : sig val x : m end) = struct + module M = (val X.x) + type t = M.t [@@immediate] +end;; +[%%expect{| +module type S = sig type t end +type m = (module S with type t = int) +module F : + functor (X : sig val x : m end) -> + sig module M : sig type t = int end type t = M.t end +|}];; + +(* Checking such a constraint may require expanding definitions from the module + being updated. *) +module type S = sig + module type S1 = sig + type t + end + module M : S1 +end + +type t = (module S with type M.t = int) +[%%expect{| +module type S = sig module type S1 = sig type t end module M : S1 end +type t = (module S with type M.t = int) +|}];; + +(* Ghosts haunted type definitions *) +module type Private_row = sig + type a + and t = private [< `A | `B ] + and b + and d = private [< `C ] +end + +(* This is fine, the ghost type `t#row` is removed silently *) +module type Test = Private_row with type t = [ `A ] + +(* This fails currently. If we ever allow it, make sure the ghost type is + removed as above. *) +type fail = (module Private_row with type t = [ `A ] ) + +[%%expect{| +module type Private_row = + sig type a and t = private [< `A | `B ] and b and d = private [< `C ] end +module type Test = + sig type a and t = [ `A ] and b and d = private [< `C ] end +Line 13, characters 12-54: +13 | type fail = (module Private_row with type t = [ `A ] ) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type t is defined to be [< `A | `B ]. + Package `with' constraints may only be used on abstract types. +|}] + +(* More row type examples to consider, if we ever start allowing package type + constraints to replace compatible manifests. *) +module type Private_row = sig + type t = private [< `A ] +end + +type t1 = (module Private_row with type t = [ `A ]) +[%%expect{| +module type Private_row = sig type t = private [< `A ] end +Line 5, characters 10-51: +5 | type t1 = (module Private_row with type t = [ `A ]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type t is defined to be [< `A ]. + Package `with' constraints may only be used on abstract types. +|}] + +type t2 = (module Private_row with type t = [< `A ]) +[%%expect{| +Line 1, characters 10-52: +1 | type t2 = (module Private_row with type t = [< `A ]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type t is defined to be [< `A ]. + Package `with' constraints may only be used on abstract types. +|}] + +type 'a t3 = (module Private_row with type t = [< `A ]) as 'a +[%%expect{| +Line 1, characters 13-55: +1 | type 'a t3 = (module Private_row with type t = [< `A ]) as 'a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type t is defined to be [< `A ]. + Package `with' constraints may only be used on abstract types. +|}] + +type 'a t4 = (module Private_row with type t = [< `A ] as 'a) +[%%expect{| +Line 1, characters 13-61: +1 | type 'a t4 = (module Private_row with type t = [< `A ] as 'a) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In the constrained signature, type t is defined to be [< `A ]. + Package `with' constraints may only be used on abstract types. +|}] + +(* In cases where the package constraint involves a type variable from the + current ty var env, it can affect inference. t1 below should check but not + t2. *) +module type S = sig + type t : immediate +end + +type 'a t = (module S with type t = 'a) + +type t1 = int t +type t2 = string t +[%%expect{| +module type S = sig type t : immediate end +type ('a : immediate) t = (module S with type t = 'a) +type t1 = int t +Line 8, characters 10-16: +8 | type t2 = string t + ^^^^^^ +Error: This type string should be an instance of type ('a : immediate) + The kind of string is value + because it is the primitive value type string. + But the kind of string must be a subkind of immediate + because of the definition of t at line 5, characters 0-39. +|}];; diff --git a/testsuite/tests/typing-modules/packed_module_levels.ml b/testsuite/tests/typing-modules/packed_module_levels.ml index a4883d00deb..a111d2fd4c1 100644 --- a/testsuite/tests/typing-modules/packed_module_levels.ml +++ b/testsuite/tests/typing-modules/packed_module_levels.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type (_, _) equ = Refl : ('q, 'q) equ diff --git a/testsuite/tests/typing-modules/pr10298.ml b/testsuite/tests/typing-modules/pr10298.ml index 58a9509cd70..d1f8f9eafeb 100644 --- a/testsuite/tests/typing-modules/pr10298.ml +++ b/testsuite/tests/typing-modules/pr10298.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module type S = sig type t end diff --git a/testsuite/tests/typing-modules/pr10399.ml b/testsuite/tests/typing-modules/pr10399.ml index cce02f41a21..89e25af0de0 100644 --- a/testsuite/tests/typing-modules/pr10399.ml +++ b/testsuite/tests/typing-modules/pr10399.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* From jctis: *) diff --git a/testsuite/tests/typing-modules/pr13099/lib1/lib.ml b/testsuite/tests/typing-modules/pr13099/lib1/lib.ml new file mode 100644 index 00000000000..35bab63efb7 --- /dev/null +++ b/testsuite/tests/typing-modules/pr13099/lib1/lib.ml @@ -0,0 +1 @@ +type t = unit diff --git a/testsuite/tests/typing-modules/pr13099/lib1_client.ml b/testsuite/tests/typing-modules/pr13099/lib1_client.ml new file mode 100644 index 00000000000..f338891616f --- /dev/null +++ b/testsuite/tests/typing-modules/pr13099/lib1_client.ml @@ -0,0 +1 @@ +let f (_ : Lib.t) = () diff --git a/testsuite/tests/typing-modules/pr13099/lib2/lib.ml b/testsuite/tests/typing-modules/pr13099/lib2/lib.ml new file mode 100644 index 00000000000..eff282268cd --- /dev/null +++ b/testsuite/tests/typing-modules/pr13099/lib2/lib.ml @@ -0,0 +1 @@ +type t = bool diff --git a/testsuite/tests/typing-modules/pr13099/lib2_client.ml b/testsuite/tests/typing-modules/pr13099/lib2_client.ml new file mode 100644 index 00000000000..27894b20f39 --- /dev/null +++ b/testsuite/tests/typing-modules/pr13099/lib2_client.ml @@ -0,0 +1,19 @@ +let f (_ : Lib.t) = () + +(* The naming of this module is important: When the error reporting + is running in a mode where it can load new cmis from disk, this + module leads the compiler to try to load a cmi file [lib1_client.cmi]. + That's because the compiler tries to be smart about double-underscore + paths, rewriting [Foo__Bar] to [Foo.Bar] when these names are aliases. + *) +module Lib1_client__X = struct + type t = A +end + +module F (T : sig type t end) = struct + type t = Lib1_client__X.t + + let f (_ : T.t) = () +end + +module _ = F (struct type t = T end) diff --git a/testsuite/tests/typing-modules/pr13099/test.compilers.reference b/testsuite/tests/typing-modules/pr13099/test.compilers.reference new file mode 100644 index 00000000000..92f0a933364 --- /dev/null +++ b/testsuite/tests/typing-modules/pr13099/test.compilers.reference @@ -0,0 +1,8 @@ +File "lib2_client.ml", line 19, characters 11-36: +19 | module _ = F (struct type t = T end) + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This functor has type + functor (T : sig type t end) -> + sig type t = Lib1_client__X.t val f : T.t -> unit end + The parameter cannot be eliminated in the result type. + Please bind the argument to a module identifier. diff --git a/testsuite/tests/typing-modules/pr13099/test.ml b/testsuite/tests/typing-modules/pr13099/test.ml new file mode 100644 index 00000000000..40670382857 --- /dev/null +++ b/testsuite/tests/typing-modules/pr13099/test.ml @@ -0,0 +1,33 @@ +(* TEST + subdirectories = "lib1 lib2"; + readonly_files = "lib1_client.ml lib2_client.ml"; + compile_only = "true"; + setup-ocamlopt.byte-build-env; + + (* Set up the Lib modules that the client modules depend on *) + all_modules = "lib1/lib.ml"; + ocamlopt.byte; + all_modules = "lib2/lib.ml"; + ocamlopt.byte; + + (* Compile Lib1_client against Lib1 *) + flags = "-I lib1"; + all_modules = "lib1_client.ml"; + ocamlopt.byte; + + (* Compile Lib2_client against Lib2 *) + flags = "-I lib2"; + all_modules = "lib2_client.ml"; + ocamlopt_byte_exit_status = "2"; + ocamlopt.byte; + check-ocamlopt.byte-output; +*) + +(* This test is a regression test. The bug was in the last step: the compiler crashed + with an exception and backtrace instead of printing a useful error message. The + issue was that the compiler was erroneously running in a mode where its error reporting + is allowed to load cmi files from disk. This mode is undesirable because it means + that the compiler can encounter new exceptions (e.g. that the new cmi file it loads + is not consistent with other cmi files) while doing error reporting for the old + exception. + *) diff --git a/testsuite/tests/typing-modules/pr5911.ml b/testsuite/tests/typing-modules/pr5911.ml index 1c08b37af23..44f141e5831 100644 --- a/testsuite/tests/typing-modules/pr5911.ml +++ b/testsuite/tests/typing-modules/pr5911.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module type S = sig diff --git a/testsuite/tests/typing-modules/pr6394.ml b/testsuite/tests/typing-modules/pr6394.ml index d785fb50651..0546f86414b 100644 --- a/testsuite/tests/typing-modules/pr6394.ml +++ b/testsuite/tests/typing-modules/pr6394.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) [@@@ ocaml.warning "+4"] diff --git a/testsuite/tests/typing-modules/pr6633.ml b/testsuite/tests/typing-modules/pr6633.ml index 084cc63cd33..f8b791961e2 100644 --- a/testsuite/tests/typing-modules/pr6633.ml +++ b/testsuite/tests/typing-modules/pr6633.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) diff --git a/testsuite/tests/typing-modules/pr7207.ml b/testsuite/tests/typing-modules/pr7207.ml index a061a34d67b..aa9b7b5e92e 100644 --- a/testsuite/tests/typing-modules/pr7207.ml +++ b/testsuite/tests/typing-modules/pr7207.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module F (X : sig end) = struct type t = int end;; diff --git a/testsuite/tests/typing-modules/pr7348.ml b/testsuite/tests/typing-modules/pr7348.ml index dc0cf4050d7..4cd0671e3e9 100644 --- a/testsuite/tests/typing-modules/pr7348.ml +++ b/testsuite/tests/typing-modules/pr7348.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module F (X : sig type t = private < foo:int; ..> val x : t end) = struct diff --git a/testsuite/tests/typing-modules/pr7726.ml b/testsuite/tests/typing-modules/pr7726.ml index 2fdd500dbdd..6ea1b7f5ea3 100644 --- a/testsuite/tests/typing-modules/pr7726.ml +++ b/testsuite/tests/typing-modules/pr7726.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module type T = sig type t end diff --git a/testsuite/tests/typing-modules/pr7787.ml b/testsuite/tests/typing-modules/pr7787.ml index 4738df38765..ccb32cfd8db 100644 --- a/testsuite/tests/typing-modules/pr7787.ml +++ b/testsuite/tests/typing-modules/pr7787.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module O (T : sig diff --git a/testsuite/tests/typing-modules/pr7818.ml b/testsuite/tests/typing-modules/pr7818.ml index eea55e3f7d0..e6e03298a23 100644 --- a/testsuite/tests/typing-modules/pr7818.ml +++ b/testsuite/tests/typing-modules/pr7818.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* cannot_alias.ml *) diff --git a/testsuite/tests/typing-modules/pr7851.ml b/testsuite/tests/typing-modules/pr7851.ml index 9e1eef73a10..f19c1c108a8 100644 --- a/testsuite/tests/typing-modules/pr7851.ml +++ b/testsuite/tests/typing-modules/pr7851.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Leo's version *) diff --git a/testsuite/tests/typing-modules/pr8810.ml b/testsuite/tests/typing-modules/pr8810.ml index 57bfa17fc7e..58a07c2f3b4 100644 --- a/testsuite/tests/typing-modules/pr8810.ml +++ b/testsuite/tests/typing-modules/pr8810.ml @@ -1,7 +1,7 @@ (* TEST -* setup-ocamlc.byte-build-env -flags = "-no-alias-deps -w -49 -c" -** ocamlc.byte -ocamlc_byte_exit_status = "2" + flags = "-no-alias-deps -w -49 -c"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; *) module Loop = Pr8810 diff --git a/testsuite/tests/typing-modules/pr9384.ml b/testsuite/tests/typing-modules/pr9384.ml index 941bdadfdd7..ba55288c80b 100644 --- a/testsuite/tests/typing-modules/pr9384.ml +++ b/testsuite/tests/typing-modules/pr9384.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M : sig diff --git a/testsuite/tests/typing-modules/pr9695.ml b/testsuite/tests/typing-modules/pr9695.ml index ad025fead29..c77c222fba9 100644 --- a/testsuite/tests/typing-modules/pr9695.ml +++ b/testsuite/tests/typing-modules/pr9695.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Test (S : sig module type S end) (M : S.S) = diff --git a/testsuite/tests/typing-modules/printing.ml b/testsuite/tests/typing-modules/printing.ml index 796431507e8..1cd554ef00d 100644 --- a/testsuite/tests/typing-modules/printing.ml +++ b/testsuite/tests/typing-modules/printing.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#6650 *) diff --git a/testsuite/tests/typing-modules/private.ml b/testsuite/tests/typing-modules/private.ml index 940c1eb6a98..202b90e9e16 100644 --- a/testsuite/tests/typing-modules/private.ml +++ b/testsuite/tests/typing-modules/private.ml @@ -1,6 +1,6 @@ (* TEST - * expect - *) + expect; +*) module M : sig type t = private [< `A | `B of string] end diff --git a/testsuite/tests/typing-modules/records_errors_test.ml b/testsuite/tests/typing-modules/records_errors_test.ml index ef327db4eb0..a691a3e7e5e 100644 --- a/testsuite/tests/typing-modules/records_errors_test.ml +++ b/testsuite/tests/typing-modules/records_errors_test.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M1 : sig diff --git a/testsuite/tests/typing-modules/recursive.ml b/testsuite/tests/typing-modules/recursive.ml index 23ad13013e4..35e4e88bd3e 100644 --- a/testsuite/tests/typing-modules/recursive.ml +++ b/testsuite/tests/typing-modules/recursive.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* PR#7324 *) diff --git a/testsuite/tests/typing-modules/strengthening.ml b/testsuite/tests/typing-modules/strengthening.ml index c71852c607b..aff4c7d4962 100644 --- a/testsuite/tests/typing-modules/strengthening.ml +++ b/testsuite/tests/typing-modules/strengthening.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-extension module_strengthening" - * expect + flags = "-extension module_strengthening"; + expect; *) module type S1 = sig diff --git a/testsuite/tests/typing-modules/struct_include_optimisation.ml b/testsuite/tests/typing-modules/struct_include_optimisation.ml index 264af898fcb..b5f205204f1 100644 --- a/testsuite/tests/typing-modules/struct_include_optimisation.ml +++ b/testsuite/tests/typing-modules/struct_include_optimisation.ml @@ -1,5 +1,6 @@ (* TEST - * native *) + native; +*) type alloc_count = { mutable total: float } let allocs = Sys.opaque_identity { total = 0. } let[@inline never] set_allocs () = diff --git a/testsuite/tests/typing-modules/unroll_private_abbrev.ml b/testsuite/tests/typing-modules/unroll_private_abbrev.ml index 4fa7f7da2f8..cb9bf74d5dd 100644 --- a/testsuite/tests/typing-modules/unroll_private_abbrev.ml +++ b/testsuite/tests/typing-modules/unroll_private_abbrev.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M : sig diff --git a/testsuite/tests/typing-modules/variants_errors_test.ml b/testsuite/tests/typing-modules/variants_errors_test.ml index 253bc080e2d..dab5ad9541a 100644 --- a/testsuite/tests/typing-modules/variants_errors_test.ml +++ b/testsuite/tests/typing-modules/variants_errors_test.ml @@ -1,6 +1,6 @@ (* TEST - * expect - *) + expect; +*) module M1 : sig type t = diff --git a/testsuite/tests/typing-modules/with_ghosts.ml b/testsuite/tests/typing-modules/with_ghosts.ml index ab9ad14fa99..8824054fced 100644 --- a/testsuite/tests/typing-modules/with_ghosts.ml +++ b/testsuite/tests/typing-modules/with_ghosts.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** diff --git a/testsuite/tests/typing-multifile/pr6372.ml b/testsuite/tests/typing-multifile/pr6372.ml index 74457647daa..fd148a1603f 100644 --- a/testsuite/tests/typing-multifile/pr6372.ml +++ b/testsuite/tests/typing-multifile/pr6372.ml @@ -1,9 +1,9 @@ (* TEST -readonly_files = "d.mli e.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "d.mli" -*** ocamlc.byte -module = "e.ml" -**** check-ocamlc.byte-output + readonly_files = "d.mli e.ml"; + setup-ocamlc.byte-build-env; + module = "d.mli"; + ocamlc.byte; + module = "e.ml"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/typing-multifile/pr7325.ml b/testsuite/tests/typing-multifile/pr7325.ml index 87cad1ab54e..a30178f8e2a 100644 --- a/testsuite/tests/typing-multifile/pr7325.ml +++ b/testsuite/tests/typing-multifile/pr7325.ml @@ -1,13 +1,13 @@ (* TEST -readonly_files = "a.ml b.ml c.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "a.ml" -*** ocamlc.byte -module = "b.ml" -**** script -script = "rm a.cmi" -***** ocamlc.byte -module = "c.ml" -****** check-ocamlc.byte-output + readonly_files = "a.ml b.ml c.ml"; + setup-ocamlc.byte-build-env; + module = "a.ml"; + ocamlc.byte; + module = "b.ml"; + ocamlc.byte; + script = "rm a.cmi"; + script; + module = "c.ml"; + ocamlc.byte; + check-ocamlc.byte-output; *) diff --git a/testsuite/tests/typing-multifile/pr7563.ml b/testsuite/tests/typing-multifile/pr7563.ml index d7950efbeaf..87c8491dd35 100644 --- a/testsuite/tests/typing-multifile/pr7563.ml +++ b/testsuite/tests/typing-multifile/pr7563.ml @@ -1,5 +1,5 @@ (* TEST -modules = "f.ml" + modules = "f.ml"; *) exit (if F.Alias = F.alias then 0 else 1) diff --git a/testsuite/tests/typing-multifile/pr9218.ml b/testsuite/tests/typing-multifile/pr9218.ml index 3c025aff370..c2fb461a984 100644 --- a/testsuite/tests/typing-multifile/pr9218.ml +++ b/testsuite/tests/typing-multifile/pr9218.ml @@ -1,7 +1,7 @@ (* TEST - flags="-annot" - modules="a.ml" - *) + flags = "-annot"; + modules = "a.ml"; +*) (* Test interference between inline record path [a.A] and the [a.ml] compilation unit *) diff --git a/testsuite/tests/typing-objects-bugs/pr3968_bad.ml b/testsuite/tests/typing-objects-bugs/pr3968_bad.ml index e60b35044fb..02094f0a6e3 100644 --- a/testsuite/tests/typing-objects-bugs/pr3968_bad.ml +++ b/testsuite/tests/typing-objects-bugs/pr3968_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) type expr = @@ -27,3 +27,11 @@ object body | _ -> `App(l,r); end + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-objects-bugs/pr4018_bad.ml b/testsuite/tests/typing-objects-bugs/pr4018_bad.ml index a2a7235fefc..6142ea8a82a 100644 --- a/testsuite/tests/typing-objects-bugs/pr4018_bad.ml +++ b/testsuite/tests/typing-objects-bugs/pr4018_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) class virtual ['subject, 'event] observer = @@ -51,3 +51,11 @@ class world = end *) + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-objects-bugs/pr4435_bad.ml b/testsuite/tests/typing-objects-bugs/pr4435_bad.ml index 9cbd777ee45..fb2e486895b 100644 --- a/testsuite/tests/typing-objects-bugs/pr4435_bad.ml +++ b/testsuite/tests/typing-objects-bugs/pr4435_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Two v's in the same class *) @@ -17,3 +17,11 @@ class c (v : int) = inherit ((fun v -> object method v : string = v end) "42") end;; (new c 42)#v0;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-objects-bugs/pr4766_ok.ml b/testsuite/tests/typing-objects-bugs/pr4766_ok.ml index 565275a4992..fd240ee226c 100644 --- a/testsuite/tests/typing-objects-bugs/pr4766_ok.ml +++ b/testsuite/tests/typing-objects-bugs/pr4766_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) class virtual ['a] c = diff --git a/testsuite/tests/typing-objects-bugs/pr4824_ok.ml b/testsuite/tests/typing-objects-bugs/pr4824_ok.ml index 114a5a7534d..09748aef1da 100644 --- a/testsuite/tests/typing-objects-bugs/pr4824_ok.ml +++ b/testsuite/tests/typing-objects-bugs/pr4824_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module M : diff --git a/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference b/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference index 8c644ef0cd5..25019a24507 100644 --- a/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference +++ b/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference @@ -2,7 +2,10 @@ File "pr4824a_bad.ml", line 10, characters 2-45: 10 | struct class c x = object val x = x end end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Signature mismatch: - ... + Modules do not match: + sig class c : 'a -> object val x : 'a end end + is not included in + sig class c : 'a -> object val x : 'b end end Class declarations do not match: class c : 'a -> object val x : 'a end does not match diff --git a/testsuite/tests/typing-objects-bugs/pr4824a_bad.ml b/testsuite/tests/typing-objects-bugs/pr4824a_bad.ml index 566cd0c7718..cdd64860877 100644 --- a/testsuite/tests/typing-objects-bugs/pr4824a_bad.ml +++ b/testsuite/tests/typing-objects-bugs/pr4824a_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module M : sig class c : 'a -> object val x : 'b end end = @@ -12,3 +12,11 @@ module M : sig class c : 'a -> object val x : 'b end end = class c (x : int) = object inherit M.c x method x : bool = x end let r = (new c 2)#x;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-objects-bugs/pr5156_ok.ml b/testsuite/tests/typing-objects-bugs/pr5156_ok.ml index e17bf711d23..d3e85071a5b 100644 --- a/testsuite/tests/typing-objects-bugs/pr5156_ok.ml +++ b/testsuite/tests/typing-objects-bugs/pr5156_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) class type t = object end;; diff --git a/testsuite/tests/typing-objects-bugs/pr7284_bad.ml b/testsuite/tests/typing-objects-bugs/pr7284_bad.ml index ab7bc55d823..a868d5bc009 100644 --- a/testsuite/tests/typing-objects-bugs/pr7284_bad.ml +++ b/testsuite/tests/typing-objects-bugs/pr7284_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module type S = sig @@ -39,3 +39,11 @@ module type S = sig module N = F(M) let () = N.f (N.V2 0) + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-objects-bugs/pr7293_ok.ml b/testsuite/tests/typing-objects-bugs/pr7293_ok.ml index 40ba424e051..ae796dc03a8 100644 --- a/testsuite/tests/typing-objects-bugs/pr7293_ok.ml +++ b/testsuite/tests/typing-objects-bugs/pr7293_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) type t = T : t diff --git a/testsuite/tests/typing-objects-bugs/woodyatt_ok.ml b/testsuite/tests/typing-objects-bugs/woodyatt_ok.ml index a109ed052c2..b56953cdbd0 100644 --- a/testsuite/tests/typing-objects-bugs/woodyatt_ok.ml +++ b/testsuite/tests/typing-objects-bugs/woodyatt_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* test.ml *) diff --git a/testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml b/testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml index eb7ed2a72a1..fa4579ce243 100644 --- a/testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml +++ b/testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* The module begins *) diff --git a/testsuite/tests/typing-objects/Exemples.ml b/testsuite/tests/typing-objects/Exemples.ml index 59d08fdc2f9..982abbba655 100644 --- a/testsuite/tests/typing-objects/Exemples.ml +++ b/testsuite/tests/typing-objects/Exemples.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class point x_init = object diff --git a/testsuite/tests/typing-objects/Tests.ml b/testsuite/tests/typing-objects/Tests.ml index 8c415a796bc..87247198c48 100644 --- a/testsuite/tests/typing-objects/Tests.ml +++ b/testsuite/tests/typing-objects/Tests.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* Subtyping is "syntactic" *) diff --git a/testsuite/tests/typing-objects/abstract_rows.ml b/testsuite/tests/typing-objects/abstract_rows.ml index 0ae3d307a25..3b926925301 100644 --- a/testsuite/tests/typing-objects/abstract_rows.ml +++ b/testsuite/tests/typing-objects/abstract_rows.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type u = type t = private diff --git a/testsuite/tests/typing-objects/class_2.ml b/testsuite/tests/typing-objects/class_2.ml index 2d70884cdd7..09447683822 100644 --- a/testsuite/tests/typing-objects/class_2.ml +++ b/testsuite/tests/typing-objects/class_2.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* class expressions may also contain local recursive bindings *) diff --git a/testsuite/tests/typing-objects/dummy.ml b/testsuite/tests/typing-objects/dummy.ml index de8b18822ac..d85c5d102a7 100644 --- a/testsuite/tests/typing-objects/dummy.ml +++ b/testsuite/tests/typing-objects/dummy.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class virtual child1 parent = diff --git a/testsuite/tests/typing-objects/errors.ml b/testsuite/tests/typing-objects/errors.ml index 236f7e1d5bd..eb839fee151 100644 --- a/testsuite/tests/typing-objects/errors.ml +++ b/testsuite/tests/typing-objects/errors.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class type virtual ['a] c = object constraint 'a = [<`A of int & float] end diff --git a/testsuite/tests/typing-objects/field_kind.ml b/testsuite/tests/typing-objects/field_kind.ml index 287e3c6770c..53dea44bac2 100644 --- a/testsuite/tests/typing-objects/field_kind.ml +++ b/testsuite/tests/typing-objects/field_kind.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type _ t = Int : int t;; diff --git a/testsuite/tests/typing-objects/nongen.ml b/testsuite/tests/typing-objects/nongen.ml index acbd2965811..f4937be122b 100644 --- a/testsuite/tests/typing-objects/nongen.ml +++ b/testsuite/tests/typing-objects/nongen.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let x = ref None diff --git a/testsuite/tests/typing-objects/open_in_classes.ml b/testsuite/tests/typing-objects/open_in_classes.ml index 05f33b91925..f374c08393d 100644 --- a/testsuite/tests/typing-objects/open_in_classes.ml +++ b/testsuite/tests/typing-objects/open_in_classes.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M = struct diff --git a/testsuite/tests/typing-objects/pr11569.ml b/testsuite/tests/typing-objects/pr11569.ml index 321f0a9b25e..70d303852b3 100644 --- a/testsuite/tests/typing-objects/pr11569.ml +++ b/testsuite/tests/typing-objects/pr11569.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class ['a] c = object constraint 'a = int method m (x: bool #c) = () end;; diff --git a/testsuite/tests/typing-objects/pr5545.ml b/testsuite/tests/typing-objects/pr5545.ml index 8bb92adfda5..c0ec1b71eed 100644 --- a/testsuite/tests/typing-objects/pr5545.ml +++ b/testsuite/tests/typing-objects/pr5545.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type foo = int;; diff --git a/testsuite/tests/typing-objects/pr5619_bad.ml b/testsuite/tests/typing-objects/pr5619_bad.ml index bfbf6dd861b..766f5adc874 100644 --- a/testsuite/tests/typing-objects/pr5619_bad.ml +++ b/testsuite/tests/typing-objects/pr5619_bad.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class type foo_t = diff --git a/testsuite/tests/typing-objects/pr5858.ml b/testsuite/tests/typing-objects/pr5858.ml index a7f0bf84b32..6fa0162a862 100644 --- a/testsuite/tests/typing-objects/pr5858.ml +++ b/testsuite/tests/typing-objects/pr5858.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class type c = object end;; diff --git a/testsuite/tests/typing-objects/pr6123_bad.ml b/testsuite/tests/typing-objects/pr6123_bad.ml index 6dff6598ffc..066ae48472b 100644 --- a/testsuite/tests/typing-objects/pr6123_bad.ml +++ b/testsuite/tests/typing-objects/pr6123_bad.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class virtual name = diff --git a/testsuite/tests/typing-objects/pr6383.ml b/testsuite/tests/typing-objects/pr6383.ml index 12bc876ed81..3f9e701d303 100644 --- a/testsuite/tests/typing-objects/pr6383.ml +++ b/testsuite/tests/typing-objects/pr6383.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let f (x: #M.foo) = 0;; diff --git a/testsuite/tests/typing-objects/pr6907_bad.ml b/testsuite/tests/typing-objects/pr6907_bad.ml index cafe04f4404..7b5da5ba687 100644 --- a/testsuite/tests/typing-objects/pr6907_bad.ml +++ b/testsuite/tests/typing-objects/pr6907_bad.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class type ['e] t = object('s) diff --git a/testsuite/tests/typing-objects/pr7711_ok.ml b/testsuite/tests/typing-objects/pr7711_ok.ml index 7f188cf59bf..3f910e7f164 100644 --- a/testsuite/tests/typing-objects/pr7711_ok.ml +++ b/testsuite/tests/typing-objects/pr7711_ok.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a r = int; .. > as 'a;; diff --git a/testsuite/tests/typing-objects/self_cannot_be_closed.ml b/testsuite/tests/typing-objects/self_cannot_be_closed.ml index f2cbc406b1b..ccd0f918324 100644 --- a/testsuite/tests/typing-objects/self_cannot_be_closed.ml +++ b/testsuite/tests/typing-objects/self_cannot_be_closed.ml @@ -1,6 +1,6 @@ (* TEST - * expect - *) + expect; +*) let is_empty (x : < >) = ();; [%%expect {| val is_empty : < > -> unit = diff --git a/testsuite/tests/typing-objects/self_cannot_escape_pr7865.ml b/testsuite/tests/typing-objects/self_cannot_escape_pr7865.ml index d350fbb52c1..c192a16cfe0 100644 --- a/testsuite/tests/typing-objects/self_cannot_escape_pr7865.ml +++ b/testsuite/tests/typing-objects/self_cannot_escape_pr7865.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class c = diff --git a/testsuite/tests/typing-objects/unbound-type-var.ml b/testsuite/tests/typing-objects/unbound-type-var.ml index 9e00cea2021..1a533cac91d 100644 --- a/testsuite/tests/typing-objects/unbound-type-var.ml +++ b/testsuite/tests/typing-objects/unbound-type-var.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class test a c = diff --git a/testsuite/tests/typing-ocamlc-i/local.ml b/testsuite/tests/typing-ocamlc-i/local.ml index b820a9f6dc4..44be4bf40cf 100644 --- a/testsuite/tests/typing-ocamlc-i/local.ml +++ b/testsuite/tests/typing-ocamlc-i/local.ml @@ -1,8 +1,8 @@ (* TEST -flags = "-i -extension local" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = "-i"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) let f r = !r diff --git a/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference b/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference index cbd6419a7ba..ec49bdc0ae4 100644 --- a/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference @@ -3,11 +3,11 @@ Warning 63 [erroneous-printed-signature]: The printed interface differs from the The inferred interface contained items which could not be printed properly due to name collisions between identifiers. File "pervasives_leitmotiv.ml", lines 10-12, characters 0-3: - Definition of module Stdlib + Definition of module Stdlib/1 File "_none_", line 1: Definition of module Stdlib/2 Beware that this warning is purely informational and will not catch all instances of erroneous printed interface. type fpclass = A module Stdlib : sig type fpclass = B end -val f : fpclass -> Stdlib.fpclass -> Stdlib/2.fpclass +val f : fpclass -> Stdlib/1.fpclass -> Stdlib/2.fpclass diff --git a/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.ml b/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.ml index f6ec3f9b1d5..32bbfde36d1 100644 --- a/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.ml +++ b/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.ml @@ -1,8 +1,8 @@ -(* TEST -flags = "-i -w +63" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) type fpclass = A @@ -12,3 +12,10 @@ module Stdlib = struct end let f A Stdlib.B = FP_normal + +(* TEST + flags = "-i -w +63"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference b/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference index fa14e4a8f61..0ea6e282a20 100644 --- a/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference @@ -3,10 +3,10 @@ Warning 63 [erroneous-printed-signature]: The printed interface differs from the The inferred interface contained items which could not be printed properly due to name collisions between identifiers. File "pr4791.ml", line 11, characters 2-12: - Definition of type t + Definition of type t/1 File "pr4791.ml", line 8, characters 0-10: Definition of type t/2 Beware that this warning is purely informational and will not catch all instances of erroneous printed interface. type t = A -module B : sig type t = B val f : t/2 -> t end +module B : sig type t = B val f : t/2 -> t/1 end diff --git a/testsuite/tests/typing-ocamlc-i/pr4791.ml b/testsuite/tests/typing-ocamlc-i/pr4791.ml index f781017001a..953e44e9335 100644 --- a/testsuite/tests/typing-ocamlc-i/pr4791.ml +++ b/testsuite/tests/typing-ocamlc-i/pr4791.ml @@ -1,8 +1,8 @@ -(* TEST -flags = "-i -w +63" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) type t = A @@ -11,3 +11,10 @@ struct type t = B let f A = B end + +(* TEST + flags = "-i -w +63"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference b/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference index 6c09f3c1e8d..29e3342fad9 100644 --- a/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference @@ -3,7 +3,7 @@ Warning 63 [erroneous-printed-signature]: The printed interface differs from the The inferred interface contained items which could not be printed properly due to name collisions between identifiers. File "pr6323.ml", line 15, characters 2-24: - Definition of type t + Definition of type t/1 File "pr6323.ml", line 8, characters 0-26: Definition of type t/2 Beware that this warning is purely informational and will not catch diff --git a/testsuite/tests/typing-ocamlc-i/pr6323.ml b/testsuite/tests/typing-ocamlc-i/pr6323.ml index 7aff93f1fae..6084550d13c 100644 --- a/testsuite/tests/typing-ocamlc-i/pr6323.ml +++ b/testsuite/tests/typing-ocamlc-i/pr6323.ml @@ -1,8 +1,8 @@ -(* TEST -flags = "-i -w +63" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) type 'a t = B of 'a t list @@ -15,3 +15,10 @@ module DT = struct type 'a t = {bar : 'a} let p t = foo (fun x -> x) t end + +(* TEST + flags = "-i -w +63"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference b/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference index 2d0717a8a26..df578593ffb 100644 --- a/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference @@ -3,7 +3,7 @@ Warning 63 [erroneous-printed-signature]: The printed interface differs from the The inferred interface contained items which could not be printed properly due to name collisions between identifiers. File "pr7402.ml", lines 14-16, characters 0-5: - Definition of module M + Definition of module M/1 File "pr7402.ml", lines 8-11, characters 0-3: Definition of module M/2 Beware that this warning is purely informational and will not catch diff --git a/testsuite/tests/typing-ocamlc-i/pr7402.ml b/testsuite/tests/typing-ocamlc-i/pr7402.ml index b1ccef885e4..38b52e8fad7 100644 --- a/testsuite/tests/typing-ocamlc-i/pr7402.ml +++ b/testsuite/tests/typing-ocamlc-i/pr7402.ml @@ -1,8 +1,8 @@ -(* TEST -flags = "-i -w +63" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + *) module M: sig type t val v:t end = struct @@ -17,3 +17,10 @@ module M = struct let v = M.v end + +(* TEST + flags = "-i -w +63"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-ocamlc-i/pr7620_bad.ml b/testsuite/tests/typing-ocamlc-i/pr7620_bad.ml index 25d199a64ee..2775db7e9c9 100644 --- a/testsuite/tests/typing-ocamlc-i/pr7620_bad.ml +++ b/testsuite/tests/typing-ocamlc-i/pr7620_bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = "-i" -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) let t = (function `A | `B -> () : 'a) (`A : [`A]); (failwith "dummy" : 'a) (* to know how 'a is unified *) + +(* TEST + flags = "-i"; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-poly-bugs/pr5322_ok.ml b/testsuite/tests/typing-poly-bugs/pr5322_ok.ml index 7534c64f3ec..f6523107b8a 100644 --- a/testsuite/tests/typing-poly-bugs/pr5322_ok.ml +++ b/testsuite/tests/typing-poly-bugs/pr5322_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) type 'par t = 'par diff --git a/testsuite/tests/typing-poly-bugs/pr5673_ok.ml b/testsuite/tests/typing-poly-bugs/pr5673_ok.ml index f30487b18d3..73151ec9ebd 100644 --- a/testsuite/tests/typing-poly-bugs/pr5673_ok.ml +++ b/testsuite/tests/typing-poly-bugs/pr5673_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module Classdef = struct diff --git a/testsuite/tests/typing-poly-bugs/pr6922_ok.ml b/testsuite/tests/typing-poly-bugs/pr6922_ok.ml index a251762ede7..f05f09f8a98 100644 --- a/testsuite/tests/typing-poly-bugs/pr6922_ok.ml +++ b/testsuite/tests/typing-poly-bugs/pr6922_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module Order = struct diff --git a/testsuite/tests/typing-poly/error_messages.ml b/testsuite/tests/typing-poly/error_messages.ml index 02a6b748f7b..d25f9728449 100644 --- a/testsuite/tests/typing-poly/error_messages.ml +++ b/testsuite/tests/typing-poly/error_messages.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = < x : 'a. int as 'a > diff --git a/testsuite/tests/typing-poly/poly.ml b/testsuite/tests/typing-poly/poly.ml index 0894c199f21..647e27be542 100644 --- a/testsuite/tests/typing-poly/poly.ml +++ b/testsuite/tests/typing-poly/poly.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (* @@ -1795,10 +1795,10 @@ external reraise : exn -> 'a = "%reraise" module M : functor () -> sig - val f : 'a -> 'a - val g : 'a -> 'a - val h : 'a -> 'a - val i : 'a -> 'a + val f : ('a : any). 'a -> 'a + val g : ('a : any). 'a -> 'a + val h : ('a : any). 'a -> 'a + val i : ('a : any). 'a -> 'a end |}] diff --git a/testsuite/tests/typing-poly/poly_params.ml b/testsuite/tests/typing-poly/poly_params.ml index 98e3d2fd8eb..6770d341848 100644 --- a/testsuite/tests/typing-poly/poly_params.ml +++ b/testsuite/tests/typing-poly/poly_params.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let poly1 (id : 'a. 'a -> 'a) = id 3, id "three" @@ -359,3 +359,44 @@ let foo (f : p1) : p2 = (fun id -> f id) [%%expect {| val foo : p1 -> p2 = |}];; + +(* The typing of functions involves an extra step when + any parameter includes a GADT pattern. The below tests make sure + that this extra step is compatible with polymorphic + parameters. *) + +type ('a, 'b) eq = Eq : ('a, 'a) eq + +[%%expect {| +type ('a, 'b) eq = Eq : ('a, 'a) eq +|}];; + +let test_gadt1 (type b c) ~(run : 'a. 'a -> b -> b) (Eq : (b, c) eq) (b : b) : c = + run () b + +[%%expect {| +val test_gadt1 : run:('a. 'a -> 'b -> 'b) -> ('b, 'c) eq -> 'b -> 'c = +|}];; + +let test_gadt2 : type b c. run:('a. 'a -> b -> b) -> (b, c) eq -> b -> c = + fun ~run Eq b -> run () b + +[%%expect {| +val test_gadt2 : run:('a. 'a -> 'b -> 'b) -> ('b, 'c) eq -> 'b -> 'c = +|}];; + +let test_gadt_expected_fail : type a. ?eq:(a, int -> int) eq -> ('b. 'b -> 'b) -> a = + fun ?eq:(Eq : (a, int -> int) eq = assert false) id x -> id x + +[%%expect {| +Line 2, characters 2-63: +2 | fun ?eq:(Eq : (a, int -> int) eq = assert false) id x -> id x + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The syntactic arity of the function doesn't match the type constraint: + This function has 3 syntactic arguments, but its type is constrained to + ?eq:(a, int -> int) eq -> ('b. 'b -> 'b) -> a. + Hint: consider splitting the function definition into + fun ... gadt_pat -> fun ... + where gadt_pat is the pattern with the GADT constructor that + introduces the local type equation on a. +|}];; diff --git a/testsuite/tests/typing-poly/pr11544.ml b/testsuite/tests/typing-poly/pr11544.ml index 98d588bb5ae..4a127940022 100644 --- a/testsuite/tests/typing-poly/pr11544.ml +++ b/testsuite/tests/typing-poly/pr11544.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M = struct type t = T end diff --git a/testsuite/tests/typing-poly/pr7636.ml b/testsuite/tests/typing-poly/pr7636.ml index 16074ab5ee0..1c4ef67ccb7 100644 --- a/testsuite/tests/typing-poly/pr7636.ml +++ b/testsuite/tests/typing-poly/pr7636.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M = struct diff --git a/testsuite/tests/typing-poly/pr9603.ml b/testsuite/tests/typing-poly/pr9603.ml index 02f1e921b9d..9e48b344c5c 100644 --- a/testsuite/tests/typing-poly/pr9603.ml +++ b/testsuite/tests/typing-poly/pr9603.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'p pair = 'a * 'b constraint 'p = < left:'a; right:'b> diff --git a/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml b/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml index 7eabcd700b3..5475dfe11e8 100644 --- a/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml +++ b/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml @@ -1,16 +1,16 @@ -(* TEST -readonly_files = "pr3918a.mli pr3918b.mli" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "pr3918a.mli" -*** ocamlc.byte -module = "pr3918b.mli" -**** script -script = "rm -f pr3918a.cmi" -***** ocamlc.byte -module = "pr3918c.ml" -ocamlc_byte_exit_status = "2" -***** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + *) (* @@ -23,3 +23,21 @@ open Pr3918b let f x = (x : 'a vlist :> 'b vlist) let f (x : 'a vlist) = (x : 'b vlist) + +(* TEST + readonly_files = "pr3918a.mli pr3918b.mli"; + setup-ocamlc.byte-build-env; + module = "pr3918a.mli"; + ocamlc.byte; + module = "pr3918b.mli"; + ocamlc.byte; + script = "rm -f pr3918a.cmi"; + script; + { + module = "pr3918c.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + }{ + check-ocamlc.byte-output; + } +*) diff --git a/testsuite/tests/typing-polyvariants-bugs/pr10664.ml b/testsuite/tests/typing-polyvariants-bugs/pr10664.ml index 1957e1fce6b..109e1c5df2a 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr10664.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr10664.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) class idfunc = object diff --git a/testsuite/tests/typing-polyvariants-bugs/pr10664a.ml b/testsuite/tests/typing-polyvariants-bugs/pr10664a.ml index 31800806372..73f5248ccde 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr10664a.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr10664a.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) class idfunc = diff --git a/testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml b/testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml index e5d5f5978eb..bdbf3c438d3 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type Poly = sig diff --git a/testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml b/testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml index 7a0bffcd54a..b9f49b63ead 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type Priv = sig diff --git a/testsuite/tests/typing-polyvariants-bugs/pr5057_ok.ml b/testsuite/tests/typing-polyvariants-bugs/pr5057_ok.ml index 355eecd3ab4..cbc0b5a6a23 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr5057_ok.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr5057_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* PR5057 *) diff --git a/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.ml b/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.ml index fa610017227..85a11060c46 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* This one should fail *) @@ -13,3 +13,11 @@ let f flag = let _ = match flag with `A -> 0 | `B r -> r in let _ = match flag with `A -> T.mem | `B r -> r in () + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-polyvariants-bugs/pr7199_ok.ml b/testsuite/tests/typing-polyvariants-bugs/pr7199_ok.ml index 75ef0cce6a6..2f8d2d0217b 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr7199_ok.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr7199_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module type S = sig diff --git a/testsuite/tests/typing-polyvariants-bugs/pr7817_bad.ml b/testsuite/tests/typing-polyvariants-bugs/pr7817_bad.ml index 999420fd2b5..99ae3509305 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr7817_bad.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr7817_bad.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let r = ref None diff --git a/testsuite/tests/typing-polyvariants-bugs/pr7824.ml b/testsuite/tests/typing-polyvariants-bugs/pr7824.ml index a58c9ddc986..f2901c3bb95 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr7824.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr7824.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module Element : sig diff --git a/testsuite/tests/typing-polyvariants-bugs/pr8575.ml b/testsuite/tests/typing-polyvariants-bugs/pr8575.ml index 98a70d80c1f..1cb1bc3b38a 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr8575.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr8575.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module A = struct type t = A | B let x = B end;; diff --git a/testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml b/testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml index 9274c9d4af5..4858be18b43 100644 --- a/testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml +++ b/testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) type 'a termpc = diff --git a/testsuite/tests/typing-private-bugs/pr5026_bad.ml b/testsuite/tests/typing-private-bugs/pr5026_bad.ml index c62a3cb99cc..cc3509b2427 100644 --- a/testsuite/tests/typing-private-bugs/pr5026_bad.ml +++ b/testsuite/tests/typing-private-bugs/pr5026_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) type untyped;; @@ -17,3 +17,11 @@ end;; class ['a] s3object r : ['a] s3 = object val underlying = r end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-private-bugs/pr5469_ok.ml b/testsuite/tests/typing-private-bugs/pr5469_ok.ml index a5f36390a75..faa2eaa4adf 100644 --- a/testsuite/tests/typing-private-bugs/pr5469_ok.ml +++ b/testsuite/tests/typing-private-bugs/pr5469_ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module M (T:sig type t end) diff --git a/testsuite/tests/typing-private/invalid_private_row.ml b/testsuite/tests/typing-private/invalid_private_row.ml index 361b982c11b..18ec0fc71d6 100644 --- a/testsuite/tests/typing-private/invalid_private_row.ml +++ b/testsuite/tests/typing-private/invalid_private_row.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** Error message for trying to make private a row type variable diff --git a/testsuite/tests/typing-private/private.ml b/testsuite/tests/typing-private/private.ml index 156e9ba51d4..bd2b9da5e95 100644 --- a/testsuite/tests/typing-private/private.ml +++ b/testsuite/tests/typing-private/private.ml @@ -1,6 +1,9 @@ (* TEST - * toplevel - * toplevel with principal + { + toplevel; + }{ + toplevel with principal; + } *) module Foobar : sig diff --git a/testsuite/tests/typing-recmod/gpr1626.ml b/testsuite/tests/typing-recmod/gpr1626.ml index 9629f2c6030..69429ec142d 100644 --- a/testsuite/tests/typing-recmod/gpr1626.ml +++ b/testsuite/tests/typing-recmod/gpr1626.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module type S = sig module M : sig end module N = M end;; diff --git a/testsuite/tests/typing-recmod/pr6491.ml b/testsuite/tests/typing-recmod/pr6491.ml index ab8ac0da4ae..2d6dcb9668e 100644 --- a/testsuite/tests/typing-recmod/pr6491.ml +++ b/testsuite/tests/typing-recmod/pr6491.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module rec Foo : sig class type c = object method x : int end end = Foo diff --git a/testsuite/tests/typing-recmod/pr9494.ml b/testsuite/tests/typing-recmod/pr9494.ml index 41fda6aa158..2b5c17d0251 100644 --- a/testsuite/tests/typing-recmod/pr9494.ml +++ b/testsuite/tests/typing-recmod/pr9494.ml @@ -1,5 +1,5 @@ -(* TEST -*) +(* TEST_BELOW +(* Blank lines added here to preserve locations. *)*) (* PR#9494 *) @@ -36,3 +36,6 @@ let _ = try let basic_set = IdSet.singleton {id = 0} in IdSet.mem {id = 1} basic_set (* diverge here *) with e -> print_endline @@ Printexc.to_string e; false + +(* TEST +*) diff --git a/testsuite/tests/typing-recmod/t01bad.ml b/testsuite/tests/typing-recmod/t01bad.ml index 5bf6197f370..faedd9f2e84 100644 --- a/testsuite/tests/typing-recmod/t01bad.ml +++ b/testsuite/tests/typing-recmod/t01bad.ml @@ -1,10 +1,18 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (t = t) *) module rec A : sig type t = A.t end = struct type t = A.t end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t02bad.ml b/testsuite/tests/typing-recmod/t02bad.ml index 1faba72b875..9a52879bcd4 100644 --- a/testsuite/tests/typing-recmod/t02bad.ml +++ b/testsuite/tests/typing-recmod/t02bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (t = t) *) module rec A : sig type t = B.t end = struct type t = B.t end and B : sig type t = A.t end = struct type t = A.t end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t03ok.ml b/testsuite/tests/typing-recmod/t03ok.ml index a1c9b32a95d..94e4a09f322 100644 --- a/testsuite/tests/typing-recmod/t03ok.ml +++ b/testsuite/tests/typing-recmod/t03ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* OK (t = int) *) diff --git a/testsuite/tests/typing-recmod/t04bad.ml b/testsuite/tests/typing-recmod/t04bad.ml index a671b414d4c..6f39c910e1d 100644 --- a/testsuite/tests/typing-recmod/t04bad.ml +++ b/testsuite/tests/typing-recmod/t04bad.ml @@ -1,10 +1,18 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (t = int * t) *) module rec A : sig type t = int * A.t end = struct type t = int * A.t end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t05bad.ml b/testsuite/tests/typing-recmod/t05bad.ml index 1f1df6c590b..94d4fc25873 100644 --- a/testsuite/tests/typing-recmod/t05bad.ml +++ b/testsuite/tests/typing-recmod/t05bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (t = t -> int) *) module rec A : sig type t = B.t -> int end = struct type t = B.t -> int end and B : sig type t = A.t end = struct type t = A.t end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t06ok.ml b/testsuite/tests/typing-recmod/t06ok.ml index a0cfebdbc2d..c39b0fa99a5 100644 --- a/testsuite/tests/typing-recmod/t06ok.ml +++ b/testsuite/tests/typing-recmod/t06ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* OK (t = ) *) diff --git a/testsuite/tests/typing-recmod/t07bad.ml b/testsuite/tests/typing-recmod/t07bad.ml index 27e8f1859f7..61f89722530 100644 --- a/testsuite/tests/typing-recmod/t07bad.ml +++ b/testsuite/tests/typing-recmod/t07bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (not regular) *) module rec A : sig type 'a t = end = struct type 'a t = end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t08bad.ml b/testsuite/tests/typing-recmod/t08bad.ml index 46d2b727c4b..341459a6d13 100644 --- a/testsuite/tests/typing-recmod/t08bad.ml +++ b/testsuite/tests/typing-recmod/t08bad.ml @@ -1,12 +1,20 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (not regular) *) module rec A : sig type 'a t = end = struct type 'a t = end and B : sig type 'a t = 'a A.t end = struct type 'a t = 'a A.t end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t09bad.ml b/testsuite/tests/typing-recmod/t09bad.ml index 9ac5d3133d8..21fa28620db 100644 --- a/testsuite/tests/typing-recmod/t09bad.ml +++ b/testsuite/tests/typing-recmod/t09bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (not regular) *) @@ -11,3 +11,11 @@ module rec A : sig type 'a t = 'a B.t end = struct type 'a t = 'a B.t end and B : sig type 'a t = end = struct type 'a t = end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t10ok.ml b/testsuite/tests/typing-recmod/t10ok.ml index 626ab888fcb..8f8b376f34b 100644 --- a/testsuite/tests/typing-recmod/t10ok.ml +++ b/testsuite/tests/typing-recmod/t10ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* OK *) diff --git a/testsuite/tests/typing-recmod/t11bad.ml b/testsuite/tests/typing-recmod/t11bad.ml index f6f2fed8468..58f186ebdbe 100644 --- a/testsuite/tests/typing-recmod/t11bad.ml +++ b/testsuite/tests/typing-recmod/t11bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (not regular) *) @@ -11,3 +11,11 @@ module rec A : sig type 'a t = 'a list B.t end = struct type 'a t = 'a list B.t end and B : sig type 'a t = end = struct type 'a t = end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t12bad.ml b/testsuite/tests/typing-recmod/t12bad.ml index cbc8c5bbaf8..f7a5ec730c5 100644 --- a/testsuite/tests/typing-recmod/t12bad.ml +++ b/testsuite/tests/typing-recmod/t12bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad (not regular) *) @@ -19,3 +19,11 @@ module rec M : = fun f -> new M.c (f x) end end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t13ok.ml b/testsuite/tests/typing-recmod/t13ok.ml index ee50f89041a..0b0eb850737 100644 --- a/testsuite/tests/typing-recmod/t13ok.ml +++ b/testsuite/tests/typing-recmod/t13ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* OK *) diff --git a/testsuite/tests/typing-recmod/t14bad.ml b/testsuite/tests/typing-recmod/t14bad.ml index 4fe91cccc18..ec5f926b34c 100644 --- a/testsuite/tests/typing-recmod/t14bad.ml +++ b/testsuite/tests/typing-recmod/t14bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad - PR 4261 *) @@ -23,3 +23,11 @@ module PR_4261 = struct module rec U : T with type D.t = U'.t = U and U' : S with type t = U'.t = U end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t15bad.ml b/testsuite/tests/typing-recmod/t15bad.ml index efb99e681ea..25840b192a5 100644 --- a/testsuite/tests/typing-recmod/t15bad.ml +++ b/testsuite/tests/typing-recmod/t15bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = " -w -a " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) (* Bad - PR 4512 *) module type S' = sig type t = int end module rec M : S' with type t = M.t = struct type t = M.t end;; + +(* TEST + flags = " -w -a "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-recmod/t16ok.ml b/testsuite/tests/typing-recmod/t16ok.ml index 1e87f4f82d2..96090e147be 100644 --- a/testsuite/tests/typing-recmod/t16ok.ml +++ b/testsuite/tests/typing-recmod/t16ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* PR#4450 *) diff --git a/testsuite/tests/typing-recmod/t17ok.ml b/testsuite/tests/typing-recmod/t17ok.ml index 2a760d10135..3518ed71f7c 100644 --- a/testsuite/tests/typing-recmod/t17ok.ml +++ b/testsuite/tests/typing-recmod/t17ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* A synthetic example of bootstrapped data structure diff --git a/testsuite/tests/typing-recmod/t18ok.ml b/testsuite/tests/typing-recmod/t18ok.ml index e4e3ffa6112..f5309952ac0 100644 --- a/testsuite/tests/typing-recmod/t18ok.ml +++ b/testsuite/tests/typing-recmod/t18ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* PR 4470: simplified from OMake's sources *) diff --git a/testsuite/tests/typing-recmod/t20ok.ml b/testsuite/tests/typing-recmod/t20ok.ml index ae0eed32640..5fe410f7114 100644 --- a/testsuite/tests/typing-recmod/t20ok.ml +++ b/testsuite/tests/typing-recmod/t20ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* PR 4557 *) diff --git a/testsuite/tests/typing-recmod/t21ok.ml b/testsuite/tests/typing-recmod/t21ok.ml index 2c97da3fb9b..9eb46a1209b 100644 --- a/testsuite/tests/typing-recmod/t21ok.ml +++ b/testsuite/tests/typing-recmod/t21ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) module F ( X : Set.OrderedType ) = struct diff --git a/testsuite/tests/typing-recmod/t22ok.ml b/testsuite/tests/typing-recmod/t22ok.ml index 4709f23c9a7..2b5b4d051d3 100644 --- a/testsuite/tests/typing-recmod/t22ok.ml +++ b/testsuite/tests/typing-recmod/t22ok.ml @@ -1,8 +1,8 @@ (* TEST -flags = " -w -a " -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output + flags = " -w -a "; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; *) (* Tests for recursive modules *) diff --git a/testsuite/tests/typing-recordarg/recordarg.ml b/testsuite/tests/typing-recordarg/recordarg.ml index 5477de1e8ab..7aa9939cb6f 100644 --- a/testsuite/tests/typing-recordarg/recordarg.ml +++ b/testsuite/tests/typing-recordarg/recordarg.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) type t = A of {x:int; mutable y:int};; diff --git a/testsuite/tests/typing-rectypes-bugs/pr5343_bad.ml b/testsuite/tests/typing-rectypes-bugs/pr5343_bad.ml index 518dafe0194..e576d931974 100644 --- a/testsuite/tests/typing-rectypes-bugs/pr5343_bad.ml +++ b/testsuite/tests/typing-rectypes-bugs/pr5343_bad.ml @@ -1,9 +1,9 @@ -(* TEST -flags = " -w -a -rectypes " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module M : sig @@ -19,3 +19,11 @@ end = struct end;; let h (x : int) : bool = M.g (M.f x);; + +(* TEST + flags = " -w -a -rectypes "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-rectypes-bugs/pr6174_bad.ml b/testsuite/tests/typing-rectypes-bugs/pr6174_bad.ml index d5c704416cc..e0f92db7d9e 100644 --- a/testsuite/tests/typing-rectypes-bugs/pr6174_bad.ml +++ b/testsuite/tests/typing-rectypes-bugs/pr6174_bad.ml @@ -1,11 +1,19 @@ -(* TEST -flags = " -w -a -rectypes " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) type _ t = C : ((('a -> 'o) -> 'o) -> ('b -> 'o) -> 'o) t let f : type a o. ((a -> o) -> o) t -> (a -> o) -> o = fun C k -> k (fun x -> x);; + +(* TEST + flags = " -w -a -rectypes "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml index 186e07088b0..a04e08eae74 100644 --- a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml +++ b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml @@ -1,10 +1,18 @@ -(* TEST -flags = " -w -a -rectypes " -ocamlc_byte_exit_status = "2" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + *) module type T = sig type 'a t end module Fix (T : T) = struct type r = ('r T.t as 'r) end + +(* TEST + flags = " -w -a -rectypes "; + ocamlc_byte_exit_status = "2"; + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-safe-linking/b_bad.ml b/testsuite/tests/typing-safe-linking/b_bad.ml index 33eecadf6ef..dd67c54a8a9 100644 --- a/testsuite/tests/typing-safe-linking/b_bad.ml +++ b/testsuite/tests/typing-safe-linking/b_bad.ml @@ -1,13 +1,13 @@ -(* TEST -readonly_files = "a.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "a.ml" -*** ocamlc.byte -module = "b_bad.ml" -flags = "-warn-error +8" -ocamlc_byte_exit_status = "2" -**** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + *) let f : string A.t -> unit = function @@ -16,3 +16,15 @@ let f : string A.t -> unit = function (* It is important that the line below is the last line of the file (see Makefile) *) let () = f A.y + +(* TEST + readonly_files = "a.ml"; + setup-ocamlc.byte-build-env; + module = "a.ml"; + ocamlc.byte; + module = "b_bad.ml"; + flags = "-warn-error +8"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile.ml b/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile.ml index 68401fa56e7..38aed3e4723 100644 --- a/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile.ml +++ b/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile.ml @@ -1,4 +1,4 @@ (* TEST - modules = "largeFile.ml" + modules = "largeFile.ml"; *) print_endline LargeFile.message diff --git a/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile_top.ml b/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile_top.ml index 883e8c79430..e436262dce6 100644 --- a/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile_top.ml +++ b/testsuite/tests/typing-shadowing-of-pervasives-submodules/redefine_largefile_top.ml @@ -1,15 +1,15 @@ (* TEST - readonly_files = "largeFile.ml" - * setup-ocaml-build-env - ** ocamlc.byte - compile_only = "true" - all_modules = "largeFile.ml" - *** script - script = "mkdir -p inc" - **** script - script = "mv largeFile.cmi largeFile.cmo inc/" - ***** ocaml - ****** check-ocaml-output + readonly_files = "largeFile.ml"; + setup-ocaml-build-env; + compile_only = "true"; + all_modules = "largeFile.ml"; + ocamlc.byte; + script = "mkdir -p inc"; + script; + script = "mv largeFile.cmi largeFile.cmo inc/"; + script; + ocaml; + check-ocaml-output; *) #directory "inc";; #load "largeFile.cmo";; diff --git a/testsuite/tests/typing-short-paths/errors.ml b/testsuite/tests/typing-short-paths/errors.ml index 8c78b5f49d3..c0562e39341 100644 --- a/testsuite/tests/typing-short-paths/errors.ml +++ b/testsuite/tests/typing-short-paths/errors.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -short-paths " - * expect + flags = " -short-paths "; + expect; *) module M = struct type t = T end @@ -86,9 +86,9 @@ Line 1, characters 0-75: 1 | module rec A : sig type t = B.t -> int end = struct type t = B.t -> int end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The definition of A.t contains a cycle: - B.t -> int contains B.t, - B.t = B.t, - B.t = B.t -> int, - B.t -> int contains B.t, - B.t = B.t + A.t -> int contains A.t, + A.t = A.t, + A.t = A.t -> int, + A.t -> int contains A.t, + A.t = A.t |}] diff --git a/testsuite/tests/typing-short-paths/gpr1223.ml b/testsuite/tests/typing-short-paths/gpr1223.ml index 9e66dfb90ee..2a631f34e3e 100644 --- a/testsuite/tests/typing-short-paths/gpr1223.ml +++ b/testsuite/tests/typing-short-paths/gpr1223.ml @@ -1,7 +1,7 @@ (* TEST - flags = " -short-paths " - modules = "gpr1223_foo.mli gpr1223_bar.mli" - * toplevel + flags = " -short-paths "; + modules = "gpr1223_foo.mli gpr1223_bar.mli"; + toplevel; *) let y = Gpr1223_bar.N.O.T;; diff --git a/testsuite/tests/typing-short-paths/pr5918.ml b/testsuite/tests/typing-short-paths/pr5918.ml index 191ee1fde0a..4eac4e28a0c 100644 --- a/testsuite/tests/typing-short-paths/pr5918.ml +++ b/testsuite/tests/typing-short-paths/pr5918.ml @@ -1,6 +1,6 @@ -(* TEST - flags = " -short-paths " - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) module rec A : sig @@ -10,3 +10,8 @@ end = struct let _ = { a = () } end ;; + +(* TEST + flags = " -short-paths "; + toplevel; +*) diff --git a/testsuite/tests/typing-short-paths/pr6836.ml b/testsuite/tests/typing-short-paths/pr6836.ml index ade6635b0cc..93a8b3ee45c 100644 --- a/testsuite/tests/typing-short-paths/pr6836.ml +++ b/testsuite/tests/typing-short-paths/pr6836.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -short-paths " - * toplevel + flags = " -short-paths "; + toplevel; *) type t = [`A | `B];; diff --git a/testsuite/tests/typing-short-paths/pr7543.ml b/testsuite/tests/typing-short-paths/pr7543.ml index abe5d5306b6..3dc33fb4c7d 100644 --- a/testsuite/tests/typing-short-paths/pr7543.ml +++ b/testsuite/tests/typing-short-paths/pr7543.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -short-paths " - * toplevel + flags = " -short-paths "; + toplevel; *) (** Test that short-path printtyp does not fail on packed module. diff --git a/testsuite/tests/typing-short-paths/short-paths.compilers.reference b/testsuite/tests/typing-short-paths/short-paths.compilers.reference index 898061db5c5..32991c1e22a 100644 --- a/testsuite/tests/typing-short-paths/short-paths.compilers.reference +++ b/testsuite/tests/typing-short-paths/short-paths.compilers.reference @@ -87,7 +87,7 @@ type t1 = A module M1 : sig type u = v and v = t1 end module N1 : sig type u = v and v = t1 end type t1 = B -module N2 : sig type u = v and v = N1.v end +module N2 : sig type u = v and v = t1/2 end module type PR6566 = sig type t = string end module PR6566 : sig type t = int end Line 1, characters 26-32: diff --git a/testsuite/tests/typing-short-paths/short-paths.ml b/testsuite/tests/typing-short-paths/short-paths.ml index e6721af45fd..c5c725ed432 100644 --- a/testsuite/tests/typing-short-paths/short-paths.ml +++ b/testsuite/tests/typing-short-paths/short-paths.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -short-paths " - * toplevel + flags = " -short-paths "; + toplevel; *) module Core = struct diff --git a/testsuite/tests/typing-signatures/els.ml b/testsuite/tests/typing-signatures/els.ml index a438c735aac..429d68e4ca3 100644 --- a/testsuite/tests/typing-signatures/els.ml +++ b/testsuite/tests/typing-signatures/els.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) (* Adapted from: An Expressive Language of Signatures diff --git a/testsuite/tests/typing-signatures/els.ocaml.reference b/testsuite/tests/typing-signatures/els.ocaml.reference index 6ed436effe0..678b88e7daf 100644 --- a/testsuite/tests/typing-signatures/els.ocaml.reference +++ b/testsuite/tests/typing-signatures/els.ocaml.reference @@ -79,16 +79,12 @@ module type WEAPON_LIB = sig type t = Weapon.t module T : - sig - type t = t/2 - val eq : t -> t -> bool - val to_string : t -> string - end + sig type t = t val eq : t -> t -> bool val to_string : t -> string end module Make : functor (TV : sig type combined - type t = t/2 + type t = t val map : (combined -> t) * (t -> combined) end) -> USERCODE(TV).F diff --git a/testsuite/tests/typing-signatures/nondep_regression.ml b/testsuite/tests/typing-signatures/nondep_regression.ml index 76033b3c4e3..2e446b44e50 100644 --- a/testsuite/tests/typing-signatures/nondep_regression.ml +++ b/testsuite/tests/typing-signatures/nondep_regression.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type 'a seq = 'a list diff --git a/testsuite/tests/typing-signatures/pr6371.ml b/testsuite/tests/typing-signatures/pr6371.ml index c5516c3f2f7..d7b36fdc0b8 100644 --- a/testsuite/tests/typing-signatures/pr6371.ml +++ b/testsuite/tests/typing-signatures/pr6371.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) module M = struct diff --git a/testsuite/tests/typing-signatures/pr6672.ml b/testsuite/tests/typing-signatures/pr6672.ml index 66852161de4..1a533e6ba6e 100644 --- a/testsuite/tests/typing-signatures/pr6672.ml +++ b/testsuite/tests/typing-signatures/pr6672.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) module type S = sig type 'a t end;; diff --git a/testsuite/tests/typing-sigsubst/sig_local_aliases.ml b/testsuite/tests/typing-sigsubst/sig_local_aliases.ml index 096312adfac..a13be7ae850 100644 --- a/testsuite/tests/typing-sigsubst/sig_local_aliases.ml +++ b/testsuite/tests/typing-sigsubst/sig_local_aliases.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module M = struct diff --git a/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.ml b/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.ml index b387ec6aee0..b56f6eebc50 100644 --- a/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.ml +++ b/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.ml @@ -1,5 +1,5 @@ -(* TEST - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) *) module type Rejected1 = sig @@ -34,3 +34,7 @@ end;; module type Rejected0 = sig type nonrec t := int end;; + +(* TEST + toplevel; +*) diff --git a/testsuite/tests/typing-sigsubst/sigsubst.ml b/testsuite/tests/typing-sigsubst/sigsubst.ml index 1acad669c2e..56aba97a9dd 100644 --- a/testsuite/tests/typing-sigsubst/sigsubst.ml +++ b/testsuite/tests/typing-sigsubst/sigsubst.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) module type Printable = sig @@ -24,7 +24,7 @@ end Line 3, characters 2-36: 3 | include Comparable with type t = t ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Illegal shadowing of included type t/2 by t. +Error: Illegal shadowing of included type t/2 by t/1. Line 2, characters 2-19: 2 | include Printable ^^^^^^^^^^^^^^^^^ diff --git a/testsuite/tests/typing-sigsubst/test_locations.compilers.reference b/testsuite/tests/typing-sigsubst/test_locations.compilers.reference index 8e2539fc1a8..fa09d283633 100644 --- a/testsuite/tests/typing-sigsubst/test_locations.compilers.reference +++ b/testsuite/tests/typing-sigsubst/test_locations.compilers.reference @@ -2,7 +2,14 @@ File "test_loc_type_eq.ml", line 1, characters 49-76: 1 | module M : Test_functor.S with type elt = unit = Test_functor.Apply (String) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Signature mismatch: - ... + Modules do not match: + sig + type elt = String.t + type t = Test_functor.Apply(String).t + val create : elt -> t + end + is not included in + sig type elt = unit type t val create : elt -> t end Type declarations do not match: type elt = String.t is not included in @@ -35,7 +42,14 @@ File "test_loc_type_subst.ml", line 1, characters 50-77: 1 | module M : Test_functor.S with type elt := unit = Test_functor.Apply (String) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Signature mismatch: - ... + Modules do not match: + sig + type elt = String.t + type t = Test_functor.Apply(String).t + val create : elt -> t + end + is not included in + sig type t val create : unit -> t end Values do not match: val create : elt -> t is not included in diff --git a/testsuite/tests/typing-sigsubst/test_locations.ml b/testsuite/tests/typing-sigsubst/test_locations.ml index 4e727100f45..45d75ee9b5f 100644 --- a/testsuite/tests/typing-sigsubst/test_locations.ml +++ b/testsuite/tests/typing-sigsubst/test_locations.ml @@ -1,26 +1,33 @@ (* TEST -readonly_files = "test_functor.ml test_loc_modtype_type_eq.ml \ - test_loc_modtype_type_subst.ml test_loc_type_eq.ml \ - test_loc_type_subst.ml mpr7852.mli" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "test_functor.ml" -** ocamlc.byte -module = "test_loc_type_eq.ml" -ocamlc_byte_exit_status = "2" -** ocamlc.byte -module = "test_loc_modtype_type_eq.ml" -ocamlc_byte_exit_status = "2" -** ocamlc.byte -module = "test_loc_type_subst.ml" -ocamlc_byte_exit_status = "2" -** ocamlc.byte -module = "test_loc_modtype_type_subst.ml" -ocamlc_byte_exit_status = "2" -** check-ocamlc.byte-output -** ocamlc.byte -flags = "-w +32" -module = "mpr7852.mli" -ocamlc_byte_exit_status = "0" -** check-ocamlc.byte-output + readonly_files = "test_functor.ml test_loc_modtype_type_eq.ml test_loc_modtype_type_subst.ml test_loc_type_eq.ml test_loc_type_subst.ml mpr7852.mli"; + setup-ocamlc.byte-build-env; + { + module = "test_functor.ml"; + ocamlc.byte; + }{ + module = "test_loc_type_eq.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + }{ + module = "test_loc_modtype_type_eq.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + }{ + module = "test_loc_type_subst.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + }{ + module = "test_loc_modtype_type_subst.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + }{ + check-ocamlc.byte-output; + }{ + flags = "-w +32"; + module = "mpr7852.mli"; + ocamlc_byte_exit_status = "0"; + ocamlc.byte; + }{ + check-ocamlc.byte-output; + } *) diff --git a/testsuite/tests/typing-simd/test_disabled.ml b/testsuite/tests/typing-simd/test_disabled.ml index 53a0ed55d11..84ac7c54eee 100644 --- a/testsuite/tests/typing-simd/test_disabled.ml +++ b/testsuite/tests/typing-simd/test_disabled.ml @@ -1,5 +1,6 @@ (* TEST - * expect + flags = "-no-extension simd"; + expect; *) type t = int8x16;; @@ -16,7 +17,7 @@ Line 1, characters 9-16: 1 | type t = int16x8;; ^^^^^^^ Error: Unbound type constructor int16x8 -Hint: Did you mean int64? +Hint: Did you mean int64 or int64#? |}];; type t = int32x4;; @@ -25,7 +26,7 @@ Line 1, characters 9-16: 1 | type t = int32x4;; ^^^^^^^ Error: Unbound type constructor int32x4 -Hint: Did you mean int32? +Hint: Did you mean int32 or int32#? |}];; type t = int64x2;; @@ -34,7 +35,7 @@ Line 1, characters 9-16: 1 | type t = int64x2;; ^^^^^^^ Error: Unbound type constructor int64x2 -Hint: Did you mean int64? +Hint: Did you mean int64 or int64#? |}];; type t = float32x4;; @@ -43,6 +44,7 @@ Line 1, characters 9-18: 1 | type t = float32x4;; ^^^^^^^^^ Error: Unbound type constructor float32x4 +Hint: Did you mean float32 or float32#? |}];; type t = float64x2;; @@ -51,4 +53,5 @@ Line 1, characters 9-18: 1 | type t = float64x2;; ^^^^^^^^^ Error: Unbound type constructor float64x2 +Hint: Did you mean float32? |}];; diff --git a/testsuite/tests/typing-simd/test_enabled.ml b/testsuite/tests/typing-simd/test_enabled.ml index 4602d14631f..20ed8129759 100644 --- a/testsuite/tests/typing-simd/test_enabled.ml +++ b/testsuite/tests/typing-simd/test_enabled.ml @@ -1,6 +1,5 @@ (* TEST - flags = "-extension simd" - * expect + expect; *) type t = int8x16;; @@ -32,4 +31,3 @@ type t = float64x2;; [%%expect{| type t = float64x2 |}];; - diff --git a/testsuite/tests/typing-small-numbers/test_disabled.ml b/testsuite/tests/typing-small-numbers/test_disabled.ml new file mode 100644 index 00000000000..7b6cd78da97 --- /dev/null +++ b/testsuite/tests/typing-small-numbers/test_disabled.ml @@ -0,0 +1,208 @@ +(* TEST + flags = "-no-extension small_numbers"; + expect; +*) + +(* Boxed float32 *) + +type t = float32;; +[%%expect{| +Line 1, characters 9-16: +1 | type t = float32;; + ^^^^^^^ +Error: Unbound type constructor float32 +Hint: Did you mean float, float# or float32x4? +|}];; + +let _ = 1.0s;; +[%%expect{| +Line 1, characters 8-12: +1 | let _ = 1.0s;; + ^^^^ +Error: Found 32-bit float literal 1.0s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 1.s;; +[%%expect{| +Line 1, characters 8-11: +1 | let _ = 1.s;; + ^^^ +Error: Found 32-bit float literal 1.s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 1e10s;; +[%%expect{| +Line 1, characters 8-13: +1 | let _ = 1e10s;; + ^^^^^ +Error: Found 32-bit float literal 1e10s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 1e+1s;; +[%%expect{| +Line 1, characters 8-13: +1 | let _ = 1e+1s;; + ^^^^^ +Error: Found 32-bit float literal 1e+1s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 1e-1s;; +[%%expect{| +Line 1, characters 8-13: +1 | let _ = 1e-1s;; + ^^^^^ +Error: Found 32-bit float literal 1e-1s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 0x111.000s;; +[%%expect{| +Line 1, characters 8-18: +1 | let _ = 0x111.000s;; + ^^^^^^^^^^ +Error: Found 32-bit float literal 0x111.000s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 0x1.4p+0s;; +[%%expect{| +Line 1, characters 8-17: +1 | let _ = 0x1.4p+0s;; + ^^^^^^^^^ +Error: Found 32-bit float literal 0x1.4p+0s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 0xf.ffffffffffff8p+1020s;; +[%%expect{| +Line 1, characters 8-32: +1 | let _ = 0xf.ffffffffffff8p+1020s;; + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Found 32-bit float literal 0xf.ffffffffffff8p+1020s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 0x8p-972s;; +[%%expect{| +Line 1, characters 8-17: +1 | let _ = 0x8p-972s;; + ^^^^^^^^^ +Error: Found 32-bit float literal 0x8p-972s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let _ = 0xc.d5e6fp+1_24s;; +[%%expect{| +Line 1, characters 8-24: +1 | let _ = 0xc.d5e6fp+1_24s;; + ^^^^^^^^^^^^^^^^ +Error: Found 32-bit float literal 0xc.d5e6fp+1_24s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = + match 0.0s with + | _ -> () +;; +[%%expect{| +Line 2, characters 8-12: +2 | match 0.0s with + ^^^^ +Error: Found 32-bit float literal 0.0s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +(* Unboxed float32 *) + +type t = float32#;; +[%%expect{| +Line 1, characters 9-17: +1 | type t = float32#;; + ^^^^^^^^ +Error: Unbound type constructor float32# +Hint: Did you mean float# or float32x4? +|}];; + +let () = ignore #1.0s;; +[%%expect{| +Line 1, characters 16-21: +1 | let () = ignore #1.0s;; + ^^^^^ +Error: Found 32-bit float literal #1.0s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #1.s;; +[%%expect{| +Line 1, characters 16-20: +1 | let () = ignore #1.s;; + ^^^^ +Error: Found 32-bit float literal #1.s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #1e10s;; +[%%expect{| +Line 1, characters 16-22: +1 | let () = ignore #1e10s;; + ^^^^^^ +Error: Found 32-bit float literal #1e10s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #1e+1s;; +[%%expect{| +Line 1, characters 16-22: +1 | let () = ignore #1e+1s;; + ^^^^^^ +Error: Found 32-bit float literal #1e+1s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #1e-1s;; +[%%expect{| +Line 1, characters 16-22: +1 | let () = ignore #1e-1s;; + ^^^^^^ +Error: Found 32-bit float literal #1e-1s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #0x111.000s;; +[%%expect{| +Line 1, characters 16-27: +1 | let () = ignore #0x111.000s;; + ^^^^^^^^^^^ +Error: Found 32-bit float literal #0x111.000s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #0x1.4p+0s;; +[%%expect{| +Line 1, characters 16-26: +1 | let () = ignore #0x1.4p+0s;; + ^^^^^^^^^^ +Error: Found 32-bit float literal #0x1.4p+0s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #0xf.ffffffffffff8p+1020s;; +[%%expect{| +Line 1, characters 16-41: +1 | let () = ignore #0xf.ffffffffffff8p+1020s;; + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Found 32-bit float literal #0xf.ffffffffffff8p+1020s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #0x8p-972s;; +[%%expect{| +Line 1, characters 16-26: +1 | let () = ignore #0x8p-972s;; + ^^^^^^^^^^ +Error: Found 32-bit float literal #0x8p-972s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = ignore #0xc.d5e6fp+1_24s;; +[%%expect{| +Line 1, characters 16-33: +1 | let () = ignore #0xc.d5e6fp+1_24s;; + ^^^^^^^^^^^^^^^^^ +Error: Found 32-bit float literal #0xc.d5e6fp+1_24s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; + +let () = + match #0.0s with + | _ -> () +;; +[%%expect{| +Line 2, characters 8-13: +2 | match #0.0s with + ^^^^^ +Error: Found 32-bit float literal #0.0s, but float32 is not enabled. You must enable -extension small_numbers to use this feature. +|}];; diff --git a/testsuite/tests/typing-small-numbers/test_enabled.ml b/testsuite/tests/typing-small-numbers/test_enabled.ml new file mode 100644 index 00000000000..2ac44f5a4da --- /dev/null +++ b/testsuite/tests/typing-small-numbers/test_enabled.ml @@ -0,0 +1,191 @@ +(* TEST + flags = "-extension small_numbers"; + expect; +*) + +(* Operations are tested in tests/small_numbers *) + +(* Boxed float32 *) + +type t = float32;; +[%%expect{| +type t = float32 +|}];; + +let _ : float32 = 1.0s;; +[%%expect{| +- : float32 = 1.s +|}];; + +let _ : float32 = 1.s;; +[%%expect{| +- : float32 = 1.s +|}];; + +let _ : float32 = 1e10s;; +[%%expect{| +- : float32 = 1e+10s +|}];; + +let _ : float32 = 1e+1s;; +[%%expect{| +- : float32 = 10.s +|}];; + +let _ : float32 = 1e-1s;; +[%%expect{| +- : float32 = 0.100000001s +|}];; + +let _ : float32 = 0x111.000s;; +[%%expect{| +- : float32 = 273.s +|}];; + +let _ : float32 = 0x1.4p+0s;; +[%%expect{| +- : float32 = 1.25s +|}];; + +let _ : float32 = 0xf.ffffffffffff8p+1020s;; +[%%expect{| +- : float32 = infs +|}];; + +let _ : float32 = 0x8p-972s;; +[%%expect{| +- : float32 = 0.s +|}];; + +let _ : float32 = 0xc.d5e6fp+1_24s;; +[%%expect{| +- : float32 = 2.72982066e+38s +|}];; + +(* A (trivial) match with no float32 cases is allowed. *) +let () = + match 0.0s with + | _ -> () +;; +[%%expect{| +|}];; + +let () = + match 0.0s with + | 0.0s -> () + | _ -> () +;; +[%%expect{| +Line 1: +Error: float32 literal patterns are not supported. +|}];; + +let () = + match 0.0s with + | 0.0s -> () + | 1.0s -> () + | _ -> () +;; +[%%expect{| +Line 1: +Error: float32 literal patterns are not supported. +|}];; + +let () = + match 0.0s with + | 0.0s -> () +;; +[%%expect{| +Line 1: +Error: float32 literal patterns are not supported. +|}];; + +(* Unboxed float32 *) + +let ignore (f : float32#) = () +[%%expect{| +val ignore : float32# -> unit = +|}];; + +type t = float32#;; +[%%expect{| +type t = float32# +|}];; + +let () = ignore #1.0s;; +[%%expect{| +|}];; + +let () = ignore #1.s;; +[%%expect{| +|}];; + +let () = ignore #1e10s;; +[%%expect{| +|}];; + +let () = ignore #1e+1s;; +[%%expect{| +|}];; + +let () = ignore #1e-1s;; +[%%expect{| +|}];; + +let () = ignore #0x111.000s;; +[%%expect{| +|}];; + +let () = ignore #0x1.4p+0s;; +[%%expect{| +|}];; + +let () = ignore #0xf.ffffffffffff8p+1020s;; +[%%expect{| +|}];; + +let () = ignore #0x8p-972s;; +[%%expect{| +|}];; + +let () = ignore #0xc.d5e6fp+1_24s;; +[%%expect{| +|}];; + +(* A (trivial) match with no float32 cases is allowed. *) +let () = + match #0.0s with + | _ -> () +;; +[%%expect{| +|}];; + +let () = + match #0.0s with + | #0.0s -> () + | _ -> () +;; +[%%expect{| +Line 1: +Error: float32 literal patterns are not supported. +|}];; + +let () = + match #0.0s with + | #0.0s -> () + | #1.0s -> () + | _ -> () +;; +[%%expect{| +Line 1: +Error: float32 literal patterns are not supported. +|}];; + +let () = + match #0.0s with + | #0.0s -> () +;; +[%%expect{| +Line 1: +Error: float32 literal patterns are not supported. +|}];; diff --git a/testsuite/tests/typing-typeparam/newtype.ml b/testsuite/tests/typing-typeparam/newtype.ml index b41d0dfcf14..a372a12bdc2 100644 --- a/testsuite/tests/typing-typeparam/newtype.ml +++ b/testsuite/tests/typing-typeparam/newtype.ml @@ -1,5 +1,5 @@ (* TEST - * toplevel + toplevel; *) let property (type t) () = diff --git a/testsuite/tests/typing-unboxed-types/test.ml b/testsuite/tests/typing-unboxed-types/test.ml index a7ab0392658..8ac203d5910 100644 --- a/testsuite/tests/typing-unboxed-types/test.ml +++ b/testsuite/tests/typing-unboxed-types/test.ml @@ -1,5 +1,9 @@ (* TEST - * expect + flags = "-extension layouts_beta"; + expect; +*) +(* CR layouts: Using [-extension layouts_beta] here is not backward-compatible. + We can delete this when internal ticket 1110 is resolved. *) (* Check the unboxing *) @@ -92,7 +96,7 @@ Error: This type cannot be unboxed because |}];; (* let rec must be rejected *) -type t10 = A of t10 [@@ocaml.unboxed] [@@value];; +type t10 : value = A of t10 [@@ocaml.unboxed];; [%%expect{| type t10 : value = A of t10 [@@unboxed] |}];; @@ -281,7 +285,7 @@ in assert (f x = L 3.14);; |}];; (* Check for a potential infinite loop in the typing algorithm. *) -type 'a t12 = M of 'a t12 [@@ocaml.unboxed] [@@value];; +type 'a t12 : value = M of 'a t12 [@@ocaml.unboxed];; [%%expect{| type 'a t12 : value = M of 'a t12 [@@unboxed] |}];; diff --git a/testsuite/tests/typing-unboxed-types/test_flat.ml b/testsuite/tests/typing-unboxed-types/test_flat.ml index 43791ed2451..78b5c93d7c8 100644 --- a/testsuite/tests/typing-unboxed-types/test_flat.ml +++ b/testsuite/tests/typing-unboxed-types/test_flat.ml @@ -1,6 +1,6 @@ (* TEST - * flat-float-array - ** expect + flat-float-array; + expect; *) (* should fail *) diff --git a/testsuite/tests/typing-unboxed-types/test_no_flat.ml b/testsuite/tests/typing-unboxed-types/test_no_flat.ml index a1c48d2c03f..980c519c812 100644 --- a/testsuite/tests/typing-unboxed-types/test_no_flat.ml +++ b/testsuite/tests/typing-unboxed-types/test_no_flat.ml @@ -1,6 +1,6 @@ (* TEST - * no-flat-float-array - ** expect + no-flat-float-array; + expect; *) (* This file copies the tests from test_flat.ml, diff --git a/testsuite/tests/typing-unboxed/test.ml b/testsuite/tests/typing-unboxed/test.ml index 99c5229327b..213133cae88 100644 --- a/testsuite/tests/typing-unboxed/test.ml +++ b/testsuite/tests/typing-unboxed/test.ml @@ -1,7 +1,12 @@ (* TEST - flags = "-strict-sequence" - * expect + flags = "-strict-sequence"; + expect; *) +(* CR layouts: Using layout annotations here is not backward-compatible. + We can delete this when internal ticket 1110 is resolved. +*) + + external a : (int [@untagged]) -> unit = "a" "a_nat" external b : (int32 [@unboxed]) -> unit = "b" "b_nat" external c : (int64 [@unboxed]) -> unit = "c" "c_nat" @@ -639,7 +644,8 @@ Line 1, characters 14-17: 1 | external h : (int [@unboxed]) -> float = "h" "h_nat";; ^^^ Error: Don't know how to unbox this type. - Only float, int32, int64, nativeint, and vector primitives can be unboxed. + Only float, int32, int64, nativeint, vector primitives, and + concrete unboxed types can be marked unboxed. |}] (* Bad: unboxing the function type *) @@ -649,7 +655,8 @@ Line 1, characters 13-25: 1 | external i : int -> float [@unboxed] = "i" "i_nat";; ^^^^^^^^^^^^ Error: Don't know how to unbox this type. - Only float, int32, int64, nativeint, and vector primitives can be unboxed. + Only float, int32, int64, nativeint, vector primitives, and + concrete unboxed types can be marked unboxed. |}] (* Bad: unboxing a "deep" sub-type. *) @@ -746,7 +753,7 @@ Error: The native code version of the primitive is mandatory |}] (* PR#7424 *) -type 'a b = B of 'a b b [@@unboxed] [@@value];; +type 'a b : value = B of 'a b b [@@unboxed];; [%%expect{| type 'a b : value = B of 'a b b [@@unboxed] |}] diff --git a/testsuite/tests/typing-unique/unique.ml b/testsuite/tests/typing-unique/unique.ml index ad30c4b09f6..1864e569ab1 100644 --- a/testsuite/tests/typing-unique/unique.ml +++ b/testsuite/tests/typing-unique/unique.ml @@ -1,6 +1,6 @@ (* TEST - flags += "-extension unique" - * expect + flags += "-extension unique"; + expect; *) (* unique means the value is the only usage *) @@ -141,7 +141,7 @@ let f () = Line 4, characters 12-13: 4 | unique_ k ^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. Hint: This identifier cannot be used uniquely, because it was defined outside of the for-loop. |}] @@ -157,7 +157,7 @@ let f = Line 5, characters 14-15: 5 | let _ = g a in () ^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. Hint: This identifier cannot be used uniquely, because it was defined outside of the for-loop. |}] @@ -215,7 +215,7 @@ let once_ foo = "foo" Line 1, characters 4-21: 1 | let once_ foo = "foo" ^^^^^^^^^^^^^^^^^ -Error: Found a once value where a many value was expected +Error: This value is once but expected to be many. |}] (* the following is fine - we relax many to once *) @@ -237,16 +237,15 @@ let foo y = unique_ x Line 1, characters 20-21: 1 | let foo y = unique_ x ^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. |}] -(* global modality entails shared modality; -this is crucial once we introduce borrowing whose scope is controlled -by locality *) -type 'a glob = { global_ glob: 'a } [@@unboxed] +(* CR zqian: [global] should imply [shared]/[many], once we introduce borrowing whose +scope is controlled by locality *) +type 'a glob = { glob: 'a @@ shared many } [@@unboxed] [%%expect{| -type 'a glob = { global_ glob : 'a; } [@@unboxed] +type 'a glob = { glob : 'a @@ many shared; } [@@unboxed] |}] let dup (glob : 'a) : 'a glob * 'a glob = unique_ ({glob}, {glob}) [%%expect{| @@ -303,7 +302,7 @@ let higher_order3 (f : 'a -> 'b) (unique_ x : 'a) = unique_ f x Line 1, characters 60-63: 1 | let higher_order3 (f : 'a -> 'b) (unique_ x : 'a) = unique_ f x ^^^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. |}] let higher_order4 (f : unique_ 'a -> 'b) (x : 'a) = f (shared_id x) @@ -311,7 +310,7 @@ let higher_order4 (f : unique_ 'a -> 'b) (x : 'a) = f (shared_id x) Line 1, characters 54-67: 1 | let higher_order4 (f : unique_ 'a -> 'b) (x : 'a) = f (shared_id x) ^^^^^^^^^^^^^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. |}] let higher_order5 (unique_ x) = let f (unique_ x) = unique_ x in higher_order f x @@ -357,7 +356,7 @@ let inf3 : bool -> float -> unique_ float -> float = fun b y x -> Line 2, characters 58-59: 2 | let _ = shared_id y in let unique_ z = if b then x else y in z ^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. |}] let inf4 (b : bool) (y : float) (unique_ x : float) = @@ -467,7 +466,7 @@ let curry = Line 3, characters 2-15: 3 | foo ~a:3 ~c:4 ^^^^^^^^^^^^^ -Error: Found a once value where a many value was expected +Error: This value is once but expected to be many. |}] let curry = @@ -477,7 +476,7 @@ let curry = Line 3, characters 2-15: 3 | foo ~a:3 ~c:4 ^^^^^^^^^^^^^ -Error: Found a once value where a many value was expected +Error: This value is once but expected to be many. |}] let curry = @@ -542,25 +541,40 @@ type box = { x : int } type box = { x : int; } |}] -let curry (unique_ b1 : box) (unique_ b2 : box) = b1 +let curry (unique_ b1 : box) (unique_ b2 : box) = () [%%expect{| -val curry : unique_ box -> unique_ box -> box = +val curry : unique_ box -> unique_ box -> unit = |}] -let curry : unique_ box -> unique_ box -> unique_ box = fun b1 b2 -> b1 +let curry : unique_ box -> unique_ box -> unit = fun b1 b2 -> () [%%expect{| -val curry : unique_ box -> unique_ box -> unique_ box = +val curry : unique_ box -> unique_ box -> unit = |}] -let curry : unique_ box -> (unique_ box -> unique_ box) = fun b1 b2 -> b1 +let curry : unique_ box -> (unique_ box -> unit) = fun b1 b2 -> () [%%expect{| -Line 1, characters 58-73: -1 | let curry : unique_ box -> (unique_ box -> unique_ box) = fun b1 b2 -> b1 - ^^^^^^^^^^^^^^^ -Error: This function when partially applied returns a once value, +Line 1, characters 51-66: +1 | let curry : unique_ box -> (unique_ box -> unit) = fun b1 b2 -> () + ^^^^^^^^^^^^^^^ +Error: This function when partially applied returns a value which is once, but expected to be many. |}] +let curry : unique_ box -> (unique_ box -> unit) = fun b1 -> function | b2 -> () +[%%expect{| +Line 1, characters 51-80: +1 | let curry : unique_ box -> (unique_ box -> unit) = fun b1 -> function | b2 -> () + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This function when partially applied returns a value which is once, + but expected to be many. +|}] + +(* For nested functions, inner functions are not constrained *) +let no_curry : unique_ box -> (unique_ box -> unit) = fun b1 -> fun b2 -> () +[%%expect{| +val no_curry : unique_ box -> (unique_ box -> unit) = +|}] + (* If both type and mode are wrong, complain about type *) let f () = let id2 (x : string) = shared_id x in @@ -615,4 +629,28 @@ Line 5, characters 16-17: 5 | in Node (x, x) ^ -|}] \ No newline at end of file +|}] + +(* Uniqueness is unbroken by the implicit positional argument. *) +let f ~(call_pos : [%call_pos]) () = + let unique_ x = call_pos in + (x, x) +;; +[%%expect{| +val f : call_pos:[%call_pos] -> unit -> lexing_position * lexing_position = + +|}] + +let f ~(call_pos : [%call_pos]) () = + unique_ (call_pos, call_pos) +;; +[%%expect{| +Line 2, characters 21-29: +2 | unique_ (call_pos, call_pos) + ^^^^^^^^ +Error: This value is used here, but it has already been used as unique: +Line 2, characters 11-19: +2 | unique_ (call_pos, call_pos) + ^^^^^^^^ + +|}] diff --git a/testsuite/tests/typing-unique/unique_analysis.ml b/testsuite/tests/typing-unique/unique_analysis.ml index ee81714cb49..6938abaf37b 100644 --- a/testsuite/tests/typing-unique/unique_analysis.ml +++ b/testsuite/tests/typing-unique/unique_analysis.ml @@ -1,6 +1,7 @@ (* TEST - flags += "-extension unique" - * expect *) + flags += "-extension unique"; + expect; +*) (* This file is to test uniqueness_analysis.ml *) @@ -185,7 +186,7 @@ let or_patterns1 : unique_ float list -> float list -> float = Line 3, characters 37-38: 3 | | z :: _, _ | _, z :: _ -> unique_ z ^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. |}] let or_patterns2 : float list -> unique_ float list -> float = @@ -196,7 +197,7 @@ let or_patterns2 : float list -> unique_ float list -> float = Line 3, characters 37-38: 3 | | z :: _, _ | _, z :: _ -> unique_ z ^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. |}] let or_patterns3 p = @@ -554,66 +555,10 @@ let foo () = val foo : unit -> unit = |}] - -(* testing Tpat_lazy *) -let foo () = - match lazy (unique_ "hello") with - | (lazy y) as x -> ignore (shared_id x) -[%%expect{| -val foo : unit -> unit = -|}] - - -let foo () = -match lazy (unique_ "hello") with -| (lazy y) as x -> ignore (unique_id x) - -[%%expect{| -Line 3, characters 37-38: -3 | | (lazy y) as x -> ignore (unique_id x) - ^ -Error: This value is used here as unique, but it has already been used: -Line 3, characters 2-10: -3 | | (lazy y) as x -> ignore (unique_id x) - ^^^^^^^^ - -|}] - -type 'a r_lazy = {x_lazy : 'a Lazy.t; y : string} - -let foo () = - match {x_lazy = lazy (unique_ "hello"); y = "world"} with - | {x_lazy = lazy y} as r -> ignore (unique_id r.x_lazy) -[%%expect{| -type 'a r_lazy = { x_lazy : 'a Lazy.t; y : string; } -Line 5, characters 48-56: -5 | | {x_lazy = lazy y} as r -> ignore (unique_id r.x_lazy) - ^^^^^^^^ -Error: This value is used here as unique, but it has already been used: -Line 5, characters 14-20: -5 | | {x_lazy = lazy y} as r -> ignore (unique_id r.x_lazy) - ^^^^^^ - -|}] - -let foo () = - match {x_lazy = lazy (unique_ "hello"); y = "world"} with - | {x_lazy = lazy y} as r -> ignore (shared_id r.x_lazy) -[%%expect{| -val foo : unit -> unit = -|}] - -let foo () = - match {x_lazy = lazy (unique_ "hello"); y = "world"} with - | {x_lazy = lazy y} as r -> ignore (unique_id r.y) -[%%expect{| -val foo : unit -> unit = -|}] - (* Testing modalities in records *) -type r_global = {x : string; global_ y : string} +type r_shared = {x : string; y : string @@ shared many} [%%expect{| -type r_global = { x : string; global_ y : string; } +type r_shared = { x : string; y : string @@ many shared; } |}] let foo () = @@ -696,14 +641,14 @@ Line 3, characters 19-20: |}] (* testing modalities in constructors *) -type r_global = R_global of string * global_ string +type r_shared = R_shared of string * string @@ shared many [%%expect{| -type r_global = R_global of string * global_ string +type r_shared = R_shared of string * string @@ many shared |}] let foo () = - let r = R_global ("hello", "world") in - let R_global (_, y) = r in + let r = R_shared ("hello", "world") in + let R_shared (_, y) = r in ignore (shared_id y); (* the following is allowed, because using r uniquely implies using r.x shared *) @@ -714,8 +659,8 @@ val foo : unit -> unit = (* Similarly for linearity *) let foo () = - let r = once_ (R_global ("hello", "world")) in - let R_global (_, y) = r in + let r = once_ (R_shared ("hello", "world")) in + let R_shared (_, y) = r in ignore_once y; ignore_once r; [%%expect{| @@ -723,8 +668,8 @@ val foo : unit -> unit = |}] let foo () = - let r = once_ (R_global ("hello", "world")) in - let R_global (x, _) = r in + let r = once_ (R_shared ("hello", "world")) in + let R_shared (x, _) = r in ignore_once x; ignore_once r; [%%expect{| @@ -740,8 +685,8 @@ Line 4, characters 14-15: |}] let foo () = - let r = R_global ("hello", "world") in - let R_global (x, _) = r in + let r = R_shared ("hello", "world") in + let R_shared (x, _) = r in ignore (shared_id x); (* doesn't work for normal fields *) ignore (unique_id r) @@ -781,3 +726,47 @@ Line 4, characters 20-21: |}] +type r = {x : float; y : float} + +(* CR zqian: The following should pass but doesn't, because the uniqueness + analysis doesn't support mode crossing. The following involes sequencing the + maybe_unique usage of [r.x] and the maybe_unique usage of [r] as a whole. + Sequencing them will force both to be shared and many. The [unique_use] in + [r.x] is mode-crossed (being an unboxed float) so is fine. The [unique_use] + in [r] cannot cross mode, and forcing it causes error. *) + +let foo () = + let r = {x = 3.0; y = 5.0} in + let x = r.x in + ignore (unique_id r); + (* [x] is allocated fresh, unrelated to [r]. *) + ignore (unique_id x) +[%%expect{| +type r = { x : float; y : float; } +Line 13, characters 20-21: +13 | ignore (unique_id r); + ^ +Error: This value is used here, + but part of it has already been used as unique: +Line 12, characters 10-13: +12 | let x = r.x in + ^^^ + +|}] + +let foo () = + let r = {x = 3.0; y = 5.0} in + ignore (unique_id r); + (* but projection still uses [r]'s mem block, of course *) + let x = r.x in + ignore (unique_id x) +[%%expect{| +Line 5, characters 10-11: +5 | let x = r.x in + ^ +Error: This value is read from here, but it has already been used as unique: +Line 3, characters 20-21: +3 | ignore (unique_id r); + ^ + +|}] diff --git a/testsuite/tests/typing-unique/unique_mod_class.ml b/testsuite/tests/typing-unique/unique_mod_class.ml index c04890219b2..5da70aaad20 100644 --- a/testsuite/tests/typing-unique/unique_mod_class.ml +++ b/testsuite/tests/typing-unique/unique_mod_class.ml @@ -1,6 +1,6 @@ (* TEST - flags += "-extension unique" - * expect + flags += "-extension unique"; + expect; *) (* This file tests the interaction between a module/class and its surrounding environment *) @@ -19,7 +19,7 @@ val unique_id : unique_ 'a -> unit = Line 8, characters 20-21: 8 | val bar = unique_ x ^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. Hint: This identifier cannot be used uniquely, because it is defined in a class. |}] @@ -149,5 +149,5 @@ module M : sig val foo : string end Line 7, characters 12-17: 7 | unique_id M.foo ^^^^^ -Error: Found a shared value where a unique value was expected +Error: This value is shared but expected to be unique. |}] \ No newline at end of file diff --git a/testsuite/tests/typing-unique/unique_typedecl.ml b/testsuite/tests/typing-unique/unique_typedecl.ml index ce0dbe038e8..9ee8af340c9 100644 --- a/testsuite/tests/typing-unique/unique_typedecl.ml +++ b/testsuite/tests/typing-unique/unique_typedecl.ml @@ -1,6 +1,7 @@ (* TEST -flags += "-extension unique" -* expect *) + flags += "-extension unique"; + expect; +*) (* This file tests how unique_ and once_ are interpreated in signatures especially when currying is involved *) @@ -37,9 +38,9 @@ Lines 3-4, characters 0-68: 4 | = 'a -> unique_ 'b -> unique_ once_ ('c -> unique_ once_ ('d -> 'e)) Error: The type constraints are not consistent. Type 'a -> unique_ 'b -> 'c -> 'd -> 'e is not compatible with type - 'a -> unique_ 'b -> unique_ once_ ('c -> unique_ once_ ('d -> 'e)) + 'a -> unique_ 'b -> once_ unique_ ('c -> once_ unique_ ('d -> 'e)) Type unique_ 'b -> 'c -> 'd -> 'e is not compatible with type - unique_ 'b -> unique_ once_ ('c -> unique_ once_ ('d -> 'e)) + unique_ 'b -> once_ unique_ ('c -> once_ unique_ ('d -> 'e)) |}] type distinct_sarg = unit constraint unique_ int -> int = int -> int diff --git a/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml b/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml index cfaea68b879..eff6a73aece 100644 --- a/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml +++ b/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) (* Ignore OCAMLRUNPARAM=b to be reproducible *) diff --git a/testsuite/tests/typing-warnings/application.ml b/testsuite/tests/typing-warnings/application.ml index 8da97821120..8ad444b079c 100644 --- a/testsuite/tests/typing-warnings/application.ml +++ b/testsuite/tests/typing-warnings/application.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) (* Ignore OCAMLRUNPARAM=b to be reproducible *) diff --git a/testsuite/tests/typing-warnings/coercions.ml b/testsuite/tests/typing-warnings/coercions.ml index 4c96caa4edc..874dd35d71e 100644 --- a/testsuite/tests/typing-warnings/coercions.ml +++ b/testsuite/tests/typing-warnings/coercions.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) (* comment 9644 of PR#6000 *) diff --git a/testsuite/tests/typing-warnings/disable_warnings_classes.ml b/testsuite/tests/typing-warnings/disable_warnings_classes.ml index 79f1f4b686f..cd502a9b1a0 100644 --- a/testsuite/tests/typing-warnings/disable_warnings_classes.ml +++ b/testsuite/tests/typing-warnings/disable_warnings_classes.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A " - * expect + flags = " -w +A "; + expect; *) class c = object diff --git a/testsuite/tests/typing-warnings/exhaustiveness.ml b/testsuite/tests/typing-warnings/exhaustiveness.ml index 62add579302..702ab1e51c7 100644 --- a/testsuite/tests/typing-warnings/exhaustiveness.ml +++ b/testsuite/tests/typing-warnings/exhaustiveness.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) let f = function diff --git a/testsuite/tests/typing-warnings/never_returns.ml b/testsuite/tests/typing-warnings/never_returns.ml index fac31d9dd3e..b12b4da71aa 100644 --- a/testsuite/tests/typing-warnings/never_returns.ml +++ b/testsuite/tests/typing-warnings/never_returns.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w -a+21 " - * expect + flags = " -w -a+21 "; + expect; *) let () = (let module L = List in raise Exit); () ;; diff --git a/testsuite/tests/typing-warnings/open_warnings.ml b/testsuite/tests/typing-warnings/open_warnings.ml index de810ae1069..9e4f33817e0 100644 --- a/testsuite/tests/typing-warnings/open_warnings.ml +++ b/testsuite/tests/typing-warnings/open_warnings.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A-41-42-18" - * expect + flags = " -w +A-41-42-18"; + expect; *) module T1 : sig end = struct module M = struct type t end (* unused type t *) diff --git a/testsuite/tests/typing-warnings/pr5892.ml b/testsuite/tests/typing-warnings/pr5892.ml index 08939c033fa..c1cdd26d8b6 100644 --- a/testsuite/tests/typing-warnings/pr5892.ml +++ b/testsuite/tests/typing-warnings/pr5892.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) open CamlinternalOO;; diff --git a/testsuite/tests/typing-warnings/pr6587.ml b/testsuite/tests/typing-warnings/pr6587.ml index 36b9044718a..ba4b14ea1e0 100644 --- a/testsuite/tests/typing-warnings/pr6587.ml +++ b/testsuite/tests/typing-warnings/pr6587.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) diff --git a/testsuite/tests/typing-warnings/pr6872.ml b/testsuite/tests/typing-warnings/pr6872.ml index 0fbf076da69..b3d8b803a93 100644 --- a/testsuite/tests/typing-warnings/pr6872.ml +++ b/testsuite/tests/typing-warnings/pr6872.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) (* Ignore OCAMLRUNPARAM=b to be reproducible *) diff --git a/testsuite/tests/typing-warnings/pr7085.ml b/testsuite/tests/typing-warnings/pr7085.ml index c286f154f25..25560ad82e2 100644 --- a/testsuite/tests/typing-warnings/pr7085.ml +++ b/testsuite/tests/typing-warnings/pr7085.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) module TypEq = struct diff --git a/testsuite/tests/typing-warnings/pr7115.ml b/testsuite/tests/typing-warnings/pr7115.ml index c1e5bef11ad..64b1b377356 100644 --- a/testsuite/tests/typing-warnings/pr7115.ml +++ b/testsuite/tests/typing-warnings/pr7115.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) type t = A : t;; diff --git a/testsuite/tests/typing-warnings/pr7261.ml b/testsuite/tests/typing-warnings/pr7261.ml index 65c44ecf176..f032cff3179 100644 --- a/testsuite/tests/typing-warnings/pr7261.ml +++ b/testsuite/tests/typing-warnings/pr7261.ml @@ -1,9 +1,14 @@ -(* TEST - flags = " -w +A -strict-sequence " - * toplevel +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + *) type foo = Foo: [> `Bla ] as 'b ) * 'b -> foo;; type foo = Foo: 'b * 'b -> foo constraint 'b = [> `Bla ];; + +(* TEST + flags = " -w +A -strict-sequence "; + toplevel; +*) diff --git a/testsuite/tests/typing-warnings/pr7297.ml b/testsuite/tests/typing-warnings/pr7297.ml index 572bdb2c95c..3d4d724463e 100644 --- a/testsuite/tests/typing-warnings/pr7297.ml +++ b/testsuite/tests/typing-warnings/pr7297.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) (* Ignore OCAMLRUNPARAM=b to be reproducible *) diff --git a/testsuite/tests/typing-warnings/pr7553.ml b/testsuite/tests/typing-warnings/pr7553.ml index ef57b0ee7bc..25defbed8bc 100644 --- a/testsuite/tests/typing-warnings/pr7553.ml +++ b/testsuite/tests/typing-warnings/pr7553.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) module A = struct type foo end;; diff --git a/testsuite/tests/typing-warnings/pr9244.ml b/testsuite/tests/typing-warnings/pr9244.ml index 8fb319707ef..282123cd337 100644 --- a/testsuite/tests/typing-warnings/pr9244.ml +++ b/testsuite/tests/typing-warnings/pr9244.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A " - * expect + flags = " -w +A "; + expect; *) module type U = sig end diff --git a/testsuite/tests/typing-warnings/records.ml b/testsuite/tests/typing-warnings/records.ml index 5079418d761..afb2e34bbed 100644 --- a/testsuite/tests/typing-warnings/records.ml +++ b/testsuite/tests/typing-warnings/records.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) (* Use type information *) diff --git a/testsuite/tests/typing-warnings/unused_functor_parameter.ml b/testsuite/tests/typing-warnings/unused_functor_parameter.ml index d14ec34aaa5..a0905b0db80 100644 --- a/testsuite/tests/typing-warnings/unused_functor_parameter.ml +++ b/testsuite/tests/typing-warnings/unused_functor_parameter.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A " - * expect + flags = " -w +A "; + expect; *) module Foo(Unused : sig end) = struct end;; diff --git a/testsuite/tests/typing-warnings/unused_rec.ml b/testsuite/tests/typing-warnings/unused_rec.ml index 3f38f848aa0..7e5bc66dc79 100644 --- a/testsuite/tests/typing-warnings/unused_rec.ml +++ b/testsuite/tests/typing-warnings/unused_rec.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) [@@@ocaml.warning "+39"] diff --git a/testsuite/tests/typing-warnings/unused_recmodule.ml b/testsuite/tests/typing-warnings/unused_recmodule.ml index 46c68e8a219..8ee636b538e 100644 --- a/testsuite/tests/typing-warnings/unused_recmodule.ml +++ b/testsuite/tests/typing-warnings/unused_recmodule.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) [@@@ocaml.warning "+a"] diff --git a/testsuite/tests/typing-warnings/unused_types.ml b/testsuite/tests/typing-warnings/unused_types.ml index 66d18f1a572..8070be362fb 100644 --- a/testsuite/tests/typing-warnings/unused_types.ml +++ b/testsuite/tests/typing-warnings/unused_types.ml @@ -1,6 +1,6 @@ (* TEST - flags = " -w +A -strict-sequence " - * expect + flags = " -w +A -strict-sequence "; + expect; *) module Unused : sig @@ -530,3 +530,66 @@ Warning 69 [unused-field]: unused record field b. module Unused_field_disable_one_warning : sig end |}] + +(* Locally abstract types *) + +let u (type unused) = () +[%%expect {| +Line 1, characters 12-18: +1 | let u (type unused) = () + ^^^^^^ +Warning 34 [unused-type-declaration]: unused type unused. + +val u : unit = () +|}] + +let u = fun (type unused) -> () +[%%expect {| +Line 1, characters 18-24: +1 | let u = fun (type unused) -> () + ^^^^^^ +Warning 34 [unused-type-declaration]: unused type unused. + +val u : unit = () +|}] + +let f (type unused) x = x +[%%expect {| +Line 1, characters 12-18: +1 | let f (type unused) x = x + ^^^^^^ +Warning 34 [unused-type-declaration]: unused type unused. + +val f : 'a -> 'a = +|}] + +let f = fun (type unused) x -> x +[%%expect {| +Line 1, characters 18-24: +1 | let f = fun (type unused) x -> x + ^^^^^^ +Warning 34 [unused-type-declaration]: unused type unused. + +val f : 'a -> 'a = +|}] + +let f (type used unused) (x : used) = x +[%%expect {| +Line 1, characters 17-23: +1 | let f (type used unused) (x : used) = x + ^^^^^^ +Warning 34 [unused-type-declaration]: unused type unused. + +val f : 'used -> 'used = +|}] + +let f = fun (type used unused) (x : used) -> x + +[%%expect{| +Line 1, characters 23-29: +1 | let f = fun (type used unused) (x : used) -> x + ^^^^^^ +Warning 34 [unused-type-declaration]: unused type unused. + +val f : 'used -> 'used = +|}] diff --git a/testsuite/tests/typing-warnings/warning16.ml b/testsuite/tests/typing-warnings/warning16.ml index a4ee9839732..0cfa2974cc9 100644 --- a/testsuite/tests/typing-warnings/warning16.ml +++ b/testsuite/tests/typing-warnings/warning16.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) let foo ?x = () [%%expect{| diff --git a/testsuite/tests/typing-zero-alloc/cmi_test.ml b/testsuite/tests/typing-zero-alloc/cmi_test.ml new file mode 100644 index 00000000000..f1e2a2c6fb9 --- /dev/null +++ b/testsuite/tests/typing-zero-alloc/cmi_test.ml @@ -0,0 +1,85 @@ +(* TEST + readonly_files = "cmi_test_lib.ml"; + setup-ocamlc.byte-build-env; + module = "cmi_test_lib.ml"; + ocamlc.byte; + flags += "-I ocamlc.byte ocamlc.byte/cmi_test_lib.cmo"; + expect; +*) + +(* Here we show the signatures of [cmi_test_a] and the modules within it do not + have zero_alloc variables - we can't add further zero_alloc constraints, but + we do get the ones already present in the cmi. *) +module M1 : sig + val[@zero_alloc] f_unconstrained_variable : int -> int +end = Cmi_test_lib +[%%expect{| +Line 3, characters 6-18: +3 | end = Cmi_test_lib + ^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig + val f_unconstrained_variable : int -> int + module M_constrained_variable = + Cmi_test_lib.M_constrained_variable + module M_no_variable = Cmi_test_lib.M_no_variable + end + is not included in + sig val f_unconstrained_variable : int -> int [@@zero_alloc] end + Values do not match: + val f_unconstrained_variable : int -> int + is not included in + val f_unconstrained_variable : int -> int [@@zero_alloc] + The former provides a weaker "zero_alloc" guarantee than the latter. + Hint: Add a "zero_alloc" attribute to the implementation. + File "cmi_test_lib.ml", line 4, characters 4-28: Actual declaration +|}] + +module M2 : sig + val[@zero_alloc strict] f : int -> int +end = Cmi_test_lib.M_constrained_variable +[%%expect{| +Line 3, characters 6-41: +3 | end = Cmi_test_lib.M_constrained_variable + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int [@@zero_alloc] end + is not included in + sig val f : int -> int [@@zero_alloc strict] end + Values do not match: + val f : int -> int [@@zero_alloc] + is not included in + val f : int -> int [@@zero_alloc strict] + The former provides a weaker "zero_alloc" guarantee than the latter. + File "cmi_test_lib.ml", line 7, characters 6-7: Actual declaration +|}] + +module M3 : sig + val[@zero_alloc] f : int -> int +end = Cmi_test_lib.M_constrained_variable + [%%expect{| +module M3 : sig val f : int -> int [@@zero_alloc] end +|}] + +module M4 : sig + val[@zero_alloc] f : int -> int +end = Cmi_test_lib.M_no_variable +[%%expect{| +Line 3, characters 6-32: +3 | end = Cmi_test_lib.M_no_variable + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int end + is not included in + sig val f : int -> int [@@zero_alloc] end + Values do not match: + val f : int -> int + is not included in + val f : int -> int [@@zero_alloc] + The former provides a weaker "zero_alloc" guarantee than the latter. + Hint: Add a "zero_alloc" attribute to the implementation. + File "cmi_test_lib.ml", line 13, characters 2-20: Actual declaration +|}] diff --git a/testsuite/tests/typing-zero-alloc/cmi_test_lib.ml b/testsuite/tests/typing-zero-alloc/cmi_test_lib.ml new file mode 100644 index 00000000000..6f50699f052 --- /dev/null +++ b/testsuite/tests/typing-zero-alloc/cmi_test_lib.ml @@ -0,0 +1,16 @@ +(* This file is part of a test that zero_alloc variables don't remain in + cmis. *) + +let f_unconstrained_variable x = x+1 + +module M_constrained_variable = struct + let f x = x+2 +end + +module _ : sig val[@zero_alloc] f : int -> int end = M_constrained_variable + +module M_no_variable : sig + val f : int -> int +end = struct + let f x = x+3 +end diff --git a/testsuite/tests/typing-zero-alloc/signatures.ml b/testsuite/tests/typing-zero-alloc/signatures.ml new file mode 100644 index 00000000000..aea00e4a844 --- /dev/null +++ b/testsuite/tests/typing-zero-alloc/signatures.ml @@ -0,0 +1,1227 @@ +(* TEST + expect; +*) + +(* This tests the typing behavior of `[@zero_alloc]` annotation in signatures. + + These tests are just about what is allowed and not allowed by the + typechecker. The implementation of the actual `[@zero_alloc]` backend checks + (including how the annotations in signatures affect those checks) are tested + in the `tests/backend/checkmach` directory at the root of the project. +*) + +(*******************************************) +(* Test 1: Allowed and disallowed payloads *) +module type S_payloads_base = sig + val[@zero_alloc] f : int -> int +end + +module type S_payloads_opt = sig + val[@zero_alloc opt] f : int -> int +end + +module type S_payloads_strict = sig + val[@zero_alloc strict] f : int -> int +end + +module type S_payloads_strict_opt = sig + val[@zero_alloc strict opt] f : int -> int +end +[%%expect{| +module type S_payloads_base = sig val f : int -> int [@@zero_alloc] end +module type S_payloads_opt = sig val f : int -> int [@@zero_alloc opt] end +module type S_payloads_strict = + sig val f : int -> int [@@zero_alloc strict] end +module type S_payloads_strict_opt = + sig val f : int -> int [@@zero_alloc strict opt] end +|}] + +module type S_payloads_assume = sig + val[@zero_alloc assume] f : int -> int +end +[%%expect{| +Line 2, characters 2-40: +2 | val[@zero_alloc assume] f : int -> int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: zero_alloc "assume" attributes are not supported in signatures +|}] + +module type S_payloads_ignore = sig + val[@zero_alloc ignore] f : int -> int +end +[%%expect{| +Line 2, characters 2-40: +2 | val[@zero_alloc ignore] f : int -> int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: zero_alloc "ignore" attributes are not supported in signatures +|}] + +(******************************) +(* Test 2: allowed inclusions *) +module type S_good_inc_base = sig + val[@zero_alloc] f : 'a -> 'a +end + +module M_absent : S_good_inc_base = struct + (* This one works by inferring the annotation on [f], tested further + elsewhere. *) + let f x = x +end + +module M_base : S_good_inc_base = struct + let[@zero_alloc] f x = x +end + +module M_assume : S_good_inc_base = struct + let[@zero_alloc assume] f x = x +end + +module M_assume_nrn : S_good_inc_base = struct + let[@zero_alloc assume never_returns_normally] f x = x +end + +module M_stict : S_good_inc_base = struct + let[@zero_alloc strict] f x = x +end + +module M_assume_strict : S_good_inc_base = struct + let[@zero_alloc assume strict] f x = x +end + +module M_assume_strict_nrn : S_good_inc_base = struct + let[@zero_alloc assume strict never_returns_normally] f x = x +end + +[%%expect{| +module type S_good_inc_base = sig val f : 'a -> 'a [@@zero_alloc] end +module M_absent : S_good_inc_base +module M_base : S_good_inc_base +module M_assume : S_good_inc_base +module M_assume_nrn : S_good_inc_base +module M_stict : S_good_inc_base +module M_assume_strict : S_good_inc_base +module M_assume_strict_nrn : S_good_inc_base +|}] + +module type S_good_inc_opt = sig + val[@zero_alloc opt] f : 'a -> 'a +end + +module M_absent : S_good_inc_opt = struct + (* This one works by inferring the annotation on [f], tested further + elsewhere. *) + let f x = x +end + +module M_base : S_good_inc_opt = struct + let[@zero_alloc] f x = x +end + +module M_opt : S_good_inc_opt = struct + let[@zero_alloc opt] f x = x +end + +module M_assume : S_good_inc_opt = struct + let[@zero_alloc assume] f x = x +end + +module M_assume_nrn : S_good_inc_opt = struct + let[@zero_alloc assume never_returns_normally] f x = x +end + +module M_strict : S_good_inc_opt = struct + let[@zero_alloc strict] f x = x +end + +module M_strict_opt : S_good_inc_opt = struct + let[@zero_alloc strict opt] f x = x +end + +module M_assume_strict : S_good_inc_opt = struct + let[@zero_alloc assume strict] f x = x +end + +module M_assume_strict_nrn : S_good_inc_opt = struct + let[@zero_alloc assume strict never_returns_normally] f x = x +end + +[%%expect{| +module type S_good_inc_opt = sig val f : 'a -> 'a [@@zero_alloc opt] end +module M_absent : S_good_inc_opt +module M_base : S_good_inc_opt +module M_opt : S_good_inc_opt +module M_assume : S_good_inc_opt +module M_assume_nrn : S_good_inc_opt +module M_strict : S_good_inc_opt +module M_strict_opt : S_good_inc_opt +module M_assume_strict : S_good_inc_opt +module M_assume_strict_nrn : S_good_inc_opt +|}] + +module type S_good_inc_strict = sig + val[@zero_alloc strict] f : 'a -> 'a +end + +module M_absent : S_good_inc_strict = struct + (* This one works by inferring the annotation on [f], tested further + elsewhere. *) + let f x = x +end + +module M_strict : S_good_inc_strict = struct + let[@zero_alloc strict] f x = x +end + +module M_assume_strict : S_good_inc_strict = struct + let[@zero_alloc assume strict] f x = x +end + +module M_assume_strict_nrn : S_good_inc_strict = struct + let[@zero_alloc assume strict never_returns_normally] f x = x +end + +[%%expect{| +module type S_good_inc_strict = + sig val f : 'a -> 'a [@@zero_alloc strict] end +module M_absent : S_good_inc_strict +module M_strict : S_good_inc_strict +module M_assume_strict : S_good_inc_strict +module M_assume_strict_nrn : S_good_inc_strict +|}] + +module type S_good_inc_strict_opt = sig + val[@zero_alloc strict opt] f : 'a -> 'a +end + +module M_absent : S_good_inc_strict_opt = struct + (* This one works by inferring the annotation on [f], tested further + elsewhere. *) + let f x = x +end + +module M_strict : S_good_inc_strict_opt = struct + let[@zero_alloc strict] f x = x +end + +module M_strict_opt : S_good_inc_strict_opt = struct + let[@zero_alloc strict opt] f x = x +end + +module M_assume_strict : S_good_inc_strict_opt = struct + let[@zero_alloc assume strict] f x = x +end + +module M_assume_strict_nrn : S_good_inc_strict_opt = struct + let[@zero_alloc assume strict never_returns_normally] f x = x +end + +[%%expect{| +module type S_good_inc_strict_opt = + sig val f : 'a -> 'a [@@zero_alloc strict opt] end +module M_absent : S_good_inc_strict_opt +module M_strict : S_good_inc_strict_opt +module M_strict_opt : S_good_inc_strict_opt +module M_assume_strict : S_good_inc_strict_opt +module M_assume_strict_nrn : S_good_inc_strict_opt +|}] + + +(*********************************) +(* Test 3: disallowed inclusions *) + +module type S_bad_inc_base = sig + val[@zero_alloc] f : 'a -> 'a +end + +module M_opt : S_bad_inc_base = struct + let[@zero_alloc opt] f x = x +end + +[%%expect{| +module type S_bad_inc_base = sig val f : 'a -> 'a [@@zero_alloc] end +Lines 5-7, characters 32-3: +5 | ................................struct +6 | let[@zero_alloc opt] f x = x +7 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc opt] end + is not included in + S_bad_inc_base + Values do not match: + val f : 'a -> 'a [@@zero_alloc opt] + is not included in + val f : 'a -> 'a [@@zero_alloc] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module type S_bad_inc_strict = sig + val[@zero_alloc strict] f : 'a -> 'a +end + +module M_base : S_bad_inc_strict = struct + let[@zero_alloc] f x = x +end +[%%expect{| +module type S_bad_inc_strict = sig val f : 'a -> 'a [@@zero_alloc strict] end +Lines 5-7, characters 35-3: +5 | ...................................struct +6 | let[@zero_alloc] f x = x +7 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc] end + is not included in + S_bad_inc_strict + Values do not match: + val f : 'a -> 'a [@@zero_alloc] + is not included in + val f : 'a -> 'a [@@zero_alloc strict] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module M_assume : S_bad_inc_strict = struct + let[@zero_alloc assume] f x = x +end + +[%%expect{| +Lines 1-3, characters 37-3: +1 | .....................................struct +2 | let[@zero_alloc assume] f x = x +3 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc] end + is not included in + S_bad_inc_strict + Values do not match: + val f : 'a -> 'a [@@zero_alloc] + is not included in + val f : 'a -> 'a [@@zero_alloc strict] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module M_opt : S_bad_inc_strict = struct + let[@zero_alloc opt] f x = x +end + +[%%expect{| +Lines 1-3, characters 34-3: +1 | ..................................struct +2 | let[@zero_alloc opt] f x = x +3 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc opt] end + is not included in + S_bad_inc_strict + Values do not match: + val f : 'a -> 'a [@@zero_alloc opt] + is not included in + val f : 'a -> 'a [@@zero_alloc strict] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module M_strict_opt : S_bad_inc_strict = struct + let[@zero_alloc strict opt] f x = x +end + +[%%expect{| +Lines 1-3, characters 41-3: +1 | .........................................struct +2 | let[@zero_alloc strict opt] f x = x +3 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc strict opt] end + is not included in + S_bad_inc_strict + Values do not match: + val f : 'a -> 'a [@@zero_alloc strict opt] + is not included in + val f : 'a -> 'a [@@zero_alloc strict] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module M_assume_nrn : S_bad_inc_strict = struct + let[@zero_alloc assume never_returns_normally] f x = x +end + +[%%expect{| +Lines 1-3, characters 41-3: +1 | .........................................struct +2 | let[@zero_alloc assume never_returns_normally] f x = x +3 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc] end + is not included in + S_bad_inc_strict + Values do not match: + val f : 'a -> 'a [@@zero_alloc] + is not included in + val f : 'a -> 'a [@@zero_alloc strict] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module type S_strict_opt = sig + val[@zero_alloc strict opt] f : 'a -> 'a +end + +module M_assume : S_strict_opt = struct + let[@zero_alloc assume] f x = x +end + +[%%expect{| +module type S_strict_opt = sig val f : 'a -> 'a [@@zero_alloc strict opt] end +Lines 5-7, characters 33-3: +5 | .................................struct +6 | let[@zero_alloc assume] f x = x +7 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc] end + is not included in + S_strict_opt + Values do not match: + val f : 'a -> 'a [@@zero_alloc] + is not included in + val f : 'a -> 'a [@@zero_alloc strict opt] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module M_opt : S_strict_opt = struct + let[@zero_alloc opt] f x = x +end + +[%%expect{| +Lines 1-3, characters 30-3: +1 | ..............................struct +2 | let[@zero_alloc opt] f x = x +3 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc opt] end + is not included in + S_strict_opt + Values do not match: + val f : 'a -> 'a [@@zero_alloc opt] + is not included in + val f : 'a -> 'a [@@zero_alloc strict opt] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module M_assume_nrn : S_strict_opt = struct + let[@zero_alloc assume never_returns_normally] f x = x +end + +[%%expect{| +Lines 1-3, characters 37-3: +1 | .....................................struct +2 | let[@zero_alloc assume never_returns_normally] f x = x +3 | end +Error: Signature mismatch: + Modules do not match: + sig val f : 'a -> 'a [@@zero_alloc] end + is not included in + S_strict_opt + Values do not match: + val f : 'a -> 'a [@@zero_alloc] + is not included in + val f : 'a -> 'a [@@zero_alloc strict opt] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +(*************************************************************************) +(* Test 4: Requires valid arity, inferred or provided, without expansion *) + +module type S_non_func_int = sig + val[@zero_alloc] x : int +end +[%%expect{| +Line 2, characters 2-26: +2 | val[@zero_alloc] x : int + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In signatures, zero_alloc is only supported on function declarations. + Found no arrows in this declaration's type. + Hint: You can write "[@zero_alloc arity n]" to specify the arity + of an alias (for n > 0). +|}] + +module type S_non_func_alias = sig + type t = string + val[@zero_alloc] x : t +end +[%%expect{| +Line 3, characters 2-24: +3 | val[@zero_alloc] x : t + ^^^^^^^^^^^^^^^^^^^^^^ +Error: In signatures, zero_alloc is only supported on function declarations. + Found no arrows in this declaration's type. + Hint: You can write "[@zero_alloc arity n]" to specify the arity + of an alias (for n > 0). +|}] + +module type S_func_alias = sig + type t = int -> int + type s = t + val[@zero_alloc] x : s +end +[%%expect{| +Line 4, characters 2-24: +4 | val[@zero_alloc] x : s + ^^^^^^^^^^^^^^^^^^^^^^ +Error: In signatures, zero_alloc is only supported on function declarations. + Found no arrows in this declaration's type. + Hint: You can write "[@zero_alloc arity n]" to specify the arity + of an alias (for n > 0). +|}] + +module type S_func_alias = sig + type t = int -> int + val[@zero_alloc arity 0] x : t +end +[%%expect{| +Line 3, characters 2-32: +3 | val[@zero_alloc arity 0] x : t + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In signatures, zero_alloc is only supported on function declarations. + Found no arrows in this declaration's type. + Hint: You can write "[@zero_alloc arity n]" to specify the arity + of an alias (for n > 0). +|}] + +module type S_arity_0 = sig + val[@zero_alloc arity 0] f : int -> int +end +[%%expect{| +Line 2, characters 2-41: +2 | val[@zero_alloc arity 0] f : int -> int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Invalid zero_alloc attribute: arity must be greater than 0. +|}] + +module type S_arity_negative = sig + val[@zero_alloc arity (-1)] f : int -> int +end +[%%expect{| +Line 2, characters 2-44: +2 | val[@zero_alloc arity (-1)] f : int -> int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Invalid zero_alloc attribute: arity must be greater than 0. +|}] + +(********************************************) +(* Test 5: impl arity must match intf arity *) + +type t_two_args = int -> int -> int + +module type S_arity_int_int = sig + val[@zero_alloc] f : int -> int -> int +end + +module M_int_int_params : S_arity_int_int = struct + let[@zero_alloc] f x y = x + y +end + +module M_int_param_int_case : S_arity_int_int = struct + let[@zero_alloc] f x = + function 0 -> x + x + | n -> x + n +end + +module M_nested_functions : S_arity_int_int = struct + let[@zero_alloc] f x = fun y -> x + y +end +[%%expect{| +type t_two_args = int -> int -> int +module type S_arity_int_int = + sig val f : int -> int -> int [@@zero_alloc] end +module M_int_int_params : S_arity_int_int +module M_int_param_int_case : S_arity_int_int +Lines 17-19, characters 46-3: +17 | ..............................................struct +18 | let[@zero_alloc] f x = fun y -> x + y +19 | end +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int -> int [@@zero_alloc arity 1] end + is not included in + S_arity_int_int + Values do not match: + val f : int -> int -> int [@@zero_alloc arity 1] + is not included in + val f : int -> int -> int [@@zero_alloc] + zero_alloc arity mismatch: + When using "zero_alloc" in a signature, the syntactic arity of + the implementation must match the function type in the interface. + Here the former is 1 and the latter is 2. +|}] + +module type S_alias_no_arity = sig + val[@zero_alloc] f : t_two_args +end +[%%expect{| +Line 2, characters 2-33: +2 | val[@zero_alloc] f : t_two_args + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In signatures, zero_alloc is only supported on function declarations. + Found no arrows in this declaration's type. + Hint: You can write "[@zero_alloc arity n]" to specify the arity + of an alias (for n > 0). +|}] + +module type S_alias_explicit_arity_2 = sig + val[@zero_alloc arity 2] f : t_two_args +end + +module M_good_explicit_arity_2 : S_alias_explicit_arity_2 = struct + let[@zero_alloc] f x y = x + y +end +[%%expect{| +module type S_alias_explicit_arity_2 = + sig val f : t_two_args [@@zero_alloc arity 2] end +module M_good_explicit_arity_2 : S_alias_explicit_arity_2 +|}] + +module M_bad_explicit_arity_2 : S_alias_explicit_arity_2 = struct + let[@zero_alloc] f x = fun y -> x + y +end +[%%expect{| +Lines 1-3, characters 59-3: +1 | ...........................................................struct +2 | let[@zero_alloc] f x = fun y -> x + y +3 | end +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int -> int [@@zero_alloc arity 1] end + is not included in + S_alias_explicit_arity_2 + Values do not match: + val f : int -> int -> int [@@zero_alloc arity 1] + is not included in + val f : t_two_args [@@zero_alloc arity 2] + zero_alloc arity mismatch: + When using "zero_alloc" in a signature, the syntactic arity of + the implementation must match the function type in the interface. + Here the former is 1 and the latter is 2. +|}] + +module type S_alias_explicit_arity_1 = sig + val[@zero_alloc arity 1] f : t_two_args +end + +module M_bad_explicit_arity_1 : S_alias_explicit_arity_1 = struct + let[@zero_alloc] f x y = x + y +end +[%%expect{| +module type S_alias_explicit_arity_1 = + sig val f : t_two_args [@@zero_alloc arity 1] end +Lines 5-7, characters 59-3: +5 | ...........................................................struct +6 | let[@zero_alloc] f x y = x + y +7 | end +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int -> int [@@zero_alloc] end + is not included in + S_alias_explicit_arity_1 + Values do not match: + val f : int -> int -> int [@@zero_alloc] + is not included in + val f : t_two_args [@@zero_alloc arity 1] + zero_alloc arity mismatch: + When using "zero_alloc" in a signature, the syntactic arity of + the implementation must match the function type in the interface. + Here the former is 2 and the latter is 1. +|}] + +module M_good_explicit_arity_1 : S_alias_explicit_arity_1 = struct + let[@zero_alloc] f x = fun y -> x + y +end +[%%expect{| +module M_good_explicit_arity_1 : S_alias_explicit_arity_1 +|}] + +(******************************************************************) +(* Test 6: we don't update the arity as a result of substitutions *) + +module type S_abstract = sig + type t + val[@zero_alloc] f : int -> t +end + +module M_abstract : S_abstract = struct + type t = int + let[@zero_alloc] f x = x +end + +module type S_subst = S_abstract with type t = int -> int + +module M_subst_good : S_subst = struct + type t = int -> int + let[@zero_alloc] f x = fun y -> x + y +end + +module M_subst_bad : S_subst = struct + type t = int -> int + let[@zero_alloc] f x y = x + y +end +[%%expect{| +module type S_abstract = sig type t val f : int -> t [@@zero_alloc] end +module M_abstract : S_abstract +module type S_subst = + sig type t = int -> int val f : int -> t [@@zero_alloc] end +module M_subst_good : S_subst +Lines 18-21, characters 32-3: +18 | ................................struct +19 | type t = int -> int +20 | let[@zero_alloc] f x y = x + y +21 | end +Error: Signature mismatch: + Modules do not match: + sig type t = int -> int val f : int -> int -> int [@@zero_alloc] end + is not included in + S_subst + Values do not match: + val f : int -> int -> int [@@zero_alloc] + is not included in + val f : int -> t [@@zero_alloc] + zero_alloc arity mismatch: + When using "zero_alloc" in a signature, the syntactic arity of + the implementation must match the function type in the interface. + Here the former is 2 and the latter is 1. +|}] + +(********************************************************************) +(* Test 7: A practicalish example of a non-obvious zero_alloc arity *) + +module type S_fun_in_fun = sig + val[@zero_alloc arity 2] f : int -> int -> int -> int*int +end + +(* The expected behavior from the backend analysis for the two funtions below + is checked in [tests/backend/checkmach/test_arity.ml] *) + +module M_fun_in_fun_good : S_fun_in_fun = struct + let[@zero_alloc] f x y = + if x = y+1 then fun z -> (z,z) else fun z -> (z,0) +end + +module M_fun_in_fun_bad : S_fun_in_fun = struct + let[@zero_alloc] f x y z = + if x = y+1 then (z,z) else (z,0) +end + +[%%expect{| +module type S_fun_in_fun = + sig val f : int -> int -> int -> int * int [@@zero_alloc arity 2] end +module M_fun_in_fun_good : S_fun_in_fun +Lines 13-16, characters 41-3: +13 | .........................................struct +14 | let[@zero_alloc] f x y z = +15 | if x = y+1 then (z,z) else (z,0) +16 | end +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int -> int -> int * int [@@zero_alloc] end + is not included in + S_fun_in_fun + Values do not match: + val f : int -> int -> int -> int * int [@@zero_alloc] + is not included in + val f : int -> int -> int -> int * int [@@zero_alloc arity 2] + zero_alloc arity mismatch: + When using "zero_alloc" in a signature, the syntactic arity of + the implementation must match the function type in the interface. + Here the former is 3 and the latter is 2. +|}] + +(*************************************) +(* Test 8: Parsing "arity n" works *) + +module type S_arity_42 = sig + val[@zero_alloc arity 42] f : int -> int +end + +module type S_arity_42_strict = sig + val[@zero_alloc arity 42 strict] f : int -> int +end + +module type S_strict_arity_42 = sig + val[@zero_alloc strict arity 42] f : int -> int +end + +module type S_arity_42_opt_strict = sig + val[@zero_alloc arity 42 opt strict] f : int -> int +end + +module type S_opt_arity_42_strict = sig + val[@zero_alloc opt arity 42 strict] f : int -> int +end + +module type S_opt_strict_arity_42 = sig + val[@zero_alloc opt strict arity 42] f : int -> int +end + +[%%expect{| +module type S_arity_42 = sig val f : int -> int [@@zero_alloc arity 42] end +module type S_arity_42_strict = + sig val f : int -> int [@@zero_alloc strict arity 42] end +module type S_strict_arity_42 = + sig val f : int -> int [@@zero_alloc strict arity 42] end +module type S_arity_42_opt_strict = + sig val f : int -> int [@@zero_alloc strict opt arity 42] end +module type S_opt_arity_42_strict = + sig val f : int -> int [@@zero_alloc strict opt arity 42] end +module type S_opt_strict_arity_42 = + sig val f : int -> int [@@zero_alloc strict opt arity 42] end +|}] + +(**************************************************) +(* Test 9: arity n in structures gives warning 47 *) + +module M_struct_arity_let_1 = struct + let[@zero_alloc arity 2] f x y = x + y +end + +[%%expect{| +Line 2, characters 7-17: +2 | let[@zero_alloc arity 2] f x y = x + y + ^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'zero_alloc'. +The "arity" field is only supported on "zero_alloc" in signatures + +module M_struct_arity_let_1 : + sig val f : int -> int -> int [@@zero_alloc] end +|}] + +module M_struct_arity_let_2 = struct + let[@zero_alloc arity 2] f = fun x y -> x + y +end +[%%expect{| +Line 2, characters 7-17: +2 | let[@zero_alloc arity 2] f = fun x y -> x + y + ^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'zero_alloc'. +The "arity" field is only supported on "zero_alloc" in signatures + +module M_struct_arity_let_2 : + sig val f : int -> int -> int [@@zero_alloc] end +|}] + +module M_struct_arity_let_fun_1 = struct + let f = fun[@zero_alloc arity 2] x y -> x + y +end +[%%expect{| +Line 2, characters 15-25: +2 | let f = fun[@zero_alloc arity 2] x y -> x + y + ^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'zero_alloc'. +The "arity" field is only supported on "zero_alloc" in signatures + +module M_struct_arity_let_fun_1 : + sig val f : int -> int -> int [@@zero_alloc] end +|}] + +module M_struct_arity_let_fun_2 = struct + let f x = + if x = 42 then + fun[@zero_alloc arity 1] y -> y + else + fun y -> y + 1 +end +[%%expect{| +Line 4, characters 11-21: +4 | fun[@zero_alloc arity 1] y -> y + ^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'zero_alloc'. +The "arity" field is only supported on "zero_alloc" in signatures + +module M_struct_arity_let_fun_2 : sig val f : int -> int -> int end +|}] + +(*********************************) +(* Test 10: module type of works *) + +module M_base_for_mto = struct + let[@zero_alloc] f x = x+1 +end + +module type S_base_mto = module type of M_base_for_mto + +module M_mto_base_good : S_base_mto = struct + let[@zero_alloc] f x = x + 2 +end + +module M_mto_base_bad : S_base_mto = struct + let[@zero_alloc opt] f x = x + 3 +end + +[%%expect{| +module M_base_for_mto : sig val f : int -> int [@@zero_alloc] end +module type S_base_mto = sig val f : int -> int [@@zero_alloc] end +module M_mto_base_good : S_base_mto +Lines 11-13, characters 37-3: +11 | .....................................struct +12 | let[@zero_alloc opt] f x = x + 3 +13 | end +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int [@@zero_alloc opt] end + is not included in + S_base_mto + Values do not match: + val f : int -> int [@@zero_alloc opt] + is not included in + val f : int -> int [@@zero_alloc] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +module M_strict_for_mto = struct + let[@zero_alloc strict] f x = x+1 +end + +module type S_strict_mto = module type of M_strict_for_mto + +module M_mto_strict_good : S_strict_mto = struct + let[@zero_alloc strict] f x = x + 2 +end + +module M_mto_strict_bad : S_strict_mto = struct + let[@zero_alloc] f x = x + 3 +end + +[%%expect{| +module M_strict_for_mto : sig val f : int -> int [@@zero_alloc strict] end +module type S_strict_mto = sig val f : int -> int [@@zero_alloc strict] end +module M_mto_strict_good : S_strict_mto +Lines 11-13, characters 41-3: +11 | .........................................struct +12 | let[@zero_alloc] f x = x + 3 +13 | end +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int [@@zero_alloc] end + is not included in + S_strict_mto + Values do not match: + val f : int -> int [@@zero_alloc] + is not included in + val f : int -> int [@@zero_alloc strict] + The former provides a weaker "zero_alloc" guarantee than the latter. +|}] + +(* You can't sneakily get never_returns_normally or assume in a signature with + module type of, but nice try. These tests rely on the fact that the + printer would show that information, but indeed it would (see printtyp). + + (At the moment the backend doesn't allow for checking never_return_normally, + but it wouldn't be hard to add, and then we could revisit this). *) +module M_assume_for_mto = struct + let[@zero_alloc assume] f x = (x+1,x+2) +end + +module type S_no_assume = module type of M_assume_for_mto + +module M_nrn_for_mto = struct + let[@zero_alloc assume never_returns_normally] f x = (x+1,x+2) +end + +module type S_no_nrn = module type of M_nrn_for_mto + +[%%expect{| +module M_assume_for_mto : sig val f : int -> int * int [@@zero_alloc] end +module type S_no_assume = sig val f : int -> int * int [@@zero_alloc] end +module M_nrn_for_mto : sig val f : int -> int * int [@@zero_alloc] end +module type S_no_nrn = sig val f : int -> int * int [@@zero_alloc] end +|}] + +(**********************************************) +(* Test 11: inference from signatures, basics *) + +(* As mentioned above, we aren't testing here that the functions whose need to + be checked for zero_alloc is inferred actually get checked. That is done in + the backend tests. Here we are just showing that type system's view of the + zero_allocness of a function is inferrable. +*) + +(* Should work by setting zero_alloc variables in f and g. *) +module M_infer1 : sig + val[@zero_alloc] f : int -> int + val g : int -> int +end = struct + let f x = x + let g x = x +end + +(* Should be rejected because the signature we have for M_infer1 doesn't have + vars in it (and its zero_alloc values are too weak). *) +module M_infer1' : sig + val[@zero_alloc] f : int -> int + val[@zero_alloc] g : int -> int +end = M_infer1 +[%%expect{| +module M_infer1 : + sig val f : int -> int [@@zero_alloc] val g : int -> int end +Line 14, characters 6-14: +14 | end = M_infer1 + ^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int [@@zero_alloc] val g : int -> int end + is not included in + sig + val f : int -> int [@@zero_alloc] + val g : int -> int [@@zero_alloc] + end + Values do not match: + val g : int -> int + is not included in + val g : int -> int [@@zero_alloc] + The former provides a weaker "zero_alloc" guarantee than the latter. + Hint: Add a "zero_alloc" attribute to the implementation. +|}] + +module M_infer2 = struct + let f x = x + let g x = x +end + +(* Should work by updating the variables. *) +module M_infer2' : sig + val[@zero_alloc opt] f : int -> int + val[@zero_alloc] g : int -> int +end = M_infer2 (* 1 *) + +(* Should work by zero-alloc subtyping. *) +module M_infer2'' : sig + val[@zero_alloc opt] f : int -> int + val[@zero_alloc opt] g : int -> int +end = M_infer2 (* 2 *) + +(* Should work by updating the variables again. *) +module M_infer2''' : sig + val[@zero_alloc] f : int -> int + val[@zero_alloc] g : int -> int +end = M_infer2 (* 3 *) + +(* Here we update the variable on [f] but [g] works by subtyping. *) +module M_infer2'''' : sig + val[@zero_alloc strict] f : int -> int + val[@zero_alloc opt] g : int -> int +end = M_infer2 (* 4 *) +[%%expect{| +module M_infer2 : sig val f : 'a -> 'a val g : 'a -> 'a end +module M_infer2' : + sig + val f : int -> int [@@zero_alloc opt] + val g : int -> int [@@zero_alloc] + end +module M_infer2'' : + sig + val f : int -> int [@@zero_alloc opt] + val g : int -> int [@@zero_alloc opt] + end +module M_infer2''' : + sig val f : int -> int [@@zero_alloc] val g : int -> int [@@zero_alloc] end +module M_infer2'''' : + sig + val f : int -> int [@@zero_alloc strict] + val g : int -> int [@@zero_alloc opt] + end +|}] + +(* At this point, the inferred signature for [M_infer2] has the accumulated + constraints. Note that its final signature has the strictest version of the + checks done on [f] and [g] individually, even though we never compared + against exactly that combined signature. This shows, for example, that when + the constraint for [M_infer2''''] was done we modified [f]'s variable but + didn't accidentally weaken the variable on [g]. *) +module type S = module type of M_infer2 +[%%expect{| +module type S = + sig + val f : 'a -> 'a [@@zero_alloc strict] + val g : 'a -> 'a [@@zero_alloc] + end +|}] + +(********************************************) +(* Test 12: inference plays well with arity *) + +(* If the arity doesn't match the signature, you get an error. *) +module M_inf_too_many_args = struct + type t = int -> int + let f : int -> t = fun x _ -> x +end + +module _ : sig + type t + val[@zero_alloc] f : int -> t +end = M_inf_too_many_args +[%%expect{| +module M_inf_too_many_args : sig type t = int -> int val f : int -> t end +Line 9, characters 6-25: +9 | end = M_inf_too_many_args + ^^^^^^^^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig type t = int -> int val f : int -> t end + is not included in + sig type t val f : int -> t [@@zero_alloc] end + Values do not match: + val f : int -> t + is not included in + val f : int -> t [@@zero_alloc] + zero_alloc arity mismatch: + When using "zero_alloc" in a signature, the syntactic arity of + the implementation must match the function type in the interface. + Here the former is 2 and the latter is 1. +|}] + +module M_inf_too_few_args = struct + let f x = fun y -> x + y +end + +module _ : sig + val[@zero_alloc] f : int -> int -> int +end = M_inf_too_few_args +[%%expect{| +module M_inf_too_few_args : sig val f : int -> int -> int end +Line 7, characters 6-24: +7 | end = M_inf_too_few_args + ^^^^^^^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int -> int end + is not included in + sig val f : int -> int -> int [@@zero_alloc] end + Values do not match: + val f : int -> int -> int + is not included in + val f : int -> int -> int [@@zero_alloc] + zero_alloc arity mismatch: + When using "zero_alloc" in a signature, the syntactic arity of + the implementation must match the function type in the interface. + Here the former is 1 and the latter is 2. +|}] + +(* You can fix it with an explicit arity. *) +module M_explicit_arity_2 = struct + type t = int -> int + let f : int -> t = fun x _ -> x +end + +module _ : sig + type t + val[@zero_alloc (arity 2)] f : int -> t +end = M_explicit_arity_2 + +module type S = module type of M_explicit_arity_2 +[%%expect{| +module M_explicit_arity_2 : sig type t = int -> int val f : int -> t end +module type S = + sig type t = int -> int val f : int -> t [@@zero_alloc arity 2] end +|}] + +(***************************) +(* Test 13: module type of *) + +(* When you take the module type of a module, you get the current state of its + variables. The computed signature itself has no variables, and the original + module keeps its variables (but changing them won't change the signature you + got the first time, just the signature you'll get if you do [module type of] + again). *) +module M_for_mto = struct + let f x = x+1 +end + +(* The current state of the variables is "no check" *) +module type S = module type of M_for_mto +[%%expect{| +module M_for_mto : sig val f : int -> int end +module type S = sig val f : int -> int end +|}] + +(* [S] itself is fixed. *) +module F (X : S) : sig val[@zero_alloc] f : int -> int end = X +[%%expect{| +Line 1, characters 61-62: +1 | module F (X : S) : sig val[@zero_alloc] f : int -> int end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int end + is not included in + sig val f : int -> int [@@zero_alloc] end + Values do not match: + val f : int -> int + is not included in + val f : int -> int [@@zero_alloc] + The former provides a weaker "zero_alloc" guarantee than the latter. + Hint: Add a "zero_alloc" attribute to the implementation. +|}] + +(* But [M_for_mto] retains its variables. Changing them changes what you get + next time you do [module type of] on it, but not [S]. *) +module _ : sig + val[@zero_alloc] f : int -> int +end = M_for_mto + +module type S' = module type of M_for_mto +module F' (X : S') : sig val[@zero_alloc] f : int -> int end = X +module F (X : S) : sig val[@zero_alloc] f : int -> int end = X +[%%expect{| +module type S' = sig val f : int -> int [@@zero_alloc] end +module F' : functor (X : S') -> sig val f : int -> int [@@zero_alloc] end +Line 7, characters 61-62: +7 | module F (X : S) : sig val[@zero_alloc] f : int -> int end = X + ^ +Error: Signature mismatch: + Modules do not match: + sig val f : int -> int end + is not included in + sig val f : int -> int [@@zero_alloc] end + Values do not match: + val f : int -> int + is not included in + val f : int -> int [@@zero_alloc] + The former provides a weaker "zero_alloc" guarantee than the latter. + Hint: Add a "zero_alloc" attribute to the implementation. +|}] + +(************************) +(* Test 14: with module *) + +(* [with module] constraints require us to remove variables just like [module + type of]. Regression test: the below used to hit an assert, as a result of + not removing the vars in the signature of [S_plain] in the implementation of + [N]. *) +module type S = sig + module M : sig + val f : int -> int + end +end + +module N : sig + module Plain : sig + val f : int -> int + end + + module type S_plain = S with module M = Plain +end = struct + module Plain = struct + let f x = x+1 + end + + module type S_plain = S with module M = Plain +end +[%%expect{| +module type S = sig module M : sig val f : int -> int end end +module N : + sig + module Plain : sig val f : int -> int end + module type S_plain = sig module M : sig val f : int -> int end end + end +|}] diff --git a/testsuite/tests/typing-zero-alloc/signatures_native.ml b/testsuite/tests/typing-zero-alloc/signatures_native.ml new file mode 100644 index 00000000000..e9c76c22033 --- /dev/null +++ b/testsuite/tests/typing-zero-alloc/signatures_native.ml @@ -0,0 +1,15 @@ +(* TEST + native; +*) + +(* This test is just checking that zero_alloc attributes in signatures don't + result in warning 199 when compiling to native code (which was a bug in the + initial implementation. *) + +module type S = sig + type t + + val[@zero_alloc] f : int -> int + + val[@zero_alloc arity 3] g : t +end diff --git a/testsuite/tests/unboxed-primitive-args/common.ml b/testsuite/tests/unboxed-primitive-args/common.ml index 19c0451e05c..f3ed7ca9e78 100644 --- a/testsuite/tests/unboxed-primitive-args/common.ml +++ b/testsuite/tests/unboxed-primitive-args/common.ml @@ -8,6 +8,8 @@ type 'a typ = | Int64 : int64 typ | Nativeint : nativeint typ | Float : float typ + | Float64x2 : float64x2 typ + | Int64x2 : int64x2 typ type 'a proto = | Ret : 'a typ -> 'a proto @@ -44,6 +46,14 @@ let expand_test = function Test (s, fn, a ** b ** c ** d ** e ** f ** Ret g) | T (s, fn, p) -> Test (s, fn, p) +external int64x2_of_int64s : int64 -> int64 -> int64x2 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] +external int64x2_low_int64 : int64x2 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] +external int64x2_high_int64 : int64x2 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] + +external float64x2_of_int64s : int64 -> int64 -> float64x2 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] +external float64x2_low_int64 : float64x2 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] +external float64x2_high_int64 : float64x2 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] + let string_of : type a. a typ -> a -> string = function | Int -> Int.to_string | Int32 -> Printf.sprintf "%ldl" @@ -51,6 +61,10 @@ let string_of : type a. a typ -> a -> string = function | Nativeint -> Printf.sprintf "%ndn" | Float -> fun f -> Printf.sprintf "float_of_bits 0x%LxL" (Int64.bits_of_float f) + | Int64x2 -> + fun v -> Printf.sprintf "int64x2 %016Lx:%016Lx" (int64x2_high_int64 v) (int64x2_low_int64 v) + | Float64x2 -> + fun v -> Printf.sprintf "float64x2 %016Lx:%016Lx" (float64x2_high_int64 v) (float64x2_low_int64 v) let rec arity : type a. a proto -> int = function | Ret _ -> 0 @@ -59,7 +73,7 @@ let rec arity : type a. a proto -> int = function module Buffer = struct type t = (char, int8_unsigned_elt, c_layout) Array1.t - let arg_size = 8 + let arg_size = 16 let create ~arity : t = Array1.create char c_layout ((arity + 1) * arg_size) @@ -76,6 +90,22 @@ module Buffer = struct external set_int32 : t -> int -> int32 -> unit = "%caml_bigstring_set32" external set_int64 : t -> int -> int64 -> unit = "%caml_bigstring_set64" + let get_int64x2 buf ~arg = + let low, high = get_int64 buf (arg * arg_size), get_int64 buf (arg * arg_size + 8) in + int64x2_of_int64s low high + + let set_int64x2 buf ~arg x = + set_int64 buf (arg * arg_size) (int64x2_low_int64 x); + set_int64 buf ((arg * arg_size) + 8) (int64x2_high_int64 x) + + let get_float64x2 buf ~arg = + let low, high = get_int64 buf (arg * arg_size), get_int64 buf (arg * arg_size + 8) in + float64x2_of_int64s low high + + let set_float64x2 buf ~arg x = + set_int64 buf (arg * arg_size) (float64x2_low_int64 x); + set_int64 buf ((arg * arg_size) + 8) (float64x2_high_int64 x) + let get_int32 t ~arg = get_int32 t (arg * arg_size) let get_int64 t ~arg = get_int64 t (arg * arg_size) let set_int32 t ~arg x = set_int32 t (arg * arg_size) x @@ -110,6 +140,8 @@ module Buffer = struct | Int64 -> get_int64 | Nativeint -> get_nativeint | Float -> get_float + | Int64x2 -> get_int64x2 + | Float64x2 -> get_float64x2 let set : type a. a typ -> t -> arg:int -> a -> unit = function | Int -> set_int @@ -117,6 +149,8 @@ module Buffer = struct | Int64 -> set_int64 | Nativeint -> set_nativeint | Float -> set_float + | Int64x2 -> set_int64x2 + | Float64x2 -> set_float64x2 (* This is almost a memcpy except that we use get/set which should ensure that the values in [dst] don't overflow. *) @@ -161,6 +195,7 @@ let typ_size : type a. a typ -> int = function | Int64 -> 8 | Nativeint -> Sys.word_size / 8 | Float -> 8 + | Int64x2 | Float64x2 -> 16 let rec sizes : type a. a proto -> int list = function | Ret typ -> [typ_size typ] diff --git a/testsuite/tests/unboxed-primitive-args/common.mli b/testsuite/tests/unboxed-primitive-args/common.mli index b7459bb1027..454c589ffb5 100644 --- a/testsuite/tests/unboxed-primitive-args/common.mli +++ b/testsuite/tests/unboxed-primitive-args/common.mli @@ -5,6 +5,8 @@ type 'a typ = | Int64 : int64 typ | Nativeint : nativeint typ | Float : float typ + | Float64x2 : float64x2 typ + | Int64x2 : int64x2 typ type 'a proto = | Ret : 'a typ -> 'a proto diff --git a/testsuite/tests/unboxed-primitive-args/gen_test.ml b/testsuite/tests/unboxed-primitive-args/gen_test.ml index 8f4b2dfe59d..5c54dc0996a 100644 --- a/testsuite/tests/unboxed-primitive-args/gen_test.ml +++ b/testsuite/tests/unboxed-primitive-args/gen_test.ml @@ -4,14 +4,17 @@ open StdLabels type boxed_integer = Pnativeint | Pint32 | Pint64 +type boxed_vector = Pint64x2 | Pfloat64x2 + type native_repr = | Same_as_ocaml_repr | Unboxed_float | Unboxed_integer of boxed_integer | Untagged_int + | Unboxed_vector of boxed_vector (* Generate primitives with up to this number of arguments *) -let test_all_combination_up_to_n_args = 6 +let test_all_combination_up_to_n_args = 5 (* Generate primitives using all combination of these argument representations. No need to test all combination of other @@ -27,6 +30,8 @@ let test_all_args_combination_of = [ Unboxed_float ; Unboxed_integer Pint32 ; Unboxed_integer Pint64 + ; Unboxed_vector Pint64x2 + ; Unboxed_vector Pfloat64x2 ] let code_of_repr = function @@ -36,6 +41,8 @@ let code_of_repr = function | Unboxed_integer Pint64 -> "L" | Unboxed_integer Pnativeint -> "n" | Untagged_int -> "i" + | Unboxed_vector Pint64x2 -> "I" + | Unboxed_vector Pfloat64x2 -> "x" let repr_of_code = function | 'v' -> Same_as_ocaml_repr @@ -44,6 +51,8 @@ let repr_of_code = function | 'L' -> Unboxed_integer Pint64 | 'n' -> Unboxed_integer Pnativeint | 'i' -> Untagged_int + | 'x' -> Unboxed_vector Pfloat64x2 + | 'I' -> Unboxed_vector Pint64x2 | _ -> assert false let manual_tests = @@ -53,10 +62,15 @@ let manual_tests = ; "L_L" ; "n_n" ; "i_i" + ; "x_x" ; "f_fffff" ; "f_ffffff" ; "f_fffffff" ; "f_fffffffffffffffff" + ; "x_xxxxx" + ; "x_xxxxxx" + ; "x_xxxxxxx" + ; "x_xxxxxxxxxxxxxxxxx" ; "v_iiiiiiiiiiiiiiiii" ; "v_lllllllllllllllll" ; "v_LLLLLLLLLLLLLLLLL" @@ -64,6 +78,11 @@ let manual_tests = ; "v_LiLiLiLiLiLiLiLiL" ; "v_flflflflflflflflflflflflflflflflflfl" ; "v_fLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfL" + ; "v_xfxfxfxfxfxfxfxfx" + ; "v_fxfxfxfxfxfxfxfxf" + ; "v_lfxlfxlfxlfxlfxlfx" + ; "v_lflxlxlflflxlxlflx" + ; "v_llllllfffffflxxllxx" ] let ocaml_type_of_repr = function @@ -74,6 +93,8 @@ let ocaml_type_of_repr = function | Unboxed_integer Pint64 -> "(int64 [@unboxed])" | Unboxed_integer Pnativeint -> "(nativeint [@unboxed])" | Untagged_int -> "(int [@untagged])" + | Unboxed_vector Pfloat64x2 -> "(float64x2 [@unboxed])" + | Unboxed_vector Pint64x2 -> "(int64x2 [@unboxed])" let ocaml_type_gadt_of_repr = function (* Doesn't really matters what we choose for this case *) @@ -83,6 +104,8 @@ let ocaml_type_gadt_of_repr = function | Unboxed_integer Pint64 -> "Int64" | Unboxed_integer Pnativeint -> "Nativeint" | Untagged_int -> "Int" + | Unboxed_vector Pfloat64x2 -> "Float64x2" + | Unboxed_vector Pint64x2 -> "Int64x2" let c_type_of_repr = function | Same_as_ocaml_repr -> "value" @@ -91,6 +114,8 @@ let c_type_of_repr = function | Unboxed_integer Pint64 -> "int64_t" | Unboxed_integer Pnativeint -> "intnat" | Untagged_int -> "intnat" + | Unboxed_vector Pfloat64x2 -> "__m128d" + | Unboxed_vector Pint64x2 -> "__m128i" type proto = { params : native_repr list @@ -161,29 +186,47 @@ let iter_protos ~f = let pr fmt = Printf.ksprintf (fun s -> print_string s; print_char '\n') fmt let generate_ml () = - pr "open Common"; - pr ""; + let close, print_test = + let n = 2048 in + let i = ref 0 in + let file = ref None in + let close () = + match !file with + | Some file -> + Printf.fprintf file "\nlet run () = run_tests (List.rev tests)\n%!"; + Out_channel.close file + | None -> () + in + let new_file () = + close (); + let next = open_out (Printf.sprintf "test%d.ml" (!i / n)) in + pr "let () = Test%d.run ()" (!i / n); + file := Some next; + Printf.fprintf next "open Common\n"; + Printf.fprintf next "let tests = []\n\n"; + in + close, fun ext test -> + if !i mod n = 0 then new_file (); + Printf.fprintf (Option.get !file) "%s\n%s\n" ext test; + incr i + in iter_protos ~f:(fun proto -> let name = function_name_of_proto proto in - pr "external %s : %s = \"\" %S [@@noalloc]" - name (ocaml_type_of_proto proto) name; - ); - pr ""; - pr "let tests = []"; - iter_protos ~f:(fun proto -> + let ext = Format.sprintf "external %s : %s = \"\" %S [@@@@noalloc]" + name (ocaml_type_of_proto proto) name in let name = function_name_of_proto proto in let arity = List.length proto.params in - if arity <= 6 then - pr "let tests = T%d (%S, %s, %s, %s) :: tests" - arity name name - (List.map proto.params ~f:ocaml_type_gadt_of_repr - |> String.concat ~sep:", ") - (ocaml_type_gadt_of_repr proto.return) + let test = if arity <= 6 then + Format.sprintf "let tests = T%d (%S, %s, %s, %s) :: tests" + arity name name + (List.map proto.params ~f:ocaml_type_gadt_of_repr + |> String.concat ~sep:", ") + (ocaml_type_gadt_of_repr proto.return) else - pr "let tests = T (%S, %s, %s) :: tests" - name name (ocaml_type_gadt_of_proto proto)); - pr ""; - pr "let () = run_tests (List.rev tests)" + Format.sprintf "let tests = T (%S, %s, %s) :: tests" + name name (ocaml_type_gadt_of_proto proto) in + print_test ext test); + close () let generate_stubs () = pr "#include "; @@ -205,7 +248,9 @@ let generate_stubs () = | Unboxed_integer Pint32 -> "set_int32(%d, x%d)" | Unboxed_integer Pint64 -> "set_int64(%d, x%d)" | Unboxed_integer Pnativeint -> "set_intnat(%d, x%d)" - | Untagged_int -> "set_intnat(%d, x%d)") + | Untagged_int -> "set_intnat(%d, x%d)" + | Unboxed_vector Pint64x2 -> "set_int128(%d, x%d)" + | Unboxed_vector Pfloat64x2 -> "set_float128(%d, x%d)") i i); pr " return %(%d%);" (match proto.return with @@ -214,7 +259,9 @@ let generate_stubs () = | Unboxed_integer Pint32 -> "get_int32(%d)" | Unboxed_integer Pint64 -> "get_int64(%d)" | Unboxed_integer Pnativeint -> "get_intnat(%d)" - | Untagged_int -> "get_intnat(%d)") + | Untagged_int -> "get_intnat(%d)" + | Unboxed_vector Pint64x2 -> "get_int128(%d)" + | Unboxed_vector Pfloat64x2 -> "get_float128(%d)") (List.length proto.params); pr "}" ) diff --git a/testsuite/tests/unboxed-primitive-args/test.ml b/testsuite/tests/unboxed-primitive-args/test.ml index 49819fac412..e3f7c3ec4e5 100644 --- a/testsuite/tests/unboxed-primitive-args/test.ml +++ b/testsuite/tests/unboxed-primitive-args/test.ml @@ -1,19 +1,19 @@ (* TEST - -readonly_files = "common.mli common.ml test_common.c test_common.h" - -* setup-ocamlopt.opt-build-env -** ocaml -test_file = "${test_source_directory}/gen_test.ml" -ocaml_script_as_argument = "true" -arguments = "c" -compiler_output = "stubs.c" -*** ocaml -arguments = "ml" -compiler_output = "main.ml" -**** ocamlopt.opt -all_modules = "test_common.c stubs.c common.mli common.ml main.ml" -***** run -****** check-program-output - + readonly_files = "common.mli common.ml test_common.c test_common.h"; + flambda2; + setup-ocamlopt.opt-build-env; + test_file = "${test_source_directory}/gen_test.ml"; + ocaml_script_as_argument = "true"; + arguments = "c"; + compiler_output = "stubs.c"; + ocaml; + arguments = "ml"; + compiler_output = "main.ml"; + ocaml; + ocamlopt_flags = "-extension simd -cc '${cc} -msse4.2'"; + all_modules = "test_common.c stubs.c common.mli common.ml test0.ml test1.ml main.ml"; + ocamlopt.opt; + run; + check-program-output; *) +(* We use flambda2 above as a proxy to indicate SIMD is supported *) diff --git a/testsuite/tests/unboxed-primitive-args/test_common.c b/testsuite/tests/unboxed-primitive-args/test_common.c index c6b873c5147..9f453c354ce 100644 --- a/testsuite/tests/unboxed-primitive-args/test_common.c +++ b/testsuite/tests/unboxed-primitive-args/test_common.c @@ -15,6 +15,8 @@ #include #include +#include +#include char *ocaml_buffer; char *c_buffer; @@ -35,3 +37,18 @@ double test_cleanup_float(void) { return 0.; } + +int64_t vec128_low_int64(__m128i v) +{ + return _mm_extract_epi64(v, 0); +} + +int64_t vec128_high_int64(__m128i v) +{ + return _mm_extract_epi64(v, 1); +} + +__m128i vec128_of_int64s(int64_t low, int64_t high) +{ + return _mm_set_epi64x(high, low); +} diff --git a/testsuite/tests/unboxed-primitive-args/test_common.h b/testsuite/tests/unboxed-primitive-args/test_common.h index 2a1019ca398..93e9a85b680 100644 --- a/testsuite/tests/unboxed-primitive-args/test_common.h +++ b/testsuite/tests/unboxed-primitive-args/test_common.h @@ -16,6 +16,8 @@ #ifndef __TEST_COMMON_H #define __TEST_COMMON_H +#include + /* Where the OCaml side stores the arguments and result for a test case. The C function will read the result it is supposed to return from this buffer. @@ -31,14 +33,20 @@ extern char *ocaml_buffer; equal. */ extern char *c_buffer; -#define get_intnat(n) *(intnat*)(ocaml_buffer+((n)*8)) -#define get_int32(n) *(int32_t*)(ocaml_buffer+((n)*8)) -#define get_int64(n) *(int64_t*)(ocaml_buffer+((n)*8)) -#define get_double(n) *(double*)(ocaml_buffer+((n)*8)) +#define STRIDE 16 + +#define get_intnat(n) *(intnat*)(ocaml_buffer+((n)*STRIDE)) +#define get_int32(n) *(int32_t*)(ocaml_buffer+((n)*STRIDE)) +#define get_int64(n) *(int64_t*)(ocaml_buffer+((n)*STRIDE)) +#define get_double(n) *(double*)(ocaml_buffer+((n)*STRIDE)) +#define get_int128(n) _mm_loadu_si128((__m128i*)(ocaml_buffer+((n)*STRIDE))) +#define get_float128(n) _mm_loadu_pd((double*)(ocaml_buffer+((n)*STRIDE))) -#define set_intnat(n, x) *(intnat*)(c_buffer+((n)*8)) = (x) -#define set_int32(n, x) *(int32_t*)(c_buffer+((n)*8)) = (x) -#define set_int64(n, x) *(int64_t*)(c_buffer+((n)*8)) = (x) -#define set_double(n, x) *(double*)(c_buffer+((n)*8)) = (x) +#define set_intnat(n, x) *(intnat*)(c_buffer+((n)*STRIDE)) = (x) +#define set_int32(n, x) *(int32_t*)(c_buffer+((n)*STRIDE)) = (x) +#define set_int64(n, x) *(int64_t*)(c_buffer+((n)*STRIDE)) = (x) +#define set_double(n, x) *(double*)(c_buffer+((n)*STRIDE)) = (x) +#define set_int128(n, x) _mm_storeu_si128((__m128i*)(c_buffer+((n)*STRIDE)), (x)) +#define set_float128(n, x) _mm_storeu_pd((double*)(c_buffer+((n)*STRIDE)), (x)) #endif /* __TEST_COMMON_H */ diff --git a/testsuite/tests/unwind/driver.ml b/testsuite/tests/unwind/driver.ml index 7df39daf0ea..c152624d4aa 100644 --- a/testsuite/tests/unwind/driver.ml +++ b/testsuite/tests/unwind/driver.ml @@ -1,5 +1,9 @@ (* TEST + reason = "Test is broken w.r.t. Flambda 2 name mangling etc."; + skip; +*) +(* mshinwell 2023-10-31 script = "sh ${test_source_directory}/check-linker-version.sh" readonly_files = "mylib.mli mylib.ml stack_walker.c" @@ -30,3 +34,4 @@ let () = (* https://github.com/ocaml-multicore/ocaml-multicore/issues/274 *) let () = Mylib.foo1 Mylib.bob 1 2 3 4 5 6 7 8 9 10 +*) diff --git a/testsuite/tests/utils/edit_distance.ml b/testsuite/tests/utils/edit_distance.ml index 1ac10701367..cf2e60cba91 100644 --- a/testsuite/tests/utils/edit_distance.ml +++ b/testsuite/tests/utils/edit_distance.ml @@ -1,8 +1,8 @@ (* TEST -include config -include testing -binary_modules = "config build_path_prefix_map misc identifiable numbers" -* bytecode + include config; + include testing; + binary_modules = "config build_path_prefix_map misc identifiable numbers"; + bytecode; *) let edit_distance = Misc.edit_distance diff --git a/testsuite/tests/utils/find_first_mono.ml b/testsuite/tests/utils/find_first_mono.ml index 80ea5e62554..1970eb9e400 100644 --- a/testsuite/tests/utils/find_first_mono.ml +++ b/testsuite/tests/utils/find_first_mono.ml @@ -1,8 +1,8 @@ (* TEST -include config -include testing -binary_modules = "config build_path_prefix_map misc" -* bytecode + include config; + include testing; + binary_modules = "config build_path_prefix_map misc"; + bytecode; *) let check_and_count_calls n = diff --git a/testsuite/tests/utils/magic_number.ml b/testsuite/tests/utils/magic_number.ml index a443e253e5b..42664ec80b5 100644 --- a/testsuite/tests/utils/magic_number.ml +++ b/testsuite/tests/utils/magic_number.ml @@ -1,7 +1,7 @@ (* TEST -include config -binary_modules = "config build_path_prefix_map misc" -* bytecode + include config; + binary_modules = "config build_path_prefix_map misc"; + bytecode; *) open Misc diff --git a/testsuite/tests/utils/overflow_detection.ml b/testsuite/tests/utils/overflow_detection.ml index 11f3aafaeb5..c9d984b55bf 100644 --- a/testsuite/tests/utils/overflow_detection.ml +++ b/testsuite/tests/utils/overflow_detection.ml @@ -1,8 +1,8 @@ (* TEST -include config -include testing -binary_modules = "config build_path_prefix_map misc identifiable numbers" -* bytecode + include config; + include testing; + binary_modules = "config build_path_prefix_map misc identifiable numbers"; + bytecode; *) let print_int i = diff --git a/testsuite/tests/utils/test_strongly_connected_components.ml b/testsuite/tests/utils/test_strongly_connected_components.ml index 05845228b50..32cdc6bb250 100644 --- a/testsuite/tests/utils/test_strongly_connected_components.ml +++ b/testsuite/tests/utils/test_strongly_connected_components.ml @@ -1,10 +1,8 @@ (* TEST -include config -include testing -binary_modules = - "config build_path_prefix_map misc identifiable numbers \ - strongly_connected_components" -* bytecode + include config; + include testing; + binary_modules = "config build_path_prefix_map misc identifiable numbers strongly_connected_components"; + bytecode; *) module Int = Numbers.Int diff --git a/testsuite/tests/warnings/deprecated_module.ml b/testsuite/tests/warnings/deprecated_module.ml index 178483d728f..a8ec2c4aef6 100644 --- a/testsuite/tests/warnings/deprecated_module.ml +++ b/testsuite/tests/warnings/deprecated_module.ml @@ -1,8 +1,8 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + -flags = "-w +A" -* bytecode *) @@ -15,3 +15,8 @@ end let _ = M.x include M + +(* TEST + flags = "-w +A"; + bytecode; +*) diff --git a/testsuite/tests/warnings/deprecated_module_assigment.ml b/testsuite/tests/warnings/deprecated_module_assigment.ml index c4f9b2b6762..68ccd43b958 100644 --- a/testsuite/tests/warnings/deprecated_module_assigment.ml +++ b/testsuite/tests/warnings/deprecated_module_assigment.ml @@ -1,8 +1,8 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + -flags = "-w +A-70" -* bytecode *) @@ -84,3 +84,8 @@ struct module M = struct end [@@deprecated "FOO"] end module MD_OK : sig module M : sig end [@@deprecated] end = struct module M = struct end [@@deprecated "FOO"] end + +(* TEST + flags = "-w +A-70"; + bytecode; +*) diff --git a/testsuite/tests/warnings/deprecated_module_use.ml b/testsuite/tests/warnings/deprecated_module_use.ml index ca582ee1f6a..b6a568ad0fc 100644 --- a/testsuite/tests/warnings/deprecated_module_use.ml +++ b/testsuite/tests/warnings/deprecated_module_use.ml @@ -1,17 +1,17 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + -modules = "deprecated_module.mli deprecated_module.ml" -* setup-ocamlc.byte-build-env -** ocamlc.byte -flags = "-w -a" -module = "deprecated_module.mli" -*** ocamlc.byte -module = "deprecated_module.ml" -**** ocamlc.byte -flags = "-w +A-70" -module = "deprecated_module_use.ml" -***** check-ocamlc.byte-output *) @@ -21,3 +21,17 @@ type s = M.t open M let _ = x + +(* TEST + modules = "deprecated_module.mli deprecated_module.ml"; + setup-ocamlc.byte-build-env; + flags = "-w -a"; + module = "deprecated_module.mli"; + ocamlc.byte; + module = "deprecated_module.ml"; + ocamlc.byte; + flags = "-w +A-70"; + module = "deprecated_module_use.ml"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/deprecated_mutable.ml b/testsuite/tests/warnings/deprecated_mutable.ml index 78fb12ac413..82ea7ec00bf 100644 --- a/testsuite/tests/warnings/deprecated_mutable.ml +++ b/testsuite/tests/warnings/deprecated_mutable.ml @@ -1,8 +1,8 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + -flags = "-w +A-70" -* bytecode *) @@ -11,3 +11,8 @@ type t = {mutable x : int [@deprecated_mutable]} let y : t = {x = 5} let () = y.x <- 42 + +(* TEST + flags = "-w +A-70"; + bytecode; +*) diff --git a/testsuite/tests/warnings/deprecated_warning_specs.ml b/testsuite/tests/warnings/deprecated_warning_specs.ml index ac41e084c11..903b4757c4c 100644 --- a/testsuite/tests/warnings/deprecated_warning_specs.ml +++ b/testsuite/tests/warnings/deprecated_warning_specs.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) (** Deprecated sequences of unsigned letters *) diff --git a/testsuite/tests/warnings/marshall_for_w53.ml b/testsuite/tests/warnings/marshall_for_w53.ml index 6c24e98c8a8..1b6bdd2e073 100644 --- a/testsuite/tests/warnings/marshall_for_w53.ml +++ b/testsuite/tests/warnings/marshall_for_w53.ml @@ -2,3 +2,10 @@ let w53_ast = Pparse.parse_implementation ~tool_name:"w53_test" "w53.ml" let () = Pparse.write_ast Pparse.Structure "w53.marshalled.ml" w53_ast + +let w53_zero_alloc_all_ast = + Pparse.parse_implementation ~tool_name:"w53_zero_alloc_all_test" + "w53_zero_alloc_all.ml" + +let () = Pparse.write_ast Pparse.Structure "w53_zero_alloc_all.marshalled.ml" + w53_zero_alloc_all_ast diff --git a/testsuite/tests/warnings/mnemonics.mll b/testsuite/tests/warnings/mnemonics.mll index d1225ed0e31..3c6050b312f 100644 --- a/testsuite/tests/warnings/mnemonics.mll +++ b/testsuite/tests/warnings/mnemonics.mll @@ -1,7 +1,5 @@ (* TEST - -ocamllex_flags = "-q" - + ocamllex_flags = "-q"; *) { diff --git a/testsuite/tests/warnings/w01.ml b/testsuite/tests/warnings/w01.ml index e72ec1901dc..d78b2b5477d 100644 --- a/testsuite/tests/warnings/w01.ml +++ b/testsuite/tests/warnings/w01.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -52,3 +52,11 @@ match 1 with (* X *) (* re-re *) + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w03.ml b/testsuite/tests/warnings/w03.ml index d0a581220a4..ff5aee7db19 100644 --- a/testsuite/tests/warnings/w03.ml +++ b/testsuite/tests/warnings/w03.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -22,3 +22,11 @@ let _ = B exception C [@deprecated] let _ = B [@warning "-53"] + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w04.ml b/testsuite/tests/warnings/w04.ml index 21a09f52da3..b2ddf4c9351 100644 --- a/testsuite/tests/warnings/w04.ml +++ b/testsuite/tests/warnings/w04.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -21,3 +21,11 @@ type t = A | B let g x = match x with | A -> 0 | _ -> 1 + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w04_failure.ml b/testsuite/tests/warnings/w04_failure.ml index 0ce23ca0ae9..60462390c37 100644 --- a/testsuite/tests/warnings/w04_failure.ml +++ b/testsuite/tests/warnings/w04_failure.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -37,3 +37,11 @@ let silent_fragile2 (type t) (r1 : t repr) (r2 : t repr) (t : t) = | _, XY, X -> () | AB, _, _ -> () | _, XY, _ -> () + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w06.ml b/testsuite/tests/warnings/w06.ml index dc4e6e6a6ae..94bf0486de7 100644 --- a/testsuite/tests/warnings/w06.ml +++ b/testsuite/tests/warnings/w06.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -15,3 +15,11 @@ let bar ~foo ~baz = ignore (foo, baz) (* two labels *) let () = foo 2 let () = bar 4 2 + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w190.ml b/testsuite/tests/warnings/w190.ml index 52e6a9e0fc3..d94385a4e8b 100644 --- a/testsuite/tests/warnings/w190.ml +++ b/testsuite/tests/warnings/w190.ml @@ -1,14 +1,22 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) let foo x = [%probe "name_is_too_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" (print_int x)]; x + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w26_alias.ml b/testsuite/tests/warnings/w26_alias.ml index 64b17a2090c..7d3c2b10df1 100644 --- a/testsuite/tests/warnings/w26_alias.ml +++ b/testsuite/tests/warnings/w26_alias.ml @@ -1,5 +1,5 @@ (* TEST - * expect + expect; *) type t = { x : int diff --git a/testsuite/tests/warnings/w32.ml b/testsuite/tests/warnings/w32.ml index ece0a771bc1..520ec3de6d9 100644 --- a/testsuite/tests/warnings/w32.ml +++ b/testsuite/tests/warnings/w32.ml @@ -1,13 +1,13 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + -flags = "-w +A" -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "w32.mli" -*** ocamlc.byte -module = "w32.ml" -**** check-ocamlc.byte-output *) @@ -80,3 +80,13 @@ module Nominal = struct module N = F(M) end + +(* TEST + flags = "-w +A"; + setup-ocamlc.byte-build-env; + module = "w32.mli"; + ocamlc.byte; + module = "w32.ml"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w32b.ml b/testsuite/tests/warnings/w32b.ml index bcb2fc2588e..70f1b861b36 100644 --- a/testsuite/tests/warnings/w32b.ml +++ b/testsuite/tests/warnings/w32b.ml @@ -1,13 +1,21 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) (* Check that [t] is considered unused without an .mli file (see GPR#1358) *) module Q (M : sig type t end) = struct end + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w33.ml b/testsuite/tests/warnings/w33.ml index 4c4abfd6667..34635c8d39f 100644 --- a/testsuite/tests/warnings/w33.ml +++ b/testsuite/tests/warnings/w33.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -25,3 +25,11 @@ let i (A|B) = B open! M (* useless open! *) open M (* useless open *) + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w45.ml b/testsuite/tests/warnings/w45.ml index 01af3e796e2..9091842c7f7 100644 --- a/testsuite/tests/warnings/w45.ml +++ b/testsuite/tests/warnings/w45.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -25,3 +25,11 @@ module T3 = struct let _ = (A, X) (* X belongs to several types *) end + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w47_inline.ml b/testsuite/tests/warnings/w47_inline.ml index fcdaedc4750..30c7cc71012 100644 --- a/testsuite/tests/warnings/w47_inline.ml +++ b/testsuite/tests/warnings/w47_inline.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -39,3 +39,11 @@ let test x = else f5 x in f4 (f6 r) + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w50.ml b/testsuite/tests/warnings/w50.ml index b6e868f89ad..a9a1a923298 100644 --- a/testsuite/tests/warnings/w50.ml +++ b/testsuite/tests/warnings/w50.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -16,3 +16,11 @@ module A : sig end = struct module Y1 = X1 end + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w51.ml b/testsuite/tests/warnings/w51.ml index abfee541f4d..a471ccffcd8 100644 --- a/testsuite/tests/warnings/w51.ml +++ b/testsuite/tests/warnings/w51.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-w +A-70" - * expect + flags = "-w +A-70"; + expect; *) let rec fact = function diff --git a/testsuite/tests/warnings/w51_bis.ml b/testsuite/tests/warnings/w51_bis.ml index bb5bcaac1a6..660210627cf 100644 --- a/testsuite/tests/warnings/w51_bis.ml +++ b/testsuite/tests/warnings/w51_bis.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -14,3 +14,11 @@ let rec foldl op acc = function | x :: xs -> try (foldl [@tailcall]) op (op x acc) xs with Not_found -> assert false + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w52.ml b/testsuite/tests/warnings/w52.ml index 55204e8cd81..c444c1a4584 100644 --- a/testsuite/tests/warnings/w52.ml +++ b/testsuite/tests/warnings/w52.ml @@ -1,6 +1,6 @@ (* TEST - flags = "-w +A" - * expect + flags = "-w +A"; + expect; *) let () = try () with Invalid_argument "Any" -> ();; diff --git a/testsuite/tests/warnings/w53.compilers.reference b/testsuite/tests/warnings/w53.compilers.reference index 4e2e68501b3..e9d07aab9d0 100644 --- a/testsuite/tests/warnings/w53.compilers.reference +++ b/testsuite/tests/warnings/w53.compilers.reference @@ -8,6 +8,11 @@ File "w53.ml", line 12, characters 4-5: ^ Warning 32 [unused-value-declaration]: unused value h. +File "w53.ml", line 9, characters 24-53: +9 | type r0 = {s : string [@no_mutable_implied_modalities]} (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "no_mutable_implied_modalities" attribute cannot appear in this context + File "w53.ml", line 12, characters 14-20: 12 | let h x = x [@inline] (* rejected *) ^^^^^^ @@ -433,497 +438,772 @@ File "w53.ml", line 226, characters 39-48: ^^^^^^^^^ Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context -File "w53.ml", line 230, characters 20-25: -230 | type 'a t1 = 'a [@local] (* rejected *) +File "w53.ml", line 231, characters 20-25: +231 | type 'a t1 = 'a [@local] ^^^^^ Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context -File "w53.ml", line 231, characters 21-27: -231 | type 'a t1' = 'a [@global] (* rejected *) +File "w53.ml", line 232, characters 21-27: +232 | type 'a t1' = 'a [@global] ^^^^^^ Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context -File "w53.ml", line 233, characters 24-29: -233 | type t2 = { x : int [@local] } (* rejected *) +File "w53.ml", line 234, characters 24-29: +234 | type t2 = { x : int [@local] } ^^^^^ Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context -File "w53.ml", line 236, characters 27-32: -236 | val x : 'a list -> ('a [@local]) list (* rejected *) +File "w53.ml", line 235, characters 25-31: +235 | type t2' = { x : int [@global] } + ^^^^^^ +Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context + +File "w53.ml", line 237, characters 27-32: +237 | val x : 'a list -> ('a [@local]) list ^^^^^ Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context -File "w53.ml", line 237, characters 28-34: -237 | val x' : 'a list -> ('a [@global]) list (* rejected *) +File "w53.ml", line 238, characters 28-34: +238 | val x' : 'a list -> ('a [@global]) list ^^^^^^ Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context -File "w53.ml", line 240, characters 33-39: -240 | val y' : 'a -> f:(('a -> 'b) [@global]) -> 'b (* rejected *) +File "w53.ml", line 240, characters 32-37: +240 | val y : 'a -> f:(('a -> 'b) [@local]) -> 'b + ^^^^^ +Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context + +File "w53.ml", line 241, characters 33-39: +241 | val y' : 'a -> f:(('a -> 'b) [@global]) -> 'b ^^^^^^ Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context -File "w53.ml", line 242, characters 16-21: -242 | val z : 'a [@@local] (* rejected *) +File "w53.ml", line 243, characters 16-21: +243 | val z : 'a [@@local] ^^^^^ Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context -File "w53.ml", line 243, characters 17-23: -243 | val z' : 'a [@@global] (* rejected *) +File "w53.ml", line 244, characters 17-23: +244 | val z' : 'a [@@global] ^^^^^^ Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context -File "w53.ml", line 245, characters 17-22: -245 | val w : 'a [@@@local] (* rejected *) +File "w53.ml", line 246, characters 17-22: +246 | val w : 'a [@@@local] ^^^^^ Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context -File "w53.ml", line 246, characters 18-24: -246 | val w' : 'a [@@@global] (* rejected *) +File "w53.ml", line 247, characters 18-24: +247 | val w' : 'a [@@@global] ^^^^^^ Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context -File "w53.ml", line 250, characters 20-25: -250 | type 'a t1 = 'a [@local] (* rejected *) +File "w53.ml", line 252, characters 20-25: +252 | type 'a t1 = 'a [@local] ^^^^^ Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context -File "w53.ml", line 251, characters 21-27: -251 | type 'a t1' = 'a [@global] (* rejected *) +File "w53.ml", line 253, characters 21-27: +253 | type 'a t1' = 'a [@global] ^^^^^^ Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context -File "w53.ml", line 253, characters 24-29: -253 | type t2 = { x : int [@local] } (* rejected *) +File "w53.ml", line 255, characters 24-29: +255 | type t2 = { x : int [@local] } ^^^^^ Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context -File "w53.ml", line 257, characters 13-19: -257 | let g (a [@global]) = a (* rejected *) +File "w53.ml", line 256, characters 25-31: +256 | type t2' = { x : int [@global] } + ^^^^^^ +Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context + +File "w53.ml", line 258, characters 13-18: +258 | let f (a [@local]) = a + ^^^^^ +Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context + +File "w53.ml", line 259, characters 13-19: +259 | let g (a [@global]) = a ^^^^^^ Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context -File "w53.ml", line 262, characters 20-24: -262 | type 'a t1 = 'a [@tail] (* rejected *) +File "w53.ml", line 264, characters 20-24: +264 | type 'a t1 = 'a [@tail] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 263, characters 21-28: -263 | type 'a t1' = 'a [@nontail] (* rejected *) +File "w53.ml", line 265, characters 21-28: +265 | type 'a t1' = 'a [@nontail] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 265, characters 24-28: -265 | type t2 = { x : int [@tail] } (* rejected *) +File "w53.ml", line 267, characters 24-28: +267 | type t2 = { x : int [@tail] } (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 266, characters 25-32: -266 | type t2' = { x : int [@nontail] } (* rejected *) +File "w53.ml", line 268, characters 25-32: +268 | type t2' = { x : int [@nontail] } (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 268, characters 32-36: -268 | val y : 'a -> f:(('a -> 'b) [@tail]) -> 'b (* rejected *) +File "w53.ml", line 270, characters 32-36: +270 | val y : 'a -> f:(('a -> 'b) [@tail]) -> 'b (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 269, characters 33-40: -269 | val y' : 'a -> f:(('a -> 'b) [@nontail]) -> 'b (* rejected *) +File "w53.ml", line 271, characters 33-40: +271 | val y' : 'a -> f:(('a -> 'b) [@nontail]) -> 'b (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 271, characters 16-20: -271 | val z : 'a [@@tail] (* rejected *) +File "w53.ml", line 273, characters 16-20: +273 | val z : 'a [@@tail] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 272, characters 17-24: -272 | val z' : 'a [@@nontail] (* rejected *) +File "w53.ml", line 274, characters 17-24: +274 | val z' : 'a [@@nontail] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 274, characters 6-10: -274 | [@@@tail] (* rejected *) +File "w53.ml", line 276, characters 6-10: +276 | [@@@tail] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 275, characters 6-13: -275 | [@@@nontail] (* rejected *) +File "w53.ml", line 277, characters 6-13: +277 | [@@@nontail] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 279, characters 13-17: -279 | let f (a [@tail]) = a (* rejected *) +File "w53.ml", line 281, characters 13-17: +281 | let f (a [@tail]) = a (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 280, characters 14-21: -280 | let f' (a [@nontail]) = a (* rejected *) +File "w53.ml", line 282, characters 14-21: +282 | let f' (a [@nontail]) = a (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 282, characters 8-12: -282 | let [@tail] g a = a (* rejected *) +File "w53.ml", line 284, characters 8-12: +284 | let [@tail] g a = a (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 283, characters 8-15: -283 | let [@nontail] g' a = a (* rejected *) +File "w53.ml", line 285, characters 8-15: +285 | let [@nontail] g' a = a (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 285, characters 16-20: -285 | let h a = a [@tail] (* rejected *) +File "w53.ml", line 287, characters 16-20: +287 | let h a = a [@tail] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context -File "w53.ml", line 286, characters 17-24: -286 | let h' a = a [@nontail] (* rejected *) +File "w53.ml", line 288, characters 17-24: +288 | let h' a = a [@nontail] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context -File "w53.ml", line 293, characters 21-28: -293 | type 'a t1 = 'a [@@noalloc] (* rejected *) +File "w53.ml", line 295, characters 21-28: +295 | type 'a t1 = 'a [@@noalloc] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 294, characters 19-26: -294 | type s1 = Foo1 [@noalloc] (* rejected *) +File "w53.ml", line 296, characters 19-26: +296 | type s1 = Foo1 [@noalloc] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 295, characters 19-26: -295 | val x : int64 [@@noalloc] (* rejected *) +File "w53.ml", line 297, characters 19-26: +297 | val x : int64 [@@noalloc] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 297, characters 24-31: -297 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) +File "w53.ml", line 299, characters 24-31: +299 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 297, characters 46-53: -297 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) +File "w53.ml", line 299, characters 46-53: +299 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 302, characters 21-28: -302 | type 'a t1 = 'a [@@noalloc] (* rejected *) +File "w53.ml", line 304, characters 21-28: +304 | type 'a t1 = 'a [@@noalloc] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 303, characters 19-26: -303 | type s1 = Foo1 [@noalloc] (* rejected *) +File "w53.ml", line 305, characters 19-26: +305 | type s1 = Foo1 [@noalloc] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 304, characters 25-32: -304 | let x : int64 = 42L [@@noalloc] (* rejected *) +File "w53.ml", line 306, characters 25-32: +306 | let x : int64 = 42L [@@noalloc] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 306, characters 24-31: -306 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) +File "w53.ml", line 308, characters 24-31: +308 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 306, characters 46-53: -306 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) +File "w53.ml", line 308, characters 46-53: +308 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context -File "w53.ml", line 311, characters 21-29: -311 | type 'a t1 = 'a [@@untagged] (* rejected *) +File "w53.ml", line 313, characters 21-29: +313 | type 'a t1 = 'a [@@untagged] (* rejected *) ^^^^^^^^ Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context -File "w53.ml", line 312, characters 19-27: -312 | type s1 = Foo1 [@untagged] (* rejected *) +File "w53.ml", line 314, characters 19-27: +314 | type s1 = Foo1 [@untagged] (* rejected *) ^^^^^^^^ Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context -File "w53.ml", line 313, characters 17-25: -313 | val x : int [@@untagged] (* rejected *) +File "w53.ml", line 315, characters 17-25: +315 | val x : int [@@untagged] (* rejected *) ^^^^^^^^ Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context -File "w53.ml", line 320, characters 21-29: -320 | type 'a t1 = 'a [@@untagged] (* rejected *) +File "w53.ml", line 322, characters 21-29: +322 | type 'a t1 = 'a [@@untagged] (* rejected *) ^^^^^^^^ Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context -File "w53.ml", line 321, characters 19-27: -321 | type s1 = Foo1 [@untagged] (* rejected *) +File "w53.ml", line 323, characters 19-27: +323 | type s1 = Foo1 [@untagged] (* rejected *) ^^^^^^^^ Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context -File "w53.ml", line 322, characters 22-30: -322 | let x : int = 42 [@@untagged] (* rejected *) +File "w53.ml", line 324, characters 22-30: +324 | let x : int = 42 [@@untagged] (* rejected *) ^^^^^^^^ Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context -File "w53.ml", line 329, characters 21-25: -329 | type 'a t1 = 'a [@@poll error] (* rejected *) +File "w53.ml", line 331, characters 21-25: +331 | type 'a t1 = 'a [@@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 330, characters 19-23: -330 | type s1 = Foo1 [@poll error] (* rejected *) +File "w53.ml", line 332, characters 19-23: +332 | type s1 = Foo1 [@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 331, characters 19-23: -331 | val x : int64 [@@poll error] (* rejected *) +File "w53.ml", line 333, characters 19-23: +333 | val x : int64 [@@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 333, characters 24-28: -333 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) +File "w53.ml", line 335, characters 24-28: +335 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 333, characters 49-53: -333 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) +File "w53.ml", line 335, characters 49-53: +335 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 335, characters 39-43: -335 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) +File "w53.ml", line 337, characters 39-43: +337 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 339, characters 21-25: -339 | type 'a t1 = 'a [@@poll error] (* rejected *) +File "w53.ml", line 341, characters 21-25: +341 | type 'a t1 = 'a [@@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 340, characters 19-23: -340 | type s1 = Foo1 [@poll error] (* rejected *) +File "w53.ml", line 342, characters 19-23: +342 | type s1 = Foo1 [@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 341, characters 25-29: -341 | let x : int64 = 42L [@@poll error] (* rejected *) +File "w53.ml", line 343, characters 25-29: +343 | let x : int64 = 42L [@@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 344, characters 24-28: -344 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) +File "w53.ml", line 346, characters 24-28: +346 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 344, characters 49-53: -344 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) +File "w53.ml", line 346, characters 49-53: +346 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 346, characters 39-43: -346 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) +File "w53.ml", line 348, characters 39-43: +348 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) ^^^^ Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context -File "w53.ml", line 356, characters 17-22: -356 | let f2 = fun [@boxed] (type a) (x : a) -> x (* rejected *) +File "w53.ml", line 358, characters 17-22: +358 | let f2 = fun [@boxed] (type a) (x : a) -> x (* rejected *) ^^^^^ Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context -File "w53.ml", line 360, characters 21-28: -360 | type 'a t1 = 'a [@@builtin] (* rejected *) +File "w53.ml", line 362, characters 21-28: +362 | type 'a t1 = 'a [@@builtin] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 361, characters 19-26: -361 | type s1 = Foo1 [@builtin] (* rejected *) +File "w53.ml", line 363, characters 19-26: +363 | type s1 = Foo1 [@builtin] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 362, characters 17-24: -362 | val x : int [@@builtin] (* rejected *) +File "w53.ml", line 364, characters 17-24: +364 | val x : int [@@builtin] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 364, characters 22-29: -364 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) +File "w53.ml", line 366, characters 22-29: +366 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 364, characters 42-49: -364 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) +File "w53.ml", line 366, characters 42-49: +366 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 369, characters 21-28: -369 | type 'a t1 = 'a [@@builtin] (* rejected *) +File "w53.ml", line 371, characters 21-28: +371 | type 'a t1 = 'a [@@builtin] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 370, characters 19-26: -370 | type s1 = Foo1 [@builtin] (* rejected *) +File "w53.ml", line 372, characters 19-26: +372 | type s1 = Foo1 [@builtin] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 371, characters 22-29: -371 | let x : int = 42 [@@builtin] (* rejected *) +File "w53.ml", line 373, characters 22-29: +373 | let x : int = 42 [@@builtin] (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 373, characters 22-29: -373 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) +File "w53.ml", line 375, characters 22-29: +375 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 373, characters 42-49: -373 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) +File "w53.ml", line 375, characters 42-49: +375 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) ^^^^^^^ Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context -File "w53.ml", line 378, characters 21-31: -378 | type 'a t1 = 'a [@@no_effects] (* rejected *) +File "w53.ml", line 380, characters 21-31: +380 | type 'a t1 = 'a [@@no_effects] (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 379, characters 19-29: -379 | type s1 = Foo1 [@no_effects] (* rejected *) +File "w53.ml", line 381, characters 19-29: +381 | type s1 = Foo1 [@no_effects] (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 380, characters 17-27: -380 | val x : int [@@no_effects] (* rejected *) +File "w53.ml", line 382, characters 17-27: +382 | val x : int [@@no_effects] (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 382, characters 22-32: -382 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 384, characters 22-32: +384 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 382, characters 45-55: -382 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 384, characters 45-55: +384 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 387, characters 21-31: -387 | type 'a t1 = 'a [@@no_effects] (* rejected *) +File "w53.ml", line 389, characters 21-31: +389 | type 'a t1 = 'a [@@no_effects] (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 388, characters 19-29: -388 | type s1 = Foo1 [@no_effects] (* rejected *) +File "w53.ml", line 390, characters 19-29: +390 | type s1 = Foo1 [@no_effects] (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 389, characters 22-32: -389 | let x : int = 42 [@@no_effects] (* rejected *) +File "w53.ml", line 391, characters 22-32: +391 | let x : int = 42 [@@no_effects] (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 391, characters 22-32: -391 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 393, characters 22-32: +393 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 391, characters 45-55: -391 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 393, characters 45-55: +393 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context -File "w53.ml", line 396, characters 21-33: -396 | type 'a t1 = 'a [@@no_coeffects] (* rejected *) +File "w53.ml", line 398, characters 21-33: +398 | type 'a t1 = 'a [@@no_coeffects] (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 397, characters 19-31: -397 | type s1 = Foo1 [@no_coeffects] (* rejected *) +File "w53.ml", line 399, characters 19-31: +399 | type s1 = Foo1 [@no_coeffects] (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 398, characters 17-29: -398 | val x : int [@@no_coeffects] (* rejected *) +File "w53.ml", line 400, characters 17-29: +400 | val x : int [@@no_coeffects] (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 400, characters 22-34: -400 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) +File "w53.ml", line 402, characters 22-34: +402 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 400, characters 47-59: -400 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) +File "w53.ml", line 402, characters 47-59: +402 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 405, characters 21-33: -405 | type 'a t1 = 'a [@@no_coeffects] (* rejected *) +File "w53.ml", line 407, characters 21-33: +407 | type 'a t1 = 'a [@@no_coeffects] (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 406, characters 19-31: -406 | type s1 = Foo1 [@no_coeffects] (* rejected *) +File "w53.ml", line 408, characters 19-31: +408 | type s1 = Foo1 [@no_coeffects] (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 407, characters 22-34: -407 | let x : int = 42 [@@no_coeffects] (* rejected *) +File "w53.ml", line 409, characters 22-34: +409 | let x : int = 42 [@@no_coeffects] (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 409, characters 22-34: -409 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) +File "w53.ml", line 411, characters 22-34: +411 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 409, characters 47-59: -409 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) +File "w53.ml", line 411, characters 47-59: +411 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context -File "w53.ml", line 414, characters 21-44: -414 | type 'a t1 = 'a [@@only_generative_effects] (* rejected *) +File "w53.ml", line 416, characters 21-44: +416 | type 'a t1 = 'a [@@only_generative_effects] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 415, characters 19-42: -415 | type s1 = Foo1 [@only_generative_effects] (* rejected *) +File "w53.ml", line 417, characters 19-42: +417 | type s1 = Foo1 [@only_generative_effects] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 416, characters 17-40: -416 | val x : int [@@only_generative_effects] (* rejected *) +File "w53.ml", line 418, characters 17-40: +418 | val x : int [@@only_generative_effects] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 418, characters 22-45: -418 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 420, characters 22-45: +420 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 418, characters 58-81: -418 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 420, characters 58-81: +420 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 423, characters 21-44: -423 | type 'a t1 = 'a [@@only_generative_effects] (* rejected *) +File "w53.ml", line 425, characters 21-44: +425 | type 'a t1 = 'a [@@only_generative_effects] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 424, characters 19-42: -424 | type s1 = Foo1 [@only_generative_effects] (* rejected *) +File "w53.ml", line 426, characters 19-42: +426 | type s1 = Foo1 [@only_generative_effects] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 425, characters 22-45: -425 | let x : int = 42 [@@only_generative_effects] (* rejected *) +File "w53.ml", line 427, characters 22-45: +427 | let x : int = 42 [@@only_generative_effects] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 427, characters 22-45: -427 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 429, characters 22-45: +429 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context -File "w53.ml", line 427, characters 58-81: -427 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) +File "w53.ml", line 429, characters 58-81: +429 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context + +File "w53.ml", line 434, characters 21-34: +434 | type 'a t1 = 'a [@@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 435, characters 19-32: +435 | type s1 = Foo1 [@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 436, characters 17-30: +436 | val x : int [@@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 438, characters 22-35: +438 | external y : (int [@error_message ""]) -> (int [@error_message ""]) = (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 438, characters 51-64: +438 | external y : (int [@error_message ""]) -> (int [@error_message ""]) = (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 440, characters 39-52: +440 | external z : int -> int = "x" "y" [@@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 443, characters 43-56: +443 | (int as ('a:value)[@error_message ""][@error_message ""]) (* reject second *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 447, characters 21-34: +447 | type 'a t1 = 'a [@@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 448, characters 19-32: +448 | type s1 = Foo1 [@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 449, characters 22-35: +449 | let x : int = 42 [@@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 451, characters 22-35: +451 | external y : (int [@error_message ""]) -> (int [@error_message ""]) = (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 451, characters 51-64: +451 | external y : (int [@error_message ""]) -> (int [@error_message ""]) = (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 453, characters 39-52: +453 | external z : int -> int = "x" "y" [@@error_message ""] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 455, characters 45-58: +455 | let f1 v: ((_ : value)[@error_message ""][@error_message ""]) = v (* reject second *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 456, characters 46-59: +456 | let f2 v: (('a : value)[@error_message ""][@error_message ""]) = v (* reject second *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "error_message" attribute cannot appear in this context + +File "w53.ml", line 460, characters 21-32: +460 | type 'a t1 = 'a [@@layout_poly] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 461, characters 19-30: +461 | type s1 = Foo1 [@layout_poly] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 462, characters 19-30: +462 | val x : int64 [@@layout_poly] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 464, characters 24-35: +464 | external y : (int64 [@layout_poly]) -> (int64 [@layout_poly]) = "%identity" (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 464, characters 50-61: +464 | external y : (int64 [@layout_poly]) -> (int64 [@layout_poly]) = "%identity" (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 469, characters 21-32: +469 | type 'a t1 = 'a [@@layout_poly] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 470, characters 19-30: +470 | type s1 = Foo1 [@layout_poly] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 471, characters 25-36: +471 | let x : int64 = 42L [@@layout_poly] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 473, characters 24-35: +473 | external y : (int64 [@layout_poly]) -> (int64 [@layout_poly]) = "%identity" (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 473, characters 50-61: +473 | external y : (int64 [@layout_poly]) -> (int64 [@layout_poly]) = "%identity" (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "layout_poly" attribute cannot appear in this context + +File "w53.ml", line 478, characters 21-31: +478 | type 'a t1 = 'a [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 479, characters 19-29: +479 | type s1 = Foo1 [@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 482, characters 22-32: +482 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 482, characters 45-55: +482 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 483, characters 39-49: +483 | external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 484, characters 12-22: +484 | external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 486, characters 9-19: +486 | class[@zero_alloc] c : (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 488, characters 11-21: +488 | val[@zero_alloc] foo : int * int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 489, characters 11-21: +489 | val[@zero_alloc] bar : int -> int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 490, characters 14-24: +490 | method[@zero_alloc] baz : int * int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 491, characters 14-24: +491 | method[@zero_alloc] boz : int -> int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 496, characters 21-31: +496 | type 'a t1 = 'a [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 497, characters 19-29: +497 | type s1 = Foo1 [@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 498, characters 22-32: +498 | let x : int = 42 [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 500, characters 7-17: +500 | let[@zero_alloc] w = 42 (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 504, characters 22-32: +504 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 504, characters 45-55: +504 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 505, characters 39-49: +505 | external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 506, characters 12-22: +506 | external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 508, characters 9-19: +508 | class[@zero_alloc] foo _y = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 510, characters 10-20: +510 | (fun[@zero_alloc] z -> (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 512, characters 11-21: +512 | val[@zero_alloc] bar = (4, 5) (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 514, characters 14-24: +514 | method[@zero_alloc] baz x = (f (z+10), x+1) (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 526, characters 14-24: +526 | ((boz x)[@zero_alloc assume]) (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 531, characters 7-17: +531 | let[@zero_alloc assume] foo = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53.ml", line 535, characters 7-17: +535 | let[@zero_alloc] bar = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context diff --git a/testsuite/tests/warnings/w53.ml b/testsuite/tests/warnings/w53.ml index 0adb32b7e61..f5c1257086a 100644 --- a/testsuite/tests/warnings/w53.ml +++ b/testsuite/tests/warnings/w53.ml @@ -1,14 +1,14 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + -flags = "-w +A-60-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) +type r0 = {s : string [@no_mutable_implied_modalities]} (* rejected *) +type r1 = {mutable s : string [@no_mutable_implied_modalities]} (* accepted *) + let h x = x [@inline] (* rejected *) let h x = x [@ocaml.inline] (* rejected *) @@ -227,34 +227,36 @@ module TestLocalOptStruct = struct end module type TestLocalGlobalSig = sig - type 'a t1 = 'a [@local] (* rejected *) - type 'a t1' = 'a [@global] (* rejected *) + (* All will be rejected, as we no longer support mode attributes *) + type 'a t1 = 'a [@local] + type 'a t1' = 'a [@global] - type t2 = { x : int [@local] } (* rejected *) - type t2' = { x : int [@global] } (* accepted *) + type t2 = { x : int [@local] } + type t2' = { x : int [@global] } - val x : 'a list -> ('a [@local]) list (* rejected *) - val x' : 'a list -> ('a [@global]) list (* rejected *) + val x : 'a list -> ('a [@local]) list + val x' : 'a list -> ('a [@global]) list - val y : 'a -> f:(('a -> 'b) [@local]) -> 'b (* accepted *) - val y' : 'a -> f:(('a -> 'b) [@global]) -> 'b (* rejected *) + val y : 'a -> f:(('a -> 'b) [@local]) -> 'b + val y' : 'a -> f:(('a -> 'b) [@global]) -> 'b - val z : 'a [@@local] (* rejected *) - val z' : 'a [@@global] (* rejected *) + val z : 'a [@@local] + val z' : 'a [@@global] - val w : 'a [@@@local] (* rejected *) - val w' : 'a [@@@global] (* rejected *) + val w : 'a [@@@local] + val w' : 'a [@@@global] end module TestLocalGlobalStruct = struct - type 'a t1 = 'a [@local] (* rejected *) - type 'a t1' = 'a [@global] (* rejected *) + (* All will be rejected, as we no longer support mode attributes *) + type 'a t1 = 'a [@local] + type 'a t1' = 'a [@global] - type t2 = { x : int [@local] } (* rejected *) - type t2' = { x : int [@global] } (* accepted *) + type t2 = { x : int [@local] } + type t2' = { x : int [@global] } - let f (a [@local]) = a (* accepted *) - let g (a [@global]) = a (* rejected *) + let f (a [@local]) = a + let g (a [@global]) = a end @@ -427,3 +429,117 @@ module TestOnlyGenerativeEffectsStruct = struct external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) external z : int -> int = "x" "y" [@@only_generative_effects] (* accepted *) end + +module type TestErrorMessageSig = sig + type 'a t1 = 'a [@@error_message ""] (* rejected *) + type s1 = Foo1 [@error_message ""] (* rejected *) + val x : int [@@error_message ""] (* rejected *) + + external y : (int [@error_message ""]) -> (int [@error_message ""]) = (* rejected *) + "x" "y" + external z : int -> int = "x" "y" [@@error_message ""] (* rejected *) + + val f : int -> + (int as ('a:value)[@error_message ""][@error_message ""]) (* reject second *) +end + +module TestErrorMessageStruct = struct + type 'a t1 = 'a [@@error_message ""] (* rejected *) + type s1 = Foo1 [@error_message ""] (* rejected *) + let x : int = 42 [@@error_message ""] (* rejected *) + + external y : (int [@error_message ""]) -> (int [@error_message ""]) = (* rejected *) + "x" "y" + external z : int -> int = "x" "y" [@@error_message ""] (* rejected *) + + let f1 v: ((_ : value)[@error_message ""][@error_message ""]) = v (* reject second *) + let f2 v: (('a : value)[@error_message ""][@error_message ""]) = v (* reject second *) +end + +module type TestLayoutPolySig = sig + type 'a t1 = 'a [@@layout_poly] (* rejected *) + type s1 = Foo1 [@layout_poly] (* rejected *) + val x : int64 [@@layout_poly] (* rejected *) + + external y : (int64 [@layout_poly]) -> (int64 [@layout_poly]) = "%identity" (* rejected *) + external z : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] (* accepted *) +end + +module TestLayoutPolyStruct = struct + type 'a t1 = 'a [@@layout_poly] (* rejected *) + type s1 = Foo1 [@layout_poly] (* rejected *) + let x : int64 = 42L [@@layout_poly] (* rejected *) + + external y : (int64 [@layout_poly]) -> (int64 [@layout_poly]) = "%identity" (* rejected *) + external z : ('a : any). 'a -> 'a = "%identity" [@@layout_poly] (* accepted *) +end + +module type TestZeroAllocSig = sig + type 'a t1 = 'a [@@zero_alloc] (* rejected *) + type s1 = Foo1 [@zero_alloc] (* rejected *) + val f : int -> int [@@zero_alloc] (* accepted *) + + external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + + class[@zero_alloc] c : (* rejected *) + object + val[@zero_alloc] foo : int * int (* rejected *) + val[@zero_alloc] bar : int -> int (* rejected *) + method[@zero_alloc] baz : int * int (* rejected *) + method[@zero_alloc] boz : int -> int (* rejected *) + end +end + +module TestZeroAllocStruct = struct + type 'a t1 = 'a [@@zero_alloc] (* rejected *) + type s1 = Foo1 [@zero_alloc] (* rejected *) + let x : int = 42 [@@zero_alloc] (* rejected *) + + let[@zero_alloc] w = 42 (* rejected *) + + let[@zero_alloc] f x = x (* accepted *) + + external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + + class[@zero_alloc] foo _y = (* rejected *) + let[@inline never][@zero_alloc] f x = (x, x) in (* accepted *) + (fun[@zero_alloc] z -> (* rejected *) + object + val[@zero_alloc] bar = (4, 5) (* rejected *) + + method[@zero_alloc] baz x = (f (z+10), x+1) (* rejected *) + end) + + let[@zero_alloc] f1 = fun x y -> (x,y) (* accepted *) + let f2 = fun [@zero_alloc] x y -> (x,y) (* accepted *) + + let[@zero_alloc ignore] f3 = fun x y -> (x,y) (* accepted *) + let f4 = fun [@zero_alloc ignore] x y -> (x,y) (* accepted *) + + (* assume on calls goes on the function being called *) + let[@inline never] boz x = (x,x) + let[@zero_alloc] fiz x = + ((boz x)[@zero_alloc assume]) (* rejected *) + let[@zero_alloc] fuz x = + ((boz[@zero_alloc assume]) x) (* accepted *) + + (* Triggers w53 on non-function lets *) + let[@zero_alloc assume] foo = (* rejected *) + let x = 42 in + fun z -> z + x + + let[@zero_alloc] bar = (* rejected *) + let x = 42 in + fun z -> z + x +end +(* TEST + flags = "-w +A-60-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w53_marshalled.compilers.reference b/testsuite/tests/warnings/w53_marshalled.compilers.reference deleted file mode 100644 index ed20bc2a9c8..00000000000 --- a/testsuite/tests/warnings/w53_marshalled.compilers.reference +++ /dev/null @@ -1,924 +0,0 @@ -File "w53.ml", line 64, characters 37-46: -64 | let test_ppwarning = 42 [@@ppwarning "warning"] - ^^^^^^^^^ -Warning 22 [preprocessor]: warning - -File "w53.ml", line 12, characters 14-20: -12 | let h x = x [@inline] (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context - -File "w53.ml", line 13, characters 14-26: -13 | let h x = x [@ocaml.inline] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context - -File "w53.ml", line 15, characters 14-21: -15 | let i x = x [@inlined] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context - -File "w53.ml", line 16, characters 14-27: -16 | let j x = x [@ocaml.inlined] (* rejected *) - ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context - -File "w53.ml", line 19, characters 16-23: -19 | let l x = h x [@inlined] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context - -File "w53.ml", line 21, characters 14-22: -21 | let m x = x [@tailcall] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context - -File "w53.ml", line 22, characters 14-28: -22 | let n x = x [@ocaml.tailcall] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.tailcall" attribute cannot appear in this context - -File "w53.ml", line 25, characters 16-24: -25 | let q x = h x [@tailcall] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context - -File "w53.ml", line 33, characters 25-31: -33 | module C = struct end [@@inline] (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context - -File "w53.ml", line 34, characters 26-38: -34 | module C' = struct end [@@ocaml.inline] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context - -File "w53.ml", line 35, characters 25-32: -35 | module D = struct end [@@inlined] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context - -File "w53.ml", line 36, characters 26-39: -36 | module D' = struct end [@@ocaml.inlined] (* rejected *) - ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context - -File "w53.ml", line 40, characters 16-22: -40 | module G = (A [@inline])(struct end) (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context - -File "w53.ml", line 41, characters 17-29: -41 | module G' = (A [@ocaml.inline])(struct end) (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context - -File "w53.ml", line 45, characters 22-29: -45 | module I = Set.Make [@inlined] - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context - -File "w53.ml", line 46, characters 23-36: -46 | module I' = Set.Make [@ocaml.inlined] - ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context - -File "w53.ml", line 48, characters 23-30: -48 | module J = Set.Make [@@inlined] - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context - -File "w53.ml", line 49, characters 24-37: -49 | module J' = Set.Make [@@ocaml.inlined] - ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context - -File "w53.ml", line 52, characters 17-27: -52 | val a1 : int [@deprecated] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context - -File "w53.ml", line 57, characters 6-14: -57 | let [@unrolled 42] rec test_unrolled x = (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context - -File "w53.ml", line 69, characters 23-46: -69 | | Lit_pat2 of int [@@warn_on_literal_pattern] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context - -File "w53.ml", line 73, characters 14-23: -73 | type t2 [@@@immediate] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context - -File "w53.ml", line 75, characters 14-25: -75 | type t4 [@@@immediate64] (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context - -File "w53.ml", line 79, characters 15-24: -79 | let x = (4 [@immediate], 42 [@immediate64]) (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context - -File "w53.ml", line 79, characters 32-43: -79 | let x = (4 [@immediate], 42 [@immediate64]) (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context - -File "w53.ml", line 84, characters 26-31: -84 | type t2 = {x : int} [@@@boxed] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context - -File "w53.ml", line 86, characters 26-33: -86 | type t4 = {x : int} [@@@unboxed] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context - -File "w53.ml", line 87, characters 17-24: -87 | val x : int [@@unboxed] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context - -File "w53.ml", line 91, characters 15-22: -91 | let x = (5 [@unboxed], 42 [@boxed]) (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context - -File "w53.ml", line 91, characters 30-35: -91 | let x = (5 [@unboxed], 42 [@boxed]) (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context - -File "w53.ml", line 95, characters 21-30: -95 | type 'a t1 = 'a [@@principal] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "principal" attribute cannot appear in this context - -File "w53.ml", line 96, characters 21-32: -96 | type 'a t2 = 'a [@@noprincipal] (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "noprincipal" attribute cannot appear in this context - -File "w53.ml", line 98, characters 19-28: -98 | type s1 = Foo1 [@principal] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "principal" attribute cannot appear in this context - -File "w53.ml", line 99, characters 19-30: -99 | type s2 = Foo2 [@noprincipal] (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "noprincipal" attribute cannot appear in this context - -File "w53.ml", line 101, characters 16-25: -101 | val x : int [@principal] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "principal" attribute cannot appear in this context - -File "w53.ml", line 102, characters 16-27: -102 | val y : int [@noprincipal] (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "noprincipal" attribute cannot appear in this context - -File "w53.ml", line 109, characters 21-30: -109 | type 'a t1 = 'a [@@principal] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "principal" attribute cannot appear in this context - -File "w53.ml", line 110, characters 21-32: -110 | type 'a t2 = 'a [@@noprincipal] (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "noprincipal" attribute cannot appear in this context - -File "w53.ml", line 112, characters 19-28: -112 | type s1 = Foo1 [@principal] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "principal" attribute cannot appear in this context - -File "w53.ml", line 113, characters 19-30: -113 | type s2 = Foo2 [@noprincipal] (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "noprincipal" attribute cannot appear in this context - -File "w53.ml", line 115, characters 14-23: -115 | let x = 5 [@principal] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "principal" attribute cannot appear in this context - -File "w53.ml", line 116, characters 15-26: -116 | let y = 42 [@noprincipal] (* rejected *) - ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "noprincipal" attribute cannot appear in this context - -File "w53.ml", line 123, characters 21-29: -123 | type 'a t1 = 'a [@@nolabels] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "nolabels" attribute cannot appear in this context - -File "w53.ml", line 125, characters 19-27: -125 | type s1 = Foo1 [@nolabels] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "nolabels" attribute cannot appear in this context - -File "w53.ml", line 127, characters 16-24: -127 | val x : int [@nolabels] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "nolabels" attribute cannot appear in this context - -File "w53.ml", line 133, characters 21-29: -133 | type 'a t1 = 'a [@@nolabels] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "nolabels" attribute cannot appear in this context - -File "w53.ml", line 135, characters 19-27: -135 | type s1 = Foo1 [@nolabels] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "nolabels" attribute cannot appear in this context - -File "w53.ml", line 137, characters 14-22: -137 | let x = 5 [@nolabels] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "nolabels" attribute cannot appear in this context - -File "w53.ml", line 143, characters 21-31: -143 | type 'a t1 = 'a [@@flambda_o3] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_o3" attribute cannot appear in this context - -File "w53.ml", line 144, characters 21-37: -144 | type 'a t2 = 'a [@@flambda_oclassic] (* rejected *) - ^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_oclassic" attribute cannot appear in this context - -File "w53.ml", line 146, characters 19-29: -146 | type s1 = Foo1 [@flambda_o3] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_o3" attribute cannot appear in this context - -File "w53.ml", line 147, characters 19-35: -147 | type s2 = Foo2 [@flambda_oclassic] (* rejected *) - ^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_oclassic" attribute cannot appear in this context - -File "w53.ml", line 149, characters 16-26: -149 | val x : int [@flambda_o3] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_o3" attribute cannot appear in this context - -File "w53.ml", line 150, characters 16-32: -150 | val y : int [@flambda_oclassic] (* rejected *) - ^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_oclassic" attribute cannot appear in this context - -File "w53.ml", line 152, characters 6-16: -152 | [@@@flambda_o3] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_o3" attribute cannot appear in this context - -File "w53.ml", line 153, characters 6-22: -153 | [@@@flambda_oclassic] (* rejected *) - ^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_oclassic" attribute cannot appear in this context - -File "w53.ml", line 157, characters 21-31: -157 | type 'a t1 = 'a [@@flambda_o3] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_o3" attribute cannot appear in this context - -File "w53.ml", line 158, characters 21-37: -158 | type 'a t2 = 'a [@@flambda_oclassic] (* rejected *) - ^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_oclassic" attribute cannot appear in this context - -File "w53.ml", line 160, characters 19-29: -160 | type s1 = Foo1 [@flambda_o3] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_o3" attribute cannot appear in this context - -File "w53.ml", line 161, characters 19-35: -161 | type s2 = Foo2 [@flambda_oclassic] (* rejected *) - ^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_oclassic" attribute cannot appear in this context - -File "w53.ml", line 163, characters 14-24: -163 | let x = 5 [@flambda_o3] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_o3" attribute cannot appear in this context - -File "w53.ml", line 164, characters 15-31: -164 | let y = 42 [@flambda_oclassic] (* rejected *) - ^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "flambda_oclassic" attribute cannot appear in this context - -File "w53.ml", line 171, characters 21-35: -171 | type 'a t1 = 'a [@@afl_inst_ratio 42] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "afl_inst_ratio" attribute cannot appear in this context - -File "w53.ml", line 173, characters 19-33: -173 | type s1 = Foo1 [@afl_inst_ratio 42] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "afl_inst_ratio" attribute cannot appear in this context - -File "w53.ml", line 175, characters 16-30: -175 | val x : int [@afl_inst_ratio 42] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "afl_inst_ratio" attribute cannot appear in this context - -File "w53.ml", line 177, characters 6-20: -177 | [@@@afl_inst_ratio 42] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "afl_inst_ratio" attribute cannot appear in this context - -File "w53.ml", line 181, characters 21-35: -181 | type 'a t1 = 'a [@@afl_inst_ratio 42] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "afl_inst_ratio" attribute cannot appear in this context - -File "w53.ml", line 183, characters 19-33: -183 | type s1 = Foo1 [@afl_inst_ratio 42] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "afl_inst_ratio" attribute cannot appear in this context - -File "w53.ml", line 185, characters 14-28: -185 | let x = 5 [@afl_inst_ratio 42] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "afl_inst_ratio" attribute cannot appear in this context - -File "w53.ml", line 192, characters 21-26: -192 | type 'a t1 = 'a [@@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 194, characters 19-24: -194 | type s1 = Foo1 [@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 196, characters 16-21: -196 | val x : int [@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 198, characters 6-11: -198 | [@@@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 202, characters 21-26: -202 | type 'a t1 = 'a [@@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 204, characters 19-24: -204 | type s1 = Foo1 [@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 206, characters 14-19: -206 | let x = 5 [@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 208, characters 6-11: -208 | [@@@curry 42] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "curry" attribute cannot appear in this context - -File "w53.ml", line 212, characters 21-30: -212 | type 'a t1 = 'a [@@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 213, characters 19-28: -213 | type s1 = Foo1 [@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 214, characters 19-28: -214 | val x : int64 [@@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 217, characters 39-48: -217 | external z : int64 -> int64 = "x" [@@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 221, characters 21-30: -221 | type 'a t1 = 'a [@@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 222, characters 19-28: -222 | type s1 = Foo1 [@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 223, characters 25-34: -223 | let x : int64 = 42L [@@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 226, characters 39-48: -226 | external z : int64 -> int64 = "x" [@@local_opt] (* rejected *) - ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "local_opt" attribute cannot appear in this context - -File "w53.ml", line 230, characters 20-25: -230 | type 'a t1 = 'a [@local] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context - -File "w53.ml", line 231, characters 21-27: -231 | type 'a t1' = 'a [@global] (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context - -File "w53.ml", line 233, characters 24-29: -233 | type t2 = { x : int [@local] } (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context - -File "w53.ml", line 236, characters 27-32: -236 | val x : 'a list -> ('a [@local]) list (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context - -File "w53.ml", line 237, characters 28-34: -237 | val x' : 'a list -> ('a [@global]) list (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context - -File "w53.ml", line 240, characters 33-39: -240 | val y' : 'a -> f:(('a -> 'b) [@global]) -> 'b (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context - -File "w53.ml", line 242, characters 16-21: -242 | val z : 'a [@@local] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context - -File "w53.ml", line 243, characters 17-23: -243 | val z' : 'a [@@global] (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context - -File "w53.ml", line 245, characters 17-22: -245 | val w : 'a [@@@local] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context - -File "w53.ml", line 246, characters 18-24: -246 | val w' : 'a [@@@global] (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context - -File "w53.ml", line 250, characters 20-25: -250 | type 'a t1 = 'a [@local] (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context - -File "w53.ml", line 251, characters 21-27: -251 | type 'a t1' = 'a [@global] (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context - -File "w53.ml", line 253, characters 24-29: -253 | type t2 = { x : int [@local] } (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "local" attribute cannot appear in this context - -File "w53.ml", line 257, characters 13-19: -257 | let g (a [@global]) = a (* rejected *) - ^^^^^^ -Warning 53 [misplaced-attribute]: the "global" attribute cannot appear in this context - -File "w53.ml", line 262, characters 20-24: -262 | type 'a t1 = 'a [@tail] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 263, characters 21-28: -263 | type 'a t1' = 'a [@nontail] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 265, characters 24-28: -265 | type t2 = { x : int [@tail] } (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 266, characters 25-32: -266 | type t2' = { x : int [@nontail] } (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 268, characters 32-36: -268 | val y : 'a -> f:(('a -> 'b) [@tail]) -> 'b (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 269, characters 33-40: -269 | val y' : 'a -> f:(('a -> 'b) [@nontail]) -> 'b (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 271, characters 16-20: -271 | val z : 'a [@@tail] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 272, characters 17-24: -272 | val z' : 'a [@@nontail] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 274, characters 6-10: -274 | [@@@tail] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 275, characters 6-13: -275 | [@@@nontail] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 279, characters 13-17: -279 | let f (a [@tail]) = a (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 280, characters 14-21: -280 | let f' (a [@nontail]) = a (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 282, characters 8-12: -282 | let [@tail] g a = a (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 283, characters 8-15: -283 | let [@nontail] g' a = a (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 285, characters 16-20: -285 | let h a = a [@tail] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "tail" attribute cannot appear in this context - -File "w53.ml", line 286, characters 17-24: -286 | let h' a = a [@nontail] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "nontail" attribute cannot appear in this context - -File "w53.ml", line 293, characters 21-28: -293 | type 'a t1 = 'a [@@noalloc] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 294, characters 19-26: -294 | type s1 = Foo1 [@noalloc] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 295, characters 19-26: -295 | val x : int64 [@@noalloc] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 297, characters 24-31: -297 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 297, characters 46-53: -297 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 302, characters 21-28: -302 | type 'a t1 = 'a [@@noalloc] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 303, characters 19-26: -303 | type s1 = Foo1 [@noalloc] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 304, characters 25-32: -304 | let x : int64 = 42L [@@noalloc] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 306, characters 24-31: -306 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 306, characters 46-53: -306 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context - -File "w53.ml", line 311, characters 21-29: -311 | type 'a t1 = 'a [@@untagged] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context - -File "w53.ml", line 312, characters 19-27: -312 | type s1 = Foo1 [@untagged] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context - -File "w53.ml", line 313, characters 17-25: -313 | val x : int [@@untagged] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context - -File "w53.ml", line 320, characters 21-29: -320 | type 'a t1 = 'a [@@untagged] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context - -File "w53.ml", line 321, characters 19-27: -321 | type s1 = Foo1 [@untagged] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context - -File "w53.ml", line 322, characters 22-30: -322 | let x : int = 42 [@@untagged] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context - -File "w53.ml", line 329, characters 21-25: -329 | type 'a t1 = 'a [@@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 330, characters 19-23: -330 | type s1 = Foo1 [@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 331, characters 19-23: -331 | val x : int64 [@@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 333, characters 24-28: -333 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 333, characters 49-53: -333 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 335, characters 39-43: -335 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 339, characters 21-25: -339 | type 'a t1 = 'a [@@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 340, characters 19-23: -340 | type s1 = Foo1 [@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 341, characters 25-29: -341 | let x : int64 = 42L [@@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 344, characters 24-28: -344 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 344, characters 49-53: -344 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 346, characters 39-43: -346 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) - ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context - -File "w53.ml", line 356, characters 17-22: -356 | let f2 = fun [@boxed] (type a) (x : a) -> x (* rejected *) - ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context - -File "w53.ml", line 360, characters 21-28: -360 | type 'a t1 = 'a [@@builtin] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 361, characters 19-26: -361 | type s1 = Foo1 [@builtin] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 362, characters 17-24: -362 | val x : int [@@builtin] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 364, characters 22-29: -364 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 364, characters 42-49: -364 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 369, characters 21-28: -369 | type 'a t1 = 'a [@@builtin] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 370, characters 19-26: -370 | type s1 = Foo1 [@builtin] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 371, characters 22-29: -371 | let x : int = 42 [@@builtin] (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 373, characters 22-29: -373 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 373, characters 42-49: -373 | external y : (int [@builtin]) -> (int [@builtin]) = "x" "y" (* rejected *) - ^^^^^^^ -Warning 53 [misplaced-attribute]: the "builtin" attribute cannot appear in this context - -File "w53.ml", line 378, characters 21-31: -378 | type 'a t1 = 'a [@@no_effects] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 379, characters 19-29: -379 | type s1 = Foo1 [@no_effects] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 380, characters 17-27: -380 | val x : int [@@no_effects] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 382, characters 22-32: -382 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 382, characters 45-55: -382 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 387, characters 21-31: -387 | type 'a t1 = 'a [@@no_effects] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 388, characters 19-29: -388 | type s1 = Foo1 [@no_effects] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 389, characters 22-32: -389 | let x : int = 42 [@@no_effects] (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 391, characters 22-32: -391 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 391, characters 45-55: -391 | external y : (int [@no_effects]) -> (int [@no_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_effects" attribute cannot appear in this context - -File "w53.ml", line 396, characters 21-33: -396 | type 'a t1 = 'a [@@no_coeffects] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 397, characters 19-31: -397 | type s1 = Foo1 [@no_coeffects] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 398, characters 17-29: -398 | val x : int [@@no_coeffects] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 400, characters 22-34: -400 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 400, characters 47-59: -400 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 405, characters 21-33: -405 | type 'a t1 = 'a [@@no_coeffects] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 406, characters 19-31: -406 | type s1 = Foo1 [@no_coeffects] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 407, characters 22-34: -407 | let x : int = 42 [@@no_coeffects] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 409, characters 22-34: -409 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 409, characters 47-59: -409 | external y : (int [@no_coeffects]) -> (int [@no_coeffects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "no_coeffects" attribute cannot appear in this context - -File "w53.ml", line 414, characters 21-44: -414 | type 'a t1 = 'a [@@only_generative_effects] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 415, characters 19-42: -415 | type s1 = Foo1 [@only_generative_effects] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 416, characters 17-40: -416 | val x : int [@@only_generative_effects] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 418, characters 22-45: -418 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 418, characters 58-81: -418 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 423, characters 21-44: -423 | type 'a t1 = 'a [@@only_generative_effects] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 424, characters 19-42: -424 | type s1 = Foo1 [@only_generative_effects] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 425, characters 22-45: -425 | let x : int = 42 [@@only_generative_effects] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 427, characters 22-45: -427 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context - -File "w53.ml", line 427, characters 58-81: -427 | external y : (int [@only_generative_effects]) -> (int [@only_generative_effects]) = "x" "y" (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "only_generative_effects" attribute cannot appear in this context diff --git a/testsuite/tests/warnings/w53_marshalled.ml b/testsuite/tests/warnings/w53_marshalled.ml index 29c3e9fd14e..7d41ea60fd2 100644 --- a/testsuite/tests/warnings/w53_marshalled.ml +++ b/testsuite/tests/warnings/w53_marshalled.ml @@ -1,16 +1,48 @@ -(* TEST -readonly_files = "marshall_for_w53.ml w53.ml" -include ocamlcommon -* setup-ocamlc.byte-build-env -** ocamlc.byte -program = "${test_build_directory}/marshall_for_w53.exe" -all_modules = "marshall_for_w53.ml" -*** run -**** ocamlc.byte -module = "w53.marshalled.ml" -***** check-ocamlc.byte-output +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + + + + + + *) (* This tests that warning 53 happen appropriately when dealing with marshalled ASTs. It does that by marshalling `w53.ml` to disk and then passing the marshalled ast to the compiler. *) + +(* TEST + readonly_files = "marshall_for_w53.ml w53.ml w53_zero_alloc_all.ml"; + include ocamlcommon; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/marshall_for_w53.exe"; + all_modules = "marshall_for_w53.ml"; + ocamlc.byte; + run; + { + flags = "-w +A-60-70"; + module = "w53.marshalled.ml"; + compiler_reference = "${test_source_directory}/w53.compilers.reference"; + ocamlc.byte; + check-ocamlc.byte-output; + }{ + setup-ocamlc.byte-build-env; + flags = "-w +A-60-70"; + module = "w53_zero_alloc_all.marshalled.ml"; + compiler_reference = "${test_source_directory}/w53_zero_alloc_all.compilers.reference"; + ocamlc.byte; + check-ocamlc.byte-output; + } +*) diff --git a/testsuite/tests/warnings/w53_mli.mli b/testsuite/tests/warnings/w53_mli.mli index 6826e66b58d..c91731411dc 100644 --- a/testsuite/tests/warnings/w53_mli.mli +++ b/testsuite/tests/warnings/w53_mli.mli @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-60-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -14,3 +14,11 @@ compile_only = "true" val a1 : int [@deprecated] (* rejected *) val a2 : int [@@deprecated] (* accepted *) + +(* TEST + flags = "-w +A-60-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w53_with_ppx.ml b/testsuite/tests/warnings/w53_with_ppx.ml index 1fe38decee2..a880130d23f 100644 --- a/testsuite/tests/warnings/w53_with_ppx.ml +++ b/testsuite/tests/warnings/w53_with_ppx.ml @@ -1,14 +1,14 @@ (* TEST -readonly_files = "w53_ppx.ml" -include ocamlcommon -* setup-ocamlc.byte-build-env -** ocamlc.byte -program = "${test_build_directory}/w53_ppx.exe" -all_modules = "w53_ppx.ml" -*** ocamlc.byte -module = "w53_with_ppx.ml" -flags = "-ppx ${program}" -**** check-ocamlc.byte-output + readonly_files = "w53_ppx.ml"; + include ocamlcommon; + setup-ocamlc.byte-build-env; + program = "${test_build_directory}/w53_ppx.exe"; + all_modules = "w53_ppx.ml"; + ocamlc.byte; + module = "w53_with_ppx.ml"; + flags = "-ppx ${program}"; + ocamlc.byte; + check-ocamlc.byte-output; *) (* This test checks that compiler-builtin attributes inserted by a ppx still diff --git a/testsuite/tests/warnings/w53_zero_alloc_all.compilers.reference b/testsuite/tests/warnings/w53_zero_alloc_all.compilers.reference new file mode 100644 index 00000000000..237da00852f --- /dev/null +++ b/testsuite/tests/warnings/w53_zero_alloc_all.compilers.reference @@ -0,0 +1,129 @@ +File "w53_zero_alloc_all.ml", line 19, characters 21-31: +19 | type 'a t1 = 'a [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 20, characters 19-29: +20 | type s1 = Foo1 [@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 23, characters 22-32: +23 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 23, characters 45-55: +23 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 24, characters 39-49: +24 | external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 25, characters 12-22: +25 | external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 27, characters 9-19: +27 | class[@zero_alloc] c : (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 29, characters 11-21: +29 | val[@zero_alloc] foo : int * int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 30, characters 11-21: +30 | val[@zero_alloc] bar : int -> int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 31, characters 14-24: +31 | method[@zero_alloc] baz : int * int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 32, characters 14-24: +32 | method[@zero_alloc] boz : int -> int (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 37, characters 21-31: +37 | type 'a t1 = 'a [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 38, characters 19-29: +38 | type s1 = Foo1 [@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 39, characters 22-32: +39 | let x : int = 42 [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 41, characters 7-17: +41 | let[@zero_alloc] w = 42 (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 45, characters 22-32: +45 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 45, characters 45-55: +45 | external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 46, characters 39-49: +46 | external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 47, characters 12-22: +47 | external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 49, characters 9-19: +49 | class[@zero_alloc] foo _y = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 51, characters 10-20: +51 | (fun[@zero_alloc] z -> (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 53, characters 11-21: +53 | val[@zero_alloc] bar = (4, 5) (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 55, characters 14-24: +55 | method[@zero_alloc] baz x = (f (z+10), x+1) (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 67, characters 14-24: +67 | ((boz x)[@zero_alloc assume]) (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 72, characters 7-17: +72 | let[@zero_alloc assume] foo = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context + +File "w53_zero_alloc_all.ml", line 76, characters 7-17: +76 | let[@zero_alloc] bar = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "zero_alloc" attribute cannot appear in this context diff --git a/testsuite/tests/warnings/w53_zero_alloc_all.ml b/testsuite/tests/warnings/w53_zero_alloc_all.ml new file mode 100644 index 00000000000..84e49a4a6e3 --- /dev/null +++ b/testsuite/tests/warnings/w53_zero_alloc_all.ml @@ -0,0 +1,87 @@ +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + +*) + +(* [@@@zero_alloc all] affects the meaning of other zero_alloc attributes. This + test, which is a copy of the zero_alloc bits of the main w53.ml, shows that + it doesn't affect their w53 behavior. *) + +[@@@zero_alloc all] + +module type TestZeroAllocSig = sig + type 'a t1 = 'a [@@zero_alloc] (* rejected *) + type s1 = Foo1 [@zero_alloc] (* rejected *) + val f : int -> int [@@zero_alloc] (* accepted *) + + external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + + class[@zero_alloc] c : (* rejected *) + object + val[@zero_alloc] foo : int * int (* rejected *) + val[@zero_alloc] bar : int -> int (* rejected *) + method[@zero_alloc] baz : int * int (* rejected *) + method[@zero_alloc] boz : int -> int (* rejected *) + end +end + +module TestZeroAllocStruct = struct + type 'a t1 = 'a [@@zero_alloc] (* rejected *) + type s1 = Foo1 [@zero_alloc] (* rejected *) + let x : int = 42 [@@zero_alloc] (* rejected *) + + let[@zero_alloc] w = 42 (* rejected *) + + let[@zero_alloc] f x = x (* accepted *) + + external y : (int [@zero_alloc]) -> (int [@zero_alloc]) = "x" (* rejected *) + external z : int -> int = "x" "y" [@@zero_alloc] (* rejected *) + external[@zero_alloc] q : int -> int = "x" "y" (* rejected *) + + class[@zero_alloc] foo _y = (* rejected *) + let[@inline never][@zero_alloc] f x = (x, x) in (* accepted *) + (fun[@zero_alloc] z -> (* rejected *) + object + val[@zero_alloc] bar = (4, 5) (* rejected *) + + method[@zero_alloc] baz x = (f (z+10), x+1) (* rejected *) + end) + + let[@zero_alloc] f1 = fun x y -> (x,y) (* accepted *) + let f2 = fun [@zero_alloc] x y -> (x,y) (* accepted *) + + let[@zero_alloc ignore] f3 = fun x y -> (x,y) (* accepted *) + let f4 = fun [@zero_alloc ignore] x y -> (x,y) (* accepted *) + + (* assume on calls goes on the function being called *) + let[@inline never] boz x = (x,x) + let[@zero_alloc] fiz x = + ((boz x)[@zero_alloc assume]) (* rejected *) + let[@zero_alloc] fuz x = + ((boz[@zero_alloc assume]) x) (* accepted *) + + (* Triggers w53 on non-function lets *) + let[@zero_alloc assume] foo = (* rejected *) + let x = 42 in + fun z -> z + x + + let[@zero_alloc] bar = (* rejected *) + let x = 42 in + fun z -> z + x +end + +(* TEST + flags = "-w +A-60-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w54.ml b/testsuite/tests/warnings/w54.ml index e9f29cb3e2a..80f3b2604c6 100644 --- a/testsuite/tests/warnings/w54.ml +++ b/testsuite/tests/warnings/w54.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-70" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -17,3 +17,11 @@ let h x = (g [@inlined] [@ocaml.inlined never]) x let v = ((fun x -> x) [@inline] [@inlined]) 1 (* accepted *) let i = ((fun x -> x) [@inline]) [@@inline] + +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w55.flambda.reference b/testsuite/tests/warnings/w55.flambda.reference index 72ef246453b..0dd30e1442c 100644 --- a/testsuite/tests/warnings/w55.flambda.reference +++ b/testsuite/tests/warnings/w55.flambda.reference @@ -1,12 +1,11 @@ -File "w55.ml", line 33, characters 10-26: -33 | let h x = (j [@inlined]) x +File "w55.ml", line 35, characters 10-26: +35 | let h x = (j [@inlined]) x ^^^^^^^^^^^^^^^^ Warning 55 [inlining-impossible]: Cannot inline: [@inlined] attributes may not be used on partial applications -File "w55.ml", line 39, characters 12-30: -39 | let b x y = (a [@inlined]) x y - ^^^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: [@inlined] attribute was not used on this function application (the optimizer did not know what function was being applied) -File "w55.ml", line 29, characters 10-27: -29 | let i x = (!r [@inlined]) x + +File "w55.ml", line 31, characters 10-27: +31 | let i x = (!r [@inlined]) x ^^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: [@inlined] attribute was not used on this function application (the optimizer did not know what function was being applied) +Warning 55 [inlining-impossible]: Cannot inline: + the optimizer did not know what function was being applied + (the full inlining stack was: w55.ml:31,10--27) diff --git a/testsuite/tests/warnings/w55.ml b/testsuite/tests/warnings/w55.ml index d597d466878..05c108ffc7c 100644 --- a/testsuite/tests/warnings/w55.ml +++ b/testsuite/tests/warnings/w55.ml @@ -1,25 +1,27 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + + + + + + + + + + -flags = "-w +A-70" -compile_only = "true" -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output -* no-flambda -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -**** check-ocamlopt.byte-output -* flambda -compiler_reference = "${test_source_directory}/w55.flambda.reference" -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -**** check-ocamlopt.byte-output *) +[@@@ocaml.flambda_o3] + let f = (fun x -> x + 1) [@inline never] let g x = (f [@inlined]) x @@ -50,3 +52,24 @@ let h' x = (j [@inlined hint]) x let b' x y = (a [@inlined hint]) x y let d' x = (c [@inlined hint]) x + +(* TEST + flags = "-w +A-70"; + compile_only = "true"; + { + setup-ocamlc.byte-build-env; + ocamlc.byte; + check-ocamlc.byte-output; + }{ + no-flambda; + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + check-ocamlopt.byte-output; + }{ + compiler_reference = "${test_source_directory}/w55.flambda.reference"; + flambda; + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + check-ocamlopt.byte-output; + } +*) diff --git a/testsuite/tests/warnings/w55.native.reference b/testsuite/tests/warnings/w55.native.reference index 63f7fd7a91b..49a11637d9a 100644 --- a/testsuite/tests/warnings/w55.native.reference +++ b/testsuite/tests/warnings/w55.native.reference @@ -1,29 +1,29 @@ -File "w55.ml", line 25, characters 10-26: -25 | let g x = (f [@inlined]) x +File "w55.ml", line 27, characters 10-26: +27 | let g x = (f [@inlined]) x ^^^^^^^^^^^^^^^^ Warning 55 [inlining-impossible]: Cannot inline: Function information unavailable -File "w55.ml", line 29, characters 10-27: -29 | let i x = (!r [@inlined]) x +File "w55.ml", line 31, characters 10-27: +31 | let i x = (!r [@inlined]) x ^^^^^^^^^^^^^^^^^ Warning 55 [inlining-impossible]: Cannot inline: Unknown function -File "w55.ml", line 33, characters 10-26: -33 | let h x = (j [@inlined]) x +File "w55.ml", line 35, characters 10-26: +35 | let h x = (j [@inlined]) x ^^^^^^^^^^^^^^^^ Warning 55 [inlining-impossible]: Cannot inline: Partial application -File "w55.ml", line 39, characters 12-30: -39 | let b x y = (a [@inlined]) x y +File "w55.ml", line 41, characters 12-30: +41 | let b x y = (a [@inlined]) x y ^^^^^^^^^^^^^^^^^^ Warning 55 [inlining-impossible]: Cannot inline: Over-application -File "w55.ml", line 39, characters 12-30: -39 | let b x y = (a [@inlined]) x y +File "w55.ml", line 41, characters 12-30: +41 | let b x y = (a [@inlined]) x y ^^^^^^^^^^^^^^^^^^ Warning 55 [inlining-impossible]: Cannot inline: Function information unavailable -File "w55.ml", line 42, characters 10-26: -42 | let d x = (c [@inlined]) x +File "w55.ml", line 44, characters 10-26: +44 | let d x = (c [@inlined]) x ^^^^^^^^^^^^^^^^ Warning 55 [inlining-impossible]: Cannot inline: Function information unavailable diff --git a/testsuite/tests/warnings/w58.ml b/testsuite/tests/warnings/w58.ml index cb8ab6194ec..401ddf12c82 100644 --- a/testsuite/tests/warnings/w58.ml +++ b/testsuite/tests/warnings/w58.ml @@ -1,22 +1,21 @@ (* TEST - -flags = "-w +A-70" -readonly_files = "module_without_cmx.mli" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -module = "module_without_cmx.mli" -*** ocamlc.byte -module = "w58.ml" -**** check-ocamlc.byte-output - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -module = "module_without_cmx.mli" -*** ocamlopt.byte -module = "w58.ml" -**** check-ocamlopt.byte-output - + flags = "-w +A-70"; + readonly_files = "module_without_cmx.mli"; + { + setup-ocamlc.byte-build-env; + module = "module_without_cmx.mli"; + ocamlc.byte; + module = "w58.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + }{ + setup-ocamlopt.byte-build-env; + module = "module_without_cmx.mli"; + ocamlopt.byte; + module = "w58.ml"; + ocamlopt.byte; + check-ocamlopt.byte-output; + } *) let () = print_endline (Module_without_cmx.id "Hello World") diff --git a/testsuite/tests/warnings/w59.flambda.reference b/testsuite/tests/warnings/w59.flambda.reference deleted file mode 100644 index 25868419ff0..00000000000 --- a/testsuite/tests/warnings/w59.flambda.reference +++ /dev/null @@ -1,30 +0,0 @@ -File "w59.ml", line 51, characters 2-39: -51 | set_field (Obj.repr o) 0 (Obj.repr 3); - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. -File "w59.ml", line 52, characters 2-39: -52 | set_field (Obj.repr p) 0 (Obj.repr 3); - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. -File "w59.ml", line 53, characters 2-39: -53 | set_field (Obj.repr q) 0 (Obj.repr 3); - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. -File "w59.ml", line 54, characters 2-39: -54 | set_field (Obj.repr r) 0 (Obj.repr 3) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. -File "w59.ml", line 61, characters 2-7: -61 | set o - ^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. diff --git a/testsuite/tests/warnings/w59.ml b/testsuite/tests/warnings/w59.ml deleted file mode 100644 index 0ad01218c1f..00000000000 --- a/testsuite/tests/warnings/w59.ml +++ /dev/null @@ -1,71 +0,0 @@ -(* TEST - -flags = "-w +A-70" -compile_only = "true" - -* setup-ocamlc.byte-build-env -** ocamlc.byte -*** check-ocamlc.byte-output - -* no-flambda -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -**** check-ocamlopt.byte-output - -* flambda -compiler_reference = "${test_source_directory}/w59.flambda.reference" -flags = "-w +A-70 -dflambda-invariants" -** setup-ocamlopt.byte-build-env -*** ocamlopt.byte -**** check-ocamlopt.byte-output - -*) - -(* Check that the warning 59 (assignment to immutable value) does not - trigger on those examples *) -let a = Lazy.force (lazy "a") -let b = Lazy.force (lazy 1) -let c = Lazy.force (lazy 3.14) -let d = Lazy.force (lazy 'a') -let e = Lazy.force (lazy (fun x -> x+1)) -let rec f (x:int) : int = g x and g x = f x -let h = Lazy.force (lazy f) -let i = Lazy.force (lazy g) -let j = Lazy.force (lazy 1L) -let k = Lazy.force (lazy (1,2)) -let l = Lazy.force (lazy [|3.14|]) -let m = Lazy.force (lazy (Sys.opaque_identity 3.14)) -let n = Lazy.force (lazy None) - -(* Check that obviously wrong code is reported *) -let o = (1,2) -let p = fun x -> x -let q = 3.14 -let r = 1 - -(* %obj_set_field is OK here for Flambda 2 because we never use - it on an array. We can't use Obj.field since that function - contains a [Sys.opaque_identity]. *) -external set_field : Obj.t -> int -> Obj.t -> unit = "%obj_set_field" - -let () = - set_field (Obj.repr o) 0 (Obj.repr 3); - set_field (Obj.repr p) 0 (Obj.repr 3); - set_field (Obj.repr q) 0 (Obj.repr 3); - set_field (Obj.repr r) 0 (Obj.repr 3) - -let set v = - set_field (Obj.repr v) 0 (Obj.repr 3) - [@@inline] - -let () = - set o - -(* Sys.opaque_identity hides all information and shouldn't warn *) - -let opaque = Sys.opaque_identity (1,2) -let set_opaque = - set_field - (Obj.repr opaque) - 0 - (Obj.repr 3) diff --git a/testsuite/tests/warnings/w60.ml b/testsuite/tests/warnings/w60.ml index 8e3108d7033..10e64886938 100644 --- a/testsuite/tests/warnings/w60.ml +++ b/testsuite/tests/warnings/w60.ml @@ -1,11 +1,11 @@ -(* TEST +(* TEST_BELOW +(* Blank lines added here to preserve locations. *) + + + + -flags = "-w +A-67" -* setup-ocamlc.byte-build-env -** ocamlc.byte -compile_only = "true" -*** check-ocamlc.byte-output *) @@ -57,3 +57,11 @@ module Nominal = struct module N = F(M) end + +(* TEST + flags = "-w +A-67"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) diff --git a/testsuite/tests/warnings/w68.compilers.reference b/testsuite/tests/warnings/w68.compilers.reference deleted file mode 100644 index e46c213fc03..00000000000 --- a/testsuite/tests/warnings/w68.compilers.reference +++ /dev/null @@ -1,18 +0,0 @@ -File "w68.ml", line 34, characters 33-43: -34 | let dont_warn_with_partial_match None x = x - ^^^^^^^^^^ -Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some _ - -File "w68.ml", line 14, characters 10-13: -14 | let alloc {a} b = a + b - ^^^ -Warning 68 [match-on-mutable-state-prevent-uncurry]: This pattern depends on mutable state. -It prevents the remaining arguments from being uncurried, which will cause additional closure allocations. - -File "w68.ml", line 39, characters 25-28: -39 | let do_warn_when_enabled {a} b = a + b - ^^^ -Warning 68 [match-on-mutable-state-prevent-uncurry]: This pattern depends on mutable state. -It prevents the remaining arguments from being uncurried, which will cause additional closure allocations. diff --git a/testsuite/tests/warnings/w68.ml b/testsuite/tests/warnings/w68.ml deleted file mode 100644 index 71ca09516bd..00000000000 --- a/testsuite/tests/warnings/w68.ml +++ /dev/null @@ -1,41 +0,0 @@ -(* TEST - -flags = "-w +A-70" - -* setup-ocamlopt.byte-build-env -** ocamlopt.byte -*** check-ocamlopt.byte-output -**** run -***** check-program-output -*) - -type a = { mutable a : int } - -let alloc {a} b = a + b - -let noalloc b {a} = b + a - -let measure name f = - let a = {a = 1} in - let b = 2 in - let before = Gc.minor_words () in - let (_ : int) = f ~a ~b in - let after = Gc.minor_words () in - let alloc = int_of_float (after -. before) in - match alloc with - | 0 -> Printf.printf "%S doesn't allocate\n" name - | _ -> Printf.printf "%S allocates\n" name - -let () = - measure "noalloc" (fun ~a ~b -> noalloc b a); - measure "alloc" (fun ~a ~b -> alloc a b) - - -let dont_warn_with_partial_match None x = x - -let dont_warn_when_disabled {a} b = a + b -[@@warning "-68"] - -let do_warn_when_enabled {a} b = a + b -[@@warning "+68"] - diff --git a/testsuite/tests/warnings/w68.reference b/testsuite/tests/warnings/w68.reference deleted file mode 100644 index 1e8a8cca45f..00000000000 --- a/testsuite/tests/warnings/w68.reference +++ /dev/null @@ -1,2 +0,0 @@ -"noalloc" doesn't allocate -"alloc" allocates diff --git a/testsuite/tests/weak-ephe-final/ephetest.ml b/testsuite/tests/weak-ephe-final/ephetest.ml index 2835ab8b7a0..c246d647ef3 100644 --- a/testsuite/tests/weak-ephe-final/ephetest.ml +++ b/testsuite/tests/weak-ephe-final/ephetest.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let debug = false diff --git a/testsuite/tests/weak-ephe-final/ephetest2.ml b/testsuite/tests/weak-ephe-final/ephetest2.ml index 806f5feaf2a..57178b723d5 100644 --- a/testsuite/tests/weak-ephe-final/ephetest2.ml +++ b/testsuite/tests/weak-ephe-final/ephetest2.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (*** This test evaluate boolean formula composed by conjunction and diff --git a/testsuite/tests/weak-ephe-final/ephetest3.ml b/testsuite/tests/weak-ephe-final/ephetest3.ml index 541910c91a8..012563c5e6b 100644 --- a/testsuite/tests/weak-ephe-final/ephetest3.ml +++ b/testsuite/tests/weak-ephe-final/ephetest3.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) (** This test weak table by application to the memoization of collatz (also known as syracuse) algorithm suite computation *) diff --git a/testsuite/tests/weak-ephe-final/ephetest_par.ml b/testsuite/tests/weak-ephe-final/ephetest_par.ml index 432122732db..2eff91f62d8 100644 --- a/testsuite/tests/weak-ephe-final/ephetest_par.ml +++ b/testsuite/tests/weak-ephe-final/ephetest_par.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* Due to GCs running at non-deterministic places, the output from these tests diff --git a/testsuite/tests/weak-ephe-final/finaliser.ml b/testsuite/tests/weak-ephe-final/finaliser.ml index 68cb7b26627..b4e63794e46 100644 --- a/testsuite/tests/weak-ephe-final/finaliser.ml +++ b/testsuite/tests/weak-ephe-final/finaliser.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let m = 1000 let m' = 100 diff --git a/testsuite/tests/weak-ephe-final/finaliser2.ml b/testsuite/tests/weak-ephe-final/finaliser2.ml index 4c017e04d3f..4a4dc3e0fa8 100644 --- a/testsuite/tests/weak-ephe-final/finaliser2.ml +++ b/testsuite/tests/weak-ephe-final/finaliser2.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) let () = Out_channel.set_buffered stdout false diff --git a/testsuite/tests/weak-ephe-final/finaliser_handover.ml b/testsuite/tests/weak-ephe-final/finaliser_handover.ml index 43da594d40b..7f97a43ddf5 100644 --- a/testsuite/tests/weak-ephe-final/finaliser_handover.ml +++ b/testsuite/tests/weak-ephe-final/finaliser_handover.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* ocaml-multicore issues 528 and 468 *) diff --git a/testsuite/tests/weak-ephe-final/pr12001.ml b/testsuite/tests/weak-ephe-final/pr12001.ml index e17c31bcf88..6d0c7844044 100644 --- a/testsuite/tests/weak-ephe-final/pr12001.ml +++ b/testsuite/tests/weak-ephe-final/pr12001.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let [@inline never] foo () = let s = "Hello" ^ " world!" in diff --git a/testsuite/tests/weak-ephe-final/weaklifetime.ml b/testsuite/tests/weak-ephe-final/weaklifetime.ml index 636cf923946..eb85af9ce71 100644 --- a/testsuite/tests/weak-ephe-final/weaklifetime.ml +++ b/testsuite/tests/weak-ephe-final/weaklifetime.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let () = Random.init 12345 diff --git a/testsuite/tests/weak-ephe-final/weaklifetime2.ml b/testsuite/tests/weak-ephe-final/weaklifetime2.ml index 2c75b00bfe4..8c27aa6750c 100644 --- a/testsuite/tests/weak-ephe-final/weaklifetime2.ml +++ b/testsuite/tests/weak-ephe-final/weaklifetime2.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let n = 500 let loop = 2 diff --git a/testsuite/tests/weak-ephe-final/weaktest.ml b/testsuite/tests/weak-ephe-final/weaktest.ml index 647f63ce46f..aba68196c1a 100644 --- a/testsuite/tests/weak-ephe-final/weaktest.ml +++ b/testsuite/tests/weak-ephe-final/weaktest.ml @@ -1,5 +1,4 @@ -(* TEST -*) +(* TEST *) let debug = false;; diff --git a/testsuite/tests/weak-ephe-final/weaktest_par_load.ml b/testsuite/tests/weak-ephe-final/weaktest_par_load.ml index 8beb1f64339..eb39ff9f1fb 100644 --- a/testsuite/tests/weak-ephe-final/weaktest_par_load.ml +++ b/testsuite/tests/weak-ephe-final/weaktest_par_load.ml @@ -1,6 +1,6 @@ (* TEST -* skip -reason = "OCaml 5 only" + reason = "CR ocaml 5 domains: re-enable this test"; + skip; *) (* Testing unsynchronized, parallel Weak usage *) diff --git a/testsuite/tests/win-unicode/mltest.ml b/testsuite/tests/win-unicode/mltest.ml index f4760967bbf..0ea18c62321 100644 --- a/testsuite/tests/win-unicode/mltest.ml +++ b/testsuite/tests/win-unicode/mltest.ml @@ -1,8 +1,8 @@ (* TEST -include unix -flags += "-strict-sequence -w +A -warn-error +A" -* windows-unicode -** toplevel + include unix; + flags += "-strict-sequence -w +A -warn-error +A"; + windows-unicode; + toplevel; *) let foreign_names = diff --git a/testsuite/tools/expect_test.ml b/testsuite/tools/expect_test.ml index 6036be61b66..b2807c100d1 100644 --- a/testsuite/tools/expect_test.ml +++ b/testsuite/tools/expect_test.ml @@ -315,6 +315,19 @@ let process_expect_file fname = let repo_root = ref None let keep_original_error_size = ref false +let preload_objects = ref [] +let main_file = ref None + +let read_anonymous_arg fname = + if Filename.check_suffix fname ".cmo" + || Filename.check_suffix fname ".cma" + then preload_objects := fname :: !preload_objects + else + match !main_file with + | None -> main_file := Some fname + | Some _ -> + Printf.eprintf "expect_test: multiple input source files\n"; + exit 2 let main fname = if not !keep_original_error_size then @@ -337,6 +350,13 @@ let main fname = end; Compmisc.init_path ~auto_include:Load_path.no_auto_include (); Toploop.initialize_toplevel_env (); + let objects = List.rev (!preload_objects) in + List.iter objects ~f:(fun obj_fname -> + match Topeval.load_file false Format.err_formatter obj_fname with + | true -> () + | false -> + Printf.eprintf "expect_test: failed to load object %s\n" obj_fname; + exit 2); (* We are in interactive mode and should record directive error on stdout *) Sys.interactive := true; process_expect_file fname; @@ -347,7 +367,7 @@ module Options = Main_args.Make_bytetop_options (struct let _stdin () = (* disabled *) () let _args = Arg.read_arg let _args0 = Arg.read_arg0 - let anonymous s = main s + let anonymous s = read_anonymous_arg s end);; let args = @@ -366,9 +386,12 @@ let usage = "Usage: expect_test [script-file [arguments]]\n\ let () = Clflags.color := Some Misc.Color.Never; try - Arg.parse args main usage; - Printf.eprintf "expect_test: no input file\n"; - exit 2 + Arg.parse args read_anonymous_arg usage; + match !main_file with + | Some fname -> main fname + | None -> + Printf.eprintf "expect_test: no input file\n"; + exit 2 with exn -> Location.report_exception Format.err_formatter exn; exit 2 diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 00000000000..71a8cdd5825 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,364 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Xavier Leroy, projet Cristal, INRIA Rocquencourt * +#* * +#* Copyright 1999 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. * +#* * +#************************************************************************** + +ROOTDIR = .. +# NOTE: it is important that OCAMLLEX is defined *before* Makefile.common +# gets included, so that its definition here takes precedence +# over the one there. +OCAMLLEX ?= $(BOOT_OCAMLLEX) +include $(ROOTDIR)/Makefile.common + +# Setup GNU make variables storing per-target source and target, +# a list of installed tools, and a function to quote a filename for +# the shell. +installed_tools := ocamldep ocamlprof ocamlcp ocamloptp \ + ocamlmktop ocamlmklib ocamlobjinfo + +install_files := +define byte2native +$(patsubst %.cmo,%.cmx,$(patsubst %.cma,%.cmxa,$1)) +endef + +CAMLC = $(BOOT_OCAMLC) -g -nostdlib -I $(ROOTDIR)/boot \ + -use-prims $(ROOTDIR)/$(RUNTIME_DIR)/primitives -I $(ROOTDIR) +CAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt$(EXE) \ + -g -nostdlib -I $(ROOTDIR)/stdlib +INCLUDES = $(addprefix -I $(ROOTDIR)/,utils parsing typing bytecomp \ + middle_end middle_end/closure middle_end/flambda \ + middle_end/flambda/base_types driver toplevel \ + file_formats lambda) +COMPFLAGS = -absname -w +a-4-9-40-41-42-44-45-48-70 -strict-sequence \ +-warn-error +A -principal -safe-string -strict-formats -bin-annot $(INCLUDES) +LINKFLAGS = $(INCLUDES) +VPATH := $(filter-out -I,$(INCLUDES)) + +programs_byte := \ + ocamldep ocamlprof ocamlcp ocamloptp ocamlmklib \ + ocamlmktop ocamlcmt dumpobj ocamlobjinfo \ + primreq stripdebug cmpbyt +install_files += $(filter $(installed_tools), $(programs_byte)) +programs_opt := $(programs_byte:%=%.opt) + +.PHONY: all allopt opt.opt # allopt and opt.opt are synonyms +all: $(programs_byte) +opt.opt: $(programs_opt) +allopt: opt.opt + +$(foreach program, $(programs_byte) $(programs_opt),\ + $(eval $(call PROGRAM_SYNONYM,$(program)))) + +$(programs_byte:%=%$(EXE)): + $(CAMLC) $(LINKFLAGS) -I $(ROOTDIR) -o $@ $(filter-out %.cmi,$^) + +$(programs_opt:%=%$(EXE)): + $(CAMLOPT_CMD) $(LINKFLAGS) -I $(ROOTDIR) -o $@ $(filter-out %.cmi,$^) + +clean:: + rm -f $(programs_byte) $(programs_byte:%=%.exe) + rm -f $(programs_opt) $(programs_opt:%=%.exe) + +# The dependency generator + +OCAMLDEP = \ + $(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + ocamldep.cmo depend.cmi + +ocamldep$(EXE): LINKFLAGS += -compat-32 +ocamldep$(EXE): $(OCAMLDEP) +ocamldep.opt$(EXE): $(call byte2native, $(OCAMLDEP)) + +# The profiler + +OCAMLPROF=config.cmo build_path_prefix_map.cmo misc.cmo identifiable.cmo \ + numbers.cmo arg_helper.cmo zero_alloc_annotations.cmo clflags.cmo \ + debug.cmo terminfo.cmo \ + warnings.cmo location.cmo longident.cmo docstrings.cmo \ + syntaxerr.cmo ast_helper.cmo \ + language_extension_kernel.cmo language_extension.cmo \ + jane_syntax_parsing.cmo jane_syntax.cmo \ + ast_iterator.cmo zero_alloc_utils.cmo builtin_attributes.cmo \ + camlinternalMenhirLib.cmo parser.cmo \ + pprintast.cmo \ + lexer.cmo parse.cmo ocamlprof.cmo + +ocamlprof$(EXE): $(OCAMLPROF) +ocamlprof.opt$(EXE): $(call byte2native, $(OCAMLPROF)) +all: profiling.cmo +opt.opt: profiling.cmx + +OCAMLCP = config.cmo build_path_prefix_map.cmo misc.cmo profile.cmo \ + warnings.cmo identifiable.cmo numbers.cmo arg_helper.cmo \ + language_extension_kernel.cmo language_extension.cmo \ + zero_alloc_annotations.cmo local_store.cmo \ + terminfo.cmo location.cmo clflags.cmo load_path.cmo ccomp.cmo compenv.cmo \ + main_args.cmo + +ocamlcp$(EXE): $(OCAMLCP) ocamlcp.cmo +ocamlcp.opt$(EXE): $(call byte2native, $(OCAMLCP) ocamlcp.cmo) +ocamloptp$(EXE): $(OCAMLCP) ocamloptp.cmo +ocamloptp.opt$(EXE): $(call byte2native, $(OCAMLCP) ocamloptp.cmo) + +opt:: profiling.cmx + +install:: + $(INSTALL_DATA) \ + profiling.cmi profiling.cmo \ + "$(INSTALL_LIBDIR)" +ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" + $(INSTALL_DATA) \ + profiling.cmt profiling.cmti \ + "$(INSTALL_LIBDIR)" +endif + +installopt:: + $(INSTALL_DATA) \ + profiling.cmx profiling.$(O) \ + "$(INSTALL_LIBDIR)" + +# To help building mixed-mode libraries (OCaml + C) +OCAMLMKLIB = config.cmo build_path_prefix_map.cmo misc.cmo ocamlmklib.cmo + +ocamlmklib$(EXE): $(OCAMLMKLIB) +ocamlmklib.opt$(EXE): $(call byte2native, $(OCAMLMKLIB)) + +# To make custom toplevels + +OCAMLMKTOP=config.cmo build_path_prefix_map.cmo misc.cmo \ + identifiable.cmo numbers.cmo arg_helper.cmo zero_alloc_annotations.cmo \ + clflags.cmo local_store.cmo load_path.cmo profile.cmo ccomp.cmo \ + ocamlmktop.cmo + +ocamlmktop$(EXE): $(OCAMLMKTOP) +ocamlmktop.opt$(EXE): $(call byte2native, $(OCAMLMKTOP)) + +# Converter olabl/ocaml 2.99 to ocaml 3 + +LIBRARY3=config.cmo build_path_prefix_map.cmo misc.cmo warnings.cmo location.cmo + +ifeq ($(UNIX_OR_WIN32),unix) +LN := ln -sf +else +LN := cp -pf +endif + +install:: +ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" + for i in $(install_files); \ + do \ + $(INSTALL_PROG) "$$i$(EXE)" "$(INSTALL_BINDIR)/$$i.byte$(EXE)"; \ + if test -f "$$i".opt$(EXE); then \ + $(INSTALL_PROG) "$$i.opt$(EXE)" "$(INSTALL_BINDIR)" && \ + (cd "$(INSTALL_BINDIR)" && $(LN) "$$i.opt$(EXE)" "$$i$(EXE)"); \ + else \ + (cd "$(INSTALL_BINDIR)" && $(LN) "$$i.byte$(EXE)" "$$i$(EXE)"); \ + fi; \ + done +else + for i in $(install_files); \ + do \ + if test -f "$$i".opt$(EXE); then \ + $(INSTALL_PROG) "$$i.opt$(EXE)" "$(INSTALL_BINDIR)"; \ + (cd "$(INSTALL_BINDIR)" && $(LN) "$$i.opt$(EXE)" "$$i$(EXE)"); \ + fi; \ + done +endif + +# The preprocessor for asm generators + +cvt_emit := cvt_emit$(EXE) + +$(eval $(call PROGRAM_SYNONYM,cvt_emit)) + +$(cvt_emit): cvt_emit.cmo + $(CAMLC) $(LINKFLAGS) -o $@ $^ + +clean:: + rm -f cvt_emit.ml cvt_emit cvt_emit.exe + +beforedepend:: cvt_emit.ml + +# Reading cmt files + +OCAMLCMT = \ + $(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + ocamlcmt.cmo + +ocamlcmt$(EXE): $(OCAMLCMT) +ocamlcmt.opt$(EXE): $(call byte2native, $(OCAMLCMT)) + +install:: + if test -f ocamlcmt.opt$(EXE); then \ + $(INSTALL_PROG)\ + ocamlcmt.opt$(EXE) "$(INSTALL_BINDIR)/ocamlcmt$(EXE)"; \ + else \ + $(INSTALL_PROG) ocamlcmt$(EXE) "$(INSTALL_BINDIR)"; \ + fi + +# The bytecode disassembler + +DUMPOBJ= \ + $(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + opnames.cmo dumpobj.cmo + +dumpobj$(EXE): $(DUMPOBJ) +dumpobj.opt$(EXE): $(call byte2native, $(DUMPOBJ)) + +make_opcodes := make_opcodes$(EXE) + +$(eval $(call PROGRAM_SYNONYM,make_opcodes)) + +$(make_opcodes): make_opcodes.ml + $(CAMLC) $< -o $@ + +opnames.ml: $(ROOTDIR)/runtime/caml/instruct.h $(make_opcodes) + $(NEW_OCAMLRUN) $(make_opcodes) -opnames < $< > $@ + +clean:: + rm -f opnames.ml make_opcodes make_opcodes.exe make_opcodes.ml + +beforedepend:: opnames.ml + +# Display info on compiled files + +DEF_SYMBOL_PREFIX = '-Dsymbol_prefix=""' + +ifeq "$(SYSTEM)" "macosx" +DEF_SYMBOL_PREFIX = '-Dsymbol_prefix="_"' +endif + +ifeq "$(SYSTEM)" "cygwin" +DEF_SYMBOL_PREFIX = '-Dsymbol_prefix="_"' +endif + +OCAMLOBJINFO=$(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + $(ROOTDIR)/compilerlibs/ocamlmiddleend.cma \ + objinfo.cmo + +ocamlobjinfo$(EXE): $(OCAMLOBJINFO) +ocamlobjinfo.opt$(EXE): $(call byte2native, $(OCAMLOBJINFO)) + +PRIMREQ=$(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + primreq.cmo + +# Scan object files for required primitives +primreq$(EXE): $(PRIMREQ) +primreq.opt$(EXE): $(call byte2native, $(PRIMREQ)) + +LINTAPIDIFF=$(ROOTDIR)/compilerlibs/ocamlcommon.cmxa \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cmxa \ + $(ROOTDIR)/compilerlibs/ocamlmiddleend.cmxa \ + $(ROOTDIR)/otherlibs/str/str.cmxa \ + lintapidiff.cmx + +lintapidiff.opt$(EXE): INCLUDES+= -I $(ROOTDIR)/otherlibs/str +lintapidiff.opt$(EXE): $(LINTAPIDIFF) + $(CAMLOPT_CMD) $(LINKFLAGS) -I $(ROOTDIR) -o $@ $(LINTAPIDIFF) +clean:: + rm -f -- lintapidiff.opt lintapidiff.opt.exe + rm -f lintapidiff.cm? lintapidiff.o lintapidiff.obj + +# Eventlog metadata file + +install:: + $(INSTALL_DATA) \ + eventlog_metadata \ + "$(INSTALL_LIBDIR)" + +# Copy a bytecode executable, stripping debug info + +STRIPDEBUG=$(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + stripdebug.cmo + +stripdebug$(EXE): $(STRIPDEBUG) +stripdebug.opt$(EXE): $(call byte2native, $(STRIPDEBUG)) + +# Compare two bytecode executables + +CMPBYT=$(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + cmpbyt.cmo + +cmpbyt$(EXE): $(CMPBYT) +cmpbyt.opt$(EXE): $(call byte2native, $(CMPBYT)) + +caml_tex_files := \ + $(ROOTDIR)/compilerlibs/ocamlcommon.cma \ + $(ROOTDIR)/compilerlibs/ocamlbytecomp.cma \ + $(ROOTDIR)/compilerlibs/ocamltoplevel.cma \ + $(ROOTDIR)/otherlibs/str/str.cma \ + $(ROOTDIR)/otherlibs/$(UNIXLIB)/unix.cma \ + caml_tex.ml + +# checkstack tool + +checkstack$(EXE): checkstack.$(O) + $(MKEXE) $(OUTPUTEXE)$@ $< + +#Scan latex files, and run ocaml code examples + +caml_tex := caml-tex$(EXE) + +# caml-tex uses str.cma and unix.cma and so must be compiled with +# $(ROOTDIR)/ocamlc not $(ROOTDIR)/boot/ocamlc since the boot +# compiler does not necessarily have the correct shared library +# configuration. +$(caml_tex): INCLUDES += $(addprefix -I $(ROOTDIR)/otherlibs/,str $(UNIXLIB)) +$(caml_tex): $(caml_tex_files) + $(OCAMLRUN) $(ROOTDIR)/ocamlc$(EXE) -nostdlib -I $(ROOTDIR)/stdlib \ + $(LINKFLAGS) -linkall -o $@ -no-alias-deps $^ + +# we need str and unix which depend on the bytecode version of other tools +# thus we delay building caml-tex to the opt.opt stage +ifneq "$(WITH_CAMLTEX)" "" +opt.opt: $(caml_tex) +endif +clean:: + rm -f -- caml-tex caml-tex.exe caml_tex.cm? + +# Debug printer script +debug_printers: debug_printers.ml debug_printers.cmo + echo 'load_printer "tools/$(basename $<).cmo"' > '$@' + awk '{ print "install_printer Debug_printers." $$2 }' \ + < '$<' >> '$@' + +# Common stuff + +%.cmo: %.ml + $(CAMLC) -c $(COMPFLAGS) - $< + +%.cmi: %.mli + $(CAMLC) -c $(COMPFLAGS) - $< + +%.cmx: %.ml + $(CAMLOPT) $(COMPFLAGS) -c - $< + +clean:: + rm -f debug_printers *.cmo *.cmi *.cma *.dll *.so *.lib *.a + +CAMLDEP=$(BOOT_OCAMLC) -depend +DEPFLAGS=-slash +DEPINCLUDES=$(INCLUDES) +depend: beforedepend + $(CAMLDEP) $(DEPFLAGS) $(DEPINCLUDES) *.mli *.ml > .depend + +.PHONY: clean install beforedepend depend + +include .depend diff --git a/tools/build_jane_syntax_with_active_opam_switch.sh b/tools/build_jane_syntax_with_active_opam_switch.sh index 364e480deda..4ebac929501 100755 --- a/tools/build_jane_syntax_with_active_opam_switch.sh +++ b/tools/build_jane_syntax_with_active_opam_switch.sh @@ -11,7 +11,6 @@ cd $(git rev-parse --show-toplevel)/ocaml files_in_dependency_order=( utils/language_extension_kernel.{mli,ml} language_extension.ml - parsing/jane_asttypes.mli parsing/{jane_syntax_parsing,jane_syntax}.{mli,ml} ) diff --git a/tools/ci/inria/other-configs/script b/tools/ci/inria/other-configs/script index 6536c4db7ad..1ec70e880b1 100755 --- a/tools/ci/inria/other-configs/script +++ b/tools/ci/inria/other-configs/script @@ -39,6 +39,6 @@ ${main} -conf --disable-native-compiler \ -no-native ${main} -conf --disable-flat-float-array ${main} -conf --enable-flambda -${main} -conf --enable-frame-pointers -conf --enable-reserved-header-bits=27 +${main} -conf --enable-frame-pointers ${main} -with-bootstrap -conf --with-pic OCAMLRUNPARAM="c=1" ${main} diff --git a/tools/dumpobj.ml b/tools/dumpobj.ml index c2375e8a8fa..9fcc47f5648 100644 --- a/tools/dumpobj.ml +++ b/tools/dumpobj.ml @@ -358,7 +358,8 @@ let op_shapes = [ opUGEINT, Nothing; opBULTINT, Uint_Disp; opBUGEINT, Uint_Disp; - (* BACKPORT + (* CR ocaml 5 effects: + BACKPORT opPERFORM, Nothing; opRESUME, Nothing; opRESUMETERM, Uint; diff --git a/tools/dune b/tools/dune index 13a1b4553dd..5c687f58d04 100644 --- a/tools/dune +++ b/tools/dune @@ -47,7 +47,7 @@ (rule (target opnames.ml) (deps make_opcodes.exe (universe)) - (action (system "./make_opcodes.exe -opnames < ../runtime4/caml/instruct.h > opnames.ml"))) + (action (system "./make_opcodes.exe -opnames < ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml/instruct.h > opnames.ml"))) (library (name opnames) @@ -60,6 +60,14 @@ (modules dumpobj) (libraries ocamlcommon ocamlbytecomp opnames)) +(install + (files + (dumpobj.bc as dumpobj.byte) + (dumpobj.exe as dumpobj.opt) + ) + (section bin) + (package ocaml)) + (executable (name cmpbyt) (modes byte) @@ -70,6 +78,8 @@ (name ocamlmklib) (modes byte native) (modules ocamlmklib) + ; FIXME Fix warning 32 + (flags (:standard -w -32)) (libraries ocamlcommon ocamlbytecomp)) (install diff --git a/tools/gen_sizeclasses.ml b/tools/gen_sizeclasses.ml index eb0a80d3bcd..70aa7a34095 100644 --- a/tools/gen_sizeclasses.ml +++ b/tools/gen_sizeclasses.ml @@ -15,12 +15,27 @@ let overhead block slot obj = 1. -. float_of_int((block / slot) * obj) /. float_of_int block -let max_overhead = 0.10 +let max_overhead = 0.101 + +(* + Prevention of false sharing requires certain sizeclasses to be present. This + ensures they are generated. + Runtime has a constructor for atomics (`caml_atomic_make_contended`), which + aligns them with cache lines to avoid false sharing. The implementation + relies on the fact that pools are cache-aligned by design and slots of + appropriate size maintain this property. To be precise, slots whose size is a + multiple of cache line are laid out in such a way, that their boundaries + coincide with boundaries between cache lines. +*) +let required_for_contended_atomic = function + | 16 | 32 -> true + | _ -> false let rec blocksizes block slot = function | 0 -> [] | obj -> if overhead block slot obj > max_overhead + || required_for_contended_atomic obj then if overhead block obj obj < max_overhead then obj :: blocksizes block obj (obj - 1) @@ -73,9 +88,9 @@ let _ = printf "#define SIZECLASS_MAX %d\n" max_slot; printf "#define NUM_SIZECLASSES %d\n" (List.length sizes); printf "static const unsigned int \ -wsize_sizeclass[NUM_SIZECLASSES] = @[<2>{ %a };@]\n" print_list sizes; +wsize_sizeclass[NUM_SIZECLASSES] =@[<2>{ %a };@]\n" print_list sizes; printf "static const unsigned char \ -wastage_sizeclass[NUM_SIZECLASSES] = @[<2>{ %a };@]\n" print_list wastage; +wastage_sizeclass[NUM_SIZECLASSES] =@[<2>{ %a };@]\n" print_list wastage; printf "static const unsigned char \ -sizeclass_wsize[SIZECLASS_MAX + 1] = @[<2>{ %a };@]\n" +sizeclass_wsize[SIZECLASS_MAX + 1] =@[<2>{ %a };@]\n" print_list (255 :: size_slots 1); diff --git a/tools/objinfo.ml b/tools/objinfo.ml index ba958bec3bf..8a157189864 100644 --- a/tools/objinfo.ml +++ b/tools/objinfo.ml @@ -24,10 +24,13 @@ open Cmo_format (* Command line options to prevent printing approximation, function code and CRC *) +let quiet = ref false let no_approx = ref false let no_code = ref false let no_crc = ref false let shape = ref false +let index = ref false +let decls = ref false module Magic_number = Misc.Magic_number @@ -59,6 +62,10 @@ let print_impl_import import = let print_line name = printf "\t%s\n" name +let print_global_as_name_line glob = + (* Type will change soon for parameterised libraries *) + printf "\t%a\n" Compilation_unit.Name.output glob + let print_required_global id = printf "\t%a\n" Compilation_unit.output id @@ -93,32 +100,94 @@ let print_cma_infos (lib : Cmo_format.library) = printf "\n"; List.iter print_cmo_infos lib.lib_units -let print_cmi_infos name crcs = - printf "Unit name: %a\n" Compilation_unit.output name; - printf "Interfaces imported:\n"; - Array.iter print_intf_import crcs +let print_cmi_infos name crcs kind params = + if not !quiet then begin + let open Cmi_format in + printf "Unit name: %a\n" Compilation_unit.Name.output name; + let is_param = + match kind with + | Normal _ -> false + | Parameter -> true + in + printf "Is parameter: %s\n" (if is_param then "YES" else "no"); + print_string "Parameters:\n"; + List.iter print_global_as_name_line params; + printf "Interfaces imported:\n"; + Array.iter print_intf_import crcs + end let print_cmt_infos cmt = let open Cmt_format in - printf "Cmt unit name: %a\n" Compilation_unit.output cmt.cmt_modname; - print_string "Cmt interfaces imported:\n"; - Array.iter print_intf_import cmt.cmt_imports; - printf "Source file: %s\n" - (match cmt.cmt_sourcefile with None -> "(none)" | Some f -> f); - printf "Compilation flags:"; - Array.iter print_spaced_string cmt.cmt_args; - printf "\nLoad path:"; - List.iter print_spaced_string cmt.cmt_loadpath; - printf "\n"; - printf "cmt interface digest: %s\n" - (match cmt.cmt_interface_digest with - | None -> "" - | Some crc -> string_of_crc crc); + if not !quiet then begin + printf "Cmt unit name: %a\n" Compilation_unit.output cmt.cmt_modname; + print_string "Cmt interfaces imported:\n"; + Array.iter print_intf_import cmt.cmt_imports; + printf "Source file: %s\n" + (match cmt.cmt_sourcefile with None -> "(none)" | Some f -> f); + printf "Compilation flags:"; + Array.iter print_spaced_string cmt.cmt_args; + printf "\nLoad path:\n Visible:"; + List.iter print_spaced_string cmt.cmt_loadpath.visible; + printf "\n Hidden:"; + List.iter print_spaced_string cmt.cmt_loadpath.hidden; + printf "\n"; + printf "cmt interface digest: %s\n" + (match cmt.cmt_interface_digest with + | None -> "" + | Some crc -> string_of_crc crc); + end; if !shape then begin printf "Implementation shape: "; (match cmt.cmt_impl_shape with | None -> printf "(none)\n" | Some shape -> Format.printf "\n%a" Shape.print shape) + end; + if !index then begin + printf "Indexed shapes:\n"; + Array.iter (fun (loc, item) -> + let pp_loc fmt { Location.txt; loc } = + Format.fprintf fmt "%a (%a)" + Pprintast.longident txt Location.print_loc loc + in + Format.printf "@[%a:@ %a@]@;" + Shape_reduce.print_result item pp_loc loc) + cmt.cmt_ident_occurrences; + Format.print_flush () + end; + if !decls then begin + printf "\nUid of decls:\n"; + Shape.Uid.Tbl.iter (fun uid item -> + let loc = match (item : Typedtree.item_declaration) with + | Value vd -> vd.val_name + | Value_binding vb -> + let (_, name, _, _) = + List.hd (Typedtree.let_bound_idents_full [vb]) + in + name + | Type td -> td.typ_name + | Constructor cd -> cd.cd_name + | Extension_constructor ec -> ec.ext_name + | Label ld -> ld.ld_name + | Module md -> + { md.md_name with + txt = Option.value md.md_name.txt ~default:"_" } + | Module_substitution ms -> ms.ms_name + | Module_binding mb -> + { mb.mb_name with + txt = Option.value mb.mb_name.txt ~default:"_" } + | Module_type mtd -> mtd.mtd_name + | Class cd -> cd.ci_id_name + | Class_type ctd -> ctd.ci_id_name + in + let pp_loc fmt { Location.txt; loc } = + Format.fprintf fmt "%s (%a)" + txt Location.print_loc loc + in + Format.printf "@[%a:@ %a@]@;" + Shape.Uid.print uid + pp_loc loc) + cmt.cmt_uid_to_decl; + Format.print_flush () end let print_cms_infos cms = @@ -338,6 +407,7 @@ let dump_obj_by_kind filename ic obj_kind = | None -> () | Some cmi -> print_cmi_infos cmi.Cmi_format.cmi_name cmi.Cmi_format.cmi_crcs + cmi.Cmi_format.cmi_kind cmi.Cmi_format.cmi_params end; begin match cmt with | None -> () @@ -417,7 +487,7 @@ let dump_obj filename = dump_obj_by_kind filename ic Cmxs; () in - printf "File %s\n" filename; + if not !quiet then printf "File %s\n" filename; let ic = open_in_bin filename in match dump_standard ic with | Ok () -> () @@ -430,12 +500,18 @@ let dump_obj filename = else exit_magic_error ~expected_kind:None (Parse_error head_error) let arg_list = [ + "-quiet", Arg.Set quiet, + " Only print explicitely required information"; "-no-approx", Arg.Set no_approx, " Do not print module approximation information"; "-no-code", Arg.Set no_code, " Do not print code from exported flambda functions"; "-shape", Arg.Set shape, " Print the shape of the module"; + "-index", Arg.Set index, + " Print a list of all usages of values, types, etc. in the module"; + "-decls", Arg.Set decls, + " Print a list of all declarations in the module"; "-null-crc", Arg.Set no_crc, " Print a null CRC for imported interfaces"; "-args", Arg.Expand Arg.read_arg, " Read additional newline separated command line arguments \n\ diff --git a/tools/ocamlcmt.ml b/tools/ocamlcmt.ml index 1bb39e10cc3..938acf2120b 100644 --- a/tools/ocamlcmt.ml +++ b/tools/ocamlcmt.ml @@ -69,7 +69,10 @@ let print_info cmt = Printf.fprintf oc "sourcefile: %s\n" name; end; Printf.fprintf oc "build directory: %s\n" cmt.cmt_builddir; - List.iter (Printf.fprintf oc "load path: %s\n%!") cmt.cmt_loadpath; + List.iter (Printf.fprintf oc "load path (visible): %s\n%!") + cmt.cmt_loadpath.visible; + List.iter (Printf.fprintf oc "load path (hidden): %s\n%!") + cmt.cmt_loadpath.hidden; begin match cmt.cmt_source_digest with None -> () @@ -88,7 +91,7 @@ let print_info cmt = let imports = let imports = Array.map (fun import -> - Import_info.name import, Import_info.crc_with_unit import) + Import_info.name import, Import_info.crc import) cmt.cmt_imports in Array.sort compare_imports imports; @@ -98,7 +101,7 @@ let print_info cmt = let crc = match crco with None -> dummy_crc - | Some (_unit, crc) -> Digest.to_hex crc + | Some crc -> Digest.to_hex crc in Printf.fprintf oc "import: %a %s\n" Compilation_unit.Name.output name crc; ) imports; @@ -161,7 +164,8 @@ let record_cmt_info cmt = Annot.Idef (location_file value))) in let open Cmt_format in - List.iter (fun dir -> record_info "include" dir) cmt.cmt_loadpath; + List.iter (fun dir -> record_info "include" dir) cmt.cmt_loadpath.visible; + List.iter (fun dir -> record_info "include" dir) cmt.cmt_loadpath.hidden; record_info "chdir" cmt.cmt_builddir; (match cmt.cmt_sourcefile with None -> () | Some file -> record_info "source" file) @@ -186,7 +190,8 @@ let main () = | Some _ as x -> x in Envaux.reset_cache ~preserve_persistent_env:false; - List.iter Load_path.add_dir cmt.cmt_loadpath; + List.iter (Load_path.add_dir ~hidden:false) cmt.cmt_loadpath.visible; + List.iter (Load_path.add_dir ~hidden:true) cmt.cmt_loadpath.hidden; Cmt2annot.gen_annot target_filename ~sourcefile:cmt.cmt_sourcefile ~use_summaries:cmt.cmt_use_summaries diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index e813919510f..4089ea5b5ac 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -307,6 +307,7 @@ and rewrite_exp_jane_syntax iflag : Jane_syntax.Expression.t -> _ = function | Jexp_layout (Lexp_constant _) -> rewrite_constant | Jexp_layout (Lexp_newtype (_, _, sexp)) -> rewrite_exp iflag sexp | Jexp_n_ary_function x -> rewrite_n_ary_function iflag x + | Jexp_tuple ltexp -> rewrite_labeled_tuple_exp iflag ltexp and rewrite_n_ary_function iflag : Jane_syntax.N_ary_functions.expression -> _ = function @@ -359,6 +360,12 @@ and rewrite_immutable_array_exp iflag : | Iaexp_immutable_array exprs -> rewrite_exp_list iflag exprs +and rewrite_labeled_tuple_exp iflag : + Jane_syntax.Labeled_tuples.expression -> _ = + function + | Ltexp_tuple sexpl -> + rewrite_exp_list iflag (List.map snd sexpl) + and rewrite_ifbody iflag ghost sifbody = if !instr_if && not ghost then insert_profile rw_exp sifbody diff --git a/tools/translate-all-tests b/tools/translate-all-tests new file mode 100755 index 00000000000..febed2d5f84 --- /dev/null +++ b/tools/translate-all-tests @@ -0,0 +1,1412 @@ +#!/bin/sh + +#************************************************************************** +#* * +#* OCaml * +#* * +#* Damien Doligez, projet Cambium, INRIA * +#* * +#* Copyright 2023 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. * +#* * +#************************************************************************** + +# This is the list of tests present in commit +# cd195d6f4f8696af36efaea82941482e92f85464 + +# This script assumes that ../trunk contains a check-out of trunk to get +# the old-syntax test files from. + +# There are 1328 test scripts detected by ocamltest + +# These tests will be translated in plain mode but need manual intervention +# to restore comments. + +TESTS_COMMENTS=" +afl-instrumentation/afl-fuzz-test.ml \ +afl-instrumentation/afl-showmap-test.ml \ +badly-ordered-deps/main.ml \ +lib-dynlink-native/main.ml \ +lib-scanf-2/tscanf2_master.ml \ +lib-systhreads/testpreempt.ml \ +lib-systhreads/testyield.ml \ +lib-threads/delayintr.ml \ +lib-threads/signal.ml \ +lib-threads/sockets.ml \ +lib-unix/common/cloexec.ml \ +manual-intf-c/prog.ml \ +opaque/test.ml \ +shadow_include/shadow_all.ml \ +" + +# These tests can be translated without special care +TESTS_PLAIN=" +arch-power/exn_raise.ml \ +array-functions/test.ml \ +asmcomp/0001-test.ml \ +asmcomp/bind_tuples.ml \ +asmcomp/compare.ml \ +asmcomp/evaluation_order.ml \ +asmcomp/func_sections.ml \ +asmcomp/lift_mutable_let_flambda.ml \ +asmcomp/optargs.ml \ +asmcomp/poll_attr_inserted.ml \ +asmcomp/polling_insertion.ml \ +asmcomp/prevent_fma.ml \ +asmcomp/register_typing.ml \ +asmcomp/register_typing_switch.ml \ +asmcomp/select_addr.ml \ +asmcomp/staticalloc.ml \ +asmcomp/try_checkbound.ml \ +asmcomp/unrolling_flambda.ml \ +asmcomp/unrolling_flambda2.ml \ +asmgen/arith.cmm \ +asmgen/catch-float.cmm \ +asmgen/catch-multiple.cmm \ +asmgen/catch-rec-deadhandler.cmm \ +asmgen/catch-rec.cmm \ +asmgen/catch-try-float.cmm \ +asmgen/catch-try.cmm \ +asmgen/checkbound.cmm \ +asmgen/even-odd-spill-float.cmm \ +asmgen/even-odd-spill.cmm \ +asmgen/even-odd.cmm \ +asmgen/fib.cmm \ +asmgen/immediates.cmm \ +asmgen/integr.cmm \ +asmgen/invariants.cmm \ +asmgen/pgcd.cmm \ +asmgen/quicksort.cmm \ +asmgen/quicksort2.cmm \ +asmgen/soli.cmm \ +asmgen/tagged-fib.cmm \ +asmgen/tagged-integr.cmm \ +asmgen/tagged-quicksort.cmm \ +asmgen/tagged-tak.cmm \ +asmgen/tak.cmm \ +ast-invariants/test.ml \ +backtrace/backtrace.ml \ +backtrace/backtraces_and_finalizers.ml \ +backtrace/lazy.ml \ +basic-float/float_compare.ml \ +basic-float/float_literals.ml \ +basic-float/tfloat_hex.ml \ +basic-float/tfloat_record.ml \ +basic-float/zero_sized_float_arrays.ml \ +basic-io/wc.ml \ +basic-io-2/io.ml \ +basic-manyargs/manyargs.ml \ +basic-modules/main.ml \ +basic-modules/pr11186.ml \ +basic-modules/recursive_module_evaluation_errors.ml \ +basic-modules/recursive_module_init.ml \ +basic-more/bounds.ml \ +basic-more/div_by_zero.ml \ +basic-more/function_in_ref.ml \ +basic-more/if_in_if.ml \ +basic-more/opaque_prim.ml \ +basic-more/pr10294.ml \ +basic-more/pr1271.ml \ +basic-more/pr2719.ml \ +basic-more/pr6216.ml \ +basic-more/pr7683.ml \ +basic-more/record_evaluation_order.ml \ +basic-more/robustmatch.ml \ +basic-more/sequential_and_or.ml \ +basic-more/structural_constants.ml \ +basic-more/tbuffer.ml \ +basic-more/top_level_patterns.ml \ +basic-more/tprintf.ml \ +basic-multdef/usemultdef.ml \ +basic-private/tlength.ml \ +basic/arrays.ml \ +basic/bigints.ml \ +basic/boxedints.ml \ +basic/constprop.ml.c \ +basic/divint.ml \ +basic/equality.ml \ +basic/eval_order_1.ml \ +basic/eval_order_2.ml \ +basic/eval_order_3.ml \ +basic/eval_order_4.ml \ +basic/eval_order_6.ml \ +basic/eval_order_7.ml \ +basic/eval_order_8.ml \ +basic/eval_order_pr10283.ml \ +basic/float.ml \ +basic/float_physical_equality.ml \ +basic/includestruct.ml \ +basic/localexn.ml \ +basic/localfunction.ml \ +basic/maps.ml \ +basic/min_int.ml \ +basic/objects.ml \ +basic/opt_variants.ml \ +basic/patmatch.ml \ +basic/patmatch_for_multiple.ml \ +basic/patmatch_incoherence.ml \ +basic/patmatch_split_no_or.ml \ +basic/pr7253.ml \ +basic/pr7533.ml \ +basic/pr7657.ml \ +basic/recvalues.ml \ +basic/sets.ml \ +basic/stringmatch.ml \ +basic/switch_opts.ml \ +basic/tailcalls.ml \ +basic/trigraph.ml \ +basic/tuple_match.ml \ +basic/zero_divided_by_n.ml \ +c-api/alloc_async.ml \ +c-api/test_c_thread_has_lock.ml \ +c-api/test_c_thread_has_lock_systhread.ml \ +callback/callback_effects_gc.ml \ +callback/minor_named.ml \ +callback/nested_fiber.ml \ +callback/signals_alloc.ml \ +callback/stack_overflow.ml \ +callback/test1.ml \ +callback/test2.ml \ +callback/test3.ml \ +callback/test4.ml \ +callback/test5.ml \ +callback/test6.ml \ +callback/test7.ml \ +callback/test_finaliser_gc.ml \ +callback/test_signalhandler.ml \ +compiler-libs/test_longident.ml \ +compiler-libs/test_untypeast.ml \ +effects/cmphash.ml \ +effects/evenodd.ml \ +effects/issue479.ml \ +effects/manylive.ml \ +effects/marshal.ml \ +effects/overflow.ml \ +effects/partial.ml \ +effects/reperform.ml \ +effects/sched.ml \ +effects/shallow_state.ml \ +effects/shallow_state_io.ml \ +effects/test1.ml \ +effects/test10.ml \ +effects/test11.ml \ +effects/test2.ml \ +effects/test3.ml \ +effects/test4.ml \ +effects/test5.ml \ +effects/test6.ml \ +effects/test_lazy.ml \ +effects/unhandled_unlinked.ml \ +effects/used_cont.ml \ +embedded/cmcaml.ml \ +ephe-c-api/test.ml \ +exotic-syntax/exotic.ml \ +extension-constructor/test.ml \ +flambda/afl_lazy.ml \ +flambda/approx_meet.ml \ +flambda/gpr2239.ml \ +flambda/gpr998.ml \ +flambda/specialise.ml \ +float-unboxing/float_subst_boxed_number.ml \ +float-unboxing/unbox_under_assign.ml \ +fma/fma.ml \ +formats-transition/deprecated_unsigned_printers.ml \ +formats-transition/ignored_scan_counters.ml \ +formats-transition/legacy_incompatible_flags.ml \ +formats-transition/legacy_unfinished_modifiers.ml \ +formatting/errors_batch.ml \ +formatting/margins.ml \ +frame-pointers/c_call.ml \ +frame-pointers/effects.ml \ +frame-pointers/exception_handler.ml \ +frame-pointers/reperform.ml \ +frame-pointers/stack_realloc.ml \ +frame-pointers/stack_realloc2.ml \ +functors/functors.ml \ +gc-roots/globroots.ml \ +gc-roots/globroots_parallel.ml \ +gc-roots/globroots_parallel_spawn_burn.ml \ +gc-roots/globroots_sequential.ml \ +generalized-open/accepted_batch.ml \ +generalized-open/accepted_expect.ml \ +generalized-open/clambda_optim.ml \ +generalized-open/expansiveness.ml \ +generalized-open/gpr1506.ml \ +generalized-open/pr10048.ml \ +generalized-open/shadowing.ml \ +generated-parse-errors/errors.ml \ +int64-unboxing/test.ml \ +lazy/lazy1.ml \ +lazy/lazy2.ml \ +lazy/lazy3.ml \ +lazy/lazy4.ml \ +lazy/lazy5.ml \ +lazy/lazy6.ml \ +lazy/lazy7.ml \ +lazy/lazy8.ml \ +lazy/minor_major_force.ml \ +let-syntax/let_syntax.ml \ +letrec-check/basic.ml \ +letrec-check/extension_constructor.ml \ +letrec-check/flat_float_array.ml \ +letrec-check/float_unboxing.ml \ +letrec-check/labels.ml \ +letrec-check/lazy_.ml \ +letrec-check/modules.ml \ +letrec-check/no_flat_float_array.ml \ +letrec-check/objects.ml \ +letrec-check/pr7215.ml \ +letrec-check/records.ml \ +letrec-check/unboxed.ml \ +letrec-compilation/backreferences.ml \ +letrec-compilation/class_1.ml \ +letrec-compilation/class_2.ml \ +letrec-compilation/evaluation_order_1.ml \ +letrec-compilation/evaluation_order_2.ml \ +letrec-compilation/evaluation_order_3.ml \ +letrec-compilation/float_block_1.ml \ +letrec-compilation/generic_array.ml \ +letrec-compilation/labels.ml \ +letrec-compilation/lazy_.ml \ +letrec-compilation/lists.ml \ +letrec-compilation/mixing_value_closures_1.ml \ +letrec-compilation/mixing_value_closures_2.ml \ +letrec-compilation/mutual_functions.ml \ +letrec-compilation/nested.ml \ +letrec-compilation/pr12153_miscompilation_of_recursive_atoms.ml \ +letrec-compilation/pr4989.ml \ +letrec-compilation/pr8681.ml \ +letrec-compilation/record_with.ml \ +letrec-compilation/ref.ml \ +lexing/comments.ml \ +lexing/uchar_esc.ml \ +lf_skiplist/test.ml \ +lf_skiplist/test_parallel.ml \ +lib-arg/test_rest_all.ml \ +lib-arg/testarg.ml \ +lib-arg/testerror.ml \ +lib-array/test_array.ml \ +lib-atomic/test_atomic.ml \ +lib-bigarray-2/bigarrcml.ml \ +lib-bigarray-2/bigarrfml.ml \ +lib-bigarray-file/mapfile.ml \ +lib-bigarray/bigarrays.ml \ +lib-bigarray/change_layout.ml \ +lib-bigarray/fftba.ml \ +lib-bigarray/pr5115.ml \ +lib-bigarray/weak_bigarray.ml \ +lib-bool/test.ml \ +lib-buffer/test.ml \ +lib-bytes-utf/test.ml \ +lib-bytes/binary.ml \ +lib-bytes/test_bytes.ml \ +lib-channels/buffered.ml \ +lib-channels/close_in.ml \ +lib-channels/in_channel_length.ml \ +lib-channels/input_all.ml \ +lib-channels/input_lines.ml \ +lib-channels/refcounting.ml \ +lib-channels/seek_in.ml \ +lib-digest/md5.ml \ +lib-dynlink-bytecode/main.ml \ +lib-dynlink-csharp/main.ml \ +lib-dynlink-domains/main.ml \ +lib-dynlink-init-info/test.ml \ +lib-dynlink-initializers/test1_main.ml \ +lib-dynlink-initializers/test2_main.ml \ +lib-dynlink-initializers/test3_main.ml \ +lib-dynlink-initializers/test4_main.ml \ +lib-dynlink-initializers/test5_main.ml \ +lib-dynlink-initializers/test6_main.ml \ +lib-dynlink-initializers/test7_main.ml \ +lib-dynlink-initializers/test8_main.ml \ +lib-dynlink-initializers/test9_main.ml \ +lib-dynlink-packed/loader.ml \ +lib-dynlink-pr4229/main.ml \ +lib-dynlink-pr4839/test.ml \ +lib-dynlink-pr6950/loader.ml \ +lib-dynlink-pr9209/dyn.ml \ +lib-dynlink-private/test.ml \ +lib-either/test.ml \ +lib-filename/extension.ml \ +lib-filename/null.ml \ +lib-filename/quotecommand.ml \ +lib-filename/suffix.ml \ +lib-filename/temp.ml \ +lib-float/test.ml \ +lib-floatarray/floatarray.ml \ +lib-format/domains.ml \ +lib-format/mc_pr586_par.ml \ +lib-format/mc_pr586_par2.ml \ +lib-format/pp_print_custom_break.ml \ +lib-format/pr6824.ml \ +lib-format/print_array.ml \ +lib-format/print_if_newline.ml \ +lib-format/print_seq.ml \ +lib-format/tformat.ml \ +lib-fun/test.ml \ +lib-hashtbl/compatibility.ml \ +lib-hashtbl/hfun.ml \ +lib-hashtbl/htbl.ml \ +lib-int/test.ml \ +lib-int64/issue9460.ml \ +lib-int64/test.ml \ +lib-internalformat/test.ml \ +lib-lazy/test.ml \ +lib-list/test.ml \ +lib-marshal/intern_final.ml \ +lib-marshal/intext.ml \ +lib-marshal/intext_par.ml \ +lib-marshal/marshal_bigarray.ml \ +lib-obj/new_obj.ml \ +lib-obj/reachable_words.ml \ +lib-obj/reachable_words_bug.ml \ +lib-obj/with_tag.ml \ +lib-option/test.ml \ +lib-printf/pr6534.ml \ +lib-printf/pr6938.ml \ +lib-printf/tprintf.ml \ +lib-queue/test.ml \ +lib-random/chi2.ml \ +lib-random/defaultinit.ml \ +lib-random/parallel.ml \ +lib-random/selfinit.ml \ +lib-random/testvectors.ml \ +lib-result/test.ml \ +lib-runtime-events/test.ml \ +lib-runtime-events/test_caml.ml \ +lib-runtime-events/test_caml_counters.ml \ +lib-runtime-events/test_caml_exception.ml \ +lib-runtime-events/test_caml_parallel.ml \ +lib-runtime-events/test_caml_reentry.ml \ +lib-runtime-events/test_caml_runparams.ml \ +lib-runtime-events/test_caml_slot_reuse.ml \ +lib-runtime-events/test_caml_stubs_gc.ml \ +lib-runtime-events/test_dropped_events.ml \ +lib-runtime-events/test_env_start.ml \ +lib-runtime-events/test_external.ml \ +lib-runtime-events/test_external_preserve.ml \ +lib-runtime-events/test_fork.ml \ +lib-runtime-events/test_instrumented.ml \ +lib-runtime-events/test_user_event.ml \ +lib-runtime-events/test_user_event_unknown.ml \ +lib-scanf/tscanf.ml \ +lib-seq/test.ml \ +lib-set/testmap.ml \ +lib-set/testset.ml \ +lib-stack/test.ml \ +lib-stdlabels/test_stdlabels.ml \ +lib-str/parallel.ml \ +lib-str/t01.ml \ +lib-string/binary.ml \ +lib-string/test_string.ml \ +lib-sync/prodcons.ml \ +lib-sync/trylock.ml \ +lib-sync/trylock2.ml \ +lib-sys/immediate64.ml \ +lib-sys/opaque.ml \ +lib-sys/rename.ml \ +lib-systhreads/boundscheck.ml \ +lib-systhreads/eintr.ml \ +lib-systhreads/multicore_lifecycle.ml \ +lib-systhreads/test_c_thread_register.ml \ +lib-systhreads/testfork.ml \ +lib-systhreads/testfork2.ml \ +lib-systhreads/threadsigmask.ml \ +lib-threads/backtrace_threads.ml \ +lib-threads/bank.ml \ +lib-threads/beat.ml \ +lib-threads/bufchan.ml \ +lib-threads/close.ml \ +lib-threads/fileio.ml \ +lib-threads/mutex_errors.ml \ +lib-threads/pr4466.ml \ +lib-threads/pr5325.ml \ +lib-threads/pr7638.ml \ +lib-threads/pr8857.ml \ +lib-threads/prodcons.ml \ +lib-threads/prodcons2.ml \ +lib-threads/sieve.ml \ +lib-threads/swapchan.ml \ +lib-threads/tls.ml \ +lib-threads/torture.ml \ +lib-uchar/test.ml \ +lib-unix/common/channel_of.ml \ +lib-unix/common/dup.ml \ +lib-unix/common/dup2.ml \ +lib-unix/common/fork_cleanup.ml \ +lib-unix/common/fork_cleanup_systhreads.ml \ +lib-unix/common/getaddrinfo.ml \ +lib-unix/common/gethostbyaddr.ml \ +lib-unix/common/multicore_fork_domain_alone.ml \ +lib-unix/common/multicore_fork_domain_alone2.ml \ +lib-unix/common/pipe_eof.ml \ +lib-unix/common/process_pid.ml \ +lib-unix/common/redirections.ml \ +lib-unix/common/rename.ml \ +lib-unix/common/test_unix_cmdline.ml \ +lib-unix/common/test_unixlabels.ml \ +lib-unix/common/truncate.ml \ +lib-unix/common/uexit.ml \ +lib-unix/common/utimes.ml \ +lib-unix/common/wait_nohang.ml \ +lib-unix/isatty/isatty_std.ml \ +lib-unix/isatty/isatty_tty.ml \ +lib-unix/kill/unix_kill.ml \ +lib-unix/realpath/test.ml \ +lib-unix/unix-execvpe/exec.ml \ +lib-unix/unix-socket/recvfrom_linux.ml \ +lib-unix/unix-socket/recvfrom_unix.ml \ +lib-unix/win-channel-of/parallel_channel_of.ml \ +lib-unix/win-createprocess/test.ml \ +lib-unix/win-env/test_env.ml \ +lib-unix/win-socketpair/test.ml \ +lib-unix/win-stat/test.ml \ +lib-unix/win-symlink/parallel_symlink.ml \ +lib-unix/win-symlink/test.ml \ +link-test/empty.ml \ +link-test/test.ml \ +load_path/test.ml \ +local-functions/tupled.ml \ +local-functions/tupled2.ml \ +locale/test.ml \ +match-exception-warnings/exhaustiveness_warnings.ml \ +match-exception-warnings/no_mixing_under_guard.ml \ +match-exception-warnings/no_value_clauses.ml \ +match-exception-warnings/placement.ml \ +match-exception-warnings/pr7083.ml \ +match-exception-warnings/reachability.ml \ +match-exception/allocation.ml \ +match-exception/exception_propagation.ml \ +match-exception/identifier_sharing.ml \ +match-exception/match_failure.ml \ +match-exception/nested_handlers.ml \ +match-exception/raise_from_success_continuation.ml \ +match-exception/streams.ml \ +match-exception/tail_calls.ml \ +memory-model/forbidden.ml \ +memory-model/publish.ml \ +messages/highlight_tabs.ml \ +messages/precise_locations.ml \ +messages/spellcheck.ml \ +misc-kb/kbmain.ml \ +misc-unsafe/almabench.ml \ +misc-unsafe/fft.ml \ +misc-unsafe/quicksort.ml \ +misc-unsafe/soli.ml \ +misc/bdd.ml \ +misc/boyer.ml \ +misc/exotic.ml \ +misc/fib.ml \ +misc/gc_mark_stack_overflow.ml \ +misc/gcwords.ml \ +misc/gpr1370.ml \ +misc/hamming.ml \ +misc/nucleic.ml \ +misc/pr7168.ml \ +misc/sieve.ml \ +misc/sorts.ml \ +misc/takc.ml \ +misc/taku.ml \ +no-alias-deps/gpr2235.ml \ +output-complete-obj/github9344.ml \ +output-complete-obj/test.ml \ +output-complete-obj/test2.ml \ +parallel/atomics.ml \ +parallel/backup_thread.ml \ +parallel/backup_thread_pipe.ml \ +parallel/constpromote.ml \ +parallel/deadcont.ml \ +parallel/domain_dls.ml \ +parallel/domain_dls2.ml \ +parallel/domain_id.ml \ +parallel/domain_parallel_spawn_burn.ml \ +parallel/domain_parallel_spawn_burn_gc_set.ml \ +parallel/domain_serial_spawn_burn.ml \ +parallel/fib_threads.ml \ +parallel/join.ml \ +parallel/major_gc_wait_backup.ml \ +parallel/mctest.ml \ +parallel/multicore_systhreads.ml \ +parallel/pingpong.ml \ +parallel/poll.ml \ +parallel/prodcons_domains.ml \ +parallel/recommended_domain_count.ml \ +parallel/recommended_domain_count_unix.ml \ +parallel/tak.ml \ +parallel/test_c_thread_register.ml \ +parallel/test_issue_11094.ml \ +parsetree/test.ml \ +parsing/anonymous_class_parameter.ml \ +parsing/change_start_loc.ml \ +parsing/docstrings.ml \ +parsing/extended_indexoperators.ml \ +parsing/extension_operators.ml \ +parsing/multi_indices.ml \ +parsing/pr10468.ml \ +parsing/pr6604_3.ml \ +parsing/reloc.ml \ +ppx-attributes/inline.ml \ +ppx-attributes/warning.ml \ +ppx-contexts/test.ml \ +prim-bigstring/bigstring_access.ml \ +prim-bigstring/string_access.ml \ +prim-bswap/bswap.ml \ +prim-revapply/apply.ml \ +prim-revapply/revapply.ml \ +printing-types/disambiguation.ml \ +printing-types/pr248.ml \ +raise-counts/main.ml \ +regression/gpr1623/gpr1623.ml \ +regression/missing_set_of_closures/missing_set_of_closures.ml \ +regression/pr10611/pr10611.ml \ +regression/pr11887/pr11887.ml \ +regression/pr1580/pr1580.ml \ +regression/pr3612/pr3612.ml \ +regression/pr5233/pr5233.ml \ +regression/pr5757/pr5757.ml \ +regression/pr6024/pr6024.ml \ +regression/pr7042/pr7042.ml \ +regression/pr7426/pr7426.ml \ +regression/pr7718/pr7718.ml \ +regression/pr7798/pr7798.ml \ +regression/pr7920/pr7920.ml \ +regression/pr8769/pr8769.ml \ +regression/pr9028/pr9028.ml \ +regression/pr9292/pr9292.ml \ +regression/pr9326/gc_set.ml \ +regression/pr9443/pr9443.ml \ +regression/pr9853/compaction_corner_case.ml \ +reproducibility/cmis_on_file_system.ml \ +required-external/main.ml \ +runtime-C-exceptions/test.ml \ +runtime-errors/stackoverflow.ml \ +runtime-errors/syserror.ml \ +runtime-objects/Tests.ml \ +self-contained-toplevel/main.ml \ +shadow_include/artificial.ml \ +shadow_include/ghosts.ml \ +shapes/comp_units.ml \ +shapes/functors.ml \ +shapes/incl_md_typeof.ml \ +shapes/open_arg.ml \ +shapes/open_struct.ml \ +shapes/recmodules.ml \ +shapes/rotor_example.ml \ +shapes/shape_size_blowup.ml \ +shapes/simple.ml \ +shapes/typeof_include.ml \ +statmemprof/alloc_counts.ml \ +statmemprof/arrays_in_major.ml \ +statmemprof/arrays_in_minor.ml \ +statmemprof/blocking_in_callback.ml \ +statmemprof/callstacks.ml \ +statmemprof/comballoc.ml \ +statmemprof/custom.ml \ +statmemprof/exception_callback.ml \ +statmemprof/exception_callback_minor.ml \ +statmemprof/intern.ml \ +statmemprof/lists_in_minor.ml \ +statmemprof/minor_no_postpone.ml \ +statmemprof/moved_while_blocking.ml \ +statmemprof/thread_exit_in_callback.ml \ +tmc/ambiguities.ml \ +tmc/other_features.ml \ +tmc/readable_output.ml \ +tmc/semantic.ml \ +tmc/stack_space.ml \ +tmc/tupled_function.ml \ +tmc/usage_warnings.ml \ +tool-caml-tex/ellipses.ml \ +tool-caml-tex/redirections.ml \ +tool-command-line/test-o-one-c-file.ml \ +tool-command-line/test-o-several-files.ml \ +tool-command-line/test-unknown-file.ml \ +tool-debugger/basic/debuggee.ml \ +tool-debugger/dynlink/host.ml \ +tool-debugger/find-artifacts/debuggee.ml \ +tool-debugger/no_debug_event/noev.ml \ +tool-dumpobj/test.ml \ +tool-expect-test/clean_typer.ml \ +tool-lexyacc/calc.ml \ +tool-lexyacc/chars.mll \ +tool-lexyacc/csets.mll \ +tool-lexyacc/mpr7760.mll \ +tool-lexyacc/parsecheck.mly \ +tool-ocaml-annot/failure.ml \ +tool-ocaml-annot/success.ml \ +tool-ocaml-annot/typeonly.ml \ +tool-ocaml/directive_failure.ml \ +tool-ocaml/t000.ml \ +tool-ocaml/t010-const0.ml \ +tool-ocaml/t010-const1.ml \ +tool-ocaml/t010-const2.ml \ +tool-ocaml/t010-const3.ml \ +tool-ocaml/t011-constint.ml \ +tool-ocaml/t020.ml \ +tool-ocaml/t021-pushconst1.ml \ +tool-ocaml/t021-pushconst2.ml \ +tool-ocaml/t021-pushconst3.ml \ +tool-ocaml/t022-pushconstint.ml \ +tool-ocaml/t040-makeblock1.ml \ +tool-ocaml/t040-makeblock2.ml \ +tool-ocaml/t040-makeblock3.ml \ +tool-ocaml/t041-makeblock.ml \ +tool-ocaml/t050-getglobal.ml \ +tool-ocaml/t050-pushgetglobal.ml \ +tool-ocaml/t051-getglobalfield.ml \ +tool-ocaml/t051-pushgetglobalfield.ml \ +tool-ocaml/t060-raise.ml \ +tool-ocaml/t070-branch.ml \ +tool-ocaml/t070-branchif.ml \ +tool-ocaml/t070-branchifnot.ml \ +tool-ocaml/t071-boolnot.ml \ +tool-ocaml/t080-eq.ml \ +tool-ocaml/t080-geint.ml \ +tool-ocaml/t080-gtint.ml \ +tool-ocaml/t080-leint.ml \ +tool-ocaml/t080-ltint.ml \ +tool-ocaml/t080-neq.ml \ +tool-ocaml/t090-acc0.ml \ +tool-ocaml/t090-acc1.ml \ +tool-ocaml/t090-acc2.ml \ +tool-ocaml/t090-acc3.ml \ +tool-ocaml/t090-acc4.ml \ +tool-ocaml/t090-acc5.ml \ +tool-ocaml/t090-acc6.ml \ +tool-ocaml/t090-acc7.ml \ +tool-ocaml/t091-acc.ml \ +tool-ocaml/t092-pushacc.ml \ +tool-ocaml/t092-pushacc0.ml \ +tool-ocaml/t092-pushacc1.ml \ +tool-ocaml/t092-pushacc2.ml \ +tool-ocaml/t092-pushacc3.ml \ +tool-ocaml/t092-pushacc4.ml \ +tool-ocaml/t092-pushacc5.ml \ +tool-ocaml/t092-pushacc6.ml \ +tool-ocaml/t092-pushacc7.ml \ +tool-ocaml/t093-pushacc.ml \ +tool-ocaml/t100-pushtrap.ml \ +tool-ocaml/t101-poptrap.ml \ +tool-ocaml/t110-addint.ml \ +tool-ocaml/t110-andint.ml \ +tool-ocaml/t110-asrint-1.ml \ +tool-ocaml/t110-asrint-2.ml \ +tool-ocaml/t110-divint-1.ml \ +tool-ocaml/t110-divint-2.ml \ +tool-ocaml/t110-divint-3.ml \ +tool-ocaml/t110-lslint.ml \ +tool-ocaml/t110-lsrint.ml \ +tool-ocaml/t110-modint-1.ml \ +tool-ocaml/t110-modint-2.ml \ +tool-ocaml/t110-mulint.ml \ +tool-ocaml/t110-negint.ml \ +tool-ocaml/t110-offsetint.ml \ +tool-ocaml/t110-orint.ml \ +tool-ocaml/t110-subint.ml \ +tool-ocaml/t110-xorint.ml \ +tool-ocaml/t120-getstringchar.ml \ +tool-ocaml/t121-setstringchar.ml \ +tool-ocaml/t130-getvectitem.ml \ +tool-ocaml/t130-vectlength.ml \ +tool-ocaml/t131-setvectitem.ml \ +tool-ocaml/t140-switch-1.ml \ +tool-ocaml/t140-switch-2.ml \ +tool-ocaml/t140-switch-3.ml \ +tool-ocaml/t140-switch-4.ml \ +tool-ocaml/t141-switch-5.ml \ +tool-ocaml/t141-switch-6.ml \ +tool-ocaml/t141-switch-7.ml \ +tool-ocaml/t142-switch-8.ml \ +tool-ocaml/t142-switch-9.ml \ +tool-ocaml/t142-switch-A.ml \ +tool-ocaml/t150-push-1.ml \ +tool-ocaml/t150-push-2.ml \ +tool-ocaml/t160-closure.ml \ +tool-ocaml/t161-apply1.ml \ +tool-ocaml/t162-return.ml \ +tool-ocaml/t163.ml \ +tool-ocaml/t164-apply2.ml \ +tool-ocaml/t164-apply3.ml \ +tool-ocaml/t165-apply.ml \ +tool-ocaml/t170-envacc2.ml \ +tool-ocaml/t170-envacc3.ml \ +tool-ocaml/t170-envacc4.ml \ +tool-ocaml/t171-envacc.ml \ +tool-ocaml/t172-pushenvacc1.ml \ +tool-ocaml/t172-pushenvacc2.ml \ +tool-ocaml/t172-pushenvacc3.ml \ +tool-ocaml/t172-pushenvacc4.ml \ +tool-ocaml/t173-pushenvacc.ml \ +tool-ocaml/t180-appterm1.ml \ +tool-ocaml/t180-appterm2.ml \ +tool-ocaml/t180-appterm3.ml \ +tool-ocaml/t181-appterm.ml \ +tool-ocaml/t190-makefloatblock-1.ml \ +tool-ocaml/t190-makefloatblock-2.ml \ +tool-ocaml/t190-makefloatblock-3.ml \ +tool-ocaml/t191-vectlength.ml \ +tool-ocaml/t192-getfloatfield-1.ml \ +tool-ocaml/t192-getfloatfield-2.ml \ +tool-ocaml/t193-setfloatfield-1.ml \ +tool-ocaml/t193-setfloatfield-2.ml \ +tool-ocaml/t200-getfield0.ml \ +tool-ocaml/t200-getfield1.ml \ +tool-ocaml/t200-getfield2.ml \ +tool-ocaml/t200-getfield3.ml \ +tool-ocaml/t201-getfield.ml \ +tool-ocaml/t210-setfield0.ml \ +tool-ocaml/t210-setfield1.ml \ +tool-ocaml/t210-setfield2.ml \ +tool-ocaml/t210-setfield3.ml \ +tool-ocaml/t211-setfield.ml \ +tool-ocaml/t220-assign.ml \ +tool-ocaml/t230-check_signals.ml \ +tool-ocaml/t240-c_call1.ml \ +tool-ocaml/t240-c_call2.ml \ +tool-ocaml/t240-c_call3.ml \ +tool-ocaml/t240-c_call4.ml \ +tool-ocaml/t240-c_call5.ml \ +tool-ocaml/t250-closurerec-1.ml \ +tool-ocaml/t250-closurerec-2.ml \ +tool-ocaml/t251-pushoffsetclosure0.ml \ +tool-ocaml/t251-pushoffsetclosure2.ml \ +tool-ocaml/t251-pushoffsetclosurem2.ml \ +tool-ocaml/t252-pushoffsetclosure.ml \ +tool-ocaml/t253-offsetclosure0.ml \ +tool-ocaml/t253-offsetclosure2.ml \ +tool-ocaml/t253-offsetclosurem2.ml \ +tool-ocaml/t254-offsetclosure.ml \ +tool-ocaml/t260-offsetref.ml \ +tool-ocaml/t270-push_retaddr.ml \ +tool-ocaml/t300-getmethod.ml \ +tool-ocaml/t301-object.ml \ +tool-ocaml/t310-alloc-1.ml \ +tool-ocaml/t310-alloc-2.ml \ +tool-ocaml/t320-gc-1.ml \ +tool-ocaml/t320-gc-2.ml \ +tool-ocaml/t320-gc-3.ml \ +tool-ocaml/t330-compact-1.ml \ +tool-ocaml/t330-compact-2.ml \ +tool-ocaml/t330-compact-3.ml \ +tool-ocaml/t330-compact-4.ml \ +tool-ocaml/t340-weak.ml \ +tool-ocaml/t350-heapcheck.ml \ +tool-ocaml/t360-stacks-1.ml \ +tool-ocaml/t360-stacks-2.ml \ +tool-ocamlc-compat32/compat32.ml \ +tool-ocamlc-error-cleanup/test.ml \ +tool-ocamlc-open/tool-ocamlc-open-error.ml \ +tool-ocamlc-open/tool-ocamlc-open.ml \ +tool-ocamlc-stop-after/stop_after_lambda.ml \ +tool-ocamlc-stop-after/stop_after_scheduling.ml \ +tool-ocamldep-modalias/main.ml \ +tool-ocamldep-shadowing/a.ml \ +tool-ocamldoc-open/main.ml \ +tool-ocamldoc/Alert_toplevel.mli \ +tool-ocamldoc/Alert_toplevel2.mli \ +tool-ocamldoc/Alerts.mli \ +tool-ocamldoc/Alerts_impl.ml \ +tool-ocamldoc/Documentation_tags.mli \ +tool-ocamldoc/Entities.ml \ +tool-ocamldoc/Extensible_variant.ml \ +tool-ocamldoc/Include_module_type_of.mli \ +tool-ocamldoc/Inline_records.mli \ +tool-ocamldoc/Inline_records_bis.ml \ +tool-ocamldoc/Item_ids.mli \ +tool-ocamldoc/Level_0.mli \ +tool-ocamldoc/Linebreaks.mli \ +tool-ocamldoc/Loop.ml \ +tool-ocamldoc/Module_whitespace.ml \ +tool-ocamldoc/No_preamble.mli \ +tool-ocamldoc/Paragraph.mli \ +tool-ocamldoc/Short_description.txt \ +tool-ocamldoc/Test.mli \ +tool-ocamldoc/Variants.mli \ +tool-ocamldoc/latex_ref.mli \ +tool-ocamldoc/t01.ml \ +tool-ocamldoc/t02.ml \ +tool-ocamldoc/t03.ml \ +tool-ocamldoc/t04.ml \ +tool-ocamldoc/t05.ml \ +tool-ocamlobjinfo/question.ml \ +tool-ocamlopt-save-ir/check_for_pack.ml \ +tool-ocamlopt-save-ir/save_ir_after_scheduling.ml \ +tool-ocamlopt-save-ir/save_ir_after_typing.ml \ +tool-ocamlopt-save-ir/start_from_emit.ml \ +tool-ocamlopt-stop-after/stop_after_lambda.ml \ +tool-ocamlopt-stop-after/stop_after_scheduling.ml \ +tool-ocamltest/norm1.ml \ +tool-ocamltest/norm2.ml \ +tool-ocamltest/norm3.ml \ +tool-ocamltest/norm4.ml \ +tool-toplevel-invocation/test.ml \ +tool-toplevel/exotic_lists.ml \ +tool-toplevel/install_printer.ml \ +tool-toplevel/known-bugs/broken_rec_in_show.ml \ +tool-toplevel/mod_use.ml \ +tool-toplevel/pr6468.ml \ +tool-toplevel/pr7060.ml \ +tool-toplevel/pr7751.ml \ +tool-toplevel/pr9701.ml \ +tool-toplevel/printval.ml \ +tool-toplevel/redefinition_hints.ml \ +tool-toplevel/show.ml \ +tool-toplevel/show_short_paths.ml \ +tool-toplevel/strings.ml \ +tool-toplevel/topeval.ml \ +tool-toplevel/tracing.ml \ +tool-toplevel/uncaught_exceptions.ml \ +tool-toplevel/use_command.ml \ +translprim/array_spec.ml \ +translprim/comparison_table.ml \ +translprim/module_coercion.ml \ +translprim/ref_spec.ml \ +translprim/sendcache.ml \ +typing-core-bugs/const_int_hint.ml \ +typing-core-bugs/missing_rec_hint.ml \ +typing-core-bugs/repeated_did_you_mean.ml \ +typing-core-bugs/type_expected_explanation.ml \ +typing-core-bugs/unit_fun_hints.ml \ +typing-deprecated/alerts.ml \ +typing-deprecated/deprecated.ml \ +typing-extension-constructor/test.ml \ +typing-extensions/cast.ml \ +typing-extensions/disambiguation.ml \ +typing-extensions/extensions.ml \ +typing-extensions/msg.ml \ +typing-extensions/open_types.ml \ +typing-external/pr11392.ml \ +typing-fstclassmod/aliases.ml \ +typing-fstclassmod/fstclassmod.ml \ +typing-fstclassmod/nondep_instance.ml \ +typing-fstclassmod/scope_escape.ml \ +typing-gadts/ambiguity.ml \ +typing-gadts/ambivalent_apply.ml \ +typing-gadts/didier.ml \ +typing-gadts/dynamic_frisch.ml \ +typing-gadts/gadthead.ml \ +typing-gadts/name_existentials.ml \ +typing-gadts/nested_equations.ml \ +typing-gadts/omega07.ml \ +typing-gadts/or_patterns.ml \ +typing-gadts/packed-module-recasting.ml \ +typing-gadts/pr10189.ml \ +typing-gadts/pr10271.ml \ +typing-gadts/pr10348.ml \ +typing-gadts/pr10735.ml \ +typing-gadts/pr10907.ml \ +typing-gadts/pr11888.ml \ +typing-gadts/pr5332.ml \ +typing-gadts/pr5689.ml \ +typing-gadts/pr5785.ml \ +typing-gadts/pr5848.ml \ +typing-gadts/pr5906.ml \ +typing-gadts/pr5948.ml \ +typing-gadts/pr5981.ml \ +typing-gadts/pr5985.ml \ +typing-gadts/pr5989.ml \ +typing-gadts/pr5997.ml \ +typing-gadts/pr6158.ml \ +typing-gadts/pr6163.ml \ +typing-gadts/pr6174.ml \ +typing-gadts/pr6241.ml \ +typing-gadts/pr6690.ml \ +typing-gadts/pr6817.ml \ +typing-gadts/pr6934.ml \ +typing-gadts/pr6980.ml \ +typing-gadts/pr6993_bad.ml \ +typing-gadts/pr7016.ml \ +typing-gadts/pr7160.ml \ +typing-gadts/pr7214.ml \ +typing-gadts/pr7222.ml \ +typing-gadts/pr7230.ml \ +typing-gadts/pr7234.ml \ +typing-gadts/pr7260.ml \ +typing-gadts/pr7269.ml \ +typing-gadts/pr7298.ml \ +typing-gadts/pr7374.ml \ +typing-gadts/pr7378.ml \ +typing-gadts/pr7381.ml \ +typing-gadts/pr7390.ml \ +typing-gadts/pr7391.ml \ +typing-gadts/pr7397.ml \ +typing-gadts/pr7421.ml \ +typing-gadts/pr7432.ml \ +typing-gadts/pr7520.ml \ +typing-gadts/pr7618.ml \ +typing-gadts/pr7747.ml \ +typing-gadts/pr7902.ml \ +typing-gadts/pr9019.ml \ +typing-gadts/pr9759.ml \ +typing-gadts/pr9799.ml \ +typing-gadts/principality-and-gadts.ml \ +typing-gadts/return_type.ml \ +typing-gadts/term-conv.ml \ +typing-gadts/test.ml \ +typing-gadts/unexpected_existentials.ml \ +typing-gadts/unify_mb.ml \ +typing-gadts/variables_in_mcomp.ml \ +typing-gadts/yallop_bugs.ml \ +typing-immediate/immediate.ml \ +typing-implicit_unpack/implicit_unpack.ml \ +typing-kind/kind_mismatch.ml \ +typing-labels/mixin.ml \ +typing-labels/mixin2.ml \ +typing-labels/mixin3.ml \ +typing-misc-bugs/core_array_reduced_ok.ml \ +typing-misc-bugs/gadt_declaration_check.ml \ +typing-misc/apply_non_function.ml \ +typing-misc/build_as_type.ml \ +typing-misc/constraints.ml \ +typing-misc/deep.ml \ +typing-misc/disambiguate_principality.ml \ +typing-misc/distant_errors.ml \ +typing-misc/empty_variant.ml \ +typing-misc/enrich_typedecl.ml \ +typing-misc/exotic_unifications.ml \ +typing-misc/external_arity.ml \ +typing-misc/filter_params.ml \ +typing-misc/gpr2277.ml \ +typing-misc/includeclass_errors.ml \ +typing-misc/injectivity.ml \ +typing-misc/inside_out.ml \ +typing-misc/is_expansive.ml \ +typing-misc/labels.ml \ +typing-misc/normalize_type.ml \ +typing-misc/occur_check.ml \ +typing-misc/optbinders.ml \ +typing-misc/pat_type_sharing.ml \ +typing-misc/pattern_open.ml \ +typing-misc/polyvars.ml \ +typing-misc/pr6416.ml \ +typing-misc/pr6634.ml \ +typing-misc/pr6939-flat-float-array.ml \ +typing-misc/pr6939-no-flat-float-array.ml \ +typing-misc/pr7103.ml \ +typing-misc/pr7228.ml \ +typing-misc/pr7668_bad.ml \ +typing-misc/pr7712.ml \ +typing-misc/pr7937.ml \ +typing-misc/pr8548.ml \ +typing-misc/pr8548_split.ml \ +typing-misc/printing.ml \ +typing-misc/records.ml \ +typing-misc/scope_escape.ml \ +typing-misc/typecore_empty_polyvariant_error.ml \ +typing-misc/typecore_errors.ml \ +typing-misc/typecore_nolabel_errors.ml \ +typing-misc/typetexp_errors.ml \ +typing-misc/unbound_type_variables.ml \ +typing-misc/unique_names_in_unification.ml \ +typing-misc/variance.ml \ +typing-misc/variant.ml \ +typing-misc/wellfounded.ml \ +typing-misc/wrong_kind.ml \ +typing-missing-cmi-2/test.ml \ +typing-missing-cmi-3/user.ml \ +typing-missing-cmi/test.ml \ +typing-modules-bugs/gatien_baron_20131019_ok.ml \ +typing-modules-bugs/pr10661_ok.ml \ +typing-modules-bugs/pr5164_ok.ml \ +typing-modules-bugs/pr51_ok.ml \ +typing-modules-bugs/pr5663_ok.ml \ +typing-modules-bugs/pr5914_ok.ml \ +typing-modules-bugs/pr6240_ok.ml \ +typing-modules-bugs/pr6485_ok.ml \ +typing-modules-bugs/pr6513_ok.ml \ +typing-modules-bugs/pr6572_ok.ml \ +typing-modules-bugs/pr6651_ok.ml \ +typing-modules-bugs/pr6752_ok.ml \ +typing-modules-bugs/pr6899_ok.ml \ +typing-modules-bugs/pr6944_ok.ml \ +typing-modules-bugs/pr6954_ok.ml \ +typing-modules-bugs/pr6981_ok.ml \ +typing-modules-bugs/pr6982_ok.ml \ +typing-modules-bugs/pr6985_extended.ml \ +typing-modules-bugs/pr6985_ok.ml \ +typing-modules-bugs/pr7036_ok.ml \ +typing-modules-bugs/pr7082_ok.ml \ +typing-modules-bugs/pr7112_ok.ml \ +typing-modules-bugs/pr7152_ok.ml \ +typing-modules-bugs/pr7182_ok.ml \ +typing-modules-bugs/pr7305_principal.ml \ +typing-modules-bugs/pr7321_ok.ml \ +typing-modules-bugs/pr7519_ok.ml \ +typing-modules-bugs/pr7601_ok.ml \ +typing-modules-bugs/pr7601a_ok.ml \ +typing-modules/Test.ml \ +typing-modules/aliases.ml \ +typing-modules/anonymous.ml \ +typing-modules/applicative_functor_type.ml \ +typing-modules/extension_constructors_errors_test.ml \ +typing-modules/firstclass.ml \ +typing-modules/functors.ml \ +typing-modules/generative.ml \ +typing-modules/illegal_permutation.ml \ +typing-modules/inclusion_errors.ml \ +typing-modules/inclusion_errors_elision.ml \ +typing-modules/merge_constraint.ml \ +typing-modules/module_type_substitution.ml \ +typing-modules/nondep.ml \ +typing-modules/nondep_private_abbrev.ml \ +typing-modules/nongen.ml \ +typing-modules/normalize_path.ml \ +typing-modules/packed_module_levels.ml \ +typing-modules/pr10298.ml \ +typing-modules/pr10399.ml \ +typing-modules/pr5911.ml \ +typing-modules/pr6394.ml \ +typing-modules/pr6633.ml \ +typing-modules/pr7207.ml \ +typing-modules/pr7348.ml \ +typing-modules/pr7726.ml \ +typing-modules/pr7787.ml \ +typing-modules/pr7818.ml \ +typing-modules/pr7851.ml \ +typing-modules/pr8810.ml \ +typing-modules/pr9384.ml \ +typing-modules/pr9695.ml \ +typing-modules/printing.ml \ +typing-modules/private.ml \ +typing-modules/records_errors_test.ml \ +typing-modules/recursive.ml \ +typing-modules/struct_include_optimisation.ml \ +typing-modules/unroll_private_abbrev.ml \ +typing-modules/variants_errors_test.ml \ +typing-modules/with_ghosts.ml \ +typing-multifile/pr6372.ml \ +typing-multifile/pr7325.ml \ +typing-multifile/pr7563.ml \ +typing-multifile/pr9218.ml \ +typing-objects-bugs/pr4766_ok.ml \ +typing-objects-bugs/pr4824_ok.ml \ +typing-objects-bugs/pr5156_ok.ml \ +typing-objects-bugs/pr7293_ok.ml \ +typing-objects-bugs/woodyatt_ok.ml \ +typing-objects-bugs/yamagata021012_ok.ml \ +typing-objects/Exemples.ml \ +typing-objects/Tests.ml \ +typing-objects/abstract_rows.ml \ +typing-objects/class_2.ml \ +typing-objects/dummy.ml \ +typing-objects/errors.ml \ +typing-objects/field_kind.ml \ +typing-objects/nongen.ml \ +typing-objects/open_in_classes.ml \ +typing-objects/pr11569.ml \ +typing-objects/pr5545.ml \ +typing-objects/pr5619_bad.ml \ +typing-objects/pr5858.ml \ +typing-objects/pr6123_bad.ml \ +typing-objects/pr6383.ml \ +typing-objects/pr6907_bad.ml \ +typing-objects/pr7711_ok.ml \ +typing-objects/self_cannot_be_closed.ml \ +typing-objects/self_cannot_escape_pr7865.ml \ +typing-objects/unbound-type-var.ml \ +typing-poly-bugs/pr5322_ok.ml \ +typing-poly-bugs/pr5673_ok.ml \ +typing-poly-bugs/pr6922_ok.ml \ +typing-poly/error_messages.ml \ +typing-poly/poly.ml \ +typing-poly/pr7636.ml \ +typing-poly/pr9603.ml \ +typing-polyvariants-bugs/pr10664.ml \ +typing-polyvariants-bugs/pr10664a.ml \ +typing-polyvariants-bugs/pr4775_ok.ml \ +typing-polyvariants-bugs/pr4933_ok.ml \ +typing-polyvariants-bugs/pr5057_ok.ml \ +typing-polyvariants-bugs/pr7199_ok.ml \ +typing-polyvariants-bugs/pr7817_bad.ml \ +typing-polyvariants-bugs/pr7824.ml \ +typing-polyvariants-bugs/pr8575.ml \ +typing-polyvariants-bugs/privrowsabate_ok.ml \ +typing-private-bugs/pr5469_ok.ml \ +typing-private/invalid_private_row.ml \ +typing-private/private.ml \ +typing-recmod/gpr1626.ml \ +typing-recmod/pr6491.ml \ +typing-recmod/t03ok.ml \ +typing-recmod/t06ok.ml \ +typing-recmod/t10ok.ml \ +typing-recmod/t13ok.ml \ +typing-recmod/t16ok.ml \ +typing-recmod/t17ok.ml \ +typing-recmod/t18ok.ml \ +typing-recmod/t20ok.ml \ +typing-recmod/t21ok.ml \ +typing-recmod/t22ok.ml \ +typing-recordarg/recordarg.ml \ +typing-shadowing-of-pervasives-submodules/redefine_largefile.ml \ +typing-shadowing-of-pervasives-submodules/redefine_largefile_top.ml \ +typing-short-paths/errors.ml \ +typing-short-paths/gpr1223.ml \ +typing-short-paths/pr6836.ml \ +typing-short-paths/pr7543.ml \ +typing-short-paths/short-paths.ml \ +typing-signatures/els.ml \ +typing-signatures/nondep_regression.ml \ +typing-signatures/pr6371.ml \ +typing-signatures/pr6672.ml \ +typing-sigsubst/sig_local_aliases.ml \ +typing-sigsubst/sigsubst.ml \ +typing-sigsubst/test_locations.ml \ +typing-typeparam/newtype.ml \ +typing-unboxed-types/test.ml \ +typing-unboxed-types/test_flat.ml \ +typing-unboxed-types/test_no_flat.ml \ +typing-unboxed/test.ml \ +typing-warnings/ambiguous_guarded_disjunction.ml \ +typing-warnings/application.ml \ +typing-warnings/coercions.ml \ +typing-warnings/disable_warnings_classes.ml \ +typing-warnings/exhaustiveness.ml \ +typing-warnings/fragile_matching.ml \ +typing-warnings/never_returns.ml \ +typing-warnings/open_warnings.ml \ +typing-warnings/pr5892.ml \ +typing-warnings/pr6587.ml \ +typing-warnings/pr6872.ml \ +typing-warnings/pr7085.ml \ +typing-warnings/pr7115.ml \ +typing-warnings/pr7297.ml \ +typing-warnings/pr7553.ml \ +typing-warnings/pr9244.ml \ +typing-warnings/records.ml \ +typing-warnings/unused_functor_parameter.ml \ +typing-warnings/unused_rec.ml \ +typing-warnings/unused_recmodule.ml \ +typing-warnings/unused_types.ml \ +typing-warnings/warning16.ml \ +unboxed-primitive-args/test.ml \ +unwind/driver.ml \ +utils/edit_distance.ml \ +utils/find_first_mono.ml \ +utils/magic_number.ml \ +utils/overflow_detection.ml \ +utils/test_strongly_connected_components.ml \ +warnings/deprecated_warning_specs.ml \ +warnings/mnemonics.mll \ +warnings/w51.ml \ +warnings/w52.ml \ +warnings/w58.ml \ +weak-ephe-final/ephe_infix.ml \ +weak-ephe-final/ephetest.ml \ +weak-ephe-final/ephetest2.ml \ +weak-ephe-final/ephetest3.ml \ +weak-ephe-final/ephetest_par.ml \ +weak-ephe-final/finaliser.ml \ +weak-ephe-final/finaliser2.ml \ +weak-ephe-final/finaliser_handover.ml \ +weak-ephe-final/pr12001.ml \ +weak-ephe-final/weaklifetime.ml \ +weak-ephe-final/weaklifetime2.ml \ +weak-ephe-final/weaktest.ml \ +weak-ephe-final/weaktest_par_load.ml \ +win-unicode/mltest.ml \ +" + +# These tests have to be translated in `lines` mode to preserve line numbers +TESTS_LINES=" +asmcomp/poll_attr_both.ml \ +asmcomp/poll_attr_prologue.ml \ +asmcomp/poll_attr_user.ml \ +backtrace/backtrace2.ml \ +backtrace/backtrace3.ml \ +backtrace/backtrace_bounds_exn.ml \ +backtrace/backtrace_c_exn.ml \ +backtrace/backtrace_deprecated.ml \ +backtrace/backtrace_dynlink.ml \ +backtrace/backtrace_effects.ml \ +backtrace/backtrace_effects_nested.ml \ +backtrace/backtrace_or_exception.ml \ +backtrace/backtrace_slots.ml \ +backtrace/backtrace_systhreads.ml \ +backtrace/callstack.ml \ +backtrace/event_after_prim.ml \ +backtrace/inline_test.ml \ +backtrace/inline_traversal_test.ml \ +backtrace/methods.ml \ +backtrace/names.ml \ +backtrace/pr2195.ml \ +backtrace/pr6920_why_at.ml \ +backtrace/pr6920_why_swallow.ml \ +backtrace/raw_backtrace.ml \ +basic-modules/anonymous.ml \ +basic-more/morematch.ml \ +basic-more/pr10338.ml \ +basic-more/safer_matching.ml \ +basic/unit_naming.ml \ +effects/backtrace.ml \ +generalized-open/funct_body.ml \ +letrec-check/pr7231.ml \ +letrec-check/pr7706.ml \ +lexing/escape.ml \ +lib-dynlink-initializers/test10_main.ml \ +lib-threads/uncaught_exception_handler.ml \ +local-functions/non_local.ml \ +no-alias-deps/aliases.ml \ +parse-errors/escape_error.ml \ +parse-errors/expecting.ml \ +parse-errors/mismatch_struct_sig.ml \ +parse-errors/pr7847.ml \ +parsing/assert_location.ml \ +parsing/broken_invariants.ml \ +parsing/constructor_declarations.ml \ +parsing/pr6604.ml \ +parsing/pr6604_2.ml \ +parsing/pr7165.ml \ +shadow_include/cannot_shadow_error.ml \ +tmc/partial_application.ml \ +tmc/tupled_function_calls.ml \ +tool-debugger/module_named_main/main.ml \ +tool-debugger/printer/debuggee.ml \ +tool-toplevel/error_highlighting.ml \ +translprim/locs.ml \ +typing-misc-bugs/pr6303_bad.ml \ +typing-misc-bugs/pr6946_bad.ml \ +typing-modules-bugs/pr10693_bad.ml \ +typing-modules-bugs/pr6293_bad.ml \ +typing-modules-bugs/pr6427_bad.ml \ +typing-modules-bugs/pr6752_bad.ml \ +typing-modules-bugs/pr6899_first_bad.ml \ +typing-modules-bugs/pr6899_second_bad.ml \ +typing-modules-bugs/pr6992_bad.ml \ +typing-modules-bugs/pr7112_bad.ml \ +typing-modules-bugs/pr7414_2_bad.ml \ +typing-modules-bugs/pr7414_bad.ml \ +typing-modules-bugs/pr9695_bad.ml \ +typing-objects-bugs/pr3968_bad.ml \ +typing-objects-bugs/pr4018_bad.ml \ +typing-objects-bugs/pr4435_bad.ml \ +typing-objects-bugs/pr4824a_bad.ml \ +typing-objects-bugs/pr7284_bad.ml \ +typing-ocamlc-i/pervasives_leitmotiv.ml \ +typing-ocamlc-i/pr4791.ml \ +typing-ocamlc-i/pr6323.ml \ +typing-ocamlc-i/pr7402.ml \ +typing-ocamlc-i/pr7620_bad.ml \ +typing-polyvariants-bugs-2/pr3918c.ml \ +typing-polyvariants-bugs/pr5057a_bad.ml \ +typing-private-bugs/pr5026_bad.ml \ +typing-recmod/pr9494.ml \ +typing-recmod/t01bad.ml \ +typing-recmod/t02bad.ml \ +typing-recmod/t04bad.ml \ +typing-recmod/t05bad.ml \ +typing-recmod/t07bad.ml \ +typing-recmod/t08bad.ml \ +typing-recmod/t09bad.ml \ +typing-recmod/t11bad.ml \ +typing-recmod/t12bad.ml \ +typing-recmod/t14bad.ml \ +typing-recmod/t15bad.ml \ +typing-rectypes-bugs/pr5343_bad.ml \ +typing-rectypes-bugs/pr6174_bad.ml \ +typing-rectypes-bugs/pr6870_bad.ml \ +typing-safe-linking/b_bad.ml \ +typing-short-paths/pr5918.ml \ +typing-sigsubst/sig_local_aliases_syntax_errors.ml \ +typing-warnings/pr7261.ml \ +warnings/deprecated_module.ml \ +warnings/deprecated_module_assigment.ml \ +warnings/deprecated_module_use.ml \ +warnings/deprecated_mutable.ml \ +warnings/w01.ml \ +warnings/w03.ml \ +warnings/w04.ml \ +warnings/w04_failure.ml \ +warnings/w06.ml \ +warnings/w32.ml \ +warnings/w32b.ml \ +warnings/w33.ml \ +warnings/w45.ml \ +warnings/w47_inline.ml \ +warnings/w50.ml \ +warnings/w51_bis.ml \ +warnings/w53.ml \ +warnings/w54.ml \ +warnings/w55.ml \ +warnings/w59.ml \ +warnings/w60.ml \ +warnings/w68.ml \ +" + +# These tests have to be translated without extra blank lines in order +# to preserve at the same time line numbers and the position of EOF +TESTS_COMPACT=" +parse-errors/unclosed_class_signature.mli \ +parse-errors/unclosed_class_simpl_expr1.ml \ +parse-errors/unclosed_class_simpl_expr2.ml \ +parse-errors/unclosed_class_simpl_expr3.ml \ +parse-errors/unclosed_object.ml \ +parse-errors/unclosed_paren_module_expr1.ml \ +parse-errors/unclosed_paren_module_expr2.ml \ +parse-errors/unclosed_paren_module_expr3.ml \ +parse-errors/unclosed_paren_module_expr4.ml \ +parse-errors/unclosed_paren_module_expr5.ml \ +parse-errors/unclosed_paren_module_type.mli \ +parse-errors/unclosed_sig.mli \ +parse-errors/unclosed_simple_expr.ml \ +parse-errors/unclosed_simple_pattern.ml \ +parse-errors/unclosed_struct.ml \ +parsing/arrow_ambiguity.ml \ +" + +# These tests have to be translated in `chars` mode to preserve char offsets +TESTS_CHARS=" +formatting/test_locations.ml \ +parsetree/locations_test.ml \ +parsing/attributes.ml \ +parsing/extensions.ml \ +parsing/hash_ambiguity.ml \ +parsing/int_and_float_with_modifier.ml \ +parsing/pr6865.ml \ +parsing/quotedextensions.ml \ +parsing/shortcut_ext_attr.ml \ +tool-ocamlc-stop-after/stop_after_parsing_impl.ml \ +tool-ocamlc-stop-after/stop_after_parsing_intf.mli \ +tool-ocamlc-stop-after/stop_after_typing_impl.ml \ +" + +for f in $TESTS_COMMENTS; do + echo comments: $f + ff="testsuite/tests/$f" + echo "$ff:1.1: warning: contains comments, needs to be done by hand" +done + +for f in $TESTS_PLAIN; do + echo plain: $f + ff="testsuite/tests/$f" + ocamltest/ocamltest -translate -compact ../trunk/$ff >$ff +done + +for f in $TESTS_LINES; do + echo lines: $f + ff="testsuite/tests/$f" + ocamltest/ocamltest -translate -compact -keep-lines ../trunk/$ff >$ff +done + +for f in $TESTS_COMPACT; do + echo compact: $f + ff="testsuite/tests/$f" + ocamltest/ocamltest -translate -compact ../trunk/$ff >$ff +done + +for f in $TESTS_CHARS; do + echo chars: $f + ff="testsuite/tests/$f" + ocamltest/ocamltest -translate -compact -keep-chars ../trunk/$ff >$ff +done + +N=$(echo $TESTS_COMMENTS $TESTS_PLAIN $TESTS_COMPACT $TESTS_LINES $TESTS_CHARS \ + | wc -w) +if [ $N -ne 1328 ]; then + printf "Error: wrong number of test files (%d should be 1328)\n" $N + exit 5 +fi diff --git a/toplevel/byte/dune b/toplevel/byte/dune index 9c2afad327e..ac9feaea5bf 100644 --- a/toplevel/byte/dune +++ b/toplevel/byte/dune @@ -18,14 +18,15 @@ (name ocamltoplevel) (wrapped false) (modes byte) - (flags (:standard -principal)) (libraries ocamlcommon ocamlbytecomp) (modules :standard \ topstart expunge)) (rule (targets bytetop) ; This should be generated from the stdlib modules files - (action (run %{ocaml_where}/../../bin/ocamlrun %{exe:../expunge.bc} %{dep:../topstart.bc} %{targets} + (action (run %{ocaml_where}/../../bin/ocamlrun + -I ../../../middle_end/flambda2/numbers/floats + %{exe:../expunge.bc} %{dep:../topstart.bc} %{targets} stdlib__Arg stdlib__Array stdlib__ArrayLabels @@ -45,19 +46,26 @@ stdlib__Char stdlib__Complex stdlib__Digest + stdlib__Domain stdlib__Either + stdlib__Effect stdlib__Ephemeron stdlib__Filename stdlib__Float + stdlib__Float_u stdlib__Format stdlib__Fun stdlib__Gc stdlib__Genlex stdlib__Hashtbl + stdlib__Iarray + stdlib__IarrayLabels stdlib__In_channel stdlib__Int stdlib__Int32 + stdlib__Int32_u stdlib__Int64 + stdlib__Int64_u stdlib__Lazy stdlib__Lexing stdlib__List @@ -66,6 +74,7 @@ stdlib__Marshal stdlib__MoreLabels stdlib__Nativeint + stdlib__Nativeint_u stdlib__Obj stdlib__Oo stdlib__Option diff --git a/toplevel/byte/topeval.ml b/toplevel/byte/topeval.ml index 73b57a7a039..aff4ece288f 100644 --- a/toplevel/byte/topeval.ml +++ b/toplevel/byte/topeval.ml @@ -130,7 +130,7 @@ let execute_phrase print_outcome ppf phr = let sg' = Typemod.Signature_names.simplify newenv sn sg in ignore (Includemod.signatures ~mark:Mark_positive oldenv sg sg'); Typecore.force_delayed_checks (); - let shape = Shape.local_reduce shape in + let shape = Shape_reduce.local_reduce Env.empty shape in if !Clflags.dump_shape then Shape.print ppf shape; let lam = Translmod.transl_toplevel_definition str in Warnings.check_fatal (); diff --git a/toplevel/byte/trace.ml b/toplevel/byte/trace.ml index ec8bbb6b0d0..9c73b09ae9e 100644 --- a/toplevel/byte/trace.ml +++ b/toplevel/byte/trace.ml @@ -61,7 +61,7 @@ let invoke_traced_function codeptr env arg = Meta.invoke_traced_function codeptr env arg let print_label ppf l = - if l <> Asttypes.Nolabel then fprintf ppf "%s:" (Printtyp.string_of_label l) + if l <> Nolabel then fprintf ppf "%s:" (Printtyp.string_of_label l) (* If a function returns a functional value, wrap it into a trace code *) diff --git a/toplevel/dune b/toplevel/dune index 3d6ba57ef16..85f9daab7cc 100644 --- a/toplevel/dune +++ b/toplevel/dune @@ -15,14 +15,13 @@ (executable (name topstart) (modes byte) - (flags (:standard -principal -linkall)) + (flags (:standard -linkall)) (libraries ocamlbytecomp ocamlcommon ocamltoplevel) (modules topstart)) (executable (name expunge) (modes byte) - (flags (:standard -principal)) (libraries ocamlbytecomp ocamlcommon) (modules expunge)) diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 3b99034fea3..006c68de6a8 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -132,6 +132,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct | Generic of Path.t * (int -> (int -> O.t -> Outcometree.out_value, O.t -> Outcometree.out_value) gen_printer) + (* CR mixed blocks v1: It would be good, and not hard, to add proper + printing support for unboxed values. *) let printers = ref ([ ( Pident(Ident.create_local "print_int"), Simple (Predef.type_int, @@ -139,6 +141,9 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct ( Pident(Ident.create_local "print_float"), Simple (Predef.type_float, (fun x -> Oval_float (O.obj x : float))) ); + ( Pident(Ident.create_local "print_float32"), + Simple (Predef.type_float32, + (fun x -> Oval_float32 (O.obj x : Obj.t))) ); ( Pident(Ident.create_local "print_char"), Simple (Predef.type_char, (fun x -> Oval_char (O.obj x : char))) ); @@ -235,6 +240,28 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct (* The main printing function *) + type outval_record_rep = + | Outval_record_boxed + | Outval_record_unboxed + | Outval_record_mixed_block of mixed_product_shape + + type printing_jkind = + | Print_as_value (* can interpret as a value and print *) + | Print_as of string (* can't print *) + + let get_and_default_jkind_for_printing jkind = + let const = Jkind.default_to_value_and_get jkind in + let legacy_layout = Jkind.Const.get_legacy_layout const in + match legacy_layout with + (* CR layouts v3.0: [Value_or_null] should probably require special + printing to avoid descending into NULL. (This module uses + lots of unsafe Obj features.) + *) + | Immediate64 | Immediate | Value | Value_or_null -> Print_as_value + | Void -> Print_as "" + | Any | Any_non_null -> Print_as "" + | Float64 | Float32 | Bits32 | Bits64 | Word -> Print_as "" + let outval_of_value max_steps max_depth check_depth env obj ty = let printer_steps = ref max_steps in @@ -269,9 +296,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct Oval_stuff "" | Tarrow _ -> Oval_stuff "" - | Ttuple(ty_list) -> - let ty_list = List.map (fun t -> (t,false)) ty_list in - Oval_tuple (tree_of_val_list 0 depth obj ty_list) + | Ttuple(labeled_tys) -> + Oval_tuple (tree_of_labeled_val_list 0 depth obj labeled_tys) | Tconstr(path, [ty_arg], _) when Path.same path Predef.path_list -> if O.is_block obj then @@ -430,17 +456,24 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct List.mapi (fun i ty_arg -> (ty_arg, - Jkind.is_void_defaulting cstr_arg_jkinds.(i)) + get_and_default_jkind_for_printing + cstr_arg_jkinds.(i)) ) ty_args in tree_of_constr_with_args (tree_of_constr env path) (Ident.name cd_id) false 0 depth obj ty_args unbx | Cstr_record lbls -> + let rep = + if unbx then + Outval_record_unboxed + else + Outval_record_boxed + in let r = tree_of_record_fields depth env path type_params ty_list - lbls 0 obj unbx + lbls 0 obj rep in Oval_constr(tree_of_constr env path (Out_name.create (Ident.name cd_id)), @@ -452,15 +485,35 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct | None -> let pos = match rep with - | Record_inlined (_, Variant_extensible) -> 1 + | Record_inlined (_, _, Variant_extensible) -> 1 | _ -> 0 in - let unbx = - match rep with Record_unboxed -> true | _ -> false + let rep = + match rep with + | Record_inlined (_, Constructor_mixed _, + Variant_unboxed) -> + Misc.fatal_error + "a 'mixed' unboxed record is impossible" + | Record_inlined (_, Constructor_uniform_value, + Variant_unboxed) + | Record_unboxed + -> Outval_record_unboxed + | Record_boxed _ | Record_float | Record_ufloat + | Record_inlined (_, Constructor_uniform_value, _) + -> Outval_record_boxed + | Record_inlined (_, Constructor_mixed mixed, _) + | Record_mixed mixed + -> + (* Mixed records are only represented as + mixed blocks in native code. + *) + if !Clflags.native_code + then Outval_record_mixed_block mixed + else Outval_record_boxed in tree_of_record_fields depth env path decl.type_params ty_list - lbl_list pos obj unbx + lbl_list pos obj rep end | {type_kind = Type_open} -> tree_of_extension path ty_list depth obj @@ -506,7 +559,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct end and tree_of_record_fields depth env path type_params ty_list - lbl_list pos obj unboxed = + lbl_list pos obj rep = let rec tree_of_fields first pos = function | [] -> [] | {ld_id; ld_type; ld_jkind} :: remainder -> @@ -520,55 +573,81 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct else Oide_ident (Out_name.create name) and v = if is_void then Oval_stuff "" - else if unboxed then - tree_of_val (depth - 1) obj ty_arg - else begin - let fld = - if O.tag obj = O.double_array_tag then - O.repr (O.double_field obj pos) - else - O.field obj pos - in - nest tree_of_val (depth - 1) fld ty_arg - end + else match rep with + | Outval_record_unboxed -> tree_of_val (depth - 1) obj ty_arg + | Outval_record_boxed -> + let fld = + if O.tag obj = O.double_array_tag then + O.repr (O.double_field obj pos) + else + O.field obj pos + in + nest tree_of_val (depth - 1) fld ty_arg + | Outval_record_mixed_block shape -> + let fld = + match Types.get_mixed_product_element shape pos with + | Value_prefix -> `Continue (O.field obj pos) + | Flat_suffix Imm -> `Continue (O.field obj pos) + | Flat_suffix (Float_boxed | Float64) -> + `Continue (O.repr (O.double_field obj pos)) + | Flat_suffix (Float32 | Bits32 | Bits64 | Word) -> + `Stop (Oval_stuff "") + in + match fld with + | `Continue fld -> + nest tree_of_val (depth - 1) fld ty_arg + | `Stop result -> result in let pos = if is_void then pos else pos + 1 in (lid, v) :: tree_of_fields false pos remainder in Oval_record (tree_of_fields (pos = 0) pos lbl_list) + and tree_of_labeled_val_list start depth obj labeled_tys = + let rec tree_list i = function + | [] -> [] + | (label, ty) :: labeled_tys -> + let tree = nest tree_of_val (depth - 1) (O.field obj i) ty in + (label, tree) :: tree_list (i + 1) labeled_tys in + tree_list start labeled_tys + (* CR layouts v4: When we allow other jkinds in tuples, this should be generalized to take a list or array of jkinds, rather than just pairing each type with a bool indicating whether it is void *) and tree_of_val_list start depth obj ty_list = let rec tree_list i = function | [] -> [] - | (_,true) :: ty_list -> Oval_stuff "" :: tree_list i ty_list - | (ty,false) :: ty_list -> + | (_, Print_as msg) :: ty_list -> + Oval_stuff msg :: tree_list i ty_list + | (ty, Print_as_value) :: ty_list -> let tree = nest tree_of_val (depth - 1) (O.field obj i) ty in - tree :: tree_list (i + 1) ty_list in + tree :: tree_list (i + 1) ty_list + in tree_list start ty_list and tree_of_generic_array am depth obj ty_arg = - let oval elts = Oval_array (elts, am) in - let length = O.size obj in - if length > 0 then - match check_depth depth obj ty with - Some x -> x - | None -> - let rec tree_of_items tree_list i = - if !printer_steps < 0 || depth < 0 then - Oval_ellipsis :: tree_list - else if i < length then - let tree = - nest tree_of_val (depth - 1) (O.field obj i) ty_arg - in - tree_of_items (tree :: tree_list) (i + 1) - else tree_list - in - oval (List.rev (tree_of_items [] 0)) + if O.tag obj = Obj.custom_tag then + Oval_stuff "" else - oval [] + let oval elts = Oval_array (elts, am) in + let length = O.size obj in + if length > 0 then + match check_depth depth obj ty with + Some x -> x + | None -> + let rec tree_of_items tree_list i = + if !printer_steps < 0 || depth < 0 then + Oval_ellipsis :: tree_list + else if i < length then + let tree = + nest tree_of_val (depth - 1) (O.field obj i) ty_arg + in + tree_of_items (tree :: tree_list) (i + 1) + else tree_list + in + oval (List.rev (tree_of_items [] 0)) + else + oval [] and tree_of_constr_with_args tree_of_cstr cstr_name inlined start depth obj ty_args unboxed = @@ -576,8 +655,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct let args = if inlined || unboxed then match ty_args with - | [_,true] -> [ Oval_stuff "" ] - | [ty,false] -> [ tree_of_val (depth - 1) obj ty ] + | [_,Print_as msg] -> [ Oval_stuff msg ] + | [ty,Print_as_value] -> [ tree_of_val (depth - 1) obj ty ] | _ -> assert false else tree_of_val_list start depth obj ty_args @@ -619,7 +698,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct in let args = instantiate_types env type_params ty_list cstr.cstr_args in let args = List.mapi (fun i arg -> - (arg, Jkind.is_void_defaulting cstr.cstr_arg_jkinds.(i))) + (arg, get_and_default_jkind_for_printing cstr.cstr_arg_jkinds.(i))) args in tree_of_constr_with_args @@ -639,7 +718,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct with Ctype.Cannot_apply -> abstract_type and instantiate_types env type_params ty_list args = - List.map (fun (ty, _) -> instantiate_type env type_params ty_list ty) args + List.map (fun {ca_type=ty; _} -> instantiate_type env type_params ty_list ty) args and find_printer depth env ty = let rec find = function diff --git a/toplevel/native/dune b/toplevel/native/dune index 4fd78c2c1e6..68f649568ed 100644 --- a/toplevel/native/dune +++ b/toplevel/native/dune @@ -12,55 +12,54 @@ ;* * ;************************************************************************** -(copy_files# ../*.ml*) - -(library - (name ocamltoplevel_native) - (wrapped false) - (modes native) - (flags (:standard -principal)) - (libraries ocamlcommon ocamloptcomp dynlink_internal) - (modules :standard \ topstart expunge)) - -(executable - (name topstart) - (modes native) - (flags (:standard -principal)) - (modules topstart) - (libraries ocamltoplevel_native)) - -(install - (files - (topstart.exe as ocamlnat) - ) - (section bin) - (package ocaml)) - +;(copy_files# ../*.ml*) +; +;(library +; (name ocamltoplevel_native) +; (wrapped false) +; (modes native) +; (libraries ocamlcommon ocamloptcomp dynlink_internal) +; (modules :standard \ topstart expunge)) +; +;(executable +; (name topstart) +; (modes native) +; (modules topstart) +; (libraries ocamltoplevel_native)) +; +;(install +; (files +; (topstart.exe as ocamlnat) +; ) +; (section bin) +; (package ocaml)) ; -; (install -; (files -; (ocamltoplevel.cma as compiler-libs/ocamltoplevel.cma) -; (genprintval.mli as compiler-libs/genprintval.mli) -; (trace.mli as compiler-libs/trace.mli) -; (topdirs.mli as compiler-libs/topdirs.mli) -; (toploop.mli as compiler-libs/toploop.mli) -; (topmain.mli as compiler-libs/topmain.mli) -; (.ocamltoplevel.objs/byte/genprintval.cmi as compiler-libs/genprintval.cmi) -; (.ocamltoplevel.objs/byte/genprintval.cmt as compiler-libs/genprintval.cmt) -; (.ocamltoplevel.objs/byte/genprintval.cmti as compiler-libs/genprintval.cmti) -; (.ocamltoplevel.objs/byte/trace.cmi as compiler-libs/trace.cmi) -; (.ocamltoplevel.objs/byte/trace.cmt as compiler-libs/trace.cmt) -; (.ocamltoplevel.objs/byte/trace.cmti as compiler-libs/trace.cmti) -; (.ocamltoplevel.objs/byte/topdirs.cmi as compiler-libs/topdirs.cmi) -; (.ocamltoplevel.objs/byte/topdirs.cmt as compiler-libs/topdirs.cmt) -; (.ocamltoplevel.objs/byte/topdirs.cmti as compiler-libs/topdirs.cmti) -; (.ocamltoplevel.objs/byte/toploop.cmi as compiler-libs/toploop.cmi) -; (.ocamltoplevel.objs/byte/toploop.cmt as compiler-libs/toploop.cmt) -; (.ocamltoplevel.objs/byte/toploop.cmti as compiler-libs/toploop.cmti) -; (.ocamltoplevel.objs/byte/topmain.cmi as compiler-libs/topmain.cmi) -; (.ocamltoplevel.objs/byte/topmain.cmt as compiler-libs/topmain.cmt) -; (.ocamltoplevel.objs/byte/topmain.cmti as compiler-libs/topmain.cmti) -; ) -; (section lib) -; (package ocaml)) +;; +;; (install +;; (files +;; (ocamltoplevel.cma as compiler-libs/ocamltoplevel.cma) +;; (genprintval.mli as compiler-libs/genprintval.mli) +;; (trace.mli as compiler-libs/trace.mli) +;; (topdirs.mli as compiler-libs/topdirs.mli) +;; (toploop.mli as compiler-libs/toploop.mli) +;; (topmain.mli as compiler-libs/topmain.mli) +;; (.ocamltoplevel.objs/byte/genprintval.cmi as compiler-libs/genprintval.cmi) +;; (.ocamltoplevel.objs/byte/genprintval.cmt as compiler-libs/genprintval.cmt) +;; (.ocamltoplevel.objs/byte/genprintval.cmti as compiler-libs/genprintval.cmti) +;; (.ocamltoplevel.objs/byte/trace.cmi as compiler-libs/trace.cmi) +;; (.ocamltoplevel.objs/byte/trace.cmt as compiler-libs/trace.cmt) +;; (.ocamltoplevel.objs/byte/trace.cmti as compiler-libs/trace.cmti) +;; (.ocamltoplevel.objs/byte/topdirs.cmi as compiler-libs/topdirs.cmi) +;; (.ocamltoplevel.objs/byte/topdirs.cmt as compiler-libs/topdirs.cmt) +;; (.ocamltoplevel.objs/byte/topdirs.cmti as compiler-libs/topdirs.cmti) +;; (.ocamltoplevel.objs/byte/toploop.cmi as compiler-libs/toploop.cmi) +;; (.ocamltoplevel.objs/byte/toploop.cmt as compiler-libs/toploop.cmt) +;; (.ocamltoplevel.objs/byte/toploop.cmti as compiler-libs/toploop.cmti) +;; (.ocamltoplevel.objs/byte/topmain.cmi as compiler-libs/topmain.cmi) +;; (.ocamltoplevel.objs/byte/topmain.cmt as compiler-libs/topmain.cmt) +;; (.ocamltoplevel.objs/byte/topmain.cmti as compiler-libs/topmain.cmti) +;; ) +;; (section lib) +;; (package ocaml)) +;; ; diff --git a/toplevel/native/topeval.ml b/toplevel/native/topeval.ml index 7377159cffb..3ec8944e8da 100644 --- a/toplevel/native/topeval.ml +++ b/toplevel/native/topeval.ml @@ -39,15 +39,17 @@ let global_symbol comp_unit = let remembered = ref Ident.empty -let rec remember phrase_name i = function - | [] -> () - | Sig_value (id, _, _) :: rest - | Sig_module (id, _, _, _, _) :: rest - | Sig_typext (id, _, _, _) :: rest - | Sig_class (id, _, _, _) :: rest -> - remembered := Ident.add id (phrase_name, i) !remembered; - remember phrase_name (succ i) rest - | _ :: rest -> remember phrase_name i rest +let remember phrase_name signature = + let exported = List.filter Includemod.is_runtime_component signature in + List.iteri (fun i sg -> + match sg with + | Sig_value (id, _, _) + | Sig_module (id, _, _, _, _) + | Sig_typext (id, _, _, _) + | Sig_class (id, _, _, _) -> + remembered := Ident.add id (phrase_name, i) !remembered + | _ -> ()) + exported let toplevel_value id = try Ident.find_same id !remembered @@ -130,11 +132,13 @@ let name_expression ~loc ~attrs sort exp = val_kind = Val_reg; val_loc = loc; val_attributes = attrs; - val_uid = Uid.internal_not_actually_unique; } + val_uid = Uid.internal_not_actually_unique; + val_zero_alloc = Default_check } in let sg = [Sig_value(id, vd, Exported)] in let pat = - { pat_desc = Tpat_var(id, mknoloc name, vd.val_uid, Mode.Value.legacy); + { pat_desc = Tpat_var(id, mknoloc name, vd.val_uid, + Mode.Value.disallow_right Mode.Value.legacy); pat_loc = loc; pat_extra = []; pat_type = exp.exp_type; @@ -144,6 +148,7 @@ let name_expression ~loc ~attrs sort exp = let vb = { vb_pat = pat; vb_expr = exp; + vb_rec_kind = Dynamic; vb_sort = sort; vb_attributes = attrs; vb_loc = loc; } @@ -181,7 +186,7 @@ let execute_phrase print_outcome ppf phr = let sg' = Typemod.Signature_names.simplify newenv names sg in ignore (Includemod.signatures oldenv ~mark:Mark_positive sg sg'); Typecore.force_delayed_checks (); - let shape = Shape.local_reduce shape in + let shape = Shape_reduce.local_reduce Env.empty shape in if !Clflags.dump_shape then Shape.print ppf shape; (* `let _ = ` or even just `` require special handling in toplevels, or nothing is displayed. In bytecode, the @@ -210,7 +215,7 @@ let execute_phrase print_outcome ppf phr = Translmod.transl_implementation phrase_comp_unit (str, Tcoerce_none) ~style:Plain_block in - remember compilation_unit 0 sg'; + remember compilation_unit sg'; compilation_unit, close_phrase res, required_globals, size else let size, res = Translmod.transl_store_phrases phrase_comp_unit str in diff --git a/toplevel/native/tophooks.ml b/toplevel/native/tophooks.ml index 3670b784208..59305897841 100644 --- a/toplevel/native/tophooks.ml +++ b/toplevel/native/tophooks.ml @@ -28,7 +28,7 @@ let lookup sym = Dynlink.unsafe_get_global_value ~bytecode_or_asm_symbol:sym let need_symbol sym = - Option.is_none (Dynlink.unsafe_get_global_value ~bytecode_or_asm_symbol:sym) + not (Dynlink.does_symbol_exist ~bytecode_or_asm_symbol:sym) let dll_run dll entry = match (try Result (Obj.magic (ndl_run_toplevel dll entry)) diff --git a/toplevel/topcommon.ml b/toplevel/topcommon.ml index 443fcc64f77..cba2403ca53 100644 --- a/toplevel/topcommon.ml +++ b/toplevel/topcommon.ml @@ -268,18 +268,23 @@ let set_paths ?(auto_include=Compmisc.auto_include) () = but keep the directories that user code linked in with ocamlmktop may have added to load_path. *) let expand = Misc.expand_directory Config.standard_library in - let current_load_path = Load_path.get_paths () in - let load_path = List.concat [ + let Load_path.{ visible; hidden } = Load_path.get_paths () in + let visible = List.concat [ [ "" ]; List.map expand (List.rev !Compenv.first_include_dirs); List.map expand (List.rev !Clflags.include_dirs); List.map expand (List.rev !Compenv.last_include_dirs); - current_load_path; + visible; [expand "+camlp4"]; ] in - Load_path.init ~auto_include load_path; - Dll.add_path load_path + let hidden = List.concat [ + List.map expand (List.rev !Clflags.hidden_include_dirs); + hidden + ] + in + Load_path.init ~auto_include ~visible ~hidden; + Dll.add_path (visible @ hidden) let update_search_path_from_env () = let extra_paths = diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 3c352c0c59b..83238d990cf 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -75,7 +75,7 @@ let _ = add_directive "quit" (Directive_none dir_quit) let dir_directory s = let d = expand_directory Config.standard_library s in Dll.add_path [d]; - let dir = Load_path.Dir.create d in + let dir = Load_path.Dir.create ~hidden:false d in Load_path.prepend_dir dir; toplevel_env := Stdlib.String.Set.fold @@ -110,7 +110,7 @@ let _ = add_directive "remove_directory" (Directive_string dir_remove_directory) } let dir_show_dirs () = - List.iter print_endline (Load_path.get_paths ()) + List.iter print_endline (Load_path.get_path_list ()) let _ = add_directive "show_dirs" (Directive_none dir_show_dirs) { @@ -201,7 +201,7 @@ end let filter_arrow ty = let ty = Ctype.expand_head !toplevel_env ty in match get_desc ty with - | Tarrow ((lbl,_,_), l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) + | Tarrow ((lbl,_,_), l, r, _) when not (Btype.is_omittable lbl) -> Some (l, r) | _ -> None let extract_last_arrow ty = @@ -240,7 +240,7 @@ let match_simple_printer_type desc ~is_old_style = in match Ctype.with_local_level ~post:Ctype.generalize begin fun () -> - let ty_arg = Ctype.newvar (Jkind.value ~why:Debug_printer_argument) in + let ty_arg = Ctype.newvar (Jkind.Primitive.value ~why:Debug_printer_argument) in Ctype.unify !toplevel_env (make_printer_type ty_arg) (Ctype.instance desc.val_type); @@ -259,7 +259,7 @@ let match_generic_printer_type desc ty_path params = match Ctype.with_local_level ~post:(List.iter Ctype.generalize) begin fun () -> let args = List.map (fun _ -> Ctype.newvar - (Jkind.value ~why:Debug_printer_argument)) + (Jkind.Primitive.value ~why:Debug_printer_argument)) params in let ty_target = Ctype.newty (Tconstr (ty_path, args, ref Mnil)) in let printer_args_ty = @@ -430,7 +430,7 @@ let reg_show_prim name to_sig doc = let () = reg_show_prim "show_val" (fun env loc id lid -> - let _path, desc, _, _ = Env.lookup_value ~loc lid env in + let _path, desc, _ = Env.lookup_value ~loc lid env in [ Sig_value (id, desc, Exported) ] ) "Print the signature of the corresponding value." @@ -504,6 +504,7 @@ let () = ext_type_params = type_decl.type_params; ext_args = Cstr_tuple desc.cstr_args; ext_arg_jkinds = desc.cstr_arg_jkinds; + ext_shape = desc.cstr_shape; ext_constant = desc.cstr_constant; ext_ret_type = ret_type; ext_private = Asttypes.Public; @@ -537,6 +538,7 @@ let () = ext_type_params = []; ext_args = Cstr_tuple desc.cstr_args; ext_arg_jkinds = desc.cstr_arg_jkinds; + ext_shape = desc.cstr_shape; ext_constant = desc.cstr_constant; ext_ret_type = ret_type; ext_private = Asttypes.Public; @@ -571,7 +573,7 @@ let secretly_the_same_path env path1 path2 = let () = reg_show_prim "show_module" (fun env loc id lid -> - let path, md = Env.lookup_module ~loc lid env in + let path, md, _ = Env.lookup_module ~loc lid env in let id = match path with | Pident id -> id | _ -> id @@ -622,7 +624,7 @@ let () = let () = reg_show_prim "show_class" (fun env loc id lid -> - let _path, desc_class = Env.lookup_class ~loc lid env in + let _path, desc_class, _ = Env.lookup_class ~loc lid env in let _path, desc_cltype = Env.lookup_cltype ~loc lid env in let _path, typedcl = Env.lookup_type ~loc lid env in [ diff --git a/toplevel/topprinters.ml b/toplevel/topprinters.ml index 4fd517f967f..f37ed2db91a 100644 --- a/toplevel/topprinters.ml +++ b/toplevel/topprinters.ml @@ -19,7 +19,7 @@ type printer_type = Types.type_expr -> Types.type_expr let type_arrow ta tb = let arrow_desc = - Asttypes.Nolabel,Mode.Alloc.legacy,Mode.Alloc.legacy + Types.Nolabel,Mode.Alloc.legacy,Mode.Alloc.legacy in Ctype.newty (Tarrow (arrow_desc, Ctype.newmono ta, tb, Types.commu_var ())) diff --git a/typing/.ocamlformat-enable b/typing/.ocamlformat-enable index a11192df5a8..f677d8b9d6f 100644 --- a/typing/.ocamlformat-enable +++ b/typing/.ocamlformat-enable @@ -1,6 +1,15 @@ jkind.ml jkind.mli -mode.ml -mode.mli +jkind_types.ml +jkind_types.mli +jkind_intf.ml uniqueness_analysis.ml uniqueness_analysis.mli +mode_intf.mli +mode.ml +mode.mli +solver_intf.mli +solver.ml +solver.mli +typemode.mli +typemode.ml diff --git a/typing/btype.ml b/typing/btype.ml index 734dc49b41d..0a063cf8317 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -269,7 +269,7 @@ let fold_type_expr f init ty = | Tarrow (_, ty1, ty2, _) -> let result = f init ty1 in f result ty2 - | Ttuple l -> List.fold_left f init l + | Ttuple l -> List.fold_left f init (List.map snd l) | Tconstr (_, l, _) -> List.fold_left f init l | Tobject(ty, {contents = Some (_, p)}) -> let result = f init ty in @@ -318,11 +318,11 @@ type type_iterators = it_path: Path.t -> unit; } let iter_type_expr_cstr_args f = function - | Cstr_tuple tl -> List.iter (fun (ty, _) -> f ty) tl + | Cstr_tuple tl -> List.iter (fun ca -> f ca.ca_type) tl | Cstr_record lbls -> List.iter (fun d -> f d.ld_type) lbls let map_type_expr_cstr_args f = function - | Cstr_tuple tl -> Cstr_tuple (List.map (fun (ty, gf) -> (f ty, gf)) tl) + | Cstr_tuple tl -> Cstr_tuple (List.map (fun ca -> {ca with ca_type=f ca.ca_type}) tl) | Cstr_record lbls -> Cstr_record (List.map (fun d -> {d with ld_type=f d.ld_type}) lbls) @@ -449,7 +449,7 @@ let rec copy_type_desc ?(keep_names=false) f = function Tvar { jkind; _ } as tv -> if keep_names then tv else Tvar { name=None; jkind } | Tarrow (p, ty1, ty2, c)-> Tarrow (p, f ty1, f ty2, copy_commu c) - | Ttuple l -> Ttuple (List.map f l) + | Ttuple l -> Ttuple (List.map (fun (label, t) -> label, f t) l) | Tconstr (p, l, _) -> Tconstr (p, List.map f l, ref Mnil) | Tobject(ty, {contents = Some (p, tl)}) -> Tobject (f ty, ref (Some(p, List.map f tl))) @@ -578,16 +578,28 @@ let backtrack = backtrack ~cleanup_abbrev (* Utilities for labels *) (**********************************) +let is_optional_parsetree : Parsetree.arg_label -> bool = function + Optional _ -> true + | _ -> false + let is_optional = function Optional _ -> true | _ -> false +let is_position = function Position _ -> true | _ -> false + +let is_omittable = function + Optional _ +| Position _ -> true +| Nolabel | Labelled _ -> false + let label_name = function Nolabel -> "" | Labelled s - | Optional s -> s + | Optional s + | Position s -> s let prefixed_label_name = function Nolabel -> "" - | Labelled s -> "~" ^ s + | Labelled s | Position s -> "~" ^ s | Optional s -> "?" ^ s let rec extract_label_aux hd l = function diff --git a/typing/btype.mli b/typing/btype.mli index b08fe2ce1a5..27d82bffc97 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -251,7 +251,10 @@ val backtrack: snapshot -> unit (**** Utilities for labels ****) +val is_optional_parsetree : Parsetree.arg_label -> bool val is_optional : arg_label -> bool +val is_position : arg_label -> bool +val is_omittable : arg_label -> bool val label_name : arg_label -> label (* Returns the label name with first character '?' or '~' as appropriate. *) diff --git a/typing/cmt2annot.ml b/typing/cmt2annot.ml index beb8e0e34c1..bbf1b1a01d6 100644 --- a/typing/cmt2annot.ml +++ b/typing/cmt2annot.ml @@ -54,6 +54,11 @@ let bind_cases l = ) l +let bind_function_param loc fp = + match fp.fp_kind with + | Tparam_pat pat -> bind_variables loc pat + | Tparam_optional_default (pat, _, _) -> bind_variables loc pat + let record_module_binding scope mb = Stypes.record (Stypes.An_ident (mb.mb_name.loc, @@ -97,9 +102,10 @@ let rec iterator ~scope rebuild_env = bind_bindings body.exp_loc bindings | Texp_match (_, _, f1, _) -> bind_cases f1 - | Texp_function { cases = f; } | Texp_try (_, f) -> bind_cases f + | Texp_function { params; _ } -> + List.iter (bind_function_param exp.exp_loc) params | Texp_letmodule (_, modname, _, _, body ) -> Stypes.record (Stypes.An_ident (modname.loc,Option.value ~default:"_" modname.txt, diff --git a/typing/ctype.ml b/typing/ctype.ml index 9187a02f296..229fef7b8a1 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -20,7 +20,7 @@ open Asttypes open Types open Btype open Errortrace - +open Mode open Local_store module Int = Misc.Stdlib.Int @@ -538,8 +538,8 @@ let remove_mode_and_jkind_variables ty = | Tvar { jkind } -> Jkind.default_to_value jkind | Tunivar { jkind } -> Jkind.default_to_value jkind | Tarrow ((_,marg,mret),targ,tret,_) -> - let _ = Mode.Alloc.constrain_legacy marg in - let _ = Mode.Alloc.constrain_legacy mret in + let _ = Alloc.zap_to_legacy marg in + let _ = Alloc.zap_to_legacy mret in go targ; go tret | _ -> iter_type_expr go ty end @@ -643,8 +643,8 @@ let closed_type_decl decl = have undefaulted sort variables; these lines default them. Test case: typing-layouts-gadt-sort-var/test.ml *) begin match cd_args with - | Cstr_tuple l -> List.iter (fun (ty, _) -> - remove_mode_and_jkind_variables ty) l + | Cstr_tuple l -> List.iter (fun ca -> + remove_mode_and_jkind_variables ca.ca_type) l | Cstr_record l -> List.iter (fun l -> remove_mode_and_jkind_variables l.ld_type) l end; @@ -795,7 +795,7 @@ let rec generalize_spine ty = generalize_spine ty' | Ttuple tyl -> set_level ty generic_level; - List.iter generalize_spine tyl + List.iter (fun (_,t) -> generalize_spine t) tyl | Tpackage (_, fl) -> set_level ty generic_level; List.iter (fun (_n, ty) -> generalize_spine ty) fl @@ -1191,9 +1191,9 @@ let rec copy ?partial ?keep_names copy_scope ty = (* Using jkind "any" is ok here: We're forgetting the type because it will be unified with the original later. *) newty2 ~level:forget - (Tvar { name = None; jkind = Jkind.any ~why:Dummy_jkind }) + (Tvar { name = None; jkind = Jkind.Primitive.any ~why:Dummy_jkind }) else - let t = newstub ~scope:(get_scope ty) (Jkind.any ~why:Dummy_jkind) in + let t = newstub ~scope:(get_scope ty) (Jkind.Primitive.any ~why:Dummy_jkind) in For_copy.redirect_desc copy_scope ty (Tsubst (t, None)); let desc' = match desc with @@ -1263,7 +1263,7 @@ let rec copy ?partial ?keep_names copy_scope ty = if row_closed row && not (is_fixed row) && TypeSet.is_empty (free_univars ty) && not (List.for_all not_reither fields) then - let more' = newvar (Jkind.value ~why:Row_variable) in + let more' = newvar (Jkind.Primitive.value ~why:Row_variable) in (more', create_row ~fields:(List.filter not_reither fields) ~more:more' ~closed:false ~fixed:None ~name:None) @@ -1322,7 +1322,7 @@ let get_new_abstract_name env s = let index = Misc.find_first_mono check in name index -let new_local_type ?(loc = Location.none) ?manifest_and_scope jkind = +let new_local_type ?(loc = Location.none) ?manifest_and_scope jkind ~jkind_annot = let manifest, expansion_scope = match manifest_and_scope with None -> None, Btype.lowest_level @@ -1333,6 +1333,7 @@ let new_local_type ?(loc = Location.none) ?manifest_and_scope jkind = type_arity = 0; type_kind = Type_abstract Abstract_def; type_jkind = jkind; + type_jkind_annotation = jkind_annot; type_private = Public; type_manifest = manifest; type_variance = []; @@ -1343,6 +1344,7 @@ let new_local_type ?(loc = Location.none) ?manifest_and_scope jkind = type_attributes = []; type_unboxed_default = false; type_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); + type_has_illegal_crossings = false; } let existential_name cstr ty = @@ -1366,11 +1368,11 @@ let instance_constructor existential_treatment cstr = let jkind = match get_desc existential with | Tvar { jkind } -> jkind - | Tvariant _ -> Jkind.value ~why:Row_variable + | Tvariant _ -> Jkind.Primitive.value ~why:Row_variable (* Existential row variable *) | _ -> assert false in - let decl = new_local_type jkind in + let decl = new_local_type jkind ~jkind_annot:None in let name = existential_name cstr existential in let (id, new_env) = Env.enter_type (get_new_abstract_name !env name) decl !env @@ -1385,7 +1387,7 @@ let instance_constructor existential_treatment cstr = let ty_ex = List.map copy_existential cstr.cstr_existentials in let ty_res = copy copy_scope cstr.cstr_res in let ty_args = - List.map (fun (ty, gf) -> copy copy_scope ty, gf) cstr.cstr_args + List.map (fun ca -> {ca with ca_type = copy copy_scope ca.ca_type}) cstr.cstr_args in (ty_args, ty_res, ty_ex) ) @@ -1495,13 +1497,13 @@ let copy_sep ~copy_scope ~fixed ~(visited : type_expr TypeHash.t) sch = if is_Tvar ty || may_share && TypeSet.is_empty univars then if get_level ty <> generic_level then ty else (* jkind not consulted during copy_sep, so Any is safe *) - let t = newstub ~scope:(get_scope ty) (Jkind.any ~why:Dummy_jkind) in + let t = newstub ~scope:(get_scope ty) (Jkind.Primitive.any ~why:Dummy_jkind) in add_delayed_copy t ty; t else try TypeHash.find visited ty with Not_found -> begin - let t = newstub ~scope:(get_scope ty) (Jkind.any ~why:Dummy_jkind) in + let t = newstub ~scope:(get_scope ty) (Jkind.Primitive.any ~why:Dummy_jkind) in TypeHash.add visited ty t; let desc' = match get_desc ty with @@ -1514,7 +1516,7 @@ let copy_sep ~copy_scope ~fixed ~(visited : type_expr TypeHash.t) sch = if keep then (add_delayed_copy t ty; Tvar { name = None; - jkind = Jkind.value ~why:Polymorphic_variant }) + jkind = Jkind.Primitive.value ~why:Polymorphic_variant }) else let more' = copy_rec ~may_share:false more in let fixed' = fixed && (is_Tvar more || is_Tunivar more) in @@ -1570,27 +1572,61 @@ let instance_label fixed lbl = ) let prim_mode mvar = function - | Primitive.Prim_global, _ -> Mode.Locality.global - | Primitive.Prim_local, _ -> Mode.Locality.local + | Primitive.Prim_global, _ -> Locality.allow_right Locality.global + | Primitive.Prim_local, _ -> Locality.allow_right Locality.local | Primitive.Prim_poly, _ -> match mvar with | Some mvar -> mvar | None -> assert false +(** Returns a new mode variable whose locality is the given locality, while + all other axes are from the given [m]. This function is too specific to be + put in [mode.ml] *) +let with_locality locality m = + let m' = Alloc.newvar () in + Locality.equate_exn (Alloc.proj (Comonadic Areality) m') locality; + Alloc.submode_exn m' (Alloc.join_with (Comonadic Areality) Locality.Const.max m); + Alloc.submode_exn (Alloc.meet_with (Comonadic Areality) Locality.Const.min m) m'; + m' + +let curry_mode alloc arg : Alloc.Const.t = + let acc = + Alloc.Const.join + (Alloc.Const.close_over arg) + (Alloc.Const.partial_apply alloc) + in + (* For A -> B -> C, we always interpret (B -> C) to be of shared. This is the + legacy mode which helps with legacy compatibility. Arrow types cross + uniqueness so we are not losing too much expressvity here. One + counter-example is: + + let g : (A -> B -> C) = ... + let f (g : A -> unique_ (B -> C)) = ... + + And [f g] would not work, as mode crossing doesn't work deeply into arrows. + Our answer to this issue is that, the author of f shouldn't ask B -> C to be + unique_. Instead, they should leave it as default which is shared, and mode + crossing it to unique at the location where B -> C is a real value (instead + of the return of a function). *) + {acc with uniqueness=Uniqueness.Const.Shared} + let rec instance_prim_locals locals mvar macc finalret ty = match locals, get_desc ty with | l :: locals, Tarrow ((lbl,marg,mret),arg,ret,commu) -> - let marg = Mode.Alloc.with_locality (prim_mode (Some mvar) l) marg in + let marg = with_locality (prim_mode (Some mvar) l) marg in let macc = - Mode.Alloc.join [mret; - Mode.Alloc.close_over marg; - Mode.Alloc.partial_apply macc + Alloc.join [ + Alloc.disallow_right mret; + Alloc.close_over marg; + Alloc.partial_apply macc ] in let mret = match locals with - | [] -> Mode.Alloc.with_locality finalret mret - | _ :: _ -> macc (* curried arrow *) + | [] -> with_locality finalret mret + | _ :: _ -> + let mret', _ = Alloc.newvar_above macc in (* curried arrow *) + mret' in let ret = instance_prim_locals locals mvar macc finalret ret in newty2 ~level:(get_level ty) (Tarrow ((lbl,marg,mret),arg,ret, commu)) @@ -1598,18 +1634,90 @@ let rec instance_prim_locals locals mvar macc finalret ty = | [], _ -> ty +(* This function makes a copy of [ty] if [desc] is marked [prim_is_layout_poly] + AND at least one generic type variable with jkind [any] is present. The + function returns [ty] unchanged otherwise. + + When making the copy, all generic type variables with jkind [any] will be + modified to have a sort var jkind. The same sort var will be used for all + such rewrites. + + The copy should also have the same level information as [ty]. This is done + in three steps: + 1. Change [ty] directly within a copy scope to have the sort var in place of + jkind [any]. + 2. Call [generic_instance] on this modified [ty] to make the actual copy we + return (non-generic & generic levels should be preserved). + 3. Exit the copy scope thus restoring [ty] to its original state. + + No non-generic type variables should be present in [ty] due to it being the + type of an external declaration. However, the code is written without + relaying this assumption. *) +let instance_prim_layout (desc : Primitive.description) ty = + if not desc.prim_is_layout_poly + then ty, None + else + let new_sort_and_jkind = ref None in + let get_jkind () = + (* CR layouts v2.8: This should replace only the layout component of the + jkind. It's possible that we might want a primitive that accepts a + mode-crossing, layout-polymorphic parameter. *) + match !new_sort_and_jkind with + | Some (_, jkind) -> + jkind + | None -> + let jkind, sort = + Jkind.of_new_sort_var ~why:Layout_poly_in_external + in + new_sort_and_jkind := Some (sort, jkind); + jkind + in + For_copy.with_scope (fun copy_scope -> + let rec inner ty = + let level = get_level ty in + (* only change type vars on generic_level to avoid modifying ones captured + from an outer scope *) + if level = generic_level && try_mark_node ty then begin + begin match get_desc ty with + | Tvar ({ jkind; _ } as r) when Jkind.has_layout_any jkind -> + For_copy.redirect_desc copy_scope ty + (Tvar {r with jkind = get_jkind ()}) + | Tunivar ({ jkind; _ } as r) when Jkind.has_layout_any jkind -> + For_copy.redirect_desc copy_scope ty + (Tunivar {r with jkind = get_jkind ()}) + | _ -> () + end; + iter_type_expr inner ty + end + in + inner ty; + unmark_type ty; + match !new_sort_and_jkind with + | Some (sort, _) -> + (* We don't want to lower the type vars from generic_level due to usages + in [includecore.ml]. This means an extra [instance] call is needed in + [type_ident], but we only hit it if it's layout polymorphic. *) + generic_instance ty, Some sort + | None -> ty, None) + + let instance_prim_mode (desc : Primitive.description) ty = let is_poly = function Primitive.Prim_poly, _ -> true | _ -> false in if is_poly desc.prim_native_repr_res || List.exists is_poly desc.prim_native_repr_args then - let mode = Mode.Locality.newvar () in + let mode = Locality.newvar () in let finalret = prim_mode (Some mode) desc.prim_native_repr_res in instance_prim_locals desc.prim_native_repr_args - mode Mode.Alloc.legacy finalret ty, + mode (Alloc.disallow_right Alloc.legacy) finalret ty, Some mode else ty, None +let instance_prim (desc : Primitive.description) ty = + let ty, sort = instance_prim_layout desc ty in + let ty, mode = instance_prim_mode desc ty in + ty, mode, sort + (**** Instantiation with parameter substitution ****) (* NB: since this is [unify_var], it raises [Unify], not [Unify_trace] *) @@ -1620,7 +1728,7 @@ let subst env level priv abbrev oty params args body = if List.length params <> List.length args then raise Cannot_subst; let old_level = !current_level in current_level := level; - let body0 = newvar (Jkind.any ~why:Dummy_jkind) in (* Stub *) + let body0 = newvar (Jkind.Primitive.any ~why:Dummy_jkind) in (* Stub *) let undo_abbrev = match oty with | None -> fun () -> () (* No abbreviation added *) @@ -1907,8 +2015,11 @@ let expand_head_opt env ty = type unbox_result = - | Unboxed of type_expr - | Not_unboxed of type_expr + (* unboxing process made a step: either an unboxing or removal of a [Tpoly] *) + | Stepped of type_expr + (* no step to make; we're all done here *) + | Final_result of type_expr + (* definition not in environment: missing cmi *) | Missing of Path.t (* We use expand_head_opt version of expand_head to get access @@ -1921,13 +2032,14 @@ let unbox_once env ty = | exception Not_found -> Missing p | decl -> begin match find_unboxed_type decl with - | None -> Not_unboxed ty + | None -> Final_result ty | Some ty2 -> let ty2 = match get_desc ty2 with Tpoly (t, _) -> t | _ -> ty2 in - Unboxed (apply env decl.type_params ty2 args) + Stepped (apply env decl.type_params ty2 args) end end - | _ -> Not_unboxed ty + | Tpoly (ty, _) -> Stepped ty + | _ -> Final_result ty (* We use ty_prev to track the last type for which we found a definition, allowing us to return a type for which a definition was found even if @@ -1935,9 +2047,9 @@ let unbox_once env ty = let rec get_unboxed_type_representation env ty_prev ty fuel = if fuel < 0 then Error ty else match unbox_once env ty with - | Unboxed ty2 -> + | Stepped ty2 -> get_unboxed_type_representation env ty ty2 (fuel - 1) - | Not_unboxed ty2 -> Ok ty2 + | Final_result ty2 -> Ok ty2 | Missing _ -> Ok ty_prev let get_unboxed_type_representation env ty = @@ -1987,105 +2099,157 @@ let rec estimate_type_jkind env ty = try Jkind (Env.find_type p env).type_jkind with - Not_found -> Jkind (any ~why:(Missing_cmi p)) + Not_found -> Jkind (Primitive.any ~why:(Missing_cmi p)) end | Tvariant row -> if tvariant_not_immediate row - then Jkind (value ~why:Polymorphic_variant) - else Jkind (immediate ~why:Immediate_polymorphic_variant) + then Jkind (Primitive.value ~why:Polymorphic_variant) + else Jkind (Primitive.immediate ~why:Immediate_polymorphic_variant) + | Tvar { jkind } when get_level ty = generic_level -> + (* Once a Tvar gets generalized with a jkind, it should be considered + as fixed (similar to the Tunivar case below). + + This notably prevents [constrain_type_jkind] from changing layout + [any] to a sort or changing the externality once the Tvar gets + generalized. + + This, however, still allows sort variables to get instantiated. *) + Jkind jkind | Tvar { jkind } -> TyVar (jkind, ty) - | Tarrow _ -> Jkind (value ~why:Arrow) - | Ttuple _ -> Jkind (value ~why:Tuple) - | Tobject _ -> Jkind (value ~why:Object) - | Tfield _ -> Jkind (value ~why:Tfield) - | Tnil -> Jkind (value ~why:Tnil) + | Tarrow _ -> Jkind (Primitive.value ~why:Arrow) + | Ttuple _ -> Jkind (Primitive.value ~why:Tuple) + | Tobject _ -> Jkind (Primitive.value ~why:Object) + | Tfield _ -> Jkind (Primitive.value ~why:Tfield) + | Tnil -> Jkind (Primitive.value ~why:Tnil) | (Tlink _ | Tsubst _) -> assert false | Tunivar { jkind } -> Jkind jkind | Tpoly (ty, _) -> estimate_type_jkind env ty - | Tpackage _ -> Jkind (value ~why:First_class_module) + | Tpackage _ -> Jkind (Primitive.value ~why:First_class_module) +(**** checking jkind relationships ****) + +type type_jkind_sub_result = + | Success + (* The [Type_var] case might still be "success"; caller should check. + We don't just report success here because if the caller unifies the + tyvar, error messages improve. *) + | Type_var of Jkind.t * type_expr + | Missing_cmi of Jkind.t * Path.t + | Failure of Jkind.t + +let type_jkind_sub env ty jkind = + let shallow_check ty = + match estimate_type_jkind env ty with + | Jkind ty_jkind -> + if Jkind.sub ty_jkind jkind then Success else Failure ty_jkind + | TyVar (ty_jkind, ty) -> Type_var (ty_jkind, ty) + in + (* The "fuel" argument here is used because we're duplicating the loop of + `get_unboxed_type_representation`, but performing jkind checking at each + step. This allows to check examples like: + + type 'a t = 'a list + type s = { lbl : s t } [@@unboxed] + + Here, we want to see [s t] has jkind value, and this only requires + expanding once to see [t] is list and [s] is irrelevant. But calling + [get_unboxed_type_representation] itself would otherwise get into a nasty + loop trying to also expand [s], and then performing jkind checking to + ensure it's a valid argument to [t]. (We believe there are still loops + like this that can occur, though, and may need a more principled solution + later). *) + let rec loop ty fuel = + (* This is an optimization to avoid unboxing if we can tell the constraint + is satisfied from the type_kind *) + match get_desc ty with + | Tconstr(p, _args, _abbrev) -> + let jkind_bound = + try (Env.find_type p env).type_jkind + with Not_found -> Jkind.Primitive.any ~why:(Missing_cmi p) + in + if Jkind.sub jkind_bound jkind + then Success + else if fuel < 0 then Failure jkind_bound + else begin match unbox_once env ty with + | Final_result ty -> shallow_check ty + | Stepped ty -> loop ty (fuel - 1) + | Missing missing_cmi_for -> + Missing_cmi (jkind_bound, missing_cmi_for) + end + | Tpoly (ty, _) -> loop ty fuel + | _ -> shallow_check ty + in + loop ty 100 (* The ~fixed argument controls what effects this may have on `ty`. If false, then we will update the jkind of type variables to make the check true, if possible. If true, we won't (but will still instantiate sort variables). - The "fuel" argument here is used because we're duplicating the loop of - `get_unboxed_type_representation`, but performing jkind checking at each - step. This allows to check examples like: - - type 'a t = 'a list - type s = { lbl : s t } [@@unboxed] - - Here, we want to see [s t] has jkind value, and this only requires expanding - once to see [t] is list and [s] is irrelvant. But calling - [get_unboxed_type_representation] itself would otherwise get into a nasty - loop trying to also expand [s], and then performing jkind checking to ensure - it's a valid argument to [t]. (We believe there are still loops like this - that can occur, though, and may need a more principled solution later). - Precondition: [jkind] is not [any]. This common case is short-circuited before calling this function. (Though the current implementation is still correct on [any].) *) -let rec constrain_type_jkind ~fixed env ty jkind fuel = - let constrain_unboxed ty = - match estimate_type_jkind env ty with - | Jkind ty_jkind -> Jkind.sub ty_jkind jkind - | TyVar (ty_jkind, ty) -> - if fixed then Jkind.sub ty_jkind jkind - else - let jkind_inter = - Jkind.intersection ~reason:Tyvar_refinement_intersection - ty_jkind jkind - in - Result.map (set_var_jkind ty) jkind_inter - in - (* This is an optimization to avoid unboxing if we can tell the constraint is - satisfied from the type_kind *) - match get_desc ty with - | Tconstr(p, _args, _abbrev) -> begin - let jkind_bound = - try (Env.find_type p env).type_jkind - with Not_found -> Jkind.any ~why:(Missing_cmi p) - in - match Jkind.sub jkind_bound jkind with - | Ok () as ok -> ok - | Error _ as err when fuel < 0 -> err - | Error violation -> - begin match unbox_once env ty with - | Not_unboxed ty -> constrain_unboxed ty - | Unboxed ty -> - constrain_type_jkind ~fixed env ty jkind (fuel - 1) - | Missing missing_cmi_for -> - Error (Jkind.Violation.record_missing_cmi ~missing_cmi_for violation) - end - end - | Tpoly (ty, _) -> constrain_type_jkind ~fixed env ty jkind fuel - | _ -> constrain_unboxed ty - -let constrain_type_jkind ~fixed env ty jkind fuel = +let constrain_type_jkind ~fixed env ty jkind = + match type_jkind_sub env ty jkind with + | Success -> Ok () + | Type_var (ty_jkind, ty) -> + if fixed then Jkind.sub_or_error ty_jkind jkind else + let jkind_inter = + Jkind.intersection_or_error ~reason:Tyvar_refinement_intersection + ty_jkind jkind + in + Result.map (set_var_jkind ty) jkind_inter + | Missing_cmi (ty_jkind, missing_cmi) -> + Error Jkind.(Violation.of_ ~missing_cmi + (Not_a_subjkind + (History.update_reason ty_jkind (Missing_cmi missing_cmi), jkind))) + | Failure ty_jkind -> + Error (Jkind.Violation.of_ (Not_a_subjkind (ty_jkind, jkind))) + +let constrain_type_jkind ~fixed env ty jkind = (* An optimization to avoid doing any work if we're checking against any. *) - if Jkind.is_any jkind then Ok () - else constrain_type_jkind ~fixed env ty jkind fuel + if Jkind.is_max jkind then Ok () + else constrain_type_jkind ~fixed env ty jkind let check_type_jkind env ty jkind = - constrain_type_jkind ~fixed:true env ty jkind 100 + constrain_type_jkind ~fixed:true env ty jkind let constrain_type_jkind env ty jkind = - constrain_type_jkind ~fixed:false env ty jkind 100 + constrain_type_jkind ~fixed:false env ty jkind let () = Env.constrain_type_jkind := constrain_type_jkind +let check_type_externality env ty ext = + let upper_bound = + Jkind.set_externality_upper_bound (Jkind.Primitive.any ~why:Dummy_jkind) ext + in + match check_type_jkind env ty upper_bound with + | Ok () -> true + | Error _ -> false + let check_decl_jkind env decl jkind = - match Jkind.sub decl.type_jkind jkind with + match Jkind.sub_or_error decl.type_jkind jkind with | Ok () as ok -> ok | Error _ as err -> match decl.type_manifest with | None -> err | Some ty -> check_type_jkind env ty jkind +let constrain_decl_jkind env decl jkind = + match Jkind.sub_or_error decl.type_jkind jkind with + | Ok () as ok -> ok + | Error _ as err -> + match decl.type_manifest with + | None -> err + | Some ty -> constrain_type_jkind env ty jkind + +let check_type_jkind_exn env texn ty jkind = + match check_type_jkind env ty jkind with + | Ok _ -> () + | Error err -> raise_for texn (Bad_jkind (ty,err)) + let constrain_type_jkind_exn env texn ty jkind = match constrain_type_jkind env ty jkind with | Ok _ -> () @@ -2097,12 +2261,29 @@ let estimate_type_jkind env typ = let type_jkind env ty = estimate_type_jkind env (get_unboxed_type_approximation env ty) +let type_jkind_purely env ty = + if !Clflags.principal || Env.has_local_constraints env then + (* We snapshot to keep this pure; see the test in [typing-local/crossing.ml] + that mentions snapshotting for an example. *) + let snap = Btype.snapshot () in + let jkind = type_jkind env ty in + Btype.backtrack snap; + jkind + else + type_jkind env ty + let type_sort ~why env ty = let jkind, sort = Jkind.of_new_sort_var ~why in match constrain_type_jkind env ty jkind with | Ok _ -> Ok sort | Error _ as e -> e +let type_legacy_sort ~why env ty = + let jkind, sort = Jkind.of_new_legacy_sort_var ~why in + match constrain_type_jkind env ty jkind with + | Ok _ -> Ok sort + | Error _ as e -> e + (* Note: Because [estimate_type_jkind] actually returns an upper bound, this function computes an inaccurate intersection in some cases. @@ -2120,7 +2301,7 @@ let rec intersect_type_jkind ~reason env ty1 jkind2 = (* [intersect_type_jkind] is called rarely, so we don't bother with trying to avoid this call as in [constrain_type_jkind] *) let ty1 = get_unboxed_type_approximation env ty1 in - Jkind.intersection ~reason (estimate_type_jkind env ty1) jkind2 + Jkind.intersection_or_error ~reason (estimate_type_jkind env ty1) jkind2 (* See comment on [jkind_unification_mode] *) let unification_jkind_check env ty jkind = @@ -2129,31 +2310,57 @@ let unification_jkind_check env ty jkind = | Delay_checks r -> r := (ty,jkind) :: !r | Skip_checks -> () -let is_principal ty = - not !Clflags.principal || get_level ty = generic_level - -let is_immediate64 env ty = - let perform_check () = - Result.is_ok (check_type_jkind env ty - (Jkind.immediate64 ~why:Local_mode_cross_check)) +let check_and_update_generalized_ty_jkind ?name ~loc ty = + let immediacy_check jkind = + let is_immediate jkind = + (* Just check externality and layout, because that's what actually matters + for upstream code. We check both for a known value and something that + might turn out later to be value. This is the conservative choice. *) + Jkind.(Externality.le (get_externality_upper_bound jkind) External64 && + match get_layout jkind with + | Some (Sort Value) | None -> true + | _ -> false) + in + if Language_extension.erasable_extensions_only () + && is_immediate jkind && not (Jkind.History.has_warned jkind) + then + let id = + match name with + | Some id -> Ident.name id + | None -> "" + in + Location.prerr_warning loc (Warnings.Incompatible_with_upstream + (Warnings.Immediate_erasure id)); + Jkind.History.with_warning jkind + else jkind in - if !Clflags.principal || Env.has_local_constraints env then - (* We snapshot to keep this pure; see the mode crossing test that mentions - snapshotting for an example. *) - let snap = Btype.snapshot () in - let result = perform_check () in - Btype.backtrack snap; - result - else - perform_check () - -(* We will require Int63 to be [global many unique] on 32-bit platforms, so - this is fine *) -let is_immediate = is_immediate64 + let generalization_check level jkind = + if level = generic_level then + Jkind.History.(update_reason jkind (Generalized (name, loc))) + else jkind + in + let rec inner ty = + let level = get_level ty in + if try_mark_node ty then begin + begin match get_desc ty with + | Tvar ({ jkind; _ } as r) -> + let new_jkind = immediacy_check jkind in + let new_jkind = generalization_check level new_jkind in + set_type_desc ty (Tvar {r with jkind = new_jkind}) + | Tunivar ({ jkind; _ } as r) -> + let new_jkind = immediacy_check jkind in + let new_jkind = generalization_check level new_jkind in + set_type_desc ty (Tunivar {r with jkind = new_jkind}) + | _ -> () + end; + iter_type_expr inner ty + end + in + inner ty; + unmark_type ty -let mode_cross env (ty : type_expr) = - (* immediates can cross all mode axes: locality, uniqueness and linearity *) - is_principal ty && is_immediate env ty +let is_principal ty = + not !Clflags.principal || get_level ty = generic_level (* Recursively expand the head of a type. Also expand #-types. @@ -2321,7 +2528,14 @@ let local_non_recursive_abbrev env p ty = (* Since we cannot duplicate universal variables, unification must be done at meta-level, using bindings in univar_pairs *) (* TODO: use find_opt *) -let rec unify_univar t1 t2 = function +(* Invariant: [jkind1] and [jkind2] (newly added) have to be the + jkinds of Tunivar [t1] and [t2] respectively. + + They carry redundant information but are added to save two calls to + [get_desc] which are usually performed already at the call site. *) +let unify_univar t1 t2 jkind1 jkind2 pairs = + if not (Jkind.equal jkind1 jkind2) then raise Cannot_unify_universal_variables; + let rec inner t1 t2 = function (cl1, cl2) :: rem -> let find_univ t cl = try @@ -2335,16 +2549,18 @@ let rec unify_univar t1 t2 = function | Some({contents=None} as r1), Some({contents=None} as r2) -> set_univar r1 t2; set_univar r2 t1 | None, None -> - unify_univar t1 t2 rem + inner t1 t2 rem | _ -> raise Cannot_unify_universal_variables end | [] -> raise Cannot_unify_universal_variables + in + inner t1 t2 pairs (* The same as [unify_univar], but raises the appropriate exception instead of [Cannot_unify_universal_variables] *) -let unify_univar_for tr_exn t1 t2 univar_pairs = - try unify_univar t1 t2 univar_pairs +let unify_univar_for tr_exn t1 t2 jkind1 jkind2 univar_pairs = + try unify_univar t1 t2 jkind1 jkind2 univar_pairs with Cannot_unify_universal_variables -> raise_unexplained_for tr_exn (* Test the occurrence of free univars in a type *) @@ -2601,7 +2817,7 @@ let reify env t = let fresh_constr_scope = get_gadt_equations_level () in let create_fresh_constr lev name jkind = let name = match name with Some s -> "$'"^s | _ -> "$" in - let decl = new_local_type jkind in + let decl = new_local_type jkind ~jkind_annot:None in let (id, new_env) = Env.enter_type (get_new_abstract_name !env name) decl !env ~scope:fresh_constr_scope in @@ -2669,7 +2885,7 @@ let non_aliasable p decl = 2) It restricts gadt equations on pervasives, which a hacky implementation of the fact that every type in the initial environment is incompatible with - every other type. But its fine to refine the jkind of these types (and we + every other type. But it's fine to refine the jkind of these types (and we want to in some cases, like giving int32 the jkind immediate64 on appropriate platforms). @@ -2706,6 +2922,15 @@ let rec expands_to_datatype env ty = end | _ -> false +let equivalent_with_nolabels l1 l2 = + l1 = l2 || (match l1, l2 with + | (Nolabel | Labelled _), (Nolabel | Labelled _) -> true + | _ -> false) + +(* the [tk] means we're comparing a type against a jkind *) +let has_jkind_intersection_tk env ty jkind = + Jkind.has_intersection (type_jkind env ty) jkind + (* [mcomp] tests if two types are "compatible" -- i.e., if they could ever unify. (This is distinct from [eqtype], which checks if two types *are* exactly the same.) This is used to decide whether GADT cases are @@ -2720,13 +2945,14 @@ let rec expands_to_datatype env ty = *) let rec mcomp type_pairs env t1 t2 = + let check_jkinds ty jkind = + if not (has_jkind_intersection_tk env ty jkind) then raise Incompatible + in if eq_type t1 t2 then () else - match (get_desc t1, get_desc t2) with - | (Tvar _, _) - | (_, Tvar _) -> - () - (* CR layouts: This could be made more precise based on jkinds *) - | (Tconstr (p1, [], _), Tconstr (p2, [], _)) when Path.same p1 p2 -> + match (get_desc t1, get_desc t2, t1, t2) with + | (Tvar { jkind }, _, _, other) + | (_, Tvar { jkind }, other, _) -> check_jkinds other jkind + | (Tconstr (p1, [], _), Tconstr (p2, [], _), _, _) when Path.same p1 p2 -> () | _ -> let t1' = expand_head_opt env t1 in @@ -2735,26 +2961,26 @@ let rec mcomp type_pairs env t1 t2 = if eq_type t1' t2' then () else if not (TypePairs.mem type_pairs (t1', t2')) then begin TypePairs.add type_pairs (t1', t2'); - match (get_desc t1', get_desc t2') with - | (Tvar _, _) - | (_, Tvar _) -> - () - | (Tarrow ((l1,_,_), t1, u1, _), Tarrow ((l2,_,_), t2, u2, _)) - when l1 = l2 || not (is_optional l1 || is_optional l2) -> + match (get_desc t1', get_desc t2', t1', t2') with + | (Tvar { jkind }, _, _, other) + | (_, Tvar { jkind }, other, _) -> check_jkinds other jkind + | (Tarrow ((l1,_,_), t1, u1, _), Tarrow ((l2,_,_), t2, u2, _), _, _) + when equivalent_with_nolabels l1 l2 -> mcomp type_pairs env t1 t2; mcomp type_pairs env u1 u2; - | (Ttuple tl1, Ttuple tl2) -> - mcomp_list type_pairs env tl1 tl2 - | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) -> + | (Ttuple tl1, Ttuple tl2, _, _) -> + mcomp_labeled_list type_pairs env tl1 tl2 + | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _), _, _) -> mcomp_type_decl type_pairs env p1 p2 tl1 tl2 - | (Tconstr (_, [], _), _) when has_injective_univars env t2' -> + | (Tconstr (_, [], _), _, _, _) when has_injective_univars env t2' -> raise_unexplained_for Unify - | (_, Tconstr (_, [], _)) when has_injective_univars env t1' -> + | (_, Tconstr (_, [], _), _, _) when has_injective_univars env t1' -> raise_unexplained_for Unify - | (Tconstr (p, _, _), _) | (_, Tconstr (p, _, _)) -> + | (Tconstr (p, _, _), _, _, other) | (_, Tconstr (p, _, _), other, _) -> begin try let decl = Env.find_type p env in - if non_aliasable p decl || is_datatype decl then + if non_aliasable p decl || is_datatype decl || + not (has_jkind_intersection_tk env other decl.type_jkind) then raise Incompatible with Not_found -> () end @@ -2762,26 +2988,26 @@ let rec mcomp type_pairs env t1 t2 = | (Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2)) when n1 = n2 -> mcomp_list type_pairs env tl1 tl2 *) - | (Tpackage _, Tpackage _) -> () - | (Tvariant row1, Tvariant row2) -> + | (Tpackage _, Tpackage _, _, _) -> () + | (Tvariant row1, Tvariant row2, _, _) -> mcomp_row type_pairs env row1 row2 - | (Tobject (fi1, _), Tobject (fi2, _)) -> + | (Tobject (fi1, _), Tobject (fi2, _), _, _) -> mcomp_fields type_pairs env fi1 fi2 - | (Tfield _, Tfield _) -> (* Actually unused *) + | (Tfield _, Tfield _, _, _) -> (* Actually unused *) mcomp_fields type_pairs env t1' t2' - | (Tnil, Tnil) -> + | (Tnil, Tnil, _, _) -> () - | (Tpoly (t1, []), Tpoly (t2, [])) -> + | (Tpoly (t1, []), Tpoly (t2, []), _, _) -> mcomp type_pairs env t1 t2 - | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> + | (Tpoly (t1, tl1), Tpoly (t2, tl2), _, _) -> (try enter_poly env univar_pairs t1 tl1 t2 tl2 (mcomp type_pairs env) with Escape _ -> raise Incompatible) - | (Tunivar _, Tunivar _) -> - (try unify_univar t1' t2' !univar_pairs + | (Tunivar {jkind=jkind1}, Tunivar {jkind=jkind2}, _, _) -> + (try unify_univar t1' t2' jkind1 jkind2 !univar_pairs with Cannot_unify_universal_variables -> raise Incompatible) - | (_, _) -> + | (_, _, _, _) -> raise Incompatible end @@ -2790,6 +3016,16 @@ and mcomp_list type_pairs env tl1 tl2 = raise Incompatible; List.iter2 (mcomp type_pairs env) tl1 tl2 +and mcomp_labeled_list type_pairs env labeled_tl1 labeled_tl2 = + if not (Int.equal (List.length labeled_tl1) (List.length labeled_tl2)) then + raise Incompatible; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + raise Incompatible; + mcomp type_pairs env ty1 ty2) + labeled_tl1 labeled_tl2 + and mcomp_fields type_pairs env ty1 ty2 = if not (concrete_object ty1 && concrete_object ty2) then assert false; let (fields2, rest2) = flatten_fields ty2 in @@ -2845,6 +3081,10 @@ and mcomp_type_decl type_pairs env p1 p2 tl1 tl2 = try let decl = Env.find_type p1 env in let decl' = Env.find_type p2 env in + let check_jkinds () = + if not (Jkind.has_intersection decl.type_jkind decl'.type_jkind) + then raise Incompatible + in if compatible_paths p1 p2 then begin let inj = try List.map Variance.(mem Inj) (Env.find_type p1 env).type_variance @@ -2867,9 +3107,9 @@ and mcomp_type_decl type_pairs env p1 p2 tl1 tl2 = mcomp_variant_description type_pairs env v1 v2 | Type_open, Type_open -> mcomp_list type_pairs env tl1 tl2 - | Type_abstract _, Type_abstract _ -> () - | Type_abstract _, _ when not (non_aliasable p1 decl)-> () - | _, Type_abstract _ when not (non_aliasable p2 decl') -> () + | Type_abstract _, Type_abstract _ -> check_jkinds () + | Type_abstract _, _ when not (non_aliasable p1 decl)-> check_jkinds () + | _, Type_abstract _ when not (non_aliasable p2 decl') -> check_jkinds () | _ -> raise Incompatible with Not_found -> () @@ -2901,7 +3141,7 @@ and mcomp_variant_description type_pairs env xs ys = and mcomp_tuple_description type_pairs env = let rec iter x y = match x, y with - | (ty1, gf1) :: xs, (ty2, gf2) :: ys -> + | {ca_type=ty1; ca_modalities=gf1; _} :: xs, {ca_type=ty2; ca_modalities=gf2} :: ys -> mcomp type_pairs env ty1 ty2; if gf1 = gf2 then iter xs ys @@ -2918,7 +3158,7 @@ and mcomp_record_description type_pairs env = mcomp type_pairs env l1.ld_type l2.ld_type; if Ident.name l1.ld_id = Ident.name l2.ld_id && l1.ld_mutable = l2.ld_mutable && - l1.ld_global = l2.ld_global + l1.ld_modalities = l2.ld_modalities then iter xs ys else raise Incompatible | [], [] -> () @@ -2953,7 +3193,8 @@ let jkind_of_abstract_type_declaration env p = which guards the case of unify3 that reaches this function. Would be nice to eliminate the duplication, but is seems tricky to do so without complicating unify3. *) - (Env.find_type p env).type_jkind + let typ = Env.find_type p env in + typ.type_jkind, typ.type_jkind_annotation with Not_found -> assert false @@ -2993,10 +3234,14 @@ let add_gadt_equation env source destination = (* Recording the actual jkind here is required, not just for efficiency. When we check the jkind later, we may not be able to see the local equation because of its scope. *) - let jkind = jkind_of_abstract_type_declaration !env source in - add_jkind_equation ~reason:(Gadt_equation source) env destination jkind; + let jkind, jkind_annot = + jkind_of_abstract_type_declaration !env source + in + add_jkind_equation ~reason:(Gadt_equation source) + env destination jkind; let decl = new_local_type ~manifest_and_scope:(destination, expansion_scope) jkind + ~jkind_annot in env := Env.add_local_type source decl !env; cleanup_abbrev () @@ -3090,7 +3335,7 @@ let unify_package env unify_list lv1 p1 fl1 lv2 p2 fl2 = && !package_subtype env p2 fl2 p1 fl1 then () else raise Not_found let unify_alloc_mode_for tr_exn a b = - match Mode.Alloc.equate a b with + match Alloc.equate a b with | Ok () -> () | Error _ -> raise_unexplained_for tr_exn @@ -3108,7 +3353,10 @@ let unify1_var env t1 t2 = | _ -> assert false in occur_for Unify env t1 t2; - match occur_univar_for Unify env t2 with + match + occur_univar_for Unify env t2; + unification_jkind_check env t2 jkind + with | () -> begin try @@ -3117,7 +3365,6 @@ let unify1_var env t1 t2 = with Escape e -> raise_for Unify (Escape e) end; - unification_jkind_check env t2 jkind; link_type t1 t2; true | exception Unify_trace _ when in_pattern_mode () -> @@ -3126,16 +3373,39 @@ let unify1_var env t1 t2 = (* Called from unify3 *) let unify3_var env jkind1 t1' t2 t2' = occur_for Unify !env t1' t2; - match occur_univar_for Unify !env t2 with - | () -> begin - unification_jkind_check !env t2' jkind1; - link_type t1' t2 - end + (* There are two possible ways forward here. Either the variable [t1'] + will succeed in unifying with [t2], in which case we're done; or + the unification fails, in which case we want to add a GADT equation. + But in that second case, we want to pretend that we were making a + GADT equation all along, so we don't want any evidence of having + attempted the unification (which might, say, fill in a sort variable). + We thus backtrack in the GADT equation case. *) + let snap = snapshot () in + match + occur_univar_for Unify !env t2; + unification_jkind_check !env t2' jkind1 + with + | () -> link_type t1' t2 | exception Unify_trace _ when in_pattern_mode () -> + backtrack snap; reify env t1'; reify env t2'; if can_generate_equations () then begin - occur_univar ~inj_only:true !env t2'; + begin match get_desc t2' with + | Tconstr(path,[],_) + when is_instantiable !env ~for_jkind_eqn:false path -> + add_gadt_equation env path t1' + (* This is necessary because a failed kind-check above + might meaningfully refine a type constructor *) + | _ -> + occur_univar ~inj_only:true !env t2'; + mcomp_for Unify !env t1' t2' + (* the call to [mcomp] can be skipped in the other case in this + [match] because [add_gadt_equation] checks for jkind + intersection, which is the only interesting check in [mcomp] + when one side is a variable. We could pull that check out + here specially, but it seems simpler not to. *) + end; record_equation t1' t2'; end @@ -3178,22 +3448,10 @@ let rec unify (env:Env.t ref) t1 t2 = if unify1_var !env t1 t2 then () else unify2 env t1 t2 | (_, Tvar _) -> if unify1_var !env t2 t1 then () else unify2 env t1 t2 - | (Tunivar { jkind = l1 }, Tunivar { jkind = l2 }) -> - unify_univar_for Unify t1 t2 !univar_pairs; + | (Tunivar { jkind = k1 }, Tunivar { jkind = k2 }) -> + unify_univar_for Unify t1 t2 k1 k2 !univar_pairs; update_level_for Unify !env (get_level t1) t2; update_scope_for Unify (get_scope t1) t2; - (* CR layouts v1.5: make test cases that hit this. Easier once we have - annotations on univars, I think. - - Richard suggests: - - let poly : ('a. 'a -> 'a) -> int * bool = - fun (id : ('a : immediate). 'a -> 'a) -> id 3, id true - - Which should probably fail, even though it would be sound to accept. - *) - if not (Jkind.equal l1 l2) then - raise_for Unify (Unequal_var_jkinds (t1, l1, t2, l2)); link_type t1 t2 | (Tconstr (p1, [], a1), Tconstr (p2, [], a2)) when Path.same p1 p2 (* && actual_mode !env = Old *) @@ -3275,19 +3533,8 @@ and unify3 env t1 t1' t2 t2' = (not (eq_type t2 t2')) && (deep_occur t1' t2) in begin match (d1, d2) with (* handle vars and univars specially *) - (Tunivar { jkind = l1 }, Tunivar { jkind = l2 }) -> - unify_univar_for Unify t1' t2' !univar_pairs; - (* CR layouts v1.5: make a test case for this once we have annotations on - univars - - type ('a : any) foo = 'a - type ('a : any) bar - - let f (x : < foo : ('a : void) . 'a foo bar >) - : < foo : 'a . 'a foo bar > = x - *) - if not (Jkind.equal l1 l2) then - raise_for Unify (Unequal_var_jkinds (t1, l1, t2, l2)); + (Tunivar { jkind = k1 }, Tunivar { jkind = k2 }) -> + unify_univar_for Unify t1' t2' k1 k2 !univar_pairs; link_type t1' t2' | (Tvar { jkind }, _) -> unify3_var env jkind t1' t2 t2' @@ -3309,7 +3556,7 @@ and unify3 env t1 t1' t2 t2' = when (l1 = l2 || (!Clflags.classic || in_pattern_mode ()) && - not (is_optional l1 || is_optional l2)) -> + equivalent_with_nolabels l1 l2) -> unify_alloc_mode_for Unify a1 a2; unify_alloc_mode_for Unify r1 r2; unify env t1 t2; unify env u1 u2; @@ -3319,8 +3566,8 @@ and unify3 env t1 t1' t2 t2' = | false, false -> link_commu ~inside:c1 c2 | true, true -> () end - | (Ttuple tl1, Ttuple tl2) -> - unify_list env tl1 tl2 + | (Ttuple labeled_tl1, Ttuple labeled_tl2) -> + unify_labeled_list env labeled_tl1 labeled_tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> if not (can_generate_equations ()) then unify_list env tl1 tl2 @@ -3461,6 +3708,16 @@ and unify_list env tl1 tl2 = raise_unexplained_for Unify; List.iter2 (unify env) tl1 tl2 +and unify_labeled_list env labeled_tl1 labeled_tl2 = + if not (Int.equal (List.length labeled_tl1) (List.length labeled_tl2)) then + raise_unexplained_for Unify; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + raise_unexplained_for Unify; + unify env ty1 ty2) + labeled_tl1 labeled_tl2 + (* Build a fresh row variable for unification *) and make_rowvar level use1 rest1 use2 rest2 = let set_name ty name = @@ -3480,7 +3737,7 @@ and make_rowvar level use1 rest1 use2 rest2 = in if use1 then rest1 else if use2 then rest2 - else newty2 ~level (Tvar { name; jkind = Jkind.value ~why:Row_variable }) + else newty2 ~level (Tvar { name; jkind = Jkind.Primitive.value ~why:Row_variable }) and unify_fields env ty1 ty2 = (* Optimization *) let (fields1, rest1) = flatten_fields ty1 @@ -3543,7 +3800,7 @@ and unify_row env row1 row2 = | None, Some _ -> rm2 | None, None -> newty2 ~level:(Int.min (get_level rm1) (get_level rm2)) - (Tvar { name = None; jkind = Jkind.value ~why:Row_variable }) + (Tvar { name = None; jkind = Jkind.Primitive.value ~why:Row_variable }) in let fixed = merge_fixed_explanation fixed1 fixed2 and closed = row1_closed || row2_closed in @@ -3787,7 +4044,7 @@ let unify_delaying_jkind_checks env ty1 ty2 = (* Lower the level of a type to the current level *) let enforce_current_level env ty = - unify_var env (newvar (Jkind.any ~why:Dummy_jkind)) ty + unify_var env (newvar (Jkind.Primitive.any ~why:Dummy_jkind)) ty (**** Special cases of unification ****) @@ -3819,25 +4076,15 @@ exception Filter_arrow_failed of filter_arrow_failure type filtered_arrow = { ty_arg : type_expr; - arg_mode : Mode.Alloc.t; - arg_sort : Jkind.sort; + arg_mode : Mode.Alloc.lr; ty_ret : type_expr; - ret_mode : Mode.Alloc.t; - ret_sort : Jkind.sort + ret_mode : Mode.Alloc.lr } let filter_arrow env t l ~force_tpoly = let function_type level = - (* CR layouts v3: This is one of two primary places where we are restricting - function arguments / returns to be representable. This one handles - function types that arise from inference, and the check in - [Typetexp.transl_type_aux] handles function types explicitly written in - the source program. When we decide to drop that restriction, we can - allow both to be any. Separately, the relevant checks on function - arguments should happen when functions are constructed, not their - types. *) - let k_arg, arg_sort = Jkind.of_new_sort_var ~why:Function_argument in - let k_res, ret_sort = Jkind.of_new_sort_var ~why:Function_result in + let k_arg = Jkind.Primitive.any ~why:Inside_of_Tarrow in + let k_res = Jkind.Primitive.any ~why:Inside_of_Tarrow in let ty_arg = if not force_tpoly then begin assert (not (is_optional l)); @@ -3846,11 +4093,13 @@ let filter_arrow env t l ~force_tpoly = let t1 = if is_optional l then newty2 ~level - (* CR layouts v5: Change the Jkind.value when option can + (* CR layouts v5: Change the Jkind.Primitive.value when option can hold non-values. *) (Tconstr(Predef.path_option, - [newvar2 level (Jkind.value ~why:Type_argument)], + [newvar2 level Predef.option_argument_jkind], ref Mnil)) + else if is_position l then + newty2 ~level (Tconstr (Predef.path_lexing_position, [], ref Mnil)) else newvar2 level k_arg in @@ -3858,12 +4107,12 @@ let filter_arrow env t l ~force_tpoly = end in let ty_ret = newvar2 level k_res in - let arg_mode = Mode.Alloc.newvar () in - let ret_mode = Mode.Alloc.newvar () in + let arg_mode = Alloc.newvar () in + let ret_mode = Alloc.newvar () in let t' = newty2 ~level (Tarrow ((l, arg_mode, ret_mode), ty_arg, ty_ret, commu_ok)) in - t', { ty_arg; arg_mode; arg_sort; ty_ret; ret_mode; ret_sort } + t', { ty_arg; arg_mode; ty_ret; ret_mode } in let t = try expand_head_trace env t @@ -3890,22 +4139,10 @@ let filter_arrow env t l ~force_tpoly = link_type t t'; arrow_desc | Tarrow((l', arg_mode, ret_mode), ty_arg, ty_ret, _) -> - if l = l' || !Clflags.classic && l = Nolabel && not (is_optional l') + if l = l' || !Clflags.classic && l = Nolabel && + equivalent_with_nolabels l l' then - (* CR layouts v2.5: When we move the restrictions on argument from - arrows to functions, this function doesn't need to return a sort and - these calls to [type_sort] can move. We could eliminate them - entirely by storing sorts on [TArrow], but that seems incompatible - with the future plan to shift the jkind requirements from the types - to the terms. *) - let type_sort ~why ty = - match type_sort ~why env ty with - | Ok sort -> sort - | Error err -> raise (Filter_arrow_failed (Jkind_error (ty, err))) - in - let arg_sort = type_sort ~why:Function_argument ty_arg in - let ret_sort = type_sort ~why:Function_result ty_ret in - { ty_arg; arg_mode; arg_sort; ty_ret; ret_mode; ret_sort } + { ty_arg; arg_mode; ty_ret; ret_mode } else raise (Filter_arrow_failed (Label_mismatch { got = l; expected = l'; expected_type = t })) @@ -3941,8 +4178,8 @@ exception Filter_method_failed of filter_method_failure (* Used by [filter_method]. *) let rec filter_method_field env name ty = let method_type ~level = - let ty1 = newvar2 level (Jkind.value ~why:Object_field) in - let ty2 = newvar2 level (Jkind.value ~why:Row_variable) in + let ty1 = newvar2 level (Jkind.Primitive.value ~why:Object_field) in + let ty2 = newvar2 level (Jkind.Primitive.value ~why:Row_variable) in let ty' = newty2 ~level (Tfield (name, field_public, ty1, ty2)) in ty', ty1 in @@ -3975,7 +4212,7 @@ let rec filter_method_field env name ty = (* Unify [ty] and [< name : 'a; .. >]. Return ['a]. *) let filter_method env name ty = let object_type ~level ~scope = - let ty1 = newvar2 level (Jkind.value ~why:Row_variable) in + let ty1 = newvar2 level (Jkind.Primitive.value ~why:Row_variable) in let ty' = newty3 ~level ~scope (Tobject (ty1, ref None)) in let ty_meth = filter_method_field env name ty1 in (ty', ty_meth) @@ -3998,7 +4235,7 @@ let filter_method env name ty = let scope = get_scope ty in let ty', ty_meth = object_type ~level ~scope in begin match - constrain_type_jkind env ty (Jkind.value ~why:Object) + constrain_type_jkind env ty (Jkind.Primitive.value ~why:Object) with | Ok _ -> () | Error err -> raise (Filter_method_failed (Not_a_value err)) @@ -4017,8 +4254,8 @@ let rec filter_method_row env name priv ty = match get_desc ty with | Tvar _ -> let level = get_level ty in - let field = newvar2 level (Jkind.value ~why:Object_field) in - let row = newvar2 level (Jkind.value ~why:Row_variable) in + let field = newvar2 level (Jkind.Primitive.value ~why:Object_field) in + let row = newvar2 level (Jkind.Primitive.value ~why:Row_variable) in let kind, priv = match priv with | Private -> @@ -4054,7 +4291,7 @@ let rec filter_method_row env name priv ty = | Private -> let level = get_level ty in let kind = field_absent in - Mprivate kind, newvar2 level (Jkind.value ~why:Object_field), ty + Mprivate kind, newvar2 level (Jkind.Primitive.value ~why:Object_field), ty end | _ -> raise Filter_method_row_failed @@ -4062,7 +4299,7 @@ let rec filter_method_row env name priv ty = (* Operations on class signatures *) let new_class_signature () = - let row = newvar (Jkind.value ~why:Row_variable) in + let row = newvar (Jkind.Primitive.value ~why:Row_variable) in let self = newobj row in { csig_self = self; csig_self_row = row; @@ -4136,7 +4373,7 @@ type add_instance_variable_failure = exception Add_instance_variable_failed of add_instance_variable_failure -let check_mutability mut mut' = +let check_mutability (mut : mutable_flag) (mut' : mutable_flag) = match mut, mut' with | Mutable, Mutable -> () | Immutable, Immutable -> () @@ -4297,7 +4534,7 @@ let generalize_class_signature_spine env sign = (* But keep levels correct on the type of self *) Meths.iter (fun _ (_, _, ty) -> - unify_var env (newvar (Jkind.value ~why:Object)) ty) + unify_var env (newvar (Jkind.Primitive.value ~why:Object)) ty) meths; sign.csig_meths <- new_meths @@ -4370,9 +4607,9 @@ let relevant_pairs pairs v = let moregen_alloc_mode v a1 a2 = match match v with - | Invariant -> Mode.Alloc.equate a1 a2 - | Covariant -> Mode.Alloc.submode a1 a2 - | Contravariant -> Mode.Alloc.submode a2 a1 + | Invariant -> Result.map_error ignore (Alloc.equate a1 a2) + | Covariant -> Result.map_error ignore (Alloc.submode a1 a2) + | Contravariant -> Result.map_error ignore (Alloc.submode a2 a1) | Bivariant -> Ok () with | Ok () -> () @@ -4392,7 +4629,9 @@ let rec moregen inst_nongen variance type_pairs env t1 t2 = moregen_occur env (get_level t1) t2; update_scope_for Moregen (get_scope t1) t2; occur_for Moregen env t1 t2; - constrain_type_jkind_exn env Moregen t2 jkind; + (* use [check], not [constrain], here because [constrain] would be like + instantiating [t2], which we do not wish to do *) + check_type_jkind_exn env Moregen t2 jkind; link_type t1 t2 | (Tconstr (p1, [], _), Tconstr (p2, [], _)) when Path.same p1 p2 -> () @@ -4408,18 +4647,21 @@ let rec moregen inst_nongen variance type_pairs env t1 t2 = (Tvar { jkind }, _) when may_instantiate inst_nongen t1' -> moregen_occur env (get_level t1') t2; update_scope_for Moregen (get_scope t1') t2; - constrain_type_jkind_exn env Moregen t2 jkind; + (* use [check], not [constrain], here because [constrain] would be like + instantiating [t2], which we do not wish to do *) + check_type_jkind_exn env Moregen t2 jkind; link_type t1' t2 | (Tarrow ((l1,a1,r1), t1, u1, _), Tarrow ((l2,a2,r2), t2, u2, _)) when (l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2)) -> + || !Clflags.classic && equivalent_with_nolabels l1 l2) -> moregen inst_nongen (neg_variance variance) type_pairs env t1 t2; moregen inst_nongen variance type_pairs env u1 u2; moregen_alloc_mode (neg_variance variance) a1 a2; moregen_alloc_mode variance r1 r2 - | (Ttuple tl1, Ttuple tl2) -> - moregen_list inst_nongen variance type_pairs env tl1 tl2 + | (Ttuple labeled_tl1, Ttuple labeled_tl2) -> + moregen_labeled_list inst_nongen variance type_pairs env + labeled_tl1 labeled_tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> begin match variance with @@ -4455,8 +4697,8 @@ let rec moregen inst_nongen variance type_pairs env t1 t2 = | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> enter_poly_for Moregen env univar_pairs t1 tl1 t2 tl2 (moregen inst_nongen variance type_pairs env) - | (Tunivar _, Tunivar _) -> - unify_univar_for Moregen t1' t2' !univar_pairs + | (Tunivar {jkind=k1}, Tunivar {jkind=k2}) -> + unify_univar_for Moregen t1' t2' k1 k2 !univar_pairs | (_, _) -> raise_unexplained_for Moregen end @@ -4469,6 +4711,17 @@ and moregen_list inst_nongen variance type_pairs env tl1 tl2 = raise_unexplained_for Moregen; List.iter2 (moregen inst_nongen variance type_pairs env) tl1 tl2 +and moregen_labeled_list inst_nongen variance type_pairs env labeled_tl1 + labeled_tl2 = + if not (Int.equal (List.length labeled_tl1) (List.length labeled_tl2)) then + raise_unexplained_for Moregen; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + raise_unexplained_for Moregen; + moregen inst_nongen variance type_pairs env ty1 ty2) + labeled_tl1 labeled_tl2 + and moregen_param_list inst_nongen variance type_pairs env vl tl1 tl2 = match vl, tl1, tl2 with | [], [], [] -> () @@ -4531,8 +4784,8 @@ and moregen_row inst_nongen variance type_pairs env row1 row2 = end; let md1 = get_desc rm1 (* This lets us undo a following [link_type] *) in begin match md1, get_desc rm2 with - Tunivar _, Tunivar _ -> - unify_univar_for Moregen rm1 rm2 !univar_pairs + Tunivar {jkind=k1}, Tunivar {jkind=k2} -> + unify_univar_for Moregen rm1 rm2 k1 k2 !univar_pairs | Tunivar _, _ | _, Tunivar _ -> raise_unexplained_for Moregen | _ when static_row row1 -> () @@ -4810,8 +5063,8 @@ let rec eqtype rename type_pairs subst env t1 t2 = try match (get_desc t1, get_desc t2) with - (Tvar { jkind = l1 }, Tvar { jkind = l2 }) when rename -> - eqtype_subst type_pairs subst t1 l1 t2 l2 + (Tvar { jkind = k1 }, Tvar { jkind = k2 }) when rename -> + eqtype_subst type_pairs subst t1 k1 t2 k2 | (Tconstr (p1, [], _), Tconstr (p2, [], _)) when Path.same p1 p2 -> () | _ -> @@ -4822,18 +5075,19 @@ let rec eqtype rename type_pairs subst env t1 t2 = if not (TypePairs.mem type_pairs (t1', t2')) then begin TypePairs.add type_pairs (t1', t2'); match (get_desc t1', get_desc t2') with - (Tvar { jkind = l1 }, Tvar { jkind = l2 }) when rename -> - eqtype_subst type_pairs subst t1' l1 t2' l2 + (Tvar { jkind = k1 }, Tvar { jkind = k2 }) when rename -> + eqtype_subst type_pairs subst t1' k1 t2' k2 | (Tarrow ((l1,a1,r1), t1, u1, _), Tarrow ((l2,a2,r2), t2, u2, _)) when (l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2)) -> + || !Clflags.classic && equivalent_with_nolabels l1 l2) -> eqtype rename type_pairs subst env t1 t2; eqtype rename type_pairs subst env u1 u2; eqtype_alloc_mode a1 a2; eqtype_alloc_mode r1 r2 - | (Ttuple tl1, Ttuple tl2) -> - eqtype_list rename type_pairs subst env tl1 tl2 + | (Ttuple labeled_tl1, Ttuple labeled_tl2) -> + eqtype_labeled_list rename type_pairs subst env labeled_tl1 + labeled_tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> eqtype_list rename type_pairs subst env tl1 tl2 @@ -4861,8 +5115,8 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> enter_poly_for Equality env univar_pairs t1 tl1 t2 tl2 (eqtype rename type_pairs subst env) - | (Tunivar _, Tunivar _) -> - unify_univar_for Equality t1' t2' !univar_pairs + | (Tunivar {jkind=k1}, Tunivar {jkind=k2}) -> + unify_univar_for Equality t1' t2' k1 k2 !univar_pairs | (_, _) -> raise_unexplained_for Equality end @@ -4874,6 +5128,16 @@ and eqtype_list rename type_pairs subst env tl1 tl2 = raise_unexplained_for Equality; List.iter2 (eqtype rename type_pairs subst env) tl1 tl2 +and eqtype_labeled_list rename type_pairs subst env labeled_tl1 labeled_tl2 = + if not (Int.equal (List.length labeled_tl1) (List.length labeled_tl2)) then + raise_unexplained_for Equality; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + raise_unexplained_for Equality; + eqtype rename type_pairs subst env ty1 ty2) + labeled_tl1 labeled_tl2 + and eqtype_fields rename type_pairs subst env ty1 ty2 = let (fields1, rest1) = flatten_fields ty1 in let (fields2, rest2) = flatten_fields ty2 in @@ -5086,10 +5350,10 @@ let match_class_sig_shape ~strict sign1 sign2 = in let errors = Vars.fold - (fun lab (mut, vr, _) err -> + (fun lab ((mut:Asttypes.mutable_flag), vr, _) err -> match Vars.find lab sign1.csig_vars with | exception Not_found -> CM_Missing_value lab::err - | (mut', vr', _) -> + | ((mut':Asttypes.mutable_flag), vr', _) -> match mut', mut with | Immutable, Mutable -> CM_Non_mutable_value lab::err | _, _ -> @@ -5345,16 +5609,40 @@ let find_cltype_for_path env p = let has_constr_row' env t = has_constr_row (expand_abbrev env t) +let build_submode_pos m = + let m', changed = Alloc.newvar_below m in + let c = if changed then Changed else Unchanged in + m', c + +let build_submode_neg m = + let m', changed = Alloc.newvar_above m in + let c = if changed then Changed else Unchanged in + m', c + let build_submode posi m = - if posi then begin - let m', changed = Mode.Alloc.newvar_below m in - let c = if changed then Changed else Unchanged in - m', c - end else begin - let m', changed = Mode.Alloc.newvar_above m in - let c = if changed then Changed else Unchanged in - m', c - end + if posi then build_submode_pos (Alloc.allow_left m) + else build_submode_neg (Alloc.allow_right m) + +(* CR layouts v2.8: merge with Typecore.mode_cross_left when [Value] and + [Alloc] get unified *) +let mode_cross_left env ty mode = + (* CR layouts v2.8: The old check didn't check for principality, and so + this one doesn't either. I think it should. But actually test results + are bad when checking for principality. Really, I'm surprised that + the types here aren't principal. In any case, leaving the check out + now; will return and figure this out later. *) + let jkind = type_jkind_purely env ty in + let upper_bounds = Jkind.get_modal_upper_bounds jkind in + Alloc.meet_const upper_bounds mode + +(* CR layouts v2.8: merge with Typecore.expect_mode_cross when [Value] + and [Alloc] get unified *) +let mode_cross_right env ty mode = + (* CR layouts v2.8: This should probably check for principality. See + similar comment in [mode_cross_left]. *) + let jkind = type_jkind_purely env ty in + let upper_bounds = Jkind.get_modal_upper_bounds jkind in + Alloc.imply upper_bounds mode let rec build_subtype env (visited : transient_expr list) (loops : (int * type_expr) list) posi level t = @@ -5382,11 +5670,15 @@ let rec build_subtype env (visited : transient_expr list) runtime values, and easier to cross modes (and thus making the mode-crossing more complete). *) let t1 = if posi then t1 else t1' in - if is_immediate env t1 then - Mode.Alloc.newvar (), Changed - else - build_submode (not posi) a - end else a, Unchanged + let posi_arg = not posi in + if posi_arg then begin + let a = mode_cross_right env t1 a in + build_submode_pos a + end else begin + let a = mode_cross_left env t1 a in + build_submode_neg a + end + end else a, Unchanged in let (r', c4) = if level > 2 then build_submode posi r else r, Unchanged @@ -5395,15 +5687,17 @@ let rec build_subtype env (visited : transient_expr list) if c > Unchanged then (newty (Tarrow((l,a',r'), t1', t2', commu_ok)), c) else (t, Unchanged) - | Ttuple tlist -> + | Ttuple labeled_tlist -> let tt = Transient_expr.repr t in if memq_warn tt visited then (t, Unchanged) else let visited = tt :: visited in + let labels, tlist = List.split labeled_tlist in let tlist' = List.map (build_subtype env visited loops posi level) tlist in let c = collect tlist' in - if c > Unchanged then (newty (Ttuple (List.map fst tlist')), c) + if c > Unchanged then + (newty (Ttuple (List.combine labels (List.map fst tlist'))), c) else (t, Unchanged) | Tconstr(p, tl, abbrev) when level > 0 && generic_abbrev env p && safe_abbrev env t @@ -5430,9 +5724,9 @@ let rec build_subtype env (visited : transient_expr list) if deep_occur_list ty tl1 then raise Not_found; set_type_desc ty (Tvar { name = None; - jkind = Jkind.value + jkind = Jkind.Primitive.value ~why:(Unknown "build subtype 1")}); - let t'' = newvar (Jkind.value ~why:(Unknown "build subtype 2")) + let t'' = newvar (Jkind.Primitive.value ~why:(Unknown "build subtype 2")) in let loops = (get_id ty, t'') :: loops in (* May discard [visited] as level is going down *) @@ -5472,7 +5766,7 @@ let rec build_subtype env (visited : transient_expr list) else build_subtype env visited loops (not posi) level t else if co then build_subtype env visited loops posi level t - else (newvar (Jkind.value + else (newvar (Jkind.Primitive.value ~why:(Unknown "build_subtype 3")), Changed)) decl.type_variance tl @@ -5511,7 +5805,7 @@ let rec build_subtype env (visited : transient_expr list) let c = collect fields in let row = create_row ~fields:(List.map fst fields) - ~more:(newvar (Jkind.value ~why:Row_variable)) + ~more:(newvar (Jkind.Primitive.value ~why:Row_variable)) ~closed:posi ~fixed:None ~name:(if c > Unchanged then None else row_name row) in @@ -5533,7 +5827,7 @@ let rec build_subtype env (visited : transient_expr list) else (t, Unchanged) | Tnil -> if posi then - let v = newvar (Jkind.value ~why:Tnil) in + let v = newvar (Jkind.Primitive.value ~why:Tnil) in (v, Changed) else begin warn := true; @@ -5578,7 +5872,7 @@ let subtype_error ~env ~trace ~unification_trace = ~unification_trace)) let subtype_alloc_mode env trace a1 a2 = - match Mode.Alloc.submode a1 a2 with + match Alloc.submode a1 a2 with | Ok () -> () | Error _ -> subtype_error ~env ~trace ~unification_trace:[] @@ -5594,7 +5888,7 @@ let rec subtype_rec env trace t1 t2 cstrs = (trace, t1, t2, !univar_pairs)::cstrs | (Tarrow((l1,a1,r1), t1, u1, _), Tarrow((l2,a2,r2), t2, u2, _)) when l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2) -> + || !Clflags.classic && equivalent_with_nolabels l1 l2 -> let cstrs = subtype_rec env @@ -5602,8 +5896,8 @@ let rec subtype_rec env trace t1 t2 cstrs = t2 t1 cstrs in - if not (is_immediate env t2) then - subtype_alloc_mode env trace a2 a1; + let a2 = mode_cross_left env t2 a2 in + subtype_alloc_mode env trace a2 a1; (* RHS mode of arrow types indicates allocation in the parent region and is not subject to mode crossing *) subtype_alloc_mode env trace r1 r2; @@ -5613,7 +5907,7 @@ let rec subtype_rec env trace t1 t2 cstrs = u1 u2 cstrs | (Ttuple tl1, Ttuple tl2) -> - subtype_list env trace tl1 tl2 cstrs + subtype_labeled_list env trace tl1 tl2 cstrs | (Tconstr(p1, [], _), Tconstr(p2, [], _)) when Path.same p1 p2 -> cstrs | (Tconstr(p1, _tl1, _abbrev1), _) @@ -5630,8 +5924,8 @@ let rec subtype_rec env trace t1 t2 cstrs = let (co, cn) = Variance.get_upper v in if co then if cn then - (trace, newty2 ~level:(get_level t1) (Ttuple[t1]), - newty2 ~level:(get_level t2) (Ttuple[t2]), !univar_pairs) + (trace, newty2 ~level:(get_level t1) (Ttuple[None, t1]), + newty2 ~level:(get_level t2) (Ttuple[None, t2]), !univar_pairs) :: cstrs else subtype_rec @@ -5710,17 +6004,19 @@ let rec subtype_rec env trace t1 t2 cstrs = (trace, t1, t2, !univar_pairs)::cstrs end -and subtype_list env trace tl1 tl2 cstrs = - if List.length tl1 <> List.length tl2 then +and subtype_labeled_list env trace labeled_tl1 labeled_tl2 cstrs = + if not (Int.equal (List.length labeled_tl1) (List.length labeled_tl2)) then subtype_error ~env ~trace ~unification_trace:[]; List.fold_left2 - (fun cstrs t1 t2 -> - subtype_rec - env - (Subtype.Diff { got = t1; expected = t2 } :: trace) - t1 t2 - cstrs) - cstrs tl1 tl2 + (fun cstrs (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + subtype_error ~env ~trace ~unification_trace:[]; + subtype_rec + env + (Subtype.Diff { got = ty1; expected = ty2 } :: trace) + ty1 ty2 + cstrs) + cstrs labeled_tl1 labeled_tl2 and subtype_fields env trace ty1 ty2 cstrs = (* Assume that either rest1 or rest2 is not Tvar *) @@ -5742,7 +6038,7 @@ and subtype_fields env trace ty1 ty2 cstrs = let cstrs = if miss2 = [] then cstrs else (trace, rest1, build_fields (get_level ty2) miss2 - (newvar (Jkind.value ~why:Object_field)), + (newvar (Jkind.Primitive.value ~why:Object_field)), !univar_pairs) :: cstrs in List.fold_left @@ -5852,7 +6148,7 @@ let rec unalias_object ty = | Tunivar _ -> ty | Tconstr _ -> - newvar2 level (Jkind.any ~why:Dummy_jkind) + newvar2 level (Jkind.Primitive.any ~why:Dummy_jkind) | _ -> assert false @@ -6080,7 +6376,7 @@ let rec nondep_type_rec ?(expand_private=false) env ids ty = | _ -> try TypeHash.find nondep_hash ty with Not_found -> let ty' = newgenstub ~scope:(get_scope ty) - (Jkind.any ~why:Dummy_jkind) in + (Jkind.Primitive.any ~why:Dummy_jkind) in TypeHash.add nondep_hash ty ty'; match match get_desc ty with @@ -6191,6 +6487,7 @@ let nondep_type_decl env mid is_covariant decl = type_arity = decl.type_arity; type_kind = tk; type_jkind = decl.type_jkind; + type_jkind_annotation = decl.type_jkind_annotation; type_manifest = tm; type_private = priv; type_variance = decl.type_variance; @@ -6201,6 +6498,7 @@ let nondep_type_decl env mid is_covariant decl = type_attributes = decl.type_attributes; type_unboxed_default = decl.type_unboxed_default; type_uid = decl.type_uid; + type_has_illegal_crossings = decl.type_has_illegal_crossings; } with Nondep_cannot_erase _ as exn -> clear_hash (); @@ -6234,6 +6532,7 @@ let nondep_extension_constructor env ids ext = ext_type_params = type_params; ext_args = args; ext_arg_jkinds = ext.ext_arg_jkinds; + ext_shape = ext.ext_shape; ext_constant = ext.ext_constant; ext_ret_type = ret_type; ext_private = ext.ext_private; diff --git a/typing/ctype.mli b/typing/ctype.mli index 1841c64866a..0c433921740 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -17,6 +17,7 @@ open Asttypes open Types +open Mode exception Unify of Errortrace.unification_error exception Equality of Errortrace.equality_error @@ -76,9 +77,12 @@ val create_scope : unit -> int val newty: type_desc -> type_expr val new_scoped_ty: int -> type_desc -> type_expr val newvar: ?name:string -> Jkind.t -> type_expr -val new_rep_var : - ?name:string -> why:Jkind.concrete_jkind_reason -> unit -> - type_expr * Jkind.sort + +val new_rep_var + : ?name:string + -> why:Jkind.History.concrete_creation_reason + -> unit + -> type_expr * Jkind.sort (* Return a fresh representable variable, along with its sort *) val newvar2: ?name:string -> int -> Jkind.t -> type_expr (* Return a fresh variable *) @@ -176,7 +180,7 @@ val instance_list: type_expr list -> type_expr list (* Take an instance of a list of type schemes *) val new_local_type: ?loc:Location.t -> ?manifest_and_scope:(type_expr * int) -> - Jkind.t -> type_declaration + Jkind.t -> jkind_annot:Jkind.annotation option -> type_declaration val existential_name: constructor_description -> type_expr -> string type existential_treatment = @@ -185,7 +189,7 @@ type existential_treatment = val instance_constructor: existential_treatment -> constructor_description -> - (type_expr * global_flag) list * type_expr * type_expr list + Types.constructor_argument list * type_expr * type_expr list (* Same, for a constructor. Also returns existentials. *) val instance_parameterized_type: ?keep_names:bool -> @@ -205,10 +209,16 @@ val instance_label: bool -> label_description -> type_expr list * type_expr * type_expr (* Same, for a label *) val prim_mode : - Mode.Locality.t option -> (Primitive.mode * Primitive.native_repr) - -> Mode.Locality.t -val instance_prim_mode: - Primitive.description -> type_expr -> type_expr * Mode.Locality.t option + (Mode.allowed * 'r) Mode.Locality.t option -> (Primitive.mode * Primitive.native_repr) + -> (Mode.allowed * 'r) Mode.Locality.t +val instance_prim: + Primitive.description -> type_expr -> + type_expr * Mode.Locality.lr option * Jkind.Sort.t option + +(** Given (a @ m1 -> b -> c) @ m0, where [m0] and [m1] are modes expressed by + user-syntax, [curry_mode m0 m1] gives the mode we implicitly interpret b->c + to have. *) +val curry_mode : Alloc.Const.t -> Alloc.Const.t -> Alloc.Const.t val apply: ?use_current_level:bool -> @@ -277,11 +287,9 @@ val unify_delaying_jkind_checks : type filtered_arrow = { ty_arg : type_expr; - arg_mode : Mode.Alloc.t; - arg_sort : Jkind.sort; + arg_mode : Mode.Alloc.lr; ty_ret : type_expr; - ret_mode : Mode.Alloc.t; - ret_sort : Jkind.sort + ret_mode : Mode.Alloc.lr } val filter_arrow: Env.t -> type_expr -> arg_label -> force_tpoly:bool -> @@ -538,10 +546,20 @@ val estimate_type_jkind : Env.t -> type_expr -> jkind types. *) val type_jkind : Env.t -> type_expr -> jkind +(* Get the jkind of a type, dropping any changes to types caused by + expansion. *) +val type_jkind_purely : Env.t -> type_expr -> jkind + (* Find a type's sort (constraining it to be an arbitrary sort variable, if needed) *) val type_sort : - why:Jkind.concrete_jkind_reason -> + why:Jkind.History.concrete_creation_reason -> + Env.t -> type_expr -> (Jkind.sort, Jkind.Violation.t) result + +(* As [type_sort], but constrain the jkind to be non-null. + Used for checking array elements. *) +val type_legacy_sort : + why:Jkind.History.concrete_legacy_creation_reason -> Env.t -> type_expr -> (Jkind.sort, Jkind.Violation.t) result (* Jkind checking. [constrain_type_jkind] will update the jkind of type @@ -552,21 +570,68 @@ val type_sort : raise on error, like unify. *) val check_decl_jkind : Env.t -> type_declaration -> Jkind.t -> (unit, Jkind.Violation.t) result +val constrain_decl_jkind : + Env.t -> type_declaration -> Jkind.t -> (unit, Jkind.Violation.t) result val check_type_jkind : Env.t -> type_expr -> Jkind.t -> (unit, Jkind.Violation.t) result val constrain_type_jkind : Env.t -> type_expr -> Jkind.t -> (unit, Jkind.Violation.t) result +(* Check whether a type's externality's upper bound is less than some target. + Potentially cheaper than just calling [type_jkind], because this can stop + expansion once it succeeds. *) +val check_type_externality : Env.t -> type_expr -> Jkind.Externality.t -> bool + +(* This function should get called after a type is generalized. + + It does two things: + + 1. Update the jkind reason of all generalized type vars inside the + given [type_expr] + + Consider some code like + + {[ + let f : ('a : immediate). 'a -> 'a = fun x -> x in + let y = f "hello" in ... + ]} + + This should be rejected, because a string is not immediate. But how should + we explain how the requirement to pass an immediate arises? We could point + the user to the [: immediate] annotation within the definition for [f]. But this + definition might be arbitrarily far away (including in another file), and the inference + to produce the fact that the type it works on must be immediate might be complex. + + The design decision here is not to look within well-typed definitions for further + information about how jkind decisions arose. Other tooling -- such as merlin -- + is more well suited for discovering properties of well-typed definitions. Instead, + once a definition is done being type-checked -- that is, once it is generalized -- + we update the histories of all of its types' jkinds to just refer to the definition + itself. + + 2. Performs an upstream-compatibility check around immediacy if + [Language_extension.erasable_extensions_only ()] is [true]. + + The check makes sure no generalized type variable can have jkind + [immediate] or [immediate64]. An exception would be raised when + the check fails. + + This prevents code such as: + + {| + let f (x : (_ : immediate)) = x;; + |} + + which doesn't have an equivalent representation upstream. + + *) +val check_and_update_generalized_ty_jkind : + ?name:Ident.t -> loc:Location.t -> type_expr -> unit + (* False if running in principal mode and the type is not principal. True otherwise. *) val is_principal : type_expr -> bool -(* True if a type is immediate. *) -val is_immediate : Env.t -> type_expr -> bool - -(* True if a type can cross to the minimum on all mode axes. *) -val mode_cross : Env.t -> type_expr -> bool - (* For use with ocamldebug *) type global_state val global_state : global_state diff --git a/typing/datarepr.ml b/typing/datarepr.ml index e47d9272707..a1f6ca2e372 100644 --- a/typing/datarepr.ml +++ b/typing/datarepr.ml @@ -51,7 +51,9 @@ let constructor_existentials cd_args cd_res = match cd_res with | None -> [] | Some type_ret -> - let arg_vars_set = free_vars (newgenty (Ttuple tyl)) in + let arg_vars_set = + free_vars (newgenty (Ttuple (List.map (fun ty -> None, ty) tyl))) + in let res_vars = free_vars type_ret in TypeSet.elements (TypeSet.diff arg_vars_set res_vars) in @@ -62,7 +64,10 @@ let constructor_args ~current_unit priv cd_args cd_res path rep = match cd_args with | Cstr_tuple l -> existentials, l, None | Cstr_record lbls -> - let arg_vars_set = free_vars ~param:true (newgenty (Ttuple tyl)) in + let arg_vars_set = + free_vars ~param:true + (newgenty (Ttuple (List.map (fun ty -> None, ty) tyl))) + in let type_params = TypeSet.elements arg_vars_set in let arity = List.length type_params in let is_void_label lbl = Jkind.is_void_defaulting lbl.ld_jkind in @@ -75,6 +80,7 @@ let constructor_args ~current_unit priv cd_args cd_res path rep = type_arity = arity; type_kind = Type_record (lbls, rep); type_jkind = jkind; + type_jkind_annotation = None; type_private = priv; type_manifest = None; type_variance = Variance.unknown_signature ~injective:true ~arity; @@ -85,29 +91,36 @@ let constructor_args ~current_unit priv cd_args cd_res path rep = type_attributes = []; type_unboxed_default = false; type_uid = Uid.mk ~current_unit; + type_has_illegal_crossings = false; } in existentials, - [ newgenconstr path type_params, Unrestricted ], + [ + { + ca_type = newgenconstr path type_params; + ca_modalities = Mode.Modality.Value.Const.id; + ca_loc = Location.none + } + ], Some tdecl let constructor_descrs ~current_unit ty_path decl cstrs rep = let ty_res = newgenconstr ty_path decl.type_params in - let cstr_arg_jkinds : Jkind.t array array = + let cstr_shapes_and_arg_jkinds = match rep with | Variant_extensible -> assert false - | Variant_boxed jkinds -> jkinds - | Variant_unboxed -> [| [| decl.type_jkind |] |] + | Variant_boxed x -> x + | Variant_unboxed -> [| Constructor_uniform_value, [| decl.type_jkind |] |] in let all_void jkinds = Array.for_all Jkind.is_void_defaulting jkinds in let num_consts = ref 0 and num_nonconsts = ref 0 in let cstr_constant = Array.map - (fun jkinds -> + (fun (_, jkinds) -> let all_void = all_void jkinds in if all_void then incr num_consts else incr num_nonconsts; all_void) - cstr_arg_jkinds + cstr_shapes_and_arg_jkinds in let describe_constructor (src_index, const_tag, nonconst_tag, acc) {cd_id; cd_args; cd_res; cd_loc; cd_attributes; cd_uid} = @@ -117,7 +130,7 @@ let constructor_descrs ~current_unit ty_path decl cstrs rep = | Some ty_res' -> ty_res' | None -> ty_res in - let cstr_arg_jkinds = cstr_arg_jkinds.(src_index) in + let cstr_shape, cstr_arg_jkinds = cstr_shapes_and_arg_jkinds.(src_index) in let cstr_constant = cstr_constant.(src_index) in let runtime_tag, const_tag, nonconst_tag = if cstr_constant @@ -127,7 +140,7 @@ let constructor_descrs ~current_unit ty_path decl cstrs rep = let cstr_tag = Ordinary {src_index; runtime_tag} in let cstr_existentials, cstr_args, cstr_inlined = (* This is the representation of the inner record, IF there is one *) - let record_repr = Record_inlined (cstr_tag, rep) in + let record_repr = Record_inlined (cstr_tag, cstr_shape, rep) in constructor_args ~current_unit decl.type_private cd_args cd_res Path.(Pextra_ty (ty_path, Pcstr_ty cstr_name)) record_repr in @@ -140,6 +153,7 @@ let constructor_descrs ~current_unit ty_path decl cstrs rep = cstr_arity = List.length cstr_args; cstr_tag; cstr_repr = rep; + cstr_shape = cstr_shape; cstr_constant; cstr_consts = !num_consts; cstr_nonconsts = !num_nonconsts; @@ -165,7 +179,7 @@ let extension_descr ~current_unit path_ext ext = let existentials, cstr_args, cstr_inlined = constructor_args ~current_unit ext.ext_private ext.ext_args ext.ext_ret_type Path.(Pextra_ty (path_ext, Pext_ty)) - (Record_inlined (cstr_tag, Variant_extensible)) + (Record_inlined (cstr_tag, ext.ext_shape, Variant_extensible)) in { cstr_name = Path.last path_ext; cstr_res = ty_res; @@ -175,6 +189,7 @@ let extension_descr ~current_unit path_ext ext = cstr_arity = List.length cstr_args; cstr_tag; cstr_repr = Variant_extensible; + cstr_shape = ext.ext_shape; cstr_constant = ext.ext_constant; cstr_consts = -1; cstr_nonconsts = -1; @@ -192,8 +207,8 @@ let none = let dummy_label = { lbl_name = ""; lbl_res = none; lbl_arg = none; - lbl_mut = Immutable; lbl_global = Unrestricted; - lbl_jkind = Jkind.any ~why:Dummy_jkind; + lbl_mut = Immutable; lbl_modalities = Mode.Modality.Value.Const.id; + lbl_jkind = Jkind.Primitive.any ~why:Dummy_jkind; lbl_num = -1; lbl_pos = -1; lbl_all = [||]; lbl_repres = Record_unboxed; lbl_private = Public; @@ -213,7 +228,7 @@ let label_descrs ty_res lbls repres priv = lbl_res = ty_res; lbl_arg = l.ld_type; lbl_mut = l.ld_mutable; - lbl_global = l.ld_global; + lbl_modalities = l.ld_modalities; lbl_jkind = l.ld_jkind; lbl_pos = if is_void then lbl_pos_void else pos; lbl_num = num; diff --git a/typing/env.ml b/typing/env.ml index dbf28ce9a9f..a3773ce15db 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -40,19 +40,6 @@ let value_declarations : unit usage_tbl ref = s_table Types.Uid.Tbl.create 16 let type_declarations : unit usage_tbl ref = s_table Types.Uid.Tbl.create 16 let module_declarations : unit usage_tbl ref = s_table Types.Uid.Tbl.create 16 -let uid_to_loc : Location.t Types.Uid.Tbl.t ref = - s_table Types.Uid.Tbl.create 16 - -let uid_to_attributes : Parsetree.attribute list Types.Uid.Tbl.t ref = - s_table Types.Uid.Tbl.create 16 - -let register_uid uid ~loc ~attributes = - Types.Uid.Tbl.add !uid_to_loc uid loc; - Types.Uid.Tbl.add !uid_to_attributes uid attributes - -let get_uid_to_loc_tbl () = !uid_to_loc -let get_uid_to_attributes_tbl () = !uid_to_attributes - type constructor_usage = Positive | Pattern | Exported_private | Exported type constructor_usages = { @@ -123,13 +110,13 @@ let label_usage_complaint priv mut lu | Asttypes.Private, _ -> if lu.lu_projection then None else Some Unused - | Asttypes.Public, Asttypes.Immutable -> begin + | Asttypes.Public, Types.Immutable -> begin match lu.lu_projection, lu.lu_construct with | true, _ -> None | false, false -> Some Unused | false, true -> Some Not_read end - | Asttypes.Public, Asttypes.Mutable -> begin + | Asttypes.Public, Types.Mutable _ -> begin match lu.lu_projection, lu.lu_mutation, lu.lu_construct with | true, true, _ -> None | false, false, false -> Some Unused @@ -154,7 +141,7 @@ type module_unbound_reason = type summary = Env_empty - | Env_value of summary * Ident.t * value_description * Mode.Value.t + | Env_value of summary * Ident.t * value_description * Mode.Value.l | Env_type of summary * Ident.t * type_declaration | Env_extension of summary * Ident.t * extension_constructor | Env_module of summary * Ident.t * module_presence * module_declaration @@ -186,7 +173,7 @@ let map_summary f = function | Env_value_unbound (s, u, r) -> Env_value_unbound (f s, u, r) | Env_module_unbound (s, u, r) -> Env_module_unbound (f s, u, r) -type address = +type address = Persistent_env.address = | Aunit of Compilation_unit.t | Alocal of Ident.t | Adot of address * int @@ -338,14 +325,19 @@ type shared_context = | Probe | Lazy -type value_lock = +type lock = | Escape_lock of escaping_context | Share_lock of shared_context - | Closure_lock of closure_context option * Mode.Locality.t * Mode.Linearity.t + | Closure_lock of closure_context option * Mode.Value.Comonadic.r | Region_lock | Exclave_lock | Unboxed_lock (* to prevent capture of terms with non-value types *) +type lock_item = + | Value + | Module + | Class + module IdTbl = struct (** This module is used to store all kinds of components except @@ -387,7 +379,7 @@ module IdTbl = } | Lock of { - mode: 'lock; + lock: 'lock; next: ('lock, 'a, 'b) t; } @@ -420,8 +412,8 @@ module IdTbl = | _ -> assert false - let add_lock mode next = - { current = Ident.empty; layer = Lock {mode; next} } + let add_lock lock next = + { current = Ident.empty; layer = Lock {lock; next} } let map f next = { @@ -429,21 +421,40 @@ module IdTbl = layer = Map {f; next} } - let rec find_same id tbl = + let rec find_same_without_locks id tbl = try Ident.find_same id tbl.current with Not_found as exn -> begin match tbl.layer with - | Open {next; _} -> find_same id next - | Map {f; next} -> f (find_same id next) - | Lock {mode=_; next} -> find_same id next + | Open {next; _} -> find_same_without_locks id next + | Map {f; next} -> f (find_same_without_locks id next) + | Lock {lock=_; next} -> find_same_without_locks id next | Nothing -> raise exn end - let rec find_name_and_locks wrap ~mark name tbl macc = + let find_same id (tbl : (empty, _, _) t) = + find_same_without_locks id tbl + + let rec find_same_and_locks id tbl macc = try - let (id, desc) = Ident.find_name name tbl.current in - Pident id, macc, desc + let desc = Ident.find_same id tbl.current in + desc, macc with Not_found as exn -> + begin match tbl.layer with + | Open {next; _} -> find_same_and_locks id next macc + | Map {f; next} -> + let desc, locks = find_same_and_locks id next macc in + f desc, locks + | Lock {lock; next} -> find_same_and_locks id next (lock :: macc) + | Nothing -> raise exn + end + + let find_same_and_locks id tbl = find_same_and_locks id tbl [] + + let rec find_name_and_locks wrap ~mark name tbl macc : _ Result.t = + try + let (id, desc) = Ident.find_name name tbl.current in + Ok (Pident id, macc, desc) + with Not_found -> begin match tbl.layer with | Open {using; root; next; components} -> begin try @@ -451,33 +462,38 @@ module IdTbl = let res = Pdot (root, name), macc, descr in if mark then begin match using with | None -> () - | Some f -> begin - match find_name_and_locks wrap ~mark:false name next macc with - | exception Not_found -> f name None - | _, _, descr' -> f name (Some (descr', descr)) + | Some f -> begin match + (find_name_and_locks wrap ~mark:false name next macc : _ Result.t) + with + | Error _ -> f name None + | Ok (_, _, descr') -> f name (Some (descr', descr)) end end; - res + Ok res with Not_found -> find_name_and_locks wrap ~mark name next macc end | Map {f; next} -> - let (p, macc, desc) = - find_name_and_locks wrap ~mark name next macc in - p, macc, f desc - | Lock {mode; next} -> - find_name_and_locks wrap ~mark name next (mode :: macc) + find_name_and_locks wrap ~mark name next macc + |> Result.map (fun (p, macc, desc) -> p, macc, f desc) + | Lock {lock; next} -> + find_name_and_locks wrap ~mark name next (lock :: macc) | Nothing -> - raise exn + Error macc end - let find_name_and_modes wrap ~mark name tbl = + let find_name_and_locks wrap ~mark name tbl = find_name_and_locks wrap ~mark name tbl [] + (** Find item by name whose accesses are not affected by locks, and thus + shouldn't encounter any locks. *) let find_name wrap ~mark name tbl = - let (id, ([] : empty list), desc) = - find_name_and_modes wrap ~mark name tbl in - id, desc + match (find_name_and_locks wrap ~mark name tbl + : (_ * empty list * _, empty list) Result.t) with + | Ok (id, [], desc) -> id, desc + | Ok (_, _ :: _, _) -> . + | Error [] -> raise Not_found + | Error (_ :: _) -> . let rec find_all wrap name tbl = List.map @@ -495,7 +511,7 @@ module IdTbl = | Map {f; next} -> List.map (fun (p, desc) -> (p, f desc)) (find_all wrap name next) - | Lock {mode=_;next} -> + | Lock {lock=_;next} -> find_all wrap name next let rec find_all_idents name tbl () = @@ -512,7 +528,7 @@ module IdTbl = else find_all_idents name next () | Map {next; _ } -> find_all_idents name next () - | Lock {mode=_;next} -> + | Lock {lock=_;next} -> find_all_idents name next () in Seq.append current next () @@ -537,7 +553,7 @@ module IdTbl = |> fold_name wrap (fun name (path, desc) -> f name (path, g desc)) next - | Lock {mode=_; next} -> + | Lock {lock=_; next} -> fold_name wrap f next acc let rec local_keys tbl acc = @@ -560,7 +576,7 @@ module IdTbl = iter wrap f next | Map {f=g; next} -> iter wrap (fun id (path, desc) -> f id (path, g desc)) next - | Lock {mode=_; next} -> + | Lock {lock=_; next} -> iter wrap f next | Nothing -> () @@ -568,7 +584,7 @@ module IdTbl = let keys2 = local_keys tbl2 [] in List.filter (fun id -> - try ignore (find_same id tbl1); false + try ignore (find_same_without_locks id tbl1); false with Not_found -> true) keys2 @@ -583,13 +599,13 @@ type type_descriptions = type_descr_kind let in_signature_flag = 0x01 type t = { - values: (value_lock, value_entry, value_data) IdTbl.t; + values: (lock, value_entry, value_data) IdTbl.t; constrs: constructor_data TycompTbl.t; labels: label_data TycompTbl.t; types: (empty, type_data, type_data) IdTbl.t; - modules: (empty, module_entry, module_data) IdTbl.t; + modules: (lock, module_entry, module_data) IdTbl.t; modtypes: (empty, modtype_data, modtype_data) IdTbl.t; - classes: (empty, class_data, class_data) IdTbl.t; + classes: (lock, class_data, class_data) IdTbl.t; cltypes: (empty, cltype_data, cltype_data) IdTbl.t; functor_args: unit Ident.tbl; summary: summary; @@ -653,7 +669,7 @@ and address_lazy = (address_unforced, address) Lazy_backtrack.t and value_data = { vda_description : Subst.Lazy.value_description; vda_address : address_lazy; - vda_mode : Mode.Value.t; + vda_mode : Mode.Value.l; vda_shape : Shape.t } and value_entry = @@ -696,6 +712,12 @@ and cltype_data = { cltda_declaration : class_type_declaration; cltda_shape : Shape.t } +let mda_mode = Mode.Value.legacy |> Mode.Value.disallow_right + +let clda_mode = Mode.Value.legacy |> Mode.Value.disallow_right + +let cm_mode = Mode.Value.legacy |> Mode.Value.disallow_right + let empty_structure = Structure_comps { comp_values = NameMap.empty; @@ -710,10 +732,6 @@ type unbound_value_hint = | No_hint | Missing_rec of Location.t -type closure_error = - | Locality of closure_context option - | Linearity - type lookup_error = | Unbound_value of Longident.t * unbound_value_hint | Unbound_type of Longident.t @@ -735,10 +753,11 @@ type lookup_error = | Generative_used_as_applicative of Longident.t | Illegal_reference_to_recursive_module | Cannot_scrape_alias of Longident.t * Path.t - | Local_value_escaping of Longident.t * escaping_context - | Once_value_used_in of Longident.t * shared_context - | Value_used_in_closure of Longident.t * closure_error - | Local_value_used_in_exclave of Longident.t + | Local_value_escaping of lock_item * Longident.t * escaping_context + | Once_value_used_in of lock_item * Longident.t * shared_context + | Value_used_in_closure of lock_item * Longident.t * + Mode.Value.Comonadic.error * closure_context option + | Local_value_used_in_exclave of lock_item * Longident.t | Non_value_used_in_object of Longident.t * type_expr * Jkind.Violation.t type error = @@ -753,6 +772,16 @@ let error err = raise (Error err) let lookup_error loc env err = error (Lookup_error(loc, env, err)) +type actual_mode = { + mode : Mode.Value.l; + context : shared_context option +} + +let mode_default mode = { + mode; + context = None +} + let same_constr = ref (fun _ _ _ -> assert false) let constrain_type_jkind = ref (fun _ _ _ -> assert false) @@ -848,14 +877,14 @@ let check_functor_application = (* to be filled by Includemod *) ref ((fun ~errors:_ ~loc:_ ~lid_whole_app:_ ~f0_path:_ ~args:_ - ~arg_path:_ ~arg_mty:_ ~param_mty:_ + ~arg_path:_ ~arg_mty:_ ~arg_mode:_ ~param_mty:_ _env -> assert false) : errors:bool -> loc:Location.t -> lid_whole_app:Longident.t -> - f0_path:Path.t -> args:(Path.t * Types.module_type) list -> - arg_path:Path.t -> arg_mty:module_type -> param_mty:module_type -> - t -> unit) + f0_path:Path.t -> args:(Path.t * Types.module_type * Mode.Value.l) list -> + arg_path:Path.t -> arg_mty:module_type -> arg_mode:Mode.Value.l -> + param_mty:module_type -> t -> unit) let scrape_alias = (* to be filled with Mtype.scrape_alias *) @@ -866,6 +895,21 @@ let md md_type = {md_type; md_attributes=[]; md_loc=Location.none ;md_uid = Uid.internal_not_actually_unique} +(** The caller is not interested in modes, and thus [val_modalities] is +invalidated. *) +let vda_description vda = + let vda_description = vda.vda_description in + {vda_description with val_modalities = Mode.Modality.Value.undefined} + +let normalize_vda_mode vda = + let vda_description = vda.vda_description in + let modalities = vda_description.val_modalities in + let vda_description = + {vda_description with val_modalities = Mode.Modality.Value.id} + in + let vda_mode = Mode.Modality.Value.apply modalities vda.vda_mode in + vda_description, vda_mode + (* Print addresses *) let rec print_address ppf = function @@ -912,18 +956,20 @@ let set_unit_name = Current_unit_name.set let get_unit_name = Current_unit_name.get let find_same_module id tbl = - match IdTbl.find_same id tbl with + match IdTbl.find_same_without_locks id tbl with | x -> x | exception Not_found when Ident.is_global id && not (Current_unit_name.is_ident id) -> Mod_persistent let find_name_module ~mark name tbl = - match IdTbl.find_name wrap_module ~mark name tbl with - | x -> x - | exception Not_found when not (Current_unit_name.is name) -> + match IdTbl.find_name_and_locks wrap_module ~mark name tbl with + | Ok x -> x + | Error locks when not (Current_unit_name.is name) -> let path = Pident(Ident.create_persistent name) in - path, Mod_persistent + path, locks, Mod_persistent + | _ -> + raise Not_found let add_persistent_structure id env = if not (Ident.is_global id) then invalid_arg "Env.add_persistent_structure"; @@ -934,9 +980,9 @@ let add_persistent_structure id env = non-persistent module already in the environment. (See PR#9345) *) match - IdTbl.find_name wrap_module ~mark:false (Ident.name id) env.modules + IdTbl.find_name_and_locks wrap_module ~mark:false (Ident.name id) env.modules with - | exception Not_found | _, Mod_persistent -> false + | Error _ | Ok (_, _, Mod_persistent) -> false | _ -> true in let summary = @@ -970,30 +1016,24 @@ let components_of_module ~alerts ~uid env ps path addr mty shape = } } -let read_sign_of_cmi { Persistent_env.Persistent_signature.cmi; _ } = - let name = cmi.cmi_name in - let sign = cmi.cmi_sign in - let flags = cmi.cmi_flags in - let id = Ident.create_persistent (Compilation_unit.name_as_string name) in +let read_sign_of_cmi sign name uid ~shape ~address:addr ~flags = + let id = Ident.create_persistent (Compilation_unit.Name.to_string name) in let path = Pident id in let alerts = List.fold_left (fun acc -> function Alerts s -> s | _ -> acc) Misc.Stdlib.String.Map.empty flags in - let sign = Subst.Lazy.signature Make_local Subst.identity sign in let md = { Subst.Lazy.md_type = Mty_signature sign; md_loc = Location.none; md_attributes = []; - md_uid = Uid.of_compilation_unit_id name; + md_uid = uid; } in - let mda_address = Lazy_backtrack.create_forced (Aunit name) in + let mda_address = Lazy_backtrack.create_forced addr in let mda_declaration = md in - let mda_shape = - Shape.for_persistent_unit (name |> Compilation_unit.full_path_as_string) - in + let mda_shape = shape in let mda_components = let mty = md.md_type in components_of_module ~alerts ~uid:md.md_uid @@ -1018,6 +1058,10 @@ let imports () = Persistent_env.imports !persistent_env let import_crcs ~source crcs = Persistent_env.import_crcs !persistent_env ~source crcs +let runtime_parameters () = Persistent_env.runtime_parameters !persistent_env + +let parameters () = Persistent_env.parameters !persistent_env + let read_pers_mod modname filename ~add_binding = Persistent_env.read !persistent_env read_sign_of_cmi modname filename ~add_binding @@ -1029,7 +1073,7 @@ let check_pers_mod ~loc name = Persistent_env.check !persistent_env read_sign_of_cmi ~loc name let crc_of_unit name = - Persistent_env.crc_of_unit !persistent_env read_sign_of_cmi name + Persistent_env.crc_of_unit !persistent_env name let is_imported_opaque modname = Persistent_env.is_imported_opaque !persistent_env modname @@ -1037,13 +1081,18 @@ let is_imported_opaque modname = let register_import_as_opaque modname = Persistent_env.register_import_as_opaque !persistent_env modname +let is_parameter_unit modname = + Persistent_env.is_parameter_import !persistent_env modname + +let implemented_parameter modname = + Persistent_env.implemented_parameter !persistent_env modname + let reset_declaration_caches () = Types.Uid.Tbl.clear !value_declarations; Types.Uid.Tbl.clear !type_declarations; Types.Uid.Tbl.clear !module_declarations; Types.Uid.Tbl.clear !used_constructors; Types.Uid.Tbl.clear !used_labels; - Types.Uid.Tbl.clear !uid_to_loc; () let reset_cache ~preserve_persistent_env = @@ -1097,12 +1146,12 @@ let modtype_of_functor_appl fcomp p1 p2 = let check_functor_appl ~errors ~loc ~lid_whole_app ~f0_path ~args ~f_comp - ~arg_path ~arg_mty ~param_mty + ~arg_path ~arg_mty ~arg_mode ~param_mty env = if not (Hashtbl.mem f_comp.fcomp_cache arg_path) then !check_functor_application ~errors ~loc ~lid_whole_app ~f0_path ~args - ~arg_path ~arg_mty ~param_mty + ~arg_path ~arg_mty ~arg_mode ~param_mty env let modname_of_ident id = Ident.name id |> Compilation_unit.Name.of_string @@ -1113,7 +1162,7 @@ let find_ident_module id env = match find_same_module id env.modules with | Mod_local data -> data | Mod_unbound _ -> raise Not_found - | Mod_persistent -> find_pers_mod (id |> modname_of_ident) + | Mod_persistent -> find_pers_mod ~allow_hidden:true (id |> modname_of_ident) let rec find_module_components path env = match path with @@ -1172,7 +1221,7 @@ let find_module_lazy ~alias path env = let find_value_full path env = match path with | Pident id -> begin - match IdTbl.find_same id env.values with + match IdTbl.find_same_without_locks id env.values with | Val_bound data -> data | Val_unbound _ -> raise Not_found end @@ -1257,7 +1306,7 @@ let find_modtype path env = let find_class_full path env = match path with - | Pident id -> IdTbl.find_same id env.classes + | Pident id -> IdTbl.find_same_without_locks id env.classes | Pdot(p, s) -> let sc = find_structure_components p env in NameMap.find s sc.comp_classes @@ -1272,7 +1321,13 @@ let find_cltype path env = | Papply _ | Pextra_ty _ -> raise Not_found let find_value path env = - (find_value_full path env).vda_description + find_value_full path env |> vda_description + +let find_value_no_locks_exn id env = + match IdTbl.find_same_and_locks id env.values with + | Val_bound _, _ :: _ -> Misc.fatal_error "locks encountered" + | Val_bound data, [] -> normalize_vda_mode data + | Val_unbound _, _ -> raise Not_found let find_class path env = (find_class_full path env).clda_declaration @@ -1355,15 +1410,19 @@ let find_shape env (ns : Shape.Sig_component_kind.t) id = match ns with | Type -> (IdTbl.find_same id env.types).tda_shape + | Constructor -> + Shape.leaf ((TycompTbl.find_same id env.constrs).cda_description.cstr_uid) + | Label -> + Shape.leaf ((TycompTbl.find_same id env.labels).lbl_uid) | Extension_constructor -> (TycompTbl.find_same id env.constrs).cda_shape | Value -> - begin match IdTbl.find_same id env.values with + begin match IdTbl.find_same_without_locks id env.values with | Val_bound x -> x.vda_shape | Val_unbound _ -> raise Not_found end | Module -> - begin match IdTbl.find_same id env.modules with + begin match IdTbl.find_same_without_locks id env.modules with | Mod_local { mda_shape; _ } -> mda_shape | Mod_persistent -> Shape.for_persistent_unit (Ident.name id) | Mod_unbound _ -> @@ -1379,7 +1438,7 @@ let find_shape env (ns : Shape.Sig_component_kind.t) id = | Module_type -> (IdTbl.find_same id env.modtypes).mtda_shape | Class -> - (IdTbl.find_same id env.classes).clda_shape + (IdTbl.find_same_without_locks id env.classes).clda_shape | Class_type -> (IdTbl.find_same id env.cltypes).cltda_shape @@ -1599,13 +1658,12 @@ let iter_env wrap proj1 proj2 f env () = | Mod_unbound _ -> () | Mod_local data -> iter_components (Pident id) path data.mda_components - | Mod_persistent -> - let modname = modname_of_ident id in - match Persistent_env.find_in_cache !persistent_env modname with - | None -> () - | Some data -> - iter_components (Pident id) path data.mda_components) - env.modules + | Mod_persistent -> ()) + env.modules; + Persistent_env.fold !persistent_env (fun name data () -> + let id = Ident.create_persistent (Compilation_unit.Name.to_string name) in + let path = Pident id in + iter_components path path data.mda_components) () let run_iter_cont l = iter_env_cont := []; @@ -1800,7 +1858,7 @@ let rec components_of_module_maker let vda_shape = Shape.proj cm_shape (Shape.Item.value id) in let vda = { vda_description = decl'; vda_address = addr; - vda_mode = Mode.Value.legacy; vda_shape } + vda_mode = cm_mode; vda_shape } in c.comp_values <- NameMap.add (Ident.name id) vda c.comp_values; | Sig_type(id, decl, _, _) -> @@ -1976,7 +2034,7 @@ and check_value_name name loc = error (Illegal_value_name(loc, name)) done -and store_value ?check mode id addr decl shape env = +and store_value ?check ~mode id addr decl shape env = let open Subst.Lazy in check_value_name (Ident.name id) decl.val_loc; Builtin_attributes.mark_alerts_used decl.val_attributes; @@ -1992,8 +2050,7 @@ and store_value ?check mode id addr decl shape env = { env with values = IdTbl.add id (Val_bound vda) env.values; summary = - Env_value(env.summary, id, Subst.Lazy.force_value_description decl, - mode) } + Env_value(env.summary, id, Subst.Lazy.force_value_description decl, mode) } and store_constructor ~check type_decl type_id cstr_id cstr env = Builtin_attributes.warning_scope cstr.cstr_attributes (fun () -> @@ -2253,12 +2310,15 @@ let add_functor_arg id env = functor_args = Ident.add id () env.functor_args; summary = Env_functor_arg (env.summary, id)} -let add_value_lazy ?check ?shape ?(mode = Mode.Value.legacy) id desc env = +let add_value_lazy ?check ?shape ~mode id desc env = let addr = value_declaration_address env id desc in let shape = shape_or_leaf desc.Subst.Lazy.val_uid shape in - store_value ?check mode id addr desc shape env + let mode = Mode.Value.disallow_right mode in + store_value ?check ~mode id addr desc shape env let add_type ~check ?shape id info env = + (* CR layouts: there should be a safety check for extension universe when the type's + kind allows mode crossing *) let shape = shape_or_leaf info.type_uid shape in store_type ~check id info shape env @@ -2317,17 +2377,20 @@ let add_module ?arg ?shape id presence mty env = add_module_declaration ~check:false ?arg ?shape id presence (md mty) env let add_local_type path info env = + (* CR layouts: there should be a safety check for extension universe when the type's + kind allows mode crossing *) { env with local_constraints = Path.Map.add path info env.local_constraints } (* Insertion of bindings by name *) -let enter_value ?check name desc env = +let enter_value ?check ~mode name desc env = let id = Ident.create_local name in let desc = Subst.Lazy.of_value_description desc in let addr = value_declaration_address env id desc in + let mode = Mode.Value.disallow_right mode in let env = - store_value ?check Mode.Value.legacy id addr desc (Shape.leaf desc.val_uid) + store_value ?check ~mode id addr desc (Shape.leaf desc.val_uid) env in (id, env) @@ -2368,26 +2431,33 @@ let enter_cltype ~scope name desc env = let enter_module ~scope ?arg s presence mty env = enter_module_declaration ~scope ?arg s presence (md mty) env +let add_lock lock env = + { env with + values = IdTbl.add_lock lock env.values; + modules = IdTbl.add_lock lock env.modules; + classes = IdTbl.add_lock lock env.classes; + } + let add_escape_lock escaping_context env = let lock = Escape_lock escaping_context in - { env with values = IdTbl.add_lock lock env.values } + add_lock lock env let add_share_lock shared_context env = let lock = Share_lock shared_context in - { env with values = IdTbl.add_lock lock env.values } + add_lock lock env -let add_closure_lock ?closure_context locality linearity env = - let lock = Closure_lock (closure_context, locality, linearity) in - { env with values = IdTbl.add_lock lock env.values } +let add_closure_lock ?closure_context comonadic env = + let lock = Closure_lock + (closure_context, + Mode.Value.Comonadic.disallow_left comonadic) + in + add_lock lock env -let add_region_lock env = - { env with values = IdTbl.add_lock Region_lock env.values } +let add_region_lock env = add_lock Region_lock env -let add_exclave_lock env = - { env with values = IdTbl.add_lock Exclave_lock env.values } +let add_exclave_lock env = add_lock Exclave_lock env -let add_unboxed_lock env = - { env with values = IdTbl.add_lock Unboxed_lock env.values } +let add_unboxed_lock env = add_lock Unboxed_lock env (* Insertion of all components of a signature *) @@ -2399,7 +2469,8 @@ let proj_shape map mod_shape item = Shape.Map.add map item shape, Some shape module Add_signature(T : Types.Wrapped)(M : sig - val add_value: ?shape:Shape.t -> Ident.t -> T.value_description -> t -> t + val add_value: ?shape:Shape.t -> mode:(Mode.allowed * 'r0) Mode.Value.t -> Ident.t -> + T.value_description -> t -> t val add_module_declaration: ?arg:bool -> ?shape:Shape.t -> check:bool -> Ident.t -> module_presence -> T.module_declaration -> t -> t val add_modtype: ?shape:Shape.t -> Ident.t -> T.modtype_declaration -> t -> t @@ -2410,7 +2481,7 @@ end) = struct match comp with | Sig_value(id, decl, _) -> let map, shape = proj_shape map mod_shape (Shape.Item.value id) in - map, M.add_value ?shape id decl env + map, M.add_value ?shape ~mode:Mode.Value.legacy id decl env | Sig_type(id, decl, _, _) -> let map, shape = proj_shape map mod_shape (Shape.Item.type_ id) in map, add_type ~check:false ?shape id decl env @@ -2440,8 +2511,8 @@ end let add_signature = let module M = Add_signature(Types)(struct - let add_value ?shape id vd = - add_value_lazy ?shape id (Subst.Lazy.of_value_description vd) + let add_value ?shape ~mode id vd = + add_value_lazy ?shape ~mode id (Subst.Lazy.of_value_description vd) let add_module_declaration = add_module_declaration let add_modtype = add_modtype end) @@ -2450,7 +2521,7 @@ let add_signature = let add_signature_lazy = let module M = Add_signature(Subst.Lazy)(struct - let add_value = add_value_lazy ?check:None ?mode:None + let add_value ?shape ~mode = add_value_lazy ?check:None ?shape ~mode let add_module_declaration = add_module_declaration_lazy ~update_summary:true let add_modtype = add_modtype_lazy ~update_summary:true @@ -2474,10 +2545,8 @@ let enter_signature_and_shape ~scope ~parent_shape mod_shape sg env = enter_signature_and_shape ~scope ~parent_shape (Some mod_shape) sg env let add_value_lazy = add_value_lazy ?shape:None -let add_value ?check ?mode id vd = - add_value_lazy ?check ?mode id (Subst.Lazy.of_value_description vd) -let add_type = add_type ?shape:None -let add_extension = add_extension ?shape:None +let add_value ?check ~mode id vd = + add_value_lazy ?check ~mode id (Subst.Lazy.of_value_description vd) let add_class = add_class ?shape:None let add_cltype = add_cltype ?shape:None let add_modtype_lazy = add_modtype_lazy ?shape:None @@ -2653,13 +2722,11 @@ let open_signature (* Read a signature from a file *) let read_signature modname filename ~add_binding = - let mda = - read_pers_mod (Compilation_unit.name modname) filename ~add_binding - in - let md = Subst.Lazy.force_module_decl mda.mda_declaration in - match md.md_type with - | Mty_signature sg -> sg - | Mty_ident _ | Mty_functor _ | Mty_alias _ | Mty_strengthen _ -> assert false + let mty = read_pers_mod modname filename ~add_binding in + Subst.Lazy.force_signature mty + +let register_parameter modname = + Persistent_env.register_parameter !persistent_env modname let is_identchar_latin1 = function | 'A'..'Z' | 'a'..'z' | '_' | '\192'..'\214' | '\216'..'\246' @@ -2680,13 +2747,14 @@ let unit_name_of_filename fn = | _ -> None let persistent_structures_of_dir dir = - Load_path.Dir.files dir + Load_path.Dir.basenames dir |> List.to_seq |> Seq.filter_map unit_name_of_filename |> String.Set.of_seq (* Save a signature to a file *) -let save_signature_with_transform cmi_transform ~alerts sg modname filename = +let save_signature_with_transform cmi_transform ~alerts sg modname kind + filename = Btype.cleanup_abbrev (); Subst.reset_additional_action_type_id (); let sg = Subst.Lazy.of_signature sg @@ -2694,20 +2762,20 @@ let save_signature_with_transform cmi_transform ~alerts sg modname filename = (Subst.with_additional_action Prepare_for_saving Subst.identity) in let cmi = - Persistent_env.make_cmi !persistent_env modname sg alerts + Persistent_env.make_cmi !persistent_env modname kind sg alerts |> cmi_transform in - Persistent_env.save_cmi !persistent_env - { Persistent_env.Persistent_signature.filename; cmi }; + let pers_sig = + Persistent_env.Persistent_signature.{ filename; cmi; visibility = Visible } + in + Persistent_env.save_cmi !persistent_env pers_sig; cmi -let save_signature ~alerts sg modname filename = - save_signature_with_transform (fun cmi -> cmi) - ~alerts sg modname filename +let save_signature ~alerts sg modname cu filename = + save_signature_with_transform (fun cmi -> cmi) ~alerts sg modname cu filename -let save_signature_with_imports ~alerts sg modname filename imports = +let save_signature_with_imports ~alerts sg modname cu filename imports = let with_imports cmi = { cmi with cmi_crcs = imports } in - save_signature_with_transform with_imports - ~alerts sg modname filename + save_signature_with_transform with_imports ~alerts sg modname cu filename (* Make the initial environment, without language extensions *) let initial = @@ -2717,10 +2785,17 @@ let initial = empty let add_language_extension_types env = + let add ext f env = + match Language_extension.is_enabled ext with + | true -> + (* CR-someday poechsel: Pass a correct shape here *) + f (add_type ?shape:None ~check:false) env + | false -> env + in lazy - (if Language_extension.is_enabled SIMD - then Predef.add_simd_extension_types (add_type ~check:false) env - else env) + (env + |> add SIMD Predef.add_simd_extension_types + |> add Small_numbers Predef.add_small_number_extension_types) (* Some predefined types are part of language extensions, and we don't want to make them available in the initial environment if those extensions are not @@ -2917,7 +2992,7 @@ type _ load = | Don't_load : unit load let lookup_ident_module (type a) (load : a load) ~errors ~use ~loc s env = - let path, data = + let path, locks, data = match find_name_module ~mark:use s env.modules with | res -> res | exception Not_found -> @@ -2927,8 +3002,8 @@ let lookup_ident_module (type a) (load : a load) ~errors ~use ~loc s env = | Mod_local mda -> begin use_module ~use ~loc path mda; match load with - | Load -> path, (mda : a) - | Don't_load -> path, (() : a) + | Load -> path, locks, (mda : a) + | Don't_load -> path, locks, (() : a) end | Mod_unbound reason -> report_module_unbound ~errors ~loc env reason @@ -2936,111 +3011,127 @@ let lookup_ident_module (type a) (load : a load) ~errors ~use ~loc s env = let name = s |> Compilation_unit.Name.of_string in match load with | Don't_load -> - check_pers_mod ~loc name; - path, (() : a) + check_pers_mod ~allow_hidden:false ~loc name; + path, locks, (() : a) | Load -> begin - match find_pers_mod name with + match find_pers_mod ~allow_hidden:false name with | mda -> use_module ~use ~loc path mda; - path, (mda : a) + path, locks, (mda : a) | exception Not_found -> may_lookup_error errors loc env (Unbound_module (Lident s)) end end -let escape_mode ~errors ~env ~loc id vmode escaping_context = - match +let escape_mode ~errors ~env ~loc ~item ~lid vmode escaping_context = + begin match Mode.Regionality.submode - (Mode.Value.locality vmode) + (Mode.Value.proj (Comonadic Areality) vmode.mode) (Mode.Regionality.global) with | Ok () -> () | Error _ -> may_lookup_error errors loc env - (Local_value_escaping (id, escaping_context)) + (Local_value_escaping (item, lid, escaping_context)) + end; + vmode -let share_mode ~errors ~env ~loc id vmode shared_context = +let share_mode ~errors ~env ~loc ~item ~lid vmode shared_context = match Mode.Linearity.submode - (Mode.Value.linearity vmode) + (Mode.Value.proj (Comonadic Linearity) vmode.mode) Mode.Linearity.many with | Error _ -> may_lookup_error errors loc env - (Once_value_used_in (id, shared_context)) - | Ok () -> Mode.Value.with_uniqueness Mode.Uniqueness.shared vmode + (Once_value_used_in (item, lid, shared_context)) + | Ok () -> + let mode = + Mode.Value.join [ + Mode.Value.min_with (Monadic Uniqueness) Mode.Uniqueness.shared; + vmode.mode] + in + {mode; context = Some shared_context} -let closure_mode ~errors ~env ~loc id vmode closure_context locality linearity = +let closure_mode ~errors ~env ~loc ~item ~lid + ({mode = {Mode.monadic; comonadic}; _} as vmode) closure_context comonadic0 = begin match - Mode.Regionality.submode - (Mode.Value.locality vmode) - (Mode.Regionality.of_locality locality) - with - | Error _ -> - may_lookup_error errors loc env - (Value_used_in_closure (id, Locality closure_context)) - | Ok () -> () - end; - begin - match Mode.Linearity.submode (Mode.Value.linearity vmode) linearity with - | Error _ -> + Mode.Value.Comonadic.submode comonadic comonadic0 + with + | Error e -> may_lookup_error errors loc env - (Value_used_in_closure (id, Linearity)) + (Value_used_in_closure (item, lid, e, closure_context)) | Ok () -> () end; - let uniqueness = - Mode.Uniqueness.join - [ Mode.Value.uniqueness vmode; - Mode.Linearity.to_dual linearity] + let monadic = + Mode.Value.Monadic.join + [ monadic; + Mode.Value.comonadic_to_monadic comonadic0 ] in - Mode.Value.with_uniqueness uniqueness vmode + {vmode with mode = {monadic; comonadic}} -let exclave_mode ~errors ~env ~loc id vmode = +let exclave_mode ~errors ~env ~loc ~item ~lid vmode = match Mode.Regionality.submode - (Mode.Value.locality vmode) + (Mode.Value.proj (Comonadic Areality) vmode.mode) Mode.Regionality.regional with -| Ok () -> Mode.Value.regional_to_local vmode +| Ok () -> + let mode = vmode.mode |> Mode.value_to_alloc_r2l |> Mode.alloc_as_value in + {vmode with mode} | Error _ -> may_lookup_error errors loc env - (Local_value_used_in_exclave id) + (Local_value_used_in_exclave (item, lid)) -let lock_mode ~errors ~loc env id vda locks = - let vmode = vda.vda_mode in +let region_mode vmode = + let mode = + vmode.mode |> Mode.value_to_alloc_r2l |> Mode.alloc_to_value_l2r + in + {vmode with mode} + +let unboxed_type ~errors ~env ~loc ~lid ty = + match ty with + | None -> () + | Some ty -> + match !constrain_type_jkind env ty Jkind.Primitive.(value ~why:Captured_in_object) with + | Ok () -> () + | Result.Error err -> + may_lookup_error errors loc env (Non_value_used_in_object (lid, ty, err)) + +(** Takes the [mode] and [ty] of a value at definition site, walks through the + list of locks and constrains [mode] and [ty]. Return the access mode of the + value allowed by the locks. + + [ty] is optional as the function works on modules and classes as well, for + which [ty] should be [None]. *) +let walk_locks ~errors ~loc ~env ~item ~lid mode ty locks = + let vmode = { mode; context = None } in List.fold_left - (fun (vmode, must_lock, reason) lock -> + (fun vmode lock -> match lock with - | Region_lock -> (Mode.Value.local_to_regional vmode, must_lock, reason) + | Region_lock -> region_mode vmode | Escape_lock escaping_context -> - escape_mode ~errors ~env ~loc id vmode escaping_context; - (vmode, must_lock, reason) + escape_mode ~errors ~env ~loc ~item ~lid vmode escaping_context | Share_lock shared_context -> - let vmode = share_mode ~errors ~env ~loc id vmode shared_context in - vmode, must_lock, Some shared_context - | Closure_lock (closure_context, locality, linearity) -> - let vmode = - closure_mode ~errors ~env ~loc id vmode closure_context - locality linearity - in - vmode, must_lock, reason + share_mode ~errors ~env ~loc ~item ~lid vmode shared_context + | Closure_lock (closure_context, comonadic) -> + closure_mode ~errors ~env ~loc ~item ~lid vmode closure_context comonadic | Exclave_lock -> - let vmode = exclave_mode ~errors ~env ~loc id vmode in - vmode, must_lock, reason + exclave_mode ~errors ~env ~loc ~item ~lid vmode | Unboxed_lock -> - vmode, true, reason - ) (vmode, false, None) locks + unboxed_type ~errors ~env ~loc ~lid ty; + vmode + ) vmode locks let lookup_ident_value ~errors ~use ~loc name env = - match IdTbl.find_name_and_modes wrap_value ~mark:use name env.values with - | (path, locks, Val_bound vda) -> - let mode, must_box, reasons = lock_mode ~errors ~loc env (Lident name) vda locks in + match IdTbl.find_name_and_locks wrap_value ~mark:use name env.values with + | Ok (path, locks, Val_bound vda) -> use_value ~use ~loc path vda; - path, vda.vda_description, mode, must_box, reasons - | (_, _, Val_unbound reason) -> + path, locks, vda + | Ok (_, _, Val_unbound reason) -> report_value_unbound ~errors ~loc env reason (Lident name) - | exception Not_found -> + | Error _ -> may_lookup_error errors loc env (Unbound_value (Lident name, No_hint)) let lookup_ident_type ~errors ~use ~loc s env = @@ -3060,11 +3151,11 @@ let lookup_ident_modtype ~errors ~use ~loc s env = may_lookup_error errors loc env (Unbound_modtype (Lident s)) let lookup_ident_class ~errors ~use ~loc s env = - match IdTbl.find_name wrap_identity ~mark:use s env.classes with - | (path, clda) -> + match IdTbl.find_name_and_locks wrap_identity ~mark:use s env.classes with + | Ok (path, locks, clda) -> use_class ~use ~loc path clda; - path, clda.clda_declaration - | exception Not_found -> + path, locks, clda.clda_declaration + | Error _ -> may_lookup_error errors loc env (Unbound_class (Lident s)) let lookup_ident_cltype ~errors ~use ~loc s env = @@ -3105,21 +3196,21 @@ let lookup_all_ident_constructors ~errors ~use ~loc usage s env = let rec lookup_module_components ~errors ~use ~loc lid env = match lid with | Lident s -> - let path, data = lookup_ident_module Load ~errors ~use ~loc s env in - path, data.mda_components + let path, locks, data = lookup_ident_module Load ~errors ~use ~loc s env in + path, locks, data.mda_components | Ldot(l, s) -> - let path, data = lookup_dot_module ~errors ~use ~loc l s env in - path, data.mda_components + let path, locks, data = lookup_dot_module ~errors ~use ~loc l s env in + path, locks, data.mda_components | Lapply _ as lid -> let f_path, f_comp, arg = lookup_apply ~errors ~use ~loc lid env in let comps = !components_of_functor_appl' ~loc ~f_path ~f_comp ~arg env in - Papply (f_path, arg), comps + Papply (f_path, arg), [], comps and lookup_structure_components ~errors ~use ~loc lid env = - let path, comps = lookup_module_components ~errors ~use ~loc lid env in + let path, locks, comps = lookup_module_components ~errors ~use ~loc lid env in match get_components_res comps with - | Ok (Structure_comps comps) -> path, comps + | Ok (Structure_comps comps) -> path, locks, comps | Ok (Functor_comps _) -> may_lookup_error errors loc env (Functor_used_as_structure lid) | Error No_components_abstract -> @@ -3147,40 +3238,43 @@ and lookup_all_args ~errors ~use ~loc lid0 env = | Lident _ | Ldot _ as f_lid -> (f_lid, args) | Lapply (f_lid, arg_lid) -> - let arg_path, arg_md = lookup_module ~errors ~use ~loc arg_lid env in - loop_lid_arg ((f_lid,arg_path,arg_md.md_type)::args) f_lid + let arg_path, arg_md, arg_vmode = + lookup_module ~errors ~use ~lock:false ~loc arg_lid env + in + loop_lid_arg ((f_lid,arg_path,arg_md.md_type,arg_vmode)::args) f_lid in loop_lid_arg [] lid0 and lookup_apply ~errors ~use ~loc lid0 env = let f0_lid, args0 = lookup_all_args ~errors ~use ~loc lid0 env in - let args_for_errors = List.map (fun (_,p,mty) -> (p,mty)) args0 in - let f0_path, f0_comp = + let args_for_errors = List.map (fun (_,p,mty,vmode) -> (p,mty,vmode.mode)) args0 in + let f0_path, _, f0_comp = lookup_module_components ~errors ~use ~loc f0_lid env in - let check_one_apply ~errors ~loc ~f_lid ~f_comp ~arg_path ~arg_mty env = + let check_one_apply ~errors ~loc ~f_lid ~f_comp ~arg_path ~arg_mty ~arg_mode + env = let f_comp, param_mty = get_functor_components ~errors ~loc f_lid env f_comp in check_functor_appl ~errors ~loc ~lid_whole_app:lid0 ~f0_path ~args:args_for_errors ~f_comp - ~arg_path ~arg_mty ~param_mty + ~arg_path ~arg_mty ~arg_mode:arg_mode.mode ~param_mty env; arg_path, f_comp in let rec check_apply ~path:f_path ~comp:f_comp = function | [] -> invalid_arg "Env.lookup_apply: empty argument list" - | [ f_lid, arg_path, arg_mty ] -> + | [ f_lid, arg_path, arg_mty, arg_mode ] -> let arg_path, comps = check_one_apply ~errors ~loc ~f_lid ~f_comp - ~arg_path ~arg_mty env + ~arg_path ~arg_mty ~arg_mode env in f_path, comps, arg_path - | (f_lid, arg_path, arg_mty) :: args -> + | (f_lid, arg_path, arg_mty, arg_mode) :: args -> let arg_path, f_comp = check_one_apply ~errors ~loc ~f_lid ~f_comp - ~arg_path ~arg_mty env + ~arg_path ~arg_mty ~arg_mode env in let comp = !components_of_functor_appl' ~loc ~f_path ~f_comp ~arg:arg_path env @@ -3190,45 +3284,54 @@ and lookup_apply ~errors ~use ~loc lid0 env = in check_apply ~path:f0_path ~comp:f0_comp args0 -and lookup_module ~errors ~use ~loc lid env = - match lid with - | Lident s -> - let path, data = lookup_ident_module Load ~errors ~use ~loc s env in - let md = Subst.Lazy.force_module_decl data.mda_declaration in - path, md - | Ldot(l, s) -> - let path, data = lookup_dot_module ~errors ~use ~loc l s env in - let md = Subst.Lazy.force_module_decl data.mda_declaration in - path, md - | Lapply _ as lid -> - let path_f, comp_f, path_arg = lookup_apply ~errors ~use ~loc lid env in - let md = md (modtype_of_functor_appl comp_f path_f path_arg) in - Papply(path_f, path_arg), md +and lookup_module ~errors ~use ~lock ~loc lid env = + let path, locks, md = + match lid with + | Lident s -> + let path, locks, data = lookup_ident_module Load ~errors ~use ~loc s env in + let md = Subst.Lazy.force_module_decl data.mda_declaration in + path, locks, md + | Ldot(l, s) -> + let path, locks, data = lookup_dot_module ~errors ~use ~loc l s env in + let md = Subst.Lazy.force_module_decl data.mda_declaration in + path, locks, md + | Lapply _ as lid -> + let path_f, comp_f, path_arg = lookup_apply ~errors ~use ~loc lid env in + let md = md (modtype_of_functor_appl comp_f path_f path_arg) in + Papply(path_f, path_arg), [], md + in + let vmode = + if lock then + walk_locks ~errors ~loc ~env ~item:Module ~lid mda_mode None locks + else + mode_default mda_mode + in + path, md, vmode and lookup_dot_module ~errors ~use ~loc l s env = - let p, comps = lookup_structure_components ~errors ~use ~loc l env in + let p, locks, comps = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_modules with | mda -> let path = Pdot(p, s) in use_module ~use ~loc path mda; - (path, mda) + (path, locks, mda) | exception Not_found -> may_lookup_error errors loc env (Unbound_module (Ldot(l, s))) let lookup_dot_value ~errors ~use ~loc l s env = - let (path, comps) = + let (path, locks, comps) = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_values with | vda -> let path = Pdot(path, s) in use_value ~use ~loc path vda; - (path, vda.vda_description) + (path, locks, vda) | exception Not_found -> may_lookup_error errors loc env (Unbound_value (Ldot(l, s), No_hint)) let lookup_dot_type ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in + let (p, _, comps) = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_types with | tda -> let path = Pdot(p, s) in @@ -3238,7 +3341,7 @@ let lookup_dot_type ~errors ~use ~loc l s env = may_lookup_error errors loc env (Unbound_type (Ldot(l, s))) let lookup_dot_modtype ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in + let (p, _, comps) = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_modtypes with | mta -> let path = Pdot(p, s) in @@ -3248,17 +3351,17 @@ let lookup_dot_modtype ~errors ~use ~loc l s env = may_lookup_error errors loc env (Unbound_modtype (Ldot(l, s))) let lookup_dot_class ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in + let (p, locks, comps) = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_classes with | clda -> let path = Pdot(p, s) in use_class ~use ~loc path clda; - (path, clda.clda_declaration) + (path, locks, clda.clda_declaration) | exception Not_found -> may_lookup_error errors loc env (Unbound_class (Ldot(l, s))) let lookup_dot_cltype ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in + let (p, _, comps) = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_cltypes with | cltda -> let path = Pdot(p, s) in @@ -3268,7 +3371,7 @@ let lookup_dot_cltype ~errors ~use ~loc l s env = may_lookup_error errors loc env (Unbound_cltype (Ldot(l, s))) let lookup_all_dot_labels ~errors ~use ~loc usage l s env = - let (_, comps) = lookup_structure_components ~errors ~use ~loc l env in + let (_, _, comps) = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_labels with | [] | exception Not_found -> may_lookup_error errors loc env (Unbound_label (Ldot(l, s))) @@ -3286,7 +3389,7 @@ let lookup_all_dot_constructors ~errors ~use ~loc usage l s env = lookup_all_ident_constructors ~errors ~use ~loc usage s (Lazy.force initial) | _ -> - let (_, comps) = lookup_structure_components ~errors ~use ~loc l env in + let (_, _, comps) = lookup_structure_components ~errors ~use ~loc l env in match NameMap.find s comps.comp_constrs with | [] | exception Not_found -> may_lookup_error errors loc env (Unbound_constructor (Ldot(l, s))) @@ -3299,27 +3402,68 @@ let lookup_all_dot_constructors ~errors ~use ~loc usage l s env = (* General forms of the lookup functions *) -let lookup_module_path ~errors ~use ~loc ~load lid env : Path.t = - match lid with - | Lident s -> - if !Clflags.transparent_modules && not load then - fst (lookup_ident_module Don't_load ~errors ~use ~loc s env) - else - fst (lookup_ident_module Load ~errors ~use ~loc s env) - | Ldot(l, s) -> fst (lookup_dot_module ~errors ~use ~loc l s env) - | Lapply _ as lid -> - let path_f, _comp_f, path_arg = lookup_apply ~errors ~use ~loc lid env in - Papply(path_f, path_arg) +let lookup_module_path ~errors ~use ~lock ~loc ~load lid env : Path.t * _ = + let path, locks = + match lid with + | Lident s -> + if !Clflags.transparent_modules && not load then + let path, locks, _ = + lookup_ident_module Don't_load ~errors ~use ~loc s env + in + path, locks + else + let path, locks, _ = + lookup_ident_module Load ~errors ~use ~loc s env + in + path, locks + | Ldot(l, s) -> + let path, locks, _ = lookup_dot_module ~errors ~use ~loc l s env in + path, locks + | Lapply _ as lid -> + let path_f, _comp_f, path_arg = lookup_apply ~errors ~use ~loc lid env in + Papply(path_f, path_arg), [] + in + let vmode = + if lock then + walk_locks ~errors ~loc ~env ~item:Module ~lid mda_mode None locks + else + mode_default mda_mode + in + path, vmode let lookup_value_lazy ~errors ~use ~loc lid env = match lid with | Lident s -> lookup_ident_value ~errors ~use ~loc s env - | Ldot(l, s) -> - let path, desc = lookup_dot_value ~errors ~use ~loc l s env in - let mode = Mode.Value.legacy in - path, desc, mode, false, None + | Ldot(l, s) -> lookup_dot_value ~errors ~use ~loc l s env | Lapply _ -> assert false +let lookup_value ~errors ~use ~loc lid env = + check_value_name (Longident.last lid) loc; + let path, locks, vda = + lookup_value_lazy ~errors ~use ~loc lid env + in + (* There can be locks between the definition and a use of a value. For + example, if a function closes over a value, there will be Closure_lock between + the value's definition and the value's use in the function. Walking the locks + will constrain the function and the value's modes accrodingly. + + Here, we apply the modalities to acquire the mode of the value at the + definition site, using which we walk the locks. That means the surrounding + closure would be closing over the value instead of the module. The latter can + be achieved by walking the locks before apply modalities. + + Our route provides better ergonomics, but is dangerous as it doesn't reflect + the real runtime behaviour. With the current set-up, it is sound. *) + let vd, mode = normalize_vda_mode vda in + let vd = Subst.Lazy.force_value_description vd in + let vmode = + if use then + walk_locks ~errors ~loc ~env ~item:Value ~lid mode (Some vd.val_type) locks + else + mode_default mode + in + path, vd, vmode + let lookup_type_full ~errors ~use ~loc lid env = match lid with | Lident s -> lookup_ident_type ~errors ~use ~loc s env @@ -3341,10 +3485,19 @@ let lookup_modtype ~errors ~use ~loc lid env = path, Subst.Lazy.force_modtype_decl mt let lookup_class ~errors ~use ~loc lid env = - match lid with - | Lident s -> lookup_ident_class ~errors ~use ~loc s env - | Ldot(l, s) -> lookup_dot_class ~errors ~use ~loc l s env - | Lapply _ -> assert false + let path, locks, cld = + match lid with + | Lident s -> lookup_ident_class ~errors ~use ~loc s env + | Ldot(l, s) -> lookup_dot_class ~errors ~use ~loc l s env + | Lapply _ -> assert false + in + let vmode = + if use then + walk_locks ~errors ~loc ~env ~item:Class ~lid clda_mode None locks + else + mode_default clda_mode + in + path, cld, vmode let lookup_cltype ~errors ~use ~loc lid env = match lid with @@ -3404,14 +3557,15 @@ let lookup_all_constructors_from_type ~use ~loc usage ty_path env = let find_module_by_name lid env = let loc = Location.(in_file !input_name) in - lookup_module ~errors:false ~use:false ~loc lid env + let path, desc, _ = + lookup_module ~errors:false ~use:false ~lock:false ~loc lid env + in + path, desc let find_value_by_name lid env = let loc = Location.(in_file !input_name) in - let path, desc, _, _, _ = - lookup_value_lazy ~errors:false ~use:false ~loc lid env - in - path, Subst.Lazy.force_value_description desc + let path, desc, _ = lookup_value ~errors:false ~use:false ~loc lid env in + path, desc let find_type_by_name lid env = let loc = Location.(in_file !input_name) in @@ -3423,7 +3577,8 @@ let find_modtype_by_name lid env = let find_class_by_name lid env = let loc = Location.(in_file !input_name) in - lookup_class ~errors:false ~use:false ~loc lid env + let path, desc, _ = lookup_class ~errors:false ~use:false ~loc lid env in + path, desc let find_cltype_by_name lid env = let loc = Location.(in_file !input_name) in @@ -3456,27 +3611,18 @@ let find_cltype_index id env = find_index_tbl id env.cltypes (* Ordinary lookup functions *) -let lookup_module_path ?(use=true) ~loc ~load lid env = - lookup_module_path ~errors:true ~use ~loc ~load lid env +let lookup_module_path ?(use=true) ?(lock=use) ~loc ~load lid env = + let path, vmode = + lookup_module_path ~errors:true ~use ~lock ~loc ~load lid env + in + path, vmode.mode -let lookup_module ?(use=true) ~loc lid env = - lookup_module ~errors:true ~use ~loc lid env +let lookup_module ?(use=true) ?(lock=use) ~loc lid env = + let path, desc, vmode = lookup_module ~errors:true ~use ~lock ~loc lid env in + path, desc, vmode.mode let lookup_value ?(use=true) ~loc lid env = - check_value_name (Longident.last lid) loc; - let path, desc, mode, must_box, reasons = - lookup_value_lazy ~errors:true ~use ~loc lid env - in - let vd = Subst.Lazy.force_value_description desc in - if must_box then begin - match !constrain_type_jkind env vd.val_type - (Jkind.(value ~why:Captured_in_object)) - with - | Ok () -> () - | Result.Error err -> - lookup_error loc env (Non_value_used_in_object (lid, vd.val_type, err)) - end; - path, vd, mode, reasons + lookup_value ~errors:true ~use ~loc lid env let lookup_type ?(use=true) ~loc lid env = lookup_type ~errors:true ~use ~loc lid env @@ -3488,7 +3634,8 @@ let lookup_modtype_path ?(use=true) ~loc lid env = fst (lookup_modtype_lazy ~errors:true ~use ~loc lid env) let lookup_class ?(use=true) ~loc lid env = - lookup_class ~errors:true ~use ~loc lid env + let path, desc, vmode = lookup_class ~errors:true ~use ~loc lid env in + path, desc, vmode.mode let lookup_cltype ?(use=true) ~loc lid env = lookup_cltype ~errors:true ~use ~loc lid env @@ -3518,8 +3665,8 @@ let lookup_all_labels_from_type ?(use=true) ~loc usage ty_path env = lookup_all_labels_from_type ~use ~loc usage ty_path env let lookup_instance_variable ?(use=true) ~loc name env = - match IdTbl.find_name_and_modes wrap_value ~mark:use name env.values with - | (path, _, Val_bound vda) -> begin + match IdTbl.find_name_and_locks wrap_value ~mark:use name env.values with + | Ok (path, _, Val_bound vda) -> begin let desc = vda.vda_description in match desc.val_kind with | Val_ivar(mut, cl_num) -> @@ -3528,34 +3675,37 @@ let lookup_instance_variable ?(use=true) ~loc name env = | _ -> lookup_error loc env (Not_an_instance_variable name) end - | (_, _, Val_unbound Val_unbound_instance_variable) -> + | Ok (_, _, Val_unbound Val_unbound_instance_variable) -> lookup_error loc env (Masked_instance_variable (Lident name)) - | (_, _, Val_unbound Val_unbound_self) -> + | Ok (_, _, Val_unbound Val_unbound_self) -> lookup_error loc env (Not_an_instance_variable name) - | (_, _, Val_unbound Val_unbound_ancestor) -> + | Ok (_, _, Val_unbound Val_unbound_ancestor) -> lookup_error loc env (Not_an_instance_variable name) - | (_, _, Val_unbound Val_unbound_ghost_recursive _) -> + | Ok (_, _, Val_unbound Val_unbound_ghost_recursive _) -> lookup_error loc env (Unbound_instance_variable name) - | exception Not_found -> + | Error _ -> lookup_error loc env (Unbound_instance_variable name) (* Checking if a name is bound *) let bound_module name env = - match IdTbl.find_name wrap_module ~mark:false name env.modules with - | _ -> true - | exception Not_found -> + match IdTbl.find_name_and_locks wrap_module ~mark:false name env.modules with + | Ok _ -> true + | Error _ -> if Current_unit_name.is name then false else begin - match find_pers_mod (name |> Compilation_unit.Name.of_string) with + match + find_pers_mod ~allow_hidden:false + (name |> Compilation_unit.Name.of_string) + with | _ -> true | exception Not_found -> false end let bound wrap proj name env = - match IdTbl.find_name_and_modes wrap ~mark:false name (proj env) with - | _ -> true - | exception Not_found -> false + match IdTbl.find_name_and_locks wrap ~mark:false name (proj env) with + | Ok _ -> true + | Error _ -> false let bound_value name env = bound wrap_value (fun env -> env.values) name env @@ -3581,7 +3731,7 @@ let find_all wrap proj1 proj2 f lid env acc = (fun name (p, data) acc -> f name p data acc) (proj1 env) acc | Some l -> - let p, desc = + let p, _locks, desc = lookup_module_components ~errors:false ~use:false ~loc:Location.none l env in @@ -3601,7 +3751,7 @@ let find_all_simple_list proj1 proj2 f lid env acc = (fun data acc -> f data acc) (proj1 env) acc | Some l -> - let (_p, desc) = + let (_p, _locks, desc) = lookup_module_components ~errors:false ~use:false ~loc:Location.none l env in @@ -3641,7 +3791,7 @@ let fold_modules f lid env acc = env.modules acc | Some l -> - let p, desc = + let p, _locks, desc = lookup_module_components ~errors:false ~use:false ~loc:Location.none l env in @@ -3664,7 +3814,9 @@ let fold_values f = (fun k p ve acc -> match ve with | Val_unbound _ -> acc - | Val_bound vda -> f k p vda.vda_description acc) + | Val_bound vda -> + let vd, mode = normalize_vda_mode vda in + f k p vd mode acc) and fold_constructors f = find_all_simple_list (fun env -> env.constrs) (fun sc -> sc.comp_constrs) (fun cda acc -> f cda.cda_description acc) @@ -3803,7 +3955,7 @@ let spellcheck_name ppf extract env name = (fun () -> Misc.spellcheck (extract env) name) let extract_values path env = - fold_values (fun name _ _ acc -> name :: acc) path env [] + fold_values (fun name _ _ _ acc -> name :: acc) path env [] let extract_types path env = fold_types (fun name _ _ acc -> name :: acc) path env [] let extract_modules path env = @@ -3820,7 +3972,7 @@ let extract_cltypes path env = fold_cltypes (fun name _ _ acc -> name :: acc) path env [] let extract_instance_variables env = fold_values - (fun name _ descr acc -> + (fun name _ descr _ acc -> match descr.val_kind with | Val_ivar _ -> name :: acc | _ -> acc) None env [] @@ -3833,7 +3985,7 @@ let string_of_escaping_context : escaping_context -> string = | Module -> "a module" | Lazy -> "a lazy expression" -let string_of_shared_context = +let string_of_shared_context : shared_context -> string = function | For_loop -> "a for loop" | While_loop -> "a while loop" @@ -3845,6 +3997,51 @@ let string_of_shared_context = | Probe -> "a probe" | Lazy -> "a lazy expression" +let sharedness_hint ppf : shared_context -> _ = function + | For_loop -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it was defined outside of the for-loop.@]" + | While_loop -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it was defined outside of the while-loop.@]" + | Comprehension -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it was defined outside of the comprehension.@]" + | Letop -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it was defined outside of the let-op.@]" + | Class -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it is defined in a class.@]" + | Closure -> + Format.fprintf ppf + "@[Hint: This identifier was defined outside of the current closure.@ \ + Either this closure has to be once, or the identifier can be used only@ \ + as shared.@]" + | Module -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it is defined in a module.@]" + | Probe -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it is defined outside of the probe.@]" + | Lazy -> + Format.fprintf ppf + "@[Hint: This identifier cannot be used uniquely,@ \ + because it is defined outside of the lazy expression.@]" + +let print_lock_item ppf (item, lid) = + match item with + | Module -> fprintf ppf "Modules are" + | Class -> fprintf ppf "Classes are" + | Value -> fprintf ppf "The value %a is" !print_longident lid + let report_lookup_error _loc env ppf = function | Unbound_value(lid, hint) -> begin fprintf ppf "Unbound value %a" !print_longident lid; @@ -3901,12 +4098,7 @@ let report_lookup_error _loc env ppf = function end | Unbound_cltype lid -> fprintf ppf "Unbound class type %a" !print_longident lid; - begin match lid with - | Lident "float" -> - Misc.did_you_mean ppf (fun () -> ["float#"]) - | Lident _ | Ldot _ | Lapply _ -> - spellcheck ppf extract_cltypes env lid - end; + spellcheck ppf extract_cltypes env lid | Unbound_instance_variable s -> fprintf ppf "Unbound instance variable %s" s; spellcheck_name ppf extract_instance_variables env s; @@ -3953,36 +4145,40 @@ let report_lookup_error _loc env ppf = function fprintf ppf "The module %a is an alias for module %a, which %s" !print_longident lid !print_path p cause - | Local_value_escaping (lid, context) -> + | Local_value_escaping (item, lid, context) -> fprintf ppf - "@[The value %a is local, so cannot be used \ + "@[%a local, so cannot be used \ inside %s.@]" - !print_longident lid (string_of_escaping_context context); - | Once_value_used_in (lid, context) -> + print_lock_item (item, lid) + (string_of_escaping_context context); + | Once_value_used_in (item, lid, context) -> fprintf ppf - "@[The value %a is once, so cannot be used \ + "@[%a once, so cannot be used \ inside %s@]" - !print_longident lid (string_of_shared_context context) - | Value_used_in_closure (lid, error) -> + print_lock_item (item, lid) + (string_of_shared_context context) + | Value_used_in_closure (item, lid, error, context) -> let e0, e1 = match error with - | Locality _ -> "local", "might escape" - | Linearity -> "once", "is many" + | Error (Areality, _) -> "local", "might escape" + | Error (Linearity, _) -> "once", "is many" + | Error (Portability, _) -> "nonportable", "is portable" in fprintf ppf - "@[The value %a is %s, so cannot be used \ + "@[%a %s, so cannot be used \ inside a closure that %s.@]" - !print_longident lid e0 e1; - begin match error with - | Locality (Some Tailcall_argument) -> + print_lock_item (item, lid) + e0 e1; + begin match error, context with + | Error (Areality, _), Some Tailcall_argument -> fprintf ppf "@.@[Hint: The closure might escape because it \ is an argument to a tail call@]" | _ -> () end - | Local_value_used_in_exclave lid -> - fprintf ppf "@[The value %a is local, so it cannot be used \ + | Local_value_used_in_exclave (item, lid) -> + fprintf ppf "@[%a local, so it cannot be used \ inside an exclave_@]" - !print_longident lid + print_lock_item (item, lid) | Non_value_used_in_object (lid, typ, err) -> fprintf ppf "@[%a must have a type of layout value because it is \ captured by an object.@ %a@]" diff --git a/typing/env.mli b/typing/env.mli index a2229374e28..ab94e4c0cf5 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -18,11 +18,6 @@ open Types open Misc -val register_uid : Uid.t -> loc:Location.t -> attributes:Parsetree.attribute list -> unit - -val get_uid_to_loc_tbl : unit -> Location.t Types.Uid.Tbl.t -val get_uid_to_attributes_tbl : unit -> Parsetree.attribute list Types.Uid.Tbl.t - type value_unbound_reason = | Val_unbound_instance_variable | Val_unbound_self @@ -34,7 +29,7 @@ type module_unbound_reason = type summary = Env_empty - | Env_value of summary * Ident.t * value_description * Mode.Value.t + | Env_value of summary * Ident.t * value_description * Mode.Value.l | Env_type of summary * Ident.t * type_declaration | Env_extension of summary * Ident.t * extension_constructor | Env_module of summary * Ident.t * module_presence * module_declaration @@ -89,6 +84,10 @@ val without_cmis: ('a -> 'b) -> 'a -> 'b (* Lookup by paths *) +val find_value_no_locks_exn: Ident.t -> t -> + Subst.Lazy.value_description * Mode.Value.l +(** Find a value by an [Ident.t]. Raises if encounters any locks. *) + val find_value: Path.t -> t -> Subst.Lazy.value_description val find_type: Path.t -> t -> type_declaration val find_type_descrs: Path.t -> t -> type_descriptions @@ -198,9 +197,11 @@ type shared_context = | Probe | Lazy -type closure_error = - | Locality of closure_context option - | Linearity +(** Items whose accesses are affected by locks *) +type lock_item = + | Value + | Module + | Class type lookup_error = | Unbound_value of Longident.t * unbound_value_hint @@ -223,10 +224,10 @@ type lookup_error = | Generative_used_as_applicative of Longident.t | Illegal_reference_to_recursive_module | Cannot_scrape_alias of Longident.t * Path.t - | Local_value_escaping of Longident.t * escaping_context - | Once_value_used_in of Longident.t * shared_context - | Value_used_in_closure of Longident.t * closure_error - | Local_value_used_in_exclave of Longident.t + | Local_value_escaping of lock_item * Longident.t * escaping_context + | Once_value_used_in of lock_item * Longident.t * shared_context + | Value_used_in_closure of lock_item * Longident.t * Mode.Value.Comonadic.error * closure_context option + | Local_value_used_in_exclave of lock_item * Longident.t | Non_value_used_in_object of Longident.t * type_expr * Jkind.Violation.t val lookup_error: Location.t -> t -> lookup_error -> 'a @@ -243,34 +244,34 @@ val lookup_error: Location.t -> t -> lookup_error -> 'a [lookup_foo ~use:true] exactly one time -- otherwise warnings may be emitted the wrong number of times. *) -(** The returned shared_context looks strange, but useful for error printing - when the returned uniqueness mode is too high because of some linearity_lock - during lookup, and fail to satisfy expected_mode in the caller. +type actual_mode = { + mode : Mode.Value.l; + context : shared_context option + (** Explains why [mode] is high. *) +} - TODO: A better approach is passing down the expected mode to this function - as argument, so that sub-moding error is triggered at the place where error - hints are immediately available. *) val lookup_value: ?use:bool -> loc:Location.t -> Longident.t -> t -> - Path.t * value_description * Mode.Value.t * shared_context option + Path.t * value_description * actual_mode val lookup_type: ?use:bool -> loc:Location.t -> Longident.t -> t -> Path.t * type_declaration val lookup_module: - ?use:bool -> loc:Location.t -> Longident.t -> t -> - Path.t * module_declaration + ?use:bool -> ?lock:bool -> loc:Location.t -> Longident.t -> t -> + Path.t * module_declaration * Mode.Value.l val lookup_modtype: ?use:bool -> loc:Location.t -> Longident.t -> t -> Path.t * modtype_declaration val lookup_class: ?use:bool -> loc:Location.t -> Longident.t -> t -> - Path.t * class_declaration + Path.t * class_declaration * Mode.Value.l val lookup_cltype: ?use:bool -> loc:Location.t -> Longident.t -> t -> Path.t * class_type_declaration val lookup_module_path: - ?use:bool -> loc:Location.t -> load:bool -> Longident.t -> t -> Path.t + ?use:bool -> ?lock:bool -> loc:Location.t -> load:bool -> Longident.t -> t -> + Path.t * Mode.Value.l val lookup_modtype_path: ?use:bool -> loc:Location.t -> Longident.t -> t -> Path.t @@ -347,14 +348,16 @@ val make_copy_of_types: t -> (t -> t) (* Insertion by identifier *) val add_value_lazy: - ?check:(string -> Warnings.t) -> ?mode:(Mode.Value.t) -> + ?check:(string -> Warnings.t) -> mode:(Mode.allowed * 'r) Mode.Value.t -> Ident.t -> Subst.Lazy.value_description -> t -> t val add_value: - ?check:(string -> Warnings.t) -> ?mode:(Mode.Value.t) -> + ?check:(string -> Warnings.t) -> mode:(Mode.allowed * 'r) Mode.Value.t -> Ident.t -> Types.value_description -> t -> t -val add_type: check:bool -> Ident.t -> type_declaration -> t -> t +val add_type: + check:bool -> ?shape:Shape.t -> Ident.t -> type_declaration -> t -> t val add_extension: - check:bool -> rebind:bool -> Ident.t -> extension_constructor -> t -> t + check:bool -> ?shape:Shape.t -> rebind:bool -> Ident.t -> + extension_constructor -> t -> t val add_module: ?arg:bool -> ?shape:Shape.t -> Ident.t -> module_presence -> module_type -> t -> t val add_module_lazy: update_summary:bool -> @@ -410,7 +413,7 @@ val remove_last_open: Path.t -> t -> t option (* Insertion by name *) val enter_value: - ?check:(string -> Warnings.t) -> + ?check:(string -> Warnings.t) -> mode:(Mode.allowed * 'r) Mode.Value.t -> string -> value_description -> t -> Ident.t * t val enter_type: scope:int -> string -> type_declaration -> t -> Ident.t * t val enter_extension: @@ -451,8 +454,8 @@ val add_escape_lock : escaping_context -> t -> t `unique` variables beyond the lock can still be accessed, but will be relaxed to `shared` *) val add_share_lock : shared_context -> t -> t -val add_closure_lock : ?closure_context:closure_context -> Mode.Locality.t - -> Mode.Linearity.t -> t -> t +val add_closure_lock : ?closure_context:closure_context + -> ('l * Mode.allowed) Mode.Value.Comonadic.t -> t -> t val add_region_lock : t -> t val add_exclave_lock : t -> t val add_unboxed_lock : t -> t @@ -469,20 +472,22 @@ val get_unit_name: unit -> Compilation_unit.t option (* Read, save a signature to/from a file *) val read_signature: - Compilation_unit.t -> filepath -> add_binding:bool -> signature + Compilation_unit.Name.t -> filepath -> add_binding:bool -> signature (* Arguments: module name, file name, [add_binding] flag. Results: signature. If [add_binding] is true, creates an entry for the module in the environment. *) val save_signature: - alerts:alerts -> signature -> Compilation_unit.t -> filepath - -> Cmi_format.cmi_infos_lazy - (* Arguments: signature, module name, file name. *) + alerts:alerts -> signature -> Compilation_unit.Name.t -> Cmi_format.kind + -> filepath -> Cmi_format.cmi_infos_lazy + (* Arguments: signature, module name, module kind, file name. *) val save_signature_with_imports: - alerts:alerts -> signature -> Compilation_unit.t -> filepath - -> Import_info.t array - -> Cmi_format.cmi_infos_lazy - (* Arguments: signature, module name, file name, - imported units with their CRCs. *) + alerts:alerts -> signature -> Compilation_unit.Name.t -> Cmi_format.kind + -> filepath -> Import_info.t array -> Cmi_format.cmi_infos_lazy + (* Arguments: signature, module name, module kind, + file name, imported units with their CRCs. *) + +(* Register a module as a parameter to this unit. *) +val register_parameter: Compilation_unit.Name.t -> unit (* Return the CRC of the interface of the given compilation unit *) val crc_of_unit: Compilation_unit.Name.t -> Digest.t @@ -493,12 +498,29 @@ val imports: unit -> Import_info.t list (* may raise Persistent_env.Consistbl.Inconsistency *) val import_crcs: source:string -> Import_info.t array -> unit +(* Return the set of imports represented as runtime parameters (see + [Persistent_env.runtime_parameters] for details) *) +val runtime_parameters: unit -> (Compilation_unit.Name.t * Ident.t) list + +(* Return the list of parameters specified for the current unit, in + alphabetical order *) +val parameters: unit -> Compilation_unit.Name.t list + (* [is_imported_opaque md] returns true if [md] is an opaque imported module *) val is_imported_opaque: Compilation_unit.Name.t -> bool (* [register_import_as_opaque md] registers [md] as an opaque imported module *) val register_import_as_opaque: Compilation_unit.Name.t -> unit +(* [is_parameter_unit md] returns true if [md] was compiled with + -as-parameter *) +val is_parameter_unit: Compilation_unit.Name.t -> bool + +(* [implemented_parameter md] is the argument given to -as-argument-for when + [md] was compiled *) +val implemented_parameter: + Compilation_unit.Name.t -> Compilation_unit.Name.t option + (* Summaries -- compact representation of an environment, to be exported in debugging information. *) @@ -539,8 +561,8 @@ val set_type_used_callback: val check_functor_application: (errors:bool -> loc:Location.t -> lid_whole_app:Longident.t -> - f0_path:Path.t -> args:(Path.t * Types.module_type) list -> - arg_path:Path.t -> arg_mty:Types.module_type -> + f0_path:Path.t -> args:(Path.t * Types.module_type * Mode.Value.l) list -> + arg_path:Path.t -> arg_mty:Types.module_type -> arg_mode:Mode.Value.l -> param_mty:Types.module_type -> t -> unit) ref (* Forward declaration to break mutual recursion with Typemod. *) @@ -567,8 +589,8 @@ val print_type_expr: (Format.formatter -> Types.type_expr -> unit) ref (** Folds *) val fold_values: - (string -> Path.t -> Subst.Lazy.value_description -> 'a -> 'a) -> - Longident.t option -> t -> 'a -> 'a + (string -> Path.t -> Subst.Lazy.value_description -> Mode.Value.l -> 'a -> 'a) + -> Longident.t option -> t -> 'a -> 'a val fold_types: (string -> Path.t -> type_declaration -> 'a -> 'a) -> Longident.t option -> t -> 'a -> 'a @@ -605,3 +627,5 @@ type address_head = | AHlocal of Ident.t val address_head : address -> address_head + +val sharedness_hint : Format.formatter -> shared_context -> unit diff --git a/typing/errortrace.ml b/typing/errortrace.ml index 5e80890e852..f2eab07df37 100644 --- a/typing/errortrace.ml +++ b/typing/errortrace.ml @@ -112,6 +112,7 @@ type ('a, 'variety) elt = | Bad_jkind_sort : type_expr * Jkind.Violation.t -> ('a, _) elt | Unequal_var_jkinds : type_expr * Jkind.t * type_expr * Jkind.t -> ('a, _) elt + | Unequal_var_jkinds_with_no_history type ('a, 'variety) t = ('a, 'variety) elt list @@ -128,6 +129,7 @@ let map_elt (type variety) f : ('a, variety) elt -> ('b, variety) elt = function | Bad_jkind _ as x -> x | Bad_jkind_sort _ as x -> x | Unequal_var_jkinds _ as x -> x + | Unequal_var_jkinds_with_no_history as x -> x let map f t = List.map (map_elt f) t diff --git a/typing/errortrace.mli b/typing/errortrace.mli index b4f7657fe8b..f284923ef07 100644 --- a/typing/errortrace.mli +++ b/typing/errortrace.mli @@ -97,6 +97,7 @@ type ('a, 'variety) elt = | Bad_jkind_sort : type_expr * Jkind.Violation.t -> ('a, _) elt | Unequal_var_jkinds : type_expr * Jkind.t * type_expr * Jkind.t -> ('a, _) elt + | Unequal_var_jkinds_with_no_history type ('a, 'variety) t = ('a, 'variety) elt list diff --git a/typing/global_module.ml b/typing/global_module.ml new file mode 100644 index 00000000000..adaa40f3faa --- /dev/null +++ b/typing/global_module.ml @@ -0,0 +1,232 @@ +[@@@ocaml.warning "+a-40-41-42"] + +let pp_concat pp ppf list = + Format.pp_print_list ~pp_sep:Format.pp_print_cut pp ppf list + +module Name : sig + type t = private { + head : string; + args : (t * t) list; + } + + val create : string -> (t * t) list -> t + + val unsafe_create_unchecked : string -> (t * t) list -> t + + include Identifiable.S with type t := t +end = struct + type t = { + head : string; + args : (t * t) list; + } + + include Identifiable.Make (struct + type nonrec t = t + + let rec compare + ({ head = head1; args = args1 } as t1) + ({ head = head2; args = args2 } as t2) = + if t1 == t2 then 0 + else + match String.compare head1 head2 with + | 0 -> List.compare compare_arg args1 args2 + | c -> c + and compare_arg (name1, arg1) (name2, arg2) = + match compare name1 name2 with + | 0 -> compare arg1 arg2 + | c -> c + + let equal t1 t2 = compare t1 t2 = 0 + + let rec print ppf ({ head; args } : t) = + match args with + | [] -> + (* Preserve simple non-wrapping behaviour in atomic case *) + Format.fprintf ppf "%s" head + | _ -> + Format.fprintf ppf "@[%s%a@]" + head + (pp_concat print_arg_pair) args + and print_arg_pair ppf (name, arg) = + Format.fprintf ppf "[%a:%a]" print name print arg + + let output = print |> Misc.output_of_print + + let hash = Hashtbl.hash + end) + + let create head args = + let sorted_args = + List.sort_uniq (fun (name1, _) (name2, _) -> compare name1 name2) args + in + let t = { head; args = sorted_args } in + if List.length args != List.length sorted_args then + Misc.fatal_errorf "Names of instance arguments must be unique:@ %a" + print t; + t + + let unsafe_create_unchecked head args = { head; args } +end + +let compare_arg_name (name1, _) (name2, _) = Name.compare name1 name2 + +let rec list_similar f list1 list2 = + match list1, list2 with + | [], [] -> true + | a :: list1, b :: list2 -> f a b && list_similar f list1 list2 + | (_ :: _), [] | [], (_ :: _) -> false + +module T0 : sig + type t = private { + head : string; + visible_args : (Name.t * t) list; + hidden_args : (Name.t * t) list; + } + + include Identifiable.S with type t := t + + val create : string -> (Name.t * t) list -> hidden_args:(Name.t * t) list -> t + + val to_name : t -> Name.t +end = struct + type t = { + head : string; + visible_args : (Name.t * t) list; + hidden_args : (Name.t * t) list; + } + + include Identifiable.Make (struct + type nonrec t = t + + let rec compare + ({ head = head1; visible_args = visible_args1; hidden_args = hidden_args1 } as t1) + ({ head = head2; visible_args = visible_args2; hidden_args = hidden_args2 } as t2) = + if t1 == t2 then 0 + else + match String.compare head1 head2 with + | 0 -> begin + match List.compare compare_pairs visible_args1 visible_args2 with + | 0 -> List.compare compare_pairs hidden_args1 hidden_args2 + | c -> c + end + | c -> c + and compare_pairs (param1, value1) (param2, value2) = + match Name.compare param1 param2 with + | 0 -> compare value1 value2 + | c -> c + + let equal t1 t2 = compare t1 t2 = 0 + + let rec equal_looking t name = + let { head; visible_args; hidden_args } = t in + let { Name.head = name_head; args = name_args } = name in + hidden_args = [] + && String.equal head name_head + && list_similar equal_looking_args visible_args name_args + and equal_looking_args (name1, value1) (name2, value2) = + Name.equal name1 name2 && equal_looking value1 value2 + + let rec print ppf { head; visible_args; hidden_args } = + Format.fprintf ppf "@[%s%a%a@]" + head + (pp_concat print_visible_pair) visible_args + (pp_concat print_hidden_pair) hidden_args + and print_visible_pair ppf (name, value) = + Format.fprintf ppf "[%a:%a]" Name.print name print value + and print_hidden_pair ppf (name, value) = + if equal_looking value name then + Format.fprintf ppf "{%a}" Name.print name + else + Format.fprintf ppf "{%a:%a}" Name.print name print value + + let output = print |> Misc.output_of_print + + let hash = Hashtbl.hash + end) + + let create head visible_args ~hidden_args = + let visible_args_sorted = List.sort compare_arg_name visible_args in + let hidden_args_sorted = List.sort compare_arg_name hidden_args in + let t = + { + head; + visible_args = visible_args_sorted; + hidden_args = hidden_args_sorted; + } + in + if + List.length visible_args != List.length visible_args_sorted + || List.length hidden_args != List.length hidden_args_sorted + then + Misc.fatal_errorf "Names of arguments and parameters must be unique:@ %a" + print t; + t + + (* CR-someday lmaurer: Should try and make this unnecessary or at least cheap. + Could do it by making [Name.t] an unboxed existential so that converting from + [t] is the identity. Or just have [Name.t] wrap [t] and ignore [hidden_args]. *) + let rec to_name ({ head; visible_args; hidden_args = _ }) : Name.t = + (* Safe because we already checked the names in this exact argument list *) + Name.unsafe_create_unchecked head (List.map arg_to_name visible_args) + and arg_to_name (name, value) = + name, to_name value +end + +include T0 + +let all_args t = t.visible_args @ t.hidden_args + +module Subst = Name.Map +type subst = t Subst.t + +let rec subst0 (t : t) (s : subst) ~changed = + match Subst.find_opt (to_name t) s with + | Some rhs -> changed := true; rhs + | None -> subst0_inside t s ~changed +and subst0_inside { head; visible_args; hidden_args } s ~changed = + let matching_hidden_args, non_matching_hidden_args = + List.partition_map + (fun ((name, value) as pair) -> + match Subst.find_opt (to_name value) s with + | Some rhs -> changed := true; Left (name, rhs) + | None -> Right pair) + hidden_args + in + let visible_args = subst0_alist visible_args s ~changed in + let hidden_args = subst0_alist non_matching_hidden_args s ~changed in + let visible_args = + List.merge compare_arg_name visible_args matching_hidden_args + in + create head visible_args ~hidden_args +and subst0_alist l s ~changed = + List.map (fun (name, value) -> name, subst0 value s ~changed) l + +let subst t s = + let changed = ref false in + let new_t = subst0 t s ~changed in + if !changed then new_t, `Changed else t, `Did_not_change + +let subst_inside t s = + let changed = ref false in + let new_t = subst0_inside t s ~changed in + if !changed then new_t else t + +let check s args = + (* This could do more - say, check that the replacement (the argument) has + all the parameters of the original (the parameter). (The subset rule + requires this, since an argument has to refer to the parameter it + implements, and thus the parameter's parameters must include the + argument's parameters.) It would be redundant with the checks + implemented elsewhere but could still be helpful. *) + let param_set = List.map to_name args |> Name.Set.of_list in + Name.Set.subset (Name.Map.keys s) param_set + +let rec is_complete t = + match t.hidden_args with + | [] -> List.for_all (fun (_, value) -> is_complete value) t.visible_args + | _ -> false + +let has_arguments t = + match t with + | { head = _; visible_args = []; hidden_args = [] } -> false + | _ -> true diff --git a/typing/global_module.mli b/typing/global_module.mli new file mode 100644 index 00000000000..3f77c7918c1 --- /dev/null +++ b/typing/global_module.mli @@ -0,0 +1,100 @@ +[@@@ocaml.warning "+a-9-40-41-42"] + +module Name : sig + type t = private { + head : string; + args : (t * t) list; + } + + include Identifiable.S with type t := t + + val create : string -> (t * t) list -> t +end + +(** An elaborated form of name in which all arguments are expressed, including + those being passed implicitly from one module to another by the subset rule + for parameterised modules. Normally, these "hidden" arguments simply say to + pass [X] as [X] for some module [X], but if there are parameterised + parameters, the hidden arguments can get more complex. + + Suppose [M] takes parameters [X] and [Y], neither of which is itself + parameterised. If someone is passing [Foo] as the value of [X], then, we + will have (abbreviating nested records): + + {v + { head: M; visible_args: [ X, Foo ]; hidden_args: [ Y, Y ] } + v} + + This represents that [X] is explicitly being given the value [Foo] and [Y] + (the parameter) is implicitly getting the value [Y] (the argument currently + in scope). + + However, suppose instead [Y] is parameterised by [X]. Then [M] still takes + two parameters [X] and [Y], but now once [X] has the value [Foo], [Y] + requires _that particular_ [X]: + + {v + { head: M; visible_args: [ X, Foo ]; hidden_args: [ Y, Y[X:Foo] ] } + v} + + Importantly, the _parameters_ [X] and [Y] never change: they are names that + appear in [m.ml] and [m.cmi]. But further specialisation requires passing + specifically a [Y[X:Foo]] rather than a [Y]. (Here, [Y[X:Foo]] stands for + the record [{ head = Y; visible_args = [ X, Foo ]; hidden_args = [] }] of + type [t].) +*) +type t = private { + head : string; + visible_args : (Name.t * t) list; + hidden_args : (Name.t * t) list; +} + +include Identifiable.S with type t := t + +val create : string -> (Name.t * t) list -> hidden_args:(Name.t * t) list -> t + +val to_name : t -> Name.t + +val all_args : t -> (Name.t * t) list + +(** A map from parameter names to their values. Hidden arguments aren't relevant + in the parameter names, so they're represented by [Name.t]s here. *) +type subst = t Name.Map.t + +(** Apply a substitution to the given global. If it appears in the substitution + directly (that is, its [Name.t] form is a key in the map), this simply + performs a lookup. Otherwise, we perform a _revealing substitution_: if the + value of a hidden argument is a key in the substitution, the argument becomes + visible. Otherwise, substitution recurses into arguments (both hidden and + visible) as usual. See [global_test.ml] for examples. *) +val subst : t -> subst -> t * [ `Changed | `Did_not_change ] + +(** Apply a substitution to the arguments and parameters in [t] but not to [t] + itself. Useful if [subst] is constructed from some parameter-argument pairs + and [t] is one of the parameters, since we want to handle any + interdependencies but the substitution applied to [t] itself is + uninterestingly just the corresponding value. *) +val subst_inside : t -> subst -> t + +(** Check that a substitution is a valid (possibly partial) instantiation of + a module with the given parameter list. Each name being substituted must + appear in the list. *) +val check : subst -> t list -> bool + +(** Returns [true] if [hidden_args] is empty and all argument values (if any) + are also complete. This is a stronger condition than full application, and + (unless the whole global is itself a parameter) it's equivalent to the + global being a static constant, since any parameters being used would have + to show up in a [hidden_args] somewhere. (Importantly, it's not possible + that a parameter is being used as an argument to a different parameter, + since a module can be declared to be an argument for up to one parameter.) + + CR lmaurer: Make sure we're checking for the user redundantly passing an + parameter as an argument. This should be accepted and ignored, lest we + count the parameter as filled and consider something completely + instantiated. *) +val is_complete : t -> bool + +(** Returns [true] if this name has at least one argument (either hidden or + visible). *) +val has_arguments : t -> bool diff --git a/typing/ident.ml b/typing/ident.ml index b73ce03ba92..69a018c5805 100644 --- a/typing/ident.ml +++ b/typing/ident.ml @@ -50,6 +50,9 @@ let create_persistent s = let create_instance f args = Instance (f, args) +let create_local_binding_for_global glob = + create_local glob + let format_instance f args = let args_with_brackets = List.map (Format.sprintf "[%s]") args in String.concat "" (f :: args_with_brackets) diff --git a/typing/ident.mli b/typing/ident.mli index 80535e51186..7cb9fd3a6a0 100644 --- a/typing/ident.mli +++ b/typing/ident.mli @@ -35,6 +35,12 @@ val create_persistent: string -> t val create_predef: string -> t val create_instance: string -> string list -> t +val create_local_binding_for_global: string -> t + (** Creates a local identifier intended to bind the value of a global + that is not a static constant (that is, it is a parameter or depends + on one). The global is used purely for the mnemonic name for + debugging purposes - no semantic connection to the global is kept. *) + val rename: t -> t (** Creates an identifier with the same name as the input, a fresh stamp, and no scope. diff --git a/typing/includecore.ml b/typing/includecore.ml index f93ddbe4c37..468f32c28fb 100644 --- a/typing/includecore.ml +++ b/typing/includecore.ml @@ -18,6 +18,7 @@ open Asttypes open Path open Types +open Mode open Typedtree type position = Errortrace.position = First | Second @@ -34,11 +35,14 @@ type primitive_mismatch = | Native_name | Result_repr | Argument_repr of int + | Layout_poly_attr type value_mismatch = | Primitive_mismatch of primitive_mismatch | Not_a_primitive | Type of Errortrace.moregen_error + | Zero_alloc of Zero_alloc.error + | Modality of Mode.Modality.Value.error exception Dont_match of value_mismatch @@ -64,6 +68,10 @@ let primitive_descriptions pd1 pd2 = Some (No_alloc First) else if pd1.prim_alloc && (not pd2.prim_alloc) then Some (No_alloc Second) + else if not + (Bool.equal pd1.prim_is_layout_poly + pd2.prim_is_layout_poly) then + Some Layout_poly_attr else if not (Bool.equal pd1.prim_c_builtin pd2.prim_c_builtin) then Some Builtin else if not (Primitive.equal_effects pd1.prim_effects pd2.prim_effects) then @@ -90,13 +98,21 @@ let value_descriptions ~loc env name loc vd1.val_attributes vd2.val_attributes name; + begin match Zero_alloc.sub vd1.val_zero_alloc vd2.val_zero_alloc with + | Ok () -> () + | Error e -> raise (Dont_match (Zero_alloc e)) + end; + begin match Mode.Modality.Value.sub vd1.val_modalities vd2.val_modalities with + | Ok () -> () + | Error e -> raise (Dont_match (Modality e)) + end; match vd1.val_kind with | Val_prim p1 -> begin match vd2.val_kind with | Val_prim p2 -> begin - let ty1_global, _ = Ctype.instance_prim_mode p1 vd1.val_type in + let ty1_global, _, _ = Ctype.instance_prim p1 vd1.val_type in let ty2_global = - let ty2, mode2 = Ctype.instance_prim_mode p2 vd2.val_type in + let ty2, mode2, _ = Ctype.instance_prim p2 vd2.val_type in Option.iter (fun m -> Mode.Locality.submode_exn m Mode.Locality.global) mode2; @@ -104,9 +120,9 @@ let value_descriptions ~loc env name in (try Ctype.moregeneral env true ty1_global ty2_global with Ctype.Moregen err -> raise (Dont_match (Type err))); - let ty1_local, _ = Ctype.instance_prim_mode p1 vd1.val_type in + let ty1_local, _, _ = Ctype.instance_prim p1 vd1.val_type in let ty2_local = - let ty2, mode2 = Ctype.instance_prim_mode p2 vd2.val_type in + let ty2, mode2, _ = Ctype.instance_prim p2 vd2.val_type in Option.iter (fun m -> Mode.Locality.submode_exn Mode.Locality.local m) mode2; @@ -119,11 +135,13 @@ let value_descriptions ~loc env name | Some err -> raise (Dont_match (Primitive_mismatch err)) end | _ -> - let ty1, mode1 = Ctype.instance_prim_mode p1 vd1.val_type in + let ty1, mode1, sort1 = Ctype.instance_prim p1 vd1.val_type in (try Ctype.moregeneral env true ty1 vd2.val_type with Ctype.Moregen err -> raise (Dont_match (Type err))); let pc = - {pc_desc = p1; pc_type = vd2.Types.val_type; pc_poly_mode = mode1; + {pc_desc = p1; pc_type = vd2.Types.val_type; + pc_poly_mode = Option.map Mode.Locality.disallow_right mode1; + pc_poly_sort=sort1; pc_env = env; pc_loc = vd1.Types.val_loc; } in Tcoerce_primitive pc end @@ -171,8 +189,6 @@ type privacy_mismatch = | Private_extensible_variant | Private_row_type -type locality_mismatch = { order : position } - type type_kind = | Kind_abstract | Kind_record @@ -190,7 +206,7 @@ type kind_mismatch = type_kind * type_kind type label_mismatch = | Type of Errortrace.equality_error | Mutability of position - | Nonlocality of locality_mismatch + | Modality of Modality.Value.equate_error type record_change = (Types.label_declaration, Types.label_declaration, label_mismatch) @@ -201,6 +217,7 @@ type record_mismatch = | Inlined_representation of position | Float_representation of position | Ufloat_representation of position + | Mixed_representation of position type constructor_mismatch = | Type of Errortrace.equality_error @@ -208,7 +225,7 @@ type constructor_mismatch = | Inline_record of record_change list | Kind of position | Explicit_return_type of position - | Nonlocality of int * locality_mismatch + | Modality of int * Modality.Value.equate_error type extension_constructor_mismatch = | Constructor_privacy @@ -247,13 +264,21 @@ type type_mismatch = | Extensible_representation of position | Jkind of Jkind.Violation.t -let report_locality_mismatch first second ppf err = - let {order} = err in - let sort = "global" in - Format.fprintf ppf "%s is %s and %s is not." - (String.capitalize_ascii (choose order first second)) - sort - (choose_other order first second) +let report_modality_sub_error first second ppf e = + let print_modality id ppf m = + Printtyp.modality ~id:(fun ppf -> Format.pp_print_string ppf id) ppf m + in + let Modality.Value.Error(ax, {left; right}) = e in + Format.fprintf ppf "%s is %a and %s is %a." + (String.capitalize_ascii second) + (print_modality "empty") (Atom (ax, right) : Modality.t) + first + (print_modality "not") (Atom (ax, left) : Modality.t) + +let report_modality_equate_error first second ppf ((equate_step, sub_error) : Modality.Value.equate_error) = + match equate_step with + | Left_le_right -> report_modality_sub_error first second ppf sub_error + | Right_le_left -> report_modality_sub_error second first ppf sub_error let report_primitive_mismatch first second ppf err = let pr fmt = Format.fprintf ppf fmt in @@ -280,6 +305,8 @@ let report_primitive_mismatch first second ppf err = | Argument_repr n -> pr "The two primitives' %d%s arguments have different representations" n (Misc.ordinal_suffix n) + | Layout_poly_attr -> + pr "The two primitives have different [@@layout_poly] attributes" let report_value_mismatch first second env ppf err = let pr fmt = Format.fprintf ppf fmt in @@ -293,6 +320,8 @@ let report_value_mismatch first second env ppf err = Printtyp.report_moregen_error ppf Type_scheme env trace (fun ppf -> Format.fprintf ppf "The type") (fun ppf -> Format.fprintf ppf "is not compatible with the type") + | Zero_alloc e -> Zero_alloc.print_error ppf e + | Modality e -> report_modality_sub_error first second ppf e let report_type_inequality env ppf err = Printtyp.report_equality_error ppf Type_scheme env err @@ -319,7 +348,7 @@ let report_label_mismatch first second env ppf err = Format.fprintf ppf "%s is mutable and %s is not." (String.capitalize_ascii (choose ord first second)) (choose_other ord first second) - | Nonlocality err_ -> report_locality_mismatch first second ppf err_ + | Modality err_ -> report_modality_equate_error first second ppf err_ let pp_record_diff first second prefix decl env ppf (x : record_change) = match x with @@ -382,6 +411,11 @@ let report_record_mismatch first second decl env ppf err = pr "@[Their internal representations differ:@ %s %s %s.@]" (choose ord first second) decl "uses float# representation" + | Mixed_representation ord -> + (* CR layouts: As above. *) + pr "@[Their internal representations differ:@ %s %s %s.@]" + (choose ord first second) decl + "uses mixed representation" let report_constructor_mismatch first second decl env ppf err = let pr fmt = Format.fprintf ppf fmt in @@ -398,9 +432,9 @@ let report_constructor_mismatch first second decl env ppf err = pr "%s has explicit return type and %s doesn't." (String.capitalize_ascii (choose ord first second)) (choose_other ord first second) - | Nonlocality (i, err) -> - pr "Locality mismatch at argument position %i : %a" - (i + 1) (report_locality_mismatch first second) err + | Modality (i, err) -> + pr "Modality mismatch at argument position %i:@ %a" + (i + 1) (report_modality_equate_error first second) err (* argument position is one-based; more intuitive *) let pp_variant_diff first second prefix decl env ppf (x : variant_change) = @@ -523,28 +557,31 @@ let report_type_mismatch first second decl env ppf err = | Jkind v -> Jkind.Violation.report_with_name ~name:first ppf v -let compare_global_flags flag0 flag1 = - match flag0, flag1 with - | Global, Unrestricted -> - Some {order = First} - | Unrestricted, Global -> - Some {order = Second} - | Global, Global - | Unrestricted, Unrestricted -> - None - module Record_diffing = struct let compare_labels env params1 params2 (ld1 : Types.label_declaration) (ld2 : Types.label_declaration) = - if ld1.ld_mutable <> ld2.ld_mutable - then - let ord = if ld1.ld_mutable = Asttypes.Mutable then First else Second in - Some (Mutability ord) - else begin - match compare_global_flags ld1.ld_global ld2.ld_global with - | None -> + let mut = + match ld1.ld_mutable, ld2.ld_mutable with + | Immutable, Immutable -> None + | Mutable _, Immutable -> Some First + | Immutable, Mutable _ -> Some Second + | Mutable m1, Mutable m2 -> + let open Mode.Alloc.Comonadic.Const in + (if not (eq m1 legacy) then + Misc.fatal_errorf "Unexpected mutable(%a)" print m1); + (if not (eq m2 legacy) then + Misc.fatal_errorf "Unexpected mutable(%a)" print m2); + None + in + begin match mut with + | Some mut -> Some (Mutability mut) + | None -> + match + Modality.Value.Const.equate ld1.ld_modalities ld2.ld_modalities + with + | Ok () -> let tl1 = params1 @ [ld1.ld_type] in let tl2 = params2 @ [ld2.ld_type] in begin @@ -553,7 +590,7 @@ module Record_diffing = struct Some (Type err : label_mismatch) | () -> None end - | Some e -> Some (Nonlocality e : label_mismatch) + | Error e -> Some (Modality e : label_mismatch) end let rec equal ~loc env params1 params2 @@ -675,6 +712,12 @@ module Record_diffing = struct | _, Record_ufloat -> Some (Record_mismatch (Ufloat_representation Second)) + | Record_mixed _, Record_mixed _ -> None + | Record_mixed _, _ -> + Some (Record_mismatch (Mixed_representation First)) + | _, Record_mixed _ -> + Some (Record_mismatch (Mixed_representation Second)) + | Record_boxed _, Record_boxed _ -> None end @@ -689,6 +732,10 @@ let rec find_map_idx f ?(off = 0) l = | Some y -> Some (off, y) end +let get_error = function + | Ok () -> None + | Error e -> Some e + module Variant_diffing = struct let compare_constructor_arguments ~loc env params1 params2 arg1 arg2 = @@ -697,15 +744,17 @@ module Variant_diffing = struct if List.length arg1 <> List.length arg2 then Some (Arity : constructor_mismatch) else begin - let arg1_tys, arg1_gfs = List.split arg1 - and arg2_tys, arg2_gfs = List.split arg2 + let type_and_mode (ca : Types.constructor_argument) = ca.ca_type, ca.ca_modalities in + let arg1_tys, arg1_gfs = List.split (List.map type_and_mode arg1) + and arg2_tys, arg2_gfs = List.split (List.map type_and_mode arg2) in (* Ctype.equal must be called on all arguments at once, cf. PR#7378 *) match Ctype.equal env true (params1 @ arg1_tys) (params2 @ arg2_tys) with | exception Ctype.Equality err -> Some (Type err) | () -> List.combine arg1_gfs arg2_gfs - |> find_map_idx (fun (x,y) -> compare_global_flags x y) - |> Option.map (fun (i, err) -> Nonlocality (i, err)) + |> find_map_idx + (fun (x,y) -> get_error @@ Modality.Value.Const.equate x y) + |> Option.map (fun (i, err) -> Modality (i, err)) end | Types.Cstr_record l1, Types.Cstr_record l2 -> Option.map diff --git a/typing/includecore.mli b/typing/includecore.mli index 32c792f3197..00f5466f07b 100644 --- a/typing/includecore.mli +++ b/typing/includecore.mli @@ -30,11 +30,14 @@ type primitive_mismatch = | Native_name | Result_repr | Argument_repr of int + | Layout_poly_attr type value_mismatch = | Primitive_mismatch of primitive_mismatch | Not_a_primitive | Type of Errortrace.moregen_error + | Zero_alloc of Zero_alloc.error + | Modality of Mode.Modality.Value.error exception Dont_match of value_mismatch @@ -46,8 +49,6 @@ type privacy_mismatch = | Private_extensible_variant | Private_row_type -type locality_mismatch = { order : position } - type type_kind = | Kind_abstract | Kind_record @@ -59,7 +60,7 @@ type kind_mismatch = type_kind * type_kind type label_mismatch = | Type of Errortrace.equality_error | Mutability of position - | Nonlocality of locality_mismatch + | Modality of Mode.Modality.Value.equate_error type record_change = (Types.label_declaration as 'ld, 'ld, label_mismatch) Diffing_with_keys.change @@ -69,6 +70,7 @@ type record_mismatch = | Inlined_representation of position | Float_representation of position | Ufloat_representation of position + | Mixed_representation of position type constructor_mismatch = | Type of Errortrace.equality_error @@ -76,7 +78,7 @@ type constructor_mismatch = | Inline_record of record_change list | Kind of position | Explicit_return_type of position - | Nonlocality of int * locality_mismatch + | Modality of int * Mode.Modality.Value.equate_error type extension_constructor_mismatch = | Constructor_privacy diff --git a/typing/includemod.ml b/typing/includemod.ml index d6bffb2ed93..833ed7319c9 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -100,8 +100,13 @@ module Error = struct {less_than:module_type_diff; greater_than: module_type_diff} + type compilation_unit_comparison = + | Implementation_vs_interface + | Argument_vs_parameter + type all = - | In_Compilation_unit of (string, signature_symptom) diff + | In_Compilation_unit of + compilation_unit_comparison * (string, signature_symptom) diff | In_Signature of signature_symptom | In_Include_functor_signature of signature_symptom | In_Module_type of module_type_diff @@ -791,6 +796,8 @@ and signature_components : type_declarations ~loc env ~mark subst id1 tydec1 tydec2 in let item = mark_error_as_unrecoverable item in + (* Right now we don't filter hidden constructors / labels from the + shape. *) let shape_map = Shape.Map.add_type_proj shape_map id1 orig_shape in id1, item, shape_map, false | Sig_typext(id1, ext1, _, _), Sig_typext(_id2, ext2, _, _) -> @@ -1030,12 +1037,13 @@ let check_modtype_inclusion ~loc env mty1 path1 mty2 = let check_functor_application_in_path ~errors ~loc ~lid_whole_app ~f0_path ~args - ~arg_path ~arg_mty ~param_mty env = + ~arg_path ~arg_mty ~arg_mode ~param_mty env = + Mode.Value.submode_exn arg_mode Mode.Value.legacy; match check_modtype_inclusion_raw ~loc env arg_mty arg_path param_mty with | Ok _ -> () | Error _errs -> if errors then - let prepare_arg (arg_path, arg_mty) = + let prepare_arg (arg_path, arg_mty, _arg_mode) = let aliasable = can_alias env arg_path in let smd = Mtype.strengthen ~aliasable arg_mty arg_path in (Error.Named arg_path, smd) @@ -1054,16 +1062,30 @@ let () = (* Check that an implementation of a compilation unit meets its interface. *) -let compunit env ~mark impl_name impl_sig intf_name intf_sig unit_shape = +let compunit0 + ~comparison env ~mark impl_name impl_sig intf_name intf_sig unit_shape = match signatures ~in_eq:false ~loc:(Location.in_file impl_name) env ~mark Subst.identity impl_sig intf_sig unit_shape with Result.Error reasons -> + let diff = Error.diff impl_name intf_name reasons in let cdiff = - Error.In_Compilation_unit(Error.diff impl_name intf_name reasons) in + Error.In_Compilation_unit(comparison, diff) in raise(Error(env, cdiff)) | Ok x -> x +let compunit = compunit0 ~comparison:Implementation_vs_interface + +(* Check that the interface of a compilation unit meets the interface of the + parameter it's declared to be an argument for using [-as-argument-for] *) + +let compunit_as_argument env arg_name arg_sig param_name param_sig = + let cc, _shape = + compunit0 env arg_name arg_sig param_name param_sig Shape.dummy_mod + ~comparison:Argument_vs_parameter ~mark:Mark_positive + in + cc + (* Functor diffing computation: The diffing computation uses the internal typing function *) diff --git a/typing/includemod.mli b/typing/includemod.mli index e96c39dd18d..6cb215cc6d5 100644 --- a/typing/includemod.mli +++ b/typing/includemod.mli @@ -109,9 +109,13 @@ module Error: sig | Incomparable of {less_than:module_type_diff; greater_than: module_type_diff} + type compilation_unit_comparison = + | Implementation_vs_interface + | Argument_vs_parameter type all = - | In_Compilation_unit of (string, signature_symptom) diff + | In_Compilation_unit of + compilation_unit_comparison * (string, signature_symptom) diff | In_Signature of signature_symptom | In_Include_functor_signature of signature_symptom | In_Module_type of module_type_diff @@ -181,6 +185,9 @@ val compunit: Env.t -> mark:mark -> string -> signature -> string -> signature -> Shape.t -> module_coercion * Shape.t +val compunit_as_argument: + Env.t -> string -> signature -> string -> signature -> module_coercion + val type_declarations: loc:Location.t -> Env.t -> mark:mark -> Ident.t -> type_declaration -> type_declaration -> unit diff --git a/typing/includemod_errorprinter.ml b/typing/includemod_errorprinter.ml index fa6d3fa7c5d..72bed9660cd 100644 --- a/typing/includemod_errorprinter.ml +++ b/typing/includemod_errorprinter.ml @@ -182,15 +182,9 @@ end module Err = Includemod.Error -let buffer = ref Bytes.empty -let is_big obj = +let is_big p = let size = !Clflags.error_size in - size > 0 && - begin - if Bytes.length !buffer < size then buffer := Bytes.create size; - try ignore (Marshal.to_buffer !buffer 0 size obj []); false - with _ -> true - end + size > 0 && Misc.is_print_longer_than size p let show_loc msg ppf loc = let pos = loc.Location.loc_start in @@ -575,11 +569,11 @@ let with_context ?loc ctx printer diff = let dwith_context ?loc ctx printer = Location.msg ?loc "%a%t" Context.pp (List.rev ctx) printer -let dwith_context_and_elision ?loc ctx printer diff = - if is_big (diff.got,diff.expected) then +let dwith_context_and_elision ?loc ctx print_diff = + if is_big print_diff then Location.msg ?loc "..." else - dwith_context ?loc ctx (printer diff) + dwith_context ?loc ctx print_diff (* Merge sub msgs into one printer *) let coalesce msgs = @@ -617,6 +611,23 @@ let core env id x = show_locs (diff.got.val_loc, diff.expected.val_loc) Printtyp.Conflicts.print_explanations | Err.Type_declarations diff -> + (* Jkind history doesn't offer helpful information in the case + of a signature mismatch. This part is here to strip it away. *) + let strip_jkind_history (err: Errortrace.equality_error) = + Errortrace.equality_error + ~trace:(List.map + (function + | Errortrace.Unequal_var_jkinds _ -> + Errortrace.Unequal_var_jkinds_with_no_history + | x -> x) err.trace) + ~subst:err.subst + in + let symptom : Includecore.type_mismatch = + match diff.symptom with + | Manifest err -> Manifest (strip_jkind_history err) + | Constraint err -> Constraint (strip_jkind_history err) + | symptom -> symptom + in Format.dprintf "@[@[%s:@;<1 2>%a@ %s@;<1 2>%a@]%a%a%t@]" "Type declarations do not match" !Oprint.out_sig_item @@ -625,7 +636,7 @@ let core env id x = !Oprint.out_sig_item (Printtyp.tree_of_type_declaration id diff.expected Trec_first) (Includecore.report_type_mismatch - "the first" "the second" "declaration" env) diff.symptom + "the first" "the second" "declaration" env) symptom show_locs (diff.got.type_loc, diff.expected.type_loc) Printtyp.Conflicts.print_explanations | Err.Extension_constructors diff -> @@ -693,6 +704,16 @@ let interface_mismatch ppf (diff: _ Err.diff) = "The implementation %s@ does not match the interface %s:@ " diff.got diff.expected +let parameter_mismatch ppf (diff: _ Err.diff) = + Format.fprintf ppf + "The argument module %s@ does not match the parameter signature %s:@ " + diff.got diff.expected + +let compilation_unit_mismatch comparison ppf diff = + match (comparison : Err.compilation_unit_comparison) with + | Implementation_vs_interface -> interface_mismatch ppf diff + | Argument_vs_parameter -> parameter_mismatch ppf diff + let core_module_type_symptom (x:Err.core_module_type_symptom) = match x with | Not_an_alias | Not_an_identifier | Abstract_module_type @@ -723,7 +744,7 @@ let rec module_type ~expansion_token ~eqmode ~env ~before ~ctx diff = It is thus better to avoid eliding the current error message. *) dwith_context ctx (inner diff) - | _ -> dwith_context_and_elision ctx inner diff + | _ -> dwith_context_and_elision ctx (inner diff) in let before = next :: before in module_type_symptom ~eqmode ~expansion_token ~env ~before ~ctx @@ -792,7 +813,7 @@ and sigitem ~expansion_token ~env ~before ~ctx (name,s) = match s with module_type_decl ~expansion_token ~env ~before ~ctx name diff and module_type_decl ~expansion_token ~env ~before ~ctx id diff = let next = - dwith_context_and_elision ctx (module_type_declarations id) diff in + dwith_context_and_elision ctx (module_type_declarations id diff) in let before = next :: before in match diff.symptom with | Not_less_than mts -> @@ -869,8 +890,10 @@ let module_type_subst ~env id diff = [main] let all env = function - | In_Compilation_unit diff -> - let first = Location.msg "%a" interface_mismatch diff in + | In_Compilation_unit (comparison, diff) -> + let first = + Location.msg "%a" (compilation_unit_mismatch comparison) diff + in signature ~expansion_token:true ~env ~before:[first] ~ctx:[] diff.symptom | In_Type_declaration (id,reason) -> [Location.msg "%t" (core env id reason)] diff --git a/typing/jkind.ml b/typing/jkind.ml index 6e552b6c392..50b60865530 100644 --- a/typing/jkind.ml +++ b/typing/jkind.ml @@ -12,598 +12,1281 @@ (* *) (**************************************************************************) -type sub_result = - | Equal - | Sub - | Not_sub +open Mode +open Jkind_types -(* Jkinds *) +[@@@warning "+9"] -module Sort = struct - type const = - | Void - | Value - | Float64 +(* A *sort* is the information the middle/back ends need to be able to + compile a manipulation (storing, passing, etc) of a runtime value. *) +module Sort = Jkind_types.Sort - type t = - | Var of var - | Const of const - - and var = t option ref +type sort = Sort.t - (* To record changes to sorts, for use with `Types.{snapshot, backtrack}` *) - type change = var * t option - - let change_log : (change -> unit) ref = ref (fun _ -> ()) +type type_expr = Types.type_expr + +(* A *layout* of a type describes the way values of that type are stored at + runtime, including details like width, register convention, calling + convention, etc. A layout may be *representable* or *unrepresentable*. The + middle/back ends are unable to cope with values of types with an + unrepresentable layout. The only unrepresentable layout is `any`, which is + the top of the layout lattice. *) +module Layout = struct + open Jkind_types.Layout + + type nonrec 'sort layout = 'sort layout + + module Const = struct + type t = Sort.const layout + + let max = Any + + let equal c1 c2 = + match c1, c2 with + | Sort s1, Sort s2 -> Sort.Const.equal s1 s2 + | Any, Any -> true + | (Any | Sort _), _ -> false + + let sub (c1 : t) (c2 : t) : Misc.Le_result.t = + match c1, c2 with + | _ when equal c1 c2 -> Equal + | _, Any -> Less + | Any, Sort _ | Sort _, Sort _ -> Not_le + + let value = Sort Sort.Value + + let void = Sort Sort.Void + + let float64 = Sort Sort.Float64 + + let float32 = Sort Sort.Float32 + + let word = Sort Sort.Word + + let bits32 = Sort Sort.Bits32 + + let bits64 = Sort Sort.Bits64 + + let get_sort : t -> Sort.Const.t option = function + | Sort s -> Some s + | Any -> None + + let to_string : t -> _ = function + | Any -> "any" + | Sort Void -> "void" + | Sort Value -> "value" + | Sort Float64 -> "float64" + | Sort Float32 -> "float32" + | Sort Word -> "word" + | Sort Bits32 -> "bits32" + | Sort Bits64 -> "bits64" + + module Legacy = struct + (* CR layouts v2.8: get rid of this *) + type t = Jkind_types.Layout.Const.Legacy.t = + | Any + | Any_non_null + | Value_or_null + | Value + | Void + | Immediate64 + | Immediate + | Float64 + | Float32 + | Word + | Bits32 + | Bits64 + end + end - let log_change change = !change_log change - - let undo_change (v, t_op) = v := t_op - - let var_name : var -> string = - let next_id = ref 1 in - let named = ref [] in - fun v -> - match List.assq_opt v !named with - | Some name -> name - | None -> - let id = !next_id in - let name = "'_representable_layout_" ^ Int.to_string id in - next_id := id + 1; - named := (v, name) :: !named; - name - - let void = Const Void - - let value = Const Value - - let float64 = Const Float64 - - let some_value = Some value - - let of_const = function Void -> void | Value -> value | Float64 -> float64 - - let of_var v = Var v - - let new_var () = Var (ref None) - - let set : var -> t option -> unit = - fun v t_op -> - log_change (v, t_op); - v := t_op - - (* Post-condition: If the result is a [Var v], then [!v] is [None]. *) - let rec get : t -> t = function - | Const _ as t -> t - | Var r as t -> ( - match !r with - | None -> t - | Some s -> - let result = get s in - if result != s then set r (Some result); - (* path compression *) - result) - - let default_value : t option = Some (Const Value) - - let default_void : t option = Some (Const Void) - - let default_float64 : t option = Some (Const Float64) - - let[@inline] default = function - | Value -> default_value - | Void -> default_void - | Float64 -> default_float64 - - let rec get_default_value : t -> const = function - | Const c -> c - | Var r -> ( - match !r with - | None -> - set r default_value; - Value - | Some s -> - let result = get_default_value s in - set r (default result); - (* path compression *) - result) - - let default_to_value t = ignore (get_default_value t) - - (***********************) - (* equality *) - - type equate_result = - | Unequal - | Equal_mutated_first - | Equal_mutated_second - | Equal_no_mutation - - let swap_equate_result = function - | Equal_mutated_first -> Equal_mutated_second - | Equal_mutated_second -> Equal_mutated_first - | (Unequal | Equal_no_mutation) as r -> r - - let equal_const_const c1 c2 = - match c1, c2 with - | Void, Void | Value, Value | Float64, Float64 -> Equal_no_mutation - | (Void | Value | Float64), _ -> Unequal - - let rec equate_var_const v1 c2 = - match !v1 with - | Some s1 -> equate_sort_const s1 c2 - | None -> - set v1 (Some (of_const c2)); - Equal_mutated_first - - and equate_var v1 s2 = - match s2 with - | Const c2 -> equate_var_const v1 c2 - | Var v2 -> equate_var_var v1 v2 - - and equate_var_var v1 v2 = - if v1 == v2 - then Equal_no_mutation - else - match !v1, !v2 with - | Some s1, _ -> swap_equate_result (equate_var v2 s1) - | _, Some s2 -> equate_var v1 s2 - | None, None -> - set v1 (Some (of_var v2)); - Equal_mutated_first - - and equate_sort_const s1 c2 = - match s1 with - | Const c1 -> equal_const_const c1 c2 - | Var v1 -> equate_var_const v1 c2 - - let equate_tracking_mutation s1 s2 = - match s1 with - | Const c1 -> swap_equate_result (equate_sort_const s2 c1) - | Var v1 -> equate_var v1 s2 - - (* Don't expose whether or not mutation happened; we just need that for [Jkind] *) - let equate s1 s2 = - match equate_tracking_mutation s1 s2 with - | Unequal -> false - | Equal_mutated_first | Equal_mutated_second | Equal_no_mutation -> true - - let equal_const c1 c2 = - match c1, c2 with - | Void, Void | Value, Value | Float64, Float64 -> true - | Void, (Value | Float64) | Value, (Void | Float64) | Float64, (Value | Void) - -> - false - - let rec is_void_defaulting = function - | Const Void -> true - | Var v -> ( - match !v with - (* CR layouts v5: this should probably default to void now *) - | None -> - set v some_value; - false - | Some s -> is_void_defaulting s) - | Const Value -> false - | Const Float64 -> false - - (*** pretty printing ***) - - let string_of_const = function - | Value -> "value" - | Void -> "void" - | Float64 -> "float64" - - let to_string s = - match get s with Var v -> var_name v | Const c -> string_of_const c - - let format ppf t = Format.fprintf ppf "%s" (to_string t) - - (*** debug printing **) + type t = Sort.t layout + + let of_const const : t = + match const with Sort s -> Sort (Const s) | Any -> Any + + let equate_or_equal ~allow_mutation t1 t2 = + match t1, t2 with + | Sort s1, Sort s2 -> ( + match Sort.equate_tracking_mutation s1 s2 with + | (Equal_mutated_first | Equal_mutated_second) when not allow_mutation -> + Misc.fatal_errorf "Jkind.equal: Performed unexpected mutation" + | Unequal -> false + | Equal_no_mutation | Equal_mutated_first | Equal_mutated_second -> true) + | Any, Any -> true + | (Any | Sort _), _ -> false + + let sub t1 t2 : Misc.Le_result.t = + match t1, t2 with + | Any, Any -> Equal + | _, Any -> Less + | Any, _ -> Not_le + | Sort s1, Sort s2 -> if Sort.equate s1 s2 then Equal else Not_le + + let intersection t1 t2 = + match t1, t2 with + | _, Any -> Some t1 + | Any, _ -> Some t2 + | Sort s1, Sort s2 -> if Sort.equate s1 s2 then Some t1 else None + + let of_new_sort_var () = + let sort = Sort.new_var () in + Sort sort, sort + + let format ppf = + let open Format in + function + | Any -> fprintf ppf "any" + | Sort s -> ( + match Sort.get s with + | Const s -> fprintf ppf "%a" Sort.Const.format s + | Var v -> fprintf ppf "%s" (Sort.Var.name v)) module Debug_printers = struct open Format - let rec t ppf = function - | Var v -> fprintf ppf "Var %a" var v - | Const c -> - fprintf ppf - (match c with - | Void -> "Void" - | Value -> "Value" - | Float64 -> "Float64") + let t ppf = function + | Any -> fprintf ppf "Any" + | Sort s -> fprintf ppf "Sort %a" Sort.Debug_printers.t s + end +end - and opt_t ppf = function - | Some s -> fprintf ppf "Some %a" t s - | None -> fprintf ppf "None" +module Externality = struct + type t = Jkind_types.Externality.t = + | External + | External64 + | Internal + + let max = Internal + + let min = External + + let equal e1 e2 = + match e1, e2 with + | External, External -> true + | External64, External64 -> true + | Internal, Internal -> true + | (External | External64 | Internal), _ -> false + + let less_or_equal t1 t2 : Misc.Le_result.t = + match t1, t2 with + | External, External -> Equal + | External, (External64 | Internal) -> Less + | External64, External -> Not_le + | External64, External64 -> Equal + | External64, Internal -> Less + | Internal, (External | External64) -> Not_le + | Internal, Internal -> Equal + + let le t1 t2 = Misc.Le_result.is_le (less_or_equal t1 t2) + + let meet t1 t2 = + match t1, t2 with + | External, (External | External64 | Internal) + | (External64 | Internal), External -> + External + | External64, (External64 | Internal) | Internal, External64 -> External64 + | Internal, Internal -> Internal + + let print ppf = function + | External -> Format.fprintf ppf "external_" + | External64 -> Format.fprintf ppf "external64" + | Internal -> Format.fprintf ppf "internal" +end - and var ppf v = fprintf ppf "{ contents = %a }" opt_t !v - end +module Nullability = struct + type t = Jkind_types.Nullability.t = + | Non_null + | Maybe_null + + let max = Maybe_null + + let equal n1 n2 = + match n1, n2 with + | Non_null, Non_null -> true + | Maybe_null, Maybe_null -> true + | (Non_null | Maybe_null), _ -> false + + let less_or_equal n1 n2 : Misc.Le_result.t = + match n1, n2 with + | Non_null, Non_null -> Equal + | Non_null, Maybe_null -> Less + | Maybe_null, Non_null -> Not_le + | Maybe_null, Maybe_null -> Equal + + let le n1 n2 = Misc.Le_result.is_le (less_or_equal n1 n2) + + let meet n1 n2 = + match n1, n2 with + | Non_null, (Non_null | Maybe_null) | Maybe_null, Non_null -> Non_null + | Maybe_null, Maybe_null -> Maybe_null - let for_function = value + let print ppf = function + | Non_null -> Format.fprintf ppf "non_null" + | Maybe_null -> Format.fprintf ppf "maybe_null" +end - let for_predef_value = value +module Modes = struct + include Alloc.Const - let for_block_element = value + let less_or_equal a b : Misc.Le_result.t = + match le a b, le b a with + | true, true -> Equal + | true, false -> Less + | false, _ -> Not_le - let for_probe_body = value + let equal a b = Misc.Le_result.is_equal (less_or_equal a b) +end - let for_poly_variant = value +module History = struct + include Jkind_intf.History - let for_record = value + let has_imported_history t = + match t.history with Creation Imported -> true | _ -> false - let for_constructor_arg = value + let update_reason t reason = { t with history = Creation reason } - let for_object = value + let with_warning t = { t with has_warned = true } - let for_lazy_body = value + let has_warned t = t.has_warned +end - let for_tuple_element = value +(* forward declare [Const.t] so we can use it for [Error.t] *) +type const = type_expr Jkind_types.Const.t - let for_instance_var = value +(******************************) +(*** user errors ***) - let for_class_arg = value +module Error = struct + type t = + | Insufficient_level of + { jkind : const; + required_layouts_level : Language_extension.maturity + } + | Unknown_jkind of Jane_syntax.Jkind.t + | Unknown_mode of Jane_syntax.Mode_expr.Const.t + | Multiple_jkinds of + { from_annotation : const; + from_attribute : const + } + + exception User_error of Location.t * t +end - let for_method = value +let raise ~loc err = raise (Error.User_error (loc, err)) - let for_initializer = value +module Const = struct + open Jkind_types.Const - let for_module = value + type t = const - let for_tuple = value + let max = + { layout = Layout.Const.max; + modes_upper_bounds = Modes.max; + externality_upper_bound = Externality.max; + nullability_upper_bound = Nullability.max + } - let for_array_get_result = value + let get_layout const = const.layout + + let get_modal_upper_bounds const = const.modes_upper_bounds + + let get_externality_upper_bound const = const.externality_upper_bound + + let get_legacy_layout + { layout; + modes_upper_bounds = _; + externality_upper_bound; + nullability_upper_bound + } : Layout.Const.Legacy.t = + match layout, externality_upper_bound, nullability_upper_bound with + | Any, _, Maybe_null -> Any + | Any, _, Non_null -> Any_non_null + (* CR layouts v3.0: support [Immediate(64)_or_null]. *) + | Sort Value, _, Maybe_null -> Value_or_null + | Sort Value, Internal, Non_null -> Value + | Sort Value, External64, Non_null -> Immediate64 + | Sort Value, External, Non_null -> Immediate + | Sort Void, _, _ -> Void + | Sort Float64, _, _ -> Float64 + | Sort Float32, _, _ -> Float32 + | Sort Word, _, _ -> Word + | Sort Bits32, _, _ -> Bits32 + | Sort Bits64, _, _ -> Bits64 + + let equal + { layout = lay1; + modes_upper_bounds = modes1; + externality_upper_bound = ext1; + nullability_upper_bound = null1 + } + { layout = lay2; + modes_upper_bounds = modes2; + externality_upper_bound = ext2; + nullability_upper_bound = null2 + } = + Layout.Const.equal lay1 lay2 + && Modes.equal modes1 modes2 + && Externality.equal ext1 ext2 + && Nullability.equal null1 null2 + + let sub + { layout = lay1; + modes_upper_bounds = modes1; + externality_upper_bound = ext1; + nullability_upper_bound = null1 + } + { layout = lay2; + modes_upper_bounds = modes2; + externality_upper_bound = ext2; + nullability_upper_bound = null2 + } = + Misc.Le_result.combine_list + [ Layout.Const.sub lay1 lay2; + Modes.less_or_equal modes1 modes2; + Externality.less_or_equal ext1 ext2; + Nullability.less_or_equal null1 null2 ] + + let of_layout ~mode_crossing ~nullability layout = + let modes_upper_bounds, externality_upper_bound = + match mode_crossing with + | true -> Modes.min, Externality.min + | false -> Modes.max, Externality.max + in + { layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound = nullability + } - let for_array_element = value + module Primitive = struct + type nonrec t = + { jkind : t; + name : string + } + + let any = + { jkind = of_layout Any ~mode_crossing:false ~nullability:Maybe_null; + name = "any" + } - let for_list_element = value + let any_non_null = + { jkind = of_layout Any ~mode_crossing:false ~nullability:Non_null; + name = "any_non_null" + } + + let value_or_null = + { jkind = + of_layout Layout.Const.value ~mode_crossing:false + ~nullability:Maybe_null; + name = "value_or_null" + } + + let value = + { jkind = + of_layout Layout.Const.value ~mode_crossing:false + ~nullability:Non_null; + name = "value" + } + + (* CR layouts v3: change to [or_null] when separability is implemented. *) + let void = + { jkind = + of_layout Layout.Const.void ~mode_crossing:false ~nullability:Non_null; + name = "void" + } + + let immediate = + { jkind = + of_layout Layout.Const.value ~mode_crossing:true ~nullability:Non_null; + name = "immediate" + } + + (* [immediate64] describes types that are stored directly (no indirection) + on 64-bit platforms but indirectly on 32-bit platforms. The key question: + along which modes should a [immediate64] cross? As of today, all of them, + but the reasoning for each is independent and somewhat subtle: + + * Locality: This is fine, because we do not have stack-allocation on + 32-bit platforms. Thus mode-crossing is sound at any type on 32-bit, + including immediate64 types. + + * Linearity: This is fine, because linearity matters only for function + types, and an immediate64 cannot be a function type and cannot store + one either. + + * Uniqueness: This is fine, because uniqueness matters only for + in-place update, and no record supporting in-place update is an + immediate64. ([@@unboxed] records do not support in-place update.) + + * Syncness: This is fine, because syncness matters only for function + types, and an immediate64 cannot be a function type and cannot store + one either. + + * Contention: This is fine, because contention matters only for + types with mutable fields, and an immediate64 does not have immutable + fields. + + In practice, the functor that creates immediate64s, + [Stdlib.Sys.Immediate64.Make], will require these conditions on its + argument. But the arguments that we expect here will have no trouble + meeting the conditions. + *) + let immediate64 = + { jkind = { immediate.jkind with externality_upper_bound = External64 }; + name = "immediate64" + } + + (* CR layouts v2.8: This should not mode cross, but we need syntax for mode + crossing first *) + (* CR layouts v3: change to [Maybe_null] when separability is implemented. *) + let float64 = + { jkind = + of_layout Layout.Const.float64 ~mode_crossing:true + ~nullability:Non_null; + name = "float64" + } + + (* CR layouts v2.8: This should not mode cross, but we need syntax for mode + crossing first *) + (* CR layouts v3: change to [Maybe_null] when separability is implemented. *) + let float32 = + { jkind = + of_layout Layout.Const.float32 ~mode_crossing:true + ~nullability:Non_null; + name = "float32" + } + + (* CR layouts v3: change to [Maybe_null] when separability is implemented. *) + let word = + { jkind = + of_layout Layout.Const.word ~mode_crossing:false ~nullability:Non_null; + name = "word" + } + + (* CR layouts v3: change to [Maybe_null] when separability is implemented. *) + let bits32 = + { jkind = + of_layout Layout.Const.bits32 ~mode_crossing:false + ~nullability:Non_null; + name = "bits32" + } + + (* CR layouts v3: change to [Maybe_null] when separability is implemented. *) + let bits64 = + { jkind = + of_layout Layout.Const.bits64 ~mode_crossing:false + ~nullability:Non_null; + name = "bits64" + } + + let all = + [ any; + any_non_null; + value_or_null; + value; + void; + immediate; + immediate64; + float64; + float32; + word; + bits32; + bits64 ] + + (* CR layouts v3.0: remove this hack once [or_null] is out of [Alpha]. *) + let all_non_null = + [ any; + { any_non_null with name = "any" }; + { value_or_null with name = "value" }; + value; + void; + immediate; + immediate64; + float64; + float32; + word; + bits32; + bits64 ] + end + + module To_out_jkind_const = struct + type printable_jkind = + { base : string; + modal_bounds : string list + } + + module Bounds = struct + type t = + { alloc_bounds : Alloc.Const.t; + externality_bound : Externality.t; + nullability_bound : Nullability.t + } + + let of_jkind jkind = + { alloc_bounds = jkind.modes_upper_bounds; + externality_bound = jkind.externality_upper_bound; + nullability_bound = jkind.nullability_upper_bound + } + end + + let get_modal_bound ~le ~print ~base actual = + match le actual base with + | true -> ( + match le base actual with + | true -> `Valid None + | false -> `Valid (Some (Format.asprintf "%a" print actual))) + | false -> `Invalid + + let get_modal_bounds ~(base : Bounds.t) (actual : Bounds.t) = + [ get_modal_bound ~le:Locality.Const.le ~print:Locality.Const.print + ~base:base.alloc_bounds.areality actual.alloc_bounds.areality; + get_modal_bound ~le:Uniqueness.Const.le ~print:Uniqueness.Const.print + ~base:base.alloc_bounds.uniqueness actual.alloc_bounds.uniqueness; + get_modal_bound ~le:Linearity.Const.le ~print:Linearity.Const.print + ~base:base.alloc_bounds.linearity actual.alloc_bounds.linearity; + get_modal_bound ~le:Contention.Const.le ~print:Contention.Const.print + ~base:base.alloc_bounds.contention actual.alloc_bounds.contention; + get_modal_bound ~le:Portability.Const.le ~print:Portability.Const.print + ~base:base.alloc_bounds.portability actual.alloc_bounds.portability; + get_modal_bound ~le:Externality.le ~print:Externality.print + ~base:base.externality_bound actual.externality_bound; + get_modal_bound ~le:Nullability.le ~print:Nullability.print + ~base:base.nullability_bound actual.nullability_bound ] + |> List.rev + |> List.fold_left + (fun acc mode -> + match acc, mode with + | _, `Invalid | None, _ -> None + | acc, `Valid None -> acc + | Some acc, `Valid (Some mode) -> Some (mode :: acc)) + (Some []) + + (** Write [actual] in terms of [base] *) + let convert_with_base ~(base : Primitive.t) actual = + let matching_layouts = + Layout.Const.equal base.jkind.layout actual.layout + in + let modal_bounds = + get_modal_bounds + ~base:(Bounds.of_jkind base.jkind) + (Bounds.of_jkind actual) + in + match matching_layouts, modal_bounds with + | true, Some modal_bounds -> Some { base = base.name; modal_bounds } + | false, _ | _, None -> None + + (** Select the out_jkind_const with the least number of modal bounds to print *) + let rec select_simplest = function + | a :: b :: tl -> + let simpler = + if List.length a.modal_bounds < List.length b.modal_bounds + then a + else b + in + select_simplest (simpler :: tl) + | [out] -> Some out + | [] -> None + + let convert ~allow_null jkind = + (* For each primitive jkind, we try to print the jkind in terms of it (this is + possible if the primitive is a subjkind of it). We then choose the "simplest". The + "simplest" is taken to mean the one with the least number of modes that need to + follow the [mod]. *) + let simplest = + (* CR layouts v3.0: remove this hack once [or_null] is out of [Alpha]. *) + (if allow_null then Primitive.all else Primitive.all_non_null) + |> List.filter_map (fun base -> convert_with_base ~base jkind) + |> select_simplest + in + let printable_jkind = + match simplest with + | Some simplest -> simplest + | None -> ( + (* CR layouts v2.8: sometimes there is no valid way to build a jkind from a + built-in abbreviation. For now, we just pretend that the layout name is a valid + jkind abbreviation whose modal bounds are all max, even though this is a + lie. *) + let out_jkind_verbose = + convert_with_base + ~base: + { jkind = + { layout = jkind.layout; + modes_upper_bounds = Modes.max; + externality_upper_bound = Externality.max; + nullability_upper_bound = Nullability.Non_null + }; + name = Layout.Const.to_string jkind.layout + } + jkind + in + match out_jkind_verbose with + | Some out_jkind -> out_jkind + | None -> + (* If we fail, try again with nullable jkinds. *) + let out_jkind_verbose = + convert_with_base + ~base: + { jkind = + { layout = jkind.layout; + modes_upper_bounds = Modes.max; + externality_upper_bound = Externality.max; + nullability_upper_bound = Nullability.max + }; + name = Layout.Const.to_string jkind.layout + } + jkind + in + (* convert_with_base is guaranteed to succeed since the layout matches and the + modal bounds are all max *) + Option.get out_jkind_verbose) + in + match printable_jkind with + | { base; modal_bounds = _ :: _ as modal_bounds } -> + Outcometree.Ojkind_const_mod + (Ojkind_const_abbreviation base, modal_bounds) + | { base; modal_bounds = [] } -> + Outcometree.Ojkind_const_abbreviation base + end + + let to_out_jkind_const jkind = + let allow_null = Language_extension.(is_at_least Layouts Alpha) in + To_out_jkind_const.convert ~allow_null jkind + + let format ppf jkind = to_out_jkind_const jkind |> !Oprint.out_jkind_const ppf + + let format_no_hiding ppf jkind = + To_out_jkind_const.convert ~allow_null:true jkind + |> !Oprint.out_jkind_const ppf + + let of_attribute : Builtin_attributes.jkind_attribute -> t = function + | Immediate -> Primitive.immediate.jkind + | Immediate64 -> Primitive.immediate64.jkind + + module ModeParser = struct + type mode = + | Areality of Locality.Const.t + | Linearity of Linearity.Const.t + | Uniqueness of Uniqueness.Const.t + | Contention of Contention.Const.t + | Portability of Portability.Const.t + | Externality of Externality.t + | Nullability of Nullability.t + + let parse_mode unparsed_mode = + let { txt = name; loc } = + (unparsed_mode : Jane_syntax.Mode_expr.Const.t :> _ Location.loc) + in + match name with + | "global" -> Areality Global + | "local" -> Areality Local + | "many" -> Linearity Many + | "once" -> Linearity Once + | "unique" -> Uniqueness Unique + | "shared" -> Uniqueness Shared + | "internal" -> Externality Internal + | "external64" -> Externality External64 + | "external_" -> Externality External + | "contended" -> Contention Contended + | "uncontended" -> Contention Uncontended + | "portable" -> Portability Portable + | "nonportable" -> Portability Nonportable + | "non_null" -> Nullability Non_null + | "maybe_null" -> Nullability Maybe_null + | _ -> raise ~loc (Unknown_mode unparsed_mode) + + let parse_modes + (Location.{ txt = modes; loc = _ } : Jane_syntax.Mode_expr.t) = + List.map parse_mode modes + end + + let rec of_user_written_annotation_unchecked_level + (jkind : Jane_syntax.Jkind.t) : t = + match jkind with + | Abbreviation const -> ( + let { txt = name; loc } = + (const : Jane_syntax.Jkind.Const.t :> _ Location.loc) + in + (* CR layouts 2.8: move this to predef *) + match name with + (* CR layouts 3.0: remove this hack once non-null jkinds are out of alpha. + It is confusing, but preserves backwards compatibility for arrays. *) + | "any" when Language_extension.(is_at_least Layouts Alpha) -> + Primitive.any.jkind + | "any" -> Primitive.any_non_null.jkind + | "any_non_null" -> Primitive.any_non_null.jkind + | "value_or_null" -> Primitive.value_or_null.jkind + | "value" -> Primitive.value.jkind + | "void" -> Primitive.void.jkind + | "immediate64" -> Primitive.immediate64.jkind + | "immediate" -> Primitive.immediate.jkind + | "float64" -> Primitive.float64.jkind + | "float32" -> Primitive.float32.jkind + | "word" -> Primitive.word.jkind + | "bits32" -> Primitive.bits32.jkind + | "bits64" -> Primitive.bits64.jkind + | _ -> raise ~loc (Unknown_jkind jkind)) + | Mod (jkind, modes) -> + let base = of_user_written_annotation_unchecked_level jkind in + (* for each mode, lower the corresponding modal bound to be that mode *) + let parsed_modes = ModeParser.parse_modes modes in + let meet_mode jkind (mode : ModeParser.mode) = + match mode with + | Areality areality -> + { jkind with + modes_upper_bounds = + { jkind.modes_upper_bounds with + areality = + Locality.Const.meet jkind.modes_upper_bounds.areality areality + } + } + | Linearity linearity -> + { jkind with + modes_upper_bounds = + Modes.meet jkind.modes_upper_bounds + { jkind.modes_upper_bounds with + linearity = + Linearity.Const.meet jkind.modes_upper_bounds.linearity + linearity + } + } + | Uniqueness uniqueness -> + { jkind with + modes_upper_bounds = + Modes.meet jkind.modes_upper_bounds + { jkind.modes_upper_bounds with + uniqueness = + Uniqueness.Const.meet jkind.modes_upper_bounds.uniqueness + uniqueness + } + } + | Contention contention -> + { jkind with + modes_upper_bounds = + Modes.meet jkind.modes_upper_bounds + { jkind.modes_upper_bounds with + contention = + Contention.Const.meet jkind.modes_upper_bounds.contention + contention + } + } + | Portability portability -> + { jkind with + modes_upper_bounds = + Modes.meet jkind.modes_upper_bounds + { jkind.modes_upper_bounds with + portability = + Portability.Const.meet jkind.modes_upper_bounds.portability + portability + } + } + | Externality externality -> + { jkind with + externality_upper_bound = + Externality.meet jkind.externality_upper_bound externality + } + | Nullability nullability -> + { jkind with + nullability_upper_bound = + Nullability.meet jkind.nullability_upper_bound nullability + } + in + List.fold_left meet_mode base parsed_modes + | Default | With _ | Kind_of _ -> Misc.fatal_error "XXX unimplemented" + + module Sort = Sort.Const + module Layout = Layout.Const end -type sort = Sort.t +module Desc = struct + type t = + | Const of Const.t + | Var of Sort.var (* all modes will be [max] *) -(*** reasons for jkinds **) -type concrete_jkind_reason = - | Match - | Constructor_declaration of int - | Label_declaration of Ident.t - | Unannotated_type_parameter - | Record_projection - | Record_assignment - | Let_binding - | Function_argument - | Function_result - | Structure_item_expression - | V1_safety_check - | External_argument - | External_result - | Statement - -type value_creation_reason = - | Class_let_binding - | Tuple_element - | Probe - | Package_hack - | Object - | Instance_variable - | Object_field - | Class_field - | Boxed_record - | Boxed_variant - | Extensible_variant - | Primitive of Ident.t - | Type_argument - | Tuple - | Row_variable - | Polymorphic_variant - | Arrow - | Tfield - | Tnil - | First_class_module - | Separability_check - | Univar - | Polymorphic_variant_field - | Default_type_jkind - | Float_record_field - | Existential_type_variable - | Array_element - | Lazy_expression - | Class_argument - | Structure_element - | Debug_printer_argument - | V1_safety_check - | Captured_in_object - | Unknown of string - -type immediate_creation_reason = - | Empty_record - | Enumeration - | Primitive of Ident.t - | Immediate_polymorphic_variant - | Gc_ignorable_check - | Value_kind - -type immediate64_creation_reason = - | Local_mode_cross_check - | Gc_ignorable_check - | Separability_check - -type void_creation_reason = V1_safety_check - -type any_creation_reason = - | Missing_cmi of Path.t - | Wildcard - | Unification_var - | Initial_typedecl_env - | Dummy_jkind - | Type_expression_call - -type float64_creation_reason = Primitive of Ident.t - -type annotation_context = - | Type_declaration of Path.t - | Type_parameter of Path.t * string option - | With_constraint of string - | Newtype_declaration of string - | Constructor_type_parameter of Path.t * string - | Univar of string - | Type_variable of string - | Type_wildcard of Location.t - -type creation_reason = - | Annotated of annotation_context * Location.t - | Value_creation of value_creation_reason - | Immediate_creation of immediate_creation_reason - | Immediate64_creation of immediate64_creation_reason - | Void_creation of void_creation_reason - | Any_creation of any_creation_reason - | Float64_creation of float64_creation_reason - | Concrete_creation of concrete_jkind_reason - | Imported - -type interact_reason = - | Gadt_equation of Path.t - | Tyvar_refinement_intersection - (* CR layouts: this needs to carry a type_expr, but that's loopy *) - | Subjkind - -(*** actual jkind types ***) - -type internal = - | Any - | Sort of sort - | Immediate64 - (** We know for sure that values of types of this jkind are always immediate - on 64-bit platforms. For other platforms, we know nothing about immediacy. - *) - | Immediate - -(* A history of conditions placed on a jkind. - - INVARIANT: at most one sort variable appears in this history. - This is a natural consequence of producing this history by comparing - jkinds. -*) -type history = - | Interact of - { reason : interact_reason; - lhs_jkind : internal; - lhs_history : history; - rhs_jkind : internal; - rhs_history : history + let format ppf = + let open Format in + function + | Const c -> fprintf ppf "%a" Const.format c + | Var v -> fprintf ppf "%s" (Sort.Var.name v) + + (* considers sort variables < Any. Two sort variables are in a [sub] + relationship only when they are equal. + Never does mutation. + Pre-condition: no filled-in sort variables. *) + let sub d1 d2 : Misc.Le_result.t = + match d1, d2 with + | Const c1, Const c2 -> Const.sub c1 c2 + | Var _, Const c when Const.equal Const.max c -> Less + | Var v1, Var v2 -> if v1 == v2 then Equal else Not_le + | Const _, Var _ | Var _, Const _ -> Not_le +end + +module Jkind_desc = struct + open Jkind_types.Jkind_desc + + let of_const + ({ layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } : + Const.t) = + { layout = Layout.of_const layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } + + let add_mode_crossing t = + { t with + modes_upper_bounds = Modes.min; + externality_upper_bound = Externality.min + } + + let add_portability_and_contention_crossing ~from t = + let new_portability = + Portability.Const.meet t.modes_upper_bounds.portability + from.modes_upper_bounds.portability + in + let new_contention = + Contention.Const.meet t.modes_upper_bounds.contention + from.modes_upper_bounds.contention + in + let added_crossings = + (not + (Portability.Const.le t.modes_upper_bounds.portability new_portability)) + || not + (Contention.Const.le t.modes_upper_bounds.contention new_contention) + in + ( { t with + modes_upper_bounds = + { t.modes_upper_bounds with + portability = new_portability; + contention = new_contention + } + }, + added_crossings ) + + let max = of_const Const.max + + let equate_or_equal ~allow_mutation + { layout = lay1; + modes_upper_bounds = modes1; + externality_upper_bound = ext1; + nullability_upper_bound = null1 } - | Creation of creation_reason + { layout = lay2; + modes_upper_bounds = modes2; + externality_upper_bound = ext2; + nullability_upper_bound = null2 + } = + Layout.equate_or_equal ~allow_mutation lay1 lay2 + && Modes.equal modes1 modes2 + && Externality.equal ext1 ext2 + && Nullability.equal null1 null2 + + let sub + { layout = lay1; + modes_upper_bounds = modes1; + externality_upper_bound = ext1; + nullability_upper_bound = null1 + } + { layout = lay2; + modes_upper_bounds = modes2; + externality_upper_bound = ext2; + nullability_upper_bound = null2 + } = + Misc.Le_result.combine_list + [ Layout.sub lay1 lay2; + Modes.less_or_equal modes1 modes2; + Externality.less_or_equal ext1 ext2; + Nullability.less_or_equal null1 null2 ] + + let intersection + { layout = lay1; + modes_upper_bounds = modes1; + externality_upper_bound = ext1; + nullability_upper_bound = null1 + } + { layout = lay2; + modes_upper_bounds = modes2; + externality_upper_bound = ext2; + nullability_upper_bound = null2 + } = + Option.bind (Layout.intersection lay1 lay2) (fun layout -> + Some + { layout; + modes_upper_bounds = Modes.meet modes1 modes2; + externality_upper_bound = Externality.meet ext1 ext2; + nullability_upper_bound = Nullability.meet null1 null2 + }) -type t = - { jkind : internal; - history : history - } + let of_new_sort_var nullability_upper_bound = + let layout, sort = Layout.of_new_sort_var () in + ( { layout; + modes_upper_bounds = Modes.max; + externality_upper_bound = Externality.max; + nullability_upper_bound + }, + sort ) + + module Primitive = struct + let any = max + + let any_non_null = of_const Const.Primitive.any_non_null.jkind + + let value_or_null = of_const Const.Primitive.value_or_null.jkind -let fresh_jkind jkind ~why = { jkind; history = Creation why } + let value = of_const Const.Primitive.value.jkind + + let void = of_const Const.Primitive.void.jkind + + (* [immediate64] describes types that are stored directly (no indirection) + on 64-bit platforms but indirectly on 32-bit platforms. The key question: + along which modes should a [immediate64] cross? As of today, all of them, + but the reasoning for each is independent and somewhat subtle: + + * Locality: This is fine, because we do not have stack-allocation on + 32-bit platforms. Thus mode-crossing is sound at any type on 32-bit, + including immediate64 types. + + * Linearity: This is fine, because linearity matters only for function + types, and an immediate64 cannot be a function type and cannot store + one either. + + * Uniqueness: This is fine, because uniqueness matters only for + in-place update, and no record supporting in-place update is an + immediate64. ([@@unboxed] records do not support in-place update.) + + * Portability: This is fine, because portability matters only for function + types, and an immediate64 cannot be a function type and cannot store + one either. + + * Contention: This is fine, because contention matters only for + types with mutable fields, and an immediate64 does not have immutable + fields. + + In practice, the functor that creates immediate64s, + [Stdlib.Sys.Immediate64.Make], will require these conditions on its + argument. But the arguments that we expect here will have no trouble + meeting the conditions. + *) + let immediate64 = of_const Const.Primitive.immediate64.jkind + + let immediate = of_const Const.Primitive.immediate.jkind + + let float64 = of_const Const.Primitive.float64.jkind + + let float32 = of_const Const.Primitive.float32.jkind + + let word = of_const Const.Primitive.word.jkind + + let bits32 = of_const Const.Primitive.bits32.jkind + + let bits64 = of_const Const.Primitive.bits64.jkind + end + + (* Post-condition: If the result is [Var v], then [!v] is [None]. *) + let get + { layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } : Desc.t = + match layout with + | Any -> + Const + { layout = Any; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } + | Sort s -> ( + match Sort.get s with + | Const s -> + Const + { layout = Sort s; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } + | Var v -> Var v) + + module Debug_printers = struct + open Format + + let t ppf + { layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } = + fprintf ppf + "{ layout = %a;@ modes_upper_bounds = %a;@ externality_upper_bound = \ + %a;@ nullability_upper_bound = %a }" + Layout.Debug_printers.t layout Modes.print modes_upper_bounds + Externality.print externality_upper_bound Nullability.print + nullability_upper_bound + end +end + +type t = type_expr Jkind_types.t + +let fresh_jkind jkind ~why = + { jkind; history = Creation why; has_warned = false } (******************************) (* constants *) -let any_dummy_jkind = - { jkind = Any; history = Creation (Any_creation Dummy_jkind) } +module Primitive = struct + let any_dummy_jkind = + { jkind = Jkind_desc.max; + history = Creation (Any_creation Dummy_jkind); + has_warned = false + } -let value_v1_safety_check = - { jkind = Sort Sort.value; - history = Creation (Value_creation V1_safety_check) - } + (* CR layouts: Should we be doing more memoization here? *) + let any ~(why : History.any_creation_reason) = + match why with + | Dummy_jkind -> any_dummy_jkind (* share this one common case *) + | _ -> fresh_jkind Jkind_desc.Primitive.any ~why:(Any_creation why) -let any ~why = - match why with - | Dummy_jkind -> any_dummy_jkind (* share this one common case *) - | _ -> fresh_jkind Any ~why:(Any_creation why) - -let void ~why = fresh_jkind (Sort Sort.void) ~why:(Void_creation why) - -let value ~(why : value_creation_reason) = - match why with - | V1_safety_check -> value_v1_safety_check - | _ -> fresh_jkind (Sort Sort.value) ~why:(Value_creation why) - -let immediate64 ~why = fresh_jkind Immediate64 ~why:(Immediate64_creation why) - -let immediate ~why = fresh_jkind Immediate ~why:(Immediate_creation why) - -let float64 ~why = fresh_jkind (Sort Sort.float64) ~why:(Float64_creation why) - -type const = Jane_asttypes.const_jkind = - | Any - | Value - | Void - | Immediate64 - | Immediate - | Float64 - -let string_of_const : const -> _ = function - | Any -> "any" - | Value -> "value" - | Void -> "void" - | Immediate64 -> "immediate64" - | Immediate -> "immediate" - | Float64 -> "float64" - -let equal_const (c1 : const) (c2 : const) = - match c1, c2 with - | Any, Any -> true - | Immediate64, Immediate64 -> true - | Immediate, Immediate -> true - | Void, Void -> true - | Value, Value -> true - | Float64, Float64 -> true - | (Any | Immediate64 | Immediate | Void | Value | Float64), _ -> false - -let sub_const (c1 : const) (c2 : const) = - match c1, c2 with - | Any, Any -> Equal - | _, Any -> Sub - | c1, c2 when equal_const c1 c2 -> Equal - | (Immediate | Immediate64), Value -> Sub - | Immediate, Immediate64 -> Sub - | (Any | Void | Value | Immediate64 | Immediate | Float64), _ -> Not_sub + let any_non_null ~why = + fresh_jkind Jkind_desc.Primitive.any_non_null + ~why:(Any_non_null_creation why) -(******************************) -(*** user errors ***) -type error = - | Insufficient_level of annotation_context * Jane_asttypes.const_jkind + let value_v1_safety_check = + { jkind = Jkind_desc.Primitive.value_or_null; + history = Creation (Value_or_null_creation V1_safety_check); + has_warned = false + } + + let void ~why = fresh_jkind Jkind_desc.Primitive.void ~why:(Void_creation why) + + let value_or_null ~why = + match (why : History.value_or_null_creation_reason) with + | V1_safety_check -> value_v1_safety_check + | _ -> + fresh_jkind Jkind_desc.Primitive.value_or_null + ~why:(Value_or_null_creation why) + + let value ~(why : History.value_creation_reason) = + fresh_jkind Jkind_desc.Primitive.value ~why:(Value_creation why) + + let immediate64 ~why = + fresh_jkind Jkind_desc.Primitive.immediate64 ~why:(Immediate64_creation why) + + let immediate ~why = + fresh_jkind Jkind_desc.Primitive.immediate ~why:(Immediate_creation why) + + let float64 ~why = + fresh_jkind Jkind_desc.Primitive.float64 ~why:(Float64_creation why) -exception User_error of Location.t * error + let float32 ~why = + fresh_jkind Jkind_desc.Primitive.float32 ~why:(Float32_creation why) -let raise ~loc err = raise (User_error (loc, err)) + let word ~why = fresh_jkind Jkind_desc.Primitive.word ~why:(Word_creation why) + + let bits32 ~why = + fresh_jkind Jkind_desc.Primitive.bits32 ~why:(Bits32_creation why) + + let bits64 ~why = + fresh_jkind Jkind_desc.Primitive.bits64 ~why:(Bits64_creation why) +end + +let add_mode_crossing t = + { t with jkind = Jkind_desc.add_mode_crossing t.jkind } + +let add_portability_and_contention_crossing ~from t = + let jkind, added_crossings = + Jkind_desc.add_portability_and_contention_crossing ~from:from.jkind t.jkind + in + { t with jkind }, added_crossings (*** extension requirements ***) -let get_required_layouts_level (context : annotation_context) (jkind : const) : - Language_extension.maturity = - match context, jkind with - | _, Value -> Stable - | _, (Immediate | Immediate64 | Any | Float64) -> Beta - | _, Void -> Alpha +(* The [annotation_context] parameter can be used to allow annotations / kinds + in different contexts to be enabled with different extension settings. + At some points in time, we will not care about the context, and so this + parameter might effectively be unused. +*) +(* CR layouts: When everything is stable, remove this function. *) +let get_required_layouts_level (context : History.annotation_context) + (jkind : Const.t) : Language_extension.maturity = + let legacy_layout = Const.get_legacy_layout jkind in + match context, legacy_layout with + | ( _, + ( Value | Immediate | Immediate64 | Any | Float64 | Float32 | Word + | Bits32 | Bits64 | Any_non_null ) ) -> + (* CR layouts v3.0: we allow [Any_non_null] because, without [Alpha], + explicit [Any] annotations are converted to [Any_non_null] to + preserve compatibility with array arguments. *) + Stable + | _, (Value_or_null | Void) -> Alpha (******************************) (* construction *) let of_new_sort_var ~why = - let sort = Sort.new_var () in - fresh_jkind (Sort sort) ~why:(Concrete_creation why), sort + let jkind, sort = Jkind_desc.of_new_sort_var Maybe_null in + fresh_jkind jkind ~why:(Concrete_creation why), sort let of_new_sort ~why = fst (of_new_sort_var ~why) -let of_const ~why : const -> t = function - | Any -> fresh_jkind Any ~why - | Immediate -> fresh_jkind Immediate ~why - | Immediate64 -> fresh_jkind Immediate64 ~why - | Value -> fresh_jkind (Sort Sort.value) ~why - | Void -> fresh_jkind (Sort Sort.void) ~why - | Float64 -> fresh_jkind (Sort Sort.float64) ~why - -(* CR layouts v1.5: remove legacy_immediate *) -let of_annotation ?(legacy_immediate = false) ~context - Location.{ loc; txt = const } = - (match const with - | (Immediate | Immediate64 | Value) when legacy_immediate -> () - | _ -> - let required_layouts_level = get_required_layouts_level context const in - if not (Language_extension.is_at_least Layouts required_layouts_level) - then raise ~loc (Insufficient_level (context, const))); - of_const ~why:(Annotated (context, loc)) const - -let of_annotation_option ?legacy_immediate ~context = - Option.map (of_annotation ?legacy_immediate ~context) - -let of_annotation_option_default ?legacy_immediate ~default ~context = - Option.fold ~none:default ~some:(of_annotation ?legacy_immediate ~context) - -let of_attributes ~legacy_immediate ~context attrs = - Builtin_attributes.jkind ~legacy_immediate attrs - |> Result.map (of_annotation_option ~legacy_immediate ~context) - -let of_attributes_default ~legacy_immediate ~context ~default attrs = - Builtin_attributes.jkind ~legacy_immediate attrs - |> Result.map - (of_annotation_option_default ~legacy_immediate ~default ~context) +let of_new_legacy_sort_var ~why = + let jkind, sort = Jkind_desc.of_new_sort_var Non_null in + fresh_jkind jkind ~why:(Concrete_legacy_creation why), sort + +let of_new_legacy_sort ~why = fst (of_new_legacy_sort_var ~why) + +(* CR layouts v2.8: remove this function *) +let of_const ~why + ({ layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } : + Const.t) = + { jkind = + { layout = Layout.of_const layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + }; + history = Creation why; + has_warned = false + } + +let const_of_user_written_annotation ~context Location.{ loc; txt = annot } = + let const = Const.of_user_written_annotation_unchecked_level annot in + let required_layouts_level = get_required_layouts_level context const in + if not (Language_extension.is_at_least Layouts required_layouts_level) + then raise ~loc (Insufficient_level { jkind = const; required_layouts_level }); + const + +let of_annotated_const ~context ~const ~const_loc = + of_const ~why:(Annotated (context, const_loc)) const + +let of_annotation ~context (annot : _ Location.loc) = + let const = const_of_user_written_annotation ~context annot in + let jkind = of_annotated_const ~const ~const_loc:annot.loc ~context in + jkind, (const, annot) + +let of_annotation_option_default ~default ~context = + Option.fold ~none:(default, None) ~some:(fun annot -> + let t, annot = of_annotation ~context annot in + t, Some annot) + +let of_attribute ~context + (attribute : Builtin_attributes.jkind_attribute Location.loc) = + let const = Const.of_attribute attribute.txt in + of_annotated_const ~context ~const ~const_loc:attribute.loc, const + +let of_type_decl ~context (decl : Parsetree.type_declaration) = + let jkind_of_annotation = + Jane_syntax.Layouts.of_type_declaration decl + |> Option.map (fun (annot, attrs) -> + let t, const = of_annotation ~context annot in + t, const, attrs) + in + let jkind_of_attribute = + Builtin_attributes.jkind decl.ptype_attributes + |> Option.map (fun attr -> + let t, const = of_attribute ~context attr in + (* This is a bit of a lie: the "annotation" here is being + forged based on the jkind attribute. But: the jkind + annotation is just used in printing/untypeast, and the + all strings valid to use as a jkind attribute are + valid (and equivalent) to write as an annotation, so + this lie is harmless. + *) + let annot = + Location.map + (fun attr -> + let name = Builtin_attributes.jkind_attribute_to_string attr in + Jane_syntax.Jkind.(Abbreviation (Const.mk name Location.none))) + attr + in + t, (const, annot), decl.ptype_attributes) + in + match jkind_of_annotation, jkind_of_attribute with + | None, None -> None + | (Some _ as x), None | None, (Some _ as x) -> x + | Some (_, (from_annotation, _), _), Some (_, (from_attribute, _), _) -> + raise ~loc:decl.ptype_loc + (Multiple_jkinds { from_annotation; from_attribute }) + +let of_type_decl_default ~context ~default (decl : Parsetree.type_declaration) = + match of_type_decl ~context decl with + | Some (t, const, attrs) -> t, Some const, attrs + | None -> default, None, decl.ptype_attributes let for_boxed_record ~all_void = - if all_void then immediate ~why:Empty_record else value ~why:Boxed_record + if all_void + then Primitive.immediate ~why:Empty_record + else Primitive.value ~why:Boxed_record let for_boxed_variant ~all_voids = - if all_voids then immediate ~why:Enumeration else value ~why:Boxed_variant + if all_voids + then Primitive.immediate ~why:Enumeration + else Primitive.value ~why:Boxed_variant (******************************) (* elimination and defaulting *) -type desc = - | Const of const - | Var of Sort.var - -let format_desc ppf = - let open Format in - function - | Const c -> fprintf ppf "%s" (string_of_const c) - | Var v -> fprintf ppf "%s" (Sort.var_name v) - -(* considers sort variables < Any, but otherwise just checks for equality. - Never does mutation. - Pre-condition: no filled-in sort variables. *) -let sub_desc d1 d2 = - match d1, d2 with - | Const c1, Const c2 -> sub_const c1 c2 - | Var _, Const Any -> Sub - | Var v1, Var v2 -> if v1 == v2 then Equal else Not_sub - | Const _, Var _ | Var _, Const _ -> Not_sub - -(* Post-condition: If the result is [Var v], then [!v] is [None]. *) -let get_internal (lay : internal) : desc = - match lay with - | Any -> Const Any - | Immediate -> Const Immediate - | Immediate64 -> Const Immediate64 - | Sort s -> ( - match Sort.get s with - (* NB: this match isn't as silly as it looks: those are - different constructors on the left than on the right *) - | Const Void -> Const Void - | Const Value -> Const Value - | Const Float64 -> Const Float64 - | Var v -> Var v) - -let get_default_value (t : t) : const = - match t.jkind with - | Any -> Any - | Immediate -> Immediate - | Immediate64 -> Immediate64 - | Sort s -> ( - match Sort.get_default_value s with - (* As above, this turns Sort.consts to Jkind.consts *) - | Value -> Value - | Void -> Void - | Float64 -> Float64) +let default_to_value_and_get + { jkind = + { layout; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + }; + _ + } : Const.t = + match layout with + | Any -> + { layout = Any; + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } + | Sort s -> + { layout = Sort (Sort.default_to_value_and_get s); + modes_upper_bounds; + externality_upper_bound; + nullability_upper_bound + } -let default_to_value t = ignore (get_default_value t) +let default_to_value t = ignore (default_to_value_and_get t) -let get t = get_internal t.jkind +let get t = Jkind_desc.get t.jkind (* CR layouts: this function is suspect; it seems likely to reisenberg that refactoring could get rid of it *) let sort_of_jkind l = match get l with - | Const Void -> Sort.void - | Const (Value | Immediate | Immediate64) -> Sort.value - | Const Float64 -> Sort.float64 - | Const Any -> Misc.fatal_error "Jkind.sort_of_jkind" + | Const { layout = Sort s; _ } -> Sort.of_const s + | Const { layout = Any; _ } -> Misc.fatal_error "Jkind.sort_of_jkind" | Var v -> Sort.of_var v -(*********************************) -(* pretty printing *) +let get_layout jk : Layout.Const.t option = + match jk.jkind.layout with + | Any -> Some Any + | Sort s -> ( + match Sort.get s with Const s -> Some (Sort s) | Var _ -> None) + +let get_modal_upper_bounds jk = jk.jkind.modes_upper_bounds -let to_string lay = - match get lay with Const c -> string_of_const c | Var v -> Sort.var_name v +let get_externality_upper_bound jk = jk.jkind.externality_upper_bound -let format ppf t = Format.fprintf ppf "%s" (to_string t) +let set_externality_upper_bound jk externality_upper_bound = + { jk with jkind = { jk.jkind with externality_upper_bound } } -(***********************************) -(* jkind histories *) +(*********************************) +(* pretty printing *) + +let format ppf jkind = + match get jkind with + | Const c -> Format.fprintf ppf "%a" Const.format c + | Var v -> Format.fprintf ppf "%s" (Sort.Var.name v) let printtyp_path = ref (fun _ _ -> assert false) @@ -642,8 +1325,8 @@ end = struct let report_missing_cmi ppf = function | Some p -> - fprintf ppf "@,No .cmi file found containing %a." !printtyp_path p; - missing_cmi_hint ppf p + fprintf ppf "@,@[No .cmi file found containing %a.%a@]" !printtyp_path p + missing_cmi_hint p | None -> () end @@ -653,7 +1336,7 @@ include Report_missing_cmi may want to change these to experiment / debug. *) (* should we print histories at all? *) -let display_histories = false +let display_histories = true (* should we print histories in a way users can understand? The alternative is to print out all the data, which may be useful @@ -662,47 +1345,70 @@ let flattened_histories = true (* This module is just to keep all the helper functions more locally scoped. *) -module Format_history : sig - val format_history : - intro:(Format.formatter -> unit) -> Format.formatter -> t -> unit -end = struct +module Format_history = struct (* CR layouts: all the output in this section is subject to change; actually look closely at error messages once this is activated *) open Format - let format_concrete_jkind_reason ppf : concrete_jkind_reason -> unit = - function - | Match -> fprintf ppf "matched on" - | Constructor_declaration idx -> - fprintf ppf "used as constructor field %d" idx + let format_with_notify_js ppf str = + fprintf ppf + "@[%s.@ Please notify the Jane Street compilers group if you see this \ + output@]" + str + + let format_position ~arity position = + let to_ordinal num = Int.to_string num ^ Misc.ordinal_suffix num in + match arity with 1 -> "" | _ -> to_ordinal position ^ " " + + let format_concrete_creation_reason ppf : + History.concrete_creation_reason -> unit = function + | Match -> fprintf ppf "a value of this type is matched against a pattern" + | Constructor_declaration _ -> + fprintf ppf "it's the type of a constructor field" | Label_declaration lbl -> - fprintf ppf "used in the declaration of the record field \"%a\"" - Ident.print lbl - | Unannotated_type_parameter -> - fprintf ppf "appears as an unannotated type parameter" - | Record_projection -> fprintf ppf "used as the record in a projection" - | Record_assignment -> fprintf ppf "used as the record in an assignment" - | Let_binding -> fprintf ppf "bound by a `let`" - | Function_argument -> fprintf ppf "used as a function argument" - | Function_result -> fprintf ppf "used as a function result" + fprintf ppf "it is the type of record field %s" (Ident.name lbl) + | Record_projection -> + fprintf ppf "it's the record type used in a projection" + | Record_assignment -> + fprintf ppf "it's the record type used in an assignment" + | Let_binding -> fprintf ppf "it's the type of a variable bound by a `let`" + | Function_argument -> + fprintf ppf "we must know concretely how to pass a function argument" + | Function_result -> + fprintf ppf "we must know concretely how to return a function result" | Structure_item_expression -> - fprintf ppf "used in an expression in a structure" - | V1_safety_check -> fprintf ppf "part of the v1 safety check" + fprintf ppf "it's the type of an expression in a structure" | External_argument -> - fprintf ppf "used as an argument in an external declaration" + fprintf ppf "it's the type of an argument in an external declaration" | External_result -> - fprintf ppf "used as the result of an external declaration" - | Statement -> fprintf ppf "used as a statement" + fprintf ppf "it's the type of the result of an external declaration" + | Statement -> fprintf ppf "it's the type of a statement" + | Optional_arg_default -> + fprintf ppf "it's the type of an optional argument default" + | Layout_poly_in_external -> + fprintf ppf + "it's the layout polymorphic type in an external declaration@ \ + ([@@layout_poly] forces all variables of layout 'any' to be@ \ + representable at call sites)" + + let format_concrete_legacy_creation_reason ppf : + History.concrete_legacy_creation_reason -> unit = function + | Unannotated_type_parameter path -> + fprintf ppf "it instantiates an unannotated type parameter of %a" + !printtyp_path path + | Wildcard -> fprintf ppf "it's a _ in the type" + | Unification_var -> fprintf ppf "it's a fresh unification variable" + | Array_element -> fprintf ppf "it's the type of an array element" - let format_annotation_context ppf : annotation_context -> unit = function + let rec format_annotation_context ppf : History.annotation_context -> unit = + function | Type_declaration p -> fprintf ppf "the declaration of the type %a" !printtyp_path p | Type_parameter (path, var) -> let var_string = match var with None -> "_" | Some v -> "'" ^ v in fprintf ppf "@[%s@ in the declaration of the type@ %a@]" var_string !printtyp_path path - | With_constraint s -> fprintf ppf "the `with` constraint for %s" s | Newtype_declaration name -> fprintf ppf "the abstract type declaration for %s" name | Constructor_type_parameter (cstr, name) -> @@ -711,211 +1417,239 @@ end = struct | Univar name -> fprintf ppf "the universal variable %s" name | Type_variable name -> fprintf ppf "the type variable %s" name | Type_wildcard loc -> - fprintf ppf "the wildcard _ at %a" Location.print_loc loc + fprintf ppf "the wildcard _ at %a" Location.print_loc_in_lowercase loc + | With_error_message (_message, context) -> + (* message gets printed in [format_flattened_history] so we ignore it here *) + format_annotation_context ppf context - let format_any_creation_reason ppf : any_creation_reason -> unit = function - | Missing_cmi p -> fprintf ppf "a missing .cmi file for %a" !printtyp_path p - | Wildcard -> fprintf ppf "a _ in a type" - | Unification_var -> fprintf ppf "a fresh unification variable" + let format_any_creation_reason ppf : History.any_creation_reason -> unit = + function + | Missing_cmi p -> + fprintf ppf "the .cmi file for %a is missing" !printtyp_path p | Initial_typedecl_env -> - fprintf ppf "a dummy layout used in checking mutually recursive datatypes" + format_with_notify_js ppf + "a dummy kind of any is used to check mutually recursive datatypes" + | Wildcard -> format_with_notify_js ppf "there's a _ in the type" + | Unification_var -> + format_with_notify_js ppf "it's a fresh unification variable" | Dummy_jkind -> - fprintf ppf - "@[a dummy layout that should have been overwritten;@ Please notify \ - the Jane Street compilers group if you see this output." + format_with_notify_js ppf + "it's assigned a dummy kind that should have been overwritten" (* CR layouts: Improve output or remove this constructor ^^ *) | Type_expression_call -> - fprintf ppf "a call to [type_expression] via the ocaml API" - - let format_immediate_creation_reason ppf : immediate_creation_reason -> _ = - function - | Empty_record -> fprintf ppf "a record containing all void elements" + format_with_notify_js ppf + "there's a call to [type_expression] via the ocaml API" + | Inside_of_Tarrow -> fprintf ppf "argument or result of a function type" + + let format_any_non_null_creation_reason ppf : + History.any_non_null_creation_reason -> unit = function + | Array_type_argument -> + fprintf ppf "it's the type argument to the array type" + + let format_immediate_creation_reason ppf : + History.immediate_creation_reason -> _ = function + | Empty_record -> + fprintf ppf "it's a record type containing all void elements" | Enumeration -> - fprintf ppf "an enumeration variant (all constructors are constant)" + fprintf ppf + "it's an enumeration variant type (all constructors are constant)" | Primitive id -> - fprintf ppf "it equals the primitive immediate type %s" (Ident.name id) + fprintf ppf "it is the primitive immediate type %s" (Ident.name id) | Immediate_polymorphic_variant -> - fprintf ppf "an immediate polymorphic variant" - | Gc_ignorable_check -> - fprintf ppf "the check to see whether a value can be ignored by GC" - | Value_kind -> - fprintf ppf "the check to see whether a polymorphic variant is immediate" - - let format_immediate64_creation_reason ppf = function - | Local_mode_cross_check -> - fprintf ppf "the check for whether a local value can safely escape" - | Gc_ignorable_check -> - fprintf ppf "the check to see whether a value can be ignored by GC" + fprintf ppf + "it's an enumeration variant type (all constructors are constant)" + + let format_immediate64_creation_reason ppf : + History.immediate64_creation_reason -> _ = function | Separability_check -> fprintf ppf "the check that a type is definitely not `float`" - let format_value_creation_reason ppf : value_creation_reason -> _ = function - | Class_let_binding -> fprintf ppf "let-bound in a class expression" - | Tuple_element -> fprintf ppf "a tuple element" - | Probe -> fprintf ppf "a probe" - | Package_hack -> fprintf ppf "used as an element in a first-class module" - | Object -> fprintf ppf "an object" - | Instance_variable -> fprintf ppf "an instance variable" - | Object_field -> fprintf ppf "an object field" - | Class_field -> fprintf ppf "an class field" - | Boxed_record -> fprintf ppf "a boxed record" - | Boxed_variant -> fprintf ppf "a boxed variant" - | Extensible_variant -> fprintf ppf "an extensible variant" - | Primitive id -> - fprintf ppf "it equals the primitive value type %s" (Ident.name id) - | Type_argument -> - fprintf ppf "a type argument defaulted to have layout value" - | Tuple -> fprintf ppf "a tuple type" - | Row_variable -> fprintf ppf "a row variable" - | Polymorphic_variant -> fprintf ppf "a polymorphic variant" - | Arrow -> fprintf ppf "a function type" - | Tfield -> fprintf ppf "an internal Tfield type (you shouldn't see this)" - | Tnil -> fprintf ppf "an internal Tnil type (you shouldn't see this)" - | First_class_module -> fprintf ppf "a first-class module type" + let format_value_or_null_creation_reason ppf : + History.value_or_null_creation_reason -> _ = function + | Tuple_element -> fprintf ppf "it's the type of a tuple element" | Separability_check -> fprintf ppf "the check that a type is definitely not `float`" - | Univar -> fprintf ppf "an unannotated universal variable" | Polymorphic_variant_field -> - fprintf ppf "a field of a polymorphic variant" + fprintf ppf "it's the type of the field of a polymorphic variant" + | Structure_element -> + fprintf ppf "it's the type of something stored in a module structure" + | V1_safety_check -> + fprintf ppf "it has to be value for the V1 safety check" + + let format_value_creation_reason ppf ~layout_or_kind : + History.value_creation_reason -> _ = function + | Class_let_binding -> + fprintf ppf "it's the type of a let-bound variable in a class expression" + | Probe -> format_with_notify_js ppf "it's a probe" + | Object -> fprintf ppf "it's the type of an object" + | Instance_variable -> fprintf ppf "it's the type of an instance variable" + | Object_field -> fprintf ppf "it's the type of an object field" + | Class_field -> fprintf ppf "it's the type of a class field" + | Boxed_record -> fprintf ppf "it's a boxed record type" + | Boxed_variant -> fprintf ppf "it's a boxed variant type" + | Extensible_variant -> fprintf ppf "it's an extensible variant type" + | Primitive id -> + fprintf ppf "it is the primitive value type %s" (Ident.name id) + | Type_argument { parent_path; position; arity } -> + fprintf ppf "the %stype argument of %a has %s value" + (format_position ~arity position) + !printtyp_path parent_path layout_or_kind + | Tuple -> fprintf ppf "it's a tuple type" + | Row_variable -> format_with_notify_js ppf "it's a row variable" + | Polymorphic_variant -> fprintf ppf "it's a polymorphic variant type" + | Arrow -> fprintf ppf "it's a function type" + | Tfield -> + format_with_notify_js ppf + "it's an internal Tfield type (you shouldn't see this)" + | Tnil -> + format_with_notify_js ppf + "it's an internal Tnil type (you shouldn't see this)" + | First_class_module -> fprintf ppf "it's a first-class module type" + | Univar -> + fprintf ppf "it is or unifies with an unannotated universal variable" | Default_type_jkind -> - fprintf ppf "the default layout for an abstract type" - | Float_record_field -> fprintf ppf "a field of a float record" + fprintf ppf "an abstract type has the value %s by default" layout_or_kind | Existential_type_variable -> - fprintf ppf "an unannotated existential type variable" - | Array_element -> fprintf ppf "an array element" - | Lazy_expression -> fprintf ppf "a lazy expression" - | Class_argument -> - fprintf ppf "a term-level argument to a class constructor" - | Structure_element -> fprintf ppf "stored in a module structure" + fprintf ppf "it's an unannotated existential type variable" + | Array_comprehension_element -> + fprintf ppf "it's the element type of array comprehension" + | Lazy_expression -> fprintf ppf "it's the type of a lazy expression" + | Class_type_argument -> + fprintf ppf "it's a type argument to a class constructor" + | Class_term_argument -> + fprintf ppf + "it's the type of a term-level argument to a class constructor" | Debug_printer_argument -> - fprintf ppf "used as the argument to a debugger printer function" - | V1_safety_check -> fprintf ppf "to be value for the V1 safety check" - | Captured_in_object -> fprintf ppf "captured in an object" + format_with_notify_js ppf + "it's the type of an argument to a debugger printer function" + | Captured_in_object -> + fprintf ppf "it's the type of a variable captured in an object" + | Recmod_fun_arg -> + fprintf ppf + "it's the type of the first argument to a function in a recursive \ + module" | Unknown s -> fprintf ppf "unknown @[(please alert the Jane Street@;\ compilers team with this message: %s)@]" s - let format_void_creation_reason ppf : void_creation_reason -> _ = function - | V1_safety_check -> fprintf ppf "check to make sure there are no voids" - (* CR layouts: remove this when we remove its uses *) + let format_float64_creation_reason ppf : History.float64_creation_reason -> _ + = function + | Primitive id -> + fprintf ppf "it is the primitive float64 type %s" (Ident.name id) + + let format_float32_creation_reason ppf : History.float32_creation_reason -> _ + = function + | Primitive id -> + fprintf ppf "it is the primitive float32 type %s" (Ident.name id) + + let format_word_creation_reason ppf : History.word_creation_reason -> _ = + function + | Primitive id -> + fprintf ppf "it is the primitive word type %s" (Ident.name id) + + let format_bits32_creation_reason ppf : History.bits32_creation_reason -> _ = + function + | Primitive id -> + fprintf ppf "it is the primitive bits32 type %s" (Ident.name id) - let format_float64_creation_reason ppf : float64_creation_reason -> _ = + let format_bits64_creation_reason ppf : History.bits64_creation_reason -> _ = function | Primitive id -> - fprintf ppf "it equals the primitive value type %s" (Ident.name id) + fprintf ppf "it is the primitive bits64 type %s" (Ident.name id) - let format_creation_reason ppf : creation_reason -> unit = function + let format_creation_reason ppf ~layout_or_kind : + History.creation_reason -> unit = function | Annotated (ctx, _) -> fprintf ppf "of the annotation on %a" format_annotation_context ctx + | Missing_cmi p -> + fprintf ppf "the .cmi file for %a is missing" !printtyp_path p | Any_creation any -> format_any_creation_reason ppf any + | Any_non_null_creation any -> format_any_non_null_creation_reason ppf any | Immediate_creation immediate -> format_immediate_creation_reason ppf immediate | Immediate64_creation immediate64 -> format_immediate64_creation_reason ppf immediate64 - | Void_creation void -> format_void_creation_reason ppf void - | Value_creation value -> format_value_creation_reason ppf value + | Void_creation _ -> . + | Value_or_null_creation value -> + format_value_or_null_creation_reason ppf value + | Value_creation value -> + format_value_creation_reason ppf ~layout_or_kind value | Float64_creation float -> format_float64_creation_reason ppf float - | Concrete_creation concrete -> format_concrete_jkind_reason ppf concrete - | Imported -> fprintf ppf "imported from another compilation unit" + | Float32_creation float -> format_float32_creation_reason ppf float + | Word_creation word -> format_word_creation_reason ppf word + | Bits32_creation bits32 -> format_bits32_creation_reason ppf bits32 + | Bits64_creation bits64 -> format_bits64_creation_reason ppf bits64 + | Concrete_creation concrete -> format_concrete_creation_reason ppf concrete + | Concrete_legacy_creation concrete -> + format_concrete_legacy_creation_reason ppf concrete + | Imported -> + fprintf ppf "of %s requirements from an imported definition" + layout_or_kind + | Imported_type_argument { parent_path; position; arity } -> + fprintf ppf "the %stype argument of %a has this %s" + (format_position ~arity position) + !printtyp_path parent_path layout_or_kind + | Generalized (id, loc) -> + let format_id ppf = function + | Some id -> fprintf ppf " of %s" (Ident.name id) + | None -> () + in + fprintf ppf "of the definition%a at %a" format_id id + Location.print_loc_in_lowercase loc - let format_interact_reason ppf = function + let format_interact_reason ppf : History.interact_reason -> _ = function | Gadt_equation name -> - fprintf ppf "a GADT match on the constructor %a" !printtyp_path name + fprintf ppf "a GADT match refining the type %a" !printtyp_path name | Tyvar_refinement_intersection -> fprintf ppf "updating a type variable" - | Subjkind -> fprintf ppf "sublayout check" - - (* a flattened_history describes the history of a jkind L. That - jkind has been constrained to be a subjkind of jkinds L1..Ln. - Each element in a flattened_history includes a jkind desc Li and the - set of circumstances that gave rise to a constraint of that jkind. - Any jkinds Lk such that an Li < Lk doesn't contribute to the choice - of L and is thus omitted from a flattened_history. - - INVARIANT: the creation_reasons within a list all are reasons for - the jkind they are paired with. - INVARIANT: L is a subjkind of all the Li in a flattened_history. - INVARIANT: If Li and Lj are stored in different entries in a - flattened_history, then not (Li <= Lj) and not (Lj <= Li). - This implies that no two elements in a flattened_history have the - same jkind in them. - INVARIANT: no list in this structure is empty - - Both levels of list are unordered. - - Because a flattened_history stores [desc]s, it should be discarded - promptly after use. - - This type could be more efficient in several ways, but there is - little incentive to do so. *) - type flattened_row = desc * creation_reason list - - type flattened_history = flattened_row list - - (* first arg is the jkind L whose history we are flattening *) - let flatten_history : internal -> history -> flattened_history = - let add jkind reason = - let jkind_desc = get_internal jkind in - let rec go acc = function - | ((key, value) as row) :: rest -> ( - match sub_desc jkind_desc key with - | Sub -> go acc rest - | Equal -> ((key, reason :: value) :: acc) @ rest - | Not_sub -> go (row :: acc) rest) - | [] -> (jkind_desc, [reason]) :: acc - in - go [] - in - let rec history acc internal = function - | Interact { reason = _; lhs_jkind; lhs_history; rhs_jkind; rhs_history } - -> - let fh1 = history acc lhs_jkind lhs_history in - let fh2 = history fh1 rhs_jkind rhs_history in - fh2 - | Creation reason -> add internal reason acc - in - fun internal hist -> history [] internal hist - - let format_flattened_row ppf (lay, reasons) = - fprintf ppf "%a, because" format_desc lay; - match reasons with - | [reason] -> fprintf ppf "@ %a." format_creation_reason reason - | _ -> - fprintf ppf " all of the following:@ @[ %a@]" - (pp_print_list format_creation_reason) - reasons - - let format_flattened_history ~intro ppf t = - let fh = flatten_history t.jkind t.history in - fprintf ppf "@[%t " intro; - (match fh with - | [row] -> format_flattened_row ppf row - | _ -> - fprintf ppf "a sublayout of all of the following:@ @[ %a@]" - (pp_print_list format_flattened_row) - fh); - fprintf ppf "@]@;" + | Subjkind -> fprintf ppf "subkind check" + + (* CR layouts: An older implementation of format_flattened_history existed + which displays more information not limited to one layout and one creation_reason + around commit 66a832d70bf61d9af3b0ec6f781dcf0a188b324d in main. + + Consider revisiting that if the current implementation becomes insufficient. *) + + let format_flattened_history ~intro ~layout_or_kind ppf t = + let jkind_desc = Jkind_desc.get t.jkind in + fprintf ppf "@[%t" intro; + (match t.history with + | Creation reason -> ( + fprintf ppf "@ because %a" (format_creation_reason ~layout_or_kind) reason; + match reason, jkind_desc with + | Concrete_legacy_creation _, Const _ -> + fprintf ppf ",@ defaulted to %s %a" layout_or_kind Desc.format + jkind_desc + | _ -> ()) + | _ -> assert false); + fprintf ppf "."; + (match t.history with + | Creation (Annotated (With_error_message (message, _), _)) -> + fprintf ppf "@ @[%s@]" message + | _ -> ()); + fprintf ppf "@]" (* this isn't really formatted for user consumption *) - let format_history_tree ~intro ppf t = + let format_history_tree ~intro ~layout_or_kind ppf t = let rec in_order ppf = function - | Interact { reason; lhs_history; rhs_history } -> + | Interact + { reason; lhs_history; rhs_history; lhs_jkind = _; rhs_jkind = _ } -> fprintf ppf "@[ %a@]@;%a@ @[ %a@]" in_order lhs_history format_interact_reason reason in_order rhs_history - | Creation c -> format_creation_reason ppf c + | Creation c -> format_creation_reason ppf ~layout_or_kind c in - fprintf ppf "@;%t has this layout history:@;@[ %a@]" intro in_order - t.history + fprintf ppf "@;%t has this %s history:@;@[ %a@]" intro layout_or_kind + in_order t.history - let format_history ~intro ppf t = + let format_history ~intro ~layout_or_kind ppf t = if display_histories then if flattened_histories - then format_flattened_history ~intro ppf t - else format_history_tree ~intro ppf t + then format_flattened_history ~intro ~layout_or_kind ppf t + else format_history_tree ~intro ~layout_or_kind ppf t end -include Format_history +let format_history = Format_history.format_history ~layout_or_kind:"kind" (******************************) (* errors *) @@ -938,60 +1672,96 @@ module Violation = struct the choice of error message. (Though the [Path.t] payload *is* indeed just about the payload.) *) - let of_ violation = { violation; missing_cmi = None } + let of_ ?missing_cmi violation = { violation; missing_cmi } - let record_missing_cmi ~missing_cmi_for t = - { t with missing_cmi = Some missing_cmi_for } + let is_missing_cmi viol = Option.is_some viol.missing_cmi - let is_missing_cmi { missing_cmi } = Option.is_some missing_cmi + type locale = + | Mode + | Layout let report_general preamble pp_former former ppf t = - let subjkind_format verb l2 = - match get l2 with + let mismatch_type = + match t.violation with + | Not_a_subjkind (k1, k2) -> + if Misc.Le_result.is_le (Layout.sub k1.jkind.layout k2.jkind.layout) + then Mode + else Layout + | No_intersection _ -> Layout + in + let layout_or_kind = + match mismatch_type with Mode -> "kind" | Layout -> "layout" + in + let format_layout_or_kind = + match mismatch_type with + | Mode -> fun ppf jkind -> Format.fprintf ppf "@,%a" format jkind + | Layout -> fun ppf jkind -> Layout.format ppf jkind.jkind.layout + in + let subjkind_format verb k2 = + match get k2 with | Var _ -> dprintf "%s representable" verb - | Const _ -> dprintf "%s a sublayout of %a" verb format l2 + | Const _ -> + dprintf "%s a sub%s of %a" verb layout_or_kind format_layout_or_kind k2 in - let l1, l2, fmt_l1, fmt_l2, missing_cmi_option = + let k1, k2, fmt_k1, fmt_k2, missing_cmi_option = match t with - | { violation = Not_a_subjkind (l1, l2); missing_cmi } -> ( + | { violation = Not_a_subjkind (k1, k2); missing_cmi } -> ( + let missing_cmi = + match missing_cmi with + | None -> ( + match k1.history with + | Creation (Missing_cmi p) -> Some p + | Creation (Any_creation (Missing_cmi p)) -> Some p + | _ -> None) + | Some _ -> missing_cmi + in match missing_cmi with | None -> - ( l1, - l2, - dprintf "layout %a" format l1, - subjkind_format "is not" l2, + ( k1, + k2, + dprintf "%s %a" layout_or_kind format_layout_or_kind k1, + subjkind_format "is not" k2, None ) | Some p -> - ( l1, - l2, - dprintf "an unknown layout", - subjkind_format "might not be" l2, + ( k1, + k2, + dprintf "an unknown %s" layout_or_kind, + subjkind_format "might not be" k2, Some p )) - | { violation = No_intersection (l1, l2); missing_cmi } -> + | { violation = No_intersection (k1, k2); missing_cmi } -> assert (Option.is_none missing_cmi); - ( l1, - l2, - dprintf "layout %a" format l1, - dprintf "does not overlap with %a" format l2, + ( k1, + k2, + dprintf "%s %a" layout_or_kind format_layout_or_kind k1, + dprintf "does not overlap with %a" format_layout_or_kind k2, None ) in if display_histories then let connective = - match t.violation with - | Not_a_subjkind _ -> "be a sublayout of" - | No_intersection _ -> "overlap with" + match t.violation, get k2 with + | Not_a_subjkind _, Const _ -> + dprintf "be a sub%s of %a" layout_or_kind format_layout_or_kind k2 + | No_intersection _, Const _ -> + dprintf "overlap with %a" format_layout_or_kind k2 + | _, Var _ -> dprintf "be representable" in - fprintf ppf "%a%a" - (format_history ~intro:(dprintf "The layout of %a is" pp_former former)) - l1 - (format_history + fprintf ppf "@[%a@;%a@]" + (Format_history.format_history ~intro: - (dprintf "But the layout of %a must %s" pp_former former connective)) - l2 + (dprintf "@[The %s of %a is %a@]" layout_or_kind pp_former + former format_layout_or_kind k1) + ~layout_or_kind) + k1 + (Format_history.format_history + ~intro: + (dprintf "@[But the %s of %a must %t@]" layout_or_kind + pp_former former connective) + ~layout_or_kind) + k2 else fprintf ppf "@[%s%a has %t,@ which %t.@]" preamble pp_former former - fmt_l1 fmt_l2; + fmt_k1 fmt_k2; report_missing_cmi ppf missing_cmi_option let pp_t ppf x = fprintf ppf "%t" x @@ -1007,89 +1777,88 @@ end (******************************) (* relations *) -let equate_or_equal ~allow_mutation (l1 : t) (l2 : t) = - match l1.jkind, l2.jkind with - | Any, Any -> true - | Immediate64, Immediate64 -> true - | Immediate, Immediate -> true - | Sort s1, Sort s2 -> ( - match Sort.equate_tracking_mutation s1 s2 with - | (Equal_mutated_first | Equal_mutated_second) when not allow_mutation -> - Misc.fatal_errorf "Jkind.equal: Performed unexpected mutation" - | Unequal -> false - | Equal_no_mutation | Equal_mutated_first | Equal_mutated_second -> true) - | (Any | Immediate64 | Immediate | Sort _), _ -> false +let equate_or_equal ~allow_mutation + { jkind = jkind1; history = _; has_warned = _ } + { jkind = jkind2; history = _; has_warned = _ } = + Jkind_desc.equate_or_equal ~allow_mutation jkind1 jkind2 (* CR layouts v2.8: Switch this back to ~allow_mutation:false *) let equal = equate_or_equal ~allow_mutation:true +let () = Types.set_jkind_equal equal + let equate = equate_or_equal ~allow_mutation:true +(* Not all jkind history reasons are created equal. Some are more helpful than others. + This function encodes that information. + + The reason with higher score should get preserved when combined with one of lower + score. *) +let score_reason = function + (* error_message annotated by the user should always take priority *) + | Creation (Annotated (With_error_message _, _)) -> 1 + (* Concrete creation is quite vague, prefer more specific reasons *) + | Creation (Concrete_creation _ | Concrete_legacy_creation _) -> -1 + | _ -> 0 + let combine_histories reason lhs rhs = - Interact - { reason; - lhs_jkind = lhs.jkind; - lhs_history = lhs.history; - rhs_jkind = rhs.jkind; - rhs_history = rhs.history - } + if flattened_histories + then + match Desc.sub (Jkind_desc.get lhs.jkind) (Jkind_desc.get rhs.jkind) with + | Less -> lhs.history + | Not_le -> + rhs.history + (* CR layouts: this will be wrong if we ever have a non-trivial meet in the layout lattice *) + | Equal -> + if score_reason lhs.history >= score_reason rhs.history + then lhs.history + else rhs.history + else + Interact + { reason; + lhs_jkind = lhs.jkind; + lhs_history = lhs.history; + rhs_jkind = rhs.jkind; + rhs_history = rhs.history + } -let intersection ~reason l1 l2 = - match l1.jkind, l2.jkind with - (* only update the history when something interesting happens; e.g. - finding the intersection between a subjkind and its superjkind - is not interesting *) - | _, Any -> Ok l1 - | Any, _ -> Ok l2 - | Immediate, Immediate | Immediate64, Immediate64 -> - Ok { l1 with history = combine_histories reason l1 l2 } - | Immediate, Immediate64 -> Ok l1 - | Immediate64, Immediate -> Ok l2 - | (Immediate | Immediate64), Sort s -> - if Sort.equate s Sort.value - then Ok l1 - else Error (Violation.of_ (No_intersection (l1, l2))) - | Sort s, (Immediate | Immediate64) -> - if Sort.equate s Sort.value - then Ok l2 - else Error (Violation.of_ (No_intersection (l1, l2))) - | Sort s1, Sort s2 -> - if Sort.equate s1 s2 - then Ok { l1 with history = combine_histories reason l1 l2 } - else Error (Violation.of_ (No_intersection (l1, l2))) +let has_intersection t1 t2 = + Option.is_some (Jkind_desc.intersection t1.jkind t2.jkind) + +let intersection_or_error ~reason t1 t2 = + match Jkind_desc.intersection t1.jkind t2.jkind with + | None -> Error (Violation.of_ (No_intersection (t1, t2))) + | Some jkind -> + Ok + { jkind; + history = combine_histories reason t1 t2; + has_warned = t1.has_warned || t2.has_warned + } (* this is hammered on; it must be fast! *) -let check_sub sub super : sub_result = - match sub.jkind, super.jkind with - (* don't use [get], because that allocates *) - | Any, Any -> Equal - | _, Any -> Sub - | Immediate, Immediate -> Equal - | Immediate64, Immediate64 -> Equal - | Immediate, Immediate64 -> Sub - | Immediate64, Immediate -> Not_sub - | (Immediate | Immediate64), Sort s -> - if Sort.equate s Sort.value then Sub else Not_sub - | Sort s1, Sort s2 -> if Sort.equate s1 s2 then Equal else Not_sub - | Any, _ -> Not_sub - | Sort _, (Immediate | Immediate64) -> Not_sub - -let sub sub super = - match check_sub sub super with - | Sub | Equal -> Ok () - | Not_sub -> Error (Violation.of_ (Not_a_subjkind (sub, super))) +let check_sub sub super = Jkind_desc.sub sub.jkind super.jkind + +let sub sub super = Misc.Le_result.is_le (check_sub sub super) + +let sub_or_error t1 t2 = + if sub t1 t2 then Ok () else Error (Violation.of_ (Not_a_subjkind (t1, t2))) let sub_with_history sub super = match check_sub sub super with - | Sub | Equal -> + | Less | Equal -> Ok { sub with history = combine_histories Subjkind sub super } - | Not_sub -> Error (Violation.of_ (Not_a_subjkind (sub, super))) + | Not_le -> Error (Violation.of_ (Not_a_subjkind (sub, super))) let is_void_defaulting = function - | { jkind = Sort s } -> Sort.is_void_defaulting s + | { jkind = { layout = Sort s; _ }; _ } -> Sort.is_void_defaulting s | _ -> false -let is_any = function { jkind = Any } -> true | _ -> false +(* This doesn't do any mutation because mutating a sort variable can't make it + any, and modal upper bounds are constant. *) +let is_max jkind = sub Primitive.any_dummy_jkind jkind + +let has_layout_any jkind = + match jkind.jkind.layout with Any -> true | _ -> false (*********************************) (* debugging *) @@ -1097,37 +1866,39 @@ let is_any = function { jkind = Any } -> true | _ -> false module Debug_printers = struct open Format - let internal ppf : internal -> unit = function - | Any -> fprintf ppf "Any" - | Sort s -> fprintf ppf "Sort %a" Sort.Debug_printers.t s - | Immediate64 -> fprintf ppf "Immediate64" - | Immediate -> fprintf ppf "Immediate" - - let concrete_jkind_reason ppf : concrete_jkind_reason -> unit = function + let concrete_creation_reason ppf : History.concrete_creation_reason -> unit = + function | Match -> fprintf ppf "Match" | Constructor_declaration idx -> fprintf ppf "Constructor_declaration %d" idx | Label_declaration lbl -> fprintf ppf "Label_declaration %a" Ident.print lbl - | Unannotated_type_parameter -> fprintf ppf "Unannotated_type_parameter" | Record_projection -> fprintf ppf "Record_projection" | Record_assignment -> fprintf ppf "Record_assignment" | Let_binding -> fprintf ppf "Let_binding" | Function_argument -> fprintf ppf "Function_argument" | Function_result -> fprintf ppf "Function_result" | Structure_item_expression -> fprintf ppf "Structure_item_expression" - | V1_safety_check -> fprintf ppf "V1_safety_check" | External_argument -> fprintf ppf "External_argument" | External_result -> fprintf ppf "External_result" | Statement -> fprintf ppf "Statement" + | Optional_arg_default -> fprintf ppf "Optional_arg_default" + | Layout_poly_in_external -> fprintf ppf "Layout_poly_in_external" + + let concrete_legacy_creation_reason ppf : + History.concrete_legacy_creation_reason -> unit = function + | Unannotated_type_parameter path -> + fprintf ppf "Unannotated_type_parameter %a" !printtyp_path path + | Wildcard -> fprintf ppf "Wildcard" + | Unification_var -> fprintf ppf "Unification_var" + | Array_element -> fprintf ppf "Array_element" - let annotation_context ppf : annotation_context -> unit = function + let rec annotation_context ppf : History.annotation_context -> unit = function | Type_declaration p -> fprintf ppf "Type_declaration %a" Path.print p | Type_parameter (p, var) -> fprintf ppf "Type_parameter (%a, %a)" Path.print p (Misc.Stdlib.Option.print Misc.Stdlib.String.print) var - | With_constraint s -> fprintf ppf "With_constraint %S" s | Newtype_declaration name -> fprintf ppf "Newtype_declaration %s" name | Constructor_type_parameter (cstr, name) -> fprintf ppf "Constructor_type_parameter (%a, %S)" Path.print cstr name @@ -1135,34 +1906,46 @@ module Debug_printers = struct | Type_variable name -> fprintf ppf "Type_variable %S" name | Type_wildcard loc -> fprintf ppf "Type_wildcard (%a)" Location.print_loc loc + | With_error_message (message, context) -> + fprintf ppf "With_error_message (%s, %a)" message annotation_context + context - let any_creation_reason ppf : any_creation_reason -> unit = function + let any_creation_reason ppf : History.any_creation_reason -> unit = function | Missing_cmi p -> fprintf ppf "Missing_cmi %a" Path.print p - | Wildcard -> fprintf ppf "Wildcard" - | Unification_var -> fprintf ppf "Unification_var" | Initial_typedecl_env -> fprintf ppf "Initial_typedecl_env" | Dummy_jkind -> fprintf ppf "Dummy_jkind" + | Wildcard -> fprintf ppf "Wildcard" + | Unification_var -> fprintf ppf "Unification_var" | Type_expression_call -> fprintf ppf "Type_expression_call" + | Inside_of_Tarrow -> fprintf ppf "Inside_of_Tarrow" + + let any_non_null_creation_reason ppf : + History.any_non_null_creation_reason -> unit = function + | Array_type_argument -> fprintf ppf "Array_type_argument" - let immediate_creation_reason ppf : immediate_creation_reason -> _ = function + let immediate_creation_reason ppf : History.immediate_creation_reason -> _ = + function | Empty_record -> fprintf ppf "Empty_record" | Enumeration -> fprintf ppf "Enumeration" | Primitive id -> fprintf ppf "Primitive %s" (Ident.unique_name id) | Immediate_polymorphic_variant -> fprintf ppf "Immediate_polymorphic_variant" - | Gc_ignorable_check -> fprintf ppf "Gc_ignorable_check" - | Value_kind -> fprintf ppf "Value_kind" - let immediate64_creation_reason ppf = function - | Local_mode_cross_check -> fprintf ppf "Local_mode_cross_check" - | Gc_ignorable_check -> fprintf ppf "Gc_ignorable_check" + let immediate64_creation_reason ppf : History.immediate64_creation_reason -> _ + = function | Separability_check -> fprintf ppf "Separability_check" - let value_creation_reason ppf : value_creation_reason -> _ = function - | Class_let_binding -> fprintf ppf "Class_let_binding" + let value_or_null_creation_reason ppf : + History.value_or_null_creation_reason -> _ = function | Tuple_element -> fprintf ppf "Tuple_element" + | Separability_check -> fprintf ppf "Separability_check" + | Polymorphic_variant_field -> fprintf ppf "Polymorphic_variant_field" + | Structure_element -> fprintf ppf "Structure_element" + | V1_safety_check -> fprintf ppf "V1_safety_check" + + let value_creation_reason ppf : History.value_creation_reason -> _ = function + | Class_let_binding -> fprintf ppf "Class_let_binding" | Probe -> fprintf ppf "Probe" - | Package_hack -> fprintf ppf "Package_hack" | Object -> fprintf ppf "Object" | Instance_variable -> fprintf ppf "Instance_variable" | Object_field -> fprintf ppf "Object_field" @@ -1171,7 +1954,9 @@ module Debug_printers = struct | Boxed_variant -> fprintf ppf "Boxed_variant" | Extensible_variant -> fprintf ppf "Extensible_variant" | Primitive id -> fprintf ppf "Primitive %s" (Ident.unique_name id) - | Type_argument -> fprintf ppf "Type_argument" + | Type_argument { parent_path; position; arity } -> + fprintf ppf "Type_argument (pos %d, arity %d) of %a" position arity + !printtyp_path parent_path | Tuple -> fprintf ppf "Tuple" | Row_variable -> fprintf ppf "Row_variable" | Polymorphic_variant -> fprintf ppf "Polymorphic_variant" @@ -1179,48 +1964,81 @@ module Debug_printers = struct | Tfield -> fprintf ppf "Tfield" | Tnil -> fprintf ppf "Tnil" | First_class_module -> fprintf ppf "First_class_module" - | Separability_check -> fprintf ppf "Separability_check" | Univar -> fprintf ppf "Univar" - | Polymorphic_variant_field -> fprintf ppf "Polymorphic_variant_field" | Default_type_jkind -> fprintf ppf "Default_type_jkind" - | Float_record_field -> fprintf ppf "Float_record_field" | Existential_type_variable -> fprintf ppf "Existential_type_variable" - | Array_element -> fprintf ppf "Array_element" + | Array_comprehension_element -> fprintf ppf "Array_comprehension_element" | Lazy_expression -> fprintf ppf "Lazy_expression" - | Class_argument -> fprintf ppf "Class_argument" - | Structure_element -> fprintf ppf "Structure_element" + | Class_type_argument -> fprintf ppf "Class_type_argument" + | Class_term_argument -> fprintf ppf "Class_term_argument" | Debug_printer_argument -> fprintf ppf "Debug_printer_argument" - | V1_safety_check -> fprintf ppf "V1_safety_check" | Captured_in_object -> fprintf ppf "Captured_in_object" + | Recmod_fun_arg -> fprintf ppf "Recmod_fun_arg" | Unknown s -> fprintf ppf "Unknown %s" s - let void_creation_reason ppf : void_creation_reason -> _ = function - | V1_safety_check -> fprintf ppf "V1_safety_check" + let float64_creation_reason ppf : History.float64_creation_reason -> _ = + function + | Primitive id -> fprintf ppf "Primitive %s" (Ident.unique_name id) + + let float32_creation_reason ppf : History.float32_creation_reason -> _ = + function + | Primitive id -> fprintf ppf "Primitive %s" (Ident.unique_name id) + + let word_creation_reason ppf : History.word_creation_reason -> _ = function + | Primitive id -> fprintf ppf "Primitive %s" (Ident.unique_name id) + + let bits32_creation_reason ppf : History.bits32_creation_reason -> _ = + function + | Primitive id -> fprintf ppf "Primitive %s" (Ident.unique_name id) - let float64_creation_reason ppf : float64_creation_reason -> _ = function + let bits64_creation_reason ppf : History.bits64_creation_reason -> _ = + function | Primitive id -> fprintf ppf "Primitive %s" (Ident.unique_name id) - let creation_reason ppf : creation_reason -> unit = function + let creation_reason ppf : History.creation_reason -> unit = function | Annotated (ctx, loc) -> fprintf ppf "Annotated (%a,%a)" annotation_context ctx Location.print_loc loc + | Missing_cmi p -> fprintf ppf "Missing_cmi %a" !printtyp_path p | Any_creation any -> fprintf ppf "Any_creation %a" any_creation_reason any + | Any_non_null_creation any -> + fprintf ppf "Any_non_null_creation %a" any_non_null_creation_reason any | Immediate_creation immediate -> fprintf ppf "Immediate_creation %a" immediate_creation_reason immediate | Immediate64_creation immediate64 -> fprintf ppf "Immediate64_creation %a" immediate64_creation_reason immediate64 + | Value_or_null_creation value -> + fprintf ppf "Value_or_null_creation %a" value_or_null_creation_reason + value | Value_creation value -> fprintf ppf "Value_creation %a" value_creation_reason value - | Void_creation void -> - fprintf ppf "Void_creation %a" void_creation_reason void + | Void_creation _ -> . | Float64_creation float -> fprintf ppf "Float64_creation %a" float64_creation_reason float + | Float32_creation float -> + fprintf ppf "Float32_creation %a" float32_creation_reason float + | Word_creation word -> + fprintf ppf "Word_creation %a" word_creation_reason word + | Bits32_creation bits32 -> + fprintf ppf "Bits32_creation %a" bits32_creation_reason bits32 + | Bits64_creation bits64 -> + fprintf ppf "Bits64_creation %a" bits64_creation_reason bits64 | Concrete_creation concrete -> - fprintf ppf "Concrete_creation %a" concrete_jkind_reason concrete + fprintf ppf "Concrete_creation %a" concrete_creation_reason concrete + | Concrete_legacy_creation concrete -> + fprintf ppf "Concrete_legacy_creation %a" concrete_legacy_creation_reason + concrete | Imported -> fprintf ppf "Imported" - - let interact_reason ppf = function + | Imported_type_argument { parent_path; position; arity } -> + fprintf ppf "Imported_type_argument (pos %d, arity %d) of %a" position + arity !printtyp_path parent_path + | Generalized (id, loc) -> + fprintf ppf "Generalized (%s, %a)" + (match id with Some id -> Ident.unique_name id | None -> "") + Location.print_loc loc + + let interact_reason ppf : History.interact_reason -> _ = function | Gadt_equation p -> fprintf ppf "Gadt_equation %a" Path.print p | Tyvar_refinement_intersection -> fprintf ppf "Tyvar_refinement_intersection" @@ -1231,38 +2049,59 @@ module Debug_printers = struct fprintf ppf "Interact {@[reason = %a;@ lhs_jkind = %a;@ lhs_history = %a;@ \ rhs_jkind = %a;@ rhs_history = %a}@]" - interact_reason reason internal lhs_jkind history lhs_history internal - rhs_jkind history rhs_history + interact_reason reason Jkind_desc.Debug_printers.t lhs_jkind history + lhs_history Jkind_desc.Debug_printers.t rhs_jkind history rhs_history | Creation c -> fprintf ppf "Creation (%a)" creation_reason c - let t ppf ({ jkind; history = h } : t) : unit = - fprintf ppf "@[{ jkind = %a@,; history = %a }@]" internal jkind history - h + let t ppf ({ jkind; history = h; has_warned = _ } : t) : unit = + fprintf ppf "@[{ jkind = %a@,; history = %a }@]" + Jkind_desc.Debug_printers.t jkind history h end (*** formatting user errors ***) -let report_error ~loc = function - | Insufficient_level (context, jkind) -> ( - let required_layouts_level = get_required_layouts_level context jkind in +let report_error ~loc : Error.t -> _ = function + | Unknown_jkind jkind -> + Location.errorf ~loc + (* CR layouts v2.9: use the context to produce a better error message. + When RAE tried this, some types got printed like [t/2], but the + [/2] shouldn't be there. Investigate and fix. *) + "@[Unknown layout %a@]" Pprintast.jkind jkind + | Unknown_mode mode -> + Location.errorf ~loc "@[Unknown mode %a@]" Pprintast.mode mode + | Multiple_jkinds { from_annotation; from_attribute } -> + Location.errorf ~loc + "@[A type declaration's layout can be given at most once.@;\ + This declaration has an layout annotation (%a) and a layout attribute \ + ([@@@@%a]).@]" + Const.format_no_hiding from_annotation Const.format from_attribute + | Insufficient_level { jkind; required_layouts_level } -> ( let hint ppf = Format.fprintf ppf "You must enable -extension %s to use this feature." (Language_extension.to_command_line_string Layouts required_layouts_level) in - match Language_extension.get_command_line_string_if_enabled Layouts with - | None -> + match Language_extension.is_enabled Layouts with + | false -> Location.errorf ~loc "@[The appropriate layouts extension is not enabled.@;%t@]" hint - | Some cmd_line_string -> + | true -> Location.errorf ~loc (* CR layouts errors: use the context to produce a better error message. When RAE tried this, some types got printed like [t/2], but the [/2] shouldn't be there. Investigate and fix. *) - "@[Layout %s is more experimental than allowed by -extension %s.@;\ + "@[Layout %a is more experimental than allowed by the enabled \ + layouts extension.@;\ %t@]" - (string_of_const jkind) cmd_line_string hint) + Const.format_no_hiding jkind hint) let () = Location.register_error_of_exn (function - | User_error (loc, err) -> Some (report_error ~loc err) + | Error.User_error (loc, err) -> Some (report_error ~loc err) | _ -> None) + +(* CR layouts v2.8: Remove the definitions below by propagating changes + outside of this file. *) + +type annotation = Const.t * Jane_syntax.Jkind.annotation + +let default_to_value_and_get t = default_to_value_and_get t diff --git a/typing/jkind.mli b/typing/jkind.mli index 0c8942583ad..bb56240ee28 100644 --- a/typing/jkind.mli +++ b/typing/jkind.mli @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -(* This module is named Jkind, with a 'y', to distinguish jkinds +(* This module is named Jkind, with a 'j', to distinguish jkinds as used here from type kinds (which might be abstract or record or variant, etc.). This is clearly far from ideal, but the current scheme has these positives: @@ -31,250 +31,96 @@ * It is very easy to search for and replace when we have a better name. *) -module Sort : sig - (** A sort classifies how a type is represented at runtime. Every concrete - jkind has a sort, and knowing the sort is sufficient for knowing the - calling convention of values of a given type. *) - type t - - (** These are the constant sorts -- fully determined and without variables *) - type const = - | Void (** No run time representation at all *) - | Value (** Standard ocaml value representation *) - | Float64 (** Unboxed 64-bit floats *) - - (** A sort variable that can be unified during type-checking. *) - type var - - (** Create a new sort variable that can be unified. *) - val new_var : unit -> t - - val of_const : const -> t - - val of_var : var -> t - - val void : t - - val value : t - - val float64 : t - - (** These names are generated lazily and only when this function is called, - and are not guaranteed to be efficient to create *) - val var_name : var -> string - - (** This checks for equality, and sets any variables to make two sorts - equal, if possible *) - val equate : t -> t -> bool - - val equal_const : const -> const -> bool - - val format : Format.formatter -> t -> unit - - (** Defaults any variables to value; leaves other sorts alone *) - val default_to_value : t -> unit - - (** Checks whether this sort is [void], defaulting to [value] if a sort - variable is unfilled. *) - val is_void_defaulting : t -> bool +(* The externality mode. This tracks whether or not an expression is external + to the type checker; something external to the type checker can be skipped + during garbage collection. + + This will eventually be incorporated into the mode + solver, but it is defined here because we do not yet track externalities + on expressions, just in jkinds. *) +(* CR externals: Move to mode.ml. But see + https://github.com/goldfirere/flambda-backend/commit/d802597fbdaaa850e1ed9209a1305c5dcdf71e17 + first, which was reisenberg's attempt to do so. *) +module Externality : sig + type t = Jkind_types.Externality.t = + | External (* not managed by the garbage collector *) + | External64 (* not managed by the garbage collector on 64-bit systems *) + | Internal (* managed by the garbage collector *) + + val le : t -> t -> bool + + val print : Format.formatter -> t -> unit +end - (** [get_default_value] extracts the sort as a `const`. If it's a variable, - it is set to [value] first. *) - val get_default_value : t -> const +module Nullability : sig + type t = Jkind_types.Nullability.t = + | Non_null (* proven to not have NULL values *) + | Maybe_null (* may have NULL values *) - (** To record changes to sorts, for use with `Types.{snapshot, backtrack}` *) - type change + val le : t -> t -> bool - val change_log : (change -> unit) ref + val print : Format.formatter -> t -> unit +end - val undo_change : change -> unit +module Sort : Jkind_intf.Sort with type const = Jkind_types.Sort.const - module Debug_printers : sig - val t : Format.formatter -> t -> unit +type sort = Sort.t - val var : Format.formatter -> var -> unit +(* The layout of a type describes its memory layout. A layout is either the + indeterminate [Any] or a sort, which is a concrete memory layout. *) +module Layout : sig + module Const : sig + type t = Jkind_types.Layout.Const.t + + val get_sort : t -> Sort.Const.t option + + val to_string : t -> string + + (* CR layouts v2.8: remove this *) + module Legacy : sig + type t = Jkind_types.Layout.Const.Legacy.t = + | Any + | Any_non_null + | Value_or_null + | Value + | Void + | Immediate64 + | Immediate + | Float64 + | Float32 + | Word + | Bits32 + | Bits64 + end end +end - (* CR layouts: These are sorts for the types of ocaml expressions that are - currently required to be values, but for which we expect to relax that - restriction in versions 2 and beyond. Naming them makes it easy to find - where in the translation to lambda they are assume to be value. *) - (* CR layouts: add similarly named jkinds and use those names everywhere (not - just the translation to lambda) rather than writing specific jkinds and - sorts in the code. *) - val for_class_arg : t - - val for_instance_var : t - - val for_lazy_body : t - - val for_tuple_element : t - - val for_record : t - - val for_constructor_arg : t - - val for_block_element : t - - val for_array_get_result : t - - val for_array_element : t - - val for_list_element : t - - (** These are sorts for the types of ocaml expressions that we expect will - always be "value". These names are used in the translation to lambda to - make the code clearer. *) - val for_function : t - - val for_probe_body : t - - val for_poly_variant : t +(** A Jkind.t is a full description of the runtime representation of values + of a given type. It includes sorts, but also the abstract top jkind + [Any] and subjkinds of other sorts, such as [Immediate]. *) +type t = Types.type_expr Jkind_types.t - val for_object : t +module History : sig + include module type of struct + include Jkind_intf.History + end - val for_initializer : t + (* history *) - val for_method : t + val has_imported_history : t -> bool - val for_module : t + val update_reason : t -> creation_reason -> t - val for_predef_value : t (* Predefined value types, e.g. int and string *) + (* Mark the jkind as having produced a compiler warning. *) + val with_warning : t -> t - val for_tuple : t + (* Whether this jkind has produced a compiler warning. *) + val has_warned : t -> bool end -type sort = Sort.t - -(* This module describes jkinds, which classify types. Jkinds are arranged - in the following lattice: - - {[ - any - / \ - value void - | - immediate64 - | - immediate - ]} -*) - -(** A Jkind.t is a full description of the runtime representation of values - of a given type. It includes sorts, but also the abstract top jkind - [Any] and subjkinds of other sorts, such as [Immediate]. *) -type t - (******************************) (* errors *) -type concrete_jkind_reason = - | Match - | Constructor_declaration of int - | Label_declaration of Ident.t - | Unannotated_type_parameter - | Record_projection - | Record_assignment - | Let_binding - | Function_argument - | Function_result - | Structure_item_expression - | V1_safety_check - | External_argument - | External_result - | Statement - -type annotation_context = - | Type_declaration of Path.t - | Type_parameter of Path.t * string option - | With_constraint of string - | Newtype_declaration of string - | Constructor_type_parameter of Path.t * string - | Univar of string - | Type_variable of string - | Type_wildcard of Location.t - -type value_creation_reason = - | Class_let_binding - | Tuple_element - | Probe - | Package_hack - | Object - | Instance_variable - | Object_field - | Class_field - | Boxed_record - | Boxed_variant - | Extensible_variant - | Primitive of Ident.t - | Type_argument (* CR layouts: Should this take a Path.t? *) - | Tuple - | Row_variable - | Polymorphic_variant - | Arrow - | Tfield - | Tnil - | First_class_module - | Separability_check - | Univar - | Polymorphic_variant_field - | Default_type_jkind - | Float_record_field - | Existential_type_variable - | Array_element - | Lazy_expression - | Class_argument - | Structure_element - | Debug_printer_argument - | V1_safety_check - | Captured_in_object - | Unknown of string (* CR layouts: get rid of these *) - -type immediate_creation_reason = - | Empty_record - | Enumeration - | Primitive of Ident.t - | Immediate_polymorphic_variant - | Gc_ignorable_check - | Value_kind - -type immediate64_creation_reason = - | Local_mode_cross_check - | Gc_ignorable_check - | Separability_check - -type void_creation_reason = V1_safety_check - -type any_creation_reason = - | Missing_cmi of Path.t - | Wildcard - | Unification_var - | Initial_typedecl_env - | Dummy_jkind - (* This is used when the jkind is about to get overwritten; - key example: when creating a fresh tyvar that is immediately - unified to correct levels *) - | Type_expression_call - -type float64_creation_reason = Primitive of Ident.t - -type creation_reason = - | Annotated of annotation_context * Location.t - | Value_creation of value_creation_reason - | Immediate_creation of immediate_creation_reason - | Immediate64_creation of immediate64_creation_reason - | Void_creation of void_creation_reason - | Any_creation of any_creation_reason - | Float64_creation of float64_creation_reason - | Concrete_creation of concrete_jkind_reason - | Imported - -type interact_reason = - | Gadt_equation of Path.t - | Tyvar_refinement_intersection - (* CR layouts: this needs to carry a type_expr, but that's loopy *) - | Subjkind - module Violation : sig type violation = | Not_a_subjkind of t * t @@ -282,10 +128,9 @@ module Violation : sig type t - val of_ : violation -> t + (** Set [?missing_cmi] to mark [t] as having arisen from a missing cmi *) - (** Mark a [t] as having arisen from a missing cmi *) - val record_missing_cmi : missing_cmi_for:Path.t -> t -> t + val of_ : ?missing_cmi:Path.t -> violation -> t (** Is this error from a missing cmi? *) val is_missing_cmi : t -> bool @@ -317,86 +162,213 @@ end (******************************) (* constants *) -(** Constant jkinds are used both for user-written annotations and within - the type checker when we know a jkind has no variables *) -type const = Jane_asttypes.const_jkind = - | Any - | Value - | Void - | Immediate64 - | Immediate - | Float64 +module Const : sig + (** Constant jkinds are used for user-written annotations *) + type t = Types.type_expr Jkind_types.Const.t + + val to_out_jkind_const : t -> Outcometree.out_jkind_const + + val format : Format.formatter -> t -> unit + + val equal : t -> t -> bool + + (** Gets the layout of a constant jkind. Never does mutation. *) + val get_layout : t -> Layout.Const.t + + (* CR layouts v2.8: remove this *) -val string_of_const : const -> string + (** Gets the legacy layout of a constant jkind. Never does mutation. *) + val get_legacy_layout : t -> Layout.Const.Legacy.t -val equal_const : const -> const -> bool + (** Gets the maximum modes for types of this constant jkind. *) + val get_modal_upper_bounds : t -> Mode.Alloc.Const.t -(** This jkind is the top of the jkind lattice. All types have jkind [any]. + (** Gets the maximum mode on the externality axis for types of this constant jkind. *) + val get_externality_upper_bound : t -> Externality.t + + module Primitive : sig + type nonrec t = + { jkind : t; + name : string + } + + (** This jkind is the top of the jkind lattice. All types have jkind [any]. But we cannot compile run-time manipulations of values of types with jkind [any]. *) -val any : why:any_creation_reason -> t + val any : t + + (** [any], except for null pointers. *) + val any_non_null : t + + (** Value of types of this jkind are not retained at all at runtime *) + val void : t + + (** This is the jkind of normal ocaml values or null pointers *) + val value_or_null : t + + (** This is the jkind of normal ocaml values *) + val value : t + + (** Values of types of this jkind are immediate on 64-bit platforms; on other + platforms, we know nothing other than that it's a value. *) + val immediate64 : t + + (** We know for sure that values of types of this jkind are always immediate *) + val immediate : t + + (** This is the jkind of unboxed 64-bit floats. They have sort + Float64. Mode-crosses. *) + val float64 : t + + (** This is the jkind of unboxed 32-bit floats. They have sort + Float32. Mode-crosses. *) + val float32 : t + + (** This is the jkind of unboxed native-sized integers. They have sort + Word. Does not mode-cross. *) + val word : t + + (** This is the jkind of unboxed 32-bit integers. They have sort Bits32. Does + not mode-cross. *) + val bits32 : t + + (** This is the jkind of unboxed 64-bit integers. They have sort Bits64. Does + not mode-cross. *) + val bits64 : t + + (** A list of all primitive jkinds *) + val all : t list + end + + module Sort : module type of struct + include Sort.Const + end + + module Layout : module type of struct + include Layout.Const + end +end + +module Primitive : sig + (** This jkind is the top of the jkind lattice. All types have jkind [any]. + But we cannot compile run-time manipulations of values of types with jkind + [any]. *) + val any : why:History.any_creation_reason -> t + + val any_non_null : why:History.any_non_null_creation_reason -> t -(** Value of types of this jkind are not retained at all at runtime *) -val void : why:void_creation_reason -> t + (** Value of types of this jkind are not retained at all at runtime *) + val void : why:History.void_creation_reason -> t -(** This is the jkind of normal ocaml values *) -val value : why:value_creation_reason -> t + val value_or_null : why:History.value_or_null_creation_reason -> t -(** Values of types of this jkind are immediate on 64-bit platforms; on other + (** This is the jkind of normal ocaml values *) + val value : why:History.value_creation_reason -> t + + (** Values of types of this jkind are immediate on 64-bit platforms; on other platforms, we know nothing other than that it's a value. *) -val immediate64 : why:immediate64_creation_reason -> t + val immediate64 : why:History.immediate64_creation_reason -> t + + (** We know for sure that values of types of this jkind are always immediate *) + val immediate : why:History.immediate_creation_reason -> t + + (** This is the jkind of unboxed 64-bit floats. They have sort + Float64. Mode-crosses. *) + val float64 : why:History.float64_creation_reason -> t + + (** This is the jkind of unboxed 32-bit floats. They have sort + Float32. Mode-crosses. *) + val float32 : why:History.float32_creation_reason -> t -(** We know for sure that values of types of this jkind are always immediate *) -val immediate : why:immediate_creation_reason -> t + (** This is the jkind of unboxed native-sized integers. They have sort + Word. Does not mode-cross. *) + val word : why:History.word_creation_reason -> t + + (** This is the jkind of unboxed 32-bit integers. They have sort Bits32. Does + not mode-cross. *) + val bits32 : why:History.bits32_creation_reason -> t + + (** This is the jkind of unboxed 64-bit integers. They have sort Bits64. Does + not mode-cross. *) + val bits64 : why:History.bits64_creation_reason -> t +end -(** This is the jkind of unboxed 64-bit floats. They have sort Float64. *) -val float64 : why:float64_creation_reason -> t +(** Take an existing [t] and add an ability to mode-cross along all the axes. *) +val add_mode_crossing : t -> t + +(** Take an existing [t] and add an ability to mode-cross along the portability and + contention axes, if [from] crosses the respective axes. Return the new jkind, + along with a boolean of whether illegal crossing was added *) +val add_portability_and_contention_crossing : from:t -> t -> t * bool (******************************) (* construction *) (** Create a fresh sort variable, packed into a jkind, returning both the resulting kind and the sort. *) -val of_new_sort_var : why:concrete_jkind_reason -> t * sort +val of_new_sort_var : why:History.concrete_creation_reason -> t * sort (** Create a fresh sort variable, packed into a jkind. *) -val of_new_sort : why:concrete_jkind_reason -> t +val of_new_sort : why:History.concrete_creation_reason -> t + +(** Same as [of_new_sort_var], but the jkind is lowered to [Non_null] + to mirror "legacy" OCaml values. + Defaulting the sort variable produces exactly [value]. *) +val of_new_legacy_sort_var : + why:History.concrete_legacy_creation_reason -> t * sort + +(** Same as [of_new_sort], but the jkind is lowered to [Non_null] + to mirror "legacy" OCaml values. + Defaulting the sort variable produces exactly [value]. *) +val of_new_legacy_sort : why:History.concrete_legacy_creation_reason -> t -val of_const : why:creation_reason -> const -> t +val of_const : why:History.creation_reason -> Const.t -> t + +val const_of_user_written_annotation : + context:History.annotation_context -> Jane_syntax.Jkind.annotation -> Const.t + +(** The typed jkind together with its user-written annotation. *) +type annotation = Types.type_expr Jkind_types.annotation -(* CR layouts v1.5: remove legacy_immediate when the old attributes mechanism - is rerouted away from the new annotations mechanism *) val of_annotation : - ?legacy_immediate:bool -> - context:annotation_context -> - Jane_asttypes.jkind_annotation -> - t + context:History.annotation_context -> + Jane_syntax.Jkind.annotation -> + t * annotation val of_annotation_option_default : - ?legacy_immediate:bool -> default:t -> - context:annotation_context -> - Jane_asttypes.jkind_annotation option -> - t - -(** Find a jkind in attributes. Returns error if a disallowed jkind is - present, but always allows immediate attributes if ~legacy_immediate is - true. See comment on [Builtin_attributes.jkind]. *) -val of_attributes : - legacy_immediate:bool -> - context:annotation_context -> - Parsetree.attributes -> - (t option, Jane_asttypes.jkind_annotation) result - -(** Find a jkind in attributes, defaulting to ~default. Returns error if a - disallowed jkind is present, but always allows immediate if - ~legacy_immediate is true. See comment on [Builtin_attributes.jkind]. *) -val of_attributes_default : - legacy_immediate:bool -> - context:annotation_context -> + context:History.annotation_context -> + Jane_syntax.Jkind.annotation option -> + t * annotation option + +(** Find a jkind from a type declaration. Type declarations are special because + the jkind may have been provided via [: jkind] syntax (which goes through + Jane Syntax) or via the old-style [[@@immediate]] or [[@@immediate64]] + attributes, and [of_type_decl] needs to look in two different places on the + [type_declaration] to account for these two alternatives. + + Returns the jkind, the user-written annotation, and the remaining unconsumed + attributes. (The attributes include old-style [[@@immediate]] or + [[@@immediate64]] attributes if those are present, but excludes any + attribute used by Jane Syntax to encode a [: jkind]-style jkind.) + + Raises if a disallowed or unknown jkind is present. +*) +val of_type_decl : + context:History.annotation_context -> + Parsetree.type_declaration -> + (t * annotation * Parsetree.attributes) option + +(** Find a jkind from a type declaration in the same way as [of_type_decl], + defaulting to ~default. + + Raises if a disallowed or unknown jkind is present. +*) +val of_type_decl_default : + context:History.annotation_context -> default:t -> - Parsetree.attributes -> - (t, Jane_asttypes.jkind_annotation) result + Parsetree.type_declaration -> + t * annotation option * Parsetree.attributes (** Choose an appropriate jkind for a boxed record type, given whether all of its fields are [void]. *) @@ -409,24 +381,26 @@ val for_boxed_variant : all_voids:bool -> t (******************************) (* elimination and defaulting *) -(* The description of a jkind, used as a return type from [get]. *) -type desc = - | Const of const - | Var of Sort.var +module Desc : sig + (** The description of a jkind, used as a return type from [get]. *) + type t = + | Const of Const.t + | Var of Sort.var +end (** Extract the [const] from a [Jkind.t], looking through unified sort variables. Returns [Var] if the final, non-variable jkind has not yet been determined. *) -val get : t -> desc +val get : t -> Desc.t -(** [get_default_value] extracts the jkind as a `const`. If it's a sort +(** [default_to_value_and_get] extracts the jkind as a `const`. If it's a sort variable, it is set to [value] first. *) -val get_default_value : t -> const +val default_to_value_and_get : t -> Const.t -(** [default_to_value t] is [ignore (get_default_value t)] *) +(** [default_to_value t] is [ignore (default_to_value_and_get t)] *) val default_to_value : t -> unit -(** [is_void t] is [Void = get_default_value t]. In particular, it will +(** [is_void t] is [Void = default_to_value_and_get t]. In particular, it will default the jkind to value if needed to make this false. *) val is_void_defaulting : t -> bool (* CR layouts v5: When we have proper support for void, we'll want to change @@ -437,11 +411,23 @@ val is_void_defaulting : t -> bool jkinds - raises on Any. *) val sort_of_jkind : t -> sort +(** Gets the layout of a jkind; returns [None] if the layout is still unknown. + Never does mutation. *) +val get_layout : t -> Layout.Const.t option + +(** Gets the maximum modes for types of this jkind. *) +val get_modal_upper_bounds : t -> Mode.Alloc.Const.t + +(** Gets the maximum mode on the externality axis for types of this jkind. *) +val get_externality_upper_bound : t -> Externality.t + +(** Computes a jkind that is the same as the input but with an updated maximum + mode for the externality axis *) +val set_externality_upper_bound : t -> Externality.t -> t + (*********************************) (* pretty printing *) -val to_string : t -> string - val format : Format.formatter -> t -> unit (** Format the history of this jkind: what interactions it has had and why @@ -471,6 +457,10 @@ val equate : t -> t -> bool CR layouts (v1.5): At the moment, this is actually the same as [equate]! *) val equal : t -> t -> bool +(** Checks whether two jkinds have a non-empty intersection. Might mutate + sort variables. *) +val has_intersection : t -> t -> bool + (** Finds the intersection of two jkinds, constraining sort variables to create one if needed, or returns a [Violation.t] if an intersection does not exist. Can update the jkinds. The returned jkind's history @@ -478,22 +468,26 @@ val equal : t -> t -> bool jkind argument. That is, due to histories, this function is asymmetric; it should be thought of as modifying the first jkind to be the intersection of the two, not something that modifies the second jkind. *) -val intersection : reason:interact_reason -> t -> t -> (t, Violation.t) Result.t - -(** [sub t1 t2] returns [Ok ()] iff [t1] is a subjkind of - of [t2]. The current hierarchy is: +val intersection_or_error : + reason:History.interact_reason -> t -> t -> (t, Violation.t) Result.t - Any > Sort Value > Immediate64 > Immediate - Any > Sort Void +(** [sub t1 t2] says whether [t1] is a subjkind of [t2]. Might update + either [t1] or [t2] to make their layouts equal.*) +val sub : t -> t -> bool - Returns [Error _] if the coercion is not possible. *) -val sub : t -> t -> (unit, Violation.t) result +(** [sub_or_error t1 t2] returns [Ok ()] iff [t1] is a subjkind of + of [t2]. Otherwise returns an appropriate error to report to the user. *) +val sub_or_error : t -> t -> (unit, Violation.t) result (** Like [sub], but returns the subjkind with an updated history. *) val sub_with_history : t -> t -> (t, Violation.t) result -(** Checks to see whether a jkind is any. Never does any mutation. *) -val is_any : t -> bool +(** Checks to see whether a jkind is the maximum jkind. Never does any + mutation. *) +val is_max : t -> bool + +(** Checks to see whether a jkind is has layout. Never does any mutation. *) +val has_layout_any : t -> bool (*********************************) (* debugging *) diff --git a/typing/jkind_intf.ml b/typing/jkind_intf.ml new file mode 100644 index 00000000000..f51ea039dfc --- /dev/null +++ b/typing/jkind_intf.ml @@ -0,0 +1,302 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Richard Eisenberg, Jane Street, New York *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(* This module contains definitions that we do not otherwise need to repeat + between the various Jkind modules. See comment in jkind_types.mli. *) +module type Sort = sig + (** A sort classifies how a type is represented at runtime. Every concrete + jkind has a sort, and knowing the sort is sufficient for knowing the + calling convention of values of a given type. *) + type t + + (** These are the constant sorts -- fully determined and without variables *) + type const = + | Void (** No run time representation at all *) + | Value (** Standard ocaml value representation *) + | Float64 (** Unboxed 64-bit floats *) + | Float32 (** Unboxed 32-bit floats *) + | Word (** Unboxed native-size integers *) + | Bits32 (** Unboxed 32-bit integers *) + | Bits64 (** Unboxed 64-bit integers *) + + (** A sort variable that can be unified during type-checking. *) + type var + + module Const : sig + type t = const + + val equal : t -> t -> bool + + val format : Format.formatter -> t -> unit + end + + module Var : sig + type t = var + + (** These names are generated lazily and only when this function is called, + and are not guaranteed to be efficient to create *) + val name : t -> string + end + + val void : t + + val value : t + + val float64 : t + + val float32 : t + + val word : t + + val bits32 : t + + val bits64 : t + + (** Create a new sort variable that can be unified. *) + val new_var : unit -> t + + val of_const : Const.t -> t + + val of_var : Var.t -> t + + (** This checks for equality, and sets any variables to make two sorts + equal, if possible *) + val equate : t -> t -> bool + + val format : Format.formatter -> t -> unit + + (** Defaults any variables to value; leaves other sorts alone *) + val default_to_value : t -> unit + + (** Checks whether this sort is [void], defaulting to [value] if a sort + variable is unfilled. *) + val is_void_defaulting : t -> bool + + (** [default_to_value_and_get] extracts the sort as a `const`. If it's a variable, + it is set to [value] first. *) + val default_to_value_and_get : t -> Const.t + + (** To record changes to sorts, for use with `Types.{snapshot, backtrack}` *) + type change + + val undo_change : change -> unit + + module Debug_printers : sig + val t : Format.formatter -> t -> unit + + val var : Format.formatter -> var -> unit + end + + (* CR layouts: These are sorts for the types of ocaml expressions that are + currently required to be values, but for which we expect to relax that + restriction in versions 2 and beyond. Naming them makes it easy to find + where in the translation to lambda they are assume to be value. *) + (* CR layouts: add similarly named jkinds and use those names everywhere (not + just the translation to lambda) rather than writing specific jkinds and + sorts in the code. *) + val for_class_arg : t + + val for_instance_var : t + + val for_lazy_body : t + + val for_tuple_element : t + + val for_variant_arg : t + + val for_record : t + + val for_block_element : t + + val for_array_get_result : t + + val for_array_comprehension_element : t + + val for_list_element : t + + (** These are sorts for the types of ocaml expressions that we expect will + always be "value". These names are used in the translation to lambda to + make the code clearer. *) + val for_function : t + + val for_probe_body : t + + val for_poly_variant : t + + val for_object : t + + val for_initializer : t + + val for_method : t + + val for_module : t + + val for_predef_value : t (* Predefined value types, e.g. int and string *) + + val for_tuple : t +end + +module History = struct + (* For sort variables that are topmost on the jkind lattice. *) + type concrete_creation_reason = + | Match + | Constructor_declaration of int + | Label_declaration of Ident.t + | Record_projection + | Record_assignment + | Let_binding + | Function_argument + | Function_result + | Structure_item_expression + | External_argument + | External_result + | Statement + | Optional_arg_default + | Layout_poly_in_external + + (* For sort variables that are in the "legacy" position + on the jkind lattice, defaulting exactly to [value]. *) + (* CR layouts v3: after implementing separability, [Array_element] + should instead accept representable separable jkinds. *) + type concrete_legacy_creation_reason = + | Unannotated_type_parameter of Path.t + | Wildcard + | Unification_var + | Array_element + + type annotation_context = + | Type_declaration of Path.t + | Type_parameter of Path.t * string option + | Newtype_declaration of string + | Constructor_type_parameter of Path.t * string + | Univar of string + | Type_variable of string + | Type_wildcard of Location.t + | With_error_message of string * annotation_context + + (* CR layouts v3: move some [value_creation_reason]s + related to objects here. *) + (* CR layouts v3: add a copy of [Type_argument] once we support + enough subjkinding for interfaces to accept [value_or_null] + in [list] or [option]. *) + type value_or_null_creation_reason = + | Tuple_element + | Separability_check + | Polymorphic_variant_field + | Structure_element + | V1_safety_check + + type value_creation_reason = + | Class_let_binding + | Probe + | Object + | Instance_variable + | Object_field + | Class_field + | Boxed_record + | Boxed_variant + | Extensible_variant + | Primitive of Ident.t + | Type_argument of + { parent_path : Path.t; + position : int; + arity : int + } + (* [position] is 1-indexed *) + | Tuple + | Row_variable + | Polymorphic_variant + | Arrow + | Tfield + | Tnil + | First_class_module + | Univar + | Default_type_jkind + | Existential_type_variable + | Array_comprehension_element + | Lazy_expression + | Class_type_argument + | Class_term_argument + | Debug_printer_argument + | Captured_in_object + | Recmod_fun_arg + | Unknown of string (* CR layouts: get rid of these *) + + type immediate_creation_reason = + | Empty_record + | Enumeration + | Primitive of Ident.t + | Immediate_polymorphic_variant + + type immediate64_creation_reason = Separability_check + + (* CR layouts v5: make new void_creation_reasons *) + type void_creation_reason = | + + type any_creation_reason = + | Missing_cmi of Path.t + | Initial_typedecl_env + | Dummy_jkind + (* This is used when the jkind is about to get overwritten; + key example: when creating a fresh tyvar that is immediately + unified to correct levels *) + | Type_expression_call + | Inside_of_Tarrow + | Wildcard + | Unification_var + + type any_non_null_creation_reason = Array_type_argument + + type float64_creation_reason = Primitive of Ident.t + + type float32_creation_reason = Primitive of Ident.t + + type word_creation_reason = Primitive of Ident.t + + type bits32_creation_reason = Primitive of Ident.t + + type bits64_creation_reason = Primitive of Ident.t + + type creation_reason = + | Annotated of annotation_context * Location.t + | Missing_cmi of Path.t + | Value_or_null_creation of value_or_null_creation_reason + | Value_creation of value_creation_reason + | Immediate_creation of immediate_creation_reason + | Immediate64_creation of immediate64_creation_reason + | Void_creation of void_creation_reason + | Any_creation of any_creation_reason + | Any_non_null_creation of any_non_null_creation_reason + | Float64_creation of float64_creation_reason + | Float32_creation of float32_creation_reason + | Word_creation of word_creation_reason + | Bits32_creation of bits32_creation_reason + | Bits64_creation of bits64_creation_reason + | Concrete_creation of concrete_creation_reason + | Concrete_legacy_creation of concrete_legacy_creation_reason + | Imported + | Imported_type_argument of + { parent_path : Path.t; + position : int; + arity : int + } + (* [position] is 1-indexed *) + | Generalized of Ident.t option * Location.t + + type interact_reason = + | Gadt_equation of Path.t + | Tyvar_refinement_intersection + (* CR layouts: this needs to carry a type_expr, but that's loopy *) + | Subjkind +end diff --git a/typing/jkind_types.ml b/typing/jkind_types.ml new file mode 100644 index 00000000000..26623476fc6 --- /dev/null +++ b/typing/jkind_types.ml @@ -0,0 +1,404 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Liam Stevenson, Jane Street, New York *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +module Sort = struct + type const = + | Void + | Value + | Float64 + | Float32 + | Word + | Bits32 + | Bits64 + + type t = + | Var of var + | Const of const + + and var = t option ref + + module Const = struct + type t = const + + let equal c1 c2 = + match c1, c2 with + | Void, Void + | Value, Value + | Float64, Float64 + | Float32, Float32 + | Word, Word + | Bits32, Bits32 + | Bits64, Bits64 -> + true + | (Void | Value | Float64 | Float32 | Word | Bits32 | Bits64), _ -> false + + let to_string = function + | Value -> "value" + | Void -> "void" + | Float64 -> "float64" + | Float32 -> "float32" + | Word -> "word" + | Bits32 -> "bits32" + | Bits64 -> "bits64" + + let format ppf const = Format.fprintf ppf "%s" (to_string const) + end + + module Var = struct + type t = var + + let name : var -> string = + let next_id = ref 1 in + let named = ref [] in + fun v -> + match List.assq_opt v !named with + | Some name -> name + | None -> + let id = !next_id in + let name = "'_representable_layout_" ^ Int.to_string id in + next_id := id + 1; + named := (v, name) :: !named; + name + end + + (* To record changes to sorts, for use with `Types.{snapshot, backtrack}` *) + type change = var * t option + + let change_log : (change -> unit) ref = ref (fun _ -> ()) + + let set_change_log cl = change_log := cl + + let log_change change = !change_log change + + let undo_change (v, t_op) = v := t_op + + let set : var -> t option -> unit = + fun v t_op -> + log_change (v, !v); + v := t_op + + (* Memoize these values for of_const *) + + let void = Const Void + + let value = Const Value + + let float64 = Const Float64 + + let float32 = Const Float32 + + let word = Const Word + + let bits32 = Const Bits32 + + let bits64 = Const Bits64 + + let some_value = Some (Const Value) + + let of_const = function + | Void -> void + | Value -> value + | Float64 -> float64 + | Float32 -> float32 + | Word -> word + | Bits32 -> bits32 + | Bits64 -> bits64 + + let of_var v = Var v + + let new_var () = Var (ref None) + + (* Post-condition: If the result is a [Var v], then [!v] is [None]. *) + let rec get : t -> t = function + | Const _ as t -> t + | Var r as t -> ( + match !r with + | None -> t + | Some s -> + let result = get s in + if result != s then set r (Some result); + (* path compression *) + result) + + let memoized_value : t option = Some (Const Value) + + let memoized_void : t option = Some (Const Void) + + let memoized_float64 : t option = Some (Const Float64) + + let memoized_float32 : t option = Some (Const Float32) + + let memoized_word : t option = Some (Const Word) + + let memoized_bits32 : t option = Some (Const Bits32) + + let memoized_bits64 : t option = Some (Const Bits64) + + let[@inline] get_memoized = function + | Value -> memoized_value + | Void -> memoized_void + | Float64 -> memoized_float64 + | Float32 -> memoized_float32 + | Word -> memoized_word + | Bits32 -> memoized_bits32 + | Bits64 -> memoized_bits64 + + let rec default_to_value_and_get : t -> const = function + | Const c -> c + | Var r -> ( + match !r with + | None -> + set r memoized_value; + Value + | Some s -> + let result = default_to_value_and_get s in + set r (get_memoized result); + (* path compression *) + result) + + let default_to_value t = ignore (default_to_value_and_get t) + + (***********************) + (* equality *) + + type equate_result = + | Unequal + | Equal_mutated_first + | Equal_mutated_second + | Equal_no_mutation + + let swap_equate_result = function + | Equal_mutated_first -> Equal_mutated_second + | Equal_mutated_second -> Equal_mutated_first + | (Unequal | Equal_no_mutation) as r -> r + + let equal_const_const c1 c2 = + match c1, c2 with + | Void, Void + | Value, Value + | Float64, Float64 + | Float32, Float32 + | Word, Word + | Bits32, Bits32 + | Bits64, Bits64 -> + Equal_no_mutation + | (Void | Value | Float64 | Float32 | Word | Bits32 | Bits64), _ -> Unequal + + let rec equate_var_const v1 c2 = + match !v1 with + | Some s1 -> equate_sort_const s1 c2 + | None -> + set v1 (Some (of_const c2)); + Equal_mutated_first + + and equate_var v1 s2 = + match s2 with + | Const c2 -> equate_var_const v1 c2 + | Var v2 -> equate_var_var v1 v2 + + and equate_var_var v1 v2 = + if v1 == v2 + then Equal_no_mutation + else + match !v1, !v2 with + | Some s1, _ -> swap_equate_result (equate_var v2 s1) + | _, Some s2 -> equate_var v1 s2 + | None, None -> + set v1 (Some (of_var v2)); + Equal_mutated_first + + and equate_sort_const s1 c2 = + match s1 with + | Const c1 -> equal_const_const c1 c2 + | Var v1 -> equate_var_const v1 c2 + + let equate_tracking_mutation s1 s2 = + match s1 with + | Const c1 -> swap_equate_result (equate_sort_const s2 c1) + | Var v1 -> equate_var v1 s2 + + (* Don't expose whether or not mutation happened; we just need that for [Jkind] *) + let equate s1 s2 = + match equate_tracking_mutation s1 s2 with + | Unequal -> false + | Equal_mutated_first | Equal_mutated_second | Equal_no_mutation -> true + + let rec is_void_defaulting = function + | Const Void -> true + | Var v -> ( + match !v with + (* CR layouts v5: this should probably default to void now *) + | None -> + set v some_value; + false + | Some s -> is_void_defaulting s) + | Const (Value | Float64 | Float32 | Word | Bits32 | Bits64) -> false + + (*** pretty printing ***) + + let to_string s = + match get s with Var v -> Var.name v | Const c -> Const.to_string c + + let format ppf t = Format.fprintf ppf "%s" (to_string t) + + (*** debug printing **) + + module Debug_printers = struct + open Format + + let rec t ppf = function + | Var v -> fprintf ppf "Var %a" var v + | Const c -> + fprintf ppf + (match c with + | Void -> "Void" + | Value -> "Value" + | Float64 -> "Float64" + | Float32 -> "Float32" + | Word -> "Word" + | Bits32 -> "Bits32" + | Bits64 -> "Bits64") + + and opt_t ppf = function + | Some s -> fprintf ppf "Some %a" t s + | None -> fprintf ppf "None" + + and var ppf v = fprintf ppf "{ contents = %a }" opt_t !v + end + + let for_function = value + + let for_predef_value = value + + let for_block_element = value + + let for_probe_body = value + + let for_poly_variant = value + + let for_record = value + + let for_object = value + + let for_lazy_body = value + + let for_tuple_element = value + + let for_variant_arg = value + + let for_instance_var = value + + let for_class_arg = value + + let for_method = value + + let for_initializer = value + + let for_module = value + + let for_tuple = value + + let for_array_get_result = value + + let for_array_comprehension_element = value + + let for_list_element = value +end + +module Layout = struct + type 'sort layout = + | Sort of 'sort + | Any + + module Const = struct + type t = Sort.const layout + + module Legacy = struct + type t = + | Any + | Any_non_null + | Value_or_null + | Value + | Void + | Immediate64 + | Immediate + | Float64 + | Float32 + | Word + | Bits32 + | Bits64 + end + end + + type t = Sort.t layout +end + +module Externality = struct + type t = + | External + | External64 + | Internal +end + +module Nullability = struct + type t = + | Non_null + | Maybe_null +end + +module Modes = Mode.Alloc.Const + +module Jkind_desc = struct + type 'type_expr t = + { layout : Layout.t; + modes_upper_bounds : Modes.t; + externality_upper_bound : Externality.t; + nullability_upper_bound : Nullability.t + } +end + +(* A history of conditions placed on a jkind. + + INVARIANT: at most one sort variable appears in this history. + This is a natural consequence of producing this history by comparing + jkinds. +*) +type 'type_expr history = + | Interact of + { reason : Jkind_intf.History.interact_reason; + lhs_jkind : 'type_expr Jkind_desc.t; + lhs_history : 'type_expr history; + rhs_jkind : 'type_expr Jkind_desc.t; + rhs_history : 'type_expr history + } + | Creation of Jkind_intf.History.creation_reason + +type 'type_expr t = + { jkind : 'type_expr Jkind_desc.t; + history : 'type_expr history; + has_warned : bool + } + +module Const = struct + type 'type_expr t = + { layout : Layout.Const.t; + modes_upper_bounds : Modes.t; + externality_upper_bound : Externality.t; + nullability_upper_bound : Nullability.t + } +end + +type 'type_expr const = 'type_expr Const.t + +type 'type_expr annotation = 'type_expr const * Jane_syntax.Jkind.annotation diff --git a/typing/jkind_types.mli b/typing/jkind_types.mli new file mode 100644 index 00000000000..e6e46eed927 --- /dev/null +++ b/typing/jkind_types.mli @@ -0,0 +1,159 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Liam Stevenson, Jane Street, New York *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(** You should use the types defined in [Jkind] (which redefines the + types in this file) rather than using this file directly, unless you + are in [Types] or [Primitive]. *) + +(* This module defines types used in the module Jkind. This is to avoid + a mutual dependencies between jkind.ml(i) and types.ml(i) and bewteen + jkind.ml(i) and primitive.ml(i). Polymorphic versions of types are defined + here, with type parameters that are meant to be filled by types defined in + types.ml(i). jkind.ml(i) redefines the types from this file types.ml + with the type variables instantiated. types.ml also redefines the types + from this file with the type variables instantiated, but only for internal + use. primitive.ml(i) uses the type [Jkind.const], and types.ml(i) depends on + prmitive.ml(i), so [Jkind.const] is defined here and primitive.ml(i) also + uses this module. + + Dependency chain without Jkind_types: + _____________________ + | | | + | | V + Primitive <-- Types <-- Jkind + + Dependency chain with Jkind_types: + ______________________________________ + | | | + V | | + Jkind_types <-- Primitive <-- Types <-- Jkind + + All definitions here are commented in jkind.ml or jkind.mli. *) + +module Sort : sig + (* We need to expose these details for use in [Jkind] *) + + (* Comments in [Jkind_intf.ml] *) + type const = + | Void + | Value + | Float64 + | Float32 + | Word + | Bits32 + | Bits64 + + type t = + | Var of var + | Const of const + + and var = t option ref + + include + Jkind_intf.Sort with type t := t and type var := var and type const := const + + val set_change_log : (change -> unit) -> unit + + type equate_result = + | Unequal + | Equal_mutated_first + | Equal_mutated_second + | Equal_no_mutation + + val equate_tracking_mutation : t -> t -> equate_result + + val get : t -> t + + val to_string : t -> string +end + +module Layout : sig + type 'sort layout = + | Sort of 'sort + | Any + + module Const : sig + type t = Sort.const layout + + module Legacy : sig + type t = + | Any + | Any_non_null + | Value_or_null + | Value + | Void + (* CR layouts v3.0: implement [Immediate(64)_or_null]. *) + | Immediate64 + | Immediate + | Float64 + | Float32 + | Word + | Bits32 + | Bits64 + end + end + + type t = Sort.t layout +end + +module Externality : sig + type t = + | External + | External64 + | Internal +end + +module Nullability : sig + type t = + | Non_null + | Maybe_null +end + +module Modes = Mode.Alloc.Const + +module Jkind_desc : sig + type 'type_expr t = + { layout : Layout.t; + modes_upper_bounds : Modes.t; + externality_upper_bound : Externality.t; + nullability_upper_bound : Nullability.t + } +end + +type 'type_expr history = + | Interact of + { reason : Jkind_intf.History.interact_reason; + lhs_jkind : 'type_expr Jkind_desc.t; + lhs_history : 'type_expr history; + rhs_jkind : 'type_expr Jkind_desc.t; + rhs_history : 'type_expr history + } + | Creation of Jkind_intf.History.creation_reason + +type 'type_expr t = + { jkind : 'type_expr Jkind_desc.t; + history : 'type_expr history; + has_warned : bool + } + +module Const : sig + type 'type_expr t = + { layout : Layout.Const.t; + modes_upper_bounds : Modes.t; + externality_upper_bound : Externality.t; + nullability_upper_bound : Nullability.t + } +end + +type 'type_expr annotation = 'type_expr Const.t * Jane_syntax.Jkind.annotation diff --git a/typing/mode.ml b/typing/mode.ml index 11caee5e52b..4c0b1c13918 100644 --- a/typing/mode.ml +++ b/typing/mode.ml @@ -2,10 +2,9 @@ (* *) (* OCaml *) (* *) -(* Xavier Leroy and Jerome Vouillon, projet Cristal, INRIA Rocquencourt *) +(* Zesen Qian, Jane Street, London *) (* *) -(* Copyright 1996 Institut National de Recherche en Informatique et *) -(* en Automatique. *) +(* Copyright 2024 Jane Street Group LLC *) (* *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Lesser General Public License version 2.1, with the *) @@ -13,1231 +12,2531 @@ (* *) (**************************************************************************) -type 'a var = - { mutable upper : 'a; - mutable lower : 'a; - mutable vlower : 'a var list; - mutable mark : bool; - mvid : int - } - -type changes = - | Cnil : changes - | Cupper : 'a var * 'a * changes -> changes - | Clower : 'a var * 'a * changes -> changes - | Cvlower : 'a var * 'a var list * changes -> changes - -let set_lower ~log v lower = - log := Clower (v, v.lower, !log); - v.lower <- lower - -let set_upper ~log v upper = - log := Cupper (v, v.upper, !log); - v.upper <- upper - -let set_vlower ~log v vlower = - log := Cvlower (v, v.vlower, !log); - v.vlower <- vlower - -let rec undo_changes = function - | Cnil -> () - | Cupper (v, upper, rest) -> - v.upper <- upper; - undo_changes rest - | Clower (v, lower, rest) -> - v.lower <- lower; - undo_changes rest - | Cvlower (v, vlower, rest) -> - v.vlower <- vlower; - undo_changes rest - -let change_log : (changes -> unit) ref = ref (fun _ -> ()) - -let is_not_nil = function - | Cnil -> false - | Cupper _ | Clower _ | Cvlower _ -> true - -let log_changes changes = if is_not_nil changes then !change_log changes - -type ('a, 'b) const_or_var = - | Const of 'a - | Var of 'b - -type ('loc, 'u, 'lin) modes = - { locality : 'loc; - uniqueness : 'u; - linearity : 'lin - } +(* warn on fragile matches *) +[@@@warning "+4"] -module type Lattice = sig - type t +open Solver +open Solver_intf +open Mode_intf - val min : t +type nonrec allowed = allowed - val max : t +type nonrec disallowed = disallowed - val eq : t -> t -> bool +type nonrec equate_step = equate_step - val le : t -> t -> bool +module type BiHeyting = sig + (** Extend the [Lattice] interface with operations of bi-Heyting algebras *) - val join : t -> t -> t + include Lattice - val meet : t -> t -> t + (** [imply c] is the right adjoint of [meet c]; That is, for any [a] and [b], + [meet c a <= b] iff [a <= imply c b] *) + val imply : t -> t -> t - val print : Format.formatter -> t -> unit + (** [subtract _ c] is the left adjoint of [join c]. That is, for any [a] and [b], + [subtract a c <= b] iff [a <= join c b] *) + val subtract : t -> t -> t end -module type Solver = sig - type const +(* Even though our lattices are all bi-heyting algebras, that knowledge is + internal to this module. Externally they are seen as normal lattices. *) +module Lattices = struct + module Opposite (L : BiHeyting) : BiHeyting with type t = L.t = struct + type t = L.t - type t + let min = L.max - type var + let max = L.min - val of_const : const -> t + let legacy = L.legacy - val min_mode : t + let le a b = L.le b a - val max_mode : t + let join = L.meet - val is_const : t -> bool + let meet = L.join + + let print = L.print + + let imply a b = L.subtract b a + + let subtract a b = L.imply b a + end + [@@inline] + + (* A lattice is total order, if for any [a] [b], [a <= b] or [b <= a]. + A total lattice has a bi-heyting structure given as follows. *) + module Total (L : Lattice) : BiHeyting with type t := L.t = struct + include L + + (* Prove the [subtract] below is the left adjoint of [join]. + - If [subtract a c <= b], by the definition of [subtract] below, + that could mean one of two things: + - Took the branch [a <= c], and [min <= b]. In this case, we have [a <= c <= join c b]. + - Took the other branch, and [a <= b]. In this case, we have [a <= b <= join c b]. + + - In the other direction: Given [a <= join c b], compare [c] and [b]: + - if [c <= b], then [a <= join c b = b], and: + - either [a <= c], then [subtract a c = min <= b] + - or the other branch, then [subtract a c = a <= b] + - if [b <= c], then [a <= join c b = c], then [subtract a c = min <= b] + *) + let subtract a c = if le a c then min else a + + (* The proof for [imply] is dual and omitted. *) + let imply c b = if le c b then max else b + end + [@@inline] - val submode : t -> t -> (unit, unit) Result.t + (* Make the type of [Locality] and [Regionality] below distinguishable, + so that we can be sure [Comonadic_with] is applied correctly. *) + module type Areality = sig + include BiHeyting - val submode_exn : t -> t -> unit + val _is_areality : unit + end - val equate : t -> t -> (unit, unit) Result.t + module Locality = struct + type t = + | Global + | Local - val constrain_upper : t -> const + include Total (struct + type nonrec t = t - val newvar : unit -> t + let min = Global - val newvar_below : t -> t * bool + let max = Local - val newvar_above : t -> t * bool + let legacy = Global - val join : t list -> t + let le a b = + match a, b with Global, _ | _, Local -> true | Local, Global -> false - val meet : t list -> t + let join a b = + match a, b with + | Local, _ | _, Local -> Local + | Global, Global -> Global - val constrain_lower : t -> const + let meet a b = + match a, b with + | Global, _ | _, Global -> Global + | Local, Local -> Local - val const_or_var : t -> (const, var) const_or_var + let print ppf = function + | Global -> Format.fprintf ppf "global" + | Local -> Format.fprintf ppf "local" + end) - val check_const : t -> const option + let _is_areality = () + end - val print_var : Format.formatter -> var -> unit + module Regionality = struct + type t = + | Global + | Regional + | Local - val print : Format.formatter -> t -> unit + include Total (struct + type nonrec t = t - val print' : ?verbose:bool -> ?label:string -> Format.formatter -> t -> unit -end + let min = Global + + let max = Local + + let legacy = Global + + let join a b = + match a, b with + | Local, _ | _, Local -> Local + | Regional, _ | _, Regional -> Regional + | Global, Global -> Global + + let meet a b = + match a, b with + | Global, _ | _, Global -> Global + | Regional, _ | _, Regional -> Regional + | Local, Local -> Local + + let le a b = + match a, b with + | Global, _ | _, Local -> true + | _, Global | Local, _ -> false + | Regional, Regional -> true + + let print ppf = function + | Global -> Format.fprintf ppf "global" + | Regional -> Format.fprintf ppf "regional" + | Local -> Format.fprintf ppf "local" + end) + + let _is_areality = () + end + + module Uniqueness = struct + type t = + | Unique + | Shared + + include Total (struct + type nonrec t = t + + let min = Unique + + let max = Shared + + let legacy = Shared + + let le a b = + match a, b with + | Unique, _ | _, Shared -> true + | Shared, Unique -> false + + let join a b = + match a, b with + | Shared, _ | _, Shared -> Shared + | Unique, Unique -> Unique + + let meet a b = + match a, b with + | Unique, _ | _, Unique -> Unique + | Shared, Shared -> Shared + + let print ppf = function + | Shared -> Format.fprintf ppf "shared" + | Unique -> Format.fprintf ppf "unique" + end) + end + + module Uniqueness_op = Opposite (Uniqueness) + + module Linearity = struct + type t = + | Many + | Once + + include Total (struct + type nonrec t = t + + let min = Many + + let max = Once + + let legacy = Many + + let le a b = + match a, b with Many, _ | _, Once -> true | Once, Many -> false + + let join a b = + match a, b with Once, _ | _, Once -> Once | Many, Many -> Many + + let meet a b = + match a, b with Many, _ | _, Many -> Many | Once, Once -> Once + + let print ppf = function + | Once -> Format.fprintf ppf "once" + | Many -> Format.fprintf ppf "many" + end) + end + + module Portability = struct + type t = + | Portable + | Nonportable + + include Total (struct + type nonrec t = t + + let min = Portable + + let max = Nonportable + + let legacy = Nonportable + + let le a b = + match a, b with + | Portable, _ | _, Nonportable -> true + | Nonportable, Portable -> false + + let join a b = + match a, b with + | Nonportable, _ | _, Nonportable -> Nonportable + | Portable, Portable -> Portable + + let meet a b = + match a, b with + | Portable, _ | _, Portable -> Portable + | Nonportable, Nonportable -> Nonportable + + let print ppf = function + | Portable -> Format.fprintf ppf "portable" + | Nonportable -> Format.fprintf ppf "nonportable" + end) + end + + module Contention = struct + type t = + | Contended + | Uncontended + + include Total (struct + type nonrec t = t + + let min = Uncontended + + let max = Contended + + let legacy = Uncontended + + let le a b = + match a, b with + | Uncontended, _ | _, Contended -> true + | Contended, Uncontended -> false + + let join a b = + match a, b with + | Contended, _ | _, Contended -> Contended + | Uncontended, Uncontended -> Uncontended + + let meet a b = + match a, b with + | Uncontended, _ | _, Uncontended -> Uncontended + | Contended, Contended -> Contended + + let print ppf = function + | Contended -> Format.fprintf ppf "contended" + | Uncontended -> Format.fprintf ppf "uncontended" + end) + end + + module Contention_op = Opposite (Contention) + + type monadic = Uniqueness.t * Contention.t + + module Monadic = struct + type t = monadic -module Solver (L : Lattice) : Solver with type const := L.t = struct - type nonrec var = L.t var - - type t = - | Amode of L.t - | Amodevar of var - - let next_id = ref (-1) - - let fresh () = - incr next_id; - { upper = L.max; lower = L.min; vlower = []; mvid = !next_id; mark = false } - - exception NotSubmode - - let of_const c = Amode c - - let min_mode = Amode L.min - - let max_mode = Amode L.max - - let is_const = function Amode _ -> true | Amodevar _ -> false - - let submode_cv ~log m v = - if L.le m v.lower - then () - else if not (L.le m v.upper) - then raise NotSubmode - else - let m = L.join v.lower m in - set_lower ~log v m; - if L.eq m v.upper then set_vlower ~log v [] - - let rec submode_vc ~log v m = - if L.le v.upper m - then () - else if not (L.le v.lower m) - then raise NotSubmode - else - let m = L.meet v.upper m in - set_upper ~log v m; - v.vlower - |> List.iter (fun a -> - (* a <= v <= m *) - submode_vc ~log a m; - set_lower ~log v (L.join v.lower a.lower)); - if L.eq v.lower m then set_vlower ~log v [] - - let submode_vv ~log a b = - (* Printf.printf " %a <= %a\n" pp_v a pp_v b; *) - if L.le a.upper b.lower - then () - else if a == b || List.memq a b.vlower - then () - else ( - submode_vc ~log a b.upper; - set_vlower ~log b (a :: b.vlower); - submode_cv ~log a.lower b) - - let rec all_equal v = function - | [] -> true - | v' :: rest -> if v == v' then all_equal v rest else false - - let join_vc v m = - if L.le v.upper m - then Amode m - else if L.le m v.lower - then Amodevar v - else - let log = ref Cnil in - let v' = fresh () in - submode_cv ~log m v'; - submode_vv ~log v v'; - log_changes !log; - Amodevar v' - - let join_vsc vs m = - match vs with - | [] -> Amode m - | v :: rest -> - if all_equal v rest - then join_vc v m - else - let log = ref Cnil in - let v = fresh () in - submode_cv ~log m v; - List.iter (fun v' -> submode_vv ~log v' v) vs; - log_changes !log; - Amodevar v - - let meet_vc v m = - if L.le m v.lower - then Amode m - else if L.le v.upper m - then Amodevar v - else - let log = ref Cnil in - let v' = fresh () in - submode_vc ~log v' m; - submode_vv ~log v' v; - log_changes !log; - Amodevar v' - - let meet_vsc vs m = - match vs with - | [] -> Amode m - | v :: rest -> - if all_equal v rest - then meet_vc v m - else - let log = ref Cnil in - let v = fresh () in - submode_vc ~log v m; - List.iter (fun v' -> submode_vv ~log v v') vs; - log_changes !log; - Amodevar v - - let submode a b = - let log = ref Cnil in - match + let min = Uniqueness.min, Contention.min + + let max = Uniqueness.max, Contention.max + + let legacy = Uniqueness.legacy, Contention.legacy + + let le (a0, a1) (b0, b1) = Uniqueness.le a0 b0 && Contention.le a1 b1 + + let join (a0, a1) (b0, b1) = Uniqueness.join a0 b0, Contention.join a1 b1 + + let meet (a0, a1) (b0, b1) = Uniqueness.meet a0 b0, Contention.meet a1 b1 + + let imply (a0, a1) (b0, b1) = Uniqueness.imply a0 b0, Contention.imply a1 b1 + + let subtract (a0, a1) (b0, b1) = + Uniqueness.subtract a0 b0, Contention.subtract a1 b1 + + let print ppf (a0, a1) = + Format.fprintf ppf "%a,%a" Uniqueness.print a0 Contention.print a1 + end + + type 'areality comonadic_with = 'areality * Linearity.t * Portability.t + + module Comonadic_with (Areality : Areality) = struct + type t = Areality.t comonadic_with + + let min = Areality.min, Linearity.min, Portability.min + + let max = Areality.max, Linearity.max, Portability.max + + let legacy = Areality.legacy, Linearity.legacy, Portability.legacy + + let le (a0, a1, a2) (b0, b1, b2) = + Areality.le a0 b0 && Linearity.le a1 b1 && Portability.le a2 b2 + + let join (a0, a1, a2) (b0, b1, b2) = + Areality.join a0 b0, Linearity.join a1 b1, Portability.join a2 b2 + + let meet (a0, a1, a2) (b0, b1, b2) = + Areality.meet a0 b0, Linearity.meet a1 b1, Portability.meet a2 b2 + + let imply (a0, a1, a2) (b0, b1, b2) = + Areality.imply a0 b0, Linearity.imply a1 b1, Portability.imply a2 b2 + + let subtract (a0, a1, a2) (b0, b1, b2) = + ( Areality.subtract a0 b0, + Linearity.subtract a1 b1, + Portability.subtract a2 b2 ) + + let print ppf (a0, a1, a2) = + Format.fprintf ppf "%a,%a,%a" Areality.print a0 Linearity.print a1 + Portability.print a2 + end + [@@inline] + + module Monadic_op = Opposite (Monadic) + module Comonadic_with_locality = Comonadic_with (Locality) + module Comonadic_with_regionality = Comonadic_with (Regionality) + + (* Axes are categorized into monadic and comonadic fragments, and in general: + - Morphisms between the same fragment are always monotone. + - Morphisms between different fragments are always antitone. + To play well with the solver, here we flip the whole monadic fragment, so all + morphisms are monotone. [Solver_polarized] will flip it back. *) + type 'a obj = + | Locality : Locality.t obj + | Regionality : Regionality.t obj + | Uniqueness_op : Uniqueness_op.t obj + | Linearity : Linearity.t obj + | Portability : Portability.t obj + | Contention_op : Contention_op.t obj + | Monadic_op : Monadic_op.t obj + | Comonadic_with_regionality : Comonadic_with_regionality.t obj + | Comonadic_with_locality : Comonadic_with_locality.t obj + + let print_obj : type a. _ -> a obj -> unit = + fun ppf -> function + | Locality -> Format.fprintf ppf "Locality" + | Regionality -> Format.fprintf ppf "Regionality" + | Uniqueness_op -> Format.fprintf ppf "Uniqueness_op" + | Linearity -> Format.fprintf ppf "Linearity" + | Portability -> Format.fprintf ppf "Portability" + | Contention_op -> Format.fprintf ppf "Contention_op" + | Monadic_op -> Format.fprintf ppf "Monadic_op" + | Comonadic_with_locality -> Format.fprintf ppf "Comonadic_with_locality" + | Comonadic_with_regionality -> + Format.fprintf ppf "Comonadic_with_regionality" + + let min : type a. a obj -> a = function + | Locality -> Locality.min + | Regionality -> Regionality.min + | Uniqueness_op -> Uniqueness_op.min + | Contention_op -> Contention_op.min + | Linearity -> Linearity.min + | Portability -> Portability.min + | Monadic_op -> Monadic_op.min + | Comonadic_with_locality -> Comonadic_with_locality.min + | Comonadic_with_regionality -> Comonadic_with_regionality.min + + let max : type a. a obj -> a = function + | Locality -> Locality.max + | Regionality -> Regionality.max + | Uniqueness_op -> Uniqueness_op.max + | Contention_op -> Contention_op.max + | Linearity -> Linearity.max + | Portability -> Portability.max + | Monadic_op -> Monadic_op.max + | Comonadic_with_locality -> Comonadic_with_locality.max + | Comonadic_with_regionality -> Comonadic_with_regionality.max + + let le : type a. a obj -> a -> a -> bool = + fun obj a b -> + match obj with + | Locality -> Locality.le a b + | Regionality -> Regionality.le a b + | Uniqueness_op -> Uniqueness_op.le a b + | Contention_op -> Contention_op.le a b + | Linearity -> Linearity.le a b + | Portability -> Portability.le a b + | Monadic_op -> Monadic_op.le a b + | Comonadic_with_locality -> Comonadic_with_locality.le a b + | Comonadic_with_regionality -> Comonadic_with_regionality.le a b + + let join : type a. a obj -> a -> a -> a = + fun obj a b -> + match obj with + | Locality -> Locality.join a b + | Regionality -> Regionality.join a b + | Uniqueness_op -> Uniqueness_op.join a b + | Contention_op -> Contention_op.join a b + | Linearity -> Linearity.join a b + | Portability -> Portability.join a b + | Monadic_op -> Monadic_op.join a b + | Comonadic_with_locality -> Comonadic_with_locality.join a b + | Comonadic_with_regionality -> Comonadic_with_regionality.join a b + + let meet : type a. a obj -> a -> a -> a = + fun obj a b -> + match obj with + | Locality -> Locality.meet a b + | Regionality -> Regionality.meet a b + | Uniqueness_op -> Uniqueness_op.meet a b + | Contention_op -> Contention_op.meet a b + | Linearity -> Linearity.meet a b + | Portability -> Portability.meet a b + | Monadic_op -> Monadic_op.meet a b + | Comonadic_with_locality -> Comonadic_with_locality.meet a b + | Comonadic_with_regionality -> Comonadic_with_regionality.meet a b + + let imply : type a. a obj -> a -> a -> a = + fun obj a b -> + match obj with + | Locality -> Locality.imply a b + | Regionality -> Regionality.imply a b + | Uniqueness_op -> Uniqueness_op.imply a b + | Contention_op -> Contention_op.imply a b + | Linearity -> Linearity.imply a b + | Portability -> Portability.imply a b + | Comonadic_with_locality -> Comonadic_with_locality.imply a b + | Comonadic_with_regionality -> Comonadic_with_regionality.imply a b + | Monadic_op -> Monadic_op.imply a b + + let subtract : type a. a obj -> a -> a -> a = + fun obj a b -> + match obj with + | Locality -> Locality.subtract a b + | Regionality -> Regionality.subtract a b + | Uniqueness_op -> Uniqueness_op.subtract a b + | Contention_op -> Contention_op.subtract a b + | Linearity -> Linearity.subtract a b + | Portability -> Portability.subtract a b + | Comonadic_with_locality -> Comonadic_with_locality.subtract a b + | Comonadic_with_regionality -> Comonadic_with_regionality.subtract a b + | Monadic_op -> Monadic_op.subtract a b + + (* not hotpath, Ok to curry *) + let print : type a. a obj -> _ -> a -> unit = function + | Locality -> Locality.print + | Regionality -> Regionality.print + | Uniqueness_op -> Uniqueness_op.print + | Contention_op -> Contention_op.print + | Linearity -> Linearity.print + | Portability -> Portability.print + | Monadic_op -> Monadic_op.print + | Comonadic_with_locality -> Comonadic_with_locality.print + | Comonadic_with_regionality -> Comonadic_with_regionality.print + + module Equal_obj = Magic_equal (struct + type ('a, _, 'd) t = 'a obj constraint 'd = 'l * 'r + + let equal : type a b. a obj -> b obj -> (a, b) Misc.eq option = + fun a b -> match a, b with - | Amode a, Amode b -> if not (L.le a b) then raise NotSubmode - | Amodevar v, Amode c -> submode_vc ~log v c - | Amode c, Amodevar v -> submode_cv ~log c v - | Amodevar a, Amodevar b -> submode_vv ~log a b - with - | () -> - log_changes !log; - Ok () - | exception NotSubmode -> - undo_changes !log; - Error () - - let submode_exn t1 t2 = - match submode t1 t2 with - | Ok () -> () - | Error () -> invalid_arg "submode_exn" - - let equate a b = - match submode a b, submode b a with - | Ok (), Ok () -> Ok () - | Error (), _ | _, Error () -> Error () - - let constrain_upper = function - | Amode m -> m - | Amodevar v -> - submode_exn (Amode v.upper) (Amodevar v); - v.upper - - let newvar () = Amodevar (fresh ()) - - let newvar_below = function - | Amode c when L.eq c L.min -> min_mode, false - | m -> - let v = newvar () in - submode_exn v m; - v, true - - let newvar_above = function - | Amode c when L.eq c L.max -> max_mode, false - | m -> - let v = newvar () in - submode_exn m v; - v, true - - let join ms = - let rec aux vars const = function - | [] -> join_vsc vars const - | Amode c :: _ when L.eq c L.max -> max_mode - | Amode c :: ms -> aux vars (L.join c const) ms - | Amodevar v :: ms -> aux (v :: vars) const ms - in - aux [] L.min ms - - let meet ms = - let rec aux vars const = function - | [] -> meet_vsc vars const - | Amode c :: _ when L.eq c L.min -> min_mode - | Amode c :: ms -> aux vars (L.join c const) ms - | Amodevar v :: ms -> aux (v :: vars) const ms - in - aux [] L.max ms + | Locality, Locality -> Some Refl + | Regionality, Regionality -> Some Refl + | Uniqueness_op, Uniqueness_op -> Some Refl + | Contention_op, Contention_op -> Some Refl + | Linearity, Linearity -> Some Refl + | Portability, Portability -> Some Refl + | Monadic_op, Monadic_op -> Some Refl + | Comonadic_with_locality, Comonadic_with_locality -> Some Refl + | Comonadic_with_regionality, Comonadic_with_regionality -> Some Refl + | ( ( Locality | Regionality | Uniqueness_op | Contention_op | Linearity + | Portability | Monadic_op | Comonadic_with_locality + | Comonadic_with_regionality ), + _ ) -> + None + end) + + let eq_obj = Equal_obj.equal +end - exception Became_constant +module Lattices_mono = struct + include Lattices + + module Axis = struct + type ('t, 'r) t = + | Areality : ('a comonadic_with, 'a) t + | Linearity : ('areality comonadic_with, Linearity.t) t + | Portability : ('areality comonadic_with, Portability.t) t + | Uniqueness : (Monadic_op.t, Uniqueness_op.t) t + | Contention : (Monadic_op.t, Contention_op.t) t + + let print : type p r. _ -> (p, r) t -> unit = + fun ppf -> function + | Areality -> Format.fprintf ppf "areality" + | Linearity -> Format.fprintf ppf "linearity" + | Portability -> Format.fprintf ppf "portability" + | Uniqueness -> Format.fprintf ppf "uniqueness" + | Contention -> Format.fprintf ppf "contention" + + let eq : type p r0 r1. (p, r0) t -> (p, r1) t -> (r0, r1) Misc.eq option = + fun ax0 ax1 -> + match ax0, ax1 with + | Areality, Areality -> Some Refl + | Linearity, Linearity -> Some Refl + | Portability, Portability -> Some Refl + | Uniqueness, Uniqueness -> Some Refl + | Contention, Contention -> Some Refl + | (Areality | Linearity | Uniqueness | Portability | Contention), _ -> + None + + let proj : type p r. (p, r) t -> p -> r = + fun ax t -> + match ax, t with + | Areality, (a, _, _) -> a + | Linearity, (_, lin, _) -> lin + | Portability, (_, _, s) -> s + | Uniqueness, (uni, _) -> uni + | Contention, (_, con) -> con + + let update : type p r. (p, r) t -> r -> p -> p = + fun ax r t -> + match ax, t with + | Areality, (_, lin, portable) -> r, lin, portable + | Linearity, (area, _, portable) -> area, r, portable + | Portability, (area, lin, _) -> area, lin, r + | Uniqueness, (_, con) -> r, con + | Contention, (uni, _) -> uni, r + end - let compress_vlower v = - let nmarked = ref 0 in - let mark v' = - assert (not v'.mark); - v'.mark <- true; - incr nmarked - in - let unmark v' = - assert v'.mark; - v'.mark <- false; - decr nmarked - in - let new_lower = ref v.lower in - let new_vlower = ref v.vlower in - (* Ensure that each transitive lower bound of v - is a direct lower bound of v *) - let rec trans v' = - if L.le v'.upper !new_lower - then () - else if v'.mark - then () - else ( - mark v'; - new_vlower := v' :: !new_vlower; - trans_low v') - and trans_low v' = - assert (v != v'); - if not (L.le v'.lower v.upper) - then Misc.fatal_error "compress_vlower: invalid bounds"; - if not (L.le v'.lower !new_lower) - then ( - new_lower := L.join !new_lower v'.lower; - if !new_lower = v.upper - then - (* v is now a constant, no need to keep computing bounds *) - raise Became_constant); - List.iter trans v'.vlower + type ('a, 'b, 'd) morph = + | Id : ('a, 'a, 'd) morph (** identity morphism *) + | Meet_with : 'a -> ('a, 'a, 'l * 'r) morph + (** Meet the input with the parameter *) + | Imply : 'a -> ('a, 'a, disallowed * 'd) morph + (** The right adjoint of [Meet_with] *) + | Join_with : 'a -> ('a, 'a, 'l * 'r) morph + (** Join the input with the parameter *) + | Subtract : 'a -> ('a, 'a, 'd * disallowed) morph + (** The left adjoint of [Join_with] *) + | Proj : 't obj * ('t, 'r_) Axis.t -> ('t, 'r_, 'l * 'r) morph + (** Project from a product to an axis *) + | Max_with : ('t, 'r_) Axis.t -> ('r_, 't, disallowed * 'r) morph + (** Combine an axis with maxima along other axes *) + | Min_with : ('t, 'r_) Axis.t -> ('r_, 't, 'l * disallowed) morph + (** Combine an axis with minima along other axes *) + | Map_comonadic : + ('a0, 'a1, 'd) morph + -> ('a0 comonadic_with, 'a1 comonadic_with, 'd) morph + (** Lift an morphism on areality to a morphism on the comonadic fragment *) + | Monadic_to_comonadic_min + : (Monadic_op.t, 'a comonadic_with, 'l * disallowed) morph + (** Dualize the monadic fragment to the comonadic fragment. The areality is set to min. *) + | Comonadic_to_monadic : + 'a comonadic_with obj + -> ('a comonadic_with, Monadic_op.t, 'l * 'r) morph + (** Dualize the comonadic fragment to the monadic fragment. The areality axis is ignored. *) + | Monadic_to_comonadic_max + : (Monadic_op.t, 'a comonadic_with, disallowed * 'r) morph + (** Dualize the monadic fragment to the comonadic fragment. The areality is set to max. *) + (* Following is a chain of adjunction (complete and cannot extend in + either direction) *) + | Local_to_regional : (Locality.t, Regionality.t, 'l * disallowed) morph + (** Maps local to regional, global to global *) + | Regional_to_local : (Regionality.t, Locality.t, 'l * 'r) morph + (** Maps regional to local, identity otherwise *) + | Locality_as_regionality : (Locality.t, Regionality.t, 'l * 'r) morph + (** Inject locality into regionality *) + | Regional_to_global : (Regionality.t, Locality.t, 'l * 'r) morph + (** Maps regional to global, identity otherwise *) + | Global_to_regional : (Locality.t, Regionality.t, disallowed * 'r) morph + (** Maps global to regional, local to local *) + | Compose : ('b, 'c, 'd) morph * ('a, 'b, 'd) morph -> ('a, 'c, 'd) morph + (** Compoistion of two morphisms *) + + include Magic_allow_disallow (struct + type ('a, 'b, 'd) sided = ('a, 'b, 'd) morph constraint 'd = 'l * 'r + + let rec allow_left : + type a b l r. (a, b, allowed * r) morph -> (a, b, l * r) morph = + function + | Id -> Id + | Proj (src, ax) -> Proj (src, ax) + | Min_with ax -> Min_with ax + | Meet_with c -> Meet_with c + | Join_with c -> Join_with c + | Subtract c -> Subtract c + | Compose (f, g) -> + let f = allow_left f in + let g = allow_left g in + Compose (f, g) + | Monadic_to_comonadic_min -> Monadic_to_comonadic_min + | Comonadic_to_monadic a -> Comonadic_to_monadic a + | Local_to_regional -> Local_to_regional + | Locality_as_regionality -> Locality_as_regionality + | Regional_to_local -> Regional_to_local + | Regional_to_global -> Regional_to_global + | Map_comonadic f -> + let f = allow_left f in + Map_comonadic f + + let rec allow_right : + type a b l r. (a, b, l * allowed) morph -> (a, b, l * r) morph = + function + | Id -> Id + | Proj (src, ax) -> Proj (src, ax) + | Max_with ax -> Max_with ax + | Join_with c -> Join_with c + | Meet_with c -> Meet_with c + | Imply c -> Imply c + | Compose (f, g) -> + let f = allow_right f in + let g = allow_right g in + Compose (f, g) + | Comonadic_to_monadic a -> Comonadic_to_monadic a + | Monadic_to_comonadic_max -> Monadic_to_comonadic_max + | Global_to_regional -> Global_to_regional + | Locality_as_regionality -> Locality_as_regionality + | Regional_to_local -> Regional_to_local + | Regional_to_global -> Regional_to_global + | Map_comonadic f -> + let f = allow_right f in + Map_comonadic f + + let rec disallow_left : + type a b l r. (a, b, l * r) morph -> (a, b, disallowed * r) morph = + function + | Id -> Id + | Proj (src, ax) -> Proj (src, ax) + | Min_with ax -> Min_with ax + | Max_with ax -> Max_with ax + | Join_with c -> Join_with c + | Subtract c -> Subtract c + | Meet_with c -> Meet_with c + | Imply c -> Imply c + | Compose (f, g) -> + let f = disallow_left f in + let g = disallow_left g in + Compose (f, g) + | Monadic_to_comonadic_min -> Monadic_to_comonadic_min + | Comonadic_to_monadic a -> Comonadic_to_monadic a + | Monadic_to_comonadic_max -> Monadic_to_comonadic_max + | Local_to_regional -> Local_to_regional + | Global_to_regional -> Global_to_regional + | Locality_as_regionality -> Locality_as_regionality + | Regional_to_local -> Regional_to_local + | Regional_to_global -> Regional_to_global + | Map_comonadic f -> + let f = disallow_left f in + Map_comonadic f + + let rec disallow_right : + type a b l r. (a, b, l * r) morph -> (a, b, l * disallowed) morph = + function + | Id -> Id + | Proj (src, ax) -> Proj (src, ax) + | Min_with ax -> Min_with ax + | Max_with ax -> Max_with ax + | Join_with c -> Join_with c + | Subtract c -> Subtract c + | Meet_with c -> Meet_with c + | Imply c -> Imply c + | Compose (f, g) -> + let f = disallow_right f in + let g = disallow_right g in + Compose (f, g) + | Monadic_to_comonadic_min -> Monadic_to_comonadic_min + | Comonadic_to_monadic a -> Comonadic_to_monadic a + | Monadic_to_comonadic_max -> Monadic_to_comonadic_max + | Local_to_regional -> Local_to_regional + | Global_to_regional -> Global_to_regional + | Locality_as_regionality -> Locality_as_regionality + | Regional_to_local -> Regional_to_local + | Regional_to_global -> Regional_to_global + | Map_comonadic f -> + let f = disallow_right f in + Map_comonadic f + end) + + let set_areality : type a0 a1. a1 -> a0 comonadic_with -> a1 comonadic_with = + fun r (_, lin, portable) -> r, lin, portable + + let proj_obj : type t r. (t, r) Axis.t -> t obj -> r obj = + fun ax obj -> + match ax, obj with + | Areality, Comonadic_with_locality -> Locality + | Areality, Comonadic_with_regionality -> Regionality + | Linearity, Comonadic_with_locality -> Linearity + | Linearity, Comonadic_with_regionality -> Linearity + | Portability, Comonadic_with_locality -> Portability + | Portability, Comonadic_with_regionality -> Portability + | Uniqueness, Monadic_op -> Uniqueness_op + | Contention, Monadic_op -> Contention_op + + let comonadic_with_obj : type a. a obj -> a comonadic_with obj = + fun a0 -> + match a0 with + | Locality -> Comonadic_with_locality + | Regionality -> Comonadic_with_regionality + | Uniqueness_op | Linearity | Monadic_op | Comonadic_with_regionality + | Comonadic_with_locality | Contention_op | Portability -> + assert false + + let rec src : type a b d. b obj -> (a, b, d) morph -> a obj = + fun dst f -> + match f with + | Id -> dst + | Proj (src, _) -> src + | Max_with ax -> proj_obj ax dst + | Min_with ax -> proj_obj ax dst + | Join_with _ -> dst + | Meet_with _ -> dst + | Imply _ -> dst + | Subtract _ -> dst + | Compose (f, g) -> + let mid = src dst f in + src mid g + | Monadic_to_comonadic_min -> Monadic_op + | Comonadic_to_monadic src -> src + | Monadic_to_comonadic_max -> Monadic_op + | Local_to_regional -> Locality + | Locality_as_regionality -> Locality + | Global_to_regional -> Locality + | Regional_to_local -> Regionality + | Regional_to_global -> Regionality + | Map_comonadic f -> + let dst0 = proj_obj Areality dst in + let src0 = src dst0 f in + comonadic_with_obj src0 + + module Equal_morph = Magic_equal (struct + type ('a, 'b, 'd) t = ('a, 'b, 'd) morph constraint 'd = 'l * 'r + + let rec equal : + type a0 l0 r0 a1 b l1 r1. + (a0, b, l0 * r0) morph -> + (a1, b, l1 * r1) morph -> + (a0, a1) Misc.eq option = + fun f0 f1 -> + match f0, f1 with + | Id, Id -> Some Refl + | Proj (src0, ax0), Proj (src1, ax1) -> ( + match eq_obj src0 src1 with + | Some Refl -> ( + match Axis.eq ax0 ax1 with None -> None | Some Refl -> Some Refl) + | None -> None) + | Max_with ax0, Max_with ax1 -> ( + match Axis.eq ax0 ax1 with Some Refl -> Some Refl | None -> None) + | Min_with ax0, Min_with ax1 -> ( + match Axis.eq ax0 ax1 with Some Refl -> Some Refl | None -> None) + | Meet_with c0, Meet_with c1 -> + (* This polymorphic equality is correct only if runtime representation + uniquely identifies a constant, which could be false. For example, + the lattice of rational number would be represented as the tuple of + numerator and denominator, and (9,4) and (18, 8) means the same + thing. However, even in that case, it's not unsound, as [eq_morph] is + not requird to be complete: i.e., it's allowed to return [None] when + it should return [Some]. It would cause duplication but not error. *) + if c0 = c1 then Some Refl else None + | Join_with c0, Join_with c1 -> if c0 = c1 then Some Refl else None + | Imply c0, Imply c1 -> if c0 = c1 then Some Refl else None + | Subtract c0, Subtract c1 -> if c0 = c1 then Some Refl else None + | Monadic_to_comonadic_min, Monadic_to_comonadic_min -> Some Refl + | Comonadic_to_monadic a0, Comonadic_to_monadic a1 -> ( + match eq_obj a0 a1 with None -> None | Some Refl -> Some Refl) + | Monadic_to_comonadic_max, Monadic_to_comonadic_max -> Some Refl + | Local_to_regional, Local_to_regional -> Some Refl + | Locality_as_regionality, Locality_as_regionality -> Some Refl + | Global_to_regional, Global_to_regional -> Some Refl + | Regional_to_local, Regional_to_local -> Some Refl + | Regional_to_global, Regional_to_global -> Some Refl + | Compose (f0, g0), Compose (f1, g1) -> ( + match equal f0 f1 with + | None -> None + | Some Refl -> ( + match equal g0 g1 with None -> None | Some Refl -> Some Refl)) + | Map_comonadic f, Map_comonadic g -> ( + match equal f g with Some Refl -> Some Refl | None -> None) + | ( ( Id | Proj _ | Max_with _ | Min_with _ | Meet_with _ | Join_with _ + | Monadic_to_comonadic_min | Comonadic_to_monadic _ + | Monadic_to_comonadic_max | Local_to_regional + | Locality_as_regionality | Global_to_regional | Regional_to_local + | Regional_to_global | Compose _ | Map_comonadic _ | Imply _ + | Subtract _ ), + _ ) -> + None + end) + + let eq_morph = Equal_morph.equal + + let rec print_morph : + type a b d. b obj -> Format.formatter -> (a, b, d) morph -> unit = + fun dst ppf -> function + | Id -> Format.fprintf ppf "id" + | Join_with c -> Format.fprintf ppf "join(%a)" (print dst) c + | Meet_with c -> Format.fprintf ppf "meet(%a)" (print dst) c + | Imply c -> Format.fprintf ppf "imply(%a)" (print dst) c + | Subtract c -> Format.fprintf ppf "subtract_%a" (print dst) c + | Proj (_, ax) -> Format.fprintf ppf "proj_%a" Axis.print ax + | Max_with ax -> Format.fprintf ppf "max_with_%a" Axis.print ax + | Min_with ax -> Format.fprintf ppf "min_with_%a" Axis.print ax + | Map_comonadic f -> + let dst0 = proj_obj Areality dst in + Format.fprintf ppf "map_comonadic(%a)" (print_morph dst0) f + | Monadic_to_comonadic_min -> Format.fprintf ppf "monadic_to_comonadic_min" + | Comonadic_to_monadic _ -> Format.fprintf ppf "comonadic_to_monadic" + | Monadic_to_comonadic_max -> Format.fprintf ppf "monadic_to_comonadic_max" + | Local_to_regional -> Format.fprintf ppf "local_to_regional" + | Regional_to_local -> Format.fprintf ppf "regional_to_local" + | Locality_as_regionality -> Format.fprintf ppf "locality_as_regionality" + | Regional_to_global -> Format.fprintf ppf "regional_to_global" + | Global_to_regional -> Format.fprintf ppf "global_to_regional" + | Compose (f0, f1) -> + let mid = src dst f0 in + Format.fprintf ppf "%a ∘ %a" (print_morph dst) f0 (print_morph mid) f1 + + let id = Id + + let linear_to_unique = function + | Linearity.Many -> Uniqueness.Shared + | Linearity.Once -> Uniqueness.Unique + + let unique_to_linear = function + | Uniqueness.Unique -> Linearity.Once + | Uniqueness.Shared -> Linearity.Many + + let portable_to_contended = function + | Portability.Portable -> Contention.Contended + | Portability.Nonportable -> Contention.Uncontended + + let contended_to_portable = function + | Contention.Contended -> Portability.Portable + | Contention.Uncontended -> Portability.Nonportable + + let local_to_regional = function + | Locality.Global -> Regionality.Global + | Locality.Local -> Regionality.Regional + + let regional_to_local = function + | Regionality.Local -> Locality.Local + | Regionality.Regional -> Locality.Local + | Regionality.Global -> Locality.Global + + let locality_as_regionality = function + | Locality.Local -> Regionality.Local + | Locality.Global -> Regionality.Global + + let regional_to_global = function + | Regionality.Local -> Locality.Local + | Regionality.Regional -> Locality.Global + | Regionality.Global -> Locality.Global + + let global_to_regional = function + | Locality.Local -> Regionality.Local + | Locality.Global -> Regionality.Regional + + let min_with dst ax a = Axis.update ax a (min dst) + + let max_with dst ax a = Axis.update ax a (max dst) + + let monadic_to_comonadic_min : + type a. a comonadic_with obj -> Monadic_op.t -> a comonadic_with = + fun obj (uniqueness, contention) -> + match obj with + | Comonadic_with_locality -> + ( Locality.min, + unique_to_linear uniqueness, + contended_to_portable contention ) + | Comonadic_with_regionality -> + ( Regionality.min, + unique_to_linear uniqueness, + contended_to_portable contention ) + + let comonadic_to_monadic : + type a. a comonadic_with obj -> a comonadic_with -> Monadic_op.t = + fun obj (_, linearity, portability) -> + match obj with + | Comonadic_with_locality -> + linear_to_unique linearity, portable_to_contended portability + | Comonadic_with_regionality -> + linear_to_unique linearity, portable_to_contended portability + + let monadic_to_comonadic_max : + type a. a comonadic_with obj -> Monadic_op.t -> a comonadic_with = + fun obj (uniqueness, contention) -> + match obj with + | Comonadic_with_locality -> + ( Locality.max, + unique_to_linear uniqueness, + contended_to_portable contention ) + | Comonadic_with_regionality -> + ( Regionality.max, + unique_to_linear uniqueness, + contended_to_portable contention ) + + let rec apply : type a b d. b obj -> (a, b, d) morph -> a -> b = + fun dst f a -> + match f with + | Compose (f, g) -> + let mid = src dst f in + let g' = apply mid g in + let f' = apply dst f in + f' (g' a) + | Id -> a + | Proj (_, ax) -> Axis.proj ax a + | Max_with ax -> max_with dst ax a + | Min_with ax -> min_with dst ax a + | Meet_with c -> meet dst c a + | Join_with c -> join dst c a + | Imply c -> imply dst c a + | Subtract c -> subtract dst a c + | Monadic_to_comonadic_min -> monadic_to_comonadic_min dst a + | Comonadic_to_monadic src -> comonadic_to_monadic src a + | Monadic_to_comonadic_max -> monadic_to_comonadic_max dst a + | Local_to_regional -> local_to_regional a + | Regional_to_local -> regional_to_local a + | Locality_as_regionality -> locality_as_regionality a + | Regional_to_global -> regional_to_global a + | Global_to_regional -> global_to_regional a + | Map_comonadic f -> + let dst0 = proj_obj Areality dst in + let a0 = Axis.proj Areality a in + set_areality (apply dst0 f a0) a + + (** Compose m0 after m1. Returns [Some f] if the composition can be + represented by [f] instead of [Compose m0 m1]. [None] otherwise. *) + let rec maybe_compose : + type a b c d. + c obj -> (b, c, d) morph -> (a, b, d) morph -> (a, c, d) morph option = + fun dst m0 m1 -> + let is_max c = le dst (max dst) c in + let is_min c = le dst c (min dst) in + let is_mid_max c = + let mid = src dst m0 in + le mid (max mid) c in - mark v; - List.iter mark v.vlower; - let became_constant = - match List.iter trans_low v.vlower with - | () -> false - | exception Became_constant -> true + let is_mid_min c = + let mid = src dst m0 in + le mid c (min mid) in - List.iter unmark !new_vlower; - unmark v; - assert (!nmarked = 0); - if became_constant then new_vlower := []; - if !new_lower != v.lower || !new_vlower != v.vlower - then ( - let log = ref Cnil in - set_lower ~log v !new_lower; - set_vlower ~log v !new_vlower; - log_changes !log) - - let constrain_lower = function - | Amode m -> m - | Amodevar v -> - compress_vlower v; - submode_exn (Amodevar v) (Amode v.lower); - v.lower - - let const_or_var = function - | Amode m -> Const m - | Amodevar v -> - compress_vlower v; - if L.eq v.lower v.upper then Const v.lower else Var v - - let check_const a = - match const_or_var a with Const m -> Some m | Var _ -> None - - let print_var_id ppf v = Format.fprintf ppf "?%i" v.mvid - - let print_var ppf v = - if v.vlower = [] - then print_var_id ppf v - else - Format.fprintf ppf "%a[> %a]" print_var_id v - (Format.pp_print_list print_var_id) - v.vlower - - let print' ?(verbose = true) ?label ppf a = - match const_or_var a with - | Const m -> L.print ppf m - | Var v -> - (match label with None -> () | Some s -> Format.fprintf ppf "%s:" s); - if verbose then print_var ppf v else Format.fprintf ppf "?" - - let print ppf a = print' ~verbose:true ?label:None ppf a + match m0, m1 with + | Id, m -> Some m + | m, Id -> Some m + | Meet_with c0, Meet_with c1 -> Some (Meet_with (meet dst c0 c1)) + | Join_with c0, Join_with c1 -> Some (Join_with (join dst c0 c1)) + | Imply c0, Imply c1 -> Some (Imply (meet dst c0 c1)) + | Subtract c0, Subtract c1 -> Some (Subtract (join dst c0 c1)) + | Imply c0, Join_with c1 when le dst c0 c1 -> Some (Join_with (max dst)) + | Imply c0, Meet_with c1 when le dst c0 c1 -> Some (Imply c0) + | Subtract c0, Meet_with c1 when le dst c1 c0 -> Some (Meet_with (min dst)) + | Subtract c0, Join_with c1 when le dst c1 c0 -> Some (Subtract c0) + | Meet_with c0, m1 when is_max c0 -> Some m1 + | Join_with c0, m1 when is_min c0 -> Some m1 + | Imply c0, m1 when is_max c0 -> Some m1 + | Subtract c0, m1 when is_min c0 -> Some m1 + | m1, Meet_with c0 when is_mid_max c0 -> Some m1 + | m1, Join_with c0 when is_mid_min c0 -> Some m1 + | m1, Imply c0 when is_mid_max c0 -> Some m1 + | m1, Subtract c0 when is_mid_min c0 -> Some m1 + | Compose (f0, f1), g -> ( + let mid = src dst f0 in + match maybe_compose mid f1 g with + | Some m -> Some (compose dst f0 m) + (* the check needed to prevent infinite loop *) + | None -> None) + | f, Compose (g0, g1) -> ( + match maybe_compose dst f g0 with + | Some m -> Some (compose dst m g1) + | None -> None) + | Proj (mid, ax), Meet_with c -> + Some (compose dst (Meet_with (Axis.proj ax c)) (Proj (mid, ax))) + | Proj (mid, ax), Join_with c -> + Some (compose dst (Join_with (Axis.proj ax c)) (Proj (mid, ax))) + | Proj (_, ax0), Max_with ax1 -> ( + match Axis.eq ax0 ax1 with None -> None | Some Refl -> Some Id) + | Proj (_, ax0), Min_with ax1 -> ( + match Axis.eq ax0 ax1 with None -> None | Some Refl -> Some Id) + | Proj (mid, ax), Map_comonadic f -> ( + let src' = src mid m1 in + match ax with + | Areality -> Some (compose dst f (Proj (src', Areality))) + | Linearity -> Some (Proj (src', Linearity)) + | Portability -> Some (Proj (src', Portability))) + | Proj _, Monadic_to_comonadic_min -> None + | Proj _, Monadic_to_comonadic_max -> None + | Proj _, Comonadic_to_monadic _ -> None + | Map_comonadic f, Map_comonadic g -> + let dst0 = proj_obj Areality dst in + Some (Map_comonadic (compose dst0 f g)) + | Regional_to_local, Local_to_regional -> Some Id + | Regional_to_local, Global_to_regional -> Some (Join_with Locality.Local) + | Regional_to_local, Locality_as_regionality -> Some Id + | Regional_to_local, Meet_with c -> + Some (compose dst (Meet_with (regional_to_local c)) Regional_to_local) + | Regional_to_local, Join_with c -> + Some (compose dst (Join_with (regional_to_local c)) Regional_to_local) + | Regional_to_global, Join_with c -> + Some (compose dst (Join_with (regional_to_global c)) Regional_to_global) + | Regional_to_global, Meet_with c -> + Some (compose dst (Meet_with (regional_to_global c)) Regional_to_global) + | Local_to_regional, Meet_with c -> + Some (compose dst (Meet_with (local_to_regional c)) Local_to_regional) + | Local_to_regional, Join_with c -> + Some (compose dst (Join_with (local_to_regional c)) Local_to_regional) + | Global_to_regional, Meet_with c -> + Some (compose dst (Meet_with (global_to_regional c)) Global_to_regional) + | Global_to_regional, Join_with c -> + Some (compose dst (Join_with (global_to_regional c)) Global_to_regional) + | Locality_as_regionality, Meet_with c -> + Some + (compose dst + (Meet_with (locality_as_regionality c)) + Locality_as_regionality) + | Locality_as_regionality, Join_with c -> + Some + (compose dst + (Join_with (locality_as_regionality c)) + Locality_as_regionality) + | Map_comonadic f, Join_with c -> + let dst0 = proj_obj Areality dst in + let areality = Axis.proj Areality c in + Some + (compose dst + (Join_with (set_areality (min dst0) c)) + (Map_comonadic (compose dst0 f (Join_with areality)))) + | Map_comonadic f, Meet_with c -> + let dst0 = proj_obj Areality dst in + let areality = Axis.proj Areality c in + Some + (compose dst + (Meet_with (set_areality (max dst0) c)) + (Map_comonadic (compose dst0 f (Meet_with areality)))) + | Map_comonadic f, Imply c -> + let dst0 = proj_obj Areality dst in + let areality = Axis.proj Areality c in + Some + (compose dst + (Imply (set_areality (max dst0) c)) + (Map_comonadic (compose dst0 f (Imply areality)))) + | Map_comonadic f, Subtract c -> + let dst0 = proj_obj Areality dst in + let areality = Axis.proj Areality c in + Some + (compose dst + (Subtract (set_areality (min dst0) c)) + (Map_comonadic (compose dst0 f (Subtract areality)))) + | Regional_to_global, Locality_as_regionality -> Some Id + | Regional_to_global, Local_to_regional -> Some (Meet_with Locality.Global) + | Local_to_regional, Regional_to_local -> None + | Local_to_regional, Regional_to_global -> None + | Locality_as_regionality, Regional_to_local -> None + | Locality_as_regionality, Regional_to_global -> None + | Global_to_regional, Regional_to_local -> None + | Regional_to_global, Global_to_regional -> Some Id + | Global_to_regional, Regional_to_global -> None + | Min_with _, _ -> None + | Max_with _, _ -> None + | _, Meet_with _ -> None + | Meet_with _, _ -> None + | _, Join_with _ -> None + | Join_with _, _ -> None + | _, Imply _ -> None + | Imply _, _ -> None + | _, Subtract _ -> None + | Subtract _, _ -> None + | _, Proj _ -> None + | Map_comonadic _, _ -> None + | Monadic_to_comonadic_min, _ -> None + | Monadic_to_comonadic_max, _ -> None + | Comonadic_to_monadic _, _ -> None + | ( Proj _, + ( Local_to_regional | Regional_to_local | Locality_as_regionality + | Regional_to_global | Global_to_regional ) ) -> + . + | ( ( Local_to_regional | Regional_to_local | Locality_as_regionality + | Regional_to_global | Global_to_regional ), + Min_with _ ) -> + . + | ( ( Local_to_regional | Regional_to_local | Locality_as_regionality + | Regional_to_global | Global_to_regional ), + Max_with _ ) -> + . + + and compose : + type a b c d. + c obj -> (b, c, d) morph -> (a, b, d) morph -> (a, c, d) morph = + fun dst f g -> + match maybe_compose dst f g with Some m -> m | None -> Compose (f, g) + + let rec left_adjoint : + type a b l. + b obj -> (a, b, l * allowed) morph -> (b, a, allowed * disallowed) morph = + fun dst f -> + match f with + | Id -> Id + | Proj (_, ax) -> Min_with ax + | Max_with ax -> Proj (dst, ax) + | Compose (f, g) -> + let mid = src dst f in + let f' = left_adjoint dst f in + let g' = left_adjoint mid g in + Compose (g', f') + | Join_with c -> Subtract c + | Meet_with _c -> + (* The downward closure of [Meet_with c]'s image is all [x <= c]. + For those, [x <= meet c y] is equivalent to [x <= y]. *) + Id + | Imply c -> Meet_with c + | Comonadic_to_monadic _ -> Monadic_to_comonadic_min + | Monadic_to_comonadic_max -> Comonadic_to_monadic dst + | Global_to_regional -> Regional_to_global + | Regional_to_global -> Locality_as_regionality + | Locality_as_regionality -> Regional_to_local + | Regional_to_local -> Local_to_regional + | Map_comonadic f -> + let dst0 = proj_obj Areality dst in + let f' = left_adjoint dst0 f in + Map_comonadic f' + + and right_adjoint : + type a b r. + b obj -> (a, b, allowed * r) morph -> (b, a, disallowed * allowed) morph = + fun dst f -> + match f with + | Id -> Id + | Proj (_, ax) -> Max_with ax + | Min_with ax -> Proj (dst, ax) + | Compose (f, g) -> + let mid = src dst f in + let f' = right_adjoint dst f in + let g' = right_adjoint mid g in + Compose (g', f') + | Meet_with c -> Imply c + | Subtract c -> Join_with c + | Join_with _c -> + (* The upward closure of [Join_with c]'s image is all [x >= c]. + For those, [join c y <= x] is equivalent to [y <= x]. *) + Id + | Comonadic_to_monadic _ -> Monadic_to_comonadic_max + | Monadic_to_comonadic_min -> Comonadic_to_monadic dst + | Local_to_regional -> Regional_to_local + | Regional_to_local -> Locality_as_regionality + | Locality_as_regionality -> Regional_to_global + | Regional_to_global -> Global_to_regional + | Map_comonadic f -> + let dst0 = proj_obj Areality dst in + let f' = right_adjoint dst0 f in + Map_comonadic f' end -module type DualLattice = sig - include Lattice +module C = Lattices_mono +module S = Solvers_polarized (C) - type dual +type monadic = C.monadic - val to_dual : t -> dual +type 'a comonadic_with = 'a C.comonadic_with - val of_dual : dual -> t -end +module Axis = C.Axis -module type DualSolver = sig - include Solver +type changes = S.changes - type dual +let undo_changes = S.undo_changes - val to_dual : t -> dual +(* To be filled in by [types.ml] *) +let append_changes : (changes ref -> unit) ref = ref (fun _ -> assert false) - val of_dual : dual -> t +let set_append_changes f = append_changes := f + +type ('a, 'd) mode_monadic = ('a, 'd) S.Negative.mode + +type ('a, 'd) mode_comonadic = ('a, 'd) S.Positive.mode + +(** Representing a single object *) +module type Obj = sig + type const + + module Solver : S.Solver_polarized + + val obj : const C.obj end -module DualSolver - (Dual : Lattice) - (Solver : Solver with type const := Dual.t) - (L : DualLattice with type dual := Dual.t) : - DualSolver with type const := L.t and type dual := Solver.t = struct - type var = Solver.var +let try_with_log op = + let log' = ref S.empty_changes in + let log = Some log' in + match op ~log with + | Ok _ as x -> + !append_changes log'; + x + | Error _ as x -> + S.undo_changes !log'; + x + [@@inline] - type t = Solver.t +let with_log op = + let log' = ref S.empty_changes in + let log = Some log' in + let r = op ~log in + !append_changes log'; + r + [@@inline] - let of_const c = Solver.of_const (L.to_dual c) +let equate_from_submode submode_log m0 m1 ~log = + match submode_log m0 m1 ~log with + | Error e -> Error (Left_le_right, e) + | Ok () -> ( + match submode_log m1 m0 ~log with + | Error e -> Error (Right_le_left, e) + | Ok () -> Ok ()) + [@@inline] - let is_const a = Solver.is_const a +let equate_from_submode' submode m0 m1 = + match submode m0 m1 with + | Error e -> Error (Left_le_right, e) + | Ok () -> ( + match submode m1 m0 with + | Error e -> Error (Right_le_left, e) + | Ok () -> Ok ()) + [@@inline] - let submode a b = Solver.submode b a +module Common (Obj : Obj) = struct + open Obj - let submode_exn a b = Solver.submode_exn b a + type 'd t = (const, 'd) Solver.mode - let equate a b = Solver.equate b a + type l = (allowed * disallowed) t - let constrain_upper a = L.of_dual (Solver.constrain_lower a) + type r = (disallowed * allowed) t - let constrain_lower a = L.of_dual (Solver.constrain_upper a) + type lr = (allowed * allowed) t - let to_dual a = a + type nonrec error = const error - let of_dual a = a + type equate_error = equate_step * error - let min_mode = of_dual Solver.max_mode + type (_, _, 'd) sided = 'd t - let max_mode = of_dual Solver.min_mode + let disallow_right m = Solver.disallow_right m - let newvar () = Solver.newvar () + let disallow_left m = Solver.disallow_left m - let newvar_below a = - let a', changed = Solver.newvar_above a in - a', changed + let allow_left m = Solver.allow_left m - let newvar_above a = - let a', changed = Solver.newvar_below a in - a', changed + let allow_right m = Solver.allow_right m - let join ts = Solver.meet ts + let newvar () = Solver.newvar obj - let meet ts = Solver.join ts + let min = Solver.min obj - let const_or_var a = - match Solver.const_or_var a with - | Const c -> Const (L.of_dual c) - | Var v -> Var v + let max = Solver.max obj - let check_const a = - match Solver.check_const a with - | Some m -> Some (L.of_dual m) - | None -> None + let newvar_above m = Solver.newvar_above obj m - let print_var = Solver.print_var + let newvar_below m = Solver.newvar_below obj m - let print' ?(verbose = true) ?label ppf a = - match Solver.const_or_var a with - | Const m -> L.print ppf (L.of_dual m) - | Var v -> - (match label with None -> () | Some s -> Format.fprintf ppf "%s:" s); - if verbose - then (* caret stands for dual *) - Format.fprintf ppf "^%a" print_var v - else Format.fprintf ppf "?" + let submode_log a b ~log = Solver.submode obj a b ~log - let print ppf m = print' ~verbose:true ?label:None ppf m -end + let submode a b = try_with_log (submode_log a b) -module Locality = struct - module Const = struct - type t = - | Global - | Local + let join l = Solver.join obj l - let min = Global + let meet l = Solver.meet obj l - let max = Local + let submode_exn m0 m1 = assert (submode m0 m1 |> Result.is_ok) - let legacy = Global + let equate a b = try_with_log (equate_from_submode submode_log a b) - let le a b = - match a, b with Global, _ | _, Local -> true | Local, Global -> false + let equate_exn m0 m1 = assert (equate m0 m1 |> Result.is_ok) - let eq a b = - match a, b with - | Global, Global | Local, Local -> true - | Local, Global | Global, Local -> false + let print ?verbose () ppf m = Solver.print ?verbose obj ppf m - let join a b = - match a, b with Local, _ | _, Local -> Local | Global, Global -> Global + let zap_to_ceil m = with_log (Solver.zap_to_ceil obj m) - let meet a b = - match a, b with Global, _ | _, Global -> Global | Local, Local -> Local + let zap_to_floor m = with_log (Solver.zap_to_floor obj m) - let print ppf = function - | Global -> Format.fprintf ppf "Global" - | Local -> Format.fprintf ppf "Local" + let of_const : type l r. const -> (l * r) t = fun a -> Solver.of_const obj a + + module Guts = struct + let get_floor m = Solver.get_floor obj m + + let get_ceil m = Solver.get_ceil obj m + + let get_conservative_floor m = Solver.get_conservative_floor obj m + + let get_conservative_ceil m = Solver.get_conservative_ceil obj m + end +end +[@@inline] + +module Locality = struct + module Const = C.Locality + + module Obj = struct + type const = Const.t + + module Solver = S.Positive + + let obj = C.Locality end - include Solver (Const) + include Common (Obj) - let global = of_const Const.Global + let global = of_const Global - let local = of_const Const.Local + let local = of_const Local + + let legacy = of_const Const.legacy - let legacy = global + let zap_to_legacy = zap_to_floor - let constrain_legacy = constrain_lower + module Guts = struct + let check_const m = + let floor = Guts.get_floor m in + let ceil = Guts.get_ceil m in + if Const.le ceil floor then Some ceil else None + + let check_const_conservative m = + let floor = Guts.get_conservative_floor m in + let ceil = Guts.get_conservative_ceil m in + if Const.le ceil floor then Some ceil else None + end end module Regionality = struct - module Const = struct - type t = - | Global - | Regional - | Local + module Const = C.Regionality - let r_as_l : t -> Locality.Const.t = function - | Local | Regional -> Local - | Global -> Global - - let r_as_g : t -> Locality.Const.t = function - | Local -> Local - | Regional | Global -> Global - - let of_localities ~(r_as_l : Locality.Const.t) ~(r_as_g : Locality.Const.t) - = - match r_as_l, r_as_g with - | Global, Global -> Global - | Global, Local -> assert false - | Local, Global -> Regional - | Local, Local -> Local - - let print ppf t = - let s = - match t with - | Global -> "Global" - | Regional -> "Regional" - | Local -> "Local" - in - Format.fprintf ppf "%s" s + module Obj = struct + type const = Const.t + + module Solver = S.Positive + + let obj = C.Regionality end - type t = - { r_as_l : Locality.t; - r_as_g : Locality.t - } + include Common (Obj) - let of_locality l = { r_as_l = l; r_as_g = l } + let local = of_const Const.Local - let of_const c = - let r_as_l, r_as_g = - match c with - | Const.Global -> Locality.global, Locality.global - | Const.Regional -> Locality.local, Locality.global - | Const.Local -> Locality.local, Locality.local - in - { r_as_l; r_as_g } + let regional = of_const Const.Regional - let local = of_const Local + let global = of_const Const.Global - let regional = of_const Regional + let legacy = of_const Const.legacy - let global = of_const Global + let zap_to_legacy = zap_to_floor +end - let legacy = global +module Linearity = struct + module Const = C.Linearity - let max_mode = - let r_as_l = Locality.max_mode in - let r_as_g = Locality.max_mode in - { r_as_l; r_as_g } + module Obj = struct + type const = Const.t - let min_mode = - let r_as_l = Locality.min_mode in - let r_as_g = Locality.min_mode in - { r_as_l; r_as_g } + module Solver = S.Positive - let local_to_regional t = { t with r_as_g = Locality.global } + let obj : _ C.obj = C.Linearity + end - let regional_to_global t = { t with r_as_l = t.r_as_g } + include Common (Obj) - let regional_to_local t = { t with r_as_g = t.r_as_l } + let many = of_const Many - let global_to_regional t = { t with r_as_l = Locality.local } + let once = of_const Once - let regional_to_global_locality t = t.r_as_g + let legacy = of_const Const.legacy - let regional_to_local_locality t = t.r_as_l + let zap_to_legacy = zap_to_floor +end - type error = - [ `Regionality - | `Locality ] +module Portability = struct + module Const = C.Portability - let submode t1 t2 = - match Locality.submode t1.r_as_l t2.r_as_l with - | Error () -> Error `Regionality - | Ok () -> ( - match Locality.submode t1.r_as_g t2.r_as_g with - | Error () -> Error `Locality - | Ok () as ok -> ok) - - let equate a b = - match submode a b, submode b a with - | Ok (), Ok () -> Ok () - | Error e, _ | _, Error e -> Error e - - let join ts = - let r_as_l = Locality.join (List.map (fun t -> t.r_as_l) ts) in - let r_as_g = Locality.join (List.map (fun t -> t.r_as_g) ts) in - { r_as_l; r_as_g } - - let constrain_upper t = - let r_as_l = Locality.constrain_upper t.r_as_l in - let r_as_g = Locality.constrain_upper t.r_as_g in - Const.of_localities ~r_as_l ~r_as_g - - let constrain_lower t = - let r_as_l = Locality.constrain_lower t.r_as_l in - let r_as_g = Locality.constrain_lower t.r_as_g in - Const.of_localities ~r_as_l ~r_as_g + module Obj = struct + type const = Const.t - let newvar () = - let r_as_l = Locality.newvar () in - let r_as_g, _ = Locality.newvar_below r_as_l in - { r_as_l; r_as_g } - - let newvar_below t = - let r_as_l, changed1 = Locality.newvar_below t.r_as_l in - let r_as_g, changed2 = Locality.newvar_below t.r_as_g in - Locality.submode_exn r_as_g r_as_l; - { r_as_l; r_as_g }, changed1 || changed2 - - let newvar_above t = - let r_as_l, changed1 = Locality.newvar_above t.r_as_l in - let r_as_g, changed2 = Locality.newvar_above t.r_as_g in - Locality.submode_exn r_as_g r_as_l; - { r_as_l; r_as_g }, changed1 || changed2 - - let check_const t = - match Locality.check_const t.r_as_l with - | None -> None - | Some r_as_l -> ( - match Locality.check_const t.r_as_g with - | None -> None - | Some r_as_g -> Some (Const.of_localities ~r_as_l ~r_as_g)) - - let print' ?(verbose = true) ?label ppf t = - match check_const t with - | Some l -> Const.print ppf l - | None -> ( - match label with - | None -> () - | Some l -> - Format.fprintf ppf "%s: " l; - Format.fprintf ppf "r_as_l=%a r_as_g=%a" - (Locality.print' ~verbose ?label:None) - t.r_as_l - (Locality.print' ~verbose ?label:None) - t.r_as_g) - - let print ppf m = print' ~verbose:true ?label:None ppf m + module Solver = S.Positive + + let obj : _ C.obj = C.Portability + end + + include Common (Obj) + + let legacy = of_const Const.legacy + + let zap_to_legacy = zap_to_ceil end module Uniqueness = struct - module Const = struct - type t = - | Unique - | Shared + module Const = C.Uniqueness - let legacy = Shared + module Obj = struct + type const = Const.t - let min = Unique + (* the negation of Uniqueness_op gives us the proper uniqueness *) + module Solver = S.Negative - let max = Shared + let obj = C.Uniqueness_op + end - let le a b = - match a, b with Unique, _ | _, Shared -> true | Shared, Unique -> false + include Common (Obj) - let eq a b = - match a, b with - | Unique, Unique | Shared, Shared -> true - | Shared, Unique | Unique, Shared -> false + let shared = of_const Shared - let join a b = - match a, b with - | Shared, _ | _, Shared -> Shared - | Unique, Unique -> Unique + let unique = of_const Unique - let meet a b = - match a, b with - | Unique, _ | _, Unique -> Unique - | Shared, Shared -> Shared + let legacy = of_const Const.legacy - let print ppf = function - | Shared -> Format.fprintf ppf "Shared" - | Unique -> Format.fprintf ppf "Unique" + let zap_to_legacy = zap_to_ceil +end + +module Contention = struct + module Const = C.Contention + + module Obj = struct + type const = Const.t + + (* the negation of Contention_op gives us the proper contention *) + module Solver = S.Negative + + let obj = C.Contention_op end - include Solver (Const) + include Common (Obj) + + let legacy = of_const Const.legacy - let constrain_legacy = constrain_upper + let zap_to_legacy = zap_to_floor +end + +let regional_to_local m = + S.Positive.via_monotone Locality.Obj.obj C.Regional_to_local m + +let locality_as_regionality m = + S.Positive.via_monotone Regionality.Obj.obj C.Locality_as_regionality m - let unique = of_const Const.Unique +let regional_to_global m = + S.Positive.via_monotone Locality.Obj.obj C.Regional_to_global m - let shared = of_const Const.Shared +module type Areality = sig + module Const : C.Areality - let legacy = shared + module Obj : Obj with type const = Const.t and module Solver = S.Positive + + val zap_to_legacy : (Const.t, allowed * 'r) Obj.Solver.mode -> Const.t end -module Linearity = struct - module Const = struct - type t = - | Many - | Once +module Comonadic_with (Areality : Areality) = struct + module Obj = struct + type const = Areality.Obj.const C.comonadic_with + + module Solver = S.Positive - let legacy = Many + let obj = C.comonadic_with_obj Areality.Obj.obj + end - let min = Many + include Common (Obj) - let max = Once + type error = Error : (Obj.const, 'a) C.Axis.t * 'a Solver.error -> error - let le a b = - match a, b with Many, _ | _, Once -> true | Once, Many -> false + type equate_error = equate_step * error - let eq a b = - match a, b with - | Many, Many | Once, Once -> true - | Once, Many | Many, Once -> false + open Obj - let join a b = - match a, b with Once, _ | _, Once -> Once | Many, Many -> Many + let proj_obj ax = C.proj_obj ax obj - let meet a b = - match a, b with Many, _ | _, Many -> Many | Once, Once -> Once + module Const = struct + include C.Comonadic_with (Areality.Const) - let print ppf = function - | Once -> Format.fprintf ppf "Once" - | Many -> Format.fprintf ppf "Many" + let eq a b = le a b && le b a + + let le_axis ax a b = + let obj = proj_obj ax in + C.le obj a b - let to_dual : t -> Uniqueness.Const.t = function - | Once -> Unique - | Many -> Shared + let min_axis ax = + let obj = proj_obj ax in + C.min obj - let of_dual : Uniqueness.Const.t -> t = function - | Unique -> Once - | Shared -> Many + let max_axis ax = + let obj = proj_obj ax in + C.max obj + + let max_with ax c = Axis.update ax c (C.max obj) + + let print_axis ax ppf a = + let obj = proj_obj ax in + C.print obj ppf a end - include DualSolver (Uniqueness.Const) (Uniqueness) (Const) + let proj ax m = Solver.via_monotone (proj_obj ax) (Proj (Obj.obj, ax)) m - let once = of_const Once + let meet_const c m = Solver.via_monotone obj (Meet_with c) m - let many = of_const Many + let join_const c m = Solver.via_monotone obj (Join_with c) m + + let min_with ax m = + Solver.via_monotone Obj.obj (Min_with ax) (Solver.disallow_right m) + + let max_with ax m = + Solver.via_monotone Obj.obj (Max_with ax) (Solver.disallow_left m) + + let join_with ax c m = join_const (C.min_with Obj.obj ax c) m + + let meet_with ax c m = meet_const (C.max_with Obj.obj ax c) m + + let zap_to_legacy m = + let areality = proj Areality m |> Areality.zap_to_legacy in + let linearity = proj Linearity m |> Linearity.zap_to_legacy in + let portability = proj Portability m |> Portability.zap_to_legacy in + areality, linearity, portability + + let imply c m = Solver.via_monotone obj (Imply c) (Solver.disallow_left m) - let legacy = many + let legacy = of_const Const.legacy - let constrain_legacy = constrain_lower + let axis_of_error { left = area0, lin0, port0; right = area1, lin1, port1 } : + error = + if Areality.Const.le area0 area1 + then + if Linearity.Const.le lin0 lin1 + then + if Portability.Const.le port0 port1 + then assert false + else Error (Portability, { left = port0; right = port1 }) + else Error (Linearity, { left = lin0; right = lin1 }) + else Error (Areality, { left = area0; right = area1 }) + + (* overriding to report the offending axis *) + let submode_log m0 m1 ~log : _ result = + match submode_log m0 m1 ~log with + | Ok () -> Ok () + | Error e -> Error (axis_of_error e) + + let submode a b = try_with_log (submode_log a b) + + (* override to report the offending axis *) + let equate a b = try_with_log (equate_from_submode submode_log a b) end +[@@inline] -module Alloc = struct - module Const = struct - type t = (Locality.Const.t, Uniqueness.Const.t, Linearity.Const.t) modes +module Monadic = struct + module Obj = struct + type const = C.Monadic_op.t - let legacy = - { locality = Locality.Const.legacy; - uniqueness = Uniqueness.Const.legacy; - linearity = Linearity.Const.legacy - } - - let join { locality = loc1; uniqueness = u1; linearity = lin1 } - { locality = loc2; uniqueness = u2; linearity = lin2 } = - { locality = Locality.Const.join loc1 loc2; - uniqueness = Uniqueness.Const.join u1 u2; - linearity = Linearity.Const.join lin1 lin2 - } - - (** constrain uncurried function ret_mode from arg_mode *) - let close_over arg_mode = - let locality = arg_mode.locality in - (* uniqueness of the returned function is not constrained *) - let uniqueness = Uniqueness.Const.min in - let linearity = - Linearity.Const.join arg_mode.linearity - (* In addition, unique argument make the returning function once. - In other words, if argument <= unique, returning function >= once. - That is, returning function >= (dual of argument) *) - (Linearity.Const.of_dual arg_mode.uniqueness) - in - { locality; uniqueness; linearity } - - (** constrain uncurried function ret_mode from the mode of the whole - function *) - let partial_apply alloc_mode = - let locality = alloc_mode.locality in - let uniqueness = Uniqueness.Const.min in - let linearity = alloc_mode.linearity in - { locality; uniqueness; linearity } - - let min = - { locality = Locality.Const.min; - uniqueness = Uniqueness.Const.min; - linearity = Linearity.Const.min - } - - let min_with_uniqueness uniqueness = { min with uniqueness } + (* Negative solver on the opposite of monadic should give the monadic + fragment with original ordering *) + module Solver = S.Negative + + let obj = C.Monadic_op end - type t = (Locality.t, Uniqueness.t, Linearity.t) modes + include Common (Obj) - let of_const { locality; uniqueness; linearity } : t = - { locality = Locality.of_const locality; - uniqueness = Uniqueness.of_const uniqueness; - linearity = Linearity.of_const linearity - } + type error = Error : (Obj.const, 'a) C.Axis.t * 'a Solver.error -> error - let prod locality uniqueness linearity = { locality; uniqueness; linearity } + type equate_error = equate_step * error - let legacy = - { locality = Locality.legacy; - uniqueness = Uniqueness.legacy; - linearity = Linearity.legacy - } + open Obj - let local = { legacy with locality = Locality.local } + let proj_obj ax = C.proj_obj ax obj - let unique = { legacy with uniqueness = Uniqueness.unique } + module Const = struct + include C.Monadic - let local_unique = { local with uniqueness = Uniqueness.unique } + (* CR zqian: The flipping logic leaking to here is bad. Refactoring needed. *) - let is_const { locality; uniqueness; linearity } = - Locality.is_const locality - && Uniqueness.is_const uniqueness - && Linearity.is_const linearity + (* Monadic fragment is flipped, so are the following definitions. *) + let min_with ax c = Axis.update ax c (C.max obj) - let min_mode : t = - { locality = Locality.min_mode; - uniqueness = Uniqueness.min_mode; - linearity = Linearity.min_mode - } + let min_axis ax = + let obj = proj_obj ax in + C.max obj - let max_mode : t = - { locality = Locality.max_mode; - uniqueness = Uniqueness.max_mode; - linearity = Linearity.max_mode - } + let max_axis ax = + let obj = proj_obj ax in + C.min obj - let locality t = t.locality + let le_axis ax a b = + let obj = proj_obj ax in + C.le obj b a + end - let uniqueness t = t.uniqueness + let proj ax m = Solver.via_monotone (proj_obj ax) (Proj (Obj.obj, ax)) m - let linearity t = t.linearity + (* The monadic fragment is inverted. Most of the inversion logic is taken care + by [Solver_polarized], but some remain, such as the [Min_with] below which + is inverted from [Max_with]. *) - type error = - [ `Locality - | `Uniqueness - | `Linearity ] + let meet_const c m = Solver.via_monotone obj (Join_with c) m - let submode { locality = loc1; uniqueness = u1; linearity = lin1 } - { locality = loc2; uniqueness = u2; linearity = lin2 } = - match Locality.submode loc1 loc2 with - | Ok () -> ( - match Uniqueness.submode u1 u2 with - | Ok () -> ( - match Linearity.submode lin1 lin2 with - | Ok () -> Ok () - | Error () -> Error `Linearity) - | Error () -> Error `Uniqueness) - | Error () -> Error `Locality - - let submode_exn ({ locality = loc1; uniqueness = u1; linearity = lin1 } : t) - ({ locality = loc2; uniqueness = u2; linearity = lin2 } : t) = - Locality.submode_exn loc1 loc2; - Uniqueness.submode_exn u1 u2; - Linearity.submode_exn lin1 lin2 - - let equate ({ locality = loc1; uniqueness = u1; linearity = lin1 } : t) - ({ locality = loc2; uniqueness = u2; linearity = lin2 } : t) = - match Locality.equate loc1 loc2 with - | Ok () -> ( - match Uniqueness.equate u1 u2 with - | Ok () -> ( - match Linearity.equate lin1 lin2 with - | Ok () -> Ok () - | Error () -> Error `Linearity) - | Error () -> Error `Uniqueness) - | Error () -> Error `Locality - - let join ms : t = - { locality = Locality.join (List.map (fun (t : t) -> t.locality) ms); - uniqueness = Uniqueness.join (List.map (fun (t : t) -> t.uniqueness) ms); - linearity = Linearity.join (List.map (fun (t : t) -> t.linearity) ms) - } + let join_const c m = Solver.via_monotone obj (Meet_with c) m - let constrain_upper { locality; uniqueness; linearity } = - { locality = Locality.constrain_upper locality; - uniqueness = Uniqueness.constrain_upper uniqueness; - linearity = Linearity.constrain_upper linearity - } + let max_with ax m = + Solver.via_monotone Obj.obj (Min_with ax) (Solver.disallow_left m) - let constrain_lower { locality; uniqueness; linearity } = - { locality = Locality.constrain_lower locality; - uniqueness = Uniqueness.constrain_lower uniqueness; - linearity = Linearity.constrain_lower linearity - } + let min_with ax m = + Solver.via_monotone Obj.obj (Max_with ax) (Solver.disallow_right m) - (* constrain to the legacy modes*) - let constrain_legacy { locality; uniqueness; linearity } = - { locality = Locality.constrain_legacy locality; - uniqueness = Uniqueness.constrain_legacy uniqueness; - linearity = Linearity.constrain_legacy linearity - } + let join_with ax c m = join_const (C.max_with Obj.obj ax c) m - let newvar () = - { locality = Locality.newvar (); - uniqueness = Uniqueness.newvar (); - linearity = Linearity.newvar () - } + let meet_with ax c m = meet_const (C.min_with Obj.obj ax c) m - let newvar_below { locality; uniqueness; linearity } = - let locality, changed1 = Locality.newvar_below locality in - let uniqueness, changed2 = Uniqueness.newvar_below uniqueness in - let linearity, changed3 = Linearity.newvar_below linearity in - { locality; uniqueness; linearity }, changed1 || changed2 || changed3 - - let newvar_below_comonadic { locality; uniqueness; linearity } = - let locality, changed1 = Locality.newvar_below locality in - let linearity, changed2 = Linearity.newvar_below linearity in - { locality; uniqueness; linearity }, changed1 || changed2 - - let newvar_above { locality; uniqueness; linearity } = - let locality, changed1 = Locality.newvar_above locality in - let uniqueness, changed2 = Uniqueness.newvar_above uniqueness in - let linearity, changed3 = Linearity.newvar_above linearity in - { locality; uniqueness; linearity }, changed1 || changed2 || changed3 - - let of_uniqueness uniqueness = - { locality = Locality.newvar (); - uniqueness; - linearity = Linearity.newvar () - } + let imply c m = Solver.via_monotone obj (Subtract c) (Solver.disallow_left m) - let of_locality locality = - { locality; - uniqueness = Uniqueness.newvar (); - linearity = Linearity.newvar () - } + let zap_to_legacy m = + let uniqueness = proj Uniqueness m |> Uniqueness.zap_to_legacy in + let contention = proj Contention m |> Contention.zap_to_legacy in + uniqueness, contention - let of_linearity linearity = - { locality = Locality.newvar (); - uniqueness = Uniqueness.newvar (); - linearity - } + let legacy = of_const Const.legacy - let with_locality locality t = { t with locality } + let axis_of_error { left = uni0, con0; right = uni1, con1 } : error = + if Uniqueness.Const.le uni0 uni1 + then + if Contention.Const.le con0 con1 + then assert false + else Error (Contention, { left = con0; right = con1 }) + else Error (Uniqueness, { left = uni0; right = uni1 }) - let with_uniqueness uniqueness t = { t with uniqueness } + (* overriding to report the offending axis *) + let submode_log m0 m1 ~log : _ result = + match submode_log m0 m1 ~log with + | Ok () -> Ok () + | Error e -> Error (axis_of_error e) - let with_linearity linearity t = { t with linearity } + let submode a b = try_with_log (submode_log a b) - let check_const { locality; uniqueness; linearity } = - { locality = Locality.check_const locality; - uniqueness = Uniqueness.check_const uniqueness; - linearity = Linearity.check_const linearity + (* override to report the offending axis *) + let equate a b = try_with_log (equate_from_submode submode_log a b) +end + +type ('mo, 'como) monadic_comonadic = + { monadic : 'mo; + comonadic : 'como + } + +module Value_with (Areality : Areality) = struct + module Comonadic = Comonadic_with (Areality) + module Monadic = Monadic + + type 'd t = ('d Monadic.t, 'd Comonadic.t) monadic_comonadic + + type l = (allowed * disallowed) t + + type r = (disallowed * allowed) t + + type lr = (allowed * allowed) t + + type ('m, 'a, 'd) axis = + | Monadic : + (Monadic.Const.t, 'a) Axis.t + -> (('a, 'd) mode_monadic, 'a, 'd) axis + | Comonadic : + (Comonadic.Const.t, 'a) Axis.t + -> (('a, 'd) mode_comonadic, 'a, 'd) axis + + let proj_obj : type m a d. (m, a, d) axis -> a C.obj = function + | Monadic ax -> Monadic.proj_obj ax + | Comonadic ax -> Comonadic.proj_obj ax + + type ('a, 'b, 'c, 'd, 'e) modes = + { areality : 'a; + linearity : 'b; + uniqueness : 'c; + portability : 'd; + contention : 'e } - let print' ?(verbose = true) ppf { locality; uniqueness; linearity } = - Format.fprintf ppf "%a, %a, %a" - (Locality.print' ~verbose ~label:"locality") - locality - (Uniqueness.print' ~verbose ~label:"uniqueness") - uniqueness - (Linearity.print' ~verbose ~label:"linearity") - linearity - - let print ppf m = print' ~verbose:true ppf m - - (** constrain uncurried function ret_mode from arg_mode *) - let close_over arg_mode = - let locality = arg_mode.locality in - (* uniqueness of the returned function is not constrained *) - let uniqueness = Uniqueness.of_const Uniqueness.Const.min in - let linearity = - Linearity.join - [ arg_mode.linearity; - (* In addition, unique argument make the returning function once. - In other words, if argument <= unique, returning function >= once. - That is, returning function >= (dual of argument) *) - Linearity.of_dual arg_mode.uniqueness ] - in - { locality; uniqueness; linearity } - - (** constrain uncurried function ret_mode from the mode of the whole function - *) - let partial_apply alloc_mode = - let locality = alloc_mode.locality in - let uniqueness = Uniqueness.of_const Uniqueness.Const.min in - let linearity = alloc_mode.linearity in - { locality; uniqueness; linearity } -end + let split { areality; linearity; portability; uniqueness; contention } = + let monadic = uniqueness, contention in + let comonadic = areality, linearity, portability in + { comonadic; monadic } + + let merge { comonadic; monadic } = + let areality, linearity, portability = comonadic in + let uniqueness, contention = monadic in + { areality; linearity; portability; uniqueness; contention } + + let print ?verbose () ppf { monadic; comonadic } = + Format.fprintf ppf "%a;%a" + (Comonadic.print ?verbose ()) + comonadic + (Monadic.print ?verbose ()) + monadic + + let of_const c = + let { monadic; comonadic } = split c in + let comonadic = Comonadic.of_const comonadic in + let monadic = Monadic.of_const monadic in + { comonadic; monadic } -module Value = struct module Const = struct - type t = (Regionality.Const.t, Uniqueness.Const.t, Linearity.Const.t) modes - - let r_as_l : t -> Alloc.Const.t = function - | { locality; uniqueness; linearity } -> - let locality = Regionality.Const.r_as_l locality in - { locality; uniqueness; linearity } - [@@warning "-unused-value-declaration"] - - let r_as_g : t -> Alloc.Const.t = function - | { locality; uniqueness; linearity } -> - let locality = Regionality.Const.r_as_g locality in - { locality; uniqueness; linearity } - [@@warning "-unused-value-declaration"] + type t = + ( Areality.Const.t, + Linearity.Const.t, + Uniqueness.Const.t, + Portability.Const.t, + Contention.Const.t ) + modes + + module Monadic = Monadic.Const + module Comonadic = Comonadic.Const + + let min = merge { comonadic = Comonadic.min; monadic = Monadic.min } + + let max = merge { comonadic = Comonadic.max; monadic = Monadic.max } + + let le m0 m1 = + let m0 = split m0 in + let m1 = split m1 in + Comonadic.le m0.comonadic m1.comonadic && Monadic.le m0.monadic m1.monadic + + let print ppf m = + let { monadic; comonadic } = split m in + Format.fprintf ppf "%a,%a" Comonadic.print comonadic Monadic.print monadic + + let legacy = + merge { comonadic = Comonadic.legacy; monadic = Monadic.legacy } + + let meet m0 m1 = + let m0 = split m0 in + let m1 = split m1 in + let monadic = Monadic.meet m0.monadic m1.monadic in + let comonadic = Comonadic.meet m0.comonadic m1.comonadic in + merge { monadic; comonadic } + + let join m0 m1 = + let m0 = split m0 in + let m1 = split m1 in + let monadic = Monadic.join m0.monadic m1.monadic in + let comonadic = Comonadic.join m0.comonadic m1.comonadic in + merge { monadic; comonadic } + + module Option = struct + type some = t + + type t = + ( Areality.Const.t option, + Linearity.Const.t option, + Uniqueness.Const.t option, + Portability.Const.t option, + Contention.Const.t option ) + modes + + let none = + { areality = None; + uniqueness = None; + linearity = None; + portability = None; + contention = None + } + + let value opt ~default = + let areality = Option.value opt.areality ~default:default.areality in + let uniqueness = + Option.value opt.uniqueness ~default:default.uniqueness + in + let linearity = Option.value opt.linearity ~default:default.linearity in + let portability = + Option.value opt.portability ~default:default.portability + in + let contention = + Option.value opt.contention ~default:default.contention + in + { areality; uniqueness; linearity; portability; contention } + end + + let diff m0 m1 = + let diff le a0 a1 = if le a0 a1 && le a1 a0 then None else Some a0 in + let areality = diff Areality.Const.le m0.areality m1.areality in + let linearity = diff Linearity.Const.le m0.linearity m1.linearity in + let uniqueness = diff Uniqueness.Const.le m0.uniqueness m1.uniqueness in + let portability = + diff Portability.Const.le m0.portability m1.portability + in + let contention = diff Contention.Const.le m0.contention m1.contention in + { areality; linearity; uniqueness; portability; contention } + + (** See [Alloc.close_over] for explanation. *) + let close_over m = + let { monadic; comonadic } = split m in + let comonadic = + Comonadic.join comonadic + (C.monadic_to_comonadic_min + (C.comonadic_with_obj Areality.Obj.obj) + monadic) + in + let monadic = Monadic.min in + merge { comonadic; monadic } + + (** See [Alloc.partial_apply] for explanation. *) + let partial_apply m = + let { comonadic; _ } = split m in + let monadic = Monadic.min in + merge { comonadic; monadic } + + let print_axis : type m a d. (m, a, d) axis -> _ -> a -> unit = + fun ax ppf a -> + let obj = proj_obj ax in + C.print obj ppf a + + let le_axis : type m a d. (m, a, d) axis -> a -> a -> bool = + fun ax m0 m1 -> + match ax with + | Comonadic ax -> Comonadic.le_axis ax m0 m1 + | Monadic ax -> Monadic.le_axis ax m0 m1 + + let min_axis : type m a d. (m, a, d) axis -> a = function + | Comonadic ax -> Comonadic.min_axis ax + | Monadic ax -> Monadic.min_axis ax + + let max_axis : type m a d. (m, a, d) axis -> a = function + | Comonadic ax -> Comonadic.max_axis ax + | Monadic ax -> Monadic.max_axis ax + + let split = split + + let merge = merge end - type t = (Regionality.t, Uniqueness.t, Linearity.t) modes + let min = { comonadic = Comonadic.min; monadic = Monadic.min } + + let max = { comonadic = Comonadic.max; monadic = Monadic.max } + + include Magic_allow_disallow (struct + type (_, _, 'd) sided = 'd t constraint 'd = 'l * 'r + + let allow_left { monadic; comonadic } = + let monadic = Monadic.allow_left monadic in + let comonadic = Comonadic.allow_left comonadic in + { monadic; comonadic } + + let allow_right { monadic; comonadic } = + let monadic = Monadic.allow_right monadic in + let comonadic = Comonadic.allow_right comonadic in + { monadic; comonadic } + + let disallow_left { monadic; comonadic } = + let monadic = Monadic.disallow_left monadic in + let comonadic = Comonadic.disallow_left comonadic in + { monadic; comonadic } + + let disallow_right { monadic; comonadic } = + let monadic = Monadic.disallow_right monadic in + let comonadic = Comonadic.disallow_right comonadic in + { monadic; comonadic } + end) + + let newvar () = + let comonadic = Comonadic.newvar () in + let monadic = Monadic.newvar () in + { comonadic; monadic } + + let newvar_above { comonadic; monadic } = + let comonadic, b0 = Comonadic.newvar_above comonadic in + let monadic, b1 = Monadic.newvar_above monadic in + { monadic; comonadic }, b0 || b1 + + let newvar_below { comonadic; monadic } = + let comonadic, b0 = Comonadic.newvar_below comonadic in + let monadic, b1 = Monadic.newvar_below monadic in + { monadic; comonadic }, b0 || b1 + + type error = Error : ('m, 'a, 'd) axis * 'a Solver.error -> error + + type equate_error = equate_step * error + + let submode_log { monadic = monadic0; comonadic = comonadic0 } + { monadic = monadic1; comonadic = comonadic1 } ~log : (_, error) result = + (* comonadic before monadic, so that locality errors dominate + (error message backward compatibility) *) + match Comonadic.submode_log comonadic0 comonadic1 ~log with + | Error (Error (ax, e)) -> Error (Error (Comonadic ax, e)) + | Ok () -> ( + match Monadic.submode_log monadic0 monadic1 ~log with + | Error (Error (ax, e)) -> Error (Error (Monadic ax, e)) + | Ok () -> Ok ()) + + let submode a b = try_with_log (submode_log a b) + + let equate a b = try_with_log (equate_from_submode submode_log a b) + + let submode_exn m0 m1 = + match submode m0 m1 with + | Ok () -> () + | Error _ -> invalid_arg "submode_exn" + + let equate_exn m0 m1 = + match equate m0 m1 with Ok () -> () | Error _ -> invalid_arg "equate_exn" let legacy = - { locality = Regionality.legacy; - uniqueness = Uniqueness.legacy; - linearity = Linearity.legacy - } + let comonadic = Comonadic.legacy in + let monadic = Monadic.legacy in + { comonadic; monadic } - let regional = { legacy with locality = Regionality.regional } + let proj_monadic ax { monadic; _ } = Monadic.proj ax monadic - let local = { legacy with locality = Regionality.local } + let proj_comonadic ax { comonadic; _ } = Comonadic.proj ax comonadic - let unique = { legacy with uniqueness = Uniqueness.unique } + let proj : type m a l r. (m, a, l * r) axis -> (l * r) t -> m = + fun ax m -> + match ax with + | Monadic ax -> proj_monadic ax m + | Comonadic ax -> proj_comonadic ax m - let regional_unique = { regional with uniqueness = Uniqueness.unique } + let max_with_monadic ax m = + let comonadic = + Comonadic.max |> Comonadic.disallow_left |> Comonadic.allow_right + in + let monadic = Monadic.max_with ax m in + { comonadic; monadic } + + let max_with_comonadic ax m = + let comonadic = Comonadic.max_with ax m in + let monadic = Monadic.max |> Monadic.disallow_left |> Monadic.allow_right in + { comonadic; monadic } + + let max_with : type m a l r. (m, a, l * r) axis -> m -> (disallowed * r) t = + fun ax m -> + match ax with + | Monadic ax -> max_with_monadic ax m + | Comonadic ax -> max_with_comonadic ax m + + let min_with_monadic ax m = + let comonadic = + Comonadic.min |> Comonadic.disallow_right |> Comonadic.allow_left + in + let monadic = Monadic.min_with ax m in + { comonadic; monadic } + + let min_with_comonadic ax m = + let comonadic = Comonadic.min_with ax m in + let monadic = Monadic.min |> Monadic.disallow_right |> Monadic.allow_left in + { comonadic; monadic } + + let min_with : type m a l r. (m, a, l * r) axis -> m -> (l * disallowed) t = + fun ax m -> + match ax with + | Monadic ax -> min_with_monadic ax m + | Comonadic ax -> min_with_comonadic ax m + + let join_with_monadic ax c { monadic; comonadic } = + let monadic = Monadic.join_with ax c monadic in + { monadic; comonadic } + + let join_with_comonadic ax c { monadic; comonadic } = + let comonadic = Comonadic.join_with ax c comonadic in + { comonadic; monadic } + + let join_with : type m a d l r. (m, a, d) axis -> a -> (l * r) t -> (l * r) t + = + fun ax c m -> + match ax with + | Monadic ax -> join_with_monadic ax c m + | Comonadic ax -> join_with_comonadic ax c m + + let meet_with_monadic ax c { monadic; comonadic } = + let monadic = Monadic.meet_with ax c monadic in + { monadic; comonadic } + + let meet_with_comonadic ax c { monadic; comonadic } = + let comonadic = Comonadic.meet_with ax c comonadic in + { comonadic; monadic } + + let meet_with : type m a d l r. (m, a, d) axis -> a -> (l * r) t -> (l * r) t + = + fun ax c m -> + match ax with + | Monadic ax -> meet_with_monadic ax c m + | Comonadic ax -> meet_with_comonadic ax c m + + let join l = + let como, mo = + List.fold_left + (fun (como, mo) { comonadic; monadic } -> + comonadic :: como, monadic :: mo) + ([], []) l + in + let comonadic = Comonadic.join como in + let monadic = Monadic.join mo in + { comonadic; monadic } + + let meet l = + let como, mo = + List.fold_left + (fun (como, mo) { comonadic; monadic } -> + comonadic :: como, monadic :: mo) + ([], []) l + in + let comonadic = Comonadic.meet como in + let monadic = Monadic.meet mo in + { comonadic; monadic } + + let comonadic_to_monadic m = + S.Negative.via_antitone Monadic.Obj.obj + (Comonadic_to_monadic Comonadic.Obj.obj) m + + let monadic_to_comonadic_min m = + S.Positive.via_antitone Comonadic.Obj.obj Monadic_to_comonadic_min + (Monadic.disallow_left m) + + let meet_const c { comonadic; monadic } = + let c = split c in + let comonadic = Comonadic.meet_const c.comonadic comonadic in + let monadic = Monadic.meet_const c.monadic monadic in + { monadic; comonadic } + + let imply c { comonadic; monadic } = + let c = split c in + let comonadic = Comonadic.imply c.comonadic comonadic in + let monadic = Monadic.imply c.monadic monadic in + { monadic; comonadic } + + let zap_to_ceil { comonadic; monadic } = + let monadic = Monadic.zap_to_ceil monadic in + let comonadic = Comonadic.zap_to_ceil comonadic in + merge { monadic; comonadic } + + let zap_to_legacy { comonadic; monadic } = + let monadic = Monadic.zap_to_legacy monadic in + let comonadic = Comonadic.zap_to_legacy comonadic in + merge { monadic; comonadic } + + (** This is about partially applying [A -> B -> C] to [A] and getting [B -> + C]. [comonadic] and [monadic] constutute the mode of [A], and we need to + give the lower bound mode of [B -> C]. *) + let close_over { comonadic; monadic } = + let comonadic = Comonadic.disallow_right comonadic in + (* The comonadic of the returned function is constrained by the monadic of the closed argument via the dualizing morphism. *) + let comonadic1 = monadic_to_comonadic_min monadic in + (* It's also constrained by the comonadic of the closed argument. *) + let comonadic = Comonadic.join [comonadic; comonadic1] in + (* The returned function crosses all monadic axes that we know of + (uniqueness/contention). *) + let monadic = Monadic.disallow_right Monadic.min in + { comonadic; monadic } + + (** Similar to above, but we are given the mode of [A -> B -> C], and need to + give the lower bound mode of [B -> C]. *) + let partial_apply { comonadic; _ } = + (* The returned function crosses all monadic axes that we know of. *) + let monadic = Monadic.disallow_right Monadic.min in + let comonadic = Comonadic.disallow_right comonadic in + { comonadic; monadic } + + module List = struct + type nonrec 'd t = 'd t list + + include Magic_allow_disallow (struct + type (_, _, 'd) sided = 'd t constraint 'd = 'l * 'r + + let allow_left l = List.map allow_left l + + let allow_right l = List.map allow_right l + + let disallow_left l = List.map disallow_left l + + let disallow_right l = List.map disallow_right l + end) + end +end +[@@inline] - let local_unique = { local with uniqueness = Uniqueness.unique } +module Value = Value_with (Regionality) +module Alloc = Value_with (Locality) - let of_const { locality; uniqueness; linearity } = - { locality = Regionality.of_const locality; - uniqueness = Uniqueness.of_const uniqueness; - linearity = Linearity.of_const linearity - } +module Const = struct + let alloc_as_value + ({ areality; linearity; portability; uniqueness; contention } : + Alloc.Const.t) : Value.Const.t = + let areality = C.locality_as_regionality areality in + { areality; linearity; portability; uniqueness; contention } +end - let max_mode = - let locality = Regionality.max_mode in - let uniqueness = Uniqueness.max_mode in - let linearity = Linearity.max_mode in - { locality; uniqueness; linearity } +let alloc_as_value m = + let { comonadic; monadic } = m in + let comonadic = + S.Positive.via_monotone Value.Comonadic.Obj.obj + (Map_comonadic Locality_as_regionality) comonadic + in + { comonadic; monadic } + +let alloc_to_value_l2r m = + let { comonadic; monadic } = Alloc.disallow_right m in + let comonadic = + S.Positive.via_monotone Value.Comonadic.Obj.obj + (Map_comonadic Local_to_regional) comonadic + in + { comonadic; monadic } + +let value_to_alloc_r2g : type l r. (l * r) Value.t -> (l * r) Alloc.t = + fun m -> + let { comonadic; monadic } = m in + let comonadic = + S.Positive.via_monotone Alloc.Comonadic.Obj.obj + (Map_comonadic Regional_to_global) comonadic + in + { comonadic; monadic } + +let value_to_alloc_r2l m = + let { comonadic; monadic } = m in + let comonadic = + S.Positive.via_monotone Alloc.Comonadic.Obj.obj + (Map_comonadic Regional_to_local) comonadic + in + { comonadic; monadic } + +module Modality = struct + type ('m, 'a) raw = + | Meet_with : 'a -> (('a, 'l * 'r) mode_comonadic, 'a) raw + | Join_with : 'a -> (('a, 'l * 'r) mode_monadic, 'a) raw + + type t = Atom : ('m, 'a, _) Value.axis * ('m, 'a) raw -> t + + let is_id (Atom (ax, a)) = + match a with + | Join_with c -> Value.Const.le_axis ax c (Value.Const.min_axis ax) + | Meet_with c -> Value.Const.le_axis ax (Value.Const.max_axis ax) c + + let print ppf = function + | Atom (ax, Join_with c) -> + Format.fprintf ppf "join_with(%a)" (C.print (Value.proj_obj ax)) c + | Atom (ax, Meet_with c) -> + Format.fprintf ppf "meet_with(%a)" (C.print (Value.proj_obj ax)) c + + module Monadic = struct + module Mode = Value.Monadic + + type 'a axis = (Mode.Const.t, 'a) Axis.t + + type error = + | Error : 'a axis * (('a, _) mode_monadic, 'a) raw Solver.error -> error + + module Const = struct + type t = Join_const of Mode.Const.t + + let id = Join_const Mode.Const.min + + let max = Join_const Mode.Const.max + + let sub left right : (_, error) Result.t = + match left, right with + | Join_const c0, Join_const c1 -> + if Mode.Const.le c0 c1 + then Ok () + else + let (Error (ax, { left; right })) = + Mode.axis_of_error { left = c0; right = c1 } + in + Error + (Error (ax, { left = Join_with left; right = Join_with right })) + + let compose : + type a l r. a axis -> ((a, l * r) mode_monadic, a) raw -> t -> t = + fun ax a t -> + match a, t with + | Join_with c0, Join_const c -> + Join_const (Mode.Const.join (Mode.Const.min_with ax c0) c) + | Meet_with _, Join_const _ -> assert false + + let apply : type l r. t -> (l * r) Mode.t -> (l * r) Mode.t = + fun t x -> match t with Join_const c -> Mode.join_const c x + + let to_list = function + | Join_const c -> + [ (let ax : _ Axis.t = Uniqueness in + Atom (Monadic ax, Join_with (Axis.proj ax c))); + (let ax : _ Axis.t = Contention in + Atom (Monadic ax, Join_with (Axis.proj ax c))) ] + + let print ppf = function + | Join_const c -> Format.fprintf ppf "join_const(%a)" Mode.Const.print c + + (** Given a modality and a guarantee that the modality will only be appled + on [x >= mm], we can find some lower modality that is equivalent on the + restricted range. This is similar to mode-crossing, where we can push a + mode lower given a restricted range of types. *) + let modality_cross_left ~mm = function + | Join_const c -> + (* We want to find the minimal [c'] such that [join c x <= join c' x] + for all [x >= mm]. By definition of join, this is equivalent to [c + <= join x c'] for all [x >= mm]. This is equivalent to [c <= join + mm c']. Equivalently [subtract c mm <= c']. Note that [mm] is a + mode variable, but we need a constant. Therefore, we conservatively + take its incomplete lower bound [mm.lower]. Also recall that we + want the smallest such [c']. So we take [c' = subtract c mm.lower]. + *) + let mm = Mode.Guts.get_floor mm in + Join_const (Mode.Const.subtract c mm) + end - let min_mode = - let locality = Regionality.min_mode in - let uniqueness = Uniqueness.min_mode in - let linearity = Linearity.min_mode in - { locality; uniqueness; linearity } + type t = + | Const of Const.t + | Diff of Mode.lr * Mode.l + | Undefined + + let sub_log left right ~log : (unit, error) Result.t = + match left, right with + | Const c0, Const c1 -> Const.sub c0 c1 + | Diff (mm, m), Const (Join_const c) -> ( + (* Check that for any x >= mm, join(x, m) <= join(x, c), which (by + definition of join) is equivalent to m <= join(x, c). This has to + hold for all x >= mm, so we check m <= join(mm, c). *) + match Mode.submode_log m (Mode.join_const c mm) ~log with + | Ok () -> Ok () + | Error (Error (ax, { left; _ })) -> + Error + (Error + ( ax, + { left = Join_with left; right = Join_with (Axis.proj ax c) } + ))) + | Diff (_, _m0), Diff (_, _m1) -> + (* [m1] is a left mode so it cannot appear on the right. So we can't do + a proper check. However, this branch is only hit by + [wrap_constraint_with_shape], in which case LHS and RHS should be + physically equal. *) + assert (left == right); + Ok () + | Const _, Diff _ -> + Misc.fatal_error + "inferred modality Diff should not be on the RHS of sub." + | Undefined, _ | _, Undefined -> + Misc.fatal_error "modality Undefined should not be in sub." + + let id = Const Const.id + + let apply : type r. t -> (allowed * r) Mode.t -> Mode.l = + fun t x -> + match t with + | Const c -> Const.apply c x |> Mode.disallow_right + | Undefined -> + Misc.fatal_error "modality Undefined should not be applied." + | Diff (_, m) -> Mode.join [m; Mode.disallow_right x] - let locality t = t.locality + let print ppf = function + | Const c -> Const.print ppf c + | Undefined -> Format.fprintf ppf "undefined" + | Diff _ -> Format.fprintf ppf "diff" - let uniqueness t = t.uniqueness + let zap_to_floor = function + | Const c -> c + | Undefined -> Misc.fatal_error "modality Undefined should not be zapped." + | Diff (mm, m) -> + let c = Mode.zap_to_floor m in + let m = Const.Join_const c in + (* To give the best modality, we try to cross modality. *) + Const.modality_cross_left ~mm m - let linearity t = t.linearity + let zap_to_id = zap_to_floor - let min_with_uniqueness u = { min_mode with uniqueness = u } + let to_const_exn = function + | Const c -> c + | Undefined | Diff _ -> + Misc.fatal_error "Got infered modality but constant modality expected." - let max_with_uniqueness u = { max_mode with uniqueness = u } + let of_const c = Const c - let min_with_locality locality = { min_mode with locality } + let infer ~md_mode ~mode = Diff (md_mode, mode) - let max_with_locality locality = { max_mode with locality } + let max = Const Const.max + end - let min_with_linearity linearity = { min_mode with linearity } + module Comonadic = struct + module Mode = Value.Comonadic + + type 'a axis = (Mode.Const.t, 'a) Axis.t + + type error = + | Error : 'a axis * (('a, _) mode_comonadic, 'a) raw Solver.error -> error + + module Const = struct + type t = Meet_const of Mode.Const.t + + let id = Meet_const Mode.Const.max + + let max = Meet_const Mode.Const.max + + let sub left right : (_, error) Result.t = + match left, right with + | Meet_const c0, Meet_const c1 -> + if Mode.Const.le c0 c1 + then Ok () + else + let (Error (ax, { left; right })) = + Mode.axis_of_error { left = c0; right = c1 } + in + Error + (Error (ax, { left = Meet_with left; right = Meet_with right })) + + let compose : + type a l r. a axis -> ((a, l * r) mode_comonadic, a) raw -> t -> t = + fun ax a t -> + match a, t with + | Meet_with c0, Meet_const c -> + Meet_const (Mode.Const.meet (Mode.Const.max_with ax c0) c) + | Join_with _, Meet_const _ -> assert false + + let apply : type l r. t -> (l * r) Mode.t -> (l * r) Mode.t = + fun t x -> match t with Meet_const c -> Mode.meet_const c x + + let to_list = function + | Meet_const c -> + [ (let ax : _ Axis.t = Areality in + Atom (Comonadic ax, Meet_with (Axis.proj ax c))); + (let ax : _ Axis.t = Linearity in + Atom (Comonadic ax, Meet_with (Axis.proj ax c))); + (let ax : _ Axis.t = Portability in + Atom (Comonadic ax, Meet_with (Axis.proj ax c))) ] + + let print ppf = function + | Meet_const c -> Format.fprintf ppf "meet_const(%a)" Mode.Const.print c + end - let with_locality locality t = { t with locality } + type t = + | Const of Const.t + | Undefined + | Exactly of Mode.lr * Mode.l + + let sub_log left right ~log : (unit, error) Result.t = + match left, right with + | Const c0, Const c1 -> Const.sub c0 c1 + | Exactly (_mm, m), Const (Meet_const c) -> ( + (* Check for all x >= mm, m <= meet x c. Equivalent to check [m <= meet + mm c]. By definition of meet, equivalent to check [m <= mm] and [m <= + c]. The former is the precondition of [Exactly]. So we only check the + latter. *) + match Mode.submode_log m (Mode.of_const c) ~log with + | Ok () -> Ok () + | Error (Error (ax, { left; _ })) -> + Error + (Error + ( ax, + { left = Meet_with left; right = Meet_with (Axis.proj ax c) } + ))) + | Exactly (_, _m0), Exactly (_, _m1) -> + (* [m1] is a left mode, so there is no good way to check. + However, this branch only hit by [wrap_constraint_with_shape], + in which case LHS and RHS should be physically equal. *) + assert (left == right); + Ok () + | Const _, Exactly _ -> + Misc.fatal_error + "inferred modaltiy Exactly should not be on the RHS of sub." + | Undefined, _ | _, Undefined -> + Misc.fatal_error "modality Undefined should not be in sub." + + let id = Const Const.id + + let apply : type r. t -> (allowed * r) Mode.t -> Mode.l = + fun t x -> + match t with + | Const c -> Const.apply c x |> Mode.disallow_right + | Undefined -> + Misc.fatal_error "modality Undefined should not be applied." + | Exactly (_mm, m) -> m - let with_uniqueness uniqueness t = { t with uniqueness } + let print ppf = function + | Const c -> Const.print ppf c + | Undefined -> Format.fprintf ppf "undefined" + | Exactly _ -> Format.fprintf ppf "exactly" - let with_linearity linearity t = { t with linearity } + let infer ~md_mode ~mode = Exactly (md_mode, mode) - let to_local t = { t with locality = Regionality.local } + let max = Const Const.max - let to_global t = { t with locality = Regionality.global } + let zap_to_ceil = function + | Const c -> c + | Undefined -> Misc.fatal_error "modality Undefined should not be zapped." + | Exactly _ -> Const.id - let to_unique t = { t with uniqueness = Uniqueness.unique } + let zap_to_id = zap_to_ceil - let to_shared t = { t with uniqueness = Uniqueness.shared } + let zap_to_floor = function + | Const c -> c + | Undefined -> Misc.fatal_error "modality Undefined should not be zapped." + | Exactly (_, m) -> + let c = Mode.zap_to_floor m in + Const.Meet_const c - let to_once t = { t with linearity = Linearity.once } + let to_const_exn = function + | Const c -> c + | Undefined | Exactly _ -> + Misc.fatal_error "Got inferred modality but expected constant modality." - let to_many t = { t with linearity = Linearity.many } + let of_const c = Const c + end - let of_alloc { locality; uniqueness; linearity } = - let locality = Regionality.of_locality locality in - { locality; uniqueness; linearity } + module Value = struct + type error = + | Error : ('m, 'a, _) Value.axis * ('m, 'a) raw Solver.error -> error - let local_to_regional t = - { t with locality = Regionality.local_to_regional t.locality } + type equate_error = equate_step * error - let regional_to_global t = - { t with locality = Regionality.regional_to_global t.locality } + module Const = struct + module Monadic = Monadic.Const + module Comonadic = Comonadic.Const - let regional_to_local t = - { t with locality = Regionality.regional_to_local t.locality } + type t = (Monadic.t, Comonadic.t) monadic_comonadic - let global_to_regional t = - { t with locality = Regionality.global_to_regional t.locality } + let id = { monadic = Monadic.id; comonadic = Comonadic.id } - let regional_to_global_alloc t = - { t with locality = Regionality.regional_to_global_locality t.locality } + let sub t0 t1 : (unit, error) Result.t = + match Monadic.sub t0.monadic t1.monadic with + | Error (Error (ax, e)) -> Error (Error (Monadic ax, e)) + | Ok () -> ( + match Comonadic.sub t0.comonadic t1.comonadic with + | Ok () -> Ok () + | Error (Error (ax, e)) -> Error (Error (Comonadic ax, e))) - let regional_to_local_alloc t = - { t with locality = Regionality.regional_to_local_locality t.locality } + let equate = equate_from_submode' sub - let regional_to_global_locality t = - Regionality.regional_to_global_locality t.locality + let apply t { monadic; comonadic } = + let monadic = Monadic.apply t.monadic monadic in + let comonadic = Comonadic.apply t.comonadic comonadic in + { monadic; comonadic } - let regional_to_local_locality t = - Regionality.regional_to_local_locality t.locality + let compose ~then_:(Atom (ax, a)) t = + match ax with + | Monadic ax -> + let monadic = Monadic.compose ax a t.monadic in + { t with monadic } + | Comonadic ax -> + let comonadic = Comonadic.compose ax a t.comonadic in + { t with comonadic } - type error = - [ `Regionality - | `Locality - | `Uniqueness - | `Linearity ] + let singleton a = compose ~then_:a id - let submode t1 t2 = - match Regionality.submode t1.locality t2.locality with - | Error _ as e -> e - | Ok () -> ( - match Uniqueness.submode t1.uniqueness t2.uniqueness with - | Error () -> Error `Uniqueness - | Ok () -> ( - match Linearity.submode t1.linearity t2.linearity with - | Error () -> Error `Linearity - | Ok () as ok -> ok)) + let to_list { monadic; comonadic } = + Comonadic.to_list comonadic @ Monadic.to_list monadic + end - let submode_exn t1 t2 = - match submode t1 t2 with - | Ok () -> () - | Error _ -> invalid_arg "submode_exn" + type t = (Monadic.t, Comonadic.t) monadic_comonadic - let equate ({ locality = loc1; uniqueness = u1; linearity = lin1 } : t) - ({ locality = loc2; uniqueness = u2; linearity = lin2 } : t) = - match Regionality.equate loc1 loc2 with - | Ok () -> ( - match Uniqueness.equate u1 u2 with + let id : t = { monadic = Monadic.id; comonadic = Comonadic.id } + + let undefined : t = { monadic = Undefined; comonadic = Comonadic.Undefined } + + let apply t { monadic; comonadic } = + let monadic = Monadic.apply t.monadic monadic in + let comonadic = Comonadic.apply t.comonadic comonadic in + { monadic; comonadic } + + let sub_log t0 t1 ~log : (unit, error) Result.t = + match Monadic.sub_log t0.monadic t1.monadic ~log with + | Error (Error (ax, e)) -> Error (Error (Monadic ax, e)) | Ok () -> ( - match Linearity.equate lin1 lin2 with + match Comonadic.sub_log t0.comonadic t1.comonadic ~log with | Ok () -> Ok () - | Error () -> Error `Linearity) - | Error () -> Error `Uniqueness) - | Error e -> Error e - - let rec submode_meet t = function - | [] -> Ok () - | t' :: rest -> ( - match submode t t' with - | Ok () -> submode_meet t rest - | Error _ as err -> err) - - let join ts = - let locality = Regionality.join (List.map (fun t -> t.locality) ts) in - let uniqueness = Uniqueness.join (List.map (fun t -> t.uniqueness) ts) in - let linearity = Linearity.join (List.map (fun t -> t.linearity) ts) in - { locality; uniqueness; linearity } - - let constrain_upper t = - let locality = Regionality.constrain_upper t.locality in - let uniqueness = Uniqueness.constrain_upper t.uniqueness in - let linearity = Linearity.constrain_upper t.linearity in - { locality; uniqueness; linearity } - - let constrain_lower t = - let locality = Regionality.constrain_lower t.locality in - let uniqueness = Uniqueness.constrain_lower t.uniqueness in - let linearity = Linearity.constrain_lower t.linearity in - { locality; uniqueness; linearity } + | Error (Error (ax, e)) -> Error (Error (Comonadic ax, e))) - let newvar () = - let locality = Regionality.newvar () in - let uniqueness = Uniqueness.newvar () in - let linearity = Linearity.newvar () in - { locality; uniqueness; linearity } - - let newvar_below { locality; uniqueness; linearity } = - let locality, changed1 = Regionality.newvar_below locality in - let uniqueness, changed2 = Uniqueness.newvar_below uniqueness in - let linearity, changed3 = Linearity.newvar_below linearity in - { locality; uniqueness; linearity }, changed1 || changed2 || changed3 - - let newvar_above { locality; uniqueness; linearity } = - let locality, changed1 = Regionality.newvar_above locality in - let uniqueness, changed2 = Uniqueness.newvar_above uniqueness in - let linearity, changed3 = Linearity.newvar_above linearity in - { locality; uniqueness; linearity }, changed1 || changed2 || changed3 - - let check_const t = - let locality = Regionality.check_const t.locality in - let uniqueness = Uniqueness.check_const t.uniqueness in - let linearity = Linearity.check_const t.linearity in - { locality; uniqueness; linearity } - - let print' ?(verbose = true) ppf t = - Format.fprintf ppf "%a, %a, %a" - (Regionality.print' ~verbose ~label:"locality") - t.locality - (Uniqueness.print' ~verbose ~label:"uniqueness") - t.uniqueness - (Linearity.print' ~verbose ~label:"linearity") - t.linearity - - let print ppf t = print' ~verbose:true ppf t + let sub l r = try_with_log (sub_log l r) + + let equate m0 m1 = try_with_log (equate_from_submode sub_log m0 m1) + + let print ppf ({ monadic; comonadic } : t) = + Format.fprintf ppf "%a;%a" Monadic.print monadic Comonadic.print comonadic + + let infer ~md_mode ~mode : t = + let comonadic = + Comonadic.infer ~md_mode:md_mode.comonadic ~mode:mode.comonadic + in + let monadic = Monadic.infer ~md_mode:md_mode.monadic ~mode:mode.monadic in + { monadic; comonadic } + + let zap_to_id t = + let { monadic; comonadic } = t in + let comonadic = Comonadic.zap_to_id comonadic in + let monadic = Monadic.zap_to_id monadic in + { monadic; comonadic } + + let zap_to_floor t = + let { monadic; comonadic } = t in + let comonadic = Comonadic.zap_to_floor comonadic in + let monadic = Monadic.zap_to_floor monadic in + { monadic; comonadic } + + let to_const_exn t = + let { monadic; comonadic } = t in + let comonadic = Comonadic.to_const_exn comonadic in + let monadic = Monadic.to_const_exn monadic in + { monadic; comonadic } + + let of_const { monadic; comonadic } = + let comonadic = Comonadic.of_const comonadic in + let monadic = Monadic.of_const monadic in + { monadic; comonadic } + + let max = + let monadic = Monadic.max in + let comonadic = Comonadic.max in + { monadic; comonadic } + end end diff --git a/typing/mode.mli b/typing/mode.mli index 76ffa16cf57..68b1f5e147e 100644 --- a/typing/mode.mli +++ b/typing/mode.mli @@ -1,510 +1 @@ -(**************************************************************************) -(* *) -(* 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. *) -(* *) -(**************************************************************************) - -type changes - -val undo_changes : changes -> unit - -val change_log : (changes -> unit) ref - -module Locality : sig - module Const : sig - type t = - | Global - | Local - - val legacy : t - - val min : t - - val max : t - - val le : t -> t -> bool - - val join : t -> t -> t - - val meet : t -> t -> t - - val print : Format.formatter -> t -> unit - end - - type t - - val legacy : t - - val of_const : Const.t -> t - - val global : t - - val local : t - - val submode : t -> t -> (unit, unit) result - - val submode_exn : t -> t -> unit - - val equate : t -> t -> (unit, unit) result - - val join : t list -> t - - val constrain_upper : t -> Const.t - - val constrain_lower : t -> Const.t - - val newvar : unit -> t - - val newvar_below : t -> t * bool - - val newvar_above : t -> t * bool - - val check_const : t -> Const.t option - - val print' : ?verbose:bool -> ?label:string -> Format.formatter -> t -> unit - - val print : Format.formatter -> t -> unit -end - -module Regionality : sig - module Const : sig - type t = - | Global - | Regional - | Local - end - - type t - - type error = - [ `Regionality - | `Locality ] - - val global : t - - val regional : t - - val local : t - - val submode : t -> t -> (unit, error) result - - val of_locality : Locality.t -> t - - val regional_to_local : t -> t - - val global_to_regional : t -> t - - val local_to_regional : t -> t - - val regional_to_global : t -> t - - val regional_to_global_locality : t -> Locality.t - - val print : Format.formatter -> t -> unit -end - -module Uniqueness : sig - module Const : sig - type t = - | Unique - | Shared - - val legacy : t - - val min : t - - val max : t - - val le : t -> t -> bool - - val join : t -> t -> t - - val meet : t -> t -> t - - val print : Format.formatter -> t -> unit - end - - type t - - val legacy : t - - val of_const : Const.t -> t - - val unique : t - - val shared : t - - val submode : t -> t -> (unit, unit) result - - val submode_exn : t -> t -> unit - - val equate : t -> t -> (unit, unit) result - - val join : t list -> t - - val meet : t list -> t - - val constrain_upper : t -> Const.t - - val constrain_lower : t -> Const.t - - val newvar : unit -> t - - val newvar_below : t -> t * bool - - val newvar_above : t -> t * bool - - val check_const : t -> Const.t option - - val print' : ?verbose:bool -> ?label:string -> Format.formatter -> t -> unit - - val print : Format.formatter -> t -> unit -end - -module Linearity : sig - module Const : sig - type t = - | Many - | Once - - val legacy : t - - val min : t - - val max : t - - val le : t -> t -> bool - - val join : t -> t -> t - - val meet : t -> t -> t - - val print : Format.formatter -> t -> unit - - val to_dual : t -> Uniqueness.Const.t - - val of_dual : Uniqueness.Const.t -> t - end - - type t - - val legacy : t - - val of_const : Const.t -> t - - val to_dual : t -> Uniqueness.t - - val of_dual : Uniqueness.t -> t - - val once : t - - val many : t - - val submode : t -> t -> (unit, unit) result - - val submode_exn : t -> t -> unit - - val equate : t -> t -> (unit, unit) result - - val join : t list -> t - - val constrain_upper : t -> Const.t - - val constrain_lower : t -> Const.t - - val newvar : unit -> t - - val newvar_below : t -> t * bool - - val newvar_above : t -> t * bool - - val check_const : t -> Const.t option - - val print' : ?verbose:bool -> ?label:string -> Format.formatter -> t -> unit - - val print : Format.formatter -> t -> unit -end - -type ('a, 'b, 'c) modes = - { locality : 'a; - uniqueness : 'b; - linearity : 'c - } - -module Alloc : sig - module Const : sig - type t = (Locality.Const.t, Uniqueness.Const.t, Linearity.Const.t) modes - - val legacy : t - - val join : t -> t -> t - - val close_over : t -> t - - val partial_apply : t -> t - - val min_with_uniqueness : Uniqueness.Const.t -> t - end - - type t - - val legacy : t - - val local : t - - val unique : t - - val local_unique : t - - val prod : Locality.t -> Uniqueness.t -> Linearity.t -> t - - val of_const : Const.t -> t - - val is_const : t -> bool - - val min_mode : t - - val max_mode : t - - (** Projections to Locality, Uniqueness and Linearity *) - - val locality : t -> Locality.t - - val uniqueness : t -> Uniqueness.t - - val linearity : t -> Linearity.t - - type error = - [ `Locality - | `Uniqueness - | `Linearity ] - - val submode : t -> t -> (unit, error) result - - val submode_exn : t -> t -> unit - - val equate : t -> t -> (unit, error) result - - val join : t list -> t - - (* Force a mode variable to its upper bound *) - val constrain_upper : t -> Const.t - - (* Force a mode variable to its lower bound *) - val constrain_lower : t -> Const.t - - (* Force a mode variable to legacys *) - val constrain_legacy : t -> Const.t - - val newvar : unit -> t - - val newvar_below : t -> t * bool - - (* Same as [newvar_below] but only on the comonadic axes *) - val newvar_below_comonadic : t -> t * bool - - val newvar_above : t -> t * bool - - val with_locality : Locality.t -> t -> t - - val with_uniqueness : Uniqueness.t -> t -> t - - val with_linearity : Linearity.t -> t -> t - - val of_uniqueness : Uniqueness.t -> t - - val of_locality : Locality.t -> t - - val of_linearity : Linearity.t -> t - - val check_const : - t -> - ( Locality.Const.t option, - Uniqueness.Const.t option, - Linearity.Const.t option ) - modes - - val print' : ?verbose:bool -> Format.formatter -> t -> unit - - val print : Format.formatter -> t -> unit - - val close_over : t -> t - - val partial_apply : t -> t -end - -module Value : sig - module Const : sig - type t = (Regionality.Const.t, Uniqueness.Const.t, Linearity.Const.t) modes - end - - type t - - val legacy : t - - val regional : t - - val local : t - - val unique : t - - val regional_unique : t - - val local_unique : t - - val of_const : Const.t -> t - - val max_mode : t - - val min_mode : t - - (** Injections from Locality and Uniqueness into [Value_mode.t] *) - - (* The 'min_with_*' functions extend the min_mode, - the 'max_with_' functions extend the max_mode, - the 'with_*' functions extend given mode. - *) - val min_with_uniqueness : Uniqueness.t -> t - - val max_with_uniqueness : Uniqueness.t -> t - - val min_with_locality : Regionality.t -> t - - val max_with_locality : Regionality.t -> t - - val min_with_linearity : Linearity.t -> t - - val with_locality : Regionality.t -> t -> t - - val with_uniqueness : Uniqueness.t -> t -> t - - val with_linearity : Linearity.t -> t -> t - - (** Projections to Locality, Uniqueness and Linearity *) - - val locality : t -> Regionality.t - - val uniqueness : t -> Uniqueness.t - - val linearity : t -> Linearity.t - - (** Injections from [Alloc.t] into [Value_mode.t] *) - - (** [of_alloc] maps [Global] to [Global] and [Local] to [Local] *) - val of_alloc : Alloc.t -> t - - (** Kernel operators *) - - (** The kernel operator [local_to_regional] maps [Local] to - [Regional] and leaves the others unchanged. *) - val local_to_regional : t -> t - - (** The kernel operator [regional_to_global] maps [Regional] - to [Global] and leaves the others unchanged. *) - val regional_to_global : t -> t - - val to_global : t -> t - - val to_unique : t -> t - - val to_many : t -> t - - (** Closure operators *) - - (** The closure operator [regional_to_local] maps [Regional] - to [Local] and leaves the others unchanged. *) - val regional_to_local : t -> t - - (** The closure operator [global_to_regional] maps [Global] to - [Regional] and leaves the others unchanged. *) - val global_to_regional : t -> t - - val to_local : t -> t - - val to_shared : t -> t - - val to_once : t -> t - - (** Note that the kernal and closure operators are in the following - adjunction relationship: - {v - local_to_regional - -| regional_to_local - -| regional_to_global - -| global_to_regional - v} - - Equivalently, - {v - local_to_regional a <= b iff a <= regional_to_local b - regional_to_local a <= b iff a <= regional_to_global b - regional_to_global a <= b iff a <= global_to_regional b - v} - - As well as: - {v - to_global -| to_local - to_unique -| to_shared - v} - *) - - (** Versions of the operators that return [Alloc.t] *) - - (** Maps [Regional] to [Global] and leaves the others unchanged. *) - val regional_to_global_alloc : t -> Alloc.t - - (** Maps [Regional] to [Local] and leaves the others unchanged. *) - val regional_to_local_alloc : t -> Alloc.t - - (** Maps [Regional] to [Global] *) - val regional_to_global_locality : t -> Locality.t - - (** Maps [Regional] to [Local] *) - val regional_to_local_locality : t -> Locality.t - - type error = - [ `Regionality - | `Locality - | `Uniqueness - | `Linearity ] - - val submode : t -> t -> (unit, error) result - - val submode_exn : t -> t -> unit - - val equate : t -> t -> (unit, error) result - - val submode_meet : t -> t list -> (unit, error) result - - val join : t list -> t - - val constrain_upper : t -> Const.t - - val constrain_lower : t -> Const.t - - val newvar : unit -> t - - val newvar_below : t -> t * bool - - val newvar_above : t -> t * bool - - val check_const : - t -> - ( Regionality.Const.t option, - Uniqueness.Const.t option, - Linearity.Const.t option ) - modes - - val print' : ?verbose:bool -> Format.formatter -> t -> unit - - val print : Format.formatter -> t -> unit -end +include Mode_intf.S diff --git a/typing/mode_intf.mli b/typing/mode_intf.mli new file mode 100644 index 00000000000..51728a692ce --- /dev/null +++ b/typing/mode_intf.mli @@ -0,0 +1,555 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Zesen Qian, Jane Street, London *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Solver_intf + +(* While all our lattices are bi-Heyting algebras (see [mode.ml]), the extra + structure is not directly useful to the user, so we only expose the basic + lattice structure. *) +module type Lattice = sig + type t + + val min : t + + val max : t + + val legacy : t + + val le : t -> t -> bool + + val join : t -> t -> t + + val meet : t -> t -> t + + val print : Format.formatter -> t -> unit +end + +type equate_step = + | Left_le_right + | Right_le_left + +module type Common = sig + module Const : Lattice + + type error + + type equate_error = equate_step * error + + type 'd t constraint 'd = 'l * 'r + + (** Left-only mode *) + type l = (allowed * disallowed) t + + (** Right-only mode *) + type r = (disallowed * allowed) t + + (** Left-right mode *) + type lr = (allowed * allowed) t + + include Allow_disallow with type (_, _, 'd) sided = 'd t + + val min : lr + + val max : lr + + val legacy : lr + + val newvar : unit -> ('l * 'r) t + + val submode : (allowed * 'r) t -> ('l * allowed) t -> (unit, error) result + + val equate : lr -> lr -> (unit, equate_error) result + + val submode_exn : (allowed * 'r) t -> ('l * allowed) t -> unit + + val equate_exn : lr -> lr -> unit + + val join : (allowed * 'r) t list -> left_only t + + val meet : ('l * allowed) t list -> right_only t + + val newvar_above : (allowed * 'r) t -> ('l * 'r_) t * bool + + val newvar_below : ('l * allowed) t -> ('l_ * 'r) t * bool + + val print : ?verbose:bool -> unit -> Format.formatter -> ('l * 'r) t -> unit + + val of_const : Const.t -> ('l * 'r) t +end + +module type S = sig + type changes + + val undo_changes : changes -> unit + + val set_append_changes : (changes ref -> unit) -> unit + + type nonrec allowed = allowed + + type nonrec disallowed = disallowed + + type nonrec equate_step = equate_step + + type ('a, 'd) mode_monadic constraint 'd = 'l * 'r + + type ('a, 'd) mode_comonadic constraint 'd = 'l * 'r + + type ('a, 'b) monadic_comonadic = + { monadic : 'a; + comonadic : 'b + } + + module Locality : sig + module Const : sig + type t = + | Global + | Local + + include Lattice with type t := t + end + + type error = Const.t Solver.error + + include + Common + with module Const := Const + and type error := error + and type 'd t = (Const.t, 'd) mode_comonadic + + val global : lr + + val local : lr + + val zap_to_floor : (allowed * 'r) t -> Const.t + + val zap_to_ceil : ('l * allowed) t -> Const.t + + module Guts : sig + (** This module exposes some functions that allow callers to inspect modes + directly, which could be useful for error printing and dev tools (such as + merlin). Any usage of this in type checking should be pondered. *) + + (** Returns [Some c] if the given mode has been constrained to constant + [c]. see notes on [get_floor] in [solver_intf.mli] for cautions. *) + val check_const : (allowed * allowed) t -> Const.t option + + (** Similar to [check_const] but doesn't run the further constraining + needed for precise bounds. As a result, it is inexpensive and returns + a conservative result. I.e., it might return [None] for + fully-constrained modes. *) + val check_const_conservative : ('l * 'r) t -> Const.t option + end + end + + module Regionality : sig + module Const : sig + type t = + | Global + | Regional + | Local + + include Lattice with type t := t + end + + type error = Const.t Solver.error + + include + Common + with module Const := Const + and type error := error + and type 'd t = (Const.t, 'd) mode_comonadic + + val global : lr + + val regional : lr + + val local : lr + end + + module Linearity : sig + module Const : sig + type t = + | Many + | Once + + include Lattice with type t := t + end + + type error = Const.t Solver.error + + include + Common + with module Const := Const + and type error := error + and type 'd t = (Const.t, 'd) mode_comonadic + + val many : lr + + val once : lr + end + + module Portability : sig + module Const : sig + type t = + | Portable + | Nonportable + + include Lattice with type t := t + end + + type error = Const.t Solver.error + + include + Common + with module Const := Const + and type error := error + and type 'd t = (Const.t, 'd) mode_comonadic + end + + module Uniqueness : sig + module Const : sig + type t = + | Unique + | Shared + + include Lattice with type t := t + end + + type error = Const.t Solver.error + + include + Common + with module Const := Const + and type error := error + and type 'd t = (Const.t, 'd) mode_monadic + + val shared : lr + + val unique : lr + end + + module Contention : sig + module Const : sig + type t = + | Contended + | Uncontended + + include Lattice with type t := t + end + + type error = Const.t Solver.error + + include + Common + with module Const := Const + and type error := error + and type 'd t = (Const.t, 'd) mode_monadic + end + + type 'a comonadic_with = private 'a * Linearity.Const.t * Portability.Const.t + + type monadic = private Uniqueness.Const.t * Contention.Const.t + + module Axis : sig + (** ('p, 'r) t represents a projection from a product of type ['p] to an + element of type ['r]. *) + type ('p, 'r) t = + | Areality : ('a comonadic_with, 'a) t + | Linearity : ('areality comonadic_with, Linearity.Const.t) t + | Portability : ('areality comonadic_with, Portability.Const.t) t + | Uniqueness : (monadic, Uniqueness.Const.t) t + | Contention : (monadic, Contention.Const.t) t + + val print : Format.formatter -> ('p, 'r) t -> unit + end + + module type Mode := sig + module Areality : Common + + module Monadic : sig + module Const : Lattice with type t = monadic + + include Common with module Const := Const + + val imply : Const.t -> ('l * 'r) t -> (disallowed * 'r) t + end + + module Comonadic : sig + module Const : sig + include Lattice with type t = Areality.Const.t comonadic_with + + val eq : t -> t -> bool + + val print_axis : (t, 'a) Axis.t -> Format.formatter -> 'a -> unit + end + + type error = Error : (Const.t, 'a) Axis.t * 'a Solver.error -> error + + include Common with type error := error and module Const := Const + + val meet_const : Const.t -> ('l * 'r) t -> ('l * 'r) t + end + + (** Represents a mode axis in this product whose constant is ['a], and + whose variable is ['m] given the allowness ['d]. *) + type ('m, 'a, 'd) axis = + | Monadic : + (Monadic.Const.t, 'a) Axis.t + -> (('a, 'd) mode_monadic, 'a, 'd) axis + | Comonadic : + (Comonadic.Const.t, 'a) Axis.t + -> (('a, 'd) mode_comonadic, 'a, 'd) axis + + type ('a, 'b, 'c, 'd, 'e) modes = + { areality : 'a; + linearity : 'b; + uniqueness : 'c; + portability : 'd; + contention : 'e + } + + module Const : sig + include + Lattice + with type t = + ( Areality.Const.t, + Linearity.Const.t, + Uniqueness.Const.t, + Portability.Const.t, + Contention.Const.t ) + modes + + module Option : sig + type some = t + + type t = + ( Areality.Const.t option, + Linearity.Const.t option, + Uniqueness.Const.t option, + Portability.Const.t option, + Contention.Const.t option ) + modes + + val none : t + + val value : t -> default:some -> some + end + + val split : t -> (Monadic.Const.t, Comonadic.Const.t) monadic_comonadic + + val merge : (Monadic.Const.t, Comonadic.Const.t) monadic_comonadic -> t + + (** [diff a b] returns [None] for axes where [a] and [b] match, and [Some + a0] for axes where [a] is [a0] and [b] isn't. *) + val diff : t -> t -> Option.t + + (** Similar to [Alloc.close_over] but for constants *) + val close_over : t -> t + + (** Similar to [Alloc.partial_apply] but for constants *) + val partial_apply : t -> t + + (** Prints a constant on any axis. *) + val print_axis : ('m, 'a, 'd) axis -> Format.formatter -> 'a -> unit + end + + type error = Error : ('m, 'a, 'd) axis * 'a Solver.error -> error + + type 'd t = ('d Monadic.t, 'd Comonadic.t) monadic_comonadic + + include + Common + with module Const := Const + and type error := error + and type 'd t := 'd t + + module List : sig + (* No new types exposed to avoid too many type names *) + include Allow_disallow with type (_, _, 'd) sided = 'd t list + end + + val proj : ('m, 'a, 'l * 'r) axis -> ('l * 'r) t -> 'm + + val max_with : ('m, 'a, 'l * 'r) axis -> 'm -> (disallowed * 'r) t + + val min_with : ('m, 'a, 'l * 'r) axis -> 'm -> ('l * disallowed) t + + val meet_with : (_, 'a, _) axis -> 'a -> ('l * 'r) t -> ('l * 'r) t + + val join_with : (_, 'a, _) axis -> 'a -> ('l * 'r) t -> ('l * 'r) t + + val zap_to_legacy : lr -> Const.t + + val zap_to_ceil : ('l * allowed) t -> Const.t + + val comonadic_to_monadic : ('l * 'r) Comonadic.t -> ('r * 'l) Monadic.t + + val meet_const : Const.t -> ('l * 'r) t -> ('l * 'r) t + + val imply : Const.t -> ('l * 'r) t -> (disallowed * 'r) t + + (* The following two are about the scenario where we partially apply a + function [A -> B -> C] to [A] and get back [B -> C]. The mode of the + three are constrained. *) + + (** Returns the lower bound needed for [B -> C] in relation to [A] *) + val close_over : + (('l * allowed) Monadic.t, (allowed * 'r) Comonadic.t) monadic_comonadic -> + l + + (** Returns the lower bound needed for [B -> C] in relation to [A -> B -> C] *) + val partial_apply : (allowed * 'r) t -> l + end + + (** The most general mode. Used in most type checking, + including in value bindings in [Env] *) + module Value : Mode with module Areality := Regionality + + (** The mode on arrow types. Compared to [Value], it contains the [Locality] + axis instead of [Regionality] axis, as arrow types are exposed to users + and would be hard to understand if it involves [Regionality]. *) + module Alloc : Mode with module Areality := Locality + + module Const : sig + val alloc_as_value : Alloc.Const.t -> Value.Const.t + end + + (** Converts regional to local, identity otherwise *) + val regional_to_local : ('l * 'r) Regionality.t -> ('l * 'r) Locality.t + + (** Inject locality into regionality *) + val locality_as_regionality : ('l * 'r) Locality.t -> ('l * 'r) Regionality.t + + (** Converts regional to global, identity otherwise *) + val regional_to_global : ('l * 'r) Regionality.t -> ('l * 'r) Locality.t + + (** Similar to [locality_as_regionality], behaves as identity on other axes *) + val alloc_as_value : ('l * 'r) Alloc.t -> ('l * 'r) Value.t + + (** Similar to [local_to_regional], behaves as identity in other axes *) + val alloc_to_value_l2r : ('l * 'r) Alloc.t -> ('l * disallowed) Value.t + + (** Similar to [regional_to_local], behaves as identity on other axes *) + val value_to_alloc_r2l : ('l * 'r) Value.t -> ('l * 'r) Alloc.t + + (** Similar to [regional_to_global], behaves as identity on other axes *) + val value_to_alloc_r2g : ('l * 'r) Value.t -> ('l * 'r) Alloc.t + + module Modality : sig + type ('m, 'a) raw = + | Meet_with : 'a -> (('a, 'd) mode_comonadic, 'a) raw + (** [Meet_with c] takes [x] and returns [meet c x]. [c] can be [max] + in which case it's the identity modality. *) + | Join_with : 'a -> (('a, 'd) mode_monadic, 'a) raw + (** [Join_with c] takes [x] and returns [join c x]. [c] can be [min] + in which case it's the identity modality. *) + + (** An atom modality is a [raw] accompanied by the axis it acts on. *) + type t = Atom : ('m, 'a, _) Value.axis * ('m, 'a) raw -> t + + (** Test if the given modality is the identity modality. *) + val is_id : t -> bool + + (** Printing for debugging *) + val print : Format.formatter -> t -> unit + + module Value : sig + type atom := t + + type error = + | Error : ('m, 'a, _) Value.axis * ('m, 'a) raw Solver.error -> error + + type nonrec equate_error = equate_step * error + + module Const : sig + (** A modality that acts on [Value] modes. Conceptually it is a sequnce + of [atom] that acts on individual axes. *) + type t + + (** The identity modality. *) + val id : t + + (** Apply a modality on mode. *) + val apply : t -> ('l * 'r) Value.t -> ('l * 'r) Value.t + + (** [compose m t] returns the modality that is [m] after [t]. *) + val compose : then_:atom -> t -> t + + (** [singleton m] returns the modality containing only [m]. *) + val singleton : atom -> t + + (** Returns the list of [atom] in the given modality. The list is + commutative. *) + val to_list : t -> atom list + + (** [equate t0 t1] checks that [t0 = t1]. + Definition: [t0 = t1] iff [t0 <= t1] and [t1 <= t0]. *) + val equate : t -> t -> (unit, equate_error) Result.t + end + + (** A modality that acts on [Value] modes. Conceptually it is a sequnce of + [atom] that acts on individual axes. *) + type t + + (** The identity modality. *) + val id : t + + (** The undefined modality. *) + val undefined : t + + (** Apply a modality on a left mode. *) + val apply : t -> (allowed * 'r) Value.t -> Value.l + + (** [sub t0 t1] checks that [t0 <= t1]. + Definition: [t0 <= t1] iff [forall a. t0(a) <= t1(a)]. + + In case of failure, [Error (ax, {left; right})] is returned, where + [ax] is the axis on which the modalities disagree. [left] is the + projection of [t0] on [ax], and [right] is the projection of [t1] on + [ax]. *) + val sub : t -> t -> (unit, error) Result.t + + (** [equate t0 t1] checks that [t0 = t1]. + Definition: [t0 = t1] iff [t0 <= t1] and [t1 <= t0]. *) + val equate : t -> t -> (unit, equate_error) Result.t + + (** Printing for debugging. *) + val print : Format.formatter -> t -> unit + + (** Given [md_mode] the mode of a module, and [mode] the mode of a value + to be put in that module, return the inferred modality to be put on the + value description in the inferred module type. *) + val infer : md_mode:Value.lr -> mode:Value.l -> t + + (* The following zapping functions possibly mutate a potentially inferred + modality [m] to a constant modality [c]. The constant modality is + returned. [m <= c] holds, even after further mutations to [m]. *) + + (** Returns a const modality weaker than the given modality. *) + val zap_to_id : t -> Const.t + + (** Returns a const modality lowest (strongest) possible. *) + val zap_to_floor : t -> Const.t + + (** Asserts the given modality is a const modality, and returns it. *) + val to_const_exn : t -> Const.t + + (** Inject a constant modality. *) + val of_const : Const.t -> t + + (** The top modality; [sub x max] succeeds for any [x]. *) + val max : t + end + end +end diff --git a/typing/oprint.ml b/typing/oprint.ml index 4d7802b071f..7a976afd8d8 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -148,6 +148,37 @@ let rec print_typlist print_elem sep ppf = pp_print_space ppf (); print_typlist print_elem sep ppf tyl +let print_label_type ppf = + function + | Some s -> + pp_print_string ppf s; + pp_print_string ppf ":"; + | None -> () + +let print_label ppf = + function + | Some s -> + pp_print_string ppf "~"; + pp_print_string ppf s; + pp_print_string ppf ":"; + | None -> () + +let rec print_labeled_typlist print_elem sep ppf = + function + [] -> () + | [label, ty] -> + pp_open_box ppf 0; + print_label_type ppf label; + print_elem ppf ty; + pp_close_box ppf () + | (label, ty) :: tyl -> + pp_open_box ppf 0; + print_label_type ppf label; + print_elem ppf ty; + pp_close_box ppf (); + pp_print_string ppf sep; + pp_print_space ppf (); + print_labeled_typlist print_elem sep ppf tyl let print_out_string ppf s = let not_escaped = @@ -163,6 +194,10 @@ let print_out_string ppf s = else fprintf ppf "%S" s +external float32_format : string -> Obj.t -> string = "caml_format_float32" + +let float32_to_string f = Stdlib.valid_float_lexem (float32_format "%.9g" f) + let print_out_value ppf tree = let rec print_tree_1 ppf = function @@ -182,6 +217,9 @@ let print_out_value ppf tree = | Oval_float f -> parenthesize_if_neg ppf "%s" (float_repres f) (f < 0.0 || 1. /. f = neg_infinity) + | Oval_float32 f -> + let s = float32_to_string f in + parenthesize_if_neg ppf "%ss" s (String.starts_with ~prefix:"-" s) | Oval_string (_,_, Ostr_bytes) as tree -> pp_print_char ppf '('; print_simple_tree ppf tree; @@ -194,6 +232,7 @@ let print_out_value ppf tree = | Oval_int64 i -> fprintf ppf "%LiL" i | Oval_nativeint i -> fprintf ppf "%nin" i | Oval_float f -> pp_print_string ppf (float_repres f) + | Oval_float32 f -> fprintf ppf "%ss" (float32_to_string f) | Oval_char c -> fprintf ppf "%C" c | Oval_string (s, maxlen, kind) -> begin try @@ -228,7 +267,7 @@ let print_out_value ppf tree = | Oval_ellipsis -> raise Ellipsis | Oval_printer f -> f ppf | Oval_tuple tree_list -> - fprintf ppf "@[<1>(%a)@]" (print_tree_list print_tree_1 ",") tree_list + fprintf ppf "@[<1>(%a)@]" (print_labeled_tree_list print_tree_1 ",") tree_list | tree -> fprintf ppf "@[<1>(%a)@]" (cautious print_tree_1) tree and print_fields first ppf = function @@ -248,6 +287,17 @@ let print_out_value ppf tree = print_list false ppf tree_list in cautious (print_list true) ppf tree_list + and print_labeled_tree_list print_item sep ppf labeled_tree_list = + let rec print_list first ppf = + function + [] -> () + | (label, tree) :: labeled_tree_list -> + if not first then fprintf ppf "%s@ " sep; + print_label ppf label; + print_item ppf tree; + print_list false ppf labeled_tree_list + in + cautious (print_list true) ppf labeled_tree_list in cautious print_tree_1 ppf tree @@ -269,13 +319,27 @@ let rec print_list pr sep ppf = let pr_present = print_list (fun ppf s -> fprintf ppf "`%s" s) (fun ppf -> fprintf ppf "@ ") -let pr_var = Printast.tyvar +let pr_var = Pprintast.tyvar let ty_var ~non_gen ppf s = pr_var ppf (if non_gen then "_" ^ s else s) -let print_out_jkind ppf = function - | Olay_const lay -> fprintf ppf "%s" (Jkind.string_of_const lay) - | Olay_var v -> fprintf ppf "%s" v +let rec print_out_jkind_const ppf (ojkind : Outcometree.out_jkind_const) = + match ojkind with + | Ojkind_const_default -> fprintf ppf "_" + | Ojkind_const_abbreviation abbrev -> fprintf ppf "%s" abbrev + | Ojkind_const_mod (base, modes) -> + fprintf ppf "%a mod @[%a@]" print_out_jkind_const base + (pp_print_list + ~pp_sep:(fun ppf () -> fprintf ppf "@ ") + (fun ppf -> fprintf ppf "%s")) + modes + | Ojkind_const_with _ | Ojkind_const_kind_of _ -> + failwith "XXX unimplemented jkind syntax" + +let print_out_jkind ppf ojkind = + match ojkind with + | Ojkind_var v -> fprintf ppf "%s" v + | Ojkind_const jkind -> print_out_jkind_const ppf jkind let print_out_jkind_annot ppf = function | None -> () @@ -290,190 +354,161 @@ let pr_var_jkind ppf (v, l) = match l with let pr_var_jkinds = print_list pr_var_jkind (fun ppf -> fprintf ppf "@ ") -let join_locality lm1 lm2 = - match lm1, lm2 with - | Olm_local, _ -> Olm_local - | _, Olm_local -> Olm_local - | Olm_unknown, _ -> Olm_unknown - | _, Olm_unknown -> Olm_unknown - | Olm_global, Olm_global -> Olm_global - -let join_uniqueness u1 u2 = - match u1, u2 with - | Oum_shared, _ -> Oum_shared - | _, Oum_shared -> Oum_shared - | Oum_unknown, _ -> Oum_unknown - | _, Oum_unknown -> Oum_unknown - | Oum_unique, Oum_unique -> Oum_unique - -let join_linearity l1 l2 = - match l1, l2 with - | Olinm_once, _ - | _, Olinm_once -> Olinm_once - | Olinm_unknown, _ - | _, Olinm_unknown -> Olinm_unknown - | Olinm_many, Olinm_many -> Olinm_many - -let uniqueness_to_linearity = function - | Oum_unique -> Olinm_once - | Oum_shared -> Olinm_many - | Oum_unknown -> Olinm_unknown - -let join_modes m1 m2 = - { oam_locality = join_locality m1.oam_locality m2.oam_locality; - oam_uniqueness = join_uniqueness m1.oam_uniqueness m2.oam_uniqueness; - oam_linearity = join_linearity m1.oam_linearity m2.oam_linearity } - -let default_mode = - { oam_locality = Olm_global; - oam_uniqueness = Oum_shared; - oam_linearity = Olinm_many; } - -let close_over arg_mode = - let oam_locality = arg_mode.oam_locality in - let oam_uniqueness = Oum_shared in - let oam_linearity = - join_linearity - arg_mode.oam_linearity - (uniqueness_to_linearity arg_mode.oam_uniqueness) - in - { oam_locality; - oam_uniqueness; - oam_linearity } - -let partial_apply alloc_mode = - let oam_locality = alloc_mode.oam_locality in - let oam_uniqueness = Oum_shared in - let oam_linearity = alloc_mode.oam_linearity in - { oam_locality; oam_uniqueness; oam_linearity } - -(* Following functions are used to check if the return mode can omitted in the - case of currying *) -let locality_agree expected real = - match expected, real with - (* If expected and real matches, can omit *) - | Olm_local, Olm_local | Olm_global, Olm_global -> true - (* If the real mode is unknown, we'd rather not put extra parentheses, because - we wouldn't put "unknown" around the parentheses either, which would make - the printing even less precise *) - | _, Olm_unknown -> true - (* In all other cases (the real mode is known), we will print the mode to be - safe*) - | _, _ -> false - -let uniqueness_agree expected real = - match expected, real with - | Oum_unique, Oum_unique | Oum_shared, Oum_shared -> true - | _, Oum_unknown -> true - | _, _ -> false - -let linearity_agree expected real = - match expected, real with - | Olinm_many, Olinm_many | Olinm_once, Olinm_once -> true - | _, Olinm_unknown -> true - | _, _ -> false - -let mode_agree expected real = - locality_agree expected.oam_locality real.oam_locality && - uniqueness_agree expected.oam_uniqueness real.oam_uniqueness && - linearity_agree expected.oam_linearity real.oam_linearity - -let print_out_jkind ppf = function - | Olay_const lay -> fprintf ppf "%s" (Jkind.string_of_const lay) - | Olay_var v -> fprintf ppf "%s" v - -let is_local mode = - match mode.oam_locality with - | Olm_local -> true +(* NON-LEGACY MODES + Here, we are printing mode annotations even if the mode extension is + disabled. Mode extension being disabled means mode annotations are + disallowed in parsing of this file, but non-legacy modes might still pop + up. For example, the current file might cite values from other files that + mention non-legacy modes *) +let print_out_mode_legacy ppf = function + | Omd_local -> fprintf ppf "local_" + | Omd_unique -> fprintf ppf "unique_" + | Omd_once -> fprintf ppf "once_" + +let print_out_mode_new = pp_print_string + +let print_out_mode_legacy_space ppf m = + print_out_mode_legacy ppf m; + pp_print_space ppf () + +let print_out_modes_legacy ppf l = + pp_print_list print_out_mode_legacy_space ppf l + +let print_out_modes_new ppf l = + (match l with + | [] -> () + | _ -> pp_print_string ppf " @ "); + pp_print_list ~pp_sep:pp_print_space print_out_mode_new ppf l + +let partition_modes l = + List.partition_map + (function + | Omd_legacy m -> Left m + | Omd_new m -> Right m + ) l + +(* Labeled tuples with the first element labeled sometimes require parens. *) +let is_initially_labeled_tuple ty = + match ty with + | Otyp_tuple ((Some _, _) :: _) -> true | _ -> false -let is_unique mode = - match mode.oam_uniqueness with - | Oum_unique -> true - | _ -> false +let print_out_modality_legacy ppf = function + | Ogf_global -> Format.fprintf ppf "global_" -let is_once mode = - match mode.oam_linearity with - | Olinm_once -> true - | _ -> false +let print_out_modality ppf = function + | Ogf_legacy m -> print_out_modality_legacy ppf m + | Ogf_new m -> pp_print_string ppf m -let rec print_out_type_0 mode ppf = +let print_out_modalities_new ppf l = + match l with + | [] -> () + | _ -> + pp_print_space ppf (); + pp_print_string ppf "@@"; + pp_print_space ppf (); + pp_print_list ~pp_sep:pp_print_space pp_print_string ppf l + +let print_out_modalities_legacy = + pp_print_list + (fun ppf m -> + print_out_modality_legacy ppf m; + pp_print_space ppf ()) + +let partition_modalities l = + List.partition_map (function + | Ogf_legacy m -> Left m + | Ogf_new m -> Right m + ) l + +let rec print_out_type_0 ppf = function | Otyp_alias {non_gen; aliased; alias } -> fprintf ppf "@[%a@ as %a@]" - (print_out_type_0 mode) aliased + print_out_type_0 aliased (ty_var ~non_gen) alias | Otyp_poly ([], ty) -> - print_out_type_0 mode ppf ty (* no "." if there are no vars *) + print_out_type_0 ppf ty (* no "." if there are no vars *) | Otyp_poly (sl, ty) -> fprintf ppf "@[%a.@ %a@]" pr_var_jkinds sl - (print_out_type_0 mode) ty + print_out_type_0 ty | ty -> - print_out_type_1 mode ppf ty - -and print_out_type_mode mode ppf ty = - let is_local = is_local mode in - let is_unique = is_unique mode in - let is_once = is_once mode in - if (not is_local || Language_extension.is_enabled Local) && - (not is_unique || Language_extension.is_enabled Unique) && - (not is_once || Language_extension.is_enabled Unique) - (* this branch does not need attributes at all *) - then begin - if is_local then begin - pp_print_string ppf "local_"; - pp_print_space ppf () end; - if is_unique then begin - pp_print_string ppf "unique_"; - pp_print_space ppf () end; - if is_once then begin - pp_print_string ppf "once_"; - pp_print_space ppf () end; - print_out_type_2 mode ppf ty end - else - (* otherwise we would rather print everything in attributes - even if extensions are enabled *) - let ty = if is_unique then Otyp_attribute (ty, {oattr_name="unique"}) else ty in - let ty = if is_local then Otyp_attribute (ty, {oattr_name="local"}) else ty in - let ty = if is_once then Otyp_attribute (ty, {oattr_name="once"}) else ty in - print_out_type ppf ty - -and print_out_type_1 mode ppf = + print_out_type_1 ppf ty + +(* We must parenthesize a labeled tuple with the first element labeled when: + - It is an argument to a function ([~arg]) + - Or, there is at least one mode to print. + *) +and print_out_type_mode ~arg mode ppf ty = + let m_legacy, m_new = partition_modes mode in + let has_modes = + match m_legacy with + | [] -> false + | _ -> true + in + let parens = + is_initially_labeled_tuple ty + && (arg || has_modes) + in + print_out_modes_legacy ppf m_legacy; + if parens then + pp_print_char ppf '('; + print_out_type_2 ppf ty; + if parens then + pp_print_char ppf ')'; + print_out_modes_new ppf m_new + +and print_out_type_1 ppf = function | Otyp_arrow (lab, am, ty1, rm, ty2) -> pp_open_box ppf 0; - if lab <> "" then (pp_print_string ppf lab; pp_print_char ppf ':'); - print_out_arg am ppf ty1; + let print_type () = print_out_arg am ppf ty1 in + (match lab with + | Nolabel -> print_type () + | Labelled l -> + pp_print_string ppf l; pp_print_char ppf ':'; print_type () + | Position l -> + pp_print_string ppf l; + pp_print_string ppf ":[%call_pos]" + | Optional l -> + pp_print_string ppf ("?" ^ l); pp_print_char ppf ':'; print_type ()); pp_print_string ppf " ->"; pp_print_space ppf (); - let mode = - join_modes - (partial_apply mode) - (close_over am) - in - print_out_ret mode rm ppf ty2; + print_out_ret rm ppf ty2; pp_close_box ppf () - | ty -> print_out_type_mode mode ppf ty + | ty -> print_out_type_2 ppf ty and print_out_arg am ppf ty = - print_out_type_mode am ppf ty + print_out_type_mode ~arg:true am ppf ty -and print_out_ret mode rm ppf = +and print_out_ret rm ppf = function - (* the 'mode' argument only has meaning if we are talking about closure *) | Otyp_arrow _ as ty -> - if mode_agree mode rm - then print_out_type_1 rm ppf ty - else print_out_type_mode rm ppf ty - | ty -> print_out_type_mode rm ppf ty + begin match rm with + | Orm_not_arrow _ -> assert false + | Orm_no_parens -> + print_out_type_1 ppf ty + | Orm_parens rm -> + let m_legacy, m_new = partition_modes rm in + print_out_modes_legacy ppf m_legacy; + pp_print_char ppf '('; + print_out_type_1 ppf ty; + pp_print_char ppf ')'; + print_out_modes_new ppf m_new + end + | ty -> + match rm with + | Orm_not_arrow rm -> print_out_type_mode ~arg:false rm ppf ty + | _ -> assert false -and print_out_type_2 mode ppf = +and print_out_type_2 ppf = function - Otyp_tuple tyl -> - fprintf ppf "@[<0>%a@]" (print_typlist print_simple_out_type " *") tyl - | ty -> print_out_type_3 mode ppf ty -and print_out_type_3 mode ppf = + | Otyp_tuple tyl -> + fprintf + ppf "@[<0>%a@]" (print_labeled_typlist print_simple_out_type " *") tyl + | ty -> print_out_type_3 ppf ty +and print_out_type_3 ppf = function Otyp_class (id, tyl) -> fprintf ppf "@[%a#%a@]" print_typargs tyl print_ident id @@ -508,7 +543,7 @@ and print_out_type_3 mode ppf = | Otyp_alias _ | Otyp_poly _ | Otyp_arrow _ | Otyp_tuple _ as ty -> pp_open_box ppf 1; pp_print_char ppf '('; - print_out_type_0 mode ppf ty; + print_out_type_0 ppf ty; pp_print_char ppf ')'; pp_close_box ppf () | Otyp_abstract | Otyp_open @@ -526,15 +561,15 @@ and print_out_type_3 mode ppf = fprintf ppf ")@]" | Otyp_attribute (t, attr) -> fprintf ppf "@[<1>(%a [@@%s])@]" - (print_out_type_0 mode) t attr.oattr_name + print_out_type_0 t attr.oattr_name | Otyp_jkind_annot (t, lay) -> fprintf ppf "@[<1>(%a@ :@ %a)@]" - (print_out_type_0 mode) t + print_out_type_0 t print_out_jkind lay and print_out_type ppf typ = - print_out_type_0 default_mode ppf typ + print_out_type_0 ppf typ and print_simple_out_type ppf typ = - print_out_type_3 default_mode ppf typ + print_out_type_3 ppf typ and print_record_decl ppf lbls = fprintf ppf "{%a@;<1 -2>}" (print_list_init print_out_label (fun ppf -> fprintf ppf "@ ")) lbls @@ -567,24 +602,30 @@ and print_typargs ppf = pp_print_char ppf ')'; pp_close_box ppf (); pp_print_space ppf () -and print_out_label ppf (name, mut_or_gbl, arg) = - if Language_extension.is_enabled Local then - let flag = - match mut_or_gbl with - | Ogom_mutable -> "mutable " - | Ogom_global -> "global_ " - | Ogom_immutable -> "" - in - fprintf ppf "@[<2>%s%s :@ %a@];" flag name print_out_type arg - else - match mut_or_gbl with - | Ogom_mutable -> fprintf ppf "@[mutable %s :@ %a@];" name print_out_type arg - | Ogom_immutable -> fprintf ppf "@[%s :@ %a@];" name print_out_type arg - | Ogom_global -> fprintf ppf "@[%s :@ %a@];" name print_out_type - (Otyp_attribute (arg, {oattr_name="global"})) +and print_out_label ppf (name, mut, arg, gbl) = + (* See the notes [NON-LEGACY MODES] *) + let mut = + match mut with + | Om_immutable -> "" + | Om_mutable None -> "mutable " + | Om_mutable (Some s) -> "mutable(" ^ s ^ ") " + in + let m_legacy, m_new = partition_modalities gbl in + fprintf ppf "@[<2>%s%a%s :@ %a%a@];" + mut + print_out_modalities_legacy m_legacy + name + print_out_type arg + print_out_modalities_new m_new let out_label = ref print_out_label +let out_modality = ref print_out_modality + +let out_jkind_const = ref print_out_jkind_const + +let out_jkind = ref print_out_jkind + let out_type = ref print_out_type let out_type_args = ref print_typargs @@ -629,8 +670,17 @@ let rec print_out_class_type ppf = in fprintf ppf "@[%a%a@]" pr_tyl tyl print_ident id | Octy_arrow (lab, ty, cty) -> - fprintf ppf "@[%s%a ->@ %a@]" (if lab <> "" then lab ^ ":" else "") - (print_out_type_2 default_mode) ty print_out_class_type cty + let print_type = print_out_type_2 in + let label, print_type = match lab with + | Nolabel -> "", print_type + | Labelled l -> l ^ ":", print_type + | Position l -> l ^ ":", fun ppf _ -> pp_print_string ppf "[%call_pos]" + | Optional l -> "?" ^ l ^ ":", print_type + in + fprintf ppf "@[%s%a ->@ %a@]" + label + print_type ty + print_out_class_type cty | Octy_signature (self_ty, csil) -> let pr_param ppf = function @@ -831,7 +881,7 @@ and print_out_sig_item ppf = | Orec_first -> "type" | Orec_next -> "and") ppf td - | Osig_value { oval_name; oval_type; + | Osig_value { oval_name; oval_type; oval_modalities; oval_prims; oval_attributes } -> let kwd = if oval_prims = [] then "val" else "external" in let pr_prims ppf = @@ -841,8 +891,9 @@ and print_out_sig_item ppf = fprintf ppf "@ = \"%s\"" s; List.iter (fun s -> fprintf ppf "@ \"%s\"" s) sl in - fprintf ppf "@[<2>%s %a :@ %a%a%a@]" kwd value_ident oval_name + fprintf ppf "@[<2>%s %a :@ %a%a%a%a@]" kwd value_ident oval_name !out_type oval_type + print_out_modalities_new oval_modalities pr_prims oval_prims (fun ppf -> List.iter (fun a -> fprintf ppf "@ [@@@@%s]" a.oattr_name)) oval_attributes @@ -918,18 +969,10 @@ and print_out_type_decl kwd ppf td = print_unboxed and print_simple_out_gf_type ppf (ty, gf) = - let locals_enabled = Language_extension.is_enabled Local in - match gf with - | Ogf_global -> - if locals_enabled then begin - pp_print_string ppf "global_"; - pp_print_space ppf (); - print_simple_out_type ppf ty - end else begin - print_out_type ppf (Otyp_attribute (ty, {oattr_name="global"})) - end - | Ogf_unrestricted -> - print_simple_out_type ppf ty + let m_legacy, m_new = partition_modalities gf in + print_out_modalities_legacy ppf m_legacy; + print_simple_out_type ppf ty; + print_out_modalities_new ppf m_new and print_out_constr_args ppf tyl = print_typlist print_simple_out_gf_type " *" ppf tyl diff --git a/typing/oprint.mli b/typing/oprint.mli index f085b799251..2510f727391 100644 --- a/typing/oprint.mli +++ b/typing/oprint.mli @@ -18,12 +18,16 @@ open Outcometree val out_ident : (formatter -> out_ident -> unit) ref val out_value : (formatter -> out_value -> unit) ref -val out_label : (formatter -> string * out_mutable_or_global * out_type -> unit) ref +val out_label : (formatter -> string * out_mutability * out_type + * out_modality list -> unit) ref +val out_modality : (formatter -> out_modality -> unit) ref +val out_jkind_const : (formatter -> out_jkind_const -> unit) ref +val out_jkind : (formatter -> out_jkind -> unit) ref val out_type : (formatter -> out_type -> unit) ref val out_type_args : (formatter -> out_type list -> unit) ref val out_constr : (formatter -> out_constructor -> unit) ref val out_constr_args : - (formatter -> ((out_type * out_global) list) -> unit) ref + (formatter -> ((out_type * out_modality list) list) -> unit) ref val out_class_type : (formatter -> out_class_type -> unit) ref val out_module_type : (formatter -> out_module_type -> unit) ref val out_sig_item : (formatter -> out_sig_item -> unit) ref diff --git a/typing/outcometree.mli b/typing/outcometree.mli index efc5dc61b20..fefee674be4 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -44,6 +44,7 @@ type out_value = | Oval_constr of out_ident * out_value list | Oval_ellipsis | Oval_float of float + | Oval_float32 of Obj.t (* We cannot use the [float32] type in the compiler. *) | Oval_int of int | Oval_int32 of int32 | Oval_int64 of int64 @@ -53,44 +54,89 @@ type out_value = | Oval_record of (out_ident * out_value) list | Oval_string of string * int * out_string (* string, size-to-print, kind *) | Oval_stuff of string - | Oval_tuple of out_value list + | Oval_tuple of (string option * out_value) list | Oval_variant of string * out_value option -type out_jkind = - | Olay_const of Jane_asttypes.const_jkind - | Olay_var of string -type out_type_param = +type out_modality_legacy = Ogf_global + +type out_modality_new = string + +type out_modality = + | Ogf_legacy of out_modality_legacy + | Ogf_new of out_modality_new + +type out_mutability = + | Om_immutable + | Om_mutable of string option + + + +(** This definition avoids a cyclic dependency between Outcometree and Types. *) +type arg_label = + | Nolabel + | Labelled of string + | Optional of string + | Position of string + +type out_mode_legacy = + | Omd_local + | Omd_unique + | Omd_once + +type out_mode_new = string + +type out_mode = + | Omd_legacy of out_mode_legacy + | Omd_new of out_mode_new + +type out_arg_mode = out_mode list + +type out_ret_mode = + | Orm_not_arrow of out_mode list + (** The ret type is not arrow, with modes annotating. *) + | Orm_no_parens + (** The ret type is arrow, and no need to print parens around the arrow *) + | Orm_parens of out_mode list + (** The ret type is arrow, and need to print parens around the arrow, with + modes annotating. *) + +(** Represents a constant jkind *) +type out_jkind_const = + | Ojkind_const_default + | Ojkind_const_abbreviation of string + | Ojkind_const_mod of out_jkind_const * string list + | Ojkind_const_with of out_jkind_const * out_type + | Ojkind_const_kind_of of out_type + +and out_jkind = + | Ojkind_const of out_jkind_const + | Ojkind_var of string + +and out_type_param = { oparam_name : string; oparam_variance : Asttypes.variance; oparam_injectivity : Asttypes.injectivity; oparam_jkind : out_jkind option } -type out_mutable_or_global = - | Ogom_mutable - | Ogom_global - | Ogom_immutable - -type out_global = - | Ogf_global - | Ogf_unrestricted - (* should be empty if all the jkind annotations are missing *) -type out_vars_jkinds = (string * out_jkind option) list +and out_vars_jkinds = (string * out_jkind option) list -type out_type = +and out_type = | Otyp_abstract | Otyp_open | Otyp_alias of {non_gen:bool; aliased:out_type; alias:string} - | Otyp_arrow of string * out_alloc_mode * out_type * out_alloc_mode * out_type + | Otyp_arrow of arg_label * out_arg_mode * out_type * out_ret_mode * out_type + (* INVARIANT: the [out_ret_mode] is [Orm_not_arrow] unless the RHS [out_type] + is [Otyp_arrow] *) | Otyp_class of out_ident * out_type list | Otyp_constr of out_ident * out_type list | Otyp_manifest of out_type * out_type | Otyp_object of { fields: (string * out_type) list; open_row:bool} - | Otyp_record of (string * out_mutable_or_global * out_type) list + | Otyp_record of (string * out_mutability * out_type * out_modality list) list | Otyp_stuff of string | Otyp_sum of out_constructor list - | Otyp_tuple of out_type list + | Otyp_tuple of (string option * out_type) list | Otyp_var of bool * string | Otyp_variant of out_variant * bool * (string list) option | Otyp_poly of out_vars_jkinds * out_type @@ -102,7 +148,7 @@ type out_type = and out_constructor = { ocstr_name: string; - ocstr_args: (out_type * out_global) list; + ocstr_args: (out_type * out_modality list) list; ocstr_return_type: (out_vars_jkinds * out_type) option; } @@ -110,29 +156,9 @@ and out_variant = | Ovar_fields of (string * bool * out_type list) list | Ovar_typ of out_type -and out_locality = - | Olm_local - | Olm_global - | Olm_unknown - -and out_uniqueness = - | Oum_unique - | Oum_shared - | Oum_unknown - -and out_linearity = - | Olinm_many - | Olinm_once - | Olinm_unknown - -and out_alloc_mode = - { oam_locality : out_locality; - oam_uniqueness : out_uniqueness; - oam_linearity : out_linearity } - type out_class_type = | Octy_constr of out_ident * out_type list - | Octy_arrow of string * out_type * out_class_type + | Octy_arrow of arg_label * out_type * out_class_type | Octy_signature of out_type option * out_class_sig_item list and out_class_sig_item = | Ocsg_constraint of out_type * out_type @@ -176,7 +202,7 @@ and out_extension_constructor = { oext_name: string; oext_type_name: string; oext_type_params: string list; - oext_args: (out_type * out_global) list; + oext_args: (out_type * out_modality list) list; oext_ret_type: (out_vars_jkinds * out_type) option; oext_private: Asttypes.private_flag } and out_type_extension = @@ -187,6 +213,8 @@ and out_type_extension = and out_val_decl = { oval_name: string; oval_type: out_type; + oval_modalities : out_modality_new list; + (* Modalities on value descriptions are always new, even for [global_] *) oval_prims: string list; oval_attributes: out_attribute list } and out_rec_status = diff --git a/typing/parmatch.ml b/typing/parmatch.ml index a7b79f669b4..6c5604bb26f 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -20,6 +20,30 @@ open Asttypes open Types open Typedtree +type error = Float32_match + +exception Error of error + +let raise_matched_float32 () = raise (Error Float32_match) + +type 'pattern parmatch_case = + { pattern : 'pattern; + has_guard : bool; + needs_refute : bool; + } + +let typed_case { c_lhs; c_guard; c_rhs } = + { pattern = c_lhs; + has_guard = Option.is_some c_guard; + needs_refute = (c_rhs.exp_desc = Texp_unreachable); + } + +let untyped_case { Parsetree.pc_lhs; pc_guard; pc_rhs } = + { pattern = pc_lhs; + has_guard = Option.is_some pc_guard; + needs_refute = (pc_rhs.pexp_desc = Parsetree.Pexp_unreachable); + } + (*************************************) (* Utilities for building patterns *) (*************************************) @@ -37,7 +61,7 @@ let omega_list = Patterns.omega_list let extra_pat = make_pat (Tpat_var (Ident.create_local "+", mknoloc "+", - Uid.internal_not_actually_unique, Mode.Value.max_mode)) + Uid.internal_not_actually_unique, Mode.Value.disallow_right Mode.Value.max)) Ctype.none Env.empty @@ -130,20 +154,32 @@ let all_coherent column = | Const_int32 _, Const_int32 _ | Const_int64 _, Const_int64 _ | Const_nativeint _, Const_nativeint _ + | Const_unboxed_int32 _, Const_unboxed_int32 _ + | Const_unboxed_int64 _, Const_unboxed_int64 _ + | Const_unboxed_nativeint _, Const_unboxed_nativeint _ | Const_float _, Const_float _ + | Const_float32 _, Const_float32 _ + | Const_unboxed_float _, Const_unboxed_float _ + | Const_unboxed_float32 _, Const_unboxed_float32 _ | Const_string _, Const_string _ -> true | ( Const_char _ | Const_int _ | Const_int32 _ | Const_int64 _ | Const_nativeint _ + | Const_unboxed_int32 _ + | Const_unboxed_int64 _ + | Const_unboxed_nativeint _ | Const_float _ + | Const_float32 _ + | Const_unboxed_float _ + | Const_unboxed_float32 _ | Const_string _), _ -> false end | Tuple l1, Tuple l2 -> l1 = l2 | Record (lbl1 :: _), Record (lbl2 :: _) -> Array.length lbl1.lbl_all = Array.length lbl2.lbl_all - | Array (am1, _), Array (am2, _) -> am1 = am2 + | Array (am1, _, _), Array (am2, _, _) -> am1 = am2 | Any, _ | _, Any | Record [], Record [] @@ -240,17 +276,24 @@ let is_absent_pat d = let const_compare x y = match x,y with + | Const_unboxed_float f1, Const_unboxed_float f2 | Const_float f1, Const_float f2 -> Stdlib.compare (float_of_string f1) (float_of_string f2) + | Const_unboxed_float32 _, _ + | Const_float32 _, _ -> raise_matched_float32 () | Const_string (s1, _, _), Const_string (s2, _, _) -> String.compare s1 s2 | (Const_int _ |Const_char _ |Const_string (_, _, _) |Const_float _ + |Const_unboxed_float _ |Const_int32 _ |Const_int64 _ |Const_nativeint _ + |Const_unboxed_int32 _ + |Const_unboxed_int64 _ + |Const_unboxed_nativeint _ ), _ -> Stdlib.compare x y let records_args l1 l2 = @@ -297,12 +340,13 @@ module Compat l1=l2 && ocompat op1 op2 | Tpat_constant c1, Tpat_constant c2 -> const_compare c1 c2 = 0 - | Tpat_tuple ps, Tpat_tuple qs -> compats ps qs + | Tpat_tuple labeled_ps, Tpat_tuple labeled_qs -> + tuple_compat labeled_ps labeled_qs | Tpat_lazy p, Tpat_lazy q -> compat p q | Tpat_record (l1,_),Tpat_record (l2,_) -> let ps,qs = records_args l1 l2 in compats ps qs - | Tpat_array (am1, ps), Tpat_array (am2, qs) -> + | Tpat_array (am1, _, ps), Tpat_array (am2, _, qs) -> am1 = am2 && List.length ps = List.length qs && compats ps qs @@ -318,6 +362,13 @@ module Compat | p::ps, q::qs -> compat p q && compats ps qs | _,_ -> false + and tuple_compat labeled_ps labeled_qs = match labeled_ps,labeled_qs with + | [], [] -> true + | (p_label, p)::labeled_ps, (q_label, q)::labeled_qs -> + Option.equal String.equal p_label q_label + && compat p q && tuple_compat labeled_ps labeled_qs + | _,_ -> false + end module SyntacticCompat = @@ -365,7 +416,7 @@ let simple_match d h = | Lazy, Lazy -> true | Record _, Record _ -> true | Tuple len1, Tuple len2 -> len1 = len2 - | Array (am1, len1), Array (am2, len2) -> am1 = am2 && len1 = len2 + | Array (am1, _, len1), Array (am2, _, len2) -> am1 = am2 && len1 = len2 | _, Any -> true | _, _ -> false @@ -405,8 +456,8 @@ let simple_match_args discr head args = | Variant { has_arg = true } | Lazy -> [Patterns.omega] | Record lbls -> omega_list lbls - | Array (_, len) - | Tuple len -> Patterns.omegas len + | Array (_, _, len) -> Patterns.omegas len + | Tuple lbls -> omega_list lbls | Variant { has_arg = false } | Any | Constant _ -> [] @@ -489,17 +540,17 @@ let rec read_args xs r = match xs,r with let do_set_args ~erase_mutable q r = match q with | {pat_desc = Tpat_tuple omegas} -> - let args,rest = read_args omegas r in - make_pat (Tpat_tuple args) q.pat_type q.pat_env::rest + let args,rest = read_args (List.map snd omegas) r in + make_pat + (Tpat_tuple + (List.map2 (fun (lbl, _) arg -> lbl, arg) omegas args)) + q.pat_type q.pat_env::rest | {pat_desc = Tpat_record (omegas,closed)} -> let args,rest = read_args omegas r in make_pat (Tpat_record (List.map2 (fun (lid, lbl,_) arg -> - if - erase_mutable && - (match lbl.lbl_mut with - | Mutable -> true | Immutable -> false) + if erase_mutable && Types.is_mutable lbl.lbl_mut then lid, lbl, omega else @@ -529,10 +580,10 @@ let do_set_args ~erase_mutable q r = match q with make_pat (Tpat_lazy arg) q.pat_type q.pat_env::rest | _ -> fatal_error "Parmatch.do_set_args (lazy)" end -| {pat_desc = Tpat_array (am, omegas)} -> +| {pat_desc = Tpat_array (am, arg_sort, omegas)} -> let args,rest = read_args omegas r in make_pat - (Tpat_array (am, args)) q.pat_type q.pat_env:: + (Tpat_array (am, arg_sort, args)) q.pat_type q.pat_env:: rest | {pat_desc=Tpat_constant _|Tpat_any} -> q::r (* case any is used in matching.ml *) @@ -736,7 +787,7 @@ let close_variant env row = let more' = if static then Btype.newgenty Tnil - else Btype.newgenvar (Jkind.value ~why:Row_variable) + else Btype.newgenvar (Jkind.Primitive.value ~why:Row_variable) in (* this unification cannot fail *) Ctype.unify env more @@ -852,7 +903,8 @@ let pats_of_type env ty = | Has_no_typedecl -> begin match get_desc (Ctype.expand_head env ty) with Ttuple tl -> - [make_pat (Tpat_tuple (omegas (List.length tl))) ty env] + [make_pat (Tpat_tuple (List.map (fun (lbl, _) -> lbl, omega) tl)) + ty env] | _ -> [omega] end | Typedecl (_, _, {type_kind = Type_abstract _ | Type_open}) @@ -928,7 +980,7 @@ let build_other ext env = make_pat (Tpat_var (Ident.create_local "*extension*", {txt="*extension*"; loc = d.pat_loc}, - Uid.internal_not_actually_unique, Mode.Value.max_mode)) + Uid.internal_not_actually_unique, Mode.Value.disallow_right Mode.Value.max)) Ctype.none Env.empty | Construct _ -> begin match ext with @@ -1030,6 +1082,21 @@ let build_other ext env = (function Constant(Const_nativeint i) -> i | _ -> assert false) (function i -> Tpat_constant(Const_nativeint i)) 0n Nativeint.succ d env + | Constant Const_unboxed_int32 _ -> + build_other_constant + (function Constant(Const_unboxed_int32 i) -> i | _ -> assert false) + (function i -> Tpat_constant(Const_unboxed_int32 i)) + 0l Int32.succ d env + | Constant Const_unboxed_int64 _ -> + build_other_constant + (function Constant(Const_unboxed_int64 i) -> i | _ -> assert false) + (function i -> Tpat_constant(Const_unboxed_int64 i)) + 0L Int64.succ d env + | Constant Const_unboxed_nativeint _ -> + build_other_constant + (function Constant(Const_unboxed_nativeint i) -> i | _ -> assert false) + (function i -> Tpat_constant(Const_unboxed_nativeint i)) + 0n Nativeint.succ d env | Constant Const_string _ -> build_other_constant (function Constant(Const_string (s, _, _)) -> String.length s @@ -1044,17 +1111,25 @@ let build_other ext env = | _ -> assert false) (function f -> Tpat_constant(Const_float (string_of_float f))) 0.0 (fun f -> f +. 1.0) d env - | Array (am, _) -> + | Constant Const_unboxed_float _ -> + build_other_constant + (function Constant(Const_unboxed_float f) -> float_of_string f + | _ -> assert false) + (function f -> Tpat_constant(Const_unboxed_float (string_of_float f))) + 0.0 (fun f -> f +. 1.0) d env + | Constant Const_float32 _ + | Constant Const_unboxed_float32 _ -> raise_matched_float32 () + | Array (am, arg_sort, _) -> let all_lengths = List.map (fun (p,_) -> match p.pat_desc with - | Array (am', len) when am = am' -> len + | Array (am', _, len) when am = am' -> len | _ -> assert false) env in let rec try_arrays l = if List.mem l all_lengths then try_arrays (l+1) else - make_pat (Tpat_array (am, omegas l)) + make_pat (Tpat_array (am, arg_sort, omegas l)) d.pat_type d.pat_env in try_arrays 0 | _ -> Patterns.omega @@ -1064,8 +1139,9 @@ let rec has_instance p = match p.pat_desc with | Tpat_any | Tpat_var _ | Tpat_constant _ | Tpat_variant (_,None,_) -> true | Tpat_alias (p,_,_,_,_) | Tpat_variant (_,Some p,_) -> has_instance p | Tpat_or (p1,p2,_) -> has_instance p1 || has_instance p2 - | Tpat_construct (_,_,ps, _) | Tpat_tuple ps | Tpat_array (_, ps) -> + | Tpat_construct (_,_,ps, _) | Tpat_array (_, _, ps) -> has_instances ps + | Tpat_tuple labeled_ps -> has_instances (List.map snd labeled_ps) | Tpat_record (lps,_) -> has_instances (List.map (fun (_,_,x) -> x) lps) | Tpat_lazy p -> has_instance p @@ -1707,12 +1783,13 @@ let rec le_pat p q = | Tpat_variant(l1,None,_r1), Tpat_variant(l2,None,_) -> l1 = l2 | Tpat_variant(_,_,_), Tpat_variant(_,_,_) -> false - | Tpat_tuple(ps), Tpat_tuple(qs) -> le_pats ps qs + | Tpat_tuple(labeled_ps), Tpat_tuple(labeled_qs) -> + le_tuple_pats labeled_ps labeled_qs | Tpat_lazy p, Tpat_lazy q -> le_pat p q | Tpat_record (l1,_), Tpat_record (l2,_) -> let ps,qs = records_args l1 l2 in le_pats ps qs - | Tpat_array(am1, ps), Tpat_array(am2, qs) -> + | Tpat_array(am1, _, ps), Tpat_array(am2, _, qs) -> am1 = am2 && List.length ps = List.length qs && le_pats ps qs (* In all other cases, enumeration is performed *) | _,_ -> not (satisfiable [[p]] [q]) @@ -1722,6 +1799,13 @@ and le_pats ps qs = p::ps, q::qs -> le_pat p q && le_pats ps qs | _, _ -> true +and le_tuple_pats labeled_ps labeled_qs = + match labeled_ps, labeled_qs with + (p_label, p)::labeled_ps, (q_label, q)::labeled_qs -> + Option.equal String.equal p_label q_label + && le_pat p q && le_tuple_pats labeled_ps labeled_qs + | _, _ -> true + let get_mins le ps = let rec select_rec r = function [] -> r @@ -1745,7 +1829,7 @@ let rec lub p q = match p.pat_desc,q.pat_desc with | _,Tpat_or (q1,q2,_) -> orlub q1 q2 p (* Thanks god, lub is commutative *) | Tpat_constant c1, Tpat_constant c2 when const_compare c1 c2 = 0 -> p | Tpat_tuple ps, Tpat_tuple qs -> - let rs = lubs ps qs in + let rs = tuple_lubs ps qs in make_pat (Tpat_tuple rs) p.pat_type p.pat_env | Tpat_lazy p, Tpat_lazy q -> let r = lub p q in @@ -1766,10 +1850,10 @@ let rec lub p q = match p.pat_desc,q.pat_desc with let rs = record_lubs l1 l2 in make_pat (Tpat_record (rs, closed)) p.pat_type p.pat_env -| Tpat_array (am1, ps), Tpat_array (am2, qs) +| Tpat_array (am1, arg_sort, ps), Tpat_array (am2, _, qs) when am1 = am2 && List.length ps = List.length qs -> let rs = lubs ps qs in - make_pat (Tpat_array (am1, rs)) + make_pat (Tpat_array (am1, arg_sort, rs)) p.pat_type p.pat_env | _,_ -> raise Empty @@ -1797,6 +1881,13 @@ and record_lubs l1 l2 = (lid1, lbl1,lub p1 p2)::lub_rec rem1 rem2 in lub_rec l1 l2 +and tuple_lubs ps qs = match ps,qs with +| [], [] -> [] +| (p_label, p)::ps, (q_label, q)::qs + when Option.equal String.equal p_label q_label -> + (p_label, lub p q) :: tuple_lubs ps qs +| _,_ -> raise Empty + and lubs ps qs = match ps,qs with | p::ps, q::qs -> lub p q :: lubs ps qs | _,_ -> [] @@ -1839,8 +1930,8 @@ let pressure_variants_in_computation_pattern tdefs patl = let rec initial_matrix = function [] -> [] - | {c_guard=Some _} :: rem -> initial_matrix rem - | {c_guard=None; c_lhs=p} :: rem -> [p] :: initial_matrix rem + | {has_guard=true} :: rem -> initial_matrix rem + | {has_guard=false; pattern=p} :: rem -> [p] :: initial_matrix rem (* Build up a working pattern matrix by keeping @@ -1848,9 +1939,9 @@ let rec initial_matrix = function *) let rec initial_only_guarded = function | [] -> [] - | { c_guard = None; _} :: rem -> + | { has_guard=false; _} :: rem -> initial_only_guarded rem - | { c_lhs = pat; _ } :: rem -> + | { pattern = pat; _ } :: rem -> [pat] :: initial_only_guarded rem @@ -1939,8 +2030,9 @@ let rec collect_paths_from_pat r p = match p.pat_desc with (if extendable_path path then add_path path r else r) ps | Tpat_any|Tpat_var _|Tpat_constant _| Tpat_variant (_,None,_) -> r -| Tpat_tuple ps | Tpat_array (_, ps) -| Tpat_construct (_, {cstr_tag=Extension _}, ps, _)-> +| Tpat_tuple ps -> + List.fold_left (fun r (_, p) -> collect_paths_from_pat r p) r ps +| Tpat_array (_, _, ps) | Tpat_construct (_, {cstr_tag=Extension _}, ps, _)-> List.fold_left collect_paths_from_pat r ps | Tpat_record (lps,_) -> List.fold_left @@ -1964,7 +2056,7 @@ let rec collect_paths_from_pat r p = match p.pat_desc with let do_check_fragile loc casel pss = let exts = List.fold_left - (fun r c -> collect_paths_from_pat r c.c_lhs) + (fun r c -> collect_paths_from_pat r c.pattern) [] casel in match exts with | [] -> () @@ -1988,10 +2080,10 @@ let do_check_fragile loc casel pss = let check_unused pred casel = if Warnings.is_active Warnings.Redundant_case - || List.exists (fun c -> c.c_rhs.exp_desc = Texp_unreachable) casel then + || List.exists (fun vc -> vc.needs_refute) casel then let rec do_rec pref = function | [] -> () - | {c_lhs=q; c_guard; c_rhs} :: rem -> + | {pattern=q; has_guard; needs_refute=refute} :: rem -> let qs = [q] in begin try let pss = @@ -2002,7 +2094,6 @@ let check_unused pred casel = |> get_mins le_pats in (* First look for redundant or partially redundant patterns *) let r = every_satisfiables (make_rows pss) (make_row qs) in - let refute = (c_rhs.exp_desc = Texp_unreachable) in (* Do not warn for unused [pat -> .] *) if r = Unused && refute then () else let r = @@ -2048,7 +2139,7 @@ let check_unused pred casel = with Empty | Not_found -> assert false end ; - if c_guard <> None then + if has_guard then do_rec pref rem else do_rec ([q]::pref) rem in @@ -2067,18 +2158,22 @@ let inactive ~partial pat = | Total -> begin let rec loop pat = match pat.pat_desc with - | Tpat_lazy _ | Tpat_array (Mutable, _) -> + | Tpat_lazy _ | Tpat_array (Mutable _, _, _) -> false | Tpat_any | Tpat_var _ | Tpat_variant (_, None, _) -> true | Tpat_constant c -> begin match c with | Const_string _ - | Const_int _ | Const_char _ | Const_float _ - | Const_int32 _ | Const_int64 _ | Const_nativeint _ -> true + | Const_int _ | Const_char _ | Const_float _ | Const_float32 _ + | Const_unboxed_float _ | Const_unboxed_float32 _ | Const_int32 _ + | Const_int64 _ | Const_nativeint _ | Const_unboxed_int32 _ + | Const_unboxed_int64 _ | Const_unboxed_nativeint _ + -> true end - | Tpat_tuple ps | Tpat_construct (_, _, ps, _) - | Tpat_array (Immutable, ps) -> + | Tpat_tuple ps -> + List.for_all (fun (_,p) -> loop p) ps + | Tpat_construct (_, _, ps, _) | Tpat_array (Immutable, _, ps) -> List.for_all (fun p -> loop p) ps | Tpat_alias (p,_,_,_,_) | Tpat_variant (_, Some p, _) -> loop p @@ -2352,7 +2447,7 @@ let check_ambiguous_bindings = if is_active warn0 then let check_case ns case = match case with | { c_lhs = p; c_guard=None ; _} -> [p]::ns - | { c_lhs=p; c_guard=Some g; _} -> + | { c_lhs = p; c_guard=Some g; _} -> let all = Ident.Set.inter (pattern_vars p) (all_rhs_idents g) in if not (Ident.Set.is_empty all) then begin @@ -2370,3 +2465,11 @@ let check_ambiguous_bindings = ns in ignore (List.fold_left check_case [] cases) + +let report_error ppf = function + | Float32_match -> Format.pp_print_string ppf "float32 literal patterns are not supported." + +let () = + Location.register_error_of_exn (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None) diff --git a/typing/parmatch.mli b/typing/parmatch.mli index b2785863515..6ac2ac4bcbb 100644 --- a/typing/parmatch.mli +++ b/typing/parmatch.mli @@ -19,6 +19,24 @@ open Asttypes open Typedtree open Types +(** Most checks in this file need not access all information about a case, + and just need a few pieces of information. [parmatch_case] is those + few pieces of information. +*) +type 'pattern parmatch_case = + { pattern : 'pattern; + has_guard : bool; + needs_refute : bool; + (** true if the program text claims the case is unreachable, a la + [function _ -> .] + *) + } + +type 'category typed_case := 'category general_pattern parmatch_case + +val typed_case : 'category case -> 'category typed_case +val untyped_case : Parsetree.case -> Parsetree.pattern parmatch_case + val const_compare : constant -> constant -> int (** [const_compare c1 c2] compares the actual values represented by [c1] and [c2], while simply using [Stdlib.compare] would compare the @@ -97,9 +115,11 @@ val pressure_variants_in_computation_pattern: [refute] indicates that [check_unused] was called on a refutation clause. *) val check_partial: - (pattern -> pattern option) -> Location.t -> value case list -> partial + (pattern -> pattern option) -> Location.t -> value typed_case list + -> partial + val check_unused: - (bool -> pattern -> pattern option) -> value case list -> unit + (bool -> pattern -> pattern option) -> value typed_case list -> unit (* Irrefutability tests *) val irrefutable : pattern -> bool @@ -110,8 +130,11 @@ val irrefutable : pattern -> bool active. *) val inactive : partial:partial -> pattern -> bool -(* Ambiguous bindings *) +(* Ambiguous bindings. *) val check_ambiguous_bindings : value case list -> unit (* The tag used for open polymorphic variant types with an abstract row *) val some_private_tag : label + +(* Raise an error due to matching on a float32. *) +val raise_matched_float32 : unit -> 'a diff --git a/typing/patterns.ml b/typing/patterns.ml index ba0ca2ee243..1f5258f3879 100644 --- a/typing/patterns.ml +++ b/typing/patterns.ml @@ -52,13 +52,13 @@ module Simple = struct type view = [ | `Any | `Constant of constant - | `Tuple of pattern list + | `Tuple of (string option * pattern) list | `Construct of Longident.t loc * constructor_description * pattern list | `Variant of label * pattern option * row_desc ref | `Record of (Longident.t loc * label_description * pattern) list * closed_flag - | `Array of mutable_flag * pattern list + | `Array of mutability * Jkind.sort * pattern list | `Lazy of pattern ] @@ -79,8 +79,8 @@ end module General = struct type view = [ | Half_simple.view - | `Var of Ident.t * string loc * Uid.t * Mode.Value.t - | `Alias of pattern * Ident.t * string loc * Uid.t * Mode.Value.t + | `Var of Ident.t * string loc * Uid.t * Mode.Value.l + | `Alias of pattern * Ident.t * string loc * Uid.t * Mode.Value.l ] type pattern = view pattern_data @@ -101,7 +101,7 @@ module General = struct `Variant (cstr, arg, row_desc) | Tpat_record (fields, closed) -> `Record (fields, closed) - | Tpat_array (am,ps) -> `Array (am, ps) + | Tpat_array (am, arg_sort, ps) -> `Array (am, arg_sort, ps) | Tpat_or (p, q, row_desc) -> `Or (p, q, row_desc) | Tpat_lazy p -> `Lazy p @@ -120,7 +120,7 @@ module General = struct Tpat_variant (cstr, arg, row_desc) | `Record (fields, closed) -> Tpat_record (fields, closed) - | `Array (am, ps) -> Tpat_array (am, ps) + | `Array (am, arg_sort, ps) -> Tpat_array (am, arg_sort, ps) | `Or (p, q, row_desc) -> Tpat_or (p, q, row_desc) | `Lazy p -> Tpat_lazy p @@ -141,13 +141,13 @@ module Head : sig | Any | Construct of constructor_description | Constant of constant - | Tuple of int + | Tuple of string option list | Record of label_description list | Variant of { tag: label; has_arg: bool; cstr_row: row_desc ref; type_row : unit -> row_desc; } - | Array of mutable_flag * int + | Array of mutability * Jkind.sort * int | Lazy type t = desc pattern_data @@ -166,7 +166,7 @@ end = struct | Any | Construct of constructor_description | Constant of constant - | Tuple of int + | Tuple of string option list | Record of label_description list | Variant of { tag: label; has_arg: bool; @@ -174,7 +174,7 @@ end = struct type_row : unit -> row_desc; } (* the row of the type may evolve if [close_variant] is called, hence the (unit -> ...) delay *) - | Array of mutable_flag * int + | Array of mutability * Jkind.sort * int | Lazy type t = desc pattern_data @@ -184,7 +184,7 @@ end = struct | `Any -> Any, [] | `Constant c -> Constant c, [] | `Tuple args -> - Tuple (List.length args), args + Tuple (List.map fst args), (List.map snd args) | `Construct (_, c, args) -> Construct c, args | `Variant (tag, arg, cstr_row) -> @@ -199,8 +199,8 @@ end = struct | _ -> assert false in Variant {tag; has_arg; cstr_row; type_row}, pats - | `Array (am, args) -> - Array (am, List.length args), args + | `Array (am, arg_sort, args) -> + Array (am, arg_sort, List.length args), args | `Record (largs, _) -> let lbls = List.map (fun (_,lbl,_) -> lbl) largs in let pats = List.map (fun (_,_,pat) -> pat) largs in @@ -216,7 +216,8 @@ end = struct | Any -> 0 | Constant _ -> 0 | Construct c -> c.cstr_arity - | Tuple n | Array (_, n) -> n + | Tuple l -> List.length l + | Array (_, _, n) -> n | Record l -> List.length l | Variant { has_arg; _ } -> if has_arg then 1 else 0 | Lazy -> 1 @@ -228,8 +229,9 @@ end = struct | Any -> Tpat_any | Lazy -> Tpat_lazy omega | Constant c -> Tpat_constant c - | Tuple n -> Tpat_tuple (omegas n) - | Array (am, n) -> Tpat_array (am, omegas n) + | Tuple lbls -> + Tpat_tuple (List.map (fun lbl -> lbl, omega) lbls) + | Array (am, arg_sort, n) -> Tpat_array (am, arg_sort, omegas n) | Construct c -> let lid_loc = mkloc (Longident.Lident c.cstr_name) in Tpat_construct (lid_loc, c, omegas c.cstr_arity, None) diff --git a/typing/patterns.mli b/typing/patterns.mli index 9fc7e38fbcf..c0ef378bd2a 100644 --- a/typing/patterns.mli +++ b/typing/patterns.mli @@ -40,13 +40,13 @@ module Simple : sig type view = [ | `Any | `Constant of constant - | `Tuple of pattern list + | `Tuple of (string option * pattern) list | `Construct of Longident.t loc * constructor_description * pattern list | `Variant of label * pattern option * row_desc ref | `Record of (Longident.t loc * label_description * pattern) list * closed_flag - | `Array of mutable_flag * pattern list + | `Array of mutability * Jkind.sort * pattern list | `Lazy of pattern ] type pattern = view pattern_data @@ -65,8 +65,8 @@ end module General : sig type view = [ | Half_simple.view - | `Var of Ident.t * string loc * Uid.t * Mode.Value.t - | `Alias of pattern * Ident.t * string loc * Uid.t * Mode.Value.t + | `Var of Ident.t * string loc * Uid.t * Mode.Value.l + | `Alias of pattern * Ident.t * string loc * Uid.t * Mode.Value.l ] type pattern = view pattern_data @@ -81,7 +81,7 @@ module Head : sig | Any | Construct of constructor_description | Constant of constant - | Tuple of int + | Tuple of string option list | Record of label_description list | Variant of { tag: label; has_arg: bool; @@ -89,7 +89,7 @@ module Head : sig type_row : unit -> row_desc; } (* the row of the type may evolve if [close_variant] is called, hence the (unit -> ...) delay *) - | Array of mutable_flag * int + | Array of mutability * Jkind.sort * int | Lazy type t = desc pattern_data diff --git a/typing/persistent_env.ml b/typing/persistent_env.ml index dc7430cf983..11f9b8c79a7 100644 --- a/typing/persistent_env.ml +++ b/typing/persistent_env.ml @@ -20,19 +20,25 @@ open Misc open Cmi_format module CU = Compilation_unit -module Consistbl = Consistbl.Make (CU.Name) (CU) +module Consistbl_data = Import_info.Intf.Nonalias.Kind +module Consistbl = Consistbl.Make (CU.Name) (Consistbl_data) let add_delayed_check_forward = ref (fun _ -> assert false) type error = | Illegal_renaming of CU.Name.t * CU.Name.t * filepath | Inconsistent_import of CU.Name.t * filepath * filepath - | Need_recursive_types of CU.t - | Inconsistent_package_declaration of CU.t * filepath + | Need_recursive_types of CU.Name.t | Inconsistent_package_declaration_between_imports of filepath * CU.t * CU.t | Direct_reference_from_wrong_package of CU.t * filepath * CU.Prefix.t + | Illegal_import_of_parameter of CU.Name.t * filepath + | Not_compiled_as_parameter of CU.Name.t * filepath + | Imported_module_has_unset_parameter of + { imported : CU.Name.t; + parameter : CU.Name.t; + } exception Error of error let error err = raise (Error err) @@ -40,71 +46,106 @@ let error err = raise (Error err) module Persistent_signature = struct type t = { filename : string; - cmi : Cmi_format.cmi_infos_lazy } - - let load = ref (fun ~unit_name -> - let unit_name = CU.Name.to_string unit_name in - match Load_path.find_uncap (unit_name ^ ".cmi") with - | filename -> Some { filename; cmi = read_cmi_lazy filename } - | exception Not_found -> None) + cmi : Cmi_format.cmi_infos_lazy; + visibility : Load_path.visibility } + + let load = ref (fun ~allow_hidden ~unit_name -> + let unit_name = CU.Name.to_string unit_name in + match Load_path.find_uncap_with_visibility (unit_name ^ ".cmi") with + | filename, visibility when allow_hidden -> + Some { filename; cmi = read_cmi_lazy filename; visibility} + | filename, Visible -> + Some { filename; cmi = read_cmi_lazy filename; visibility = Visible} + | _, Hidden + | exception Not_found -> None) end type can_load_cmis = | Can_load_cmis | Cannot_load_cmis of Lazy_backtrack.log -type pers_struct = { - ps_name: CU.t; - ps_crcs: Import_info.t array; - ps_filename: string; - ps_flags: pers_flags list; +(* Data relating directly to a .cmi *) +type import = { + imp_is_param : bool; + imp_params : Compilation_unit.Name.t list; + imp_arg_for : Compilation_unit.Name.t option; + imp_impl : CU.t option; (* None iff import is a parameter *) + imp_sign : Subst.Lazy.signature; + imp_filename : string; + imp_visibility: Load_path.visibility; + imp_crcs : Import_info.Intf.t array; + imp_flags : Cmi_format.pers_flags list; } (* If a .cmi file is missing (or invalid), we store it as Missing in the cache. *) -type 'a pers_struct_info = +type import_info = | Missing - | Found of pers_struct * 'a + | Found of import + +(* What a global identifier is actually bound to in Lambda code *) +type binding = + | Runtime_parameter of Ident.t (* Bound to a runtime parameter *) + | Constant of Compilation_unit.t (* Bound to a static constant *) + +(* Data relating to an actual referenceable module, with a signature and a + representation in memory. *) +type 'a pers_struct_info = { + ps_import : import; + ps_binding : binding; + ps_val : 'a; +} + +module Param_set = CU.Name.Set +(* If you add something here, _do not forget_ to add it to [clear]! *) type 'a t = { + imports : (CU.Name.t, import_info) Hashtbl.t; persistent_structures : (CU.Name.t, 'a pers_struct_info) Hashtbl.t; imported_units: CU.Name.Set.t ref; imported_opaque_units: CU.Name.Set.t ref; + param_imports : Param_set.t ref; crc_units: Consistbl.t; can_load_cmis: can_load_cmis ref; } let empty () = { + imports = Hashtbl.create 17; persistent_structures = Hashtbl.create 17; imported_units = ref CU.Name.Set.empty; imported_opaque_units = ref CU.Name.Set.empty; + param_imports = ref Param_set.empty; crc_units = Consistbl.create (); can_load_cmis = ref Can_load_cmis; } let clear penv = let { + imports; persistent_structures; imported_units; imported_opaque_units; + param_imports; crc_units; can_load_cmis; } = penv in + Hashtbl.clear imports; Hashtbl.clear persistent_structures; imported_units := CU.Name.Set.empty; imported_opaque_units := CU.Name.Set.empty; + param_imports := Param_set.empty; Consistbl.clear crc_units; can_load_cmis := Can_load_cmis; () -let clear_missing {persistent_structures; _} = +let clear_missing {imports; _} = let missing_entries = Hashtbl.fold (fun name r acc -> if r = Missing then name :: acc else acc) - persistent_structures [] + imports [] in - List.iter (Hashtbl.remove persistent_structures) missing_entries + List.iter (Hashtbl.remove imports) missing_entries let add_import {imported_units; _} s = imported_units := CU.Name.Set.add s !imported_units @@ -112,37 +153,67 @@ let add_import {imported_units; _} s = let register_import_as_opaque {imported_opaque_units; _} s = imported_opaque_units := CU.Name.Set.add s !imported_opaque_units -let find_in_cache {persistent_structures; _} s = - match Hashtbl.find persistent_structures s with +let find_import_info_in_cache {imports; _} import = + match Hashtbl.find imports import with | exception Not_found -> None | Missing -> None - | Found (_ps, pm) -> Some pm + | Found imp -> Some imp + +let find_info_in_cache {persistent_structures; _} name = + match Hashtbl.find persistent_structures name with + | exception Not_found -> None + | ps -> Some ps + +let find_in_cache penv name = + find_info_in_cache penv name |> Option.map (fun ps -> ps.ps_val) + +let register_parameter ({param_imports; _} as penv) import = + begin match find_import_info_in_cache penv import with + | None -> + (* Not loaded yet; if it's wrong, we'll get an error at load time *) + () + | Some imp -> + if not imp.imp_is_param then + raise (Error (Not_compiled_as_parameter(import, imp.imp_filename))) + end; + param_imports := Param_set.add import !param_imports let import_crcs penv ~source crcs = let {crc_units; _} = penv in let import_crc import_info = - let name = Import_info.name import_info in - let crco = Import_info.crc_with_unit import_info in - match crco with + let name = Import_info.Intf.name import_info in + let info = Import_info.Intf.info import_info in + match info with | None -> () - | Some (unit, crc) -> + | Some (kind, crc) -> add_import penv name; - Consistbl.check crc_units name unit crc source + Consistbl.check crc_units name kind crc source in Array.iter import_crc crcs -let check_consistency penv ps = - try import_crcs penv ~source:ps.ps_filename ps.ps_crcs +let check_consistency penv imp = + try import_crcs penv ~source:imp.imp_filename imp.imp_crcs with Consistbl.Inconsistency { unit_name = name; inconsistent_source = source; original_source = auth; - inconsistent_data = source_unit; - original_data = auth_unit; + inconsistent_data = source_kind; + original_data = auth_kind; } -> - if CU.equal source_unit auth_unit - then error (Inconsistent_import(name, auth, source)) - else error (Inconsistent_package_declaration_between_imports( - ps.ps_filename, auth_unit, source_unit)) + match source_kind, auth_kind with + | Normal source_unit, Normal auth_unit + when not (CU.equal source_unit auth_unit) -> + error (Inconsistent_package_declaration_between_imports( + imp.imp_filename, auth_unit, source_unit)) + | (Normal _ | Parameter), _ -> + error (Inconsistent_import(name, auth, source)) + +let is_registered_parameter_import {param_imports; _} import = + Param_set.mem import !param_imports + +let is_parameter_import t import = + match find_import_info_in_cache t import with + | Some { imp_is_param; _ } -> imp_is_param + | None -> Misc.fatal_errorf "is_parameter_import %a" CU.Name.print import let can_load_cmis penv = !(penv.can_load_cmis) @@ -160,98 +231,211 @@ let without_cmis penv f x = res let fold {persistent_structures; _} f x = - Hashtbl.fold (fun modname pso x -> match pso with - | Missing -> x - | Found (_, pm) -> f modname pm x) + Hashtbl.fold (fun name ps x -> f name ps.ps_val x) persistent_structures x (* Reading persistent structures from .cmi files *) -let save_pers_struct penv crc comp_unit flags filename = +let save_import penv crc modname impl flags filename = let {crc_units; _} = penv in - let modname = CU.name comp_unit in List.iter (function | Rectypes -> () | Alerts _ -> () | Opaque -> register_import_as_opaque penv modname) flags; - Consistbl.check crc_units modname comp_unit crc filename; + Consistbl.check crc_units modname impl crc filename; add_import penv modname -let process_pers_struct penv check modname pers_sig = - let { Persistent_signature.filename; cmi } = pers_sig in - let name = cmi.cmi_name in +(* Add an import to the hash table. Checks that we are allowed to access + this .cmi. *) + +let acknowledge_import penv ~check modname pers_sig = + let { Persistent_signature.filename; cmi; visibility } = pers_sig in + let found_name = cmi.cmi_name in + let kind = cmi.cmi_kind in + let params = cmi.cmi_params in let crcs = cmi.cmi_crcs in let flags = cmi.cmi_flags in - let ps = { ps_name = name; - ps_crcs = crcs; - ps_filename = filename; - ps_flags = flags; - } in - let found_name = CU.name name in + let sign = + (* Freshen identifiers bound by signature *) + Subst.Lazy.signature Make_local Subst.identity cmi.cmi_sign + in if not (CU.Name.equal modname found_name) then error (Illegal_renaming(modname, found_name, filename)); List.iter (function | Rectypes -> if not !Clflags.recursive_types then - error (Need_recursive_types(ps.ps_name)) + error (Need_recursive_types(modname)) | Alerts _ -> () | Opaque -> register_import_as_opaque penv modname) - ps.ps_flags; - if check then check_consistency penv ps; - begin match CU.get_current () with - | Some current_unit -> + flags; + begin match kind, CU.get_current () with + | Normal { cmi_impl = imported_unit }, Some current_unit -> let access_allowed = - CU.can_access_by_name name ~accessed_by:current_unit + CU.can_access_by_name imported_unit ~accessed_by:current_unit in if not access_allowed then let prefix = CU.for_pack_prefix current_unit in - error (Direct_reference_from_wrong_package (name, filename, prefix)); - | None -> () + error (Direct_reference_from_wrong_package (imported_unit, filename, prefix)); + | _, _ -> () end; - ps + let is_param = + match kind with + | Normal _ -> false + | Parameter -> true + in + let arg_for, impl = + match kind with + | Normal { cmi_arg_for; cmi_impl } -> cmi_arg_for, Some cmi_impl + | Parameter -> None, None + in + let {imports; _} = penv in + let import = + { imp_is_param = is_param; + imp_params = params; + imp_arg_for = arg_for; + imp_impl = impl; + imp_sign = sign; + imp_filename = filename; + imp_visibility = visibility; + imp_crcs = crcs; + imp_flags = flags; + } + in + if check then check_consistency penv import; + Hashtbl.add imports modname (Found import); + import -let bind_pers_struct penv modname ps pm = - let {persistent_structures; _} = penv in - Hashtbl.add persistent_structures modname (Found (ps, pm)) +let read_import penv ~check modname filename = + add_import penv modname; + let cmi = read_cmi_lazy filename in + let pers_sig = { Persistent_signature.filename; cmi; visibility = Visible } in + acknowledge_import penv ~check modname pers_sig + +let check_visibility ~allow_hidden imp = + if not allow_hidden && imp.imp_visibility = Load_path.Hidden then raise Not_found -let acknowledge_pers_struct penv check modname pers_sig pm = - let ps = process_pers_struct penv check modname pers_sig in - bind_pers_struct penv modname ps pm; +let find_import ~allow_hidden penv ~check modname = + let {imports; _} = penv in + if CU.Name.equal modname CU.Name.predef_exn then raise Not_found; + match Hashtbl.find imports modname with + | Found imp -> check_visibility ~allow_hidden imp; imp + | Missing -> raise Not_found + | exception Not_found -> + match can_load_cmis penv with + | Cannot_load_cmis _ -> raise Not_found + | Can_load_cmis -> + let psig = + match !Persistent_signature.load ~allow_hidden ~unit_name:modname with + | Some psig -> psig + | None -> + if allow_hidden then Hashtbl.add imports modname Missing; + raise Not_found + in + add_import penv modname; + acknowledge_import penv ~check modname psig + +(* Enforce the subset rule: we can only refer to a module if that module's + parameters are also our parameters. *) +let check_for_unset_parameters penv modname import = + List.iter + (fun param -> + if not (is_registered_parameter_import penv param) then + error (Imported_module_has_unset_parameter { + imported = modname; + parameter = param; + })) + import.imp_params + +let make_binding _penv modname (import : import) : binding = + match import with + | { imp_impl = Some unit; imp_params = [] } -> Constant unit + | { imp_impl = None } | { imp_params = _ :: _ } -> + Runtime_parameter (Ident.create_local_binding_for_global (CU.Name.to_string modname)) + +type address = + | Aunit of Compilation_unit.t + | Alocal of Ident.t + | Adot of address * int + +type 'a sig_reader = + Subst.Lazy.signature + -> Compilation_unit.Name.t + -> Shape.Uid.t + -> shape:Shape.t + -> address:address + -> flags:Cmi_format.pers_flags list + -> 'a + +(* Add a persistent structure to the hash table and bind it in the [Env]. + Checks that OCaml source is allowed to refer to this module. *) + +let acknowledge_pers_struct penv modname import val_of_pers_sig = + let {persistent_structures; _} = penv in + let is_param = import.imp_is_param in + let sign = import.imp_sign in + let filename = import.imp_filename in + let flags = import.imp_flags in + check_for_unset_parameters penv modname import; + begin match is_param, is_registered_parameter_import penv modname with + | true, false -> + error (Illegal_import_of_parameter(modname, filename)) + | false, true -> + error (Not_compiled_as_parameter(modname, filename)) + | true, true + | false, false -> () + end; + let binding = make_binding penv modname import in + let address : address = + match binding with + | Runtime_parameter id -> Alocal id + | Constant unit -> Aunit unit + in + let uid = + (* This is source-level information that depends only on the import, not the + arguments. (TODO: Consider moving this bit into [acknowledge_import].) *) + match import.imp_impl with + | Some unit -> Shape.Uid.of_compilation_unit_id unit + | None -> + (* TODO: [Shape.Uid.of_compilation_unit_id] is actually the wrong type, since + parameters should also have uids but they don't have .cmx files and thus + they don't have [CU.t]s *) + Shape.Uid.internal_not_actually_unique + in + let shape = + match import.imp_impl, import.imp_params with + | Some unit, [] -> Shape.for_persistent_unit (CU.full_path_as_string unit) + | _, _ -> + (* TODO Implement shapes for parameters and parameterised modules *) + Shape.error ~uid "parameter or parameterised module" + in + let pm = val_of_pers_sig sign modname uid ~shape ~address ~flags in + let ps = + { ps_import = import; + ps_binding = binding; + ps_val = pm; + } + in + Hashtbl.add persistent_structures modname ps; ps let read_pers_struct penv val_of_pers_sig check modname filename ~add_binding = - add_import penv modname; - let cmi = read_cmi_lazy filename in - let pers_sig = { Persistent_signature.filename; cmi } in - let pm = val_of_pers_sig pers_sig in - let ps = process_pers_struct penv check modname pers_sig in - if add_binding then bind_pers_struct penv modname ps pm; - (ps, pm) - -let find_pers_struct penv val_of_pers_sig check name = + let import = read_import penv ~check modname filename in + if add_binding then + ignore + (acknowledge_pers_struct penv modname import val_of_pers_sig + : _ pers_struct_info); + import.imp_sign + +let find_pers_struct ~allow_hidden penv val_of_pers_sig check name = let {persistent_structures; _} = penv in - if CU.Name.equal name CU.Name.predef_exn then raise Not_found; match Hashtbl.find persistent_structures name with - | Found (ps, pm) -> (ps, pm) - | Missing -> raise Not_found + | ps -> check_visibility ~allow_hidden ps.ps_import; ps | exception Not_found -> - match can_load_cmis penv with - | Cannot_load_cmis _ -> raise Not_found - | Can_load_cmis -> - let psig = - match !Persistent_signature.load ~unit_name:name with - | Some psig -> psig - | None -> - Hashtbl.add persistent_structures name Missing; - raise Not_found - in - add_import penv name; - let pm = val_of_pers_sig psig in - let ps = acknowledge_pers_struct penv check name psig pm in - (ps, pm) + let import = find_import ~allow_hidden penv ~check name in + acknowledge_pers_struct penv name import val_of_pers_sig let describe_prefix ppf prefix = if CU.Prefix.is_empty prefix then @@ -260,10 +444,10 @@ let describe_prefix ppf prefix = Format.fprintf ppf "package %a" CU.Prefix.print prefix (* Emits a warning if there is no valid cmi for name *) -let check_pers_struct penv f ~loc name = +let check_pers_struct ~allow_hidden penv f ~loc name = let name_as_string = CU.Name.to_string name in try - ignore (find_pers_struct penv f false name) + ignore (find_pers_struct ~allow_hidden penv f false name) with | Not_found -> let warn = Warnings.No_cmi_file(name_as_string, None) in @@ -286,24 +470,26 @@ let check_pers_struct penv f ~loc name = | Need_recursive_types name -> Format.asprintf "%a uses recursive types" - CU.print name - | Inconsistent_package_declaration _ -> assert false + CU.Name.print name | Inconsistent_package_declaration_between_imports _ -> assert false | Direct_reference_from_wrong_package (unit, _filename, prefix) -> Format.asprintf "%a is inaccessible from %a" CU.print unit describe_prefix prefix + | Illegal_import_of_parameter _ -> assert false + | Not_compiled_as_parameter _ -> assert false + | Imported_module_has_unset_parameter _ -> assert false in let warn = Warnings.No_cmi_file(name_as_string, Some msg) in Location.prerr_warning loc warn let read penv f modname filename ~add_binding = - snd (read_pers_struct penv f true modname filename ~add_binding) + read_pers_struct penv f true modname filename ~add_binding -let find penv f name = - snd (find_pers_struct penv f true name) +let find ~allow_hidden penv f name = + (find_pers_struct ~allow_hidden penv f true name).ps_val -let check penv f ~loc name = +let check ~allow_hidden penv f ~loc name = let {persistent_structures; _} = penv in if not (Hashtbl.mem persistent_structures name) then begin (* PR#6843: record the weak dependency ([add_import]) regardless of @@ -312,7 +498,7 @@ let check penv f ~loc name = add_import penv name; if (Warnings.is_active (Warnings.No_cmi_file("", None))) then !add_delayed_check_forward - (fun () -> check_pers_struct penv f ~loc name) + (fun () -> check_pers_struct ~allow_hidden penv f ~loc name) end (* CR mshinwell: delete this having moved to 4.14 build compilers *) @@ -332,12 +518,12 @@ module Array = struct loop 0 end -let crc_of_unit penv f name = +let crc_of_unit penv name = match Consistbl.find penv.crc_units name with - | Some (_, crc) -> crc + | Some (_impl, crc) -> crc | None -> - let (ps, _pm) = find_pers_struct penv f true name in - match Array.find_opt (Import_info.has_name ~name) ps.ps_crcs with + let import = find_import ~allow_hidden:true penv ~check:true name in + match Array.find_opt (Import_info.Intf.has_name ~name) import.imp_crcs with | None -> assert false | Some import_info -> match Import_info.crc import_info with @@ -349,10 +535,25 @@ let imports {imported_units; crc_units; _} = Consistbl.extract (CU.Name.Set.elements !imported_units) crc_units in - List.map (fun (cu_name, crc_with_unit) -> - Import_info.create cu_name ~crc_with_unit) + List.map (fun (cu_name, spec) -> Import_info.Intf.create cu_name spec) imports +let local_ident penv modname = + match find_info_in_cache penv modname with + | Some { ps_binding = Runtime_parameter local_ident; _ } -> Some local_ident + | Some { ps_binding = Constant _; _ } + | None -> None + +let runtime_parameters ({persistent_structures; _} as penv) = + persistent_structures + |> Hashtbl.to_seq_keys + |> Seq.filter_map + (fun name -> local_ident penv name |> Option.map (fun id -> name, id)) + |> List.of_seq + +let parameters {param_imports; _} = + Param_set.elements !param_imports + let looked_up {persistent_structures; _} modname = Hashtbl.mem persistent_structures modname @@ -362,7 +563,12 @@ let is_imported {imported_units; _} s = let is_imported_opaque {imported_opaque_units; _} s = CU.Name.Set.mem s !imported_opaque_units -let make_cmi penv modname sign alerts = +let implemented_parameter penv modname = + match find_import_info_in_cache penv modname with + | Some { imp_arg_for; _ } -> imp_arg_for + | None -> None + +let make_cmi penv modname kind sign alerts = let flags = List.concat [ if !Clflags.recursive_types then [Cmi_format.Rectypes] else []; @@ -370,19 +576,26 @@ let make_cmi penv modname sign alerts = [Alerts alerts]; ] in + let params = + (* Needs to be consistent with [Translmod] *) + parameters penv + in let crcs = imports penv in { cmi_name = modname; + cmi_kind = kind; cmi_sign = sign; + cmi_params = params; cmi_crcs = Array.of_list crcs; cmi_flags = flags } let save_cmi penv psig = - let { Persistent_signature.filename; cmi } = psig in + let { Persistent_signature.filename; cmi; _ } = psig in Misc.try_finally (fun () -> let { cmi_name = modname; + cmi_kind = kind; cmi_sign = _; cmi_crcs = _; cmi_flags = flags; @@ -393,10 +606,18 @@ let save_cmi penv psig = (fun temp_filename oc -> output_cmi temp_filename oc cmi) in (* Enter signature in consistbl so that imports() will also return its crc *) - save_pers_struct penv crc modname flags filename + let data : Import_info.Intf.Nonalias.Kind.t = + match kind with + | Normal { cmi_impl } -> Normal cmi_impl + | Parameter -> Parameter + in + save_import penv crc modname data flags filename ) ~exceptionally:(fun () -> remove_file filename) +(* TODO: These should really have locations in them where possible (adapting + [Typemod]'s [Error] constructor is probably the easiest path) *) + let report_error ppf = let open Format in function @@ -414,19 +635,27 @@ let report_error ppf = | Need_recursive_types(import) -> fprintf ppf "@[Invalid import of %a, which uses recursive types.@ %s@]" - CU.print import + CU.Name.print import "The compilation flag -rectypes is required" - | Inconsistent_package_declaration(intf_package, intf_filename) -> - fprintf ppf - "@[The interface %a@ is compiled for package %s.@ %s@]" - CU.print intf_package intf_filename - "The compilation flag -for-pack with the same package is required" | Inconsistent_package_declaration_between_imports (filename, unit1, unit2) -> fprintf ppf "@[The file %s@ is imported both as %a@ and as %a.@]" filename CU.print unit1 CU.print unit2 + | Illegal_import_of_parameter(modname, filename) -> + fprintf ppf + "@[The file %a@ contains the interface of a parameter.@ \ + %a is not declared as a parameter for the current unit (-parameter %a).@]" + Location.print_filename filename + CU.Name.print modname + CU.Name.print modname + | Not_compiled_as_parameter(modname, filename) -> + fprintf ppf + "@[The module %a@ is specified as a parameter, but %a@ \ + was not compiled with -as-parameter.@]" + CU.Name.print modname + Location.print_filename filename | Direct_reference_from_wrong_package(unit, filename, prefix) -> fprintf ppf "@[Invalid reference to %a (in file %s) from %a.@ %s]" @@ -434,6 +663,18 @@ let report_error ppf = filename describe_prefix prefix "Can only access members of this library's package or a containing package" + | Imported_module_has_unset_parameter + { imported = modname; parameter = param } -> + fprintf ppf + "@[The module %a@ is not accessible because it takes %a@ \ + as a parameter and the current unit does not.@]@.\ + @[@{Hint@}: \ + @[Pass `-parameter %a`@ to add %a@ as a parameter@ \ + of the current unit.@]@]" + CU.Name.print modname + CU.Name.print param + CU.Name.print param + CU.Name.print param let () = Location.register_error_of_exn diff --git a/typing/persistent_env.mli b/typing/persistent_env.mli index bfa3f05345d..7242907a576 100644 --- a/typing/persistent_env.mli +++ b/typing/persistent_env.mli @@ -16,19 +16,28 @@ open Misc +module Consistbl_data : sig + type t +end + module Consistbl : module type of struct - include Consistbl.Make (Compilation_unit.Name) (Compilation_unit) + include Consistbl.Make (Compilation_unit.Name) (Consistbl_data) end type error = | Illegal_renaming of Compilation_unit.Name.t * Compilation_unit.Name.t * filepath | Inconsistent_import of Compilation_unit.Name.t * filepath * filepath - | Need_recursive_types of Compilation_unit.t - | Inconsistent_package_declaration of Compilation_unit.t * filepath + | Need_recursive_types of Compilation_unit.Name.t | Inconsistent_package_declaration_between_imports of filepath * Compilation_unit.t * Compilation_unit.t | Direct_reference_from_wrong_package of Compilation_unit.t * filepath * Compilation_unit.Prefix.t + | Illegal_import_of_parameter of Compilation_unit.Name.t * filepath + | Not_compiled_as_parameter of Compilation_unit.Name.t * filepath + | Imported_module_has_unset_parameter of + { imported : Compilation_unit.Name.t; + parameter : Compilation_unit.Name.t; + } exception Error of error @@ -38,12 +47,15 @@ val report_error: Format.formatter -> error -> unit module Persistent_signature : sig type t = { filename : string; (** Name of the file containing the signature. *) - cmi : Cmi_format.cmi_infos_lazy } + cmi : Cmi_format.cmi_infos_lazy; + visibility : Load_path.visibility + } (** Function used to load a persistent signature. The default is to look for the .cmi file in the load path. This function can be overridden to load it from memory, for instance to build a self-contained toplevel. *) - val load : (unit_name:Compilation_unit.Name.t -> t option) ref + val load : + (allow_hidden:bool -> unit_name:Compilation_unit.Name.t -> t option) ref end type can_load_cmis = @@ -59,18 +71,43 @@ val clear_missing : 'a t -> unit val fold : 'a t -> (Compilation_unit.Name.t -> 'a -> 'b -> 'b) -> 'b -> 'b +type address = + | Aunit of Compilation_unit.t + | Alocal of Ident.t + | Adot of address * int + +type 'a sig_reader = + Subst.Lazy.signature + -> Compilation_unit.Name.t + -> Shape.Uid.t + -> shape:Shape.t + -> address:address + -> flags:Cmi_format.pers_flags list + -> 'a + (* If [add_binding] is false, reads the signature from the .cmi but does not bind the module name in the environment. *) -val read : 'a t -> (Persistent_signature.t -> 'a) - -> Compilation_unit.Name.t -> filepath -> add_binding:bool -> 'a -val find : 'a t -> (Persistent_signature.t -> 'a) +(* CR-someday lmaurer: [add_binding] is apparently always false, including in the + [-instantiate] branch. We should remove this parameter. *) +val read : 'a t -> 'a sig_reader + -> Compilation_unit.Name.t -> filepath -> add_binding:bool -> Subst.Lazy.signature +val find : allow_hidden:bool -> 'a t -> 'a sig_reader -> Compilation_unit.Name.t -> 'a val find_in_cache : 'a t -> Compilation_unit.Name.t -> 'a option -val check : 'a t -> (Persistent_signature.t -> 'a) +val check : allow_hidden:bool -> 'a t -> 'a sig_reader -> loc:Location.t -> Compilation_unit.Name.t -> unit +(* Lets it be known that the given module is a parameter to this module and thus is + expected to have been compiled as such. Raises an exception if the module has already + been imported as a non-parameter. *) +val register_parameter : 'a t -> Compilation_unit.Name.t -> unit + +(* [is_parameter_import penv md] checks if [md] is a parameter. Raises a fatal + error if the module has not been imported. *) +val is_parameter_import : 'a t -> Compilation_unit.Name.t -> bool + (* [looked_up penv md] checks if one has already tried to read the signature for [md] in the environment [penv] (it may have failed) *) @@ -88,7 +125,16 @@ val is_imported_opaque : 'a t -> Compilation_unit.Name.t -> bool opaque module *) val register_import_as_opaque : 'a t -> Compilation_unit.Name.t -> unit -val make_cmi : 'a t -> Compilation_unit.t -> Subst.Lazy.signature -> alerts +(* [implemented_parameter penv md] returns the argument to [-as-argument-for] + that [md] was compiled with. *) +val implemented_parameter : 'a t -> Compilation_unit.Name.t + -> Compilation_unit.Name.t option + +val make_cmi : 'a t + -> Compilation_unit.Name.t + -> Cmi_format.kind + -> Subst.Lazy.signature + -> alerts -> Cmi_format.cmi_infos_lazy val save_cmi : 'a t -> Persistent_signature.t -> unit @@ -106,9 +152,25 @@ val import_crcs : 'a t -> source:filepath -> (* Return the set of compilation units imported, with their CRC *) val imports : 'a t -> Import_info.t list +(* Return the set of imports represented as runtime parameters. If this module is indeed + parameterised (that is, [parameters] returns a non-empty list), it will be compiled as + a functor rather than a [struct] as usual, and the parameters to this functor are what + we refer to as "runtime parameters." They include (a) all imported parameters (not all + parameters are necessarily imported; see [parameters]) and (b) all imported + parameterised modules. + + Note that the word "runtime" is a bit of a fiction reflecting a front-end view of the + world. In fact we aim to inline away all passing of runtime parameters. *) +val runtime_parameters : 'a t -> (Compilation_unit.Name.t * Ident.t) list + +(* Return the list of parameters specified for the current unit, in alphabetical order. + All of these will have been specified by [-parameter] but not all of them are + necessarily imported - any that don't appear in the source are still considered + parameters of the module but will not appear in [imports]. *) +val parameters : 'a t -> Compilation_unit.Name.t list + (* Return the CRC of the interface of the given compilation unit *) -val crc_of_unit: 'a t -> (Persistent_signature.t -> 'a) - -> Compilation_unit.Name.t -> Digest.t +val crc_of_unit: 'a t -> Compilation_unit.Name.t -> Digest.t (* Forward declaration to break mutual recursion with Typecore. *) val add_delayed_check_forward: ((unit -> unit) -> unit) ref diff --git a/typing/predef.ml b/typing/predef.ml index d9a60f044fe..d4b59465f29 100644 --- a/typing/predef.ml +++ b/typing/predef.ml @@ -32,6 +32,7 @@ let ident_int = ident_create "int" and ident_char = ident_create "char" and ident_bytes = ident_create "bytes" and ident_float = ident_create "float" +and ident_float32 = ident_create "float32" and ident_bool = ident_create "bool" and ident_unit = ident_create "unit" and ident_exn = ident_create "exn" @@ -46,7 +47,13 @@ and ident_lazy_t = ident_create "lazy_t" and ident_string = ident_create "string" and ident_extension_constructor = ident_create "extension_constructor" and ident_floatarray = ident_create "floatarray" +and ident_lexing_position = ident_create "lexing_position" + and ident_unboxed_float = ident_create "float#" +and ident_unboxed_float32 = ident_create "float32#" +and ident_unboxed_nativeint = ident_create "nativeint#" +and ident_unboxed_int32 = ident_create "int32#" +and ident_unboxed_int64 = ident_create "int64#" and ident_int8x16 = ident_create "int8x16" and ident_int16x8 = ident_create "int16x8" @@ -59,6 +66,7 @@ let path_int = Pident ident_int and path_char = Pident ident_char and path_bytes = Pident ident_bytes and path_float = Pident ident_float +and path_float32 = Pident ident_float32 and path_bool = Pident ident_bool and path_unit = Pident ident_unit and path_exn = Pident ident_exn @@ -73,7 +81,13 @@ and path_lazy_t = Pident ident_lazy_t and path_string = Pident ident_string and path_extension_constructor = Pident ident_extension_constructor and path_floatarray = Pident ident_floatarray +and path_lexing_position = Pident ident_lexing_position + and path_unboxed_float = Pident ident_unboxed_float +and path_unboxed_float32 = Pident ident_unboxed_float32 +and path_unboxed_nativeint = Pident ident_unboxed_nativeint +and path_unboxed_int32 = Pident ident_unboxed_int32 +and path_unboxed_int64 = Pident ident_unboxed_int64 and path_int8x16 = Pident ident_int8x16 and path_int16x8 = Pident ident_int16x8 @@ -86,6 +100,7 @@ let type_int = newgenty (Tconstr(path_int, [], ref Mnil)) and type_char = newgenty (Tconstr(path_char, [], ref Mnil)) and type_bytes = newgenty (Tconstr(path_bytes, [], ref Mnil)) and type_float = newgenty (Tconstr(path_float, [], ref Mnil)) +and type_float32 = newgenty (Tconstr(path_float32, [], ref Mnil)) and type_bool = newgenty (Tconstr(path_bool, [], ref Mnil)) and type_unit = newgenty (Tconstr(path_unit, [], ref Mnil)) and type_exn = newgenty (Tconstr(path_exn, [], ref Mnil)) @@ -101,7 +116,14 @@ and type_string = newgenty (Tconstr(path_string, [], ref Mnil)) and type_extension_constructor = newgenty (Tconstr(path_extension_constructor, [], ref Mnil)) and type_floatarray = newgenty (Tconstr(path_floatarray, [], ref Mnil)) +and type_lexing_position = newgenty (Tconstr(path_lexing_position, [], ref Mnil)) + and type_unboxed_float = newgenty (Tconstr(path_unboxed_float, [], ref Mnil)) +and type_unboxed_float32 = newgenty (Tconstr(path_unboxed_float32, [], ref Mnil)) +and type_unboxed_nativeint = + newgenty (Tconstr(path_unboxed_nativeint, [], ref Mnil)) +and type_unboxed_int32 = newgenty (Tconstr(path_unboxed_int32, [], ref Mnil)) +and type_unboxed_int64 = newgenty (Tconstr(path_unboxed_int64, [], ref Mnil)) and type_int8x16 = newgenty (Tconstr(path_int8x16, [], ref Mnil)) and type_int16x8 = newgenty (Tconstr(path_int16x8, [], ref Mnil)) @@ -162,16 +184,43 @@ and ident_cons = ident_create "::" and ident_none = ident_create "None" and ident_some = ident_create "Some" +let predef_jkind_annotation primitive = + Option.map + (fun (primitive : Jkind.Const.Primitive.t) -> + (* This is a bit of a hack: we're trying to figure out what a user + could have written on a predef type declaration to give it the + right kind. But this hack is OK as its result is just used in + printing/untypeast. + *) + let user_written : _ Location.loc = + Jane_syntax.Jkind.(Abbreviation (Const.mk primitive.name Location.none)) + |> Location.mknoloc + in + primitive.jkind, user_written) + primitive + +let option_argument_jkind = Jkind.Primitive.value ~why:( + Type_argument {parent_path = path_option; position = 1; arity = 1}) + +let list_argument_jkind = Jkind.Primitive.value ~why:( + Type_argument {parent_path = path_list; position = 1; arity = 1}) + let mk_add_type add_type ?manifest type_ident ?(kind=Type_abstract Abstract_def) - ?(jkind=Jkind.value ~why:(Primitive type_ident)) + ?(jkind=Jkind.Primitive.value ~why:(Primitive type_ident)) + (* [jkind_annotation] is just used for printing. It's best to + provide it if the jkind is not implied by the kind of the + type, as then the type, if printed, will be clearer. + *) + ?jkind_annotation env = let decl = {type_params = []; type_arity = 0; type_kind = kind; type_jkind = jkind; + type_jkind_annotation = predef_jkind_annotation jkind_annotation; type_loc = Location.none; type_private = Asttypes.Public; type_manifest = manifest; @@ -182,6 +231,7 @@ let mk_add_type add_type type_attributes = []; type_unboxed_default = false; type_uid = Uid.of_predef_id type_ident; + type_has_illegal_crossings = false; } in add_type type_ident decl env @@ -192,14 +242,24 @@ let build_initial_env add_type add_extension empty_env = let add_type = mk_add_type add_type and add_type1 type_ident ?(kind=fun _ -> Type_abstract Abstract_def) - ?(jkind=Jkind.value ~why:(Primitive type_ident)) + ?(jkind=Jkind.Primitive.value ~why:(Primitive type_ident)) + (* See the comment on the [jkind_annotation] argument to [mk_add_type] + *) + ?jkind_annotation + ?(param_jkind=Jkind.Primitive.value ~why:( + Type_argument { + parent_path = Path.Pident type_ident; + position = 1; + arity = 1} + )) ~variance ~separability env = - let param = newgenvar (Jkind.value ~why:Type_argument) in + let param = newgenvar param_jkind in let decl = {type_params = [param]; type_arity = 1; type_kind = kind param; type_jkind = jkind; + type_jkind_annotation = predef_jkind_annotation jkind_annotation; type_loc = Location.none; type_private = Asttypes.Public; type_manifest = None; @@ -210,16 +270,41 @@ let build_initial_env add_type add_extension empty_env = type_attributes = []; type_unboxed_default = false; type_uid = Uid.of_predef_id type_ident; + type_has_illegal_crossings = false; } in add_type type_ident decl env in let add_extension id args jkinds = + Array.iter (fun jkind -> + let raise_error () = Misc.fatal_error + "sanity check failed: non-value jkind in predef extension \ + constructor; should this have Constructor_mixed shape?" in + match Jkind.get jkind with + | Const const -> + begin + match Jkind.Const.get_layout const with + | Sort Value -> () + | Any | Sort (Void | Float32 | Float64 | Word | Bits32 | Bits64) -> + raise_error () + end + | _ -> raise_error ()) + jkinds; add_extension id { ext_type_path = path_exn; ext_type_params = []; - ext_args = Cstr_tuple (List.map (fun x -> (x, Unrestricted)) args); + ext_args = + Cstr_tuple + (List.map + (fun x -> + { + ca_type=x; + ca_modalities=Mode.Modality.Value.Const.id; + ca_loc=Location.none + }) + args); ext_arg_jkinds = jkinds; + ext_shape = Constructor_uniform_value; ext_constant = args = []; ext_ret_type = None; ext_private = Asttypes.Public; @@ -231,26 +316,35 @@ let build_initial_env add_type add_extension empty_env = } in let variant constrs jkinds = Type_variant (constrs, Variant_boxed jkinds) in + let unrestricted tvar = + {ca_type=tvar; + ca_modalities=Mode.Modality.Value.Const.id; + ca_loc=Location.none} + in empty_env (* Predefined types *) |> add_type1 ident_array ~variance:Variance.full ~separability:Separability.Ind + ~param_jkind:(Jkind.Primitive.any_non_null ~why:Array_type_argument) |> add_type1 ident_iarray ~variance:Variance.covariant ~separability:Separability.Ind |> add_type ident_bool - ~kind:(variant [cstr ident_false []; cstr ident_true []] - [| [| |]; [| |] |]) - ~jkind:(Jkind.immediate ~why:Enumeration) - |> add_type ident_char ~jkind:(Jkind.immediate ~why:(Primitive ident_char)) + ~kind:(variant [ cstr ident_false []; cstr ident_true []] + [| Constructor_uniform_value, [| |]; + Constructor_uniform_value, [| |] |]) + ~jkind:(Jkind.Primitive.immediate ~why:Enumeration) + |> add_type ident_char ~jkind:(Jkind.Primitive.immediate ~why:(Primitive ident_char)) + ~jkind_annotation:Jkind.Const.Primitive.immediate |> add_type ident_exn ~kind:Type_open - ~jkind:(Jkind.value ~why:Extensible_variant) + ~jkind:(Jkind.Primitive.value ~why:Extensible_variant) |> add_type ident_extension_constructor |> add_type ident_float |> add_type ident_floatarray - |> add_type ident_int ~jkind:(Jkind.immediate ~why:(Primitive ident_int)) + |> add_type ident_int ~jkind:(Jkind.Primitive.immediate ~why:(Primitive ident_int)) + ~jkind_annotation:Jkind.Const.Primitive.immediate |> add_type ident_int32 |> add_type ident_int64 |> add_type1 ident_lazy_t @@ -261,48 +355,94 @@ let build_initial_env add_type add_extension empty_env = ~separability:Separability.Ind ~kind:(fun tvar -> variant [cstr ident_nil []; - cstr ident_cons [tvar, Unrestricted; - type_list tvar, Unrestricted]] - [| [| |]; [| Jkind.value ~why:Type_argument; - Jkind.value ~why:Boxed_variant |] |] ) - ~jkind:(Jkind.value ~why:Boxed_variant) + cstr ident_cons [unrestricted tvar; + type_list tvar |> unrestricted]] + [| Constructor_uniform_value, [| |]; + Constructor_uniform_value, + [| list_argument_jkind; + Jkind.Primitive.value ~why:Boxed_variant; + |]; + |] ) + ~jkind:(Jkind.Primitive.value ~why:Boxed_variant) |> add_type ident_nativeint |> add_type1 ident_option ~variance:Variance.covariant ~separability:Separability.Ind ~kind:(fun tvar -> - variant [cstr ident_none []; cstr ident_some [tvar, Unrestricted]] - [| [| |]; [| Jkind.value ~why:Type_argument |] |]) - ~jkind:(Jkind.value ~why:Boxed_variant) + variant [cstr ident_none []; cstr ident_some [unrestricted tvar]] + [| Constructor_uniform_value, [| |]; + Constructor_uniform_value, [| option_argument_jkind |]; + |]) + ~jkind:(Jkind.Primitive.value ~why:Boxed_variant) + |> add_type ident_lexing_position + ~kind:( + let lbl (field, field_type, jkind) = + let id = Ident.create_predef field in + { + ld_id=id; + ld_mutable=Immutable; + ld_modalities=Mode.Modality.Value.Const.id; + ld_type=field_type; + ld_jkind=jkind; + ld_loc=Location.none; + ld_attributes=[]; + ld_uid=Uid.of_predef_id id; + } + in + let immediate = Jkind.Primitive.value ~why:(Primitive ident_int) in + let labels = List.map lbl [ + ("pos_fname", type_string, Jkind.Primitive.value ~why:(Primitive ident_string)); + ("pos_lnum", type_int, immediate); + ("pos_bol", type_int, immediate); + ("pos_cnum", type_int, immediate) ] + in + Type_record ( + labels, + (Record_boxed (List.map (fun label -> label.ld_jkind) labels |> Array.of_list)) + ) + ) + ~jkind:(Jkind.Primitive.value ~why:Boxed_record) |> add_type ident_string |> add_type ident_unboxed_float - ~jkind:(Jkind.float64 ~why:(Primitive ident_unboxed_float)) + ~jkind:(Jkind.Primitive.float64 ~why:(Primitive ident_unboxed_float)) + ~jkind_annotation:Jkind.Const.Primitive.float64 + |> add_type ident_unboxed_nativeint + ~jkind:(Jkind.add_mode_crossing (Jkind.Primitive.word ~why:(Primitive ident_unboxed_nativeint))) + ~jkind_annotation:Jkind.Const.Primitive.word + |> add_type ident_unboxed_int32 + ~jkind:(Jkind.add_mode_crossing (Jkind.Primitive.bits32 ~why:(Primitive ident_unboxed_int32))) + ~jkind_annotation:Jkind.Const.Primitive.bits32 + |> add_type ident_unboxed_int64 + ~jkind:(Jkind.add_mode_crossing (Jkind.Primitive.bits64 ~why:(Primitive ident_unboxed_int64))) + ~jkind_annotation:Jkind.Const.Primitive.bits64 |> add_type ident_bytes |> add_type ident_unit - ~kind:(variant [cstr ident_void []] [| [| |] |]) - ~jkind:(Jkind.immediate ~why:Enumeration) + ~kind:(variant + [cstr ident_void []] + [| Constructor_uniform_value, [| |] |]) + ~jkind:(Jkind.Primitive.immediate ~why:Enumeration) (* Predefined exceptions - alphabetical order *) |> add_extension ident_assert_failure - [newgenty (Ttuple[type_string; type_int; type_int])] - [| Jkind.value ~why:Tuple |] + [newgenty (Ttuple[None, type_string; None, type_int; None, type_int])] + [| Jkind.Primitive.value ~why:Tuple |] |> add_extension ident_division_by_zero [] [||] |> add_extension ident_end_of_file [] [||] |> add_extension ident_failure [type_string] - [| Jkind.value ~why:(Primitive ident_string) |] + [| Jkind.Primitive.value ~why:(Primitive ident_string) |] |> add_extension ident_invalid_argument [type_string] - [| Jkind.value ~why:(Primitive ident_string) |] + [| Jkind.Primitive.value ~why:(Primitive ident_string) |] |> add_extension ident_match_failure - [newgenty (Ttuple[type_string; type_int; type_int])] - [| Jkind.value ~why:Tuple |] + [newgenty (Ttuple[None, type_string; None, type_int; None, type_int])] + [| Jkind.Primitive.value ~why:Tuple |] |> add_extension ident_not_found [] [||] |> add_extension ident_out_of_memory [] [||] |> add_extension ident_stack_overflow [] [||] |> add_extension ident_sys_blocked_io [] [||] |> add_extension ident_sys_error [type_string] - [| Jkind.value ~why:(Primitive ident_string) |] + [| Jkind.Primitive.value ~why:(Primitive ident_string) |] |> add_extension ident_undefined_recursive_module - [newgenty (Ttuple[type_string; type_int; type_int])] - [| Jkind.value ~why:Tuple |] + [newgenty (Ttuple[None, type_string; None, type_int; None, type_int])] + [| Jkind.Primitive.value ~why:Tuple |] let add_simd_extension_types add_type env = let add_type = mk_add_type add_type in @@ -314,6 +454,14 @@ let add_simd_extension_types add_type env = |> add_type ident_float32x4 |> add_type ident_float64x2 +let add_small_number_extension_types add_type env = + let add_type = mk_add_type add_type in + env + |> add_type ident_float32 + |> add_type ident_unboxed_float32 + ~jkind:(Jkind.Primitive.float32 ~why:(Primitive ident_unboxed_float32)) + ~jkind_annotation:Jkind.Const.Primitive.float32 + let builtin_values = List.map (fun id -> (Ident.name id, id)) all_predef_exns diff --git a/typing/predef.mli b/typing/predef.mli index 8eaffa0fe1f..dd70dd63801 100644 --- a/typing/predef.mli +++ b/typing/predef.mli @@ -22,6 +22,7 @@ val type_char: type_expr val type_string: type_expr val type_bytes: type_expr val type_float: type_expr +val type_float32: type_expr val type_bool: type_expr val type_unit: type_expr val type_exn: type_expr @@ -35,7 +36,12 @@ val type_int64: type_expr val type_lazy_t: type_expr -> type_expr val type_extension_constructor:type_expr val type_floatarray:type_expr +val type_lexing_position:type_expr val type_unboxed_float:type_expr +val type_unboxed_float32:type_expr +val type_unboxed_nativeint:type_expr +val type_unboxed_int32:type_expr +val type_unboxed_int64:type_expr val type_int8x16: type_expr val type_int16x8: type_expr @@ -49,6 +55,7 @@ val path_char: Path.t val path_string: Path.t val path_bytes: Path.t val path_float: Path.t +val path_float32: Path.t val path_bool: Path.t val path_unit: Path.t val path_exn: Path.t @@ -62,7 +69,13 @@ val path_int64: Path.t val path_lazy_t: Path.t val path_extension_constructor: Path.t val path_floatarray: Path.t +val path_lexing_position: Path.t + val path_unboxed_float: Path.t +val path_unboxed_float32: Path.t +val path_unboxed_nativeint: Path.t +val path_unboxed_int32: Path.t +val path_unboxed_int64: Path.t val path_int8x16: Path.t val path_int16x8: Path.t @@ -84,6 +97,11 @@ val ident_cons : Ident.t val ident_none : Ident.t val ident_some : Ident.t +(* The jkind used for optional function argument types *) +val option_argument_jkind : Jkind.t +(* The jkind used for list argument types *) +val list_argument_jkind : Jkind.t + (* To build the initial environment. Since there is a nasty mutual recursion between predef and env, we break it by parameterizing over Env.t, Env.add_type and Env.add_extension. *) @@ -98,6 +116,11 @@ val build_initial_env: val add_simd_extension_types : (Ident.t -> type_declaration -> 'a -> 'a) -> 'a -> 'a +(* Add small number types to an environment. This is separate from [build_initial_env] + because we'd like to only do it if the small numbers extension is on. *) +val add_small_number_extension_types : + (Ident.t -> type_declaration -> 'a -> 'a) -> 'a -> 'a + (* To initialize linker tables *) val builtin_values: (string * Ident.t) list diff --git a/typing/primitive.ml b/typing/primitive.ml index 42baefb6228..0bcceab3077 100644 --- a/typing/primitive.ml +++ b/typing/primitive.ml @@ -22,11 +22,14 @@ type boxed_integer = Pnativeint | Pint32 | Pint64 type vec128_type = Int8x16 | Int16x8 | Int32x4 | Int64x2 | Float32x4 | Float64x2 +type boxed_float = Pfloat64 | Pfloat32 + type boxed_vector = Pvec128 of vec128_type type native_repr = - | Same_as_ocaml_repr of Jkind.Sort.const - | Unboxed_float + | Repr_poly + | Same_as_ocaml_repr of Jkind_types.Sort.const + | Unboxed_float of boxed_float | Unboxed_vector of boxed_vector | Unboxed_integer of boxed_integer | Untagged_int @@ -39,7 +42,7 @@ type mode = | Prim_global | Prim_poly -type description = +type 'repr description_gen = { prim_name: string; (* Name of primitive or C function *) prim_arity: int; (* Number of arguments *) prim_alloc: bool; (* Does it allocates or raise? *) @@ -47,8 +50,11 @@ type description = prim_effects: effects; prim_coeffects: coeffects; prim_native_name: string; (* Name of C function for the nat. code gen. *) - prim_native_repr_args: (mode * native_repr) list; - prim_native_repr_res: mode * native_repr } + prim_native_repr_args: (mode * 'repr) list; + prim_native_repr_res: mode * 'repr; + prim_is_layout_poly: bool } + +type description = native_repr description_gen type error = | Old_style_float_with_native_repr_attribute @@ -58,6 +64,8 @@ type error = | No_native_primitive_with_non_value | Inconsistent_attributes_for_effects | Inconsistent_noalloc_attributes_for_effects + | Invalid_representation_polymorphic_attribute + | Invalid_native_repr_for_primitive of string exception Error of Location.t * error @@ -65,46 +73,24 @@ type value_check = Bad_attribute | Bad_layout | Ok_value let check_ocaml_value = function | _, Same_as_ocaml_repr Value -> Ok_value - | _, Same_as_ocaml_repr _ -> Bad_layout - | _, Unboxed_float + | _, Same_as_ocaml_repr _ + | _, Repr_poly -> Bad_layout + | _, Unboxed_float _ | _, Unboxed_vector _ | _, Unboxed_integer _ | _, Untagged_int -> Bad_attribute -let is_unboxed = function - | _, Same_as_ocaml_repr _ - | _, Untagged_int -> false - | _, Unboxed_float - | _, Unboxed_vector _ - | _, Unboxed_integer _ -> true - -let is_untagged = function - | _, Untagged_int -> true - | _, Same_as_ocaml_repr _ - | _, Unboxed_float - | _, Unboxed_vector _ - | _, Unboxed_integer _ -> false +let is_builtin_prim_name name = String.length name > 0 && name.[0] = '%' -let rec make_native_repr_args arity x = +let rec make_prim_repr_args arity x = if arity = 0 then [] else - x :: make_native_repr_args (arity - 1) x - -let simple_on_values ~name ~arity ~alloc = - {prim_name = name; - prim_arity = arity; - prim_alloc = alloc; - prim_c_builtin = false; - prim_effects = Arbitrary_effects; - prim_coeffects = Has_coeffects; - prim_native_name = ""; - prim_native_repr_args = - make_native_repr_args arity (Prim_global, Same_as_ocaml_repr Jkind.Sort.Value); - prim_native_repr_res = (Prim_global, Same_as_ocaml_repr Jkind.Sort.Value) } + x :: make_prim_repr_args (arity - 1) x let make ~name ~alloc ~c_builtin ~effects ~coeffects - ~native_name ~native_repr_args ~native_repr_res = + ~native_name ~native_repr_args ~native_repr_res + ~is_layout_poly = {prim_name = name; prim_arity = List.length native_repr_args; prim_alloc = alloc; @@ -113,9 +99,10 @@ let make ~name ~alloc ~c_builtin ~effects ~coeffects prim_coeffects = coeffects; prim_native_name = native_name; prim_native_repr_args = native_repr_args; - prim_native_repr_res = native_repr_res } + prim_native_repr_res = native_repr_res; + prim_is_layout_poly = is_layout_poly } -let parse_declaration valdecl ~native_repr_args ~native_repr_res = +let parse_declaration valdecl ~native_repr_args ~native_repr_res ~is_layout_poly = let arity = List.length native_repr_args in let name, native_name, old_style_noalloc, old_style_float = match valdecl.pval_prim with @@ -145,6 +132,13 @@ let parse_declaration valdecl ~native_repr_args ~native_repr_res = "ocaml.only_generative_effects"] valdecl.pval_attributes in + let is_builtin_prim = is_builtin_prim_name name in + let prim_is_layout_poly = + match is_builtin_prim, is_layout_poly with + | false, true -> raise (Error (valdecl.pval_loc, + Invalid_representation_polymorphic_attribute)) + | _, b -> b + in if no_effects_attribute && only_generative_effects_attribute then raise (Error (valdecl.pval_loc, Inconsistent_attributes_for_effects)); @@ -194,7 +188,7 @@ let parse_declaration valdecl ~native_repr_args ~native_repr_res = No_native_primitive_with_repr_attribute)) | Bad_layout -> (* Built-in primitives don't need a native version. *) - if not (String.length name > 0 && name.[0] = '%') then + if not is_builtin_prim then raise (Error (valdecl.pval_loc, No_native_primitive_with_non_value))) (native_repr_res :: native_repr_args); @@ -204,8 +198,8 @@ let parse_declaration valdecl ~native_repr_args ~native_repr_res = Inconsistent_noalloc_attributes_for_effects)); let native_repr_args, native_repr_res = if old_style_float then - (make_native_repr_args arity (Prim_global, Unboxed_float), - (Prim_global, Unboxed_float)) + (make_prim_repr_args arity (Prim_global, Unboxed_float Pfloat64), + (Prim_global, Unboxed_float Pfloat64)) else (native_repr_args, native_repr_res) in @@ -217,7 +211,8 @@ let parse_declaration valdecl ~native_repr_args ~native_repr_res = prim_coeffects = coeffects; prim_native_name = native_name; prim_native_repr_args = native_repr_args; - prim_native_repr_res = native_repr_res } + prim_native_repr_res = native_repr_res; + prim_is_layout_poly } open Outcometree @@ -245,6 +240,7 @@ let oattr_no_effects = { oattr_name = "no_effects" } let oattr_only_generative_effects = { oattr_name = "only_generative_effects" } let oattr_no_coeffects = { oattr_name = "no_coeffects" } let oattr_local_opt = { oattr_name = "local_opt" } +let oattr_layout_poly = { oattr_name = "layout_poly" } let print p osig_val_decl = let prims = @@ -256,6 +252,28 @@ let print p osig_val_decl = let for_all f = List.for_all f p.prim_native_repr_args && f p.prim_native_repr_res in + let is_unboxed = function + | _, Same_as_ocaml_repr Value + | _, Repr_poly + | _, Untagged_int -> false + | _, Unboxed_float _ + | _, Unboxed_vector _ + | _, Unboxed_integer _ -> true + | _, Same_as_ocaml_repr _ -> + (* We require [@unboxed] for non-value types in upstream-compatible code, + but treat it as optional otherwise. We thus print the [@unboxed] + attribute only in the case it's required and leave it out when it's + not. That's why we call [erasable_extensions_only] here. *) + Language_extension.erasable_extensions_only () + in + let is_untagged = function + | _, Untagged_int -> true + | _, Same_as_ocaml_repr _ + | _, Unboxed_float _ + | _, Unboxed_vector _ + | _, Unboxed_integer _ + | _, Repr_poly -> false + in let all_unboxed = for_all is_unboxed in let all_untagged = for_all is_untagged in let attrs = if p.prim_alloc then [] else [oattr_noalloc] in @@ -277,17 +295,28 @@ let print p osig_val_decl = else attrs in + let attrs = + if p.prim_is_layout_poly then + oattr_layout_poly :: attrs + else + attrs + in let attrs_of_mode_and_repr (m, repr) = (match m with | Prim_local | Prim_global -> [] | Prim_poly -> [oattr_local_opt]) @ (match repr with - | Same_as_ocaml_repr _ -> [] - | Unboxed_float + | Same_as_ocaml_repr Value + | Repr_poly -> [] + | Unboxed_float _ | Unboxed_vector _ | Unboxed_integer _ -> if all_unboxed then [] else [oattr_unboxed] - | Untagged_int -> if all_untagged then [] else [oattr_untagged]) + | Untagged_int -> if all_untagged then [] else [oattr_untagged] + | Same_as_ocaml_repr _-> + if all_unboxed || not (is_unboxed (m, repr)) + then [] + else [oattr_unboxed]) in let type_attrs = List.map attrs_of_mode_and_repr p.prim_native_repr_args @ @@ -323,6 +352,22 @@ let equal_boxed_integer bi1 bi2 = | (Pnativeint | Pint32 | Pint64), _ -> false +let equal_boxed_float f1 f2 = + match f1, f2 with + | Pfloat32, Pfloat32 + | Pfloat64, Pfloat64 -> true + | (Pfloat32 | Pfloat64), _ -> false + +let equal_vec128_type v1 v2 = + match v1, v2 with + | Int8x16, Int8x16 -> true + | Int16x8, Int16x8 -> true + | Int32x4, Int32x4 -> true + | Int64x2, Int64x2 -> true + | Float32x4, Float32x4 -> true + | Float64x2, Float64x2 -> true + | (Int8x16 | Int16x8 | Int32x4 | Int64x2 | Float32x4 | Float64x2), _ -> false + let equal_boxed_vector_size bi1 bi2 = (* For the purposes of layouts/native representations, all 128-bit vector types are equal. *) @@ -331,21 +376,31 @@ let equal_boxed_vector_size bi1 bi2 = let equal_native_repr nr1 nr2 = match nr1, nr2 with - | Same_as_ocaml_repr s1, Same_as_ocaml_repr s2 -> Jkind.Sort.equal_const s1 s2 + | Repr_poly, Repr_poly -> true + | Repr_poly, (Unboxed_float _ | Unboxed_integer _ + | Untagged_int | Unboxed_vector _ | Same_as_ocaml_repr _) + | (Unboxed_float _ | Unboxed_integer _ + | Untagged_int | Unboxed_vector _ | Same_as_ocaml_repr _), Repr_poly -> false + | Same_as_ocaml_repr s1, Same_as_ocaml_repr s2 -> Jkind_types.Sort.Const.equal s1 s2 | Same_as_ocaml_repr _, - (Unboxed_float | Unboxed_integer _ | Untagged_int | Unboxed_vector _) -> false - | Unboxed_float, Unboxed_float -> true - | Unboxed_float, - (Same_as_ocaml_repr _ | Unboxed_integer _ | Untagged_int | Unboxed_vector _) -> false + (Unboxed_float _ | Unboxed_integer _ | Untagged_int | + Unboxed_vector _) -> false + | Unboxed_float f1, Unboxed_float f2 -> equal_boxed_float f1 f2 + | Unboxed_float _, + (Same_as_ocaml_repr _ | Unboxed_integer _ | Untagged_int | + Unboxed_vector _) -> false | Unboxed_vector vi1, Unboxed_vector vi2 -> equal_boxed_vector_size vi1 vi2 | Unboxed_vector _, - (Same_as_ocaml_repr _ | Unboxed_float | Untagged_int | Unboxed_integer _) -> false + (Same_as_ocaml_repr _ | Unboxed_float _ | Untagged_int | + Unboxed_integer _) -> false | Unboxed_integer bi1, Unboxed_integer bi2 -> equal_boxed_integer bi1 bi2 | Unboxed_integer _, - (Same_as_ocaml_repr _ | Unboxed_float | Untagged_int | Unboxed_vector _) -> false + (Same_as_ocaml_repr _ | Unboxed_float _ | Untagged_int | + Unboxed_vector _) -> false | Untagged_int, Untagged_int -> true | Untagged_int, - (Same_as_ocaml_repr _ | Unboxed_float | Unboxed_integer _ | Unboxed_vector _) -> false + (Same_as_ocaml_repr _ | Unboxed_float _ | Unboxed_integer _ | + Unboxed_vector _) -> false let equal_effects ef1 ef2 = match ef1, ef2 with @@ -367,9 +422,331 @@ let native_name_is_external p = let nat_name = native_name p in nat_name <> "" && nat_name.[0] <> '%' -let sort_of_native_repr = function - | Same_as_ocaml_repr s -> s - | (Unboxed_float | Unboxed_integer _ | Untagged_int | Unboxed_vector _) -> Jkind.Sort.Value +module Repr_check = struct + + type result = + | Wrong_arity + | Wrong_repr + | Success + + let args_res_reprs prim = + (prim.prim_native_repr_args @ [prim.prim_native_repr_res]) + |> List.map snd + + let is repr = equal_native_repr repr + + let any = fun _ -> true + + let value_or_unboxed_or_untagged = function + | Same_as_ocaml_repr Value + | Unboxed_float _ | Unboxed_integer _ | Unboxed_vector _ + | Untagged_int -> true + | Same_as_ocaml_repr _ | Repr_poly -> false + + let check checks prim = + let reprs = args_res_reprs prim in + if List.length reprs <> List.length checks + then Wrong_arity + else + if not (List.for_all2 (fun f x -> f x) checks reprs) + then Wrong_repr + else Success + + let exactly required = + check (List.map is required) + + let same_arg_res_repr_with_arity arity prim = + let repr = snd prim.prim_native_repr_res in + exactly + (List.init (arity+1) (fun _ -> repr)) + prim + + let no_non_value_repr prim = + let arity = List.length prim.prim_native_repr_args in + check + (List.init (arity+1) (fun _ -> value_or_unboxed_or_untagged)) + prim +end + +(* Note: [any] here is not the same as jkind [any]. It means we allow any + [native_repr] for the corresponding argument or return. It's [Typedecl]'s + responsibility to check that types in externals are representable or marked + with [@layout_poly] (see [make_native_repr] and the note above + [error_if_containing_unexpected_jkind]). Here we have more speicific checks + for individual primitives. *) +let prim_has_valid_reprs ~loc prim = + let open Repr_check in + let check = + match prim.prim_name with + | "%identity" + | "%opaque" + | "%obj_magic" -> + same_arg_res_repr_with_arity 1 + + | "%ignore" -> + check [any; is (Same_as_ocaml_repr Value)] + | "%revapply" -> + check [any; is (Same_as_ocaml_repr Value); any] + | "%apply" -> + check [is (Same_as_ocaml_repr Value); any; any] + + (* This doesn't prevent + + {| + external get : float# array -> int -> int32# = + "%array_safe_get" + |} + + but the same is true for types: + + {| + external get : float array -> int -> int32 = + "%array_safe_get" + |} + *) + | "%array_safe_get" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Value); + any] + | "%array_safe_set" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Value); + any; + is (Same_as_ocaml_repr Value)] + | "%array_unsafe_get" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Value); + any] + | "%array_unsafe_set" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Value); + any; + is (Same_as_ocaml_repr Value)] + + | "%array_safe_get_indexed_by_int64#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits64); + any] + | "%array_safe_set_indexed_by_int64#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits64); + any; + is (Same_as_ocaml_repr Value)] + | "%array_unsafe_get_indexed_by_int64#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits64); + any] + | "%array_unsafe_set_indexed_by_int64#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits64); + any; + is (Same_as_ocaml_repr Value)] + | "%array_safe_get_indexed_by_int32#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits32); + any] + | "%array_safe_set_indexed_by_int32#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits32); + any; + is (Same_as_ocaml_repr Value)] + | "%array_unsafe_get_indexed_by_int32#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits32); + any] + | "%array_unsafe_set_indexed_by_int32#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Bits32); + any; + is (Same_as_ocaml_repr Value)] + | "%array_safe_get_indexed_by_nativeint#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Word); + any] + | "%array_safe_set_indexed_by_nativeint#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Word); + any; + is (Same_as_ocaml_repr Value)] + | "%array_unsafe_get_indexed_by_nativeint#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Word); + any] + | "%array_unsafe_set_indexed_by_nativeint#" -> + check [ + is (Same_as_ocaml_repr Value); + is (Same_as_ocaml_repr Word); + any; + is (Same_as_ocaml_repr Value)] + + | "%box_float" -> + exactly [Same_as_ocaml_repr Float64; Same_as_ocaml_repr Value] + | "%unbox_float" -> + exactly [Same_as_ocaml_repr Value; Same_as_ocaml_repr Float64] + | "%box_float32" -> + exactly [Same_as_ocaml_repr Float32; Same_as_ocaml_repr Value] + | "%unbox_float32" -> + exactly [Same_as_ocaml_repr Value; Same_as_ocaml_repr Float32] + | "%box_nativeint" -> + exactly [Same_as_ocaml_repr Word; Same_as_ocaml_repr Value] + | "%unbox_nativeint" -> + exactly [Same_as_ocaml_repr Value; Same_as_ocaml_repr Word] + | "%box_int32" -> + exactly [Same_as_ocaml_repr Bits32; Same_as_ocaml_repr Value] + | "%unbox_int32" -> + exactly [Same_as_ocaml_repr Value; Same_as_ocaml_repr Bits32] + | "%box_int64" -> + exactly [Same_as_ocaml_repr Bits64; Same_as_ocaml_repr Value] + | "%unbox_int64" -> + exactly [Same_as_ocaml_repr Value; Same_as_ocaml_repr Bits64] + + | "%reinterpret_tagged_int63_as_unboxed_int64" -> + exactly [Same_as_ocaml_repr Value; Same_as_ocaml_repr Bits64] + | "%reinterpret_unboxed_int64_as_tagged_int63" -> + exactly [Same_as_ocaml_repr Bits64; Same_as_ocaml_repr Value] + + (* Bigstring primitives *) + | "%caml_bigstring_get32#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits32] + | "%caml_bigstring_getf32#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Float32] + | "%caml_bigstring_get32u#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits32] + | "%caml_bigstring_getf32u#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Float32] + | "%caml_bigstring_get64#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits64] + | "%caml_bigstring_get64u#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits64] + + (* CR layouts: add these when we have unboxed simd layouts *) + (* | "%caml_bigstring_getu128#" -> + | "%caml_bigstring_getu128u#" -> + | "%caml_bigstring_geta128#" -> + | "%caml_bigstring_geta128u#" -> *) + + | "%caml_bigstring_set32#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits32; + Same_as_ocaml_repr Value] + | "%caml_bigstring_setf32#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Float32; + Same_as_ocaml_repr Value] + | "%caml_bigstring_set32u#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits32; + Same_as_ocaml_repr Value] + | "%caml_bigstring_setf32u#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Float32; + Same_as_ocaml_repr Value] + | "%caml_bigstring_set64#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits64; + Same_as_ocaml_repr Value] + | "%caml_bigstring_set64u#" -> + exactly [ + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Value; + Same_as_ocaml_repr Bits64; + Same_as_ocaml_repr Value] + + (* CR layouts: add these when we have unboxed simd layouts *) + (* | "%caml_bigstring_setu128#" -> + | "%caml_bigstring_setu128u#" -> + | "%caml_bigstring_seta128#" -> + | "%caml_bigstring_seta128u#" -> *) + + | name when is_builtin_prim_name name -> + no_non_value_repr + + (* These can probably support non-value reprs if the need arises: + {| + | "%send" + | "%sendself" + | "%sendcache" + |} + *) + | _ -> + (* make no assumptions about external c primitives *) + fun _ -> Success + in + match check prim with + | Success -> () + | Wrong_arity -> + (* There's already an arity check in translprim that catches this. We will + defer to that logic. We are only checking the arity of some built-in + primitives here but not all, and it would be weird to raise different + errors dependent on the [prim_name]. *) + () + | Wrong_repr -> + raise (Error (loc, + Invalid_native_repr_for_primitive (prim.prim_name))) + +let prim_can_contain_layout_any prim = + match prim.prim_name with + | "%array_length" + | "%array_safe_get" + | "%array_safe_set" + | "%array_unsafe_get" + | "%array_unsafe_set" + | "%array_safe_get_indexed_by_int64#" + | "%array_safe_set_indexed_by_int64#" + | "%array_unsafe_get_indexed_by_int64#" + | "%array_unsafe_set_indexed_by_int64#" + | "%array_safe_get_indexed_by_int32#" + | "%array_safe_set_indexed_by_int32#" + | "%array_unsafe_get_indexed_by_int32#" + | "%array_unsafe_set_indexed_by_int32#" + | "%array_safe_get_indexed_by_nativeint#" + | "%array_safe_set_indexed_by_nativeint#" + | "%array_unsafe_get_indexed_by_nativeint#" + | "%array_unsafe_set_indexed_by_nativeint#" -> false + | _ -> true let report_error ppf err = match err with @@ -396,6 +773,15 @@ let report_error ppf err = | Inconsistent_noalloc_attributes_for_effects -> Format.fprintf ppf "Cannot use [%@%@no_generative_effects] \ in conjunction with [%@%@noalloc]." + | Invalid_representation_polymorphic_attribute -> + Format.fprintf ppf "Attribute [%@layout_poly] can only be used \ + on built-in primitives." + | Invalid_native_repr_for_primitive name -> + Format.fprintf ppf + "The primitive [%s] is used in an invalid declaration.@ \ + The declaration contains argument/return types with the@ \ + wrong layout." + name let () = Location.register_error_of_exn diff --git a/typing/primitive.mli b/typing/primitive.mli index cf801a2ac4e..60f7c847f2d 100644 --- a/typing/primitive.mli +++ b/typing/primitive.mli @@ -17,6 +17,8 @@ type boxed_integer = Pnativeint | Pint32 | Pint64 +type boxed_float = Pfloat64 | Pfloat32 + type vec128_type = Int8x16 | Int16x8 | Int32x4 | Int64x2 | Float32x4 | Float64x2 type boxed_vector = Pvec128 of vec128_type @@ -24,8 +26,9 @@ type boxed_vector = Pvec128 of vec128_type (* Representation of arguments/result for the native code version of a primitive *) type native_repr = - | Same_as_ocaml_repr of Jkind.Sort.const - | Unboxed_float + | Repr_poly + | Same_as_ocaml_repr of Jkind_types.Sort.const + | Unboxed_float of boxed_float | Unboxed_vector of boxed_vector | Unboxed_integer of boxed_integer | Untagged_int @@ -43,7 +46,7 @@ type mode = typechecking, all [Prim_poly] modes on a given primitive application will be instantiated either all to [Local] or all to [Global] *) -type description = private +type 'repr description_gen = private { prim_name: string; (* Name of primitive or C function *) prim_arity: int; (* Number of arguments *) prim_alloc: bool; (* Does it allocates or raise? *) @@ -56,16 +59,18 @@ type description = private prim_effects: effects; prim_coeffects: coeffects; prim_native_name: string; (* Name of C function for the nat. code gen. *) - prim_native_repr_args: (mode * native_repr) list; - prim_native_repr_res: mode * native_repr } + prim_native_repr_args: (mode * 'repr) list; + prim_native_repr_res: mode * 'repr; + prim_is_layout_poly: bool } + +type description = native_repr description_gen (* Invariant [List.length d.prim_native_repr_args = d.prim_arity] *) -val simple_on_values - : name:string - -> arity:int - -> alloc:bool - -> description +(** [make_prim_repr_args n x] is the same as [List.init n (fun _ -> x)]. + Keeping this function here to be close to upstream. It's + intended for use with [make]. *) +val make_prim_repr_args : int -> 'a -> 'a list val make : name:string @@ -74,14 +79,16 @@ val make -> effects:effects -> coeffects:coeffects -> native_name:string - -> native_repr_args: (mode * native_repr) list - -> native_repr_res: mode * native_repr - -> description + -> native_repr_args: (mode * 'repr) list + -> native_repr_res: mode * 'repr + -> is_layout_poly: bool + -> 'repr description_gen val parse_declaration : Parsetree.value_description -> native_repr_args:(mode * native_repr) list -> native_repr_res:(mode * native_repr) + -> is_layout_poly:bool -> description val print @@ -89,11 +96,13 @@ val print -> Outcometree.out_val_decl -> Outcometree.out_val_decl -val native_name: description -> string -val byte_name: description -> string +val native_name: 'a description_gen -> string +val byte_name: 'a description_gen -> string val vec128_name: vec128_type -> string val equal_boxed_integer : boxed_integer -> boxed_integer -> bool +val equal_boxed_float : boxed_float -> boxed_float -> bool +val equal_vec128_type : vec128_type -> vec128_type -> bool val equal_boxed_vector_size : boxed_vector -> boxed_vector -> bool val equal_native_repr : native_repr -> native_repr -> bool val equal_effects : effects -> effects -> bool @@ -104,9 +113,16 @@ val equal_coeffects : coeffects -> coeffects -> bool compiler itself. *) val native_name_is_external : description -> bool -(** [sort_of_native_repr] returns the sort expected during typechecking (which - may be different than the sort used in the external interface). *) -val sort_of_native_repr : native_repr -> Jkind.Sort.const +(** Check if a primitive has the correct native representations for its + argument/return types. This check is done based on the primitive name and + only imposes constraints on built-in primitives. Raises if the check + fails. *) +val prim_has_valid_reprs : loc:Location.t -> description -> unit + +(** Check if a primitive can have layout [any] anywhere within its type + declaration. Returns [false] for built-in primitives that inspect + the layout of type parameters ([%array_length] for example). *) +val prim_can_contain_layout_any : description -> bool type error = | Old_style_float_with_native_repr_attribute @@ -116,5 +132,7 @@ type error = | No_native_primitive_with_non_value | Inconsistent_attributes_for_effects | Inconsistent_noalloc_attributes_for_effects + | Invalid_representation_polymorphic_attribute + | Invalid_native_repr_for_primitive of string exception Error of Location.t * error diff --git a/typing/printpat.ml b/typing/printpat.ml index f636809983a..9bd8b25a6b5 100644 --- a/typing/printpat.ml +++ b/typing/printpat.ml @@ -29,9 +29,18 @@ let pretty_const c = match c with | Const_char c -> Printf.sprintf "%C" c | Const_string (s, _, _) -> Printf.sprintf "%S" s | Const_float f -> Printf.sprintf "%s" f +| Const_float32 f -> Printf.sprintf "%s" f +| Const_unboxed_float f -> Printf.sprintf "%s" (Misc.format_as_unboxed_literal f) +| Const_unboxed_float32 f -> Printf.sprintf "%ss" (Misc.format_as_unboxed_literal f) | Const_int32 i -> Printf.sprintf "%ldl" i | Const_int64 i -> Printf.sprintf "%LdL" i | Const_nativeint i -> Printf.sprintf "%ndn" i +| Const_unboxed_int32 i -> + Printf.sprintf "%sl" (Misc.format_as_unboxed_literal (Int32.to_string i)) +| Const_unboxed_int64 i -> + Printf.sprintf "%sL" (Misc.format_as_unboxed_literal (Int64.to_string i)) +| Const_unboxed_nativeint i -> + Printf.sprintf "%sn" (Misc.format_as_unboxed_literal (Nativeint.to_string i)) let pretty_extra ppf (cstr, _loc, _attrs) pretty_rest rest = match cstr with @@ -55,7 +64,7 @@ let rec pretty_val : type k . _ -> k general_pattern -> _ = fun ppf v -> | Tpat_var (x,_,_,_) -> fprintf ppf "%s" (Ident.name x) | Tpat_constant c -> fprintf ppf "%s" (pretty_const c) | Tpat_tuple vs -> - fprintf ppf "@[(%a)@]" (pretty_vals ",") vs + fprintf ppf "@[(%a)@]" (pretty_list pretty_labeled_val ",") vs | Tpat_construct (_, cstr, [], _) -> fprintf ppf "%s" cstr.cstr_name | Tpat_construct (_, cstr, [w], None) -> @@ -94,11 +103,8 @@ let rec pretty_val : type k . _ -> k general_pattern -> _ = fun ppf v -> fprintf ppf "@[{%a%t}@]" pretty_lvals filtered_lvs elision_mark end - | Tpat_array (am, vs) -> - let punct = match am with - | Mutable -> '|' - | Immutable -> ':' - in + | Tpat_array (am, _arg_sort, vs) -> + let punct = if Types.is_mutable am then '|' else ':' in fprintf ppf "@[[%c %a %c]@]" punct (pretty_vals " ;") vs punct | Tpat_lazy v -> fprintf ppf "@[<2>lazy@ %a@]" pretty_arg v @@ -134,11 +140,22 @@ and pretty_or : type k . _ -> k general_pattern -> _ = fun ppf v -> fprintf ppf "%a|@,%a" pretty_or v pretty_or w | _ -> pretty_val ppf v -and pretty_vals sep ppf = function - | [] -> () - | [v] -> pretty_val ppf v - | v::vs -> - fprintf ppf "%a%s@ %a" pretty_val v sep (pretty_vals sep) vs +and pretty_list : type k . (_ -> k -> _) -> _ -> _ -> k list -> _ = + fun print_val sep ppf -> + function + | [] -> () + | [v] -> print_val ppf v + | v::vs -> + fprintf ppf "%a%s@ %a" print_val v sep (pretty_list print_val sep) vs + +and pretty_vals sep = pretty_list pretty_val sep + +and pretty_labeled_val ppf (l, p) = + begin match l with + | Some s -> fprintf ppf "~%s:" s + | None -> () + end; + pretty_val ppf p and pretty_lvals ppf = function | [] -> () diff --git a/typing/printpat.mli b/typing/printpat.mli index 1865a2ab298..7334f588ce6 100644 --- a/typing/printpat.mli +++ b/typing/printpat.mli @@ -16,7 +16,7 @@ val pretty_const - : Asttypes.constant -> string + : Typedtree.constant -> string val top_pretty : Format.formatter -> 'k Typedtree.general_pattern -> unit val pretty_pat diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 6ebd84decbb..2f71295817c 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -40,7 +40,7 @@ module Sig_component_kind = Shape.Sig_component_kind [type 'a t : <> = ...]. We print the jkind when it cannot be inferred from the rest of what is - printed. Specifically, we print the user-written jkind in both of these + printed. Specifically, we print the user-written jkind in any of these cases: (C1.1) The type declaration is abstract and has no manifest (i.e., @@ -54,6 +54,10 @@ module Sig_component_kind = Shape.Sig_component_kind be impossible to deduce the jkind. We thus defer to the user in determining whether to print the jkind annotation. + (* CR layouts v2.8: remove this case *) + (C1.3) The type has illegal mode crossings. In this case, the jkind is overridden by + the user rather than being inferred from the definition. + Case (C2). The jkind on a type parameter to a type, like [type ('a : <>) t = ...]. @@ -123,6 +127,7 @@ let () = Env.print_longident := longident module Out_name = struct let create x = { printed_name = x } let print x = x.printed_name + let set out_name x = out_name.printed_name <- x end (** Some identifiers may require hiding when printing *) @@ -136,9 +141,13 @@ let printing_env = ref Env.empty cmi present on the file system *) let in_printing_env f = Env.without_cmis f !printing_env +let human_unique n id = Printf.sprintf "%s/%d" (Ident.name id) n + type namespace = Sig_component_kind.t = | Value | Type + | Constructor + | Label | Module | Module_type | Extension_constructor @@ -154,7 +163,7 @@ module Namespace = struct | Module_type -> 2 | Class -> 3 | Class_type -> 4 - | Extension_constructor | Value -> 5 + | Extension_constructor | Value | Constructor | Label -> 5 (* we do not handle those component *) let size = 1 + id Value @@ -174,7 +183,8 @@ module Namespace = struct | Some Module_type -> to_lookup Env.find_modtype_by_name | Some Class -> to_lookup Env.find_class_by_name | Some Class_type -> to_lookup Env.find_cltype_by_name - | None | Some(Value|Extension_constructor) -> fun _ -> raise Not_found + | None | Some(Value|Extension_constructor|Constructor|Label) -> + fun _ -> raise Not_found let location namespace id = let path = Path.Pident id in @@ -185,7 +195,8 @@ module Namespace = struct | Some Module_type -> (in_printing_env @@ Env.find_modtype path).mtd_loc | Some Class -> (in_printing_env @@ Env.find_class path).cty_loc | Some Class_type -> (in_printing_env @@ Env.find_cltype path).clty_loc - | Some (Extension_constructor|Value) | None -> Location.none + | Some (Extension_constructor|Value|Constructor|Label) | None -> + Location.none ) with Not_found -> None let best_class_namespace = function @@ -209,32 +220,15 @@ module Conflicts = struct type explanation = { kind: namespace; name:string; root_name:string; location:Location.t} let explanations = ref M.empty - - let add namespace name id = - match Namespace.location (Some namespace) id with - | None -> () - | Some location -> - let explanation = - { kind = namespace; location; name; root_name=Ident.name id} - in - explanations := M.add name explanation !explanations - - let collect_explanation namespace id ~name = + let collect_explanation namespace n id = + let name = human_unique n id in let root_name = Ident.name id in - (* if [name] is of the form "root_name/%d", we register both - [id] and the identifier in scope for [root_name]. - *) - if root_name <> name && not (M.mem name !explanations) then - begin - add namespace name id; - if not (M.mem root_name !explanations) then - (* lookup the identifier in scope with name [root_name] and - add it too - *) - match Namespace.lookup (Some namespace) root_name with - | Pident root_id -> add namespace root_name root_id - | exception Not_found | _ -> () - end + if not (M.mem name !explanations) then + match Namespace.location (Some namespace) id with + | None -> () + | Some location -> + let explanation = { kind = namespace; location; name; root_name } in + explanations := M.add name explanation !explanations let pp_explanation ppf r= Format.fprintf ppf "@[%a:@,Definition of %s %s@]" @@ -308,30 +302,43 @@ module S = String.Set let enabled = ref true let enable b = enabled := b -(* Names bound in recursive definitions should be considered as bound - in the environment when printing identifiers but not when trying - to find shortest path. - For instance, if we define - [{ - module Avoid__me = struct - type t = A - end - type t = X - type u = [` A of t * t ] - module M = struct - type t = A of [ u | `B ] - type r = Avoid__me.t - end - }] - It is is important that in the definition of [t] that the outer type [t] is - printed as [t/2] reserving the name [t] to the type being defined in the - current recursive definition. - Contrarily, in the definition of [r], one should not shorten the - path [Avoid__me.t] to [r] until the end of the definition of [r]. - The [bound_in_recursion] bridges the gap between those two slightly different - notions of printing environment. -*) -let bound_in_recursion = ref M.empty +(** Name mapping *) +type mapping = + | Need_unique_name of int Ident.Map.t + (** The same name has already been attributed to multiple types. + The [map] argument contains the specific binding time attributed to each + types. + *) + | Uniquely_associated_to of Ident.t * out_name + (** For now, the name [Ident.name id] has been attributed to [id], + [out_name] is used to expand this name if a conflict arises + at a later point + *) + | Associated_to_pervasives of out_name + (** [Associated_to_pervasives out_name] is used when the item + [Stdlib.$name] has been associated to the name [$name]. + Upon a conflict, this name will be expanded to ["Stdlib." ^ name ] *) + +let hid_start = 0 + +let add_hid_id id map = + let new_id = 1 + Ident.Map.fold (fun _ -> Int.max) map hid_start in + new_id, Ident.Map.add id new_id map + +let find_hid id map = + try Ident.Map.find id map, map with + Not_found -> add_hid_id id map + +let pervasives name = "Stdlib." ^ name + +let map = Array.make Namespace.size M.empty +let get namespace = map.(Namespace.id namespace) +let set namespace x = map.(Namespace.id namespace) <- x + +(* Names used in recursive definitions are not considered when determining + if a name is already attributed in the current environment. + This is a complementary version of hidden_rec_items used by short-path. *) +let protected = ref S.empty (* When dealing with functor arguments, identity becomes fuzzy because the same syntactic argument may be represented by different identifiers during the @@ -343,71 +350,93 @@ let with_arg id f = let fuzzy_id namespace id = namespace = Module && S.mem (Ident.name id) !fuzzy let with_hidden ids f = - let update m id = M.add (Ident.name id.ident) id.ident m in - let updated = List.fold_left update !bound_in_recursion ids in - protect_refs [ R(bound_in_recursion, updated )] f - -let human_id id index = - (* The identifier with index [k] is the (k+1)-th most recent identifier in - the printing environment. We print them as [name/(k+1)] except for [k=0] - which is printed as [name] rather than [name/1]. - *) - if index = 0 then - Ident.name id - else - let ordinal = index + 1 in - String.concat "/" [Ident.name id; string_of_int ordinal] - -let indexed_name namespace id = - let find namespace id env = match namespace with - | Type -> Env.find_type_index id env - | Module -> Env.find_module_index id env - | Module_type -> Env.find_modtype_index id env - | Class -> Env.find_class_index id env - | Class_type-> Env.find_cltype_index id env - | Value | Extension_constructor -> None - in - let index = - match M.find_opt (Ident.name id) !bound_in_recursion with - | Some rec_bound_id -> - (* the identifier name appears in the current group of recursive - definition *) - if Ident.same rec_bound_id id then - Some 0 - else - (* the current recursive definition shadows one more time the - previously existing identifier with the same name *) - Option.map succ (in_printing_env (find namespace id)) - | None -> - in_printing_env (find namespace id) - in - let index = - (* If [index] is [None] at this point, it might indicate that - the identifier id is not defined in the environment, while there - are other identifiers in scope that share the same name. - Currently, this kind of partially incoherent environment happens - within functor error messages where the left and right hand side - have a different views of the environment at the source level. - Printing the source-level by using a default index of `0` - seems like a reasonable compromise in this situation however.*) - Option.value index ~default:0 - in - human_id id index + let update m id = S.add (Ident.name id.ident) m in + protect_refs [ R(protected, List.fold_left update !protected ids)] f -let ident_name namespace id = +let pervasives_name namespace name = + match namespace, !enabled with + | None, _ | _, true -> Out_name.create name + | Some namespace, false -> + match M.find name (get namespace) with + | Associated_to_pervasives r -> r + | Need_unique_name _ -> Out_name.create (pervasives name) + | Uniquely_associated_to (id',r) -> + let hid, map = add_hid_id id' Ident.Map.empty in + Out_name.set r (human_unique hid id'); + Conflicts.collect_explanation namespace hid id'; + set namespace @@ M.add name (Need_unique_name map) (get namespace); + Out_name.create (pervasives name) + | exception Not_found -> + let r = Out_name.create name in + set namespace @@ M.add name (Associated_to_pervasives r) (get namespace); + r + +(** Lookup for preexisting named item within the current {!printing_env} *) +let env_ident namespace name = + if S.mem name !protected then None else + match Namespace.lookup namespace name with + | Pident id -> Some id + | _ -> None + | exception Not_found -> None + +(** Associate a name to the identifier [id] within [namespace] *) +let ident_name_simple namespace id = match namespace, !enabled with | None, _ | _, false -> Out_name.create (Ident.name id) | Some namespace, true -> - if fuzzy_id namespace id then Out_name.create (Ident.name id) - else - let name = indexed_name namespace id in - Conflicts.collect_explanation namespace id ~name; - Out_name.create name + if fuzzy_id namespace id then Out_name.create (Ident.name id) + else + let name = Ident.name id in + match M.find name (get namespace) with + | Uniquely_associated_to (id',r) when Ident.same id id' -> + r + | Need_unique_name map -> + let hid, m = find_hid id map in + Conflicts.collect_explanation namespace hid id; + set namespace @@ M.add name (Need_unique_name m) (get namespace); + Out_name.create (human_unique hid id) + | Uniquely_associated_to (id',r) -> + let hid', m = find_hid id' Ident.Map.empty in + let hid, m = find_hid id m in + Out_name.set r (human_unique hid' id'); + List.iter (fun (id,hid) -> Conflicts.collect_explanation namespace hid id) + [id, hid; id', hid' ]; + set namespace @@ M.add name (Need_unique_name m) (get namespace); + Out_name.create (human_unique hid id) + | Associated_to_pervasives r -> + Out_name.set r ("Stdlib." ^ Out_name.print r); + let hid, m = find_hid id Ident.Map.empty in + set namespace @@ M.add name (Need_unique_name m) (get namespace); + Out_name.create (human_unique hid id) + | exception Not_found -> + let r = Out_name.create name in + set namespace + @@ M.add name (Uniquely_associated_to (id,r) ) (get namespace); + r + +(** Same as {!ident_name_simple} but lookup to existing named identifiers + in the current {!printing_env} *) +let ident_name namespace id = + begin match env_ident namespace (Ident.name id) with + | Some id' -> ignore (ident_name_simple namespace id') + | None -> () + end; + ident_name_simple namespace id + +let reset () = + Array.iteri ( fun i _ -> map.(i) <- M.empty ) map + +let with_ctx f = + let old = Array.copy map in + try_finally f + ~always:(fun () -> Array.blit old 0 map 0 (Array.length map)) + end let ident_name = Naming_context.ident_name +let reset_naming_context = Naming_context.reset let ident ppf id = pp_print_string ppf - (Out_name.print (Naming_context.ident_name None id)) + (Out_name.print (Naming_context.ident_name_simple None id)) let namespaced_ident namespace id = Out_name.print (Naming_context.ident_name (Some namespace) id) @@ -417,11 +446,11 @@ let namespaced_ident namespace id = let ident_stdlib = Ident.create_persistent "Stdlib" -let non_shadowed_stdlib namespace = function +let non_shadowed_pervasive = function | Pdot(Pident id, s) as path -> Ident.same id ident_stdlib && - (match Namespace.lookup namespace s with - | path' -> Path.same path path' + (match in_printing_env (Env.find_type_by_name (Lident s)) with + | (path', _) -> Path.same path path' | exception Not_found -> true) | _ -> false @@ -504,20 +533,15 @@ let rec rewrite_double_underscore_longidents env (l : Longident.t) = else l -let rec tree_of_path ?(disambiguation=true) namespace p = - let tree_of_path namespace p = tree_of_path ~disambiguation namespace p in - let namespace = if disambiguation then namespace else None in - match p with +let rec tree_of_path namespace = function | Pident id -> Oide_ident (ident_name namespace id) - | Pdot(_, s) as path when non_shadowed_stdlib namespace path -> - Oide_ident (Out_name.create s) + | Pdot(_, s) as path when non_shadowed_pervasive path -> + Oide_ident (Naming_context.pervasives_name namespace s) | Pdot(p, s) -> Oide_dot (tree_of_path (Some Module) p, s) | Papply(p1, p2) -> - let t1 = tree_of_path (Some Module) p1 in - let t2 = tree_of_path (Some Module) p2 in - Oide_apply (t1, t2) + Oide_apply (tree_of_path (Some Module) p1, tree_of_path (Some Module) p2) | Pextra_ty (p, extra) -> begin (* inline record types are syntactically prevented from escaping their binding scope, and are never shown to users. *) @@ -528,9 +552,8 @@ let rec tree_of_path ?(disambiguation=true) namespace p = tree_of_path None p end -let tree_of_path ?disambiguation namespace p = - tree_of_path ?disambiguation namespace - (rewrite_double_underscore_paths !printing_env p) +let tree_of_path namespace p = + tree_of_path namespace (rewrite_double_underscore_paths !printing_env p) let path ppf p = !Oprint.out_ident ppf (tree_of_path None p) @@ -539,6 +562,7 @@ let string_of_path p = Format.asprintf "%a" path p let strings_of_paths namespace p = + reset_naming_context (); let trees = List.map (tree_of_path namespace) p in List.map (Format.asprintf "%a" !Oprint.out_ident) trees @@ -584,9 +608,9 @@ let print_name ppf = function None -> fprintf ppf "None" | Some name -> fprintf ppf "\"%s\"" name -let string_of_label = function +let string_of_label : Types.arg_label -> string = function Nolabel -> "" - | Labelled s -> s + | Labelled s | Position s -> s | Optional s -> "?"^s let visited = ref [] @@ -597,20 +621,31 @@ let rec raw_type ppf ty = fprintf ppf "@[<1>{id=%d;level=%d;scope=%d;desc=@,%a}@]" ty.id ty.level ty.scope raw_type_desc ty.desc end +and labeled_type ppf (label, ty) = + begin match label with + | Some s -> fprintf ppf "label=\"%s\" " s + | None -> () + end; + raw_type ppf ty + and raw_type_list tl = raw_list raw_type tl +and labeled_type_list tl = raw_list labeled_type tl +and raw_lid_type_list tl = + raw_list (fun ppf (lid, typ) -> + fprintf ppf "(@,%a,@,%a)" longident lid raw_type typ) + tl and raw_type_desc ppf = function Tvar { name; jkind } -> - fprintf ppf "Tvar (@,%a,@,%s)" print_name name - (Jkind.to_string jkind) + fprintf ppf "Tvar (@,%a,@,%a)" print_name name Jkind.format jkind | Tarrow((l,arg,ret),t1,t2,c) -> fprintf ppf "@[Tarrow((\"%s\",%a,%a),@,%a,@,%a,@,%s)@]" (string_of_label l) - (Alloc.print' ~verbose:true) arg - (Alloc.print' ~verbose:true) ret + (Alloc.print ~verbose:true ()) arg + (Alloc.print ~verbose:true ()) ret raw_type t1 raw_type t2 (if is_commu_ok c then "Cok" else "Cunknown") | Ttuple tl -> - fprintf ppf "@[<1>Ttuple@,%a@]" raw_type_list tl + fprintf ppf "@[<1>Ttuple@,%a@]" labeled_type_list tl | Tconstr (p, tl, abbrev) -> fprintf ppf "@[Tconstr(@,%a,@,%a,@,%a)@]" path p raw_type_list tl @@ -631,8 +666,7 @@ and raw_type_desc ppf = function | Tsubst (t, Some t') -> fprintf ppf "@[<1>Tsubst@,(%a,@ Some%a)@]" raw_type t raw_type t' | Tunivar { name; jkind } -> - fprintf ppf "Tunivar (@,%a,@,%s)" print_name name - (Jkind.to_string jkind) + fprintf ppf "Tunivar (@,%a,@,%a)" print_name name Jkind.format jkind | Tpoly (t, tl) -> fprintf ppf "@[Tpoly(@,%a,@,%a)@]" raw_type t @@ -654,8 +688,8 @@ and raw_type_desc ppf = function | Some(p,tl) -> fprintf ppf "Some(@,%a,@,%a)" path p raw_type_list tl) | Tpackage (p, fl) -> - fprintf ppf "@[Tpackage(@,%a@,%a)@]" path p - raw_type_list (List.map snd fl) + fprintf ppf "@[Tpackage(@,%a,@,%a)@]" path p + raw_lid_type_list fl and raw_row_fixed ppf = function | None -> fprintf ppf "None" | Some Types.Fixed_private -> fprintf ppf "Some Fixed_private" @@ -708,6 +742,9 @@ let apply_subst s1 tyl = | Map l1 -> List.map (List.nth tyl) l1 | Id -> tyl +(* In the [Paths] constructor, more preferred paths are stored later in the + list. *) + type best_path = Paths of Path.t list | Best of Path.t (** Short-paths cache: the five mutable variables below implement a one-slot @@ -759,24 +796,6 @@ let rec normalize_type_path ?(cache=false) env p = Not_found -> (Env.normalize_type_path None env p, Id) -let penalty s = - if s <> "" && s.[0] = '_' then - 10 - else - match find_double_underscore s with - | None -> 1 - | Some _ -> 10 - -let rec path_size = function - Pident id -> - penalty (Ident.name id), -Ident.scope id - | Pdot (p, _) | Pextra_ty (p, Pcstr_ty _) -> - let (l, b) = path_size p in (1+l, b) - | Papply (p1, p2) -> - let (l, b) = path_size p1 in - (l + fst (path_size p2), b) - | Pextra_ty (p, _) -> path_size p - let same_printing_env env = let used_pers = Env.used_persistent () in Env.same_types !printing_old env @@ -807,19 +826,39 @@ let set_printing_env env = Paths l -> r := Paths (p :: l) | Best p' -> r := Paths [p; p'] (* assert false *) with Not_found -> - printing_map := Path.Map.add p1 (ref (Paths [p])) !printing_map) + (* Jane Street: Often the best choice for printing [p1] is + [p1] itself. And often [p1] is a path whose "penalty" + would be reduced if the double-underscore rewrite + applied. + *) + let rewritten_p1 = rewrite_double_underscore_paths env p1 in + printing_map := Path.Map.add p1 (ref (Paths [ p; rewritten_p1 ])) !printing_map) env in printing_cont := [cont]; end let wrap_printing_env env f = - set_printing_env env; + set_printing_env env; reset_naming_context (); try_finally f ~always:(fun () -> set_printing_env Env.empty) let wrap_printing_env ~error env f = if error then Env.without_cmis (wrap_printing_env env) f else wrap_printing_env env f +let wrap_printing_env_error env f = + let wrap (loc : _ Location.loc) = + { loc with txt = + (fun fmt -> Env.without_cmis (fun () -> loc.txt fmt) ()) + (* CR nroberts: See https://github.com/ocaml-flambda/flambda-backend/pull/2529 + for an explanation of why this has drifted from upstream. *) + } + in + let err : Location.error = wrap_printing_env ~error:true env f in + { Location.kind = err.kind; + main = wrap err.main; + sub = List.map wrap err.sub; + } + let rec lid_of_path = function Path.Pident id -> Longident.Lident (Ident.name id) @@ -844,7 +883,34 @@ let is_unambiguous path env = List.for_all (fun p -> lid_of_path p = id) rem && Path.same p (fst (Env.find_type_by_name id env)) -let rec get_best_path r = +let penalty_size = 10 + +let name_penalty s = + if s <> "" && s.[0] = '_' then + penalty_size + else + match find_double_underscore s with + | None -> 1 + | Some _ -> penalty_size + +let ambiguity_penalty path env = + if is_unambiguous path env then 0 else penalty_size + +let path_size path env = + let rec size = function + Pident id -> + name_penalty (Ident.name id), -Ident.scope id + | Pdot (p, id) | Pextra_ty (p, Pcstr_ty id) -> + let (l, b) = size p in (name_penalty id + l, b) + | Papply (p1, p2) -> + let (l, b) = size p1 in + (l + fst (size p2), b) + | Pextra_ty (p, _) -> size p + in + let l, s = size path in + l + ambiguity_penalty path env, s + +let rec get_best_path r env = match !r with Best p' -> p' | Paths [] -> raise Not_found @@ -854,11 +920,10 @@ let rec get_best_path r = (fun p -> (* Format.eprintf "evaluating %a@." path p; *) match !r with - Best p' when path_size p >= path_size p' -> () - | _ -> if is_unambiguous p !printing_env then r := Best p) - (* else Format.eprintf "%a ignored as ambiguous@." path p *) - l; - get_best_path r + Best p' when path_size p env >= path_size p' env -> () + | _ -> r := Best p) + (List.rev l); + get_best_path r env let best_type_path p = if !printing_env == Env.empty @@ -867,24 +932,21 @@ let best_type_path p = then (p, Id) else let (p', s) = normalize_type_path !printing_env p in - let get_path () = get_best_path (Path.Map.find p' !printing_map) in + let get_path () = + try + get_best_path (Path.Map.find p' !printing_map) !printing_env + with Not_found -> rewrite_double_underscore_paths !printing_env p' + in while !printing_cont <> [] && - try fst (path_size (get_path ())) > !printing_depth with Not_found -> true + fst (path_size (get_path ()) !printing_env) > !printing_depth do printing_cont := List.map snd (Env.run_iter_cont !printing_cont); incr printing_depth; done; - let p'' = try get_path () with Not_found -> p' in + let p'' = get_path () in (* Format.eprintf "%a = %a -> %a@." path p path p' path p''; *) (p'', s) -(* When building a tree for a best type path, we should not disambiguate - identifiers whenever the short-path algorithm detected a better path than - the original one.*) -let tree_of_best_type_path p p' = - if Path.same p p' then tree_of_path (Some Type) p' - else tree_of_path ~disambiguation:false None p' - (* Print a type expression *) let proxy ty = Transient_expr.repr (proxy ty) @@ -1179,7 +1241,7 @@ let reset_except_context () = Names.reset_names (); reset_loop_marks () let reset () = - Conflicts.reset (); + reset_naming_context (); Conflicts.reset (); reset_except_context () let prepare_for_printing tyl = @@ -1191,39 +1253,44 @@ let add_type_to_preparation = prepare_type (* Disabled in classic mode when printing an unification error *) let print_labels = ref true +let out_jkind_of_user_jkind (jkind : Jane_syntax.Jkind.annotation) = + let rec out_jkind_const_of_user_jkind : Jane_syntax.Jkind.t -> out_jkind_const = function + | Default -> Ojkind_const_default + | Abbreviation abbrev -> Ojkind_const_abbreviation (abbrev :> string Location.loc).txt + | Mod (base, modes) -> + let base = out_jkind_const_of_user_jkind base in + let modes = + List.map + (fun mode -> (mode : Jane_syntax.Mode_expr.Const.t :> string Location.loc).txt) + modes.txt + in + Ojkind_const_mod (base, modes) + | With _ | Kind_of _ -> failwith "XXX unimplemented jkind syntax" + in + Ojkind_const (out_jkind_const_of_user_jkind jkind.txt) + +let out_jkind_of_const_jkind jkind = + Ojkind_const (Jkind.Const.to_out_jkind_const jkind) + (* returns None for [value], according to (C2.1) from Note [When to print jkind annotations] *) let out_jkind_option_of_jkind jkind = match Jkind.get jkind with - | Const Value -> None - | Const clay -> Some (Olay_const clay) + | Const jkind -> + let is_value = Jkind.Const.equal jkind Jkind.Const.Primitive.value.jkind + (* CR layouts v3.0: remove this hack once [or_null] is out of [Alpha]. *) + || (not Language_extension.(is_at_least Layouts Alpha) + && Jkind.Const.equal jkind Jkind.Const.Primitive.value_or_null.jkind) + in + begin match is_value with + | true -> None + | false -> Some (out_jkind_of_const_jkind jkind) + end | Var v -> (* This handles (X1). *) if !Clflags.verbose_types - then Some (Olay_var (Jkind.Sort.var_name v)) + then Some (Ojkind_var (Jkind.Sort.Var.name v)) else None -let tree_of_mode mode = - let {locality; uniqueness; linearity} = Alloc.check_const mode in - let oam_locality = - match locality with - | Some Global -> Olm_global - | Some Local -> Olm_local - | None -> Olm_unknown - in - let oam_uniqueness = - match uniqueness with - | Some Unique -> Oum_unique - | Some Shared -> Oum_shared - | None -> Oum_unknown - in - let oam_linearity = - match linearity with - | Some Many -> Olinm_many - | Some Once -> Olinm_once - | None -> Olinm_unknown - in - {oam_locality; oam_uniqueness; oam_linearity} - let alias_nongen_row mode px ty = match get_desc ty with | Tvariant _ | Tobject _ -> @@ -1231,7 +1298,65 @@ let alias_nongen_row mode px ty = add_alias_proxy px | _ -> () -let rec tree_of_typexp mode ty = +let outcome_label : Types.arg_label -> Outcometree.arg_label = function + | Nolabel -> Nolabel + | Labelled l -> Labelled l + | Optional l -> Optional l + | Position l -> Position l + +let tree_of_modality_new (t : Mode.Modality.t) = + if Mode.Modality.is_id t then None + else match t with + | Atom (Comonadic Areality, Meet_with Global) -> Some "global" + | Atom (Comonadic Linearity, Meet_with Many) -> Some "many" + | Atom (Monadic Uniqueness, Join_with Shared) -> Some "shared" + | Atom (Comonadic Portability, Meet_with Portable) -> Some "portable" + | Atom (Monadic Contention, Join_with Contended) -> Some "contended" + | e -> Misc.fatal_errorf "Unexpected modality %a" Mode.Modality.print e + +let tree_of_modality (t : Mode.Modality.t) = + match t with + | Atom (Comonadic Areality, Meet_with Global) -> + Some (Ogf_legacy Ogf_global) + | _ -> Option.map (fun x -> Ogf_new x) (tree_of_modality_new t) + +let tree_of_modalities ~has_mutable_implied_modalities t = + let l = Mode.Modality.Value.Const.to_list t in + (* CR zqian: decouple mutable and modalities *) + let l = + if has_mutable_implied_modalities then + List.filter (fun m -> not @@ Typemode.is_mutable_implied_modality m) l + else + l + in + List.filter_map tree_of_modality l + +let tree_of_modalities_new t = + let l = Mode.Modality.Value.Const.to_list t in + List.filter_map tree_of_modality_new l + +(** [tree_of_mode m l] finds the outcome node in [l] that corresponds to [m]. +Raise if not found. *) +let tree_of_mode (mode : 'm option) (l : ('m * out_mode) list) : out_mode option = + Option.map (fun x -> List.assoc x l) mode + +let tree_of_modes modes = + let diff = Mode.Alloc.Const.diff modes Mode.Alloc.Const.legacy in + (* The mapping passed to [tree_of_mode] must cover all non-legacy modes *) + let l = [ + tree_of_mode diff.areality [Mode.Locality.Const.Local, Omd_legacy Omd_local]; + tree_of_mode diff.linearity [Mode.Linearity.Const.Once, Omd_legacy Omd_once]; + tree_of_mode diff.portability [Mode.Portability.Const.Portable, Omd_new "portable"]; + tree_of_mode diff.uniqueness [Mode.Uniqueness.Const.Unique, Omd_legacy Omd_unique]; + tree_of_mode diff.contention [Mode.Contention.Const.Contended, Omd_new "contended"]] + in + List.filter_map Fun.id l + +(* [alloc_mode] is the mode that our printing has expressed on [ty]. For the + example [A -> local_ (B -> C)], we will call [tree_of_typexp] on (B -> C) with + alloc_mode = local. This is helpful for reproducing the mode currying logic in + [ctype.ml], so that parsing and printing roundtrip. *) +let rec tree_of_typexp mode alloc_mode ty = let px = proxy ty in if List.memq px !printed_aliases && not (List.memq px !delayed) then let non_gen = is_non_gen mode (Transient_expr.type_expr px) in @@ -1246,33 +1371,40 @@ let rec tree_of_typexp mode ty = let name_gen = Names.new_var_name ~non_gen ty in Otyp_var (non_gen, Names.name_of_type name_gen tty) | Tarrow ((l, marg, mret), ty1, ty2, _) -> + (* In this branch we do some mutation that needs to be reverted, as + printing should not mutate states. *) + let snap = Btype.snapshot () in let lab = - if !print_labels || is_optional l then string_of_label l else "" + if !print_labels || is_omittable l then outcome_label l + else Nolabel in + (* [marg] will contain undetermined axes. It would be imprecise if we + don't print anything for those axes, since user would interpret that + as legacy. The best we can do is to zap to legacy and if they do land + at legacy, we will be able to omit printing them. *) + let arg_mode = Alloc.zap_to_legacy marg in let t1 = if is_optional l then match get_desc (tpoly_get_mono ty1) with | Tconstr(path, [ty], _) when Path.same path Predef.path_option -> - tree_of_typexp mode ty + tree_of_typexp mode arg_mode ty | _ -> Otyp_stuff "" else - tree_of_typexp mode ty1 + tree_of_typexp mode arg_mode ty1 in - let am = tree_of_mode marg in - let t2 = tree_of_typexp mode ty2 in - let rm = tree_of_mode mret in - Otyp_arrow (lab, am, t1, rm, t2) - | Ttuple tyl -> - Otyp_tuple (tree_of_typlist mode tyl) + let acc_mode = curry_mode alloc_mode arg_mode in + let (rm, t2) = tree_of_ret_typ_mutating mode acc_mode (mret, ty2) in + Btype.backtrack snap; + Otyp_arrow (lab, tree_of_modes arg_mode, t1, rm, t2) + | Ttuple labeled_tyl -> + Otyp_tuple (tree_of_labeled_typlist mode labeled_tyl) | Tconstr(p, tyl, _abbrev) -> let p', s = best_type_path p in let tyl' = apply_subst s tyl in if is_nth s && not (tyl'=[]) - then tree_of_typexp mode (List.hd tyl') - else - let tpath = tree_of_best_type_path p p' in - Otyp_constr (tpath, tree_of_typlist mode tyl') + then tree_of_typexp mode Alloc.Const.legacy (List.hd tyl') + else Otyp_constr (tree_of_path (Some Type) p', tree_of_typlist mode tyl') | Tvariant row -> let Row {fields; name; closed; _} = row_repr row in let fields = @@ -1291,7 +1423,7 @@ let rec tree_of_typexp mode ty = begin match name with | Some(p, tyl) when nameable_row row -> let (p', s) = best_type_path p in - let id = tree_of_best_type_path p p' in + let id = tree_of_path (Some Type) p' in let args = tree_of_typlist mode (apply_subst s tyl) in let out_variant = if is_nth s then List.hd args else Otyp_constr (id, args) in @@ -1317,7 +1449,7 @@ let rec tree_of_typexp mode ty = | Tlink _ -> fatal_error "Printtyp.tree_of_typexp" | Tpoly (ty, []) -> - tree_of_typexp mode ty + tree_of_typexp mode alloc_mode ty | Tpoly (ty, tyl) -> (*let print_names () = List.iter (fun (_, name) -> prerr_string (name ^ " ")) !names; @@ -1328,7 +1460,7 @@ let rec tree_of_typexp mode ty = printed once when used as proxy *) List.iter add_delayed tyl; let tl = tree_of_qtvs tyl in - let tr = Otyp_poly (tl, tree_of_typexp mode ty) in + let tr = Otyp_poly (tl, tree_of_typexp mode alloc_mode ty) in (* Forget names when we leave scope *) Names.remove_names tyl; delayed := old_delayed; tr @@ -1339,7 +1471,7 @@ let rec tree_of_typexp mode ty = List.map (fun (li, ty) -> ( String.concat "." (Longident.flatten li), - tree_of_typexp mode ty + tree_of_typexp mode Alloc.Const.legacy ty )) fl in Otyp_module (tree_of_path (Some Module_type) p, fl) in @@ -1371,7 +1503,7 @@ and tree_of_qtvs qtvs = and tree_of_row_field mode (l, f) = match row_field_repr f with | Rpresent None | Reither(true, [], _) -> (l, false, []) - | Rpresent(Some ty) -> (l, false, [tree_of_typexp mode ty]) + | Rpresent(Some ty) -> (l, false, [tree_of_typexp mode Alloc.Const.legacy ty]) | Reither(c, tyl, _) -> if c (* contradiction: constant constructor with an argument *) then (l, true, tree_of_typlist mode tyl) @@ -1379,15 +1511,44 @@ and tree_of_row_field mode (l, f) = | Rabsent -> (l, false, [] (* actually, an error *)) and tree_of_typlist mode tyl = - List.map (tree_of_typexp mode) tyl + List.map (tree_of_typexp mode Alloc.Const.legacy) tyl -and tree_of_typ_gf (ty, gf) = - let gf = - match gf with - | Global -> Ogf_global - | Unrestricted -> Ogf_unrestricted - in - (tree_of_typexp Type ty, gf) +and tree_of_labeled_typlist mode tyl = + List.map (fun (label, ty) -> label, tree_of_typexp mode Alloc.Const.legacy ty) tyl + +and tree_of_typ_gf {ca_type=ty; ca_modalities=gf; _} = + (tree_of_typexp Type Alloc.Const.legacy ty, + tree_of_modalities ~has_mutable_implied_modalities:false gf) + +(** We are on the RHS of an arrow type, where [ty] is the return type, and [m] + is the return mode. This function decides the printed modes on [ty]. + - If [ty] is another arrow type, [acc_mode] is the mode that has accumulated + from the currying, and thus the mode that the user would interpret as on + [ty] if it doesn't have parens around it. + - If [ty] is not an arrow type, [acc_mode] is meaningless. + + NB: This function might mutate states; the caller is responsible for + reverting them. *) +and tree_of_ret_typ_mutating mode acc_mode (m, ty) = + match get_desc ty with + | Tarrow _ -> begin + (* We first try to equate [m] with the [acc_mode]; if that succeeds, we + can omit parens and modes. *) + match Alloc.equate (Alloc.of_const acc_mode) m with + | Ok () -> + let ty = tree_of_typexp mode acc_mode ty in + (Orm_no_parens, ty) + | Error _ -> + (* In this branch we need to print parens. [m] might have undetermined + axes and we adopt a similar logic to the [marg] above. *) + let m = Alloc.zap_to_legacy m in + let ty = tree_of_typexp mode m ty in + (Orm_parens (tree_of_modes m), ty) + end + | _ -> + let m = Alloc.zap_to_legacy m in + let ty = tree_of_typexp mode m ty in + (Orm_not_arrow (tree_of_modes m), ty) and tree_of_typobject mode fi nm = begin match nm with @@ -1411,7 +1572,7 @@ and tree_of_typobject mode fi nm = let args = tree_of_typlist mode tyl in let (p', s) = best_type_path p in assert (s = Id); - Otyp_class (tree_of_best_type_path p p', args) + Otyp_class (tree_of_path (Some Type) p', args) | _ -> fatal_error "Printtyp.tree_of_typobject" end @@ -1426,13 +1587,20 @@ and tree_of_typfields mode rest = function in ([], open_row) | (s, t) :: l -> - let field = (s, tree_of_typexp mode t) in + let field = (s, tree_of_typexp mode Alloc.Const.legacy t) in let (fields, rest) = tree_of_typfields mode rest l in (field :: fields, rest) +let tree_of_typexp mode ty = tree_of_typexp mode Alloc.Const.legacy ty + let typexp mode ppf ty = !Oprint.out_type ppf (tree_of_typexp mode ty) +let modality ?(id = fun _ppf -> ()) ppf modality = + match tree_of_modality modality with + | None -> id ppf + | Some m -> !Oprint.out_modality ppf m + let prepared_type_expr ppf ty = typexp Type ppf ty let type_expr ppf ty = @@ -1463,7 +1631,7 @@ let type_scheme ppf ty = let type_path ppf p = let (p', s) = best_type_path p in let p'' = if (s = Id) then p' else p in - let t = tree_of_best_type_path p p'' in + let t = tree_of_path (Some Type) p'' in !Oprint.out_ident ppf t let tree_of_type_scheme ty = @@ -1487,7 +1655,7 @@ let filter_params tyl = List.fold_left (fun tyl ty -> if List.exists (eq_type ty) tyl - then newty2 ~level:generic_level (Ttuple [ty]) :: tyl + then newty2 ~level:generic_level (Ttuple [None, ty]) :: tyl else ty :: tyl) (* Two parameters might be identical due to a constraint but we need to print them differently in order to make the output syntactically valid. @@ -1510,6 +1678,10 @@ let zap_qtvs_if_boring qtvs = This implements Case (C3) from Note [When to print jkind annotations]. *) let extract_qtvs tyl = let fvs = Ctype.free_non_row_variables_of_list tyl in + (* The [Ctype.free*variables] family of functions returns the free + variables in reverse order they were encountered in the list of types. + *) + let fvs = List.rev fvs in let tfvs = List.map Transient_expr.repr fvs in let vars_jkinds = tree_of_qtvs tfvs in zap_qtvs_if_boring vars_jkinds @@ -1521,17 +1693,32 @@ let param_jkind ty = | _ -> None (* this is (C2.2) from Note [When to print jkind annotations] *) let tree_of_label l = - let gom = - match l.ld_mutable, l.ld_global with - | Mutable, _ -> Ogom_mutable - | Immutable, Global -> Ogom_global - | Immutable, Unrestricted -> Ogom_immutable + let mut = + match l.ld_mutable with + | Mutable m -> + let mut = + if Alloc.Comonadic.Const.eq m Alloc.Comonadic.Const.legacy then + Om_mutable None + else + Om_mutable (Some "") + in + mut + | Immutable -> Om_immutable + in + let has_mutable_implied_modalities = + if is_mutable l.ld_mutable then + not (Builtin_attributes.has_no_mutable_implied_modalities l.ld_attributes) + else + false + in + let ld_modalities = + tree_of_modalities ~has_mutable_implied_modalities l.ld_modalities in - (Ident.name l.ld_id, gom, tree_of_typexp Type l.ld_type) + (Ident.name l.ld_id, mut, tree_of_typexp Type l.ld_type, ld_modalities) let tree_of_constructor_arguments = function | Cstr_tuple l -> List.map tree_of_typ_gf l - | Cstr_record l -> [ Otyp_record (List.map tree_of_label l), Ogf_unrestricted ] + | Cstr_record l -> [ Otyp_record (List.map tree_of_label l), [] ] let tree_of_constructor_args_and_ret_type args ret_type = match ret_type with @@ -1697,26 +1884,23 @@ let tree_of_type_decl id decl = in (* The algorithm for setting [lay] here is described as Case (C1) in Note [When to print jkind annotations] *) - let lay = match ty, unboxed with - | (Otyp_abstract, _) | (_, true) -> - (* (C1.1) from the Note corresponds to Otyp_abstract. Anything - but the default must be user-written, so we just look in the - attributes. Similarly, look in the attributes for (C1.2), the - unboxed case. Because this is just printing, we liberally - allow [@@immediate]. *) - begin match - Builtin_attributes.jkind ~legacy_immediate:true decl.type_attributes - with - | Ok annot -> annot - | Error annot -> Some annot (* don't care here about extensions *) - end + let jkind_annotation = match ty, unboxed, decl.type_has_illegal_crossings with + | (Otyp_abstract, _, _) | (_, true, _) | (_, _, true) -> + (* The two cases of (C1) from the Note correspond to Otyp_abstract. + Anything but the default must be user-written, so we print the + user-written annotation. *) + (* type_has_illegal_crossings corresponds to C1.3 *) + decl.type_jkind_annotation | _ -> None (* other cases have no jkind annotation *) in { otype_name = name; otype_params = args; otype_type = ty; otype_private = priv; - otype_jkind = Option.map (fun { txt } -> Olay_const txt) lay; + otype_jkind = + Option.map + (fun (_, user_annot) -> out_jkind_of_user_jkind user_annot) + jkind_annotation; otype_unboxed = unboxed; otype_cstrs = constraints } @@ -1881,19 +2065,56 @@ let tree_of_value_description id decl = let ty = tree_of_type_scheme decl.val_type in (* Important: process the fvs *after* the type; tree_of_type_scheme resets the naming context *) + let snap = Btype.snapshot () in + let moda = Mode.Modality.Value.zap_to_floor decl.val_modalities in let qtvs = extract_qtvs [decl.val_type] in + let apparent_arity = + let rec count n typ = + match get_desc typ with + | Tarrow (_,_,typ,_) -> count (n+1) typ + | _ -> n + in + count 0 decl.val_type + in + let attrs = + match Zero_alloc.get decl.val_zero_alloc with + | Default_zero_alloc | Ignore_assert_all -> [] + | Check { strict; opt; arity; _ } -> + [{ oattr_name = + String.concat "" + ["zero_alloc"; + if strict then " strict" else ""; + if opt then " opt" else ""; + if arity = apparent_arity then "" else + Printf.sprintf " arity %d" arity; + ] }] + | Assume { strict; never_returns_normally; arity; _ } -> + [{ oattr_name = + String.concat "" + ["zero_alloc assume"; + if strict then " strict" else ""; + if never_returns_normally then " never_returns_normally" else ""; + if arity = apparent_arity then "" else + Printf.sprintf " arity %d" arity; + ] + }] + in let vd = { oval_name = id; oval_type = Otyp_poly(qtvs, ty); + oval_modalities = tree_of_modalities_new moda; oval_prims = []; - oval_attributes = [] } + oval_attributes = attrs + } in let vd = match decl.val_kind with | Val_prim p -> Primitive.print p vd | _ -> vd in - Osig_value vd + let r = Osig_value vd in + Btype.backtrack snap; + r let value_description id ppf decl = !Oprint.out_sig_item ppf (tree_of_value_description id decl) @@ -1972,7 +2193,7 @@ let rec tree_of_class_type mode params = let csil = List.fold_left (fun csil (l, m, v, t) -> - Ocsg_value (l, m = Mutable, v = Virtual, tree_of_typexp mode t) + Ocsg_value (l, m = Asttypes.Mutable, v = Virtual, tree_of_typexp mode t) :: csil) csil all_vars in @@ -1990,7 +2211,8 @@ let rec tree_of_class_type mode params = Octy_signature (self_ty, List.rev csil) | Cty_arrow (l, ty, cty) -> let lab = - if !print_labels || is_optional l then string_of_label l else "" + if !print_labels || is_omittable l then outcome_label l + else Nolabel in let tr = if is_optional l then @@ -2114,7 +2336,8 @@ let dummy = type_params = []; type_arity = 0; type_kind = Type_abstract Abstract_def; - type_jkind = Jkind.any ~why:Dummy_jkind; + type_jkind = Jkind.Primitive.any ~why:Dummy_jkind; + type_jkind_annotation = None; type_private = Public; type_manifest = None; type_variance = []; @@ -2125,6 +2348,7 @@ let dummy = type_attributes = []; type_unboxed_default = false; type_uid = Uid.internal_not_actually_unique; + type_has_illegal_crossings = false; } (** we hide items being defined from short-path to avoid shortening @@ -2284,7 +2508,8 @@ and tree_of_signature_rec ?abbrev ?max_items env' sg = | Some _ | None -> let env = !printing_env in let env', group_trees = - trees_of_recursive_sigitem_group ?abbrev env group + Naming_context.with_ctx + (fun () -> trees_of_recursive_sigitem_group ?abbrev env group) in set_printing_env env'; let max_items, group_trees = match max_items with @@ -2377,6 +2602,7 @@ let modtype_declaration id ppf decl = let print_items showval env x = Names.refresh_weak(); + reset_naming_context (); Conflicts.reset (); let extend_val env (sigitem,outcome) = outcome, showval env sigitem in let post_process (env,l) = List.map (extend_val env) l in @@ -2394,6 +2620,7 @@ let signature ppf sg = let printed_signature sourcefile ppf sg = (* we are tracking any collision event for warning 63 *) Conflicts.reset (); + reset_naming_context (); let t = tree_of_signature sg in if Warnings.(is_active @@ Erroneous_printed_signature "") && Conflicts.exists () @@ -2451,8 +2678,8 @@ let trees_of_type_expansion' match get_desc ty with | Tvar { jkind; _ } | Tunivar { jkind; _ } -> let olay = match Jkind.get jkind with - | Const clay -> Olay_const clay - | Var v -> Olay_var (Jkind.Sort.var_name v) + | Const clay -> out_jkind_of_const_jkind clay + | Var v -> Ojkind_var (Jkind.Sort.Var.name v) in Otyp_jkind_annot (out, olay) | _ -> @@ -2571,7 +2798,7 @@ let hide_variant_name t = (Tvariant (create_row ~fields ~fixed ~closed ~name:None ~more:(newvar2 (get_level more) - (Jkind.value ~why:Row_variable)))) + (Jkind.Primitive.value ~why:Row_variable)))) | _ -> t let prepare_expansion Errortrace.{ty; expanded} = @@ -2782,11 +3009,14 @@ let explanation (type variety) intro prev env (Jkind.Violation.report_with_offender_sort ~offender:(fun ppf -> type_expr ppf t)) e) | Errortrace.Unequal_var_jkinds (t1,l1,t2,l2) -> - let fmt_history t = - Jkind.format_history ~intro:(fun ppf -> type_expr ppf t) + let fmt_history t l ppf = + Jkind.(format_history ~intro:( + dprintf "The layout of %a is %a" type_expr t format l) ppf l) in - Some (dprintf "@ because their layouts are different.@[%a%a@]" - (fmt_history t1) l1 (fmt_history t2) l2) + Some (dprintf "@ because their layouts are different.@ @[%t@;%t@]" + (fmt_history t1 l1) (fmt_history t2 l2)) + | Errortrace.Unequal_var_jkinds_with_no_history -> + Some (dprintf "@ because their layouts are different.") let mismatch intro env trace = Errortrace.explain trace (fun ~prev h -> explanation intro prev env h) @@ -2849,7 +3079,8 @@ let error trace_format mode subst env tr txt1 ppf txt2 ty_expect_explanation = tr in let jkind_error = match Misc.last tr with - | Some (Bad_jkind _ | Bad_jkind_sort _ | Unequal_var_jkinds _) -> + | Some (Bad_jkind _ | Bad_jkind_sort _ | Unequal_var_jkinds _ + | Unequal_var_jkinds_with_no_history) -> true | Some (Diff _ | Escape _ | Variant _ | Obj _ | Incompatible_fields _ | Rec_occur _) diff --git a/typing/printtyp.mli b/typing/printtyp.mli index 6069e333888..33b97a33b60 100644 --- a/typing/printtyp.mli +++ b/typing/printtyp.mli @@ -43,17 +43,28 @@ val strings_of_paths: namespace -> Path.t list -> string list val raw_type_expr: formatter -> type_expr -> unit val raw_field : formatter -> row_field -> unit -val string_of_label: Asttypes.arg_label -> string +val string_of_label: Types.arg_label -> string val wrap_printing_env: error:bool -> Env.t -> (unit -> 'a) -> 'a (* Call the function using the environment for type path shortening *) (* This affects all the printing functions below *) (* Also, if [~error:true], then disable the loading of cmis *) +(** [wrap_printing_env_error env f] ensures that all printing functions in a + [Location.error] report are evaluated within the [wrap_printing_env + ~error:true env] context. (The original call to [f] is also evaluated + within that context.) +*) +val wrap_printing_env_error : + Env.t -> (unit -> Location.error) -> Location.error + module Naming_context: sig val enable: bool -> unit (** When contextual names are enabled, the mapping between identifiers and names is ensured to be one-to-one. *) + + val reset: unit -> unit + (** Reset the naming context *) end (** The [Conflicts] module keeps track of conflicts arising when attributing @@ -95,6 +106,10 @@ val reset: unit -> unit [prepared_type_expr]. *) val type_expr: formatter -> type_expr -> unit +(** Prints a modality. If it is the identity modality, prints [id], which + defaults to nothing. *) +val modality : ?id:(formatter -> unit) -> formatter -> Mode.Modality.t -> unit + (** [prepare_for_printing] resets the global printing environment, a la [reset], and prepares the types for printing by reserving names and marking loops. Any type variables that are shared between multiple types in the input list diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 3d333be29d9..3af9532091b 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -67,15 +67,27 @@ let fmt_constant f x = | Const_string (s, strloc, Some delim) -> fprintf f "Const_string (%S,%a,Some %S)" s fmt_location strloc delim | Const_float (s) -> fprintf f "Const_float %s" s + | Const_float32 (s) -> fprintf f "Const_float32 %s" s; + | Const_unboxed_float (s) -> fprintf f "Const_unboxed_float %s" s + | Const_unboxed_float32 (s) -> fprintf f "Const_unboxed_float32 %s" s | Const_int32 (i) -> fprintf f "Const_int32 %ld" i | Const_int64 (i) -> fprintf f "Const_int64 %Ld" i | Const_nativeint (i) -> fprintf f "Const_nativeint %nd" i + | Const_unboxed_int32 (i) -> fprintf f "Const_unboxed_int32 %ld" i + | Const_unboxed_int64 (i) -> fprintf f "Const_unboxed_int64 %Ld" i + | Const_unboxed_nativeint (i) -> fprintf f "Const_unboxed_nativeint %nd" i let fmt_mutable_flag f x = match x with | Immutable -> fprintf f "Immutable" | Mutable -> fprintf f "Mutable" +let fmt_mutable_mode_flag f (x : Types.mutability) = + match x with + | Immutable -> fprintf f "Immutable" + | Mutable m -> + fprintf f "Mutable(%a)" Mode.Alloc.Comonadic.Const.print m + let fmt_virtual_flag f x = match x with | Virtual -> fprintf f "Virtual" @@ -140,18 +152,25 @@ let arg_label i ppf = function | Nolabel -> line i ppf "Nolabel\n" | Optional s -> line i ppf "Optional \"%s\"\n" s | Labelled s -> line i ppf "Labelled \"%s\"\n" s + | Position s -> line i ppf "Position \"%s\"\n" s let typevar_jkind ~print_quote ppf (v, l) = let pptv = if print_quote - then Printast.tyvar + then Pprintast.tyvar else fun ppf s -> fprintf ppf "%s" s in match l with | None -> fprintf ppf " %a" pptv v - | Some lay -> fprintf ppf " (%a : %a)" - pptv v - Jane_syntax.Layouts.Pprint.const_jkind lay + | Some (_, jkind) -> + fprintf ppf " (%a : %a)" + pptv v + Pprintast.jkind jkind.txt + +let tuple_component_label i ppf = function + | None -> line i ppf "Label: None\n" + | Some s -> line i ppf "Label: Some \"%s\"\n" s +;; let typevars ppf vs = List.iter (typevar_jkind ~print_quote:true ppf) vs @@ -168,20 +187,28 @@ let tag ppf = let open Types in function let variant_representation i ppf = let open Types in function | Variant_unboxed -> line i ppf "Variant_unboxed\n" - | Variant_boxed jkinds -> + | Variant_boxed cstrs -> line i ppf "Variant_boxed %a\n" - (array (i+1) (fun _ ppf -> jkind_array (i+1) ppf)) jkinds + (array (i+1) (fun _ ppf (_cstr, jkinds) -> + jkind_array (i+1) ppf jkinds)) + cstrs | Variant_extensible -> line i ppf "Variant_inlined\n" +let flat_element i ppf flat_element = + line i ppf "%s\n" (Types.flat_element_to_string flat_element) + let record_representation i ppf = let open Types in function | Record_unboxed -> line i ppf "Record_unboxed\n" | Record_boxed jkinds -> line i ppf "Record_boxed %a\n" (jkind_array i) jkinds - | Record_inlined (t,v) -> + | Record_inlined (t, _c, v) -> line i ppf "Record_inlined (%a, %a)\n" tag t (variant_representation i) v | Record_float -> line i ppf "Record_float\n" | Record_ufloat -> line i ppf "Record_ufloat\n" + | Record_mixed { value_prefix_len; flat_suffix } -> + line i ppf "Record_mixed (value_prefix_len %d)\n" value_prefix_len; + array (i+1) flat_element ppf flat_suffix let attribute i ppf k a = line i ppf "%s \"%s\"\n" k a.Parsetree.attr_name.txt; @@ -194,8 +221,16 @@ let attributes i ppf l = Printast.payload (i + 1) ppf a.Parsetree.attr_payload ) l -let jkind_annotation i ppf jkind = - line i ppf "%s" (Jkind.string_of_const jkind) +let jkind_annotation i ppf (jkind, _) = + line i ppf "%a" Jkind.Const.format jkind + +let zero_alloc_assume i ppf : Zero_alloc.assume -> unit = function + { strict; never_returns_normally; never_raises; arity; loc = _ } -> + line i ppf "assume_zero_alloc arity=%d%s%s%s\n" + arity + (if strict then " strict" else "") + (if never_returns_normally then " never_returns_normally" else "") + (if never_raises then " never_raises" else "") let rec core_type i ppf x = line i ppf "core_type %a\n" fmt_location x.ctyp_loc; @@ -212,7 +247,7 @@ let rec core_type i ppf x = core_type i ppf ct2; | Ttyp_tuple l -> line i ppf "Ttyp_tuple\n"; - list i core_type ppf l; + list i labeled_core_type ppf l; | Ttyp_constr (li, _, l) -> line i ppf "Ttyp_constr %a\n" fmt_path li; list i core_type ppf l; @@ -247,6 +282,11 @@ let rec core_type i ppf x = | Ttyp_package { pack_path = s; pack_fields = l } -> line i ppf "Ttyp_package %a\n" fmt_path s; list i package_with ppf l; + | Ttyp_call_pos -> line i ppf "Ttyp_call_pos\n"; + +and labeled_core_type i ppf (l, t) = + tuple_component_label i ppf l; + core_type i ppf t and package_with i ppf (s, t) = line i ppf "with type %a\n" fmt_longident s; @@ -274,7 +314,7 @@ and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x -> | Tpat_constant (c) -> line i ppf "Tpat_constant %a\n" fmt_constant c; | Tpat_tuple (l) -> line i ppf "Tpat_tuple\n"; - list i pattern ppf l; + list i labeled_pattern ppf l; | Tpat_construct (li, _, po, vto) -> line i ppf "Tpat_construct %a\n" fmt_longident li; list i pattern ppf po; @@ -290,8 +330,9 @@ and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x -> | Tpat_record (l, _c) -> line i ppf "Tpat_record\n"; list i longident_x_pattern ppf l; - | Tpat_array (am, l) -> - line i ppf "Tpat_array %a\n" fmt_mutable_flag am; + | Tpat_array (am, arg_sort, l) -> + line i ppf "Tpat_array %a\n" fmt_mutable_mode_flag am; + line i ppf "%a\n" Jkind.Sort.format arg_sort; list i pattern ppf l; | Tpat_lazy p -> line i ppf "Tpat_lazy\n"; @@ -307,6 +348,11 @@ and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x -> pattern i ppf p1; pattern i ppf p2; +and labeled_pattern : type k . _ -> _ -> string option * k general_pattern -> unit = + fun i ppf (label, x) -> + tuple_component_label i ppf label; + pattern i ppf x + and pattern_extra i ppf (extra_pat, _, attrs) = match extra_pat with | Tpat_unpack -> @@ -323,7 +369,23 @@ and pattern_extra i ppf (extra_pat, _, attrs) = line i ppf "Tpat_extra_open %a\n" fmt_path id; attributes i ppf attrs; -and expression_extra i ppf (x,_,attrs) = +and function_body i ppf (body : function_body) = + match[@warning "+9"] body with + | Tfunction_body e -> + line i ppf "Tfunction_body\n"; + expression (i+1) ppf e + | Tfunction_cases + { fc_cases; fc_loc; fc_exp_extra; fc_attributes; fc_arg_mode; + fc_arg_sort; fc_param = _; fc_partial = _; fc_env = _; fc_ret_type = _ } + -> + line i ppf "Tfunction_cases %a\n" fmt_location fc_loc; + alloc_mode i ppf fc_arg_mode; + line i ppf "%a\n" Jkind.Sort.format fc_arg_sort; + attributes (i+1) ppf fc_attributes; + Option.iter (fun e -> expression_extra (i+1) ppf e []) fc_exp_extra; + list (i+1) case ppf fc_cases + +and expression_extra i ppf x attrs = match x with | Texp_constraint ct -> line i ppf "Texp_constraint\n"; @@ -341,18 +403,26 @@ and expression_extra i ppf (x,_,attrs) = | Texp_newtype (s, lay) -> line i ppf "Texp_newtype %a\n" (typevar_jkind ~print_quote:false) (s, lay); attributes i ppf attrs; + | Texp_mode_coerce modes -> + let modes = (modes :> string Location.loc list Location.loc) in + line i ppf "Texp_mode_coerce %s\n" + (String.concat "," + (List.map + (fun loc -> Printf.sprintf "\"%s\"" loc.txt) + modes.txt)); + attributes i ppf attrs; -and alloc_mode i ppf m = - line i ppf "alloc_mode %a\n" (Mode.Alloc.print' ~verbose:false) m +and alloc_mode: type l r. _ -> _ -> (l * r) Mode.Alloc.t -> _ + = fun i ppf m -> line i ppf "alloc_mode %a\n" (Mode.Alloc.print ()) m and alloc_mode_option i ppf m = Option.iter (alloc_mode i ppf) m and locality_mode i ppf m = line i ppf "locality_mode %a\n" - (Mode.Locality.print' ~verbose:false ?label:None) m + (Mode.Locality.print ()) m and value_mode i ppf m = - line i ppf "value_mode %a\n" (Mode.Value.print' ~verbose:false) m + line i ppf "value_mode %a\n" (Mode.Value.print ()) m and expression_alloc_mode i ppf (expr, am) = alloc_mode i ppf am; @@ -366,7 +436,7 @@ and expression i ppf x = | [] -> () | extra -> line i ppf "extra\n"; - List.iter (expression_extra (i+1) ppf) extra; + List.iter (fun (x, _, attrs) -> expression_extra (i+1) ppf x attrs) extra; end; match x.exp_desc with | Texp_ident (li,_,_,_,_) -> line i ppf "Texp_ident %a\n" fmt_path li; @@ -374,15 +444,15 @@ and expression i ppf x = | Texp_constant (c) -> line i ppf "Texp_constant %a\n" fmt_constant c; | Texp_let (rf, l, e) -> line i ppf "Texp_let %a\n" fmt_rec_flag rf; - list i value_binding ppf l; + list i (value_binding rf) ppf l; expression i ppf e; - | Texp_function { arg_label = p; param = _; cases; partial = _; region; alloc_mode = am } -> + | Texp_function { params; body; region; alloc_mode = am } -> line i ppf "Texp_function\n"; line i ppf "region %b\n" region; alloc_mode i ppf am; - arg_label i ppf p; - list i case ppf cases; - | Texp_apply (e, l, m, am) -> + list i function_param ppf params; + function_body i ppf body; + | Texp_apply (e, l, m, am, za) -> line i ppf "Texp_apply\n"; line i ppf "apply_mode %s\n" (match m with @@ -390,6 +460,7 @@ and expression i ppf x = | Nontail -> "Nontail" | Default -> "Default"); locality_mode i ppf am; + Option.iter (zero_alloc_assume i ppf) za; expression i ppf e; list i label_x_apply_arg ppf l; | Texp_match (e, sort, l, _partial) -> @@ -404,7 +475,7 @@ and expression i ppf x = | Texp_tuple (l, am) -> line i ppf "Texp_tuple\n"; alloc_mode i ppf am; - list i expression ppf l; + list i labeled_expression ppf l; | Texp_construct (li, _, eo, am) -> line i ppf "Texp_construct %a\n" fmt_longident li; alloc_mode_option i ppf am; @@ -422,9 +493,8 @@ and expression i ppf x = record_representation (i+1) ppf representation; line i ppf "extended_expression =\n"; option (i+1) expression ppf extended_expression; - | Texp_field (e, li, _, _, am) -> + | Texp_field (e, li, _, _) -> line i ppf "Texp_field\n"; - alloc_mode_option i ppf am; expression i ppf e; longident i ppf li; | Texp_setfield (e1, am, li, _, e2) -> @@ -433,15 +503,17 @@ and expression i ppf x = expression i ppf e1; longident i ppf li; expression i ppf e2; - | Texp_array (amut, l, amode) -> - line i ppf "Texp_array %a\n" fmt_mutable_flag amut; + | Texp_array (amut, sort, l, amode) -> + line i ppf "Texp_array %a\n" fmt_mutable_mode_flag amut; + line i ppf "%a\n" Jkind.Sort.format sort; alloc_mode i ppf amode; list i expression ppf l; | Texp_list_comprehension comp -> line i ppf "Texp_list_comprehension\n"; comprehension i ppf comp - | Texp_array_comprehension (amut, comp) -> - line i ppf "Texp_array_comprehension %a\n" fmt_mutable_flag amut; + | Texp_array_comprehension (amut, sort, comp) -> + line i ppf "Texp_array_comprehension %a\n" fmt_mutable_mode_flag amut; + line i ppf "%a\n" Jkind.Sort.format sort; comprehension i ppf comp | Texp_ifthenelse (e1, e2, eo) -> line i ppf "Texp_ifthenelse\n"; @@ -522,6 +594,8 @@ and expression i ppf x = | Texp_exclave (e) -> line i ppf "Texp_exclave"; expression i ppf e; + | Texp_src_pos -> + line i ppf "Texp_src_pos" and value_description i ppf x = line i ppf "value_description %a %a\n" fmt_ident x.val_id fmt_location @@ -535,6 +609,19 @@ and binding_op i ppf x = fmt_location x.bop_loc; expression i ppf x.bop_exp +and function_param i ppf x = + let p = x.fp_arg_label in + arg_label i ppf p; + match x.fp_kind with + | Tparam_pat pat -> + line i ppf "Param_pat\n"; + pattern (i+1) ppf pat + | Tparam_optional_default (pat, expr, sort) -> + line i ppf "Param_optional_default\n"; + line i ppf "%a\n" Jkind.Sort.format sort; + pattern (i+1) ppf pat; + expression (i+1) ppf expr + and type_parameter i ppf (x, _variance) = core_type i ppf x and type_declaration i ppf x = @@ -696,7 +783,7 @@ and class_expr i ppf x = list i label_x_apply_arg ppf l; | Tcl_let (rf, l1, l2, ce) -> line i ppf "Tcl_let %a\n" fmt_rec_flag rf; - list i value_binding ppf l1; + list i (value_binding rf) ppf l1; list i ident_x_expression_def ppf l2; class_expr i ppf ce; | Tcl_constraint (ce, Some ct, _, _, _) -> @@ -921,7 +1008,7 @@ and structure_item i ppf x = expression i ppf e; | Tstr_value (rf, l) -> line i ppf "Tstr_value %a\n" fmt_rec_flag rf; - list i value_binding ppf l; + list i (value_binding rf) ppf l; | Tstr_primitive vd -> line i ppf "Tstr_primitive\n"; value_description i ppf vd; @@ -988,11 +1075,11 @@ and label_decl i ppf {ld_id; ld_name = _; ld_mutable; ld_type; ld_loc; ld_attributes} = line i ppf "%a\n" fmt_location ld_loc; attributes i ppf ld_attributes; - line (i+1) ppf "%a\n" fmt_mutable_flag ld_mutable; + line (i+1) ppf "%a\n" fmt_mutable_mode_flag ld_mutable; line (i+1) ppf "%a" fmt_ident ld_id; core_type (i+1) ppf ld_type -and field_decl i ppf (ty, _) = +and field_decl i ppf {ca_type=ty; ca_loc=_; ca_modalities=_} = core_type (i+1) ppf ty and longident_x_pattern i ppf (li, _, p) = @@ -1041,8 +1128,12 @@ and case end; expression (i+1) ppf c_rhs; -and value_binding i ppf x = - line i ppf "\n"; +and value_binding rec_flag i ppf x = + begin match rec_flag, x.vb_rec_kind with + | Nonrecursive, _ -> line i ppf "\n" + | Recursive, Static -> line i ppf "\n" + | Recursive, Dynamic -> line i ppf "\n" + end; attributes (i+1) ppf x.vb_attributes; pattern (i+1) ppf x.vb_pat; expression (i+1) ppf x.vb_expr @@ -1063,6 +1154,11 @@ and label_x_apply_arg i ppf (l, e) = arg_label (i+1) ppf l; (match e with Omitted _ -> () | Arg (e, _) -> expression (i+1) ppf e) +and labeled_expression i ppf (l, e) = + line i ppf "\n"; + tuple_component_label i ppf l; + expression (i+1) ppf e; + and ident_x_expression_def i ppf (l, e) = line i ppf " \"%a\"\n" fmt_ident l; expression (i+1) ppf e; diff --git a/typing/shape.ml b/typing/shape.ml index 606fecebaca..14159b3e0bf 100644 --- a/typing/shape.ml +++ b/typing/shape.ml @@ -23,8 +23,23 @@ module Uid = struct include Identifiable.Make(struct type nonrec t = t - let equal (x : t) y = x = y - let compare (x : t) y = compare x y + let compare (x : t) y = + match x, y with + | Compilation_unit s1, Compilation_unit s2 -> String.compare s1 s2 + | Item c1, Item c2 -> + let c = Int.compare c1.id c2.id in + if c <> 0 then c else String.compare c1.comp_unit c2.comp_unit + | Internal, Internal -> 0 + | Predef s1, Predef s2 -> String.compare s1 s2 + | Compilation_unit _, (Item _ | Internal | Predef _) -> -1 + | Item _, (Internal | Predef _) -> -1 + | Internal, Predef _ -> -1 + | (Item _ | Internal | Predef _), Compilation_unit _ -> 1 + | (Internal | Predef _), Item _ -> 1 + | Predef _, Internal -> 1 + + let equal x y = compare x y = 0 + let hash (x : t) = Hashtbl.hash x let print fmt = function @@ -70,6 +85,8 @@ module Sig_component_kind = struct type t = | Value | Type + | Constructor + | Label | Module | Module_type | Extension_constructor @@ -79,6 +96,8 @@ module Sig_component_kind = struct let to_string = function | Value -> "value" | Type -> "type" + | Constructor -> "constructor" + | Label -> "label" | Module -> "module" | Module_type -> "module type" | Extension_constructor -> "extension constructor" @@ -90,22 +109,49 @@ module Sig_component_kind = struct | Extension_constructor -> false | Type + | Constructor + | Label | Module | Module_type | Class | Class_type -> true + + let rank = function + | Value -> 0 + | Type -> 1 + | Module -> 2 + | Module_type -> 3 + | Extension_constructor -> 4 + | Class -> 5 + | Class_type -> 6 + | Constructor -> 7 + | Label -> 8 + + let compare a b = + let a = rank a in + let b = rank b in + Int.compare a b end module Item = struct module T = struct type t = string * Sig_component_kind.t - let compare = compare + + let compare (sa, ka) (sb, kb) = + let c = String.compare sa sb in + if c <> 0 then c + else (Sig_component_kind.compare ka kb) + + let name (name, _) = name + let kind (_, kind) = kind let make str ns = str, ns let value id = Ident.name id, Sig_component_kind.Value let type_ id = Ident.name id, Sig_component_kind.Type + let constr id = Ident.name id, Sig_component_kind.Constructor + let label id = Ident.name id, Sig_component_kind.Label let module_ id = Ident.name id, Sig_component_kind.Module let module_type id = Ident.name id, Sig_component_kind.Module_type let extension_constructor id = @@ -119,6 +165,8 @@ module Item = struct Format.fprintf fmt "%S[%s]" name (Sig_component_kind.to_string ns) + + let hash x = Hashtbl.hash x end include T @@ -127,24 +175,62 @@ module Item = struct end type var = Ident.t -type t = { uid: Uid.t option; desc: desc } +type t = { hash:int; uid: Uid.t option; desc: desc; approximated: bool } and desc = | Var of var | Abs of var * t | App of t * t | Struct of t Item.Map.t + | Alias of t | Leaf | Proj of t * Item.t | Comp_unit of string - -let print fmt = + | Error of string + +let rec equal_desc d1 d2 = + if d1 == d2 then true else + match d1, d2 with + | Var v1, Var v2 -> Ident.equal v1 v2 + | Alias a1, Alias a2 -> equal a1 a2 + | Error s1, Error s2 -> String.equal s1 s2 + | Abs (v1, t1), Abs (v2, t2) -> + if Ident.equal v1 v2 then equal t1 t2 + else false + | App (v1, t1), App (v2, t2) -> + if not (equal t1 t2) then false + else equal v1 v2 + | Leaf, Leaf -> true + | Struct t1, Struct t2 -> + Item.Map.equal equal t1 t2 + | Proj (t1, i1), Proj (t2, i2) -> + if Item.compare i1 i2 <> 0 then false + else equal t1 t2 + | Comp_unit c1, Comp_unit c2 -> String.equal c1 c2 + | Var _, (Abs _ | App _ | Struct _ | Leaf | Proj _ | Comp_unit _ | Alias _ | Error _) + | Abs _, (Var _ | App _ | Struct _ | Leaf | Proj _ | Comp_unit _ | Alias _ | Error _) + | App _, (Var _ | Abs _ | Struct _ | Leaf | Proj _ | Comp_unit _ | Alias _ | Error _) + | Struct _, (Var _ | Abs _ | App _ | Leaf | Proj _ | Comp_unit _ | Alias _ | Error _) + | Leaf, (Var _ | Abs _ | App _ | Struct _ | Proj _ | Comp_unit _ | Alias _ | Error _) + | Proj _, (Var _ | Abs _ | App _ | Struct _ | Leaf | Comp_unit _ | Alias _ | Error _) + | Comp_unit _, (Var _ | Abs _ | App _ | Struct _ | Leaf | Proj _ | Alias _ | Error _) + | Alias _, (Var _ | Abs _ | App _ | Struct _ | Leaf | Proj _ | Comp_unit _ | Error _) + | Error _, (Var _ | Abs _ | App _ | Struct _ | Leaf | Proj _ | Comp_unit _ | Alias _) + -> false + +and equal t1 t2 = + if t1.hash <> t2.hash then false + else if not (Bool.equal t1.approximated t2.approximated) then false + else if not (Option.equal Uid.equal t1.uid t2.uid) then false + else equal_desc t1.desc t2.desc + +let print fmt t = let print_uid_opt = Format.pp_print_option (fun fmt -> Format.fprintf fmt "<%a>" Uid.print) in - let rec aux fmt { uid; desc } = + let rec aux fmt { uid; desc; hash = _ } = match desc with | Var id -> - Format.fprintf fmt "%a%a" Ident.print id print_uid_opt uid + Format.fprintf fmt "%s%a" (Ident.name id) print_uid_opt uid | Abs (id, t) -> let rec collect_idents = function | { uid = None; desc = Abs(id, t) } -> @@ -155,8 +241,9 @@ let print fmt = in let (other_idents, body) = collect_idents t in let pp_idents fmt idents = + let idents_names = List.map Ident.name idents in let pp_sep fmt () = Format.fprintf fmt ",@ " in - Format.pp_print_list ~pp_sep Ident.print fmt idents + Format.pp_print_list ~pp_sep Format.pp_print_string fmt idents_names in Format.fprintf fmt "Abs@[%a@,(@[%a,@ @[%a@]@])@]" print_uid_opt uid pp_idents (id :: other_idents) aux body @@ -186,308 +273,137 @@ let print fmt = aux t ) in - Format.fprintf fmt "{@[%a@,%a@]}" print_uid_opt uid print_map map + if Item.Map.is_empty map then + Format.fprintf fmt "@[{%a}@]" print_uid_opt uid + else + Format.fprintf fmt "{@[%a@,%a@]}" print_uid_opt uid print_map map + | Alias t -> + Format.fprintf fmt "Alias@[(@[%a@,%a@])@]" print_uid_opt uid aux t + | Error s -> + Format.fprintf fmt "Error %s" s in - Format.fprintf fmt"@[%a@]@;" aux + if t.approximated then + Format.fprintf fmt "@[(approx)@ %a@]@;" aux t + else + Format.fprintf fmt "@[%a@]@;" aux t + +let rec strip_head_aliases = function + | { desc = Alias t; _ } -> strip_head_aliases t + | t -> t + +let hash_var = 1 +let hash_abs = 2 +let hash_struct = 3 +let hash_leaf = 4 +let hash_proj = 5 +let hash_app = 6 +let hash_comp_unit = 7 +let hash_alias = 8 +let hash_error = 9 let fresh_var ?(name="shape-var") uid = let var = Ident.create_local name in - var, { uid = Some uid; desc = Var var } + var, { uid = Some uid; desc = Var var; + hash = Hashtbl.hash (hash_var, uid, var); + approximated = false } let for_unnamed_functor_param = Ident.create_local "()" let var uid id = - { uid = Some uid; desc = Var id } + { uid = Some uid; desc = Var id; + hash = Hashtbl.hash (hash_var, uid, id); + approximated = false } let abs ?uid var body = - { uid; desc = Abs (var, body) } + { uid; desc = Abs (var, body); + hash = Hashtbl.hash (hash_abs, uid, body.hash); + approximated = false } let str ?uid map = - { uid; desc = Struct map } + let h = Item.Map.fold (fun key t acc -> + Hashtbl.hash (acc, Item.hash key, t.hash)) map 0 + in + { uid; desc = Struct map; hash = Hashtbl.hash (hash_struct, uid, h); + approximated = false } -let leaf uid = - { uid = Some uid; desc = Leaf } +let alias ?uid t = + { uid; desc = Alias t; hash = Hashtbl.hash (hash_alias, uid, t.hash); approximated = false} + +let error ?uid s = + { uid; desc = Error s; hash = Hashtbl.hash (hash_error, uid, s); approximated = false} + +let leaf' uid = + { uid; desc = Leaf; hash = Hashtbl.hash (hash_leaf, uid); + approximated = false } + +let leaf uid = leaf' (Some uid) + +let approx t = { t with approximated = true} + +let set_approximated ~approximated t = { t with approximated} let proj ?uid t item = match t.desc with | Leaf -> (* When stuck projecting in a leaf we propagate the leaf as a best effort *) - t + approx t | Struct map -> begin try Item.Map.find item map - with Not_found -> t (* ill-typed program *) + with Not_found -> approx t (* ill-typed program *) end | _ -> - { uid; desc = Proj (t, item) } + { uid; desc = Proj (t, item); + hash = Hashtbl.hash (hash_proj, t.hash, item); approximated = false } let app ?uid f ~arg = - { uid; desc = App (f, arg) } + { uid; desc = App (f, arg); hash = Hashtbl.hash (hash_app, f.hash, uid, arg.hash) + ; approximated = false } + +let comp_unit ?uid s = + { uid; desc = Comp_unit s; hash = Hashtbl.hash (hash_comp_unit, uid, s); + approximated = false } + +let no_fuel_left ?uid s = { s with uid } let decompose_abs t = match t.desc with | Abs (x, t) -> Some (x, t) | _ -> None -module Make_reduce(Params : sig - type env - val fuel : int - val read_unit_shape : unit_name:string -> t option - val find_shape : env -> Ident.t -> t -end) = struct - (* We implement a strong call-by-need reduction, following an - evaluator from Nathanaelle Courant. *) - - type nf = { uid: Uid.t option; desc: nf_desc } - and nf_desc = - | NVar of var - | NApp of nf * nf - | NAbs of local_env * var * t * delayed_nf - | NStruct of delayed_nf Item.Map.t - | NProj of nf * Item.t - | NLeaf - | NComp_unit of string - | NoFuelLeft of desc - (* A type of normal forms for strong call-by-need evaluation. - The normal form of an abstraction - Abs(x, t) - is a closure - NAbs(env, x, t, dnf) - when [env] is the local environment, and [dnf] is a delayed - normal form of [t]. - - A "delayed normal form" is morally equivalent to (nf Lazy.t), but - we use a different representation that is compatible with - memoization (lazy values are not hashable/comparable by default - comparison functions): we represent a delayed normal form as - just a not-yet-computed pair [local_env * t] of a term in a - local environment -- we could also see this as a term under - an explicit substitution. This delayed thunked is "forced" - by calling the normalization function as usual, but duplicate - computations are precisely avoided by memoization. - *) - and delayed_nf = Thunk of local_env * t - - and local_env = delayed_nf option Ident.Map.t - (* When reducing in the body of an abstraction [Abs(x, body)], we - bind [x] to [None] in the environment. [Some v] is used for - actual substitutions, for example in [App(Abs(x, body), t)], when - [v] is a thunk that will evaluate to the normal form of [t]. *) - - let improve_uid uid (nf : nf) = - match nf.uid with - | Some _ -> nf - | None -> { nf with uid } - - let in_memo_table memo_table memo_key f arg = - match Hashtbl.find memo_table memo_key with - | res -> res - | exception Not_found -> - let res = f arg in - Hashtbl.replace memo_table memo_key res; - res - - type env = { - fuel: int ref; - global_env: Params.env; - local_env: local_env; - reduce_memo_table: (local_env * t, nf) Hashtbl.t; - read_back_memo_table: (nf, t) Hashtbl.t; - } - - let bind env var shape = - { env with local_env = Ident.Map.add var shape env.local_env } - - let rec reduce_ env t = - let memo_key = (env.local_env, t) in - in_memo_table env.reduce_memo_table memo_key (reduce__ env) t - (* Memoization is absolutely essential for performance on this - problem, because the normal forms we build can in some real-world - cases contain an exponential amount of redundancy. Memoization - can avoid the repeated evaluation of identical subterms, - providing a large speedup, but even more importantly it - implicitly shares the memory of the repeated results, providing - much smaller normal forms (that blow up again if printed back - as trees). A functor-heavy file from Irmin has its shape normal - form decrease from 100Mio to 2.5Mio when memoization is enabled. - - Note: the local environment is part of the memoization key, while - it is defined using a type Ident.Map.t of non-canonical balanced - trees: two maps could have exactly the same items, but be - balanced differently and therefore hash differently, reducing - the effectivenss of memoization. - This could in theory happen, say, with the two programs - (fun x -> fun y -> ...) - and - (fun y -> fun x -> ...) - having "the same" local environments, with additions done in - a different order, giving non-structurally-equal trees. Should we - define our own hash functions to provide robust hashing on - environments? - - We believe that the answer is "no": this problem does not occur - in practice. We can assume that identifiers are unique on valid - typedtree fragments (identifier "stamps" distinguish - binding positions); in particular the two program fragments above - in fact bind *distinct* identifiers x (with different stamps) and - different identifiers y, so the environments are distinct. If two - environments are structurally the same, they must correspond to - the evaluation evnrionments of two sub-terms that are under - exactly the same scope of binders. So the two environments were - obtained by the same term traversal, adding binders in the same - order, giving the same balanced trees: the environments have the - same hash. -*) - - and reduce__ ({fuel; global_env; local_env; _} as env) (t : t) = - let reduce env t = reduce_ env t in - let delay_reduce env t = Thunk (env.local_env, t) in - let force (Thunk (local_env, t)) = - reduce { env with local_env } t in - let return desc : nf = { uid = t.uid; desc } in - if !fuel < 0 then return (NoFuelLeft t.desc) - else - match t.desc with - | Comp_unit unit_name -> - begin match Params.read_unit_shape ~unit_name with - | Some t -> reduce env t - | None -> return (NComp_unit unit_name) - end - | App(f, arg) -> - let f = reduce env f in - begin match f.desc with - | NAbs(clos_env, var, body, _body_nf) -> - let arg = delay_reduce env arg in - let env = bind { env with local_env = clos_env } var (Some arg) in - reduce env body - |> improve_uid t.uid - | _ -> - let arg = reduce env arg in - return (NApp(f, arg)) - end - | Proj(str, item) -> - let str = reduce env str in - let nored () = return (NProj(str, item)) in - begin match str.desc with - | NStruct (items) -> - begin match Item.Map.find item items with - | exception Not_found -> nored () - | nf -> - force nf - |> improve_uid t.uid - end - | _ -> - nored () - end - | Abs(var, body) -> - let body_nf = delay_reduce (bind env var None) body in - return (NAbs(local_env, var, body, body_nf)) - | Var id -> - begin match Ident.Map.find id local_env with - (* Note: instead of binding abstraction-bound variables to - [None], we could unify it with the [Some v] case by - binding the bound variable [x] to [NVar x]. - - One reason to distinguish the situations is that we can - provide a different [Uid.t] location; for bound - variables, we use the [Uid.t] of the bound occurrence - (not the binding site), whereas for bound values we use - their binding-time [Uid.t]. *) - | None -> return (NVar id) - | Some def -> force def - | exception Not_found -> - match Params.find_shape global_env id with - | exception Not_found -> return (NVar id) - | res when res = t -> return (NVar id) - | res -> - decr fuel; - reduce env res - end - | Leaf -> return NLeaf - | Struct m -> - let mnf = Item.Map.map (delay_reduce env) m in - return (NStruct mnf) - - let rec read_back env (nf : nf) : t = - in_memo_table env.read_back_memo_table nf (read_back_ env) nf - (* The [nf] normal form we receive may contain a lot of internal - sharing due to the use of memoization in the evaluator. We have - to memoize here again, otherwise the sharing is lost by mapping - over the term as a tree. *) - - and read_back_ env (nf : nf) : t = - { uid = nf.uid; desc = read_back_desc env nf.desc } - - and read_back_desc env desc = - let read_back nf = read_back env nf in - let read_back_force (Thunk (local_env, t)) = - read_back (reduce_ { env with local_env } t) in - match desc with - | NVar v -> - Var v - | NApp (nft, nfu) -> - App(read_back nft, read_back nfu) - | NAbs (_env, x, _t, nf) -> - Abs(x, read_back_force nf) - | NStruct nstr -> - Struct (Item.Map.map read_back_force nstr) - | NProj (nf, item) -> - Proj (read_back nf, item) - | NLeaf -> Leaf - | NComp_unit s -> Comp_unit s - | NoFuelLeft t -> t - - let reduce global_env t = - let fuel = ref Params.fuel in - let reduce_memo_table = Hashtbl.create 42 in - let read_back_memo_table = Hashtbl.create 42 in - let local_env = Ident.Map.empty in - let env = { - fuel; - global_env; - reduce_memo_table; - read_back_memo_table; - local_env; - } in - reduce_ env t |> read_back env -end - -module Local_reduce = - (* Note: this definition with [type env = unit] is only suitable for - reduction of toplevel shapes -- shapes of compilation units, - where free variables are only Comp_unit names. If we wanted to - reduce shapes inside module signatures, we would need to take - a typing environment as parameter. *) - Make_reduce(struct - type env = unit - let fuel = 10 - let read_unit_shape ~unit_name:_ = None - let find_shape _env _id = raise Not_found - end) - -let local_reduce shape = - Local_reduce.reduce () shape - -let dummy_mod = { uid = None; desc = Struct Item.Map.empty } +let dummy_mod = str Item.Map.empty let of_path ~find_shape ~namespace = + (* We need to handle the following cases: + Path of constructor: + M.t.C + Path of label: + M.t.lbl + Path of label of inline record: + M.t.C.lbl *) let rec aux : Sig_component_kind.t -> Path.t -> t = fun ns -> function | Pident id -> find_shape ns id - | Pdot (path, name) -> proj (aux Module path) (name, ns) + | Pdot (path, name) -> + let namespace : Sig_component_kind.t = + match (ns : Sig_component_kind.t) with + | Constructor -> Type + | Label -> Type + | _ -> Module + in + proj (aux namespace path) (name, ns) | Papply (p1, p2) -> app (aux Module p1) ~arg:(aux Module p2) | Pextra_ty (path, extra) -> begin match extra with - Pcstr_ty _ -> aux Type path + Pcstr_ty name -> proj (aux Type path) (name, Constructor) | Pext_ty -> aux Extension_constructor path end in aux namespace let for_persistent_unit s = - { uid = Some (Compilation_unit s); - desc = Comp_unit s } + comp_unit ~uid:(Compilation_unit s) s -let leaf_for_unpack = { uid = None; desc = Leaf } +let leaf_for_unpack = leaf' None let set_uid_if_none t uid = match t.uid with @@ -507,11 +423,21 @@ module Map = struct let item = Item.value id in Item.Map.add item (proj shape item) t - let add_type t id uid = Item.Map.add (Item.type_ id) (leaf uid) t + let add_type t id shape = Item.Map.add (Item.type_ id) shape t let add_type_proj t id shape = let item = Item.type_ id in Item.Map.add item (proj shape item) t + let add_constr t id shape = Item.Map.add (Item.constr id) shape t + let add_constr_proj t id shape = + let item = Item.constr id in + Item.Map.add item (proj shape item) t + + let add_label t id uid = Item.Map.add (Item.label id) (leaf uid) t + let add_label_proj t id shape = + let item = Item.label id in + Item.Map.add item (proj shape item) t + let add_module t id shape = Item.Map.add (Item.module_ id) shape t let add_module_proj t id shape = let item = Item.module_ id in @@ -523,8 +449,8 @@ module Map = struct let item = Item.module_type id in Item.Map.add item (proj shape item) t - let add_extcons t id uid = - Item.Map.add (Item.extension_constructor id) (leaf uid) t + let add_extcons t id shape = + Item.Map.add (Item.extension_constructor id) shape t let add_extcons_proj t id shape = let item = Item.extension_constructor id in Item.Map.add item (proj shape item) t diff --git a/typing/shape.mli b/typing/shape.mli index e1dc6bed331..1ad142a5d0e 100644 --- a/typing/shape.mli +++ b/typing/shape.mli @@ -13,6 +13,47 @@ (* *) (**************************************************************************) +(** Shapes are an abstract representation of modules' implementations which + allow the tracking of definitions through functor applications and other + module-level operations. + + The Shape of a compilation unit is elaborated during typing, partially + reduced (without loading external shapes) and written to the [cmt] file. + + External tools can retrieve the definition of any value (or type, or module, + etc) by following this procedure: + + - Build the Shape corresponding to the value's path: + [let shape = Env.shape_of_path ~namespace env path] + + - Instantiate the [Shape_reduce.Make] functor with a way to load shapes from + external units and to looks for shapes in the environment (usually using + [Env.shape_of_path]). + + - Completely reduce the shape: + [let shape = My_reduce.(weak_)reduce env shape] + + - The [Uid.t] stored in the reduced shape should be the one of the + definition. However, if the [approximate] field of the reduced shape is + [true] then the [Uid.t] will not correspond to the definition, but to the + closest parent module's uid. This happens when Shape reduction gets stuck, + for example when hitting first-class modules. + + - The location of the definition can be easily found with the + [cmt_format.cmt_uid_to_decl] table of the corresponding compilation unit. + + See: + - {{: https://icfp22.sigplan.org/details/mlfamilyworkshop-2022-papers/10/Module-Shapes-for-Modern-Tooling } + the design document} + - {{: https://www.lix.polytechnique.fr/Labo/Gabriel.Scherer/research/shapes/2022-ml-workshop-shapes-talk.pdf } + a talk about the reduction strategy +*) + +(** A [Uid.t] is associated to every declaration in signatures and + implementations. They uniquely identify bindings in the program. When + associated with these bindings' locations they are useful to external tools + when trying to jump to an identifier's declaration or definition. They are + stored to that effect in the [uid_to_decl] table of cmt files. *) module Uid : sig type t = private | Compilation_unit of string @@ -36,6 +77,8 @@ module Sig_component_kind : sig type t = | Value | Type + | Constructor + | Label | Module | Module_type | Extension_constructor @@ -48,35 +91,53 @@ module Sig_component_kind : sig val can_appear_in_types : t -> bool end +(** Shape's items are elements of a structure or, in the case of constructors + and labels, elements of a record or variants definition seen as a structure. + These structures model module components and nested types' constructors and + labels. *) module Item : sig - type t + type t = string * Sig_component_kind.t + val name : t -> string + val kind : t -> Sig_component_kind.t val make : string -> Sig_component_kind.t -> t val value : Ident.t -> t val type_ : Ident.t -> t + val constr : Ident.t -> t + val label : Ident.t -> t val module_ : Ident.t -> t val module_type : Ident.t -> t val extension_constructor : Ident.t -> t val class_ : Ident.t -> t val class_type : Ident.t -> t + val print : Format.formatter -> t -> unit + + val compare : t -> t -> int + module Map : Map.S with type key = t end type var = Ident.t -type t = { uid: Uid.t option; desc: desc } +type t = private { hash: int; uid: Uid.t option; desc: desc; approximated: bool } and desc = | Var of var | Abs of var * t | App of t * t | Struct of t Item.Map.t + | Alias of t | Leaf | Proj of t * Item.t | Comp_unit of string + | Error of string val print : Format.formatter -> t -> unit +val strip_head_aliases : t -> t + +val equal : t -> t -> bool + (* Smart constructors *) val for_unnamed_functor_param : var @@ -86,8 +147,15 @@ val var : Uid.t -> Ident.t -> t val abs : ?uid:Uid.t -> var -> t -> t val app : ?uid:Uid.t -> t -> arg:t -> t val str : ?uid:Uid.t -> t Item.Map.t -> t +val alias : ?uid:Uid.t -> t -> t +val error : ?uid:Uid.t -> string -> t val proj : ?uid:Uid.t -> t -> Item.t -> t val leaf : Uid.t -> t +val leaf' : Uid.t option -> t +val no_fuel_left : ?uid:Uid.t -> t -> t +val comp_unit : ?uid:Uid.t -> string -> t + +val set_approximated : approximated:bool -> t -> t val decompose_abs : t -> (var * t) option @@ -106,16 +174,22 @@ module Map : sig val add_value : t -> Ident.t -> Uid.t -> t val add_value_proj : t -> Ident.t -> shape -> t - val add_type : t -> Ident.t -> Uid.t -> t + val add_type : t -> Ident.t -> shape -> t val add_type_proj : t -> Ident.t -> shape -> t + val add_constr : t -> Ident.t -> shape -> t + val add_constr_proj : t -> Ident.t -> shape -> t + + val add_label : t -> Ident.t -> Uid.t -> t + val add_label_proj : t -> Ident.t -> shape -> t + val add_module : t -> Ident.t -> shape -> t val add_module_proj : t -> Ident.t -> shape -> t val add_module_type : t -> Ident.t -> Uid.t -> t val add_module_type_proj : t -> Ident.t -> shape -> t - val add_extcons : t -> Ident.t -> Uid.t -> t + val add_extcons : t -> Ident.t -> shape -> t val add_extcons_proj : t -> Ident.t -> shape -> t val add_class : t -> Ident.t -> Uid.t -> t @@ -127,32 +201,12 @@ end val dummy_mod : t +(** This function returns the shape corresponding to a given path. It requires a + callback to find shapes in the environment. It is generally more useful to + rely directly on the [Env.shape_of_path] function to get the shape + associated with a given path. *) val of_path : find_shape:(Sig_component_kind.t -> Ident.t -> t) -> namespace:Sig_component_kind.t -> Path.t -> t val set_uid_if_none : t -> Uid.t -> t - -(** The [Make_reduce] functor is used to generate a reduction function for - shapes. - - It is parametrized by: - - an environment and a function to find shapes by path in that environment - - a function to load the shape of an external compilation unit - - some fuel, which is used to bound recursion when dealing with recursive - shapes introduced by recursive modules. (FTR: merlin currently uses a - fuel of 10, which seems to be enough for most practical examples) -*) -module Make_reduce(Context : sig - type env - - val fuel : int - - val read_unit_shape : unit_name:string -> t option - - val find_shape : env -> Ident.t -> t - end) : sig - val reduce : Context.env -> t -> t -end - -val local_reduce : t -> t diff --git a/typing/shape_reduce.ml b/typing/shape_reduce.ml new file mode 100644 index 00000000000..40453e14ad2 --- /dev/null +++ b/typing/shape_reduce.ml @@ -0,0 +1,420 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Ulysse Gérard, Thomas Refis, Tarides *) +(* Nathanaëlle Courant, OCamlPro *) +(* Gabriel Scherer, projet Picube, INRIA Paris *) +(* *) +(* Copyright 2021 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. *) +(* *) +(**************************************************************************) + +open Shape + +type result = + | Resolved of Uid.t + | Resolved_alias of Uid.t list + | Unresolved of t + | Approximated of Uid.t option + | Internal_error_missing_uid + +let print_result fmt result = + match result with + | Resolved uid -> + Format.fprintf fmt "@[Resolved: %a@]@;" Uid.print uid + | Resolved_alias uids -> + Format.fprintf fmt "@[Resolved_alias: %a@]@;" + Format.(pp_print_list ~pp_sep:(fun fmt () -> fprintf fmt "@ -> ") + Uid.print) uids + | Unresolved shape -> + Format.fprintf fmt "@[Unresolved: %a@]@;" print shape + | Approximated (Some uid) -> + Format.fprintf fmt "@[Approximated: %a@]@;" Uid.print uid + | Approximated None -> + Format.fprintf fmt "@[Approximated: No uid@]@;" + | Internal_error_missing_uid -> + Format.fprintf fmt "@[Missing uid@]@;" + + +let find_shape env id = + let namespace = Shape.Sig_component_kind.Module in + Env.shape_of_path ~namespace env (Pident id) + +module Make(Params : sig + val fuel : int + val read_unit_shape : unit_name:string -> t option +end) = struct + (* We implement a strong call-by-need reduction, following an + evaluator from Nathanaelle Courant. *) + + type nf = { uid: Uid.t option; desc: nf_desc; approximated: bool } + and nf_desc = + | NVar of var + | NApp of nf * nf + | NAbs of local_env * var * t * delayed_nf + | NStruct of delayed_nf Item.Map.t + | NAlias of delayed_nf + | NProj of nf * Item.t + | NLeaf + | NComp_unit of string + | NError of string + + (* A type of normal forms for strong call-by-need evaluation. + The normal form of an abstraction + Abs(x, t) + is a closure + NAbs(env, x, t, dnf) + when [env] is the local environment, and [dnf] is a delayed + normal form of [t]. + + A "delayed normal form" is morally equivalent to (nf Lazy.t), but + we use a different representation that is compatible with + memoization (lazy values are not hashable/comparable by default + comparison functions): we represent a delayed normal form as + just a not-yet-computed pair [local_env * t] of a term in a + local environment -- we could also see this as a term under + an explicit substitution. This delayed thunked is "forced" + by calling the normalization function as usual, but duplicate + computations are precisely avoided by memoization. + *) + and delayed_nf = Thunk of local_env * t + + and local_env = delayed_nf option Ident.Map.t + (* When reducing in the body of an abstraction [Abs(x, body)], we + bind [x] to [None] in the environment. [Some v] is used for + actual substitutions, for example in [App(Abs(x, body), t)], when + [v] is a thunk that will evaluate to the normal form of [t]. *) + + let approx_nf nf = { nf with approximated = true } + + let rec equal_local_env t1 t2 = + Ident.Map.equal (Option.equal equal_delayed_nf) t1 t2 + + and equal_delayed_nf t1 t2 = + match t1, t2 with + | Thunk (l1, t1), Thunk (l2, t2) -> + if equal t1 t2 then equal_local_env l1 l2 + else false + + and equal_nf_desc d1 d2 = + match d1, d2 with + | NVar v1, NVar v2 -> Ident.equal v1 v2 + | NAbs (l1, v1, t1, nf1), NAbs (l2, v2, t2, nf2) -> + if not (Ident.equal v1 v2) then false + else if not (equal t1 t2) then false + else if not (equal_delayed_nf nf1 nf2) then false + else equal_local_env l1 l2 + | NApp (v1, t1), NApp (v2, t2) -> + if equal_nf v1 v2 then equal_nf t1 t2 + else false + | NLeaf, NLeaf -> true + | NStruct t1, NStruct t2 -> + Item.Map.equal equal_delayed_nf t1 t2 + | NProj (t1, i1), NProj (t2, i2) -> + if Item.compare i1 i2 <> 0 then false + else equal_nf t1 t2 + | NComp_unit c1, NComp_unit c2 -> String.equal c1 c2 + | NAlias a1, NAlias a2 -> equal_delayed_nf a1 a2 + | NError e1, NError e2 -> String.equal e1 e2 + | NVar _, (NLeaf | NApp _ | NAbs _ | NStruct _ | NProj _ | NComp_unit _ | NAlias _ | NError _) + | NLeaf, (NVar _ | NApp _ | NAbs _ | NStruct _ | NProj _ | NComp_unit _ | NAlias _ | NError _) + | NApp _, (NVar _ | NLeaf | NAbs _ | NStruct _ | NProj _ | NComp_unit _ | NAlias _ | NError _) + | NAbs _, (NVar _ | NLeaf | NApp _ | NStruct _ | NProj _ | NComp_unit _ | NAlias _ | NError _) + | NStruct _, (NVar _ | NLeaf | NApp _ | NAbs _ | NProj _ | NComp_unit _ | NAlias _ | NError _) + | NProj _, (NVar _ | NLeaf | NApp _ | NAbs _ | NStruct _ | NComp_unit _ | NAlias _ | NError _) + | NComp_unit _, (NVar _ | NLeaf | NApp _ | NAbs _ | NStruct _ | NProj _ | NAlias _ | NError _) + | NAlias _, (NVar _ | NLeaf | NApp _ | NAbs _ | NStruct _ | NProj _ | NComp_unit _ | NError _) + | NError _, (NVar _ | NLeaf | NApp _ | NAbs _ | NStruct _ | NProj _ | NComp_unit _ | NAlias _) + -> false + + and equal_nf t1 t2 = + if not (Option.equal Uid.equal t1.uid t2.uid) then false + else equal_nf_desc t1.desc t2.desc + + module ReduceMemoTable = Hashtbl.Make(struct + type nonrec t = local_env * t + + let hash t = Hashtbl.hash t + + let equal (env1, t1) (env2, t2) = + if equal t1 t2 then equal_local_env env1 env2 + else false + end) + + module ReadBackMemoTable = Hashtbl.Make(struct + type nonrec t = nf + + let hash t = Hashtbl.hash t + + let equal a b = equal_nf a b + end) + + let in_reduce_memo_table memo_table memo_key f arg = + match ReduceMemoTable.find memo_table memo_key with + | res -> res + | exception Not_found -> + let res = f arg in + ReduceMemoTable.replace memo_table memo_key res; + res + + let in_read_back_memo_table memo_table memo_key f arg = + match ReadBackMemoTable.find memo_table memo_key with + | res -> res + | exception Not_found -> + let res = f arg in + ReadBackMemoTable.replace memo_table memo_key res; + res + + type env = { + fuel: int ref; + global_env: Env.t; + local_env: local_env; + reduce_memo_table: nf ReduceMemoTable.t; + read_back_memo_table: t ReadBackMemoTable.t; + } + + let bind env var shape = + { env with local_env = Ident.Map.add var shape env.local_env } + + let rec reduce_ env t = + let local_env = env.local_env in + let memo_key = (local_env, t) in + in_reduce_memo_table env.reduce_memo_table memo_key (reduce__ env) t + (* Memoization is absolutely essential for performance on this + problem, because the normal forms we build can in some real-world + cases contain an exponential amount of redundancy. Memoization + can avoid the repeated evaluation of identical subterms, + providing a large speedup, but even more importantly it + implicitly shares the memory of the repeated results, providing + much smaller normal forms (that blow up again if printed back + as trees). A functor-heavy file from Irmin has its shape normal + form decrease from 100Mio to 2.5Mio when memoization is enabled. + + Note: the local environment is part of the memoization key, while + it is defined using a type Ident.Map.t of non-canonical balanced + trees: two maps could have exactly the same items, but be + balanced differently and therefore hash differently, reducing + the effectivenss of memoization. + This could in theory happen, say, with the two programs + (fun x -> fun y -> ...) + and + (fun y -> fun x -> ...) + having "the same" local environments, with additions done in + a different order, giving non-structurally-equal trees. Should we + define our own hash functions to provide robust hashing on + environments? + + We believe that the answer is "no": this problem does not occur + in practice. We can assume that identifiers are unique on valid + typedtree fragments (identifier "stamps" distinguish + binding positions); in particular the two program fragments above + in fact bind *distinct* identifiers x (with different stamps) and + different identifiers y, so the environments are distinct. If two + environments are structurally the same, they must correspond to + the evaluation environments of two sub-terms that are under + exactly the same scope of binders. So the two environments were + obtained by the same term traversal, adding binders in the same + order, giving the same balanced trees: the environments have the + same hash. +*) + + and reduce__ + ({fuel; global_env; local_env; _} as env) (t : t) = + let reduce env t = reduce_ env t in + let delay_reduce env t = Thunk (env.local_env, t) in + let force (Thunk (local_env, t)) = reduce { env with local_env } t in + let return desc = { uid = t.uid; desc; approximated = t.approximated } in + let rec force_aliases nf = match nf.desc with + | NAlias delayed_nf -> + let nf = force delayed_nf in + force_aliases nf + | _ -> nf + in + let reset_uid_if_new_binding t' = + match t.uid with + | None -> t' + | Some _ as uid -> { t' with uid } + in + if !fuel < 0 then approx_nf (return (NError "NoFuelLeft")) + else + match t.desc with + | Comp_unit unit_name -> + begin match Params.read_unit_shape ~unit_name with + | Some t -> reduce env t + | None -> return (NComp_unit unit_name) + end + | App(f, arg) -> + let f = reduce env f |> force_aliases in + begin match f.desc with + | NAbs(clos_env, var, body, _body_nf) -> + let arg = delay_reduce env arg in + let env = bind { env with local_env = clos_env } var (Some arg) in + reduce env body |> reset_uid_if_new_binding + | _ -> + let arg = reduce env arg in + return (NApp(f, arg)) + end + | Proj(str, item) -> + let str = reduce env str |> force_aliases in + let nored () = return (NProj(str, item)) in + begin match str.desc with + | NStruct (items) -> + begin match Item.Map.find item items with + | exception Not_found -> nored () + | nf -> force nf |> reset_uid_if_new_binding + end + | _ -> + nored () + end + | Abs(var, body) -> + let body_nf = delay_reduce (bind env var None) body in + return (NAbs(local_env, var, body, body_nf)) + | Var id -> + begin match Ident.Map.find id local_env with + (* Note: instead of binding abstraction-bound variables to + [None], we could unify it with the [Some v] case by + binding the bound variable [x] to [NVar x]. + + One reason to distinguish the situations is that we can + provide a different [Uid.t] location; for bound + variables, we use the [Uid.t] of the bound occurrence + (not the binding site), whereas for bound values we use + their binding-time [Uid.t]. *) + | None -> return (NVar id) + | Some def -> + begin match force def with + | { uid = Some _; _ } as nf -> nf + (* This var already has a binding uid *) + | { uid = None; _ } as nf -> { nf with uid = t.uid } + (* Set the var's binding uid *) + end + | exception Not_found -> + match find_shape global_env id with + | exception Not_found -> return (NVar id) + | res when res = t -> return (NVar id) + | res -> + decr fuel; + reduce env res + end + | Leaf -> return NLeaf + | Struct m -> + let mnf = Item.Map.map (delay_reduce env) m in + return (NStruct mnf) + | Alias t -> return (NAlias (delay_reduce env t)) + | Error s -> approx_nf (return (NError s)) + + and read_back env (nf : nf) : t = + in_read_back_memo_table env.read_back_memo_table nf (read_back_ env) nf + (* The [nf] normal form we receive may contain a lot of internal + sharing due to the use of memoization in the evaluator. We have + to memoize here again, otherwise the sharing is lost by mapping + over the term as a tree. *) + + and read_back_ env (nf : nf) : t = + read_back_desc ~uid:nf.uid env nf.desc + + and read_back_desc ~uid env desc = + let read_back nf = read_back env nf in + let read_back_force (Thunk (local_env, t)) = + read_back (reduce_ { env with local_env } t) in + match desc with + | NVar v -> + var (Option.get uid) v + | NApp (nft, nfu) -> + let f = read_back nft in + let arg = read_back nfu in + app ?uid f ~arg + | NAbs (_env, x, _t, nf) -> + let body = read_back_force nf in + abs ?uid x body + | NStruct nstr -> + let map = Item.Map.map read_back_force nstr in + str ?uid map + | NProj (nf, item) -> + let t = read_back nf in + proj ?uid t item + | NLeaf -> leaf' uid + | NComp_unit s -> comp_unit ?uid s + | NAlias nf -> alias ?uid (read_back_force nf) + | NError t -> error ?uid t + + (* Sharing the memo tables is safe at the level of a compilation unit since + idents should be unique *) + let reduce_memo_table = Local_store.s_table ReduceMemoTable.create 42 + let read_back_memo_table = Local_store.s_table ReadBackMemoTable.create 42 + + let reduce global_env t = + let fuel = ref Params.fuel in + let local_env = Ident.Map.empty in + let env = { + fuel; + global_env; + reduce_memo_table = !reduce_memo_table; + read_back_memo_table = !read_back_memo_table; + local_env; + } in + reduce_ env t |> read_back env + + let rec is_stuck_on_comp_unit (nf : nf) = + match nf.desc with + | NVar _ -> + (* This should not happen if we only reduce closed terms *) + false + | NApp (nf, _) | NProj (nf, _) -> is_stuck_on_comp_unit nf + | NStruct _ | NAbs _ -> false + | NAlias _ -> false + | NComp_unit _ -> true + | NError _ -> false + | NLeaf -> false + + let get_aliases_uids (t : t) = + let rec aux acc (t : t) = match t with + | { uid = Some uid; desc = Alias t; _ } -> aux (uid::acc) t + | { uid = Some uid; _ } -> Resolved_alias (List.rev (uid::acc)) + | _ -> Internal_error_missing_uid + in + aux [] t + + let reduce_for_uid global_env t = + let fuel = ref Params.fuel in + let local_env = Ident.Map.empty in + let env = { + fuel; + global_env; + reduce_memo_table = !reduce_memo_table; + read_back_memo_table = !read_back_memo_table; + local_env; + } in + let nf = reduce_ env t in + if is_stuck_on_comp_unit nf then + Unresolved (read_back env nf) + else match nf with + | { desc = NAlias _; approximated = false; _ } -> + get_aliases_uids (read_back env nf) + | { uid = Some uid; approximated = false; _ } -> + Resolved uid + | { uid; approximated = true; _ } -> + Approximated uid + | { uid = None; approximated = false; _ } -> + (* A missing Uid after a complete reduction means the Uid was first + missing in the shape which is a code error. Having the + [Missing_uid] reported will allow Merlin (or another tool working + with the index) to ask users to report the issue if it does happen. + *) + Internal_error_missing_uid +end + +module Local_reduce = + Make(struct + let fuel = 10 + let read_unit_shape ~unit_name:_ = None + end) + +let local_reduce = Local_reduce.reduce +let local_reduce_for_uid = Local_reduce.reduce_for_uid diff --git a/typing/shape_reduce.mli b/typing/shape_reduce.mli new file mode 100644 index 00000000000..5e409c3cd7a --- /dev/null +++ b/typing/shape_reduce.mli @@ -0,0 +1,62 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Ulysse Gérard, Thomas Refis, Tarides *) +(* Nathanaëlle Courant, OCamlPro *) +(* Gabriel Scherer, projet Picube, INRIA Paris *) +(* *) +(* Copyright 2021 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. *) +(* *) +(**************************************************************************) + +(** The result of reducing a shape and looking for its uid *) +type result = + | Resolved of Shape.Uid.t (** Shape reduction succeeded and a uid was found *) + | Resolved_alias of Shape.Uid.t list (** Reduction led to an alias chain *) + | Unresolved of Shape.t (** Result still contains [Comp_unit] terms *) + | Approximated of Shape.Uid.t option + (** Reduction failed: it can arrive with first-clsss modules for example *) + | Internal_error_missing_uid + (** Reduction succeeded but no uid was found, this should never happen *) + +val print_result : Format.formatter -> result -> unit + +(** The [Make] functor is used to generate a reduction function for + shapes. + + It is parametrized by: + - a function to load the shape of an external compilation unit + - some fuel, which is used to bound recursion when dealing with recursive + shapes introduced by recursive modules. (FTR: merlin currently uses a + fuel of 10, which seems to be enough for most practical examples) + + Usage warning: To ensure good performances, every reduction made with the + same instance of that functor share the same ident-based memoization tables. + Such an instance should only be used to perform reduction inside a unique + compilation unit to prevent conflicting entries in these memoization tables. +*) +module Make(_ : sig + val fuel : int + + val read_unit_shape : unit_name:string -> Shape.t option + end) : sig + val reduce : Env.t -> Shape.t -> Shape.t + + (** Perform weak reduction and return the head's uid if any. If reduction was + incomplete the partially reduced shape is returned. *) + val reduce_for_uid : Env.t -> Shape.t -> result +end + +(** [local_reduce] will not reduce shapes that require loading external + compilation units. *) +val local_reduce : Env.t -> Shape.t -> Shape.t + +(** [local_reduce_for_uid] will not reduce shapes that require loading external + compilation units. *) +val local_reduce_for_uid : Env.t -> Shape.t -> result diff --git a/typing/solver.ml b/typing/solver.ml new file mode 100644 index 00000000000..fd8cabcc9ab --- /dev/null +++ b/typing/solver.ml @@ -0,0 +1,851 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Stephen Dolan, Jane Street, London *) +(* Zesen Qian, Jane Street, London *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +open Solver_intf + +module Magic_allow_disallow (X : Allow_disallow) : + Allow_disallow with type ('a, 'b, 'd) sided = ('a, 'b, 'd) X.sided = struct + type ('a, 'b, 'd) sided = ('a, 'b, 'd) X.sided + + let disallow_right : + type a b l r. (a, b, l * r) sided -> (a, b, l * disallowed) sided = + Obj.magic + + let disallow_left : + type a b l r. (a, b, l * r) sided -> (a, b, disallowed * r) sided = + Obj.magic + + let allow_right : + type a b l r. (a, b, l * allowed) sided -> (a, b, l * r) sided = + Obj.magic + + let allow_left : + type a b l r. (a, b, allowed * r) sided -> (a, b, l * r) sided = + Obj.magic +end +[@@inline] + +module Magic_equal (X : Equal) : + Equal with type ('a, 'b, 'c) t = ('a, 'b, 'c) X.t = struct + type ('a, 'b, 'd) t = ('a, 'b, 'd) X.t + + let equal : + type a0 a1 b l0 l1 r0 r1. + (a0, b, l0 * r0) t -> (a1, b, l1 * r1) t -> (a0, a1) Misc.eq option = + fun x0 x1 -> + if Obj.repr x0 = Obj.repr x1 then Some (Obj.magic Misc.Refl) else None +end +[@@inline] + +type 'a error = + { left : 'a; + right : 'a + } + +(** Map the function to the list, and returns the first [Error] found; + Returns [Ok ()] if no error. *) +let rec find_error (f : 'x -> ('a, 'b) Result.t) : 'x list -> ('a, 'b) Result.t + = function + | [] -> Ok () + | x :: rest -> ( + match f x with Ok () -> find_error f rest | Error _ as e -> e) + +module Solver_mono (C : Lattices_mono) = struct + type 'a var = + { mutable vlower : 'a lmorphvar list; + (** A list of variables directly under the current variable. + Each is a pair [f] [v], and we have [f v <= u] where [u] is the current + variable. + TODO: consider using hashset for quicker deduplication *) + mutable upper : 'a; (** The precise upper bound of the variable *) + mutable lower : 'a; + (** The *conservative* lower bound of the variable. + Why conservative: if a user calls [submode c u] where [c] is + some constant and [u] some variable, we can modify [u.lower] of course. + Idealy we should also modify all [v.lower] where [v] is variable above [u]. + However, we only have [vlower] not [vupper]. Therefore, the [lower] of + higher variables are not updated immediately, hence conservative. Those + [lower] of higher variables can be made precise later on demand, see + [zap_to_floor_var_aux]. + + One might argue for an additional [vupper] field, so that [lower] are + always precise. While this might be doable, we note that the "hotspot" of + the mode solver is to detect conflict, which is already achieved without + precise [lower]. Adding [vupper] and keeping [lower] precise will come + at extra cost. *) + (* To summarize, INVARIANT: + - For any variable [v], we have [v.lower <= v.upper]. + - Variables that have been fully constrained will have + [v.lower = v.upper]. Note that adding a boolean field indicating that + won't help much. + - For any [v] and [f u \in v.vlower], we have [f u.upper <= v.upper], but not + necessarily [f u.lower <= v.lower]. *) + id : int (** For identification/printing *) + } + + and 'b lmorphvar = ('b, left_only) morphvar + + and ('b, 'd) morphvar = + | Amorphvar : 'a var * ('a, 'b, 'd) C.morph -> ('b, 'd) morphvar + + module VarSet = Set.Make (Int) + + type change = + | Cupper : 'a var * 'a -> change + | Clower : 'a var * 'a -> change + | Cvlower : 'a var * 'a lmorphvar list -> change + + type changes = change list + + let undo_change = function + | Cupper (v, upper) -> v.upper <- upper + | Clower (v, lower) -> v.lower <- lower + | Cvlower (v, vlower) -> v.vlower <- vlower + + let empty_changes = [] + + let undo_changes l = List.iter undo_change l + + (** [append_changes l0 l1] returns a log that's equivalent to [l0] followed by + [l1]. *) + let append_changes l0 l1 = l1 @ l0 + + type ('a, 'd) mode = + | Amode : 'a -> ('a, 'l * 'r) mode + | Amodevar : ('a, 'd) morphvar -> ('a, 'd) mode + | Amodejoin : + 'a * ('a, 'l * disallowed) morphvar list + -> ('a, 'l * disallowed) mode + (** [Amodejoin a [mv0, mv1, ..]] represents [a join mv0 join mv1 join ..] *) + | Amodemeet : + 'a * ('a, disallowed * 'r) morphvar list + -> ('a, disallowed * 'r) mode + (** [Amodemeet a [mv0, mv1, ..]] represents [a meet mv0 meet mv1 meet ..]. *) + + (** Prints a mode variable, including the set of variables below it + (recursively). To handle cycles, [traversed] is the set of variables that + we have already printed and will be skipped. An example of cycle: + + Consider a lattice containing three elements A = {0, 1, 2} with the linear + lattice structure: 0 < 1 < 2. Furthermore, we define a morphism + f : A -> A + f 0 = 0 + f 1 = 2 + f 2 = 2 + + Note that f has a left right, which allows us to write f on the LHS of + submode. Say we create a unconstrained variable [x], and invoke submode: + f x <= x + this would result in adding (f, x) into the [vlower] of [x]. That is, + there will be a self-loop on [x]. + *) + let rec print_var : type a. ?traversed:VarSet.t -> a C.obj -> _ -> a var -> _ + = + fun ?traversed obj ppf v -> + Format.fprintf ppf "modevar#%x[%a .. %a]" v.id (C.print obj) v.lower + (C.print obj) v.upper; + match traversed with + | None -> () + | Some traversed -> + if VarSet.mem v.id traversed + then () + else + let traversed = VarSet.add v.id traversed in + let p = print_morphvar ~traversed obj in + Format.fprintf ppf "{%a}" (Format.pp_print_list p) v.vlower + + and print_morphvar : + type a d. ?traversed:VarSet.t -> a C.obj -> _ -> (a, d) morphvar -> _ = + fun ?traversed dst ppf (Amorphvar (v, f)) -> + let src = C.src dst f in + Format.fprintf ppf "%a(%a)" (C.print_morph dst) f (print_var ?traversed src) + v + + let print_raw : + type a l r. + ?verbose:bool -> a C.obj -> Format.formatter -> (a, l * r) mode -> unit = + fun ?(verbose = false) (obj : a C.obj) ppf m -> + let traversed = if verbose then Some VarSet.empty else None in + match m with + | Amode a -> C.print obj ppf a + | Amodevar mv -> print_morphvar ?traversed obj ppf mv + | Amodejoin (a, mvs) -> + Format.fprintf ppf "join(%a,%a)" (C.print obj) a + (Format.pp_print_list + ~pp_sep:(fun ppf () -> Format.fprintf ppf ",") + (print_morphvar ?traversed obj)) + mvs + | Amodemeet (a, mvs) -> + Format.fprintf ppf "meet(%a,%a)" (C.print obj) a + (Format.pp_print_list + ~pp_sep:(fun ppf () -> Format.fprintf ppf ",") + (print_morphvar ?traversed obj)) + mvs + + module Morphvar = Magic_allow_disallow (struct + type ('a, _, 'd) sided = ('a, 'd) morphvar constraint 'd = 'l * 'r + + let allow_left : + type a l r. (a, allowed * r) morphvar -> (a, l * r) morphvar = function + | Amorphvar (v, m) -> Amorphvar (v, C.allow_left m) + + let allow_right : + type a l r. (a, l * allowed) morphvar -> (a, l * r) morphvar = function + | Amorphvar (v, m) -> Amorphvar (v, C.allow_right m) + + let disallow_left : + type a l r. (a, l * r) morphvar -> (a, disallowed * r) morphvar = + function + | Amorphvar (v, m) -> Amorphvar (v, C.disallow_left m) + + let disallow_right : + type a l r. (a, l * r) morphvar -> (a, l * disallowed) morphvar = + function + | Amorphvar (v, m) -> Amorphvar (v, C.disallow_right m) + end) + + include Magic_allow_disallow (struct + type ('a, _, 'd) sided = ('a, 'd) mode constraint 'd = 'l * 'r + + let allow_left : type a l r. (a, allowed * r) mode -> (a, l * r) mode = + function + | Amode c -> Amode c + | Amodevar mv -> Amodevar (Morphvar.allow_left mv) + | Amodejoin (c, mvs) -> Amodejoin (c, List.map Morphvar.allow_left mvs) + + let allow_right : type a l r. (a, l * allowed) mode -> (a, l * r) mode = + function + | Amode c -> Amode c + | Amodevar mv -> Amodevar (Morphvar.allow_right mv) + | Amodemeet (c, mvs) -> Amodemeet (c, List.map Morphvar.allow_right mvs) + + let disallow_left : type a l r. (a, l * r) mode -> (a, disallowed * r) mode + = function + | Amode c -> Amode c + | Amodevar mv -> Amodevar (Morphvar.disallow_left mv) + | Amodejoin (c, mvs) -> Amodejoin (c, List.map Morphvar.disallow_left mvs) + | Amodemeet (c, mvs) -> Amodemeet (c, List.map Morphvar.disallow_left mvs) + + let disallow_right : type a l r. (a, l * r) mode -> (a, l * disallowed) mode + = function + | Amode c -> Amode c + | Amodevar mv -> Amodevar (Morphvar.disallow_right mv) + | Amodejoin (c, mvs) -> Amodejoin (c, List.map Morphvar.disallow_right mvs) + | Amodemeet (c, mvs) -> Amodemeet (c, List.map Morphvar.disallow_right mvs) + end) + + let mlower dst (Amorphvar (var, morph)) = C.apply dst morph var.lower + + let mupper dst (Amorphvar (var, morph)) = C.apply dst morph var.upper + + let min (type a) (obj : a C.obj) = Amode (C.min obj) + + let max (type a) (obj : a C.obj) = Amode (C.max obj) + + let of_const a = Amode a + + let apply_morphvar dst morph (Amorphvar (var, morph')) = + Amorphvar (var, C.compose dst morph morph') + + let apply : + type a b l r. + b C.obj -> (a, b, l * r) C.morph -> (a, l * r) mode -> (b, l * r) mode = + fun dst morph m -> + match m with + | Amode a -> Amode (C.apply dst morph a) + | Amodevar mv -> Amodevar (apply_morphvar dst morph mv) + | Amodejoin (a, vs) -> + Amodejoin (C.apply dst morph a, List.map (apply_morphvar dst morph) vs) + | Amodemeet (a, vs) -> + Amodemeet (C.apply dst morph a, List.map (apply_morphvar dst morph) vs) + + (** Arguments are not checked and used directly. They must satisfy the + INVARIANT listed above. *) + let update_lower (type a) ~log (obj : a C.obj) v a = + (match log with + | None -> () + | Some log -> log := Clower (v, v.lower) :: !log); + v.lower <- C.join obj v.lower a + + (** Arguments are not checked and used directly. They must satisfy the + INVARIANT listed above. *) + let update_upper (type a) ~log (obj : a C.obj) v a = + (match log with + | None -> () + | Some log -> log := Cupper (v, v.upper) :: !log); + v.upper <- C.meet obj v.upper a + + (** Arguments are not checked and used directly. They must satisfy the + INVARIANT listed above. *) + let set_vlower ~log v vlower = + (match log with + | None -> () + | Some log -> log := Cvlower (v, v.vlower) :: !log); + v.vlower <- vlower + + let submode_cv : type a. log:_ -> a C.obj -> a -> a var -> (unit, a) Result.t + = + fun (type a) ~log (obj : a C.obj) a' v -> + if C.le obj a' v.lower + then Ok () + else if not (C.le obj a' v.upper) + then Error v.upper + else ( + update_lower ~log obj v a'; + if C.le obj v.upper v.lower then set_vlower ~log v []; + Ok ()) + + let submode_cmv : + type a l. + log:_ -> a C.obj -> a -> (a, l * allowed) morphvar -> (unit, a) Result.t = + fun ~log obj a (Amorphvar (v, f) as mv) -> + let mlower = mlower obj mv in + let mupper = mupper obj mv in + if C.le obj a mlower + then Ok () + else if not (C.le obj a mupper) + then Error mupper + else + (* At this point we know [a <= f v], therefore [a] is in the downward + closure of [f]'s image. Therefore, asking [a <= f v] is equivalent to + asking [f' a <= v]. *) + let f' = C.left_adjoint obj f in + let src = C.src obj f in + let a' = C.apply src f' a in + assert (Result.is_ok (submode_cv ~log src a' v)); + Ok () + + (** Returns [Ok ()] if success; [Error x] if failed, and [x] is the next best + (read: strictly higher) guess to replace the constant argument that MIGHT + succeed. *) + let rec submode_vc : + type a. log:_ -> a C.obj -> a var -> a -> (unit, a) Result.t = + fun (type a) ~log (obj : a C.obj) v a' -> + if C.le obj v.upper a' + then Ok () + else if not (C.le obj v.lower a') + then Error v.lower + else ( + update_upper ~log obj v a'; + let r = + v.vlower + |> find_error (fun mu -> + let r = submode_mvc ~log obj mu a' in + (if Result.is_ok r + then + (* Optimization: update [v.lower] based on [mlower u].*) + let mu_lower = mlower obj mu in + if not (C.le obj mu_lower v.lower) + then update_lower ~log obj v mu_lower); + r) + in + if C.le obj v.upper v.lower then set_vlower ~log v []; + r) + + and submode_mvc : + 'a 'r. + log:change list ref option -> + 'a C.obj -> + ('a, allowed * 'r) morphvar -> + 'a -> + (unit, 'a) Result.t = + fun ~log obj (Amorphvar (v, f) as mv) a -> + (* See [submode_cmv] for why we need the following seemingly redundant + lines. *) + let mupper = mupper obj mv in + let mlower = mlower obj mv in + if C.le obj mupper a + then Ok () + else if not (C.le obj mlower a) + then Error mlower + else + let f' = C.right_adjoint obj f in + let src = C.src obj f in + let a' = C.apply src f' a in + (* If [mlower] was precise, then the check + [not (C.le obj (mlower obj mv) a)] should guarantee the following call + to return [Ok ()]. However, [mlower] is not precise *) + (* not using [Result.map_error] to avoid allocating closure *) + match submode_vc ~log src v a' with + | Ok () -> Ok () + | Error e -> Error (C.apply obj f e) + + (** Zap [mv] to its lower bound. Returns the [log] of the zapping, in + case the caller are only interested in the lower bound and wants to + reverse the zapping. + + As mentioned in [var], [mlower mv] is not precise; to get the precise + lower bound of [mv], we call [submode mv (mlower mv)]. This will propagate + to all its children, which might fail because some children's lower bound + [a] is more up-to-date than [mv]. In that case, we call [submode mv a]. We + repeat this process until no failure, and we will get the precise lower + bound. + + The loop is guaranteed to terminate, because for each iteration our + guessed lower bound is strictly higher; and all lattices are finite. + *) + let zap_to_floor_morphvar_aux (type a r) (obj : a C.obj) + (mv : (a, allowed * r) morphvar) = + let rec loop lower = + let log = ref empty_changes in + let r = submode_mvc ~log:(Some log) obj mv lower in + match r with + | Ok () -> !log, lower + | Error a -> + undo_changes !log; + loop (C.join obj a lower) + in + loop (mlower obj mv) + + let eq_morphvar : + type a l0 r0 l1 r1. (a, l0 * r0) morphvar -> (a, l1 * r1) morphvar -> bool + = + fun (Amorphvar (v0, f0) as mv0) (Amorphvar (v1, f1) as mv1) -> + (* To align l0/l1, r0/r1; The existing disallow_left/right] is for [mode], + not [morphvar]. *) + Morphvar.( + disallow_left (disallow_right mv0) == disallow_left (disallow_right mv1)) + || match C.eq_morph f0 f1 with None -> false | Some Refl -> v0 == v1 + + let exists mu mvs = List.exists (fun mv -> eq_morphvar mv mu) mvs + + let submode_mvmv (type a) ~log (dst : a C.obj) (Amorphvar (v, f) as mv) + (Amorphvar (u, g) as mu) = + if C.le dst (mupper dst mv) (mlower dst mu) + then Ok () + else if eq_morphvar mv mu + then Ok () + else + (* The call f v <= g u translates to three steps: + 1. f v <= g u.upper + 2. f v.lower <= g u + 3. adding g' (f v) to the u.vlower, where g' is the left adjoint of g. + *) + match submode_mvc ~log dst mv (mupper dst mu) with + | Error a -> Error (a, mupper dst mu) + | Ok () -> ( + match submode_cmv ~log dst (mlower dst mv) mu with + | Error a -> Error (mlower dst mv, a) + | Ok () -> + (* At this point, we know that [f v <= g u.upper], which means [f v] + lies within the downward closure of [g]'s image. Therefore, asking [f + v <= g u] is equivalent to asking [g' f v <= u] *) + let g' = C.left_adjoint dst g in + let src = C.src dst g in + let g'f = C.compose src g' (C.disallow_right f) in + let x = Amorphvar (v, g'f) in + if not (exists x u.vlower) then set_vlower ~log u (x :: u.vlower); + Ok ()) + + let cnt_id = ref 0 + + let fresh ?upper ?lower ?vlower obj = + let id = !cnt_id in + cnt_id := id + 1; + let upper = Option.value upper ~default:(C.max obj) in + let lower = Option.value lower ~default:(C.min obj) in + let vlower = Option.value vlower ~default:[] in + { upper; lower; vlower; id } + + let submode (type a r l) (obj : a C.obj) (a : (a, allowed * r) mode) + (b : (a, l * allowed) mode) ~log = + let submode_cc ~log:_ obj left right = + if C.le obj left right then Ok () else Error { left; right } + in + let submode_mvc ~log obj v right = + Result.map_error + (fun left -> { left; right }) + (submode_mvc ~log obj v right) + in + let submode_cmv ~log obj left v = + Result.map_error + (fun right -> { left; right }) + (submode_cmv ~log obj left v) + in + let submode_mvmv ~log obj v u = + Result.map_error + (fun (left, right) -> { left; right }) + (submode_mvmv ~log obj v u) + in + match a, b with + | Amode left, Amode right -> submode_cc ~log obj left right + | Amodevar v, Amode right -> submode_mvc ~log obj v right + | Amode left, Amodevar v -> submode_cmv ~log obj left v + | Amodevar v, Amodevar u -> submode_mvmv ~log obj v u + | Amode a, Amodemeet (b, mvs) -> + Result.bind (submode_cc ~log obj a b) (fun () -> + find_error (fun mv -> submode_cmv ~log obj a mv) mvs) + | Amodevar mv, Amodemeet (b, mvs) -> + Result.bind (submode_mvc ~log obj mv b) (fun () -> + find_error (fun mv' -> submode_mvmv ~log obj mv mv') mvs) + | Amodejoin (a, mvs), Amode b -> + Result.bind (submode_cc ~log obj a b) (fun () -> + find_error (fun mv' -> submode_mvc ~log obj mv' b) mvs) + | Amodejoin (a, mvs), Amodevar mv -> + Result.bind (submode_cmv ~log obj a mv) (fun () -> + find_error (fun mv' -> submode_mvmv ~log obj mv' mv) mvs) + | Amodejoin (a, mvs), Amodemeet (b, mus) -> + (* TODO: mabye create a intermediate variable? *) + Result.bind (submode_cc ~log obj a b) (fun () -> + Result.bind + (find_error (fun mv -> submode_mvc ~log obj mv b) mvs) + (fun () -> + Result.bind + (find_error (fun mu -> submode_cmv ~log obj a mu) mus) + (fun () -> + find_error + (fun mu -> + find_error (fun mv -> submode_mvmv ~log obj mv mu) mvs) + mus))) + + let zap_to_ceil_morphvar obj mv ~log = + assert (submode_cmv obj (mupper obj mv) mv ~log |> Result.is_ok); + mupper obj mv + + let zap_to_ceil : type a l. a C.obj -> (a, l * allowed) mode -> log:_ -> a = + fun obj m ~log -> + match m with + | Amode m -> m + | Amodevar mv -> zap_to_ceil_morphvar obj mv ~log + | Amodemeet (a, mvs) -> + List.fold_left + (fun acc mv -> C.meet obj acc (zap_to_ceil_morphvar obj mv ~log)) + a mvs + + let cons_dedup x xs = if exists x xs then xs else x :: xs + + (* Similar to [List.rev_append] but dedup the result (assuming both inputs are + deduped) *) + let rev_append_dedup l0 l1 = + let rec loop rest acc = + match rest with [] -> acc | x :: xs -> loop xs (cons_dedup x acc) + in + loop l0 l1 + + let join (type a r) obj l = + let rec loop : + a -> + (a, allowed * disallowed) morphvar list -> + (a, allowed * r) mode list -> + (a, allowed * disallowed) mode = + fun a mvs rest -> + if C.le obj (C.max obj) a + then Amode (C.max obj) + else + match rest with + | [] -> Amodejoin (a, mvs) + | mv :: xs -> ( + match disallow_right mv with + | Amode b -> loop (C.join obj a b) mvs xs + (* some minor optimization: if [a] is lower than [mlower mv], we + should keep the latter instead. This helps to fail early in + [submode] *) + | Amodevar mv -> + loop (C.join obj a (mlower obj mv)) (cons_dedup mv mvs) xs + | Amodejoin (b, mvs') -> + loop (C.join obj a b) (rev_append_dedup mvs' mvs) xs) + in + loop (C.min obj) [] l + + let meet (type a l) obj l = + let rec loop : + a -> + (a, disallowed * allowed) morphvar list -> + (a, l * allowed) mode list -> + (a, disallowed * allowed) mode = + fun a mvs rest -> + if C.le obj a (C.min obj) + then Amode (C.min obj) + else + match rest with + | [] -> Amodemeet (a, mvs) + | mv :: xs -> ( + match disallow_left mv with + | Amode b -> loop (C.meet obj a b) mvs xs + (* some minor optimization: if [a] is higher than [mupper mv], we + should keep the latter instead. This helps to fail early in + [submode_log] *) + | Amodevar mv -> + loop (C.meet obj a (mupper obj mv)) (cons_dedup mv mvs) xs + | Amodemeet (b, mvs') -> + loop (C.meet obj a b) (rev_append_dedup mvs' mvs) xs) + in + loop (C.max obj) [] l + + (** Zaps a morphvar to its floor and returns the floor. [commit] could be + [Some log], in which case the zapping is appended to [log]; it could also + be [None], in which case the zapping is reverted. The latter is useful + when the caller only wants to know the floor without zapping. *) + let zap_to_floor_morphvar obj mv ~commit = + let log_, lower = zap_to_floor_morphvar_aux obj mv in + (match commit with + | None -> undo_changes log_ + | Some log -> log := append_changes !log log_); + lower + + let zap_to_floor : type a r. a C.obj -> (a, allowed * r) mode -> log:_ -> a = + fun obj m ~log -> + match m with + | Amode a -> a + | Amodevar mv -> zap_to_floor_morphvar obj mv ~commit:log + | Amodejoin (a, mvs) -> + List.fold_left + (fun acc mv -> + C.join obj acc (zap_to_floor_morphvar obj mv ~commit:log)) + a mvs + + let get_conservative_ceil : type a l r. a C.obj -> (a, l * r) mode -> a = + fun obj m -> + match m with + | Amode a -> a + | Amodevar mv -> mupper obj mv + | Amodemeet (a, mvs) -> + List.fold_left (fun acc mv -> C.meet obj acc (mupper obj mv)) a mvs + | Amodejoin (a, mvs) -> + List.fold_left (fun acc mv -> C.join obj acc (mupper obj mv)) a mvs + + let get_conservative_floor : type a l r. a C.obj -> (a, l * r) mode -> a = + fun obj m -> + match m with + | Amode a -> a + | Amodevar mv -> mlower obj mv + | Amodejoin (a, mvs) -> + List.fold_left (fun acc mv -> C.join obj acc (mupper obj mv)) a mvs + | Amodemeet (a, mvs) -> + List.fold_left (fun acc mv -> C.meet obj acc (mlower obj mv)) a mvs + + (* Due to our biased implementation, the ceil is precise. *) + let get_ceil = get_conservative_ceil + + let get_floor : type a r. a C.obj -> (a, allowed * r) mode -> a = + fun obj m -> + match m with + | Amode a -> a + | Amodevar mv -> zap_to_floor_morphvar obj mv ~commit:None + | Amodejoin (a, mvs) -> + List.fold_left + (fun acc mv -> + C.join obj acc (zap_to_floor_morphvar obj mv ~commit:None)) + a mvs + + let print : + type a l r. + ?verbose:bool -> a C.obj -> Format.formatter -> (a, l * r) mode -> unit = + fun ?verbose (obj : a C.obj) ppf m -> + let ceil = get_conservative_ceil obj m in + let floor = get_conservative_floor obj m in + if C.le obj ceil floor + then C.print obj ppf ceil + else print_raw ?verbose obj ppf m + + let newvar obj = Amodevar (Amorphvar (fresh obj, C.id)) + + let newvar_above (type a r) (obj : a C.obj) (m : (a, allowed * r) mode) = + match disallow_right m with + | Amode a -> + if C.le obj (C.max obj) a + then Amode a, false + else Amodevar (Amorphvar (fresh ~lower:a obj, C.id)), true + | Amodevar mv -> + (* [~lower] is not precise (because [mlower mv] is not precise), but + it doesn't need to be *) + ( Amodevar + (Amorphvar (fresh ~lower:(mlower obj mv) ~vlower:[mv] obj, C.id)), + true ) + | Amodejoin (a, mvs) -> + (* [~lower] is not precise here, but it doesn't need to be *) + Amodevar (Amorphvar (fresh ~lower:a ~vlower:mvs obj, C.id)), true + + let newvar_below (type a l) (obj : a C.obj) (m : (a, l * allowed) mode) = + match disallow_left m with + | Amode a -> + if C.le obj a (C.min obj) + then Amode a, false + else Amodevar (Amorphvar (fresh ~upper:a obj, C.id)), true + | Amodevar mv -> + let u = fresh obj in + let mu = Amorphvar (u, C.id) in + assert (Result.is_ok (submode_mvmv obj ~log:None mu mv)); + allow_left (Amodevar mu), true + | Amodemeet (a, mvs) -> + let u = fresh obj in + let mu = Amorphvar (u, C.id) in + assert (Result.is_ok (submode_mvc obj ~log:None mu a)); + List.iter + (fun mv -> assert (Result.is_ok (submode_mvmv obj ~log:None mu mv))) + mvs; + allow_left (Amodevar mu), true +end +[@@inline always] + +module Solvers_polarized (C : Lattices_mono) = struct + module S = Solver_mono (C) + + type changes = S.changes + + let empty_changes = S.empty_changes + + let undo_changes = S.undo_changes + + module type Solver_polarized = + Solver_polarized + with type ('a, 'b, 'd) morph := ('a, 'b, 'd) C.morph + and type 'a obj := 'a C.obj + and type 'a error := 'a error + and type changes := changes + + module rec Positive : + (Solver_polarized + with type 'd polarized = 'd pos + and type ('a, 'd) mode_op = ('a, 'd) Negative.mode) = struct + type 'd polarized = 'd pos + + type ('a, 'd) mode_op = ('a, 'd) Negative.mode + + type ('a, 'd) mode = ('a, 'd) S.mode constraint 'd = 'l * 'r + + include Magic_allow_disallow (S) + + let newvar = S.newvar + + let submode = S.submode + + let join = S.join + + let meet = S.meet + + let of_const _ = S.of_const + + let min = S.min + + let max = S.max + + let zap_to_floor = S.zap_to_floor + + let zap_to_ceil = S.zap_to_ceil + + let newvar_above = S.newvar_above + + let newvar_below = S.newvar_below + + let get_ceil = S.get_ceil + + let get_floor = S.get_floor + + let get_conservative_ceil = S.get_conservative_ceil + + let get_conservative_floor = S.get_conservative_floor + + let print ?(verbose = false) = S.print ~verbose + + let via_monotone = S.apply + + let via_antitone = S.apply + end + + and Negative : + (Solver_polarized + with type 'd polarized = 'd neg + and type ('a, 'd) mode_op = ('a, 'd) Positive.mode) = struct + type 'd polarized = 'd neg + + type ('a, 'd) mode_op = ('a, 'd) Positive.mode + + type ('a, 'd) mode = ('a, 'r * 'l) S.mode constraint 'd = 'l * 'r + + include Magic_allow_disallow (struct + type ('a, _, 'd) sided = ('a, 'd) mode + + let disallow_right = S.disallow_left + + let disallow_left = S.disallow_right + + let allow_right = S.allow_left + + let allow_left = S.allow_right + end) + + let newvar = S.newvar + + let submode obj m0 m1 ~log = + Result.map_error + (fun { left; right } -> { left = right; right = left }) + (S.submode obj m1 m0 ~log) + + let join = S.meet + + let meet = S.join + + let of_const _ = S.of_const + + let min = S.max + + let max = S.min + + let zap_to_floor = S.zap_to_ceil + + let zap_to_ceil = S.zap_to_floor + + let newvar_above = S.newvar_below + + let newvar_below = S.newvar_above + + let get_ceil = S.get_floor + + let get_floor = S.get_ceil + + let get_conservative_ceil = S.get_conservative_floor + + let get_conservative_floor = S.get_conservative_ceil + + let print ?(verbose = false) = S.print ~verbose + + let via_monotone = S.apply + + let via_antitone = S.apply + end + + (* Definitions to show that this solver works over a category. *) + module Category = struct + type 'a obj = 'a C.obj + + type ('a, 'b, 'd) morph = ('a, 'b, 'd) C.morph + + type ('a, 'd) mode = + | Positive of ('a, 'd pos) Positive.mode + | Negative of ('a, 'd neg) Negative.mode + + let apply_into_positive : + type a b l r. + b obj -> + (a, b, l * r) morph -> + (a, l * r) mode -> + (b, l * r) Positive.mode = + fun obj morph -> function + | Positive mode -> Positive.via_monotone obj morph mode + | Negative mode -> Positive.via_antitone obj morph mode + + let apply_into_negative : + type a b l r. + b obj -> + (a, b, l * r) morph -> + (a, l * r) mode -> + (b, r * l) Negative.mode = + fun obj morph -> function + | Positive mode -> Negative.via_antitone obj morph mode + | Negative mode -> Negative.via_monotone obj morph mode + end +end +[@@inline always] diff --git a/typing/solver.mli b/typing/solver.mli new file mode 100644 index 00000000000..6829fc03eeb --- /dev/null +++ b/typing/solver.mli @@ -0,0 +1 @@ +include Solver_intf.S diff --git a/typing/solver_intf.mli b/typing/solver_intf.mli new file mode 100644 index 00000000000..0f2d30ca029 --- /dev/null +++ b/typing/solver_intf.mli @@ -0,0 +1,408 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Stephen Dolan, Jane Street, London *) +(* Zesen Qian, Jane Street, London *) +(* *) +(* Copyright 2024 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +type allowed = private Allowed + +type disallowed = private Disallowed + +type left_only = allowed * disallowed + +type right_only = disallowed * allowed + +type both = allowed * allowed + +module type Allow_disallow = sig + type ('a, 'b, 'd) sided constraint 'd = 'l * 'r + + (** Disallows on the right. *) + val disallow_right : + ('a, 'b, 'l * 'r) sided -> ('a, 'b, 'l * disallowed) sided + + (** Disallows a the left. *) + val disallow_left : ('a, 'b, 'l * 'r) sided -> ('a, 'b, disallowed * 'r) sided + + (** Generalizes a right-hand-side [allowed] to be any allowance. *) + val allow_right : ('a, 'b, 'l * allowed) sided -> ('a, 'b, 'l * 'r) sided + + (** Generalizes a left-hand-side [allowed] to be any allowance. *) + val allow_left : ('a, 'b, allowed * 'r) sided -> ('a, 'b, 'l * 'r) sided +end + +module type Equal = sig + type ('a, 'b, 'd) t constraint 'd = 'l * 'r + + val equal : + ('a0, 'b, 'l0 * 'r0) t -> + ('a1, 'b, 'l1 * 'r1) t -> + ('a0, 'a1) Misc.eq option +end + +(** A collection of lattices, indexed by [obj]; *) +module type Lattices = sig + (** Lattice identifers, indexed by ['a] the carrier type of that lattice *) + type 'a obj + + val min : 'a obj -> 'a + + val max : 'a obj -> 'a + + val le : 'a obj -> 'a -> 'a -> bool + + val join : 'a obj -> 'a -> 'a -> 'a + + val meet : 'a obj -> 'a -> 'a -> 'a + + val print : 'a obj -> Format.formatter -> 'a -> unit + + val eq_obj : 'a obj -> 'b obj -> ('a, 'b) Misc.eq option + + val print_obj : Format.formatter -> 'a obj -> unit +end + +(** Extend [Lattices] with monotone functions (including identity) to form a + category. Among those monotone functions some will have left and right + adjoints. *) +module type Lattices_mono = sig + include Lattices + + (** Morphism from object of base type ['a] to object of base type ['b]. + ['d] is ['l] * ['r], where ['l] can be: + - [allowed], meaning the morphism can be on the left because it has right + adjoint. + - [disallowed], meaning the morphism cannot be on the left because + it does not have right adjoint. + Similar for ['r]. *) + type ('a, 'b, 'd) morph + + (* Due to the implementation in [solver.ml], a mode doesn't have sufficient + information to infer the object it lives in, whether at compile-time or + runtime. There is info at compile-time to distinguish between different + carrier types, but one can imagine multiple objects with the same carrier + type. Therefore, we can treat modes as object-blind. + + As a result, user of the solver needs to provide the object the modes live + in, every time it invokes the solver on some modes. + + Roughly, ['a mode] is represented in the solver as constant of ['a], or [f + v] where [f] is a morphism from ['b] to ['a] and [v] is some variable of + ['b]. The ['a] needs additional ['a obj] to decide its position in the + lattice structure (because again, multiple lattices can share the same + carrier type). One might think the morphism [f] should know its own source + and target objects. But since its target object is already given by the + user for each invocation anyway, we decide to exploit this, and say that "a + morphism is determined by some [('a, 'b, 'd) morph] together with some ['b + obj]". That helps reduce the information each [morph] needs to store. + + As a result, in the interaction between the solver and the lattices, + [morph] always comes with its target object. *) + + (** Give the source object of a morphism *) + val src : 'b obj -> ('a, 'b, 'd) morph -> 'a obj + + (** Give the identity morphism on an object *) + val id : ('a, 'a, 'd) morph + + (** Compose two morphisms *) + val compose : + 'c obj -> ('b, 'c, 'd) morph -> ('a, 'b, 'd) morph -> ('a, 'c, 'd) morph + + (* Usual notion of adjunction: + Given two morphisms [f : A -> B] and [g : B -> A], we require [f a <= b] + iff [a <= g b] for each [a \in A] and [b \in B]. + + Our solver accepts a wider notion of adjunction: Given two morphisms [f : A + -> B] and [g : B -> A], we require [f a <= b] iff [a <= g b] for each [a] + in the downward closure of [g]'s image and [b \in B]. + + We say [f] is a partial left adjoint of [g], because [f] is only + constrained in part of its domain. As a result, [f] is not unique, since + its valuation out of the constrained range can be arbitrarily chosen. + + Dually, we can define the concept of partial right adjoint. Since partial + adjoints are not unique, they don't form a pair: i.e., a partial left + joint of a partial right adjoint of [f] is not [f] in general. + + Concretely, the solver provides/requires the following guarantees + (continuing the example above): + + For the user of the [Solvers_polarized]. + - [g] applied to a right mode [m] can be used as a right mode without + any restriction. + - [f] applied to to a left mode [m] can be used as a left mode, given that + the [m] is fully within the downward closure of [g]. This is unfortunately + not enforcable by the ocaml type system, and we have to rely on user's + caution. + + For the supplier of the [Lattices_mono]: + - The result of [left_adjoint g] is applied only on the downward closure of + [g]'s image. + *) + + (* Note that [left_adjoint] and [right_adjoint] returns a [morph] weaker than + what we want, which is "\exists r. allowed * r". But ocaml doesn't like + existentials, and this weaker version is good enough for us *) + + (** Give left adjoint of a morphism *) + val left_adjoint : + 'b obj -> ('a, 'b, 'l * allowed) morph -> ('b, 'a, left_only) morph + + (** Give the right adjoint of a morphism *) + val right_adjoint : + 'b obj -> ('a, 'b, allowed * 'r) morph -> ('b, 'a, right_only) morph + + include Allow_disallow with type ('a, 'b, 'd) sided = ('a, 'b, 'd) morph + + (** Apply morphism on constant *) + val apply : 'b obj -> ('a, 'b, 'd) morph -> 'a -> 'b + + (** Checks if two morphisms are equal. If so, returns [Some Refl]. + Used for deduplication only; it is fine (but not recommended) to return + [None] for equal morphisms. + + While a [morph] must be acompanied by a destination [obj] to uniquely + identify a morphism, two [morph] sharing the same destination can be + compared on their own. *) + val eq_morph : + ('a0, 'b, 'l0 * 'r0) morph -> + ('a1, 'b, 'l1 * 'r1) morph -> + ('a0, 'a1) Misc.eq option + + (** Print morphism *) + val print_morph : 'b obj -> Format.formatter -> ('a, 'b, 'd) morph -> unit +end + +(** Arrange the permissions appropriately for a positive lattice, by + doing nothing. *) +type 'a pos = 'b * 'c constraint 'a = 'b * 'c + +(** Arrange the permissions appropriately for a negative lattice, by + swapping left and right. *) +type 'a neg = 'c * 'b constraint 'a = 'b * 'c + +module type Solver_polarized = sig + (* These first few types will be replaced with types from + the Lattices_mono *) + + (** The morphism type from the [Lattices_mono] we're working with *) + type ('a, 'b, 'd) morph + + (** The object type from the [Lattices_mono] we're working with *) + type 'a obj + + type 'a error + + (** For a negative lattice, we reverse the direction of adjoints. We thus use + [neg] for [polarized] for negative lattices, which reverses ['l * 'r] to + ['r * 'l]. (Use [pos] for positive lattices.) *) + type 'd polarized constraint 'd = 'l * 'r + + type changes + + (** A mode with carrier type ['a] and left/right status ['d] derived from the + morphism it contains. See comments for [morph] for the format of ['d]. + + A [mode] that is [allowed] on the left means it can appear as the lower + mode in a [submode] call. This is useful for a mode that is inferred of an + expression. On the other hand, a [mode] that is [allowed] on the right + means it can appear as the upper mode in a [submode] call. This is useful + for a mode that is *expected* as the mode of an expression. *) + type ('a, 'd) mode constraint 'd = 'l * 'r + + (** The mode type for the opposite polarity. *) + type ('a, 'd) mode_op constraint 'd = 'l * 'r + + include Allow_disallow with type ('a, _, 'd) sided = ('a, 'd) mode + + (** Returns the mode representing the given constant. *) + val of_const : 'a obj -> 'a -> ('a, 'l * 'r) mode + + (** The minimum mode in the lattice *) + val min : 'a obj -> ('a, 'l * 'r) mode + + (** The maximum mode in the lattice *) + val max : 'a obj -> ('a, 'l * 'r) mode + + (** Pushes the mode variable to the lowest constant possible. + Expensive. + WARNING: the lattice must be finite for this to terminate.*) + val zap_to_floor : + 'a obj -> ('a, allowed * 'r) mode -> log:changes ref option -> 'a + + (** Pushes the mode variable to the highest constant possible. *) + val zap_to_ceil : + 'a obj -> ('a, 'l * allowed) mode -> log:changes ref option -> 'a + + (** Create a new mode variable of the full range. *) + val newvar : 'a obj -> ('a, 'l * 'r) mode + + (** Try to constrain the first mode below the second mode. *) + val submode : + 'a obj -> + ('a, allowed * 'r) mode -> + ('a, 'l * allowed) mode -> + log:changes ref option -> + (unit, 'a error) result + + (** Creates a new mode variable above the given mode and returns [true]. In + the speical case where the given mode is top, returns the constant top + and [false]. *) + val newvar_above : + 'a obj -> ('a, allowed * 'r_) mode -> ('a, 'l * 'r) mode * bool + + (** Creates a new mode variable below the given mode and returns [true]. In + the speical case where the given mode is bottom, returns the constant + bottom and [false]. *) + val newvar_below : + 'a obj -> ('a, 'l_ * allowed) mode -> ('a, 'l * 'r) mode * bool + + (** Returns the join of the list of modes. *) + val join : 'a obj -> ('a, allowed * 'r) mode list -> ('a, left_only) mode + + (** Return the meet of the list of modes. *) + val meet : 'a obj -> ('a, 'l * allowed) mode list -> ('a, right_only) mode + + (** Returns the lower bound of the mode. Because of our conservative internal + representation, further constraining is needed for precise bound. + This operation is therefore expensive and requires the mode to be allowed + on the left. + WARNING: the lattice must be finite for this to terminate. *) + val get_floor : 'a obj -> ('a, allowed * 'r) mode -> 'a + + (** Returns the upper bound of the mode. Notes for [get_floor] applies. *) + val get_ceil : 'a obj -> ('a, 'l * allowed) mode -> 'a + + (** Similar to [get_floor] but does not run the further constraining needed + for a precise bound. As a result, the returned bound is conservative; + i.e., it might be lower than the real floor. *) + val get_conservative_floor : 'a obj -> ('a, 'l * 'r) mode -> 'a + + (** Similar to [get_ceil] but does not run the further constraining needed + for a precise bound. As a result, the returned bound is conservative; + i.e., it might be higher than the real ceil. *) + val get_conservative_ceil : 'a obj -> ('a, 'l * 'r) mode -> 'a + + (** Printing a mode for debugging. *) + val print : + ?verbose:bool -> 'a obj -> Format.formatter -> ('a, 'l * 'r) mode -> unit + + (** Apply a monotone morphism whose source and target modes are of the + polarity of this enclosing module. That is, [Positive.apply_monotone] + takes a positive mode to a positive mode. *) + val via_monotone : + 'b obj -> + ('a, 'b, ('l * 'r) polarized) morph -> + ('a, 'l * 'r) mode -> + ('b, 'l * 'r) mode + + (** Apply an antitone morphism whose target mode is the mode defined in + this module and whose source mode is the dual mode. That is, + [Positive.apply_antitone] takes a negative mode to a positive one. *) + val via_antitone : + 'b obj -> + ('a, 'b, ('l * 'r) polarized) morph -> + ('a, 'r * 'l) mode_op -> + ('b, 'l * 'r) mode +end + +module type S = sig + (** Error returned by failed [submode a b]. [left] will be the lowest mode [a] + can be, and [right] will be the highest mode [b] can be. And [left <= right] + will be false, which is why the submode failed. *) + type 'a error = + { left : 'a; + right : 'a + } + + (** Takes a slow but type-correct [Allow_disallow] module and returns the + magic version, which is faster. + NOTE: for this to be sound, the functions in the original module must be + identity functions (up to runtime representation). *) + module Magic_allow_disallow (X : Allow_disallow) : + Allow_disallow with type ('a, 'b, 'd) sided = ('a, 'b, 'd) X.sided + + (** Takes a slow but type-correct [Equal] module and returns the + magic version, which is faster. + NOTE: for this to be sound, the function in the original module must be + just %equal (up to runtime representation). *) + module Magic_equal (X : Equal) : + Equal with type ('a, 'b, 'c) t = ('a, 'b, 'c) X.t + + (** Solver that supports polarized lattices; needed because some morphisms + are antitone *) + module Solvers_polarized (C : Lattices_mono) : sig + (* Backtracking facilities used by [types.ml] *) + + (** Represents a sequence of state mutations caused by mode operations. All + mutating operations in this module take a [log:changes ref option] and + append to it all changes made, regardless of success or failure. It is + [option] only for performance reasons; the caller should never provide + [log:None]. The caller is responsible for taking care of the appended log: + they can either revert the changes using [undo_changes], or commit the + changes to the global log in [types.ml]. *) + type changes + + (** An empty sequence of changes. *) + val empty_changes : changes + + (** Undo the sequence of changes recorded. *) + val undo_changes : changes -> unit + + (* Construct a new category based on the original category [C]. Objects are + two copies of the objects in [C] of opposite polarity. The positive copy + is identical to the original lattice. The negative copy has its lattice + structure reversed. Morphism are four copies of the morphisms in [C], from + two copies of objects to two copies of objects. *) + + module type Solver_polarized = + Solver_polarized + with type ('a, 'b, 'd) morph := ('a, 'b, 'd) C.morph + and type 'a obj := 'a C.obj + and type 'a error := 'a error + and type changes := changes + + module rec Positive : + (Solver_polarized + with type 'd polarized = 'd pos + and type ('a, 'd) mode_op = ('a, 'd) Negative.mode) + + and Negative : + (Solver_polarized + with type 'd polarized = 'd neg + and type ('a, 'd) mode_op = ('a, 'd) Positive.mode) + + (* The following definitions show how this solver works over a category by + defining objects and morphisms. These definitions are not used in + practice. They are put into a module to make it easy to spot if we end up + using these in the future. *) + module Category : sig + type 'a obj = 'a C.obj + + type ('a, 'b, 'd) morph = ('a, 'b, 'd) C.morph + + type ('a, 'd) mode = + | Positive of ('a, 'd pos) Positive.mode + | Negative of ('a, 'd neg) Negative.mode + + val apply_into_positive : + 'b obj -> ('a, 'b, 'd) morph -> ('a, 'd) mode -> ('b, 'd) Positive.mode + + val apply_into_negative : + 'b obj -> + ('a, 'b, 'l * 'r) morph -> + ('a, 'l * 'r) mode -> + ('b, 'r * 'l) Negative.mode + end + end +end diff --git a/typing/subst.ml b/typing/subst.ml index a346bc587e0..8f5c9d5bc2a 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -79,7 +79,14 @@ type additional_action_config = | Duplicate_variables | Prepare_for_saving -let with_additional_action (config : additional_action_config) s = +let with_additional_action = + (* Memoize the built-in jkinds *) + let builtins = + Jkind.Const.Primitive.all + |> List.map (fun (builtin : Jkind.Const.Primitive.t) -> + builtin.jkind, Jkind.of_const builtin.jkind ~why:Jkind.History.Imported) + in + fun (config : additional_action_config) s -> (* CR layouts: it would be better to put all this stuff outside this function, but it's in here because we really want to tailor the reason to describe the module a symbol is imported from. But RAE's initial @@ -94,21 +101,16 @@ let with_additional_action (config : additional_action_config) s = match config with | Duplicate_variables -> Duplicate_variables | Prepare_for_saving -> - let reason = Jkind.Imported in - let any = Jkind.of_const Any ~why:reason in - let void = Jkind.of_const Void ~why:reason in - let value = Jkind.of_const Value ~why:reason in - let immediate = Jkind.of_const Immediate ~why:reason in - let immediate64 = Jkind.of_const Immediate64 ~why:reason in - let float64 = Jkind.of_const Float64 ~why:reason in - let prepare_jkind loc lay = - match Jkind.get lay with - | Const Any -> any - | Const Void -> void - | Const Value -> value - | Const Immediate -> immediate - | Const Immediate64 -> immediate64 - | Const Float64 -> float64 + let prepare_jkind loc jkind = + match Jkind.get jkind with + | Const const -> + let builtin = + List.find_opt (fun (builtin, _) -> Jkind.Const.equal const builtin) builtins + in + begin match builtin with + | Some (__, jkind) -> jkind + | None -> Jkind.of_const const ~why:Jkind.History.Imported + end | Var _ -> raise(Error (loc, Unconstrained_jkind_variable)) in Prepare_for_saving prepare_jkind @@ -286,7 +288,7 @@ let rec typexp copy_scope s ty = let has_fixed_row = not (is_Tconstr ty) && is_constr_row ~allow_ident:false tm in (* Make a stub *) - let jkind = Jkind.any ~why:Dummy_jkind in + let jkind = Jkind.Primitive.any ~why:Dummy_jkind in let ty' = if should_duplicate_vars then newpersty (Tvar {name = None; jkind}) else newgenstub ~scope:(get_scope ty) jkind @@ -394,7 +396,7 @@ let label_declaration copy_scope s l = { ld_id = l.ld_id; ld_mutable = l.ld_mutable; - ld_global = l.ld_global; + ld_modalities = l.ld_modalities; ld_jkind = apply_prepare_jkind s l.ld_jkind l.ld_loc; ld_type = typexp copy_scope s l.ld_loc l.ld_type; ld_loc = loc s l.ld_loc; @@ -402,16 +404,23 @@ let label_declaration copy_scope s l = ld_uid = l.ld_uid; } -let constructor_arguments copy_scope s loc = function +let constructor_argument copy_scope s ca = + { + ca_type = typexp copy_scope s ca.ca_loc ca.ca_type; + ca_loc = loc s ca.ca_loc; + ca_modalities = ca.ca_modalities; + } + +let constructor_arguments copy_scope s = function | Cstr_tuple l -> - Cstr_tuple (List.map (fun (ty, gf) -> (typexp copy_scope s loc ty, gf)) l) + Cstr_tuple (List.map (constructor_argument copy_scope s) l) | Cstr_record l -> Cstr_record (List.map (label_declaration copy_scope s) l) let constructor_declaration copy_scope s c = { cd_id = c.cd_id; - cd_args = constructor_arguments copy_scope s c.cd_loc c.cd_args; + cd_args = constructor_arguments copy_scope s c.cd_args; cd_res = Option.map (typexp copy_scope s c.cd_loc) c.cd_res; cd_loc = loc s c.cd_loc; cd_attributes = attrs s c.cd_attributes; @@ -427,20 +436,23 @@ let constructor_tag ~prepare_jkind loc = function (* called only when additional_action is [Prepare_for_saving] *) let variant_representation ~prepare_jkind loc = function | Variant_unboxed -> Variant_unboxed - | Variant_boxed layss -> - Variant_boxed (Array.map (Array.map (prepare_jkind loc)) layss) + | Variant_boxed cstrs_and_jkinds -> + Variant_boxed + (Array.map + (fun (cstr, jkinds) -> cstr, Array.map (prepare_jkind loc) jkinds) + cstrs_and_jkinds) | Variant_extensible -> Variant_extensible (* called only when additional_action is [Prepare_for_saving] *) let record_representation ~prepare_jkind loc = function | Record_unboxed -> Record_unboxed - | Record_inlined (tag, variant_rep) -> + | Record_inlined (tag, constructor_rep, variant_rep) -> Record_inlined (constructor_tag ~prepare_jkind loc tag, + constructor_rep, variant_representation ~prepare_jkind loc variant_rep) | Record_boxed lays -> Record_boxed (Array.map (prepare_jkind loc) lays) - | Record_float -> Record_float - | Record_ufloat -> Record_ufloat + | (Record_float | Record_ufloat | Record_mixed _) as rep -> rep let type_declaration' copy_scope s decl = { type_params = List.map (typexp copy_scope s decl.type_loc) decl.type_params; @@ -480,6 +492,8 @@ let type_declaration' copy_scope s decl = prepare_jkind decl.type_loc decl.type_jkind | Duplicate_variables | No_action -> decl.type_jkind end; + (* CR layouts v10: Apply the substitution here, too *) + type_jkind_annotation = decl.type_jkind_annotation; type_private = decl.type_private; type_variance = decl.type_variance; type_separability = decl.type_separability; @@ -489,6 +503,7 @@ let type_declaration' copy_scope s decl = type_attributes = attrs s decl.type_attributes; type_unboxed_default = decl.type_unboxed_default; type_uid = decl.type_uid; + type_has_illegal_crossings = decl.type_has_illegal_crossings; } let type_declaration s decl = @@ -560,12 +575,13 @@ let extension_constructor' copy_scope s ext = { ext_type_path = type_path s ext.ext_type_path; ext_type_params = List.map (typexp copy_scope s ext.ext_loc) ext.ext_type_params; - ext_args = constructor_arguments copy_scope s ext.ext_loc ext.ext_args; + ext_args = constructor_arguments copy_scope s ext.ext_args; ext_arg_jkinds = begin match s.additional_action with | Prepare_for_saving prepare_jkind -> Array.map (prepare_jkind ext.ext_loc) ext.ext_arg_jkinds | Duplicate_variables | No_action -> ext.ext_arg_jkinds end; + ext_shape = ext.ext_shape; ext_constant = ext.ext_constant; ext_ret_type = Option.map (typexp copy_scope s ext.ext_loc) ext.ext_ret_type; @@ -729,8 +745,20 @@ let force_type_expr ty = Wrap.force (fun _ s ty -> let rec subst_lazy_value_description s descr = { val_type = Wrap.substitute ~compose Keep s descr.val_type; + val_modalities = descr.val_modalities; val_kind = descr.val_kind; val_loc = loc s descr.val_loc; + val_zero_alloc = + (* When saving a cmi file, we replace zero_alloc variables with constants. + This is necessary because users of the library can't change the + zero_alloc check that was done on functions in it, and safe because all + type inference is done by the time we write the cmi file (and anyway + additional inference steps could only cause the funtion to get checked + more strictly than the signature indicates, which is sound). *) + (match s.additional_action with + | Prepare_for_saving _ -> + Zero_alloc.create_const (Zero_alloc.get descr.val_zero_alloc) + | _ -> descr.val_zero_alloc); val_attributes = attrs s descr.val_attributes; val_uid = descr.val_uid; } diff --git a/typing/tast_iterator.ml b/typing/tast_iterator.ml index e29bee347f3..eb971d5ac0f 100644 --- a/typing/tast_iterator.ml +++ b/typing/tast_iterator.ml @@ -14,7 +14,6 @@ (**************************************************************************) open Asttypes -open Jane_asttypes open Typedtree type iterator = @@ -35,7 +34,7 @@ type iterator = env: iterator -> Env.t -> unit; expr: iterator -> expression -> unit; extension_constructor: iterator -> extension_constructor -> unit; - jkind_annotation: iterator -> const_jkind -> unit; + jkind_annotation: iterator -> Jkind.annotation -> unit; location: iterator -> Location.t -> unit; module_binding: iterator -> module_binding -> unit; module_coercion: iterator -> module_coercion -> unit; @@ -64,6 +63,7 @@ type iterator = value_bindings: iterator -> (rec_flag * value_binding list) -> unit; value_description: iterator -> value_description -> unit; with_constraint: iterator -> with_constraint -> unit; + item_declaration: iterator -> item_declaration -> unit; } let iter_snd f (_, y) = f y @@ -94,18 +94,23 @@ let class_infos sub f x = f x.ci_expr let module_type_declaration sub x = + sub.item_declaration sub (Module_type x); sub.location sub x.mtd_loc; sub.attributes sub x.mtd_attributes; iter_loc sub x.mtd_name; Option.iter (sub.module_type sub) x.mtd_type -let module_declaration sub {md_loc; md_name; md_type; md_attributes; _} = +let module_declaration sub md = + let {md_loc; md_name; md_type; md_attributes; _} = md in + sub.item_declaration sub (Module md); sub.location sub md_loc; sub.attributes sub md_attributes; iter_loc sub md_name; sub.module_type sub md_type -let module_substitution sub {ms_loc; ms_name; ms_txt; ms_attributes; _} = +let module_substitution sub ms = + let {ms_loc; ms_name; ms_txt; ms_attributes; _} = ms in + sub.item_declaration sub (Module_substitution ms); sub.location sub ms_loc; sub.attributes sub ms_attributes; iter_loc sub ms_name; @@ -125,9 +130,11 @@ let str_include_infos sub {incl_loc; incl_mod; incl_attributes; incl_kind; _} = include_kind sub incl_kind let class_type_declaration sub x = + sub.item_declaration sub (Class_type x); class_infos sub (sub.class_type sub) x let class_declaration sub x = + sub.item_declaration sub (Class x); class_infos sub (sub.class_expr sub) x let structure_item sub {str_loc; str_desc; str_env; _} = @@ -153,24 +160,29 @@ let structure_item sub {str_loc; str_desc; str_env; _} = | Tstr_attribute attr -> sub.attribute sub attr let value_description sub x = + sub.item_declaration sub (Value x); sub.location sub x.val_loc; sub.attributes sub x.val_attributes; iter_loc sub x.val_name; sub.typ sub x.val_desc -let label_decl sub {ld_loc; ld_name; ld_type; ld_attributes; _} = +let label_decl sub ({ld_loc; ld_name; ld_type; ld_attributes; ld_modalities = _} as ld) = + sub.item_declaration sub (Label ld); sub.location sub ld_loc; sub.attributes sub ld_attributes; iter_loc sub ld_name; sub.typ sub ld_type -let field_decl sub (ty, _) = sub.typ sub ty +let field_decl sub {ca_loc; ca_type; ca_modalities = _} = + sub.location sub ca_loc; + sub.typ sub ca_type let constructor_args sub = function | Cstr_tuple l -> List.iter (field_decl sub) l | Cstr_record l -> List.iter (label_decl sub) l let constructor_decl sub x = + sub.item_declaration sub (Constructor x); sub.location sub x.cd_loc; sub.attributes sub x.cd_attributes; iter_loc sub x.cd_name; @@ -184,6 +196,7 @@ let type_kind sub = function | Ttype_open -> () let type_declaration sub x = + sub.item_declaration sub (Type x); sub.location sub x.typ_loc; sub.attributes sub x.typ_attributes; iter_loc sub x.typ_name; @@ -211,7 +224,9 @@ let type_exception sub {tyexn_loc; tyexn_constructor; tyexn_attributes; _} = sub.attributes sub tyexn_attributes; sub.extension_constructor sub tyexn_constructor -let extension_constructor sub {ext_loc; ext_name; ext_kind; ext_attributes; _} = +let extension_constructor sub ec = + let {ext_loc; ext_name; ext_kind; ext_attributes; _} = ec in + sub.item_declaration sub (Extension_constructor ec); sub.location sub ext_loc; sub.attributes sub ext_attributes; iter_loc sub ext_name; @@ -241,7 +256,7 @@ let pat | Tpat_any -> () | Tpat_var (_, s, _, _) -> iter_loc sub s | Tpat_constant _ -> () - | Tpat_tuple l -> List.iter (sub.pat sub) l + | Tpat_tuple l -> List.iter (fun (_, p) -> sub.pat sub p) l | Tpat_construct (lid, _, l, vto) -> iter_loc sub lid; List.iter (sub.pat sub) l; @@ -250,7 +265,7 @@ let pat | Tpat_variant (_, po, _) -> Option.iter (sub.pat sub) po | Tpat_record (l, _) -> List.iter (fun (lid, _, i) -> iter_loc sub lid; sub.pat sub i) l - | Tpat_array (_, l) -> List.iter (sub.pat sub) l + | Tpat_array (_, _, l) -> List.iter (sub.pat sub) l | Tpat_alias (p, _, s, _, _) -> sub.pat sub p; iter_loc sub s | Tpat_lazy p -> sub.pat sub p | Tpat_value p -> sub.pat sub (p :> pattern) @@ -259,15 +274,41 @@ let pat sub.pat sub p1; sub.pat sub p2 +let extra sub = function + | Texp_constraint cty -> sub.typ sub cty + | Texp_coerce (cty1, cty2) -> + Option.iter (sub.typ sub) cty1; + sub.typ sub cty2 + | Texp_newtype _ -> () + | Texp_poly cto -> Option.iter (sub.typ sub) cto + | Texp_mode_coerce _ -> () + +let function_param sub { fp_loc; fp_kind; fp_newtypes; _ } = + sub.location sub fp_loc; + List.iter + (fun (var, annot) -> + iter_loc sub var; + Option.iter (sub.jkind_annotation sub) annot) + fp_newtypes; + match fp_kind with + | Tparam_pat pat -> sub.pat sub pat + | Tparam_optional_default (pat, default_arg, _) -> + sub.pat sub pat; + sub.expr sub default_arg + +let function_body sub body = + match body with + | Tfunction_body body -> + sub.expr sub body + | Tfunction_cases { fc_cases; fc_exp_extra; fc_loc; fc_attributes; fc_env } -> + List.iter (sub.case sub) fc_cases; + Option.iter (extra sub) fc_exp_extra; + sub.location sub fc_loc; + sub.attributes sub fc_attributes; + sub.env sub fc_env + let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = - let extra = function - | Texp_constraint cty -> sub.typ sub cty - | Texp_coerce (cty1, cty2) -> - Option.iter (sub.typ sub) cty1; - sub.typ sub cty2 - | Texp_newtype _ -> () - | Texp_poly cto -> Option.iter (sub.typ sub) cto - in + let extra x = extra sub x in sub.location sub exp_loc; sub.attributes sub exp_attributes; List.iter (fun (e, loc, _) -> extra e; sub.location sub loc) exp_extra; @@ -278,9 +319,10 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = | Texp_let (rec_flag, list, exp) -> sub.value_bindings sub (rec_flag, list); sub.expr sub exp - | Texp_function {cases; _} -> - List.iter (sub.case sub) cases - | Texp_apply (exp, list, _, _) -> + | Texp_function { params; body; _ } -> + List.iter (function_param sub) params; + function_body sub body + | Texp_apply (exp, list, _, _, _) -> sub.expr sub exp; List.iter (function | (_, Arg (exp, _)) -> sub.expr sub exp @@ -292,7 +334,7 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = | Texp_try (exp, cases) -> sub.expr sub exp; List.iter (sub.case sub) cases - | Texp_tuple (list, _) -> List.iter (sub.expr sub) list + | Texp_tuple (list, _) -> List.iter (fun (_,e) -> sub.expr sub e) list | Texp_construct (lid, _, args, _) -> iter_loc sub lid; List.iter (sub.expr sub) args @@ -304,16 +346,16 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = | _, Overridden (lid, exp) -> iter_loc sub lid; sub.expr sub exp) fields; Option.iter (sub.expr sub) extended_expression; - | Texp_field (exp, lid, _, _, _) -> + | Texp_field (exp, lid, _, _) -> iter_loc sub lid; sub.expr sub exp | Texp_setfield (exp1, _, lid, _, exp2) -> iter_loc sub lid; sub.expr sub exp1; sub.expr sub exp2 - | Texp_array (_, list, _) -> List.iter (sub.expr sub) list + | Texp_array (_, _, list, _) -> List.iter (sub.expr sub) list | Texp_list_comprehension { comp_body; comp_clauses } - | Texp_array_comprehension (_, { comp_body; comp_clauses }) -> + | Texp_array_comprehension (_, _, { comp_body; comp_clauses }) -> sub.expr sub comp_body; List.iter (function @@ -378,6 +420,7 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = | Texp_probe {handler;_} -> sub.expr sub handler | Texp_probe_is_enabled _ -> () | Texp_exclave exp -> sub.expr sub exp + | Texp_src_pos -> () let package_type sub {pack_fields; pack_txt; _} = @@ -420,6 +463,7 @@ let signature_item sub {sig_loc; sig_desc; sig_env; _} = | Tsig_attribute _ -> () let class_description sub x = + sub.item_declaration sub (Class_type x); class_infos sub (sub.class_type sub) x let functor_parameter sub = function @@ -505,7 +549,8 @@ let module_expr sub {mod_loc; mod_desc; mod_env; mod_attributes; _} = sub.module_coercion sub c | Tmod_unpack (exp, _) -> sub.expr sub exp -let module_binding sub {mb_loc; mb_name; mb_expr; mb_attributes; _} = +let module_binding sub ({mb_loc; mb_name; mb_expr; mb_attributes; _} as mb) = + sub.item_declaration sub (Module_binding mb); sub.location sub mb_loc; sub.attributes sub mb_attributes; iter_loc sub mb_name; @@ -583,7 +628,7 @@ let typ sub {ctyp_loc; ctyp_desc; ctyp_env; ctyp_attributes; _} = | Ttyp_arrow (_, ct1, ct2) -> sub.typ sub ct1; sub.typ sub ct2 - | Ttyp_tuple list -> List.iter (sub.typ sub) list + | Ttyp_tuple list -> List.iter (fun (_, t) -> sub.typ sub t) list | Ttyp_constr (_, lid, list) -> iter_loc sub lid; List.iter (sub.typ sub) list @@ -599,6 +644,7 @@ let typ sub {ctyp_loc; ctyp_desc; ctyp_env; ctyp_attributes; _} = List.iter (fun (_, l) -> Option.iter (sub.jkind_annotation sub) l) vars; sub.typ sub ct | Ttyp_package pack -> sub.package_type sub pack + | Ttyp_call_pos -> () let class_structure sub {cstr_self; cstr_fields; _} = sub.pat sub cstr_self; @@ -642,7 +688,8 @@ let case sub {c_lhs; c_guard; c_rhs} = Option.iter (sub.expr sub) c_guard; sub.expr sub c_rhs -let value_binding sub {vb_loc; vb_pat; vb_expr; vb_attributes; _} = +let value_binding sub ({vb_loc; vb_pat; vb_expr; vb_attributes; _} as vb) = + sub.item_declaration sub (Value_binding vb); sub.location sub vb_loc; sub.attributes sub vb_attributes; sub.pat sub vb_pat; @@ -650,7 +697,9 @@ let value_binding sub {vb_loc; vb_pat; vb_expr; vb_attributes; _} = let env _sub _ = () -let jkind_annotation _sub _ = () +let jkind_annotation sub (_, l) = iter_loc sub l + +let item_declaration _sub _ = () let default_iterator = { @@ -699,4 +748,5 @@ let default_iterator = value_bindings; value_description; with_constraint; + item_declaration; } diff --git a/typing/tast_iterator.mli b/typing/tast_iterator.mli index d08ddf8e876..03d8ec57d85 100644 --- a/typing/tast_iterator.mli +++ b/typing/tast_iterator.mli @@ -18,7 +18,6 @@ Allows the implementation of typed tree inspection using open recursion *) open Asttypes -open Jane_asttypes open Typedtree type iterator = @@ -39,7 +38,7 @@ type iterator = env: iterator -> Env.t -> unit; expr: iterator -> expression -> unit; extension_constructor: iterator -> extension_constructor -> unit; - jkind_annotation: iterator -> const_jkind -> unit; + jkind_annotation: iterator -> Jkind.annotation -> unit; location: iterator -> Location.t -> unit; module_binding: iterator -> module_binding -> unit; module_coercion: iterator -> module_coercion -> unit; @@ -68,6 +67,7 @@ type iterator = value_bindings: iterator -> (rec_flag * value_binding list) -> unit; value_description: iterator -> value_description -> unit; with_constraint: iterator -> with_constraint -> unit; + item_declaration: iterator -> item_declaration -> unit; } val default_iterator: iterator diff --git a/typing/tast_mapper.ml b/typing/tast_mapper.ml index 15e12354784..481f01b5e28 100644 --- a/typing/tast_mapper.ml +++ b/typing/tast_mapper.ml @@ -14,7 +14,6 @@ (**************************************************************************) open Asttypes -open Jane_asttypes open Typedtree (* TODO: add 'methods' for extension, @@ -40,7 +39,7 @@ type mapper = expr: mapper -> expression -> expression; extension_constructor: mapper -> extension_constructor -> extension_constructor; - jkind_annotation: mapper -> const_jkind -> const_jkind; + jkind_annotation: mapper -> Jkind.annotation -> Jkind.annotation; location: mapper -> Location.t -> Location.t; module_binding: mapper -> module_binding -> module_binding; module_coercion: mapper -> module_coercion -> module_coercion; @@ -199,11 +198,13 @@ let label_decl sub x = let ld_name = map_loc sub x.ld_name in let ld_type = sub.typ sub x.ld_type in let ld_attributes = sub.attributes sub x.ld_attributes in - {x with ld_loc; ld_name; ld_type; ld_attributes} + let ld_modalities = x.ld_modalities in + {x with ld_loc; ld_name; ld_type; ld_attributes; ld_modalities} -let field_decl sub (ty, gf) = - let ty = sub.typ sub ty in - (ty, gf) +let field_decl sub x = + let ca_type = sub.typ sub x.ca_type in + let ca_loc = sub.location sub x.ca_loc in + { ca_type; ca_loc; ca_modalities = x.ca_modalities } let constructor_args sub = function | Cstr_tuple l -> Cstr_tuple (List.map (field_decl sub) l) @@ -298,7 +299,8 @@ let pat | Tpat_any | Tpat_constant _ -> x.pat_desc | Tpat_var (id, s, uid, m) -> Tpat_var (id, map_loc sub s, uid, m) - | Tpat_tuple l -> Tpat_tuple (List.map (sub.pat sub) l) + | Tpat_tuple l -> + Tpat_tuple (List.map (fun (label, p) -> label, sub.pat sub p) l) | Tpat_construct (loc, cd, l, vto) -> let vto = Option.map (fun (vl,cty) -> List.map (map_loc sub) vl, sub.typ sub cty) vto in @@ -307,7 +309,7 @@ let pat Tpat_variant (l, Option.map (sub.pat sub) po, rd) | Tpat_record (l, closed) -> Tpat_record (List.map (tuple3 (map_loc sub) id (sub.pat sub)) l, closed) - | Tpat_array (am, l) -> Tpat_array (am, List.map (sub.pat sub) l) + | Tpat_array (am, arg_sort, l) -> Tpat_array (am, arg_sort, List.map (sub.pat sub) l) | Tpat_alias (p, id, s, uid, m) -> Tpat_alias (sub.pat sub p, id, map_loc sub s, uid, m) | Tpat_lazy p -> Tpat_lazy (sub.pat sub p) @@ -321,17 +323,74 @@ let pat let pat_attributes = sub.attributes sub x.pat_attributes in {x with pat_loc; pat_extra; pat_desc; pat_env; pat_attributes} -let expr sub x = - let extra = function - | Texp_constraint cty -> - Texp_constraint (sub.typ sub cty) - | Texp_coerce (cty1, cty2) -> - Texp_coerce (Option.map (sub.typ sub) cty1, sub.typ sub cty2) - | Texp_newtype _ as d -> d - | Texp_poly cto -> Texp_poly (Option.map (sub.typ sub) cto) +let function_param sub + { fp_kind; + fp_param; + fp_arg_label; + fp_partial; + fp_curry; + fp_newtypes; + fp_sort; + fp_mode; + fp_loc; + } + = + let fp_loc = sub.location sub fp_loc in + let fp_kind = + match fp_kind with + | Tparam_pat pat -> Tparam_pat (sub.pat sub pat) + | Tparam_optional_default (pat, expr, sort) -> + let pat = sub.pat sub pat in + let expr = sub.expr sub expr in + Tparam_optional_default (pat, expr, sort) in - let exp_loc = sub.location sub x.exp_loc in + let fp_newtypes = + List.map + (fun (var, annot) -> + map_loc sub var, Option.map (sub.jkind_annotation sub) annot) + fp_newtypes + in + { fp_kind; + fp_param; + fp_arg_label; + fp_partial; + fp_curry; + fp_newtypes; + fp_sort; + fp_mode; + fp_loc; + } + +let extra sub = function + | Texp_constraint cty -> + Texp_constraint (sub.typ sub cty) + | Texp_coerce (cty1, cty2) -> + Texp_coerce (Option.map (sub.typ sub) cty1, sub.typ sub cty2) + | Texp_newtype _ as d -> d + | Texp_poly cto -> Texp_poly (Option.map (sub.typ sub) cto) + | Texp_mode_coerce modes -> Texp_mode_coerce modes + +let function_body sub body = + match body with + | Tfunction_body body -> + Tfunction_body (sub.expr sub body) + | Tfunction_cases + { fc_cases; fc_partial; fc_param; fc_loc; fc_exp_extra; fc_attributes; + fc_arg_mode; fc_arg_sort; fc_env; fc_ret_type; } + -> + let fc_loc = sub.location sub fc_loc in + let fc_attributes = sub.attributes sub fc_attributes in + let fc_cases = List.map (sub.case sub) fc_cases in + let fc_exp_extra = Option.map (extra sub) fc_exp_extra in + let fc_env = sub.env sub fc_env in + Tfunction_cases + { fc_cases; fc_partial; fc_param; fc_loc; fc_exp_extra; fc_attributes; + fc_arg_mode; fc_arg_sort; fc_env; fc_ret_type; } + +let expr sub x = + let extra x = extra sub x in let exp_extra = List.map (tuple3 extra (sub.location sub) id) x.exp_extra in + let exp_loc = sub.location sub x.exp_loc in let exp_env = sub.env sub x.exp_env in let map_comprehension {comp_body; comp_clauses} = { comp_body = @@ -378,19 +437,20 @@ let expr sub x = | Texp_let (rec_flag, list, exp) -> let (rec_flag, list) = sub.value_bindings sub (rec_flag, list) in Texp_let (rec_flag, list, sub.expr sub exp) - | Texp_function { arg_label; param; cases; partial; region; curry; - warnings; arg_mode; arg_sort; ret_sort; alloc_mode } -> - let cases = List.map (sub.case sub) cases in - Texp_function { arg_label; param; cases; partial; region; curry; - warnings; arg_mode; arg_sort; ret_sort; alloc_mode } - | Texp_apply (exp, list, pos, am) -> + | Texp_function { params; body; alloc_mode; region; ret_mode; ret_sort; + zero_alloc } -> + let params = List.map (function_param sub) params in + let body = function_body sub body in + Texp_function { params; body; alloc_mode; region; ret_mode; ret_sort; + zero_alloc } + | Texp_apply (exp, list, pos, am, za) -> Texp_apply ( sub.expr sub exp, List.map (function | (lbl, Arg (exp, sort)) -> (lbl, Arg (sub.expr sub exp, sort)) | (lbl, Omitted o) -> (lbl, Omitted o)) list, - pos, am + pos, am, za ) | Texp_match (exp, sort, cases, p) -> Texp_match ( @@ -405,7 +465,7 @@ let expr sub x = List.map (sub.case sub) cases ) | Texp_tuple (list, am) -> - Texp_tuple (List.map (sub.expr sub) list, am) + Texp_tuple (List.map (fun (label, e) -> label, sub.expr sub e) list, am) | Texp_construct (lid, cd, args, am) -> Texp_construct (map_loc sub lid, cd, List.map (sub.expr sub) args, am) | Texp_variant (l, expo) -> @@ -422,8 +482,8 @@ let expr sub x = extended_expression = Option.map (sub.expr sub) extended_expression; alloc_mode } - | Texp_field (exp, lid, ld, mode, am) -> - Texp_field (sub.expr sub exp, map_loc sub lid, ld, mode, am) + | Texp_field (exp, lid, ld, float) -> + Texp_field (sub.expr sub exp, map_loc sub lid, ld, float) | Texp_setfield (exp1, am, lid, ld, exp2) -> Texp_setfield ( sub.expr sub exp1, @@ -432,12 +492,12 @@ let expr sub x = ld, sub.expr sub exp2 ) - | Texp_array (amut, list, alloc_mode) -> - Texp_array (amut, List.map (sub.expr sub) list, alloc_mode) + | Texp_array (amut, sort, list, alloc_mode) -> + Texp_array (amut, sort, List.map (sub.expr sub) list, alloc_mode) | Texp_list_comprehension comp -> Texp_list_comprehension (map_comprehension comp) - | Texp_array_comprehension (amut, comp) -> - Texp_array_comprehension (amut, map_comprehension comp) + | Texp_array_comprehension (amut, sort, comp) -> + Texp_array_comprehension (amut, sort, map_comprehension comp) | Texp_ifthenelse (exp1, exp2, expo) -> Texp_ifthenelse ( sub.expr sub exp1, @@ -512,8 +572,7 @@ let expr sub x = Texp_object (sub.class_structure sub cl, sl) | Texp_pack mexpr -> Texp_pack (sub.module_expr sub mexpr) - | Texp_letop {let_; ands; param; param_sort; body; body_sort; partial; - warnings} -> + | Texp_letop {let_; ands; param; param_sort; body; body_sort; partial} -> Texp_letop{ let_ = sub.binding_op sub let_; ands = List.map (sub.binding_op sub) ands; @@ -522,7 +581,6 @@ let expr sub x = body = sub.case sub body; body_sort; partial; - warnings } | Texp_unreachable -> Texp_unreachable @@ -535,6 +593,7 @@ let expr sub x = | Texp_probe_is_enabled _ as e -> e | Texp_exclave exp -> Texp_exclave (sub.expr sub exp) + | Texp_src_pos -> Texp_src_pos in let exp_attributes = sub.attributes sub x.exp_attributes in {x with exp_loc; exp_extra; exp_desc; exp_env; exp_attributes} @@ -813,12 +872,13 @@ let typ sub x = let ctyp_env = sub.env sub x.ctyp_env in let ctyp_desc = match x.ctyp_desc with - | Ttyp_var (_,None) as d -> d + | (Ttyp_var (_,None) | Ttyp_call_pos) as d -> d | Ttyp_var (s, Some jkind) -> Ttyp_var (s, Some (sub.jkind_annotation sub jkind)) | Ttyp_arrow (label, ct1, ct2) -> Ttyp_arrow (label, sub.typ sub ct1, sub.typ sub ct2) - | Ttyp_tuple list -> Ttyp_tuple (List.map (sub.typ sub) list) + | Ttyp_tuple list -> + Ttyp_tuple (List.map (fun (label, t) -> label, sub.typ sub t) list) | Ttyp_constr (path, lid, list) -> Ttyp_constr (path, map_loc sub lid, List.map (sub.typ sub) list) | Ttyp_object (list, closed) -> @@ -911,11 +971,12 @@ let value_binding sub x = let vb_pat = sub.pat sub x.vb_pat in let vb_expr = sub.expr sub x.vb_expr in let vb_attributes = sub.attributes sub x.vb_attributes in - {vb_loc; vb_pat; vb_expr; vb_attributes; vb_sort = x.vb_sort} + let vb_rec_kind = x.vb_rec_kind in + {vb_loc; vb_pat; vb_expr; vb_attributes; vb_sort = x.vb_sort; vb_rec_kind} let env _sub x = x -let jkind_annotation _sub l = l +let jkind_annotation sub (c, l) = (c, map_loc sub l) let default = { diff --git a/typing/tast_mapper.mli b/typing/tast_mapper.mli index 1d687100766..e98c2c2752f 100644 --- a/typing/tast_mapper.mli +++ b/typing/tast_mapper.mli @@ -14,7 +14,6 @@ (**************************************************************************) open Asttypes -open Jane_asttypes open Typedtree (** {1 A generic Typedtree mapper} *) @@ -39,7 +38,7 @@ type mapper = expr: mapper -> expression -> expression; extension_constructor: mapper -> extension_constructor -> extension_constructor; - jkind_annotation: mapper -> const_jkind -> const_jkind; + jkind_annotation: mapper -> Jkind.annotation -> Jkind.annotation; location: mapper -> Location.t -> Location.t; module_binding: mapper -> module_binding -> module_binding; module_coercion: mapper -> module_coercion -> module_coercion; diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 638365d1d86..403a0e6c654 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -103,13 +103,14 @@ type error = | Non_collapsable_conjunction of Ident.t * Types.class_declaration * Errortrace.unification_error | Self_clash of Errortrace.unification_error - | Mutability_mismatch of string * mutable_flag + | Mutability_mismatch of string * Asttypes.mutable_flag | No_overriding of string * string | Duplicate of string * string | Closing_self_type of class_signature | Polymorphic_class_parameter | Non_value_binding of string * Jkind.Violation.t | Non_value_let_binding of string * Jkind.sort + | Nonoptional_call_pos_label of string exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -261,9 +262,9 @@ let unify_delayed_method_type loc env label ty expected_ty= raise(Error(loc, env, Field_type_mismatch ("method", label, trace))) let type_constraint val_env sty sty' loc = - let cty = transl_simple_type val_env ~closed:false Alloc.Const.legacy sty in + let cty = transl_simple_type ~new_var_jkind:Any val_env ~closed:false Alloc.Const.legacy sty in let ty = cty.ctyp_type in - let cty' = transl_simple_type val_env ~closed:false Alloc.Const.legacy sty' in + let cty' = transl_simple_type ~new_var_jkind:Sort val_env ~closed:false Alloc.Const.legacy sty' in let ty' = cty'.ctyp_type in begin try Ctype.unify val_env ty ty' with Ctype.Unify err -> @@ -308,11 +309,11 @@ let rec class_type_field env sign self_scope ctf = | Pctf_val ({txt=lab}, mut, virt, sty) -> mkctf_with_attrs (fun () -> - let cty = transl_simple_type env ~closed:false Alloc.Const.legacy sty in + let cty = transl_simple_type ~new_var_jkind:Sort env ~closed:false Alloc.Const.legacy sty in let ty = cty.ctyp_type in begin match Ctype.constrain_type_jkind - env ty (Jkind.value ~why:Instance_variable) + env ty (Jkind.Primitive.value ~why:Instance_variable) with | Ok _ -> () | Error err -> raise (Error(loc, env, Non_value_binding(lab, err))) @@ -327,7 +328,7 @@ let rec class_type_field env sign self_scope ctf = match sty.ptyp_desc, priv with | Ptyp_poly ([],sty'), Public -> let expected_ty = - Ctype.newvar (Jkind.value ~why:Object_field) + Ctype.newvar (Jkind.Primitive.value ~why:Object_field) in add_method loc env lab priv virt expected_ty sign; let returned_cty = @@ -343,7 +344,7 @@ let rec class_type_field env sign self_scope ctf = ) :: !delayed_meth_specs; Tctf_method (lab, priv, virt, returned_cty) | _ -> - let cty = transl_simple_type env ~closed:false Alloc.Const.legacy sty in + let cty = transl_simple_type ~new_var_jkind:Any env ~closed:false Alloc.Const.legacy sty in let ty = cty.ctyp_type in add_method loc env lab priv virt ty sign; Tctf_method (lab, priv, virt, cty)) @@ -367,7 +368,7 @@ and class_signature virt env pcsig self_scope loc = (* Introduce a dummy method preventing self type from being closed. *) Ctype.add_dummy_method env ~scope:self_scope sign; - let self_cty = transl_simple_type env ~closed:false Alloc.Const.legacy sty in + let self_cty = transl_simple_type ~new_var_jkind:Any env ~closed:false Alloc.Const.legacy sty in let self_type = self_cty.ctyp_type in begin try Ctype.unify env self_type sign.csig_self @@ -417,7 +418,7 @@ and class_type_aux env virt self_scope scty = List.length styl))); let ctys = List.map2 (fun sty ty -> - let cty' = transl_simple_type env ~closed:false Alloc.Const.legacy sty in + let cty' = transl_simple_type ~new_var_jkind:Any env ~closed:false Alloc.Const.legacy sty in let ty' = cty'.ctyp_type in begin try Ctype.unify env ty' ty with Ctype.Unify err -> @@ -437,7 +438,17 @@ and class_type_aux env virt self_scope scty = cltyp (Tcty_signature clsig) typ | Pcty_arrow (l, sty, scty) -> - let cty = transl_simple_type env ~closed:false Alloc.Const.legacy sty in + let ctyp ctyp_desc ctyp_type = + { ctyp_desc; ctyp_type; ctyp_env = env; + ctyp_loc = sty.ptyp_loc; ctyp_attributes = sty.ptyp_attributes } + in + let l = transl_label l (Some sty) in + let cty = + match l with + | Position _ -> ctyp Ttyp_call_pos (Ctype.newconstr Predef.path_lexing_position []) + | Optional _ | Labelled _ | Nolabel -> + transl_simple_type ~new_var_jkind:Any env ~closed:false Alloc.Const.legacy sty + in let ty = cty.ctyp_type in let ty = if Btype.is_optional l @@ -477,12 +488,13 @@ let enter_ancestor_met ~loc name ~sign ~meths ~cl_num ~ty ~attrs met_env = let check s = Warnings.Unused_ancestor s in let kind = Val_anc (sign, meths, cl_num) in let desc = - { val_type = ty; val_kind = kind; + { val_type = ty; val_modalities = Modality.Value.id; val_kind = kind; val_attributes = attrs; + val_zero_alloc = Zero_alloc.default; Types.val_loc = loc; val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()) } in - Env.enter_value ~check name desc met_env + Env.enter_value ~check ~mode:Mode.Value.legacy name desc met_env let add_self_met loc id sign self_var_kind vars cl_num as_var ty attrs met_env = @@ -492,12 +504,13 @@ let add_self_met loc id sign self_var_kind vars cl_num in let kind = Val_self (sign, self_var_kind, vars, cl_num) in let desc = - { val_type = ty; val_kind = kind; + { val_type = ty; val_modalities = Modality.Value.id; val_kind = kind; val_attributes = attrs; + val_zero_alloc = Zero_alloc.default; Types.val_loc = loc; val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()) } in - Env.add_value ~check id desc met_env + Env.add_value ~check ~mode:Mode.Value.legacy id desc met_env let add_instance_var_met loc label id sign cl_num attrs met_env = let mut, ty = @@ -507,12 +520,13 @@ let add_instance_var_met loc label id sign cl_num attrs met_env = in let kind = Val_ivar (mut, cl_num) in let desc = - { val_type = ty; val_kind = kind; + { val_type = ty; val_modalities = Modality.Value.id; val_kind = kind; val_attributes = attrs; Types.val_loc = loc; + val_zero_alloc = Zero_alloc.default; val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()) } in - Env.add_value id desc met_env + Env.add_value ~mode:Mode.Value.legacy id desc met_env let add_instance_vars_met loc vars sign cl_num met_env = List.fold_left @@ -531,7 +545,7 @@ type intermediate_class_field = attributes : attribute list; } | Virtual_val of { label : string loc; - mut : mutable_flag; + mut : Asttypes.mutable_flag; id : Ident.t; cty : core_type; already_declared : bool; @@ -539,7 +553,7 @@ type intermediate_class_field = attributes : attribute list; } | Concrete_val of { label : string loc; - mut : mutable_flag; + mut : Asttypes.mutable_flag; id : Ident.t; override : override_flag; definition : expression; @@ -670,14 +684,14 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf = (fun () -> let cty = Ctype.with_local_level_if_principal - (fun () -> Typetexp.transl_simple_type val_env + (fun () -> Typetexp.transl_simple_type ~new_var_jkind:Any val_env ~closed:false Alloc.Const.legacy styp) ~post:(fun cty -> Ctype.generalize_structure cty.ctyp_type) in begin match Ctype.constrain_type_jkind - val_env cty.ctyp_type (Jkind.value ~why:Class_field) + val_env cty.ctyp_type (Jkind.Primitive.value ~why:Class_field) with | Ok _ -> () | Error err -> raise (Error(label.loc, val_env, @@ -726,7 +740,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf = match Ctype.constrain_type_jkind val_env definition.exp_type - (Jkind.value ~why:Class_field) + (Jkind.Primitive.value ~why:Class_field) with | Ok _ -> () | Error err -> raise (Error(label.loc, val_env, @@ -760,7 +774,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf = with_attrs (fun () -> let sty = Ast_helper.Typ.force_poly sty in - let cty = transl_simple_type val_env ~closed:false Alloc.Const.legacy sty in + let cty = transl_simple_type ~new_var_jkind:Any val_env ~closed:false Alloc.Const.legacy sty in let ty = cty.ctyp_type in add_method loc val_env label.txt priv Virtual ty sign; let field = @@ -796,11 +810,11 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf = in let ty = match sty with - | None -> Ctype.newvar (Jkind.value ~why:Object_field) + | None -> Ctype.newvar (Jkind.Primitive.value ~why:Object_field) | Some sty -> let sty = Ast_helper.Typ.force_poly sty in let cty' = - Typetexp.transl_simple_type val_env ~closed:false Alloc.Const.legacy sty + Typetexp.transl_simple_type ~new_var_jkind:Any val_env ~closed:false Alloc.Const.legacy sty in cty'.ctyp_type in @@ -810,7 +824,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf = match get_desc ty with | Tvar _ -> let ty' = - Ctype.newvar (Jkind.value ~why:Object_field) + Ctype.newvar (Jkind.Primitive.value ~why:Object_field) in Ctype.unify val_env (Ctype.newmono ty') ty; Typecore.type_approx val_env sbody ty' @@ -1010,6 +1024,11 @@ and class_structure cl_num virt self_scope final val_env met_env loc - cannot refer to local or once variables in the environment - access to unique variables will be relaxed to shared *) + (* CR zqian: We should add [Env.add_sync_lock] which restricts + syncness/contention to legacy, but that lock would be a no-op. However, we + should be future-proof for potential axes who legacy is set otherwise. The + best is to call [Env.add_legacy_lock] (which can be defined by + [Env.add_closure_lock]) that covers all axes. *) let val_env = Env.add_escape_lock Class (Env.add_unboxed_lock val_env) in let val_env = Env.add_share_lock Class val_env in let met_env = Env.add_escape_lock Class (Env.add_unboxed_lock met_env) in @@ -1114,11 +1133,14 @@ and class_expr cl_num val_env met_env virt self_scope scl = and class_expr_aux cl_num val_env met_env virt self_scope scl = match scl.pcl_desc with | Pcl_constr (lid, styl) -> - let (path, decl) = Env.lookup_class ~loc:scl.pcl_loc lid.txt val_env in + let (path, decl, mode) = + Env.lookup_class ~loc:scl.pcl_loc lid.txt val_env + in + Mode.Value.submode_exn mode Mode.Value.legacy; if Path.same decl.cty_path unbound_class then raise(Error(scl.pcl_loc, val_env, Unbound_class_2 lid.txt)); let tyl = List.map - (fun sty -> transl_simple_type val_env ~closed:false Alloc.Const.legacy sty) + (fun sty -> transl_simple_type ~new_var_jkind:Any val_env ~closed:false Alloc.Const.legacy sty) styl in let (params, clty) = @@ -1207,6 +1229,7 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = in class_expr cl_num val_env met_env virt self_scope sfun | Pcl_fun (l, None, spat, scl') -> + let l, spat = Typetexp.transl_label_from_pat l spat in if Typecore.has_poly_constraint spat then raise(Error(spat.ppat_loc, val_env, Polymorphic_class_parameter)); let (pat, pv, val_env', met_env) = @@ -1252,9 +1275,16 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = let cl = Ctype.with_raised_nongen_level (fun () -> class_expr cl_num val_env' met_env virt self_scope scl') in - if Btype.is_optional l && not_nolabel_function cl.cl_type then - Location.prerr_warning pat.pat_loc - Warnings.Unerasable_optional_argument; + if not_nolabel_function cl.cl_type then begin + match l with + | Nolabel | Labelled _ -> () + | Optional _ -> + Location.prerr_warning pat.pat_loc + Warnings.Unerasable_optional_argument; + | Position _ -> + Location.prerr_warning pat.pat_loc + Warnings.Unerasable_position_argument; + end; rc {cl_desc = Tcl_fun (l, pat, pv, cl, partial); cl_loc = scl.pcl_loc; cl_type = Cty_arrow @@ -1280,7 +1310,7 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = !Clflags.classic || let labels = nonopt_labels [] cl.cl_type in List.length labels = List.length sargs && - List.for_all (fun (l,_) -> l = Nolabel) sargs && + List.for_all (fun (l,_) -> l = Parsetree.Nolabel) sargs && List.exists (fun l -> l <> Nolabel) labels && begin Location.prerr_warning @@ -1303,55 +1333,67 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = let arg = Typecore.type_argument val_env sarg ty ty0 in arg, Jkind.Sort.value else - let ty' = Typecore.extract_option_type val_env ty - and ty0' = Typecore.extract_option_type val_env ty0 in - let arg = Typecore.type_argument val_env sarg ty' ty0' in - Typecore.option_some val_env arg Mode.Value.legacy, + Typecore.type_option_some val_env sarg ty ty0, (* CR layouts v5: Change the sort when options can hold non-values. *) Jkind.Sort.value ) in let eliminate_optional_arg () = - Arg (Typecore.option_none val_env ty0 Location.none, + Arg (Typecore.type_option_none val_env ty0 Location.none, (* CR layouts v5: Change the sort when options can hold non-values. *) Jkind.Sort.value ) in + let eliminate_position_arg () = + let arg = Typecore.src_pos (Location.ghostify scl.pcl_loc) [] val_env in + Arg (arg, Jkind.Sort.value) + in let remaining_sargs, arg = if ignore_labels then begin match sargs with | [] -> assert false | (l', sarg) :: remaining_sargs -> + let label_is_absent_in_remaining_args () = + not (List.exists (fun (l, _) -> name = Btype.label_name l) remaining_sargs) + in if name = Btype.label_name l' || (not optional && l' = Nolabel) then (remaining_sargs, use_arg sarg l') - else if - optional && - not (List.exists (fun (l, _) -> name = Btype.label_name l) - remaining_sargs) - then - (sargs, eliminate_optional_arg ()) + else if optional && label_is_absent_in_remaining_args () + then (sargs, eliminate_optional_arg ()) + else if Btype.is_position l && label_is_absent_in_remaining_args () + then (sargs, eliminate_position_arg ()) else raise(Error(sarg.pexp_loc, val_env, Apply_wrong_label l')) end else match Btype.extract_label name sargs with | Some (l', sarg, _, remaining_sargs) -> - if not optional && Btype.is_optional l' then - Location.prerr_warning sarg.pexp_loc - (Warnings.Nonoptional_label - (Printtyp.string_of_label l)); + if not optional && Btype.is_optional l' then ( + let label = Printtyp.string_of_label l in + if Btype.is_position l then + raise + (Error + ( sarg.pexp_loc + , val_env + , Nonoptional_call_pos_label label)) + else + Location.prerr_warning sarg.pexp_loc + (Warnings.Nonoptional_label label)); remaining_sargs, use_arg sarg l' | None -> + let is_erased () = List.mem_assoc Nolabel sargs in sargs, - if Btype.is_optional l && List.mem_assoc Nolabel sargs then + if Btype.is_optional l && is_erased () then eliminate_optional_arg () + else if Btype.is_position l && is_erased () then + eliminate_position_arg () else begin - let mode_closure = Mode.Alloc.legacy in - let mode_arg = Mode.Alloc.legacy in - let mode_ret = Mode.Alloc.legacy in + let mode_closure = Mode.Alloc.disallow_left Mode.Alloc.legacy in + let mode_arg = Mode.Alloc.disallow_right Mode.Alloc.legacy in + let mode_ret = Mode.Alloc.disallow_right Mode.Alloc.legacy in let sort_arg = Jkind.Sort.value in Omitted { mode_closure; mode_arg; mode_ret; sort_arg } end @@ -1377,6 +1419,7 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = in let (args, cty) = let (_, ty_fun0) = Ctype.instance_class [] cl.cl_type in + let sargs = List.map (fun (label, e) -> transl_label label None, e) sargs in type_args [] [] cl.cl_type ty_fun0 sargs in rc {cl_desc = Tcl_apply (cl, args); @@ -1390,7 +1433,7 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = Typecore.type_let In_class_def val_env rec_flag sdefs in let (vals, met_env) = List.fold_right - (fun (id, modes_and_sorts) (vals, met_env) -> + (fun (id, modes_and_sorts, _) (vals, met_env) -> List.iter (fun (loc, mode, sort) -> Typecore.escape ~loc ~env:val_env ~reason:Other mode; @@ -1421,8 +1464,10 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = in let desc = {val_type = expr.exp_type; + val_modalities = Modality.Value.id; val_kind = Val_ivar (Immutable, cl_num); val_attributes = []; + val_zero_alloc = Zero_alloc.default; Types.val_loc = vd.val_loc; val_uid = vd.val_uid; } @@ -1430,13 +1475,14 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = let id' = Ident.create_local (Ident.name id) in ((id', expr) :: vals, - Env.add_value id' desc met_env)) - (let_bound_idents_with_modes_and_sorts defs) + Env.add_value ~mode:Mode.Value.legacy id' desc met_env)) + (let_bound_idents_with_modes_sorts_and_checks defs) ([], met_env) in let cl = class_expr cl_num val_env met_env virt self_scope scl' in - let () = if rec_flag = Recursive then - Typecore.check_recursive_bindings val_env defs + let defs = match rec_flag with + | Recursive -> Typecore.annotate_recursive_bindings val_env defs + | Nonrecursive -> defs in rc {cl_desc = Tcl_let (rec_flag, defs, vals, cl); cl_loc = scl.pcl_loc; @@ -1506,15 +1552,19 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = (* of optional parameters *) let var_option = - Predef.type_option (Btype.newgenvar (Jkind.value ~why:Type_argument)) + Predef.type_option (Btype.newgenvar Predef.option_argument_jkind) let rec approx_declaration cl = match cl.pcl_desc with - Pcl_fun (l, _, _, cl) -> + Pcl_fun (l, _, pat, cl) -> + let l, _ = Typetexp.transl_label_from_pat l pat in let arg = - if Btype.is_optional l then Ctype.instance var_option - else Ctype.newvar (Jkind.value ~why:Class_argument) - (* CR layouts: use of value here may be relaxed when we update + match l with + | Optional _ -> Ctype.instance var_option + | Position _ -> Ctype.instance Predef.type_lexing_position + | Labelled _ | Nolabel -> + Ctype.newvar (Jkind.Primitive.value ~why:Class_term_argument) + (* CR layouts: use of value here may be relaxed when we update classes to work with jkinds *) in let arg = Ctype.newmono arg in @@ -1525,14 +1575,15 @@ let rec approx_declaration cl = approx_declaration cl | Pcl_constraint (cl, _) -> approx_declaration cl - | _ -> Ctype.newvar (Jkind.value ~why:Object) + | _ -> Ctype.newvar (Jkind.Primitive.value ~why:Object) let rec approx_description ct = match ct.pcty_desc with - Pcty_arrow (l, _, ct) -> + Pcty_arrow (l, core_type, ct) -> + let l = transl_label l (Some core_type) in let arg = if Btype.is_optional l then Ctype.instance var_option - else Ctype.newvar (Jkind.value ~why:Class_argument) + else Ctype.newvar (Jkind.Primitive.value ~why:Class_term_argument) (* CR layouts: use of value here may be relaxed when we relax jkinds in classes *) in @@ -1540,21 +1591,24 @@ let rec approx_description ct = let arrow_desc = l, Mode.Alloc.legacy, Mode.Alloc.legacy in Ctype.newty (Tarrow (arrow_desc, arg, approx_description ct, commu_ok)) - | _ -> Ctype.newvar (Jkind.value ~why:Object) + | _ -> Ctype.newvar (Jkind.Primitive.value ~why:Object) (*******************************) -let temp_abbrev loc arity uid = +let temp_abbrev loc id arity uid = let params = ref [] in - for _i = 1 to arity do - params := Ctype.newvar (Jkind.value ~why:Type_argument) :: !params + for i = 1 to arity do + params := Ctype.newvar (Jkind.Primitive.value ~why:( + Type_argument {parent_path = Path.Pident id; position = i; arity}) + ) :: !params done; - let ty = Ctype.newobj (Ctype.newvar (Jkind.value ~why:Object)) in + let ty = Ctype.newobj (Ctype.newvar (Jkind.Primitive.value ~why:Object)) in let ty_td = {type_params = !params; type_arity = arity; type_kind = Type_abstract Abstract_def; - type_jkind = Jkind.value ~why:Object; + type_jkind = Jkind.Primitive.value ~why:Object; + type_jkind_annotation = None; type_private = Public; type_manifest = Some ty; type_variance = Variance.unknown_signature ~injective:false ~arity; @@ -1565,6 +1619,7 @@ let temp_abbrev loc arity uid = type_attributes = []; (* or keep attrs from the class decl? *) type_unboxed_default = false; type_uid = uid; + type_has_illegal_crossings = false; } in (!params, ty, ty_td) @@ -1573,9 +1628,9 @@ let initial_env define_class approx (res, env) (cl, id, ty_id, obj_id, uid) = (* Temporary abbreviations *) let arity = List.length cl.pci_params in - let (obj_params, obj_ty, obj_td) = temp_abbrev cl.pci_loc arity uid in + let (obj_params, obj_ty, obj_td) = temp_abbrev cl.pci_loc obj_id arity uid in let env = Env.add_type ~check:true obj_id obj_td env in - let (cl_params, cl_ty, cl_td) = temp_abbrev cl.pci_loc arity uid in + let (cl_params, cl_ty, cl_td) = temp_abbrev cl.pci_loc ty_id arity uid in (* Temporary type for the class constructor *) let constr_type = @@ -1643,7 +1698,7 @@ let class_infos define_class kind we should lift this restriction. Doing so causes bad error messages today, so we wait for tomorrow. *) Ctype.unify env param.ctyp_type - (Ctype.newvar (Jkind.value ~why:Class_argument)); + (Ctype.newvar (Jkind.Primitive.value ~why:Class_type_argument)); (param, v) with Already_bound -> raise(Error(sty.ptyp_loc, env, Repeated_parameter)) @@ -1784,7 +1839,8 @@ let class_infos define_class kind type_params = obj_params; type_arity = arity; type_kind = Type_abstract Abstract_def; - type_jkind = Jkind.value ~why:Object; + type_jkind = Jkind.Primitive.value ~why:Object; + type_jkind_annotation = None; type_private = Public; type_manifest = Some obj_ty; type_variance = Variance.unknown_signature ~injective:false ~arity; @@ -1795,6 +1851,7 @@ let class_infos define_class kind type_attributes = []; (* or keep attrs from cl? *) type_unboxed_default = false; type_uid = dummy_class.cty_uid; + type_has_illegal_crossings = false; } in let (cl_params, cl_ty) = @@ -1804,7 +1861,7 @@ let class_infos define_class kind let cl_abbr = { cl_td with type_params = cl_params; - type_manifest = Some cl_ty + type_manifest = Some cl_ty; } in let cltydef = @@ -2093,7 +2150,8 @@ let approx_class_declarations env sdecls = open Format -let non_virtual_string_of_kind = function +let non_virtual_string_of_kind (t : kind) = + match t with | Object -> "object" | Class -> "non-virtual class" | Class_type -> "non-virtual class type" @@ -2261,8 +2319,10 @@ let report_error env ppf = function fprintf ppf "but actually has type") | Mutability_mismatch (_lab, mut) -> let mut1, mut2 = - if mut = Immutable then "mutable", "immutable" - else "immutable", "mutable" in + match mut with + | Immutable -> "mutable", "immutable" + | Mutable -> "immutable", "mutable" + in fprintf ppf "@[The instance variable is %s;@ it cannot be redefined as %s@]" mut1 mut2 @@ -2292,6 +2352,10 @@ let report_error env ppf = function "@[The types of variables bound by a 'let' in a class function@ \ must have layout value. Instead, %s's type has layout %a.@]" nm Jkind.Sort.format sort + | Nonoptional_call_pos_label label -> + fprintf ppf + "@[the argument labeled '%s' is a [%%call_pos] argument, filled in @ \ + automatically if ommitted. It cannot be passed with '?'.@]" label let report_error env ppf err = Printtyp.wrap_printing_env ~error:true diff --git a/typing/typeclass.mli b/typing/typeclass.mli index ee88d0a2c04..da494ec7d4f 100644 --- a/typing/typeclass.mli +++ b/typing/typeclass.mli @@ -121,13 +121,14 @@ type error = | Non_collapsable_conjunction of Ident.t * Types.class_declaration * Errortrace.unification_error | Self_clash of Errortrace.unification_error - | Mutability_mismatch of string * mutable_flag + | Mutability_mismatch of string * Asttypes.mutable_flag | No_overriding of string * string | Duplicate of string * string | Closing_self_type of class_signature | Polymorphic_class_parameter | Non_value_binding of string * Jkind.Violation.t | Non_value_let_binding of string * Jkind.sort + | Nonoptional_call_pos_label of string exception Error of Location.t * Env.t * error exception Error_forward of Location.error diff --git a/typing/typecore.ml b/typing/typecore.ml index ed8d5624e7c..ae591eac837 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -27,7 +27,7 @@ open Uniqueness_analysis type comprehension_type = | List_comprehension - | Array_comprehension of mutable_flag + | Array_comprehension of mutability type type_forcing_context = | If_conditional @@ -44,6 +44,7 @@ type type_forcing_context = | Comprehension_for_start | Comprehension_for_stop | Comprehension_when + | Error_message_attr of string type type_expected = { ty: type_expr; @@ -80,6 +81,10 @@ type wrong_kind_sort = | List | Unit +type contains_gadt = + | Contains_gadt + | No_gadt + let wrong_kind_sort_of_constructor (lid : Longident.t) = match lid with | Lident "true" | Lident "false" | Ldot(_, "true") | Ldot(_, "false") -> @@ -101,8 +106,16 @@ type submode_reason = | Application of type_expr | Other +type contention_context = + | Read_mutable + | Write_mutable + type error = | Constructor_arity_mismatch of Longident.t * int * int + | Constructor_labeled_arg + | Partial_tuple_pattern_bad_type + | Extra_tuple_label of string option * type_expr + | Missing_tuple_label of string option * type_expr | Label_mismatch of Longident.t * Errortrace.unification_error | Pattern_type_clash : Errortrace.unification_error * Parsetree.pattern_desc option -> error @@ -112,6 +125,23 @@ type error = | Expr_type_clash of Errortrace.unification_error * type_forcing_context option * Parsetree.expression_desc option + | Function_arity_type_clash of + { syntactic_arity : int; + type_constraint : type_expr; + trace : Errortrace.unification_error; + } + (* [Function_arity_type_clash { syntactic_arity = n; type_constraint; trace }] + is the type error for the specific case where an n-ary function is + constrained at a type with an arity less than n, e.g.: + {[ + type (_, _) eq = Eq : ('a, 'a) eq + let bad : type a. ?opt:(a, int -> int) eq -> unit -> a = + fun ?opt:(Eq = assert false) () x -> x + 1 + ]} + [type_constraint] is the user-written polymorphic type (in this example + [?opt:(a, int -> int) eq -> unit -> a]) that causes this type clash, and + [trace] is the unification error that signaled the issue. + *) | Apply_non_function of { funct : Typedtree.expression; func_ty : type_expr; @@ -176,6 +206,7 @@ type error = | Extension_not_enabled : _ Language_extension.t -> error | Literal_overflow of string | Unknown_literal of string * char + | Float32_literal of string | Illegal_letrec_pat | Illegal_letrec_expr | Illegal_class_expr @@ -189,9 +220,10 @@ type error = | Submode_failed of Value.error * submode_reason * Env.closure_context option * + contention_context option * Env.shared_context option - | Local_application_complete of Asttypes.arg_label * [`Prefix|`Single_arg|`Entire_apply] - | Param_mode_mismatch of type_expr * Alloc.error + | Local_application_complete of arg_label * [`Prefix|`Single_arg|`Entire_apply] + | Param_mode_mismatch of Alloc.equate_error | Uncurried_function_escapes of Alloc.error | Local_return_annotation_mismatch of Location.t | Function_returns_local @@ -201,12 +233,21 @@ type error = | Exclave_in_nontail_position | Exclave_returns_not_local | Unboxed_int_literals_not_supported - | Unboxed_float_literals_not_supported | Function_type_not_rep of type_expr * Jkind.Violation.t + | Modes_on_pattern + | Invalid_label_for_src_pos of arg_label + | Nonoptional_call_pos_label of string exception Error of Location.t * Env.t * error exception Error_forward of Location.error +type in_function = + { ty_fun: type_expected; + loc_fun: Location.t; + (** [region_locked] is whether the function has its own region. *) + region_locked: bool; + } + let error_of_filter_arrow_failure ~explanation ~first ty_fun : filter_arrow_failure -> _ = function | Unification_error unif_err -> @@ -302,43 +343,35 @@ type position_in_region = together with the mode of that region, and whether it is also the tail of a function (for tail call escape detection) *) - | RTail of Regionality.t * position_in_function + | RTail of Regionality.r * position_in_function +(* CR mode-hint: unify the mode error hinting. *) type expected_mode = { position : position_in_region; + closure_context : Env.closure_context option; - (* the upper bound of mode*) - mode : Value.t; - (* in some scnearios, the above `mode` will be the exact mode of the - expression to be typed, indicated by the `exact` field. - - - In any case, there is no risk of miscompilation in taking an upper bound - as exact. We might lose some range and trigger some false mode errors. - - - Taking an exact as upper bound could cause issues. In particular - for the inner function of an uncurried function. - - Therefore, if we just take it as exact regardless of the `exact` - field, we should be safe. Moreover, note that for most allocations, they - want to use expected_mode.mode as exact anyway, because that would be the - only constraint and they want to be as local as possible. The only exception - is uncurried functions where the mode constraints are tricky. - *) - exact : bool; + (** Explains why regionality axis of [mode] is low. *) + + contention_context : contention_context option; + (** Explains why contention axis of [mode] is low. *) + + mode : Value.r; + (** The upper bound, hence r (right) *) - (* Indicates that the expression was directly annotated with [local], which - should force any allocations to be on the stack. If [true] the [mode] field - must be greater than [local]. *) strictly_local : bool; + (** Indicates that the expression was directly annotated with [local], which + should force any allocations to be on the stack. No invariant between this + field and [mode]: this field being [true] while [mode] being [global] is + sensible, but not very useful as it will fail all expressions. *) - tuple_modes : Value.t list; - (* for t in tuple_modes, t <= regional_to_global mode *) + tuple_modes : Value.r list; + (** For t in tuple_modes, t <= regional_to_global mode *) } type position_and_mode = { apply_position : apply_position; (** Runtime tail call behaviour of the application *) - region_mode : Regionality.t option; + region_mode : Regionality.r option; (** INVARIANT: [Some m] iff [apply_position] is [Tail], where [m] is the mode of the surrounding region *) } @@ -383,72 +416,57 @@ let check_tail_call_local_returning loc env ap_mode {region_mode; _} = ap_mode is local, the application allocates in the outer region, and thus [region_mode] needs to be marked local as well*) match - Regionality.submode (Regionality.of_locality ap_mode) region_mode + Regionality.submode (locality_as_regionality ap_mode) region_mode with | Ok () -> () | Error _ -> raise (Error (loc, env, Tail_call_local_returning)) end | None -> () -(* Describes how a modality affects field projection. Returns the mode - of the projection given the mode of the record. *) -let _modality_unbox_left global_flag mode = - match global_flag with - | Global -> - mode |> Value.to_global |> Value.to_shared |> Value.to_many - | Unrestricted -> mode - -(* Describes how a modality affects record construction. Gives the - expected mode of the field given the expected mode of the record. *) -let _modality_box_right global_flag mode = - match global_flag with - | Global -> - mode |> Value.to_global |> Value.to_shared |> Value.to_many - | Unrestricted -> mode - -(* Describes how a modality affects field projection. Returns the mode - of the projection given the mode of the record. *) -let modality_unbox_left global_flag mode = - match global_flag with - | Global -> - mode |> Value.to_global |> Value.to_shared |> Value.to_many - | Unrestricted -> mode - -(* Describes how a modality affects record construction. Gives the - expected mode of the field given the expected mode of the record. *) -let modality_box_right global_flag mode = - match global_flag with - | Global -> - mode |> Value.to_global |> Value.to_shared |> Value.to_many - | Unrestricted -> mode +let meet_regional mode = + let mode = Value.disallow_left mode in + Value.meet [mode; (Value.max_with (Comonadic Areality) Regionality.regional)] + +let value_regional_to_local mode = + mode + |> value_to_alloc_r2l + |> alloc_as_value let mode_default mode = { position = RNontail; closure_context = None; - mode = mode; - exact = false; + contention_context = None; + mode = Value.disallow_left mode; strictly_local = false; tuple_modes = [] } let mode_legacy = mode_default Value.legacy +let mode_modality modality expected_mode = + expected_mode.mode + |> Modality.Value.Const.apply modality + |> mode_default + (* used when entering a function; mode is the mode of the function region *) let mode_return mode = - { (mode_default (Value.local_to_regional mode)) with - position = RTail (Value.locality mode, FTail); + { (mode_default (meet_regional mode)) with + position = RTail (Regionality.disallow_left + (Value.proj (Comonadic Areality) mode), FTail); closure_context = Some Return; } (* used when entering a region.*) let mode_region mode = - { (mode_default (Value.local_to_regional mode)) with - position = RTail (Value.locality mode, FNontail); + { (mode_default (meet_regional mode)) with + position = + RTail (Regionality.disallow_left + (Value.proj (Comonadic Areality) mode), FNontail); closure_context = None; } let mode_max = - mode_default Value.max_mode + mode_default Value.max let mode_with_position mode position = { (mode_default mode) with position } @@ -456,37 +474,23 @@ let mode_with_position mode position = let mode_max_with_position position = { mode_max with position } -let mode_subcomponent expected_mode = - mode_default (Value.regional_to_global expected_mode.mode) - -let mode_box_modality gf expected_mode = - mode_default (modality_box_right gf expected_mode.mode) - -let mode_global expected_mode = - { expected_mode with - mode = Value.to_global expected_mode.mode } - -let mode_local expected_mode = - { expected_mode with - mode = Value.to_local expected_mode.mode } - let mode_exclave expected_mode = - { (mode_default (Value.to_local expected_mode.mode)) + let mode = + Value.join_with (Comonadic Areality) + Regionality.Const.Local expected_mode.mode + in + { (mode_default mode) with strictly_local = true } let mode_strictly_local expected_mode = - { (mode_local expected_mode) + { expected_mode with strictly_local = true } -let mode_unique expected_mode = - { expected_mode with - mode = Value.to_unique expected_mode.mode } - -let mode_once expected_mode = - { expected_mode with - mode = Value.to_once expected_mode.mode } +let mode_coerce mode expected_mode = + let mode = Value.meet [expected_mode.mode; mode] in + { expected_mode with mode; tuple_modes = [] } let mode_tailcall_function mode = { (mode_default mode) with @@ -498,7 +502,9 @@ let mode_tailcall_argument mode = let mode_partial_application expected_mode = - { (mode_default (Value.regional_to_global expected_mode.mode)) with + let mode = alloc_as_value (value_to_alloc_r2g expected_mode.mode) in + { expected_mode with + mode; closure_context = Some Partial_application } @@ -506,34 +512,36 @@ let mode_trywith expected_mode = { expected_mode with position = RNontail } let mode_tuple mode tuple_modes = + let tuple_modes = Value.List.disallow_left tuple_modes in { (mode_default mode) with tuple_modes } -let mode_exact mode = - { (mode_default mode) with - exact = true } - -let mode_argument ~funct ~index ~position_and_mode ~partial_app alloc_mode = - let vmode = Value.of_alloc alloc_mode in - if partial_app then mode_default vmode +(** Takes [marg:Alloc.lr] extracted from the arrow type and returns the real +mode of argument, after taking into consideration partial application and +tail-call. Returns [expected_mode] and [Value.lr] which are backed by the same +mode variable. We encode extra position information in the former. We need the +latter to the both left and right mode because of how it will be used. *) +let mode_argument ~funct ~index ~position_and_mode ~partial_app marg = + let vmode , _ = Value.newvar_below (alloc_as_value marg) in + if partial_app then mode_default vmode, vmode else match funct.exp_desc, index, position_and_mode.apply_position with | Texp_ident (_, _, {val_kind = Val_prim {Primitive.prim_name = ("%sequor"|"%sequand")}}, Id_prim _, _), 1, Tail -> (* RHS of (&&) and (||) is at the tail of function region if the application is. The argument mode is not constrained otherwise. *) - mode_with_position vmode (RTail (Option.get position_and_mode.region_mode, FTail)) + mode_with_position vmode (RTail (Option.get position_and_mode.region_mode, FTail)), + vmode | Texp_ident (_, _, _, Id_prim _, _), _, _ -> (* Other primitives cannot be tail-called *) - mode_default vmode + mode_default vmode, vmode | _, _, (Nontail | Default) -> - mode_default vmode - | _, _, Tail -> - mode_tailcall_argument (Value.local_to_regional vmode) - -let mode_lazy expected_mode = - { (mode_global expected_mode) with - position = RTail (Regionality.global, FTail) } + mode_default vmode, vmode + | _, _, Tail -> begin + Regionality.submode_exn (Value.proj (Comonadic Areality) vmode) + Regionality.regional; + mode_tailcall_argument vmode, vmode + end (* expected_mode.closure_context explains why expected_mode.mode is low; shared_context explains why mode.uniqueness is high *) @@ -541,91 +549,134 @@ let submode ~loc ~env ?(reason = Other) ?shared_context mode expected_mode = let res = match expected_mode.tuple_modes with | [] -> Value.submode mode expected_mode.mode - | ts -> Value.submode_meet mode ts + | ts -> Value.submode mode (Value.meet ts) in match res with | Ok () -> () | Error failure_reason -> let closure_context = expected_mode.closure_context in + let contention_context = expected_mode.contention_context in let error = - Submode_failed(failure_reason, reason, closure_context, shared_context) + Submode_failed(failure_reason, reason, closure_context, + contention_context, shared_context) in raise (Error(loc, env, error)) +let actual_submode ~loc ~env ?reason (actual_mode : Env.actual_mode) + expected_mode = + submode ~loc ~env ?reason ?shared_context:actual_mode.context actual_mode.mode + expected_mode + let escape ~loc ~env ~reason m = submode ~loc ~env ~reason m mode_legacy type expected_pat_mode = - { mode : Value.t; - tuple_modes : Value.t list; } + { mode : Value.l; + tuple_modes : Value.l list; } let simple_pat_mode mode = - { mode; tuple_modes = [] } + { mode = Value.disallow_right mode; tuple_modes = [] } let tuple_pat_mode mode tuple_modes = + let mode = Value.disallow_right mode in + let tuple_modes = Value.List.disallow_right tuple_modes in { mode; tuple_modes } -let allocations : Alloc.t list ref = Local_store.s_ref [] +let allocations : Alloc.r list ref = Local_store.s_ref [] let reset_allocations () = allocations := [] let register_allocation_mode alloc_mode = - if not (Alloc.is_const alloc_mode) then - allocations := alloc_mode :: !allocations + let alloc_mode = Alloc.disallow_left alloc_mode in + allocations := alloc_mode :: !allocations let register_allocation_value_mode mode = - let alloc_mode = Value.regional_to_global_alloc mode in + let alloc_mode = value_to_alloc_r2g mode in register_allocation_mode alloc_mode; - alloc_mode + let mode = alloc_as_value alloc_mode in + alloc_mode, mode +(** Register as allocation the expression constrained by the given + [expected_mode]. Returns the mode of the allocation, and the expected mode + of potential subcomponents. *) let register_allocation (expected_mode : expected_mode) = - register_allocation_value_mode expected_mode.mode + let alloc_mode, mode = register_allocation_value_mode expected_mode.mode in + alloc_mode, mode_default mode let optimise_allocations () = + (* CR zqian: Ideally we want to optimise all axes relavant to allocation. For + example, pushing an allocation to [contended] is useful to the middle-end. + However, a [contended] value in a module causes extra modality in printing. + Therefore, here we only optimise allocation for stack/heap. Proper solutions: + - Remove [Contention] axis from [Alloc]. + - Add it back when middle-end can really utilize this information. *) List.iter - (fun mode -> ignore (Alloc.constrain_upper mode)) + (fun mode -> + Locality.zap_to_ceil (Alloc.proj (Comonadic Areality) mode) + |> ignore) !allocations; reset_allocations () (* Typing of constants *) -let type_constant = function +let type_constant: Typedtree.constant -> type_expr = function Const_int _ -> instance Predef.type_int | Const_char _ -> instance Predef.type_char | Const_string _ -> instance Predef.type_string | Const_float _ -> instance Predef.type_float + | Const_float32 _ -> instance Predef.type_float32 + | Const_unboxed_float _ -> instance Predef.type_unboxed_float + | Const_unboxed_float32 _ -> instance Predef.type_unboxed_float32 | Const_int32 _ -> instance Predef.type_int32 | Const_int64 _ -> instance Predef.type_int64 | Const_nativeint _ -> instance Predef.type_nativeint - -let type_constant_unboxed env loc - : Jane_syntax.Layouts.constant -> _ = function - | Float _ -> raise (Error (loc, env, Unboxed_float_literals_not_supported)) - (* CR layouts v2.5: This should be [instance Predef.type_unboxed_float] *) - | Integer _ -> raise (Error (loc, env, Unboxed_int_literals_not_supported)) - -let constant_integer i ~suffix : (Asttypes.constant, error) result = + | Const_unboxed_int32 _ -> instance Predef.type_unboxed_int32 + | Const_unboxed_int64 _ -> instance Predef.type_unboxed_int64 + | Const_unboxed_nativeint _ -> instance Predef.type_unboxed_nativeint + +type constant_integer_result = + | Int32 of int32 + | Int64 of int64 + | Nativeint of nativeint + +type constant_integer_error = + | Int32_literal_overflow + | Int64_literal_overflow + | Nativeint_literal_overflow + | Unknown_constant_literal + +let constant_integer i ~suffix : + (constant_integer_result, constant_integer_error) result = match suffix with | 'l' -> begin - try Ok (Const_int32 (Misc.Int_literal_converter.int32 i)) - with Failure _ -> Error (Literal_overflow "int32") + try Ok (Int32 (Misc.Int_literal_converter.int32 i)) + with Failure _ -> Error Int32_literal_overflow end | 'L' -> begin - try Ok (Const_int64 (Misc.Int_literal_converter.int64 i)) - with Failure _ -> Error (Literal_overflow "int64") + try Ok (Int64 (Misc.Int_literal_converter.int64 i)) + with Failure _ -> Error Int64_literal_overflow end | 'n' -> begin - try Ok (Const_nativeint (Misc.Int_literal_converter.nativeint i)) - with Failure _ -> Error (Literal_overflow "nativeint") + try Ok (Nativeint (Misc.Int_literal_converter.nativeint i)) + with Failure _ -> Error Nativeint_literal_overflow end - | c -> Error (Unknown_literal (i, c)) + | _ -> Error Unknown_constant_literal -let constant : Parsetree.constant -> (Asttypes.constant, error) result = +let constant : Parsetree.constant -> (Typedtree.constant, error) result = function - | Pconst_integer (i, Some suffix) -> constant_integer i ~suffix + | Pconst_integer (i, Some suffix) -> + begin match constant_integer i ~suffix with + | Ok (Int32 v) -> Ok (Const_int32 v) + | Ok (Int64 v) -> Ok (Const_int64 v) + | Ok (Nativeint v) -> Ok (Const_nativeint v) + | Error Int32_literal_overflow -> Error (Literal_overflow "int32") + | Error Int64_literal_overflow -> Error (Literal_overflow "int64") + | Error Nativeint_literal_overflow -> Error (Literal_overflow "nativeint") + | Error Unknown_constant_literal -> Error (Unknown_literal (i, suffix)) + end | Pconst_integer (i,None) -> begin try Ok (Const_int (Misc.Int_literal_converter.int i)) @@ -634,6 +685,9 @@ let constant : Parsetree.constant -> (Asttypes.constant, error) result = | Pconst_char c -> Ok (Const_char c) | Pconst_string (s,loc,d) -> Ok (Const_string (s,loc,d)) | Pconst_float (f,None)-> Ok (Const_float f) + | Pconst_float (f,Some 's') -> + if Language_extension.is_enabled Small_numbers then Ok (Const_float32 f) + else Error (Float32_literal f) | Pconst_float (f,Some c) -> Error (Unknown_literal (f, c)) let constant_or_raise env loc cst = @@ -641,22 +695,29 @@ let constant_or_raise env loc cst = | Ok c -> c | Error err -> raise (Error (loc, env, err)) -let unboxed_constant : - type a. Jane_syntax.Layouts.constant -> (a, error) result +let unboxed_constant : Jane_syntax.Layouts.constant -> (Typedtree.constant, error) result = function - | Float (_, None) -> Error Unboxed_float_literals_not_supported - | Float (x, Some c) -> Error (Unknown_literal ("#" ^ x, c)) - | Integer (_, _) -> Error Unboxed_int_literals_not_supported + | Float (f, None) -> Ok (Const_unboxed_float f) + | Float (f, Some 's') -> + if Language_extension.is_enabled Small_numbers then Ok (Const_unboxed_float32 f) + else Error (Float32_literal (Misc.format_as_unboxed_literal f)) + | Float (x, Some c) -> + Error (Unknown_literal (Misc.format_as_unboxed_literal x, c)) + | Integer (i, suffix) -> + begin match constant_integer i ~suffix with + | Ok (Int32 v) -> Ok (Const_unboxed_int32 v) + | Ok (Int64 v) -> Ok (Const_unboxed_int64 v) + | Ok (Nativeint v) -> Ok (Const_unboxed_nativeint v) + | Error Int32_literal_overflow -> Error (Literal_overflow "int32#") + | Error Int64_literal_overflow -> Error (Literal_overflow "int64#") + | Error Nativeint_literal_overflow -> Error (Literal_overflow "nativeint#") + | Error Unknown_constant_literal -> + Error (Unknown_literal (Misc.format_as_unboxed_literal i, suffix)) + end -(* CR layouts v2.5: this is missing the part where we actually typecheck - unboxed literals. -*) let unboxed_constant_or_raise env loc cst = - let open struct - type nothing = | - end in match unboxed_constant cst with - | Ok (_ : nothing) -> . + | Ok c -> c | Error err -> raise (Error (loc, env, err)) (* Specific version of type_option, using newty rather than newgenty *) @@ -668,18 +729,11 @@ let mkexp exp_desc exp_type exp_loc exp_env = { exp_desc; exp_type; exp_loc; exp_env; exp_extra = []; exp_attributes = [] } -let option_none env ty loc = +let type_option_none env ty loc = let lid = Longident.Lident "None" in let cnone = Env.find_ident_constructor Predef.ident_none env in mkexp (Texp_construct(mknoloc lid, cnone, [], None)) ty loc env -let option_some env texp mode = - let alloc_mode = register_allocation_value_mode mode in - let lid = Longident.Lident "Some" in - let csome = Env.find_ident_constructor Predef.ident_some env in - mkexp (Texp_construct(mknoloc lid , csome, [texp], Some alloc_mode)) - (type_option texp.exp_type) texp.exp_loc texp.exp_env - let extract_option_type env ty = match get_desc (expand_head env ty) with Tconstr(path, [ty], _) when Path.same path Predef.path_option -> ty @@ -688,6 +742,15 @@ let extract_option_type env ty = let protect_expansion env ty = if Env.has_local_constraints env then generic_instance ty else ty +let src_pos loc attrs env = + { exp_desc = Texp_src_pos + ; exp_loc = loc + ; exp_extra = [] + ; exp_type = instance Predef.type_lexing_position + ; exp_attributes = attrs + ; exp_env = env + } + type record_extraction_result = | Record_type of Path.t * Path.t * Types.label_declaration list * record_representation | Not_a_record_type @@ -722,18 +785,6 @@ let extract_label_names env ty = | Record_type (_, _,fields, _) -> List.map (fun l -> l.Types.ld_id) fields | Not_a_record_type | Maybe_a_record_type -> assert false -let has_local_attr loc attrs = - match Builtin_attributes.has_local attrs with - | Ok l -> l - | Error () -> - raise(Typetexp.Error(loc, Env.empty, Unsupported_extension Local)) - -let has_local_attr_pat ppat = - has_local_attr ppat.ppat_loc ppat.ppat_attributes - -let has_local_attr_exp pexp = - has_local_attr pexp.pexp_loc pexp.pexp_attributes - let has_poly_constraint spat = match spat.ppat_desc with | Ppat_constraint(_, styp) -> begin @@ -743,98 +794,124 @@ let has_poly_constraint spat = end | _ -> false -let mode_cross_to_min env ty mode = - if mode_cross env ty then - Value.min_mode - else - mode - +(** Mode cross a left mode *) +let mode_cross_left env ty mode = + let mode = + if not (is_principal ty) then mode else + let jkind = type_jkind_purely env ty in + let upper_bounds = Jkind.get_modal_upper_bounds jkind in + let upper_bounds = Const.alloc_as_value upper_bounds in + Value.meet_const upper_bounds mode + in + mode |> Value.disallow_right + +let actual_mode_cross_left env ty (actual_mode : Env.actual_mode) + : Env.actual_mode = + let mode = mode_cross_left env ty actual_mode.mode in + {actual_mode with mode} + +(** Mode cross a mode whose monadic fragment is a right mode, and whose comonadic + fragment is a left mode. *) +let alloc_mode_cross_to_max_min env ty { monadic; comonadic } = + let monadic = Alloc.Monadic.disallow_left monadic in + let comonadic = Alloc.Comonadic.disallow_right comonadic in + if not (is_principal ty) then { monadic; comonadic } else + let jkind = type_jkind_purely env ty in + let upper_bounds = Jkind.get_modal_upper_bounds jkind in + let upper_bounds = Alloc.Const.split upper_bounds in + let comonadic = Alloc.Comonadic.meet_const upper_bounds.comonadic comonadic in + let monadic = Alloc.Monadic.imply upper_bounds.monadic monadic in + { monadic; comonadic } + +(** Mode cross a right mode *) let expect_mode_cross env ty (expected_mode : expected_mode) = - if mode_cross env ty then - { expected_mode with - mode = Value.max_mode; - exact = false; - strictly_local = false } - else expected_mode - -let has_unique_attr loc attrs = - match Builtin_attributes.has_unique attrs with - | Ok l -> l - | Error () -> - raise(Typetexp.Error(loc, Env.empty, Unsupported_extension Unique)) - -let has_once_attr loc attrs = - match Builtin_attributes.has_once attrs with - | Ok l -> l - | Error () -> - raise(Typetexp.Error(loc, Env.empty, Unsupported_extension Unique)) - -let has_unique_attr_pat ppat = - has_unique_attr ppat.ppat_loc ppat.ppat_attributes - -let has_unique_attr_exp pexp = - has_unique_attr pexp.pexp_loc pexp.pexp_attributes - -let has_once_attr_pat ppat = - has_once_attr ppat.ppat_loc ppat.ppat_attributes - -let has_once_attr_exp pexp = - has_once_attr pexp.pexp_loc pexp.pexp_attributes - -let mode_annots_none = - {locality = None; uniqueness = None; linearity = None} - -let mode_annots_from_pat_attrs sp = - let locality = - if has_local_attr_pat sp then Some Locality.Const.Local - else None - and uniqueness = - if has_unique_attr_pat sp then Some Uniqueness.Const.Unique - else None - and linearity = - if has_once_attr_pat sp then Some Linearity.Const.Once - else None + if not (is_principal ty) then expected_mode else + let jkind = type_jkind_purely env ty in + let upper_bounds = Jkind.get_modal_upper_bounds jkind in + let upper_bounds = Const.alloc_as_value upper_bounds in + let mode = Value.imply upper_bounds expected_mode.mode in + (* - [strict_local] doesn't need to be updated, because it's only relavant for + functions, which don't cross locality. + - [mode_tuples] doesn't need to be updated, because [mode] being higher + won't violate the invariant. *) + { expected_mode with mode } + +(* Value binding elaboration can insert alloc mode attributes on the forged + [Pexp_constraint] node. Use this function to detect + and remove these inserted attributes. +*) +let alloc_mode_from_pexp_constraint_typ_attrs styp = + let modes, ptyp_attributes = + Jane_syntax.Mode_expr.of_attrs styp.ptyp_attributes in - {locality; uniqueness; linearity} + Typemode.transl_alloc_mode modes, { styp with ptyp_attributes } -let mode_annots_or_default annot ~default = - let locality = Option.value annot.locality ~default:default.locality in - let uniqueness = Option.value annot.uniqueness ~default:default.uniqueness in - let linearity = Option.value annot.linearity ~default:default.linearity in - {locality; uniqueness; linearity} +let alloc_mode_from_ppat_constraint_typ_attrs styp = + let modes, ptyp_attributes = + Jane_syntax.Mode_expr.of_attrs styp.ptyp_attributes + in + Typemode.transl_alloc_mode modes, { styp with ptyp_attributes } -let mode_annots_from_exp_attrs exp = - let locality = - if has_local_attr_exp exp then Some Locality.Const.Local - else None - and uniqueness = - if has_unique_attr_exp exp then Some Uniqueness.Const.Unique - else None - and linearity = - if has_once_attr_exp exp then Some Linearity.Const.Once - else None +let mode_annots_from_pat_attrs pat = + let modes, ppat_attributes = + Jane_syntax.Mode_expr.of_attrs pat.ppat_attributes in - {locality; uniqueness; linearity} + Typemode.transl_mode_annots modes, {pat with ppat_attributes} -let apply_mode_annots ~loc ~env ~ty_expected ann mode = +let apply_mode_annots ~loc ~env (m : Alloc.Const.Option.t) mode = let error axis = - raise (Error(loc, env, Param_mode_mismatch (ty_expected, axis))) + raise (Error(loc, env, Param_mode_mismatch axis)) in - Option.iter (fun locality -> - match Locality.equate (Locality.of_const locality) (Alloc.locality mode) with - | Ok () -> () - | Error () -> error `Locality - ) ann.locality; - Option.iter (fun uniqueness -> - match Uniqueness.equate (Uniqueness.of_const uniqueness) (Alloc.uniqueness mode) with - | Ok () -> () - | Error () -> error `Uniqueness - ) ann.uniqueness; - Option.iter (fun linearity -> - match Linearity.equate (Linearity.of_const linearity) (Alloc.linearity mode) with - | Ok () -> () - | Error () -> error `Linearity - ) ann.linearity + let min = Alloc.Const.Option.value ~default:Alloc.Const.min m in + let max = Alloc.Const.Option.value ~default:Alloc.Const.max m in + (match Alloc.submode (Alloc.of_const min) mode with + | Ok () -> () + | Error e -> error (Left_le_right, e)); + (match Alloc.submode mode (Alloc.of_const max) with + | Ok () -> () + | Error e -> error (Right_le_left, e)) + +(** Given the parameter [m0] on mutable, return the mode of future writes. *) +let mutable_mode m0 = + let m0 = + Alloc.Const.merge + {comonadic = m0; + monadic = Alloc.Monadic.Const.min} + in + m0 |> Const.alloc_as_value |> Value.of_const + +(** Takes the mutability on a field, and expected mode of the record (adjusted + for allocation), check that the construction would be allowed. *) +let check_construct_mutability ~loc ~env mutability argument_mode = + match mutability with + | Immutable -> () + | Mutable m0 -> + let m0 = mutable_mode m0 in + submode ~loc ~env m0 argument_mode + +(** The [expected_mode] of the record when projecting a mutable field. *) +let mode_project_mutable = + let mode = + Contention.Const.Uncontended + |> Contention.of_const + |> Value.max_with (Monadic Contention) + in + { (mode_default mode) with + contention_context = Some Read_mutable } + +(** The [expected_mode] of the record when mutating a mutable field. *) +let mode_mutate_mutable = + let mode = + Contention.Const.Uncontended + |> Contention.of_const + |> Value.max_with (Monadic Contention) + in + { (mode_default mode) with + contention_context = Some Write_mutable } + +let check_project_mutability ~loc ~env mutability mode = + if Types.is_mutable mutability then + submode ~loc ~env mode mode_project_mutable (* Typing of patterns *) @@ -939,7 +1016,7 @@ type pattern_variable = { pv_id: Ident.t; pv_uid: Uid.t; - pv_mode: Value.t; + pv_mode: Value.l; pv_type: type_expr; pv_loc: Location.t; pv_as_var: bool; @@ -1038,11 +1115,13 @@ let iter_pattern_variables_type f : pattern_variable list -> unit = let add_pattern_variables ?check ?check_as env pv = List.fold_right - (fun {pv_id; pv_uid; pv_mode; pv_type; pv_loc; pv_as_var; pv_attributes} env -> + (fun {pv_id; pv_uid; pv_mode; pv_type; pv_loc; pv_as_var; pv_attributes} + env -> let check = if pv_as_var then check_as else check in Env.add_value ?check ~mode:pv_mode pv_id {val_type = pv_type; val_kind = Val_reg; Types.val_loc = pv_loc; - val_attributes = pv_attributes; + val_attributes = pv_attributes; val_modalities = Modality.Value.id; + val_zero_alloc = Zero_alloc.default; val_uid = pv_uid } env ) @@ -1120,7 +1199,7 @@ let enter_variable tps.tps_pattern_variables <- {pv_id = id; pv_uid; - pv_mode = mode; + pv_mode = Value.disallow_right mode; pv_type = ty; pv_loc = loc; pv_as_var = is_as_variable; @@ -1150,7 +1229,7 @@ let enter_orpat_variables loc env p1_vs p2_vs = pv1 :: vars, alist else begin begin try - unify_var env (newvar (Jkind.any ~why:Dummy_jkind)) t1; + unify_var env (newvar (Jkind.Primitive.any ~why:Dummy_jkind)) t1; unify env t1 t2 with | Unify err -> @@ -1202,8 +1281,9 @@ and build_as_type_aux ~refine ~mode (env : Env.t ref) p = match p.pat_desc with Tpat_alias(p1,_, _, _, _) -> build_as_type_and_mode ~refine ~mode env p1 | Tpat_tuple pl -> - let tyl = List.map (build_as_type env) pl in - newty (Ttuple tyl), mode + let labeled_tyl = + List.map (fun (label, p) -> label, build_as_type env p) pl in + newty (Ttuple labeled_tyl), mode | Tpat_construct(_, cstr, pl, vto) -> let priv = (cstr.cstr_private = Private) in let mode = @@ -1220,7 +1300,7 @@ and build_as_type_aux ~refine ~mode (env : Env.t ref) p = instance_constructor Keep_existentials_flexible cstr in List.iter2 - (fun (p,ty) (arg, _) -> + (fun (p,ty) {Types.ca_type=arg; _} -> unify_pat ~refine env {p with pat_type = ty} arg) (List.combine pl tyl) ty_args; ty_res @@ -1235,7 +1315,7 @@ and build_as_type_aux ~refine ~mode (env : Env.t ref) p = let ty = let fields = [l, rf_present ty] in newty (Tvariant (create_row ~fields - ~more:(newvar (Jkind.value ~why:Row_variable)) + ~more:(newvar (Jkind.Primitive.value ~why:Row_variable)) ~name:None ~fixed:None ~closed:false)) in ty, mode @@ -1248,7 +1328,7 @@ and build_as_type_aux ~refine ~mode (env : Env.t ref) p = think about when it gets defaulted.) RAE: why? It looks fine as-is. *) - let ty = newvar (Jkind.any ~why:Dummy_jkind) in + let ty = newvar (Jkind.Primitive.any ~why:Dummy_jkind) in let ppl = List.map (fun (_, l, p) -> l.lbl_num, p) lpl in let do_label lbl = let _, ty_arg, ty_res = instance_label false lbl in @@ -1291,17 +1371,11 @@ and build_as_type_aux ~refine ~mode (env : Env.t ref) p = newty (Tvariant (create_row ~fields ~fixed ~name ~closed:false ~more:(newvar - (Jkind.value ~why:Row_variable)))) + (Jkind.Primitive.value ~why:Row_variable)))) in ty, mode end - | Tpat_constant _ -> - let mode = - if Ctype.is_immediate !env p.pat_type - then Value.newvar () - else mode - in - p.pat_type, mode + | Tpat_constant _ | Tpat_any | Tpat_var _ | Tpat_array _ | Tpat_lazy _ -> p.pat_type, mode @@ -1312,9 +1386,61 @@ let solve_Ppat_alias ~refine ~mode env pat = with_local_level ~post:(fun (ty_var, _) -> generalize ty_var) (fun () -> build_as_type_and_mode ~refine ~mode env pat) -let solve_Ppat_tuple (type a) ~refine ~alloc_mode loc env (args : a list) expected_ty = +(* Extracts the first element from a list matching a label. Roughly: + pat <- List.assoc_opt label patl; + return (pat, List.remove_assoc label patl) + *) +let extract_pat label patl = + let rec extract_pat_aux acc = function + | [] -> None + | ((label', t) as pat) :: rest -> + if Option.equal String.equal label label' then + Some (t, List.rev_append acc rest) + else + extract_pat_aux (pat::acc) rest + in + extract_pat_aux [] patl + +let extract_or_mk_pat label rem closed = + match extract_pat label rem, closed with + (* Take the first match from patl *) + | (Some _ as pat_and_rem), _ -> pat_and_rem + (* No match, but the partial pattern allows us to generate a _ *) + | None, Open -> Some (Ast_helper.Pat.mk Ppat_any, rem) + | None, Closed -> None + +(* Reorders [patl] to match the label order in [labeled_tl], erroring if [patl] + is missing a label or has an a extra label (unlabeled components morally + share the same special label). + + If [closed] is [Open], then no "missing label" errors are possible; instead, + [_] patterns will be generated for those labels. An unnecessarily [Open] + pattern results in a warning. + + (Note: an alternative approach to creating [_] patterns could be to add a + [closed] flag to the typedtree) + *) +let reorder_pat loc env patl closed labeled_tl expected_ty = + let take_next (taken, rem) (label, _) = + match extract_or_mk_pat label rem closed with + | Some (pat, rem) -> (label, pat) :: taken, rem + | None -> + raise (Error (loc, !env, Missing_tuple_label(label, expected_ty))) + in + match List.fold_left take_next ([], patl) labeled_tl with + | taken, [] -> + if closed = Open + && Int.equal (List.length labeled_tl) (List.length patl) then + Location.prerr_warning loc Warnings.Unnecessarily_partial_tuple_pattern; + List.rev taken + | _, (extra_label, _) :: _ -> + raise + (Error (loc, !env, Extra_tuple_label(extra_label, expected_ty))) + +(* This assumes the [args] have already been reordered according to the + [expected_ty], if needed. *) +let solve_Ppat_tuple ~refine ~alloc_mode loc env args expected_ty = let arity = List.length args in - assert (arity >= 2); let arg_modes = if List.compare_length_with alloc_mode.tuple_modes arity = 0 then alloc_mode.tuple_modes @@ -1324,11 +1450,14 @@ let solve_Ppat_tuple (type a) ~refine ~alloc_mode loc env (args : a list) expect let ann = (* CR layouts v5: restriction to value here to be relaxed. *) List.map2 - (fun p mode -> (p, newgenvar (Jkind.value ~why:Tuple_element), - simple_pat_mode mode)) + (fun (label, p) mode -> + ( label, + p, + newgenvar (Jkind.Primitive.value_or_null ~why:Tuple_element), + simple_pat_mode mode )) args arg_modes in - let ty = newgenty (Ttuple (List.map snd3 ann)) in + let ty = newgenty (Ttuple (List.map (fun (lbl, _, t, _) -> lbl, t) ann)) in let expected_ty = generic_instance expected_ty in unify_pat_types ~refine loc env ty expected_ty; ann @@ -1342,7 +1471,8 @@ let solve_constructor_annotation tps env name_list sty ty_args ty_ex = annotations on explicitly quantified vars in gadt constructors. See: https://github.com/ocaml/ocaml/pull/9584/ *) let decl = new_local_type ~loc:name.loc - (Jkind.value ~why:Existential_type_variable) in + ~jkind_annot:None + (Jkind.Primitive.value ~why:Existential_type_variable) in let (id, new_env) = Env.enter_type ~scope:expansion_scope name.txt decl !env in env := new_env; @@ -1363,9 +1493,10 @@ let solve_constructor_annotation tps env name_list sty ty_args ty_ex = unify_pat_types cty.ctyp_loc env ty1 ty_arg; [ty2] | _ -> - unify_pat_types cty.ctyp_loc env ty1 (newty (Ttuple ty_args)); + unify_pat_types cty.ctyp_loc env ty1 + (newty (Ttuple (List.map (fun t -> None, t) ty_args))); match get_desc (expand_head !env ty2) with - Ttuple tyl -> tyl + Ttuple tyl -> (List.map snd tyl) | _ -> assert false in if ids <> [] then ignore begin @@ -1416,7 +1547,10 @@ let solve_Ppat_construct ~refine tps env loc constr no_existentials (Make_existentials_abstract { env; scope = expansion_scope }) constr in - let ty_args_ty, ty_args_gf = List.split ty_args in + let ty_args_ty, ty_args_gf = + List.split + (List.map (fun ca -> ca.Types.ca_type, ca.Types.ca_modalities) ty_args) + in ty_args_ty, ty_args_gf, ty_res, unify_res ty_res expected_ty, None | Some (name_list, sty) -> let existential_treatment = @@ -1431,7 +1565,10 @@ let solve_Ppat_construct ~refine tps env loc constr no_existentials instance_constructor existential_treatment constr in let equated_types = unify_res ty_res expected_ty in - let ty_args_ty, ty_args_gf = List.split ty_args in + let ty_args_ty, ty_args_gf = + List.split + (List.map (fun ca -> ca.Types.ca_type, ca.Types.ca_modalities) ty_args) + in let ty_args_ty, existential_ctyp = solve_constructor_annotation tps env name_list sty ty_args_ty ty_ex @@ -1481,19 +1618,19 @@ let solve_Ppat_record_field ~refine loc env label label_lid record_ty = end let solve_Ppat_array ~refine loc env mutability expected_ty = - let type_some_array = match mutability with - | Immutable -> Predef.type_iarray - | Mutable -> Predef.type_array + let type_some_array = + if Types.is_mutable mutability then Predef.type_array + else Predef.type_iarray in - (* CR layouts v4: in the future we'll have arrays of other jkinds *) - let ty_elt = newgenvar (Jkind.value ~why:Array_element) in + let jkind, arg_sort = Jkind.of_new_legacy_sort_var ~why:Array_element in + let ty_elt = newgenvar jkind in let expected_ty = generic_instance expected_ty in unify_pat_types ~refine loc env (type_some_array ty_elt) expected_ty; - ty_elt + ty_elt, arg_sort let solve_Ppat_lazy ~refine loc env expected_ty = - let nv = newgenvar (Jkind.value ~why:Lazy_expression) in + let nv = newgenvar (Jkind.Primitive.value ~why:Lazy_expression) in unify_pat_types ~refine loc env (Predef.type_lazy_t nv) (generic_instance expected_ty); nv @@ -1519,19 +1656,19 @@ let solve_Ppat_variant ~refine loc env tag no_arg expected_ty = let arg_type = if no_arg then [] - else [newgenvar (Jkind.value ~why:Polymorphic_variant_field)] + else [newgenvar (Jkind.Primitive.value_or_null ~why:Polymorphic_variant_field)] in let fields = [tag, rf_either ~no_arg arg_type ~matched:true] in let make_row more = create_row ~fields ~closed:false ~more ~fixed:None ~name:None in - let row = make_row (newgenvar (Jkind.value ~why:Row_variable)) in + let row = make_row (newgenvar (Jkind.Primitive.value ~why:Row_variable)) in let expected_ty = generic_instance expected_ty in (* PR#7404: allow some_private_tag blindly, as it would not unify with the abstract row variable *) if tag <> Parmatch.some_private_tag then unify_pat_types ~refine loc env (newgenty(Tvariant row)) expected_ty; - (arg_type, make_row (newvar (Jkind.value ~why:Row_variable)), + (arg_type, make_row (newvar (Jkind.Primitive.value ~why:Row_variable)), instance expected_ty) (* Building the or-pattern corresponding to a polymorphic variant type *) @@ -1540,8 +1677,10 @@ let build_or_pat env loc lid = (* CR layouts: the use of value here is wrong: there could be other jkinds in a polymorphic variant argument; see Test 24 in tests/typing-layouts/basics_alpha.ml *) - let tyl = List.map (fun _ -> newvar (Jkind.value ~why:Type_argument)) - decl.type_params in + let arity = List.length decl.type_params in + let tyl = List.mapi (fun i _ -> + newvar (Jkind.Primitive.value ~why:(Type_argument {parent_path = path; position = i+1; arity})) + ) decl.type_params in let row0 = let ty = expand_head env (newty(Tconstr(path, tyl, ref Mnil))) in match get_desc ty with @@ -1571,10 +1710,10 @@ let build_or_pat env loc lid = create_row ~fields ~more ~closed:false ~fixed:None ~name in let ty = newty (Tvariant (make_row (newvar - (Jkind.value ~why:Row_variable)))) + (Jkind.Primitive.value ~why:Row_variable)))) in let gloc = Location.ghostify loc in - let row' = ref (make_row (newvar (Jkind.value ~why:Row_variable))) in + let row' = ref (make_row (newvar (Jkind.Primitive.value ~why:Row_variable))) in let pats = List.map (fun (l,p) -> @@ -1598,19 +1737,6 @@ let build_or_pat env loc lid = pat pats in (path, rp { r with pat_loc = loc }) -let split_cases env cases = - let add_case lst case = function - | None -> lst - | Some c_lhs -> { case with c_lhs } :: lst - in - List.fold_right (fun ({ c_lhs; c_guard } as case) (vals, exns) -> - match split_pattern c_lhs with - | Some _, Some _ when c_guard <> None -> - raise (Error (c_lhs.pat_loc, env, - Mixed_value_and_exception_patterns_under_guard)) - | vp, ep -> add_case vals case vp, add_case exns case ep - ) cases ([], []) - (* When typing a for-loop index or similar, we need to restrict ourselves to the [Ppat_any] and [Ppat_var] cases, and construct a [pattern_variable] with consistent fields. However, in the case where we're reifying a name for @@ -1625,7 +1751,7 @@ let type_for_loop_like_index ~error ~loc ~env ~param ~any ~var = any (Ident.create_local "_for", Uid.mk ~current_unit:(Env.get_unit_name ())) | Ppat_var name -> var ~name - ~pv_mode:Value.min_mode + ~pv_mode:Value.min ~pv_type:(instance Predef.type_int) ~pv_loc:loc ~pv_as_var:false @@ -1653,7 +1779,7 @@ let type_for_loop_index ~loc ~env ~param = let pv_id = Ident.create_local txt in let pv_uid = Uid.mk ~current_unit:(Env.get_unit_name ()) in let pv = - { pv_id; pv_uid; pv_mode; pv_type; pv_loc; pv_as_var; pv_attributes } + { pv_id; pv_uid; pv_mode=Value.disallow_right pv_mode; pv_type; pv_loc; pv_as_var; pv_attributes } in (pv_id, pv_uid), add_pattern_variables ~check ~check_as:check env [pv]) @@ -1939,7 +2065,8 @@ module Label = NameChoice (struct Env.lookup_all_labels_from_type ~loc usage path env let in_env lbl = match lbl.lbl_repres with - | Record_boxed _ | Record_float | Record_ufloat | Record_unboxed -> true + | Record_boxed _ | Record_float | Record_ufloat | Record_unboxed + | Record_mixed _ -> true | Record_inlined _ -> false end) @@ -1969,7 +2096,7 @@ let disambiguate_label_by_ids closed ids labels : (_, _) result = Ok labels (* Only issue warnings once per record constructor/pattern *) -let disambiguate_lid_a_list loc closed env usage expected_type lid_a_list = +let disambiguate_sort_lid_a_list loc closed env usage expected_type lid_a_list = let ids = List.map (fun (lid, _) -> Longident.last lid.txt) lid_a_list in let w_pr = ref false and w_amb = ref [] and w_scope = ref [] and w_scope_ty = ref "" in @@ -2057,24 +2184,15 @@ let disambiguate_lid_a_list loc closed env usage expected_type lid_a_list = if !w_scope <> [] then Location.prerr_warning loc (Warnings.Name_out_of_scope (!w_scope_ty, List.rev !w_scope, true)); - lbl_a_list + (* Invariant: records are sorted in the typed tree *) + List.sort + (fun (_,lbl1,_) (_,lbl2,_) -> compare lbl1.lbl_num lbl2.lbl_num) + lbl_a_list let map_fold_cont f xs k = List.fold_right (fun x k ys -> f x (fun y -> k (y :: ys))) xs (fun ys -> k (List.rev ys)) [] -let type_label_a_list loc closed env usage type_lbl_a expected_type lid_a_list = - let lbl_a_list = - disambiguate_lid_a_list loc closed env usage expected_type lid_a_list - in - (* Invariant: records are sorted in the typed tree *) - let lbl_a_list = - List.sort - (fun (_,lbl1,_) (_,lbl2,_) -> compare lbl1.lbl_num lbl2.lbl_num) - lbl_a_list - in - List.map type_lbl_a lbl_a_list - (* Checks over the labels mentioned in a record pattern: no duplicate definitions (error); properly closed (warning) *) @@ -2131,19 +2249,39 @@ end) (* Typing of patterns *) -(* "half typed" cases are produced in [type_cases] when we've just typechecked - the pattern but haven't type-checked the body yet. - At this point we might have added some type equalities to the environment, - but haven't yet added identifiers bound by the pattern. *) -type 'case_pattern half_typed_case = +(* "untyped" cases are prior to checking the pattern. *) +type untyped_case = Parsetree.pattern Parmatch.parmatch_case + +(* "half typed" cases are produced in [map_half_typed_cases] when we've just + typechecked the pattern but haven't type-checked the body yet. At this point + we might have added some type equalities to the environment, but haven't yet + added identifiers bound by the pattern. *) +type ('case_pattern, 'case_data) half_typed_case = { typed_pat: 'case_pattern; pat_type_for_unif: type_expr; - untyped_case: Parsetree.case; + untyped_case: untyped_case; + case_data : 'case_data; branch_env: Env.t; pat_vars: pattern_variable list; module_vars: module_variables; contains_gadt: bool; } +(* Used to split patterns into value cases and exception cases. *) +let split_half_typed_cases env zipped_cases = + let add_case lst htc data = function + | None -> lst + | Some split_pat -> + ({ htc.untyped_case with pattern = split_pat }, data) :: lst + in + List.fold_right (fun (htc, data) (vals, exns) -> + let pat = htc.typed_pat in + match split_pattern pat with + | Some _, Some _ when htc.untyped_case.has_guard -> + raise (Error (pat.pat_loc, env, + Mixed_value_and_exception_patterns_under_guard)) + | vp, ep -> add_case vals htc data vp, add_case exns htc data ep + ) zipped_cases ([], []) + let rec has_literal_pattern p = match Jane_syntax.Pattern.of_ast p with | Some (jpat, _attrs) -> has_literal_pattern_jane_syntax jpat @@ -2178,6 +2316,8 @@ and has_literal_pattern_jane_syntax : Jane_syntax.Pattern.t -> _ = function | Jpat_immutable_array (Iapat_immutable_array ps) -> List.exists has_literal_pattern ps | Jpat_layout (Lpat_constant _) -> true + | Jpat_tuple (labeled_ps, _) -> + List.exists (fun (_, p) -> has_literal_pattern p) labeled_ps let check_scope_escape loc env level ty = try Ctype.check_scope_escape env level ty @@ -2279,20 +2419,52 @@ and type_pat_aux keep them in sync, at the cost of a worse diff with upstream; it shouldn't be too bad. We can inline this when we upstream this code and combine the two array pattern constructors. *) - let ty_elt = solve_Ppat_array ~refine loc env mutability expected_ty in - let alloc_mode = - match mutability with - | Mutable -> simple_pat_mode Value.legacy - | Immutable -> alloc_mode + let ty_elt, arg_sort = solve_Ppat_array ~refine loc env mutability expected_ty in + let modalities = + if Types.is_mutable mutability then Typemode.mutable_implied_modalities + else Modality.Value.Const.id in + check_project_mutability ~loc ~env:!env mutability alloc_mode.mode; + let alloc_mode = Modality.Value.Const.apply modalities alloc_mode.mode in + let alloc_mode = simple_pat_mode alloc_mode in let pl = List.map (fun p -> type_pat ~alloc_mode tps Value p ty_elt) spl in rvp { - pat_desc = Tpat_array (mutability, pl); + pat_desc = Tpat_array (mutability, arg_sort, pl); pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; pat_attributes; pat_env = !env } in + let type_tuple_pat spl closed = + let args = + match get_desc (expand_head !env expected_ty) with + (* If it's a principally-known tuple pattern, try to reorder *) + | Ttuple labeled_tl when is_principal expected_ty -> + reorder_pat loc env spl closed labeled_tl expected_ty + (* If not, it's not allowed to be open (partial) *) + | _ -> + match closed with + | Open -> raise (Error (loc, !env, Partial_tuple_pattern_bad_type)) + | Closed -> spl + in + let spl_ann = + solve_Ppat_tuple ~refine ~alloc_mode loc env args expected_ty + in + let pl = + List.map (fun (lbl, p, t, alloc_mode) -> + lbl, type_pat tps Value ~alloc_mode p t) + spl_ann + in + rvp { + pat_desc = Tpat_tuple pl; + pat_loc = loc; pat_extra=[]; + pat_type = newty (Ttuple (List.map (fun (lbl, p) -> lbl, p.pat_type) pl)); + pat_attributes = sp.ppat_attributes; + pat_env = !env } + in + match Jane_syntax.Mode_expr.maybe_of_attrs sp.ppat_attributes with + | Some modes, _ -> raise (Error (modes.loc, !env, Modes_on_pattern)) + | None, _ -> match Jane_syntax.Pattern.of_ast sp with | Some (jpat, attrs) -> begin (* Normally this would go to an auxiliary function, but this function @@ -2303,13 +2475,15 @@ and type_pat_aux | Jpat_immutable_array (Iapat_immutable_array spl) -> type_pat_array Immutable spl attrs | Jpat_layout (Lpat_constant cst) -> - let desc = unboxed_constant_or_raise !env loc cst in + let cst = unboxed_constant_or_raise !env loc cst in rvp @@ solve_expected { - pat_desc = desc; + pat_desc = Tpat_constant cst; pat_loc = loc; pat_extra=[]; - pat_type = type_constant_unboxed !env loc cst; + pat_type = type_constant cst; pat_attributes = attrs; pat_env = !env } + | Jpat_tuple (spl, closed) -> + type_tuple_pat spl closed end | None -> match sp.ppat_desc with @@ -2322,7 +2496,7 @@ and type_pat_aux pat_env = !env } | Ppat_var name -> let ty = instance expected_ty in - let alloc_mode = mode_cross_to_min !env expected_ty alloc_mode.mode in + let alloc_mode = mode_cross_left !env expected_ty alloc_mode.mode in let id, uid = enter_variable tps loc name alloc_mode ty sp.ppat_attributes in @@ -2361,7 +2535,7 @@ and type_pat_aux | Ppat_alias(sq, name) -> let q = type_pat tps Value sq expected_ty in let ty_var, mode = solve_Ppat_alias ~refine ~mode:alloc_mode.mode env q in - let mode = mode_cross_to_min !env expected_ty mode in + let mode = mode_cross_left !env expected_ty mode in let id, uid = enter_variable ~is_as_variable:true tps name.loc name mode ty_var sp.ppat_attributes @@ -2396,19 +2570,7 @@ and type_pat_aux | Ppat_interval _ -> raise (Error (loc, !env, Invalid_interval)) | Ppat_tuple spl -> - let spl_ann = - solve_Ppat_tuple ~refine ~alloc_mode loc env spl expected_ty - in - let pl = - List.map (fun (p,t,alloc_mode) -> type_pat tps Value ~alloc_mode p t) - spl_ann - in - rvp { - pat_desc = Tpat_tuple pl; - pat_loc = loc; pat_extra=[]; - pat_type = newty (Ttuple(List.map (fun p -> p.pat_type) pl)); - pat_attributes = sp.ppat_attributes; - pat_env = !env } + type_tuple_pat (List.map (fun sp -> None, sp) spl) Closed | Ppat_construct(lid, sarg) -> let expected_type = match extract_concrete_variant !env expected_ty with @@ -2449,19 +2611,28 @@ and type_pat_aux let sargs = match sarg' with None -> [] - | Some {ppat_desc = Ppat_tuple spl} when + | Some sarg' -> + match Jane_syntax.Pattern.of_ast sarg' with + | Some (Jpat_tuple (_, _), attrs) when + constr.cstr_arity > 1 || Builtin_attributes.explicit_arity attrs + -> raise (Error(loc, !env, Constructor_labeled_arg)) + | Some ((Jpat_immutable_array _, _) + | (Jpat_layout _, _) + | (Jpat_tuple _, _)) -> [sarg'] + | None -> match sarg' with + | {ppat_desc = Ppat_tuple spl} as sp when constr.cstr_arity > 1 || Builtin_attributes.explicit_arity sp.ppat_attributes -> spl - | Some({ppat_desc = Ppat_any} as sp) when + | {ppat_desc = Ppat_any} as sp when constr.cstr_arity = 0 && existential_styp = None -> Location.prerr_warning sp.ppat_loc Warnings.Wildcard_arg_to_constant_constr; [] - | Some({ppat_desc = Ppat_any} as sp) when constr.cstr_arity > 1 -> + | {ppat_desc = Ppat_any} as sp when constr.cstr_arity > 1 -> replicate_list sp constr.cstr_arity - | Some sp -> [sp] in + | sp -> [sp] in if Builtin_attributes.warn_on_literal_pattern constr.cstr_attributes then begin match List.filter has_literal_pattern sargs with | sp :: _ -> @@ -2497,7 +2668,7 @@ and type_pat_aux let args = List.map2 (fun p (ty, gf) -> - let alloc_mode = modality_unbox_left gf alloc_mode.mode in + let alloc_mode = Modality.Value.Const.apply gf alloc_mode.mode in let alloc_mode = simple_pat_mode alloc_mode in type_pat ~alloc_mode tps Value p ty) sargs (List.combine ty_args_ty ty_args_gf) @@ -2532,7 +2703,7 @@ and type_pat_aux let ty = generic_instance expected_ty in Some (p0, p, is_principal expected_ty), ty | Maybe_a_record_type -> - None, newvar (Jkind.value ~why:Boxed_record) + None, newvar (Jkind.Primitive.value ~why:Boxed_record) | Not_a_record_type -> let error = Wrong_expected_kind(Record, Pattern, expected_ty) in raise (Error (loc, !env, error)) @@ -2540,10 +2711,11 @@ and type_pat_aux let type_label_pat (label_lid, label, sarg) = let ty_arg = solve_Ppat_record_field ~refine loc env label label_lid record_ty in - let alloc_mode = - modality_unbox_left label.lbl_global alloc_mode.mode + check_project_mutability ~loc ~env:!env label.lbl_mut alloc_mode.mode; + let mode = + Modality.Value.Const.apply label.lbl_modalities alloc_mode.mode in - let alloc_mode = simple_pat_mode alloc_mode in + let alloc_mode = simple_pat_mode mode in (label_lid, label, type_pat tps Value ~alloc_mode sarg ty_arg) in let make_record_pat lbl_pat_list = @@ -2559,13 +2731,14 @@ and type_pat_aux let lbl_a_list = wrap_disambiguate "This record pattern is expected to have" (mk_expected expected_ty) - (type_label_a_list loc false !env Env.Projection - type_label_pat expected_type) + (disambiguate_sort_lid_a_list loc false !env Env.Projection expected_type) lid_sp_list in + let lbl_a_list = List.map type_label_pat lbl_a_list in rvp @@ solve_expected (make_record_pat lbl_a_list) | Ppat_array spl -> - type_pat_array Mutable spl sp.ppat_attributes + type_pat_array (Mutable Alloc.Comonadic.Const.legacy) + spl sp.ppat_attributes | Ppat_or(sp1, sp2) -> (* Reset pattern forces for just [tps2] because later we append [tps1] and [tps2]'s pattern forces, and we don't want to @@ -2634,10 +2807,7 @@ and type_pat_aux | Ppat_constraint(sp_constrained, sty) -> (* Pretend separate = true *) let cty, ty, expected_ty' = - let mode_annots = mode_annots_from_pat_attrs sp in - let type_modes = - mode_annots_or_default mode_annots ~default:Alloc.Const.legacy - in + let type_modes, sty = alloc_mode_from_ppat_constraint_typ_attrs sty in solve_Ppat_constraint ~refine tps loc env type_modes sty expected_ty in let p = type_pat ~alloc_mode tps category sp_constrained expected_ty' in @@ -2714,7 +2884,7 @@ let type_class_arg_pattern cl_num val_env met_env l spat = let pvs, pat = with_local_level_if_principal begin fun () -> let tps = create_type_pat_state Modules_rejected in - let nv = newvar (Jkind.value ~why:Class_argument) in + let nv = newvar (Jkind.Primitive.value ~why:Class_term_argument) in let alloc_mode = simple_pat_mode Value.legacy in let pat = type_pat tps Value ~no_existentials:In_class_args ~alloc_mode @@ -2727,7 +2897,7 @@ let type_class_arg_pattern cl_num val_env met_env l spat = (* CR layouts v5: value restriction here to be relaxed *) if is_optional l then unify_pat (ref val_env) pat - (type_option (newvar (Jkind.value ~why:Type_argument))); + (type_option (newvar Predef.option_argument_jkind)); tps.tps_pattern_variables, pat end ~post:(fun (pvs, _) -> iter_pattern_variables_type generalize_structure @@ -2742,20 +2912,24 @@ let type_class_arg_pattern cl_num val_env met_env l spat = else Warnings.Unused_var_strict s in let id' = Ident.rename pv_id in let val_env = - Env.add_value pv_id + Env.add_value ~mode:Mode.Value.legacy pv_id { val_type = pv_type ; val_kind = Val_reg ; val_attributes = pv_attributes + ; val_zero_alloc = Zero_alloc.default + ; val_modalities = Modality.Value.id ; val_loc = pv_loc ; val_uid = pv_uid } val_env in let met_env = - Env.add_value id' ~check + Env.add_value ~mode:Mode.Value.legacy id' ~check { val_type = pv_type ; val_kind = Val_ivar (Immutable, cl_num) ; val_attributes = pv_attributes + ; val_zero_alloc = Zero_alloc.default + ; val_modalities = Modality.Value.id ; val_loc = pv_loc ; val_uid = pv_uid } @@ -2770,7 +2944,7 @@ let type_self_pattern env spat = let open Ast_helper in let spat = Pat.mk(Ppat_alias (spat, mknoloc "selfpat-*")) in let tps = create_type_pat_state Modules_rejected in - let nv = newvar (Jkind.value ~why:Object) in + let nv = newvar (Jkind.Primitive.value ~why:Object) in let alloc_mode = simple_pat_mode Value.legacy in let pat = type_pat tps Value ~no_existentials:In_self_pattern ~alloc_mode @@ -2808,9 +2982,11 @@ let rec pat_tuple_arity spat = | Ppat_or(sp1, sp2) -> combine_pat_tuple_arity (pat_tuple_arity sp1) (pat_tuple_arity sp2) | Ppat_constraint(p, _) | Ppat_open(_, p) | Ppat_alias(p, _) -> pat_tuple_arity p + and pat_tuple_arity_jane_syntax : Jane_syntax.Pattern.t -> _ = function | Jpat_immutable_array (Iapat_immutable_array _) -> Not_local_tuple | Jpat_layout (Lpat_constant _) -> Not_local_tuple + | Jpat_tuple (args, _) -> Local_tuple (List.length args) let rec cases_tuple_arity cases = match cases with @@ -2982,7 +3158,7 @@ let rec check_counter_example_pat check_counter_example_pat ~info ~env type_pat_state in let loc = tp.pat_loc in let refine = Some true in - let alloc_mode = simple_pat_mode Value.min_mode in + let alloc_mode = simple_pat_mode Value.min in let solve_expected (x : pattern) : pattern = unify_pat ~refine env x (instance expected_ty); x @@ -3017,17 +3193,23 @@ let rec check_counter_example_pat end | Tpat_alias (p, _, _, _, _) -> check_rec ~info p expected_ty k | Tpat_constant cst -> - let cst = constant_or_raise !env loc (Untypeast.constant cst) in + let cst = + match Untypeast.constant cst with + | `Parsetree cst -> constant_or_raise !env loc cst + | `Jane_syntax cst -> unboxed_constant_or_raise !env loc cst + in k @@ solve_expected (mp (Tpat_constant cst) ~pat_type:(type_constant cst)) | Tpat_tuple tpl -> let tpl_ann = solve_Ppat_tuple ~refine ~alloc_mode loc env tpl expected_ty in - map_fold_cont (fun (p,t,_) -> check_rec p t) tpl_ann + map_fold_cont (fun (l,p,t,_) k -> check_rec p t (fun p -> k (l, p))) + tpl_ann (fun pl -> mkp k (Tpat_tuple pl) - ~pat_type:(newty (Ttuple(List.map (fun p -> p.pat_type) pl)))) + ~pat_type:(newty (Ttuple (List.map (fun (l,p) -> (l,p.pat_type)) + pl)))) | Tpat_construct(cstr_lid, constr, targs, _) -> if constr.cstr_generalized && must_backtrack_on_gadt then raise Need_backtrack; @@ -3061,10 +3243,11 @@ let rec check_counter_example_pat in map_fold_cont type_label_pat fields (fun fields -> mkp k (Tpat_record (fields, closed))) - | Tpat_array (mut, tpl) -> - let ty_elt = solve_Ppat_array ~refine loc env mut expected_ty in + | Tpat_array (mut, original_arg_sort, tpl) -> + let ty_elt, arg_sort = solve_Ppat_array ~refine loc env mut expected_ty in + assert (Jkind.Sort.equate original_arg_sort arg_sort); map_fold_cont (fun p -> check_rec p ty_elt) tpl - (fun pl -> mkp k (Tpat_array (mut, pl))) + (fun pl -> mkp k (Tpat_array (mut, arg_sort, pl))) | Tpat_or(tp1, tp2, _) -> (* We are in counter-example mode, but try to avoid backtracking *) let must_split = @@ -3228,27 +3411,27 @@ type untyped_apply_arg = ty_arg0 : type_expr; sort_arg : Jkind.sort; commuted : bool; - mode_fun : Alloc.t; - mode_arg : Alloc.t; + mode_fun : Alloc.lr; + mode_arg : Alloc.lr; wrapped_in_some : bool; } | Unknown_arg of { sarg : Parsetree.expression; ty_arg_mono : type_expr; sort_arg : Jkind.sort; - mode_fun : Alloc.t; - mode_arg : Alloc.t} + mode_fun : Alloc.lr; + mode_arg : Alloc.lr} | Eliminated_optional_arg of - { mode_fun: Alloc.t; + { expected_label: arg_label; + mode_fun: Alloc.lr; ty_arg : type_expr; sort_arg : Jkind.sort; - mode_arg : Alloc.t; - level: int; - next_arg_loc: Location.t option } + mode_arg : Alloc.lr; + level: int; } type untyped_omitted_param = - { mode_fun: Alloc.t; + { mode_fun: Alloc.lr; ty_arg : type_expr; - mode_arg : Alloc.t; + mode_arg : Alloc.lr; level: int; sort_arg : Jkind.sort } @@ -3269,15 +3452,15 @@ let remaining_function_type ty_ret mode_ret rev_args = let closed_args = mode_arg :: closed_args in (ty_ret, mode_ret, closed_args) | Arg (Eliminated_optional_arg - { mode_fun; ty_arg; mode_arg; level }) + { mode_fun; ty_arg; mode_arg; level; _ }) | Omitted { mode_fun; ty_arg; mode_arg; level } -> let arrow_desc = lbl, mode_arg, mode_ret in let ty_ret = newty2 ~level (Tarrow (arrow_desc, ty_arg, ty_ret, commu_ok)) in - let mode_ret = - Alloc.join (mode_fun :: closed_args) + let mode_ret, _ = + Alloc.newvar_above (Alloc.join (mode_fun :: closed_args)) in (ty_ret, mode_ret, closed_args)) (ty_ret, mode_ret, []) rev_args @@ -3342,7 +3525,7 @@ let check_local_application_complete ~env ~app_loc args = let collect_unknown_apply_args env funct ty_fun mode_fun rev_args sargs ret_tvar = let labels_match ~param ~arg = param = arg - || !Clflags.classic && arg = Nolabel && not (is_optional param) + || !Clflags.classic && arg = Nolabel && not (is_omittable param) in let has_label l ty_fun = let ls, tvar = list_labels env ty_fun in @@ -3397,15 +3580,19 @@ let collect_unknown_apply_args env funct ty_fun mode_fun rev_args sargs ret_tvar (* [rev_args] is the arguments typed until now, in reverse order of appearance. Not all arguments have a location attached (eg. an optional argument that is not passed). *) + (* CR ccasinghino: the above comment is confusing - these + arguments are in reverse order according to the function + type, but not according to their positions in the source + program. We diverge from upstream here by not trying to + provide a good location in the [Eliminated_optional_arg] + case - maybe fix one day if it is noticeable. *) rev_args |> List.find_map (function | (_, Arg ( Known_arg { sarg; _ } | Unknown_arg { sarg; _ })) -> Some sarg.pexp_loc - | (_, - Arg (Eliminated_optional_arg { next_arg_loc })) -> - next_arg_loc + | (_, Arg (Eliminated_optional_arg _)) | (_, Omitted _) -> None) |> Option.value ~default:funct.exp_loc in @@ -3453,7 +3640,8 @@ let collect_apply_args env funct ignore_labels ty_fun ty_fun0 mode_fun sargs ret Function_type_not_rep(ty_arg, err))) in let name = label_name l - and optional = is_optional l in + and optional = is_optional l + and omittable = is_omittable l in let use_arg ~commuted sarg l' = let wrapped_in_some = optional && not (is_optional l') in if wrapped_in_some then @@ -3463,13 +3651,13 @@ let collect_apply_args env funct ignore_labels ty_fun ty_fun0 mode_fun sargs ret { sarg; ty_arg; ty_arg0; commuted; sort_arg; mode_fun; mode_arg; wrapped_in_some }) in - let eliminate_optional_arg next_arg_loc = + let eliminate_omittable_arg expected_label = may_warn funct.exp_loc - (Warnings.Non_principal_labels "eliminated optional argument"); + (Warnings.Non_principal_labels "eliminated omittable argument"); Arg (Eliminated_optional_arg - { mode_fun; ty_arg; mode_arg; sort_arg; level = lv; - next_arg_loc }) + { mode_fun; ty_arg; mode_arg + ; sort_arg; level = lv; expected_label}) in let remaining_sargs, arg = if ignore_labels then begin @@ -3477,19 +3665,19 @@ let collect_apply_args env funct ignore_labels ty_fun ty_fun0 mode_fun sargs ret match sargs with | [] -> assert false | (l', sarg) :: remaining_sargs -> - if name = label_name l' || (not optional && l' = Nolabel) then + if name = label_name l' || (not omittable && l' = Nolabel) then (remaining_sargs, use_arg ~commuted:false sarg l') else if - optional && + omittable && not (List.exists (fun (l, _) -> name = label_name l) remaining_sargs) && List.exists (function (Nolabel, _) -> true | _ -> false) sargs then - (sargs, eliminate_optional_arg (Some sarg.pexp_loc)) + (sargs, eliminate_omittable_arg l) else raise(Error(sarg.pexp_loc, env, - Apply_wrong_label(l', ty_fun', optional))) + Apply_wrong_label(l', ty_fun', omittable))) end else (* Arguments can be commuted, try to fetch the argument corresponding to the first parameter. *) @@ -3499,14 +3687,24 @@ let collect_apply_args env funct ignore_labels ty_fun ty_fun0 mode_fun sargs ret may_warn sarg.pexp_loc (Warnings.Not_principal "commuting this argument") end; - if not optional && is_optional l' then - Location.prerr_warning sarg.pexp_loc - (Warnings.Nonoptional_label (Printtyp.string_of_label l)); + if not optional && is_optional l' then ( + let label = Printtyp.string_of_label l in + if is_position l + then + raise + (Error + ( sarg.pexp_loc + , env + , Nonoptional_call_pos_label label)) + else + Location.prerr_warning + sarg.pexp_loc + (Warnings.Nonoptional_label label)); remaining_sargs, use_arg ~commuted sarg l' | None -> sargs, - if optional && List.mem_assoc Nolabel sargs then - eliminate_optional_arg None + if omittable && List.mem_assoc Nolabel sargs then + eliminate_omittable_arg l else begin (* No argument was given for this parameter, we abstract over it. *) @@ -3526,8 +3724,8 @@ let type_omitted_parameters expected_mode env ty_ret mode_ret args = List.fold_left (fun (ty_ret, mode_ret, open_args, closed_args, args) (lbl, arg) -> match arg with - | Arg (exp, exp_mode, sort) -> - let open_args = (exp_mode, exp) :: open_args in + | Arg (exp, marg, sort) -> + let open_args = (exp, marg) :: open_args in let args = (lbl, Arg (exp, sort)) :: args in (ty_ret, mode_ret, open_args, closed_args, args) | Omitted { mode_fun; ty_arg; mode_arg; level; sort_arg } -> @@ -3538,10 +3736,10 @@ let type_omitted_parameters expected_mode env ty_ret mode_ret args = in let new_closed_args = List.map - (fun (marg, exp) -> + (fun (exp, marg) -> submode ~loc:exp.exp_loc ~env ~reason:Other marg (mode_partial_application expected_mode); - Value.regional_to_local_alloc marg) + value_to_alloc_r2l marg) open_args in let closed_args = new_closed_args @ closed_args in @@ -3553,7 +3751,12 @@ let type_omitted_parameters expected_mode env ty_ret mode_ret args = (mode_partial_fun:: mode_closed_args)) in register_allocation_mode mode_closure; - let arg = Omitted { mode_closure; mode_arg; mode_ret; sort_arg } in + let arg = + Omitted { + mode_closure = Alloc.disallow_left mode_closure; + mode_arg = Alloc.disallow_right mode_arg; + mode_ret = Alloc.disallow_right mode_ret; sort_arg } + in let args = (lbl, arg) :: args in (ty_ret, mode_closure, open_args, closed_args, args)) (ty_ret, mode_ret, [], [], []) (List.rev args) @@ -3569,11 +3772,12 @@ let rec is_nonexpansive exp = | Texp_unreachable | Texp_function _ | Texp_probe_is_enabled _ - | Texp_array (_, [], _) -> true + | Texp_src_pos + | Texp_array (_, _, [], _) -> true | Texp_let(_rec_flag, pat_exp_list, body) -> List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list && is_nonexpansive body - | Texp_apply(e, (_,Omitted _)::el, _, _) -> + | Texp_apply(e, (_,Omitted _)::el, _, _, _) -> is_nonexpansive e && List.for_all is_nonexpansive_arg (List.map snd el) | Texp_match(e, _, cases, _) -> (* Not sure this is necessary, if [e] is nonexpansive then we shouldn't @@ -3593,7 +3797,7 @@ let rec is_nonexpansive exp = ) cases | Texp_probe {handler} -> is_nonexpansive handler | Texp_tuple (el, _) -> - List.for_all is_nonexpansive el + List.for_all (fun (_,e) -> is_nonexpansive e) el | Texp_construct(_, _, el, _) -> List.for_all is_nonexpansive el | Texp_variant(_, arg) -> is_nonexpansive_opt (Option.map fst arg) @@ -3606,7 +3810,7 @@ let rec is_nonexpansive exp = | Kept _ -> true) fields && is_nonexpansive_opt extended_expression - | Texp_field(exp, _, _, _, _) -> is_nonexpansive exp + | Texp_field(exp, _, _, _) -> is_nonexpansive exp | Texp_ifthenelse(_cond, ifso, ifnot) -> is_nonexpansive ifso && is_nonexpansive_opt ifnot | Texp_sequence (_e1, _jkind, e2) -> is_nonexpansive e2 (* PR#4354 *) @@ -3627,7 +3831,7 @@ let rec is_nonexpansive exp = | Tcf_inherit _ -> false | Tcf_attribute _ -> true) fields && - Vars.fold (fun _ (mut,_,_) b -> decr count; b && mut = Immutable) + Vars.fold (fun _ (mut,_,_) b -> decr count; b && mut = Asttypes.Immutable) vars true && !count = 0 | Texp_letmodule (_, _, _, mexp, e) @@ -3646,9 +3850,9 @@ let rec is_nonexpansive exp = Val_prim {Primitive.prim_name = ("%raise" | "%reraise" | "%raise_notrace")}}, Id_prim _, _) }, - [Nolabel, Arg (e, _)], _, _) -> + [Nolabel, Arg (e, _)], _, _, _) -> is_nonexpansive e - | Texp_array (_, _ :: _, _) + | Texp_array (_, _, _ :: _, _) | Texp_apply _ | Texp_try _ | Texp_setfield _ @@ -3710,24 +3914,26 @@ and is_nonexpansive_arg = function let maybe_expansive e = not (is_nonexpansive e) -let check_recursive_bindings env valbinds = +let annotate_recursive_bindings env valbinds = let ids = let_bound_idents valbinds in - List.iter - (fun {vb_expr} -> - if not (Rec_check.is_valid_recursive_expression ids vb_expr) then + List.map + (fun {vb_pat; vb_expr; vb_rec_kind = _; vb_sort; vb_attributes; vb_loc} -> + match (Value_rec_check.is_valid_recursive_expression ids vb_expr) with + | None -> raise(Error(vb_expr.exp_loc, env, Illegal_letrec_expr)) - ) + | Some vb_rec_kind -> + { vb_pat; vb_expr; vb_rec_kind; vb_sort; vb_attributes; vb_loc}) valbinds let check_recursive_class_bindings env ids exprs = List.iter (fun expr -> - if not (Rec_check.is_valid_class_expr ids expr) then + if not (Value_rec_check.is_valid_class_expr ids expr) then raise(Error(expr.cl_loc, env, Illegal_class_expr))) exprs module Is_local_returning : sig - val function_ : Parsetree.case list -> bool + val function_body : Jane_syntax.N_ary_functions.function_body -> bool end = struct (* Is the return value annotated with "local_"? @@ -3764,24 +3970,20 @@ end = struct | Jexp_layout (Lexp_constant _) -> Not e.pexp_loc | Jexp_layout (Lexp_newtype (_, _, e)) -> loop e | Jexp_n_ary_function _ -> Not e.pexp_loc + | Jexp_tuple _ -> Not e.pexp_loc + | Jexp_modes (Coerce (modes, exp)) -> + if List.exists + (fun m -> + let {txt; _} = + (m : Jane_syntax.Mode_expr.Const.t :> _ Location.loc) + in + txt = "local") + modes.txt + then Local e.pexp_loc + else loop exp end | None -> match e.pexp_desc with - | Pexp_apply - ({ pexp_desc = Pexp_extension( - {txt = "extension.local"|"ocaml.local"|"local"}, PStr []) }, - [Nolabel, _]) -> - Local e.pexp_loc - | Pexp_apply - ({ pexp_desc = Pexp_extension( - {txt = "extension.unique"|"ocaml.unique"|"unique"}, PStr []) }, - [Nolabel, exp]) -> - loop exp - | Pexp_apply - ({ pexp_desc = Pexp_extension( - {txt = "extension.once" | "ocaml.once" | "once"}, PStr []) }, - [Nolabel, exp]) -> - loop exp | Pexp_assert { pexp_desc = Pexp_construct ({ txt = Lident "false" }, None) } -> Either @@ -3813,67 +4015,32 @@ end = struct in loop e - let function_ cases = - let rec loop_cases cases = - match cases with - | [] -> Either - | [{pc_lhs = _; pc_guard = None; pc_rhs = e}] -> - loop_body e - | case :: cases -> - let is_local_returning_case case = - expr case.pc_rhs - in - List.fold_left - (fun acc case -> combine acc (is_local_returning_case case)) - (is_local_returning_case case) cases - and loop_body e = - if Builtin_attributes.has_curry e.pexp_attributes then - expr e - else begin - match Jane_syntax.Expression.of_ast e with - | Some (jexp, _attrs) -> begin - match jexp with - | Jexp_n_ary_function (_, _, Pfunction_cases (cases, _, _)) -> - loop_cases cases - | Jexp_n_ary_function (_, _, Pfunction_body body) -> - loop_body body - | Jexp_comprehension _ | Jexp_immutable_array _ -> - expr e - | Jexp_layout (Lexp_constant _) -> - Not e.pexp_loc - | Jexp_layout (Lexp_newtype (_, _, body)) -> - loop_body body - end - | None -> match e.pexp_desc, e.pexp_attributes with - | Pexp_fun(_, _, _, e), _ -> loop_body e - | Pexp_function cases, _ -> loop_cases cases - | Pexp_constraint (e, _), _ -> loop_body e - | Pexp_let (Nonrecursive, _, e), - [{Parsetree.attr_name = {txt="#default"};_}] -> loop_body e - | _ -> expr e - end - in - match loop_cases cases with + let cases cs = + match cs with + | [] -> Either + | case :: cases -> + let is_local_returning_case case = + expr case.pc_rhs + in + List.fold_left + (fun acc case -> combine acc (is_local_returning_case case)) + (is_local_returning_case case) cases + + let function_body (body : Jane_syntax.N_ary_functions.function_body) = + match body with + | Pfunction_body body -> expr body + | Pfunction_cases (cs, _, _) -> cases cs + + let is_strictly_local = function | Local _ -> true | Either | Not _ -> false - (* [fun _ -> assert false] must not be local-returning for - backward compatibility *) -end + (* [fun _ -> assert false] must not be local-returning for + backward compatibility *) -let rec is_an_uncurried_function e = - if Builtin_attributes.has_curry e.pexp_attributes then false - else begin - match e.pexp_desc, e.pexp_attributes with - | (Pexp_fun _ | Pexp_function _), _ -> true - | Pexp_poly (e, _), _ - | Pexp_newtype (_, e), _ (* also works correctly for Lexp_newtype *) - | Pexp_coerce (e, _, _), _ - | Pexp_constraint (e, _), _ -> is_an_uncurried_function e - | Pexp_let (Nonrecursive, _, e), - [{Parsetree.attr_name = {txt="#default"};_}] -> - is_an_uncurried_function e - | _ -> false - end + (* for exporting from this module *) + + let function_body body = is_strictly_local (function_body body) +end (* The "rest of the function" extends from the start of the first parameter to the end of the overall function. The parser does not construct such @@ -3898,7 +4065,7 @@ let loc_rest_of_function (which mentions approx_type) for why it can't be value. *) (* CR layouts v2: RAE thinks this any is fine in perpetuity. Before changing this, let's talk. *) -let approx_type_default () = newvar (Jkind.any ~why:Dummy_jkind) +let approx_type_default () = newvar (Jkind.Primitive.any ~why:Dummy_jkind) let rec approx_type env sty = match Jane_syntax.Core_type.of_ast sty with @@ -3906,15 +4073,16 @@ let rec approx_type env sty = | None -> match sty.ptyp_desc with | Ptyp_arrow (p, ({ ptyp_desc = Ptyp_poly _ } as arg_sty), sty) -> + let p = Typetexp.transl_label p (Some arg_sty) in (* CR layouts v5: value requirement here to be relaxed *) - if is_optional p then newvar (Jkind.value ~why:Type_argument) + if is_optional p then newvar Predef.option_argument_jkind else begin let arg_mode = Typetexp.get_alloc_mode arg_sty in let arg_ty = (* Polymorphic types will only unify with types that match all of their polymorphic parts, so we need to fully translate the type here unlike in the monomorphic case *) - Typetexp.transl_simple_type env ~closed:false arg_mode arg_sty + Typetexp.transl_simple_type ~new_var_jkind:Any env ~closed:false arg_mode arg_sty in let ret = approx_type env sty in let marg = Alloc.of_const arg_mode in @@ -3923,35 +4091,41 @@ let rec approx_type env sty = end | Ptyp_arrow (p, arg_sty, sty) -> let arg_mode = Typetexp.get_alloc_mode arg_sty in + let p = Typetexp.transl_label p (Some arg_sty) in let arg = if is_optional p - then type_option (newvar (Jkind.value ~why:Type_argument)) - else newvar (Jkind.of_new_sort ~why:Function_argument) + then type_option (newvar Predef.option_argument_jkind) + else newvar (Jkind.Primitive.any ~why:Inside_of_Tarrow) in let ret = approx_type env sty in let marg = Alloc.of_const arg_mode in let mret = Alloc.newvar () in newty (Tarrow ((p,marg,mret), newmono arg, ret, commu_ok)) | Ptyp_tuple args -> - newty (Ttuple (List.map (approx_type env) args)) + newty (Ttuple (List.map (fun t -> None, approx_type env t) args)) | Ptyp_constr (lid, ctl) -> let path, decl = Env.lookup_type ~use:false ~loc:lid.loc lid.txt env in if List.length ctl <> decl.type_arity - then newvar (Jkind.any ~why:Dummy_jkind) + then newvar (Jkind.Primitive.any ~why:Dummy_jkind) else begin let tyl = List.map (approx_type env) ctl in newconstr path tyl end | _ -> approx_type_default () -and approx_type_jst _env _attrs : Jane_syntax.Core_type.t -> _ = function +and approx_type_jst env _attrs : Jane_syntax.Core_type.t -> _ = function | Jtyp_layout (Ltyp_var _) -> approx_type_default () | Jtyp_layout (Ltyp_poly _) -> approx_type_default () | Jtyp_layout (Ltyp_alias _) -> approx_type_default () + | Jtyp_tuple args -> + newty + (Ttuple (List.map (fun (label, t) -> label, approx_type env t) args)) let type_pattern_approx_jane_syntax : Jane_syntax.Pattern.t -> _ = function | Jpat_immutable_array _ | Jpat_layout (Lpat_constant _) -> () + | Jpat_tuple _ + -> () let type_pattern_approx env spat ty_expected = match Jane_syntax.Pattern.of_ast spat with @@ -3959,12 +4133,9 @@ let type_pattern_approx env spat ty_expected = | None -> match spat.ppat_desc with | Ppat_constraint(_, ({ptyp_desc=Ptyp_poly _} as sty)) -> - let mode_annots = mode_annots_from_pat_attrs spat in - let arg_type_mode = - mode_annots_or_default mode_annots ~default:Alloc.Const.legacy - in + let arg_type_mode, sty = alloc_mode_from_ppat_constraint_typ_attrs sty in let ty_pat = - Typetexp.transl_simple_type env ~closed:false arg_type_mode sty + Typetexp.transl_simple_type ~new_var_jkind:Any env ~closed:false arg_type_mode sty in begin try unify env ty_pat.ctyp_type ty_expected with Unify trace -> raise(Error(spat.ppat_loc, env, Pattern_type_clash(trace, None))) @@ -4001,7 +4172,7 @@ let type_approx_fun_one_param match spato with | None -> None, false | Some spat -> - let mode_annots = mode_annots_from_pat_attrs spat in + let mode_annots, spat = mode_annots_from_pat_attrs spat in let has_poly = has_poly_constraint spat in if has_poly && is_optional label then raise(Error(spat.ppat_loc, env, Optional_poly_param)); @@ -4012,13 +4183,13 @@ let type_approx_fun_one_param try filter_arrow env ty_expected label ~force_tpoly:(not has_poly) with Filter_arrow_failed err -> let err = - error_of_filter_arrow_failure ~explanation:None ~first ty_fun err + error_of_filter_arrow_failure ~explanation:None ty_fun err ~first in raise (Error(loc_fun, env, err)) in Option.iter (fun mode_annots -> - apply_mode_annots ~loc ~env ~ty_expected mode_annots arg_mode) + apply_mode_annots ~loc ~env mode_annots arg_mode) mode_annots; if has_poly then begin match spato with @@ -4033,31 +4204,14 @@ let rec type_approx env sexp ty_expected = | Some (jexp, _attrs) -> type_approx_aux_jane_syntax ~loc env jexp ty_expected | None -> match sexp.pexp_desc with Pexp_let (_, _, e) -> type_approx env e ty_expected - | Pexp_fun (lbl, def, pat, body) -> - let open Jane_syntax.N_ary_functions in - type_approx_function ~loc env - [ { pparam_desc = Pparam_val (lbl, def, pat); - pparam_loc = pat.ppat_loc - } - ] - None (Pfunction_body body) ty_expected - | Pexp_function cases -> - let open Jane_syntax.N_ary_functions in - type_approx_function ~loc - env [] None (Pfunction_cases (cases, sexp.pexp_loc, [])) ty_expected + | Pexp_fun _ | Pexp_function _ -> + Misc.fatal_error + "Unexpected [Pexp_fun]/[Pexp_function] outside of Jane Syntax construct" | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e ty_expected | Pexp_try (e, _) -> type_approx env e ty_expected | Pexp_tuple l -> - let tys = List.map - (fun _ -> newvar (Jkind.value ~why:Tuple_element)) l - in - let ty = newty (Ttuple tys) in - begin try unify env ty ty_expected with Unify err -> - raise(Error(loc, env, Expr_type_clash (err, None, None))) - end; - List.iter2 - (fun e ty -> type_approx env e ty) - l tys + type_tuple_approx env sexp.pexp_loc ty_expected + (List.map (fun e -> None, e) l) | Pexp_ifthenelse (_,e,_) -> type_approx env e ty_expected | Pexp_sequence (_,e) -> type_approx env e ty_expected | Pexp_constraint (e, sty) -> @@ -4069,21 +4223,6 @@ let rec type_approx env sexp ty_expected = ignore (type_approx_constraint env (Pcoerce (sty1, sty2)) ty_expected ~loc : type_expr) - | Pexp_apply - ({ pexp_desc = Pexp_extension( - {txt = "extension.local"|"ocaml.local"|"local"}, PStr []) }, - [Nolabel, e]) -> - type_approx env e ty_expected - | Pexp_apply - ({ pexp_desc = Pexp_extension( - {txt = "extension.unique" | "ocaml.unique" | "unique"}, PStr []) }, - [Nolabel, e]) -> - type_approx env e ty_expected - | Pexp_apply - ({ pexp_desc = Pexp_extension( - {txt = "extension.once" | "ocaml.once" | "once"}, PStr []) }, - [Nolabel, e]) -> - type_approx env e ty_expected | Pexp_apply ({ pexp_desc = Pexp_extension({txt = "extension.escape"}, PStr []) }, [Nolabel, e]) -> @@ -4103,6 +4242,21 @@ and type_approx_aux_jane_syntax | Jexp_layout (Lexp_newtype _) -> () | Jexp_n_ary_function (params, c, body) -> type_approx_function ~loc env params c body ty_expected + | Jexp_tuple l -> + type_tuple_approx env loc ty_expected l + | Jexp_modes (Coerce (_, e)) -> type_approx env e ty_expected + +and type_tuple_approx (env: Env.t) loc ty_expected l = + let labeled_tys = List.map + (fun (label, _) -> label, newvar (Jkind.Primitive.value_or_null ~why:Tuple_element)) l + in + let ty = newty (Ttuple labeled_tys) in + begin try unify env ty ty_expected with Unify err -> + raise(Error(loc, env, Expr_type_clash (err, None, None))) + end; + List.iter2 + (fun (_, e) (_, ty) -> type_approx env e ty) + l labeled_tys and type_approx_function = let rec loop env params c body ty_expected ~in_function ~first = @@ -4115,6 +4269,7 @@ and type_approx_function = match params with | { pparam_desc = Pparam_newtype _ } :: _ -> () | { pparam_desc = Pparam_val (label, _, pat) } :: params -> + let label, pat = Typetexp.transl_label_from_pat label pat in let ty_res = type_approx_fun_one_param env loc label (Some pat) ty_expected ~first ~in_function @@ -4287,7 +4442,7 @@ let check_partial_application ~statement exp = | Texp_setinstvar _ | Texp_override _ | Texp_assert _ | Texp_lazy _ | Texp_object _ | Texp_pack _ | Texp_unreachable | Texp_extension_constructor _ | Texp_ifthenelse (_, _, None) - | Texp_probe _ | Texp_probe_is_enabled _ + | Texp_probe _ | Texp_probe_is_enabled _ | Texp_src_pos | Texp_function _ -> check_statement () | Texp_match (_, _, cases, _) -> @@ -4368,6 +4523,7 @@ let contains_variant_either ty = let shallow_iter_ppat_jane_syntax f : Jane_syntax.Pattern.t -> _ = function | Jpat_immutable_array (Iapat_immutable_array pats) -> List.iter f pats | Jpat_layout (Lpat_constant _) -> () + | Jpat_tuple (lst, _) -> List.iter (fun (_,p) -> f p) lst let shallow_iter_ppat f p = match Jane_syntax.Pattern.of_ast p with @@ -4381,7 +4537,7 @@ let shallow_iter_ppat f p = | Ppat_array pats -> List.iter f pats | Ppat_or (p1,p2) -> f p1; f p2 | Ppat_variant (_, arg) -> Option.iter f arg - | Ppat_tuple lst -> List.iter f lst + | Ppat_tuple lst -> List.iter f lst | Ppat_construct (_, Some (_, p)) | Ppat_exception p | Ppat_alias (p,_) | Ppat_open (_,p) @@ -4422,6 +4578,20 @@ let may_contain_gadts p = | _ -> false) p +(* One of the things we do in the presence of GADT constructors (see above + definition) is treat `let p = e in ...` as a match `match e with p -> ...`. + This changes the way type inference works to check the expression first, and + using its type in the checking of the pattern. We want that behavior for + labeled tuple patterns as well. *) +let turn_let_into_match p = + exists_ppat (fun p -> + match Jane_syntax.Pattern.of_ast p with + | Some (Jpat_tuple (_, _), _) -> true + | Some ((Jpat_layout _ | Jpat_immutable_array _), _) -> false + | None -> match p.ppat_desc with + | Ppat_construct _ -> true + | _ -> false) p + (* There are various things that we need to do in presence of module patterns that aren't required if there are none. Most notably, we need to ensure the modules are entered at the appropriate scope. The caller should use @@ -4452,7 +4622,7 @@ let check_absent_variant env = let fields = [s, rf_either ty_arg ~no_arg:(arg=None) ~matched:true] in let row' = create_row ~fields - ~more:(newvar (Jkind.value ~why:Row_variable)) + ~more:(newvar (Jkind.Primitive.value ~why:Row_variable)) ~closed:false ~fixed:None ~name:None in (* Should fail *) @@ -4505,6 +4675,10 @@ let unify_exp ?sdesc_for_hint env exp expected_ty = with Error(loc, env, Expr_type_clash(err, tfc, None)) -> raise (Error(loc, env, Expr_type_clash(err, tfc, sdesc_for_hint))) +let is_exclave_extension_node = function + | "extension.exclave" | "ocaml.exclave" | "exclave" -> true + | _ -> false + (* If [is_inferred e] is true, [e] will be typechecked without using the "expected type" provided by the context. *) @@ -4512,6 +4686,10 @@ let rec is_inferred sexp = match Jane_syntax.Expression.of_ast sexp with | Some (jexp, _attrs) -> is_inferred_jane_syntax jexp | None -> match sexp.pexp_desc with + | Pexp_apply + ({ pexp_desc = Pexp_extension({ txt }, PStr []) }, + [Nolabel, sbody]) when is_exclave_extension_node txt -> + is_inferred sbody | Pexp_ident _ | Pexp_apply _ | Pexp_field _ | Pexp_constraint _ | Pexp_coerce _ | Pexp_send _ | Pexp_new _ -> true | Pexp_sequence (_, e) | Pexp_open (_, e) -> is_inferred e @@ -4523,6 +4701,8 @@ and is_inferred_jane_syntax : Jane_syntax.Expression.t -> _ = function | Jexp_immutable_array _ | Jexp_layout (Lexp_constant _ | Lexp_newtype _) -> false | Jexp_n_ary_function _ -> false + | Jexp_tuple _ -> false + | Jexp_modes (Coerce (_, exp)) -> is_inferred exp (* check if the type of %apply or %revapply matches the type expected by the specialized typing rule for those primitives. @@ -4553,6 +4733,18 @@ let check_apply_prim_type prim typ = end | _ -> false +(* The explanation is suppressed if the location is ghost (e.g. the construct is + in ppx-generated code), unless the explanation originates from the + [@error_message] attribute, which a ppx may reasonably have inserted itself + to get a better error message. +*) +let should_show_explanation ~explanation ~loc = + if not loc.Location.loc_ghost then true + else + match explanation with + | Error_message_attr _ -> true + | _ -> false + (* Merge explanation to type clash error *) let with_explanation explanation f = @@ -4561,46 +4753,272 @@ let with_explanation explanation f = | Some explanation -> try f () with Error (loc', env', Expr_type_clash(err', None, exp')) - when not loc'.Location.loc_ghost -> + when should_show_explanation ~loc:loc' ~explanation -> let err = Expr_type_clash(err', Some explanation, exp') in raise (Error (loc', env', err)) let unique_use ~loc ~env mode_l mode_r = - let uniqueness = Value.uniqueness mode_r in - let linearity = Value.linearity mode_l in + let uniqueness = Uniqueness.disallow_left (Value.proj (Monadic Uniqueness) mode_r) in + let linearity = Linearity.disallow_right (Value.proj (Comonadic Linearity) mode_l) in if not (Language_extension.is_enabled Unique) then begin (* if unique extension is not enabled, we will not run uniqueness analysis; instead, we force all uses to be shared and many. This is equivalent to running a UA which forces everything *) (match Uniqueness.submode Uniqueness.shared uniqueness with | Ok () -> () - | Error () -> - raise (Error(loc, env, Submode_failed(`Uniqueness, Other, None, None))) + | Error e -> + let e : Mode.Value.error = Error (Monadic Uniqueness, e) in + raise (Error(loc, env, Submode_failed(e, Other, None, None, None))) ); (match Linearity.submode linearity Linearity.many with | Ok () -> () - | Error () -> - raise (Error (loc, env, Submode_failed(`Linearity, Other, None, None))) + | Error e -> + let e : Mode.Value.error = Error (Comonadic Linearity, e) in + raise (Error (loc, env, Submode_failed(e, Other, None, None, None))) ); - (Uniqueness.shared, Linearity.many) + (Uniqueness.disallow_left Uniqueness.shared, + Linearity.disallow_right Linearity.many) end else (uniqueness, linearity) +(** The body of a constraint or coercion. The "body" may be either an expression + or a list of function cases. This type is polymorphic in the data returned + out of typing so that typing an expression body can return an expression + and typing a function cases body can return the cases. +*) +type 'ret constraint_arg = + { type_without_constraint: Env.t -> expected_mode -> 'ret * type_expr; + (** [type_without_constraint] types a body (e :> t) where there is no + constraint. + *) + type_with_constraint: Env.t -> expected_mode -> type_expr -> 'ret; + (** [type_with_constraint] types a body (e : t) or (e : t :> t') in + the presence of a constraint. + *) + is_self: 'ret -> bool; + } + +(* The result of splitting a function type into its argument/return types along + with some extra information relevant to typechecking. The "extra information" + is documented on the fields of [t] below. + + As a running example, we'll suppose the type of a function + [f = fun x_1 ... x_n -> e] is [a_1 -> a_2 -> ... -> a_n -> b], and we're + currently typechecking [a_i -> a_{i+1} -> ... -> b] for [i <= n]. + *) +type split_function_ty = + { (* The result of calling [Ctype.filter_arrow] on + [a_i -> a_{i+1} -> ... -> b]. + *) + filtered_arrow: filtered_arrow; + arg_sort : Jkind.sort; + ret_sort : Jkind.sort; + (* An instance of [a_i], unless [x_i] is annotated as polymorphic, + in which case it's just [a_i] (not an instance). + *) + ty_arg_mono: type_expr; + (* [expected_pat_mode] and [expected_inner_mode] are the arguments you + should pass to [type_cases]. (As opposed to, say, using + [filtered_arrow.arg_mode] and [filtered_arrow.ret_mode].) They are + related to the [filtered_arrow] modes, but also consult whether mode + crossing is available or if the function has a region. + *) + expected_pat_mode: expected_pat_mode; + expected_inner_mode: expected_mode; + (* [alloc_mode] is the mode of [fun x_i ... x_n -> e]. + This needs to be a left mode for the construction of the [fp_curry] field + of the outer function. *) + alloc_mode: Mode.Alloc.lr; + } + +(** Return the updated environment (e.g. it may have a closure lock) + as well as the split function type. This function is called for + each value parameter of a function. + + The mode, type, and location arguments are for the "rest of the + function"; i.e., the rest of the parameter list (starting at the current + parameter) followed by the body. + + @param arg_label label for the relevant parameter + @param has_poly whether the parameter has a polymorphic type annotation + @param mode_annots mode annotations placed on the function parameter + @param in_function Information about the [Pexp_function] node that's in + the process of being typechecked (its overall type and its location). +*) +let split_function_ty + env (expected_mode : expected_mode) ty_expected loc ~arg_label ~has_poly + ~mode_annots ~in_function ~is_first_val_param ~is_final_val_param + = + let alloc_mode = + (* Unlike most allocations which can be the highest mode allowed by + [expected_mode] and their [alloc_mode] identical to [expected_mode] , + functions have more constraints. For example, an outer function needs + to be made global if its inner function is global. As a result, a + function deserves a separate allocation mode. + *) + let mode, _ = Value.newvar_below expected_mode.mode in + fst (register_allocation_value_mode mode) + in + if expected_mode.strictly_local then + Locality.submode_exn Locality.local (Alloc.proj (Comonadic Areality) alloc_mode); + let { ty_fun = { ty = ty_fun; explanation }; loc_fun; region_locked } = + in_function + in + let separate = !Clflags.principal || Env.has_local_constraints env in + let { ty_arg; ty_ret; arg_mode; ret_mode } as filtered_arrow = + with_local_level_if separate begin fun () -> + let force_tpoly = + (* If [has_poly] is true then we rely on the later call to + type_pat to enforce the invariant that the parameter type + be a [Tpoly] node *) + not has_poly + in + try filter_arrow env (instance ty_expected) arg_label ~force_tpoly + with Filter_arrow_failed err -> + let err = + error_of_filter_arrow_failure ~explanation ~first:is_first_val_param + ty_fun err + in + raise (Error(loc_fun, env, err)) + end + ~post:(fun {ty_arg; ty_ret; _} -> + generalize_structure ty_arg; + generalize_structure ty_ret) + in + apply_mode_annots ~loc:loc_fun ~env mode_annots arg_mode; + if not has_poly && not (tpoly_is_mono ty_arg) && !Clflags.principal + && get_level ty_arg < Btype.generic_level then begin + let snap = Btype.snapshot () in + let really_poly = + try + unify env (newmono (newvar (Jkind.Primitive.any ~why:Dummy_jkind))) ty_arg; + false + with Unify _ -> true + in + Btype.backtrack snap; + if really_poly then + Location.prerr_warning loc + (Warnings.Not_principal "this higher-rank function"); + end; + let env = + match is_first_val_param with + | false -> env + | true -> + let env = + Env.add_closure_lock + ?closure_context:expected_mode.closure_context + (alloc_as_value alloc_mode).comonadic + env + in + if region_locked then Env.add_region_lock env + else env + in + let ret_value_mode = alloc_as_value ret_mode in + let expected_inner_mode = + if not is_final_val_param then + (* no need to check mode crossing in this case because ty_res always a + function *) + mode_default ret_value_mode + else + let ret_value_mode = + if region_locked then mode_return ret_value_mode + else begin + (* if the function has no region, we force the ret_mode to be local *) + match + Locality.submode Locality.local (Alloc.proj (Comonadic Areality) ret_mode) + with + | Ok () -> mode_default ret_value_mode + | Error _ -> raise (Error (loc_fun, env, Function_returns_local)) + end + in + let ret_value_mode = expect_mode_cross env ty_ret ret_value_mode in + ret_value_mode + in + let ty_arg_mono = + if has_poly then ty_arg + else begin + let ty, vars = tpoly_get_poly ty_arg in + if vars = [] then ty + else begin + with_level ~level:generic_level + (fun () -> snd (instance_poly ~keep_names:true false vars ty)) + end + end + in + let arg_value_mode = + if region_locked then alloc_to_value_l2r arg_mode + else Value.disallow_right (alloc_as_value arg_mode) + in + let expected_pat_mode = simple_pat_mode arg_value_mode in + let type_sort ~why ty = + match Ctype.type_sort ~why env ty with + | Ok sort -> sort + | Error err -> raise (Error (loc_fun, env, Function_type_not_rep (ty, err))) + in + let arg_sort = type_sort ~why:Function_argument ty_arg in + let ret_sort = type_sort ~why:Function_result ty_ret in + env, + { filtered_arrow; arg_sort; ret_sort; + alloc_mode; ty_arg_mono; + expected_inner_mode; expected_pat_mode + } + +type type_function_result_param = + { param : function_param; + has_poly : bool; + } + +(* The result of calling [type_function]. For the outer call to + [type_function], it's the result of typechecking the entire function; + for recursive calls to [type_function], it's the result of typechecking + the "rest of the function": the parameter suffix followed by the body. +*) +type type_function_result = + { function_ : + type_expr * type_function_result_param list * function_body; + (* The uninterrupted prefix of newtypes of the parameter suffix. *) + newtypes: (string loc * Jkind.annotation option) list; + (* Whether any of the value parameters contains a GADT pattern. *) + params_contain_gadt: contains_gadt; + (* The alloc mode of the "rest of the function". None only for recursive + calls to [type_function] when there are no parameters left. This needs to + be a left mode for the construction of the [fp_curry] field of the outer + function. + *) + fun_alloc_mode: Mode.Alloc.lr option; + (* Information about the return of the function. None only for + recursive calls to [type_function] when there are no parameters + left. + *) + ret_info: type_function_ret_info option; + } + +and type_function_ret_info = + { (* The mode the function returns at. *) + ret_mode: Mode.Alloc.l; + (* The sort returned by the function. *) + ret_sort: Jkind.sort; + } + (* Generalize expressions *) let generalize_structure_exp exp = generalize_structure exp.exp_type let may_lower_contravariant_then_generalize env exp = if maybe_expansive exp then lower_contravariant env exp.exp_type; generalize exp.exp_type +(* This added mode attribute is read and removed by + [alloc_mode_from_pexp_constraint_typ_attrs] or + [alloc_mode_from_ppat_constraint_typ_attrs]. *) +let add_mode_annot_attrs mode_annot_attr typ = + match mode_annot_attr with + | None -> typ + | Some attr -> { typ with ptyp_attributes = attr :: typ.ptyp_attributes } + (* value binding elaboration *) let vb_exp_constraint {pvb_expr=expr; pvb_pat=pat; pvb_constraint=ct; pvb_attributes=attrs; _ } = let open Ast_helper in - let mode_annot_attrs = - Builtin_attributes.filter_attributes - Builtin_attributes.mode_annotation_attributes_filter - attrs - in + let mode_annot_attr, _ = Jane_syntax.Mode_expr.extract_attr attrs in match ct with | None -> expr | Some (Pvc_constraint { locally_abstract_univars=[]; typ }) -> @@ -4608,7 +5026,7 @@ let vb_exp_constraint {pvb_expr=expr; pvb_pat=pat; pvb_constraint=ct; pvb_attrib | Ptyp_poly _ -> expr | _ -> let loc = { expr.pexp_loc with Location.loc_ghost = true } in - Exp.constraint_ ~loc ~attrs:mode_annot_attrs expr typ + Exp.constraint_ ~loc expr (add_mode_annot_attrs mode_annot_attr typ) end | Some (Pvc_coercion { ground; coercion}) -> let loc = { expr.pexp_loc with Location.loc_ghost = true } in @@ -4616,40 +5034,39 @@ let vb_exp_constraint {pvb_expr=expr; pvb_pat=pat; pvb_constraint=ct; pvb_attrib | Some (Pvc_constraint { locally_abstract_univars=vars;typ}) -> let loc_start = pat.ppat_loc.Location.loc_start in let loc = { expr.pexp_loc with loc_start; loc_ghost=true } in - let expr = Exp.constraint_ ~loc ~attrs:mode_annot_attrs expr typ in + let expr = Exp.constraint_ ~loc expr (add_mode_annot_attrs mode_annot_attr typ) in List.fold_right (Exp.newtype ~loc) vars expr -let vb_pat_constraint ~force_toplevel rec_mode_var +let vb_pat_constraint ({pvb_pat=pat; pvb_expr = exp; pvb_attributes = attrs; _ } as vb) = - let mode_annot_attrs = - Builtin_attributes.filter_attributes - Builtin_attributes.mode_annotation_attributes_filter - attrs - in + let mode_annot_attr, _ = Jane_syntax.Mode_expr.extract_attr attrs in let spat = let open Ast_helper in match vb.pvb_constraint, pat.ppat_desc, exp.pexp_desc with | Some (Pvc_constraint {locally_abstract_univars=[]; typ} | Pvc_coercion { coercion=typ; _ }), _, _ -> + let typ = add_mode_annot_attrs mode_annot_attr typ in Pat.constraint_ ~loc:{pat.ppat_loc with Location.loc_ghost=true} pat typ - ~attrs:mode_annot_attrs | Some (Pvc_constraint {locally_abstract_univars=vars; typ }), _, _ -> let varified = Typ.varify_constructors vars typ in let t = Typ.poly ~loc:typ.ptyp_loc vars varified in let loc_end = typ.ptyp_loc.Location.loc_end in let loc = { pat.ppat_loc with loc_end; loc_ghost=true } in + let t = add_mode_annot_attrs mode_annot_attr t in Pat.constraint_ ~loc pat t - ~attrs:mode_annot_attrs | None, (Ppat_any | Ppat_constraint _), _ -> pat | None, _, Pexp_coerce (_, _, sty) | None, _, Pexp_constraint (_, sty) when !Clflags.principal -> (* propagate type annotation to pattern, to allow it to be generalized in -principal mode *) + let sty = add_mode_annot_attrs mode_annot_attr sty in Pat.constraint_ ~loc:{pat.ppat_loc with Location.loc_ghost=true} pat sty - ~attrs:mode_annot_attrs | _ -> pat in + vb.pvb_attributes, spat + +let pat_modes ~force_toplevel rec_mode_var (attrs, spat) = let pat_mode, exp_mode = if force_toplevel then simple_pat_mode Value.legacy, mode_legacy @@ -4661,19 +5078,56 @@ let vb_pat_constraint ~force_toplevel rec_mode_var simple_pat_mode mode, mode_default mode | Local_tuple arity -> let modes = List.init arity (fun _ -> Value.newvar ()) in - let mode = Value.regional_to_local (Value.join modes) in + let mode = + value_regional_to_local (fst (Value.newvar_above (Value.join modes))) + in tuple_pat_mode mode modes, mode_tuple mode modes end | Some mode -> - simple_pat_mode mode, mode_exact mode - in - vb.pvb_attributes, pat_mode, exp_mode, spat - + simple_pat_mode mode, mode_default mode + in + attrs, pat_mode, exp_mode, spat + +let add_zero_alloc_attribute expr attributes = + let open Builtin_attributes in + let to_string : zero_alloc_attribute -> string = function + | Check { strict; loc = _} -> + Printf.sprintf "assert_zero_alloc%s" + (if strict then " strict" else "") + | Assume { strict; loc = _} -> + Printf.sprintf "assume_zero_alloc%s" + (if strict then " strict" else "") + | Ignore_assert_all -> + "ignore_zero_alloc" + | Default_zero_alloc -> assert false + in + match expr.exp_desc with + | Texp_function fn -> + let default_arity = function_arity fn.params fn.body in + let za = + get_zero_alloc_attribute ~in_signature:false ~default_arity attributes + in + begin match za with + | Default_zero_alloc -> expr + | Ignore_assert_all | Check _ | Assume _ -> + begin match Zero_alloc.get fn.zero_alloc with + | Default_zero_alloc -> () + | Ignore_assert_all | Assume _ | Check _ -> + Location.prerr_warning expr.exp_loc + (Warnings.Duplicated_attribute (to_string za)); + end; + (* Here, we may be throwing away a zero_alloc variable. There's no need + to set it, because it can't have gotten anywhere else yet. *) + let zero_alloc = Zero_alloc.create_const za in + let exp_desc = Texp_function { fn with zero_alloc } in + { expr with exp_desc } + end + | _ -> expr let rec type_exp ?recarg env expected_mode sexp = (* We now delegate everything to type_expect *) type_expect ?recarg env expected_mode sexp - (mk_expected (newvar (Jkind.any ~why:Dummy_jkind))) + (mk_expected (newvar (Jkind.Primitive.any ~why:Dummy_jkind))) (* Typing of an expression with an expected type. This provide better error messages, and allows controlled @@ -4682,14 +5136,13 @@ let rec type_exp ?recarg env expected_mode sexp = at [generic_level] (but its variables no higher than [!current_level]). *) -and type_expect ?in_function ?recarg env +and type_expect ?recarg env (expected_mode : expected_mode) sexp ty_expected_explained = let previous_saved_types = Cmt_format.get_saved_types () in let exp = Builtin_attributes.warning_scope sexp.pexp_attributes (fun () -> - type_expect_ ?in_function ?recarg env - expected_mode sexp ty_expected_explained + type_expect_ ?recarg env expected_mode sexp ty_expected_explained ) in Cmt_format.set_saved_types @@ -4697,7 +5150,7 @@ and type_expect ?in_function ?recarg env exp and type_expect_ - ?in_function ?(recarg=Rejected) + ?(recarg=Rejected) env (expected_mode : expected_mode) sexp ty_expected_explained = let { ty = ty_expected; explanation } = ty_expected_explained in let loc = sexp.pexp_loc in @@ -4710,16 +5163,10 @@ and type_expect_ unify_exp ~sdesc_for_hint:desc env (re exp) (instance ty_expected)); exp in - let ruem ~mode ~expected_mode exp = - let exp = rue exp in - submode ~env ~loc:exp.exp_loc ~reason:Other mode expected_mode; - exp - in match Jane_syntax.Expression.of_ast sexp with | Some (jexp, attributes) -> type_expect_jane_syntax ~loc - ~loc_stack:sexp.pexp_loc_stack ~env ~expected_mode ~ty_expected @@ -4729,7 +5176,9 @@ and type_expect_ jexp | None -> match desc with | Pexp_ident lid -> - let path, mode, shared_context, desc, kind = type_ident env ~recarg lid in + let path, (actual_mode : Env.actual_mode), desc, kind = + type_ident env ~recarg lid + in let exp_desc = match desc.val_kind with | Val_ivar (_, cl_num) -> @@ -4746,10 +5195,10 @@ and type_expect_ Env.find_value_by_name (Longident.Lident ("self-" ^ cl_num)) env in Texp_ident(path, lid, desc, kind, - unique_use ~loc ~env mode expected_mode.mode) + unique_use ~loc ~env actual_mode.mode expected_mode.mode) | _ -> Texp_ident(path, lid, desc, kind, - unique_use ~loc ~env mode expected_mode.mode) + unique_use ~loc ~env actual_mode.mode expected_mode.mode) in let exp = rue { exp_desc; exp_loc = loc; exp_extra = []; @@ -4757,7 +5206,7 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } in - submode ~loc ~env ?shared_context mode expected_mode; + actual_submode ~loc ~env actual_mode expected_mode; exp | Pexp_constant(Pconst_string (str, _, _) as cst) -> ( let cst = constant_or_raise env loc cst in @@ -4778,7 +5227,7 @@ and type_expect_ if is_format then let format_parsetree = { (type_format loc str env) with pexp_loc = sexp.pexp_loc } in - type_expect ?in_function env expected_mode + type_expect env expected_mode format_parsetree ty_expected_explained else rue { @@ -4798,10 +5247,10 @@ and type_expect_ exp_env = env } | Pexp_let(Nonrecursive, [{pvb_pat=spat; pvb_attributes=[]; _ } as vb], sbody) - when may_contain_gadts spat -> + when turn_let_into_match spat -> (* TODO: allow non-empty attributes? *) let sval = vb_exp_constraint vb in - type_expect ?in_function env expected_mode + type_expect env expected_mode {sexp with pexp_desc = Pexp_match (sval, [Ast_helper.Exp.case spat sbody])} ty_expected_explained @@ -4832,18 +5281,13 @@ and type_expect_ type_let existential_context env rec_flag spat_sexp_list allow_modules in - let in_function = - match sexp.pexp_attributes with - | [{Parsetree.attr_name = {txt="#default"};_}] -> in_function - | _ -> None - in let body = - type_expect ?in_function + type_expect new_env expected_mode sbody ty_expected_explained in - let () = - if rec_flag = Recursive then - check_recursive_bindings env pat_exp_list + let pat_exp_list = match rec_flag with + | Recursive -> annotate_recursive_bindings env pat_exp_list + | Nonrecursive -> pat_exp_list in (* The "bound expressions" component of the scope escape check. @@ -4862,7 +5306,7 @@ and type_expect_ let bound_exp_type = Ctype.instance bound_exp.exp_type in let loc = proper_exp_loc bound_exp in let outer_var = - newvar2 outer_level (Jkind.any ~why:Dummy_jkind) + newvar2 outer_level (Jkind.Primitive.any ~why:Dummy_jkind) in (* Checking unification within an environment extended with the module bindings allows us to correctly accept more programs. @@ -4876,7 +5320,7 @@ and type_expect_ end ~post:(fun (_pat_exp_list, body, new_env) -> (* The "body" component of the scope escape check. *) - unify_exp new_env body (newvar (Jkind.any ~why:Dummy_jkind))) + unify_exp new_env body (newvar (Jkind.Primitive.any ~why:Dummy_jkind))) in re { exp_desc = Texp_let(rec_flag, pat_exp_list, body); @@ -4884,132 +5328,24 @@ and type_expect_ exp_type = body.exp_type; exp_attributes = sexp.pexp_attributes; exp_env = env } - | Pexp_fun (l, Some default, spat, sbody) -> - let param_suffix = - match l with - | Optional name -> name - | Nolabel | Labelled _ -> - Misc.fatal_error "[default] allowed only with optional argument" - in - let open Ast_helper in - let default_loc = default.pexp_loc in - let default_ghost = {default.pexp_loc with loc_ghost = true} in - (* Defaults are always global. They can be moved out of the function's - region by Simplf.split_default_wrapper, or they could be evaluated - later than expected by Translcore.push_defaults *) - if has_poly_constraint spat then - raise(Error(spat.ppat_loc, env, Optional_poly_param)); - let scases = [ - Exp.case - (Pat.construct ~loc:default_ghost - (mknoloc (Longident.(Ldot (Lident "*predef*", "Some")))) - (Some ([], Pat.var ~loc:default_ghost (mknoloc "*sth*")))) - (Exp.ident ~loc:default_ghost (mknoloc (Longident.Lident "*sth*"))); - - Exp.case - (Pat.construct ~loc:default_loc - (mknoloc (Longident.(Ldot (Lident "*predef*", "None")))) - None) - (Exp.apply ~loc:default_loc - (Exp.extension (mknoloc "extension.escape", PStr [])) - [Nolabel, default]); - ] - in - let sloc = - { Location.loc_start = spat.ppat_loc.Location.loc_start; - loc_end = default_loc.Location.loc_end; - loc_ghost = true } - in - let param_name = "*opt*" ^ param_suffix in - let smatch = - Exp.match_ ~loc:sloc - (Exp.ident ~loc (mknoloc (Longident.Lident param_name))) - scases - in - let pat = Pat.var ~loc:sloc (mknoloc param_name) in - let body = - Exp.let_ ~loc Nonrecursive - ~attrs:[Attr.mk (mknoloc "#default") (PStr [])] - [Vb.mk spat smatch] sbody - in - let mode_annots = mode_annots_from_pat_attrs spat in - type_function ?in_function loc sexp.pexp_attributes env - expected_mode ty_expected_explained - l ~mode_annots ~has_poly:false [Exp.case pat body] - | Pexp_fun (l, None, spat, sbody) -> - let mode_annots = mode_annots_from_pat_attrs spat in - let has_poly = has_poly_constraint spat in - if has_poly && is_optional l then - raise(Error(spat.ppat_loc, env, Optional_poly_param)); - if has_poly - && not (Language_extension.is_enabled Polymorphic_parameters) then - raise (Typetexp.Error (loc, env, - Unsupported_extension Polymorphic_parameters)); - type_function ?in_function loc sexp.pexp_attributes env - expected_mode ty_expected_explained l ~mode_annots - ~has_poly [Ast_helper.Exp.case spat sbody] - | Pexp_function caselist -> - let mode_annots = mode_annots_none in - type_function ?in_function - loc sexp.pexp_attributes env expected_mode - ty_expected_explained Nolabel ~mode_annots ~has_poly:false caselist + | Pexp_fun _ -> + Misc.fatal_error "non-Jane-Syntax [Pexp_fun] made it to typechecking" + | Pexp_function _ -> + Misc.fatal_error "non-Jane-Syntax [Pexp_function] made it to typechecking" | Pexp_apply - ({ pexp_desc = Pexp_extension({ - txt = ("ocaml.unique" | "unique" | "extension.unique" as txt)}, PStr []) }, - [Nolabel, sbody]) -> - if txt = "extension.unique" && not (Language_extension.is_enabled Unique) then - raise (Typetexp.Error (loc, Env.empty, Unsupported_extension Unique)); - let expected_mode = mode_unique expected_mode in - let expected_mode = expect_mode_cross env ty_expected expected_mode in - let exp = - type_expect ?in_function ~recarg env expected_mode sbody - ty_expected_explained - in - {exp with exp_loc = loc} - | Pexp_apply - ({ pexp_desc = Pexp_extension({ - txt = ("ocaml.once" | "once" | "extension.once" as txt)}, PStr []) }, - [Nolabel, sbody]) -> - if txt = "extension.once" && not (Language_extension.is_enabled Unique) then - raise (Typetexp.Error (loc, Env.empty, Unsupported_extension Unique)); - let expected_mode = expect_mode_cross env ty_expected expected_mode in - submode ~loc ~env ~reason:Other - (Value.min_with_linearity Linearity.once) expected_mode; - let expected_mode = mode_once expected_mode in - let exp = - type_expect ?in_function ~recarg env expected_mode sbody - ty_expected_explained - in - {exp with exp_loc = loc} - | Pexp_apply - ({ pexp_desc = Pexp_extension({ - txt = ("ocaml.local" | "local" | "extension.local" as txt)}, PStr []) }, - [Nolabel, sbody]) -> - if txt = "extension.local" && not (Language_extension.is_enabled Local) then - raise (Typetexp.Error (loc, Env.empty, Unsupported_extension Local)); - let expected_mode = expect_mode_cross env ty_expected expected_mode in - submode ~loc ~env ~reason:Other - (Value.min_with_locality Regionality.local) expected_mode; - let expected_mode = mode_strictly_local expected_mode in - let exp = - type_expect ?in_function ~recarg env expected_mode sbody ty_expected_explained - in - {exp with exp_loc = loc} - | Pexp_apply - ({ pexp_desc = Pexp_extension({txt = "extension.escape"}, PStr []) }, + ({ pexp_desc = Pexp_extension({txt = "extension.escape"}, PStr []) }, [Nolabel, sbody]) -> submode ~loc ~env ~reason:Other Value.legacy expected_mode; let exp = - type_expect ?in_function ~recarg env mode_legacy sbody + type_expect ~recarg env mode_legacy sbody ty_expected_explained in {exp with exp_loc = loc} | Pexp_apply - ({ pexp_desc = Pexp_extension({ - txt = "extension.exclave" | "ocaml.exclave" | "exclave" as txt}, PStr []) }, - [Nolabel, sbody]) -> - if (txt = "extension.exclave") && not (Language_extension.is_enabled Local) then - raise (Typetexp.Error (loc, Env.empty, Unsupported_extension Local)); + ({ pexp_desc = Pexp_extension({ txt }, PStr []) }, + [Nolabel, sbody]) when is_exclave_extension_node txt -> + if (txt = "extension.exclave") && not (Language_extension.is_enabled Mode) then + raise (Typetexp.Error (loc, Env.empty, Unsupported_extension Mode)); begin match expected_mode.position with | RNontail -> @@ -5026,10 +5362,10 @@ and type_expect_ let mode' = mode_exclave expected_mode in let new_env = Env.add_exclave_lock env in let exp = - type_expect ?in_function ~recarg new_env mode' sbody ty_expected_explained + type_expect ~recarg new_env mode' sbody ty_expected_explained in submode ~loc ~env ~reason:Other - (Value.min_with_locality Regionality.regional) expected_mode; + (Value.min_with (Comonadic Areality) Regionality.regional) expected_mode; { exp_desc = Texp_exclave exp; exp_loc = loc; exp_extra = []; @@ -5044,7 +5380,10 @@ and type_expect_ let funct_mode, funct_expected_mode = match pm.apply_position with | Tail -> - let mode = Value.local_to_regional (Value.newvar ()) in + let mode, _ = + Value.newvar_below + (Value.max_with (Comonadic Areality) Regionality.regional) + in mode, mode_tailcall_function mode | Nontail | Default -> let mode = Value.newvar () in @@ -5060,12 +5399,12 @@ and type_expect_ with Unify _ -> assert false); ret_tvar (TypeSet.add ty seen) ty_fun | Tvar _ -> - let v = newvar (Jkind.any ~why:Dummy_jkind) in + let v = newvar (Jkind.Primitive.any ~why:Dummy_jkind) in let rt = get_level ty > get_level v in unify_var env v ty; rt | _ -> - let v = newvar (Jkind.any ~why:Dummy_jkind) in + let v = newvar (Jkind.Primitive.any ~why:Dummy_jkind) in unify_var env v ty; false in @@ -5113,9 +5452,15 @@ and type_expect_ let (args, ty_res, ap_mode, pm) = type_application env loc expected_mode pm funct funct_mode sargs rt in + let zero_alloc = + Builtin_attributes.get_zero_alloc_attribute ~in_signature:false + ~default_arity:(List.length args) sfunct.pexp_attributes + |> Builtin_attributes.zero_alloc_attribute_only_assume_allowed + in rue { - exp_desc = Texp_apply(funct, args, pm.apply_position, ap_mode); + exp_desc = Texp_apply(funct, args, pm.apply_position, ap_mode, + zero_alloc); exp_loc = loc; exp_extra = []; exp_type = ty_res; exp_attributes = sexp.pexp_attributes; @@ -5128,7 +5473,8 @@ and type_expect_ simple_pat_mode mode, mode_default mode | Local_tuple arity -> let modes = List.init arity (fun _ -> Value.newvar ()) in - let mode = Value.regional_to_local (Value.join modes) in + let mode, _ = Value.newvar_above (Value.join modes) in + let mode = value_regional_to_local mode in tuple_pat_mode mode modes, mode_tuple mode modes in let arg, sort = @@ -5143,7 +5489,8 @@ and type_expect_ in let cases, partial = type_cases Computation env arg_pat_mode expected_mode - arg.exp_type ty_expected_explained true loc caselist in + arg.exp_type ty_expected_explained + ~check_if_total:true loc caselist in if List.for_all (fun c -> pattern_needs_partial_application_check c.c_lhs) cases @@ -5162,7 +5509,8 @@ and type_expect_ let arg_mode = simple_pat_mode Value.legacy in let cases, _ = type_cases Value env arg_mode expected_mode - Predef.type_exn ty_expected_explained false loc caselist in + Predef.type_exn ty_expected_explained + ~check_if_total:false loc caselist in re { exp_desc = Texp_try(body, cases); exp_loc = loc; exp_extra = []; @@ -5170,42 +5518,8 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_tuple sexpl -> - let arity = List.length sexpl in - assert (arity >= 2); - let alloc_mode = register_allocation expected_mode in - (* CR layouts v5: non-values in tuples *) - let subtypes = - List.map (fun _ -> newgenvar (Jkind.value ~why:Tuple_element)) - sexpl - in - let to_unify = newgenty (Ttuple subtypes) in - with_explanation (fun () -> - unify_exp_types loc env to_unify (generic_instance ty_expected)); - let argument_modes = - if List.compare_length_with expected_mode.tuple_modes arity = 0 then - expected_mode.tuple_modes - else begin - let arg_mode = Value.regional_to_global expected_mode.mode in - List.init arity (fun _ -> arg_mode) - end - in - let types_and_modes = List.combine subtypes argument_modes in - let expl = - List.map2 - (fun body (ty, argument_mode) -> - let argument_mode = mode_default argument_mode in - let argument_mode = expect_mode_cross env ty argument_mode in - type_expect env argument_mode - body (mk_expected ty)) - sexpl types_and_modes - in - re { - exp_desc = Texp_tuple (expl, alloc_mode); - exp_loc = loc; exp_extra = []; - (* Keep sharing *) - exp_type = newty (Ttuple (List.map (fun e -> e.exp_type) expl)); - exp_attributes = sexp.pexp_attributes; - exp_env = env } + type_tuple ~loc ~env ~expected_mode ~ty_expected ~explanation + ~attributes:sexp.pexp_attributes (List.map (fun e -> None, e) sexpl) | Pexp_construct(lid, sarg) -> type_construct env expected_mode loc lid sarg ty_expected_explained sexp.pexp_attributes @@ -5213,7 +5527,6 @@ and type_expect_ (* Keep sharing *) let ty_expected1 = protect_expansion env ty_expected in let ty_expected0 = instance ty_expected in - let argument_mode = mode_subcomponent expected_mode in begin try match sarg, get_desc (expand_head env ty_expected1), get_desc (expand_head env ty_expected0) @@ -5224,8 +5537,8 @@ and type_expect_ row_field_repr (get_row_field l row0) with Rpresent (Some ty), Rpresent (Some ty0) -> + let alloc_mode, argument_mode = register_allocation expected_mode in let arg = type_argument env argument_mode sarg ty ty0 in - let alloc_mode = register_allocation expected_mode in re { exp_desc = Texp_variant(l, Some (arg, alloc_mode)); exp_loc = loc; exp_extra = []; exp_type = ty_expected0; @@ -5239,19 +5552,19 @@ and type_expect_ | None -> None | Some sarg -> let ty_expected = - newvar (Jkind.value ~why:Polymorphic_variant_field) + newvar (Jkind.Primitive.value_or_null ~why:Polymorphic_variant_field) in + let alloc_mode, argument_mode = register_allocation expected_mode in let arg = type_expect env argument_mode sarg (mk_expected ty_expected) in - let alloc_mode = register_allocation expected_mode in Some (arg, alloc_mode) in let arg_type = Option.map (fun (arg, _) -> arg.exp_type) arg in let row = create_row ~fields: [l, rf_present arg_type] - ~more: (newvar (Jkind.value ~why:Row_variable)) + ~more: (newvar (Jkind.Primitive.value ~why:Row_variable)) ~closed: false ~fixed: None ~name: None @@ -5271,9 +5584,7 @@ and type_expect_ | Some sexp -> let exp, mode = with_local_level_if_principal begin fun () -> - (* TODO: mode can be more relaxed than this if fields are global *) let mode = Value.newvar () in - submode ~loc ~env mode (mode_subcomponent expected_mode); let exp = type_exp ~recarg env (mode_default mode) sexp in exp, mode end ~post:(fun (exp, _) -> generalize_structure_exp exp) @@ -5316,29 +5627,34 @@ and type_expect_ ty, opt_exp_opath in let closed = (opt_sexp = None) in - let lbl_exp_list = + let lbl_a_list = wrap_disambiguate "This record expression is expected to have" (mk_expected ty_record) - (type_label_a_list loc closed env Env.Construct - (type_label_exp true env expected_mode loc ty_record) - expected_type) + (disambiguate_sort_lid_a_list loc closed env Env.Construct expected_type) lid_sexp_list in - with_explanation (fun () -> - unify_exp_types loc env (instance ty_record) (instance ty_expected)); - let alloc_mode = + let alloc_mode, argument_mode = if List.exists - (function - | _, { lbl_repres = Record_unboxed; _ }, _ -> false + (fun (_, {lbl_repres; _}, _) -> + match lbl_repres with + | Record_unboxed | Record_inlined (_, _, Variant_unboxed) -> false | _ -> true) - lbl_exp_list then - Some (register_allocation expected_mode) + lbl_a_list then + let alloc_mode, argument_mode = register_allocation expected_mode in + Some alloc_mode, argument_mode else - None + None, expected_mode + in + let type_label_exp ((_, label, _) as x) = + check_construct_mutability ~loc ~env label.lbl_mut argument_mode; + let argument_mode = mode_modality label.lbl_modalities argument_mode in + type_label_exp true env argument_mode loc ty_record x in - (* type_label_a_list returns a list of labels sorted by lbl_num *) + let lbl_exp_list = List.map type_label_exp lbl_a_list in + with_explanation (fun () -> + unify_exp_types loc env (instance ty_record) (instance ty_expected)); (* note: check_duplicates would better be implemented in - type_label_a_list directly *) + disambiguate_sort_lid_a_list directly *) let rec check_duplicates = function | (_, lbl1, _) :: (_, lbl2, _) :: _ when lbl1.lbl_num = lbl2.lbl_num -> raise(Error(loc, env, Label_multiply_defined lbl1.lbl_name)) @@ -5392,17 +5708,15 @@ and type_expect_ unify_exp_types loc env ty_arg1 ty_arg2; with_explanation (fun () -> unify_exp_types loc env (instance ty_expected) ty_res2); - let mode = modality_unbox_left lbl.lbl_global mode in - let rmode = - (* We skip a potential [mode_subcomponent] since - it does not affect uniqueness. *) - expected_mode - in - let expected_mode = - mode_box_modality lbl.lbl_global rmode + check_project_mutability ~loc:exp.exp_loc ~env lbl.lbl_mut mode; + let mode = Modality.Value.Const.apply lbl.lbl_modalities mode in + check_construct_mutability ~loc ~env lbl.lbl_mut argument_mode; + let argument_mode = + mode_modality lbl.lbl_modalities argument_mode in + submode ~loc ~env mode argument_mode; Kept (ty_arg1, lbl.lbl_mut, - unique_use ~loc ~env mode expected_mode.mode) + unique_use ~loc ~env mode argument_mode.mode) end in let label_definitions = Array.map unify_kept lbl.lbl_all in @@ -5435,28 +5749,45 @@ and type_expect_ let (record, rmode, label, _) = type_label_access env srecord Env.Projection lid in - let alloc_mode = match label.lbl_repres with - (* projecting out of packed-float-record needs allocation *) - | Record_float -> Some (register_allocation expected_mode) - | _ -> None - in - let mode = modality_unbox_left label.lbl_global rmode in let ty_arg = with_local_level_if_principal begin fun () -> - (* ty_arg is the type of field *) - (* ty_res is the type of record *) - (* they could share type variables *) - (* which are now instantiated *) + (* [ty_arg] is the type of field, [ty_res] is the type of record, they + could share type variables, which are now instantiated *) let (_, ty_arg, ty_res) = instance_label false label in (* we now link the two record types *) unify_exp env record ty_res; ty_arg end ~post:generalize_structure in - let mode = mode_cross_to_min env ty_arg mode in - let uu = unique_use ~loc ~env mode expected_mode.mode in - ruem ~mode ~expected_mode { - exp_desc = Texp_field(record, lid, label, uu, alloc_mode); + check_project_mutability ~loc:record.exp_loc ~env label.lbl_mut rmode; + let mode = Modality.Value.Const.apply label.lbl_modalities rmode in + let boxing : texp_field_boxing = + let is_float_boxing = + match label.lbl_repres with + | Record_float -> true + | Record_mixed mixed -> begin + match Types.get_mixed_product_element mixed label.lbl_num with + | Flat_suffix Float_boxed -> true + | Flat_suffix (Float64 | Float32 | Imm | Bits32 | Bits64 | Word) -> false + | Value_prefix -> false + end + | _ -> false + in + match is_float_boxing with + | true -> + let alloc_mode, argument_mode = register_allocation expected_mode in + let mode = mode_cross_left env Predef.type_unboxed_float mode in + submode ~loc ~env mode argument_mode; + let uu = unique_use ~loc ~env mode argument_mode.mode in + Boxing (alloc_mode, uu) + | false -> + let mode = mode_cross_left env ty_arg mode in + submode ~loc ~env mode expected_mode; + let uu = unique_use ~loc ~env mode expected_mode.mode in + Non_boxing uu + in + rue { + exp_desc = Texp_field(record, lid, label, boxing); exp_loc = loc; exp_extra = []; exp_type = ty_arg; exp_attributes = sexp.pexp_attributes; @@ -5470,14 +5801,20 @@ and type_expect_ else record.exp_type in let (label_loc, label, newval) = - type_label_exp false env (mode_default rmode) loc - ty_record (lid, label, snewval) in + match label.lbl_mut with + | Mutable m0 -> + submode ~loc:record.exp_loc ~env rmode mode_mutate_mutable; + let mode = mutable_mode m0 |> mode_default in + let mode = mode_modality label.lbl_modalities mode in + type_label_exp false env mode loc ty_record (lid, label, snewval) + | Immutable -> + raise(Error(loc, env, Label_not_mutable lid.txt)) + in unify_exp env record ty_record; - if label.lbl_mut = Immutable then - raise(Error(loc, env, Label_not_mutable lid.txt)); rue { exp_desc = Texp_setfield(record, - (Alloc.locality (Value.regional_to_local_alloc rmode)), + Locality.disallow_right (regional_to_local + (Value.proj (Comonadic Areality) rmode)), label_loc, label, newval); exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_unit; @@ -5490,7 +5827,7 @@ and type_expect_ ~expected_mode ~ty_expected ~explanation - ~mutability:Mutable + ~mutability:(Mutable Alloc.Comonadic.Const.legacy) ~attributes:sexp.pexp_attributes sargl | Pexp_ifthenelse(scond, sifso, sifnot) -> @@ -5539,13 +5876,13 @@ and type_expect_ | Pexp_while(scond, sbody) -> let env = Env.add_share_lock While_loop env in let cond_env = Env.add_region_lock env in - let mode = mode_region Value.max_mode in + let mode = mode_region Value.max in let wh_cond = type_expect cond_env mode scond (mk_expected ~explanation:While_loop_conditional Predef.type_bool) in let body_env = Env.add_region_lock env in - let position = RTail (Regionality.local, FNontail) in + let position = RTail (Regionality.disallow_left Regionality.local, FNontail) in let wh_body, wh_body_sort = type_statement ~explanation:While_loop_body ~position body_env sbody @@ -5559,11 +5896,11 @@ and type_expect_ exp_env = env } | Pexp_for(param, slow, shigh, dir, sbody) -> let for_from = - type_expect env (mode_region Value.max_mode) slow + type_expect env (mode_region Value.max) slow (mk_expected ~explanation:For_loop_start_index Predef.type_int) in let for_to = - type_expect env (mode_region Value.max_mode) shigh + type_expect env (mode_region Value.max) shigh (mk_expected ~explanation:For_loop_stop_index Predef.type_int) in let env = Env.add_share_lock For_loop env in @@ -5572,7 +5909,7 @@ and type_expect_ type_for_loop_index ~loc ~env ~param in let new_env = Env.add_region_lock new_env in - let position = RTail (Regionality.local, FNontail) in + let position = RTail (Regionality.disallow_left Regionality.local, FNontail) in let for_body, for_body_sort = type_statement ~explanation:For_loop_body ~position new_env sbody in @@ -5584,107 +5921,33 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_constraint (sarg, sty) -> - (* Pretend separate = true, 1% slowdown for lablgtk *) - let cty = - with_local_level begin fun () -> - let mode_annots = mode_annots_from_exp_attrs sexp in - let type_mode = - mode_annots_or_default mode_annots ~default:Alloc.Const.legacy - in - Typetexp.transl_simple_type env ~closed:false type_mode sty - end - ~post:(fun cty -> generalize_structure cty.ctyp_type) + let type_mode, sty = alloc_mode_from_pexp_constraint_typ_attrs sty in + let (ty, exp_extra) = + type_constraint env sty type_mode in - let ty = cty.ctyp_type in let ty' = instance ty in - let arg = type_argument env expected_mode sarg ty (instance ty) in + let error_message_attr_opt = + Builtin_attributes.error_message_attr sexp.pexp_attributes in + let explanation = Option.map (fun msg -> Error_message_attr msg) + error_message_attr_opt in + let arg = type_argument ?explanation env expected_mode sarg ty (instance ty) in rue { exp_desc = arg.exp_desc; exp_loc = arg.exp_loc; exp_type = ty'; exp_attributes = arg.exp_attributes; exp_env = env; - exp_extra = - (Texp_constraint cty, loc, sexp.pexp_attributes) :: arg.exp_extra; + exp_extra = (exp_extra, loc, sexp.pexp_attributes) :: arg.exp_extra; } | Pexp_coerce(sarg, sty, sty') -> - (* Pretend separate = true, 1% slowdown for lablgtk *) - (* Also see PR#7199 for a problem with the following: - let separate = !Clflags.principal || Env.has_local_constraints env in*) - let mode_annots = mode_annots_from_exp_attrs sexp in - let type_mode = - mode_annots_or_default mode_annots ~default:Alloc.Const.legacy - in - let (arg, ty',cty,cty') = - match sty with - | None -> - let (cty', ty', force) = - Typetexp.transl_simple_type_delayed env type_mode sty' - in - let arg, gen = - let lv = get_current_level () in - with_local_level begin fun () -> - let arg = type_exp env expected_mode sarg in - (arg, generalizable lv arg.exp_type) - end - ~post:(fun (arg,_) -> enforce_current_level env arg.exp_type) - in - begin match arg.exp_desc, !self_coercion, get_desc ty' with - Texp_ident(_, _, {val_kind=Val_self _}, _, _), (path,r) :: _, - Tconstr(path',_,_) when Path.same path path' -> - (* prerr_endline "self coercion"; *) - r := loc :: !r; - force () - | _ when free_variables ~env arg.exp_type = [] - && free_variables ~env ty' = [] -> - if not gen && (* first try a single coercion *) - let snap = snapshot () in - let ty, _b = enlarge_type env ty' in - try - force (); Ctype.unify env arg.exp_type ty; true - with Unify _ -> - backtrack snap; false - then () - else begin try - let force' = subtype env arg.exp_type ty' in - force (); force' (); - if not gen && !Clflags.principal then - Location.prerr_warning loc - (Warnings.Not_principal "this ground coercion"); - with Subtype err -> - (* prerr_endline "coercion failed"; *) - raise (Error(loc, env, Not_subtype err)) - end; - | _ -> - let ty, b = enlarge_type env ty' in - force (); - begin try Ctype.unify env arg.exp_type ty with Unify err -> - let expanded = full_expand ~may_forget_scope:true env ty' in - raise(Error(sarg.pexp_loc, env, - Coercion_failure({ty = ty'; expanded}, err, b))) - end - end; - (arg, ty', None, cty') - | Some sty -> - let cty, ty, force, cty', ty', force' = - with_local_level_iter ~post:generalize_structure begin fun () -> - let (cty, ty, force) = - Typetexp.transl_simple_type_delayed env type_mode sty - and (cty', ty', force') = - Typetexp.transl_simple_type_delayed env type_mode sty' - in - ((cty, ty, force, cty', ty', force'), - [ty; ty']) - end - in - begin try - let force'' = subtype env (instance ty) (instance ty') in - force (); force' (); force'' () - with Subtype err -> - raise (Error(loc, env, Not_subtype err)) - end; - (type_argument env expected_mode sarg ty (instance ty), - instance ty', Some cty, cty') + let arg, ty', exp_extra = + type_coerce (expression_constraint sarg) env expected_mode loc sty sty' + (* CR modes: We could consider changing value binding elaboration to + put modes on forged [Pexp_coerce] nodes, as we do for + [Pexp_constraint]. Then we could use that mode here instead of + legacy. + *) + Alloc.Const.legacy ~loc_arg:sarg.pexp_loc in rue { exp_desc = arg.exp_desc; @@ -5692,10 +5955,10 @@ and type_expect_ exp_type = ty'; exp_attributes = arg.exp_attributes; exp_env = env; - exp_extra = (Texp_coerce (cty, cty'), loc, sexp.pexp_attributes) :: - arg.exp_extra; + exp_extra = (exp_extra, loc, sexp.pexp_attributes) :: arg.exp_extra; } | Pexp_send (e, {txt=met}) -> + submode ~loc ~env Mode.Value.legacy expected_mode; let pm = position_and_mode env expected_mode sexp in let (obj,meth,typ) = with_local_level_if_principal @@ -5712,7 +5975,7 @@ and type_expect_ (Warnings.Not_principal "this use of a polymorphic method"); snd (instance_poly false tl ty) | Tvar _ -> - let ty' = newvar (Jkind.value ~why:Object_field) in + let ty' = newvar (Jkind.Primitive.value ~why:Object_field) in unify env (instance typ) (newty(Tpoly(ty',[]))); (* if not !Clflags.nolabels then Location.prerr_warning loc (Warnings.Unknown_method met); *) @@ -5727,7 +5990,11 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_new cl -> - let (cl_path, cl_decl) = Env.lookup_class ~loc:cl.loc cl.txt env in + submode ~loc ~env Value.legacy expected_mode; + let (cl_path, cl_decl, cl_mode) = + Env.lookup_class ~loc:cl.loc cl.txt env + in + Value.submode_exn cl_mode Value.legacy; let pm = position_and_mode env expected_mode sexp in begin match cl_decl.cty_new with None -> @@ -5764,6 +6031,7 @@ and type_expect_ raise(Error(loc, env, Instance_variable_not_mutable lab.txt)) end | Pexp_override lst -> + submode ~loc ~env Value.legacy expected_mode; let _ = List.fold_right (fun (lab, _) l -> @@ -5818,10 +6086,12 @@ and type_expect_ | _ -> Mp_present in let scope = create_scope () in + let md_uid = Uid.mk ~current_unit:(Env.get_unit_name ()) in + let md_shape = Shape.set_uid_if_none md_shape md_uid in let md = { md_type = modl.mod_type; md_attributes = []; md_loc = name.loc; - md_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); } + md_uid; } in let (id, new_env) = match name.txt with @@ -5857,7 +6127,7 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_letexception(cd, sbody) -> - let (cd, newenv) = Typedecl.transl_exception env cd in + let (cd, newenv, _shape) = Typedecl.transl_exception env cd in let body = type_expect newenv expected_mode sbody ty_expected_explained in @@ -5894,13 +6164,14 @@ and type_expect_ exp_env = env; } | Pexp_lazy e -> - let ty = newgenvar (Jkind.value ~why:Lazy_expression) in + submode ~loc ~env Value.legacy expected_mode; + let ty = newgenvar (Jkind.Primitive.value ~why:Lazy_expression) in let to_unify = Predef.type_lazy_t ty in with_explanation (fun () -> unify_exp_types loc env to_unify (generic_instance ty_expected)); let env = Env.add_escape_lock Lazy env in let env = Env.add_share_lock Lazy env in - let arg = type_expect env (mode_lazy expected_mode) e (mk_expected ty) in + let arg = type_expect env mode_legacy e (mk_expected ty) in re { exp_desc = Texp_lazy arg; exp_loc = loc; exp_extra = []; @@ -5909,6 +6180,7 @@ and type_expect_ exp_env = env; } | Pexp_object s -> + submode ~loc ~env Value.legacy expected_mode; let desc, meths = !type_object env loc s in rue { exp_desc = Texp_object (desc, meths); @@ -5926,7 +6198,7 @@ and type_expect_ | Some sty -> let sty = Ast_helper.Typ.force_poly sty in let cty = - Typetexp.transl_simple_type env ~closed:false + Typetexp.transl_simple_type ~new_var_jkind:Any env ~closed:false Alloc.Const.legacy sty in cty.ctyp_type, Some cty @@ -5966,10 +6238,12 @@ and type_expect_ in re { exp with exp_extra = (Texp_poly cty, loc, sexp.pexp_attributes) :: exp.exp_extra } - | Pexp_newtype({txt=name}, sbody) -> - type_newtype ~loc ~env ~expected_mode ~rue ~attributes:sexp.pexp_attributes + | Pexp_newtype(name, sbody) -> + type_newtype_expr ~loc ~env ~expected_mode ~rue ~attributes:sexp.pexp_attributes name None sbody | Pexp_pack m -> + (* CR zqian: pass [expected_mode] to [type_package] *) + submode ~loc ~env Value.legacy expected_mode; let (p, fl) = match get_desc (Ctype.expand_head env (instance ty_expected)) with Tpackage (p, fl) -> @@ -5994,7 +6268,7 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_open (od, e) -> - let tv = newvar (Jkind.any ~why:Dummy_jkind) in + let tv = newvar (Jkind.Primitive.any ~why:Dummy_jkind) in let (od, _, newenv) = !type_open_decl env od in let exp = type_expect newenv expected_mode e ty_expected_explained in (* Force the return type to be well-formed in the original @@ -6009,15 +6283,16 @@ and type_expect_ exp_env = env; } | Pexp_letop{ let_ = slet; ands = sands; body = sbody } -> + submode ~loc ~env Value.legacy expected_mode; let rec loop spat_acc ty_acc ty_acc_sort sands = match sands with | [] -> spat_acc, ty_acc, ty_acc_sort | { pbop_pat = spat; _} :: rest -> (* CR layouts v5: eliminate value requirement *) - let ty = newvar (Jkind.value ~why:Tuple_element) in + let ty = newvar (Jkind.Primitive.value_or_null ~why:Tuple_element) in let loc = Location.ghostify slet.pbop_op.loc in let spat_acc = Ast_helper.Pat.tuple ~loc [spat_acc; spat] in - let ty_acc = newty (Ttuple [ty_acc; ty]) in + let ty_acc = newty (Ttuple [None, ty_acc; None, ty]) in loop spat_acc ty_acc Jkind.Sort.value rest in let op_path, op_desc, op_type, spat_params, ty_params, param_sort, @@ -6027,13 +6302,13 @@ and type_expect_ ~post:generalize_structure begin fun () -> let let_loc = slet.pbop_op.loc in let op_path, op_desc = type_binding_op_ident env slet.pbop_op in - let op_type = instance op_desc.val_type in + let op_type = op_desc.val_type in let spat_params, ty_params, param_sort = let initial_jkind, initial_sort = match sands with | [] -> Jkind.of_new_sort_var ~why:Function_argument (* CR layouts v5: eliminate value requirement for tuple elements *) - | _ -> Jkind.value ~why:Tuple_element, Jkind.Sort.value + | _ -> Jkind.Primitive.value_or_null ~why:Tuple_element, Jkind.Sort.value in loop slet.pbop_pat (newvar initial_jkind) initial_sort sands in @@ -6069,9 +6344,9 @@ and type_expect_ let scase = Ast_helper.Exp.case spat_params sbody in let cases, partial = type_cases Value body_env - (simple_pat_mode Value.legacy) - (mode_return Value.legacy) - ty_params (mk_expected ty_func_result) true loc [scase] + (simple_pat_mode Value.legacy) (mode_return Value.legacy) + ty_params (mk_expected ty_func_result) + ~check_if_total:true loc [scase] in let body = match cases with @@ -6089,10 +6364,8 @@ and type_expect_ bop_exp_sort = exp_sort; bop_loc = slet.pbop_loc; } in - let warnings = Warnings.backup () in let desc = - Texp_letop{let_; ands; param; param_sort; body; body_sort; partial; - warnings} + Texp_letop{let_; ands; param; param_sort; body; body_sort; partial} in rue { exp_desc = desc; exp_loc = sexp.pexp_loc; @@ -6126,49 +6399,22 @@ and type_expect_ raise (Error (loc, env, Invalid_extension_constructor_payload)) end | Pexp_extension ({ txt = ("probe" | "ocaml.probe"); _ }, payload) -> - let name, name_loc, args = - match payload with - | PStr - ([{ pstr_desc = - Pstr_eval - ({ pexp_desc = - (Pexp_apply - ({ pexp_desc= - (Pexp_constant (Pconst_string(name,_,None))); - pexp_loc = name_loc; - _ } - , args)) - ; _ } - , _)}]) -> name, name_loc, args - | _ -> raise (Error (loc, env, Probe_format)) - in - let bool_of_string = function - | "true" -> true - | "false" -> false - | _ -> raise (Error (loc, env, Probe_format)) - in - let arg, enabled_at_init = - match args with - | [Nolabel, arg] -> arg, false - | [Labelled "enabled_at_init", - { pexp_desc = - Pexp_construct({ txt = Longident.Lident b; _ }, - None); _ }; - Nolabel, arg] -> arg, bool_of_string b - | _ -> raise (Error (loc, env, Probe_format)) - in - check_probe_name name name_loc env; - let env = Env.add_escape_lock Probe env in - let env = Env.add_share_lock Probe env in - Env.add_probe name; - let exp = type_expect env mode_legacy arg - (mk_expected Predef.type_unit) in - rue { - exp_desc = Texp_probe {name; handler=exp; enabled_at_init}; - exp_loc = loc; exp_extra = []; - exp_type = instance Predef.type_unit; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + begin match Builtin_attributes.get_tracing_probe_payload payload with + | Error () -> raise (Error (loc, env, Probe_format)) + | Ok { name; name_loc; enabled_at_init; arg; } -> + check_probe_name name name_loc env; + let env = Env.add_escape_lock Probe env in + let env = Env.add_share_lock Probe env in + Env.add_probe name; + let exp = type_expect env mode_legacy arg + (mk_expected Predef.type_unit) in + rue { + exp_desc = Texp_probe {name; handler=exp; enabled_at_init}; + exp_loc = loc; exp_extra = []; + exp_type = instance Predef.type_unit; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + end | Pexp_extension ({ txt = ("probe_is_enabled" |"ocaml.probe_is_enabled"); _ }, payload) -> begin match payload with @@ -6191,6 +6437,8 @@ and type_expect_ exp_env = env } | _ -> raise (Error (loc, env, Probe_is_enabled_format)) end + | Pexp_extension ({ txt = "src_pos"; _ }, _) -> + rue (src_pos loc sexp.pexp_attributes env) | Pexp_extension ext -> raise (Error_forward (Builtin_attributes.error_of_extension ext)) @@ -6201,12 +6449,144 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } +and expression_constraint pexp = + { type_without_constraint = (fun env expected_mode -> + let expr = type_exp env expected_mode pexp in + expr, expr.exp_type); + type_with_constraint = + (fun env expected_mode ty -> + type_argument env expected_mode pexp ty (instance ty)); + is_self = + (fun expr -> + match expr.exp_desc with + | Texp_ident (_, _, { val_kind = Val_self _ }, _, _) -> true + | _ -> false); + } + +(** Types a body in the scope of a coercion (with an optional constraint) + and returns the inferred type. See the comment on {!constraint_arg} for + an explanation of how this typechecking is polymorphic in the body. +*) +and type_coerce + : type a. a constraint_arg -> _ -> _ -> _ -> _ -> _ -> _ -> loc_arg:_ + -> a * type_expr * exp_extra = + fun constraint_arg env expected_mode loc sty sty' type_mode ~loc_arg -> + (* Pretend separate = true, 1% slowdown for lablgtk *) + (* Also see PR#7199 for a problem with the following: + let separate = !Clflags.principal || Env.has_local_constraints env in*) + let { is_self; type_with_constraint; type_without_constraint } = + constraint_arg + in + match sty with + | None -> + let (cty', ty', force) = + Typetexp.transl_simple_type_delayed env type_mode sty' + in + let arg, arg_type, gen = + let lv = get_current_level () in + with_local_level begin fun () -> + let arg, arg_type = type_without_constraint env expected_mode in + arg, arg_type, generalizable lv arg_type + end + ~post:(fun (_, arg_type, _) -> enforce_current_level env arg_type) + in + begin match !self_coercion, get_desc ty' with + | ((path, r) :: _, Tconstr (path', _, _)) + when is_self arg && Path.same path path' -> + (* prerr_endline "self coercion"; *) + r := loc :: !r; + force () + | _ when free_variables ~env arg_type = [] + && free_variables ~env ty' = [] -> + if not gen && (* first try a single coercion *) + let snap = snapshot () in + let ty, _b = enlarge_type env ty' in + try + force (); Ctype.unify env arg_type ty; true + with Unify _ -> + backtrack snap; false + then () + else begin try + let force' = subtype env arg_type ty' in + force (); force' (); + if not gen && !Clflags.principal then + Location.prerr_warning loc + (Warnings.Not_principal "this ground coercion"); + with Subtype err -> + (* prerr_endline "coercion failed"; *) + raise (Error (loc, env, Not_subtype err)) + end; + | _ -> + let ty, b = enlarge_type env ty' in + force (); + begin try Ctype.unify env arg_type ty with Unify err -> + let expanded = full_expand ~may_forget_scope:true env ty' in + raise(Error(loc_arg, env, + Coercion_failure ({ ty = ty'; expanded }, err, b))) + end + end; + (arg, ty', Texp_coerce (None, cty')) + | Some sty -> + let cty, ty, force, cty', ty', force' = + with_local_level_iter ~post:generalize_structure begin fun () -> + let (cty, ty, force) = + Typetexp.transl_simple_type_delayed env type_mode sty + and (cty', ty', force') = + Typetexp.transl_simple_type_delayed env type_mode sty' + in + ((cty, ty, force, cty', ty', force'), + [ ty; ty' ]) + end + in + begin try + let force'' = subtype env (instance ty) (instance ty') in + force (); force' (); force'' () + with Subtype err -> + raise (Error (loc, env, Not_subtype err)) + end; + (type_with_constraint env expected_mode ty, + instance ty', Texp_coerce (Some cty, cty')) + +and type_constraint env sty type_mode = + (* Pretend separate = true, 1% slowdown for lablgtk *) + let cty = + with_local_level begin fun () -> + Typetexp.transl_simple_type ~new_var_jkind:Any env ~closed:false type_mode sty + end + ~post:(fun cty -> generalize_structure cty.ctyp_type) + in + cty.ctyp_type, Texp_constraint cty + +(** Types a body in the scope of a coercion (:>) or a constraint (:), and + unifies the inferred type with the expected type. + @param loc the location of the overall constraint + @param loc_arg the location of the thing being constrained +*) +and type_constraint_expect + : type a. a constraint_arg -> _ -> _ -> _ -> loc_arg:_ -> _ -> _ -> a * _ * _ + = + fun constraint_arg env expected_mode loc ~loc_arg constraint_ ty_expected -> + let ret, ty, exp_extra = + let open Jane_syntax.N_ary_functions in + let { type_constraint = constraint_; mode_annotations } = constraint_ in + let type_mode = Typemode.transl_alloc_mode mode_annotations in + match constraint_ with + | Pcoerce (ty_constrain, ty_coerce) -> + type_coerce constraint_arg env expected_mode loc ty_constrain ty_coerce + type_mode ~loc_arg + | Pconstraint ty_constrain -> + let ty, exp_extra = type_constraint env ty_constrain type_mode in + constraint_arg.type_with_constraint env expected_mode ty, ty, exp_extra + in + unify_exp_types loc env ty (instance ty_expected); + ret, ty, exp_extra + and type_ident env ?(recarg=Rejected) lid = - let (path, desc, mode, reason) = Env.lookup_value ~loc:lid.loc lid.txt env in + let path, desc, actual_mode = Env.lookup_value ~loc:lid.loc lid.txt env in (* Mode crossing here is needed only because of the strange behaviour of [type_let] - it checks the LHS before RHS. Had it checks the RHS before LHS, identifiers would be mode crossed when being added to the environment. *) - let mode = mode_cross_to_min env desc.val_type mode in + let actual_mode = actual_mode_cross_left env desc.val_type actual_mode in let is_recarg = match get_desc desc.val_type with | Tconstr(p, _, _) -> Path.is_constructor_typath p @@ -6224,25 +6604,27 @@ and type_ident env ?(recarg=Rejected) lid = let val_type, kind = match desc.val_kind with | Val_prim prim -> - let ty, mode = instance_prim_mode prim (instance desc.val_type) in + let ty, mode, sort = instance_prim prim desc.val_type in + let ty = instance ty in begin match prim.prim_native_repr_res, mode with - (* if the locality of returning value of the primitive is poly + (* if the locality of returned value of the primitive is poly we then register allocation for further optimization *) | (Prim_poly, _), Some mode -> register_allocation_mode - (Alloc.prod mode Uniqueness.shared Linearity.many) + (Alloc.meet [Alloc.max_with (Comonadic Areality) mode; + Alloc.max_with (Comonadic Linearity) Linearity.many]) | _ -> () end; - ty, Id_prim mode + ty, Id_prim (Option.map Locality.disallow_right mode, sort) | _ -> instance desc.val_type, Id_value in - path, mode, reason, { desc with val_type }, kind + path, actual_mode, { desc with val_type }, kind and type_binding_op_ident env s = let loc = s.loc in let lid = Location.mkloc (Longident.Lident s.txt) loc in - let path, mode, _reason, desc, kind = type_ident env lid in - submode ~env ~loc:lid.loc ~reason:Other mode mode_legacy; + let path, actual_mode, desc, kind = type_ident env lid in + actual_submode ~env ~loc:lid.loc ~reason:Other actual_mode mode_legacy; let path = match desc.val_kind with | Val_ivar _ -> @@ -6258,174 +6640,347 @@ and type_binding_op_ident env s = assert (kind = Id_value); path, desc +(* Typecheck parameters one at a time followed by the body. Later parameters + are checked in the scope of earlier ones. That's necessary to support + constructs like [fun (type a) (x : a) -> ...] and + [fun (module M : S) (x : M.t) -> ...]. + + Operates like [type_expect] in that it unifies the "type of the remaining + function params + body" with [ty_expected], and returns out the inferred + type. + + See [split_function_ty] for the meaning of [first] and [in_function]. + + See [type_function_result] for the meaning of the returned type. +*) and type_function - ?in_function loc attrs env (expected_mode : expected_mode) - ty_expected_explained arg_label ~mode_annots ~has_poly caselist = - let { ty = ty_expected; explanation } = ty_expected_explained in - let alloc_mode = Value.regional_to_global_alloc expected_mode.mode in - let alloc_mode = - if expected_mode.exact then - (* expected_mode.mode is exact *) - alloc_mode - else - (* expected_mode.mode is upper bound *) - fst (Alloc.newvar_below alloc_mode) - in - if expected_mode.strictly_local then - Locality.submode_exn Locality.local (Alloc.locality alloc_mode); - register_allocation_mode alloc_mode; - let (loc_fun, ty_fun) = - match in_function with - | Some (loc_fun, ty_fun, _) -> (loc_fun, ty_fun) - | None -> (loc, instance ty_expected) - in - let uncurried_function = - match caselist with - | [{pc_lhs = _; pc_guard = None; pc_rhs = e}] -> - is_an_uncurried_function e - | _ -> false - in - let separate = !Clflags.principal || Env.has_local_constraints env in - let { ty_arg; arg_mode; arg_sort; ty_ret; ret_mode; ret_sort } = - with_local_level_iter_if separate ~post:generalize_structure begin fun () -> - let force_tpoly = - (* If [has_poly] is true then we rely on the later call to - type_pat to enforce the invariant that the parameter type - be a [Tpoly] node *) - not has_poly - in - let { ty_arg; ty_ret; _ } as filtered_arrow = - try filter_arrow env (instance ty_expected) arg_label ~force_tpoly - with Filter_arrow_failed err -> - let first = Option.is_none in_function in - let err = - error_of_filter_arrow_failure ~explanation ~first ty_fun err + env (expected_mode : expected_mode) ty_expected + params_suffix body_constraint body ~first ~in_function + : type_function_result + = + let open Jane_syntax.N_ary_functions in + let { ty_fun; loc_fun; _ } = in_function in + (* The "rest of the function" extends from the start of the first parameter + to the end of the overall function. The parser does not construct such + a location so we forge one for type errors. + *) + let loc : Location.t = + match params_suffix, body with + | param :: _, _ -> + { loc_start = param.pparam_loc.loc_start; + loc_end = loc_fun.loc_end; + loc_ghost = true; + } + | [], Pfunction_body pexp -> pexp.pexp_loc + | [], Pfunction_cases (_, loc_cases, _) -> loc_cases + in + match params_suffix with + | { pparam_desc = Pparam_newtype (newtype_var, jkind_annot) } :: rest -> + (* Check everything else in the scope of (type a). *) + let (params, body, newtypes, contains_gadt, fun_alloc_mode, ret_info), + exp_type, jkind_annot = + type_newtype env newtype_var jkind_annot (fun env -> + let { function_ = exp_type, params, body; + newtypes; params_contain_gadt = contains_gadt; + fun_alloc_mode; ret_info; + } + = + (* mimic the typing of Pexp_newtype by minting a new type var, + like [type_exp]. + *) + type_function env expected_mode + (newvar (Jkind.Primitive.any ~why:Dummy_jkind)) + rest body_constraint body ~in_function ~first in - raise (Error(loc_fun, env, err)) - in - (filtered_arrow, [ty_arg; ty_ret]) - end - in - apply_mode_annots ~loc ~env ~ty_expected mode_annots arg_mode; - if not has_poly && not (tpoly_is_mono ty_arg) && !Clflags.principal - && get_level ty_arg < Btype.generic_level then begin - let snap = Btype.snapshot () in - let really_poly = - try - unify env (newmono (newvar (Jkind.any ~why:Dummy_jkind))) ty_arg; - false - with Unify _ -> true - in - Btype.backtrack snap; - if really_poly then - Location.prerr_warning loc - (Warnings.Not_principal "this higher-rank function"); - end; - let env, region_locked = - match in_function with - | Some (_, _, region_locked) -> env, region_locked - | None -> - let region_locked = not (Is_local_returning.function_ caselist) in - let env = - Env.add_closure_lock - ?closure_context:expected_mode.closure_context - (Alloc.locality alloc_mode) - (Alloc.linearity alloc_mode) - env + (params, body, newtypes, contains_gadt, fun_alloc_mode, ret_info), + exp_type) + in + let newtype = newtype_var, jkind_annot in + with_explanation ty_fun.explanation (fun () -> + unify_exp_types loc env exp_type (instance ty_expected)); + { function_ = exp_type, params, body; + params_contain_gadt = contains_gadt; newtypes = newtype :: newtypes; + fun_alloc_mode; ret_info; + } + | { pparam_desc = Pparam_val (arg_label, default_arg, pat); pparam_loc } + :: rest + -> + let typed_arg_label, pat = + Typetexp.transl_label_from_pat arg_label pat + in + let mode_annots, pat = mode_annots_from_pat_attrs pat in + let has_poly = has_poly_constraint pat in + if has_poly && is_optional_parsetree arg_label then + raise(Error(pat.ppat_loc, env, Optional_poly_param)); + if has_poly + && not (Language_extension.is_enabled Polymorphic_parameters) then + raise (Typetexp.Error (loc, env, + Unsupported_extension Polymorphic_parameters)); + let is_final_val_param = + match body with + | Pfunction_cases _ -> false + | Pfunction_body _ -> + (* This may appear quadratic but it's actually linear when amortized + over the outer call to [type_function], as we visit each + [Pparam_newtype] only once. *) + List.for_all + (fun { pparam_desc } -> + match pparam_desc with + | Pparam_val _ -> false + | Pparam_newtype _ -> true) + rest + in + let env, + { filtered_arrow = { ty_arg; arg_mode; ty_ret; ret_mode }; + arg_sort; ret_sort; + ty_arg_mono; expected_pat_mode; expected_inner_mode; + alloc_mode; + } = + split_function_ty env expected_mode ty_expected loc + ~is_first_val_param:first ~is_final_val_param + ~arg_label:typed_arg_label ~in_function ~has_poly ~mode_annots + in + (* [ty_arg_internal] is the type of the parameter viewed internally + to the function. This is different than [ty_arg_mono] exactly for + optional arguments with defaults, where the external [ty_arg_mono] + is optional and the internal view is not optional. + *) + let ty_arg_internal, default_arg = + match default_arg with + | None -> ty_arg_mono, None + | Some default -> + let arg_label = + match arg_label with + | Optional arg_label -> arg_label + | Nolabel | Labelled _ -> + Misc.fatal_error "[default] allowed only with optional argument" + in + let default_arg_jkind, default_arg_sort = + Jkind.of_new_sort_var ~why:Optional_arg_default + in + let ty_default_arg = newvar default_arg_jkind in + begin + try unify env (type_option ty_default_arg) ty_arg_mono + with Unify _ -> assert false; + end; + (* Issue#12668: Retain type-directed disambiguation of + ?x:(y : Variant.t = Constr) + *) + let default = + match pat.ppat_desc with + | Ppat_constraint (_, sty) -> + let gloc = { default.pexp_loc with loc_ghost = true } in + Ast_helper.Exp.constraint_ default sty ~loc:gloc + | _ -> default + in + (* Defaults are always global. They can be moved out of the + function's region by Simplf.split_default_wrapper. *) + let default_arg = + type_expect env mode_legacy default (mk_expected ty_default_arg) + in + ty_default_arg, Some (default_arg, arg_label, default_arg_sort) + in + let (pat, params, body, ret_info, newtypes, contains_gadt, curry), partial = + (* Check everything else in the scope of the parameter. *) + map_half_typed_cases Value env expected_pat_mode + ty_arg_internal ty_ret pat.ppat_loc + ~check_if_total:true + (* We don't make use of [case_data] here so we pass unit. *) + [ { pattern = pat; has_guard = false; needs_refute = false }, () ] + ~type_body:begin + fun () pat ~ext_env ~ty_expected ~ty_infer:_ + ~contains_gadt:param_contains_gadt -> + let { function_ = _, params_suffix, body; + newtypes; params_contain_gadt = suffix_contains_gadt; + fun_alloc_mode; ret_info; + } + = + type_function ext_env expected_inner_mode ty_expected + rest body_constraint body + ~in_function ~first:false + in + let contains_gadt = + if param_contains_gadt then + Contains_gadt + else + suffix_contains_gadt + in + let curry = + match fun_alloc_mode with + (* See the comment on the [fun_alloc_mode] field for its + corralation to [is_final_val_param]. *) + | None -> + assert(is_final_val_param); + Final_arg + | Some fun_alloc_mode -> + assert(not is_final_val_param); + (* Handle mode crossing of [arg_mode]. Note that [close_over] + uses the [arg_mode.comonadic] as a left mode, and + [arg_mode.monadic] as a right mode, hence they need to be + mode-crossed differently. *) + let arg_mode = alloc_mode_cross_to_max_min env ty_arg arg_mode in + begin match + Alloc.submode (Alloc.close_over arg_mode) fun_alloc_mode + with + | Ok () -> () + | Error e -> + raise (Error(loc_fun, env, Uncurried_function_escapes e)) + end; + begin match + Alloc.submode (Alloc.partial_apply alloc_mode) fun_alloc_mode + with + | Ok () -> () + | Error e -> + raise (Error(loc_fun, env, Uncurried_function_escapes e)) + end; + More_args {partial_mode = Alloc.disallow_right fun_alloc_mode} + in + pat, params_suffix, body, ret_info, newtypes, contains_gadt, curry + end + |> function + (* The result must be a singleton because we passed a singleton + list above. *) + | [ result ], partial -> result, partial + | ([] | _ :: _ :: _), _ -> assert false in - let env = - if region_locked then Env.add_region_lock env - else env + let exp_type = + instance + (newgenty + (Tarrow + ((typed_arg_label, arg_mode, ret_mode), ty_arg, ty_ret, commu_ok))) + in + (* This is quadratic, as it operates over the entire tail of the + type for each new parameter. Now that functions are n-ary, we + could possibly run this once. + *) + with_explanation ty_fun.explanation (fun () -> + unify_exp_types loc env exp_type (instance ty_expected)); + (* This is quadratic, as it extracts all of the parameters from an arrow + type for each parameter that's added. Now that functions are n-ary, + there might be an opportunity to improve this. + *) + let not_nolabel_function ty = + (* [list_labels] does expansion and is potentially expensive; only + call this when necessary. *) + let ls, tvar = list_labels env ty in + List.for_all (( <> ) Nolabel) ls && not tvar + in + if is_optional typed_arg_label && not_nolabel_function ty_ret then + Location.prerr_warning pat.pat_loc + Warnings.Unerasable_optional_argument + else if is_position typed_arg_label && not_nolabel_function ty_ret then + Location.prerr_warning pat.pat_loc + Warnings.Unerasable_position_argument; + let fp_kind, fp_param = + match default_arg with + | None -> + let param = name_pattern "param" [ pat ] in + Tparam_pat pat, param + | Some (default_arg, arg_label, default_arg_sort) -> + let param = Ident.create_local ("*opt*" ^ arg_label) in + Tparam_optional_default (pat, default_arg, default_arg_sort), param + in + let param = + { has_poly; + param = + { fp_kind; + fp_arg_label = typed_arg_label; + fp_param; + fp_partial = partial; + fp_newtypes = newtypes; + fp_sort = arg_sort; + fp_mode = Alloc.disallow_right arg_mode; + fp_curry = curry; + fp_loc = pparam_loc; + }; + } in - env, region_locked - in - let arg_value_mode = Value.of_alloc arg_mode in - let arg_value_mode = - if region_locked then Value.local_to_regional arg_value_mode - else arg_value_mode - in - let cases_expected_mode, curry = - if uncurried_function then begin - (* no need to check mode crossing in this case*) - (* because ty_res always a function *) - let inner_alloc_mode, _ = Alloc.newvar_below ret_mode in - begin match - Alloc.submode (Alloc.close_over arg_mode) inner_alloc_mode - with - | Ok () -> () - | Error e -> - raise (Error(loc_fun, env, Uncurried_function_escapes e)) - end; - begin match - Alloc.submode (Alloc.partial_apply alloc_mode) inner_alloc_mode - with - | Ok () -> () - | Error e -> - raise (Error(loc_fun, env, Uncurried_function_escapes e)) - end; - mode_exact (Value.of_alloc inner_alloc_mode), - More_args {partial_mode = inner_alloc_mode} - end - else begin - let ret_value_mode = Value.of_alloc ret_mode in - let ret_value_mode = - if region_locked then mode_return ret_value_mode - else begin - (* if the function has no region, we force the ret_mode to be local *) - match - Locality.submode Locality.local (Alloc.locality ret_mode) - with - | Ok () -> mode_default ret_value_mode - | Error () -> raise (Error (loc_fun, env, Function_returns_local)) - end + let ret_info = + match ret_info with + | Some _ as x -> x + | None -> Some { ret_sort; ret_mode = Alloc.disallow_right ret_mode } in - let ret_value_mode = expect_mode_cross env ty_ret ret_value_mode in - ret_value_mode, - Final_arg { partial_mode = Alloc.join [arg_mode; alloc_mode] } - end - in - let in_function = - if uncurried_function then - Some (loc_fun, ty_fun, region_locked) - else - None - in - let ty_arg_mono = - if has_poly then ty_arg - else begin - let ty, vars = tpoly_get_poly ty_arg in - if vars = [] then ty - else begin - with_level ~level:generic_level - (fun () -> snd (instance_poly ~keep_names:true false vars ty)) - end - end - in - let cases, partial = - type_cases Value ?in_function env (simple_pat_mode arg_value_mode) - cases_expected_mode ty_arg_mono (mk_expected ty_ret) true loc caselist in - let not_nolabel_function ty = - let ls, tvar = list_labels env ty in - List.for_all ((<>) Nolabel) ls && not tvar - in - if is_optional arg_label && not_nolabel_function ty_ret then - Location.prerr_warning (List.hd cases).c_lhs.pat_loc - Warnings.Unerasable_optional_argument; - let param = name_cases "param" cases in - let region = region_locked && not uncurried_function in - let warnings = Warnings.backup () in - re { - exp_desc = - Texp_function - { arg_label; param; cases; partial; region; curry; warnings; - arg_mode; arg_sort; alloc_mode; ret_sort }; - exp_loc = loc; exp_extra = []; - exp_type = - instance (newgenty (Tarrow((arg_label,arg_mode,ret_mode), - ty_arg, ty_ret, commu_ok))); - exp_attributes = attrs; - exp_env = env } - + { function_ = exp_type, param :: params, body; + newtypes = []; params_contain_gadt = contains_gadt; + ret_info; fun_alloc_mode = Some alloc_mode; + } + | [] -> + let exp_type, body, fun_alloc_mode, ret_info = + match body with + | Pfunction_body body -> + let body = + match body_constraint with + | None -> type_expect env expected_mode body (mk_expected ty_expected) + | Some constraint_ -> + let body_loc = body.pexp_loc in + let body, exp_type, exp_extra = + type_constraint_expect (expression_constraint body) + env expected_mode body_loc ~loc_arg:body_loc constraint_ ty_expected + in + { body with + exp_extra = (exp_extra, body_loc, []) :: body.exp_extra; + exp_type; + } + in + body.exp_type, Tfunction_body body, None, None + | Pfunction_cases (cases, _, attributes) -> + let type_cases_expect env expected_mode ty_expected = + type_function_cases_expect + env expected_mode ty_expected loc cases attributes ~in_function + ~first + in + let (cases, exp_type, fun_alloc_mode, ret_info), exp_extra = + match body_constraint with + | None -> type_cases_expect env expected_mode ty_expected, None + | Some constraint_ -> + (* The typing of function case coercions/constraints is + analogous to the typing of expression coercions/constraints. + + - [type_with_constraint]: If there is a constraint, then call + [type_argument] on the cases, and discard the cases' + inferred type in favor of the constrained type. (Function + cases aren't inferred, so [type_argument] would just call + [type_expect] straightaway, so we do the same here.) + - [type_without_constraint]: If there is just a coercion and + no constraint, call [type_exp] on the cases and surface the + cases' inferred type to [type_constraint_expect]. *) + let function_cases_constraint_arg = + { is_self = (fun _ -> false); + type_with_constraint = (fun env expected_mode ty -> + let cases, _, fun_alloc_mode, ret_info = + type_cases_expect env expected_mode ty + in + cases, fun_alloc_mode, ret_info); + type_without_constraint = (fun env expected_mode -> + let cases, ty_fun, fun_alloc_mode, ret_info = + (* The analogy to [type_exp] for expressions. *) + type_cases_expect env expected_mode + (newvar (Jkind.Primitive.any ~why:Dummy_jkind)) + in + (cases, fun_alloc_mode, ret_info), ty_fun); + } + in + let (body, fun_alloc_mode, ret_info), exp_type, exp_extra = + type_constraint_expect function_cases_constraint_arg + env expected_mode loc constraint_ ty_expected ~loc_arg:loc + in + (body, exp_type, fun_alloc_mode, ret_info), Some exp_extra + in + let cases = + match exp_extra with + | None -> cases + | Some _ as fc_exp_extra -> { cases with fc_exp_extra } + in + exp_type, Tfunction_cases cases, Some fun_alloc_mode, Some ret_info + in + { function_ = exp_type, [], body; newtypes = []; + (* [No_gadt] is fine because this return value is only meant to indicate + whether [params] (here, the empty list) contains any GADT, not whether + the body is a [Tfunction_cases] whose patterns include a GADT. + *) + params_contain_gadt = No_gadt; + ret_info; fun_alloc_mode; + } and type_label_access env srecord usage lid = let mode = Value.newvar () in @@ -6695,17 +7250,22 @@ and type_format loc str env = with Failure msg -> raise (Error (loc, env, Invalid_format msg)) -and type_label_exp create env (expected_mode : expected_mode) loc ty_expected +and type_option_some env expected_mode sarg ty ty0 = + let ty' = extract_option_type env ty in + let ty0' = extract_option_type env ty0 in + let alloc_mode, argument_mode = register_allocation expected_mode in + let arg = type_argument env argument_mode sarg ty' ty0' in + let lid = Longident.Lident "Some" in + let csome = Env.find_ident_constructor Predef.ident_some env in + mkexp (Texp_construct(mknoloc lid , csome, [arg], Some alloc_mode)) + (type_option arg.exp_type) arg.exp_loc arg.exp_env + +(* [expected_mode] is the expected mode of the field. It's already adjusted for + allocation, mutation and modalities. *) +and type_label_exp create env (arg_mode : expected_mode) loc ty_expected (lid, label, sarg) = (* Here also ty_expected may be at generic_level *) let separate = !Clflags.principal || Env.has_local_constraints env in - let rmode = - match label.lbl_repres with - | Record_unboxed | Record_inlined (_, Variant_unboxed) -> - expected_mode - | _ -> mode_subcomponent expected_mode - in - let arg_mode = mode_box_modality label.lbl_global rmode in (* #4682: we try two type-checking approaches for [arg] using backtracking: - first try: we try with [ty_arg] as expected type; - second try; if that fails, we backtrack and try without @@ -6796,7 +7356,9 @@ and type_argument ?explanation ?recarg env (mode : expected_mode) sarg Tarrow(_, ty_arg, ty_res, _) when lv' = generic_level || not !Clflags.principal -> let ty_res', ty_res, changed = loosen_arrow_modes ty_res' ty_res in - let mret, changed' = Alloc.newvar_below_comonadic mret in + let {comonadic; monadic} = mret in + let comonadic, changed' = Alloc.Comonadic.newvar_below comonadic in + let mret = {comonadic; monadic} in let marg, changed'' = Alloc.newvar_above marg in if changed || changed' || changed'' then newty2 ~level:lv' (Tarrow((l, marg, mret), ty_arg', ty_res', commu_ok)), @@ -6838,23 +7400,26 @@ and type_argument ?explanation ?recarg env (mode : expected_mode) sarg in match may_coerce with Some (safe_expect, lv) -> - (* apply optional arguments when expected type is "" *) + (* apply omittable arguments when expected type is "" *) (* we must be very careful about not breaking the semantics *) let exp_mode, _ = Value.newvar_below mode.mode in let texp = with_local_level_if_principal ~post:generalize_structure_exp - (fun () -> type_exp env {mode with mode = exp_mode} sarg) + (fun () -> type_exp env {mode with mode = Value.disallow_left exp_mode} sarg) in let rec make_args args ty_fun = match get_desc (expand_head env ty_fun) with | Tarrow ((l,_marg,_mret),ty_arg,ty_fun,_) when is_optional l -> let ty = - option_none env (instance (tpoly_get_mono ty_arg)) + type_option_none env (instance (tpoly_get_mono ty_arg)) sarg.pexp_loc in (* CR layouts v5: change value assumption below when we allow non-values in structures. *) make_args ((l, Arg (ty, Jkind.Sort.value)) :: args) ty_fun + | Tarrow ((l,_marg,_mret),_,ty_fun,_) when is_position l -> + let arg = src_pos (Location.ghostify sarg.pexp_loc) [] env in + make_args ((l, Arg (arg, Jkind.Sort.value)) :: args) ty_fun | Tarrow ((l,_,_),_,ty_res',_) when l = Nolabel || !Clflags.classic -> List.rev args, ty_fun, no_labels ty_res' | Tvar _ -> List.rev args, ty_fun, false @@ -6878,24 +7443,24 @@ and type_argument ?explanation ?recarg env (mode : expected_mode) sarg in unify_exp env {texp with exp_type = ty_fun} ty_expected; if args = [] then texp else begin - (* In this case, we're allocating a new closure, so [sarg] needs - to be valid at [mode_subcomponent mode], not just [mode] *) - let alloc_mode = register_allocation mode in + let alloc_mode, mode_subcomponent = register_allocation mode in submode ~loc:sarg.pexp_loc ~env ~reason:Other - exp_mode (mode_subcomponent mode); + exp_mode mode_subcomponent; (* eta-expand to avoid side effects *) - let var_pair ~mode name ty = + let var_pair ~(mode : Value.lr) name ty = let id = Ident.create_local name in let desc = { val_type = ty; val_kind = Val_reg; val_attributes = []; + val_zero_alloc = Zero_alloc.default; + val_modalities = Modality.Value.id; val_loc = Location.none; val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); } in let exp_env = Env.add_value ~mode id desc env in let uu = unique_use ~loc:sarg.pexp_loc ~env mode mode in - {pat_desc = Tpat_var (id, mknoloc name, desc.val_uid, mode); + {pat_desc = Tpat_var (id, mknoloc name, desc.val_uid, Value.disallow_right mode); pat_type = ty; pat_extra=[]; pat_attributes = []; @@ -6906,7 +7471,9 @@ and type_argument ?explanation ?recarg env (mode : expected_mode) sarg Texp_ident(Path.Pident id, mknoloc (Longident.Lident name), desc, Id_value, uu)} in - let eta_mode = Value.local_to_regional (Value.of_alloc marg) in + let eta_mode, _ = Value.newvar_below (alloc_as_value marg) in + Regionality.submode_exn + (Value.proj (Comonadic Areality) eta_mode) Regionality.regional; let eta_pat, eta_var = var_pair ~mode:eta_mode "eta" ty_arg in (* CR layouts v10: When we add abstract jkinds, the eta expansion here becomes impossible in some cases - we'll need better errors. For test @@ -6921,34 +7488,45 @@ and type_argument ?explanation ?recarg env (mode : expected_mode) sarg let arg_sort = type_sort ~why:Function_argument ty_arg in let ret_sort = type_sort ~why:Function_result ty_res in let func texp = - let ret_mode = Value.of_alloc mret in + let ret_mode = alloc_as_value mret in let e = {texp with exp_type = ty_res; exp_desc = Texp_apply (texp, args @ [Nolabel, Arg (eta_var, arg_sort)], Nontail, ret_mode - |> Value.locality - |> Regionality.regional_to_global_locality)} + |> Value.proj (Comonadic Areality) + |> regional_to_global + |> Locality.disallow_right, + None)} in - let cases = [case eta_pat e] in + let cases = [ case eta_pat e ] in + let cases_loc = { texp.exp_loc with loc_ghost = true } in let param = name_cases "param" cases in - let partial_mode = - Alloc.join [marg; Value.regional_to_global_alloc mode.mode] - in - let curry = Final_arg {partial_mode} in - { texp with exp_type = ty_fun; - exp_desc = Texp_function { arg_label = Nolabel; param; cases; - partial = Total; region = false; curry; - warnings = Warnings.backup (); - arg_mode = marg; arg_sort; ret_sort; - alloc_mode } } + { texp with exp_type = ty_fun; exp_desc = + Texp_function + { params = []; + body = + Tfunction_cases + { fc_cases = cases; fc_partial = Total; fc_param = param; + fc_env = env; fc_ret_type = ty_res; + fc_loc = cases_loc; fc_exp_extra = None; + fc_attributes = []; fc_arg_mode = Alloc.disallow_right marg; + fc_arg_sort = arg_sort; + }; + ret_mode = Alloc.disallow_right mret; + ret_sort; + alloc_mode; + region = false; + zero_alloc = Zero_alloc.default + } + } in Location.prerr_warning texp.exp_loc (Warnings.Eliminated_optional_arguments (List.map (fun (l, _) -> Printtyp.string_of_label l) args)); if warn then Location.prerr_warning texp.exp_loc - (Warnings.Non_principal_labels "eliminated optional argument"); + (Warnings.Non_principal_labels "eliminated omittable argument"); (* let-expand to have side effects *) let let_pat, let_var = var_pair ~mode:exp_mode "arg" texp.exp_type in re { texp with exp_type = ty_fun; @@ -6956,6 +7534,7 @@ and type_argument ?explanation ?recarg env (mode : expected_mode) sarg Texp_let (Nonrecursive, [{vb_pat=let_pat; vb_expr=texp; vb_sort=arg_sort; vb_attributes=[]; vb_loc=Location.none; + vb_rec_kind = Dynamic; }], func let_var) } end @@ -6970,32 +7549,26 @@ and type_argument ?explanation ?recarg env (mode : expected_mode) sarg and type_apply_arg env ~app_loc ~funct ~index ~position_and_mode ~partial_app (lbl, arg) = match arg with | Arg (Unknown_arg { sarg; ty_arg_mono; mode_arg; sort_arg }) -> - let mode, _ = Alloc.newvar_below mode_arg in - let expected_mode = - mode_argument ~funct ~index ~position_and_mode ~partial_app mode in + let expected_mode, mode_arg = + mode_argument ~funct ~index ~position_and_mode ~partial_app mode_arg in let arg = type_expect env expected_mode sarg (mk_expected ty_arg_mono) in if is_optional lbl then (* CR layouts v5: relax value requirement *) unify_exp env arg - (type_option(newvar (Jkind.value ~why:Type_argument))); - (lbl, Arg (arg, expected_mode.mode, sort_arg)) + (type_option(newvar Predef.option_argument_jkind)); + (lbl, Arg (arg, mode_arg, sort_arg)) | Arg (Known_arg { sarg; ty_arg; ty_arg0; mode_arg; wrapped_in_some; sort_arg }) -> - let mode, _ = Alloc.newvar_below mode_arg in - let expected_mode = - mode_argument ~funct ~index ~position_and_mode ~partial_app mode in + let expected_mode, mode_arg = + mode_argument ~funct ~index ~position_and_mode ~partial_app mode_arg in let ty_arg', vars = tpoly_get_poly ty_arg in let arg = if vars = [] then begin let ty_arg0' = tpoly_get_mono ty_arg0 in if wrapped_in_some then begin - option_some env - (type_argument env (mode_subcomponent expected_mode) sarg - (extract_option_type env ty_arg') - (extract_option_type env ty_arg0')) - expected_mode.mode + type_option_some env expected_mode sarg ty_arg' ty_arg0' end else begin type_argument env expected_mode sarg ty_arg' ty_arg0' end @@ -7005,7 +7578,7 @@ and type_apply_arg env ~app_loc ~funct ~index ~position_and_mode ~partial_app (l let snap = Btype.snapshot () in let really_poly = try - unify env (newmono (newvar (Jkind.any ~why:Dummy_jkind))) + unify env (newmono (newvar (Jkind.Primitive.any ~why:Dummy_jkind))) ty_arg; false with Unify _ -> true @@ -7041,10 +7614,16 @@ and type_apply_arg env ~app_loc ~funct ~index ~position_and_mode ~partial_app (l {arg with exp_type = instance arg.exp_type} end in - (lbl, Arg (arg, expected_mode.mode, sort_arg)) - | Arg (Eliminated_optional_arg { ty_arg; sort_arg; _ }) -> - let arg = option_none env (instance ty_arg) Location.none in - (lbl, Arg (arg, Value.legacy, sort_arg)) + (lbl, Arg (arg, mode_arg, sort_arg)) + | Arg (Eliminated_optional_arg { ty_arg; sort_arg; expected_label; _ }) -> + (match expected_label with + | Optional _ -> + let arg = type_option_none env (instance ty_arg) Location.none in + (lbl, Arg (arg, Mode.Value.legacy, sort_arg)) + | Position _ -> + let arg = src_pos (Location.ghostify funct.exp_loc) [] env in + (lbl, Arg (arg, Mode.Value.legacy, sort_arg)) + | Labelled _ | Nolabel -> assert false) | Omitted _ as arg -> (lbl, arg) and type_application env app_loc expected_mode position_and_mode @@ -7056,19 +7635,25 @@ and type_application env app_loc expected_mode position_and_mode in match sargs with | (* Special case for ignore: avoid discarding warning *) - [Nolabel, sarg] when is_ignore funct -> - let {ty_arg; arg_mode; arg_sort; ty_ret; ret_mode} = + [Parsetree.Nolabel, sarg] when is_ignore funct -> + let {ty_arg; arg_mode; ty_ret; ret_mode} = with_local_level_if_principal (fun () -> filter_arrow_mono env (instance funct.exp_type) Nolabel ) ~post:(fun {ty_ret; _} -> generalize_structure ty_ret) in - let ap_mode = Alloc.locality ret_mode in + let type_sort ~why ty = + match Ctype.type_sort ~why env ty with + | Ok sort -> sort + | Error err -> raise (Error (app_loc, env, Function_type_not_rep (ty, err))) + in + let arg_sort = type_sort ~why:Function_argument ty_arg in + let ap_mode = Locality.disallow_right (Alloc.proj (Comonadic Areality) ret_mode) in let mode_res = - mode_cross_to_min env ty_ret (Value.of_alloc ret_mode) + mode_cross_left env ty_ret (alloc_as_value ret_mode) in submode ~loc:app_loc ~env ~reason:Other mode_res expected_mode; - let arg_mode = + let arg_mode, _ = mode_argument ~funct ~index:0 ~position_and_mode ~partial_app:false arg_mode in @@ -7082,9 +7667,9 @@ and type_application env app_loc expected_mode position_and_mode begin let ls, tvar = list_labels env funct.exp_type in not tvar && - let labels = List.filter (fun l -> not (is_optional l)) ls in + let labels = List.filter (fun l -> not (is_omittable l)) ls in List.length labels = List.length sargs && - List.for_all (fun (l,_) -> l = Nolabel) sargs && + List.for_all (fun (l,_) -> l = Parsetree.Nolabel) sargs && List.exists (fun l -> l <> Nolabel) labels && (Location.prerr_warning funct.exp_loc @@ -7096,9 +7681,16 @@ and type_application env app_loc expected_mode position_and_mode in let ty_ret, mode_ret, args, position_and_mode = with_local_level_if_principal begin fun () -> + let sargs = List.map + (* Application will never contain Position labels, so no need to pass + argument type here. When checking against the function type, + Labelled arguments will be matched up to Position parameters + based on label names *) + (fun (label, e) -> Typetexp.transl_label label None, e) sargs + in let ty_ret, mode_ret, untyped_args = collect_apply_args env funct ignore_labels ty (instance ty) - (Value.regional_to_local_alloc funct_mode) sargs ret_tvar + (value_to_alloc_r2l funct_mode) sargs ret_tvar in let partial_app = is_partial_apply untyped_args in let position_and_mode = @@ -7117,9 +7709,9 @@ and type_application env app_loc expected_mode position_and_mode ty_ret, mode_ret, args, position_and_mode end ~post:(fun (ty_ret, _, _, _) -> generalize_structure ty_ret) in - let ap_mode = Alloc.locality mode_ret in + let ap_mode = Locality.disallow_right (Alloc.proj (Comonadic Areality) mode_ret) in let mode_ret = - mode_cross_to_min env ty_ret (Value.of_alloc mode_ret) + mode_cross_left env ty_ret (alloc_as_value mode_ret) in submode ~loc:app_loc ~env ~reason:(Application ty_ret) mode_ret expected_mode; @@ -7127,6 +7719,42 @@ and type_application env app_loc expected_mode position_and_mode check_tail_call_local_returning app_loc env ap_mode position_and_mode; args, ty_ret, ap_mode, position_and_mode +and type_tuple ~loc ~env ~(expected_mode : expected_mode) ~ty_expected + ~explanation ~attributes sexpl = + let arity = List.length sexpl in + assert (arity >= 2); + let alloc_mode, argument_mode = register_allocation_value_mode expected_mode.mode in + (* CR layouts v5: non-values in tuples *) + let labeled_subtypes = + List.map (fun (label, _) -> label, + newgenvar (Jkind.Primitive.value_or_null ~why:Tuple_element)) + sexpl + in + let to_unify = newgenty (Ttuple labeled_subtypes) in + with_explanation explanation (fun () -> + unify_exp_types loc env to_unify (generic_instance ty_expected)); + let argument_modes = + if List.compare_length_with expected_mode.tuple_modes arity = 0 then + expected_mode.tuple_modes + else List.init arity (fun _ -> argument_mode) + in + let types_and_modes = List.combine labeled_subtypes argument_modes in + let expl = + List.map2 + (fun (label, body) ((_, ty), argument_mode) -> + let argument_mode = mode_default argument_mode in + let argument_mode = expect_mode_cross env ty argument_mode in + (label, type_expect env argument_mode body (mk_expected ty))) + sexpl types_and_modes + in + re { + exp_desc = Texp_tuple (expl, alloc_mode); + exp_loc = loc; exp_extra = []; + (* Keep sharing *) + exp_type = newty (Ttuple (List.map (fun (label, e) -> label, e.exp_type) expl)); + exp_attributes = attributes; + exp_env = env } + and type_construct env (expected_mode : expected_mode) loc lid sarg ty_expected_explained attrs = let { ty = ty_expected; explanation } = ty_expected_explained in @@ -7151,17 +7779,31 @@ and type_construct env (expected_mode : expected_mode) loc lid sarg in let sargs = match sarg with - None -> [] - | Some {pexp_desc = Pexp_tuple sel} when - constr.cstr_arity > 1 || Builtin_attributes.explicit_arity attrs - -> sel - | Some se -> [se] in + | None -> [] + | Some se -> begin + match Jane_syntax.Expression.of_ast se with + | Some (Jexp_tuple (_ : _ list), _) when + constr.cstr_arity > 1 || Builtin_attributes.explicit_arity attrs -> + raise(Error(loc, env, Constructor_labeled_arg)) + | Some (( Jexp_tuple _ + | Jexp_comprehension _ + | Jexp_immutable_array _ + | Jexp_n_ary_function _ + | Jexp_layout _ + | Jexp_modes _ ), _) -> [se] + | None -> match se.pexp_desc with + | Pexp_tuple sel when + constr.cstr_arity > 1 || Builtin_attributes.explicit_arity attrs + -> sel + | _ -> [se] + end + in if List.length sargs <> constr.cstr_arity then raise(Error(loc, env, Constructor_arity_mismatch (lid.txt, constr.cstr_arity, List.length sargs))); let separate = !Clflags.principal || Env.has_local_constraints env in let ty_args, ty_res, texp = - with_local_level_iter_if separate ~post:generalize_structure begin fun () -> + with_local_level_if separate begin fun () -> let ty_args, ty_res, texp = with_local_level_if separate begin fun () -> let (ty_args, ty_res, _) = @@ -7183,11 +7825,14 @@ and type_construct env (expected_mode : expected_mode) loc lid sarg (instance ty_expected)); end in - ((ty_args, ty_res, texp), ty_res::(List.map fst ty_args)) + (ty_args, ty_res, texp) end + ~post:(fun (ty_args, ty_res, _) -> + generalize_structure ty_res; + List.iter (fun {Types.ca_type=ty; _} -> generalize_structure ty) ty_args) in let ty_args0, ty_res = - match instance_list (ty_res :: (List.map fst ty_args)) with + match instance_list (ty_res :: (List.map (fun ca -> ca.Types.ca_type) ty_args)) with t :: tl -> tl, t | _ -> assert false in @@ -7211,13 +7856,13 @@ and type_construct env (expected_mode : expected_mode) loc lid sarg | Variant_unboxed -> expected_mode, None | Variant_boxed _ when constr.cstr_constant -> expected_mode, None | Variant_boxed _ | Variant_extensible -> - mode_subcomponent expected_mode, - Some (register_allocation expected_mode) + let alloc_mode, argument_mode = register_allocation expected_mode in + argument_mode, Some alloc_mode in let args = List.map2 - (fun e ((ty, gf),t0) -> - let argument_mode = mode_box_modality gf argument_mode in + (fun e ({Types.ca_type=ty; ca_modalities=gf; _},t0) -> + let argument_mode = mode_modality gf argument_mode in type_argument ~recarg env argument_mode e ty t0) sargs (List.combine ty_args ty_args0) in @@ -7267,16 +7912,37 @@ and type_statement ?explanation ?(position=RNontail) env sexp = exp, sort end -(* Typing of match cases *) -and type_cases - : type k . k pattern_category -> - ?in_function:_ -> _ -> _ -> _ -> _ -> _ -> _ -> _ -> Parsetree.case list -> - k case list * partial - = fun category ?in_function env pmode emode - ty_arg ty_res_explained partial_flag loc caselist -> - (* ty_arg is _fully_ generalized *) - let { ty = ty_res; explanation } = ty_res_explained in - let patterns = List.map (fun {pc_lhs=p} -> p) caselist in +(* Most of the arguments are the same as [type_cases]. + + Takes a callback which is responsible for typing the body of the case. + The arguments are documented inline in the type signature. + + It takes a callback rather than returning the half-typed cases directly + because the typing of the body must take place at an increased level. + + The overall function returns: + - The data returned by the callback + - Whether the cases' patterns are partial or total +*) +and map_half_typed_cases + : type k ret case_data. + ?additional_checks_for_split_cases:((_ * ret) list -> unit) + -> k pattern_category -> _ -> _ -> _ -> _ -> _ + -> (untyped_case * case_data) list + -> type_body:( + case_data + -> k general_pattern (* the typed pattern *) + -> ext_env:_ (* environment with module variables / pattern variables *) + -> ty_expected:_ (* type to check body in scope of *) + -> ty_infer:_ (* type to infer for the body *) + -> contains_gadt:_ (* whether the pattern contains a GADT *) + -> ret) + -> check_if_total:bool + -> ret list * partial + = fun ?additional_checks_for_split_cases + category env pat_mode + ty_arg ty_res loc caselist ~type_body ~check_if_total -> + let patterns = List.map (fun ((x : untyped_case), _) -> x.pattern) caselist in let contains_polyvars = List.exists contains_polymorphic_variant patterns in let erase_either = contains_polyvars && contains_variant_either ty_arg in let may_contain_gadts = List.exists may_contain_gadts patterns in @@ -7293,8 +7959,8 @@ and type_cases | _ -> false in let needs_exhaust_check = match caselist with - [{pc_rhs = {pexp_desc = Pexp_unreachable}}] -> true - | [{pc_lhs}] when is_var pc_lhs -> false + [ ({ needs_refute = true }, _) ] -> true + | [ ({ pattern }, _) ] when is_var pattern -> false | _ -> true in let outer_level = get_current_level () in @@ -7322,7 +7988,7 @@ and type_cases Printtyp.raw_type_expr ty_arg; *) let half_typed_cases = List.map - (fun ({pc_lhs; pc_guard = _; pc_rhs = _} as case) -> + (fun ({ Parmatch.pattern; _ } as untyped_case, case_data) -> let htc = with_local_level_if_principal begin fun () -> let ty_arg = @@ -7331,13 +7997,14 @@ and type_cases (fun () -> instance ?partial:take_partial_instance ty_arg) in let (pat, ext_env, force, pvs, mvs) = - type_pattern category ~lev ~alloc_mode:pmode env pc_lhs ty_arg - allow_modules + type_pattern category ~lev ~alloc_mode:pat_mode env pattern ty_arg + allow_modules in pattern_force := force @ !pattern_force; { typed_pat = pat; pat_type_for_unif = ty_arg; - untyped_case = case; + untyped_case; + case_data; branch_env = ext_env; pat_vars = pvs; module_vars = mvs; @@ -7365,7 +8032,7 @@ and type_cases else ty_res, (fun env -> env) in (* Unify all cases (delayed to keep it order-free) *) - let ty_arg' = newvar (Jkind.any ~why:Dummy_jkind) in + let ty_arg' = newvar (Jkind.Primitive.any ~why:Dummy_jkind) in let unify_pats ty = List.iter (fun { typed_pat = pat; pat_type_for_unif = pat_ty; _ } -> unify_pat_types pat.pat_loc (ref env) pat_ty ty @@ -7395,20 +8062,23 @@ and type_cases end in (* type bodies *) - let in_function = if List.length caselist = 1 then in_function else None in let ty_res' = instance ty_res in - let cases = with_local_level_if_principal ~post:ignore begin fun () -> + let result = with_local_level_if_principal ~post:ignore begin fun () -> List.map (fun { typed_pat = pat; branch_env = ext_env; pat_vars = pvs; module_vars = mvs; - untyped_case = {pc_lhs = _; pc_guard; pc_rhs}; - contains_gadt; _ } -> + case_data; contains_gadt; _ } + -> let ext_env = if contains_gadt then do_copy_types ext_env else ext_env in + (* Before handing off the cases to the callback, first set up the the + branch environments by adding the variables (and module variables) + from the patterns. + *) let ext_env = add_pattern_variables ext_env pvs ~check:(fun s -> Warnings.Unused_var_strict s) @@ -7421,24 +8091,8 @@ and type_cases type information from preceding branches *) correct_levels ty_res else ty_res in - let guard = - match pc_guard with - | None -> None - | Some scond -> - Some - (type_expect ext_env mode_max scond - (mk_expected ~explanation:When_guard Predef.type_bool)) - in - let exp = - type_expect ?in_function ext_env emode - pc_rhs (mk_expected ?explanation ty_expected) - in - { - c_lhs = pat; - c_guard = guard; - c_rhs = {exp with exp_type = ty_res'} - } - ) + type_body case_data pat ~ext_env ~ty_expected ~ty_infer:ty_res' + ~contains_gadt) half_typed_cases end in let do_init = may_contain_gadts || needs_exhaust_check in @@ -7456,14 +8110,35 @@ and type_cases ty_arg' else ty_arg' in - let val_cases, exn_cases = + (* Split the cases into val and exn cases so we can do the appropriate checks + for exhaustivity and unused variables. + The caller of this function can define custom checks. For some of these + checks, the half-typed case doesn't provide enough info on its own -- for + instance, the check for ambiguous bindings in when guards needs to know the + case body's expression -- so the code pairs each case with its + corresponding element in [result] before handing it off to the caller's + custom checks. + *) + let val_cases_with_result, exn_cases_with_result = match category with - | Value -> (cases : value case list), [] - | Computation -> split_cases env cases in + | Value -> + let val_cases = + List.map2 + (fun htc res -> + { htc.untyped_case with pattern = htc.typed_pat }, res) + half_typed_cases + result + in + (val_cases : (pattern Parmatch.parmatch_case * ret) list), [] + | Computation -> + split_half_typed_cases env (List.combine half_typed_cases result) + in + let val_cases = List.map fst val_cases_with_result in + let exn_cases = List.map fst exn_cases_with_result in if val_cases = [] && exn_cases <> [] then raise (Error (loc, env, No_value_clauses)); let partial = - if partial_flag then + if check_if_total then check_partial ~lev env ty_arg_check loc val_cases else Partial @@ -7476,25 +8151,137 @@ and type_cases check_unused ~lev env ty_arg_check val_cases ; check_unused ~lev env Predef.type_exn exn_cases ; end; - Parmatch.check_ambiguous_bindings val_cases ; - Parmatch.check_ambiguous_bindings exn_cases in if contains_polyvars then add_delayed_check (fun () -> unused_check true) else (* Check for unused cases, do not delay because of gadts *) unused_check false; - ((cases, partial), [ty_res']) + begin + match additional_checks_for_split_cases with + | None -> () + | Some check -> + check val_cases_with_result; + check exn_cases_with_result; + end; + (result, partial), [ty_res'] end (* Ensure that existential types do not escape *) - ~post:(fun ty_res' -> unify_exp_types loc env ty_res' - (newvar (Jkind.any ~why:Dummy_jkind))) + ~post:(fun ty_res' -> enforce_current_level env ty_res') + +(* Typing of match cases *) +and type_cases + : type k . k pattern_category -> + _ -> _ -> _ -> _ -> _ -> check_if_total:bool -> _ -> Parsetree.case list -> + k case list * partial + = fun category env pat_mode expr_mode + ty_arg ty_res_explained ~check_if_total loc caselist -> + let { ty = ty_res; explanation } = ty_res_explained in + let caselist = + List.map (fun case -> Parmatch.untyped_case case, case) caselist + in + (* Most of the work is done by [map_half_typed_cases]. All that's left + is to typecheck the guards and the cases, and then to check for some + warnings that can fire in the presence of guards. + *) + map_half_typed_cases category env pat_mode ty_arg ty_res loc caselist ~check_if_total + ~type_body:begin + fun { pc_guard; pc_rhs } pat ~ext_env ~ty_expected ~ty_infer + ~contains_gadt:_ -> + let guard = + match pc_guard with + | None -> None + | Some scond -> + Some + (type_expect ext_env mode_max scond + (mk_expected ~explanation:When_guard Predef.type_bool)) + in + let exp = + type_expect ext_env expr_mode pc_rhs (mk_expected ?explanation ty_expected) + in + { + c_lhs = pat; + c_guard = guard; + c_rhs = {exp with exp_type = ty_infer} + } + end + ~additional_checks_for_split_cases:(fun cases -> + let cases = + List.map + (fun (case_with_pat, case) -> + { case with c_lhs = case_with_pat.Parmatch.pattern }) cases + in + Parmatch.check_ambiguous_bindings cases) + -and type_newtype ~loc ~env ~expected_mode ~rue ~attributes - name jkind_annot_opt sbody = - let jkind = +(** A version of [type_expect], but that operates over function cases instead + of expressions. The input type is like the [ty_expected] argument to + [type_expect], and the returned type is like the [exp_type] of the + expression returned by [type_expect]. + + See [split_function_ty] for the meaning of [first] and [in_function]. +*) +and type_function_cases_expect + env expected_mode ty_expected loc cases attrs ~first ~in_function = + Builtin_attributes.warning_scope attrs begin fun () -> + let env, + { filtered_arrow = { ty_arg; ty_ret; arg_mode; ret_mode }; + arg_sort; ret_sort; + ty_arg_mono; expected_pat_mode; expected_inner_mode; alloc_mode; + } = + split_function_ty env expected_mode ty_expected loc ~arg_label:Nolabel + ~in_function ~has_poly:false ~mode_annots:Mode.Alloc.Const.Option.none + ~is_first_val_param:first ~is_final_val_param:true + in + let cases, partial = + type_cases Value env + expected_pat_mode expected_inner_mode ty_arg_mono (mk_expected ty_ret) + ~check_if_total:true loc cases + in + let ty_fun = + instance + (newgenty + (Tarrow ((Nolabel, arg_mode, ret_mode), ty_arg, ty_ret, commu_ok))) + in + unify_exp_types loc env ty_fun (instance ty_expected); + let param = name_cases "param" cases in + let cases = + { fc_cases = cases; + fc_partial = partial; + fc_param = param; + fc_loc = loc; + fc_exp_extra = None; + fc_env = env; + fc_ret_type = ty_ret; + fc_attributes = []; + fc_arg_mode = Alloc.disallow_right arg_mode; + fc_arg_sort = arg_sort; + } + in + cases, ty_fun, alloc_mode, + { ret_sort; + ret_mode = Alloc.disallow_right ret_mode } + end + +(** Typecheck the body of a newtype. The "body" of a newtype may be: + - an expression + - a suffix of function parameters together with a function body + That's why this function is polymorphic over the body. + + @param type_body A function that produces a type for the body given the + environment. When typechecking an expression, this is [type_exp]. + @return The type returned by [type_body] but with the Tconstr + nodes for the newtype properly linked, and the jkind annotation written + by the user. +*) +and type_newtype + : type a. _ -> _ -> _ -> (Env.t -> a * type_expr) + -> a * type_expr * Jkind.annotation option = + fun env name jkind_annot_opt type_body -> + let { txt = name; loc = name_loc } : _ Location.loc = name in + let jkind, jkind_annot = Jkind.of_annotation_option_default ~context:(Newtype_declaration name) - ~default:(Jkind.value ~why:Univar) jkind_annot_opt + ~default:(Jkind.Primitive.value ~why:Univar) jkind_annot_opt in let ty = if Typetexp.valid_tyvar_name name then @@ -7503,13 +8290,13 @@ and type_newtype ~loc ~env ~expected_mode ~rue ~attributes newvar jkind in (* Use [with_local_level] just for scoping *) - let body, ety = with_local_level begin fun () -> + with_local_level begin fun () -> (* Create a fake abstract type declaration for name. *) - let decl = new_local_type ~loc jkind in + let decl = new_local_type ~loc:name_loc jkind ~jkind_annot in let scope = create_scope () in let (id, new_env) = Env.enter_type ~scope name decl env in - let body = type_exp new_env expected_mode sbody in + let result, exp_type = type_body new_env in (* Replace every instance of this type constructor in the resulting type. *) let seen = Hashtbl.create 8 in @@ -7522,16 +8309,24 @@ and type_newtype ~loc ~env ~expected_mode ~rue ~attributes | _ -> Btype.iter_type_expr replace t end in - let ety = Subst.type_expr Subst.identity body.exp_type in + let ety = Subst.type_expr Subst.identity exp_type in replace ety; - (body, ety) + (result, ety, jkind_annot) end + +(** [type_newtype] where the "body" is just an expression. *) +and type_newtype_expr + ~loc ~env ~expected_mode ~rue ~attributes name jkind_annot_opt sbody = + let body, ety, jkind_annot = + type_newtype env name jkind_annot_opt (fun env -> + let expr = type_exp env expected_mode sbody in + expr, expr.exp_type) in (* non-expansive if the body is non-expansive, so we don't introduce any new extra node in the typed AST. *) rue { body with exp_loc = loc; exp_type = ety; exp_extra = - (Texp_newtype (name, Option.map Location.get_txt jkind_annot_opt), + (Texp_newtype (name.txt, jkind_annot), loc, attributes) :: body.exp_extra } (* Typing of let bindings *) @@ -7544,19 +8339,7 @@ and type_let ?check ?check_strict ?(force_toplevel = false) | None -> match sexp.pexp_desc with | Pexp_fun _ | Pexp_function _ -> true | Pexp_constraint (e, _) - | Pexp_newtype (_, e) - | Pexp_apply - ({ pexp_desc = Pexp_extension({ - txt = "extension.once" | "ocaml.once" | "once"}, PStr []) }, - [Nolabel, e]) - | Pexp_apply - ({ pexp_desc = Pexp_extension({ - txt = "extension.unique" | "ocaml.unique" | "unique"}, PStr []) }, - [Nolabel, e]) - | Pexp_apply - ({ pexp_desc = Pexp_extension( - {txt = "extension.local"|"ocaml.local"|"local"}, PStr []) }, - [Nolabel, e]) -> sexp_is_fun e + | Pexp_newtype (_, e) -> sexp_is_fun e | _ -> false and jexp_is_fun : Jane_syntax.Expression.t -> _ = function | Jexp_comprehension _ @@ -7564,6 +8347,8 @@ and type_let ?check ?check_strict ?(force_toplevel = false) | Jexp_layout (Lexp_constant _) -> false | Jexp_layout (Lexp_newtype (_, _, e)) -> sexp_is_fun e | Jexp_n_ary_function _ -> true + | Jexp_tuple _ -> false + | Jexp_modes (Coerce (_, e)) -> sexp_is_fun e in let vb_is_fun { pvb_expr = sexp; _ } = sexp_is_fun sexp in let entirely_functions = List.for_all vb_is_fun spat_sexp_list in @@ -7573,9 +8358,8 @@ and type_let ?check ?check_strict ?(force_toplevel = false) | Recursive -> Some Value.legacy | Nonrecursive -> None in - let spatl = - List.map (vb_pat_constraint ~force_toplevel rec_mode_var) spat_sexp_list - in + let spatl = List.map vb_pat_constraint spat_sexp_list in + let spatl = List.map (pat_modes ~force_toplevel rec_mode_var) spatl in let attrs_list = List.map (fun (attrs, _, _, _) -> attrs) spatl in let is_recursive = (rec_flag = Recursive) in @@ -7684,8 +8468,9 @@ and type_let ?check ?check_strict ?(force_toplevel = false) (fun (_, pat, _) (attrs, exp) -> Builtin_attributes.warning_scope ~ppwarning:false attrs (fun () -> + let case = Parmatch.typed_case (case pat exp) in ignore(check_partial env pat.pat_type pat.pat_loc - [case pat exp] : Typedtree.partial) + [case] : Typedtree.partial) ) ) mode_pat_typ_list @@ -7699,6 +8484,12 @@ and type_let ?check ?check_strict ?(force_toplevel = false) if maybe_expansive exp then lower_contravariant env pat.pat_type) mode_pat_typ_list exp_list; iter_pattern_variables_type generalize pvs; + (* update pattern variable jkind reasons *) + List.iter + (fun pv -> + Ctype.check_and_update_generalized_ty_jkind + ~name:pv.pv_id ~loc:pv.pv_loc pv.pv_type) + pvs; List.iter2 (fun (_, _, expected_ty) (exp, vars) -> match vars with @@ -7718,7 +8509,17 @@ and type_let ?check ?check_strict ?(force_toplevel = false) lower_contravariant env exp.exp_type; generalize_and_check_univars env "definition" exp expected_ty vars) - mode_pat_typ_list exp_list + mode_pat_typ_list exp_list; + let update_exp_jkind (_, p, _) (exp, _) = + let pat_name = + match p.pat_desc with + Tpat_var (id, _, _, _) -> Some id + | Tpat_alias(_, id, _, _, _) -> Some id + | _ -> None in + Ctype.check_and_update_generalized_ty_jkind + ?name:pat_name ~loc:exp.exp_loc exp.exp_type + in + List.iter2 update_exp_jkind mode_pat_typ_list exp_list; end in let l = List.combine pat_list exp_list in @@ -7726,8 +8527,12 @@ and type_let ?check ?check_strict ?(force_toplevel = false) let l = List.map2 (fun (s, ((_,p,_), (e, _))) pvb -> + (* We check for [zero_alloc] attributes written on the [let] and move + them to the function. *) + let e = add_zero_alloc_attribute e pvb.pvb_attributes in + (* vb_rec_kind will be computed later for recursive bindings *) {vb_pat=p; vb_expr=e; vb_sort = s; vb_attributes=pvb.pvb_attributes; - vb_loc=pvb.pvb_loc; + vb_loc=pvb.pvb_loc; vb_rec_kind = Dynamic; }) l spat_sexp_list in @@ -7880,7 +8685,7 @@ and type_andops env sarg sands expected_sort expected_ty = ty_result, op_result_sort = with_local_level_iter_if_principal begin fun () -> let op_path, op_desc = type_binding_op_ident env sop in - let op_type = instance op_desc.val_type in + let op_type = op_desc.val_type in let ty_arg, sort_arg = new_rep_var ~why:Function_argument () in let ty_rest, sort_rest = new_rep_var ~why:Function_argument () in let ty_result, op_result_sort = @@ -7932,31 +8737,35 @@ and type_andops env sarg sands expected_sort expected_ty = and type_generic_array ~loc ~env - ~expected_mode + ~(expected_mode : expected_mode) ~ty_expected ~explanation ~mutability ~attributes sargl = - let type_, base_argument_mode = match mutability with - | Mutable -> Predef.type_array, mode_default Value.legacy - | Immutable -> Predef.type_iarray, mode_subcomponent expected_mode + let alloc_mode, argument_mode = register_allocation expected_mode in + let type_, modalities = + if Types.is_mutable mutability then + Predef.type_array, Typemode.mutable_implied_modalities + else + Predef.type_iarray, Modality.Value.Const.id in - let alloc_mode = register_allocation expected_mode in - (* CR layouts v4: non-values in arrays *) - let ty = newgenvar (Jkind.value ~why:Array_element) in + check_construct_mutability ~loc ~env mutability argument_mode; + let argument_mode = mode_modality modalities argument_mode in + let jkind, elt_sort = Jkind.of_new_legacy_sort_var ~why:Array_element in + let ty = newgenvar jkind in let to_unify = type_ ty in with_explanation explanation (fun () -> unify_exp_types loc env to_unify (generic_instance ty_expected)); - let argument_mode = expect_mode_cross env ty base_argument_mode in + let argument_mode = expect_mode_cross env ty argument_mode in let argl = List.map (fun sarg -> type_expect env argument_mode sarg (mk_expected ty)) sargl in re { - exp_desc = Texp_array (mutability, argl, alloc_mode); + exp_desc = Texp_array (mutability, elt_sort, argl, alloc_mode); exp_loc = loc; exp_extra = []; exp_type = instance ty_expected; exp_attributes = attributes; @@ -7964,7 +8773,6 @@ and type_generic_array and type_expect_jane_syntax ~loc ~env ~expected_mode ~ty_expected ~explanation ~rue ~attributes - ~loc_stack : Jane_syntax.Expression.t -> _ = function | Jexp_comprehension x -> type_comprehension_expr @@ -7978,93 +8786,164 @@ and type_expect_jane_syntax | Jexp_n_ary_function x -> type_n_ary_function ~loc ~env ~expected_mode ~ty_expected ~explanation ~attributes x - ~loc_stack + | Jexp_tuple x -> + type_tuple + ~loc ~env ~expected_mode ~ty_expected ~explanation ~attributes x + | Jexp_modes x -> + type_mode_expr + ~loc ~env ~expected_mode ~ty_expected ~explanation ~attributes x + +and type_mode_expr + ~loc ~env ~expected_mode ~ty_expected ~explanation ~attributes + : Jane_syntax.Modes.expression -> _ = function + | Coerce (m, sbody) -> + let modes = Typemode.transl_mode_annots m in + let min = Alloc.Const.Option.value ~default:Alloc.Const.min modes |> Const.alloc_as_value in + let max = Alloc.Const.Option.value ~default:Alloc.Const.max modes |> Const.alloc_as_value in + submode ~loc ~env ~reason:Other (Value.of_const min) expected_mode; + let expected_mode = mode_coerce (Value.of_const max) expected_mode in + let expected_mode = + match modes.areality with + | Some Local -> mode_strictly_local expected_mode + | _ -> expected_mode + in + let exp = + type_expect env expected_mode sbody (mk_expected ty_expected ?explanation) + in + {exp with + (* CR modes: We should consider not overriding [exp_loc] here -- that would + be more consistent to the typing of [Pexp_constraint]. + *) + exp_loc = loc; + exp_extra = (Texp_mode_coerce m, loc, attributes) :: exp.exp_extra} and type_n_ary_function - ~loc ~loc_stack ~env ~expected_mode ~ty_expected ~explanation ~attributes + ~loc ~env ~(expected_mode : expected_mode) ~ty_expected + ~explanation ~attributes ((params, constraint_, body) : Jane_syntax.N_ary_functions.expression) = - (* TODO nroberts: in later commit, actually typecheck this. *) - let open Ast_helper in - let open Jane_syntax.N_ary_functions in - let fun_body = - match body with - | Pfunction_body body -> body - | Pfunction_cases (cases, loc, attrs) -> - (Exp.function_ cases ~attrs ~loc [@alert "-prefer_jane_syntax"]) + let region_locked = not (Is_local_returning.function_body body) in + let in_function = + { ty_fun = mk_expected (instance ty_expected) ?explanation; + loc_fun = loc; + region_locked; + } in - let constrained_body = - let loc = { fun_body.pexp_loc with loc_ghost = true } in - match constraint_ with - | None -> fun_body - | Some { mode_annotations; type_constraint } -> - let body = - match type_constraint with - | Pconstraint constraint_ -> - Exp.constraint_ fun_body constraint_ ~loc - | Pcoerce (ty1, ty2) -> - Exp.coerce fun_body ty1 ty2 ~loc - in - List.fold_left - (fun body mode -> - let attr_name = - (* this is hacky but will go away in the next PR *) - match mode.txt with - | Local -> "extension.local" - | Unique -> "extension.unique" - | Once -> "extension.once" - in - Exp.attr - body - { attr_name = mknoloc attr_name - ; attr_payload = PStr [] - ; attr_loc = mode.loc - }) - body - mode_annotations + let { function_ = exp_type, result_params, body; + newtypes; params_contain_gadt = contains_gadt; + ret_info; fun_alloc_mode; + } = + type_function env expected_mode ty_expected params constraint_ body + ~in_function ~first:true in - let ast = - (* Extract the least-parenthesized location for forging the fake - location for the nested Pexp_fun nodes. - *) - let make_loc = - let rec last loc_stack = - match loc_stack with - | [] -> loc - | [ loc ] -> loc - | _ :: tl -> last tl + let fun_alloc_mode, { ret_mode; ret_sort } = + match fun_alloc_mode, ret_info with + | Some x, Some y -> x, y + | None, _ -> + Misc.fatal_error + "[fun_alloc_mode] can't be None -- that indicates a function with \ + no parameters." + | _, None -> + Misc.fatal_error + "[ret_info] can't be None -- that indicates a function with \ + no parameters." + in + let params = List.map (fun { param } -> param) result_params in + let syntactic_arity = function_arity params body in + (* Require that the n-ary function is known to have at least n arrows + in the type. This prevents GADT equations introduced by the parameters + from hiding arrows from the resulting type. + Performance hack: Only do this check when any of [params] contains a + GADT, as this is the only opportunity for arrows to be hidden from the + resulting type. + *) + begin match contains_gadt with + | No_gadt -> () + | Contains_gadt -> + (* Assert that [ty] is a function, and return its return type. *) + let filter_ty_ret_exn ty arg_label ~force_tpoly = + match filter_arrow env ty arg_label ~force_tpoly with + | { ty_ret; _ } -> ty_ret + | exception (Filter_arrow_failed error) -> + let trace = + match error with + | Unification_error trace -> trace + | Not_a_function -> + let tarrow = + let new_ty_var why = newvar (Jkind.of_new_sort ~why) in + let new_mode_var () = Mode.Alloc.newvar () in + (newty + (Tarrow + ( (arg_label, new_mode_var (), new_mode_var ()) + , new_ty_var Function_argument + , new_ty_var Function_result + , commu_ok ))); + in + (* We go to some trouble to try to generate a unification + error to help the error printing code's heuristic to + identify the type equation at fault. + *) + (try + unify env tarrow ty; + fatal_error "unification unexpectedly succeeded" + with Unify trace -> trace) + | Label_mismatch _ -> + fatal_error + "Label_mismatch not expected as this point; this should \ + have been caught when the function was typechecked." + | Jkind_error _ -> + fatal_error + "Jkind_error not expected as this point; this should \ + have been caught when the function was typechecked." + in + let err = + Function_arity_type_clash + { syntactic_arity; + type_constraint = exp_type; + trace; + } + in + raise (Error (loc, env, err)) in - let loc_function = last loc_stack in - fun ~pparam_loc -> - { loc_function with - Location.loc_start = pparam_loc.Location.loc_start; - loc_ghost = true; - } - in - List.fold_right - (fun { pparam_loc; pparam_desc } body -> - let loc = make_loc ~pparam_loc in - match pparam_desc with - | Pparam_val (l, o, p) -> - (Exp.fun_ l o p body ~loc [@alert "-prefer_jane_syntax"]) - | Pparam_newtype (newtype, jkind) -> - match jkind with - | None -> Exp.newtype newtype body ~loc - | Some jkind -> - Jane_syntax.Layouts.expr_of ~loc - (Lexp_newtype (newtype, jkind, body))) - params - constrained_body + let ret_ty = + List.fold_left (fun ret_ty { param; has_poly } -> + filter_ty_ret_exn ret_ty param.fp_arg_label + ~force_tpoly:(not has_poly)) + exp_type + result_params + in + match body with + | Tfunction_body _ -> () + | Tfunction_cases _ -> + ignore + (filter_ty_ret_exn ret_ty Nolabel ~force_tpoly:true : type_expr) + end; + let zero_alloc = + Builtin_attributes.get_zero_alloc_attribute ~in_signature:false + ~default_arity:syntactic_arity attributes in - let ast = - { pexp_desc = ast.pexp_desc; - pexp_attributes = ast.pexp_attributes @ attributes; - pexp_loc = loc; - pexp_loc_stack = []; - } + let zero_alloc = + match zero_alloc with + | Default_zero_alloc -> Zero_alloc.create_var loc syntactic_arity + | (Check _ | Assume _ | Ignore_assert_all) -> + Zero_alloc.create_const zero_alloc in - type_expect_ - env expected_mode ast { ty = ty_expected; explanation } + re + { exp_desc = + Texp_function + { params; body; region = region_locked; ret_sort; + alloc_mode = Mode.Alloc.disallow_left fun_alloc_mode; ret_mode; + zero_alloc + }; + exp_loc = loc; + exp_extra = + List.map + (fun ({ txt; loc }, layout) -> Texp_newtype (txt, layout), loc, []) + newtypes; + exp_type; + exp_attributes = attributes; + exp_env = env; + } (* What modes should comprehensions use? Let us be generic over the sequence type we use for comprehensions, calling it [sequence] (standing for either @@ -8156,31 +9035,33 @@ and type_comprehension_expr - [{body = sbody; clauses}]: The actual comprehension to be translated. *) let comprehension_type, container_type, make_texp, - {body = sbody; clauses}, reason = + {body = sbody; clauses}, jkind = match cexpr with | Cexp_list_comprehension comp -> List_comprehension, Predef.type_list, (fun tcomp -> Texp_list_comprehension tcomp), comp, - Jkind.Type_argument + Predef.list_argument_jkind | Cexp_array_comprehension (amut, comp) -> - let container_type = match amut with - | Mutable -> Predef.type_array - | Immutable -> Predef.type_iarray + let container_type, mut = match amut with + | Mutable -> Predef.type_array, Mutable Alloc.Comonadic.Const.legacy + | Immutable -> Predef.type_iarray, Immutable in - Array_comprehension amut, + Array_comprehension mut, container_type, - (fun tcomp -> Texp_array_comprehension (amut, tcomp)), + (fun tcomp -> + Texp_array_comprehension + (mut, Jkind.Sort.for_array_comprehension_element, tcomp)), comp, - Jkind.Array_element + (* CR layouts v4: When this changes from [value], you will also have to + update the use of [transl_exp] in transl_array_comprehension.ml. See + a companion CR layouts v4 at the point of interest in that file. *) + Jkind.Primitive.value ~why:Jkind.History.Array_comprehension_element in let element_ty = with_local_level_if_principal begin fun () -> - (* CR layouts v4: When this changes from [value], you will also have to - update the use of [transl_exp] in transl_array_comprehension.ml. See - a companion CR layouts v4 at the point of interest in that file. *) - let element_ty = newvar (Jkind.value ~why:reason) in + let element_ty = newvar jkind in unify_exp_types loc env @@ -8286,7 +9167,7 @@ and type_comprehension_iterator in Texp_comp_range { ident; pattern; start; stop; direction } | In seq -> - let item_ty = newvar (Jkind.any ~why:Dummy_jkind) in + let item_ty = newvar (Jkind.Primitive.any ~why:Dummy_jkind) in let seq_ty = container_type item_ty in let sequence = (* To understand why we can currently only iterate over [mode_global] @@ -8333,16 +9214,17 @@ and type_jkind_expr ~loc ~env ~expected_mode ~ty_expected:_ ~explanation:_ ~rue ~attributes : Jane_syntax.Layouts.expression -> _ = function | Lexp_constant x -> type_unboxed_constant ~loc ~env ~rue ~attributes x - | Lexp_newtype ({txt=name}, jkind_annot, sbody) -> - type_newtype ~loc ~env ~expected_mode ~rue ~attributes + | Lexp_newtype (name, jkind_annot, sbody) -> + type_newtype_expr ~loc ~env ~expected_mode ~rue ~attributes name (Some jkind_annot) sbody and type_unboxed_constant ~loc ~env ~rue ~attributes cst = + let cst = unboxed_constant_or_raise env loc cst in rue { - exp_desc = unboxed_constant_or_raise env loc cst; + exp_desc = Texp_constant cst; exp_loc = loc; exp_extra = []; - exp_type = type_constant_unboxed env loc cst; + exp_type = type_constant cst; exp_attributes = attributes; exp_env = env } @@ -8372,7 +9254,7 @@ and type_send env loc explanation e met = | id -> id, Btype.method_type met sign | exception Not_found -> let id = Ident.create_local met in - let ty = newvar (Jkind.value ~why:Object_field) in + let ty = newvar (Jkind.Primitive.value ~why:Object_field) in meths_ref := Meths.add met id !meths_ref; add_method env met Private Virtual ty sign; Location.prerr_warning loc @@ -8477,7 +9359,7 @@ let type_expression env jkind sexp = Pexp_ident lid -> let loc = sexp.pexp_loc in (* Special case for keeping type variables when looking-up a variable *) - let (_path, desc, _mode, _reasons) = + let (_path, desc, _actual_mode) = Env.lookup_value ~use:false ~loc lid.txt env in {exp with exp_type = desc.val_type} @@ -8491,7 +9373,7 @@ let type_representable_expression ~why env sexp = exp, sort let type_expression env sexp = - type_expression env (Jkind.any ~why:Type_expression_call) sexp + type_expression env (Jkind.Primitive.any ~why:Type_expression_call) sexp (* Error report *) @@ -8507,6 +9389,17 @@ open Format let longident = Printtyp.longident +let tuple_component ~print_article ppf lbl = + let article = + match print_article, lbl with + | true, Some _ -> "a " + | true, None -> "an " + | false, _ -> "" + in + match lbl with + | Some s -> fprintf ppf "%scomponent with label %s" article s + | None -> fprintf ppf "%sunlabeled component" article + (* Returns the first diff of the trace *) let type_clash_of_trace trace = Errortrace.(explain trace (fun ~prev:_ -> function @@ -8530,6 +9423,8 @@ let report_literal_type_constraint expected_type const = Some 'L' else if Path.same expected_type Predef.path_nativeint then Some 'n' + else if Path.same expected_type Predef.path_float32 then + Some 's' else if Path.same expected_type Predef.path_float then Some '.' else None @@ -8597,7 +9492,7 @@ let report_type_expected_explanation expl ppf = let a_comp_ty = match comp_ty with | List_comprehension -> "a list" - | Array_comprehension Mutable -> "an array" + | Array_comprehension (Mutable _) -> "an array" | Array_comprehension Immutable -> "an immutable array" in because ("a for-in iterator in " ^ a_comp_ty ^ " comprehension") @@ -8607,23 +9502,34 @@ let report_type_expected_explanation expl ppf = because "a range-based for iterator stop index in a comprehension" | Comprehension_when -> because "a when-clause in a comprehension" + | Error_message_attr msg -> + fprintf ppf "@\n@[%s@]" msg -let escaping_hint failure_reason submode_reason +let escaping_hint (failure_reason : Value.error) submode_reason (context : Env.closure_context option) = begin match failure_reason, context with - | `Locality, Some Return -> + | Error (Comonadic Areality, e), Some h -> + begin match e, h with + | {left=Local; right=Regional}, Return -> + (* Only hint to use exclave_, when the user wants to return local, but + expected mode is regional. If the expected mode is as strict as + global, then exclave_ won't solve the problem. *) [ Location.msg - "@[Hint: Cannot return local value without an@ \ - \"exclave_\" annotation@]" ] - | `Locality, Some Tailcall_argument -> + "@[Hint: Cannot return a local value without an@ \ + \"exclave_\" annotation.@]" ] + | _, Return -> [] + | _, Tailcall_argument -> [ Location.msg - "@[Hint: This argument cannot be local, because this is a tail call@]" ] - | `Locality, Some Tailcall_function -> + "@[Hint: This argument cannot be local,@ \ + because it is an argument in a tail call.@]" ] + | _, Tailcall_function -> [ Location.msg - "@[Hint: This function cannot be local, because this is a tail call@]" ] - | `Regionality, Some Partial_application -> + "@[Hint: This function cannot be local,@ \ + because it is the function in a tail call.@]" ] + | _, Partial_application -> [ Location.msg - "@[Hint: It is captured by a partial application@]" ] + "@[Hint: It is captured by a partial application.@]" ] + end | _, _ -> [] end @ @@ -8638,7 +9544,7 @@ let escaping_hint failure_reason submode_reason match get_desc ty with | Tarrow ((_, _, res_mode), _, res_ty, _) -> begin match - Locality.check_const (Alloc.locality res_mode) + Locality.Guts.check_const (Alloc.proj (Comonadic Areality) res_mode) with | Some Global -> Some (n+1, true) @@ -8666,50 +9572,18 @@ let escaping_hint failure_reason submode_reason | Other -> [] end -let sharedness_hint _fail_reason submode_reason context = - (match context with + +let contention_hint _fail_reason _submode_reason context = + match context with + | Some Read_mutable -> + [Location.msg + "@[Hint: In order to read from the mutable fields,@ \ + this record needs to be uncontended.@]"] + | Some Write_mutable -> + [Location.msg + "@[Hint: In order to write into the mutable fields,@ \ + this record needs to be uncontended.@]"] | None -> [] - | Some Env.For_loop -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it was defined outside of the for-loop.@]"] - | Some Env.While_loop -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it was defined outside of the while-loop.@]"] - | Some Env.Comprehension -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it was defined outside of the comprehension.@]"] - | Some Env.Letop -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it was defined outside of the let-op.@]"] - | Some Env.Class -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it is defined in a class.@]"] - | Some Env.Closure -> - [Location.msg - "@[Hint: This identifier was defined outside of the current closure.@ \ - Either this closure has to be once, or the identifier can be used only@ \ - as shared.@]"] - | Some Env.Module -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it is defined in a module.@]"] - | Some Env.Probe -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it is defined outside of the probe.@]"] - | Some Env.Lazy -> - [Location.msg - "@[Hint: This identifier cannot be used uniquely,@ \ - because it is defined outside of the lazy expression.@]"] - ) - @ - match submode_reason with - | Application _ | Other -> [] let report_type_expected_explanation_opt expl ppf = match expl with @@ -8765,6 +9639,33 @@ let report_error ~loc env = function "@[The constructor %a@ expects %i argument(s),@ \ but is applied here to %i argument(s)@]" longident lid expected provided + | Constructor_labeled_arg -> + Location.errorf ~loc + "Constructors cannot have labeled arguments. \ + Consider using an inline record instead." + | Partial_tuple_pattern_bad_type -> + Location.errorf ~loc + "Could not determine the type of this partial tuple pattern." + | Extra_tuple_label (lbl, typ) -> + Location.errorf ~loc + "This pattern was expected to match values of type@ %a,@ but it \ + contains an extra %a." + Printtyp.type_expr typ + (tuple_component ~print_article:false) lbl; + | Missing_tuple_label (lbl, typ) -> + let hint ppf () = + (* We only hint if the missing component is labeled. This is + unlikely to be a correct fix for traditional tuples. *) + match lbl with + | Some _ -> fprintf ppf "@ Hint: use .. to ignore some components." + | None -> () + in + Location.errorf ~loc + "This pattern was expected to match values of type@ %a,@ but it is \ + missing %a.%a" + Printtyp.type_expr typ + (tuple_component ~print_article:true) lbl + hint () | Label_mismatch(lid, err) -> report_unification_error ~loc env err (function ppf -> @@ -8809,6 +9710,46 @@ let report_error ~loc env = function fprintf ppf "This expression has type") (function ppf -> fprintf ppf "but an expression was expected of type"); + | Function_arity_type_clash { + syntactic_arity; type_constraint; trace = { trace }; + } -> + (* The last diff's expected type will be the locally-abstract type + that the GADT pattern introduced an equation on. + *) + let type_with_local_equation = + let last_diff = + List.find_map + (function Errortrace.Diff diff -> Some diff | _ -> None) + (List.rev trace) + in + match last_diff with + | None -> None + | Some diff -> Some diff.expected.ty + in + (* [syntactic_arity>1] for this error, so "arguments" is always plural. *) + Location.errorf ~loc + "@[\ + @[\ + The syntactic arity of the function doesn't match the type constraint:@ \ + @[<2>\ + This function has %d syntactic arguments, but its type is constrained \ + to@ %a.\ + @]@ \ + @]@ \ + @[\ + @[<2>@{Hint@}: \ + consider splitting the function definition into@ %s@ \ + where %s is the pattern with the GADT constructor that@ \ + introduces the local type equation%t.\ + @]" + syntactic_arity + Printtyp.type_expr type_constraint + "fun ... gadt_pat -> fun ..." + "gadt_pat" + (fun ppf -> + Option.iter + (fprintf ppf " on %a" Printtyp.type_expr) + type_with_local_equation) | Apply_non_function { funct; func_ty; res_ty; previous_arg_loc; extra_arg_loc } -> @@ -8828,7 +9769,11 @@ let report_error ~loc env = function | Apply_wrong_label (l, ty, extra_info) -> let print_label ppf = function | Nolabel -> fprintf ppf "without label" - | l -> fprintf ppf "with label %s" (prefixed_label_name l) + |(Labelled _ | Optional _) as l -> fprintf ppf "with label %s" + (prefixed_label_name l) + | Position _ -> assert false + (* Since Position labels never occur in function applications, + this case is never run *) in let extra_info = if not extra_info then @@ -8899,8 +9844,8 @@ let report_error ~loc env = function ) () | Not_a_value (err, explanation) -> Location.error_of_printer ~loc (fun ppf () -> - fprintf ppf "Method types must have layout value.@ %a" - (Jkind.Violation.report_with_name ~name:"This expression") + fprintf ppf "Object types must have layout value.@ %a" + (Jkind.Violation.report_with_name ~name:"the type of this expression") err; report_type_expected_explanation_opt explanation ppf) () @@ -8970,22 +9915,32 @@ let report_error ~loc env = function Printtyp.type_expr ty (report_type_expected_explanation_opt explanation) | Abstract_wrong_label {got; expected; expected_type; explanation} -> - let label ~long = function + let label ~long l = + match l with | Nolabel -> "unlabeled" - | l -> (if long then "labeled " else "") ^ prefixed_label_name l + | Position l -> sprintf "~(%s:[%%call_pos])" l + | Labelled _ | Optional _ -> + (if long then "labeled " else "") ^ prefixed_label_name l in let second_long = match got, expected with | Nolabel, _ | _, Nolabel -> true | _ -> false in + let maybe_positional_argument_hint = + match got, expected with + | Labelled _, Position _ -> + "\nHint: Consider explicitly annotating the label with '[%call_pos]'" + | _ -> "" + in Location.errorf ~loc "@[@[<2>This function should have type@ %a%t@]@,\ - @[but its first argument is %s@ instead of %s%s@]@]" + @[but its first argument is %s@ instead of %s%s@]%s@]" Printtyp.type_expr expected_type (report_type_expected_explanation_opt explanation) (label ~long:true got) (if second_long then "being " else "") (label ~long:second_long expected) + maybe_positional_argument_hint | Scoping_let_module(id, ty) -> Location.errorf ~loc "This `let module' expression has type@ %a@ \ @@ -9119,6 +10074,9 @@ let report_error ~loc env = function ty | Unknown_literal (n, m) -> Location.errorf ~loc "Unknown modifier '%c' for literal %s%c" m n m + | Float32_literal f -> + Location.errorf ~loc "Found 32-bit float literal %ss, but float32 is not enabled. \ + You must enable -extension small_numbers to use this feature." f | Illegal_letrec_pat -> Location.errorf ~loc "Only variables are allowed as left-hand side of `let rec'" @@ -9181,21 +10139,30 @@ let report_error ~loc env = function "This expression has type %a@ \ which is not a record type." Printtyp.type_expr ty - | Submode_failed(fail_reason, submode_reason, closure_context, shared_context) + | Submode_failed(fail_reason, submode_reason, closure_context, + contention_context, shared_context) -> let sub = match fail_reason with - | `Linearity | `Uniqueness -> - sharedness_hint fail_reason submode_reason shared_context - | `Locality | `Regionality -> + | Error (Comonadic Linearity, _) | Error (Monadic Uniqueness, _) -> + shared_context + |> Option.map + (fun context -> Location.mknoloc + (fun ppf -> Env.sharedness_hint ppf context)) + |> Option.to_list + | Error (Comonadic Areality, _) -> escaping_hint fail_reason submode_reason closure_context + | Error (Monadic Contention, _ ) -> + contention_hint fail_reason submode_reason contention_context + | Error (Comonadic Portability, _ ) -> [] in - Location.errorf ~loc ~sub begin + Location.errorf ~loc ~sub "@[%t@]" begin match fail_reason with - | `Locality -> "This local value escapes its region" - | `Regionality -> "This value escapes its region" - | `Uniqueness -> "Found a shared value where a unique value was expected" - | `Linearity -> "Found a once value where a many value was expected" + | Error (Comonadic Areality, _) -> + Format.dprintf "This value escapes its region." + | Error (ax, {left; right}) -> + Format.dprintf "This value is %a but expected to be %a." + (Value.Const.print_axis ax) left (Value.Const.print_axis ax) right end | Local_application_complete (lbl, loc_kind) -> let sub = @@ -9211,7 +10178,7 @@ let report_error ~loc env = function let lbl = match lbl with | Nolabel -> "_" - | Labelled s | Optional s -> s + | Labelled s | Optional s | Position s -> s in [Location.msg "@[Hint: Try splitting the application in two. The arguments that come@ \ @@ -9220,25 +10187,28 @@ let report_error ~loc env = function Location.errorf ~loc ~sub "@[This application is complete, but surplus arguments were provided afterwards.@ \ When passing or calling a local value, extra arguments are passed in a separate application.@]" - | Param_mode_mismatch (ty, mkind) -> - let mkind = - match mkind with - | `Locality -> "local" - | `Uniqueness -> "unique" - | `Linearity -> "once" + | Param_mode_mismatch (s, Error (ax, {left; right})) -> + let actual, expected = + match s with + | Left_le_right -> left, right + | Right_le_left -> right, left in Location.errorf ~loc - "@[This function has a %s parameter, but was expected to have type:@ %a@]" - mkind Printtyp.type_expr ty + "@[This function takes a parameter which is %a,@ \ + but was expected to take a parameter which is %a.@]" + (Alloc.Const.print_axis ax) actual (Alloc.Const.print_axis ax) expected | Uncurried_function_escapes e -> begin match e with - | `Locality -> - Location.errorf ~loc "This function or one of its parameters escape their region @ \ - when it is partially applied." - | `Uniqueness -> assert false - | `Linearity -> - Location.errorf ~loc "This function when partially applied returns a once value,@ \ - but expected to be many." + | Error (Comonadic Areality, _) -> + Location.errorf ~loc + "This function or one of its parameters escape their region@ \ + when it is partially applied." + | Error (ax, {left; right}) -> + Location.errorf ~loc + "This function when partially applied returns a value which is %a,@ \ + but expected to be %a." + (Alloc.Const.print_axis ax) left + (Alloc.Const.print_axis ax) right end | Local_return_annotation_mismatch _ -> Location.errorf ~loc @@ -9252,34 +10222,46 @@ let report_error ~loc env = function | `Not_a_tailcall -> "is not on a tail call") | Exclave_in_nontail_position -> Location.errorf ~loc - "Exclave expression should only be in tail position of the current region" + "Exclave expression should only be in tail position of the current region." | Exclave_returns_not_local -> Location.errorf ~loc - "The body of exclave expression should be local" + "This expression was expected to be not local, but is an exclave expression,@ \ + which must be local." | Optional_poly_param -> Location.errorf ~loc "Optional parameters cannot be polymorphic" | Function_returns_local -> Location.errorf ~loc - "This function is local-returning, but was expected otherwise" + "This function is local-returning, but was expected otherwise." | Tail_call_local_returning -> Location.errorf ~loc - "@[This application is local-returning, but is at the tail @ \ - position of a function that is not local-returning@]" + "@[This application is local-returning, but is at the tail@ \ + position of a function that is not local-returning.@]" | Unboxed_int_literals_not_supported -> Location.errorf ~loc "@[Unboxed int literals aren't supported yet.@]" - | Unboxed_float_literals_not_supported -> - Location.errorf ~loc - "@[Unboxed float literals aren't supported yet.@]" | Function_type_not_rep (ty,violation) -> Location.errorf ~loc "@[Function arguments and returns must be representable.@]@ %a" (Jkind.Violation.report_with_offender ~offender:(fun ppf -> Printtyp.type_expr ppf ty)) violation + | Modes_on_pattern -> + Location.errorf ~loc + "@[Mode annotations on patterns are not supported yet.@]" + | Invalid_label_for_src_pos arg_label -> + Location.errorf ~loc + "A position argument must not be %s." + (match arg_label with + | Nolabel -> "unlabelled" + | Optional _ -> "optional" + | Labelled _ | Position _ -> assert false ) + | Nonoptional_call_pos_label label -> + Location.errorf ~loc + "@[the argument labeled '%s' is a [%%call_pos] argument, filled in @ \ + automatically if ommitted. It cannot be passed with '?'.@]" label let report_error ~loc env err = - Printtyp.wrap_printing_env ~error:true env + Printtyp.wrap_printing_env_error env (fun () -> report_error ~loc env err) let () = @@ -9298,6 +10280,10 @@ let () = Env.add_delayed_check_forward := add_delayed_check; () +(* drop the need to call [Parmatch.typed_case] from the external API *) +let check_partial ?lev a b c cases = + check_partial ?lev a b c (List.map Parmatch.typed_case cases) + (* drop unnecessary arguments from the external API and check for uniqueness *) let type_expect env e ty = @@ -9311,3 +10297,7 @@ let type_exp env e = let type_argument env e t1 t2 = let exp = type_argument env mode_legacy e t1 t2 in maybe_check_uniqueness_exp exp; exp + +let type_option_some env e t1 t2 = + let exp = type_option_some env mode_legacy e t1 t2 in + maybe_check_uniqueness_exp exp; exp diff --git a/typing/typecore.mli b/typing/typecore.mli index dc2416ef24d..007e9eaee60 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -22,7 +22,7 @@ open Types found in; it's used by [type_forcing_context], which see. *) type comprehension_type = | List_comprehension - | Array_comprehension of mutable_flag + | Array_comprehension of mutability (* This variant is used to print improved error messages, and does not affect the behavior of the typechecker itself. @@ -47,6 +47,7 @@ type type_forcing_context = | Comprehension_for_start | Comprehension_for_stop | Comprehension_when + | Error_message_attr of string (* The combination of a type and a "type forcing context". The intent is that it describes a type that is "expected" (required) by the context. If unifying @@ -63,7 +64,7 @@ type pattern_variable = { pv_id: Ident.t; pv_uid: Uid.t; - pv_mode: Mode.Value.t; + pv_mode: Mode.Value.l; pv_type: type_expr; pv_loc: Location.t; pv_as_var: bool; @@ -127,7 +128,7 @@ val type_let: val type_expression: Env.t -> Parsetree.expression -> Typedtree.expression val type_representable_expression: - why:Jkind.concrete_jkind_reason -> + why:Jkind.History.concrete_creation_reason -> Env.t -> Parsetree.expression -> Typedtree.expression * Jkind.sort val type_class_arg_pattern: string -> Env.t -> Env.t -> arg_label -> Parsetree.pattern -> @@ -150,11 +151,11 @@ val type_argument: Env.t -> Parsetree.expression -> type_expr -> type_expr -> Typedtree.expression -val option_some: - Env.t -> Typedtree.expression -> Mode.Value.t -> Typedtree.expression -val option_none: - Env.t -> type_expr -> Location.t -> Typedtree.expression -val extract_option_type: Env.t -> type_expr -> type_expr +val type_option_some: + Env.t -> Parsetree.expression -> + type_expr-> type_expr -> Typedtree.expression +val type_option_none: + Env.t -> type_expr -> Location.t -> Typedtree.expression val generalizable: int -> type_expr -> bool val generalize_structure_exp: Typedtree.expression -> unit val reset_delayed_checks: unit -> unit @@ -177,12 +178,20 @@ type submode_reason = | Other (* add more cases here for better hints *) -val escape : loc:Location.t -> env:Env.t -> reason:submode_reason -> Mode.Value.t -> unit +val escape : loc:Location.t -> env:Env.t -> reason:submode_reason -> (Mode.allowed * 'r) Mode.Value.t -> unit val self_coercion : (Path.t * Location.t list ref) list ref +type contention_context = + | Read_mutable + | Write_mutable + type error = | Constructor_arity_mismatch of Longident.t * int * int + | Constructor_labeled_arg + | Partial_tuple_pattern_bad_type + | Extra_tuple_label of string option * type_expr + | Missing_tuple_label of string option * type_expr | Label_mismatch of Longident.t * Errortrace.unification_error | Pattern_type_clash : Errortrace.unification_error * Parsetree.pattern_desc option @@ -193,6 +202,11 @@ type error = | Expr_type_clash of Errortrace.unification_error * type_forcing_context option * Parsetree.expression_desc option + | Function_arity_type_clash of + { syntactic_arity : int; + type_constraint : type_expr; + trace : Errortrace.unification_error; + } | Apply_non_function of { funct : Typedtree.expression; func_ty : type_expr; @@ -258,6 +272,7 @@ type error = | Extension_not_enabled : _ Language_extension.t -> error | Literal_overflow of string | Unknown_literal of string * char + | Float32_literal of string | Illegal_letrec_pat | Illegal_letrec_expr | Illegal_class_expr @@ -270,9 +285,11 @@ type error = | Expr_not_a_record_type of type_expr | Submode_failed of Mode.Value.error * submode_reason * - Env.closure_context option * Env.shared_context option - | Local_application_complete of Asttypes.arg_label * [`Prefix|`Single_arg|`Entire_apply] - | Param_mode_mismatch of type_expr * Mode.Alloc.error + Env.closure_context option * + contention_context option * + Env.shared_context option + | Local_application_complete of arg_label * [`Prefix|`Single_arg|`Entire_apply] + | Param_mode_mismatch of Mode.Alloc.equate_error | Uncurried_function_escapes of Mode.Alloc.error | Local_return_annotation_mismatch of Location.t | Function_returns_local @@ -282,8 +299,10 @@ type error = | Exclave_in_nontail_position | Exclave_returns_not_local | Unboxed_int_literals_not_supported - | Unboxed_float_literals_not_supported | Function_type_not_rep of type_expr * Jkind.Violation.t + | Modes_on_pattern + | Invalid_label_for_src_pos of arg_label + | Nonoptional_call_pos_label of string exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -312,8 +331,11 @@ val type_package: (Env.t -> Parsetree.module_expr -> Path.t -> (Longident.t * type_expr) list -> Typedtree.module_expr * (Longident.t * type_expr) list) ref -val constant: Parsetree.constant -> (Asttypes.constant, error) result +val constant: Parsetree.constant -> (Typedtree.constant, error) result -val check_recursive_bindings : Env.t -> Typedtree.value_binding list -> unit +val annotate_recursive_bindings : + Env.t -> Typedtree.value_binding list -> Typedtree.value_binding list val check_recursive_class_bindings : Env.t -> Ident.t list -> Typedtree.class_expr list -> unit + +val src_pos : Location.t -> Typedtree.attributes -> Env.t -> Typedtree.expression diff --git a/typing/typedecl.ml b/typing/typedecl.ml index c898b00a42f..82084e174d4 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -26,7 +26,13 @@ module String = Misc.Stdlib.String type native_repr_kind = Unboxed | Untagged -type jkind_sort_loc = Cstr_tuple | Record | External +type jkind_sort_loc = + | Cstr_tuple of { unboxed : bool } + | Record of { unboxed : bool } + | Inlined_record of { unboxed : bool } + | Mixed_product + | External + | External_with_layout_poly (* Our static analyses explore the set of type expressions "reachable" from a type declaration, by expansion of definitions or by the @@ -37,6 +43,43 @@ and reaching_type_step = | Expands_to of type_expr * type_expr | Contains of type_expr * type_expr +module Mixed_product_kind = struct + type t = + | Record + | Cstr_tuple + | Cstr_record + + let to_plural_string = function + | Record -> "records" + | Cstr_tuple -> "constructors" + | Cstr_record -> "inline record arguments to constructors" +end + +type mixed_product_violation = + | Runtime_support_not_enabled of Mixed_product_kind.t + | Extension_constructor + | Value_prefix_too_long of + { value_prefix_len : int; + max_value_prefix_len : int; + mixed_product_kind : Mixed_product_kind.t; + } + | Flat_field_expected of + { boxed_lbl : Ident.t; + non_value_lbl : Ident.t; + } + | Flat_constructor_arg_expected of + { boxed_arg : type_expr; + non_value_arg : type_expr; + } + | Insufficient_level of + { required_layouts_level : Language_extension.maturity; + mixed_product_kind : Mixed_product_kind.t; + } + +type bad_jkind_inference_location = + | Check_constraints + | Delayed_checks + type error = Repeated_parameter | Duplicate_constructor of string @@ -73,37 +116,33 @@ type error = | Deep_unbox_or_untag_attribute of native_repr_kind | Jkind_mismatch_of_type of type_expr * Jkind.Violation.t | Jkind_mismatch_of_path of Path.t * Jkind.Violation.t + | Jkind_mismatch_due_to_bad_inference of + type_expr * Jkind.Violation.t * bad_jkind_inference_location | Jkind_sort of { kloc : jkind_sort_loc ; typ : type_expr ; err : Jkind.Violation.t } | Jkind_empty_record - | Non_value_in_sig of Jkind.Violation.t * string - | Float64_in_block of type_expr * jkind_sort_loc - | Mixed_block + | Non_value_in_sig of Jkind.Violation.t * string * type_expr + | Invalid_jkind_in_block of type_expr * Jkind.Sort.const * jkind_sort_loc + | Illegal_mixed_product of mixed_product_violation | Separability of Typedecl_separability.error | Bad_unboxed_attribute of string | Boxed_and_unboxed | Nonrec_gadt | Invalid_private_row_declaration of type_expr | Local_not_enabled - | Layout_not_enabled of Jkind.const + | Unexpected_layout_any_in_primitive of string + | Useless_layout_poly + | Zero_alloc_attr_unsupported of Builtin_attributes.zero_alloc_attribute + | Zero_alloc_attr_non_function + | Zero_alloc_attr_bad_user_arity open Typedtree exception Error of Location.t * error -let jkind_of_attributes ~legacy_immediate ~context attrs = - match Jkind.of_attributes ~legacy_immediate ~context attrs with - | Ok l -> l - | Error { loc; txt } -> raise (Error (loc, Layout_not_enabled txt)) - -let jkind_of_attributes_default ~legacy_immediate ~context ~default attrs = - match Jkind.of_attributes_default ~legacy_immediate ~context ~default attrs with - | Ok l -> l - | Error { loc; txt } -> raise (Error (loc, Layout_not_enabled txt)) - let get_unboxed_from_attributes sdecl = let unboxed = Builtin_attributes.has_unboxed sdecl.ptype_attributes in let boxed = Builtin_attributes.has_boxed sdecl.ptype_attributes in @@ -128,9 +167,9 @@ let make_params env path params = (* Enter all declared types in the environment as abstract types *) -let add_type ~check id decl env = +let add_type ~check ?shape id decl env = Builtin_attributes.warning_scope ~ppwarning:false decl.type_attributes - (fun () -> Env.add_type ~check id decl env) + (fun () -> Env.add_type ~check ?shape id decl env) (* Add a dummy type declaration to the environment, with the given arity. The [type_kind] is [Type_abstract], but there is a generic [type_manifest] @@ -208,13 +247,11 @@ let enter_type ?abstract_abbrevs rec_flag env sdecl (id, uid) = jkind of the variable put in manifests here is updated when constraints are checked and then unified with the real manifest and checked against the kind. *) - let type_jkind = - (* We set ~legacy_immediate to true because we're looking at a declaration - that was already allowed to be [@@immediate] *) - jkind_of_attributes_default - ~legacy_immediate:true ~context:(Type_declaration path) - ~default:(Jkind.any ~why:Initial_typedecl_env) - sdecl.ptype_attributes + let type_jkind, type_jkind_annotation, sdecl_attributes = + Jkind.of_type_decl_default + ~context:(Type_declaration path) + ~default:(Jkind.Primitive.any ~why:Initial_typedecl_env) + sdecl in let abstract_reason, type_manifest = match sdecl.ptype_manifest, abstract_abbrevs with @@ -233,6 +270,7 @@ let enter_type ?abstract_abbrevs rec_flag env sdecl (id, uid) = type_arity = arity; type_kind = Type_abstract abstract_reason; type_jkind; + type_jkind_annotation; type_private = sdecl.ptype_private; type_manifest; type_variance = Variance.unknown_signature ~injective:false ~arity; @@ -240,9 +278,10 @@ let enter_type ?abstract_abbrevs rec_flag env sdecl (id, uid) = type_is_newtype = false; type_expansion_scope = Btype.lowest_level; type_loc = sdecl.ptype_loc; - type_attributes = sdecl.ptype_attributes; + type_attributes = sdecl_attributes; type_unboxed_default = false; type_uid = uid; + type_has_illegal_crossings = false; } in add_type ~check:true id decl env @@ -344,20 +383,34 @@ let set_private_row env loc p decl = in set_type_desc rv (Tconstr (p, decl.type_params, ref Mnil)) -(* Translate one type declaration *) - -let transl_global_flags loc attrs = - let transl_global_flag loc (r : (bool,unit) result) = - match r with - | Ok b -> b - | Error () -> raise(Error(loc, Local_not_enabled)) - in - let global = transl_global_flag loc (Builtin_attributes.has_global attrs) in - match global with - | true -> Types.Global - | false -> Types.Unrestricted +(* Makes sure a type is representable. When called with a type variable, will + lower [any] to a sort variable if [allow_unboxed = true], and to [value] + if [allow_unboxed = false]. *) +(* CR layouts: Many places where [check_representable] is called in this file + should be replaced with checks at the places where values of those types are + constructed. We've been conservative here in the first version. This is the + same issue as with arrows. *) +let check_representable ~why ~allow_unboxed env loc kloc typ = + match Ctype.type_sort ~why env typ with + (* CR layouts v5: This is a convenient place to rule out non-value types in + structures that don't support them yet. (A callsite passes + [~allow_unboxed:true] to indicate that non-value types are allowed.) + When we support mixed blocks everywhere, this [check_representable] + will have outlived its usefulness and we can delete it. + *) + (* CR layouts v2.5: This rules out non-value types in [@@unboxed] types. No + real need to rule that out - I just haven't had time to write tests for it + yet. *) + | Ok s -> begin + if not allow_unboxed then + match Jkind.Sort.default_to_value_and_get s with + | Void | Value -> () + | Float64 | Float32 | Word | Bits32 | Bits64 as const -> + raise (Error (loc, Invalid_jkind_in_block (typ, const, kloc))) + end + | Error err -> raise (Error (loc,Jkind_sort {kloc; typ; err})) -let transl_labels env univars closed lbls = +let transl_labels ~new_var_jkind ~allow_unboxed env univars closed lbls kloc = assert (lbls <> []); let all_labels = ref String.Set.empty in List.iter @@ -366,19 +419,32 @@ let transl_labels env univars closed lbls = raise(Error(loc, Duplicate_label name)); all_labels := String.Set.add name !all_labels) lbls; - let mk {pld_name=name;pld_mutable=mut;pld_type=arg;pld_loc=loc; - pld_attributes=attrs} = + let mk {pld_name=name;pld_mutable=mut;pld_modalities=modalities; + pld_type=arg;pld_loc=loc;pld_attributes=attrs} = Builtin_attributes.warning_scope attrs (fun () -> - let arg = Ast_helper.Typ.force_poly arg in - let cty = transl_simple_type env ?univars ~closed Mode.Alloc.Const.legacy arg in - let gbl = - match mut with - | Mutable -> Types.Global - | Immutable -> transl_global_flags loc attrs + let mut : mutability = + match mut with + | Immutable -> Immutable + | Mutable -> Mutable Mode.Alloc.Comonadic.Const.legacy + in + let has_mutable_implied_modalities = + if Types.is_mutable mut then + not (Builtin_attributes.has_no_mutable_implied_modalities attrs) + else + false + in + let modalities = + Typemode.transl_modalities ~maturity:Stable + ~has_mutable_implied_modalities modalities in + let arg = Ast_helper.Typ.force_poly arg in + let cty = transl_simple_type ~new_var_jkind env ?univars ~closed Mode.Alloc.Const.legacy arg in {ld_id = Ident.create_local name.txt; - ld_name = name; ld_mutable = mut; ld_global = gbl; + ld_name = name; + ld_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); + ld_mutable = mut; + ld_modalities = modalities; ld_type = cty; ld_loc = loc; ld_attributes = attrs} ) in @@ -388,37 +454,64 @@ let transl_labels env univars closed lbls = (fun ld -> let ty = ld.ld_type.ctyp_type in let ty = match get_desc ty with Tpoly(t,[]) -> t | _ -> ty in + check_representable ~why:(Label_declaration ld.ld_id) + ~allow_unboxed env ld.ld_loc kloc ty; {Types.ld_id = ld.ld_id; ld_mutable = ld.ld_mutable; - ld_global = ld.ld_global; - ld_jkind = Jkind.any ~why:Dummy_jkind; + ld_modalities = ld.ld_modalities; + ld_jkind = Jkind.Primitive.any ~why:Dummy_jkind; (* Updated by [update_label_jkinds] *) ld_type = ty; ld_loc = ld.ld_loc; ld_attributes = ld.ld_attributes; - ld_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); + ld_uid = ld.ld_uid; } ) lbls in lbls, lbls' -let transl_types_gf env univars closed tyl = +let transl_types_gf ~new_var_jkind ~allow_unboxed + env loc univars closed cal kloc = let mk arg = - let cty = transl_simple_type env ?univars ~closed Mode.Alloc.Const.legacy arg in - let gf = transl_global_flags arg.ptyp_loc arg.ptyp_attributes in - (cty, gf) + let cty = + transl_simple_type ~new_var_jkind env ?univars ~closed + Mode.Alloc.Const.legacy arg.pca_type + in + let gf = + Typemode.transl_modalities ~maturity:Stable + ~has_mutable_implied_modalities:false arg.pca_modalities + in + {ca_modalities = gf; ca_type = cty; ca_loc = arg.pca_loc} + in + let tyl_gfl = List.map mk cal in + let tyl_gfl' = List.mapi (fun idx (ca : Typedtree.constructor_argument) -> + check_representable ~why:(Constructor_declaration idx) ~allow_unboxed + env loc kloc ca.ca_type.ctyp_type; + { + Types.ca_modalities = ca.ca_modalities; + ca_loc = ca.ca_loc; + ca_type = ca.ca_type.ctyp_type; + }) tyl_gfl in - let tyl_gfl = List.map mk tyl in - let tyl_gfl' = List.map (fun (cty, gf) -> cty.ctyp_type, gf) tyl_gfl in tyl_gfl, tyl_gfl' -let transl_constructor_arguments env univars closed = function +let transl_constructor_arguments ~new_var_jkind ~unboxed + env loc univars closed = function | Pcstr_tuple l -> - let flds, flds' = transl_types_gf env univars closed l in - Types.Cstr_tuple flds', - Cstr_tuple flds + let flds, flds' = + (* CR layouts: we forbid [@@unboxed] variants from being + non-value, see comment in [check_representable]. *) + transl_types_gf ~new_var_jkind ~allow_unboxed:(not unboxed) + env loc univars closed l (Cstr_tuple { unboxed }) + in + Types.Cstr_tuple flds', Cstr_tuple flds | Pcstr_record l -> - let lbls, lbls' = transl_labels env univars closed l in + let lbls, lbls' = + (* CR layouts: we forbid [@@unboxed] variants from being + non-value, see comment in [check_representable]. *) + transl_labels ~new_var_jkind ~allow_unboxed:(not unboxed) + env univars closed l (Inlined_record { unboxed }) + in Types.Cstr_record lbls', Cstr_record lbls @@ -428,17 +521,30 @@ let transl_constructor_arguments env univars closed = function defined types. It is updated later by [update_constructor_arguments_jkinds] *) let make_constructor - env loc ~cstr_path ~type_path type_params (svars : _ Either.t) + env loc ~cstr_path ~type_path ~unboxed type_params (svars : _ Either.t) sargs sret_type = let tvars = match svars with | Left vars_only -> List.map (fun v -> v.txt, None) vars_only | Right vars_jkinds -> - List.map (fun (v, l) -> v.txt, Option.map Location.get_txt l) vars_jkinds + List.map + (fun (v, l) -> + v.txt, + Option.map + (fun annot -> + let const = + Jkind.const_of_user_written_annotation + ~context:(Constructor_type_parameter (cstr_path, v.txt)) + annot + in + const, annot) + l) + vars_jkinds in match sret_type with | None -> let args, targs = - transl_constructor_arguments env None true sargs + transl_constructor_arguments ~new_var_jkind:Any ~unboxed + env loc None true sargs in tvars, targs, None, args, None | Some sret_type -> @@ -464,10 +570,11 @@ let make_constructor in let univars = if closed then Some univar_list else None in let args, targs = - transl_constructor_arguments env univars closed sargs + transl_constructor_arguments ~new_var_jkind:Sort ~unboxed + env loc univars closed sargs in let tret_type = - transl_simple_type env ?univars ~closed Mode.Alloc.Const.legacy + transl_simple_type ~new_var_jkind:Sort env ?univars ~closed Mode.Alloc.Const.legacy sret_type in let ret_type = tret_type.ctyp_type in @@ -616,6 +723,27 @@ let verify_unboxed_attr unboxed_attr sdecl = (* CR layouts: see if we can do better here. *) *) + +let shape_map_labels = + List.fold_left (fun map { ld_id; ld_uid; _} -> + Shape.Map.add_label map ld_id ld_uid) + Shape.Map.empty + +let shape_map_cstrs = + List.fold_left (fun map { cd_id; cd_uid; cd_args; _ } -> + let cstr_shape_map = + let label_decls = + match cd_args with + | Cstr_tuple _ -> [] + | Cstr_record ldecls -> ldecls + in + shape_map_labels label_decls + in + Shape.Map.add_constr map cd_id + @@ Shape.str ~uid:cd_uid cstr_shape_map) + (Shape.Map.empty) + + let transl_declaration env sdecl (id, uid) = (* Bind type parameters *) Ctype.with_local_level begin fun () -> @@ -625,8 +753,8 @@ let transl_declaration env sdecl (id, uid) = let params = List.map (fun (cty, _) -> cty.ctyp_type) tparams in let cstrs = List.map (fun (sty, sty', loc) -> - transl_simple_type env ~closed:false Mode.Alloc.Const.legacy sty, - transl_simple_type env ~closed:false Mode.Alloc.Const.legacy sty', loc) + transl_simple_type ~new_var_jkind:Any env ~closed:false Mode.Alloc.Const.legacy sty, + transl_simple_type ~new_var_jkind:Sort env ~closed:false Mode.Alloc.Const.legacy sty', loc) sdecl.ptype_cstrs in let unboxed_attr = get_unboxed_from_attributes sdecl in @@ -640,20 +768,20 @@ let transl_declaration env sdecl (id, uid) = | _ -> false, false (* Not unboxable, mark as boxed *) in verify_unboxed_attr unboxed_attr sdecl; - let jkind_annotation = - (* We set legacy_immediate to true because you were already allowed to write - [@@immediate] on declarations. *) - jkind_of_attributes ~legacy_immediate:true ~context:(Type_declaration path) - sdecl.ptype_attributes + let jkind_from_annotation, jkind_annotation, sdecl_attributes = + match Jkind.of_type_decl ~context:(Type_declaration path) sdecl with + | Some (jkind, jkind_annotation, sdecl_attributes) -> + Some jkind, Some jkind_annotation, sdecl_attributes + | None -> None, None, sdecl.ptype_attributes in let (tman, man) = match sdecl.ptype_manifest with None -> None, None | Some sty -> let no_row = not (is_fixed_type sdecl) in - let cty = transl_simple_type env ~closed:no_row Mode.Alloc.Const.legacy sty in + let cty = transl_simple_type ~new_var_jkind:Any env ~closed:no_row Mode.Alloc.Const.legacy sty in Some cty, Some cty.ctyp_type in - let any = Jkind.any ~why:Initial_typedecl_env in + let any = Jkind.Primitive.any ~why:Initial_typedecl_env in (* jkind_default is the jkind to use for now as the type_jkind when there is no annotation and no manifest. See Note [Default jkinds in transl_declaration]. @@ -661,7 +789,7 @@ let transl_declaration env sdecl (id, uid) = let (tkind, kind, jkind_default) = match sdecl.ptype_kind with | Ptype_abstract -> - Ttype_abstract, Type_abstract Abstract_def, Jkind.value ~why:Default_type_jkind + Ttype_abstract, Type_abstract Abstract_def, Jkind.Primitive.value ~why:Default_type_jkind | Ptype_variant scstrs -> if List.exists (fun cstr -> cstr.pcd_res <> None) scstrs then begin match cstrs with @@ -692,7 +820,7 @@ let transl_declaration env sdecl (id, uid) = attributes in let tvars, targs, tret_type, args, ret_type = - make_constructor env scstr.pcd_loc + make_constructor ~unboxed:unbox env scstr.pcd_loc ~cstr_path:(Path.Pident name) ~type_path:path params svars scstr.pcd_args scstr.pcd_res in @@ -700,6 +828,7 @@ let transl_declaration env sdecl (id, uid) = { cd_id = name; cd_name = scstr.pcd_name; cd_vars = tvars; + cd_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); cd_args = targs; cd_res = tret_type; cd_loc = scstr.pcd_loc; @@ -711,7 +840,7 @@ let transl_declaration env sdecl (id, uid) = cd_res = ret_type; cd_loc = scstr.pcd_loc; cd_attributes = attributes; - cd_uid = Uid.mk ~current_unit:(Env.get_unit_name ()) } + cd_uid = tcstr.cd_uid } in tcstr, cstr in @@ -725,54 +854,61 @@ let transl_declaration env sdecl (id, uid) = Variant_unboxed, any else (* We mark all arg jkinds "any" here. They are updated later, - after the circular type checks make it safe to check jkinds. *) + after the circular type checks make it safe to check jkinds. + Likewise, [Constructor_uniform_value] is potentially wrong + and will be updated later. + *) Variant_boxed ( Array.map (fun cstr -> - match Types.(cstr.cd_args) with - | Cstr_tuple args -> - Array.make (List.length args) any - | Cstr_record _ -> [| any |]) + let jkinds = + match Types.(cstr.cd_args) with + | Cstr_tuple args -> + Array.make (List.length args) any + | Cstr_record _ -> [| any |] + in + Constructor_uniform_value, jkinds) (Array.of_list cstrs) ), - Jkind.value ~why:Boxed_variant + Jkind.Primitive.value ~why:Boxed_variant in Ttype_variant tcstrs, Type_variant (cstrs, rep), jkind | Ptype_record lbls -> - let lbls, lbls' = transl_labels env None true lbls in + let lbls, lbls' = + (* CR layouts: we forbid [@@unboxed] records from being + non-value, see comment in [check_representable]. *) + transl_labels ~new_var_jkind:Any ~allow_unboxed:(not unbox) + env None true lbls (Record { unboxed = unbox }) + in let rep, jkind = + (* Note this is inaccurate, using `Record_boxed` in cases where the + correct representation is [Record_float], [Record_ufloat], or + [Record_mixed]. Those cases are fixed up after we can get + accurate jkinds for the fields, in [update_decl_jkind]. *) if unbox then Record_unboxed, any - else (if List.for_all (fun l -> is_float env l.Types.ld_type) lbls' - then Record_float - else Record_boxed (Array.make (List.length lbls) any)), - Jkind.value ~why:Boxed_record + else + Record_boxed (Array.make (List.length lbls) any), + Jkind.Primitive.value ~why:Boxed_record in Ttype_record lbls, Type_record(lbls', rep), jkind | Ptype_open -> - Ttype_open, Type_open, Jkind.value ~why:Extensible_variant + Ttype_open, Type_open, Jkind.Primitive.value ~why:Extensible_variant in let jkind = (* - If there's an annotation, we use that. It's checked against a kind in [update_decl_jkind] and the manifest in [check_coherence]. - - If there's no annotation but there is a manifest, we estimate the - jkind based on the manifest here. This upper bound saves time - later by avoiding expanding the manifest in jkind checks, but it - would be sound to leave in `any`. We can't give a perfectly - accurate jkind here because we don't have access to the - manifests of mutually defined types (but we could one day consider - improving it at a later point in transl_type_decl). + Both of those functions update the [type_jkind] field in the + [type_declaration] as appropriate. + - If there's no annotation but there is a manifest, just use [any]. + This will get updated to the manifest's jkind in [check_coherence]. - If there's no annotation and no manifest, we fill in with the default calculated above here. It will get updated in [update_decl_jkind]. See Note [Default jkinds in transl_declaration]. *) - (* CR layouts: Is the estimation mentioned in the second bullet above - doing anything for us? Abstract types are updated by - check_coherence and record/variant types are updated by - update_decl_jkind. *) - match jkind_annotation, man with + match jkind_from_annotation, man with | Some annot, _ -> annot - | None, Some typ -> Ctype.estimate_type_jkind env typ + | None, Some _ -> Jkind.Primitive.any ~why:Initial_typedecl_env | None, None -> jkind_default in let arity = List.length params in @@ -781,6 +917,7 @@ let transl_declaration env sdecl (id, uid) = type_arity = arity; type_kind = kind; type_jkind = jkind; + type_jkind_annotation = jkind_annotation; type_private = sdecl.ptype_private; type_manifest = man; type_variance = Variance.unknown_signature ~injective:false ~arity; @@ -788,9 +925,10 @@ let transl_declaration env sdecl (id, uid) = type_is_newtype = false; type_expansion_scope = Btype.lowest_level; type_loc = sdecl.ptype_loc; - type_attributes = sdecl.ptype_attributes; + type_attributes = sdecl_attributes; type_unboxed_default = unboxed_default; type_uid = uid; + type_has_illegal_crossings = false; } in (* Check constraints *) List.iter @@ -809,18 +947,29 @@ let transl_declaration env sdecl (id, uid) = in set_private_row env sdecl.ptype_loc p decl end; - { - typ_id = id; - typ_name = sdecl.ptype_name; - typ_params = tparams; - typ_type = decl; - typ_cstrs = cstrs; - typ_loc = sdecl.ptype_loc; - typ_manifest = tman; - typ_kind = tkind; - typ_private = sdecl.ptype_private; - typ_attributes = sdecl.ptype_attributes; - } + let decl = + { + typ_id = id; + typ_name = sdecl.ptype_name; + typ_params = tparams; + typ_type = decl; + typ_cstrs = cstrs; + typ_loc = sdecl.ptype_loc; + typ_manifest = tman; + typ_kind = tkind; + typ_private = sdecl.ptype_private; + typ_attributes = sdecl.ptype_attributes; + typ_jkind_annotation = Option.map snd jkind_annotation; + } + in + let typ_shape = + let uid = decl.typ_type.type_uid in + match decl.typ_kind with + | Ttype_variant cstrs -> Shape.str ~uid (shape_map_cstrs cstrs) + | Ttype_record labels -> Shape.str ~uid (shape_map_labels labels) + | Ttype_abstract | Ttype_open -> Shape.leaf uid + in + decl, typ_shape end (* Generalize a type declaration *) @@ -857,9 +1006,12 @@ let rec check_constraints_rec env loc visited ty = | Unification_failure err -> raise (Error(loc, Constraint_failed (env, err))) | Jkind_mismatch { original_jkind; inferred_jkind; ty } -> - raise (Error(loc, Jkind_mismatch_of_type (ty, - (Jkind.Violation.of_ (Not_a_subjkind - (original_jkind, inferred_jkind)))))) + let violation = + Jkind.Violation.of_ + (Not_a_subjkind (original_jkind, inferred_jkind)) + in + raise (Error(loc, Jkind_mismatch_due_to_bad_inference + (ty, violation, Check_constraints))) | All_good -> () end; List.iter (check_constraints_rec env loc visited) args @@ -911,8 +1063,8 @@ let check_constraints env sdecl (_, decl) = begin match cd_args, pcd_args with | Cstr_tuple tyl, Pcstr_tuple styl -> List.iter2 - (fun sty (ty, _) -> - check_constraints_rec env sty.ptyp_loc visited ty) + (fun arg {Types.ca_type=ty; _} -> + check_constraints_rec env arg.pca_type.ptyp_loc visited ty) styl tyl | Cstr_record tyl, Pcstr_record styl -> check_constraints_labels env visited tyl styl @@ -956,14 +1108,19 @@ let check_constraints env sdecl (_, decl) = relatively expensive thing of computing the best possible jkind for the manifest, checking that it's a subjkind of [type_jkind], and then replacing [type_jkind] with what we computed. - - CR layouts: if easy, factor out the shared backtracking logic from here - and is_immediate. *) let check_coherence env loc dpath decl = match decl with { type_kind = (Type_variant _ | Type_record _| Type_open); type_manifest = Some ty } -> + if !Clflags.allow_illegal_crossing then begin + let jkind' = Ctype.type_jkind_purely env ty in + begin match Jkind.sub_with_history jkind' decl.type_jkind with + | Ok _ -> () + | Error v -> + raise (Error (loc, Jkind_mismatch_of_type (ty,v))) + end + end; begin match get_desc ty with Tconstr(path, args, _) -> begin try @@ -996,17 +1153,7 @@ let check_coherence env loc dpath decl = end | { type_kind = Type_abstract _; type_manifest = Some ty } -> - let jkind' = - if !Clflags.principal || Env.has_local_constraints env then - (* We snapshot to keep this pure; see the mode crossing test that - mentions snapshotting for an example. *) - let snap = Btype.snapshot () in - let jkind' = Ctype.type_jkind env ty in - Btype.backtrack snap; - jkind' - else - Ctype.type_jkind env ty - in + let jkind' = Ctype.type_jkind_purely env ty in begin match Jkind.sub_with_history jkind' decl.type_jkind with | Ok jkind' -> { decl with type_jkind = jkind' } | Error v -> @@ -1017,36 +1164,6 @@ let check_coherence env loc dpath decl = let check_abbrev env sdecl (id, decl) = (id, check_coherence env sdecl.ptype_loc (Path.Pident id) decl) -(* Makes sure a type is representable. Will lower "any" to "value". *) -(* CR layouts: In the places where this is used, we first call this to - ensure a type is representable, and then call [Ctype.type_jkind] to get the - most precise jkind. These could be combined into some new function - [Ctype.type_jkind_representable] that avoids duplicated work *) -(* CR layouts: Many places where [check_representable] is called in this file - should be replaced with checks at the places where values of those types are - constructed. We've been conservative here in the first version. This is the - same issue as with arrows. *) -let check_representable ~why ~allow_float env loc kloc typ = - match Ctype.type_sort ~why env typ with - (* CR layouts v3: This is a convenient place to rule out [float#] in - structures for now, as it is called on all the types in declared blocks in - kinds, and only them. But when we have a real mixed block restriction, it - can't be done here because we're just looking at one type. *) - (* CR layouts v2.5: This rules out float# in [@@unboxed] types. No real need - to rule that out - I just haven't had time to write tests for it yet. *) - | Ok s -> begin - match Jkind.Sort.get_default_value s with - (* All calls to this are part of [update_decl_jkind], which happens after - all the defaulting, so we don't expect this actually defaults the - sort - we just want the [const]. *) - | Void | Value -> () - | Float64 when allow_float -> () - (* CR layouts v2.5: If we want to hold back [float#] records from the - maturity progression of [float64], we can add a check here. *) - | Float64 -> raise (Error (loc, Float64_in_block (typ, kloc))) - end - | Error err -> raise (Error (loc,Jkind_sort {kloc; typ; err})) - (* The [update_x_jkinds] functions infer more precise jkinds in the type kind, including which fields of a record are void. This would be hard to do during [transl_declaration] due to mutually recursive types. @@ -1064,9 +1181,7 @@ let update_label_jkinds env loc lbls named = | Some jkinds -> fun idx jkind -> jkinds.(idx) <- jkind in let lbls = - List.mapi (fun idx (Types.{ld_type; ld_id; ld_loc} as lbl) -> - check_representable ~why:(Label_declaration ld_id) - ~allow_float:(Option.is_some named) env ld_loc Record ld_type; + List.mapi (fun idx (Types.{ld_type} as lbl) -> let ld_jkind = Ctype.type_jkind env ld_type in update idx ld_jkind; {lbl with ld_jkind} @@ -1083,16 +1198,222 @@ let update_label_jkinds env loc lbls named = let update_constructor_arguments_jkinds env loc cd_args jkinds = match cd_args with | Types.Cstr_tuple tys -> - List.iteri (fun idx (ty,_) -> - check_representable ~why:(Constructor_declaration idx) ~allow_float:false - env loc Cstr_tuple ty; + List.iteri (fun idx {Types.ca_type=ty; _} -> jkinds.(idx) <- Ctype.type_jkind env ty) tys; cd_args, Array.for_all Jkind.is_void_defaulting jkinds | Types.Cstr_record lbls -> - let lbls, all_void = update_label_jkinds env loc lbls None in - jkinds.(0) <- Jkind.value ~why:Boxed_record; + let lbls, all_void = + update_label_jkinds env loc lbls None + in + jkinds.(0) <- Jkind.Primitive.value ~why:Boxed_record; Types.Cstr_record lbls, all_void +let assert_mixed_product_support = + let required_reserved_header_bits = 8 in + (* Why 2? We'd subtract 1 if the mixed block encoding could use all 8 bits of + the prefix. But the all-0 prefix means "not a mixed block", so we can't use + the all-0 pattern, and we must subtract 2 instead. *) + let max_value_prefix_len = (1 lsl required_reserved_header_bits) - 2 in + fun loc mixed_product_kind ~value_prefix_len -> + let required_layouts_level = Language_extension.Stable in + if not (Language_extension.is_at_least Layouts required_layouts_level) then + raise (Error (loc, Illegal_mixed_product + (Insufficient_level { required_layouts_level; + mixed_product_kind; + }))); + if Config.reserved_header_bits < required_reserved_header_bits then + raise (Error (loc, Illegal_mixed_product + (Runtime_support_not_enabled + mixed_product_kind))); + if value_prefix_len > max_value_prefix_len then + raise + (Error (loc, + Illegal_mixed_product + (Value_prefix_too_long + { value_prefix_len; max_value_prefix_len; + mixed_product_kind }))) + +(* [Element_repr] is used to classify whether something is a "mixed product" + (a mixed record or mixed variant constructor), meaning that some of the + fields are unboxed in a way that isnt encoded in the usual short numeric tag. + "Element" refers to a constructor argument or record field. +*) +module Element_repr = struct + type unboxed_element = + | Float64 + | Float32 + | Bits32 + | Bits64 + | Word + + type t = + | Unboxed_element of unboxed_element + | Imm_element + | Float_element + | Value_element + | Element_without_runtime_component of { loc : Location.t; ty : type_expr } + + let classify env loc ty jkind = + if is_float env ty then Float_element + else + let const_jkind = Jkind.default_to_value_and_get jkind in + let sort = Jkind.Const.(Layout.get_sort (get_layout const_jkind)) in + let externality_upper_bound = + Jkind.Const.get_externality_upper_bound const_jkind + in + match sort, externality_upper_bound with + (* CR layouts v5.1: We don't allow [External64] in the flat suffix of + mixed blocks. That's because we haven't committed to whether the + unboxing features of flambda2 can be used together with 32 bit + platforms. (If flambda2 stores unboxed things as flat in 32 bits, then + immediate64s must be banned in the flat suffix with backends for 32 bit + platforms that pass through flambda2. Further, we want a record + declaration to be accepted consistently in 32 bits vs. 64 bits. + So, immediate64s must always be banned in the flat suffix.) + + In practice, users can put immediate64s in the value prefix. + (We may consider teaching the middle-ends to mark immediate64s that + abut the non-scannable suffix as non-scannable on 64 bit platforms.) + + We may revisit this decision later when we know better whether we want + flambda2 to unbox for 32 bit platforms. + *) + | Some Value, (Internal | External64) -> + Value_element + | Some Value, External -> Imm_element + | Some Float64, _ -> Unboxed_element Float64 + | Some Float32, _ -> Unboxed_element Float32 + | Some Word, _ -> Unboxed_element Word + | Some Bits32, _ -> Unboxed_element Bits32 + | Some Bits64, _ -> Unboxed_element Bits64 + | Some Void, _ -> Element_without_runtime_component { loc; ty } + | None, _ -> + Misc.fatal_error "Element_repr.classify: unexpected Any" + + let unboxed_to_flat : unboxed_element -> flat_element = function + | Float64 -> Float64 + | Float32 -> Float32 + | Bits32 -> Bits32 + | Bits64 -> Bits64 + | Word -> Word + + let to_flat : _ -> flat_element option = function + | Imm_element -> Some Imm + | Unboxed_element unboxed -> Some (unboxed_to_flat unboxed) + (* CR layouts v7: Supporting void with mixed blocks will require + updating some assumptions in lambda, e.g. the translation + of [value_prefix_len]. *) + | Element_without_runtime_component { loc; ty } -> + raise (Error (loc, Invalid_jkind_in_block (ty, Void, Mixed_product))) + | Float_element | Value_element -> None + + (* Compute the [flat_suffix] field of a mixed block record kind. *) + let mixed_product_flat_suffix ts ~on_flat_field_expected = + let rec find_flat_suffix ts = + match ts with + | [] -> None + | (t1, t1_extra) :: ts -> + match t1 with + | Unboxed_element unboxed -> + let suffix = + List.map (fun (t2, t2_extra) -> + match to_flat t2 with + | Some flat -> flat + | None -> + on_flat_field_expected + ~non_value:t1_extra + ~boxed:t2_extra) + ts + in + Some (`Continue (unboxed_to_flat unboxed :: suffix)) + | Float_element + | Imm_element + | Value_element as repr -> begin + match find_flat_suffix ts with + | None -> None + | Some `Stop _ as stop -> stop + | Some `Continue suffix -> + Some ( + match to_flat repr with + | None -> `Stop suffix + | Some flat -> `Continue (flat :: suffix)) + end + (* CR layouts v7: Supporting void with mixed blocks will require + updating some assumptions in lambda, e.g. the translation + of [value_prefix_len]. *) + | Element_without_runtime_component { loc; ty } -> begin + match find_flat_suffix ts with + | None -> None + | Some _ -> + raise (Error (loc, + Invalid_jkind_in_block (ty, Void, Mixed_product))) + end + in + match find_flat_suffix ts with + | None -> None + | Some (`Continue flat_suffix | `Stop flat_suffix) -> + Some (Array.of_list flat_suffix) + + let mixed_product_shape loc ts kind ~on_flat_field_expected = + let flat_suffix = mixed_product_flat_suffix ts ~on_flat_field_expected in + match flat_suffix with + | None -> None + | Some flat_suffix -> + let value_prefix_len = List.length ts - Array.length flat_suffix in + assert_mixed_product_support loc kind ~value_prefix_len; + Some { value_prefix_len; flat_suffix } +end + +let update_constructor_representation + env (cd_args : Types.constructor_arguments) arg_jkinds ~loc + ~is_extension_constructor + = + let flat_suffix = + let arg_jkinds = Array.to_list arg_jkinds in + match cd_args with + | Cstr_tuple arg_types_and_modes -> + let arg_reprs = + List.map2 (fun {Types.ca_type=arg_type; _} arg_jkind -> + Element_repr.classify env loc arg_type arg_jkind, arg_type) + arg_types_and_modes arg_jkinds + in + Element_repr.mixed_product_shape loc arg_reprs Cstr_tuple + ~on_flat_field_expected:(fun ~non_value ~boxed -> + let violation = + Flat_constructor_arg_expected + { non_value_arg = non_value; + boxed_arg = boxed; + } + in + raise (Error (loc, Illegal_mixed_product violation))) + | Cstr_record fields -> + let arg_reprs = + List.map (fun ld -> + Element_repr.classify env loc ld.Types.ld_type ld.ld_jkind, ld) + fields + in + Element_repr.mixed_product_shape loc arg_reprs Cstr_record + ~on_flat_field_expected:(fun ~non_value ~boxed -> + let violation = + Flat_field_expected + { non_value_lbl = non_value.Types.ld_id; + boxed_lbl = boxed.Types.ld_id; + } + in + raise (Error (non_value.Types.ld_loc, + Illegal_mixed_product violation))) + in + match flat_suffix with + | None -> Constructor_uniform_value + | Some shape -> + (* CR layouts v5.9: Enable extension constructors in the flambda2 + middle-end so that we can permit them in the source language. + *) + if is_extension_constructor then + raise (Error (loc, Illegal_mixed_product Extension_constructor)); + Constructor_mixed shape + + (* This function updates jkind stored in kinds with more accurate jkinds. It is called after the circularity checks and the delayed jkind checks have happened, so we can fully compute jkinds of types. @@ -1105,69 +1426,136 @@ let update_constructor_arguments_jkinds env loc cd_args jkinds = let update_decl_jkind env dpath decl = let open struct (* For tracking what types appear in record blocks. *) - type has_values = Has_values | No_values - type has_float64s = Has_float64s | No_float64s + type element_repr_summary = + { mutable values : bool; (* excludes [imm], but includes [imm64] *) + mutable imms : bool; + mutable floats: bool; + (* For purposes of this record, [floats] tracks whether any field + has layout value and is known to be a float. + *) + mutable float64s : bool; + mutable non_float64_unboxed_fields : bool; + } end in (* returns updated labels, updated rep, and updated jkind *) let update_record_kind loc lbls rep = match lbls, rep with - | [Types.{ld_type; ld_id; ld_loc} as lbl], Record_unboxed -> - check_representable ~why:(Label_declaration ld_id) ~allow_float:false - env ld_loc Record ld_type; + | [Types.{ld_type} as lbl], Record_unboxed -> let ld_jkind = Ctype.type_jkind env ld_type in [{lbl with ld_jkind}], Record_unboxed, ld_jkind | _, Record_boxed jkinds -> - let lbls, all_void = update_label_jkinds env loc lbls (Some jkinds) in + let lbls, all_void = + update_label_jkinds env loc lbls (Some jkinds) + in let jkind = Jkind.for_boxed_record ~all_void in - let has_values, has_floats = - Array.fold_left - (fun (values, floats) jkind -> - match Jkind.get_default_value jkind with - | Value | Immediate64 | Immediate -> (Has_values, floats) - | Float64 -> (values, Has_float64s) - | Void -> (values, floats) - | Any -> assert false) - (No_values, No_float64s) jkinds + let reprs = + List.mapi + (fun i lbl -> + Element_repr.classify env loc lbl.Types.ld_type jkinds.(i), lbl) + lbls + in + let repr_summary = + { values = false; imms = false; floats = false; float64s = false; + non_float64_unboxed_fields = false; + } in + List.iter + (fun ((repr : Element_repr.t), _lbl) -> + match repr with + | Float_element -> repr_summary.floats <- true + | Imm_element -> repr_summary.imms <- true + | Unboxed_element Float64 -> repr_summary.float64s <- true + | Unboxed_element (Float32 | Bits32 | Bits64 | Word) -> + repr_summary.non_float64_unboxed_fields <- true + | Value_element -> repr_summary.values <- true + | Element_without_runtime_component _ -> ()) + reprs; let rep = - match has_values, has_floats with - | Has_values, Has_float64s -> raise (Error (loc, Mixed_block)) - | Has_values, No_float64s -> rep - | No_values, Has_float64s -> Record_ufloat - | No_values, No_float64s -> + match repr_summary with + (* We store mixed float/float64 records as flat if there are no + non-float fields. + *) + | { values = false; imms = false; floats = true; + float64s = true; non_float64_unboxed_fields = false; } + [@warning "+9"] -> + let flat_suffix = + List.map + (fun ((repr : Element_repr.t), _lbl) -> + match repr with + | Float_element -> Float_boxed + | Unboxed_element Float64 -> Float64 + | Element_without_runtime_component { ty; loc } -> + raise (Error (loc, + Invalid_jkind_in_block (ty, Void, Mixed_product))) + | Unboxed_element _ | Imm_element | Value_element -> + Misc.fatal_error "Expected only floats and float64s") + reprs + |> Array.of_list + in + assert_mixed_product_support loc Record ~value_prefix_len:0; + Record_mixed { value_prefix_len = 0; flat_suffix } + (* For other mixed blocks, float fields are stored as flat + only when they're unboxed. + *) + | { values = true; float64s = true } + | { imms = true; float64s = true } + | { non_float64_unboxed_fields = true } -> + let shape = + Element_repr.mixed_product_shape loc reprs Record + ~on_flat_field_expected:(fun ~non_value ~boxed -> + let violation = + Flat_field_expected + { non_value_lbl = non_value.Types.ld_id; + boxed_lbl = boxed.Types.ld_id; + } + in + raise (Error (boxed.Types.ld_loc, + Illegal_mixed_product violation))) + in + let shape = + match shape with + | Some x -> x + | None -> Misc.fatal_error "expected mixed block" + in + Record_mixed shape + (* value-only records are stored as boxed records *) + | { values = true; float64s = false; non_float64_unboxed_fields = false } + | { imms = true; float64s = false; non_float64_unboxed_fields = false } + -> rep + (* All-float and all-float64 records are stored as flat float records. + *) + | { values = false; imms = false; floats = true ; float64s = false; + non_float64_unboxed_fields = false } -> + Record_float + | { values = false; imms = false; floats = false; float64s = true; + non_float64_unboxed_fields = false } -> + Record_ufloat + | { values = false; imms = false; floats = false; float64s = false; + non_float64_unboxed_fields = false } + [@warning "+9"] -> Misc.fatal_error "Typedecl.update_record_kind: empty record" in lbls, rep, jkind - | _, Record_float -> - (* CR layouts v2.5: When we have an unboxed float jkind, does it make - sense to use that here? The use of value feels inaccurate, but I think - the code that would look at first looks at the rep. *) - let lbls = - List.map (fun lbl -> - { lbl with ld_jkind = Jkind.value ~why:Float_record_field }) - lbls - in - lbls, rep, Jkind.value ~why:Boxed_record - | (([] | (_ :: _)), Record_unboxed - | _, (Record_inlined _ | Record_ufloat)) -> assert false + | _, ( Record_inlined _ | Record_float | Record_ufloat + | Record_mixed _) + | ([] | (_ :: _)), Record_unboxed -> + (* These are never created by [transl_declaration]. *) + Misc.fatal_error + "Typedecl.update_record_kind: unexpected record representation" in (* returns updated constructors, updated rep, and updated jkind *) let update_variant_kind cstrs rep = (* CR layouts: factor out duplication *) match cstrs, rep with - | [{Types.cd_args;cd_loc} as cstr], Variant_unboxed -> begin + | [{Types.cd_args} as cstr], Variant_unboxed -> begin match cd_args with - | Cstr_tuple [ty,_] -> begin - check_representable ~why:(Constructor_declaration 0) - ~allow_float:false env cd_loc Cstr_tuple ty; + | Cstr_tuple [{ca_type=ty; _}] -> begin let jkind = Ctype.type_jkind env ty in cstrs, Variant_unboxed, jkind end - | Cstr_record [{ld_type; ld_id; ld_loc} as lbl] -> begin - check_representable ~why:(Label_declaration ld_id) - ~allow_float:false env ld_loc Record ld_type; + | Cstr_record [{ld_type} as lbl] -> begin let ld_jkind = Ctype.type_jkind env ld_type in [{ cstr with Types.cd_args = Cstr_record [{ lbl with ld_jkind }] }], @@ -1176,12 +1564,30 @@ let update_decl_jkind env dpath decl = | (Cstr_tuple ([] | _ :: _ :: _) | Cstr_record ([] | _ :: _ :: _)) -> assert false end - | cstrs, Variant_boxed jkinds -> + | cstrs, Variant_boxed cstr_shapes -> let (_,cstrs,all_voids) = List.fold_left (fun (idx,cstrs,all_voids) cstr -> + let arg_jkinds = + match cstr_shapes.(idx) with + | Constructor_uniform_value, arg_jkinds -> arg_jkinds + | Constructor_mixed _, _ -> + fatal_error + "Typedecl.update_variant_kind doesn't expect mixed \ + constructor as input" + in let cd_args, all_void = update_constructor_arguments_jkinds env cstr.Types.cd_loc - cstr.Types.cd_args jkinds.(idx) + cstr.Types.cd_args arg_jkinds + in + let cstr_repr = + update_constructor_representation env cd_args arg_jkinds + ~is_extension_constructor:false + ~loc:cstr.Types.cd_loc + in + let () = + match cstr_repr with + | Constructor_uniform_value -> () + | Constructor_mixed _ -> cstr_shapes.(idx) <- cstr_repr, arg_jkinds in let cstr = { cstr with Types.cd_args } in (idx+1,cstr::cstrs,all_voids && all_void) @@ -1193,31 +1599,60 @@ let update_decl_jkind env dpath decl = assert false in + let add_crossings jkind = + match !Clflags.allow_illegal_crossing with + | true -> Jkind.add_portability_and_contention_crossing ~from:decl.type_jkind jkind + | false -> jkind, false + in + let new_decl, new_jkind = match decl.type_kind with | Type_abstract _ -> decl, decl.type_jkind | Type_open -> - let type_jkind = Jkind.value ~why:Extensible_variant in + let type_jkind = Jkind.Primitive.value ~why:Extensible_variant in { decl with type_jkind }, type_jkind | Type_record (lbls, rep) -> let lbls, rep, type_jkind = update_record_kind decl.type_loc lbls rep in - { decl with type_kind = Type_record (lbls, rep); type_jkind }, + let type_jkind, type_has_illegal_crossings = add_crossings type_jkind in + { decl with type_kind = Type_record (lbls, rep); + type_jkind; + type_has_illegal_crossings }, type_jkind | Type_variant (cstrs, rep) -> let cstrs, rep, type_jkind = update_variant_kind cstrs rep in - { decl with type_kind = Type_variant (cstrs, rep); type_jkind }, + let type_jkind, type_has_illegal_crossings = add_crossings type_jkind in + { decl with type_kind = Type_variant (cstrs, rep); + type_jkind; + type_has_illegal_crossings }, type_jkind in (* check that the jkind computed from the kind matches the jkind annotation, which was stored in decl.type_jkind *) if new_jkind != decl.type_jkind then - begin match Jkind.sub new_jkind decl.type_jkind with + begin match Jkind.sub_or_error new_jkind decl.type_jkind with | Ok () -> () | Error err -> raise(Error(decl.type_loc, Jkind_mismatch_of_path (dpath,err))) end; new_decl +let update_decls_jkind_reason decls = + List.map + (fun (id, decl) -> + let update_generalized = + Ctype.check_and_update_generalized_ty_jkind + ~name:id ~loc:decl.type_loc + in + List.iter update_generalized decl.type_params; + Btype.iter_type_expr_kind update_generalized decl.type_kind; + Option.iter update_generalized decl.type_manifest; + let reason = Jkind.History.Generalized (Some id, decl.type_loc) in + let new_decl = {decl with type_jkind = + Jkind.History.update_reason decl.type_jkind reason} in + (id, new_decl) + ) + decls + let update_decls_jkind env decls = List.map (fun (id, decl) -> (id, update_decl_jkind env (Pident id) decl)) @@ -1425,7 +1860,7 @@ let check_well_founded_manifest ~abs_env env loc path decl = let args = (* The jkinds here shouldn't matter for the purposes of [check_well_founded] *) - List.map (fun _ -> Ctype.newvar (Jkind.any ~why:Dummy_jkind)) + List.map (fun _ -> Ctype.newvar (Jkind.Primitive.any ~why:Dummy_jkind)) decl.type_params in let visited = ref TypeMap.empty in @@ -1615,10 +2050,11 @@ let check_redefined_unit (td: Parsetree.type_declaration) = | _ -> () -let add_types_to_env decls env = - List.fold_right - (fun (id, decl) env -> add_type ~check:true id decl env) - decls env +let add_types_to_env decls shapes env = + List.fold_right2 + (fun (id, decl) shape env -> + add_type ~check:true ~shape id decl env) + decls shapes env (* Translate a set of type declarations, mutually recursive or not *) let transl_type_decl env rec_flag sdecl_list = @@ -1649,7 +2085,7 @@ let transl_type_decl env rec_flag sdecl_list = Uid.mk ~current_unit:(Env.get_unit_name ()) ) sdecl_list in - let tdecls, decls, new_env, delayed_jkind_checks = + let tdecls, decls, shapes, new_env, delayed_jkind_checks = Ctype.with_local_level_iter ~post:generalize_decl begin fun () -> (* Enter types. *) let temp_env = @@ -1690,13 +2126,15 @@ let transl_type_decl env rec_flag sdecl_list = enviroment. *) let tdecls = List.map2 transl_declaration sdecl_list (List.map ids_slots ids_list) in - let decls = - List.map (fun tdecl -> (tdecl.typ_id, tdecl.typ_type)) tdecls in + let decls, shapes = + List.map (fun (tdecl, shape) -> (tdecl.typ_id, tdecl.typ_type), shape) tdecls + |> List.split + in current_slot := None; (* Check for duplicates *) check_duplicates sdecl_list; (* Build the final env. *) - let new_env = add_types_to_env decls env in + let new_env = add_types_to_env decls shapes env in (* Update stubs *) let delayed_jkind_checks = match rec_flag with @@ -1708,7 +2146,7 @@ let transl_type_decl env rec_flag sdecl_list = sdecl.ptype_loc) ids_list sdecl_list in - ((tdecls, decls, new_env, delayed_jkind_checks), List.map snd decls) + ((tdecls, decls, shapes, new_env, delayed_jkind_checks), List.map snd decls) end in (* Check for ill-formed abbrevs *) @@ -1735,34 +2173,57 @@ let transl_type_decl env rec_flag sdecl_list = (Path.Pident id) decl to_check) decls; - List.iter - (check_abbrev_regularity ~abs_env new_env id_loc_list to_check) tdecls; + List.iter (fun (tdecl, _shape) -> + check_abbrev_regularity ~abs_env new_env id_loc_list to_check tdecl) tdecls; (* Now that we've ruled out ill-formed types, we can perform the delayed jkind checks *) List.iter (fun (checks,loc) -> List.iter (fun (ty,jkind) -> - match Ctype.constrain_type_jkind new_env ty jkind with + (* The use [check_type_jkind] rather than [constrain_type_jkind] here is + conservative. It ensures that the delayed checks don't succeed by + mutating type variables from the [temp_env] in a way that won't be + reflected in the final type decls and may be incompatible with them. + An alternative would be to beef up [check_constraints] and really make + sure we re-check any kind constraint that could arise from translating + the typedecl RHSs, for example by looking at Typedtree instead of + what's just in the type environment. See Test 41 in + [tests/typing-layouts/basics.ml] for a subtle example. *) + match Ctype.check_type_jkind new_env ty jkind with | Ok _ -> () | Error err -> - let err = Errortrace.unification_error ~trace:[Bad_jkind (ty,err)] in - raise (Error (loc, Type_clash (new_env, err)))) + (* This inner match is just here to detect when we're rejecting this + program because we're being conservative in the sense of the previous + comment, and issue an error admitting to it. *) + begin match Ctype.constrain_type_jkind new_env ty jkind with + | Error _ -> + let err = Errortrace.unification_error ~trace:[Bad_jkind (ty,err)] in + raise (Error (loc, Type_clash (new_env, err))) + | Ok _ -> + raise (Error (loc, Jkind_mismatch_due_to_bad_inference + (ty, err, Delayed_checks))) + end) checks) delayed_jkind_checks; - (* Check that constraints are enforced *) - List.iter2 (check_constraints new_env) sdecl_list decls; (* Check that all type variables are closed; this also defaults any remaining sort variables. Defaulting must happen before update_decls_jkind, Typedecl_seperability.update_decls, and add_types_to_env, all of which need - to check whether parts of the type are void (and currently use - Jkind.equate to do this which would set any remaining sort variables - to void). *) + to check whether parts of the type are void (and currently use Jkind.equate + to do this which would set any remaining sort variables to void). It also + must happen before check_constraints, so that check_constraints can detect + when a jkind is inferred incorrectly. (The unification that + check_constraints does is undone via backtracking, and thus forgetting to + do the defaulting first is actually unsound: the unification in + check_constraints will succeed via mutation, be backtracked, and then + perhaps a sort variable gets defaulted to value. Bad bad.) *) List.iter2 - (fun sdecl tdecl -> + (fun sdecl (tdecl, _shape) -> let decl = tdecl.typ_type in match Ctype.closed_type_decl decl with Some ty -> raise(Error(sdecl.ptype_loc, Unbound_type_var(ty,decl))) | None -> ()) sdecl_list tdecls; + (* Check that constraints are enforced *) + List.iter2 (check_constraints new_env) sdecl_list decls; (* Add type properties to declarations *) let decls = try @@ -1771,32 +2232,33 @@ let transl_type_decl env rec_flag sdecl_list = |> Typedecl_variance.update_decls env sdecl_list |> Typedecl_separability.update_decls env |> update_decls_jkind new_env + |> update_decls_jkind_reason with | Typedecl_variance.Error (loc, err) -> raise (Error (loc, Variance err)) | Typedecl_separability.Error (loc, err) -> raise (Error (loc, Separability err)) in + (* Check re-exportation, updating [type_jkind] from the manifest *) + let decls = List.map2 (check_abbrev new_env) sdecl_list decls in (* Compute the final environment with variance and immediacy *) - let final_env = add_types_to_env decls env in - (* Check re-exportation *) - let decls = List.map2 (check_abbrev final_env) sdecl_list decls in + let final_env = add_types_to_env decls shapes env in (* Keep original declaration *) let final_decls = List.map2 - (fun tdecl (_id2, decl) -> + (fun (tdecl, _shape) (_id2, decl) -> { tdecl with typ_type = decl } ) tdecls decls in (* Done *) - (final_decls, final_env) + (final_decls, final_env, shapes) (* Translating type extensions *) let transl_extension_constructor_decl env type_path typext_params loc id svars sargs sret_type = let tvars, targs, tret_type, args, ret_type = make_constructor env loc - ~cstr_path:(Pident id) ~type_path typext_params + ~cstr_path:(Pident id) ~type_path ~unboxed:false typext_params svars sargs sret_type in let num_args = @@ -1804,11 +2266,15 @@ let transl_extension_constructor_decl | Cstr_tuple args -> List.length args | Cstr_record _ -> 1 in - let jkinds = Array.make num_args (Jkind.any ~why:Dummy_jkind) in + let jkinds = Array.make num_args (Jkind.Primitive.any ~why:Dummy_jkind) in let args, constant = update_constructor_arguments_jkinds env loc args jkinds in - args, jkinds, constant, ret_type, + let constructor_shape = + update_constructor_representation env args jkinds ~loc + ~is_extension_constructor:true + in + args, jkinds, constructor_shape, constant, ret_type, Text_decl(tvars, targs, tret_type) let transl_extension_constructor_jst env type_path _type_params @@ -1822,7 +2288,7 @@ let transl_extension_constructor ~scope env type_path type_params typext_params priv sext = let id = Ident.create_scoped ~scope sext.pext_name.txt in let loc = sext.pext_loc in - let args, arg_jkinds, constant, ret_type, kind = + let args, arg_jkinds, shape, constant, ret_type, kind = match Jane_syntax.Extension_constructor.of_ast sext with | Some (jext, attrs) -> transl_extension_constructor_jst @@ -1858,7 +2324,8 @@ let transl_extension_constructor ~scope env type_path type_params (* Remove "_" names from parameters used in the constructor *) if not cdescr.cstr_generalized then begin let vars = - Ctype.free_variables (Btype.newgenty (Ttuple (List.map fst args))) + Ctype.free_variables + (Btype.newgenty (Ttuple (List.map (fun {Types.ca_type=t; _} -> None, t) args))) in List.iter (fun ty -> @@ -1903,7 +2370,7 @@ let transl_extension_constructor ~scope env type_path type_params Types.Cstr_tuple args | Some decl -> let tl = - match List.map (fun (ty, _) -> get_desc ty) args with + match List.map (fun {Types.ca_type=ty; _} -> get_desc ty) args with | [ Tconstr(_, tl, _) ] -> tl | _ -> assert false in @@ -1917,7 +2384,8 @@ let transl_extension_constructor ~scope env type_path type_params in Types.Cstr_record lbls in - args, cdescr.cstr_arg_jkinds, cdescr.cstr_constant, ret_type, + args, cdescr.cstr_arg_jkinds, cdescr.cstr_shape, + cdescr.cstr_constant, ret_type, Text_rebind(path, lid) in let ext = @@ -1925,6 +2393,7 @@ let transl_extension_constructor ~scope env type_path type_params ext_type_params = typext_params; ext_args = args; ext_arg_jkinds = arg_jkinds; + ext_shape = shape; ext_constant = constant; ext_ret_type = ret_type; ext_private = priv; @@ -1933,12 +2402,22 @@ let transl_extension_constructor ~scope env type_path type_params ext_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); } in + let ext_cstrs = { ext_id = id; ext_name = sext.pext_name; ext_type = ext; ext_kind = kind; Typedtree.ext_loc = sext.pext_loc; Typedtree.ext_attributes = sext.pext_attributes; } + in + let shape = + let map = match ext_cstrs.ext_kind with + | Text_decl (_, Cstr_record lbls, _) -> shape_map_labels lbls + | _ -> Shape.Map.empty + in + Shape.str ~uid:ext_cstrs.ext_type.ext_uid map + in + ext_cstrs, shape let transl_extension_constructor ~scope env type_path type_params typext_params priv sext = @@ -2018,7 +2497,7 @@ let transl_type_extension extend env loc styext = (* Generalize types *) List.iter Ctype.generalize type_params; List.iter - (fun ext -> + (fun (ext, _shape) -> Btype.iter_type_expr_cstr_args Ctype.generalize ext.ext_type.ext_args; Option.iter Ctype.generalize ext.ext_type.ext_ret_type) constructors; @@ -2026,7 +2505,7 @@ let transl_type_extension extend env loc styext = in (* Check that all type variables are closed *) List.iter - (fun ext -> + (fun (ext, _shape) -> match Ctype.closed_extension_constructor ext.ext_type with Some ty -> raise(Error(ext.ext_loc, Unbound_type_var_ext(ty, ext.ext_type))) @@ -2034,7 +2513,7 @@ let transl_type_extension extend env loc styext = constructors; (* Check variances are correct *) List.iter - (fun ext-> + (fun (ext, _shape) -> (* Note that [loc] here is distinct from [type_decl.type_loc], which makes the [loc] parameter to this function useful. [loc] is the location of the extension, while [type_decl] points to the original @@ -2047,11 +2526,13 @@ let transl_type_extension extend env loc styext = (* Add extension constructors to the environment *) let newenv = List.fold_left - (fun env ext -> + (fun env (ext, shape) -> let rebind = is_rebind ext in - Env.add_extension ~check:true ~rebind ext.ext_id ext.ext_type env) + Env.add_extension ~check:true ~shape ~rebind + ext.ext_id ext.ext_type env) env constructors in + let constructors, shapes = List.split constructors in let tyext = { tyext_path = type_path; tyext_txt = styext.ptyext_path; @@ -2061,21 +2542,21 @@ let transl_type_extension extend env loc styext = tyext_loc = styext.ptyext_loc; tyext_attributes = styext.ptyext_attributes; } in - (tyext, newenv) + (tyext, newenv, shapes) let transl_type_extension extend env loc styext = Builtin_attributes.warning_scope styext.ptyext_attributes (fun () -> transl_type_extension extend env loc styext) let transl_exception env sext = - let ext = + let ext, shape = let scope = Ctype.create_scope () in Ctype.with_local_level (fun () -> TyVarEnv.reset(); transl_extension_constructor ~scope env Predef.path_exn [] [] Asttypes.Public sext) - ~post: begin fun ext -> + ~post: begin fun (ext, _shape) -> Btype.iter_type_expr_cstr_args Ctype.generalize ext.ext_type.ext_args; Option.iter Ctype.generalize ext.ext_type.ext_ret_type; end @@ -2088,12 +2569,12 @@ let transl_exception env sext = end; let rebind = is_rebind ext in let newenv = - Env.add_extension ~check:true ~rebind ext.ext_id ext.ext_type env + Env.add_extension ~check:true ~shape ~rebind ext.ext_id ext.ext_type env in - ext, newenv + ext, newenv, shape let transl_type_exception env t = - let contructor, newenv = + let contructor, newenv, shape = Builtin_attributes.warning_scope t.ptyexn_attributes (fun () -> transl_exception env t.ptyexn_constructor @@ -2101,7 +2582,7 @@ let transl_type_exception env t = in {tyexn_constructor = contructor; tyexn_loc = t.ptyexn_loc; - tyexn_attributes = t.ptyexn_attributes}, newenv + tyexn_attributes = t.ptyexn_attributes}, newenv, shape type native_repr_attribute = @@ -2122,12 +2603,30 @@ let get_native_repr_attribute attrs ~global_repr = | _, Some { Location.loc }, _ -> raise (Error (loc, Multiple_native_repr_attributes)) +let is_upstream_compatible_non_value_unbox env ty = + (* CR layouts v2.5: This needs to be updated when we support unboxed + types with arbitrary names suffixed with "#" *) + match get_desc (Ctype.expand_head_opt env ty) with + | Tconstr (path, _, _) -> + List.exists + (Path.same path) + [ + Predef.path_unboxed_float; + Predef.path_unboxed_int32; + Predef.path_unboxed_int64; + Predef.path_unboxed_nativeint; + ] + | _ -> + false + let native_repr_of_type env kind ty = match kind, get_desc (Ctype.expand_head_opt env ty) with | Untagged, Tconstr (path, _, _) when Path.same path Predef.path_int -> Some Untagged_int | Unboxed, Tconstr (path, _, _) when Path.same path Predef.path_float -> - Some Unboxed_float + Some (Unboxed_float Pfloat64) + | Unboxed, Tconstr (path, _, _) when Path.same path Predef.path_float32 -> + Some (Unboxed_float Pfloat32) | Unboxed, Tconstr (path, _, _) when Path.same path Predef.path_int32 -> Some (Unboxed_integer Pint32) | Unboxed, Tconstr (path, _, _) when Path.same path Predef.path_int64 -> @@ -2168,38 +2667,106 @@ let error_if_has_deep_native_repr_attributes core_type = in default_iterator.typ this_iterator core_type -let make_native_repr env core_type sort ty ~global_repr = +(* Note that [typ] is guaranteed not to contain sort variables because it was + produced by [type_scheme], which defaults them. + + However, there can be jkind [any] present with something like: + [external f : ('a : any). 'a -> 'a = "%identity"] + In such cases, we raise an expection. *) +let type_sort_external ~is_layout_poly ~why env loc typ = + match Ctype.type_sort ~why env typ with + | Ok s -> Jkind.Sort.default_to_value_and_get s + | Error err -> + let kloc = + if is_layout_poly then External_with_layout_poly else External + in + raise(Error (loc, Jkind_sort {kloc; typ; err})) + +type sort_or_poly = Sort of Jkind.Sort.const | Poly + +let make_native_repr env core_type ty ~global_repr ~is_layout_poly ~why = error_if_has_deep_native_repr_attributes core_type; - match get_native_repr_attribute core_type.ptyp_attributes ~global_repr with - | Native_repr_attr_absent -> + let sort_or_poly = + match get_desc (Ctype.get_unboxed_type_approximation env ty) with + (* This only captures tvars with layout [any] explicitly quantified within + the declaration. + + This is sufficient since [transl_type_scheme] promises that: + - non-explicitly quantified tvars get sort jkinds + - this isn't a tvar from an outer scopes ([TyVarEnv] gets reset before + transl) + *) + | Tvar {jkind} when is_layout_poly + && Jkind.has_layout_any jkind + && get_level ty = Btype.generic_level -> Poly + | _ -> + let sort = + type_sort_external ~is_layout_poly ~why env core_type.ptyp_loc ty + in + Sort sort + in + match get_native_repr_attribute + core_type.ptyp_attributes ~global_repr, + sort_or_poly with + | Native_repr_attr_absent, Poly -> + Repr_poly + | Native_repr_attr_absent, Sort (Value as sort) -> Same_as_ocaml_repr sort - | Native_repr_attr_present kind -> + | Native_repr_attr_absent, (Sort sort) -> + (if Language_extension.erasable_extensions_only () + then + (* Non-value sorts without [@unboxed] are not erasable. *) + let layout = Jkind_types.Sort.to_string (Const sort) in + Location.prerr_warning core_type.ptyp_loc + (Warnings.Incompatible_with_upstream + (Warnings.Unboxed_attribute layout))); + Same_as_ocaml_repr sort + | Native_repr_attr_present kind, (Poly | Sort Value) + | Native_repr_attr_present (Untagged as kind), Sort _ -> begin match native_repr_of_type env kind ty with | None -> raise (Error (core_type.ptyp_loc, Cannot_unbox_or_untag_type kind)) | Some repr -> repr end + | Native_repr_attr_present Unboxed, (Sort sort) -> + (* We allow [@unboxed] on non-value sorts. + + This is to enable upstream-compatibility. We want the code to + still work when all the layout annotations and unboxed types + get erased. + + One may wonder why can't the erasure process mentioned above + also add in the [@unboxed] attributes. This is not possible due + to the fact that: + + 1. Without type information, the erasure process can't transform: + + {| + type t = float# + external f : t -> t = ... + |} + + 2. We need [is_upstream_compatible_non_value_unbox] to further + limit the cases that can work with upstream. *) + (if Language_extension.erasable_extensions_only () + && not (is_upstream_compatible_non_value_unbox env ty) + then + (* There are additional requirements if we are operating in + upstream compatible mode. *) + let layout = Jkind_types.Sort.to_string (Const sort) in + Location.prerr_warning core_type.ptyp_loc + (Warnings.Incompatible_with_upstream + (Warnings.Non_value_sort layout))); + Same_as_ocaml_repr sort let prim_const_mode m = - match Mode.Locality.check_const m with + match Mode.Locality.Guts.check_const m with | Some Global -> Prim_global | Some Local -> Prim_local | None -> assert false -(* Note that [ty] is guaranteed not to contain sort variables because it was - produced by [type_scheme], which defaults them. Further, if ty is an arrow - we know its bits are representable, so [type_sort_external] can only fail - on externals with non-arrow types. *) -(* CR layouts v3: When we allow non-representable function args/returns, the - representability argument above isn't quite right. Decide whether we want to - allow non-representable types in external args/returns then. *) -let type_sort_external ~why env loc typ = - match Ctype.type_sort ~why env typ with - | Ok s -> Jkind.Sort.get_default_value s - | Error err -> - raise (Error (loc,Jkind_sort {kloc = External; typ; err})) - -let rec parse_native_repr_attributes env core_type ty rmode ~global_repr = +let rec parse_native_repr_attributes env core_type ty rmode + ~global_repr ~is_layout_poly = match core_type.ptyp_desc, get_desc ty, get_native_repr_attribute core_type.ptyp_attributes ~global_repr:None with @@ -2208,32 +2775,36 @@ let rec parse_native_repr_attributes env core_type ty rmode ~global_repr = | Ptyp_arrow (_, ct1, ct2), Tarrow ((_,marg,mret), t1, t2, _), _ when not (Builtin_attributes.has_curry core_type.ptyp_attributes) -> let t1, _ = Btype.tpoly_get_poly t1 in - let sort_arg = - type_sort_external ~why:External_argument env ct1.ptyp_loc t1 + let repr_arg = + make_native_repr + env ct1 t1 ~global_repr + ~is_layout_poly ~why:External_argument in - let repr_arg = make_native_repr env ct1 sort_arg t1 ~global_repr in let mode = if Builtin_attributes.has_local_opt ct1.ptyp_attributes then Prim_poly - else prim_const_mode (Mode.Alloc.locality marg) + else prim_const_mode (Mode.Alloc.proj (Comonadic Areality) marg) in let repr_args, repr_res = parse_native_repr_attributes env ct2 t2 - (prim_const_mode (Mode.Alloc.locality mret)) ~global_repr + (prim_const_mode (Mode.Alloc.proj (Comonadic Areality) mret)) + ~global_repr ~is_layout_poly in ((mode, repr_arg) :: repr_args, repr_res) | (Ptyp_poly (_, t) | Ptyp_alias (t, _)), _, _ -> - parse_native_repr_attributes env t ty rmode ~global_repr + parse_native_repr_attributes env t ty rmode ~global_repr ~is_layout_poly | _ -> let rmode = if Builtin_attributes.has_local_opt core_type.ptyp_attributes then Prim_poly else rmode in - let sort_res = - type_sort_external ~why:External_result env core_type.ptyp_loc ty + let repr_res = + make_native_repr + env core_type ty ~global_repr + ~is_layout_poly ~why:External_result in - ([], (rmode, make_native_repr env core_type sort_res ty ~global_repr)) + ([], (rmode, repr_res)) let check_unboxable env loc ty = let rec check_type acc ty : Path.Set.t = @@ -2257,22 +2828,121 @@ let check_unboxable env loc ty = all_unboxable_types () +let has_ty_var_with_layout_any env ty = + List.exists + (fun ty -> Jkind.has_layout_any (Ctype.estimate_type_jkind env ty)) + (Ctype.free_variables ty) + +let unexpected_layout_any_check prim env cty ty = + if Primitive.prim_can_contain_layout_any prim || + prim.prim_is_layout_poly then () + else + if has_ty_var_with_layout_any env ty then + raise(Error (cty.ctyp_loc, + Unexpected_layout_any_in_primitive(prim.prim_name))) + +(* Note regarding jkind checks on external declarations + + There are currently three checks in place: + + 1. The argument/return types of an external can't have jkind [any]. This is + enforced by [type_sort_external]. + + The situation becomes trickier with the use of [@layout_poly]: + + 1. we allow argument/return to have jkind [any] iff it's the layout + polymorphic type variable. + 2. we use [Repr_poly] to encode it and we mark the primitive as + [prim_is_layout_poly] + 3. all interactions with the declared primitive type have to go through + [instance_prim], which instances the layout polymorphic type variable + down from jkind [any] to a sort. + + The result is that we maintain the facade that all argument/return types + are representable. The jkind [any] from [@layout_poly] doesn't leak out. + + 2. [Primitive.prim_has_valid_reprs] performs an additional sanity check on + built-in primitives regarding argument/result representations. It only + allows a selected subset of primitives to have non-value jkinds. And for + that subset, it checks to see the argument/return jkinds are what it + expects. + + See comment in [prim_has_valid_reprs] about what it could miss. + + 3. Built-in primitives that inspect the jkind of type parameters cannot have + type variables with jkind [any] anywhere within their types. + + This check is here to prevent someone from writing: + + [external len : ('a : any). 'a array -> int = "%array_length"] + + If this is accepted, [len] will behave as expected most of the time until + someone writes: + + [let f x = len x] + + [x] here will have type ['a array] where the jkind of ['a] is [any]. The + array kind function in [typeopt] will look at ['a] expecting it to be + representable and fail. This produces a bad error message that doesn't + point to the source of the mistake which is, in fact, the external + declaration. + + For this reason, we have [unexpected_layout_any_check]. It's here to + point out this type of mistake early and suggest the use of + [@layout_poly]. + + An exception is raised if any of these checks fails. *) +let error_if_containing_unexpected_jkind prim env cty ty = + Primitive.prim_has_valid_reprs ~loc:cty.ctyp_loc prim; + unexpected_layout_any_check prim env cty ty + (* Translate a value declaration *) let transl_value_decl env loc valdecl = let cty = Typetexp.transl_type_scheme env valdecl.pval_type in + let modalities = + valdecl.pval_modalities + |> Typemode.transl_modalities ~maturity:Alpha + ~has_mutable_implied_modalities:false + |> Mode.Modality.Value.of_const + in (* CR layouts v5: relax this to check for representability. *) begin match Ctype.constrain_type_jkind env cty.ctyp_type - (Jkind.value ~why:Structure_element) with + (Jkind.Primitive.value_or_null ~why:Structure_element) with | Ok () -> () | Error err -> - raise(Error(cty.ctyp_loc, Non_value_in_sig(err, valdecl.pval_name.txt))) + raise(Error(cty.ctyp_loc, Non_value_in_sig(err,valdecl.pval_name.txt,cty.ctyp_type))) end; let ty = cty.ctyp_type in let v = match valdecl.pval_prim with [] when Env.is_in_signature env -> + let default_arity = + let rec count_arrows n ty = + match get_desc ty with + | Tarrow (_, _, t2, _) -> count_arrows (n+1) t2 + | _ -> n + in + count_arrows 0 ty + in + let zero_alloc = + Builtin_attributes.get_zero_alloc_attribute ~in_signature:true + ~default_arity valdecl.pval_attributes + in + let zero_alloc = + match zero_alloc with + | Default_zero_alloc -> Zero_alloc.default + | Check za -> + if default_arity = 0 && za.arity <= 0 then + raise (Error(valdecl.pval_loc, Zero_alloc_attr_non_function)); + if za.arity <= 0 then + raise (Error(valdecl.pval_loc, Zero_alloc_attr_bad_user_arity)); + Zero_alloc.create_const zero_alloc + | Assume _ | Ignore_assert_all -> + raise (Error(valdecl.pval_loc, Zero_alloc_attr_unsupported zero_alloc)) + in { val_type = ty; val_kind = Val_reg; Types.val_loc = loc; - val_attributes = valdecl.pval_attributes; + val_attributes = valdecl.pval_attributes; val_modalities = modalities; + val_zero_alloc = zero_alloc; val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); } | [] -> @@ -2285,14 +2955,23 @@ let transl_value_decl env loc valdecl = | Native_repr_attr_present repr -> Some repr | Native_repr_attr_absent -> None in + let is_layout_poly = + Builtin_attributes.has_layout_poly valdecl.pval_attributes + in + if is_layout_poly && + not (has_ty_var_with_layout_any env ty) then + raise(Error(valdecl.pval_type.ptyp_loc, Useless_layout_poly)); let native_repr_args, native_repr_res = - parse_native_repr_attributes env valdecl.pval_type ty Prim_global ~global_repr + parse_native_repr_attributes + env valdecl.pval_type ty Prim_global ~global_repr ~is_layout_poly in let prim = Primitive.parse_declaration valdecl ~native_repr_args ~native_repr_res + ~is_layout_poly in + error_if_containing_unexpected_jkind prim env cty ty; if prim.prim_arity = 0 && (prim.prim_name = "" || prim.prim_name.[0] <> '%') then raise(Error(valdecl.pval_type.ptyp_loc, Null_arity_external)); @@ -2302,14 +2981,16 @@ let transl_value_decl env loc valdecl = then raise(Error(valdecl.pval_type.ptyp_loc, Missing_native_external)); check_unboxable env loc ty; { val_type = ty; val_kind = Val_prim prim; Types.val_loc = loc; - val_attributes = valdecl.pval_attributes; + val_attributes = valdecl.pval_attributes; val_modalities = modalities; + val_zero_alloc = Zero_alloc.default; val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); } in let (id, newenv) = - Env.enter_value valdecl.pval_name.txt v env + Env.enter_value ~mode:Mode.Value.legacy valdecl.pval_name.txt v env ~check:(fun s -> Warnings.Unused_value_declaration s) in + Ctype.check_and_update_generalized_ty_jkind ~name:id ~loc ty; let desc = { val_id = id; @@ -2353,10 +3034,10 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env let constraints = List.map (fun (ty, ty', loc) -> let cty = - transl_simple_type env ~closed:false Mode.Alloc.Const.legacy ty + transl_simple_type ~new_var_jkind:Any env ~closed:false Mode.Alloc.Const.legacy ty in let cty' = - transl_simple_type env ~closed:false Mode.Alloc.Const.legacy ty' + transl_simple_type ~new_var_jkind:Sort env ~closed:false Mode.Alloc.Const.legacy ty' in (* Note: We delay the unification of those constraints after the unification of parameters, so that clashing @@ -2367,12 +3048,12 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env in let no_row = not (is_fixed_type sdecl) in let (tman, man) = match sdecl.ptype_manifest with - None -> None, None + None -> Misc.fatal_error "Typedecl.transl_with_constraint: no manifest" | Some sty -> let cty = - transl_simple_type env ~closed:no_row Mode.Alloc.Const.legacy sty + transl_simple_type ~new_var_jkind:Any env ~closed:no_row Mode.Alloc.Const.legacy sty in - Some cty, Some cty.ctyp_type + cty, cty.ctyp_type in (* In the second part, we check the consistency between the two declarations and compute a "merged" declaration; we now need to @@ -2405,25 +3086,23 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env if arity_ok && not sig_decl_abstract && sdecl.ptype_private = Private then Location.deprecated loc "spurious use of private"; - let type_kind, type_unboxed_default, type_jkind = - (* Here, `man = None` indicates we have a "fake" with constraint built by - [Typetexp.create_package_mty] for a package type. *) - if arity_ok && man <> None then - sig_decl.type_kind, sig_decl.type_unboxed_default, sig_decl.type_jkind + let type_kind, type_unboxed_default, type_jkind, type_jkind_annotation = + if arity_ok then + sig_decl.type_kind, + sig_decl.type_unboxed_default, + sig_decl.type_jkind, + sig_decl.type_jkind_annotation else - (* CR layouts: this is a gross hack. See the comments in the - [Ptyp_package] case of [Typetexp.transl_type_aux]. *) - let jkind = Jkind.value ~why:Package_hack in - (* Jkind.(of_attributes ~default:value sdecl.ptype_attributes) *) - Type_abstract Abstract_def, false, jkind + Type_abstract Abstract_def, false, sig_decl.type_jkind, None in let new_sig_decl = { type_params = params; type_arity = arity; type_kind; type_jkind; + type_jkind_annotation; type_private = priv; - type_manifest = man; + type_manifest = Some man; type_variance = []; type_separability = Types.Separability.default_signature ~arity; type_is_newtype = false; @@ -2432,6 +3111,7 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env type_attributes = sdecl.ptype_attributes; type_unboxed_default; type_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); + type_has_illegal_crossings = false; } in Option.iter (fun p -> set_private_row env sdecl.ptype_loc p new_sig_decl) @@ -2460,6 +3140,7 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env type_arity = new_sig_decl.type_arity; type_kind = new_sig_decl.type_kind; type_jkind = new_sig_decl.type_jkind; + type_jkind_annotation = new_sig_decl.type_jkind_annotation; type_private = new_sig_decl.type_private; type_manifest = new_sig_decl.type_manifest; type_unboxed_default = new_sig_decl.type_unboxed_default; @@ -2471,6 +3152,7 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env type_variance = new_type_variance; type_separability = new_type_separability; + type_has_illegal_crossings = false; } in { typ_id = id; @@ -2479,17 +3161,43 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env typ_type = new_sig_decl; typ_cstrs = constraints; typ_loc = loc; - typ_manifest = tman; + typ_manifest = Some tman; typ_kind = Ttype_abstract; typ_private = sdecl.ptype_private; typ_attributes = sdecl.ptype_attributes; + typ_jkind_annotation = Option.map snd type_jkind_annotation; } end ~post:(fun ttyp -> generalize_decl ttyp.typ_type) +(* A simplified version of [transl_with_constraint], for the case of packages. + Package constraints are much simpler than normal with type constraints (e.g., + they can not have parameters and can only update abstract types.) *) +let transl_package_constraint ~loc ty = + { type_params = []; + type_arity = 0; + type_kind = Type_abstract Abstract_def; + type_jkind = Jkind.Primitive.any ~why:Dummy_jkind; + (* There is no reason to calculate an accurate jkind here. This typedecl + will be thrown away once it is used for the package constraint inclusion + check, and that check will expand the manifest as needed. *) + type_jkind_annotation = None; + type_private = Public; + type_manifest = Some ty; + type_variance = []; + type_separability = []; + type_is_newtype = false; + type_expansion_scope = Btype.lowest_level; + type_loc = loc; + type_attributes = []; + type_unboxed_default = false; + type_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); + type_has_illegal_crossings = false; + } + (* Approximate a type declaration: just make all types abstract *) -let abstract_type_decl ~injective jkind params = +let abstract_type_decl ~injective ~jkind ~jkind_annotation ~params = let arity = List.length params in Ctype.with_local_level ~post:generalize_decl begin fun () -> let params = List.map Ctype.newvar params in @@ -2497,6 +3205,7 @@ let abstract_type_decl ~injective jkind params = type_arity = arity; type_kind = Type_abstract Abstract_def; type_jkind = jkind; + type_jkind_annotation = jkind_annotation; type_private = Public; type_manifest = None; type_variance = Variance.unknown_signature ~injective ~arity; @@ -2507,6 +3216,7 @@ let abstract_type_decl ~injective jkind params = type_attributes = []; type_unboxed_default = false; type_uid = Uid.internal_not_actually_unique; + type_has_illegal_crossings = false; } end @@ -2517,19 +3227,17 @@ let approx_type_decl sdecl_list = let id = Ident.create_scoped ~scope sdecl.ptype_name.txt in let path = Path.Pident id in let injective = sdecl.ptype_kind <> Ptype_abstract in - let jkind = - (* We set legacy_immediate to true because you were already allowed - to write [@@immediate] on declarations. *) - jkind_of_attributes_default ~legacy_immediate:true + let jkind, jkind_annotation, _sdecl_attributes = + Jkind.of_type_decl_default ~context:(Type_declaration path) - ~default:(Jkind.value ~why:Default_type_jkind) - sdecl.ptype_attributes + ~default:(Jkind.Primitive.value ~why:Default_type_jkind) + sdecl in let params = List.map (fun (param, _) -> get_type_param_jkind path param) sdecl.ptype_params in - (id, abstract_type_decl ~injective jkind params)) + (id, abstract_type_decl ~injective ~jkind ~jkind_annotation ~params)) sdecl_list (* Check the well-formedness conditions on type abbreviations defined @@ -2582,7 +3290,7 @@ let explain_unbound_single ppf tv ty = (fun (_l,f) -> match row_field_repr f with Rpresent (Some t) -> t | Reither (_,[t],_) -> t - | Reither (_,tl,_) -> Btype.newgenty (Ttuple tl) + | Reither (_,tl,_) -> Btype.newgenty (Ttuple (List.map (fun e -> None, e) tl)) | _ -> Btype.newgenty (Ttuple[])) "case" (fun (lab,_) -> "`" ^ lab ^ " of ") | _ -> trivial ty @@ -2632,6 +3340,26 @@ module Reaching_path = struct pp path end +let report_jkind_mismatch_due_to_bad_inference ppf ty violation loc = + let loc = + match loc with + | Check_constraints -> + "final type declaration consistency check" + | Delayed_checks -> + "checking consistency of mutually recursive groups" + in + fprintf ppf + "@[Layout mismatch in %s.@ \ + This is most often caused by the fact that type inference is not@ \ + clever enough to propagate layouts through variables in different@ \ + declarations. It is also not clever enough to produce a good error@ \ + message, so we'll say this instead:@;<1 2>@[%a@]@ \ + A good next step is to add a layout annotation on a parameter to@ \ + the declaration where this error is reported.@]" + loc + (Jkind.Violation.report_with_offender + ~offender:(fun ppf -> Printtyp.type_expr ppf ty)) violation + let report_error ppf = function | Repeated_parameter -> fprintf ppf "A type parameter occurs several times" @@ -2671,15 +3399,31 @@ let report_error ppf = function "the original" "this" "definition" env) err | Constraint_failed (env, err) -> + let get_jkind_error : _ Errortrace.elt -> _ = function + | Bad_jkind (ty, violation) | Bad_jkind_sort (ty, violation) -> + Some (ty, violation) + | Unequal_var_jkinds_with_no_history + | Unequal_var_jkinds _ | Diff _ | Variant _ | Obj _ + | Escape _ | Incompatible_fields _ | Rec_occur _ -> None + in + begin match List.find_map get_jkind_error err.trace with + | Some (ty, violation) -> + report_jkind_mismatch_due_to_bad_inference ppf ty violation + Check_constraints + | None -> fprintf ppf "@[Constraints are not satisfied in this type.@ "; Printtyp.report_unification_error ppf env err (fun ppf -> fprintf ppf "Type") (fun ppf -> fprintf ppf "should be an instance of"); fprintf ppf "@]" + end + | Jkind_mismatch_due_to_bad_inference (ty, violation, loc) -> + report_jkind_mismatch_due_to_bad_inference ppf ty violation loc | Non_regular { definition; used_as; defined_as; reaching_path } -> let reaching_path = Reaching_path.simplify reaching_path in Printtyp.prepare_for_printing [used_as; defined_as]; Reaching_path.add_to_preparation reaching_path; + Printtyp.Naming_context.reset (); fprintf ppf "@[This recursive type is not regular.@ \ The type constructor %s is defined as@;<1 2>type %a@ \ @@ -2718,9 +3462,9 @@ let report_error ppf = function begin match decl.type_kind, decl.type_manifest with | Type_variant (tl, _rep), _ -> explain_unbound_gen ppf ty tl (fun c -> - let tl = tys_of_constr_args c.Types.cd_args in - Btype.newgenty (Ttuple tl) - ) + let tl = tys_of_constr_args c.Types.cd_args in + Btype.newgenty (Ttuple (List.map (fun t -> None, t) tl)) + ) "case" (fun ppf c -> fprintf ppf "%a of %a" Printtyp.ident c.Types.cd_id @@ -2785,6 +3529,7 @@ let report_error ppf = function (match n with | Variance_variable_error { error; variable; context } -> Printtyp.prepare_for_printing [ variable ]; + Printtyp.Naming_context.reset (); begin match context with | Type_declaration (id, decl) -> Printtyp.add_type_declaration_to_preparation id decl; @@ -2847,7 +3592,8 @@ let report_error ppf = function fprintf ppf "Too many [@@unboxed]/[@@untagged] attributes" | Cannot_unbox_or_untag_type Unboxed -> fprintf ppf "@[Don't know how to unbox this type.@ \ - Only float, int32, int64, nativeint, and vector primitives can be unboxed.@]" + Only float, int32, int64, nativeint, vector primitives, and@ \ + concrete unboxed types can be marked unboxed.@]" | Cannot_unbox_or_untag_type Untagged -> fprintf ppf "@[Don't know how to untag this type.@ \ Only int can be untagged.@]" @@ -2860,41 +3606,102 @@ let report_error ppf = function | Jkind_mismatch_of_path (dpath,v) -> (* the type is always printed just above, so print out just the head of the path instead of something like [t/3] *) - let offender ppf = fprintf ppf "Type %s" (Ident.name (Path.head dpath)) in + let offender ppf = fprintf ppf "type %s" (Ident.name (Path.head dpath)) in Jkind.Violation.report_with_offender ~offender ppf v | Jkind_mismatch_of_type (ty,v) -> - let offender ppf = fprintf ppf "Type %a" Printtyp.type_expr ty in + let offender ppf = fprintf ppf "type %a" Printtyp.type_expr ty in Jkind.Violation.report_with_offender ~offender ppf v | Jkind_sort {kloc; typ; err} -> let s = match kloc with - | Cstr_tuple -> "Constructor argument" - | Record -> "Record element" - | External -> "External" + | Mixed_product -> "Structures with non-value elements" + | Cstr_tuple _ -> "Constructor argument types" + | Inlined_record { unboxed = false } + | Record { unboxed = false } -> "Record element types" + | Inlined_record { unboxed = true } + | Record { unboxed = true } -> "Unboxed record element types" + | External -> "Types in an external" + | External_with_layout_poly -> "Types in an external" in - fprintf ppf "@[%s types must have a representable layout.@ \ %a@]" s + let extra = + match kloc with + | Mixed_product + | Cstr_tuple _ | Record _ | Inlined_record _ | External -> dprintf "" + | External_with_layout_poly -> dprintf + "@ (locally-scoped type variables with layout 'any' are@ \ + made representable by [@@layout_poly])" + in + fprintf ppf "@[%s must have a representable layout%t.@ %a@]" s + extra (Jkind.Violation.report_with_offender ~offender:(fun ppf -> Printtyp.type_expr ppf typ)) err | Jkind_empty_record -> fprintf ppf "@[Records must contain at least one runtime value.@]" - | Non_value_in_sig (err, val_name) -> + | Non_value_in_sig (err, val_name, ty) -> + let offender ppf = fprintf ppf "type %a" Printtyp.type_expr ty in fprintf ppf "@[This type signature for %s is not a value type.@ %a@]" - val_name (Jkind.Violation.report_with_name ~name:val_name) err - | Float64_in_block (typ, lloc) -> + val_name (Jkind.Violation.report_with_offender ~offender) err + | Invalid_jkind_in_block (typ, sort_const, lloc) -> let struct_desc = match lloc with - | Cstr_tuple -> "Variants" - | Record -> "Unboxed records" - (* [Record] always means unboxed record here, because illegal boxed records - get rejected with the [Mixed_block] error instead. *) - | External -> assert false + | Mixed_product -> "Structures with non-value elements" + | Inlined_record { unboxed = false } -> "Inlined records" + | Inlined_record { unboxed = true } -> "Unboxed inlined records" + | Record { unboxed = false } -> "Records" + | Record { unboxed = true }-> "Unboxed records" + | Cstr_tuple { unboxed = false } -> "Variants" + | Cstr_tuple { unboxed = true } -> "Unboxed variants" + | External | External_with_layout_poly -> assert false in fprintf ppf - "@[Type %a has layout float64.@ %s may not yet contain types of this layout.@]" - Printtyp.type_expr typ struct_desc - | Mixed_block -> - fprintf ppf - "@[Records may not contain both unboxed floats and normal values.@]" + "@[Type %a has layout %a.@ %s may not yet contain types of this layout.@]" + Printtyp.type_expr typ Jkind.Sort.Const.format sort_const struct_desc + | Illegal_mixed_product error -> begin + match error with + | Flat_field_expected { boxed_lbl; non_value_lbl } -> + fprintf ppf + "@[Expected all flat fields after non-value field, %s,@]@,@ \ + @[but found boxed field, %s.@]" + (Ident.name non_value_lbl) + (Ident.name boxed_lbl) + | Flat_constructor_arg_expected { boxed_arg; non_value_arg } -> + fprintf ppf + "@[Expected all flat constructor arguments after non-value \ + argument, %a,@]@,@ @[but found boxed argument, %a.@]" + Printtyp.type_expr non_value_arg + Printtyp.type_expr boxed_arg + | Runtime_support_not_enabled mixed_product_kind -> + fprintf ppf + "@[This OCaml runtime doesn't support mixed %s.@]" + (Mixed_product_kind.to_plural_string mixed_product_kind) + | Extension_constructor -> + fprintf ppf + "@[Extensible types can't have fields of unboxed type. Consider \ + wrapping the unboxed fields in a record.@]" + | Value_prefix_too_long + { value_prefix_len; max_value_prefix_len; mixed_product_kind } -> + fprintf ppf + "@[Mixed %s may contain at most %d value fields prior to the\ + \ flat suffix, but this one contains %d.@]" + (Mixed_product_kind.to_plural_string mixed_product_kind) + max_value_prefix_len value_prefix_len + | Insufficient_level { required_layouts_level; mixed_product_kind } -> ( + let hint ppf = + Format.fprintf ppf "You must enable -extension %s to use this feature." + (Language_extension.to_command_line_string Layouts + required_layouts_level) + in + match Language_extension.is_enabled Layouts with + | false -> + fprintf ppf + "@[The appropriate layouts extension is not enabled.@;%t@]" hint + | true -> + fprintf ppf + "@[The enabled layouts extension does not allow for mixed %s.@;\ + %t@]" + (Mixed_product_kind.to_plural_string mixed_product_kind) + hint) + end | Bad_unboxed_attribute msg -> fprintf ppf "@[This type cannot be unboxed because@ %s.@]" msg | Separability (Typedecl_separability.Non_separable_evar evar) -> @@ -2903,7 +3710,7 @@ let report_error ppf = function fprintf ppf "an unnamed existential variable" | Some str -> fprintf ppf "the existential variable %a" - Printast.tyvar str in + Pprintast.tyvar str in fprintf ppf "@[This type cannot be unboxed because@ \ it might contain both float and non-float values,@ \ depending on the instantiation of %a.@ \ @@ -2926,11 +3733,33 @@ let report_error ppf = function | Local_not_enabled -> fprintf ppf "@[The local extension is disabled@ \ To enable it, pass the '-extension local' flag@]" - | Layout_not_enabled c -> + | Unexpected_layout_any_in_primitive name -> fprintf ppf - "@[Layout %s is used here, but the appropriate layouts extension is \ - not enabled@]" - (Jkind.string_of_const c) + "@[The primitive [%s] doesn't work well with type variables of@ \ + layout any. Consider using [@@layout_poly].@]" name + | Useless_layout_poly -> + fprintf ppf + "@[[@@layout_poly] on this external declaration has no@ \ + effect. Consider removing it or adding a type@ \ + variable for it to operate on.@]" + | Zero_alloc_attr_unsupported ca -> + let variety = match ca with + | Default_zero_alloc | Check _ -> assert false + | Assume _ -> "assume" + | Ignore_assert_all -> "ignore" + in + fprintf ppf + "@[zero_alloc \"%s\" attributes are not supported in signatures@]" + variety + | Zero_alloc_attr_non_function -> + fprintf ppf + "@[In signatures, zero_alloc is only supported on function declarations.\ + @ Found no arrows in this declaration's type.\ + @ Hint: You can write \"[@zero_alloc arity n]\" to specify the arity\ + @ of an alias (for n > 0).@]" + | Zero_alloc_attr_bad_user_arity -> + fprintf ppf + "@[Invalid zero_alloc attribute: arity must be greater than 0.@]" let () = Location.register_error_of_exn diff --git a/typing/typedecl.mli b/typing/typedecl.mli index 9d8a488b771..a3a30442ad5 100644 --- a/typing/typedecl.mli +++ b/typing/typedecl.mli @@ -20,19 +20,19 @@ open Format val transl_type_decl: Env.t -> Asttypes.rec_flag -> Parsetree.type_declaration list -> - Typedtree.type_declaration list * Env.t + Typedtree.type_declaration list * Env.t * Shape.t list val transl_exception: Env.t -> Parsetree.extension_constructor -> - Typedtree.extension_constructor * Env.t + Typedtree.extension_constructor * Env.t * Shape.t val transl_type_exception: Env.t -> - Parsetree.type_exception -> Typedtree.type_exception * Env.t + Parsetree.type_exception -> Typedtree.type_exception * Env.t * Shape.t val transl_type_extension: bool -> Env.t -> Location.t -> Parsetree.type_extension -> - Typedtree.type_extension * Env.t + Typedtree.type_extension * Env.t * Shape.t list val transl_value_decl: Env.t -> Location.t -> @@ -46,8 +46,18 @@ val transl_with_constraint: outer_env:Env.t -> Parsetree.type_declaration -> Typedtree.type_declaration +val transl_package_constraint: + loc:Location.t -> type_expr -> Types.type_declaration + val abstract_type_decl: - injective:bool -> Jkind.t -> Jkind.t list -> type_declaration + injective:bool -> + jkind:Jkind.t -> + (* [jkind_annotation] is what the user wrote, and is just used when printing + the type produced by this function. *) + jkind_annotation:Jkind.annotation option -> + params:Jkind.t list -> + type_declaration + val approx_type_decl: Parsetree.type_declaration list -> (Ident.t * type_declaration) list val check_recmod_typedecl: @@ -64,13 +74,51 @@ val is_fixed_type : Parsetree.type_declaration -> bool type native_repr_kind = Unboxed | Untagged (* Records reason for a jkind representability requirement in errors. *) -type jkind_sort_loc = Cstr_tuple | Record | External +type jkind_sort_loc = + | Cstr_tuple of { unboxed : bool } + | Record of { unboxed : bool } + | Inlined_record of { unboxed : bool } + | Mixed_product + | External + | External_with_layout_poly type reaching_type_path = reaching_type_step list and reaching_type_step = | Expands_to of type_expr * type_expr | Contains of type_expr * type_expr +module Mixed_product_kind : sig + type t = + | Record + | Cstr_tuple + | Cstr_record +end + +type mixed_product_violation = + | Runtime_support_not_enabled of Mixed_product_kind.t + | Extension_constructor + | Value_prefix_too_long of + { value_prefix_len : int; + max_value_prefix_len : int; + mixed_product_kind : Mixed_product_kind.t; + } + | Flat_field_expected of + { boxed_lbl : Ident.t; + non_value_lbl : Ident.t; + } + | Flat_constructor_arg_expected of + { boxed_arg : type_expr; + non_value_arg : type_expr; + } + | Insufficient_level of + { required_layouts_level : Language_extension.maturity; + mixed_product_kind : Mixed_product_kind.t; + } + +type bad_jkind_inference_location = + | Check_constraints + | Delayed_checks + type error = Repeated_parameter | Duplicate_constructor of string @@ -107,22 +155,28 @@ type error = | Deep_unbox_or_untag_attribute of native_repr_kind | Jkind_mismatch_of_type of type_expr * Jkind.Violation.t | Jkind_mismatch_of_path of Path.t * Jkind.Violation.t + | Jkind_mismatch_due_to_bad_inference of + type_expr * Jkind.Violation.t * bad_jkind_inference_location | Jkind_sort of { kloc : jkind_sort_loc ; typ : type_expr ; err : Jkind.Violation.t } | Jkind_empty_record - | Non_value_in_sig of Jkind.Violation.t * string - | Float64_in_block of type_expr * jkind_sort_loc - | Mixed_block + | Non_value_in_sig of Jkind.Violation.t * string * type_expr + | Invalid_jkind_in_block of type_expr * Jkind.Sort.const * jkind_sort_loc + | Illegal_mixed_product of mixed_product_violation | Separability of Typedecl_separability.error | Bad_unboxed_attribute of string | Boxed_and_unboxed | Nonrec_gadt | Invalid_private_row_declaration of type_expr | Local_not_enabled - | Layout_not_enabled of Jkind.const + | Unexpected_layout_any_in_primitive of string + | Useless_layout_poly + | Zero_alloc_attr_unsupported of Builtin_attributes.zero_alloc_attribute + | Zero_alloc_attr_non_function + | Zero_alloc_attr_bad_user_arity exception Error of Location.t * error diff --git a/typing/typedecl_separability.ml b/typing/typedecl_separability.ml index 56c357e9b8a..dcbaf793c84 100644 --- a/typing/typedecl_separability.ml +++ b/typing/typedecl_separability.ml @@ -130,7 +130,7 @@ let rec immediate_subtypes : type_expr -> type_expr list = fun ty -> on which immediate_subtypes is called from [check_type] *) | Tarrow(_,ty1,ty2,_) -> [ty1; ty2] - | Ttuple(tys) -> tys + | Ttuple(tys) -> List.map snd tys | Tpackage(_, fl) -> (snd (List.split fl)) | Tobject(row,class_ty) -> let class_subtys = @@ -480,9 +480,9 @@ let msig_of_external_type env decl = let check_jkind = Ctype.check_decl_jkind env decl in - if Result.is_error (check_jkind (Jkind.value ~why:Separability_check)) + if Result.is_error (check_jkind (Jkind.Primitive.value_or_null ~why:Separability_check)) || Result.is_ok - (check_jkind (Jkind.immediate64 ~why:Separability_check)) + (check_jkind (Jkind.Primitive.immediate64 ~why:Separability_check)) then best_msig decl else worst_msig decl diff --git a/typing/typedecl_variance.ml b/typing/typedecl_variance.ml index c336911b899..6d4aeb6d71c 100644 --- a/typing/typedecl_variance.ml +++ b/typing/typedecl_variance.ml @@ -65,7 +65,7 @@ let compute_variance env visited vari ty = compute_variance_rec (Variance.conjugate vari) ty1; compute_same ty2 | Ttuple tl -> - List.iter compute_same tl + List.iter (fun (_,t) -> compute_same t) tl | Tconstr (path, tl, _) -> let open Variance in if tl = [] then () else begin @@ -174,7 +174,7 @@ let compute_variance_type env ~check (required, loc) decl tyl = (c,n,i))))) params required; (* Check propagation from constrained parameters *) - let args = Btype.newgenty (Ttuple params) in + let args = Btype.newgenty (Ttuple (List.map (fun t -> None, t) params)) in let fvl = Ctype.free_variables args in let fvl = List.filter (fun v -> not (List.exists (eq_type v) params)) fvl in @@ -253,10 +253,11 @@ let constrained vars ty = | _ -> true let for_constr = function - | Types.Cstr_tuple l -> List.map (fun (ty,_) -> false, ty) l + | Types.Cstr_tuple l -> List.map (fun {ca_type; _} -> false, ca_type) l | Types.Cstr_record l -> List.map - (fun {Types.ld_mutable; ld_type} -> (ld_mutable = Mutable, ld_type)) + (fun {Types.ld_mutable; ld_type} -> + (Types.is_mutable ld_mutable, ld_type)) l let compute_variance_gadt env ~check (required, loc as rloc) decl @@ -353,7 +354,7 @@ let compute_variance_decl env ~check decl (required, _ as rloc) = | Type_record (ftl, _) -> compute_variance_type env ~check rloc decl (mn @ List.map (fun {Types.ld_mutable; ld_type} -> - (ld_mutable = Mutable, ld_type)) ftl) + (Types.is_mutable ld_mutable, ld_type)) ftl) in if mn = [] || not abstract then List.map Variance.strengthen vari diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 95a33bca27a..9810efdf1e3 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -16,8 +16,23 @@ (* Abstract syntax tree after typing *) open Asttypes -open Jane_asttypes open Types +open Mode + +type constant = + Const_int of int + | Const_char of char + | Const_string of string * Location.t * string option + | Const_float of string + | Const_float32 of string + | Const_unboxed_float of string + | Const_unboxed_float32 of string + | Const_int32 of int32 + | Const_int64 of int64 + | Const_nativeint of nativeint + | Const_unboxed_int32 of int32 + | Const_unboxed_int64 of int64 + | Const_unboxed_nativeint of nativeint module Uid = Shape.Uid @@ -35,11 +50,17 @@ type _ pattern_category = | Value : value pattern_category | Computation : computation pattern_category -type unique_barrier = Mode.Uniqueness.t option +type unique_barrier = Mode.Uniqueness.r option -type unique_use = Mode.Uniqueness.t * Mode.Linearity.t +type unique_use = Mode.Uniqueness.r * Mode.Linearity.l -let shared_many_use = (Mode.Uniqueness.shared, Mode.Linearity.many) +type texp_field_boxing = + | Boxing of Mode.Alloc.r * unique_use + | Non_boxing of unique_use + +let shared_many_use = + ( Mode.Uniqueness.disallow_left Mode.Uniqueness.shared, + Mode.Linearity.disallow_right Mode.Linearity.many ) type pattern = value general_pattern and 'k general_pattern = 'k pattern_desc pattern_data @@ -62,11 +83,11 @@ and pat_extra = and 'k pattern_desc = (* value patterns *) | Tpat_any : value pattern_desc - | Tpat_var : Ident.t * string loc * Uid.t * Mode.Value.t -> value pattern_desc + | Tpat_var : Ident.t * string loc * Uid.t * Mode.Value.l -> value pattern_desc | Tpat_alias : - value general_pattern * Ident.t * string loc * Uid.t * Mode.Value.t -> value pattern_desc + value general_pattern * Ident.t * string loc * Uid.t * Mode.Value.l -> value pattern_desc | Tpat_constant : constant -> value pattern_desc - | Tpat_tuple : value general_pattern list -> value pattern_desc + | Tpat_tuple : (string option * value general_pattern) list -> value pattern_desc | Tpat_construct : Longident.t loc * constructor_description * value general_pattern list * (Ident.t loc list * core_type) option -> @@ -79,7 +100,7 @@ and 'k pattern_desc = closed_flag -> value pattern_desc | Tpat_array : - mutable_flag * value general_pattern list -> value pattern_desc + mutability * Jkind.sort * value general_pattern list -> value pattern_desc | Tpat_lazy : value general_pattern -> value pattern_desc (* computation patterns *) | Tpat_value : tpat_value_argument -> computation pattern_desc @@ -104,48 +125,51 @@ and exp_extra = | Texp_constraint of core_type | Texp_coerce of core_type option * core_type | Texp_poly of core_type option - | Texp_newtype of string * const_jkind option - + | Texp_newtype of string * Jkind.annotation option + | Texp_mode_coerce of Jane_syntax.Mode_expr.t -and fun_curry_state = - | More_args of { partial_mode : Mode.Alloc.t } - | Final_arg of { partial_mode : Mode.Alloc.t } +and arg_label = Types.arg_label = + | Nolabel + | Labelled of string + | Optional of string + | Position of string and expression_desc = Texp_ident of Path.t * Longident.t loc * Types.value_description * ident_kind * unique_use | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression - | Texp_function of { arg_label : arg_label; param : Ident.t; - cases : value case list; partial : partial; - region : bool; curry : fun_curry_state; - warnings : Warnings.state; - arg_mode : Mode.Alloc.t; - arg_sort : Jkind.sort; - ret_sort : Jkind.sort; - alloc_mode : Mode.Alloc.t } + | Texp_function of + { params : function_param list; + body : function_body; + region : bool; + ret_mode : Mode.Alloc.l; + ret_sort : Jkind.sort; + alloc_mode : Mode.Alloc.r; + zero_alloc : Zero_alloc.t; + } | Texp_apply of expression * (arg_label * apply_arg) list * apply_position * - Mode.Locality.t + Mode.Locality.l * Zero_alloc.assume option | Texp_match of expression * Jkind.sort * computation case list * partial | Texp_try of expression * value case list - | Texp_tuple of expression list * Mode.Alloc.t + | Texp_tuple of (string option * expression) list * Mode.Alloc.r | Texp_construct of - Longident.t loc * constructor_description * expression list * Mode.Alloc.t option - | Texp_variant of label * (expression * Mode.Alloc.t) option + Longident.t loc * constructor_description * expression list * Mode.Alloc.r option + | Texp_variant of label * (expression * Mode.Alloc.r) option | Texp_record of { fields : ( Types.label_description * record_label_definition ) array; representation : Types.record_representation; extended_expression : expression option; - alloc_mode : Mode.Alloc.t option + alloc_mode : Mode.Alloc.r option } | Texp_field of - expression * Longident.t loc * label_description * unique_use * Mode.Alloc.t option + expression * Longident.t loc * label_description * texp_field_boxing | Texp_setfield of - expression * Mode.Locality.t * Longident.t loc * label_description * expression - | Texp_array of mutable_flag * expression list * Mode.Alloc.t + expression * Mode.Locality.l * Longident.t loc * label_description * expression + | Texp_array of mutability * Jkind.Sort.t * expression list * Mode.Alloc.r | Texp_list_comprehension of comprehension - | Texp_array_comprehension of mutable_flag * comprehension + | Texp_array_comprehension of mutability * Jkind.sort * comprehension | Texp_ifthenelse of expression * expression * expression option | Texp_sequence of expression * Jkind.sort * expression | Texp_while of { @@ -184,7 +208,6 @@ and expression_desc = body : value case; body_sort : Jkind.sort; partial : partial; - warnings : Warnings.state; } | Texp_unreachable | Texp_extension_constructor of Longident.t loc * Path.t @@ -192,8 +215,49 @@ and expression_desc = | Texp_probe of { name:string; handler:expression; enabled_at_init:bool; } | Texp_probe_is_enabled of { name:string } | Texp_exclave of expression + | Texp_src_pos + +and function_curry = + | More_args of { partial_mode : Mode.Alloc.l } + | Final_arg + +and function_param = + { + fp_arg_label: arg_label; + fp_param: Ident.t; + fp_partial: partial; + fp_kind: function_param_kind; + fp_sort: Jkind.sort; + fp_mode: Mode.Alloc.l; + fp_curry: function_curry; + fp_newtypes: (string loc * Jkind.annotation option) list; + fp_loc: Location.t; + } + +and function_param_kind = + | Tparam_pat of pattern + | Tparam_optional_default of pattern * expression * Jkind.sort + +and function_body = + | Tfunction_body of expression + | Tfunction_cases of function_cases + +and function_cases = + { fc_cases: value case list; + fc_env : Env.t; + fc_arg_mode: Mode.Alloc.l; + fc_arg_sort: Jkind.sort; + fc_ret_type : Types.type_expr; + fc_partial: partial; + fc_param: Ident.t; + fc_loc: Location.t; + fc_exp_extra: exp_extra option; + fc_attributes: attributes; + } -and ident_kind = Id_value | Id_prim of Mode.Locality.t option +and ident_kind = + | Id_value + | Id_prim of Mode.Locality.l option * Jkind.Sort.t option and meth = | Tmeth_name of string @@ -235,7 +299,7 @@ and 'k case = } and record_label_definition = - | Kept of Types.type_expr * mutable_flag * unique_use + | Kept of Types.type_expr * mutability * unique_use | Overridden of Longident.t loc * expression and binding_op = @@ -255,9 +319,9 @@ and ('a, 'b) arg_or_omitted = | Omitted of 'b and omitted_parameter = - { mode_closure : Mode.Alloc.t; - mode_arg : Mode.Alloc.t; - mode_ret : Mode.Alloc.t; + { mode_closure : Mode.Alloc.r; + mode_arg : Mode.Alloc.l; + mode_ret : Mode.Alloc.l; sort_arg : Jkind.sort } and apply_arg = (expression * Jkind.sort, omitted_parameter) arg_or_omitted @@ -382,6 +446,7 @@ and module_binding = { mb_id: Ident.t option; mb_name: string option loc; + mb_uid: Uid.t; mb_presence: module_presence; mb_expr: module_expr; mb_attributes: attribute list; @@ -392,6 +457,7 @@ and value_binding = { vb_pat: pattern; vb_expr: expression; + vb_rec_kind: Value_rec_types.recursive_binding_kind; vb_sort: Jkind.sort; vb_attributes: attributes; vb_loc: Location.t; @@ -427,7 +493,8 @@ and primitive_coercion = { pc_desc: Primitive.description; pc_type: type_expr; - pc_poly_mode: Mode.Locality.t option; + pc_poly_mode: Mode.Locality.l option; + pc_poly_sort: Jkind.Sort.t option; pc_env: Env.t; pc_loc : Location.t; } @@ -464,6 +531,7 @@ and module_declaration = { md_id: Ident.t option; md_name: string option loc; + md_uid: Uid.t; md_presence: module_presence; md_type: module_type; md_attributes: attribute list; @@ -474,6 +542,7 @@ and module_substitution = { ms_id: Ident.t; ms_name: string loc; + ms_uid: Uid.t; ms_manifest: Path.t; ms_txt: Longident.t loc; ms_attributes: attributes; @@ -484,6 +553,7 @@ and module_type_declaration = { mtd_id: Ident.t; mtd_name: string loc; + mtd_uid: Uid.t; mtd_type: module_type option; mtd_attributes: attribute list; mtd_loc: Location.t; @@ -540,16 +610,17 @@ and core_type = } and core_type_desc = - | Ttyp_var of string option * const_jkind option + | Ttyp_var of string option * Jkind.annotation option | Ttyp_arrow of arg_label * core_type * core_type - | Ttyp_tuple of core_type list + | Ttyp_tuple of (string option * core_type) list | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of object_field list * closed_flag | Ttyp_class of Path.t * Longident.t loc * core_type list - | Ttyp_alias of core_type * string option * const_jkind option + | Ttyp_alias of core_type * string option * Jkind.annotation option | Ttyp_variant of row_field list * closed_flag * label list option - | Ttyp_poly of (string * const_jkind option) list * core_type + | Ttyp_poly of (string * Jkind.annotation option) list * core_type | Ttyp_package of package_type + | Ttyp_call_pos and package_type = { pack_path : Path.t; @@ -599,6 +670,7 @@ and type_declaration = typ_manifest: core_type option; typ_loc: Location.t; typ_attributes: attribute list; + typ_jkind_annotation: Jane_syntax.Jkind.annotation option; } and type_kind = @@ -611,8 +683,9 @@ and label_declaration = { ld_id: Ident.t; ld_name: string loc; - ld_mutable: mutable_flag; - ld_global: global_flag; + ld_uid: Uid.t; + ld_mutable: mutability; + ld_modalities: Modality.Value.Const.t; ld_type: core_type; ld_loc: Location.t; ld_attributes: attribute list; @@ -622,15 +695,23 @@ and constructor_declaration = { cd_id: Ident.t; cd_name: string loc; - cd_vars: (string * const_jkind option) list; + cd_uid: Uid.t; + cd_vars: (string * Jkind.annotation option) list; cd_args: constructor_arguments; cd_res: core_type option; cd_loc: Location.t; cd_attributes: attribute list; } +and constructor_argument = + { + ca_modalities: Modality.Value.Const.t; + ca_type: core_type; + ca_loc: Location.t; + } + and constructor_arguments = - | Cstr_tuple of (core_type * global_flag) list + | Cstr_tuple of constructor_argument list | Cstr_record of label_declaration list and type_extension = @@ -662,7 +743,7 @@ and extension_constructor = } and extension_constructor_kind = - Text_decl of (string * const_jkind option) list * + Text_decl of (string * Jkind.annotation option) list * constructor_arguments * core_type option | Text_rebind of Path.t * Longident.t loc @@ -724,13 +805,32 @@ and 'a class_infos = ci_attributes: attribute list; } +type argument_interface = { + ai_signature: Types.signature; + ai_coercion_from_primary: module_coercion; +} + type implementation = { structure: structure; coercion: module_coercion; signature: Types.signature; + argument_interface: argument_interface option; shape: Shape.t; } +type item_declaration = + | Value of value_description + | Value_binding of value_binding + | Type of type_declaration + | Constructor of constructor_declaration + | Extension_constructor of extension_constructor + | Label of label_declaration + | Module of module_declaration + | Module_substitution of module_substitution + | Module_binding of module_binding + | Module_type of module_type_declaration + | Class of class_declaration + | Class_type of class_type_declaration (* Auxiliary functions over the a.s.t. *) @@ -744,6 +844,12 @@ let as_computation_pattern (p : pattern) : computation general_pattern = pat_attributes = []; } +let function_arity params body = + List.length params + + match body with + | Tfunction_body _ -> 0 + | Tfunction_cases _ -> 1 + let rec classify_pattern_desc : type k . k pattern_desc -> k pattern_category = function | Tpat_alias _ -> Value @@ -777,12 +883,12 @@ let shallow_iter_pattern_desc : type k . pattern_action -> k pattern_desc -> unit = fun f -> function | Tpat_alias(p, _, _, _, _) -> f.f p - | Tpat_tuple patl -> List.iter f.f patl + | Tpat_tuple patl -> List.iter (fun (_, p) -> f.f p) patl | Tpat_construct(_, _, patl, _) -> List.iter f.f patl | Tpat_variant(_, pat, _) -> Option.iter f.f pat | Tpat_record (lbl_pat_list, _) -> List.iter (fun (_, _, pat) -> f.f pat) lbl_pat_list - | Tpat_array (_, patl) -> List.iter f.f patl + | Tpat_array (_, _, patl) -> List.iter f.f patl | Tpat_lazy p -> f.f p | Tpat_any | Tpat_var _ @@ -799,13 +905,13 @@ let shallow_map_pattern_desc | Tpat_alias (p1, id, s, uid, m) -> Tpat_alias (f.f p1, id, s, uid, m) | Tpat_tuple pats -> - Tpat_tuple (List.map f.f pats) + Tpat_tuple (List.map (fun (label, pat) -> label, f.f pat) pats) | Tpat_record (lpats, closed) -> Tpat_record (List.map (fun (lid, l,p) -> lid, l, f.f p) lpats, closed) | Tpat_construct (lid, c, pats, ty) -> Tpat_construct (lid, c, List.map f.f pats, ty) - | Tpat_array (am, pats) -> - Tpat_array (am, List.map f.f pats) + | Tpat_array (am, arg_sort, pats) -> + Tpat_array (am, arg_sort, List.map f.f pats) | Tpat_lazy p1 -> Tpat_lazy (f.f p1) | Tpat_variant (x1, Some p1, x2) -> Tpat_variant (x1, Some (f.f p1), x2) @@ -872,7 +978,7 @@ let rec iter_bound_idents d type full_bound_ident_action = - Ident.t -> string loc -> type_expr -> Uid.t -> Mode.Value.t -> Jkind.sort -> unit + Ident.t -> string loc -> type_expr -> Uid.t -> Mode.Value.l -> Jkind.sort -> unit (* The intent is that the sort should be the sort of the type of the pattern. It's used to avoid computing jkinds from types. `f` then gets passed @@ -911,10 +1017,11 @@ let iter_pattern_full ~both_sides_of_or f sort pat = lbl_pat_list (* Cases where the inner things must be value: *) | Tpat_variant (_, pat, _) -> Option.iter (loop f Jkind.Sort.value) pat - | Tpat_tuple patl -> List.iter (loop f Jkind.Sort.value) patl + | Tpat_tuple patl -> + List.iter (fun (_, pat) -> loop f Jkind.Sort.value pat) patl (* CR layouts v5: tuple case to change when we allow non-values in tuples *) - | Tpat_array (_, patl) -> List.iter (loop f Jkind.Sort.value) patl + | Tpat_array (_, arg_sort, patl) -> List.iter (loop f arg_sort) patl | Tpat_lazy p | Tpat_exception p -> loop f Jkind.Sort.value p (* Cases without variables: *) | Tpat_any | Tpat_constant _ -> () @@ -923,17 +1030,17 @@ let iter_pattern_full ~both_sides_of_or f sort pat = let rev_pat_bound_idents_full sort pat = let idents_full = ref [] in - let add id sloc typ _uid _ sort = - idents_full := (id, sloc, typ, sort) :: !idents_full + let add id sloc typ uid _ sort = + idents_full := (id, sloc, typ, uid, sort) :: !idents_full in iter_pattern_full ~both_sides_of_or:false add sort pat; !idents_full let rev_only_idents idents_full = - List.rev_map (fun (id,_,_,_) -> id) idents_full + List.rev_map (fun (id,_,_,_,_) -> id) idents_full let rev_only_idents_and_types idents_full = - List.rev_map (fun (id,_,ty,_) -> (id,ty)) idents_full + List.rev_map (fun (id,_,ty,_,_) -> (id,ty)) idents_full let pat_bound_idents_full sort pat = List.rev (rev_pat_bound_idents_full sort pat) @@ -951,16 +1058,47 @@ let rev_let_bound_idents_full bindings = List.iter (fun vb -> iter_bound_idents add vb.vb_pat) bindings; !idents_full -let let_bound_idents_with_modes_and_sorts bindings = +let let_bound_idents_with_modes_sorts_and_checks bindings = let modes_and_sorts = Ident.Tbl.create 3 in let f id sloc _ _uid mode sort = Ident.Tbl.add modes_and_sorts id (sloc.loc, mode, sort) in - List.iter (fun vb -> - iter_pattern_full ~both_sides_of_or:true f vb.vb_sort vb.vb_pat) - bindings; + let checks = + List.fold_left (fun checks vb -> + iter_pattern_full ~both_sides_of_or:true f vb.vb_sort vb.vb_pat; + match vb.vb_pat.pat_desc, vb.vb_expr.exp_desc with + | Tpat_var (id, _, _, _), Texp_function fn -> + let zero_alloc = + match Zero_alloc.get fn.zero_alloc with + | Default_zero_alloc -> + (* We fabricate a "Check" attribute if a top-level annotation + specifies that all functions should be checked for zero + alloc. There is no need to update the zero_alloc variable on the + function - if it remains [Default_zero_alloc], translcore adds + the check. *) + let arity = function_arity fn.params fn.body in + if !Clflags.zero_alloc_check_assert_all && arity > 0 then + Zero_alloc.create_const + (Check { strict = false; + arity; + loc = Location.none; + opt = false }) + else + fn.zero_alloc + | Ignore_assert_all | Check _ | Assume _ -> fn.zero_alloc + in + Ident.Map.add id zero_alloc checks + (* CR ccasinghino: To keep the zero-alloc annotation info aliases, it + may be enough to copy it if the vb_expr is an ident. *) + | _ -> checks + ) Ident.Map.empty bindings + in List.rev_map - (fun (id, _, _, _) -> id, List.rev (Ident.Tbl.find_all modes_and_sorts id)) + (fun (id, _, _, _) -> + let zero_alloc = + Option.value (Ident.Map.find_opt id checks) ~default:Zero_alloc.default + in + id, List.rev (Ident.Tbl.find_all modes_and_sorts id), zero_alloc) (rev_let_bound_idents_full bindings) let let_bound_idents_full bindings = @@ -1035,6 +1173,6 @@ let rec exp_is_nominal exp = | Texp_variant (_, None) | Texp_construct (_, _, [], _) -> true - | Texp_field (parent, _, _, _, _) | Texp_send (parent, _, _) -> + | Texp_field (parent, _, _, _) | Texp_send (parent, _, _) -> exp_is_nominal parent | _ -> false diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 74932b0a5f3..5f2fe4ef1f1 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -22,7 +22,26 @@ *) open Asttypes -open Jane_asttypes + +(* We define a new constant type that can represent unboxed values. + This is currently used only in [Typedtree], but the long term goal + is to share this definition with [Lambda] and completely replace the + usage of [Asttypes.constant] *) +type constant = + Const_int of int + | Const_char of char + | Const_string of string * Location.t * string option + | Const_float of string + | Const_float32 of string + | Const_unboxed_float of string + | Const_unboxed_float32 of string + | Const_int32 of int32 + | Const_int64 of int64 + (* CR mshinwell: This should use [Targetint.t] not [nativeint] *) + | Const_nativeint of nativeint + | Const_unboxed_int32 of int32 + | Const_unboxed_int64 of int64 + | Const_unboxed_nativeint of nativeint module Uid = Shape.Uid @@ -49,9 +68,17 @@ type _ pattern_category = projection, and represents the usage of the record immediately after this projection. If it points to unique, that means this projection must be borrowed and cannot be moved *) -type unique_barrier = Mode.Uniqueness.t option +type unique_barrier = Mode.Uniqueness.r option + +type unique_use = Mode.Uniqueness.r * Mode.Linearity.l -type unique_use = Mode.Uniqueness.t * Mode.Linearity.t +type texp_field_boxing = + | Boxing of Mode.Alloc.r * unique_use + (** Projection requires boxing. [unique_use] describes the usage of the + unboxed field as argument to boxing. *) + | Non_boxing of unique_use + (** Projection does not require boxing. [unique_use] describes the usage of + the field as the result of direct projection. *) val shared_many_use : unique_use @@ -91,16 +118,18 @@ and 'k pattern_desc = (* value patterns *) | Tpat_any : value pattern_desc (** _ *) - | Tpat_var : Ident.t * string loc * Uid.t * Mode.Value.t -> value pattern_desc + | Tpat_var : Ident.t * string loc * Uid.t * Mode.Value.l -> value pattern_desc (** x *) | Tpat_alias : - value general_pattern * Ident.t * string loc * Uid.t * Mode.Value.t + value general_pattern * Ident.t * string loc * Uid.t * Mode.Value.l -> value pattern_desc (** P as a *) | Tpat_constant : constant -> value pattern_desc (** 1, 'a', "true", 1.0, 1l, 1L, 1n *) - | Tpat_tuple : value general_pattern list -> value pattern_desc - (** (P1, ..., Pn) + | Tpat_tuple : (string option * value general_pattern) list -> value pattern_desc + (** (P1, ..., Pn) [(None,P1); ...; (None,Pn)]) + (L1:P1, ... Ln:Pn) [(Some L1,P1); ...; (Some Ln,Pn)]) + Any mix, e.g. (L1:P1, P2) [(Some L1,P1); ...; (None,P2)]) Invariant: n >= 2 *) @@ -134,7 +163,7 @@ and 'k pattern_desc = Invariant: n > 0 *) | Tpat_array : - mutable_flag * value general_pattern list -> value pattern_desc + Types.mutability * Jkind.sort * value general_pattern list -> value pattern_desc (** [| P1; ...; Pn |] (flag = Mutable) [: P1; ...; Pn :] (flag = Immutable) *) | Tpat_lazy : value general_pattern -> value pattern_desc @@ -186,18 +215,20 @@ and exp_extra = *) | Texp_poly of core_type option (** Used for method bodies. *) - | Texp_newtype of string * const_jkind option + | Texp_newtype of string * Jkind.annotation option (** fun (type t : immediate) -> *) + | Texp_mode_coerce of Jane_syntax.Mode_expr.t + (** local_ E *) + +(* CR modes: Consider fusing [Texp_mode_coerce] and [Texp_constraint] when + the syntax changes. +*) -and fun_curry_state = - | More_args of { partial_mode : Mode.Alloc.t } - (** [partial_mode] is the mode of the resulting closure - if this function is partially applied *) - | Final_arg of { partial_mode : Mode.Alloc.t } - (** [partial_mode] is relevant for the final arg only - because of an optimisation that Simplif does to merge - functions, which might result in this arg no longer being - final *) +and arg_label = Types.arg_label = + | Nolabel + | Labelled of string + | Optional of string + | Position of string (** Jkinds in the typed tree: Compilation of the typed tree to lambda sometimes requires jkind information. Our approach is to @@ -225,28 +256,31 @@ and expression_desc = (** let P1 = E1 and ... and Pn = EN in E (flag = Nonrecursive) let rec P1 = E1 and ... and Pn = EN in E (flag = Recursive) *) - | Texp_function of { arg_label : arg_label; param : Ident.t; - cases : value case list; partial : partial; - region : bool; curry : fun_curry_state; - warnings : Warnings.state; - arg_mode : Mode.Alloc.t; - arg_sort : Jkind.sort; - ret_sort : Jkind.sort; - alloc_mode : Mode.Alloc.t} - (** [Pexp_fun] and [Pexp_function] both translate to [Texp_function]. - See {!Parsetree} for more details. - - [param] is the identifier that is to be used to name the - parameter of the function. - - partial = - [Partial] if the pattern match is partial - [Total] otherwise. - - partial_mode is the mode of the resulting closure if this function - is partially applied to a single argument. - *) - | Texp_apply of expression * (arg_label * apply_arg) list * apply_position * Mode.Locality.t + | Texp_function of + { params : function_param list; + body : function_body; + region : bool; + ret_mode : Mode.Alloc.l; + (* Mode where the function allocates, ie local for a function of + type 'a -> local_ 'b, and heap for a function of type 'a -> 'b *) + ret_sort : Jkind.sort; + alloc_mode : Mode.Alloc.r; + (* Mode at which the closure is allocated *) + zero_alloc : Zero_alloc.t; + (* zero-alloc attributes *) + } + (** fun P0 P1 -> function p1 -> e1 | p2 -> e2 (body = Tfunction_cases _) + fun P0 P1 -> E (body = Tfunction_body _) + This construct has the same arity as the originating + {{!Jane_syntax.Expression.Jexp_n_ary_function}[Jexp_n_ary_function]}. + Arity determines when side-effects for effectful parameters are run + (e.g. optional argument defaults, matching against lazy patterns). + Parameters' effects are run left-to-right when an n-ary function is + saturated with n arguments. + *) + | Texp_apply of + expression * (arg_label * apply_arg) list * apply_position * + Mode.Locality.l * Zero_alloc.assume option (** E0 ~l1:E1 ... ~ln:En The expression can be Omitted if the expression is abstracted over @@ -261,7 +295,9 @@ and expression_desc = [(Nolabel, Omitted _); (Labelled "y", Some (Texp_constant Const_int 3)) ]) - *) + + The [Zero_alloc.assume option] records the optional [@zero_alloc + assume] attribute that may appear on applications. *) | Texp_match of expression * Jkind.sort * computation case list * partial (** match E0 with | P1 -> E1 @@ -273,11 +309,15 @@ and expression_desc = *) | Texp_try of expression * value case list (** try E with P1 -> E1 | ... | PN -> EN *) - | Texp_tuple of expression list * Mode.Alloc.t - (** (E1, ..., EN) *) + | Texp_tuple of (string option * expression) list * Mode.Alloc.r + (** [Texp_tuple(el)] represents + - [(E1, ..., En)] when [el] is [(None, E1);...;(None, En)], + - [(L1:E1, ..., Ln:En)] when [el] is [(Some L1, E1);...;(Some Ln, En)], + - Any mix, e.g. [(L1: E1, E2)] when [el] is [(Some L1, E1); (None, E2)] + *) | Texp_construct of Longident.t loc * Types.constructor_description * - expression list * Mode.Alloc.t option + expression list * Mode.Alloc.r option (** C [] C E [E] C (E1, ..., En) [E1;...;En] @@ -286,7 +326,7 @@ and expression_desc = or [None] if the constructor is [Cstr_unboxed] or [Cstr_constant], in which case it does not need allocation. *) - | Texp_variant of label * (expression * Mode.Alloc.t) option + | Texp_variant of label * (expression * Mode.Alloc.r) option (** [alloc_mode] is the allocation mode of the variant, or [None] if the variant has no argument, in which case it does not need allocation. @@ -295,7 +335,7 @@ and expression_desc = fields : ( Types.label_description * record_label_definition ) array; representation : Types.record_representation; extended_expression : expression option; - alloc_mode : Mode.Alloc.t option + alloc_mode : Mode.Alloc.r option } (** { l1=P1; ...; ln=Pn } (extended_expression = None) { E0 with l1=P1; ...; ln=Pn } (extended_expression = Some E0) @@ -312,17 +352,16 @@ and expression_desc = in which case it does not need allocation. *) | Texp_field of expression * Longident.t loc * Types.label_description * - unique_use * Mode.Alloc.t option - (** [alloc_mode] is the allocation mode of the result; available ONLY - only when getting a (float) field from a [Record_float] record - *) + texp_field_boxing + (** [texp_field_boxing] provides extra information depending on if the + projection requires boxing. *) | Texp_setfield of - expression * Mode.Locality.t * Longident.t loc * + expression * Mode.Locality.l * Longident.t loc * Types.label_description * expression (** [alloc_mode] translates to the [modify_mode] of the record *) - | Texp_array of mutable_flag * expression list * Mode.Alloc.t + | Texp_array of Types.mutability * Jkind.Sort.t * expression list * Mode.Alloc.r | Texp_list_comprehension of comprehension - | Texp_array_comprehension of mutable_flag * comprehension + | Texp_array_comprehension of Types.mutability * Jkind.sort * comprehension | Texp_ifthenelse of expression * expression * expression option | Texp_sequence of expression * Jkind.sort * expression | Texp_while of { @@ -361,7 +400,6 @@ and expression_desc = body : value case; body_sort : Jkind.sort; partial : partial; - warnings : Warnings.state; } | Texp_unreachable | Texp_extension_constructor of Longident.t loc * Path.t @@ -370,8 +408,79 @@ and expression_desc = | Texp_probe of { name:string; handler:expression; enabled_at_init:bool } | Texp_probe_is_enabled of { name:string } | Texp_exclave of expression + | Texp_src_pos + (* A source position value which has been automatically inferred, either + as a result of [%call_pos] occuring in an expression, or omission of a + Position argument in function application *) + +and function_curry = + | More_args of { partial_mode : Mode.Alloc.l } + | Final_arg + +and function_param = + { + fp_arg_label: arg_label; + fp_param: Ident.t; + (** [fp_param] is the identifier that is to be used to name the + parameter of the function. + *) + fp_partial: partial; + (** + [fp_partial] = + [Partial] if the pattern match is partial + [Total] otherwise. + *) + fp_kind: function_param_kind; + fp_sort: Jkind.sort; + fp_mode: Mode.Alloc.l; + fp_curry: function_curry; + fp_newtypes: (string loc * Jkind.annotation option) list; + (** [fp_newtypes] are the new type declarations that come *after* that + parameter. The newtypes that come before the first parameter are + placed as exp_extras on the Texp_function node. This is just used in + {!Untypeast}. *) + fp_loc: Location.t; + (** [fp_loc] is the location of the entire value parameter, not including + the [fp_newtypes]. + *) + } -and ident_kind = Id_value | Id_prim of Mode.Locality.t option +and function_param_kind = + | Tparam_pat of pattern + (** [Tparam_pat p] is a non-optional argument with pattern [p]. *) + | Tparam_optional_default of pattern * expression * Jkind.sort + (** [Tparam_optional_default (p, e, sort)] is an optional argument [p] with + default value [e], i.e. [?x:(p = e)]. If the parameter is of type + [a option], the pattern and expression are of type [a]. [sort] is the + sort of [e]. *) + +and function_body = + | Tfunction_body of expression + | Tfunction_cases of function_cases +(** The function body binds a final argument in [Tfunction_cases], + and this argument is pattern-matched against the cases. +*) + +and function_cases = + { fc_cases: value case list; + fc_env : Env.t; + (** [fc_env] contains entries from all parameters except + for the last one being matched by the cases. + *) + fc_arg_mode: Mode.Alloc.l; + fc_arg_sort: Jkind.sort; + fc_ret_type : Types.type_expr; + fc_partial: partial; + fc_param: Ident.t; + fc_loc: Location.t; + fc_exp_extra: exp_extra option; + fc_attributes: attributes; + (** [fc_attributes] is just used in untypeast. *) + } + +and ident_kind = + | Id_value + | Id_prim of Mode.Locality.l option * Jkind.Sort.t option and meth = Tmeth_name of string @@ -421,7 +530,7 @@ and 'k case = } and record_label_definition = - | Kept of Types.type_expr * mutable_flag * unique_use + | Kept of Types.type_expr * Types.mutability * unique_use | Overridden of Longident.t loc * expression and binding_op = @@ -443,9 +552,9 @@ and ('a, 'b) arg_or_omitted = | Omitted of 'b and omitted_parameter = - { mode_closure : Mode.Alloc.t; - mode_arg : Mode.Alloc.t; - mode_ret : Mode.Alloc.t; + { mode_closure : Mode.Alloc.r; + mode_arg : Mode.Alloc.l; + mode_ret : Mode.Alloc.l; sort_arg : Jkind.sort } and apply_arg = (expression * Jkind.sort, omitted_parameter) arg_or_omitted @@ -575,8 +684,9 @@ and structure_item_desc = and module_binding = { - mb_id: Ident.t option; + mb_id: Ident.t option; (** [None] for [module _ = struct ... end] *) mb_name: string option loc; + mb_uid: Uid.t; mb_presence: Types.module_presence; mb_expr: module_expr; mb_attributes: attributes; @@ -587,6 +697,7 @@ and value_binding = { vb_pat: pattern; vb_expr: expression; + vb_rec_kind: Value_rec_types.recursive_binding_kind; vb_sort: Jkind.sort; vb_attributes: attributes; vb_loc: Location.t; @@ -598,7 +709,19 @@ and module_coercion = (Ident.t * int * module_coercion) list | Tcoerce_functor of module_coercion * module_coercion | Tcoerce_primitive of primitive_coercion + (** External declaration coerced to a regular value. + {[ + module M : sig val ext : a -> b end = + struct external ext : a -> b = "my_c_function" end + ]} + Only occurs inside a [Tcoerce_structure] coercion. *) | Tcoerce_alias of Env.t * Path.t * module_coercion + (** Module alias coerced to a regular module. + {[ + module M : sig module Sub : T end = + struct module Sub = Some_alias end + ]} + Only occurs inside a [Tcoerce_structure] coercion. *) and module_type = { mty_desc: module_type_desc; @@ -621,7 +744,8 @@ and primitive_coercion = { pc_desc: Primitive.description; pc_type: Types.type_expr; - pc_poly_mode: Mode.Locality.t option; + pc_poly_mode: Mode.Locality.l option; + pc_poly_sort: Jkind.Sort.t option; pc_env: Env.t; pc_loc : Location.t; } @@ -658,6 +782,7 @@ and module_declaration = { md_id: Ident.t option; md_name: string option loc; + md_uid: Uid.t; md_presence: Types.module_presence; md_type: module_type; md_attributes: attributes; @@ -668,6 +793,7 @@ and module_substitution = { ms_id: Ident.t; ms_name: string loc; + ms_uid: Uid.t; ms_manifest: Path.t; ms_txt: Longident.t loc; ms_attributes: attributes; @@ -678,6 +804,7 @@ and module_type_declaration = { mtd_id: Ident.t; mtd_name: string loc; + mtd_uid: Uid.t; mtd_type: module_type option; mtd_attributes: attributes; mtd_loc: Location.t; @@ -736,16 +863,19 @@ and core_type = } and core_type_desc = - | Ttyp_var of string option * const_jkind option + | Ttyp_var of string option * Jkind.annotation option | Ttyp_arrow of arg_label * core_type * core_type - | Ttyp_tuple of core_type list + | Ttyp_tuple of (string option * core_type) list | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of object_field list * closed_flag | Ttyp_class of Path.t * Longident.t loc * core_type list - | Ttyp_alias of core_type * string option * const_jkind option + | Ttyp_alias of core_type * string option * Jkind.annotation option | Ttyp_variant of row_field list * closed_flag * label list option - | Ttyp_poly of (string * const_jkind option) list * core_type + | Ttyp_poly of (string * Jkind.annotation option) list * core_type | Ttyp_package of package_type + | Ttyp_call_pos + (** [Ttyp_call_pos] represents the type of the value of a Position + argument ([lbl:[%call_pos] -> ...]). *) and package_type = { pack_path : Path.t; @@ -796,6 +926,7 @@ and type_declaration = typ_manifest: core_type option; typ_loc: Location.t; typ_attributes: attributes; + typ_jkind_annotation: Jane_syntax.Jkind.annotation option; } and type_kind = @@ -808,8 +939,9 @@ and label_declaration = { ld_id: Ident.t; ld_name: string loc; - ld_mutable: mutable_flag; - ld_global: Types.global_flag; + ld_uid: Uid.t; + ld_mutable: Types.mutability; + ld_modalities: Mode.Modality.Value.Const.t; ld_type: core_type; ld_loc: Location.t; ld_attributes: attributes; @@ -819,15 +951,23 @@ and constructor_declaration = { cd_id: Ident.t; cd_name: string loc; - cd_vars: (string * const_jkind option) list; + cd_uid: Uid.t; + cd_vars: (string * Jkind.annotation option) list; cd_args: constructor_arguments; cd_res: core_type option; cd_loc: Location.t; cd_attributes: attributes; } +and constructor_argument = + { + ca_modalities: Mode.Modality.Value.Const.t; + ca_type: core_type; + ca_loc: Location.t; + } + and constructor_arguments = - | Cstr_tuple of (core_type * Types.global_flag) list + | Cstr_tuple of constructor_argument list | Cstr_record of label_declaration list and type_extension = @@ -859,7 +999,7 @@ and extension_constructor = } and extension_constructor_kind = - Text_decl of (string * const_jkind option) list * + Text_decl of (string * Jkind.annotation option) list * constructor_arguments * core_type option | Text_rebind of Path.t * Longident.t loc @@ -921,10 +1061,20 @@ and 'a class_infos = ci_attributes: attributes; } +type argument_interface = { + ai_signature: Types.signature; + ai_coercion_from_primary: module_coercion; +} +(** For a module [M] compiled with [-as-argument-for P] for some parameter + module [P], the signature of [P] along with the coercion from [M]'s + exported signature (the _primary interface_) to [P]'s signature (the + _argument interface_). *) + type implementation = { structure: structure; coercion: module_coercion; signature: Types.signature; + argument_interface: argument_interface option; shape: Shape.t; } (** A typechecked implementation including its module structure, its exported @@ -935,8 +1085,29 @@ type implementation = { If there isn't one, the signature will be inferred from the module structure. + + If the module is compiled with [-as-argument-for] and is thus typechecked + against the .mli for a parameter in addition to its own .mli, it has an + additional signature stored in [argument_interface]. *) +type item_declaration = + | Value of value_description + | Value_binding of value_binding + | Type of type_declaration + | Constructor of constructor_declaration + | Extension_constructor of extension_constructor + | Label of label_declaration + | Module of module_declaration + | Module_substitution of module_substitution + | Module_binding of module_binding + | Module_type of module_type_declaration + | Class of class_declaration + | Class_type of class_type_declaration +(** [item_declaration] groups together items that correspond to the syntactic + category of "declarations" which include types, values, modules, etc. + declarations in signatures and their definitions in implementations. *) + (* Auxiliary functions over the a.s.t. *) (** [as_computation_pattern p] is a computation pattern with description @@ -968,9 +1139,23 @@ val exists_pattern: (pattern -> bool) -> pattern -> bool val let_bound_idents: value_binding list -> Ident.t list val let_bound_idents_full: value_binding list -> (Ident.t * string loc * Types.type_expr * Uid.t) list -val let_bound_idents_with_modes_and_sorts: + +(* [let_bound_idents_with_modes_sorts_and_checks] finds all the idents in the + let bindings and computes their modes, sorts, and whether they have any check + attributes (zero_alloc). + + Note that: + * The list associated with each ident can only have more than one element in + the case of or pattern, where the ident is bound on both sides. + * We return just one check_attribute per identifier, because this attribute + can only be something other than [Default_check] in the case of a simple + variable pattern bound to a function (in which case the list will also + have just one element). +*) +val let_bound_idents_with_modes_sorts_and_checks: value_binding list - -> (Ident.t * (Location.t * Mode.Value.t * Jkind.sort) list) list + -> (Ident.t * (Location.t * Mode.Value.l * Jkind.sort) list + * Zero_alloc.t) list (** Alpha conversion of patterns *) val alpha_pat: @@ -984,7 +1169,7 @@ val pat_bound_idents_with_types: 'k general_pattern -> (Ident.t * Types.type_expr) list val pat_bound_idents_full: Jkind.sort -> 'k general_pattern - -> (Ident.t * string loc * Types.type_expr * Jkind.sort) list + -> (Ident.t * string loc * Types.type_expr * Types.Uid.t * Jkind.sort) list (** Splits an or pattern into its value (left) and exception (right) parts. *) val split_pattern: @@ -993,3 +1178,6 @@ val split_pattern: (** Whether an expression looks nice as the subject of a sentence in a error message. *) val exp_is_nominal : expression -> bool + +(** Calculates the syntactic arity of a function based on its parameters and body. *) +val function_arity : function_param list -> function_body -> int diff --git a/typing/typemod.ml b/typing/typemod.ml index f2b51597b2b..3637a3bf950 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -65,6 +65,7 @@ type error = Longident.t * Path.t * Includemod.explanation | With_changes_module_alias of Longident.t * Ident.t * Path.t | With_cannot_remove_constrained_type + | With_package_manifest of Longident.t * type_expr | Repeated_name of Sig_component_kind.t * string | Non_generalizable of { vars : type_expr list; expression : type_expr } | Non_generalizable_module of @@ -87,6 +88,18 @@ type error = | With_cannot_remove_packed_modtype of Path.t * module_type | Toplevel_nonvalue of string * Jkind.sort | Strengthening_mismatch of Longident.t * Includemod.explanation + | Cannot_pack_parameter + | Compiling_as_parameterised_parameter + | Cannot_compile_implementation_as_parameter + | Cannot_implement_parameter of Compilation_unit.Name.t * Misc.filepath + | Argument_for_non_parameter of Compilation_unit.Name.t * Misc.filepath + | Cannot_find_argument_type of Compilation_unit.Name.t + | Inconsistent_argument_types of { + new_arg_type : Compilation_unit.Name.t option; + old_arg_type : Compilation_unit.Name.t option; + old_source_file : Misc.filepath; + } + | Submode_failed of Mode.Value.error exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -183,7 +196,9 @@ let extract_sig_functor_open funct_body env loc mty sig_acc = (* Compute the environment after opening a module *) let type_open_ ?used_slot ?toplevel ovf env loc lid = - let path = Env.lookup_module_path ~load:true ~loc:lid.loc lid.txt env in + let path, _ = + Env.lookup_module_path ~lock:false ~load:true ~loc:lid.loc lid.txt env + in match Env.open_signature ~loc ?used_slot ?toplevel ovf path env with | Ok env -> path, env | Error _ -> @@ -210,7 +225,7 @@ let initial_env ~loc ~initially_opened_module env in let units = - List.map Env.persistent_structures_of_dir (Load_path.get ()) + List.map Env.persistent_structures_of_dir (Load_path.get_visible ()) in let env, units = match initially_opened_module with @@ -537,6 +552,59 @@ let params_are_constrained = in loop +let rec remove_modality_and_zero_alloc_variables_sg env ~zap_modality sg = + let sg_item = function + | Sig_value (id, desc, vis) -> + let val_modalities = + desc.val_modalities + |> zap_modality |> Mode.Modality.Value.of_const + in + let val_zero_alloc = + Zero_alloc.create_const (Zero_alloc.get desc.val_zero_alloc) + in + let desc = {desc with val_modalities; val_zero_alloc} in + Sig_value (id, desc, vis) + | Sig_module (id, pres, md, re, vis) -> + let md_type = + remove_modality_and_zero_alloc_variables_mty env ~zap_modality + md.md_type + in + let md = {md with md_type} in + Sig_module (id, pres, md, re, vis) + | item -> item + in + List.map sg_item sg + +and remove_modality_and_zero_alloc_variables_mty env ~zap_modality mty = + match mty with + | Mty_ident _ | Mty_alias _ -> + (* module types with names can't have inferred modalities. *) + mty + | Mty_signature sg -> + Mty_signature + (remove_modality_and_zero_alloc_variables_sg env ~zap_modality sg) + | Mty_functor (param, mty) -> + let param : Types.functor_parameter = + match param with + | Named (id, mty) -> + let mty = + remove_modality_and_zero_alloc_variables_mty env + ~zap_modality:Mode.Modality.Value.to_const_exn mty + in + Named (id, mty) + | Unit -> Unit + in + let mty = + remove_modality_and_zero_alloc_variables_mty env ~zap_modality mty + in + Mty_functor (param, mty) + | Mty_strengthen (mty, path, alias) -> + let mty = + remove_modality_and_zero_alloc_variables_mty env + ~zap_modality:Mode.Modality.Value.to_const_exn mty + in + Mty_strengthen (mty, path, alias) + type with_info = | With_type of Parsetree.type_declaration | With_typesubst of Parsetree.type_declaration @@ -549,11 +617,15 @@ type with_info = | With_modsubst of Longident.t loc * Path.t * Types.module_declaration | With_modtype of Typedtree.module_type | With_modtypesubst of Typedtree.module_type + | With_type_package of Typedtree.core_type + (* Package with type constraints only use this last case. Normal module + with constraints never use it. *) let merge_constraint initial_env loc sg lid constr = let destructive_substitution = match constr with - | With_type _ | With_module _ | With_modtype _ -> false + | With_type _ | With_type_package _ | With_module _ + | With_modtype _ -> false | With_typesubst _ | With_modsubst _ | With_modtypesubst _ -> true in let real_ids = ref [] in @@ -582,11 +654,12 @@ let merge_constraint initial_env loc sg lid constr = (* jkind any is fine on the params because they get thrown away below *) List.map - (fun _ -> Btype.newgenvar (Jkind.any ~why:Dummy_jkind)) + (fun _ -> Btype.newgenvar (Jkind.Primitive.any ~why:Dummy_jkind)) sdecl.ptype_params; type_arity = arity; type_kind = Type_abstract Abstract_def; - type_jkind = Jkind.value ~why:(Unknown "merge_constraint"); + type_jkind = Jkind.Primitive.value ~why:(Unknown "merge_constraint"); + type_jkind_annotation = None; type_private = Private; type_manifest = None; type_variance = @@ -609,6 +682,7 @@ let merge_constraint initial_env loc sg lid constr = type_attributes = []; type_unboxed_default = false; type_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); + type_has_illegal_crossings = false; } and id_row = Ident.create_local (s^"#row") in let initial_env = @@ -630,7 +704,7 @@ let merge_constraint initial_env loc sg lid constr = in return ~ghosts ~replace_by:(Some (Sig_type(id, newdecl, rs, priv))) - (Pident id, lid, Twith_type tdecl) + (Pident id, lid, Some (Twith_type tdecl)) | Sig_type(id, sig_decl, rs, priv) , [s], (With_type sdecl | With_typesubst sdecl as constr) when Ident.name id = s -> @@ -647,12 +721,47 @@ let merge_constraint initial_env loc sg lid constr = With_type _ -> return ~ghosts ~replace_by:(Some(Sig_type(id, newdecl, rs, priv))) - (Pident id, lid, Twith_type tdecl) + (Pident id, lid, Some (Twith_type tdecl)) | (* With_typesubst *) _ -> real_ids := [Pident id]; return ~ghosts ~replace_by:None - (Pident id, lid, Twith_typesubst tdecl) + (Pident id, lid, Some (Twith_typesubst tdecl)) end + | Sig_type(id, sig_decl, rs, priv), [s], With_type_package cty + when Ident.name id = s -> + begin match sig_decl.type_manifest with + | None -> () + | Some ty -> + raise (Error(loc, outer_sig_env, With_package_manifest (lid.txt, ty))) + end; + let tdecl = + Typedecl.transl_package_constraint ~loc cty.ctyp_type + in + (* Here we constrain the jkind of "with type" manifest by the jkind from + the declaration from the original signature. Note that this is also + checked in [check_type_decl], but there it is check, not constrain, + which we need here to deal with type variables in package constraints + (see tests in [typing-modules/package_constraint.ml]). *) + begin match + Ctype.constrain_decl_jkind initial_env tdecl sig_decl.type_jkind + with + | Ok _-> () + | Error v -> + (* This is morally part of the below [check_type_decl], so we give the + same error that would be given there for good error messages. *) + let err = + Includemod.Error.In_Type_declaration( + id, Type_declarations + {got=tdecl; + expected=sig_decl; + symptom=Includecore.Jkind v}) + in + raise Includemod.(Error(initial_env, err)) + end; + check_type_decl outer_sig_env sg_for_env loc id None tdecl sig_decl; + let tdecl = { tdecl with type_manifest = None } in + return ~ghosts ~replace_by:(Some(Sig_type(id, tdecl, rs, priv))) + (Pident id, lid, None) | Sig_modtype(id, mtd, priv), [s], (With_modtype mty | With_modtypesubst mty) when Ident.name id = s -> @@ -674,7 +783,7 @@ let merge_constraint initial_env loc sg lid constr = in return ~replace_by:(Some(Sig_modtype(id, mtd', priv))) - (Pident id, lid, Twith_modtype mty) + (Pident id, lid, Some (Twith_modtype mty)) else begin let path = Pident id in real_ids := [path]; @@ -682,7 +791,8 @@ let merge_constraint initial_env loc sg lid constr = | Mty_ident _ -> () | mty -> unpackable_modtype := Some mty end; - return ~replace_by:None (Pident id, lid, Twith_modtypesubst mty) + return ~replace_by:None + (Pident id, lid, Some (Twith_modtypesubst mty)) end | Sig_module(id, pres, md, rs, priv), [s], With_module {lid=lid'; md=md'; path; remove_aliases} @@ -690,13 +800,17 @@ let merge_constraint initial_env loc sg lid constr = let sig_env = Env.add_signature sg_for_env outer_sig_env in let mty = md'.md_type in let mty = Mtype.scrape_for_type_of ~remove_aliases sig_env mty in + let mty = + remove_modality_and_zero_alloc_variables_mty sig_env + ~zap_modality:Mode.Modality.Value.zap_to_floor mty + in let md'' = { md' with md_type = mty } in let newmd = Mtype.strengthen_decl ~aliasable:false md'' path in ignore(Includemod.modtypes ~mark:Mark_both ~loc sig_env newmd.md_type md.md_type); return ~replace_by:(Some(Sig_module(id, pres, newmd, rs, priv))) - (Pident id, lid, Twith_module (path, lid')) + (Pident id, lid, Some (Twith_module (path, lid'))) | Sig_module(id, _, md, _rs, _), [s], With_modsubst (lid',path,md') when Ident.name id = s -> let sig_env = Env.add_signature sg_for_env outer_sig_env in @@ -705,7 +819,8 @@ let merge_constraint initial_env loc sg lid constr = (Includemod.strengthened_module_decl ~loc ~mark:Mark_both ~aliasable sig_env md' path md); real_ids := [Pident id]; - return ~replace_by:None (Pident id, lid, Twith_modsubst (path, lid')) + return ~replace_by:None + (Pident id, lid, Some (Twith_modsubst (path, lid'))) | Sig_module(id, _, md, rs, priv) as item, s :: namelist, constr when Ident.name id = s -> let sig_env = Env.add_signature sg_for_env outer_sig_env in @@ -739,7 +854,7 @@ let merge_constraint initial_env loc sg lid constr = check_usage_after_substitution ~loc ~lid initial_env !real_ids !unpackable_modtype sg; let sub = match tcstr with - | (_, _, Twith_typesubst tdecl) -> + | (_, _, Some (Twith_typesubst tdecl)) -> let how_to_extend_subst = let sdecl = match constr with @@ -764,7 +879,7 @@ let merge_constraint initial_env loc sg lid constr = let sub = Subst.change_locs Subst.identity loc in let sub = List.fold_left how_to_extend_subst sub !real_ids in Some sub - | (_, _, Twith_modsubst (real_path, _)) -> + | (_, _, Some (Twith_modsubst (real_path, _))) -> let sub = Subst.change_locs Subst.identity loc in let sub = List.fold_left @@ -773,7 +888,7 @@ let merge_constraint initial_env loc sg lid constr = !real_ids in Some sub - | (_, _, Twith_modtypesubst tmty) -> + | (_, _, Some (Twith_modtypesubst tmty)) -> let add s p = Subst.add_modtype_path p tmty.mty_type s in let sub = Subst.change_locs Subst.identity loc in let sub = List.fold_left add sub !real_ids in @@ -801,6 +916,25 @@ let merge_constraint initial_env loc sg lid constr = with Includemod.Error explanation -> raise(Error(loc, initial_env, With_mismatch(lid.txt, explanation))) +let merge_package_constraint initial_env loc sg lid cty = + let _, s = merge_constraint initial_env loc sg lid (With_type_package cty) in + s + +let check_package_with_type_constraints loc env mty constraints = + let sg = extract_sig env loc mty in + let sg = + List.fold_left + (fun sg (lid, cty) -> merge_package_constraint env loc sg lid cty) + sg constraints + in + let scope = Ctype.create_scope () in + Mtype.freshen ~scope (Mty_signature sg) + +let () = + Typetexp.check_package_with_type_constraints := + check_package_with_type_constraints + + (* Add recursion flags on declarations arising from a mutually recursive block. *) @@ -852,7 +986,7 @@ let rec approx_modtype env smty = in Mty_ident path | Pmty_alias lid -> - let path = + let path, _ = Env.lookup_module_path ~use:false ~load:false ~loc:smty.pmty_loc lid.txt env in @@ -905,7 +1039,7 @@ let rec approx_modtype env smty = and approx_modtype_jane_syntax env = function | Jane_syntax.Module_type.Jmty_strengthen { mty = smty; mod_id } -> let mty = approx_modtype env smty in - let path = + let path, _ = (* CR-someday: potentially improve error message for strengthening with a mutually recursive module. *) Env.lookup_module_path ~use:false ~load:false @@ -931,6 +1065,8 @@ and approx_include_functor and approx_sig_jst' env (jitem : Jane_syntax.Signature_item.t) srem = match jitem with | Jsig_include_functor ifincl -> approx_include_functor env ifincl srem + | Jsig_layout (Lsig_kind_abbrev _) -> + Misc.fatal_error "kind_abbrev not supported!" and approx_sig env ssg = match ssg with @@ -963,7 +1099,7 @@ and approx_sig env ssg = Sig_module(id, pres, md, Trec_not, Exported) :: approx_sig newenv srem | Psig_modsubst pms -> let scope = Ctype.create_scope () in - let _, md = + let _, md, _ = Env.lookup_module ~use:false ~loc:pms.pms_manifest.loc pms.pms_manifest.txt env in @@ -1161,7 +1297,7 @@ end = struct let open Sig_component_kind in match component with | Value -> names.values - | Type -> names.types + | Type | Label | Constructor -> names.types | Module -> names.modules | Module_type -> names.modtypes | Extension_constructor -> names.typexts @@ -1371,7 +1507,8 @@ let transl_modtype_longident loc env lid = Env.lookup_modtype_path ~loc lid env let transl_module_alias loc env lid = - Env.lookup_module_path ~load:false ~loc lid env + let path, _ = Env.lookup_module_path ~lock:false ~load:false ~loc lid env in + path let mkmty desc typ env loc attrs = let mty = { @@ -1468,7 +1605,7 @@ and transl_modtype_aux env smty = and transl_modtype_jane_syntax_aux ~loc env = function | Jane_syntax.Module_type.Jmty_strengthen { mty ; mod_id } -> let tmty = transl_modtype_aux env mty in - let path, md = + let path, md, _ = Env.lookup_module ~use:false ~loc:mod_id.loc mod_id.txt env in let aliasable = not (Env.is_functor_arg path env) in @@ -1492,10 +1629,10 @@ and transl_with ~loc env remove_aliases (rev_tcstrs,sg) constr = | Pwith_type (l,decl) ->l , With_type decl | Pwith_typesubst (l,decl) ->l , With_typesubst decl | Pwith_module (l,l') -> - let path, md = Env.lookup_module ~loc l'.txt env in + let path, md, _ = Env.lookup_module ~lock:false ~loc l'.txt env in l , With_module {lid=l';path;md; remove_aliases} | Pwith_modsubst (l,l') -> - let path, md' = Env.lookup_module ~loc l'.txt env in + let path, md', _ = Env.lookup_module ~lock:false ~loc l'.txt env in l , With_modsubst (l',path,md') | Pwith_modtype (l,smty) -> let mty = transl_modtype env smty in @@ -1504,8 +1641,10 @@ and transl_with ~loc env remove_aliases (rev_tcstrs,sg) constr = let mty = transl_modtype env smty in l, With_modtypesubst mty in - let (tcstr, sg) = merge_constraint env loc sg lid with_info in - (tcstr :: rev_tcstrs, sg) + let ((path, lid, tcstr), sg) = merge_constraint env loc sg lid with_info in + (* Only package with constraints result in None here. *) + let tcstr = Option.get tcstr in + ((path, lid, tcstr) :: rev_tcstrs, sg) @@ -1554,6 +1693,8 @@ and transl_signature env (sg : Parsetree.signature) = function | Jsig_include_functor ifincl -> transl_include_functor ~loc env sig_acc ifincl + | Jsig_layout (Lsig_kind_abbrev _) -> + Misc.fatal_error "kind_abbrev not supported!" in let transl_sig_item env sig_acc item = @@ -1567,20 +1708,15 @@ and transl_signature env (sg : Parsetree.signature) = Typedecl.transl_value_decl env item.psig_loc sdesc in Signature_names.check_value names tdesc.val_loc tdesc.val_id; - Env.register_uid tdesc.val_val.val_uid ~loc:tdesc.val_loc - ~attributes:tdesc.val_attributes; mksig (Tsig_value tdesc) env loc, [Sig_value(tdesc.val_id, tdesc.val_val, Exported)], newenv | Psig_type (rec_flag, sdecls) -> - let (decls, newenv) = + let (decls, newenv, _shapes) = Typedecl.transl_type_decl env rec_flag sdecls in List.iter (fun td -> Signature_names.check_type names td.typ_loc td.typ_id; - if not (Btype.is_row_name (Ident.name td.typ_id)) then - Env.register_uid td.typ_type.type_uid ~loc:td.typ_loc - ~attributes:td.typ_attributes ) decls; let sig_items = map_rec_type_with_row_types ~rec_flag @@ -1589,7 +1725,7 @@ and transl_signature env (sg : Parsetree.signature) = in mksig (Tsig_type (rec_flag, decls)) env loc, sig_items, newenv | Psig_typesubst sdecls -> - let (decls, newenv) = + let (decls, newenv, _shapes) = Typedecl.transl_type_decl env Nonrecursive sdecls in List.iter (fun td -> @@ -1609,19 +1745,16 @@ and transl_signature env (sg : Parsetree.signature) = in Some (`Substituted_away subst) in - Signature_names.check_type ?info names td.typ_loc td.typ_id; - Env.register_uid td.typ_type.type_uid ~loc:td.typ_loc ~attributes:td.typ_attributes + Signature_names.check_type ?info names td.typ_loc td.typ_id ) decls; mksig (Tsig_typesubst decls) env loc, [], newenv | Psig_typext styext -> - let (tyext, newenv) = + let (tyext, newenv, _shapes) = Typedecl.transl_type_extension false env item.psig_loc styext in let constructors = tyext.tyext_constructors in List.iter (fun ext -> - Signature_names.check_typext names ext.ext_loc ext.ext_id; - Env.register_uid ext.ext_type.ext_uid ~loc:ext.ext_loc - ~attributes:ext.ext_attributes + Signature_names.check_typext names ext.ext_loc ext.ext_id ) constructors; let tsg = map_ext (fun es ext -> Sig_typext(ext.ext_id, ext.ext_type, es, Exported) @@ -1631,14 +1764,10 @@ and transl_signature env (sg : Parsetree.signature) = tsg, newenv | Psig_exception sext -> - let (ext, newenv) = Typedecl.transl_type_exception env sext in + let (ext, newenv, _shapes) = Typedecl.transl_type_exception env sext in let constructor = ext.tyexn_constructor in Signature_names.check_typext names constructor.ext_loc constructor.ext_id; - Env.register_uid - constructor.ext_type.ext_uid - ~loc:constructor.ext_loc - ~attributes:constructor.ext_attributes; let tsg = Sig_typext(constructor.ext_id, constructor.ext_type, Text_exception, Exported) @@ -1672,10 +1801,10 @@ and transl_signature env (sg : Parsetree.signature) = Signature_names.check_module names pmd.pmd_name.loc id; Some id, newenv in - Env.register_uid md.md_uid ~loc:md.md_loc ~attributes:md.md_attributes; let sig_item = mksig (Tsig_module {md_id=id; md_name=pmd.pmd_name; - md_presence=pres; md_type=tmty; + md_uid=md.md_uid; md_presence=pres; + md_type=tmty; md_loc=pmd.pmd_loc; md_attributes=pmd.pmd_attributes}) env loc @@ -1688,8 +1817,8 @@ and transl_signature env (sg : Parsetree.signature) = sig_item, tsg, newenv | Psig_modsubst pms -> let scope = Ctype.create_scope () in - let path, md = - Env.lookup_module ~loc:pms.pms_manifest.loc + let path, md, _ = + Env.lookup_module ~loc:pms.pms_manifest.loc ~lock:false pms.pms_manifest.txt env in let aliasable = not (Env.is_functor_arg path env) in @@ -1715,11 +1844,10 @@ and transl_signature env (sg : Parsetree.signature) = `Substituted_away (Subst.add_module id path Subst.identity) in Signature_names.check_module ~info names pms.pms_name.loc id; - Env.register_uid md.md_uid ~loc:md.md_loc ~attributes:md.md_attributes; let sig_item = mksig (Tsig_modsubst {ms_id=id; ms_name=pms.pms_name; - ms_manifest=path; ms_txt=pms.pms_manifest; - ms_loc=pms.pms_loc; + ms_uid=md.md_uid; ms_manifest=path; + ms_txt=pms.pms_manifest; ms_loc=pms.pms_loc; ms_attributes=pms.pms_attributes}) env loc in @@ -1734,9 +1862,8 @@ and transl_signature env (sg : Parsetree.signature) = | Some id -> Some (id, md, uid) ) tdecls in - List.iter (fun (id, md, uid) -> + List.iter (fun (id, md, _uid) -> Signature_names.check_module names md.md_loc id; - Env.register_uid uid ~loc:md.md_loc ~attributes:md.md_attributes ) decls; let sig_items = map_rec (fun rs (id, md, uid) -> @@ -1754,13 +1881,11 @@ and transl_signature env (sg : Parsetree.signature) = | Psig_modtype pmtd -> let newenv, mtd, decl = transl_modtype_decl env pmtd in Signature_names.check_modtype names pmtd.pmtd_loc mtd.mtd_id; - Env.register_uid decl.mtd_uid ~loc:mtd.mtd_loc - ~attributes:mtd.mtd_attributes; mksig (Tsig_modtype mtd) env loc, [Sig_modtype (mtd.mtd_id, decl, Exported)], newenv | Psig_modtypesubst pmtd -> - let newenv, mtd, decl = transl_modtype_decl env pmtd in + let newenv, mtd, _decl = transl_modtype_decl env pmtd in let info = let mty = match mtd.mtd_type with | Some tmty -> tmty.mty_type @@ -1774,7 +1899,6 @@ and transl_signature env (sg : Parsetree.signature) = | _ -> `Unpackable_modtype_substituted_away (mtd.mtd_id,subst) in Signature_names.check_modtype ~info names pmtd.pmtd_loc mtd.mtd_id; - Env.register_uid decl.mtd_uid ~loc:mtd.mtd_loc ~attributes:mtd.mtd_attributes; mksig (Tsig_modtypesubst mtd) env loc, [], newenv @@ -1791,8 +1915,6 @@ and transl_signature env (sg : Parsetree.signature) = Signature_names.check_type names loc cls.cls_obj_id; Signature_names.check_class names loc cls.cls_id; Signature_names.check_class_type names loc cls.cls_ty_id; - Env.register_uid cls.cls_decl.cty_uid ~loc:cls.cls_decl.cty_loc - ~attributes:cls.cls_decl.cty_attributes; ) classes; let tsg = map_rec (fun rs cls -> @@ -1815,10 +1937,6 @@ and transl_signature env (sg : Parsetree.signature) = let loc = decl.clsty_id_loc.Location.loc in Signature_names.check_class_type names loc decl.clsty_ty_id; Signature_names.check_type names loc decl.clsty_obj_id; - Env.register_uid - decl.clsty_ty_decl.clty_uid - ~loc:decl.clsty_ty_decl.clty_loc - ~attributes:decl.clsty_ty_decl.clty_attributes; ) classes; let tsg = map_rec (fun rs decl -> @@ -1891,6 +2009,7 @@ and transl_modtype_decl_aux env { mtd_id=id; mtd_name=pmtd_name; + mtd_uid=decl.mtd_uid; mtd_type=tmty; mtd_attributes=pmtd_attributes; mtd_loc=pmtd_loc; @@ -1973,11 +2092,11 @@ and transl_recmodule_modtypes env sdecls = List.map2 (fun pmd (id_shape, id_loc, md, mty) -> let tmd = {md_id=Option.map fst id_shape; md_name=id_loc; md_type=mty; - md_presence=Mp_present; + md_uid=md.Types.md_uid; md_presence=Mp_present; md_loc=pmd.pmd_loc; md_attributes=pmd.pmd_attributes} in - tmd, md.md_uid, Option.map snd id_shape + tmd, md.Types.md_uid, Option.map snd id_shape ) sdecls dcl2 in (dcl2, env2) @@ -2187,6 +2306,7 @@ let check_recmodule_inclusion env bindings = { mb_id = id; mb_name = name; + mb_uid = uid; mb_presence = Mp_present; mb_expr = modl'; mb_attributes = attrs; @@ -2323,6 +2443,31 @@ let simplify_app_summary app_view = match app_view.arg with | false, Some p -> Includemod.Error.Named p, mty | false, None -> Includemod.Error.Anonymous, mty +let maybe_infer_modalities ~loc ~env ~md_mode ~mode = + if Language_extension.(is_at_least Mode Alpha) then begin + (* Upon construction, for comonadic (prescriptive) axes, module + must be weaker than the values therein, for otherwise operations + would be allowed to performed on the module (and extended to the + values) that's disallowed for the values. + + For monadic (descriptive) axes, the restriction is not on the + construction but on the projection, which is modelled by the + [Diff] modality in [mode.ml]. *) + begin match Mode.Value.Comonadic.submode + mode.Mode.comonadic + md_mode.Mode.comonadic with + | Ok () -> () + | Error (Error (ax, e)) -> raise (Error (loc, env, Submode_failed (Error (Comonadic ax, e)))) + end; + Mode.Modality.Value.infer ~md_mode ~mode + end else begin + begin match Mode.Value.submode mode md_mode with + | Ok () -> () + | Error e -> raise (Error (loc, env, Submode_failed e)) + end; + Mode.Modality.Value.id + end + let rec type_module ?(alias=false) sttn funct_body anchor env smod = Builtin_attributes.warning_scope smod.pmod_attributes (fun () -> type_module_aux ~alias sttn funct_body anchor env smod) @@ -2330,9 +2475,10 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = and type_module_aux ~alias sttn funct_body anchor env smod = match smod.pmod_desc with Pmod_ident lid -> - let path = + let path, mode = Env.lookup_module_path ~load:(not alias) ~loc:smod.pmod_loc lid.txt env in + Mode.Value.submode_exn mode Mode.Value.legacy; let md = { mod_desc = Tmod_ident (path, lid); mod_type = Mty_alias path; mod_env = env; @@ -2342,6 +2488,7 @@ and type_module_aux ~alias sttn funct_body anchor env smod = let shape = Env.shape_of_path ~namespace:Shape.Sig_component_kind.Module env path in + let shape = if alias && aliasable then Shape.alias shape else shape in let md = if alias && aliasable then (Env.add_required_global path env; md) @@ -2716,10 +2863,13 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = match (jitem : Jane_syntax.Structure_item.t) with | Jstr_include_functor ifincl -> type_str_include_functor ~loc env shape_map ifincl sig_acc + | Jstr_layout (Lstr_kind_abbrev _) -> + Misc.fatal_error "kind_abbrev not supported!" in let type_str_item env shape_map ({pstr_loc = loc; pstr_desc = desc} as item) sig_acc = + let md_mode = Mode.Value.legacy in match Jane_syntax.Structure_item.of_ast item with | Some jitem -> type_str_item_jst ~loc env shape_map jitem sig_acc | None -> @@ -2742,17 +2892,17 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = in let (defs, newenv) = Typecore.type_binding env rec_flag ~force_toplevel sdefs in - let () = if rec_flag = Recursive then - Typecore.check_recursive_bindings env defs + let defs = match rec_flag with + | Recursive -> Typecore.annotate_recursive_bindings env defs + | Nonrecursive -> defs in (* Note: Env.find_value does not trigger the value_used event. Values will be marked as being used during the signature inclusion test. *) let items, shape_map = List.fold_left - (fun (acc, shape_map) (id, modes) -> + (fun (acc, shape_map) (id, id_info, zero_alloc) -> List.iter - (fun (loc, mode, sort) -> - Typecore.escape ~loc ~env:newenv ~reason:Other mode; + (fun (loc, _mode, sort) -> (* CR layouts v5: this jkind check has the effect of defaulting the sort of top-level bindings to value, which will change. *) @@ -2760,18 +2910,37 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = then raise (Error (loc, env, Toplevel_nonvalue (Ident.name id,sort))) ) - modes; - let (first_loc, _, _) = List.hd modes in + id_info; + let zero_alloc = + (* We only allow "Check" attributes in signatures. Here we + convert "Assume"s in structures to the equivalent "Check" for + the signature. *) + let open Builtin_attributes in + match[@warning "+9"] Zero_alloc.get zero_alloc with + | Default_zero_alloc | Check _ -> zero_alloc + | Assume { strict; arity; loc; + never_returns_normally = _; + never_raises = _} -> + Zero_alloc.create_const (Check { strict; arity; loc; opt = false }) + | Ignore_assert_all -> Zero_alloc.default + in + let (first_loc, _, _) = List.hd id_info in Signature_names.check_value names first_loc id; - let vd = Env.find_value (Pident id) newenv in + let vd, mode = Env.find_value_no_locks_exn id newenv in let vd = Subst.Lazy.force_value_description vd in - Env.register_uid vd.val_uid ~loc:vd.val_loc - ~attributes:vd.val_attributes; + let modalities = + maybe_infer_modalities ~loc:first_loc ~env ~md_mode ~mode + in + let vd = + { vd with + val_zero_alloc = zero_alloc; + val_modalities = modalities } + in Sig_value(id, vd, Exported) :: acc, Shape.Map.add_value shape_map id vd.val_uid ) ([], shape_map) - (let_bound_idents_with_modes_and_sorts defs) + (let_bound_idents_with_modes_sorts_and_checks defs) in Tstr_value(rec_flag, defs), List.rev items, @@ -2780,14 +2949,14 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = | Pstr_primitive sdesc -> let (desc, newenv) = Typedecl.transl_value_decl env loc sdesc in Signature_names.check_value names desc.val_loc desc.val_id; - Env.register_uid desc.val_val.val_uid ~loc:desc.val_val.val_loc - ~attributes:desc.val_val.val_attributes; Tstr_primitive desc, [Sig_value(desc.val_id, desc.val_val, Exported)], Shape.Map.add_value shape_map desc.val_id desc.val_val.val_uid, newenv | Pstr_type (rec_flag, sdecls) -> - let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in + let (decls, newenv, shapes) = + Typedecl.transl_type_decl env rec_flag sdecls + in List.iter Signature_names.(fun td -> check_type names td.typ_loc td.typ_id) decls; @@ -2795,34 +2964,26 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs, Exported)) decls in - let shape_map = List.fold_left - (fun shape_map -> function - | Sig_type (id, vd, _, _) -> - if not (Btype.is_row_name (Ident.name id)) then begin - Env.register_uid vd.type_uid ~loc:vd.type_loc - ~attributes:vd.type_attributes; - Shape.Map.add_type shape_map id vd.type_uid - end else shape_map - | _ -> assert false - ) + let shape_map = List.fold_left2 + (fun map { typ_id; _} shape -> + Shape.Map.add_type map typ_id shape) shape_map - items + decls + shapes in Tstr_type (rec_flag, decls), items, shape_map, enrich_type_decls anchor decls env newenv | Pstr_typext styext -> - let (tyext, newenv) = + let (tyext, newenv, shapes) = Typedecl.transl_type_extension true env loc styext in let constructors = tyext.tyext_constructors in - let shape_map = List.fold_left (fun shape_map ext -> + let shape_map = List.fold_left2 (fun shape_map ext shape -> Signature_names.check_typext names ext.ext_loc ext.ext_id; - Env.register_uid ext.ext_type.ext_uid ~loc:ext.ext_loc - ~attributes:ext.ext_attributes; - Shape.Map.add_extcons shape_map ext.ext_id ext.ext_type.ext_uid - ) shape_map constructors + Shape.Map.add_extcons shape_map ext.ext_id shape + ) shape_map constructors shapes in (Tstr_typext tyext, map_ext @@ -2831,14 +2992,10 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = shape_map, newenv) | Pstr_exception sext -> - let (ext, newenv) = Typedecl.transl_type_exception env sext in + let (ext, newenv, shape) = Typedecl.transl_type_exception env sext in let constructor = ext.tyexn_constructor in Signature_names.check_typext names constructor.ext_loc constructor.ext_id; - Env.register_uid - constructor.ext_type.ext_uid - ~loc:constructor.ext_loc - ~attributes:constructor.ext_attributes; Tstr_exception ext, [Sig_typext(constructor.ext_id, constructor.ext_type, @@ -2846,7 +3003,7 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = Exported)], Shape.Map.add_extcons shape_map constructor.ext_id - constructor.ext_type.ext_uid, + shape, newenv | Pstr_module {pmb_name = name; pmb_expr = smodl; pmb_attributes = attrs; pmb_loc; @@ -2874,7 +3031,6 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = } in let md_shape = Shape.set_uid_if_none md_shape md_uid in - Env.register_uid md_uid ~loc:pmb_loc ~attributes:attrs; (*prerr_endline (Ident.unique_toplevel_name id);*) Mtype.lower_nongen outer_scope md.md_type; let id, newenv, sg = @@ -2897,8 +3053,9 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = | Some id -> Shape.Map.add_module shape_map id md_shape | None -> shape_map in - Tstr_module {mb_id=id; mb_name=name; mb_expr=modl; - mb_presence=pres; mb_attributes=attrs; mb_loc=pmb_loc; }, + Tstr_module {mb_id=id; mb_name=name; mb_uid = md.md_uid; + mb_expr=modl; mb_presence=pres; mb_attributes=attrs; + mb_loc=pmb_loc; }, sg, shape_map, newenv @@ -2971,8 +3128,7 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = ) bindings2 in let shape_map = - List.fold_left (fun map (id, mb, uid, shape) -> - Env.register_uid uid ~loc:mb.mb_loc ~attributes:mb.mb_attributes; + List.fold_left (fun map (id, _mb, _uid, shape) -> Shape.Map.add_module map id shape ) shape_map mbs in @@ -2991,8 +3147,6 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = (* check that it is non-abstract *) let newenv, mtd, decl = transl_modtype_decl env pmtd in Signature_names.check_modtype names pmtd.pmtd_loc mtd.mtd_id; - Env.register_uid decl.mtd_uid ~loc:decl.mtd_loc - ~attributes:decl.mtd_attributes; let id = mtd.mtd_id in let map = Shape.Map.add_module_type shape_map id decl.mtd_uid in Tstr_modtype mtd, [Sig_modtype (id, decl, Exported)], map, newenv @@ -3010,12 +3164,11 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = Signature_names.check_class names loc cls.cls_id; Signature_names.check_class_type names loc cls.cls_ty_id; Signature_names.check_type names loc cls.cls_obj_id; - Env.register_uid cls.cls_decl.cty_uid ~loc - ~attributes:cls.cls_decl.cty_attributes; - let map f id acc = f acc id cls.cls_decl.cty_uid in - map Shape.Map.add_class cls.cls_id acc - |> map Shape.Map.add_class_type cls.cls_ty_id - |> map Shape.Map.add_type cls.cls_obj_id + let uid = cls.cls_decl.cty_uid in + let map f id v acc = f acc id v in + map Shape.Map.add_class cls.cls_id uid acc + |> map Shape.Map.add_class_type cls.cls_ty_id uid + |> map Shape.Map.add_type cls.cls_obj_id (Shape.leaf uid) ) shape_map classes in Tstr_class @@ -3040,12 +3193,10 @@ and type_structure ?(toplevel = None) funct_body anchor env sstr = let loc = decl.clsty_id_loc.Location.loc in Signature_names.check_class_type names loc decl.clsty_ty_id; Signature_names.check_type names loc decl.clsty_obj_id; - Env.register_uid decl.clsty_ty_decl.clty_uid - ~loc - ~attributes:decl.clsty_ty_decl.clty_attributes; - let map f id acc = f acc id decl.clsty_ty_decl.clty_uid in - map Shape.Map.add_class_type decl.clsty_ty_id acc - |> map Shape.Map.add_type decl.clsty_obj_id + let uid = decl.clsty_ty_decl.clty_uid in + let map f id v acc = f acc id v in + map Shape.Map.add_class_type decl.clsty_ty_id uid acc + |> map Shape.Map.add_type decl.clsty_obj_id (Shape.leaf uid) ) shape_map classes in Tstr_class_type @@ -3155,7 +3306,9 @@ let type_module_type_of env smod = let tmty = match smod.pmod_desc with | Pmod_ident lid -> (* turn off strengthening in this case *) - let path, md = Env.lookup_module ~loc:smod.pmod_loc lid.txt env in + let path, md, _ = + Env.lookup_module ~lock:false ~loc:smod.pmod_loc lid.txt env + in { mod_desc = Tmod_ident (path, lid); mod_type = md.md_type; mod_env = env; @@ -3168,6 +3321,12 @@ let type_module_type_of env smod = let mty = Mtype.scrape_for_type_of ~remove_aliases env tmty.mod_type in (* PR#5036: must not contain non-generalized type variables *) check_nongen_modtype env smod.pmod_loc mty; + (* for [module type of], we zap to identity modality for best legacy + compatibility *) + let mty = + remove_modality_and_zero_alloc_variables_mty env + ~zap_modality:Mode.Modality.Value.zap_to_id mty + in tmty, mty (* For Typecore *) @@ -3269,9 +3428,8 @@ let type_package env m p fl = in List.iter (fun (n, ty) -> - (* CR layouts v5: relax value requirement. *) try Ctype.unify env ty - (Ctype.newvar (Jkind.value ~why:Structure_element)) + (Ctype.newvar (Jkind.Primitive.any ~why:Dummy_jkind)) with Ctype.Unify _ -> raise (Error(modl.mod_loc, env, Scoping_pack (n,ty)))) fl'; @@ -3298,13 +3456,82 @@ let () = type_module_type_of_fwd := type_module_type_of +(* File-level details *) + +let register_params params = + List.iter + (fun param_name -> + let param = Compilation_unit.Name.of_string param_name in + Env.register_parameter param + ) + params + + (* Typecheck an implementation file *) let gen_annot outputprefix sourcefile annots = Cmt2annot.gen_annot (Some (outputprefix ^ ".annot")) ~sourcefile:(Some sourcefile) ~use_summaries:false annots -let type_implementation sourcefile outputprefix modulename initial_env ast = +let cms_register_toplevel_attributes ~sourcefile ~uid ~f ast = + (* Cms files do not store the typetree. This can be a problem for Merlin has + it uses attributes - which is why we manually construct a mapping from uid + to attributes while typing. + Generally `Pstr_attribute` and `Psig_attribute` are not needed by Merlin, + except if it is the first element of the compilation unit structure or + signature. *) + let attr = + match ast with + | x :: _ -> f x + | [] -> None + in + match attr with + | None -> () + | Some attr -> + Cms_format.register_toplevel_attributes uid + ~loc:(Location.in_file sourcefile) + ~attributes:[ attr ] + +let cms_register_toplevel_struct_attributes ~sourcefile ~uid ast = + cms_register_toplevel_attributes ~sourcefile ~uid ast + ~f:(function + | { pstr_desc = Pstr_attribute attr; _ } -> Some attr + | _ -> None) + +let check_argument_type_if_given env sourcefile actual_sig arg_module_opt = + match arg_module_opt with + | None -> None + | Some arg_module -> + let arg_import = + (* This will soon be converting from one type to another *) + arg_module + in + (* CR lmaurer: This "look for known name in path" code is duplicated + all over the place. *) + let basename = arg_import |> Compilation_unit.Name.to_string in + let arg_filename = + try + Load_path.find_uncap (basename ^ ".cmi") + with Not_found -> + raise(Error(Location.none, Env.empty, + Cannot_find_argument_type arg_module)) in + let arg_sig = + Env.read_signature arg_module arg_filename ~add_binding:false in + if not (Env.is_parameter_unit arg_import) then + raise (Error (Location.none, env, + Argument_for_non_parameter (arg_module, arg_filename))); + let coercion = + Includemod.compunit_as_argument env sourcefile actual_sig + arg_filename arg_sig + in + Some { ai_signature = arg_sig; + ai_coercion_from_primary = coercion; + } + +let type_implementation ~sourcefile outputprefix modulename initial_env ast = + let error e = + raise (Error (Location.in_file sourcefile, initial_env, e)) + in Cmt_format.clear (); Misc.try_finally (fun () -> Typecore.reset_delayed_checks (); @@ -3313,19 +3540,28 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = Env.reset_probes (); if !Clflags.print_types then (* #7656 *) ignore @@ Warnings.parse_options false "-32-34-37-38-60"; + if !Clflags.as_parameter then + error Cannot_compile_implementation_as_parameter; + register_params !Clflags.parameters; let (str, sg, names, shape, finalenv) = Profile.record_call "infer" (fun () -> type_structure initial_env ast) in - let shape = - Shape.set_uid_if_none shape - (Uid.of_compilation_unit_id modulename) - in + let uid = Uid.of_compilation_unit_id modulename in + let shape = Shape.set_uid_if_none shape uid in + if !Clflags.binary_annotations_cms then + cms_register_toplevel_struct_attributes ~sourcefile ~uid ast; let simple_sg = Signature_names.simplify finalenv names sg in if !Clflags.print_types then begin remove_mode_and_jkind_variables finalenv sg; + let simple_sg = + (* Printing [.mli] from [.ml], we zap to identity modality for legacy + compatibility. *) + remove_modality_and_zero_alloc_variables_sg finalenv + ~zap_modality:Mode.Modality.Value.zap_to_id simple_sg + in Typecore.force_delayed_checks (); Typecore.optimise_allocations (); - let shape = Shape.local_reduce shape in + let shape = Shape_reduce.local_reduce Env.empty shape in Printtyp.wrap_printing_env ~error:false initial_env (fun () -> fprintf std_formatter "%a@." (Printtyp.printed_signature sourcefile) simple_sg @@ -3334,16 +3570,22 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = { structure = str; coercion = Tcoerce_none; shape; - signature = simple_sg + signature = simple_sg; + argument_interface = None; } (* result is ignored by Compile.implementation *) end else begin + let arg_type = + !Clflags.as_argument_for + |> Option.map Compilation_unit.Name.of_string + in let sourceintf = Filename.remove_extension sourcefile ^ !Config.interface_suffix in if !Clflags.cmi_file <> None || Sys.file_exists sourceintf then begin + let import = Compilation_unit.name modulename in let intf_file = match !Clflags.cmi_file with | None -> - let basename = modulename |> Compilation_unit.name_as_string in + let basename = import |> Compilation_unit.Name.to_string in (try Load_path.find_uncap (basename ^ ".cmi") with Not_found -> @@ -3352,30 +3594,51 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = | Some cmi_file -> cmi_file in let dclsig = - Env.read_signature modulename intf_file ~add_binding:false + Env.read_signature import intf_file ~add_binding:false in + if Env.is_parameter_unit import then + error (Cannot_implement_parameter (import, intf_file)); + let arg_type_from_cmi = Env.implemented_parameter import in + if not (Option.equal Compilation_unit.Name.equal + arg_type arg_type_from_cmi) then + error (Inconsistent_argument_types + { new_arg_type = arg_type; old_source_file = intf_file; + old_arg_type = arg_type_from_cmi }); let coercion, shape = Profile.record_call "check_sig" (fun () -> Includemod.compunit initial_env ~mark:Mark_positive sourcefile sg intf_file dclsig shape) in + (* Check the _mli_ against the argument type, since the mli determines + the visible type of the module and that's what needs to conform to + the argument type. + + This is somewhat redundant with the checking that was done when + compiling the .mli. However, this isn't just a boolean check - we + need to get the coercion out. An alternative would be to store the + coercion in the .cmi if we can sort out the dependency issues + ([Tcoerce_primitive] is a pain in particular). *) + let argument_interface = + check_argument_type_if_given initial_env intf_file dclsig arg_type + in Typecore.force_delayed_checks (); Typecore.optimise_allocations (); (* It is important to run these checks after the inclusion test above, so that value declarations which are not used internally but exported are not reported as being unused. *) Profile.record_call "save_cmt" (fun () -> - let shape = Shape.local_reduce shape in + let shape = Shape_reduce.local_reduce Env.empty shape in let annots = Cmt_format.Implementation str in Cmt_format.save_cmt (outputprefix ^ ".cmt") modulename annots (Some sourcefile) initial_env None (Some shape); Cms_format.save_cms (outputprefix ^ ".cms") modulename - (Some sourcefile) (Some shape); + annots (Some sourcefile) (Some shape); gen_annot outputprefix sourcefile annots); { structure = str; coercion; shape; - signature = dclsig + signature = dclsig; + argument_interface; } end else begin Location.prerr_warning (Location.in_file sourcefile) @@ -3386,33 +3649,47 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = sourcefile sg "(inferred signature)" simple_sg shape) in check_nongen_signature finalenv simple_sg; + let simple_sg = + (* Generating [cmi] without [mli]. This [cmi] will only be on the + LHS of inclusion check, so we zap to floor (strongest). *) + remove_modality_and_zero_alloc_variables_sg finalenv + ~zap_modality:Mode.Modality.Value.zap_to_floor simple_sg + in normalize_signature simple_sg; + let argument_interface = + check_argument_type_if_given initial_env sourcefile simple_sg arg_type + in Typecore.force_delayed_checks (); Typecore.optimise_allocations (); (* See comment above. Here the target signature contains all the values being exported. We can still capture unused declarations like "let x = true;; let x = 1;;", because in this case, the inferred signature contains only the last declaration. *) - let shape = Shape.local_reduce shape in + let shape = Shape_reduce.local_reduce Env.empty shape in if not !Clflags.dont_write_files then begin let alerts = Builtin_attributes.alerts_of_str ast in + let name = Compilation_unit.name modulename in + let kind = + Cmi_format.Normal { cmi_impl = modulename; cmi_arg_for = arg_type } + in let cmi = Profile.record_call "save_cmi" (fun () -> Env.save_signature ~alerts - simple_sg modulename (outputprefix ^ ".cmi")) + simple_sg name kind (outputprefix ^ ".cmi")) in Profile.record_call "save_cmt" (fun () -> let annots = Cmt_format.Implementation str in Cmt_format.save_cmt (outputprefix ^ ".cmt") modulename annots (Some sourcefile) initial_env (Some cmi) (Some shape); Cms_format.save_cms (outputprefix ^ ".cms") modulename - (Some sourcefile) (Some shape); + annots (Some sourcefile) (Some shape); gen_annot outputprefix sourcefile annots) end; { structure = str; coercion; shape; - signature = simple_sg + signature = simple_sg; + argument_interface } end end @@ -3426,7 +3703,7 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = Cmt_format.save_cmt (outputprefix ^ ".cmt") modulename annots (Some sourcefile) initial_env None None; Cms_format.save_cms (outputprefix ^ ".cms") modulename - (Some sourcefile) None; + annots (Some sourcefile) None; gen_annot outputprefix sourcefile annots) ) @@ -3434,10 +3711,37 @@ let save_signature modname tsg outputprefix source_file initial_env cmi = Cmt_format.save_cmt (outputprefix ^ ".cmti") modname (Cmt_format.Interface tsg) (Some source_file) initial_env (Some cmi) None; Cms_format.save_cms (outputprefix ^ ".cmsi") modname - (Some source_file) None + (Cmt_format.Interface tsg) (Some source_file) None -let type_interface env ast = - transl_signature env ast +let cms_register_toplevel_signature_attributes ~sourcefile ~uid ast = + cms_register_toplevel_attributes ~sourcefile ~uid ast + ~f:(function + | { psig_desc = Psig_attribute attr; _ } -> Some attr + | _ -> None) + +let type_interface ~sourcefile modulename env ast = + let error e = + raise (Error (Location.none, Env.empty, e)) + in + if !Clflags.as_parameter && Compilation_unit.is_packed modulename then begin + error Cannot_pack_parameter + end; + if !Clflags.as_parameter && !Clflags.parameters <> [] then begin + error Compiling_as_parameterised_parameter + end; + register_params !Clflags.parameters; + if !Clflags.binary_annotations_cms then begin + let uid = Shape.Uid.of_compilation_unit_id modulename in + cms_register_toplevel_signature_attributes ~uid ~sourcefile ast + end; + let sg = transl_signature env ast in + let arg_type = + !Clflags.as_argument_for + |> Option.map Compilation_unit.Name.of_string + in + ignore (check_argument_type_if_given env sourcefile sg.sig_type arg_type + : Typedtree.argument_interface option); + sg (* "Packaging" of several compilation units into one unit having them as sub-modules. *) @@ -3487,13 +3791,13 @@ let package_units initial_env objfiles cmifile modulename = in let modname = Compilation_unit.create_child modulename unit in let sg = - Env.read_signature modname (pref ^ ".cmi") ~add_binding:false in + Env.read_signature unit (pref ^ ".cmi") ~add_binding:false in if Filename.check_suffix f ".cmi" && not(Mtype.no_code_needed_sig (Lazy.force Env.initial) sg) then raise(Error(Location.none, Env.empty, Implementation_is_required f)); Compilation_unit.name modname, - Env.read_signature modname (pref ^ ".cmi") ~add_binding:false) + Env.read_signature unit (pref ^ ".cmi") ~add_binding:false) objfiles in (* Compute signature of packaged unit *) Ident.reinit(); @@ -3516,7 +3820,8 @@ let package_units initial_env objfiles cmifile modulename = raise(Error(Location.in_file mlifile, Env.empty, Interface_not_compiled mlifile)) end; - let dclsig = Env.read_signature modulename cmifile ~add_binding:false in + let name = Compilation_unit.name modulename in + let dclsig = Env.read_signature name cmifile ~add_binding:false in let cc, _shape = Includemod.compunit initial_env ~mark:Mark_both "(obtained by packing)" sg mlifile dclsig shape @@ -3524,7 +3829,7 @@ let package_units initial_env objfiles cmifile modulename = Cmt_format.save_cmt (prefix ^ ".cmt") modulename (Cmt_format.Packed (sg, objfiles)) None initial_env None (Some shape); Cms_format.save_cms (prefix ^ ".cms") modulename - None (Some shape); + (Cmt_format.Packed (sg, objfiles)) None (Some shape); cc end else begin (* Determine imports *) @@ -3536,17 +3841,22 @@ let package_units initial_env objfiles cmifile modulename = (Env.imports()) in (* Write packaged signature *) if not !Clflags.dont_write_files then begin + let cmi_arg_for = + (* Packs aren't supported as arguments *) + None + in + let name = Compilation_unit.name modulename in + let kind = Cmi_format.Normal { cmi_impl = modulename; cmi_arg_for } in let cmi = Env.save_signature_with_imports ~alerts:Misc.Stdlib.String.Map.empty - sg modulename - (prefix ^ ".cmi") (Array.of_list imports) + sg name kind (prefix ^ ".cmi") (Array.of_list imports) in let sign = Subst.Lazy.force_signature cmi.Cmi_format.cmi_sign in Cmt_format.save_cmt (prefix ^ ".cmt") modulename (Cmt_format.Packed (sign, objfiles)) None initial_env (Some cmi) (Some shape); Cms_format.save_cms (prefix ^ ".cms") modulename - None (Some shape); + (Cmt_format.Packed (sign, objfiles)) None (Some shape); end; Tcoerce_none end @@ -3634,6 +3944,12 @@ let report_error ~loc _env = function Location.errorf ~loc "This `with' constraint@ %s := %a@ makes a packed module ill-formed." (Path.name p) Printtyp.modtype mty + | With_package_manifest (lid, ty) -> + Location.errorf ~loc + "In the constrained signature, type %a is defined to be %a.@ \ + Package `with' constraints may only be used on abstract types." + longident lid + Printtyp.type_expr ty | Repeated_name(kind, name) -> Location.errorf ~loc "@[Multiple definition of the %s name %s.@ \ @@ -3760,8 +4076,8 @@ let report_error ~loc _env = function (Path.name p) | Toplevel_nonvalue (id, sort) -> Location.errorf ~loc - "@[Top-level module bindings must have layout value, but@ \ - %s has layout@ %a.@]" id Jkind.Sort.format sort + "@[Types of top-level module bindings must have layout value, but@ \ + the type of %s has layout@ %a.@]" id Jkind.Sort.format sort | Strengthening_mismatch(lid, explanation) -> let main = Includemod_errorprinter.err_msgs explanation in Location.errorf ~loc @@ -3770,9 +4086,54 @@ let report_error ~loc _env = function does not match the underlying type@]@ \ %t@]" longident lid main + | Cannot_pack_parameter -> + Location.errorf ~loc + "Cannot compile a parameter with -for-pack." + | Compiling_as_parameterised_parameter -> + Location.errorf ~loc + "@[Cannot combine -as-parameter with -parameter: parameters cannot@ \ + be parameterised.@]" + | Cannot_compile_implementation_as_parameter -> + Location.errorf ~loc + "Cannot compile an implementation with -as-parameter." + | Cannot_implement_parameter(modname, _filename) -> + Location.errorf ~loc + "@[The interface for %a@ was compiled with -as-parameter.@ \ + It cannot be implemented directly.@]" + Compilation_unit.Name.print modname + | Argument_for_non_parameter(param, path) -> + Location.errorf ~loc + "Interface %s@ found for module@ %a@ is not flagged as a parameter.@ \ + It cannot be the parameter type for this argument module." + path + Compilation_unit.Name.print param + | Inconsistent_argument_types + { new_arg_type; old_source_file; old_arg_type } -> + let pp_arg_type ppf arg_type = + match arg_type with + | None -> Format.fprintf ppf "without -as-argument-for" + | Some arg_type -> + Format.fprintf ppf "with -as-argument-for %a" + Compilation_unit.Name.print arg_type + in + Location.errorf ~loc + "Inconsistent usage of -as-argument-for. Interface@ %s@ was compiled \ + %a@ but this module is being compiled@ %a." + old_source_file + pp_arg_type old_arg_type + pp_arg_type new_arg_type + | Cannot_find_argument_type arg_type -> + Location.errorf ~loc + "Parameter module %a@ specified by -as-argument-for cannot be found." + Compilation_unit.Name.print arg_type + | Submode_failed (Error (ax, {left; right})) -> + Location.errorf ~loc + "This value is %a, but expected to be %a because it is inside a module." + (Mode.Value.Const.print_axis ax) left + (Mode.Value.Const.print_axis ax) right let report_error env ~loc err = - Printtyp.wrap_printing_env ~error:true env + Printtyp.wrap_printing_env_error env (fun () -> report_error env ~loc err) let () = diff --git a/typing/typemod.mli b/typing/typemod.mli index 1bbb3044db0..825660e3d7b 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -39,10 +39,11 @@ val type_toplevel_phrase: Typedtree.structure * Types.signature * Signature_names.t * Shape.t * Env.t val type_implementation: - string -> string -> Compilation_unit.t -> Env.t -> + sourcefile:string -> string -> Compilation_unit.t -> Env.t -> Parsetree.structure -> Typedtree.implementation val type_interface: - Env.t -> Parsetree.signature -> Typedtree.signature + sourcefile:string -> Compilation_unit.t -> Env.t -> + Parsetree.signature -> Typedtree.signature val transl_signature: Env.t -> Parsetree.signature -> Typedtree.signature val check_nongen_signature: @@ -76,6 +77,8 @@ module Sig_component_kind : sig type t = | Value | Type + | Constructor + | Label | Module | Module_type | Extension_constructor @@ -124,6 +127,7 @@ type error = Longident.t * Path.t * Includemod.explanation | With_changes_module_alias of Longident.t * Ident.t * Path.t | With_cannot_remove_constrained_type + | With_package_manifest of Longident.t * type_expr | Repeated_name of Sig_component_kind.t * string | Non_generalizable of { vars : type_expr list; expression : type_expr } | Non_generalizable_module of @@ -146,6 +150,18 @@ type error = | With_cannot_remove_packed_modtype of Path.t * module_type | Toplevel_nonvalue of string * Jkind.sort | Strengthening_mismatch of Longident.t * Includemod.explanation + | Cannot_pack_parameter + | Compiling_as_parameterised_parameter + | Cannot_compile_implementation_as_parameter + | Cannot_implement_parameter of Compilation_unit.Name.t * Misc.filepath + | Argument_for_non_parameter of Compilation_unit.Name.t * Misc.filepath + | Cannot_find_argument_type of Compilation_unit.Name.t + | Inconsistent_argument_types of { + new_arg_type: Compilation_unit.Name.t option; + old_arg_type: Compilation_unit.Name.t option; + old_source_file: Misc.filepath; + } + | Submode_failed of Mode.Value.error exception Error of Location.t * Env.t * error exception Error_forward of Location.error diff --git a/typing/typemode.ml b/typing/typemode.ml new file mode 100644 index 00000000000..3401c7abb80 --- /dev/null +++ b/typing/typemode.ml @@ -0,0 +1,152 @@ +open Location +open Mode +open Jane_syntax + +type error = + | Duplicated_mode : ('a, 'b) Axis.t -> error + | Unrecognized_mode of string + | Unrecognized_modality of string + +exception Error of Location.t * error + +let transl_mode_annots modes = + let rec loop (acc : Alloc.Const.Option.t) = function + | [] -> acc + | m :: rest -> + let { txt; loc } = (m : Mode_expr.Const.t :> _ Location.loc) in + Jane_syntax_parsing.assert_extension_enabled ~loc Mode + Language_extension.Stable; + let acc : Alloc.Const.Option.t = + match txt with + (* CR zqian: We should interpret other mode names (global, shared, once) + as well. We can't do that yet because of the CR below. *) + | "local" -> ( + match acc.areality with + | None -> { acc with areality = Some Local } + | Some _ -> raise (Error (loc, Duplicated_mode Areality))) + | "unique" -> ( + match acc.uniqueness with + | None -> { acc with uniqueness = Some Unique } + | Some _ -> raise (Error (loc, Duplicated_mode Uniqueness))) + | "once" -> ( + match acc.linearity with + | None -> { acc with linearity = Some Once } + | Some _ -> raise (Error (loc, Duplicated_mode Linearity))) + | "nonportable" -> ( + match acc.portability with + | None -> { acc with portability = Some Nonportable } + | Some _ -> raise (Error (loc, Duplicated_mode Portability))) + | "uncontended" -> ( + match acc.contention with + | None -> { acc with contention = Some Uncontended } + | Some _ -> raise (Error (loc, Duplicated_mode Contention))) + | "portable" -> ( + match acc.portability with + | None -> { acc with portability = Some Portable } + | Some _ -> raise (Error (loc, Duplicated_mode Portability))) + | "contended" -> ( + match acc.contention with + | None -> { acc with contention = Some Contended } + | Some _ -> raise (Error (loc, Duplicated_mode Contention))) + | s -> raise (Error (loc, Unrecognized_mode s)) + in + loop acc rest + in + loop Alloc.Const.Option.none modes.txt + +let transl_modality ~maturity m : Modality.t = + let { txt; loc } = m in + let (Parsetree.Modality s) = txt in + Jane_syntax_parsing.assert_extension_enabled ~loc Mode maturity; + match s with + | "global" -> Atom (Comonadic Areality, Meet_with Regionality.Const.Global) + | "local" -> Atom (Comonadic Areality, Meet_with Regionality.Const.Local) + | "many" -> Atom (Comonadic Linearity, Meet_with Linearity.Const.Many) + | "once" -> Atom (Comonadic Linearity, Meet_with Linearity.Const.Once) + | "shared" -> Atom (Monadic Uniqueness, Join_with Uniqueness.Const.Shared) + | "unique" -> Atom (Monadic Uniqueness, Join_with Uniqueness.Const.Unique) + | "portable" -> + Atom (Comonadic Portability, Meet_with Portability.Const.Portable) + | "nonportable" -> + Atom (Comonadic Portability, Meet_with Portability.Const.Nonportable) + | "contended" -> + Atom (Monadic Contention, Join_with Contention.Const.Contended) + | "uncontended" -> + Atom (Monadic Contention, Join_with Contention.Const.Uncontended) + | s -> raise (Error (loc, Unrecognized_modality s)) + +let untransl_modalities ~loc m : Parsetree.modality loc list = + let untransl_atom (a : Modality.t) = + let s = + match a with + | Atom (Comonadic Areality, Meet_with Regionality.Const.Global) -> + "global" + | Atom (Comonadic Areality, Meet_with Regionality.Const.Local) -> "local" + | Atom (Comonadic Linearity, Meet_with Linearity.Const.Many) -> "many" + | Atom (Comonadic Linearity, Meet_with Linearity.Const.Once) -> "once" + | Atom (Monadic Uniqueness, Join_with Uniqueness.Const.Shared) -> "shared" + | Atom (Monadic Uniqueness, Join_with Uniqueness.Const.Unique) -> "unique" + | Atom (Comonadic Portability, Meet_with Portability.Const.Portable) -> + "portable" + | Atom (Comonadic Portability, Meet_with Portability.Const.Nonportable) -> + "nonportable" + | Atom (Monadic Contention, Join_with Contention.Const.Contended) -> + "contended" + | Atom (Monadic Contention, Join_with Contention.Const.Uncontended) -> + "uncontended" + | _ -> failwith "BUG: impossible modality atom" + in + { txt = Parsetree.Modality s; loc } + in + Modality.Value.Const.to_list m |> List.map untransl_atom + +let compose_modalities modalities = + (* The ordering: + type r = { x : string @@ foo bar hello } + is interpreted as + x = foo (bar (hello (r))) *) + List.fold_right + (fun atom m -> Modality.Value.Const.compose ~then_:atom m) + modalities Modality.Value.Const.id + +let mutable_implied_modalities : Modality.t list = + [ Atom (Comonadic Areality, Meet_with Regionality.Const.Global); + Atom (Comonadic Linearity, Meet_with Linearity.Const.Many); + Atom (Monadic Uniqueness, Join_with Uniqueness.Const.Shared) ] + +let is_mutable_implied_modality m = + (* polymorphic equality suffices for now. *) + List.mem m mutable_implied_modalities + +let transl_modalities ~maturity ~has_mutable_implied_modalities modalities = + let modalities = List.map (transl_modality ~maturity) modalities in + let modalities = + if has_mutable_implied_modalities + then modalities @ mutable_implied_modalities + else modalities + in + compose_modalities modalities + +let transl_alloc_mode modes = + let opt = transl_mode_annots modes in + Alloc.Const.Option.value opt ~default:Alloc.Const.legacy + +open Format + +let report_error ppf = function + | Duplicated_mode ax -> + let ax = + match ax with + | Areality -> dprintf "locality" + | _ -> dprintf "%a" Axis.print ax + in + fprintf ppf "The %t axis has already been specified." ax + | Unrecognized_mode s -> fprintf ppf "Unrecognized mode name %s." s + | Unrecognized_modality s -> fprintf ppf "Unrecognized modality %s." s + +let mutable_implied_modalities = compose_modalities mutable_implied_modalities + +let () = + Location.register_error_of_exn (function + | Error (loc, err) -> Some (Location.error_of_printer ~loc report_error err) + | _ -> None) diff --git a/typing/typemode.mli b/typing/typemode.mli new file mode 100644 index 00000000000..0bbd27fa0ce --- /dev/null +++ b/typing/typemode.mli @@ -0,0 +1,23 @@ +(** Interpret mode syntax as mode annotation, where axes can be left unspecified *) +val transl_mode_annots : Jane_syntax.Mode_expr.t -> Mode.Alloc.Const.Option.t + +(** Interpret mode syntax as alloc mode (on arrow types), where axes are set to + legacy if unspecified *) +val transl_alloc_mode : Jane_syntax.Mode_expr.t -> Mode.Alloc.Const.t + +(** Interpret mode syntax as modalities. Modalities occuring at different places + requires different levels of maturity. *) +val transl_modalities : + maturity:Language_extension.maturity -> + has_mutable_implied_modalities:bool -> + Parsetree.modality Location.loc list -> + Mode.Modality.Value.Const.t + +val untransl_modalities : + loc:Location.t -> + Mode.Modality.Value.Const.t -> + Parsetree.modality Location.loc list + +val is_mutable_implied_modality : Mode.Modality.t -> bool + +val mutable_implied_modalities : Mode.Modality.Value.Const.t diff --git a/typing/typeopt.ml b/typing/typeopt.ml index 51e6cfccd4b..ed14985e860 100644 --- a/typing/typeopt.ml +++ b/typing/typeopt.ml @@ -17,7 +17,6 @@ open Path open Types -open Asttypes open Typedtree open Lambda @@ -27,6 +26,9 @@ type error = | Sort_without_extension of Jkind.Sort.t * Language_extension.maturity * type_expr option | Non_value_sort_unknown_ty of Jkind.Sort.t + | Small_number_sort_without_extension of Jkind.Sort.t * type_expr option + | Not_a_sort of type_expr * Jkind.Violation.t + | Unsupported_sort of Jkind.Sort.const exception Error of Location.t * error @@ -81,15 +83,15 @@ let is_base_type env ty base_ty_path = | _ -> false let is_always_gc_ignorable env ty = - let jkind = + let ext : Jkind.Externality.t = (* We check that we're compiling to (64-bit) native code before counting - immediate64 types as gc_ignorable, because bytecode is intended to be + External64 types as gc_ignorable, because bytecode is intended to be platform independent. *) if !Clflags.native_code && Sys.word_size = 64 - then Jkind.immediate64 ~why:Gc_ignorable_check - else Jkind.immediate ~why:Gc_ignorable_check + then External64 + else External in - Result.is_ok (Ctype.check_type_jkind env ty jkind) + Ctype.check_type_externality env ty ext let maybe_pointer_type env ty = let ty = scrape_ty env ty in @@ -97,19 +99,33 @@ let maybe_pointer_type env ty = let maybe_pointer exp = maybe_pointer_type exp.exp_env exp.exp_type +(* CR layouts v2.8: Calling [type_legacy_sort] in [typeopt] is not ideal + and this function should be removed at some point. To do that, there + needs to be a way to store sort vars on [Tconstr]s. That means + either introducing a [Tpoly_constr], allow type parameters with + sort info, or do something else. *) +(* CR layouts v3.0: have a better error message + for nullable jkinds.*) +let type_legacy_sort ~why env loc ty = + match Ctype.type_legacy_sort ~why env ty with + | Ok sort -> sort + | Error err -> raise (Error (loc, Not_a_sort (ty, err))) + type classification = | Int (* any immediate type *) | Float + | Unboxed_float of unboxed_float + | Unboxed_int of unboxed_integer | Lazy | Addr (* anything except a float or a lazy *) | Any (* Classify a ty into a [classification]. Looks through synonyms, using [scrape_ty]. Returning [Any] is safe, though may skip some optimizations. *) -(* CR layouts v2.5: when we allow [float# array] or [float# lazy], this should - be updated to check for unboxed float. *) -let classify env ty : classification = +let classify env loc ty sort : classification = let ty = scrape_ty env ty in + match Jkind.(Sort.default_to_value_and_get sort) with + | Value -> begin if is_always_gc_ignorable env ty then Int else match get_desc ty with | Tvar _ | Tunivar _ -> @@ -121,6 +137,7 @@ let classify env ty : classification = || Path.same p Predef.path_bytes || Path.same p Predef.path_array || Path.same p Predef.path_nativeint + || Path.same p Predef.path_float32 || Path.same p Predef.path_int32 || Path.same p Predef.path_int64 then Addr else begin @@ -140,16 +157,32 @@ let classify env ty : classification = Addr | Tlink _ | Tsubst _ | Tpoly _ | Tfield _ -> assert false - -let array_type_kind env ty = + end + | Float64 -> Unboxed_float Pfloat64 + | Float32 -> Unboxed_float Pfloat32 + | Bits32 -> Unboxed_int Pint32 + | Bits64 -> Unboxed_int Pint64 + | Word -> Unboxed_int Pnativeint + | Void -> + raise (Error (loc, Unsupported_sort Void)) + +let array_type_kind ~elt_sort env loc ty = match scrape_poly env ty with | Tconstr(p, [elt_ty], _) when Path.same p Predef.path_array || Path.same p Predef.path_iarray -> - begin match classify env elt_ty with + let elt_sort = + match elt_sort with + | Some s -> s + | None -> + type_legacy_sort ~why:Array_element env loc elt_ty + in + begin match classify env loc elt_ty elt_sort with | Any -> if Config.flat_float_array then Pgenarray else Paddrarray | Float -> if Config.flat_float_array then Pfloatarray else Paddrarray | Addr | Lazy -> Paddrarray | Int -> Pintarray + | Unboxed_float f -> Punboxedfloatarray f + | Unboxed_int i -> Punboxedintarray i end | Tconstr(p, [], _) when Path.same p Predef.path_floatarray -> Pfloatarray @@ -157,9 +190,15 @@ let array_type_kind env ty = (* This can happen with e.g. Obj.field *) Pgenarray -let array_kind exp = array_type_kind exp.exp_env exp.exp_type +let array_kind exp elt_sort = + array_type_kind + ~elt_sort:(Some elt_sort) + exp.exp_env exp.exp_loc exp.exp_type -let array_pattern_kind pat = array_type_kind pat.pat_env pat.pat_type +let array_pattern_kind pat elt_sort = + array_type_kind + ~elt_sort:(Some elt_sort) + pat.pat_env pat.pat_loc pat.pat_type let bigarray_decode_type env ty tbl dfl = match scrape env ty with @@ -197,12 +236,16 @@ let bigarray_type_kind_and_layout env typ = (Pbigarray_unknown, Pbigarray_unknown_layout) let value_kind_of_value_jkind jkind = - match Jkind.get_default_value jkind with - | Value -> Pgenval - | Immediate -> Pintval - | Immediate64 -> + let const_jkind = Jkind.default_to_value_and_get jkind in + let externality_upper_bound = + Jkind.Const.get_externality_upper_bound const_jkind + in + (* CR: assert the sort is a value *) + match externality_upper_bound with + | External -> Pintval + | External64 -> if !Clflags.native_code && Sys.word_size = 64 then Pintval else Pgenval - | Any | Void | Float64 -> assert false + | Internal -> Pgenval (* [value_kind] has a pre-condition that it is only called on values. With the current set of sort restrictions, there are two reasons this invariant may @@ -304,13 +347,13 @@ let rec value_kind env ~loc ~visited ~depth ~num_nodes_visited ty This should be understood, but for now the simple fall back thing is sufficient. *) - match Ctype.check_type_jkind env scty (Jkind.value ~why:V1_safety_check) + match Ctype.check_type_jkind env scty (Jkind.Primitive.value_or_null ~why:V1_safety_check) with | Ok _ -> () | Error _ -> match Ctype.(check_type_jkind env - (correct_levels ty) (Jkind.value ~why:V1_safety_check)) + (correct_levels ty) (Jkind.Primitive.value_or_null ~why:V1_safety_check)) with | Ok _ -> () | Error violation -> @@ -324,7 +367,9 @@ let rec value_kind env ~loc ~visited ~depth ~num_nodes_visited ty | Tconstr(p, _, _) when Path.same p Predef.path_char -> num_nodes_visited, Pintval | Tconstr(p, _, _) when Path.same p Predef.path_float -> - num_nodes_visited, Pfloatval + num_nodes_visited, (Pboxedfloatval Pfloat64) + | Tconstr(p, _, _) when Path.same p Predef.path_float32 -> + num_nodes_visited, (Pboxedfloatval Pfloat32) | Tconstr(p, _, _) when Path.same p Predef.path_int32 -> num_nodes_visited, (Pboxedintval Pint32) | Tconstr(p, _, _) when Path.same p Predef.path_int64 -> @@ -346,7 +391,9 @@ let rec value_kind env ~loc ~visited ~depth ~num_nodes_visited ty | Tconstr(p, _, _) when (Path.same p Predef.path_array || Path.same p Predef.path_floatarray) -> - num_nodes_visited, Parrayval (array_type_kind env ty) + (* CR layouts: [~elt_sort:None] here is bad for performance. To + fix it, we need a place to store the sort on a [Tconstr]. *) + num_nodes_visited, Parrayval (array_type_kind ~elt_sort:None env loc ty) | Tconstr(p, _, _) -> begin let decl = try Env.find_type p env with Not_found -> raise Missing_cmi_fallback @@ -374,7 +421,7 @@ let rec value_kind env ~loc ~visited ~depth ~num_nodes_visited ty value_kind_of_value_jkind decl.type_jkind | Type_open -> num_nodes_visited, Pgenval end - | Ttuple fields -> + | Ttuple labeled_fields -> if cannot_proceed () then num_nodes_visited, Pgenval else @@ -382,17 +429,17 @@ let rec value_kind env ~loc ~visited ~depth ~num_nodes_visited ty let visited = Numbers.Int.Set.add (get_id ty) visited in let depth = depth + 1 in let num_nodes_visited, fields = - List.fold_left_map (fun num_nodes_visited field -> + List.fold_left_map (fun num_nodes_visited (_, field) -> let num_nodes_visited = num_nodes_visited + 1 in (* CR layouts v5 - this is fine because voids are not allowed in tuples. When they are, we'll need to make sure that elements are values before recurring. *) value_kind env ~loc ~visited ~depth ~num_nodes_visited field) - num_nodes_visited fields + num_nodes_visited labeled_fields in num_nodes_visited, - Pvariant { consts = []; non_consts = [0, fields] }) + Pvariant { consts = []; non_consts = [0, Constructor_uniform fields] }) | Tvariant row -> num_nodes_visited, if Ctype.tvariant_not_immediate row then Pgenval else Pintval @@ -408,47 +455,80 @@ and value_kind_variant env ~loc ~visited ~depth ~num_nodes_visited cmi, according to the comment on scrape_ty. Reevaluate whether it's needed when we deal with missing cmis. *) match cstrs with - | [{cd_args=Cstr_tuple [ty,_]}] + | [{cd_args=Cstr_tuple [{ca_type=ty}]}] | [{cd_args=Cstr_record [{ld_type=ty}]}] -> value_kind env ~loc ~visited ~depth ~num_nodes_visited ty | _ -> assert false end - | Variant_boxed _jkinds -> + | Variant_boxed cstrs_and_jkinds -> let depth = depth + 1 in + let for_constructor_fields fields ~depth ~num_nodes_visited ~field_to_type = + List.fold_left_map + (fun num_nodes_visited field -> + let ty = field_to_type field in + let num_nodes_visited = num_nodes_visited + 1 in + value_kind env ~loc ~visited ~depth ~num_nodes_visited ty) + num_nodes_visited + fields + in + let for_one_uniform_value_constructor + fields ~field_to_type ~depth ~num_nodes_visited = + let num_nodes_visited, fields = + for_constructor_fields fields ~depth ~num_nodes_visited ~field_to_type + in + num_nodes_visited, Lambda.Constructor_uniform fields + in + let for_one_mixed_constructor fields ~value_prefix_len ~flat_suffix + ~field_to_type ~depth ~num_nodes_visited = + let value_prefix, _ = + Misc.Stdlib.List.split_at value_prefix_len fields + in + assert (List.length value_prefix = value_prefix_len); + let num_nodes_visited, value_prefix = + for_constructor_fields value_prefix ~depth ~num_nodes_visited + ~field_to_type + in + num_nodes_visited + Array.length flat_suffix, + Lambda.Constructor_mixed + { value_prefix; flat_suffix = Array.to_list flat_suffix } + in let for_one_constructor (constructor : Types.constructor_declaration) - ~depth ~num_nodes_visited = + ~depth ~num_nodes_visited + ~(cstr_shape : Types.constructor_representation) = let num_nodes_visited = num_nodes_visited + 1 in match constructor.cd_args with | Cstr_tuple fields -> + let field_to_type { Types.ca_type } = ca_type in let num_nodes_visited, fields = - List.fold_left_map - (fun num_nodes_visited (ty, _) -> - let num_nodes_visited = num_nodes_visited + 1 in - (* CR layouts v5: when we add other layouts, we'll need to check - here that we aren't about to call value_kind on a different - sort (we can get this info from the variant representation). - For now we rely on the layout check at the top of value_kind - to rule out void. *) - value_kind env ~loc ~visited ~depth ~num_nodes_visited ty) - num_nodes_visited fields + match cstr_shape with + | Constructor_uniform_value -> + for_one_uniform_value_constructor fields ~field_to_type + ~depth ~num_nodes_visited + | Constructor_mixed { value_prefix_len; flat_suffix } -> + for_one_mixed_constructor fields + ~value_prefix_len ~flat_suffix ~field_to_type + ~depth ~num_nodes_visited in (false, num_nodes_visited), fields | Cstr_record labels -> - List.fold_left_map - (fun (is_mutable, num_nodes_visited) - (label:Types.label_declaration) -> - let is_mutable = - match label.ld_mutable with - | Mutable -> true - | Immutable -> is_mutable - in - let num_nodes_visited = num_nodes_visited + 1 in - let num_nodes_visited, field = - value_kind env ~loc ~visited ~depth ~num_nodes_visited - label.ld_type - in - (is_mutable, num_nodes_visited), field) - (false, num_nodes_visited) labels + let field_to_type (lbl:Types.label_declaration) = lbl.ld_type in + let is_mutable = + List.exists + (fun (lbl:Types.label_declaration) -> + Types.is_mutable lbl.ld_mutable) + labels + in + let num_nodes_visited, fields = + match cstr_shape with + | Constructor_uniform_value -> + for_one_uniform_value_constructor labels ~field_to_type + ~depth ~num_nodes_visited + | Constructor_mixed { value_prefix_len; flat_suffix } -> + for_one_mixed_constructor labels + ~value_prefix_len ~flat_suffix ~field_to_type + ~depth ~num_nodes_visited + in + (is_mutable, num_nodes_visited), fields in let is_constant (cstr: Types.constructor_declaration) = (* CR layouts v5: This won't count constructors with void args as @@ -460,25 +540,31 @@ and value_kind_variant env ~loc ~visited ~depth ~num_nodes_visited if List.for_all is_constant cstrs then (num_nodes_visited, Pintval) else - let result = - List.fold_left (fun result constructor -> + let _idx, result = + List.fold_left (fun (idx, result) constructor -> + idx+1, match result with | None -> None | Some (num_nodes_visited, next_const, consts, next_tag, non_consts) -> + let cstr_shape, _ = cstrs_and_jkinds.(idx) in let (is_mutable, num_nodes_visited), fields = for_one_constructor constructor ~depth ~num_nodes_visited + ~cstr_shape in if is_mutable then None - else if List.compare_length_with fields 0 = 0 then + else match fields with + | Constructor_uniform xs when List.compare_length_with xs 0 = 0 -> let consts = next_const :: consts in Some (num_nodes_visited, next_const + 1, consts, next_tag, non_consts) - else - let non_consts = (next_tag, fields) :: non_consts in + | Constructor_mixed _ | Constructor_uniform _ -> + let non_consts = + (next_tag, fields) :: non_consts + in Some (num_nodes_visited, next_const, consts, next_tag + 1, non_consts)) - (Some (num_nodes_visited, 0, [], 0, [])) + (0, Some (num_nodes_visited, 0, [], 0, [])) cstrs in begin match result with @@ -493,7 +579,7 @@ and value_kind_variant env ~loc ~visited ~depth ~num_nodes_visited and value_kind_record env ~loc ~visited ~depth ~num_nodes_visited (labels : Types.label_declaration list) rep = match rep with - | (Record_unboxed | (Record_inlined (_,Variant_unboxed))) -> begin + | (Record_unboxed | (Record_inlined (_, _, Variant_unboxed))) -> begin (* CR layouts v1.5: This should only be reachable in the case of a missing cmi, according to the comment on scrape_ty. Reevaluate whether it's needed when we deal with missing cmis. *) @@ -502,49 +588,83 @@ and value_kind_record env ~loc ~visited ~depth ~num_nodes_visited value_kind env ~loc ~visited ~depth ~num_nodes_visited ld_type | [] | _ :: _ :: _ -> assert false end - | _ -> begin - let (is_mutable, num_nodes_visited), fields = - List.fold_left_map - (fun (is_mutable, num_nodes_visited) - (label:Types.label_declaration) -> - let is_mutable = - match label.ld_mutable with - | Mutable -> true - | Immutable -> is_mutable - in - let num_nodes_visited = num_nodes_visited + 1 in - let num_nodes_visited, field = - (* CR layouts v5: when we add other layouts, we'll need to check - here that we aren't about to call value_kind on a different - sort (we can get this info from the label.ld_jkind). For now - we rely on the layout check at the top of value_kind to rule - out void. *) - match rep with - | Record_float | Record_ufloat -> - (* We're using the `Pfloatval` value kind for unboxed floats. - This is kind of a lie (there are unboxed floats in here, not - boxed floats), but that was already happening here due to the - float record optimization. *) - num_nodes_visited, Pfloatval - | Record_boxed _ | Record_inlined _ | Record_unboxed -> - value_kind env ~loc ~visited ~depth ~num_nodes_visited - label.ld_type - in - (is_mutable, num_nodes_visited), field) - (false, num_nodes_visited) labels + | Record_inlined (_, _, (Variant_boxed _ | Variant_extensible)) + | Record_boxed _ | Record_float | Record_ufloat | Record_mixed _ -> begin + let is_mutable = + List.exists (fun label -> Types.is_mutable label.Types.ld_mutable) + labels in if is_mutable then num_nodes_visited, Pgenval else + let num_nodes_visited, fields = + match rep with + | Record_unboxed -> + (* The outer match guards against this *) + assert false + | Record_inlined (_, Constructor_uniform_value, _) + | Record_boxed _ | Record_float | Record_ufloat -> + let num_nodes_visited, fields = + List.fold_left_map + (fun num_nodes_visited (label:Types.label_declaration) -> + let num_nodes_visited = num_nodes_visited + 1 in + let num_nodes_visited, field = + (* CR layouts v5: when we add other layouts, we'll need to + check here that we aren't about to call value_kind on a + different sort (we can get this info from the + label.ld_jkind). For now we rely on the layout check at + the top of value_kind to rule out void. *) + (* We're using the `Pboxedfloatval` value kind for unboxed + floats inside of records. This is kind of a lie, but + that was already happening here due to the float record + optimization. *) + match rep with + | Record_float | Record_ufloat -> + num_nodes_visited, Pboxedfloatval Pfloat64 + | Record_inlined _ | Record_boxed _ -> + value_kind env ~loc ~visited ~depth ~num_nodes_visited + label.ld_type + | Record_mixed _ | Record_unboxed -> + (* The outer match guards against this *) + assert false + in + num_nodes_visited, field) + num_nodes_visited labels + in + num_nodes_visited, Constructor_uniform fields + | Record_inlined (_, Constructor_mixed shape, _) + | Record_mixed shape -> + let { value_prefix_len; flat_suffix } : mixed_product_shape = + shape + in + let labels_value_prefix, _ = + Misc.Stdlib.List.split_at value_prefix_len labels + in + assert (List.length labels_value_prefix = value_prefix_len); + let num_nodes_visited, value_prefix = + List.fold_left_map + (fun num_nodes_visited + (label:Types.label_declaration) -> + let num_nodes_visited = num_nodes_visited + 1 in + value_kind env ~loc ~visited ~depth ~num_nodes_visited + label.ld_type) + num_nodes_visited labels_value_prefix + in + let flat_suffix = Array.to_list flat_suffix in + num_nodes_visited, + Constructor_mixed { value_prefix; flat_suffix } + in let non_consts = match rep with - | Record_inlined (Ordinary {runtime_tag}, _) -> + | Record_inlined (Ordinary {runtime_tag}, _, _) -> [runtime_tag, fields] | Record_float | Record_ufloat -> [ Obj.double_array_tag, fields ] | Record_boxed _ -> [0, fields] - | Record_inlined (Extension _, _) -> + | Record_inlined (Extension _, _, _) -> + [0, fields] + | Record_mixed _ -> [0, fields] | Record_unboxed -> assert false in @@ -561,31 +681,54 @@ let value_kind env loc ty = with | Missing_cmi_fallback -> raise (Error (loc, Non_value_layout (ty, None))) +let[@inline always] layout_of_const_sort_generic ~value_kind ~error + : Jkind.Sort.const -> _ = function + | Value -> Lambda.Pvalue (Lazy.force value_kind) + | Float64 when Language_extension.(is_at_least Layouts Stable) -> + Lambda.Punboxed_float Pfloat64 + | Word when Language_extension.(is_at_least Layouts Stable) -> + Lambda.Punboxed_int Pnativeint + | Bits32 when Language_extension.(is_at_least Layouts Stable) -> + Lambda.Punboxed_int Pint32 + | Bits64 when Language_extension.(is_at_least Layouts Stable) -> + Lambda.Punboxed_int Pint64 + | Float32 when Language_extension.(is_at_least Layouts Stable) && + Language_extension.(is_enabled Small_numbers) -> + Lambda.Punboxed_float Pfloat32 + | (Void | Float64 | Float32 | Word | Bits32 | Bits64 as const) -> + error const + let layout env loc sort ty = - match Jkind.Sort.get_default_value sort with - | Value -> Lambda.Pvalue (value_kind env loc ty) - | Float64 when Language_extension.(is_at_least Layouts Beta) -> - Lambda.Punboxed_float - | Float64 -> - raise (Error (loc, Sort_without_extension (Jkind.Sort.float64, Beta, Some ty))) - | Void -> raise (Error (loc, Non_value_sort (Jkind.Sort.void,ty))) + layout_of_const_sort_generic + (Jkind.Sort.default_to_value_and_get sort) + ~value_kind:(lazy (value_kind env loc ty)) + ~error:(function + | Value -> assert false + | Void -> raise (Error (loc, Non_value_sort (Jkind.Sort.void,ty))) + | (Float32 as const) -> + raise (Error (loc, Small_number_sort_without_extension (Jkind.Sort.of_const const, Some ty))) + | (Float64 | Word | Bits32 | Bits64 as const) -> + raise (Error (loc, Sort_without_extension (Jkind.Sort.of_const const, Stable, Some ty)))) let layout_of_sort loc sort = - match Jkind.Sort.get_default_value sort with - | Value -> Lambda.Pvalue Pgenval - | Float64 when Language_extension.(is_at_least Layouts Beta) -> - Lambda.Punboxed_float - | Float64 -> - raise (Error (loc, Sort_without_extension (Jkind.Sort.float64, Beta, None))) - | Void -> raise (Error (loc, Non_value_sort_unknown_ty Jkind.Sort.void)) - -let layout_of_const_sort (s : Jkind.Sort.const) = - match s with - | Value -> Lambda.Pvalue Pgenval - | Float64 when Language_extension.(is_at_least Layouts Beta) -> - Lambda.Punboxed_float - | Float64 -> Misc.fatal_error "layout_of_const_sort: float64 encountered" - | Void -> Misc.fatal_error "layout_of_const_sort: void encountered" + layout_of_const_sort_generic + (Jkind.Sort.default_to_value_and_get sort) + ~value_kind:(lazy Pgenval) + ~error:(function + | Value -> assert false + | Void -> raise (Error (loc, Non_value_sort_unknown_ty Jkind.Sort.void)) + | (Float32 as const) -> + raise (Error (loc, Small_number_sort_without_extension (Jkind.Sort.of_const const, None))) + | (Float64 | Word | Bits32 | Bits64 as const) -> + raise (Error (loc, Sort_without_extension (Jkind.Sort.of_const const, Stable, None)))) + +let layout_of_const_sort s = + layout_of_const_sort_generic + s + ~value_kind:(lazy Pgenval) + ~error:(fun const -> + Misc.fatal_errorf "layout_of_const_sort: %a encountered" + Jkind.Sort.Const.format const) let function_return_layout env loc sort ty = match is_function_type env ty with @@ -604,9 +747,16 @@ let function_arg_layout env loc sort ty = (** Whether a forward block is needed for a lazy thunk on a value, i.e. if the value can be represented as a float/forward/lazy *) -let lazy_val_requires_forward env ty = - match classify env ty with +let lazy_val_requires_forward env loc ty = + let sort = Jkind.Sort.for_lazy_body in + match classify env loc ty sort with | Any | Lazy -> true + (* CR layouts: Fix this when supporting lazy unboxed values. + Blocks with forward_tag can get scanned by the gc thus can't + store unboxed values. Not boxing is also incorrect since the lazy + type has layout [value] which is different from these unboxed layouts. *) + | Unboxed_float _ | Unboxed_int _ -> + Misc.fatal_error "Unboxed value encountered inside lazy expression" | Float -> Config.flat_float_array | Addr | Int -> false @@ -621,6 +771,7 @@ let classify_lazy_argument : Typedtree.expression -> fun e -> match e.exp_desc with | Texp_constant ( Const_int _ | Const_char _ | Const_string _ + | Const_float32 _ (* There is no float32 array optimization *) | Const_int32 _ | Const_int64 _ | Const_nativeint _ ) | Texp_function _ | Texp_construct (_, {cstr_arity = 0}, _, _) -> @@ -629,7 +780,7 @@ let classify_lazy_argument : Typedtree.expression -> if Config.flat_float_array then `Float_that_cannot_be_shortcut else `Constant_or_function - | Texp_ident _ when lazy_val_requires_forward e.exp_env e.exp_type -> + | Texp_ident _ when lazy_val_requires_forward e.exp_env e.exp_loc e.exp_type -> `Identifier `Forward_value | Texp_ident _ -> `Identifier `Other @@ -646,7 +797,8 @@ let rec layout_union l1 l2 = | l, Pbottom -> l | Pvalue layout1, Pvalue layout2 -> Pvalue (value_kind_union layout1 layout2) - | Punboxed_float, Punboxed_float -> Punboxed_float + | Punboxed_float f1, Punboxed_float f2 -> + if equal_boxed_float f1 f2 then l1 else Ptop | Punboxed_int bi1, Punboxed_int bi2 -> if equal_boxed_integer bi1 bi2 then l1 else Ptop | Punboxed_vector vi1, Punboxed_vector vi2 -> @@ -654,7 +806,8 @@ let rec layout_union l1 l2 = | Punboxed_product layouts1, Punboxed_product layouts2 -> if List.compare_lengths layouts1 layouts2 <> 0 then Ptop else Punboxed_product (List.map2 layout_union layouts1 layouts2) - | (Ptop | Pvalue _ | Punboxed_float | Punboxed_int _ | Punboxed_vector _ | Punboxed_product _), + | (Ptop | Pvalue _ | Punboxed_float _ | Punboxed_int _ | + Punboxed_vector _ | Punboxed_product _), _ -> Ptop @@ -696,6 +849,32 @@ let report_error ppf = function build file.@ \ Otherwise, please report this error to the Jane Street compilers team." (Language_extension.to_command_line_string Layouts maturity) + | Small_number_sort_without_extension (sort, ty) -> + fprintf ppf "Non-value layout %a detected" Jkind.Sort.format sort; + begin match ty with + | None -> () + | Some ty -> fprintf ppf " as sort for type@ %a" Printtyp.type_expr ty + end; + let extension, verb, flags = + match Language_extension.(is_at_least Layouts Stable), + Language_extension.(is_enabled Small_numbers) with + | false, true -> " layouts", "is", "this flag" + | true, false -> " small_numbers", "is", "this flag" + | false, false -> "s layouts and small numbers", "are", "these flags" + | true, true -> assert false + in + fprintf ppf + ",@ but this requires the extension%s, which %s not enabled.@ \ + If you intended to use this layout, please add %s to your \ + build file.@ \ + Otherwise, please report this error to the Jane Street compilers team." + extension verb flags + | Not_a_sort (ty, err) -> + fprintf ppf "A representable layout is required here.@ %a" + (Jkind.Violation.report_with_offender + ~offender:(fun ppf -> Printtyp.type_expr ppf ty)) err + | Unsupported_sort const -> + fprintf ppf "Layout %a is not supported yet." Jkind.Sort.Const.format const let () = Location.register_error_of_exn diff --git a/typing/typeopt.mli b/typing/typeopt.mli index c0eca244563..f1eb370e5e0 100644 --- a/typing/typeopt.mli +++ b/typing/typeopt.mli @@ -23,9 +23,15 @@ val maybe_pointer_type : Env.t -> Types.type_expr -> Lambda.immediate_or_pointer val maybe_pointer : Typedtree.expression -> Lambda.immediate_or_pointer -val array_type_kind : Env.t -> Types.type_expr -> Lambda.array_kind -val array_kind : Typedtree.expression -> Lambda.array_kind -val array_pattern_kind : Typedtree.pattern -> Lambda.array_kind +(* Supplying [None] for [elt_sort] should be avoided when possible. It + will result in a call to [Ctype.type_sort] which can be expensive. *) +val array_type_kind : + elt_sort:(Jkind.Sort.t option) + -> Env.t -> Location.t -> Types.type_expr -> Lambda.array_kind +val array_kind : + Typedtree.expression -> Jkind.Sort.t -> Lambda.array_kind +val array_pattern_kind : + Typedtree.pattern -> Jkind.Sort.t -> Lambda.array_kind val bigarray_type_kind_and_layout : Env.t -> Types.type_expr -> Lambda.bigarray_kind * Lambda.bigarray_layout diff --git a/typing/types.ml b/typing/types.ml index 2e8173092bf..e39162eecda 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -17,7 +17,13 @@ open Asttypes -type jkind = Jkind.t +type mutability = + | Immutable + | Mutable of Mode.Alloc.Comonadic.Const.t + +let is_mutable = function + | Immutable -> false + | Mutable _ -> true (* Type expressions for the core language *) @@ -30,9 +36,9 @@ type transient_expr = and type_expr = transient_expr and type_desc = - | Tvar of { name : string option; jkind : Jkind.t } + | Tvar of { name : string option; jkind : jkind } | Tarrow of arrow_desc * type_expr * type_expr * commutable - | Ttuple of type_expr list + | Ttuple of (string option * type_expr) list | Tconstr of Path.t * type_expr list * abbrev_memo ref | Tobject of type_expr * (Path.t * type_expr list) option ref | Tfield of string * field_kind * type_expr * type_expr @@ -40,12 +46,18 @@ and type_desc = | Tlink of type_expr | Tsubst of type_expr * type_expr option | Tvariant of row_desc - | Tunivar of { name : string option; jkind : Jkind.t } + | Tunivar of { name : string option; jkind : jkind } | Tpoly of type_expr * type_expr list | Tpackage of Path.t * (Longident.t * type_expr) list +and arg_label = + | Nolabel + | Labelled of string + | Optional of string + | Position of string + and arrow_desc = - arg_label * Mode.Alloc.t * Mode.Alloc.t + arg_label * Mode.Alloc.lr * Mode.Alloc.lr and row_desc = { row_fields: (label * row_field) list; @@ -85,6 +97,16 @@ and _ commutable_gen = | Cunknown : [> `none] commutable_gen | Cvar : {mutable commu: any commutable_gen} -> [> `var] commutable_gen +and jkind = type_expr Jkind_types.t + +(* jkind depends on types defined in this file, but Jkind.equal is required + here. When jkind.ml is loaded, it calls set_jkind_equal to fill a ref to the + function. *) +(** Corresponds to [Jkind.equal] *) +let jkind_equal = ref (fun _ _ -> + failwith "jkind_equal should be set by jkind.ml") +let set_jkind_equal f = jkind_equal := f + module TransientTypeOps = struct type t = type_expr let compare t1 t2 = t1.id - t2.id @@ -231,7 +253,8 @@ type type_declaration = { type_params: type_expr list; type_arity: int; type_kind: type_decl_kind; - type_jkind: Jkind.t; + type_jkind: jkind; + type_jkind_annotation: type_expr Jkind_types.annotation option; type_private: private_flag; type_manifest: type_expr option; type_variance: Variance.t list; @@ -242,6 +265,7 @@ type type_declaration = type_attributes: Parsetree.attributes; type_unboxed_default: bool; type_uid: Uid.t; + type_has_illegal_crossings: bool; } and type_decl_kind = (label_declaration, constructor_declaration) type_kind @@ -254,35 +278,50 @@ and ('lbl, 'cstr) type_kind = and tag = Ordinary of {src_index: int; (* Unique name (per type) *) runtime_tag: int} (* The runtime tag *) - | Extension of Path.t * Jkind.t array + | Extension of Path.t * jkind array and abstract_reason = Abstract_def | Abstract_rec_check_regularity +and flat_element = + | Imm + | Float_boxed + | Float64 + | Float32 + | Bits32 + | Bits64 + | Word + +and mixed_product_shape = + { value_prefix_len : int; + flat_suffix : flat_element array; + } + and record_representation = | Record_unboxed - | Record_inlined of tag * variant_representation - | Record_boxed of Jkind.t array + | Record_inlined of tag * constructor_representation * variant_representation + | Record_boxed of jkind array | Record_float | Record_ufloat + | Record_mixed of mixed_product_shape and variant_representation = | Variant_unboxed - | Variant_boxed of jkind array array + | Variant_boxed of (constructor_representation * jkind array) array | Variant_extensible -and global_flag = - | Global - | Unrestricted +and constructor_representation = + | Constructor_uniform_value + | Constructor_mixed of mixed_product_shape and label_declaration = { ld_id: Ident.t; - ld_mutable: mutable_flag; - ld_global: global_flag; + ld_mutable: mutability; + ld_modalities: Mode.Modality.Value.Const.t; ld_type: type_expr; - ld_jkind : Jkind.t; + ld_jkind : jkind; ld_loc: Location.t; ld_attributes: Parsetree.attributes; ld_uid: Uid.t; @@ -298,15 +337,23 @@ and constructor_declaration = cd_uid: Uid.t; } +and constructor_argument = + { + ca_modalities: Mode.Modality.Value.Const.t; + ca_type: type_expr; + ca_loc: Location.t; + } + and constructor_arguments = - | Cstr_tuple of (type_expr * global_flag) list + | Cstr_tuple of constructor_argument list | Cstr_record of label_declaration list type extension_constructor = { ext_type_path: Path.t; ext_type_params: type_expr list; ext_args: constructor_arguments; - ext_arg_jkinds: Jkind.t array; + ext_arg_jkinds: jkind array; + ext_shape: constructor_representation; ext_constant: bool; ext_ret_type: type_expr option; ext_private: private_flag; @@ -321,7 +368,7 @@ and type_transparence = | Type_private (* private type *) let tys_of_constr_args = function - | Cstr_tuple tl -> List.map fst tl + | Cstr_tuple tl -> List.map (fun ca -> ca.ca_type) tl | Cstr_record lbls -> List.map (fun l -> l.ld_type) lbls (* Type expressions for the class language *) @@ -392,8 +439,10 @@ module type Wrapped = sig type value_description = { val_type: type_expr wrapped; (* Type of the value *) + val_modalities : Mode.Modality.Value.t; (* Modalities on the value *) val_kind: value_kind; val_loc: Location.t; + val_zero_alloc: Zero_alloc.t; val_attributes: Parsetree.attributes; val_uid: Uid.t; } @@ -468,10 +517,13 @@ module Map_wrapped(From : Wrapped)(To : Wrapped) = struct | Unit -> To.Unit | Named (id,mty) -> To.Named (id, module_type m mty) - let value_description m {val_type; val_kind; val_attributes; val_loc; val_uid} = + let value_description m {val_type; val_modalities; val_kind; val_zero_alloc; + val_attributes; val_loc; val_uid} = To.{ val_type = m.map_type_expr m val_type; + val_modalities; val_kind; + val_zero_alloc; val_attributes; val_loc; val_uid @@ -519,11 +571,12 @@ type constructor_description = { cstr_name: string; (* Constructor name *) cstr_res: type_expr; (* Type of the result *) cstr_existentials: type_expr list; (* list of existentials *) - cstr_args: (type_expr * global_flag) list; (* Type of the arguments *) - cstr_arg_jkinds: Jkind.t array; (* Jkinds of the arguments *) + cstr_args: constructor_argument list; (* Type of the arguments *) + cstr_arg_jkinds: jkind array; (* Jkinds of the arguments *) cstr_arity: int; (* Number of arguments *) cstr_tag: tag; (* Tag for heap blocks *) cstr_repr: variant_representation; (* Repr of the outer variant *) + cstr_shape: constructor_representation; (* Repr of the constructor itself *) cstr_constant: bool; (* True if all args are void *) cstr_consts: int; (* Number of constant constructors *) cstr_nonconsts: int; (* Number of non-const constructors *) @@ -542,11 +595,53 @@ let equal_tag t1 t2 = | Extension (path1,_), Extension (path2,_) -> Path.same path1 path2 | (Ordinary _ | Extension _), _ -> false +let equal_flat_element e1 e2 = + match e1, e2 with + | Imm, Imm | Float64, Float64 | Float32, Float32 | Float_boxed, Float_boxed + | Word, Word | Bits32, Bits32 | Bits64, Bits64 + -> true + | (Imm | Float64 | Float32 | Float_boxed | Word | Bits32 | Bits64), _ -> false + +let compare_flat_element e1 e2 = + match e1, e2 with + | Imm, Imm | Float_boxed, Float_boxed | Float64, Float64 | Float32, Float32 + | Word, Word | Bits32, Bits32 | Bits64, Bits64 + -> 0 + | Imm, _ -> -1 + | _, Imm -> 1 + | Float_boxed, _ -> -1 + | _, Float_boxed -> 1 + | Float64, _ -> -1 + | _, Float64 -> 1 + | Float32, _ -> -1 + | _, Float32 -> 1 + | Word, _ -> -1 + | _, Word -> 1 + | Bits32, _ -> -1 + | _, Bits32 -> 1 + +let equal_mixed_product_shape r1 r2 = r1 == r2 || + (* Warning 9 alerts us if we add another field *) + let[@warning "+9"] { value_prefix_len = l1; flat_suffix = s1 } = r1 + and { value_prefix_len = l2; flat_suffix = s2 } = r2 + in + l1 = l2 && Misc.Stdlib.Array.equal equal_flat_element s1 s2 + +let equal_constructor_representation r1 r2 = r1 == r2 || match r1, r2 with + | Constructor_uniform_value, Constructor_uniform_value -> true + | Constructor_mixed mx1, Constructor_mixed mx2 -> + equal_mixed_product_shape mx1 mx2 + | (Constructor_mixed _ | Constructor_uniform_value), _ -> false + let equal_variant_representation r1 r2 = r1 == r2 || match r1, r2 with | Variant_unboxed, Variant_unboxed -> true - | Variant_boxed lays1, Variant_boxed lays2 -> - Misc.Stdlib.Array.equal (Misc.Stdlib.Array.equal Jkind.equal) lays1 lays2 + | Variant_boxed cstrs_and_jkinds1, Variant_boxed cstrs_and_jkinds2 -> + Misc.Stdlib.Array.equal (fun (cstr1, jkinds1) (cstr2, jkinds2) -> + equal_constructor_representation cstr1 cstr2 + && Misc.Stdlib.Array.equal !jkind_equal jkinds1 jkinds2) + cstrs_and_jkinds1 + cstrs_and_jkinds2 | Variant_extensible, Variant_extensible -> true | (Variant_unboxed | Variant_boxed _ | Variant_extensible), _ -> @@ -555,16 +650,21 @@ let equal_variant_representation r1 r2 = r1 == r2 || match r1, r2 with let equal_record_representation r1 r2 = match r1, r2 with | Record_unboxed, Record_unboxed -> true - | Record_inlined (tag1, vr1), Record_inlined (tag2, vr2) -> + | Record_inlined (tag1, cr1, vr1), Record_inlined (tag2, cr2, vr2) -> + (* Equality of tag and variant representation imply equality of + constructor representation. *) + ignore (cr1 : constructor_representation); + ignore (cr2 : constructor_representation); equal_tag tag1 tag2 && equal_variant_representation vr1 vr2 | Record_boxed lays1, Record_boxed lays2 -> - Misc.Stdlib.Array.equal Jkind.equal lays1 lays2 + Misc.Stdlib.Array.equal !jkind_equal lays1 lays2 | Record_float, Record_float -> true | Record_ufloat, Record_ufloat -> true + | Record_mixed mx1, Record_mixed mx2 -> equal_mixed_product_shape mx1 mx2 | (Record_unboxed | Record_inlined _ | Record_boxed _ | Record_float - | Record_ufloat ), _ -> + | Record_ufloat | Record_mixed _), _ -> false let may_equal_constr c1 c2 = @@ -579,13 +679,14 @@ let may_equal_constr c1 c2 = let find_unboxed_type decl = match decl.type_kind with Type_record ([{ld_type = arg; _}], Record_unboxed) - | Type_record ([{ld_type = arg; _}], Record_inlined (_, Variant_unboxed)) - | Type_variant ([{cd_args = Cstr_tuple [arg,_]; _}], Variant_unboxed) + | Type_record ([{ld_type = arg; _}], Record_inlined (_, _, Variant_unboxed)) + | Type_variant ([{cd_args = Cstr_tuple [{ca_type = arg; _}]; _}], Variant_unboxed) | Type_variant ([{cd_args = Cstr_record [{ld_type = arg; _}]; _}], Variant_unboxed) -> Some arg | Type_record (_, ( Record_inlined _ | Record_unboxed - | Record_boxed _ | Record_float | Record_ufloat )) + | Record_boxed _ | Record_float | Record_ufloat + | Record_mixed _)) | Type_variant (_, ( Variant_boxed _ | Variant_unboxed | Variant_extensible )) | Type_abstract _ | Type_open -> @@ -604,9 +705,9 @@ type label_description = { lbl_name: string; (* Short name *) lbl_res: type_expr; (* Type of the result *) lbl_arg: type_expr; (* Type of the argument *) - lbl_mut: mutable_flag; (* Is this a mutable field? *) - lbl_global: global_flag; (* Is this a global field? *) - lbl_jkind : Jkind.t; (* Jkind of the argument *) + lbl_mut: mutability; (* Is this a mutable field? *) + lbl_modalities: Mode.Modality.Value.Const.t;(* Modalities on the field *) + lbl_jkind : jkind; (* Jkind of the argument *) lbl_pos: int; (* Position in block *) lbl_num: int; (* Position in type *) lbl_all: label_description array; (* All the labels in this type *) @@ -639,6 +740,33 @@ let signature_item_id = function | Sig_class_type (id, _, _, _) -> id +type mixed_product_element = + | Value_prefix + | Flat_suffix of flat_element + +let get_mixed_product_element { value_prefix_len; flat_suffix } i = + if i < 0 then Misc.fatal_errorf "Negative index: %d" i; + if i < value_prefix_len then Value_prefix + else Flat_suffix flat_suffix.(i - value_prefix_len) + +let flat_element_to_string = function + | Imm -> "Imm" + | Float_boxed -> "Float_boxed" + | Float32 -> "Float32" + | Float64 -> "Float64" + | Bits32 -> "Bits32" + | Bits64 -> "Bits64" + | Word -> "Word" + +let flat_element_to_lowercase_string = function + | Imm -> "imm" + | Float_boxed -> "float" + | Float32 -> "float32" + | Float64 -> "float64" + | Bits32 -> "bits32" + | Bits64 -> "bits64" + | Word -> "word" + (**** Definitions for backtracking ****) type change = @@ -653,7 +781,8 @@ type change = | Ccommu : [`var] commutable_gen -> change | Cuniv : type_expr option ref * type_expr option -> change | Cmodes : Mode.changes -> change - | Csort : Jkind.Sort.change -> change + | Csort : Jkind_types.Sort.change -> change + | Czero_alloc : Zero_alloc.change -> change type changes = Change of change * changes ref @@ -668,8 +797,9 @@ let log_change ch = trail := r' let () = - Mode.change_log := (fun changes -> log_change (Cmodes changes)); - Jkind.Sort.change_log := (fun change -> log_change (Csort change)) + Mode.set_append_changes (fun changes -> log_change (Cmodes !changes)); + Jkind_types.Sort.set_change_log (fun change -> log_change (Csort change)); + Zero_alloc.set_change_log (fun change -> log_change (Czero_alloc change)) (* constructor and accessors for [field_kind] *) @@ -918,8 +1048,9 @@ let undo_change = function | Ckind (FKvar r) -> r.field_kind <- FKprivate | Ccommu (Cvar r) -> r.commu <- Cunknown | Cuniv (r, v) -> r := v - | Cmodes ms -> Mode.undo_changes ms - | Csort change -> Jkind.Sort.undo_change change + | Cmodes c -> Mode.undo_changes c + | Csort change -> Jkind_types.Sort.undo_change change + | Czero_alloc c -> Zero_alloc.undo_change c type snapshot = changes ref * int let last_snapshot = Local_store.s_ref 0 diff --git a/typing/types.mli b/typing/types.mli index 8106564f3a0..61c93e5f39b 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -24,9 +24,15 @@ (** Asttypes exposes basic definitions shared both by Parsetree and Types. *) open Asttypes -(** Jkinds classify types. *) -(* CR layouts v2.8: Say more here. *) -type jkind = Jkind.t +(** Describes a mutable field/element. *) +type mutability = + | Immutable + | Mutable of Mode.Alloc.Comonadic.Const.t + (** The upper bound of the new field value upon mutation. *) + +(** Returns [true] is the [mutable_flag] is mutable. Should be called if not + interested in the payload of [Mutable]. *) +val is_mutable : mutability -> bool (** Type expressions for the core language. @@ -66,7 +72,7 @@ type field_kind type commutable and type_desc = - | Tvar of { name : string option; jkind : Jkind.t } + | Tvar of { name : string option; jkind : jkind } (** [Tvar (Some "a")] ==> ['a] or ['_a] [Tvar None] ==> [_] *) @@ -78,8 +84,13 @@ and type_desc = See [commutable] for the last argument. The argument type must be a [Tpoly] node *) - | Ttuple of type_expr list - (** [Ttuple [t1;...;tn]] ==> [(t1 * ... * tn)] *) + | Ttuple of (string option * type_expr) list + (** [Ttuple [None, t1; ...; None, tn]] ==> [t1 * ... * tn] + [Ttuple [Some "l1", t1; ...; Some "ln", tn]] ==> [l1:t1 * ... * ln:tn] + + Any mix of labeled and unlabeled components also works: + [Ttuple [Some "l1", t1; None, t2; Some "l3", t3]] ==> [l1:t1 * t2 * l3:t3] + *) | Tconstr of Path.t * type_expr list * abbrev_memo ref (** [Tconstr (`A.B.t', [t1;...;tn], _)] ==> [(t1,...,tn) A.B.t] @@ -125,7 +136,7 @@ and type_desc = | Tvariant of row_desc (** Representation of polymorphic variants, see [row_desc]. *) - | Tunivar of { name : string option; jkind : Jkind.t } + | Tunivar of { name : string option; jkind : jkind } (** Occurrence of a type variable introduced by a forall quantifier / [Tpoly]. *) @@ -137,8 +148,17 @@ and type_desc = | Tpackage of Path.t * (Longident.t * type_expr) list (** Type of a first-class module (a.k.a package). *) +(** This is used in the Typedtree. It is distinct from + {{!Asttypes.arg_label}[arg_label]} because Position argument labels are + discovered through typechecking. *) +and arg_label = + | Nolabel + | Labelled of string (** [label:T -> ...] *) + | Optional of string (** [?label:T -> ...] *) + | Position of string (** [label:[%call_pos] -> ...] *) + and arrow_desc = - arg_label * Mode.Alloc.t * Mode.Alloc.t + arg_label * Mode.Alloc.lr * Mode.Alloc.lr @@ -197,6 +217,17 @@ and abbrev_memo = This is only allowed when the real type is known. *) +(** Jkinds classify types. *) +(* CR layouts v2.8: Say more here. *) +and jkind = type_expr Jkind_types.t + +(* jkind depends on types defined in this file, but Jkind.equal is required + here. When jkind.ml is loaded, it calls set_jkind_equal to fill a ref to the + function. *) +(** INTERNAL USE ONLY + jkind.ml should call this with the definition of Jkind.equal *) +val set_jkind_equal : (jkind -> jkind -> bool) -> unit + val is_commu_ok: commutable -> bool val commu_ok: commutable val commu_var: unit -> commutable @@ -471,7 +502,7 @@ type type_declaration = type_arity: int; type_kind: type_decl_kind; - type_jkind: Jkind.t; + type_jkind: jkind; (* for an abstract decl kind or for [@@unboxed] types: this is the stored jkind for the type; expansion might find a type with a more precise jkind. See PR#10017 for motivating examples where subsitution or @@ -483,6 +514,12 @@ type type_declaration = be computed from the decl kind. This happens in Ctype.add_jkind_equation. *) + type_jkind_annotation: type_expr Jkind_types.annotation option; + (* This is the jkind annotation written by the user. If the user did + not write this declaration (because it's a synthesized declaration + for an e.g. local abstract type or an inlined record), then this field + can safely be [None]. It's used only for printing and in untypeast. *) + type_private: private_flag; type_manifest: type_expr option; type_variance: Variance.t list; @@ -495,6 +532,10 @@ type type_declaration = type_unboxed_default: bool; (* true if the unboxed-ness of this type was chosen by a compiler flag *) type_uid: Uid.t; + type_has_illegal_crossings: bool; + (* true iff the type definition has illegal crossings of the portability and + contention axes *) + (* CR layouts v2.8: remove type_has_illegal_crossings *) } and type_decl_kind = (label_declaration, constructor_declaration) type_kind @@ -518,44 +559,79 @@ and ('lbl, 'cstr) type_kind = case of normal projections from boxes. *) and tag = Ordinary of {src_index: int; (* Unique name (per type) *) runtime_tag: int} (* The runtime tag *) - | Extension of Path.t * Jkind.t array + | Extension of Path.t * jkind array and abstract_reason = Abstract_def | Abstract_rec_check_regularity (* See Typedecl.transl_type_decl *) +(* A mixed product contains a possibly-empty prefix of values followed by a + non-empty suffix of "flat" elements. Intuitively, a flat element is one that + need not be scanned by the garbage collector. +*) +and flat_element = + | Imm + | Float_boxed + (* A [Float_boxed] is a float that's stored flat but boxed upon projection. *) + | Float64 + | Float32 + | Bits32 + | Bits64 + | Word + +and mixed_product_shape = + { value_prefix_len : int; + (* We use an array just so we can index into the middle. *) + flat_suffix : flat_element array; + } + and record_representation = | Record_unboxed - | Record_inlined of tag * variant_representation + | Record_inlined of tag * constructor_representation * variant_representation (* For an inlined record, we record the representation of the variant that - contains it and the tag of the relevant constructor of that variant. *) - | Record_boxed of Jkind.t array + contains it and the tag/representation of the relevant constructor of that + variant. *) + | Record_boxed of jkind array | Record_float (* All fields are floats *) | Record_ufloat (* All fields are [float#]s. Same runtime representation as [Record_float], but operations on these (e.g., projection, update) work with unboxed floats rather than boxed floats. *) + | Record_mixed of mixed_product_shape + (* The record contains a mix of values and unboxed elements. The block + is tagged such that polymorphic operations will not work. + *) -(* For unboxed variants, we record the jkind of the mandatory single argument. - For boxed variants, we record the jkinds for the arguments of each - constructor. For boxed inlined records, this is just a length 1 array with - the jkind of the record itself, not the jkinds of each field. *) and variant_representation = | Variant_unboxed - | Variant_boxed of jkind array array + | Variant_boxed of (constructor_representation * jkind array) array + (* The outer array has an element for each constructor. Each inner array + has a jkind for each argument of the corresponding constructor. + + A constructor with an inlined record argument has a length-1 inner array. + Its single element is the jkind of the record itself. (It doesn't have a + jkind for each field.) However, the constructor representation is about the + fields of the record, not the record itself; that is, it will be + [Constructor_mixed] if the inlined record has any unboxed fields. + *) | Variant_extensible -and global_flag = - | Global - | Unrestricted +and constructor_representation = + | Constructor_uniform_value + (* A constant constructor or a constructor all of whose fields are values. + This is named 'uniform_value' to distinguish from the 'Constructor_uniform' + of [lambda.mli], which can also represent all-flat-float records. + *) + | Constructor_mixed of mixed_product_shape + (* A constructor that has some non-value fields. *) and label_declaration = { ld_id: Ident.t; - ld_mutable: mutable_flag; - ld_global: global_flag; + ld_mutable: mutability; + ld_modalities: Mode.Modality.Value.Const.t; ld_type: type_expr; - ld_jkind : Jkind.t; + ld_jkind : jkind; ld_loc: Location.t; ld_attributes: Parsetree.attributes; ld_uid: Uid.t; @@ -571,8 +647,15 @@ and constructor_declaration = cd_uid: Uid.t; } +and constructor_argument = + { + ca_modalities: Mode.Modality.Value.Const.t; + ca_type: type_expr; + ca_loc: Location.t; + } + and constructor_arguments = - | Cstr_tuple of (type_expr * global_flag) list + | Cstr_tuple of constructor_argument list | Cstr_record of label_declaration list val tys_of_constr_args : constructor_arguments -> type_expr list @@ -585,7 +668,8 @@ type extension_constructor = ext_type_path: Path.t; ext_type_params: type_expr list; ext_args: constructor_arguments; - ext_arg_jkinds: Jkind.t array; + ext_arg_jkinds: jkind array; + ext_shape: constructor_representation; ext_constant: bool; ext_ret_type: type_expr option; ext_private: private_flag; @@ -666,8 +750,10 @@ module type Wrapped = sig type value_description = { val_type: type_expr wrapped; (* Type of the value *) + val_modalities: Mode.Modality.Value.t; (* Modalities on the value *) val_kind: value_kind; val_loc: Location.t; + val_zero_alloc: Zero_alloc.t; val_attributes: Parsetree.attributes; val_uid: Uid.t; } @@ -746,11 +832,15 @@ type constructor_description = { cstr_name: string; (* Constructor name *) cstr_res: type_expr; (* Type of the result *) cstr_existentials: type_expr list; (* list of existentials *) - cstr_args: (type_expr * global_flag) list; (* Type of the arguments *) - cstr_arg_jkinds: Jkind.t array; (* Jkinds of the arguments *) + cstr_args: constructor_argument list; (* Type of the arguments *) + cstr_arg_jkinds: jkind array; (* Jkinds of the arguments *) cstr_arity: int; (* Number of arguments *) cstr_tag: tag; (* Tag for heap blocks *) cstr_repr: variant_representation; (* Repr of the outer variant *) + (* CR layouts v5.1: this duplicates information from [cstr_arg_jkinds]. + We might be able to move the jkind array into this type. + *) + cstr_shape: constructor_representation; (* Repr of the constructor itself *) cstr_constant: bool; (* True if all args are void *) cstr_consts: int; (* Number of constant constructors *) cstr_nonconsts: int; (* Number of non-const constructors *) @@ -782,9 +872,10 @@ type label_description = { lbl_name: string; (* Short name *) lbl_res: type_expr; (* Type of the result *) lbl_arg: type_expr; (* Type of the argument *) - lbl_mut: mutable_flag; (* Is this a mutable field? *) - lbl_global: global_flag; (* Is this a global field? *) - lbl_jkind : Jkind.t; (* Jkind of the argument *) + lbl_mut: mutability; (* Is this a mutable field? *) + lbl_modalities: Mode.Modality.Value.Const.t; + (* Modalities on the field *) + lbl_jkind : jkind; (* Jkind of the argument *) lbl_pos: int; (* Position in block *) lbl_num: int; (* Position in the type *) lbl_all: label_description array; (* All the labels in this type *) @@ -814,6 +905,19 @@ val bound_value_identifiers: signature -> Ident.t list val signature_item_id : signature_item -> Ident.t +type mixed_product_element = + | Value_prefix + | Flat_suffix of flat_element + +(** Raises if the int is out of bounds. *) +val get_mixed_product_element : + mixed_product_shape -> int -> mixed_product_element + +val equal_flat_element : flat_element -> flat_element -> bool +val compare_flat_element : flat_element -> flat_element -> int +val flat_element_to_string : flat_element -> string +val flat_element_to_lowercase_string : flat_element -> string + (**** Utilities for backtracking ****) type snapshot @@ -845,7 +949,7 @@ val set_type_desc: type_expr -> type_desc -> unit (* Set directly the desc field, without sharing *) val set_level: type_expr -> int -> unit val set_scope: type_expr -> int -> unit -val set_var_jkind: type_expr -> Jkind.t -> unit +val set_var_jkind: type_expr -> jkind -> unit (* May only be called on Tvars *) val set_name: (Path.t * type_expr list) option ref -> @@ -857,4 +961,3 @@ val set_univar: type_expr option ref -> type_expr -> unit val link_kind: inside:field_kind -> field_kind -> unit val link_commu: inside:commutable -> commutable -> unit val set_commu_ok: commutable -> unit - diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 1277f889e9a..a0aa54d6044 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -18,7 +18,6 @@ (* Typechecking of type expressions for the core language *) open Asttypes -open Jane_asttypes open Misc open Parsetree open Typedtree @@ -28,8 +27,18 @@ open Ctype exception Already_bound +(* A way to specify what jkind should be used for new type variables: + + [Sort] means to initialize variables with representable jkinds (sort + varibales internally) and the jkinds will get defaulted to value if + it remains unconstrained. + + [Any] means to initialize the variables with jkind any. No defaulting + will occur in this case. *) +type jkind_initialization_choice = Sort | Any + type value_loc = - Tuple | Poly_variant | Package_constraint | Object_field + Tuple | Poly_variant | Object_field type sort_loc = Fun_arg | Fun_ret @@ -45,7 +54,11 @@ type cannot_quantify_reason = (e.g. [let f : ('a : immediate). ...]) and what the jkind was; it is original as compared to the inferred jkind after processing the body of the type *) -type jkind_info = { original_jkind : jkind; defaulted : bool } +type jkind_info = + { original_jkind : jkind; + jkind_annot : Jkind.annotation option; + defaulted : bool; + } type error = | Unbound_type_variable of string * string list @@ -77,6 +90,8 @@ type error = | Non_sort of {vloc : sort_loc; typ : type_expr; err : Jkind.Violation.t} | Bad_jkind_annot of type_expr * Jkind.Violation.t + | Did_you_mean_unboxed of Longident.t + | Invalid_label_for_call_pos of Parsetree.arg_label exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -97,12 +112,15 @@ module TyVarEnv : sig val with_univars : poly_univars -> (unit -> 'a) -> 'a (* evaluate with a locally extended set of univars *) + val ttyp_poly_arg : poly_univars -> (string * Jkind.annotation option) list + (* something suitable as an argument to [Ttyp_poly] *) + val make_poly_univars : string Location.loc list -> poly_univars (* a version of [make_poly_univars_jkinds] that doesn't take jkinds *) val make_poly_univars_jkinds : - context:(string -> Jkind.annotation_context) -> - (string Location.loc * jkind_annotation option) list -> poly_univars + context:(string -> Jkind.History.annotation_context) -> + (string Location.loc * Jane_syntax.Jkind.annotation option) list -> poly_univars (* see mli file *) val check_poly_univars : Env.t -> Location.t -> poly_univars -> type_expr list @@ -113,14 +131,20 @@ module TyVarEnv : sig (* see mli file *) type policy - val fixed_policy : policy (* no wildcards allowed *) - val extensible_policy : policy (* common case *) - val univars_policy : policy (* fresh variables are univars (in methods) *) + val make_fixed_policy : jkind_initialization_choice -> policy + (* no wildcards allowed *) + val make_extensible_policy : jkind_initialization_choice -> policy + (* common case *) + val univars_policy : policy + (* fresh variables are univars (in methods), with representable jkinds *) val new_any_var : Location.t -> Env.t -> Jkind.t -> policy -> type_expr - (* create a new variable to represent a _; fails for fixed_policy *) + (* create a new variable to represent a _; fails for fixed policy *) val new_var : ?name:string -> Jkind.t -> policy -> type_expr (* create a new variable according to the given policy *) + val new_jkind : is_named:bool -> policy -> Jkind.t + (* create a new jkind depending on the current policy *) + val add_pre_univar : type_expr -> policy -> unit (* remember that a variable might become a univar if it isn't unified; used for checking method types *) @@ -147,8 +171,8 @@ module TyVarEnv : sig corresponding global type variables if they exist. Otherwise, in function of the policy, fresh used variables are either - added to the global type variable scope if they are not longer - variables under the {!fixed_policy} - - added to the global type variable scope under the {!extensible_policy} + variables under the fixed policy + - added to the global type variable scope under the extensible policy - expected to be collected later by a call to `collect_univar` under the {!universal_policy} *) @@ -244,19 +268,27 @@ end = struct f ~finally:(fun () -> univars := old_univars) + let ttyp_poly_arg (poly_univars : poly_univars) = List.map + (fun (name, pending_univar) -> name, pending_univar.jkind_info.jkind_annot) + poly_univars + let mk_pending_univar name jkind jkind_info = { univar = newvar ~name jkind; associated = []; jkind_info } let mk_poly_univars_tuple_with_jkind ~context var jkind = let name = var.txt in - let original_jkind = Jkind.of_annotation ~context:(context name) jkind in - let jkind_info = { original_jkind; defaulted = false } in + let original_jkind, jkind_annot = + Jkind.of_annotation ~context:(context name) jkind + in + let jkind_info = + { original_jkind; jkind_annot = Some jkind_annot; defaulted = false } + in name, mk_pending_univar name original_jkind jkind_info let mk_poly_univars_tuple_without_jkind var = let name = var.txt in - let original_jkind = Jkind.value ~why:Univar in - let jkind_info = { original_jkind; defaulted = true } in + let original_jkind = Jkind.Primitive.value ~why:Univar in + let jkind_info = { original_jkind; jkind_annot = None; defaulted = true } in name, mk_pending_univar name original_jkind jkind_info let make_poly_univars vars = @@ -355,11 +387,29 @@ end = struct type flavor = Unification | Universal type extensibility = Extensible | Fixed - type policy = { flavor : flavor; extensibility : extensibility } + type policy = { + flavor : flavor; + extensibility : extensibility; + jkind_initialization: jkind_initialization_choice; + } + + let make_fixed_policy jkind_initialization = { + flavor = Unification; + extensibility = Fixed; + jkind_initialization; + } - let fixed_policy = { flavor = Unification; extensibility = Fixed } - let extensible_policy = { flavor = Unification; extensibility = Extensible } - let univars_policy = { flavor = Universal; extensibility = Extensible } + let make_extensible_policy jkind_initialization = { + flavor = Unification; + extensibility = Extensible; + jkind_initialization; + } + + let univars_policy = { + flavor = Universal; + extensibility = Extensible; + jkind_initialization = Sort; + } let add_pre_univar tv = function | { flavor = Universal } -> @@ -378,6 +428,15 @@ end = struct add_pre_univar tv policy; tv + let new_jkind ~is_named { jkind_initialization } = + match jkind_initialization with + (* CR layouts v3.0: while [Any] case allows nullable jkinds, [Sort] does not. + From testing, we need all callsites that use [Sort] to be non-null to + preserve backwards compatibility. But we also need [Any] callsites + to accept nullable jkinds to allow cases like [type ('a : value_or_null) t = 'a]. *) + | Any -> Jkind.Primitive.any ~why:(if is_named then Unification_var else Wildcard) + | Sort -> Jkind.of_new_legacy_sort ~why:(if is_named then Unification_var else Wildcard) + let new_any_var loc env jkind = function | { extensibility = Fixed } -> raise(Error(loc, env, No_type_wildcards)) | policy -> new_var jkind policy @@ -387,7 +446,7 @@ end = struct TyVarMap.iter (fun name (ty, loc) -> if flavor = Unification || is_in_scope name then - let v = new_global_var (Jkind.any ~why:Dummy_jkind) in + let v = new_global_var (Jkind.Primitive.any ~why:Dummy_jkind) in let snap = Btype.snapshot () in if try unify env v ty; true with _ -> Btype.backtrack snap; false then try @@ -397,7 +456,7 @@ end = struct raise(Error(loc, env, Unbound_type_variable ("'"^name, get_in_scope_names ()))); - let v2 = new_global_var (Jkind.any ~why:Dummy_jkind) in + let v2 = new_global_var (Jkind.Primitive.any ~why:Dummy_jkind) in r := (loc, v, v2) :: !r; add name v2) !used_variables; @@ -414,6 +473,7 @@ end let transl_modtype_longident = ref (fun _ -> assert false) let transl_modtype = ref (fun _ -> assert false) +let check_package_with_type_constraints = ref (fun _ -> assert false) let sort_constraints_no_duplicates loc env l = List.sort @@ -423,23 +483,6 @@ let sort_constraints_no_duplicates loc env l = compare s1.txt s2.txt) l -let create_package_mty loc p l = - List.fold_left - (fun mty (s, _) -> - let d = {ptype_name = mkloc (Longident.last s.txt) s.loc; - ptype_params = []; - ptype_cstrs = []; - ptype_kind = Ptype_abstract; - ptype_private = Asttypes.Public; - ptype_manifest = None; - ptype_attributes = []; - ptype_loc = loc} in - Ast_helper.Mty.mk ~loc - (Pmty_with (mty, [ Pwith_type ({ txt = s.txt; loc }, d) ])) - ) - (Ast_helper.Mty.mk ~loc (Pmty_ident p)) - l - (* Translation of type expressions *) let generalize_ctyp typ = generalize typ.ctyp_type @@ -460,7 +503,7 @@ let valid_tyvar_name name = name <> "" && name.[0] <> '_' let transl_type_param_var env loc attrs name_opt - (jkind : jkind) (jkind_annot : const_jkind option) = + (jkind : jkind) jkind_annot = let tvar = Ttyp_var (name_opt, jkind_annot) in let name = match name_opt with @@ -480,12 +523,13 @@ let transl_type_param_var env loc attrs name_opt let transl_type_param_jst env loc attrs path : Jane_syntax.Core_type.t -> _ = function - | Jtyp_layout (Ltyp_var { name; jkind = annot }) -> - let jkind = - Jkind.of_annotation ~context:(Type_parameter (path, name)) annot + | Jtyp_layout (Ltyp_var { name; jkind = jkind_annot }) -> + let jkind, jkind_annot = + Jkind.of_annotation ~context:(Type_parameter (path, name)) jkind_annot in - transl_type_param_var env loc attrs name jkind (Some annot.txt) - | Jtyp_layout (Ltyp_poly _ | Ltyp_alias _) -> + transl_type_param_var env loc attrs name jkind (Some jkind_annot) + | Jtyp_layout (Ltyp_poly _ | Ltyp_alias _) + | Jtyp_tuple _ -> Misc.fatal_error "non-type-variable in transl_type_param_jst" let transl_type_param env path styp = @@ -496,8 +540,8 @@ let transl_type_param env path styp = (* Our choice for now is that if you want a parameter of jkind any, you have to ask for it with an annotation. Some restriction here seems necessary for backwards compatibility (e.g., we wouldn't want [type 'a id = 'a] to - have jkind any). But it might be possible to infer any in some cases. *) - let jkind = Jkind.of_new_sort ~why:Unannotated_type_parameter in + have jkind any). But it might be possible to infer [any] in some cases. *) + let jkind = Jkind.of_new_legacy_sort ~why:(Unannotated_type_parameter path) in let attrs = styp.ptyp_attributes in match styp.ptyp_desc with Ptyp_any -> transl_type_param_var env loc attrs None jkind None @@ -513,9 +557,14 @@ let transl_type_param env path styp = let get_type_param_jkind path styp = match Jane_syntax.Core_type.of_ast styp with - | None -> Jkind.of_new_sort ~why:Unannotated_type_parameter + | None -> Jkind.of_new_legacy_sort ~why:(Unannotated_type_parameter path) | Some (Jtyp_layout (Ltyp_var { name; jkind }), _attrs) -> - Jkind.of_annotation ~context:(Type_parameter (path, name)) jkind + let jkind, _ = + Jkind.of_annotation + ~context:(Type_parameter (path, name)) + jkind + in + jkind | Some _ -> Misc.fatal_error "non-type-variable in get_type_param_jkind" let get_type_param_name styp = @@ -527,28 +576,8 @@ let get_type_param_name styp = | _ -> Misc.fatal_error "non-type-variable in get_type_param_name" let get_alloc_mode styp = - let locality = - match Builtin_attributes.has_local styp.ptyp_attributes with - | Ok true -> Locality.Const.Local - | Ok false -> Locality.Const.Global - | Error () -> - raise (Error(styp.ptyp_loc, Env.empty, Unsupported_extension Local)) - in - let uniqueness = - match Builtin_attributes.has_unique styp.ptyp_attributes with - | Ok true -> Uniqueness.Const.Unique - | Ok false -> Uniqueness.Const.Shared - | Error () -> - raise (Error(styp.ptyp_loc, Env.empty, Unsupported_extension Unique)) - in - let linearity = - match Builtin_attributes.has_once styp.ptyp_attributes with - | Ok true -> Linearity.Const.Once - | Ok false -> Linearity.Const.Many - | Error () -> - raise (Error(styp.ptyp_loc, Env.empty, Unsupported_extension Unique)) - in - { locality = locality; uniqueness; linearity } + let modes, _ = Jane_syntax.Mode_expr.of_attrs styp.ptyp_attributes in + Typemode.transl_alloc_mode modes let rec extract_params styp = let final styp = @@ -573,18 +602,44 @@ let check_arg_type styp = | _ -> () end +let transl_label (label : Parsetree.arg_label) + (arg_opt : Parsetree.core_type option) = + match label, arg_opt with + | Labelled l, Some { ptyp_desc = Ptyp_extension ({txt="call_pos"; _}, _); _} + -> Position l + | _, Some ({ ptyp_desc = Ptyp_extension ({txt="call_pos"; _}, _); _} as arg) + -> raise (Error (arg.ptyp_loc, Env.empty, Invalid_label_for_call_pos label)) + | Labelled l, _ -> Labelled l + | Optional l, _ -> Optional l + | Nolabel, _ -> Nolabel + +let transl_label_from_pat (label : Parsetree.arg_label) + (pat : Parsetree.pattern) = + let label, inner_pat = match pat with + | {ppat_desc = Ppat_constraint (inner_pat, ty); _} -> + (* If the argument is a constraint, translate the label using the + type information. Otherwise, it can't be a Position argument, so + we don't care about the argument type *) + transl_label label (Some ty), inner_pat + | _ -> transl_label label None, pat + in + label, if Btype.is_position label then inner_pat else pat + +let enrich_with_attributes attrs annotation_context = + match Builtin_attributes.error_message_attr attrs with + | Some msg -> Jkind.History.With_error_message (msg, annotation_context) + | None -> annotation_context + +let jkind_of_annotation annotation_context attrs jkind = + Jkind.of_annotation ~context:(enrich_with_attributes attrs annotation_context) jkind + (* translate the ['a 'b ('c : immediate) .] part of a polytype, - returning something suitable as the first argument of Ttyp_poly and - a [poly_univars] *) + returning a [poly_univars] *) let transl_bound_vars : (_, _) Either.t -> _ = - let mk_one v = v.txt, None in - let mk_pair (v, l) = v.txt, Option.map Location.get_txt l in function - | Left vars_only -> List.map mk_one vars_only, - TyVarEnv.make_poly_univars vars_only - | Right vars_jkinds -> List.map mk_pair vars_jkinds, - TyVarEnv.make_poly_univars_jkinds - ~context:(fun v -> Univar v) vars_jkinds + | Left vars_only -> TyVarEnv.make_poly_univars vars_only + | Right vars_jkinds -> TyVarEnv.make_poly_univars_jkinds + ~context:(fun v -> Univar ("'" ^ v)) vars_jkinds let rec transl_type env ~policy ?(aliased=false) ~row_context mode styp = Builtin_attributes.warning_scope styp.ptyp_attributes @@ -598,20 +653,18 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = in match Jane_syntax.Core_type.of_ast styp with | Some (etyp, attrs) -> - let desc, typ = - transl_type_aux_jst env ~policy ~row_context mode attrs loc etyp - in - ctyp desc typ + transl_type_aux_jst env ~policy ~row_context mode attrs loc etyp | None -> match styp.ptyp_desc with Ptyp_any -> let ty = - TyVarEnv.new_any_var loc env (Jkind.any ~why:Wildcard) policy + TyVarEnv.new_any_var loc env (TyVarEnv.new_jkind ~is_named:false policy) policy in ctyp (Ttyp_var (None, None)) ty | Ptyp_var name -> let desc, typ = - transl_type_var env ~policy ~row_context styp.ptyp_loc name None + transl_type_var env ~policy ~row_context + styp.ptyp_attributes styp.ptyp_loc name None in ctyp desc typ | Ptyp_arrow _ -> @@ -620,16 +673,13 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = match args with | (l, arg_mode, arg) :: rest -> check_arg_type arg; - let arg_cty = transl_type env ~policy ~row_context arg_mode arg in - let acc_mode = - Alloc.Const.join - (Alloc.Const.close_over arg_mode) - (Alloc.Const.partial_apply acc_mode) - in - let acc_mode = - Alloc.Const.join acc_mode - (Alloc.Const.min_with_uniqueness Uniqueness.Const.Shared) + let l = transl_label l (Some arg) in + let arg_cty = + if Btype.is_position l then + ctyp Ttyp_call_pos (newconstr Predef.path_lexing_position []) + else transl_type env ~policy ~row_context arg_mode arg in + let acc_mode = curry_mode acc_mode arg_mode in let ret_mode = match rest with | [] -> ret_mode @@ -652,22 +702,6 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = let arg_mode = Alloc.of_const arg_mode in let ret_mode = Alloc.of_const ret_mode in let arrow_desc = (l, arg_mode, ret_mode) in - (* CR layouts v3: For now, we require function arguments and returns - to have a representable jkind. See comment in - [Ctype.filter_arrow]. *) - begin match - Ctype.type_sort ~why:Function_argument env arg_ty, - Ctype.type_sort ~why:Function_result env ret_cty.ctyp_type - with - | Ok _, Ok _ -> () - | Error e, _ -> - raise (Error(arg.ptyp_loc, env, - Non_sort {vloc = Fun_arg; err = e; typ = arg_ty})) - | _, Error e -> - raise (Error(ret.ptyp_loc, env, - Non_sort - {vloc = Fun_ret; err = e; typ = ret_cty.ctyp_type})) - end; let ty = newty (Tarrow(arrow_desc, arg_ty, ret_cty.ctyp_type, commu_ok)) in @@ -676,23 +710,11 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = in loop mode args | Ptyp_tuple stl -> - assert (List.length stl >= 2); - let ctys = - List.map (transl_type env ~policy ~row_context Alloc.Const.legacy) stl + let desc, typ = + transl_type_aux_tuple env ~policy ~row_context + (List.map (fun t -> (None, t)) stl) in - List.iter (fun {ctyp_type; ctyp_loc} -> - (* CR layouts v5: remove value requirement *) - match - constrain_type_jkind - env ctyp_type (Jkind.value ~why:Tuple_element) - with - | Ok _ -> () - | Error e -> - raise (Error(ctyp_loc, env, - Non_value {vloc = Tuple; err = e; typ = ctyp_type}))) - ctys; - let ty = newty (Ttuple (List.map (fun ctyp -> ctyp.ctyp_type) ctys)) in - ctyp (Ttyp_tuple ctys) ty + ctyp desc typ | Ptyp_constr(lid, stl) -> let (path, decl) = Env.lookup_type ~loc:lid.loc lid.txt env in let stl = @@ -715,13 +737,28 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = | Some ty -> if get_level ty = Btype.generic_level then unify_var else unify in - List.iter2 - (fun (sty, cty) ty' -> + let arity = List.length params in + List.iteri + (fun idx ((sty, cty), ty') -> + begin match Types.get_desc ty' with + | Tvar {jkind; _} when Jkind.History.has_imported_history jkind -> + (* In case of a Tvar with imported jkind history, we can improve + the jkind reason using the in scope [path] to the parent type. + + Basic benchmarking suggests this change doesn't have that big + of a performance impact: compiling [types.ml] resulted in 13k + extra alloc (~0.01% increase) and building the core library had + no statistically significant increase in build time. *) + let reason = Jkind.History.Imported_type_argument + {parent_path = path; position = idx + 1; arity} in + Types.set_var_jkind ty' (Jkind.History.update_reason jkind reason) + | _ -> () + end; try unify_param env ty' cty.ctyp_type with Unify err -> let err = Errortrace.swap_unification_error err in raise (Error(sty.ptyp_loc, env, Type_mismatch err)) ) - (List.combine stl args) params; + (List.combine (List.combine stl args) params); let constr = newconstr path (List.map (fun ctyp -> ctyp.ctyp_type) args) in ctyp (Ttyp_constr (path, lid, args)) constr @@ -730,8 +767,22 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = ctyp (Ttyp_object (fields, o)) (newobj ty) | Ptyp_class(lid, stl) -> let (path, decl) = - let path, decl = Env.lookup_cltype ~loc:lid.loc lid.txt env in - (path, decl.clty_hash_type) + match Env.lookup_cltype ~loc:lid.loc lid.txt env with + | (path, decl) -> (path, decl.clty_hash_type) + (* Raise a different error if it matches the name of an unboxed type *) + | exception + (Env.Error (Lookup_error (_, _, Unbound_cltype _)) as exn) + -> + let unboxed_lid : Longident.t = + match lid.txt with + | Lident s -> Lident (s ^ "#") + | Ldot (l, s) -> Ldot (l, s ^ "#") + | Lapply _ -> fatal_error "Typetexp.transl_type" + in + match Env.find_type_by_name unboxed_lid env with + | exception Not_found -> raise exn + | (_ : _ * _) -> + raise (Error (styp.ptyp_loc, env, Did_you_mean_unboxed lid.txt)) in if List.length stl <> decl.type_arity then raise(Error(styp.ptyp_loc, env, @@ -762,14 +813,15 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = ctyp (Ttyp_class (path, lid, args)) ty | Ptyp_alias(st, alias) -> let desc, typ = - transl_type_alias env ~policy ~row_context mode loc st (Some alias) None + transl_type_alias env ~policy ~row_context + mode styp.ptyp_attributes loc st (Some alias) None in ctyp desc typ | Ptyp_variant(fields, closed, present) -> let name = ref None in let mkfield l f = newty (Tvariant (create_row ~fields:[l,f] - ~more:(newvar (Jkind.value ~why:Row_variable)) + ~more:(newvar (Jkind.Primitive.value ~why:Row_variable)) ~closed:true ~fixed:None ~name:None)) in let hfields = Hashtbl.create 17 in let add_typed_field loc l f = @@ -804,7 +856,7 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = polymorphic variants. *) match constrain_type_jkind env ctyp_type - (Jkind.value ~why:Polymorphic_variant_field) + (Jkind.Primitive.value_or_null ~why:Polymorphic_variant_field) with | Ok _ -> () | Error e -> @@ -879,9 +931,9 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = in let more = if Btype.static_row - (make_row (newvar (Jkind.value ~why:Row_variable))) + (make_row (newvar (Jkind.Primitive.value ~why:Row_variable))) then newty Tnil - else TyVarEnv.new_var (Jkind.value ~why:Row_variable) policy + else TyVarEnv.new_var (Jkind.Primitive.value ~why:Row_variable) policy in more_slot := Some more; let ty = newty (Tvariant (make_row more)) in @@ -905,89 +957,91 @@ and transl_type_aux env ~row_context ~aliased ~policy mode styp = the [create_package_mty] hack that constructs fake source code. *) let loc = styp.ptyp_loc in let l = sort_constraints_no_duplicates loc env l in - let mty = create_package_mty loc p l in - let mty = - TyVarEnv.with_local_scope (fun () -> !transl_modtype env mty) in + let mty = Ast_helper.Mty.mk ~loc (Pmty_ident p) in + let mty = TyVarEnv.with_local_scope (fun () -> !transl_modtype env mty) in let ptys = List.map (fun (s, pty) -> s, transl_type env ~policy ~row_context Alloc.Const.legacy pty ) l in - List.iter (fun (s,{ctyp_type=ty}) -> - match - Ctype.constrain_type_jkind env ty (Jkind.value ~why:Package_hack) - with - | Ok _ -> () - | Error e -> - raise (Error(s.loc,env, - Non_value {vloc=Package_constraint; typ=ty; err=e}))) - ptys; + let mty = + if ptys <> [] then + !check_package_with_type_constraints loc env mty.mty_type ptys + else mty.mty_type + in let path = !transl_modtype_longident loc env p.txt in let ty = newty (Tpackage (path, List.map (fun (s, cty) -> (s.txt, cty.ctyp_type)) ptys)) in ctyp (Ttyp_package { pack_path = path; - pack_type = mty.mty_type; + pack_type = mty; pack_fields = ptys; pack_txt = p; }) ty | Ptyp_extension ext -> raise (Error_forward (Builtin_attributes.error_of_extension ext)) -and transl_type_aux_jst env ~policy ~row_context mode _attrs loc : - Jane_syntax.Core_type.t -> _ = function - | Jtyp_layout typ -> - transl_type_aux_jst_layout env ~policy ~row_context mode loc typ +and transl_type_aux_jst env ~policy ~row_context mode attrs loc + (jtyp : Jane_syntax.Core_type.t) = + let ctyp_desc, ctyp_type = + match jtyp with + | Jtyp_layout typ -> + transl_type_aux_jst_layout env ~policy ~row_context mode attrs loc typ + | Jtyp_tuple x -> + transl_type_aux_tuple env ~policy ~row_context x + in + { ctyp_desc; ctyp_type; ctyp_env = env; ctyp_loc = loc; + ctyp_attributes = attrs } -and transl_type_aux_jst_layout env ~policy ~row_context mode loc : +and transl_type_aux_jst_layout env ~policy ~row_context mode attrs loc : Jane_syntax.Layouts.core_type -> _ = function | Ltyp_var { name = None; jkind } -> - let tjkind = Jkind.of_annotation ~context:(Type_wildcard loc) jkind in - Ttyp_var (None, Some jkind.txt), + let tjkind, tjkind_annot = + jkind_of_annotation (Type_wildcard loc) attrs jkind + in + Ttyp_var (None, Some tjkind_annot), TyVarEnv.new_any_var loc env tjkind policy | Ltyp_var { name = Some name; jkind } -> - transl_type_var env ~policy ~row_context loc name (Some jkind) + transl_type_var env ~policy ~row_context attrs loc name (Some jkind) | Ltyp_poly { bound_vars; inner_type } -> transl_type_poly env ~policy ~row_context mode loc (Either.Right bound_vars) inner_type | Ltyp_alias { aliased_type; name; jkind } -> - transl_type_alias env ~policy ~row_context mode loc aliased_type name + transl_type_alias env ~policy ~row_context mode attrs loc aliased_type name (Some jkind) -and transl_type_var env ~policy ~row_context loc name jkind_annot_opt = +and transl_type_var env ~policy ~row_context attrs loc name jkind_annot_opt = let print_name = "'" ^ name in if not (valid_tyvar_name name) then raise (Error (loc, env, Invalid_variable_name print_name)); - let of_annot = Jkind.of_annotation ~context:(Type_variable print_name) in + let of_annot = jkind_of_annotation (Type_variable print_name) attrs in let ty = try - let ty = TyVarEnv.lookup_local ~row_context name in - begin match jkind_annot_opt with - | None -> () - | Some jkind_annot -> - let jkind = of_annot jkind_annot in - match constrain_type_jkind env ty jkind with - | Ok () -> () - | Error err -> - raise (Error(jkind_annot.loc, env, Bad_jkind_annot (ty, err))) - end; - ty + TyVarEnv.lookup_local ~row_context name with Not_found -> - let jkind = match jkind_annot_opt with - | None -> Jkind.any ~why:Unification_var - | Some jkind_annot -> of_annot jkind_annot - in + let jkind = TyVarEnv.new_jkind ~is_named:true policy in let ty = TyVarEnv.new_var ~name jkind policy in TyVarEnv.remember_used name ty loc; ty in - Ttyp_var (Some name, Option.map Location.get_txt jkind_annot_opt), ty + let jkind_annot = + match jkind_annot_opt with + | None -> None + | Some jkind_annot -> + let jkind, annot = of_annot jkind_annot in + match constrain_type_jkind env ty jkind with + | Ok () -> Some annot + | Error err -> + raise (Error(jkind_annot.loc, env, Bad_jkind_annot (ty, err))) + in + Ttyp_var (Some name, jkind_annot), ty and transl_type_poly env ~policy ~row_context mode loc (vars : (_, _) Either.t) st = let typed_vars, new_univars, cty = with_local_level begin fun () -> - let typed_vars, new_univars = transl_bound_vars vars in + let new_univars = transl_bound_vars vars in + let typed_vars = TyVarEnv.ttyp_poly_arg new_univars in let cty = TyVarEnv.with_univars new_univars begin fun () -> transl_type env ~policy ~row_context mode st end in @@ -999,12 +1053,12 @@ and transl_type_poly env ~policy ~row_context mode loc (vars : (_, _) Either.t) let ty_list = TyVarEnv.check_poly_univars env loc new_univars in let ty_list = List.filter (fun v -> deep_occur v ty) ty_list in let ty' = Btype.newgenty (Tpoly(ty, ty_list)) in - unify_var env (newvar (Jkind.any ~why:Dummy_jkind)) ty'; + unify_var env (newvar (Jkind.Primitive.any ~why:Dummy_jkind)) ty'; Ttyp_poly (typed_vars, cty), ty' -and transl_type_alias env ~row_context ~policy mode alias_loc styp name_opt +and transl_type_alias env ~row_context ~policy mode attrs alias_loc styp name_opt jkind_annot_opt = - let cty = match name_opt with + let cty, jkind_annot = match name_opt with | Some alias -> begin try let t = TyVarEnv.lookup_local ~row_context alias in @@ -1015,27 +1069,31 @@ and transl_type_alias env ~row_context ~policy mode alias_loc styp name_opt let err = Errortrace.swap_unification_error err in raise(Error(alias_loc, env, Alias_type_mismatch err)) end; - begin match jkind_annot_opt with - | None -> () + let jkind_annot = match jkind_annot_opt with + | None -> None | Some jkind_annot -> - let jkind = - Jkind.of_annotation ~context:(Type_variable alias) jkind_annot + let jkind, annot = + jkind_of_annotation (Type_variable ("'" ^ alias)) attrs jkind_annot in begin match constrain_type_jkind env t jkind with | Ok () -> () | Error err -> raise (Error(jkind_annot.loc, env, Bad_jkind_annot(t, err))) - end - end; - cty + end; + Some annot + in + cty, jkind_annot with Not_found -> - let t, ty = + let t, ty, jkind_annot = with_local_level_if_principal begin fun () -> - let jkind = - Jkind.(of_annotation_option_default - ~default:(any ~why:Dummy_jkind) - ~context:(Type_variable alias) - jkind_annot_opt) + let jkind, jkind_annot = + match jkind_annot_opt with + | None -> Jkind.Primitive.any ~why:Dummy_jkind, None + | Some jkind_annot -> + let jkind, annot = + jkind_of_annotation (Type_variable ("'" ^ alias)) attrs jkind_annot + in + jkind, Some annot in let t = newvar jkind in TyVarEnv.remember_used alias t alias_loc; @@ -1044,9 +1102,9 @@ and transl_type_alias env ~row_context ~policy mode alias_loc styp name_opt let err = Errortrace.swap_unification_error err in raise(Error(alias_loc, env, Alias_type_mismatch err)) end; - (t, ty) + (t, ty, jkind_annot) end - ~post: (fun (t, _) -> generalize_structure t) + ~post: (fun (t, _, _) -> generalize_structure t) in let t = instance t in let px = Btype.proxy t in @@ -1057,7 +1115,7 @@ and transl_type_alias env ~row_context ~policy mode alias_loc styp name_opt set_type_desc px (Tunivar {name = Some alias; jkind}) | _ -> () end; - { ty with ctyp_type = t } + { ty with ctyp_type = t }, jkind_annot end | None -> let cty = transl_type env ~policy ~row_context mode styp in @@ -1066,9 +1124,8 @@ and transl_type_alias env ~row_context ~policy mode alias_loc styp name_opt | None -> Misc.fatal_error "anonymous alias without layout annotation" | Some jkind_annot -> jkind_annot in - let jkind = - Jkind.of_annotation - ~context:(Type_wildcard jkind_annot.loc) jkind_annot + let jkind, annot = + jkind_of_annotation (Type_wildcard jkind_annot.loc) attrs jkind_annot in begin match constrain_type_jkind env cty_expr jkind with | Ok () -> () @@ -1076,11 +1133,34 @@ and transl_type_alias env ~row_context ~policy mode alias_loc styp name_opt raise (Error(jkind_annot.loc, env, Bad_jkind_annot(cty_expr, err))) end; - cty + cty, Some annot in - Ttyp_alias (cty, name_opt, Option.map Location.get_txt jkind_annot_opt), + Ttyp_alias (cty, name_opt, jkind_annot), cty.ctyp_type +and transl_type_aux_tuple env ~policy ~row_context stl = + assert (List.length stl >= 2); + let ctys = + List.map + (fun (label, t) -> + label, transl_type env ~policy ~row_context Alloc.Const.legacy t) + stl + in + List.iter (fun (_, {ctyp_type; ctyp_loc}) -> + (* CR layouts v5: remove value requirement *) + match + constrain_type_jkind env ctyp_type (Jkind.Primitive.value_or_null ~why:Tuple_element) + with + | Ok _ -> () + | Error e -> + raise (Error(ctyp_loc, env, + Non_value {vloc = Tuple; err = e; typ = ctyp_type}))) + ctys; + let ctyp_type = + newty (Ttuple (List.map (fun (label, ctyp) -> label, ctyp.ctyp_type) ctys)) + in + Ttyp_tuple ctys, ctyp_type + and transl_fields env ~policy ~row_context o fields = let hfields = Hashtbl.create 17 in let add_typed_field loc l ty = @@ -1105,7 +1185,7 @@ and transl_fields env ~policy ~row_context o fields = begin match constrain_type_jkind - env ty1.ctyp_type (Jkind.value ~why:Object_field) + env ty1.ctyp_type (Jkind.Primitive.value ~why:Object_field) with | Ok _ -> () | Error e -> @@ -1152,7 +1232,7 @@ and transl_fields env ~policy ~row_context o fields = let ty_init = match o with | Closed -> newty Tnil - | Open -> TyVarEnv.new_var (Jkind.value ~why:Row_variable) policy + | Open -> TyVarEnv.new_var (Jkind.Primitive.value ~why:Row_variable) policy in let ty = List.fold_left (fun ty (s, ty') -> newty (Tfield (s, field_public, ty', ty))) ty_init fields in @@ -1189,9 +1269,13 @@ let make_fixed_univars ty = make_fixed_univars ty; Btype.unmark_type ty -let transl_simple_type env ?univars ~closed mode styp = +let transl_simple_type env ~new_var_jkind ?univars ~closed mode styp = TyVarEnv.reset_locals ?univars (); - let policy = TyVarEnv.(if closed then fixed_policy else extensible_policy) in + let policy = + if closed + then TyVarEnv.make_fixed_policy new_var_jkind + else TyVarEnv.make_extensible_policy new_var_jkind + in let typ = transl_type env policy mode styp in TyVarEnv.globalize_used_variables policy env (); make_fixed_univars typ.ctyp_type; @@ -1216,7 +1300,7 @@ let transl_simple_type_delayed env mode styp = TyVarEnv.reset_locals (); let typ, force = with_local_level begin fun () -> - let policy = TyVarEnv.extensible_policy in + let policy = TyVarEnv.make_extensible_policy Any in let typ = transl_type env policy mode styp in make_fixed_univars typ.ctyp_type; (* This brings the used variables to the global level, but doesn't link @@ -1234,7 +1318,7 @@ let transl_type_scheme_mono env styp = let typ = with_local_level begin fun () -> TyVarEnv.reset (); - transl_simple_type env ~closed:false Alloc.Const.legacy styp + transl_simple_type ~new_var_jkind:Sort env ~closed:false Alloc.Const.legacy styp end ~post:generalize_ctyp in @@ -1249,16 +1333,17 @@ let transl_type_scheme_poly env attrs loc vars inner_type = let typed_vars, univars, typ = with_local_level begin fun () -> TyVarEnv.reset (); - let typed_vars, univars = transl_bound_vars vars in + let univars = transl_bound_vars vars in + let typed_vars = TyVarEnv.ttyp_poly_arg univars in let typ = - transl_simple_type env ~univars ~closed:true Alloc.Const.legacy + transl_simple_type ~new_var_jkind:Sort env ~univars ~closed:true Alloc.Const.legacy inner_type in (typed_vars, univars, typ) end ~post:(fun (_,_,typ) -> generalize_ctyp typ) in - let _ = TyVarEnv.instance_poly_univars env loc univars in + let _ : _ list = TyVarEnv.instance_poly_univars env loc univars in { ctyp_desc = Ttyp_poly (typed_vars, typ); ctyp_type = typ.ctyp_type; ctyp_env = env; @@ -1269,7 +1354,8 @@ let transl_type_scheme_jst env styp attrs loc : Jane_syntax.Core_type.t -> _ = function | Jtyp_layout (Ltyp_poly { bound_vars; inner_type }) -> transl_type_scheme_poly env attrs loc (Right bound_vars) inner_type - | Jtyp_layout (Ltyp_var _ | Ltyp_alias _) -> + | Jtyp_layout (Ltyp_var _ | Ltyp_alias _) + | Jtyp_tuple (_ : _ list) -> transl_type_scheme_mono env styp let transl_type_scheme env styp = @@ -1305,7 +1391,7 @@ let report_error env ppf = function but is here applied to %i argument(s)@]" longident lid expected provided | Bound_type_variable name -> - fprintf ppf "Already bound type parameter %a" Printast.tyvar name + fprintf ppf "Already bound type parameter %a" Pprintast.tyvar name | Recursive_type -> fprintf ppf "This type is recursive" | Unbound_row_variable lid -> @@ -1361,7 +1447,7 @@ let report_error env ppf = function | Cannot_quantify (name, reason) -> fprintf ppf "@[The universal type variable %a cannot be generalized:@ " - Printast.tyvar name; + Pprintast.tyvar name; begin match reason with | Unified v -> fprintf ppf "it is bound to@ %a" Printtyp.type_expr v @@ -1373,14 +1459,16 @@ let report_error env ppf = function fprintf ppf ".@]"; | Bad_univar_jkind { name; jkind_info; inferred_jkind } -> fprintf ppf - "@[The universal type variable %a was %s to have@ \ - layout %a, but was inferred to have %t.@]" - Printast.tyvar name + "@[The universal type variable %a was %s to have kind %a.@;%a@]" + Pprintast.tyvar name (if jkind_info.defaulted then "defaulted" else "declared") Jkind.format jkind_info.original_jkind - (fun ppf -> match Jkind.get inferred_jkind with - | Const c -> fprintf ppf "layout %s" (Jkind.string_of_const c) - | Var _ -> fprintf ppf "a representable layout") + (Jkind.format_history ~intro:( + dprintf "But it was inferred to have %t" + (fun ppf -> match Jkind.get inferred_jkind with + | Const c -> fprintf ppf "kind %a" Jkind.Const.format c + | Var _ -> fprintf ppf "a representable kind"))) + inferred_jkind | Multiple_constraints_on_type s -> fprintf ppf "Multiple constraints for type %a" longident s | Method_mismatch (l, ty, ty') -> @@ -1407,10 +1495,9 @@ let report_error env ppf = function match vloc with | Tuple -> "Tuple element" | Poly_variant -> "Polymorphic variant constructor argument" - | Package_constraint -> "Signature package constraint" | Object_field -> "Object field" in - fprintf ppf "@[%s types must have layout value.@ \ %a@]" + fprintf ppf "@[%s types must have layout value.@ %a@]" s (Jkind.Violation.report_with_offender ~offender:(fun ppf -> Printtyp.type_expr ppf typ)) err | Non_sort {vloc; typ; err} -> @@ -1419,13 +1506,22 @@ let report_error env ppf = function | Fun_arg -> "Function argument" | Fun_ret -> "Function return" in - fprintf ppf "@[%s types must have a representable layout.@ \ %a@]" + fprintf ppf "@[%s types must have a representable layout.@ %a@]" s (Jkind.Violation.report_with_offender ~offender:(fun ppf -> Printtyp.type_expr ppf typ)) err | Bad_jkind_annot(ty, violation) -> fprintf ppf "@[Bad layout annotation:@ %a@]" (Jkind.Violation.report_with_offender ~offender:(fun ppf -> Printtyp.type_expr ppf ty)) violation + | Did_you_mean_unboxed lid -> + fprintf ppf "@[%a isn't a class type.@ \ + Did you mean the unboxed type %a#?@]" longident lid longident lid + | Invalid_label_for_call_pos arg_label -> + fprintf ppf "A position argument must not be %s." + (match arg_label with + | Nolabel -> "unlabelled" + | Optional _ -> "optional" + | Labelled _ -> assert false ) let () = Location.register_error_of_exn diff --git a/typing/typetexp.mli b/typing/typetexp.mli index 878b15b9feb..97302a66417 100644 --- a/typing/typetexp.mli +++ b/typing/typetexp.mli @@ -18,6 +18,8 @@ open Types open Mode +type jkind_initialization_choice = Sort | Any + module TyVarEnv : sig (* this is just the subset of [TyVarEnv] that is needed outside of [Typetexp]. See the ml file for more. *) @@ -34,8 +36,8 @@ module TyVarEnv : sig without jkind annotations *) val make_poly_univars_jkinds : - context:(string -> Jkind.annotation_context) -> - (string Location.loc * Jane_asttypes.jkind_annotation option) list -> + context:(string -> Jkind.History.annotation_context) -> + (string Location.loc * Jane_syntax.Jkind.annotation option) list -> poly_univars (** remember that a list of strings connotes univars; this must always be paired with a [check_poly_univars]. *) @@ -51,12 +53,58 @@ module TyVarEnv : sig (** Same as [check_poly_univars], but instantiates the resulting type scheme (i.e. variables become Tvar rather than Tunivar) *) + val ttyp_poly_arg : poly_univars -> (string * Jkind.annotation option) list + (** A suitable arg to the corresponding [Ttyp_poly] type. *) end val valid_tyvar_name : string -> bool +(** [transl_label lbl ty] produces a Typedtree argument label for an argument + with label [lbl] and type [ty]. + + Position arguments ([lbl:[%call_pos] -> ...]) are parsed as + {{!Parsetree.arg_label.Labelled}[Labelled l]}. This function converts them + to {{!Types.arg_label.Position}[Position l]} when the type is of the form + [[%call_pos]]. *) +val transl_label : + Parsetree.arg_label -> Parsetree.core_type option -> Types.arg_label + +(** Produces a Typedtree argument label, as well as the pattern corresponding + to the argument. [transl_label lbl pat] is equal to: + + - [Position l, P] when [lbl] is {{!Parsetree.arg_label.Labelled}[Labelled l]} + and [pat] represents [(P : [%call_pos])] + - [transl_label lbl None, pat] otherwise. + *) +val transl_label_from_pat : + Parsetree.arg_label -> Parsetree.pattern + -> Types.arg_label * Parsetree.pattern + +(* Note about [new_var_jkind] + + This is exposed as an option because the same initialization doesn't work in all + typing contexts. + + If it's always [Sort], then it becomes difficult to get a type variable with jkind + any in type annotations on expressions and patterns due to the lack of explicit + binding sites. + + If it's always [Any], then we risk breaking backwards compatibility with examples + such as: + + [external to_bytes : 'a -> extern_flags list -> bytes = "caml_output_value_to_bytes"] + + The general rule for selecting between [Sort] and [Any] is to use [Sort] in places + that allows users to explictly binding type variables to certain jkinds and [Any] + otherwise. + + There are some exceptions made around type manifests and type constraints to not + constrain the type parameters to representable jkinds unnecessarily while maintaining + the most amount of backwards compatibility. It is for this reason, the left hand side + of a constraint is typed using [Any] while the right hand side uses [Sort]. *) val transl_simple_type: - Env.t -> ?univars:TyVarEnv.poly_univars -> closed:bool -> Alloc.Const.t + Env.t -> new_var_jkind:jkind_initialization_choice + -> ?univars:TyVarEnv.poly_univars -> closed:bool -> Alloc.Const.t -> Parsetree.core_type -> Typedtree.core_type val transl_simple_type_univars: Env.t -> Parsetree.core_type -> Typedtree.core_type @@ -64,8 +112,9 @@ val transl_simple_type_delayed : Env.t -> Alloc.Const.t -> Parsetree.core_type -> Typedtree.core_type * type_expr * (unit -> unit) - (* Translate a type, but leave type variables unbound. Returns - the type, an instance of the corresponding type_expr, and a + (* Translate a type using [Any] as the [jkind_initialization_choice], + but leave type variables unbound. + Returns the type, an instance of the corresponding type_expr, and a function that binds the type variable. *) val transl_type_scheme: Env.t -> Parsetree.core_type -> Typedtree.core_type @@ -82,7 +131,7 @@ val get_alloc_mode : Parsetree.core_type -> Alloc.Const.t exception Already_bound type value_loc = - Tuple | Poly_variant | Package_constraint | Object_field + Tuple | Poly_variant | Object_field type sort_loc = Fun_arg | Fun_ret @@ -119,6 +168,8 @@ type error = | Non_sort of {vloc : sort_loc; typ : type_expr; err : Jkind.Violation.t} | Bad_jkind_annot of type_expr * Jkind.Violation.t + | Did_you_mean_unboxed of Longident.t + | Invalid_label_for_call_pos of Parsetree.arg_label exception Error of Location.t * Env.t * error @@ -129,3 +180,7 @@ val transl_modtype_longident: (* from Typemod *) (Location.t -> Env.t -> Longident.t -> Path.t) ref val transl_modtype: (* from Typemod *) (Env.t -> Parsetree.module_type -> Typedtree.module_type) ref +val check_package_with_type_constraints: (* from Typemod *) + (Location.t -> Env.t -> Types.module_type -> + (Longident.t Asttypes.loc * Typedtree.core_type) list -> + Types.module_type) ref diff --git a/typing/uniqueness_analysis.ml b/typing/uniqueness_analysis.ml index d23d0f3c2ab..5df9ac1853d 100644 --- a/typing/uniqueness_analysis.ml +++ b/typing/uniqueness_analysis.ml @@ -17,6 +17,7 @@ open Asttypes open Types +open Mode open Typedtree module Uniqueness = Mode.Uniqueness module Linearity = Mode.Linearity @@ -62,7 +63,7 @@ module Maybe_unique : sig (** Returns the uniqueness represented by this usage. If this identifier is expected to be unique in any branch, it will return unique. If the current usage is forced, it will return shared. *) - val uniqueness : t -> Uniqueness.t + val uniqueness : t -> Uniqueness.r end = struct (** Occurrences with modes to be forced shared and many in the future if needed. This is a list because of multiple control flows. For example, if @@ -93,11 +94,11 @@ end = struct - the expected mode must be higher than [shared] - the access mode must be lower than [many] *) match Linearity.submode lin Linearity.many with - | Error () -> Error { occ; axis = Linearity } + | Error _ -> Error { occ; axis = Linearity } | Ok () -> ( match Uniqueness.submode Uniqueness.shared uni with | Ok () -> Ok () - | Error () -> Error { occ; axis = Uniqueness }) + | Error _ -> Error { occ; axis = Uniqueness }) in iter_error force_one l @@ -125,7 +126,7 @@ module Maybe_shared : sig must be Borrowed (hence no code motion); if that mode is not restricted to Unique, this usage can be Borrowed or Shared (prefered). Raise if called more than once. *) - val set_barrier : t -> Uniqueness.t -> unit + val set_barrier : t -> Uniqueness.r -> unit val meet : t -> t -> t @@ -732,24 +733,24 @@ module Paths : sig (** Returns the element-wise child *) val child : Projection.t -> t -> t - (** Representing values whose modes are managed by the type checker. - They are ignored by uniqueness analysis and represented as empty lists *) + (** Represents a value whose modes are managed by the type checker. + It is ignored by uniqueness analysis and represented as an empty list *) val untracked : t (** [modal_child gf proj t] is [child prof t] when [gf] is [Unrestricted] and is [untracked] otherwise. *) - val modal_child : global_flag -> Projection.t -> t -> t + val modal_child : Modality.Value.Const.t -> Projection.t -> t -> t (** [tuple_field i t] is [child (Projection.Tuple_field i) t]. *) val tuple_field : int -> t -> t (** [record_field gf s t] is [modal_child gf (Projection.Record_field s) t]. *) - val record_field : global_flag -> string -> t -> t + val record_field : Modality.Value.Const.t -> string -> t -> t (** [construct_field gf s i t] is [modal_child gf (Projection.Construct_field(s, i)) t]. *) - val construct_field : global_flag -> string -> int -> t -> t + val construct_field : Modality.Value.Const.t -> string -> int -> t -> t (** [variant_field s t] is [child (Projection.Variant_field s) t]. *) val variant_field : string -> t -> t @@ -777,7 +778,19 @@ end = struct let child proj t = List.map (UF.Path.child proj) t let modal_child gf proj t = - match gf with Global -> untracked | Unrestricted -> child proj t + (* CR zqian: Instead of just ignoring such children, we should add modality + to [Projection.t] and add corresponding logic in [UsageTree]. *) + let gf = Modality.Value.Const.to_list gf in + let l = + List.filter + (function + | Atom (Monadic Uniqueness, Join_with Shared) -> true + | Atom (Comonadic Linearity, Meet_with Many) -> true + | _ -> false + : Modality.t -> _) + gf + in + if List.length l = 2 then untracked else child proj t let tuple_field i t = child (Projection.Tuple_field i) t @@ -813,10 +826,10 @@ let force_shared_boundary unique_use occ ~reason = | Error cannot_force -> raise (Error (Boundary { cannot_force; reason })) module Value : sig - (** See [mk] for its meaning *) + (** See [existing] for its meaning *) type t - (** A value contains the list of paths it could points to, the unique_use if + (** A value contains the list of paths it could point to, the unique_use if it's a variable, and its occurrence in the source code. [unique_use] could be None if it's not a variable (e.g. result of an application) *) val existing : Paths.t -> unique_use -> Occurrence.t -> t @@ -836,7 +849,8 @@ module Value : sig are the paths of [t] and [o] is [t]'s occurrence. This is used for the implicit record field values for kept fields in a [{ foo with ... }] expression. *) - val implicit_record_field : global_flag -> string -> t -> unique_use -> t + val implicit_record_field : + Modality.Value.Const.t -> string -> t -> unique_use -> t (** Mark the value as shared_or_unique *) val mark_maybe_unique : t -> UF.t @@ -990,7 +1004,7 @@ let rec pattern_match_tuple pat values = Ienv.Extension.disjunct ext0 ext1, UF.choose uf0 uf1 | Tpat_tuple pats -> List.map2 - (fun pat value -> + (fun (_, pat) value -> let paths = match Value.paths value with | None -> Paths.fresh () @@ -1029,7 +1043,7 @@ and pattern_match_single pat paths : Ienv.Extension.t * UF.t = let pats_args = List.combine pats cd.cstr_args in let ext, uf_pats = List.mapi - (fun i (pat, (_, gf)) -> + (fun i (pat, { Types.ca_modalities = gf; _ }) -> let name = Longident.last lbl.txt in let paths = Paths.construct_field gf name i paths in pattern_match_single pat paths) @@ -1052,13 +1066,13 @@ and pattern_match_single pat paths : Ienv.Extension.t * UF.t = let ext, uf_pats = List.map (fun (_, l, pat) -> - let paths = Paths.record_field l.lbl_global l.lbl_name paths in + let paths = Paths.record_field l.lbl_modalities l.lbl_name paths in pattern_match_single pat paths) pats |> conjuncts_pattern_match in ext, UF.par uf_read uf_pats - | Tpat_array (_, pats) -> + | Tpat_array (_, _, pats) -> let uf_read = Paths.mark_implicit_borrow_memory_address Read occ paths in let ext, uf_pats = List.map @@ -1079,7 +1093,7 @@ and pattern_match_single pat paths : Ienv.Extension.t * UF.t = let uf_read = Paths.mark_implicit_borrow_memory_address Read occ paths in let ext, uf_args = List.mapi - (fun i arg -> + (fun i (_, arg) -> let paths = Paths.tuple_field i paths in pattern_match_single arg paths) args @@ -1191,15 +1205,41 @@ let rec check_uniqueness_exp (ienv : Ienv.t) exp : UF.t = let ext, uf_vbs = check_uniqueness_value_bindings ienv vbs in let uf_body = check_uniqueness_exp (Ienv.extend ienv ext) body in UF.seq uf_vbs uf_body - | Texp_function { cases; _ } -> - (* `param` is only a hint not a binder; - actual binding done in cases by Tpat_var and Tpat_alias *) - let value = Match_single (Paths.fresh ()) in - let uf = check_uniqueness_cases ienv value cases in + | Texp_function { params; body; _ } -> + let ienv, uf_params = + List.fold_left_map + (fun ienv param -> + (* [param.fp_param] is only a hint not a binder; + actual binding done by [param.fp_kind]'s pattern. *) + let ext, uf_param = + match param.fp_kind with + | Tparam_pat pat -> + let value = Match_single (Paths.fresh ()) in + pattern_match pat value + | Tparam_optional_default (pat, default, _) -> + let value, uf_default = + check_uniqueness_exp_for_match ienv default + in + let ext, uf_pat = pattern_match pat value in + ext, UF.seq uf_default uf_pat + in + Ienv.extend ienv ext, uf_param) + ienv params + in + let uf_body = + match body with + | Tfunction_body body -> check_uniqueness_exp ienv body + | Tfunction_cases { fc_cases; fc_param = _; _ } -> + (* [param] is only a hint not a binder; actual binding done by the + [c_lhs] field of each of the [cases]. *) + let value = Match_single (Paths.fresh ()) in + check_uniqueness_cases ienv value fc_cases + in + let uf = UF.seq (UF.seqs uf_params) uf_body in (* we are constructing a closure here, and therefore any implicit borrowing of free variables in the closure is in fact using shared. *) lift_implicit_borrowing uf - | Texp_apply (fn, args, _, _) -> + | Texp_apply (fn, args, _, _, _) -> let uf_fn = check_uniqueness_exp ienv fn in let uf_args = List.map @@ -1221,7 +1261,7 @@ let rec check_uniqueness_exp (ienv : Ienv.t) exp : UF.t = (* we don't know how much of e will be run; safe to assume all of them *) UF.seq uf_body uf_cases | Texp_tuple (es, _) -> - UF.pars (List.map (fun e -> check_uniqueness_exp ienv e) es) + UF.pars (List.map (fun (_, e) -> check_uniqueness_exp ienv e) es) | Texp_construct (_, _, es, _) -> UF.pars (List.map (fun e -> check_uniqueness_exp ienv e) es) | Texp_variant (_, None) -> UF.unused @@ -1241,7 +1281,7 @@ let rec check_uniqueness_exp (ienv : Ienv.t) exp : UF.t = match field with | l, Kept (_, _, unique_use) -> let value = - Value.implicit_record_field l.lbl_global l.lbl_name value + Value.implicit_record_field l.lbl_modalities l.lbl_name value unique_use in Value.mark_maybe_unique value @@ -1257,7 +1297,7 @@ let rec check_uniqueness_exp (ienv : Ienv.t) exp : UF.t = let uf_arg = check_uniqueness_exp ienv arg in let uf_write = Value.mark_implicit_borrow_memory_address Write value in UF.pars [uf_rcd; uf_arg; uf_write] - | Texp_array (_, es, _) -> + | Texp_array (_, _, es, _) -> UF.pars (List.map (fun e -> check_uniqueness_exp ienv e) es) | Texp_ifthenelse (if_, then_, else_opt) -> (* if' is only borrowed, not used; but probably doesn't matter because of @@ -1282,7 +1322,7 @@ let rec check_uniqueness_exp (ienv : Ienv.t) exp : UF.t = let uf_body = check_uniqueness_exp ienv comp_body in let uf_clauses = check_uniqueness_comprehensions ienv comp_clauses in UF.par uf_body uf_clauses - | Texp_array_comprehension (_, { comp_body; comp_clauses }) -> + | Texp_array_comprehension (_, _, { comp_body; comp_clauses }) -> let uf_body = check_uniqueness_exp ienv comp_body in let uf_clauses = check_uniqueness_comprehensions ienv comp_clauses in UF.par uf_body uf_clauses @@ -1344,6 +1384,7 @@ let rec check_uniqueness_exp (ienv : Ienv.t) exp : UF.t = | Texp_probe { handler } -> check_uniqueness_exp ienv handler | Texp_probe_is_enabled _ -> UF.unused | Texp_exclave e -> check_uniqueness_exp ienv e + | Texp_src_pos -> UF.unused (** Corresponds to the first mode. @@ -1364,7 +1405,7 @@ and check_uniqueness_exp_as_value ienv exp : Value.t * UF.t = | Some value -> value in value, UF.unused - | Texp_field (e, _, l, unique_use, _) -> ( + | Texp_field (e, _, l, float) -> ( let value, uf = check_uniqueness_exp_as_value ienv e in match Value.paths value with | None -> Value.fresh, uf @@ -1372,10 +1413,16 @@ and check_uniqueness_exp_as_value ienv exp : Value.t * UF.t = (* accessing the field meaning borrowing the parent record's mem block. Note that the field itself is not borrowed or used *) let uf_read = Value.mark_implicit_borrow_memory_address Read value in - let occ = Occurrence.mk loc in - let paths = Paths.record_field l.lbl_global l.lbl_name paths in - let value = Value.existing paths unique_use occ in - value, UF.seq uf uf_read) + let uf_boxing, value = + let occ = Occurrence.mk loc in + let paths = Paths.record_field l.lbl_modalities l.lbl_name paths in + match float with + | Non_boxing unique_use -> + UF.unused, Value.existing paths unique_use occ + | Boxing (_, unique_use) -> + Paths.mark (Usage.maybe_unique unique_use occ) paths, Value.fresh + in + value, UF.seqs [uf; uf_read; uf_boxing]) (* CR-someday anlorenzen: This could also support let-bindings. *) | _ -> Value.fresh, check_uniqueness_exp ienv exp @@ -1384,7 +1431,8 @@ and check_uniqueness_exp_for_match ienv exp : value_to_match * UF.t = match exp.exp_desc with | Texp_tuple (es, _) -> let values, ufs = - List.split (List.map (check_uniqueness_exp_as_value ienv) es) + List.split + (List.map (fun (_, e) -> check_uniqueness_exp_as_value ienv e) es) in Match_tuple values, UF.pars ufs | _ -> diff --git a/typing/untypeast.ml b/typing/untypeast.ml index 29e9529f2fb..85fdfa7ee07 100644 --- a/typing/untypeast.ml +++ b/typing/untypeast.ml @@ -13,7 +13,6 @@ (* *) (**************************************************************************) -open Longident open Asttypes open Parsetree open Ast_helper @@ -78,11 +77,6 @@ open T (* Some notes: - * For Pexp_function, we cannot go back to the exact original version - when there is a default argument, because the default argument is - translated in the typer. The code, if printed, will not be parsable because - new generated identifiers are not correct. - * For Pexp_apply, it is unclear whether arguments are reordered, especially when there are optional arguments. @@ -105,19 +99,14 @@ let rec lident_of_path = function let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt} -(** Try a name [$name$0], check if it's free, if not, increment and repeat. *) -let fresh_name s env = - let name i = s ^ Int.to_string i in - let available i = not (Env.bound_value (name i) env) in - let first_i = Misc.find_first_mono available in - name first_i - (** Extract the [n] patterns from the case of a letop *) let rec extract_letop_patterns n pat = if n = 0 then pat, [] else begin match pat.pat_desc with - | Tpat_tuple([first; rest]) -> + | Tpat_tuple([None, first; None, rest]) -> + (* Labels should always be None, from when [Texp_letop] are created in + [Typecore.type_expect] *) let next, others = extract_letop_patterns (n-1) rest in first, next :: others | _ -> @@ -131,13 +120,22 @@ let rec extract_letop_patterns n pat = (** Mapping functions. *) let constant = function - | Const_char c -> Pconst_char c - | Const_string (s,loc,d) -> Pconst_string (s,loc,d) - | Const_int i -> Pconst_integer (Int.to_string i, None) - | Const_int32 i -> Pconst_integer (Int32.to_string i, Some 'l') - | Const_int64 i -> Pconst_integer (Int64.to_string i, Some 'L') - | Const_nativeint i -> Pconst_integer (Nativeint.to_string i, Some 'n') - | Const_float f -> Pconst_float (f,None) + | Const_char c -> `Parsetree (Pconst_char c) + | Const_string (s,loc,d) -> `Parsetree (Pconst_string (s,loc,d)) + | Const_int i -> `Parsetree (Pconst_integer (Int.to_string i, None)) + | Const_int32 i -> `Parsetree (Pconst_integer (Int32.to_string i, Some 'l')) + | Const_int64 i -> `Parsetree (Pconst_integer (Int64.to_string i, Some 'L')) + | Const_nativeint i -> `Parsetree (Pconst_integer (Nativeint.to_string i, Some 'n')) + | Const_float f -> `Parsetree (Pconst_float (f,None)) + | Const_float32 f -> `Parsetree (Pconst_float (f, Some 's')) + | Const_unboxed_float f -> `Jane_syntax (Jane_syntax.Layouts.Float (f, None)) + | Const_unboxed_float32 f -> `Jane_syntax (Jane_syntax.Layouts.Float (f, Some 's')) + | Const_unboxed_int32 i -> + `Jane_syntax (Jane_syntax.Layouts.Integer (Int32.to_string i, 'l')) + | Const_unboxed_int64 i -> + `Jane_syntax (Jane_syntax.Layouts.Integer (Int64.to_string i, 'L')) + | Const_unboxed_nativeint i -> + `Jane_syntax (Jane_syntax.Layouts.Integer (Nativeint.to_string i, 'n')) let attribute sub a = { attr_name = map_loc sub a.attr_name; @@ -149,7 +147,7 @@ let attributes sub l = List.map (sub.attribute sub) l let var_jkind ~loc (var, jkind) = let add_loc x = mkloc x loc in - add_loc var, Option.map add_loc jkind + add_loc var, Option.map (fun (_, annot) -> annot) jkind let structure sub str = List.map (sub.structure_item sub) str.str_items @@ -238,7 +236,8 @@ let type_parameter sub (ct, v) = (sub.typ sub ct, v) let type_declaration sub decl = let loc = sub.location sub decl.typ_loc in let attrs = sub.attributes sub decl.typ_attributes in - Type.mk ~loc ~attrs + Jane_syntax.Layouts.type_declaration_of + ~loc ~attrs ~params:(List.map (type_parameter sub) decl.typ_params) ~cstrs:( List.map @@ -247,7 +246,10 @@ let type_declaration sub decl = decl.typ_cstrs) ~kind:(sub.type_kind sub decl.typ_kind) ~priv:decl.typ_private - ?manifest:(Option.map (sub.typ sub) decl.typ_manifest) + ~manifest:(Option.map (sub.typ sub) decl.typ_manifest) + ~docs:Docstrings.empty_docs + ~text:None + ~jkind:decl.typ_jkind_annotation (map_loc sub decl.typ_name) let type_kind sub tk = match tk with @@ -258,8 +260,13 @@ let type_kind sub tk = match tk with Ptype_record (List.map (sub.label_declaration sub) list) | Ttype_open -> Ptype_open +let constructor_argument sub {ca_loc; ca_type; ca_modalities} = + let loc = sub.location sub ca_loc in + let pca_modalities = Typemode.untransl_modalities ~loc ca_modalities in + { pca_loc = loc; pca_type = sub.typ sub ca_type; pca_modalities } + let constructor_arguments sub = function - | Cstr_tuple l -> Pcstr_tuple (List.map (fun (ty, _) -> sub.typ sub ty) l) + | Cstr_tuple l -> Pcstr_tuple (List.map (constructor_argument sub) l) | Cstr_record l -> Pcstr_record (List.map (sub.label_declaration sub) l) let constructor_declaration sub cd = @@ -273,11 +280,23 @@ let constructor_declaration sub cd = ~info:Docstrings.empty_info (map_loc sub cd.cd_name) +let mutable_ (mut : Types.mutability) : mutable_flag = + match mut with + | Immutable -> Immutable + | Mutable m -> + if Mode.Alloc.Comonadic.Const.eq m Mode.Alloc.Comonadic.Const.legacy then + Mutable + else + Misc.fatal_errorf "unexpected mutable(%a)" + Mode.Alloc.Comonadic.Const.print m + let label_declaration sub ld = let loc = sub.location sub ld.ld_loc in let attrs = sub.attributes sub ld.ld_attributes in + let mut = mutable_ ld.ld_mutable in Type.field ~loc ~attrs - ~mut:ld.ld_mutable + ~mut + ~modalities:(Typemode.untransl_modalities ~loc ld.ld_modalities) (map_loc sub ld.ld_name) (sub.typ sub ld.ld_type) @@ -354,9 +373,16 @@ let pattern : type k . _ -> k T.general_pattern -> _ = fun sub pat -> | Tpat_alias (pat, _id, name, _uid, _mode) -> Ppat_alias (sub.pat sub pat, name) - | Tpat_constant cst -> Ppat_constant (constant cst) + | Tpat_constant cst -> + begin match constant cst with + | `Parsetree cst -> Ppat_constant cst + | `Jane_syntax cst -> + Jane_syntax.Layouts.pat_of ~loc (Lpat_constant cst) |> add_jane_syntax_attributes + end | Tpat_tuple list -> - Ppat_tuple (List.map (sub.pat sub) list) + Jane_syntax.Labeled_tuples.pat_of ~loc + (List.map (fun (label, p) -> label, sub.pat sub p) list, Closed) + |> add_jane_syntax_attributes | Tpat_construct (lid, _, args, vto) -> let tyo = match vto with @@ -384,11 +410,10 @@ let pattern : type k . _ -> k T.general_pattern -> _ = fun sub pat -> | Tpat_record (list, closed) -> Ppat_record (List.map (fun (lid, _, pat) -> map_loc sub lid, sub.pat sub pat) list, closed) - | Tpat_array (am, list) -> begin + | Tpat_array (am, _, list) -> begin let pats = List.map (sub.pat sub) list in - match am with - | Mutable -> Ppat_array pats - | Immutable -> + if Types.is_mutable am then Ppat_array pats + else Jane_syntax.Immutable_arrays.pat_of ~loc (Iapat_immutable_array pats) @@ -426,9 +451,13 @@ let exp_extra sub (extra, loc, attrs) sexp = | Texp_poly cto -> Pexp_poly (sexp, Option.map (sub.typ sub) cto) | Texp_newtype (s, None) -> Pexp_newtype (add_loc s, sexp) - | Texp_newtype (s, Some jkind) -> + | Texp_newtype (s, Some (_, jkind)) -> Jane_syntax.Layouts.expr_of ~loc - (Lexp_newtype(add_loc s, add_loc jkind, sexp)) + (Lexp_newtype(add_loc s, jkind, sexp)) + |> add_jane_syntax_attributes + | Texp_mode_coerce modes -> + Jane_syntax.Modes.expr_of ~loc + (Coerce (modes, sexp)) |> add_jane_syntax_attributes in Exp.mk ~loc ~attrs:!attrs desc @@ -475,6 +504,17 @@ let comprehension sub comp_type comp = in Jane_syntax.Comprehensions.expr_of (comp_type (comprehension comp)) +let label : Types.arg_label -> Parsetree.arg_label = function + (* There is no Position label in the Parsetree, since we parse [%call_pos] + arguments as Labelled. The correctness of this translation depends on + also re-inserting the constraint pattern (P : [%call_pos]) to the generated + tree. *) + | Labelled l | Position l -> Labelled l + | Optional l -> Optional l + | Nolabel -> Nolabel + +let call_pos_extension = Location.mknoloc "call_pos_extension", PStr [] + let expression sub exp = let loc = sub.location sub exp.exp_loc in let attrs = sub.attributes sub exp.exp_attributes in @@ -490,28 +530,76 @@ let expression sub exp = let desc = match exp.exp_desc with Texp_ident (_path, lid, _, _, _) -> Pexp_ident (map_loc sub lid) - | Texp_constant cst -> Pexp_constant (constant cst) + | Texp_constant cst -> + begin match constant cst with + | `Parsetree cst -> Pexp_constant cst + | `Jane_syntax cst -> + Jane_syntax.Layouts.expr_of ~loc (Lexp_constant cst) |> add_jane_syntax_attributes + end | Texp_let (rec_flag, list, exp) -> Pexp_let (rec_flag, List.map (sub.value_binding sub) list, sub.expr sub exp) - - (* Pexp_function can't have a label, so we split in 3 cases. *) - (* One case, no guard: It's a fun. *) - | Texp_function { arg_label; cases = [{c_lhs=p; c_guard=None; c_rhs=e}]; - _ } -> - Pexp_fun (arg_label, None, sub.pat sub p, sub.expr sub e) - (* No label: it's a function. *) - | Texp_function { arg_label = Nolabel; cases; _; } -> - Pexp_function (List.map (sub.case sub) cases) - (* Mix of both, we generate `fun ~label:$name$ -> match $name$ with ...` *) - | Texp_function { arg_label = Labelled s | Optional s as label; cases; - _ } -> - let name = fresh_name s exp.exp_env in - Pexp_fun (label, None, Pat.var ~loc {loc;txt = name }, - Exp.match_ ~loc (Exp.ident ~loc {loc;txt= Lident name}) - (List.map (sub.case sub) cases)) - | Texp_apply (exp, list, _, _) -> + | Texp_function { params; body } -> + let open Jane_syntax.N_ary_functions in + let body, constraint_ = + match body with + | Tfunction_body body -> + (* Unlike function cases, the [exp_extra] is placed on the body + itself. *) + Pfunction_body (sub.expr sub body), None + | Tfunction_cases + { fc_cases = cases; fc_loc = loc; fc_exp_extra = exp_extra; + fc_attributes = attributes; _ } + -> + let cases = List.map (sub.case sub) cases in + let constraint_ = + match exp_extra with + | Some (Texp_coerce (ty1, ty2)) -> + Some + (Pcoerce (Option.map (sub.typ sub) ty1, sub.typ sub ty2)) + | Some (Texp_constraint ty) -> + Some (Pconstraint (sub.typ sub ty)) + | Some (Texp_poly _ | Texp_newtype _ | Texp_mode_coerce _) + | None -> None + in + let constraint_ = + Option.map + (fun x -> { mode_annotations = Jane_syntax.Mode_expr.empty; + type_constraint = x }) + constraint_ + in + Pfunction_cases (cases, loc, attributes), constraint_ + in + let params = + List.concat_map + (fun fp -> + let pat, default_arg = + match fp.fp_kind with + | Tparam_pat pat -> pat, None + | Tparam_optional_default (pat, expr, _) -> pat, Some expr + in + let pat = sub.pat sub pat in + let default_arg = Option.map (sub.expr sub) default_arg in + let newtypes = + List.map + (fun (x, annot) -> + { pparam_desc = Pparam_newtype (x, Option.map snd annot); + pparam_loc = x.loc; + }) + fp.fp_newtypes + in + let pparam_desc = + let parg_label = label fp.fp_arg_label in + Pparam_val (parg_label, default_arg, pat) + in + { pparam_desc; pparam_loc = fp.fp_loc } :: newtypes) + params + in + Jane_syntax.N_ary_functions.expr_of ~loc (params, constraint_, body) + |> add_jane_syntax_attributes + | Texp_apply (exp, list, _, _, _) -> + let list = List.map (fun (arg_label, arg) -> label arg_label, arg) list in Pexp_apply (sub.expr sub exp, List.fold_right (fun (label, arg) list -> match arg with @@ -523,7 +611,9 @@ let expression sub exp = | Texp_try (exp, cases) -> Pexp_try (sub.expr sub exp, List.map (sub.case sub) cases) | Texp_tuple (list, _) -> - Pexp_tuple (List.map (sub.expr sub) list) + Jane_syntax.Labeled_tuples.expr_of ~loc + (List.map (fun (lbl, e) -> lbl, sub.expr sub e) list) + |> add_jane_syntax_attributes | Texp_construct (lid, _, args, _) -> Pexp_construct (map_loc sub lid, (match args with @@ -542,18 +632,16 @@ let expression sub exp = [] fields in Pexp_record (list, Option.map (sub.expr sub) extended_expression) - | Texp_field (exp, lid, _label, _, _) -> + | Texp_field (exp, lid, _label, _) -> Pexp_field (sub.expr sub exp, map_loc sub lid) | Texp_setfield (exp1, _, lid, _label, exp2) -> Pexp_setfield (sub.expr sub exp1, map_loc sub lid, sub.expr sub exp2) - | Texp_array (amut, list, _) -> begin + | Texp_array (amut, _, list, _) -> begin (* Can be inlined when we get to upstream immutable arrays *) let plist = List.map (sub.expr sub) list in - match amut with - | Mutable -> - Pexp_array plist - | Immutable -> + if Types.is_mutable amut then Pexp_array plist + else Jane_syntax.Immutable_arrays.expr_of ~loc (Iaexp_immutable_array plist) |> add_jane_syntax_attributes @@ -562,7 +650,8 @@ let expression sub exp = comprehension ~loc sub (fun comp -> Cexp_list_comprehension comp) comp |> add_jane_syntax_attributes - | Texp_array_comprehension (amut, comp) -> + | Texp_array_comprehension (amut, _, comp) -> + let amut = mutable_ amut in comprehension ~loc sub (fun comp -> Cexp_array_comprehension (amut, comp)) comp |> add_jane_syntax_attributes @@ -667,6 +756,7 @@ let expression sub exp = pexp_loc_stack = []; pexp_attributes = []; }, [Nolabel, sub.expr sub exp]) + | Texp_src_pos -> Pexp_extension ({ txt = "src_pos"; loc }, PStr []) in List.fold_right (exp_extra sub) exp.exp_extra (Exp.mk ~loc ~attrs:!attrs desc) @@ -863,10 +953,11 @@ let class_expr sub cexpr = List.map (sub.typ sub) tyl) | Tcl_structure clstr -> Pcl_structure (sub.class_structure sub clstr) - | Tcl_fun (label, pat, _pv, cl, _partial) -> - Pcl_fun (label, None, sub.pat sub pat, sub.class_expr sub cl) + | Tcl_fun (arg_label, pat, _pv, cl, _partial) -> + Pcl_fun (label arg_label, None, sub.pat sub pat, sub.class_expr sub cl) | Tcl_apply (cl, args) -> + let args = List.map (fun (arg_label, expo) -> label arg_label, expo) args in Pcl_apply (sub.class_expr sub cl, List.fold_right (fun (label, expo) list -> match expo with @@ -897,8 +988,8 @@ let class_type sub ct = Tcty_signature csg -> Pcty_signature (sub.class_signature sub csg) | Tcty_constr (_path, lid, list) -> Pcty_constr (map_loc sub lid, List.map (sub.typ sub) list) - | Tcty_arrow (label, ct, cl) -> - Pcty_arrow (label, sub.typ sub ct, sub.class_type sub cl) + | Tcty_arrow (arg_label, ct, cl) -> + Pcty_arrow (label arg_label, sub.typ sub ct, sub.class_type sub cl) | Tcty_open (od, e) -> Pcty_open (sub.open_description sub od, sub.class_type sub e) in @@ -940,13 +1031,16 @@ let core_type sub ct = let desc = match ct.ctyp_desc with | Ttyp_var (None, None) -> Ptyp_any | Ttyp_var (Some s, None) -> Ptyp_var s - | Ttyp_var (name, Some jkind) -> + | Ttyp_var (name, Some (_, jkind_annotation)) -> Jane_syntax.Layouts.type_of ~loc - (Ltyp_var { name; jkind = mkloc jkind loc }) |> + (Ltyp_var { name; jkind = jkind_annotation }) |> add_jane_syntax_attributes - | Ttyp_arrow (label, ct1, ct2) -> - Ptyp_arrow (label, sub.typ sub ct1, sub.typ sub ct2) - | Ttyp_tuple list -> Ptyp_tuple (List.map (sub.typ sub) list) + | Ttyp_arrow (arg_label, ct1, ct2) -> + Ptyp_arrow (label arg_label, sub.typ sub ct1, sub.typ sub ct2) + | Ttyp_tuple list -> + Jane_syntax.Labeled_tuples.typ_of ~loc + (List.map (fun (lbl, t) -> lbl, sub.typ sub t) list) + |> add_jane_syntax_attributes | Ttyp_constr (_path, lid, list) -> Ptyp_constr (map_loc sub lid, List.map (sub.typ sub) list) @@ -957,10 +1051,10 @@ let core_type sub ct = Ptyp_class (map_loc sub lid, List.map (sub.typ sub) list) | Ttyp_alias (ct, Some s, None) -> Ptyp_alias (sub.typ sub ct, s) - | Ttyp_alias (ct, s, Some jkind) -> + | Ttyp_alias (ct, s, Some (_, jkind_annotation)) -> Jane_syntax.Layouts.type_of ~loc (Ltyp_alias { aliased_type = sub.typ sub ct; name = s; - jkind = mkloc jkind loc }) |> + jkind = jkind_annotation }) |> add_jane_syntax_attributes | Ttyp_alias (_, None, None) -> Misc.fatal_error "anonymous alias without layout annotation in Untypeast" @@ -972,6 +1066,8 @@ let core_type sub ct = (Ltyp_poly { bound_vars; inner_type = sub.typ sub ct }) |> add_jane_syntax_attributes | Ttyp_package pack -> Ptyp_package (sub.package_type sub pack) + | Ttyp_call_pos -> + Ptyp_extension call_pos_extension in Typ.mk ~loc ~attrs:!attrs desc @@ -1011,6 +1107,24 @@ and is_self_pat = function string_is_prefix "self-" (Ident.name id) | _ -> false +(* [Typeclass] adds a [self] parameter to initializers and methods that isn't + present in the source program. +*) +let remove_fun_self exp = + match exp with + | { exp_desc = + Texp_function + ({ params = + {fp_arg_label = Nolabel; fp_kind = Tparam_pat pat} :: params + ; body + } as fun_) + } + when is_self_pat pat -> + (match params, body with + | [], Tfunction_body body -> body + | _, _ -> { exp with exp_desc = Texp_function { fun_ with params } }) + | e -> e + let class_field sub cf = let loc = sub.location sub cf.cf_loc in let attrs = sub.attributes sub cf.cf_attributes in @@ -1027,21 +1141,9 @@ let class_field sub cf = | Tcf_method (lab, priv, Tcfk_virtual cty) -> Pcf_method (lab, priv, Cfk_virtual (sub.typ sub cty)) | Tcf_method (lab, priv, Tcfk_concrete (o, exp)) -> - let remove_fun_self = function - | { exp_desc = - Texp_function { arg_label = Nolabel; cases = [case]; _ } } - when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs - | e -> e - in let exp = remove_fun_self exp in Pcf_method (lab, priv, Cfk_concrete (o, sub.expr sub exp)) | Tcf_initializer exp -> - let remove_fun_self = function - | { exp_desc = - Texp_function { arg_label = Nolabel; cases = [case]; _ } } - when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs - | e -> e - in let exp = remove_fun_self exp in Pcf_initializer (sub.expr sub exp) | Tcf_attribute x -> Pcf_attribute x diff --git a/typing/untypeast.mli b/typing/untypeast.mli index 809df9ad086..f4999384124 100644 --- a/typing/untypeast.mli +++ b/typing/untypeast.mli @@ -84,4 +84,5 @@ val untype_signature : ?mapper:mapper -> Typedtree.signature -> signature val untype_expression : ?mapper:mapper -> Typedtree.expression -> expression val untype_pattern : ?mapper:mapper -> _ Typedtree.general_pattern -> pattern -val constant : Asttypes.constant -> Parsetree.constant +val constant : Typedtree.constant -> + [ `Parsetree of Parsetree.constant | `Jane_syntax of Jane_syntax.Layouts.constant ] diff --git a/typing/rec_check.ml b/typing/value_rec_check.ml similarity index 84% rename from typing/rec_check.ml rename to typing/value_rec_check.ml index e35c2eb9937..0881fa328f2 100644 --- a/typing/rec_check.ml +++ b/typing/value_rec_check.ml @@ -102,11 +102,9 @@ open Asttypes open Typedtree open Types -exception Illegal_expr - (** {1 Static or dynamic size} *) -type sd = Static | Dynamic +type sd = Value_rec_types.recursive_binding_kind let is_ref : Types.value_description -> bool = function | { Types.val_kind = @@ -142,17 +140,27 @@ let classify_expression : Typedtree.expression -> sd = The first definition can be allowed (`y` has a statically-known size) but the second one is unsound (`y` has no statically-known size). *) - let rec classify_expression env e = match e.exp_desc with + let rec classify_expression env e : sd = + match e.exp_desc with (* binding and variable cases *) | Texp_let (rec_flag, vb, e) -> let env = classify_value_bindings rec_flag env vb in classify_expression env e + | Texp_letmodule (Some mid, _, _, mexp, e) -> + (* Note on module presence: + For absent modules (i.e. module aliases), the module being bound + does not have a physical representation, but its size can still be + derived from the alias itself, so we can re-use the same code as + for modules that are present. *) + let size = classify_module_expression env mexp in + let env = Ident.add mid size env in + classify_expression env e | Texp_ident (path, _, _, _, _) -> classify_path env path (* non-binding cases *) | Texp_open (_, e) - | Texp_letmodule (_, _, _, _, e) + | Texp_letmodule (None, _, _, _, e) | Texp_sequence (_, _, e) | Texp_letexception (_, e) | Texp_exclave e -> @@ -166,38 +174,69 @@ let classify_expression : Typedtree.expression -> sd = | Texp_record { representation = Record_unboxed; fields = [| _, Overridden (_,e) |] } -> classify_expression env e + | Texp_record { representation = Record_ufloat; _ } -> + Dynamic | Texp_record _ -> Static - | Texp_apply ({exp_desc = Texp_ident (_, _, vd, Id_prim _, _)}, _, _, _) + | Texp_variant _ + | Texp_tuple _ + | Texp_extension_constructor _ + | Texp_constant _ + | Texp_src_pos -> + Static + + | Texp_for _ + | Texp_setfield _ + | Texp_while _ + | Texp_setinstvar _ -> + (* Unit-returning expressions *) + Static + + | Texp_unreachable -> + Static + + | Texp_probe _ + | Texp_probe_is_enabled _ -> + (* CR vlaviron: Dynamic would probably be a better choice *) + Static + + | Texp_apply ({exp_desc = Texp_ident (_, _, vd, Id_prim _, _)}, _, _, _, _) when is_ref vd -> Static - | Texp_apply (_, args, _, _) + | Texp_apply (_, args, _, _, _) when List.exists is_abstracted_arg args -> Static | Texp_apply _ -> Dynamic - | Texp_for _ - | Texp_constant _ + | Texp_array _ -> + Static + | Texp_pack mexp -> + classify_module_expression env mexp + | Texp_function _ -> + Static + | Texp_lazy e -> + (* The code below was copied (in part) from translcore.ml *) + begin match Typeopt.classify_lazy_argument e with + | `Constant_or_function -> + (* A constant expr (of type <> float if [Config.flat_float_array] is + true) gets compiled as itself. *) + classify_expression env e + | `Float_that_cannot_be_shortcut + | `Identifier `Forward_value -> + (* Forward blocks *) + Static + | `Identifier `Other -> + classify_expression env e + | `Other -> + (* other cases compile to a lazy block holding a function *) + Static + end + | Texp_new _ | Texp_instvar _ - | Texp_tuple _ - | Texp_array _ - | Texp_variant _ - | Texp_setfield _ - | Texp_while _ - | Texp_setinstvar _ - | Texp_pack _ | Texp_object _ - | Texp_function _ - | Texp_lazy _ - | Texp_unreachable - | Texp_extension_constructor _ - | Texp_probe _ - | Texp_probe_is_enabled _ -> - Static - | Texp_match _ | Texp_list_comprehension _ | Texp_array_comprehension _ @@ -233,7 +272,7 @@ let classify_expression : Typedtree.expression -> sd = env in List.fold_left add_value_binding env bindings - and classify_path env = function + and classify_path env : _ -> Value_rec_types.recursive_binding_kind = function | Path.Pident x -> begin try Ident.find_same x env @@ -248,7 +287,7 @@ let classify_expression : Typedtree.expression -> sd = For non-local identifiers it might be reasonable (although not completely clear) to consider them Static (they have already been evaluated), but for the others we must - under-approximate with Dynamic. + under-approximate with Not_recursive. This could be fixed by a more complete implementation. *) @@ -259,6 +298,33 @@ let classify_expression : Typedtree.expression -> sd = classify_expression could be extend to compute module shapes more precisely *) Dynamic + and classify_module_expression env mexp : sd = + match mexp.mod_desc with + | Tmod_ident (path, _) -> + classify_path env path + | Tmod_structure _ -> + Static + | Tmod_functor _ -> + Static + | Tmod_apply _ -> + Dynamic + | Tmod_apply_unit _ -> + Dynamic + | Tmod_constraint (mexp, _, _, coe) -> + begin match coe with + | Tcoerce_none -> + classify_module_expression env mexp + | Tcoerce_structure _ -> + Static + | Tcoerce_functor _ -> + Static + | Tcoerce_primitive _ -> + Misc.fatal_error "letrec: primitive coercion on a module" + | Tcoerce_alias _ -> + Misc.fatal_error "letrec: alias coercion on a module" + end + | Tmod_unpack (e, _) -> + classify_expression env e in classify_expression Ident.empty @@ -486,6 +552,11 @@ let option : 'a. ('a -> term_judg) -> 'a option -> term_judg = let list : 'a. ('a -> term_judg) -> 'a list -> term_judg = fun f li m -> List.fold_left (fun env item -> Env.join env (f item m)) Env.empty li +let listi : 'a. (int -> 'a -> term_judg) -> 'a list -> term_judg = + fun f li m -> + List.fold_left (fun (idx, env) item -> idx+1, Env.join env (f idx item m)) + (0, Env.empty) li + |> (snd : (int * Env.t) -> Env.t) let array : 'a. ('a -> term_judg) -> 'a array -> term_judg = fun f ar m -> Array.fold_left (fun env item -> Env.join env (f item m)) Env.empty ar @@ -515,7 +586,7 @@ let (>>) : bind_judg -> term_judg -> term_judg = fun binder term mode -> binder mode (term mode) (* Compute the appropriate [mode] for an array expression *) -let array_mode exp = match Typeopt.array_kind exp with +let array_mode exp elt_sort = match Typeopt.array_kind exp elt_sort with | Lambda.Pfloatarray -> (* (flat) float arrays unbox their elements *) Dereference @@ -526,6 +597,8 @@ let array_mode exp = match Typeopt.array_kind exp with | Lambda.Paddrarray | Lambda.Pintarray -> (* non-generic, non-float arrays act as constructors *) Guard + | Lambda.Punboxedfloatarray _ | Lambda.Punboxedintarray _ -> + Dereference (* Expression judgment: G |- e : m @@ -583,7 +656,8 @@ let rec expression : Typedtree.expression -> term_judg = | Texp_instvar (self_path, pth, _inst_var) -> join [path self_path << Dereference; path pth] | Texp_apply - ({exp_desc = Texp_ident (_, _, vd, Id_prim _, _)}, [_, Arg (arg, _)], _, _) + ({exp_desc = Texp_ident (_, _, vd, Id_prim _, _)}, [_, Arg (arg, _)], _, + _, _) when is_ref vd -> (* G |- e: m[Guard] @@ -591,7 +665,7 @@ let rec expression : Typedtree.expression -> term_judg = G |- ref e: m *) expression arg << Guard - | Texp_apply (e, args, _, _) -> + | Texp_apply (e, args, _, _, _) -> let arg (_, arg) = match arg with | Omitted _ -> empty @@ -606,14 +680,14 @@ let rec expression : Typedtree.expression -> term_judg = in join [expression e; list arg args] << app_mode | Texp_tuple (exprs, _) -> - list expression exprs << Guard - | Texp_array (_, exprs, _) -> - list expression exprs << array_mode exp + list expression (List.map snd exprs) << Guard + | Texp_array (_, elt_sort, exprs, _) -> + list expression exprs << array_mode exp elt_sort | Texp_list_comprehension { comp_body; comp_clauses } -> join ((expression comp_body << Guard) :: comprehension_clauses comp_clauses) - | Texp_array_comprehension (_, { comp_body; comp_clauses }) -> - join ((expression comp_body << array_mode exp) :: + | Texp_array_comprehension (_, elt_sort, { comp_body; comp_clauses }) -> + join ((expression comp_body << array_mode exp elt_sort) :: comprehension_clauses comp_clauses) | Texp_construct (_, desc, exprs, _) -> let access_constructor = @@ -622,15 +696,21 @@ let rec expression : Typedtree.expression -> term_judg = path pth << Dereference | _ -> empty in - let m' = match desc.cstr_repr with + let arg_mode i = match desc.cstr_repr with | Variant_unboxed -> Return | Variant_boxed _ | Variant_extensible -> - Guard + (match desc.cstr_shape with + | Constructor_uniform_value -> Guard + | Constructor_mixed mixed_shape -> + (match get_mixed_product_element mixed_shape i with + | Value_prefix -> Guard + | Flat_suffix _ -> Dereference)) in + let arg i e = expression e << arg_mode i in join [ access_constructor; - list expression exprs << m' + listi arg exprs; ] | Texp_variant (_, eo) -> (* @@ -641,17 +721,27 @@ let rec expression : Typedtree.expression -> term_judg = option (fun (e, _) -> expression e) eo << Guard | Texp_record { fields = es; extended_expression = eo; representation = rep } -> - let field_mode = match rep with + let field_mode i = match rep with | Record_float | Record_ufloat -> Dereference - | Record_unboxed | Record_inlined (_,Variant_unboxed) -> Return - | Record_boxed _ | Record_inlined _ -> Guard + | Record_unboxed | Record_inlined (_, _, Variant_unboxed) -> Return + | Record_boxed _ | Record_inlined (_, Constructor_uniform_value, _) -> + Guard + | Record_inlined (_, Constructor_mixed mixed_shape, _) + | Record_mixed mixed_shape -> + (match get_mixed_product_element mixed_shape i with + | Value_prefix -> Guard + | Flat_suffix _ -> Dereference) in - let field (_label, field_def) = match field_def with - Kept _ -> empty - | Overridden (_, e) -> expression e + let field (label, field_def) = + let env = + match field_def with + | Kept _ -> empty + | Overridden (_, e) -> expression e + in + env << field_mode label.lbl_num in join [ - array field es << field_mode; + array field es; option expression eo << Dereference ] | Texp_ifthenelse (cond, ifso, ifnot) -> @@ -718,7 +808,7 @@ let rec expression : Typedtree.expression -> term_judg = join [ expression e1 << Dereference ] - | Texp_field (e, _, _, _, _) -> + | Texp_field (e, _, _, _) -> (* G |- e: m[Dereference] ----------------------- @@ -790,18 +880,54 @@ let rec expression : Typedtree.expression -> term_judg = path pth << Dereference; list field fields << Dereference; ] - | Texp_function { cases } -> + | Texp_function { params; body } -> (* - (Gi; _ |- pi -> ei : m[Delay])^i - -------------------------------------- - sum(Gi)^i |- function (pi -> ei)^i : m - - Contrarily to match, the value that is pattern-matched - is bound locally, so the pattern modes do not influence - the final environment. + G |-{body} b : m[Delay] + (Hj |-{def} Pj : m[Delay])^j + H := sum(Hj)^j + ps := sum(pat(Pj))^j + ----------------------------------- + G + H - ps |- fun (Pj)^j -> b : m *) - let case_env c m = fst (case c m) in - list case_env cases << Delay + let param_pat param = + (* param P ::= + | ?(pat = expr) + | pat + + Define pat(P) as + pat if P = ?(pat = expr) + pat if P = pat + *) + match param.fp_kind with + | Tparam_pat pat -> pat + | Tparam_optional_default (pat, _, _) -> pat + in + (* Optional argument defaults. + G |-{def} P : m + *) + let param_default param = + match param.fp_kind with + | Tparam_optional_default (_, default, _) -> + (* + G |- e : m + ------------------ + G |-{def} ?(p=e) : m + *) + expression default + | Tparam_pat _ -> + (* + ------------------ + . |-{def} p : m + *) + empty + in + let patterns = List.map param_pat params in + let defaults = List.map param_default params in + let body = function_body body in + let f = join (body :: defaults) << Delay in + (fun m -> + let env = f m in + remove_patlist patterns env) | Texp_lazy e -> (* G |- e: m[Delay] @@ -837,6 +963,35 @@ let rec expression : Typedtree.expression -> term_judg = expression handler << Dereference | Texp_probe_is_enabled _ -> empty | Texp_exclave e -> expression e + | Texp_src_pos -> empty + +(* Function bodies. + G |-{body} b : m +*) +and function_body body = + match body with + | Tfunction_body body -> + (* + G |- e : m + ------------------ + G |-{body} e : m (**) + + (**) The "e" here stands for [Tfunction_body] as opposed to + [Tfunction_cases]. + *) + expression body + | Tfunction_cases { fc_cases = cases; _ } -> + (* + (Gi; _ |- pi -> ei : m)^i (**) + ------------------ + sum(Gi)^i |-{body} function (pi -> ei)^i : m + + (**) Contrarily to match, the values that are pattern-matched + are bound locally, so the pattern modes do not influence + the final environment. + *) + List.map (fun c mode -> fst (case c mode)) cases + |> join and comprehension_clauses clauses = List.concat_map @@ -1245,21 +1400,25 @@ and is_destructuring_pattern : type k . k general_pattern -> bool = | Tpat_or (l,r,_) -> is_destructuring_pattern l || is_destructuring_pattern r -let is_valid_recursive_expression idlist expr = +let is_valid_recursive_expression idlist expr : sd option = match expr.exp_desc with | Texp_function _ -> (* Fast path: functions can never have invalid recursive references *) - true + Some Static | _ -> - match classify_expression expr with - | Static -> - (* The expression has known size *) - let ty = expression expr Return in - Env.unguarded ty idlist = [] - | Dynamic -> - (* The expression has unknown size *) - let ty = expression expr Return in - Env.unguarded ty idlist = [] && Env.dependent ty idlist = [] + let rkind = classify_expression expr in + let is_valid = + match rkind with + | Static -> + (* The expression has known size or is constant *) + let ty = expression expr Return in + Env.unguarded ty idlist = [] + | Dynamic -> + (* The expression has unknown size *) + let ty = expression expr Return in + Env.unguarded ty idlist = [] && Env.dependent ty idlist = [] + in + if is_valid then Some rkind else None (* A class declaration may contain let-bindings. If they are recursive, their validity will already be checked by [is_valid_recursive_expression] diff --git a/typing/rec_check.mli b/typing/value_rec_check.mli similarity index 89% rename from typing/rec_check.mli rename to typing/value_rec_check.mli index aa5c1ca3c1a..8010e7c92c3 100644 --- a/typing/rec_check.mli +++ b/typing/value_rec_check.mli @@ -12,8 +12,9 @@ (* *) (**************************************************************************) -exception Illegal_expr - -val is_valid_recursive_expression : Ident.t list -> Typedtree.expression -> bool +val is_valid_recursive_expression : + Ident.t list -> + Typedtree.expression -> + Value_rec_types.recursive_binding_kind option val is_valid_class_expr : Ident.t list -> Typedtree.class_expr -> bool diff --git a/typing/value_rec_types.mli b/typing/value_rec_types.mli new file mode 100644 index 00000000000..a907935cc9f --- /dev/null +++ b/typing/value_rec_types.mli @@ -0,0 +1,27 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Vincent Laviron, OCamlPro *) +(* *) +(* Copyright 2023 OCamlPro, SAS *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +(** Types related to the compilation of value let-recs (non-functional + recursive definitions) *) + +(** The kind of recursive bindings, as computed by + [Value_rec_check.classify_expression] *) +type recursive_binding_kind = +| Static + (** Bindings for which some kind of pre-allocation scheme is possible. + The expression is allowed to be recursive, as long as its definition does + not inspect recursively defined values. *) +| Dynamic + (** Bindings for which pre-allocation is not possible. + The expression is not allowed to refer to any recursive variable. *) diff --git a/typing/zero_alloc.ml b/typing/zero_alloc.ml new file mode 100644 index 00000000000..7b559f696aa --- /dev/null +++ b/typing/zero_alloc.ml @@ -0,0 +1,193 @@ +module ZA = Zero_alloc_utils + +(* Support for zero_alloc *) +type check = Builtin_attributes.zero_alloc_check = + { strict: bool; + opt: bool; + arity: int; + loc: Location.t; + } + +type assume = Builtin_attributes.zero_alloc_assume = + { strict: bool; + never_returns_normally: bool; + never_raises: bool; + arity: int; + loc: Location.t; + } + +type const = Builtin_attributes.zero_alloc_attribute = + | Default_zero_alloc + | Ignore_assert_all + | Check of check + | Assume of assume + +type desc = { strict : bool; opt : bool } + +type var = + { loc : Location.t; + arity : int; + mutable desc : desc option; + (* None indicates the default case (no check will be done). If the desc is + present this var has been constrained by some signature that requires a + check. *) + } + +type t = + | Const of const + | Var of var + +(* For backtracking *) +type change = desc option * var +let undo_change (d, v) = v.desc <- d +let log_change = ref (fun _ -> ()) +let set_change_log f = log_change := f + +let create_const x = Const x +let create_var loc arity = Var { loc; arity; desc = None } +let default = Const Default_zero_alloc + +let get (t : t) = + match t with + | Const c -> c + | Var { loc; arity; desc } -> + match desc with + | None -> Default_zero_alloc + | Some { strict; opt } -> + Check { loc; arity; strict; opt } + +type error = + | Less_general of { missing_entirely : bool } + | Arity_mismatch of int * int + +exception Error of error + +let print_error ppf error = + let pr fmt = Format.fprintf ppf fmt in + match error with + | Less_general { missing_entirely } -> + pr "The former provides a weaker \"zero_alloc\" guarantee than the latter."; + if missing_entirely then + pr "@ Hint: Add a \"zero_alloc\" attribute to the implementation." + | Arity_mismatch (n1, n2) -> + pr "zero_alloc arity mismatch:@ \ + When using \"zero_alloc\" in a signature, the syntactic arity of@ \ + the implementation must match the function type in the interface.@ \ + Here the former is %d and the latter is %d." + n1 n2 + +let sub_const_const_exn za1 za2 = + (* The core of the check here is that we translate both attributes into the + abstract domain and use the existing inclusion check from there, ensuring + what we do in the typechecker matches the backend. + + There are a few additional details: + + - [opt] is not captured by the abstract domain, so we need a special check + for it. But it doesn't interact at all with the abstract domain - it's + just about whether or not the check happens - so this special check can + be fully separate. + - [arity] is also not captured by the abstract domain - it exists only for + use here, in typechecking. If the arities do not match, we issue an + error. It's essential for the soundness of the way we (will, in the next + PR) use zero_alloc in signatures that the apparent arity of the type in + the signature matches the syntactic arity of the function. + - [ignore] can not appear in zero_alloc attributes in signatures, and is + erased from structure items when computing their signature, so we don't + need to consider it here. + *) + let open Builtin_attributes in + (* abstract domain check *) + let abstract_value za = + match za with + | Default_zero_alloc | Ignore_assert_all -> ZA.Assume_info.Value.top () + | Check { strict; _ } -> + ZA.Assume_info.Value.of_annotation ~strict ~never_returns_normally:false + ~never_raises:false + | Assume { strict; never_returns_normally; never_raises; } -> + ZA.Assume_info.Value.of_annotation ~strict ~never_returns_normally + ~never_raises + in + let v1 = abstract_value za1 in + let v2 = abstract_value za2 in + if not (ZA.Assume_info.Value.lessequal v1 v2) then + begin let missing_entirely = + match za1 with + | Default_zero_alloc -> true + | Ignore_assert_all | Check _ | Assume _ -> false + in + raise (Error (Less_general {missing_entirely})) + end; + (* opt check *) + begin match za1, za2 with + | Check { opt = opt1; _ }, Check { opt = opt2; _ } -> + if opt1 && not opt2 then + raise (Error (Less_general {missing_entirely = false})) + | (Check _ | Default_zero_alloc | Assume _ | Ignore_assert_all), _ -> () + end; + (* arity check *) + let get_arity = function + | Check { arity; _ } | Assume { arity; _ } -> Some arity + | Default_zero_alloc | Ignore_assert_all -> None + in + match get_arity za1, get_arity za2 with + | Some arity1, Some arity2 -> + (* Check *) + if not (arity1 = arity2) then + raise (Error (Arity_mismatch (arity1, arity2))) + | Some _, None -> () + (* Forgetting zero_alloc info is fine *) + | None, Some _ -> + (* Fabricating it is not, but earlier cases should have ruled this out *) + Misc.fatal_error "Zero_alloc: sub_const_exn" + | None, None -> () + +let sub_var_const_exn v c = + (* This can only fail due to an arity mismatch. We have a linear order and can + always constrain the var lower to make the sub succeed. *) + match v, c with + | _, (Default_zero_alloc | Ignore_assert_all | Assume _) -> assert false + | { arity = arity1; _ }, Check { arity = arity2; _ } + when arity1 <> arity2 -> + raise (Error (Arity_mismatch (arity1, arity2))) + | { desc = None; _ }, Check { strict; opt; _ } -> + !log_change (None, v); + v.desc <- Some { strict; opt } + | { desc = (Some { strict = strict1; opt = opt1 } as desc); _ }, + Check { strict = strict2; opt = opt2 } -> + let strict = strict1 || strict2 in + let opt = opt1 && opt2 in + if strict <> strict1 || opt <> opt1 then begin + !log_change (desc, v); + v.desc <- Some { strict; opt } + end + +let sub_exn za1 za2 = + match za1, za2 with + | _, Var _ -> + (* A fully inferred signature will never have a variable in it, so we almost + never have to constrain by a variable, but there is one special case: + + The typing of modules (e.g., the [Pmod_structure] case of + [Typemod.type_module_aux]) works by (1) computing a naive signature + containing every definition in the module, (2) constructing a simplified + signature that, for example, removes shadowed things, and (3) + constraining the original signature by the simplfied signature. These + signatures _do_ have variables in them, so we allow the special case of + constraining a variable by itself (which is obviously sound in any + event). + *) + if not (za1 == za2) then + Misc.fatal_error "zero_alloc: variable constraint" + | _, Const (Ignore_assert_all | Assume _) -> + Misc.fatal_error "zero_alloc: invalid constraint" + | _, (Const Default_zero_alloc) -> () + | Var v, Const c -> sub_var_const_exn v c + | Const c1, Const c2 -> sub_const_const_exn c1 c2 + +let sub za1 za2 = + try + sub_exn za1 za2; + Ok () + with + | Error e -> Result.Error e diff --git a/typing/zero_alloc.mli b/typing/zero_alloc.mli new file mode 100644 index 00000000000..cdbe220ec4d --- /dev/null +++ b/typing/zero_alloc.mli @@ -0,0 +1,55 @@ +type check = Builtin_attributes.zero_alloc_check = + { strict: bool; + opt: bool; + arity: int; + loc: Location.t; + } + +type assume = Builtin_attributes.zero_alloc_assume = + { strict: bool; + never_returns_normally: bool; + never_raises: bool; + arity: int; + loc: Location.t; + } + +type const = Builtin_attributes.zero_alloc_attribute = + | Default_zero_alloc + | Ignore_assert_all + | Check of check + | Assume of assume + +(* This type represents whether or not a function will be checked for + zero-alloc-ness, and with what configuration (strict, opt, etc). It can be a + variable which will be filled in when the module the function is in is + compared against its signature, allowing to infer zero-alloc checks. *) +type t + +(* [default] corresponds to [Default_zero_alloc], meaning no check will be + done. *) +val default : t + +val create_const : const -> t + +(* [create_var loc n] creates a variable. [loc] is the location of the function + you are creating a variable for, and [n] is its syntactic arity of the + function the variable is being created for. *) +val create_var : Location.t -> int -> t + +(* In the case [t] is a variable, [get t] returns its current contents as a + [const] and has no effect. *) +val get : t -> const + +(* For types.ml's backtracking mechanism. *) +type change +val set_change_log : (change -> unit) -> unit +val undo_change : change -> unit + +(* These are the errors that may be raised by [sub_exn] below. *) +type error +val print_error : Format.formatter -> error -> unit + +(* [sub t1 t2] checks whether the zero_alloc check t1 is stronger than the + zero_alloc check t2. It returns [Ok ()] if so, and [Error e] if not. If [t1] + is a variable, it may be set to make the relation hold. *) +val sub : t -> t -> (unit, error) Result.t diff --git a/utils/.ocamlformat-enable b/utils/.ocamlformat-enable index 330a26761ec..2a6756eafe1 100644 --- a/utils/.ocamlformat-enable +++ b/utils/.ocamlformat-enable @@ -4,3 +4,5 @@ import_info.ml import_info.mli language_extension.ml language_extension.mli +zero_alloc_utils.ml +zero_alloc_utils.mli diff --git a/utils/ccomp.ml b/utils/ccomp.ml index 41d481b2e80..a6318cf0922 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -115,7 +115,8 @@ let compile_file ?output ?(opt="") ?stable_name name = (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_prefixed ~response_files:true "-I" (List.map (Misc.expand_directory Config.standard_library) - (List.rev !Clflags.include_dirs))) + (List.rev ( !Clflags.hidden_include_dirs + @ !Clflags.include_dirs)))) (Clflags.std_include_flag "-I") (Filename.quote name) (* cl tediously includes the name of the C file as the first thing it @@ -185,7 +186,7 @@ let call_linker ?(native_toplevel = false) mode output_name files extra = Config.native_pack_linker (Filename.quote output_name) (quote_prefixed ~response_files:true - l_prefix (Load_path.get_paths ())) + l_prefix (Load_path.get_path_list ())) (quote_files ~response_files:true (remove_Wl files)) extra else @@ -201,7 +202,8 @@ let call_linker ?(native_toplevel = false) mode output_name files extra = "" (*(Clflags.std_include_flag "-I")*) (if native_toplevel then "" else - quote_prefixed ~response_files:true "-L" (Load_path.get_paths ())) + quote_prefixed ~response_files:true "-L" + (Load_path.get_path_list ())) (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_files ~response_files:true files) extra diff --git a/utils/clflags.ml b/utils/clflags.ml index 3ebaab9d7ee..f8af7531223 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -44,9 +44,19 @@ and dllibs = ref ([] : string list) (* .so and -dllib -lxxx *) let cmi_file = ref None +module Libloc = struct + type t = { + path: string; + libs: string list; + hidden_libs: string list + } +end + let compile_only = ref false (* -c *) and output_name = ref (None : string option) (* -o *) -and include_dirs = ref ([] : string list)(* -I *) +and include_dirs = ref ([] : string list) (* -I *) +and hidden_include_dirs = ref ([] : string list) (* -H *) +and libloc = ref ([] : Libloc.t list) (* -libloc *) and no_std_include = ref false (* -nostdlib *) and no_cwd = ref false (* -nocwd *) and print_types = ref false (* -i *) @@ -70,9 +80,11 @@ and safer_matching = ref false (* -safer-matching *) and preprocessor = ref(None : string option) (* -pp *) and all_ppx = ref ([] : string list) (* -ppx *) let absname = ref false (* -absname *) +let directory = ref None (* -directory *) let annotations = ref false (* -annot *) let binary_annotations = ref false (* -bin-annot *) let binary_annotations_cms = ref false (* -bin-annot-cms *) +let store_occurrences = ref false (* -bin-annot-occurrences *) and use_threads = ref false (* -thread *) and noassert = ref false (* -noassert *) and verbose = ref false (* -verbose *) @@ -98,17 +110,21 @@ and no_auto_link = ref false (* -noautolink *) and dllpaths = ref ([] : string list) (* -dllpath *) and make_package = ref false (* -pack *) and for_package = ref (None: string option) (* -for-pack *) -and error_size = ref 500 (* -error-size *) +and error_size = ref 256 (* -error-size *) and float_const_prop = ref true (* -no-float-const-prop *) and transparent_modules = ref false (* -trans-mod *) let unique_ids = ref true (* -d(no-)unique-ds *) let locations = ref true (* -d(no-)locations *) +let parameters = ref ([] : string list) (* -parameter *) +let as_parameter = ref false (* -as-parameter *) +let as_argument_for = ref None (* -as-argument-for *) let dump_source = ref false (* -dsource *) let dump_parsetree = ref false (* -dparsetree *) and dump_typedtree = ref false (* -dtypedtree *) and dump_shape = ref false (* -dshape *) and dump_rawlambda = ref false (* -drawlambda *) and dump_lambda = ref false (* -dlambda *) +and dump_letreclambda = ref false (* -dletreclambda *) and dump_rawclambda = ref false (* -drawclambda *) and dump_clambda = ref false (* -dclambda *) and dump_rawflambda = ref false (* -drawflambda *) @@ -186,6 +202,7 @@ let afl_inst_ratio = ref 100 (* -afl-inst-ratio *) let function_sections = ref false (* -function-sections *) let probes = ref Config.probes (* -probes *) +let allow_illegal_crossing = ref false (* -allow_illegal_crossing *) let simplify_rounds = ref None (* -rounds *) let default_simplify_rounds = ref 1 (* -rounds *) let rounds () = @@ -507,13 +524,14 @@ module Compiler_pass = struct - the manpages in man/ocaml{c,opt}.m - the manual manual/src/cmds/unified-options.etex *) - type t = Parsing | Typing | Lambda + type t = Parsing | Typing | Lambda | Middle_end | Scheduling | Emit | Simplify_cfg | Selection let to_string = function | Parsing -> "parsing" | Typing -> "typing" | Lambda -> "lambda" + | Middle_end -> "middle_end" | Scheduling -> "scheduling" | Emit -> "emit" | Simplify_cfg -> "simplify_cfg" @@ -523,6 +541,7 @@ module Compiler_pass = struct | "parsing" -> Some Parsing | "typing" -> Some Typing | "lambda" -> Some Lambda + | "middle_end" -> Some Middle_end | "scheduling" -> Some Scheduling | "emit" -> Some Emit | "simplify_cfg" -> Some Simplify_cfg @@ -533,6 +552,7 @@ module Compiler_pass = struct | Parsing -> 0 | Typing -> 1 | Lambda -> 2 + | Middle_end -> 3 | Selection -> 20 | Simplify_cfg -> 49 | Scheduling -> 50 @@ -542,6 +562,7 @@ module Compiler_pass = struct Parsing; Typing; Lambda; + Middle_end; Scheduling; Emit; Simplify_cfg; @@ -549,6 +570,7 @@ module Compiler_pass = struct ] let is_compilation_pass _ = true let is_native_only = function + | Middle_end -> true | Scheduling -> true | Emit -> true | Simplify_cfg -> true @@ -560,7 +582,7 @@ module Compiler_pass = struct | Scheduling -> true | Simplify_cfg -> true | Selection -> true - | Parsing | Typing | Lambda | Emit -> false + | Parsing | Typing | Lambda | Middle_end | Emit -> false let available_pass_names ~filter ~native = passes @@ -576,7 +598,7 @@ module Compiler_pass = struct | Scheduling -> prefix ^ Compiler_ir.(extension Linear) | Simplify_cfg -> prefix ^ Compiler_ir.(extension Cfg) | Selection -> prefix ^ Compiler_ir.(extension Cfg) ^ "-sel" - | Emit | Parsing | Typing | Lambda -> Misc.fatal_error "Not supported" + | Emit | Parsing | Typing | Lambda | Middle_end -> Misc.fatal_error "Not supported" let of_input_filename name = match Compiler_ir.extract_extension_with_pass name with @@ -639,37 +661,7 @@ let create_usage_msg program = let print_arguments program = Arg.usage !arg_spec (create_usage_msg program) -module Annotations = struct - type t = Check_default | Check_all | Check_opt_only | No_check - - let all = [ Check_default; Check_all; Check_opt_only; No_check ] - - let to_string = function - | Check_default -> "default" - | Check_all -> "all" - | Check_opt_only -> "opt" - | No_check -> "none" - - let equal t1 t2 = - match t1, t2 with - | Check_default, Check_default -> true - | Check_all, Check_all -> true - | No_check, No_check -> true - | Check_opt_only, Check_opt_only -> true - | (Check_default | Check_all | Check_opt_only | No_check), _ -> false - - let of_string v = - let f t = - if String.equal (to_string t) v then Some t else None - in - List.find_map f all - - let doc = - "\n\ The argument specifies which annotations to check: \n\ - \ \"opt\" means attributes with \"opt\" payload and is intended for debugging;\n\ - \ \"default\" means attributes without \"opt\" payload; \n\ - \ \"all\" covers both \"opt\" and \"default\" and is intended for optimized builds." -end - -let zero_alloc_check = ref Annotations.No_check (* -zero-alloc-check *) +let zero_alloc_check = ref Zero_alloc_annotations.Check_default (* -zero-alloc-check *) let zero_alloc_check_assert_all = ref false (* -zero-alloc-check-assert-all *) + +let no_auto_include_otherlibs = ref false (* -no-auto-include-otherlibs *) diff --git a/utils/clflags.mli b/utils/clflags.mli index 09999d9a05a..b75d282c959 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -51,6 +51,14 @@ val set_int_arg : val set_float_arg : int option -> Float_arg_helper.parsed ref -> float -> float option -> unit +module Libloc : sig + type t = { + path: string; + libs: string list; + hidden_libs: string list + } +end + val objfiles : string list ref val ccobjs : string list ref val dllibs : string list ref @@ -58,6 +66,8 @@ val cmi_file : string option ref val compile_only : bool ref val output_name : string option ref val include_dirs : string list ref +val hidden_include_dirs : string list ref +val libloc : Libloc.t list ref val no_std_include : bool ref val no_cwd : bool ref val print_types : bool ref @@ -82,9 +92,11 @@ val open_modules : string list ref val preprocessor : string option ref val all_ppx : string list ref val absname : bool ref +val directory : string option ref val annotations : bool ref val binary_annotations : bool ref val binary_annotations_cms : bool ref +val store_occurrences : bool ref val use_threads : bool ref val noassert : bool ref val verbose : bool ref @@ -114,12 +126,16 @@ val float_const_prop : bool ref val transparent_modules : bool ref val unique_ids : bool ref val locations : bool ref +val parameters : string list ref +val as_parameter : bool ref +val as_argument_for : string option ref val dump_source : bool ref val dump_parsetree : bool ref val dump_typedtree : bool ref val dump_shape : bool ref val dump_rawlambda : bool ref val dump_lambda : bool ref +val dump_letreclambda : bool ref val dump_rawclambda : bool ref val dump_clambda : bool ref val dump_rawflambda : bool ref @@ -202,6 +218,7 @@ val afl_instrument : bool ref val afl_inst_ratio : int ref val function_sections : bool ref val probes : bool ref +val allow_illegal_crossing : bool ref val all_passes : string list ref val dumped_pass : string -> bool @@ -254,7 +271,7 @@ module Compiler_ir : sig end module Compiler_pass : sig - type t = Parsing | Typing | Lambda + type t = Parsing | Typing | Lambda | Middle_end | Scheduling | Emit | Simplify_cfg | Selection val of_string : string -> t option val to_string : t -> string @@ -289,15 +306,8 @@ val print_arguments : string -> unit (* [reset_arguments ()] clear all declared arguments *) val reset_arguments : unit -> unit -(* [Annotations] specifies which zero_alloc attributes to check. *) -module Annotations : sig - type t = Check_default | Check_all | Check_opt_only | No_check - val all : t list - val to_string : t -> string - val of_string : string -> t option - val equal : t -> t -> bool - val doc : string -end -val zero_alloc_check : Annotations.t ref +(* [zero_alloc_check] specifies which zero_alloc attributes to check. *) +val zero_alloc_check : Zero_alloc_annotations.t ref val zero_alloc_check_assert_all : bool ref +val no_auto_include_otherlibs : bool ref diff --git a/utils/compilation_unit.ml b/utils/compilation_unit.ml index 8f4f1199c2f..2cec30a2df9 100644 --- a/utils/compilation_unit.ml +++ b/utils/compilation_unit.ml @@ -245,13 +245,14 @@ let create_child parent name_ = let of_string str = let for_pack_prefix, name = - match String.rindex_opt str '.' with - | None -> Prefix.empty, Name.of_string str - | Some 0 -> - (* See [Name.check_as_path_component]; this allows ".cinaps" as a - compilation unit *) - Prefix.empty, Name.of_string str - | Some _ -> Misc.fatal_errorf "[of_string] does not parse qualified names" + (* Also see [Name.check_as_path_component] *) + if String.equal str ".cinaps" || String.equal str "(.cinaps)" + then Prefix.empty, Name.of_string str + else + match String.rindex_opt str '.' with + | None -> Prefix.empty, Name.of_string str + | Some _ -> + Misc.fatal_errorf "[of_string] does not parse qualified names: %s" str in create for_pack_prefix name diff --git a/utils/config.common.ml b/utils/config.common.ml index 0aef08bd328..75d1475fa63 100644 --- a/utils/config.common.ml +++ b/utils/config.common.ml @@ -31,32 +31,31 @@ let standard_library = (* When artifacts are incompatible with upstream OCaml, ocaml-jst uses magic numbers ending in 5xx. (The AST remains compatible, so use upstream numbers) *) -let exec_magic_number = "Caml1999X520" +let exec_magic_number = "Caml1999X532" (* exec_magic_number is duplicated in runtime/caml/exec.h *) -and cmi_magic_number = "Caml1999I520" -and cmo_magic_number = "Caml1999O520" -and cma_magic_number = "Caml1999A520" +and cmi_magic_number = "Caml1999I532" +and cmo_magic_number = "Caml1999O532" +and cma_magic_number = "Caml1999A532" and cmx_magic_number = if flambda || flambda2 then - "Caml2021y520" + "Caml2021y533" else - "Caml2021Y520" + "Caml2021Y532" and cmxa_magic_number = if flambda || flambda2 then - "Caml2021z520" + "Caml2021z533" else - "Caml2021Z520" -and ast_impl_magic_number = "Caml1999M033" -and ast_intf_magic_number = "Caml1999N033" -and cmxs_magic_number = "Caml1999D520" -and cmt_magic_number = "Caml1999T520" -and cms_magic_number = "Caml1999S520" -and linear_magic_number = "Caml1999L520" -and cfg_magic_number = "Caml2021G520" + "Caml2021Z532" +and ast_impl_magic_number = "Caml1999M532" +and ast_intf_magic_number = "Caml1999N532" +and cmxs_magic_number = "Caml1999D532" +and cmt_magic_number = "Caml1999T532" +and cms_magic_number = "Caml1999S532" +and linear_magic_number = "Caml1999L532" +and cfg_magic_number = "Caml2021G532" let safe_string = true let default_safe_string = true -let naked_pointers = false let flambda_backend = true let interface_suffix = ref ".mli" @@ -151,6 +150,8 @@ let configuration_variables () = p_bool "flambda_backend" flambda_backend; p_bool "probes" probes; p_bool "stack_allocation" stack_allocation; + + p_bool "no_stack_checks" no_stack_checks; ] let print_config_value oc = function diff --git a/utils/config.fixed.ml b/utils/config.fixed.ml index e0ca8d4acaf..708a82cbca7 100644 --- a/utils/config.fixed.ml +++ b/utils/config.fixed.ml @@ -45,6 +45,11 @@ let mkdll = native_pack_linker let mkexe = native_pack_linker let mkmaindll = native_pack_linker let flambda = false +let flambda2 = false +let stack_allocation = false +let with_cpp_mangling = false +let probes = false +let poll_insertion = false let with_flambda_invariants = false let with_cmm_invariants = false let windows_unicode = false @@ -59,6 +64,7 @@ let asm = boot_cannot_call "the assembler" let asm_cfi_supported = false let with_frame_pointers = false let reserved_header_bits = 0 +let custom_ops_struct_size = 64 let ext_exe = ".ex_The boot compiler should not be using Config.ext_exe" let ext_obj = ".o_The boot compiler cannot process C objects" let ext_asm = ".s_The boot compiler should not be using Config.ext_asm" @@ -69,3 +75,9 @@ let target = host let systhread_supported = false let flexdll_dirs = [] let ar_supports_response_files = true + +(* mshinwell: at present always use runtime4 for bootstrap *) +let runtime5 = false +let no_stack_checks = false +(* This setting is only for bootstrap, does not affect dune-built compilers: *) +let naked_pointers = false diff --git a/utils/config.generated.ml.in b/utils/config.generated.ml.in index d89d185f47d..0546981e7de 100644 --- a/utils/config.generated.ml.in +++ b/utils/config.generated.ml.in @@ -99,7 +99,7 @@ let asm = {@QS@|@AS@|@QS@} let asm_cfi_supported = @asm_cfi_supported@ let with_frame_pointers = @frame_pointers@ let with_cpp_mangling = @cpp_mangling@ -let reserved_header_bits = @reserved_header_bits@ +let custom_ops_struct_size = @custom_ops_struct_size@ let ext_exe = {@QS@|@exeext@|@QS@} let ext_obj = "." ^ {@QS@|@OBJEXT@|@QS@} @@ -115,3 +115,12 @@ let systhread_supported = @systhread_support@ let flexdll_dirs = [@flexdll_dir@] let ar_supports_response_files = @ar_supports_response_files@ + +let naked_pointers = "@naked_pointers@" = "true" +let runtime5 = "@enable_runtime5@" = "yes" + +let reserved_header_bits = + if runtime5 then @reserved_header_bits@ else @profinfo_width@ + +let no_stack_checks = "@enable_stack_checks@" <> "yes" + diff --git a/utils/config.mli b/utils/config.mli index 376f10514f4..5a174e94a64 100644 --- a/utils/config.mli +++ b/utils/config.mli @@ -233,7 +233,17 @@ val with_cmm_invariants : bool (** Whether the invariants checks for Cmm are enabled *) val reserved_header_bits : int -(** How many bits of a block's header are reserved *) +(** How many bits of a block's header are reserved. This is correct + regardless of whether we're in runtime 4 or runtime 5. + + In runtime 5, this corresponds to the HEADER_RESERVED_BITS C preprocessor + macro. In runtime 4, this corresponds to the PROFINFO_WIDTH C preprocessor + macro. Both of these are unconditionally set to a constant by the configure + script in order to enable mixed block support. + *) + +val custom_ops_struct_size : int +(** Size in bytes of the custom operations structure. *) val flat_float_array : bool (** Whether the compiler and runtime automagically flatten float @@ -276,6 +286,13 @@ val poll_insertion : bool val ar_supports_response_files: bool (** Whether ar supports @FILE arguments. *) +val runtime5 : bool +(** [true] if using the OCaml 5.x runtime, [false] if using the + OCaml 4.14 runtime. *) + +val no_stack_checks : bool +(** [true] if stack checks are disabled; used only if [runtime5] is [true]. *) + (** Access to configuration values *) val print_config : out_channel -> unit diff --git a/utils/dune b/utils/dune index f11e23c012b..949ea371cc2 100644 --- a/utils/dune +++ b/utils/dune @@ -25,12 +25,12 @@ (mode fallback) (deps (:conf ../Makefile.config) (:c domainstate.ml.c) - (:tbl ../runtime4/caml/domain_state.tbl) - (glob_files ../runtime4/caml/{config,m,s}.h)) + (:tbl ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml/domain_state.tbl) + (glob_files ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml/{config,m,s}.h)) (action (with-stdout-to %{targets} (bash - "`grep '^CPP=' %{conf} | cut -d'=' -f2` -I ../runtime4/caml %{c}" + "`grep '^CPP=' %{conf} | cut -d'=' -f2` -I ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml %{c}" )))) (rule @@ -38,10 +38,10 @@ (mode fallback) (deps (:conf ../Makefile.config) (:c domainstate.mli.c) - (:tbl ../runtime4/caml/domain_state.tbl) - (glob_files ../runtime4/caml/{config,m,s}.h)) + (:tbl ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml/domain_state.tbl) + (glob_files ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml/{config,m,s}.h)) (action (with-stdout-to %{targets} (bash - "`grep '^CPP=' %{conf} | cut -d'=' -f2` -I ../runtime4/caml %{c}" + "`grep '^CPP=' %{conf} | cut -d'=' -f2` -I ../%{env:RUNTIME_DIR=runtime-dir-env-var-not-set}/caml %{c}" )))) diff --git a/utils/import_info.ml b/utils/import_info.ml index 3efc610c1fe..200bcde58dc 100644 --- a/utils/import_info.ml +++ b/utils/import_info.ml @@ -14,36 +14,54 @@ module CU = Compilation_unit -type t = +type intf = | Normal of CU.t * Digest.t - | Normal_no_crc of CU.t - | Other of CU.Name.t * (CU.t * Digest.t) option + | Alias of CU.Name.t + | Parameter of CU.Name.t * Digest.t + +type impl = + | Loaded of CU.t * Digest.t + | Unloaded of CU.t + +(* CR-soon lmaurer: This combined type should go away soon, since each [t] is + actually statically known to be either an [intf] or an [impl] (see PR + #1933) *) +type t = + | Intf of intf + | Impl of impl -(* CR xclerc: Maybe introduce Other_no_crc to flatten the option *) +let check_name name cu = + if not (CU.Name.equal (CU.name cu) name) + then + Misc.fatal_errorf + "@[Mismatched import name and compilation unit:@ %a != %a@]" + CU.Name.print name CU.print cu let create cu_name ~crc_with_unit = + (* This creates an [Intf] just to be minimally restrictive. Any caller that + cares should use the [Impl] API. *) match crc_with_unit with - | None -> Other (cu_name, None) + | None -> Intf (Alias cu_name) | Some (cu, crc) -> - (* For the moment be conservative and only use the [Normal] constructor when - there is no pack prefix at all. *) - if CU.Prefix.is_empty (CU.for_pack_prefix cu) - && CU.Name.equal (CU.name cu) cu_name - then Normal (cu, crc) - else Other (cu_name, Some (cu, crc)) + check_name cu_name cu; + Intf (Normal (cu, crc)) let create_normal cu ~crc = - match crc with Some crc -> Normal (cu, crc) | None -> Normal_no_crc cu + match crc with + | Some crc -> Impl (Loaded (cu, crc)) + | None -> Impl (Unloaded cu) let name t = match t with - | Normal (cu, _) | Normal_no_crc cu -> CU.name cu - | Other (name, _) -> name + | Impl (Loaded (cu, _) | Unloaded cu) -> CU.name cu + | Intf (Normal (cu, _)) -> CU.name cu + | Intf (Alias name | Parameter (name, _)) -> name let cu t = match t with - | Normal (cu, _) | Normal_no_crc cu | Other (_, Some (cu, _)) -> cu - | Other (name, None) -> + | Intf (Normal (cu, _)) -> cu + | Impl (Loaded (cu, _) | Unloaded cu) -> cu + | Intf (Alias name | Parameter (name, _)) -> Misc.fatal_errorf "Cannot extract [Compilation_unit.t] from [Import_info.t] (for unit %a) \ that never received it" @@ -51,16 +69,99 @@ let cu t = let crc t = match t with - | Normal (_, crc) -> Some crc - | Normal_no_crc _ | Other (_, None) -> None - | Other (_, Some (_, crc)) -> Some crc - -let crc_with_unit t = - match t with - | Normal (cu, crc) -> Some (cu, crc) - | Normal_no_crc _ | Other (_, None) -> None - | Other (_, some_cu_and_crc) -> some_cu_and_crc + | Intf (Normal (_, crc) | Parameter (_, crc)) -> Some crc + | Intf (Alias _) -> None + | Impl (Loaded (_, crc)) -> Some crc + | Impl (Unloaded _) -> None let has_name t ~name:name' = CU.Name.equal (name t) name' -let dummy = Other (CU.Name.dummy, None) +let dummy = Intf (Alias CU.Name.dummy) + +module Intf = struct + (* Currently this is the same type as [Impl.t] but this will change (see PR + #1746). *) + type nonrec t = t + + let create_normal name cu ~crc = + check_name name cu; + Intf (Normal (cu, crc)) + + let create_alias name = Intf (Alias name) + + let create_parameter name ~crc = Intf (Parameter (name, crc)) + + module Nonalias = struct + module Kind = struct + type t = + | Normal of CU.t + | Parameter + end + + type t = Kind.t * Digest.t + end + + let create name nonalias = + match (nonalias : Nonalias.t option) with + | None -> create_alias name + | Some (Normal cu, crc) -> create_normal name cu ~crc + | Some (Parameter, crc) -> create_parameter name ~crc + + let expect_intf t = + match t with + | Intf intf -> intf + | Impl (Loaded (cu, _) | Unloaded cu) -> + Misc.fatal_errorf "Expected an [Import_info.Impl.t] but found %a" CU.print + cu + + let name t = + match expect_intf t with + | Normal (cu, _) -> CU.name cu + | Alias name | Parameter (name, _) -> name + + let info t : Nonalias.t option = + match expect_intf t with + | Normal (cu, crc) -> Some (Normal cu, crc) + | Parameter (_, crc) -> Some (Parameter, crc) + | Alias _ -> None + + let crc t = + match expect_intf t with + | Normal (_, crc) | Parameter (_, crc) -> Some crc + | Alias _ -> None + + let has_name t ~name:name' = CU.Name.equal (name t) name' + + let dummy = dummy +end + +module Impl = struct + (* Currently this is the same type as [Intf.t] but this will change (see PR + #1746). *) + type nonrec t = t + + let create_loaded cu ~crc = Impl (Loaded (cu, crc)) + + let create_unloaded cu = Impl (Unloaded cu) + + let create cu ~crc = + match crc with + | Some crc -> create_loaded cu ~crc + | None -> create_unloaded cu + + let expect_impl t = + match t with + | Impl impl -> impl + | Intf _ -> + Misc.fatal_errorf "Expected an [Import_info.Intf.t] but found %a" + CU.Name.print (Intf.name t) + + let cu t = match expect_impl t with Loaded (cu, _) | Unloaded cu -> cu + + let name t = CU.name (cu t) + + let crc t = + match expect_impl t with Loaded (_, crc) -> Some crc | Unloaded _ -> None + + let dummy = Impl (Unloaded CU.dummy) +end diff --git a/utils/import_info.mli b/utils/import_info.mli index 845e5f086ff..61154054508 100644 --- a/utils/import_info.mli +++ b/utils/import_info.mli @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -module CU = Compilation_unit +module CU := Compilation_unit (* CR mshinwell: maybe there should be a phantom type allowing to distinguish the .cmx case from the others. Unclear it's worth it. @@ -29,6 +29,8 @@ module CU = Compilation_unit here, or somewhere alongside, rather than being duplicated around the tree. *) +(** Either an interface (.cmi) or implementation (.cmo/x) import. Should be + avoided in new code, in preference to [Intf.t] or [Impl.t]. *) type t val create : CU.Name.t -> crc_with_unit:(CU.t * string) option -> t @@ -43,8 +45,72 @@ val cu : t -> CU.t val crc : t -> string option -val crc_with_unit : t -> (CU.t * string) option - val has_name : t -> name:CU.Name.t -> bool val dummy : t + +(** The preferred API to use for interface imports. An interface import might be + a parameter, in which case it has a CRC but no [CU.t] (since a [CU.t] is for + an implementation). *) +module Intf : sig + type nonrec t = t + + val create_normal : CU.Name.t -> CU.t -> crc:Digest.t -> t + + val create_alias : CU.Name.t -> t + + val create_parameter : CU.Name.t -> crc:Digest.t -> t + + module Nonalias : sig + module Kind : sig + type t = + | Normal of CU.t + | Parameter + end + + (** The "non-alias part" of the import info for an interface. An [Intf.t] is + equivalent to a [CU.Name.t * Nonalias.t option] (use [create], [name], and [spec] + to convert back and forth). *) + type t = Kind.t * Digest.t + end + + (** [create name nonalias] is [create_normal name cu crc] if [nonalias] is [Some (Normal + cu, crc)], [create_parameter name crc] if [nonalias] is [Some (Parameter, crc)], and + [create_alias] if [nonalias] is [None]. Useful when [nonalias] is coming out of + [Consistbl]. *) + val create : CU.Name.t -> Nonalias.t option -> t + + val name : t -> CU.Name.t + + val info : t -> Nonalias.t option + + val crc : t -> Digest.t option + + val has_name : t -> name:CU.Name.t -> bool + + val dummy : t +end + +module Impl : sig + type nonrec t = t + + (** The import info for an implementation we depend on and whose .cmx we actually + loaded. *) + val create_loaded : CU.t -> crc:Digest.t -> t + + (** The import info for an implementation we depend on but for which we never loaded a + .cmx (and thus have no CRC for). *) + val create_unloaded : CU.t -> t + + (** [create cu ~crc] is [create_loaded] if [crc] is [Some] and [create_unloaded] if + [crc] is [None]. Useful when [crc] is coming out of [Consistbl]. *) + val create : CU.t -> crc:Digest.t option -> t + + val name : t -> CU.Name.t + + val cu : t -> CU.t + + val crc : t -> Digest.t option + + val dummy : t +end diff --git a/utils/language_extension.ml b/utils/language_extension.ml index cdab91ce9c1..7a05a4a5cfb 100644 --- a/utils/language_extension.ml +++ b/utils/language_extension.ml @@ -54,7 +54,7 @@ end let get_level_ops : type a. a t -> (module Extension_level with type t = a) = function | Comprehensions -> (module Unit) - | Local -> (module Unit) + | Mode -> (module Maturity) | Unique -> (module Unit) | Include_functor -> (module Unit) | Polymorphic_parameters -> (module Unit) @@ -62,6 +62,39 @@ let get_level_ops : type a. a t -> (module Extension_level with type t = a) = | Module_strengthening -> (module Unit) | Layouts -> (module Maturity) | SIMD -> (module Unit) + | Labeled_tuples -> (module Unit) + | Small_numbers -> (module Maturity) + +module Exist_pair = struct + include Exist_pair + + let maturity : t -> Maturity.t = function + | Pair (Comprehensions, ()) -> Beta + | Pair (Mode, m) -> m + | Pair (Unique, ()) -> Alpha + | Pair (Include_functor, ()) -> Stable + | Pair (Polymorphic_parameters, ()) -> Stable + | Pair (Immutable_arrays, ()) -> Stable + | Pair (Module_strengthening, ()) -> Stable + | Pair (Layouts, m) -> m + | Pair (SIMD, ()) -> Stable + | Pair (Labeled_tuples, ()) -> Stable + | Pair (Small_numbers, m) -> m + + let is_erasable : t -> bool = function Pair (ext, _) -> is_erasable ext + + let to_string = function + | Pair (Layouts, m) -> to_string Layouts ^ "_" ^ maturity_to_string m + | Pair (Mode, m) -> to_string Mode ^ "_" ^ maturity_to_string m + | Pair (Small_numbers, m) -> + to_string Small_numbers ^ "_" ^ maturity_to_string m + | Pair + ( (( Comprehensions | Unique | Include_functor | Polymorphic_parameters + | Immutable_arrays | Module_strengthening | SIMD | Labeled_tuples ) + as ext), + _ ) -> + to_string ext +end type extn_pair = Exist_pair.t = Pair : 'a t * 'a -> extn_pair @@ -87,7 +120,7 @@ let pair_of_string_exn extn_name = let equal_t (type a b) (a : a t) (b : b t) : (a, b) Misc.eq option = match a, b with | Comprehensions, Comprehensions -> Some Refl - | Local, Local -> Some Refl + | Mode, Mode -> Some Refl | Unique, Unique -> Some Refl | Include_functor, Include_functor -> Some Refl | Polymorphic_parameters, Polymorphic_parameters -> Some Refl @@ -95,9 +128,11 @@ let equal_t (type a b) (a : a t) (b : b t) : (a, b) Misc.eq option = | Module_strengthening, Module_strengthening -> Some Refl | Layouts, Layouts -> Some Refl | SIMD, SIMD -> Some Refl - | ( ( Comprehensions | Local | Unique | Include_functor + | Labeled_tuples, Labeled_tuples -> Some Refl + | Small_numbers, Small_numbers -> Some Refl + | ( ( Comprehensions | Mode | Unique | Include_functor | Polymorphic_parameters | Immutable_arrays | Module_strengthening - | Layouts | SIMD ), + | Layouts | SIMD | Labeled_tuples | Small_numbers ), _ ) -> None @@ -107,75 +142,125 @@ let equal a b = Option.is_some (equal_t a b) (* extension universes *) module Universe : sig - val is_allowed : 'a t -> bool + type t = + | No_extensions + | Upstream_compatible + | Stable + | Beta + | Alpha - val check : 'a t -> unit + val all : t list - val check_maximal : unit -> unit + val maximal : t - type t = - | No_extensions - | Only_erasable - | Any + val to_string : t -> string + + val of_string : string -> t option - val set : t -> bool + val get : unit -> t + + val set : t -> unit + + val is : t -> bool + + val check : extn_pair -> unit + + (* Allowed extensions, each with the greatest allowed level. *) + val allowed_extensions_in : t -> extn_pair list end = struct (** Which extensions can be enabled? *) type t = | No_extensions - | Only_erasable - | Any + | Upstream_compatible + | Stable + | Beta + | Alpha + (* If you add a constructor, you should also add it to [all]. *) + + let all = [No_extensions; Upstream_compatible; Stable; Beta; Alpha] + + let maximal = Alpha + + let to_string = function + | No_extensions -> "no_extensions" + | Upstream_compatible -> "upstream_compatible" + | Stable -> "stable" + | Beta -> "beta" + | Alpha -> "alpha" + + let of_string = function + | "no_extensions" -> Some No_extensions + | "upstream_compatible" -> Some Upstream_compatible + | "stable" -> Some Stable + | "beta" -> Some Beta + | "alpha" -> Some Alpha + | _ -> None let compare t1 t2 = - let rank = function No_extensions -> 1 | Only_erasable -> 2 | Any -> 3 in + let rank = function + | No_extensions -> 0 + | Upstream_compatible -> 1 + | Stable -> 2 + | Beta -> 3 + | Alpha -> 4 + in compare (rank t1) (rank t2) - let universe = ref Any + (* For now, the default universe is set to [Alpha] but only a limited set of + extensions is enabled. After the migration to extension universes, the + default will be [No_extensions]. *) + let universe = ref Alpha - let compiler_options = function - | No_extensions -> "flag -disable-all-extensions" - | Only_erasable -> "flag -only-erasable-extensions" - | Any -> "default options" + let get () = !universe + + let set new_universe = universe := new_universe - let is_allowed ext = - match !universe with + let is u = compare u !universe = 0 + + let compiler_options = function + | No_extensions -> "flag -extension-universe no_extensions" + | Upstream_compatible -> "flag -extension-universe upstream_compatible" + | Stable -> "flag -extension-universe stable" + | Beta -> "flag -extension-universe beta" + | Alpha -> "flag -extension-universe alpha (default CLI option)" + + let is_allowed_in t extn_pair = + match t with | No_extensions -> false - | Only_erasable -> is_erasable ext - | Any -> true + | Upstream_compatible -> + Exist_pair.is_erasable extn_pair + && Maturity.compare (Exist_pair.maturity extn_pair) Stable <= 0 + | Stable -> Maturity.compare (Exist_pair.maturity extn_pair) Stable <= 0 + | Beta -> Maturity.compare (Exist_pair.maturity extn_pair) Beta <= 0 + | Alpha -> true - (* are _all_ extensions allowed? *) - let all_allowed () = - match !universe with Any -> true | No_extensions | Only_erasable -> false + let is_allowed extn_pair = is_allowed_in !universe extn_pair (* The terminating [()] argument helps protect against ignored arguments. See the documentation for [Base.failwithf]. *) let fail fmt = Format.ksprintf (fun str () -> raise (Arg.Bad str)) fmt - let check extn = - if not (is_allowed extn) - then - fail "Cannot enable extension %s: incompatible with %s" (to_string extn) - (compiler_options !universe) - () - - let check_maximal () = - if not (all_allowed ()) + let check extn_pair = + if not (is_allowed extn_pair) then - fail "Cannot enable all extensions: incompatible with %s" + fail "Cannot enable extension %s: incompatible with %s" + (Exist_pair.to_string extn_pair) (compiler_options !universe) () - (* returns whether or not a change was actually made *) - let set new_universe = - let cmp = compare new_universe !universe in - if cmp > 0 - then - fail "Cannot specify %s: incompatible with %s" - (compiler_options new_universe) - (compiler_options !universe) - (); - universe := new_universe; - cmp <> 0 + let allowed_extensions_in t = + let maximal_in_universe (Pack extn) = + let (module Ops) = get_level_ops extn in + let allowed_levels = + Ops.all |> List.filter (fun lvl -> is_allowed_in t (Pair (extn, lvl))) + in + match allowed_levels with + | [] -> None + | lvl :: lvls -> + let max_allowed_lvl = List.fold_left Ops.max lvl lvls in + Some (Pair (extn, max_allowed_lvl)) + in + List.filter_map maximal_in_universe Exist.all end (*****************************************) @@ -188,17 +273,15 @@ end (2) Every member of [!extensions] satisfies [Universe.is_allowed]. (For instance, [!universe = No_extensions] implies [!extensions = []]). *) -let default_extensions : extn_pair list = - [ Pair (Local, ()); - Pair (Include_functor, ()); - Pair (Polymorphic_parameters, ()); - Pair (Immutable_arrays, ()) ] +(* After the migration to extension universes, this will be an empty list. *) +let legacy_default_extensions : extn_pair list = + Universe.allowed_extensions_in Stable -let extensions : extn_pair list ref = ref default_extensions +let extensions : extn_pair list ref = ref legacy_default_extensions let set_worker (type a) (extn : a t) = function | Some value -> - Universe.check extn; + Universe.check (Pair (extn, value)); let (module Ops) = get_level_ops extn in let rec update_extensions already_seen : extn_pair list -> extn_pair list = function @@ -259,23 +342,18 @@ let unconditionally_enable_maximal_without_checks () = in extensions := List.map maximal_pair Exist.all -let enable_maximal () = - Universe.check_maximal (); - (* It's safe to call this here because we've confirmed that we can. *) - unconditionally_enable_maximal_without_checks () +let erasable_extensions_only () = + Universe.is No_extensions || Universe.is Upstream_compatible -let restrict_to_erasable_extensions () = - let changed = Universe.set Only_erasable in - if changed - then - extensions - := List.filter - (fun (Pair (extn, _)) -> Universe.is_allowed extn) - !extensions +let set_universe_and_enable_all u = + Universe.set u; + extensions := Universe.allowed_extensions_in (Universe.get ()) -let disallow_extensions () = - ignore (Universe.set No_extensions : bool); - disable_all () +let set_universe_and_enable_all_of_string_exn univ_name = + match Universe.of_string univ_name with + | Some u -> set_universe_and_enable_all u + | None -> + raise (Arg.Bad (Printf.sprintf "Universe %s is not known" univ_name)) (********************************************) (* checking an extension *) diff --git a/utils/language_extension.mli b/utils/language_extension.mli index 02b23ceb404..40ddba38a77 100644 --- a/utils/language_extension.mli +++ b/utils/language_extension.mli @@ -13,7 +13,7 @@ type maturity = Language_extension_kernel.maturity = or off, while a [maturity t] can have different maturity settings. *) type 'a t = 'a Language_extension_kernel.t = | Comprehensions : unit t - | Local : unit t + | Mode : maturity t | Unique : unit t | Include_functor : unit t | Polymorphic_parameters : unit t @@ -21,6 +21,8 @@ type 'a t = 'a Language_extension_kernel.t = | Module_strengthening : unit t | Layouts : maturity t | SIMD : unit t + | Labeled_tuples : unit t + | Small_numbers : maturity t (** Existentially packed language extension *) module Exist : sig @@ -47,13 +49,39 @@ with type 'a extn := 'a t (** Equality on language extensions *) val equal : 'a t -> 'b t -> bool +(** The type of language extension universes. Each universe allows a set of + extensions, and every successive universe includes the previous one. + + Each variant corresponds to the [-extension-universe ] CLI flag. + + Each extension universe, except for [No_extensions], should also have + a corresponding library in [otherlibs/]. Those libraries must contain + OCaml code for corresponding extensions that would normally go into Stdlib. +*) +module Universe : sig + type t = + | No_extensions + | Upstream_compatible + (** Upstream compatible extensions, also known as "erasable". *) + | Stable (** Extensions of [Stable] maturity. *) + | Beta (** Extensions of [Beta] maturity. *) + | Alpha + (** All extensions. This is the universe enabled by default + for the time being. *) + + val all : t list + + (** Equal to [Alpha]. *) + val maximal : t + + val to_string : t -> string + + val of_string : string -> t option +end + (** Disable all extensions *) val disable_all : unit -> unit -(** Maximally enable all extensions (that is, set to [Alpha] for [maturity] - extensions. *) -val enable_maximal : unit -> unit - (** Check if a language extension is "erasable", i.e. whether it can be harmlessly translated to attributes and compiled with the upstream compiler. *) @@ -93,38 +121,26 @@ val is_enabled : 'a t -> bool val is_at_least : 'a t -> 'a -> bool (** Tooling support: Temporarily enable and disable language extensions; these - operations are idempotent. Calls to [set], [enable], [disable], and - [disallow_extensions] inside the body of the function argument will also - be rolled back when the function finishes, but this behavior may change; - nest multiple [with_*] functions instead. *) + operations are idempotent. Calls to [set], [enable], [disable] inside the body + of the function argument will also be rolled back when the function finishes, + but this behavior may change; nest multiple [with_*] functions instead. *) val with_set : unit t -> enabled:bool -> (unit -> unit) -> unit val with_enabled : 'a t -> 'a -> (unit -> unit) -> unit val with_disabled : 'a t -> (unit -> unit) -> unit -(** Permanently restrict the allowable extensions to those that are - "erasable", i.e. those that can be harmlessly translated to attributes and - compiled with the upstream compiler. Used for [-only-erasable-extensions] - to ensure that some code is guaranteed to be compatible with upstream - OCaml after rewriting to attributes. When called, disables any - currently-enabled non-erasable extensions, including any that are on by - default. Causes any future uses of [set ~enabled:true], [enable], and - their [with_] variants to raise if used with a non-erasable extension. - The [is_enabled] function will still work on any extensions, it will just - always return [false] on non-erasable ones. Will raise if called after - [disallow_extensions]; the ratchet of extension restriction only goes one - way. *) -val restrict_to_erasable_extensions : unit -> unit - -(** Permanently ban all extensions; used for [-disable-all-extensions] to ensure - that some code is 100% extension-free. When called, disables any - currently-enabled extensions, including the defaults. Causes any future - uses of [set ~enabled:true], [enable], and their [with_] variants to raise; - also causes any future uses of [restrict_to_erasable_extensions] to raise. - The [is_enabled] function will still work, it will just always return - [false].*) -val disallow_extensions : unit -> unit +(** Check if the allowable extensions are restricted to only those that are + "erasable". This is true when the universe is set to [No_extensions] or + [Upstream_compatible]. *) +val erasable_extensions_only : unit -> bool + +(** Set the extension universe and enable all allowed extensions. *) +val set_universe_and_enable_all : Universe.t -> unit + +(** Parse a command-line string and call [set_universe_and_enable_all]. + Raises if the argument is invalid. *) +val set_universe_and_enable_all_of_string_exn : string -> unit (**/**) diff --git a/utils/language_extension_kernel.ml b/utils/language_extension_kernel.ml index 8811c903713..757c0c9fc61 100644 --- a/utils/language_extension_kernel.ml +++ b/utils/language_extension_kernel.ml @@ -3,7 +3,7 @@ type maturity = Stable | Beta | Alpha (* Remember to update [all] when changing this type. *) type _ t = | Comprehensions : unit t - | Local : unit t + | Mode : maturity t | Unique : unit t | Include_functor : unit t | Polymorphic_parameters : unit t @@ -11,6 +11,8 @@ type _ t = | Module_strengthening : unit t | Layouts : maturity t | SIMD : unit t + | Labeled_tuples : unit t + | Small_numbers : maturity t type 'a language_extension_kernel = 'a t @@ -19,7 +21,7 @@ module Exist = struct let all = [ Pack Comprehensions - ; Pack Local + ; Pack Mode ; Pack Unique ; Pack Include_functor ; Pack Polymorphic_parameters @@ -27,6 +29,8 @@ module Exist = struct ; Pack Module_strengthening ; Pack Layouts ; Pack SIMD + ; Pack Labeled_tuples + ; Pack Small_numbers ] end @@ -37,7 +41,7 @@ end (* When you update this, update [pair_of_string] below too. *) let to_string : type a. a t -> string = function | Comprehensions -> "comprehensions" - | Local -> "local" + | Mode -> "mode" | Unique -> "unique" | Include_functor -> "include_functor" | Polymorphic_parameters -> "polymorphic_parameters" @@ -45,6 +49,8 @@ let to_string : type a. a t -> string = function | Module_strengthening -> "module_strengthening" | Layouts -> "layouts" | SIMD -> "simd" + | Labeled_tuples -> "labeled_tuples" + | Small_numbers -> "small_numbers" (* converts full extension names, like "layouts_alpha" to a pair of an extension and its maturity. For extensions that don't take an @@ -53,7 +59,9 @@ let to_string : type a. a t -> string = function let pair_of_string extn_name : Exist_pair.t option = match String.lowercase_ascii extn_name with | "comprehensions" -> Some (Pair (Comprehensions, ())) - | "local" -> Some (Pair (Local, ())) + | "mode" -> Some (Pair (Mode, Stable)) + | "mode_beta" -> Some (Pair (Mode, Beta)) + | "mode_alpha" -> Some (Pair (Mode, Alpha)) | "unique" -> Some (Pair (Unique, ())) | "include_functor" -> Some (Pair (Include_functor, ())) | "polymorphic_parameters" -> Some (Pair (Polymorphic_parameters, ())) @@ -63,6 +71,9 @@ let pair_of_string extn_name : Exist_pair.t option = | "layouts_alpha" -> Some (Pair (Layouts, Alpha)) | "layouts_beta" -> Some (Pair (Layouts, Beta)) | "simd" -> Some (Pair (SIMD, ())) + | "labeled_tuples" -> Some (Pair (Labeled_tuples, ())) + | "small_numbers" -> Some (Pair (Small_numbers, Stable)) + | "small_numbers_beta" -> Some (Pair (Small_numbers, Beta)) | _ -> None let maturity_to_string = function @@ -84,7 +95,7 @@ let of_string extn_name : Exist.t option = But we've decided to punt on this issue in the short term. *) let is_erasable : type a. a t -> bool = function - | Local + | Mode | Unique | Layouts -> true @@ -93,7 +104,9 @@ let is_erasable : type a. a t -> bool = function | Polymorphic_parameters | Immutable_arrays | Module_strengthening - | SIMD -> + | SIMD + | Labeled_tuples + | Small_numbers -> false (* See the mli. *) diff --git a/utils/language_extension_kernel.mli b/utils/language_extension_kernel.mli index c65cb81bbea..1d09c69fb48 100644 --- a/utils/language_extension_kernel.mli +++ b/utils/language_extension_kernel.mli @@ -12,7 +12,7 @@ type maturity = Stable | Beta | Alpha or off, while a [maturity t] can have different maturity settings. *) type _ t = | Comprehensions : unit t - | Local : unit t + | Mode : maturity t | Unique : unit t | Include_functor : unit t | Polymorphic_parameters : unit t @@ -20,6 +20,8 @@ type _ t = | Module_strengthening : unit t | Layouts : maturity t | SIMD : unit t + | Labeled_tuples : unit t + | Small_numbers : maturity t module Exist : sig type 'a extn = 'a t diff --git a/utils/load_path.ml b/utils/load_path.ml index 42330d56232..7ac03a4d2a4 100644 --- a/utils/load_path.ml +++ b/utils/load_path.ml @@ -14,34 +14,53 @@ open Local_store -module STbl = Misc.Stdlib.String.Tbl +module Dir : sig + type entry = { + basename : string; + path : string + } + + type t -(* Mapping from basenames to full filenames *) -type registry = string STbl.t + val path : t -> string + val files : t -> entry list + val basenames : t -> string list + val hidden : t -> bool -let files : registry ref = s_table STbl.create 42 -let files_uncap : registry ref = s_table STbl.create 42 + val create : hidden:bool -> string -> t + val create_libloc : hidden:bool -> libloc:string -> string -> t + + val find : t -> string -> string option + val find_uncap : t -> string -> string option +end = struct + type entry = { + basename : string; + path : string + } -module Dir = struct type t = { path : string; - files : string list; + files : entry list; + hidden : bool } let path t = t.path let files t = t.files + let basenames t = List.map (fun { basename; _ } -> basename) t.files + let hidden t = t.hidden let find t fn = - if List.mem fn t.files then - Some (Filename.concat t.path fn) - else - None + List.find_map (fun { basename; path } -> + if String.equal basename fn then + Some path + else + None) t.files let find_uncap t fn = let fn = String.uncapitalize_ascii fn in - let search base = - if String.uncapitalize_ascii base = fn then - Some (Filename.concat t.path base) + let search { basename; path } = + if String.uncapitalize_ascii basename = fn then + Some path else None in @@ -56,79 +75,192 @@ module Dir = struct with Sys_error _ -> [||] - let create path = - { path; files = Array.to_list (readdir_compat path) } + let create ~hidden path = + let files = Array.to_list (readdir_compat path) + |> List.map (fun basename -> { basename; path = Filename.concat path basename }) in + { path; files; hidden } + + let read_libloc_file path = + let ic = open_in path in + Misc.try_finally + (fun () -> + let rec loop acc = + try + let line = input_line ic in + let (basename, path) = Misc.Stdlib.String.split_first_exn ~split_on:' ' line in + loop ({ basename; path } :: acc) + with End_of_file -> acc + in + loop []) + ~always:(fun () -> close_in ic) + + let create_libloc ~hidden ~libloc libname = + let libloc_lib_path = Filename.concat libloc libname in + let files = read_libloc_file (Filename.concat libloc_lib_path "cmi-cmx") in + let files = List.map (fun { basename; path } -> + let path = if Filename.is_relative path then + (* Paths are relative to parent directory of libloc directory *) + Filename.concat (Filename.dirname libloc) path + else + path + in + { basename; path }) files in + { path = libloc_lib_path; files; hidden } +end + +type visibility = Visible | Hidden + +(** Stores cached paths to files *) +module Path_cache : sig + (* Clear cache *) + val reset : unit -> unit + + (* Same as [add] below, but will replace existing entries. + + [prepend_add] is faster than [add] and intended for use in [init] and [remove_dir]: + since we are starting from an empty cache, we can avoid checking whether a unit name + already exists in the cache simply by adding entries in reverse order. *) + val prepend_add : Dir.t -> unit + + (* Add path to cache. If path with same basename is already in cache, skip adding. *) + val add : Dir.t -> unit + + (* Search for a basename in cache. Ignore case if [uncap] is true *) + val find : uncap:bool -> string -> string * visibility +end = struct + module STbl = Misc.Stdlib.String.Tbl + + (* Mapping from basenames to full filenames *) + type registry = string STbl.t + + let visible_files : registry ref = s_table STbl.create 42 + let visible_files_uncap : registry ref = s_table STbl.create 42 + + let hidden_files : registry ref = s_table STbl.create 42 + let hidden_files_uncap : registry ref = s_table STbl.create 42 + + let reset () = + STbl.clear !hidden_files; + STbl.clear !hidden_files_uncap; + STbl.clear !visible_files; + STbl.clear !visible_files_uncap + + let prepend_add dir = + List.iter (fun ({ basename = base; path = fn } : Dir.entry) -> + if Dir.hidden dir then begin + STbl.replace !hidden_files base fn; + STbl.replace !hidden_files_uncap (String.uncapitalize_ascii base) fn + end else begin + STbl.replace !visible_files base fn; + STbl.replace !visible_files_uncap (String.uncapitalize_ascii base) fn + end + ) (Dir.files dir) + + let add dir = + let update base fn visible_files hidden_files = + if (Dir.hidden dir) && not (STbl.mem !hidden_files base) then + STbl.replace !hidden_files base fn + else if not (STbl.mem !visible_files base) then + STbl.replace !visible_files base fn + in + List.iter + (fun ({ basename = base; path = fn }: Dir.entry) -> + update base fn visible_files hidden_files; + let ubase = String.uncapitalize_ascii base in + update ubase fn visible_files_uncap hidden_files_uncap) + (Dir.files dir) + + let find fn visible_files hidden_files = + try (STbl.find !visible_files fn, Visible) with + | Not_found -> (STbl.find !hidden_files fn, Hidden) + + let find ~uncap fn = + if uncap then + find (String.uncapitalize_ascii fn) visible_files_uncap hidden_files_uncap + else + find fn visible_files hidden_files end type auto_include_callback = (Dir.t -> string -> string option) -> string -> string -let dirs = s_ref [] +let visible_dirs = s_ref [] +let hidden_dirs = s_ref [] let no_auto_include _ _ = raise Not_found let auto_include_callback = ref no_auto_include let reset () = assert (not Config.merlin || Local_store.is_bound ()); - STbl.clear !files; - STbl.clear !files_uncap; - dirs := []; + Path_cache.reset (); + hidden_dirs := []; + visible_dirs := []; auto_include_callback := no_auto_include -let get () = List.rev !dirs -let get_paths () = List.rev_map Dir.path !dirs - -(* Optimized version of [add] below, for use in [init] and [remove_dir]: since - we are starting from an empty cache, we can avoid checking whether a unit - name already exists in the cache simply by adding entries in reverse - order. *) -let prepend_add dir = - List.iter (fun base -> - let fn = Filename.concat dir.Dir.path base in - STbl.replace !files base fn; - STbl.replace !files_uncap (String.uncapitalize_ascii base) fn - ) dir.Dir.files - -let init ~auto_include l = +let get_visible () = List.rev !visible_dirs + +let get_path_list () = + Misc.rev_map_end Dir.path !visible_dirs (List.rev_map Dir.path !hidden_dirs) + +type paths = + { visible : string list; + hidden : string list } + +let get_paths () = + { visible = List.rev_map Dir.path !visible_dirs; + hidden = List.rev_map Dir.path !hidden_dirs } + +let get_visible_path_list () = List.rev_map Dir.path !visible_dirs +let get_hidden_path_list () = List.rev_map Dir.path !hidden_dirs + +let init ~auto_include ~visible ~hidden = reset (); - dirs := List.rev_map Dir.create l; - List.iter prepend_add !dirs; + visible_dirs := List.rev_map (Dir.create ~hidden:false) visible; + hidden_dirs := List.rev_map (Dir.create ~hidden:true) hidden; + List.iter (fun (libloc : Clflags.Libloc.t) -> + visible_dirs := Misc.rev_map_end (fun lib -> Dir.create_libloc ~hidden:false ~libloc:libloc.path lib) libloc.libs !visible_dirs; + hidden_dirs := Misc.rev_map_end (fun lib -> Dir.create_libloc ~hidden:true ~libloc:libloc.path lib) libloc.hidden_libs !hidden_dirs + ) !Clflags.libloc; + List.iter Path_cache.prepend_add !hidden_dirs; + List.iter Path_cache.prepend_add !visible_dirs; auto_include_callback := auto_include let remove_dir dir = assert (not Config.merlin || Local_store.is_bound ()); - let new_dirs = List.filter (fun d -> Dir.path d <> dir) !dirs in - if List.compare_lengths new_dirs !dirs <> 0 then begin + let visible = List.filter (fun d -> Dir.path d <> dir) !visible_dirs in + let hidden = List.filter (fun d -> Dir.path d <> dir) !hidden_dirs in + if List.compare_lengths visible !visible_dirs <> 0 + || List.compare_lengths hidden !hidden_dirs <> 0 then begin reset (); - List.iter prepend_add new_dirs; - dirs := new_dirs + visible_dirs := visible; + hidden_dirs := hidden; + List.iter Path_cache.prepend_add hidden; + List.iter Path_cache.prepend_add visible end (* General purpose version of function to add a new entry to load path: We only - add a basename to the cache if it is not already present in the cache, in - order to enforce left-to-right precedence. *) -let add dir = + add a basename to the cache if it is not already present, in order to enforce + left-to-right precedence. *) +let add (dir : Dir.t) = assert (not Config.merlin || Local_store.is_bound ()); - List.iter - (fun base -> - let fn = Filename.concat dir.Dir.path base in - if not (STbl.mem !files base) then - STbl.replace !files base fn; - let ubase = String.uncapitalize_ascii base in - if not (STbl.mem !files_uncap ubase) then - STbl.replace !files_uncap ubase fn) - dir.Dir.files; - dirs := dir :: !dirs + Path_cache.add dir; + if (Dir.hidden dir) then + hidden_dirs := dir :: !hidden_dirs + else + visible_dirs := dir :: !visible_dirs let append_dir = add -let add_dir dir = add (Dir.create dir) +let add_dir ~hidden dir = add (Dir.create ~hidden dir) (* Add the directory at the start of load path - so basenames are unconditionally added. *) -let prepend_dir dir = +let prepend_dir (dir : Dir.t) = assert (not Config.merlin || Local_store.is_bound ()); - prepend_add dir; - dirs := !dirs @ [dir] + Path_cache.prepend_add dir; + if (Dir.hidden dir) then + hidden_dirs := !hidden_dirs @ [dir] + else + visible_dirs := !visible_dirs @ [dir] let is_basename fn = Filename.basename fn = fn @@ -150,7 +282,7 @@ let auto_include_otherlibs = (* Ensure directories are only ever scanned once *) let expand = Misc.expand_directory Config.standard_library in let otherlibs = - let read_lib lib = lazy (Dir.create (expand ("+" ^ lib))) in + let read_lib lib = lazy (Dir.create ~hidden:false (expand ("+" ^ lib))) in List.map (fun lib -> (lib, read_lib lib)) ["dynlink"; "str"; "unix"] in auto_include_libs otherlibs @@ -158,19 +290,25 @@ let find fn = assert (not Config.merlin || Local_store.is_bound ()); try if is_basename fn && not !Sys.interactive then - STbl.find !files fn + fst (Path_cache.find ~uncap:false fn) else - Misc.find_in_path (get_paths ()) fn + Misc.find_in_path (get_path_list ()) fn with Not_found -> !auto_include_callback Dir.find fn -let find_uncap fn = +let find_uncap_with_visibility fn = assert (not Config.merlin || Local_store.is_bound ()); try if is_basename fn && not !Sys.interactive then - STbl.find !files_uncap (String.uncapitalize_ascii fn) + Path_cache.find ~uncap:true fn else - Misc.find_in_path_uncap (get_paths ()) fn + try + (Misc.find_in_path_uncap (get_visible_path_list ()) fn, Visible) + with + | Not_found -> + (Misc.find_in_path_uncap (get_hidden_path_list ()) fn, Hidden) with Not_found -> let fn_uncap = String.uncapitalize_ascii fn in - !auto_include_callback Dir.find_uncap fn_uncap + (!auto_include_callback Dir.find_uncap fn_uncap, Visible) + +let find_uncap fn = fst (find_uncap_with_visibility fn) diff --git a/utils/load_path.mli b/utils/load_path.mli index fe3abaf95de..badc9bd9e20 100644 --- a/utils/load_path.mli +++ b/utils/load_path.mli @@ -14,15 +14,15 @@ (** Management of include directories. - This module offers a high level interface to locating files in the - load path, which is constructed from [-I] command line flags and a few + This module offers a high level interface to locating files in the load + path, which is constructed from [-I] and [-H] command line flags and a few other parameters. It makes the assumption that the contents of include directories doesn't change during the execution of the compiler. *) -val add_dir : string -> unit +val add_dir : hidden:bool -> string -> unit (** Add a directory to the end of the load path (i.e. at lowest priority.) *) val remove_dir : string -> unit @@ -35,20 +35,11 @@ module Dir : sig type t (** Represent one directory in the load path. *) - val create : string -> t + val create : hidden:bool -> string -> t - val path : t -> string - - val files : t -> string list + val basenames : t -> string list (** All the files in that directory. This doesn't include files in sub-directories of this directory. *) - - val find : t -> string -> string option - (** [find dir fn] returns the full path to [fn] in [dir]. *) - - val find_uncap : t -> string -> string option - (** As {!find}, but search also for uncapitalized name, i.e. if name is - Foo.ml, either /path/Foo.ml or /path/foo.ml may be returned. *) end type auto_include_callback = @@ -59,8 +50,13 @@ val no_auto_include : auto_include_callback (** No automatic directory inclusion: misses in the load path raise [Not_found] as normal. *) -val init : auto_include:auto_include_callback -> string list -> unit -(** [init l] is the same as [reset (); List.iter add_dir (List.rev l)] *) +val init : + auto_include:auto_include_callback -> visible:string list -> + hidden:string list -> unit +(** [init ~visible ~hidden] is the same as + [reset (); + List.iter add_dir (List.rev hidden); + List.iter add_dir (List.rev visible)] *) val auto_include_otherlibs : (string -> unit) -> auto_include_callback @@ -68,9 +64,16 @@ val auto_include_otherlibs : {!Load_path.init} and automatically adds [-I +lib] to the load path after calling [alert lib]. *) -val get_paths : unit -> string list +val get_path_list : unit -> string list (** Return the list of directories passed to [add_dir] so far. *) +type paths = + { visible : string list; + hidden : string list } + +val get_paths : unit -> paths +(** Return the directories passed to [add_dir] so far. *) + val find : string -> string (** Locate a file in the load path. Raise [Not_found] if the file cannot be found. This function is optimized for the case where the @@ -81,6 +84,12 @@ val find_uncap : string -> string (** Same as [find], but search also for uncapitalized name, i.e. if name is Foo.ml, allow /path/Foo.ml and /path/foo.ml to match. *) +type visibility = Visible | Hidden + +val find_uncap_with_visibility : string -> string * visibility +(** Same as [find_uncap], but also reports whether the cmi was found in a -I + directory (Visible) or a -H directory (Hidden) *) + val[@deprecated] add : Dir.t -> unit (** Old name for {!append_dir} *) @@ -92,5 +101,6 @@ val prepend_dir : Dir.t -> unit (** [prepend_dir d] adds [d] to the start of the load path (i.e. at highest priority. *) -val get : unit -> Dir.t list -(** Same as [get_paths ()], except that it returns a [Dir.t list]. *) +val get_visible : unit -> Dir.t list +(** Same as [get_paths ()], except that it returns a [Dir.t list], and doesn't + include the -H paths. *) diff --git a/utils/misc.ml b/utils/misc.ml index 68fd23bd1a1..2a22f773424 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -70,6 +70,13 @@ let rec map_end f l1 l2 = [] -> l2 | hd::tl -> f hd :: map_end f tl l2 +let rev_map_end f l1 l2 = + let rec rmap_f accu = function + | [] -> accu + | hd::tl -> rmap_f (f hd :: accu) tl + in + rmap_f l2 l1 + let rec map_left_right f = function [] -> [] | hd::tl -> let res = f hd in res :: map_left_right f tl @@ -161,6 +168,27 @@ module Stdlib = struct if a' == a && l' == l then l0 else a' :: l' | [] -> [] + let fold_lefti f accu l = + let rec aux f i accu l = + match l with + | [] -> accu + | a::l -> aux f (succ i) (f i accu a) l + in + aux f 0 accu l + + let chunks_of n l = + if n <= 0 then raise (Invalid_argument "chunks_of"); + (* Invariant: List.length l = remaining *) + let rec aux n acc l ~remaining = + match remaining with + | 0 -> List.rev acc + | _ when remaining <= n -> List.rev (l :: acc) + | _ -> + let chunk, rest = split_at n l in + aux n (chunk :: acc) rest ~remaining:(remaining - n) + in + aux n [] l ~remaining:(List.length l) + let rec is_prefix ~equal t ~of_ = match t, of_ with | [], [] -> true @@ -213,6 +241,15 @@ module Stdlib = struct else loop (succ i) in loop 0 + let fold_left2 f x a1 a2 = + if Array.length a1 <> Array.length a2 + then invalid_arg "Misc.Stdlib.Array.fold_left2"; + let r = ref x in + for i = 0 to Array.length a1 - 1 do + r := f !r (Array.unsafe_get a1 i) (Array.unsafe_get a2 i) + done; + !r + let for_alli p a = let n = Array.length a in let rec loop i = @@ -240,12 +277,48 @@ module Stdlib = struct false in loop 0 + + let compare compare arr1 arr2 = + let len1 = Array.length arr1 in + let len2 = Array.length arr2 in + if len1 <> len2 then + Int.compare len1 len2 + else + let rec loop i = + if i >= len1 then 0 + else + let cmp = compare arr1.(i) arr2.(i) in + if cmp <> 0 then cmp else loop (i + 1) + in + loop 0 + + let map_sharing f a = + let same = ref true in + let f' x = + let x' = f x in + if x != x' then + same := false; + x' + in + let a' = (Array.map [@inlined hint]) f' a in + if !same then a else a' end module String = struct include String module Set = Set.Make(String) - module Map = Map.Make(String) + module Map = struct + include Map.Make(String) + + let of_seq_multi seq = + Seq.fold_left + (fun tbl (key, elt) -> + update key + (function None -> Some [elt] | Some s -> Some (elt :: s)) + tbl) + empty seq + end + module Tbl = Hashtbl.Make(struct include String let hash = Hashtbl.hash @@ -295,10 +368,17 @@ module Stdlib = struct in helper chars str [] - let split_last_exn str ~split_on = + let split_once str ~idx = let n = String.length str in + String.sub str 0 idx, String.sub str (idx + 1) (n - idx - 1) + + let split_last_exn str ~split_on = let ridx = String.rindex str split_on in - String.sub str 0 ridx, String.sub str (ridx + 1) (n - ridx - 1) + split_once str ~idx:ridx + + let split_first_exn str ~split_on = + let idx = String.index str split_on in + split_once str ~idx let starts_with ~prefix s = let len_s = length s @@ -743,6 +823,11 @@ let ordinal_suffix n = | 3 when not teen -> "rd" | _ -> "th" +let format_as_unboxed_literal s = + if String.starts_with ~prefix:"-" s + then "-#" ^ (String.sub s 1 (String.length s - 1)) + else "#" ^ s + (* Color handling *) module Color = struct (* use ANSI color codes, see https://en.wikipedia.org/wiki/ANSI_escape_code *) @@ -1012,6 +1097,38 @@ let print_see_manual ppf manual_section = (pp_print_list ~pp_sep:(fun f () -> pp_print_char f '.') pp_print_int) manual_section +let output_of_print print = + let output out_channel t = + let ppf = Format.formatter_of_out_channel out_channel in + print ppf t; + (* Must flush the formatter immediately because it has a buffer separate + from the output channel's buffer *) + Format.pp_print_flush ppf () + in + output + +let is_print_longer_than size p = + let exception Limit_exceeded in + let limit = ref size in + let count_down len = + limit := !limit - len; + if !limit < 0 then raise Limit_exceeded + in + let out_string _ _ len = count_down len in + let out_newline () = count_down 1 in + let out_spaces n = count_down n in + let out_flush _ = () in + let out_indent _ = () in + let out_functions : Format.formatter_out_functions = { + out_string; + out_flush; + out_newline; + out_spaces; + out_indent} + in + let ppf = Format.formatter_of_out_functions out_functions in + try p ppf; false + with Limit_exceeded -> true type filepath = string @@ -1323,8 +1440,74 @@ module Magic_number = struct | Ok () -> Ok info end +module Le_result = struct + type t = + | Equal + | Less + | Not_le + + let combine sr1 sr2 = + match sr1, sr2 with + | Equal, Equal -> Equal + | Equal, Less | Less, Equal | Less, Less -> Less + | Not_le, _ | _, Not_le -> Not_le + + let combine_list ts = List.fold_left combine Equal ts + + let is_le = function + | Equal -> true + | Less -> true + | Not_le -> false + + let is_equal = function + | Equal -> true + | Less | Not_le -> false +end + (*********************************************) (* Fancy types *) type (_, _) eq = Refl : ('a, 'a) eq +(*********************************************) +(* Fancy modules *) + +module type T = sig + type t +end +module type T1 = sig + type 'a t +end + +module type T2 = sig + type ('a, 'b) t +end + +module type T3 = sig + type ('a, 'b, 'c) t +end + +module type T4 = sig + type ('a, 'b, 'c, 'd) t +end + +let remove_double_underscores s = + let len = String.length s in + let buf = Buffer.create len in + let skip = ref false in + let rec loop i = + if i < len + then ( + let c = String.get s i in + if c = '.' then skip := true; + if (not !skip) && c = '_' && i + 1 < len && String.get s (i + 1) = '_' + then ( + Buffer.add_char buf '.'; + skip := true; + loop (i + 2)) + else ( + Buffer.add_char buf c; + loop (i + 1))) + in + loop 0; + Buffer.contents buf diff --git a/utils/misc.mli b/utils/misc.mli index 263749f7374..d9f5ff559f3 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -77,6 +77,9 @@ val reraise_preserving_backtrace : exn -> (unit -> unit) -> 'a val map_end: ('a -> 'b) -> 'a list -> 'b list -> 'b list (** [map_end f l t] is [map f l @ t], just more efficient. *) +val rev_map_end: ('a -> 'b) -> 'a list -> 'b list -> 'b list + (** [rev_map_end f l t] is [map f (rev l) @ t], just more efficient. *) + val map_left_right: ('a -> 'b) -> 'a list -> 'b list (** Like [List.map], with guaranteed left-to-right evaluation order *) @@ -140,6 +143,16 @@ module Stdlib : sig (** [map_sharing f l] is [map f l]. If for all elements of the list [f e == e] then [map_sharing f l == l] *) + val fold_lefti : (int -> 'a -> 'b -> 'a) -> 'a -> 'b list -> 'a + (** [fold_lefti f init l] is like [fold_left] but also takes as parameter + the zero-based index of the element *) + + val chunks_of : int -> 'a t -> 'a t t + (** [chunks_of n t] returns a list of nonempty lists whose + concatenation is equal to the original list. Every list has [n] + elements, except for possibly the last list, which may have fewer. + [chunks_of] raises if [n <= 0]. *) + val is_prefix : equal:('a -> 'a -> bool) -> 'a list @@ -183,6 +196,14 @@ module Stdlib : sig val exists2 : ('a -> 'b -> bool) -> 'a array -> 'b array -> bool (** Same as [Array.exists2] from the standard library. *) + val fold_left2 : + ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a array -> 'b array -> 'acc + (** [fold_left2 f init [|a1; ...; an|] [|b1; ...; bn|]] is + [f (... (f (f init a1 b1) a2 b2) ...) an bn]. + @raise Invalid_argument if the two arrays are determined + to have different lengths. + *) + val for_alli : (int -> 'a -> bool) -> 'a array -> bool (** Same as [Array.for_all] from the standard library, but the function is applied with the index of the element as first argument, @@ -193,13 +214,23 @@ module Stdlib : sig val equal : ('a -> 'a -> bool) -> 'a array -> 'a array -> bool (** Compare two arrays for equality, using the supplied predicate for element equality *) + + val compare : ('a -> 'a -> int) -> 'a array -> 'a array -> int + (** Compare two arrays, using the supplied predicate for element equality *) + + val map_sharing : ('a -> 'a) -> 'a array -> 'a array + (** [map_sharing f a] is [map f a]. If for all elements of the array + [f e == e] then [map_sharing f a == a] *) end (** {2 Extensions to the String module} *) module String : sig include module type of String module Set : Set.S with type elt = string - module Map : Map.S with type key = string + module Map : sig + include Map.S with type key = string + val of_seq_multi : (string * 'a) Seq.t -> 'a list t + end module Tbl : Hashtbl.S with type key = string val print : Format.formatter -> t -> unit @@ -215,6 +246,9 @@ module Stdlib : sig (** Splits on the last occurrence of the given character. *) val split_last_exn : string -> split_on:char -> string * string + (** Splits on the first occurence of the given character. *) + val split_first_exn : string -> split_on:char -> string * string + val starts_with : prefix:string -> string -> bool val ends_with : suffix:string -> string -> bool end @@ -401,6 +435,17 @@ val ordinal_suffix : int -> string [4] -> ["th"], and so on. Handles larger numbers (e.g., [42] -> ["nd"]) and the numbers 11--13 (which all get ["th"]) correctly. *) +val format_as_unboxed_literal : string -> string +(** [format_as_unboxed_literal constant_literal] converts [constant_literal] to its + corresponding unboxed literal by either adding "#" in front or changing + "-" to "-#". + + Examples: + + [0.1] to [#0.1] + [-3] to [-#3] + [0xa.cp-1] to [#0xa.cp-1] *) + val normalise_eol : string -> string (** [normalise_eol s] returns a fresh copy of [s] with any '\r' characters removed. Intended for pre-processing text which will subsequently be printed @@ -583,6 +628,16 @@ val pp_two_columns : val print_see_manual : Format.formatter -> int list -> unit (** See manual section *) +val output_of_print : + (Format.formatter -> 'a -> unit) -> out_channel -> 'a -> unit +(** [output_of_print print] produces an output function from a pretty printer. + Note that naively using [Format.formatter_of_out_channel] typechecks but + doesn't work because it fails to flush the formatter. *) + +val is_print_longer_than: int -> (Format.formatter -> unit) -> bool +(** Returns [true] if the printed string is longer than the given integer. Stops + early if so. Spaces and newlines are counted, but indentation is not. *) + (** {1 Displaying configuration variables} *) val show_config_and_exit : unit -> unit @@ -814,12 +869,48 @@ module Magic_number : sig val all_kinds : kind list end +(** The result of a less-than-or-equal comparison *) +module Le_result : sig + type t = + | Equal + | Less + | Not_le + + val combine : t -> t -> t + val combine_list : t list -> t + + val is_le : t -> bool + val is_equal : t -> bool +end + (** Propositional equality *) type (_, _) eq = Refl : ('a, 'a) eq +(** Utilities for module-level programming *) +module type T = sig + type t +end + +module type T1 = sig + type 'a t +end + +module type T2 = sig + type ('a, 'b) t +end + +module type T3 = sig + type ('a, 'b, 'c) t +end + +module type T4 = sig + type ('a, 'b, 'c, 'd) t +end (** {1 Miscellaneous type aliases} *) type filepath = string type alerts = string Stdlib.String.Map.t + +val remove_double_underscores : string -> string diff --git a/parsing/jane_asttypes.mli b/utils/runtimetags.ml similarity index 51% rename from parsing/jane_asttypes.mli rename to utils/runtimetags.ml index db1a7dc1845..bd45b88a340 100644 --- a/parsing/jane_asttypes.mli +++ b/utils/runtimetags.ml @@ -2,7 +2,7 @@ (* *) (* OCaml *) (* *) -(* Antal Spector-Zabusky, Jane Street, New York *) +(* Max Slater, Jane Street *) (* *) (* Copyright 2023 Jane Street Group LLC *) (* *) @@ -12,33 +12,24 @@ (* *) (**************************************************************************) -(** Auxiliary Jane Street extensions to AST types used by parsetree and - typedtree. - - This file exists because [Asttypes] is considered part of the parse tree, - and we can't modify the parse tree. This also enables us to build other - files with the upstream compiler as long as [jane_asttypes.mli] is present; - see Note [Buildable with upstream] in jane_syntax.mli for details on that. - - {b Warning:} this module is unstable and part of - {{!Compiler_libs}compiler-libs}. - -*) - -open Asttypes - -type global_flag = - | Global - | Nothing - -(* constant jkinds are parsed as jkind annotations, and also used - in the type checker as already-inferred (i.e. non-variable) jkinds *) -type const_jkind = - | Any - | Value - | Void - | Immediate64 - | Immediate - | Float64 - -type jkind_annotation = const_jkind loc +(* Defines the runtime tags used by the target runtime. + Must be kept in sync with ocaml/stdlib/obj.ml and ocaml/runtime/caml/mlvalues.h *) + +let first_non_constant_constructor_tag = 0 +let last_non_constant_constructor_tag = 243 +let forcing_tag = 244 +let cont_tag = 245 +let lazy_tag = 246 +let closure_tag = 247 +let object_tag = 248 +let infix_tag = 249 +let forward_tag = 250 +let no_scan_tag = 251 +let abstract_tag = 251 +let string_tag = 252 +let double_tag = 253 +let double_array_tag = 254 +let custom_tag = 255 +let int_tag = 1000 +let out_of_heap_tag = 1001 +let unaligned_tag = 1002 diff --git a/utils/runtimetags.mli b/utils/runtimetags.mli new file mode 100644 index 00000000000..39baa09b975 --- /dev/null +++ b/utils/runtimetags.mli @@ -0,0 +1,32 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Max Slater, Jane Street *) +(* *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* 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. *) +(* *) +(**************************************************************************) + +val first_non_constant_constructor_tag : int +val last_non_constant_constructor_tag : int +val forcing_tag : int +val cont_tag : int +val lazy_tag : int +val closure_tag : int +val object_tag : int +val infix_tag : int +val forward_tag : int +val no_scan_tag : int +val abstract_tag : int +val string_tag : int +val double_tag : int +val double_array_tag : int +val custom_tag : int +val int_tag : int +val out_of_heap_tag : int +val unaligned_tag : int diff --git a/utils/symbol.ml b/utils/symbol.ml index 0982015f3de..0da48fd4ec0 100644 --- a/utils/symbol.ml +++ b/utils/symbol.ml @@ -46,7 +46,19 @@ include Identifiable.Make (struct end) let caml_symbol_prefix = "caml" -let separator = "__" + +(* CR ocaml 5 all-runtime5: Remove this_is_ocamlc and force_runtime4_symbols once + fully on runtime5 *) +let this_is_ocamlc = ref false +let force_runtime4_symbols = ref false + +let separator () = + if !this_is_ocamlc then + Misc.fatal_error "Didn't expect utils/symbol.ml to be used in ocamlc"; + if Config.runtime5 && not !force_runtime4_symbols then "." else "__" + +let this_is_ocamlc () = this_is_ocamlc := true +let force_runtime4_symbols () = force_runtime4_symbols := true let linkage_name t = t.linkage_name @@ -74,7 +86,7 @@ let linkage_name_for_compilation_unit comp_unit = let pack_names = CU.Prefix.to_list for_pack_prefix |> List.map CU.Name.to_string in - String.concat separator (pack_names @ [name]) + String.concat (separator ()) (pack_names @ [name]) in caml_symbol_prefix ^ suffix |> Linkage_name.of_string @@ -98,7 +110,7 @@ let for_name compilation_unit name = linkage_name_for_compilation_unit compilation_unit |> Linkage_name.to_string in let linkage_name = - prefix ^ separator ^ name |> Linkage_name.of_string + prefix ^ (separator ()) ^ name |> Linkage_name.of_string in { compilation_unit; linkage_name; diff --git a/utils/symbol.mli b/utils/symbol.mli index 6c32609cba4..3a4a3682844 100644 --- a/utils/symbol.mli +++ b/utils/symbol.mli @@ -45,3 +45,10 @@ val linkage_name_for_ocamlobjinfo : t -> string include Identifiable.S with type t := t val is_predef_exn : t -> bool + +(* Temporary means by which to force symbol names to use __. Only for use + for flambda2 flexpect tests. *) +val force_runtime4_symbols : unit -> unit + +(* Temporary means to identify that the program running is ocamlc. *) +val this_is_ocamlc : unit -> unit diff --git a/utils/target_system.ml b/utils/target_system.ml index 1ac62d8b354..16049b87519 100644 --- a/utils/target_system.ml +++ b/utils/target_system.ml @@ -20,7 +20,7 @@ let architecture () : architecture = | "riscv" -> Riscv | arch -> Misc.fatal_errorf "Unknown architecture `%s'" arch -let is_64_bit = +let is_64_bit () = match architecture () with | X86_64 | AArch64 @@ -30,7 +30,7 @@ let is_64_bit = | IA32 | ARM -> false -let is_32_bit = not is_64_bit +let is_32_bit () = not (is_64_bit ()) type derived_system = | Linux diff --git a/utils/target_system.mli b/utils/target_system.mli index 0bbbdefec4f..2e1143c74d7 100644 --- a/utils/target_system.mli +++ b/utils/target_system.mli @@ -9,9 +9,9 @@ type architecture = val architecture : unit -> architecture -val is_64_bit : bool +val is_64_bit : unit -> bool -val is_32_bit : bool +val is_32_bit : unit -> bool type derived_system = | Linux diff --git a/utils/warnings.ml b/utils/warnings.ml index 0992b82bd2c..ba5f9a1e43b 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -34,6 +34,14 @@ type constructor_usage_warning = | Not_constructed | Only_exported_private +type upstream_compat_warning = + | Immediate_erasure of string (* example: annotation in + [type ('a : immediate) t = int] can't be erased. *) + | Non_value_sort of string (* example: abstract type + [t : float64] is marked as unboxed. *) + | Unboxed_attribute of string (* example: unboxed attribute + on an external declaration with float# is missing. *) + type t = | Comment_start (* 1 *) | Comment_not_end (* 2 *) @@ -109,8 +117,12 @@ type t = | Unused_tmc_attribute (* 71 *) | Tmc_breaks_tailcall (* 72 *) | Generative_application_expects_unit (* 73 *) + | Incompatible_with_upstream of upstream_compat_warning (* 187 *) + | Unerasable_position_argument (* 188 *) + | Unnecessarily_partial_tuple_pattern (* 189 *) | Probe_name_too_long of string (* 190 *) - | Unchecked_property_attribute of string (* 199 *) + | Unchecked_zero_alloc_attribute (* 199 *) + | Unboxing_impossible (* 210 *) (* If you remove a warning, leave a hole in the numbering. NEVER change the numbers of existing warnings. @@ -192,14 +204,18 @@ let number = function | Unused_tmc_attribute -> 71 | Tmc_breaks_tailcall -> 72 | Generative_application_expects_unit -> 73 + | Incompatible_with_upstream _ -> 187 + | Unerasable_position_argument -> 188 + | Unnecessarily_partial_tuple_pattern -> 189 | Probe_name_too_long _ -> 190 - | Unchecked_property_attribute _ -> 199 + | Unchecked_zero_alloc_attribute -> 199 + | Unboxing_impossible -> 210 ;; (* DO NOT REMOVE the ;; above: it is used by the testsuite/ests/warnings/mnemonics.mll test to determine where the definition of the number function above ends *) -let last_warning_number = 199 +let last_warning_number = 250 ;; type description = @@ -539,15 +555,32 @@ let descriptions = [ description = "A generative functor is applied to an empty structure \ (struct end) rather than to ()."; since = since 5 1 }; + { number = 187; + names = ["incompatible-with-upstream"]; + description = "Extension usage is incompatible with upstream."; + since = since 5 1 }; + { number = 188; + names = ["unerasable-position-argument"]; + description = "Unerasable position argument."; + since = since 5 1 }; + { number = 189; + names = ["unnecessarily-partial-tuple-pattern"]; + description = "A tuple pattern ends in .. but fully matches its expected \ + type."; + since = since 5 1 }; { number = 190; names = ["probe-name-too-long"]; description = "Probe name must be at most 100 characters long."; since = since 4 14 }; { number = 199; - names = ["unchecked-property-attribute"]; + names = ["unchecked-zero-alloc-attribute"]; description = "A property of a function that was \ optimized away cannot be checked."; since = since 4 14 }; + { number = 210; + names = ["unboxing-impossible"]; + description = "The parameter or return value corresponding @unboxed attribute cannot be unboxed."; + since = since 4 14 }; ] let name_to_number = @@ -1149,16 +1182,41 @@ let message = function | Generative_application_expects_unit -> "A generative functor\n\ should be applied to '()'; using '(struct end)' is deprecated." + | Incompatible_with_upstream (Immediate_erasure id) -> + Printf.sprintf + "Usage of layout immediate/immediate64 in %s \n\ + can't be erased for compatibility with upstream OCaml." + id + | Incompatible_with_upstream (Non_value_sort layout) -> + Printf.sprintf + "External declaration here is not upstream compatible. \n\ + The only types with non-value layouts allowed are float#, \n\ + int32#, int64#, and nativeint#. Unknown type with layout \n\ + %s encountered." + layout + | Incompatible_with_upstream (Unboxed_attribute layout) -> + Printf.sprintf + "[@unboxed] attribute must be added to external declaration \n\ + argument type with layout %s for upstream compatibility." + layout + | Unerasable_position_argument -> "this position argument cannot be erased." + | Unnecessarily_partial_tuple_pattern -> + "This tuple pattern\n\ + unnecessarily ends in '..', as it explicitly matches all components\n\ + of its expected type." | Probe_name_too_long name -> Printf.sprintf "This probe name is too long: `%s'. \ Probe names must be at most 100 characters long." name - | Unchecked_property_attribute property -> - Printf.sprintf "the %S attribute cannot be checked.\n\ + | Unchecked_zero_alloc_attribute -> + Printf.sprintf "the zero_alloc attribute cannot be checked.\n\ The function it is attached to was optimized away. \n\ You can try to mark this function as [@inline never] \n\ or move the attribute to the relevant callers of this function." - property + | Unboxing_impossible -> + Printf.sprintf + "This [@unboxed] attribute cannot be used.\n\ + The type of this value does not allow unboxing." ;; let nerrors = ref 0 diff --git a/utils/warnings.mli b/utils/warnings.mli index 1a9ff0757f9..47aad271a2d 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -39,6 +39,11 @@ type constructor_usage_warning = | Not_constructed | Only_exported_private +type upstream_compat_warning = + | Immediate_erasure of string + | Non_value_sort of string + | Unboxed_attribute of string + type t = | Comment_start (* 1 *) | Comment_not_end (* 2 *) @@ -113,8 +118,12 @@ type t = | Tmc_breaks_tailcall (* 72 *) | Generative_application_expects_unit (* 73 *) (* Flambda_backend specific warnings: numbers should go down from 199 *) + | Incompatible_with_upstream of upstream_compat_warning (* 187 *) + | Unerasable_position_argument (* 188 *) + | Unnecessarily_partial_tuple_pattern (* 189 *) | Probe_name_too_long of string (* 190 *) - | Unchecked_property_attribute of string (* 199 *) + | Unchecked_zero_alloc_attribute (* 199 *) + | Unboxing_impossible (* 210 *) type alert = {kind:string; message:string; def:loc; use:loc} diff --git a/utils/zero_alloc_annotations.ml b/utils/zero_alloc_annotations.ml new file mode 100644 index 00000000000..b0553809711 --- /dev/null +++ b/utils/zero_alloc_annotations.ml @@ -0,0 +1,56 @@ +(****************************************************************************** + * flambda-backend * + * Greta Yorsh, Jane Street * + * -------------------------------------------------------------------------- * + * MIT License * + * * + * Copyright (c) 2024 Jane Street Group LLC * + * opensource-contacts@janestreet.com * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * + * DEALINGS IN THE SOFTWARE. * + ******************************************************************************) +type t = Check_default | Check_all | Check_opt_only | No_check + +let all = [ Check_default; Check_all; Check_opt_only; No_check ] + +let to_string = function + | Check_default -> "default" + | Check_all -> "all" + | Check_opt_only -> "opt" + | No_check -> "none" + +let equal t1 t2 = + match t1, t2 with + | Check_default, Check_default -> true + | Check_all, Check_all -> true + | No_check, No_check -> true + | Check_opt_only, Check_opt_only -> true + | (Check_default | Check_all | Check_opt_only | No_check), _ -> false + +let of_string v = + let f t = + if String.equal (to_string t) v then Some t else None + in + List.find_map f all + +let doc = + "\n\ The argument specifies which annotations to check: \n\ + \ \"opt\" means attributes with \"opt\" payload and is intended for debugging;\n\ + \ \"default\" means attributes without \"opt\" payload; \n\ + \ \"all\" covers both \"opt\" and \"default\" and is intended for optimized builds." diff --git a/utils/zero_alloc_annotations.mli b/utils/zero_alloc_annotations.mli new file mode 100644 index 00000000000..f5daa03b1f3 --- /dev/null +++ b/utils/zero_alloc_annotations.mli @@ -0,0 +1,33 @@ +(****************************************************************************** + * flambda-backend * + * Greta Yorsh, Jane Street * + * -------------------------------------------------------------------------- * + * MIT License * + * * + * Copyright (c) 2024 Jane Street Group LLC * + * opensource-contacts@janestreet.com * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * + * DEALINGS IN THE SOFTWARE. * + ******************************************************************************) +type t = Check_default | Check_all | Check_opt_only | No_check +val all : t list +val to_string : t -> string +val of_string : string -> t option +val equal : t -> t -> bool +val doc : string diff --git a/utils/zero_alloc_utils.ml b/utils/zero_alloc_utils.ml new file mode 100644 index 00000000000..f0043623416 --- /dev/null +++ b/utils/zero_alloc_utils.ml @@ -0,0 +1,249 @@ +(* The meaning of keywords [strict] and [never_returns_normally] is defined in + terms of abstract values as follows: + + relaxed (default): nor = Safe and exn = Top and div = Top strict: nor = Safe + and exn = Safe and div = Safe never_returns_normally: nor = Bot and exn = Top + and div = Top + + where [nor] means normal return of the call, [exn] means return via an + exception, [div] means diverging (non-terminating) executions, and the + meaning and order of elements is: + + Top may allocate Safe does not allocate on any execution paths Bot + unreachable + + Using more than one keyword means intersection (i.e., meet of the elements, + pointwise lifted to tuples), so we get the following: + + [@zero_alloc assume] nor = Safe and exn = Top and div = Top [@zero_alloc + assume strict] nor = Safe and exn = Safe and div = Safe [@zero_alloc assume + strict never_returns_normally] nor = Bot and exn = Safe and div = Safe + [@zero_alloc assume never_returns_normally] nor = Bot and exn = Top and div = + Top + + See [Value] and [Annotation] in [backend/checkmach.ml]. *) +(* CR gyorsh: should we move [Value] and [Annotation] here or maybe "utils" and + use them directly, instead of the weird compare function that abstracts them? + Perhaps we should translate "strict" and "never_returns_normally" directly + into (nor,exn,div) *) + +module type WS = sig + type t + + val empty : t + + val join : t -> t -> t + + val meet : t -> t -> t + + val lessequal : t -> t -> bool + + val print : Format.formatter -> t -> unit + + val compare : t -> t -> int +end + +module type Component = sig + type t + + type witnesses + + val top : witnesses -> t + + val safe : t + + val bot : t + + val lessequal : t -> t -> bool + + val join : t -> t -> t + + val meet : t -> t -> t + + val compare : t -> t -> int + + val print : witnesses:bool -> Format.formatter -> t -> unit +end + +module Make_component (Witnesses : WS) = struct + (* keep in sync with "resolved" values in Checkmach. *) + type t = + | Top of Witnesses.t + | Safe + | Bot + + let bot = Bot + + let top w = Top w + + let safe = Safe + + let join c1 c2 = + match c1, c2 with + | Bot, Bot -> Bot + | Safe, Safe -> Safe + | Top w1, Top w2 -> Top (Witnesses.join w1 w2) + | Safe, Bot | Bot, Safe -> Safe + | Top w1, Bot | Top w1, Safe | Bot, Top w1 | Safe, Top w1 -> Top w1 + + let meet c1 c2 = + match c1, c2 with + | Bot, Bot -> Bot + | Safe, Safe -> Safe + | Top w1, Top w2 -> Top (Witnesses.meet w1 w2) + | Safe, Bot | Bot, Safe -> Bot + | Top _, Bot | Bot, Top _ -> Bot + | Top _, Safe | Safe, Top _ -> Safe + + let lessequal v1 v2 = + match v1, v2 with + | Bot, Bot -> true + | Safe, Safe -> true + | Top w1, Top w2 -> Witnesses.lessequal w1 w2 + | Bot, Safe -> true + | Bot, Top _ -> true + | Safe, Top _ -> true + | Top _, (Bot | Safe) -> false + | Safe, Bot -> false + + let compare t1 t2 = + match t1, t2 with + | Bot, Bot -> 0 + | Safe, Safe -> 0 + | Top w1, Top w2 -> Witnesses.compare w1 w2 + | Bot, (Safe | Top _) -> -1 + | (Safe | Top _), Bot -> 1 + | Safe, Top _ -> -1 + | Top _, Safe -> 1 + + let print ~witnesses ppf = function + | Bot -> Format.fprintf ppf "bot" + | Top w -> + Format.fprintf ppf "top"; + if witnesses then Format.fprintf ppf " (%a)" Witnesses.print w + | Safe -> Format.fprintf ppf "safe" +end + +module Make_value + (Witnesses : WS) + (V : Component with type witnesses := Witnesses.t) = +struct + (** Lifts V to triples *) + type t = + { nor : V.t; + exn : V.t; + div : V.t + } + + let bot = { nor = V.bot; exn = V.bot; div = V.bot } + + let lessequal v1 v2 = + V.lessequal v1.nor v2.nor && V.lessequal v1.exn v2.exn + && V.lessequal v1.div v2.div + + let join v1 v2 = + { nor = V.join v1.nor v2.nor; + exn = V.join v1.exn v2.exn; + div = V.join v1.div v2.div + } + + let meet v1 v2 = + { nor = V.meet v1.nor v2.nor; + exn = V.meet v1.exn v2.exn; + div = V.meet v1.div v2.div + } + + let normal_return = { bot with nor = V.safe } + + let exn_escape = { bot with exn = V.safe } + + let diverges = { bot with div = V.safe } + + let safe = { nor = V.safe; exn = V.safe; div = V.safe } + + let top w = { nor = V.top w; exn = V.top w; div = V.top w } + + let relaxed w = { nor = V.safe; exn = V.top w; div = V.top w } + + let of_annotation ~strict ~never_returns_normally ~never_raises = + let res = if strict then safe else relaxed Witnesses.empty in + let res = if never_raises then { res with exn = V.bot } else res in + if never_returns_normally then { res with nor = V.bot } else res + + let print ~witnesses ppf { nor; exn; div } = + let pp = V.print ~witnesses in + Format.fprintf ppf "{ nor=%a;@ exn=%a;@ div=%a }@," pp nor pp exn pp div + + let compare { nor = n1; exn = e1; div = d1 } { nor = n2; exn = e2; div = d2 } + = + let c = V.compare n1 n2 in + if c <> 0 + then c + else + let c = V.compare e1 e2 in + if c <> 0 then c else V.compare d1 d2 +end + +module Assume_info = struct + module Witnesses = struct + type t = unit + + let join _ _ = () + + let lessequal _ _ = true + + let meet _ _ = () + + let print _ _ = () + + let empty = () + + let compare _ _ = 0 + end + + module V = Make_component (Witnesses) + module Value = Make_value (Witnesses) (V) + + type t = + | No_assume + | Assume of Value.t + (* CR ccasinghino: consider extending this time to also capture "check" + attributes, and using it everywhere in typed tree instead of sometimes + having a check_attribute and sometimes having this type. *) + + let compare t1 t2 = + match t1, t2 with + | No_assume, No_assume -> 0 + | Assume v1, Assume v2 -> Value.compare v1 v2 + | No_assume, Assume _ -> -1 + | Assume _, No_assume -> 1 + + let equal t1 t2 = compare t1 t2 = 0 + + let print ppf = function + | No_assume -> () + | Assume v -> Format.fprintf ppf "%a" (Value.print ~witnesses:false) v + + let to_string v = Format.asprintf "%a" print v + + let join t1 t2 = + match t1, t2 with + | No_assume, No_assume -> No_assume + | No_assume, Assume _ | Assume _, No_assume -> No_assume + | Assume t1, Assume t2 -> Assume (Value.join t1 t2) + + let meet t1 t2 = + match t1, t2 with + | No_assume, No_assume -> No_assume + | No_assume, (Assume _ as t) | (Assume _ as t), No_assume -> t + | Assume t1, Assume t2 -> Assume (Value.meet t1 t2) + + let none = No_assume + + let create ~strict ~never_returns_normally ~never_raises = + Assume (Value.of_annotation ~strict ~never_returns_normally ~never_raises) + + let get_value t = match t with No_assume -> None | Assume v -> Some v + + let is_none t = match t with No_assume -> true | Assume _ -> false +end diff --git a/utils/zero_alloc_utils.mli b/utils/zero_alloc_utils.mli new file mode 100644 index 00000000000..92c1547df83 --- /dev/null +++ b/utils/zero_alloc_utils.mli @@ -0,0 +1,175 @@ +(** Abstract domain used in static analysis for checking @zero_alloc annotations. + See [backend/zero_alloc_checker] for details of the analysis. + See this module's .ml file for details about the translation of + user-provided annotations to abstract values in this domain. +*) +module type WS = sig + type t + + val empty : t + + val join : t -> t -> t + + val meet : t -> t -> t + + val lessequal : t -> t -> bool + + val print : Format.formatter -> t -> unit + + val compare : t -> t -> int +end + +module type Component = sig + (** Abstract value for each component of the domain. *) + type t + + type witnesses + + (** Property may not hold on some paths. *) + val top : witnesses -> t + + (** Property holds on all paths. *) + val safe : t + + (** Not reachable. *) + val bot : t + + (** Order of the abstract domain *) + val lessequal : t -> t -> bool + + val join : t -> t -> t + + val meet : t -> t -> t + + (** Use [compare] for structural comparison of terms, for example to store them in a + set. Use [lessequal] for checking fixed point of the abstract domain. *) + val compare : t -> t -> int + + val print : witnesses:bool -> Format.formatter -> t -> unit +end + +module Make_component (Witnesses : WS) : sig + type t = + | Top of Witnesses.t + | Safe + | Bot + + include Component with type witnesses := Witnesses.t and type t := t +end + +module Make_value + (Witnesses : WS) + (V : Component with type witnesses := Witnesses.t) : sig + (** Abstract value associated with each program location in a function. *) + type t = + { nor : V.t; + (** Property about + all paths from this program location that may reach a Normal Return *) + exn : V.t; + (** Property about all paths from this program point that may reach a Return with + Exception *) + div : V.t + (** Property about all paths from this program point that may diverge. *) + } + + val lessequal : t -> t -> bool + + val join : t -> t -> t + + val meet : t -> t -> t + + val top : Witnesses.t -> t + + val bot : t + + (** [normal_return] means property holds on paths to normal return, exceptional return + is not reachable and execution will not diverge. *) + val normal_return : t + + (** [exn_escape] means the property holds on paths to exceptional return, normal + return is not reachable and execution will not diverge. *) + val exn_escape : t + + (** [diverges] means the execution may diverge without violating the property, but + normal and exceptional return are not reachable (i.e., [div] is Safe, `nor` and + `exn` are Bot). *) + val diverges : t + + (** [safe] means the property holds on all paths (i.e., all three components are set + to Safe). *) + val safe : t + + (** [relaxed] means the property holds on paths that lead to normal returns only + (i.e., [nor] component is Safe, others are Top. *) + val relaxed : Witnesses.t -> t + + (** Constructs a value from a user annotation. The witness will be empty. *) + val of_annotation : + strict:bool -> never_returns_normally:bool -> never_raises:bool -> t + + val print : witnesses:bool -> Format.formatter -> t -> unit + + (** Use [compare] for structural comparison of terms, for example + to store them in a set. Use [lessequal] + for checking fixed point of the abstract domain. + + [compare] must be consistent with [lessthan] order of the abstract domain, + i.e., if [compare t1 t2 <= 0] then [lessequal v1 v2 = true]. + + [compare] may distinguish terms that are equivalent + w.r.t. the abstraction, i.e., [lessequal v1 v2 = true] + does not always imply [compare t1 t2 <= 0]. + In particular, [compare] distinguishes between two "Top" values + with different witnesses. *) + val compare : t -> t -> int +end + +(** The [Assume_info] module contains an instantiation of the abstract domain + with trivial witnesses. It is used to propagate assume annotations from the + front-end to the backend. The backend contains a different instantiation of + the abstract domain where the witnesses contain actual information about + allocations - see [Checkmach]. *) +module Assume_info : sig + type t + + val none : t + + val create : + strict:bool -> never_returns_normally:bool -> never_raises:bool -> t + + val compare : t -> t -> int + + val equal : t -> t -> bool + + val join : t -> t -> t + + val meet : t -> t -> t + + val to_string : t -> string + + val print : Format.formatter -> t -> unit + + val is_none : t -> bool + + module Witnesses : sig + type t = unit + + val empty : t + + val join : t -> t -> t + + val lessequal : t -> t -> bool + + val meet : t -> t -> t + + val print : Format.formatter -> t -> unit + + val compare : t -> t -> int + end + + module V : module type of Make_component (Witnesses) + + module Value : module type of Make_value (Witnesses) (V) + + val get_value : t -> Value.t option +end